diff -Nrcpad gcc-16-20260315/ChangeLog gcc-16-20260322/ChangeLog
*** gcc-16-20260315/ChangeLog	Sun Mar 15 22:32:06 2026
--- gcc-16-20260322/ChangeLog	Sun Mar 22 22:32:05 2026
***************
*** 1,3 ****
--- 1,7 ----
+ 2026-03-17  Prachi Godbole  <pgodbole@nvidia.com>
+ 
+ 	* MAINTAINERS: Add myself to write after approval and DCO.
+ 
  2026-02-27  Christophe Lyon  <christophe.lyon@arm.com>
  
  	* .forgejo/workflows/sanity-checks.yaml: Rename testjob to
diff -Nrcpad gcc-16-20260315/LAST_UPDATED gcc-16-20260322/LAST_UPDATED
*** gcc-16-20260315/LAST_UPDATED	Sun Mar 15 22:32:21 2026
--- gcc-16-20260322/LAST_UPDATED	Sun Mar 22 22:32:19 2026
***************
*** 1 ****
! Obtained from git: master revision 172f92a464f64b3d6e0a6835882c6cbab36ffc3e
--- 1 ----
! Obtained from git: master revision 15bccf4412d7ae99ee448420b6deccd88081bcab
diff -Nrcpad gcc-16-20260315/MAINTAINERS gcc-16-20260322/MAINTAINERS
*** gcc-16-20260315/MAINTAINERS	Sun Mar 15 22:32:06 2026
--- gcc-16-20260322/MAINTAINERS	Sun Mar 22 22:32:05 2026
*************** Matthew Gingell                 -
*** 506,512 ****
  Tristan Gingold                 gingold         <tgingold@free.fr>
  Jan-Benedict Glaw               jbglaw          <jbglaw@lug-owl.de>
  Marc Glisse                     glisse          <marc.glisse@inria.fr>
! Prachi Godbole                  prachigodbole   <prachi.godbole@imgtec.com>
  Torbjorn Granlund               -               <tege@swox.com>
  Anthony Green                   green           <green@moxielogic.com>
  James Greenhalgh                jgreenhalgh     <james.greenhalgh@arm.com>
--- 506,512 ----
  Tristan Gingold                 gingold         <tgingold@free.fr>
  Jan-Benedict Glaw               jbglaw          <jbglaw@lug-owl.de>
  Marc Glisse                     glisse          <marc.glisse@inria.fr>
! Prachi Godbole                  pgodbole        <pgodbole@nvidia.com>
  Torbjorn Granlund               -               <tege@swox.com>
  Anthony Green                   green           <green@moxielogic.com>
  James Greenhalgh                jgreenhalgh     <james.greenhalgh@arm.com>
*************** Giuseppe D'Angelo
*** 967,972 ****
--- 967,973 ----
  Robin Dapp                                      <rdapp.gcc@gmail.com>
  Robin Dapp                                      <rdapp@qti.qualcomm.com>
  Robin Dapp                                      <rdapp@ventanamicro.com>
+ Prachi Godbole                                  <pgodbole@nvidia.com>
  Aldy Hernandez                                  <aldy@quesejoda.com>
  Michal Jires                                    <mjires@suse.cz>
  Matthias Kretz                                  <m.kretz@gsi.de>
diff -Nrcpad gcc-16-20260315/MD5SUMS gcc-16-20260322/MD5SUMS
*** gcc-16-20260315/MD5SUMS	Sun Mar 15 22:32:26 2026
--- gcc-16-20260322/MD5SUMS	Sun Mar 22 22:32:24 2026
***************
*** 1,5 ****
  # This file contains the MD5 checksums of the files in the
! # gcc-16-20260315.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-20260322.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
! 4e115f3f50b594357c0e3190277d3643  ChangeLog
  fd4ecdf5d672efe2b0e409aca9cf9446  ChangeLog.jit
  09538b708302f1735f6fa05b622ecf5e  ChangeLog.tree-ssa
  24ab760126489e69436a43185dc3d202  INSTALL/README
! a255a7f1328375a6d0009e526579ac58  LAST_UPDATED
! b8fa044b3336d9cc6214e6ff3e9b467d  MAINTAINERS
  af43617880b3cd9c10627c97e639d29e  Makefile.def
  734342371d8ccc2c81cb2d8b3d040f33  Makefile.in
  bd7a6cf48b6a530442ffaee7ea118c2d  Makefile.tpl
--- 24,35 ----
  fe60d87048567d4fe8c8a0ed2448bcc8  COPYING.RUNTIME
  d32239bcb673463ab874e80d47fae504  COPYING3
  6a6a8e020838b23406c81b19c1d46df6  COPYING3.LIB
! 958169bb3306e9ba330fe2173095d724  ChangeLog
  fd4ecdf5d672efe2b0e409aca9cf9446  ChangeLog.jit
  09538b708302f1735f6fa05b622ecf5e  ChangeLog.tree-ssa
  24ab760126489e69436a43185dc3d202  INSTALL/README
! 68b675021c2e21ab68e86f01962e130d  LAST_UPDATED
! 301c004f9bb3ad3a9c24ef5b8b95e920  MAINTAINERS
  af43617880b3cd9c10627c97e639d29e  Makefile.def
  734342371d8ccc2c81cb2d8b3d040f33  Makefile.in
  bd7a6cf48b6a530442ffaee7ea118c2d  Makefile.tpl
*************** f15bc3c5de22eac0bdd4f611502139a0  gcc/AB
*** 530,536 ****
  a916467b91076e631dd8edb7424769c7  gcc/COPYING.LIB
  d32239bcb673463ab874e80d47fae504  gcc/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/COPYING3.LIB
! c840b5ee2312481d589a6c2bfbd90058  gcc/ChangeLog
  51281e73aa07fb62394bd72f3c9299ba  gcc/ChangeLog-1997
  f77af8c9ac412064886b00c5506123b5  gcc/ChangeLog-1998
  00a2e4ead1b289bf69bca0196fed6f9f  gcc/ChangeLog-1999
--- 530,536 ----
  a916467b91076e631dd8edb7424769c7  gcc/COPYING.LIB
  d32239bcb673463ab874e80d47fae504  gcc/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/COPYING3.LIB
! c64dc5215cd2299215f110d0412af8cf  gcc/ChangeLog
  51281e73aa07fb62394bd72f3c9299ba  gcc/ChangeLog-1997
  f77af8c9ac412064886b00c5506123b5  gcc/ChangeLog-1998
  00a2e4ead1b289bf69bca0196fed6f9f  gcc/ChangeLog-1999
*************** fb3fadb88e1d2b3b640cfaaa5ff11780  gcc/Ch
*** 568,586 ****
  3eb07e0b2e542409bf73d359f7f65609  gcc/ChangeLog.ptr
  e13638e26743ba41e6011b76cc00d9a9  gcc/ChangeLog.tree-ssa
  739ab47f6425bcea1d05e4fc0542de54  gcc/ChangeLog.tuples
! 1d7ee3837206bfac0e752523bf12e397  gcc/DATESTAMP
  deb513e591f23901188e22323bd3b1d4  gcc/DEV-PHASE
  eb92e1ff5e982ca07e173e0eb286d243  gcc/FSFChangeLog
  30e1e33411566388b3164558482dc5e6  gcc/FSFChangeLog.10
  36698274bb69e2ada20f5cc434f3caa5  gcc/FSFChangeLog.11
  a817c5577f2b35f8d2481c787e3ff7e2  gcc/LANGUAGES
! ecfd3dc22c2ac0496e9f5d7e15ab88e6  gcc/Makefile.in
  ec6799501b2eb2923d5de6a66169dbd2  gcc/ONEWS
  c8c9dd1eaee4ffd4d5d9f3ab70fddd4b  gcc/README.Portability
  270ba6dfb4ecba066773fe20f2dc0053  gcc/acinclude.m4
  e74733ebf762151e601c9e0aa1461a20  gcc/aclocal.m4
  16a499934b71eb6cf7c0d6899cd6006a  gcc/ada/.gitignore
! cd9f6b787c9e2a48bd14b40a56bf9b80  gcc/ada/ChangeLog
  c2094c0d3135f9ac89917f162046ee04  gcc/ada/ChangeLog-2001
  fa410b57f5d814d5d3ac3b45f486cdcf  gcc/ada/ChangeLog-2002
  2dbefa7bdc8dc28ec746002028861278  gcc/ada/ChangeLog-2003
--- 568,586 ----
  3eb07e0b2e542409bf73d359f7f65609  gcc/ChangeLog.ptr
  e13638e26743ba41e6011b76cc00d9a9  gcc/ChangeLog.tree-ssa
  739ab47f6425bcea1d05e4fc0542de54  gcc/ChangeLog.tuples
! bca29195f102460884fe9792d098b2db  gcc/DATESTAMP
  deb513e591f23901188e22323bd3b1d4  gcc/DEV-PHASE
  eb92e1ff5e982ca07e173e0eb286d243  gcc/FSFChangeLog
  30e1e33411566388b3164558482dc5e6  gcc/FSFChangeLog.10
  36698274bb69e2ada20f5cc434f3caa5  gcc/FSFChangeLog.11
  a817c5577f2b35f8d2481c787e3ff7e2  gcc/LANGUAGES
! 8297ab53e57000e01bb28923553f1cc0  gcc/Makefile.in
  ec6799501b2eb2923d5de6a66169dbd2  gcc/ONEWS
  c8c9dd1eaee4ffd4d5d9f3ab70fddd4b  gcc/README.Portability
  270ba6dfb4ecba066773fe20f2dc0053  gcc/acinclude.m4
  e74733ebf762151e601c9e0aa1461a20  gcc/aclocal.m4
  16a499934b71eb6cf7c0d6899cd6006a  gcc/ada/.gitignore
! 0e1210b230a2146e82a3fc4551ae4b7c  gcc/ada/ChangeLog
  c2094c0d3135f9ac89917f162046ee04  gcc/ada/ChangeLog-2001
  fa410b57f5d814d5d3ac3b45f486cdcf  gcc/ada/ChangeLog-2002
  2dbefa7bdc8dc28ec746002028861278  gcc/ada/ChangeLog-2003
*************** d77ca7623d00d99f722ffa0a2c4f1308  gcc/ad
*** 2927,2935 ****
  ea86a0345845800d7aaf07f22bb4bf6c  gcc/ada/sem_ch2.ads
  2581e282d3a002fe974f151f2bdb68e9  gcc/ada/sem_ch3.adb
  2d8f83bc46638356bc311ccd50015b1f  gcc/ada/sem_ch3.ads
! c47ba9b98b3b3fcb6b4ff2a07c14b657  gcc/ada/sem_ch4.adb
  fdd750bd30c3186d912dfed4717a2c0c  gcc/ada/sem_ch4.ads
! 372b91efba4677bbb8b51f4359144013  gcc/ada/sem_ch5.adb
  d3937c73217b5f3ef2540a47e52cbf4a  gcc/ada/sem_ch5.ads
  5bbd8a73962dff2109bc375d2e1999c0  gcc/ada/sem_ch6.adb
  9ac8c4c57213097618cdb7c0b7b4f47b  gcc/ada/sem_ch6.ads
--- 2927,2935 ----
  ea86a0345845800d7aaf07f22bb4bf6c  gcc/ada/sem_ch2.ads
  2581e282d3a002fe974f151f2bdb68e9  gcc/ada/sem_ch3.adb
  2d8f83bc46638356bc311ccd50015b1f  gcc/ada/sem_ch3.ads
! 672b3db8fa759ee2be5ded5752f2a743  gcc/ada/sem_ch4.adb
  fdd750bd30c3186d912dfed4717a2c0c  gcc/ada/sem_ch4.ads
! 53bfaf0bb212d68185c312cb45d910d3  gcc/ada/sem_ch5.adb
  d3937c73217b5f3ef2540a47e52cbf4a  gcc/ada/sem_ch5.ads
  5bbd8a73962dff2109bc375d2e1999c0  gcc/ada/sem_ch6.adb
  9ac8c4c57213097618cdb7c0b7b4f47b  gcc/ada/sem_ch6.ads
*************** eb23a07f1fb62ed39d1053619d51487b  gcc/ad
*** 2957,2969 ****
  39b96f04803db97ae1f7376d30a0cfec  gcc/ada/sem_mech.ads
  764f62b9f61374685638654b0eed967b  gcc/ada/sem_prag.adb
  61f67b82bf0abfa83eb7e4927498285c  gcc/ada/sem_prag.ads
! 4522d625fda1c15e3c0e8b0e0cdc400c  gcc/ada/sem_res.adb
  e3b9f77c37497d7f7824085d3df8fde8  gcc/ada/sem_res.ads
  4e8a9bc2b398560942d0c08f4017fabb  gcc/ada/sem_scil.adb
  64ae38c93be63a67f143484eba77604b  gcc/ada/sem_scil.ads
  102f98875b216b8fcbe1ed80f8079009  gcc/ada/sem_smem.adb
  21afb93e10bb9446fcbf7577bbf39c7f  gcc/ada/sem_smem.ads
! b206c38c506b809f66fb07036016356f  gcc/ada/sem_type.adb
  65653b347d1d3f800e49cd916a551d1c  gcc/ada/sem_type.ads
  1a9e149f530a431be68085c531487687  gcc/ada/sem_util.adb
  736dcd26180244a8e8adc2d6c66249a7  gcc/ada/sem_util.ads
--- 2957,2969 ----
  39b96f04803db97ae1f7376d30a0cfec  gcc/ada/sem_mech.ads
  764f62b9f61374685638654b0eed967b  gcc/ada/sem_prag.adb
  61f67b82bf0abfa83eb7e4927498285c  gcc/ada/sem_prag.ads
! 4694770a0bc7554f7a13bd17f1126bb5  gcc/ada/sem_res.adb
  e3b9f77c37497d7f7824085d3df8fde8  gcc/ada/sem_res.ads
  4e8a9bc2b398560942d0c08f4017fabb  gcc/ada/sem_scil.adb
  64ae38c93be63a67f143484eba77604b  gcc/ada/sem_scil.ads
  102f98875b216b8fcbe1ed80f8079009  gcc/ada/sem_smem.adb
  21afb93e10bb9446fcbf7577bbf39c7f  gcc/ada/sem_smem.ads
! 1de99683c6514c34448d2bbc7ddb8856  gcc/ada/sem_type.adb
  65653b347d1d3f800e49cd916a551d1c  gcc/ada/sem_type.ads
  1a9e149f530a431be68085c531487687  gcc/ada/sem_util.adb
  736dcd26180244a8e8adc2d6c66249a7  gcc/ada/sem_util.ads
*************** cbe63f3e975481a17ed49898fbbb9d2a  gcc/at
*** 3269,3277 ****
  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
! 348aded51535e9938807c88b8e51d784  gcc/avoid-store-forwarding.cc
  df8fff5733f0af601cd10d3e2611b94a  gcc/avoid-store-forwarding.h
  8ec9314e9edefe43a037289f48e6602a  gcc/backend.h
  836731448e64bbca8b5b1aa56ca90cdd  gcc/basic-block.h
--- 3269,3277 ----
  feed071e9f711f8ebbc91f8636422f93  gcc/attribs.h
  bd317e24faffad6f2106396f1c3401b1  gcc/auto-inc-dec.cc
  fc353966a860a12cbc161a87f5619b51  gcc/auto-obstack.h
! 2a47b4d9cfd0645515fa828ac4a0b527  gcc/auto-profile.cc
! d290a68be0a787113b46b8c5ec98f710  gcc/auto-profile.h
! 0ec313d8a3741cea7ca7b0151291cbdb  gcc/avoid-store-forwarding.cc
  df8fff5733f0af601cd10d3e2611b94a  gcc/avoid-store-forwarding.h
  8ec9314e9edefe43a037289f48e6602a  gcc/backend.h
  836731448e64bbca8b5b1aa56ca90cdd  gcc/basic-block.h
*************** ebb1ceb69d6cf8ac2cdc227ae45f0eca  gcc/bi
*** 3286,3292 ****
  cdcd35bde318b22092b0788986b03a47  gcc/builtins.cc
  4dbe6686097ec6c197a24ac373bb9554  gcc/builtins.def
  99d9ddd60ff804d8e24732db43d38bca  gcc/builtins.h
! 6c100a2ace91046484588e9a78327e4c  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
--- 3286,3292 ----
  cdcd35bde318b22092b0788986b03a47  gcc/builtins.cc
  4dbe6686097ec6c197a24ac373bb9554  gcc/builtins.def
  99d9ddd60ff804d8e24732db43d38bca  gcc/builtins.h
! 4828d170161a0d71bcd2a35c5e09215d  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
*************** e1e1df06eba5bbddc37580adfb9356b4  gcc/c-
*** 3304,3310 ****
  45c8fc8d67953a240dac81ef9fb80c2a  gcc/c-family/c-lex.cc
  eb6a10cfada98679dc204a82e929e9e3  gcc/c-family/c-objc.h
  ea297af5bdcb8c784d704a6b99a79c38  gcc/c-family/c-omp.cc
! f26f8476e311d4da23c30e7fef69d0d9  gcc/c-family/c-opts.cc
  a7304c009aa63ce6c8e80612b426724a  gcc/c-family/c-pch.cc
  cb9706138b571f810527200a1e24035c  gcc/c-family/c-ppoutput.cc
  1c45b9d8f8a674aa74dc09d32ee9a453  gcc/c-family/c-pragma.cc
--- 3304,3310 ----
  45c8fc8d67953a240dac81ef9fb80c2a  gcc/c-family/c-lex.cc
  eb6a10cfada98679dc204a82e929e9e3  gcc/c-family/c-objc.h
  ea297af5bdcb8c784d704a6b99a79c38  gcc/c-family/c-omp.cc
! a93a54bd451fefbd21f9b288d5530d33  gcc/c-family/c-opts.cc
  a7304c009aa63ce6c8e80612b426724a  gcc/c-family/c-pch.cc
  cb9706138b571f810527200a1e24035c  gcc/c-family/c-ppoutput.cc
  1c45b9d8f8a674aa74dc09d32ee9a453  gcc/c-family/c-pragma.cc
*************** ea821c9d267c64dd8b74aad9d0189834  gcc/c-
*** 3329,3336 ****
  377686cbbf62a7d61d251d3f74cddb5b  gcc/c-family/known-headers.h
  431045382c41554804be1959c1596be4  gcc/c-family/name-hint.h
  3bae9e281cc87b35f63e906373f3b446  gcc/c-family/stub-objc.cc
! a17b25d056a29026964564b8ff972230  gcc/c/ChangeLog
! 3cd646f5b83b1b6ad35b21836044f6be  gcc/c/Make-lang.in
  3920e3ee16f5b5955d40584fea53c441  gcc/c/c-aux-info.cc
  cd5bab8a4deeaa0369ae59b9403d06a2  gcc/c/c-convert.cc
  398ac54da8b7823bd139bceebcf19569  gcc/c/c-decl.cc
--- 3329,3336 ----
  377686cbbf62a7d61d251d3f74cddb5b  gcc/c-family/known-headers.h
  431045382c41554804be1959c1596be4  gcc/c-family/name-hint.h
  3bae9e281cc87b35f63e906373f3b446  gcc/c-family/stub-objc.cc
! ac32719c127fde642acd9cdb8e96ee47  gcc/c/ChangeLog
! 06eb54aef1bdbf1efd3b5b3d57da78a3  gcc/c/Make-lang.in
  3920e3ee16f5b5955d40584fea53c441  gcc/c/c-aux-info.cc
  cd5bab8a4deeaa0369ae59b9403d06a2  gcc/c/c-convert.cc
  398ac54da8b7823bd139bceebcf19569  gcc/c/c-decl.cc
*************** d48c86bc52a7b8ee38281d6069d3eb6a  gcc/co
*** 3442,3449 ****
  903401554d90de06743fb9a836e6a45b  gcc/combine-stack-adj.cc
  af093931f440b1ff2d8eaf64045fbf9b  gcc/combine.cc
  9f2835a8fa18cfce2249127014eb7edd  gcc/common.md
! 4b25af59e1f8a07782dbddb00afc272c  gcc/common.opt
! e7c326a5938ec004f6b9f245c0c64caa  gcc/common.opt.urls
  d3b28fb0d49a8d683dde6011400fd7e7  gcc/common/common-target-def.h
  93cf11d6a27d42f73799ae012d2f876e  gcc/common/common-target.def
  d8f7142c05c4102806a8b26817df17a6  gcc/common/common-target.h
--- 3442,3449 ----
  903401554d90de06743fb9a836e6a45b  gcc/combine-stack-adj.cc
  af093931f440b1ff2d8eaf64045fbf9b  gcc/combine.cc
  9f2835a8fa18cfce2249127014eb7edd  gcc/common.md
! b82c70a691a0ccf137f58b46e3f35b22  gcc/common.opt
! 72509437da440cd6faf3b7125698e13b  gcc/common.opt.urls
  d3b28fb0d49a8d683dde6011400fd7e7  gcc/common/common-target-def.h
  93cf11d6a27d42f73799ae012d2f876e  gcc/common/common-target.def
  d8f7142c05c4102806a8b26817df17a6  gcc/common/common-target.h
*************** e3b84b8c70b76f20a6d8123da2876317  gcc/co
*** 3574,3586 ****
  0aaa296fe7e877e67b85468885fdb8b5  gcc/config/aarch64/aarch64-sve-builtins.def
  88f4473ff255da227dee1dbc66c11a5f  gcc/config/aarch64/aarch64-sve-builtins.h
  f254f4eb5433b6e41d08c6dd0805b7c0  gcc/config/aarch64/aarch64-sve.md
! aed1c7a89b093d7a786a6ab457841e24  gcc/config/aarch64/aarch64-sve2.md
  229d0046517455cf526c12527127f3b8  gcc/config/aarch64/aarch64-sys-regs.def
  2d13f36cfc7398f1eacd20710f90e0ce  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
! a63b58bae58724b6b9b05700ed984e7b  gcc/config/aarch64/aarch64.cc
  643919d961f71a1bd5cc1df13bbd79f5  gcc/config/aarch64/aarch64.h
  ec47958005b469d3d7377f0db34624bb  gcc/config/aarch64/aarch64.md
  c5cf87f72305a6ea92d9fd65a668c5f0  gcc/config/aarch64/aarch64.opt
--- 3574,3586 ----
  0aaa296fe7e877e67b85468885fdb8b5  gcc/config/aarch64/aarch64-sve-builtins.def
  88f4473ff255da227dee1dbc66c11a5f  gcc/config/aarch64/aarch64-sve-builtins.h
  f254f4eb5433b6e41d08c6dd0805b7c0  gcc/config/aarch64/aarch64-sve.md
! 78d4791112b168ff5157e8e4c95a40a5  gcc/config/aarch64/aarch64-sve2.md
  229d0046517455cf526c12527127f3b8  gcc/config/aarch64/aarch64-sys-regs.def
  2d13f36cfc7398f1eacd20710f90e0ce  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
! 101549eaebfcaa4c9ca118aad4feec27  gcc/config/aarch64/aarch64.cc
  643919d961f71a1bd5cc1df13bbd79f5  gcc/config/aarch64/aarch64.h
  ec47958005b469d3d7377f0db34624bb  gcc/config/aarch64/aarch64.md
  c5cf87f72305a6ea92d9fd65a668c5f0  gcc/config/aarch64/aarch64.opt
*************** ee1645bd7e049365c9b52b774f3e8324  gcc/co
*** 3648,3654 ****
  0e884947a64edcd1a0ab1c2d7f79ecc3  gcc/config/aarch64/tuning_models/neoversev2.h
  850f4e265f4d69a8db04fb6b9a509a73  gcc/config/aarch64/tuning_models/neoversev3.h
  da9eaf909c14d1ac8802b858a796dd0b  gcc/config/aarch64/tuning_models/neoversev3ae.h
! 4debd50cbb86b9985cb6a173228368ee  gcc/config/aarch64/tuning_models/olympus.h
  abe9f0139f34302abf43f42fc034f8a4  gcc/config/aarch64/tuning_models/qdf24xx.h
  f4bb7074b559d7a9ada65e9f1ea7e76e  gcc/config/aarch64/tuning_models/saphira.h
  79b67a066ee629e9a5d00e7dbc5da7b3  gcc/config/aarch64/tuning_models/thunderx.h
--- 3648,3654 ----
  0e884947a64edcd1a0ab1c2d7f79ecc3  gcc/config/aarch64/tuning_models/neoversev2.h
  850f4e265f4d69a8db04fb6b9a509a73  gcc/config/aarch64/tuning_models/neoversev3.h
  da9eaf909c14d1ac8802b858a796dd0b  gcc/config/aarch64/tuning_models/neoversev3ae.h
! cc9d43dc448a1ac731494dbf349143e9  gcc/config/aarch64/tuning_models/olympus.h
  abe9f0139f34302abf43f42fc034f8a4  gcc/config/aarch64/tuning_models/qdf24xx.h
  f4bb7074b559d7a9ada65e9f1ea7e76e  gcc/config/aarch64/tuning_models/saphira.h
  79b67a066ee629e9a5d00e7dbc5da7b3  gcc/config/aarch64/tuning_models/thunderx.h
*************** a07ee362a4961e9d41cb0ab83553de74  gcc/co
*** 3662,3668 ****
  83cd5c97b8f09c9606ad9f2c50fb18a0  gcc/config/alpha/alpha-modes.def
  b4eac8c564e104cf3cc48269868be196  gcc/config/alpha/alpha-passes.def
  3fde351a6bc8386bb57921a1e5589ffa  gcc/config/alpha/alpha-protos.h
! a6ff46e3866e23066e20ed1bf160f0ea  gcc/config/alpha/alpha.cc
  d9ed1faf0e8c75d119c4c2bd11d0f7a8  gcc/config/alpha/alpha.h
  785f504d1be6413dec066cb278f0c8ec  gcc/config/alpha/alpha.md
  9d7aba6e4e2821c0d801e5c6cba73763  gcc/config/alpha/alpha.opt
--- 3662,3668 ----
  83cd5c97b8f09c9606ad9f2c50fb18a0  gcc/config/alpha/alpha-modes.def
  b4eac8c564e104cf3cc48269868be196  gcc/config/alpha/alpha-passes.def
  3fde351a6bc8386bb57921a1e5589ffa  gcc/config/alpha/alpha-protos.h
! f359ed330f5d216f7f04f393d645fe95  gcc/config/alpha/alpha.cc
  d9ed1faf0e8c75d119c4c2bd11d0f7a8  gcc/config/alpha/alpha.h
  785f504d1be6413dec066cb278f0c8ec  gcc/config/alpha/alpha.md
  9d7aba6e4e2821c0d801e5c6cba73763  gcc/config/alpha/alpha.opt
*************** c097b985beb72ff18cb78cd9ccd8e231  gcc/co
*** 4282,4295 ****
  b18770c338209a9276ef5d52a49bde7b  gcc/config/i386/i386-builtin-types.awk
  5090ae3207d0bedc79ecdcec7c2cb71b  gcc/config/i386/i386-builtin-types.def
  0ba4d62f46027afe4bb4e8b65a9ab7c2  gcc/config/i386/i386-builtin.def
! abaef28dcdb11c3cac31b4568af73e38  gcc/config/i386/i386-builtins.cc
  be7f06e3ea032dfb39fcda012c812683  gcc/config/i386/i386-builtins.h
  4e422072527333634b85b1495395f8b6  gcc/config/i386/i386-c.cc
  a0261d6cc006fb86b99f338bdc94ae04  gcc/config/i386/i386-d.cc
  e9c7eebd4e344796f248c93990aa5166  gcc/config/i386/i386-d.h
  5f56a612866543a8ee3f0a5adf428cb2  gcc/config/i386/i386-expand.cc
  386e1be7f608621b79970d4d036694f8  gcc/config/i386/i386-expand.h
! 8b3e5c3ee37cc91c08a06631b25ca5dc  gcc/config/i386/i386-features.cc
  473c35b162be3bcf222c90a16f72b948  gcc/config/i386/i386-features.h
  dca59d9c03f5b12366f9a926169f396d  gcc/config/i386/i386-isa.def
  848d1b1aa8faaad07d31b78764004e7f  gcc/config/i386/i386-jit.cc
--- 4282,4295 ----
  b18770c338209a9276ef5d52a49bde7b  gcc/config/i386/i386-builtin-types.awk
  5090ae3207d0bedc79ecdcec7c2cb71b  gcc/config/i386/i386-builtin-types.def
  0ba4d62f46027afe4bb4e8b65a9ab7c2  gcc/config/i386/i386-builtin.def
! 8dbd55fdf807ba9b636b99fdf4277e4d  gcc/config/i386/i386-builtins.cc
  be7f06e3ea032dfb39fcda012c812683  gcc/config/i386/i386-builtins.h
  4e422072527333634b85b1495395f8b6  gcc/config/i386/i386-c.cc
  a0261d6cc006fb86b99f338bdc94ae04  gcc/config/i386/i386-d.cc
  e9c7eebd4e344796f248c93990aa5166  gcc/config/i386/i386-d.h
  5f56a612866543a8ee3f0a5adf428cb2  gcc/config/i386/i386-expand.cc
  386e1be7f608621b79970d4d036694f8  gcc/config/i386/i386-expand.h
! e0276b18d746ed8cead3e8f99f281a18  gcc/config/i386/i386-features.cc
  473c35b162be3bcf222c90a16f72b948  gcc/config/i386/i386-features.h
  dca59d9c03f5b12366f9a926169f396d  gcc/config/i386/i386-isa.def
  848d1b1aa8faaad07d31b78764004e7f  gcc/config/i386/i386-jit.cc
*************** b63569ecff9557acb7963f14a101bce1  gcc/co
*** 4303,4309 ****
  5b778b3296ea91dab0ca82338ca6828d  gcc/config/i386/i386-rust-and-jit.inc
  91b8b50cba997aef17a61929b5b55a87  gcc/config/i386/i386-rust.cc
  25b3947a11eb9ca52892133ddb36f3f2  gcc/config/i386/i386-rust.h
! 52002b38d11081c4b401acb305710c40  gcc/config/i386/i386.cc
  483853f45756ffc10a3acbe55d2d0920  gcc/config/i386/i386.h
  42aef5ebb1ff5727adac4b0462d615dc  gcc/config/i386/i386.md
  f431cbff6410e63b4e2de0e11adf19fb  gcc/config/i386/i386.opt
--- 4303,4309 ----
  5b778b3296ea91dab0ca82338ca6828d  gcc/config/i386/i386-rust-and-jit.inc
  91b8b50cba997aef17a61929b5b55a87  gcc/config/i386/i386-rust.cc
  25b3947a11eb9ca52892133ddb36f3f2  gcc/config/i386/i386-rust.h
! a4f4925c2f9fa6e61114dce33231ef93  gcc/config/i386/i386.cc
  483853f45756ffc10a3acbe55d2d0920  gcc/config/i386/i386.h
  42aef5ebb1ff5727adac4b0462d615dc  gcc/config/i386/i386.md
  f431cbff6410e63b4e2de0e11adf19fb  gcc/config/i386/i386.opt
*************** c7eeb48ab4223ecfdb09fa5e4ce61d71  gcc/co
*** 4540,4546 ****
  dadec2097ca9c4947a49a5766ac8ee89  gcc/config/loongarch/loongarch-str.h
  7bac4fb08db6ef96b48be102bcb671a3  gcc/config/loongarch/loongarch-target-attr.cc
  3cfb174db8bc99a9361e597a3e9bd35e  gcc/config/loongarch/loongarch-tune.h
! 6f5f7d4b4798dab768bdcf9a85e86c78  gcc/config/loongarch/loongarch.cc
  57abfb8c653a24903f61e5cf93ac929f  gcc/config/loongarch/loongarch.h
  1b11d059c390458cbbf8e16a8efa5e6f  gcc/config/loongarch/loongarch.md
  62f9bea81246c3dac622d969dabefc1b  gcc/config/loongarch/loongarch.opt
--- 4540,4546 ----
  dadec2097ca9c4947a49a5766ac8ee89  gcc/config/loongarch/loongarch-str.h
  7bac4fb08db6ef96b48be102bcb671a3  gcc/config/loongarch/loongarch-target-attr.cc
  3cfb174db8bc99a9361e597a3e9bd35e  gcc/config/loongarch/loongarch-tune.h
! 9272b8d16a7b2ab2fdaa94f4a07ef18e  gcc/config/loongarch/loongarch.cc
  57abfb8c653a24903f61e5cf93ac929f  gcc/config/loongarch/loongarch.h
  1b11d059c390458cbbf8e16a8efa5e6f  gcc/config/loongarch/loongarch.md
  62f9bea81246c3dac622d969dabefc1b  gcc/config/loongarch/loongarch.opt
*************** b65281b3d979c9c774d30d65281a07ab  gcc/co
*** 5094,5100 ****
  75866c86ec05a7abe2fa3f55828938b0  gcc/config/riscv/riscv-vsetvl.cc
  10ae51c30c9b8e6dce66f20016fae344  gcc/config/riscv/riscv-vsetvl.def
  85dee253312a7f85a1d4f8554a601105  gcc/config/riscv/riscv-zicfilp.cc
! 017ce08252063b15ffcddce00a79f359  gcc/config/riscv/riscv.cc
  cff2fc59ab1defbd178f75bdcd643bcc  gcc/config/riscv/riscv.h
  69bf57d0406b6ab66b5fd796932171e7  gcc/config/riscv/riscv.md
  c721fa1217a74f723ccf84813f721944  gcc/config/riscv/riscv.opt
--- 5094,5100 ----
  75866c86ec05a7abe2fa3f55828938b0  gcc/config/riscv/riscv-vsetvl.cc
  10ae51c30c9b8e6dce66f20016fae344  gcc/config/riscv/riscv-vsetvl.def
  85dee253312a7f85a1d4f8554a601105  gcc/config/riscv/riscv-zicfilp.cc
! d0a4baa2b600d4b5458d1dbb99e9fbcb  gcc/config/riscv/riscv.cc
  cff2fc59ab1defbd178f75bdcd643bcc  gcc/config/riscv/riscv.h
  69bf57d0406b6ab66b5fd796932171e7  gcc/config/riscv/riscv.md
  c721fa1217a74f723ccf84813f721944  gcc/config/riscv/riscv.opt
*************** d3a1c98fd13be04e1250b073cb8dcef2  gcc/co
*** 5262,5268 ****
  9e39e759376eb97f2a56ebfc28c8d149  gcc/config/rs6000/rs6000-string.cc
  505106a6c6516140530fe5f55a87e44e  gcc/config/rs6000/rs6000-tables.opt
  ce8de9a27f36b759a69194616c02eb38  gcc/config/rs6000/rs6000-tables.opt.urls
! 3903942cdca2fa3c10b1ad0ae5356070  gcc/config/rs6000/rs6000.cc
  838ab0dea9bee1b30cbf4cb875917f74  gcc/config/rs6000/rs6000.h
  a575dd5c5592c7d23a9b53b985c01120  gcc/config/rs6000/rs6000.md
  fc53ceb489fffb4124155c557c54157f  gcc/config/rs6000/rs6000.opt
--- 5262,5268 ----
  9e39e759376eb97f2a56ebfc28c8d149  gcc/config/rs6000/rs6000-string.cc
  505106a6c6516140530fe5f55a87e44e  gcc/config/rs6000/rs6000-tables.opt
  ce8de9a27f36b759a69194616c02eb38  gcc/config/rs6000/rs6000-tables.opt.urls
! bcf781e9687d0164eeab8e20a7ed9eb7  gcc/config/rs6000/rs6000.cc
  838ab0dea9bee1b30cbf4cb875917f74  gcc/config/rs6000/rs6000.h
  a575dd5c5592c7d23a9b53b985c01120  gcc/config/rs6000/rs6000.md
  fc53ceb489fffb4124155c557c54157f  gcc/config/rs6000/rs6000.opt
*************** dfead17f6b810bf033f9fd649084b362  gcc/co
*** 5397,5405 ****
  e6c6b89f602f5dabaaff761b0db28d25  gcc/config/sh/sh-mem.cc
  db7b2e9490086922f942532dd544a0f6  gcc/config/sh/sh-modes.def
  fb8513c0c66fb1a6e8d5cde7b08975c5  gcc/config/sh/sh-protos.h
! c147716d7790e9f816f928176fd5bf5d  gcc/config/sh/sh.cc
  de5433ad4ca4e28cd54d4ff7e2862435  gcc/config/sh/sh.h
! 4d09c48cdaa1d61ff15475e4604442ea  gcc/config/sh/sh.md
  10ed22d9ca9d7ec14fcf6b1a936fbf8d  gcc/config/sh/sh.opt
  8bfaebe9773073f4977ba6b37f472071  gcc/config/sh/sh.opt.urls
  95f5ec03805045e1d73c1e77a70ac975  gcc/config/sh/sh1.md
--- 5397,5405 ----
  e6c6b89f602f5dabaaff761b0db28d25  gcc/config/sh/sh-mem.cc
  db7b2e9490086922f942532dd544a0f6  gcc/config/sh/sh-modes.def
  fb8513c0c66fb1a6e8d5cde7b08975c5  gcc/config/sh/sh-protos.h
! 4f0dc68143f7ce6e3a71515c53599217  gcc/config/sh/sh.cc
  de5433ad4ca4e28cd54d4ff7e2862435  gcc/config/sh/sh.h
! c224a78f871d5a6955c504366fcf9499  gcc/config/sh/sh.md
  10ed22d9ca9d7ec14fcf6b1a936fbf8d  gcc/config/sh/sh.opt
  8bfaebe9773073f4977ba6b37f472071  gcc/config/sh/sh.opt.urls
  95f5ec03805045e1d73c1e77a70ac975  gcc/config/sh/sh1.md
*************** dc254552328f40c4458f00f10abebd71  gcc/co
*** 5477,5483 ****
  4a7d3f368a24d549fabaafbe44fcb134  gcc/config/sparc/t-linux
  7693ced3f09f57dc05ff0e51917c5280  gcc/config/sparc/t-linux64
  75987b7fdc6fa9c9ff2108ff1003e6d2  gcc/config/sparc/t-netbsd64
! a3ff7f76296ae7f167a6ef39171e6fb5  gcc/config/sparc/t-rtems
  206a022a0c080a59b8ced70ccf86cd4d  gcc/config/sparc/t-rtems-64
  511770bb20c2707fabd4f231ce8b83cf  gcc/config/sparc/t-sol2
  808e7abc64ab41e568ed9b2b3d3fe5bd  gcc/config/sparc/t-sparc
--- 5477,5483 ----
  4a7d3f368a24d549fabaafbe44fcb134  gcc/config/sparc/t-linux
  7693ced3f09f57dc05ff0e51917c5280  gcc/config/sparc/t-linux64
  75987b7fdc6fa9c9ff2108ff1003e6d2  gcc/config/sparc/t-netbsd64
! e97bf9b24c45359a2f9288f392557974  gcc/config/sparc/t-rtems
  206a022a0c080a59b8ced70ccf86cd4d  gcc/config/sparc/t-rtems-64
  511770bb20c2707fabd4f231ce8b83cf  gcc/config/sparc/t-sol2
  808e7abc64ab41e568ed9b2b3d3fe5bd  gcc/config/sparc/t-sparc
*************** dbd5811fcd8a1caf49e4e9091afdc18c  gcc/co
*** 5626,5638 ****
  9a9ea234526c2b6ec2dde5659d16935c  gcc/config/xtensa/xtensa-opts.h
  f11b25bf61cd607f1829b2d5c5d306b9  gcc/config/xtensa/xtensa-passes.def
  5bb32139578c6218acd7e0a88f72cfe9  gcc/config/xtensa/xtensa-protos.h
! 771c5ddf3907d60dfa38a242e5f33403  gcc/config/xtensa/xtensa.cc
  c60f07bed189e2a8fb8abfe19368e9f9  gcc/config/xtensa/xtensa.h
  2c0da3651cf6569232670fb437852cf6  gcc/config/xtensa/xtensa.md
  093588e637649f5260b04ad13fe609e6  gcc/config/xtensa/xtensa.opt
  db57d7603312357e8c0cfb21c32353d1  gcc/config/xtensa/xtensa.opt.urls
! 6e14a892cc8195a38b57b525767c5680  gcc/configure
! c455732e9e0e7d2767f61c7b6e8ba1fd  gcc/configure.ac
  a2bfe87830136c2d55b591b943cecd3f  gcc/configure.tgt
  8a46839a73059f70ef105be9706c2554  gcc/context.cc
  08023c1005def168a8b675813b95d9f4  gcc/context.h
--- 5626,5638 ----
  9a9ea234526c2b6ec2dde5659d16935c  gcc/config/xtensa/xtensa-opts.h
  f11b25bf61cd607f1829b2d5c5d306b9  gcc/config/xtensa/xtensa-passes.def
  5bb32139578c6218acd7e0a88f72cfe9  gcc/config/xtensa/xtensa-protos.h
! b8fe117448d29b0b4caa7a3ce4e0fda6  gcc/config/xtensa/xtensa.cc
  c60f07bed189e2a8fb8abfe19368e9f9  gcc/config/xtensa/xtensa.h
  2c0da3651cf6569232670fb437852cf6  gcc/config/xtensa/xtensa.md
  093588e637649f5260b04ad13fe609e6  gcc/config/xtensa/xtensa.opt
  db57d7603312357e8c0cfb21c32353d1  gcc/config/xtensa/xtensa.opt.urls
! db7ba40ae4b88e5acdc5cc5342accf11  gcc/configure
! c09814d9747b4f805a3f302d516cdc44  gcc/configure.ac
  a2bfe87830136c2d55b591b943cecd3f  gcc/configure.tgt
  8a46839a73059f70ef105be9706c2554  gcc/context.cc
  08023c1005def168a8b675813b95d9f4  gcc/context.h
*************** c5ad0142a191862e3e81ecd3573754b3  gcc/co
*** 5643,5649 ****
  55a33ae415bde0fd2e36ba584894e50b  gcc/coroutine-passes.cc
  7c2ad47e271f9b832badf1740a09c77e  gcc/coverage.cc
  8524318f81a8af8cfaa8d35966d8fdc2  gcc/coverage.h
! 36fd855d51c29b9ee77fca3540708ae1  gcc/cp/ChangeLog
  70c059f2b75a2fc1bb95a526b21b8cd7  gcc/cp/ChangeLog-1993
  7cbd106e10a0ba7c052bee3fe20671c2  gcc/cp/ChangeLog-1994
  3b1e3ed23ad4363f75e6fd2fbb583dee  gcc/cp/ChangeLog-1995
--- 5643,5649 ----
  55a33ae415bde0fd2e36ba584894e50b  gcc/coroutine-passes.cc
  7c2ad47e271f9b832badf1740a09c77e  gcc/coverage.cc
  8524318f81a8af8cfaa8d35966d8fdc2  gcc/coverage.h
! 8a0bf6a79981a3335824632513836458  gcc/cp/ChangeLog
  70c059f2b75a2fc1bb95a526b21b8cd7  gcc/cp/ChangeLog-1993
  7cbd106e10a0ba7c052bee3fe20671c2  gcc/cp/ChangeLog-1994
  3b1e3ed23ad4363f75e6fd2fbb583dee  gcc/cp/ChangeLog-1995
*************** bcf7c5d02934e40f17edeb18d58c4d4d  gcc/cp
*** 5679,5691 ****
  f39635970f98bbc4591f6363fe70504b  gcc/cp/ChangeLog-2025
  c1c7801b9b0f379e702a4f6cb83972e7  gcc/cp/ChangeLog.ptr
  9aa3cd9f75c785de9f51446e3f295515  gcc/cp/ChangeLog.tree-ssa
! 7cbe8fb81efe0334db261cccd9bbd488  gcc/cp/Make-lang.in
! af8e3b118f098072fafadf8cddd33d9b  gcc/cp/call.cc
  144dd1ae510a7436b569b007470b62da  gcc/cp/cfns.gperf
  39dd4c5a96c7ea132eb3c7ed039a065e  gcc/cp/cfns.h
  4a5a02469458f5a17e932ae0133f2ce7  gcc/cp/class.cc
  e51f295e858583af5f9cf88b9530adf7  gcc/cp/config-lang.in
! 33944853f107bb6317b31859de083f76  gcc/cp/constexpr.cc
  e4894157c7dd2b2253a316497614e8f0  gcc/cp/constraint.cc
  99c403ab218e024bcf6d5d2108ad1f3b  gcc/cp/contracts.cc
  e77a681f560f3e9500f126febdc67ef6  gcc/cp/contracts.h
--- 5679,5691 ----
  f39635970f98bbc4591f6363fe70504b  gcc/cp/ChangeLog-2025
  c1c7801b9b0f379e702a4f6cb83972e7  gcc/cp/ChangeLog.ptr
  9aa3cd9f75c785de9f51446e3f295515  gcc/cp/ChangeLog.tree-ssa
! 8246afa8febc0194ad61f92827009cfb  gcc/cp/Make-lang.in
! 066eec1c9934c852e16ad23a90d55152  gcc/cp/call.cc
  144dd1ae510a7436b569b007470b62da  gcc/cp/cfns.gperf
  39dd4c5a96c7ea132eb3c7ed039a065e  gcc/cp/cfns.h
  4a5a02469458f5a17e932ae0133f2ce7  gcc/cp/class.cc
  e51f295e858583af5f9cf88b9530adf7  gcc/cp/config-lang.in
! c104d44dea7900ea7a8fc05d88e125e6  gcc/cp/constexpr.cc
  e4894157c7dd2b2253a316497614e8f0  gcc/cp/constraint.cc
  99c403ab218e024bcf6d5d2108ad1f3b  gcc/cp/contracts.cc
  e77a681f560f3e9500f126febdc67ef6  gcc/cp/contracts.h
*************** a48a96cdb5553f579d5844b897509902  gcc/cp
*** 5708,5714 ****
  6b0c9433f7d3f129a44b59d54babb4eb  gcc/cp/decl.h
  eb77bf90b77e8585aa773ccdf953c298  gcc/cp/decl2.cc
  12ccd5244973d74a0536adf58261b416  gcc/cp/dump.cc
! 57d1fa0a3980884b82ca4f3198be131f  gcc/cp/error.cc
  59d3d272a504a462c1f7081637e7f3e5  gcc/cp/except.cc
  70f36ac126d5a18ee7be5d40cf58c2c9  gcc/cp/expr.cc
  447ddbe59eba62b9a389b9ba11701cfc  gcc/cp/friend.cc
--- 5708,5714 ----
  6b0c9433f7d3f129a44b59d54babb4eb  gcc/cp/decl.h
  eb77bf90b77e8585aa773ccdf953c298  gcc/cp/decl2.cc
  12ccd5244973d74a0536adf58261b416  gcc/cp/dump.cc
! ecc52c9b0d629f940b5f324e0a0ae01a  gcc/cp/error.cc
  59d3d272a504a462c1f7081637e7f3e5  gcc/cp/except.cc
  70f36ac126d5a18ee7be5d40cf58c2c9  gcc/cp/expr.cc
  447ddbe59eba62b9a389b9ba11701cfc  gcc/cp/friend.cc
*************** e4ccdd9cbe95dde4cce27394a7613dd9  gcc/cp
*** 5726,5747 ****
  4f8663190bd54ce6e6c71816f7ea934f  gcc/cp/metafns.gperf
  13e5b9c99aa3729623f43052b1f10688  gcc/cp/metafns.h
  db73ab5285dd3810cd91cb42aa475df5  gcc/cp/method.cc
! ac413ac14b16326a57fb8e0537b0271b  gcc/cp/module.cc
  395c9708c9225e83b2a3916ddaa46d54  gcc/cp/name-lookup.cc
  b166c2ce3d5ccd4de4e0c5910947ae41  gcc/cp/name-lookup.h
  b98d31c57aa038618db60991b17e0d35  gcc/cp/operators.def
  9efebf39da56d681d4405dfb9e55e3f5  gcc/cp/optimize.cc
! e042917079c5dc6e25dfbce9fcf57d89  gcc/cp/parser.cc
  7973a34c47e3d3c580832655a3a5c3c2  gcc/cp/parser.h
! 3762c6c1ae239edf527730e14ec6ab01  gcc/cp/pt.cc
  25322928eaff39cf167372554c639e02  gcc/cp/ptree.cc
! 31b0704bc76a4089eaa39cf9029a9714  gcc/cp/reflect.cc
  97df067b24bdcb46ea1a2ca984c26a33  gcc/cp/rtti.cc
  ed044462caa5bbab93e33fd297bc5d7c  gcc/cp/search.cc
  8724174eaba039e08de0b8faa84242ed  gcc/cp/semantics.cc
  64c36b2ea66c9f8f477b19d24e06a2cb  gcc/cp/std-name-hint.gperf
  15cc409f13a8952feb90e94d99ecefa2  gcc/cp/std-name-hint.h
! 5ee2ea3fdb935edf62870405b960f632  gcc/cp/tree.cc
  01e9a381e6fcf3d016d0170ee0ad71d7  gcc/cp/type-utils.h
  dd21e0771211da03ea52000a335b44a9  gcc/cp/typeck.cc
  40eb09924b1139e6f7994869420c0c98  gcc/cp/typeck2.cc
--- 5726,5747 ----
  4f8663190bd54ce6e6c71816f7ea934f  gcc/cp/metafns.gperf
  13e5b9c99aa3729623f43052b1f10688  gcc/cp/metafns.h
  db73ab5285dd3810cd91cb42aa475df5  gcc/cp/method.cc
! 8b9c2ff6ab176652cff1a26b159f28cb  gcc/cp/module.cc
  395c9708c9225e83b2a3916ddaa46d54  gcc/cp/name-lookup.cc
  b166c2ce3d5ccd4de4e0c5910947ae41  gcc/cp/name-lookup.h
  b98d31c57aa038618db60991b17e0d35  gcc/cp/operators.def
  9efebf39da56d681d4405dfb9e55e3f5  gcc/cp/optimize.cc
! 876b7231ac8a84bcc388f1abb31fa9bc  gcc/cp/parser.cc
  7973a34c47e3d3c580832655a3a5c3c2  gcc/cp/parser.h
! cfd45116ab651bd87ae0860dcbb58fcc  gcc/cp/pt.cc
  25322928eaff39cf167372554c639e02  gcc/cp/ptree.cc
! a1cbafada393ec59e6282c93e6d22dd5  gcc/cp/reflect.cc
  97df067b24bdcb46ea1a2ca984c26a33  gcc/cp/rtti.cc
  ed044462caa5bbab93e33fd297bc5d7c  gcc/cp/search.cc
  8724174eaba039e08de0b8faa84242ed  gcc/cp/semantics.cc
  64c36b2ea66c9f8f477b19d24e06a2cb  gcc/cp/std-name-hint.gperf
  15cc409f13a8952feb90e94d99ecefa2  gcc/cp/std-name-hint.h
! 808deee41e6401283bf24bd1ea1bcbdf  gcc/cp/tree.cc
  01e9a381e6fcf3d016d0170ee0ad71d7  gcc/cp/type-utils.h
  dd21e0771211da03ea52000a335b44a9  gcc/cp/typeck.cc
  40eb09924b1139e6f7994869420c0c98  gcc/cp/typeck2.cc
*************** f47d236d7ee7e48319a13461771035d6  gcc/do
*** 6150,6158 ****
  37d898a82683588b62cca104098ad182  gcc/doc/include/gcc-common.texi
  95c90bf85d3eab67f348ee3ce0bf4050  gcc/doc/include/gpl_v3.texi
  e9b8122841fbfbbc30fee8ed6613c399  gcc/doc/include/texinfo.tex
! ba1fdded15d2517a0df5e5cd7e54bec2  gcc/doc/install.texi
  30a2209eee0a2bed76e2d9ff3bd646f2  gcc/doc/install.texi2html
! c1f5915deede97022528ce4f492ee674  gcc/doc/invoke.texi
  dd9d4097ebfa9e936c41913343807268  gcc/doc/languages.texi
  46d2bbbd37002bb71569d0b1f27d7a5a  gcc/doc/libgcc.texi
  ef4f00c423089323edef1d3cff31a4a2  gcc/doc/libgdiagnostics/Makefile
--- 6150,6158 ----
  37d898a82683588b62cca104098ad182  gcc/doc/include/gcc-common.texi
  95c90bf85d3eab67f348ee3ce0bf4050  gcc/doc/include/gpl_v3.texi
  e9b8122841fbfbbc30fee8ed6613c399  gcc/doc/include/texinfo.tex
! db8dbcf7fdd8459bac403cd0f8bd754a  gcc/doc/install.texi
  30a2209eee0a2bed76e2d9ff3bd646f2  gcc/doc/install.texi2html
! 4500d83633f3e52d99765cfbcb055c43  gcc/doc/invoke.texi
  dd9d4097ebfa9e936c41913343807268  gcc/doc/languages.texi
  46d2bbbd37002bb71569d0b1f27d7a5a  gcc/doc/libgcc.texi
  ef4f00c423089323edef1d3cff31a4a2  gcc/doc/libgdiagnostics/Makefile
*************** f80b38c70a85f9aeae9688b937b028ba  gcc/fi
*** 6267,6273 ****
  50b999b375e3a5a95a002f592e6d4514  gcc/fold-const.cc
  0ec02a37dbbe9cb267f0ea1263085ed3  gcc/fold-const.h
  a0df3d274ac009d203209a191738cec6  gcc/fold-mem-offsets.cc
! 72da573a741b53c924f36bb8aac6a085  gcc/fortran/ChangeLog
  083c53fadafdcf3be46713838a51e36c  gcc/fortran/ChangeLog-2002
  2a4ca18d211fb2603139354fd16398ed  gcc/fortran/ChangeLog-2003
  e7462609ebd0dd7c874e0fc00e2833aa  gcc/fortran/ChangeLog-2004
--- 6267,6273 ----
  50b999b375e3a5a95a002f592e6d4514  gcc/fold-const.cc
  0ec02a37dbbe9cb267f0ea1263085ed3  gcc/fold-const.h
  a0df3d274ac009d203209a191738cec6  gcc/fold-mem-offsets.cc
! 749ca1a88159cafe24a36a342d6c289b  gcc/fortran/ChangeLog
  083c53fadafdcf3be46713838a51e36c  gcc/fortran/ChangeLog-2002
  2a4ca18d211fb2603139354fd16398ed  gcc/fortran/ChangeLog-2003
  e7462609ebd0dd7c874e0fc00e2833aa  gcc/fortran/ChangeLog-2004
*************** c38eb0f2f19a6cb4b79be761670131e8  gcc/fo
*** 6296,6302 ****
  181571ce035e2781f9d8141b9163749a  gcc/fortran/Make-lang.in
  bcb129d4d143e6ec42b4ddec1fea30b8  gcc/fortran/arith.cc
  1f3ee645ab25a3d858b555c00c0327ae  gcc/fortran/arith.h
! b9eb124ac64250ae6b43323a196eb79f  gcc/fortran/array.cc
  bc40e87bca719f86583a020eff2d6a73  gcc/fortran/bbt.cc
  011bd7dc066f89c0090f777ebf9857c8  gcc/fortran/check.cc
  cb187afae869d66ea5e19e55fa945052  gcc/fortran/class.cc
--- 6296,6302 ----
  181571ce035e2781f9d8141b9163749a  gcc/fortran/Make-lang.in
  bcb129d4d143e6ec42b4ddec1fea30b8  gcc/fortran/arith.cc
  1f3ee645ab25a3d858b555c00c0327ae  gcc/fortran/arith.h
! dd3d4373e33e0a14abdf26814a44662b  gcc/fortran/array.cc
  bc40e87bca719f86583a020eff2d6a73  gcc/fortran/bbt.cc
  011bd7dc066f89c0090f777ebf9857c8  gcc/fortran/check.cc
  cb187afae869d66ea5e19e55fa945052  gcc/fortran/class.cc
*************** a465af66dbc504ea8aab1ad5d516072d  gcc/fo
*** 6346,6383 ****
  7baca4fc0a6fcd712dcbccab22987c74  gcc/fortran/options.cc
  51c7efe91d03b1ef05f51f3f1f4c90f6  gcc/fortran/parse.cc
  c97a1f016de974126c688bb9c805f323  gcc/fortran/parse.h
! 8bb157582f33e85815663fe201266fa6  gcc/fortran/primary.cc
! e4e1862e1abc0f81e9fa535f9185ee87  gcc/fortran/resolve.cc
  2c98823b77eb8d1c8818d06dc48f3e0a  gcc/fortran/scanner.cc
  18963b3f6aacca960fd6aa72b429a9d2  gcc/fortran/scanner.h
  cb6be151a06683abd748861c64ae065d  gcc/fortran/simplify.cc
  cbdc87ddd4ad5837f1771e93f704a33e  gcc/fortran/st.cc
  9ab345f2cf2e1d75d845197f54c1238f  gcc/fortran/symbol.cc
! 1c6fd4e52d7d8b97d9357ff08b660d49  gcc/fortran/target-memory.cc
! 92193b934a673cebed3efed7f74a9cac  gcc/fortran/target-memory.h
  4b6abcdd99d6c3b97cdf447c5ce9eb4d  gcc/fortran/trans-array.cc
  a0c40b654df0b5c5213047d26e48e97a  gcc/fortran/trans-array.h
  5c567026f9fbc4fea9b59c22743687c4  gcc/fortran/trans-common.cc
  98960d7450a15e1ecc9789bd0bde16a7  gcc/fortran/trans-const.cc
  0d5cf4117521dba2aea9c8fd7ac67888  gcc/fortran/trans-const.h
  ff9af5e205134de79955e34475056910  gcc/fortran/trans-decl.cc
! a63b928cce0e7f7e41027aa5b8417f7a  gcc/fortran/trans-expr.cc
  10c24440d11b0ad8ae5b69c3c899db5f  gcc/fortran/trans-intrinsic.cc
  9d578d72e2bcb2e0fc0dc71c709c80f8  gcc/fortran/trans-io.cc
! a46e4ac06108c258f9c52c9304e48fd1  gcc/fortran/trans-openmp.cc
  1d1d754800b06538402013d58915fd0f  gcc/fortran/trans-stmt.cc
  6fbc90714f9730e84515bbaadff313f9  gcc/fortran/trans-stmt.h
  f8cac5e2268c177aff676d2dbb690f51  gcc/fortran/trans-types.cc
  6b00c9b76b80a96feb87d86b4b06102b  gcc/fortran/trans-types.h
! 91ee4c9dbcce0115a4780015fb117304  gcc/fortran/trans.cc
! e56083fc2c4890d3e4802c5a64dd00f5  gcc/fortran/trans.h
  95f35aeb3293f3036414b45c9c749d61  gcc/fortran/trigd_fe.inc
  57ebe36e9e77bcb8eab87809d044e0f1  gcc/fortran/types.def
  2512380133ab0852be268312deda8663  gcc/fp-test.cc
  5bcff9f70e07fe2f3a5f5ef42b82a9bd  gcc/function-abi.cc
  fe144e1c2a0da30ffc9946e5adab7e6f  gcc/function-abi.h
  45679bb0d98b3e87046958f7576b3770  gcc/function-tests.cc
! f2774a60d96892a29e473edce69ca505  gcc/function.cc
  797473d7b92327caaa0bc2b71c14bc0d  gcc/function.h
  96e0cc03035051e1904d130ab24fdfb4  gcc/fwprop.cc
  32954fca43f23e905ac77e9879653355  gcc/gcc-ar.cc
--- 6346,6383 ----
  7baca4fc0a6fcd712dcbccab22987c74  gcc/fortran/options.cc
  51c7efe91d03b1ef05f51f3f1f4c90f6  gcc/fortran/parse.cc
  c97a1f016de974126c688bb9c805f323  gcc/fortran/parse.h
! f8f17e966c9b06f3143a910582383fb7  gcc/fortran/primary.cc
! 87ed96f64db17d84faeaae288a44c689  gcc/fortran/resolve.cc
  2c98823b77eb8d1c8818d06dc48f3e0a  gcc/fortran/scanner.cc
  18963b3f6aacca960fd6aa72b429a9d2  gcc/fortran/scanner.h
  cb6be151a06683abd748861c64ae065d  gcc/fortran/simplify.cc
  cbdc87ddd4ad5837f1771e93f704a33e  gcc/fortran/st.cc
  9ab345f2cf2e1d75d845197f54c1238f  gcc/fortran/symbol.cc
! 4fa06f769be3f1b439a574ee842c82ca  gcc/fortran/target-memory.cc
! ea8837444e2a08a95a3ea747c94b8106  gcc/fortran/target-memory.h
  4b6abcdd99d6c3b97cdf447c5ce9eb4d  gcc/fortran/trans-array.cc
  a0c40b654df0b5c5213047d26e48e97a  gcc/fortran/trans-array.h
  5c567026f9fbc4fea9b59c22743687c4  gcc/fortran/trans-common.cc
  98960d7450a15e1ecc9789bd0bde16a7  gcc/fortran/trans-const.cc
  0d5cf4117521dba2aea9c8fd7ac67888  gcc/fortran/trans-const.h
  ff9af5e205134de79955e34475056910  gcc/fortran/trans-decl.cc
! d9ef45860771165adc17316e9dbbcc65  gcc/fortran/trans-expr.cc
  10c24440d11b0ad8ae5b69c3c899db5f  gcc/fortran/trans-intrinsic.cc
  9d578d72e2bcb2e0fc0dc71c709c80f8  gcc/fortran/trans-io.cc
! 73efba48d12b420946095f8043c6f5ec  gcc/fortran/trans-openmp.cc
  1d1d754800b06538402013d58915fd0f  gcc/fortran/trans-stmt.cc
  6fbc90714f9730e84515bbaadff313f9  gcc/fortran/trans-stmt.h
  f8cac5e2268c177aff676d2dbb690f51  gcc/fortran/trans-types.cc
  6b00c9b76b80a96feb87d86b4b06102b  gcc/fortran/trans-types.h
! 4cfc28dee8f1def4055b24dcd44fe9b9  gcc/fortran/trans.cc
! a5464198aa6b5015fdf27b2e0f276290  gcc/fortran/trans.h
  95f35aeb3293f3036414b45c9c749d61  gcc/fortran/trigd_fe.inc
  57ebe36e9e77bcb8eab87809d044e0f1  gcc/fortran/types.def
  2512380133ab0852be268312deda8663  gcc/fp-test.cc
  5bcff9f70e07fe2f3a5f5ef42b82a9bd  gcc/function-abi.cc
  fe144e1c2a0da30ffc9946e5adab7e6f  gcc/function-abi.h
  45679bb0d98b3e87046958f7576b3770  gcc/function-tests.cc
! df72eb5894627a5c2df4f9c7ed6d4793  gcc/function.cc
  797473d7b92327caaa0bc2b71c14bc0d  gcc/function.h
  96e0cc03035051e1904d130ab24fdfb4  gcc/fwprop.cc
  32954fca43f23e905ac77e9879653355  gcc/gcc-ar.cc
*************** e4981e3b10513f53ed20b58620dfc56f  gcc/gc
*** 6392,6398 ****
  2e5199869e1ce8b2630e4784fbc6e5e6  gcc/gcc-urlifier.cc
  3ba51d67080efcd8791ea2eaf4103d72  gcc/gcc-urlifier.def
  9110b89a48e29f0f75e8c76eca85c6e2  gcc/gcc-urlifier.h
! 46bdbd790b0867cee24f37ad0e3c51e2  gcc/gcc.cc
  09d73a192ef597ac58c7300df5ae4eb3  gcc/gcc.h
  1edfbdaab776ee29780fe98d767e67ed  gcc/gcov-counter.def
  5254cb252da1522a0364a1ef41fa47b1  gcc/gcov-dump.cc
--- 6392,6398 ----
  2e5199869e1ce8b2630e4784fbc6e5e6  gcc/gcc-urlifier.cc
  3ba51d67080efcd8791ea2eaf4103d72  gcc/gcc-urlifier.def
  9110b89a48e29f0f75e8c76eca85c6e2  gcc/gcc-urlifier.h
! b05737bbc68b136b84a297541d337fb7  gcc/gcc.cc
  09d73a192ef597ac58c7300df5ae4eb3  gcc/gcc.h
  1edfbdaab776ee29780fe98d767e67ed  gcc/gcov-counter.def
  5254cb252da1522a0364a1ef41fa47b1  gcc/gcov-dump.cc
*************** e8ef831ecab58724c781ef6c239eb959  gcc/gi
*** 6459,6465 ****
  c786a045909d4b0717a3d5687e24dc62  gcc/gimple-crc-optimization.cc
  e33888307c479ce11d601ebd8fc8f0af  gcc/gimple-expr.cc
  61721564f913cdbebe438f7c378b316e  gcc/gimple-expr.h
! 5b10fbbc620aec9e6c961e3462f50a8c  gcc/gimple-fold.cc
  d4285bef3fb661843b5d37c21e759c95  gcc/gimple-fold.h
  109e0f96a9d27a8a25bb73d61b701bbc  gcc/gimple-harden-conditionals.cc
  ebf0fc6c9a10c730d10710fdec206805  gcc/gimple-harden-control-flow.cc
--- 6459,6465 ----
  c786a045909d4b0717a3d5687e24dc62  gcc/gimple-crc-optimization.cc
  e33888307c479ce11d601ebd8fc8f0af  gcc/gimple-expr.cc
  61721564f913cdbebe438f7c378b316e  gcc/gimple-expr.h
! b75879478fadd54ee34b81fd544b7456  gcc/gimple-fold.cc
  d4285bef3fb661843b5d37c21e759c95  gcc/gimple-fold.h
  109e0f96a9d27a8a25bb73d61b701bbc  gcc/gimple-harden-conditionals.cc
  ebf0fc6c9a10c730d10710fdec206805  gcc/gimple-harden-control-flow.cc
*************** e35a6083f100e687d2e1c31c46aabecd  gcc/gi
*** 6531,6537 ****
  72589cf8cf38daf58173bae09359bc01  gcc/gimple.h
  46bdb18976fdb25accadbfdc07f14a8e  gcc/gimplify-me.cc
  cc5b43d0554c69571cd007e727fbb7d1  gcc/gimplify-me.h
! 657784fd43c876b6cf15a5b8eb153c3b  gcc/gimplify.cc
  00b4fa5f2537547bcddd508fd61459ca  gcc/gimplify.h
  ba3039c0ed9645080c52c0d4bc46096f  gcc/gimplify_reg_info.h
  83f82d6779ea9f6500c863169abfca55  gcc/ginclude/float.h
--- 6531,6537 ----
  72589cf8cf38daf58173bae09359bc01  gcc/gimple.h
  46bdb18976fdb25accadbfdc07f14a8e  gcc/gimplify-me.cc
  cc5b43d0554c69571cd007e727fbb7d1  gcc/gimplify-me.h
! b8dd4145c1714748ffcfa90cb4937033  gcc/gimplify.cc
  00b4fa5f2537547bcddd508fd61459ca  gcc/gimplify.h
  ba3039c0ed9645080c52c0d4bc46096f  gcc/gimplify_reg_info.h
  83f82d6779ea9f6500c863169abfca55  gcc/ginclude/float.h
*************** c7c9628cd16fe3e0263939ceb0a865fa  gcc/in
*** 6675,6681 ****
  8a34b6abb2591b8c30c7fb4187261ee3  gcc/intl.cc
  22c5866f6858fea288e5e2f1adc96e40  gcc/intl.h
  920db3effdd509146b3f00be906c0885  gcc/ipa-comdats.cc
! f3503fa1b8a6d51797e3b2a5a61f6a24  gcc/ipa-cp.cc
  0f1e7b6760c2459ae3d8d6b55d4020cc  gcc/ipa-cp.h
  810da40373a77e8f3282ac7a81d25408  gcc/ipa-devirt.cc
  ae1e2041798741a74dbd720bfa8af4c5  gcc/ipa-fnsummary.cc
--- 6675,6681 ----
  8a34b6abb2591b8c30c7fb4187261ee3  gcc/intl.cc
  22c5866f6858fea288e5e2f1adc96e40  gcc/intl.h
  920db3effdd509146b3f00be906c0885  gcc/ipa-comdats.cc
! 2acfbe50dd7b74fc78cc6957afb870ba  gcc/ipa-cp.cc
  0f1e7b6760c2459ae3d8d6b55d4020cc  gcc/ipa-cp.h
  810da40373a77e8f3282ac7a81d25408  gcc/ipa-devirt.cc
  ae1e2041798741a74dbd720bfa8af4c5  gcc/ipa-fnsummary.cc
*************** ba9e8a0870296fd0192e3595d9f582ef  gcc/ip
*** 6689,6695 ****
  22ead4e90306fe7616ffa86a26f913c8  gcc/ipa-inline-transform.cc
  2f02dd416750a80f367ba00a48a769cb  gcc/ipa-inline.cc
  4be9c78f2544b781ae0f89b60cd3dee0  gcc/ipa-inline.h
! 81ac9269ca4538a6d699c9371d6bd5b0  gcc/ipa-locality-cloning.cc
  e1e331896b86db8a2281657bbb21ac72  gcc/ipa-locality-cloning.h
  4d6a8cf9b93ae2035da4279c028c0746  gcc/ipa-modref-tree.cc
  c546dc75ec27388fb7fe834c0aabd230  gcc/ipa-modref-tree.h
--- 6689,6695 ----
  22ead4e90306fe7616ffa86a26f913c8  gcc/ipa-inline-transform.cc
  2f02dd416750a80f367ba00a48a769cb  gcc/ipa-inline.cc
  4be9c78f2544b781ae0f89b60cd3dee0  gcc/ipa-inline.h
! 80b67405b84b45135ccd085ead5a18f9  gcc/ipa-locality-cloning.cc
  e1e331896b86db8a2281657bbb21ac72  gcc/ipa-locality-cloning.h
  4d6a8cf9b93ae2035da4279c028c0746  gcc/ipa-modref-tree.cc
  c546dc75ec27388fb7fe834c0aabd230  gcc/ipa-modref-tree.h
*************** c6ab645f373e1d6e9ddd212bfc3a95ba  gcc/lo
*** 6857,6863 ****
  d49cf408f9415ef037523414c6e80764  gcc/lower-subreg.h
  841cfef931adce1d98b9755eb3231569  gcc/lra-assigns.cc
  5d1aa184ea3e3c5990e02acbdc762f00  gcc/lra-coalesce.cc
! e808789bc71f43106b5ac3944853d6b8  gcc/lra-constraints.cc
  2f34a2e53204408e2578f69fb831b0ac  gcc/lra-eliminations.cc
  ed7c49918557e8e7d34488711171abef  gcc/lra-int.h
  57ce9967bab48c81b11b698d319f4d8d  gcc/lra-lives.cc
--- 6857,6863 ----
  d49cf408f9415ef037523414c6e80764  gcc/lower-subreg.h
  841cfef931adce1d98b9755eb3231569  gcc/lra-assigns.cc
  5d1aa184ea3e3c5990e02acbdc762f00  gcc/lra-coalesce.cc
! d675528fcffbd98a4460cc45449726cf  gcc/lra-constraints.cc
  2f34a2e53204408e2578f69fb831b0ac  gcc/lra-eliminations.cc
  ed7c49918557e8e7d34488711171abef  gcc/lra-int.h
  57ce9967bab48c81b11b698d319f4d8d  gcc/lra-lives.cc
*************** a7e9e00378501c6078d977c5ea3fabb3  gcc/lt
*** 6879,6886 ****
  6c99c98c397a53a6a56da792d20092b0  gcc/lto-streamer.cc
  2d378e58ffe32f0e50ca9de25f61ef5f  gcc/lto-streamer.h
  edfadb86beca8d7718985357731a9913  gcc/lto-wrapper.cc
! 055dda05f6f52d354ea1611a7cc47374  gcc/lto/ChangeLog
! 9760854779553bb13e454a3fbaea9c63  gcc/lto/Make-lang.in
  107bbf87618e39ff03662c0cd52a3f35  gcc/lto/common.cc
  eb5f3398fbf5d50b50c315e2d5891e25  gcc/lto/common.h
  7cfda51bb74b97d30a44070bb3888da7  gcc/lto/config-lang.in
--- 6879,6886 ----
  6c99c98c397a53a6a56da792d20092b0  gcc/lto-streamer.cc
  2d378e58ffe32f0e50ca9de25f61ef5f  gcc/lto-streamer.h
  edfadb86beca8d7718985357731a9913  gcc/lto-wrapper.cc
! 918dfb507529c0b213368ea7cb1e8c68  gcc/lto/ChangeLog
! 40cfa2a569d1e297bea4259ae0b106cb  gcc/lto/Make-lang.in
  107bbf87618e39ff03662c0cd52a3f35  gcc/lto/common.cc
  eb5f3398fbf5d50b50c315e2d5891e25  gcc/lto/common.h
  7cfda51bb74b97d30a44070bb3888da7  gcc/lto/config-lang.in
*************** f9608e9005487c369e6c38949ab36fa1  gcc/m2
*** 7878,7884 ****
  2a18164ee5f162ac117e6fedb58158a2  gcc/machmode.def
  0c9209452a934f189aa0860038b3a65c  gcc/machmode.h
  197298337dae14fdd7ab928a1f03bec6  gcc/main.cc
! 81aa55272f2775dcad2400173c81f124  gcc/match.pd
  b106a08a1793a5495dd87c412456484b  gcc/mcf.cc
  897c541ca992e145ad451c98941c7647  gcc/mem-stats-traits.h
  4f86eeea7af520ce0b773c1f2e34b5b4  gcc/mem-stats.h
--- 7878,7884 ----
  2a18164ee5f162ac117e6fedb58158a2  gcc/machmode.def
  0c9209452a934f189aa0860038b3a65c  gcc/machmode.h
  197298337dae14fdd7ab928a1f03bec6  gcc/main.cc
! 3a581d95d554a73a9dbd3fc292e06f1f  gcc/match.pd
  b106a08a1793a5495dd87c412456484b  gcc/mcf.cc
  897c541ca992e145ad451c98941c7647  gcc/mem-stats-traits.h
  4f86eeea7af520ce0b773c1f2e34b5b4  gcc/mem-stats.h
*************** b2f9b18f946c2e60e4f6cba0ab2df54e  gcc/pe
*** 7981,7987 ****
  51380e9db88b682bc96a35cc4bce56a5  gcc/plugin.cc
  af6268dd53154434eb4c4d1c299e0ee2  gcc/plugin.def
  5678cfbc9cf98f9e69bee1118c787a42  gcc/plugin.h
! f3a33f13b8450859c119f3027a91c3a4  gcc/po/ChangeLog
  2c2fbc71d2acc1ddfb9fb9501458921b  gcc/po/EXCLUDES
  c5974911369d0bad48f42329deee1913  gcc/po/be.po
  aeca8daf3d86bb6aa6ec3a32dc4288d4  gcc/po/da.po
--- 7981,7987 ----
  51380e9db88b682bc96a35cc4bce56a5  gcc/plugin.cc
  af6268dd53154434eb4c4d1c299e0ee2  gcc/plugin.def
  5678cfbc9cf98f9e69bee1118c787a42  gcc/plugin.h
! 99405e61cc7dec102587eae314dfaf6c  gcc/po/ChangeLog
  2c2fbc71d2acc1ddfb9fb9501458921b  gcc/po/EXCLUDES
  c5974911369d0bad48f42329deee1913  gcc/po/be.po
  aeca8daf3d86bb6aa6ec3a32dc4288d4  gcc/po/da.po
*************** dc277593fd4c3a5d8d90ca924d1f1e94  gcc/po
*** 7990,7996 ****
  2e0cf84e6ba491d1d694d3e1a5fd2250  gcc/po/es.po
  7a6d51f7527e21e20156259c98cac705  gcc/po/exgettext
  d87f34867b0a2975834dea38388f14ae  gcc/po/fi.po
! 31ada25c812dfe9e0ec5fdb54bf0a60a  gcc/po/fr.po
  4005c79864e5581593af05986c2fe32e  gcc/po/gcc.pot
  8c42df098218b77ac270c663ec1f779f  gcc/po/hr.po
  2ac2e5d625f381b33be26ad7a999fdbb  gcc/po/id.po
--- 7990,7996 ----
  2e0cf84e6ba491d1d694d3e1a5fd2250  gcc/po/es.po
  7a6d51f7527e21e20156259c98cac705  gcc/po/exgettext
  d87f34867b0a2975834dea38388f14ae  gcc/po/fi.po
! 3457aaf91f80b623a34b35d450fa3f26  gcc/po/fr.po
  4005c79864e5581593af05986c2fe32e  gcc/po/gcc.pot
  8c42df098218b77ac270c663ec1f779f  gcc/po/hr.po
  2ac2e5d625f381b33be26ad7a999fdbb  gcc/po/id.po
*************** d87f34867b0a2975834dea38388f14ae  gcc/po
*** 7999,8005 ****
  465c33e277c596f7da7c98986f3c9d71  gcc/po/nl.po
  129add1a4fc37c5acffdb868128eaab8  gcc/po/ru.po
  ba3d9819d0d6d40fcac6530a45c338ee  gcc/po/sr.po
! aa98fe791143fc5ecaa41d3f669c4532  gcc/po/sv.po
  68206d7ec30d4dcbdd0157fc54ffa432  gcc/po/tr.po
  7908faec83e4ae8c0b1f3ac8aeec183d  gcc/po/uk.po
  6304893b915690328bf19fb051ca8859  gcc/po/vi.po
--- 7999,8005 ----
  465c33e277c596f7da7c98986f3c9d71  gcc/po/nl.po
  129add1a4fc37c5acffdb868128eaab8  gcc/po/ru.po
  ba3d9819d0d6d40fcac6530a45c338ee  gcc/po/sr.po
! 4d07ad1ed738a97a06648b69c9af00a4  gcc/po/sv.po
  68206d7ec30d4dcbdd0157fc54ffa432  gcc/po/tr.po
  7908faec83e4ae8c0b1f3ac8aeec183d  gcc/po/uk.po
  6304893b915690328bf19fb051ca8859  gcc/po/vi.po
*************** ff662645190de703b9423727e52d659c  gcc/rt
*** 8111,8137 ****
  92e356710b1aae5aaabc8f47d6977fff  gcc/run-rtl-passes.cc
  f4eae48a3e90b34e88b5789e54f5f29a  gcc/run-rtl-passes.h
  add9bd82fcec23469a4d0f7df03d9589  gcc/rust/CONTRIBUTING.md
! 22b7cd31be6a965f63b54894a51bf715  gcc/rust/ChangeLog
! 22b3673f2e20b00a2fb62a9fa49ec4d3  gcc/rust/Make-lang.in
  f3527e161e6e2827d299c1a928ebe1c6  gcc/rust/README.md
  07b6198fd46568909422706f2d588e20  gcc/rust/ast/rust-ast-builder.cc
  a0bd3c2d503e6f36b2bab03e5ffcf93a  gcc/rust/ast/rust-ast-builder.h
! 0e380089ca61f54428d5ce39a5588ab9  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
  13f7ee0d5b0ae541ac6c8c27a9544024  gcc/rust/ast/rust-ast-formatting.cc
  d27f26e206e8e58bbf206df6c491ad3d  gcc/rust/ast/rust-ast-formatting.h
  1d2023c1d1dbe72ba8448b166577801b  gcc/rust/ast/rust-ast-fragment.cc
  00ca322cecd6a261aaeea375344973b1  gcc/rust/ast/rust-ast-fragment.h
! ab2bc9816882007d0ed1938a39016d6b  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
! bb4749aad17d092877403d23b975afb1  gcc/rust/ast/rust-ast.cc
! 5af193e111748781a38bbf1c617e75cb  gcc/rust/ast/rust-ast.h
  15a29678516152e3a7190d2b2a01a7e5  gcc/rust/ast/rust-builtin-ast-nodes.h
  a80235d705e48446e91e5fc731dbcfff  gcc/rust/ast/rust-collect-lang-items.cc
  577a3197010f4f13c724c6aee258c07f  gcc/rust/ast/rust-collect-lang-items.h
--- 8111,8137 ----
  92e356710b1aae5aaabc8f47d6977fff  gcc/run-rtl-passes.cc
  f4eae48a3e90b34e88b5789e54f5f29a  gcc/run-rtl-passes.h
  add9bd82fcec23469a4d0f7df03d9589  gcc/rust/CONTRIBUTING.md
! cb16c1cc36e87154ab7a3fb47aebc741  gcc/rust/ChangeLog
! 4cb08c0598632f64092f95178e44027d  gcc/rust/Make-lang.in
  f3527e161e6e2827d299c1a928ebe1c6  gcc/rust/README.md
  07b6198fd46568909422706f2d588e20  gcc/rust/ast/rust-ast-builder.cc
  a0bd3c2d503e6f36b2bab03e5ffcf93a  gcc/rust/ast/rust-ast-builder.h
! 84d0c1dea6f1f965ad02f8ea1221c3c6  gcc/rust/ast/rust-ast-collector.cc
! 657d9819095883ec8defc478f5d41240  gcc/rust/ast/rust-ast-collector.h
! 98b8c7bc7c7460959df0b63f43d595ee  gcc/rust/ast/rust-ast-dump.cc
! a3c39938de79362236289dd94cc979bb  gcc/rust/ast/rust-ast-dump.h
  13f7ee0d5b0ae541ac6c8c27a9544024  gcc/rust/ast/rust-ast-formatting.cc
  d27f26e206e8e58bbf206df6c491ad3d  gcc/rust/ast/rust-ast-formatting.h
  1d2023c1d1dbe72ba8448b166577801b  gcc/rust/ast/rust-ast-fragment.cc
  00ca322cecd6a261aaeea375344973b1  gcc/rust/ast/rust-ast-fragment.h
! 32dab6726a6ca48d3e2ce3c2cf860337  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
! 95a16e3a2ee5b517e890399efb6e9a72  gcc/rust/ast/rust-ast-visitor.cc
! a3f7fbd2c74829840baaac377177c304  gcc/rust/ast/rust-ast-visitor.h
! 84f70742625e3bf65e78f6d82b4ac81b  gcc/rust/ast/rust-ast.cc
! a9c5e303f0b0a456c0a70fb6e523c530  gcc/rust/ast/rust-ast.h
  15a29678516152e3a7190d2b2a01a7e5  gcc/rust/ast/rust-builtin-ast-nodes.h
  a80235d705e48446e91e5fc731dbcfff  gcc/rust/ast/rust-collect-lang-items.cc
  577a3197010f4f13c724c6aee258c07f  gcc/rust/ast/rust-collect-lang-items.h
*************** e6c47c7d5c58b601dbebb5a0bd1b263a  gcc/ru
*** 8146,8162 ****
  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
  839a61e117537a2fad6ca5d2ee60329d  gcc/rust/ast/rust-fmt.h
  4145763ab5ba16ebf694d06248d0fea6  gcc/rust/ast/rust-item.h
! b69c9c1df1b94fab52816c6035f9429c  gcc/rust/ast/rust-macro.h
  8dd1e4ff4335af00648884bddbb8459e  gcc/rust/ast/rust-path.cc
! ba139842e30a2cd9170206914be5eb5f  gcc/rust/ast/rust-path.h
! fb67789176fe1c0c798f70f6ba3d4d1a  gcc/rust/ast/rust-pattern.cc
! 443f2a1f85a4064d7b6d178cfe0a0a65  gcc/rust/ast/rust-pattern.h
  96b0d295ecceb5ea1c9f86b4d922834a  gcc/rust/ast/rust-stmt.h
  31891c319a6cd4db94f7cde8416e3c91  gcc/rust/ast/rust-type.h
  39774c8ec83393047e843c9b8dff6822  gcc/rust/backend/rust-builtins.cc
--- 8146,8162 ----
  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
! 7bff6fc0bda37a91d72be283425de026  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
  839a61e117537a2fad6ca5d2ee60329d  gcc/rust/ast/rust-fmt.h
  4145763ab5ba16ebf694d06248d0fea6  gcc/rust/ast/rust-item.h
! 1b4a6ec192a470e32bdad6fb49f514b6  gcc/rust/ast/rust-macro.h
  8dd1e4ff4335af00648884bddbb8459e  gcc/rust/ast/rust-path.cc
! d66fe903279a3ccbfb7b78a4f53dbeea  gcc/rust/ast/rust-path.h
! 4656ab8ed62a44eb57c9458e4b2d0c87  gcc/rust/ast/rust-pattern.cc
! e84ec0880b45e2e86d61f0d36c314317  gcc/rust/ast/rust-pattern.h
  96b0d295ecceb5ea1c9f86b4d922834a  gcc/rust/ast/rust-stmt.h
  31891c319a6cd4db94f7cde8416e3c91  gcc/rust/ast/rust-type.h
  39774c8ec83393047e843c9b8dff6822  gcc/rust/backend/rust-builtins.cc
*************** d2787752d55665c5f6a670bcb3949817  gcc/ru
*** 8176,8182 ****
  8c98ceabcde4b8a1cc6e31c5186c9656  gcc/rust/backend/rust-compile-fnparam.h
  e8f37f90f4aabb105acbd800783403ba  gcc/rust/backend/rust-compile-implitem.cc
  be9ce3db6b795d9db2585b15e17f476d  gcc/rust/backend/rust-compile-implitem.h
! 89a46194ac8b4c2f2f2eb7c998a7fbf8  gcc/rust/backend/rust-compile-intrinsic.cc
  a1fb8689400958af8126ae9c477c873e  gcc/rust/backend/rust-compile-intrinsic.h
  169ee3d882699b8f9affd6e7bd5296e2  gcc/rust/backend/rust-compile-item.cc
  4faa4d3dc0f5fd3cfd2981a8f06308e4  gcc/rust/backend/rust-compile-item.h
--- 8176,8182 ----
  8c98ceabcde4b8a1cc6e31c5186c9656  gcc/rust/backend/rust-compile-fnparam.h
  e8f37f90f4aabb105acbd800783403ba  gcc/rust/backend/rust-compile-implitem.cc
  be9ce3db6b795d9db2585b15e17f476d  gcc/rust/backend/rust-compile-implitem.h
! 75f18048b8294b7088057f510613b052  gcc/rust/backend/rust-compile-intrinsic.cc
  a1fb8689400958af8126ae9c477c873e  gcc/rust/backend/rust-compile-intrinsic.h
  169ee3d882699b8f9affd6e7bd5296e2  gcc/rust/backend/rust-compile-item.cc
  4faa4d3dc0f5fd3cfd2981a8f06308e4  gcc/rust/backend/rust-compile-item.h
*************** ce6124f6342485eba9fc0c1525c93d1a  gcc/ru
*** 8196,8201 ****
--- 8196,8203 ----
  a9a83e514f16f22fdc6e72fcb2e37a14  gcc/rust/backend/rust-compile.h
  53b4d6a019435dade0320636db64f287  gcc/rust/backend/rust-constexpr.cc
  8b7d1489d3387b799f0272f52df62581  gcc/rust/backend/rust-constexpr.h
+ 4df37e80898a83dcd00e6b69109fe2ef  gcc/rust/backend/rust-intrinsic-handlers.cc
+ 31dd83f89567432eb4c3b515cb0f8748  gcc/rust/backend/rust-intrinsic-handlers.h
  fe6f5539b06a5b2b5c8179da42f9cd0d  gcc/rust/backend/rust-mangle-legacy.cc
  3ff8e3c97c56af610fb789104c385560  gcc/rust/backend/rust-mangle-v0.cc
  3f96bdbc9eba300857511ae861409693  gcc/rust/backend/rust-mangle.cc
*************** a014a6064257ab9fbde59b5445c6c81d  gcc/ru
*** 8284,8297 ****
  48961f264cd3fbeeb72a6691fc80d102  gcc/rust/checks/errors/feature/contrib/.gitignore
  8f285501a6ae2de4a79d5ce3e32c0c8f  gcc/rust/checks/errors/feature/contrib/Makefile
  49ef343f479413ef88d9bc815792aac3  gcc/rust/checks/errors/feature/contrib/README
! c9c06fa597a0b2b1ec0dda42fa4ad8ed  gcc/rust/checks/errors/feature/contrib/copyright-stub.h
! 817beb941fc50a31eaa3aabb2bb638c4  gcc/rust/checks/errors/feature/contrib/fetch
  e7ffba1a910ae682f0f9a4bec0695334  gcc/rust/checks/errors/feature/contrib/parse.y
  ffd785acdfbb1eba43f3b1cb6828c17c  gcc/rust/checks/errors/feature/contrib/regen
  9f41bf8158b1874ab4e2e12fb9469a03  gcc/rust/checks/errors/feature/contrib/scan.l
! 58a1786e43f18b14985085c0ae99b17b  gcc/rust/checks/errors/feature/rust-feature-defs.h
! 3f40686111186c4fa203d9d9e990905a  gcc/rust/checks/errors/feature/rust-feature-gate.cc
! 6ca350d87a519c23b50c3376115027d1  gcc/rust/checks/errors/feature/rust-feature-gate.h
  7d710333b381f61c295f5173f198fb92  gcc/rust/checks/errors/feature/rust-feature.cc
  19948fcb207a9348ff98d7b997afbdd6  gcc/rust/checks/errors/feature/rust-feature.h
  11a7afddbf687c5618769c08d87017d5  gcc/rust/checks/errors/privacy/rust-privacy-check.cc
--- 8286,8304 ----
  48961f264cd3fbeeb72a6691fc80d102  gcc/rust/checks/errors/feature/contrib/.gitignore
  8f285501a6ae2de4a79d5ce3e32c0c8f  gcc/rust/checks/errors/feature/contrib/Makefile
  49ef343f479413ef88d9bc815792aac3  gcc/rust/checks/errors/feature/contrib/README
! 3db03e458f3c55cb8e89db246fab3e5e  gcc/rust/checks/errors/feature/contrib/copyright-stub.h
! d0009b7082670309fdadc0ecbbdf0d35  gcc/rust/checks/errors/feature/contrib/fetch
  e7ffba1a910ae682f0f9a4bec0695334  gcc/rust/checks/errors/feature/contrib/parse.y
  ffd785acdfbb1eba43f3b1cb6828c17c  gcc/rust/checks/errors/feature/contrib/regen
  9f41bf8158b1874ab4e2e12fb9469a03  gcc/rust/checks/errors/feature/contrib/scan.l
! 85305daa7e42cd43aaebe9a566869724  gcc/rust/checks/errors/feature/rust-feature-collector.cc
! bbab9ad0ba3bffd8f8502d2bafaf47cf  gcc/rust/checks/errors/feature/rust-feature-collector.h
! f3e7f9998a5fcd5ef243ba6881006a5c  gcc/rust/checks/errors/feature/rust-feature-defs-rfl.h
! 563d237ceb9c4fea2076fb3150468741  gcc/rust/checks/errors/feature/rust-feature-defs.h
! 11a740e0963abbe4ea0482008daad918  gcc/rust/checks/errors/feature/rust-feature-gate.cc
! 7cd107c3fb315cf2a721548849be0345  gcc/rust/checks/errors/feature/rust-feature-gate.h
! e227787587d4567c45f9966f8b82db7b  gcc/rust/checks/errors/feature/rust-feature-store.cc
! 2947cb614792b8cb8d655e3661870770  gcc/rust/checks/errors/feature/rust-feature-store.h
  7d710333b381f61c295f5173f198fb92  gcc/rust/checks/errors/feature/rust-feature.cc
  19948fcb207a9348ff98d7b997afbdd6  gcc/rust/checks/errors/feature/rust-feature.h
  11a7afddbf687c5618769c08d87017d5  gcc/rust/checks/errors/privacy/rust-privacy-check.cc
*************** be414792c53b0c40c68656f99ed4501e  gcc/ru
*** 8315,8327 ****
  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
! 28fb457216ef4322a0ac35e2c735ca21  gcc/rust/checks/errors/rust-unsafe-checker.cc
  5e5e840d1139c1be0f126a2d32d8aaf8  gcc/rust/checks/errors/rust-unsafe-checker.h
  45e1e285d36467b08cc19201db4f6644  gcc/rust/checks/lints/rust-lint-marklive-base.h
  83d993cb383b76a9131ec58996b0abb0  gcc/rust/checks/lints/rust-lint-marklive.cc
  ddda12b4ef89f90ebd869a2cd0dc7665  gcc/rust/checks/lints/rust-lint-marklive.h
! 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
  ba6521a1acc2f2dac3af19cb480e4b2d  gcc/rust/checks/lints/unused/rust-unused-checker.cc
  cb37b95682b2e7ba7b7ee8b8fd38e414  gcc/rust/checks/lints/unused/rust-unused-checker.h
--- 8322,8334 ----
  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
! 853290892ed02b7ba40847de0e701822  gcc/rust/checks/errors/rust-unsafe-checker.cc
  5e5e840d1139c1be0f126a2d32d8aaf8  gcc/rust/checks/errors/rust-unsafe-checker.h
  45e1e285d36467b08cc19201db4f6644  gcc/rust/checks/lints/rust-lint-marklive-base.h
  83d993cb383b76a9131ec58996b0abb0  gcc/rust/checks/lints/rust-lint-marklive.cc
  ddda12b4ef89f90ebd869a2cd0dc7665  gcc/rust/checks/lints/rust-lint-marklive.h
! 39d2087b62541ef24b107e4edf79b300  gcc/rust/checks/lints/rust-lint-scan-deadcode.h
! d03052efded34394a85b3e891c267781  gcc/rust/checks/lints/rust-lint-unused-var.cc
  56160d4d1424a0469b62ce3dc9ef7886  gcc/rust/checks/lints/rust-lint-unused-var.h
  ba6521a1acc2f2dac3af19cb480e4b2d  gcc/rust/checks/lints/unused/rust-unused-checker.cc
  cb37b95682b2e7ba7b7ee8b8fd38e414  gcc/rust/checks/lints/unused/rust-unused-checker.h
*************** bd02f07bc0449d5332cbe841ea6407f2  gcc/ru
*** 8330,8340 ****
  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
  4e8b13587555bf85dfdd0139cf368a0d  gcc/rust/expand/rust-derive-clone.cc
  79d1eb8e6eeece040b532c2494bd883f  gcc/rust/expand/rust-derive-clone.h
! 39ac71229a99744a46a68e08aeb0d4b3  gcc/rust/expand/rust-derive-cmp-common.cc
  4b7fb9e918c46089138585e7ff1d3ea9  gcc/rust/expand/rust-derive-cmp-common.h
  194112b3b59406fff12117f44bec75bb  gcc/rust/expand/rust-derive-copy.cc
  ee38f5f050e08826f6afcf77620cc1b8  gcc/rust/expand/rust-derive-copy.h
--- 8337,8347 ----
  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
! dc9de059c86eeb41384ccbbdf90c8ccc  gcc/rust/expand/rust-cfg-strip.cc
! 91b9c52da52e84509eead7c6bcf889c4  gcc/rust/expand/rust-cfg-strip.h
  4e8b13587555bf85dfdd0139cf368a0d  gcc/rust/expand/rust-derive-clone.cc
  79d1eb8e6eeece040b532c2494bd883f  gcc/rust/expand/rust-derive-clone.h
! ba378a704dc2dea3fe9e7dac471add1d  gcc/rust/expand/rust-derive-cmp-common.cc
  4b7fb9e918c46089138585e7ff1d3ea9  gcc/rust/expand/rust-derive-cmp-common.h
  194112b3b59406fff12117f44bec75bb  gcc/rust/expand/rust-derive-copy.cc
  ee38f5f050e08826f6afcf77620cc1b8  gcc/rust/expand/rust-derive-copy.h
*************** db60887b189ef8dd1131d50e5a95ea80  gcc/ru
*** 8350,8357 ****
  5a97bde45bf1009c7ef5c600544b55ee  gcc/rust/expand/rust-derive-ord.h
  b9d81791a655aa0e8365eb6f1f40e6dd  gcc/rust/expand/rust-derive-partial-eq.cc
  f8d9ae32b9fb0c892b90ca30e3f100b6  gcc/rust/expand/rust-derive-partial-eq.h
! 92b10face39a6fc550abc716b625f98d  gcc/rust/expand/rust-derive.cc
! 7be7c594958b035f4b5036cbcb2599b8  gcc/rust/expand/rust-derive.h
  caff0b7b7e1a0fb05ef4f8575614fb41  gcc/rust/expand/rust-expand-format-args.cc
  32cdbc32d6a40f91930b408f13f78df8  gcc/rust/expand/rust-expand-format-args.h
  e589668d31f505ae29a9d4c2c3ab9bb8  gcc/rust/expand/rust-expand-visitor.cc
--- 8357,8366 ----
  5a97bde45bf1009c7ef5c600544b55ee  gcc/rust/expand/rust-derive-ord.h
  b9d81791a655aa0e8365eb6f1f40e6dd  gcc/rust/expand/rust-derive-partial-eq.cc
  f8d9ae32b9fb0c892b90ca30e3f100b6  gcc/rust/expand/rust-derive-partial-eq.h
! 338153a09e9c1f7d81ba87f49c77ebe2  gcc/rust/expand/rust-derive.cc
! 8b320c6af6f2aa082bb9c9b1bb3915fd  gcc/rust/expand/rust-derive.h
! 5d0d51ca0585103d826f01c4a63b8d56  gcc/rust/expand/rust-early-cfg-strip.cc
! ee3e9df287e242b2780da2661e9d3358  gcc/rust/expand/rust-early-cfg-strip.h
  caff0b7b7e1a0fb05ef4f8575614fb41  gcc/rust/expand/rust-expand-format-args.cc
  32cdbc32d6a40f91930b408f13f78df8  gcc/rust/expand/rust-expand-format-args.h
  e589668d31f505ae29a9d4c2c3ab9bb8  gcc/rust/expand/rust-expand-visitor.cc
*************** c043b006c21e87f8b82ba1334addb1af  gcc/ru
*** 8380,8387 ****
  9568c3923de491cd646cd621c423458a  gcc/rust/expand/rust-proc-macro.h
  fc268c6c7778ed7ae6989f7f0d879bdc  gcc/rust/expand/rust-token-tree-desugar.cc
  7320c7b564a470f189050f3109db3d38  gcc/rust/expand/rust-token-tree-desugar.h
! a0c671745a0452dc6c2af541125edfd1  gcc/rust/hir/rust-ast-lower-base.cc
! 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
  288088a4374abaea8149e6c3d116b2e4  gcc/rust/hir/rust-ast-lower-expr.cc
--- 8389,8396 ----
  9568c3923de491cd646cd621c423458a  gcc/rust/expand/rust-proc-macro.h
  fc268c6c7778ed7ae6989f7f0d879bdc  gcc/rust/expand/rust-token-tree-desugar.cc
  7320c7b564a470f189050f3109db3d38  gcc/rust/expand/rust-token-tree-desugar.h
! d9df53a89460b6ddf6e22c739cdf3c2a  gcc/rust/hir/rust-ast-lower-base.cc
! b39fa054cc1779fe6107cd9926e1a92a  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
  288088a4374abaea8149e6c3d116b2e4  gcc/rust/hir/rust-ast-lower-expr.cc
*************** ec54250775efe40c60973c75aa15aa8c  gcc/ru
*** 8438,8444 ****
  d07a3a5f5b9d7004ca327b9c691c2427  gcc/rust/hir/tree/rust-hir.cc
  740a251c7a11b6b3d56b5a01f9912174  gcc/rust/hir/tree/rust-hir.h
  f357dcf5713381e22c7036dfc40716f1  gcc/rust/lang-specs.h
! 18a3272e7898441ff4f8449bc43803e1  gcc/rust/lang.opt
  a11b51758cadbfbc20e4c2969af1aa85  gcc/rust/lang.opt.urls
  37d2c9999aa0dbb0df068a1ae29137fa  gcc/rust/lex/rust-input-source.h
  3bc6c2164a4aea3855a20e109037ca69  gcc/rust/lex/rust-lex.cc
--- 8447,8453 ----
  d07a3a5f5b9d7004ca327b9c691c2427  gcc/rust/hir/tree/rust-hir.cc
  740a251c7a11b6b3d56b5a01f9912174  gcc/rust/hir/tree/rust-hir.h
  f357dcf5713381e22c7036dfc40716f1  gcc/rust/lang-specs.h
! a592256ae3a29b72f13dc4c89e94ae71  gcc/rust/lang.opt
  a11b51758cadbfbc20e4c2969af1aa85  gcc/rust/lang.opt.urls
  37d2c9999aa0dbb0df068a1ae29137fa  gcc/rust/lex/rust-input-source.h
  3bc6c2164a4aea3855a20e109037ca69  gcc/rust/lex/rust-lex.cc
*************** fe40f8618a9f5a5f007bc1a81fe45d3a  gcc/ru
*** 8455,8462 ****
  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
  5cb1a11e82fe180d5382b22d4ea856f6  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
--- 8464,8471 ----
  659356fda258855d3d26c1eff1e24215  gcc/rust/metadata/rust-imports.h
  28dcb6b3b1ae5727b2fc184e9b1b6af1  gcc/rust/parse/rust-cfg-parser.cc
  dcbc600defe89f418c72fb56de980c97  gcc/rust/parse/rust-cfg-parser.h
! 3883e0105a1a6129a0f9c6847420944c  gcc/rust/parse/rust-parse-error.h
! 07654a34429180f34bce6c7937e70a91  gcc/rust/parse/rust-parse-impl-attribute.hxx
  5cb1a11e82fe180d5382b22d4ea856f6  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
*************** d62839a7e1b61c00aa41b146304cd729  gcc/ru
*** 8465,8479 ****
  3535076fa8d48befa963fce350256f23  gcc/rust/parse/rust-parse-impl-pattern.hxx
  ebc262f7414d034296b72ab859fdc482  gcc/rust/parse/rust-parse-impl-ttree.hxx
  c29fa936687b478a9889f3380ee0df68  gcc/rust/parse/rust-parse-impl-utils.hxx
! 72c9a2e5aa9b7aa1230bfaab360cee62  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
! e0f74e5ebe67d7226603e6bfb22aedd1  gcc/rust/resolve/rust-default-resolver.cc
! 78f4e66ab101849c94b73d6c79773c15  gcc/rust/resolve/rust-default-resolver.h
! 09ac07f490049ebc84294fd0656bed1f  gcc/rust/resolve/rust-early-name-resolver-2.0.cc
! fc0abd50175cbce9ceb647ef3334c0e4  gcc/rust/resolve/rust-early-name-resolver-2.0.h
  85e5adbc06c6ca71160f15e21f150676  gcc/rust/resolve/rust-finalize-imports-2.0.cc
  e35421f45738cdcd47be3ec6730e42ef  gcc/rust/resolve/rust-finalize-imports-2.0.h
  8a259cbd5ed5a4471451f6fedf12e7c8  gcc/rust/resolve/rust-forever-stack.cc
--- 8474,8488 ----
  3535076fa8d48befa963fce350256f23  gcc/rust/parse/rust-parse-impl-pattern.hxx
  ebc262f7414d034296b72ab859fdc482  gcc/rust/parse/rust-parse-impl-ttree.hxx
  c29fa936687b478a9889f3380ee0df68  gcc/rust/parse/rust-parse-impl-utils.hxx
! ab36efaea597de35bea1d3e4271854d5  gcc/rust/parse/rust-parse-impl.hxx
  8188f5994da36c8911bcd5425a5ff10d  gcc/rust/parse/rust-parse-utils.h
  d60ac257492f0b2d13c8c305707dd04a  gcc/rust/parse/rust-parse.cc
! 69616c6c1964f75a1e0d558631c0ee27  gcc/rust/parse/rust-parse.h
  2f3ffa4e5b28a059fadd881c085fd620  gcc/rust/resolve/rust-ast-resolve.h
! 7bbf4878ffef5aca403c3c2d662b02e5  gcc/rust/resolve/rust-default-resolver.cc
! b7996557d00b477e5b56587a0f238cd4  gcc/rust/resolve/rust-default-resolver.h
! 5dcd8b077dba9ba29e31c56378b5887e  gcc/rust/resolve/rust-early-name-resolver-2.0.cc
! 6a88c1b7c1fd4ddc4b28ff2c43c0b5bd  gcc/rust/resolve/rust-early-name-resolver-2.0.h
  85e5adbc06c6ca71160f15e21f150676  gcc/rust/resolve/rust-finalize-imports-2.0.cc
  e35421f45738cdcd47be3ec6730e42ef  gcc/rust/resolve/rust-finalize-imports-2.0.h
  8a259cbd5ed5a4471451f6fedf12e7c8  gcc/rust/resolve/rust-forever-stack.cc
*************** a756853116b3325b286f3bd09e0cd537  gcc/ru
*** 8493,8499 ****
  9f7080d5a5a44fbb1d53e8db861f55d6  gcc/rust/resolve/rust-resolve-builtins.h
  f0ecfa8102b52040dd8aa3421fec33bf  gcc/rust/resolve/rust-rib.cc
  6d6d5eff194daa39d1f0a1ba704ee2e8  gcc/rust/resolve/rust-rib.h
! 306822fcefbadbede67889f9fb301c31  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
--- 8502,8508 ----
  9f7080d5a5a44fbb1d53e8db861f55d6  gcc/rust/resolve/rust-resolve-builtins.h
  f0ecfa8102b52040dd8aa3421fec33bf  gcc/rust/resolve/rust-rib.cc
  6d6d5eff194daa39d1f0a1ba704ee2e8  gcc/rust/resolve/rust-rib.h
! 4c24d464f7ca4c12d3b229a710b30c61  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
*************** dea40ce7b58a49100e39505b88e263f3  gcc/ru
*** 8502,8516 ****
  8d2200eb879c079a79e9f591ca35a0fd  gcc/rust/rust-error-codes.def
  034dcc2c4a9a5399e81c68e9d81ff1f5  gcc/rust/rust-gcc.cc
  c12b204f1861d78fad8a5d5a25dcdf02  gcc/rust/rust-gcc.h
! 0c04944a6d8c03a4f2594fe2587ee07d  gcc/rust/rust-lang.cc
  4aea929c2962c713b9ea3fbf167ddd43  gcc/rust/rust-linemap.cc
  a7f99c3f3c88cf0a588f4ef4d69193e7  gcc/rust/rust-linemap.h
  aabb2405ea0a5e6eebbde91d56262af9  gcc/rust/rust-location.h
  4ed3043615b8b15ebf0a975ae7e7964f  gcc/rust/rust-object-export.cc
  5ffc502f49b1fc8d440b5aecd8319051  gcc/rust/rust-object-export.h
! 446aaa0f613e3ba3becbdf9a9c67909c  gcc/rust/rust-session-manager.cc
! f219d9d3307a119525551b6681a74b80  gcc/rust/rust-session-manager.h
! 0762084d9b3bcaa73219abcf7cc78ff8  gcc/rust/rust-system.h
  600dca9d737e69cf4546974e563a25ab  gcc/rust/rust-target-def.h
  9feaaf76d12ee651cd59309787cbd52f  gcc/rust/rust-target.def
  3f4bb199e04d4f4b918382ee52934a16  gcc/rust/rust-target.h
--- 8511,8525 ----
  8d2200eb879c079a79e9f591ca35a0fd  gcc/rust/rust-error-codes.def
  034dcc2c4a9a5399e81c68e9d81ff1f5  gcc/rust/rust-gcc.cc
  c12b204f1861d78fad8a5d5a25dcdf02  gcc/rust/rust-gcc.h
! 98868ac688f022d1ffa0454e4938afa8  gcc/rust/rust-lang.cc
  4aea929c2962c713b9ea3fbf167ddd43  gcc/rust/rust-linemap.cc
  a7f99c3f3c88cf0a588f4ef4d69193e7  gcc/rust/rust-linemap.h
  aabb2405ea0a5e6eebbde91d56262af9  gcc/rust/rust-location.h
  4ed3043615b8b15ebf0a975ae7e7964f  gcc/rust/rust-object-export.cc
  5ffc502f49b1fc8d440b5aecd8319051  gcc/rust/rust-object-export.h
! ff92567b1bb90e220752e2350511ff97  gcc/rust/rust-session-manager.cc
! 8f2aefaf40005ca6aa11d5bdc38386c2  gcc/rust/rust-session-manager.h
! 9c4725bebe01459b9a7d4636afdd1d10  gcc/rust/rust-system.h
  600dca9d737e69cf4546974e563a25ab  gcc/rust/rust-target-def.h
  9feaaf76d12ee651cd59309787cbd52f  gcc/rust/rust-target.def
  3f4bb199e04d4f4b918382ee52934a16  gcc/rust/rust-target.h
*************** eb1bfe030c9849086601bd0822a7e35a  gcc/ru
*** 8580,8592 ****
  5fab4ccaa5f132cbe9ca8f09047732ad  gcc/rust/util/optional.h
  28960566056dffb6dd86b0c3ad60bf39  gcc/rust/util/rust-abi.cc
  a85e112c6426c604dd9a3a9af712e53b  gcc/rust/util/rust-abi.h
! 0072330b0605d9d927000ee09ed94369  gcc/rust/util/rust-attribute-values.h
! a364cfe687cfc0eaeb2f4f7452bf6125  gcc/rust/util/rust-attributes.cc
! 203f3d4a9f7c19a3df5898ea0d4a542b  gcc/rust/util/rust-attributes.h
  f7a4957c1c7c3fc0e851a38ef997ce72  gcc/rust/util/rust-base62.cc
  a674c0d71a00cc704ca2d16c25f4ba3e  gcc/rust/util/rust-base62.h
  89c5d7d5d733b3877924ef2754c681a2  gcc/rust/util/rust-buffered-queue.h
  6ec9871082c2d8513da233d9b00fd897  gcc/rust/util/rust-canonical-path.h
  4b1fe5b8a8e21b47b27a69591e564ce7  gcc/rust/util/rust-codepoint.h
  10f5191f182eef15185afe9d80290e3e  gcc/rust/util/rust-common.h
  5228dcea6db6f53a46c5b2d18530de14  gcc/rust/util/rust-dir-owner.cc
--- 8589,8602 ----
  5fab4ccaa5f132cbe9ca8f09047732ad  gcc/rust/util/optional.h
  28960566056dffb6dd86b0c3ad60bf39  gcc/rust/util/rust-abi.cc
  a85e112c6426c604dd9a3a9af712e53b  gcc/rust/util/rust-abi.h
! b60676c4691e0defba8a6e88f2f1d2cb  gcc/rust/util/rust-attribute-values.h
! e9ac4d5452d4c5bdcea3bd40fcae677a  gcc/rust/util/rust-attributes.cc
! bb2a8b1028b777e6996c19d9a4b1b880  gcc/rust/util/rust-attributes.h
  f7a4957c1c7c3fc0e851a38ef997ce72  gcc/rust/util/rust-base62.cc
  a674c0d71a00cc704ca2d16c25f4ba3e  gcc/rust/util/rust-base62.h
  89c5d7d5d733b3877924ef2754c681a2  gcc/rust/util/rust-buffered-queue.h
  6ec9871082c2d8513da233d9b00fd897  gcc/rust/util/rust-canonical-path.h
+ 0f7f180b9ace5f673dd6184e83872288  gcc/rust/util/rust-cloneable.h
  4b1fe5b8a8e21b47b27a69591e564ce7  gcc/rust/util/rust-codepoint.h
  10f5191f182eef15185afe9d80290e3e  gcc/rust/util/rust-common.h
  5228dcea6db6f53a46c5b2d18530de14  gcc/rust/util/rust-dir-owner.cc
*************** d87ca49f50adda86e874b992b90d3a0e  gcc/ru
*** 8596,8605 ****
  88f7642dab3e02fac387a93aad82300a  gcc/rust/util/rust-edition.h
  6bad0adc3974de844f3be9f38aeccec7  gcc/rust/util/rust-ggc.cc
  ce7d9c9aad32c78c1945878b17715fa7  gcc/rust/util/rust-ggc.h
! 5f567c0b0890a2a4ab5639da6dc4eec3  gcc/rust/util/rust-hir-map.cc
  c35dd404a34bc22dca6de4b7dc641c2f  gcc/rust/util/rust-hir-map.h
  2bf44e898c6773e49f63aa99ea22f2aa  gcc/rust/util/rust-identifier.h
  9da3d0bbd1f3b83f29287582aaadf7fd  gcc/rust/util/rust-inline-visitor.h
  fcb0ef58bd45344a4c08af0945cd41b9  gcc/rust/util/rust-keyword-values.cc
  3c394a316c15589123f05ad6573d7e91  gcc/rust/util/rust-keyword-values.h
  c5af83b641a50076b4401975693d372c  gcc/rust/util/rust-lang-item.cc
--- 8606,8616 ----
  88f7642dab3e02fac387a93aad82300a  gcc/rust/util/rust-edition.h
  6bad0adc3974de844f3be9f38aeccec7  gcc/rust/util/rust-ggc.cc
  ce7d9c9aad32c78c1945878b17715fa7  gcc/rust/util/rust-ggc.h
! c5c34c17479577cc2266c9ea468aac4d  gcc/rust/util/rust-hir-map.cc
  c35dd404a34bc22dca6de4b7dc641c2f  gcc/rust/util/rust-hir-map.h
  2bf44e898c6773e49f63aa99ea22f2aa  gcc/rust/util/rust-identifier.h
  9da3d0bbd1f3b83f29287582aaadf7fd  gcc/rust/util/rust-inline-visitor.h
+ 78843db3283048d5efe9262a3729ae69  gcc/rust/util/rust-intrinsic-values.h
  fcb0ef58bd45344a4c08af0945cd41b9  gcc/rust/util/rust-keyword-values.cc
  3c394a316c15589123f05ad6573d7e91  gcc/rust/util/rust-keyword-values.h
  c5af83b641a50076b4401975693d372c  gcc/rust/util/rust-lang-item.cc
*************** b21c32de4ac41afaa112df92995fbc7b  gcc/ta
*** 8704,8710 ****
  bf20a6542e361b29f15f9f2b47d47e2f  gcc/targhooks.cc
  b1068b0d3d77d5a55802a29a9f8a08d7  gcc/targhooks.h
  f39fcaa8197187283ccfed40107b426d  gcc/testsuite/.gitattributes
! 602df3453981ee004894cc413d1f6fda  gcc/testsuite/ChangeLog
  47e8e29b649ead73b8a1e4797da470ed  gcc/testsuite/ChangeLog-1993-2007
  35198a9e4fd31b935de8789faabf3351  gcc/testsuite/ChangeLog-2008
  0f19934540750356d1b91595cebfd9a8  gcc/testsuite/ChangeLog-2009
--- 8715,8721 ----
  bf20a6542e361b29f15f9f2b47d47e2f  gcc/targhooks.cc
  b1068b0d3d77d5a55802a29a9f8a08d7  gcc/targhooks.h
  f39fcaa8197187283ccfed40107b426d  gcc/testsuite/.gitattributes
! 57d4e684fd20bbdd17ca2ef00503ea8d  gcc/testsuite/ChangeLog
  47e8e29b649ead73b8a1e4797da470ed  gcc/testsuite/ChangeLog-1993-2007
  35198a9e4fd31b935de8789faabf3351  gcc/testsuite/ChangeLog-2008
  0f19934540750356d1b91595cebfd9a8  gcc/testsuite/ChangeLog-2009
*************** d6f3e72d7fc95edbabd5b36d39abf504  gcc/te
*** 19852,19857 ****
--- 19863,19869 ----
  c315375dde6dfd35915ac372415190a8  gcc/testsuite/c-c++-common/gomp/pr120564.c
  5a0fc856eddf5869c1607a51a511b91b  gcc/testsuite/c-c++-common/gomp/pr121452-1.c
  25357ab83549c772c7f308537e5445cf  gcc/testsuite/c-c++-common/gomp/pr121452-2.c
+ e237cffddf611dba2776c6e54f0719b6  gcc/testsuite/c-c++-common/gomp/pr122866.c
  e16ef156ad193ef1f3cba60ad16e57ab  gcc/testsuite/c-c++-common/gomp/pr51360.c
  84c977571aeb43c0224137efe7f5b213  gcc/testsuite/c-c++-common/gomp/pr53580.c
  28bfd873981083756a16f70fdb0b86db  gcc/testsuite/c-c++-common/gomp/pr54017.c
*************** efc9a1ea706c31b0d18f03ed7004c09e  gcc/te
*** 20017,20022 ****
--- 20029,20035 ----
  a6be8d491b81e2bd5a132e54885fb1c2  gcc/testsuite/c-c++-common/gomp/target-map-iterators-2.c
  e87cc72174c798e3391c3b978ab190ca  gcc/testsuite/c-c++-common/gomp/target-map-iterators-3.c
  d290e10563b5dcd9cbe022f9ce9d118d  gcc/testsuite/c-c++-common/gomp/target-map-iterators-4.c
+ 2ac7469e11f49a373777f14d12d0458a  gcc/testsuite/c-c++-common/gomp/target-map-iterators-6.c
  5d53b03c5014dede6e0f732cc32d3856  gcc/testsuite/c-c++-common/gomp/target-teams-1.c
  ecaf3261edcbdf06b45669d051546ad3  gcc/testsuite/c-c++-common/gomp/target-update-1.c
  e807b465f51f25bc3e564cb1576543d7  gcc/testsuite/c-c++-common/gomp/target-update-iterators-1.c
*************** c88701df415b47ac9bf5cba84cf379ab  gcc/te
*** 22338,22344 ****
  a3ef49aa5fa035e0eaa1fb23c589fe61  gcc/testsuite/g++.dg/abi/vthunk2.C
  6881f6a907aed22e3604db9a81d71753  gcc/testsuite/g++.dg/abi/vthunk3.C
  59cdef1c2f5ac26231205b723cb9ea52  gcc/testsuite/g++.dg/abi/vtt1.C
! bbebf12acd88ceeb72fb99bff77e889b  gcc/testsuite/g++.dg/absvect.C
  cb66889e261971e64a6568617bffaeaa  gcc/testsuite/g++.dg/addr_builtin-1.C
  b0eff5995e13fdd20b2e3c2b4b69c48c  gcc/testsuite/g++.dg/alias-checks.C
  e7df9a3155c5c6021ee481fcc76afa2a  gcc/testsuite/g++.dg/analyzer/analyzer.exp
--- 22351,22357 ----
  a3ef49aa5fa035e0eaa1fb23c589fe61  gcc/testsuite/g++.dg/abi/vthunk2.C
  6881f6a907aed22e3604db9a81d71753  gcc/testsuite/g++.dg/abi/vthunk3.C
  59cdef1c2f5ac26231205b723cb9ea52  gcc/testsuite/g++.dg/abi/vtt1.C
! 53e31dbb580c47605f7e76bc6cfd7704  gcc/testsuite/g++.dg/absvect.C
  cb66889e261971e64a6568617bffaeaa  gcc/testsuite/g++.dg/addr_builtin-1.C
  b0eff5995e13fdd20b2e3c2b4b69c48c  gcc/testsuite/g++.dg/alias-checks.C
  e7df9a3155c5c6021ee481fcc76afa2a  gcc/testsuite/g++.dg/analyzer/analyzer.exp
*************** dfa7add3a6946474911a4355e54f6f8f  gcc/te
*** 23618,23623 ****
--- 23631,23637 ----
  c83bc7f20dd1098f97cb408b9b24574d  gcc/testsuite/g++.dg/cpp0x/alignas21.C
  695b3ddd376a0c76e0e8ec1e2a348393  gcc/testsuite/g++.dg/cpp0x/alignas22.C
  c234dc1d677341200a08ebd49b1d3701  gcc/testsuite/g++.dg/cpp0x/alignas23.C
+ 8749775852fe507dae2e8250e8b17995  gcc/testsuite/g++.dg/cpp0x/alignas24.C
  af0c02bf93d49e5385b61d3e59a21e28  gcc/testsuite/g++.dg/cpp0x/alignas3.C
  4e770e3d245d014c238b07e798e03b36  gcc/testsuite/g++.dg/cpp0x/alignas4.C
  2490568ef637fae72e27c31a035040f2  gcc/testsuite/g++.dg/cpp0x/alignas5.C
*************** dd7f53c1057815c9ecba63c7f4408ec4  gcc/te
*** 25583,25588 ****
--- 25597,25603 ----
  4891c13c51126851f62b961486e6f9ef  gcc/testsuite/g++.dg/cpp0x/pr123692.C
  b2f7d7cab4ef6e12f25f82545d59869a  gcc/testsuite/g++.dg/cpp0x/pr123818.C
  9683c3ac21cac97aa0b1ce1d46d85320  gcc/testsuite/g++.dg/cpp0x/pr124173.C
+ 823666b75dc5cb540393daba4df2d5df  gcc/testsuite/g++.dg/cpp0x/pr124489.C
  26dea799d49ce223a0c4130a3c955271  gcc/testsuite/g++.dg/cpp0x/pr31431-2.C
  4d1da29b669bf3178b3987abce4d58b1  gcc/testsuite/g++.dg/cpp0x/pr31431.C
  d65e06a3830e2b511cc25692b94615a1  gcc/testsuite/g++.dg/cpp0x/pr31432.C
*************** d3a5a9df5514968709862976635c8094  gcc/te
*** 27985,27990 ****
--- 28000,28006 ----
  87abca8eb660254fbf201e771eef3751  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda2.C
  15806046d4b84c665a24477e28c66de8  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda20.C
  53a006b53f4f642ce54703dcb0679625  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda21.C
+ 7b0add104f416bde19cf186e35bc773a  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda22.C
  e8adbb443f8b231b244ffbcd64ee7da2  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda3.C
  0a50eb80a181d4196ff68849d37d2615  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda4.C
  cb8eabd8ed2aec8d2d6ba1aa825f9307  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda5.C
*************** f462246786df8652f2409939354d0c38  gcc/te
*** 28167,28172 ****
--- 28183,28190 ----
  f03ab32088d0fea8cefc516352c939d2  gcc/testsuite/g++.dg/cpp26/decomp25.C
  dd3131ab1dbc85f08ebd66eda08bd240  gcc/testsuite/g++.dg/cpp26/decomp26.C
  5bf4ccd33ee7b05990e311ad63e2c51b  gcc/testsuite/g++.dg/cpp26/decomp27.C
+ 068dc2156782fc310d9fc4cd498d213d  gcc/testsuite/g++.dg/cpp26/decomp28.C
+ 75839c098b838f1ccf72394115eaf18b  gcc/testsuite/g++.dg/cpp26/decomp29.C
  04625a49d6c21164c6f7e075e578b4d2  gcc/testsuite/g++.dg/cpp26/decomp3.C
  e0331653ca37862860617d90def1c2d9  gcc/testsuite/g++.dg/cpp26/decomp4.C
  2765a6ddd9be5099086c5f772077d8d1  gcc/testsuite/g++.dg/cpp26/decomp5.C
*************** ed8e374c7099be5062508b2798dc6a58  gcc/te
*** 29272,29277 ****
--- 29290,29296 ----
  c3d9ded980076b7db82a63c086636931  gcc/testsuite/g++.dg/cpp2a/lambda-uneval29.C
  95297857429ac8850dbeb5773639ea6b  gcc/testsuite/g++.dg/cpp2a/lambda-uneval3.C
  56e3e8d11a55552a749cc9a73432a46d  gcc/testsuite/g++.dg/cpp2a/lambda-uneval30.C
+ bac0d859a20303eb8aa06430661ec006  gcc/testsuite/g++.dg/cpp2a/lambda-uneval31.C
  2f7bd1774e5f890e65ee937419a29669  gcc/testsuite/g++.dg/cpp2a/lambda-uneval4.C
  8e6b610dd3dab06841943bfa5f325489  gcc/testsuite/g++.dg/cpp2a/lambda-uneval5.C
  91159fd20af1b89a4545ef0450293574  gcc/testsuite/g++.dg/cpp2a/lambda-uneval6.C
*************** b792de1e3ae7c85a9e3e74862c4efdaf  gcc/te
*** 33541,33546 ****
--- 33560,33569 ----
  cb60536799a89ad1dffce0a15c88b2d7  gcc/testsuite/g++.dg/modules/attrib-2_b.C
  f0e89ff7d2d836ff7ecd36d27bbacb19  gcc/testsuite/g++.dg/modules/attrib-3_a.H
  3c275da25d7ace4b3ea9ba624f120c0c  gcc/testsuite/g++.dg/modules/attrib-3_b.C
+ ecd6c3a264f38780aaccc0d6aa523f56  gcc/testsuite/g++.dg/modules/attrib-4_a.C
+ 0cf3cad1e66043cd2480d39a3d01277f  gcc/testsuite/g++.dg/modules/attrib-4_b.C
+ 7abf5ffc0cac815ea0bffa1a3b478856  gcc/testsuite/g++.dg/modules/attrib-5_a.C
+ 4fe9d03ea9dff9ed0a2c7de2790525ac  gcc/testsuite/g++.dg/modules/attrib-5_b.C
  81c0c5e828fc012cafc9fa3658ffa887  gcc/testsuite/g++.dg/modules/auto-1.h
  663d15531836052d0d8d248d77c1d985  gcc/testsuite/g++.dg/modules/auto-1_a.H
  fc7a9d18c3b934f3bab09c32f19f3b8d  gcc/testsuite/g++.dg/modules/auto-1_b.C
*************** e322c3e2e2a5b94fb9e669c285d188b4  gcc/te
*** 35262,35267 ****
--- 35285,35293 ----
  952c780f52f4b4b510d04d6b1c74dd28  gcc/testsuite/g++.dg/modules/warn-spec-3_c.C
  4a95f9f95cc176fb103da75a87383e40  gcc/testsuite/g++.dg/modules/warn-spec-4_a.C
  fb2cb7f453ee44770338d0f4c1ece654  gcc/testsuite/g++.dg/modules/warn-spec-4_b.C
+ 09babc23a403552ae323e53244ed68b1  gcc/testsuite/g++.dg/modules/warn-spec-5_a.C
+ 280f3e3384660ceaa81d4c86f10d45e4  gcc/testsuite/g++.dg/modules/warn-spec-5_b.C
+ 842130adcc7ea89fabb5566ba25918b9  gcc/testsuite/g++.dg/modules/warn-spec-5_c.C
  1f4f7d511678a6fe4008c486952c066e  gcc/testsuite/g++.dg/modules/xtreme-header-1.h
  5884b00638991ff8efb1f358bc696bca  gcc/testsuite/g++.dg/modules/xtreme-header-1_a.H
  2f9d3bf7b6222aa9a7879d98c3921af8  gcc/testsuite/g++.dg/modules/xtreme-header-1_b.C
*************** e0ee95e9b95793ee4d57f8204bf8645d  gcc/te
*** 37332,37337 ****
--- 37358,37364 ----
  f6da6bc220f84f52571fc202af3e6006  gcc/testsuite/g++.dg/reflect/annotations11.C
  d0688f26f2ebb5828f6f48cc79bc7f61  gcc/testsuite/g++.dg/reflect/annotations12.C
  8d81fca4d65c911f50361a306552693f  gcc/testsuite/g++.dg/reflect/annotations13.C
+ d74843286cf1eb52ed6cfd02d075cf2b  gcc/testsuite/g++.dg/reflect/annotations14.C
  cde9ad9488133ece9333eb048f65f1e1  gcc/testsuite/g++.dg/reflect/annotations2.C
  b31ed4442038ed211b83481f0c6b097f  gcc/testsuite/g++.dg/reflect/annotations3.C
  95036b72f565c8ac8e22eb21a94626f1  gcc/testsuite/g++.dg/reflect/annotations4.C
*************** a53dc121d95af0b575afde7329733e7f  gcc/te
*** 37387,37393 ****
--- 37414,37425 ----
  3c9c6caa587b938ca6655f331d023b2e  gcc/testsuite/g++.dg/reflect/crash16.C
  9ca9f1b75f738a678aa5371ad5e2f83c  gcc/testsuite/g++.dg/reflect/crash17.C
  fd4d2ba7da42a991ae7f0513e8331f00  gcc/testsuite/g++.dg/reflect/crash18.C
+ 309589a647e1e59e65023ba6a7a660c4  gcc/testsuite/g++.dg/reflect/crash19.C
  aedec6415587682cae64f0232f5869ed  gcc/testsuite/g++.dg/reflect/crash2.C
+ 14ecac878204c1c4bb0ceace08351966  gcc/testsuite/g++.dg/reflect/crash20.C
+ 29a468e1665b85e6ec85bdf769e09233  gcc/testsuite/g++.dg/reflect/crash21.C
+ fe3eb312d2cb0bd41c622979383748d5  gcc/testsuite/g++.dg/reflect/crash22.C
+ f8a45c06b569517b400e04c1e8b83fa7  gcc/testsuite/g++.dg/reflect/crash23.C
  d69af9b43443999127305847e0961348  gcc/testsuite/g++.dg/reflect/crash3.C
  08df10fc9089ca9b7056d12d68c3ef8f  gcc/testsuite/g++.dg/reflect/crash4.C
  dd86fc7e909711154b284147a6956686  gcc/testsuite/g++.dg/reflect/crash5.C
*************** d9a7fd232d445f9b66afc3bae1204b42  gcc/te
*** 37403,37408 ****
--- 37435,37441 ----
  a90bbaada7db11433927609f58ce9807  gcc/testsuite/g++.dg/reflect/dealias1.C
  ba847f7d57294ccd6b282e81baaaf83b  gcc/testsuite/g++.dg/reflect/dealias2.C
  c9d4dece58db866f00e39bcc4cadb5f8  gcc/testsuite/g++.dg/reflect/dealias3.C
+ 32ac321c1bbb2d8cc91186a3d6039f67  gcc/testsuite/g++.dg/reflect/decltype1.C
  0812d60a7ffe2d181412a252920fcaee  gcc/testsuite/g++.dg/reflect/defarg1.C
  35fb9a6b3789fdd6b10d806ba69be6d5  gcc/testsuite/g++.dg/reflect/define_aggregate1.C
  f0f21ad05d20f33170e5464386bbc04a  gcc/testsuite/g++.dg/reflect/define_aggregate2.C
*************** c383f7bdf34cc8248e3fb9c61011574a  gcc/te
*** 37438,37443 ****
--- 37471,37477 ----
  32ccc692cd8f4f800d5b7cf0f8c10e82  gcc/testsuite/g++.dg/reflect/diag3.C
  1533eb5d112721a72e26e68b9d092170  gcc/testsuite/g++.dg/reflect/diag4.C
  20539bb1e62472f10fa8334f10ff9cd3  gcc/testsuite/g++.dg/reflect/diag5.C
+ db85d7c65c5f57d9c7f5d259e7145883  gcc/testsuite/g++.dg/reflect/diag6.C
  d2ba3e99f820933f56802a4f4a486019  gcc/testsuite/g++.dg/reflect/display_string_of1.C
  471074284711fdd57cea87c822da502f  gcc/testsuite/g++.dg/reflect/eh1.C
  8cab0986acf9fb4bd447cea1a90ab571  gcc/testsuite/g++.dg/reflect/eh10.C
*************** dd2e7162c7d5dd2ca76a4c15861d9607  gcc/te
*** 37471,37476 ****
--- 37505,37511 ----
  d9fff53183f3cbc21c2786ee54aac085  gcc/testsuite/g++.dg/reflect/expr13.C
  cb62b6f411eaa0edabe6a10520d7652c  gcc/testsuite/g++.dg/reflect/expr14.C
  7d931bd0fd71d114fa6a17dce607e802  gcc/testsuite/g++.dg/reflect/expr15.C
+ f3f33f49043a48d1ae3edf4ed1f5e2f3  gcc/testsuite/g++.dg/reflect/expr16.C
  8a9b940805893540797936869da281d7  gcc/testsuite/g++.dg/reflect/expr2.C
  4b1fb75674597a85fb0234f3b45e8f9e  gcc/testsuite/g++.dg/reflect/expr3.C
  6db5cf1cb9ce8e043687a3df14680bc3  gcc/testsuite/g++.dg/reflect/expr4.C
*************** ec7c886da63326b95102e27b6fbe6e27  gcc/te
*** 37827,37832 ****
--- 37862,37868 ----
  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
+ 3480e0132e11bbdaa8bce4bee580750a  gcc/testsuite/g++.dg/reflect/using2.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
*************** f298eddbaaad3dfdc15f6cf9683ff08a  gcc/te
*** 39827,39832 ****
--- 39863,39869 ----
  a7a00125ef903c9e5ba25788e8c60eab  gcc/testsuite/g++.dg/torture/pr120721.C
  4d68e68ec1a7391fe652111cdb89b309  gcc/testsuite/g++.dg/torture/pr120987-1.C
  75b55c517ba9c0f47c83851f084cb294  gcc/testsuite/g++.dg/torture/pr121870.C
+ e30112bafecf7e102dd01711a1d22a24  gcc/testsuite/g++.dg/torture/pr122380.C
  335f20fd55847f9861ff378b9be0f1bc  gcc/testsuite/g++.dg/torture/pr122589.C
  04115c46931023150cac2508ab43b9ff  gcc/testsuite/g++.dg/torture/pr122663.C
  ca9be1f2aa5374ea9f72ea31bc874ec1  gcc/testsuite/g++.dg/torture/pr123040.C
*************** d6ab64b605a24d07d95eb4282b431dac  gcc/te
*** 41515,41520 ****
--- 41552,41558 ----
  396db29dd4ffacf13fccefd03552734c  gcc/testsuite/g++.dg/warn/Wuninitialized-32.C
  29d21222d7cb71568891661c219f4c98  gcc/testsuite/g++.dg/warn/Wuninitialized-33.C
  954ee8a8c8588bbf10d0e828d4c5c2f7  gcc/testsuite/g++.dg/warn/Wuninitialized-34.C
+ 3a7f20e52d738766db49016af0b45bf3  gcc/testsuite/g++.dg/warn/Wuninitialized-35.C
  be5b47714ba41b25933660896d6c7427  gcc/testsuite/g++.dg/warn/Wuninitialized-4.C
  1f013ef9d737e679cea70e842d47a7ce  gcc/testsuite/g++.dg/warn/Wuninitialized-5.C
  5d5a54e16a8f1ca7a7dc521b9a20af28  gcc/testsuite/g++.dg/warn/Wuninitialized-6.C
*************** aa928203aafdb1f6793fe73d77390fc9  gcc/te
*** 45451,45456 ****
--- 45489,45495 ----
  6611cbfe5e8b727f44757076bd15d23a  gcc/testsuite/g++.target/aarch64/sve2/acle/aarch64-sve2-acle-asm.exp
  2db1f141b171b343da3bcd8a1f111fd8  gcc/testsuite/g++.target/aarch64/vect-simd-clone-1.C
  f89c5da906414e7c52ffb7bb0ab2b800  gcc/testsuite/g++.target/aarch64/vect_cmp-1.C
+ eb2aca171042b562febe4c10065f1ee1  gcc/testsuite/g++.target/aarch64/virtual-lto.C
  0707e039d5311ec3d5db1e035d06a6d6  gcc/testsuite/g++.target/arm/arm.exp
  d0eaacd5173a9a25d7ce41b86ccf8153  gcc/testsuite/g++.target/arm/bfloat_cpp_typecheck.C
  1be043d5daf902730f5c770ee4bbe8f1  gcc/testsuite/g++.target/arm/bti_thunk.C
*************** dc88c4a16670b88873deaa496d62f7e0  gcc/te
*** 45885,45890 ****
--- 45924,45930 ----
  d524c0f12362d29431b637fe039b54af  gcc/testsuite/g++.target/powerpc/uncaught3.C
  a013abe8fae4a331d6bd7bef946524f1  gcc/testsuite/g++.target/powerpc/undef-bool-1.C
  fb915623fe5d0c1208c53c6de33e722a  gcc/testsuite/g++.target/powerpc/undef-bool-3.C
+ 2c7a50d8ba8d7d540f019c302b27e707  gcc/testsuite/g++.target/pr124597.C
  42d8d99a0e73a3a6d3751b7543369b21  gcc/testsuite/g++.target/pru/minrt-1.cc
  87e159b16768d67c3f3c34b2ba3b8354  gcc/testsuite/g++.target/pru/minrt-2.cc
  3c447d71c9dbea654422b220051c773d  gcc/testsuite/g++.target/pru/minrt-3.cc
*************** c862a5d1aff47e4a5a9bc1b257f3fd19  gcc/te
*** 58520,58525 ****
--- 58560,58566 ----
  5cd501fa005281d9c622810307478c79  gcc/testsuite/gcc.dg/pr123882.c
  f402be89e4891c76c691c8144fe168f7  gcc/testsuite/gcc.dg/pr124138.c
  32cf8bc03bc1ee1694db58a529d26406  gcc/testsuite/gcc.dg/pr124454-1.c
+ f733cdb22a88b058648393623d505a3f  gcc/testsuite/gcc.dg/pr124476.c
  bc5ddfbbc46f4e0cce1629d1b58d3090  gcc/testsuite/gcc.dg/pr12603.c
  72a2fca76cb69617ae36bab93c7ec0d7  gcc/testsuite/gcc.dg/pr12625-1.c
  6f0ef61e5a12db5f11da839b2988c5e1  gcc/testsuite/gcc.dg/pr13519-1.c
*************** e551c09a78d645c98f9a47869b65d718  gcc/te
*** 62369,62374 ****
--- 62410,62416 ----
  c1c484a49281243452ee6209dd770016  gcc/testsuite/gcc.dg/torture/pr124108.c
  d4f9bc1a728b13f9940b71ab03cc40fd  gcc/testsuite/gcc.dg/torture/pr124132.c
  c71760bcf2c56e1252676a03c592c3b0  gcc/testsuite/gcc.dg/torture/pr124435.c
+ e394027559c72da3f714e1f0bce86a7c  gcc/testsuite/gcc.dg/torture/pr124555.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
*************** e3778178e3b66643e8489268917624c5  gcc/te
*** 62872,62877 ****
--- 62914,62920 ----
  06f8201f26f20cabf75e12a925d12cac  gcc/testsuite/gcc.dg/torture/pr65077.c
  ed0c6bc242e97e81c55f11b25a27105d  gcc/testsuite/gcc.dg/torture/pr65270-1.c
  95efec2948196b43558e06546f6f1ff3  gcc/testsuite/gcc.dg/torture/pr65270-2.c
+ 3a060f6d521ac18899dc65568406ab18  gcc/testsuite/gcc.dg/torture/pr65270-3.c
  f3e0d0fa5867ae62dead0056b4b057ef  gcc/testsuite/gcc.dg/torture/pr65517.c
  449a51242640b8e157ba8d8a2096b474  gcc/testsuite/gcc.dg/torture/pr65961.c
  c68db82489a10495af29c1c44142ace7  gcc/testsuite/gcc.dg/torture/pr66076.c
*************** fc8efeaf2ed7c9bba5d4f1717e7e356b  gcc/te
*** 64173,64180 ****
  cb909e7812f73f90414b63042c95d199  gcc/testsuite/gcc.dg/tree-ssa/forwprop-4.c
  eb894750e8c2c762096d861a6009f51a  gcc/testsuite/gcc.dg/tree-ssa/forwprop-40.c
  de3171692db53449fdcaa8f1c1e1676c  gcc/testsuite/gcc.dg/tree-ssa/forwprop-41.c
! 4c3d8a17c3c05c47aeb8205fb8aca518  gcc/testsuite/gcc.dg/tree-ssa/forwprop-42.c
! 6e8a61c186677d7de798d02da48c8fbf  gcc/testsuite/gcc.dg/tree-ssa/forwprop-43.c
  d56422e63543fcf4bf4b78d825c534da  gcc/testsuite/gcc.dg/tree-ssa/forwprop-5.c
  0f6dc2b3b3469af9cd27d5b5cd97353c  gcc/testsuite/gcc.dg/tree-ssa/forwprop-6.c
  a9096c4b5b756bdc9dcc196398730d73  gcc/testsuite/gcc.dg/tree-ssa/forwprop-7.c
--- 64216,64223 ----
  cb909e7812f73f90414b63042c95d199  gcc/testsuite/gcc.dg/tree-ssa/forwprop-4.c
  eb894750e8c2c762096d861a6009f51a  gcc/testsuite/gcc.dg/tree-ssa/forwprop-40.c
  de3171692db53449fdcaa8f1c1e1676c  gcc/testsuite/gcc.dg/tree-ssa/forwprop-41.c
! 961671e379d822c42f99331eae6766b4  gcc/testsuite/gcc.dg/tree-ssa/forwprop-42.c
! 6f6a5439ce598d5e47d2d756af6c116e  gcc/testsuite/gcc.dg/tree-ssa/forwprop-43.c
  d56422e63543fcf4bf4b78d825c534da  gcc/testsuite/gcc.dg/tree-ssa/forwprop-5.c
  0f6dc2b3b3469af9cd27d5b5cd97353c  gcc/testsuite/gcc.dg/tree-ssa/forwprop-6.c
  a9096c4b5b756bdc9dcc196398730d73  gcc/testsuite/gcc.dg/tree-ssa/forwprop-7.c
*************** f217e7eaaf0fa982496dcfbf0c1b65fa  gcc/te
*** 65481,65486 ****
--- 65524,65530 ----
  8c83b125bec2afaa6eba2f0385dc4625  gcc/testsuite/gcc.dg/tree-ssa/scev-14.c
  d396c36b9f0d747b966a2da9958bc3ac  gcc/testsuite/gcc.dg/tree-ssa/scev-15.c
  9c8abcab6bd02788731e27ea02ed49a8  gcc/testsuite/gcc.dg/tree-ssa/scev-16.c
+ a4a9a2df2f16e298a4ad4bce64ed365b  gcc/testsuite/gcc.dg/tree-ssa/scev-17.c
  4323482b616b668100a20fa9ef8249fa  gcc/testsuite/gcc.dg/tree-ssa/scev-2.c
  219839db1cd5ee662a1d6dfd20d04a13  gcc/testsuite/gcc.dg/tree-ssa/scev-6.c
  2a4d896a7956f73ba5c280f397c5d479  gcc/testsuite/gcc.dg/tree-ssa/scev-7.c
*************** bc456ba2c91652bd2140d56987cba543  gcc/te
*** 65884,65890 ****
  234756eba1af5e152cd1faa8b6266bf7  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-28.c
  a06281be684fbc9936ebf659c6e5fa95  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-29.c
  999435f66d370ea9ebf68128c98b001f  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-3.c
! d70ae28c3dbd762925d367cebd456779  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-30.c
  7e73c668c31b6f73c95b69cbdc80eac5  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-31.c
  d7800e6a28e5b70e0293c932b14894f8  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-32.c
  17d5e649f4ebd09ca062e6a51b4bb263  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-33.c
--- 65928,65934 ----
  234756eba1af5e152cd1faa8b6266bf7  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-28.c
  a06281be684fbc9936ebf659c6e5fa95  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-29.c
  999435f66d370ea9ebf68128c98b001f  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-3.c
! 644f4a09cd96b02d2b840537fb419c75  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-30.c
  7e73c668c31b6f73c95b69cbdc80eac5  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-31.c
  d7800e6a28e5b70e0293c932b14894f8  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-32.c
  17d5e649f4ebd09ca062e6a51b4bb263  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-33.c
*************** b2257f5f913dd4b4b9eb7a2ea834a710  gcc/te
*** 69180,69204 ****
  8c4274546261eadb1410524bcdc26c4d  gcc/testsuite/gcc.dg/wchar_t-1.c
  f2cc2a4270e9964959b2a5f3df5cdaae  gcc/testsuite/gcc.dg/wchar_t-2.c
  7368eeb85c3d8e771c824db72e256309  gcc/testsuite/gcc.dg/weak/typeof-2.c
! 37960d70846c4887f92c21dc8d98903f  gcc/testsuite/gcc.dg/weak/weak-1.c
! 5b030d8bcb22dedd984e8d8dae17cfb6  gcc/testsuite/gcc.dg/weak/weak-10.c
! 121bd4b7463864effe08a934bc490b0d  gcc/testsuite/gcc.dg/weak/weak-11.c
! fce8a678765e6fccf0478e2c87f1ddbf  gcc/testsuite/gcc.dg/weak/weak-12.c
  fc79cd4804afe5fc2b7f140f5eae482d  gcc/testsuite/gcc.dg/weak/weak-13.c
  2dbf1902b4b321c5bf3cfc37eae03a68  gcc/testsuite/gcc.dg/weak/weak-14.c
! ff9408c505d12147e81d13a32e12c0ab  gcc/testsuite/gcc.dg/weak/weak-15.c
! cf2a69b8102ee81866d5f8170997a58a  gcc/testsuite/gcc.dg/weak/weak-16.c
  99ed81e57fd8a9986faf9263996177f8  gcc/testsuite/gcc.dg/weak/weak-17.c
  b1053beb6c83d0b7ad775bdb6d738748  gcc/testsuite/gcc.dg/weak/weak-18.c
  82d71518bc5f1e36716ed624e8b5b71d  gcc/testsuite/gcc.dg/weak/weak-19.c
! da47a98a9dc437100bb766379d9f6391  gcc/testsuite/gcc.dg/weak/weak-2.c
! 7e2f12bea17d89fc581be1636df47046  gcc/testsuite/gcc.dg/weak/weak-3.c
! e08ff43e40ee3793ebaa73beade2f429  gcc/testsuite/gcc.dg/weak/weak-4.c
! 8cac70c2b8b3cd56d97bcb2e4f03225d  gcc/testsuite/gcc.dg/weak/weak-5.c
  b7dc9ca29b0c2fb0c11b45350fbe20ac  gcc/testsuite/gcc.dg/weak/weak-6.c
  bbde9e22b1b903e5ff4a277a65a1cb04  gcc/testsuite/gcc.dg/weak/weak-7.c
  ef4ea7d4216e9123244c1d14e75ca376  gcc/testsuite/gcc.dg/weak/weak-8.c
! df7f481c6f796831760bd5209df6243d  gcc/testsuite/gcc.dg/weak/weak-9.c
  96a157a924a887c26c95b6351ebc16b0  gcc/testsuite/gcc.dg/weak/weak.exp
  4f8d055b663cb38e2bbb352f1cb7a53c  gcc/testsuite/gcc.dg/webizer.c
  b73fb0ba5d6e226781f1b052bc3742c5  gcc/testsuite/gcc.dg/wide-shift-128.c
--- 69224,69248 ----
  8c4274546261eadb1410524bcdc26c4d  gcc/testsuite/gcc.dg/wchar_t-1.c
  f2cc2a4270e9964959b2a5f3df5cdaae  gcc/testsuite/gcc.dg/wchar_t-2.c
  7368eeb85c3d8e771c824db72e256309  gcc/testsuite/gcc.dg/weak/typeof-2.c
! 82268ff726408d6d1dd389e9fa276252  gcc/testsuite/gcc.dg/weak/weak-1.c
! 47e348c3bf69f1ac4e77a7e6775eab08  gcc/testsuite/gcc.dg/weak/weak-10.c
! 4cc915fd7b2b58568f2d25eb02eb7d93  gcc/testsuite/gcc.dg/weak/weak-11.c
! 6a4c8637b29e1066a89a037f09e6eb6f  gcc/testsuite/gcc.dg/weak/weak-12.c
  fc79cd4804afe5fc2b7f140f5eae482d  gcc/testsuite/gcc.dg/weak/weak-13.c
  2dbf1902b4b321c5bf3cfc37eae03a68  gcc/testsuite/gcc.dg/weak/weak-14.c
! 7ef88e6e9ff3f5fe32159894ab2fdcb8  gcc/testsuite/gcc.dg/weak/weak-15.c
! 70f0f33b074b7a65550d11e7abf26459  gcc/testsuite/gcc.dg/weak/weak-16.c
  99ed81e57fd8a9986faf9263996177f8  gcc/testsuite/gcc.dg/weak/weak-17.c
  b1053beb6c83d0b7ad775bdb6d738748  gcc/testsuite/gcc.dg/weak/weak-18.c
  82d71518bc5f1e36716ed624e8b5b71d  gcc/testsuite/gcc.dg/weak/weak-19.c
! 46f38e8750278a2082d7160cad862f6d  gcc/testsuite/gcc.dg/weak/weak-2.c
! 836d17851c672789435c696a2006e5b7  gcc/testsuite/gcc.dg/weak/weak-3.c
! defe364699a190498189f6d096b47e63  gcc/testsuite/gcc.dg/weak/weak-4.c
! 92f1c0b2be142ec5036dd5b3870db65c  gcc/testsuite/gcc.dg/weak/weak-5.c
  b7dc9ca29b0c2fb0c11b45350fbe20ac  gcc/testsuite/gcc.dg/weak/weak-6.c
  bbde9e22b1b903e5ff4a277a65a1cb04  gcc/testsuite/gcc.dg/weak/weak-7.c
  ef4ea7d4216e9123244c1d14e75ca376  gcc/testsuite/gcc.dg/weak/weak-8.c
! 47a28517c3b6bc14e937a35d1cafcae4  gcc/testsuite/gcc.dg/weak/weak-9.c
  96a157a924a887c26c95b6351ebc16b0  gcc/testsuite/gcc.dg/weak/weak.exp
  4f8d055b663cb38e2bbb352f1cb7a53c  gcc/testsuite/gcc.dg/webizer.c
  b73fb0ba5d6e226781f1b052bc3742c5  gcc/testsuite/gcc.dg/wide-shift-128.c
*************** db7ec863bbc5f42e3eaaf7d41c078f60  gcc/te
*** 72012,72030 ****
  954127f6d3b08028a0dbbecea8abaea4  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/read_ver_za32.c
  6c42cd7108db85285989b01cdfe0ceab  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/read_ver_za64.c
  dbc86278f829fba89a0fe31c897fefe7  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/read_ver_za8.c
! 57473390b86a03f32d83e9845fcd1e8f  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_bf16.c
! 610cf99edd9ae5f40f3a3a69e3efc55b  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_f16.c
! 494c59f5fc641ba1ca278e6162846419  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_f32.c
! ad3bf5b4426c396c38ad710e89d302ac  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_f64.c
! 287ae06dcdd643c431be7c2d1423f582  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_mf8.c
! 5e7be0532c1cf9a24ceae0d2466cba9e  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s16.c
! 0122c325c4687b56eab55136cc73671a  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s32.c
! 9c0d30515c9685ca27aabb6a386b5537  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s64.c
! ee35ab070539123bfc539d4170588034  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s8.c
! b6285c7698184d8c087dacbadd41f5b4  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u16.c
! d21f72a1590a30f18e73717e7a20cf48  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u32.c
! aff628cd65c21a022877761c02d814f0  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u64.c
! a3fa32026373764c9168da8a3c6feb13  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u8.c
  92f3366342aae6b2ec7f6d53be3fe1a1  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/st1_hor_vnum_za128.c
  4a2c37b58b46cda8f18baebab50b1238  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/st1_hor_vnum_za16.c
  af7a839b3b15a2c2cfbbc10272a15951  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/st1_hor_vnum_za32.c
--- 72056,72074 ----
  954127f6d3b08028a0dbbecea8abaea4  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/read_ver_za32.c
  6c42cd7108db85285989b01cdfe0ceab  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/read_ver_za64.c
  dbc86278f829fba89a0fe31c897fefe7  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/read_ver_za8.c
! 3d25db1ad0afebd094545ea84e5f3aae  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_bf16.c
! 840005f252294243ace12ff7d5c6ef0a  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_f16.c
! ce7f61fdd320c854577401af81f7c2d4  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_f32.c
! 24ddf3db4f334ebe87c4dacc577c50a1  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_f64.c
! 589e8495ffffaa00332f61fd0e70587b  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_mf8.c
! 91a6c7952a3e12c0dc12f395162fae56  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s16.c
! 140dea06c2a63f12aa1cfeae3b45a418  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s32.c
! 4d1a33db10b9d8309a31c0d67aa11be8  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s64.c
! b484f4e09608622165b4b3ff193dad13  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s8.c
! 460c33ca47010b78e006ddface805b08  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u16.c
! 9e58a54ddefabef835a663a6e4ad220e  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u32.c
! 420869caff110ba03a219c0dbb0d6f6a  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u64.c
! 18e20b3d14d5d844ff81a8286d4363fd  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u8.c
  92f3366342aae6b2ec7f6d53be3fe1a1  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/st1_hor_vnum_za128.c
  4a2c37b58b46cda8f18baebab50b1238  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/st1_hor_vnum_za16.c
  af7a839b3b15a2c2cfbbc10272a15951  gcc/testsuite/gcc.target/aarch64/sme/acle-asm/st1_hor_vnum_za32.c
*************** b9b880247845019946d9397ae50a7dcf  gcc/te
*** 77637,77655 ****
  96438bdfb17fb69927c45a82c26bcbd0  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rax1_s64.c
  4b908d3cdc65630d5d194574d04a9d04  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rax1_u64.c
  1e60fc894c3aa822383f66ed0fae4f0d  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/recpe_u32.c
! 99dad9c3481eef0de2a4cd060e3a3a1f  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_bf16.c
! 3259cdf48120dc09b7fc2c8efb94097b  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_f16.c
! 50b69c6d4926cbee4a08a9ec84ff3a81  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_f32.c
! 23eaee7e58f44f6e200aa8b355a263c0  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_f64.c
! 72cfedd5ade804341c4a1c19d27ec054  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_mf8.c
! c32db97afd2d9cc1a09a84988f8f16be  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s16.c
! c9959408786b02a63956b41e095add33  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s32.c
! 2a09d57eb999e40f06bd820be5e4027f  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s64.c
! 01187424d3c6ca4bd77f86ac14381c51  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s8.c
! b58ca786c874c40a9b5a8dfb94364f3b  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u16.c
! b5e97f46a70b15dfd94e483317742bde  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u32.c
! 58ea6ac95932884e317f9f9c4937c816  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u64.c
! e00b3221fce98366b7dda70015d71353  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u8.c
  9596a6d388086fba832d8a2f53ea57c9  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_s16.c
  10d33337c7eb8998a71c51e7f2bb3e30  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_s32.c
  dbc6f1ccc6394bbd64f2989e6f385bce  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_s64.c
--- 77681,77699 ----
  96438bdfb17fb69927c45a82c26bcbd0  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rax1_s64.c
  4b908d3cdc65630d5d194574d04a9d04  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rax1_u64.c
  1e60fc894c3aa822383f66ed0fae4f0d  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/recpe_u32.c
! 6dcdd634683cc5bf89527f1b3aa8bbe1  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_bf16.c
! 012a6600194eaffae32608214f7961c9  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_f16.c
! 8f78cd01c576e45a1c23352b4a45549e  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_f32.c
! 3139d30903d8bd1998eaa0bf27d502dd  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_f64.c
! 8c457d56ca87881e9d85f89925c16ef4  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_mf8.c
! 57d9d47866b138860f9596ecf5f33c3f  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s16.c
! 3a81d4e766ce2c370d5f1e889ebb6571  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s32.c
! 7579a7ee86d83cfb156bfd8326fc64b9  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s64.c
! c1b1f25927be0ef1d0776d5609fa76f7  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s8.c
! 28e02d840ab26dfbfdd422470b9a0664  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u16.c
! 3ba755e3a4fcf839884e3245bac1c47b  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u32.c
! 439b4003f6ccff9474809f43a320434c  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u64.c
! 1e000b1c81ff64e2c2bc15b428bc2184  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u8.c
  9596a6d388086fba832d8a2f53ea57c9  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_s16.c
  10d33337c7eb8998a71c51e7f2bb3e30  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_s32.c
  dbc6f1ccc6394bbd64f2989e6f385bce  gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_s64.c
*************** fc2eb8ac52faed5fba0a017b858d4ae4  gcc/te
*** 78271,78276 ****
--- 78315,78321 ----
  8ba6cf5317762b2b89350d4f652efa53  gcc/testsuite/gcc.target/aarch64/torture/pr116564.c
  626bb6bb64c1bbe8eb5e2b92bf925aeb  gcc/testsuite/gcc.target/aarch64/torture/pr120986-2.c
  d03b2f46140f14ae9b2101813aec3525  gcc/testsuite/gcc.target/aarch64/torture/pr121772.c
+ 164477999ab21aa17183a55d49bb0d71  gcc/testsuite/gcc.target/aarch64/torture/pr124491.c
  5266ac107a73e3ee1d1f44e1cda7d9f2  gcc/testsuite/gcc.target/aarch64/torture/simd-abi-1.c
  9c3416db2fc04c3f91b03ecae15e943e  gcc/testsuite/gcc.target/aarch64/torture/simd-abi-10.c
  df55bfe2c1ce46074b19b4566cedeef4  gcc/testsuite/gcc.target/aarch64/torture/simd-abi-11.c
*************** a2da30b33f626c449124b741d63ff50f  gcc/te
*** 89180,89186 ****
  1dfea81292e4d43d2d7fc2bfd3430eda  gcc/testsuite/gcc.target/i386/parity-7.c
  03b41b2f42cb61cb71b23f1af7f0135e  gcc/testsuite/gcc.target/i386/parity-8.c
  8d756665b79bf6bd7920f21a780f11dc  gcc/testsuite/gcc.target/i386/parity-9.c
! 53f34db58dd7bf7b9cbb0d217d879e8a  gcc/testsuite/gcc.target/i386/part-vect-absnegbf.c
  8e4c38a70fbd0d029a0b696304e2047f  gcc/testsuite/gcc.target/i386/part-vect-absneghf.c
  d7575e4a239acf382fe6978f76d7f8f6  gcc/testsuite/gcc.target/i386/part-vect-complexhf.c
  a42e41a70df25254ab0c3533058e09ce  gcc/testsuite/gcc.target/i386/part-vect-copysignhf.c
--- 89225,89231 ----
  1dfea81292e4d43d2d7fc2bfd3430eda  gcc/testsuite/gcc.target/i386/parity-7.c
  03b41b2f42cb61cb71b23f1af7f0135e  gcc/testsuite/gcc.target/i386/parity-8.c
  8d756665b79bf6bd7920f21a780f11dc  gcc/testsuite/gcc.target/i386/parity-9.c
! 56403643fbf746cfa97cf71a2c8f29c7  gcc/testsuite/gcc.target/i386/part-vect-absnegbf.c
  8e4c38a70fbd0d029a0b696304e2047f  gcc/testsuite/gcc.target/i386/part-vect-absneghf.c
  d7575e4a239acf382fe6978f76d7f8f6  gcc/testsuite/gcc.target/i386/part-vect-complexhf.c
  a42e41a70df25254ab0c3533058e09ce  gcc/testsuite/gcc.target/i386/part-vect-copysignhf.c
*************** fde1ac7b82e671a22c599f0160131e2d  gcc/te
*** 93072,93077 ****
--- 93117,93123 ----
  b292dd3bc21c285ba5f3f1bcac0a5139  gcc/testsuite/gcc.target/i386/tbm-2.c
  052ea02011f5031dc3a4171aed715a52  gcc/testsuite/gcc.target/i386/tbm-bextri-1.c
  d463b6607b227bc8376b031954d58ffb  gcc/testsuite/gcc.target/i386/tbm-pr116287.c
+ 09a22ac13c352dbd3a542c30d657899d  gcc/testsuite/gcc.target/i386/tct-ipa-inline-ice.c
  4edd7df3f7e7eae5b3e0d3be8a5068e4  gcc/testsuite/gcc.target/i386/testimm-1.c
  7188c4d254bb0c4fb66e39b2c8e51711  gcc/testsuite/gcc.target/i386/testimm-10.c
  ac027496b6114a9f7eb014a0c4cf998a  gcc/testsuite/gcc.target/i386/testimm-2.c
*************** a10f1fbb2f27f7e942cc0670fb3624e4  gcc/te
*** 110752,110758 ****
  a080e4860261d16428bca6fb30d66159  gcc/testsuite/gdc.test/runnable/cppdtor.d
  2b92f65e8a84b3091a6b268e98f92815  gcc/testsuite/gdc.test/runnable/ctorpowtests.d
  3f5f010cdf399eaeff520185c43b37a5  gcc/testsuite/gdc.test/runnable/dbitfields.d
- e35cd88f716fe5b7f8128982b42da4aa  gcc/testsuite/gdc.test/runnable/dbitfieldsdm.d
  84c4e26d482890e8bc49d1ce61bef9a7  gcc/testsuite/gdc.test/runnable/declaration.d
  d0a93167ec0c4b07094d766e9e071292  gcc/testsuite/gdc.test/runnable/delegate.d
  b236e2967e62b1d2e91de78f8c967b0d  gcc/testsuite/gdc.test/runnable/e7804.d
--- 110798,110803 ----
*************** fd931b02506b83f0422f0faed5da5c1e  gcc/te
*** 115002,115007 ****
--- 115047,115053 ----
  09ea63acb5c4c7a47cc2d19532460132  gcc/testsuite/gfortran.dg/goacc/pr104717.f90
  7e7fc3d088115060da170794a58be703  gcc/testsuite/gfortran.dg/goacc/pr109622-5.f90
  1455640e85064b6a149025dca753e059  gcc/testsuite/gfortran.dg/goacc/pr109622-6.f90
+ 25e0ac1a3686ba9ae8a974d05f23ebf5  gcc/testsuite/gfortran.dg/goacc/pr120723.f90
  3cdf23868f01623770b84c1bd05da5a3  gcc/testsuite/gfortran.dg/goacc/pr71704.f90
  2ff86b408ebb7a6e4fa041f1ea4a5204  gcc/testsuite/gfortran.dg/goacc/pr72715.f90
  dff0c4a3dcd2aac51063c6e05c6d4665  gcc/testsuite/gfortran.dg/goacc/pr72743.f90
*************** aadce1b09e2a4d220805726af0c7f109  gcc/te
*** 117615,117620 ****
--- 117661,117667 ----
  7a5b7a18d621b5e1b9d04b73e259ddd4  gcc/testsuite/gfortran.dg/pr104849.f90
  35a7804825dacf412e34e3f973b467f1  gcc/testsuite/gfortran.dg/pr104908.f90
  a5bb6d9b844f014490dab5e87b60244c  gcc/testsuite/gfortran.dg/pr105152.f90
+ 472e7c3181a65bf922fc24aa4a286685  gcc/testsuite/gfortran.dg/pr105168.f90
  ff052278fd65d5823600af4550f5eae7  gcc/testsuite/gfortran.dg/pr105205.f90
  22283af469347d85bd1fe4dae42939a3  gcc/testsuite/gfortran.dg/pr105230.f90
  0d13bd4f2344022f31050b761cea6e41  gcc/testsuite/gfortran.dg/pr105361.f90
*************** f5fb3cbcb5e6e13e6a56fcf9422a2863  gcc/te
*** 117767,117772 ****
--- 117814,117820 ----
  5914721145d2b8dda6c660d4cb1803dc  gcc/testsuite/gfortran.dg/pr123947_2.f90
  321edf4c22cc24a529062a30ef0158f2  gcc/testsuite/gfortran.dg/pr123949.f90
  348d095bf62be63000e464d805a812fb  gcc/testsuite/gfortran.dg/pr123952.f90
+ 9aa1b21c93a3838e52245be748b9b301  gcc/testsuite/gfortran.dg/pr124161.f90
  39137ae7aabd3246fa806bae5346ef6a  gcc/testsuite/gfortran.dg/pr124208.f90
  2cb76d13b09d255f773e5188ba2693fa  gcc/testsuite/gfortran.dg/pr124235.f90
  5bfaeea8d13a5035cf46aaab485c2803  gcc/testsuite/gfortran.dg/pr124450.f90
*************** c41bc69547a048a19ccb1adc57ce3bca  gcc/te
*** 118244,118249 ****
--- 118292,118298 ----
  6d593814cbde3b81eb21e9501a48bac2  gcc/testsuite/gfortran.dg/pr84565.f90
  4cf62650961664b3e4bce16d177b5929  gcc/testsuite/gfortran.dg/pr84674.f90
  7cb3611bc701529711c1f596921afaa3  gcc/testsuite/gfortran.dg/pr84734.f90
+ 393795c1c91adc9f5adfd59c5ef5c172  gcc/testsuite/gfortran.dg/pr84779.f90
  a4758a568b5ef9b888cb911bc4cdd259  gcc/testsuite/gfortran.dg/pr84784.f90
  41e0ad3a735d1f75c8f837590c9d8293  gcc/testsuite/gfortran.dg/pr84868.f90
  bb61cbbb8a58939e43f49e77c93df95f  gcc/testsuite/gfortran.dg/pr84869.f90
*************** f9cd7fe0c8cb7be5b0846aa6c3eb0b93  gcc/te
*** 118458,118463 ****
--- 118507,118513 ----
  0636d4a049257c8e3f6c32b4b7309697  gcc/testsuite/gfortran.dg/pr93714_1.f90
  93b8b244bce4583a43c29d892e177744  gcc/testsuite/gfortran.dg/pr93714_2.f90
  4d2e245917c39b1bcaeea6010bcb6284  gcc/testsuite/gfortran.dg/pr93792.f90
+ 5494bfcb0d61c11d34ea0b6e4e610c45  gcc/testsuite/gfortran.dg/pr93832.f90
  8b7bf068692a6a31b63dd4963c050e98  gcc/testsuite/gfortran.dg/pr93835.f08
  6736173bcc319bca35f5453a7bca947b  gcc/testsuite/gfortran.dg/pr94030_1.f90
  b0f8acfae3746c459e5af7bcca222814  gcc/testsuite/gfortran.dg/pr94030_2.f90
*************** b2972400f8198e97c2fd7c2f94d0bed1  gcc/te
*** 123609,123614 ****
--- 123659,123667 ----
  a13dcdcaaf629d0a05ce4f001f14eab5  gcc/testsuite/gnat.dg/ifaces.adb
  e1afa83d3d4d79fd8be206b806058e1f  gcc/testsuite/gnat.dg/ifaces.ads
  d01b68d39a7e69d7d1a7649de0cf23be  gcc/testsuite/gnat.dg/image1.adb
+ e0d13570f862b017fdb00db5d9f41a7d  gcc/testsuite/gnat.dg/implicit_deref1.adb
+ 49e7fb50319758bcb479a922576d69be  gcc/testsuite/gnat.dg/implicit_deref2.adb
+ 4cede41d4ff65b71f2516bff6b1d067b  gcc/testsuite/gnat.dg/implicit_deref3.adb
  88448f9df86bdfbab72ab7e3969091fc  gcc/testsuite/gnat.dg/implicit_param.adb
  5b5706a749f9e2175696bbd58caaf846  gcc/testsuite/gnat.dg/implicit_param_pkg.ads
  35e00b5917b2a6b72371101941e20683  gcc/testsuite/gnat.dg/import1.adb
*************** cc0ad95b0f3d6b4ef54e287b438acb10  gcc/te
*** 127654,127660 ****
  327125e0f9770fa0fdc3ed8f820c8fb2  gcc/testsuite/lib/options.exp
  4837951677485b41199b6215388f44c4  gcc/testsuite/lib/plugin-support.exp
  0b47cfd7dff343f4c4e9785998f240c7  gcc/testsuite/lib/print-stack.exp
! a5626bc84fe6d7aff143af465616da95  gcc/testsuite/lib/profopt.exp
  4ef74e524e3ef5f3dec8824220faea8a  gcc/testsuite/lib/prune.exp
  52ac0ffa39ac607ccf00f72889b6058a  gcc/testsuite/lib/rust-dg.exp
  d84a04f02b348b9b24a659413d60a25b  gcc/testsuite/lib/rust.exp
--- 127707,127713 ----
  327125e0f9770fa0fdc3ed8f820c8fb2  gcc/testsuite/lib/options.exp
  4837951677485b41199b6215388f44c4  gcc/testsuite/lib/plugin-support.exp
  0b47cfd7dff343f4c4e9785998f240c7  gcc/testsuite/lib/print-stack.exp
! a0804ca1ed5aa13fd8ea9b35d742b510  gcc/testsuite/lib/profopt.exp
  4ef74e524e3ef5f3dec8824220faea8a  gcc/testsuite/lib/prune.exp
  52ac0ffa39ac607ccf00f72889b6058a  gcc/testsuite/lib/rust-dg.exp
  d84a04f02b348b9b24a659413d60a25b  gcc/testsuite/lib/rust.exp
*************** d84a04f02b348b9b24a659413d60a25b  gcc/te
*** 127663,127669 ****
  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
! 90651f34504ae5cd4d1996e7fa58917d  gcc/testsuite/lib/scanasm.exp
  81addbeaa55d8c8d361049d045d21b6e  gcc/testsuite/lib/scandump.exp
  daccee9e5e177dcd385268830f15bd84  gcc/testsuite/lib/scanhtml.exp
  a33ed92a9095d29763dd3ba2493b26d7  gcc/testsuite/lib/scanipa.exp
--- 127716,127722 ----
  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
! 0eaf8d4c599d230033d941eb4d7b6e51  gcc/testsuite/lib/scanasm.exp
  81addbeaa55d8c8d361049d045d21b6e  gcc/testsuite/lib/scandump.exp
  daccee9e5e177dcd385268830f15bd84  gcc/testsuite/lib/scanhtml.exp
  a33ed92a9095d29763dd3ba2493b26d7  gcc/testsuite/lib/scanipa.exp
*************** b844641ffa836259966da8bbdb705602  gcc/te
*** 128781,128787 ****
  e5ed37869d42b1e44616a14c50faa71b  gcc/testsuite/rust/compile/attr_deprecated.rs
  be490469be5b121fa85c69dc5c8d9ec6  gcc/testsuite/rust/compile/attr_deprecated_2.rs
  d58f07b82fe27b2df37e171876c670f1  gcc/testsuite/rust/compile/attr_malformed_doc.rs
! 40ba8575bd631336a5b193d946253811  gcc/testsuite/rust/compile/attr_malformed_path.rs
  e79d4857087ee809b9c2f65a80122031  gcc/testsuite/rust/compile/auto_trait.rs
  d655698651f1cfaefa27d4a3f33564cb  gcc/testsuite/rust/compile/auto_trait_invalid.rs
  25802e5725c2c02d1b7b9081c5efd177  gcc/testsuite/rust/compile/auto_trait_super_trait.rs
--- 128834,128840 ----
  e5ed37869d42b1e44616a14c50faa71b  gcc/testsuite/rust/compile/attr_deprecated.rs
  be490469be5b121fa85c69dc5c8d9ec6  gcc/testsuite/rust/compile/attr_deprecated_2.rs
  d58f07b82fe27b2df37e171876c670f1  gcc/testsuite/rust/compile/attr_malformed_doc.rs
! 23d880c78e6e8b1c4dba728547771e5e  gcc/testsuite/rust/compile/attr_malformed_path.rs
  e79d4857087ee809b9c2f65a80122031  gcc/testsuite/rust/compile/auto_trait.rs
  d655698651f1cfaefa27d4a3f33564cb  gcc/testsuite/rust/compile/auto_trait_invalid.rs
  25802e5725c2c02d1b7b9081c5efd177  gcc/testsuite/rust/compile/auto_trait_super_trait.rs
*************** baa3a0d30775ed604f878df5231cba48  gcc/te
*** 128819,128824 ****
--- 128872,128878 ----
  0168c54787b8a0fe1adaf95ec9d34577  gcc/testsuite/rust/compile/break_continue_outside_loop.rs
  bd0c3f42f2caa1d391123da46b68a0e8  gcc/testsuite/rust/compile/break_with_value_inside_loop.rs
  3089e5cf84922d853bd7c44b22155de5  gcc/testsuite/rust/compile/broken_utf8.rs
+ 7e9f1a01503b162cce7c0e3c782bf840  gcc/testsuite/rust/compile/bswap.rs
  bf288f5c0e5145fb8d4726a44c5a66a2  gcc/testsuite/rust/compile/bug-with-default-generic.rs
  8df49cd8be0ccc61f2a2b4e3b40cadaa  gcc/testsuite/rust/compile/bytecharstring.rs
  47f2827b01658a867a4f66627f986611  gcc/testsuite/rust/compile/canonical_paths1.rs
*************** ba8eb2757bc78189858e9e26e5824617  gcc/te
*** 128838,128843 ****
--- 128892,128898 ----
  fd3430794cae9e0c8498cd130b9f317d  gcc/testsuite/rust/compile/cfg5.rs
  bceae929921f63e108cf2b6721f481e1  gcc/testsuite/rust/compile/cfg6.rs
  c884fefd900231e35653f1a0c53cd49a  gcc/testsuite/rust/compile/changed_intrinsics.rs
+ 246dda43fb2abc028d1bfb33a1857032  gcc/testsuite/rust/compile/cli_inner_attribute_injection.rs
  144208587d1da5c72d54f5136d3aeea5  gcc/testsuite/rust/compile/closure_in_closure.rs
  8c98b46e704d13d47cba917233ecfb0a  gcc/testsuite/rust/compile/closure_move_expr.rs
  514b6cc95fda2022cc64dc749b80bd68  gcc/testsuite/rust/compile/closure_no_type_anno.rs
*************** b923aeb3b899eb38e6171f196d629aa4  gcc/te
*** 128915,128925 ****
  8f3ba2239e7c3fe8d7c05028be2fab35  gcc/testsuite/rust/compile/doc_isolated_cr_inner_block_comment.rs
  b9d63212cced17f6d52eb1b38435a8bc  gcc/testsuite/rust/compile/doc_isolated_cr_inner_line_comment.rs
  325f757f357f27fb55dacdaed8f24d6a  gcc/testsuite/rust/compile/doc_isolated_cr_line_comment.rs
! d446d1bc40f6a362ecb597e28427efad  gcc/testsuite/rust/compile/doc_macro.rs
  ffccd19a7721d4e438526bc94d785560  gcc/testsuite/rust/compile/dropck_eyepatch_feature_gate.rs
  95d3e14a4c9c5b1fb5d1171f270642c7  gcc/testsuite/rust/compile/dup_fields.rs
  7d596256980e172cd54a08f34b7f7d48  gcc/testsuite/rust/compile/e0579-neg-float-fail.rs
  f73c3350fbe5e538bfe6eef0852dc34a  gcc/testsuite/rust/compile/e0579-neg-float.rs
  68b329da9893e34099c7d8ad5cb9c940  gcc/testsuite/rust/compile/empty.in
  564795495212ff88b9e379884a8dac14  gcc/testsuite/rust/compile/empty_comment_before_match.rs
  d41d8cd98f00b204e9800998ecf8427e  gcc/testsuite/rust/compile/empty_file
--- 128970,128981 ----
  8f3ba2239e7c3fe8d7c05028be2fab35  gcc/testsuite/rust/compile/doc_isolated_cr_inner_block_comment.rs
  b9d63212cced17f6d52eb1b38435a8bc  gcc/testsuite/rust/compile/doc_isolated_cr_inner_line_comment.rs
  325f757f357f27fb55dacdaed8f24d6a  gcc/testsuite/rust/compile/doc_isolated_cr_line_comment.rs
! 3c60f53ca4f8f94aecaf505552d4d13d  gcc/testsuite/rust/compile/doc_macro.rs
  ffccd19a7721d4e438526bc94d785560  gcc/testsuite/rust/compile/dropck_eyepatch_feature_gate.rs
  95d3e14a4c9c5b1fb5d1171f270642c7  gcc/testsuite/rust/compile/dup_fields.rs
  7d596256980e172cd54a08f34b7f7d48  gcc/testsuite/rust/compile/e0579-neg-float-fail.rs
  f73c3350fbe5e538bfe6eef0852dc34a  gcc/testsuite/rust/compile/e0579-neg-float.rs
+ 1fd7ee16cfd3d5b9090854016d939af7  gcc/testsuite/rust/compile/early_feature_gate_in_macro.rs
  68b329da9893e34099c7d8ad5cb9c940  gcc/testsuite/rust/compile/empty.in
  564795495212ff88b9e379884a8dac14  gcc/testsuite/rust/compile/empty_comment_before_match.rs
  d41d8cd98f00b204e9800998ecf8427e  gcc/testsuite/rust/compile/empty_file
*************** bc7d95d930db5b5c1261a29cfdf0245f  gcc/te
*** 129230,129236 ****
  3b228b6476d4584550f094af0d723495  gcc/testsuite/rust/compile/issue-3657.rs
  312cde128ae0618e5c3ecf15c1729317  gcc/testsuite/rust/compile/issue-3659.rs
  f8fd7162517c8db4e0786228026d5021  gcc/testsuite/rust/compile/issue-3660.rs
! a69fe053523875818132d0e30153a513  gcc/testsuite/rust/compile/issue-3661.rs
  a8e1b026193dce378d9b61f1c932a52c  gcc/testsuite/rust/compile/issue-3662.rs
  e2b37685e29cbbd0517e0640b0f65422  gcc/testsuite/rust/compile/issue-3663.rs
  118d2d6a0e98f6be088f4e92751c9486  gcc/testsuite/rust/compile/issue-3664.rs
--- 129286,129292 ----
  3b228b6476d4584550f094af0d723495  gcc/testsuite/rust/compile/issue-3657.rs
  312cde128ae0618e5c3ecf15c1729317  gcc/testsuite/rust/compile/issue-3659.rs
  f8fd7162517c8db4e0786228026d5021  gcc/testsuite/rust/compile/issue-3660.rs
! 47fa7a41133cad8c725f0f7b3011380e  gcc/testsuite/rust/compile/issue-3661.rs
  a8e1b026193dce378d9b61f1c932a52c  gcc/testsuite/rust/compile/issue-3662.rs
  e2b37685e29cbbd0517e0640b0f65422  gcc/testsuite/rust/compile/issue-3663.rs
  118d2d6a0e98f6be088f4e92751c9486  gcc/testsuite/rust/compile/issue-3664.rs
*************** cec06f4231a994c0d8b265b80d8949b7  gcc/te
*** 129253,129259 ****
  69cfa809b39b2162d4ade3fc83da9bd6  gcc/testsuite/rust/compile/issue-3929-1.rs
  7133ee2e1f25ec5051f109acc5c9c1da  gcc/testsuite/rust/compile/issue-3929-2.rs
  f57698e0b7aa840adb5238d6c5215443  gcc/testsuite/rust/compile/issue-3930.rs
! 5091d62ea46fcbf4c78425e70d937848  gcc/testsuite/rust/compile/issue-3947.rs
  1fab94333827efc3e18d73d62cc7dce4  gcc/testsuite/rust/compile/issue-3958.rs
  12938cfae91a8f89b8867fcddd0318d4  gcc/testsuite/rust/compile/issue-3960.rs
  ee58b560afd747660d7c246708e54ea2  gcc/testsuite/rust/compile/issue-3965-1.rs
--- 129309,129316 ----
  69cfa809b39b2162d4ade3fc83da9bd6  gcc/testsuite/rust/compile/issue-3929-1.rs
  7133ee2e1f25ec5051f109acc5c9c1da  gcc/testsuite/rust/compile/issue-3929-2.rs
  f57698e0b7aa840adb5238d6c5215443  gcc/testsuite/rust/compile/issue-3930.rs
! 4eb8cf8afb4801d6faf4f7f05e232444  gcc/testsuite/rust/compile/issue-3947.rs
! 78bd435c99d769e1d956c861153a2ad7  gcc/testsuite/rust/compile/issue-3951.rs
  1fab94333827efc3e18d73d62cc7dce4  gcc/testsuite/rust/compile/issue-3958.rs
  12938cfae91a8f89b8867fcddd0318d4  gcc/testsuite/rust/compile/issue-3960.rs
  ee58b560afd747660d7c246708e54ea2  gcc/testsuite/rust/compile/issue-3965-1.rs
*************** c68fada68436ff9bede7e8e38b3db37f  gcc/te
*** 129284,129290 ****
  9bc37769eb10d8305459bb40928ec2f4  gcc/testsuite/rust/compile/issue-4166.rs
  610ad666e072f89c564434a0597df717  gcc/testsuite/rust/compile/issue-4168.rs
  bba85eca8c3804e196d2b890587c5419  gcc/testsuite/rust/compile/issue-4188.rs
! e52663a29f17a9da6c66434351784672  gcc/testsuite/rust/compile/issue-4212.rs
  bd749f9bfd29e6667e7e252ad4fcb308  gcc/testsuite/rust/compile/issue-4213.rs
  fefe8876b61f2ea8b2778fe5218b58d9  gcc/testsuite/rust/compile/issue-4219.rs
  8c94b3e7c76d776d5d6ea7583a0cc936  gcc/testsuite/rust/compile/issue-4222.rs
--- 129341,129347 ----
  9bc37769eb10d8305459bb40928ec2f4  gcc/testsuite/rust/compile/issue-4166.rs
  610ad666e072f89c564434a0597df717  gcc/testsuite/rust/compile/issue-4168.rs
  bba85eca8c3804e196d2b890587c5419  gcc/testsuite/rust/compile/issue-4188.rs
! 6fe7039fbe2f615d3d3401d6d88ab506  gcc/testsuite/rust/compile/issue-4212.rs
  bd749f9bfd29e6667e7e252ad4fcb308  gcc/testsuite/rust/compile/issue-4213.rs
  fefe8876b61f2ea8b2778fe5218b58d9  gcc/testsuite/rust/compile/issue-4219.rs
  8c94b3e7c76d776d5d6ea7583a0cc936  gcc/testsuite/rust/compile/issue-4222.rs
*************** cb6448e8e2e1b415379859fe50662527  gcc/te
*** 129308,129315 ****
--- 129365,129375 ----
  034889a419ac9faab98a1622dfe46575  gcc/testsuite/rust/compile/issue-4388.rs
  ac198e811e4f3f12acac069097654e3d  gcc/testsuite/rust/compile/issue-4402.rs
  44ab13aab8e256b568ca92ab03f8f569  gcc/testsuite/rust/compile/issue-4410.rs
+ c03b00d1b60c9cd97339d874d8ba7613  gcc/testsuite/rust/compile/issue-4411.rs
  b9dece72b980e6878e0b9c8f92233dad  gcc/testsuite/rust/compile/issue-4412.rs
+ 6e2900f5f167d67ed6e69842a0ef2a48  gcc/testsuite/rust/compile/issue-4413.rs
  7835d03556e24617123ceaf32f087c93  gcc/testsuite/rust/compile/issue-4414.rs
+ a54fd203759501635c8dded722e53305  gcc/testsuite/rust/compile/issue-4433.rs
  a814a3e2cad8eccf8272598f00384a38  gcc/testsuite/rust/compile/issue-557.rs
  93b8051018ad8ff1a45c001b33db9697  gcc/testsuite/rust/compile/issue-635-1.rs
  45b28bac74e6ab3db3594e805656e836  gcc/testsuite/rust/compile/issue-635-2.rs
*************** a5a18a8f356069323791aec9fd9f814f  gcc/te
*** 129469,129474 ****
--- 129529,129535 ----
  fef45a7ecdc3f94c20f5bedf91a3005e  gcc/testsuite/rust/compile/match-never-rtype.rs
  40bd65f984fa8cfa035606e5f325370a  gcc/testsuite/rust/compile/match-restpattern-tuple-1.rs
  c810d046836ba823a23bc9d5ec6c707e  gcc/testsuite/rust/compile/match-restpattern-tuple-2.rs
+ 39c6ae282dba15a3530638db64738c0b  gcc/testsuite/rust/compile/match-scope.rs
  d0bd7fb890101c1b7b872de5eb2d3823  gcc/testsuite/rust/compile/match-slicepattern-array.rs
  358dbaf51f260ecd2d04888d03545af5  gcc/testsuite/rust/compile/match-slicepattern-slice.rs
  3f4f4c943e7dc8d1e5e6c748a6b4e25f  gcc/testsuite/rust/compile/match-struct-path.rs
*************** aeb9642a91d5044e08975199bda7f2b7  gcc/te
*** 129543,129548 ****
--- 129604,129610 ----
  b489b1ce6e7581bb80db81f93d8672d5  gcc/testsuite/rust/compile/nested_macro_use3.rs
  f159ce03b1d0ade06a353e46a520eeff  gcc/testsuite/rust/compile/never_type1.rs
  c97542e19c49bdb1c1e6093f0d15ec85  gcc/testsuite/rust/compile/no-crate-level-outer-attr.rs
+ ef10078e5cc72b7aa58ddd6f57415ed9  gcc/testsuite/rust/compile/no_core_feature_gate.rs
  cba1a4379934d707369e076d94501ff0  gcc/testsuite/rust/compile/no_mangle-malformed.rs
  cef42490f234ffc267de19e41732f4d9  gcc/testsuite/rust/compile/non-snake-case_0.rs
  e00a3ea37078ff74ef1a8388f56054ec  gcc/testsuite/rust/compile/non-upper-case-globals_0.rs
*************** ffe4dc915956341c38692d2c83ae269e  gcc/te
*** 129571,129576 ****
--- 129633,129639 ----
  ad92a0c142ea935286208a3f203656a7  gcc/testsuite/rust/compile/parse_simple_path_fail_1.rs
  3f996bd45c64270bd4d6d1d1ce90ac29  gcc/testsuite/rust/compile/parse_simple_path_fail_2.rs
  bda5856f76b41c9208ff016ef1f50a1e  gcc/testsuite/rust/compile/parse_specialization.rs
+ ca032b32a168e2722b77943ddc4955a7  gcc/testsuite/rust/compile/parse_time_feature_gate.rs
  d47bb2df5d518b3c7a28d2063bcac758  gcc/testsuite/rust/compile/parse_variadic_function.rs
  881f42ff86c88cc9b212d26005d2ab38  gcc/testsuite/rust/compile/path_as_generic_arg.rs
  782570514ed597a3ae13c94d445c203d  gcc/testsuite/rust/compile/pattern-or.rs
*************** c23f1d4a4c6f02f27b213710344a799e  gcc/te
*** 130007,130012 ****
--- 130070,130081 ----
  1482c00d967199586908ea2d1b99cab3  gcc/testsuite/rust/compile/while_let1.rs
  6a17e86d478051c06f47f98287e03753  gcc/testsuite/rust/compile/while_let_expr.rs
  41e2743bf7d1b5e5cdfa4e256a33f343  gcc/testsuite/rust/compile/while_let_without_label.rs
+ c173102cb60831a295fb2d377c8c8e40  gcc/testsuite/rust/compile/wildcard_const.rs
+ 02c717ea83c4a29c0714c66552a28af6  gcc/testsuite/rust/compile/wildcard_enum.rs
+ 632863601dd9465128b3525d8ffdc88a  gcc/testsuite/rust/compile/wildcard_enum_variant.rs
+ e413a48f4b0d28d6a97333ffcb40e45e  gcc/testsuite/rust/compile/wildcard_static.rs
+ b3e0d8d7a91af4a93e3073a94da37df2  gcc/testsuite/rust/compile/wildcard_struct.rs
+ 21f7fea64d87764ee5aabd1ebcffc260  gcc/testsuite/rust/compile/wildcard_variable.rs
  eafc3609e718433c38b4e9ce138045eb  gcc/testsuite/rust/compile/wrong_lhs_assignment.rs
  174dc42c47e7e8a66a613d4b2abd2413  gcc/testsuite/rust/compile/wrong_no_of_parameters.rs
  4927c8b0652eb932ad1b41cff0243028  gcc/testsuite/rust/compile/xfail/lifetime_param.rs
*************** cabed98da33089ea15090f29e224f0fa  gcc/te
*** 130025,130030 ****
--- 130094,130100 ----
  c7800d2a071ca2035e1e11d541d30282  gcc/testsuite/rust/debug/tuple.rs
  28335e6adaa7ca29f05ca2cad1ffd1c3  gcc/testsuite/rust/debug/win64-abi.rs
  66f1763e73f2ea3328ba2b4ceaa057d0  gcc/testsuite/rust/execute/black_box.rs
+ 62ba180d7563201b9ef58cd0f08239e4  gcc/testsuite/rust/execute/bswap.rs
  4f364d5e8f1e982f8dd260d4e285ddcb  gcc/testsuite/rust/execute/crate-metavar1.rs
  ee134a130743701047cd96c1fbf6fd01  gcc/testsuite/rust/execute/execute.exp
  ee23f2ac9014108d621746737e1803e4  gcc/testsuite/rust/execute/inline_asm_inout_ident.rs
*************** acbdb2a52c48f79bcb1475fd517ef128  gcc/te
*** 130187,130193 ****
  d8d0b1d8a3198c7655ff0f8dc3ee75a5  gcc/testsuite/rust/execute/torture/match-slicepattern-array-2.rs
  f4d5d7bbb110b69a743cb9188ae26b44  gcc/testsuite/rust/execute/torture/match-slicepattern-slice-1.rs
  65a00185f210ade402e1a27b232a07d0  gcc/testsuite/rust/execute/torture/match-slicepattern-slice-2.rs
! 25de97af40d2241a2017b385f95cd9e9  gcc/testsuite/rust/execute/torture/match-structpattern-tuplefield.rs
  ed67e582829619bb8e53c30b1f4ef22e  gcc/testsuite/rust/execute/torture/match-tuplestructpattern-rest-1.rs
  8fb4e5f7e9231dc04a7ac913a6901fef  gcc/testsuite/rust/execute/torture/match-tuplestructpattern-rest-2.rs
  24e7d6398088dc9b9c532f62cf47be89  gcc/testsuite/rust/execute/torture/match-tuplestructpattern.rs
--- 130257,130263 ----
  d8d0b1d8a3198c7655ff0f8dc3ee75a5  gcc/testsuite/rust/execute/torture/match-slicepattern-array-2.rs
  f4d5d7bbb110b69a743cb9188ae26b44  gcc/testsuite/rust/execute/torture/match-slicepattern-slice-1.rs
  65a00185f210ade402e1a27b232a07d0  gcc/testsuite/rust/execute/torture/match-slicepattern-slice-2.rs
! 9f7089ef8fced9dc18b144b1cd113dd8  gcc/testsuite/rust/execute/torture/match-structpattern-tuplefield.rs
  ed67e582829619bb8e53c30b1f4ef22e  gcc/testsuite/rust/execute/torture/match-tuplestructpattern-rest-1.rs
  8fb4e5f7e9231dc04a7ac913a6901fef  gcc/testsuite/rust/execute/torture/match-tuplestructpattern-rest-2.rs
  24e7d6398088dc9b9c532f62cf47be89  gcc/testsuite/rust/execute/torture/match-tuplestructpattern.rs
*************** a24cff30baef257a999b4fac3ca47d5a  gcc/tr
*** 130445,130451 ****
  45c5e55c37764fad83ea33411f4eb348  gcc/tree-pretty-print.cc
  c021bc7a8aa59f2b8184de8bff6b1d14  gcc/tree-pretty-print.h
  88c71d89922e91e7003038f3166556ee  gcc/tree-profile.cc
! a39e1901dac55b45c25e4542501e20ff  gcc/tree-scalar-evolution.cc
  0ac41331ad8cbe754ee005d5ef9aff94  gcc/tree-scalar-evolution.h
  17c4c00ded2905c04437f79e44e63c75  gcc/tree-sra.cc
  3c8e89a03a1e2e77a99e5b05bb2976ae  gcc/tree-sra.h
--- 130515,130521 ----
  45c5e55c37764fad83ea33411f4eb348  gcc/tree-pretty-print.cc
  c021bc7a8aa59f2b8184de8bff6b1d14  gcc/tree-pretty-print.h
  88c71d89922e91e7003038f3166556ee  gcc/tree-profile.cc
! 1c083b3b5e93b4a862d00afdc7110007  gcc/tree-scalar-evolution.cc
  0ac41331ad8cbe754ee005d5ef9aff94  gcc/tree-scalar-evolution.h
  17c4c00ded2905c04437f79e44e63c75  gcc/tree-sra.cc
  3c8e89a03a1e2e77a99e5b05bb2976ae  gcc/tree-sra.h
*************** fa83f982a805985b3a3da2ca5e10e43a  gcc/tr
*** 130489,130501 ****
  f83d0b12185538e6f679296bebfe3d2f  gcc/tree-ssa-operands.h
  ba27d633db52c7d11f4cd30e1d5ca251  gcc/tree-ssa-phiopt.cc
  449b769bbd461c05c5cd26af91829d37  gcc/tree-ssa-phiprop.cc
! 9e8fa18fcd80eac2ecc935defc6a92f8  gcc/tree-ssa-pre.cc
  c4d808a5a97aafd0f847b4cb7aea56b2  gcc/tree-ssa-propagate.cc
  d38017eb69a50f24b5e47ee97928afde  gcc/tree-ssa-propagate.h
  1f64e1425bb8bc82e544c5f49f89b084  gcc/tree-ssa-reassoc.cc
  82a2c700ac2e32f106bcbd11fc5cf152  gcc/tree-ssa-reassoc.h
! b8f792d089265598daea56500282890f  gcc/tree-ssa-sccvn.cc
! 9b0da40767981c9bb917d64c14b2a7c1  gcc/tree-ssa-sccvn.h
  43b66558734f8fe9fec03260c6814f6b  gcc/tree-ssa-scopedtables.cc
  f9f30b312deca96b11a781af60153767  gcc/tree-ssa-scopedtables.h
  3b2415ac4cc87839b64bcb95bc5ba760  gcc/tree-ssa-sink.cc
--- 130559,130571 ----
  f83d0b12185538e6f679296bebfe3d2f  gcc/tree-ssa-operands.h
  ba27d633db52c7d11f4cd30e1d5ca251  gcc/tree-ssa-phiopt.cc
  449b769bbd461c05c5cd26af91829d37  gcc/tree-ssa-phiprop.cc
! 4ae450b50907825a38ea9c6b0e4375d3  gcc/tree-ssa-pre.cc
  c4d808a5a97aafd0f847b4cb7aea56b2  gcc/tree-ssa-propagate.cc
  d38017eb69a50f24b5e47ee97928afde  gcc/tree-ssa-propagate.h
  1f64e1425bb8bc82e544c5f49f89b084  gcc/tree-ssa-reassoc.cc
  82a2c700ac2e32f106bcbd11fc5cf152  gcc/tree-ssa-reassoc.h
! 78a32089c71db0d4d54d301a5f02e34c  gcc/tree-ssa-sccvn.cc
! 969557a6ff2537ae4a6d36fde566e436  gcc/tree-ssa-sccvn.h
  43b66558734f8fe9fec03260c6814f6b  gcc/tree-ssa-scopedtables.cc
  f9f30b312deca96b11a781af60153767  gcc/tree-ssa-scopedtables.h
  3b2415ac4cc87839b64bcb95bc5ba760  gcc/tree-ssa-sink.cc
*************** e316eddfbf9a02433a4ee93e648f3aa4  gcc/tr
*** 130529,130538 ****
  9d1d629a67b789d8cb739163675798bd  gcc/tree-vect-data-refs.cc
  a423c268d5ba9ac563732fd6d038c572  gcc/tree-vect-generic.cc
  5945009d0ba922b53aacbb6f724d3caf  gcc/tree-vect-loop-manip.cc
! 3c53ffe24391a7754e0cb8fe0186494d  gcc/tree-vect-loop.cc
  b65839ac30937104b9a0643233f69538  gcc/tree-vect-patterns.cc
  ef0b51a362b8764cf6b0628ed16b2dde  gcc/tree-vect-slp-patterns.cc
! 9136f1f28ed76d0dd737074abc82bad2  gcc/tree-vect-slp.cc
  869589c9d9d30dd6d1c4b36f06f34046  gcc/tree-vect-stmts.cc
  42032e04f389a2e0f43fbb46ac091dac  gcc/tree-vector-builder.cc
  4a1b4947e64a076fdca46d14aab2181f  gcc/tree-vector-builder.h
--- 130599,130608 ----
  9d1d629a67b789d8cb739163675798bd  gcc/tree-vect-data-refs.cc
  a423c268d5ba9ac563732fd6d038c572  gcc/tree-vect-generic.cc
  5945009d0ba922b53aacbb6f724d3caf  gcc/tree-vect-loop-manip.cc
! 3227122daaa1ca0d23803d9aa1d45f8c  gcc/tree-vect-loop.cc
  b65839ac30937104b9a0643233f69538  gcc/tree-vect-patterns.cc
  ef0b51a362b8764cf6b0628ed16b2dde  gcc/tree-vect-slp-patterns.cc
! 707f7b3fc443bd2a72f60b04fa5e726a  gcc/tree-vect-slp.cc
  869589c9d9d30dd6d1c4b36f06f34046  gcc/tree-vect-stmts.cc
  42032e04f389a2e0f43fbb46ac091dac  gcc/tree-vector-builder.cc
  4a1b4947e64a076fdca46d14aab2181f  gcc/tree-vector-builder.h
*************** cffdeae41b78da05839b193e90188f55  libcod
*** 130875,130881 ****
  6419dfc879387358e95288142e569914  libcody/packet.cc
  688ece05c8b9d378b3df186808162e76  libcody/resolver.cc
  c94add0032978604acf65591bb86d2d6  libcody/server.cc
! d5ff9f3fdbcfece840d0943d41acca71  libcpp/ChangeLog
  2bd831b17997584e38305782cebe6948  libcpp/ChangeLog.jit
  4f1e80b433907c013fc6e4eaf2b0e8aa  libcpp/Makefile.in
  b07c7863f0e7ad4e6a0915d66fc9e582  libcpp/aclocal.m4
--- 130945,130951 ----
  6419dfc879387358e95288142e569914  libcody/packet.cc
  688ece05c8b9d378b3df186808162e76  libcody/resolver.cc
  c94add0032978604acf65591bb86d2d6  libcody/server.cc
! 5ce3dc8120ac2db206d3a499d6ffea98  libcpp/ChangeLog
  2bd831b17997584e38305782cebe6948  libcpp/ChangeLog.jit
  4f1e80b433907c013fc6e4eaf2b0e8aa  libcpp/Makefile.in
  b07c7863f0e7ad4e6a0915d66fc9e582  libcpp/aclocal.m4
*************** a5730f5ab9435bb5d8446830fe8f3706  libcpp
*** 130899,130905 ****
  5a44adf11235c72de2f0c0e89db76903  libcpp/init.cc
  5dd7b91660095eb30390141c1882293c  libcpp/internal.h
  eec01dea6d3427e2180f77d3002420b8  libcpp/lex.cc
! 83122fc92aa10f8e0e147c53f782a3d0  libcpp/line-map.cc
  46a07100f95f5e354c7e25cd19d26884  libcpp/location-example.txt
  8fdce4dfce3a69798f4bcfddbc367465  libcpp/macro.cc
  d26583cbbddfb0c82d15d845129a84da  libcpp/makeucnid.cc
--- 130969,130975 ----
  5a44adf11235c72de2f0c0e89db76903  libcpp/init.cc
  5dd7b91660095eb30390141c1882293c  libcpp/internal.h
  eec01dea6d3427e2180f77d3002420b8  libcpp/lex.cc
! 249925d70293b09b52183c1e2c75784d  libcpp/line-map.cc
  46a07100f95f5e354c7e25cd19d26884  libcpp/location-example.txt
  8fdce4dfce3a69798f4bcfddbc367465  libcpp/macro.cc
  d26583cbbddfb0c82d15d845129a84da  libcpp/makeucnid.cc
*************** a3eb5dee2788fe0a6c42502ba658eddd  libffi
*** 131399,131415 ****
  0f3c94e520870e194cf525de7ec404dc  libffi/testsuite/libffi.go/ffitest.h
  6cfb66c1c00023abb2c2276d85f16e77  libffi/testsuite/libffi.go/go.exp
  189dc193fd0e627a2d55b2e84871edc5  libffi/testsuite/libffi.go/static-chain.h
! 60a80554da6b637bb90a55853e14b448  libga68/ChangeLog
! f95782f9b32b17d5d143a7e81c335a2f  libga68/Makefile.am
! 686146919638ff3e31ef494a28f75855  libga68/Makefile.in
  e582170826a5049ebe5f76ccb66fe5f2  libga68/README
  b448cc4384a1f4e710c59734055b7e8a  libga68/acinclude.m4
  32da020621b62d1b431988a5525d7995  libga68/aclocal.m4
  cf6be962dfa097e1e50ffbb773452c38  libga68/config.h.in
! 37187e5a42fcecfef1a467140c165e7e  libga68/configure
! 1b45ba632e248a206c0fd70c7648f70d  libga68/configure.ac
  7caddd973773320b8d4520f3e575b2b1  libga68/ga68-alloc.c
  ab4bfff29b367495b338f951fb77ffd9  libga68/ga68-error.c
  432cfa7a4d9e1f17f6161ac30835ee60  libga68/ga68-posix.c
  12f59efc2c02c8e22bec45f9a718e690  libga68/ga68-standenv.c
  7aca1e001fafa5f4c00e9f7b50aca002  libga68/ga68-unistr.c
--- 131469,131487 ----
  0f3c94e520870e194cf525de7ec404dc  libffi/testsuite/libffi.go/ffitest.h
  6cfb66c1c00023abb2c2276d85f16e77  libffi/testsuite/libffi.go/go.exp
  189dc193fd0e627a2d55b2e84871edc5  libffi/testsuite/libffi.go/static-chain.h
! e527d5f983ffbc8cda6f01760a006fb3  libga68/ChangeLog
! e53a0cec9bb8b49f90bb24ae600d40c2  libga68/Makefile.am
! efd838737ec792d60d8a967829c76fca  libga68/Makefile.in
  e582170826a5049ebe5f76ccb66fe5f2  libga68/README
  b448cc4384a1f4e710c59734055b7e8a  libga68/acinclude.m4
  32da020621b62d1b431988a5525d7995  libga68/aclocal.m4
  cf6be962dfa097e1e50ffbb773452c38  libga68/config.h.in
! 9ce9f85ba4afeed174094f6c87680198  libga68/configure
! b9e84a6b8a8170075072542d2e2e0db1  libga68/configure.ac
! 4195f62f6a0f023662ec3388dcd397dc  libga68/floor.c
  7caddd973773320b8d4520f3e575b2b1  libga68/ga68-alloc.c
  ab4bfff29b367495b338f951fb77ffd9  libga68/ga68-error.c
+ 67cd7aeea0aa28f2dfa7d11f4c5380a3  libga68/ga68-math.c
  432cfa7a4d9e1f17f6161ac30835ee60  libga68/ga68-posix.c
  12f59efc2c02c8e22bec45f9a718e690  libga68/ga68-standenv.c
  7aca1e001fafa5f4c00e9f7b50aca002  libga68/ga68-unistr.c
*************** aa424ddf6a9e4e08b8023d3d5b371a0d  libgfo
*** 133101,133108 ****
  09537a69736f655d1e0ccf28367d3ddf  libgfortran/ChangeLog-2024
  a1bbe79151b753b8b25205a178953376  libgfortran/ChangeLog-2025
  7a9dd3c91b585f18a8d8a30c6e60d98f  libgfortran/ISO_Fortran_binding.h
! e8371bc82ca9a6639545706b463f0fcf  libgfortran/Makefile.am
! 0dc0f8061116027a8ef3a32ec869ac94  libgfortran/Makefile.in
  c5e012ba3cb276dcf788c967b987a900  libgfortran/acinclude.m4
  0cd952008678ed894c7ee40d58f1e6d4  libgfortran/aclocal.m4
  6d4f5918ea5082a0bc3b9bbe3455b876  libgfortran/c99_protos.h
--- 133173,133180 ----
  09537a69736f655d1e0ccf28367d3ddf  libgfortran/ChangeLog-2024
  a1bbe79151b753b8b25205a178953376  libgfortran/ChangeLog-2025
  7a9dd3c91b585f18a8d8a30c6e60d98f  libgfortran/ISO_Fortran_binding.h
! 7cbace53ae182714e1886f1b5a55cae3  libgfortran/Makefile.am
! 522a3cc18b6cc7649382a83428097815  libgfortran/Makefile.in
  c5e012ba3cb276dcf788c967b987a900  libgfortran/acinclude.m4
  0cd952008678ed894c7ee40d58f1e6d4  libgfortran/aclocal.m4
  6d4f5918ea5082a0bc3b9bbe3455b876  libgfortran/c99_protos.h
*************** ac74e4020ecd3c7da1e7f62154e313ae  libgfo
*** 133142,133149 ****
  a3016b0ad57cd1fac79d02298c4bb67e  libgfortran/config/fpu-sysv.h
  f9917563df7bac5d534cef935bdce401  libgfortran/config/t-aix
  3e9dd2029734b8f2c6a1eb2a364d1cbf  libgfortran/config/t-nvptx
! f657190b45328b1a5ef909065916b880  libgfortran/configure
! 358bcc72fb1e862659455203dd5ee6d1  libgfortran/configure.ac
  78e88d1cf66770f3359f0a232708eb4b  libgfortran/configure.host
  af09dd745a601ab5f0fb73fde635b041  libgfortran/generated/_abs_c10.F90
  67b33ddf5ad8c3dd65160a502c481ea8  libgfortran/generated/_abs_c16.F90
--- 133214,133221 ----
  a3016b0ad57cd1fac79d02298c4bb67e  libgfortran/config/fpu-sysv.h
  f9917563df7bac5d534cef935bdce401  libgfortran/config/t-aix
  3e9dd2029734b8f2c6a1eb2a364d1cbf  libgfortran/config/t-nvptx
! 25763349588d3a6488e975e6b84cee06  libgfortran/configure
! 8cc93ddc1cb305dfe39da878e0ff14cb  libgfortran/configure.ac
  78e88d1cf66770f3359f0a232708eb4b  libgfortran/configure.host
  af09dd745a601ab5f0fb73fde635b041  libgfortran/generated/_abs_c10.F90
  67b33ddf5ad8c3dd65160a502c481ea8  libgfortran/generated/_abs_c16.F90
*************** a3a7e9ca6057da9ca42e03e41e1c73f7  libgo/
*** 139663,139669 ****
  dcdf1b680b15b372bdb64cc5107d51b6  libgo/testsuite/libgo-test-support.exp.in
  bf162aa572f7b96b25dbd2b027845d32  libgo/testsuite/libgo.testmain/testmain.exp
  cc9d2a0e34e31ba866a8caf9f46f48f3  libgomp/.gitattributes
! 5bb1c77903976770a9e0be8f93124f8a  libgomp/ChangeLog
  0d55aa862aee66efdc5f8d62c94ff8fb  libgomp/ChangeLog.graphite
  714e3b9c0810a61df01246c2a97e825a  libgomp/Makefile.am
  ebb578201b0bfde5d8221fca34ee44c4  libgomp/Makefile.in
--- 139735,139741 ----
  dcdf1b680b15b372bdb64cc5107d51b6  libgo/testsuite/libgo-test-support.exp.in
  bf162aa572f7b96b25dbd2b027845d32  libgo/testsuite/libgo.testmain/testmain.exp
  cc9d2a0e34e31ba866a8caf9f46f48f3  libgomp/.gitattributes
! 0c8d48d3b7f3b180cb67e42d9ae373a9  libgomp/ChangeLog
  0d55aa862aee66efdc5f8d62c94ff8fb  libgomp/ChangeLog.graphite
  714e3b9c0810a61df01246c2a97e825a  libgomp/Makefile.am
  ebb578201b0bfde5d8221fca34ee44c4  libgomp/Makefile.in
*************** ebb578201b0bfde5d8221fca34ee44c4  libgom
*** 139673,139678 ****
--- 139745,139751 ----
  a518e5f5538c5ff629ba3a8f88128480  libgomp/affinity-fmt.c
  06478025336afe5fce9b998b4c7710b1  libgomp/affinity.c
  44e82ee5e47677da6205a78497c6a566  libgomp/alloc.c
+ 0c08d5aa3b537038621b9e3d7c3f28df  libgomp/alloc_cache.h
  12ab55336a2acd6f64e98c5b5cab7084  libgomp/allocator.c
  9be4323f25d5a03ee903e8e5a5aa76bd  libgomp/atomic.c
  57adabf6519fd5d55b63b9989528fd44  libgomp/barrier.c
*************** a62dffa247a816d54bad922ce4d47aa0  libgom
*** 139836,139842 ****
  fab10af27c836c7b90303245f3965cb8  libgomp/plugin/configfrag.ac
  64303d9a5e264784832990b27405c4aa  libgomp/plugin/cuda-lib.def
  d024ec56acbc3411cedc7899b8bbdd02  libgomp/plugin/mutex.c
! 7ec742943e567767512e4e377ef0485a  libgomp/plugin/plugin-gcn.c
  c48f5698d6513fa80e32b3b410f3a9d9  libgomp/plugin/plugin-nvptx.c
  575940d2b8e2a941f78af850aac28928  libgomp/priority_queue.c
  c88620bad36f9c420348d0508bd4b346  libgomp/priority_queue.h
--- 139909,139915 ----
  fab10af27c836c7b90303245f3965cb8  libgomp/plugin/configfrag.ac
  64303d9a5e264784832990b27405c4aa  libgomp/plugin/cuda-lib.def
  d024ec56acbc3411cedc7899b8bbdd02  libgomp/plugin/mutex.c
! 6ff74ca26db9780ff90c583924b28d74  libgomp/plugin/plugin-gcn.c
  c48f5698d6513fa80e32b3b410f3a9d9  libgomp/plugin/plugin-nvptx.c
  575940d2b8e2a941f78af850aac28928  libgomp/priority_queue.c
  c88620bad36f9c420348d0508bd4b346  libgomp/priority_queue.h
*************** ed195dc04ac3e252f89029dee0bc9c05  libgom
*** 139849,139855 ****
  bbb8b404de421c08a4468a7c149897e3  libgomp/splay-tree.h
  1775f6ebbed5a9aef1882e66136d9e2b  libgomp/target-cxa-dso-dtor.c
  30bc692f400225cbdf51ebfdb41b44c5  libgomp/target-indirect.c
! daf636ece34560f99e1a4747508e77d9  libgomp/target.c
  61cd7db4cfc942c460e94493b86d69e2  libgomp/task.c
  7f9c7ebe470f1e58806b1136258bd786  libgomp/taskloop.c
  abb5e2202aa84d67c967b7dc176fc937  libgomp/team.c
--- 139922,139928 ----
  bbb8b404de421c08a4468a7c149897e3  libgomp/splay-tree.h
  1775f6ebbed5a9aef1882e66136d9e2b  libgomp/target-cxa-dso-dtor.c
  30bc692f400225cbdf51ebfdb41b44c5  libgomp/target-indirect.c
! 17e32c29f056ebd4d866c8d6f2062e15  libgomp/target.c
  61cd7db4cfc942c460e94493b86d69e2  libgomp/task.c
  7f9c7ebe470f1e58806b1136258bd786  libgomp/taskloop.c
  abb5e2202aa84d67c967b7dc176fc937  libgomp/team.c
*************** ae24e1c7b9fc9100ef17c4595417ef54  libgom
*** 140572,140577 ****
--- 140645,140652 ----
  cd282378dfef369c52bc05a158d78191  libgomp/testsuite/libgomp.c-c++-common/target-abi-struct-1-O0.c
  ff0a3002fdcbeebbbeec1630ff94b97b  libgomp/testsuite/libgomp.c-c++-common/target-abi-struct-1.c
  abbe672b8bd007021485cc55cdd01a55  libgomp/testsuite/libgomp.c-c++-common/target-cdtor-1.c
+ 788786bbf7cfbcb7f765c124ac996099  libgomp/testsuite/libgomp.c-c++-common/target-data-iterators-1.c
+ 70f06ca8f61361f4eed1987cd570f860  libgomp/testsuite/libgomp.c-c++-common/target-enter-data-iterators-1.c
  dcce6a2d3146ada05a00f632271e2669  libgomp/testsuite/libgomp.c-c++-common/target-has-device-addr-1.c
  038d0072f445d0120f15c605ec76e54a  libgomp/testsuite/libgomp.c-c++-common/target-imperfect-transform-1.c
  923df9fb10163f8d97c25a33b74c5b70  libgomp/testsuite/libgomp.c-c++-common/target-imperfect-transform-2.c
*************** d4069bee4bb64a7b1bc7c9545219e88c  libgom
*** 140614,140621 ****
  469b004815365e46140bcd8b826170ce  libgomp/testsuite/libgomp.c-c++-common/target-same-name-1-b.c
  d3ed63d8204ec7537fa5e6f47a76d83e  libgomp/testsuite/libgomp.c-c++-common/target-same-name-1.c
  f1b436bdbaa4b38fe6d32370519f68e3  libgomp/testsuite/libgomp.c-c++-common/target-update-iterators-1.c
! cde74e18484ff23e829ac3c95bcde854  libgomp/testsuite/libgomp.c-c++-common/target-update-iterators-2.c
! 4e87ff4920e50f68d51703a7079e191c  libgomp/testsuite/libgomp.c-c++-common/target-update-iterators-3.c
  5232d615b2109b50002b7e6eb8301a84  libgomp/testsuite/libgomp.c-c++-common/task-detach-1.c
  7f2f3a630783e68a54ffcd18a73085b2  libgomp/testsuite/libgomp.c-c++-common/task-detach-10.c
  bf2a6ba66b2350c597a56727abd53608  libgomp/testsuite/libgomp.c-c++-common/task-detach-11.c
--- 140689,140696 ----
  469b004815365e46140bcd8b826170ce  libgomp/testsuite/libgomp.c-c++-common/target-same-name-1-b.c
  d3ed63d8204ec7537fa5e6f47a76d83e  libgomp/testsuite/libgomp.c-c++-common/target-same-name-1.c
  f1b436bdbaa4b38fe6d32370519f68e3  libgomp/testsuite/libgomp.c-c++-common/target-update-iterators-1.c
! bb4a7b2ef99145f08080b51d17616c70  libgomp/testsuite/libgomp.c-c++-common/target-update-iterators-2.c
! 83a1d690b01fb85263e4671b715c783e  libgomp/testsuite/libgomp.c-c++-common/target-update-iterators-3.c
  5232d615b2109b50002b7e6eb8301a84  libgomp/testsuite/libgomp.c-c++-common/task-detach-1.c
  7f2f3a630783e68a54ffcd18a73085b2  libgomp/testsuite/libgomp.c-c++-common/task-detach-10.c
  bf2a6ba66b2350c597a56727abd53608  libgomp/testsuite/libgomp.c-c++-common/task-detach-11.c
*************** ad1652b5597cee1d0b32c5a47dde101b  libgom
*** 140698,140703 ****
--- 140773,140779 ----
  b337fafcc4aab6ca2cf6819ff7155330  libgomp/testsuite/libgomp.c/alloc-pinned-5.c
  8c364567b9614616b3e1cc9937fd6a6f  libgomp/testsuite/libgomp.c/alloc-pinned-6.c
  45e5d9ef68ea13e0845f6e419a059d85  libgomp/testsuite/libgomp.c/alloc-pinned-8.c
+ 61c5baca97c00793453ca1db0fa79fdb  libgomp/testsuite/libgomp.c/alloc_cache-1.c
  fcaebb2fe201ab9ca6d533e58c770386  libgomp/testsuite/libgomp.c/allocate-4.c
  c0ceb47334b72704392f09754c63b979  libgomp/testsuite/libgomp.c/allocate-5.c
  d0031291832976a7279d71c7c7337482  libgomp/testsuite/libgomp.c/allocate-6.c
*************** b018601a4e35da4037b1e04dfdb00b98  libgom
*** 141564,141569 ****
--- 141640,141646 ----
  5a38dd4751898fd9556aa9ed131fad76  libgomp/testsuite/libgomp.fortran/pr100981-2.f90
  327296ef9f336f2398d0e4c17fabdbd7  libgomp/testsuite/libgomp.fortran/pr113436-1.f90
  44b753e10d2a8e272c6d624bb12125cf  libgomp/testsuite/libgomp.fortran/pr113436-2.f90
+ bd4d373b7453a268a0da695bf8bf8f52  libgomp/testsuite/libgomp.fortran/pr120286.f90
  1e7de6c9f1376e7662fc088ab6ec5e64  libgomp/testsuite/libgomp.fortran/pr25162.f
  150790c35955da1ca1b74284c2553f34  libgomp/testsuite/libgomp.fortran/pr25219.f90
  a83bd562c0d1b609f2a71de244b3a1a0  libgomp/testsuite/libgomp.fortran/pr27395-1.f90
*************** a73d560a3ba317c5ad0a7919d87b4b6d  libssp
*** 145286,145292 ****
  7d75fa0d30318408fe4cd91d9cbe3ac7  libssp/vsnprintf-chk.c
  e9ff0f4bdd1be75a507480ed1267459d  libssp/vsprintf-chk.c
  9e2de2e1f20ab0ffa2201164de02824f  libstdc++-v3/.editorconfig
! 06f2f145187b4821fb253573f0a5a3ac  libstdc++-v3/ChangeLog
  7aa6c40440a44fcf5ec94c066160c2f8  libstdc++-v3/ChangeLog-1998
  7aff86600b6a1ed3fa87305075a92db0  libstdc++-v3/ChangeLog-1999
  a6f28e8fc9bb07696a9e068b439a3a87  libstdc++-v3/ChangeLog-2000
--- 145363,145369 ----
  7d75fa0d30318408fe4cd91d9cbe3ac7  libssp/vsnprintf-chk.c
  e9ff0f4bdd1be75a507480ed1267459d  libssp/vsprintf-chk.c
  9e2de2e1f20ab0ffa2201164de02824f  libstdc++-v3/.editorconfig
! f562305de8f13024a0e24340d852a506  libstdc++-v3/ChangeLog
  7aa6c40440a44fcf5ec94c066160c2f8  libstdc++-v3/ChangeLog-1998
  7aff86600b6a1ed3fa87305075a92db0  libstdc++-v3/ChangeLog-1999
  a6f28e8fc9bb07696a9e068b439a3a87  libstdc++-v3/ChangeLog-2000
*************** bc0412a9556e7ed39afe5103b73f1f26  libstd
*** 145950,145957 ****
  7b70f0f77a50b976605aef6dbeb1e282  libstdc++-v3/doc/xml/spine.xml
  bd966b4a0df6f2a84f9770525581d45c  libstdc++-v3/doc/xsl/customization.xsl.in
  42d14268f2b16c54a6bc2f71538a838c  libstdc++-v3/fragment.am
! 1360304538a542575b0d83eb658a1498  libstdc++-v3/include/Makefile.am
! 47a40d8988f233f8ebb233e6e42c9113  libstdc++-v3/include/Makefile.in
  c43a95ade3f229bbf11e4df12e566d23  libstdc++-v3/include/backward/auto_ptr.h
  a5311733ecd17a8f51066f4a2a351abd  libstdc++-v3/include/backward/backward_warning.h
  5c3fe230b3089d4b9c58b4a86af57005  libstdc++-v3/include/backward/binders.h
--- 146027,146034 ----
  7b70f0f77a50b976605aef6dbeb1e282  libstdc++-v3/doc/xml/spine.xml
  bd966b4a0df6f2a84f9770525581d45c  libstdc++-v3/doc/xsl/customization.xsl.in
  42d14268f2b16c54a6bc2f71538a838c  libstdc++-v3/fragment.am
! 8f0725044de9a77db1cdf652abb0da3d  libstdc++-v3/include/Makefile.am
! b1d897b7ae738755cc0a607f16e2d697  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
*************** a7d1ee943a62851fe350ec2bafff68be  libstd
*** 145964,145970 ****
  bceed1a9b573696caadf95cf3ea8f02f  libstdc++-v3/include/bits/align.h
  d76f8bdd16cfed23aa86ee76f79e7054  libstdc++-v3/include/bits/alloc_traits.h
  54d70975b96f74e9dab06dcfdeb88658  libstdc++-v3/include/bits/allocated_ptr.h
! 83be357751d0469bd9f29fc4a88961b1  libstdc++-v3/include/bits/allocator.h
  cb3c342a58004596ce172b04ab44dc6d  libstdc++-v3/include/bits/atomic_base.h
  504ddf67fe31254fb67815770ee690ba  libstdc++-v3/include/bits/atomic_futex.h
  e901edfc8eef441d1adabd54be25b807  libstdc++-v3/include/bits/atomic_timed_wait.h
--- 146041,146047 ----
  bceed1a9b573696caadf95cf3ea8f02f  libstdc++-v3/include/bits/align.h
  d76f8bdd16cfed23aa86ee76f79e7054  libstdc++-v3/include/bits/alloc_traits.h
  54d70975b96f74e9dab06dcfdeb88658  libstdc++-v3/include/bits/allocated_ptr.h
! 80189b147081bd6b28f814f7b9622c5d  libstdc++-v3/include/bits/allocator.h
  cb3c342a58004596ce172b04ab44dc6d  libstdc++-v3/include/bits/atomic_base.h
  504ddf67fe31254fb67815770ee690ba  libstdc++-v3/include/bits/atomic_futex.h
  e901edfc8eef441d1adabd54be25b807  libstdc++-v3/include/bits/atomic_timed_wait.h
*************** a178c445d0514403e5823ef8dbf9bef6  libstd
*** 145980,145992 ****
  5cbbd0fafb904f86c9ddce3fc54380f1  libstdc++-v3/include/bits/char_traits.h
  9a3227d14b324832ae22b4c7ec6979e2  libstdc++-v3/include/bits/charconv.h
  53b9ae6904abf33df2e42432f81c5ec0  libstdc++-v3/include/bits/chrono.h
! 76f76ab755d9be22c3744eeb8bf22bbd  libstdc++-v3/include/bits/chrono_io.h
  1f26067336c4957237db887ab1ce6b55  libstdc++-v3/include/bits/codecvt.h
  53f7e45e350f1bb99b3d67e27f914b61  libstdc++-v3/include/bits/concept_check.h
  7c617bb1da049c03753688f6f43b2d28  libstdc++-v3/include/bits/cow_string.h
  97d90498ee103018406f19468a5500ec  libstdc++-v3/include/bits/cpp_type_traits.h
  1a6ab365d16951ef25f6a0b562b27ede  libstdc++-v3/include/bits/cpyfunc_impl.h
! 1c5bc7f82fd83ba042296f81734c820b  libstdc++-v3/include/bits/deque.tcc
  b3b7f49179a45d11260480d53dd3cf0e  libstdc++-v3/include/bits/elements_of.h
  021c9e8af006934e2df53e05441f3d8c  libstdc++-v3/include/bits/enable_special_members.h
  0761a634c5ad798abd93ae68d0f8f1e2  libstdc++-v3/include/bits/erase_if.h
--- 146057,146069 ----
  5cbbd0fafb904f86c9ddce3fc54380f1  libstdc++-v3/include/bits/char_traits.h
  9a3227d14b324832ae22b4c7ec6979e2  libstdc++-v3/include/bits/charconv.h
  53b9ae6904abf33df2e42432f81c5ec0  libstdc++-v3/include/bits/chrono.h
! bd6f73e8b81e17ae53c5bf83305dea0e  libstdc++-v3/include/bits/chrono_io.h
  1f26067336c4957237db887ab1ce6b55  libstdc++-v3/include/bits/codecvt.h
  53f7e45e350f1bb99b3d67e27f914b61  libstdc++-v3/include/bits/concept_check.h
  7c617bb1da049c03753688f6f43b2d28  libstdc++-v3/include/bits/cow_string.h
  97d90498ee103018406f19468a5500ec  libstdc++-v3/include/bits/cpp_type_traits.h
  1a6ab365d16951ef25f6a0b562b27ede  libstdc++-v3/include/bits/cpyfunc_impl.h
! a00599dc44159a6b255d87ddbb7e237c  libstdc++-v3/include/bits/deque.tcc
  b3b7f49179a45d11260480d53dd3cf0e  libstdc++-v3/include/bits/elements_of.h
  021c9e8af006934e2df53e05441f3d8c  libstdc++-v3/include/bits/enable_special_members.h
  0761a634c5ad798abd93ae68d0f8f1e2  libstdc++-v3/include/bits/erase_if.h
*************** f053b22f5819f7ed1f6ed5ffe14dc5a3  libstd
*** 145996,146002 ****
  6f26512074a75529ba29871026bd71d5  libstdc++-v3/include/bits/fs_dir.h
  2a39eb878ffd3fb88661d1eeaab059dd  libstdc++-v3/include/bits/fs_fwd.h
  3ef9bc83cb8c079eb15ebfb1a50ab14b  libstdc++-v3/include/bits/fs_ops.h
! e537fce403d66fa1efeb8d9265be9c0f  libstdc++-v3/include/bits/fs_path.h
  c2f893fbd3fb2e778cc648a1e309d2f5  libstdc++-v3/include/bits/fstream.tcc
  a7fdff0e3cbc9de43937f64f26f7b528  libstdc++-v3/include/bits/funcref_impl.h
  e77032281bd301430e499d5bb46db4a1  libstdc++-v3/include/bits/functexcept.h
--- 146073,146079 ----
  6f26512074a75529ba29871026bd71d5  libstdc++-v3/include/bits/fs_dir.h
  2a39eb878ffd3fb88661d1eeaab059dd  libstdc++-v3/include/bits/fs_fwd.h
  3ef9bc83cb8c079eb15ebfb1a50ab14b  libstdc++-v3/include/bits/fs_ops.h
! 7fe100acd8acdc1ac9bb10e1dadb50b8  libstdc++-v3/include/bits/fs_path.h
  c2f893fbd3fb2e778cc648a1e309d2f5  libstdc++-v3/include/bits/fstream.tcc
  a7fdff0e3cbc9de43937f64f26f7b528  libstdc++-v3/include/bits/funcref_impl.h
  e77032281bd301430e499d5bb46db4a1  libstdc++-v3/include/bits/functexcept.h
*************** d8251691b710967c63f24ecf3e8cad75  libstd
*** 146029,146035 ****
  3cdf6345e89c49a55bd7c9be035d3729  libstdc++-v3/include/bits/mofunc_impl.h
  4169d644c2ef24f0668b2a257a0a5e54  libstdc++-v3/include/bits/monostate.h
  d6ef81b077325dc3d96b5c3b851f7c9a  libstdc++-v3/include/bits/move.h
! cfd37a44f2a01dabf40fc5b04678b973  libstdc++-v3/include/bits/new_allocator.h
  1b9f1c577b18d8325e7de09b66b12c27  libstdc++-v3/include/bits/new_except.h
  30068e814005895587eb706ab7c5c00c  libstdc++-v3/include/bits/new_throw.h
  ab1a2667b1fb6a0843b439656cb56a71  libstdc++-v3/include/bits/node_handle.h
--- 146106,146112 ----
  3cdf6345e89c49a55bd7c9be035d3729  libstdc++-v3/include/bits/mofunc_impl.h
  4169d644c2ef24f0668b2a257a0a5e54  libstdc++-v3/include/bits/monostate.h
  d6ef81b077325dc3d96b5c3b851f7c9a  libstdc++-v3/include/bits/move.h
! 9433cdde0133c30f26005432cb0b7214  libstdc++-v3/include/bits/new_allocator.h
  1b9f1c577b18d8325e7de09b66b12c27  libstdc++-v3/include/bits/new_except.h
  30068e814005895587eb706ab7c5c00c  libstdc++-v3/include/bits/new_throw.h
  ab1a2667b1fb6a0843b439656cb56a71  libstdc++-v3/include/bits/node_handle.h
*************** b745abd5614b31045999aba98b3d30c4  libstd
*** 146047,146053 ****
  3a5b2c90b69b348c27562cf65e40b23f  libstdc++-v3/include/bits/range_access.h
  0b2a4a5a8552148817067fd04c0dc935  libstdc++-v3/include/bits/ranges_algo.h
  2376637350495a1dbd9c27901ed68027  libstdc++-v3/include/bits/ranges_algobase.h
! da131298f4587856e6f487548bdaee1d  libstdc++-v3/include/bits/ranges_base.h
  c04d8e83343df391a348af7cf384e792  libstdc++-v3/include/bits/ranges_cmp.h
  571addb6a7ba251f10f9342f9b041ae5  libstdc++-v3/include/bits/ranges_uninitialized.h
  1e16e9219782b5cd7f75c9d3e4611b1b  libstdc++-v3/include/bits/ranges_util.h
--- 146124,146130 ----
  3a5b2c90b69b348c27562cf65e40b23f  libstdc++-v3/include/bits/range_access.h
  0b2a4a5a8552148817067fd04c0dc935  libstdc++-v3/include/bits/ranges_algo.h
  2376637350495a1dbd9c27901ed68027  libstdc++-v3/include/bits/ranges_algobase.h
! be4d83717ac91b3baa833f61b2456293  libstdc++-v3/include/bits/ranges_base.h
  c04d8e83343df391a348af7cf384e792  libstdc++-v3/include/bits/ranges_cmp.h
  571addb6a7ba251f10f9342f9b041ae5  libstdc++-v3/include/bits/ranges_uninitialized.h
  1e16e9219782b5cd7f75c9d3e4611b1b  libstdc++-v3/include/bits/ranges_util.h
*************** eba2c9ee0f0d650f6223eb4f40e83b02  libstd
*** 146056,146062 ****
  95b0223d89eb3c556603e4541958028d  libstdc++-v3/include/bits/regex.tcc
  d62176e59366818434c2a0ad6ef3b77b  libstdc++-v3/include/bits/regex_automaton.h
  7f7a38e87eaa1a1df665e82e34676187  libstdc++-v3/include/bits/regex_automaton.tcc
! b7326fd9eeb7faad6b76163d33684925  libstdc++-v3/include/bits/regex_compiler.h
  491f2e1710d8e0ee4cbfadbbd2892662  libstdc++-v3/include/bits/regex_compiler.tcc
  d3f233b7eec1704a8dbae3ba302cd591  libstdc++-v3/include/bits/regex_constants.h
  50ec2de0a344b64a276e732b37641aae  libstdc++-v3/include/bits/regex_error.h
--- 146133,146139 ----
  95b0223d89eb3c556603e4541958028d  libstdc++-v3/include/bits/regex.tcc
  d62176e59366818434c2a0ad6ef3b77b  libstdc++-v3/include/bits/regex_automaton.h
  7f7a38e87eaa1a1df665e82e34676187  libstdc++-v3/include/bits/regex_automaton.tcc
! 1a4bcbcad995d1ca9a6ef21ddf4f1840  libstdc++-v3/include/bits/regex_compiler.h
  491f2e1710d8e0ee4cbfadbbd2892662  libstdc++-v3/include/bits/regex_compiler.tcc
  d3f233b7eec1704a8dbae3ba302cd591  libstdc++-v3/include/bits/regex_constants.h
  50ec2de0a344b64a276e732b37641aae  libstdc++-v3/include/bits/regex_error.h
*************** cbd44f9447b308b0901004443db53e93  libstd
*** 146070,146075 ****
--- 146147,146162 ----
  a5e720346d3b4c60bfbcb9cf9a79f417  libstdc++-v3/include/bits/shared_ptr.h
  06d870671ae35152d9e8442900c80215  libstdc++-v3/include/bits/shared_ptr_atomic.h
  702f905b7fc00c89ecacee8e82ba19d9  libstdc++-v3/include/bits/shared_ptr_base.h
+ a3287036233bd3e6387160d82f75e7dd  libstdc++-v3/include/bits/simd_alg.h
+ 0cd12c72bb577532f92ae22fee28ce26  libstdc++-v3/include/bits/simd_details.h
+ 3173beedaa41588474c5481ec450cd20  libstdc++-v3/include/bits/simd_flags.h
+ 707046d01f2d965e0a84ca6c656e2046  libstdc++-v3/include/bits/simd_iterator.h
+ b136a78972f27620821fe613b75e98f4  libstdc++-v3/include/bits/simd_loadstore.h
+ 88d760c089b547a8927a318c9e465fdb  libstdc++-v3/include/bits/simd_mask.h
+ 55677796a9d03b2fcab6c8eb9866efcb  libstdc++-v3/include/bits/simd_mask_reductions.h
+ fce0564b07dd0ef981a64c683bfadc5a  libstdc++-v3/include/bits/simd_reductions.h
+ c7f9594bc443a1c65a94eed33fc970bf  libstdc++-v3/include/bits/simd_vec.h
+ 86eb307e0886ccc75570d22c33f78b3a  libstdc++-v3/include/bits/simd_x86.h
  c7864edd44ec162778d0cb89b0129937  libstdc++-v3/include/bits/slice_array.h
  78e195bd62ca638897505b698c3193de  libstdc++-v3/include/bits/specfun.h
  42139ff046a9321ce4a72fb8ee89a008  libstdc++-v3/include/bits/sstream.tcc
*************** fd681bc8fff37ce524a3ff77a7645f33  libstd
*** 146104,146110 ****
  2e947ba181d169443bd32dfa77c0e138  libstdc++-v3/include/bits/stl_stack.h
  ab35557852793a413e25819ddee53990  libstdc++-v3/include/bits/stl_tempbuf.h
  174d90b3517e6902a73d75b9860b3408  libstdc++-v3/include/bits/stl_tree.h
! 7335f212f65e8e6b7a27886bc7ea7c4e  libstdc++-v3/include/bits/stl_uninitialized.h
  fa6a2197d9927c61c24b530816008594  libstdc++-v3/include/bits/stl_vector.h
  96570e9668a903cd69d5febdf0595994  libstdc++-v3/include/bits/stream_iterator.h
  5d9b3cc499e4ec992ba0bb9a3de1d791  libstdc++-v3/include/bits/streambuf.tcc
--- 146191,146197 ----
  2e947ba181d169443bd32dfa77c0e138  libstdc++-v3/include/bits/stl_stack.h
  ab35557852793a413e25819ddee53990  libstdc++-v3/include/bits/stl_tempbuf.h
  174d90b3517e6902a73d75b9860b3408  libstdc++-v3/include/bits/stl_tree.h
! dbcc63c3e8bcdb24ecfe5d464853ed5b  libstdc++-v3/include/bits/stl_uninitialized.h
  fa6a2197d9927c61c24b530816008594  libstdc++-v3/include/bits/stl_vector.h
  96570e9668a903cd69d5febdf0595994  libstdc++-v3/include/bits/stream_iterator.h
  5d9b3cc499e4ec992ba0bb9a3de1d791  libstdc++-v3/include/bits/streambuf.tcc
*************** cc888ad11b5889a85843f6fa7a0611f5  libstd
*** 146127,146135 ****
  d1cf5a35c4ad3820cb023d8f84762cc7  libstdc++-v3/include/bits/valarray_array.h
  ddd4bdc2fa29f8f2aa3386cead9ebcb2  libstdc++-v3/include/bits/valarray_array.tcc
  16c6db3f5b1e7b3e37c3febbf4dc4e8c  libstdc++-v3/include/bits/valarray_before.h
  5a7dd3eca21d4650e654ea51da466c59  libstdc++-v3/include/bits/vector.tcc
! 563bc86a5af5543766432f2646fc8178  libstdc++-v3/include/bits/version.def
! e8c25bd66f81ab5832e6ca6f99c8bd36  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
--- 146214,146223 ----
  d1cf5a35c4ad3820cb023d8f84762cc7  libstdc++-v3/include/bits/valarray_array.h
  ddd4bdc2fa29f8f2aa3386cead9ebcb2  libstdc++-v3/include/bits/valarray_array.tcc
  16c6db3f5b1e7b3e37c3febbf4dc4e8c  libstdc++-v3/include/bits/valarray_before.h
+ 682dec8d9b388681bc1f171ba0c5590e  libstdc++-v3/include/bits/vec_ops.h
  5a7dd3eca21d4650e654ea51da466c59  libstdc++-v3/include/bits/vector.tcc
! e3018be63479053b510893da8a03087f  libstdc++-v3/include/bits/version.def
! b64668c70e3d4fe5fd531e7573811b55  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
*************** eb5c3c70648edffb136041224176415d  libstd
*** 146265,146271 ****
  924db71418cade14461dc9e0fad3c165  libstdc++-v3/include/experimental/bits/fs_dir.h
  849535d1bb1db1d378f98d4d342f816c  libstdc++-v3/include/experimental/bits/fs_fwd.h
  e383a221c239aeeda8bcefe660a2628d  libstdc++-v3/include/experimental/bits/fs_ops.h
! f3f332000f2f44d1ac152f5bd604b97c  libstdc++-v3/include/experimental/bits/fs_path.h
  d3e2058b40263b2287f46d84e583b69f  libstdc++-v3/include/experimental/bits/lfts_config.h
  d704100997ba3629701a66deecd602e2  libstdc++-v3/include/experimental/bits/net.h
  dbe674cb44d578c2bf92a2642822492a  libstdc++-v3/include/experimental/bits/numeric_traits.h
--- 146353,146359 ----
  924db71418cade14461dc9e0fad3c165  libstdc++-v3/include/experimental/bits/fs_dir.h
  849535d1bb1db1d378f98d4d342f816c  libstdc++-v3/include/experimental/bits/fs_fwd.h
  e383a221c239aeeda8bcefe660a2628d  libstdc++-v3/include/experimental/bits/fs_ops.h
! b24ccd687220a21ff0f528a257e682f3  libstdc++-v3/include/experimental/bits/fs_path.h
  d3e2058b40263b2287f46d84e583b69f  libstdc++-v3/include/experimental/bits/lfts_config.h
  d704100997ba3629701a66deecd602e2  libstdc++-v3/include/experimental/bits/net.h
  dbe674cb44d578c2bf92a2642822492a  libstdc++-v3/include/experimental/bits/numeric_traits.h
*************** b2409d8a524bb194bd5dce319c6a9a7a  libstd
*** 146329,146335 ****
  b63cbb9fd8363685fe56ec9d7efb11d6  libstdc++-v3/include/ext/cast.h
  603f77b25e053743878d1a28398562ba  libstdc++-v3/include/ext/cmath
  9940fb82706547fcb8e372cd5ae1c993  libstdc++-v3/include/ext/codecvt_specializations.h
! ebd32c6c0ac8569782bc3add3f276061  libstdc++-v3/include/ext/concurrence.h
  ba24717cb0fcb4568ee52801de77d729  libstdc++-v3/include/ext/debug_allocator.h
  ecfa234661c82a56f0274db52470183f  libstdc++-v3/include/ext/enc_filebuf.h
  416fbb99cff5c27462154a758d97b251  libstdc++-v3/include/ext/extptr_allocator.h
--- 146417,146423 ----
  b63cbb9fd8363685fe56ec9d7efb11d6  libstdc++-v3/include/ext/cast.h
  603f77b25e053743878d1a28398562ba  libstdc++-v3/include/ext/cmath
  9940fb82706547fcb8e372cd5ae1c993  libstdc++-v3/include/ext/codecvt_specializations.h
! 3bb2ee0e94aa68e4afab3fe5e380b79f  libstdc++-v3/include/ext/concurrence.h
  ba24717cb0fcb4568ee52801de77d729  libstdc++-v3/include/ext/debug_allocator.h
  ecfa234661c82a56f0274db52470183f  libstdc++-v3/include/ext/enc_filebuf.h
  416fbb99cff5c27462154a758d97b251  libstdc++-v3/include/ext/extptr_allocator.h
*************** a11d273c4a3fef59b0d065d9af1d9c56  libstd
*** 146656,146662 ****
  a2328073492275bd7212327bef18e8fd  libstdc++-v3/include/pstl/algorithm_impl.h
  ae347741e840ff43bfc0c1800ecdbf63  libstdc++-v3/include/pstl/execution_defs.h
  2f581a415975d87328a3e39c015d38b1  libstdc++-v3/include/pstl/execution_impl.h
! 995f5473bbb55d043d61d10ba1776043  libstdc++-v3/include/pstl/glue_algorithm_defs.h
  5b59c0a6c0cb7ddb2fa2f6d8f454b15d  libstdc++-v3/include/pstl/glue_algorithm_impl.h
  368ad5a8bcc8d830f5785113b6245f9d  libstdc++-v3/include/pstl/glue_execution_defs.h
  0b0a3983fbed012140824669c804e50a  libstdc++-v3/include/pstl/glue_memory_defs.h
--- 146744,146750 ----
  a2328073492275bd7212327bef18e8fd  libstdc++-v3/include/pstl/algorithm_impl.h
  ae347741e840ff43bfc0c1800ecdbf63  libstdc++-v3/include/pstl/execution_defs.h
  2f581a415975d87328a3e39c015d38b1  libstdc++-v3/include/pstl/execution_impl.h
! bf41b54bb328243bcc27daa71f65fd02  libstdc++-v3/include/pstl/glue_algorithm_defs.h
  5b59c0a6c0cb7ddb2fa2f6d8f454b15d  libstdc++-v3/include/pstl/glue_algorithm_impl.h
  368ad5a8bcc8d830f5785113b6245f9d  libstdc++-v3/include/pstl/glue_execution_defs.h
  0b0a3983fbed012140824669c804e50a  libstdc++-v3/include/pstl/glue_memory_defs.h
*************** b158371b447aece17b20aeb55af5df02  libstd
*** 146702,146708 ****
  c85826e5073be733076e4825a96a991c  libstdc++-v3/include/std/fstream
  1a481560a4cf3d2ef6733f38a1afb84f  libstdc++-v3/include/std/functional
  94a42cdbbdcf611d6ed85997de7e69ec  libstdc++-v3/include/std/future
! c23941f33f780fa4e76b3932a48f2171  libstdc++-v3/include/std/generator
  78ceb68123da9377448ec7f88b3c2954  libstdc++-v3/include/std/inplace_vector
  9faf9f4caa2dcbfe374113d6cf2380ad  libstdc++-v3/include/std/iomanip
  48bf9080e650b3c09a288f25a49455d5  libstdc++-v3/include/std/ios
--- 146790,146796 ----
  c85826e5073be733076e4825a96a991c  libstdc++-v3/include/std/fstream
  1a481560a4cf3d2ef6733f38a1afb84f  libstdc++-v3/include/std/functional
  94a42cdbbdcf611d6ed85997de7e69ec  libstdc++-v3/include/std/future
! f07a74eecab3055929d3af3c5ea38bed  libstdc++-v3/include/std/generator
  78ceb68123da9377448ec7f88b3c2954  libstdc++-v3/include/std/inplace_vector
  9faf9f4caa2dcbfe374113d6cf2380ad  libstdc++-v3/include/std/iomanip
  48bf9080e650b3c09a288f25a49455d5  libstdc++-v3/include/std/ios
*************** be169e901166777d5be3e557682b7af2  libstd
*** 146715,146721 ****
  2f3eb4865a149d33afc45095dfd51d15  libstdc++-v3/include/std/list
  979d756bd9149a01a697b92c921e75a0  libstdc++-v3/include/std/locale
  b9368104d884bddd988db2b9e69ab485  libstdc++-v3/include/std/map
! d32f4d5de93df38e266253ca53ae1f89  libstdc++-v3/include/std/mdspan
  5439ce157f7c11ab4eddd8c04799fea4  libstdc++-v3/include/std/memory
  ea0d67f29f1a73f1ccdade0115646a1c  libstdc++-v3/include/std/memory_resource
  e93a63eb4300dec2e3d83195f0160e95  libstdc++-v3/include/std/meta
--- 146803,146809 ----
  2f3eb4865a149d33afc45095dfd51d15  libstdc++-v3/include/std/list
  979d756bd9149a01a697b92c921e75a0  libstdc++-v3/include/std/locale
  b9368104d884bddd988db2b9e69ab485  libstdc++-v3/include/std/map
! 63d57cef2dad5e4aaeb53e07bba59693  libstdc++-v3/include/std/mdspan
  5439ce157f7c11ab4eddd8c04799fea4  libstdc++-v3/include/std/memory
  ea0d67f29f1a73f1ccdade0115646a1c  libstdc++-v3/include/std/memory_resource
  e93a63eb4300dec2e3d83195f0160e95  libstdc++-v3/include/std/meta
*************** b4c9d5ad3541a664c1fc38afd35837d2  libstd
*** 146727,146739 ****
  fd773662a4b346f11b66520f34a8898e  libstdc++-v3/include/std/print
  879fbfbd4d520dc45943e6e1c095a2e7  libstdc++-v3/include/std/queue
  e21a300c90cd953e16f037708f0e242a  libstdc++-v3/include/std/random
! 40cad13dd80861724cd48dc41098a079  libstdc++-v3/include/std/ranges
  ee576f89ae347224177df91fe86d905d  libstdc++-v3/include/std/ratio
  a5c4f3df840ba7c3fbc9b7b9d5567ef2  libstdc++-v3/include/std/regex
  8e6ef0834acfc88dd03f5eae2990e41a  libstdc++-v3/include/std/scoped_allocator
  a53d359dd7618cc0d3f2447f5f60fff3  libstdc++-v3/include/std/semaphore
  ef61193c582c0e8e18efb7f27f37f833  libstdc++-v3/include/std/set
  d9b30ac9f13a2d342a56ff319aca749e  libstdc++-v3/include/std/shared_mutex
  b3171714703fcfc5d8fe69ffe22d9cc8  libstdc++-v3/include/std/source_location
  72e2489e1fe102fd4cdc8596b867485b  libstdc++-v3/include/std/span
  efdde6d8d883a91854d4ae616b627e53  libstdc++-v3/include/std/spanstream
--- 146815,146828 ----
  fd773662a4b346f11b66520f34a8898e  libstdc++-v3/include/std/print
  879fbfbd4d520dc45943e6e1c095a2e7  libstdc++-v3/include/std/queue
  e21a300c90cd953e16f037708f0e242a  libstdc++-v3/include/std/random
! bf5a2e3be4a176467546edefdf13198d  libstdc++-v3/include/std/ranges
  ee576f89ae347224177df91fe86d905d  libstdc++-v3/include/std/ratio
  a5c4f3df840ba7c3fbc9b7b9d5567ef2  libstdc++-v3/include/std/regex
  8e6ef0834acfc88dd03f5eae2990e41a  libstdc++-v3/include/std/scoped_allocator
  a53d359dd7618cc0d3f2447f5f60fff3  libstdc++-v3/include/std/semaphore
  ef61193c582c0e8e18efb7f27f37f833  libstdc++-v3/include/std/set
  d9b30ac9f13a2d342a56ff319aca749e  libstdc++-v3/include/std/shared_mutex
+ b6acc193775e3cf38850b9d166d46caf  libstdc++-v3/include/std/simd
  b3171714703fcfc5d8fe69ffe22d9cc8  libstdc++-v3/include/std/source_location
  72e2489e1fe102fd4cdc8596b867485b  libstdc++-v3/include/std/span
  efdde6d8d883a91854d4ae616b627e53  libstdc++-v3/include/std/spanstream
*************** f4133c0fcd126b5470b4fcbc83e97d49  libstd
*** 146804,146810 ****
  580fd316165b78eae9404a6db673a12f  libstdc++-v3/include/tr1/random.h
  3b4747c7032fa43ae55f9ea4731c8240  libstdc++-v3/include/tr1/random.tcc
  22c923767f6d874b59de17f02ea6a5d9  libstdc++-v3/include/tr1/regex
! f084f55a1bc87d830e146572ced45a76  libstdc++-v3/include/tr1/riemann_zeta.tcc
  91221fac588c30678689b533907c0686  libstdc++-v3/include/tr1/shared_ptr.h
  80deeedc6c2e47dc50116f5f6de0316e  libstdc++-v3/include/tr1/special_function_util.h
  307a1468c3883fb6b914776f2e57e44c  libstdc++-v3/include/tr1/stdarg.h
--- 146893,146899 ----
  580fd316165b78eae9404a6db673a12f  libstdc++-v3/include/tr1/random.h
  3b4747c7032fa43ae55f9ea4731c8240  libstdc++-v3/include/tr1/random.tcc
  22c923767f6d874b59de17f02ea6a5d9  libstdc++-v3/include/tr1/regex
! 640eb8bb87f77ee0d1ce9669f99c18be  libstdc++-v3/include/tr1/riemann_zeta.tcc
  91221fac588c30678689b533907c0686  libstdc++-v3/include/tr1/shared_ptr.h
  80deeedc6c2e47dc50116f5f6de0316e  libstdc++-v3/include/tr1/special_function_util.h
  307a1468c3883fb6b914776f2e57e44c  libstdc++-v3/include/tr1/stdarg.h
*************** ce66644b3691c04e697aa707358542a6  libstd
*** 146976,146982 ****
  25a3b81b4b5eb971a8d8470bd47fbe8e  libstdc++-v3/src/c++11/cxx11-shim_facets.cc
  600b1346b044d2eb07589f44cb7698f0  libstdc++-v3/src/c++11/cxx11-stdexcept.cc
  6e32382ffd80bb5bbbbc156ee2861f1d  libstdc++-v3/src/c++11/cxx11-wlocale-inst.cc
! 7f51b8371b43ba8386e5fe29521916a1  libstdc++-v3/src/c++11/debug.cc
  202cfbf8413c3baa4b3db17f59b01abb  libstdc++-v3/src/c++11/ext11-inst.cc
  ba1e398802c7793fc33131cddac099d5  libstdc++-v3/src/c++11/facet_inst_macros.h
  97194c02937129aeed6783ae3c4bdb5a  libstdc++-v3/src/c++11/fstream-inst.cc
--- 147065,147071 ----
  25a3b81b4b5eb971a8d8470bd47fbe8e  libstdc++-v3/src/c++11/cxx11-shim_facets.cc
  600b1346b044d2eb07589f44cb7698f0  libstdc++-v3/src/c++11/cxx11-stdexcept.cc
  6e32382ffd80bb5bbbbc156ee2861f1d  libstdc++-v3/src/c++11/cxx11-wlocale-inst.cc
! e21846a4b8e55e889a574088036c66eb  libstdc++-v3/src/c++11/debug.cc
  202cfbf8413c3baa4b3db17f59b01abb  libstdc++-v3/src/c++11/ext11-inst.cc
  ba1e398802c7793fc33131cddac099d5  libstdc++-v3/src/c++11/facet_inst_macros.h
  97194c02937129aeed6783ae3c4bdb5a  libstdc++-v3/src/c++11/fstream-inst.cc
*************** c9dcdd9b0b5c806e787dc702505f57e1  libstd
*** 147029,147035 ****
  deb1f4d1d9cd6c05167daf4631b56267  libstdc++-v3/src/c++17/floating_to_chars.cc
  ab713104bd5f979c12c01a7037584aa9  libstdc++-v3/src/c++17/fs_dir.cc
  22566e9052cc60799b49194e4a2296be  libstdc++-v3/src/c++17/fs_ops.cc
! 8d632f182ac98fb214bc28ee5c0e45a1  libstdc++-v3/src/c++17/fs_path.cc
  702e1413956c4c9873d78ce075b24e4e  libstdc++-v3/src/c++17/memory_resource.cc
  5fc15b3f8bf3bb0c0b6b692daffe193e  libstdc++-v3/src/c++17/ostream-inst.cc
  f7696e2f5518e5e873ced4beacb8d107  libstdc++-v3/src/c++17/ryu/LOCAL_PATCHES
--- 147118,147124 ----
  deb1f4d1d9cd6c05167daf4631b56267  libstdc++-v3/src/c++17/floating_to_chars.cc
  ab713104bd5f979c12c01a7037584aa9  libstdc++-v3/src/c++17/fs_dir.cc
  22566e9052cc60799b49194e4a2296be  libstdc++-v3/src/c++17/fs_ops.cc
! 9246ac24ff18dcedf681fb7ccbaa8cd5  libstdc++-v3/src/c++17/fs_path.cc
  702e1413956c4c9873d78ce075b24e4e  libstdc++-v3/src/c++17/memory_resource.cc
  5fc15b3f8bf3bb0c0b6b692daffe193e  libstdc++-v3/src/c++17/ostream-inst.cc
  f7696e2f5518e5e873ced4beacb8d107  libstdc++-v3/src/c++17/ryu/LOCAL_PATCHES
*************** e017d47cedd4e843177ec9ff2c936541  libstd
*** 147056,147062 ****
  c2bd27af25e57adce5807e0f01a2d0dc  libstdc++-v3/src/c++20/sstream-inst.cc
  50ac2e00d5794df965e47509f3c16cb5  libstdc++-v3/src/c++20/syncbuf.cc
  5f51e6efda14986b9b4932b46f8e73c3  libstdc++-v3/src/c++20/tzdata.zi
! 0bc6217c7afbcd055496ad3d341a5de0  libstdc++-v3/src/c++20/tzdb.cc
  ac7b7a080d5f7aa8fe6a26188631fc18  libstdc++-v3/src/c++20/windows_zones-map.h
  ab4a3b60e85cb9a17d5363c568255e62  libstdc++-v3/src/c++23/Makefile.am
  ba1de75ac9c1bb7d2506c503fe17708a  libstdc++-v3/src/c++23/Makefile.in
--- 147145,147151 ----
  c2bd27af25e57adce5807e0f01a2d0dc  libstdc++-v3/src/c++20/sstream-inst.cc
  50ac2e00d5794df965e47509f3c16cb5  libstdc++-v3/src/c++20/syncbuf.cc
  5f51e6efda14986b9b4932b46f8e73c3  libstdc++-v3/src/c++20/tzdata.zi
! 091b29fc9294e1f1eceaf85a3c578f9a  libstdc++-v3/src/c++20/tzdb.cc
  ac7b7a080d5f7aa8fe6a26188631fc18  libstdc++-v3/src/c++20/windows_zones-map.h
  ab4a3b60e85cb9a17d5363c568255e62  libstdc++-v3/src/c++23/Makefile.am
  ba1de75ac9c1bb7d2506c503fe17708a  libstdc++-v3/src/c++23/Makefile.in
*************** ba1de75ac9c1bb7d2506c503fe17708a  libstd
*** 147064,147070 ****
  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
! 3c3c57c36d2e7a101f975b6cce1c47c6  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
--- 147153,147159 ----
  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
! 14ed45754f764d9862e893d124a02960  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
*************** e54d8bde5170276bc314bb62f562e74f  libstd
*** 147155,147161 ****
  5690517690fa69b441af6a1196b8c17c  libstdc++-v3/testsuite/17_intro/headers/c++2011/stdc++_multiple_inclusion.cc
  5b5b6629b7cac8c7374d577b37e995e9  libstdc++-v3/testsuite/17_intro/headers/c++2014/parallel_mode.cc
  15a80570bd72c0f9d4acbf4e2a5b3ca2  libstdc++-v3/testsuite/17_intro/headers/c++2017/parallel_mode.cc
! 0396d413d39da2ebc362ab8978060923  libstdc++-v3/testsuite/17_intro/names.cc
  d4446489cc9fd961dbc2f15b2b21fca7  libstdc++-v3/testsuite/17_intro/names_fortify.cc
  047ad714f0a1ac010ab86a084dfbeee7  libstdc++-v3/testsuite/17_intro/names_pstl.cc
  441838fc5a4a7a22a784014872e61926  libstdc++-v3/testsuite/17_intro/no_library_allocation.cc
--- 147244,147250 ----
  5690517690fa69b441af6a1196b8c17c  libstdc++-v3/testsuite/17_intro/headers/c++2011/stdc++_multiple_inclusion.cc
  5b5b6629b7cac8c7374d577b37e995e9  libstdc++-v3/testsuite/17_intro/headers/c++2014/parallel_mode.cc
  15a80570bd72c0f9d4acbf4e2a5b3ca2  libstdc++-v3/testsuite/17_intro/headers/c++2017/parallel_mode.cc
! a6aa183c3279acaf659520adf37926da  libstdc++-v3/testsuite/17_intro/names.cc
  d4446489cc9fd961dbc2f15b2b21fca7  libstdc++-v3/testsuite/17_intro/names_fortify.cc
  047ad714f0a1ac010ab86a084dfbeee7  libstdc++-v3/testsuite/17_intro/names_pstl.cc
  441838fc5a4a7a22a784014872e61926  libstdc++-v3/testsuite/17_intro/no_library_allocation.cc
*************** aa88a13bf347c95e75dfc71ecff97284  libstd
*** 150775,150791 ****
  f0cede418772577badbb376161c38ebb  libstdc++-v3/testsuite/23_containers/mdspan/accessors/debug/aligned_offset_neg.cc
  c9be65e1a0cf8e0da83e4027b6ea3e64  libstdc++-v3/testsuite/23_containers/mdspan/accessors/default_neg.cc
  72240f7d2b9d3abcab8b06d4f0e67f65  libstdc++-v3/testsuite/23_containers/mdspan/accessors/generic.cc
! 1cc1ced547e88a02130a17440ac824cc  libstdc++-v3/testsuite/23_containers/mdspan/at.cc
  e5c17ed95482174d37bf901a5f3dff37  libstdc++-v3/testsuite/23_containers/mdspan/class_mandate_neg.cc
  bb096ee6d5a81634a48634c6dda721a9  libstdc++-v3/testsuite/23_containers/mdspan/extents/class_mandates_neg.cc
  58d322becec5c5e65c19f17834e2a082  libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_copy.cc
  e9e5cce5f41b3fcb25e00e9b6edb9a83  libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_default.cc
! 3eab3b1e28984ad8c9a7744b448fdfb9  libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_ints.cc
  f11430abfbf793c9117a6d498fc9e9d6  libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_shape.cc
! 56a0f5d5edaad1117cc988beafc16d5d  libstdc++-v3/testsuite/23_containers/mdspan/extents/custom_integer.cc
  669e44182af41d221acecffd45681dc9  libstdc++-v3/testsuite/23_containers/mdspan/extents/extents_mismatch_neg.cc
  b156707a9c78c39d6425cbae7cb3f90a  libstdc++-v3/testsuite/23_containers/mdspan/extents/misc.cc
! ab055bfc068f83879ad28ea7bc8c0287  libstdc++-v3/testsuite/23_containers/mdspan/int_like.h
  bead52db525471c98d26137e05743c97  libstdc++-v3/testsuite/23_containers/mdspan/layout_like.h
  da389bc5518d9172e2dec1d7e53315fb  libstdc++-v3/testsuite/23_containers/mdspan/layout_traits.h
  ab07a82ad1f2a1ee5e8b19e0b60f44ea  libstdc++-v3/testsuite/23_containers/mdspan/layouts/class_mandate_neg.cc
--- 150864,150880 ----
  f0cede418772577badbb376161c38ebb  libstdc++-v3/testsuite/23_containers/mdspan/accessors/debug/aligned_offset_neg.cc
  c9be65e1a0cf8e0da83e4027b6ea3e64  libstdc++-v3/testsuite/23_containers/mdspan/accessors/default_neg.cc
  72240f7d2b9d3abcab8b06d4f0e67f65  libstdc++-v3/testsuite/23_containers/mdspan/accessors/generic.cc
! c759013159e5f1f093849c00bae9ff73  libstdc++-v3/testsuite/23_containers/mdspan/at.cc
  e5c17ed95482174d37bf901a5f3dff37  libstdc++-v3/testsuite/23_containers/mdspan/class_mandate_neg.cc
  bb096ee6d5a81634a48634c6dda721a9  libstdc++-v3/testsuite/23_containers/mdspan/extents/class_mandates_neg.cc
  58d322becec5c5e65c19f17834e2a082  libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_copy.cc
  e9e5cce5f41b3fcb25e00e9b6edb9a83  libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_default.cc
! 4844d68e8a9a53b1031f3bee14f63e8f  libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_ints.cc
  f11430abfbf793c9117a6d498fc9e9d6  libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_shape.cc
! 6b6c681b4ae0468d99acf8f33deb6539  libstdc++-v3/testsuite/23_containers/mdspan/extents/custom_integer.cc
  669e44182af41d221acecffd45681dc9  libstdc++-v3/testsuite/23_containers/mdspan/extents/extents_mismatch_neg.cc
  b156707a9c78c39d6425cbae7cb3f90a  libstdc++-v3/testsuite/23_containers/mdspan/extents/misc.cc
! 7d027bfd05e10a23595a7e3890f8f780  libstdc++-v3/testsuite/23_containers/mdspan/int_like.h
  bead52db525471c98d26137e05743c97  libstdc++-v3/testsuite/23_containers/mdspan/layout_like.h
  da389bc5518d9172e2dec1d7e53315fb  libstdc++-v3/testsuite/23_containers/mdspan/layout_traits.h
  ab07a82ad1f2a1ee5e8b19e0b60f44ea  libstdc++-v3/testsuite/23_containers/mdspan/layouts/class_mandate_neg.cc
*************** f100ecfcef3f79639fc5c07828bee8f2  libstd
*** 150796,150802 ****
  2226303150eee3ae46373765f6a6d08f  libstdc++-v3/testsuite/23_containers/mdspan/layouts/padded.cc
  490297a4a90a084a51d7dfe6eb3a0f72  libstdc++-v3/testsuite/23_containers/mdspan/layouts/padded_neg.cc
  3f96813b92ac712ab8210f7eb24e7158  libstdc++-v3/testsuite/23_containers/mdspan/layouts/stride.cc
! 94e1c258b4d0ee973edbc3f9311a7883  libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc
  4b1a50b4d361b155b60027f1bdc566e7  libstdc++-v3/testsuite/23_containers/mdspan/out_of_bounds_neg.cc
  dbf6f28a87aa23623650f791adfaca62  libstdc++-v3/testsuite/23_containers/mdspan/submdspan/canonical_slices.cc
  d8ea1f14ddbd6c1578d7cf9750fad6ba  libstdc++-v3/testsuite/23_containers/mdspan/submdspan/canonical_slices_neg.cc
--- 150885,150891 ----
  2226303150eee3ae46373765f6a6d08f  libstdc++-v3/testsuite/23_containers/mdspan/layouts/padded.cc
  490297a4a90a084a51d7dfe6eb3a0f72  libstdc++-v3/testsuite/23_containers/mdspan/layouts/padded_neg.cc
  3f96813b92ac712ab8210f7eb24e7158  libstdc++-v3/testsuite/23_containers/mdspan/layouts/stride.cc
! 2d21e9a9181f1c0d35bb03c4b5b72f14  libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc
  4b1a50b4d361b155b60027f1bdc566e7  libstdc++-v3/testsuite/23_containers/mdspan/out_of_bounds_neg.cc
  dbf6f28a87aa23623650f791adfaca62  libstdc++-v3/testsuite/23_containers/mdspan/submdspan/canonical_slices.cc
  d8ea1f14ddbd6c1578d7cf9750fad6ba  libstdc++-v3/testsuite/23_containers/mdspan/submdspan/canonical_slices_neg.cc
*************** be996b25c8ef1439ea19bf5195600447  libstd
*** 151962,151968 ****
  d6d11350cf8ab8df03ef7200d4a0780b  libstdc++-v3/testsuite/24_iterators/istream_iterator/requirements/explicit_instantiation.cc
  16fc7fe4ef465e60ef744c7605395b8b  libstdc++-v3/testsuite/24_iterators/istream_iterator/requirements/typedefs.cc
  e569186d63466f61fb9efd8a252846ab  libstdc++-v3/testsuite/24_iterators/istream_iterator/sentinel.cc
! 862f1dc0fb56816781018a1ce8edff35  libstdc++-v3/testsuite/24_iterators/istreambuf_iterator/105580.cc
  760ec72aec19e561ff5ebdd8628478ba  libstdc++-v3/testsuite/24_iterators/istreambuf_iterator/2.cc
  056750d63b569b4e5db468fd95af8d9a  libstdc++-v3/testsuite/24_iterators/istreambuf_iterator/2627.cc
  1a5f450007f055452b3fb783807645f9  libstdc++-v3/testsuite/24_iterators/istreambuf_iterator/92285.cc
--- 152051,152057 ----
  d6d11350cf8ab8df03ef7200d4a0780b  libstdc++-v3/testsuite/24_iterators/istream_iterator/requirements/explicit_instantiation.cc
  16fc7fe4ef465e60ef744c7605395b8b  libstdc++-v3/testsuite/24_iterators/istream_iterator/requirements/typedefs.cc
  e569186d63466f61fb9efd8a252846ab  libstdc++-v3/testsuite/24_iterators/istream_iterator/sentinel.cc
! 486fa49e6e6487aad2e12a66d481a54c  libstdc++-v3/testsuite/24_iterators/istreambuf_iterator/105580.cc
  760ec72aec19e561ff5ebdd8628478ba  libstdc++-v3/testsuite/24_iterators/istreambuf_iterator/2.cc
  056750d63b569b4e5db468fd95af8d9a  libstdc++-v3/testsuite/24_iterators/istreambuf_iterator/2627.cc
  1a5f450007f055452b3fb783807645f9  libstdc++-v3/testsuite/24_iterators/istreambuf_iterator/92285.cc
*************** fac581d78e5a7c5f9a935172c7cda695  libstd
*** 152039,152045 ****
  5938747d56a10a4f69fd8f8d4868f14d  libstdc++-v3/testsuite/24_iterators/range_operations/advance.cc
  fa86fc2c1f354d878defa2b9978026fd  libstdc++-v3/testsuite/24_iterators/range_operations/advance_debug_neg.cc
  f3e9bd715fe13148d21f32ce807ccb06  libstdc++-v3/testsuite/24_iterators/range_operations/advance_overflow.cc
! a92c412feea56f89f2c3064f8d435744  libstdc++-v3/testsuite/24_iterators/range_operations/distance.cc
  a921cc7d3fdaaf8546958618d0214e1b  libstdc++-v3/testsuite/24_iterators/range_operations/lwg3392.cc
  f0dec1baf86728984fdee46e35bd1bcf  libstdc++-v3/testsuite/24_iterators/range_operations/next.cc
  6d3e11c925ac79fe413bb95872346314  libstdc++-v3/testsuite/24_iterators/range_operations/prev.cc
--- 152128,152134 ----
  5938747d56a10a4f69fd8f8d4868f14d  libstdc++-v3/testsuite/24_iterators/range_operations/advance.cc
  fa86fc2c1f354d878defa2b9978026fd  libstdc++-v3/testsuite/24_iterators/range_operations/advance_debug_neg.cc
  f3e9bd715fe13148d21f32ce807ccb06  libstdc++-v3/testsuite/24_iterators/range_operations/advance_overflow.cc
! 8cb854db01e5d781e1c80589781964a6  libstdc++-v3/testsuite/24_iterators/range_operations/distance.cc
  a921cc7d3fdaaf8546958618d0214e1b  libstdc++-v3/testsuite/24_iterators/range_operations/lwg3392.cc
  f0dec1baf86728984fdee46e35bd1bcf  libstdc++-v3/testsuite/24_iterators/range_operations/next.cc
  6d3e11c925ac79fe413bb95872346314  libstdc++-v3/testsuite/24_iterators/range_operations/prev.cc
*************** fbaf0266a8ac9e6e6e0f56731e9c767f  libstd
*** 154808,154814 ****
  d4597c2d2a9d48213958196167f7824b  libstdc++-v3/testsuite/29_atomics/atomic/69769.cc
  66865911f7c57b77d964389ac3022db7  libstdc++-v3/testsuite/29_atomics/atomic/70766.cc
  63350a1cbb29ab67e43b7f49d0ce503d  libstdc++-v3/testsuite/29_atomics/atomic/89624.cc
! e20db8e4b74cd8cd87b26cf643e05738  libstdc++-v3/testsuite/29_atomics/atomic/compare_exchange_padding.cc
  bb3edba6296f96609c727171b522c41c  libstdc++-v3/testsuite/29_atomics/atomic/cons/49445.cc
  f8335b6527363df52eb275583d3d60f7  libstdc++-v3/testsuite/29_atomics/atomic/cons/assign_neg.cc
  a6a306e6273bd1fb4124d807b6a581c3  libstdc++-v3/testsuite/29_atomics/atomic/cons/constexpr.cc
--- 154897,154903 ----
  d4597c2d2a9d48213958196167f7824b  libstdc++-v3/testsuite/29_atomics/atomic/69769.cc
  66865911f7c57b77d964389ac3022db7  libstdc++-v3/testsuite/29_atomics/atomic/70766.cc
  63350a1cbb29ab67e43b7f49d0ce503d  libstdc++-v3/testsuite/29_atomics/atomic/89624.cc
! ff2b392f6783fa3f15a3e1b095859a65  libstdc++-v3/testsuite/29_atomics/atomic/compare_exchange_padding.cc
  bb3edba6296f96609c727171b522c41c  libstdc++-v3/testsuite/29_atomics/atomic/cons/49445.cc
  f8335b6527363df52eb275583d3d60f7  libstdc++-v3/testsuite/29_atomics/atomic/cons/assign_neg.cc
  a6a306e6273bd1fb4124d807b6a581c3  libstdc++-v3/testsuite/29_atomics/atomic/cons/constexpr.cc
*************** b694262e9c10340bdb562c2e01ff78bf  libstd
*** 156683,156688 ****
--- 156772,156803 ----
  5b2a0cc6d1227b9eae0206d48d932d77  libstdc++-v3/testsuite/std/ranges/view.cc
  e9dd29c8ada0e4f7673523df4dc8c5e7  libstdc++-v3/testsuite/std/ranges/zip/1.cc
  2a24268e29bff5326b9f5c3f611001c8  libstdc++-v3/testsuite/std/ranges/zip_transform/1.cc
+ 664ab62f3f817fa28590302cc4d59f80  libstdc++-v3/testsuite/std/simd/arithmetic.cc
+ 569b9b8ab0246858be03b5ffa569ab96  libstdc++-v3/testsuite/std/simd/arithmetic_expensive.cc
+ 0f4c54b7b254944dcf6c0f1855cc40df  libstdc++-v3/testsuite/std/simd/create_tests.h
+ 9b598d4b775185bb1de84c0042b7d986  libstdc++-v3/testsuite/std/simd/creation.cc
+ fc13a9c7f7b490d52c5be7d09a7303ce  libstdc++-v3/testsuite/std/simd/creation_expensive.cc
+ 6e7f1bc368353b50746851f2db69ea8a  libstdc++-v3/testsuite/std/simd/loads.cc
+ d97ae2fbf0aee2b0ccaa4194a3adc376  libstdc++-v3/testsuite/std/simd/loads_expensive.cc
+ 8f1af776b6ae878b83acbf3e0ecb62e7  libstdc++-v3/testsuite/std/simd/mask.cc
+ fc1a1e311b5b752e428ec26872b5d7ec  libstdc++-v3/testsuite/std/simd/mask2.cc
+ a14f54fcf17508ffb878edcc25d6b8a2  libstdc++-v3/testsuite/std/simd/mask2_expensive.cc
+ e7e019cf42151c06393fa78a55116468  libstdc++-v3/testsuite/std/simd/mask_expensive.cc
+ fb153cb262def8b5964b757ab18f2530  libstdc++-v3/testsuite/std/simd/reductions.cc
+ 27f9ce53b3483dc5d5689600c126fb76  libstdc++-v3/testsuite/std/simd/reductions_expensive.cc
+ c0ed33eb99bd32e6e895d4c6cda7c334  libstdc++-v3/testsuite/std/simd/shift_left.cc
+ b9f535cf8c1beab2ba35c6905c9b22e5  libstdc++-v3/testsuite/std/simd/shift_left_expensive.cc
+ 5b993d4ef111673f009ecfb3ebb61377  libstdc++-v3/testsuite/std/simd/shift_right.cc
+ a0effa71ab3d6d835d08207d70fd58d1  libstdc++-v3/testsuite/std/simd/shift_right_expensive.cc
+ e0e86460d919a7d97bfb262951567abe  libstdc++-v3/testsuite/std/simd/simd_alg.cc
+ eeda748684ccc6d60e5b1359e8c317d4  libstdc++-v3/testsuite/std/simd/simd_alg_expensive.cc
+ c75a621915e96df6aac89c4a4e24340d  libstdc++-v3/testsuite/std/simd/sse_intrin.cc
+ 8fde1ca2825b6323095d46b0560cef96  libstdc++-v3/testsuite/std/simd/stores.cc
+ eaf0f99b288f1668d8cd691e3ce1a6d9  libstdc++-v3/testsuite/std/simd/stores_expensive.cc
+ 9555f30a8004fbe5c183c3d458dbe0c7  libstdc++-v3/testsuite/std/simd/test_setup.h
+ 97ab8cc8c8c9aa9bbb21a67925fe50a5  libstdc++-v3/testsuite/std/simd/traits_common.cc
+ 1a84cece7ee7c47cfaeaeef4a5ecd6dc  libstdc++-v3/testsuite/std/simd/traits_impl.cc
+ 4a6cbcf08129d0510e60279bb8f1e88a  libstdc++-v3/testsuite/std/simd/traits_math.cc
  a0efc42f3d3e1e881d69063fe7f2c586  libstdc++-v3/testsuite/std/text_encoding/cons.cc
  bfa6a93e5c5cd2d11c1eddd5572fd5de  libstdc++-v3/testsuite/std/text_encoding/members.cc
  e9ef3f2b572f799b265913487f27690b  libstdc++-v3/testsuite/std/text_encoding/requirements.cc
*************** dd57c14e38e93b2a78361d6e4c7350b1  libstd
*** 156740,156747 ****
  a0be85b8053be995a48a4cfec6a5b675  libstdc++-v3/testsuite/std/time/parse/114279.cc
  5762399d57d6d0d2d2d8cd51ff3f423d  libstdc++-v3/testsuite/std/time/parse/parse.cc
  f16dd4eb7915f1558b6ae75425ab2987  libstdc++-v3/testsuite/std/time/syn_c++20.cc
  f9d9d1cb483f1731762a8e5787c8020b  libstdc++-v3/testsuite/std/time/time_zone/get_info_local.cc
! d041367e20c424ad627fce102335edd0  libstdc++-v3/testsuite/std/time/time_zone/get_info_sys.cc
  efdc68d548df15089ce510e6bf1c33c7  libstdc++-v3/testsuite/std/time/time_zone/requirements.cc
  105f0ca3c8074ef3b2c1751d37ec2b96  libstdc++-v3/testsuite/std/time/time_zone/sys_info_abbrev.cc
  62c56a128f0d03b2e348296c7a54ee3f  libstdc++-v3/testsuite/std/time/traits/is_clock.cc
--- 156855,156864 ----
  a0be85b8053be995a48a4cfec6a5b675  libstdc++-v3/testsuite/std/time/parse/114279.cc
  5762399d57d6d0d2d2d8cd51ff3f423d  libstdc++-v3/testsuite/std/time/parse/parse.cc
  f16dd4eb7915f1558b6ae75425ab2987  libstdc++-v3/testsuite/std/time/syn_c++20.cc
+ 942f5bb5a199e3f7b0821958da8b265a  libstdc++-v3/testsuite/std/time/time_zone/116110.cc
+ e5f71dc7f2292314c0c9b06c3b8acf2e  libstdc++-v3/testsuite/std/time/time_zone/124513.cc
  f9d9d1cb483f1731762a8e5787c8020b  libstdc++-v3/testsuite/std/time/time_zone/get_info_local.cc
! 5c55d9e35cb8c9c5e0a207bd53fa37d2  libstdc++-v3/testsuite/std/time/time_zone/get_info_sys.cc
  efdc68d548df15089ce510e6bf1c33c7  libstdc++-v3/testsuite/std/time/time_zone/requirements.cc
  105f0ca3c8074ef3b2c1751d37ec2b96  libstdc++-v3/testsuite/std/time/time_zone/sys_info_abbrev.cc
  62c56a128f0d03b2e348296c7a54ee3f  libstdc++-v3/testsuite/std/time/traits/is_clock.cc
*************** c2b7633026b3fcd6a0e292699193dc26  libstd
*** 156779,156785 ****
  20fd7f7e86b0ca4de006d76a50f68c55  libstdc++-v3/testsuite/std/time/year_month_weekday_last/1.cc
  8c877daa283e4ffd73c4655a8641c7de  libstdc++-v3/testsuite/std/time/year_month_weekday_last/2.cc
  c09c39ea2316a7406221fdcc593170e1  libstdc++-v3/testsuite/std/time/year_month_weekday_last/io.cc
! 728832c3eb4e89e18aaf1a2ed1be2271  libstdc++-v3/testsuite/std/time/zoned_time/1.cc
  6e26d84ca6efe0ea496ba2fcc8ee280b  libstdc++-v3/testsuite/std/time/zoned_time/custom.cc
  6abf80ca9a7f01e8d061066eecdd2022  libstdc++-v3/testsuite/std/time/zoned_time/deduction.cc
  b817e9c1855b1b139f12f498f1c9db67  libstdc++-v3/testsuite/std/time/zoned_time/io.cc
--- 156896,156902 ----
  20fd7f7e86b0ca4de006d76a50f68c55  libstdc++-v3/testsuite/std/time/year_month_weekday_last/1.cc
  8c877daa283e4ffd73c4655a8641c7de  libstdc++-v3/testsuite/std/time/year_month_weekday_last/2.cc
  c09c39ea2316a7406221fdcc593170e1  libstdc++-v3/testsuite/std/time/year_month_weekday_last/io.cc
! fa43bb38cebbbda727864c9b2ac9b67b  libstdc++-v3/testsuite/std/time/zoned_time/1.cc
  6e26d84ca6efe0ea496ba2fcc8ee280b  libstdc++-v3/testsuite/std/time/zoned_time/custom.cc
  6abf80ca9a7f01e8d061066eecdd2022  libstdc++-v3/testsuite/std/time/zoned_time/deduction.cc
  b817e9c1855b1b139f12f498f1c9db67  libstdc++-v3/testsuite/std/time/zoned_time/io.cc
diff -Nrcpad gcc-16-20260315/gcc/ChangeLog gcc-16-20260322/gcc/ChangeLog
*** gcc-16-20260315/gcc/ChangeLog	Sun Mar 15 22:32:06 2026
--- gcc-16-20260322/gcc/ChangeLog	Sun Mar 22 22:32:05 2026
***************
*** 1,3 ****
--- 1,233 ----
+ 2026-03-21  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR target/123852
+ 	* config/sh/sh.md (movsicc_t_false): Add the SImode
+ 	on the if_then_else.
+ 	(movsicc_t_true): Likewise.
+ 	(negsi_cond): Likewise.
+ 	(negdi_cond): Add the DImode on the if_then_else.
+ 	(bst_m2a): Add the QImode on the if_then_else.
+ 
+ 2026-03-20  Tobias Burnus  <tburnus@baylibre.com>
+ 	    Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR c/122866
+ 	* gimplify.cc (omp_instantiate_mapper): Give a sorry if there are
+ 	iterators.
+ 
+ 2026-03-20  Kwok Cheung Yeung  <kcyeung@baylibre.com>
+ 	    Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* gimplify.cc (gimplify_omp_workshare): Handle iterators in
+ 	"target data".
+ 
+ 2026-03-20  Kyrylo Tkachov  <ktkachov@nvidia.com>
+ 
+ 	* config/aarch64/tuning_models/olympus.h (olympus_tunings): Set
+ 	loop_align to 64:16.
+ 
+ 2026-03-20  Takayuki 'January June' Suwa  <jjsuwa_sys3175@yahoo.co.jp>
+ 
+ 	* config/xtensa/xtensa.cc (gen_int_relational):
+ 	Specify the table array "info" and the pointer to its elements
+ 	as const.
+ 
+ 2026-03-20  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR target/124565
+ 	* config/i386/i386.cc (ix86_build_builtin_va_list_64): Set TREE_PUBLIC
+ 	on type_decl.
+ 
+ 2026-03-20  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR target/124566
+ 	* config/sh/sh.cc (sh_build_builtin_va_list): Set TREE_PUBLIC
+ 	on type_decl.
+ 
+ 2026-03-20  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/124578
+ 	* tree-ssa-sccvn.cc (vn_reference_eq): Consistently check
+ 	fields from vro2.
+ 
+ 2026-03-20  Yangyu Chen  <cyy@cyyself.name>
+ 
+ 	* config/aarch64/aarch64.cc (aarch64_generate_version_dispatcher_body):
+ 	Check DECL_VIRTUAL_P for virtual functions for LTO handling.
+ 	* config/i386/i386-features.cc (ix86_generate_version_dispatcher_body):
+ 	Ditto.
+ 	* config/riscv/riscv.cc (riscv_generate_version_dispatcher_body): Ditto.
+ 	* config/rs6000/rs6000.cc (rs6000_generate_version_dispatcher_body):
+ 	Ditto.
+ 	* config/loongarch/loongarch.cc
+ 	(loongarch_generate_version_dispatcher_body): Ditto.
+ 
+ 2026-03-19  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR target/124565
+ 	* config/alpha/alpha.cc (alpha_build_builtin_va_list): Set TREE_PUBLIC
+ 	on type_decl.
+ 
+ 2026-03-19  Dhruv Chawla  <dhruvc@nvidia.com>
+ 
+ 	* common.opt.urls: Added missing entry.
+ 
+ 2026-03-18  Vladimir N. Makarov  <vmakarov@redhat.com>
+ 
+ 	PR rtl-optimization/124041
+ 	PR rtl-optimization/124439
+ 	* lra-constraints.cc (process_alt_operands): Check hard reg subreg
+ 	mode by hard_regno_mode_ok.
+ 	(curr_insn_transform): Always subsitute equivalence for hard reg
+ 	subreg.
+ 
+ 2026-03-18  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/124555
+ 	* match.pd ((A - B) >=/> 0 ? (A - B) : (B - A) -> abs (A - B)):
+ 	Guard the vector case with target_supports_op_p checks.
+ 	((A - B) <=/< 0 ? (A - B) : (B - A) -> -abs (A - B)): Likewise.
+ 	((type)A >=/> 0 ? A : -A -> abs (A)): Likewise.
+ 	((type)A <=/< 0 ? A : -A -> -abs (A)): Likewise.
+ 
+ 2026-03-18  Dhruv Chawla  <dhruvc@nvidia.com>
+ 
+ 	* Makefile.in (all.fda): Add `--print-autofdo-gcov-version` to
+ 	profile_merger invocation.
+ 	* auto-profile.cc (AUTO_PROFILE_VERSION): Move from here ...
+ 	* auto-profile.h (AUTO_PROFILE_VERSION): ... to here.
+ 	* common.opt: Add -print-autofdo-gcov-version and
+ 	--print-autofdo-gcov-version.
+ 	* doc/invoke.texi: Document the options.
+ 	* gcc.cc: Add include for auto-profile.h.
+ 	(driver_handle_option): Add OPT_print_autofdo_gcov_version.
+ 	(driver::maybe_print_and_exit): Handle the option.
+ 
+ 2026-03-18  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR middle-end/124552
+ 	* function.cc (free_after_compilation): Free the copyid
+ 	allocator.
+ 
+ 2026-03-18  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR bootstrap/124547
+ 	* configure.ac (--with-gnu-ld): Set gnu_ld_flag= instead of
+ 	gnu_ld_flag=no if not explicitly specified.
+ 	(--with-gnu-as): Similarly for gas_flag.
+ 	(DEFAULT_ASSEMBLER): Use wording without GNU as whenever gas_flag
+ 	is not yes rather than when it is no.
+ 	* configure: Regenerate.
+ 
+ 2026-03-18  Richard Biener  <rguenther@suse.de>
+ 
+ 	* common.opt (fpost-ipa-mem-report): Fix typo.
+ 
+ 2026-03-18  Richard Biener  <rguenther@suse.de>
+ 
+ 	* ipa-cp.cc (gather_edges_for_value): Return an auto_vec.
+ 	(decide_about_value): Simplify, fixing leak of callers.
+ 
+ 2026-03-18  Prachi Godbole  <pgodbole@nvidia.com>
+ 
+ 	PR target/123749
+ 	* ipa-locality-cloning.cc (partition_callchain): Start new partition
+ 	if no. of insns exceeds size and if there are nodes to process.
+ 
+ 2026-03-18  Sebastian Huber  <sebastian.huber@embedded-brains.de>
+ 
+ 	* config/sparc/t-rtems: Add leon5 multilibs.
+ 
+ 2026-03-17  Alice Carlotti  <alice.carlotti@arm.com>
+ 
+ 	* config/aarch64/aarch64-sve2.md (@aarch64_pred_revd<mode>):
+ 	Remove movprfx alternative.
+ 	(@cond_revd<mode>): Likewise.
+ 
+ 2026-03-17  Philipp Tomsich  <philipp.tomsich@vrull.eu>
+ 
+ 	PR rtl-optimization/124476
+ 	* avoid-store-forwarding.cc
+ 	(store_forwarding_analyzer::process_store_forwarding): Replace
+ 	bitmap_all_bits_in_range_p with bitmap_any_bit_in_range_p and
+ 	return false on partial overlap.  Remove redundant-store vectors
+ 	and their associated removal, dump, and deletion logic.
+ 
+ 2026-03-17  Richard Biener  <rguenther@suse.de>
+ 
+ 	* tree-vect-slp.cc (vect_analyze_slp): Release BST map when
+ 	returning.
+ 
+ 2026-03-17  Richard Biener  <rguenther@suse.de>
+ 
+ 	* tree-vect-loop.cc (_loop_vec_info::_loop_vec_info):
+ 	Initialize loop_iv_cond given it's no longer always
+ 	initialized ...
+ 	(vect_create_loop_vinfo): ... here.  Fix formatting.
+ 
+ 2026-03-17  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/122380
+ 	* tree-ssa-sccvn.h (copy_reference_ops_from_ref): Declare.
+ 	(vn_reference_compute_hash): Likewise.
+ 	(vn_reference_eq): Add parameter indicating lexical equivalence,
+ 	defaulted to false.
+ 	* tree-ssa-sccvn.cc (vn_reference_eq): Likewise.
+ 	(print_vn_reference_ops): Print alias type and alignment.
+ 	(vn_reference_compute_hash): Export.
+ 	(copy_reference_ops_from_ref): Likewise.
+ 	* tree-ssa-pre.cc (pre_expr_d::equal): Use lexical equivalence.
+ 	(get_or_alloc_expr_for_reference): Also get value-id, upon
+ 	zero assign a new value-id if the expression is unknown.
+ 	(expr_cmp): New helper.
+ 	(prefer): Likewise.
+ 	(pre_expr_DFS): Get expression exclusion bitmap and honor it.
+ 	(sorted_array_from_bitmap_set): If done for insertion, do limited
+ 	canonexpr() via pairwise prefer on expression pairs with the same
+ 	value, populating an exclution bitmap.
+ 	(phi_translate_1): Do not use the VN hashtable expressions
+ 	or insert there.  Instead maintain a PRE view of expressions.
+ 	(clean): Adjust.
+ 	(do_hoist_insertion): Likewise.
+ 	(insert): Likewise.
+ 	(compute_avail): Use gimple_could_trap_p_1
+ 	on the original stmt rather than vn_reference_may_trap on
+ 	the VN leader.  Use the original stmt operands for the PRE
+ 	view of reference expressions, only use the value number from the VN
+ 	tables.  Remove no longer effective workarounds for semantically
+ 	different references with same value.
+ 	(fini_pre): Release operand vectors for PRE IL reference
+ 	expressions.
+ 
+ 2026-03-17  Yangyu Chen  <cyy@cyyself.name>
+ 
+ 	* config/i386/i386-features.cc (make_resolver_func): Use
+ 	symtab->change_decl_assembler_name instead of
+ 	SET_DECL_ASSEMBLER_NAME to properly update the symbol table.
+ 
+ 2026-03-16  Jose E. Marchesi  <jemarch@gnu.org>
+ 
+ 	* doc/install.texi (Configuration): Fix copy pasto
+ 	--enable-objc-gc to --enable-algol68-gc.
+ 
+ 2026-03-16  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/124528
+ 	* tree-scalar-evolution.cc (scev_dfs::add_to_evolution):
+ 	Perform the negation in an unsigned type if we cannot make
+ 	sure it will not cause UB.
+ 
+ 2026-03-16  Kito Cheng  <kito.cheng@sifive.com>
+ 
+ 	* doc/invoke.texi: Add experimental warning for RISC-V
+ 	big-endian support.
+ 
+ 2026-03-16  Takayuki 'January June' Suwa  <jjsuwa_sys3175@yahoo.co.jp>
+ 
+ 	* config/xtensa/xtensa.cc
+ 	(constantsynth_method_lshr_mi12b): New.
+ 	(constantsynth_methods): Add constantsynth_method_lshr_mi12b.
+ 
  2026-03-14  Jakub Jelinek  <jakub@redhat.com>
  
  	PR other/124508
diff -Nrcpad gcc-16-20260315/gcc/DATESTAMP gcc-16-20260322/gcc/DATESTAMP
*** gcc-16-20260315/gcc/DATESTAMP	Sun Mar 15 22:32:06 2026
--- gcc-16-20260322/gcc/DATESTAMP	Sun Mar 22 22:32:05 2026
***************
*** 1 ****
! 20260315
--- 1 ----
! 20260322
diff -Nrcpad gcc-16-20260315/gcc/Makefile.in gcc-16-20260322/gcc/Makefile.in
*** gcc-16-20260315/gcc/Makefile.in	Sun Mar 15 22:32:06 2026
--- gcc-16-20260322/gcc/Makefile.in	Sun Mar 22 22:32:05 2026
*************** paranoia: paranoia.o real.o $(LIBIBERTY)
*** 4819,4825 ****
  	g++ -o $@ paranoia.o real.o $(LIBIBERTY)
  
  all.fda: $(ALL_FDAS)
! 	$(PROFILE_MERGER) $(ALL_FDAS) --output_file all.fda -gcov_version 3
  
  # These exist for maintenance purposes.
  
--- 4819,4825 ----
  	g++ -o $@ paranoia.o real.o $(LIBIBERTY)
  
  all.fda: $(ALL_FDAS)
! 	$(PROFILE_MERGER) $(ALL_FDAS) --output_file all.fda -gcov_version `../stage1-gcc/xgcc$(exeext) --print-autofdo-gcov-version`
  
  # These exist for maintenance purposes.
  
diff -Nrcpad gcc-16-20260315/gcc/ada/ChangeLog gcc-16-20260322/gcc/ada/ChangeLog
*** gcc-16-20260315/gcc/ada/ChangeLog	Sun Mar 15 22:32:06 2026
--- gcc-16-20260322/gcc/ada/ChangeLog	Sun Mar 22 22:32:05 2026
***************
*** 1,3 ****
--- 1,22 ----
+ 2026-03-20  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	PR ada/120669
+ 	* sem_ch4.adb (Analyze_Explicit_Dereference): Remove interpretations
+ 	of the prefix only if they are of access types.
+ 	(Analyze_One_Call.Indicate_Name_And_Type): Check for an implicit
+ 	dereference only after indicating the name and type of the call.
+ 	* sem_ch5.adb (Analyze_Assignment): Do not remove interpretations
+ 	for the LHS if they are for a type with implicit dereference.
+ 	* sem_res.adb (Resolve): Streamline the processing of overloaded
+ 	nodes once an interpretation is picked for them.  Add a specific
+ 	handling for additional interpretations for generalized references.
+ 	(Resolve_Explicit_Dereference): Remove interpretations of the prefix
+ 	only if they are of access types.
+ 	(Is_Ambiguous_Operand): Skip the direct interpretation for a limited
+ 	type that has implicit dereference.
+ 	* sem_type.adb (Add_One_Interp): Set the name of the first entry of
+ 	the table of interpretations in more cases.
+ 
  2026-03-14  Matthias Klose  <doko@gcc.gnu.org>
  
  	PR ada/107475
diff -Nrcpad gcc-16-20260315/gcc/ada/sem_ch4.adb gcc-16-20260322/gcc/ada/sem_ch4.adb
*** gcc-16-20260315/gcc/ada/sem_ch4.adb	Sun Mar 15 22:32:06 2026
--- gcc-16-20260322/gcc/ada/sem_ch4.adb	Sun Mar 22 22:32:05 2026
*************** package body Sem_Ch4 is
*** 2335,2346 ****
              while Present (It.Nam) loop
                 T := It.Typ;
  
!                if Is_Access_Type (T)
!                  and then No (First_Formal (Base_Type (Designated_Type (T))))
!                then
!                   Set_Etype (P, T);
!                else
!                   Remove_Interp (I);
                 end if;
  
                 Get_Next_Interp (I, It);
--- 2335,2346 ----
              while Present (It.Nam) loop
                 T := It.Typ;
  
!                if Is_Access_Type (T) then
!                   if No (First_Formal (Base_Type (Designated_Type (T)))) then
!                      Set_Etype (P, T);
!                   else
!                      Remove_Interp (I);
!                   end if;
                 end if;
  
                 Get_Next_Interp (I, It);
*************** package body Sem_Ch4 is
*** 3843,3853 ****
        procedure Indicate_Name_And_Type is
        begin
           Add_One_Interp (N, Nam, Etype (Nam));
-          Check_Implicit_Dereference (N, Etype (Nam));
-          Success := True;
  
!          --  If the prefix of the call is a name, indicate the entity
!          --  being called. If it is not a name, it is an expression that
           --  denotes an access to subprogram or else an entry or family. In
           --  the latter case, the name is a selected component, and the entity
           --  being called is noted on the selector.
--- 3843,3851 ----
        procedure Indicate_Name_And_Type is
        begin
           Add_One_Interp (N, Nam, Etype (Nam));
  
!          --  If the prefix of the call is an entity name, indicate the entity
!          --  being called. If it is not such a name, it is an expression that
           --  denotes an access to subprogram or else an entry or family. In
           --  the latter case, the name is a selected component, and the entity
           --  being called is noted on the selector.
*************** package body Sem_Ch4 is
*** 3862,3867 ****
--- 3860,3870 ----
              end if;
           end if;
  
+          --  Now add an interpretation for the implicit dereference, if any
+ 
+          Check_Implicit_Dereference (N, Etype (Nam));
+          Success := True;
+ 
           if Debug_Flag_E and not Report then
              Write_Str (" Overloaded call ");
              Write_Int (Int (N));
diff -Nrcpad gcc-16-20260315/gcc/ada/sem_ch5.adb gcc-16-20260322/gcc/ada/sem_ch5.adb
*** gcc-16-20260315/gcc/ada/sem_ch5.adb	Sun Mar 15 22:32:06 2026
--- gcc-16-20260322/gcc/ada/sem_ch5.adb	Sun Mar 22 22:32:05 2026
*************** package body Sem_Ch5 is
*** 455,462 ****
                 Get_First_Interp (Lhs, I, It);
  
                 while Present (It.Typ) loop
                    if Is_Limited_Type (It.Typ) then
!                      Remove_Interp (I);
                    elsif T1 = Any_Type then
                       T1 := It.Typ;
                    end if;
--- 455,468 ----
                 Get_First_Interp (Lhs, I, It);
  
                 while Present (It.Typ) loop
+                   --  AI22-0112 restores the Ada 95 rule that excludes limited
+                   --  types from consideration during resolution of the target
+                   --  variable in assignment statements.
+ 
                    if Is_Limited_Type (It.Typ) then
!                      if not Has_Implicit_Dereference (It.Typ) then
!                         Remove_Interp (I);
!                      end if;
                    elsif T1 = Any_Type then
                       T1 := It.Typ;
                    end if;
*************** package body Sem_Ch5 is
*** 505,511 ****
                    --  variable in assignment statements.
  
                    if Is_Limited_Type (It.Typ) then
!                      Remove_Interp (I);
  
                    elsif Has_Compatible_Type (Rhs, It.Typ) then
                       if T1 = Any_Type then
--- 511,519 ----
                    --  variable in assignment statements.
  
                    if Is_Limited_Type (It.Typ) then
!                      if not Has_Implicit_Dereference (It.Typ) then
!                         Remove_Interp (I);
!                      end if;
  
                    elsif Has_Compatible_Type (Rhs, It.Typ) then
                       if T1 = Any_Type then
diff -Nrcpad gcc-16-20260315/gcc/ada/sem_res.adb gcc-16-20260322/gcc/ada/sem_res.adb
*** gcc-16-20260315/gcc/ada/sem_res.adb	Sun Mar 15 22:32:06 2026
--- gcc-16-20260322/gcc/ada/sem_res.adb	Sun Mar 22 22:32:05 2026
*************** package body Sem_Res is
*** 2287,2292 ****
--- 2287,2293 ----
        I1        : Interp_Index := 0;  -- prevent junk warning
        It        : Interp;
        It1       : Interp;
+       Prev_It   : Interp := No_Interp;
        Seen      : Entity_Id := Empty; -- prevent junk warning
  
        function Comes_From_Predefined_Lib_Unit (Nod : Node_Id) return Boolean;
*************** package body Sem_Res is
*** 2858,2943 ****
                 --  We have a matching interpretation, Expr_Type is the type
                 --  from this interpretation, and Seen is the entity.
  
!                --  For an operator, just set the entity name. The type will be
!                --  set by the specific operator resolution routine.
! 
!                if Nkind (N) in N_Op then
!                   Set_Entity (N, Seen);
!                   Generate_Reference (Seen, N);
  
!                elsif Nkind (N) in N_Case_Expression
!                                 | N_Character_Literal
!                                 | N_Delta_Aggregate
!                                 | N_If_Expression
                 then
!                   Set_Etype (N, Expr_Type);
! 
!                --  AI05-0139-2: Expression is overloaded because type has
!                --  implicit dereference. The context may be the one that
!                --  requires implicit dereferemce.
! 
!                elsif Has_Implicit_Dereference (Expr_Type) then
!                   Set_Etype (N, Expr_Type);
!                   Set_Is_Overloaded (N, False);
  
!                --  If the expression is an entity, generate a reference
!                --  to it, as this is not done for an overloaded construct
!                --  during analysis.
  
!                   if Is_Entity_Name (N)
!                     and then Comes_From_Source (N)
                    then
!                      Generate_Reference (Entity (N), N);
! 
!                      --  Examine access discriminants of entity type,
!                      --  to check whether one of them yields the
!                      --  expected type.
! 
!                      declare
!                         Disc : Entity_Id :=
!                           First_Discriminant (Etype (Entity (N)));
! 
!                      begin
!                         while Present (Disc) loop
!                            exit when Is_Access_Type (Etype (Disc))
!                              and then Has_Implicit_Dereference (Disc)
!                              and then Designated_Type (Etype (Disc)) = Typ;
  
!                            Next_Discriminant (Disc);
!                         end loop;
  
!                         if Present (Disc) then
!                            Build_Explicit_Dereference (N, Disc);
!                         end if;
!                      end;
!                   end if;
  
!                   exit Interp_Loop;
  
!                elsif Is_Overloaded (N)
!                  and then Present (It.Nam)
!                  and then Ekind (It.Nam) = E_Discriminant
!                  and then Has_Implicit_Dereference (It.Nam)
!                then
!                   --  If the node is a general indexing, the dereference is
!                   --  is inserted when resolving the rewritten form, else
!                   --  insert it now.
  
!                   if Nkind (N) /= N_Indexed_Component
!                     or else No (Generalized_Indexing (N))
!                   then
!                      Build_Explicit_Dereference (N, It.Nam);
!                   end if;
  
!                --  For an explicit dereference, attribute reference, range,
!                --  short-circuit form (which is not an operator node), or call
!                --  with a name that is an explicit dereference, there is
!                --  nothing to be done at this point.
  
                 elsif Nkind (N) in N_Attribute_Reference
                                  | N_And_Then
                                  | N_Explicit_Dereference
!                                 | N_Identifier
                                  | N_Indexed_Component
                                  | N_Or_Else
                                  | N_Range
--- 2859,2917 ----
                 --  We have a matching interpretation, Expr_Type is the type
                 --  from this interpretation, and Seen is the entity.
  
!                --  If this is an additional interpretation introduced by
!                --  Check_Implicit_Dereference, the actual interpretation
!                --  for N was the previous one. Resolve N and insert the
!                --  explicit dereference.
  
!                if Present (It.Nam)
!                  and then Ekind (It.Nam) = E_Discriminant
!                  and then Has_Implicit_Dereference (It.Nam)
!                  and then (Nkind (N) /= N_Indexed_Component
!                             or else No (Generalized_Indexing (N)))
                 then
!                   pragma Assert (Prev_It /= No_Interp);
  
!                   if Is_Entity_Name (N) then
!                      Set_Etype  (N, Prev_It.Typ);
!                      Set_Entity (N, Prev_It.Nam);
!                      Generate_Reference (Prev_It.Nam, N);
  
!                   elsif Nkind (N) in N_Subprogram_Call
!                     and then Is_Entity_Name (Name (N))
                    then
!                      Set_Etype  (Name (N), Prev_It.Typ);
!                      Set_Entity (Name (N), Prev_It.Nam);
!                      Generate_Reference (Prev_It.Nam, Name (N));
!                      Set_Is_Overloaded (Name (N), False);
!                   end if;
  
!                   Build_Explicit_Dereference (N, It.Nam);
  
!                --  For an operator, just set the entity. The type will be
!                --  set by the specific operator resolution routine.
  
!                elsif Nkind (N) in N_Op then
!                   Set_Entity (N, Seen);
!                   Generate_Reference (Seen, N);
  
!                --  For an entity name, set both the type and the entity
  
!                elsif Is_Entity_Name (N) then
!                   Set_Etype  (N, Expr_Type);
!                   Set_Entity (N, Seen);
!                   Generate_Reference (Seen, N);
  
!                --  For nodes other than calls, or calls with a name that is an
!                --  explicit dereference, there is nothing to be done.
  
                 elsif Nkind (N) in N_Attribute_Reference
                                  | N_And_Then
+                                 | N_Case_Expression
+                                 | N_Character_Literal
+                                 | N_Delta_Aggregate
                                  | N_Explicit_Dereference
!                                 | N_If_Expression
                                  | N_Indexed_Component
                                  | N_Or_Else
                                  | N_Range
*************** package body Sem_Res is
*** 2947,2975 ****
                 then
                    null;
  
!                --  For procedure or function calls, set the type of the name,
!                --  and also the entity pointer for the prefix.
  
!                elsif Nkind (N) in N_Subprogram_Call
!                  and then Is_Entity_Name (Name (N))
!                then
                    Set_Etype  (Name (N), Expr_Type);
                    Set_Entity (Name (N), Seen);
                    Generate_Reference (Seen, Name (N));
  
!                elsif Nkind (N) = N_Function_Call
!                  and then Nkind (Name (N)) = N_Selected_Component
!                then
                    Set_Etype (Name (N), Expr_Type);
                    Set_Entity (Selector_Name (Name (N)), Seen);
                    Generate_Reference (Seen, Selector_Name (Name (N)));
  
!                --  For all other cases, just set the type of the Name
  
                 else
                    Set_Etype (Name (N), Expr_Type);
                 end if;
- 
              end if;
  
              <<Continue>>
--- 2921,2943 ----
                 then
                    null;
  
!                --  For some calls, set the type and entity of the name
  
!                elsif Is_Entity_Name (Name (N)) then
                    Set_Etype  (Name (N), Expr_Type);
                    Set_Entity (Name (N), Seen);
                    Generate_Reference (Seen, Name (N));
  
!                elsif Nkind (Name (N)) = N_Selected_Component then
                    Set_Etype (Name (N), Expr_Type);
                    Set_Entity (Selector_Name (Name (N)), Seen);
                    Generate_Reference (Seen, Selector_Name (Name (N)));
  
!                --  For other calls, just set the type of the Name
  
                 else
                    Set_Etype (Name (N), Expr_Type);
                 end if;
              end if;
  
              <<Continue>>
*************** package body Sem_Res is
*** 2978,2983 ****
--- 2946,2953 ----
  
              exit Interp_Loop when No (It.Typ);
  
+             Prev_It := It;
+ 
              Get_Next_Interp (I, It);
           end loop Interp_Loop;
        end if;
*************** package body Sem_Res is
*** 9324,9342 ****
           Get_First_Interp (P, I, It);
  
           while Present (It.Typ) loop
!             if Is_Access_Type (It.Typ)
!               and then Covers (Typ, Designated_Type (It.Typ))
!             then
!                if No (P_Typ) then
!                   P_Typ := It.Typ;
!                end if;
  
!             --  Remove access types that do not match, but preserve access
!             --  to subprogram interpretations, in case a further dereference
!             --  is needed (see below).
  
!             elsif Ekind (It.Typ) /= E_Access_Subprogram_Type then
!                Remove_Interp (I);
              end if;
  
              Get_Next_Interp (I, It);
--- 9294,9312 ----
           Get_First_Interp (P, I, It);
  
           while Present (It.Typ) loop
!             if Is_Access_Type (It.Typ) then
!                if Covers (Typ, Designated_Type (It.Typ)) then
!                   if No (P_Typ) then
!                      P_Typ := It.Typ;
!                   end if;
  
!                --  Remove access types that do not match, but preserve access
!                --  to subprogram interpretations, in case a further dereference
!                --  is needed (see below).
  
!                elsif Ekind (It.Typ) /= E_Access_Subprogram_Type then
!                   Remove_Interp (I);
!                end if;
              end if;
  
              Get_Next_Interp (I, It);
*************** package body Sem_Res is
*** 13769,13774 ****
--- 13739,13755 ----
           return True;
        end if;
  
+       --  Skip the direct interpretation for a limited type that has implicit
+       --  dereference, since it cannot be used for operands of an assignment,
+       --  per AI22-0112 which restores the Ada 95 rule for all versions.
+ 
+       if Present (It.Typ)
+         and then Is_Limited_Type (It.Typ)
+         and then Has_Implicit_Dereference (It.Typ)
+       then
+          Get_Next_Interp (I, It);
+       end if;
+ 
        I1  := I;
        It1 := It;
  
diff -Nrcpad gcc-16-20260315/gcc/ada/sem_type.adb gcc-16-20260322/gcc/ada/sem_type.adb
*** gcc-16-20260315/gcc/ada/sem_type.adb	Sun Mar 15 22:32:06 2026
--- gcc-16-20260322/gcc/ada/sem_type.adb	Sun Mar 22 22:32:05 2026
*************** package body Sem_Type is
*** 476,488 ****
           then
              Add_Entry (Entity (Name (N)), Etype (N));
  
           --  If this is an indirect call there will be no name associated
           --  with the previous entry. To make diagnostics clearer, save
           --  Subprogram_Type of first interpretation, so that the error will
           --  point to the anonymous access to subprogram, not to the result
           --  type of the call itself.
  
!          elsif (Nkind (N)) = N_Function_Call
             and then Nkind (Name (N)) = N_Explicit_Dereference
             and then Is_Overloaded (Name (N))
           then
--- 476,494 ----
           then
              Add_Entry (Entity (Name (N)), Etype (N));
  
+          elsif Nkind (N) = N_Function_Call
+            and then Nkind (Name (N)) = N_Selected_Component
+            and then Is_Entity_Name (Selector_Name (Name (N)))
+          then
+             Add_Entry (Entity (Selector_Name (Name (N))), Etype (N));
+ 
           --  If this is an indirect call there will be no name associated
           --  with the previous entry. To make diagnostics clearer, save
           --  Subprogram_Type of first interpretation, so that the error will
           --  point to the anonymous access to subprogram, not to the result
           --  type of the call itself.
  
!          elsif Nkind (N) = N_Function_Call
             and then Nkind (Name (N)) = N_Explicit_Dereference
             and then Is_Overloaded (Name (N))
           then
*************** package body Sem_Type is
*** 497,506 ****
                 Add_Entry (It.Nam, Etype (N));
              end;
  
!          else
!             --  Overloaded prefix in indexed or selected component, or call
!             --  whose name is an expression or another call.
  
              Add_Entry (Etype (N), Etype (N));
           end if;
  
--- 503,519 ----
                 Add_Entry (It.Nam, Etype (N));
              end;
  
!          --  If this is a generalized indexing, treat it as a function call
! 
!          elsif Nkind (N) = N_Indexed_Component
!            and then Present (Generalized_Indexing (N))
!          then
!             Add_Entry (Entity (Name (Generalized_Indexing (N))), Etype (N));
  
+          --  An overloaded prefix in indexed or selected component, or a call
+          --  whose name is an expression or another call.
+ 
+          else
              Add_Entry (Etype (N), Etype (N));
           end if;
  
diff -Nrcpad gcc-16-20260315/gcc/auto-profile.cc gcc-16-20260322/gcc/auto-profile.cc
*** gcc-16-20260315/gcc/auto-profile.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/auto-profile.cc	Sun Mar 22 22:32:06 2026
*************** along with GCC; see the file COPYING3.
*** 122,128 ****
  */
  
  #define DEFAULT_AUTO_PROFILE_FILE "fbdata.afdo"
- #define AUTO_PROFILE_VERSION 3
  
  /* profile counts determined by AFDO smaller than afdo_hot_bb_threshold are
     considered cols.  */
--- 122,127 ----
diff -Nrcpad gcc-16-20260315/gcc/auto-profile.h gcc-16-20260322/gcc/auto-profile.h
*** gcc-16-20260315/gcc/auto-profile.h	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/auto-profile.h	Sun Mar 22 22:32:06 2026
*************** along with GCC; see the file COPYING3.
*** 21,26 ****
--- 21,28 ----
  #ifndef AUTO_PROFILE_H
  #define AUTO_PROFILE_H
  
+ #define AUTO_PROFILE_VERSION 3
+ 
  /* Read, process, finalize AutoFDO data structures.  */
  extern void read_autofdo_file (void);
  extern void end_auto_profile (void);
diff -Nrcpad gcc-16-20260315/gcc/avoid-store-forwarding.cc gcc-16-20260322/gcc/avoid-store-forwarding.cc
*** gcc-16-20260315/gcc/avoid-store-forwarding.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/avoid-store-forwarding.cc	Sun Mar 22 22:32:06 2026
*************** process_store_forwarding (vec<store_fwd_
*** 171,198 ****
    /* Memory sizes should be constants at this stage.  */
    HOST_WIDE_INT load_size = MEM_SIZE (load_mem).to_constant ();
  
!   /* If the stores cover all the bytes of the load, then we can eliminate
!      the load entirely and use the computed value instead.
!      We can also eliminate stores on addresses that are overwritten
!      by later stores.  */
  
    auto_sbitmap forwarded_bytes (load_size);
    bitmap_clear (forwarded_bytes);
  
    unsigned int i;
    store_fwd_info* it;
-   auto_vec<store_fwd_info> redundant_stores;
-   auto_vec<int> store_ind_to_remove;
    FOR_EACH_VEC_ELT (stores, i, it)
      {
        HOST_WIDE_INT store_size = MEM_SIZE (it->store_mem).to_constant ();
!       if (bitmap_all_bits_in_range_p (forwarded_bytes, it->offset,
! 				      it->offset + store_size - 1))
! 	{
! 	  redundant_stores.safe_push (*it);
! 	  store_ind_to_remove.safe_push (i);
! 	  continue;
! 	}
        bitmap_set_range (forwarded_bytes, it->offset, store_size);
      }
  
--- 171,193 ----
    /* Memory sizes should be constants at this stage.  */
    HOST_WIDE_INT load_size = MEM_SIZE (load_mem).to_constant ();
  
!   /* If the stores cover all the bytes of the load without overlap then we can
!      eliminate the load entirely and use the computed value instead.
!      Bail out when partially overlapping stores are detected, as the pass
!      cannot correctly handle "last writer wins" semantics for the
!      overlapping byte ranges (see PR124476).  */
  
    auto_sbitmap forwarded_bytes (load_size);
    bitmap_clear (forwarded_bytes);
  
    unsigned int i;
    store_fwd_info* it;
    FOR_EACH_VEC_ELT (stores, i, it)
      {
        HOST_WIDE_INT store_size = MEM_SIZE (it->store_mem).to_constant ();
!       if (bitmap_any_bit_in_range_p (forwarded_bytes, it->offset,
! 				 it->offset + store_size - 1))
! 	return false;
        bitmap_set_range (forwarded_bytes, it->offset, store_size);
      }
  
*************** process_store_forwarding (vec<store_fwd_
*** 218,232 ****
  	fprintf (dump_file, "(Load elimination candidate)\n");
      }
  
-   /* Remove redundant stores from the vector.  Although this is quadratic,
-      there doesn't seem to be much point optimizing it.  The number of
-      redundant stores is expected to be low and the length of the list is
-      limited by a --param.  The dependence checking that we did earlier is
-      also quadratic in the size of this list.  */
-   store_ind_to_remove.reverse ();
-   for (int i : store_ind_to_remove)
-     stores.ordered_remove (i);
- 
    rtx load = single_set (load_insn);
    rtx dest;
  
--- 213,218 ----
*************** process_store_forwarding (vec<store_fwd_
*** 413,427 ****
  	    }
  	}
  
-       if (redundant_stores.length () > 0)
- 	{
- 	  fprintf (dump_file, "\nRedundant stores that have been removed:\n");
- 	  FOR_EACH_VEC_ELT (redundant_stores, i, it)
- 	    {
- 	      fprintf (dump_file, "  ");
- 	      print_rtl_single (dump_file, it->store_insn);
- 	    }
- 	}
      }
  
    stats_sf_avoided++;
--- 399,404 ----
*************** process_store_forwarding (vec<store_fwd_
*** 441,450 ****
        delete_insn (it->store_insn);
      }
  
-   /* Delete redundant stores.  */
-   FOR_EACH_VEC_ELT (redundant_stores, i, it)
-     delete_insn (it->store_insn);
- 
    df_insn_rescan (load_insn);
  
    if (load_elim)
--- 418,423 ----
diff -Nrcpad gcc-16-20260315/gcc/c/ChangeLog gcc-16-20260322/gcc/c/ChangeLog
*** gcc-16-20260315/gcc/c/ChangeLog	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/c/ChangeLog	Sun Mar 22 22:32:06 2026
***************
*** 1,3 ****
--- 1,10 ----
+ 2026-03-18  Dhruv Chawla  <dhruvc@nvidia.com>
+ 
+ 	* Make-lang.in (cc1.fda): Add `--print-autofdo-gcov-version` to
+ 	profile_merger invocation.
+ 	(create_fdas_for_cc1): Add `--print-autofdo-gcov-version` to
+ 	create_gcov invocations.
+ 
  2026-03-10  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
  
  	PR c/123461
diff -Nrcpad gcc-16-20260315/gcc/c/Make-lang.in gcc-16-20260322/gcc/c/Make-lang.in
*** gcc-16-20260315/gcc/c/Make-lang.in	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/c/Make-lang.in	Sun Mar 22 22:32:06 2026
*************** components_in_prev = "bfd opcodes binuti
*** 93,99 ****
  components_in_prev_target = "libstdc++-v3 libsanitizer libvtv libgcc libbacktrace libphobos zlib libgomp libatomic"
  
  cc1.fda: create_fdas_for_cc1
! 	$(PROFILE_MERGER) $(shell ls -ha cc1_*.fda) --output_file cc1.fda -gcov_version 3
  
  create_fdas_for_cc1: ../stage1-gcc/cc1$(exeext) ../prev-gcc/$(PERF_DATA)
  	for component_in_prev in "$(components_in_prev)"; do \
--- 93,99 ----
  components_in_prev_target = "libstdc++-v3 libsanitizer libvtv libgcc libbacktrace libphobos zlib libgomp libatomic"
  
  cc1.fda: create_fdas_for_cc1
! 	$(PROFILE_MERGER) $(shell ls -ha cc1_*.fda) --output_file cc1.fda -gcov_version `../stage1-gcc/xgcc$(exeext) --print-autofdo-gcov-version`
  
  create_fdas_for_cc1: ../stage1-gcc/cc1$(exeext) ../prev-gcc/$(PERF_DATA)
  	for component_in_prev in "$(components_in_prev)"; do \
*************** create_fdas_for_cc1: ../stage1-gcc/cc1$(
*** 102,108 ****
  	  echo $$perf_path; \
  	  if [ -f $$perf_path ]; then \
  	    profile_name=cc1_$$component_in_prev.fda; \
! 	    $(CREATE_GCOV) -binary ../stage1-gcc/cc1$(exeext) -gcov $$profile_name -profile $$perf_path -gcov_version 3 || exit 1; \
  	  fi; \
  	done;
  
--- 102,108 ----
  	  echo $$perf_path; \
  	  if [ -f $$perf_path ]; then \
  	    profile_name=cc1_$$component_in_prev.fda; \
! 	    $(CREATE_GCOV) -binary ../stage1-gcc/cc1$(exeext) -gcov $$profile_name -profile $$perf_path -gcov_version `../stage1-gcc/xgcc$(exeext) --print-autofdo-gcov-version` || exit 1; \
  	  fi; \
  	done;
  
*************** create_fdas_for_cc1: ../stage1-gcc/cc1$(
*** 112,118 ****
  	  echo $$perf_path; \
  	  if [ -f $$perf_path ]; then \
  	    profile_name=cc1_$$component_in_prev_target.fda; \
! 	    $(CREATE_GCOV) -binary ../prev-gcc/cc1$(exeext) -gcov $$profile_name -profile $$perf_path -gcov_version 3 || exit 1; \
  	  fi; \
  	done;
  
--- 112,118 ----
  	  echo $$perf_path; \
  	  if [ -f $$perf_path ]; then \
  	    profile_name=cc1_$$component_in_prev_target.fda; \
! 	    $(CREATE_GCOV) -binary ../prev-gcc/cc1$(exeext) -gcov $$profile_name -profile $$perf_path -gcov_version `../prev-gcc/xgcc$(exeext) --print-autofdo-gcov-version` || exit 1; \
  	  fi; \
  	done;
  
diff -Nrcpad gcc-16-20260315/gcc/c-family/ChangeLog gcc-16-20260322/gcc/c-family/ChangeLog
*** gcc-16-20260315/gcc/c-family/ChangeLog	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/c-family/ChangeLog	Sun Mar 22 22:32:06 2026
***************
*** 1,3 ****
--- 1,8 ----
+ 2026-03-19  Jason Merrill  <jason@redhat.com>
+ 
+ 	* c-opts.cc (c_common_post_options): Enable -fcontracts
+ 	in C++26 mode unless -fno-contracts was specified.
+ 
  2026-03-12  Marek Polacek  <polacek@redhat.com>
  
  	PR c++/124447
diff -Nrcpad gcc-16-20260315/gcc/c-family/c-opts.cc gcc-16-20260322/gcc/c-family/c-opts.cc
*** gcc-16-20260315/gcc/c-family/c-opts.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/c-family/c-opts.cc	Sun Mar 22 22:32:06 2026
*************** c_common_post_options (const char **pfil
*** 1249,1254 ****
--- 1249,1258 ----
    SET_OPTION_IF_UNSET (&global_options, &global_options_set,
  		       flag_range_for_ext_temps, cxx_dialect >= cxx23);
  
+   /* Contracts are in C++26.  */
+   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
+ 		       flag_contracts, cxx_dialect >= cxx26);
+ 
    /* EnabledBy unfortunately can't specify value to use if set and
       LangEnabledBy can't specify multiple options with &&.  For -Wunused
       or -Wunused -Wextra we want these to default to 3 unless user specified
diff -Nrcpad gcc-16-20260315/gcc/common.opt gcc-16-20260322/gcc/common.opt
*** gcc-16-20260315/gcc/common.opt	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/common.opt	Sun Mar 22 22:32:06 2026
*************** Driver JoinedOrMissing Alias(B)
*** 349,354 ****
--- 349,357 ----
  -preprocess
  Driver Alias(E)
  
+ -print-autofdo-gcov-version
+ Driver Alias(print-autofdo-gcov-version)
+ 
  -print-file-name
  Driver Separate Alias(print-file-name=)
  
*************** Report on memory allocation before inter
*** 2562,2568 ****
  
  fpost-ipa-mem-report
  Common Var(post_ipa_mem_report)
! Report on memory allocation before interprocedural optimization.
  
  fpack-struct
  Common Var(flag_pack_struct) Optimization
--- 2565,2571 ----
  
  fpost-ipa-mem-report
  Common Var(post_ipa_mem_report)
! Report on memory allocation after interprocedural optimization.
  
  fpack-struct
  Common Var(flag_pack_struct) Optimization
*************** Driver
*** 3902,3907 ****
--- 3905,3913 ----
  pipe
  Driver Var(use_pipes)
  
+ print-autofdo-gcov-version
+ Driver Var(print_autofdo_gcov_version)
+ 
  print-file-name=
  Driver JoinedOrMissing Var(print_file_name)
  
diff -Nrcpad gcc-16-20260315/gcc/common.opt.urls gcc-16-20260322/gcc/common.opt.urls
*** gcc-16-20260315/gcc/common.opt.urls	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/common.opt.urls	Sun Mar 22 22:32:06 2026
*************** UrlSuffix(gcc/Instrumentation-Options.ht
*** 1924,1929 ****
--- 1924,1932 ----
  pipe
  UrlSuffix(gcc/Overall-Options.html#index-pipe)
  
+ print-autofdo-gcov-version
+ UrlSuffix(gcc/Developer-Options.html#index-print-autofdo-gcov-version)
+ 
  print-file-name=
  UrlSuffix(gcc/Developer-Options.html#index-print-file-name)
  
diff -Nrcpad gcc-16-20260315/gcc/config/aarch64/aarch64-sve2.md gcc-16-20260322/gcc/config/aarch64/aarch64-sve2.md
*** gcc-16-20260315/gcc/config/aarch64/aarch64-sve2.md	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/config/aarch64/aarch64-sve2.md	Sun Mar 22 22:32:06 2026
***************
*** 4129,4137 ****
  	     UNSPEC_REVD_ONLY)]
  	  UNSPEC_PRED_X))]
    "TARGET_SVE2p1_OR_SME"
!   {@ [ cons: =0 , 1   , 2 ; attrs: movprfx ]
!      [ w        , Upl , 0 ; *              ] revd\t%0.q, %1/m, %2.q
!      [ ?&w      , Upl , w ; yes            ] movprfx\t%0, %2\;revd\t%0.q, %1/m, %2.q
    }
    [(set_attr "sve_type" "sve_int_general")]
  )
--- 4129,4136 ----
  	     UNSPEC_REVD_ONLY)]
  	  UNSPEC_PRED_X))]
    "TARGET_SVE2p1_OR_SME"
!   {@ [ cons: =0 , 1   , 2 ]
!      [ w        , Upl , 0 ] revd\t%0.q, %1/m, %2.q
    }
    [(set_attr "sve_type" "sve_int_general")]
  )
***************
*** 4146,4154 ****
  	   (match_operand:SVE_FULL 3 "register_operand")]
  	  UNSPEC_SEL))]
    "TARGET_SVE2p1_OR_SME"
!   {@ [ cons: =0 , 1   , 2 , 3  ; attrs: movprfx ]
!      [ w        , Upl , w , 0  ; *              ] revd\t%0.q, %1/m, %2.q
!      [ ?&w      , Upl , w , w  ; yes            ] movprfx\t%0, %3\;revd\t%0.q, %1/m, %2.q
    }
    [(set_attr "sve_type" "sve_int_general")]
  )
--- 4145,4152 ----
  	   (match_operand:SVE_FULL 3 "register_operand")]
  	  UNSPEC_SEL))]
    "TARGET_SVE2p1_OR_SME"
!   {@ [ cons: =0 , 1   , 2 , 3 ]
!      [ w        , Upl , w , 0 ] revd\t%0.q, %1/m, %2.q
    }
    [(set_attr "sve_type" "sve_int_general")]
  )
diff -Nrcpad gcc-16-20260315/gcc/config/aarch64/aarch64.cc gcc-16-20260322/gcc/config/aarch64/aarch64.cc
*** gcc-16-20260315/gcc/config/aarch64/aarch64.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/config/aarch64/aarch64.cc	Sun Mar 22 22:32:06 2026
*************** aarch64_generate_version_dispatcher_body
*** 21722,21728 ****
  	 not.  This happens for methods in derived classes that override
  	 virtual methods in base classes but are not explicitly marked as
  	 virtual.  */
!       if (DECL_VINDEX (versn->decl))
  	sorry ("virtual function multiversioning not supported");
  
        if (dump_enabled_p ())
--- 21722,21728 ----
  	 not.  This happens for methods in derived classes that override
  	 virtual methods in base classes but are not explicitly marked as
  	 virtual.  */
!       if (DECL_VIRTUAL_P (versn->decl))
  	sorry ("virtual function multiversioning not supported");
  
        if (dump_enabled_p ())
diff -Nrcpad gcc-16-20260315/gcc/config/aarch64/tuning_models/olympus.h gcc-16-20260322/gcc/config/aarch64/tuning_models/olympus.h
*** gcc-16-20260315/gcc/config/aarch64/tuning_models/olympus.h	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/config/aarch64/tuning_models/olympus.h	Sun Mar 22 22:32:06 2026
*************** static struct tune_params olympus_tuning
*** 547,553 ****
    AARCH64_FUSE_NEOVERSE_BASE, /* fusible_ops  */
    "32:16",	/* function_align.  */
    "4",		/* jump_align.  */
!   "32:16",	/* loop_align.  */
    8,	/* int_reassoc_width.  */
    6,	/* fp_reassoc_width.  */
    4,	/* fma_reassoc_width.  */
--- 547,553 ----
    AARCH64_FUSE_NEOVERSE_BASE, /* fusible_ops  */
    "32:16",	/* function_align.  */
    "4",		/* jump_align.  */
!   "64:16",	/* loop_align.  */
    8,	/* int_reassoc_width.  */
    6,	/* fp_reassoc_width.  */
    4,	/* fma_reassoc_width.  */
diff -Nrcpad gcc-16-20260315/gcc/config/alpha/alpha.cc gcc-16-20260322/gcc/config/alpha/alpha.cc
*** gcc-16-20260315/gcc/config/alpha/alpha.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/config/alpha/alpha.cc	Sun Mar 22 22:32:06 2026
*************** alpha_build_builtin_va_list (void)
*** 6564,6569 ****
--- 6564,6570 ----
    DECL_CHAIN (base) = ofs;
  
    TYPE_FIELDS (record) = base;
+   TREE_PUBLIC (type_decl) = 1;
    layout_type (record);
  
    va_list_gpr_counter_field = ofs;
diff -Nrcpad gcc-16-20260315/gcc/config/i386/i386-builtins.cc gcc-16-20260322/gcc/config/i386/i386-builtins.cc
*** gcc-16-20260315/gcc/config/i386/i386-builtins.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/config/i386/i386-builtins.cc	Sun Mar 22 22:32:06 2026
*************** ix86_init_builtins_va_builtins_abi (void
*** 1348,1355 ****
  
    if (!TARGET_64BIT)
      return;
!   fnattr_ms = build_tree_list (get_identifier ("ms_abi"), NULL_TREE);
!   fnattr_sysv = build_tree_list (get_identifier ("sysv_abi"), NULL_TREE);
    ms_va_ref = build_reference_type (ms_va_list_type_node);
    sysv_va_ref = build_pointer_type (TREE_TYPE (sysv_va_list_type_node));
  
--- 1348,1360 ----
  
    if (!TARGET_64BIT)
      return;
!   /* The va builtins are both nothrow and leaf. */
!   tree fnattr = NULL_TREE;
!   fnattr = tree_cons (get_identifier ("nothrow"), NULL_TREE, fnattr);
!   fnattr = tree_cons (get_identifier ("leaf"), NULL_TREE, fnattr);
! 
!   fnattr_ms = tree_cons (get_identifier ("ms_abi"), NULL_TREE, fnattr);
!   fnattr_sysv = tree_cons (get_identifier ("sysv_abi"), NULL_TREE, fnattr);
    ms_va_ref = build_reference_type (ms_va_list_type_node);
    sysv_va_ref = build_pointer_type (TREE_TYPE (sysv_va_list_type_node));
  
diff -Nrcpad gcc-16-20260315/gcc/config/i386/i386-features.cc gcc-16-20260322/gcc/config/i386/i386-features.cc
*** gcc-16-20260315/gcc/config/i386/i386-features.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/config/i386/i386-features.cc	Sun Mar 22 22:32:06 2026
*************** make_resolver_func (const tree default_d
*** 5629,5635 ****
  
    tree id = ix86_mangle_decl_assembler_name
      (decl, node->function_version ()->assembler_name);
!   SET_DECL_ASSEMBLER_NAME (decl, id);
  
    DECL_NAME (decl) = DECL_NAME (default_decl);
    TREE_USED (decl) = 1;
--- 5629,5635 ----
  
    tree id = ix86_mangle_decl_assembler_name
      (decl, node->function_version ()->assembler_name);
!   symtab->change_decl_assembler_name (decl, id);
  
    DECL_NAME (decl) = DECL_NAME (default_decl);
    TREE_USED (decl) = 1;
*************** ix86_generate_version_dispatcher_body (v
*** 5736,5742 ****
  	 not.  This happens for methods in derived classes that override
  	 virtual methods in base classes but are not explicitly marked as
  	 virtual.  */
!       if (DECL_VINDEX (versn->decl))
  	sorry ("virtual function multiversioning not supported");
  
        fn_ver_vec.safe_push (versn->decl);
--- 5736,5742 ----
  	 not.  This happens for methods in derived classes that override
  	 virtual methods in base classes but are not explicitly marked as
  	 virtual.  */
!       if (DECL_VIRTUAL_P (versn->decl))
  	sorry ("virtual function multiversioning not supported");
  
        fn_ver_vec.safe_push (versn->decl);
diff -Nrcpad gcc-16-20260315/gcc/config/i386/i386.cc gcc-16-20260322/gcc/config/i386/i386.cc
*** gcc-16-20260315/gcc/config/i386/i386.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/config/i386/i386.cc	Sun Mar 22 22:32:06 2026
*************** ix86_build_builtin_va_list_64 (void)
*** 4564,4569 ****
--- 4564,4570 ----
    DECL_CHAIN (f_gpr) = f_fpr;
    DECL_CHAIN (f_fpr) = f_ovf;
    DECL_CHAIN (f_ovf) = f_sav;
+   TREE_PUBLIC (type_decl) = 1;
  
    layout_type (record);
  
diff -Nrcpad gcc-16-20260315/gcc/config/loongarch/loongarch.cc gcc-16-20260322/gcc/config/loongarch/loongarch.cc
*** gcc-16-20260315/gcc/config/loongarch/loongarch.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/config/loongarch/loongarch.cc	Sun Mar 22 22:32:06 2026
*************** loongarch_generate_version_dispatcher_bo
*** 12044,12050 ****
  	 not.  This happens for methods in derived classes that override
  	 virtual methods in base classes but are not explicitly marked as
  	 virtual.  */
!       if (DECL_VINDEX (versn->decl))
  	sorry ("virtual function multiversioning not supported");
  
        fn_ver_vec.safe_push (versn->decl);
--- 12044,12050 ----
  	 not.  This happens for methods in derived classes that override
  	 virtual methods in base classes but are not explicitly marked as
  	 virtual.  */
!       if (DECL_VIRTUAL_P (versn->decl))
  	sorry ("virtual function multiversioning not supported");
  
        fn_ver_vec.safe_push (versn->decl);
diff -Nrcpad gcc-16-20260315/gcc/config/riscv/riscv.cc gcc-16-20260322/gcc/config/riscv/riscv.cc
*** gcc-16-20260315/gcc/config/riscv/riscv.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/config/riscv/riscv.cc	Sun Mar 22 22:32:06 2026
*************** riscv_generate_version_dispatcher_body (
*** 15543,15549 ****
  	 not.  This happens for methods in derived classes that override
  	 virtual methods in base classes but are not explicitly marked as
  	 virtual.  */
!       if (DECL_VINDEX (versn->decl))
  	sorry ("virtual function multiversioning not supported");
  
        fn_ver_vec.safe_push (versn->decl);
--- 15543,15549 ----
  	 not.  This happens for methods in derived classes that override
  	 virtual methods in base classes but are not explicitly marked as
  	 virtual.  */
!       if (DECL_VIRTUAL_P (versn->decl))
  	sorry ("virtual function multiversioning not supported");
  
        fn_ver_vec.safe_push (versn->decl);
diff -Nrcpad gcc-16-20260315/gcc/config/rs6000/rs6000.cc gcc-16-20260322/gcc/config/rs6000/rs6000.cc
*** gcc-16-20260315/gcc/config/rs6000/rs6000.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/config/rs6000/rs6000.cc	Sun Mar 22 22:32:06 2026
*************** rs6000_generate_version_dispatcher_body
*** 25645,25651 ****
  	 not.  This happens for methods in derived classes that override
  	 virtual methods in base classes but are not explicitly marked as
  	 virtual.  */
!       if (DECL_VINDEX (version->decl))
  	sorry ("Virtual function multiversioning not supported");
  
        fn_ver_vec.safe_push (version->decl);
--- 25645,25651 ----
  	 not.  This happens for methods in derived classes that override
  	 virtual methods in base classes but are not explicitly marked as
  	 virtual.  */
!       if (DECL_VIRTUAL_P (version->decl))
  	sorry ("Virtual function multiversioning not supported");
  
        fn_ver_vec.safe_push (version->decl);
diff -Nrcpad gcc-16-20260315/gcc/config/sh/sh.cc gcc-16-20260322/gcc/config/sh/sh.cc
*** gcc-16-20260315/gcc/config/sh/sh.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/config/sh/sh.cc	Sun Mar 22 22:32:06 2026
*************** sh_build_builtin_va_list (void)
*** 7555,7560 ****
--- 7555,7561 ----
  
    TYPE_STUB_DECL (record) = type_decl;
    TYPE_NAME (record) = type_decl;
+   TREE_PUBLIC (type_decl) = 1;
    TYPE_FIELDS (record) = f_next_o;
    DECL_CHAIN (f_next_o) = f_next_o_limit;
    DECL_CHAIN (f_next_o_limit) = f_next_fp;
diff -Nrcpad gcc-16-20260315/gcc/config/sh/sh.md gcc-16-20260322/gcc/config/sh/sh.md
*** gcc-16-20260315/gcc/config/sh/sh.md	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/config/sh/sh.md	Sun Mar 22 22:32:06 2026
***************
*** 1466,1472 ****
  
  (define_insn "*movsicc_t_false"
    [(set (match_operand:SI 0 "arith_reg_dest" "=r,r")
! 	(if_then_else (eq (reg:SI T_REG) (const_int 0))
  		      (match_operand:SI 1 "general_movsrc_operand" "r,I08")
  		      (match_operand:SI 2 "arith_reg_operand" "0,0")))]
    "TARGET_PRETEND_CMOVE
--- 1466,1472 ----
  
  (define_insn "*movsicc_t_false"
    [(set (match_operand:SI 0 "arith_reg_dest" "=r,r")
! 	(if_then_else:SI (eq (reg:SI T_REG) (const_int 0))
  		      (match_operand:SI 1 "general_movsrc_operand" "r,I08")
  		      (match_operand:SI 2 "arith_reg_operand" "0,0")))]
    "TARGET_PRETEND_CMOVE
***************
*** 1483,1489 ****
  
  (define_insn "*movsicc_t_true"
    [(set (match_operand:SI 0 "arith_reg_dest" "=r,r")
! 	(if_then_else (ne (reg:SI T_REG) (const_int 0))
  		      (match_operand:SI 1 "general_movsrc_operand" "r,I08")
  		      (match_operand:SI 2 "arith_reg_operand" "0,0")))]
    "TARGET_PRETEND_CMOVE
--- 1483,1489 ----
  
  (define_insn "*movsicc_t_true"
    [(set (match_operand:SI 0 "arith_reg_dest" "=r,r")
! 	(if_then_else:SI (ne (reg:SI T_REG) (const_int 0))
  		      (match_operand:SI 1 "general_movsrc_operand" "r,I08")
  		      (match_operand:SI 2 "arith_reg_operand" "0,0")))]
    "TARGET_PRETEND_CMOVE
***************
*** 4527,4533 ****
  ;; instruction on SH4 202.
  (define_insn_and_split "negsi_cond"
    [(set (match_operand:SI 0 "arith_reg_dest" "=r,r")
! 	(if_then_else
  	  (eq:SI (reg:SI T_REG) (match_operand:SI 3 "const_int_operand" "M,N"))
  	  (match_operand:SI 1 "arith_reg_operand" "0,0")
  	  (neg:SI (match_operand:SI 2 "arith_reg_operand" "r,r"))))]
--- 4527,4533 ----
  ;; instruction on SH4 202.
  (define_insn_and_split "negsi_cond"
    [(set (match_operand:SI 0 "arith_reg_dest" "=r,r")
! 	(if_then_else:SI
  	  (eq:SI (reg:SI T_REG) (match_operand:SI 3 "const_int_operand" "M,N"))
  	  (match_operand:SI 1 "arith_reg_operand" "0,0")
  	  (neg:SI (match_operand:SI 2 "arith_reg_operand" "r,r"))))]
***************
*** 4565,4571 ****
  
  (define_insn_and_split "negdi_cond"
    [(set (match_operand:DI 0 "arith_reg_dest")
! 	(if_then_else
  	  (eq:SI (reg:SI T_REG) (match_operand:SI 3 "const_int_operand"))
  	  (match_operand:DI 1 "arith_reg_operand")
  	  (neg:DI (match_operand:DI 2 "arith_reg_operand"))))
--- 4565,4571 ----
  
  (define_insn_and_split "negdi_cond"
    [(set (match_operand:DI 0 "arith_reg_dest")
! 	(if_then_else:DI
  	  (eq:SI (reg:SI T_REG) (match_operand:SI 3 "const_int_operand"))
  	  (match_operand:DI 1 "arith_reg_operand")
  	  (neg:DI (match_operand:DI 2 "arith_reg_operand"))))
***************
*** 10316,10322 ****
  ;;; Transfer the contents of the T bit to a specified bit of memory.
  (define_insn "bst_m2a"
    [(set (match_operand:QI 0 "bitwise_memory_operand" "+Sbw,m")
! 	(if_then_else (eq (reg:SI T_REG) (const_int 0))
  	    (and:QI
  		(not:QI (ashift:QI (const_int 1)
  			(match_operand:QI 1 "const_int_operand" "K03,K03")))
--- 10316,10322 ----
  ;;; Transfer the contents of the T bit to a specified bit of memory.
  (define_insn "bst_m2a"
    [(set (match_operand:QI 0 "bitwise_memory_operand" "+Sbw,m")
! 	(if_then_else:QI (eq (reg:SI T_REG) (const_int 0))
  	    (and:QI
  		(not:QI (ashift:QI (const_int 1)
  			(match_operand:QI 1 "const_int_operand" "K03,K03")))
diff -Nrcpad gcc-16-20260315/gcc/config/sparc/t-rtems gcc-16-20260322/gcc/config/sparc/t-rtems
*** gcc-16-20260315/gcc/config/sparc/t-rtems	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/config/sparc/t-rtems	Sun Mar 22 22:32:06 2026
***************
*** 17,25 ****
  # <http://www.gnu.org/licenses/>.
  #
  
! MULTILIB_OPTIONS = msoft-float mcpu=v8/mcpu=leon3/mcpu=leon3v7/mcpu=leon \
! 		   mfix-ut699/mfix-at697f/mfix-gr712rc
! MULTILIB_DIRNAMES = soft v8 leon3 leon3v7 leon ut699 at697f gr712rc
  MULTILIB_MATCHES = msoft-float=mno-fpu mfix-gr712rc=mfix-ut700
  
  MULTILIB_REQUIRED =
--- 17,34 ----
  # <http://www.gnu.org/licenses/>.
  #
  
! MULTILIB_OPTIONS =
! MULTILIB_DIRNAMES =
! 
! MULTILIB_OPTIONS += msoft-float
! MULTILIB_DIRNAMES += soft
! 
! MULTILIB_OPTIONS += mcpu=v8/mcpu=leon3/mcpu=leon3v7/mcpu=leon/mcpu=leon5
! MULTILIB_DIRNAMES += v8 leon3 leon3v7 leon leon5
! 
! MULTILIB_OPTIONS += mfix-ut699/mfix-at697f/mfix-gr712rc
! MULTILIB_DIRNAMES += ut699 at697f gr712rc
! 
  MULTILIB_MATCHES = msoft-float=mno-fpu mfix-gr712rc=mfix-ut700
  
  MULTILIB_REQUIRED =
*************** MULTILIB_REQUIRED += mcpu=leon3/mfix-gr7
*** 32,37 ****
--- 41,47 ----
  MULTILIB_REQUIRED += mcpu=leon3v7/mfix-gr712rc
  MULTILIB_REQUIRED += mcpu=leon/mfix-ut699
  MULTILIB_REQUIRED += mcpu=leon/mfix-at697f
+ MULTILIB_REQUIRED += mcpu=leon5
  MULTILIB_REQUIRED += msoft-float/mcpu=v8
  MULTILIB_REQUIRED += msoft-float/mcpu=leon3
  MULTILIB_REQUIRED += msoft-float/mcpu=leon3v7
*************** MULTILIB_REQUIRED += msoft-float/mcpu=le
*** 40,42 ****
--- 50,53 ----
  MULTILIB_REQUIRED += msoft-float/mcpu=leon3v7/mfix-gr712rc
  MULTILIB_REQUIRED += msoft-float/mcpu=leon/mfix-ut699
  MULTILIB_REQUIRED += msoft-float/mcpu=leon/mfix-at697f
+ MULTILIB_REQUIRED += msoft-float/mcpu=leon5
diff -Nrcpad gcc-16-20260315/gcc/config/xtensa/xtensa.cc gcc-16-20260322/gcc/config/xtensa/xtensa.cc
*** gcc-16-20260315/gcc/config/xtensa/xtensa.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/config/xtensa/xtensa.cc	Sun Mar 22 22:32:06 2026
*************** gen_int_relational (enum rtx_code test_c
*** 734,740 ****
      int unsignedp;		/* != 0 for unsigned comparisons.  */
    };
  
!   static struct cmp_info info[ (int)ITEST_MAX ] = {
  
      { EQ,	xtensa_b4const_or_zero,	0, 0, 0, 0, 0 },	/* EQ  */
      { NE,	xtensa_b4const_or_zero,	0, 0, 0, 0, 0 },	/* NE  */
--- 734,740 ----
      int unsignedp;		/* != 0 for unsigned comparisons.  */
    };
  
!   static const struct cmp_info info[ (int)ITEST_MAX ] = {
  
      { EQ,	xtensa_b4const_or_zero,	0, 0, 0, 0, 0 },	/* EQ  */
      { NE,	xtensa_b4const_or_zero,	0, 0, 0, 0, 0 },	/* NE  */
*************** gen_int_relational (enum rtx_code test_c
*** 752,758 ****
  
    enum internal_test test;
    machine_mode mode;
!   struct cmp_info *p_info;
    int invert;
  
    test = map_test_to_internal_test (test_code);
--- 752,758 ----
  
    enum internal_test test;
    machine_mode mode;
!   const struct cmp_info *p_info;
    int invert;
  
    test = map_test_to_internal_test (test_code);
*************** constantsynth_method_lshr_m1 (rtx dest,
*** 5777,5782 ****
--- 5777,5807 ----
    return end_sequence ();
  }
  
+ /* A method that generates two machine instructions to logically right-
+    shift a negative signed 12-bit value a certain number of bits to
+    synthesize a positive number with a bit sequence of 1s on the MSB
+    side (eg., 0x1FFFFF55).  */
+ 
+ static rtx_insn *
+ constantsynth_method_lshr_mi12b (rtx dest, HOST_WIDE_INT v)
+ {
+   int i;
+   HOST_WIDE_INT v0;
+ 
+   /* HOST_WIDE_INT should be always 64 bits (see gcc/hwint.h), while
+      asserts just in case.  */
+   gcc_assert (HOST_BITS_PER_WIDE_INT == 64);
+ 
+   if (! IN_RANGE (i = clz_hwi (v) - 32, 1, 10)
+       || ! IN_RANGE (v0 = (int32_t)(v << i), -2048, -2))
+     return NULL;
+ 
+   start_sequence ();
+   emit_insn (gen_rtx_SET (dest, GEN_INT (v0)));
+   emit_insn (gen_lshrsi3 (dest, dest, GEN_INT (i)));
+   return end_sequence ();
+ }
+ 
  /* Split the specified value between -34816 and 34559 into the two
     immediates for the MOVI and ADDMI instruction.  */
  
*************** struct constantsynth_method_info
*** 5951,5956 ****
--- 5976,5982 ----
  static const struct constantsynth_method_info constantsynth_methods[] =
  {
    { constantsynth_method_lshr_m1, "lshr_m1" },
+   { constantsynth_method_lshr_mi12b, "lshr_mi12b" },
    { constantsynth_method_16bits, "16bits" },
    { constantsynth_method_32bits, "32bits" },
    { constantsynth_method_square, "square" },
diff -Nrcpad gcc-16-20260315/gcc/configure gcc-16-20260322/gcc/configure
*** gcc-16-20260315/gcc/configure	Sun Mar 15 22:32:19 2026
--- gcc-16-20260322/gcc/configure	Sun Mar 22 22:32:17 2026
*************** fi
*** 3931,3937 ****
  if test "${with_gnu_ld+set}" = set; then :
    withval=$with_gnu_ld; gnu_ld_flag="$with_gnu_ld"
  else
!   gnu_ld_flag=no
  fi
  
  
--- 3931,3937 ----
  if test "${with_gnu_ld+set}" = set; then :
    withval=$with_gnu_ld; gnu_ld_flag="$with_gnu_ld"
  else
!   gnu_ld_flag=
  fi
  
  
*************** fi
*** 4037,4043 ****
  if test "${with_gnu_as+set}" = set; then :
    withval=$with_gnu_as; gas_flag="$with_gnu_as"
  else
!   gas_flag=no
  fi
  
  
--- 4037,4043 ----
  if test "${with_gnu_as+set}" = set; then :
    withval=$with_gnu_as; gas_flag="$with_gnu_as"
  else
!   gas_flag=
  fi
  
  
*************** fi
*** 4063,4069 ****
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a default assembler was specified" >&5
  $as_echo_n "checking whether a default assembler was specified... " >&6; }
  if test x"${DEFAULT_ASSEMBLER+set}" = x"set"; then
!   if test x"$gas_flag" = x"no"; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes ($DEFAULT_ASSEMBLER)" >&5
  $as_echo "yes ($DEFAULT_ASSEMBLER)" >&6; }
    else
--- 4063,4069 ----
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a default assembler was specified" >&5
  $as_echo_n "checking whether a default assembler was specified... " >&6; }
  if test x"${DEFAULT_ASSEMBLER+set}" = x"set"; then
!   if test x"$gas_flag" != x"yes"; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes ($DEFAULT_ASSEMBLER)" >&5
  $as_echo "yes ($DEFAULT_ASSEMBLER)" >&6; }
    else
diff -Nrcpad gcc-16-20260315/gcc/configure.ac gcc-16-20260322/gcc/configure.ac
*** gcc-16-20260315/gcc/configure.ac	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/configure.ac	Sun Mar 22 22:32:06 2026
*************** AC_SUBST(GENINSRC)
*** 336,342 ****
  AC_ARG_WITH(gnu-ld,
  [AS_HELP_STRING([--with-gnu-ld], [arrange to work with GNU ld])],
  gnu_ld_flag="$with_gnu_ld",
! gnu_ld_flag=no)
  
  case $target in
      *darwin*)
--- 336,342 ----
  AC_ARG_WITH(gnu-ld,
  [AS_HELP_STRING([--with-gnu-ld], [arrange to work with GNU ld])],
  gnu_ld_flag="$with_gnu_ld",
! gnu_ld_flag=)
  
  case $target in
      *darwin*)
*************** fi
*** 415,421 ****
  AC_ARG_WITH(gnu-as,
  [AS_HELP_STRING([--with-gnu-as], [arrange to work with GNU as])],
  gas_flag="$with_gnu_as",
! gas_flag=no)
  
  AC_ARG_WITH(as,
  [AS_HELP_STRING([--with-as], [arrange to use the specified as (full pathname)])],
--- 415,421 ----
  AC_ARG_WITH(gnu-as,
  [AS_HELP_STRING([--with-gnu-as], [arrange to work with GNU as])],
  gas_flag="$with_gnu_as",
! gas_flag=)
  
  AC_ARG_WITH(as,
  [AS_HELP_STRING([--with-as], [arrange to use the specified as (full pathname)])],
*************** fi
*** 432,438 ****
  
  AC_MSG_CHECKING([whether a default assembler was specified])
  if test x"${DEFAULT_ASSEMBLER+set}" = x"set"; then
!   if test x"$gas_flag" = x"no"; then
      AC_MSG_RESULT([yes ($DEFAULT_ASSEMBLER)])
    else
      AC_MSG_RESULT([yes ($DEFAULT_ASSEMBLER - GNU as)])
--- 432,438 ----
  
  AC_MSG_CHECKING([whether a default assembler was specified])
  if test x"${DEFAULT_ASSEMBLER+set}" = x"set"; then
!   if test x"$gas_flag" != x"yes"; then
      AC_MSG_RESULT([yes ($DEFAULT_ASSEMBLER)])
    else
      AC_MSG_RESULT([yes ($DEFAULT_ASSEMBLER - GNU as)])
diff -Nrcpad gcc-16-20260315/gcc/cp/ChangeLog gcc-16-20260322/gcc/cp/ChangeLog
*** gcc-16-20260315/gcc/cp/ChangeLog	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/cp/ChangeLog	Sun Mar 22 22:32:06 2026
***************
*** 1,3 ****
--- 1,95 ----
+ 2026-03-21  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/122786
+ 	* module.cc (trees_in::decl_value): Set section name from
+ 	attribute.
+ 
+ 2026-03-21  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/124483
+ 	* module.cc (trees_in::fn_parms_init): Set TREE_USED and
+ 	DECL_READ_P for parameters deliberately marked unused.
+ 
+ 2026-03-20  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/124575
+ 	* call.cc (set_up_extended_ref_temp): If var is consteval-only,
+ 	mark it DECL_EXTERNAL.
+ 
+ 2026-03-19  Jason Merrill  <jason@redhat.com>
+ 
+ 	* constexpr.cc (build_constexpr_constructor_member_initializers):
+ 	Handle TRY_FINALLY_EXPR.
+ 	(potential_constant_expression_1): Handle EH_ELSE_EXPR.
+ 	(check_for_failed_contracts): Handle non-MCE case.
+ 	(cxx_eval_outermost_constant_expr): Call it sooner.
+ 
+ 2026-03-18  Dhruv Chawla  <dhruvc@nvidia.com>
+ 
+ 	* Make-lang.in (cc1plus.fda): Add `--print-autofdo-gcov-version` to
+ 	profile_merger invocation.
+ 	(create_fdas_for_cc1plus): Add `--print-autofdo-gcov-version` to
+ 	create_gcov invocations.
+ 
+ 2026-03-18  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/124474
+ 	* reflect.cc (check_out_of_consteval_use_r): Don't walk subtrees
+ 	of RETURN_EXPR on cdtor_returns_this targets in cdtors.
+ 
+ 2026-03-17  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/124493
+ 	* error.cc (inform_tree_category): Handle variable templates.
+ 
+ 2026-03-17  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/124472
+ 	* parser.cc (cp_parser_reflection_name): Move the
+ 	cp_preserve_using_decl overriding below, before
+ 	cp_parser_lookup_name_simple.
+ 
+ 2026-03-17  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/124493
+ 	* pt.cc (tsubst) <case TEMPLATE_ID_EXPR>: Check that templ is
+ 	either DECL_TYPE_TEMPLATE_P or DECL_TEMPLATE_TEMPLATE_PARM_P.
+ 
+ 2026-03-16  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/124496
+ 	* parser.cc (cp_parser_splice_specifier): Use NULL_TREE instead of
+ 	NULL.
+ 	(cp_parser_splice_expression): Don't assert seen_error() when not
+ 	committed to tentative parse.
+ 
+ 2026-03-16  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/123618
+ 	* tree.cc (handle_annotation_attribute): Reject annotations on void
+ 	parameters.
+ 
+ 2026-03-16  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR c++/124307
+ 	* parser.cc (cp_parser_base_specifier): Check for
+ 	error mark like checking for non-nullness on the
+ 	attribute.
+ 
+ 2026-03-16  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/124489
+ 	* error.cc (dump_type) <case NULLPTR_TYPE>: Use pp_cxx_ws_string
+ 	instead of pp_string.
+ 	<case META_TYPE>: Likewise.
+ 
+ 2026-03-16  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/120039
+ 	PR c++/122559
+ 	* pt.cc (tsubst_expr) <case VAR_DECL>: Don't call lookup_name on
+ 	DECL_NAME (t) if it is NULL_TREE.
+ 
  2026-03-14  Jakub Jelinek  <jakub@redhat.com>
  
  	PR c++/124399
diff -Nrcpad gcc-16-20260315/gcc/cp/Make-lang.in gcc-16-20260322/gcc/cp/Make-lang.in
*** gcc-16-20260315/gcc/cp/Make-lang.in	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/cp/Make-lang.in	Sun Mar 22 22:32:06 2026
*************** components_in_prev = "bfd opcodes binuti
*** 210,216 ****
  components_in_prev_target = "libstdc++-v3 libsanitizer libvtv libgcc libbacktrace libphobos zlib libgomp libatomic"
  
  cc1plus.fda: create_fdas_for_cc1plus
! 	$(PROFILE_MERGER) $(shell ls -ha cc1plus_*.fda) --output_file cc1plus.fda -gcov_version 3
  
  create_fdas_for_cc1plus: ../stage1-gcc/cc1plus$(exeext) ../prev-gcc/$(PERF_DATA)
  	for component_in_prev in "$(components_in_prev)"; do \
--- 210,216 ----
  components_in_prev_target = "libstdc++-v3 libsanitizer libvtv libgcc libbacktrace libphobos zlib libgomp libatomic"
  
  cc1plus.fda: create_fdas_for_cc1plus
! 	$(PROFILE_MERGER) $(shell ls -ha cc1plus_*.fda) --output_file cc1plus.fda -gcov_version `../stage1-gcc/xgcc$(exeext) --print-autofdo-gcov-version`
  
  create_fdas_for_cc1plus: ../stage1-gcc/cc1plus$(exeext) ../prev-gcc/$(PERF_DATA)
  	for component_in_prev in "$(components_in_prev)"; do \
*************** create_fdas_for_cc1plus: ../stage1-gcc/c
*** 219,225 ****
  	  echo $$perf_path; \
  	  if [ -f $$perf_path ]; then \
  	    profile_name=cc1plus_$$component_in_prev.fda; \
! 	    $(CREATE_GCOV) -binary ../stage1-gcc/cc1plus$(exeext) -gcov $$profile_name -profile $$perf_path -gcov_version 3 || exit 1; \
  	  fi; \
  	done;
  
--- 219,225 ----
  	  echo $$perf_path; \
  	  if [ -f $$perf_path ]; then \
  	    profile_name=cc1plus_$$component_in_prev.fda; \
! 	    $(CREATE_GCOV) -binary ../stage1-gcc/cc1plus$(exeext) -gcov $$profile_name -profile $$perf_path -gcov_version `../stage1-gcc/xgcc$(exeext) --print-autofdo-gcov-version` || exit 1; \
  	  fi; \
  	done;
  
*************** create_fdas_for_cc1plus: ../stage1-gcc/c
*** 229,235 ****
  	  echo $$perf_path; \
  	  if [ -f $$perf_path ]; then \
  	    profile_name=cc1plus_$$component_in_prev_target.fda; \
! 	    $(CREATE_GCOV) -binary ../prev-gcc/cc1plus$(exeext) -gcov $$profile_name -profile $$perf_path -gcov_version 3 || exit 1; \
  	  fi; \
  	done;
  
--- 229,235 ----
  	  echo $$perf_path; \
  	  if [ -f $$perf_path ]; then \
  	    profile_name=cc1plus_$$component_in_prev_target.fda; \
! 	    $(CREATE_GCOV) -binary ../prev-gcc/cc1plus$(exeext) -gcov $$profile_name -profile $$perf_path -gcov_version `../prev-gcc/xgcc$(exeext) --print-autofdo-gcov-version` || exit 1; \
  	  fi; \
  	done;
  
diff -Nrcpad gcc-16-20260315/gcc/cp/call.cc gcc-16-20260322/gcc/cp/call.cc
*** gcc-16-20260315/gcc/cp/call.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/cp/call.cc	Sun Mar 22 22:32:06 2026
*************** set_up_extended_ref_temp (tree decl, tre
*** 14351,14356 ****
--- 14351,14360 ----
    /* Any reference temp has a non-trivial initializer.  */
    DECL_NONTRIVIALLY_INITIALIZED_P (var) = true;
  
+   /* Don't output reflection variables.  */
+   if (consteval_only_p (var))
+     DECL_EXTERNAL (var) = true;
+ 
    /* If the initializer is constant, put it in DECL_INITIAL so we get
       static initialization and use in constant expressions.  */
    init = maybe_constant_init (expr, var, /*manifestly_const_eval=*/true);
diff -Nrcpad gcc-16-20260315/gcc/cp/constexpr.cc gcc-16-20260322/gcc/cp/constexpr.cc
*** gcc-16-20260315/gcc/cp/constexpr.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/cp/constexpr.cc	Sun Mar 22 22:32:06 2026
*************** build_constexpr_constructor_member_initi
*** 635,640 ****
--- 635,641 ----
        {
        case MUST_NOT_THROW_EXPR:
        case EH_SPEC_BLOCK:
+       case TRY_FINALLY_EXPR: // For C++26 postconditions.
  	body = TREE_OPERAND (body, 0);
  	break;
  
*************** mark_non_constant (tree t)
*** 10741,10748 ****
     a failed or non-constant contract that would invalidate this.  */
  
  static bool
! check_for_failed_contracts (constexpr_global_ctx *global_ctx)
  {
    if (!flag_contracts || !global_ctx->contract_statement)
      return false;
  
--- 10742,10750 ----
     a failed or non-constant contract that would invalidate this.  */
  
  static bool
! check_for_failed_contracts (constexpr_ctx *ctx)
  {
+   constexpr_global_ctx *const global_ctx = ctx->global;
    if (!flag_contracts || !global_ctx->contract_statement)
      return false;
  
*************** check_for_failed_contracts (constexpr_gl
*** 10751,10757 ****
    bool error = false;
    /* [intro.compliance.general]/2.3.4. */
    /* [basic.contract.eval]/8. */
!   if (contract_terminating_p (global_ctx->contract_statement))
      {
        kind = diagnostics::kind::error;
        error = true;
--- 10753,10764 ----
    bool error = false;
    /* [intro.compliance.general]/2.3.4. */
    /* [basic.contract.eval]/8. */
!   if (ctx->manifestly_const_eval != mce_true)
!     {
!       /* When !MCE, silently return not constant.  */
!       return true;
!     }
!   else if (contract_terminating_p (global_ctx->contract_statement))
      {
        kind = diagnostics::kind::error;
        error = true;
*************** cxx_eval_outermost_constant_expr (tree t
*** 11124,11129 ****
--- 11131,11149 ----
  
    if (non_constant_p && !allow_non_constant)
      return error_mark_node;
+   else if (check_for_failed_contracts (&ctx))
+     {
+       if (manifestly_const_eval == mce_true)
+ 	/* If MCE, we gave a hard error and return error_mark_node.  */
+ 	return error_mark_node;
+       else
+ 	{
+ 	  /* Otherwise treat it as non-constant so the violation is still
+ 	     detectable at run-time.  */
+ 	  gcc_checking_assert (allow_non_constant);
+ 	  return t;
+ 	}
+     }
    else if (non_constant_p && TREE_CONSTANT (r))
      r = mark_non_constant (r);
    else if (non_constant_p)
*************** cxx_eval_outermost_constant_expr (tree t
*** 11131,11140 ****
  
    if (constexpr_dtor)
      {
!       if (check_for_failed_contracts (&global_ctx))
! 	r = mark_non_constant (r);
!       else
!         DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (object) = true;
        return r;
      }
  
--- 11151,11157 ----
  
    if (constexpr_dtor)
      {
!       DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (object) = true;
        return r;
      }
  
*************** cxx_eval_outermost_constant_expr (tree t
*** 11184,11191 ****
    if (location_t loc = EXPR_LOCATION (t))
      protected_set_expr_location (r, loc);
  
-   if (check_for_failed_contracts (&global_ctx))
-     r = mark_non_constant (r);
    return r;
  }
  
--- 11201,11206 ----
*************** potential_constant_expression_1 (tree t,
*** 12656,12661 ****
--- 12671,12682 ----
        return (RECUR (TREE_OPERAND (t, 0), want_rval)
  	      && RECUR (TREE_OPERAND (t, 1), any));
  
+     case EH_ELSE_EXPR:
+       /* maybe_apply_function_contracts uses this to check postconditions only
+ 	 on normal return.  */
+       return (RECUR (TREE_OPERAND (t, 1), any)
+ 	      || RECUR (TREE_OPERAND (t, 0), any));
+ 
      case SCOPE_REF:
        return RECUR (TREE_OPERAND (t, 1), want_rval);
  
diff -Nrcpad gcc-16-20260315/gcc/cp/error.cc gcc-16-20260322/gcc/cp/error.cc
*** gcc-16-20260315/gcc/cp/error.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/cp/error.cc	Sun Mar 22 22:32:06 2026
*************** dump_type (cxx_pretty_printer *pp, tree
*** 875,885 ****
        break;
  
      case NULLPTR_TYPE:
!       pp_string (pp, "std::nullptr_t");
        break;
  
      case META_TYPE:
!       pp_string (pp, "std::meta::info");
        break;
  
      case SPLICE_SCOPE:
--- 875,885 ----
        break;
  
      case NULLPTR_TYPE:
!       pp_cxx_ws_string (pp, "std::nullptr_t");
        break;
  
      case META_TYPE:
!       pp_cxx_ws_string (pp, "std::meta::info");
        break;
  
      case SPLICE_SCOPE:
*************** inform_tree_category (tree t)
*** 4006,4011 ****
--- 4006,4013 ----
      inform (loc, "but %qE is a function template", t);
    else if (DECL_CLASS_TEMPLATE_P (t))
      inform (loc, "but %qE is a class template", t);
+   else if (variable_template_p (t))
+     inform (loc, "but %qE is a variable template", t);
    else if (TREE_CODE (t) == NAMESPACE_DECL)
      inform (loc, "but %qE is a namespace", t);
    else if (TREE_CODE (t) == CONST_DECL && !DECL_TEMPLATE_PARM_P (t))
diff -Nrcpad gcc-16-20260315/gcc/cp/module.cc gcc-16-20260322/gcc/cp/module.cc
*** gcc-16-20260315/gcc/cp/module.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/cp/module.cc	Sun Mar 22 22:32:06 2026
*************** trees_in::decl_value ()
*** 9031,9036 ****
--- 9031,9047 ----
  	  && decl_tls_wrapper_p (decl))
  	note_vague_linkage_fn (decl);
  
+       /* Apply relevant attributes.
+ 	 FIXME should probably use cplus_decl_attributes for this,
+ 	 but it's not yet ready for modules.  */
+ 
+       if (VAR_OR_FUNCTION_DECL_P (inner))
+ 	if (tree attr = lookup_attribute ("section", DECL_ATTRIBUTES (inner)))
+ 	  {
+ 	    tree section_name = TREE_VALUE (TREE_VALUE (attr));
+ 	    set_decl_section_name (inner, TREE_STRING_POINTER (section_name));
+ 	  }
+ 
        /* Setup aliases for the declaration.  */
        if (tree alias = lookup_attribute ("alias", DECL_ATTRIBUTES (decl)))
  	{
*************** trees_in::fn_parms_init (tree fn)
*** 11358,11363 ****
--- 11369,11387 ----
  		 base_tag - ix, ix, parm, fn);
        if (!tree_node_vals (parm))
  	return 0;
+ 
+       /* Apply relevant attributes.
+ 	 FIXME should probably use cplus_decl_attributes for this,
+ 	 but it's not yet ready for modules.  */
+ 
+       /* TREE_USED is deliberately not streamed for most declarations,
+ 	 but needs to be set if we have the [[maybe_unused]] attribute.  */
+       if (lookup_attribute ("unused", DECL_ATTRIBUTES (parm))
+ 	  || lookup_attribute ("maybe_unused", DECL_ATTRIBUTES (parm)))
+ 	{
+ 	  TREE_USED (parm) = true;
+ 	  DECL_READ_P (parm) = true;
+ 	}
      }
  
    /* Reload references to contract functions, if any.  */
diff -Nrcpad gcc-16-20260315/gcc/cp/parser.cc gcc-16-20260322/gcc/cp/parser.cc
*** gcc-16-20260315/gcc/cp/parser.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/cp/parser.cc	Sun Mar 22 22:32:06 2026
*************** cp_parser_splice_specifier (cp_parser *p
*** 6158,6164 ****
       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,
--- 6158,6164 ----
       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;
    tree expr = cp_parser_constant_expression (parser,
  					     /*allow_non_constant_p=*/false,
  					     /*non_constant_p=*/nullptr,
*************** cp_parser_splice_expression (cp_parser *
*** 6318,6324 ****
  
    if (error_operand_p (t))
      {
!       gcc_assert (seen_error ());
        return error_mark_node;
      }
  
--- 6318,6325 ----
  
    if (error_operand_p (t))
      {
!       gcc_assert (seen_error ()
! 		  || cp_parser_uncommitted_to_tentative_parse_p (parser));
        return error_mark_node;
      }
  
*************** cp_parser_pseudo_destructor_name (cp_par
*** 10052,10058 ****
  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
--- 10053,10058 ----
*************** cp_parser_reflection_name (cp_parser *pa
*** 10076,10081 ****
--- 10076,10082 ----
      cp_parser_error (parser, "%<template%> must follow a nested-name-"
  		     "specifier");
  
+   auto s = make_temp_override (cp_preserve_using_decl, true);
    /* Look for the identifier.  */
    location_t loc = cp_lexer_peek_token (parser->lexer)->location;
    tree name = cp_parser_identifier (parser);
*************** cp_parser_base_specifier (cp_parser* par
*** 31830,31836 ****
    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))
--- 31831,31837 ----
    tree std_attrs = cp_parser_std_attribute_spec_seq (parser);
    tree annotations = NULL_TREE;
  
!   if (std_attrs != NULL_TREE && std_attrs != error_mark_node)
      {
        tree *pannotations = &annotations;
        for (tree attr = std_attrs; attr; attr = TREE_CHAIN (attr))
diff -Nrcpad gcc-16-20260315/gcc/cp/pt.cc gcc-16-20260322/gcc/cp/pt.cc
*** gcc-16-20260315/gcc/cp/pt.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/cp/pt.cc	Sun Mar 22 22:32:06 2026
*************** tsubst (tree t, tree args, tsubst_flags_
*** 17800,17805 ****
--- 17800,17817 ----
  	templ = tsubst_splice_expr (templ, args, complain, in_decl);
  	if (templ == error_mark_node)
  	  return error_mark_node;
+ 	if (!DECL_TYPE_TEMPLATE_P (templ)
+ 	    && !DECL_TEMPLATE_TEMPLATE_PARM_P (templ))
+ 	  {
+ 	    if (complain & tf_error)
+ 	      {
+ 		auto_diagnostic_group d;
+ 		error_at (cp_expr_loc_or_input_loc (TREE_OPERAND (t, 0)),
+ 			  "expected a reflection of a type template");
+ 		inform_tree_category (templ);
+ 	      }
+ 	    return error_mark_node;
+ 	  }
  	tree targs = TREE_OPERAND (t, 1);
  	if (targs)
  	  targs = tsubst_template_args (targs, args, complain, in_decl);
*************** tsubst_expr (tree t, tree args, tsubst_f
*** 22731,22737 ****
  	  else if (r == NULL_TREE)
  	    {
  	      /* First try name lookup to find the instantiation.  */
! 	      r = lookup_name (DECL_NAME (t));
  	      if (r)
  		{
  		  if (!VAR_P (r))
--- 22743,22750 ----
  	  else if (r == NULL_TREE)
  	    {
  	      /* First try name lookup to find the instantiation.  */
! 	      if (DECL_NAME (t))
! 		r = lookup_name (DECL_NAME (t));
  	      if (r)
  		{
  		  if (!VAR_P (r))
diff -Nrcpad gcc-16-20260315/gcc/cp/reflect.cc gcc-16-20260322/gcc/cp/reflect.cc
*** gcc-16-20260315/gcc/cp/reflect.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/cp/reflect.cc	Sun Mar 22 22:32:06 2026
*************** check_out_of_consteval_use_r (tree *tp,
*** 8246,8251 ****
--- 8246,8262 ----
  	}
      }
  
+   /* Don't diagnose RETURN_EXPRs in cdtors on cdtor_returns_this
+      target.  Those don't exist on other targets.  */
+   if (TREE_CODE (t) == RETURN_EXPR
+       && targetm.cxx.cdtor_returns_this ()
+       && (DECL_CONSTRUCTOR_P (current_function_decl)
+ 	  || DECL_DESTRUCTOR_P (current_function_decl)))
+     {
+       *walk_subtrees = false;
+       return NULL_TREE;
+     }
+ 
    /* Now check the type to see if we are dealing with a consteval-only
       expression.  */
    if (!consteval_only_p (t))
diff -Nrcpad gcc-16-20260315/gcc/cp/tree.cc gcc-16-20260322/gcc/cp/tree.cc
*** gcc-16-20260315/gcc/cp/tree.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/cp/tree.cc	Sun Mar 22 22:32:06 2026
*************** handle_annotation_attribute (tree *node,
*** 5912,5917 ****
--- 5912,5923 ----
        *no_add_attrs = true;
        return NULL_TREE;
      }
+   if (TREE_CODE (*node) == PARM_DECL && VOID_TYPE_P (TREE_TYPE (*node)))
+     {
+       error ("annotation on void parameter");
+       *no_add_attrs = true;
+       return NULL_TREE;
+     }
    if (!type_dependent_expression_p (TREE_VALUE (args)))
      {
        if (!structural_type_p (TREE_TYPE (TREE_VALUE (args))))
diff -Nrcpad gcc-16-20260315/gcc/doc/install.texi gcc-16-20260322/gcc/doc/install.texi
*** gcc-16-20260315/gcc/doc/install.texi	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/doc/install.texi	Sun Mar 22 22:32:06 2026
*************** is built, using an external build of the
*** 2961,2967 ****
  collector (@uref{https://www.hboehm.info/gc/}).
  
  This library needs to be available for each multilib variant, unless
! configured with @option{--enable-objc-gc=@samp{auto}} in which case
  the build of the additional runtime library is skipped when not
  available and the build continues.
  
--- 2961,2967 ----
  collector (@uref{https://www.hboehm.info/gc/}).
  
  This library needs to be available for each multilib variant, unless
! configured with @option{--enable-algol68-gc=@samp{auto}} in which case
  the build of the additional runtime library is skipped when not
  available and the build continues.
  
diff -Nrcpad gcc-16-20260315/gcc/doc/invoke.texi gcc-16-20260322/gcc/doc/invoke.texi
*** gcc-16-20260315/gcc/doc/invoke.texi	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/doc/invoke.texi	Sun Mar 22 22:32:06 2026
*************** Objective-C and Objective-C++ Dialects}.
*** 864,869 ****
--- 864,870 ----
  -fsel-sched-verbose  -fsel-sched-dump-cfg  -fsel-sched-pipelining-verbose
  -fstats  -fstack-usage  -ftime-report  -ftime-report-details
  -fvar-tracking-assignments-toggle  -gtoggle
+ -print-autofdo-gcov-version
  -print-file-name=@var{library}  -print-libgcc-file-name
  -print-multi-directory  -print-multi-lib  -print-multi-os-directory
  -print-multiarch
*************** Objective-C and Objective-C++ Dialects}.
*** 872,877 ****
--- 873,879 ----
  -save-temps  -save-temps=cwd  -save-temps=obj
  -specs=@var{file}  -time@r{[}=@var{file}@r{]}
  --dump=@var{letters}
+ --print-autofdo-gcov-version
  --print-file-name=@var{library}  --print-libgcc-file-file-name
  --print-multi-directory  --print-multi-lib  --print-multi-os-directory
  --print-multiarch  --print-prog-name=@var{program}
*************** For example, with @option{-fdbg-cnt=dce:
*** 21028,21033 ****
--- 21030,21040 ----
  eleventh invocation.
  For @code{dbg_cnt(tail_call)} true is returned for first 10 invocations.
  
+ @opindex print-autofdo-gcov-version
+ @item -print-autofdo-gcov-version
+ @itemx --print-autofdo-gcov-version
+ Print the current version of GCOV being used by the AutoFDO infrastructure.
+ 
  @opindex print-file-name
  @item -print-file-name=@var{library}
  @itemx --print-file-name=@var{library}
*************** width as the alignment value, and @samp{
*** 31304,31309 ****
--- 31311,31318 ----
  @item -mbig-endian
  Generate big-endian code.  This is the default when GCC is configured for a
  @samp{riscv64be-*-*} or @samp{riscv32be-*-*} target.
+ Support for RISC-V big-endian is experimental.  The ABI is not yet stable
+ and could change in incompatible ways in future releases.
  
  @opindex mlittle-endian
  @item -mlittle-endian
diff -Nrcpad gcc-16-20260315/gcc/fortran/ChangeLog gcc-16-20260322/gcc/fortran/ChangeLog
*** gcc-16-20260315/gcc/fortran/ChangeLog	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/fortran/ChangeLog	Sun Mar 22 22:32:06 2026
***************
*** 1,3 ****
--- 1,50 ----
+ 2026-03-20  Christopher Albert  <albert@tugraz.at>
+ 
+ 	PR fortran/120723
+ 	* trans-openmp.cc (gfc_trans_omp_clauses): Handle bare scalar
+ 	OpenACC attach/detach clauses without pointer-mapping nodes.
+ 
+ 2026-03-19  Paul Thomas  <pault@gcc.gnu.org>
+ 
+ 	PR fortran/124161
+ 	* resolve.cc (resolve_symbol): Do not apply the default
+ 	initializer if the symbol is used in a submodule.
+ 
+ 2026-03-17  Christopher Albert  <albert@tugraz.at>
+ 
+ 	PR fortran/120286
+ 	* trans-openmp.cc (gfc_is_class_pointer_type): New helper.
+ 	(gfc_omp_clause_copy_ctor): Unwrap saved descriptors before
+ 	deciding whether privatization should preserve only pointer
+ 	association.  Handle scalar class pointers on that path too.
+ 	(gfc_omp_clause_dtor): Likewise.
+ 
+ 2026-03-16  Paul Thomas  <pault@gcc.gnu.org>
+ 	    Steve Kargl  <kargls@comcast.net>
+ 
+ 	PR fortran/93832
+ 	* array.cc (resolve_array_bound): Emit error and return false
+ 	if bound expression is derived type or class.
+ 	* primary.cc (gfc_convert_to_structure_constructor): Do not
+ 	dereference NULL in character component test. Define 'shorter'
+ 	and use it help cure one of several whitespace issues.
+ 
+ 2026-03-16  Paul Thomas  <pault@gcc.gnu.org>
+ 
+ 	PR fortran/105168
+ 	* trans-expr.cc (gfc_conv_class_to_class): If the argument expr
+ 	is not a class type use the parent tree if that is a class.
+ 	(gfc_conv_procedure_call): If the argument expression is not a
+ 	variable, shift the bounds to give unity lbounds.
+ 	(gfc_trans_arrayfunc_assign): Return NULL_TREE instead of NULL.
+ 
+ 2026-03-15  Christopher Albert  <albert@tugraz.at>
+ 
+ 	PR fortran/124482
+ 	* decl.cc (gfc_match_data_decl): Defer CLASS container cleanup
+ 	until after all failed components are unlinked.  Check remaining
+ 	component list before freeing a shared container.
+ 
  2026-03-13  Christopher Albert  <albert@tugraz.at>
  
  	PR fortran/102459
diff -Nrcpad gcc-16-20260315/gcc/fortran/array.cc gcc-16-20260322/gcc/fortran/array.cc
*** gcc-16-20260315/gcc/fortran/array.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/fortran/array.cc	Sun Mar 22 22:32:06 2026
*************** resolve_array_bound (gfc_expr *e, int ch
*** 471,476 ****
--- 471,483 ----
    if (e == NULL)
      return true;
  
+   if (e->ts.type == BT_DERIVED || e->ts.type == BT_CLASS)
+     {
+       gfc_error ("Derived type or class expression for array bound at %L",
+ 		 &e->where);
+       return false;
+     }
+ 
    if (!gfc_resolve_expr (e)
        || !gfc_specification_expr (e))
      return false;
diff -Nrcpad gcc-16-20260315/gcc/fortran/primary.cc gcc-16-20260322/gcc/fortran/primary.cc
*** gcc-16-20260315/gcc/fortran/primary.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/fortran/primary.cc	Sun Mar 22 22:32:06 2026
*************** gfc_convert_to_structure_constructor (gf
*** 3604,3609 ****
--- 3604,3610 ----
  	  && this_comp->ts.u.cl && this_comp->ts.u.cl->length
  	  && this_comp->ts.u.cl->length->expr_type == EXPR_CONSTANT
  	  && this_comp->ts.u.cl->length->ts.type == BT_INTEGER
+ 	  && actual->expr
  	  && actual->expr->ts.type == BT_CHARACTER
  	  && actual->expr->expr_type == EXPR_CONSTANT)
  	{
*************** gfc_convert_to_structure_constructor (gf
*** 3668,3694 ****
  	  goto cleanup;
  	}
  
!           /* If not explicitly a parent constructor, gather up the components
!              and build one.  */
!           if (comp && comp == sym->components
!                 && sym->attr.extension
! 		&& comp_tail->val
!                 && (!gfc_bt_struct (comp_tail->val->ts.type)
!                       ||
!                     comp_tail->val->ts.u.derived != this_comp->ts.u.derived))
!             {
!               bool m;
  	      gfc_actual_arglist *arg_null = NULL;
  
  	      actual->expr = comp_tail->val;
  	      comp_tail->val = NULL;
  
!               m = gfc_convert_to_structure_constructor (NULL,
! 					comp->ts.u.derived, &comp_tail->val,
! 					comp->ts.u.derived->attr.zero_comp
! 					  ? &arg_null : &actual, true);
!               if (!m)
!                 goto cleanup;
  
  	      if (comp->ts.u.derived->attr.zero_comp)
  		{
--- 3669,3695 ----
  	  goto cleanup;
  	}
  
! 	  /* If not explicitly a parent constructor, gather up the components
! 	     and build one.  */
! 	  if (comp && comp == sym->components
! 	      && sym->attr.extension
! 	      && comp_tail->val
! 	      && (!gfc_bt_struct (comp_tail->val->ts.type)
! 		  || comp_tail->val->ts.u.derived != this_comp->ts.u.derived))
! 	    {
! 	      bool m;
  	      gfc_actual_arglist *arg_null = NULL;
  
  	      actual->expr = comp_tail->val;
  	      comp_tail->val = NULL;
+ #define shorter gfc_convert_to_structure_constructor
+ 	      m = shorter (NULL, comp->ts.u.derived, &comp_tail->val,
+ 			   comp->ts.u.derived->attr.zero_comp ? &arg_null :
+ 								&actual, true);
+ #undef shorter
  
! 	      if (!m)
! 		goto cleanup;
  
  	      if (comp->ts.u.derived->attr.zero_comp)
  		{
diff -Nrcpad gcc-16-20260315/gcc/fortran/resolve.cc gcc-16-20260322/gcc/fortran/resolve.cc
*** gcc-16-20260315/gcc/fortran/resolve.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/fortran/resolve.cc	Sun Mar 22 22:32:06 2026
*************** skip_interfaces:
*** 18913,18920 ****
  	  || (a->dummy && !a->pointer && a->intent == INTENT_OUT
  	      && sym->ns->proc_name->attr.if_source != IFSRC_IFBODY))
  	apply_default_init (sym);
!       else if (a->function && !a->pointer && !a->allocatable && !a->use_assoc
! 	       && sym->result)
  	/* Default initialization for function results.  */
  	apply_default_init (sym->result);
        else if (a->function && sym->result && a->access != ACCESS_PRIVATE
--- 18913,18920 ----
  	  || (a->dummy && !a->pointer && a->intent == INTENT_OUT
  	      && sym->ns->proc_name->attr.if_source != IFSRC_IFBODY))
  	apply_default_init (sym);
!       else if (a->function && !a->pointer && !a->allocatable
! 	       && !a->use_assoc && !a->used_in_submodule && sym->result)
  	/* Default initialization for function results.  */
  	apply_default_init (sym->result);
        else if (a->function && sym->result && a->access != ACCESS_PRIVATE
diff -Nrcpad gcc-16-20260315/gcc/fortran/target-memory.cc gcc-16-20260322/gcc/fortran/target-memory.cc
*** gcc-16-20260315/gcc/fortran/target-memory.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/fortran/target-memory.cc	Sun Mar 22 22:32:06 2026
*************** expr_to_char (gfc_expr *e, locus *loc,
*** 737,743 ****
     the union declaration.  */
  
  size_t
! gfc_merge_initializers (gfc_typespec ts, gfc_expr *e, locus *loc,
  			unsigned char *data,
  			unsigned char *chk, size_t length)
  {
--- 737,743 ----
     the union declaration.  */
  
  size_t
! gfc_merge_initializers (const gfc_typespec &ts, gfc_expr *e, locus *loc,
  			unsigned char *data,
  			unsigned char *chk, size_t length)
  {
diff -Nrcpad gcc-16-20260315/gcc/fortran/target-memory.h gcc-16-20260322/gcc/fortran/target-memory.h
*** gcc-16-20260315/gcc/fortran/target-memory.h	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/fortran/target-memory.h	Sun Mar 22 22:32:06 2026
*************** int gfc_interpret_derived (unsigned char
*** 44,50 ****
  size_t gfc_target_interpret_expr (unsigned char *, size_t, gfc_expr *, bool);
  
  /* Merge overlapping equivalence initializers for trans-common.cc. */
! size_t gfc_merge_initializers (gfc_typespec, gfc_expr *, locus *,
  			       unsigned char *, unsigned char *,
  			       size_t);
  
--- 44,50 ----
  size_t gfc_target_interpret_expr (unsigned char *, size_t, gfc_expr *, bool);
  
  /* Merge overlapping equivalence initializers for trans-common.cc. */
! size_t gfc_merge_initializers (const gfc_typespec &, gfc_expr *, locus *,
  			       unsigned char *, unsigned char *,
  			       size_t);
  
diff -Nrcpad gcc-16-20260315/gcc/fortran/trans-expr.cc gcc-16-20260322/gcc/fortran/trans-expr.cc
*** gcc-16-20260315/gcc/fortran/trans-expr.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/fortran/trans-expr.cc	Sun Mar 22 22:32:06 2026
*************** gfc_conv_class_to_class (gfc_se *parmse,
*** 1317,1329 ****
    stmtblock_t block;
    bool full_array = false;
  
!   /* Class transformational function results are the data field of a class
!      temporary and so the class expression can be obtained directly.  */
!   if (e->expr_type == EXPR_FUNCTION
!       && e->value.function.isym
!       && e->value.function.isym->transformational
        && TREE_CODE (parmse->expr) == COMPONENT_REF
!       && !GFC_CLASS_TYPE_P (TREE_TYPE (parmse->expr)))
      {
        parmse->expr = TREE_OPERAND (parmse->expr, 0);
        if (!VAR_P (parmse->expr))
--- 1317,1328 ----
    stmtblock_t block;
    bool full_array = false;
  
!   /* If this is the data field of a class temporary, the class expression
!      can be obtained and returned directly.  */
!   if (e->expr_type != EXPR_VARIABLE
        && TREE_CODE (parmse->expr) == COMPONENT_REF
!       && !GFC_CLASS_TYPE_P (TREE_TYPE (parmse->expr))
!       && GFC_CLASS_TYPE_P (TREE_TYPE (TREE_OPERAND (parmse->expr, 0))))
      {
        parmse->expr = TREE_OPERAND (parmse->expr, 0);
        if (!VAR_P (parmse->expr))
*************** gfc_conv_procedure_call (gfc_se * se, gf
*** 7789,7794 ****
--- 7788,7803 ----
  	      gfc_init_block (&class_se.pre);
  	      gfc_init_block (&class_se.post);
  
+ 	      if (e->expr_type != EXPR_VARIABLE)
+ 		{
+ 		  int n;
+ 		  /* Set the bounds and offset correctly.  */
+ 		  for (n = 0; n < e->rank; n++)
+ 		    gfc_conv_shift_descriptor_lbound (&class_se.pre,
+ 						      class_se.expr,
+ 						      n, gfc_index_one_node);
+ 		}
+ 
  	      /* The conversion does not repackage the reference to a class
  	         array - _data descriptor.  */
  	      gfc_conv_class_to_class (&class_se, e, fsym->ts, false,
*************** gfc_trans_arrayfunc_assign (gfc_expr * e
*** 12179,12186 ****
    gfc_symbol *sym = expr1->symtree->n.sym;
    bool finalizable =  gfc_may_be_finalized (expr1->ts);
  
    if (arrayfunc_assign_needs_temporary (expr1, expr2))
!     return NULL;
  
    /* The frontend doesn't seem to bother filling in expr->symtree for intrinsic
       functions.  */
--- 12188,12200 ----
    gfc_symbol *sym = expr1->symtree->n.sym;
    bool finalizable =  gfc_may_be_finalized (expr1->ts);
  
+   /* If the symbol is host associated and has not been referenced in its name
+      space, it might be lacking a backend_decl and vtable.  */
+   if (sym->backend_decl == NULL_TREE)
+     return NULL_TREE;
+ 
    if (arrayfunc_assign_needs_temporary (expr1, expr2))
!     return NULL_TREE;
  
    /* The frontend doesn't seem to bother filling in expr->symtree for intrinsic
       functions.  */
*************** gfc_trans_arrayfunc_assign (gfc_expr * e
*** 12190,12196 ****
  	      || (comp && comp->attr.dimension)
  	      || (!comp && gfc_return_by_reference (expr2->value.function.esym)
  		  && expr2->value.function.esym->result->attr.dimension)))
!     return NULL;
  
    gfc_init_se (&se, NULL);
    gfc_start_block (&se.pre);
--- 12204,12210 ----
  	      || (comp && comp->attr.dimension)
  	      || (!comp && gfc_return_by_reference (expr2->value.function.esym)
  		  && expr2->value.function.esym->result->attr.dimension)))
!     return NULL_TREE;
  
    gfc_init_se (&se, NULL);
    gfc_start_block (&se.pre);
diff -Nrcpad gcc-16-20260315/gcc/fortran/trans-openmp.cc gcc-16-20260322/gcc/fortran/trans-openmp.cc
*** gcc-16-20260315/gcc/fortran/trans-openmp.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/fortran/trans-openmp.cc	Sun Mar 22 22:32:06 2026
*************** gfc_omp_replace_alloc_by_to_mapping (tre
*** 466,473 ****
  }
  
  
- /* Return true if TYPE is polymorphic but not with pointer attribute.  */
- 
  static bool
  gfc_is_polymorphic_nonptr (tree type)
  {
--- 466,471 ----
*************** gfc_is_polymorphic_nonptr (tree type)
*** 476,481 ****
--- 474,503 ----
    return GFC_CLASS_TYPE_P (type);
  }
  
+ /* Return true if TYPE is a class container for a POINTER entity.  */
+ 
+ static bool
+ gfc_is_class_pointer_type (tree type)
+ {
+   tree name;
+   const char *s;
+ 
+   if (POINTER_TYPE_P (type))
+     type = TREE_TYPE (type);
+ 
+   if (!GFC_CLASS_TYPE_P (type))
+     return false;
+ 
+   name = TYPE_NAME (type);
+   if (name && TREE_CODE (name) == TYPE_DECL)
+     name = DECL_NAME (name);
+   if (!name)
+     return false;
+ 
+   s = IDENTIFIER_POINTER (name);
+   return startswith (s, "__class_") && s[strlen (s) - 1] == 'p';
+ }
+ 
  /* Return true if TYPE is unlimited polymorphic but not with pointer attribute;
     unlimited means also intrinsic types are handled and _len is used.  */
  
*************** gfc_omp_clause_copy_ctor (tree clause, t
*** 908,929 ****
  {
    tree type = TREE_TYPE (dest), ptr, size, call;
    tree decl_type = TREE_TYPE (OMP_CLAUSE_DECL (clause));
    tree cond, then_b, else_b;
    stmtblock_t block, cond_block;
  
    gcc_assert (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_FIRSTPRIVATE
  	      || OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_LINEAR);
  
!   /* Privatize pointer, only; cf. gfc_omp_predetermined_sharing. */
!   if (DECL_P (OMP_CLAUSE_DECL (clause))
!       && GFC_DECL_ASSOCIATE_VAR_P (OMP_CLAUSE_DECL (clause)))
!     return build2 (MODIFY_EXPR, TREE_TYPE (dest), dest, src);
  
!   if (DECL_ARTIFICIAL (OMP_CLAUSE_DECL (clause))
!       && DECL_LANG_SPECIFIC (OMP_CLAUSE_DECL (clause))
!       && GFC_DECL_SAVED_DESCRIPTOR (OMP_CLAUSE_DECL (clause)))
!     decl_type
!       = TREE_TYPE (GFC_DECL_SAVED_DESCRIPTOR (OMP_CLAUSE_DECL (clause)));
  
    if (gfc_is_polymorphic_nonptr (decl_type))
      {
--- 930,958 ----
  {
    tree type = TREE_TYPE (dest), ptr, size, call;
    tree decl_type = TREE_TYPE (OMP_CLAUSE_DECL (clause));
+   tree orig_decl = OMP_CLAUSE_DECL (clause);
    tree cond, then_b, else_b;
    stmtblock_t block, cond_block;
  
    gcc_assert (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_FIRSTPRIVATE
  	      || OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_LINEAR);
  
!   if (DECL_ARTIFICIAL (orig_decl)
!       && DECL_LANG_SPECIFIC (orig_decl)
!       && GFC_DECL_SAVED_DESCRIPTOR (orig_decl))
!     {
!       orig_decl = GFC_DECL_SAVED_DESCRIPTOR (orig_decl);
!       decl_type = TREE_TYPE (orig_decl);
!     }
  
!   /* Privatize pointer association only; cf. gfc_omp_predetermined_sharing.
!      This includes scalar class pointers, whose tree type is still the class
!      record even though the Fortran entity has POINTER semantics.  */
!   if (DECL_P (orig_decl)
!       && (GFC_DECL_ASSOCIATE_VAR_P (orig_decl)
! 	  || GFC_DECL_GET_SCALAR_POINTER (orig_decl)
! 	  || gfc_is_class_pointer_type (decl_type)))
!     return build2 (MODIFY_EXPR, TREE_TYPE (dest), dest, src);
  
    if (gfc_is_polymorphic_nonptr (decl_type))
      {
*************** gfc_omp_clause_dtor (tree clause, tree d
*** 1431,1447 ****
  {
    tree type = TREE_TYPE (decl), tem;
    tree decl_type = TREE_TYPE (OMP_CLAUSE_DECL (clause));
  
!   /* Only pointer was privatized; cf. gfc_omp_clause_copy_ctor. */
!   if (DECL_P (OMP_CLAUSE_DECL (clause))
!       && GFC_DECL_ASSOCIATE_VAR_P (OMP_CLAUSE_DECL (clause)))
!     return NULL_TREE;
  
!   if (DECL_ARTIFICIAL (OMP_CLAUSE_DECL (clause))
!       && DECL_LANG_SPECIFIC (OMP_CLAUSE_DECL (clause))
!       && GFC_DECL_SAVED_DESCRIPTOR (OMP_CLAUSE_DECL (clause)))
!     decl_type
! 	= TREE_TYPE (GFC_DECL_SAVED_DESCRIPTOR (OMP_CLAUSE_DECL (clause)));
    if (gfc_is_polymorphic_nonptr (decl_type))
      {
        if (POINTER_TYPE_P (decl_type))
--- 1460,1482 ----
  {
    tree type = TREE_TYPE (decl), tem;
    tree decl_type = TREE_TYPE (OMP_CLAUSE_DECL (clause));
+   tree orig_decl = OMP_CLAUSE_DECL (clause);
  
!   if (DECL_ARTIFICIAL (orig_decl)
!       && DECL_LANG_SPECIFIC (orig_decl)
!       && GFC_DECL_SAVED_DESCRIPTOR (orig_decl))
!     {
!       orig_decl = GFC_DECL_SAVED_DESCRIPTOR (orig_decl);
!       decl_type = TREE_TYPE (orig_decl);
!     }
  
!   /* Only pointer association was privatized; cf. gfc_omp_clause_copy_ctor.
!      Scalar class pointers must not finalize or free their targets here.  */
!   if (DECL_P (orig_decl)
!       && (GFC_DECL_ASSOCIATE_VAR_P (orig_decl)
! 	  || GFC_DECL_GET_SCALAR_POINTER (orig_decl)
! 	  || gfc_is_class_pointer_type (decl_type)))
!     return NULL_TREE;
    if (gfc_is_polymorphic_nonptr (decl_type))
      {
        if (POINTER_TYPE_P (decl_type))
*************** gfc_trans_omp_clauses (stmtblock_t *bloc
*** 4407,4412 ****
--- 4442,4455 ----
  				       != BT_VOID))))
  		    {
  		      tree orig_decl = decl;
+ 		      bool bare_attach_detach
+ 			= (openacc
+ 			   && (n->u.map.op == OMP_MAP_ATTACH
+ 			       || n->u.map.op == OMP_MAP_DETACH)
+ 			   && !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl))
+ 			   && !(POINTER_TYPE_P (TREE_TYPE (decl))
+ 				&& GFC_DESCRIPTOR_TYPE_P (TREE_TYPE
+ 							  (TREE_TYPE (decl)))));
  
  		      /* For nonallocatable, nonpointer arrays, a temporary
  			 variable is generated, but this one is only defined if
*************** gfc_trans_omp_clauses (stmtblock_t *bloc
*** 4431,4436 ****
--- 4474,4491 ----
  							     cond, tmp,
  							     NULL_TREE));
  			}
+ 		      /* Bare OpenACC attach/detach on scalar pointer-like
+ 			 variables wants a single attach operation on the
+ 			 pointer itself, not a standalone pointer-mapping
+ 			 node.  Component and descriptor cases have dedicated
+ 			 handling below; this covers the plain scalar path.  */
+ 		      if (bare_attach_detach)
+ 			{
+ 			  decl = build_fold_indirect_ref (decl);
+ 			  OMP_CLAUSE_DECL (node) = build_fold_addr_expr (decl);
+ 			  OMP_CLAUSE_SIZE (node) = size_zero_node;
+ 			  goto finalize_map_clause;
+ 			}
  		      /* For descriptor types, the unmapping happens below.  */
  		      if (op != EXEC_OMP_TARGET_EXIT_DATA
  			  || !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl)))
diff -Nrcpad gcc-16-20260315/gcc/fortran/trans.cc gcc-16-20260322/gcc/fortran/trans.cc
*** gcc-16-20260315/gcc/fortran/trans.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/fortran/trans.cc	Sun Mar 22 22:32:06 2026
*************** gfc_assignment_finalizer_call (gfc_se *l
*** 1609,1615 ****
  
  void
  gfc_finalize_tree_expr (gfc_se *se, gfc_symbol *derived,
! 			symbol_attribute attr, int rank)
  {
    tree vptr, final_fndecl, desc, tmp, size, is_final;
    tree data_ptr, data_null, cond;
--- 1609,1615 ----
  
  void
  gfc_finalize_tree_expr (gfc_se *se, gfc_symbol *derived,
! 			const symbol_attribute &attr, int rank)
  {
    tree vptr, final_fndecl, desc, tmp, size, is_final;
    tree data_ptr, data_null, cond;
diff -Nrcpad gcc-16-20260315/gcc/fortran/trans.h gcc-16-20260322/gcc/fortran/trans.h
*** gcc-16-20260315/gcc/fortran/trans.h	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/fortran/trans.h	Sun Mar 22 22:32:06 2026
*************** tree gfc_get_vptr_from_expr (tree);
*** 457,463 ****
  tree gfc_copy_class_to_class (tree, tree, tree, bool);
  bool gfc_add_finalizer_call (stmtblock_t *, gfc_expr *, tree = NULL_TREE);
  bool gfc_add_comp_finalizer_call (stmtblock_t *, tree, gfc_component *, bool);
! void gfc_finalize_tree_expr (gfc_se *, gfc_symbol *, symbol_attribute, int);
  bool gfc_assignment_finalizer_call (gfc_se *, gfc_expr *, bool);
  
  void gfc_class_array_data_assign (stmtblock_t *, tree, tree, bool);
--- 457,464 ----
  tree gfc_copy_class_to_class (tree, tree, tree, bool);
  bool gfc_add_finalizer_call (stmtblock_t *, gfc_expr *, tree = NULL_TREE);
  bool gfc_add_comp_finalizer_call (stmtblock_t *, tree, gfc_component *, bool);
! void gfc_finalize_tree_expr (gfc_se *, gfc_symbol *, const symbol_attribute &,
! 			     int);
  bool gfc_assignment_finalizer_call (gfc_se *, gfc_expr *, bool);
  
  void gfc_class_array_data_assign (stmtblock_t *, tree, tree, bool);
diff -Nrcpad gcc-16-20260315/gcc/function.cc gcc-16-20260322/gcc/function.cc
*** gcc-16-20260315/gcc/function.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/function.cc	Sun Mar 22 22:32:06 2026
*************** along with GCC; see the file COPYING3.
*** 85,90 ****
--- 85,91 ----
  #include "value-range.h"
  #include "gimple-range.h"
  #include "insn-attr.h"
+ #include "hierarchical_discriminator.h"
  
  /* So we can assign to cfun in this file.  */
  #undef cfun
*************** free_after_compilation (struct function
*** 217,222 ****
--- 218,224 ----
    f->cfg = NULL;
    f->curr_properties &= ~PROP_cfg;
    delete f->cond_uids;
+   free_copyid_allocator (f);
  
    regno_reg_rtx = NULL;
  }
diff -Nrcpad gcc-16-20260315/gcc/gcc.cc gcc-16-20260322/gcc/gcc.cc
*** gcc-16-20260315/gcc/gcc.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/gcc.cc	Sun Mar 22 22:32:06 2026
*************** compilation is specified by a string cal
*** 54,59 ****
--- 54,60 ----
  #include "common/common-target.h"
  #include "gcc-urlifier.h"
  #include "opts-diagnostic.h"
+ #include "auto-profile.h" /* for AUTO_PROFILE_VERSION.  */
  
  #ifndef MATH_LIBRARY
  #define MATH_LIBRARY "m"
*************** driver_handle_option (struct gcc_options
*** 4297,4302 ****
--- 4298,4304 ----
      case OPT__no_sysroot_suffix:
      case OPT_pass_exit_codes:
      case OPT_print_search_dirs:
+     case OPT_print_autofdo_gcov_version:
      case OPT_print_file_name_:
      case OPT_print_prog_name_:
      case OPT_print_multi_lib:
*************** driver::maybe_print_and_exit () const
*** 8830,8835 ****
--- 8832,8843 ----
        return (0);
      }
  
+   if (print_autofdo_gcov_version)
+     {
+       printf ("%d\n", AUTO_PROFILE_VERSION);
+       return (0);
+     }
+ 
    if (print_file_name)
      {
        printf ("%s\n", find_file (print_file_name));
diff -Nrcpad gcc-16-20260315/gcc/gimple-fold.cc gcc-16-20260322/gcc/gimple-fold.cc
*** gcc-16-20260315/gcc/gimple-fold.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/gimple-fold.cc	Sun Mar 22 22:32:06 2026
*************** gimple_fold_builtin_stdarg (gimple_stmt_
*** 5346,5352 ****
  	}
        unlink_stmt_vdef (call);
        release_defs (call);
!       gsi_replace (gsi, gimple_build_nop (), true);
        return true;
  
      default:
--- 5346,5352 ----
  	}
        unlink_stmt_vdef (call);
        release_defs (call);
!       gsi_replace (gsi, gimple_build_nop (), false);
        return true;
  
      default:
diff -Nrcpad gcc-16-20260315/gcc/gimplify.cc gcc-16-20260322/gcc/gimplify.cc
*** gcc-16-20260315/gcc/gimplify.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/gimplify.cc	Sun Mar 22 22:32:06 2026
*************** omp_instantiate_mapper (gimple_seq *pre_
*** 13629,13634 ****
--- 13629,13642 ----
  	  continue;
  	}
  
+       if (OMP_CLAUSE_HAS_ITERATORS (clause))
+ 	{
+ 	  sorry_at (OMP_CLAUSE_LOCATION (clause),
+ 		    "user-defined mapper that uses a %<map%> clause "
+ 		    "with %<iterator%>");
+ 	  continue;
+ 	}
+ 
        tree decl = OMP_CLAUSE_DECL (clause);
        tree unshared, type;
        bool nonunit_array_with_mapper = false;
*************** gimplify_omp_workshare (tree *expr_p, gi
*** 18912,18918 ****
      }
  
    gimple_seq iterator_loops_seq = NULL;
!   if (TREE_CODE (expr) == OMP_TARGET)
      {
        remove_unused_omp_iterator_vars (&OMP_CLAUSES (expr));
        build_omp_iterators_loops (&OMP_CLAUSES (expr), &iterator_loops_seq);
--- 18920,18926 ----
      }
  
    gimple_seq iterator_loops_seq = NULL;
!   if (TREE_CODE (expr) == OMP_TARGET || TREE_CODE (expr) == OMP_TARGET_DATA)
      {
        remove_unused_omp_iterator_vars (&OMP_CLAUSES (expr));
        build_omp_iterators_loops (&OMP_CLAUSES (expr), &iterator_loops_seq);
*************** gimplify_omp_workshare (tree *expr_p, gi
*** 19026,19032 ****
  	*uc = NULL_TREE;
  	*pc = use_device_clauses;
  	stmt = gimple_build_omp_target (body, GF_OMP_TARGET_KIND_DATA,
! 					OMP_CLAUSES (expr));
        }
        break;
      case OMP_TEAMS:
--- 19034,19040 ----
  	*uc = NULL_TREE;
  	*pc = use_device_clauses;
  	stmt = gimple_build_omp_target (body, GF_OMP_TARGET_KIND_DATA,
! 					OMP_CLAUSES (expr), iterator_loops_seq);
        }
        break;
      case OMP_TEAMS:
diff -Nrcpad gcc-16-20260315/gcc/ipa-cp.cc gcc-16-20260322/gcc/ipa-cp.cc
*** gcc-16-20260315/gcc/ipa-cp.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/ipa-cp.cc	Sun Mar 22 22:32:06 2026
*************** adjust_callers_for_value_intersection (v
*** 4454,4467 ****
     is assumed their number is known and equal to CALLER_COUNT.  */
  
  template <typename valtype>
! static vec<cgraph_edge *>
  gather_edges_for_value (ipcp_value<valtype> *val, cgraph_node *dest,
  			int caller_count)
  {
    ipcp_value_source<valtype> *src;
!   vec<cgraph_edge *> ret;
  
-   ret.create (caller_count);
    for (src = val->sources; src; src = src->next)
      {
        struct cgraph_edge *cs = src->cs;
--- 4454,4466 ----
     is assumed their number is known and equal to CALLER_COUNT.  */
  
  template <typename valtype>
! static auto_vec<cgraph_edge *>
  gather_edges_for_value (ipcp_value<valtype> *val, cgraph_node *dest,
  			int caller_count)
  {
    ipcp_value_source<valtype> *src;
!   auto_vec<cgraph_edge *> ret (caller_count);
  
    for (src = val->sources; src; src = src->next)
      {
        struct cgraph_edge *cs = src->cs;
*************** decide_about_value (struct cgraph_node *
*** 6005,6012 ****
        fprintf (dump_file, " (caller_count: %i)\n", caller_count);
      }
  
!   vec<cgraph_edge *> callers;
!   callers = gather_edges_for_value (val, node, caller_count);
    ipa_node_params *info = ipa_node_params_sum->get (node);
    ipa_auto_call_arg_values avals;
    avals.m_known_vals.safe_grow_cleared (ipa_get_param_count (info), true);
--- 6004,6011 ----
        fprintf (dump_file, " (caller_count: %i)\n", caller_count);
      }
  
!   auto_vec<cgraph_edge *> callers
!     = gather_edges_for_value (val, node, caller_count);
    ipa_node_params *info = ipa_node_params_sum->get (node);
    ipa_auto_call_arg_values avals;
    avals.m_known_vals.safe_grow_cleared (ipa_get_param_count (info), true);
*************** decide_about_value (struct cgraph_node *
*** 6085,6091 ****
    else
      update_profiling_info (node, val->spec_node);
  
-   callers.release ();
    overall_size += val->local_size_cost;
    if (dump_file && (dump_flags & TDF_DETAILS))
      fprintf (dump_file, "     overall size reached %li\n",
--- 6084,6089 ----
diff -Nrcpad gcc-16-20260315/gcc/ipa-locality-cloning.cc gcc-16-20260322/gcc/ipa-locality-cloning.cc
*** gcc-16-20260315/gcc/ipa-locality-cloning.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/ipa-locality-cloning.cc	Sun Mar 22 22:32:06 2026
*************** partition_callchain (cgraph_node *node,
*** 1187,1194 ****
    /* Aliases are added in the same partition as their targets.
       Aliases are not cloned and their callees are not processed separately.  */
    cgraph_node *cl_node = NULL;
-   if (partition->insns > partition_size)
-     partition = create_partition (npartitions);
  
    /* Iterate over all unique callees of NODE, direct callees and callees via
       inlined nodes.  This avoids calling partition_callchain () separately for
--- 1187,1192 ----
*************** partition_callchain (cgraph_node *node,
*** 1205,1214 ****
  	{
  	  if (!node_partitioned_p (n))
  	    {
  	      add_node_to_partition (partition, n);
  	      if (dump_file)
! 	      fprintf (dump_file, "Partitioned node: %s\n",
! 		       n->dump_asm_name ());
  	      partition_callchain (n, partition, cloning_model, freq_cutoff,
  				   size, cl_num, npartitions, partition_size,
  				   scheme);
--- 1203,1215 ----
  	{
  	  if (!node_partitioned_p (n))
  	    {
+ 	      if (partition->insns > partition_size)
+ 		partition = create_partition (npartitions);
+ 
  	      add_node_to_partition (partition, n);
  	      if (dump_file)
! 		fprintf (dump_file, "Partitioned node: %s\n",
! 			 n->dump_asm_name ());
  	      partition_callchain (n, partition, cloning_model, freq_cutoff,
  				   size, cl_num, npartitions, partition_size,
  				   scheme);
diff -Nrcpad gcc-16-20260315/gcc/lra-constraints.cc gcc-16-20260322/gcc/lra-constraints.cc
*** gcc-16-20260315/gcc/lra-constraints.cc	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/lra-constraints.cc	Sun Mar 22 22:32:06 2026
*************** process_alt_operands (int only_alternati
*** 2741,2747 ****
--- 2741,2754 ----
  		  winreg = true;
  		  if (REG_P (op))
  		    {
+ 		      rtx orig_op = *curr_id->operand_loc[nop];
+ 		      if (GET_CODE (orig_op) == SUBREG && HARD_REGISTER_P (op)
+ 			  && !targetm.hard_regno_mode_ok (REGNO (op),
+ 							  GET_MODE(orig_op)))
+ 			break;
+ 
  		      tree decl;
+ 
  		      if (hard_regno[nop] >= 0
  			  && in_hard_reg_set_p (this_alternative_set,
  						mode, hard_regno[nop])
*************** curr_insn_transform (bool check_only_p)
*** 4402,4424 ****
  	  continue;
  
  	old = op = *curr_id->operand_loc[i];
- 	machine_mode outer_mode = GET_MODE (old);
- 	bool subreg_p = false;
  	if (GET_CODE (old) == SUBREG)
! 	  {
! 	    old = SUBREG_REG (old);
! 	    subreg_p = true;
! 	  }
  	subst = get_equiv_with_elimination (old, curr_insn);
  	original_subreg_reg_mode[i] = VOIDmode;
  	equiv_substition_p[i] = false;
  
- 	/* If we are about to replace a register inside a subreg, check if
- 	   the target can handle that.  */
- 	if (subreg_p && REG_P (subst) && HARD_REGISTER_P (subst)
- 	    && !targetm.hard_regno_mode_ok (REGNO (subst), outer_mode))
- 	  continue;
- 
  	if (subst != old
  	    /* We don't want to change an out operand by constant or invariant
  	       which will require additional reloads, e.g. by putting a constant
--- 4409,4420 ----
  	  continue;
  
  	old = op = *curr_id->operand_loc[i];
  	if (GET_CODE (old) == SUBREG)
! 	  old = SUBREG_REG (old);
  	subst = get_equiv_with_elimination (old, curr_insn);
  	original_subreg_reg_mode[i] = VOIDmode;
  	equiv_substition_p[i] = false;
  
  	if (subst != old
  	    /* We don't want to change an out operand by constant or invariant
  	       which will require additional reloads, e.g. by putting a constant
diff -Nrcpad gcc-16-20260315/gcc/lto/ChangeLog gcc-16-20260322/gcc/lto/ChangeLog
*** gcc-16-20260315/gcc/lto/ChangeLog	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/lto/ChangeLog	Sun Mar 22 22:32:06 2026
***************
*** 1,3 ****
--- 1,10 ----
+ 2026-03-18  Dhruv Chawla  <dhruvc@nvidia.com>
+ 
+ 	* Make-lang.in (lto1.fda): Add `--print-autofdo-gcov-version` to
+ 	profile_merger invocation.
+ 	(create_fdas_for_lto1): Add `--print-autofdo-gcov-version` to
+ 	create_gcov invocations.
+ 
  2026-02-13  Dhruv Chawla  <dhruvc@nvidia.com>
  
  	* Make-lang.in (lto1.fda): Likewise.
diff -Nrcpad gcc-16-20260315/gcc/lto/Make-lang.in gcc-16-20260322/gcc/lto/Make-lang.in
*** gcc-16-20260315/gcc/lto/Make-lang.in	Sun Mar 15 22:32:07 2026
--- gcc-16-20260322/gcc/lto/Make-lang.in	Sun Mar 22 22:32:06 2026
*************** components_in_prev = "bfd opcodes binuti
*** 106,112 ****
  components_in_prev_target = "libstdc++-v3 libsanitizer libvtv libgcc libbacktrace libphobos zlib libgomp libatomic"
  
  lto1.fda: create_fdas_for_lto1
! 	$(PROFILE_MERGER) $(shell ls -ha lto1_*.fda) --output_file lto1.fda -gcov_version 3
  
  create_fdas_for_lto1: ../stage1-gcc/lto1$(exeext) ../prev-gcc/$(PERF_DATA)
  	for component_in_prev in "$(components_in_prev)"; do \
--- 106,112 ----
  components_in_prev_target = "libstdc++-v3 libsanitizer libvtv libgcc libbacktrace libphobos zlib libgomp libatomic"
  
  lto1.fda: create_fdas_for_lto1
! 	$(PROFILE_MERGER) $(shell ls -ha lto1_*.fda) --output_file lto1.fda -gcov_version `../stage1-gcc/xgcc$(exeext) --print-autofdo-gcov-version`
  
  create_fdas_for_lto1: ../stage1-gcc/lto1$(exeext) ../prev-gcc/$(PERF_DATA)
  	for component_in_prev in "$(components_in_prev)"; do \
*************** create_fdas_for_lto1: ../stage1-gcc/lto1
*** 115,121 ****
  	  echo $$perf_path; \
  	  if [ -f $$perf_path ]; then \
  	    profile_name=lto1_$$component_in_prev.fda; \
! 	    $(CREATE_GCOV) -binary ../stage1-gcc/lto1$(exeext) -gcov $$profile_name -profile $$perf_path -gcov_version 3 || exit 1; \
  	  fi; \
  	done;
  
--- 115,121 ----
  	  echo $$perf_path; \
  	  if [ -f $$perf_path ]; then \
  	    profile_name=lto1_$$component_in_prev.fda; \
! 	    $(CREATE_GCOV) -binary ../stage1-gcc/lto1$(exeext) -gcov $$profile_name -profile $$perf_path -gcov_version `../stage1-gcc/xgcc$(exeext) --print-autofdo-gcov-version` || exit 1; \
  	  fi; \
  	done;
  
*************** create_fdas_for_lto1: ../stage1-gcc/lto1
*** 125,131 ****
  	  echo $$perf_path; \
  	  if [ -f $$perf_path ]; then \
  	    profile_name=lto1_$$component_in_prev_target.fda; \
! 	    $(CREATE_GCOV) -binary ../prev-gcc/lto1$(exeext) -gcov $$profile_name -profile $$perf_path -gcov_version 3 || exit 1; \
  	  fi; \
  	done;
  
--- 125,131 ----
  	  echo $$perf_path; \
  	  if [ -f $$perf_path ]; then \
  	    profile_name=lto1_$$component_in_prev_target.fda; \
! 	    $(CREATE_GCOV) -binary ../prev-gcc/lto1$(exeext) -gcov $$profile_name -profile $$perf_path -gcov_version `../prev-gcc/xgcc$(exeext) --print-autofdo-gcov-version` || exit 1; \
  	  fi; \
  	done;
  
diff -Nrcpad gcc-16-20260315/gcc/match.pd gcc-16-20260322/gcc/match.pd
*** gcc-16-20260315/gcc/match.pd	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/match.pd	Sun Mar 22 22:32:07 2026
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 7237,7243 ****
  	 && !TYPE_UNSIGNED (TREE_TYPE (@1))
  	 && element_precision (@1)
  	      <= element_precision (@0)
! 	 && bitwise_equal_p (@1, @2))
      (if (TYPE_UNSIGNED (TREE_TYPE (@2)))
        (with {
  	tree stype = signed_type_for (TREE_TYPE (@2));
--- 7237,7245 ----
  	 && !TYPE_UNSIGNED (TREE_TYPE (@1))
  	 && element_precision (@1)
  	      <= element_precision (@0)
! 	 && bitwise_equal_p (@1, @2)
! 	 && (!VECTOR_TYPE_P (type)
! 	     || target_supports_op_p (type, ABS_EXPR, optab_vector)))
      (if (TYPE_UNSIGNED (TREE_TYPE (@2)))
        (with {
  	tree stype = signed_type_for (TREE_TYPE (@2));
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 7255,7261 ****
  	 && !TYPE_UNSIGNED (TREE_TYPE (@1))
  	 && element_precision (@1)
  	      <= element_precision (@0)
! 	 && bitwise_equal_p (@1, @2))
        (if ((ANY_INTEGRAL_TYPE_P (TREE_TYPE (@2))
  	      && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (@2)))
  	    || TYPE_UNSIGNED (TREE_TYPE (@2)))
--- 7257,7266 ----
  	 && !TYPE_UNSIGNED (TREE_TYPE (@1))
  	 && element_precision (@1)
  	      <= element_precision (@0)
! 	 && bitwise_equal_p (@1, @2)
! 	 && (!VECTOR_TYPE_P (type)
! 	     || (target_supports_op_p (type, ABS_EXPR, optab_vector)
! 		 && target_supports_op_p (type, NEGATE_EXPR, optab_vector))))
        (if ((ANY_INTEGRAL_TYPE_P (TREE_TYPE (@2))
  	      && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (@2)))
  	    || TYPE_UNSIGNED (TREE_TYPE (@2)))
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 7294,7300 ****
    (simplify
     (cnd (cmp (minus@0 @1 @2) zerop) @0 (minus @2 @1))
     (if (!HONOR_SIGNED_ZEROS (type)
! 	&& !TYPE_UNSIGNED (type))
      (abs @0))))
   /* (A - B) <=/< 0 ? (A - B) : (B - A)    same as -abs (A - B) */
   (for cmp (le lt)
--- 7299,7307 ----
    (simplify
     (cnd (cmp (minus@0 @1 @2) zerop) @0 (minus @2 @1))
     (if (!HONOR_SIGNED_ZEROS (type)
! 	&& !TYPE_UNSIGNED (type)
! 	&& (!VECTOR_TYPE_P (type)
! 	    || target_supports_op_p (type, ABS_EXPR, optab_vector)))
      (abs @0))))
   /* (A - B) <=/< 0 ? (A - B) : (B - A)    same as -abs (A - B) */
   (for cmp (le lt)
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 7303,7309 ****
     (if (!HONOR_SIGNED_ZEROS (type)
  	&& !TYPE_UNSIGNED (type))
      (if (ANY_INTEGRAL_TYPE_P (type)
! 	 && !TYPE_OVERFLOW_WRAPS (type))
       (with {
          tree utype = unsigned_type_for (type);
        }
--- 7310,7319 ----
     (if (!HONOR_SIGNED_ZEROS (type)
  	&& !TYPE_UNSIGNED (type))
      (if (ANY_INTEGRAL_TYPE_P (type)
! 	 && !TYPE_OVERFLOW_WRAPS (type)
! 	 && (!VECTOR_TYPE_P (type)
! 	     || (target_supports_op_p (type, ABS_EXPR, optab_vector)
! 		 && target_supports_op_p (type, NEGATE_EXPR, optab_vector))))
       (with {
          tree utype = unsigned_type_for (type);
        }
diff -Nrcpad gcc-16-20260315/gcc/po/ChangeLog gcc-16-20260322/gcc/po/ChangeLog
*** gcc-16-20260315/gcc/po/ChangeLog	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/po/ChangeLog	Sun Mar 22 22:32:07 2026
***************
*** 1,3 ****
--- 1,11 ----
+ 2026-03-20  Joseph Myers  <josmyers@redhat.com>
+ 
+ 	* sv.po: Update.
+ 
+ 2026-03-16  Joseph Myers  <josmyers@redhat.com>
+ 
+ 	* fr.po, sv.po: Update.
+ 
  2026-03-12  Joseph Myers  <josmyers@redhat.com>
  
  	* sv.po: Update.
diff -Nrcpad gcc-16-20260315/gcc/po/fr.po gcc-16-20260322/gcc/po/fr.po
*** gcc-16-20260315/gcc/po/fr.po	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/po/fr.po	Sun Mar 22 22:32:07 2026
*************** msgstr ""
*** 100,106 ****
  "Project-Id-Version: gcc-16.1-b20260222\n"
  "Report-Msgid-Bugs-To: https://gcc.gnu.org/bugs/\n"
  "POT-Creation-Date: 2026-02-19 21:05+0000\n"
! "PO-Revision-Date: 2026-03-06 19:55+0100\n"
  "Last-Translator: Frédéric Marchal <fmarchal@perso.be>\n"
  "Language-Team: French <traduc@traduc.org>\n"
  "Language: fr\n"
--- 100,106 ----
  "Project-Id-Version: gcc-16.1-b20260222\n"
  "Report-Msgid-Bugs-To: https://gcc.gnu.org/bugs/\n"
  "POT-Creation-Date: 2026-02-19 21:05+0000\n"
! "PO-Revision-Date: 2026-03-16 07:35+0100\n"
  "Last-Translator: Frédéric Marchal <fmarchal@perso.be>\n"
  "Language-Team: French <traduc@traduc.org>\n"
  "Language: fr\n"
*************** msgid "type member missing"
*** 22464,22612 ****
  msgstr "membre de type manquant"
  
  #: cp/reflect.cc:4943
- #, fuzzy
- #| msgid "function does not return string type"
  msgid "reflection does not represent a complete enumeration type"
! msgstr "la fonction ne retourne pas un type « string »"
  
  #: cp/reflect.cc:5000
- #, fuzzy
- #| msgid "%qD does not have integral or enumeration type"
  msgid "reflection does not represent an enumerable enumeration type"
! msgstr "%qD n'a pas un type entier ou énuméré"
  
  #: cp/reflect.cc:5156
- #, fuzzy
- #| msgid "expected another rename clause"
  msgid "reflection represents non-integral or bool type"
! msgstr "attendait une autre clause de changement de nom"
  
  #: cp/reflect.cc:5295
- #, fuzzy
- #| msgid "function does not return string type"
  msgid "reflection does not represent a template"
! msgstr "la fonction ne retourne pas un type « string »"
  
  #: cp/reflect.cc:5318
- #, fuzzy
- #| msgid "invalid argument of %qE attribute"
  msgid "invalid argument to can_substitute"
! msgstr "argument invalide dans l'attribut %qE"
  
  #: cp/reflect.cc:5380
  msgid "can_substitute returned false"
! msgstr ""
  
  #: cp/reflect.cc:5509
- #, fuzzy
- #| msgid "target is not pointer or reference"
  msgid "type is not object or reference type"
! msgstr "la cible n'est pas un pointeur ni une référence"
  
  #: cp/reflect.cc:5754
  msgid "conversion from ordinary literal encoding to source charset failed"
! msgstr ""
  
  #: cp/reflect.cc:5760
- #, fuzzy
- #| msgid "conversion from %qT to %qT may change value"
  msgid "conversion from UTF-8 encoding to source charset failed"
! msgstr "la conversion de %qT vers %qT peut changer la valeur"
  
  #: cp/reflect.cc:5768
- #, fuzzy
- #| msgid "%<%c%> is not a valid character in an identifier"
  msgid "name is not a valid identifier"
! msgstr "%<%c%> n'est pas un caractère valable dans un identificateur"
  
  #: cp/reflect.cc:5774
  msgid "name is a keyword"
! msgstr ""
  
  #: cp/reflect.cc:5777
- #, fuzzy
- #| msgid "variant %qD is a built-in"
  msgid "name is a built-in trait"
! msgstr "le variant %qD est interne"
  
  #: cp/reflect.cc:5786
- #, fuzzy
- #| msgid "register name not specified for %q+D"
  msgid "neither name nor bit_width specified"
! msgstr "le nom du registre n'est pas spécifié pour %q+D"
  
  #: cp/reflect.cc:5792
  msgid "bit_width specified with non-integral and non-enumeration type"
! msgstr ""
  
  #: cp/reflect.cc:5797
- #, fuzzy
- #| msgid "alignment may not be specified for %qD"
  msgid "both alignment and bit_width specified"
! msgstr "l'alignement ne peut pas être spécifié pour %qD"
  
  #: cp/reflect.cc:5801
  msgid "bit_width specified with no_unique_address true"
! msgstr ""
  
  #: cp/reflect.cc:5806
- #, fuzzy
- #| msgid "field width specifier"
  msgid "bit_width 0 with specified name"
! msgstr "spécificateur de largeur de champ"
  
  #: cp/reflect.cc:5809
- #, fuzzy
- #| msgid "pack index is negative"
  msgid "bit_width is negative"
! msgstr "l'index du paquet est négatif"
  
  #: cp/reflect.cc:5816
- #, fuzzy
- #| msgid "requested alignment is not a power of 2"
  msgid "alignment is not power of two"
! msgstr "l'alignement demandé n'est pas une puissance de 2"
  
  #: cp/reflect.cc:5819
- #, fuzzy
- #| msgid "pack index is negative"
  msgid "alignment is negative"
! msgstr "l'index du paquet est négatif"
  
  #: cp/reflect.cc:5826
- #, fuzzy
- #| msgid "alignment of %qD is bigger than original declaration"
  msgid "alignment is smaller than alignment_of"
! msgstr "l'alignement de %qD est plus grand que la déclaration originale"
  
  #: cp/reflect.cc:6363
- #, fuzzy
- #| msgid "incomplete implementation of class %qE"
  msgid "incomplete parent class"
! msgstr "implémentation incomplète de la classe %qE"
  
  #: cp/reflect.cc:6799
- #, fuzzy
- #| msgid "%qE is not a class or namespace"
  msgid "neither complete class type nor namespace"
! msgstr "%qE n'est pas une classe ou un espace de noms"
  
  #: cp/reflect.cc:6829 cp/reflect.cc:6857 cp/reflect.cc:6886 cp/reflect.cc:6924
  #: cp/reflect.cc:6962 cp/reflect.cc:6993
- #, fuzzy
- #| msgid "source is of incomplete class type"
  msgid "not a complete class type"
! msgstr "la source est d'un type « class » incomplet"
  
  #: cp/reflect.cc:6952
  msgid "closure type"
! msgstr ""
  
  #: cp/reflect.cc:7128 cp/reflect.cc:7187 cp/reflect.cc:7261
- #, fuzzy
- #| msgid "a template cannot be defaulted"
  msgid "value cannot be extracted"
! msgstr "un patron ne peut pas être imposé par défaut"
  
  #: cp/rtti.cc:592
  msgid "target is not pointer or reference to class"
--- 22464,22572 ----
  msgstr "membre de type manquant"
  
  #: cp/reflect.cc:4943
  msgid "reflection does not represent a complete enumeration type"
! msgstr "la réflexion ne représente pas un type d'énumération complet"
  
  #: cp/reflect.cc:5000
  msgid "reflection does not represent an enumerable enumeration type"
! msgstr "la réflexion ne représente pas un type d'énumération énumérable"
  
  #: cp/reflect.cc:5156
  msgid "reflection represents non-integral or bool type"
! msgstr "la réflexion représente un type non intégral ou booléen"
  
  #: cp/reflect.cc:5295
  msgid "reflection does not represent a template"
! msgstr "la réflexion ne représente pas un patron"
  
  #: cp/reflect.cc:5318
  msgid "invalid argument to can_substitute"
! msgstr "argument invalide à can_substitute"
  
  #: cp/reflect.cc:5380
  msgid "can_substitute returned false"
! msgstr "can_substitute a retourné faux"
  
  #: cp/reflect.cc:5509
  msgid "type is not object or reference type"
! msgstr "le type n'est pas un objet ou un type de référence"
  
  #: cp/reflect.cc:5754
  msgid "conversion from ordinary literal encoding to source charset failed"
! msgstr "la conversion depuis un encodage littéral ordinaire vers un jeu de caractères source a échouée"
  
  #: cp/reflect.cc:5760
  msgid "conversion from UTF-8 encoding to source charset failed"
! msgstr "la conversion depuis l'encodage UTF-8 vers le jeu de caractères source a échouée"
  
  #: cp/reflect.cc:5768
  msgid "name is not a valid identifier"
! msgstr "le nom n'est pas un identificateur valable"
  
  #: cp/reflect.cc:5774
  msgid "name is a keyword"
! msgstr "le nom est un mot-clé"
  
  #: cp/reflect.cc:5777
  msgid "name is a built-in trait"
! msgstr "le nom est un trait interne"
  
  #: cp/reflect.cc:5786
  msgid "neither name nor bit_width specified"
! msgstr "ni le nom ni bit_width sont spécifiés"
  
  #: cp/reflect.cc:5792
  msgid "bit_width specified with non-integral and non-enumeration type"
! msgstr "bit_width spécifié avec un type non intégral ou non énumérable"
  
  #: cp/reflect.cc:5797
  msgid "both alignment and bit_width specified"
! msgstr "l'alignement et bit_width sont spécifiés tous les deux"
  
  #: cp/reflect.cc:5801
  msgid "bit_width specified with no_unique_address true"
! msgstr "bit_width spécifié avec no_unique_address vrai"
  
  #: cp/reflect.cc:5806
  msgid "bit_width 0 with specified name"
! msgstr "bit_width 0 avec le nom spécifié"
  
  #: cp/reflect.cc:5809
  msgid "bit_width is negative"
! msgstr "bit_width est négatif"
  
  #: cp/reflect.cc:5816
  msgid "alignment is not power of two"
! msgstr "l'alignement n'est pas une puissance de deux"
  
  #: cp/reflect.cc:5819
  msgid "alignment is negative"
! msgstr "l'alignement est négatif"
  
  #: cp/reflect.cc:5826
  msgid "alignment is smaller than alignment_of"
! msgstr "l'alignement est plus petit que alignment_of"
  
  #: cp/reflect.cc:6363
  msgid "incomplete parent class"
! msgstr "classe parent incomplète"
  
  #: cp/reflect.cc:6799
  msgid "neither complete class type nor namespace"
! msgstr "n'est ni un type de classe complet ni un espace de noms"
  
  #: cp/reflect.cc:6829 cp/reflect.cc:6857 cp/reflect.cc:6886 cp/reflect.cc:6924
  #: cp/reflect.cc:6962 cp/reflect.cc:6993
  msgid "not a complete class type"
! msgstr "pas un type de classe complet"
  
  #: cp/reflect.cc:6952
  msgid "closure type"
! msgstr "type de fermeture"
  
  #: cp/reflect.cc:7128 cp/reflect.cc:7187 cp/reflect.cc:7261
  msgid "value cannot be extracted"
! msgstr "la valeur ne peut pas être extraite"
  
  #: cp/rtti.cc:592
  msgid "target is not pointer or reference to class"
*************** msgid "%<-mrelax%> is only supported for
*** 24073,24082 ****
  msgstr "%<-mrelax%> est uniquement supporté pour le PIC RTP"
  
  #: cobol/exceptg.h:80
! #, fuzzy, gcc-internal-format
! #| msgid "exception '%s'"
  msgid "exception %qs"
! msgstr "exception « %s »"
  
  #: cobol/parse_ante.h:1659
  #, gcc-internal-format, gfc-internal-format
--- 24033,24041 ----
  msgstr "%<-mrelax%> est uniquement supporté pour le PIC RTP"
  
  #: cobol/exceptg.h:80
! #, gcc-internal-format
  msgid "exception %qs"
! msgstr "exception %qs"
  
  #: cobol/parse_ante.h:1659
  #, gcc-internal-format, gfc-internal-format
*************** msgid "scan.o: %s"
*** 24110,24137 ****
  msgstr "scan.o: %s"
  
  #: cobol/scan_ante.h:673
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%s:%d: invalid %<symbol_type_t%> %d"
  msgid "%s:%d: invalid level '%s'"
! msgstr "%s:%d: %<symbol_type_t%> %d invalide"
  
  #: cobol/scan_ante.h:1218
! #, fuzzy, gcc-internal-format
! #| msgid "%s:%d: invalid %<symbol_type_t%> %d"
  msgid "%s:%d: invalid symbol type %s for symbol %qs"
! msgstr "%s:%d: %<symbol_type_t%> %d invalide"
  
  #: cobol/scan_ante.h:1250
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%s:%d: could not add '%s'"
  msgid "%s:%d: invalid integer '%s'"
! msgstr "%s:%d: impossible d'ajouter « %s »"
  
  #: cobol/scan_post.h:123
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%s: %s: %s"
  msgid "%s:%d: %s: %s"
! msgstr "%s: %s: %s"
  
  #. Use CHECK_FIELD when a should be non-null, and a->var_decl_node also should
  #. by non-null.  (The useless calls to abort() are because cppcheck doesn't
--- 24069,24092 ----
  msgstr "scan.o: %s"
  
  #: cobol/scan_ante.h:673
! #, gcc-internal-format, gfc-internal-format
  msgid "%s:%d: invalid level '%s'"
! msgstr "%s:%d: niveau « %s » invalide"
  
  #: cobol/scan_ante.h:1218
! #, gcc-internal-format
  msgid "%s:%d: invalid symbol type %s for symbol %qs"
! msgstr "%s:%d: type de symbole %s invalide pour le symbole %qs"
  
  #: cobol/scan_ante.h:1250
! #, gcc-internal-format, gfc-internal-format
  msgid "%s:%d: invalid integer '%s'"
! msgstr "%s:%d: entier « %s » invalide"
  
  #: cobol/scan_post.h:123
! #, gcc-internal-format, gfc-internal-format
  msgid "%s:%d: %s: %s"
! msgstr "%s:%d: %s: %s"
  
  #. Use CHECK_FIELD when a should be non-null, and a->var_decl_node also should
  #. by non-null.  (The useless calls to abort() are because cppcheck doesn't
*************** msgstr "%s: %s: %s"
*** 24141,24150 ****
  #. This version is a bit more lax, for special cases
  #: cobol/show_parse.h:452 cobol/show_parse.h:456 cobol/show_parse.h:469
  #: cobol/show_parse.h:473 cobol/show_parse.h:486
! #, fuzzy, gcc-internal-format
! #| msgid "unused parameter %qD"
  msgid "%s: parameter %<"
! msgstr "paramètre %qD inutilisé"
  
  #. A general purpose syntax error.
  #: fortran/gfortran.h:3644 fortran/io.cc:3728 fortran/io.cc:4428
--- 24096,24104 ----
  #. This version is a bit more lax, for special cases
  #: cobol/show_parse.h:452 cobol/show_parse.h:456 cobol/show_parse.h:469
  #: cobol/show_parse.h:473 cobol/show_parse.h:486
! #, gcc-internal-format
  msgid "%s: parameter %<"
! msgstr "%s: paramètre %<"
  
  #. A general purpose syntax error.
  #: fortran/gfortran.h:3644 fortran/io.cc:3728 fortran/io.cc:4428
*************** msgid "%<-mintel-syntax%> and %<-mno-int
*** 24231,24240 ****
  msgstr "%<-mintel-syntax%> et %<-mno-intel-syntax%> sont dépréciés; utilisez plutôt %<-masm=intel%> et %<-masm=att%>"
  
  #: config/i386/i386.opt:655
! #, fuzzy, gcc-internal-format
! #| msgid "%<-misel=no%> is deprecated; use %<-mno-isel%> instead"
  msgid "%<-mstore-max=%> is deprecated; use %<-mmove-max=%> instead"
! msgstr "%<-misel=no%> est déprécié; utilisez plutôt %<-mno-isel%>"
  
  #: config/i386/i386.opt:720
  #, gcc-internal-format
--- 24185,24193 ----
  msgstr "%<-mintel-syntax%> et %<-mno-intel-syntax%> sont dépréciés; utilisez plutôt %<-masm=intel%> et %<-masm=att%>"
  
  #: config/i386/i386.opt:655
! #, gcc-internal-format
  msgid "%<-mstore-max=%> is deprecated; use %<-mmove-max=%> instead"
! msgstr "%<-mstore-max=%> est déprécié; utilisez plutôt %<-mmove-max=%>"
  
  #: config/i386/i386.opt:720
  #, gcc-internal-format
*************** msgid "unknown LTO partitioning model %q
*** 24311,24320 ****
  msgstr "modèle de partitionnement LTO %qs inconnu"
  
  #: params.opt:524
! #, fuzzy, gcc-internal-format
! #| msgid "unknown LTO partitioning model %qs"
  msgid "unknown LTO locality partitioning heuristics %qs"
! msgstr "modèle de partitionnement LTO %qs inconnu"
  
  #: params.opt:978
  #, gcc-internal-format
--- 24264,24272 ----
  msgstr "modèle de partitionnement LTO %qs inconnu"
  
  #: params.opt:524
! #, gcc-internal-format
  msgid "unknown LTO locality partitioning heuristics %qs"
! msgstr "heuristique de partitionnement de la localité %qs inconnue"
  
  #: params.opt:978
  #, gcc-internal-format
*************** msgid "unrecognized zero init padding bi
*** 24447,24462 ****
  msgstr "type de bits de remplissage %qs pour l'initialisation à zéro n'est pas reconnu"
  
  #: algol68/lang.opt:52
! #, fuzzy, gcc-internal-format
! #| msgid "argument %qs to %<-Wbidi-chars%> not recognized"
  msgid "argument %qs to %<-Whidden-declaration%> not recognized"
! msgstr "argument %qs pour %<-Wbidi-chars%> non reconnu"
  
  #: algol68/lang.opt:118
! #, fuzzy, gcc-internal-format
! #| msgid "unknown trampoline implementation %qs"
  msgid "unknown stropping_regime setting %qs"
! msgstr "implémentation de trampoline %qs inconnue"
  
  #: rust/lang.opt:90
  #, gcc-internal-format
--- 24399,24412 ----
  msgstr "type de bits de remplissage %qs pour l'initialisation à zéro n'est pas reconnu"
  
  #: algol68/lang.opt:52
! #, gcc-internal-format
  msgid "argument %qs to %<-Whidden-declaration%> not recognized"
! msgstr "argument %qs pour %<-Whidden-declaration%> non reconnu"
  
  #: algol68/lang.opt:118
! #, gcc-internal-format
  msgid "unknown stropping_regime setting %qs"
! msgstr "paramètre du régime de marquage %qs inconnue"
  
  #: rust/lang.opt:90
  #, gcc-internal-format
*************** msgid "no class name specified with %qs"
*** 24548,24563 ****
  msgstr "aucun nom de classe spécifié avec %qs"
  
  #: c-family/c.opt:1910
! #, fuzzy, gcc-internal-format
! #| msgid "unrecognized state string %qs"
  msgid "unrecognized contract evaluation semantic %qs"
! msgstr "chaîne d'état %qs non reconnue"
  
  #: c-family/c.opt:1942
! #, fuzzy, gcc-internal-format
! #| msgid "unrecognized argument in option %qs"
  msgid "unrecognized client contract check option %qs"
! msgstr "argument non reconnu pour l'option %qs"
  
  #: c-family/c.opt:1958
  #, gcc-internal-format
--- 24498,24511 ----
  msgstr "aucun nom de classe spécifié avec %qs"
  
  #: c-family/c.opt:1910
! #, gcc-internal-format
  msgid "unrecognized contract evaluation semantic %qs"
! msgstr "sémantique d'évaluation du contrat %qs non reconnue"
  
  #: c-family/c.opt:1942
! #, gcc-internal-format
  msgid "unrecognized client contract check option %qs"
! msgstr "option de vérification du contrat du client %qs non reconnue"
  
  #: c-family/c.opt:1958
  #, gcc-internal-format
*************** msgid "unknown C++ standard %qs"
*** 24615,24683 ****
  msgstr "standard C++ %qs inconnu"
  
  #: attr-callback.cc:199
! #, fuzzy, gcc-internal-format
! #| msgid "standard %qE attribute can only be applied to functions"
  msgid "%qE attribute can only be used on functions"
! msgstr "l'attribut %qE standard s'applique uniquement aux fonctions"
  
  #: attr-callback.cc:207
! #, fuzzy, gcc-internal-format
! #| msgid "requested position is not an integer constant"
  msgid "argument specifying callback function position is not an integer constant"
! msgstr "la position demandée n'est pas une constante entière"
  
  #: attr-callback.cc:227
! #, fuzzy, gcc-internal-format
! #| msgid "virtual functions cannot be friends"
  msgid "callback function position cannot be marked as unknown"
! msgstr "les fonctions virtuelles ne peuvent pas être amies"
  
  #: attr-callback.cc:235
! #, fuzzy, gcc-internal-format
! #| msgid "pack index is out of range"
  msgid "callback function position out of range"
! msgstr "l'index du paquet est hors limites"
  
  #: attr-callback.cc:246
! #, fuzzy, gcc-internal-format
! #| msgid "plugin %s registered a null callback function for event %s"
  msgid "could not retrieve callback function from arguments"
! msgstr "le greffon %s a enregistré une fonction de rappel nulle pour l'événement %s"
  
  #: attr-callback.cc:255
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "argument %d of %qE must not be a pointer to a function"
  msgid "argument no. %d is not an address of a function"
! msgstr "l'argument %d de %qE doit être un pointeur vers une fonction"
  
  #: attr-callback.cc:275
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "one argument of type void* expected, not %s"
  msgid "argument number mismatch, %d expected, got %d"
! msgstr "un argument de type void* attendu, pas %s"
  
  #: attr-callback.cc:293
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "argument %qd is not a constant"
  msgid "argument no. %d is not an integer constant"
! msgstr "l'argument %qd n'est pas une constante"
  
  #: attr-callback.cc:311
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "pack index is out of range"
  msgid "callback argument index %d is out of range"
! msgstr "l'index du paquet est hors limites"
  
  #: attr-callback.cc:324
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "operand type %qT is incompatible with argument %d of %qE"
  msgid "argument type at index %d is not compatible with callback argument type at index %d"
! msgstr "le type %qT de l'opérande est incompatible avec l'argument %d de %qE"
  
  #: attr-callback.cc:339
  #, gcc-internal-format, gfc-internal-format
  msgid "function declaration has multiple callback attributes describing argument no. %d"
! msgstr ""
  
  #: attribs.cc:245 attribs.cc:268 attribs.cc:281
  #, gcc-internal-format
--- 24563,24621 ----
  msgstr "standard C++ %qs inconnu"
  
  #: attr-callback.cc:199
! #, gcc-internal-format
  msgid "%qE attribute can only be used on functions"
! msgstr "l'attribut %qE peut uniquement être utilisé sur des fonctions"
  
  #: attr-callback.cc:207
! #, gcc-internal-format
  msgid "argument specifying callback function position is not an integer constant"
! msgstr "l'argument spécifiant la position de la fonction de rappel n'est pas une constante entière"
  
  #: attr-callback.cc:227
! #, gcc-internal-format
  msgid "callback function position cannot be marked as unknown"
! msgstr "la position de la fonction de rappel ne peut pas être marquée comme inconnue"
  
  #: attr-callback.cc:235
! #, gcc-internal-format
  msgid "callback function position out of range"
! msgstr "la position de la fonction de rappel est hors limites"
  
  #: attr-callback.cc:246
! #, gcc-internal-format
  msgid "could not retrieve callback function from arguments"
! msgstr "impossible de récupérer la fonction de rappel à partir des arguments"
  
  #: attr-callback.cc:255
! #, gcc-internal-format, gfc-internal-format
  msgid "argument no. %d is not an address of a function"
! msgstr "l'argument numéro %d n'est pas une adresse d'une fonction"
  
  #: attr-callback.cc:275
! #, gcc-internal-format, gfc-internal-format
  msgid "argument number mismatch, %d expected, got %d"
! msgstr "désaccord du nombre d'arguments, %d attendu, %d obtenu"
  
  #: attr-callback.cc:293
! #, gcc-internal-format, gfc-internal-format
  msgid "argument no. %d is not an integer constant"
! msgstr "l'argument numéro %d n'est pas une constante entière"
  
  #: attr-callback.cc:311
! #, gcc-internal-format, gfc-internal-format
  msgid "callback argument index %d is out of range"
! msgstr "l'argument de rappel d'index %d est hors limites"
  
  #: attr-callback.cc:324
! #, gcc-internal-format, gfc-internal-format
  msgid "argument type at index %d is not compatible with callback argument type at index %d"
! msgstr "le type d'argument à l'index %d n'est pas compatible avec le type d'argument de rappel à l'index %d"
  
  #: attr-callback.cc:339
  #, gcc-internal-format, gfc-internal-format
  msgid "function declaration has multiple callback attributes describing argument no. %d"
! msgstr "la déclaration de fonction a plusieurs attributs de rappel décrivant l'argument numéro %d"
  
  #: attribs.cc:245 attribs.cc:268 attribs.cc:281
  #, gcc-internal-format
*************** msgid "variable %q+D definition is marke
*** 24868,24883 ****
  msgstr "la définition de la variable %q+D est marquée dllimport"
  
  #: attribs.cc:2016
! #, fuzzy, gcc-internal-format
! #| msgid "initialized variable %q+D is marked dllimport"
  msgid "thread-local variable %q+D declared as dllimport"
! msgstr "la variable initialisé %q+D est marquée dllimport"
  
  #: attribs.cc:2046
! #, fuzzy, gcc-internal-format
! #| msgid "to be allocated variable declared here"
  msgid "thread-local variable %q+D declared as dllexport"
! msgstr "la variable à allouer est déclarée ici"
  
  #: attribs.cc:2054
  #, gcc-internal-format
--- 24806,24819 ----
  msgstr "la définition de la variable %q+D est marquée dllimport"
  
  #: attribs.cc:2016
! #, gcc-internal-format
  msgid "thread-local variable %q+D declared as dllimport"
! msgstr "la variable locale au thread %q+D est déclarée comme dllimport"
  
  #: attribs.cc:2046
! #, gcc-internal-format
  msgid "thread-local variable %q+D declared as dllexport"
! msgstr "la variable locale au thread %q+D est déclarée comme dllexport"
  
  #: attribs.cc:2054
  #, gcc-internal-format
*************** msgstr[1] "%qD spécifie des attributs m
*** 24909,25033 ****
  #: auto-profile.cc:823
  #, gcc-internal-format, gfc-internal-format
  msgid "auto-profile cannot encode offset %i that exceeds 16 bytes"
! msgstr ""
  
  #: auto-profile.cc:827
! #, fuzzy, gcc-internal-format
! #| msgid "deallocation of already deallocated storage"
  msgid "location offset is related to"
! msgstr "désallocation d'un stockage déjà désalloué"
  
  #: auto-profile.cc:830
  #, gcc-internal-format
  msgid "auto-profile cannot encode discriminators that exceeds 16 bytes"
! msgstr ""
  
  #: auto-profile.cc:866
! #, fuzzy, gcc-internal-format
! #| msgid "%qE attribute is not supported for R8C target"
  msgid "auto-profile is not supported for targets with user label prefix"
! msgstr "l'attribut %qE n'est pas supporté pour la cible R8C"
  
  #: auto-profile.cc:1086
  #, gcc-internal-format, gfc-internal-format
  msgid "auto-profile contains invalid symbol name index %d"
! msgstr ""
  
  #: auto-profile.cc:1102
  #, gcc-internal-format, gfc-internal-format
  msgid "auto-profile contains invalid filename index %d"
! msgstr ""
  
  #: auto-profile.cc:1604
  #, gcc-internal-format
  msgid "auto-profile of %q+F contains inlined function with symbol name %s instead of symbol name %s"
! msgstr ""
  
  #: auto-profile.cc:1607 auto-profile.cc:1833 auto-profile.cc:1842
  #: auto-profile.cc:1884
! #, fuzzy, gcc-internal-format
! #| msgid "edge %s->%s has no corresponding call_stmt"
  msgid "corresponding call"
! msgstr "l'arête %s->%s n'a pas de call_stmt correspondant"
  
  #: auto-profile.cc:1652
  #, gcc-internal-format
  msgid "duplicated count information in auto-profile of %q+F with relative location %i discriminator %i"
! msgstr ""
  
  #: auto-profile.cc:1657
! #, fuzzy, gcc-internal-format
! #| msgid "creating run-time relocation"
  msgid "corresponding source location"
! msgstr "création de relocalisations à l'exécution"
  
  #: auto-profile.cc:1828
  #, gcc-internal-format
  msgid "duplicated callsite in auto-profile of %q+F with relative location %i, discriminator %i"
! msgstr ""
  
  #: auto-profile.cc:1836
  #, gcc-internal-format
  msgid "both call targets and inline callsite information is present in auto-profile of function %q+F with relative location %i, discriminator %i"
! msgstr ""
  
  #: auto-profile.cc:1876
  #, gcc-internal-format
  msgid "auto-profile of %q+F seem to contain lost discriminator %i for call of %s at relative location %i"
! msgstr ""
  
  #: auto-profile.cc:1920
  #, gcc-internal-format
  msgid "auto-profile of %q+F contains multiple targets for a direct call with relative location %i, discriminator %i"
! msgstr ""
  
  #: auto-profile.cc:1936
  #, gcc-internal-format, gfc-internal-format
  msgid "function contains two calls of the same relative location +%i, discriminator %i, that leads to lost auto-profile"
! msgstr ""
  
  #: auto-profile.cc:1944
! #, fuzzy, gcc-internal-format
! #| msgid "call invocation refers to locals"
  msgid "location of the first call"
! msgstr "l'appel fait référence à des locales"
  
  #: auto-profile.cc:1946
! #, fuzzy, gcc-internal-format
! #| msgid "location of the previous reduction for %qE"
  msgid "location of the second call"
! msgstr "emplacement de la réduction précédente pour %qE"
  
  #: auto-profile.cc:2000
  #, gcc-internal-format
  msgid "auto-profile of %q+F contains indirect call targets not associated with an indirect call statement"
! msgstr ""
  
  #: auto-profile.cc:2005 auto-profile.cc:2052
  #, gcc-internal-format
  msgid "count %<PRIu64> with relative location +%i, discriminator %i"
! msgstr ""
  
  #: auto-profile.cc:2048
  #, gcc-internal-format
  msgid "auto-profile of %q+F contains extra statements"
! msgstr ""
  
  #: auto-profile.cc:2058 auto-profile.cc:2099
! #, fuzzy, gcc-internal-format
! #| msgid "creating array of functions"
  msgid "location is after end of function"
! msgstr "création d'un tableau de fonctions"
  
  #: auto-profile.cc:2087
  #, gcc-internal-format
  msgid "auto-profile of %q+F contains extra callsites"
! msgstr ""
  
  #: auto-profile.cc:2092
  #, gcc-internal-format
  msgid "call of %s with total count %<PRId64>, relative location +%i, discriminator %i"
! msgstr ""
  
  #: auto-profile.cc:3026
  #, gcc-internal-format
--- 24845,24962 ----
  #: auto-profile.cc:823
  #, gcc-internal-format, gfc-internal-format
  msgid "auto-profile cannot encode offset %i that exceeds 16 bytes"
! msgstr "le profil automatique ne sait pas encoder le décalage %i qui dépasse 16 octets"
  
  #: auto-profile.cc:827
! #, gcc-internal-format
  msgid "location offset is related to"
! msgstr "le décalage de l'emplacement est relié à"
  
  #: auto-profile.cc:830
  #, gcc-internal-format
  msgid "auto-profile cannot encode discriminators that exceeds 16 bytes"
! msgstr "le profil automatique ne sait pas encoder des discriminateurs qui dépasse 16 octets"
  
  #: auto-profile.cc:866
! #, gcc-internal-format
  msgid "auto-profile is not supported for targets with user label prefix"
! msgstr "le profil automatique n'est pas supporté pour des cibles avec des préfixes d'étiquettes utilisateur"
  
  #: auto-profile.cc:1086
  #, gcc-internal-format, gfc-internal-format
  msgid "auto-profile contains invalid symbol name index %d"
! msgstr "le profil automatique contient l'index de nom de symbole %d invalide"
  
  #: auto-profile.cc:1102
  #, gcc-internal-format, gfc-internal-format
  msgid "auto-profile contains invalid filename index %d"
! msgstr "le profil automatique contient l'index de nom de fichier %d invalide"
  
  #: auto-profile.cc:1604
  #, gcc-internal-format
  msgid "auto-profile of %q+F contains inlined function with symbol name %s instead of symbol name %s"
! msgstr "le profil automatique de %q+F contient la fonction en ligne avec le nom de symbole %s au lieu du nom de symbole %s"
  
  #: auto-profile.cc:1607 auto-profile.cc:1833 auto-profile.cc:1842
  #: auto-profile.cc:1884
! #, gcc-internal-format
  msgid "corresponding call"
! msgstr "appel correspondant"
  
  #: auto-profile.cc:1652
  #, gcc-internal-format
  msgid "duplicated count information in auto-profile of %q+F with relative location %i discriminator %i"
! msgstr "décompte d'information dupliqué dans le profil automatique de %q+F à l'emplacement relatif %i, et discriminateur %i"
  
  #: auto-profile.cc:1657
! #, gcc-internal-format
  msgid "corresponding source location"
! msgstr "emplacement source correspondant"
  
  #: auto-profile.cc:1828
  #, gcc-internal-format
  msgid "duplicated callsite in auto-profile of %q+F with relative location %i, discriminator %i"
! msgstr "site d'appel dupliqué dans le profil automatique %q+F à l'emplacement relatif %i, discriminateur %i"
  
  #: auto-profile.cc:1836
  #, gcc-internal-format
  msgid "both call targets and inline callsite information is present in auto-profile of function %q+F with relative location %i, discriminator %i"
! msgstr "les cibles d'appel et l'information du site d'appel en ligne sont présentes toutes les deux dans le profil automatique de la fonction %q+F à l'emplacement relatif %i, discriminateur %i"
  
  #: auto-profile.cc:1876
  #, gcc-internal-format
  msgid "auto-profile of %q+F seem to contain lost discriminator %i for call of %s at relative location %i"
! msgstr "le profil automatique de %q+F semble contenir le discriminateur perdu %i pour l'appel de %s à l'emplacement relatif %i"
  
  #: auto-profile.cc:1920
  #, gcc-internal-format
  msgid "auto-profile of %q+F contains multiple targets for a direct call with relative location %i, discriminator %i"
! msgstr "le profil automatique de %q+F contient plusieurs cibles pour un appel direct avec l'emplacement relatif %i, discriminateur %i"
  
  #: auto-profile.cc:1936
  #, gcc-internal-format, gfc-internal-format
  msgid "function contains two calls of the same relative location +%i, discriminator %i, that leads to lost auto-profile"
! msgstr "la fonction contient deux appels du même emplacement relatif +%i, discriminateur %i, cela conduit à un profil automatique perdu"
  
  #: auto-profile.cc:1944
! #, gcc-internal-format
  msgid "location of the first call"
! msgstr "emplacement du premier appel"
  
  #: auto-profile.cc:1946
! #, gcc-internal-format
  msgid "location of the second call"
! msgstr "emplacement du deuxième appel"
  
  #: auto-profile.cc:2000
  #, gcc-internal-format
  msgid "auto-profile of %q+F contains indirect call targets not associated with an indirect call statement"
! msgstr "le profil automatique de %q+F contient des cibles d'appel indirect qui ne sont pas associées avec une instruction d'appel indirect"
  
  #: auto-profile.cc:2005 auto-profile.cc:2052
  #, gcc-internal-format
  msgid "count %<PRIu64> with relative location +%i, discriminator %i"
! msgstr "décompte %<PRIu64> avec l'emplacement relatif +%i, discriminateur %i"
  
  #: auto-profile.cc:2048
  #, gcc-internal-format
  msgid "auto-profile of %q+F contains extra statements"
! msgstr "le profil automatiquement de %q+F contient des instructions supplémentaires"
  
  #: auto-profile.cc:2058 auto-profile.cc:2099
! #, gcc-internal-format
  msgid "location is after end of function"
! msgstr "l'emplacement est après la fin de la fonction"
  
  #: auto-profile.cc:2087
  #, gcc-internal-format
  msgid "auto-profile of %q+F contains extra callsites"
! msgstr "le profil automatique de %q+F contient des sites d'appel supplémentaires"
  
  #: auto-profile.cc:2092
  #, gcc-internal-format
  msgid "call of %s with total count %<PRId64>, relative location +%i, discriminator %i"
! msgstr "appel de %s avec un décompte total %<PRId64>, emplacement relatif +%i, discriminateur %i"
  
  #: auto-profile.cc:3026
  #, gcc-internal-format
*************** msgstr "TAG inattendu."
*** 25037,25043 ****
  #: auto-profile.cc:3049
  #, gcc-internal-format, gfc-internal-format
  msgid "auto-profile contains duplicated function instance %s"
! msgstr ""
  
  #: auto-profile.cc:3211
  #, gcc-internal-format, gfc-internal-format
--- 24966,24972 ----
  #: auto-profile.cc:3049
  #, gcc-internal-format, gfc-internal-format
  msgid "auto-profile contains duplicated function instance %s"
! msgstr "le profil automatique contient l'instance de fonction dupliquée %s"
  
  #: auto-profile.cc:3211
  #, gcc-internal-format, gfc-internal-format
*************** msgid "AutoFDO profile version %u does n
*** 25055,25064 ****
  msgstr "la version %u du profil AutoFDO ne correspond pas à %u"
  
  #: auto-profile.cc:3237
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "cannot read string table from %s"
  msgid "cannot read summary information from %s"
! msgstr "impossible de lire la table des chaînes depuis %s"
  
  #: auto-profile.cc:3245
  #, gcc-internal-format, gfc-internal-format
--- 24984,24992 ----
  msgstr "la version %u du profil AutoFDO ne correspond pas à %u"
  
  #: auto-profile.cc:3237
! #, gcc-internal-format, gfc-internal-format
  msgid "cannot read summary information from %s"
! msgstr "impossible de lire l'information résumée de %s"
  
  #: auto-profile.cc:3245
  #, gcc-internal-format, gfc-internal-format
*************** msgid "cannot read function profile from
*** 25071,25080 ****
  msgstr "impossible de lire le profil de la fonction depuis %s"
  
  #: auto-profile.cc:3264
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "cannot read function profile from %s"
  msgid "cannot read module profile from %s"
! msgstr "impossible de lire le profil de la fonction depuis %s"
  
  #: builtins.cc:702
  #, gcc-internal-format
--- 24999,25007 ----
  msgstr "impossible de lire le profil de la fonction depuis %s"
  
  #: auto-profile.cc:3264
! #, gcc-internal-format, gfc-internal-format
  msgid "cannot read module profile from %s"
! msgstr "impossible de lire le profil du module depuis %s"
  
  #: builtins.cc:702
  #, gcc-internal-format
*************** msgid "%s does not support dump_bb_for_g
*** 25467,25476 ****
  msgstr "%s ne supporte pas dump_bb_for_graph"
  
  #: cfghooks.cc:364
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%s does not support dump_bb_for_graph"
  msgid "%s does not support dump_bb_as_sarif_properties"
! msgstr "%s ne supporte pas dump_bb_for_graph"
  
  #: cfghooks.cc:418
  #, gcc-internal-format, gfc-internal-format
--- 25394,25402 ----
  msgstr "%s ne supporte pas dump_bb_for_graph"
  
  #: cfghooks.cc:364
! #, gcc-internal-format, gfc-internal-format
  msgid "%s does not support dump_bb_as_sarif_properties"
! msgstr "%s ne supporte pas dump_bb_as_sarif_properties"
  
  #: cfghooks.cc:418
  #, gcc-internal-format, gfc-internal-format
*************** msgid "inline clone is forced to output"
*** 26014,26023 ****
  msgstr "le clone en ligne est forcé à sortir"
  
  #: cgraph.cc:4011
! #, fuzzy, gcc-internal-format
! #| msgid "inline clone is forced to output"
  msgid "inline clone is referenced by assembly"
! msgstr "le clone en ligne est forcé à sortir"
  
  #: cgraph.cc:4018
  #, gcc-internal-format
--- 25940,25948 ----
  msgstr "le clone en ligne est forcé à sortir"
  
  #: cgraph.cc:4011
! #, gcc-internal-format
  msgid "inline clone is referenced by assembly"
! msgstr "le clone en ligne est référencé par l'assembleur"
  
  #: cgraph.cc:4018
  #, gcc-internal-format
*************** msgid "edge count is not compatible with
*** 26050,26059 ****
  msgstr "le décompte d'arêtes n'est pas compatible avec le décompte de fonction"
  
  #: cgraph.cc:4062
! #, fuzzy, gcc-internal-format
! #| msgid "edge count is not compatible with function count"
  msgid "edge count is not compatible with inlined to function count"
! msgstr "le décompte d'arêtes n'est pas compatible avec le décompte de fonction"
  
  #: cgraph.cc:4070
  #, gcc-internal-format, gfc-internal-format
--- 25975,25983 ----
  msgstr "le décompte d'arêtes n'est pas compatible avec le décompte de fonction"
  
  #: cgraph.cc:4062
! #, gcc-internal-format
  msgid "edge count is not compatible with inlined to function count"
! msgstr "le décompte d'arêtes n'est pas compatible avec le décompte de fonction en ligne"
  
  #: cgraph.cc:4070
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "référence à une instruction m
*** 26198,26225 ****
  #: cgraph.cc:4386
  #, gcc-internal-format
  msgid "non-callback edge has callback_id set"
! msgstr ""
  
  #: cgraph.cc:4392
! #, fuzzy, gcc-internal-format
! #| msgid "edge has both call_stmt and lto_stmt_uid set"
  msgid "edge has both callback and has_callback set"
! msgstr "l'arête a, à la fois, call_stmt et lto_stmt_uid définis"
  
  #: cgraph.cc:4400
  #, gcc-internal-format, gfc-internal-format
  msgid "callback edge %s->%s has no callback-carrying"
! msgstr ""
  
  #: cgraph.cc:4428
  #, gcc-internal-format, gfc-internal-format
  msgid "callback edge %s->%s callback edge count mismatch, expected at most %d, found %d"
! msgstr ""
  
  #: cgraph.cc:4441
  #, gcc-internal-format, gfc-internal-format
  msgid "callback-carrying edge is pointing towards __builtin_unreachable, but its callback edge %s -> %s is not"
! msgstr ""
  
  #: cgraph.cc:4448
  #, gcc-internal-format, gfc-internal-format
--- 26122,26148 ----
  #: cgraph.cc:4386
  #, gcc-internal-format
  msgid "non-callback edge has callback_id set"
! msgstr "l'arête non-callback a callback_id défini"
  
  #: cgraph.cc:4392
! #, gcc-internal-format
  msgid "edge has both callback and has_callback set"
! msgstr "l'arête a, à la fois, callback et has_callback défini"
  
  #: cgraph.cc:4400
  #, gcc-internal-format, gfc-internal-format
  msgid "callback edge %s->%s has no callback-carrying"
! msgstr "l'arrête de la callback %s->%s n'a pas de callback-carrying"
  
  #: cgraph.cc:4428
  #, gcc-internal-format, gfc-internal-format
  msgid "callback edge %s->%s callback edge count mismatch, expected at most %d, found %d"
! msgstr "l'arête de la callback %s->%s n'a pas le bon nombre d'arêtes de callback, au plus %d attendu, %d obtenu"
  
  #: cgraph.cc:4441
  #, gcc-internal-format, gfc-internal-format
  msgid "callback-carrying edge is pointing towards __builtin_unreachable, but its callback edge %s -> %s is not"
! msgstr "l'arête transportant la callback pointe vers __builtin_unreachable mais l'arête de sa callback %s -> %s ne le fait pas"
  
  #: cgraph.cc:4448
  #, gcc-internal-format, gfc-internal-format
*************** msgid "invalid lvalue in %<asm%> output
*** 29289,29298 ****
  msgstr "l-valeur invalide dans la sortie %<asm%> %d"
  
  #: gimplify.cc:8243
! #, fuzzy, gcc-internal-format
! #| msgid "multiple parameters named %qD"
  msgid "multiple outputs to lvalue %qE"
! msgstr "plusieurs paramètres nommés %qD"
  
  #: gimplify.cc:8278
  #, gcc-internal-format, gfc-internal-format
--- 29212,29220 ----
  msgstr "l-valeur invalide dans la sortie %<asm%> %d"
  
  #: gimplify.cc:8243
! #, gcc-internal-format
  msgid "multiple outputs to lvalue %qE"
! msgstr "plusieurs sorties vers lvalue %qE"
  
  #: gimplify.cc:8278
  #, gcc-internal-format, gfc-internal-format
*************** msgid "iteration variable %qE should not
*** 29417,29438 ****
  msgstr "la variable d'itération %qE ne devrait pas être linéaire"
  
  #: gimplify.cc:10082
! #, fuzzy, gcc-internal-format
! #| msgid "threadprivate variable %qE used in target region"
  msgid "iterator variable %qE not used in clause expression"
! msgstr "la variable privée au thread %qE est utilisée dans la région cible"
  
  #: gimplify.cc:10201
! #, fuzzy, gcc-internal-format
! #| msgid "execution count is negative"
  msgid "iteration count is zero"
! msgstr "le compteur d'exécution est négatif"
  
  #. Handle dynamic sizes.
  #: gimplify.cc:10245
  #, gcc-internal-format
  msgid "dynamic iterator sizes not implemented yet"
! msgstr ""
  
  #: gimplify.cc:10993 gimplify.cc:11004 gimplify.cc:11016 gimplify.cc:11032
  #: gimplify.cc:11237 gimplify.cc:11260 gimplify.cc:11271 gimplify.cc:11289
--- 29339,29358 ----
  msgstr "la variable d'itération %qE ne devrait pas être linéaire"
  
  #: gimplify.cc:10082
! #, gcc-internal-format
  msgid "iterator variable %qE not used in clause expression"
! msgstr "la variable d'itérateur %qE n'est pas utilisée dans l'expression de l'instruction"
  
  #: gimplify.cc:10201
! #, gcc-internal-format
  msgid "iteration count is zero"
! msgstr "le compteur d'itération est zéro"
  
  #. Handle dynamic sizes.
  #: gimplify.cc:10245
  #, gcc-internal-format
  msgid "dynamic iterator sizes not implemented yet"
! msgstr "les tailles d'itérateurs dynamique ne sont pas encore implémentées"
  
  #: gimplify.cc:10993 gimplify.cc:11004 gimplify.cc:11016 gimplify.cc:11032
  #: gimplify.cc:11237 gimplify.cc:11260 gimplify.cc:11271 gimplify.cc:11289
*************** msgid "with %<ancestor%>, only the %<dev
*** 29528,29542 ****
  msgstr "avec %<ancestor%>, seules les clauses %<device%>, %<firstprivate%>, %<private%>, %<defaultmap%>, et %<map%> peuvent apparaître dans la construction"
  
  #: gimplify.cc:14863
! #, fuzzy, gcc-internal-format
! #| msgid "%<uses_allocators%> clause with traits and memory spaces"
  msgid "%<uses_allocators%> clause"
! msgstr "clause %<uses_allocators%> avec des trais et des espaces mémoire"
  
  #: gimplify.cc:14893
  #, gcc-internal-format
  msgid "%<dyn_groupprivate%> clause"
! msgstr ""
  
  #: gimplify.cc:15012
  #, gcc-internal-format
--- 29448,29461 ----
  msgstr "avec %<ancestor%>, seules les clauses %<device%>, %<firstprivate%>, %<private%>, %<defaultmap%>, et %<map%> peuvent apparaître dans la construction"
  
  #: gimplify.cc:14863
! #, gcc-internal-format
  msgid "%<uses_allocators%> clause"
! msgstr "clause %<uses_allocators%>"
  
  #: gimplify.cc:14893
  #, gcc-internal-format
  msgid "%<dyn_groupprivate%> clause"
! msgstr "clause %<dyn_groupprivate%>"
  
  #: gimplify.cc:15012
  #, gcc-internal-format
*************** msgstr "jeton JSON invalide : %s"
*** 30281,30287 ****
  #: json-parsing.cc:1147
  #, gcc-internal-format, gfc-internal-format
  msgid "expected a JSON value but got %s"
! msgstr "une valeur JSOn était attendue mais on a reçu %s"
  
  #: json-parsing.cc:1175
  #, gcc-internal-format, gfc-internal-format
--- 30200,30206 ----
  #: json-parsing.cc:1147
  #, gcc-internal-format, gfc-internal-format
  msgid "expected a JSON value but got %s"
! msgstr "une valeur JSON était attendue mais on a reçu %s"
  
  #: json-parsing.cc:1175
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "aucune autre propriété de trai
*** 30753,30765 ****
  #: omp-general.cc:1563
  #, gcc-internal-format
  msgid "multiple definitions of variants with the same context selector violate the one-definition rule"
! msgstr ""
  
  #: omp-general.cc:1566
! #, fuzzy, gcc-internal-format
! #| msgid "previous declaration here"
  msgid "previous variant declaration here"
! msgstr "déclaration précédente ici"
  
  #: omp-general.cc:1606
  #, gcc-internal-format
--- 30672,30683 ----
  #: omp-general.cc:1563
  #, gcc-internal-format
  msgid "multiple definitions of variants with the same context selector violate the one-definition rule"
! msgstr "plusieurs définitions de variantes avec le même sélecteur de contexte viole la règle de la définition unique"
  
  #: omp-general.cc:1566
! #, gcc-internal-format
  msgid "previous variant declaration here"
! msgstr "déclaration de variante précédente ici"
  
  #: omp-general.cc:1606
  #, gcc-internal-format
*************** msgid "first offset must be in opposite
*** 31088,31102 ****
  msgstr "le premier offset doit être dans la direction opposée des itérations de la boucle"
  
  #: omp-low.cc:12897
! #, fuzzy, gcc-internal-format
! #| msgid "%<__builtin_has_attribute%> with dependent argument not supported yet"
  msgid "iterators used together with deep mapping are not supported yet"
! msgstr "%<__builtin_has_attribute%> avec un argument dépendant n'est pas encore supporté"
  
  #: omp-low.cc:13174
  #, gcc-internal-format
  msgid "only the %<device_type(any)%> is supported"
! msgstr ""
  
  #: omp-low.cc:15475
  #, gcc-internal-format, gfc-internal-format
--- 31006,31019 ----
  msgstr "le premier offset doit être dans la direction opposée des itérations de la boucle"
  
  #: omp-low.cc:12897
! #, gcc-internal-format
  msgid "iterators used together with deep mapping are not supported yet"
! msgstr "les itérateurs utilisés avec la cartographie profonde n'est pas encore supporté"
  
  #: omp-low.cc:13174
  #, gcc-internal-format
  msgid "only the %<device_type(any)%> is supported"
! msgstr "seul le %<device_type(any)%> est supporté"
  
  #: omp-low.cc:15475
  #, gcc-internal-format, gfc-internal-format
*************** msgid "%<-fsanitize=pointer-subtract%> m
*** 31489,31498 ****
  msgstr "%<-fsanitize=pointer-subtract%> doit être combiné avec %<-fsanitize=address%> ou %<-fsanitize=kernel-address%>"
  
  #: opts.cc:1357
! #, fuzzy, gcc-internal-format
! #| msgid "%<-Wstrict-flex-arrays%> is ignored when %<-fstrict-flex-arrays%> is not present"
  msgid "%<--param hwasan-random-frame-tag=0%> is ignored when %<-fsanitize=memtag-stack%> is present"
! msgstr "%<-Wstrict-flex-arrays%> est ignoré quand %<-fstrict-flex-arrays%> n'est pas présent"
  
  #: opts.cc:1366
  #, gcc-internal-format
--- 31406,31414 ----
  msgstr "%<-fsanitize=pointer-subtract%> doit être combiné avec %<-fsanitize=address%> ou %<-fsanitize=kernel-address%>"
  
  #: opts.cc:1357
! #, gcc-internal-format
  msgid "%<--param hwasan-random-frame-tag=0%> is ignored when %<-fsanitize=memtag-stack%> is present"
! msgstr "%<--param hwasan-random-frame-tag=0%> est ignoré quand %<-fsanitize=memtag-stack%> est présent"
  
  #: opts.cc:1366
  #, gcc-internal-format
*************** msgid "RTL flag check: %s used with unex
*** 32256,32289 ****
  msgstr "vérification du fanion RTL: %s utilisé avec un code rtx inattendu « %s » dans %s, à %s:%d"
  
  #: stmt.cc:227
! #, fuzzy, gcc-internal-format
! #| msgid "data type of %q+D isn%'t suitable for a register"
  msgid "data type isn%'t suitable for register %s of operand %i"
! msgstr "le type de données de %q+D ne convient pas pour un registre"
  
  #: stmt.cc:230
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "the register specified for %q+D cannot be accessed by the current target"
  msgid "register %s for operand %i cannot be accessed by the current target"
! msgstr "le registre spécifié pour %q+D n'est pas accessible par la cible actuelle"
  
  #: stmt.cc:233
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "the register specified for %q+D is not general enough to be used as a register variable"
  msgid "register %s for operand %i is not general enough to be used as a register variable"
! msgstr "le registre spécifié pour %q+D n'est pas assez général pour être utilisé comme registre de variable"
  
  #: stmt.cc:236
! #, fuzzy, gcc-internal-format
! #| msgid "register specified for %q+D isn%'t suitable for data type"
  msgid "register %s for operand %i isn%'t suitable for data type"
! msgstr "le registre spécifié pour %q+D ne convient pas pour un type de données"
  
  #: stmt.cc:245
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "register specified for %q+D is an internal GCC implementation detail"
  msgid "register for operand %i is an internal GCC implementation detail"
! msgstr "le registre spécifié pour %q+D est un détail d'implémentation interne de GCC"
  
  #: stmt.cc:291
  #, gcc-internal-format
--- 32172,32200 ----
  msgstr "vérification du fanion RTL: %s utilisé avec un code rtx inattendu « %s » dans %s, à %s:%d"
  
  #: stmt.cc:227
! #, gcc-internal-format
  msgid "data type isn%'t suitable for register %s of operand %i"
! msgstr "le type de données ne convient pas pour le registre %s de l'opérande %i"
  
  #: stmt.cc:230
! #, gcc-internal-format, gfc-internal-format
  msgid "register %s for operand %i cannot be accessed by the current target"
! msgstr "le registre %s pour l'opérande %i n'est pas accessible par la cible actuelle"
  
  #: stmt.cc:233
! #, gcc-internal-format, gfc-internal-format
  msgid "register %s for operand %i is not general enough to be used as a register variable"
! msgstr "le registre %s de l'opérande %i n'est pas assez général pour être utilisé comme registre de variable"
  
  #: stmt.cc:236
! #, gcc-internal-format
  msgid "register %s for operand %i isn%'t suitable for data type"
! msgstr "le registre %s de l'opérande %i ne convient pas pour un type de données"
  
  #: stmt.cc:245
! #, gcc-internal-format, gfc-internal-format
  msgid "register for operand %i is an internal GCC implementation detail"
! msgstr "le registre de l'opérande %i est un détail d'implémentation interne de GCC"
  
  #: stmt.cc:291
  #, gcc-internal-format
*************** msgid "%<:%> constraint used for output
*** 32316,32358 ****
  msgstr "contrainte %<:%> utilisée pour l'opérande de sortie"
  
  #: stmt.cc:395 stmt.cc:642
! #, fuzzy, gcc-internal-format
! #| msgid "BMX instructions are only supported with R2 architecture"
  msgid "hard register constraints are only supported while using LRA"
! msgstr "les instructions BMX sont uniquement supportées avec l'architecture R2"
  
  #: stmt.cc:403 stmt.cc:470 stmt.cc:650 stmt.cc:725
  #, gcc-internal-format
  msgid "hard register constraints and regular register constraints in one alternative are not supported"
! msgstr ""
  
  #: stmt.cc:410 stmt.cc:657
! #, fuzzy, gcc-internal-format
! #| msgid "multiple cc output constraints not supported"
  msgid "multiple hard register constraints in one alternative are not supported"
! msgstr "contraintes de sortie cc multiples non supportées"
  
  #: stmt.cc:418
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "invalid cc output constraint: %qs"
  msgid "invalid output constraint: %s"
! msgstr "contrainte de sortie cc invalide : %qs"
  
  #: stmt.cc:426 stmt.cc:498
  #, gcc-internal-format, gfc-internal-format
  msgid "multiple outputs to hard register: %s"
! msgstr ""
  
  #: stmt.cc:435
! #, fuzzy, gcc-internal-format
! #| msgid "%<asm%> specifier for cc output conflicts with %<asm%> clobber list"
  msgid "hard register constraint for output %i conflicts with %<asm%> clobber list"
! msgstr "le spécificateur %<asm%> pour la sortie de cc est en conflit avec la liste d'écrasement de %<asm%>"
  
  #: stmt.cc:447
  #, gcc-internal-format
  msgid "constraint and register %<asm%> for output operand %i are unsatisfiable"
! msgstr ""
  
  #: stmt.cc:491 stmt.cc:748 varasm.cc:1558
  #, gcc-internal-format
--- 32227,32265 ----
  msgstr "contrainte %<:%> utilisée pour l'opérande de sortie"
  
  #: stmt.cc:395 stmt.cc:642
! #, gcc-internal-format
  msgid "hard register constraints are only supported while using LRA"
! msgstr "les contraintes de registres matériels sont uniquement supportées en utilisant LRA"
  
  #: stmt.cc:403 stmt.cc:470 stmt.cc:650 stmt.cc:725
  #, gcc-internal-format
  msgid "hard register constraints and regular register constraints in one alternative are not supported"
! msgstr "les contraintes de registres matériels et les contraintes des registres régulier dans une alternative ne sont pas supportées"
  
  #: stmt.cc:410 stmt.cc:657
! #, gcc-internal-format
  msgid "multiple hard register constraints in one alternative are not supported"
! msgstr "plusieurs contraintes de registres matériels dans une alternative ne sont pas supportées"
  
  #: stmt.cc:418
! #, gcc-internal-format, gfc-internal-format
  msgid "invalid output constraint: %s"
! msgstr "contrainte de sortie invalide : %s"
  
  #: stmt.cc:426 stmt.cc:498
  #, gcc-internal-format, gfc-internal-format
  msgid "multiple outputs to hard register: %s"
! msgstr "plusieurs sorties vers des registres matériels : %s"
  
  #: stmt.cc:435
! #, gcc-internal-format
  msgid "hard register constraint for output %i conflicts with %<asm%> clobber list"
! msgstr "la contrainte de registre matériel pour la sortie %i est en conflit avec la liste d'écrasement de %<asm%>"
  
  #: stmt.cc:447
  #, gcc-internal-format
  msgid "constraint and register %<asm%> for output operand %i are unsatisfiable"
! msgstr "la contrainte et le registre %<asm%> pour la sortie de l'opérande %i sont impossibles à satisfaire"
  
  #: stmt.cc:491 stmt.cc:748 varasm.cc:1558
  #, gcc-internal-format
*************** msgid "matching constraint references in
*** 32375,32400 ****
  msgstr "la contrainte correspondante fait référence à un numéro d'opérande invalide"
  
  #: stmt.cc:665
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "invalid cc output constraint: %qs"
  msgid "invalid input constraint: %s"
! msgstr "contrainte de sortie cc invalide : %qs"
  
  #: stmt.cc:673 stmt.cc:755
  #, gcc-internal-format, gfc-internal-format
  msgid "multiple inputs to hard register: %s"
! msgstr ""
  
  #: stmt.cc:680
! #, fuzzy, gcc-internal-format
! #| msgid "%<asm%> specifier for cc output conflicts with %<asm%> clobber list"
  msgid "hard register constraint for input %i conflicts with %<asm%> clobber list"
! msgstr "le spécificateur %<asm%> pour la sortie de cc est en conflit avec la liste d'écrasement de %<asm%>"
  
  #: stmt.cc:699
  #, gcc-internal-format
  msgid "constraint and register %<asm%> for input operand %i are unsatisfiable"
! msgstr ""
  
  #: stmt.cc:715
  #, gcc-internal-format
--- 32282,32305 ----
  msgstr "la contrainte correspondante fait référence à un numéro d'opérande invalide"
  
  #: stmt.cc:665
! #, gcc-internal-format, gfc-internal-format
  msgid "invalid input constraint: %s"
! msgstr "contrainte d'entrée invalide : %s"
  
  #: stmt.cc:673 stmt.cc:755
  #, gcc-internal-format, gfc-internal-format
  msgid "multiple inputs to hard register: %s"
! msgstr "plusieurs entrées à un registre matériel : %s"
  
  #: stmt.cc:680
! #, gcc-internal-format
  msgid "hard register constraint for input %i conflicts with %<asm%> clobber list"
! msgstr "la contrainte de registre matériel pour l'entrée %i est en conflit avec la liste d'écrasement de %<asm%>"
  
  #: stmt.cc:699
  #, gcc-internal-format
  msgid "constraint and register %<asm%> for input operand %i are unsatisfiable"
! msgstr "la contrainte et le registre %<asm%> pour l'entrée de l'opérande %i ne peuvent pas être satisfaites"
  
  #: stmt.cc:715
  #, gcc-internal-format
*************** msgid "%qs should be from a scalar to a
*** 33323,33332 ****
  msgstr "%qs devrait provenir d'un scalaire vers un vecteur similaire"
  
  #: tree-cfg.cc:3789
! #, fuzzy, gcc-internal-format
! #| msgid "invalid types for %qs"
  msgid "invalid type for %qs"
! msgstr "types invalides pour %qs"
  
  #: tree-cfg.cc:3813
  #, gcc-internal-format
--- 33228,33236 ----
  msgstr "%qs devrait provenir d'un scalaire vers un vecteur similaire"
  
  #: tree-cfg.cc:3789
! #, gcc-internal-format
  msgid "invalid type for %qs"
! msgstr "type invalide pour %qs"
  
  #: tree-cfg.cc:3813
  #, gcc-internal-format
*************** msgid "non-trivial conversion in %qs"
*** 33424,33433 ****
  msgstr "conversion non triviale dans %qs"
  
  #: tree-cfg.cc:4519
! #, fuzzy, gcc-internal-format
! #| msgid "invalid cpu %qs for %s%qs%s"
  msgid "invalid LHS (%qs) for assignment: %qs"
! msgstr "processeur %qs invalide pour %s\"%s\"%s"
  
  #: tree-cfg.cc:4527
  #, gcc-internal-format
--- 33328,33336 ----
  msgstr "conversion non triviale dans %qs"
  
  #: tree-cfg.cc:4519
! #, gcc-internal-format
  msgid "invalid LHS (%qs) for assignment: %qs"
! msgstr "membre de gauche (%qs) invalide pour l'affectation : %qs"
  
  #: tree-cfg.cc:4527
  #, gcc-internal-format
*************** msgid "invalid RHS for gimple memory sto
*** 33455,33464 ****
  msgstr "membre de droite invalide pour un stockage mémoire gimple : %qs"
  
  #: tree-cfg.cc:4648
! #, fuzzy, gcc-internal-format
! #| msgid "non-register as LHS of ternary operation"
  msgid "non-register as LHS with vector constructor"
! msgstr "non registre comme membre de gauche dans une opération ternaire"
  
  #: tree-cfg.cc:4670 tree-cfg.cc:4688
  #, gcc-internal-format
--- 33358,33366 ----
  msgstr "membre de droite invalide pour un stockage mémoire gimple : %qs"
  
  #: tree-cfg.cc:4648
! #, gcc-internal-format
  msgid "non-register as LHS with vector constructor"
! msgstr "non registre comme membre de gauche dans un constructeur vectoriel"
  
  #: tree-cfg.cc:4670 tree-cfg.cc:4688
  #, gcc-internal-format
*************** msgid "probability of edge from entry bl
*** 33696,33705 ****
  msgstr "la probabilité de l'arête depuis le bloc d'entrée n'est pas initialisée"
  
  #: tree-cfg.cc:5662
! #, fuzzy, gcc-internal-format
! #| msgid "edge count is not compatible with function count"
  msgid "exit block count is not compatible with entry block count"
! msgstr "le décompte d'arêtes n'est pas compatible avec le décompte de fonction"
  
  #: tree-cfg.cc:5677
  #, gcc-internal-format, gfc-internal-format
--- 33598,33606 ----
  msgstr "la probabilité de l'arête depuis le bloc d'entrée n'est pas initialisée"
  
  #: tree-cfg.cc:5662
! #, gcc-internal-format
  msgid "exit block count is not compatible with entry block count"
! msgstr "le décompte du bloc de sortie n'est pas compatible avec le décompte du bloc d'entrée"
  
  #: tree-cfg.cc:5677
  #, gcc-internal-format, gfc-internal-format
*************** msgid "probability of edge %d->%d not in
*** 33712,33721 ****
  msgstr "la probabilité de l'arête %d->%d n'est pas initialisée"
  
  #: tree-cfg.cc:5690
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "edge count is not compatible with function count"
  msgid "count of bb %d is not compatible with entry block count"
! msgstr "le décompte d'arêtes n'est pas compatible avec le décompte de fonction"
  
  #: tree-cfg.cc:5709
  #, gcc-internal-format
--- 33613,33621 ----
  msgstr "la probabilité de l'arête %d->%d n'est pas initialisée"
  
  #: tree-cfg.cc:5690
! #, gcc-internal-format, gfc-internal-format
  msgid "count of bb %d is not compatible with entry block count"
! msgstr "le décompte du bloc de base %d n'est pas compatible avec le décompte du bloc d'entrée"
  
  #: tree-cfg.cc:5709
  #, gcc-internal-format
*************** msgstr "expression régulière %qs inval
*** 33989,33998 ****
  
  # « single » signifie que le profilage est mis à jour comme si l'application n'avait qu'un seul thread
  #: tree-profile.cc:1855
! #, fuzzy, gcc-internal-format
! #| msgid "target does not support atomic profile update, single mode is selected"
  msgid "target does not fully support atomic profile update, single mode is selected with partial atomic updates"
! msgstr "la cible ne supporte pas la mise à jour atomique du profilage, le mode simple est sélectionné"
  
  # « single » signifie que le profilage est mis à jour comme si l'application n'avait qu'un seul thread
  #: tree-profile.cc:1861
--- 33889,33897 ----
  
  # « single » signifie que le profilage est mis à jour comme si l'application n'avait qu'un seul thread
  #: tree-profile.cc:1855
! #, gcc-internal-format
  msgid "target does not fully support atomic profile update, single mode is selected with partial atomic updates"
! msgstr "la cible ne supporte pas complètement la mise à jour atomique du profilage, le mode simple est sélectionné avec mises à jour atomiques partielles"
  
  # « single » signifie que le profilage est mis à jour comme si l'application n'avait qu'un seul thread
  #: tree-profile.cc:1861
*************** msgid "in a call to function %qD declare
*** 34036,34045 ****
  msgstr "dans un appel à la fonction %qD déclarée %qs"
  
  #: tree-ssa-ccp.cc:3257 c-family/c-common.cc:6138
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "argument %u null where non-null expected because argument %u is nonzero"
  msgid "argument %u null where non-null expected because arguments %u and %u are nonzero"
! msgstr "argument %u nul où un non-nul est attendu car l'argument %u est non nul"
  
  #: tree-ssa-ccp.cc:3263 c-family/c-common.cc:6149
  #, gcc-internal-format, gfc-internal-format
--- 33935,33943 ----
  msgstr "dans un appel à la fonction %qD déclarée %qs"
  
  #: tree-ssa-ccp.cc:3257 c-family/c-common.cc:6138
! #, gcc-internal-format, gfc-internal-format
  msgid "argument %u null where non-null expected because arguments %u and %u are nonzero"
! msgstr "argument %u nul où un non-nul est attendu car les arguments %u et %u sont non zéro"
  
  #: tree-ssa-ccp.cc:3263 c-family/c-common.cc:6149
  #, gcc-internal-format, gfc-internal-format
*************** msgid "%<TYPE_MODE%> of %<TYPE_CANONICAL
*** 34811,34820 ****
  msgstr "le %<TYPE_MODE%> de %<TYPE_CANONICAL%> n'est pas compatible"
  
  #: tree.cc:14494
! #, fuzzy, gcc-internal-format
! #| msgid "%<TYPE_CANONICAL%> of main variant is not main variant"
  msgid "main variant of %<TYPE_CANONICAL%> of main variant is not its own %<TYPE_CANONICAL%>"
! msgstr "le %<TYPE_CANONICAL%> de la variante principale n'est pas la variante principale"
  
  #: tree.cc:14512
  #, gcc-internal-format
--- 34709,34717 ----
  msgstr "le %<TYPE_MODE%> de %<TYPE_CANONICAL%> n'est pas compatible"
  
  #: tree.cc:14494
! #, gcc-internal-format
  msgid "main variant of %<TYPE_CANONICAL%> of main variant is not its own %<TYPE_CANONICAL%>"
! msgstr "la variante principale de %<TYPE_CANONICAL%> de la variante principale n'est pas son propre %<TYPE_CANONICAL%>"
  
  #: tree.cc:14512
  #, gcc-internal-format
*************** msgid "previous declaration of %qD"
*** 34949,34971 ****
  msgstr "déclaration précédente de %qD"
  
  #: tree.cc:15784
! #, fuzzy, gcc-internal-format
! #| msgid "%q#D conflicts with a previous declaration"
  msgid "%qD conflicts with overlapping %<target_clone%> declaration"
! msgstr "%q#D entre en conflit avec une déclaration précédente"
  
  # ce message apparaît juste après le %q#D ci-dessus
  #: tree.cc:15803
- #, fuzzy
- #| msgid "%q#D conflicts with version inherited from %qT"
  msgid "%qD conflicts for version %qB"
! msgstr "%q#D est en conflit avec la version héritée de %qT"
  
  #: tree.cc:15816
- #, fuzzy
- #| msgid "%q#D conflicts with a previous declaration"
  msgid "%qD conflicts with a previous declaration for version %qB"
! msgstr "%q#D entre en conflit avec une déclaration précédente"
  
  #: tsan.cc:509
  #, gcc-internal-format
--- 34846,34863 ----
  msgstr "déclaration précédente de %qD"
  
  #: tree.cc:15784
! #, gcc-internal-format
  msgid "%qD conflicts with overlapping %<target_clone%> declaration"
! msgstr "%qD entre en conflit avec une déclaration %<target_clone%> qui le chevauche"
  
  # ce message apparaît juste après le %q#D ci-dessus
  #: tree.cc:15803
  msgid "%qD conflicts for version %qB"
! msgstr "%qD est en conflit pour la version %qB"
  
  #: tree.cc:15816
  msgid "%qD conflicts with a previous declaration for version %qB"
! msgstr "%qD entre en conflit avec une déclaration précédente pour la version %qB"
  
  #: tsan.cc:509
  #, gcc-internal-format
*************** msgid "%qE attribute is not allowed for
*** 35580,35589 ****
  msgstr "l'attribut %qE n'est pas permis pour une déclaration qui n'est pas un champ %q+D"
  
  #: c-family/c-attribs.cc:2959
! #, fuzzy, gcc-internal-format
! #| msgid "%qE attribute is not allowed for a non-array field"
  msgid "%qE attribute is not allowed for a non-array or non-pointer field"
! msgstr "l'attribut %qE n'est pas autorisé pour un champ qui n'est pas un tableau"
  
  #: c-family/c-attribs.cc:2968
  #, gcc-internal-format
--- 35472,35480 ----
  msgstr "l'attribut %qE n'est pas permis pour une déclaration qui n'est pas un champ %q+D"
  
  #: c-family/c-attribs.cc:2959
! #, gcc-internal-format
  msgid "%qE attribute is not allowed for a non-array or non-pointer field"
! msgstr "l'attribut %qE n'est pas autorisé pour un champ qui n'est pas un tableau ou un non-pointeur"
  
  #: c-family/c-attribs.cc:2968
  #, gcc-internal-format
*************** msgid "%qE attribute is not allowed for
*** 35591,35612 ****
  msgstr "l'attribut %qE n'est pas autorisé pour un champ qui n'est pas un membre d'un tableau flexible"
  
  #: c-family/c-attribs.cc:2980
! #, fuzzy, gcc-internal-format
! #| msgid "%qE attribute is for pointer types only"
  msgid "%qE attribute is used for a pointer to void"
! msgstr "l'attribut %qE est uniquement pour des types pointeurs"
  
  #: c-family/c-attribs.cc:2988
! #, fuzzy, gcc-internal-format
! #| msgid "%qE attribute is not allowed for a non-array field"
  msgid "%qE attribute is not allowed for a pointer to function"
! msgstr "l'attribut %qE n'est pas autorisé pour un champ qui n'est pas un tableau"
  
  #: c-family/c-attribs.cc:2999
! #, fuzzy, gcc-internal-format
! #| msgid "%qE attribute is not allowed for a non-flexible array member field"
  msgid "%qE attribute is not allowed for a pointer to structure or union with flexible array member"
! msgstr "l'attribut %qE n'est pas autorisé pour un champ qui n'est pas un membre d'un tableau flexible"
  
  #: c-family/c-attribs.cc:3007
  #, gcc-internal-format
--- 35482,35500 ----
  msgstr "l'attribut %qE n'est pas autorisé pour un champ qui n'est pas un membre d'un tableau flexible"
  
  #: c-family/c-attribs.cc:2980
! #, gcc-internal-format
  msgid "%qE attribute is used for a pointer to void"
! msgstr "l'attribut %qE est utilisé pour un pointeur vers void"
  
  #: c-family/c-attribs.cc:2988
! #, gcc-internal-format
  msgid "%qE attribute is not allowed for a pointer to function"
! msgstr "l'attribut %qE n'est pas autorisé pour un pointeur vers une fonction"
  
  #: c-family/c-attribs.cc:2999
! #, gcc-internal-format
  msgid "%qE attribute is not allowed for a pointer to structure or union with flexible array member"
! msgstr "l'attribut %qE n'est pas autorisé pour un pointeur vers une structure ou une union avec un membre tableau flexible"
  
  #: c-family/c-attribs.cc:3007
  #, gcc-internal-format
*************** msgid "%qE attribute requires a string a
*** 36026,36035 ****
  msgstr "l'attribut %qE requiert une chaîne comme argument"
  
  #: c-family/c-attribs.cc:5215
! #, fuzzy, gcc-internal-format
! #| msgid "unrecognized interrupt vector argument of %qE attribute"
  msgid "unsupported wide string type argument in %qE attribute"
! msgstr "argument de vecteur d'interruption non reconnu pour l'attribut %qE"
  
  #: c-family/c-attribs.cc:5249 c-family/c-attribs.cc:5331
  #, gcc-internal-format
--- 35914,35922 ----
  msgstr "l'attribut %qE requiert une chaîne comme argument"
  
  #: c-family/c-attribs.cc:5215
! #, gcc-internal-format
  msgid "unsupported wide string type argument in %qE attribute"
! msgstr "argument de type chaîne large n'est pas supporté dans l'attribut %qE"
  
  #: c-family/c-attribs.cc:5249 c-family/c-attribs.cc:5331
  #, gcc-internal-format
*************** msgid "%<__alignof%> applied to a bit-fi
*** 36498,36537 ****
  msgstr "%<__alignof%> appliqué sur un champ de bits"
  
  #: c-family/c-common.cc:4150
! #, fuzzy, gcc-internal-format
! #| msgid "invalid application of %qs to incomplete type %qT"
  msgid "invalid application of %<_Countof%> to type %qT"
! msgstr "utilisation invalide de %qs sur le type incomplet %qT"
  
  #: c-family/c-common.cc:4156
! #, fuzzy, gcc-internal-format
! #| msgid "invalid application of %qs to incomplete type %qT"
  msgid "invalid application of %<_Countof%> to incomplete type %qT"
! msgstr "utilisation invalide de %qs sur le type incomplet %qT"
  
  #: c-family/c-common.cc:4177
! #, fuzzy, gcc-internal-format
! #| msgid "invalid application of %<__alignof%> to a bit-field"
  msgid "invalid application of %<_Maxof%> to type %qT"
! msgstr "application invalide de %<__alignof%> sur un champ de bits"
  
  #: c-family/c-common.cc:4182
! #, fuzzy, gcc-internal-format
! #| msgid "invalid application of %qs to incomplete type %qT"
  msgid "invalid application of %<_Maxof%> to incomplete type %qT"
! msgstr "utilisation invalide de %qs sur le type incomplet %qT"
  
  #: c-family/c-common.cc:4198
! #, fuzzy, gcc-internal-format
! #| msgid "invalid application of %<__alignof%> to a bit-field"
  msgid "invalid application of %<_Minof%> to type %qT"
! msgstr "application invalide de %<__alignof%> sur un champ de bits"
  
  #: c-family/c-common.cc:4203
! #, fuzzy, gcc-internal-format
! #| msgid "invalid application of %qs to incomplete type %qT"
  msgid "invalid application of %<_Minof%> to incomplete type %qT"
! msgstr "utilisation invalide de %qs sur le type incomplet %qT"
  
  #: c-family/c-common.cc:5005
  #, gcc-internal-format
--- 36385,36418 ----
  msgstr "%<__alignof%> appliqué sur un champ de bits"
  
  #: c-family/c-common.cc:4150
! #, gcc-internal-format
  msgid "invalid application of %<_Countof%> to type %qT"
! msgstr "utilisation invalide de %<_Countof%> sur le type %qT"
  
  #: c-family/c-common.cc:4156
! #, gcc-internal-format
  msgid "invalid application of %<_Countof%> to incomplete type %qT"
! msgstr "utilisation invalide de %<_Countof%> sur le type incomplet %qT"
  
  #: c-family/c-common.cc:4177
! #, gcc-internal-format
  msgid "invalid application of %<_Maxof%> to type %qT"
! msgstr "application invalide de %<_Maxof%> sur le type %qT"
  
  #: c-family/c-common.cc:4182
! #, gcc-internal-format
  msgid "invalid application of %<_Maxof%> to incomplete type %qT"
! msgstr "utilisation invalide de %<_Maxof%> sur le type incomplet %qT"
  
  #: c-family/c-common.cc:4198
! #, gcc-internal-format
  msgid "invalid application of %<_Minof%> to type %qT"
! msgstr "application invalide de %<_Minof%> sur le type %qT"
  
  #: c-family/c-common.cc:4203
! #, gcc-internal-format
  msgid "invalid application of %<_Minof%> to incomplete type %qT"
! msgstr "utilisation invalide de %<_Minof%> sur le type incomplet %qT"
  
  #: c-family/c-common.cc:5005
  #, gcc-internal-format
*************** msgid "%qE is a member of a union"
*** 37864,37873 ****
  msgstr "%qE est un membre d'une union"
  
  #: c-family/c-omp.cc:4357 c-family/c-omp.cc:4478 c-family/c-omp.cc:4572
! #, fuzzy, gcc-internal-format
! #| msgid "%qE is not of type %qT"
  msgid "mapper %qE not found for type %qT"
! msgstr "%qE n'est pas un type %qT"
  
  #: c-family/c-opts.cc:348
  #, gcc-internal-format
--- 37745,37753 ----
  msgstr "%qE est un membre d'une union"
  
  #: c-family/c-omp.cc:4357 c-family/c-omp.cc:4478 c-family/c-omp.cc:4572
! #, gcc-internal-format
  msgid "mapper %qE not found for type %qT"
! msgstr "mappeur %qE pas trouvé pour le type %qT"
  
  #: c-family/c-opts.cc:348
  #, gcc-internal-format
*************** msgid "Should use \"%c\" to contact Prof
*** 39695,39704 ****
  msgstr ""
  
  #: common/config/riscv/riscv-common.cc:959
! #, fuzzy, gcc-internal-format
! #| msgid "%<-march=%s%>: ISA string must begin with rv32 or rv64"
  msgid "%<-march=%s%>: ISA string must begin with rv32, rv64, a supported RVA profile or refer to a supported CPU"
! msgstr "%<-march=%s%>: la chaîne ISA doit commencer par rv32 ou rv64"
  
  #: common/config/riscv/riscv-common.cc:985
  #, gcc-internal-format
--- 39575,39583 ----
  msgstr ""
  
  #: common/config/riscv/riscv-common.cc:959
! #, gcc-internal-format
  msgid "%<-march=%s%>: ISA string must begin with rv32, rv64, a supported RVA profile or refer to a supported CPU"
! msgstr "%<-march=%s%>: la chaîne ISA doit commencer par rv32, rv64, un profil RVA supporté ou faire référence à un CPU supporté"
  
  #: common/config/riscv/riscv-common.cc:985
  #, gcc-internal-format
*************** msgid "%<-march=%s%>: zcf extension supp
*** 39726,39771 ****
  msgstr "%<-march=%s%>: l'extension zcf est uniquement supportée dans rv32"
  
  #: common/config/riscv/riscv-common.cc:1156
! #, fuzzy, gcc-internal-format
! #| msgid "%<-march=%s%>: zcf extension supports in rv32 only"
  msgid "%<-march=%s%>: zilsd extension supports in rv32 only"
! msgstr "%<-march=%s%>: l'extension zcf est uniquement supportée dans rv32"
  
  #: common/config/riscv/riscv-common.cc:1160
! #, fuzzy, gcc-internal-format
! #| msgid "%<-march=%s%>: zcf extension supports in rv32 only"
  msgid "%<-march=%s%>: zclsd extension supports in rv32 only"
! msgstr "%<-march=%s%>: l'extension zcf est uniquement supportée dans rv32"
  
  #: common/config/riscv/riscv-common.cc:1164
! #, fuzzy, gcc-internal-format
! #| msgid "%<-march=%s%>: zcf extension supports in rv32 only"
  msgid "%<-march=%s%>: ssnpm extension supports in rv64 only"
! msgstr "%<-march=%s%>: l'extension zcf est uniquement supportée dans rv32"
  
  #: common/config/riscv/riscv-common.cc:1168
! #, fuzzy, gcc-internal-format
! #| msgid "%<-march=%s%>: zcf extension supports in rv32 only"
  msgid "%<-march=%s%>: smnpm extension supports in rv64 only"
! msgstr "%<-march=%s%>: l'extension zcf est uniquement supportée dans rv32"
  
  #: common/config/riscv/riscv-common.cc:1172
! #, fuzzy, gcc-internal-format
! #| msgid "%<-march=%s%>: zcf extension supports in rv32 only"
  msgid "%<-march=%s%>: smmpm extension supports in rv64 only"
! msgstr "%<-march=%s%>: l'extension zcf est uniquement supportée dans rv32"
  
  #: common/config/riscv/riscv-common.cc:1176
! #, fuzzy, gcc-internal-format
! #| msgid "%<-march=%s%>: zcf extension supports in rv32 only"
  msgid "%<-march=%s%>: sspm extension supports in rv64 only"
! msgstr "%<-march=%s%>: l'extension zcf est uniquement supportée dans rv32"
  
  #: common/config/riscv/riscv-common.cc:1180
! #, fuzzy, gcc-internal-format
! #| msgid "%<-march=%s%>: zcf extension supports in rv32 only"
  msgid "%<-march=%s%>: supm extension supports in rv64 only"
! msgstr "%<-march=%s%>: l'extension zcf est uniquement supportée dans rv32"
  
  #: common/config/riscv/riscv-common.cc:1185
  #, gcc-internal-format
--- 39605,39643 ----
  msgstr "%<-march=%s%>: l'extension zcf est uniquement supportée dans rv32"
  
  #: common/config/riscv/riscv-common.cc:1156
! #, gcc-internal-format
  msgid "%<-march=%s%>: zilsd extension supports in rv32 only"
! msgstr "%<-march=%s%>: l'extension zilsd est uniquement supportée dans rv32"
  
  #: common/config/riscv/riscv-common.cc:1160
! #, gcc-internal-format
  msgid "%<-march=%s%>: zclsd extension supports in rv32 only"
! msgstr "%<-march=%s%>: l'extension zclsd est uniquement supportée dans rv32"
  
  #: common/config/riscv/riscv-common.cc:1164
! #, gcc-internal-format
  msgid "%<-march=%s%>: ssnpm extension supports in rv64 only"
! msgstr "%<-march=%s%>: l'extension ssnpm est uniquement supportée dans rv64"
  
  #: common/config/riscv/riscv-common.cc:1168
! #, gcc-internal-format
  msgid "%<-march=%s%>: smnpm extension supports in rv64 only"
! msgstr "%<-march=%s%>: l'extension smnpm est uniquement supportée dans rv64"
  
  #: common/config/riscv/riscv-common.cc:1172
! #, gcc-internal-format
  msgid "%<-march=%s%>: smmpm extension supports in rv64 only"
! msgstr "%<-march=%s%>: l'extension smmpm est uniquement supportée dans rv64"
  
  #: common/config/riscv/riscv-common.cc:1176
! #, gcc-internal-format
  msgid "%<-march=%s%>: sspm extension supports in rv64 only"
! msgstr "%<-march=%s%>: l'extension sspm est uniquement supportée dans rv64"
  
  #: common/config/riscv/riscv-common.cc:1180
! #, gcc-internal-format
  msgid "%<-march=%s%>: supm extension supports in rv64 only"
! msgstr "%<-march=%s%>: l'extension supm est uniquement supportée dans rv64"
  
  #: common/config/riscv/riscv-common.cc:1185
  #, gcc-internal-format
*************** msgstr "option %qs inconnue pour %<#prag
*** 40254,40436 ****
  #: config/aarch64/aarch64-json-tunings-parser.cc:122
  #, gcc-internal-format
  msgid "static storage conflict - multiple pointer members of the same type cannot be parsed"
! msgstr ""
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:139
  #, gcc-internal-format
  msgid "expected a string but got something else or NULL"
! msgstr ""
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:153
! #, fuzzy, gcc-internal-format
! #| msgid "expected a JSON value but got %s"
  msgid "expected an integer value but got something else or NULL"
! msgstr "une valeur JSOn était attendue mais on a reçu %s"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:168
  #, gcc-internal-format
  msgid "expected an unsigned integer value but got something else or NULL"
! msgstr ""
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:182
! #, fuzzy, gcc-internal-format
! #| msgid "expected a JSON value but got %s"
  msgid "expected a boolean value but got something else or NULL"
! msgstr "une valeur JSOn était attendue mais on a reçu %s"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:206
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "expected string literal"
  msgid "expected string for enum field %s"
! msgstr "chaîne littérale attendue"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:221
! #, fuzzy, gcc-internal-format
! #| msgid "unrecognized argument in option %qs"
  msgid "%s not recognized, defaulting to %qs"
! msgstr "argument non reconnu pour l'option %qs"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:246
! #, fuzzy, gcc-internal-format
! #| msgid "type %qs is not an expression"
  msgid "key %qs is not a tuning parameter, skipping"
! msgstr "le type %qs n'est pas une expression"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:261
! #, fuzzy, gcc-internal-format
! #| msgid "expected an SSA_NAME object"
  msgid "key %qs expected to be an object"
! msgstr "un objet SSA_NAME était attendu"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:269
  #, gcc-internal-format
  msgid "key %qs expected to be an array"
! msgstr ""
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:282
! #, fuzzy, gcc-internal-format
! #| msgid "expected integer"
  msgid "key %qs expected to be an integer"
! msgstr "entier attendu"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:293
  #, gcc-internal-format
  msgid "key %qs value %ld is out of range for %<int%> type [%d, %d]"
! msgstr ""
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:304
! #, fuzzy, gcc-internal-format
! #| msgid "argument %d must be an unsigned literal"
  msgid "key %qs expected to be an unsigned integer"
! msgstr "l'argument %d doit être un littéral non signé"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:315
  #, gcc-internal-format
  msgid "key %qs value %ld is out of range for %<uint%> type [0, %u]"
! msgstr ""
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:326
! #, fuzzy, gcc-internal-format
! #| msgid "Expected real string"
  msgid "key %qs expected to be a string"
! msgstr "Chaîne contenant un réel attendue"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:335
  #, gcc-internal-format
  msgid "key %qs expected to be a boolean (true/false)"
! msgstr ""
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:344
  #, gcc-internal-format
  msgid "key %qs expected to be an enum (string)"
! msgstr ""
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:351
! #, fuzzy, gcc-internal-format
! #| msgid "name %qT has incomplete type"
  msgid "key %qs has unsupported type"
! msgstr "le nom %qT a un type incomplet"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:357
  #, gcc-internal-format
  msgid "key %qs has unexpected format in schema"
! msgstr ""
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:371
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "could not open response file %s"
  msgid "could not open file %s"
! msgstr "n'a pu ouvrir le fichier de réponse %s"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:383
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "error writing %qs"
  msgid "error reading file %s"
! msgstr "erreur d'écriture dans %qs"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:415
  #, gcc-internal-format
  msgid "JSON tuning file does not contain version information; compatibility cannot be verified"
! msgstr ""
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:422
  #, gcc-internal-format, gfc-internal-format
  msgid "JSON tuning file was created with GCC version %d but current GCC version is %d"
! msgstr ""
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:425
  #, gcc-internal-format
  msgid "JSON tuning files must be regenerated when switching between major GCC versions"
! msgstr ""
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:446
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Error writing JSON output file %s\n"
  msgid "error parsing JSON data: %s"
! msgstr "Erreur d’écriture dans le fichier JSON de sortie %s\n"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:453
  #, gcc-internal-format
  msgid "JSON parsing returned null data"
! msgstr ""
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:459
  #, gcc-internal-format
  msgid "no JSON object found in the provided data"
! msgstr ""
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:481
  #, gcc-internal-format
  msgid "key %<tune_params%> not found in JSON data"
! msgstr ""
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:488
! #, fuzzy, gcc-internal-format
! #| msgid "invalid embedcfg: Patterns is not a JSON object"
  msgid "key %<tune_params%> is not a JSON object"
! msgstr "embedcfg invalide : Patterns n'est pas un objet JSON"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:494
  #, gcc-internal-format
  msgid "validation failed for the provided JSON data"
! msgstr ""
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:507
  #, gcc-internal-format
  msgid "JSON tuning enables dispatch scheduling but %<dispatch_constraints%> is not available; disabling dispatch scheduling"
! msgstr ""
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:524
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "cannot read LTO mode table from %s"
  msgid "cannot read JSON data in %s"
! msgstr "impossible de lire la table des modes LTO dans %s"
  
  #: config/aarch64/aarch64-json-tunings-printer.cc:139
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Cannot open file %qs"
  msgid "Error opening file %s"
! msgstr "Ne peut ouvrir le fichier %qs"
  
  #: config/aarch64/aarch64-sve-builtins.cc:1754
  #, gcc-internal-format
--- 40126,40292 ----
  #: config/aarch64/aarch64-json-tunings-parser.cc:122
  #, gcc-internal-format
  msgid "static storage conflict - multiple pointer members of the same type cannot be parsed"
! msgstr "conflit de stockage statique - plusieurs membres pointeurs du même type ne peuvent pas être analysés"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:139
  #, gcc-internal-format
  msgid "expected a string but got something else or NULL"
! msgstr "une chaîne est attendue mais on a obtenu autre chose ou NULL"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:153
! #, gcc-internal-format
  msgid "expected an integer value but got something else or NULL"
! msgstr "une valeur entière était attendue mais on a reçu autre chose ou NULL"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:168
  #, gcc-internal-format
  msgid "expected an unsigned integer value but got something else or NULL"
! msgstr "une valeur entière non signée était attendue mais on a obtenu autre chose ou NULL"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:182
! #, gcc-internal-format
  msgid "expected a boolean value but got something else or NULL"
! msgstr "une valeur booléenne était attendue mais on a reçu autre chose ou NULL"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:206
! #, gcc-internal-format, gfc-internal-format
  msgid "expected string for enum field %s"
! msgstr "chaîne attendue pour le champ enum %s"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:221
! #, gcc-internal-format
  msgid "%s not recognized, defaulting to %qs"
! msgstr "%s non reconnu, utilise %qs par défaut"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:246
! #, gcc-internal-format
  msgid "key %qs is not a tuning parameter, skipping"
! msgstr "la clé %qs n'est pas un paramètre de réglage, ignoré"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:261
! #, gcc-internal-format
  msgid "key %qs expected to be an object"
! msgstr "la clé %qs aurait dû être un objet"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:269
  #, gcc-internal-format
  msgid "key %qs expected to be an array"
! msgstr "la clé %qs aurait dû être un tableau"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:282
! #, gcc-internal-format
  msgid "key %qs expected to be an integer"
! msgstr "la clé %qs aurait dû être un entier"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:293
  #, gcc-internal-format
  msgid "key %qs value %ld is out of range for %<int%> type [%d, %d]"
! msgstr "la clé %qs a la valeur %ld qui est en dehors de la plage d'un type %<int%> [%d, %d]"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:304
! #, gcc-internal-format
  msgid "key %qs expected to be an unsigned integer"
! msgstr "la clé %qs aurait dû être un entier non signé"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:315
  #, gcc-internal-format
  msgid "key %qs value %ld is out of range for %<uint%> type [0, %u]"
! msgstr "la clé %qs a la valeur %ld qui est en dehors de la plage d'un type %<uint%> [0, %u]"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:326
! #, gcc-internal-format
  msgid "key %qs expected to be a string"
! msgstr "la clé %qs aurait dû être une chaîne"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:335
  #, gcc-internal-format
  msgid "key %qs expected to be a boolean (true/false)"
! msgstr "la clé %qs aurait dû être un booléen (vrai/faux)"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:344
  #, gcc-internal-format
  msgid "key %qs expected to be an enum (string)"
! msgstr "la clé %qs aurait dû être une énumération (chaîne)"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:351
! #, gcc-internal-format
  msgid "key %qs has unsupported type"
! msgstr "la clé %qs a un type non supporté"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:357
  #, gcc-internal-format
  msgid "key %qs has unexpected format in schema"
! msgstr "la clé %qs a un format inattendu dans le schéma"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:371
! #, gcc-internal-format, gfc-internal-format
  msgid "could not open file %s"
! msgstr "n'a pu ouvrir le fichier %s"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:383
! #, gcc-internal-format, gfc-internal-format
  msgid "error reading file %s"
! msgstr "erreur de lecture du fichier %s"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:415
  #, gcc-internal-format
  msgid "JSON tuning file does not contain version information; compatibility cannot be verified"
! msgstr "le fichier de réglages JSON ne contient pas d'information de version ; la compatibilité ne sait pas être vérifiée"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:422
  #, gcc-internal-format, gfc-internal-format
  msgid "JSON tuning file was created with GCC version %d but current GCC version is %d"
! msgstr "le fichier de réglages JSON a été créé avec GCC version %d mais la version actuelle est GCC version %d"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:425
  #, gcc-internal-format
  msgid "JSON tuning files must be regenerated when switching between major GCC versions"
! msgstr "le fichier de réglages JSON doit être recréé lors du changement de la version majeure de GCC"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:446
! #, gcc-internal-format, gfc-internal-format
  msgid "error parsing JSON data: %s"
! msgstr "erreur d'analyse des données JSON : %s"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:453
  #, gcc-internal-format
  msgid "JSON parsing returned null data"
! msgstr "l'analyse JSON a retourné une donnée nulle"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:459
  #, gcc-internal-format
  msgid "no JSON object found in the provided data"
! msgstr "aucun objet JSON trouvé dans les données fournies"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:481
  #, gcc-internal-format
  msgid "key %<tune_params%> not found in JSON data"
! msgstr "clé %<tune_params%> non trouvée dans les données JSON"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:488
! #, gcc-internal-format
  msgid "key %<tune_params%> is not a JSON object"
! msgstr "la clé %<tune_params%> n'est pas un objet JSON"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:494
  #, gcc-internal-format
  msgid "validation failed for the provided JSON data"
! msgstr "la validation a échoué pour les données JSON fournies"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:507
  #, gcc-internal-format
  msgid "JSON tuning enables dispatch scheduling but %<dispatch_constraints%> is not available; disabling dispatch scheduling"
! msgstr "les réglages JSON activent l'envoi de l'ordonnancement mais %<dispatch_constraints%> n'est pas disponible , l'envoi de l'ordonnancement est désactivé"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:524
! #, gcc-internal-format, gfc-internal-format
  msgid "cannot read JSON data in %s"
! msgstr "impossible de lire les données JSON dans %s"
  
  #: config/aarch64/aarch64-json-tunings-printer.cc:139
! #, gcc-internal-format, gfc-internal-format
  msgid "Error opening file %s"
! msgstr "Erreur en ouvrant le fichier %s"
  
  #: config/aarch64/aarch64-sve-builtins.cc:1754
  #, gcc-internal-format
*************** msgid "%<-fsanitize=shadow-call-stack%>
*** 41063,41078 ****
  msgstr "%<-fsanitize=shadow-call-stack%> requiert %<-ffixed-x18%>"
  
  #: config/aarch64/aarch64.cc:19653
! #, fuzzy, gcc-internal-format
! #| msgid "%<-fsanitize=shadow-call-stack%> not supported in current platform"
  msgid "%<-fsanitize=shadow-call-stack%> conflicts with the use of register x18 by the target operating system"
! msgstr "%<-fsanitize=shadow-call-stack%> n'est pas supporté pour la plateforme actuelle"
  
  #: config/aarch64/aarch64.cc:19659
! #, fuzzy, gcc-internal-format
! #| msgid "functions with SME state require the ISA extension %qs"
  msgid "%<-fsanitize=memtag-stack%> requires the ISA extension %qs"
! msgstr "les fonctions avec un état SME requièrent l'extension ISA %qs"
  
  #: config/aarch64/aarch64.cc:19667
  #, gcc-internal-format
--- 40919,40932 ----
  msgstr "%<-fsanitize=shadow-call-stack%> requiert %<-ffixed-x18%>"
  
  #: config/aarch64/aarch64.cc:19653
! #, gcc-internal-format
  msgid "%<-fsanitize=shadow-call-stack%> conflicts with the use of register x18 by the target operating system"
! msgstr "%<-fsanitize=shadow-call-stack%> est en conflit avec l'utilisation du registre x18 par le système d'exploitation cible"
  
  #: config/aarch64/aarch64.cc:19659
! #, gcc-internal-format
  msgid "%<-fsanitize=memtag-stack%> requires the ISA extension %qs"
! msgstr "%<-fsanitize=memtag-stack%> requière l'extension ISA %qs"
  
  #: config/aarch64/aarch64.cc:19667
  #, gcc-internal-format
*************** msgstr "les versions multiples requière
*** 41281,41293 ****
  #: config/aarch64/aarch64.cc:21808
  #, gcc-internal-format
  msgid "%q+D has an inconsistent function multi-version priority value"
! msgstr ""
  
  #: config/aarch64/aarch64.cc:21811
! #, fuzzy, gcc-internal-format
! #| msgid "%qD was previously declared here"
  msgid "%q+D was previously declared here with priority value of %d"
! msgstr "%qD précédemment déclaré ici"
  
  #: config/aarch64/aarch64.cc:23420 config/arm/arm.cc:6689
  #: config/rs6000/rs6000-call.cc:366 config/s390/s390.cc:13289
--- 41135,41146 ----
  #: config/aarch64/aarch64.cc:21808
  #, gcc-internal-format
  msgid "%q+D has an inconsistent function multi-version priority value"
! msgstr "%q+D a une valeur de priorité multi-versions de fonction incohérente"
  
  #: config/aarch64/aarch64.cc:21811
! #, gcc-internal-format
  msgid "%q+D was previously declared here with priority value of %d"
! msgstr "%q+D précédemment déclaré ici avec la valeur de priorité %d"
  
  #: config/aarch64/aarch64.cc:23420 config/arm/arm.cc:6689
  #: config/rs6000/rs6000-call.cc:366 config/s390/s390.cc:13289
*************** msgid "passing %wd to argument %d of %qE
*** 41397,41424 ****
  msgstr "passage de %wd à l'argument %d de %qE qui attend une valeur %qT valable"
  
  #: config/aarch64/aarch64.cc:33099
! #, fuzzy, gcc-internal-format
! #| msgid "an empty string cannot be in %<target_clones%> attribute"
  msgid "empty string not valid for a %<target_clones%> version"
! msgstr "une chaîne vide ne peut pas être dans l'attribut %<target_clones%>"
  
  #: config/aarch64/aarch64.cc:33103
- #, fuzzy
- #| msgid "invalid feature modifier %qs of value %qs in %<target_version%> attribute"
  msgid "invalid feature modifier %qs in version %qB for %<target_clones%> attribute"
! msgstr "modificateur de fonctionnalité %qs invalide de la valeur %qs dans l'attribut %<target_version%>"
  
  #: config/aarch64/aarch64.cc:33109
- #, fuzzy
- #| msgid "duplicate feature modifier %qs of value %qs in %<target_version%> attribute"
  msgid "duplicate feature modifier %qs in version %qB for %<target_clones%> attribute"
! msgstr "modificateur de fonctionnalité %qs dupliqué avec la valeur %qs dans l'attribut %<target_version%>"
  
  #: config/aarch64/aarch64.cc:33115
- #, fuzzy
- #| msgid "invalid feature modifier %qs of value %qs in %<target_version%> attribute"
  msgid "invalid feature %qs in version %qB for %<target_clones%> attribute"
! msgstr "modificateur de fonctionnalité %qs invalide de la valeur %qs dans l'attribut %<target_version%>"
  
  #: config/alpha/alpha.cc:420
  #, gcc-internal-format
--- 41250,41270 ----
  msgstr "passage de %wd à l'argument %d de %qE qui attend une valeur %qT valable"
  
  #: config/aarch64/aarch64.cc:33099
! #, gcc-internal-format
  msgid "empty string not valid for a %<target_clones%> version"
! msgstr "une chaîne vide n'est pas valide pour une version de %<target_clones%>"
  
  #: config/aarch64/aarch64.cc:33103
  msgid "invalid feature modifier %qs in version %qB for %<target_clones%> attribute"
! msgstr "modificateur de fonctionnalité %qs invalide dans la version %qB pour l'attribut %<target_clones%>"
  
  #: config/aarch64/aarch64.cc:33109
  msgid "duplicate feature modifier %qs in version %qB for %<target_clones%> attribute"
! msgstr "modificateur de fonctionnalité %qs dupliqué dans la version %qB pour l'attribut %<target_clone%>"
  
  #: config/aarch64/aarch64.cc:33115
  msgid "invalid feature %qs in version %qB for %<target_clones%> attribute"
! msgstr "fonctionnalité %qs invalide dans la version %qB pour l'attribut %<target_clones%>"
  
  #: config/alpha/alpha.cc:420
  #, gcc-internal-format
*************** msgid "fastcall and regparm attributes a
*** 43731,43740 ****
  msgstr "les attributs fastcall et regparm sont incompatibles"
  
  #: config/i386/i386-options.cc:3635 config/i386/i386-options.cc:3729
! #, fuzzy, gcc-internal-format
! #| msgid "regparam and thiscall attributes are not compatible"
  msgid "regparm and thiscall attributes are not compatible"
! msgstr "les attributs regparam et thiscall sont incompatibles"
  
  #: config/i386/i386-options.cc:3642 config/i386/i386-options.cc:3861
  #, gcc-internal-format
--- 43577,43585 ----
  msgstr "les attributs fastcall et regparm sont incompatibles"
  
  #: config/i386/i386-options.cc:3635 config/i386/i386-options.cc:3729
! #, gcc-internal-format
  msgid "regparm and thiscall attributes are not compatible"
! msgstr "les attributs regparm et thiscall sont incompatibles"
  
  #: config/i386/i386-options.cc:3642 config/i386/i386-options.cc:3861
  #, gcc-internal-format
*************** msgid "%<-fsplit-stack%> does not suppor
*** 43995,44016 ****
  msgstr "%<-fsplit-stack%> ne supporte pas trois paramètres registres"
  
  #: config/i386/i386.cc:12532
! #, fuzzy, gcc-internal-format
! #| msgid "%s instructions aren%'t allowed in a function with the %<no_caller_saved_registers%> attribute"
  msgid "%<-mtls-dialect=gnu2%> must be used with a function with the %<no_caller_saved_registers%> attribute"
! msgstr "les instructions %s ne sont pas autorisées dans la fonction avec l%'attribut %<no_caller_saved_registers%>"
  
  #: config/i386/i386.cc:12536
! #, fuzzy, gcc-internal-format
! #| msgid "%s instructions aren%'t allowed in an exception service routine"
  msgid "%<-mtls-dialect=gnu2%> must be used with an exception service routine"
! msgstr "les instructions %s ne sont pas autorisées dans la routine de service exception"
  
  #: config/i386/i386.cc:12538
! #, fuzzy, gcc-internal-format
! #| msgid "%s instructions aren%'t allowed in an interrupt service routine"
  msgid "%<-mtls-dialect=gnu2%> must be used with an interrupt service routine"
! msgstr "les instructions %s ne sont pas autorisées dans la routine de service d'interruption"
  
  #: config/i386/i386.cc:13882
  #, gcc-internal-format
--- 43840,43858 ----
  msgstr "%<-fsplit-stack%> ne supporte pas trois paramètres registres"
  
  #: config/i386/i386.cc:12532
! #, gcc-internal-format
  msgid "%<-mtls-dialect=gnu2%> must be used with a function with the %<no_caller_saved_registers%> attribute"
! msgstr "les instructions %<-mtls-dialect=gnu2%> doivent être utilisées avec une fonction qui a l'attribut %<no_caller_saved_registers%>"
  
  #: config/i386/i386.cc:12536
! #, gcc-internal-format
  msgid "%<-mtls-dialect=gnu2%> must be used with an exception service routine"
! msgstr "%<-mtls-dialect=gnu2%> doit être utilisé avec une routine de service exception"
  
  #: config/i386/i386.cc:12538
! #, gcc-internal-format
  msgid "%<-mtls-dialect=gnu2%> must be used with an interrupt service routine"
! msgstr "%<-mtls-dialect=gnu2%> doit être utilisé avec une routine de service d'interruption"
  
  #: config/i386/i386.cc:13882
  #, gcc-internal-format
*************** msgid "%qs does not work on a cross comp
*** 44204,44213 ****
  msgstr "%qs ne fonctionne pas sur un compilateur croisé"
  
  #: config/loongarch/loongarch-opts.cc:365
! #, fuzzy, gcc-internal-format
! #| msgid "PIC is not supported for %qs"
  msgid "SIMD is not supported on LA32"
! msgstr "PIC n’est pas supporté pour %qs"
  
  #: config/loongarch/loongarch-opts.cc:384
  #, gcc-internal-format
--- 44046,44054 ----
  msgstr "%qs ne fonctionne pas sur un compilateur croisé"
  
  #: config/loongarch/loongarch-opts.cc:365
! #, gcc-internal-format
  msgid "SIMD is not supported on LA32"
! msgstr "SIMD n’est pas supporté sur LA32"
  
  #: config/loongarch/loongarch-opts.cc:384
  #, gcc-internal-format
*************** msgid "%qs cannot be used for compiling
*** 44281,44290 ****
  msgstr "%qs ne peut pas être utilisé pour compiler une bibliothèque partagée"
  
  #: config/loongarch/loongarch-target-attr.cc:261
! #, fuzzy, gcc-internal-format
! #| msgid "pragma or attribute %<target(\"%s\")%> is not valid"
  msgid "the value of pragma or attribute %<target(\"%s\")%> not be empty"
! msgstr "le pragma ou l'attribut %<target(\"%s\")%> n'est pas valide"
  
  #: config/loongarch/loongarch-target-attr.cc:332 config/s390/s390.cc:17045
  #: config/s390/s390.cc:17096 config/s390/s390.cc:17114
--- 44122,44130 ----
  msgstr "%qs ne peut pas être utilisé pour compiler une bibliothèque partagée"
  
  #: config/loongarch/loongarch-target-attr.cc:261
! #, gcc-internal-format
  msgid "the value of pragma or attribute %<target(\"%s\")%> not be empty"
! msgstr "la valeur de pragma ou l'attribut %<target(\"%s\")%> n'est pas vide"
  
  #: config/loongarch/loongarch-target-attr.cc:332 config/s390/s390.cc:17045
  #: config/s390/s390.cc:17096 config/s390/s390.cc:17114
*************** msgstr "l'argument %<target%> de l'attri
*** 44295,44346 ****
  #: config/loongarch/loongarch-target-attr.cc:544
  #, gcc-internal-format
  msgid "\"default\" cannot be set together with other features in %qs"
! msgstr ""
  
  #: config/loongarch/loongarch-target-attr.cc:556
! #, fuzzy, gcc-internal-format
! #| msgid "clones for %<target_clones%> attribute cannot be created"
  msgid "characher before %<;%> in attribute %qs cannot be empty"
! msgstr "les clones pour l'attribut %<target_clones%> ne peuvent pas être créés"
  
  #: config/loongarch/loongarch-target-attr.cc:567
! #, fuzzy, gcc-internal-format
! #| msgid "%qs property cannot be set"
  msgid "in attribute %qs priority cannot be empty"
! msgstr "la propriété %qs ne peut pas être définie"
  
  #: config/loongarch/loongarch-target-attr.cc:576
  #, gcc-internal-format
  msgid "in attribute %qs the number of reatures cannot exceed two"
! msgstr ""
  
  #: config/loongarch/loongarch-target-attr.cc:600
  #, gcc-internal-format
  msgid "Setting the priority value to %qs is illegal in attribute %qs"
! msgstr ""
  
  #: config/loongarch/loongarch-target-attr.cc:611
  #, gcc-internal-format
  msgid "in attribute %qs, the second feature should be \"priority=%<num%>\" instead of %qs"
! msgstr ""
  
  #: config/loongarch/loongarch-target-attr.cc:630
  #: config/loongarch/loongarch-target-attr.cc:662
  #, gcc-internal-format
  msgid "in attribute %qs you need to set a legal value for \"arch\""
! msgstr ""
  
  #: config/loongarch/loongarch-target-attr.cc:684
! #, fuzzy, gcc-internal-format
! #| msgid "value %qs is not supported by attribute %<target%>"
  msgid "attribute %qs is not supported in %<target_version%> or %<target_clones%>"
! msgstr "la valeur %qs n'est pas supportée par l'attribut %<target%>"
  
  #: config/loongarch/loongarch-target-attr.cc:701
! #, fuzzy, gcc-internal-format
! #| msgid "%qs is not supported on this target"
  msgid "%qs is not supported in target attribute"
! msgstr "%qs n'est pas supporté sur cette cible"
  
  #: config/loongarch/loongarch.cc:8618
  #, gcc-internal-format
--- 44135,44182 ----
  #: config/loongarch/loongarch-target-attr.cc:544
  #, gcc-internal-format
  msgid "\"default\" cannot be set together with other features in %qs"
! msgstr "« default » ne peut pas être défini avec d'autres fonctionnalités dans %qs"
  
  #: config/loongarch/loongarch-target-attr.cc:556
! #, gcc-internal-format
  msgid "characher before %<;%> in attribute %qs cannot be empty"
! msgstr "le caractère avant %<;%> dans l'attribut %qs ne peut pas être vide"
  
  #: config/loongarch/loongarch-target-attr.cc:567
! #, gcc-internal-format
  msgid "in attribute %qs priority cannot be empty"
! msgstr "la priorité ne peut pas être vide dans l'attribut %qs"
  
  #: config/loongarch/loongarch-target-attr.cc:576
  #, gcc-internal-format
  msgid "in attribute %qs the number of reatures cannot exceed two"
! msgstr "le nombre de fonctionnalités ne peut pas dépassé deux dans l'attribut %qs"
  
  #: config/loongarch/loongarch-target-attr.cc:600
  #, gcc-internal-format
  msgid "Setting the priority value to %qs is illegal in attribute %qs"
! msgstr "Définir la valeur de la priorité à %qs est illégal dans l'attribut %qs"
  
  #: config/loongarch/loongarch-target-attr.cc:611
  #, gcc-internal-format
  msgid "in attribute %qs, the second feature should be \"priority=%<num%>\" instead of %qs"
! msgstr "dans l'attribut %qs, la deuxième fonctionnalité devrait être « priority=%<num%> » au lieu de %qs"
  
  #: config/loongarch/loongarch-target-attr.cc:630
  #: config/loongarch/loongarch-target-attr.cc:662
  #, gcc-internal-format
  msgid "in attribute %qs you need to set a legal value for \"arch\""
! msgstr "dans l'attribut %qs, vous devez définir une valeur légale pour « arch »"
  
  #: config/loongarch/loongarch-target-attr.cc:684
! #, gcc-internal-format
  msgid "attribute %qs is not supported in %<target_version%> or %<target_clones%>"
! msgstr "l'attribut %qs n'est pas supporté dans %<target_version%> ou %<target_clones%>"
  
  #: config/loongarch/loongarch-target-attr.cc:701
! #, gcc-internal-format
  msgid "%qs is not supported in target attribute"
! msgstr "%qs n'est pas supporté dans l'attribut cible"
  
  #: config/loongarch/loongarch.cc:8618
  #, gcc-internal-format
*************** msgid "function pointers not supported w
*** 45424,45433 ****
  msgstr "les pointeurs de fonctions ne sont pas supportés avec l'option %<-mabi=ti%>"
  
  #: config/pru/pru-passes.cc:111
! #, fuzzy, gcc-internal-format
! #| msgid "function pointers not supported with %<-mabi=ti%> option"
  msgid "bit-fields not supported with %<-mabi=ti%> option"
! msgstr "les pointeurs de fonctions ne sont pas supportés avec l'option %<-mabi=ti%>"
  
  #: config/pru/pru-passes.cc:136
  #, gcc-internal-format
--- 45260,45268 ----
  msgstr "les pointeurs de fonctions ne sont pas supportés avec l'option %<-mabi=ti%>"
  
  #: config/pru/pru-passes.cc:111
! #, gcc-internal-format
  msgid "bit-fields not supported with %<-mabi=ti%> option"
! msgstr "les champs de bits ne sont pas supportés avec l'option %<-mabi=ti%>"
  
  #: config/pru/pru-passes.cc:136
  #, gcc-internal-format
*************** msgid "redefinition of %<CTABLE_ENTRY %w
*** 45460,45469 ****
  msgstr "redéfinition de %<CTABLE_ENTRY %wd%>"
  
  #: config/pru/pru-pragma.cc:66
! #, fuzzy, gcc-internal-format
! #| msgid "%<CTABLE_ENTRY%> base address is not a multiple of 256"
  msgid "%<CTABLE_ENTRY%> base address does not fit in 32-bits"
! msgstr "l'adresse de base de %<CTABLE_ENTRY%> n'est pas un multiple de 256"
  
  #: config/pru/pru-pragma.cc:70
  #, gcc-internal-format
--- 45295,45303 ----
  msgstr "redéfinition de %<CTABLE_ENTRY %wd%>"
  
  #: config/pru/pru-pragma.cc:66
! #, gcc-internal-format
  msgid "%<CTABLE_ENTRY%> base address does not fit in 32-bits"
! msgstr "l'adresse de base de %<CTABLE_ENTRY%> ne tient pas dans 32 bits"
  
  #: config/pru/pru-pragma.cc:70
  #, gcc-internal-format
*************** msgid "malformed %<target()%> attribute"
*** 45586,45601 ****
  msgstr "l'attribut %<target()%> est mal composé"
  
  #: config/riscv/riscv-target-attr.cc:336
! #, fuzzy, gcc-internal-format
! #| msgid "attribute %<target(\"%s\")%> does not accept an argument"
  msgid "attribute %<target(\"%s\")%> has empty argument"
! msgstr "l'attribut %<target(\"%s\")%> n'accepte pas d'argument"
  
  #: config/riscv/riscv-target-attr.cc:352
! #, fuzzy, gcc-internal-format
! #| msgid "attribute %<target(\"%s\")%> does not accept an argument"
  msgid "attribute %<target(\"%s\")%> expects an argument"
! msgstr "l'attribut %<target(\"%s\")%> n'accepte pas d'argument"
  
  #: config/riscv/riscv-target-attr.cc:360
  #, gcc-internal-format
--- 45420,45433 ----
  msgstr "l'attribut %<target()%> est mal composé"
  
  #: config/riscv/riscv-target-attr.cc:336
! #, gcc-internal-format
  msgid "attribute %<target(\"%s\")%> has empty argument"
! msgstr "l'attribut %<target(\"%s\")%> a un argument vide"
  
  #: config/riscv/riscv-target-attr.cc:352
! #, gcc-internal-format
  msgid "attribute %<target(\"%s\")%> expects an argument"
! msgstr "l'attribut %<target(\"%s\")%> attend un argument"
  
  #: config/riscv/riscv-target-attr.cc:360
  #, gcc-internal-format
*************** msgid "attribute %<target(\"%s\")%> does
*** 45603,45618 ****
  msgstr "l'attribut %<target(\"%s\")%> n'accepte pas d'argument"
  
  #: config/riscv/riscv-target-attr.cc:369
! #, fuzzy, gcc-internal-format
! #| msgid "Got unknown attribute %<target(\"%s\")%>"
  msgid "unknown attribute %<target(\"%s\")%>"
  msgstr "attribut %<target(\"%s\")%> inconnu"
  
  #: config/riscv/riscv-target-attr.cc:435
- #, fuzzy
- #| msgid "malformed %<target(\"%s\")%> attribute"
  msgid "malformed %<target(\"%B\")%> attribute"
! msgstr "l'attribut %<target(\"%s\")%> est mal composé"
  
  #: config/riscv/riscv-v.cc:317
  #, gcc-internal-format, gfc-internal-format
--- 45435,45447 ----
  msgstr "l'attribut %<target(\"%s\")%> n'accepte pas d'argument"
  
  #: config/riscv/riscv-target-attr.cc:369
! #, gcc-internal-format
  msgid "unknown attribute %<target(\"%s\")%>"
  msgstr "attribut %<target(\"%s\")%> inconnu"
  
  #: config/riscv/riscv-target-attr.cc:435
  msgid "malformed %<target(\"%B\")%> attribute"
! msgstr "l'attribut %<target(\"%B\")%> est mal composé"
  
  #: config/riscv/riscv-v.cc:317
  #, gcc-internal-format, gfc-internal-format
*************** msgid "built-in function %qE requires th
*** 45725,45734 ****
  msgstr "la fonction interne %qE requiert l'extension ISA zve64x, zve64f, zve64d ou v"
  
  #: config/riscv/riscv-vector-builtins.cc:5713
! #, fuzzy, gcc-internal-format
! #| msgid "unrecognized wide sub-instruction"
  msgid "unrecognized RVV builtin"
! msgstr "sous-instruction très large non reconnue"
  
  #: config/riscv/riscv-vector-builtins.cc:5720
  #, gcc-internal-format
--- 45554,45562 ----
  msgstr "la fonction interne %qE requiert l'extension ISA zve64x, zve64f, zve64d ou v"
  
  #: config/riscv/riscv-vector-builtins.cc:5713
! #, gcc-internal-format
  msgid "unrecognized RVV builtin"
! msgstr "instruction interne RVV non reconnue"
  
  #: config/riscv/riscv-vector-builtins.cc:5720
  #, gcc-internal-format
*************** msgid "ABI for flattened struct with zer
*** 45761,45770 ****
  msgstr "l'ABI pour des structures aplaties avec un champ de bits d'une taille non nulle a changé dans GCC 10"
  
  #: config/riscv/riscv.cc:6337 config/riscv/riscv.cc:6414
! #, fuzzy, gcc-internal-format
! #| msgid "ABI for flattened struct with zero-length bit-fields changed in GCC 10"
  msgid "ABI for flattened empty union and zero length array changed in GCC 16"
! msgstr "l'ABI pour des structures aplaties avec un champ de bits d'une taille non nulle a changé dans GCC 10"
  
  #: config/riscv/riscv.cc:7029
  #, gcc-internal-format
--- 45589,45597 ----
  msgstr "l'ABI pour des structures aplaties avec un champ de bits d'une taille non nulle a changé dans GCC 10"
  
  #: config/riscv/riscv.cc:6337 config/riscv/riscv.cc:6414
! #, gcc-internal-format
  msgid "ABI for flattened empty union and zero length array changed in GCC 16"
! msgstr "l'ABI pour des unions vides aplaties et les tableaux de longueur zéro a changé dans GCC 16"
  
  #: config/riscv/riscv.cc:7029
  #, gcc-internal-format
*************** msgstr "l'attribut de fonction %qs requi
*** 45809,45833 ****
  #: config/riscv/riscv.cc:7464
  #, gcc-internal-format
  msgid "unsupported %<ABI_VLEN%> value %d for %qs attribute;%<ABI_VLEN must%> be in the range [32, 16384] and must be a power of 2"
! msgstr ""
  
  #: config/riscv/riscv.cc:7489
! #, fuzzy, gcc-internal-format
! #| msgid "function attribute %qs requires the V ISA extension"
  msgid "function attribute %qs requires the vector ISA extension"
! msgstr "l'attribut de fonction %qs requiert l'extension ISA V"
  
  #: config/riscv/riscv.cc:7599
! #, fuzzy, gcc-internal-format
! #| msgid "function attribute %qs requires the V ISA extension"
  msgid "attribute 'rnmi' requires the Smrnmi ISA extension"
! msgstr "l'attribut de fonction %qs requiert l'extension ISA V"
  
  #: config/riscv/riscv.cc:7607
! #, fuzzy, gcc-internal-format
! #| msgid "argument to %qE attribute is not %<\"user\"%>, %<\"supervisor\"%>, or %<\"machine\"%>"
  msgid "argument to %qE attribute is not %<\"supervisor\"%>, %<\"machine\"%>, or %<\"rnmi\"%>"
! msgstr "l'argument de l'attribut %qE n'est pas %<\"user\"%>, %<\"supervisor\"%> ou %<\"machine\"%>"
  
  #: config/riscv/riscv.cc:7649
  #, gcc-internal-format
--- 45636,45657 ----
  #: config/riscv/riscv.cc:7464
  #, gcc-internal-format
  msgid "unsupported %<ABI_VLEN%> value %d for %qs attribute;%<ABI_VLEN must%> be in the range [32, 16384] and must be a power of 2"
! msgstr "valeur de %<ABI_VLEN%> %d non supportée pour l'attribut %qs ; %<ABI_VLEN%> doit être dans la plage [32, 16384] et doit être une puissance de 2"
  
  #: config/riscv/riscv.cc:7489
! #, gcc-internal-format
  msgid "function attribute %qs requires the vector ISA extension"
! msgstr "l'attribut de fonction %qs requiert l'extension ISA vectorielle"
  
  #: config/riscv/riscv.cc:7599
! #, gcc-internal-format
  msgid "attribute 'rnmi' requires the Smrnmi ISA extension"
! msgstr "l'attribut « rnmi » requiert l'extension ISA Smrnmi"
  
  #: config/riscv/riscv.cc:7607
! #, gcc-internal-format
  msgid "argument to %qE attribute is not %<\"supervisor\"%>, %<\"machine\"%>, or %<\"rnmi\"%>"
! msgstr "l'argument de l'attribut %qE n'est pas %<\"supervisor\"%>, %<\"machine\"%> ou %<\"rnmi\"%>"
  
  #: config/riscv/riscv.cc:7649
  #, gcc-internal-format
*************** msgid "only uninitialized variables can
*** 47192,47206 ****
  msgstr "seules les variables non initialisées peuvent être placées dans une section %<.bss%>"
  
  #: config/xtensa/xtensa.cc:6141
! #, fuzzy, gcc-internal-format
! #| msgid "constant literal %qs contains %qc, expected %qs"
  msgid "constantsynth: method %qs invalid insn sequence, expected %wd (%wx)"
! msgstr "le littéral constant %qs contient %qc, %qs attendu"
  
  #: config/xtensa/xtensa.cc:6146
  #, gcc-internal-format
  msgid "constantsynth: method %qs value mismatch, expected %wd (%wx) synthesized %wd (%wx)"
! msgstr ""
  
  #: ada/gcc-interface/misc.cc:157
  #, gcc-internal-format
--- 47016,47029 ----
  msgstr "seules les variables non initialisées peuvent être placées dans une section %<.bss%>"
  
  #: config/xtensa/xtensa.cc:6141
! #, gcc-internal-format
  msgid "constantsynth: method %qs invalid insn sequence, expected %wd (%wx)"
! msgstr "constantsynth: dans la méthode %qs, séquence d'instructions invalide, attendu %wd (%wx)"
  
  #: config/xtensa/xtensa.cc:6146
  #, gcc-internal-format
  msgid "constantsynth: method %qs value mismatch, expected %wd (%wx) synthesized %wd (%wx)"
! msgstr "constantsynth: méthode %qs, désaccord de valeur, attendu %wd (%wx) synthétisé %wd (%wx)"
  
  #: ada/gcc-interface/misc.cc:157
  #, gcc-internal-format
*************** msgid "Argument to %<-fcheck%> is not va
*** 47300,47379 ****
  msgstr "L'argument de %<-fcheck%> n'est pas valide: %s"
  
  #: algol68/a68-lang.cc:535
! #, fuzzy, gcc-internal-format
! #| msgid "bad argument for %<-fmodule-file=%>: %qs"
  msgid "invalid argument for %<-fmodules-map%>: %s"
! msgstr "argument invalide pour %<-fmodule-file=%> : %qs"
  
  #: algol68/a68-lang.cc:544
! #, fuzzy, gcc-internal-format
! #| msgid "cannot open profile file %s"
  msgid "cannot open modules map file %<%s%>"
! msgstr "n'a pu ouvrir le fichier profil %s"
  
  #: algol68/a68-lang.cc:549
! #, fuzzy, gcc-internal-format
! #| msgid "Cannot delete module file %qs: %s"
  msgid "cannot determine size of modules map file %<%s%>"
! msgstr "Impossible d%'effacer le fichier module %qs: %s"
  
  #: algol68/a68-lang.cc:556
! #, fuzzy, gcc-internal-format
! #| msgid "cannot read omp_requires file %qs"
  msgid "cannot read contents of modules map file %<%s%>"
! msgstr "ne peut lire le fichier omp_requires %qs"
  
  #: algol68/a68-lang.cc:666
! #, fuzzy, gcc-internal-format
! #| msgid "method attributes must be specified at the end only"
  msgid "exactly one source file must be specified on the command line"
! msgstr "les attributs de méthodes doivent être spécifiés uniquement à la fin"
  
  #: algol68/a68-low-coercions.cc:403
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "cannot read working set from %s"
  msgid "cannot do widening from %s to %s"
! msgstr "impossible de lire l'ensemble de travail depuis %s"
  
  #: algol68/a68-low-moids.cc:648
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Cannot open %s"
  msgid "Cannot lower mode %s"
! msgstr "Impossible d'ouvrir %s"
  
  #: algol68/a68-low-prelude.cc:52
  #, gcc-internal-format
  msgid "no lowering routine installed for construct.  jemarch has been lazy"
! msgstr ""
  
  #: algol68/a68-low.cc:318
  #, gcc-internal-format, gfc-internal-format
  msgid "get skip tree: cannot compute SKIP for mode %s"
! msgstr ""
  
  #: algol68/a68-low.cc:1720
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "cannot open %s"
  msgid "cannot lower node %s"
! msgstr "ne peut ouvrir %s"
  
  #: algol68/a68-parser-scanner.cc:337
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "could not open response file %s"
  msgid "could not open source file %s"
! msgstr "n'a pu ouvrir le fichier de réponse %s"
  
  #: algol68/a68-parser-scanner.cc:344
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%qs is not a directory"
  msgid "specified file %s is a directory"
! msgstr "%qs n'est pas un répertoire"
  
  #: algol68/a68-parser-scanner.cc:349
! #, fuzzy, gcc-internal-format
! #| msgid "could not write to response file %s"
  msgid "could not get size of source file"
! msgstr "n'a pu écrire dans le fichier de réponse %s"
  
  #: c/c-convert.cc:104 c/c-typeck.cc:2805 c/c-typeck.cc:15412 cp/typeck.cc:2635
  #: cp/typeck.cc:9874 cp/typeck.cc:10682 d/d-convert.cc:262
--- 47123,47191 ----
  msgstr "L'argument de %<-fcheck%> n'est pas valide: %s"
  
  #: algol68/a68-lang.cc:535
! #, gcc-internal-format
  msgid "invalid argument for %<-fmodules-map%>: %s"
! msgstr "argument invalide pour %<-fmodules-map%> : %s"
  
  #: algol68/a68-lang.cc:544
! #, gcc-internal-format
  msgid "cannot open modules map file %<%s%>"
! msgstr "impossible d'ouvrir le fichier de la carte des modules %<%s%>"
  
  #: algol68/a68-lang.cc:549
! #, gcc-internal-format
  msgid "cannot determine size of modules map file %<%s%>"
! msgstr "impossible de déterminer la taille du fichier de carte des modules %<%s%>"
  
  #: algol68/a68-lang.cc:556
! #, gcc-internal-format
  msgid "cannot read contents of modules map file %<%s%>"
! msgstr "ne peut lire le contenu du fichier de carte des modules %<%s%>"
  
  #: algol68/a68-lang.cc:666
! #, gcc-internal-format
  msgid "exactly one source file must be specified on the command line"
! msgstr "exactement un fichier source doit être spécifié sur la ligne de commande"
  
  #: algol68/a68-low-coercions.cc:403
! #, gcc-internal-format, gfc-internal-format
  msgid "cannot do widening from %s to %s"
! msgstr "impossible d'élargir de %s à %s"
  
  #: algol68/a68-low-moids.cc:648
! #, gcc-internal-format, gfc-internal-format
  msgid "Cannot lower mode %s"
! msgstr "Impossible d'abaisser le mode %s"
  
  #: algol68/a68-low-prelude.cc:52
  #, gcc-internal-format
  msgid "no lowering routine installed for construct.  jemarch has been lazy"
! msgstr "aucune routine d'abaissement installée pour le constructeur. jemarch a été paresseux"
  
  #: algol68/a68-low.cc:318
  #, gcc-internal-format, gfc-internal-format
  msgid "get skip tree: cannot compute SKIP for mode %s"
! msgstr "get skip tree: impossible de calculer le SKIP pour le mode %s"
  
  #: algol68/a68-low.cc:1720
! #, gcc-internal-format, gfc-internal-format
  msgid "cannot lower node %s"
! msgstr "impossible d'abaisser le nœud %s"
  
  #: algol68/a68-parser-scanner.cc:337
! #, gcc-internal-format, gfc-internal-format
  msgid "could not open source file %s"
! msgstr "n'a pu ouvrir le fichier source %s"
  
  #: algol68/a68-parser-scanner.cc:344
! #, gcc-internal-format, gfc-internal-format
  msgid "specified file %s is a directory"
! msgstr "le fichier spécifié %s est un répertoire"
  
  #: algol68/a68-parser-scanner.cc:349
! #, gcc-internal-format
  msgid "could not get size of source file"
! msgstr "n'a pu obtenir la taille du fichier source"
  
  #: c/c-convert.cc:104 c/c-typeck.cc:2805 c/c-typeck.cc:15412 cp/typeck.cc:2635
  #: cp/typeck.cc:9874 cp/typeck.cc:10682 d/d-convert.cc:262
*************** msgid "underspecified declaration of %qE
*** 47457,47466 ****
  msgstr "la déclaration sous-spécifiée de %qE est déjà déclaré dans cette portée"
  
  #: c/c-decl.cc:1735 c/c-decl.cc:7962
! #, fuzzy, gcc-internal-format
! #| msgid "defining a type in a cast is invalid in C++"
  msgid "using %qD as both a typedef and a tag is invalid in C++"
! msgstr "définir un type dans un transtypage est invalide en C++"
  
  #: c/c-decl.cc:1738 c/c-decl.cc:7965 c/c-decl.cc:8971 c/c-decl.cc:9967
  #: c/c-decl.cc:9973 c/c-decl.cc:10204
--- 47269,47277 ----
  msgstr "la déclaration sous-spécifiée de %qE est déjà déclaré dans cette portée"
  
  #: c/c-decl.cc:1735 c/c-decl.cc:7962
! #, gcc-internal-format
  msgid "using %qD as both a typedef and a tag is invalid in C++"
! msgstr "utiliser %qD à la fois comme un typedef et une étiquette est invalide en C++"
  
  #: c/c-decl.cc:1738 c/c-decl.cc:7965 c/c-decl.cc:8971 c/c-decl.cc:9967
  #: c/c-decl.cc:9973 c/c-decl.cc:10204
*************** msgid "previous declaration of %q+D with
*** 47516,47525 ****
  msgstr "la déclaration précédente de %q+D avec le type %qT"
  
  #: c/c-decl.cc:2109
! #, fuzzy, gcc-internal-format
! #| msgid "virtual function multiversioning not supported"
  msgid "cannot use function multiversioning on a renamed function"
! msgstr "des versions multiples de fonctions virtuelles ne sont pas supportées"
  
  #: c/c-decl.cc:2162
  #, gcc-internal-format
--- 47327,47335 ----
  msgstr "la déclaration précédente de %q+D avec le type %qT"
  
  #: c/c-decl.cc:2109
! #, gcc-internal-format
  msgid "cannot use function multiversioning on a renamed function"
! msgstr "impossible d'utiliser des versions multiples de fonctions sur une fonction renommée"
  
  #: c/c-decl.cc:2162
  #, gcc-internal-format
*************** msgid "redeclaration of %q+D with no lin
*** 47677,47686 ****
  msgstr "redéclaration de %q+D sans classe de liaison"
  
  #: c/c-decl.cc:2702
! #, fuzzy, gcc-internal-format
! #| msgid "%Jprevious declaration of '%D' was inline"
  msgid "duplicate declaration of %qD is invalid in C++"
! msgstr "déclaration précédente de « %D » était enligne"
  
  #: c/c-decl.cc:2712
  #, gcc-internal-format
--- 47487,47495 ----
  msgstr "redéclaration de %q+D sans classe de liaison"
  
  #: c/c-decl.cc:2702
! #, gcc-internal-format
  msgid "duplicate declaration of %qD is invalid in C++"
! msgstr "la déclaration dupliquée de %qD est invalide en C++"
  
  #: c/c-decl.cc:2712
  #, gcc-internal-format
*************** msgid "traditional C lacks a separate na
*** 47828,47837 ****
  msgstr "le C traditionnel n'a pas d'espace de noms séparé pour les étiquettes, l'identificateur %qE est en conflit"
  
  #: c/c-decl.cc:4495
! #, fuzzy, gcc-internal-format
! #| msgid "jump into scope of identifier with variably modified type"
  msgid "switch jumps into scope of identifier with variably modified type"
! msgstr "saut dans la portée de l'identificateur avec un type modifié par une variable"
  
  #: c/c-decl.cc:4505
  #, gcc-internal-format
--- 47637,47645 ----
  msgstr "le C traditionnel n'a pas d'espace de noms séparé pour les étiquettes, l'identificateur %qE est en conflit"
  
  #: c/c-decl.cc:4495
! #, gcc-internal-format
  msgid "switch jumps into scope of identifier with variably modified type"
! msgstr "switch saute dans la portée de l'identificateur avec un type modifié par une variable"
  
  #: c/c-decl.cc:4505
  #, gcc-internal-format
*************** msgid "inline function %q+D given attrib
*** 48049,48058 ****
  msgstr "la fonction en ligne %q+D a reçu l'attribut %qs"
  
  #: c/c-decl.cc:5945
! #, fuzzy, gcc-internal-format
! #| msgid "%<__label__%> declarations are only allowed in function scopes"
  msgid "versioned declarations are only allowed at file scope"
! msgstr "les déclarations %<__label__%> sont uniquement permises à l'intérieur des fonctions"
  
  #: c/c-decl.cc:5985
  #, gcc-internal-format
--- 47857,47865 ----
  msgstr "la fonction en ligne %q+D a reçu l'attribut %qs"
  
  #: c/c-decl.cc:5945
! #, gcc-internal-format
  msgid "versioned declarations are only allowed at file scope"
! msgstr "les déclarations versionnées sont uniquement permises à l'intérieur du fichier"
  
  #: c/c-decl.cc:5985
  #, gcc-internal-format
*************** msgid "%q+D in declare target directive
*** 48100,48109 ****
  msgstr "%q+D dans la directive de déclaration de cible n'a pas de type pour lequel une correspondance peut être établie (mappable type)"
  
  #: c/c-decl.cc:6440
! #, fuzzy, gcc-internal-format
! #| msgid "Warn about mismatched declarations of VLA parameters."
  msgid "more than one list of forward declarations of parameters"
! msgstr "Avertir à propos de déclarations discordantes de paramètres VLA."
  
  #: c/c-decl.cc:6443
  #, gcc-internal-format
--- 47907,47915 ----
  msgstr "%q+D dans la directive de déclaration de cible n'a pas de type pour lequel une correspondance peut être établie (mappable type)"
  
  #: c/c-decl.cc:6440
! #, gcc-internal-format
  msgid "more than one list of forward declarations of parameters"
! msgstr "plus d'une liste de déclarations avancées de paramètres"
  
  #: c/c-decl.cc:6443
  #, gcc-internal-format
*************** msgid "array of unknown size with empty
*** 48126,48135 ****
  msgstr "tableau de taille inconnue avec un initialisateur vide"
  
  #: c/c-decl.cc:6555
! #, fuzzy, gcc-internal-format
! #| msgid "storage size of %qD isn%'t constant"
  msgid "storage size isn%'t constant"
! msgstr "la taille de stockage de %qD n'est pas constante"
  
  #: c/c-decl.cc:6599
  #, gcc-internal-format
--- 47932,47940 ----
  msgstr "tableau de taille inconnue avec un initialisateur vide"
  
  #: c/c-decl.cc:6555
! #, gcc-internal-format
  msgid "storage size isn%'t constant"
! msgstr "la taille de stockage n'est pas constante"
  
  #: c/c-decl.cc:6599
  #, gcc-internal-format
*************** msgid "%<[*]%> not in a declaration"
*** 48440,48449 ****
  msgstr "%<[*]%> n'est pas dans une déclaration"
  
  #: c/c-decl.cc:7597
! #, fuzzy, gcc-internal-format
! #| msgid "%<[*]%> not allowed in other than function prototype scope"
  msgid "%<[*]%> not allowed in other than function prototype scope or generic association"
! msgstr "%<[*]%> n'est pas permis ailleurs que dans la portée du prototype d'une fonction"
  
  #: c/c-decl.cc:7663
  #, gcc-internal-format
--- 48245,48253 ----
  msgstr "%<[*]%> n'est pas dans une déclaration"
  
  #: c/c-decl.cc:7597
! #, gcc-internal-format
  msgid "%<[*]%> not allowed in other than function prototype scope or generic association"
! msgstr "%<[*]%> n'est pas permis ailleurs que dans la portée du prototype d'une fonction ou une association générique"
  
  #: c/c-decl.cc:7663
  #, gcc-internal-format
*************** msgid "empty union has size 0 in C, size
*** 48841,48850 ****
  msgstr "une union vide a une taille 0 en C et une taille 1 en C++"
  
  #: c/c-decl.cc:9333
! #, fuzzy, gcc-internal-format
! #| msgid "defining a type in a compound literal is invalid in C++"
  msgid "using %qD as both field and typedef name is invalid in C++"
! msgstr "définir un type dans un littéral composé (compound literal) est invalide en C++"
  
  #: c/c-decl.cc:9543
  #, gcc-internal-format
--- 48645,48653 ----
  msgstr "une union vide a une taille 0 en C et une taille 1 en C++"
  
  #: c/c-decl.cc:9333
! #, gcc-internal-format
  msgid "using %qD as both field and typedef name is invalid in C++"
! msgstr "utiliser %qD comme champ et nom de typedef est invalide en C++"
  
  #: c/c-decl.cc:9543
  #, gcc-internal-format
*************** msgid "type %qT is too large"
*** 48902,48911 ****
  msgstr "le type %qT est trop grand"
  
  #: c/c-decl.cc:9823
! #, fuzzy, gcc-internal-format
! #| msgid "bit-field %qs has invalid type"
  msgid "bit-field %qD has invalid type"
! msgstr "le champ de bits %qs a un type invalide"
  
  #: c/c-decl.cc:9878
  #, gcc-internal-format
--- 48705,48713 ----
  msgstr "le type %qT est trop grand"
  
  #: c/c-decl.cc:9823
! #, gcc-internal-format
  msgid "bit-field %qD has invalid type"
! msgstr "le champ de bits %qD a un type invalide"
  
  #: c/c-decl.cc:9878
  #, gcc-internal-format
*************** msgid "%qD is normally a non-static func
*** 49053,49062 ****
  msgstr "%qD est normalement une fonction non statique"
  
  #: c/c-decl.cc:10991
! #, fuzzy, gcc-internal-format
! #| msgid "%<__label__%> declarations are only allowed in function scopes"
  msgid "versioned definitions are only allowed at file scope"
! msgstr "les déclarations %<__label__%> sont uniquement permises à l'intérieur des fonctions"
  
  #: c/c-decl.cc:11035
  #, gcc-internal-format
--- 48855,48863 ----
  msgstr "%qD est normalement une fonction non statique"
  
  #: c/c-decl.cc:10991
! #, gcc-internal-format
  msgid "versioned definitions are only allowed at file scope"
! msgstr "les définitions versionnées sont uniquement autorisées au niveau du fichier"
  
  #: c/c-decl.cc:11035
  #, gcc-internal-format
*************** msgstr "%<long long long%> est trop long
*** 49268,49277 ****
  #: c/c-decl.cc:12925 c/c-decl.cc:12929 c/c-decl.cc:12933 c/c-decl.cc:12937
  #: c/c-decl.cc:12941 c/c-decl.cc:12945 c/c-decl.cc:12949 c/c-decl.cc:12979
  #: c/c-decl.cc:12996 c/c-decl.cc:13000 c/c-decl.cc:13004 c/c-decl.cc:13008
! #, fuzzy, gcc-internal-format
! #| msgid "both %qs and %qs specified"
  msgid "both %qs and %qs in declaration specifiers"
! msgstr "%qs et %qs spécifiés tous les deux"
  
  #: c/c-decl.cc:12210
  #, gcc-internal-format
--- 49069,49077 ----
  #: c/c-decl.cc:12925 c/c-decl.cc:12929 c/c-decl.cc:12933 c/c-decl.cc:12937
  #: c/c-decl.cc:12941 c/c-decl.cc:12945 c/c-decl.cc:12949 c/c-decl.cc:12979
  #: c/c-decl.cc:12996 c/c-decl.cc:13000 c/c-decl.cc:13004 c/c-decl.cc:13008
! #, gcc-internal-format
  msgid "both %qs and %qs in declaration specifiers"
! msgstr "les deux %qs et %qs sont dans les spécificateurs de la déclaration"
  
  #: c/c-decl.cc:12210
  #, gcc-internal-format
*************** msgid "ISO C90 does not support %<long l
*** 49279,49296 ****
  msgstr "le C90 ISO ne supporte pas %<long long%>"
  
  #: c/c-decl.cc:12229 c/c-decl.cc:12293 c/c-decl.cc:12518 c/c-decl.cc:12674
! #, fuzzy, gcc-internal-format
! #| msgid "two or more data types in declaration specifiers"
  msgid "both %qs and %<__int%d%> in declaration specifiers"
! msgstr "deux types de données ou plus dans le spécificateur de déclaration"
  
  #: c/c-decl.cc:12249 c/c-decl.cc:12317 c/c-decl.cc:12373 c/c-decl.cc:12429
  #: c/c-decl.cc:12554 c/c-decl.cc:12855 c/c-decl.cc:12863 c/c-decl.cc:12871
  #: c/c-decl.cc:12879 c/c-decl.cc:12887
! #, fuzzy, gcc-internal-format
! #| msgid "multiple storage classes in declaration specifiers"
  msgid "both %qs and %<_Float%d%s%> in declaration specifiers"
! msgstr "classes de stockage multiples dans les spécificateurs de la déclaration"
  
  #: c/c-decl.cc:12461 c/c-parser.cc:12885
  #, gcc-internal-format
--- 49079,49094 ----
  msgstr "le C90 ISO ne supporte pas %<long long%>"
  
  #: c/c-decl.cc:12229 c/c-decl.cc:12293 c/c-decl.cc:12518 c/c-decl.cc:12674
! #, gcc-internal-format
  msgid "both %qs and %<__int%d%> in declaration specifiers"
! msgstr "deux types %qs et %<__int%d%> sont dans les spécificateurs de la déclaration"
  
  #: c/c-decl.cc:12249 c/c-decl.cc:12317 c/c-decl.cc:12373 c/c-decl.cc:12429
  #: c/c-decl.cc:12554 c/c-decl.cc:12855 c/c-decl.cc:12863 c/c-decl.cc:12871
  #: c/c-decl.cc:12879 c/c-decl.cc:12887
! #, gcc-internal-format
  msgid "both %qs and %<_Float%d%s%> in declaration specifiers"
! msgstr "les deux %qs et %<_Float%d%s%> sont dans les spécificateurs de la déclaration"
  
  #: c/c-decl.cc:12461 c/c-parser.cc:12885
  #, gcc-internal-format
*************** msgid "ISO C does not support %<__int%d%
*** 49323,49332 ****
  msgstr "le C ISO ne supporte pas les types %<__int%d%>"
  
  #: c/c-decl.cc:12670 c/c-decl.cc:12678
! #, fuzzy, gcc-internal-format
! #| msgid "two or more data types in declaration specifiers"
  msgid "both %<__int%d%> and %qs in declaration specifiers"
! msgstr "deux types de données ou plus dans le spécificateur de déclaration"
  
  #: c/c-decl.cc:12684
  #, gcc-internal-format
--- 49121,49129 ----
  msgstr "le C ISO ne supporte pas les types %<__int%d%>"
  
  #: c/c-decl.cc:12670 c/c-decl.cc:12678
! #, gcc-internal-format
  msgid "both %<__int%d%> and %qs in declaration specifiers"
! msgstr "les deux %<__int%d%> et %qs sont dans les spécificateurs de la déclaration"
  
  #: c/c-decl.cc:12684
  #, gcc-internal-format
*************** msgid "%qs without corresponding %qs"
*** 49632,49641 ****
  msgstr "%qs sans %qs correspondant"
  
  #: c/c-parser.cc:2122 cp/semantics.cc:4068
! #, fuzzy, gcc-internal-format
! #| msgid "%<#pragma omp declare target%> without corresponding %<#pragma omp end declare target%>"
  msgid "%<omp begin declare variant%> without corresponding %<omp end declare variant%>"
! msgstr "%<#pragma omp declare target%> sans %<#pragma omp end declare target%> correspondant"
  
  #: c/c-parser.cc:2226 c/c-parser.cc:14906
  #, gcc-internal-format
--- 49429,49437 ----
  msgstr "%qs sans %qs correspondant"
  
  #: c/c-parser.cc:2122 cp/semantics.cc:4068
! #, gcc-internal-format
  msgid "%<omp begin declare variant%> without corresponding %<omp end declare variant%>"
! msgstr "%<omp begin declare variant%> sans %<omp end declare variant%> correspondant"
  
  #: c/c-parser.cc:2226 c/c-parser.cc:14906
  #, gcc-internal-format
*************** msgid "ISO C forbids nested functions"
*** 49796,49811 ****
  msgstr "le C ISO interdit les fonctions imbriquées"
  
  #: c/c-parser.cc:3366
! #, fuzzy, gcc-internal-format
! #| msgid "%<__RTL%> function cannot be compiled with %<-flto%>"
  msgid "%<__RTL%> function cannot be a nested function"
! msgstr "la fonction %<__RTL%> ne peut pas être compilée avec %<-flto%>"
  
  #: c/c-parser.cc:3368
! #, fuzzy, gcc-internal-format
! #| msgid "%<__RTL%> function cannot be compiled with %<-flto%>"
  msgid "%<__GIMPLE%> function cannot be a nested function"
! msgstr "la fonction %<__RTL%> ne peut pas être compilée avec %<-flto%>"
  
  #: c/c-parser.cc:3530 c/c-parser.cc:9828 c/c-parser.cc:16365
  #: c/c-parser.cc:21723 cp/parser.cc:46080
--- 49592,49605 ----
  msgstr "le C ISO interdit les fonctions imbriquées"
  
  #: c/c-parser.cc:3366
! #, gcc-internal-format
  msgid "%<__RTL%> function cannot be a nested function"
! msgstr "la fonction %<__RTL%> ne peut pas être une fonction imbriquée"
  
  #: c/c-parser.cc:3368
! #, gcc-internal-format
  msgid "%<__GIMPLE%> function cannot be a nested function"
! msgstr "la fonction %<__GIMPLE%> ne peut pas être une fonction imbriquée"
  
  #: c/c-parser.cc:3530 c/c-parser.cc:9828 c/c-parser.cc:16365
  #: c/c-parser.cc:21723 cp/parser.cc:46080
*************** msgid "traditional C rejects the unary p
*** 50311,50344 ****
  msgstr "le C traditionnel rejette le plus unaire"
  
  #: c/c-parser.cc:10824
! #, fuzzy, gcc-internal-format
! #| msgid "ISO C does not support if declarations before C2Y"
  msgid "ISO C does not support static assertions in expressions before C2Y"
! msgstr "le C ISO ne supporte pas les déclarations « if » avant C2Y"
  
  #: c/c-parser.cc:10857
! #, fuzzy, gcc-internal-format
! #| msgid "ISO C does not support %qs before C23"
  msgid "ISO C does not support %qs before C2Y"
! msgstr "le C ISO ne supporte pas %qs avant C23"
  
  #: c/c-parser.cc:10897
! #, fuzzy, gcc-internal-format
! #| msgid "storage class specifier in %qE"
  msgid "storage class specifier in %qs"
! msgstr "spécificateur de classe de stockage dans %qE"
  
  #: c/c-parser.cc:10900 c/c-parser.cc:11086
! #, fuzzy, gcc-internal-format
! #| msgid "alignment specified for type name in %qE"
  msgid "alignment specified for type name in %qs"
! msgstr "un alignement est spécifié pour le nom de type dans %qE"
  
  #: c/c-parser.cc:10927
! #, fuzzy, gcc-internal-format
! #| msgid "%<sizeof%> applied to a bit-field"
  msgid "%qs applied to a bit-field"
! msgstr "%<sizeof%> appliqué sur un champ de bits"
  
  #: c/c-parser.cc:11003
  #, gcc-internal-format
--- 50105,50133 ----
  msgstr "le C traditionnel rejette le plus unaire"
  
  #: c/c-parser.cc:10824
! #, gcc-internal-format
  msgid "ISO C does not support static assertions in expressions before C2Y"
! msgstr "le C ISO ne supporte pas les assertions statiques dans les expressions avant C2Y"
  
  #: c/c-parser.cc:10857
! #, gcc-internal-format
  msgid "ISO C does not support %qs before C2Y"
! msgstr "le C ISO ne supporte pas %qs avant C2Y"
  
  #: c/c-parser.cc:10897
! #, gcc-internal-format
  msgid "storage class specifier in %qs"
! msgstr "spécificateur de classe de stockage dans %qs"
  
  #: c/c-parser.cc:10900 c/c-parser.cc:11086
! #, gcc-internal-format
  msgid "alignment specified for type name in %qs"
! msgstr "un alignement est spécifié pour le nom de type dans %qs"
  
  #: c/c-parser.cc:10927
! #, gcc-internal-format
  msgid "%qs applied to a bit-field"
! msgstr "%qs appliqué sur un champ de bits"
  
  #: c/c-parser.cc:11003
  #, gcc-internal-format
*************** msgid "ISO C does not allow %<%E (expres
*** 50356,50371 ****
  msgstr "le C ISO ne permet pas %<%E (expression)%>"
  
  #: c/c-parser.cc:11058
! #, fuzzy, gcc-internal-format
! #| msgid "ISO C99 does not support %qE"
  msgid "ISO C does not support %qs"
! msgstr "le C99 ISO ne supporte pas %qE"
  
  #: c/c-parser.cc:11071
! #, fuzzy, gcc-internal-format
! #| msgid "invalid application of %qs to a void type"
  msgid "invalid application of %qs to something not a type"
! msgstr "utilisation invalide de %qs sur un type void"
  
  #: c/c-parser.cc:11244
  #, gcc-internal-format
--- 50145,50158 ----
  msgstr "le C ISO ne permet pas %<%E (expression)%>"
  
  #: c/c-parser.cc:11058
! #, gcc-internal-format
  msgid "ISO C does not support %qs"
! msgstr "le C ISO ne supporte pas %qs"
  
  #: c/c-parser.cc:11071
! #, gcc-internal-format
  msgid "invalid application of %qs to something not a type"
! msgstr "application invalide de %qs sur quelque chose qui n'est pas un type"
  
  #: c/c-parser.cc:11244
  #, gcc-internal-format
*************** msgid "wrong number of arguments to %<__
*** 50626,50641 ****
  msgstr "mauvais nombre d'arguments pour %<__builtin_counted_by_ref%>"
  
  #: c/c-parser.cc:12923
! #, fuzzy, gcc-internal-format
! #| msgid "the argument to %<__builtin_counted_by_ref%> must be an array"
  msgid "the argument to %<__builtin_counted_by_ref%> must be an array or pointer"
! msgstr "l'argument de %<__builtin_counted_by_ref%> doit être un tableau"
  
  #: c/c-parser.cc:12931
! #, fuzzy, gcc-internal-format
! #| msgid "the argument to %<__builtin_counted_by_ref%> must be an array"
  msgid "the argument to %<__builtin_counted_by_ref%> must be a field of a structure"
! msgstr "l'argument de %<__builtin_counted_by_ref%> doit être un tableau"
  
  #: c/c-parser.cc:12982 c/c-parser.cc:13011 cp/parser.cc:8701
  #, gcc-internal-format
--- 50413,50426 ----
  msgstr "mauvais nombre d'arguments pour %<__builtin_counted_by_ref%>"
  
  #: c/c-parser.cc:12923
! #, gcc-internal-format
  msgid "the argument to %<__builtin_counted_by_ref%> must be an array or pointer"
! msgstr "l'argument de %<__builtin_counted_by_ref%> doit être un tableau ou un pointeur"
  
  #: c/c-parser.cc:12931
! #, gcc-internal-format
  msgid "the argument to %<__builtin_counted_by_ref%> must be a field of a structure"
! msgstr "l'argument de %<__builtin_counted_by_ref%> doit être un champ ou une structure"
  
  #: c/c-parser.cc:12982 c/c-parser.cc:13011 cp/parser.cc:8701
  #, gcc-internal-format
*************** msgid "%<#pragma GCC unroll%> requires a
*** 50868,50877 ****
  msgstr "%<#pragma GCC unroll%> requiert une expression d'affectation qui est évaluée en une constante entière non négative plus petite que %u"
  
  #: c/c-parser.cc:16006 cp/parser.cc:56966
! #, fuzzy, gcc-internal-format
! #| msgid "intervening code must not contain OpenMP directives"
  msgid "intervening code must not contain executable OpenMP directives"
! msgstr "du code intervenant ne peut pas contenir des directives OpenMP"
  
  #: c/c-parser.cc:16026 c/c-parser.cc:26701 c/c-parser.cc:27010
  #: c/c-parser.cc:27073 c/c-parser.cc:27183 cp/parser.cc:51253
--- 50653,50661 ----
  msgstr "%<#pragma GCC unroll%> requiert une expression d'affectation qui est évaluée en une constante entière non négative plus petite que %u"
  
  #: c/c-parser.cc:16006 cp/parser.cc:56966
! #, gcc-internal-format
  msgid "intervening code must not contain executable OpenMP directives"
! msgstr "du code intervenant ne peut pas contenir des directives OpenMP exécutables"
  
  #: c/c-parser.cc:16026 c/c-parser.cc:26701 c/c-parser.cc:27010
  #: c/c-parser.cc:27073 c/c-parser.cc:27183 cp/parser.cc:51253
*************** msgid "%<allocate%> clause %<align%> mod
*** 51175,51200 ****
  msgstr "dans la clause %<allocate%>, l'argument du modificateur %<align%> doit être une expression entière constante positive qui est une puissance de deux"
  
  #: c/c-parser.cc:19726
! #, fuzzy, gcc-internal-format
! #| msgid "expected %<class%> or %<typename%>"
  msgid "expected %<traits%> or %<memspace%>"
! msgstr "%<class%> ou %<typename%> attendu"
  
  #: c/c-parser.cc:19791
  #, gcc-internal-format
  msgid "legacy %<%s(%s)%> traits syntax not allowed in %<uses_allocators%> clause when using modifiers"
! msgstr ""
  
  #: c/c-parser.cc:19809 cp/parser.cc:44110
  #, gcc-internal-format
  msgid "the specification of arguments to %<uses_allocators%> where each item is of the form %<allocator(traits)%> is deprecated since OpenMP 5.2"
! msgstr ""
  
  #: c/c-parser.cc:19817 cp/parser.cc:44118
! #, fuzzy, gcc-internal-format
! #| msgid "%<uses_allocators%> clause with traits and memory spaces"
  msgid "%<uses_allocators%> clause only accepts a single allocator when using modifiers"
! msgstr "clause %<uses_allocators%> avec des trais et des espaces mémoire"
  
  #: c/c-parser.cc:19951 cp/parser.cc:44328
  #, gcc-internal-format
--- 50959,50982 ----
  msgstr "dans la clause %<allocate%>, l'argument du modificateur %<align%> doit être une expression entière constante positive qui est une puissance de deux"
  
  #: c/c-parser.cc:19726
! #, gcc-internal-format
  msgid "expected %<traits%> or %<memspace%>"
! msgstr "%<traits%> ou %<memspace%> attendu"
  
  #: c/c-parser.cc:19791
  #, gcc-internal-format
  msgid "legacy %<%s(%s)%> traits syntax not allowed in %<uses_allocators%> clause when using modifiers"
! msgstr "la syntaxe de trait historique %<%s(%s)%> n'est pas permise dans la clause %<uses_allocators%> en utilisant des modificateurs"
  
  #: c/c-parser.cc:19809 cp/parser.cc:44110
  #, gcc-internal-format
  msgid "the specification of arguments to %<uses_allocators%> where each item is of the form %<allocator(traits)%> is deprecated since OpenMP 5.2"
! msgstr "la spécifications d'arguments à %<uses_allocators%> où chaque élément a la forme %<allocator(traits)%> est dépréciée depuis OpenMP 5.2"
  
  #: c/c-parser.cc:19817 cp/parser.cc:44118
! #, gcc-internal-format
  msgid "%<uses_allocators%> clause only accepts a single allocator when using modifiers"
! msgstr "la clause %<uses_allocators%> n'accepte qu'un seul allocateur lorsque des modificateurs sont utilisés"
  
  #: c/c-parser.cc:19951 cp/parser.cc:44328
  #, gcc-internal-format
*************** msgstr "l'expression %<simdlen%> doit ê
*** 51229,51240 ****
  #: c/c-parser.cc:20459 cp/parser.cc:44919
  #, gcc-internal-format
  msgid "%<sink%> modifier with %<depend%> clause deprecated since OpenMP 5.2, use with %<doacross%>"
! msgstr ""
  
  #: c/c-parser.cc:20468 cp/parser.cc:44928
  #, gcc-internal-format
  msgid "%<source%> modifier with %<depend%> clause deprecated since OpenMP 5.2, use with %<doacross%>"
! msgstr ""
  
  #: c/c-parser.cc:20485 cp/parser.cc:44945
  #, gcc-internal-format
--- 51011,51022 ----
  #: c/c-parser.cc:20459 cp/parser.cc:44919
  #, gcc-internal-format
  msgid "%<sink%> modifier with %<depend%> clause deprecated since OpenMP 5.2, use with %<doacross%>"
! msgstr "le modificateur %<sink%> avec la clause %<depend%> est déprécié depuis OpenMP 5.2, utilisé avec %<doacross%>"
  
  #: c/c-parser.cc:20468 cp/parser.cc:44928
  #, gcc-internal-format
  msgid "%<source%> modifier with %<depend%> clause deprecated since OpenMP 5.2, use with %<doacross%>"
! msgstr "le modificateur %<source%> avec la clause %<depend%> est déprécié depuis OpenMP 5.2, utilisé avec %<doacross%>"
  
  #: c/c-parser.cc:20485 cp/parser.cc:44945
  #, gcc-internal-format
*************** msgid "invalid doacross kind"
*** 51252,51279 ****
  msgstr "type de « doacross » invalide"
  
  #: c/c-parser.cc:20629 cp/parser.cc:45231
! #, fuzzy, gcc-internal-format
! #| msgid "expected %<cancel%> %<if%> clause modifier"
  msgid "expected %<fallback%> modifier"
! msgstr "modificateur de clause %<cancel%> %<if%> attendus"
  
  #: c/c-parser.cc:20646 cp/parser.cc:45255
! #, fuzzy, gcc-internal-format
! #| msgid "expected %<read%>, %<write%>, %<update%>, or %<capture%> clause"
  msgid "expected %<abort%>, %<default_mem%>, or %<null%> as fallback mode"
! msgstr "clause %<read%>, %<write%>,  %<update%> ou %<capture%> attendue"
  
  #: c/c-parser.cc:20675 cp/semantics.cc:8473
! #, fuzzy, gcc-internal-format
! #| msgid "%<priority%> value must be non-negative"
  msgid "%<dyn_groupprivate%> value must be non-negative"
! msgstr "la valeur de %<priority%> doit être positive ou nulle"
  
  #: c/c-parser.cc:20783 cp/parser.cc:45371
! #, fuzzy, gcc-internal-format
! #| msgid "illegal operand "
  msgid "illegal comma"
! msgstr "opérande illégal "
  
  #: c/c-parser.cc:20793 cp/parser.cc:45381
  #, gcc-internal-format
--- 51034,51057 ----
  msgstr "type de « doacross » invalide"
  
  #: c/c-parser.cc:20629 cp/parser.cc:45231
! #, gcc-internal-format
  msgid "expected %<fallback%> modifier"
! msgstr "modificateur %<fallback%> attendu"
  
  #: c/c-parser.cc:20646 cp/parser.cc:45255
! #, gcc-internal-format
  msgid "expected %<abort%>, %<default_mem%>, or %<null%> as fallback mode"
! msgstr "%<abort%>, %<default_mem%> ou %<null%> attendus comme mode de repli"
  
  #: c/c-parser.cc:20675 cp/semantics.cc:8473
! #, gcc-internal-format
  msgid "%<dyn_groupprivate%> value must be non-negative"
! msgstr "la valeur de %<dyn_groupprivate%> doit être positive ou nulle"
  
  #: c/c-parser.cc:20783 cp/parser.cc:45371
! #, gcc-internal-format
  msgid "illegal comma"
! msgstr "virgule illégale"
  
  #: c/c-parser.cc:20793 cp/parser.cc:45381
  #, gcc-internal-format
*************** msgstr "trop de modificateurs %<close%>"
*** 51287,51314 ****
  
  #: c/c-parser.cc:20815 c/c-parser.cc:21307 cp/parser.cc:45155
  #: cp/parser.cc:45409
! #, fuzzy, gcc-internal-format
! #| msgid "too many %<present%> modifiers"
  msgid "too many %<iterator%> modifiers"
! msgstr "trop de modificateurs %<present%>"
  
  #: c/c-parser.cc:20831 cp/parser.cc:45429
! #, fuzzy, gcc-internal-format
! #| msgid "too many %<present%> modifiers"
  msgid "too many %<mapper%> modifiers"
! msgstr "trop de modificateurs %<present%>"
  
  #: c/c-parser.cc:20851 cp/parser.cc:45455
  #, gcc-internal-format
  msgid "in %<declare mapper%> directives, parameter to %<mapper%> modifier must be %<default%>"
! msgstr ""
  
  #: c/c-parser.cc:20867 c/c-parser.cc:29130 cp/parser.cc:45472
  #: cp/parser.cc:55511
! #, fuzzy, gcc-internal-format
! #| msgid "expected identifier or %<(%>"
  msgid "expected identifier or %<default%>"
! msgstr "identificateur ou %<(%> attendu"
  
  #: c/c-parser.cc:20885 c/c-parser.cc:21296 cp/parser.cc:45141
  #: cp/parser.cc:45494
--- 51065,51089 ----
  
  #: c/c-parser.cc:20815 c/c-parser.cc:21307 cp/parser.cc:45155
  #: cp/parser.cc:45409
! #, gcc-internal-format
  msgid "too many %<iterator%> modifiers"
! msgstr "trop de modificateurs %<iterator%>"
  
  #: c/c-parser.cc:20831 cp/parser.cc:45429
! #, gcc-internal-format
  msgid "too many %<mapper%> modifiers"
! msgstr "trop de modificateurs %<mapper%>"
  
  #: c/c-parser.cc:20851 cp/parser.cc:45455
  #, gcc-internal-format
  msgid "in %<declare mapper%> directives, parameter to %<mapper%> modifier must be %<default%>"
! msgstr "dans la directive %<declare mapper%>, le paramètre du modificateur %<mapper%> doit être %<default%>"
  
  #: c/c-parser.cc:20867 c/c-parser.cc:29130 cp/parser.cc:45472
  #: cp/parser.cc:55511
! #, gcc-internal-format
  msgid "expected identifier or %<default%>"
! msgstr "identificateur ou %<default%> attendu"
  
  #: c/c-parser.cc:20885 c/c-parser.cc:21296 cp/parser.cc:45141
  #: cp/parser.cc:45494
*************** msgid "too many %<present%> modifiers"
*** 51317,51331 ****
  msgstr "trop de modificateurs %<present%>"
  
  #: c/c-parser.cc:20894 cp/parser.cc:45506
! #, fuzzy, gcc-internal-format
! #| msgid "%<map%> clause with map-type modifier other than %<always%>, %<close%> or %<present%>"
  msgid "%<map%> clause with map-type modifier other than %<always%>, %<close%>, %<iterator%>, %<mapper%> or %<present%>"
! msgstr "clause %<map%> avec un modificateur de type map autre que %<always%>, %<close%> ou %<present%>"
  
  #: c/c-parser.cc:20906 cp/parser.cc:45521
  #, gcc-internal-format
  msgid "%<map%> clause modifiers without comma separation is deprecated since OpenMP 5.2"
! msgstr ""
  
  #: c/c-parser.cc:20941 cp/parser.cc:45555
  #, gcc-internal-format
--- 51092,51105 ----
  msgstr "trop de modificateurs %<present%>"
  
  #: c/c-parser.cc:20894 cp/parser.cc:45506
! #, gcc-internal-format
  msgid "%<map%> clause with map-type modifier other than %<always%>, %<close%>, %<iterator%>, %<mapper%> or %<present%>"
! msgstr "clause %<map%> avec un modificateur de type map autre que %<always%>, %<close%>, %<iterator%>, %<mapper%> ou %<present%>"
  
  #: c/c-parser.cc:20906 cp/parser.cc:45521
  #, gcc-internal-format
  msgid "%<map%> clause modifiers without comma separation is deprecated since OpenMP 5.2"
! msgstr "modificateurs de clause %<map%> sans virgule de séparation est déprécié depuis OpenMP 5.2"
  
  #: c/c-parser.cc:20941 cp/parser.cc:45555
  #, gcc-internal-format
*************** msgstr "type de « dist_schedule » in
*** 51355,51361 ****
  #: c/c-parser.cc:21157 cp/parser.cc:45772
  #, gcc-internal-format
  msgid "%<master%> affinity deprecated since OpenMP 5.1, use %<primary%>"
! msgstr ""
  
  #: c/c-parser.cc:21180
  #, gcc-internal-format
--- 51129,51135 ----
  #: c/c-parser.cc:21157 cp/parser.cc:45772
  #, gcc-internal-format
  msgid "%<master%> affinity deprecated since OpenMP 5.1, use %<primary%>"
! msgstr "l'affinité %<master%> est dépréciée depuis OpenMP 5.1, utilisez %<primary%>"
  
  #: c/c-parser.cc:21180
  #, gcc-internal-format
*************** msgid "expected %<host%>, %<nohost%> or
*** 51368,51377 ****
  msgstr "%<host%>, %<nohost%> ou %<any%> attendu"
  
  #: c/c-parser.cc:21317 cp/parser.cc:45170
! #, fuzzy, gcc-internal-format
! #| msgid "%<map%> clause with map-type modifier other than %<always%>, %<close%> or %<present%>"
  msgid "%qs clause with modifier other than %<iterator%> or %<present%>"
! msgstr "clause %<map%> avec un modificateur de type map autre que %<always%>, %<close%> ou %<present%>"
  
  #: c/c-parser.cc:21413 cp/semantics.cc:10088 cp/semantics.cc:10106
  #, gcc-internal-format
--- 51142,51150 ----
  msgstr "%<host%>, %<nohost%> ou %<any%> attendu"
  
  #: c/c-parser.cc:21317 cp/parser.cc:45170
! #, gcc-internal-format
  msgid "%qs clause with modifier other than %<iterator%> or %<present%>"
! msgstr "clause %qs avec un modificateur autre que %<iterator%> ou %<present%>"
  
  #: c/c-parser.cc:21413 cp/semantics.cc:10088 cp/semantics.cc:10106
  #, gcc-internal-format
*************** msgstr "nom de l'ensemble du sélecteur
*** 52009,52026 ****
  #: c/c-parser.cc:27993
  #, gcc-internal-format
  msgid "variant %qD is not a function"
! msgstr "le variant %qD n'est pas une fonction"
  
  #: c/c-parser.cc:28005 cp/decl.cc:9304
  #, gcc-internal-format
  msgid "variant %qD is a built-in"
! msgstr "le variant %qD est interne"
  
  #: c/c-parser.cc:28011 cp/decl.cc:9226
! #, fuzzy, gcc-internal-format
! #| msgid "variant %qD is not a function"
  msgid "variant %qD is the same as base function"
! msgstr "le variant %qD n'est pas une fonction"
  
  #: c/c-parser.cc:28065 cp/parser.cc:53629
  #, gcc-internal-format
--- 51782,51798 ----
  #: c/c-parser.cc:27993
  #, gcc-internal-format
  msgid "variant %qD is not a function"
! msgstr "la variante %qD n'est pas une fonction"
  
  #: c/c-parser.cc:28005 cp/decl.cc:9304
  #, gcc-internal-format
  msgid "variant %qD is a built-in"
! msgstr "la variante %qD est interne"
  
  #: c/c-parser.cc:28011 cp/decl.cc:9226
! #, gcc-internal-format
  msgid "variant %qD is the same as base function"
! msgstr "la variante %qD est la même que la fonction de base"
  
  #: c/c-parser.cc:28065 cp/parser.cc:53629
  #, gcc-internal-format
*************** msgid "expected %<interop%>"
*** 52063,52072 ****
  msgstr "%<interop%> attendu"
  
  #: c/c-parser.cc:28245 cp/parser.cc:53838
! #, fuzzy, gcc-internal-format
! #| msgid "expected %<match%>"
  msgid "expected %<match%> clause"
! msgstr "%<match%> attendu"
  
  #: c/c-parser.cc:28261
  #, gcc-internal-format
--- 51835,51843 ----
  msgstr "%<interop%> attendu"
  
  #: c/c-parser.cc:28245 cp/parser.cc:53838
! #, gcc-internal-format
  msgid "expected %<match%> clause"
! msgstr "clause %<match%> attendue"
  
  #: c/c-parser.cc:28261
  #, gcc-internal-format
*************** msgid "an %qs clause can only be specifi
*** 52074,52089 ****
  msgstr "une clause %qs peut uniquement être spécifiée si le sélecteur %<dispatch%> du sélecteur %<construct%> apparaît dans la clause %<match%>"
  
  #: c/c-parser.cc:28288
! #, fuzzy, gcc-internal-format
! #| msgid "%<requires%> selector is not supported yet"
  msgid "%<append_args%> with unprototyped base function is not supported yet"
! msgstr "le sélecteur %<requires%> n'est pas encore supportée"
  
  #: c/c-parser.cc:28291
! #, fuzzy, gcc-internal-format
! #| msgid "built-in %qD declared here"
  msgid "base function %qD declared here"
! msgstr "la fonction interne %qD est déclarée ici"
  
  #: c/c-parser.cc:28326 cp/decl.cc:9286
  #, gcc-internal-format
--- 51845,51858 ----
  msgstr "une clause %qs peut uniquement être spécifiée si le sélecteur %<dispatch%> du sélecteur %<construct%> apparaît dans la clause %<match%>"
  
  #: c/c-parser.cc:28288
! #, gcc-internal-format
  msgid "%<append_args%> with unprototyped base function is not supported yet"
! msgstr "%<append_args%> avec une fonction de base sans prototype n'est pas encore supporté"
  
  #: c/c-parser.cc:28291
! #, gcc-internal-format
  msgid "base function %qD declared here"
! msgstr "la fonction de base %qD est déclarée ici"
  
  #: c/c-parser.cc:28326 cp/decl.cc:9286
  #, gcc-internal-format
*************** msgid "%<append_args%> specified here"
*** 52096,52105 ****
  msgstr "%<append_args%> spécifié ici"
  
  #: c/c-parser.cc:28373
! #, fuzzy, gcc-internal-format
! #| msgid "variant %qD and base %qD have incompatible types"
  msgid "variant %qD and base %qD have incompatible types after %<append_args%> adjustment"
! msgstr "le variant %qD et la base %qD ont des types incompatibles"
  
  #: c/c-parser.cc:28392 cp/decl.cc:9295
  #, gcc-internal-format
--- 51865,51873 ----
  msgstr "%<append_args%> spécifié ici"
  
  #: c/c-parser.cc:28373
! #, gcc-internal-format
  msgid "variant %qD and base %qD have incompatible types after %<append_args%> adjustment"
! msgstr "la variante %qD et la base %qD ont des types incompatibles après l'ajustement de %<append_args%>"
  
  #: c/c-parser.cc:28392 cp/decl.cc:9295
  #, gcc-internal-format
*************** msgid "%<#pragma omp declare %s%> not im
*** 52117,52143 ****
  msgstr "%<#pragma omp declare %s%> pas immédiatement suivi par une seule déclaration ou définition de fonction"
  
  #: c/c-parser.cc:28471
! #, fuzzy, gcc-internal-format
! #| msgid "%<#pragma omp declare %s%> must be followed by function declaration or definition"
  msgid "%<#pragma omp declare %s%> cannot be used with function multi-versioning"
! msgstr "%<#pragma omp declare %s%> doit être suivi d'une déclaration ou une définition de fonction"
  
  #: c/c-parser.cc:28563
! #, fuzzy, gcc-internal-format
! #| msgid "implicit declaration of function %qE"
  msgid "no declaration of base function %qs"
! msgstr "déclaration implicite de la fonction %qE"
  
  #: c/c-parser.cc:28571 cp/parser.cc:25655
! #, fuzzy, gcc-internal-format
! #| msgid "function definition does not declare parameters"
  msgid "variant function definition does not match declaration of %qE"
! msgstr "la définition de fonction ne déclare aucun paramètre"
  
  #: c/c-parser.cc:28729 cp/parser.cc:54284
  #, gcc-internal-format
  msgid "use of %<omp declare target%> as a synonym for %<omp begin declare target%> has been deprecated since OpenMP 5.2"
! msgstr ""
  
  #: c/c-parser.cc:28766 cp/parser.cc:54177
  #, gcc-internal-format
--- 51885,51908 ----
  msgstr "%<#pragma omp declare %s%> pas immédiatement suivi par une seule déclaration ou définition de fonction"
  
  #: c/c-parser.cc:28471
! #, gcc-internal-format
  msgid "%<#pragma omp declare %s%> cannot be used with function multi-versioning"
! msgstr "%<#pragma omp declare %s%> ne peut pas être utilisé avec plusieurs versions d'une fonction"
  
  #: c/c-parser.cc:28563
! #, gcc-internal-format
  msgid "no declaration of base function %qs"
! msgstr "aucune déclaration de la fonction de base %qs"
  
  #: c/c-parser.cc:28571 cp/parser.cc:25655
! #, gcc-internal-format
  msgid "variant function definition does not match declaration of %qE"
! msgstr "la définition de la fonction variante ne correspond pas à la déclaration de %qE"
  
  #: c/c-parser.cc:28729 cp/parser.cc:54284
  #, gcc-internal-format
  msgid "use of %<omp declare target%> as a synonym for %<omp begin declare target%> has been deprecated since OpenMP 5.2"
! msgstr "l'utilisation de %<omp declare target%> comme synonyme de %<omp begin declare target%> est déprécié depuis OpenMP 5.2"
  
  #: c/c-parser.cc:28766 cp/parser.cc:54177
  #, gcc-internal-format
*************** msgid "expected %<match%>"
*** 52165,52180 ****
  msgstr "%<match%> attendu"
  
  #: c/c-parser.cc:28950 c/c-parser.cc:29052 cp/parser.cc:54445
! #, fuzzy, gcc-internal-format
! #| msgid "expected %<none%> or %<present%>"
  msgid "expected %<target%> or %<variant%>"
! msgstr "%<none%> ou %<present%> attendu"
  
  #: c/c-parser.cc:28964 cp/parser.cc:54458
! #, fuzzy, gcc-internal-format
! #| msgid "expected %<declare target%> or %<assumes%>"
  msgid "expected %<declare target%>, %<declare variant%>, or %<assumes%>"
! msgstr "%<declare target%> ou %<assumes%> attendu"
  
  #: c/c-parser.cc:28997 cp/parser.cc:54496
  #, gcc-internal-format
--- 51930,51943 ----
  msgstr "%<match%> attendu"
  
  #: c/c-parser.cc:28950 c/c-parser.cc:29052 cp/parser.cc:54445
! #, gcc-internal-format
  msgid "expected %<target%> or %<variant%>"
! msgstr "%<target%> ou %<variant%> attendu"
  
  #: c/c-parser.cc:28964 cp/parser.cc:54458
! #, gcc-internal-format
  msgid "expected %<declare target%>, %<declare variant%>, or %<assumes%>"
! msgstr "%<declare target%>, %<declare variant%> ou %<assumes%> attendu"
  
  #: c/c-parser.cc:28997 cp/parser.cc:54496
  #, gcc-internal-format
*************** msgid "%qs in pragma syntax terminated w
*** 52194,52215 ****
  msgstr "%qs dans la syntaxe pragma est terminé par %qs dans la syntaxe d'attribut"
  
  #: c/c-parser.cc:29029 cp/parser.cc:54528
! #, fuzzy, gcc-internal-format
! #| msgid "%<#pragma omp declare target%> without corresponding %<#pragma omp end declare target%>"
  msgid "%<#pragma omp end declare variant%> without corresponding %<#pragma omp begin declare variant%>"
! msgstr "%<#pragma omp declare target%> sans %<#pragma omp end declare target%> correspondant"
  
  #: c/c-parser.cc:29039 cp/parser.cc:54538
! #, fuzzy, gcc-internal-format
! #| msgid "%qs in attribute syntax terminated with %qs in pragma syntax"
  msgid "%<begin declare variant%> in attribute syntax terminated with %<end declare variant%> in pragma syntax"
! msgstr "%qs dans la syntaxe d'attribut est terminé par %qs dans la syntaxe pragma"
  
  #: c/c-parser.cc:29044 cp/parser.cc:54543
! #, fuzzy, gcc-internal-format
! #| msgid "%qs in pragma syntax terminated with %qs in attribute syntax"
  msgid "%<begin declare variant%> in pragma syntax terminated with %<end declare variant%> in attribute syntax"
! msgstr "%qs dans la syntaxe pragma est terminé par %qs dans la syntaxe d'attribut"
  
  #: c/c-parser.cc:29086 cp/parser.cc:54585
  #, gcc-internal-format
--- 51957,51975 ----
  msgstr "%qs dans la syntaxe pragma est terminé par %qs dans la syntaxe d'attribut"
  
  #: c/c-parser.cc:29029 cp/parser.cc:54528
! #, gcc-internal-format
  msgid "%<#pragma omp end declare variant%> without corresponding %<#pragma omp begin declare variant%>"
! msgstr "%<#pragma omp end declare variant%> sans %<#pragma omp begin declare variant%> correspondant"
  
  #: c/c-parser.cc:29039 cp/parser.cc:54538
! #, gcc-internal-format
  msgid "%<begin declare variant%> in attribute syntax terminated with %<end declare variant%> in pragma syntax"
! msgstr "%<begin declare variant%> dans la syntaxe d'attribut est terminé par %<end declare variant%> dans la syntaxe pragma"
  
  #: c/c-parser.cc:29044 cp/parser.cc:54543
! #, gcc-internal-format
  msgid "%<begin declare variant%> in pragma syntax terminated with %<end declare variant%> in attribute syntax"
! msgstr "%<begin declare variant%> dans la syntaxe pragma est terminé par %<end declare variant%> dans la syntaxe d'attribut"
  
  #: c/c-parser.cc:29086 cp/parser.cc:54585
  #, gcc-internal-format
*************** msgid "expected %<declare%> or %<assumes
*** 52217,52256 ****
  msgstr "%<declare%> ou %<assumes%> attendu"
  
  #: c/c-parser.cc:29104
! #, fuzzy, gcc-internal-format
! #| msgid "%<#pragma omp declare reduction%> not at file or block scope"
  msgid "%<#pragma omp declare mapper%> not at file or block scope"
! msgstr "%<#pragma omp declare reduction%> pas au niveau d'un fichier ou d'un bloc"
  
  #: c/c-parser.cc:29150
! #, fuzzy, gcc-internal-format
! #| msgid "const, volatile or restrict qualified type in %<#pragma omp declare reduction%>"
  msgid "%qT is not a struct or union type in %<#pragma omp declare mapper%>"
! msgstr "type qualifié par const, volatile ou restrict dans %<#pragma omp declare reduction%>"
  
  #: c/c-parser.cc:29158
! #, fuzzy, gcc-internal-format
! #| msgid "redeclaration of %qs %<#pragma omp declare reduction%> for type %qT"
  msgid "redeclaration of %qs %<#pragma omp declare mapper%> for type %qT"
! msgstr "redéclaration de %qs %<#pragma omp declare reduction%> pour le type %qT"
  
  #: c/c-parser.cc:29166
! #, fuzzy, gcc-internal-format
! #| msgid "%q#T was previously declared here"
  msgid "%<#pragma omp declare mapper%> previously declared here"
! msgstr "%q#T a été précédemment déclaré ici"
  
  #: c/c-parser.cc:29202 cp/parser.cc:55580
! #, fuzzy, gcc-internal-format
! #| msgid "expected class-key"
  msgid "unexpected clause"
! msgstr "mot-clé de type classe (class ou struct) attendu"
  
  #: c/c-parser.cc:29210 cp/parser.cc:55591
! #, fuzzy, gcc-internal-format
! #| msgid "missing %<PHI%> def"
  msgid "missing %<map%> clause"
! msgstr "définition %<PHI%> manquante"
  
  #: c/c-parser.cc:29258
  #, gcc-internal-format
--- 51977,52010 ----
  msgstr "%<declare%> ou %<assumes%> attendu"
  
  #: c/c-parser.cc:29104
! #, gcc-internal-format
  msgid "%<#pragma omp declare mapper%> not at file or block scope"
! msgstr "%<#pragma omp declare mapper%> pas au niveau d'un fichier ou d'un bloc"
  
  #: c/c-parser.cc:29150
! #, gcc-internal-format
  msgid "%qT is not a struct or union type in %<#pragma omp declare mapper%>"
! msgstr "%qT n'est pas un type struct ou union dans %<#pragma omp declare mapper%>"
  
  #: c/c-parser.cc:29158
! #, gcc-internal-format
  msgid "redeclaration of %qs %<#pragma omp declare mapper%> for type %qT"
! msgstr "redéclaration de %qs %<#pragma omp declare mapper%> pour le type %qT"
  
  #: c/c-parser.cc:29166
! #, gcc-internal-format
  msgid "%<#pragma omp declare mapper%> previously declared here"
! msgstr "%<#pragma omp declare mapper%> a été précédemment déclaré ici"
  
  #: c/c-parser.cc:29202 cp/parser.cc:55580
! #, gcc-internal-format
  msgid "unexpected clause"
! msgstr "classe inattendue"
  
  #: c/c-parser.cc:29210 cp/parser.cc:55591
! #, gcc-internal-format
  msgid "missing %<map%> clause"
! msgstr "clause %<map%> manquante"
  
  #: c/c-parser.cc:29258
  #, gcc-internal-format
*************** msgid "redeclaration of %qs %<#pragma om
*** 52283,52292 ****
  msgstr "redéclaration de %qs %<#pragma omp declare reduction%> pour le type %qT"
  
  #: c/c-parser.cc:29362
! #, fuzzy, gcc-internal-format
! #| msgid "previous %<pragma omp declare reduction%> declaration"
  msgid "%<#pragma omp declare reduction%> previously declared here"
! msgstr "déclaration %<pragma omp declare reduction%> précédente"
  
  #: c/c-parser.cc:29483
  #, gcc-internal-format
--- 52037,52045 ----
  msgstr "redéclaration de %qs %<#pragma omp declare reduction%> pour le type %qT"
  
  #: c/c-parser.cc:29362
! #, gcc-internal-format
  msgid "%<#pragma omp declare reduction%> previously declared here"
! msgstr "%<#pragma omp declare reduction%> précédemment déclarée ici"
  
  #: c/c-parser.cc:29483
  #, gcc-internal-format
diff -Nrcpad gcc-16-20260315/gcc/po/sv.po gcc-16-20260322/gcc/po/sv.po
*** gcc-16-20260315/gcc/po/sv.po	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/po/sv.po	Sun Mar 22 22:32:07 2026
*************** msgstr ""
*** 32,38 ****
  "Project-Id-Version: gcc 16.1-b20260222\n"
  "Report-Msgid-Bugs-To: https://gcc.gnu.org/bugs/\n"
  "POT-Creation-Date: 2026-02-19 21:05+0000\n"
! "PO-Revision-Date: 2026-03-12 22:58+0100\n"
  "Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
  "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
  "Language: sv\n"
--- 32,38 ----
  "Project-Id-Version: gcc 16.1-b20260222\n"
  "Report-Msgid-Bugs-To: https://gcc.gnu.org/bugs/\n"
  "POT-Creation-Date: 2026-02-19 21:05+0000\n"
! "PO-Revision-Date: 2026-03-19 22:37+0100\n"
  "Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
  "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
  "Language: sv\n"
*************** msgid "converting an array compound lite
*** 52271,52280 ****
  msgstr "konvertering av en sammansatt vektorlitteral till en pekare medför en hängande pekare i C++"
  
  #: c/c-typeck.cc:3050
! #, fuzzy, gcc-internal-format
! #| msgid "%qE attribute is not allowed for a non-flexible array member field"
  msgid "%<counted_by%> attribute is not allowed for a pointer to structure or union with flexible array member"
! msgstr "attributet %qE är inte tillåtet för ett annat fält än en ickeflexibel vektor"
  
  #: c/c-typeck.cc:3292 c/c-typeck.cc:11224
  #, gcc-internal-format
--- 52271,52279 ----
  msgstr "konvertering av en sammansatt vektorlitteral till en pekare medför en hängande pekare i C++"
  
  #: c/c-typeck.cc:3050
! #, gcc-internal-format
  msgid "%<counted_by%> attribute is not allowed for a pointer to structure or union with flexible array member"
! msgstr ""
  
  #: c/c-typeck.cc:3292 c/c-typeck.cc:11224
  #, gcc-internal-format
*************** msgid "subscripted value is pointer to f
*** 52332,52347 ****
  msgstr "indexerat värde är en funktionspekare"
  
  #: c/c-typeck.cc:3565
! #, fuzzy, gcc-internal-format
! #| msgid "array subscript is not an integer"
  msgid "array subscript is negative"
! msgstr "fältindex är inte ett heltal"
  
  #: c/c-typeck.cc:3578
! #, fuzzy, gcc-internal-format
! #| msgid "ISO C forbids subscripting %<register%> array"
  msgid "ISO C forbids subscripting %<register%> array before C2Y"
! msgstr "ISO C förbjuder indexering av %<register%>-vektor"
  
  #: c/c-typeck.cc:3582
  #, gcc-internal-format
--- 52331,52344 ----
  msgstr "indexerat värde är en funktionspekare"
  
  #: c/c-typeck.cc:3565
! #, gcc-internal-format
  msgid "array subscript is negative"
! msgstr "fältindex är negativt"
  
  #: c/c-typeck.cc:3578
! #, gcc-internal-format
  msgid "ISO C forbids subscripting %<register%> array before C2Y"
! msgstr "ISO C förbjuder indexering av %<register%>-vektor före C2Y"
  
  #: c/c-typeck.cc:3582
  #, gcc-internal-format
*************** msgid "underspecified %qD referenced in
*** 52354,52363 ****
  msgstr "underspecificerad %qD refererad i sin initierare"
  
  #: c/c-typeck.cc:3832
! #, fuzzy, gcc-internal-format
! #| msgid "enum conversion in initialization is invalid in C++"
  msgid "enum constant defined in struct or union is not visible in C++"
! msgstr "enum-konvertering i initiering är ogiltigt i C++"
  
  #: c/c-typeck.cc:3834
  #, gcc-internal-format
--- 52351,52359 ----
  msgstr "underspecificerad %qD refererad i sin initierare"
  
  #: c/c-typeck.cc:3832
! #, gcc-internal-format
  msgid "enum constant defined in struct or union is not visible in C++"
! msgstr ""
  
  #: c/c-typeck.cc:3834
  #, gcc-internal-format
*************** msgid "non-lvalue array in conditional e
*** 52669,52678 ****
  msgstr "icke-l-värde-vektor i villkorsuttryck"
  
  #: c/c-typeck.cc:6613
! #, fuzzy, gcc-internal-format
! #| msgid "defining a type in a compound literal is invalid in C++"
  msgid "different enum types in conditional is invalid in C++: %qT vs %qT"
! msgstr "att definiera en typ i en sammansatt litteral är ogiltigt i C++"
  
  #: c/c-typeck.cc:6673
  #, gcc-internal-format
--- 52665,52673 ----
  msgstr "icke-l-värde-vektor i villkorsuttryck"
  
  #: c/c-typeck.cc:6613
! #, gcc-internal-format
  msgid "different enum types in conditional is invalid in C++: %qT vs %qT"
! msgstr ""
  
  #: c/c-typeck.cc:6673
  #, gcc-internal-format
*************** msgid "function returns address of label
*** 53494,53503 ****
  msgstr "funktionen returnerar adress till en etikett"
  
  #: c/c-typeck.cc:13417
! #, fuzzy, gcc-internal-format
! #| msgid "function returns address of local variable"
  msgid "function returns address of nested function referencing local context"
! msgstr "funktionen returnerar adress till en lokal variabel"
  
  #: c/c-typeck.cc:13510 cp/semantics.cc:1945
  #, gcc-internal-format
--- 53489,53497 ----
  msgstr "funktionen returnerar adress till en etikett"
  
  #: c/c-typeck.cc:13417
! #, gcc-internal-format
  msgid "function returns address of nested function referencing local context"
! msgstr "funktionen returnerar adress till en nästad funktion som referar en lokal kontext"
  
  #: c/c-typeck.cc:13510 cp/semantics.cc:1945
  #, gcc-internal-format
*************** msgid "%qE appears more than once in %<a
*** 53993,54014 ****
  msgstr "%qE förekommer mer än en gång i %<allocate%>-klausuler"
  
  #: c/c-typeck.cc:17296 cp/semantics.cc:8969
! #, fuzzy, gcc-internal-format
! #| msgid "Allocator %qs at %L in USES_ALLOCATORS must be a scalar integer of kind %<omp_allocator_handle_kind%>"
  msgid "allocator %qE must be of %<omp_allocator_handle_t%> type"
! msgstr "Allokeraren %qs vid %L i USES_ALLOCATORS måste vara ett skalärt heltal av sorten %<omp_allocator_handle_kind%>"
  
  #: c/c-typeck.cc:17314 cp/semantics.cc:8990
! #, fuzzy, gcc-internal-format
! #| msgid "Allocator %qs at %L in USES_ALLOCATORS must either a variable or a predefined allocator"
  msgid "allocator %qE must be either a variable or a predefined allocator"
! msgstr "Allokeraren %qs vid %L i USES_ALLOCATORS måste vara antingen en variabel eller en fördefinierad allokerare"
  
  #: c/c-typeck.cc:17328
! #, fuzzy, gcc-internal-format
! #| msgid "The name %qs cannot be used as a defined operator at %C"
  msgid "modifiers cannot be used with predefined allocator %qE"
! msgstr "Namnet %qs får inte användas som en definierad operator vid %C"
  
  #: c/c-typeck.cc:17345 cp/semantics.cc:9022
  #, gcc-internal-format
--- 53987,54005 ----
  msgstr "%qE förekommer mer än en gång i %<allocate%>-klausuler"
  
  #: c/c-typeck.cc:17296 cp/semantics.cc:8969
! #, gcc-internal-format
  msgid "allocator %qE must be of %<omp_allocator_handle_t%> type"
! msgstr ""
  
  #: c/c-typeck.cc:17314 cp/semantics.cc:8990
! #, gcc-internal-format
  msgid "allocator %qE must be either a variable or a predefined allocator"
! msgstr "allokeraren %qE måste vara antingen en variabel eller en fördefinierad allokerare"
  
  #: c/c-typeck.cc:17328
! #, gcc-internal-format
  msgid "modifiers cannot be used with predefined allocator %qE"
! msgstr ""
  
  #: c/c-typeck.cc:17345 cp/semantics.cc:9022
  #, gcc-internal-format
*************** msgid "traits array must be of %<const o
*** 54031,54040 ****
  msgstr ""
  
  #: c/c-typeck.cc:17398 cp/semantics.cc:9082
! #, fuzzy, gcc-internal-format
! #| msgid "array cannot be initialized with a %qs"
  msgid "traits array must be initialized with constants"
! msgstr "vektorer kan inte initierare med en %qs"
  
  #: c/c-typeck.cc:17434 cp/semantics.cc:9119
  #, gcc-internal-format
--- 54022,54030 ----
  msgstr ""
  
  #: c/c-typeck.cc:17398 cp/semantics.cc:9082
! #, gcc-internal-format
  msgid "traits array must be initialized with constants"
! msgstr "egenskapsvektorer måste initieras med konstanter"
  
  #: c/c-typeck.cc:17434 cp/semantics.cc:9119
  #, gcc-internal-format
*************** msgid "second argument to %<va_arg%> is
*** 54232,54241 ****
  msgstr "andra argumentet till %<va_arg%> är en funktionstyp %qT"
  
  #: c/c-typeck.cc:18676 c/c-typeck.cc:18686
! #, fuzzy, gcc-internal-format
! #| msgid "second argument to %<va_arg%> is a function type %qT"
  msgid "second argument to %<va_arg%> is an array type %qT"
! msgstr "andra argumentet till %<va_arg%> är en funktionstyp %qT"
  
  #: c/c-typeck.cc:18682
  #, gcc-internal-format
--- 54222,54230 ----
  msgstr "andra argumentet till %<va_arg%> är en funktionstyp %qT"
  
  #: c/c-typeck.cc:18676 c/c-typeck.cc:18686
! #, gcc-internal-format
  msgid "second argument to %<va_arg%> is an array type %qT"
! msgstr "andra argumentet till %<va_arg%> är en vektortyp %qT"
  
  #: c/c-typeck.cc:18682
  #, gcc-internal-format
*************** msgid "expected constant step for %<__ME
*** 54383,54392 ****
  msgstr "ett konstant steg som operand till %<__MEM%> förväntades"
  
  #: c/gimple-parser.cc:1644
! #, fuzzy, gcc-internal-format
! #| msgid "invalid clique in %qs"
  msgid "invalid clique/base pair"
! msgstr "felaktig klick i %qs"
  
  #: c/gimple-parser.cc:1703
  #, gcc-internal-format
--- 54372,54380 ----
  msgstr "ett konstant steg som operand till %<__MEM%> förväntades"
  
  #: c/gimple-parser.cc:1644
! #, gcc-internal-format
  msgid "invalid clique/base pair"
! msgstr "felaktigt klick/bas-par"
  
  #: c/gimple-parser.cc:1703
  #, gcc-internal-format
*************** msgid "exception '%s'"
*** 54474,54489 ****
  msgstr "undantaget ”%s”"
  
  #: cobol/cobol1.cc:366
! #, fuzzy, gcc-internal-format
! #| msgid "no such exception: 0x%x"
  msgid "no such charset %qs"
! msgstr "inget sådant undantag: 0x%x"
  
  #: cobol/cobol1.cc:372
! #, fuzzy, gcc-internal-format
! #| msgid "unknown assumption clause %qs"
  msgid "no such national charset %qs"
! msgstr "okänd assumption-klausul %qs"
  
  #: cobol/cobol1.cc:435
  #, gcc-internal-format, gfc-internal-format
--- 54462,54475 ----
  msgstr "undantaget ”%s”"
  
  #: cobol/cobol1.cc:366
! #, gcc-internal-format
  msgid "no such charset %qs"
! msgstr ""
  
  #: cobol/cobol1.cc:372
! #, gcc-internal-format
  msgid "no such national charset %qs"
! msgstr ""
  
  #: cobol/cobol1.cc:435
  #, gcc-internal-format, gfc-internal-format
*************** msgid "%s: key must be field"
*** 54871,54880 ****
  msgstr "%s: nyckeln måste vara ett fält"
  
  #: cobol/symbols.cc:4179
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%s%qs%s is invalid"
  msgid "%s: %s %s has invalid encoding"
! msgstr "%s%qs%s är ogiltigt"
  
  #: cobol/symbols.cc:4347 cobol/symbols.cc:4450 cobol/symbols.cc:4480
  #, gcc-internal-format, gfc-internal-format
--- 54857,54865 ----
  msgstr "%s: nyckeln måste vara ett fält"
  
  #: cobol/symbols.cc:4179
! #, gcc-internal-format, gfc-internal-format
  msgid "%s: %s %s has invalid encoding"
! msgstr ""
  
  #: cobol/symbols.cc:4347 cobol/symbols.cc:4450 cobol/symbols.cc:4480
  #, gcc-internal-format, gfc-internal-format
*************** msgid "%s:%d: could not add '%s'"
*** 54882,54891 ****
  msgstr "%s:%d: kunde inte lägga till ”%s”"
  
  #: cobol/util.cc:1767
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%s: %s: %s"
  msgid "%s: %s %lu %s %lu"
! msgstr "%s: %s: %s"
  
  #: cobol/util.cc:1782
  #, gcc-internal-format, gfc-internal-format
--- 54867,54875 ----
  msgstr "%s:%d: kunde inte lägga till ”%s”"
  
  #: cobol/util.cc:1767
! #, gcc-internal-format, gfc-internal-format
  msgid "%s: %s %lu %s %lu"
! msgstr "%s: %s %lu %s %lu"
  
  #: cobol/util.cc:1782
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "konvertering från %qH till %qI
*** 55063,55072 ****
  #. The expression is generated by a trait check, we don't have
  #. a useful location to highlight the label.
  #: cp/call.cc:4942
- #, fuzzy
- #| msgid "cannot convert %qH to %qI"
  msgid "could not convert %qH to %qI"
! msgstr "det går inte att konvertera %qH till %qI"
  
  #: cp/call.cc:4949 cp/cvt.cc:879
  msgid "could not convert %qE from %qH to %qI"
--- 55047,55054 ----
  #. The expression is generated by a trait check, we don't have
  #. a useful location to highlight the label.
  #: cp/call.cc:4942
  msgid "could not convert %qH to %qI"
! msgstr "kunde inte konvertera %qH till %qI"
  
  #: cp/call.cc:4949 cp/cvt.cc:879
  msgid "could not convert %qE from %qH to %qI"
*************** msgid "%q+#D marked %<override%>, but do
*** 55964,55973 ****
  msgstr "%q+#D är markerad %<override%>, men den åsidosätter inte"
  
  #: cp/class.cc:3262
! #, fuzzy, gcc-internal-format
! #| msgid "constructor cannot be static member function"
  msgid "contracts cannot be added to virtual functions"
! msgstr "konstruerare kan inte vara en statisk medlemsfunktion"
  
  #: cp/class.cc:3265
  #, gcc-internal-format
--- 55946,55954 ----
  msgstr "%q+#D är markerad %<override%>, men den åsidosätter inte"
  
  #: cp/class.cc:3262
! #, gcc-internal-format
  msgid "contracts cannot be added to virtual functions"
! msgstr ""
  
  #: cp/class.cc:3265
  #, gcc-internal-format
*************** msgid "invalid return type %qT of %<cons
*** 56452,56467 ****
  msgstr "ogiltig returtyp %qT för %<constexpr%>-funktionen %q+D"
  
  #: cp/constexpr.cc:316
! #, fuzzy, gcc-internal-format
! #| msgid "%<constexpr%> destructors only available with %<-std=c++20%> or %<-std=gnu++20%>"
  msgid "%<constexpr%> constructor in %q#T that has virtual base classes only available with %<-std=c++2c%> or %<-std=gnu++2c%>"
! msgstr "%<constexpr%>-destruerare är endast tillgängliga med %<-std=c++20%> eller %<-std=gnu++20%>"
  
  #: cp/constexpr.cc:320
! #, fuzzy, gcc-internal-format
! #| msgid "%<constexpr%> destructors only available with %<-std=c++20%> or %<-std=gnu++20%>"
  msgid "%<constexpr%> destructor in %q#T that has virtual base classes only available with %<-std=c++2c%> or %<-std=gnu++2c%>"
! msgstr "%<constexpr%>-destruerare är endast tillgängliga med %<-std=c++20%> eller %<-std=gnu++20%>"
  
  #: cp/constexpr.cc:580
  #, gcc-internal-format
--- 56433,56446 ----
  msgstr "ogiltig returtyp %qT för %<constexpr%>-funktionen %q+D"
  
  #: cp/constexpr.cc:316
! #, gcc-internal-format
  msgid "%<constexpr%> constructor in %q#T that has virtual base classes only available with %<-std=c++2c%> or %<-std=gnu++2c%>"
! msgstr ""
  
  #: cp/constexpr.cc:320
! #, gcc-internal-format
  msgid "%<constexpr%> destructor in %q#T that has virtual base classes only available with %<-std=c++2c%> or %<-std=gnu++2c%>"
! msgstr ""
  
  #: cp/constexpr.cc:580
  #, gcc-internal-format
*************** msgid "%qs called after throwing an exce
*** 56509,56554 ****
  msgstr ""
  
  #: cp/constexpr.cc:1757
! #, fuzzy, gcc-internal-format
! #| msgid "%qs applied to non-vector type %qT"
  msgid "%qs called after throwing an exception of type %qT"
! msgstr "%qs använt på %qT som inte är en vektortyp"
  
  #: cp/constexpr.cc:1771
! #, fuzzy, gcc-internal-format
! #| msgid "cannot cast expression of type %qs to %qs"
  msgid "uncaught exception of type %qT; %<what()%>: %qs"
! msgstr "det går inte att göra typkonvertering av typen %qs till typen %qs"
  
  #: cp/constexpr.cc:1785
! #, fuzzy, gcc-internal-format
! #| msgid "no such exception: 0x%x"
  msgid "uncaught exception %qE"
! msgstr "inget sådant undantag: 0x%x"
  
  #: cp/constexpr.cc:1787
! #, fuzzy, gcc-internal-format
! #| msgid "cannot decompose union type %qT"
  msgid "uncaught exception of type %qT"
! msgstr "det går inte att dekomponera unionstypen %qT"
  
  #: cp/constexpr.cc:1911
! #, fuzzy, gcc-internal-format
! #| msgid "%qE attribute not available to functions with variable number of arguments"
  msgid "call to %qD function with incorrect number of arguments"
! msgstr "attributet %qE är inte tillgängligt för funktioner med ett variabelt antal argument"
  
  #: cp/constexpr.cc:1929
! #, fuzzy, gcc-internal-format
! #| msgid "%q+D declared with an exception specification"
  msgid "%qD called with no caught exceptions pending"
! msgstr "%q+D deklarerad med en undantagsspecifikationer"
  
  #: cp/constexpr.cc:2013
! #, fuzzy, gcc-internal-format
! #| msgid "cannot allocate array: size not constant"
  msgid "cannot allocate exception: size not constant"
! msgstr "kan inte allokera vektorn: storleken är inte konstant"
  
  #: cp/constexpr.cc:2033
  #, gcc-internal-format
--- 56488,56526 ----
  msgstr ""
  
  #: cp/constexpr.cc:1757
! #, gcc-internal-format
  msgid "%qs called after throwing an exception of type %qT"
! msgstr ""
  
  #: cp/constexpr.cc:1771
! #, gcc-internal-format
  msgid "uncaught exception of type %qT; %<what()%>: %qs"
! msgstr ""
  
  #: cp/constexpr.cc:1785
! #, gcc-internal-format
  msgid "uncaught exception %qE"
! msgstr ""
  
  #: cp/constexpr.cc:1787
! #, gcc-internal-format
  msgid "uncaught exception of type %qT"
! msgstr ""
  
  #: cp/constexpr.cc:1911
! #, gcc-internal-format
  msgid "call to %qD function with incorrect number of arguments"
! msgstr ""
  
  #: cp/constexpr.cc:1929
! #, gcc-internal-format
  msgid "%qD called with no caught exceptions pending"
! msgstr ""
  
  #: cp/constexpr.cc:2013
! #, gcc-internal-format
  msgid "cannot allocate exception: size not constant"
! msgstr "kan inte allokera undantaget: storleken är inte konstant"
  
  #: cp/constexpr.cc:2033
  #, gcc-internal-format
*************** msgid "first argument to %qD function no
*** 56556,56565 ****
  msgstr ""
  
  #: cp/constexpr.cc:2064 cp/constexpr.cc:2116
! #, fuzzy, gcc-internal-format
! #| msgid "%q+D declared with an exception specification"
  msgid "%qD called with no caught exceptions active"
! msgstr "%q+D deklarerad med en undantagsspecifikationer"
  
  #: cp/constexpr.cc:2154
  #, gcc-internal-format
--- 56528,56536 ----
  msgstr ""
  
  #: cp/constexpr.cc:2064 cp/constexpr.cc:2116
! #, gcc-internal-format
  msgid "%qD called with no caught exceptions active"
! msgstr ""
  
  #: cp/constexpr.cc:2154
  #, gcc-internal-format
*************** msgid "%qD called without %<std::%D%> be
*** 56567,56582 ****
  msgstr ""
  
  #: cp/constexpr.cc:2223
! #, fuzzy, gcc-internal-format
! #| msgid "%qs does not support feature %qs"
  msgid "%qD called without supportable %qs"
! msgstr "%qs stödjer inte funktionen %qs"
  
  #: cp/constexpr.cc:2279
! #, fuzzy, gcc-internal-format
! #| msgid "Procedure unexpected as argument"
  msgid "%qD called with unexpected %qs argument"
! msgstr "En procedur oväntad som argument"
  
  #: cp/constexpr.cc:2307
  #, gcc-internal-format
--- 56538,56551 ----
  msgstr ""
  
  #: cp/constexpr.cc:2223
! #, gcc-internal-format
  msgid "%qD called without supportable %qs"
! msgstr ""
  
  #: cp/constexpr.cc:2279
! #, gcc-internal-format
  msgid "%qD called with unexpected %qs argument"
! msgstr ""
  
  #: cp/constexpr.cc:2307
  #, gcc-internal-format
*************** msgid "%qD called with second argument o
*** 56584,56593 ****
  msgstr ""
  
  #: cp/constexpr.cc:2345
! #, fuzzy, gcc-internal-format
! #| msgid "wrong number of arguments to %qs"
  msgid "wrong number of arguments to %qs call"
! msgstr "fel antal argument till %qs"
  
  #: cp/constexpr.cc:2372
  #, gcc-internal-format
--- 56553,56561 ----
  msgstr ""
  
  #: cp/constexpr.cc:2345
! #, gcc-internal-format
  msgid "wrong number of arguments to %qs call"
! msgstr "fel antal argument till anrop av %qs"
  
  #: cp/constexpr.cc:2372
  #, gcc-internal-format
*************** msgid "constexpr message: %.*s [%r%.*s%R
*** 56604,56613 ****
  msgstr ""
  
  #: cp/constexpr.cc:2457
! #, fuzzy, gcc-internal-format
! #| msgid "%<#pragma message: %s%>"
  msgid "constexpr message: %.*s"
! msgstr "%<#pragma message: %s%>"
  
  #: cp/constexpr.cc:2563 cp/constexpr.cc:4538
  #: rust/backend/rust-constexpr.cc:3510
--- 56572,56580 ----
  msgstr ""
  
  #: cp/constexpr.cc:2457
! #, gcc-internal-format
  msgid "constexpr message: %.*s"
! msgstr ""
  
  #: cp/constexpr.cc:2563 cp/constexpr.cc:4538
  #: rust/backend/rust-constexpr.cc:3510
*************** msgid "accessing uninitialized member %q
*** 56860,56869 ****
  msgstr "använder oinitierad medlem %qD"
  
  #: cp/constexpr.cc:6083
! #, fuzzy, gcc-internal-format
! #| msgid "accessing %qD member instead of initialized %qD member in constant expression"
  msgid "accessing %qD member instead of active %qD member in constant expression"
! msgstr "använder medlem %qD istället för initierad medlem %qD i ett konstant uttryck"
  
  #: cp/constexpr.cc:6096 cp/constexpr.cc:8148
  #: rust/backend/rust-constexpr.cc:1825
--- 56827,56835 ----
  msgstr "använder oinitierad medlem %qD"
  
  #: cp/constexpr.cc:6083
! #, gcc-internal-format
  msgid "accessing %qD member instead of active %qD member in constant expression"
! msgstr "använder medlem %qD istället för aktiv medlem %qD i ett konstant uttryck"
  
  #: cp/constexpr.cc:6096 cp/constexpr.cc:8148
  #: rust/backend/rust-constexpr.cc:1825
*************** msgid "%qs cannot be constant evaluated
*** 56947,56962 ****
  msgstr "%qs kan inte beräknas konstant eftersom argumentet inte kan tolkas"
  
  #: cp/constexpr.cc:7503
! #, fuzzy, gcc-internal-format
! #| msgid "accessing value of %qE through a %qT glvalue in a constant expression"
  msgid "accessing value of %qT object through a %qT glvalue in a constant expression"
! msgstr "använder värdet av %qE genom ett %qT-glvalue i ett konstant uttryck"
  
  #: cp/constexpr.cc:7511
! #, fuzzy, gcc-internal-format
! #| msgid "%qT temporary created here"
  msgid "%qT object created here"
! msgstr "en %qT-temporär skapad här"
  
  #: cp/constexpr.cc:7514 cp/parser.cc:13136 cp/parser.cc:13147
  #: cp/reflect.cc:8428 cp/semantics.cc:4701 cp/semantics.cc:4717
--- 56913,56926 ----
  msgstr "%qs kan inte beräknas konstant eftersom argumentet inte kan tolkas"
  
  #: cp/constexpr.cc:7503
! #, gcc-internal-format
  msgid "accessing value of %qT object through a %qT glvalue in a constant expression"
! msgstr "använder värdet av objektet %qT genom ett %qT-glvalue i ett konstant uttryck"
  
  #: cp/constexpr.cc:7511
! #, gcc-internal-format
  msgid "%qT object created here"
! msgstr "en %qT-objekt skapat här"
  
  #: cp/constexpr.cc:7514 cp/parser.cc:13136 cp/parser.cc:13147
  #: cp/reflect.cc:8428 cp/semantics.cc:4701 cp/semantics.cc:4717
*************** msgid "you can stabilize this value with
*** 57103,57112 ****
  msgstr "man kan stabilisera detta värde med %<--param hardware_destructive_interference_size=%d%>, eller avaktivera denna varning med %<-Wno-interference-size%>"
  
  #: cp/constexpr.cc:9092
! #, fuzzy, gcc-internal-format
! #| msgid "%q+D declared with an exception specification"
  msgid "destructor exited with an exception"
! msgstr "%q+D deklarerad med en undantagsspecifikationer"
  
  #: cp/constexpr.cc:9170
  #, gcc-internal-format
--- 57067,57075 ----
  msgstr "man kan stabilisera detta värde med %<--param hardware_destructive_interference_size=%d%>, eller avaktivera denna varning med %<-Wno-interference-size%>"
  
  #: cp/constexpr.cc:9092
! #, gcc-internal-format
  msgid "destructor exited with an exception"
! msgstr ""
  
  #: cp/constexpr.cc:9170
  #, gcc-internal-format
*************** msgid "temporary of non-literal type %qT
*** 57135,57144 ****
  msgstr "temporär av den ej litterala typen %qT i ett konstant uttryck"
  
  #: cp/constexpr.cc:9670
! #, fuzzy, gcc-internal-format
! #| msgid "invalid return type %qT of %<constexpr%> function %q+D"
  msgid "uncaught exception exited from %<noexcept%> function %qD"
! msgstr "ogiltig returtyp %qT för %<constexpr%>-funktionen %q+D"
  
  #: cp/constexpr.cc:9674
  #, gcc-internal-format
--- 57098,57106 ----
  msgstr "temporär av den ej litterala typen %qT i ett konstant uttryck"
  
  #: cp/constexpr.cc:9670
! #, gcc-internal-format
  msgid "uncaught exception exited from %<noexcept%> function %qD"
! msgstr ""
  
  #: cp/constexpr.cc:9674
  #, gcc-internal-format
*************** msgid "unexpected expression %qE of kind
*** 57213,57228 ****
  msgstr "oväntat uttryck %qE av sorten %s"
  
  #: cp/constexpr.cc:10626
! #, fuzzy, gcc-internal-format
! #| msgid "accessing %qE outside its lifetime"
  msgid "%qE accesses an object outside its lifetime"
! msgstr "åtkomst av %qE utanför sin livstid"
  
  #: cp/constexpr.cc:10764
! #, fuzzy, gcc-internal-format
! #| msgid "'B' operand is not constant"
  msgid "contract condition is not constant"
! msgstr "”B”-operand är ej konstant"
  
  #: cp/constexpr.cc:10770
  #, gcc-internal-format
--- 57175,57188 ----
  msgstr "oväntat uttryck %qE av sorten %s"
  
  #: cp/constexpr.cc:10626
! #, gcc-internal-format
  msgid "%qE accesses an object outside its lifetime"
! msgstr "%qE använder ett objekt utanför dess livstid"
  
  #: cp/constexpr.cc:10764
! #, gcc-internal-format
  msgid "contract condition is not constant"
! msgstr "kontraktsvillkoret är ej konstant"
  
  #: cp/constexpr.cc:10770
  #, gcc-internal-format
*************** msgid "contract predicate is false in co
*** 57230,57251 ****
  msgstr "kontraktspredikatet är falskt i ett konstant uttryck"
  
  #: cp/constexpr.cc:10955
! #, fuzzy, gcc-internal-format
! #| msgid "break statement not within loop or switch"
  msgid "%<break%> outside of a loop or %<switch%>"
! msgstr "break-sats som inte är i en loop eller switch"
  
  #: cp/constexpr.cc:10957
! #, fuzzy, gcc-internal-format
! #| msgid "%<friend%> used outside of class"
  msgid "%<continue%> outside of a loop"
! msgstr "%<friend%> använd utanför en klass"
  
  #: cp/constexpr.cc:10959
! #, fuzzy, gcc-internal-format
! #| msgid "jump into statement expression"
  msgid "%<return%> in a statement expression"
! msgstr "hopp in i satsuttryck"
  
  #: cp/constexpr.cc:11000 rust/backend/rust-constexpr.cc:5382
  #, gcc-internal-format
--- 57190,57208 ----
  msgstr "kontraktspredikatet är falskt i ett konstant uttryck"
  
  #: cp/constexpr.cc:10955
! #, gcc-internal-format
  msgid "%<break%> outside of a loop or %<switch%>"
! msgstr ""
  
  #: cp/constexpr.cc:10957
! #, gcc-internal-format
  msgid "%<continue%> outside of a loop"
! msgstr ""
  
  #: cp/constexpr.cc:10959
! #, gcc-internal-format
  msgid "%<return%> in a statement expression"
! msgstr "%<return%> in i ett satsuttryck"
  
  #: cp/constexpr.cc:11000 rust/backend/rust-constexpr.cc:5382
  #, gcc-internal-format
*************** msgid "%qE is not a constant expression
*** 57253,57262 ****
  msgstr "%qE är inte ett konstant uttryck eftersom det har referenser till muterbara delobjekt av %qT"
  
  #: cp/constexpr.cc:11016
! #, fuzzy, gcc-internal-format
! #| msgid "%qE is not a constant expression because it refers to a result of %<operator new%>"
  msgid "%qE is not a constant expression because it refers to exception object allocated with %<__cxa_allocate_exception%>"
! msgstr "%qE är inte ett konstant uttryck eftersom det refererar ett resultat av %<operator new%>"
  
  #: cp/constexpr.cc:11020 rust/backend/rust-constexpr.cc:5407
  #, gcc-internal-format
--- 57210,57218 ----
  msgstr "%qE är inte ett konstant uttryck eftersom det har referenser till muterbara delobjekt av %qT"
  
  #: cp/constexpr.cc:11016
! #, gcc-internal-format
  msgid "%qE is not a constant expression because it refers to exception object allocated with %<__cxa_allocate_exception%>"
! msgstr ""
  
  #: cp/constexpr.cc:11020 rust/backend/rust-constexpr.cc:5407
  #, gcc-internal-format
*************** msgid "the operand %qE is unsatisfied be
*** 57517,57598 ****
  msgstr "operanden %qE är ouppfylld för att"
  
  #: cp/constraint.cc:3138
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not nothrow copy assignable"
  msgid "%qT is not nothrow copy assignable"
! msgstr "  %qT är inte nothrow-kopieringstilldelningsbar"
  
  #: cp/constraint.cc:3141
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not nothrow default constructible"
  msgid "%qT is not nothrow default constructible"
! msgstr "  %qT är inte nothrow-standardkonstruerbart"
  
  #: cp/constraint.cc:3144
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not nothrow copy constructible"
  msgid "%qT is not nothrow copy constructible"
! msgstr "  %qT är inte nothrow-kopieringskonstruerbar"
  
  #: cp/constraint.cc:3147
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not trivially copy assignable"
  msgid "%qT is not trivially copy assignable"
! msgstr "  %qT är inte trivialt kopieringstilldelningsbart"
  
  #: cp/constraint.cc:3150
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not trivially default constructible"
  msgid "%qT is not trivially default constructible"
! msgstr "  %qT är inte trivialt standardkonstruerbart"
  
  #: cp/constraint.cc:3153
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not trivially copy constructible"
  msgid "%qT is not trivially copy constructible"
! msgstr "  %qT är inte trivialt kopieringskonstruerbart"
  
  #: cp/constraint.cc:3156
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not trivially destructible"
  msgid "%qT is not trivially destructible"
! msgstr "  %qT är inte trivialt destruerbart"
  
  #: cp/constraint.cc:3159
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT does not have unique object representations"
  msgid "%qT does not have unique object representations, because"
! msgstr "  %qT har inte unika objektrepresentationer"
  
  #: cp/constraint.cc:3169
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT does not have a virtual destructor"
  msgid "%qT does not have a virtual destructor"
! msgstr "  %qT har inte en virtuell destruerare"
  
  #: cp/constraint.cc:3173
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not an abstract class"
  msgid "%qT is not an abstract class"
! msgstr "  %qT är inte en abstrakt klass"
  
  #: cp/constraint.cc:3176
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not an aggregate"
  msgid "%qT is not an aggregate"
! msgstr "  %qT är inte ett aggregat"
  
  #: cp/constraint.cc:3179
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not an array"
  msgid "%qT is not an array"
! msgstr "  %qT är inte en vektor"
  
  #: cp/constraint.cc:3182
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not assignable from %qT"
  msgid "%qT is not assignable from %qT, because"
! msgstr "  %qT är inte tilldelningsbar från %qT"
  
  #: cp/constraint.cc:3186 cp/semantics.cc:13525 cp/typeck.cc:3701
  #, gcc-internal-format
--- 57473,57541 ----
  msgstr "operanden %qE är ouppfylld för att"
  
  #: cp/constraint.cc:3138
! #, gcc-internal-format
  msgid "%qT is not nothrow copy assignable"
! msgstr "%qT är inte nothrow-kopieringstilldelningsbar"
  
  #: cp/constraint.cc:3141
! #, gcc-internal-format
  msgid "%qT is not nothrow default constructible"
! msgstr "%qT är inte nothrow-standardkonstruerbart"
  
  #: cp/constraint.cc:3144
! #, gcc-internal-format
  msgid "%qT is not nothrow copy constructible"
! msgstr "%qT är inte nothrow-kopieringskonstruerbar"
  
  #: cp/constraint.cc:3147
! #, gcc-internal-format
  msgid "%qT is not trivially copy assignable"
! msgstr "%qT är inte trivialt kopieringstilldelningsbart"
  
  #: cp/constraint.cc:3150
! #, gcc-internal-format
  msgid "%qT is not trivially default constructible"
! msgstr "%qT är inte trivialt standardkonstruerbart"
  
  #: cp/constraint.cc:3153
! #, gcc-internal-format
  msgid "%qT is not trivially copy constructible"
! msgstr "%qT är inte trivialt kopieringskonstruerbart"
  
  #: cp/constraint.cc:3156
! #, gcc-internal-format
  msgid "%qT is not trivially destructible"
! msgstr "%qT är inte trivialt destruerbart"
  
  #: cp/constraint.cc:3159
! #, gcc-internal-format
  msgid "%qT does not have unique object representations, because"
! msgstr "%qT har inte unika objektrepresentationer, eftersom"
  
  #: cp/constraint.cc:3169
! #, gcc-internal-format
  msgid "%qT does not have a virtual destructor"
! msgstr "%qT har inte en virtuell destruerare"
  
  #: cp/constraint.cc:3173
! #, gcc-internal-format
  msgid "%qT is not an abstract class"
! msgstr "%qT är inte en abstrakt klass"
  
  #: cp/constraint.cc:3176
! #, gcc-internal-format
  msgid "%qT is not an aggregate"
! msgstr "%qT är inte ett aggregat"
  
  #: cp/constraint.cc:3179
! #, gcc-internal-format
  msgid "%qT is not an array"
! msgstr "%qT är inte en vektor"
  
  #: cp/constraint.cc:3182
! #, gcc-internal-format
  msgid "%qT is not assignable from %qT, because"
! msgstr "%qT är inte tilldelningsbar från %qT, eftersom"
  
  #: cp/constraint.cc:3186 cp/semantics.cc:13525 cp/typeck.cc:3701
  #, gcc-internal-format
*************** msgid "%qT is not a base of %qT"
*** 57600,57909 ****
  msgstr "%qT är inte en basklass till %qT"
  
  #: cp/constraint.cc:3189
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a bounded array"
  msgid "%qT is not a bounded array"
! msgstr "  %qT är inte en begränsad vektor"
  
  #: cp/constraint.cc:3192
! #, fuzzy, gcc-internal-format
! #| msgid "%q#T is not a class"
  msgid "%qT is not a class"
! msgstr "%q#T är inte en klass"
  
  #: cp/constraint.cc:3195
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a const type"
  msgid "%qT is not a const type"
! msgstr "  %qT är inte en const-typ"
  
  #: cp/constraint.cc:3199
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not default constructible"
  msgid "%qT is not default constructible, because"
! msgstr "  %qT är inte standardkonstruerbar"
  
  #: cp/constraint.cc:3201
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not constructible from %qE"
  msgid "%qT is not constructible from %qT, because"
! msgstr "  %qT är inte konstruerbar från %qE"
  
  #: cp/constraint.cc:3210
! #, fuzzy, gcc-internal-format
! #| msgid "%q+T is not literal because:"
  msgid "%qT is not destructible, because"
! msgstr "%q+T är inte litteral för att:"
  
  #: cp/constraint.cc:3214
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not an empty class"
  msgid "%qT is not an empty class"
! msgstr "  %qT är inte en tom klass"
  
  #: cp/constraint.cc:3217
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not an enum"
  msgid "%qT is not an enum"
! msgstr "  %qT är inte en uppräkningstyp"
  
  #: cp/constraint.cc:3220
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a final class"
  msgid "%qT is not a final class"
! msgstr "  %qT är inte en slutlig klass"
  
  #: cp/constraint.cc:3223
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a function"
  msgid "%qT is not a function"
! msgstr "  %qT är inte en funktion"
  
  #: cp/constraint.cc:3226
! #, fuzzy, gcc-internal-format
! #| msgid "%qT is not a template type"
  msgid "%qT is not an implicit-lifetime type"
! msgstr "%qT är inte en malltyp"
  
  #: cp/constraint.cc:3231
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not invocable"
  msgid "%qT is not invocable, because"
! msgstr "  %qT är inte anropbar"
  
  #: cp/constraint.cc:3233
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not invocable by %qE"
  msgid "%qT is not invocable by %qT, because"
! msgstr "  %qT är inte anropbar av %qE"
  
  #: cp/constraint.cc:3238
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not layout compatible with %qT"
  msgid "%qT is not layout compatible with %qT, because"
! msgstr "  %qT är inte layoutkompatibel med %qT"
  
  #: cp/constraint.cc:3242
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a literal type"
  msgid "%qT is not a literal type"
! msgstr "  %qT är inte en literal typ"
  
  #: cp/constraint.cc:3245
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a member function pointer"
  msgid "%qT is not a member function pointer"
! msgstr "  %qT är inte en medlemsfunktionspekare"
  
  #: cp/constraint.cc:3248
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a member object pointer"
  msgid "%qT is not a member object pointer"
! msgstr "  %qT är inte en medlemsobjektspekare"
  
  #: cp/constraint.cc:3251
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a member pointer"
  msgid "%qT is not a member pointer"
! msgstr "  %qT är inte en medlemspekare"
  
  #: cp/constraint.cc:3254
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not nothrow assignable from %qT"
  msgid "%qT is not nothrow assignable from %qT, because"
! msgstr "  %qT är inte nothrow-tilldelningsbar från %qT"
  
  #: cp/constraint.cc:3259
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not nothrow default constructible"
  msgid "%qT is not nothrow default constructible, because"
! msgstr "  %qT är inte nothrow-standardkonstruerbart"
  
  #: cp/constraint.cc:3261
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not nothrow constructible from %qE"
  msgid "%qT is not nothrow constructible from %qT, because"
! msgstr "  %qT är inte nothrow-konstruerbar från %qE"
  
  #: cp/constraint.cc:3266
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not nothrow convertible from %qE"
  msgid "%qT is not nothrow convertible from %qT, because"
! msgstr "  %qT är inte nothrow-konvertibel från %qE"
  
  #: cp/constraint.cc:3270
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not nothrow default constructible"
  msgid "%qT is not nothrow destructible, because"
! msgstr "  %qT är inte nothrow-standardkonstruerbart"
  
  #: cp/constraint.cc:3276
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not nothrow invocable"
  msgid "%qT is not nothrow invocable, because"
! msgstr "  %qT är inte nothrow-anropbar"
  
  #: cp/constraint.cc:3278
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not nothrow invocable by %qE"
  msgid "%qT is not nothrow invocable by %qT, because"
! msgstr "  %qT är inte nothrow-anropbar av %qE"
  
  #: cp/constraint.cc:3285
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not an object type"
  msgid "%qT is not an object type"
! msgstr "  %qT är inte en objekttyp"
  
  #: cp/constraint.cc:3289
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not pointer-interconvertible base of %qT"
  msgid "%qT is not a pointer-interconvertible base of %qT, because"
! msgstr "  %qT är inte en pekarinterkonvertibel bas till %qT"
  
  #: cp/constraint.cc:3294
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a POD type"
  msgid "%qT is not a POD type"
! msgstr "  %qT är inte en POD-typ"
  
  #: cp/constraint.cc:3297
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a pointer"
  msgid "%qT is not a pointer"
! msgstr "  %qT är inte en pekare"
  
  #: cp/constraint.cc:3300
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a polymorphic type"
  msgid "%qT is not a polymorphic type"
! msgstr "  %qT är inte en polymorf typ"
  
  #: cp/constraint.cc:3303
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a reference"
  msgid "%qT is not a reference"
! msgstr "  %qT är inte en referens"
  
  #: cp/constraint.cc:3306
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not the same as %qT"
  msgid "%q#T is not the same as %q#T"
! msgstr "  %qT är inte en detsamma som %qT"
  
  #: cp/constraint.cc:3309
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a scoped enum"
  msgid "%qT is not a scoped enum"
! msgstr "  %qT är inte en enum med räckvidd"
  
  #: cp/constraint.cc:3312
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not an standard layout type"
  msgid "%qT is not a standard layout type"
! msgstr "  %qT är inte en standardlayouttyp"
  
  #: cp/constraint.cc:3315
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a trivial type"
  msgid "%qT is not a trivial type"
! msgstr "  %qT är inte en trivial typ"
  
  #: cp/constraint.cc:3318
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not trivially assignable from %qT"
  msgid "%qT is not trivially assignable from %qT, because"
! msgstr "  %qT är inte trivialt tilldelningsbar från %qT"
  
  #: cp/constraint.cc:3323
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not trivially default constructible"
  msgid "%qT is not trivially default constructible, because"
! msgstr "  %qT är inte trivialt standardkonstruerbart"
  
  #: cp/constraint.cc:3325
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not trivially constructible from %qE"
  msgid "%qT is not trivially constructible from %qT, because"
! msgstr "  %qT är inte trivialt konstruerbar från %qE"
  
  #: cp/constraint.cc:3330 cp/tree.cc:5014
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not trivially copyable"
  msgid "%qT is not trivially copyable"
! msgstr "  %qT är inte trivialt kopierbar"
  
  #: cp/constraint.cc:3333
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not trivially destructible"
  msgid "%qT is not trivially destructible, because"
! msgstr "  %qT är inte trivialt destruerbart"
  
  #: cp/constraint.cc:3337
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not an unbounded array"
  msgid "%qT is not an unbounded array"
! msgstr "  %qT är inte en obegränsad vektor"
  
  #: cp/constraint.cc:3340
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a union"
  msgid "%qT is not a union"
! msgstr "  %qT är inte en union"
  
  #: cp/constraint.cc:3343
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a virtual base of %qT"
  msgid "%qT is not a virtual base of %qT"
! msgstr "  %qT är inte en virtuell bas till %qT"
  
  #: cp/constraint.cc:3346
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a volatile type"
  msgid "%qT is not a volatile type"
! msgstr "  %qT är inte en volatile-typ"
  
  #: cp/constraint.cc:3349
! #, fuzzy, gcc-internal-format
! #| msgid "%q#D is not const"
  msgid "%qT is not consteval-only"
! msgstr "%q#D är inte const"
  
  #: cp/constraint.cc:3352
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT cannot yield a rank"
  msgid "%qT cannot yield a rank"
! msgstr "  %qT kan inte ge en ordning"
  
  #: cp/constraint.cc:3355
! #, fuzzy, gcc-internal-format
! #| msgid "%qs and %qs cannot both be enabled"
  msgid "%qT and %qT cannot be ordered"
! msgstr "%qs och %qs kan inte båda aktiveras"
  
  #: cp/constraint.cc:3358
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not default constructible"
  msgid "%qT is not destructurable"
! msgstr "  %qT är inte standardkonstruerbar"
  
  #: cp/constraint.cc:3361
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a reference that binds to a temporary object of type %qT (direct-initialization)"
  msgid "%qT is not a reference that binds to a temporary object of type %qT (direct-initialization)"
! msgstr "  %qT är inte en referens som binder till ett temporärt objekt med typen %qT (direktinitiering)"
  
  #: cp/constraint.cc:3365
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a reference that binds to a temporary object of type %qT (copy-initialization)"
  msgid "%qT is not a reference that binds to a temporary object of type %qT (copy-initialization)"
! msgstr "  %qT är inte en referens som binder till ett temporärt objekt med typen %qT (kopieringsinitiering)"
  
  #: cp/constraint.cc:3369
! #, fuzzy, gcc-internal-format
! #| msgid "  %qD is not deducible from %qT"
  msgid "%qD is not deducible from %qT"
! msgstr "  %qD är inte härledbar från %qT"
  
  #: cp/constraint.cc:3436
  #, gcc-internal-format
--- 57543,57801 ----
  msgstr "%qT är inte en basklass till %qT"
  
  #: cp/constraint.cc:3189
! #, gcc-internal-format
  msgid "%qT is not a bounded array"
! msgstr "%qT är inte en begränsad vektor"
  
  #: cp/constraint.cc:3192
! #, gcc-internal-format
  msgid "%qT is not a class"
! msgstr "%qT är inte en klass"
  
  #: cp/constraint.cc:3195
! #, gcc-internal-format
  msgid "%qT is not a const type"
! msgstr "%qT är inte en const-typ"
  
  #: cp/constraint.cc:3199
! #, gcc-internal-format
  msgid "%qT is not default constructible, because"
! msgstr "%qT är inte standardkonstruerbar, eftersom"
  
  #: cp/constraint.cc:3201
! #, gcc-internal-format
  msgid "%qT is not constructible from %qT, because"
! msgstr "%qT är inte konstruerbar från %qT, eftersom"
  
  #: cp/constraint.cc:3210
! #, gcc-internal-format
  msgid "%qT is not destructible, because"
! msgstr "%qT är inte destruerbar, eftersom"
  
  #: cp/constraint.cc:3214
! #, gcc-internal-format
  msgid "%qT is not an empty class"
! msgstr "%qT är inte en tom klass"
  
  #: cp/constraint.cc:3217
! #, gcc-internal-format
  msgid "%qT is not an enum"
! msgstr "%qT är inte en uppräkningstyp"
  
  #: cp/constraint.cc:3220
! #, gcc-internal-format
  msgid "%qT is not a final class"
! msgstr "%qT är inte en slutlig klass"
  
  #: cp/constraint.cc:3223
! #, gcc-internal-format
  msgid "%qT is not a function"
! msgstr "%qT är inte en funktion"
  
  #: cp/constraint.cc:3226
! #, gcc-internal-format
  msgid "%qT is not an implicit-lifetime type"
! msgstr "%qT är inte en typ med implicit livslängd"
  
  #: cp/constraint.cc:3231
! #, gcc-internal-format
  msgid "%qT is not invocable, because"
! msgstr "%qT är inte anropbar, eftersom"
  
  #: cp/constraint.cc:3233
! #, gcc-internal-format
  msgid "%qT is not invocable by %qT, because"
! msgstr "%qT är inte anropbar av %qT, eftersom"
  
  #: cp/constraint.cc:3238
! #, gcc-internal-format
  msgid "%qT is not layout compatible with %qT, because"
! msgstr "%qT är inte layoutkompatibel med %qT, eftersom"
  
  #: cp/constraint.cc:3242
! #, gcc-internal-format
  msgid "%qT is not a literal type"
! msgstr "%qT är inte en literal typ"
  
  #: cp/constraint.cc:3245
! #, gcc-internal-format
  msgid "%qT is not a member function pointer"
! msgstr "%qT är inte en medlemsfunktionspekare"
  
  #: cp/constraint.cc:3248
! #, gcc-internal-format
  msgid "%qT is not a member object pointer"
! msgstr "%qT är inte en medlemsobjektspekare"
  
  #: cp/constraint.cc:3251
! #, gcc-internal-format
  msgid "%qT is not a member pointer"
! msgstr "%qT är inte en medlemspekare"
  
  #: cp/constraint.cc:3254
! #, gcc-internal-format
  msgid "%qT is not nothrow assignable from %qT, because"
! msgstr "%qT är inte nothrow-tilldelningsbar från %qT"
  
  #: cp/constraint.cc:3259
! #, gcc-internal-format
  msgid "%qT is not nothrow default constructible, because"
! msgstr "%qT är inte nothrow-standardkonstruerbart, eftersom"
  
  #: cp/constraint.cc:3261
! #, gcc-internal-format
  msgid "%qT is not nothrow constructible from %qT, because"
! msgstr "%qT är inte nothrow-konstruerbar från %qT, eftersom"
  
  #: cp/constraint.cc:3266
! #, gcc-internal-format
  msgid "%qT is not nothrow convertible from %qT, because"
! msgstr "%qT är inte nothrow-konvertibel från %qT, eftersom"
  
  #: cp/constraint.cc:3270
! #, gcc-internal-format
  msgid "%qT is not nothrow destructible, because"
! msgstr "%qT är inte nothrow-destruerbar, eftersom"
  
  #: cp/constraint.cc:3276
! #, gcc-internal-format
  msgid "%qT is not nothrow invocable, because"
! msgstr "%qT är inte nothrow-anropbar, eftersom"
  
  #: cp/constraint.cc:3278
! #, gcc-internal-format
  msgid "%qT is not nothrow invocable by %qT, because"
! msgstr "%qT är inte nothrow-anropbar av %qT, eftersom"
  
  #: cp/constraint.cc:3285
! #, gcc-internal-format
  msgid "%qT is not an object type"
! msgstr "%qT är inte en objekttyp"
  
  #: cp/constraint.cc:3289
! #, gcc-internal-format
  msgid "%qT is not a pointer-interconvertible base of %qT, because"
! msgstr "%qT är inte en pekarinterkonvertibel bas till %qT, eftersom"
  
  #: cp/constraint.cc:3294
! #, gcc-internal-format
  msgid "%qT is not a POD type"
! msgstr "%qT är inte en POD-typ"
  
  #: cp/constraint.cc:3297
! #, gcc-internal-format
  msgid "%qT is not a pointer"
! msgstr "%qT är inte en pekare"
  
  #: cp/constraint.cc:3300
! #, gcc-internal-format
  msgid "%qT is not a polymorphic type"
! msgstr "%qT är inte en polymorf typ"
  
  #: cp/constraint.cc:3303
! #, gcc-internal-format
  msgid "%qT is not a reference"
! msgstr "%qT är inte en referens"
  
  #: cp/constraint.cc:3306
! #, gcc-internal-format
  msgid "%q#T is not the same as %q#T"
! msgstr "%q#T är inte en detsamma som %q#T"
  
  #: cp/constraint.cc:3309
! #, gcc-internal-format
  msgid "%qT is not a scoped enum"
! msgstr "%qT är inte en enum med räckvidd"
  
  #: cp/constraint.cc:3312
! #, gcc-internal-format
  msgid "%qT is not a standard layout type"
! msgstr "%qT är inte en standardlayouttyp"
  
  #: cp/constraint.cc:3315
! #, gcc-internal-format
  msgid "%qT is not a trivial type"
! msgstr "%qT är inte en trivial typ"
  
  #: cp/constraint.cc:3318
! #, gcc-internal-format
  msgid "%qT is not trivially assignable from %qT, because"
! msgstr "%qT är inte trivialt tilldelningsbar från %qT, eftersom"
  
  #: cp/constraint.cc:3323
! #, gcc-internal-format
  msgid "%qT is not trivially default constructible, because"
! msgstr "%qT är inte trivialt standardkonstruerbart, eftersom"
  
  #: cp/constraint.cc:3325
! #, gcc-internal-format
  msgid "%qT is not trivially constructible from %qT, because"
! msgstr "%qT är inte trivialt konstruerbar från %qT, eftersom"
  
  #: cp/constraint.cc:3330 cp/tree.cc:5014
! #, gcc-internal-format
  msgid "%qT is not trivially copyable"
! msgstr "%qT är inte trivialt kopierbar"
  
  #: cp/constraint.cc:3333
! #, gcc-internal-format
  msgid "%qT is not trivially destructible, because"
! msgstr "%qT är inte trivialt destruerbart, eftersom"
  
  #: cp/constraint.cc:3337
! #, gcc-internal-format
  msgid "%qT is not an unbounded array"
! msgstr "%qT är inte en obegränsad vektor"
  
  #: cp/constraint.cc:3340
! #, gcc-internal-format
  msgid "%qT is not a union"
! msgstr "%qT är inte en union"
  
  #: cp/constraint.cc:3343
! #, gcc-internal-format
  msgid "%qT is not a virtual base of %qT"
! msgstr "%qT är inte en virtuell bas till %qT"
  
  #: cp/constraint.cc:3346
! #, gcc-internal-format
  msgid "%qT is not a volatile type"
! msgstr "%qT är inte en volatile-typ"
  
  #: cp/constraint.cc:3349
! #, gcc-internal-format
  msgid "%qT is not consteval-only"
! msgstr "%qT är inte endast consteval"
  
  #: cp/constraint.cc:3352
! #, gcc-internal-format
  msgid "%qT cannot yield a rank"
! msgstr "%qT kan inte ge en ordning"
  
  #: cp/constraint.cc:3355
! #, gcc-internal-format
  msgid "%qT and %qT cannot be ordered"
! msgstr ""
  
  #: cp/constraint.cc:3358
! #, gcc-internal-format
  msgid "%qT is not destructurable"
! msgstr "%qT är inte destruerbar"
  
  #: cp/constraint.cc:3361
! #, gcc-internal-format
  msgid "%qT is not a reference that binds to a temporary object of type %qT (direct-initialization)"
! msgstr "%qT är inte en referens som binder till ett temporärt objekt med typen %qT (direktinitiering)"
  
  #: cp/constraint.cc:3365
! #, gcc-internal-format
  msgid "%qT is not a reference that binds to a temporary object of type %qT (copy-initialization)"
! msgstr "%qT är inte en referens som binder till ett temporärt objekt med typen %qT (kopieringsinitiering)"
  
  #: cp/constraint.cc:3369
! #, gcc-internal-format
  msgid "%qD is not deducible from %qT"
! msgstr "%qD är inte härledbar från %qT"
  
  #: cp/constraint.cc:3436
  #, gcc-internal-format
*************** msgid "set %qs to at least %d for more d
*** 57931,57940 ****
  msgstr "sätt %qs till åtminstone %d för fler detaljer"
  
  #: cp/contracts.cc:183
! #, fuzzy, gcc-internal-format
! #| msgid "mismatched contract condition in declaration"
  msgid "mismatched contract specifier in declaration"
! msgstr "kontraktsvillkor som inte stämmer i deklaration"
  
  #: cp/contracts.cc:184 cp/contracts.cc:209
  #, gcc-internal-format
--- 57823,57831 ----
  msgstr "sätt %qs till åtminstone %d för fler detaljer"
  
  #: cp/contracts.cc:183
! #, gcc-internal-format
  msgid "mismatched contract specifier in declaration"
! msgstr "kontraktsspecificerare som inte stämmer i deklaration"
  
  #: cp/contracts.cc:184 cp/contracts.cc:209
  #, gcc-internal-format
*************** msgid "declaration has a different numbe
*** 57952,57961 ****
  msgstr "deklarationen har ett annat antal kontrakt mot tidigare deklarerat"
  
  #: cp/contracts.cc:252
! #, fuzzy, gcc-internal-format
! #| msgid "original declaration with fewer contracts here"
  msgid "previous declaration with fewer contracts here"
! msgstr "ursprunglig deklaration med färre kontrakt här"
  
  #: cp/contracts.cc:562
  #, gcc-internal-format
--- 57843,57851 ----
  msgstr "deklarationen har ett annat antal kontrakt mot tidigare deklarerat"
  
  #: cp/contracts.cc:252
! #, gcc-internal-format
  msgid "previous declaration with fewer contracts here"
! msgstr "tidigare deklaration med färre kontrakt här"
  
  #: cp/contracts.cc:562
  #, gcc-internal-format
*************** msgid "a value parameter used in a postc
*** 57963,57972 ****
  msgstr ""
  
  #: cp/contracts.cc:563 cp/contracts.cc:1039
! #, fuzzy, gcc-internal-format
! #| msgid "redeclared here"
  msgid "parameter declared here"
! msgstr "omdeklarerad här"
  
  #: cp/contracts.cc:593
  #, gcc-internal-format
--- 57853,57861 ----
  msgstr ""
  
  #: cp/contracts.cc:563 cp/contracts.cc:1039
! #, gcc-internal-format
  msgid "parameter declared here"
! msgstr ""
  
  #: cp/contracts.cc:593
  #, gcc-internal-format
*************** msgid "declaration adds contracts to %q#
*** 57984,57993 ****
  msgstr "deklarationen lägger till kontrakt till %q#D"
  
  #: cp/contracts.cc:1661
! #, fuzzy, gcc-internal-format
! #| msgid " declared here"
  msgid "first declared here"
! msgstr " deklarerad här"
  
  #: cp/contracts.cc:1922
  #, gcc-internal-format
--- 57873,57881 ----
  msgstr "deklarationen lägger till kontrakt till %q#D"
  
  #: cp/contracts.cc:1661
! #, gcc-internal-format
  msgid "first declared here"
! msgstr "först deklarerad här"
  
  #: cp/contracts.cc:1922
  #, gcc-internal-format
*************** msgid "%qD was promoted to an immediate
*** 58238,58247 ****
  msgstr "%qD befordrades till en omedelbar funktion"
  
  #: cp/cp-gimplify.cc:978
! #, fuzzy, gcc-internal-format
! #| msgid "%qE is not a constant expression"
  msgid "%qs used outside of constant expressions"
! msgstr "%qE är inte ett konstant uttryck"
  
  #: cp/cp-gimplify.cc:1291
  #, gcc-internal-format
--- 58126,58134 ----
  msgstr "%qD befordrades till en omedelbar funktion"
  
  #: cp/cp-gimplify.cc:978
! #, gcc-internal-format
  msgid "%qs used outside of constant expressions"
! msgstr ""
  
  #: cp/cp-gimplify.cc:1291
  #, gcc-internal-format
*************** msgid "%<indeterminate%> attribute not s
*** 58779,58788 ****
  msgstr ""
  
  #: cp/decl.cc:1813
! #, fuzzy, gcc-internal-format
! #| msgid "attribute declaration"
  msgid "earlier declaration"
! msgstr "attributdeklaration"
  
  #: cp/decl.cc:1951
  #, gcc-internal-format
--- 58666,58674 ----
  msgstr ""
  
  #: cp/decl.cc:1813
! #, gcc-internal-format
  msgid "earlier declaration"
! msgstr "tidigare deklaration"
  
  #: cp/decl.cc:1951
  #, gcc-internal-format
*************** msgid "  skips initialization of %q#D"
*** 59161,59170 ****
  msgstr "  hoppar över initiering av %q#D"
  
  #: cp/decl.cc:4869
! #, fuzzy, gcc-internal-format
! #| msgid "  enters %<constexpr if%> statement"
  msgid "  enters %<template for%> statement"
! msgstr "  går in i %<constexpr if%>-sats"
  
  #: cp/decl.cc:5060 cp/parser.cc:8110
  #, gcc-internal-format
--- 59047,59055 ----
  msgstr "  hoppar över initiering av %q#D"
  
  #: cp/decl.cc:4869
! #, gcc-internal-format
  msgid "  enters %<template for%> statement"
! msgstr "  går in i %<template for%>-sats"
  
  #: cp/decl.cc:5060 cp/parser.cc:8110
  #, gcc-internal-format
*************** msgid "%<constinit%> can only be applied
*** 59773,59782 ****
  msgstr "%<constinit%> kan bara tillämpas på en variabel med statisk eller trådlagringsvaraktighet"
  
  #: cp/decl.cc:9847
! #, fuzzy, gcc-internal-format
! #| msgid "structured bindings only available with %<-std=c++17%> or %<-std=gnu++17%>"
  msgid "%<constinit%> can be applied to structured binding only with %<-std=c++2c%> or %<-std=gnu++2c%>"
! msgstr "strukturerade bindningar är endast tillgängliga med %<-std=c++17%> eller %<-std=gnu++17%>"
  
  #: cp/decl.cc:10064
  #, gcc-internal-format
--- 59658,59666 ----
  msgstr "%<constinit%> kan bara tillämpas på en variabel med statisk eller trådlagringsvaraktighet"
  
  #: cp/decl.cc:9847
! #, gcc-internal-format
  msgid "%<constinit%> can be applied to structured binding only with %<-std=c++2c%> or %<-std=gnu++2c%>"
! msgstr ""
  
  #: cp/decl.cc:10064
  #, gcc-internal-format
*************** msgid "structured binding refers to inco
*** 59829,59838 ****
  msgstr "strukturerad bindning refererar till ofullständig typ %qT"
  
  #: cp/decl.cc:10588
! #, fuzzy, gcc-internal-format
! #| msgid "cannot value-initialize array of unknown bound %qT"
  msgid "cannot decompose array of unknown bound %qT"
! msgstr "det går inte att värdeinitiera vektorn %qT med okänd gräns"
  
  #: cp/decl.cc:10598 cp/decl.cc:10774
  #, gcc-internal-format
--- 59713,59721 ----
  msgstr "strukturerad bindning refererar till ofullständig typ %qT"
  
  #: cp/decl.cc:10588
! #, gcc-internal-format
  msgid "cannot decompose array of unknown bound %qT"
! msgstr "det går inte att dekomponera vektorn %qT med okänd gräns"
  
  #: cp/decl.cc:10598 cp/decl.cc:10774
  #, gcc-internal-format
*************** msgid "while %qT decomposes into %E elem
*** 59896,59911 ****
  msgstr "medan %qT dekomponeras till %E element"
  
  #: cp/decl.cc:10998 cp/decl.cc:11044
! #, fuzzy, gcc-internal-format
! #| msgid "%<std::tuple_element<%u, %T>::type%> is %<void%>"
  msgid "%<std::tuple_element<%wu, %T>::type%> is %<void%>"
! msgstr "%<std::tuple_element<%u, %T>::type%> är %<void%>"
  
  #: cp/decl.cc:11004
! #, fuzzy, gcc-internal-format
! #| msgid "in initialization of structured binding variable %qD"
  msgid "in initialization of structured binding pack %qD"
! msgstr "i initieringen av variabel %qD i strukturerad bindning"
  
  #: cp/decl.cc:11050
  #, gcc-internal-format
--- 59779,59792 ----
  msgstr "medan %qT dekomponeras till %E element"
  
  #: cp/decl.cc:10998 cp/decl.cc:11044
! #, gcc-internal-format
  msgid "%<std::tuple_element<%wu, %T>::type%> is %<void%>"
! msgstr "%<std::tuple_element<%wu, %T>::type%> är %<void%>"
  
  #: cp/decl.cc:11004
! #, gcc-internal-format
  msgid "in initialization of structured binding pack %qD"
! msgstr "i initieringen av paket %qD i strukturerad bindning"
  
  #: cp/decl.cc:11050
  #, gcc-internal-format
*************** msgid "cannot declare %<::main%> to be s
*** 60099,60108 ****
  msgstr "det går inte att deklarera %<::main%> som static"
  
  #: cp/decl.cc:12369
! #, fuzzy, gcc-internal-format
! #| msgid "cannot declare %<::main%> with a linkage specification"
  msgid "cannot declare %<::main%> with a linkage specification other than %<extern \"C++\"%>"
! msgstr "det går inte att deklarera %<::main%> med en länkningsspecifikation"
  
  #: cp/decl.cc:12374
  #, gcc-internal-format
--- 59980,59988 ----
  msgstr "det går inte att deklarera %<::main%> som static"
  
  #: cp/decl.cc:12369
! #, gcc-internal-format
  msgid "cannot declare %<::main%> with a linkage specification other than %<extern \"C++\"%>"
! msgstr "det går inte att deklarera %<::main%> med en annan länkningsspecifikation än %<extern \"C++\"%>"
  
  #: cp/decl.cc:12374
  #, gcc-internal-format
*************** msgid "anonymous non-C-compatible type g
*** 60475,60484 ****
  msgstr ""
  
  #: cp/decl.cc:13735
! #, fuzzy, gcc-internal-format
! #| msgid "type is not compatible with its variant"
  msgid "type is not C-compatible because it has a base class"
! msgstr "typen är inte kompatibel med sin variant"
  
  #: cp/decl.cc:13750
  #, gcc-internal-format
--- 60355,60363 ----
  msgstr ""
  
  #: cp/decl.cc:13735
! #, gcc-internal-format
  msgid "type is not C-compatible because it has a base class"
! msgstr ""
  
  #: cp/decl.cc:13750
  #, gcc-internal-format
*************** msgid "type is not C-compatible because
*** 60486,60495 ****
  msgstr ""
  
  #: cp/decl.cc:13780
! #, fuzzy, gcc-internal-format
! #| msgid "type is not compatible with its variant"
  msgid "type is not C-compatible because it contains %qD declaration"
! msgstr "typen är inte kompatibel med sin variant"
  
  #: cp/decl.cc:13841
  #, gcc-internal-format
--- 60365,60373 ----
  msgstr ""
  
  #: cp/decl.cc:13780
! #, gcc-internal-format
  msgid "type is not C-compatible because it contains %qD declaration"
! msgstr ""
  
  #: cp/decl.cc:13841
  #, gcc-internal-format
*************** msgid "structured binding declaration ca
*** 60672,60681 ****
  msgstr "deklaration av strukturerad bindning får inte vara %qs"
  
  #: cp/decl.cc:14771
! #, fuzzy, gcc-internal-format
! #| msgid "structured binding declaration can be %qs only in %<-std=c++20%> or %<-std=gnu++20%>"
  msgid "structured binding declaration can be %qs only with %<-std=c++2c%> or %<-std=gnu++2c%>"
! msgstr "strukturerade bindningsdeklarationer kan vara %qs endast i %<-std=c++20%> eller %<-std=gnu++20%>"
  
  #: cp/decl.cc:14778 cp/decl.cc:14803
  #, gcc-internal-format
--- 60550,60558 ----
  msgstr "deklaration av strukturerad bindning får inte vara %qs"
  
  #: cp/decl.cc:14771
! #, gcc-internal-format
  msgid "structured binding declaration can be %qs only with %<-std=c++2c%> or %<-std=gnu++2c%>"
! msgstr "strukturerade bindningsdeklarationer kan vara %qs endast med %<-std=c++2c%> eller %<-std=gnu++2c%>"
  
  #: cp/decl.cc:14778 cp/decl.cc:14803
  #, gcc-internal-format
*************** msgid "template declaration of %q#D"
*** 61884,61899 ****
  msgstr "malldeklaration av %q#D"
  
  #: cp/decl2.cc:936
- #, fuzzy
- #| msgid "parameter %P of %qD has incomplete type %qT"
  msgid "parameter %P of candidate has type %e..."
! msgstr "parameter %P till %qD har ofullständig typ %qT"
  
  #: cp/decl2.cc:946
- #, fuzzy
- #| msgid "%qE does not name a type"
  msgid "...which does not match type %e"
! msgstr "%qE är inte namnet på en typ"
  
  #: cp/decl2.cc:1013
  #, gcc-internal-format
--- 61761,61772 ----
  msgstr "malldeklaration av %q#D"
  
  #: cp/decl2.cc:936
  msgid "parameter %P of candidate has type %e..."
! msgstr "parameter %P till kandidaten har typen %e…"
  
  #: cp/decl2.cc:946
  msgid "...which does not match type %e"
! msgstr "…vilket inte stämmer med typen %e"
  
  #: cp/decl2.cc:1013
  #, gcc-internal-format
*************** msgid "In function %qD"
*** 62311,62386 ****
  msgstr "I funktion %qD"
  
  #: cp/error.cc:3992
! #, fuzzy, gcc-internal-format
! #| msgid "%qE is not a type"
  msgid "but %qE is a type"
! msgstr "%qE är inte en typ"
  
  #: cp/error.cc:3994
! #, fuzzy, gcc-internal-format
! #| msgid "type %qs is not an expression"
  msgid "but %qE is an expression"
! msgstr "typen %qs är inte ett uttryck"
  
  #: cp/error.cc:3996
! #, fuzzy, gcc-internal-format
! #| msgid "<structured bindings>"
  msgid "but %qE is a structured binding"
! msgstr "<strukturerade bindningar>"
  
  #: cp/error.cc:3998
! #, fuzzy, gcc-internal-format
! #| msgid "%qE is unavailable"
  msgid "but %qE is a variable"
! msgstr "%qE är otillgänglig"
  
  #: cp/error.cc:4000
! #, fuzzy, gcc-internal-format
! #| msgid "function parameter"
  msgid "but %qE is a parameter"
! msgstr "funktionsparameter"
  
  #: cp/error.cc:4002
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a function"
  msgid "but %qE is a function"
! msgstr "  %qT är inte en funktion"
  
  #: cp/error.cc:4004
! #, fuzzy, gcc-internal-format
! #| msgid "%qD is not a static data member"
  msgid "but %qE is a data member"
! msgstr "%qD är inte en statisk datamedlem"
  
  #: cp/error.cc:4006
! #, fuzzy, gcc-internal-format
! #| msgid "%qD is not a function template"
  msgid "but %qE is a function template"
! msgstr "%qD är inte en funktionsmall"
  
  #: cp/error.cc:4008
! #, fuzzy, gcc-internal-format
! #| msgid "%qE is not a class template"
  msgid "but %qE is a class template"
! msgstr "%qE är inte en klassmall"
  
  #: cp/error.cc:4010
! #, fuzzy, gcc-internal-format
! #| msgid "%qD is a namespace"
  msgid "but %qE is a namespace"
! msgstr "%qD är en namnrymd"
  
  #: cp/error.cc:4012
! #, fuzzy, gcc-internal-format
! #| msgid "%qD is an enumeration template"
  msgid "but %qE is an enumerator"
! msgstr "%qD är en uppräkningsmall"
  
  #: cp/error.cc:4040
! #, fuzzy, gcc-internal-format
! #| msgid "%s%s%sIn instantiation of %q#D:\n"
  msgid "%s%s%sIn instantiation of %<template for%> iteration %E:\n"
! msgstr "%s%s%sVid instansiering av %q#D:\n"
  
  #: cp/error.cc:4043
  msgid "%s%s%sIn substitution of %qS:\n"
--- 62184,62247 ----
  msgstr "I funktion %qD"
  
  #: cp/error.cc:3992
! #, gcc-internal-format
  msgid "but %qE is a type"
! msgstr "men %qE är en typ"
  
  #: cp/error.cc:3994
! #, gcc-internal-format
  msgid "but %qE is an expression"
! msgstr "men %qE är ett uttryck"
  
  #: cp/error.cc:3996
! #, gcc-internal-format
  msgid "but %qE is a structured binding"
! msgstr ""
  
  #: cp/error.cc:3998
! #, gcc-internal-format
  msgid "but %qE is a variable"
! msgstr ""
  
  #: cp/error.cc:4000
! #, gcc-internal-format
  msgid "but %qE is a parameter"
! msgstr ""
  
  #: cp/error.cc:4002
! #, gcc-internal-format
  msgid "but %qE is a function"
! msgstr ""
  
  #: cp/error.cc:4004
! #, gcc-internal-format
  msgid "but %qE is a data member"
! msgstr ""
  
  #: cp/error.cc:4006
! #, gcc-internal-format
  msgid "but %qE is a function template"
! msgstr "men %qE är en funktionsmall"
  
  #: cp/error.cc:4008
! #, gcc-internal-format
  msgid "but %qE is a class template"
! msgstr "men %qE är en klassmall"
  
  #: cp/error.cc:4010
! #, gcc-internal-format
  msgid "but %qE is a namespace"
! msgstr "men %qE är en namnrymd"
  
  #: cp/error.cc:4012
! #, gcc-internal-format
  msgid "but %qE is an enumerator"
! msgstr "men %qE är en uppräknare"
  
  #: cp/error.cc:4040
! #, gcc-internal-format
  msgid "%s%s%sIn instantiation of %<template for%> iteration %E:\n"
! msgstr "%s%s%sVid instansiering av %<template for%> iteration %E:\n"
  
  #: cp/error.cc:4043
  msgid "%s%s%sIn substitution of %qS:\n"
*************** msgid "%r%s:%d:%R   "
*** 62400,62415 ****
  msgstr "%r%s:%d:%R   "
  
  #: cp/error.cc:4173
! #, fuzzy, gcc-internal-format
! #| msgid "recursively required from here\n"
  msgid "recursively required from %<template for%> iteration %E\n"
! msgstr "rekursivt begärd härifrån\n"
  
  #: cp/error.cc:4175
! #, fuzzy, gcc-internal-format
! #| msgid "required for the satisfaction of %qE"
  msgid "required from %<template for%> iteration %E\n"
! msgstr "krävs för att uppfylla %qE"
  
  #: cp/error.cc:4180
  msgid "recursively required by substitution of %qS\n"
--- 62261,62274 ----
  msgstr "%r%s:%d:%R   "
  
  #: cp/error.cc:4173
! #, gcc-internal-format
  msgid "recursively required from %<template for%> iteration %E\n"
! msgstr "rekursivt begärd härifrån %<template for%> iteration %E\n"
  
  #: cp/error.cc:4175
! #, gcc-internal-format
  msgid "required from %<template for%> iteration %E\n"
! msgstr ""
  
  #: cp/error.cc:4180
  msgid "recursively required by substitution of %qS\n"
*************** msgid "but %qD does not throw; perhaps i
*** 62655,62670 ****
  msgstr "men %qD kastar inte, kanske den skulle deklareras %<noexcept%>"
  
  #: cp/except.cc:1230
! #, fuzzy, gcc-internal-format
! #| msgid "%qE is not %<noexcept%>"
  msgid "%qD is not %<noexcept%>"
! msgstr "%qE är inte %<noexcept%>"
  
  #: cp/except.cc:1232
! #, fuzzy, gcc-internal-format
! #| msgid "%qE is not %<noexcept%>"
  msgid "%qT is not %<noexcept%>"
! msgstr "%qE är inte %<noexcept%>"
  
  #: cp/expr.cc:244
  #, gcc-internal-format
--- 62514,62527 ----
  msgstr "men %qD kastar inte, kanske den skulle deklareras %<noexcept%>"
  
  #: cp/except.cc:1230
! #, gcc-internal-format
  msgid "%qD is not %<noexcept%>"
! msgstr "%qD är inte %<noexcept%>"
  
  #: cp/except.cc:1232
! #, gcc-internal-format
  msgid "%qT is not %<noexcept%>"
! msgstr "%qT är inte %<noexcept%>"
  
  #: cp/expr.cc:244
  #, gcc-internal-format
*************** msgid "synthesized method %qD first requ
*** 63475,63484 ****
  msgstr "syntetiserad metod %qD krävs första gången här"
  
  #: cp/method.cc:1951
! #, fuzzy, gcc-internal-format
! #| msgid "cannot declare pointer to qualified function type %qT"
  msgid "object cannot have qualified function type %qT"
! msgstr "det går inte att deklarera en pekare till en kvalificerad funktionstyp %qT"
  
  #: cp/method.cc:1998
  #, gcc-internal-format
--- 63332,63340 ----
  msgstr "syntetiserad metod %qD krävs första gången här"
  
  #: cp/method.cc:1951
! #, gcc-internal-format
  msgid "object cannot have qualified function type %qT"
! msgstr ""
  
  #: cp/method.cc:1998
  #, gcc-internal-format
*************** msgid "first argument type %qT of a poin
*** 63496,63549 ****
  msgstr "första argumenttypen %qT för en pekare på en medlem måste vara en klasstyp eller en pekare på en klasstyp"
  
  #: cp/method.cc:2319 cp/method.cc:2364
! #, fuzzy, gcc-internal-format
! #| msgid "too many initializers for %qT"
  msgid "too many initializers for non-class type %qT"
! msgstr "för många initierare för %qT"
  
  #. The message may have been suppressed due to -w + -fpermissive,
  #. emit a generic response instead.
  #: cp/method.cc:2374
! #, fuzzy, gcc-internal-format
! #| msgid "the required expression %qE is invalid"
  msgid "the conversion is invalid"
! msgstr "det nödvändiga uttrycket %qE är felaktigt"
  
  #: cp/method.cc:2399 cp/method.cc:2435
! #, fuzzy, gcc-internal-format
! #| msgid "class type %qT is incomplete"
  msgid "%qT is incomplete"
! msgstr "returtypen %qT är ofullständig"
  
  #: cp/method.cc:2416
! #, fuzzy, gcc-internal-format
! #| msgid "%qT is not a class type"
  msgid "%qT is not a class or scalar type"
! msgstr "%qT är inte en klasstyp"
  
  #: cp/method.cc:2443
! #, fuzzy, gcc-internal-format
! #| msgid "ISO C forbids qualified function types"
  msgid "%qT is a qualified function type"
! msgstr "ISO C förbjuder kvalificerade funktionstyper"
  
  #: cp/method.cc:2455
! #, fuzzy, gcc-internal-format
! #| msgid "cannot value-initialize array of unknown bound %qT"
  msgid "cannot construct an array of unknown bound"
! msgstr "det går inte att värdeinitiera vektorn %qT med okänd gräns"
  
  #: cp/method.cc:2478
! #, fuzzy, gcc-internal-format
! #| msgid "%qE is not initialized"
  msgid "%qE is non-trivial"
! msgstr "%qE är inte initierad"
  
  #: cp/method.cc:2565
! #, fuzzy, gcc-internal-format
! #| msgid "%qD is a function, not a type"
  msgid "%qT is a function type"
! msgstr "%qD är en funktion, inte en typ"
  
  #: cp/method.cc:2654
  #, gcc-internal-format
--- 63352,63397 ----
  msgstr "första argumenttypen %qT för en pekare på en medlem måste vara en klasstyp eller en pekare på en klasstyp"
  
  #: cp/method.cc:2319 cp/method.cc:2364
! #, gcc-internal-format
  msgid "too many initializers for non-class type %qT"
! msgstr "för många initierare för typen %qT som inte är en klass"
  
  #. The message may have been suppressed due to -w + -fpermissive,
  #. emit a generic response instead.
  #: cp/method.cc:2374
! #, gcc-internal-format
  msgid "the conversion is invalid"
! msgstr "konverteringen är felaktig"
  
  #: cp/method.cc:2399 cp/method.cc:2435
! #, gcc-internal-format
  msgid "%qT is incomplete"
! msgstr "%qT är ofullständig"
  
  #: cp/method.cc:2416
! #, gcc-internal-format
  msgid "%qT is not a class or scalar type"
! msgstr "%qT är inte en klass- eller skalär typ"
  
  #: cp/method.cc:2443
! #, gcc-internal-format
  msgid "%qT is a qualified function type"
! msgstr ""
  
  #: cp/method.cc:2455
! #, gcc-internal-format
  msgid "cannot construct an array of unknown bound"
! msgstr ""
  
  #: cp/method.cc:2478
! #, gcc-internal-format
  msgid "%qE is non-trivial"
! msgstr "%qE är icketrivial"
  
  #: cp/method.cc:2565
! #, gcc-internal-format
  msgid "%qT is a function type"
! msgstr "%qT är en funktionstyp"
  
  #: cp/method.cc:2654
  #, gcc-internal-format
*************** msgid "%q#F is implicitly deleted becaus
*** 63616,63625 ****
  msgstr "%q#F tas implicit bort för att dess undantagsspecifikation stämmer inte med den implicita undantagsspecifikationen %qX"
  
  #: cp/method.cc:3689
! #, fuzzy, gcc-internal-format
! #| msgid "friend declaration %qD is not visible to explicit specialization"
  msgid "defaulted declaration %q+D does not match the expected signature"
! msgstr "vändeklarationen %qD är inte synlig för en explicit specialisering"
  
  #: cp/method.cc:3691 cp/method.cc:3736
  #, gcc-internal-format
--- 63464,63472 ----
  msgstr "%q#F tas implicit bort för att dess undantagsspecifikation stämmer inte med den implicita undantagsspecifikationen %qX"
  
  #: cp/method.cc:3689
! #, gcc-internal-format
  msgid "defaulted declaration %q+D does not match the expected signature"
! msgstr ""
  
  #: cp/method.cc:3691 cp/method.cc:3736
  #, gcc-internal-format
*************** msgid "%qD is also TU-local but has been
*** 63894,63903 ****
  msgstr ""
  
  #: cp/module.cc:15895
! #, fuzzy, gcc-internal-format
! #| msgid "%qD refers to TU-local entity %qD and cannot be instantiated in other TUs"
  msgid "%qD refers to TU-local entity %qD, which may cause issues when instantiating in other TUs"
! msgstr "%qD refererar till en TU-lokal enhet %qD och kan inte instantieras i andra TU:n"
  
  #: cp/module.cc:15905
  #, gcc-internal-format
--- 63741,63749 ----
  msgstr ""
  
  #: cp/module.cc:15895
! #, gcc-internal-format
  msgid "%qD refers to TU-local entity %qD, which may cause issues when instantiating in other TUs"
! msgstr "%qD refererar till en TU-lokal enhet %qD, vilket kan skapa problem vid instantiering i andra TU:n"
  
  #: cp/module.cc:15905
  #, gcc-internal-format
*************** msgid "recursive lazy load"
*** 63920,63929 ****
  msgstr "rekursiv lat laddning"
  
  #: cp/module.cc:16619
! #, fuzzy, gcc-internal-format
! #| msgid "module %qs declared here"
  msgid "module %qs depends on itself"
! msgstr "modulen %qs är deklarerad här"
  
  #: cp/module.cc:16621 cp/module.cc:22712
  #, gcc-internal-format
--- 63766,63774 ----
  msgstr "rekursiv lat laddning"
  
  #: cp/module.cc:16619
! #, gcc-internal-format
  msgid "module %qs depends on itself"
! msgstr ""
  
  #: cp/module.cc:16621 cp/module.cc:22712
  #, gcc-internal-format
*************** msgid "during load of pendings for %<%E%
*** 64161,64176 ****
  msgstr "under laddning av väntande för %<%E%s%E%>"
  
  #: cp/module.cc:22659
! #, fuzzy, gcc-internal-format
! #| msgid "method definition not in @implementation context"
  msgid "import of %qs within its own implementation unit"
! msgstr "metoddefinition som inte är i @implementation-kontext"
  
  #: cp/module.cc:22661
! #, fuzzy, gcc-internal-format
! #| msgid "module %qs declared here"
  msgid "module declared here"
! msgstr "modulen %qs är deklarerad här"
  
  #. Only header units should appear inside language
  #. specifications.  The std doesn't specify this, but I think
--- 64006,64019 ----
  msgstr "under laddning av väntande för %<%E%s%E%>"
  
  #: cp/module.cc:22659
! #, gcc-internal-format
  msgid "import of %qs within its own implementation unit"
! msgstr ""
  
  #: cp/module.cc:22661
! #, gcc-internal-format
  msgid "module declared here"
! msgstr "modulen är deklarerad här"
  
  #. Only header units should appear inside language
  #. specifications.  The std doesn't specify this, but I think
*************** msgid "overload set for argument-depende
*** 64290,64299 ****
  msgstr ""
  
  #: cp/name-lookup.cc:1349
! #, fuzzy, gcc-internal-format
! #| msgid "%q#D declared here with internal linkage"
  msgid "ignoring %qD declared here with internal linkage"
! msgstr "%q#D är deklarerad här med intern länkning"
  
  #: cp/name-lookup.cc:2956 cp/name-lookup.cc:4076 cp/name-lookup.cc:4176
  #, gcc-internal-format
--- 64133,64141 ----
  msgstr ""
  
  #: cp/name-lookup.cc:1349
! #, gcc-internal-format
  msgid "ignoring %qD declared here with internal linkage"
! msgstr "ignorerar %qD deklarerad här med intern länkning"
  
  #: cp/name-lookup.cc:2956 cp/name-lookup.cc:4076 cp/name-lookup.cc:4176
  #, gcc-internal-format
*************** msgid "%<omp::%E%> not allowed to be spe
*** 64538,64547 ****
  msgstr "%<omp::%E%> är inte tillåtet att anges i detta sammanhang"
  
  #: cp/name-lookup.cc:9212
! #, fuzzy, gcc-internal-format
! #| msgid "unterminated quoting directive"
  msgid "annotation on using directive"
! msgstr "oavslutat citationsdirektiv"
  
  #. We only allow depth 255.
  #: cp/name-lookup.cc:9300
--- 64380,64388 ----
  msgstr "%<omp::%E%> är inte tillåtet att anges i detta sammanhang"
  
  #: cp/name-lookup.cc:9212
! #, gcc-internal-format
  msgid "annotation on using directive"
! msgstr ""
  
  #. We only allow depth 255.
  #: cp/name-lookup.cc:9300
*************** msgid "identifier %qE is a keyword in C+
*** 64615,64624 ****
  msgstr "identifieraren %qE är ett nyckelord i C++20"
  
  #: cp/parser.cc:1196
! #, fuzzy, gcc-internal-format
! #| msgid "identifier %qE is a keyword in C++20"
  msgid "identifier %qE is a keyword in C++26"
! msgstr "identifieraren %qE är ett nyckelord i C++20"
  
  #: cp/parser.cc:1746 cp/parser.cc:1759
  #, gcc-internal-format
--- 64456,64464 ----
  msgstr "identifieraren %qE är ett nyckelord i C++20"
  
  #: cp/parser.cc:1196
! #, gcc-internal-format
  msgid "identifier %qE is a keyword in C++26"
! msgstr "identifieraren %qE är ett nyckelord i C++26"
  
  #: cp/parser.cc:1746 cp/parser.cc:1759
  #, gcc-internal-format
*************** msgid "an increment cannot appear in a c
*** 64781,64788 ****
  msgstr "en ökning får inte finnas i ett konstantuttryck"
  
  #: cp/parser.cc:3825
! #, fuzzy, gcc-internal-format
! #| msgid "an decrement cannot appear in a constant-expression"
  msgid "a decrement cannot appear in a constant-expression"
  msgstr "en minskning får inte finnas i ett konstantuttryck"
  
--- 64621,64627 ----
  msgstr "en ökning får inte finnas i ett konstantuttryck"
  
  #: cp/parser.cc:3825
! #, gcc-internal-format
  msgid "a decrement cannot appear in a constant-expression"
  msgstr "en minskning får inte finnas i ett konstantuttryck"
  
*************** msgid "pack index missing"
*** 65053,65074 ****
  msgstr "paketindex saknas"
  
  #: cp/parser.cc:6151 cp/parser.cc:10117
! #, fuzzy, gcc-internal-format
! #| msgid "contracts are only available with %<-fcontracts%>"
  msgid "reflection is only available with %<-freflection%>"
! msgstr "kontrakt är endast tillgängliga med %<-fcontracts%>"
  
  #: cp/parser.cc:6261
! #, fuzzy, gcc-internal-format
! #| msgid "expected a function name"
  msgid "expected a reflection of a type"
! msgstr "ett funktionsnamn förväntades"
  
  #: cp/parser.cc:6339
! #, fuzzy, gcc-internal-format
! #| msgid "Expected reduction operator or function name at %C"
  msgid "expected a reflection of a function template"
! msgstr "En reduktionsoperator eller ett funktionsnamn förväntades vid %C"
  
  #: cp/parser.cc:6437
  #, gcc-internal-format
--- 64892,64910 ----
  msgstr "paketindex saknas"
  
  #: cp/parser.cc:6151 cp/parser.cc:10117
! #, gcc-internal-format
  msgid "reflection is only available with %<-freflection%>"
! msgstr "reflektioner är endast tillgängliga med %<-freflection%>"
  
  #: cp/parser.cc:6261
! #, gcc-internal-format
  msgid "expected a reflection of a type"
! msgstr ""
  
  #: cp/parser.cc:6339
! #, gcc-internal-format
  msgid "expected a reflection of a function template"
! msgstr ""
  
  #: cp/parser.cc:6437
  #, gcc-internal-format
*************** msgid "extra %<template%> in a scope spl
*** 65076,65085 ****
  msgstr ""
  
  #: cp/parser.cc:6446
! #, fuzzy, gcc-internal-format
! #| msgid "non-deducible template %qT used without template arguments"
  msgid "missing %<template%> in a scope splice with template arguments"
! msgstr "icke härledbar mall %qT använd utan mallargument"
  
  #: cp/parser.cc:6448
  #, gcc-internal-format
--- 64912,64920 ----
  msgstr ""
  
  #: cp/parser.cc:6446
! #, gcc-internal-format
  msgid "missing %<template%> in a scope splice with template arguments"
! msgstr ""
  
  #: cp/parser.cc:6448
  #, gcc-internal-format
*************** msgid "%<template%> may only be omitted
*** 65087,65096 ****
  msgstr ""
  
  #: cp/parser.cc:6461
! #, fuzzy, gcc-internal-format
! #| msgid "%qT is not a class, namespace, or enumeration"
  msgid "expected a reflection of a class, namespace, or enumeration"
! msgstr "%qT är inte en klass, namnrymd eller uppräkning"
  
  #: cp/parser.cc:6622
  #, gcc-internal-format
--- 64922,64930 ----
  msgstr ""
  
  #: cp/parser.cc:6461
! #, gcc-internal-format
  msgid "expected a reflection of a class, namespace, or enumeration"
! msgstr "en reflektion av klass, namnrymd eller uppräkning förväntades"
  
  #: cp/parser.cc:6622
  #, gcc-internal-format
*************** msgid "local variable %qD may not appear
*** 65138,65147 ****
  msgstr "lokal variabel %qD får inte förekomma i detta sammanhang"
  
  #: cp/parser.cc:7192
! #, fuzzy, gcc-internal-format
! #| msgid "contracts are only available with %<-fcontracts%>"
  msgid "reflection is only available in C++26 with %<-freflection%>"
! msgstr "kontrakt är endast tillgängliga med %<-fcontracts%>"
  
  #: cp/parser.cc:7229
  #, gcc-internal-format
--- 64972,64980 ----
  msgstr "lokal variabel %qD får inte förekomma i detta sammanhang"
  
  #: cp/parser.cc:7192
! #, gcc-internal-format
  msgid "reflection is only available in C++26 with %<-freflection%>"
! msgstr ""
  
  #: cp/parser.cc:7229
  #, gcc-internal-format
*************** msgstr "%<template%> måste följa en n�
*** 65316,65325 ****
  
  #. Oy vey, nothing worked.
  #: cp/parser.cc:10205
! #, fuzzy, gcc-internal-format
! #| msgid "%<h%> applied to non-register operand"
  msgid "%<^^%> cannot be applied to this operand"
! msgstr "%<h%> använt på operand som inte är ett register"
  
  #: cp/parser.cc:10293
  #, gcc-internal-format
--- 65149,65157 ----
  
  #. Oy vey, nothing worked.
  #: cp/parser.cc:10205
! #, gcc-internal-format
  msgid "%<^^%> cannot be applied to this operand"
! msgstr ""
  
  #: cp/parser.cc:10293
  #, gcc-internal-format
*************** msgid "range-based %<for%> loops only av
*** 65720,65741 ****
  msgstr "intervallbaserad %<for%>-slinga är endast tillgänglig med %<-std=c++11%> eller %<-std=gnu++11%>"
  
  #: cp/parser.cc:16576
! #, fuzzy, gcc-internal-format
! #| msgid "%<delete%> reason only available with %<-std=c++2c%> or %<-std=gnu++2c%>"
  msgid "%<template for%> only available with %<-std=c++2c%> or %<-std=gnu++2c%>"
! msgstr "orsaken till %<delete%> är endast tillgänglig med %<-std=c++2c%> eller %<-std=gnu++2c%>"
  
  #: cp/parser.cc:16635
! #, fuzzy, gcc-internal-format
! #| msgid "C99 designator %qE outside aggregate initializer"
  msgid "designators in %<template for%> initializer"
! msgstr "C99-beteckningen %qE utanför aggregatinitierare"
  
  #: cp/parser.cc:16702
! #, fuzzy, gcc-internal-format
! #| msgid "structured binding declaration cannot be %qs"
  msgid "for-range-declaration cannot be 'constinit'"
! msgstr "deklaration av strukturerad bindning får inte vara %qs"
  
  #: cp/parser.cc:16872
  #, gcc-internal-format
--- 65552,65570 ----
  msgstr "intervallbaserad %<for%>-slinga är endast tillgänglig med %<-std=c++11%> eller %<-std=gnu++11%>"
  
  #: cp/parser.cc:16576
! #, gcc-internal-format
  msgid "%<template for%> only available with %<-std=c++2c%> or %<-std=gnu++2c%>"
! msgstr "%<template for%> är endast tillgängligt med %<-std=c++2c%> eller %<-std=gnu++2c%>"
  
  #: cp/parser.cc:16635
! #, gcc-internal-format
  msgid "designators in %<template for%> initializer"
! msgstr ""
  
  #: cp/parser.cc:16702
! #, gcc-internal-format
  msgid "for-range-declaration cannot be 'constinit'"
! msgstr ""
  
  #: cp/parser.cc:16872
  #, gcc-internal-format
*************** msgid "multiple declarations in range-ba
*** 65930,65951 ****
  msgstr "flera deklarationer i intervallbaserad %<for%>-slinga"
  
  #: cp/parser.cc:18257
! #, fuzzy, gcc-internal-format
! #| msgid "structured binding has incomplete type %qT"
  msgid "structured binding pack outside of template"
! msgstr "strukturerad bindning har en ofullständig typ %qT"
  
  #: cp/parser.cc:18260
! #, fuzzy, gcc-internal-format
! #| msgid "empty structured binding declaration"
  msgid "multiple packs in structured binding declaration"
! msgstr "tom deklaration av strukturerad bindning"
  
  #: cp/parser.cc:18267
! #, fuzzy, gcc-internal-format
! #| msgid "structured bindings only available with %<-std=c++17%> or %<-std=gnu++17%>"
  msgid "structured binding packs only available with %<-std=c++2c%> or %<-std=gnu++2c%>"
! msgstr "strukturerade bindningar är endast tillgängliga med %<-std=c++17%> eller %<-std=gnu++17%>"
  
  #: cp/parser.cc:18286
  #, gcc-internal-format
--- 65759,65777 ----
  msgstr "flera deklarationer i intervallbaserad %<for%>-slinga"
  
  #: cp/parser.cc:18257
! #, gcc-internal-format
  msgid "structured binding pack outside of template"
! msgstr ""
  
  #: cp/parser.cc:18260
! #, gcc-internal-format
  msgid "multiple packs in structured binding declaration"
! msgstr "multipla paket i deklaration av strukturerad bindning"
  
  #: cp/parser.cc:18267
! #, gcc-internal-format
  msgid "structured binding packs only available with %<-std=c++2c%> or %<-std=gnu++2c%>"
! msgstr "strukturerade bindningspaket är endast tillgängliga med %<-std=c++2c%> eller %<-std=gnu++2c%>"
  
  #: cp/parser.cc:18286
  #, gcc-internal-format
*************** msgid "structured bindings with attribut
*** 65953,65962 ****
  msgstr "strukturerade bindningar med identifierare med attribut är endast tillgängliga med %<-std=c++2c%> eller %<-std=gnu++2c%>"
  
  #: cp/parser.cc:18297
! #, fuzzy, gcc-internal-format
! #| msgid "in initialization of structured binding variable %qD"
  msgid "annotation on structured binding"
! msgstr "i initieringen av variabel %qD i strukturerad bindning"
  
  #: cp/parser.cc:18325
  #, gcc-internal-format
--- 65779,65787 ----
  msgstr "strukturerade bindningar med identifierare med attribut är endast tillgängliga med %<-std=c++2c%> eller %<-std=gnu++2c%>"
  
  #: cp/parser.cc:18297
! #, gcc-internal-format
  msgid "annotation on structured binding"
! msgstr ""
  
  #: cp/parser.cc:18325
  #, gcc-internal-format
*************** msgstr "ogiltig initierare för deklarat
*** 65980,65989 ****
  
  #: cp/parser.cc:18453 cp/parser.cc:18458 cp/parser.cc:26155 cp/parser.cc:26160
  #: cp/parser.cc:26164 cp/parser.cc:26168
! #, fuzzy, gcc-internal-format
! #| msgid "structured binding declaration cannot be %qs"
  msgid "for-range-declaration cannot be %qs"
! msgstr "deklaration av strukturerad bindning får inte vara %qs"
  
  #: cp/parser.cc:18626
  #, gcc-internal-format
--- 65805,65813 ----
  
  #: cp/parser.cc:18453 cp/parser.cc:18458 cp/parser.cc:26155 cp/parser.cc:26160
  #: cp/parser.cc:26164 cp/parser.cc:26168
! #, gcc-internal-format
  msgid "for-range-declaration cannot be %qs"
! msgstr "for-range-deklaration får inte vara %qs"
  
  #: cp/parser.cc:18626
  #, gcc-internal-format
*************** msgid "invalid non-type template argumen
*** 66277,66286 ****
  msgstr "ogiltigt mallargument som inte är en typ"
  
  #: cp/parser.cc:22008
! #, fuzzy, gcc-internal-format
! #| msgid "expression cannot be used as a function"
  msgid "unparenthesized splice expression cannot be used as a template argument"
! msgstr "uttryck kan inte användas som en funktion"
  
  #: cp/parser.cc:22126
  #, gcc-internal-format
--- 66101,66109 ----
  msgstr "ogiltigt mallargument som inte är en typ"
  
  #: cp/parser.cc:22008
! #, gcc-internal-format
  msgid "unparenthesized splice expression cannot be used as a template argument"
! msgstr ""
  
  #: cp/parser.cc:22126
  #, gcc-internal-format
*************** msgid "add parentheses to declare a vari
*** 66648,66723 ****
  msgstr "lägg till parenteser för att deklarera en variabel"
  
  #: cp/parser.cc:25520
! #, fuzzy, gcc-internal-format
! #| msgid "%qs cannot be used in a varargs function"
  msgid "cannot handle qualified name for variant function"
! msgstr "%qs kan inte användas i en varargs-funktion"
  
  #: cp/parser.cc:25529
! #, fuzzy, gcc-internal-format
! #| msgid "qualifiers are not allowed on constructor declaration"
  msgid "declare variant directives are not allowed on constructors"
! msgstr "kvalificerare är inte tillåtna vid konstruerardeklaration"
  
  #: cp/parser.cc:25535
! #, fuzzy, gcc-internal-format
! #| msgid "qualifiers are not allowed on destructor declaration"
  msgid "declare variant directives are not allowed on destructors"
! msgstr "kvalificerare är inte tillåtna vid destruerardeklaration"
  
  #: cp/parser.cc:25541
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%qE argument not an identifier"
  msgid "cannot handle %s identifier name"
! msgstr "argument till %qE är inte en identifierare"
  
  #: cp/parser.cc:25594
! #, fuzzy, gcc-internal-format
! #| msgid "declaration of function %qD in invalid context"
  msgid "no declaration of base function %qs in this scope"
! msgstr "deklaration av funktionen %qD i ogiltig kontext"
  
  #: cp/parser.cc:25636
! #, fuzzy, gcc-internal-format
! #| msgid "reference to %qD is ambiguous"
  msgid "base function is ambiguous"
! msgstr "referens till %qD är tvetydig"
  
  #: cp/parser.cc:25644
! #, fuzzy, gcc-internal-format
! #| msgid "%<allocate%> directive must be in the same scope as %qD"
  msgid "variant function must be in the same scope as the base function %qs"
! msgstr "direktivet %<allocate%> måste vara i samma räckvidd som %qD"
  
  #: cp/parser.cc:25665
! #, fuzzy, gcc-internal-format
! #| msgid "%<allocate%> directive must be in the same scope as %qD"
  msgid "variant function must be in the same scope as the base function %qE"
! msgstr "direktivet %<allocate%> måste vara i samma räckvidd som %qD"
  
  #: cp/parser.cc:25672
! #, fuzzy, gcc-internal-format
! #| msgid "attributes are not allowed on a function-definition"
  msgid "declare variant directives are not allowed on virtual functions"
! msgstr "attribut är inte tillåtna vid en funktionsdefinition"
  
  #: cp/parser.cc:25679 cp/parser.cc:26128
! #, fuzzy, gcc-internal-format
! #| msgid "attributes are not allowed on a function-definition"
  msgid "declare variant directives are not allowed on defaulted functions"
! msgstr "attribut är inte tillåtna vid en funktionsdefinition"
  
  #: cp/parser.cc:25686 cp/parser.cc:26135
! #, fuzzy, gcc-internal-format
! #| msgid "attributes are not allowed on a function-definition"
  msgid "declare variant directives are not allowed on deleted functions"
! msgstr "attribut är inte tillåtna vid en funktionsdefinition"
  
  #: cp/parser.cc:25694
! #, fuzzy, gcc-internal-format
! #| msgid "attributes are not allowed on a function-definition"
  msgid "declare variant directives are not allowed on immediate functions"
! msgstr "attribut är inte tillåtna vid en funktionsdefinition"
  
  #: cp/parser.cc:25969
  #, gcc-internal-format
--- 66471,66534 ----
  msgstr "lägg till parenteser för att deklarera en variabel"
  
  #: cp/parser.cc:25520
! #, gcc-internal-format
  msgid "cannot handle qualified name for variant function"
! msgstr ""
  
  #: cp/parser.cc:25529
! #, gcc-internal-format
  msgid "declare variant directives are not allowed on constructors"
! msgstr ""
  
  #: cp/parser.cc:25535
! #, gcc-internal-format
  msgid "declare variant directives are not allowed on destructors"
! msgstr ""
  
  #: cp/parser.cc:25541
! #, gcc-internal-format, gfc-internal-format
  msgid "cannot handle %s identifier name"
! msgstr ""
  
  #: cp/parser.cc:25594
! #, gcc-internal-format
  msgid "no declaration of base function %qs in this scope"
! msgstr ""
  
  #: cp/parser.cc:25636
! #, gcc-internal-format
  msgid "base function is ambiguous"
! msgstr ""
  
  #: cp/parser.cc:25644
! #, gcc-internal-format
  msgid "variant function must be in the same scope as the base function %qs"
! msgstr ""
  
  #: cp/parser.cc:25665
! #, gcc-internal-format
  msgid "variant function must be in the same scope as the base function %qE"
! msgstr ""
  
  #: cp/parser.cc:25672
! #, gcc-internal-format
  msgid "declare variant directives are not allowed on virtual functions"
! msgstr ""
  
  #: cp/parser.cc:25679 cp/parser.cc:26128
! #, gcc-internal-format
  msgid "declare variant directives are not allowed on defaulted functions"
! msgstr ""
  
  #: cp/parser.cc:25686 cp/parser.cc:26135
! #, gcc-internal-format
  msgid "declare variant directives are not allowed on deleted functions"
! msgstr ""
  
  #: cp/parser.cc:25694
! #, gcc-internal-format
  msgid "declare variant directives are not allowed on immediate functions"
! msgstr ""
  
  #: cp/parser.cc:25969
  #, gcc-internal-format
*************** msgid "attribute with no arguments conta
*** 67246,67285 ****
  msgstr "attribut utan några argument innehåller inga parameterpaket"
  
  #: cp/parser.cc:33591
! #, fuzzy, gcc-internal-format
! #| msgid "expected call expression"
  msgid "expected conditional-expression"
! msgstr "ett anropsuttryck förväntades"
  
  #: cp/parser.cc:33638
! #, fuzzy, gcc-internal-format
! #| msgid "%qs is incompatible with %qs"
  msgid "%qs is only available with %qs"
! msgstr "%qs är inkompatibel med %qs"
  
  #: cp/parser.cc:33654
! #, fuzzy, gcc-internal-format
! #| msgid "%qE attribute ignored for %qE"
  msgid "attributes are ignored on %qs"
! msgstr "attributet %qE ignorerat för %qE"
  
  #: cp/parser.cc:33770
! #, fuzzy, gcc-internal-format
! #| msgid "attributes ignored on uninstantiated type"
  msgid "attributes are ignored on function contract specifiers"
! msgstr "attributet ignorerat på oinstansierad typ"
  
  #: cp/parser.cc:33874
! #, fuzzy, gcc-internal-format
! #| msgid "contracts are only available with %<-fcontracts%>"
  msgid "contracts are only available with %qs"
! msgstr "kontrakt är endast tillgängliga med %<-fcontracts%>"
  
  #: cp/parser.cc:33957
! #, fuzzy, gcc-internal-format
! #| msgid "pack indexing only available with %<-std=c++2c%> or %<-std=gnu++2c%>"
  msgid "annotations only available with %<-std=c++2c%> or %<-std=gnu++2c%>"
! msgstr "paketindexering är endast tillgängliga med %<-std=c++2c%> eller %<-std=gnu++2c%>"
  
  #: cp/parser.cc:33988
  #, gcc-internal-format
--- 67057,67090 ----
  msgstr "attribut utan några argument innehåller inga parameterpaket"
  
  #: cp/parser.cc:33591
! #, gcc-internal-format
  msgid "expected conditional-expression"
! msgstr "ett villkorsuttryck förväntades"
  
  #: cp/parser.cc:33638
! #, gcc-internal-format
  msgid "%qs is only available with %qs"
! msgstr "%qs är endast tillgängligt med %qs"
  
  #: cp/parser.cc:33654
! #, gcc-internal-format
  msgid "attributes are ignored on %qs"
! msgstr ""
  
  #: cp/parser.cc:33770
! #, gcc-internal-format
  msgid "attributes are ignored on function contract specifiers"
! msgstr ""
  
  #: cp/parser.cc:33874
! #, gcc-internal-format
  msgid "contracts are only available with %qs"
! msgstr "kontrakt är endast tillgängliga med %qs"
  
  #: cp/parser.cc:33957
! #, gcc-internal-format
  msgid "annotations only available with %<-std=c++2c%> or %<-std=gnu++2c%>"
! msgstr "annotationer är endast tillgängligaa med %<-std=c++2c%> eller %<-std=gnu++2c%>"
  
  #: cp/parser.cc:33988
  #, gcc-internal-format
*************** msgid "expected %<class%>, %<typename%>,
*** 67596,67605 ****
  msgstr "%<class%>, %<typename%> eller %<template%> förväntades"
  
  #: cp/parser.cc:37793
! #, fuzzy, gcc-internal-format
! #| msgid "expected %<:%>"
  msgid "expected %<:]%>"
! msgstr "%<:%> förväntades"
  
  #: cp/parser.cc:38128
  #, gcc-internal-format
--- 67401,67409 ----
  msgstr "%<class%>, %<typename%> eller %<template%> förväntades"
  
  #: cp/parser.cc:37793
! #, gcc-internal-format
  msgid "expected %<:]%>"
! msgstr "%<:]%> förväntades"
  
  #: cp/parser.cc:38128
  #, gcc-internal-format
*************** msgid "%<const%>, %<volatile%> or %<__re
*** 67857,67872 ****
  msgstr "%<const%>-, %<volatile%>- eller %<__restrict%>-kvalificerad typ %qT i %<#pragma omp declare reduction%>"
  
  #: cp/parser.cc:55521
! #, fuzzy, gcc-internal-format
! #| msgid "types may not be defined in iterator type"
  msgid "types may not be defined within %<declare mapper%>"
! msgstr "typer får inte definieras i iteratortyp"
  
  #: cp/parser.cc:55693
! #, fuzzy, gcc-internal-format
! #| msgid "expected %<simd%>, %<reduction%>, %<target%> or %<variant%>"
  msgid "expected %<simd%>, %<reduction%>, %<target%>, %<mapper%> or %<variant%>"
! msgstr "%<simd%>, %<reduction%>, %<target%> eller %<variant%> förväntades"
  
  #: cp/parser.cc:56258
  #, gcc-internal-format
--- 67661,67674 ----
  msgstr "%<const%>-, %<volatile%>- eller %<__restrict%>-kvalificerad typ %qT i %<#pragma omp declare reduction%>"
  
  #: cp/parser.cc:55521
! #, gcc-internal-format
  msgid "types may not be defined within %<declare mapper%>"
! msgstr "typer får inte definieras i inom %<declare mapper%>"
  
  #: cp/parser.cc:55693
! #, gcc-internal-format
  msgid "expected %<simd%>, %<reduction%>, %<target%>, %<mapper%> or %<variant%>"
! msgstr "%<simd%>, %<reduction%>, %<target%>, %<mapper%> eller %<variant%> förväntades"
  
  #: cp/parser.cc:56258
  #, gcc-internal-format
*************** msgstr[0] "det finns %i kandidat"
*** 68029,68045 ****
  msgstr[1] "det finns %i kandidater"
  
  #: cp/pt.cc:2112
! #, fuzzy, gcc-internal-format
! #| msgid "candidate is:"
! #| msgid_plural "candidates are:"
  msgid "candidate is: %#qD"
! msgstr "kandidat är:"
  
  #: cp/pt.cc:2121
! #, fuzzy, gcc-internal-format
! #| msgid "candidate %i:"
  msgid "candidate %i: %#qD"
! msgstr "kandidat %i:"
  
  #: cp/pt.cc:2254
  #, gcc-internal-format
--- 67831,67844 ----
  msgstr[1] "det finns %i kandidater"
  
  #: cp/pt.cc:2112
! #, gcc-internal-format
  msgid "candidate is: %#qD"
! msgstr "kandidat är: %#qD"
  
  #: cp/pt.cc:2121
! #, gcc-internal-format
  msgid "candidate %i: %#qD"
! msgstr "kandidat %i: %#qD"
  
  #: cp/pt.cc:2254
  #, gcc-internal-format
*************** msgid "function returning a function"
*** 68941,68956 ****
  msgstr "funktion som returnerar en funktion"
  
  #: cp/pt.cc:16760
! #, fuzzy, gcc-internal-format
! #| msgid "%qs is not defined as a type"
  msgid "%qE is not usable in a splice type"
! msgstr "%qs är inte definierat som en typ"
  
  #: cp/pt.cc:16762
! #, fuzzy, gcc-internal-format
! #| msgid "%qE is not a variable in clause %qs"
  msgid "%qE is not usable in a splice scope"
! msgstr "%qE är inte en variabel i klausul %qs"
  
  #: cp/pt.cc:17323
  #, gcc-internal-format
--- 68740,68753 ----
  msgstr "funktion som returnerar en funktion"
  
  #: cp/pt.cc:16760
! #, gcc-internal-format
  msgid "%qE is not usable in a splice type"
! msgstr ""
  
  #: cp/pt.cc:16762
! #, gcc-internal-format
  msgid "%qE is not usable in a splice scope"
! msgstr ""
  
  #: cp/pt.cc:17323
  #, gcc-internal-format
*************** msgid "%qT resolves to %qT, which is not
*** 69018,69033 ****
  msgstr "%qT slås upp till %qT som inte är en uppräkningstyp"
  
  #: cp/pt.cc:17622
! #, fuzzy, gcc-internal-format
! #| msgid "%qT resolves to %qT, which is not a class type"
  msgid "%qT resolves to %qT, which is not a non-union class type"
! msgstr "%qT löses upp till %qT, som inte är en klasstyp"
  
  #: cp/pt.cc:17630
! #, fuzzy, gcc-internal-format
! #| msgid "%qT resolves to %qT, which is not an enumeration type"
  msgid "%qT resolves to %qT, which is not a union type"
! msgstr "%qT slås upp till %qT som inte är en uppräkningstyp"
  
  #: cp/pt.cc:17788
  #, gcc-internal-format
--- 68815,68828 ----
  msgstr "%qT slås upp till %qT som inte är en uppräkningstyp"
  
  #: cp/pt.cc:17622
! #, gcc-internal-format
  msgid "%qT resolves to %qT, which is not a non-union class type"
! msgstr "%qT löses upp till %qT, som inte är en icke-unions-klasstyp"
  
  #: cp/pt.cc:17630
! #, gcc-internal-format
  msgid "%qT resolves to %qT, which is not a union type"
! msgstr "%qT slås upp till %qT som inte är en unionstyp"
  
  #: cp/pt.cc:17788
  #, gcc-internal-format
*************** msgstr "användning av %qs i mall"
*** 69038,69047 ****
  #. instantiation; must be because we're trying to refer to it
  #. while forming its declaration (c++/120204).
  #: cp/pt.cc:17961
! #, fuzzy, gcc-internal-format
! #| msgid "exception specification of %qD depends on itself"
  msgid "declaration of %<%T::%D%> depends on itself"
! msgstr "explicit specifikation av %qD beror på sig själv"
  
  #: cp/pt.cc:18117
  #, gcc-internal-format
--- 68833,68841 ----
  #. instantiation; must be because we're trying to refer to it
  #. while forming its declaration (c++/120204).
  #: cp/pt.cc:17961
! #, gcc-internal-format
  msgid "declaration of %<%T::%D%> depends on itself"
! msgstr "deklarationen av %<%T::%D%> beror på sig själv"
  
  #: cp/pt.cc:18117
  #, gcc-internal-format
*************** msgid "deduced expression type does not
*** 69405,69432 ****
  msgstr "härledd uttryckstyp uppfyller inte sina platshållarbegränsningar"
  
  #: cp/reflect.cc:130
! #, fuzzy, gcc-internal-format
! #| msgid "new cannot be applied to a reference type"
  msgid "%<^^%> cannot be applied to a placeholder type"
! msgstr "new kan inte användas på en referenstyp"
  
  #: cp/reflect.cc:137
! #, fuzzy, gcc-internal-format
! #| msgid "new cannot be applied to a function type"
  msgid "%<^^%> cannot be applied to a pack index"
! msgstr "new kan inte användas på en funktionstyp"
  
  #: cp/reflect.cc:142
! #, fuzzy, gcc-internal-format
! #| msgid "%qE cannot be applied to non-pointer type %qT"
  msgid "%<^^%> cannot be applied to a non-type template parameter %qD"
! msgstr "attributet %qE kan inte användas på en icke-pekartyp %qT"
  
  #: cp/reflect.cc:150
! #, fuzzy, gcc-internal-format
! #| msgid "%qE cannot be applied to non-pointer type %qT"
  msgid "%<^^%> cannot be applied to a capture %qD"
! msgstr "attributet %qE kan inte användas på en icke-pekartyp %qT"
  
  #: cp/reflect.cc:157
  #, gcc-internal-format
--- 69199,69222 ----
  msgstr "härledd uttryckstyp uppfyller inte sina platshållarbegränsningar"
  
  #: cp/reflect.cc:130
! #, gcc-internal-format
  msgid "%<^^%> cannot be applied to a placeholder type"
! msgstr "%<^^%> kan inte användas på en platshållartyp"
  
  #: cp/reflect.cc:137
! #, gcc-internal-format
  msgid "%<^^%> cannot be applied to a pack index"
! msgstr "%<^^%> kan inte användas på ett paketindex"
  
  #: cp/reflect.cc:142
! #, gcc-internal-format
  msgid "%<^^%> cannot be applied to a non-type template parameter %qD"
! msgstr "%<^^%> kan inte användas på en mallparameter %qD som inte är en typ"
  
  #: cp/reflect.cc:150
! #, gcc-internal-format
  msgid "%<^^%> cannot be applied to a capture %qD"
! msgstr "%<^^%> kan inte användas på en fångst %qD"
  
  #: cp/reflect.cc:157
  #, gcc-internal-format
*************** msgid "%<^^%> cannot be applied a local
*** 69439,69454 ****
  msgstr ""
  
  #: cp/reflect.cc:183
! #, fuzzy, gcc-internal-format
! #| msgid "new cannot be applied to a function type"
  msgid "%<^^%> cannot be applied to a using-declaration"
! msgstr "new kan inte användas på en funktionstyp"
  
  #: cp/reflect.cc:189
! #, fuzzy, gcc-internal-format
! #| msgid "new cannot be applied to a function type"
  msgid "%<^^%> cannot be applied to a concept check"
! msgstr "new kan inte användas på en funktionstyp"
  
  #: cp/reflect.cc:207
  #, gcc-internal-format
--- 69229,69242 ----
  msgstr ""
  
  #: cp/reflect.cc:183
! #, gcc-internal-format
  msgid "%<^^%> cannot be applied to a using-declaration"
! msgstr "%<^^%> kan inte användas på en using-deklaration"
  
  #: cp/reflect.cc:189
! #, gcc-internal-format
  msgid "%<^^%> cannot be applied to a concept check"
! msgstr "%<^^%> kan inte användas på en konceptkontroll"
  
  #: cp/reflect.cc:207
  #, gcc-internal-format
*************** msgid "cannot take the reflection of an
*** 69456,69465 ****
  msgstr ""
  
  #: cp/reflect.cc:410
! #, fuzzy, gcc-internal-format
! #| msgid "%<::%E%> is not a class or namespace"
  msgid "%<std::ranges%> is not a namespace"
! msgstr "%<::%E%> är inte en klass eller namnrymd"
  
  #: cp/reflect.cc:453
  #, gcc-internal-format
--- 69244,69252 ----
  msgstr ""
  
  #: cp/reflect.cc:410
! #, gcc-internal-format
  msgid "%<std::ranges%> is not a namespace"
! msgstr "%<std::ranges%> är inte en namnrymd"
  
  #: cp/reflect.cc:453
  #, gcc-internal-format
*************** msgid "%<reflect_constant_string%> calle
*** 69467,69476 ****
  msgstr ""
  
  #: cp/reflect.cc:489
! #, fuzzy, gcc-internal-format
! #| msgid "%<decltype%> evaluates to %qT, which is not a class or enumeration type"
  msgid "%<reflect_constant_array%> argument with %qT which is not a structural type"
! msgstr "%<decltype%> beräknas till %qT, som inte är en klass eller uppräkningstyp"
  
  #: cp/reflect.cc:503
  #, gcc-internal-format
--- 69254,69262 ----
  msgstr ""
  
  #: cp/reflect.cc:489
! #, gcc-internal-format
  msgid "%<reflect_constant_array%> argument with %qT which is not a structural type"
! msgstr ""
  
  #: cp/reflect.cc:503
  #, gcc-internal-format
*************** msgid "incorrect type %qT of %<std::rang
*** 69503,69512 ****
  msgstr ""
  
  #: cp/reflect.cc:879
! #, fuzzy, gcc-internal-format
! #| msgid "expected interface or pointer to interface"
  msgid "unexpected type %qT of iterator dereference"
! msgstr "gränssnitt eller pekare till gränssnitt förväntades"
  
  #: cp/reflect.cc:947
  #, gcc-internal-format
--- 69289,69297 ----
  msgstr ""
  
  #: cp/reflect.cc:879
! #, gcc-internal-format
  msgid "unexpected type %qT of iterator dereference"
! msgstr ""
  
  #: cp/reflect.cc:947
  #, gcc-internal-format
*************** msgid "couldn%'t throw %qs"
*** 69514,69523 ****
  msgstr ""
  
  #: cp/reflect.cc:1046
! #, fuzzy, gcc-internal-format
! #| msgid "expected %<operator%>"
  msgid "unexpected %<std::meta::operators%>"
! msgstr "%<operator%> förväntades"
  
  #: cp/reflect.cc:2671
  #, gcc-internal-format
--- 69299,69307 ----
  msgstr ""
  
  #: cp/reflect.cc:1046
! #, gcc-internal-format
  msgid "unexpected %<std::meta::operators%>"
! msgstr ""
  
  #: cp/reflect.cc:2671
  #, gcc-internal-format
*************** msgid "couldn%'t look up %<%D::%D%>"
*** 69525,69541 ****
  msgstr ""
  
  #: cp/reflect.cc:2959
! #, fuzzy, gcc-internal-format
! #| msgid "could not include %s"
  msgid "couldn%'t look up %qs"
! msgstr "kunde inte inkludera %s"
  
  #: cp/reflect.cc:3113 cp/reflect.cc:3176 cp/reflect.cc:3231 cp/reflect.cc:3311
  #: cp/reflect.cc:6233
! #, fuzzy, gcc-internal-format
! #| msgid "  expected a type, got %qE"
  msgid "unexpected return type of %qs"
! msgstr "  förväntade en typ, fick %qE"
  
  #: cp/reflect.cc:3856
  #, gcc-internal-format
--- 69309,69323 ----
  msgstr ""
  
  #: cp/reflect.cc:2959
! #, gcc-internal-format
  msgid "couldn%'t look up %qs"
! msgstr ""
  
  #: cp/reflect.cc:3113 cp/reflect.cc:3176 cp/reflect.cc:3231 cp/reflect.cc:3311
  #: cp/reflect.cc:6233
! #, gcc-internal-format
  msgid "unexpected return type of %qs"
! msgstr ""
  
  #: cp/reflect.cc:3856
  #, gcc-internal-format
*************** msgid "%qT must be a cv-unqualified stru
*** 69543,69558 ****
  msgstr ""
  
  #: cp/reflect.cc:3880
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not an object type"
  msgid "%qT must be an object type"
! msgstr "  %qT är inte en objekttyp"
  
  #: cp/reflect.cc:3907
! #, fuzzy, gcc-internal-format
! #| msgid "%qD must be a member function"
  msgid "%qT must be a function type"
! msgstr "%qD måste vara en medlemsfunktion"
  
  #: cp/reflect.cc:4784 cp/reflect.cc:4911
  #, gcc-internal-format
--- 69325,69338 ----
  msgstr ""
  
  #: cp/reflect.cc:3880
! #, gcc-internal-format
  msgid "%qT must be an object type"
! msgstr "%qT måste vara en objekttyp"
  
  #: cp/reflect.cc:3907
! #, gcc-internal-format
  msgid "%qT must be a function type"
! msgstr "%qT måste vara en funktionstyp"
  
  #: cp/reflect.cc:4784 cp/reflect.cc:4911
  #, gcc-internal-format
*************** msgid "couldn%'t instantiate %<std::%s<%
*** 69560,69569 ****
  msgstr ""
  
  #: cp/reflect.cc:5515
! #, fuzzy, gcc-internal-format
! #| msgid "expected template-argument"
  msgid "unexpected %<data_member_options%> argument"
! msgstr "mallargument förväntades"
  
  #: cp/reflect.cc:5884
  #, gcc-internal-format
--- 69340,69348 ----
  msgstr ""
  
  #: cp/reflect.cc:5515
! #, gcc-internal-format
  msgid "unexpected %<data_member_options%> argument"
! msgstr ""
  
  #: cp/reflect.cc:5884
  #, gcc-internal-format
*************** msgid "name %qD used in multiple data me
*** 69606,69615 ****
  msgstr ""
  
  #: cp/reflect.cc:5956
! #, fuzzy, gcc-internal-format
! #| msgid "cannot declare bit-field %qs with %<warn_if_not_aligned%> type"
  msgid "cannot declare bit-field in %<warn_if_not_aligned%> type"
! msgstr "det går inte att deklarera bitfältet %qs med typen %<warn_if_not_aligned%>"
  
  #: cp/reflect.cc:5966
  #, gcc-internal-format
--- 69385,69393 ----
  msgstr ""
  
  #: cp/reflect.cc:5956
! #, gcc-internal-format
  msgid "cannot declare bit-field in %<warn_if_not_aligned%> type"
! msgstr "det går inte att deklarera ett bitfält i typen %<warn_if_not_aligned%>"
  
  #: cp/reflect.cc:5966
  #, gcc-internal-format
*************** msgid "%<define_aggregate%> evaluated fr
*** 69622,69631 ****
  msgstr ""
  
  #: cp/reflect.cc:5991 cp/reflect.cc:6074
! #, fuzzy, gcc-internal-format
! #| msgid "%<switch%> name defined here"
  msgid "%<consteval%> block defined here"
! msgstr "%<switch%>-namnet är definierat här"
  
  #: cp/reflect.cc:6007 cp/reflect.cc:6066
  #, gcc-internal-format
--- 69400,69408 ----
  msgstr ""
  
  #: cp/reflect.cc:5991 cp/reflect.cc:6074
! #, gcc-internal-format
  msgid "%<consteval%> block defined here"
! msgstr ""
  
  #: cp/reflect.cc:6007 cp/reflect.cc:6066
  #, gcc-internal-format
*************** msgid "%<access_context::current%> used
*** 69673,69688 ****
  msgstr ""
  
  #: cp/reflect.cc:6263
! #, fuzzy, gcc-internal-format
! #| msgid "invalid %<PHI%> argument"
  msgid "invalid %<access_context%> argument"
! msgstr "ogiltigt %<PHI%>-argument"
  
  #: cp/reflect.cc:6274
! #, fuzzy, gcc-internal-format
! #| msgid "unexpected %<else%>"
  msgid "unexpected %<access_context::scope()%>"
! msgstr "oväntat %<else%>"
  
  #: cp/reflect.cc:6284
  #, gcc-internal-format
--- 69450,69463 ----
  msgstr ""
  
  #: cp/reflect.cc:6263
! #, gcc-internal-format
  msgid "invalid %<access_context%> argument"
! msgstr "ogiltigt %<access_context%>-argument"
  
  #: cp/reflect.cc:6274
! #, gcc-internal-format
  msgid "unexpected %<access_context::scope()%>"
! msgstr "oväntat %<access_context::scope()%>"
  
  #: cp/reflect.cc:6284
  #, gcc-internal-format
*************** msgid "unexpected %<access_context::desi
*** 69690,69711 ****
  msgstr ""
  
  #: cp/reflect.cc:7047
! #, fuzzy, gcc-internal-format
! #| msgid "unexpected argument"
  msgid "unexpected argument to %qs"
! msgstr "oväntat argument"
  
  #: cp/reflect.cc:7336
! #, fuzzy, gcc-internal-format
! #| msgid "unknown spec function %qs"
  msgid "unknown metafunction %qD"
! msgstr "okänd specifikationsfunktion %qs"
  
  #: cp/reflect.cc:8010
! #, fuzzy, gcc-internal-format
! #| msgid "%<score%> argument must be constant integer expression at %C"
  msgid "splice argument must be an expression of type %qs"
! msgstr "argument till %<score%> måste vara ett konstant heltalsuttryck vid %C"
  
  #: cp/reflect.cc:8206
  #, gcc-internal-format
--- 69465,69483 ----
  msgstr ""
  
  #: cp/reflect.cc:7047
! #, gcc-internal-format
  msgid "unexpected argument to %qs"
! msgstr "oväntat argument till %qs"
  
  #: cp/reflect.cc:7336
! #, gcc-internal-format
  msgid "unknown metafunction %qD"
! msgstr ""
  
  #: cp/reflect.cc:8010
! #, gcc-internal-format
  msgid "splice argument must be an expression of type %qs"
! msgstr ""
  
  #: cp/reflect.cc:8206
  #, gcc-internal-format
*************** msgid "consteval-only variable %qD not d
*** 69713,69722 ****
  msgstr ""
  
  #: cp/reflect.cc:8208
! #, fuzzy, gcc-internal-format
! #| msgid "%qE used with %<constexpr%>"
  msgid "add %<constexpr%>"
! msgstr "%qE använt med %<constexpr%>"
  
  #: cp/reflect.cc:8212
  #, gcc-internal-format
--- 69485,69493 ----
  msgstr ""
  
  #: cp/reflect.cc:8208
! #, gcc-internal-format
  msgid "add %<constexpr%>"
! msgstr ""
  
  #: cp/reflect.cc:8212
  #, gcc-internal-format
*************** msgid "consteval-only expressions are on
*** 69724,69751 ****
  msgstr ""
  
  #: cp/reflect.cc:8319
! #, fuzzy, gcc-internal-format
! #| msgid "function definition declared %qs"
  msgid "function of consteval-only type must be declared %qs"
! msgstr "funktionsdefinition deklarerad som %qs"
  
  #: cp/reflect.cc:8343 cp/reflect.cc:8359
! #, fuzzy, gcc-internal-format
! #| msgid "expected boolean expression"
  msgid "expected a reflection of an expression"
! msgstr "booleskt uttryck förväntades"
  
  #: cp/reflect.cc:8349 cp/reflect.cc:8353
! #, fuzzy, gcc-internal-format
! #| msgid "keyword %<typename%> not allowed outside of templates"
  msgid "add %<typename%> to denote a type outside a type-only context"
! msgstr "nyckelordet %<typename%> är inte tillåtet utanför mallar"
  
  #: cp/reflect.cc:8372
! #, fuzzy, gcc-internal-format
! #| msgid "expected constructor, destructor, or type conversion"
  msgid "cannot use constructor or destructor %qD in a splice expression"
! msgstr "konstruerare, destruerare eller typkonvertering förväntades"
  
  #: cp/reflect.cc:8380
  #, gcc-internal-format
--- 69495,69518 ----
  msgstr ""
  
  #: cp/reflect.cc:8319
! #, gcc-internal-format
  msgid "function of consteval-only type must be declared %qs"
! msgstr ""
  
  #: cp/reflect.cc:8343 cp/reflect.cc:8359
! #, gcc-internal-format
  msgid "expected a reflection of an expression"
! msgstr ""
  
  #: cp/reflect.cc:8349 cp/reflect.cc:8353
! #, gcc-internal-format
  msgid "add %<typename%> to denote a type outside a type-only context"
! msgstr ""
  
  #: cp/reflect.cc:8372
! #, gcc-internal-format
  msgid "cannot use constructor or destructor %qD in a splice expression"
! msgstr ""
  
  #: cp/reflect.cc:8380
  #, gcc-internal-format
*************** msgid "cannot use an unnamed bit-field %
*** 69753,69762 ****
  msgstr ""
  
  #: cp/reflect.cc:8393
! #, fuzzy, gcc-internal-format
! #| msgid "cannot explicitly declare member %q#D to have extern linkage"
  msgid "cannot implicitly reference a class member %qD through a splice"
! msgstr "det går inte att deklarera medlem %q#D att ha extern länkklass"
  
  #: cp/reflect.cc:8407
  #, gcc-internal-format
--- 69520,69528 ----
  msgstr ""
  
  #: cp/reflect.cc:8393
! #, gcc-internal-format
  msgid "cannot implicitly reference a class member %qD through a splice"
! msgstr ""
  
  #: cp/reflect.cc:8407
  #, gcc-internal-format
*************** msgid "unary %<&%> applied to an anonymo
*** 69764,69785 ****
  msgstr ""
  
  #: cp/reflect.cc:8426
! #, fuzzy, gcc-internal-format
! #| msgid "use of local variable with automatic storage from containing function"
  msgid "use of local variable with automatic storage from containing function in a splice expression"
! msgstr "användning av lokal variabel med automatisk lagringsklass från en kringliggande funktion"
  
  #: cp/reflect.cc:8439
! #, fuzzy, gcc-internal-format
! #| msgid "call to consteval function %qE is not a constant expression"
  msgid "cannot use an annotation %qE in a splice expression"
! msgstr "anrop av consteval-funktionen %qE är inte ett konstant uttryck"
  
  #: cp/reflect.cc:8448
! #, fuzzy, gcc-internal-format
! #| msgid "Warn about uses of a comma operator within a subscripting expression."
  msgid "cannot use a data member specification in a splice expression"
! msgstr "Varna för användning av en kommaoperator i ett indexuttryck."
  
  #: cp/rtti.cc:308
  #, gcc-internal-format
--- 69530,69548 ----
  msgstr ""
  
  #: cp/reflect.cc:8426
! #, gcc-internal-format
  msgid "use of local variable with automatic storage from containing function in a splice expression"
! msgstr "användning av lokal variabel med automatisk lagringsklass från en kringliggande funktion i ett splice-uttryck"
  
  #: cp/reflect.cc:8439
! #, gcc-internal-format
  msgid "cannot use an annotation %qE in a splice expression"
! msgstr ""
  
  #: cp/reflect.cc:8448
! #, gcc-internal-format
  msgid "cannot use a data member specification in a splice expression"
! msgstr ""
  
  #: cp/rtti.cc:308
  #, gcc-internal-format
*************** msgstr "ogiltig användning av %qD i en
*** 69984,69990 ****
  #: cp/semantics.cc:2774
  #, gcc-internal-format
  msgid "invalid use of member %qD in constructor %<pre%> contract"
! msgstr "ogiltig användning av %qD i ett konsturearar-%<pre%>-kontrakt"
  
  #: cp/semantics.cc:2778
  #, gcc-internal-format
--- 69747,69753 ----
  #: cp/semantics.cc:2774
  #, gcc-internal-format
  msgid "invalid use of member %qD in constructor %<pre%> contract"
! msgstr "ogiltig användning av %qD i ett konstruerar-%<pre%>-kontrakt"
  
  #: cp/semantics.cc:2778
  #, gcc-internal-format
*************** msgid "%<this%> is unavailable for stati
*** 70032,70047 ****
  msgstr "%<this%> är inte tillgängligt i en statisk medlemsfunktion"
  
  #: cp/semantics.cc:3675
! #, fuzzy, gcc-internal-format
! #| msgid "invalid use of member %qD in constructor %<pre%> contract"
  msgid "invalid use of %<this%> in a constructor %<pre%> condition"
! msgstr "ogiltig användning av %qD i ett konsturearar-%<pre%>-kontrakt"
  
  #: cp/semantics.cc:3677
! #, fuzzy, gcc-internal-format
! #| msgid "invalid use of member %qD in destructor %<post%> contract"
  msgid "invalid use of %<this%> in a destructor %<post%> condition"
! msgstr "ogiltig användning av %qD i ett destruerar-%<post%>-kontrakt"
  
  #: cp/semantics.cc:3679
  #, gcc-internal-format
--- 69795,69808 ----
  msgstr "%<this%> är inte tillgängligt i en statisk medlemsfunktion"
  
  #: cp/semantics.cc:3675
! #, gcc-internal-format
  msgid "invalid use of %<this%> in a constructor %<pre%> condition"
! msgstr "ogiltig användning av %<this%> i ett konstruerar-%<pre%>-villkor"
  
  #: cp/semantics.cc:3677
! #, gcc-internal-format
  msgid "invalid use of %<this%> in a destructor %<post%> condition"
! msgstr "ogiltig användning av %<this%> i ett destruerar-%<post%>-villkor"
  
  #: cp/semantics.cc:3679
  #, gcc-internal-format
*************** msgid "%qT is not an enumeration type"
*** 70189,70198 ****
  msgstr "%qT är inte en uppräkningstyp"
  
  #: cp/semantics.cc:5204
! #, fuzzy, gcc-internal-format
! #| msgid "size of array has non-integral type %qT"
  msgid "pack index has non-integral type %qT"
! msgstr "storlek på vektorn av typen %qT är inte en heltalstyp"
  
  #: cp/semantics.cc:5211
  #, gcc-internal-format
--- 69950,69958 ----
  msgstr "%qT är inte en uppräkningstyp"
  
  #: cp/semantics.cc:5204
! #, gcc-internal-format
  msgid "pack index has non-integral type %qT"
! msgstr "paketindex är inte en heltalstyp %qT"
  
  #: cp/semantics.cc:5211
  #, gcc-internal-format
*************** msgid "pack index is not an integral con
*** 70200,70215 ****
  msgstr "paketindexet är inte en heltalskonstant"
  
  #: cp/semantics.cc:5219
! #, fuzzy, gcc-internal-format
! #| msgid "pack index is negative"
  msgid "pack index %qE is negative"
! msgstr "paketindexet är negativt"
  
  #: cp/semantics.cc:5225
! #, fuzzy, gcc-internal-format
! #| msgid "pack index is out of range"
  msgid "pack index %qE is out of range for pack of length %qd"
! msgstr "paketindexet är utanför intervallet"
  
  #. Parameter packs can only be used in templates
  #: cp/semantics.cc:5363
--- 69960,69973 ----
  msgstr "paketindexet är inte en heltalskonstant"
  
  #: cp/semantics.cc:5219
! #, gcc-internal-format
  msgid "pack index %qE is negative"
! msgstr "paketindexet %qE är negativt"
  
  #: cp/semantics.cc:5225
! #, gcc-internal-format
  msgid "pack index %qE is out of range for pack of length %qd"
! msgstr "paketindexet %qE är utanför intervallet för paket av längden %qd"
  
  #. Parameter packs can only be used in templates
  #: cp/semantics.cc:5363
*************** msgid "user defined reduction with const
*** 70273,70288 ****
  msgstr "användardefinierad reduktion med konstruerarinitierare för basklassen %qT"
  
  #: cp/semantics.cc:7431
! #, fuzzy, gcc-internal-format
! #| msgid "function or array type in %<#pragma omp declare reduction%>"
  msgid "%qT is not a struct, union or class type in %<#pragma omp declare mapper%>"
! msgstr "funktions- eller vektortyp i %<#pragma omp declare reduction%>"
  
  #: cp/semantics.cc:7437
! #, fuzzy, gcc-internal-format
! #| msgid "%qD must be a global variable in %<#pragma acc declare link%>"
  msgid "%qT must not be a virtual base class in %<#pragma omp declare mapper%>"
! msgstr "%qD måste vara en global variabel i %<#pragma acc declare link%>"
  
  #: cp/semantics.cc:7743
  #, gcc-internal-format
--- 70031,70044 ----
  msgstr "användardefinierad reduktion med konstruerarinitierare för basklassen %qT"
  
  #: cp/semantics.cc:7431
! #, gcc-internal-format
  msgid "%qT is not a struct, union or class type in %<#pragma omp declare mapper%>"
! msgstr ""
  
  #: cp/semantics.cc:7437
! #, gcc-internal-format
  msgid "%qT must not be a virtual base class in %<#pragma omp declare mapper%>"
! msgstr ""
  
  #: cp/semantics.cc:7743
  #, gcc-internal-format
*************** msgid "%qD appears more than once in %<a
*** 70451,70472 ****
  msgstr "%qD förekommer mer än en gång i %<allocate%>-klausuler"
  
  #: cp/semantics.cc:8959
! #, fuzzy, gcc-internal-format
! #| msgid "%qE is not a variable in %<allocate%> clause"
  msgid "class member %qE not yet supported in %<uses_allocators%> clause"
! msgstr "%qE är inte en variabel i %<allocate%>-klausul"
  
  #: cp/semantics.cc:9004
! #, fuzzy, gcc-internal-format
! #| msgid "The name %qs cannot be used as a defined operator at %C"
  msgid "modifiers cannot be used with predefined allocators"
! msgstr "Namnet %qs får inte användas som en definierad operator vid %C"
  
  #: cp/semantics.cc:9073
! #, fuzzy, gcc-internal-format
! #| msgid "variable length arrays are not yet supported in coroutines"
  msgid "variable length traits arrays are not supported"
! msgstr "vektorer med variabel längd stödjs inte ännu i korutiner"
  
  #: cp/semantics.cc:9147
  #, gcc-internal-format
--- 70207,70225 ----
  msgstr "%qD förekommer mer än en gång i %<allocate%>-klausuler"
  
  #: cp/semantics.cc:8959
! #, gcc-internal-format
  msgid "class member %qE not yet supported in %<uses_allocators%> clause"
! msgstr ""
  
  #: cp/semantics.cc:9004
! #, gcc-internal-format
  msgid "modifiers cannot be used with predefined allocators"
! msgstr ""
  
  #: cp/semantics.cc:9073
! #, gcc-internal-format
  msgid "variable length traits arrays are not supported"
! msgstr "egenskapsvektorer med variabel längd stödjs inte"
  
  #: cp/semantics.cc:9147
  #, gcc-internal-format
*************** msgid "%<decltype%> cannot resolve addre
*** 70624,70639 ****
  msgstr "%<decltype%> kan inte lösa upp adressen till en överlagrad funktion"
  
  #: cp/semantics.cc:13495 cp/semantics.cc:13502
! #, fuzzy, gcc-internal-format
! #| msgid "%qT is not a class type"
  msgid "%qT is not a non-union class type"
! msgstr "%qT är inte en klasstyp"
  
  #: cp/semantics.cc:13513 cp/typeck.cc:1926 cp/typeck.cc:1933
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not an standard layout type"
  msgid "%qT is not a standard-layout type"
! msgstr "  %qT är inte en standardlayouttyp"
  
  #: cp/semantics.cc:13574 rust/backend/rust-tree.cc:5250
  #, gcc-internal-format
--- 70377,70390 ----
  msgstr "%<decltype%> kan inte lösa upp adressen till en överlagrad funktion"
  
  #: cp/semantics.cc:13495 cp/semantics.cc:13502
! #, gcc-internal-format
  msgid "%qT is not a non-union class type"
! msgstr "%qT är inte en icke-unions-klasstyp"
  
  #: cp/semantics.cc:13513 cp/typeck.cc:1926 cp/typeck.cc:1933
! #, gcc-internal-format
  msgid "%qT is not a standard-layout type"
! msgstr "%qT är inte en standardlayouttyp"
  
  #: cp/semantics.cc:13574 rust/backend/rust-tree.cc:5250
  #, gcc-internal-format
*************** msgid "%<__builtin_is_corresponding_memb
*** 70661,70670 ****
  msgstr "argumentet till %<__builtin_is_corresponding_member%> är inte en pekare till en medlem"
  
  #: cp/semantics.cc:13876
! #, fuzzy, gcc-internal-format
! #| msgid "%<__builtin_is_pointer_interconvertible_with_class%> needs a single argument"
  msgid "%<__builtin_is_string_literal%> needs a single argument"
! msgstr "%<__builtin_is_pointer_interconvertible_with_class%> behöver ett ensamt argument"
  
  #: cp/semantics.cc:13888
  #, gcc-internal-format
--- 70412,70420 ----
  msgstr "argumentet till %<__builtin_is_corresponding_member%> är inte en pekare till en medlem"
  
  #: cp/semantics.cc:13876
! #, gcc-internal-format
  msgid "%<__builtin_is_string_literal%> needs a single argument"
! msgstr "%<__builtin_is_string_literal%> behöver ett ensamt argument"
  
  #: cp/semantics.cc:13888
  #, gcc-internal-format
*************** msgid "checking %qs for type %qT with a
*** 70677,70686 ****
  msgstr ""
  
  #: cp/semantics.cc:14300
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not a reference"
  msgid "%qs argument %qT is a reference"
! msgstr "  %qT är inte en referens"
  
  #: cp/semantics.cc:14471
  #, gcc-internal-format
--- 70427,70435 ----
  msgstr ""
  
  #: cp/semantics.cc:14300
! #, gcc-internal-format
  msgid "%qs argument %qT is a reference"
! msgstr "argumentet %qs till  %qT är en referens"
  
  #: cp/semantics.cc:14471
  #, gcc-internal-format
*************** msgid "%<__builtin_bit_cast%> destinatio
*** 70721,70730 ****
  msgstr "%<__builtin_bit_cast%>-måltyp %qT är inte trivialt kopierbar"
  
  #: cp/semantics.cc:14843
! #, fuzzy, gcc-internal-format
! #| msgid "%<__builtin_bit_cast%> destination type %qT is an array type"
  msgid "%<__builtin_bit_cast%> cannot be used with consteval-only types"
! msgstr "%<__builtin_bit_cast%>-måltyp %qT är en vektortyp"
  
  #: cp/semantics.cc:14870
  #, gcc-internal-format
--- 70470,70478 ----
  msgstr "%<__builtin_bit_cast%>-måltyp %qT är inte trivialt kopierbar"
  
  #: cp/semantics.cc:14843
! #, gcc-internal-format
  msgid "%<__builtin_bit_cast%> cannot be used with consteval-only types"
! msgstr ""
  
  #: cp/semantics.cc:14870
  #, gcc-internal-format
*************** msgid " because all of its copy and move
*** 70767,70800 ****
  msgstr " för att alla dess kopierings- och flyttkonstruerare är borttagna"
  
  #: cp/tree.cc:5047
! #, fuzzy, gcc-internal-format
! #| msgid "%qD is a function, not a type"
  msgid "%qT is a floating-point type"
! msgstr "%qD är en funktion, inte en typ"
  
  #: cp/tree.cc:5052
! #, fuzzy, gcc-internal-format
! #| msgid "%qD is not of pointer type"
  msgid "%qT is a fixed-point type"
! msgstr "%qD är inte av pekartyp"
  
  #: cp/tree.cc:5083
! #, fuzzy, gcc-internal-format
! #| msgid "%qT is not a base of %qT"
  msgid "%qD does not fill all bits of %q#T"
! msgstr "%qT är inte en basklass till %qT"
  
  #: cp/tree.cc:5091
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT does not have unique object representations"
  msgid "%qD has type %qT that does not have unique object representations"
! msgstr "  %qT har inte unika objektrepresentationer"
  
  #: cp/tree.cc:5101
! #, fuzzy, gcc-internal-format
! #| msgid "%q#T has pointer data members"
  msgid "%q#T has no data fields"
! msgstr "%q#T har pekardatamedlemmar"
  
  #: cp/tree.cc:5113
  #, gcc-internal-format
--- 70515,70543 ----
  msgstr " för att alla dess kopierings- och flyttkonstruerare är borttagna"
  
  #: cp/tree.cc:5047
! #, gcc-internal-format
  msgid "%qT is a floating-point type"
! msgstr ""
  
  #: cp/tree.cc:5052
! #, gcc-internal-format
  msgid "%qT is a fixed-point type"
! msgstr ""
  
  #: cp/tree.cc:5083
! #, gcc-internal-format
  msgid "%qD does not fill all bits of %q#T"
! msgstr ""
  
  #: cp/tree.cc:5091
! #, gcc-internal-format
  msgid "%qD has type %qT that does not have unique object representations"
! msgstr "%qD har typen %qT som inte har unika objektrepresentationer"
  
  #: cp/tree.cc:5101
! #, gcc-internal-format
  msgid "%q#T has no data fields"
! msgstr ""
  
  #: cp/tree.cc:5113
  #, gcc-internal-format
*************** msgid "%<std::nullptr_t%> has padding bi
*** 70802,70823 ****
  msgstr ""
  
  #: cp/tree.cc:5142
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT does not have unique object representations"
  msgid "base %qT does not have unique object representations"
! msgstr "  %qT har inte unika objektrepresentationer"
  
  #: cp/tree.cc:5154 cp/tree.cc:5164
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT does not have unique object representations"
  msgid "%qD with type %qT does not have unique object representations"
! msgstr "  %qT har inte unika objektrepresentationer"
  
  #: cp/tree.cc:5190
! #, fuzzy, gcc-internal-format
! #| msgid "comparison between %qT and %qT"
  msgid "padding occurs between %qD and %qD"
! msgstr "jämförelse mellan %qT och %qT"
  
  #: cp/tree.cc:5194
  #, gcc-internal-format
--- 70545,70563 ----
  msgstr ""
  
  #: cp/tree.cc:5142
! #, gcc-internal-format
  msgid "base %qT does not have unique object representations"
! msgstr "basen %qT har inte unika objektrepresentationer"
  
  #: cp/tree.cc:5154 cp/tree.cc:5164
! #, gcc-internal-format
  msgid "%qD with type %qT does not have unique object representations"
! msgstr "%qD med typen %qT har inte unika objektrepresentationer"
  
  #: cp/tree.cc:5190
! #, gcc-internal-format
  msgid "padding occurs between %qD and %qD"
! msgstr "utfyllnad sker mellan %qD och %qD"
  
  #: cp/tree.cc:5194
  #, gcc-internal-format
*************** msgid "padding occurs before %qD"
*** 70830,70845 ****
  msgstr ""
  
  #: cp/tree.cc:5215
! #, fuzzy, gcc-internal-format
! #| msgid "pointer used after %qD"
  msgid "padding occurs after %qD"
! msgstr "pekaren använd efter %qD"
  
  #: cp/tree.cc:5218
! #, fuzzy, gcc-internal-format
! #| msgid "%qs is not a gcov data file"
  msgid "%qT has padding and no data fields"
! msgstr "%qs är inte en gcov-datafil"
  
  #: cp/tree.cc:5327
  #, gcc-internal-format
--- 70570,70583 ----
  msgstr ""
  
  #: cp/tree.cc:5215
! #, gcc-internal-format
  msgid "padding occurs after %qD"
! msgstr "utfyllnad sker efter %qD"
  
  #: cp/tree.cc:5218
! #, gcc-internal-format
  msgid "%qT has padding and no data fields"
! msgstr ""
  
  #: cp/tree.cc:5327
  #, gcc-internal-format
*************** msgid "%qE on %<case%> or %<default%> la
*** 70937,70946 ****
  msgstr "%qE på en %<case%>- eller %<default%>-etikett"
  
  #: cp/tree.cc:5548
! #, fuzzy, gcc-internal-format
! #| msgid "declaration for parameter %qD but no such parameter"
  msgid "%qE on declaration other than parameter or automatic variable"
! msgstr "deklaration av parameter %qD med det finns ingen sådan parameter"
  
  #: cp/tree.cc:5643
  #, gcc-internal-format
--- 70675,70683 ----
  msgstr "%qE på en %<case%>- eller %<default%>-etikett"
  
  #: cp/tree.cc:5548
! #, gcc-internal-format
  msgid "%qE on declaration other than parameter or automatic variable"
! msgstr ""
  
  #: cp/tree.cc:5643
  #, gcc-internal-format
*************** msgid "%qE attribute argument must be an
*** 71028,71061 ****
  msgstr "argument till attribut %qE måste vara ett uttryck som beräknas till sant eller falskt"
  
  #: cp/tree.cc:5898
! #, fuzzy, gcc-internal-format
! #| msgid "%qE on a type other than class or enumeration definition"
  msgid "annotation on a type other than class or enumeration definition"
! msgstr "%qE på en annan typ än en klass- eller uppräkningsdefinition"
  
  #: cp/tree.cc:5905
! #, fuzzy, gcc-internal-format
! #| msgid "%qE attribute only applies to variables"
  msgid "annotation applied to a label"
! msgstr "attributet %qE är bara tillämpligt på variabler"
  
  #: cp/tree.cc:5911
! #, fuzzy, gcc-internal-format
! #| msgid "%qE on unnamed bit-field"
  msgid "annotation on unnamed bit-field"
! msgstr "%qE på ett namnlöst bitfält"
  
  #: cp/tree.cc:5920
! #, fuzzy, gcc-internal-format
! #| msgid "%qD does not have integral type"
  msgid "annotation does not have structural type"
! msgstr "%qD har inte heltalstyp"
  
  #: cp/tree.cc:5935
! #, fuzzy, gcc-internal-format
! #| msgid "  %qT is not nothrow copy constructible"
  msgid "annotation does not have copy constructible type"
! msgstr "  %qT är inte nothrow-kopieringskonstruerbar"
  
  #: cp/tree.cc:6909 rust/backend/rust-tree.cc:3189
  #, gcc-internal-format
--- 70765,70793 ----
  msgstr "argument till attribut %qE måste vara ett uttryck som beräknas till sant eller falskt"
  
  #: cp/tree.cc:5898
! #, gcc-internal-format
  msgid "annotation on a type other than class or enumeration definition"
! msgstr "annotering på en annan typ än en klass- eller uppräkningsdefinition"
  
  #: cp/tree.cc:5905
! #, gcc-internal-format
  msgid "annotation applied to a label"
! msgstr ""
  
  #: cp/tree.cc:5911
! #, gcc-internal-format
  msgid "annotation on unnamed bit-field"
! msgstr "annotering på ett namnlöst bitfält"
  
  #: cp/tree.cc:5920
! #, gcc-internal-format
  msgid "annotation does not have structural type"
! msgstr "annoteringen har inte strukturtyp"
  
  #: cp/tree.cc:5935
! #, gcc-internal-format
  msgid "annotation does not have copy constructible type"
! msgstr ""
  
  #: cp/tree.cc:6909 rust/backend/rust-tree.cc:3189
  #, gcc-internal-format
*************** msgid "%q#T and %q#T are not both the sa
*** 71123,71138 ****
  msgstr ""
  
  #: cp/typeck.cc:1946
! #, fuzzy, gcc-internal-format
! #| msgid "return type of %qD is not %qs"
  msgid "the underlying type of %qT is %qT, but"
! msgstr "returtypen för %qD är inte %qs"
  
  #: cp/typeck.cc:1949
! #, fuzzy, gcc-internal-format
! #| msgid "return type of %qD is not %qs"
  msgid "the underlying type of %qT is %qT"
! msgstr "returtypen för %qD är inte %qs"
  
  #: cp/typeck.cc:1968
  #, gcc-internal-format
--- 70855,70868 ----
  msgstr ""
  
  #: cp/typeck.cc:1946
! #, gcc-internal-format
  msgid "the underlying type of %qT is %qT, but"
! msgstr ""
  
  #: cp/typeck.cc:1949
! #, gcc-internal-format
  msgid "the underlying type of %qT is %qT"
! msgstr ""
  
  #: cp/typeck.cc:1968
  #, gcc-internal-format
*************** msgid "%qD and %qD do not correspond"
*** 71140,71157 ****
  msgstr ""
  
  #: cp/typeck.cc:1975 cp/typeck.cc:1979 cp/typeck.cc:2067
! #, fuzzy, gcc-internal-format
! #| msgid "%qT has no member named %qE"
  msgid "%qT has no member corresponding to %qD"
! msgstr "%qT har ingen medlem med namnet %qE"
  
  #: cp/typeck.cc:2019
! #, fuzzy, gcc-internal-format
! #| msgid "%qs is not a field, but a %qs"
  msgid "%qT has %u field, but"
  msgid_plural "%qT has %u fields, but"
! msgstr[0] "%qs är inte ett fält, utan en %qs"
! msgstr[1] "%qs är inte ett fält, utan en %qs"
  
  #: cp/typeck.cc:2023
  #, gcc-internal-format
--- 70870,70885 ----
  msgstr ""
  
  #: cp/typeck.cc:1975 cp/typeck.cc:1979 cp/typeck.cc:2067
! #, gcc-internal-format
  msgid "%qT has no member corresponding to %qD"
! msgstr "%qT har ingen medlem som motsvarar %qD"
  
  #: cp/typeck.cc:2019
! #, gcc-internal-format
  msgid "%qT has %u field, but"
  msgid_plural "%qT has %u fields, but"
! msgstr[0] "%qT har %u fält, men"
! msgstr[1] "%qT har %u fält, men"
  
  #: cp/typeck.cc:2023
  #, gcc-internal-format
*************** msgid "object missing in use of %qE"
*** 71317,71326 ****
  msgstr "objekt saknas i användning av %qE"
  
  #: cp/typeck.cc:4685
! #, fuzzy, gcc-internal-format
! #| msgid "non-trivial conversion in %qs"
  msgid "no default version in scope"
! msgstr "icketrivial konvertering i %qs"
  
  #: cp/typeck.cc:4694
  #, gcc-internal-format
--- 71045,71053 ----
  msgstr "objekt saknas i användning av %qE"
  
  #: cp/typeck.cc:4685
! #, gcc-internal-format
  msgid "no default version in scope"
! msgstr ""
  
  #: cp/typeck.cc:4694
  #, gcc-internal-format
*************** msgid "must use %<.*%> or %<->*%> to cal
*** 71333,71342 ****
  msgstr "man måste använda %<.*%> eller %<->*%> för att anropa en pekare-till-medlems-funktion i %<%E (...)%>, t.ex. %<(... ->* %E) (...)%>"
  
  #: cp/typeck.cc:4732
! #, fuzzy, gcc-internal-format
! #| msgid "%qE cannot be used as a function"
  msgid "%qT cannot be used as a function"
! msgstr "%qE kan inte användas som en funktion"
  
  #: cp/typeck.cc:4736
  #, gcc-internal-format
--- 71060,71068 ----
  msgstr "man måste använda %<.*%> eller %<->*%> för att anropa en pekare-till-medlems-funktion i %<%E (...)%>, t.ex. %<(... ->* %E) (...)%>"
  
  #: cp/typeck.cc:4732
! #, gcc-internal-format
  msgid "%qT cannot be used as a function"
! msgstr "%qT kan inte användas som en funktion"
  
  #: cp/typeck.cc:4736
  #, gcc-internal-format
*************** msgid "decrement of read-only reference
*** 72102,72111 ****
  msgstr "minskning av endast läsbar referens %qD"
  
  #: cp/typeck2.cc:125
! #, fuzzy, gcc-internal-format
! #| msgid "assignment of read-only member %qD"
  msgid "assignment to read-only type %qT"
! msgstr "tilldelning till endast läsbar medlem %qD"
  
  #: cp/typeck2.cc:180
  #, gcc-internal-format
--- 71828,71836 ----
  msgstr "minskning av endast läsbar referens %qD"
  
  #: cp/typeck2.cc:125
! #, gcc-internal-format
  msgid "assignment to read-only type %qT"
! msgstr "tilldelning till endast läsbar typ %qT"
  
  #: cp/typeck2.cc:180
  #, gcc-internal-format
*************** msgid "cannot declare %<catch%> paramete
*** 72184,72205 ****
  msgstr "det går inte att deklarera en %<catch%>-parameter att vara av abstrakt klasstyp %qT"
  
  #: cp/typeck2.cc:231
! #, fuzzy, gcc-internal-format
! #| msgid "cannot allocate an object of abstract type %qT"
  msgid "cannot construct an object of abstract type %qT"
! msgstr "det går inte att allokera ett objekt av abstrakt typ %qT"
  
  #: cp/typeck2.cc:241
! #, fuzzy, gcc-internal-format
! #| msgid "  because the following virtual functions are pure within %qT:"
  msgid "because the following virtual functions are pure within %qT:"
! msgstr "  för följande virtuella funktioner är rena inuti %qT:"
  
  #: cp/typeck2.cc:248
! #, fuzzy, gcc-internal-format
! #| msgid "%s%#qD"
  msgid "%#qD"
! msgstr "%s%#qD"
  
  #: cp/typeck2.cc:309
  #, gcc-internal-format
--- 71909,71927 ----
  msgstr "det går inte att deklarera en %<catch%>-parameter att vara av abstrakt klasstyp %qT"
  
  #: cp/typeck2.cc:231
! #, gcc-internal-format
  msgid "cannot construct an object of abstract type %qT"
! msgstr "det går inte att konstruera ett objekt av abstrakt typ %qT"
  
  #: cp/typeck2.cc:241
! #, gcc-internal-format
  msgid "because the following virtual functions are pure within %qT:"
! msgstr "för följande virtuella funktioner är rena inuti %qT:"
  
  #: cp/typeck2.cc:248
! #, gcc-internal-format
  msgid "%#qD"
! msgstr "%#qD"
  
  #: cp/typeck2.cc:309
  #, gcc-internal-format
*************** msgid "cannot apply member pointer %qE t
*** 72390,72405 ****
  msgstr "det går inte att applicera medlemspekare %qE på %qE, som är av typ %qT som inte är en klass"
  
  #: cp/typeck2.cc:2464
! #, fuzzy, gcc-internal-format
! #| msgid "pointer to member type %qT incompatible with object type %qT"
  msgid "pointer to member type %qT incompatible with object type %qT because %qT is not derived from %qT"
! msgstr "pekare-på-medlemstyp %qT är inkompatibel med objekttyp %qT"
  
  #: cp/typeck2.cc:2469
! #, fuzzy, gcc-internal-format
! #| msgid "pointer to member type %qT incompatible with object type %qT"
  msgid "pointer to member type %qT incompatible with incomplete object type %qT"
! msgstr "pekare-på-medlemstyp %qT är inkompatibel med objekttyp %qT"
  
  #: cp/typeck2.cc:2532
  #, gcc-internal-format
--- 72112,72125 ----
  msgstr "det går inte att applicera medlemspekare %qE på %qE, som är av typ %qT som inte är en klass"
  
  #: cp/typeck2.cc:2464
! #, gcc-internal-format
  msgid "pointer to member type %qT incompatible with object type %qT because %qT is not derived from %qT"
! msgstr "pekare-på-medlemstyp %qT är inkompatibel med objekttyp %qT eftersom %qT inte är härledd från %qT"
  
  #: cp/typeck2.cc:2469
! #, gcc-internal-format
  msgid "pointer to member type %qT incompatible with incomplete object type %qT"
! msgstr "pekare-på-medlemstyp %qT är inkompatibel med ofullständig objekttyp %qT"
  
  #: cp/typeck2.cc:2532
  #, gcc-internal-format
*************** msgid "%qs argument of %qs intrinsic at
*** 73624,73639 ****
  msgstr "%qs-argumentet till inbyggd %qs vid %L måste ha sorten %d"
  
  #: fortran/check.cc:1118
! #, fuzzy, gcc-internal-format
! #| msgid "%qs argument of %qs intrinsic at %L must be of kind %d"
  msgid "Not supported: %qs argument of %qs intrinsic at %L with kind %d"
! msgstr "%qs-argumentet till inbyggd %qs vid %L måste ha sorten %d"
  
  #: fortran/check.cc:1135
! #, fuzzy, gcc-internal-format
! #| msgid "VALUES argument of DATE_AND_TIME at %L must have a decimal exponent range of at least four"
  msgid "%qs argument of %qs intrinsic at %L must have a decimal exponent range of at least four"
! msgstr "Argumentet VALUES till  DATE_AND_TIME vid %L måste ha ett decimalt exponentinterval på åtminstone fyra"
  
  #: fortran/check.cc:1154
  #, gcc-internal-format
--- 73344,73357 ----
  msgstr "%qs-argumentet till inbyggd %qs vid %L måste ha sorten %d"
  
  #: fortran/check.cc:1118
! #, gcc-internal-format
  msgid "Not supported: %qs argument of %qs intrinsic at %L with kind %d"
! msgstr "Stödjs inte: argumentet %qs till inbyggd %qs vid %L med sorten %d"
  
  #: fortran/check.cc:1135
! #, gcc-internal-format
  msgid "%qs argument of %qs intrinsic at %L must have a decimal exponent range of at least four"
! msgstr "Argumentet %qs till %qs vid %L måste ha ett decimalt exponentinterval på åtminstone fyra"
  
  #: fortran/check.cc:1154
  #, gcc-internal-format
*************** msgid "VALUE argument of the %s intrinsi
*** 73746,73755 ****
  msgstr "VALUE-argumentet till den inbyggda funktionen %s vid %L måste vara definierbart"
  
  #: fortran/check.cc:1852
! #, fuzzy, gcc-internal-format
! #| msgid "%qs argument of %qs intrinsic at %L shall be of type integer, real or character"
  msgid "%qs argument of %qs intrinsic at %L shall be of type %<team_type%> from the intrinsic module %<ISO_FORTRAN_ENV%>"
! msgstr "Argument %qs till inbyggd %qs vid %L skall ha typen heltal, reell eller tecken"
  
  #: fortran/check.cc:1891
  #, gcc-internal-format
--- 73464,73472 ----
  msgstr "VALUE-argumentet till den inbyggda funktionen %s vid %L måste vara definierbart"
  
  #: fortran/check.cc:1852
! #, gcc-internal-format
  msgid "%qs argument of %qs intrinsic at %L shall be of type %<team_type%> from the intrinsic module %<ISO_FORTRAN_ENV%>"
! msgstr "Argument %qs till inbyggd %qs vid %L skall ha typen %<team_type%> från den inbyggda modulen %<ISO_FORTRAN_ENV%>"
  
  #: fortran/check.cc:1891
  #, gcc-internal-format
*************** msgid "SHAPE argument at %L to C_F_POINT
*** 74370,74391 ****
  msgstr "SHAPE-argumentet vid %L till C_F_POINTER måste ha samma storlek som FPTR:s RANK"
  
  #: fortran/check.cc:6214
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "FPTR argument at %L to C_F_POINTER shall not be polymorphic"
  msgid "LOWER argument at %L to C_F_POINTER"
! msgstr "Argumentet FPTR vid %L till C_F_POINTER får inte vara polymorft"
  
  #: fortran/check.cc:6220
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Unexpected SHAPE argument at %L to C_F_POINTER with scalar FPTR"
  msgid "Unexpected LOWER argument at %L to C_F_POINTER with scalar FPTR"
! msgstr "Oväntat SHAPE-argumentet vid %L till C_F_POINTER med skalär FPTR"
  
  #: fortran/check.cc:6241
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "SHAPE argument at %L to C_F_POINTER must have the same size as the RANK of FPTR"
  msgid "LOWER argument at %L to C_F_POINTER must have the same size as the RANK of FPTR"
! msgstr "SHAPE-argumentet vid %L till C_F_POINTER måste ha samma storlek som FPTR:s RANK"
  
  #: fortran/check.cc:6252
  #, gcc-internal-format, gfc-internal-format
--- 74087,74105 ----
  msgstr "SHAPE-argumentet vid %L till C_F_POINTER måste ha samma storlek som FPTR:s RANK"
  
  #: fortran/check.cc:6214
! #, gcc-internal-format, gfc-internal-format
  msgid "LOWER argument at %L to C_F_POINTER"
! msgstr "Argumentet LOWER vid %L till C_F_POINTER"
  
  #: fortran/check.cc:6220
! #, gcc-internal-format, gfc-internal-format
  msgid "Unexpected LOWER argument at %L to C_F_POINTER with scalar FPTR"
! msgstr "Oväntat LOWER-argumentet vid %L till C_F_POINTER med skalär FPTR"
  
  #: fortran/check.cc:6241
! #, gcc-internal-format, gfc-internal-format
  msgid "LOWER argument at %L to C_F_POINTER must have the same size as the RANK of FPTR"
! msgstr "Argumentet LOWER vid %L till C_F_POINTER måste ha samma storlek som FPTR:s RANK"
  
  #: fortran/check.cc:6252
  #, gcc-internal-format, gfc-internal-format
*************** msgid "The number of array elements of t
*** 74513,74522 ****
  msgstr "Antalet vektorelement i argumentet SUB till IMAGE_INDEX vid %L skall vara %d (co-ordning) inte %d"
  
  #: fortran/check.cc:6828
! #, fuzzy, gcc-internal-format
! #| msgid "Too many arguments to %s at %L"
  msgid "%<team%> or %<team_number%> argument to %qs at %L"
! msgstr "För många argument till %s vid %L"
  
  #: fortran/check.cc:6888
  #, gcc-internal-format
--- 74227,74235 ----
  msgstr "Antalet vektorelement i argumentet SUB till IMAGE_INDEX vid %L skall vara %d (co-ordning) inte %d"
  
  #: fortran/check.cc:6828
! #, gcc-internal-format
  msgid "%<team%> or %<team_number%> argument to %qs at %L"
! msgstr ""
  
  #: fortran/check.cc:6888
  #, gcc-internal-format
*************** msgid "Second argument of %<this_image%>
*** 74529,74550 ****
  msgstr ""
  
  #: fortran/check.cc:6943
! #, fuzzy, gcc-internal-format
! #| msgid "DIM argument without COARRAY argument not allowed for THIS_IMAGE intrinsic at %L"
  msgid "%<dim%> argument without %<coarray%> argument not allowed for %<this_image%> intrinsic at %L"
! msgstr "DIM-argument utan COARRAY-argument är inte tillåtet för inbyggd THIS_IMAGE vid %L"
  
  #: fortran/check.cc:6954
! #, fuzzy, gcc-internal-format
! #| msgid "STAT= argument to %s at %L"
  msgid "%<team%> argument to %<this_image%> at %L"
! msgstr "STAT=-argument till %s vid %L"
  
  #: fortran/check.cc:6965
! #, fuzzy, gcc-internal-format
! #| msgid "TEAM argument at %L must be of TEAM_TYPE from the intrinsic module ISO_FORTRAN_ENV, found %s"
  msgid "At most one argument of type %<team_type%> from the intrinsic module %<ISO_FORTRAN_ENV%> to %<this_image%> at %L allowed"
! msgstr "Argumentet till TEAM vid %L måste vara av TEAM_TYPE från den inbyggda modulen ISO_FORTRAN_ENV, hittade %s"
  
  #: fortran/check.cc:7007
  #, gcc-internal-format
--- 74242,74260 ----
  msgstr ""
  
  #: fortran/check.cc:6943
! #, gcc-internal-format
  msgid "%<dim%> argument without %<coarray%> argument not allowed for %<this_image%> intrinsic at %L"
! msgstr "Argumentet %<dim%> utan ett argument %<coarray%> är inte tillåtet för inbyggd %<this_image%> vid %L"
  
  #: fortran/check.cc:6954
! #, gcc-internal-format
  msgid "%<team%> argument to %<this_image%> at %L"
! msgstr ""
  
  #: fortran/check.cc:6965
! #, gcc-internal-format
  msgid "At most one argument of type %<team_type%> from the intrinsic module %<ISO_FORTRAN_ENV%> to %<this_image%> at %L allowed"
! msgstr ""
  
  #: fortran/check.cc:7007
  #, gcc-internal-format
*************** msgid "Failed to create finalizer result
*** 74683,74692 ****
  msgstr ""
  
  #: fortran/class.cc:1849
! #, fuzzy, gcc-internal-format
! #| msgid "invalid id value for reset attribute"
  msgid "Failed to set finalizer result attributes"
! msgstr "ogiltigt id-värde för återställningsattribut"
  
  #: fortran/class.cc:3148 fortran/class.cc:3222
  #, gcc-internal-format
--- 74393,74401 ----
  msgstr ""
  
  #: fortran/class.cc:1849
! #, gcc-internal-format
  msgid "Failed to set finalizer result attributes"
! msgstr ""
  
  #: fortran/class.cc:3148 fortran/class.cc:3222
  #, gcc-internal-format
*************** msgid "opening output file %qs: %s"
*** 74704,74713 ****
  msgstr "vid öppnandet av utdatafil %qs: %s"
  
  #: fortran/cpp.cc:685
! #, fuzzy, gcc-internal-format
! #| msgid "%<-mabi=%s%> not supported with %<-fsanitize=address%>"
  msgid "%<-E%> is not supported with %<-fpreprocessed%>"
! msgstr "%<-mabi=%s%> stödjs inte med %<-fsanitize=address%>"
  
  #: fortran/data.cc:67
  #, gcc-internal-format, gfc-internal-format
--- 74413,74421 ----
  msgstr "vid öppnandet av utdatafil %qs: %s"
  
  #: fortran/cpp.cc:685
! #, gcc-internal-format
  msgid "%<-E%> is not supported with %<-fpreprocessed%>"
! msgstr "%<-E%> stödjs inte med %<-fpreprocessed%>"
  
  #: fortran/data.cc:67
  #, gcc-internal-format, gfc-internal-format
*************** msgid "The derived parameter %qs at %C d
*** 75410,75419 ****
  msgstr "Den härledda parametern %qs vid %C har inte ett standardvärde"
  
  #: fortran/decl.cc:4075
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "The parameter expression at %C must be of INTEGER type and not %s type"
  msgid "The type parameter expression at %L must be of INTEGER type and not %s"
! msgstr "Parameteruttrycket vid %C måste vara av typen INTEGER och inte av typen %s"
  
  #: fortran/decl.cc:4113
  #, gcc-internal-format, gfc-internal-format
--- 75118,75126 ----
  msgstr "Den härledda parametern %qs vid %C har inte ett standardvärde"
  
  #: fortran/decl.cc:4075
! #, gcc-internal-format, gfc-internal-format
  msgid "The type parameter expression at %L must be of INTEGER type and not %s"
! msgstr "Typparameteruttrycket vid %L måste vara av typen INTEGER och inte %s"
  
  #: fortran/decl.cc:4113
  #, gcc-internal-format, gfc-internal-format
*************** msgid "IMPORT statement at %C"
*** 75549,75558 ****
  msgstr "IMPORT-sats vid %C"
  
  #: fortran/decl.cc:5574
! #, fuzzy, gcc-internal-format
! #| msgid "import-declaration must be at global scope"
  msgid "import-name %qs at %C is in the local scope"
! msgstr "import-deklaration måste vara på global räckvidd"
  
  #: fortran/decl.cc:5601
  #, gcc-internal-format
--- 75256,75264 ----
  msgstr "IMPORT-sats vid %C"
  
  #: fortran/decl.cc:5574
! #, gcc-internal-format
  msgid "import-name %qs at %C is in the local scope"
! msgstr ""
  
  #: fortran/decl.cc:5601
  #, gcc-internal-format
*************** msgid "Syntax error in IMPORT statement
*** 75570,75579 ****
  msgstr "Syntaxfel i IMPORT-sats vid %C"
  
  #: fortran/decl.cc:5669
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "F2008: C1210 IMPORT statement at %C is not permitted in a module procedure interface body"
  msgid "F2018: C897 IMPORT statement at %C cannot appear in a main program, an external subprogram, a module or block data"
! msgstr "F2008: C1210 IMPORT-sats vid %C är inte tillåten i en moduls procedurgränssnittskropp"
  
  #: fortran/decl.cc:5674
  #, gcc-internal-format, gfc-internal-format
--- 75276,75284 ----
  msgstr "Syntaxfel i IMPORT-sats vid %C"
  
  #: fortran/decl.cc:5669
! #, gcc-internal-format, gfc-internal-format
  msgid "F2018: C897 IMPORT statement at %C cannot appear in a main program, an external subprogram, a module or block data"
! msgstr ""
  
  #: fortran/decl.cc:5674
  #, gcc-internal-format, gfc-internal-format
*************** msgid "F2018: C899 IMPORT, NONE shall no
*** 75586,75595 ****
  msgstr ""
  
  #: fortran/decl.cc:5685
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "F2008: C1210 IMPORT statement at %C is not permitted in a module procedure interface body"
  msgid "F2018: C8100 IMPORT statement at %C is not permitted because %s has already been declared, which must be unique in the scoping unit"
! msgstr "F2008: C1210 IMPORT-sats vid %C är inte tillåten i en moduls procedurgränssnittskropp"
  
  #: fortran/decl.cc:5693
  #, gcc-internal-format, gfc-internal-format
--- 75291,75299 ----
  msgstr ""
  
  #: fortran/decl.cc:5685
! #, gcc-internal-format, gfc-internal-format
  msgid "F2018: C8100 IMPORT statement at %C is not permitted because %s has already been declared, which must be unique in the scoping unit"
! msgstr ""
  
  #: fortran/decl.cc:5693
  #, gcc-internal-format, gfc-internal-format
*************** msgid "Return type of BIND(C) function %
*** 75767,75776 ****
  msgstr "Returtyp till BIND(C)-funktion %qs med teckentyp vid %L måste ha längden 1"
  
  #: fortran/decl.cc:6631
! #, fuzzy, gcc-internal-format
! #| msgid "Symbol %qs at %L is marked PRIVATE but has been given the binding label %qs"
  msgid "Symbol %qs at %L is marked PRIVATE but is accessible via its default binding name %qs"
! msgstr "Symbolen %qs vid %L är markerad PRIVATE men har getts bindningsetiketten %qs"
  
  #: fortran/decl.cc:6705
  #, gcc-internal-format, gfc-internal-format
--- 75471,75479 ----
  msgstr "Returtyp till BIND(C)-funktion %qs med teckentyp vid %L måste ha längden 1"
  
  #: fortran/decl.cc:6631
! #, gcc-internal-format
  msgid "Symbol %qs at %L is marked PRIVATE but is accessible via its default binding name %qs"
! msgstr ""
  
  #: fortran/decl.cc:6705
  #, gcc-internal-format, gfc-internal-format
*************** msgid "Expected %<=>%> at %C"
*** 76696,76729 ****
  msgstr "%<=>%> förväntades vid %C"
  
  #: fortran/decl.cc:12127
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Range specification at %L can never be matched"
  msgid "The access specification at %L not in a module"
! msgstr "Intervallspecifikationen vid %L kan aldrig matchas"
  
  #: fortran/decl.cc:12148
! #, fuzzy, gcc-internal-format
! #| msgid "The base name at %L does not match the name of the current procedure"
  msgid "The generic-spec name %qs at %C clashes with the name of an entity declared at %L that is not a procedure"
! msgstr "Basnamnet vid %L stämmer inte med namnet på den aktuella proceduren"
  
  #: fortran/decl.cc:12157
! #, fuzzy, gcc-internal-format
! #| msgid "There's already a non-generic procedure with binding name %qs for the derived type %qs at %C"
  msgid "There's already a non-generic procedure with name %qs at %C"
! msgstr "Det finns redan en icke-generisk procedur med bindningsnamnet %qs för den härledda typen %qs vid %C"
  
  #: fortran/decl.cc:12166
! #, fuzzy, gcc-internal-format
! #| msgid "Access specification of the %s operator at %C has already been specified"
  msgid "The access specification at %L conflicts with that already given to %qs"
! msgstr "Åtkomstspecifikation av operatorn %s vid %C har redan angivits"
  
  #: fortran/decl.cc:12173
! #, fuzzy, gcc-internal-format
! #| msgid "Access specification of the %s operator at %C has already been specified"
  msgid "The access specification at %L repeats that already given to %qs"
! msgstr "Åtkomstspecifikation av operatorn %s vid %C har redan angivits"
  
  #: fortran/decl.cc:12182
  #, gcc-internal-format, gfc-internal-format
--- 76399,76427 ----
  msgstr "%<=>%> förväntades vid %C"
  
  #: fortran/decl.cc:12127
! #, gcc-internal-format, gfc-internal-format
  msgid "The access specification at %L not in a module"
! msgstr "Åtkomstspecifikationen vid %L är inte i en modul"
  
  #: fortran/decl.cc:12148
! #, gcc-internal-format
  msgid "The generic-spec name %qs at %C clashes with the name of an entity declared at %L that is not a procedure"
! msgstr ""
  
  #: fortran/decl.cc:12157
! #, gcc-internal-format
  msgid "There's already a non-generic procedure with name %qs at %C"
! msgstr "Det finns redan en icke-generisk procedur med namnet %qs vid %C"
  
  #: fortran/decl.cc:12166
! #, gcc-internal-format
  msgid "The access specification at %L conflicts with that already given to %qs"
! msgstr "Åtkomstspecifikation vid %L står i konflikt med den som redan har angivits till %qs"
  
  #: fortran/decl.cc:12173
! #, gcc-internal-format
  msgid "The access specification at %L repeats that already given to %qs"
! msgstr "Åtkomstspecifikation vid %L upprepar den som redan har angivits till %qs"
  
  #: fortran/decl.cc:12182
  #, gcc-internal-format, gfc-internal-format
*************** msgid "The generic-spec in the generic s
*** 76731,76740 ****
  msgstr ""
  
  #: fortran/decl.cc:12223
! #, fuzzy, gcc-internal-format
! #| msgid "Binding at %C must have the same access as already defined binding %qs"
  msgid "The user operator at %L must have the same access specification as already defined user operator %qs"
! msgstr "Bindning vid %C måste ha samma åtkomst som den redan definierade bindningen %qs"
  
  #: fortran/decl.cc:12230
  #, gcc-internal-format
--- 76429,76437 ----
  msgstr ""
  
  #: fortran/decl.cc:12223
! #, gcc-internal-format
  msgid "The user operator at %L must have the same access specification as already defined user operator %qs"
! msgstr ""
  
  #: fortran/decl.cc:12230
  #, gcc-internal-format
*************** msgid "The user operator at %L repeats t
*** 76742,76751 ****
  msgstr ""
  
  #: fortran/decl.cc:12266
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Expected module procedure name at %C"
  msgid "Expected specific procedure name at %C"
! msgstr "Modulprocedurnamn förväntades vid %C"
  
  #: fortran/decl.cc:12273
  #, gcc-internal-format
--- 76439,76447 ----
  msgstr ""
  
  #: fortran/decl.cc:12266
! #, gcc-internal-format, gfc-internal-format
  msgid "Expected specific procedure name at %C"
! msgstr "Ett specifikt procedurnamn förväntades vid %C"
  
  #: fortran/decl.cc:12273
  #, gcc-internal-format
*************** msgid "The name %qs of the specific proc
*** 76753,76768 ****
  msgstr ""
  
  #: fortran/decl.cc:12283
! #, fuzzy, gcc-internal-format
! #| msgid "%qs already defined as specific binding for the generic %qs at %C"
  msgid "%qs already defined as a specific procedure for the generic %qs at %C"
! msgstr "%qs är redan definierat som en specifik bindning för den generiska %qs vid %C"
  
  #: fortran/decl.cc:12309
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Junk after UNION statement at %C"
  msgid "Junk after GENERIC statement at %C"
! msgstr "Skräp efter UNION-sats vid %C"
  
  #: fortran/decl.cc:12339
  #, gcc-internal-format, gfc-internal-format
--- 76449,76462 ----
  msgstr ""
  
  #: fortran/decl.cc:12283
! #, gcc-internal-format
  msgid "%qs already defined as a specific procedure for the generic %qs at %C"
! msgstr "%qs är redan definierat som en specifik procedur för den generiska %qs vid %C"
  
  #: fortran/decl.cc:12309
! #, gcc-internal-format, gfc-internal-format
  msgid "Junk after GENERIC statement at %C"
! msgstr "Skräp efter GENERIC-sats vid %C"
  
  #: fortran/decl.cc:12339
  #, gcc-internal-format, gfc-internal-format
*************** msgid "Different shape for %s at %L on d
*** 77194,77203 ****
  msgstr "Olika form för %s vid %L på dimension %d (%d och %d)"
  
  #: fortran/expr.cc:3980
! #, fuzzy, gcc-internal-format
! #| msgid "using template type parameter %qT after %qs"
  msgid "Mismatched type parameters %qs(%d/%d) %s at %L/%L"
! msgstr "malltypparametern %qT används efter %qs"
  
  #: fortran/expr.cc:4021
  #, gcc-internal-format, gfc-internal-format
--- 76888,76896 ----
  msgstr "Olika form för %s vid %L på dimension %d (%d och %d)"
  
  #: fortran/expr.cc:3980
! #, gcc-internal-format
  msgid "Mismatched type parameters %qs(%d/%d) %s at %L/%L"
! msgstr ""
  
  #: fortran/expr.cc:4021
  #, gcc-internal-format, gfc-internal-format
*************** msgid "Actual argument at %L to allocata
*** 78191,78200 ****
  msgstr "Aktuellt argument vid %L till allokerbart eller pekarattrappargument %qs måste ha en fördröjd längdtypparameter om och endast om attrappen har en"
  
  #: fortran/interface.cc:3708
! #, fuzzy, gcc-internal-format
! #| msgid "Character length of actual argument shorter than of dummy argument %qs (%lu/%lu) at %L"
  msgid "Character length of actual argument longer than of dummy argument %qs (%lu/%lu) at %L"
! msgstr "Teckenlängden på aktuellt argument är kortare än attrappargumentet %qs (%lu/%lu) vid %L"
  
  #: fortran/interface.cc:3720 fortran/interface.cc:3728
  #, gcc-internal-format
--- 77884,77892 ----
  msgstr "Aktuellt argument vid %L till allokerbart eller pekarattrappargument %qs måste ha en fördröjd längdtypparameter om och endast om attrappen har en"
  
  #: fortran/interface.cc:3708
! #, gcc-internal-format
  msgid "Character length of actual argument longer than of dummy argument %qs (%lu/%lu) at %L"
! msgstr "Teckenlängden på aktuellt argument är längre än attrappargumentet %qs (%lu/%lu) vid %L"
  
  #: fortran/interface.cc:3720 fortran/interface.cc:3728
  #, gcc-internal-format
*************** msgid "check_charlen_present(): length n
*** 79483,79492 ****
  msgstr "check_charlen_present(): längden inte satt"
  
  #: fortran/iresolve.cc:3235
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "TEAM argument at %L must be of TEAM_TYPE from the intrinsic module ISO_FORTRAN_ENV, found %s"
  msgid "GET_TEAM at %L needs USE of the intrinsic module ISO_FORTRAN_ENV to define its result type TEAM_TYPE"
! msgstr "Argumentet till TEAM vid %L måste vara av TEAM_TYPE från den inbyggda modulen ISO_FORTRAN_ENV, hittade %s"
  
  #: fortran/iresolve.cc:3366
  #, gcc-internal-format, gfc-internal-format
--- 79175,79183 ----
  msgstr "check_charlen_present(): längden inte satt"
  
  #: fortran/iresolve.cc:3235
! #, gcc-internal-format, gfc-internal-format
  msgid "GET_TEAM at %L needs USE of the intrinsic module ISO_FORTRAN_ENV to define its result type TEAM_TYPE"
! msgstr ""
  
  #: fortran/iresolve.cc:3366
  #, gcc-internal-format, gfc-internal-format
*************** msgid "Label %qs after %L doesn't match
*** 79669,79678 ****
  msgstr "Etiketten %qs efter %L stämmer inte med IF-etikett %qs"
  
  #: fortran/match.cc:1834
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Duplicate %s attribute at %L"
  msgid "Duplicate %s attribute in %C"
! msgstr "Dubblerat %s-attribut vid %L"
  
  #: fortran/match.cc:1899
  #, gcc-internal-format, gfc-internal-format
--- 79360,79368 ----
  msgstr "Etiketten %qs efter %L stämmer inte med IF-etikett %qs"
  
  #: fortran/match.cc:1834
! #, gcc-internal-format, gfc-internal-format
  msgid "Duplicate %s attribute in %C"
! msgstr "Dubblerat %s-attribut i %C"
  
  #: fortran/match.cc:1899
  #, gcc-internal-format, gfc-internal-format
*************** msgid "Duplicate name %qs in association
*** 79730,79739 ****
  msgstr "Dubblerat namn %qs i association vid %C"
  
  #: fortran/match.cc:2094
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Selector at %L has no type"
  msgid "Selector at %L duplicates selector at %L"
! msgstr "Selektorn vid %L har ingen typ"
  
  #: fortran/match.cc:2104
  #, gcc-internal-format, gfc-internal-format
--- 79420,79428 ----
  msgstr "Dubblerat namn %qs i association vid %C"
  
  #: fortran/match.cc:2094
! #, gcc-internal-format, gfc-internal-format
  msgid "Selector at %L duplicates selector at %L"
! msgstr "Selektorn vid %L dubblerar selektorn vid %L"
  
  #: fortran/match.cc:2104
  #, gcc-internal-format, gfc-internal-format
*************** msgid "Failed to create shadow variable
*** 79796,79811 ****
  msgstr ""
  
  #: fortran/match.cc:2722
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Array constructor including type specification at %C"
  msgid "FORALL or DO CONCURRENT construct includes type specification at %L"
! msgstr "Vektorkonstruerare med typspecifikation vid %C"
  
  #: fortran/match.cc:2729
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%s at %L must be INTEGER"
  msgid "Type-spec at %L must be an INTEGER type"
! msgstr "%s vid %L måste vara INTEGER"
  
  #: fortran/match.cc:2991
  #, gcc-internal-format, gfc-internal-format
--- 79485,79498 ----
  msgstr ""
  
  #: fortran/match.cc:2722
! #, gcc-internal-format, gfc-internal-format
  msgid "FORALL or DO CONCURRENT construct includes type specification at %L"
! msgstr ""
  
  #: fortran/match.cc:2729
! #, gcc-internal-format, gfc-internal-format
  msgid "Type-spec at %L must be an INTEGER type"
! msgstr ""
  
  #: fortran/match.cc:2991
  #, gcc-internal-format, gfc-internal-format
*************** msgid "Image control statement RETURN at
*** 80307,80316 ****
  msgstr "Bildstyrsatsen RETURN vid %C i DO CONCURRENT-block"
  
  #: fortran/match.cc:5685
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Image control statement RETURN at %C in CRITICAL block"
  msgid "Image control statement RETURN at %C in CHANGE TEAM-END TEAM block"
! msgstr "Bildstyrsatsen RETURN vid %C i CRITICAL-block"
  
  #: fortran/match.cc:5694
  #, gcc-internal-format, gfc-internal-format
--- 79994,80002 ----
  msgstr "Bildstyrsatsen RETURN vid %C i DO CONCURRENT-block"
  
  #: fortran/match.cc:5685
! #, gcc-internal-format, gfc-internal-format
  msgid "Image control statement RETURN at %C in CHANGE TEAM-END TEAM block"
! msgstr "Bildstyrsatsen RETURN vid %C i CHANGE TEAM-END TEAM-block"
  
  #: fortran/match.cc:5694
  #, gcc-internal-format, gfc-internal-format
*************** msgid "The name %qs cannot be used as a
*** 80609,80624 ****
  msgstr "Namnet %qs får inte användas som en definierad operator vid %C"
  
  #: fortran/matchexp.cc:165
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Cannot simplify expression at %L"
  msgid "Conditional expression at %L"
! msgstr "Kan inte förenkla uttrycket vid %L"
  
  #: fortran/matchexp.cc:183
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Expected initialization expression at %C"
  msgid "Expected ':' in conditional expression at %C"
! msgstr "Initieringsuttryck förväntades vid %C"
  
  #: fortran/matchexp.cc:231
  #, gcc-internal-format, gfc-internal-format
--- 80295,80308 ----
  msgstr "Namnet %qs får inte användas som en definierad operator vid %C"
  
  #: fortran/matchexp.cc:165
! #, gcc-internal-format, gfc-internal-format
  msgid "Conditional expression at %L"
! msgstr "Villkorligt uttryck vid %L"
  
  #: fortran/matchexp.cc:183
! #, gcc-internal-format, gfc-internal-format
  msgid "Expected ':' in conditional expression at %C"
! msgstr "”:” förväntades i villkorligt uttryck vid %C"
  
  #: fortran/matchexp.cc:231
  #, gcc-internal-format, gfc-internal-format
*************** msgid "Symbol %qs already declared"
*** 80862,80871 ****
  msgstr "Symbolen %qs är redan deklarerad"
  
  #: fortran/module.cc:7327
! #, fuzzy, gcc-internal-format
! #| msgid "Symbol %qs at %L conflicts with the symbol at %L"
  msgid "Symbol %qs already declared at %L conflicts with symbol in %qs at %C"
! msgstr "Symbolen %qs vid %L står i konflikt med symbolen vid %L"
  
  #: fortran/module.cc:7490
  #, gcc-internal-format
--- 80546,80554 ----
  msgstr "Symbolen %qs är redan deklarerad"
  
  #: fortran/module.cc:7327
! #, gcc-internal-format
  msgid "Symbol %qs already declared at %L conflicts with symbol in %qs at %C"
! msgstr "Symbolen %qs som redan är deklarerad vid %L står i konflikt med symbolen i %qs vid %C"
  
  #: fortran/module.cc:7490
  #, gcc-internal-format
*************** msgid "Unexpected %<(%> at %C"
*** 81120,81129 ****
  msgstr "Oväntat %<(%> vid %C"
  
  #: fortran/openmp.cc:1893
! #, fuzzy, gcc-internal-format
! #| msgid "Expected %<)%> or %<,%> at %C"
  msgid "Expected %<,%>, %<)%> or %<;%> at %C"
! msgstr "%<)%> eller %<,%> förväntades vid %C"
  
  #: fortran/openmp.cc:1954
  #, gcc-internal-format
--- 80803,80811 ----
  msgstr "Oväntat %<(%> vid %C"
  
  #: fortran/openmp.cc:1893
! #, gcc-internal-format
  msgid "Expected %<,%>, %<)%> or %<;%> at %C"
! msgstr "%<,%>, %<)%> eller %<;%> förväntades vid %C"
  
  #: fortran/openmp.cc:1954
  #, gcc-internal-format
*************** msgid "Variable at %L mentioned multiple
*** 81666,81693 ****
  msgstr "Variabeln vid %L nämnd flera gånger i klausuler av samma OMP DECLARE TARGET-direktiv"
  
  #: fortran/openmp.cc:6275
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "OMP DECLARE TARGET variable at %L previously mentioned in LINK clause and later in %s clause"
  msgid "OMP DECLARE TARGET variable at %L previously mentioned in %s clause and later in %s clause"
! msgstr "OMP DECLARE TARGET-variabeln vid %L nämndes tidigare i en LINK-klausul och senare i en %s-klausul"
  
  #: fortran/openmp.cc:6283
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "OMP DECLARE TARGET variable at %L previously mentioned in TO or ENTER clause and later in LINK clause"
  msgid "OMP DECLARE TARGET variable at %L previously mentioned in TO or ENTER clause and later in %s clause"
! msgstr "OMP DECLARE TARGET-variabel vid %L nämndes tidigare i en TO- eller ENTER-klausul och senare i en LINK-klausul"
  
  #: fortran/openmp.cc:6308
! #, fuzzy, gcc-internal-format
! #| msgid "List item %qs at %L set in previous OMP DECLARE TARGET directive to a different DEVICE_TYPE"
  msgid "List item %qs at %L set in previous OMP GROUPPRIVATE directive to the different DEVICE_TYPE %qs"
! msgstr "Listpost %qs vid %L satt i föregående OMP DECLARE TARGET-direktiv till en annan DEVICE_TYPE"
  
  #: fortran/openmp.cc:6312 fortran/openmp.cc:7407 fortran/openmp.cc:7432
! #, fuzzy, gcc-internal-format
! #| msgid "List item %qs at %L set in previous OMP DECLARE TARGET directive to a different DEVICE_TYPE"
  msgid "List item %qs at %L set in previous OMP DECLARE TARGET directive to the different DEVICE_TYPE %qs"
! msgstr "Listpost %qs vid %L satt i föregående OMP DECLARE TARGET-direktiv till en annan DEVICE_TYPE"
  
  #: fortran/openmp.cc:6319 fortran/openmp.cc:6382
  #, gcc-internal-format, gfc-internal-format
--- 81348,81371 ----
  msgstr "Variabeln vid %L nämnd flera gånger i klausuler av samma OMP DECLARE TARGET-direktiv"
  
  #: fortran/openmp.cc:6275
! #, gcc-internal-format, gfc-internal-format
  msgid "OMP DECLARE TARGET variable at %L previously mentioned in %s clause and later in %s clause"
! msgstr "OMP DECLARE TARGET-variabeln vid %L nämndes tidigare i en %s-klausul och senare i en %s-klausul"
  
  #: fortran/openmp.cc:6283
! #, gcc-internal-format, gfc-internal-format
  msgid "OMP DECLARE TARGET variable at %L previously mentioned in TO or ENTER clause and later in %s clause"
! msgstr "OMP DECLARE TARGET-variabel vid %L nämndes tidigare i en TO- eller ENTER-klausul och senare i en %s-klausul"
  
  #: fortran/openmp.cc:6308
! #, gcc-internal-format
  msgid "List item %qs at %L set in previous OMP GROUPPRIVATE directive to the different DEVICE_TYPE %qs"
! msgstr "Listpost %qs vid %L satt i föregående OMP GROUPPRIVATE-direktiv till en annan DEVICE_TYPE %qs"
  
  #: fortran/openmp.cc:6312 fortran/openmp.cc:7407 fortran/openmp.cc:7432
! #, gcc-internal-format
  msgid "List item %qs at %L set in previous OMP DECLARE TARGET directive to the different DEVICE_TYPE %qs"
! msgstr "Listpost %qs vid %L satt i föregående OMP DECLARE TARGET-direktiv till en annan DEVICE_TYPE %qs"
  
  #: fortran/openmp.cc:6319 fortran/openmp.cc:6382
  #, gcc-internal-format, gfc-internal-format
*************** msgid "Common block %</%s/%> at %L not a
*** 81705,81738 ****
  msgstr ""
  
  #: fortran/openmp.cc:6340
! #, fuzzy, gcc-internal-format
! #| msgid "Variable at %L mentioned multiple times in clauses of the same OMP DECLARE TARGET directive"
  msgid "Common block %</%s/%> at %L mentioned multiple times in clauses of the same OMP DECLARE TARGET directive"
! msgstr "Variabeln vid %L nämnd flera gånger i klausuler av samma OMP DECLARE TARGET-direktiv"
  
  #: fortran/openmp.cc:6347
! #, fuzzy, gcc-internal-format
! #| msgid "OMP DECLARE TARGET variable at %L previously mentioned in LINK clause and later in %s clause"
  msgid "Common block %</%s/%> at %L previously mentioned in %s clause and later in %s clause"
! msgstr "OMP DECLARE TARGET-variabeln vid %L nämndes tidigare i en LINK-klausul och senare i en %s-klausul"
  
  #: fortran/openmp.cc:6355
! #, fuzzy, gcc-internal-format
! #| msgid "OMP DECLARE TARGET variable at %L previously mentioned in TO or ENTER clause and later in LINK clause"
  msgid "Common block %</%s/%> at %L previously mentioned in TO or ENTER clause and later in %s clause"
! msgstr "OMP DECLARE TARGET-variabel vid %L nämndes tidigare i en TO- eller ENTER-klausul och senare i en LINK-klausul"
  
  #: fortran/openmp.cc:6368
! #, fuzzy, gcc-internal-format
! #| msgid "List item %qs at %L set in previous OMP DECLARE TARGET directive to a different DEVICE_TYPE"
  msgid "Common block %</%s/%> at %L set in previous OMP GROUPPRIVATE directive to the different DEVICE_TYPE %qs"
! msgstr "Listpost %qs vid %L satt i föregående OMP DECLARE TARGET-direktiv till en annan DEVICE_TYPE"
  
  #: fortran/openmp.cc:6373
! #, fuzzy, gcc-internal-format
! #| msgid "List item %qs at %L set in previous OMP DECLARE TARGET directive to a different DEVICE_TYPE"
  msgid "Common block %</%s/%> at %L set in previous OMP DECLARE TARGET directive to the different DEVICE_TYPE %qs"
! msgstr "Listpost %qs vid %L satt i föregående OMP DECLARE TARGET-direktiv till en annan DEVICE_TYPE"
  
  #: fortran/openmp.cc:6387
  #, gcc-internal-format
--- 81383,81411 ----
  msgstr ""
  
  #: fortran/openmp.cc:6340
! #, gcc-internal-format
  msgid "Common block %</%s/%> at %L mentioned multiple times in clauses of the same OMP DECLARE TARGET directive"
! msgstr "Common-block %</%s/%> vid %L nämnd flera gånger i klausuler av samma OMP DECLARE TARGET-direktiv"
  
  #: fortran/openmp.cc:6347
! #, gcc-internal-format
  msgid "Common block %</%s/%> at %L previously mentioned in %s clause and later in %s clause"
! msgstr "Common-block %</%s/%> vid %L nämndes tidigare i en %s-klausul och senare i en %s-klausul"
  
  #: fortran/openmp.cc:6355
! #, gcc-internal-format
  msgid "Common block %</%s/%> at %L previously mentioned in TO or ENTER clause and later in %s clause"
! msgstr "Common-block %</%s/%> vid %L nämndes tidigare i en TO- eller ENTER-klausul och senare i en %s-klausul"
  
  #: fortran/openmp.cc:6368
! #, gcc-internal-format
  msgid "Common block %</%s/%> at %L set in previous OMP GROUPPRIVATE directive to the different DEVICE_TYPE %qs"
! msgstr "Common-block %</%s/%> vid %L satt i föregående OMP GROUPPRIVATE-direktiv till en annan DEVICE_TYPE %qs"
  
  #: fortran/openmp.cc:6373
! #, gcc-internal-format
  msgid "Common block %</%s/%> at %L set in previous OMP DECLARE TARGET directive to the different DEVICE_TYPE %qs"
! msgstr "Common-block %</%s/%> vid %L satt i föregående OMP DECLARE TARGET-direktiv till en annan DEVICE_TYPE %qs"
  
  #: fortran/openmp.cc:6387
  #, gcc-internal-format
*************** msgid "expected %<match%>, %<adjust_args
*** 81883,81892 ****
  msgstr "%<match%>-, %<adust_args%> eller %<append_args%> förväntades vid %C"
  
  #: fortran/openmp.cc:7125
! #, fuzzy, gcc-internal-format
! #| msgid "expected simd clause at %C"
  msgid "expected %<match%> clause at %C"
! msgstr "simd-klausul förväntades vid %C"
  
  #: fortran/openmp.cc:7159
  #, gcc-internal-format
--- 81556,81564 ----
  msgstr "%<match%>-, %<adust_args%> eller %<append_args%> förväntades vid %C"
  
  #: fortran/openmp.cc:7125
! #, gcc-internal-format
  msgid "expected %<match%> clause at %C"
! msgstr "%<match%>-klausul förväntades vid %C"
  
  #: fortran/openmp.cc:7159
  #, gcc-internal-format
*************** msgid "Unexpected junk after OMP METADIR
*** 81924,81945 ****
  msgstr "Oväntat skräp efter OMP METADIRECTIVE vid %C"
  
  #: fortran/openmp.cc:7325
! #, fuzzy, gcc-internal-format
! #| msgid "Variable at %C is an element of a COMMON block"
  msgid "%qs variable at %L is an element of a COMMON block"
! msgstr "Variabel vid %C är ett element i ett COMMON-block"
  
  #: fortran/openmp.cc:7353
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "COMMON block /%s/ not found at %C"
  msgid "COMMON block /%s/ not found at %L"
! msgstr "COMMON-block /%s/ finns inte vid %C"
  
  #: fortran/openmp.cc:7391
! #, fuzzy, gcc-internal-format
! #| msgid "Variable at %C is an element of a COMMON block"
  msgid "Variable %qs at %L is an element of a COMMON block"
! msgstr "Variabel vid %C är ett element i ett COMMON-block"
  
  #: fortran/openmp.cc:7395
  #, gcc-internal-format
--- 81596,81614 ----
  msgstr "Oväntat skräp efter OMP METADIRECTIVE vid %C"
  
  #: fortran/openmp.cc:7325
! #, gcc-internal-format
  msgid "%qs variable at %L is an element of a COMMON block"
! msgstr "Variabeln %qs vid %L är ett element i ett COMMON-block"
  
  #: fortran/openmp.cc:7353
! #, gcc-internal-format, gfc-internal-format
  msgid "COMMON block /%s/ not found at %L"
! msgstr "COMMON-block /%s/ finns inte vid %L"
  
  #: fortran/openmp.cc:7391
! #, gcc-internal-format
  msgid "Variable %qs at %L is an element of a COMMON block"
! msgstr "Variabeln %qs vid %L är ett element i ett COMMON-block"
  
  #: fortran/openmp.cc:7395
  #, gcc-internal-format
*************** msgid "List item %</%s/%> at %L implies
*** 81952,81967 ****
  msgstr ""
  
  #: fortran/openmp.cc:7449
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Unexpected junk after %qs at %L"
  msgid "Unexpected junk after OMP %s at %C"
! msgstr "Oväntat skräp efter %qs vid %L"
  
  #: fortran/openmp.cc:7457
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Syntax error in !$OMP THREADPRIVATE list at %C"
  msgid "Syntax error in !$OMP %s list at %C"
! msgstr "Syntaxfel i !$OMP THREADPRIVATE-lista vid %C"
  
  #: fortran/openmp.cc:7534 fortran/openmp.cc:7543 fortran/openmp.cc:7554
  #: fortran/openmp.cc:8140 fortran/openmp.cc:8156 fortran/openmp.cc:8165
--- 81621,81634 ----
  msgstr ""
  
  #: fortran/openmp.cc:7449
! #, gcc-internal-format, gfc-internal-format
  msgid "Unexpected junk after OMP %s at %C"
! msgstr "Oväntat skräp efter OMP %s vid %C"
  
  #: fortran/openmp.cc:7457
! #, gcc-internal-format, gfc-internal-format
  msgid "Syntax error in !$OMP %s list at %C"
! msgstr "Syntaxfel i !$OMP %s-lista vid %C"
  
  #: fortran/openmp.cc:7534 fortran/openmp.cc:7543 fortran/openmp.cc:7554
  #: fortran/openmp.cc:8140 fortran/openmp.cc:8156 fortran/openmp.cc:8165
*************** msgid "Predefined allocator required in
*** 82265,82274 ****
  msgstr "En fördefinierad allokerare krävs i ALLOCATOR-klausulen vid %L då listelementet %<%s%s%s%> vid %L har attributet SAVE"
  
  #: fortran/openmp.cc:8838
! #, fuzzy, gcc-internal-format
! #| msgid "Predefined allocator required in ALLOCATOR clause at %L as the list item %<%s%s%s%> at %L has the SAVE attribute"
  msgid "Predefined allocator %qs in ALLOCATOR clause at %L, used for list item %<%s%s%s%> at %L, may only be used for local static variables"
! msgstr "En fördefinierad allokerare krävs i ALLOCATOR-klausulen vid %L då listelementet %<%s%s%s%> vid %L har attributet SAVE"
  
  #: fortran/openmp.cc:8856 fortran/openmp.cc:9430
  #, gcc-internal-format
--- 81932,81940 ----
  msgstr "En fördefinierad allokerare krävs i ALLOCATOR-klausulen vid %L då listelementet %<%s%s%s%> vid %L har attributet SAVE"
  
  #: fortran/openmp.cc:8838
! #, gcc-internal-format
  msgid "Predefined allocator %qs in ALLOCATOR clause at %L, used for list item %<%s%s%s%> at %L, may only be used for local static variables"
! msgstr "En fördefinierad allokerare %qs i ALLOCATOR-klausulen vid %L, använd för listelementet %<%s%s%s%> vid %L, får bara användas för lokala statiska variabler"
  
  #: fortran/openmp.cc:8856 fortran/openmp.cc:9430
  #, gcc-internal-format
*************** msgid "Variable %qs is not a dummy argum
*** 82357,82366 ****
  msgstr "Variabeln %qs är inte ett attrappargument vid %L"
  
  #: fortran/openmp.cc:9193
! #, fuzzy, gcc-internal-format
! #| msgid "Object %qs is not a variable at %L; parameters cannot be and need not be copied"
  msgid "Clause for object %qs at %L is ignored as parameters need not be copied"
! msgstr "Objektet %qs är inte en variabel vid %L; parametrar kan inte och behöver inte kopieras"
  
  #: fortran/openmp.cc:9197
  #, gcc-internal-format
--- 82023,82031 ----
  msgstr "Variabeln %qs är inte ett attrappargument vid %L"
  
  #: fortran/openmp.cc:9193
! #, gcc-internal-format
  msgid "Clause for object %qs at %L is ignored as parameters need not be copied"
! msgstr ""
  
  #: fortran/openmp.cc:9197
  #, gcc-internal-format
*************** msgid "%s inner loops must be perfectly
*** 83150,83165 ****
  msgstr "%s inre slingor måste vara perfekt nästade vid %L"
  
  #: fortran/openmp.cc:12584
! #, fuzzy, gcc-internal-format
! #| msgid "%<score%> argument must be constant integer expression at %C"
  msgid "%<score%> argument must be constant integer expression at %L"
! msgstr "argument till %<score%> måste vara ett konstant heltalsuttryck vid %C"
  
  #: fortran/openmp.cc:12592
! #, fuzzy, gcc-internal-format
! #| msgid "%<score%> argument must be non-negative at %C"
  msgid "%<score%> argument must be non-negative at %L"
! msgstr "argumentet till %<score%> måste vara ickenegativt vid %C"
  
  #: fortran/openmp.cc:12621
  #, gcc-internal-format, gfc-internal-format
--- 82815,82828 ----
  msgstr "%s inre slingor måste vara perfekt nästade vid %L"
  
  #: fortran/openmp.cc:12584
! #, gcc-internal-format
  msgid "%<score%> argument must be constant integer expression at %L"
! msgstr "argument till %<score%> måste vara ett konstant heltalsuttryck vid %L"
  
  #: fortran/openmp.cc:12592
! #, gcc-internal-format
  msgid "%<score%> argument must be non-negative at %L"
! msgstr "argumentet till %<score%> måste vara ickenegativt vid %L"
  
  #: fortran/openmp.cc:12621
  #, gcc-internal-format, gfc-internal-format
*************** msgid "property must be a constant integ
*** 83182,83191 ****
  msgstr "egenskapen måste vara ett konstant heltalsuttryck vid %L"
  
  #: fortran/openmp.cc:12661
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "property must be a conforming device number at %C"
  msgid "property must be a conforming device number at %L"
! msgstr "egenskapen måste vara ett konformt enhetsnummer vid %C"
  
  #: fortran/openmp.cc:12940 fortran/openmp.cc:12953
  #, gcc-internal-format, gfc-internal-format
--- 82845,82853 ----
  msgstr "egenskapen måste vara ett konstant heltalsuttryck vid %L"
  
  #: fortran/openmp.cc:12661
! #, gcc-internal-format, gfc-internal-format
  msgid "property must be a conforming device number at %L"
! msgstr "egenskapen måste vara ett konformt enhetsnummer vid %L"
  
  #: fortran/openmp.cc:12940 fortran/openmp.cc:12953
  #, gcc-internal-format, gfc-internal-format
*************** msgid "TILE requires constant expression
*** 83233,83242 ****
  msgstr "TILE behöver ett konstant uttryck vid %L"
  
  #: fortran/openmp.cc:13173
! #, fuzzy, gcc-internal-format
! #| msgid "Object %qs is not a variable at %L; parameters cannot be and need not be copied"
  msgid "Object %qs at %L is ignored as parameters need not be copied"
! msgstr "Objektet %qs är inte en variabel vid %L; parametrar kan inte och behöver inte kopieras"
  
  #: fortran/openmp.cc:13180
  #, gcc-internal-format
--- 82895,82903 ----
  msgstr "TILE behöver ett konstant uttryck vid %L"
  
  #: fortran/openmp.cc:13173
! #, gcc-internal-format
  msgid "Object %qs at %L is ignored as parameters need not be copied"
! msgstr "Objektet %qs vid %L ignoreras eftersom parametrar inte behöver kopieras"
  
  #: fortran/openmp.cc:13180
  #, gcc-internal-format
*************** msgid "Flag %<-fmax-stack-var-size=%d%>
*** 83399,83408 ****
  msgstr "Flaggan %<-fmax-stack-var-size=%d%> åsidosätter %<-frecursive%> som impliceras av %qs"
  
  #: fortran/options.cc:511
! #, fuzzy, gcc-internal-format
! #| msgid "-msingle-float and -msoft-float cannot both be specified"
  msgid "32- and 64-bit version of BLAS cannot both be specified"
! msgstr "-msingle-float och -msoft-float kan inte båda anges"
  
  #: fortran/options.cc:520
  #, gcc-internal-format
--- 83060,83068 ----
  msgstr "Flaggan %<-fmax-stack-var-size=%d%> åsidosätter %<-frecursive%> som impliceras av %qs"
  
  #: fortran/options.cc:511
! #, gcc-internal-format
  msgid "32- and 64-bit version of BLAS cannot both be specified"
! msgstr "32- och 64-bitsversioner av BLAS kan inte båda anges"
  
  #: fortran/options.cc:520
  #, gcc-internal-format
*************** msgid "Syntax error in nested structure
*** 83700,83709 ****
  msgstr "Syntaxfel i nästad postdeklaration vid %C"
  
  #: fortran/parse.cc:3982
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Access specification of the %s operator at %C has already been specified"
  msgid "Access specification of a type parameter at %C is not allowed"
! msgstr "Åtkomstspecifikation av operatorn %s vid %C har redan angivits"
  
  #: fortran/parse.cc:3989
  #, gcc-internal-format, gfc-internal-format
--- 83360,83368 ----
  msgstr "Syntaxfel i nästad postdeklaration vid %C"
  
  #: fortran/parse.cc:3982
! #, gcc-internal-format, gfc-internal-format
  msgid "Access specification of a type parameter at %C is not allowed"
! msgstr ""
  
  #: fortran/parse.cc:3989
  #, gcc-internal-format, gfc-internal-format
*************** msgid "ASSOCIATE construct at %C"
*** 83881,83890 ****
  msgstr "ASSOCIATE-konstruktion vid %C"
  
  #: fortran/parse.cc:5536
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "CHANGE TEAM statement at %C"
  msgid "CHANGE TEAM construct at %C"
! msgstr "CHANGE TEAM-sats vid %C"
  
  #: fortran/parse.cc:5662
  #, gcc-internal-format, gfc-internal-format
--- 83540,83548 ----
  msgstr "ASSOCIATE-konstruktion vid %C"
  
  #: fortran/parse.cc:5536
! #, gcc-internal-format, gfc-internal-format
  msgid "CHANGE TEAM construct at %C"
! msgstr "CHANGE TEAM-konstruktion vid %C"
  
  #: fortran/parse.cc:5662
  #, gcc-internal-format, gfc-internal-format
*************** msgid "CONTAINS statement without FUNCTI
*** 84025,84034 ****
  msgstr "CONTAINS-sats utan FUNCTION- eller SUBROUTINE-sats vid %L"
  
  #: fortran/parse.cc:7144
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "DATA statement at %C after the first executable statement"
  msgid "%s statement at %C cannot appear after executable statements"
! msgstr "DATA-sats vid %C efter den första körbara satsen"
  
  #: fortran/parse.cc:7172
  #, gcc-internal-format, gfc-internal-format
--- 83683,83691 ----
  msgstr "CONTAINS-sats utan FUNCTION- eller SUBROUTINE-sats vid %L"
  
  #: fortran/parse.cc:7144
! #, gcc-internal-format, gfc-internal-format
  msgid "%s statement at %C cannot appear after executable statements"
! msgstr "%s-satsen vid %C får inte förekomma efter körbara satser"
  
  #: fortran/parse.cc:7172
  #, gcc-internal-format, gfc-internal-format
*************** msgid "Function %qs requires an argument
*** 84491,84500 ****
  msgstr "Funktion %qs kräver en argumentlista vid %C"
  
  #: fortran/primary.cc:4160
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Empty array constructor at %C is not allowed"
  msgid "F2023 R755: The empty type specification at %C is not allowed"
! msgstr "Tom vektorkonstruerare vid %C är inte tillåtet"
  
  #: fortran/primary.cc:4276
  #, gcc-internal-format
--- 84148,84156 ----
  msgstr "Funktion %qs kräver en argumentlista vid %C"
  
  #: fortran/primary.cc:4160
! #, gcc-internal-format, gfc-internal-format
  msgid "F2023 R755: The empty type specification at %C is not allowed"
! msgstr ""
  
  #: fortran/primary.cc:4276
  #, gcc-internal-format
*************** msgid "Coindexed actual argument at %L w
*** 85004,85013 ****
  msgstr "Co-indexerat aktuellt argument vid %L med slutlig pekarkomponent"
  
  #: fortran/resolve.cc:2310 fortran/resolve.cc:2315
! #, fuzzy, gcc-internal-format
! #| msgid "Procedure pointer target %qs at %L must be either an intrinsic, host or use associated, referenced or have the EXTERNAL attribute"
  msgid "Procedure %qs at %L used as actual argument but does neither have an explicit interface nor the EXTERNAL attribute"
! msgstr "Procedurpekarmålet %qs vid %L måste vara antingen en inbyggd, värd, värd- eller användningsassocierad, refererad eller ha attributet EXTERNAL"
  
  #: fortran/resolve.cc:2467
  #, gcc-internal-format
--- 84660,84668 ----
  msgstr "Co-indexerat aktuellt argument vid %L med slutlig pekarkomponent"
  
  #: fortran/resolve.cc:2310 fortran/resolve.cc:2315
! #, gcc-internal-format
  msgid "Procedure %qs at %L used as actual argument but does neither have an explicit interface nor the EXTERNAL attribute"
! msgstr ""
  
  #: fortran/resolve.cc:2467
  #, gcc-internal-format
*************** msgid "Using function %qs at %L is depre
*** 85146,85155 ****
  msgstr "Att använda funktionen %qs vid %L bör undvikas"
  
  #: fortran/resolve.cc:3699 fortran/resolve.cc:4189
! #, fuzzy, gcc-internal-format
! #| msgid "COMMON block %qs at %L cannot have the EXTERNAL attribute"
  msgid "Dummy procedure %qs at %L requires an EXTERNAL attribute"
! msgstr "COMMON-blocket %qs vid %L får inte ha attributet EXTERNAL"
  
  #: fortran/resolve.cc:3740
  #, gcc-internal-format, gfc-internal-format
--- 84801,84809 ----
  msgstr "Att använda funktionen %qs vid %L bör undvikas"
  
  #: fortran/resolve.cc:3699 fortran/resolve.cc:4189
! #, gcc-internal-format
  msgid "Dummy procedure %qs at %L requires an EXTERNAL attribute"
! msgstr ""
  
  #: fortran/resolve.cc:3740
  #, gcc-internal-format, gfc-internal-format
*************** msgid "resolve_operator(): Bad intrinsic
*** 85367,85394 ****
  msgstr "resolve_operator(): Felaktig inbyggd"
  
  #: fortran/resolve.cc:5056
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Coindex of codimension %d must be a scalar at %L"
  msgid "Condition in conditional expression must be a scalar logical at %L"
! msgstr "Co-index i co-dimension %d måste vara en skalär vid %L"
  
  #: fortran/resolve.cc:5063
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Actual argument to %qs at %L must have the same declared type"
  msgid "expr at %L and expr at %L in conditional expression must have the same declared type"
! msgstr "Aktuellt argument till %qs vid %L måste ha samma deklarerade typ"
  
  #: fortran/resolve.cc:5071
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "The allocate-object at %L and the source-expr at %L shall have the same kind type parameter"
  msgid "expr at %L and expr at %L in conditional expression must have the same kind parameter"
! msgstr "Allokeringsobjektet vid %L och källuttrycket vid %L skall ha samma sorts typparameter"
  
  #: fortran/resolve.cc:5079
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Source-expr at %L and allocate-object at %L must have the same shape"
  msgid "expr at %L and expr at %L in conditional expression must have the same rank"
! msgstr "Källuttryck vid %L och allokeringsobjekt vid %L måste ha samma form"
  
  #: fortran/resolve.cc:5091
  #, gcc-internal-format, gfc-internal-format
--- 85021,85044 ----
  msgstr "resolve_operator(): Felaktig inbyggd"
  
  #: fortran/resolve.cc:5056
! #, gcc-internal-format, gfc-internal-format
  msgid "Condition in conditional expression must be a scalar logical at %L"
! msgstr ""
  
  #: fortran/resolve.cc:5063
! #, gcc-internal-format, gfc-internal-format
  msgid "expr at %L and expr at %L in conditional expression must have the same declared type"
! msgstr ""
  
  #: fortran/resolve.cc:5071
! #, gcc-internal-format, gfc-internal-format
  msgid "expr at %L and expr at %L in conditional expression must have the same kind parameter"
! msgstr ""
  
  #: fortran/resolve.cc:5079
! #, gcc-internal-format, gfc-internal-format
  msgid "expr at %L and expr at %L in conditional expression must have the same rank"
! msgstr ""
  
  #: fortran/resolve.cc:5091
  #, gcc-internal-format, gfc-internal-format
*************** msgid "UNTIL_COUNT= argument at %L must
*** 86304,86325 ****
  msgstr "UNTIL_COUNT=-argumentet vid %L måste vara ett skalärt INTEGER-uttryck"
  
  #: fortran/resolve.cc:11874
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "TEAM argument at %L must be of TEAM_TYPE from the intrinsic module ISO_FORTRAN_ENV, found %s"
  msgid "TEAM argument at %L must be a scalar expression of type TEAM_TYPE from the intrinsic module ISO_FORTRAN_ENV"
! msgstr "Argumentet till TEAM vid %L måste vara av TEAM_TYPE från den inbyggda modulen ISO_FORTRAN_ENV, hittade %s"
  
  #: fortran/resolve.cc:11888
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "STAT= argument at %L must be a scalar INTEGER variable"
  msgid "%s argument at %L must be a scalar %s variable of at least kind %d"
! msgstr "STAT=-argumentet vid %L måste vara en skalär INTEGER-variabel"
  
  #: fortran/resolve.cc:11909
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%s tag at %L must be a character string of default kind"
  msgid "%s argument at %L must be a scalar %s of at least kind %d"
! msgstr "Taggen %s vid %L måste vara en teckensträng av standardsort"
  
  #: fortran/resolve.cc:12027
  #, gcc-internal-format, gfc-internal-format
--- 85954,85972 ----
  msgstr "UNTIL_COUNT=-argumentet vid %L måste vara ett skalärt INTEGER-uttryck"
  
  #: fortran/resolve.cc:11874
! #, gcc-internal-format, gfc-internal-format
  msgid "TEAM argument at %L must be a scalar expression of type TEAM_TYPE from the intrinsic module ISO_FORTRAN_ENV"
! msgstr "Argumentet till TEAM vid %L måste vara ett skalärt uttryck av typen TEAM_TYPE från den inbyggda modulen ISO_FORTRAN_ENV"
  
  #: fortran/resolve.cc:11888
! #, gcc-internal-format, gfc-internal-format
  msgid "%s argument at %L must be a scalar %s variable of at least kind %d"
! msgstr "%s-argumentet vid %L måste vara en skalär %s-variabel av åtminstone sort %d"
  
  #: fortran/resolve.cc:11909
! #, gcc-internal-format, gfc-internal-format
  msgid "%s argument at %L must be a scalar %s of at least kind %d"
! msgstr ""
  
  #: fortran/resolve.cc:12027
  #, gcc-internal-format, gfc-internal-format
*************** msgid "GOTO statement at %L leaves DO CO
*** 86354,86363 ****
  msgstr "GOTO-sats vid %L lämnar DO CONCURRENT-konstruktion för etikett vid %L"
  
  #: fortran/resolve.cc:12129
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "GOTO statement at %L leaves CRITICAL construct for label at %L"
  msgid "GOTO statement at %L leaves CHANGE TEAM construct for label at %L"
! msgstr "GOTO-sats vid %L lämnar CRITICAL-konstruktion för etikett vid %L"
  
  #. The label is not in an enclosing block, so illegal.  This was
  #. allowed in Fortran 66, so we allow it as extension.  No
--- 86001,86009 ----
  msgstr "GOTO-sats vid %L lämnar DO CONCURRENT-konstruktion för etikett vid %L"
  
  #: fortran/resolve.cc:12129
! #, gcc-internal-format, gfc-internal-format
  msgid "GOTO statement at %L leaves CHANGE TEAM construct for label at %L"
! msgstr "GOTO-sats vid %L lämnar CHANGE TEAM-konstruktion för etikett vid %L"
  
  #. The label is not in an enclosing block, so illegal.  This was
  #. allowed in Fortran 66, so we allow it as extension.  No
*************** msgid "An outer FORALL construct already
*** 86413,86422 ****
  msgstr "En yttre FORALL-konstruktion har redan ett index med detta namn %L"
  
  #: fortran/resolve.cc:12725
! #, fuzzy, gcc-internal-format
! #| msgid "Expected variable name at %C"
  msgid "Expected shadow variable name to start with _"
! msgstr "Variabelnamn förväntades vid %C"
  
  #: fortran/resolve.cc:12812
  #, gcc-internal-format, gfc-internal-format
--- 86059,86067 ----
  msgstr "En yttre FORALL-konstruktion har redan ett index med detta namn %L"
  
  #: fortran/resolve.cc:12725
! #, gcc-internal-format
  msgid "Expected shadow variable name to start with _"
! msgstr "Skuggvariabelnamn förväntades börja med _"
  
  #: fortran/resolve.cc:12812
  #, gcc-internal-format, gfc-internal-format
*************** msgid "Result variable %qs of pure funct
*** 86774,86783 ****
  msgstr ""
  
  #: fortran/resolve.cc:15704
! #, fuzzy, gcc-internal-format
! #| msgid "Coindexed object with polymorphic allocatable subcomponent at %L"
  msgid "Result variable %qs of pure function at %L has polymorphic allocatable component %qs"
! msgstr "Co-indexerat objekt med polymorf allokerbar delkomponent vid %L"
  
  #: fortran/resolve.cc:15763
  #, gcc-internal-format
--- 86419,86427 ----
  msgstr ""
  
  #: fortran/resolve.cc:15704
! #, gcc-internal-format
  msgid "Result variable %qs of pure function at %L has polymorphic allocatable component %qs"
! msgstr ""
  
  #: fortran/resolve.cc:15763
  #, gcc-internal-format
*************** msgid "Derived type %qs at %L has not be
*** 87100,87109 ****
  msgstr "Härledd typ %qs vid %L har inte deklarerats"
  
  #: fortran/resolve.cc:17695
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Failed to match clause at %C"
  msgid "Failed to build PDT class component at %L"
! msgstr "Misslyckades att matcha klausulen vid %C"
  
  #: fortran/resolve.cc:17756
  #, gcc-internal-format
--- 86744,86752 ----
  msgstr "Härledd typ %qs vid %L har inte deklarerats"
  
  #: fortran/resolve.cc:17695
! #, gcc-internal-format, gfc-internal-format
  msgid "Failed to build PDT class component at %L"
! msgstr ""
  
  #: fortran/resolve.cc:17756
  #, gcc-internal-format
*************** msgid "CLASS variable %qs at %L cannot h
*** 87166,87175 ****
  msgstr "CLASS-variabeln %qs vid %L får inte ha attributet PARAMETER"
  
  #: fortran/resolve.cc:17929
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "TILE requires constant expression at %L"
  msgid "Expecting constant expression near %L"
! msgstr "TILE behöver ett konstant uttryck vid %L"
  
  #: fortran/resolve.cc:17980
  #, gcc-internal-format
--- 86809,86817 ----
  msgstr "CLASS-variabeln %qs vid %L får inte ha attributet PARAMETER"
  
  #: fortran/resolve.cc:17929
! #, gcc-internal-format, gfc-internal-format
  msgid "Expecting constant expression near %L"
! msgstr ""
  
  #: fortran/resolve.cc:17980
  #, gcc-internal-format
*************** msgid "Threadprivate at %L isn't SAVEd"
*** 87407,87422 ****
  msgstr "Trådprivat vid %L är inte SAVE:ad"
  
  #: fortran/resolve.cc:18824
! #, fuzzy, gcc-internal-format
! #| msgid "Pointer initialization target at %L must have the SAVE attribute"
  msgid "OpenMP groupprivate variable %qs at %L must have the SAVE attribute"
! msgstr "Pekarinitieringsmål vid %L måste ha attributet SAVE"
  
  #: fortran/resolve.cc:18829
! #, fuzzy, gcc-internal-format
! #| msgid "variable %q+D with attribute %qs must not have an initializer"
  msgid "!$OMP GROUPPRIVATE variable %qs at %L must not have an initializer"
! msgstr "variabeln %q+D med attributet %qs får inte ha en initierare"
  
  #: fortran/resolve.cc:18845
  #, gcc-internal-format
--- 87049,87062 ----
  msgstr "Trådprivat vid %L är inte SAVE:ad"
  
  #: fortran/resolve.cc:18824
! #, gcc-internal-format
  msgid "OpenMP groupprivate variable %qs at %L must have the SAVE attribute"
! msgstr ""
  
  #: fortran/resolve.cc:18829
! #, gcc-internal-format
  msgid "!$OMP GROUPPRIVATE variable %qs at %L must not have an initializer"
! msgstr ""
  
  #: fortran/resolve.cc:18845
  #, gcc-internal-format
*************** msgid "Argument of %s function at %L is
*** 87796,87805 ****
  msgstr "Argument till funktion %s vid %L är för stort för sorteringssekvensen av ordning %d"
  
  #: fortran/simplify.cc:888
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Argument of ACOS at %L must be between -1 and 1"
  msgid "Argument of ACOS at %L must be within the closed interval [-1, 1]"
! msgstr "Argument till ACOS vid %L måste vara mellan -1 och 1"
  
  #: fortran/simplify.cc:903
  #, gcc-internal-format
--- 87436,87444 ----
  msgstr "Argument till funktion %s vid %L är för stort för sorteringssekvensen av ordning %d"
  
  #: fortran/simplify.cc:888
! #, gcc-internal-format, gfc-internal-format
  msgid "Argument of ACOS at %L must be within the closed interval [-1, 1]"
! msgstr "Argument till ACOS vid %L måste ligga i det stängda intervallet [-1, 1]"
  
  #: fortran/simplify.cc:903
  #, gcc-internal-format
*************** msgid "in gfc_simplify_acosh(): Bad type
*** 87817,87826 ****
  msgstr "in gfc_simplify_acosh(): Felaktig typ"
  
  #: fortran/simplify.cc:1166
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Argument of ASIN at %L must be between -1 and 1"
  msgid "Argument of ASIN at %L must be within the closed interval [-1, 1]"
! msgstr "Argument till ASIN vid %L måste vara mellan -1 och 1"
  
  #: fortran/simplify.cc:1181
  #, gcc-internal-format
--- 87456,87464 ----
  msgstr "in gfc_simplify_acosh(): Felaktig typ"
  
  #: fortran/simplify.cc:1166
! #, gcc-internal-format, gfc-internal-format
  msgid "Argument of ASIN at %L must be within the closed interval [-1, 1]"
! msgstr "Argument till ASIN vid %L måste ligga i det stängda intervallet [-1, 1]"
  
  #: fortran/simplify.cc:1181
  #, gcc-internal-format
*************** msgid "in gfc_simplify_asin(): Bad type"
*** 87828,87843 ****
  msgstr "i gfc_simplify_asin(): Felaktig typ"
  
  #: fortran/simplify.cc:1219
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Argument of ACOSD at %L must be between -1 and 1"
  msgid "Argument of ACOSD at %L must be within the closed interval [-1, 1]"
! msgstr "Argument till ACOSD vid %L måste vara mellan -1 och 1"
  
  #: fortran/simplify.cc:1250
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Argument of ASIND at %L must be between -1 and 1"
  msgid "Argument of ASIND at %L must be within the closed interval [-1, 1]"
! msgstr "Argument till ASIND vid %L måste vara mellan -1 och 1"
  
  #: fortran/simplify.cc:1310
  #, gcc-internal-format
--- 87466,87479 ----
  msgstr "i gfc_simplify_asin(): Felaktig typ"
  
  #: fortran/simplify.cc:1219
! #, gcc-internal-format, gfc-internal-format
  msgid "Argument of ACOSD at %L must be within the closed interval [-1, 1]"
! msgstr "Argument till ACOSD vid %L måste ligga i det stängda intervallet [-1, 1]"
  
  #: fortran/simplify.cc:1250
! #, gcc-internal-format, gfc-internal-format
  msgid "Argument of ASIND at %L must be within the closed interval [-1, 1]"
! msgstr "Argument till ASIND vid %L måste ligga i det stängda intervallet [-1, 1]"
  
  #: fortran/simplify.cc:1310
  #, gcc-internal-format
*************** msgid "in gfc_simplify_atanh(): Bad type
*** 87860,87867 ****
  msgstr "i gfc_simplify_atanh(): Felaktig typ"
  
  #: fortran/simplify.cc:1390
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "If first argument of ATAN2 at %L is zero, then the second argument must not be zero"
  msgid "If the first argument of ATAN2 at %L is zero, then the second argument must not be zero"
  msgstr "Om första argumentet till ATAN2 vid %L är noll får inte andra argumentet vara noll"
  
--- 87496,87502 ----
  msgstr "i gfc_simplify_atanh(): Felaktig typ"
  
  #: fortran/simplify.cc:1390
! #, gcc-internal-format, gfc-internal-format
  msgid "If the first argument of ATAN2 at %L is zero, then the second argument must not be zero"
  msgstr "Om första argumentet till ATAN2 vid %L är noll får inte andra argumentet vara noll"
  
*************** msgid "gfc_simplify_dcmplx(): Bad type (
*** 87881,87888 ****
  msgstr "gfc_simplify_dcmplx(): Felaktig typ (y)"
  
  #: fortran/simplify.cc:1969
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "If first argument of ATAN2D at %L is zero, then the second argument must not be zero"
  msgid "If the first argument of ATAN2D at %L is zero, then the second argument must not be zero"
  msgstr "Om första argumentet till ATAN2D vid %L är noll får inte andra argumentet vara noll"
  
--- 87516,87522 ----
  msgstr "gfc_simplify_dcmplx(): Felaktig typ (y)"
  
  #: fortran/simplify.cc:1969
! #, gcc-internal-format, gfc-internal-format
  msgid "If the first argument of ATAN2D at %L is zero, then the second argument must not be zero"
  msgstr "Om första argumentet till ATAN2D vid %L är noll får inte andra argumentet vara noll"
  
*************** msgid "in gfc_simplify_cos(): Bad type"
*** 87892,87913 ****
  msgstr "i gfc_simplify_cos(): Felaktig typ"
  
  #: fortran/simplify.cc:2169
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Argument of ACOS at %L must be between -1 and 1"
  msgid "Argument of ACOSPI at %L must be within the closed interval [-1, 1]"
! msgstr "Argument till ACOS vid %L måste vara mellan -1 och 1"
  
  #: fortran/simplify.cc:2201
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Argument of ASIN at %L must be between -1 and 1"
  msgid "Argument of ASINPI at %L must be within the closed interval [-1, 1]"
! msgstr "Argument till ASIN vid %L måste vara mellan -1 och 1"
  
  #: fortran/simplify.cc:2256
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "If first argument of ATAN2 at %L is zero, then the second argument must not be zero"
  msgid "If the first argument of ATAN2PI at %L is zero, then the second argument must not be zero"
! msgstr "Om första argumentet till ATAN2 vid %L är noll får inte andra argumentet vara noll"
  
  #: fortran/simplify.cc:2745
  #, gcc-internal-format
--- 87526,87544 ----
  msgstr "i gfc_simplify_cos(): Felaktig typ"
  
  #: fortran/simplify.cc:2169
! #, gcc-internal-format, gfc-internal-format
  msgid "Argument of ACOSPI at %L must be within the closed interval [-1, 1]"
! msgstr "Argument till ACOSPI vid %L måste ligga i det stängda intervallet [-1, 1]"
  
  #: fortran/simplify.cc:2201
! #, gcc-internal-format, gfc-internal-format
  msgid "Argument of ASINPI at %L must be within the closed interval [-1, 1]"
! msgstr "Argument till ASINPI vid %L måste ligga i det stängda intervallet [-1, 1]"
  
  #: fortran/simplify.cc:2256
! #, gcc-internal-format, gfc-internal-format
  msgid "If the first argument of ATAN2PI at %L is zero, then the second argument must not be zero"
! msgstr "Om första argumentet till ATAN2PI vid %L är noll får inte andra argumentet vara noll"
  
  #: fortran/simplify.cc:2745
  #, gcc-internal-format
*************** msgid "variant %qs at %L is not a functi
*** 88972,88981 ****
  msgstr "varianten %qs vid %L är varken en funktion eller subrutin"
  
  #: fortran/trans-openmp.cc:9799
! #, fuzzy, gcc-internal-format
! #| msgid "variant %qs at %L is not a function or subroutine"
  msgid "variant %qs at %L is the same as base function"
! msgstr "varianten %qs vid %L är varken en funktion eller subrutin"
  
  #: fortran/trans-openmp.cc:9841
  #, gcc-internal-format
--- 88603,88611 ----
  msgstr "varianten %qs vid %L är varken en funktion eller subrutin"
  
  #: fortran/trans-openmp.cc:9799
! #, gcc-internal-format
  msgid "variant %qs at %L is the same as base function"
! msgstr ""
  
  #: fortran/trans-openmp.cc:9841
  #, gcc-internal-format
*************** msgid "Cannot open %s"
*** 89305,89314 ****
  msgstr "Kan inte öppna %s"
  
  #: lto/lto-common.cc:2443
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Cannot assign %s to %s at %L"
  msgid "Cannot map %s: section is too long"
! msgstr "Kan inte tilldela %s till %s vid %L"
  
  #: lto/lto-common.cc:2453
  #, gcc-internal-format, gfc-internal-format
--- 88935,88943 ----
  msgstr "Kan inte öppna %s"
  
  #: lto/lto-common.cc:2443
! #, gcc-internal-format, gfc-internal-format
  msgid "Cannot map %s: section is too long"
! msgstr ""
  
  #: lto/lto-common.cc:2453
  #, gcc-internal-format, gfc-internal-format
*************** msgid "enumeration values exceed range o
*** 89685,89700 ****
  msgstr "uppräkningsvärden överskrider gränsen för heltal"
  
  #: m2/gm2-gcc/m2type.cc:2316
! #, fuzzy, gcc-internal-format
! #| msgid "array type must be initialized"
  msgid "set type must be initialized"
! msgstr "vektortyper måste initieras"
  
  #: m2/gm2-gcc/m2type.cc:2405
! #, fuzzy, gcc-internal-format
! #| msgid "array type must be initialized"
  msgid "record type must be initialized"
! msgstr "vektortyper måste initieras"
  
  #: m2/gm2-gcc/m2type.cc:2458
  #, gcc-internal-format
--- 89314,89327 ----
  msgstr "uppräkningsvärden överskrider gränsen för heltal"
  
  #: m2/gm2-gcc/m2type.cc:2316
! #, gcc-internal-format
  msgid "set type must be initialized"
! msgstr "mängdtyper måste initieras"
  
  #: m2/gm2-gcc/m2type.cc:2405
! #, gcc-internal-format
  msgid "record type must be initialized"
! msgstr "posttyper måste initieras"
  
  #: m2/gm2-gcc/m2type.cc:2458
  #, gcc-internal-format
*************** msgid "modification of %qE is not a cons
*** 90735,90744 ****
  msgstr "ändring av %qE är inte ett konstant uttryck"
  
  #: rust/backend/rust-constexpr.cc:4544
! #, fuzzy, gcc-internal-format
! #| msgid "%qE is not a constant expression"
  msgid "is not a constant expression"
! msgstr "%qE är inte ett konstant uttryck"
  
  #: rust/backend/rust-constexpr.cc:6396
  #, gcc-internal-format
--- 90362,90370 ----
  msgstr "ändring av %qE är inte ett konstant uttryck"
  
  #: rust/backend/rust-constexpr.cc:4544
! #, gcc-internal-format
  msgid "is not a constant expression"
! msgstr "är inte ett konstant uttryck"
  
  #: rust/backend/rust-constexpr.cc:6396
  #, gcc-internal-format
diff -Nrcpad gcc-16-20260315/gcc/rust/ChangeLog gcc-16-20260322/gcc/rust/ChangeLog
*** gcc-16-20260315/gcc/rust/ChangeLog	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/ChangeLog	Sun Mar 22 22:32:07 2026
***************
*** 1,3 ****
--- 1,441 ----
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* rust-session-manager.cc (Session::compile_crate): Use additional
+ 	cli attributes for the injection function. Move additional attribute
+ 	injection from here...
+ 	(Session::injection): ... to here.
+ 	* rust-session-manager.h: Update injection fonction prototype.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* ast/rust-ast.cc (Crate::inject_inner_attribute): Add member function
+ 	to inject an inner attribute.
+ 	* ast/rust-ast.h: Add function prototype.
+ 	* lang.opt: Add frust-crate-attr argument to the compiler CLI.
+ 	* rust-lang.cc: Remove unused attribute on  option handler.
+ 	* rust-session-manager.cc (Session::handle_crate_name): Collect CLI
+ 	additional inner attributes.
+ 	(Session::compile_crate): Parse the additional inner attributes and
+ 	inject them.
+ 	* rust-session-manager.h (struct CompileOptions): Add collection of
+ 	additional inner attributes.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* util/rust-attributes.cc: Add no_std to list of builtin attributes.
+ 
+ 2026-03-20  Enes Cevik  <nsvke@proton.me>
+ 
+ 	* backend/rust-compile-intrinsic.cc: Add bswap_handler.
+ 	* backend/rust-intrinsic-handlers.cc (bswap_handler): New function.
+ 	* backend/rust-intrinsic-handlers.h (bswap_handler): New declaration.
+ 
+ 2026-03-20  Mohamed Ali  <mohmedali1462005@gmail.com>
+ 
+ 	* checks/errors/feature/rust-feature-gate.cc (FeatureGate::visit): Call check_no_core_attri.
+ 	* checks/errors/feature/rust-feature-gate.h: Declare method check_no_core_attri.
+ 
+ 2026-03-20  Harishankar  <harishankarpp7@gmail.com>
+ 
+ 	* resolve/rust-early-name-resolver-2.0.cc (Early::finalize_rebind_import): Add ambiguity
+ 	check before calling get_node_id() on glob import definitions.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* backend/rust-compile-intrinsic.cc: Use predefined values.
+ 	* checks/errors/rust-unsafe-checker.cc (is_safe_intrinsic): Likewise.
+ 	* util/rust-intrinsic-values.h: New file.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* Make-lang.in: Add rust-intrinsic-handlers.cc.
+ 	* backend/rust-compile-intrinsic.cc (get_identifier): Move function
+ 	to handlers namespace.
+ 	(is_basic_integer_type): Likewise.
+ 	(check_for_basic_integer_type): Likewise.
+ 	(offset_handler): Likewise.
+ 	(sizeof_handler): Likewise.
+ 	(transmute_handler): Likewise.
+ 	(rotate_handler): Likewise.
+ 	(wrapping_op_handler_inner): Likewise.
+ 	(op_with_overflow_inner): Likewise.
+ 	(uninit_handler): Likewise.
+ 	(move_val_init_handler): Likewise.
+ 	(assume_handler): Likewise.
+ 	(discriminant_value_handler): Likewise.
+ 	(variant_count_handler): Likewise.
+ 	(enum class): Likewise.
+ 	(prefetch_data_handler): Likewise.
+ 	(rotate_left_handler): Likewise.
+ 	(rotate_right_handler): Likewise.
+ 	(std::function<tree): Likewise.
+ 	(wrapping_op_handler): Likewise.
+ 	(op_with_overflow): Likewise.
+ 	(prefetch_read_data): Likewise.
+ 	(prefetch_write_data): Likewise.
+ 	(atomic_store_handler_inner): Likewise.
+ 	(atomic_load_handler_inner): Likewise.
+ 	(atomic_store_handler): Likewise.
+ 	(atomic_load_handler): Likewise.
+ 	(unchecked_op_inner): Likewise.
+ 	(unchecked_op_handler): Likewise.
+ 	(copy_handler_inner): Likewise.
+ 	(copy_handler): Likewise.
+ 	(expect_handler_inner): Likewise.
+ 	(expect_handler): Likewise.
+ 	(try_handler_inner): Likewise.
+ 	(try_handler): Likewise.
+ 	(sorry_handler): Likewise.
+ 	(check_for_cached_intrinsic): Likewise.
+ 	(maybe_override_ctx): Likewise.
+ 	(compile_fn_params): Likewise.
+ 	(compile_intrinsic_function): Likewise.
+ 	(enter_intrinsic_block): Likewise.
+ 	(finalize_intrinsic_block): Likewise.
+ 	(make_unsigned_long_tree): Likewise.
+ 	(build_atomic_builtin_name): Likewise.
+ 	* backend/rust-intrinsic-handlers.cc: New file.
+ 	* backend/rust-intrinsic-handlers.h: New file.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* parse/rust-parse-impl.hxx: Remove additional error message.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* checks/lints/rust-lint-scan-deadcode.h: Add additional condition
+ 	to prevent warning emission. Check for underscore prefix.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* parse/rust-parse-error.h (struct EnumVariant): Add error for enum
+ 	variant.
+ 	* parse/rust-parse-impl.hxx: Use new error type instead of nullptr.
+ 	* parse/rust-parse.h: Update function prototype.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* checks/lints/rust-lint-unused-var.cc (starts_with_underscore): Add
+ 	function to detect underscore within symbol name.
+ 	(check_decl): Call new function for underscore checking.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* resolve/rust-toplevel-name-resolver-2.0.cc(TopLevel::visit): Insert
+ 	constant item only if now wildcard.
+ 
+ 2026-03-20  Owen Avery  <powerboat9.gamer@gmail.com>
+ 
+ 	* resolve/rust-default-resolver.cc (DefaultResolver::visit):
+ 	Override MatchCase visiting function.
+ 	* resolve/rust-default-resolver.h (DefaultResolver::visit):
+ 	Likewise.
+ 
+ 2026-03-20  jayant chauhan  <0001jayant@gmail.com>
+ 
+ 	* expand/rust-derive.cc (DeriveVisitor::derive): Handle
+ 	`BuiltinMacro::RustcEncodable` and `BuiltinMacro::RustcDecodable`.
+ 
+ 2026-03-20  vibhatsu  <maulikbarot2915@gmail.com>
+ 
+ 	* ast/rust-macro.h: add initialization for ExternalItem base
+ 	class in full construtor and use node id inside ExternalItem
+ 	to populate memeber node id.
+ 
+ 2026-03-20  vibhatsu  <maulikbarot2915@gmail.com>
+ 
+ 	* ast/rust-macro.h: remove get_macro_node_id and propagate
+ 	MacroInvocation's node id through get_node_id for consistency
+ 	* util/rust-hir-map.cc (Mappings::insert_macro_invocation): replace
+ 	all get_macro_node_id calls with get_node_id calls
+ 	(Mappings::lookup_macro_invocation): likewise
+ 	(Mappings::insert_bang_proc_macro_invocation): likewise
+ 	(Mappings::lookup_bang_proc_macro_invocation): likewise
+ 
+ 2026-03-20  Jayant Chauhan  <0001jayant@gmail.com>
+ 
+ 	* ast/rust-path.h (GenericArgsBinding::reconstruct): New method.
+ 	(GenericArg::reconstruct): New method.
+ 	(GenericArgs::reconstruct): New method.
+ 	(PathExprSegment::reconstruct): New method.
+ 	(PathInExpression::reconstruct): New method.
+ 	(TypePathSegmentGeneric::reconstruct_impl): New method.
+ 	(TypePathFunction::reconstruct): New method.
+ 	(TypePathSegmentFunction::reconstruct_impl): New method.
+ 	(QualifiedPathType::reconstruct): New method.
+ 	(QualifiedPathInExpression::reconstruct): New method.
+ 	(QualifiedPathInType::reconstruct_impl): New method.
+ 	* expand/rust-derive-cmp-common.cc (EnumMatchBuilder::tuple): Use path.reconstruct().
+ 	(EnumMatchBuilder::strukt): Use path.reconstruct().
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* rust-session-manager.cc (Session::compile_crate): Inject std crate
+ 	when both no_std and no_core attributes are missing.
+ 	* util/rust-attribute-values.h: Add no_std attribute value.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* resolve/rust-early-name-resolver-2.0.cc (Early::visit_derive_attribute):
+ 	Change from attribute locus to trait locus.
+ 	(Early::visit_attributes): Remove function.
+ 	(Early::visit): Remove functions.
+ 	* resolve/rust-early-name-resolver-2.0.h: Remove unused prototypes.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* ast/rust-ast.cc (MetaItemPathExpr::to_attribute): Remove cast to
+ 	literal.
+ 	(AttrInputMetaItemContainer::separate_cfg_attrs): Remove PathExpr
+ 	specific code.
+ 	* expand/rust-cfg-strip.cc (expand_cfg_attrs): Remove the whole
+ 	attribute if condition's result is false.
+ 	* util/rust-attributes.cc (AttributeChecker::visit): Remove specific
+ 	code section for meta item container. Do not check input if
+ 	configuration does not match condition.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* ast/rust-ast-collector.cc (TokenCollector::visit): Add visitor
+ 	implementation.
+ 	* ast/rust-ast-visitor.cc (DefaultASTVisitor::visit): Likewise.
+ 	* ast/rust-ast-collector.h: Add function prototype.
+ 	* ast/rust-ast-visitor.h: Likewise.
+ 	* expand/rust-derive.h: Likewise.
+ 	* hir/rust-ast-lower-base.h: Likewise.
+ 	* ast/rust-ast.cc (Attribute::get_traits_to_derive): Handle EXPR
+ 	variant.
+ 	(AttrInputExpr::AttrInputExpr): Add constructor.
+ 	(AttrInputExpr::operator=): Add assignment operator implementation.
+ 	(AttrInputExpr::as_string): Add a string conversion member function.
+ 	(AttrInputExpr::accept_vis): Add visitor function.
+ 	* ast/rust-ast.h: Add EXPR type variant to AttrInput.
+ 	* util/rust-attributes.cc (check_doc_attribute): Handle expr variant.
+ 	* ast/rust-expr.h (class AttrInputExpr): Add class definition with
+ 	member function prototypes.
+ 	* hir/rust-ast-lower-base.cc (ASTLoweringBase::visit): Add empty
+ 	visitor implementation.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* ast/rust-ast-dump.cc (debug): Add debug function which calls debug
+ 	on every crate field.
+ 	* ast/rust-ast-dump.h (debug): Add function prototype.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* util/rust-attributes.cc (AttributeChecker::visit): Rename function
+ 	and make call to ast default visitor.
+ 	(AttributeChecker::check_attribute): Remove function.
+ 	* util/rust-attributes.h: Add function prototype.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* ast/rust-ast.h (class Attribute): Make visitable parent class public.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* ast/rust-ast.h (class Attribute): Add a node id member.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* ast/rust-ast-full-decls.h (struct Attribute): Change from here...
+ 	(class Attribute): ...to a class here.
+ 	* ast/rust-ast-visitor.cc (DefaultASTVisitor::visit): Add a default
+ 	visit function for the attributes.
+ 	* ast/rust-ast-visitor.h: Add a proper visit function declaration for
+ 	attributes.
+ 	* ast/rust-ast.cc (Attribute::accept_vis): Add a function to accept a
+ 	visitor within the attributes.
+ 	* ast/rust-ast.h (struct Attribute): Add the accept_vis function
+ 	prototype.
+ 	(class Attribute): Rename from struct to class.
+ 	* expand/rust-derive.h: Add an empty implementation for visits to
+ 	prevent the visitor from recursing into the attributes.
+ 	* hir/rust-ast-lower-base.cc (ASTLoweringBase::visit): Add missing
+ 	implementation for attribute visit function. Add a check for derive
+ 	attributes that would have slipped through the passes.
+ 	* hir/rust-ast-lower-base.h: Add function prototype.
+ 	* resolve/rust-early-name-resolver-2.0.cc (Early::visit_attributes):
+ 	Split the function into two halves.
+ 	(Early::visit_derive_attribute): Specialized function from
+ 	visit_attribute for derive attributes.
+ 	(Early::visit_non_builtin_attribute): Likewise for non builtin
+ 	attributes.
+ 	(Early::visit): Rename visit_attributes to visit.
+ 	* resolve/rust-early-name-resolver-2.0.h (class Early): Update function
+ 	prototypes.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* util/rust-attributes.cc: Add "feature", "no_core", "doc",
+ 	"crate_name", "crate_type" and "may_dandle" to the list of builtin
+ 	attributes.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* rust-session-manager.cc (Session::handle_crate_name): Use the new
+ 	constexpr instead of a raw string value.
+ 	* util/rust-attribute-values.h: Add crate_name and crate_type values.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* Make-lang.in: Add new specific feature store file.
+ 	* checks/errors/feature/rust-feature-gate.cc (EarlyFeatureGateStore::get):
+ 	Move from here to rust-feature-store.cc.
+ 	(EarlyFeatureGateStore::add): Likewise.
+ 	(EarlyFeatureGateStore::get_error): Likewise.
+ 	(FeatureGate::check): Likewise.
+ 	* checks/errors/feature/rust-feature-gate.h (class EarlyFeatureGateStore):
+ 	Move class declaration to rust-feature-store.h header.
+ 	* parse/rust-parse.h: Change included header.
+ 	* checks/errors/feature/rust-feature-store.cc: New file.
+ 	* checks/errors/feature/rust-feature-store.h: New file.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* checks/errors/feature/rust-feature-gate.cc (EarlyFeatureGateStore::get):
+ 	Add function to retrieve singleton instance.
+ 	(EarlyFeatureGateStore::add): New function to add an error and the
+ 	corresponding feature in the store.
+ 	(EarlyFeatureGateStore::get_error): Add new function to retrieve the
+ 	oldest error.
+ 	(FeatureGate::check): Update the function to retrieve the errors from
+ 	the store instead of getting it from the parameters.
+ 	* checks/errors/feature/rust-feature-gate.h (class EarlyFeatureGateStore):
+ 	Add a new class to collect all early feature gating errors.
+ 	* parse/rust-parse.h: Use store instead of keeping the errors within
+ 	the parser instance.
+ 	* rust-session-manager.cc (Session::compile_crate): Remove old early
+ 	error collection from the main parser.
+ 	* rust-system.h: Include queue header.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* checks/errors/feature/rust-feature-gate.cc (FeatureGate::check):
+ 	Check all parse time errors.
+ 	* checks/errors/feature/rust-feature-gate.h: Update function prototype
+ 	with parse time errors.
+ 	* parse/rust-parse-impl-attribute.hxx: Collect potential gating error
+ 	with non literal attribute values. Remove error emission.
+ 	* parse/rust-parse.h: Add a function to gather potential feature gating
+ 	errors as well as a getter for collected errors.
+ 	* rust-session-manager.cc (Session::compile_crate): Retrieve potential
+ 	feature gating errors and check them later during the feature gating
+ 	step.
+ 	* util/rust-attributes.cc (check_export_name_attribute): Change
+ 	attribute checking error emission to prevent errors with macro inputs.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* checks/errors/feature/contrib/fetch: Bump version from 1.49.0 to
+ 	1.50.0. Change brace expansion to explicit file fetch.
+ 	* checks/errors/feature/rust-feature-defs.h: Regenerate.
+ 	* checks/errors/feature/contrib/copyright-stub.h: Add rfl include
+ 	directive.
+ 	* checks/errors/feature/rust-feature-defs-rfl.h: New file.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* Make-lang.in: Add rust-early-cfg-strip object file.
+ 	* expand/rust-cfg-strip.h (expand_cfg_attrs): Declare function prototype.
+ 	* rust-session-manager.cc (Session::compile_crate): Reorder feature
+ 	collection and add early cfg strip.
+ 	* expand/rust-early-cfg-strip.cc: New file.
+ 	* expand/rust-early-cfg-strip.h: New file.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* expand/rust-cfg-strip.cc (CfgStrip::fails_cfg): Remove function.
+ 	* expand/rust-cfg-strip.h: Remove function prototype.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* Make-lang.in: Add new feature collector file.
+ 	* checks/errors/feature/rust-feature-gate.cc (FeatureGate::visit):
+ 	Remove feature collection from gating visitor.
+ 	(FeatureGate::gate): Use features from the crate feature entity instead
+ 	of old class members.
+ 	* checks/errors/feature/rust-feature-gate.h: Get features from a
+ 	separate CrateFeatures struct instead of keeping them in the class.
+ 	* rust-session-manager.cc (Session::compile_crate): Collect features
+ 	before gating them.
+ 	* util/rust-attribute-values.h: Add feature attribute value.
+ 	* checks/errors/feature/rust-feature-collector.cc: New file.
+ 	* checks/errors/feature/rust-feature-collector.h: New file.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* util/rust-attributes.cc (is_builtin): Rename from here ...
+ 	(identify_builtin): ... to here.
+ 	(is_proc_macro_type): Handle new return value.
+ 	(AttributeChecker::check_inner_attribute): Likewise.
+ 	(AttributeChecker::check_attribute): Likewise.
+ 	(AttributeChecker::visit): Likewise.
+ 	* util/rust-attributes.h (identify_builtin): Update function prototype.
+ 
+ 2026-03-20  jayant chauhan  <0001jayant@gmail.com>
+ 
+ 	* ast/rust-ast.cc (Attribute::get_traits_to_derive): Propagate location
+ 	info from MetaWord to SimplePath.
+ 
+ 2026-03-20  Owen Avery  <powerboat9.gamer@gmail.com>
+ 
+ 	* ast/rust-ast.h: Include "rust-cloneable.h".
+ 	(struct CloneableDelegate<std::unique_ptr<AST::Pattern>>): Add
+ 	specialization.
+ 	* ast/rust-pattern.cc (IdentifierPattern::as_string): Handle
+ 	field type changes.
+ 	(RangePattern::as_string): Likewise.
+ 	(ReferencePattern::as_string): Likewise.
+ 	(StructPatternFieldTuplePat::as_string): Likewise.
+ 	(StructPatternFieldIdentPat::as_string): Likewise.
+ 	(StructPatternElements::as_string): Likewise.
+ 	(TupleStructItemsNoRest::as_string): Likewise.
+ 	(TupleStructItemsHasRest::as_string): Likewise.
+ 	(TupleStructPattern::as_string): Likewise.
+ 	(TuplePatternItemsNoRest::as_string): Likewise.
+ 	(TuplePatternItemsHasRest::as_string): Likewise.
+ 	(TuplePattern::as_string): Likewise.
+ 	(SlicePatternItemsNoRest::as_string): Likewise.
+ 	(SlicePatternItemsHasRest::as_string): Likewise.
+ 	(SlicePattern::as_string): Likewise.
+ 	(AltPattern::as_string): Likewise.
+ 	* ast/rust-pattern.h: Include "rust-cloneable.h".
+ 	(class IdentifierPattern): Use Cloneable to simplify copying.
+ 	(class RangePattern): Likewise.
+ 	(class ReferencePattern): Likewise.
+ 	(class StructPatternFieldTuplePat): Likewise.
+ 	(class StructPatternFieldIdentPat): Likewise.
+ 	(class StructPatternElements): Likewise.
+ 	(class TupleStructItemsNoRest): Likewise.
+ 	(class TupleStructItemsHasRest): Likewise.
+ 	(class TupleStructPattern): Likewise.
+ 	(class TuplePatternItemsNoRest): Likewise.
+ 	(class TuplePatternItemsHasRest): Likewise.
+ 	(class TuplePattern): Likewise.
+ 	(class GroupedPattern): Likewise.
+ 	(class SlicePatternItemsNoRest): Likewise.
+ 	(class SlicePatternItemsHasRest): Likewise.
+ 	(class SlicePattern): Likewise.
+ 	(class AltPattern): Likewise.
+ 	(struct
+ 	CloneableDelegate<std::unique_ptr<AST::RangePatternBound>>): Add
+ 	specialization.
+ 	(struct
+ 	CloneableDelegate<std::unique_ptr<AST::TupleStructItems>>):
+ 	Likewise.
+ 	(struct
+ 	CloneableDelegate<std::unique_ptr<AST::TuplePatternItems>>):
+ 	Likewise.
+ 	(struct
+ 	CloneableDelegate<std::unique_ptr<AST::SlicePatternItems>>):
+ 	Likewise.
+ 	(struct
+ 	CloneableDelegate<std::unique_ptr<AST::StructPatternField>>):
+ 	Likewise.
+ 	* util/rust-cloneable.h: New file.
+ 
  2026-02-27  Islam-Imad  <islamimad404@gmail.com>
  
  	* typecheck/rust-hir-type-check-struct.cc: enhance missing fields error message
diff -Nrcpad gcc-16-20260315/gcc/rust/Make-lang.in gcc-16-20260322/gcc/rust/Make-lang.in
*** gcc-16-20260315/gcc/rust/Make-lang.in	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/Make-lang.in	Sun Mar 22 22:32:07 2026
*************** GRS_OBJS = \
*** 94,99 ****
--- 94,100 ----
      rust/rust-compile-resolve-path.o \
      rust/rust-macro-expand.o \
      rust/rust-cfg-strip.o \
+     rust/rust-early-cfg-strip.o \
      rust/rust-expand-visitor.o \
      rust/rust-ast-builder.o \
      rust/rust-derive.o \
*************** GRS_OBJS = \
*** 205,210 ****
--- 206,212 ----
      rust/rust-hir-type-check-path.o \
      rust/rust-unsafe-checker.o \
      rust/rust-hir-pattern-analysis.o \
+     rust/rust-intrinsic-handlers.o \
      rust/rust-compile-intrinsic.o \
      rust/rust-compile-pattern.o \
      rust/rust-compile-fnparam.o \
*************** GRS_OBJS = \
*** 229,234 ****
--- 231,238 ----
      rust/rust-builtins.o \
      rust/rust-feature.o \
      rust/rust-feature-gate.o \
+     rust/rust-feature-store.o \
+     rust/rust-feature-collector.o \
      rust/rust-ast-validation.o \
      rust/rust-dir-owner.o \
      rust/rust-unicode.o \
diff -Nrcpad gcc-16-20260315/gcc/rust/ast/rust-ast-collector.cc gcc-16-20260322/gcc/rust/ast/rust-ast-collector.cc
*** gcc-16-20260315/gcc/rust/ast/rust-ast-collector.cc	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/ast/rust-ast-collector.cc	Sun Mar 22 22:32:07 2026
*************** TokenCollector::visit (Attribute &attrib
*** 181,186 ****
--- 181,191 ----
  	      visit (static_cast<AttrInputMacro &> (attrib.get_attr_input ()));
  	      break;
  	    }
+ 	  case AST::AttrInput::AttrInputType::EXPR:
+ 	    {
+ 	      visit (static_cast<AttrInputExpr &> (attrib.get_attr_input ()));
+ 	      break;
+ 	    }
  	  case AST::AttrInput::AttrInputType::META_ITEM:
  	    {
  	      visit (static_cast<AttrInputMetaItemContainer &> (
*************** TokenCollector::visit (AttrInputMacro &m
*** 908,913 ****
--- 913,925 ----
  }
  
  void
+ TokenCollector::visit (AttrInputExpr &attr)
+ {
+   describe_node (std::string ("AttrInputExpr"),
+ 		 [this, &attr] () { visit (attr.get_expr ()); });
+ }
+ 
+ void
  TokenCollector::visit (MetaItemLitExpr &item)
  {
    describe_node (std::string ("MetaItemLitExpr"), [this, &item] () {
diff -Nrcpad gcc-16-20260315/gcc/rust/ast/rust-ast-collector.h gcc-16-20260322/gcc/rust/ast/rust-ast-collector.h
*** gcc-16-20260315/gcc/rust/ast/rust-ast-collector.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/ast/rust-ast-collector.h	Sun Mar 22 22:32:07 2026
*************** public:
*** 292,297 ****
--- 292,298 ----
    void visit (LiteralExpr &expr);
    void visit (AttrInputLiteral &attr_input);
    void visit (AttrInputMacro &attr_input);
+   void visit (AttrInputExpr &attr_input);
    void visit (MetaItemLitExpr &meta_item);
    void visit (MetaItemPathExpr &meta_item);
    void visit (BorrowExpr &expr);
diff -Nrcpad gcc-16-20260315/gcc/rust/ast/rust-ast-dump.cc gcc-16-20260322/gcc/rust/ast/rust-ast-dump.cc
*** gcc-16-20260315/gcc/rust/ast/rust-ast-dump.cc	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/ast/rust-ast-dump.cc	Sun Mar 22 22:32:07 2026
*************** debug (Rust::AST::Visitable &v)
*** 105,107 ****
--- 105,120 ----
  {
    Rust::AST::Dump::debug (v);
  }
+ 
+ void
+ debug (Rust::AST::Crate &crate)
+ {
+   for (auto &inner_attr : crate.get_inner_attrs ())
+     {
+       debug (inner_attr);
+     }
+   for (auto &item : crate.items)
+     {
+       debug (*item);
+     }
+ }
diff -Nrcpad gcc-16-20260315/gcc/rust/ast/rust-ast-dump.h gcc-16-20260322/gcc/rust/ast/rust-ast-dump.h
*** gcc-16-20260315/gcc/rust/ast/rust-ast-dump.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/ast/rust-ast-dump.h	Sun Mar 22 22:32:07 2026
*************** private:
*** 143,147 ****
--- 143,148 ----
  
  // In the global namespace to make it easier to call from debugger
  void debug (Rust::AST::Visitable &v);
+ void debug (Rust::AST::Crate &v);
  
  #endif // !RUST_AST_DUMP_H
diff -Nrcpad gcc-16-20260315/gcc/rust/ast/rust-ast-full-decls.h gcc-16-20260322/gcc/rust/ast/rust-ast-full-decls.h
*** gcc-16-20260315/gcc/rust/ast/rust-ast-full-decls.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/ast/rust-ast-full-decls.h	Sun Mar 22 22:32:07 2026
*************** class DelimTokenTree;
*** 34,40 ****
  class PathSegment;
  class SimplePathSegment;
  class SimplePath;
! struct Attribute;
  class MetaItemInner;
  class AttrInputMetaItemContainer;
  class MetaItem;
--- 34,40 ----
  class PathSegment;
  class SimplePathSegment;
  class SimplePath;
! class Attribute;
  class MetaItemInner;
  class AttrInputMetaItemContainer;
  class MetaItem;
diff -Nrcpad gcc-16-20260315/gcc/rust/ast/rust-ast-visitor.cc gcc-16-20260322/gcc/rust/ast/rust-ast-visitor.cc
*** gcc-16-20260315/gcc/rust/ast/rust-ast-visitor.cc	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/ast/rust-ast-visitor.cc	Sun Mar 22 22:32:07 2026
*************** DefaultASTVisitor::visit (AST::LiteralEx
*** 195,200 ****
--- 195,208 ----
  }
  
  void
+ DefaultASTVisitor::visit (AST::Attribute &attribute)
+ {
+   visit (attribute.get_path ());
+   if (attribute.has_attr_input ())
+     visit (attribute.get_attr_input ());
+ }
+ 
+ void
  DefaultASTVisitor::visit (AST::AttrInputLiteral &attr_input)
  {
    visit (attr_input.get_literal ());
*************** DefaultASTVisitor::visit (AST::AttrInput
*** 207,212 ****
--- 215,226 ----
  }
  
  void
+ DefaultASTVisitor::visit (AST::AttrInputExpr &attr_input)
+ {
+   visit (attr_input.get_expr ());
+ }
+ 
+ void
  DefaultASTVisitor::visit (AST::MetaItemLitExpr &meta_item)
  {
    visit (meta_item.get_literal ());
diff -Nrcpad gcc-16-20260315/gcc/rust/ast/rust-ast-visitor.h gcc-16-20260322/gcc/rust/ast/rust-ast-visitor.h
*** gcc-16-20260315/gcc/rust/ast/rust-ast-visitor.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/ast/rust-ast-visitor.h	Sun Mar 22 22:32:07 2026
*************** public:
*** 39,44 ****
--- 39,45 ----
  
    // rust-ast.h
    // virtual void visit(AttrInput& attr_input) = 0;
+   virtual void visit (AST::Attribute &attribute) = 0;
    // virtual void visit(TokenTree& token_tree) = 0;
    // virtual void visit(MacroMatch& macro_match) = 0;
    virtual void visit (Token &tok) = 0;
*************** public:
*** 72,77 ****
--- 73,79 ----
    virtual void visit (LiteralExpr &expr) = 0;
    virtual void visit (AttrInputLiteral &attr_input) = 0;
    virtual void visit (AttrInputMacro &attr_input) = 0;
+   virtual void visit (AttrInputExpr &attr_input) = 0;
    virtual void visit (MetaItemLitExpr &meta_item) = 0;
    virtual void visit (MetaItemPathExpr &meta_item) = 0;
    virtual void visit (BorrowExpr &expr) = 0;
*************** public:
*** 267,272 ****
--- 269,275 ----
    virtual void visit (AST::QualifiedPathInType &path) override;
    virtual void visit (AST::LiteralExpr &expr) override;
    virtual void visit (AST::AttrInputLiteral &attr_input) override;
+   virtual void visit (AST::AttrInputExpr &attr_input) override;
    virtual void visit (AST::AttrInputMacro &attr_input) override;
    virtual void visit (AST::MetaItemLitExpr &meta_item) override;
    virtual void visit (AST::MetaItemPathExpr &meta_item) override;
*************** public:
*** 444,450 ****
    virtual void visit (AST::StructPatternElements &spe);
    virtual void visit (AST::MaybeNamedParam &param);
  
!   void visit (AST::Attribute &attribute) {}
  
    template <typename T> void visit_outer_attrs (T &node)
    {
--- 447,453 ----
    virtual void visit (AST::StructPatternElements &spe);
    virtual void visit (AST::MaybeNamedParam &param);
  
!   virtual void visit (AST::Attribute &attribute) override;
  
    template <typename T> void visit_outer_attrs (T &node)
    {
diff -Nrcpad gcc-16-20260315/gcc/rust/ast/rust-ast.cc gcc-16-20260322/gcc/rust/ast/rust-ast.cc
*** gcc-16-20260315/gcc/rust/ast/rust-ast.cc	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/ast/rust-ast.cc	Sun Mar 22 22:32:07 2026
*************** Crate::inject_extern_crate (std::string
*** 243,248 ****
--- 243,254 ----
  		      {}, UNKNOWN_LOCATION)));
  }
  
+ void
+ Crate::inject_inner_attribute (Attribute attribute)
+ {
+   inner_attrs.push_back (attribute);
+ }
+ 
  std::string
  Attribute::as_string () const
  {
*************** Attribute::as_string () const
*** 253,258 ****
--- 259,270 ----
      return path_str + attr_input->as_string ();
  }
  
+ void
+ Attribute::accept_vis (ASTVisitor &vis)
+ {
+   vis.visit (*this);
+ }
+ 
  bool
  Attribute::is_derive () const
  {
*************** Attribute::get_traits_to_derive ()
*** 302,309 ****
  			auto word = static_cast<AST::MetaWord *> (meta_item);
  			// Convert current word to path
  			current = std::make_unique<AST::MetaItemPath> (
! 			  AST::MetaItemPath (
! 			    AST::SimplePath (word->get_ident ())));
  			auto path
  			  = static_cast<AST::MetaItemPath *> (current.get ());
  
--- 314,322 ----
  			auto word = static_cast<AST::MetaWord *> (meta_item);
  			// Convert current word to path
  			current = std::make_unique<AST::MetaItemPath> (
! 			  AST::MetaItemPath (AST::SimplePath::from_str (
! 			    word->get_ident ().as_string (),
! 			    word->get_locus ())));
  			auto path
  			  = static_cast<AST::MetaItemPath *> (current.get ());
  
*************** Attribute::get_traits_to_derive ()
*** 332,337 ****
--- 345,351 ----
      case AST::AttrInput::TOKEN_TREE:
      case AST::AttrInput::LITERAL:
      case AST::AttrInput::MACRO:
+     case AST::AttrInput::EXPR:
        rust_unreachable ();
        break;
      }
*************** AttrInputMetaItemContainer::as_string ()
*** 3340,3345 ****
--- 3354,3382 ----
    return str + ")";
  }
  
+ AttrInputExpr::AttrInputExpr (const AttrInputExpr &oth)
+   : expr (oth.expr->clone_expr ())
+ {}
+ 
+ AttrInputExpr &
+ AttrInputExpr::operator= (const AttrInputExpr &oth)
+ {
+   expr = oth.expr->clone_expr ();
+   return *this;
+ }
+ 
+ std::string
+ AttrInputExpr::as_string () const
+ {
+   return expr->as_string ();
+ }
+ 
+ void
+ AttrInputExpr::accept_vis (ASTVisitor &vis)
+ {
+   vis.visit (*this);
+ }
+ 
  std::string
  AttrInputMacro::as_string () const
  {
*************** MetaListNameValueStr::to_attribute () co
*** 4169,4178 ****
  Attribute
  MetaItemPathExpr::to_attribute () const
  {
!   rust_assert (expr->is_literal ());
!   auto &lit = static_cast<LiteralExpr &> (*expr);
!   return Attribute (path, std::unique_ptr<AttrInputLiteral> (
! 			    new AttrInputLiteral (lit)));
  }
  
  std::vector<Attribute>
--- 4206,4213 ----
  Attribute
  MetaItemPathExpr::to_attribute () const
  {
!   auto input = std::make_unique<AttrInputExpr> (expr->clone_expr ());
!   return Attribute (path, std::move (input));
  }
  
  std::vector<Attribute>
*************** AttrInputMetaItemContainer::separate_cfg
*** 4188,4200 ****
  
    for (auto it = items.begin () + 1; it != items.end (); ++it)
      {
!       if ((*it)->get_kind () == MetaItemInner::Kind::MetaItem
! 	  && static_cast<MetaItem &> (**it).get_item_kind ()
! 	       == MetaItem::ItemKind::PathExpr
! 	  && !static_cast<MetaItemPathExpr &> (**it).get_expr ().is_literal ())
! 	continue;
  
!       Attribute attr = (*it)->to_attribute ();
        if (attr.is_empty ())
  	{
  	  /* TODO should this be an error that causes us to chuck out
--- 4223,4231 ----
  
    for (auto it = items.begin () + 1; it != items.end (); ++it)
      {
!       auto &item = **it;
  
!       Attribute attr = item.to_attribute ();
        if (attr.is_empty ())
  	{
  	  /* TODO should this be an error that causes us to chuck out
diff -Nrcpad gcc-16-20260315/gcc/rust/ast/rust-ast.h gcc-16-20260322/gcc/rust/ast/rust-ast.h
*** gcc-16-20260315/gcc/rust/ast/rust-ast.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/ast/rust-ast.h	Sun Mar 22 22:32:07 2026
***************
*** 26,31 ****
--- 26,32 ----
  #include "rust-location.h"
  #include "rust-diagnostics.h"
  #include "rust-keyword-values.h"
+ #include "rust-cloneable.h"
  
  namespace Rust {
  // TODO: remove typedefs and make actual types for these
*************** protected:
*** 565,573 ****
  
  // aka Attr
  // Attribute AST representation
! struct Attribute
  {
- private:
    SimplePath path;
  
    // bool has_attr_input;
--- 566,573 ----
  
  // aka Attr
  // Attribute AST representation
! class Attribute : public Visitable
  {
    SimplePath path;
  
    // bool has_attr_input;
*************** private:
*** 577,582 ****
--- 577,584 ----
  
    bool inner_attribute;
  
+   NodeId node_id;
+ 
    // TODO: maybe a variable storing whether attr input is parsed or not
  
  public:
*************** public:
*** 587,593 ****
    Attribute (SimplePath path, std::unique_ptr<AttrInput> input,
  	     location_t locus = UNDEF_LOCATION, bool inner_attribute = false)
      : path (std::move (path)), attr_input (std::move (input)), locus (locus),
!       inner_attribute (inner_attribute)
    {}
  
    bool is_derive () const;
--- 589,596 ----
    Attribute (SimplePath path, std::unique_ptr<AttrInput> input,
  	     location_t locus = UNDEF_LOCATION, bool inner_attribute = false)
      : path (std::move (path)), attr_input (std::move (input)), locus (locus),
!       inner_attribute (inner_attribute),
!       node_id (Analysis::Mappings::get ().get_next_node_id ())
    {}
  
    bool is_derive () const;
*************** public:
*** 685,695 ****
  
    bool is_inner_attribute () const { return inner_attribute; }
  
!   // no visitor pattern as not currently polymorphic
  
    const SimplePath &get_path () const { return path; }
    SimplePath &get_path () { return path; }
  
    // Call to parse attribute body to meta item syntax.
    void parse_attr_to_meta_item ();
  
--- 688,700 ----
  
    bool is_inner_attribute () const { return inner_attribute; }
  
!   void accept_vis (ASTVisitor &vis) override;
  
    const SimplePath &get_path () const { return path; }
    SimplePath &get_path () { return path; }
  
+   NodeId get_node_id () { return node_id; }
+ 
    // Call to parse attribute body to meta item syntax.
    void parse_attr_to_meta_item ();
  
*************** class AttrInput : public Visitable
*** 719,724 ****
--- 724,730 ----
  public:
    enum AttrInputType
    {
+     EXPR,
      LITERAL,
      MACRO,
      META_ITEM,
*************** public:
*** 2117,2122 ****
--- 2123,2129 ----
    }
  
    void inject_extern_crate (std::string name);
+   void inject_inner_attribute (Attribute attribute);
  
    NodeId get_node_id () const { return node_id; }
    const std::vector<Attribute> &get_inner_attrs () const { return inner_attrs; }
*************** public:
*** 2139,2144 ****
--- 2146,2164 ----
  };
  
  } // namespace AST
+ 
+ template <> struct CloneableDelegate<std::unique_ptr<AST::Pattern>>
+ {
+   static std::unique_ptr<AST::Pattern>
+   clone (const std::unique_ptr<AST::Pattern> &other)
+   {
+     if (other == nullptr)
+       return nullptr;
+     else
+       return other->clone_pattern ();
+   }
+ };
+ 
  } // namespace Rust
  
  namespace std {
diff -Nrcpad gcc-16-20260315/gcc/rust/ast/rust-expr.h gcc-16-20260322/gcc/rust/ast/rust-expr.h
*** gcc-16-20260315/gcc/rust/ast/rust-expr.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/ast/rust-expr.h	Sun Mar 22 22:32:07 2026
*************** protected:
*** 169,174 ****
--- 169,215 ----
    }
  };
  
+ class AttrInputExpr : public AttrInput
+ {
+   std::unique_ptr<Expr> expr;
+ 
+ public:
+   AttrInputExpr (std::unique_ptr<Expr> expr) : expr (std::move (expr)) {}
+ 
+   AttrInputExpr (const AttrInputExpr &oth);
+ 
+   AttrInputExpr (AttrInputExpr &&oth) : expr (std::move (oth.expr)) {}
+ 
+   AttrInputType get_attr_input_type () const final override
+   {
+     return AttrInput::AttrInputType::EXPR;
+   }
+ 
+   AttrInputExpr &operator= (const AttrInputExpr &oth);
+ 
+   AttrInputExpr &operator= (AttrInputExpr &&oth)
+   {
+     expr = std::move (oth.expr);
+     return *this;
+   }
+ 
+   std::string as_string () const override;
+ 
+   void accept_vis (ASTVisitor &vis) override;
+ 
+   bool check_cfg_predicate (const Session &) const override { return false; }
+ 
+   // assuming this is like AttrInputLiteral
+   bool is_meta_item () const override { return false; }
+ 
+   Expr &get_expr () { return *expr; }
+ 
+   AttrInputExpr *clone_attr_input_impl () const override
+   {
+     return new AttrInputExpr (*this);
+   }
+ };
+ 
  // Like an AttrInputLiteral, but stores a MacroInvocation
  class AttrInputMacro : public AttrInput
  {
diff -Nrcpad gcc-16-20260315/gcc/rust/ast/rust-macro.h gcc-16-20260322/gcc/rust/ast/rust-macro.h
*** gcc-16-20260315/gcc/rust/ast/rust-macro.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/ast/rust-macro.h	Sun Mar 22 22:32:07 2026
*************** public:
*** 672,683 ****
      outer_attrs = std::move (new_attrs);
    }
  
!   NodeId get_node_id () const override final
!   {
!     return ExprWithoutBlock::get_node_id ();
!   }
! 
!   NodeId get_macro_node_id () const { return node_id; }
  
    MacroInvocData &get_invoc_data () { return invoc_data; }
  
--- 672,678 ----
      outer_attrs = std::move (new_attrs);
    }
  
!   NodeId get_node_id () const override final { return node_id; }
  
    MacroInvocData &get_invoc_data () { return invoc_data; }
  
*************** private:
*** 714,721 ****
      MacroInvocData invoc_data, std::vector<Attribute> outer_attrs,
      location_t locus, bool is_semi_coloned,
      std::vector<std::unique_ptr<MacroInvocation>> &&pending_eager_invocs)
!     : TraitItem (locus), outer_attrs (std::move (outer_attrs)), locus (locus),
!       node_id (Analysis::Mappings::get ().get_next_node_id ()),
        invoc_data (std::move (invoc_data)), is_semi_coloned (is_semi_coloned),
        kind (kind), builtin_kind (builtin_kind),
        pending_eager_invocs (std::move (pending_eager_invocs))
--- 709,718 ----
      MacroInvocData invoc_data, std::vector<Attribute> outer_attrs,
      location_t locus, bool is_semi_coloned,
      std::vector<std::unique_ptr<MacroInvocation>> &&pending_eager_invocs)
!     : TraitItem (locus),
!       ExternalItem (Analysis::Mappings::get ().get_next_node_id ()),
!       outer_attrs (std::move (outer_attrs)), locus (locus),
!       node_id (ExternalItem::get_node_id ()),
        invoc_data (std::move (invoc_data)), is_semi_coloned (is_semi_coloned),
        kind (kind), builtin_kind (builtin_kind),
        pending_eager_invocs (std::move (pending_eager_invocs))
diff -Nrcpad gcc-16-20260315/gcc/rust/ast/rust-path.h gcc-16-20260322/gcc/rust/ast/rust-path.h
*** gcc-16-20260315/gcc/rust/ast/rust-path.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/ast/rust-path.h	Sun Mar 22 22:32:07 2026
*************** public:
*** 84,89 ****
--- 84,98 ----
      // and also identifier is empty, but cheaper computation
    }
  
+   GenericArgsBinding reconstruct () const
+   {
+     std::unique_ptr<Type> new_type = nullptr;
+     if (type)
+       new_type = type->reconstruct ();
+ 
+     return GenericArgsBinding (identifier, std::move (new_type), locus);
+   }
+ 
    // Creates an error state generic args binding.
    static GenericArgsBinding create_error ()
    {
*************** public:
*** 190,195 ****
--- 199,220 ----
      return GenericArg (nullptr, nullptr, std::move (path), Kind::Either, locus);
    }
  
+   GenericArg reconstruct () const
+   {
+     switch (kind)
+       {
+       case Kind::Type:
+ 	return create_type (type->reconstruct ());
+       case Kind::Const:
+ 	// FIXME: Use reconstruct_expr when available
+ 	return create_const (expression->clone_expr ());
+       case Kind::Either:
+       default:
+ 	// For ambiguous or error states, copy constructs are sufficient
+ 	return GenericArg (*this);
+       }
+   }
+ 
    GenericArg (const GenericArg &other)
      : path (other.path), kind (other.kind), locus (other.locus)
    {
*************** public:
*** 460,465 ****
--- 485,507 ----
  
    ~GenericArgs () = default;
  
+   GenericArgs reconstruct () const
+   {
+     std::vector<GenericArg> new_args;
+     new_args.reserve (generic_args.size ());
+     for (const auto &arg : generic_args)
+       new_args.push_back (arg.reconstruct ());
+ 
+     std::vector<GenericArgsBinding> new_bindings;
+     new_bindings.reserve (binding_args.size ());
+     for (const auto &binding : binding_args)
+       new_bindings.push_back (binding.reconstruct ());
+ 
+     // Lifetimes are values, so they can be copied directly
+     return GenericArgs (lifetime_args, std::move (new_args),
+ 			std::move (new_bindings), locus);
+   }
+ 
    // overloaded assignment operator to vector clone
    GenericArgs &operator= (GenericArgs const &other)
    {
*************** public:
*** 563,568 ****
--- 605,615 ----
  
    NodeId get_node_id () const { return node_id; }
  
+   PathExprSegment reconstruct () const
+   {
+     return PathExprSegment (segment_name, locus, generic_args.reconstruct ());
+   }
+ 
    bool is_super_path_seg () const
    {
      return !has_generic_args () && get_ident_segment ().is_super_path_seg ();
*************** public:
*** 705,710 ****
--- 752,771 ----
      return convert_to_simple_path (has_opening_scope_resolution);
    }
  
+   std::unique_ptr<PathInExpression> reconstruct () const
+   {
+     std::vector<PathExprSegment> new_segments;
+     new_segments.reserve (segments.size ());
+     for (const auto &seg : segments)
+       new_segments.push_back (seg.reconstruct ());
+ 
+     auto *new_path
+       = new PathInExpression (std::move (new_segments), outer_attrs, locus,
+ 			      has_opening_scope_resolution);
+ 
+     return std::unique_ptr<PathInExpression> (new_path);
+   }
+ 
    location_t get_locus () const override final { return locus; }
  
    void accept_vis (ASTVisitor &vis) override;
*************** public:
*** 1004,1009 ****
--- 1065,1078 ----
    {
      return new TypePathSegmentGeneric (*this);
    }
+ 
+   TypePathSegmentGeneric *reconstruct_impl () const override
+   {
+     return new TypePathSegmentGeneric (get_ident_segment (),
+ 				       has_separating_scope_resolution,
+ 				       generic_args.reconstruct (),
+ 				       get_locus ());
+   }
  };
  
  // A function as represented in a type path
*************** public:
*** 1112,1117 ****
--- 1181,1201 ----
      return return_type;
    }
  
+   TypePathFunction reconstruct () const
+   {
+     std::vector<std::unique_ptr<Type>> new_inputs;
+     new_inputs.reserve (inputs.size ());
+     for (const auto &e : inputs)
+       new_inputs.push_back (e->reconstruct ());
+ 
+     std::unique_ptr<Type> new_ret = nullptr;
+     if (return_type)
+       new_ret = return_type->reconstruct ();
+ 
+     return TypePathFunction (std::move (new_inputs), locus,
+ 			     std::move (new_ret));
+   }
+ 
    location_t get_locus () const { return locus; }
  };
  
*************** public:
*** 1159,1164 ****
--- 1243,1256 ----
    {
      return new TypePathSegmentFunction (*this);
    }
+ 
+   TypePathSegmentFunction *reconstruct_impl () const override
+   {
+     return new TypePathSegmentFunction (get_ident_segment (),
+ 					has_separating_scope_resolution,
+ 					function_path.reconstruct (),
+ 					get_locus ());
+   }
  };
  
  class TypePath : public TypeNoBounds
*************** public:
*** 1327,1332 ****
--- 1419,1438 ----
    QualifiedPathType (QualifiedPathType &&other) = default;
    QualifiedPathType &operator= (QualifiedPathType &&other) = default;
  
+   QualifiedPathType reconstruct () const
+   {
+     auto new_type = type_to_invoke_on->reconstruct ();
+ 
+     // trait_path is stored by value, but reconstruct returns a unique_ptr.
+     // We must dereference it to pass to the constructor.
+     // This is safe because the constructor makes its own copy/move.
+     auto new_trait_path_ptr = trait_path.reconstruct ();
+     TypePath *concrete_ptr
+       = static_cast<TypePath *> (new_trait_path_ptr.get ());
+ 
+     return QualifiedPathType (std::move (new_type), locus, *concrete_ptr);
+   }
+ 
    // Returns whether the qualified path type has a rebind as clause.
    bool has_as_clause () const { return !trait_path.is_error (); }
  
*************** public:
*** 1433,1438 ****
--- 1539,1558 ----
      return Expr::Kind::QualifiedPathInExpression;
    }
  
+   std::unique_ptr<QualifiedPathInExpression> reconstruct () const
+   {
+     std::vector<PathExprSegment> new_segments;
+     new_segments.reserve (segments.size ());
+     for (const auto &seg : segments)
+       new_segments.push_back (seg.reconstruct ());
+ 
+     auto *new_path = new QualifiedPathInExpression (path_type.reconstruct (),
+ 						    std::move (new_segments),
+ 						    outer_attrs, locus);
+ 
+     return std::unique_ptr<QualifiedPathInExpression> (new_path);
+   }
+ 
  protected:
    /* Use covariance to implement clone function as returning this object
     * rather than base */
*************** protected:
*** 1474,1480 ****
    }
    QualifiedPathInType *reconstruct_impl () const override
    {
!     return new QualifiedPathInType (path_type,
  				    associated_segment->reconstruct (),
  				    reconstruct_vec (segments), locus);
    }
--- 1594,1600 ----
    }
    QualifiedPathInType *reconstruct_impl () const override
    {
!     return new QualifiedPathInType (path_type.reconstruct (),
  				    associated_segment->reconstruct (),
  				    reconstruct_vec (segments), locus);
    }
diff -Nrcpad gcc-16-20260315/gcc/rust/ast/rust-pattern.cc gcc-16-20260322/gcc/rust/ast/rust-pattern.cc
*** gcc-16-20260315/gcc/rust/ast/rust-pattern.cc	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/ast/rust-pattern.cc	Sun Mar 22 22:32:07 2026
*************** IdentifierPattern::as_string () const
*** 66,72 ****
    str += variable_ident.as_string ();
  
    if (has_subpattern ())
!     str += " @ " + subpattern->as_string ();
  
    return str;
  }
--- 66,72 ----
    str += variable_ident.as_string ();
  
    if (has_subpattern ())
!     str += " @ " + subpattern.get ()->as_string ();
  
    return str;
  }
*************** RangePattern::as_string () const
*** 91,101 ****
    switch (range_kind)
      {
      case RangeKind::EXCLUDED:
!       return lower->as_string () + ".." + upper->as_string ();
      case RangeKind::INCLUDED:
!       return lower->as_string () + "..=" + upper->as_string ();
      case RangeKind::ELLIPSIS:
!       return lower->as_string () + "..." + upper->as_string ();
      default:
        rust_unreachable ();
      }
--- 91,101 ----
    switch (range_kind)
      {
      case RangeKind::EXCLUDED:
!       return lower.get ()->as_string () + ".." + upper.get ()->as_string ();
      case RangeKind::INCLUDED:
!       return lower.get ()->as_string () + "..=" + upper.get ()->as_string ();
      case RangeKind::ELLIPSIS:
!       return lower.get ()->as_string () + "..." + upper.get ()->as_string ();
      default:
        rust_unreachable ();
      }
*************** ReferencePattern::as_string () const
*** 113,119 ****
    if (is_mut)
      str += "mut ";
  
!   str += pattern->as_string ();
  
    return str;
  }
--- 113,119 ----
    if (is_mut)
      str += "mut ";
  
!   str += pattern.get ()->as_string ();
  
    return str;
  }
*************** StructPatternFieldTuplePat::as_string ()
*** 135,141 ****
  
    str += "\n";
  
!   str += std::to_string (index) + " : " + tuple_pattern->as_string ();
  
    return str;
  }
--- 135,141 ----
  
    str += "\n";
  
!   str += std::to_string (index) + " : " + tuple_pattern.get ()->as_string ();
  
    return str;
  }
*************** StructPatternFieldIdentPat::as_string ()
*** 148,154 ****
  
    str += "\n";
  
!   str += ident.as_string () + " : " + ident_pattern->as_string ();
  
    return str;
  }
--- 148,154 ----
  
    str += "\n";
  
!   str += ident.as_string () + " : " + ident_pattern.get ()->as_string ();
  
    return str;
  }
*************** StructPatternElements::as_string () cons
*** 182,188 ****
      }
    else
      {
!       for (const auto &field : fields)
  	str += "\n   " + field->as_string ();
      }
  
--- 182,188 ----
      }
    else
      {
!       for (const auto &field : fields.get ())
  	str += "\n   " + field->as_string ();
      }
  
*************** TupleStructItemsNoRest::as_string () con
*** 216,222 ****
  {
    std::string str;
  
!   for (const auto &pattern : patterns)
      str += "\n  " + pattern->as_string ();
  
    return str;
--- 216,222 ----
  {
    std::string str;
  
!   for (const auto &pattern : patterns.get ())
      str += "\n  " + pattern->as_string ();
  
    return str;
*************** TupleStructItemsHasRest::as_string () co
*** 227,250 ****
  {
    std::string str ("\n  Lower patterns: ");
  
!   if (lower_patterns.empty ())
      {
        str += "none";
      }
    else
      {
!       for (const auto &lower : lower_patterns)
  	str += "\n   " + lower->as_string ();
      }
  
    str += "\n  Upper patterns: ";
!   if (upper_patterns.empty ())
      {
        str += "none";
      }
    else
      {
!       for (const auto &upper : upper_patterns)
  	str += "\n   " + upper->as_string ();
      }
  
--- 227,250 ----
  {
    std::string str ("\n  Lower patterns: ");
  
!   if (lower_patterns.get ().empty ())
      {
        str += "none";
      }
    else
      {
!       for (const auto &lower : lower_patterns.get ())
  	str += "\n   " + lower->as_string ();
      }
  
    str += "\n  Upper patterns: ";
!   if (upper_patterns.get ().empty ())
      {
        str += "none";
      }
    else
      {
!       for (const auto &upper : upper_patterns.get ())
  	str += "\n   " + upper->as_string ();
      }
  
*************** TupleStructPattern::as_string () const
*** 258,264 ****
  
    str += path.as_string ();
  
!   str += "\n Tuple struct items: " + items->as_string ();
  
    return str;
  }
--- 258,264 ----
  
    str += path.as_string ();
  
!   str += "\n Tuple struct items: " + items.get ()->as_string ();
  
    return str;
  }
*************** TuplePatternItemsNoRest::as_string () co
*** 268,274 ****
  {
    std::string str;
  
!   for (const auto &pattern : patterns)
      str += "\n " + pattern->as_string ();
  
    return str;
--- 268,274 ----
  {
    std::string str;
  
!   for (const auto &pattern : patterns.get ())
      str += "\n " + pattern->as_string ();
  
    return str;
*************** TuplePatternItemsHasRest::as_string () c
*** 280,303 ****
    std::string str;
  
    str += "\n Lower patterns: ";
!   if (lower_patterns.empty ())
      {
        str += "none";
      }
    else
      {
!       for (const auto &lower : lower_patterns)
  	str += "\n  " + lower->as_string ();
      }
  
    str += "\n Upper patterns: ";
!   if (upper_patterns.empty ())
      {
        str += "none";
      }
    else
      {
!       for (const auto &upper : upper_patterns)
  	str += "\n  " + upper->as_string ();
      }
  
--- 280,303 ----
    std::string str;
  
    str += "\n Lower patterns: ";
!   if (lower_patterns.get ().empty ())
      {
        str += "none";
      }
    else
      {
!       for (const auto &lower : lower_patterns.get ())
  	str += "\n  " + lower->as_string ();
      }
  
    str += "\n Upper patterns: ";
!   if (upper_patterns.get ().empty ())
      {
        str += "none";
      }
    else
      {
!       for (const auto &upper : upper_patterns.get ())
  	str += "\n  " + upper->as_string ();
      }
  
*************** TuplePatternItemsHasRest::as_string () c
*** 307,313 ****
  std::string
  TuplePattern::as_string () const
  {
!   return "TuplePattern: " + items->as_string ();
  }
  
  std::string
--- 307,313 ----
  std::string
  TuplePattern::as_string () const
  {
!   return "TuplePattern: " + items.get ()->as_string ();
  }
  
  std::string
*************** SlicePatternItemsNoRest::as_string () co
*** 331,337 ****
  {
    std::string str;
  
!   for (const auto &pattern : patterns)
      str += "\n " + pattern->as_string ();
  
    return str;
--- 331,337 ----
  {
    std::string str;
  
!   for (const auto &pattern : patterns.get ())
      str += "\n " + pattern->as_string ();
  
    return str;
*************** SlicePatternItemsHasRest::as_string () c
*** 343,366 ****
    std::string str;
  
    str += "\n Lower patterns: ";
!   if (lower_patterns.empty ())
      {
        str += "none";
      }
    else
      {
!       for (const auto &lower : lower_patterns)
  	str += "\n  " + lower->as_string ();
      }
  
    str += "\n Upper patterns: ";
!   if (upper_patterns.empty ())
      {
        str += "none";
      }
    else
      {
!       for (const auto &upper : upper_patterns)
  	str += "\n  " + upper->as_string ();
      }
  
--- 343,366 ----
    std::string str;
  
    str += "\n Lower patterns: ";
!   if (lower_patterns.get ().empty ())
      {
        str += "none";
      }
    else
      {
!       for (const auto &lower : lower_patterns.get ())
  	str += "\n  " + lower->as_string ();
      }
  
    str += "\n Upper patterns: ";
!   if (upper_patterns.get ().empty ())
      {
        str += "none";
      }
    else
      {
!       for (const auto &upper : upper_patterns.get ())
  	str += "\n  " + upper->as_string ();
      }
  
*************** SlicePatternItemsHasRest::as_string () c
*** 370,376 ****
  std::string
  SlicePattern::as_string () const
  {
!   return "SlicePattern: " + items->as_string ();
  }
  
  std::string
--- 370,376 ----
  std::string
  SlicePattern::as_string () const
  {
!   return "SlicePattern: " + items.get ()->as_string ();
  }
  
  std::string
*************** AltPattern::as_string () const
*** 378,384 ****
  {
    std::string str ("AltPattern: ");
  
!   for (const auto &pattern : alts)
      str += "\n " + pattern->as_string ();
  
    return str;
--- 378,384 ----
  {
    std::string str ("AltPattern: ");
  
!   for (const auto &pattern : alts.get ())
      str += "\n " + pattern->as_string ();
  
    return str;
diff -Nrcpad gcc-16-20260315/gcc/rust/ast/rust-pattern.h gcc-16-20260322/gcc/rust/ast/rust-pattern.h
*** gcc-16-20260315/gcc/rust/ast/rust-pattern.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/ast/rust-pattern.h	Sun Mar 22 22:32:07 2026
***************
*** 21,26 ****
--- 21,27 ----
  
  #include "rust-ast.h"
  #include "rust-path.h"
+ #include "rust-cloneable.h"
  
  namespace Rust {
  namespace AST {
*************** class IdentifierPattern : public Pattern
*** 93,99 ****
    bool is_mut;
  
    // bool has_pattern;
!   std::unique_ptr<Pattern> subpattern;
    location_t locus;
    NodeId node_id;
  
--- 94,100 ----
    bool is_mut;
  
    // bool has_pattern;
!   Cloneable<std::unique_ptr<Pattern>> subpattern;
    location_t locus;
    NodeId node_id;
  
*************** public:
*** 120,157 ****
        node_id (node_id)
    {}
  
-   // Copy constructor with clone
-   IdentifierPattern (IdentifierPattern const &other)
-     : variable_ident (other.variable_ident), is_ref (other.is_ref),
-       is_mut (other.is_mut), locus (other.locus), node_id (other.node_id)
-   {
-     // fix to get prevent null pointer dereference
-     if (other.subpattern != nullptr)
-       subpattern = other.subpattern->clone_pattern ();
-   }
- 
-   // Overload assignment operator to use clone
-   IdentifierPattern &operator= (IdentifierPattern const &other)
-   {
-     variable_ident = other.variable_ident;
-     is_ref = other.is_ref;
-     is_mut = other.is_mut;
-     locus = other.locus;
-     node_id = other.node_id;
- 
-     // fix to prevent null pointer dereference
-     if (other.subpattern != nullptr)
-       subpattern = other.subpattern->clone_pattern ();
-     else
-       subpattern = nullptr;
- 
-     return *this;
-   }
- 
-   // default move semantics
-   IdentifierPattern (IdentifierPattern &&other) = default;
-   IdentifierPattern &operator= (IdentifierPattern &&other) = default;
- 
    location_t get_locus () const override final { return locus; }
  
    void accept_vis (ASTVisitor &vis) override;
--- 121,126 ----
*************** public:
*** 159,171 ****
    Pattern &get_subpattern ()
    {
      rust_assert (has_subpattern ());
!     return *subpattern;
    }
  
    std::unique_ptr<Pattern> &get_subpattern_ptr ()
    {
      rust_assert (has_subpattern ());
!     return subpattern;
    }
  
    Identifier get_ident () const { return variable_ident; }
--- 128,140 ----
    Pattern &get_subpattern ()
    {
      rust_assert (has_subpattern ());
!     return *subpattern.get ();
    }
  
    std::unique_ptr<Pattern> &get_subpattern_ptr ()
    {
      rust_assert (has_subpattern ());
!     return subpattern.get ();
    }
  
    Identifier get_ident () const { return variable_ident; }
*************** RangeKind tokenid_to_rangekind (TokenId
*** 403,410 ****
  // AST node for matching within a certain range (range pattern)
  class RangePattern : public Pattern
  {
!   std::unique_ptr<RangePatternBound> lower;
!   std::unique_ptr<RangePatternBound> upper;
  
    RangeKind range_kind;
  
--- 372,379 ----
  // AST node for matching within a certain range (range pattern)
  class RangePattern : public Pattern
  {
!   Cloneable<std::unique_ptr<RangePatternBound>> lower;
!   Cloneable<std::unique_ptr<RangePatternBound>> upper;
  
    RangeKind range_kind;
  
*************** public:
*** 425,454 ****
        node_id (Analysis::Mappings::get ().get_next_node_id ())
    {}
  
-   // Copy constructor with clone
-   RangePattern (RangePattern const &other)
-     : lower (other.lower->clone_range_pattern_bound ()),
-       upper (other.upper->clone_range_pattern_bound ()),
-       range_kind (other.range_kind), locus (other.locus),
-       node_id (other.node_id)
-   {}
- 
-   // Overloaded assignment operator to clone
-   RangePattern &operator= (RangePattern const &other)
-   {
-     lower = other.lower->clone_range_pattern_bound ();
-     upper = other.upper->clone_range_pattern_bound ();
-     range_kind = other.range_kind;
-     locus = other.locus;
-     node_id = other.node_id;
- 
-     return *this;
-   }
- 
-   // default move semantics
-   RangePattern (RangePattern &&other) = default;
-   RangePattern &operator= (RangePattern &&other) = default;
- 
    location_t get_locus () const override final { return locus; }
  
    bool get_has_ellipsis_syntax () const
--- 394,399 ----
*************** public:
*** 468,480 ****
    RangePatternBound &get_lower_bound ()
    {
      rust_assert (lower != nullptr);
!     return *lower;
    }
  
    RangePatternBound &get_upper_bound ()
    {
      rust_assert (upper != nullptr);
!     return *upper;
    }
  
    NodeId get_node_id () const override { return node_id; }
--- 413,425 ----
    RangePatternBound &get_lower_bound ()
    {
      rust_assert (lower != nullptr);
!     return *lower.get ();
    }
  
    RangePatternBound &get_upper_bound ()
    {
      rust_assert (upper != nullptr);
!     return *upper.get ();
    }
  
    NodeId get_node_id () const override { return node_id; }
*************** class ReferencePattern : public Pattern
*** 495,501 ****
  {
    bool has_two_amps;
    bool is_mut;
!   std::unique_ptr<Pattern> pattern;
    location_t locus;
    NodeId node_id;
  
--- 440,446 ----
  {
    bool has_two_amps;
    bool is_mut;
!   Cloneable<std::unique_ptr<Pattern>> pattern;
    location_t locus;
    NodeId node_id;
  
*************** public:
*** 509,537 ****
        node_id (Analysis::Mappings::get ().get_next_node_id ())
    {}
  
-   // Copy constructor requires clone
-   ReferencePattern (ReferencePattern const &other)
-     : has_two_amps (other.has_two_amps), is_mut (other.is_mut),
-       pattern (other.pattern->clone_pattern ()), locus (other.locus),
-       node_id (other.node_id)
-   {}
- 
-   // Overload assignment operator to clone
-   ReferencePattern &operator= (ReferencePattern const &other)
-   {
-     pattern = other.pattern->clone_pattern ();
-     is_mut = other.is_mut;
-     has_two_amps = other.has_two_amps;
-     locus = other.locus;
-     node_id = other.node_id;
- 
-     return *this;
-   }
- 
-   // default move semantics
-   ReferencePattern (ReferencePattern &&other) = default;
-   ReferencePattern &operator= (ReferencePattern &&other) = default;
- 
    location_t get_locus () const override final { return locus; }
  
    void accept_vis (ASTVisitor &vis) override;
--- 454,459 ----
*************** public:
*** 540,552 ****
    Pattern &get_referenced_pattern ()
    {
      rust_assert (pattern != nullptr);
!     return *pattern;
    }
  
    std::unique_ptr<Pattern> &get_referenced_pattern_ptr ()
    {
      rust_assert (pattern != nullptr);
!     return pattern;
    }
  
    bool is_double_reference () const { return has_two_amps; }
--- 462,474 ----
    Pattern &get_referenced_pattern ()
    {
      rust_assert (pattern != nullptr);
!     return *pattern.get ();
    }
  
    std::unique_ptr<Pattern> &get_referenced_pattern_ptr ()
    {
      rust_assert (pattern != nullptr);
!     return pattern.get ();
    }
  
    bool is_double_reference () const { return has_two_amps; }
*************** protected:
*** 647,653 ****
  class StructPatternFieldTuplePat : public StructPatternField
  {
    TupleIndex index;
!   std::unique_ptr<Pattern> tuple_pattern;
  
  public:
    StructPatternFieldTuplePat (TupleIndex index,
--- 569,575 ----
  class StructPatternFieldTuplePat : public StructPatternField
  {
    TupleIndex index;
!   Cloneable<std::unique_ptr<Pattern>> tuple_pattern;
  
  public:
    StructPatternFieldTuplePat (TupleIndex index,
*************** public:
*** 659,697 ****
        index (index), tuple_pattern (std::move (tuple_pattern))
    {}
  
-   // Copy constructor requires clone
-   StructPatternFieldTuplePat (StructPatternFieldTuplePat const &other)
-     : StructPatternField (other), index (other.index)
-   {
-     // guard to prevent null dereference (only required if error state)
-     node_id = other.get_node_id ();
-     if (other.tuple_pattern != nullptr)
-       tuple_pattern = other.tuple_pattern->clone_pattern ();
-   }
- 
-   // Overload assignment operator to perform clone
-   StructPatternFieldTuplePat &
-   operator= (StructPatternFieldTuplePat const &other)
-   {
-     StructPatternField::operator= (other);
-     index = other.index;
-     // outer_attrs = other.outer_attrs;
-     node_id = other.get_node_id ();
- 
-     // guard to prevent null dereference (only required if error state)
-     if (other.tuple_pattern != nullptr)
-       tuple_pattern = other.tuple_pattern->clone_pattern ();
-     else
-       tuple_pattern = nullptr;
- 
-     return *this;
-   }
- 
-   // default move semantics
-   StructPatternFieldTuplePat (StructPatternFieldTuplePat &&other) = default;
-   StructPatternFieldTuplePat &operator= (StructPatternFieldTuplePat &&other)
-     = default;
- 
    std::string as_string () const override;
  
    void accept_vis (ASTVisitor &vis) override;
--- 581,586 ----
*************** public:
*** 709,721 ****
    Pattern &get_index_pattern ()
    {
      rust_assert (tuple_pattern != nullptr);
!     return *tuple_pattern;
    }
  
    std::unique_ptr<Pattern> &get_index_pattern_ptr ()
    {
      rust_assert (tuple_pattern != nullptr);
!     return tuple_pattern;
    }
  
    ItemType get_item_type () const override final { return ItemType::TUPLE_PAT; }
--- 598,610 ----
    Pattern &get_index_pattern ()
    {
      rust_assert (tuple_pattern != nullptr);
!     return *tuple_pattern.get ();
    }
  
    std::unique_ptr<Pattern> &get_index_pattern_ptr ()
    {
      rust_assert (tuple_pattern != nullptr);
!     return tuple_pattern.get ();
    }
  
    ItemType get_item_type () const override final { return ItemType::TUPLE_PAT; }
*************** protected:
*** 733,739 ****
  class StructPatternFieldIdentPat : public StructPatternField
  {
    Identifier ident;
!   std::unique_ptr<Pattern> ident_pattern;
  
  public:
    StructPatternFieldIdentPat (Identifier ident,
--- 622,628 ----
  class StructPatternFieldIdentPat : public StructPatternField
  {
    Identifier ident;
!   Cloneable<std::unique_ptr<Pattern>> ident_pattern;
  
  public:
    StructPatternFieldIdentPat (Identifier ident,
*************** public:
*** 745,783 ****
        ident (std::move (ident)), ident_pattern (std::move (ident_pattern))
    {}
  
-   // Copy constructor requires clone
-   StructPatternFieldIdentPat (StructPatternFieldIdentPat const &other)
-     : StructPatternField (other), ident (other.ident)
-   {
-     // guard to prevent null dereference (only required if error state)
-     node_id = other.get_node_id ();
-     if (other.ident_pattern != nullptr)
-       ident_pattern = other.ident_pattern->clone_pattern ();
-   }
- 
-   // Overload assignment operator to clone
-   StructPatternFieldIdentPat &
-   operator= (StructPatternFieldIdentPat const &other)
-   {
-     StructPatternField::operator= (other);
-     ident = other.ident;
-     // outer_attrs = other.outer_attrs;
-     node_id = other.get_node_id ();
- 
-     // guard to prevent null dereference (only required if error state)
-     if (other.ident_pattern != nullptr)
-       ident_pattern = other.ident_pattern->clone_pattern ();
-     else
-       ident_pattern = nullptr;
- 
-     return *this;
-   }
- 
-   // default move semantics
-   StructPatternFieldIdentPat (StructPatternFieldIdentPat &&other) = default;
-   StructPatternFieldIdentPat &operator= (StructPatternFieldIdentPat &&other)
-     = default;
- 
    std::string as_string () const override;
  
    void accept_vis (ASTVisitor &vis) override;
--- 634,639 ----
*************** public:
*** 795,807 ****
    Pattern &get_ident_pattern ()
    {
      rust_assert (ident_pattern != nullptr);
!     return *ident_pattern;
    }
  
    std::unique_ptr<Pattern> &get_ident_pattern_ptr ()
    {
      rust_assert (ident_pattern != nullptr);
!     return ident_pattern;
    }
  
    ItemType get_item_type () const override final { return ItemType::IDENT_PAT; }
--- 651,663 ----
    Pattern &get_ident_pattern ()
    {
      rust_assert (ident_pattern != nullptr);
!     return *ident_pattern.get ();
    }
  
    std::unique_ptr<Pattern> &get_ident_pattern_ptr ()
    {
      rust_assert (ident_pattern != nullptr);
!     return ident_pattern.get ();
    }
  
    ItemType get_item_type () const override final { return ItemType::IDENT_PAT; }
*************** protected:
*** 859,865 ****
  class StructPatternElements
  {
    // bool has_struct_pattern_fields;
!   std::vector<std::unique_ptr<StructPatternField>> fields;
  
    bool has_rest_pattern;
    std::vector<Attribute> struct_pattern_etc_attrs;
--- 715,721 ----
  class StructPatternElements
  {
    // bool has_struct_pattern_fields;
!   Cloneable<std::vector<std::unique_ptr<StructPatternField>>> fields;
  
    bool has_rest_pattern;
    std::vector<Attribute> struct_pattern_etc_attrs;
*************** class StructPatternElements
*** 871,877 ****
  
  public:
    // Returns whether there are any struct pattern fields
!   bool has_struct_pattern_fields () const { return !fields.empty (); }
  
    /* Returns whether the struct pattern elements is entirely empty (no fields,
     * no etc). */
--- 727,733 ----
  
  public:
    // Returns whether there are any struct pattern fields
!   bool has_struct_pattern_fields () const { return !fields.get ().empty (); }
  
    /* Returns whether the struct pattern elements is entirely empty (no fields,
     * no etc). */
*************** public:
*** 897,930 ****
        struct_pattern_etc_attrs ()
    {}
  
-   // Copy constructor with vector clone
-   StructPatternElements (StructPatternElements const &other)
-     : has_rest_pattern (other.has_rest_pattern),
-       struct_pattern_etc_attrs (other.struct_pattern_etc_attrs)
-   {
-     fields.reserve (other.fields.size ());
-     for (const auto &e : other.fields)
-       fields.push_back (e->clone_struct_pattern_field ());
-   }
- 
-   // Overloaded assignment operator with vector clone
-   StructPatternElements &operator= (StructPatternElements const &other)
-   {
-     struct_pattern_etc_attrs = other.struct_pattern_etc_attrs;
-     has_rest_pattern = other.has_rest_pattern;
- 
-     fields.clear ();
-     fields.reserve (other.fields.size ());
-     for (const auto &e : other.fields)
-       fields.push_back (e->clone_struct_pattern_field ());
- 
-     return *this;
-   }
- 
-   // move constructors
-   StructPatternElements (StructPatternElements &&other) = default;
-   StructPatternElements &operator= (StructPatternElements &&other) = default;
- 
    // Creates an empty StructPatternElements
    static StructPatternElements create_empty ()
    {
--- 753,758 ----
*************** public:
*** 937,948 ****
    // TODO: seems kinda dodgy. Think of better way.
    std::vector<std::unique_ptr<StructPatternField>> &get_struct_pattern_fields ()
    {
!     return fields;
    }
    const std::vector<std::unique_ptr<StructPatternField>> &
    get_struct_pattern_fields () const
    {
!     return fields;
    }
  
    std::vector<Attribute> &get_etc_outer_attrs ()
--- 765,776 ----
    // TODO: seems kinda dodgy. Think of better way.
    std::vector<std::unique_ptr<StructPatternField>> &get_struct_pattern_fields ()
    {
!     return fields.get ();
    }
    const std::vector<std::unique_ptr<StructPatternField>> &
    get_struct_pattern_fields () const
    {
!     return fields.get ();
    }
  
    std::vector<Attribute> &get_etc_outer_attrs ()
*************** protected:
*** 1065,1109 ****
  // Class for non-ranged tuple struct pattern patterns
  class TupleStructItemsNoRest : public TupleStructItems
  {
!   std::vector<std::unique_ptr<Pattern>> patterns;
  
  public:
    TupleStructItemsNoRest (std::vector<std::unique_ptr<Pattern>> patterns)
      : patterns (std::move (patterns))
    {}
  
-   // Copy constructor with vector clone
-   TupleStructItemsNoRest (TupleStructItemsNoRest const &other)
-   {
-     patterns.reserve (other.patterns.size ());
-     for (const auto &e : other.patterns)
-       patterns.push_back (e->clone_pattern ());
-   }
- 
-   // Overloaded assignment operator with vector clone
-   TupleStructItemsNoRest &operator= (TupleStructItemsNoRest const &other)
-   {
-     patterns.clear ();
-     patterns.reserve (other.patterns.size ());
-     for (const auto &e : other.patterns)
-       patterns.push_back (e->clone_pattern ());
- 
-     return *this;
-   }
- 
-   // move constructors
-   TupleStructItemsNoRest (TupleStructItemsNoRest &&other) = default;
-   TupleStructItemsNoRest &operator= (TupleStructItemsNoRest &&other) = default;
- 
    std::string as_string () const override;
  
    void accept_vis (ASTVisitor &vis) override;
  
    // TODO: seems kinda dodgy. Think of better way.
!   std::vector<std::unique_ptr<Pattern>> &get_patterns () { return patterns; }
    const std::vector<std::unique_ptr<Pattern>> &get_patterns () const
    {
!     return patterns;
    }
  
    ItemType get_item_type () const override final { return ItemType::NO_REST; }
--- 893,917 ----
  // Class for non-ranged tuple struct pattern patterns
  class TupleStructItemsNoRest : public TupleStructItems
  {
!   Cloneable<std::vector<std::unique_ptr<Pattern>>> patterns;
  
  public:
    TupleStructItemsNoRest (std::vector<std::unique_ptr<Pattern>> patterns)
      : patterns (std::move (patterns))
    {}
  
    std::string as_string () const override;
  
    void accept_vis (ASTVisitor &vis) override;
  
    // TODO: seems kinda dodgy. Think of better way.
!   std::vector<std::unique_ptr<Pattern>> &get_patterns ()
!   {
!     return patterns.get ();
!   }
    const std::vector<std::unique_ptr<Pattern>> &get_patterns () const
    {
!     return patterns.get ();
    }
  
    ItemType get_item_type () const override final { return ItemType::NO_REST; }
*************** protected:
*** 1120,1127 ****
  // Class for ranged tuple struct pattern patterns
  class TupleStructItemsHasRest : public TupleStructItems
  {
!   std::vector<std::unique_ptr<Pattern>> lower_patterns;
!   std::vector<std::unique_ptr<Pattern>> upper_patterns;
  
  public:
    TupleStructItemsHasRest (std::vector<std::unique_ptr<Pattern>> lower_patterns,
--- 928,935 ----
  // Class for ranged tuple struct pattern patterns
  class TupleStructItemsHasRest : public TupleStructItems
  {
!   Cloneable<std::vector<std::unique_ptr<Pattern>>> lower_patterns;
!   Cloneable<std::vector<std::unique_ptr<Pattern>>> upper_patterns;
  
  public:
    TupleStructItemsHasRest (std::vector<std::unique_ptr<Pattern>> lower_patterns,
*************** public:
*** 1130,1168 ****
        upper_patterns (std::move (upper_patterns))
    {}
  
-   // Copy constructor with vector clone
-   TupleStructItemsHasRest (TupleStructItemsHasRest const &other)
-   {
-     lower_patterns.reserve (other.lower_patterns.size ());
-     for (const auto &e : other.lower_patterns)
-       lower_patterns.push_back (e->clone_pattern ());
- 
-     upper_patterns.reserve (other.upper_patterns.size ());
-     for (const auto &e : other.upper_patterns)
-       upper_patterns.push_back (e->clone_pattern ());
-   }
- 
-   // Overloaded assignment operator to clone
-   TupleStructItemsHasRest &operator= (TupleStructItemsHasRest const &other)
-   {
-     lower_patterns.clear ();
-     lower_patterns.reserve (other.lower_patterns.size ());
-     for (const auto &e : other.lower_patterns)
-       lower_patterns.push_back (e->clone_pattern ());
- 
-     upper_patterns.clear ();
-     upper_patterns.reserve (other.upper_patterns.size ());
-     for (const auto &e : other.upper_patterns)
-       upper_patterns.push_back (e->clone_pattern ());
- 
-     return *this;
-   }
- 
-   // move constructors
-   TupleStructItemsHasRest (TupleStructItemsHasRest &&other) = default;
-   TupleStructItemsHasRest &operator= (TupleStructItemsHasRest &&other)
-     = default;
- 
    std::string as_string () const override;
  
    void accept_vis (ASTVisitor &vis) override;
--- 938,943 ----
*************** public:
*** 1170,1190 ****
    // TODO: seems kinda dodgy. Think of better way.
    std::vector<std::unique_ptr<Pattern>> &get_lower_patterns ()
    {
!     return lower_patterns;
    }
    const std::vector<std::unique_ptr<Pattern>> &get_lower_patterns () const
    {
!     return lower_patterns;
    }
  
    // TODO: seems kinda dodgy. Think of better way.
    std::vector<std::unique_ptr<Pattern>> &get_upper_patterns ()
    {
!     return upper_patterns;
    }
    const std::vector<std::unique_ptr<Pattern>> &get_upper_patterns () const
    {
!     return upper_patterns;
    }
  
    ItemType get_item_type () const override final { return ItemType::HAS_REST; }
--- 945,965 ----
    // TODO: seems kinda dodgy. Think of better way.
    std::vector<std::unique_ptr<Pattern>> &get_lower_patterns ()
    {
!     return lower_patterns.get ();
    }
    const std::vector<std::unique_ptr<Pattern>> &get_lower_patterns () const
    {
!     return lower_patterns.get ();
    }
  
    // TODO: seems kinda dodgy. Think of better way.
    std::vector<std::unique_ptr<Pattern>> &get_upper_patterns ()
    {
!     return upper_patterns.get ();
    }
    const std::vector<std::unique_ptr<Pattern>> &get_upper_patterns () const
    {
!     return upper_patterns.get ();
    }
  
    ItemType get_item_type () const override final { return ItemType::HAS_REST; }
*************** protected:
*** 1202,1208 ****
  class TupleStructPattern : public Pattern
  {
    PathInExpression path;
!   std::unique_ptr<TupleStructItems> items;
    NodeId node_id;
  
    /* TOOD: should this store location data? current accessor uses path location
--- 977,983 ----
  class TupleStructPattern : public Pattern
  {
    PathInExpression path;
!   Cloneable<std::unique_ptr<TupleStructItems>> items;
    NodeId node_id;
  
    /* TOOD: should this store location data? current accessor uses path location
*************** public:
*** 1219,1252 ****
      rust_assert (this->items != nullptr);
    }
  
-   // Copy constructor required to clone
-   TupleStructPattern (TupleStructPattern const &other) : path (other.path)
-   {
-     // guard to protect from null dereference
-     rust_assert (other.items != nullptr);
- 
-     node_id = other.node_id;
-     items = other.items->clone_tuple_struct_items ();
-   }
- 
-   // Operator overload assignment operator to clone
-   TupleStructPattern &operator= (TupleStructPattern const &other)
-   {
-     path = other.path;
-     node_id = other.node_id;
- 
-     // guard to protect from null dereference
-     rust_assert (other.items != nullptr);
- 
-     items = other.items->clone_tuple_struct_items ();
- 
-     return *this;
-   }
- 
-   // move constructors
-   TupleStructPattern (TupleStructPattern &&other) = default;
-   TupleStructPattern &operator= (TupleStructPattern &&other) = default;
- 
    location_t get_locus () const override { return path.get_locus (); }
  
    void accept_vis (ASTVisitor &vis) override;
--- 994,999 ----
*************** public:
*** 1254,1260 ****
    TupleStructItems &get_items ()
    {
      rust_assert (items != nullptr);
!     return *items;
    }
  
    PathInExpression &get_path () { return path; }
--- 1001,1007 ----
    TupleStructItems &get_items ()
    {
      rust_assert (items != nullptr);
!     return *items.get ();
    }
  
    PathInExpression &get_path () { return path; }
*************** protected:
*** 1294,1339 ****
  // Class representing TuplePattern patterns which contains no rest pattern
  class TuplePatternItemsNoRest : public TuplePatternItems
  {
!   std::vector<std::unique_ptr<Pattern>> patterns;
  
  public:
    TuplePatternItemsNoRest (std::vector<std::unique_ptr<Pattern>> patterns)
      : patterns (std::move (patterns))
    {}
  
-   // Copy constructor with vector clone
-   TuplePatternItemsNoRest (TuplePatternItemsNoRest const &other)
-   {
-     patterns.reserve (other.patterns.size ());
-     for (const auto &e : other.patterns)
-       patterns.push_back (e->clone_pattern ());
-   }
- 
-   // Overloaded assignment operator to vector clone
-   TuplePatternItemsNoRest &operator= (TuplePatternItemsNoRest const &other)
-   {
-     patterns.clear ();
-     patterns.reserve (other.patterns.size ());
-     for (const auto &e : other.patterns)
-       patterns.push_back (e->clone_pattern ());
- 
-     return *this;
-   }
- 
-   // move constructors
-   TuplePatternItemsNoRest (TuplePatternItemsNoRest &&other) = default;
-   TuplePatternItemsNoRest &operator= (TuplePatternItemsNoRest &&other)
-     = default;
- 
    std::string as_string () const override;
  
    void accept_vis (ASTVisitor &vis) override;
  
    // TODO: seems kinda dodgy. Think of better way.
!   std::vector<std::unique_ptr<Pattern>> &get_patterns () { return patterns; }
    const std::vector<std::unique_ptr<Pattern>> &get_patterns () const
    {
!     return patterns;
    }
  
    ItemType get_item_type () const override { return ItemType::NO_REST; }
--- 1041,1065 ----
  // Class representing TuplePattern patterns which contains no rest pattern
  class TuplePatternItemsNoRest : public TuplePatternItems
  {
!   Cloneable<std::vector<std::unique_ptr<Pattern>>> patterns;
  
  public:
    TuplePatternItemsNoRest (std::vector<std::unique_ptr<Pattern>> patterns)
      : patterns (std::move (patterns))
    {}
  
    std::string as_string () const override;
  
    void accept_vis (ASTVisitor &vis) override;
  
    // TODO: seems kinda dodgy. Think of better way.
!   std::vector<std::unique_ptr<Pattern>> &get_patterns ()
!   {
!     return patterns.get ();
!   }
    const std::vector<std::unique_ptr<Pattern>> &get_patterns () const
    {
!     return patterns.get ();
    }
  
    ItemType get_item_type () const override { return ItemType::NO_REST; }
*************** protected:
*** 1350,1357 ****
  // Class representing TuplePattern patterns which contains a rest pattern
  class TuplePatternItemsHasRest : public TuplePatternItems
  {
!   std::vector<std::unique_ptr<Pattern>> lower_patterns;
!   std::vector<std::unique_ptr<Pattern>> upper_patterns;
  
  public:
    TuplePatternItemsHasRest (
--- 1076,1083 ----
  // Class representing TuplePattern patterns which contains a rest pattern
  class TuplePatternItemsHasRest : public TuplePatternItems
  {
!   Cloneable<std::vector<std::unique_ptr<Pattern>>> lower_patterns;
!   Cloneable<std::vector<std::unique_ptr<Pattern>>> upper_patterns;
  
  public:
    TuplePatternItemsHasRest (
*************** public:
*** 1361,1399 ****
        upper_patterns (std::move (upper_patterns))
    {}
  
-   // Copy constructor with vector clone
-   TuplePatternItemsHasRest (TuplePatternItemsHasRest const &other)
-   {
-     lower_patterns.reserve (other.lower_patterns.size ());
-     for (const auto &e : other.lower_patterns)
-       lower_patterns.push_back (e->clone_pattern ());
- 
-     upper_patterns.reserve (other.upper_patterns.size ());
-     for (const auto &e : other.upper_patterns)
-       upper_patterns.push_back (e->clone_pattern ());
-   }
- 
-   // Overloaded assignment operator to clone
-   TuplePatternItemsHasRest &operator= (TuplePatternItemsHasRest const &other)
-   {
-     lower_patterns.clear ();
-     lower_patterns.reserve (other.lower_patterns.size ());
-     for (const auto &e : other.lower_patterns)
-       lower_patterns.push_back (e->clone_pattern ());
- 
-     upper_patterns.clear ();
-     upper_patterns.reserve (other.upper_patterns.size ());
-     for (const auto &e : other.upper_patterns)
-       upper_patterns.push_back (e->clone_pattern ());
- 
-     return *this;
-   }
- 
-   // move constructors
-   TuplePatternItemsHasRest (TuplePatternItemsHasRest &&other) = default;
-   TuplePatternItemsHasRest &operator= (TuplePatternItemsHasRest &&other)
-     = default;
- 
    std::string as_string () const override;
  
    void accept_vis (ASTVisitor &vis) override;
--- 1087,1092 ----
*************** public:
*** 1401,1421 ****
    // TODO: seems kinda dodgy. Think of better way.
    std::vector<std::unique_ptr<Pattern>> &get_lower_patterns ()
    {
!     return lower_patterns;
    }
    const std::vector<std::unique_ptr<Pattern>> &get_lower_patterns () const
    {
!     return lower_patterns;
    }
  
    // TODO: seems kinda dodgy. Think of better way.
    std::vector<std::unique_ptr<Pattern>> &get_upper_patterns ()
    {
!     return upper_patterns;
    }
    const std::vector<std::unique_ptr<Pattern>> &get_upper_patterns () const
    {
!     return upper_patterns;
    }
  
    ItemType get_item_type () const override { return ItemType::HAS_REST; }
--- 1094,1114 ----
    // TODO: seems kinda dodgy. Think of better way.
    std::vector<std::unique_ptr<Pattern>> &get_lower_patterns ()
    {
!     return lower_patterns.get ();
    }
    const std::vector<std::unique_ptr<Pattern>> &get_lower_patterns () const
    {
!     return lower_patterns.get ();
    }
  
    // TODO: seems kinda dodgy. Think of better way.
    std::vector<std::unique_ptr<Pattern>> &get_upper_patterns ()
    {
!     return upper_patterns.get ();
    }
    const std::vector<std::unique_ptr<Pattern>> &get_upper_patterns () const
    {
!     return upper_patterns.get ();
    }
  
    ItemType get_item_type () const override { return ItemType::HAS_REST; }
*************** protected:
*** 1432,1438 ****
  // AST node representing a tuple pattern
  class TuplePattern : public Pattern
  {
!   std::unique_ptr<TuplePatternItems> items;
    location_t locus;
    NodeId node_id;
  
--- 1125,1131 ----
  // AST node representing a tuple pattern
  class TuplePattern : public Pattern
  {
!   Cloneable<std::unique_ptr<TuplePatternItems>> items;
    location_t locus;
    NodeId node_id;
  
*************** public:
*** 1446,1474 ****
      rust_assert (this->items != nullptr);
    }
  
-   // Copy constructor requires clone
-   TuplePattern (TuplePattern const &other) : locus (other.locus)
-   {
-     // guard to prevent null dereference
-     rust_assert (other.items != nullptr);
- 
-     node_id = other.node_id;
-     items = other.items->clone_tuple_pattern_items ();
-   }
- 
-   // Overload assignment operator to clone
-   TuplePattern &operator= (TuplePattern const &other)
-   {
-     locus = other.locus;
-     node_id = other.node_id;
- 
-     // guard to prevent null dereference
-     rust_assert (other.items != nullptr);
- 
-     items = other.items->clone_tuple_pattern_items ();
-     return *this;
-   }
- 
    location_t get_locus () const override final { return locus; }
  
    void accept_vis (ASTVisitor &vis) override;
--- 1139,1144 ----
*************** public:
*** 1477,1483 ****
    TuplePatternItems &get_items ()
    {
      rust_assert (items != nullptr);
!     return *items;
    }
  
    NodeId get_node_id () const override { return node_id; }
--- 1147,1153 ----
    TuplePatternItems &get_items ()
    {
      rust_assert (items != nullptr);
!     return *items.get ();
    }
  
    NodeId get_node_id () const override { return node_id; }
*************** protected:
*** 1496,1509 ****
  // AST node representing a pattern in parentheses, used to control precedence
  class GroupedPattern : public Pattern
  {
!   std::unique_ptr<Pattern> pattern_in_parens;
    location_t locus;
    NodeId node_id;
  
  public:
    std::string as_string () const override
    {
!     return "(" + pattern_in_parens->as_string () + ")";
    }
  
    GroupedPattern (std::unique_ptr<Pattern> pattern_in_parens, location_t locus)
--- 1166,1179 ----
  // AST node representing a pattern in parentheses, used to control precedence
  class GroupedPattern : public Pattern
  {
!   Cloneable<std::unique_ptr<Pattern>> pattern_in_parens;
    location_t locus;
    NodeId node_id;
  
  public:
    std::string as_string () const override
    {
!     return "(" + pattern_in_parens.get ()->as_string () + ")";
    }
  
    GroupedPattern (std::unique_ptr<Pattern> pattern_in_parens, location_t locus)
*************** public:
*** 1511,1536 ****
        node_id (Analysis::Mappings::get ().get_next_node_id ())
    {}
  
-   // Copy constructor uses clone
-   GroupedPattern (GroupedPattern const &other)
-     : pattern_in_parens (other.pattern_in_parens->clone_pattern ()),
-       locus (other.locus), node_id (other.node_id)
-   {}
- 
-   // Overload assignment operator to clone
-   GroupedPattern &operator= (GroupedPattern const &other)
-   {
-     pattern_in_parens = other.pattern_in_parens->clone_pattern ();
-     locus = other.locus;
-     node_id = other.node_id;
- 
-     return *this;
-   }
- 
-   // default move semantics
-   GroupedPattern (GroupedPattern &&other) = default;
-   GroupedPattern &operator= (GroupedPattern &&other) = default;
- 
    location_t get_locus () const override final { return locus; }
  
    void accept_vis (ASTVisitor &vis) override;
--- 1181,1186 ----
*************** public:
*** 1539,1551 ****
    Pattern &get_pattern_in_parens ()
    {
      rust_assert (pattern_in_parens != nullptr);
!     return *pattern_in_parens;
    }
  
    std::unique_ptr<Pattern> &get_pattern_in_parens_ptr ()
    {
      rust_assert (pattern_in_parens != nullptr);
!     return pattern_in_parens;
    }
  
    NodeId get_node_id () const override { return node_id; }
--- 1189,1201 ----
    Pattern &get_pattern_in_parens ()
    {
      rust_assert (pattern_in_parens != nullptr);
!     return *pattern_in_parens.get ();
    }
  
    std::unique_ptr<Pattern> &get_pattern_in_parens_ptr ()
    {
      rust_assert (pattern_in_parens != nullptr);
!     return pattern_in_parens.get ();
    }
  
    NodeId get_node_id () const override { return node_id; }
*************** protected:
*** 1579,1624 ****
  // Class representing the patterns in a SlicePattern without `..`
  class SlicePatternItemsNoRest : public SlicePatternItems
  {
!   std::vector<std::unique_ptr<Pattern>> patterns;
  
  public:
    SlicePatternItemsNoRest (std::vector<std::unique_ptr<Pattern>> patterns)
      : patterns (std::move (patterns))
    {}
  
-   // Copy constructor with vector clone
-   SlicePatternItemsNoRest (SlicePatternItemsNoRest const &other)
-   {
-     patterns.reserve (other.patterns.size ());
-     for (const auto &e : other.patterns)
-       patterns.push_back (e->clone_pattern ());
-   }
- 
-   // Overloaded assignment operator to vector clone
-   SlicePatternItemsNoRest &operator= (SlicePatternItemsNoRest const &other)
-   {
-     patterns.clear ();
-     patterns.reserve (other.patterns.size ());
-     for (const auto &e : other.patterns)
-       patterns.push_back (e->clone_pattern ());
- 
-     return *this;
-   }
- 
-   // move constructors
-   SlicePatternItemsNoRest (SlicePatternItemsNoRest &&other) = default;
-   SlicePatternItemsNoRest &operator= (SlicePatternItemsNoRest &&other)
-     = default;
- 
    std::string as_string () const override;
  
    void accept_vis (ASTVisitor &vis) override;
  
    // TODO: seems kinda dodgy. Think of better way.
!   std::vector<std::unique_ptr<Pattern>> &get_patterns () { return patterns; }
    const std::vector<std::unique_ptr<Pattern>> &get_patterns () const
    {
!     return patterns;
    }
  
    ItemType get_item_type () const override { return ItemType::NO_REST; }
--- 1229,1253 ----
  // Class representing the patterns in a SlicePattern without `..`
  class SlicePatternItemsNoRest : public SlicePatternItems
  {
!   Cloneable<std::vector<std::unique_ptr<Pattern>>> patterns;
  
  public:
    SlicePatternItemsNoRest (std::vector<std::unique_ptr<Pattern>> patterns)
      : patterns (std::move (patterns))
    {}
  
    std::string as_string () const override;
  
    void accept_vis (ASTVisitor &vis) override;
  
    // TODO: seems kinda dodgy. Think of better way.
!   std::vector<std::unique_ptr<Pattern>> &get_patterns ()
!   {
!     return patterns.get ();
!   }
    const std::vector<std::unique_ptr<Pattern>> &get_patterns () const
    {
!     return patterns.get ();
    }
  
    ItemType get_item_type () const override { return ItemType::NO_REST; }
*************** protected:
*** 1635,1642 ****
  // Class representing the patterns in a SlicePattern that contains a `..`
  class SlicePatternItemsHasRest : public SlicePatternItems
  {
!   std::vector<std::unique_ptr<Pattern>> lower_patterns;
!   std::vector<std::unique_ptr<Pattern>> upper_patterns;
  
  public:
    SlicePatternItemsHasRest (
--- 1264,1271 ----
  // Class representing the patterns in a SlicePattern that contains a `..`
  class SlicePatternItemsHasRest : public SlicePatternItems
  {
!   Cloneable<std::vector<std::unique_ptr<Pattern>>> lower_patterns;
!   Cloneable<std::vector<std::unique_ptr<Pattern>>> upper_patterns;
  
  public:
    SlicePatternItemsHasRest (
*************** public:
*** 1646,1684 ****
        upper_patterns (std::move (upper_patterns))
    {}
  
-   // Copy constructor with vector clone
-   SlicePatternItemsHasRest (SlicePatternItemsHasRest const &other)
-   {
-     lower_patterns.reserve (other.lower_patterns.size ());
-     for (const auto &e : other.lower_patterns)
-       lower_patterns.push_back (e->clone_pattern ());
- 
-     upper_patterns.reserve (other.upper_patterns.size ());
-     for (const auto &e : other.upper_patterns)
-       upper_patterns.push_back (e->clone_pattern ());
-   }
- 
-   // Overloaded assignment operator to clone
-   SlicePatternItemsHasRest &operator= (SlicePatternItemsHasRest const &other)
-   {
-     lower_patterns.clear ();
-     lower_patterns.reserve (other.lower_patterns.size ());
-     for (const auto &e : other.lower_patterns)
-       lower_patterns.push_back (e->clone_pattern ());
- 
-     upper_patterns.clear ();
-     upper_patterns.reserve (other.upper_patterns.size ());
-     for (const auto &e : other.upper_patterns)
-       upper_patterns.push_back (e->clone_pattern ());
- 
-     return *this;
-   }
- 
-   // move constructors
-   SlicePatternItemsHasRest (SlicePatternItemsHasRest &&other) = default;
-   SlicePatternItemsHasRest &operator= (SlicePatternItemsHasRest &&other)
-     = default;
- 
    std::string as_string () const override;
  
    void accept_vis (ASTVisitor &vis) override;
--- 1275,1280 ----
*************** public:
*** 1686,1706 ****
    // TODO: seems kinda dodgy. Think of better way.
    std::vector<std::unique_ptr<Pattern>> &get_lower_patterns ()
    {
!     return lower_patterns;
    }
    const std::vector<std::unique_ptr<Pattern>> &get_lower_patterns () const
    {
!     return lower_patterns;
    }
  
    // TODO: seems kinda dodgy. Think of better way.
    std::vector<std::unique_ptr<Pattern>> &get_upper_patterns ()
    {
!     return upper_patterns;
    }
    const std::vector<std::unique_ptr<Pattern>> &get_upper_patterns () const
    {
!     return upper_patterns;
    }
  
    ItemType get_item_type () const override { return ItemType::HAS_REST; }
--- 1282,1302 ----
    // TODO: seems kinda dodgy. Think of better way.
    std::vector<std::unique_ptr<Pattern>> &get_lower_patterns ()
    {
!     return lower_patterns.get ();
    }
    const std::vector<std::unique_ptr<Pattern>> &get_lower_patterns () const
    {
!     return lower_patterns.get ();
    }
  
    // TODO: seems kinda dodgy. Think of better way.
    std::vector<std::unique_ptr<Pattern>> &get_upper_patterns ()
    {
!     return upper_patterns.get ();
    }
    const std::vector<std::unique_ptr<Pattern>> &get_upper_patterns () const
    {
!     return upper_patterns.get ();
    }
  
    ItemType get_item_type () const override { return ItemType::HAS_REST; }
*************** protected:
*** 1717,1723 ****
  // AST node representing patterns that can match slices and arrays
  class SlicePattern : public Pattern
  {
!   std::unique_ptr<SlicePatternItems> items;
    location_t locus;
    NodeId node_id;
  
--- 1313,1319 ----
  // AST node representing patterns that can match slices and arrays
  class SlicePattern : public Pattern
  {
!   Cloneable<std::unique_ptr<SlicePatternItems>> items;
    location_t locus;
    NodeId node_id;
  
*************** public:
*** 1729,1761 ****
        node_id (Analysis::Mappings::get ().get_next_node_id ())
    {}
  
-   // Copy constructor requires clone
-   SlicePattern (SlicePattern const &other) : locus (other.locus)
-   {
-     // guard to prevent null dereference
-     rust_assert (other.items != nullptr);
- 
-     node_id = other.node_id;
-     items = other.items->clone_slice_pattern_items ();
-   }
- 
-   // Overloaded assignment operator to clone
-   SlicePattern &operator= (SlicePattern const &other)
-   {
-     locus = other.locus;
-     node_id = other.node_id;
- 
-     // guard to prevent null dereference
-     rust_assert (other.items != nullptr);
- 
-     items = other.items->clone_slice_pattern_items ();
-     return *this;
-   }
- 
-   // move constructors
-   SlicePattern (SlicePattern &&other) = default;
-   SlicePattern &operator= (SlicePattern &&other) = default;
- 
    location_t get_locus () const override final { return locus; }
  
    void accept_vis (ASTVisitor &vis) override;
--- 1325,1330 ----
*************** public:
*** 1764,1770 ****
    SlicePatternItems &get_items ()
    {
      rust_assert (items != nullptr);
!     return *items;
    }
  
    NodeId get_node_id () const override { return node_id; }
--- 1333,1339 ----
    SlicePatternItems &get_items ()
    {
      rust_assert (items != nullptr);
!     return *items.get ();
    }
  
    NodeId get_node_id () const override { return node_id; }
*************** protected:
*** 1784,1790 ****
  // joins together what are technically 'PatternNoTopAlt's
  class AltPattern : public Pattern
  {
!   std::vector<std::unique_ptr<Pattern>> alts;
    location_t locus;
    NodeId node_id;
  
--- 1353,1359 ----
  // joins together what are technically 'PatternNoTopAlt's
  class AltPattern : public Pattern
  {
!   Cloneable<std::vector<std::unique_ptr<Pattern>>> alts;
    location_t locus;
    NodeId node_id;
  
*************** public:
*** 1796,1837 ****
        node_id (Analysis::Mappings::get ().get_next_node_id ())
    {}
  
-   // Copy constructor with vector clone
-   AltPattern (AltPattern const &other) : locus (other.locus)
-   {
-     node_id = other.node_id;
-     alts.reserve (other.alts.size ());
-     for (const auto &e : other.alts)
-       alts.push_back (e->clone_pattern ());
-   }
- 
-   // Overloaded assignment operator to vector clone
-   AltPattern &operator= (AltPattern const &other)
-   {
-     locus = other.locus;
-     node_id = other.node_id;
- 
-     alts.clear ();
-     alts.reserve (other.alts.size ());
-     for (const auto &e : other.alts)
-       alts.push_back (e->clone_pattern ());
- 
-     return *this;
-   }
- 
-   // move constructors
-   AltPattern (AltPattern &&other) = default;
-   AltPattern &operator= (AltPattern &&other) = default;
- 
    location_t get_locus () const override final { return locus; }
  
    void accept_vis (ASTVisitor &vis) override;
  
    // TODO: seems kinda dodgy. Think of better way.
!   std::vector<std::unique_ptr<Pattern>> &get_alts () { return alts; }
    const std::vector<std::unique_ptr<Pattern>> &get_alts () const
    {
!     return alts;
    }
  
    NodeId get_node_id () const override { return node_id; }
--- 1365,1379 ----
        node_id (Analysis::Mappings::get ().get_next_node_id ())
    {}
  
    location_t get_locus () const override final { return locus; }
  
    void accept_vis (ASTVisitor &vis) override;
  
    // TODO: seems kinda dodgy. Think of better way.
!   std::vector<std::unique_ptr<Pattern>> &get_alts () { return alts.get (); }
    const std::vector<std::unique_ptr<Pattern>> &get_alts () const
    {
!     return alts.get ();
    }
  
    NodeId get_node_id () const override { return node_id; }
*************** class QualifiedPathInExpression;
*** 1857,1862 ****
--- 1399,1465 ----
  // Replaced with forward decl - defined in rust-macro.h
  class MacroInvocation;
  } // namespace AST
+ 
+ template <> struct CloneableDelegate<std::unique_ptr<AST::RangePatternBound>>
+ {
+   static std::unique_ptr<AST::RangePatternBound>
+   clone (const std::unique_ptr<AST::RangePatternBound> &other)
+   {
+     if (other == nullptr)
+       return nullptr;
+     else
+       return other->clone_range_pattern_bound ();
+   }
+ };
+ 
+ template <> struct CloneableDelegate<std::unique_ptr<AST::TupleStructItems>>
+ {
+   static std::unique_ptr<AST::TupleStructItems>
+   clone (const std::unique_ptr<AST::TupleStructItems> &other)
+   {
+     if (other == nullptr)
+       return nullptr;
+     else
+       return other->clone_tuple_struct_items ();
+   }
+ };
+ 
+ template <> struct CloneableDelegate<std::unique_ptr<AST::TuplePatternItems>>
+ {
+   static std::unique_ptr<AST::TuplePatternItems>
+   clone (const std::unique_ptr<AST::TuplePatternItems> &other)
+   {
+     if (other == nullptr)
+       return nullptr;
+     else
+       return other->clone_tuple_pattern_items ();
+   }
+ };
+ 
+ template <> struct CloneableDelegate<std::unique_ptr<AST::SlicePatternItems>>
+ {
+   static std::unique_ptr<AST::SlicePatternItems>
+   clone (const std::unique_ptr<AST::SlicePatternItems> &other)
+   {
+     if (other == nullptr)
+       return nullptr;
+     else
+       return other->clone_slice_pattern_items ();
+   }
+ };
+ 
+ template <> struct CloneableDelegate<std::unique_ptr<AST::StructPatternField>>
+ {
+   static std::unique_ptr<AST::StructPatternField>
+   clone (const std::unique_ptr<AST::StructPatternField> &other)
+   {
+     if (other == nullptr)
+       return nullptr;
+     else
+       return other->clone_struct_pattern_field ();
+   }
+ };
+ 
  } // namespace Rust
  
  #endif
diff -Nrcpad gcc-16-20260315/gcc/rust/backend/rust-compile-intrinsic.cc gcc-16-20260322/gcc/rust/backend/rust-compile-intrinsic.cc
*** gcc-16-20260315/gcc/rust/backend/rust-compile-intrinsic.cc	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/backend/rust-compile-intrinsic.cc	Sun Mar 22 22:32:07 2026
***************
*** 16,251 ****
  
  #include "rust-compile-intrinsic.h"
  #include "rust-compile-context.h"
- #include "rust-compile-type.h"
- #include "rust-compile-fnparam.h"
  #include "rust-builtins.h"
  #include "rust-diagnostics.h"
- #include "rust-location.h"
- #include "rust-constexpr.h"
- #include "rust-session-manager.h"
- #include "rust-tree.h"
  #include "tree-core.h"
! #include "rust-gcc.h"
! #include "fold-const.h"
! #include "langhooks.h"
! #include "rust-constexpr.h"
! 
! // declaration taken from "stringpool.h"
! // the get_identifier macro causes compilation issues
! extern tree get_identifier (const char *);
  
  namespace Rust {
  namespace Compile {
  
! static bool
! is_basic_integer_type (TyTy::BaseType *type)
! {
!   switch (type->get_kind ())
!     {
!     case TyTy::INT:
!     case TyTy::UINT:
!     case TyTy::USIZE:
!     case TyTy::ISIZE:
!       return true;
!     default:
!       return false;
!       break;
!     }
! }
! 
! static bool
! check_for_basic_integer_type (const std::string &intrinsic_str,
! 			      location_t locus, TyTy::BaseType *type)
! {
!   auto is_basic_integer = is_basic_integer_type (type);
!   if (!is_basic_integer)
!     {
!       rust_error_at (
! 	locus,
! 	"%s intrinsics can only be used with basic integer types (got %qs)",
! 	intrinsic_str.c_str (), type->get_name ().c_str ());
!     }
! 
!   return is_basic_integer;
! }
! 
! static tree offset_handler (Context *ctx, TyTy::FnType *fntype);
! static tree sizeof_handler (Context *ctx, TyTy::FnType *fntype);
! static tree transmute_handler (Context *ctx, TyTy::FnType *fntype);
! static tree rotate_handler (Context *ctx, TyTy::FnType *fntype, tree_code op);
! static tree wrapping_op_handler_inner (Context *ctx, TyTy::FnType *fntype,
! 				       tree_code op);
! static tree op_with_overflow_inner (Context *ctx, TyTy::FnType *fntype,
! 				    tree_code op);
! static tree uninit_handler (Context *ctx, TyTy::FnType *fntype);
! static tree move_val_init_handler (Context *ctx, TyTy::FnType *fntype);
! static tree assume_handler (Context *ctx, TyTy::FnType *fntype);
! static tree discriminant_value_handler (Context *ctx, TyTy::FnType *fntype);
! static tree variant_count_handler (Context *ctx, TyTy::FnType *fntype);
! 
! enum class Prefetch
! {
!   Read,
!   Write
! };
! 
! static tree prefetch_data_handler (Context *ctx, TyTy::FnType *fntype,
! 				   Prefetch kind);
! 
! static inline tree
! rotate_left_handler (Context *ctx, TyTy::FnType *fntype)
! {
!   return rotate_handler (ctx, fntype, LROTATE_EXPR);
! }
! static inline tree
! rotate_right_handler (Context *ctx, TyTy::FnType *fntype)
! {
!   return rotate_handler (ctx, fntype, RROTATE_EXPR);
! }
! 
! const static std::function<tree (Context *, TyTy::FnType *)>
! wrapping_op_handler (tree_code op)
! {
!   return [op] (Context *ctx, TyTy::FnType *fntype) {
!     return wrapping_op_handler_inner (ctx, fntype, op);
!   };
! }
! 
! const static std::function<tree (Context *, TyTy::FnType *)>
! op_with_overflow (tree_code op)
! {
!   return [op] (Context *ctx, TyTy::FnType *fntype) {
!     return op_with_overflow_inner (ctx, fntype, op);
!   };
! }
! 
! static inline tree
! prefetch_read_data (Context *ctx, TyTy::FnType *fntype)
! {
!   return prefetch_data_handler (ctx, fntype, Prefetch::Read);
! }
! static inline tree
! prefetch_write_data (Context *ctx, TyTy::FnType *fntype)
! {
!   return prefetch_data_handler (ctx, fntype, Prefetch::Write);
! }
! 
! static tree atomic_store_handler_inner (Context *ctx, TyTy::FnType *fntype,
! 					int ordering);
! static tree atomic_load_handler_inner (Context *ctx, TyTy::FnType *fntype,
! 				       int ordering);
! 
! static inline std::function<tree (Context *, TyTy::FnType *)>
! atomic_store_handler (int ordering)
! {
!   return [ordering] (Context *ctx, TyTy::FnType *fntype) {
!     return atomic_store_handler_inner (ctx, fntype, ordering);
!   };
! }
! 
! static inline std::function<tree (Context *, TyTy::FnType *)>
! atomic_load_handler (int ordering)
! {
!   return [ordering] (Context *ctx, TyTy::FnType *fntype) {
!     return atomic_load_handler_inner (ctx, fntype, ordering);
!   };
! }
! 
! static inline tree unchecked_op_inner (Context *ctx, TyTy::FnType *fntype,
! 				       tree_code op);
! 
! const static std::function<tree (Context *, TyTy::FnType *)>
! unchecked_op_handler (tree_code op)
! {
!   return [op] (Context *ctx, TyTy::FnType *fntype) {
!     return unchecked_op_inner (ctx, fntype, op);
!   };
! }
! 
! static inline tree copy_handler_inner (Context *ctx, TyTy::FnType *fntype,
! 				       bool overlaps);
! 
! const static std::function<tree (Context *, TyTy::FnType *)>
! copy_handler (bool overlaps)
! {
!   return [overlaps] (Context *ctx, TyTy::FnType *fntype) {
!     return copy_handler_inner (ctx, fntype, overlaps);
!   };
! }
! 
! static inline tree expect_handler_inner (Context *ctx, TyTy::FnType *fntype,
! 					 bool likely);
! 
! const static std::function<tree (Context *, TyTy::FnType *)>
! expect_handler (bool likely)
! {
!   return [likely] (Context *ctx, TyTy::FnType *fntype) {
!     return expect_handler_inner (ctx, fntype, likely);
!   };
! }
! 
! static tree try_handler_inner (Context *ctx, TyTy::FnType *fntype,
! 			       bool is_new_api);
! 
! const static std::function<tree (Context *, TyTy::FnType *)>
! try_handler (bool is_new_api)
! {
!   return [is_new_api] (Context *ctx, TyTy::FnType *fntype) {
!     return try_handler_inner (ctx, fntype, is_new_api);
!   };
! }
! 
! inline tree
! sorry_handler (Context *ctx, TyTy::FnType *fntype)
! {
!   rust_sorry_at (fntype->get_locus (), "intrinsic %qs is not yet implemented",
! 		 fntype->get_identifier ().c_str ());
! 
!   return error_mark_node;
! }
  
! static const std::map<std::string,
! 		      std::function<tree (Context *, TyTy::FnType *)>>
!   generic_intrinsics
!   = {{"offset", offset_handler},
!      {"size_of", sizeof_handler},
!      {"transmute", transmute_handler},
!      {"rotate_left", rotate_left_handler},
!      {"rotate_right", rotate_right_handler},
!      {"wrapping_add", wrapping_op_handler (PLUS_EXPR)},
!      {"wrapping_sub", wrapping_op_handler (MINUS_EXPR)},
!      {"wrapping_mul", wrapping_op_handler (MULT_EXPR)},
!      {"add_with_overflow", op_with_overflow (PLUS_EXPR)},
!      {"sub_with_overflow", op_with_overflow (MINUS_EXPR)},
!      {"mul_with_overflow", op_with_overflow (MULT_EXPR)},
!      {"copy", copy_handler (true)},
!      {"copy_nonoverlapping", copy_handler (false)},
!      {"prefetch_read_data", prefetch_read_data},
!      {"prefetch_write_data", prefetch_write_data},
!      {"atomic_store_seqcst", atomic_store_handler (__ATOMIC_SEQ_CST)},
!      {"atomic_store_release", atomic_store_handler (__ATOMIC_RELEASE)},
!      {"atomic_store_relaxed", atomic_store_handler (__ATOMIC_RELAXED)},
!      {"atomic_store_unordered", atomic_store_handler (__ATOMIC_RELAXED)},
!      {"atomic_load_seqcst", atomic_load_handler (__ATOMIC_SEQ_CST)},
!      {"atomic_load_acquire", atomic_load_handler (__ATOMIC_ACQUIRE)},
!      {"atomic_load_relaxed", atomic_load_handler (__ATOMIC_RELAXED)},
!      {"atomic_load_unordered", atomic_load_handler (__ATOMIC_RELAXED)},
!      {"unchecked_add", unchecked_op_handler (PLUS_EXPR)},
!      {"unchecked_sub", unchecked_op_handler (MINUS_EXPR)},
!      {"unchecked_mul", unchecked_op_handler (MULT_EXPR)},
!      {"unchecked_div", unchecked_op_handler (TRUNC_DIV_EXPR)},
!      {"unchecked_rem", unchecked_op_handler (TRUNC_MOD_EXPR)},
!      {"unchecked_shl", unchecked_op_handler (LSHIFT_EXPR)},
!      {"unchecked_shr", unchecked_op_handler (RSHIFT_EXPR)},
!      {"uninit", uninit_handler},
!      {"move_val_init", move_val_init_handler},
!      {"likely", expect_handler (true)},
!      {"unlikely", expect_handler (false)},
!      {"assume", assume_handler},
!      {"try", try_handler (false)},
!      {"catch_unwind", try_handler (true)},
!      {"discriminant_value", discriminant_value_handler},
!      {"variant_count", variant_count_handler}};
  
  Intrinsics::Intrinsics (Context *ctx) : ctx (ctx) {}
  
--- 16,74 ----
  
  #include "rust-compile-intrinsic.h"
  #include "rust-compile-context.h"
  #include "rust-builtins.h"
  #include "rust-diagnostics.h"
  #include "tree-core.h"
! #include "rust-intrinsic-handlers.h"
! #include "rust-intrinsic-values.h"
  
  namespace Rust {
  namespace Compile {
  
! using IValue = Values::Intrinsics;
  
! static const std::map<std::string, handlers::HandlerBuilder> generic_intrinsics
!   = {{IValue::OFFSET, handlers::offset},
!      {IValue::SIZE_OF, handlers::sizeof_handler},
!      {IValue::TRANSMUTE, handlers::transmute},
!      {IValue::ROTATE_LEFT, handlers::rotate_left},
!      {IValue::ROTATE_RIGHT, handlers::rotate_right},
!      {IValue::WRAPPING_ADD, handlers::wrapping_op (PLUS_EXPR)},
!      {IValue::WRAPPING_SUB, handlers::wrapping_op (MINUS_EXPR)},
!      {IValue::WRAPPING_MUL, handlers::wrapping_op (MULT_EXPR)},
!      {IValue::ADD_WITH_OVERFLOW, handlers::op_with_overflow (PLUS_EXPR)},
!      {IValue::SUB_WITH_OVERFLOW, handlers::op_with_overflow (MINUS_EXPR)},
!      {IValue::MUL_WITH_OVERFLOW, handlers::op_with_overflow (MULT_EXPR)},
!      {IValue::COPY, handlers::copy (true)},
!      {IValue::COPY_NONOVERLAPPING, handlers::copy (false)},
!      {IValue::PREFETCH_READ_DATA, handlers::prefetch_read_data},
!      {IValue::PREFETCH_WRITE_DATA, handlers::prefetch_write_data},
!      {IValue::ATOMIC_STORE_SEQCST, handlers::atomic_store (__ATOMIC_SEQ_CST)},
!      {IValue::ATOMIC_STORE_RELEASE, handlers::atomic_store (__ATOMIC_RELEASE)},
!      {IValue::ATOMIC_STORE_RELAXED, handlers::atomic_store (__ATOMIC_RELAXED)},
!      {IValue::ATOMIC_STORE_UNORDERED,
!       handlers::atomic_store (__ATOMIC_RELAXED)},
!      {IValue::ATOMIC_LOAD_SEQCST, handlers::atomic_load (__ATOMIC_SEQ_CST)},
!      {IValue::ATOMIC_LOAD_ACQUIRE, handlers::atomic_load (__ATOMIC_ACQUIRE)},
!      {IValue::ATOMIC_LOAD_RELAXED, handlers::atomic_load (__ATOMIC_RELAXED)},
!      {IValue::ATOMIC_LOAD_UNORDERED, handlers::atomic_load (__ATOMIC_RELAXED)},
!      {IValue::UNCHECKED_ADD, handlers::unchecked_op (PLUS_EXPR)},
!      {IValue::UNCHECKED_SUB, handlers::unchecked_op (MINUS_EXPR)},
!      {IValue::UNCHECKED_MUL, handlers::unchecked_op (MULT_EXPR)},
!      {IValue::UNCHECKED_DIV, handlers::unchecked_op (TRUNC_DIV_EXPR)},
!      {IValue::UNCHECKED_REM, handlers::unchecked_op (TRUNC_MOD_EXPR)},
!      {IValue::UNCHECKED_SHL, handlers::unchecked_op (LSHIFT_EXPR)},
!      {IValue::UNCHECKED_SHR, handlers::unchecked_op (RSHIFT_EXPR)},
!      {IValue::UNINIT, handlers::uninit},
!      {IValue::MOVE_VAL_INIT, handlers::move_val_init},
!      {IValue::LIKELY, handlers::expect (true)},
!      {IValue::UNLIKELY, handlers::expect (false)},
!      {IValue::ASSUME, handlers::assume},
!      {IValue::TRY, handlers::try_handler (false)},
!      {IValue::CATCH_UNWIND, handlers::try_handler (true)},
!      {IValue::DISCRIMINANT_VALUE, handlers::discriminant_value},
!      {IValue::VARIANT_COUNT, handlers::variant_count},
!      {IValue::BSWAP, handlers::bswap_handler}};
  
  Intrinsics::Intrinsics (Context *ctx) : ctx (ctx) {}
  
*************** Intrinsics::compile (TyTy::FnType *fntyp
*** 281,1484 ****
    return error_mark_node;
  }
  
- /**
-  * Items can be forward compiled which means we may not need to invoke this
-  * code. We might also have already compiled this generic function as well.
-  */
- static bool
- check_for_cached_intrinsic (Context *ctx, TyTy::FnType *fntype, tree *lookup)
- {
-   const Resolver::CanonicalPath &canonical_path = fntype->get_ident ().path;
-   std::string asm_name = ctx->mangle_item (fntype, canonical_path);
-   if (ctx->lookup_function_decl (fntype->get_ty_ref (), lookup,
- 				 fntype->get_id (), fntype, asm_name))
-     {
-       return true;
-     }
- 
-   return false;
- }
- 
- /**
-  * Maybe override the Hir Lookups for the substituions in this context
-  */
- static void
- maybe_override_ctx (TyTy::FnType *fntype)
- {
-   if (fntype->has_substitutions_defined ())
-     fntype->override_context ();
- }
- 
- /**
-  * Compile and setup a function's parameters
-  */
- static void
- compile_fn_params (Context *ctx, TyTy::FnType *fntype, tree fndecl,
- 		   std::vector<Bvariable *> *compiled_param_variables,
- 		   std::vector<tree_node *> *compiled_param_types = nullptr)
- {
-   for (auto &parm : fntype->get_params ())
-     {
-       auto &referenced_param = parm.get_pattern ();
-       auto param_tyty = parm.get_type ();
-       auto compiled_param_type = TyTyResolveCompile::compile (ctx, param_tyty);
- 
-       location_t param_locus = referenced_param.get_locus ();
-       Bvariable *compiled_param_var
- 	= CompileFnParam::compile (ctx, fndecl, referenced_param,
- 				   compiled_param_type, param_locus);
- 
-       compiled_param_variables->push_back (compiled_param_var);
-       if (compiled_param_types)
- 	compiled_param_types->push_back (compiled_param_type);
-     }
- }
- 
- static tree
- compile_intrinsic_function (Context *ctx, TyTy::FnType *fntype)
- {
-   maybe_override_ctx (fntype);
- 
-   const Resolver::CanonicalPath &canonical_path = fntype->get_ident ().path;
- 
-   tree compiled_fn_type = TyTyResolveCompile::compile (ctx, fntype);
-   std::string ir_symbol_name
-     = canonical_path.get () + fntype->subst_as_string ();
-   std::string asm_name = ctx->mangle_item (fntype, canonical_path);
- 
-   unsigned int flags = 0;
-   tree fndecl = Backend::function (compiled_fn_type, ir_symbol_name, asm_name,
- 				   flags, fntype->get_ident ().locus);
- 
-   TREE_PUBLIC (fndecl) = 0;
-   TREE_READONLY (fndecl) = 1;
-   DECL_ARTIFICIAL (fndecl) = 1;
-   DECL_EXTERNAL (fndecl) = 0;
-   DECL_DECLARED_INLINE_P (fndecl) = 1;
- 
-   return fndecl;
- }
- 
- static void
- enter_intrinsic_block (Context *ctx, tree fndecl,
- 		       const std::vector<Bvariable *> &vars = {})
- {
-   tree enclosing_scope = NULL_TREE;
-   location_t start_location = UNDEF_LOCATION;
-   location_t end_location = UNDEF_LOCATION;
- 
-   auto block = Backend::block (fndecl, enclosing_scope, vars, start_location,
- 			       end_location);
- 
-   ctx->push_block (block);
- }
- 
- static void
- finalize_intrinsic_block (Context *ctx, tree fndecl)
- {
-   tree bind_tree = ctx->pop_block ();
- 
-   gcc_assert (TREE_CODE (bind_tree) == BIND_EXPR);
- 
-   DECL_SAVED_TREE (fndecl) = bind_tree;
- 
-   ctx->push_function (fndecl);
- 
-   DECL_DECLARED_CONSTEXPR_P (fndecl) = 1;
-   maybe_save_constexpr_fundef (fndecl);
- }
- 
- static tree
- offset_handler (Context *ctx, TyTy::FnType *fntype)
- {
-   // offset intrinsic has two params dst pointer and offset isize
-   rust_assert (fntype->get_params ().size () == 2);
- 
-   auto fndecl = compile_intrinsic_function (ctx, fntype);
- 
-   std::vector<Bvariable *> param_vars;
-   compile_fn_params (ctx, fntype, fndecl, &param_vars);
- 
-   auto &dst_param = param_vars.at (0);
-   auto &size_param = param_vars.at (1);
-   rust_assert (param_vars.size () == 2);
-   if (!Backend::function_set_parameters (fndecl, param_vars))
-     return error_mark_node;
- 
-   enter_intrinsic_block (ctx, fndecl);
- 
-   // BUILTIN offset FN BODY BEGIN
-   tree dst = Backend::var_expression (dst_param, UNDEF_LOCATION);
-   tree size = Backend::var_expression (size_param, UNDEF_LOCATION);
-   tree pointer_offset_expr
-     = pointer_offset_expression (dst, size, BUILTINS_LOCATION);
-   auto return_statement
-     = Backend::return_statement (fndecl, pointer_offset_expr, UNDEF_LOCATION);
-   ctx->add_statement (return_statement);
-   // BUILTIN offset FN BODY END
- 
-   finalize_intrinsic_block (ctx, fndecl);
- 
-   return fndecl;
- }
- 
- static tree
- sizeof_handler (Context *ctx, TyTy::FnType *fntype)
- {
-   // size_of has _zero_ parameters its parameter is the generic one
-   rust_assert (fntype->get_params ().size () == 0);
- 
-   tree lookup = NULL_TREE;
-   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
-     return lookup;
- 
-   auto fndecl = compile_intrinsic_function (ctx, fntype);
- 
-   // get the template parameter type tree fn size_of<T>();
-   rust_assert (fntype->get_num_substitutions () == 1);
-   auto &param_mapping = fntype->get_substs ().at (0);
-   const auto param_tyty = param_mapping.get_param_ty ();
-   auto resolved_tyty = param_tyty->resolve ();
-   tree template_parameter_type
-     = TyTyResolveCompile::compile (ctx, resolved_tyty);
- 
-   enter_intrinsic_block (ctx, fndecl);
- 
-   // BUILTIN size_of FN BODY BEGIN
-   tree size_expr = TYPE_SIZE_UNIT (template_parameter_type);
-   auto return_statement
-     = Backend::return_statement (fndecl, size_expr, UNDEF_LOCATION);
-   ctx->add_statement (return_statement);
-   // BUILTIN size_of FN BODY END
- 
-   finalize_intrinsic_block (ctx, fndecl);
- 
-   return fndecl;
- }
- 
- static tree
- transmute_handler (Context *ctx, TyTy::FnType *fntype)
- {
-   // transmute intrinsic has one parameter
-   rust_assert (fntype->get_params ().size () == 1);
- 
-   tree lookup = NULL_TREE;
-   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
-     return lookup;
- 
-   auto fndecl = compile_intrinsic_function (ctx, fntype);
- 
-   std::vector<Bvariable *> param_vars;
-   std::vector<tree_node *> compiled_types;
-   compile_fn_params (ctx, fntype, fndecl, &param_vars, &compiled_types);
- 
-   if (!Backend::function_set_parameters (fndecl, param_vars))
-     return error_mark_node;
- 
-   // param to convert
-   Bvariable *convert_me_param = param_vars.at (0);
-   tree convert_me_expr
-     = Backend::var_expression (convert_me_param, UNDEF_LOCATION);
- 
-   // check for transmute pre-conditions
-   tree target_type_expr = TREE_TYPE (DECL_RESULT (fndecl));
-   tree source_type_expr = compiled_types.at (0);
-   tree target_size_expr = TYPE_SIZE (target_type_expr);
-   tree source_size_expr = TYPE_SIZE (source_type_expr);
-   // for some reason, unit types and other zero-sized types return NULL for the
-   // size expressions
-   unsigned HOST_WIDE_INT target_size
-     = target_size_expr ? TREE_INT_CST_LOW (target_size_expr) : 0;
-   unsigned HOST_WIDE_INT source_size
-     = source_size_expr ? TREE_INT_CST_LOW (source_size_expr) : 0;
- 
-   // size check for concrete types
-   // TODO(liushuyu): check alignment for pointers; check for dependently-sized
-   // types
-   if (target_size != source_size)
-     {
-       rust_error_at (fntype->get_locus (),
- 		     "cannot transmute between types of different sizes, or "
- 		     "dependently-sized types");
-       rust_inform (
- 	fntype->get_ident ().locus, "source type: %qs (%lu bits)",
- 	fntype->get_params ().at (0).get_type ()->as_string ().c_str (),
- 	(unsigned long) source_size);
-       rust_inform (fntype->get_ident ().locus, "target type: %qs (%lu bits)",
- 		   fntype->get_return_type ()->as_string ().c_str (),
- 		   (unsigned long) target_size);
-     }
- 
-   enter_intrinsic_block (ctx, fndecl);
- 
-   // BUILTIN transmute FN BODY BEGIN
- 
-   // Return *((orig_type*)&decl)  */
- 
-   tree t = build_fold_addr_expr_loc (UNKNOWN_LOCATION, convert_me_expr);
-   t = fold_build1_loc (UNKNOWN_LOCATION, NOP_EXPR,
- 		       build_pointer_type (target_type_expr), t);
-   tree result_expr = build_fold_indirect_ref_loc (UNKNOWN_LOCATION, t);
- 
-   auto return_statement
-     = Backend::return_statement (fndecl, result_expr, UNDEF_LOCATION);
-   ctx->add_statement (return_statement);
-   // BUILTIN transmute FN BODY END
- 
-   finalize_intrinsic_block (ctx, fndecl);
- 
-   return fndecl;
- }
- 
- static tree
- rotate_handler (Context *ctx, TyTy::FnType *fntype, tree_code op)
- {
-   // rotate intrinsic has two parameter
-   rust_assert (fntype->get_params ().size () == 2);
- 
-   tree lookup = NULL_TREE;
-   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
-     return lookup;
- 
-   auto fndecl = compile_intrinsic_function (ctx, fntype);
- 
-   // setup the params
-   std::vector<Bvariable *> param_vars;
-   compile_fn_params (ctx, fntype, fndecl, &param_vars);
- 
-   auto &x_param = param_vars.at (0);
-   auto &y_param = param_vars.at (1);
-   rust_assert (param_vars.size () == 2);
-   if (!Backend::function_set_parameters (fndecl, param_vars))
-     return error_mark_node;
- 
-   enter_intrinsic_block (ctx, fndecl);
- 
-   // BUILTIN rotate FN BODY BEGIN
-   tree x = Backend::var_expression (x_param, UNDEF_LOCATION);
-   tree y = Backend::var_expression (y_param, UNDEF_LOCATION);
-   tree rotate_expr
-     = fold_build2_loc (BUILTINS_LOCATION, op, TREE_TYPE (x), x, y);
-   auto return_statement
-     = Backend::return_statement (fndecl, rotate_expr, UNDEF_LOCATION);
-   ctx->add_statement (return_statement);
-   // BUILTIN rotate FN BODY END
- 
-   finalize_intrinsic_block (ctx, fndecl);
- 
-   return fndecl;
- }
- 
- /**
-  * pub fn wrapping_{add, sub, mul}<T>(lhs: T, rhs: T) -> T;
-  */
- static tree
- wrapping_op_handler_inner (Context *ctx, TyTy::FnType *fntype, tree_code op)
- {
-   // wrapping_<op> intrinsics have two parameter
-   rust_assert (fntype->get_params ().size () == 2);
- 
-   tree lookup = NULL_TREE;
-   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
-     return lookup;
- 
-   auto fndecl = compile_intrinsic_function (ctx, fntype);
- 
-   // setup the params
-   std::vector<Bvariable *> param_vars;
-   compile_fn_params (ctx, fntype, fndecl, &param_vars);
- 
-   auto &lhs_param = param_vars.at (0);
-   auto &rhs_param = param_vars.at (1);
- 
-   if (!Backend::function_set_parameters (fndecl, param_vars))
-     return error_mark_node;
- 
-   enter_intrinsic_block (ctx, fndecl);
- 
-   // BUILTIN wrapping_<op> FN BODY BEGIN
-   auto lhs = Backend::var_expression (lhs_param, UNDEF_LOCATION);
-   auto rhs = Backend::var_expression (rhs_param, UNDEF_LOCATION);
- 
-   // Operations are always wrapping in Rust, as we have -fwrapv enabled by
-   // default. The difference between a wrapping_{add, sub, mul} and a regular
-   // arithmetic operation is that these intrinsics do not panic - they always
-   // carry over.
-   auto wrap_expr = build2 (op, TREE_TYPE (lhs), lhs, rhs);
- 
-   auto return_statement
-     = Backend::return_statement (fndecl, wrap_expr, UNDEF_LOCATION);
-   ctx->add_statement (return_statement);
-   // BUILTIN wrapping_<op> FN BODY END
- 
-   finalize_intrinsic_block (ctx, fndecl);
- 
-   return fndecl;
- }
- 
- /**
-  * pub fn add_with_overflow<T>(x: T, y: T) -> (T, bool);
-  */
- static tree
- op_with_overflow_inner (Context *ctx, TyTy::FnType *fntype, tree_code op)
- {
-   // wrapping_<op> intrinsics have two parameter
-   rust_assert (fntype->get_params ().size () == 2);
- 
-   tree lookup = NULL_TREE;
-   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
-     return lookup;
- 
-   auto fndecl = compile_intrinsic_function (ctx, fntype);
- 
-   // setup the params
-   std::vector<Bvariable *> param_vars;
-   compile_fn_params (ctx, fntype, fndecl, &param_vars);
- 
-   auto &x_param = param_vars.at (0);
-   auto &y_param = param_vars.at (1);
- 
-   if (!Backend::function_set_parameters (fndecl, param_vars))
-     return error_mark_node;
- 
-   rust_assert (fntype->get_num_substitutions () == 1);
-   auto &param_mapping = fntype->get_substs ().at (0);
-   const auto param_tyty = param_mapping.get_param_ty ();
-   auto resolved_tyty = param_tyty->resolve ();
-   tree template_parameter_type
-     = TyTyResolveCompile::compile (ctx, resolved_tyty);
- 
-   // this should match y as well or we can take it from the TyTy structure
-   tree tmp_stmt = error_mark_node;
-   Bvariable *result_variable
-     = Backend::temporary_variable (fndecl, NULL_TREE, template_parameter_type,
- 				   NULL_TREE, true /*address_is_taken*/,
- 				   UNDEF_LOCATION, &tmp_stmt);
-   Bvariable *bool_variable
-     = Backend::temporary_variable (fndecl, NULL_TREE, boolean_type_node,
- 				   NULL_TREE, true /*address_is_taken*/,
- 				   UNDEF_LOCATION, &tmp_stmt);
- 
-   enter_intrinsic_block (ctx, fndecl, {result_variable, bool_variable});
- 
-   // BUILTIN op_with_overflow FN BODY BEGIN
-   auto x = Backend::var_expression (x_param, UNDEF_LOCATION);
-   auto y = Backend::var_expression (y_param, UNDEF_LOCATION);
- 
-   tree overflow_builtin = error_mark_node;
-   switch (op)
-     {
-     case PLUS_EXPR:
-       BuiltinsContext::get ().lookup_simple_builtin ("__builtin_add_overflow",
- 						     &overflow_builtin);
-       break;
- 
-     case MINUS_EXPR:
-       BuiltinsContext::get ().lookup_simple_builtin ("__builtin_sub_overflow",
- 						     &overflow_builtin);
-       break;
- 
-     case MULT_EXPR:
-       BuiltinsContext::get ().lookup_simple_builtin ("__builtin_mul_overflow",
- 						     &overflow_builtin);
-       break;
- 
-     default:
-       rust_unreachable ();
-       break;
-     }
-   rust_assert (overflow_builtin != error_mark_node);
- 
-   tree bool_decl = bool_variable->get_tree (BUILTINS_LOCATION);
-   tree result_decl = result_variable->get_tree (BUILTINS_LOCATION);
-   tree result_ref = build_fold_addr_expr_loc (BUILTINS_LOCATION, result_decl);
- 
-   tree builtin_call = build_call_expr_loc (BUILTINS_LOCATION, overflow_builtin,
- 					   3, x, y, result_ref);
- 
-   tree overflow_assignment
-     = Backend::assignment_statement (bool_decl, builtin_call,
- 				     BUILTINS_LOCATION);
- 
-   ctx->add_statement (overflow_assignment);
- 
-   std::vector<tree> vals = {result_decl, bool_decl};
-   tree tuple_type = TREE_TYPE (DECL_RESULT (fndecl));
-   tree result_expr = Backend::constructor_expression (tuple_type, false, vals,
- 						      -1, UNDEF_LOCATION);
- 
-   auto return_statement
-     = Backend::return_statement (fndecl, result_expr, UNDEF_LOCATION);
-   ctx->add_statement (return_statement);
- 
-   // BUILTIN wrapping_<op> FN BODY END
- 
-   finalize_intrinsic_block (ctx, fndecl);
- 
-   return fndecl;
- }
- 
- /**
-  * fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: usize);
-  * fn copy<T>(src: *const T, dst: *mut T, count: usize);
-  */
- static tree
- copy_handler_inner (Context *ctx, TyTy::FnType *fntype, bool overlaps)
- {
-   rust_assert (fntype->get_params ().size () == 3);
-   rust_assert (fntype->get_num_substitutions () == 1);
- 
-   tree lookup = NULL_TREE;
-   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
-     return lookup;
- 
-   auto fndecl = compile_intrinsic_function (ctx, fntype);
- 
-   // Most intrinsic functions are pure - not `copy_nonoverlapping` and `copy`
-   TREE_READONLY (fndecl) = 0;
-   TREE_SIDE_EFFECTS (fndecl) = 1;
- 
-   // setup the params
-   std::vector<Bvariable *> param_vars;
-   compile_fn_params (ctx, fntype, fndecl, &param_vars);
- 
-   if (!Backend::function_set_parameters (fndecl, param_vars))
-     return error_mark_node;
- 
-   enter_intrinsic_block (ctx, fndecl);
- 
-   // BUILTIN copy_nonoverlapping BODY BEGIN
- 
-   auto src = Backend::var_expression (param_vars[0], UNDEF_LOCATION);
-   auto dst = Backend::var_expression (param_vars[1], UNDEF_LOCATION);
-   auto count = Backend::var_expression (param_vars[2], UNDEF_LOCATION);
- 
-   // We want to create the following statement
-   // memcpy(dst, src, size_of::<T>());
-   // so
-   // memcpy(dst, src, size_expr);
- 
-   auto *resolved_ty = fntype->get_substs ().at (0).get_param_ty ()->resolve ();
-   auto param_type = TyTyResolveCompile::compile (ctx, resolved_ty);
- 
-   tree size_expr
-     = build2 (MULT_EXPR, size_type_node, TYPE_SIZE_UNIT (param_type), count);
- 
-   tree memcpy_raw = nullptr;
-   BuiltinsContext::get ().lookup_simple_builtin (overlaps ? "__builtin_memmove"
- 							  : "__builtin_memcpy",
- 						 &memcpy_raw);
-   rust_assert (memcpy_raw);
-   auto memcpy = build_fold_addr_expr_loc (UNKNOWN_LOCATION, memcpy_raw);
- 
-   auto copy_call = Backend::call_expression (memcpy, {dst, src, size_expr},
- 					     nullptr, UNDEF_LOCATION);
- 
-   ctx->add_statement (copy_call);
- 
-   // BUILTIN copy_nonoverlapping BODY END
- 
-   finalize_intrinsic_block (ctx, fndecl);
- 
-   return fndecl;
- }
- 
- static tree
- make_unsigned_long_tree (unsigned long value)
- {
-   return build_int_cst (integer_type_node, value);
- }
- 
- static tree
- prefetch_data_handler (Context *ctx, TyTy::FnType *fntype, Prefetch kind)
- {
-   rust_assert (fntype->get_params ().size () == 2);
- 
-   tree lookup = NULL_TREE;
-   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
-     return lookup;
- 
-   auto fndecl = compile_intrinsic_function (ctx, fntype);
- 
-   // prefetching isn't pure and shouldn't be discarded after GIMPLE
-   TREE_READONLY (fndecl) = 0;
-   TREE_SIDE_EFFECTS (fndecl) = 1;
- 
-   std::vector<Bvariable *> args;
-   compile_fn_params (ctx, fntype, fndecl, &args);
- 
-   if (!Backend::function_set_parameters (fndecl, args))
-     return error_mark_node;
- 
-   enter_intrinsic_block (ctx, fndecl);
- 
-   auto addr = Backend::var_expression (args[0], UNDEF_LOCATION);
- 
-   // The core library technically allows you to pass any i32 value as a
-   // locality, but LLVM will then complain if the value cannot be constant
-   // evaluated. For now, we ignore the locality argument and instead always
-   // pass `3` (the most restrictive value). This allows us to still have
-   // prefetch behavior, just not as granular as expected. In future Rust
-   // versions, we hope that prefetch intrinsics will be split up according to
-   // locality, similarly to atomic intrinsics.
-   // The solution is to try and perform constant folding for the locality
-   // argument, or instead of creating a new function definition, modify the call
-   // site directly This has the bad side-effect of creating warnings about
-   // `unused name - locality`, which we hack away here:
-   // TODO: Take care of handling locality properly
-   Backend::var_expression (args[1], UNDEF_LOCATION);
- 
-   auto rw_flag = make_unsigned_long_tree (kind == Prefetch::Write ? 1 : 0);
- 
-   auto prefetch_raw = NULL_TREE;
-   auto ok = BuiltinsContext::get ().lookup_simple_builtin ("__builtin_prefetch",
- 							   &prefetch_raw);
-   rust_assert (ok);
-   auto prefetch = build_fold_addr_expr_loc (UNKNOWN_LOCATION, prefetch_raw);
- 
-   auto prefetch_call = Backend::call_expression (prefetch,
- 						 {addr, rw_flag,
- 						  // locality arg
- 						  make_unsigned_long_tree (3)},
- 						 nullptr, UNDEF_LOCATION);
- 
-   TREE_READONLY (prefetch_call) = 0;
-   TREE_SIDE_EFFECTS (prefetch_call) = 1;
- 
-   ctx->add_statement (prefetch_call);
- 
-   finalize_intrinsic_block (ctx, fndecl);
- 
-   return fndecl;
- }
- 
- static std::string
- build_atomic_builtin_name (const std::string &prefix, location_t locus,
- 			   TyTy::BaseType *operand_type)
- {
-   static const std::map<std::string, std::string> allowed_types = {
-     {"i8", "1"},    {"i16", "2"},   {"i32", "4"},   {"i64", "8"},
-     {"i128", "16"}, {"isize", "8"}, {"u8", "1"},    {"u16", "2"},
-     {"u32", "4"},   {"u64", "8"},   {"u128", "16"}, {"usize", "8"},
-   };
- 
-   // TODO: Can we maybe get the generic version (atomic_store_n) to work... This
-   // would be so much better
- 
-   std::string result = "__" + prefix; //  + "n";
- 
-   auto type_name = operand_type->get_name ();
-   if (type_name == "usize" || type_name == "isize")
-     {
-       rust_sorry_at (
- 	locus, "atomics are not yet available for size types (usize, isize)");
-       return "";
-     }
- 
-   if (type_name.at (0) == 'i')
-     {
-       rust_sorry_at (locus, "atomics are not yet supported for signed "
- 			    "integer types (i8, i16, i32, i64, i128)");
-       return "";
-     }
- 
-   auto type_size_str = allowed_types.find (type_name);
- 
-   if (!check_for_basic_integer_type ("atomic", locus, operand_type))
-     return "";
- 
-   result += type_size_str->second;
- 
-   return result;
- }
- 
- static tree
- atomic_store_handler_inner (Context *ctx, TyTy::FnType *fntype, int ordering)
- {
-   rust_assert (fntype->get_params ().size () == 2);
-   rust_assert (fntype->get_num_substitutions () == 1);
- 
-   tree lookup = NULL_TREE;
-   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
-     return lookup;
- 
-   auto fndecl = compile_intrinsic_function (ctx, fntype);
- 
-   // Most intrinsic functions are pure but not the atomic ones
-   TREE_READONLY (fndecl) = 0;
-   TREE_SIDE_EFFECTS (fndecl) = 1;
- 
-   // setup the params
-   std::vector<Bvariable *> param_vars;
-   std::vector<tree> types;
-   compile_fn_params (ctx, fntype, fndecl, &param_vars, &types);
- 
-   auto ok = Backend::function_set_parameters (fndecl, param_vars);
-   rust_assert (ok);
- 
-   enter_intrinsic_block (ctx, fndecl);
- 
-   auto dst = Backend::var_expression (param_vars[0], UNDEF_LOCATION);
-   TREE_READONLY (dst) = 0;
- 
-   auto value = Backend::var_expression (param_vars[1], UNDEF_LOCATION);
-   auto memorder = make_unsigned_long_tree (ordering);
- 
-   auto monomorphized_type
-     = fntype->get_substs ()[0].get_param_ty ()->resolve ();
- 
-   auto builtin_name
-     = build_atomic_builtin_name ("atomic_store_", fntype->get_locus (),
- 				 monomorphized_type);
-   if (builtin_name.empty ())
-     return error_mark_node;
- 
-   tree atomic_store_raw = nullptr;
-   BuiltinsContext::get ().lookup_simple_builtin (builtin_name,
- 						 &atomic_store_raw);
-   rust_assert (atomic_store_raw);
- 
-   auto atomic_store
-     = build_fold_addr_expr_loc (UNKNOWN_LOCATION, atomic_store_raw);
- 
-   auto store_call
-     = Backend::call_expression (atomic_store, {dst, value, memorder}, nullptr,
- 				UNDEF_LOCATION);
-   TREE_READONLY (store_call) = 0;
-   TREE_SIDE_EFFECTS (store_call) = 1;
- 
-   ctx->add_statement (store_call);
-   finalize_intrinsic_block (ctx, fndecl);
- 
-   return fndecl;
- }
- 
- static tree
- atomic_load_handler_inner (Context *ctx, TyTy::FnType *fntype, int ordering)
- {
-   rust_assert (fntype->get_params ().size () == 1);
-   rust_assert (fntype->get_num_substitutions () == 1);
- 
-   tree lookup = NULL_TREE;
-   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
-     return lookup;
- 
-   auto fndecl = compile_intrinsic_function (ctx, fntype);
- 
-   // Most intrinsic functions are pure but not the atomic ones
-   // FIXME: Is atomic_load_* pure? Feels like it shouldn't so
-   TREE_READONLY (fndecl) = 0;
-   TREE_SIDE_EFFECTS (fndecl) = 1;
- 
-   // setup the params
-   std::vector<Bvariable *> param_vars;
-   std::vector<tree> types;
-   compile_fn_params (ctx, fntype, fndecl, &param_vars, &types);
- 
-   auto ok = Backend::function_set_parameters (fndecl, param_vars);
-   rust_assert (ok);
- 
-   enter_intrinsic_block (ctx, fndecl);
- 
-   auto src = Backend::var_expression (param_vars[0], UNDEF_LOCATION);
-   auto memorder = make_unsigned_long_tree (ordering);
- 
-   auto monomorphized_type
-     = fntype->get_substs ()[0].get_param_ty ()->resolve ();
- 
-   auto builtin_name
-     = build_atomic_builtin_name ("atomic_load_", fntype->get_locus (),
- 				 monomorphized_type);
-   if (builtin_name.empty ())
-     return error_mark_node;
- 
-   tree atomic_load_raw = nullptr;
-   BuiltinsContext::get ().lookup_simple_builtin (builtin_name,
- 						 &atomic_load_raw);
-   rust_assert (atomic_load_raw);
- 
-   auto atomic_load
-     = build_fold_addr_expr_loc (UNKNOWN_LOCATION, atomic_load_raw);
- 
-   auto load_call = Backend::call_expression (atomic_load, {src, memorder},
- 					     nullptr, UNDEF_LOCATION);
-   auto return_statement
-     = Backend::return_statement (fndecl, load_call, UNDEF_LOCATION);
- 
-   TREE_READONLY (load_call) = 0;
-   TREE_SIDE_EFFECTS (load_call) = 1;
- 
-   ctx->add_statement (return_statement);
- 
-   finalize_intrinsic_block (ctx, fndecl);
- 
-   return fndecl;
- }
- 
- static inline tree
- unchecked_op_inner (Context *ctx, TyTy::FnType *fntype, tree_code op)
- {
-   rust_assert (fntype->get_params ().size () == 2);
-   rust_assert (fntype->get_num_substitutions () == 1);
- 
-   tree lookup = NULL_TREE;
-   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
-     return lookup;
- 
-   auto fndecl = compile_intrinsic_function (ctx, fntype);
- 
-   // setup the params
-   std::vector<Bvariable *> param_vars;
-   compile_fn_params (ctx, fntype, fndecl, &param_vars);
- 
-   if (!Backend::function_set_parameters (fndecl, param_vars))
-     return error_mark_node;
- 
-   enter_intrinsic_block (ctx, fndecl);
- 
-   // BUILTIN unchecked_<op> BODY BEGIN
- 
-   auto x = Backend::var_expression (param_vars[0], UNDEF_LOCATION);
-   auto y = Backend::var_expression (param_vars[1], UNDEF_LOCATION);
- 
-   auto *monomorphized_type
-     = fntype->get_substs ().at (0).get_param_ty ()->resolve ();
- 
-   check_for_basic_integer_type ("unchecked operation", fntype->get_locus (),
- 				monomorphized_type);
- 
-   auto expr = build2 (op, TREE_TYPE (x), x, y);
-   auto return_statement
-     = Backend::return_statement (fndecl, expr, UNDEF_LOCATION);
- 
-   ctx->add_statement (return_statement);
- 
-   // BUILTIN unchecked_<op> BODY END
- 
-   finalize_intrinsic_block (ctx, fndecl);
- 
-   return fndecl;
- }
- 
- static tree
- uninit_handler (Context *ctx, TyTy::FnType *fntype)
- {
-   // uninit has _zero_ parameters its parameter is the generic one
-   rust_assert (fntype->get_params ().size () == 0);
- 
-   tree lookup = NULL_TREE;
-   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
-     return lookup;
- 
-   auto fndecl = compile_intrinsic_function (ctx, fntype);
- 
-   // Most intrinsic functions are pure - not `uninit_handler`
-   TREE_READONLY (fndecl) = 0;
-   TREE_SIDE_EFFECTS (fndecl) = 1;
- 
-   // get the template parameter type tree fn uninit<T>();
-   rust_assert (fntype->get_num_substitutions () == 1);
-   auto &param_mapping = fntype->get_substs ().at (0);
-   const auto param_tyty = param_mapping.get_param_ty ();
-   auto resolved_tyty = param_tyty->resolve ();
-   tree template_parameter_type
-     = TyTyResolveCompile::compile (ctx, resolved_tyty);
- 
-   // result temporary
-   tree dst_type = TREE_TYPE (DECL_RESULT (fndecl));
-   rust_assert (TYPE_SIZE_UNIT (template_parameter_type)
- 	       == TYPE_SIZE_UNIT (dst_type));
- 
-   tree tmp_stmt = error_mark_node;
-   Bvariable *bvar
-     = Backend::temporary_variable (fndecl, NULL_TREE, dst_type, NULL_TREE,
- 				   true /*address_is_taken*/, UNDEF_LOCATION,
- 				   &tmp_stmt);
- 
-   enter_intrinsic_block (ctx, fndecl, {bvar});
- 
-   // BUILTIN size_of FN BODY BEGIN
- 
-   tree memset_builtin = error_mark_node;
-   BuiltinsContext::get ().lookup_simple_builtin ("__builtin_memset",
- 						 &memset_builtin);
-   rust_assert (memset_builtin != error_mark_node);
- 
-   // call memset with 0x01 and size of the thing see
-   // https://github.com/Rust-GCC/gccrs/issues/1899
- 
-   tree dst = bvar->get_tree (BUILTINS_LOCATION);
-   tree dst_addr = build_fold_addr_expr_loc (BUILTINS_LOCATION, dst);
-   tree constant_byte = build_int_cst (integer_type_node, 0x01);
-   tree size_expr = TYPE_SIZE_UNIT (template_parameter_type);
- 
-   tree memset_call = build_call_expr_loc (BUILTINS_LOCATION, memset_builtin, 3,
- 					  dst_addr, constant_byte, size_expr);
-   ctx->add_statement (memset_call);
- 
-   auto return_statement
-     = Backend::return_statement (fndecl, dst, UNDEF_LOCATION);
-   ctx->add_statement (return_statement);
-   // BUILTIN size_of FN BODY END
- 
-   finalize_intrinsic_block (ctx, fndecl);
- 
-   return fndecl;
- }
- 
- static tree
- move_val_init_handler (Context *ctx, TyTy::FnType *fntype)
- {
-   rust_assert (fntype->get_params ().size () == 2);
- 
-   tree lookup = NULL_TREE;
-   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
-     return lookup;
- 
-   auto fndecl = compile_intrinsic_function (ctx, fntype);
- 
-   // Most intrinsic functions are pure - not `move_val_init`
-   TREE_READONLY (fndecl) = 0;
-   TREE_SIDE_EFFECTS (fndecl) = 1;
- 
-   // get the template parameter type tree fn size_of<T>();
-   rust_assert (fntype->get_num_substitutions () == 1);
-   auto &param_mapping = fntype->get_substs ().at (0);
-   auto param_tyty = param_mapping.get_param_ty ();
-   auto resolved_tyty = param_tyty->resolve ();
-   tree template_parameter_type
-     = TyTyResolveCompile::compile (ctx, resolved_tyty);
- 
-   std::vector<Bvariable *> param_vars;
-   compile_fn_params (ctx, fntype, fndecl, &param_vars);
- 
-   if (!Backend::function_set_parameters (fndecl, param_vars))
-     return error_mark_node;
- 
-   enter_intrinsic_block (ctx, fndecl);
- 
-   // BUILTIN size_of FN BODY BEGIN
- 
-   tree dst = Backend::var_expression (param_vars[0], UNDEF_LOCATION);
-   tree src = Backend::var_expression (param_vars[1], UNDEF_LOCATION);
-   tree size = TYPE_SIZE_UNIT (template_parameter_type);
- 
-   tree memcpy_builtin = error_mark_node;
-   BuiltinsContext::get ().lookup_simple_builtin ("__builtin_memcpy",
- 						 &memcpy_builtin);
-   rust_assert (memcpy_builtin != error_mark_node);
- 
-   src = build_fold_addr_expr_loc (BUILTINS_LOCATION, src);
-   tree memset_call = build_call_expr_loc (BUILTINS_LOCATION, memcpy_builtin, 3,
- 					  dst, src, size);
- 
-   ctx->add_statement (memset_call);
-   // BUILTIN size_of FN BODY END
- 
-   finalize_intrinsic_block (ctx, fndecl);
- 
-   return fndecl;
- }
- 
- static inline tree
- expect_handler_inner (Context *ctx, TyTy::FnType *fntype, bool likely)
- {
-   rust_assert (fntype->get_params ().size () == 1);
- 
-   tree lookup = NULL_TREE;
-   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
-     return lookup;
- 
-   auto fndecl = compile_intrinsic_function (ctx, fntype);
- 
-   enter_intrinsic_block (ctx, fndecl);
- 
-   // BUILTIN expect_handler_inner FN BODY BEGIN
-   // setup the params
-   std::vector<Bvariable *> param_vars;
-   compile_fn_params (ctx, fntype, fndecl, &param_vars);
-   tree expr = Backend::var_expression (param_vars[0], UNDEF_LOCATION);
-   tree expect_fn_raw = nullptr;
-   BuiltinsContext::get ().lookup_simple_builtin ("__builtin_expect",
- 						 &expect_fn_raw);
-   rust_assert (expect_fn_raw);
-   auto expect_fn = build_fold_addr_expr_loc (BUILTINS_LOCATION, expect_fn_raw);
- 
-   // we need to convert the expression return type to long to match the expected
-   // parameter type of __builtin_expect
-   auto expect_src = build1 (CONVERT_EXPR, long_integer_type_node, expr);
-   auto expect_value
-     = make_unsigned_long_tree (static_cast<unsigned long> (likely));
- 
-   auto expect_call
-     = Backend::call_expression (expect_fn, {expect_src, expect_value}, nullptr,
- 				BUILTINS_LOCATION);
-   // the return value also needs to be casted (to bool)
-   auto expect_call_bool = build1 (CONVERT_EXPR, boolean_type_node, expect_call);
-   auto return_statement
-     = Backend::return_statement (fndecl, expect_call_bool, BUILTINS_LOCATION);
-   ctx->add_statement (return_statement);
-   // BUILTIN expect_handler_inner FN BODY END
- 
-   finalize_intrinsic_block (ctx, fndecl);
- 
-   return fndecl;
- }
- 
- static tree
- assume_handler (Context *ctx, TyTy::FnType *fntype)
- {
-   // TODO: make sure this is actually helping the compiler optimize
- 
-   rust_assert (fntype->get_params ().size () == 1);
-   rust_assert (fntype->param_at (0).get_type ()->get_kind ()
- 	       == TyTy::TypeKind::BOOL);
- 
-   tree lookup = NULL_TREE;
-   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
-     return lookup;
- 
-   auto fndecl = compile_intrinsic_function (ctx, fntype);
- 
-   // TODO: make sure these are necessary
-   TREE_READONLY (fndecl) = 0;
-   DECL_DISREGARD_INLINE_LIMITS (fndecl) = 1;
-   DECL_ATTRIBUTES (fndecl) = tree_cons (get_identifier ("always_inline"),
- 					NULL_TREE, DECL_ATTRIBUTES (fndecl));
- 
-   std::vector<Bvariable *> param_vars;
-   compile_fn_params (ctx, fntype, fndecl, &param_vars);
- 
-   if (!Backend::function_set_parameters (fndecl, param_vars))
-     return error_mark_node;
- 
-   enter_intrinsic_block (ctx, fndecl);
- 
-   // BUILTIN assume FN BODY BEGIN
- 
-   tree val = Backend::var_expression (param_vars[0], UNDEF_LOCATION);
- 
-   tree assume_expr = build_call_expr_internal_loc (UNDEF_LOCATION, IFN_ASSUME,
- 						   void_type_node, 1, val);
-   TREE_SIDE_EFFECTS (assume_expr) = 1;
- 
-   ctx->add_statement (assume_expr);
-   // BUILTIN assume FN BODY END
- 
-   finalize_intrinsic_block (ctx, fndecl);
- 
-   return fndecl;
- }
- 
- static tree
- try_handler_inner (Context *ctx, TyTy::FnType *fntype, bool is_new_api)
- {
-   rust_assert (fntype->get_params ().size () == 3);
- 
-   tree lookup = NULL_TREE;
-   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
-     return lookup;
-   auto fndecl = compile_intrinsic_function (ctx, fntype);
- 
-   enter_intrinsic_block (ctx, fndecl);
- 
-   // The following tricks are needed to make sure the try-catch blocks are not
-   // optimized away
-   TREE_READONLY (fndecl) = 0;
-   DECL_DISREGARD_INLINE_LIMITS (fndecl) = 1;
-   DECL_ATTRIBUTES (fndecl) = tree_cons (get_identifier ("always_inline"),
- 					NULL_TREE, DECL_ATTRIBUTES (fndecl));
- 
-   // BUILTIN try_handler FN BODY BEGIN
-   // setup the params
-   std::vector<Bvariable *> param_vars;
-   compile_fn_params (ctx, fntype, fndecl, &param_vars);
-   if (!Backend::function_set_parameters (fndecl, param_vars))
-     return error_mark_node;
-   tree enclosing_scope = NULL_TREE;
- 
-   bool panic_is_abort = Session::get_instance ().options.get_panic_strategy ()
- 			== CompileOptions::PanicStrategy::Abort;
-   tree try_fn = Backend::var_expression (param_vars[0], UNDEF_LOCATION);
-   tree user_data = Backend::var_expression (param_vars[1], UNDEF_LOCATION);
-   tree catch_fn = Backend::var_expression (param_vars[2], UNDEF_LOCATION);
-   tree normal_return_stmt = NULL_TREE;
-   tree error_return_stmt = NULL_TREE;
-   tree try_call = Backend::call_expression (try_fn, {user_data}, nullptr,
- 					    BUILTINS_LOCATION);
-   tree catch_call = NULL_TREE;
-   tree try_block = Backend::block (fndecl, enclosing_scope, {}, UNDEF_LOCATION,
- 				   UNDEF_LOCATION);
- 
-   if (is_new_api)
-     {
-       auto ret_type = TyTyResolveCompile::get_unit_type (ctx);
-       auto ret_expr = Backend::constructor_expression (ret_type, false, {}, -1,
- 						       UNDEF_LOCATION);
-       normal_return_stmt
- 	= Backend::return_statement (fndecl, ret_expr, BUILTINS_LOCATION);
-       error_return_stmt
- 	= Backend::return_statement (fndecl, ret_expr, BUILTINS_LOCATION);
-     }
-   else
-     {
-       normal_return_stmt = Backend::return_statement (fndecl, integer_zero_node,
- 						      BUILTINS_LOCATION);
-       error_return_stmt = Backend::return_statement (fndecl, integer_one_node,
- 						     BUILTINS_LOCATION);
-     }
-   Backend::block_add_statements (try_block,
- 				 std::vector<tree>{try_call,
- 						   normal_return_stmt});
-   if (panic_is_abort)
-     {
-       // skip building the try-catch construct
-       ctx->add_statement (try_block);
-       finalize_intrinsic_block (ctx, fndecl);
-       return fndecl;
-     }
- 
-   tree eh_pointer
-     = build_call_expr (builtin_decl_explicit (BUILT_IN_EH_POINTER), 1,
- 		       integer_zero_node);
-   catch_call = Backend::call_expression (catch_fn, {user_data, eh_pointer},
- 					 NULL_TREE, BUILTINS_LOCATION);
- 
-   tree catch_block = Backend::block (fndecl, enclosing_scope, {},
- 				     UNDEF_LOCATION, UNDEF_LOCATION);
-   Backend::block_add_statements (catch_block,
- 				 std::vector<tree>{catch_call,
- 						   error_return_stmt});
-   // emulate what cc1plus is doing for C++ try-catch
-   tree inner_eh_construct
-     = Backend::exception_handler_statement (catch_call, NULL_TREE,
- 					    error_return_stmt,
- 					    BUILTINS_LOCATION);
-   // TODO(liushuyu): eh_personality needs to be implemented as a runtime thing
-   auto eh_construct
-     = Backend::exception_handler_statement (try_block, inner_eh_construct,
- 					    NULL_TREE, BUILTINS_LOCATION);
-   ctx->add_statement (eh_construct);
-   // BUILTIN try_handler FN BODY END
-   finalize_intrinsic_block (ctx, fndecl);
- 
-   return fndecl;
- }
- 
- static tree
- discriminant_value_handler (Context *ctx, TyTy::FnType *fntype)
- {
-   rust_assert (fntype->get_params ().size () == 1);
-   rust_assert (fntype->get_return_type ()->is<TyTy::PlaceholderType> ());
-   rust_assert (fntype->has_substitutions ());
-   rust_assert (fntype->get_num_type_params () == 1);
-   auto &mapping = fntype->get_substs ().at (0);
-   auto param_ty = mapping.get_param_ty ();
-   rust_assert (param_ty->can_resolve ());
-   auto resolved = param_ty->resolve ();
-   auto p = static_cast<TyTy::PlaceholderType *> (fntype->get_return_type ());
- 
-   TyTy::BaseType *return_type = nullptr;
-   bool ok = ctx->get_tyctx ()->lookup_builtin ("isize", &return_type);
-   rust_assert (ok);
- 
-   bool is_adt = resolved->is<TyTy::ADTType> ();
-   bool is_enum = false;
-   if (is_adt)
-     {
-       const auto &adt = *static_cast<TyTy::ADTType *> (resolved);
-       return_type = adt.get_repr_options ().repr;
-       rust_assert (return_type != nullptr);
-       is_enum = adt.is_enum ();
-     }
- 
-   p->set_associated_type (return_type->get_ref ());
- 
-   tree lookup = NULL_TREE;
-   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
-     return lookup;
- 
-   auto fndecl = compile_intrinsic_function (ctx, fntype);
- 
-   std::vector<Bvariable *> param_vars;
-   compile_fn_params (ctx, fntype, fndecl, &param_vars);
- 
-   if (!Backend::function_set_parameters (fndecl, param_vars))
-     return error_mark_node;
- 
-   enter_intrinsic_block (ctx, fndecl);
- 
-   // BUILTIN disriminant_value FN BODY BEGIN
- 
-   tree result = integer_zero_node;
-   if (is_enum)
-     {
-       tree val = Backend::var_expression (param_vars[0], UNDEF_LOCATION);
-       tree deref = build_fold_indirect_ref_loc (UNKNOWN_LOCATION, val);
-       result = Backend::struct_field_expression (deref, 0, UNKNOWN_LOCATION);
-     }
- 
-   auto return_statement
-     = Backend::return_statement (fndecl, result, BUILTINS_LOCATION);
-   ctx->add_statement (return_statement);
- 
-   // BUILTIN disriminant_value FN BODY END
- 
-   finalize_intrinsic_block (ctx, fndecl);
- 
-   return fndecl;
- }
- 
- static tree
- variant_count_handler (Context *ctx, TyTy::FnType *fntype)
- {
-   rust_assert (fntype->get_num_type_params () == 1);
-   auto &mapping = fntype->get_substs ().at (0);
-   auto param_ty = mapping.get_param_ty ();
-   rust_assert (param_ty->can_resolve ());
-   auto resolved = param_ty->resolve ();
- 
-   size_t variant_count = 0;
-   bool is_adt = resolved->is<TyTy::ADTType> ();
-   if (is_adt)
-     {
-       const auto &adt = *static_cast<TyTy::ADTType *> (resolved);
-       variant_count = adt.number_of_variants ();
-     }
- 
-   tree lookup = NULL_TREE;
-   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
-     return lookup;
- 
-   auto fndecl = compile_intrinsic_function (ctx, fntype);
- 
-   std::vector<Bvariable *> param_vars;
-   compile_fn_params (ctx, fntype, fndecl, &param_vars);
- 
-   if (!Backend::function_set_parameters (fndecl, param_vars))
-     return error_mark_node;
- 
-   enter_intrinsic_block (ctx, fndecl);
- 
-   // BUILTIN disriminant_value FN BODY BEGIN
-   tree result_decl = DECL_RESULT (fndecl);
-   tree type = TREE_TYPE (result_decl);
- 
-   mpz_t ival;
-   mpz_init_set_ui (ival, variant_count);
-   tree result = wide_int_to_tree (type, wi::from_mpz (type, ival, true));
-   mpz_clear (ival);
- 
-   auto return_statement
-     = Backend::return_statement (fndecl, result, BUILTINS_LOCATION);
-   ctx->add_statement (return_statement);
- 
-   // BUILTIN disriminant_value FN BODY END
- 
-   finalize_intrinsic_block (ctx, fndecl);
- 
-   return fndecl;
- }
- 
  } // namespace Compile
  } // namespace Rust
--- 104,108 ----
diff -Nrcpad gcc-16-20260315/gcc/rust/backend/rust-intrinsic-handlers.cc gcc-16-20260322/gcc/rust/backend/rust-intrinsic-handlers.cc
*** gcc-16-20260315/gcc/rust/backend/rust-intrinsic-handlers.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/rust/backend/rust-intrinsic-handlers.cc	Sun Mar 22 22:32:07 2026
***************
*** 0 ****
--- 1,1535 ----
+ // Copyright (C) 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 "rust-intrinsic-handlers.h"
+ #include "rust-compile-context.h"
+ #include "rust-compile-type.h"
+ #include "rust-compile-fnparam.h"
+ #include "rust-builtins.h"
+ #include "rust-diagnostics.h"
+ #include "rust-location.h"
+ #include "rust-constexpr.h"
+ #include "rust-session-manager.h"
+ #include "rust-tree.h"
+ #include "tree-core.h"
+ #include "rust-gcc.h"
+ #include "fold-const.h"
+ #include "rust-constexpr.h"
+ 
+ // declaration taken from "stringpool.h"
+ // the get_identifier macro causes compilation issues
+ extern tree get_identifier (const char *);
+ 
+ namespace Rust {
+ namespace Compile {
+ namespace handlers {
+ 
+ static tree
+ make_unsigned_long_tree (unsigned long value)
+ {
+   return build_int_cst (integer_type_node, value);
+ }
+ 
+ static bool
+ is_basic_integer_type (TyTy::BaseType *type)
+ {
+   switch (type->get_kind ())
+     {
+     case TyTy::INT:
+     case TyTy::UINT:
+     case TyTy::USIZE:
+     case TyTy::ISIZE:
+       return true;
+     default:
+       return false;
+       break;
+     }
+ }
+ 
+ /**
+  * Maybe override the Hir Lookups for the substituions in this context
+  */
+ static void
+ maybe_override_ctx (TyTy::FnType *fntype)
+ {
+   if (fntype->has_substitutions_defined ())
+     fntype->override_context ();
+ }
+ 
+ static bool
+ check_for_basic_integer_type (const std::string &intrinsic_str,
+ 			      location_t locus, TyTy::BaseType *type)
+ {
+   auto is_basic_integer = is_basic_integer_type (type);
+   if (!is_basic_integer)
+     {
+       rust_error_at (
+ 	locus,
+ 	"%s intrinsics can only be used with basic integer types (got %qs)",
+ 	intrinsic_str.c_str (), type->get_name ().c_str ());
+     }
+ 
+   return is_basic_integer;
+ }
+ 
+ /**
+  * Items can be forward compiled which means we may not need to invoke this
+  * code. We might also have already compiled this generic function as well.
+  */
+ static bool
+ check_for_cached_intrinsic (Context *ctx, TyTy::FnType *fntype, tree *lookup)
+ {
+   const Resolver::CanonicalPath &canonical_path = fntype->get_ident ().path;
+   std::string asm_name = ctx->mangle_item (fntype, canonical_path);
+   if (ctx->lookup_function_decl (fntype->get_ty_ref (), lookup,
+ 				 fntype->get_id (), fntype, asm_name))
+     {
+       return true;
+     }
+ 
+   return false;
+ }
+ 
+ static tree
+ compile_intrinsic_function (Context *ctx, TyTy::FnType *fntype)
+ {
+   maybe_override_ctx (fntype);
+ 
+   const Resolver::CanonicalPath &canonical_path = fntype->get_ident ().path;
+ 
+   tree compiled_fn_type = TyTyResolveCompile::compile (ctx, fntype);
+   std::string ir_symbol_name
+     = canonical_path.get () + fntype->subst_as_string ();
+   std::string asm_name = ctx->mangle_item (fntype, canonical_path);
+ 
+   unsigned int flags = 0;
+   tree fndecl = Backend::function (compiled_fn_type, ir_symbol_name, asm_name,
+ 				   flags, fntype->get_ident ().locus);
+ 
+   TREE_PUBLIC (fndecl) = 0;
+   TREE_READONLY (fndecl) = 1;
+   DECL_ARTIFICIAL (fndecl) = 1;
+   DECL_EXTERNAL (fndecl) = 0;
+   DECL_DECLARED_INLINE_P (fndecl) = 1;
+ 
+   return fndecl;
+ }
+ 
+ /**
+  * Compile and setup a function's parameters
+  */
+ static void
+ compile_fn_params (Context *ctx, TyTy::FnType *fntype, tree fndecl,
+ 		   std::vector<Bvariable *> *compiled_param_variables,
+ 		   std::vector<tree_node *> *compiled_param_types = nullptr)
+ {
+   for (auto &parm : fntype->get_params ())
+     {
+       auto &referenced_param = parm.get_pattern ();
+       auto param_tyty = parm.get_type ();
+       auto compiled_param_type = TyTyResolveCompile::compile (ctx, param_tyty);
+ 
+       location_t param_locus = referenced_param.get_locus ();
+       Bvariable *compiled_param_var
+ 	= CompileFnParam::compile (ctx, fndecl, referenced_param,
+ 				   compiled_param_type, param_locus);
+ 
+       compiled_param_variables->push_back (compiled_param_var);
+       if (compiled_param_types)
+ 	compiled_param_types->push_back (compiled_param_type);
+     }
+ }
+ 
+ static void
+ enter_intrinsic_block (Context *ctx, tree fndecl,
+ 		       const std::vector<Bvariable *> &vars = {})
+ {
+   tree enclosing_scope = NULL_TREE;
+   location_t start_location = UNDEF_LOCATION;
+   location_t end_location = UNDEF_LOCATION;
+ 
+   auto block = Backend::block (fndecl, enclosing_scope, vars, start_location,
+ 			       end_location);
+ 
+   ctx->push_block (block);
+ }
+ 
+ static void
+ finalize_intrinsic_block (Context *ctx, tree fndecl)
+ {
+   tree bind_tree = ctx->pop_block ();
+ 
+   gcc_assert (TREE_CODE (bind_tree) == BIND_EXPR);
+ 
+   DECL_SAVED_TREE (fndecl) = bind_tree;
+ 
+   ctx->push_function (fndecl);
+ 
+   DECL_DECLARED_CONSTEXPR_P (fndecl) = 1;
+   maybe_save_constexpr_fundef (fndecl);
+ }
+ 
+ namespace inner {
+ 
+ static std::string
+ build_atomic_builtin_name (const std::string &prefix, location_t locus,
+ 			   TyTy::BaseType *operand_type)
+ {
+   static const std::map<std::string, std::string> allowed_types = {
+     {"i8", "1"},    {"i16", "2"},   {"i32", "4"},   {"i64", "8"},
+     {"i128", "16"}, {"isize", "8"}, {"u8", "1"},    {"u16", "2"},
+     {"u32", "4"},   {"u64", "8"},   {"u128", "16"}, {"usize", "8"},
+   };
+ 
+   // TODO: Can we maybe get the generic version (atomic_store_n) to work... This
+   // would be so much better
+ 
+   std::string result = "__" + prefix; //  + "n";
+ 
+   auto type_name = operand_type->get_name ();
+   if (type_name == "usize" || type_name == "isize")
+     {
+       rust_sorry_at (
+ 	locus, "atomics are not yet available for size types (usize, isize)");
+       return "";
+     }
+ 
+   if (type_name.at (0) == 'i')
+     {
+       rust_sorry_at (locus, "atomics are not yet supported for signed "
+ 			    "integer types (i8, i16, i32, i64, i128)");
+       return "";
+     }
+ 
+   auto type_size_str = allowed_types.find (type_name);
+ 
+   if (!check_for_basic_integer_type ("atomic", locus, operand_type))
+     return "";
+ 
+   result += type_size_str->second;
+ 
+   return result;
+ }
+ 
+ inline tree
+ unchecked_op (Context *ctx, TyTy::FnType *fntype, tree_code op)
+ {
+   rust_assert (fntype->get_params ().size () == 2);
+   rust_assert (fntype->get_num_substitutions () == 1);
+ 
+   tree lookup = NULL_TREE;
+   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
+     return lookup;
+ 
+   auto fndecl = compile_intrinsic_function (ctx, fntype);
+ 
+   // setup the params
+   std::vector<Bvariable *> param_vars;
+   compile_fn_params (ctx, fntype, fndecl, &param_vars);
+ 
+   if (!Backend::function_set_parameters (fndecl, param_vars))
+     return error_mark_node;
+ 
+   enter_intrinsic_block (ctx, fndecl);
+ 
+   // BUILTIN unchecked_<op> BODY BEGIN
+ 
+   auto x = Backend::var_expression (param_vars[0], UNDEF_LOCATION);
+   auto y = Backend::var_expression (param_vars[1], UNDEF_LOCATION);
+ 
+   auto *monomorphized_type
+     = fntype->get_substs ().at (0).get_param_ty ()->resolve ();
+ 
+   check_for_basic_integer_type ("unchecked operation", fntype->get_locus (),
+ 				monomorphized_type);
+ 
+   auto expr = build2 (op, TREE_TYPE (x), x, y);
+   auto return_statement
+     = Backend::return_statement (fndecl, expr, UNDEF_LOCATION);
+ 
+   ctx->add_statement (return_statement);
+ 
+   // BUILTIN unchecked_<op> BODY END
+ 
+   finalize_intrinsic_block (ctx, fndecl);
+ 
+   return fndecl;
+ }
+ 
+ inline tree
+ expect (Context *ctx, TyTy::FnType *fntype, bool likely)
+ {
+   rust_assert (fntype->get_params ().size () == 1);
+ 
+   tree lookup = NULL_TREE;
+   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
+     return lookup;
+ 
+   auto fndecl = compile_intrinsic_function (ctx, fntype);
+ 
+   enter_intrinsic_block (ctx, fndecl);
+ 
+   // BUILTIN expect_handler_inner FN BODY BEGIN
+   // setup the params
+   std::vector<Bvariable *> param_vars;
+   compile_fn_params (ctx, fntype, fndecl, &param_vars);
+   tree expr = Backend::var_expression (param_vars[0], UNDEF_LOCATION);
+   tree expect_fn_raw = nullptr;
+   BuiltinsContext::get ().lookup_simple_builtin ("__builtin_expect",
+ 						 &expect_fn_raw);
+   rust_assert (expect_fn_raw);
+   auto expect_fn = build_fold_addr_expr_loc (BUILTINS_LOCATION, expect_fn_raw);
+ 
+   // we need to convert the expression return type to long to match the expected
+   // parameter type of __builtin_expect
+   auto expect_src = build1 (CONVERT_EXPR, long_integer_type_node, expr);
+   auto expect_value
+     = make_unsigned_long_tree (static_cast<unsigned long> (likely));
+ 
+   auto expect_call
+     = Backend::call_expression (expect_fn, {expect_src, expect_value}, nullptr,
+ 				BUILTINS_LOCATION);
+   // the return value also needs to be casted (to bool)
+   auto expect_call_bool = build1 (CONVERT_EXPR, boolean_type_node, expect_call);
+   auto return_statement
+     = Backend::return_statement (fndecl, expect_call_bool, BUILTINS_LOCATION);
+   ctx->add_statement (return_statement);
+   // BUILTIN expect_handler_inner FN BODY END
+ 
+   finalize_intrinsic_block (ctx, fndecl);
+ 
+   return fndecl;
+ }
+ 
+ tree
+ try_handler (Context *ctx, TyTy::FnType *fntype, bool is_new_api)
+ {
+   rust_assert (fntype->get_params ().size () == 3);
+ 
+   tree lookup = NULL_TREE;
+   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
+     return lookup;
+   auto fndecl = compile_intrinsic_function (ctx, fntype);
+ 
+   enter_intrinsic_block (ctx, fndecl);
+ 
+   // The following tricks are needed to make sure the try-catch blocks are not
+   // optimized away
+   TREE_READONLY (fndecl) = 0;
+   DECL_DISREGARD_INLINE_LIMITS (fndecl) = 1;
+   DECL_ATTRIBUTES (fndecl) = tree_cons (get_identifier ("always_inline"),
+ 					NULL_TREE, DECL_ATTRIBUTES (fndecl));
+ 
+   // BUILTIN try_handler FN BODY BEGIN
+   // setup the params
+   std::vector<Bvariable *> param_vars;
+   compile_fn_params (ctx, fntype, fndecl, &param_vars);
+   if (!Backend::function_set_parameters (fndecl, param_vars))
+     return error_mark_node;
+   tree enclosing_scope = NULL_TREE;
+ 
+   bool panic_is_abort = Session::get_instance ().options.get_panic_strategy ()
+ 			== CompileOptions::PanicStrategy::Abort;
+   tree try_fn = Backend::var_expression (param_vars[0], UNDEF_LOCATION);
+   tree user_data = Backend::var_expression (param_vars[1], UNDEF_LOCATION);
+   tree catch_fn = Backend::var_expression (param_vars[2], UNDEF_LOCATION);
+   tree normal_return_stmt = NULL_TREE;
+   tree error_return_stmt = NULL_TREE;
+   tree try_call = Backend::call_expression (try_fn, {user_data}, nullptr,
+ 					    BUILTINS_LOCATION);
+   tree catch_call = NULL_TREE;
+   tree try_block = Backend::block (fndecl, enclosing_scope, {}, UNDEF_LOCATION,
+ 				   UNDEF_LOCATION);
+ 
+   if (is_new_api)
+     {
+       auto ret_type = TyTyResolveCompile::get_unit_type (ctx);
+       auto ret_expr = Backend::constructor_expression (ret_type, false, {}, -1,
+ 						       UNDEF_LOCATION);
+       normal_return_stmt
+ 	= Backend::return_statement (fndecl, ret_expr, BUILTINS_LOCATION);
+       error_return_stmt
+ 	= Backend::return_statement (fndecl, ret_expr, BUILTINS_LOCATION);
+     }
+   else
+     {
+       normal_return_stmt = Backend::return_statement (fndecl, integer_zero_node,
+ 						      BUILTINS_LOCATION);
+       error_return_stmt = Backend::return_statement (fndecl, integer_one_node,
+ 						     BUILTINS_LOCATION);
+     }
+   Backend::block_add_statements (try_block,
+ 				 std::vector<tree>{try_call,
+ 						   normal_return_stmt});
+   if (panic_is_abort)
+     {
+       // skip building the try-catch construct
+       ctx->add_statement (try_block);
+       finalize_intrinsic_block (ctx, fndecl);
+       return fndecl;
+     }
+ 
+   tree eh_pointer
+     = build_call_expr (builtin_decl_explicit (BUILT_IN_EH_POINTER), 1,
+ 		       integer_zero_node);
+   catch_call = Backend::call_expression (catch_fn, {user_data, eh_pointer},
+ 					 NULL_TREE, BUILTINS_LOCATION);
+ 
+   tree catch_block = Backend::block (fndecl, enclosing_scope, {},
+ 				     UNDEF_LOCATION, UNDEF_LOCATION);
+   Backend::block_add_statements (catch_block,
+ 				 std::vector<tree>{catch_call,
+ 						   error_return_stmt});
+   // emulate what cc1plus is doing for C++ try-catch
+   tree inner_eh_construct
+     = Backend::exception_handler_statement (catch_call, NULL_TREE,
+ 					    error_return_stmt,
+ 					    BUILTINS_LOCATION);
+   // TODO(liushuyu): eh_personality needs to be implemented as a runtime thing
+   auto eh_construct
+     = Backend::exception_handler_statement (try_block, inner_eh_construct,
+ 					    NULL_TREE, BUILTINS_LOCATION);
+   ctx->add_statement (eh_construct);
+   // BUILTIN try_handler FN BODY END
+   finalize_intrinsic_block (ctx, fndecl);
+ 
+   return fndecl;
+ }
+ 
+ /**
+  * pub fn wrapping_{add, sub, mul}<T>(lhs: T, rhs: T) -> T;
+  */
+ tree
+ wrapping_op (Context *ctx, TyTy::FnType *fntype, tree_code op)
+ {
+   // wrapping_<op> intrinsics have two parameter
+   rust_assert (fntype->get_params ().size () == 2);
+ 
+   tree lookup = NULL_TREE;
+   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
+     return lookup;
+ 
+   auto fndecl = compile_intrinsic_function (ctx, fntype);
+ 
+   // setup the params
+   std::vector<Bvariable *> param_vars;
+   compile_fn_params (ctx, fntype, fndecl, &param_vars);
+ 
+   auto &lhs_param = param_vars.at (0);
+   auto &rhs_param = param_vars.at (1);
+ 
+   if (!Backend::function_set_parameters (fndecl, param_vars))
+     return error_mark_node;
+ 
+   enter_intrinsic_block (ctx, fndecl);
+ 
+   // BUILTIN wrapping_<op> FN BODY BEGIN
+   auto lhs = Backend::var_expression (lhs_param, UNDEF_LOCATION);
+   auto rhs = Backend::var_expression (rhs_param, UNDEF_LOCATION);
+ 
+   // Operations are always wrapping in Rust, as we have -fwrapv enabled by
+   // default. The difference between a wrapping_{add, sub, mul} and a regular
+   // arithmetic operation is that these intrinsics do not panic - they always
+   // carry over.
+   auto wrap_expr = build2 (op, TREE_TYPE (lhs), lhs, rhs);
+ 
+   auto return_statement
+     = Backend::return_statement (fndecl, wrap_expr, UNDEF_LOCATION);
+   ctx->add_statement (return_statement);
+   // BUILTIN wrapping_<op> FN BODY END
+ 
+   finalize_intrinsic_block (ctx, fndecl);
+ 
+   return fndecl;
+ }
+ 
+ /**
+  * pub fn add_with_overflow<T>(x: T, y: T) -> (T, bool);
+  */
+ tree
+ op_with_overflow (Context *ctx, TyTy::FnType *fntype, tree_code op)
+ {
+   // wrapping_<op> intrinsics have two parameter
+   rust_assert (fntype->get_params ().size () == 2);
+ 
+   tree lookup = NULL_TREE;
+   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
+     return lookup;
+ 
+   auto fndecl = compile_intrinsic_function (ctx, fntype);
+ 
+   // setup the params
+   std::vector<Bvariable *> param_vars;
+   compile_fn_params (ctx, fntype, fndecl, &param_vars);
+ 
+   auto &x_param = param_vars.at (0);
+   auto &y_param = param_vars.at (1);
+ 
+   if (!Backend::function_set_parameters (fndecl, param_vars))
+     return error_mark_node;
+ 
+   rust_assert (fntype->get_num_substitutions () == 1);
+   auto &param_mapping = fntype->get_substs ().at (0);
+   const auto param_tyty = param_mapping.get_param_ty ();
+   auto resolved_tyty = param_tyty->resolve ();
+   tree template_parameter_type
+     = TyTyResolveCompile::compile (ctx, resolved_tyty);
+ 
+   // this should match y as well or we can take it from the TyTy structure
+   tree tmp_stmt = error_mark_node;
+   Bvariable *result_variable
+     = Backend::temporary_variable (fndecl, NULL_TREE, template_parameter_type,
+ 				   NULL_TREE, true /*address_is_taken*/,
+ 				   UNDEF_LOCATION, &tmp_stmt);
+   Bvariable *bool_variable
+     = Backend::temporary_variable (fndecl, NULL_TREE, boolean_type_node,
+ 				   NULL_TREE, true /*address_is_taken*/,
+ 				   UNDEF_LOCATION, &tmp_stmt);
+ 
+   enter_intrinsic_block (ctx, fndecl, {result_variable, bool_variable});
+ 
+   // BUILTIN op_with_overflow FN BODY BEGIN
+   auto x = Backend::var_expression (x_param, UNDEF_LOCATION);
+   auto y = Backend::var_expression (y_param, UNDEF_LOCATION);
+ 
+   tree overflow_builtin = error_mark_node;
+   switch (op)
+     {
+     case PLUS_EXPR:
+       BuiltinsContext::get ().lookup_simple_builtin ("__builtin_add_overflow",
+ 						     &overflow_builtin);
+       break;
+ 
+     case MINUS_EXPR:
+       BuiltinsContext::get ().lookup_simple_builtin ("__builtin_sub_overflow",
+ 						     &overflow_builtin);
+       break;
+ 
+     case MULT_EXPR:
+       BuiltinsContext::get ().lookup_simple_builtin ("__builtin_mul_overflow",
+ 						     &overflow_builtin);
+       break;
+ 
+     default:
+       rust_unreachable ();
+       break;
+     }
+   rust_assert (overflow_builtin != error_mark_node);
+ 
+   tree bool_decl = bool_variable->get_tree (BUILTINS_LOCATION);
+   tree result_decl = result_variable->get_tree (BUILTINS_LOCATION);
+   tree result_ref = build_fold_addr_expr_loc (BUILTINS_LOCATION, result_decl);
+ 
+   tree builtin_call = build_call_expr_loc (BUILTINS_LOCATION, overflow_builtin,
+ 					   3, x, y, result_ref);
+ 
+   tree overflow_assignment
+     = Backend::assignment_statement (bool_decl, builtin_call,
+ 				     BUILTINS_LOCATION);
+ 
+   ctx->add_statement (overflow_assignment);
+ 
+   std::vector<tree> vals = {result_decl, bool_decl};
+   tree tuple_type = TREE_TYPE (DECL_RESULT (fndecl));
+   tree result_expr = Backend::constructor_expression (tuple_type, false, vals,
+ 						      -1, UNDEF_LOCATION);
+ 
+   auto return_statement
+     = Backend::return_statement (fndecl, result_expr, UNDEF_LOCATION);
+   ctx->add_statement (return_statement);
+ 
+   // BUILTIN wrapping_<op> FN BODY END
+ 
+   finalize_intrinsic_block (ctx, fndecl);
+ 
+   return fndecl;
+ }
+ 
+ /**
+  * fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: usize);
+  * fn copy<T>(src: *const T, dst: *mut T, count: usize);
+  */
+ tree
+ copy (Context *ctx, TyTy::FnType *fntype, bool overlaps)
+ {
+   rust_assert (fntype->get_params ().size () == 3);
+   rust_assert (fntype->get_num_substitutions () == 1);
+ 
+   tree lookup = NULL_TREE;
+   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
+     return lookup;
+ 
+   auto fndecl = compile_intrinsic_function (ctx, fntype);
+ 
+   // Most intrinsic functions are pure - not `copy_nonoverlapping` and `copy`
+   TREE_READONLY (fndecl) = 0;
+   TREE_SIDE_EFFECTS (fndecl) = 1;
+ 
+   // setup the params
+   std::vector<Bvariable *> param_vars;
+   compile_fn_params (ctx, fntype, fndecl, &param_vars);
+ 
+   if (!Backend::function_set_parameters (fndecl, param_vars))
+     return error_mark_node;
+ 
+   enter_intrinsic_block (ctx, fndecl);
+ 
+   // BUILTIN copy_nonoverlapping BODY BEGIN
+ 
+   auto src = Backend::var_expression (param_vars[0], UNDEF_LOCATION);
+   auto dst = Backend::var_expression (param_vars[1], UNDEF_LOCATION);
+   auto count = Backend::var_expression (param_vars[2], UNDEF_LOCATION);
+ 
+   // We want to create the following statement
+   // memcpy(dst, src, size_of::<T>());
+   // so
+   // memcpy(dst, src, size_expr);
+ 
+   auto *resolved_ty = fntype->get_substs ().at (0).get_param_ty ()->resolve ();
+   auto param_type = TyTyResolveCompile::compile (ctx, resolved_ty);
+ 
+   tree size_expr
+     = build2 (MULT_EXPR, size_type_node, TYPE_SIZE_UNIT (param_type), count);
+ 
+   tree memcpy_raw = nullptr;
+   BuiltinsContext::get ().lookup_simple_builtin (overlaps ? "__builtin_memmove"
+ 							  : "__builtin_memcpy",
+ 						 &memcpy_raw);
+   rust_assert (memcpy_raw);
+   auto memcpy = build_fold_addr_expr_loc (UNKNOWN_LOCATION, memcpy_raw);
+ 
+   auto copy_call = Backend::call_expression (memcpy, {dst, src, size_expr},
+ 					     nullptr, UNDEF_LOCATION);
+ 
+   ctx->add_statement (copy_call);
+ 
+   // BUILTIN copy_nonoverlapping BODY END
+ 
+   finalize_intrinsic_block (ctx, fndecl);
+ 
+   return fndecl;
+ }
+ 
+ tree
+ atomic_store (Context *ctx, TyTy::FnType *fntype, int ordering)
+ {
+   rust_assert (fntype->get_params ().size () == 2);
+   rust_assert (fntype->get_num_substitutions () == 1);
+ 
+   tree lookup = NULL_TREE;
+   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
+     return lookup;
+ 
+   auto fndecl = compile_intrinsic_function (ctx, fntype);
+ 
+   // Most intrinsic functions are pure but not the atomic ones
+   TREE_READONLY (fndecl) = 0;
+   TREE_SIDE_EFFECTS (fndecl) = 1;
+ 
+   // setup the params
+   std::vector<Bvariable *> param_vars;
+   std::vector<tree> types;
+   compile_fn_params (ctx, fntype, fndecl, &param_vars, &types);
+ 
+   auto ok = Backend::function_set_parameters (fndecl, param_vars);
+   rust_assert (ok);
+ 
+   enter_intrinsic_block (ctx, fndecl);
+ 
+   auto dst = Backend::var_expression (param_vars[0], UNDEF_LOCATION);
+   TREE_READONLY (dst) = 0;
+ 
+   auto value = Backend::var_expression (param_vars[1], UNDEF_LOCATION);
+   auto memorder = make_unsigned_long_tree (ordering);
+ 
+   auto monomorphized_type
+     = fntype->get_substs ()[0].get_param_ty ()->resolve ();
+ 
+   auto builtin_name
+     = build_atomic_builtin_name ("atomic_store_", fntype->get_locus (),
+ 				 monomorphized_type);
+   if (builtin_name.empty ())
+     return error_mark_node;
+ 
+   tree atomic_store_raw = nullptr;
+   BuiltinsContext::get ().lookup_simple_builtin (builtin_name,
+ 						 &atomic_store_raw);
+   rust_assert (atomic_store_raw);
+ 
+   auto atomic_store
+     = build_fold_addr_expr_loc (UNKNOWN_LOCATION, atomic_store_raw);
+ 
+   auto store_call
+     = Backend::call_expression (atomic_store, {dst, value, memorder}, nullptr,
+ 				UNDEF_LOCATION);
+   TREE_READONLY (store_call) = 0;
+   TREE_SIDE_EFFECTS (store_call) = 1;
+ 
+   ctx->add_statement (store_call);
+   finalize_intrinsic_block (ctx, fndecl);
+ 
+   return fndecl;
+ }
+ 
+ tree
+ atomic_load (Context *ctx, TyTy::FnType *fntype, int ordering)
+ {
+   rust_assert (fntype->get_params ().size () == 1);
+   rust_assert (fntype->get_num_substitutions () == 1);
+ 
+   tree lookup = NULL_TREE;
+   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
+     return lookup;
+ 
+   auto fndecl = compile_intrinsic_function (ctx, fntype);
+ 
+   // Most intrinsic functions are pure but not the atomic ones
+   // FIXME: Is atomic_load_* pure? Feels like it shouldn't so
+   TREE_READONLY (fndecl) = 0;
+   TREE_SIDE_EFFECTS (fndecl) = 1;
+ 
+   // setup the params
+   std::vector<Bvariable *> param_vars;
+   std::vector<tree> types;
+   compile_fn_params (ctx, fntype, fndecl, &param_vars, &types);
+ 
+   auto ok = Backend::function_set_parameters (fndecl, param_vars);
+   rust_assert (ok);
+ 
+   enter_intrinsic_block (ctx, fndecl);
+ 
+   auto src = Backend::var_expression (param_vars[0], UNDEF_LOCATION);
+   auto memorder = make_unsigned_long_tree (ordering);
+ 
+   auto monomorphized_type
+     = fntype->get_substs ()[0].get_param_ty ()->resolve ();
+ 
+   auto builtin_name
+     = build_atomic_builtin_name ("atomic_load_", fntype->get_locus (),
+ 				 monomorphized_type);
+   if (builtin_name.empty ())
+     return error_mark_node;
+ 
+   tree atomic_load_raw = nullptr;
+   BuiltinsContext::get ().lookup_simple_builtin (builtin_name,
+ 						 &atomic_load_raw);
+   rust_assert (atomic_load_raw);
+ 
+   auto atomic_load
+     = build_fold_addr_expr_loc (UNKNOWN_LOCATION, atomic_load_raw);
+ 
+   auto load_call = Backend::call_expression (atomic_load, {src, memorder},
+ 					     nullptr, UNDEF_LOCATION);
+   auto return_statement
+     = Backend::return_statement (fndecl, load_call, UNDEF_LOCATION);
+ 
+   TREE_READONLY (load_call) = 0;
+   TREE_SIDE_EFFECTS (load_call) = 1;
+ 
+   ctx->add_statement (return_statement);
+ 
+   finalize_intrinsic_block (ctx, fndecl);
+ 
+   return fndecl;
+ }
+ 
+ } // namespace inner
+ 
+ const HandlerBuilder
+ op_with_overflow (tree_code op)
+ {
+   return [op] (Context *ctx, TyTy::FnType *fntype) {
+     return inner::op_with_overflow (ctx, fntype, op);
+   };
+ }
+ 
+ tree
+ rotate_left (Context *ctx, TyTy::FnType *fntype)
+ {
+   return handlers::rotate (ctx, fntype, LROTATE_EXPR);
+ }
+ 
+ tree
+ rotate_right (Context *ctx, TyTy::FnType *fntype)
+ {
+   return handlers::rotate (ctx, fntype, RROTATE_EXPR);
+ }
+ 
+ const HandlerBuilder
+ wrapping_op (tree_code op)
+ {
+   return [op] (Context *ctx, TyTy::FnType *fntype) {
+     return inner::wrapping_op (ctx, fntype, op);
+   };
+ }
+ 
+ HandlerBuilder
+ atomic_store (int ordering)
+ {
+   return [ordering] (Context *ctx, TyTy::FnType *fntype) {
+     return inner::atomic_store (ctx, fntype, ordering);
+   };
+ }
+ 
+ HandlerBuilder
+ atomic_load (int ordering)
+ {
+   return [ordering] (Context *ctx, TyTy::FnType *fntype) {
+     return inner::atomic_load (ctx, fntype, ordering);
+   };
+ }
+ 
+ const HandlerBuilder
+ unchecked_op (tree_code op)
+ {
+   return [op] (Context *ctx, TyTy::FnType *fntype) {
+     return inner::unchecked_op (ctx, fntype, op);
+   };
+ }
+ 
+ const HandlerBuilder
+ copy (bool overlaps)
+ {
+   return [overlaps] (Context *ctx, TyTy::FnType *fntype) {
+     return inner::copy (ctx, fntype, overlaps);
+   };
+ }
+ 
+ const HandlerBuilder
+ expect (bool likely)
+ {
+   return [likely] (Context *ctx, TyTy::FnType *fntype) {
+     return inner::expect (ctx, fntype, likely);
+   };
+ }
+ 
+ const HandlerBuilder
+ try_handler (bool is_new_api)
+ {
+   return [is_new_api] (Context *ctx, TyTy::FnType *fntype) {
+     return inner::try_handler (ctx, fntype, is_new_api);
+   };
+ }
+ 
+ tree
+ sorry (Context *ctx, TyTy::FnType *fntype)
+ {
+   rust_sorry_at (fntype->get_locus (), "intrinsic %qs is not yet implemented",
+ 		 fntype->get_identifier ().c_str ());
+ 
+   return error_mark_node;
+ }
+ 
+ tree
+ assume (Context *ctx, TyTy::FnType *fntype)
+ {
+   // TODO: make sure this is actually helping the compiler optimize
+ 
+   rust_assert (fntype->get_params ().size () == 1);
+   rust_assert (fntype->param_at (0).get_type ()->get_kind ()
+ 	       == TyTy::TypeKind::BOOL);
+ 
+   tree lookup = NULL_TREE;
+   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
+     return lookup;
+ 
+   auto fndecl = compile_intrinsic_function (ctx, fntype);
+ 
+   // TODO: make sure these are necessary
+   TREE_READONLY (fndecl) = 0;
+   DECL_DISREGARD_INLINE_LIMITS (fndecl) = 1;
+   DECL_ATTRIBUTES (fndecl) = tree_cons (get_identifier ("always_inline"),
+ 					NULL_TREE, DECL_ATTRIBUTES (fndecl));
+ 
+   std::vector<Bvariable *> param_vars;
+   compile_fn_params (ctx, fntype, fndecl, &param_vars);
+ 
+   if (!Backend::function_set_parameters (fndecl, param_vars))
+     return error_mark_node;
+ 
+   enter_intrinsic_block (ctx, fndecl);
+ 
+   // BUILTIN assume FN BODY BEGIN
+ 
+   tree val = Backend::var_expression (param_vars[0], UNDEF_LOCATION);
+ 
+   tree assume_expr = build_call_expr_internal_loc (UNDEF_LOCATION, IFN_ASSUME,
+ 						   void_type_node, 1, val);
+   TREE_SIDE_EFFECTS (assume_expr) = 1;
+ 
+   ctx->add_statement (assume_expr);
+   // BUILTIN assume FN BODY END
+ 
+   finalize_intrinsic_block (ctx, fndecl);
+ 
+   return fndecl;
+ }
+ 
+ tree
+ discriminant_value (Context *ctx, TyTy::FnType *fntype)
+ {
+   rust_assert (fntype->get_params ().size () == 1);
+   rust_assert (fntype->get_return_type ()->is<TyTy::PlaceholderType> ());
+   rust_assert (fntype->has_substitutions ());
+   rust_assert (fntype->get_num_type_params () == 1);
+   auto &mapping = fntype->get_substs ().at (0);
+   auto param_ty = mapping.get_param_ty ();
+   rust_assert (param_ty->can_resolve ());
+   auto resolved = param_ty->resolve ();
+   auto p = static_cast<TyTy::PlaceholderType *> (fntype->get_return_type ());
+ 
+   TyTy::BaseType *return_type = nullptr;
+   bool ok = ctx->get_tyctx ()->lookup_builtin ("isize", &return_type);
+   rust_assert (ok);
+ 
+   bool is_adt = resolved->is<TyTy::ADTType> ();
+   bool is_enum = false;
+   if (is_adt)
+     {
+       const auto &adt = *static_cast<TyTy::ADTType *> (resolved);
+       return_type = adt.get_repr_options ().repr;
+       rust_assert (return_type != nullptr);
+       is_enum = adt.is_enum ();
+     }
+ 
+   p->set_associated_type (return_type->get_ref ());
+ 
+   tree lookup = NULL_TREE;
+   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
+     return lookup;
+ 
+   auto fndecl = compile_intrinsic_function (ctx, fntype);
+ 
+   std::vector<Bvariable *> param_vars;
+   compile_fn_params (ctx, fntype, fndecl, &param_vars);
+ 
+   if (!Backend::function_set_parameters (fndecl, param_vars))
+     return error_mark_node;
+ 
+   enter_intrinsic_block (ctx, fndecl);
+ 
+   // BUILTIN disriminant_value FN BODY BEGIN
+ 
+   tree result = integer_zero_node;
+   if (is_enum)
+     {
+       tree val = Backend::var_expression (param_vars[0], UNDEF_LOCATION);
+       tree deref = build_fold_indirect_ref_loc (UNKNOWN_LOCATION, val);
+       result = Backend::struct_field_expression (deref, 0, UNKNOWN_LOCATION);
+     }
+ 
+   auto return_statement
+     = Backend::return_statement (fndecl, result, BUILTINS_LOCATION);
+   ctx->add_statement (return_statement);
+ 
+   // BUILTIN disriminant_value FN BODY END
+ 
+   finalize_intrinsic_block (ctx, fndecl);
+ 
+   return fndecl;
+ }
+ 
+ tree
+ variant_count (Context *ctx, TyTy::FnType *fntype)
+ {
+   rust_assert (fntype->get_num_type_params () == 1);
+   auto &mapping = fntype->get_substs ().at (0);
+   auto param_ty = mapping.get_param_ty ();
+   rust_assert (param_ty->can_resolve ());
+   auto resolved = param_ty->resolve ();
+ 
+   size_t variant_count = 0;
+   bool is_adt = resolved->is<TyTy::ADTType> ();
+   if (is_adt)
+     {
+       const auto &adt = *static_cast<TyTy::ADTType *> (resolved);
+       variant_count = adt.number_of_variants ();
+     }
+ 
+   tree lookup = NULL_TREE;
+   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
+     return lookup;
+ 
+   auto fndecl = compile_intrinsic_function (ctx, fntype);
+ 
+   std::vector<Bvariable *> param_vars;
+   compile_fn_params (ctx, fntype, fndecl, &param_vars);
+ 
+   if (!Backend::function_set_parameters (fndecl, param_vars))
+     return error_mark_node;
+ 
+   enter_intrinsic_block (ctx, fndecl);
+ 
+   // BUILTIN disriminant_value FN BODY BEGIN
+   tree result_decl = DECL_RESULT (fndecl);
+   tree type = TREE_TYPE (result_decl);
+ 
+   mpz_t ival;
+   mpz_init_set_ui (ival, variant_count);
+   tree result = wide_int_to_tree (type, wi::from_mpz (type, ival, true));
+   mpz_clear (ival);
+ 
+   auto return_statement
+     = Backend::return_statement (fndecl, result, BUILTINS_LOCATION);
+   ctx->add_statement (return_statement);
+ 
+   // BUILTIN disriminant_value FN BODY END
+ 
+   finalize_intrinsic_block (ctx, fndecl);
+ 
+   return fndecl;
+ }
+ 
+ tree
+ move_val_init (Context *ctx, TyTy::FnType *fntype)
+ {
+   rust_assert (fntype->get_params ().size () == 2);
+ 
+   tree lookup = NULL_TREE;
+   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
+     return lookup;
+ 
+   auto fndecl = compile_intrinsic_function (ctx, fntype);
+ 
+   // Most intrinsic functions are pure - not `move_val_init`
+   TREE_READONLY (fndecl) = 0;
+   TREE_SIDE_EFFECTS (fndecl) = 1;
+ 
+   // get the template parameter type tree fn size_of<T>();
+   rust_assert (fntype->get_num_substitutions () == 1);
+   auto &param_mapping = fntype->get_substs ().at (0);
+   auto param_tyty = param_mapping.get_param_ty ();
+   auto resolved_tyty = param_tyty->resolve ();
+   tree template_parameter_type
+     = TyTyResolveCompile::compile (ctx, resolved_tyty);
+ 
+   std::vector<Bvariable *> param_vars;
+   compile_fn_params (ctx, fntype, fndecl, &param_vars);
+ 
+   if (!Backend::function_set_parameters (fndecl, param_vars))
+     return error_mark_node;
+ 
+   enter_intrinsic_block (ctx, fndecl);
+ 
+   // BUILTIN size_of FN BODY BEGIN
+ 
+   tree dst = Backend::var_expression (param_vars[0], UNDEF_LOCATION);
+   tree src = Backend::var_expression (param_vars[1], UNDEF_LOCATION);
+   tree size = TYPE_SIZE_UNIT (template_parameter_type);
+ 
+   tree memcpy_builtin = error_mark_node;
+   BuiltinsContext::get ().lookup_simple_builtin ("__builtin_memcpy",
+ 						 &memcpy_builtin);
+   rust_assert (memcpy_builtin != error_mark_node);
+ 
+   src = build_fold_addr_expr_loc (BUILTINS_LOCATION, src);
+   tree memset_call = build_call_expr_loc (BUILTINS_LOCATION, memcpy_builtin, 3,
+ 					  dst, src, size);
+ 
+   ctx->add_statement (memset_call);
+   // BUILTIN size_of FN BODY END
+ 
+   finalize_intrinsic_block (ctx, fndecl);
+ 
+   return fndecl;
+ }
+ 
+ tree
+ uninit (Context *ctx, TyTy::FnType *fntype)
+ {
+   // uninit has _zero_ parameters its parameter is the generic one
+   rust_assert (fntype->get_params ().size () == 0);
+ 
+   tree lookup = NULL_TREE;
+   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
+     return lookup;
+ 
+   auto fndecl = compile_intrinsic_function (ctx, fntype);
+ 
+   // Most intrinsic functions are pure - not `uninit_handler`
+   TREE_READONLY (fndecl) = 0;
+   TREE_SIDE_EFFECTS (fndecl) = 1;
+ 
+   // get the template parameter type tree fn uninit<T>();
+   rust_assert (fntype->get_num_substitutions () == 1);
+   auto &param_mapping = fntype->get_substs ().at (0);
+   const auto param_tyty = param_mapping.get_param_ty ();
+   auto resolved_tyty = param_tyty->resolve ();
+   tree template_parameter_type
+     = TyTyResolveCompile::compile (ctx, resolved_tyty);
+ 
+   // result temporary
+   tree dst_type = TREE_TYPE (DECL_RESULT (fndecl));
+   rust_assert (TYPE_SIZE_UNIT (template_parameter_type)
+ 	       == TYPE_SIZE_UNIT (dst_type));
+ 
+   tree tmp_stmt = error_mark_node;
+   Bvariable *bvar
+     = Backend::temporary_variable (fndecl, NULL_TREE, dst_type, NULL_TREE,
+ 				   true /*address_is_taken*/, UNDEF_LOCATION,
+ 				   &tmp_stmt);
+ 
+   enter_intrinsic_block (ctx, fndecl, {bvar});
+ 
+   // BUILTIN size_of FN BODY BEGIN
+ 
+   tree memset_builtin = error_mark_node;
+   BuiltinsContext::get ().lookup_simple_builtin ("__builtin_memset",
+ 						 &memset_builtin);
+   rust_assert (memset_builtin != error_mark_node);
+ 
+   // call memset with 0x01 and size of the thing see
+   // https://github.com/Rust-GCC/gccrs/issues/1899
+ 
+   tree dst = bvar->get_tree (BUILTINS_LOCATION);
+   tree dst_addr = build_fold_addr_expr_loc (BUILTINS_LOCATION, dst);
+   tree constant_byte = build_int_cst (integer_type_node, 0x01);
+   tree size_expr = TYPE_SIZE_UNIT (template_parameter_type);
+ 
+   tree memset_call = build_call_expr_loc (BUILTINS_LOCATION, memset_builtin, 3,
+ 					  dst_addr, constant_byte, size_expr);
+   ctx->add_statement (memset_call);
+ 
+   auto return_statement
+     = Backend::return_statement (fndecl, dst, UNDEF_LOCATION);
+   ctx->add_statement (return_statement);
+   // BUILTIN size_of FN BODY END
+ 
+   finalize_intrinsic_block (ctx, fndecl);
+ 
+   return fndecl;
+ }
+ 
+ tree
+ prefetch_read_data (Context *ctx, TyTy::FnType *fntype)
+ {
+   return prefetch_data (ctx, fntype, Prefetch::Read);
+ }
+ tree
+ prefetch_write_data (Context *ctx, TyTy::FnType *fntype)
+ {
+   return prefetch_data (ctx, fntype, Prefetch::Write);
+ }
+ 
+ tree
+ prefetch_data (Context *ctx, TyTy::FnType *fntype, Prefetch kind)
+ {
+   rust_assert (fntype->get_params ().size () == 2);
+ 
+   tree lookup = NULL_TREE;
+   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
+     return lookup;
+ 
+   auto fndecl = compile_intrinsic_function (ctx, fntype);
+ 
+   // prefetching isn't pure and shouldn't be discarded after GIMPLE
+   TREE_READONLY (fndecl) = 0;
+   TREE_SIDE_EFFECTS (fndecl) = 1;
+ 
+   std::vector<Bvariable *> args;
+   compile_fn_params (ctx, fntype, fndecl, &args);
+ 
+   if (!Backend::function_set_parameters (fndecl, args))
+     return error_mark_node;
+ 
+   enter_intrinsic_block (ctx, fndecl);
+ 
+   auto addr = Backend::var_expression (args[0], UNDEF_LOCATION);
+ 
+   // The core library technically allows you to pass any i32 value as a
+   // locality, but LLVM will then complain if the value cannot be constant
+   // evaluated. For now, we ignore the locality argument and instead always
+   // pass `3` (the most restrictive value). This allows us to still have
+   // prefetch behavior, just not as granular as expected. In future Rust
+   // versions, we hope that prefetch intrinsics will be split up according to
+   // locality, similarly to atomic intrinsics.
+   // The solution is to try and perform constant folding for the locality
+   // argument, or instead of creating a new function definition, modify the call
+   // site directly This has the bad side-effect of creating warnings about
+   // `unused name - locality`, which we hack away here:
+   // TODO: Take care of handling locality properly
+   Backend::var_expression (args[1], UNDEF_LOCATION);
+ 
+   auto rw_flag = make_unsigned_long_tree (kind == Prefetch::Write ? 1 : 0);
+ 
+   auto prefetch_raw = NULL_TREE;
+   auto ok = BuiltinsContext::get ().lookup_simple_builtin ("__builtin_prefetch",
+ 							   &prefetch_raw);
+   rust_assert (ok);
+   auto prefetch = build_fold_addr_expr_loc (UNKNOWN_LOCATION, prefetch_raw);
+ 
+   auto prefetch_call = Backend::call_expression (prefetch,
+ 						 {addr, rw_flag,
+ 						  // locality arg
+ 						  make_unsigned_long_tree (3)},
+ 						 nullptr, UNDEF_LOCATION);
+ 
+   TREE_READONLY (prefetch_call) = 0;
+   TREE_SIDE_EFFECTS (prefetch_call) = 1;
+ 
+   ctx->add_statement (prefetch_call);
+ 
+   finalize_intrinsic_block (ctx, fndecl);
+ 
+   return fndecl;
+ }
+ 
+ tree
+ rotate (Context *ctx, TyTy::FnType *fntype, tree_code op)
+ {
+   // rotate intrinsic has two parameter
+   rust_assert (fntype->get_params ().size () == 2);
+ 
+   tree lookup = NULL_TREE;
+   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
+     return lookup;
+ 
+   auto fndecl = compile_intrinsic_function (ctx, fntype);
+ 
+   // setup the params
+   std::vector<Bvariable *> param_vars;
+   compile_fn_params (ctx, fntype, fndecl, &param_vars);
+ 
+   auto &x_param = param_vars.at (0);
+   auto &y_param = param_vars.at (1);
+   rust_assert (param_vars.size () == 2);
+   if (!Backend::function_set_parameters (fndecl, param_vars))
+     return error_mark_node;
+ 
+   enter_intrinsic_block (ctx, fndecl);
+ 
+   // BUILTIN rotate FN BODY BEGIN
+   tree x = Backend::var_expression (x_param, UNDEF_LOCATION);
+   tree y = Backend::var_expression (y_param, UNDEF_LOCATION);
+   tree rotate_expr
+     = fold_build2_loc (BUILTINS_LOCATION, op, TREE_TYPE (x), x, y);
+   auto return_statement
+     = Backend::return_statement (fndecl, rotate_expr, UNDEF_LOCATION);
+   ctx->add_statement (return_statement);
+   // BUILTIN rotate FN BODY END
+ 
+   finalize_intrinsic_block (ctx, fndecl);
+ 
+   return fndecl;
+ }
+ 
+ tree
+ transmute (Context *ctx, TyTy::FnType *fntype)
+ {
+   // transmute intrinsic has one parameter
+   rust_assert (fntype->get_params ().size () == 1);
+ 
+   tree lookup = NULL_TREE;
+   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
+     return lookup;
+ 
+   auto fndecl = compile_intrinsic_function (ctx, fntype);
+ 
+   std::vector<Bvariable *> param_vars;
+   std::vector<tree_node *> compiled_types;
+   compile_fn_params (ctx, fntype, fndecl, &param_vars, &compiled_types);
+ 
+   if (!Backend::function_set_parameters (fndecl, param_vars))
+     return error_mark_node;
+ 
+   // param to convert
+   Bvariable *convert_me_param = param_vars.at (0);
+   tree convert_me_expr
+     = Backend::var_expression (convert_me_param, UNDEF_LOCATION);
+ 
+   // check for transmute pre-conditions
+   tree target_type_expr = TREE_TYPE (DECL_RESULT (fndecl));
+   tree source_type_expr = compiled_types.at (0);
+   tree target_size_expr = TYPE_SIZE (target_type_expr);
+   tree source_size_expr = TYPE_SIZE (source_type_expr);
+   // for some reason, unit types and other zero-sized types return NULL for the
+   // size expressions
+   unsigned HOST_WIDE_INT target_size
+     = target_size_expr ? TREE_INT_CST_LOW (target_size_expr) : 0;
+   unsigned HOST_WIDE_INT source_size
+     = source_size_expr ? TREE_INT_CST_LOW (source_size_expr) : 0;
+ 
+   // size check for concrete types
+   // TODO(liushuyu): check alignment for pointers; check for dependently-sized
+   // types
+   if (target_size != source_size)
+     {
+       rust_error_at (fntype->get_locus (),
+ 		     "cannot transmute between types of different sizes, or "
+ 		     "dependently-sized types");
+       rust_inform (
+ 	fntype->get_ident ().locus, "source type: %qs (%lu bits)",
+ 	fntype->get_params ().at (0).get_type ()->as_string ().c_str (),
+ 	(unsigned long) source_size);
+       rust_inform (fntype->get_ident ().locus, "target type: %qs (%lu bits)",
+ 		   fntype->get_return_type ()->as_string ().c_str (),
+ 		   (unsigned long) target_size);
+     }
+ 
+   enter_intrinsic_block (ctx, fndecl);
+ 
+   // BUILTIN transmute FN BODY BEGIN
+ 
+   // Return *((orig_type*)&decl)  */
+ 
+   tree t = build_fold_addr_expr_loc (UNKNOWN_LOCATION, convert_me_expr);
+   t = fold_build1_loc (UNKNOWN_LOCATION, NOP_EXPR,
+ 		       build_pointer_type (target_type_expr), t);
+   tree result_expr = build_fold_indirect_ref_loc (UNKNOWN_LOCATION, t);
+ 
+   auto return_statement
+     = Backend::return_statement (fndecl, result_expr, UNDEF_LOCATION);
+   ctx->add_statement (return_statement);
+   // BUILTIN transmute FN BODY END
+ 
+   finalize_intrinsic_block (ctx, fndecl);
+ 
+   return fndecl;
+ }
+ 
+ tree
+ sizeof_handler (Context *ctx, TyTy::FnType *fntype)
+ {
+   // size_of has _zero_ parameters its parameter is the generic one
+   rust_assert (fntype->get_params ().size () == 0);
+ 
+   tree lookup = NULL_TREE;
+   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
+     return lookup;
+ 
+   auto fndecl = compile_intrinsic_function (ctx, fntype);
+ 
+   // get the template parameter type tree fn size_of<T>();
+   rust_assert (fntype->get_num_substitutions () == 1);
+   auto &param_mapping = fntype->get_substs ().at (0);
+   const auto param_tyty = param_mapping.get_param_ty ();
+   auto resolved_tyty = param_tyty->resolve ();
+   tree template_parameter_type
+     = TyTyResolveCompile::compile (ctx, resolved_tyty);
+ 
+   enter_intrinsic_block (ctx, fndecl);
+ 
+   // BUILTIN size_of FN BODY BEGIN
+   tree size_expr = TYPE_SIZE_UNIT (template_parameter_type);
+   auto return_statement
+     = Backend::return_statement (fndecl, size_expr, UNDEF_LOCATION);
+   ctx->add_statement (return_statement);
+   // BUILTIN size_of FN BODY END
+ 
+   finalize_intrinsic_block (ctx, fndecl);
+ 
+   return fndecl;
+ }
+ 
+ tree
+ offset (Context *ctx, TyTy::FnType *fntype)
+ {
+   // offset intrinsic has two params dst pointer and offset isize
+   rust_assert (fntype->get_params ().size () == 2);
+ 
+   auto fndecl = compile_intrinsic_function (ctx, fntype);
+ 
+   std::vector<Bvariable *> param_vars;
+   compile_fn_params (ctx, fntype, fndecl, &param_vars);
+ 
+   auto &dst_param = param_vars.at (0);
+   auto &size_param = param_vars.at (1);
+   rust_assert (param_vars.size () == 2);
+   if (!Backend::function_set_parameters (fndecl, param_vars))
+     return error_mark_node;
+ 
+   enter_intrinsic_block (ctx, fndecl);
+ 
+   // BUILTIN offset FN BODY BEGIN
+   tree dst = Backend::var_expression (dst_param, UNDEF_LOCATION);
+   tree size = Backend::var_expression (size_param, UNDEF_LOCATION);
+   tree pointer_offset_expr
+     = pointer_offset_expression (dst, size, BUILTINS_LOCATION);
+   auto return_statement
+     = Backend::return_statement (fndecl, pointer_offset_expr, UNDEF_LOCATION);
+   ctx->add_statement (return_statement);
+   // BUILTIN offset FN BODY END
+ 
+   finalize_intrinsic_block (ctx, fndecl);
+ 
+   return fndecl;
+ }
+ 
+ /**
+  * pub const fn bswap<T: Copy>(x: T) -> T;
+  */
+ tree
+ bswap_handler (Context *ctx, TyTy::FnType *fntype)
+ {
+   rust_assert (fntype->get_params ().size () == 1);
+ 
+   tree lookup = NULL_TREE;
+   if (check_for_cached_intrinsic (ctx, fntype, &lookup))
+     return lookup;
+ 
+   auto fndecl = compile_intrinsic_function (ctx, fntype);
+ 
+   auto locus = fntype->get_locus ();
+ 
+   std::vector<Bvariable *> param_vars;
+   compile_fn_params (ctx, fntype, fndecl, &param_vars);
+ 
+   auto &x_param = param_vars.at (0);
+   rust_assert (param_vars.size () == 1);
+   if (!Backend::function_set_parameters (fndecl, param_vars))
+     return error_mark_node;
+ 
+   auto *monomorphized_type
+     = fntype->get_substs ().at (0).get_param_ty ()->resolve ();
+ 
+   check_for_basic_integer_type ("bswap", fntype->get_locus (),
+ 				monomorphized_type);
+ 
+   tree template_parameter_type
+     = TyTyResolveCompile::compile (ctx, monomorphized_type);
+ 
+   tree size_expr = TYPE_SIZE_UNIT (template_parameter_type);
+   unsigned HOST_WIDE_INT size = TREE_INT_CST_LOW (size_expr);
+ 
+   enter_intrinsic_block (ctx, fndecl);
+ 
+   // BUILTIN bswap FN BODY BEGIN
+ 
+   auto expr_x = Backend::var_expression (x_param, locus);
+   tree result = NULL_TREE;
+ 
+   if (size == 1)
+     {
+       result = expr_x;
+     }
+   else
+     {
+       tree target_type = NULL_TREE;
+       const char *builtin_name = nullptr;
+       switch (size)
+ 	{
+ 	case 2:
+ 	  builtin_name = "__builtin_bswap16";
+ 	  target_type = uint16_type_node;
+ 	  break;
+ 	case 4:
+ 	  builtin_name = "__builtin_bswap32";
+ 	  target_type = uint32_type_node;
+ 	  break;
+ 	case 8:
+ 	  builtin_name = "__builtin_bswap64";
+ 	  target_type = uint64_type_node;
+ 	  break;
+ 	case 16:
+ 	  builtin_name = "__builtin_bswap128";
+ 	  target_type = uint128_type_node;
+ 	  break;
+ 	default:
+ 	  return error_mark_node;
+ 	}
+ 
+       tree bswap_raw = nullptr;
+       auto ok = BuiltinsContext::get ().lookup_simple_builtin (builtin_name,
+ 							       &bswap_raw);
+ 
+       if (ok)
+ 	{
+ 	  tree bswap_fn = build_fold_addr_expr_loc (locus, bswap_raw);
+ 
+ 	  auto bswap_x = build1 (CONVERT_EXPR, target_type, expr_x);
+ 
+ 	  auto bswap_call
+ 	    = Backend::call_expression (bswap_fn, {bswap_x}, NULL_TREE, locus);
+ 
+ 	  result = build1 (CONVERT_EXPR, template_parameter_type, bswap_call);
+ 	}
+       else
+ 	{
+ 	  auto ok2 = BuiltinsContext::get ().lookup_simple_builtin (
+ 	    "__builtin_bswap64", &bswap_raw);
+ 	  rust_assert (ok2);
+ 
+ 	  tree bswap_fn = build_fold_addr_expr_loc (locus, bswap_raw);
+ 
+ 	  tree tmp_in_stmt = error_mark_node;
+ 	  Bvariable *in_var
+ 	    = Backend::temporary_variable (fndecl, NULL_TREE,
+ 					   template_parameter_type, expr_x,
+ 					   true, locus, &tmp_in_stmt);
+ 	  ctx->add_statement (tmp_in_stmt);
+ 
+ 	  tree addr_x
+ 	    = build_fold_addr_expr_loc (locus, in_var->get_tree (locus));
+ 	  tree u64_ptr_type = build_pointer_type (uint64_type_node);
+ 
+ 	  tree low_ptr = fold_convert (u64_ptr_type, addr_x);
+ 	  tree low = build_fold_indirect_ref_loc (locus, low_ptr);
+ 
+ 	  tree high_ptr = fold_build2 (POINTER_PLUS_EXPR, u64_ptr_type, low_ptr,
+ 				       size_int (8));
+ 	  tree high = build_fold_indirect_ref_loc (locus, high_ptr);
+ 
+ 	  auto new_high
+ 	    = Backend::call_expression (bswap_fn, {low}, NULL_TREE, locus);
+ 	  auto new_low
+ 	    = Backend::call_expression (bswap_fn, {high}, NULL_TREE, locus);
+ 
+ 	  tree tmp_stmt = error_mark_node;
+ 	  Bvariable *result_var
+ 	    = Backend::temporary_variable (fndecl, NULL_TREE,
+ 					   template_parameter_type, NULL_TREE,
+ 					   true, locus, &tmp_stmt);
+ 	  ctx->add_statement (tmp_stmt);
+ 
+ 	  tree addr_res
+ 	    = build_fold_addr_expr_loc (locus, result_var->get_tree (locus));
+ 	  tree res_ptr = fold_convert (u64_ptr_type, addr_res);
+ 
+ 	  tree store_low
+ 	    = build2 (MODIFY_EXPR, void_type_node,
+ 		      build_fold_indirect_ref_loc (locus, res_ptr), new_low);
+ 	  ctx->add_statement (store_low);
+ 
+ 	  tree res_high_ptr = fold_build2 (POINTER_PLUS_EXPR, u64_ptr_type,
+ 					   res_ptr, size_int (8));
+ 	  tree store_high
+ 	    = build2 (MODIFY_EXPR, void_type_node,
+ 		      build_fold_indirect_ref_loc (locus, res_high_ptr),
+ 		      new_high);
+ 	  ctx->add_statement (store_high);
+ 
+ 	  result = result_var->get_tree (locus);
+ 	}
+     }
+ 
+   auto return_statement = Backend::return_statement (fndecl, result, locus);
+ 
+   TREE_READONLY (result) = 1;
+ 
+   ctx->add_statement (return_statement);
+ 
+   // BUILTIN bswap FN BODY END
+ 
+   finalize_intrinsic_block (ctx, fndecl);
+ 
+   return fndecl;
+ }
+ 
+ } // namespace handlers
+ } // namespace Compile
+ } // namespace Rust
diff -Nrcpad gcc-16-20260315/gcc/rust/backend/rust-intrinsic-handlers.h gcc-16-20260322/gcc/rust/backend/rust-intrinsic-handlers.h
*** gcc-16-20260315/gcc/rust/backend/rust-intrinsic-handlers.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/rust/backend/rust-intrinsic-handlers.h	Sun Mar 22 22:32:07 2026
***************
*** 0 ****
--- 1,95 ----
+ // Copyright (C) 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/>.
+ 
+ #ifndef RUST_INTRINSIC_HANDLERS_H
+ #define RUST_INTRINSIC_HANDLERS_H
+ 
+ #include "rust-compile-context.h"
+ 
+ namespace Rust {
+ namespace Compile {
+ 
+ enum class Prefetch
+ {
+   Read,
+   Write
+ };
+ 
+ namespace handlers {
+ 
+ namespace inner {
+ tree wrapping_op (Context *ctx, TyTy::FnType *fntype, tree_code op);
+ 
+ tree atomic_store (Context *ctx, TyTy::FnType *fntype, int ordering);
+ tree atomic_load (Context *ctx, TyTy::FnType *fntype, int ordering);
+ inline tree copy (Context *ctx, TyTy::FnType *fntype, bool overlaps);
+ inline tree expect (Context *ctx, TyTy::FnType *fntype, bool likely);
+ tree try_handler (Context *ctx, TyTy::FnType *fntype, bool is_new_api);
+ 
+ tree op_with_overflow (Context *ctx, TyTy::FnType *fntype, tree_code op);
+ 
+ inline tree unchecked_op (Context *ctx, TyTy::FnType *fntype, tree_code op);
+ 
+ } // namespace inner
+ 
+ using HandlerBuilder = std::function<tree (Context *, TyTy::FnType *)>;
+ 
+ const HandlerBuilder op_with_overflow (tree_code op);
+ 
+ tree rotate_left (Context *ctx, TyTy::FnType *fntype);
+ tree rotate_right (Context *ctx, TyTy::FnType *fntype);
+ 
+ const HandlerBuilder wrapping_op (tree_code op);
+ tree offset (Context *ctx, TyTy::FnType *fntype);
+ tree sizeof_handler (Context *ctx, TyTy::FnType *fntype);
+ tree transmute (Context *ctx, TyTy::FnType *fntype);
+ tree rotate (Context *ctx, TyTy::FnType *fntype, tree_code op);
+ tree uninit (Context *ctx, TyTy::FnType *fntype);
+ tree move_val_init (Context *ctx, TyTy::FnType *fntype);
+ tree assume (Context *ctx, TyTy::FnType *fntype);
+ tree discriminant_value (Context *ctx, TyTy::FnType *fntype);
+ tree variant_count (Context *ctx, TyTy::FnType *fntype);
+ tree bswap_handler (Context *ctx, TyTy::FnType *fntype);
+ 
+ tree prefetch_data (Context *ctx, TyTy::FnType *fntype, Prefetch kind);
+ 
+ const std::function<tree (Context *, TyTy::FnType *)>
+ wrapping_op (tree_code op);
+ 
+ HandlerBuilder atomic_store (int ordering);
+ 
+ HandlerBuilder atomic_load (int ordering);
+ 
+ const HandlerBuilder unchecked_op (tree_code op);
+ 
+ const HandlerBuilder copy (bool overlaps);
+ 
+ const HandlerBuilder expect (bool likely);
+ 
+ const HandlerBuilder try_handler (bool is_new_api);
+ 
+ tree prefetch_read_data (Context *ctx, TyTy::FnType *fntype);
+ tree prefetch_write_data (Context *ctx, TyTy::FnType *fntype);
+ tree sorry (Context *ctx, TyTy::FnType *fntype);
+ 
+ } // namespace handlers
+ 
+ } // namespace Compile
+ } // namespace Rust
+ 
+ #endif /* ! RUST_INTRINSIC_HANDLERS_H */
diff -Nrcpad gcc-16-20260315/gcc/rust/checks/errors/feature/contrib/copyright-stub.h gcc-16-20260322/gcc/rust/checks/errors/feature/contrib/copyright-stub.h
*** gcc-16-20260315/gcc/rust/checks/errors/feature/contrib/copyright-stub.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/checks/errors/feature/contrib/copyright-stub.h	Sun Mar 22 22:32:07 2026
***************
*** 17,19 ****
--- 17,21 ----
  // <http://www.gnu.org/licenses/>.
  
  // AUTO-GENERATED -- SEE LOCAL contrib SUBDIRECTORY
+ 
+ #include "rust-feature-defs-rfl.h"
diff -Nrcpad gcc-16-20260315/gcc/rust/checks/errors/feature/contrib/fetch gcc-16-20260322/gcc/rust/checks/errors/feature/contrib/fetch
*** gcc-16-20260315/gcc/rust/checks/errors/feature/contrib/fetch	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/checks/errors/feature/contrib/fetch	Sun Mar 22 22:32:07 2026
*************** RUST_VERSION="1.49.0"
*** 27,30 ****
  URL_PREFIX='https://raw.githubusercontent.com/rust-lang/rust/refs/tags'
  URL_TEMPLATE="$URL_PREFIX/$RUST_VERSION/compiler/rustc_feature/src"
  
! wget -O $1 "$URL_TEMPLATE"/{accepted,active,removed}.rs
--- 27,30 ----
  URL_PREFIX='https://raw.githubusercontent.com/rust-lang/rust/refs/tags'
  URL_TEMPLATE="$URL_PREFIX/$RUST_VERSION/compiler/rustc_feature/src"
  
! wget -O $1 "$URL_TEMPLATE/accepted.rs" "$URL_TEMPLATE/active.rs" "$URL_TEMPLATE/removed.rs"
diff -Nrcpad gcc-16-20260315/gcc/rust/checks/errors/feature/rust-feature-collector.cc gcc-16-20260322/gcc/rust/checks/errors/feature/rust-feature-collector.cc
*** gcc-16-20260315/gcc/rust/checks/errors/feature/rust-feature-collector.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/rust/checks/errors/feature/rust-feature-collector.cc	Sun Mar 22 22:32:07 2026
***************
*** 0 ****
--- 1,117 ----
+ // Copyright (C) 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 "rust-feature-collector.h"
+ #include "rust-attribute-values.h"
+ 
+ namespace Rust {
+ namespace Features {
+ 
+ FeatureCollector::FeatureCollector () : features (CrateFeatures{UNKNOWN_NODEID})
+ {}
+ 
+ CrateFeatures
+ FeatureCollector::collect (AST::Crate &crate)
+ {
+   features.valid_lang_features.clear ();
+   features.valid_lib_features.clear ();
+   features.crate_id = crate.get_node_id ();
+ 
+   visit (crate);
+ 
+   return features;
+ }
+ 
+ namespace {
+ bool
+ is_feature_attribute (const AST::Attribute &attribute)
+ {
+   return Values::Attributes::FEATURE == attribute.get_path ().as_string ();
+ }
+ 
+ // check for empty feature, such as `#![feature], this is an error
+ bool
+ is_valid_feature_attribute (const AST::Attribute &attribute)
+ {
+   return !attribute.empty_input ();
+ }
+ } // namespace
+ 
+ void
+ FeatureCollector::add_features_from_token_tree (
+   const AST::DelimTokenTree &delim_ttree)
+ {
+   std::unique_ptr<AST::AttrInputMetaItemContainer> meta_item (
+     delim_ttree.parse_to_meta_item ());
+   add_features_from_meta_item_container (*meta_item);
+ }
+ 
+ void
+ FeatureCollector::add_features_from_meta_item_container (
+   const AST::AttrInputMetaItemContainer &meta_item_container)
+ {
+   for (const auto &item : meta_item_container.get_items ())
+     {
+       const auto &name_str = item->as_string ();
+ 
+       // TODO: detect duplicates
+       if (auto tname = Feature::as_name (name_str))
+ 	features.valid_lang_features.insert (*tname);
+       else
+ 	features.valid_lib_features.emplace (name_str, item->get_locus ());
+     }
+ }
+ 
+ void
+ FeatureCollector::identify_feature (const AST::Attribute &attribute)
+ {
+   if (is_feature_attribute (attribute))
+     {
+       if (!is_valid_feature_attribute (attribute))
+ 	{
+ 	  rust_error_at (attribute.get_locus (), ErrorCode::E0556,
+ 			 "malformed %<feature%> attribute input");
+ 	  return;
+ 	}
+       const auto &attr_input = attribute.get_attr_input ();
+       auto type = attr_input.get_attr_input_type ();
+       if (type == AST::AttrInput::AttrInputType::TOKEN_TREE)
+ 	{
+ 	  const auto &delim_ttree = static_cast<const AST::DelimTokenTree &> (
+ 	    attribute.get_attr_input ());
+ 	  add_features_from_token_tree (delim_ttree);
+ 	}
+       else if (type == AST::AttrInput::AttrInputType::META_ITEM)
+ 	{
+ 	  // We can find a meta item in #[cfg(toto),feature(xxxx)]
+ 	  const auto &meta_item_container
+ 	    = static_cast<const AST::AttrInputMetaItemContainer &> (attr_input);
+ 	  add_features_from_meta_item_container (meta_item_container);
+ 	}
+     }
+ }
+ 
+ void
+ FeatureCollector::visit (AST::Crate &crate)
+ {
+   for (const auto &attribute : crate.inner_attrs)
+     identify_feature (attribute);
+ }
+ 
+ } // namespace Features
+ } // namespace Rust
diff -Nrcpad gcc-16-20260315/gcc/rust/checks/errors/feature/rust-feature-collector.h gcc-16-20260322/gcc/rust/checks/errors/feature/rust-feature-collector.h
*** gcc-16-20260315/gcc/rust/checks/errors/feature/rust-feature-collector.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/rust/checks/errors/feature/rust-feature-collector.h	Sun Mar 22 22:32:07 2026
***************
*** 0 ****
--- 1,62 ----
+ // Copyright (C) 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/>.
+ #ifndef RUST_FEATURE_COLLECTOR_H
+ #define RUST_FEATURE_COLLECTOR_H
+ 
+ #include "rust-feature.h"
+ #include "rust-ast-visitor.h"
+ 
+ namespace Rust {
+ namespace Features {
+ 
+ /** Helper structure gathering all features enabled within a given crate
+  * using the #![feature(XXXXX)] syntax.
+  **/
+ struct CrateFeatures
+ {
+   // The node id identifying the crate those features belong to.
+   NodeId crate_id;
+   // Language features that have been declared within the crate.
+   std::set<Feature::Name> valid_lang_features;
+   // Library features that have been declared within the crate.
+   std::map<std::string, location_t> valid_lib_features;
+ 
+   CrateFeatures (NodeId crate_id) : crate_id (crate_id) {}
+ };
+ 
+ class FeatureCollector : public AST::DefaultASTVisitor
+ {
+ public:
+   FeatureCollector ();
+ 
+   CrateFeatures collect (AST::Crate &crate);
+ 
+ private:
+   CrateFeatures features;
+ 
+   using AST::DefaultASTVisitor::visit;
+   void visit (AST::Crate &crate) override;
+   void identify_feature (const AST::Attribute &attribute);
+   void add_features_from_token_tree (const AST::DelimTokenTree &delim_ttree);
+   void add_features_from_meta_item_container (
+     const AST::AttrInputMetaItemContainer &meta_item_container);
+ };
+ } // namespace Features
+ } // namespace Rust
+ 
+ #endif /* ! RUST_FEATURE_COLLECTOR_H */
diff -Nrcpad gcc-16-20260315/gcc/rust/checks/errors/feature/rust-feature-defs-rfl.h gcc-16-20260322/gcc/rust/checks/errors/feature/rust-feature-defs-rfl.h
*** gcc-16-20260315/gcc/rust/checks/errors/feature/rust-feature-defs-rfl.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/rust/checks/errors/feature/rust-feature-defs-rfl.h	Sun Mar 22 22:32:07 2026
***************
*** 0 ****
--- 1,26 ----
+ // Copyright (C) 2025-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/>.
+ 
+ /* Included by auto-generated rust-feature-defs.h
+  *
+  * This file gathers the features required for rust-for-linux that were not
+  * available in the version targeted by the compiler.
+  */
+ 
+ FEATURE_ACTIVE ("extended_key_value_attributes", EXTENDED_KEY_VALUE_ATTRIBUTES,
+ 		"1.50.0", ISSUE_SOME (78835), EDITION_NONE)
diff -Nrcpad gcc-16-20260315/gcc/rust/checks/errors/feature/rust-feature-defs.h gcc-16-20260322/gcc/rust/checks/errors/feature/rust-feature-defs.h
*** gcc-16-20260315/gcc/rust/checks/errors/feature/rust-feature-defs.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/checks/errors/feature/rust-feature-defs.h	Sun Mar 22 22:32:07 2026
***************
*** 18,23 ****
--- 18,25 ----
  
  // AUTO-GENERATED -- SEE LOCAL contrib SUBDIRECTORY
  
+ #include "rust-feature-defs-rfl.h"
+ 
  FEATURE_ACCEPTED ("issue_5723_bootstrap", ISSUE_5723_BOOTSTRAP, "1.0.0",
  		  ISSUE_NONE)
  FEATURE_ACCEPTED ("test_accepted_feature", TEST_ACCEPTED_FEATURE, "1.0.0",
diff -Nrcpad gcc-16-20260315/gcc/rust/checks/errors/feature/rust-feature-gate.cc gcc-16-20260322/gcc/rust/checks/errors/feature/rust-feature-gate.cc
*** gcc-16-20260315/gcc/rust/checks/errors/feature/rust-feature-gate.cc	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/checks/errors/feature/rust-feature-gate.cc	Sun Mar 22 22:32:07 2026
***************
*** 19,96 ****
  #include "rust-feature-gate.h"
  #include "rust-abi.h"
  #include "rust-attribute-values.h"
  #include "rust-ast-visitor.h"
  #include "rust-feature.h"
  #include "rust-ast-full.h"
  
  namespace Rust {
  
  void
  FeatureGate::check (AST::Crate &crate)
  {
    visit (crate);
  }
  
  void
  FeatureGate::visit (AST::Crate &crate)
  {
-   valid_lang_features.clear ();
-   valid_lib_features.clear ();
- 
-   // avoid clearing defined features (?)
- 
-   for (const auto &attr : crate.inner_attrs)
-     {
-       if (attr.get_path ().as_string () == "feature")
- 	{
- 	  // check for empty feature, such as `#![feature], this is an error
- 	  if (attr.empty_input ())
- 	    {
- 	      rust_error_at (attr.get_locus (), ErrorCode::E0556,
- 			     "malformed %<feature%> attribute input");
- 	      continue;
- 	    }
- 	  const auto &attr_input = attr.get_attr_input ();
- 	  auto type = attr_input.get_attr_input_type ();
- 	  if (type == AST::AttrInput::AttrInputType::TOKEN_TREE)
- 	    {
- 	      const auto &option = static_cast<const AST::DelimTokenTree &> (
- 		attr.get_attr_input ());
- 	      std::unique_ptr<AST::AttrInputMetaItemContainer> meta_item (
- 		option.parse_to_meta_item ());
- 	      for (const auto &item : meta_item->get_items ())
- 		{
- 		  const auto &name_str = item->as_string ();
- 
- 		  // TODO: detect duplicates
- 		  if (auto tname = Feature::as_name (name_str))
- 		    valid_lang_features.insert (tname.value ());
- 		  else
- 		    valid_lib_features.emplace (name_str, item->get_locus ());
- 		}
- 	    }
- 	  else if (type == AST::AttrInput::AttrInputType::META_ITEM)
- 	    {
- 	      const auto &meta_item
- 		= static_cast<const AST::AttrInputMetaItemContainer &> (
- 		  attr_input);
- 	      for (const auto &item : meta_item.get_items ())
- 		{
- 		  const auto &name_str = item->as_string ();
- 
- 		  // TODO: detect duplicates
- 		  if (auto tname = Feature::as_name (name_str))
- 		    valid_lang_features.insert (tname.value ());
- 		  else
- 		    valid_lib_features.emplace (name_str, item->get_locus ());
- 		}
- 	    }
- 	}
-     }
- 
    AST::DefaultASTVisitor::visit (crate);
  
!   for (auto &ent : valid_lib_features)
      {
        const std::string &feature = ent.first;
        location_t locus = ent.second;
--- 19,50 ----
  #include "rust-feature-gate.h"
  #include "rust-abi.h"
  #include "rust-attribute-values.h"
+ #include "rust-attributes.h"
  #include "rust-ast-visitor.h"
  #include "rust-feature.h"
  #include "rust-ast-full.h"
+ #include "rust-feature-store.h"
  
  namespace Rust {
  
  void
  FeatureGate::check (AST::Crate &crate)
  {
+   auto &store = Features::EarlyFeatureGateStore::get ();
+   while (store.has_error ())
+     {
+       auto pair = store.get_error ();
+       gate (pair.first, pair.second.locus, pair.second.message);
+     }
    visit (crate);
  }
  
  void
  FeatureGate::visit (AST::Crate &crate)
  {
    AST::DefaultASTVisitor::visit (crate);
  
!   for (auto &ent : features.valid_lib_features)
      {
        const std::string &feature = ent.first;
        location_t locus = ent.second;
*************** FeatureGate::visit (AST::Crate &crate)
*** 109,121 ****
        rust_error_at (locus, ErrorCode::E0635, "unknown feature %qs",
  		     feature.c_str ());
      }
  }
  
  void
  FeatureGate::gate (Feature::Name name, location_t loc,
  		   const std::string &error_msg)
  {
!   if (!valid_lang_features.count (name))
      {
        auto &feature = Feature::lookup (name);
        if (auto issue = feature.issue ())
--- 63,76 ----
        rust_error_at (locus, ErrorCode::E0635, "unknown feature %qs",
  		     feature.c_str ());
      }
+   check_no_core_attribute (crate.inner_attrs);
  }
  
  void
  FeatureGate::gate (Feature::Name name, location_t loc,
  		   const std::string &error_msg)
  {
!   if (!features.valid_lang_features.count (name))
      {
        auto &feature = Feature::lookup (name);
        if (auto issue = feature.issue ())
*************** FeatureGate::visit (AST::ExternBlock &bl
*** 155,160 ****
--- 110,127 ----
  }
  
  void
+ FeatureGate::check_no_core_attribute (
+   const std::vector<AST::Attribute> &attributes)
+ {
+   for (const AST::Attribute &attr : attributes)
+     {
+       if (attr.get_path ().as_string () == Values::Attributes::NO_CORE)
+ 	gate (Feature::Name::NO_CORE, attr.get_locus (),
+ 	      "no_core is experimental");
+     }
+ }
+ 
+ void
  FeatureGate::check_rustc_attri (const std::vector<AST::Attribute> &attributes)
  {
    for (const AST::Attribute &attr : attributes)
diff -Nrcpad gcc-16-20260315/gcc/rust/checks/errors/feature/rust-feature-gate.h gcc-16-20260322/gcc/rust/checks/errors/feature/rust-feature-gate.h
*** gcc-16-20260315/gcc/rust/checks/errors/feature/rust-feature-gate.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/checks/errors/feature/rust-feature-gate.h	Sun Mar 22 22:32:07 2026
***************
*** 20,33 ****
  #define RUST_FEATURE_GATE_H
  
  #include "rust-ast-visitor.h"
! #include "rust-feature.h"
  
  namespace Rust {
  
  class FeatureGate : public AST::DefaultASTVisitor
  {
  public:
!   FeatureGate () {}
  
    using AST::DefaultASTVisitor::visit;
  
--- 20,33 ----
  #define RUST_FEATURE_GATE_H
  
  #include "rust-ast-visitor.h"
! #include "rust-feature-collector.h"
  
  namespace Rust {
  
  class FeatureGate : public AST::DefaultASTVisitor
  {
  public:
!   FeatureGate (Features::CrateFeatures &features) : features (features) {}
  
    using AST::DefaultASTVisitor::visit;
  
*************** public:
*** 54,59 ****
--- 54,60 ----
  
  private:
    void gate (Feature::Name name, location_t loc, const std::string &error_msg);
+   void check_no_core_attribute (const std::vector<AST::Attribute> &attributes);
    void check_rustc_attri (const std::vector<AST::Attribute> &attributes);
    void
    check_may_dangle_attribute (const std::vector<AST::Attribute> &attributes);
*************** private:
*** 61,68 ****
    check_lang_item_attribute (const std::vector<AST::Attribute> &attributes);
    void note_stability_attribute (const std::vector<AST::Attribute> &attributes);
  
!   std::set<Feature::Name> valid_lang_features;
!   std::map<std::string, location_t> valid_lib_features;
  
    enum class Stability
    {
--- 62,68 ----
    check_lang_item_attribute (const std::vector<AST::Attribute> &attributes);
    void note_stability_attribute (const std::vector<AST::Attribute> &attributes);
  
!   Features::CrateFeatures &features;
  
    enum class Stability
    {
diff -Nrcpad gcc-16-20260315/gcc/rust/checks/errors/feature/rust-feature-store.cc gcc-16-20260322/gcc/rust/checks/errors/feature/rust-feature-store.cc
*** gcc-16-20260315/gcc/rust/checks/errors/feature/rust-feature-store.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/rust/checks/errors/feature/rust-feature-store.cc	Sun Mar 22 22:32:07 2026
***************
*** 0 ****
--- 1,47 ----
+ 
+ // Copyright (C) 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 "rust-feature-store.h"
+ 
+ namespace Rust {
+ namespace Features {
+ 
+ EarlyFeatureGateStore &
+ EarlyFeatureGateStore::get ()
+ {
+   static EarlyFeatureGateStore instance{};
+   return instance;
+ }
+ 
+ void
+ EarlyFeatureGateStore::add (Feature::Name name, Error error)
+ {
+   potential_errors.emplace (name, error);
+ }
+ 
+ std::pair<Feature::Name, Error>
+ EarlyFeatureGateStore::get_error ()
+ {
+   auto ret = potential_errors.front ();
+   potential_errors.pop ();
+   return ret;
+ }
+ 
+ } // namespace Features
+ } // namespace Rust
diff -Nrcpad gcc-16-20260315/gcc/rust/checks/errors/feature/rust-feature-store.h gcc-16-20260322/gcc/rust/checks/errors/feature/rust-feature-store.h
*** gcc-16-20260315/gcc/rust/checks/errors/feature/rust-feature-store.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/rust/checks/errors/feature/rust-feature-store.h	Sun Mar 22 22:32:07 2026
***************
*** 0 ****
--- 1,51 ----
+ // Copyright (C) 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/>.
+ 
+ #ifndef RUST_FEATURE_STORE_H
+ #define RUST_FEATURE_STORE_H
+ 
+ #include "rust-system.h"
+ #include "rust-diagnostics.h"
+ #include "rust-feature.h"
+ 
+ namespace Rust {
+ 
+ namespace Features {
+ 
+ /**
+  * We don't know the whole set of valid features until a crate has been parsed.
+  * We're collecting in this store all the potential feature errors and check
+  * them later.
+  */
+ class EarlyFeatureGateStore
+ {
+   std::queue<std::pair<Feature::Name, Error>> potential_errors;
+ 
+ public:
+   static EarlyFeatureGateStore &get ();
+   void add (Feature::Name name, Error error);
+ 
+   bool has_error () { return !potential_errors.empty (); }
+ 
+   std::pair<Feature::Name, Error> get_error ();
+ };
+ } // namespace Features
+ 
+ } // namespace Rust
+ 
+ #endif // ! RUST_FEATURE_STORE_H
diff -Nrcpad gcc-16-20260315/gcc/rust/checks/errors/rust-unsafe-checker.cc gcc-16-20260322/gcc/rust/checks/errors/rust-unsafe-checker.cc
*** gcc-16-20260315/gcc/rust/checks/errors/rust-unsafe-checker.cc	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/checks/errors/rust-unsafe-checker.cc	Sun Mar 22 22:32:07 2026
***************
*** 24,29 ****
--- 24,30 ----
  #include "rust-attribute-values.h"
  #include "rust-system.h"
  #include "rust-immutable-name-resolution-context.h"
+ #include "rust-intrinsic-values.h"
  
  // for flag_name_resolution_2_0
  #include "options.h"
*************** check_unsafe_call (HIR::Function *fn, lo
*** 95,136 ****
  static bool
  is_safe_intrinsic (const std::string &fn_name)
  {
    static const std::unordered_set<std::string> safe_intrinsics = {
!     "abort",
!     "size_of",
!     "min_align_of",
!     "needs_drop",
!     "caller_location",
!     "add_with_overflow",
!     "sub_with_overflow",
!     "mul_with_overflow",
!     "wrapping_add",
!     "wrapping_sub",
!     "wrapping_mul",
!     "saturating_add",
!     "saturating_sub",
!     "rotate_left",
!     "rotate_right",
!     "ctpop",
!     "ctlz",
!     "cttz",
!     "bswap",
!     "bitreverse",
!     "discriminant_value",
!     "type_id",
!     "likely",
!     "unlikely",
!     "ptr_guaranteed_eq",
!     "ptr_guaranteed_ne",
!     "minnumf32",
!     "minnumf64",
!     "maxnumf32",
!     "rustc_peek",
!     "maxnumf64",
!     "type_name",
!     "forget",
!     "black_box",
!     "variant_count",
    };
  
    return safe_intrinsics.find (fn_name) != safe_intrinsics.end ();
--- 96,139 ----
  static bool
  is_safe_intrinsic (const std::string &fn_name)
  {
+   using Intrinsics = Values::Intrinsics;
+ 
    static const std::unordered_set<std::string> safe_intrinsics = {
!     Intrinsics::ABORT,
!     Intrinsics::SIZE_OF,
!     Intrinsics::MIN_ALIGN_OF,
!     Intrinsics::NEEDS_DROP,
!     Intrinsics::CALLER_LOCATION,
!     Intrinsics::ADD_WITH_OVERFLOW,
!     Intrinsics::SUB_WITH_OVERFLOW,
!     Intrinsics::MUL_WITH_OVERFLOW,
!     Intrinsics::WRAPPING_ADD,
!     Intrinsics::WRAPPING_SUB,
!     Intrinsics::WRAPPING_MUL,
!     Intrinsics::SATURATING_ADD,
!     Intrinsics::SATURATING_SUB,
!     Intrinsics::ROTATE_LEFT,
!     Intrinsics::ROTATE_RIGHT,
!     Intrinsics::CTPOP,
!     Intrinsics::CTLZ,
!     Intrinsics::CTTZ,
!     Intrinsics::BSWAP,
!     Intrinsics::BITREVERSE,
!     Intrinsics::DISCRIMINANT_VALUE,
!     Intrinsics::TYPE_ID,
!     Intrinsics::LIKELY,
!     Intrinsics::UNLIKELY,
!     Intrinsics::PTR_GUARANTEED_EQ,
!     Intrinsics::PTR_GUARANTEED_NE,
!     Intrinsics::MINNUMF32,
!     Intrinsics::MINNUMF64,
!     Intrinsics::MAXNUMF32,
!     Intrinsics::MAXNUMF64,
!     Intrinsics::RUSTC_PEEK,
!     Intrinsics::TYPE_NAME,
!     Intrinsics::FORGET,
!     Intrinsics::BLACK_BOX,
!     Intrinsics::VARIANT_COUNT,
    };
  
    return safe_intrinsics.find (fn_name) != safe_intrinsics.end ();
diff -Nrcpad gcc-16-20260315/gcc/rust/checks/lints/rust-lint-scan-deadcode.h gcc-16-20260322/gcc/rust/checks/lints/rust-lint-scan-deadcode.h
*** gcc-16-20260315/gcc/rust/checks/lints/rust-lint-scan-deadcode.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/checks/lints/rust-lint-scan-deadcode.h	Sun Mar 22 22:32:07 2026
*************** public:
*** 51,57 ****
    void visit (HIR::Function &function) override
    {
      HirId hirId = function.get_mappings ().get_hirid ();
!     if (should_warn (hirId) && !function.get_visibility ().is_public ())
        {
  	if (mappings.is_impl_item (hirId))
  	  {
--- 51,60 ----
    void visit (HIR::Function &function) override
    {
      HirId hirId = function.get_mappings ().get_hirid ();
!     auto starts_with_underscore
!       = function.get_function_name ().as_string ().rfind ('_', 0) == 0;
!     if (should_warn (hirId) && !function.get_visibility ().is_public ()
! 	&& !starts_with_underscore)
        {
  	if (mappings.is_impl_item (hirId))
  	  {
diff -Nrcpad gcc-16-20260315/gcc/rust/checks/lints/rust-lint-unused-var.cc gcc-16-20260322/gcc/rust/checks/lints/rust-lint-unused-var.cc
*** gcc-16-20260315/gcc/rust/checks/lints/rust-lint-unused-var.cc	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/checks/lints/rust-lint-unused-var.cc	Sun Mar 22 22:32:07 2026
***************
*** 22,27 ****
--- 22,36 ----
  namespace Rust {
  namespace Analysis {
  
+ static bool
+ starts_with_underscore (const char *var_name)
+ {
+   auto pos = std::string (var_name).find_last_of (':');
+   if (pos == std::string::npos)
+     return strncmp (var_name, "_", 1) == 0;
+   return strncmp (var_name + pos + 1, "_", 1) == 0;
+ }
+ 
  static void
  check_decl (tree *t)
  {
*************** check_decl (tree *t)
*** 30,36 ****
  
    tree var_name = DECL_NAME (*t);
    const char *var_name_ptr = IDENTIFIER_POINTER (var_name);
!   bool starts_with_under_score = strncmp (var_name_ptr, "_", 1) == 0;
    bool is_self = strcmp (var_name_ptr, "self") == 0;
  
    bool is_constant = TREE_CODE (*t) == CONST_DECL;
--- 39,45 ----
  
    tree var_name = DECL_NAME (*t);
    const char *var_name_ptr = IDENTIFIER_POINTER (var_name);
!   bool starts_with_under_score = starts_with_underscore (var_name_ptr);
    bool is_self = strcmp (var_name_ptr, "self") == 0;
  
    bool is_constant = TREE_CODE (*t) == CONST_DECL;
diff -Nrcpad gcc-16-20260315/gcc/rust/expand/rust-cfg-strip.cc gcc-16-20260322/gcc/rust/expand/rust-cfg-strip.cc
*** gcc-16-20260315/gcc/rust/expand/rust-cfg-strip.cc	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/expand/rust-cfg-strip.cc	Sun Mar 22 22:32:07 2026
*************** namespace Rust {
*** 28,54 ****
  
  /**
   * Determines whether any cfg predicate is false and hence item with attributes
-  * should be stripped. Note that attributes must be expanded before calling.
-  */
- bool
- CfgStrip::fails_cfg (const AST::AttrVec &attrs) const
- {
-   auto &session = Session::get_instance ();
- 
-   for (const auto &attr : attrs)
-     {
-       if (attr.get_path () == Values::Attributes::CFG
- 	  && !attr.check_cfg_predicate (session))
- 	return true;
-       else if (!expansion_cfg.should_test
- 	       && attr.get_path () == Values::Attributes::TEST)
- 	return true;
-     }
-   return false;
- }
- 
- /**
-  * Determines whether any cfg predicate is false and hence item with attributes
   * should be stripped. Will expand attributes as well.
   */
  bool
--- 28,33 ----
*************** expand_cfg_attrs (AST::AttrVec &attrs)
*** 114,119 ****
--- 93,101 ----
  
  	  if (attr.check_cfg_predicate (session))
  	    {
+ 	      // Key has been found we need to remove the conditional part of
+ 	      // the attribute and insert the content back
+ 
  	      // split off cfg_attr
  	      AST::AttrVec new_attrs = attr.separate_cfg_attrs ();
  
*************** expand_cfg_attrs (AST::AttrVec &attrs)
*** 131,136 ****
--- 113,124 ----
  	       */
  	      i--;
  	    }
+ 	  else
+ 	    {
+ 	      // Key has not been found, remove the whole attribute
+ 	      attrs.erase (attrs.begin () + i);
+ 	      i--;
+ 	    }
  
  	  /* do something - if feature (first token in tree) is in fact enabled,
  	   * make tokens listed afterwards into attributes. i.e.: for
diff -Nrcpad gcc-16-20260315/gcc/rust/expand/rust-cfg-strip.h gcc-16-20260322/gcc/rust/expand/rust-cfg-strip.h
*** gcc-16-20260315/gcc/rust/expand/rust-cfg-strip.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/expand/rust-cfg-strip.h	Sun Mar 22 22:32:07 2026
***************
*** 24,29 ****
--- 24,31 ----
  
  namespace Rust {
  
+ void expand_cfg_attrs (AST::AttrVec &attrs);
+ 
  // forward declare
  struct ExpansionCfg;
  
*************** struct ExpansionCfg;
*** 31,38 ****
  class CfgStrip : public AST::DefaultASTVisitor
  {
  private:
-   bool fails_cfg (const AST::AttrVec &attrs) const;
- 
    bool fails_cfg_with_expand (AST::AttrVec &attrs) const;
  
  public:
--- 33,38 ----
diff -Nrcpad gcc-16-20260315/gcc/rust/expand/rust-derive-cmp-common.cc gcc-16-20260322/gcc/rust/expand/rust-derive-cmp-common.cc
*** gcc-16-20260315/gcc/rust/expand/rust-derive-cmp-common.cc	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/expand/rust-derive-cmp-common.cc	Sun Mar 22 22:32:07 2026
*************** EnumMatchBuilder::tuple (EnumItem &varia
*** 96,104 ****
        });
      }
  
-   // TODO: Replace with `reconstruct()` instead of building these twice
    auto self_variant_path = builder.variant_path (enum_path, variant_path);
!   auto other_variant_path = builder.variant_path (enum_path, variant_path);
  
    auto self_pattern_items = std::unique_ptr<TupleStructItems> (
      new TupleStructItemsNoRest (std::move (self_patterns)));
--- 96,103 ----
        });
      }
  
    auto self_variant_path = builder.variant_path (enum_path, variant_path);
!   auto other_variant_path = self_variant_path.reconstruct ();
  
    auto self_pattern_items = std::unique_ptr<TupleStructItems> (
      new TupleStructItemsNoRest (std::move (self_patterns)));
*************** EnumMatchBuilder::tuple (EnumItem &varia
*** 111,117 ****
  			  false, false, builder.loc));
    auto other_pattern = std::unique_ptr<Pattern> (new ReferencePattern (
      std::unique_ptr<Pattern> (new TupleStructPattern (
!       other_variant_path, std::move (other_pattern_items))),
      false, false, builder.loc));
  
    auto tuple_items = std::make_unique<TuplePatternItemsNoRest> (
--- 110,116 ----
  			  false, false, builder.loc));
    auto other_pattern = std::unique_ptr<Pattern> (new ReferencePattern (
      std::unique_ptr<Pattern> (new TupleStructPattern (
!       *other_variant_path, std::move (other_pattern_items))),
      false, false, builder.loc));
  
    auto tuple_items = std::make_unique<TuplePatternItemsNoRest> (
*************** EnumMatchBuilder::strukt (EnumItem &vari
*** 159,167 ****
        });
      }
  
-   // TODO: Replace with `reconstruct()` instead of building these twice
    auto self_variant_path = builder.variant_path (enum_path, variant_path);
!   auto other_variant_path = builder.variant_path (enum_path, variant_path);
  
    auto self_elts = StructPatternElements (std::move (self_fields));
    auto other_elts = StructPatternElements (std::move (other_fields));
--- 158,165 ----
        });
      }
  
    auto self_variant_path = builder.variant_path (enum_path, variant_path);
!   auto other_variant_path = self_variant_path.reconstruct ();
  
    auto self_elts = StructPatternElements (std::move (self_fields));
    auto other_elts = StructPatternElements (std::move (other_fields));
*************** EnumMatchBuilder::strukt (EnumItem &vari
*** 172,178 ****
      false, false, builder.loc));
    auto other_pattern = std::unique_ptr<Pattern> (
      new ReferencePattern (std::unique_ptr<Pattern> (
! 			    new StructPattern (other_variant_path, builder.loc,
  					       std::move (other_elts))),
  			  false, false, builder.loc));
  
--- 170,176 ----
      false, false, builder.loc));
    auto other_pattern = std::unique_ptr<Pattern> (
      new ReferencePattern (std::unique_ptr<Pattern> (
! 			    new StructPattern (*other_variant_path, builder.loc,
  					       std::move (other_elts))),
  			  false, false, builder.loc));
  
diff -Nrcpad gcc-16-20260315/gcc/rust/expand/rust-derive.cc gcc-16-20260322/gcc/rust/expand/rust-derive.cc
*** gcc-16-20260315/gcc/rust/expand/rust-derive.cc	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/expand/rust-derive.cc	Sun Mar 22 22:32:07 2026
*************** DeriveVisitor::derive (Item &item, const
*** 74,79 ****
--- 74,86 ----
        return vec (DeriveOrd (DeriveOrd::Ordering::Total, loc).go (item));
      case BuiltinMacro::PartialOrd:
        return vec (DeriveOrd (DeriveOrd::Ordering::Partial, loc).go (item));
+     case BuiltinMacro::RustcEncodable:
+     case BuiltinMacro::RustcDecodable:
+       rust_sorry_at (loc, "derive(%s) is not yet implemented",
+ 		     to_derive == BuiltinMacro::RustcEncodable
+ 		       ? "RustcEncodable"
+ 		       : "RustcDecodable");
+       return {};
      default:
        rust_unreachable ();
      };
diff -Nrcpad gcc-16-20260315/gcc/rust/expand/rust-derive.h gcc-16-20260322/gcc/rust/expand/rust-derive.h
*** gcc-16-20260315/gcc/rust/expand/rust-derive.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/expand/rust-derive.h	Sun Mar 22 22:32:07 2026
*************** private:
*** 105,110 ****
--- 105,111 ----
    virtual void visit (DelimTokenTree &delim_tok_tree) override final{};
    virtual void visit (AttrInputMetaItemContainer &input) override final{};
    virtual void visit (AttrInputMacro &expr) override final{};
+   virtual void visit (AttrInputExpr &expr) override final{};
    virtual void visit (IdentifierExpr &ident_expr) override final{};
    virtual void visit (Lifetime &lifetime) override final{};
    virtual void visit (LifetimeParam &lifetime_param) override final{};
*************** private:
*** 256,265 ****
    virtual void visit (FunctionParam &param) override final{};
    virtual void visit (VariadicParam &param) override final{};
    virtual void visit (FormatArgs &param) override final{};
    virtual void visit (OffsetOf &param) override final{};
  };
  
  } // namespace AST
  } // namespace Rust
  
! #endif // DERIVE_VISITOR_H
\ No newline at end of file
--- 257,267 ----
    virtual void visit (FunctionParam &param) override final{};
    virtual void visit (VariadicParam &param) override final{};
    virtual void visit (FormatArgs &param) override final{};
+   virtual void visit (Attribute &attribute) override final{};
    virtual void visit (OffsetOf &param) override final{};
  };
  
  } // namespace AST
  } // namespace Rust
  
! #endif // DERIVE_VISITOR_H
diff -Nrcpad gcc-16-20260315/gcc/rust/expand/rust-early-cfg-strip.cc gcc-16-20260322/gcc/rust/expand/rust-early-cfg-strip.cc
*** gcc-16-20260315/gcc/rust/expand/rust-early-cfg-strip.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/rust/expand/rust-early-cfg-strip.cc	Sun Mar 22 22:32:07 2026
***************
*** 0 ****
--- 1,38 ----
+ // Copyright (C) 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 "rust-early-cfg-strip.h"
+ #include "rust-cfg-strip.h"
+ 
+ namespace Rust {
+ 
+ void
+ EarlyCfgStrip::go (AST::Crate &crate)
+ {
+   visit (crate);
+ }
+ 
+ void
+ EarlyCfgStrip::visit (AST::Crate &crate)
+ {
+   expand_cfg_attrs (crate.inner_attrs);
+ 
+   AST::DefaultASTVisitor::visit (crate);
+ }
+ 
+ } // namespace Rust
diff -Nrcpad gcc-16-20260315/gcc/rust/expand/rust-early-cfg-strip.h gcc-16-20260322/gcc/rust/expand/rust-early-cfg-strip.h
*** gcc-16-20260315/gcc/rust/expand/rust-early-cfg-strip.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/rust/expand/rust-early-cfg-strip.h	Sun Mar 22 22:32:07 2026
***************
*** 0 ****
--- 1,41 ----
+ // Copyright (C) 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/>.
+ 
+ #ifndef RUST_EARLY_CFG_STRIP_H
+ #define RUST_EARLY_CFG_STRIP_H
+ 
+ #include "rust-ast-visitor.h"
+ 
+ namespace Rust {
+ 
+ /**
+  * Some parts cannot be stripped during the expansion passes
+  */
+ class EarlyCfgStrip : AST::DefaultASTVisitor
+ {
+ public:
+   using DefaultASTVisitor::visit;
+ 
+   void go (AST::Crate &crate);
+ 
+   void visit (AST::Crate &crate) override;
+ };
+ 
+ } // namespace Rust
+ 
+ #endif
diff -Nrcpad gcc-16-20260315/gcc/rust/hir/rust-ast-lower-base.cc gcc-16-20260322/gcc/rust/hir/rust-ast-lower-base.cc
*** gcc-16-20260315/gcc/rust/hir/rust-ast-lower-base.cc	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/hir/rust-ast-lower-base.cc	Sun Mar 22 22:32:07 2026
*************** ASTLoweringBase::visit (AST::WhileLetLoo
*** 68,73 ****
--- 68,84 ----
  }
  
  void
+ ASTLoweringBase::visit (AST::Attribute &attribute)
+ {
+   auto &path = attribute.get_path ();
+   if (path.as_string () == "derive")
+     {
+       rust_fatal_error (attribute.get_locus (),
+ 			"missing desugar for attribute");
+     }
+ }
+ 
+ void
  ASTLoweringBase::visit (AST::Token &)
  {}
  void
*************** ASTLoweringBase::visit (AST::AttrInputLi
*** 132,137 ****
--- 143,152 ----
  void
  ASTLoweringBase::visit (AST::AttrInputMacro &)
  {}
+ 
+ void
+ ASTLoweringBase::visit (AST::AttrInputExpr &)
+ {}
  void
  ASTLoweringBase::visit (AST::MetaItemLitExpr &)
  {}
diff -Nrcpad gcc-16-20260315/gcc/rust/hir/rust-ast-lower-base.h gcc-16-20260322/gcc/rust/hir/rust-ast-lower-base.h
*** gcc-16-20260315/gcc/rust/hir/rust-ast-lower-base.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/hir/rust-ast-lower-base.h	Sun Mar 22 22:32:07 2026
*************** public:
*** 71,76 ****
--- 71,77 ----
  
    // visitor impl
    // rust-ast.h
+   virtual void visit (AST::Attribute &attribute) override;
    //  virtual void visit(AttrInput& attr_input);
    //  virtual void visit(TokenTree& token_tree);
    //  virtual void visit(MacroMatch& macro_match);
*************** public:
*** 104,109 ****
--- 105,111 ----
    // rust-expr.h
    virtual void visit (AST::LiteralExpr &expr) override;
    virtual void visit (AST::AttrInputLiteral &attr_input) override;
+   virtual void visit (AST::AttrInputExpr &attr_input) override;
    virtual void visit (AST::AttrInputMacro &attr_input) override;
    virtual void visit (AST::MetaItemLitExpr &meta_item) override;
    virtual void visit (AST::MetaItemPathExpr &meta_item) override;
diff -Nrcpad gcc-16-20260315/gcc/rust/lang.opt gcc-16-20260322/gcc/rust/lang.opt
*** gcc-16-20260315/gcc/rust/lang.opt	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/lang.opt	Sun Mar 22 22:32:07 2026
*************** frust-crate=
*** 62,67 ****
--- 62,71 ----
  Rust Joined RejectNegative
  -frust-crate=<name>             Set the crate name for the compilation.
  
+ frust-crate-attr=
+ Rust Joined RejectNegative
+ -frust-crate-attr=<attr>        Inject an attribute within the current crate.
+ 
  frust-extern=
  Rust RejectNegative Joined
  -frust-extern=              Specify where an external library is located.
diff -Nrcpad gcc-16-20260315/gcc/rust/parse/rust-parse-error.h gcc-16-20260322/gcc/rust/parse/rust-parse-error.h
*** gcc-16-20260315/gcc/rust/parse/rust-parse-error.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/parse/rust-parse-error.h	Sun Mar 22 22:32:07 2026
*************** namespace Rust {
*** 27,32 ****
--- 27,74 ----
  namespace Parse {
  namespace Error {
  
+ struct EnumVariant
+ {
+   enum class Kind
+   {
+     CHILD_ERROR,
+     NO_IDENTIFIER,
+     UNFINISHED_TUPLE_VARIANT,
+   } kind;
+ 
+   static tl::expected<std::unique_ptr<AST::EnumItem>, EnumVariant>
+   make_not_identifier (const_TokenPtr unexpected_token)
+   {
+     return tl::unexpected<EnumVariant> (EnumVariant (unexpected_token));
+   }
+ 
+   static tl::expected<std::unique_ptr<AST::EnumItem>, EnumVariant>
+   make_child_error ()
+   {
+     return tl::unexpected<EnumVariant> (EnumVariant (Kind::CHILD_ERROR));
+   }
+ 
+   static tl::expected<std::unique_ptr<AST::EnumItem>, EnumVariant>
+   make_unfinished_tuple_variant ()
+   {
+     return tl::unexpected<EnumVariant> (
+       EnumVariant (Kind::UNFINISHED_TUPLE_VARIANT));
+   }
+ 
+ private:
+   EnumVariant (const_TokenPtr unexpected_token)
+     : kind (Kind::NO_IDENTIFIER), unexpected_token (unexpected_token)
+   {}
+ 
+   EnumVariant (Kind kind) : kind (kind), unexpected_token (nullptr)
+   {
+     rust_assert (kind != Kind::NO_IDENTIFIER);
+   }
+ 
+   // Only valid for missing identifier
+   const_TokenPtr unexpected_token;
+ };
+ 
  struct Attribute
  {
    static tl::expected<AST::Attribute, Attribute> make_malformed ()
diff -Nrcpad gcc-16-20260315/gcc/rust/parse/rust-parse-impl-attribute.hxx gcc-16-20260322/gcc/rust/parse/rust-parse-impl-attribute.hxx
*** gcc-16-20260315/gcc/rust/parse/rust-parse-impl-attribute.hxx	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/parse/rust-parse-impl-attribute.hxx	Sun Mar 22 22:32:07 2026
*************** Parser<ManagedTokenSource>::parse_attr_i
*** 293,298 ****
--- 293,308 ----
  
  	t = lexer.peek_token ();
  
+ 	/* Ensure token is a "literal expression" (literally only a literal
+ 	 * token of any type) */
+ 	if (!t->is_literal ())
+ 	  {
+ 	    Error error (
+ 	      t->get_locus (),
+ 	      "arbitrary expressions in key-value attributes are unstable");
+ 	    collect_potential_gating_error (
+ 	      Feature::Name::EXTENDED_KEY_VALUE_ATTRIBUTES, std::move (error));
+ 	  }
  	// attempt to parse macro
  	// TODO: macros may/may not be allowed in attributes
  	// this is needed for "#[doc = include_str!(...)]"
*************** Parser<ManagedTokenSource>::parse_attr_i
*** 308,327 ****
  	      new AST::AttrInputMacro (std::move (invoke)));
  	  }
  
- 	/* Ensure token is a "literal expression" (literally only a literal
- 	 * token of any type) */
- 	if (!t->is_literal ())
- 	  {
- 	    Error error (
- 	      t->get_locus (),
- 	      "unknown token %qs in attribute body - literal expected",
- 	      t->get_token_description ());
- 	    add_error (std::move (error));
- 
- 	    skip_after_end_attribute ();
- 	    return Parse::Error::AttrInput::make_malformed ();
- 	  }
- 
  	AST::Literal::LitType lit_type = AST::Literal::STRING;
  	// Crappy mapping of token type to literal type
  	switch (t->get_id ())
--- 318,323 ----
*************** Parser<ManagedTokenSource>::parse_attr_i
*** 345,353 ****
  	    lit_type = AST::Literal::RAW_STRING;
  	    break;
  	  case STRING_LITERAL:
- 	  default:
  	    lit_type = AST::Literal::STRING;
  	    break; // TODO: raw string? don't eliminate it from lexer?
  	  }
  
  	// create actual LiteralExpr
--- 341,354 ----
  	    lit_type = AST::Literal::RAW_STRING;
  	    break;
  	  case STRING_LITERAL:
  	    lit_type = AST::Literal::STRING;
  	    break; // TODO: raw string? don't eliminate it from lexer?
+ 	  default:
+ 	    rust_sorry_at (t->get_locus (),
+ 			   "Unsupported attribute input, only literals and "
+ 			   "macros are supported for now");
+ 	    skip_after_end_attribute ();
+ 	    return Parse::Error::AttrInput::make_malformed ();
  	  }
  
  	// create actual LiteralExpr
diff -Nrcpad gcc-16-20260315/gcc/rust/parse/rust-parse-impl.hxx gcc-16-20260322/gcc/rust/parse/rust-parse-impl.hxx
*** gcc-16-20260315/gcc/rust/parse/rust-parse-impl.hxx	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/parse/rust-parse-impl.hxx	Sun Mar 22 22:32:07 2026
*************** Parser<ManagedTokenSource>::parse_trait_
*** 2750,2756 ****
  
    // handle TypePath
    AST::TypePath type_path = parse_type_path ();
!   if (type_path.is_error())
      return nullptr;
  
    // handle closing parentheses
--- 2750,2756 ----
  
    // handle TypePath
    AST::TypePath type_path = parse_type_path ();
!   if (type_path.is_error ())
      return nullptr;
  
    // handle closing parentheses
*************** Parser<ManagedTokenSource>::parse_struct
*** 2979,2988 ****
    const_TokenPtr name_tok = expect_token (IDENTIFIER);
    if (name_tok == nullptr)
      {
-       Error error (lexer.peek_token ()->get_locus (),
- 		   "could not parse struct or tuple struct identifier");
-       add_error (std::move (error));
- 
        // skip after somewhere?
        return nullptr;
      }
--- 2979,2984 ----
*************** Parser<ManagedTokenSource>::parse_enum_i
*** 3353,3378 ****
  {
    std::vector<std::unique_ptr<AST::EnumItem>> items;
  
!   std::unique_ptr<AST::EnumItem> initial_item = parse_enum_item ();
  
    // Return empty item list if no field there
!   if (initial_item == nullptr)
      return items;
  
!   items.push_back (std::move (initial_item));
  
    while (lexer.peek_token ()->get_id () == COMMA)
      {
        lexer.skip_token ();
  
!       std::unique_ptr<AST::EnumItem> item = parse_enum_item ();
!       if (item == nullptr)
  	{
  	  // this would occur with a trailing comma, which is allowed
  	  break;
  	}
  
!       items.push_back (std::move (item));
      }
  
    items.shrink_to_fit ();
--- 3349,3374 ----
  {
    std::vector<std::unique_ptr<AST::EnumItem>> items;
  
!   auto initial_item = parse_enum_item ();
  
    // Return empty item list if no field there
!   if (!initial_item)
      return items;
  
!   items.push_back (std::move (initial_item.value ()));
  
    while (lexer.peek_token ()->get_id () == COMMA)
      {
        lexer.skip_token ();
  
!       auto item = parse_enum_item ();
!       if (!item)
  	{
  	  // this would occur with a trailing comma, which is allowed
  	  break;
  	}
  
!       items.push_back (std::move (item.value ()));
      }
  
    items.shrink_to_fit ();
*************** Parser<ManagedTokenSource>::parse_enum_i
*** 3389,3401 ****
  {
    std::vector<std::unique_ptr<AST::EnumItem>> items;
  
!   std::unique_ptr<AST::EnumItem> initial_item = parse_enum_item ();
  
    // Return empty item list if no field there
!   if (initial_item == nullptr)
      return items;
  
!   items.push_back (std::move (initial_item));
  
    while (lexer.peek_token ()->get_id () == COMMA)
      {
--- 3385,3397 ----
  {
    std::vector<std::unique_ptr<AST::EnumItem>> items;
  
!   auto initial_item = parse_enum_item ();
  
    // Return empty item list if no field there
!   if (!initial_item)
      return items;
  
!   items.push_back (std::move (initial_item.value ()));
  
    while (lexer.peek_token ()->get_id () == COMMA)
      {
*************** Parser<ManagedTokenSource>::parse_enum_i
*** 3404,3411 ****
        if (is_end_tok (lexer.peek_token ()->get_id ()))
  	break;
  
!       std::unique_ptr<AST::EnumItem> item = parse_enum_item ();
!       if (item == nullptr)
  	{
  	  /* TODO should this ignore all successfully parsed enum items just
  	   * because one failed? */
--- 3400,3407 ----
        if (is_end_tok (lexer.peek_token ()->get_id ()))
  	break;
  
!       auto item = parse_enum_item ();
!       if (!item)
  	{
  	  /* TODO should this ignore all successfully parsed enum items just
  	   * because one failed? */
*************** Parser<ManagedTokenSource>::parse_enum_i
*** 3416,3422 ****
  	  return {};
  	}
  
!       items.push_back (std::move (item));
      }
  
    items.shrink_to_fit ();
--- 3412,3418 ----
  	  return {};
  	}
  
!       items.push_back (std::move (item.value ()));
      }
  
    items.shrink_to_fit ();
*************** Parser<ManagedTokenSource>::parse_enum_i
*** 3428,3434 ****
  /* Parses a single enum variant item in an enum definition. Does not parse
   * commas. */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::EnumItem>
  Parser<ManagedTokenSource>::parse_enum_item ()
  {
    // parse outer attributes if they exist
--- 3424,3430 ----
  /* Parses a single enum variant item in an enum definition. Does not parse
   * commas. */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::EnumItem>, Parse::Error::EnumVariant>
  Parser<ManagedTokenSource>::parse_enum_item ()
  {
    // parse outer attributes if they exist
*************** Parser<ManagedTokenSource>::parse_enum_i
*** 3437,3443 ****
    // parse visibility, which may or may not exist
    auto vis_res = parse_visibility ();
    if (!vis_res)
!     return nullptr;
    auto vis = vis_res.value ();
  
    // parse name for enum item, which is required
--- 3433,3439 ----
    // parse visibility, which may or may not exist
    auto vis_res = parse_visibility ();
    if (!vis_res)
!     return Parse::Error::EnumVariant::make_child_error ();
    auto vis = vis_res.value ();
  
    // parse name for enum item, which is required
*************** Parser<ManagedTokenSource>::parse_enum_i
*** 3445,3451 ****
    if (item_name_tok->get_id () != IDENTIFIER)
      {
        // this may not be an error but it means there is no enum item here
!       return nullptr;
      }
    lexer.skip_token ();
    Identifier item_name{item_name_tok};
--- 3441,3447 ----
    if (item_name_tok->get_id () != IDENTIFIER)
      {
        // this may not be an error but it means there is no enum item here
!       return Parse::Error::EnumVariant::make_not_identifier (item_name_tok);
      }
    lexer.skip_token ();
    Identifier item_name{item_name_tok};
*************** Parser<ManagedTokenSource>::parse_enum_i
*** 3469,3475 ****
  	if (!skip_token (RIGHT_PAREN))
  	  {
  	    // skip after somewhere
! 	    return nullptr;
  	  }
  
  	return std::unique_ptr<AST::EnumItemTuple> (new AST::EnumItemTuple (
--- 3465,3471 ----
  	if (!skip_token (RIGHT_PAREN))
  	  {
  	    // skip after somewhere
! 	    return Parse::Error::EnumVariant::make_unfinished_tuple_variant ();
  	  }
  
  	return std::unique_ptr<AST::EnumItemTuple> (new AST::EnumItemTuple (
*************** Parser<ManagedTokenSource>::parse_enum_i
*** 3487,3493 ****
  	if (!skip_token (RIGHT_CURLY))
  	  {
  	    // skip after somewhere
! 	    return nullptr;
  	  }
  
  	return std::unique_ptr<AST::EnumItemStruct> (new AST::EnumItemStruct (
--- 3483,3489 ----
  	if (!skip_token (RIGHT_CURLY))
  	  {
  	    // skip after somewhere
! 	    return Parse::Error::EnumVariant::make_unfinished_tuple_variant ();
  	  }
  
  	return std::unique_ptr<AST::EnumItemStruct> (new AST::EnumItemStruct (
*************** Parser<ManagedTokenSource>::parse_enum_i
*** 3501,3520 ****
  
  	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 ()));
        }
      default:
        // regular enum with just an identifier
!       return std::unique_ptr<AST::EnumItem> (
! 	new AST::EnumItem (std::move (item_name), std::move (vis),
! 			   std::move (outer_attrs),
! 			   item_name_tok->get_locus ()));
      }
  }
  
--- 3497,3515 ----
  
  	auto discriminant_expr = parse_expr ();
  	if (!discriminant_expr)
! 	  return Parse::Error::EnumVariant::make_child_error ();
  
! 	return std::make_unique<AST::EnumItemDiscriminant> (
! 	  std::move (item_name), std::move (vis),
! 	  std::move (discriminant_expr.value ()), std::move (outer_attrs),
! 	  item_name_tok->get_locus ());
        }
      default:
        // regular enum with just an identifier
!       return std::make_unique<AST::EnumItem> (std::move (item_name),
! 					      std::move (vis),
! 					      std::move (outer_attrs),
! 					      item_name_tok->get_locus ());
      }
  }
  
diff -Nrcpad gcc-16-20260315/gcc/rust/parse/rust-parse.h gcc-16-20260322/gcc/rust/parse/rust-parse.h
*** gcc-16-20260315/gcc/rust/parse/rust-parse.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/parse/rust-parse.h	Sun Mar 22 22:32:07 2026
*************** along with GCC; see the file COPYING3.
*** 24,29 ****
--- 24,31 ----
  #include "rust-diagnostics.h"
  #include "rust-parse-error.h"
  #include "rust-parse-utils.h"
+ #include "rust-feature.h"
+ #include "rust-feature-store.h"
  
  #include "expected.h"
  
*************** private:
*** 436,442 ****
    template <typename EndTokenPred>
    std::vector<std::unique_ptr<AST::EnumItem>>
    parse_enum_items (EndTokenPred is_end_token);
!   std::unique_ptr<AST::EnumItem> parse_enum_item ();
    std::unique_ptr<AST::Union> parse_union (AST::Visibility vis,
  					   AST::AttrVec outer_attrs);
    std::unique_ptr<AST::ConstantItem>
--- 438,445 ----
    template <typename EndTokenPred>
    std::vector<std::unique_ptr<AST::EnumItem>>
    parse_enum_items (EndTokenPred is_end_token);
!   tl::expected<std::unique_ptr<AST::EnumItem>, Parse::Error::EnumVariant>
!   parse_enum_item ();
    std::unique_ptr<AST::Union> parse_union (AST::Visibility vis,
  					   AST::AttrVec outer_attrs);
    std::unique_ptr<AST::ConstantItem>
*************** private:
*** 852,857 ****
--- 855,865 ----
  
    void add_error (Error error) { error_table.push_back (std::move (error)); }
  
+   void collect_potential_gating_error (Feature::Name feature, Error error)
+   {
+     Features::EarlyFeatureGateStore::get ().add (feature, error);
+   }
+ 
  public:
    // Construct parser with specified "managed" token source.
    Parser (ManagedTokenSource &tokenSource) : lexer (tokenSource) {}
*************** public:
*** 874,879 ****
--- 882,893 ----
    // Get a reference to the list of errors encountered
    std::vector<Error> &get_errors () { return error_table; }
  
+   std::vector<std::pair<Feature::Name, Error>> &
+   get_potential_feature_gate_errors ()
+   {
+     return gating_errors;
+   }
+ 
    const ManagedTokenSource &get_token_source () const { return lexer; }
  
    const_TokenPtr peek_current_token () { return lexer.peek_token (0); }
*************** private:
*** 884,889 ****
--- 898,905 ----
    ManagedTokenSource &lexer;
    // The error list.
    std::vector<Error> error_table;
+ 
+   std::vector<std::pair<Feature::Name, Error>> gating_errors;
    // The names of inline modules while parsing.
    std::vector<std::string> inline_module_stack;
  
diff -Nrcpad gcc-16-20260315/gcc/rust/resolve/rust-default-resolver.cc gcc-16-20260322/gcc/rust/resolve/rust-default-resolver.cc
*** gcc-16-20260315/gcc/rust/resolve/rust-default-resolver.cc	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/resolve/rust-default-resolver.cc	Sun Mar 22 22:32:07 2026
*************** DefaultResolver::visit (AST::MatchExpr &
*** 390,395 ****
--- 390,403 ----
  }
  
  void
+ DefaultResolver::visit (AST::MatchCase &cas)
+ {
+   auto vis = [this, &cas] () { AST::DefaultASTVisitor::visit (cas); };
+ 
+   ctx.scoped (Rib::Kind::Normal, cas.get_node_id (), vis);
+ }
+ 
+ void
  DefaultResolver::visit (AST::ConstantItem &item)
  {
    auto expr_vis_1 = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
diff -Nrcpad gcc-16-20260315/gcc/rust/resolve/rust-default-resolver.h gcc-16-20260322/gcc/rust/resolve/rust-default-resolver.h
*** gcc-16-20260315/gcc/rust/resolve/rust-default-resolver.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/resolve/rust-default-resolver.h	Sun Mar 22 22:32:07 2026
*************** public:
*** 79,84 ****
--- 79,85 ----
    void visit (AST::ClosureExprInner &) override;
    void visit (AST::ClosureExprInnerTyped &) override;
    void visit (AST::MatchExpr &) override;
+   void visit (AST::MatchCase &) override;
  
    // Leaf visitors, which do nothing by default
    void visit (AST::ConstantItem &) override;
diff -Nrcpad gcc-16-20260315/gcc/rust/resolve/rust-early-name-resolver-2.0.cc gcc-16-20260322/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
*** gcc-16-20260315/gcc/rust/resolve/rust-early-name-resolver-2.0.cc	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/resolve/rust-early-name-resolver-2.0.cc	Sun Mar 22 22:32:07 2026
*************** Early::resolve_rebind_import (NodeId use
*** 123,128 ****
--- 123,139 ----
    // if we've found at least one definition, then we're good
    if (definitions.empty ())
      return false;
+   for (const auto &def : definitions)
+     {
+       if (def.first.is_ambiguous ())
+ 	{
+ 	  rich_location rich_locus (line_table,
+ 				    rebind_import.to_resolve.get_locus ());
+ 	  rust_error_at (rich_locus, ErrorCode::E0659, "%qs is ambiguous",
+ 			 rebind_import.to_resolve.as_string ().c_str ());
+ 	  return true;
+ 	}
+     }
  
    auto &imports = import_mappings.new_or_access (use_dec_id);
  
*************** Early::visit (AST::MacroInvocation &invo
*** 314,390 ****
  }
  
  void
! Early::visit_attributes (std::vector<AST::Attribute> &attrs)
  {
!   auto &mappings = Analysis::Mappings::get ();
! 
!   for (auto &attr : attrs)
      {
!       auto name = attr.get_path ().get_segments ().at (0).get_segment_name ();
! 
!       if (attr.is_derive ())
  	{
! 	  auto traits = attr.get_traits_to_derive ();
! 	  for (auto &trait : traits)
! 	    {
! 	      auto definition
! 		= ctx.resolve_path (trait.get (), Namespace::Macros);
! 	      if (!definition.has_value ())
! 		{
! 		  // FIXME: Change to proper error message
! 		  collect_error (Error (trait.get ().get_locus (),
! 					"could not resolve trait %qs",
! 					trait.get ().as_string ().c_str ()));
! 		  continue;
! 		}
! 
! 	      auto pm_def = mappings.lookup_derive_proc_macro_def (
! 		definition->get_node_id ());
! 
! 	      if (pm_def.has_value ())
! 		mappings.insert_derive_proc_macro_invocation (trait,
! 							      pm_def.value ());
! 	    }
  	}
-       else if (Analysis::BuiltinAttributeMappings::get ()
- 		 ->lookup_builtin (name)
- 		 .is_error ()) // Do not resolve builtins
- 	{
- 	  auto definition
- 	    = ctx.resolve_path (attr.get_path (), Namespace::Macros);
- 	  if (!definition.has_value ())
- 	    {
- 	      // 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 (
- 	    definition->get_node_id ());
  
! 	  if (!pm_def.has_value ())
! 	    return;
  
! 	  mappings.insert_attribute_proc_macro_invocation (attr.get_path (),
! 							   pm_def.value ());
! 	}
      }
  }
  
  void
! Early::visit (AST::Function &fn)
  {
!   visit_attributes (fn.get_outer_attrs ());
!   DefaultResolver::visit (fn);
  }
  
  void
! Early::visit (AST::StructStruct &s)
  {
!   visit_attributes (s.get_outer_attrs ());
!   DefaultResolver::visit (s);
  }
  
  void
--- 325,398 ----
  }
  
  void
! Early::visit_derive_attribute (AST::Attribute &attr,
! 			       Analysis::Mappings &mappings)
  {
!   auto traits = attr.get_traits_to_derive ();
!   for (auto &trait : traits)
      {
!       auto definition = ctx.resolve_path (trait.get (), Namespace::Macros);
!       if (!definition.has_value ())
  	{
! 	  // FIXME: Change to proper error message
! 	  collect_error (Error (trait.get ().get_locus (),
! 				"could not resolve trait %qs",
! 				trait.get ().as_string ().c_str ()));
! 	  continue;
  	}
  
!       auto pm_def
! 	= mappings.lookup_derive_proc_macro_def (definition->get_node_id ());
  
!       if (pm_def.has_value ())
! 	mappings.insert_derive_proc_macro_invocation (trait, pm_def.value ());
      }
  }
  
  void
! Early::visit_non_builtin_attribute (AST::Attribute &attr,
! 				    Analysis::Mappings &mappings,
! 				    std::string &name)
  {
!   auto definition = ctx.resolve_path (attr.get_path (), Namespace::Macros);
!   if (!definition.has_value ())
!     {
!       // 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 (definition->get_node_id ());
! 
!   if (!pm_def.has_value ())
!     return;
! 
!   mappings.insert_attribute_proc_macro_invocation (attr.get_path (),
! 						   pm_def.value ());
  }
  
  void
! Early::visit (AST::Attribute &attr)
  {
!   auto &mappings = Analysis::Mappings::get ();
! 
!   auto name = attr.get_path ().get_segments ().at (0).get_segment_name ();
!   auto is_not_builtin = [&name] (AST::Attribute &attr) {
!     return Analysis::BuiltinAttributeMappings::get ()
!       ->lookup_builtin (name)
!       .is_error ();
!   };
! 
!   if (attr.is_derive ())
!     {
!       visit_derive_attribute (attr, mappings);
!     }
!   else if (is_not_builtin (attr)) // Do not resolve builtins
!     {
!       visit_non_builtin_attribute (attr, mappings, name);
!     }
  }
  
  void
diff -Nrcpad gcc-16-20260315/gcc/rust/resolve/rust-early-name-resolver-2.0.h gcc-16-20260322/gcc/rust/resolve/rust-early-name-resolver-2.0.h
*** gcc-16-20260315/gcc/rust/resolve/rust-early-name-resolver-2.0.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/resolve/rust-early-name-resolver-2.0.h	Sun Mar 22 22:32:07 2026
*************** class Early : public DefaultResolver
*** 37,42 ****
--- 37,46 ----
    TopLevel toplevel;
    bool dirty;
  
+   void visit_derive_attribute (AST::Attribute &, Analysis::Mappings &);
+   void visit_non_builtin_attribute (AST::Attribute &, Analysis::Mappings &,
+ 				    std::string &name);
+ 
  public:
    Early (NameResolutionContext &ctx);
  
*************** public:
*** 58,68 ****
  
    void visit (AST::MacroInvocation &) override;
  
-   void visit (AST::Function &) override;
-   void visit (AST::StructStruct &) override;
    void visit (AST::UseDeclaration &) override;
    void visit (AST::UseTreeList &) override;
  
    struct ImportData
    {
      enum class Kind
--- 62,72 ----
  
    void visit (AST::MacroInvocation &) override;
  
    void visit (AST::UseDeclaration &) override;
    void visit (AST::UseTreeList &) override;
  
+   void visit (AST::Attribute &) override;
+ 
    struct ImportData
    {
      enum class Kind
*************** public:
*** 168,175 ****
    };
  
  private:
-   void visit_attributes (std::vector<AST::Attribute> &attrs);
- 
    /**
     * Insert a resolved macro invocation into the mappings once, meaning that we
     * can call this function each time the early name resolution pass is underway
--- 172,177 ----
diff -Nrcpad gcc-16-20260315/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc gcc-16-20260322/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc
*** gcc-16-20260315/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc	Sun Mar 22 22:32:07 2026
*************** TopLevel::visit (AST::Union &union_item)
*** 367,374 ****
  void
  TopLevel::visit (AST::ConstantItem &const_item)
  {
!   insert_or_error_out (const_item.get_identifier (), const_item,
! 		       Namespace::Values);
  
    DefaultResolver::visit (const_item);
  }
--- 367,375 ----
  void
  TopLevel::visit (AST::ConstantItem &const_item)
  {
!   if (const_item.get_identifier ().as_string () != Values::Keywords::UNDERSCORE)
!     insert_or_error_out (const_item.get_identifier (), const_item,
! 			 Namespace::Values);
  
    DefaultResolver::visit (const_item);
  }
diff -Nrcpad gcc-16-20260315/gcc/rust/rust-lang.cc gcc-16-20260322/gcc/rust/rust-lang.cc
*** gcc-16-20260315/gcc/rust/rust-lang.cc	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/rust-lang.cc	Sun Mar 22 22:32:07 2026
*************** grs_langhook_getdecls (void)
*** 269,276 ****
  static bool
  grs_langhook_handle_option (
    size_t scode, const char *arg, HOST_WIDE_INT value, int kind ATTRIBUTE_UNUSED,
!   location_t loc ATTRIBUTE_UNUSED,
!   const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED)
  {
    // Convert integer code to lang.opt enum codes with names.
    enum opt_code code = (enum opt_code) scode;
--- 269,275 ----
  static bool
  grs_langhook_handle_option (
    size_t scode, const char *arg, HOST_WIDE_INT value, int kind ATTRIBUTE_UNUSED,
!   location_t loc, const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED)
  {
    // Convert integer code to lang.opt enum codes with names.
    enum opt_code code = (enum opt_code) scode;
diff -Nrcpad gcc-16-20260315/gcc/rust/rust-session-manager.cc gcc-16-20260322/gcc/rust/rust-session-manager.cc
*** gcc-16-20260315/gcc/rust/rust-session-manager.cc	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/rust-session-manager.cc	Sun Mar 22 22:32:07 2026
***************
*** 34,39 ****
--- 34,40 ----
  #include "rust-hir-type-check.h"
  #include "rust-privacy-check.h"
  #include "rust-const-checker.h"
+ #include "rust-feature-collector.h"
  #include "rust-feature-gate.h"
  #include "rust-compile.h"
  #include "rust-cfg-parser.h"
***************
*** 51,56 ****
--- 52,58 ----
  #include "rust-early-name-resolver-2.0.h"
  #include "rust-late-name-resolver-2.0.h"
  #include "rust-resolve-builtins.h"
+ #include "rust-early-cfg-strip.h"
  #include "rust-cfg-strip.h"
  #include "rust-expand-visitor.h"
  #include "rust-unicode.h"
*************** Session::init_options ()
*** 206,212 ****
  bool
  Session::handle_option (
    enum opt_code code, const char *arg, HOST_WIDE_INT value ATTRIBUTE_UNUSED,
!   int kind ATTRIBUTE_UNUSED, location_t loc ATTRIBUTE_UNUSED,
    const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED)
  {
    // used to store whether results of various stuff are successful
--- 208,214 ----
  bool
  Session::handle_option (
    enum opt_code code, const char *arg, HOST_WIDE_INT value ATTRIBUTE_UNUSED,
!   int kind ATTRIBUTE_UNUSED, location_t loc,
    const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED)
  {
    // used to store whether results of various stuff are successful
*************** Session::handle_option (
*** 250,255 ****
--- 252,263 ----
  	ret = false;
        break;
  
+     case OPT_frust_crate_attr_:
+       if (arg != nullptr)
+ 	{
+ 	  options.addional_attributes.emplace_back (arg, loc);
+ 	}
+       break;
      case OPT_frust_dump_:
        // enable dump and return whether this was successful
        if (arg != nullptr)
*************** Session::handle_crate_name (const char *
*** 474,480 ****
  
    for (const auto &attr : parsed_crate.inner_attrs)
      {
!       if (attr.get_path () != "crate_name")
  	continue;
  
        auto msg_str = Analysis::Attributes::extract_string_literal (attr);
--- 482,488 ----
  
    for (const auto &attr : parsed_crate.inner_attrs)
      {
!       if (attr.get_path () != Values::Attributes::CRATE_NAME)
  	continue;
  
        auto msg_str = Analysis::Attributes::extract_string_literal (attr);
*************** Session::handle_crate_name (const char *
*** 534,539 ****
--- 542,577 ----
    mappings.set_current_crate (crate_num);
  }
  
+ /** Parse additional attributes injected from the command line
+  *
+  */
+ AST::AttrVec
+ parse_cli_attributes (
+   std::vector<CompileOptions::CliAttributeContent> attributes)
+ {
+   AST::AttrVec result;
+   result.reserve (attributes.size ());
+ 
+   for (auto attribute : attributes)
+     {
+       Session::get_instance ().linemap->start_file ("cli", 1);
+       Lexer lex (attribute.content, Session::get_instance ().linemap);
+       Parser<Lexer> parser (lex);
+ 
+       if (auto attr_body = parser.parse_attribute_body ())
+ 	{
+ 	  auto body = std::move (attr_body.value ());
+ 	  result.push_back (AST::Attribute (std::move (body.path),
+ 					    std::move (body.input), body.locus,
+ 					    true));
+ 	}
+ 
+       for (auto error : parser.get_errors ())
+ 	error.emit ();
+     }
+   return result;
+ }
+ 
  // Parses a single file with filename filename.
  void
  Session::compile_crate (const char *filename)
*************** Session::compile_crate (const char *file
*** 585,590 ****
--- 623,630 ----
        dump_lex_opt = dump_lex_stream;
      }
  
+   auto cli_attributes = parse_cli_attributes (options.addional_attributes);
+ 
    Lexer lex (filename, std::move (file_wrap), linemap, dump_lex_opt);
  
    if (!lex.input_source_is_valid_utf8 ())
*************** Session::compile_crate (const char *file
*** 656,662 ****
      }
  
    // injection pipeline stage
!   injection (parsed_crate);
    rust_debug ("\033[0;31mSUCCESSFULLY FINISHED INJECTION \033[0m");
    if (options.dump_option_enabled (CompileOptions::INJECTION_DUMP))
      {
--- 696,702 ----
      }
  
    // injection pipeline stage
!   injection (parsed_crate, cli_attributes);
    rust_debug ("\033[0;31mSUCCESSFULLY FINISHED INJECTION \033[0m");
    if (options.dump_option_enabled (CompileOptions::INJECTION_DUMP))
      {
*************** Session::compile_crate (const char *file
*** 668,676 ****
  
    Analysis::AttributeChecker ().go (parsed_crate);
  
!   if (!has_attribute (parsed_crate, std::string (Values::Attributes::NO_CORE)))
      {
        parsed_crate.inject_extern_crate ("core");
      }
  
    if (last_step == CompileOptions::CompileStep::Expansion)
--- 708,730 ----
  
    Analysis::AttributeChecker ().go (parsed_crate);
  
!   EarlyCfgStrip ().go (parsed_crate);
! 
!   auto parsed_crate_features
!     = Features::FeatureCollector{}.collect (parsed_crate);
! 
!   // Do not inject core if some errors were emitted
!   if (!saw_errors ()
!       && !has_attribute (parsed_crate,
! 			 std::string (Values::Attributes::NO_CORE)))
      {
        parsed_crate.inject_extern_crate ("core");
+       // #![no_core] implies #![no_std]
+       if (!has_attribute (parsed_crate,
+ 			  std::string (Values::Attributes::NO_STD)))
+ 	{
+ 	  parsed_crate.inject_extern_crate ("std");
+ 	}
      }
  
    if (last_step == CompileOptions::CompileStep::Expansion)
*************** Session::compile_crate (const char *file
*** 701,707 ****
    // feature gating
    if (last_step == CompileOptions::CompileStep::FeatureGating)
      return;
!   FeatureGate ().check (parsed_crate);
  
    if (last_step == CompileOptions::CompileStep::NameResolution)
      return;
--- 755,762 ----
    // feature gating
    if (last_step == CompileOptions::CompileStep::FeatureGating)
      return;
! 
!   FeatureGate (parsed_crate_features).check (parsed_crate);
  
    if (last_step == CompileOptions::CompileStep::NameResolution)
      return;
*************** contains_name (const AST::AttrVec &attrs
*** 850,856 ****
  }
  
  void
! Session::injection (AST::Crate &crate)
  {
    rust_debug ("started injection");
  
--- 905,911 ----
  }
  
  void
! Session::injection (AST::Crate &crate, AST::AttrVec cli_attributes)
  {
    rust_debug ("started injection");
  
*************** Session::injection (AST::Crate &crate)
*** 905,910 ****
--- 960,968 ----
     * macros, cfg, and test should be prioritised since they seem to be used
     * the most. */
  
+   for (auto attribute : cli_attributes)
+     crate.inject_inner_attribute (attribute);
+ 
    // crate injection
    std::vector<std::string> names;
    if (contains_name (crate.inner_attrs, "no_core"))
diff -Nrcpad gcc-16-20260315/gcc/rust/rust-session-manager.h gcc-16-20260322/gcc/rust/rust-session-manager.h
*** gcc-16-20260315/gcc/rust/rust-session-manager.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/rust-session-manager.h	Sun Mar 22 22:32:07 2026
*************** struct CompileOptions
*** 242,247 ****
--- 242,265 ----
    bool debug_assertions = false;
    std::string metadata_output_path;
  
+   /** Structure containing additional attributes to be injected within the
+    * compiled crate from the command line instead of the source code.
+    *
+    * To make things a bit easier with rustc, we're trying to use the same
+    * format accepted by -Zcrate-attr. This means the CLI accepts the text
+    * content of the attribute and not text of the whole attribute itself.
+    */
+   struct CliAttributeContent
+   {
+     CliAttributeContent (std::string content, location_t locus)
+       : content (content), locus (locus)
+     {}
+     /* Content of the attribute*/
+     std::string content;
+     location_t locus;
+   };
+   std::vector<CliAttributeContent> addional_attributes;
+ 
    enum class Edition
    {
      E2015 = 0,
*************** private:
*** 441,447 ****
    /* Injection pipeline stage. TODO maybe move to another object? Maybe have
     * some lint checks (in future, obviously), register builtin macros, crate
     * injection. */
!   void injection (AST::Crate &crate);
  
    /* Expansion pipeline stage. TODO maybe move to another object? Expands all
     * macros, maybe build test harness in future, AST validation, maybe create
--- 459,465 ----
    /* Injection pipeline stage. TODO maybe move to another object? Maybe have
     * some lint checks (in future, obviously), register builtin macros, crate
     * injection. */
!   void injection (AST::Crate &crate, AST::AttrVec cli_attributes);
  
    /* Expansion pipeline stage. TODO maybe move to another object? Expands all
     * macros, maybe build test harness in future, AST validation, maybe create
diff -Nrcpad gcc-16-20260315/gcc/rust/rust-system.h gcc-16-20260322/gcc/rust/rust-system.h
*** gcc-16-20260315/gcc/rust/rust-system.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/rust-system.h	Sun Mar 22 22:32:07 2026
***************
*** 36,41 ****
--- 36,42 ----
  #include <map>
  #include <set>
  #include <vector>
+ #include <queue>
  #include <stack>
  #include <sstream>
  #include <string>
diff -Nrcpad gcc-16-20260315/gcc/rust/util/rust-attribute-values.h gcc-16-20260322/gcc/rust/util/rust-attribute-values.h
*** gcc-16-20260315/gcc/rust/util/rust-attribute-values.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/util/rust-attribute-values.h	Sun Mar 22 22:32:07 2026
*************** public:
*** 38,43 ****
--- 38,44 ----
    static constexpr auto &LANG = "lang";
    static constexpr auto &LINK_NAME = "link_name";
    static constexpr auto &NO_CORE = "no_core";
+   static constexpr auto &NO_STD = "no_std";
    static constexpr auto &LINK_SECTION = "link_section";
    static constexpr auto &NO_MANGLE = "no_mangle";
    static constexpr auto &EXPORT_NAME = "export_name";
*************** public:
*** 50,57 ****
--- 51,61 ----
    static constexpr auto &PROC_MACRO = "proc_macro";
    static constexpr auto &PROC_MACRO_DERIVE = "proc_macro_derive";
    static constexpr auto &PROC_MACRO_ATTRIBUTE = "proc_macro_attribute";
+   static constexpr auto &CRATE_NAME = "crate_name";
+   static constexpr auto &CRATE_TYPE = "crate_type";
  
    static constexpr auto &TARGET_FEATURE = "target_feature";
+   static constexpr auto &FEATURE = "feature";
    // From now on, these are reserved by the compiler and gated through
    // #![feature(rustc_attrs)]
    static constexpr auto &RUSTC_DEPRECATED = "rustc_deprecated";
diff -Nrcpad gcc-16-20260315/gcc/rust/util/rust-attributes.cc gcc-16-20260322/gcc/rust/util/rust-attributes.cc
*** gcc-16-20260315/gcc/rust/util/rust-attributes.cc	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/util/rust-attributes.cc	Sun Mar 22 22:32:07 2026
*************** static const BuiltinAttrDefinition __def
*** 96,101 ****
--- 96,108 ----
       {Attrs::TARGET_FEATURE, CODE_GENERATION},
       // From now on, these are reserved by the compiler and gated through
       // #![feature(rustc_attrs)]
+      {Attrs::FEATURE, STATIC_ANALYSIS},
+      {Attrs::NO_CORE, CODE_GENERATION},
+      {Attrs::NO_STD, CODE_GENERATION},
+      {Attrs::DOC, EXTERNAL},
+      {Attrs::CRATE_NAME, CODE_GENERATION},
+      {Attrs::CRATE_TYPE, CODE_GENERATION},
+      {Attrs::MAY_DANGLE, STATIC_ANALYSIS},
       {Attrs::RUSTC_DEPRECATED, STATIC_ANALYSIS},
       {Attrs::RUSTC_INHERIT_OVERFLOW_CHECKS, CODE_GENERATION},
       {Attrs::STABLE, STATIC_ANALYSIS},
*************** AttributeChecker::visit (AST::Crate &cra
*** 186,200 ****
    for (auto &attr : crate.get_inner_attrs ())
      {
        check_inner_attribute (attr);
-       check_attribute (attr);
      }
  
    for (auto &item : crate.items)
      item->accept_vis (*this);
  }
  
! static bool
! is_builtin (const AST::Attribute &attribute, BuiltinAttrDefinition &builtin)
  {
    auto &segments = attribute.get_path ().get_segments ();
  
--- 193,206 ----
    for (auto &attr : crate.get_inner_attrs ())
      {
        check_inner_attribute (attr);
      }
  
    for (auto &item : crate.items)
      item->accept_vis (*this);
  }
  
! tl::optional<BuiltinAttrDefinition>
! identify_builtin (const AST::Attribute &attribute)
  {
    auto &segments = attribute.get_path ().get_segments ();
  
*************** is_builtin (const AST::Attribute &attrib
*** 202,213 ****
    // strings all over the place and performing a linear search in the builtins
    // map
    if (segments.size () != 1)
!     return false;
  
!   builtin = BuiltinAttributeMappings::get ()->lookup_builtin (
      segments.at (0).get_segment_name ());
- 
-   return !builtin.is_error ();
  }
  
  /**
--- 208,217 ----
    // strings all over the place and performing a linear search in the builtins
    // map
    if (segments.size () != 1)
!     return tl::nullopt;
  
!   return BuiltinAttributeMappings::get ()->lookup_builtin (
      segments.at (0).get_segment_name ());
  }
  
  /**
*************** check_doc_attribute (const AST::Attribut
*** 267,272 ****
--- 271,277 ----
      case AST::AttrInput::LITERAL:
      case AST::AttrInput::MACRO:
      case AST::AttrInput::META_ITEM:
+     case AST::AttrInput::EXPR:
        break;
        // FIXME: Handle them as well
  
*************** check_valid_attribute_for_item (const AS
*** 427,435 ****
  static bool
  is_proc_macro_type (const AST::Attribute &attribute)
  {
!   BuiltinAttrDefinition result;
!   if (!is_builtin (attribute, result))
      return false;
  
    auto name = result.name;
    return name == Attrs::PROC_MACRO || name == Attrs::PROC_MACRO_DERIVE
--- 432,441 ----
  static bool
  is_proc_macro_type (const AST::Attribute &attribute)
  {
!   auto result_opt = identify_builtin (attribute);
!   if (!result_opt.has_value ())
      return false;
+   auto result = result_opt.value ();
  
    auto name = result.name;
    return name == Attrs::PROC_MACRO || name == Attrs::PROC_MACRO_DERIVE
*************** check_proc_macro_non_root (const AST::At
*** 465,474 ****
  void
  AttributeChecker::check_inner_attribute (const AST::Attribute &attribute)
  {
!   BuiltinAttrDefinition result;
! 
!   if (!is_builtin (attribute, result))
      return;
  
    if (__outer_attributes.find (result.name) != __outer_attributes.end ())
      rust_error_at (attribute.get_locus (),
--- 471,480 ----
  void
  AttributeChecker::check_inner_attribute (const AST::Attribute &attribute)
  {
!   auto result_opt = identify_builtin (attribute);
!   if (!result_opt.has_value ())
      return;
+   auto result = result_opt.value ();
  
    if (__outer_attributes.find (result.name) != __outer_attributes.end ())
      rust_error_at (attribute.get_locus (),
*************** check_export_name_attribute (const AST::
*** 499,509 ****
        return;
      }
  
!   if (!Attributes::extract_string_literal (attribute))
      {
!       rust_error_at (attribute.get_locus (),
! 		     "attribute must be a string literal");
      }
  }
  
  static void
--- 505,542 ----
        return;
      }
  
!   // We don't support the whole extended_key_value_attributes feature, we only
!   // support a subset for macros. We need to emit an error message when the
!   // attribute does not contain a macro or a string literal.
!   if (attribute.has_attr_input ())
      {
!       auto &attr_input = attribute.get_attr_input ();
!       switch (attr_input.get_attr_input_type ())
! 	{
! 	case AST::AttrInput::AttrInputType::LITERAL:
! 	  {
! 	    auto &literal_expr
! 	      = static_cast<AST::AttrInputLiteral &> (attr_input)
! 		  .get_literal ();
! 	    auto lit_type = literal_expr.get_lit_type ();
! 	    switch (lit_type)
! 	      {
! 	      case AST::Literal::LitType::STRING:
! 	      case AST::Literal::LitType::RAW_STRING:
! 	      case AST::Literal::LitType::BYTE_STRING:
! 		return;
! 	      default:
! 		break;
! 	      }
! 	    break;
! 	  }
! 	case AST::AttrInput::AttrInputType::MACRO:
! 	  return;
! 	default:
! 	  break;
! 	}
      }
+   rust_error_at (attribute.get_locus (), "attribute must be a string literal");
  }
  
  static void
*************** check_lint_attribute (const AST::Attribu
*** 519,553 ****
  }
  
  void
! AttributeChecker::check_attribute (const AST::Attribute &attribute)
  {
!   if (!attribute.empty_input ())
      {
!       const auto &attr_input = attribute.get_attr_input ();
!       auto type = attr_input.get_attr_input_type ();
!       if (type == AST::AttrInput::AttrInputType::TOKEN_TREE)
! 	{
! 	  const auto &option = static_cast<const AST::DelimTokenTree &> (
! 	    attribute.get_attr_input ());
! 	  std::unique_ptr<AST::AttrInputMetaItemContainer> meta_item (
! 	    option.parse_to_meta_item ());
! 	  AST::DefaultASTVisitor::visit (meta_item);
! 	}
      }
  
!   BuiltinAttrDefinition result;
! 
!   // This checker does not check non-builtin attributes
!   if (!is_builtin (attribute, result))
!     return;
  
!   // TODO: Add checks here for each builtin attribute
!   // TODO: Have an enum of builtins as well, switching on strings is annoying
!   // and costly
!   if (result.name == Attrs::DOC)
!     check_doc_attribute (attribute);
!   else if (result.name == Attrs::DEPRECATED)
!     check_deprecated_attribute (attribute);
  }
  
  void
--- 552,581 ----
  }
  
  void
! AttributeChecker::visit (AST::Attribute &attribute)
  {
!   auto &session = Session::get_instance ();
!   if (attribute.get_path () == Values::Attributes::CFG_ATTR)
      {
!       if (!attribute.is_parsed_to_meta_item ())
! 	attribute.parse_attr_to_meta_item ();
!       if (!attribute.check_cfg_predicate (session))
! 	return; // Do not emit errors for attribute that'll get stripped.
      }
  
!   if (auto builtin = identify_builtin (attribute))
!     {
!       auto result = builtin.value ();
!       // TODO: Add checks here for each builtin attribute
!       // TODO: Have an enum of builtins as well, switching on strings is
!       // annoying and costly
!       if (result.name == Attrs::DOC)
! 	check_doc_attribute (attribute);
!       else if (result.name == Attrs::DEPRECATED)
! 	check_deprecated_attribute (attribute);
!     }
  
!   AST::DefaultASTVisitor::visit (attribute);
  }
  
  void
*************** AttributeChecker::visit (AST::Module &mo
*** 859,865 ****
    for (auto &attr : module.get_outer_attrs ())
      {
        check_valid_attribute_for_item (attr, module);
-       check_attribute (attr);
        check_proc_macro_non_function (attr);
      }
  
--- 887,892 ----
*************** AttributeChecker::visit (AST::Function &
*** 935,946 ****
    BuiltinAttrDefinition result;
    for (auto &attribute : fun.get_outer_attrs ())
      {
!       if (!is_builtin (attribute, result))
  	return;
  
!       auto name = result.name.c_str ();
  
!       if (result.name == Attrs::PROC_MACRO_DERIVE)
  	{
  	  if (!attribute.has_attr_input ())
  	    {
--- 962,974 ----
    BuiltinAttrDefinition result;
    for (auto &attribute : fun.get_outer_attrs ())
      {
!       auto result = identify_builtin (attribute);
!       if (!result)
  	return;
  
!       auto name = result->name.c_str ();
  
!       if (result->name == Attrs::PROC_MACRO_DERIVE)
  	{
  	  if (!attribute.has_attr_input ())
  	    {
*************** AttributeChecker::visit (AST::Function &
*** 953,964 ****
  	    }
  	  check_crate_type (name, attribute);
  	}
!       else if (result.name == Attrs::PROC_MACRO
! 	       || result.name == Attrs::PROC_MACRO_ATTRIBUTE)
  	{
  	  check_crate_type (name, attribute);
  	}
!       else if (result.name == Attrs::TARGET_FEATURE)
  	{
  	  if (!attribute.has_attr_input ())
  	    {
--- 981,992 ----
  	    }
  	  check_crate_type (name, attribute);
  	}
!       else if (result->name == Attrs::PROC_MACRO
! 	       || result->name == Attrs::PROC_MACRO_ATTRIBUTE)
  	{
  	  check_crate_type (name, attribute);
  	}
!       else if (result->name == Attrs::TARGET_FEATURE)
  	{
  	  if (!attribute.has_attr_input ())
  	    {
*************** AttributeChecker::visit (AST::Function &
*** 976,982 ****
  		"to %<unsafe%> functions");
  	    }
  	}
!       else if (result.name == Attrs::NO_MANGLE)
  	{
  	  if (attribute.has_attr_input ())
  	    {
--- 1004,1010 ----
  		"to %<unsafe%> functions");
  	    }
  	}
!       else if (result->name == Attrs::NO_MANGLE)
  	{
  	  if (attribute.has_attr_input ())
  	    {
*************** AttributeChecker::visit (AST::Function &
*** 988,1003 ****
  	  else
  	    check_no_mangle_function (attribute, fun);
  	}
!       else if (result.name == Attrs::EXPORT_NAME)
  	{
  	  check_export_name_attribute (attribute);
  	}
!       else if (result.name == Attrs::ALLOW || result.name == "deny"
! 	       || result.name == "warn" || result.name == "forbid")
  	{
  	  check_lint_attribute (attribute, name);
  	}
!       else if (result.name == Attrs::LINK_NAME)
  	{
  	  if (!attribute.has_attr_input ())
  	    {
--- 1016,1031 ----
  	  else
  	    check_no_mangle_function (attribute, fun);
  	}
!       else if (result->name == Attrs::EXPORT_NAME)
  	{
  	  check_export_name_attribute (attribute);
  	}
!       else if (result->name == Attrs::ALLOW || result->name == "deny"
! 	       || result->name == "warn" || result->name == "forbid")
  	{
  	  check_lint_attribute (attribute, name);
  	}
!       else if (result->name == Attrs::LINK_NAME)
  	{
  	  if (!attribute.has_attr_input ())
  	    {
*************** AttributeChecker::visit (AST::Function &
*** 1007,1013 ****
  			   "must be of the form: %<#[link_name = \"name\"]%>");
  	    }
  	}
!       else if (result.name == Attrs::LINK_SECTION)
  	{
  	  check_link_section_attribute (attribute);
  	}
--- 1035,1041 ----
  			   "must be of the form: %<#[link_name = \"name\"]%>");
  	    }
  	}
!       else if (result->name == Attrs::LINK_SECTION)
  	{
  	  check_link_section_attribute (attribute);
  	}
*************** AttributeChecker::visit (AST::StructStru
*** 1033,1041 ****
    for (auto &attr : struct_item.get_outer_attrs ())
      {
        check_valid_attribute_for_item (attr, struct_item);
-       check_attribute (attr);
        check_proc_macro_non_function (attr);
      }
  }
  
  void
--- 1061,1070 ----
    for (auto &attr : struct_item.get_outer_attrs ())
      {
        check_valid_attribute_for_item (attr, struct_item);
        check_proc_macro_non_function (attr);
      }
+ 
+   AST::DefaultASTVisitor::visit (struct_item);
  }
  
  void
*************** AttributeChecker::visit (AST::ConstantIt
*** 1097,1117 ****
  void
  AttributeChecker::visit (AST::StaticItem &item)
  {
-   BuiltinAttrDefinition result;
    for (auto &attr : item.get_outer_attrs ())
      {
        check_valid_attribute_for_item (attr, item);
        check_proc_macro_non_function (attr);
!       if (is_builtin (attr, result))
  	{
! 	  if (result.name == Attrs::LINK_SECTION)
! 	    {
! 	      check_link_section_attribute (attr);
! 	    }
! 	  else if (result.name == Attrs::EXPORT_NAME)
! 	    {
! 	      check_export_name_attribute (attr);
! 	    }
  	}
      }
  }
--- 1126,1142 ----
  void
  AttributeChecker::visit (AST::StaticItem &item)
  {
    for (auto &attr : item.get_outer_attrs ())
      {
        check_valid_attribute_for_item (attr, item);
        check_proc_macro_non_function (attr);
! 
!       if (auto result = identify_builtin (attr))
  	{
! 	  if (result->name == Attrs::LINK_SECTION)
! 	    check_link_section_attribute (attr);
! 	  else if (result->name == Attrs::EXPORT_NAME)
! 	    check_export_name_attribute (attr);
  	}
      }
  }
*************** AttributeChecker::visit (AST::Trait &tra
*** 1127,1134 ****
      {
        check_valid_attribute_for_item (attr, trait);
        check_proc_macro_non_function (attr);
-       check_attribute (attr);
      }
  }
  
  void
--- 1152,1159 ----
      {
        check_valid_attribute_for_item (attr, trait);
        check_proc_macro_non_function (attr);
      }
+   AST::DefaultASTVisitor::visit (trait);
  }
  
  void
diff -Nrcpad gcc-16-20260315/gcc/rust/util/rust-attributes.h gcc-16-20260322/gcc/rust/util/rust-attributes.h
*** gcc-16-20260315/gcc/rust/util/rust-attributes.h	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/util/rust-attributes.h	Sun Mar 22 22:32:07 2026
*************** private:
*** 106,114 ****
    /* Check the validity of an inner attribute */
    void check_inner_attribute (const AST::Attribute &attribute);
    /* Check the validity of a given attribute */
-   void check_attribute (const AST::Attribute &attribute);
  
    // rust-ast.h
    void visit (AST::Crate &crate) override;
    void visit (AST::Token &tok) override;
    void visit (AST::DelimTokenTree &delim_tok_tree) override;
--- 106,114 ----
    /* Check the validity of an inner attribute */
    void check_inner_attribute (const AST::Attribute &attribute);
    /* Check the validity of a given attribute */
  
    // rust-ast.h
+   void visit (AST::Attribute &attribute) override;
    void visit (AST::Crate &crate) override;
    void visit (AST::Token &tok) override;
    void visit (AST::DelimTokenTree &delim_tok_tree) override;
*************** private:
*** 277,282 ****
--- 277,285 ----
    void visit (AST::SelfParam &param) override;
  };
  
+ tl::optional<BuiltinAttrDefinition>
+ identify_builtin (const AST::Attribute &attribute);
+ 
  } // namespace Analysis
  } // namespace Rust
  
diff -Nrcpad gcc-16-20260315/gcc/rust/util/rust-cloneable.h gcc-16-20260322/gcc/rust/util/rust-cloneable.h
*** gcc-16-20260315/gcc/rust/util/rust-cloneable.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/rust/util/rust-cloneable.h	Sun Mar 22 22:32:07 2026
***************
*** 0 ****
--- 1,85 ----
+ // Copyright (C) 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/>.
+ 
+ #ifndef RUST_CLONEABLE
+ #define RUST_CLONEABLE
+ 
+ #include "rust-system.h"
+ 
+ namespace Rust {
+ 
+ // used to automatically copy cloneable types
+ 
+ template <typename T> struct CloneableDelegate
+ {
+ };
+ 
+ template <typename T> class Cloneable
+ {
+ public:
+   template <typename... Args>
+   Cloneable (Args &&...args) : inner (std::forward<Args> (args)...)
+   {}
+ 
+   Cloneable (const Cloneable &other)
+     : Cloneable (CloneableDelegate<T>::clone (other.inner))
+   {}
+ 
+   template <typename Arg> Cloneable &operator= (Arg &&arg)
+   {
+     inner = std::forward<Arg> (arg);
+     return *this;
+   }
+ 
+   Cloneable &operator= (const Cloneable &other)
+   {
+     inner = CloneableDelegate<T>::clone (other.inner);
+     return *this;
+   }
+ 
+   Cloneable (Cloneable &&) = default;
+   Cloneable &operator= (Cloneable &&) = default;
+ 
+   T &get () { return inner; }
+   const T &get () const { return inner; }
+ 
+   bool operator== (decltype (nullptr)) const { return inner == nullptr; }
+ 
+   bool operator!= (decltype (nullptr)) const { return inner != nullptr; }
+ 
+ private:
+   T inner;
+ };
+ 
+ // general specializations
+ 
+ template <typename T> struct CloneableDelegate<std::vector<T>>
+ {
+   static std::vector<T> clone (const std::vector<T> &other)
+   {
+     std::vector<T> ret;
+     ret.reserve (other.size ());
+     for (auto &ent : other)
+       ret.push_back (CloneableDelegate<T>::clone (ent));
+     return ret;
+   }
+ };
+ 
+ } // namespace Rust
+ 
+ #endif // RUST_CLONEABLE
diff -Nrcpad gcc-16-20260315/gcc/rust/util/rust-hir-map.cc gcc-16-20260322/gcc/rust/util/rust-hir-map.cc
*** gcc-16-20260315/gcc/rust/util/rust-hir-map.cc	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/rust/util/rust-hir-map.cc	Sun Mar 22 22:32:07 2026
*************** void
*** 915,930 ****
  Mappings::insert_macro_invocation (AST::MacroInvocation &invoc,
  				   AST::MacroRulesDefinition *def)
  {
!   auto it = macroInvocations.find (invoc.get_macro_node_id ());
    rust_assert (it == macroInvocations.end ());
  
!   macroInvocations[invoc.get_macro_node_id ()] = def;
  }
  
  tl::optional<AST::MacroRulesDefinition *>
  Mappings::lookup_macro_invocation (AST::MacroInvocation &invoc)
  {
!   auto it = macroInvocations.find (invoc.get_macro_node_id ());
    if (it == macroInvocations.end ())
      return tl::nullopt;
  
--- 915,930 ----
  Mappings::insert_macro_invocation (AST::MacroInvocation &invoc,
  				   AST::MacroRulesDefinition *def)
  {
!   auto it = macroInvocations.find (invoc.get_node_id ());
    rust_assert (it == macroInvocations.end ());
  
!   macroInvocations[invoc.get_node_id ()] = def;
  }
  
  tl::optional<AST::MacroRulesDefinition *>
  Mappings::lookup_macro_invocation (AST::MacroInvocation &invoc)
  {
!   auto it = macroInvocations.find (invoc.get_node_id ());
    if (it == macroInvocations.end ())
      return tl::nullopt;
  
*************** void
*** 1084,1099 ****
  Mappings::insert_bang_proc_macro_invocation (AST::MacroInvocation &invoc,
  					     BangProcMacro def)
  {
!   auto it = procmacroBangInvocations.find (invoc.get_macro_node_id ());
    rust_assert (it == procmacroBangInvocations.end ());
  
!   procmacroBangInvocations[invoc.get_macro_node_id ()] = def;
  }
  
  tl::optional<BangProcMacro &>
  Mappings::lookup_bang_proc_macro_invocation (AST::MacroInvocation &invoc)
  {
!   auto it = procmacroBangInvocations.find (invoc.get_macro_node_id ());
    if (it == procmacroBangInvocations.end ())
      return tl::nullopt;
  
--- 1084,1099 ----
  Mappings::insert_bang_proc_macro_invocation (AST::MacroInvocation &invoc,
  					     BangProcMacro def)
  {
!   auto it = procmacroBangInvocations.find (invoc.get_node_id ());
    rust_assert (it == procmacroBangInvocations.end ());
  
!   procmacroBangInvocations[invoc.get_node_id ()] = def;
  }
  
  tl::optional<BangProcMacro &>
  Mappings::lookup_bang_proc_macro_invocation (AST::MacroInvocation &invoc)
  {
!   auto it = procmacroBangInvocations.find (invoc.get_node_id ());
    if (it == procmacroBangInvocations.end ())
      return tl::nullopt;
  
diff -Nrcpad gcc-16-20260315/gcc/rust/util/rust-intrinsic-values.h gcc-16-20260322/gcc/rust/util/rust-intrinsic-values.h
*** gcc-16-20260315/gcc/rust/util/rust-intrinsic-values.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/rust/util/rust-intrinsic-values.h	Sun Mar 22 22:32:07 2026
***************
*** 0 ****
--- 1,100 ----
+ // Copyright (C) 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/>.
+ 
+ namespace Rust {
+ namespace Values {
+ class Intrinsics
+ {
+ public:
+   static constexpr auto &ABORT = "abort";
+   static constexpr auto &OFFSET = "offset";
+   static constexpr auto &SIZE_OF = "size_of";
+   static constexpr auto &TRANSMUTE = "transmute";
+ 
+   static constexpr auto &ADD_WITH_OVERFLOW = "add_with_overflow";
+   static constexpr auto &SUB_WITH_OVERFLOW = "sub_with_overflow";
+   static constexpr auto &MUL_WITH_OVERFLOW = "mul_with_overflow";
+ 
+   static constexpr auto &COPY = "copy";
+   static constexpr auto &COPY_NONOVERLAPPING = "copy_nonoverlapping";
+ 
+   static constexpr auto &PREFETCH_READ_DATA = "prefetch_read_data";
+   static constexpr auto &PREFETCH_WRITE_DATA = "prefetch_write_data";
+ 
+   static constexpr auto &ATOMIC_STORE_SEQCST = "atomic_store_seqcst";
+   static constexpr auto &ATOMIC_STORE_RELEASE = "atomic_store_release";
+   static constexpr auto &ATOMIC_STORE_RELAXED = "atomic_store_relaxed";
+   static constexpr auto &ATOMIC_STORE_UNORDERED = "atomic_store_unordered";
+ 
+   static constexpr auto &ATOMIC_LOAD_SEQCST = "atomic_load_seqcst";
+   static constexpr auto &ATOMIC_LOAD_ACQUIRE = "atomic_load_acquire";
+   static constexpr auto &ATOMIC_LOAD_RELAXED = "atomic_load_relaxed";
+   static constexpr auto &ATOMIC_LOAD_UNORDERED = "atomic_load_unordered";
+ 
+   static constexpr auto &UNCHECKED_ADD = "unchecked_add";
+   static constexpr auto &UNCHECKED_SUB = "unchecked_sub";
+   static constexpr auto &UNCHECKED_MUL = "unchecked_mul";
+   static constexpr auto &UNCHECKED_DIV = "unchecked_div";
+   static constexpr auto &UNCHECKED_REM = "unchecked_rem";
+   static constexpr auto &UNCHECKED_SHL = "unchecked_shl";
+   static constexpr auto &UNCHECKED_SHR = "unchecked_shr";
+ 
+   static constexpr auto &UNINIT = "uninit";
+   static constexpr auto &MOVE_VAL_INIT = "move_val_init";
+ 
+   static constexpr auto &ROTATE_LEFT = "rotate_left";
+   static constexpr auto &ROTATE_RIGHT = "rotate_right";
+ 
+   static constexpr auto &WRAPPING_ADD = "wrapping_add";
+   static constexpr auto &WRAPPING_SUB = "wrapping_sub";
+   static constexpr auto &WRAPPING_MUL = "wrapping_mul";
+ 
+   static constexpr auto &SATURATING_ADD = "saturating_add";
+   static constexpr auto &SATURATING_SUB = "saturating_sub";
+ 
+   static constexpr auto &LIKELY = "likely";
+   static constexpr auto &UNLIKELY = "unlikely";
+ 
+   static constexpr auto &DISCRIMINANT_VALUE = "discriminant_value";
+   static constexpr auto &VARIANT_COUNT = "variant_count";
+   static constexpr auto &CATCH_UNWIND = "catch_unwind";
+   static constexpr auto &TRY = "try";
+   static constexpr auto &ASSUME = "assume";
+ 
+   static constexpr auto &MIN_ALIGN_OF = "min_align_of";
+   static constexpr auto &NEEDS_DROP = "needs_drop";
+   static constexpr auto &CALLER_LOCATION = "caller_location";
+   static constexpr auto &CTPOP = "ctpop";
+   static constexpr auto &CTLZ = "ctlz";
+   static constexpr auto &CTTZ = "cttz";
+   static constexpr auto &BSWAP = "bswap";
+   static constexpr auto &BITREVERSE = "bitreverse";
+   static constexpr auto &TYPE_ID = "type_id";
+   static constexpr auto &PTR_GUARANTEED_EQ = "ptr_guaranteed_eq";
+   static constexpr auto &PTR_GUARANTEED_NE = "ptr_guaranteed_ne";
+   static constexpr auto &MINNUMF32 = "minnumf32";
+   static constexpr auto &MINNUMF64 = "minnumf64";
+   static constexpr auto &MAXNUMF32 = "maxnumf32";
+   static constexpr auto &MAXNUMF64 = "maxnumf64";
+   static constexpr auto &RUSTC_PEEK = "rustc_peek";
+   static constexpr auto &TYPE_NAME = "type_name";
+   static constexpr auto &FORGET = "forget";
+   static constexpr auto &BLACK_BOX = "black_box";
+ };
+ } // namespace Values
+ } // namespace Rust
diff -Nrcpad gcc-16-20260315/gcc/testsuite/ChangeLog gcc-16-20260322/gcc/testsuite/ChangeLog
*** gcc-16-20260315/gcc/testsuite/ChangeLog	Sun Mar 15 22:32:08 2026
--- gcc-16-20260322/gcc/testsuite/ChangeLog	Sun Mar 22 22:32:07 2026
***************
*** 1,3 ****
--- 1,329 ----
+ 2026-03-21  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/122786
+ 	* g++.dg/modules/attrib-5_a.C: New test.
+ 	* g++.dg/modules/attrib-5_b.C: New test.
+ 
+ 2026-03-21  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/124483
+ 	* g++.dg/modules/attrib-4_a.C: New test.
+ 	* g++.dg/modules/attrib-4_b.C: New test.
+ 
+ 2026-03-20  Tobias Burnus  <tburnus@baylibre.com>
+ 	    Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR c/122866
+ 	* c-c++-common/gomp/pr122866.c: New.
+ 
+ 2026-03-20  Kwok Cheung Yeung  <kcyeung@baylibre.com>
+ 	    Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* c-c++-common/gomp/target-map-iterators-6.c: New.
+ 
+ 2026-03-20  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	* gnat.dg/implicit_deref1.adb: New test.
+ 	* gnat.dg/implicit_deref2.adb: Likewise.
+ 	* gnat.dg/implicit_deref3.adb: Likewise.
+ 
+ 2026-03-20  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/124575
+ 	* g++.dg/reflect/expr16.C: New test.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* rust/compile/cli_inner_attribute_injection.rs: New test.
+ 
+ 2026-03-20  Enes Cevik  <nsvke@proton.me>
+ 
+ 	* rust/compile/bswap.rs: New test.
+ 	* rust/execute/bswap.rs: New test.
+ 
+ 2026-03-20  Mohamed Ali  <mohmedali1462005@gmail.com>
+ 
+ 	* rust/compile/match-scope.rs: Fix test.
+ 	* rust/compile/no_core_feature_gate.rs: New test.
+ 
+ 2026-03-20  Harishankar  <harishankarpp7@gmail.com>
+ 
+ 	* rust/compile/issue-4411.rs: New test.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* rust/compile/wildcard_items.rs: Move to...
+ 	* rust/compile/wildcard_const.rs: ...here.
+ 	* rust/compile/wildcard_enum.rs: New test.
+ 	* rust/compile/wildcard_enum_variant.rs: New test.
+ 	* rust/compile/wildcard_static.rs: New test.
+ 	* rust/compile/wildcard_struct.rs: New test.
+ 	* rust/compile/wildcard_variable.rs: New test.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* rust/compile/issue-3947.rs: Do not expect a warning on this
+ 	underscore prefixed function.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* rust/compile/wildcard_items.rs: New test.
+ 
+ 2026-03-20  Owen Avery  <powerboat9.gamer@gmail.com>
+ 
+ 	* rust/execute/torture/match-structpattern-tuplefield.rs: Fix
+ 	test.
+ 	* rust/compile/match-scope.rs: New test.
+ 
+ 2026-03-20  jayant chauhan  <0001jayant@gmail.com>
+ 
+ 	* rust/compile/issue-3951.rs: New test.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* rust/compile/attr_malformed_path.rs: Filter existing test to x86_64
+ 	exclusively, add two new tests that appear when visiting the resulting
+ 	expression.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* rust/compile/issue-4212.rs: Update test with the new errors.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* rust/compile/issue-3661.rs: Add key_value_attribute feature to
+ 	prevent error on stringify macro.
+ 	* rust/compile/early_feature_gate_in_macro.rs: Add test to highlight
+ 	early feature gate error collection within macros.
+ 
+ 2026-03-20  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* rust/compile/doc_macro.rs: Enable feature to use a macro within an
+ 	attribute input.
+ 	* rust/compile/parse_time_feature_gate.rs: New test.
+ 
+ 2026-03-20  Harishankar  <harishankarpp7@gmail.com>
+ 
+ 	* rust/compile/issue-4413.rs: New test.
+ 
+ 2026-03-20  jayant chauhan  <0001jayant@gmail.com>
+ 
+ 	* rust/compile/issue-4433.rs: Update test to expect valid line numbers.
+ 
+ 2026-03-20  Yangyu Chen  <cyy@cyyself.name>
+ 
+ 	* g++.target/aarch64/virtual-lto.C: New test.
+ 
+ 2026-03-20  Christopher Albert  <albert@tugraz.at>
+ 
+ 	PR fortran/84779
+ 	PR fortran/84779
+ 	* gfortran.dg/pr84779.f90: New test.
+ 
+ 2026-03-20  Christopher Albert  <albert@tugraz.at>
+ 
+ 	PR fortran/120723
+ 	* gfortran.dg/goacc/pr120723.f90: New test.
+ 
+ 2026-03-19  Paul Thomas  <pault@gcc.gnu.org>
+ 
+ 	PR fortran/124161
+ 	* gfortran.dg/pr124161.f90: New test.
+ 
+ 2026-03-19  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/124466
+ 	* g++.dg/modules/warn-spec-5_a.C: New test.
+ 	* g++.dg/modules/warn-spec-5_b.C: New test.
+ 	* g++.dg/modules/warn-spec-5_c.C: New test.
+ 
+ 2026-03-19  feedable  <feedabl3@gmail.com>
+ 
+ 	* gcc.dg/weak/weak-1.c: Use a function to scan
+ 	for weak symbols instead of a regex.
+ 	* gcc.dg/weak/weak-10.c: Likewise.
+ 	* gcc.dg/weak/weak-11.c: Likewise.
+ 	* gcc.dg/weak/weak-12.c: Likewise.
+ 	* gcc.dg/weak/weak-15.c: Likewise.
+ 	* gcc.dg/weak/weak-16.c: Likewise.
+ 	* gcc.dg/weak/weak-2.c: Likewise.
+ 	* gcc.dg/weak/weak-3.c: Likewise.
+ 	* gcc.dg/weak/weak-4.c: Likewise.
+ 	* gcc.dg/weak/weak-5.c: Likewise.
+ 	* gcc.dg/weak/weak-9.c: Likewise.
+ 	* lib/scanasm.exp: Implement the weak-scanning function.
+ 
+ 2026-03-18  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+ 
+ 	PR d/124158
+ 	* gdc.test/runnable/dbitfieldsdm.d: Remove.
+ 
+ 2026-03-18  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/124555
+ 	* gcc.dg/torture/pr124555.c: New testcase.
+ 	* g++.dg/absvect.C: Restrict dump scan to x86-64 and force
+ 	-msse4 there.
+ 
+ 2026-03-18  Dhruv Chawla  <dhruvc@nvidia.com>
+ 
+ 	* lib/profopt.exp: Invoke $GCC_UNDER_TEST with
+ 	`--print-autofdo-gcov-version` before running create_gcov to get
+ 	the GCOV version.
+ 
+ 2026-03-18  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	* gcc.dg/tree-ssa/forwprop-42.c: Add -Wno-psabi to dg-options.
+ 	* gcc.dg/tree-ssa/forwprop-43.c: Likewise.  For ia32 add -msse2 as
+ 	dg-additional-options.
+ 	* gcc.dg/torture/pr65270-3.c: Add -Wno-psabi to dg-options.
+ 	* gcc.target/i386/part-vect-absnegbf.c: Add -msse2 to dg-options.
+ 
+ 2026-03-17  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/124493
+ 	* g++.dg/reflect/crash23.C: New test.
+ 
+ 2026-03-17  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+ 
+ 	PR fortran/120286
+ 	* gfortran.dg/pr120286.f90: Removed.
+ 
+ 2026-03-17  Alice Carlotti  <alice.carlotti@arm.com>
+ 
+ 	* gcc.target/aarch64/sme/acle-asm/revd_bf16.c: Update checks.
+ 	* gcc.target/aarch64/sme/acle-asm/revd_f16.c: Likewise.
+ 	* gcc.target/aarch64/sme/acle-asm/revd_f32.c: Likewise.
+ 	* gcc.target/aarch64/sme/acle-asm/revd_f64.c: Likewise.
+ 	* gcc.target/aarch64/sme/acle-asm/revd_mf8.c: Likewise.
+ 	* gcc.target/aarch64/sme/acle-asm/revd_s16.c: Likewise.
+ 	* gcc.target/aarch64/sme/acle-asm/revd_s32.c: Likewise.
+ 	* gcc.target/aarch64/sme/acle-asm/revd_s64.c: Likewise.
+ 	* gcc.target/aarch64/sme/acle-asm/revd_s8.c: Likewise.
+ 	* gcc.target/aarch64/sme/acle-asm/revd_u16.c: Likewise.
+ 	* gcc.target/aarch64/sme/acle-asm/revd_u32.c: Likewise.
+ 	* gcc.target/aarch64/sme/acle-asm/revd_u64.c: Likewise.
+ 	* gcc.target/aarch64/sme/acle-asm/revd_u8.c: Likewise.
+ 	* gcc.target/aarch64/sve2/acle/asm/revd_bf16.c: Likewise.
+ 	* gcc.target/aarch64/sve2/acle/asm/revd_f16.c: Likewise.
+ 	* gcc.target/aarch64/sve2/acle/asm/revd_f32.c: Likewise.
+ 	* gcc.target/aarch64/sve2/acle/asm/revd_f64.c: Likewise.
+ 	* gcc.target/aarch64/sve2/acle/asm/revd_mf8.c: Likewise.
+ 	* gcc.target/aarch64/sve2/acle/asm/revd_s16.c: Likewise.
+ 	* gcc.target/aarch64/sve2/acle/asm/revd_s32.c: Likewise.
+ 	* gcc.target/aarch64/sve2/acle/asm/revd_s64.c: Likewise.
+ 	* gcc.target/aarch64/sve2/acle/asm/revd_s8.c: Likewise.
+ 	* gcc.target/aarch64/sve2/acle/asm/revd_u16.c: Likewise.
+ 	* gcc.target/aarch64/sve2/acle/asm/revd_u32.c: Likewise.
+ 	* gcc.target/aarch64/sve2/acle/asm/revd_u64.c: Likewise.
+ 	* gcc.target/aarch64/sve2/acle/asm/revd_u8.c: Likewise.
+ 
+ 2026-03-17  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/109521
+ 	* g++.dg/warn/Wuninitialized-35.C: New test.
+ 
+ 2026-03-17  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/115852
+ 	* g++.dg/cpp23/explicit-obj-lambda22.C: New test.
+ 
+ 2026-03-17  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/118482
+ 	* g++.dg/cpp2a/lambda-uneval31.C: New test.
+ 
+ 2026-03-17  Philipp Tomsich  <philipp.tomsich@vrull.eu>
+ 
+ 	PR rtl-optimization/124476
+ 	* gcc.dg/pr124476.c: New test.
+ 
+ 2026-03-17  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/124494
+ 	* g++.dg/reflect/decltype1.C: New test.
+ 
+ 2026-03-17  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/124472
+ 	* g++.dg/reflect/using2.C: New test.
+ 
+ 2026-03-17  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/124493
+ 	* g++.dg/reflect/crash19.C: New test.
+ 	* g++.dg/reflect/crash22.C: New test.
+ 
+ 2026-03-17  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/122380
+ 	* g++.dg/torture/pr122380.C: New testcase.
+ 	* gcc.dg/torture/pr65270-3.c: Likewise.
+ 	* gcc.dg/tree-ssa/ssa-pre-30.c: XFAIL.
+ 
+ 2026-03-17  Yangyu Chen  <cyy@cyyself.name>
+ 
+ 	* gcc.target/i386/tct-ipa-inline-ice.c: New test.
+ 
+ 2026-03-17  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/124489
+ 	* g++.dg/cpp0x/pr124489.C: New test.
+ 
+ 2026-03-17  Christopher Albert  <albert@tugraz.at>
+ 
+ 	PR fortran/120286
+ 	* gfortran.dg/pr120286.f90: New test.
+ 
+ 2026-03-16  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/124496
+ 	* g++.dg/reflect/crash20.C: New test.
+ 	* g++.dg/reflect/crash21.C: New test.
+ 
+ 2026-03-16  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/123618
+ 	* g++.dg/reflect/annotations14.C: New test.
+ 
+ 2026-03-16  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR c++/124307
+ 	* g++.dg/cpp0x/alignas24.C: New test.
+ 
+ 2026-03-16  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/124489
+ 	* g++.dg/reflect/diag6.C: New test.
+ 
+ 2026-03-16  Alex Coplan  <alex.coplan@arm.com>
+ 
+ 	PR middle-end/124491
+ 	* gcc.target/aarch64/torture/pr124491.c: New test.
+ 
+ 2026-03-16  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/124528
+ 	* gcc.dg/tree-ssa/scev-17.c: New testcase.
+ 
+ 2026-03-16  Paul Thomas  <pault@gcc.gnu.org>
+ 	    Steve Kargl  <kargls@comcast.net>
+ 
+ 	PR fortran/93832
+ 	* gfortran.dg/pr93832.f90: New test.
+ 
+ 2026-03-16  Paul Thomas  <pault@gcc.gnu.org>
+ 
+ 	PR fortran/105168
+ 	* gfortran.dg/pr105168.f90: New test.
+ 
+ 2026-03-16  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/120039
+ 	PR c++/122559
+ 	* g++.dg/cpp26/decomp28.C: New test.
+ 	* g++.dg/cpp26/decomp29.C: New test.
+ 
  2026-03-14  Jakub Jelinek  <jakub@redhat.com>
  
  	PR c++/124399
diff -Nrcpad gcc-16-20260315/gcc/testsuite/c-c++-common/gomp/pr122866.c gcc-16-20260322/gcc/testsuite/c-c++-common/gomp/pr122866.c
*** gcc-16-20260315/gcc/testsuite/c-c++-common/gomp/pr122866.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/c-c++-common/gomp/pr122866.c	Sun Mar 22 22:32:08 2026
***************
*** 0 ****
--- 1,21 ----
+ /* { dg-do "compile" } */
+ 
+ struct test { int x; };
+ 
+ #pragma omp begin declare target
+ void froggify (struct test);
+ #pragma omp end declare target
+ 
+ #pragma omp declare mapper(struct test v) map(iterator(i = 0:1), tofrom: v.x)
+ /* { dg-message "sorry, unimplemented: user-defined mapper that uses a .map. clause with .iterator." "" { target *-*-* } .-1 } */
+ 
+ int
+ main ()
+ {
+   struct test s;
+   s.x = -1;
+   #pragma omp target
+   {
+     froggify (s);
+   }
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/c-c++-common/gomp/target-map-iterators-6.c gcc-16-20260322/gcc/testsuite/c-c++-common/gomp/target-map-iterators-6.c
*** gcc-16-20260315/gcc/testsuite/c-c++-common/gomp/target-map-iterators-6.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/c-c++-common/gomp/target-map-iterators-6.c	Sun Mar 22 22:32:08 2026
***************
*** 0 ****
--- 1,17 ----
+ /* { dg-do compile } */
+ /* { dg-options "-fopenmp -fdump-tree-gimple" } */
+ 
+ #define DIM 17
+ 
+ void f (int **x)
+ {
+     #pragma omp target data map(iterator(it = 0:DIM), tofrom: x[it])
+       {
+         for (int i = 0; i < DIM; i++)
+           *x[i] += i;
+       }
+ }
+ 
+ /* { dg-final { scan-tree-dump "if \\(i <= 16\\) goto <D\\\.\[0-9\]+>; else goto <D\\\.\[0-9\]+>;" "gimple" } } */
+ /* { dg-final { scan-tree-dump "map\\(iterator\\(int it=0:17:1, .+\\):tofrom:\\*D\\\.\[0-9\]+" "gimple" } } */
+ /* { dg-final { scan-tree-dump "map\\(iterator\\(int it=0:17:1, .+\\):attach:x" "gimple" } } */
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/absvect.C gcc-16-20260322/gcc/testsuite/g++.dg/absvect.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/absvect.C	Sun Mar 15 22:32:09 2026
--- gcc-16-20260322/gcc/testsuite/g++.dg/absvect.C	Sun Mar 22 22:32:08 2026
***************
*** 1,6 ****
  /* { dg-do compile } */
  /* { dg-options "-Ofast -fdump-tree-phiopt1" } */
! /* { dg-final { scan-tree-dump-times " = ABS_EXPR <x_\[0-9]*\\\(D\\\)>;" 1 "phiopt1" } } */
  
  typedef int v2si __attribute__ ((vector_size (2 * sizeof(int))));
  typedef short v2hi __attribute__ ((vector_size (2 * sizeof(short))));
--- 1,7 ----
  /* { dg-do compile } */
  /* { dg-options "-Ofast -fdump-tree-phiopt1" } */
! /* { dg-additional-options "-msse4" { target { x86_64-*-* i?86-*-* } } } */
! /* { dg-final { scan-tree-dump-times " = ABS_EXPR <x_\[0-9]*\\\(D\\\)>;" 1 "phiopt1" { target { x86_64-*-* i?86-*-* } } } } */
  
  typedef int v2si __attribute__ ((vector_size (2 * sizeof(int))));
  typedef short v2hi __attribute__ ((vector_size (2 * sizeof(short))));
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/cpp0x/alignas24.C gcc-16-20260322/gcc/testsuite/g++.dg/cpp0x/alignas24.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/cpp0x/alignas24.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/cpp0x/alignas24.C	Sun Mar 22 22:32:08 2026
***************
*** 0 ****
--- 1,5 ----
+ // PR c++/124307
+ // { dg-do compile { target c++11 } }
+ // { dg-options "" }
+ 
+ class : alignas // { dg-error "" }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/cpp0x/pr124489.C gcc-16-20260322/gcc/testsuite/g++.dg/cpp0x/pr124489.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/cpp0x/pr124489.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/cpp0x/pr124489.C	Sun Mar 22 22:32:08 2026
***************
*** 0 ****
--- 1,9 ----
+ // PR c++/124489
+ // { dg-do compile { target c++11 } }
+ 
+ void
+ g ()
+ {
+   constexpr decltype(nullptr) dm = nullptr; // { dg-message ".constexpr std::nullptr_t dm. previously declared here" }
+   constexpr decltype(nullptr) dm = nullptr; // { dg-error "redeclaration of .constexpr std::nullptr_t dm." }
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda22.C gcc-16-20260322/gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda22.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda22.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda22.C	Sun Mar 22 22:32:08 2026
***************
*** 0 ****
--- 1,15 ----
+ // PR c++/115852
+ // { dg-do compile { target c++23 } }
+ 
+ template<class...Ts0>
+ auto x(Ts0&&...  ) requires requires {
+     []<class Self>(this Self&&) {
+ 
+     };
+ } {
+     return 0;
+ }
+ 
+ int main() {
+     return x(1);
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/cpp26/decomp28.C gcc-16-20260322/gcc/testsuite/g++.dg/cpp26/decomp28.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/cpp26/decomp28.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/cpp26/decomp28.C	Sun Mar 22 22:32:08 2026
***************
*** 0 ****
--- 1,23 ----
+ // PR c++/120039
+ // { dg-do compile { target c++11 } }
+ // { dg-options "" }
+ 
+ struct S {
+   int a; long long b; short c;
+   explicit operator bool () const noexcept { return true; }
+ };
+ 
+ template <int N>
+ void
+ foo ()
+ {
+   S s = S { 1, 2, 3 };
+   if (auto [sx, sy, sz] : s)	// { dg-warning "structured bindings in conditions only available with" "" { target c++23_down } }
+     ;				// { dg-error "expected initializer before ':' token" "" { target *-*-* } .-1 }
+ }				// { dg-error "expected '\\\)' before ':' token" "" { target *-*-* } .-2 }
+ 
+ int
+ main ()
+ {
+   foo <0> ();
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/cpp26/decomp29.C gcc-16-20260322/gcc/testsuite/g++.dg/cpp26/decomp29.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/cpp26/decomp29.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/cpp26/decomp29.C	Sun Mar 22 22:32:08 2026
***************
*** 0 ****
--- 1,19 ----
+ // PR c++/122559
+ // { dg-do compile { target c++11 } }
+ // { dg-options "" }
+ 
+ enum class A : bool { B, C };
+ 
+ template <typename T>
+ A type (T &&x)
+ {
+   if (auto [value = x ()])	// { dg-warning "structured bindings in conditions only available with" "" { target c++23_down } }
+     return A::C;		// { dg-error "expected '\\\]' before '=' token" "" { target *-*-* } .-1 }
+   return A::B;			// { dg-error "expected initializer before '\\\)' token" "" { target *-*-* } .-2 }
+ }
+ 
+ int
+ main ()
+ {
+   auto _ = type (A::B);
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/cpp2a/lambda-uneval31.C gcc-16-20260322/gcc/testsuite/g++.dg/cpp2a/lambda-uneval31.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/cpp2a/lambda-uneval31.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/cpp2a/lambda-uneval31.C	Sun Mar 22 22:32:08 2026
***************
*** 0 ****
--- 1,12 ----
+ // PR c++/118482
+ // { dg-do compile { target c++20 } }
+ 
+ using what_type = decltype(
+     [](auto&& self,
+         decltype([](decltype(self)&){}) x = {}){ return x; });
+ 
+ what_type x;
+ 
+ int main() {
+     if (x(x)) return 1;
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/modules/attrib-4_a.C gcc-16-20260322/gcc/testsuite/g++.dg/modules/attrib-4_a.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/modules/attrib-4_a.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/modules/attrib-4_a.C	Sun Mar 22 22:32:08 2026
***************
*** 0 ****
--- 1,8 ----
+ // PR c++/124483
+ // { dg-additional-options "-fmodules -Wunused-parameter" }
+ // { dg-module-cmi B }
+ 
+ export module B;
+ 
+ export template <typename T = void>
+ void foo([[maybe_unused]] int x) {}
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/modules/attrib-4_b.C gcc-16-20260322/gcc/testsuite/g++.dg/modules/attrib-4_b.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/modules/attrib-4_b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/modules/attrib-4_b.C	Sun Mar 22 22:32:08 2026
***************
*** 0 ****
--- 1,8 ----
+ // PR c++/124483
+ // { dg-additional-options "-fmodules -Wunused-parameter" }
+ 
+ import B;
+ 
+ int main() {
+   foo(123);
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/modules/attrib-5_a.C gcc-16-20260322/gcc/testsuite/g++.dg/modules/attrib-5_a.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/modules/attrib-5_a.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/modules/attrib-5_a.C	Sun Mar 22 22:32:08 2026
***************
*** 0 ****
--- 1,12 ----
+ // PR c++/122786
+ // { dg-additional-options "-fmodules" }
+ // { dg-require-effective-target named_sections }
+ // { dg-module-cmi M }
+ 
+ export module M;
+ 
+ export inline void a() __attribute__((section("barbar")));
+ inline void a() {}
+ 
+ export [[gnu::section("quxqux")]] inline void b();
+ inline void b() {}
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/modules/attrib-5_b.C gcc-16-20260322/gcc/testsuite/g++.dg/modules/attrib-5_b.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/modules/attrib-5_b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/modules/attrib-5_b.C	Sun Mar 22 22:32:08 2026
***************
*** 0 ****
--- 1,13 ----
+ // PR c++/122786
+ // { dg-additional-options "-fmodules" }
+ // { dg-require-effective-target named_sections }
+ 
+ import M;
+ 
+ int main() {
+   a();
+   b();
+ }
+ 
+ // { dg-final { scan-assembler {barbar} } }
+ // { dg-final { scan-assembler {quxqux} } }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/modules/warn-spec-5_a.C gcc-16-20260322/gcc/testsuite/g++.dg/modules/warn-spec-5_a.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/modules/warn-spec-5_a.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/modules/warn-spec-5_a.C	Sun Mar 22 22:32:08 2026
***************
*** 0 ****
--- 1,12 ----
+ // PR c++/124466
+ // { dg-additional-options "-fmodules" }
+ // { dg-module-cmi A }
+ 
+ export module A;
+ 
+ #define PUSH _Pragma("GCC diagnostic push")
+ #define POP _Pragma("GCC diagnostic pop")
+ 
+ PUSH
+ #pragma GCC diagnostic ignored "-Wvariadic-macros"
+ POP
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/modules/warn-spec-5_b.C gcc-16-20260322/gcc/testsuite/g++.dg/modules/warn-spec-5_b.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/modules/warn-spec-5_b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/modules/warn-spec-5_b.C	Sun Mar 22 22:32:08 2026
***************
*** 0 ****
--- 1,8 ----
+ // PR c++/124466
+ // { dg-additional-options "-fmodules -fdump-lang-module" }
+ // { dg-module-cmi B }
+ 
+ export module B;
+ export import A;
+ 
+ // { dg-final { scan-lang-dump {Diagnostic changes: 0} module } }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/modules/warn-spec-5_c.C gcc-16-20260322/gcc/testsuite/g++.dg/modules/warn-spec-5_c.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/modules/warn-spec-5_c.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/modules/warn-spec-5_c.C	Sun Mar 22 22:32:08 2026
***************
*** 0 ****
--- 1,4 ----
+ // PR c++/124466
+ // { dg-additional-options "-fmodules" }
+ 
+ import B;
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/reflect/annotations14.C gcc-16-20260322/gcc/testsuite/g++.dg/reflect/annotations14.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/reflect/annotations14.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/reflect/annotations14.C	Sun Mar 22 22:32:09 2026
***************
*** 0 ****
--- 1,5 ----
+ // PR c++/123618
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ void f([[=1]] void) {}  // { dg-error "annotation on void parameter" }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/reflect/crash19.C gcc-16-20260322/gcc/testsuite/g++.dg/reflect/crash19.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/reflect/crash19.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/reflect/crash19.C	Sun Mar 22 22:32:09 2026
***************
*** 0 ****
--- 1,8 ----
+ // PR c++/124493
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct Y { };
+ template<decltype(^^::) R>
+ constexpr auto f (typename [:R:]<0> x) { return x; }  // { dg-error "expected a reflection of a type template" }
+ constexpr auto a = f<^^Y>(Y{}); // { dg-error "no matching function for call" }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/reflect/crash20.C gcc-16-20260322/gcc/testsuite/g++.dg/reflect/crash20.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/reflect/crash20.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/reflect/crash20.C	Sun Mar 22 22:32:09 2026
***************
*** 0 ****
--- 1,18 ----
+ // PR c++/124496
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ template<unsigned>
+ struct A {};
+ 
+ template<int N>
+ static constexpr int var = N;
+ 
+ template<decltype(^^void) R, typename T>
+ constexpr auto f ()   // { dg-error "deduced class type .A. in function return type" }
+   -> A<([:R<T>:])>    // { dg-error "invalid|expected" }
+ {
+   return {};
+ }
+ 
+ constexpr auto a = f<^^var, int>();   // { dg-error "declared" }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/reflect/crash21.C gcc-16-20260322/gcc/testsuite/g++.dg/reflect/crash21.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/reflect/crash21.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/reflect/crash21.C	Sun Mar 22 22:32:09 2026
***************
*** 0 ****
--- 1,20 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ 
+ template <typename T>
+ using A = decltype (T.[:std::meta::nonstatic_data_members_of (^^T, std::meta::access_context::unchecked ())[0]:]);  // { dg-error "expected" }
+ 
+ struct C
+ {
+   int c;
+   long d;
+ };
+ 
+ int
+ main ()
+ {
+   [] <typename T = C> requires (requires { A<T> {}; })	// { dg-error "expected|not declared" }
+     {} ();  // { dg-error "no match" }
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/reflect/crash22.C gcc-16-20260322/gcc/testsuite/g++.dg/reflect/crash22.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/reflect/crash22.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/reflect/crash22.C	Sun Mar 22 22:32:09 2026
***************
*** 0 ****
--- 1,8 ----
+ // PR c++/124493
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ template<typename T> void Y(T);	// { dg-message "but .Y. is a function template" }
+ template<decltype(^^::) R>
+ constexpr auto f () -> [:R:]<0> { return {}; }	// { dg-error "expected a reflection of a type template" }
+ constexpr auto a = f<^^Y>(); // { dg-error "no matching function" }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/reflect/crash23.C gcc-16-20260322/gcc/testsuite/g++.dg/reflect/crash23.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/reflect/crash23.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/reflect/crash23.C	Sun Mar 22 22:32:09 2026
***************
*** 0 ****
--- 1,9 ----
+ // PR c++/124493
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ template<typename T>
+ constexpr T Y{};	// { dg-message "but .Y<T>. is a variable template" }
+ template<decltype(^^::) R>
+ constexpr auto f () -> [:R:]<0> { return {}; }	// { dg-error "expected a reflection of a type template" }
+ constexpr auto a = f<^^Y>(); // { dg-error "no matching function" }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/reflect/decltype1.C gcc-16-20260322/gcc/testsuite/g++.dg/reflect/decltype1.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/reflect/decltype1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/reflect/decltype1.C	Sun Mar 22 22:32:09 2026
***************
*** 0 ****
--- 1,9 ----
+ // PR c++/124494
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ typedef signed char int8_t;
+ namespace std {
+   using ::int8_t;
+ }
+ auto rr = ^^decltype(std::int8_t); // { dg-error "argument to .decltype. must be an expression" }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/reflect/diag6.C gcc-16-20260322/gcc/testsuite/g++.dg/reflect/diag6.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/reflect/diag6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/reflect/diag6.C	Sun Mar 22 22:32:09 2026
***************
*** 0 ****
--- 1,10 ----
+ // PR c++/124489
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ void
+ g ()
+ {
+   constexpr decltype(^^::) dm = ^^int; // { dg-message ".constexpr std::meta::info dm. previously declared here" }
+   constexpr decltype(^^::) dm = ^^int; // { dg-error "redeclaration of .constexpr std::meta::info dm." }
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/reflect/expr16.C gcc-16-20260322/gcc/testsuite/g++.dg/reflect/expr16.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/reflect/expr16.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/reflect/expr16.C	Sun Mar 22 22:32:09 2026
***************
*** 0 ****
--- 1,5 ----
+ // PR c++/124575
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ constexpr const decltype(^^::) &r = ^^int;
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/reflect/using2.C gcc-16-20260322/gcc/testsuite/g++.dg/reflect/using2.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/reflect/using2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/reflect/using2.C	Sun Mar 22 22:32:09 2026
***************
*** 0 ****
--- 1,12 ----
+ // PR c++/124472
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using foo = int;
+ namespace X {
+     using ::foo;
+     template<class> using bar = int;
+ }
+ 
+ X::bar<X::foo> y;
+ constexpr auto x = ^^X::bar<X::foo>;
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/torture/pr122380.C gcc-16-20260322/gcc/testsuite/g++.dg/torture/pr122380.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/torture/pr122380.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/torture/pr122380.C	Sun Mar 22 22:32:09 2026
***************
*** 0 ****
--- 1,40 ----
+ // { dg-do run }
+ 
+ #include <variant>
+ #include <vector>
+ 
+ using A = std::vector <double>;
+ using B = std::vector <int>;
+ 
+ struct C
+ {
+   bool c;
+   std::variant <A, B> d;
+ };
+ 
+ [[gnu::noipa, gnu::optimize ("assume-sane-operators-new-delete")]] bool
+ foo (C *m, A *e)
+ {
+   bool c = false;
+ 
+   if (m->c)
+     {
+       *e = std::move (std::get <A> (m->d));
+       c = true;
+     }
+   else
+     std::get <B> (m->d);
+ 
+   delete m;
+   return c;
+ }
+ 
+ int
+ main ()
+ {
+   A e { 1 };
+   C *m = new C;
+   m->c = true;
+   m->d = A { 1 };
+   foo (m, &e);
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.dg/warn/Wuninitialized-35.C gcc-16-20260322/gcc/testsuite/g++.dg/warn/Wuninitialized-35.C
*** gcc-16-20260315/gcc/testsuite/g++.dg/warn/Wuninitialized-35.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.dg/warn/Wuninitialized-35.C	Sun Mar 22 22:32:09 2026
***************
*** 0 ****
--- 1,21 ----
+ // PR c++/109521
+ // { dg-do compile { target c++11 } }
+ // { dg-options "-O2 -Wall" }
+ 
+ struct vector {
+   vector& operator=(vector&&)
+   {
+     return *this;
+   }
+ };
+ struct T {	// { dg-warning "is used uninitialized" }
+   vector v;
+   unsigned char pad[7];
+   T(){}
+ };
+ T t;
+ void
+ foo ()
+ {
+   t = T();
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.target/aarch64/virtual-lto.C gcc-16-20260322/gcc/testsuite/g++.target/aarch64/virtual-lto.C
*** gcc-16-20260315/gcc/testsuite/g++.target/aarch64/virtual-lto.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.target/aarch64/virtual-lto.C	Sun Mar 22 22:32:09 2026
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do compile } */
+ /* { dg-require-ifunc "" } */
+ /* { dg-additional-options "-flto" } */
+ class foo {
+ public:
+     virtual void bar () = 0;
+ };
+ 
+ class baz : public foo {
+ public:
+     void bar ();
+ };
+ 
+ __attribute__((target_clones("default", "flagm")))
+ void baz::bar () {
+ } /* { dg-message "sorry, unimplemented: virtual function multiversioning not supported" } */
diff -Nrcpad gcc-16-20260315/gcc/testsuite/g++.target/pr124597.C gcc-16-20260322/gcc/testsuite/g++.target/pr124597.C
*** gcc-16-20260315/gcc/testsuite/g++.target/pr124597.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/g++.target/pr124597.C	Sun Mar 22 22:32:09 2026
***************
*** 0 ****
--- 1,14 ----
+ // PR target/124597
+ // { dg-do compile { target lp64 } }
+ 
+ // Make sure va_end usage works with exception branch.
+ struct a {
+   a(int);
+   ~a();
+ };
+ int b;
+ __builtin_ms_va_list c;
+ void d() {
+   a e(b);
+   __builtin_ms_va_end(c);
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.dg/pr124476.c gcc-16-20260322/gcc/testsuite/gcc.dg/pr124476.c
*** gcc-16-20260315/gcc/testsuite/gcc.dg/pr124476.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/gcc.dg/pr124476.c	Sun Mar 22 22:32:10 2026
***************
*** 0 ****
--- 1,42 ----
+ /* PR rtl-optimization/124476 */
+ /* { dg-do run } */
+ /* { dg-require-effective-target lp64 } */
+ /* { dg-options "-O1 -favoid-store-forwarding" } */
+ 
+ /* Verify that overlapping stores are handled correctly.
+    The avoid-store-forwarding pass must respect "last writer wins"
+    semantics when stores have partially overlapping byte ranges.
+ 
+    The expected value is little-endian specific: the memmove writes
+    bytes 0-3 last (zeroing them), leaving bytes 4-7 as 0x05 from the
+    earlier memset, so f = 0x0505050500000000 on little-endian.  */
+ 
+ #if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
+ int main () { return 0; }
+ #else
+ 
+ int y;
+ 
+ __attribute__((noipa)) void
+ foo (int a, long *ret)
+ {
+   long f;
+   char c;
+   __builtin_memset (2 + (char *) &f, a, 6);
+   char n = *(char *) __builtin_memset (&c, a, 1);
+   __builtin_memmove (&f, &y, 4);
+   long r = f + a + n;
+   *ret = r;
+ }
+ 
+ int
+ main ()
+ {
+   long x;
+   foo (5, &x);
+   if (x != 0x050505050000000aL)
+     __builtin_abort ();
+   return 0;
+ }
+ 
+ #endif
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.dg/torture/pr124555.c gcc-16-20260322/gcc/testsuite/gcc.dg/torture/pr124555.c
*** gcc-16-20260315/gcc/testsuite/gcc.dg/torture/pr124555.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/gcc.dg/torture/pr124555.c	Sun Mar 22 22:32:10 2026
***************
*** 0 ****
--- 1,25 ----
+ /* { dg-additional-options "-fwrapv" } */
+ 
+ int vsad8_c_y;
+ char *vsad8_c_s1, *vsad8_c_s2;
+ long vsad8_c_stride;
+ int vsad8_c()
+ {
+   int score, x;
+   for (; vsad8_c_y; vsad8_c_y++)
+     {
+       x = 0;
+       for (; x < 8; x++)
+ 	score += (vsad8_c_s1[x] - vsad8_c_s2[x] - vsad8_c_s1[x + vsad8_c_stride]
+ 	    + vsad8_c_s2[x + vsad8_c_stride]) >= 0
+ 	    ? vsad8_c_s1[x] - vsad8_c_s2[x] -
+ 	    vsad8_c_s1[x + vsad8_c_stride] +
+ 	    vsad8_c_s2[x + vsad8_c_stride]
+ 	    : -(vsad8_c_s1[x] - vsad8_c_s2[x] -
+ 		vsad8_c_s1[x + vsad8_c_stride] +
+ 		vsad8_c_s2[x + vsad8_c_stride]);
+       vsad8_c_s1 += vsad8_c_stride;
+       vsad8_c_s2 += vsad8_c_stride;
+     }
+   return score;
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.dg/torture/pr65270-3.c gcc-16-20260322/gcc/testsuite/gcc.dg/torture/pr65270-3.c
*** gcc-16-20260315/gcc/testsuite/gcc.dg/torture/pr65270-3.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/gcc.dg/torture/pr65270-3.c	Sun Mar 22 22:32:10 2026
***************
*** 0 ****
--- 1,25 ----
+ /* { dg-do run } */
+ /* { dg-additional-options "-Wno-psabi" } */
+ 
+ typedef int v4si_unaligned __attribute__((vector_size(16),aligned(4)));
+ typedef int v4si __attribute__((vector_size(16)));
+ 
+ v4si __attribute__((noipa))
+ foo (bool aligned, bool write, int *p)
+ {
+   if (write)
+     *(v4si_unaligned *)p = (v4si){ 0, 0, 0, 0 };
+   v4si tem;
+   if (aligned)
+     tem = *(v4si *)p;
+   else
+     tem = *(v4si_unaligned *)p;
+   return tem;
+ }
+ 
+ int a[8] __attribute__((aligned(4*sizeof(int))));
+ int main()
+ {
+   foo (false, false, &a[1]);
+   return 0;
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.dg/tree-ssa/forwprop-42.c gcc-16-20260322/gcc/testsuite/gcc.dg/tree-ssa/forwprop-42.c
*** gcc-16-20260315/gcc/testsuite/gcc.dg/tree-ssa/forwprop-42.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.dg/tree-ssa/forwprop-42.c	Sun Mar 22 22:32:10 2026
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-O2 -fdump-tree-forwprop1" } */
  
  typedef unsigned int vec2 __attribute__ ((vector_size (2 * sizeof (unsigned int))));
  typedef unsigned int vec1 __attribute__ ((vector_size (sizeof (unsigned int))));
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-O2 -fdump-tree-forwprop1 -Wno-psabi" } */
  
  typedef unsigned int vec2 __attribute__ ((vector_size (2 * sizeof (unsigned int))));
  typedef unsigned int vec1 __attribute__ ((vector_size (sizeof (unsigned int))));
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.dg/tree-ssa/forwprop-43.c gcc-16-20260322/gcc/testsuite/gcc.dg/tree-ssa/forwprop-43.c
*** gcc-16-20260315/gcc/testsuite/gcc.dg/tree-ssa/forwprop-43.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.dg/tree-ssa/forwprop-43.c	Sun Mar 22 22:32:10 2026
***************
*** 1,8 ****
  /* { dg-do compile } */
! /* { dg-options "-O2 -fdump-tree-forwprop1" } */
  /* { dg-require-effective-target stdint_types } */
  /* { dg-require-effective-target vect_int } */
  /* { dg-additional-options "-fgimple" } */
  
  #include <stdint.h>
  
--- 1,9 ----
  /* { dg-do compile } */
! /* { dg-options "-O2 -fdump-tree-forwprop1 -Wno-psabi" } */
  /* { dg-require-effective-target stdint_types } */
  /* { dg-require-effective-target vect_int } */
  /* { dg-additional-options "-fgimple" } */
+ /* { dg-additional-options "-msse2" { target ia32 } } */
  
  #include <stdint.h>
  
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.dg/tree-ssa/scev-17.c gcc-16-20260322/gcc/testsuite/gcc.dg/tree-ssa/scev-17.c
*** gcc-16-20260315/gcc/testsuite/gcc.dg/tree-ssa/scev-17.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/gcc.dg/tree-ssa/scev-17.c	Sun Mar 22 22:32:10 2026
***************
*** 0 ****
--- 1,15 ----
+ /* PR124528 */
+ /* { dg-options "-Os -fdump-tree-sccp" } */
+ 
+ int baz (int n, int m)
+ {
+   int r = 100;
+   while (n != 0) {
+     n = n - 1;
+     r = r - m;
+   }
+   return r;
+ }
+ 
+ /* Make sure we negate m in unsigned.  */
+ /* { dg-final { scan-tree-dump "\\\(unsigned int\\\) m_.\\\(D\\\)" "sccp" } } */
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-30.c gcc-16-20260322/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-30.c
*** gcc-16-20260315/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-30.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-30.c	Sun Mar 22 22:32:10 2026
*************** bar (int b, int x)
*** 24,28 ****
  
  /* We should see the partial redundant loads of f even though they
     are using different types (of the same size).  */
  
! /* { dg-final { scan-tree-dump-times "Replaced MEM" 3 "pre" } } */
--- 24,30 ----
  
  /* We should see the partial redundant loads of f even though they
     are using different types (of the same size).  */
+ /* XFAILed for dubious validity and PR122380 fix.  The testcase did
+    not work with -fno-strict-aliasing.  */
  
! /* { dg-final { scan-tree-dump-times "Replaced MEM" 3 "pre" { xfail *-*-* } } } */
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-1.c gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-1.c
*** gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-1.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-1.c	Sun Mar 22 22:32:10 2026
***************
*** 6,19 ****
  /* { dg-skip-if "" { nvptx-*-* } } */
  /* { dg-skip-if PR119369 { amdgcn-*-* } } */
  
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?a" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?b" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?c" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?d" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?e" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?g" } } */
! /* { dg-final { scan-assembler-not "weak\[^ \t\]*\[ \t\]_?i" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?j" } } */
  
  #pragma weak a
  int a;
--- 6,19 ----
  /* { dg-skip-if "" { nvptx-*-* } } */
  /* { dg-skip-if PR119369 { amdgcn-*-* } } */
  
! /* { dg-final { scan-weak "a" } } */
! /* { dg-final { scan-weak "b" } } */
! /* { dg-final { scan-weak "c" } } */
! /* { dg-final { scan-weak "d" } } */
! /* { dg-final { scan-weak "e" } } */
! /* { dg-final { scan-weak "g" } } */
! /* { dg-final { scan-not-weak "i" } } */
! /* { dg-final { scan-weak "j" } } */
  
  #pragma weak a
  int a;
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-10.c gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-10.c
*** gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-10.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-10.c	Sun Mar 22 22:32:10 2026
***************
*** 7,13 ****
  /* { dg-require-alias "" } */
  /* { dg-options "-fno-common" } */
  
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?bar1" } } */
  
  #pragma weak bar1 = foo1
  void foo1 (void) {}
--- 7,13 ----
  /* { dg-require-alias "" } */
  /* { dg-options "-fno-common" } */
  
! /* { dg-final { scan-weak "bar1" } } */
  
  #pragma weak bar1 = foo1
  void foo1 (void) {}
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-11.c gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-11.c
*** gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-11.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-11.c	Sun Mar 22 22:32:10 2026
***************
*** 4,10 ****
  /* { dg-require-alias "" } */
  /* { dg-options "-funit-at-a-time" } */
  
! /* { dg-final { scan-assembler "xyzzy" } } */
  
  static const int local = 1; 
  #pragma weak xyzzy = local
--- 4,10 ----
  /* { dg-require-alias "" } */
  /* { dg-options "-funit-at-a-time" } */
  
! /* { dg-final { scan-weak "xyzzy" } } */
  
  static const int local = 1; 
  #pragma weak xyzzy = local
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-12.c gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-12.c
*** gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-12.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-12.c	Sun Mar 22 22:32:10 2026
***************
*** 6,12 ****
  /* { dg-skip-if "" { nvptx-*-* } } */
  /* { dg-skip-if PR119369 { amdgcn-*-* } } */
  
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?foo" } } */
  
  #pragma weak foo
  
--- 6,12 ----
  /* { dg-skip-if "" { nvptx-*-* } } */
  /* { dg-skip-if PR119369 { amdgcn-*-* } } */
  
! /* { dg-final { scan-weak "foo" } } */
  
  #pragma weak foo
  
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-15.c gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-15.c
*** gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-15.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-15.c	Sun Mar 22 22:32:10 2026
***************
*** 6,15 ****
  /* { dg-skip-if "" { nvptx-*-* } } */
  /* { dg-skip-if PR119369 { amdgcn-*-* } } */
  
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?a" } } */
! /* { dg-final { scan-assembler-not "weak\[^ \t\]*\[ \t\]_?b" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?c" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?d" } } */
  
  #pragma weak a
  extern char a[];
--- 6,15 ----
  /* { dg-skip-if "" { nvptx-*-* } } */
  /* { dg-skip-if PR119369 { amdgcn-*-* } } */
  
! /* { dg-final { scan-weak "a" } } */
! /* { dg-final { scan-not-weak "b" } } */
! /* { dg-final { scan-weak "c" } } */
! /* { dg-final { scan-weak "d" } } */
  
  #pragma weak a
  extern char a[];
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-16.c gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-16.c
*** gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-16.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-16.c	Sun Mar 22 22:32:10 2026
***************
*** 2,9 ****
  /* { dg-do compile } */
  /* { dg-require-weak "" } */
  /* { dg-options "-fno-common -Os" } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?kallsyms_token_index" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?kallsyms_token_table" } } */
  /* { dg-skip-if "" { x86_64-*-mingw* } } */
  /* NVPTX's weak is applied to the definition,  not declaration.  */
  /* { dg-skip-if "" { nvptx-*-* } } */
--- 2,9 ----
  /* { dg-do compile } */
  /* { dg-require-weak "" } */
  /* { dg-options "-fno-common -Os" } */
! /* { dg-final { scan-weak "kallsyms_token_index" } } */
! /* { dg-final { scan-weak "kallsyms_token_table" } } */
  /* { dg-skip-if "" { x86_64-*-mingw* } } */
  /* NVPTX's weak is applied to the definition,  not declaration.  */
  /* { dg-skip-if "" { nvptx-*-* } } */
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-2.c gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-2.c
*** gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-2.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-2.c	Sun Mar 22 22:32:10 2026
***************
*** 6,16 ****
  /* { dg-skip-if "" { nvptx-*-* } } */
  /* { dg-skip-if PR119369 { amdgcn-*-* } } */
  
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1a" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1b" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1c" } } */
! /* { dg-final { scan-assembler-not "weak\[^ \t\]*\[ \t\]_?ffoo1d" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1e" } } */
  
  /* test function addresses with #pragma weak */
  
--- 6,16 ----
  /* { dg-skip-if "" { nvptx-*-* } } */
  /* { dg-skip-if PR119369 { amdgcn-*-* } } */
  
! /* { dg-final { scan-weak "ffoo1a" } } */
! /* { dg-final { scan-weak "ffoo1b" } } */
! /* { dg-final { scan-weak "ffoo1c" } } */
! /* { dg-final { scan-not-weak "ffoo1d" } } */
! /* { dg-final { scan-weak "ffoo1e" } } */
  
  /* test function addresses with #pragma weak */
  
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-3.c gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-3.c
*** gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-3.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-3.c	Sun Mar 22 22:32:10 2026
***************
*** 5,17 ****
  /* { dg-skip-if "" { x86_64-*-mingw* } } */
  /* { dg-skip-if PR119369 { amdgcn-*-* } } */
  
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1a" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1b" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1c" } } */
! /* { dg-final { scan-assembler-not "weak\[^ \t\]*\[ \t\]_?ffoo1d" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1e" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1f" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1g" } } */
  
  /* test function addresses with __attribute__((weak)) */
  
--- 5,17 ----
  /* { dg-skip-if "" { x86_64-*-mingw* } } */
  /* { dg-skip-if PR119369 { amdgcn-*-* } } */
  
! /* { dg-final { scan-weak "ffoo1a" } } */
! /* { dg-final { scan-weak "ffoo1b" } } */
! /* { dg-final { scan-weak "ffoo1c" } } */
! /* { dg-final { scan-not-weak "ffoo1d" } } */
! /* { dg-final { scan-weak "ffoo1e" } } */
! /* { dg-final { scan-weak "ffoo1f" } } */
! /* { dg-final { scan-weak "ffoo1g" } } */
  
  /* test function addresses with __attribute__((weak)) */
  
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-4.c gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-4.c
*** gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-4.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-4.c	Sun Mar 22 22:32:10 2026
***************
*** 6,22 ****
  /* { dg-skip-if "" { nvptx-*-* } } */
  /* { dg-skip-if PR119369 { amdgcn-*-* } } */
  
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1a" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1b" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1c" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1d" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1e" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1f" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1g" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1h" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1i" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1j" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1k" } } */
  
  /* test variable addresses with #pragma weak */
  
--- 6,22 ----
  /* { dg-skip-if "" { nvptx-*-* } } */
  /* { dg-skip-if PR119369 { amdgcn-*-* } } */
  
! /* { dg-final { scan-weak "vfoo1a" } } */
! /* { dg-final { scan-weak "vfoo1b" } } */
! /* { dg-final { scan-weak "vfoo1c" } } */
! /* { dg-final { scan-weak "vfoo1d" } } */
! /* { dg-final { scan-weak "vfoo1e" } } */
! /* { dg-final { scan-weak "vfoo1f" } } */
! /* { dg-final { scan-weak "vfoo1g" } } */
! /* { dg-final { scan-weak "vfoo1h" } } */
! /* { dg-final { scan-weak "vfoo1i" } } */
! /* { dg-final { scan-weak "vfoo1j" } } */
! /* { dg-final { scan-weak "vfoo1k" } } */
  
  /* test variable addresses with #pragma weak */
  
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-5.c gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-5.c
*** gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-5.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-5.c	Sun Mar 22 22:32:10 2026
***************
*** 5,22 ****
  /* { dg-skip-if "" { x86_64-*-mingw* } } */
  /* { dg-skip-if PR119369 { amdgcn-*-* } } */
  
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1a" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1b" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1c" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1d" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1e" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1f" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1g" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1h" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1i" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1j" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1k" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1l" } } */
  
  /* test variable addresses with __attribute__ ((weak)) */
  
--- 5,22 ----
  /* { dg-skip-if "" { x86_64-*-mingw* } } */
  /* { dg-skip-if PR119369 { amdgcn-*-* } } */
  
! /* { dg-final { scan-weak "vfoo1a" } } */
! /* { dg-final { scan-weak "vfoo1b" } } */
! /* { dg-final { scan-weak "vfoo1c" } } */
! /* { dg-final { scan-weak "vfoo1d" } } */
! /* { dg-final { scan-weak "vfoo1e" } } */
! /* { dg-final { scan-weak "vfoo1f" } } */
! /* { dg-final { scan-weak "vfoo1g" } } */
! /* { dg-final { scan-weak "vfoo1h" } } */
! /* { dg-final { scan-weak "vfoo1i" } } */
! /* { dg-final { scan-weak "vfoo1j" } } */
! /* { dg-final { scan-weak "vfoo1k" } } */
! /* { dg-final { scan-weak "vfoo1l" } } */
  
  /* test variable addresses with __attribute__ ((weak)) */
  
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-9.c gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-9.c
*** gcc-16-20260315/gcc/testsuite/gcc.dg/weak/weak-9.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.dg/weak/weak-9.c	Sun Mar 22 22:32:10 2026
***************
*** 3,12 ****
  /* { dg-require-alias "" } */
  /* { dg-options "-fno-common" } */
  
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?f1" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?f2" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?f3" } } */
! /* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?f4" } } */
  
  void notf1() { }
  void notf2() { }
--- 3,12 ----
  /* { dg-require-alias "" } */
  /* { dg-options "-fno-common" } */
  
! /* { dg-final { scan-weak "f1" } } */
! /* { dg-final { scan-weak "f2" } } */
! /* { dg-final { scan-weak "f3" } } */
! /* { dg-final { scan-weak "f4" } } */
  
  void notf1() { }
  void notf2() { }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_bf16.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_bf16.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_bf16.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_bf16.c	Sun Mar 22 22:32:10 2026
*************** TEST_UNIFORM_Z (revd_bf16_m_tied1, svbfl
*** 22,30 ****
  
  /*
  ** revd_bf16_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_bf16_m_tied2, svbfloat16_t,
--- 22,29 ----
  
  /*
  ** revd_bf16_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_bf16_m_tied2, svbfloat16_t,
*************** TEST_UNIFORM_Z (revd_bf16_m_tied2, svbfl
*** 33,40 ****
  
  /*
  ** revd_bf16_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_bf16_m_untied, svbfloat16_t,
--- 32,39 ----
  
  /*
  ** revd_bf16_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_bf16_m_untied, svbfloat16_t,
*************** TEST_UNIFORM_Z (revd_bf16_x_tied1, svbfl
*** 67,74 ****
  
  /*
  ** revd_bf16_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_bf16_x_untied, svbfloat16_t,
--- 66,73 ----
  
  /*
  ** revd_bf16_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_bf16_x_untied, svbfloat16_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_f16.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_f16.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_f16.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_f16.c	Sun Mar 22 22:32:10 2026
*************** TEST_UNIFORM_Z (revd_f16_m_tied1, svfloa
*** 22,30 ****
  
  /*
  ** revd_f16_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_f16_m_tied2, svfloat16_t,
--- 22,29 ----
  
  /*
  ** revd_f16_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_f16_m_tied2, svfloat16_t,
*************** TEST_UNIFORM_Z (revd_f16_m_tied2, svfloa
*** 33,40 ****
  
  /*
  ** revd_f16_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_f16_m_untied, svfloat16_t,
--- 32,39 ----
  
  /*
  ** revd_f16_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_f16_m_untied, svfloat16_t,
*************** TEST_UNIFORM_Z (revd_f16_x_tied1, svfloa
*** 67,74 ****
  
  /*
  ** revd_f16_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_f16_x_untied, svfloat16_t,
--- 66,73 ----
  
  /*
  ** revd_f16_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_f16_x_untied, svfloat16_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_f32.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_f32.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_f32.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_f32.c	Sun Mar 22 22:32:10 2026
*************** TEST_UNIFORM_Z (revd_f32_m_tied1, svfloa
*** 22,30 ****
  
  /*
  ** revd_f32_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_f32_m_tied2, svfloat32_t,
--- 22,29 ----
  
  /*
  ** revd_f32_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_f32_m_tied2, svfloat32_t,
*************** TEST_UNIFORM_Z (revd_f32_m_tied2, svfloa
*** 33,40 ****
  
  /*
  ** revd_f32_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_f32_m_untied, svfloat32_t,
--- 32,39 ----
  
  /*
  ** revd_f32_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_f32_m_untied, svfloat32_t,
*************** TEST_UNIFORM_Z (revd_f32_x_tied1, svfloa
*** 67,74 ****
  
  /*
  ** revd_f32_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_f32_x_untied, svfloat32_t,
--- 66,73 ----
  
  /*
  ** revd_f32_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_f32_x_untied, svfloat32_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_f64.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_f64.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_f64.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_f64.c	Sun Mar 22 22:32:10 2026
*************** TEST_UNIFORM_Z (revd_f64_m_tied1, svfloa
*** 22,30 ****
  
  /*
  ** revd_f64_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_f64_m_tied2, svfloat64_t,
--- 22,29 ----
  
  /*
  ** revd_f64_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_f64_m_tied2, svfloat64_t,
*************** TEST_UNIFORM_Z (revd_f64_m_tied2, svfloa
*** 33,40 ****
  
  /*
  ** revd_f64_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_f64_m_untied, svfloat64_t,
--- 32,39 ----
  
  /*
  ** revd_f64_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_f64_m_untied, svfloat64_t,
*************** TEST_UNIFORM_Z (revd_f64_x_tied1, svfloa
*** 67,74 ****
  
  /*
  ** revd_f64_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_f64_x_untied, svfloat64_t,
--- 66,73 ----
  
  /*
  ** revd_f64_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_f64_x_untied, svfloat64_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_mf8.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_mf8.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_mf8.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_mf8.c	Sun Mar 22 22:32:10 2026
*************** TEST_UNIFORM_Z (revd_mf8_m_tied1, svmflo
*** 22,30 ****
  
  /*
  ** revd_mf8_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_mf8_m_tied2, svmfloat8_t,
--- 22,29 ----
  
  /*
  ** revd_mf8_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_mf8_m_tied2, svmfloat8_t,
*************** TEST_UNIFORM_Z (revd_mf8_m_tied2, svmflo
*** 33,40 ****
  
  /*
  ** revd_mf8_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_mf8_m_untied, svmfloat8_t,
--- 32,39 ----
  
  /*
  ** revd_mf8_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_mf8_m_untied, svmfloat8_t,
*************** TEST_UNIFORM_Z (revd_mf8_x_tied1, svmflo
*** 67,74 ****
  
  /*
  ** revd_mf8_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_mf8_x_untied, svmfloat8_t,
--- 66,73 ----
  
  /*
  ** revd_mf8_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_mf8_x_untied, svmfloat8_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s16.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s16.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s16.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s16.c	Sun Mar 22 22:32:10 2026
*************** TEST_UNIFORM_Z (revd_s16_m_tied1, svint1
*** 22,30 ****
  
  /*
  ** revd_s16_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s16_m_tied2, svint16_t,
--- 22,29 ----
  
  /*
  ** revd_s16_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s16_m_tied2, svint16_t,
*************** TEST_UNIFORM_Z (revd_s16_m_tied2, svint1
*** 33,40 ****
  
  /*
  ** revd_s16_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s16_m_untied, svint16_t,
--- 32,39 ----
  
  /*
  ** revd_s16_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s16_m_untied, svint16_t,
*************** TEST_UNIFORM_Z (revd_s16_x_tied1, svint1
*** 67,74 ****
  
  /*
  ** revd_s16_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s16_x_untied, svint16_t,
--- 66,73 ----
  
  /*
  ** revd_s16_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s16_x_untied, svint16_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s32.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s32.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s32.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s32.c	Sun Mar 22 22:32:10 2026
*************** TEST_UNIFORM_Z (revd_s32_m_tied1, svint3
*** 22,30 ****
  
  /*
  ** revd_s32_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s32_m_tied2, svint32_t,
--- 22,29 ----
  
  /*
  ** revd_s32_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s32_m_tied2, svint32_t,
*************** TEST_UNIFORM_Z (revd_s32_m_tied2, svint3
*** 33,40 ****
  
  /*
  ** revd_s32_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s32_m_untied, svint32_t,
--- 32,39 ----
  
  /*
  ** revd_s32_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s32_m_untied, svint32_t,
*************** TEST_UNIFORM_Z (revd_s32_x_tied1, svint3
*** 67,74 ****
  
  /*
  ** revd_s32_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s32_x_untied, svint32_t,
--- 66,73 ----
  
  /*
  ** revd_s32_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s32_x_untied, svint32_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s64.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s64.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s64.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s64.c	Sun Mar 22 22:32:10 2026
*************** TEST_UNIFORM_Z (revd_s64_m_tied1, svint6
*** 22,30 ****
  
  /*
  ** revd_s64_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s64_m_tied2, svint64_t,
--- 22,29 ----
  
  /*
  ** revd_s64_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s64_m_tied2, svint64_t,
*************** TEST_UNIFORM_Z (revd_s64_m_tied2, svint6
*** 33,40 ****
  
  /*
  ** revd_s64_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s64_m_untied, svint64_t,
--- 32,39 ----
  
  /*
  ** revd_s64_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s64_m_untied, svint64_t,
*************** TEST_UNIFORM_Z (revd_s64_x_tied1, svint6
*** 67,74 ****
  
  /*
  ** revd_s64_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s64_x_untied, svint64_t,
--- 66,73 ----
  
  /*
  ** revd_s64_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s64_x_untied, svint64_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s8.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s8.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s8.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_s8.c	Sun Mar 22 22:32:10 2026
*************** TEST_UNIFORM_Z (revd_s8_m_tied1, svint8_
*** 22,30 ****
  
  /*
  ** revd_s8_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s8_m_tied2, svint8_t,
--- 22,29 ----
  
  /*
  ** revd_s8_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s8_m_tied2, svint8_t,
*************** TEST_UNIFORM_Z (revd_s8_m_tied2, svint8_
*** 33,40 ****
  
  /*
  ** revd_s8_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s8_m_untied, svint8_t,
--- 32,39 ----
  
  /*
  ** revd_s8_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s8_m_untied, svint8_t,
*************** TEST_UNIFORM_Z (revd_s8_x_tied1, svint8_
*** 67,74 ****
  
  /*
  ** revd_s8_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s8_x_untied, svint8_t,
--- 66,73 ----
  
  /*
  ** revd_s8_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s8_x_untied, svint8_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u16.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u16.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u16.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u16.c	Sun Mar 22 22:32:10 2026
*************** TEST_UNIFORM_Z (revd_u16_m_tied1, svuint
*** 22,30 ****
  
  /*
  ** revd_u16_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u16_m_tied2, svuint16_t,
--- 22,29 ----
  
  /*
  ** revd_u16_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u16_m_tied2, svuint16_t,
*************** TEST_UNIFORM_Z (revd_u16_m_tied2, svuint
*** 33,40 ****
  
  /*
  ** revd_u16_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u16_m_untied, svuint16_t,
--- 32,39 ----
  
  /*
  ** revd_u16_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u16_m_untied, svuint16_t,
*************** TEST_UNIFORM_Z (revd_u16_x_tied1, svuint
*** 67,74 ****
  
  /*
  ** revd_u16_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u16_x_untied, svuint16_t,
--- 66,73 ----
  
  /*
  ** revd_u16_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u16_x_untied, svuint16_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u32.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u32.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u32.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u32.c	Sun Mar 22 22:32:10 2026
*************** TEST_UNIFORM_Z (revd_u32_m_tied1, svuint
*** 22,30 ****
  
  /*
  ** revd_u32_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u32_m_tied2, svuint32_t,
--- 22,29 ----
  
  /*
  ** revd_u32_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u32_m_tied2, svuint32_t,
*************** TEST_UNIFORM_Z (revd_u32_m_tied2, svuint
*** 33,40 ****
  
  /*
  ** revd_u32_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u32_m_untied, svuint32_t,
--- 32,39 ----
  
  /*
  ** revd_u32_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u32_m_untied, svuint32_t,
*************** TEST_UNIFORM_Z (revd_u32_x_tied1, svuint
*** 67,74 ****
  
  /*
  ** revd_u32_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u32_x_untied, svuint32_t,
--- 66,73 ----
  
  /*
  ** revd_u32_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u32_x_untied, svuint32_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u64.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u64.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u64.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u64.c	Sun Mar 22 22:32:10 2026
*************** TEST_UNIFORM_Z (revd_u64_m_tied1, svuint
*** 22,30 ****
  
  /*
  ** revd_u64_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u64_m_tied2, svuint64_t,
--- 22,29 ----
  
  /*
  ** revd_u64_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u64_m_tied2, svuint64_t,
*************** TEST_UNIFORM_Z (revd_u64_m_tied2, svuint
*** 33,40 ****
  
  /*
  ** revd_u64_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u64_m_untied, svuint64_t,
--- 32,39 ----
  
  /*
  ** revd_u64_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u64_m_untied, svuint64_t,
*************** TEST_UNIFORM_Z (revd_u64_x_tied1, svuint
*** 67,74 ****
  
  /*
  ** revd_u64_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u64_x_untied, svuint64_t,
--- 66,73 ----
  
  /*
  ** revd_u64_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u64_x_untied, svuint64_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u8.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u8.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u8.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/revd_u8.c	Sun Mar 22 22:32:10 2026
*************** TEST_UNIFORM_Z (revd_u8_m_tied1, svuint8
*** 22,30 ****
  
  /*
  ** revd_u8_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u8_m_tied2, svuint8_t,
--- 22,29 ----
  
  /*
  ** revd_u8_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u8_m_tied2, svuint8_t,
*************** TEST_UNIFORM_Z (revd_u8_m_tied2, svuint8
*** 33,40 ****
  
  /*
  ** revd_u8_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u8_m_untied, svuint8_t,
--- 32,39 ----
  
  /*
  ** revd_u8_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u8_m_untied, svuint8_t,
*************** TEST_UNIFORM_Z (revd_u8_x_tied1, svuint8
*** 67,74 ****
  
  /*
  ** revd_u8_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u8_x_untied, svuint8_t,
--- 66,73 ----
  
  /*
  ** revd_u8_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u8_x_untied, svuint8_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_bf16.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_bf16.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_bf16.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_bf16.c	Sun Mar 22 22:32:11 2026
*************** TEST_UNIFORM_Z (revd_bf16_m_tied1, svbfl
*** 26,34 ****
  
  /*
  ** revd_bf16_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_bf16_m_tied2, svbfloat16_t,
--- 26,33 ----
  
  /*
  ** revd_bf16_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_bf16_m_tied2, svbfloat16_t,
*************** TEST_UNIFORM_Z (revd_bf16_m_tied2, svbfl
*** 37,44 ****
  
  /*
  ** revd_bf16_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_bf16_m_untied, svbfloat16_t,
--- 36,43 ----
  
  /*
  ** revd_bf16_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_bf16_m_untied, svbfloat16_t,
*************** TEST_UNIFORM_Z (revd_bf16_x_tied1, svbfl
*** 71,78 ****
  
  /*
  ** revd_bf16_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_bf16_x_untied, svbfloat16_t,
--- 70,77 ----
  
  /*
  ** revd_bf16_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_bf16_x_untied, svbfloat16_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_f16.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_f16.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_f16.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_f16.c	Sun Mar 22 22:32:11 2026
*************** TEST_UNIFORM_Z (revd_f16_m_tied1, svfloa
*** 26,34 ****
  
  /*
  ** revd_f16_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_f16_m_tied2, svfloat16_t,
--- 26,33 ----
  
  /*
  ** revd_f16_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_f16_m_tied2, svfloat16_t,
*************** TEST_UNIFORM_Z (revd_f16_m_tied2, svfloa
*** 37,44 ****
  
  /*
  ** revd_f16_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_f16_m_untied, svfloat16_t,
--- 36,43 ----
  
  /*
  ** revd_f16_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_f16_m_untied, svfloat16_t,
*************** TEST_UNIFORM_Z (revd_f16_x_tied1, svfloa
*** 71,78 ****
  
  /*
  ** revd_f16_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_f16_x_untied, svfloat16_t,
--- 70,77 ----
  
  /*
  ** revd_f16_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_f16_x_untied, svfloat16_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_f32.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_f32.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_f32.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_f32.c	Sun Mar 22 22:32:11 2026
*************** TEST_UNIFORM_Z (revd_f32_m_tied1, svfloa
*** 26,34 ****
  
  /*
  ** revd_f32_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_f32_m_tied2, svfloat32_t,
--- 26,33 ----
  
  /*
  ** revd_f32_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_f32_m_tied2, svfloat32_t,
*************** TEST_UNIFORM_Z (revd_f32_m_tied2, svfloa
*** 37,44 ****
  
  /*
  ** revd_f32_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_f32_m_untied, svfloat32_t,
--- 36,43 ----
  
  /*
  ** revd_f32_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_f32_m_untied, svfloat32_t,
*************** TEST_UNIFORM_Z (revd_f32_x_tied1, svfloa
*** 71,78 ****
  
  /*
  ** revd_f32_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_f32_x_untied, svfloat32_t,
--- 70,77 ----
  
  /*
  ** revd_f32_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_f32_x_untied, svfloat32_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_f64.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_f64.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_f64.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_f64.c	Sun Mar 22 22:32:11 2026
*************** TEST_UNIFORM_Z (revd_f64_m_tied1, svfloa
*** 26,34 ****
  
  /*
  ** revd_f64_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_f64_m_tied2, svfloat64_t,
--- 26,33 ----
  
  /*
  ** revd_f64_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_f64_m_tied2, svfloat64_t,
*************** TEST_UNIFORM_Z (revd_f64_m_tied2, svfloa
*** 37,44 ****
  
  /*
  ** revd_f64_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_f64_m_untied, svfloat64_t,
--- 36,43 ----
  
  /*
  ** revd_f64_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_f64_m_untied, svfloat64_t,
*************** TEST_UNIFORM_Z (revd_f64_x_tied1, svfloa
*** 71,78 ****
  
  /*
  ** revd_f64_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_f64_x_untied, svfloat64_t,
--- 70,77 ----
  
  /*
  ** revd_f64_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_f64_x_untied, svfloat64_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_mf8.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_mf8.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_mf8.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_mf8.c	Sun Mar 22 22:32:11 2026
*************** TEST_UNIFORM_Z (revd_mf8_m_tied1, svmflo
*** 26,34 ****
  
  /*
  ** revd_mf8_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_mf8_m_tied2, svmfloat8_t,
--- 26,33 ----
  
  /*
  ** revd_mf8_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_mf8_m_tied2, svmfloat8_t,
*************** TEST_UNIFORM_Z (revd_mf8_m_tied2, svmflo
*** 37,44 ****
  
  /*
  ** revd_mf8_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_mf8_m_untied, svmfloat8_t,
--- 36,43 ----
  
  /*
  ** revd_mf8_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_mf8_m_untied, svmfloat8_t,
*************** TEST_UNIFORM_Z (revd_mf8_x_tied1, svmflo
*** 71,78 ****
  
  /*
  ** revd_mf8_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_mf8_x_untied, svmfloat8_t,
--- 70,77 ----
  
  /*
  ** revd_mf8_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_mf8_x_untied, svmfloat8_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s16.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s16.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s16.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s16.c	Sun Mar 22 22:32:11 2026
*************** TEST_UNIFORM_Z (revd_s16_m_tied1, svint1
*** 26,34 ****
  
  /*
  ** revd_s16_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s16_m_tied2, svint16_t,
--- 26,33 ----
  
  /*
  ** revd_s16_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s16_m_tied2, svint16_t,
*************** TEST_UNIFORM_Z (revd_s16_m_tied2, svint1
*** 37,44 ****
  
  /*
  ** revd_s16_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s16_m_untied, svint16_t,
--- 36,43 ----
  
  /*
  ** revd_s16_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s16_m_untied, svint16_t,
*************** TEST_UNIFORM_Z (revd_s16_x_tied1, svint1
*** 71,78 ****
  
  /*
  ** revd_s16_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s16_x_untied, svint16_t,
--- 70,77 ----
  
  /*
  ** revd_s16_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s16_x_untied, svint16_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s32.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s32.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s32.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s32.c	Sun Mar 22 22:32:11 2026
*************** TEST_UNIFORM_Z (revd_s32_m_tied1, svint3
*** 26,34 ****
  
  /*
  ** revd_s32_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s32_m_tied2, svint32_t,
--- 26,33 ----
  
  /*
  ** revd_s32_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s32_m_tied2, svint32_t,
*************** TEST_UNIFORM_Z (revd_s32_m_tied2, svint3
*** 37,44 ****
  
  /*
  ** revd_s32_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s32_m_untied, svint32_t,
--- 36,43 ----
  
  /*
  ** revd_s32_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s32_m_untied, svint32_t,
*************** TEST_UNIFORM_Z (revd_s32_x_tied1, svint3
*** 71,78 ****
  
  /*
  ** revd_s32_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s32_x_untied, svint32_t,
--- 70,77 ----
  
  /*
  ** revd_s32_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s32_x_untied, svint32_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s64.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s64.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s64.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s64.c	Sun Mar 22 22:32:11 2026
*************** TEST_UNIFORM_Z (revd_s64_m_tied1, svint6
*** 26,34 ****
  
  /*
  ** revd_s64_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s64_m_tied2, svint64_t,
--- 26,33 ----
  
  /*
  ** revd_s64_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s64_m_tied2, svint64_t,
*************** TEST_UNIFORM_Z (revd_s64_m_tied2, svint6
*** 37,44 ****
  
  /*
  ** revd_s64_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s64_m_untied, svint64_t,
--- 36,43 ----
  
  /*
  ** revd_s64_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s64_m_untied, svint64_t,
*************** TEST_UNIFORM_Z (revd_s64_x_tied1, svint6
*** 71,78 ****
  
  /*
  ** revd_s64_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s64_x_untied, svint64_t,
--- 70,77 ----
  
  /*
  ** revd_s64_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s64_x_untied, svint64_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s8.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s8.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s8.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_s8.c	Sun Mar 22 22:32:11 2026
*************** TEST_UNIFORM_Z (revd_s8_m_tied1, svint8_
*** 26,34 ****
  
  /*
  ** revd_s8_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s8_m_tied2, svint8_t,
--- 26,33 ----
  
  /*
  ** revd_s8_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s8_m_tied2, svint8_t,
*************** TEST_UNIFORM_Z (revd_s8_m_tied2, svint8_
*** 37,44 ****
  
  /*
  ** revd_s8_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s8_m_untied, svint8_t,
--- 36,43 ----
  
  /*
  ** revd_s8_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s8_m_untied, svint8_t,
*************** TEST_UNIFORM_Z (revd_s8_x_tied1, svint8_
*** 71,78 ****
  
  /*
  ** revd_s8_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_s8_x_untied, svint8_t,
--- 70,77 ----
  
  /*
  ** revd_s8_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_s8_x_untied, svint8_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u16.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u16.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u16.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u16.c	Sun Mar 22 22:32:11 2026
*************** TEST_UNIFORM_Z (revd_u16_m_tied1, svuint
*** 26,34 ****
  
  /*
  ** revd_u16_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u16_m_tied2, svuint16_t,
--- 26,33 ----
  
  /*
  ** revd_u16_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u16_m_tied2, svuint16_t,
*************** TEST_UNIFORM_Z (revd_u16_m_tied2, svuint
*** 37,44 ****
  
  /*
  ** revd_u16_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u16_m_untied, svuint16_t,
--- 36,43 ----
  
  /*
  ** revd_u16_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u16_m_untied, svuint16_t,
*************** TEST_UNIFORM_Z (revd_u16_x_tied1, svuint
*** 71,78 ****
  
  /*
  ** revd_u16_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u16_x_untied, svuint16_t,
--- 70,77 ----
  
  /*
  ** revd_u16_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u16_x_untied, svuint16_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u32.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u32.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u32.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u32.c	Sun Mar 22 22:32:11 2026
*************** TEST_UNIFORM_Z (revd_u32_m_tied1, svuint
*** 26,34 ****
  
  /*
  ** revd_u32_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u32_m_tied2, svuint32_t,
--- 26,33 ----
  
  /*
  ** revd_u32_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u32_m_tied2, svuint32_t,
*************** TEST_UNIFORM_Z (revd_u32_m_tied2, svuint
*** 37,44 ****
  
  /*
  ** revd_u32_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u32_m_untied, svuint32_t,
--- 36,43 ----
  
  /*
  ** revd_u32_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u32_m_untied, svuint32_t,
*************** TEST_UNIFORM_Z (revd_u32_x_tied1, svuint
*** 71,78 ****
  
  /*
  ** revd_u32_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u32_x_untied, svuint32_t,
--- 70,77 ----
  
  /*
  ** revd_u32_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u32_x_untied, svuint32_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u64.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u64.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u64.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u64.c	Sun Mar 22 22:32:11 2026
*************** TEST_UNIFORM_Z (revd_u64_m_tied1, svuint
*** 26,34 ****
  
  /*
  ** revd_u64_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u64_m_tied2, svuint64_t,
--- 26,33 ----
  
  /*
  ** revd_u64_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u64_m_tied2, svuint64_t,
*************** TEST_UNIFORM_Z (revd_u64_m_tied2, svuint
*** 37,44 ****
  
  /*
  ** revd_u64_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u64_m_untied, svuint64_t,
--- 36,43 ----
  
  /*
  ** revd_u64_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u64_m_untied, svuint64_t,
*************** TEST_UNIFORM_Z (revd_u64_x_tied1, svuint
*** 71,78 ****
  
  /*
  ** revd_u64_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u64_x_untied, svuint64_t,
--- 70,77 ----
  
  /*
  ** revd_u64_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u64_x_untied, svuint64_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u8.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u8.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u8.c	Sun Mar 15 22:32:12 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/revd_u8.c	Sun Mar 22 22:32:11 2026
*************** TEST_UNIFORM_Z (revd_u8_m_tied1, svuint8
*** 26,34 ****
  
  /*
  ** revd_u8_m_tied2:
! **	mov	(z[0-9]+)\.d, z0\.d
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, \1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u8_m_tied2, svuint8_t,
--- 26,33 ----
  
  /*
  ** revd_u8_m_tied2:
! **	revd	z1\.q, p0/m, z0\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u8_m_tied2, svuint8_t,
*************** TEST_UNIFORM_Z (revd_u8_m_tied2, svuint8
*** 37,44 ****
  
  /*
  ** revd_u8_m_untied:
! **	movprfx	z0, z2
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u8_m_untied, svuint8_t,
--- 36,43 ----
  
  /*
  ** revd_u8_m_untied:
! **	revd	z2\.q, p0/m, z1\.q
! **	mov	z0.d, z2.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u8_m_untied, svuint8_t,
*************** TEST_UNIFORM_Z (revd_u8_x_tied1, svuint8
*** 71,78 ****
  
  /*
  ** revd_u8_x_untied:
! **	movprfx	z0, z1
! **	revd	z0\.q, p0/m, z1\.q
  **	ret
  */
  TEST_UNIFORM_Z (revd_u8_x_untied, svuint8_t,
--- 70,77 ----
  
  /*
  ** revd_u8_x_untied:
! **	revd	z1\.q, p0/m, z1\.q
! **	mov	z0.d, z1.d
  **	ret
  */
  TEST_UNIFORM_Z (revd_u8_x_untied, svuint8_t,
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/torture/pr124491.c gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/torture/pr124491.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/aarch64/torture/pr124491.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/gcc.target/aarch64/torture/pr124491.c	Sun Mar 22 22:32:11 2026
***************
*** 0 ****
--- 1,6 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=armv8.2-a+sve -msve-vector-bits=256" } */
+ #include <arm_sve.h>
+ svint64_t foo(long x, long y) {
+   return svdupq_n_s64(x, y);
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/i386/part-vect-absnegbf.c gcc-16-20260322/gcc/testsuite/gcc.target/i386/part-vect-absnegbf.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/i386/part-vect-absnegbf.c	Sun Mar 15 22:32:13 2026
--- gcc-16-20260322/gcc/testsuite/gcc.target/i386/part-vect-absnegbf.c	Sun Mar 22 22:32:11 2026
***************
*** 1,5 ****
  /* { dg-do run } */
! /* { dg-options "-O1 -fdump-tree-vect-details -fdump-tree-slp-details -fdump-tree-optimized" } */
  
  extern void abort (void);
  static void do_test (void);
--- 1,5 ----
  /* { dg-do run } */
! /* { dg-options "-O1 -fdump-tree-vect-details -fdump-tree-slp-details -fdump-tree-optimized -msse2" } */
  
  extern void abort (void);
  static void do_test (void);
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gcc.target/i386/tct-ipa-inline-ice.c gcc-16-20260322/gcc/testsuite/gcc.target/i386/tct-ipa-inline-ice.c
*** gcc-16-20260315/gcc/testsuite/gcc.target/i386/tct-ipa-inline-ice.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/gcc.target/i386/tct-ipa-inline-ice.c	Sun Mar 22 22:32:11 2026
***************
*** 0 ****
--- 1,48 ----
+ /* Test function multiversioning and inlining of a function with a
+    target_clones attribute.  Note, we need to allow inlining of
+    target_clones functions, see
+    "Do not inline functions with multiple clone targets." in c-attribs.cc,
+    otherwise the test would not trigger the ICE.  */
+ /* { dg-do assemble } */
+ /* { dg-require-ifunc "" } */
+ /* { dg-options "-O3" } */
+ 
+ struct range_state
+ {
+   unsigned int n;
+   unsigned int s[58];
+   unsigned int *q[58];
+ };
+ 
+ struct coder_state
+ {
+   struct range_state r;
+   unsigned int t;
+   unsigned int x[12];
+ };
+ 
+ inline void
+ bar(struct range_state *r, unsigned int *ptr, unsigned int value)
+ {
+   r->s[r->n] = value;
+   r->q[r->n] = ptr;
+   ++r->n;
+ }
+ 
+ __attribute__((target_clones("default", "arch=x86-64-v2")))
+ inline void
+ foo(struct coder_state *c, unsigned int back)
+ {
+   if (back == ~0u) {
+     bar(&c->r, &c->x[c->t], 0);
+   }
+ }
+ 
+ __attribute__((target_clones("default", "arch=x86-64-v2")))
+ int
+ ice_trigger(struct coder_state *c, unsigned int back)
+ {
+   while (1) {
+     foo(c, back);
+   }
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gdc.test/runnable/dbitfieldsdm.d gcc-16-20260322/gcc/testsuite/gdc.test/runnable/dbitfieldsdm.d
*** gcc-16-20260315/gcc/testsuite/gdc.test/runnable/dbitfieldsdm.d	Sun Mar 15 22:32:14 2026
--- gcc-16-20260322/gcc/testsuite/gdc.test/runnable/dbitfieldsdm.d	Thu Jan  1 00:00:00 1970
***************
*** 1,196 ****
- /* test bitfields for Digital Mars
-  * Note that this test is for win32 only
-  *
-  *
-  * DISABLED: win32mscoff win64 linux freebsd osx
-  * RUN_OUTPUT:
- ---
-                 DM |   MS |  P32 |  P64
- T0  =  1 1 ||  1 1 |  1 1 |  1 1 |  1 1
- T1  =  2 2 ||  2 2 |  2 2 |  2 2 |  2 2
- T2  =  4 4 ||  4 4 |  4 4 |  4 4 |  4 4
- T3  = 16 8 || 16 8 | 16 8 |  8 4 |  8 8
- T4  = 16 8 || 16 8 | 16 8 | 12 4 | 16 8
- T5  = 16 8 || 16 8 | 16 8 |  8 4 |  8 8
- S1  =  8 8 ||  8 8 |  8 8 |  4 4 |  8 8
- S2  =  4 4 ||  4 4 |  4 4 |  4 4 |  4 4
- S3  =  8 4 ||  8 4 |  8 4 |  4 4 |  4 4
- S4  =  8 4 ||  8 4 |  8 4 |  4 4 |  4 4
- S5  =  8 4 ||  8 4 |  8 4 |  4 4 |  4 4
- S6  =  2 2 ||  2 2 |  2 2 |  2 2 |  2 2
- S7  = 16 8 || 16 8 | 16 8 |  4 4 |  8 8
- S8  =  4 2 ||  4 2 |  4 2 |  2 2 |  2 2
- S8A =  4 2 ||  4 2 |  4 2 |  2 2 |  2 2
- S8B =  6 2 ||  6 2 |  6 2 |  2 2 |  2 2
- S8C =  8 4 ||  8 4 |  8 4 |  4 4 |  4 4
- S9  =  4 2 ||  4 2 |  4 2 |  4 2 |  4 2
- S10 =  1 1 ||  0 0 |  * * |  0 1 |  0 1
- S11 =  1 1 ||  0 0 |  4 1 |  0 1 |  0 1
- S12 =  4 4 ||  4 4 |  4 4 |  4 4 |  4 4
- S13 =  8 4 ||  8 4 |  8 4 |  8 4 |  8 4
- S14 =  8 4 ||  8 4 |  8 4 |  8 4 |  8 4
- S15 =  8 4 ||  8 4 |  8 4 |  4 4 |  4 4
- S16 =  4 4 ||  0 0 |  4 4 |  4 1 |  4 1
- S17 =  4 4 ||  4 4 |  4 4 |  4 4 |  4 4
- S18 =  2 1 ||  2 1 |  2 1 |  5 1 |  9 1
- A0  = 16 8 || 16 8 | 16 8 | 12 4 | 16 8
- A1  = 12 4 || 12 4 | 12 4 | 12 4 | 12 4
- A2  = 12 4 || 12 4 | 12 4 | 12 4 | 12 4
- A3  = 16 4 || 16 4 | 16 4 | 16 4 | 16 4
- A4  = 12 4 || 12 4 | 12 4 |  8 4 |  8 4
- A5  =  2 1 ||  2 1 |  2 1 |  2 1 |  2 1
- A6  =  4 2 ||  4 2 |  4 2 |  2 2 |  2 2
- A7  = 16 4 || 16 4 | 16 4 | 12 4 | 16 8
- A8  = 12 4 || 12 4 | 12 4 |  8 4 |  8 8
- A9  = 32 8 || 32 8 | 32 8 | 16 4 | 16 8
- A10 =  4 2 ||  4 2 |  4 2 |  2 2 |  2 2
- A11 = 16 4 || 16 4 | 16 4 | 12 4 | 12 4
- S9 = x30200
- S14 = x300000201
- S15 = x201
- S18 = 1 should be 4
- A0 = x1
- ---
-  */
- 
- import core.stdc.stdio;
- 
- int is64bit() { return size_t.sizeof == 8; }  // otherwise assume 32 bit
- 
- /*************************************************************/
- 
- struct T0  { ubyte x:1; };                       //
- struct T1  { short x:1; };                       //
- struct T2  { int x:1; };                         //
- struct T3  { ubyte a,b,c,d; long x:1; };         //
- struct T4  { ubyte a,b,c,d,e,f,g,h; long x:1; }; //
- struct T5  { ubyte a,b,c,d,e,f,g; long x:1; };   //
- struct S1  { long f:1; };                        //
- struct S2  { int x:1; int y:1; };                //
- struct S3  { short c; int x:1; uint y:1; };      //
- struct S4  { int x:1; short y:1; };              //
- struct S5  { short x:1; int y:1; };              //
- struct S6  { short x:1; short y:1; };            //
- struct S7  { short x:1; int y:1; long z:1; };    //
- struct S8  { ubyte a; ubyte b:1; short c:2; };   //
- struct S8A { ubyte b:1; short c:2; };            //
- struct S8B { ubyte a; short b:1; ubyte c:2; };   //
- struct S8C { ubyte a; int b:1; };                //
- struct S9  { ubyte a; ubyte b:2; short c:9; };   //
- struct S10 { };                                  // sizeof differs from C treatment
- struct S11 { int :0; };                          // sizeof differs from C treatment
- struct S12 { int :0; int x; };                   //
- struct S13 { uint x:12; uint x1:1; uint x2:1; uint x3:1; uint x4:1; int w; }; //
- struct S14 { ubyte a; ubyte b:4; int c:30; };    //
- struct S15 { ubyte a; ubyte b:2; int c:9; };     //
- struct S16 { int :32; };                         // sizeof differs from C treatment
- struct S17 { int a:32; };                        //
- struct S18 { ubyte a; long :0; ubyte b; };       //
- struct A0  { int a; long b:34, c:4; };           //
- struct A1  { int a; uint b:11; int c; };         //
- struct A2  { int a; uint b:11, c:5, d:16;        //
-              int e; };
- struct A3  { int a; uint b:11, c:5, :0, d:16;    //
-              int e; };
- struct A4  { int a:8; short b:7;                 //
-              uint c:29; };
- struct A5  { ubyte a:7, b:2; };                  //
- struct A6  { ubyte a:7; short b:2; };            //
- struct A7  { short a:8; int b:16; int c;         //
-              ubyte d:7; };
- struct A8  { short a:8; int b:16; int :0;        //
-              ubyte c:7; };
- struct A9  { ushort a:8; int b:16;               //
-              uint c:29; long d:9;
-              uint e:2, f:31; };
- struct A10 { ushort a:8; ubyte b; };             //
- struct A11 { ubyte a; int b:5, c:11, :0, d:8;    //
-              struct { int ee:8; } };
- 
- int main()
- {
-     /* MS produces identical results for 32 and 64 bit compiles,
-      * DM is 32 bit only
-      */
-     printf("                DM |   MS |  P32 |  P64\n");
-     printf("T0  = %2d %d ||  1 1 |  1 1 |  1 1 |  1 1\n", cast(int)T0.sizeof, cast(int)T0.alignof);
-     printf("T1  = %2d %d ||  2 2 |  2 2 |  2 2 |  2 2\n", cast(int)T1.sizeof, cast(int)T1.alignof);
-     printf("T2  = %2d %d ||  4 4 |  4 4 |  4 4 |  4 4\n", cast(int)T2.sizeof, cast(int)T2.alignof);
-     printf("T3  = %2d %d || 16 8 | 16 8 |  8 4 |  8 8\n", cast(int)T3.sizeof, cast(int)T3.alignof);
-     printf("T4  = %2d %d || 16 8 | 16 8 | 12 4 | 16 8\n", cast(int)T4.sizeof, cast(int)T4.alignof);
-     printf("T5  = %2d %d || 16 8 | 16 8 |  8 4 |  8 8\n", cast(int)T5.sizeof, cast(int)T5.alignof);
-     printf("S1  = %2d %d ||  8 8 |  8 8 |  4 4 |  8 8\n", cast(int)S1.sizeof, cast(int)S1.alignof);
-     printf("S2  = %2d %d ||  4 4 |  4 4 |  4 4 |  4 4\n", cast(int)S2.sizeof, cast(int)S2.alignof);
-     printf("S3  = %2d %d ||  8 4 |  8 4 |  4 4 |  4 4\n", cast(int)S3.sizeof, cast(int)S3.alignof);
-     printf("S4  = %2d %d ||  8 4 |  8 4 |  4 4 |  4 4\n", cast(int)S4.sizeof, cast(int)S4.alignof);
-     printf("S5  = %2d %d ||  8 4 |  8 4 |  4 4 |  4 4\n", cast(int)S5.sizeof, cast(int)S5.alignof);
-     printf("S6  = %2d %d ||  2 2 |  2 2 |  2 2 |  2 2\n", cast(int)S6.sizeof, cast(int)S6.alignof);
-     printf("S7  = %2d %d || 16 8 | 16 8 |  4 4 |  8 8\n", cast(int)S7.sizeof, cast(int)S7.alignof);
-     printf("S8  = %2d %d ||  4 2 |  4 2 |  2 2 |  2 2\n", cast(int)S8.sizeof, cast(int)S8.alignof);
-     printf("S8A = %2d %d ||  4 2 |  4 2 |  2 2 |  2 2\n", cast(int)S8A.sizeof, cast(int)S8A.alignof);
-     printf("S8B = %2d %d ||  6 2 |  6 2 |  2 2 |  2 2\n", cast(int)S8B.sizeof, cast(int)S8B.alignof);
-     printf("S8C = %2d %d ||  8 4 |  8 4 |  4 4 |  4 4\n", cast(int)S8C.sizeof, cast(int)S8C.alignof);
-     printf("S9  = %2d %d ||  4 2 |  4 2 |  4 2 |  4 2\n", cast(int)S9.sizeof,  cast(int)S9.alignof);
-     printf("S10 = %2d %d ||  0 0 |  * * |  0 1 |  0 1\n", cast(int)S10.sizeof, cast(int)S10.alignof); // MS doesn't compile
-     printf("S11 = %2d %d ||  0 0 |  4 1 |  0 1 |  0 1\n", cast(int)S11.sizeof, cast(int)S11.alignof);
-     printf("S12 = %2d %d ||  4 4 |  4 4 |  4 4 |  4 4\n", cast(int)S12.sizeof, cast(int)S12.alignof);
-     printf("S13 = %2d %d ||  8 4 |  8 4 |  8 4 |  8 4\n", cast(int)S13.sizeof, cast(int)S13.alignof);
-     printf("S14 = %2d %d ||  8 4 |  8 4 |  8 4 |  8 4\n", cast(int)S14.sizeof, cast(int)S14.alignof);
-     printf("S15 = %2d %d ||  8 4 |  8 4 |  4 4 |  4 4\n", cast(int)S15.sizeof, cast(int)S15.alignof);
-     printf("S16 = %2d %d ||  0 0 |  4 4 |  4 1 |  4 1\n", cast(int)S16.sizeof, cast(int)S16.alignof);
-     printf("S17 = %2d %d ||  4 4 |  4 4 |  4 4 |  4 4\n", cast(int)S17.sizeof, cast(int)S17.alignof);
-     printf("S18 = %2d %d ||  2 1 |  2 1 |  5 1 |  9 1\n", cast(int)S18.sizeof, cast(int)S18.alignof);
-     printf("A0  = %2d %d || 16 8 | 16 8 | 12 4 | 16 8\n", cast(int)A0.sizeof,  cast(int)A0.alignof);
-     printf("A1  = %2d %d || 12 4 | 12 4 | 12 4 | 12 4\n", cast(int)A1.sizeof,  cast(int)A1.alignof);
-     printf("A2  = %2d %d || 12 4 | 12 4 | 12 4 | 12 4\n", cast(int)A2.sizeof,  cast(int)A2.alignof);
-     printf("A3  = %2d %d || 16 4 | 16 4 | 16 4 | 16 4\n", cast(int)A3.sizeof,  cast(int)A3.alignof);
-     printf("A4  = %2d %d || 12 4 | 12 4 |  8 4 |  8 4\n", cast(int)A4.sizeof,  cast(int)A4.alignof);
-     printf("A5  = %2d %d ||  2 1 |  2 1 |  2 1 |  2 1\n", cast(int)A5.sizeof,  cast(int)A5.alignof);
-     printf("A6  = %2d %d ||  4 2 |  4 2 |  2 2 |  2 2\n", cast(int)A6.sizeof,  cast(int)A6.alignof);
-     printf("A7  = %2d %d || 16 4 | 16 4 | 12 4 | 16 8\n", cast(int)A7.sizeof,  cast(int)A7.alignof);
-     printf("A8  = %2d %d || 12 4 | 12 4 |  8 4 |  8 8\n", cast(int)A8.sizeof,  cast(int)A8.alignof);
-     printf("A9  = %2d %d || 32 8 | 32 8 | 16 4 | 16 8\n", cast(int)A9.sizeof,  cast(int)A9.alignof);
-     printf("A10 = %2d %d ||  4 2 |  4 2 |  2 2 |  2 2\n", cast(int)A10.sizeof, cast(int)A10.alignof);
-     printf("A11 = %2d %d || 16 4 | 16 4 | 12 4 | 12 4\n", cast(int)A11.sizeof, cast(int)A11.alignof);
- 
-     {
-         S9 s;
-         uint x;
-         *cast(uint *)&s = 0;
-         s.b = 2; s.c = 3;
-         x = *cast(uint *)&s;
-         printf("S9 = x%x\n", x);
-     }
-     {
-         S14 s = { 1, 2, 3 };
-         ulong v;
-         *cast(long *)&s = 0;
-         s.a = 1;
-         s.b = 2;
-         s.c = 3;
-         v = *cast(ulong *)&s;
-         printf("S14 = x%llx\n", v);
-     }
-     {
-         S15 s = { 1,2,3 };
-         uint x;
-         *cast(uint *)&s = 0;
-         s.a = 1; s.b = 2; s.c = 3;
-         x = *cast(uint *)&s;
-         printf("S15 = x%x\n", x);
-     }
-     {
-         S18 s;
-         printf("S18 = %d should be %d\n", cast(int)(&s.b - &s.a), is64bit() ? 8 : 4);
-     }
-     {
-         A0 s;
-         long x;
-         *cast(long *)&s = 0;
-         s.a = 1; s.b = 15;
-         x = *cast(long *)&s;
-         printf("A0 = x%llx\n", x);
-     }
- 
-     return 0;
- }
--- 0 ----
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gfortran.dg/goacc/pr120723.f90 gcc-16-20260322/gcc/testsuite/gfortran.dg/goacc/pr120723.f90
*** gcc-16-20260315/gcc/testsuite/gfortran.dg/goacc/pr120723.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/gfortran.dg/goacc/pr120723.f90	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,20 ----
+ ! { dg-do compile }
+ ! { dg-additional-options "-fdump-tree-original" }
+ !
+ ! PR fortran/120723 - scalar OpenACC attach/detach must not lower through a
+ ! standalone pointer-mapping node.
+ 
+ implicit none (type, external)
+ integer, pointer :: a, b(:)
+ integer, allocatable :: c, d(:)
+ 
+ ! Scalar pointer and allocatable items used to ICE here.
+ !$acc enter data attach(a, c)
+ !$acc enter data attach(b, d)
+ !$acc exit data detach(a, c)
+ !$acc exit data detach(b, d)
+ 
+ ! { dg-final { scan-tree-dump-times "(?n)#pragma acc enter data map\\(attach:a \\\[bias: 0\\\]\\) map\\(attach:c \\\[bias: 0\\\]\\);$" 1 "original" } }
+ ! { dg-final { scan-tree-dump-times "(?n)#pragma acc exit data map\\(detach:a \\\[bias: 0\\\]\\) map\\(detach:c \\\[bias: 0\\\]\\);$" 1 "original" } }
+ 
+ end
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gfortran.dg/pr105168.f90 gcc-16-20260322/gcc/testsuite/gfortran.dg/pr105168.f90
*** gcc-16-20260315/gcc/testsuite/gfortran.dg/pr105168.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/gfortran.dg/pr105168.f90	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,38 ----
+ ! { dg-do run }
+ ! Test fix for PR105168, in which nterface mapping was failing with CLASS 'x'
+ ! and parentheses around the actual argument.
+ !
+ ! Contributed by Gerhard Steinmetz  <gscfq@t-online.de>
+ !
+ module m
+    type t
+       integer :: a
+    contains
+       final :: final_t
+    end type
+    integer :: cntr = 0
+ contains
+    function f(x, factor) result(z)
+       class(t) :: x(:) ! Worked, with or without parentheses if s/CLASS/TYPE/
+       type(t) :: z(2)
+       integer :: factor
+       z = x            ! Seg fault here
+       z%a = factor * z%a
+    end
+    impure elemental subroutine final_t (arg)
+       type (t), intent(in) :: arg
+       cntr = cntr + 1
+    end subroutine
+ end module
+ program p
+    use m
+    class(t), allocatable :: y(:), z(:)
+    y = [t(2),t(4)]
+    allocate (t :: z(2))
+    z = f((y), 1)          ! Failed even with parentheses removed
+    if (any(z%a /= [2,4])) stop 1
+    z = f(y, 2)            ! Failed but now OK
+    if (any (z%a /= [4,8])) stop 2
+    deallocate (y, z)
+    if (cntr /= 16) stop 3 ! 6 for each assignment and 4 for deallocation
+ end
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gfortran.dg/pr124161.f90 gcc-16-20260322/gcc/testsuite/gfortran.dg/pr124161.f90
*** gcc-16-20260315/gcc/testsuite/gfortran.dg/pr124161.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/gfortran.dg/pr124161.f90	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,61 ----
+ ! { dg-do compile }
+ !
+ ! Test the fix for the regression caused by r16-669-gd31ab498b12ebb - See line 59.
+ !
+ ! Contributed by Zaak Beekman  <zbeekman@gmail.com>
+ !
+ module inner_m
+     implicit none
+     type :: dt_t
+         integer, allocatable :: val
+     end type
+     type, abstract :: inner_t
+     contains
+         procedure(summary_i), deferred :: summary
+     end type
+     abstract interface
+         function summary_i(self)
+             import :: inner_t, dt_t
+             class(inner_t), intent(in) :: self
+             type(dt_t) :: summary_i
+         end function
+     end interface
+ end module inner_m
+ 
+ module concrete_m
+     use inner_m, only: inner_t, dt_t
+     implicit none
+     type, extends(inner_t) :: concrete_t
+     contains
+         procedure :: summary
+     end type
+ contains
+     function summary(self)
+         class(concrete_t), intent(in) :: self
+         type(dt_t) :: summary
+     end function
+ end module concrete_m
+ 
+ module outer_m
+     use inner_m, only: inner_t, dt_t
+     use concrete_m, only: concrete_t
+     implicit none
+     type :: outer_t
+         class(inner_t), allocatable :: component
+     contains
+         procedure :: summary
+     end type
+     interface
+         module function summary(self) result(res)
+             class(outer_t), intent(in) :: self
+             type(dt_t) :: res
+         end function
+     end interface
+ end module outer_m
+ 
+ submodule(outer_m) outer_impl
+ contains
+     module procedure summary
+         res = self%component%summary()  ! ICE in trans_scalar_assign here
+     end procedure
+ end submodule outer_impl
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gfortran.dg/pr84779.f90 gcc-16-20260322/gcc/testsuite/gfortran.dg/pr84779.f90
*** gcc-16-20260315/gcc/testsuite/gfortran.dg/pr84779.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/gfortran.dg/pr84779.f90	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,18 ----
+ ! { dg-do compile }
+ ! { dg-additional-options "-O1 -fdefault-integer-8" }
+ ! PR fortran/84779
+ ! Contributed by Dominique d'Humieres <dominiq@lps.ens.fr>
+ !
+ ! ICE with -O1 -fdefault-integer-8 on mixed ENTRY with complex/logical results.
+ 
+       complex function f2 (a)
+       implicit none
+       integer   a
+       logical   e2
+       entry e2 (a)
+       if (a > 0) then
+         e2 = .true.
+       else
+         f2 = 45
+       endif
+       end
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gfortran.dg/pr93832.f90 gcc-16-20260322/gcc/testsuite/gfortran.dg/pr93832.f90
*** gcc-16-20260315/gcc/testsuite/gfortran.dg/pr93832.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/gfortran.dg/pr93832.f90	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,37 ----
+ module m
+ contains
+    subroutine comment0
+       type t
+          character :: a
+          integer :: b
+          integer :: c(t(1))            ! { dg-error "No initializer for component .b." }
+       end type
+       type(t) :: z = t('a', 2, [3])    ! { dg-error "Bad array spec of component .c." }
+    end
+ 
+    subroutine comment3a
+       type t
+          character :: a
+          integer :: b
+          integer :: c(t(1, "rubbish")) ! { dg-error "No initializer for component .c." }
+       end type
+       type(t) :: z = t('a', 2, [3])    ! { dg-error "Bad array spec of component .c." }
+    end
+ 
+    subroutine comment3b
+       type t
+          character :: a
+          integer :: b
+          integer :: c(t(1, "rubbish", [7])) ! { dg-error "Derived type or class expression" }
+       end type
+       type(t) :: z = t('a', 2, [3])    ! { dg-error "Bad array spec of component .c." }
+    end
+ 
+    subroutine comment9
+       type t
+          character :: a
+          integer :: b(t(1))            ! { dg-error "No initializer for component .b." }
+       end type
+       type(t) :: x = t('a', 2)
+    end
+ end module
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gnat.dg/implicit_deref1.adb gcc-16-20260322/gcc/testsuite/gnat.dg/implicit_deref1.adb
*** gcc-16-20260315/gcc/testsuite/gnat.dg/implicit_deref1.adb	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/gnat.dg/implicit_deref1.adb	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,50 ----
+ -- { dg-do compile }
+ -- { dg-options "-gnatws" }
+ 
+ with Ada.Containers.Indefinite_Ordered_Maps;
+ with Ada.Strings.Unbounded;
+ 
+ procedure Implicit_Deref1 is
+    use Ada.Strings.Unbounded;
+ 
+    package Reproduce_Pkg is
+       type Person_Type is tagged private;
+ 
+       type Person_Ref (Data : not null access Person_Type) is
+       limited null record
+       with Implicit_Dereference => Data;
+ 
+       type Person_Handler_Ptr is access procedure (Person : Person_Type);
+ 
+       function New_Person (Name : Unbounded_String) return Person_Ref;
+ 
+       function New_Person
+         (Person : aliased in out Person_Type; Name : Unbounded_String)
+          return Person_Ref;
+ 
+    private
+ 
+       type Person_Type is tagged record
+          Name : Unbounded_String;
+       end record;
+    end Reproduce_Pkg;
+ 
+    package body Reproduce_Pkg is
+       function New_Person (Name : Unbounded_String) return Person_Ref is
+       begin
+          return (Data => new Person_Type'(Name => Name));
+       end New_Person;
+ 
+       function New_Person
+         (Person : aliased in out Person_Type; Name : Unbounded_String)
+          return Person_Ref is
+       begin
+          return (Data => new Person_Type'(Name => Name));
+       end New_Person;
+    end Reproduce_Pkg;
+ 
+    App : Reproduce_Pkg.Person_Type :=
+      Reproduce_Pkg.New_Person (Name => To_Unbounded_String ("hello"));
+ begin
+    null;
+ end;
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gnat.dg/implicit_deref2.adb gcc-16-20260322/gcc/testsuite/gnat.dg/implicit_deref2.adb
*** gcc-16-20260315/gcc/testsuite/gnat.dg/implicit_deref2.adb	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/gnat.dg/implicit_deref2.adb	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,74 ----
+ -- { dg-do compile }
+ 
+ with Ada.Text_IO;
+ with System.Address_To_Access_Conversions;
+ 
+ procedure Implicit_Deref2 is
+ 
+    package Test is
+ 
+       type Any is
+          tagged limited
+             record
+                Address : System.Address;
+             end record;
+ 
+       type Any_Ptr is access Any;
+ 
+       generic
+          type T (<>) is limited private;
+          type T_Ptr is access T;
+       function Make (P : T_Ptr) return Any_Ptr;
+ 
+       generic
+          type T (<>) is limited private;
+          type T_Ref (Data : not null access constant T) is limited private;
+          with function Make_T_Ref (Data : not null access constant T) return T_Ref;
+       function Get (P : Any_Ptr) return T_Ref;
+ 
+    end Test;
+ 
+    package body Test is
+ 
+       function Make (P : T_Ptr) return Any_Ptr is
+          package Convert is new System.Address_To_Access_Conversions (T);
+       begin
+          return new Any'(Address => Convert.To_Address (Convert.Object_Pointer (P)));
+       end Make;
+ 
+       function Get (P : Any_Ptr) return T_Ref is
+          package Convert is new System.Address_To_Access_Conversions (T);
+       begin
+          return Make_T_Ref (Convert.To_Pointer (P.Address));
+       end Get;
+ 
+    end Test;
+ 
+    type Integer_Ptr is access Integer;
+    type Integer_Ref (Data : not null access constant Integer) is limited null record
+       with Implicit_Dereference => Data;
+    function Make_Integer_Ref (Data : not null access constant Integer) return Integer_Ref is
+      (Data => Data);
+ 
+    function Make is new Test.Make (Integer, Integer_Ptr);
+    function Get is new Test.Get (Integer, Integer_Ref, Make_Integer_Ref);
+ 
+    type Float_Ptr is access Float;
+    type Float_Ref (Data : not null access constant Float) is limited null record
+       with Implicit_Dereference => Data;
+    function Make_Float_Ref (Data : not null access constant Float) return Float_Ref is
+      (Data => Data);
+ 
+    function Make is new Test.Make (Float, Float_Ptr);
+    function Get is new Test.Get (Float, Float_Ref, Make_Float_Ref);
+ 
+    A1 : Test.Any_Ptr := Make (new Integer'(42));
+    A2 : Integer := Get (A1);
+ 
+    B1 : Test.Any_Ptr := Make (new Float'(43.0));
+    B2 : Float := Get (B1);
+ 
+ begin
+    Ada.Text_IO.Put_Line (A2'Image);
+    Ada.Text_IO.Put_Line (B2'Image);
+ end;
diff -Nrcpad gcc-16-20260315/gcc/testsuite/gnat.dg/implicit_deref3.adb gcc-16-20260322/gcc/testsuite/gnat.dg/implicit_deref3.adb
*** gcc-16-20260315/gcc/testsuite/gnat.dg/implicit_deref3.adb	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/gnat.dg/implicit_deref3.adb	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,52 ----
+ -- { dg-do compile }
+ 
+ procedure Implicit_Deref3 is
+ 
+    package P is
+       type Root is tagged null record;
+ 
+       type Access_Root_Class is access Root'Class;
+ 
+       type Root_Ref is tagged record
+          Block : Access_Root_Class;
+       end record;
+ 
+       function Create (Value : Root'Class) return Root_Ref
+       is (Block => new Root'Class'(Value));
+    end P;
+ 
+    use P;
+ 
+    generic
+       type T (<>) is abstract new Root with private;
+       type Parent_Ref is new Root_Ref with private;
+    package Pointers is
+       type Ref is new Parent_Ref with null record;
+ 
+       not overriding
+       function Create (Value : T) return Ref
+       is (Parent_Ref'(Create (Value)) with null record);
+ 
+       type Reference_Type (Data : access T) is limited null record
+       with Implicit_Dereference => Data;
+ 
+       function Get (This : Ref) return Reference_Type
+       is (Data => T (This.Block.all)'Access);
+    end Pointers;
+ 
+    type Derived_A is abstract new Root with null record;
+ 
+    type Derived_B is new Derived_A with record
+       I : Integer;
+    end record;
+ 
+    package A_Pointers is new Pointers (Derived_A, Root_Ref);
+    package B_Pointers is new Pointers (Derived_B, A_Pointers.Ref);
+ 
+    X : B_Pointers.Ref;
+    Y : Integer := X.Get.Data.I;
+    Z : Integer := B_Pointers.Get (X).Data.I;
+ 
+ begin
+    null;
+ end;
diff -Nrcpad gcc-16-20260315/gcc/testsuite/lib/profopt.exp gcc-16-20260322/gcc/testsuite/lib/profopt.exp
*** gcc-16-20260315/gcc/testsuite/lib/profopt.exp	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/gcc/testsuite/lib/profopt.exp	Sun Mar 22 22:32:13 2026
*************** proc profopt-execute { src } {
*** 313,318 ****
--- 313,319 ----
      global verbose
      global testname_with_flags
      global additional_sources_used
+     global GCC_UNDER_TEST
  
      if ![info exists profile_option] {
          error "No profile option specified for first compile."
*************** proc profopt-execute { src } {
*** 453,459 ****
  	    # convert profile
  	    if { $run_autofdo == 1 } {
                  set bprefix "afdo."
! 		set cmd "create_gcov --binary $execname1 --profile=$tmpdir/$base.perf.data --gcov_version=3 --gcov=$tmpdir/$bprefix$base.$ext"
  		verbose "Running $cmd"
  		set id [remote_spawn "" $cmd]
  		if { $id < 0 } {
--- 454,462 ----
  	    # convert profile
  	    if { $run_autofdo == 1 } {
                  set bprefix "afdo."
! 		set compiler [lindex $GCC_UNDER_TEST 0]
! 		set autofdo_version [string trim [lindex [remote_exec target "$compiler --print-autofdo-gcov-version"] 1] ]
! 		set cmd "create_gcov --binary $execname1 --profile=$tmpdir/$base.perf.data --gcov_version=$autofdo_version --gcov=$tmpdir/$bprefix$base.$ext"
  		verbose "Running $cmd"
  		set id [remote_spawn "" $cmd]
  		if { $id < 0 } {
diff -Nrcpad gcc-16-20260315/gcc/testsuite/lib/scanasm.exp gcc-16-20260322/gcc/testsuite/lib/scanasm.exp
*** gcc-16-20260315/gcc/testsuite/lib/scanasm.exp	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/gcc/testsuite/lib/scanasm.exp	Sun Mar 22 22:32:13 2026
*************** proc hidden-scan-for { symbol } {
*** 153,158 ****
--- 153,205 ----
  
  }
  
+ proc weak-scan-for { symbol } {
+ 
+     set objformat [gcc_target_object_format]
+ 
+     switch $objformat {
+         default  { return "weak\[^ \t\]*\[ \t\]_?$symbol" }
+     }
+ }
+ 
+ # Check that a symbol is defined as a weak symbol in the .s file
+ # produced by the compiler.
+ 
+ proc scan-weak { args } {
+     set testcase [testname-for-summary]
+     # The name might include a list of options; extract the file name.
+     set filename [lindex $testcase 0]
+     set output_file "[file rootname [file tail $filename]].s"
+ 
+     if { [llength $args] > 0 } {
+ 	set symbol [lindex $args 0]
+ 
+ 	set weak_scan [weak-scan-for $symbol]
+ 
+ 	set args [lreplace $args 0 0 "$weak_scan"]
+     }
+ 
+     dg-scan "scan-weak" 1 $testcase $output_file $args
+ }
+ 
+ # Check that a symbol is not defined as a weak symbol in the .s file
+ # produced by the compiler.
+ 
+ proc scan-not-weak { args } {
+     set testcase [testname-for-summary]
+     # The name might include a list of options; extract the file name.
+     set filename [lindex $testcase 0]
+     set output_file "[file rootname [file tail $filename]].s"
+ 
+     if { [llength $args] > 0 } {
+ 	set symbol [lindex $args 0]
+ 	set weak_scan [weak-scan-for $symbol]
+ 
+ 	set args [lreplace $args 0 0 "$weak_scan"]
+     }
+ 
+     dg-scan "scan-not-weak" 0 $testcase $output_file $args
+ }
  
  # Check that a symbol is defined as a hidden symbol in the .s file
  # produced by the compiler.
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/attr_malformed_path.rs gcc-16-20260322/gcc/testsuite/rust/compile/attr_malformed_path.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/attr_malformed_path.rs	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/gcc/testsuite/rust/compile/attr_malformed_path.rs	Sun Mar 22 22:32:13 2026
***************
*** 3,6 ****
  
  #[cfg_attr(target_arch = "x86_64", path = (target_arch = "x86",    path = "x86.rs"))]
  mod imp {}
! // { dg-error "malformed .path. attribute input" "" { target *-*-* } .-2 }
--- 3,8 ----
  
  #[cfg_attr(target_arch = "x86_64", path = (target_arch = "x86",    path = "x86.rs"))]
  mod imp {}
! // { dg-error "malformed .path. attribute input" "" { target { x86_64-*-* && { lp64 } } } .-2 }
! // { dg-error "cannot find value .target_arch. in this scope" "" { target { x86_64-*-* && { lp64 } } } .-3 }
! // { dg-error "cannot find value .path. in this scope" "" { target { x86_64-*-* && { lp64 } } } .-4 }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/bswap.rs gcc-16-20260322/gcc/testsuite/rust/compile/bswap.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/bswap.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/rust/compile/bswap.rs	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,17 ----
+ // { dg-do compile }
+ #![feature(intrinsics, lang_items, no_core)]
+ #![no_core]
+ 
+ #[lang = "sized"]
+ pub trait Sized {}
+ 
+ #[lang = "copy"]
+ pub trait Copy {}
+ 
+ extern "rust-intrinsic" {
+     pub fn bswap<T>(x: T) -> T; // { dg-error "bswap intrinsics can only be used with basic integer types .got 'bool'." }
+ }
+ 
+ fn main() {
+     let _ = bswap(true);
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/cli_inner_attribute_injection.rs gcc-16-20260322/gcc/testsuite/rust/compile/cli_inner_attribute_injection.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/cli_inner_attribute_injection.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/rust/compile/cli_inner_attribute_injection.rs	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,2 ----
+ // { dg-additional-options "-frust-crate-attr=feature(no_core)" }
+ #![no_core]
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/doc_macro.rs gcc-16-20260322/gcc/testsuite/rust/compile/doc_macro.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/doc_macro.rs	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/gcc/testsuite/rust/compile/doc_macro.rs	Sun Mar 22 22:32:13 2026
***************
*** 1,4 ****
  #![feature(no_core)]
  #![no_core]
! 
  #![doc = concat!("AB")]
--- 1,4 ----
  #![feature(no_core)]
  #![no_core]
! #![feature(extended_key_value_attributes)]
  #![doc = concat!("AB")]
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/early_feature_gate_in_macro.rs gcc-16-20260322/gcc/testsuite/rust/compile/early_feature_gate_in_macro.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/early_feature_gate_in_macro.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/rust/compile/early_feature_gate_in_macro.rs	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,23 ----
+ #![feature(rustc_attrs)]
+ #![feature(lang_items)]
+ #![feature(no_core)]
+ #![no_core]
+ 
+ #[rustc_builtin_macro]
+ macro_rules! concat {
+     () => {{}};
+ }
+ 
+ macro_rules! prefix_symbol(
+     ($prefix : tt, { $($ident: ident, )* }) => {
+         $(
+             // { dg-error "arbitrary expressions in key-value attributes are unstable" "" { target *-*-* } .+1 }
+             #[export_name = concat!(stringify!($prefix), stringify!($ident))]
+             pub extern "C" fn $ident() {
+             }
+         )*
+ });
+ 
+ prefix_symbol!(a,{
+     __func0,
+ });
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/issue-3661.rs gcc-16-20260322/gcc/testsuite/rust/compile/issue-3661.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/issue-3661.rs	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/gcc/testsuite/rust/compile/issue-3661.rs	Sun Mar 22 22:32:13 2026
***************
*** 1,5 ****
--- 1,6 ----
  #![feature(no_core)]
  #![no_core]
+ #![feature(extended_key_value_attributes)]
  
  pub macro m($inner_str:expr) {
      #[m = $inner_str] 
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/issue-3947.rs gcc-16-20260322/gcc/testsuite/rust/compile/issue-3947.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/issue-3947.rs	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/gcc/testsuite/rust/compile/issue-3947.rs	Sun Mar 22 22:32:13 2026
*************** enum _Enum {
*** 7,13 ****
  
  type _E = _Enum;
  
- // { dg-warning "function is never used: '_a'" "" { target *-*-* } .+1 }
  const fn _a() -> _Enum {
      _E::A()
  }
--- 7,12 ----
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/issue-3951.rs gcc-16-20260322/gcc/testsuite/rust/compile/issue-3951.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/issue-3951.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/rust/compile/issue-3951.rs	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,13 ----
+ // { dg-options "-frust-incomplete-and-experimental-compiler-do-not-use" }
+ #![feature(no_core)]
+ #![no_core]
+ 
+ #[derive(RustcDecodable)] // { dg-message "is not yet implemented" }
+ struct Struct1 {}
+ 
+ #[derive(RustcEncodable)] // { dg-message "is not yet implemented" }
+ struct Struct2 {}
+ 
+ // Pinpoint the global errors (errors with no line number are at line 0)
+ // { dg-error "could not resolve trait 'RustcDecodable'" "" { target *-*-* } 0 }
+ // { dg-error "could not resolve trait 'RustcEncodable'" "" { target *-*-* } 0 }
\ No newline at end of file
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/issue-4212.rs gcc-16-20260322/gcc/testsuite/rust/compile/issue-4212.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/issue-4212.rs	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/gcc/testsuite/rust/compile/issue-4212.rs	Sun Mar 22 22:32:13 2026
***************
*** 3,8 ****
--- 3,10 ----
  
  #![derive(PartialOrd, PartialEq)]
  // { dg-error "attribute cannot be used at crate level" "" { target *-*-* } .-1 }
+ // { dg-error "could not resolve trait .PartialOrd." "" { target *-*-* } .-2 }
+ // { dg-error "could not resolve trait .PartialEq." "" { target *-*-* } .-3 }
  pub fn check_ge(a: i32, b: i32) -> bool {
      a >= b
  }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/issue-4411.rs gcc-16-20260322/gcc/testsuite/rust/compile/issue-4411.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/issue-4411.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/rust/compile/issue-4411.rs	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,16 ----
+ #![feature(no_core)]
+ #![no_core]
+ mod framing {
+     mod public_message {
+         pub struct ConfirmedTranscriptHashInput;
+     }
+     mod public_message_in {
+         pub struct ConfirmedTranscriptHashInput;
+     }
+     pub use self::public_message::*;
+     pub use self::public_message_in::*;
+ }
+ 
+ use crate::framing::ConfirmedTranscriptHashInput; // { dg-error "is ambiguous .E0659." }
+ 
+ fn main() {}
\ No newline at end of file
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/issue-4413.rs gcc-16-20260322/gcc/testsuite/rust/compile/issue-4413.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/issue-4413.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/rust/compile/issue-4413.rs	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,8 ----
+ #![feature(no_core)]
+ #![no_core]
+ 
+ fn main() {
+     match money {
+         v => println!  
+     } // { dg-error "unexpected token .* - expecting delimiters" }
+ }
\ No newline at end of file
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/issue-4433.rs gcc-16-20260322/gcc/testsuite/rust/compile/issue-4433.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/issue-4433.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/rust/compile/issue-4433.rs	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,19 ----
+ // { dg-options "-frust-incomplete-and-experimental-compiler-do-not-use" }
+ #![feature(no_core)]
+ #![no_core]
+ 
+ #[derive(Toto)] // { dg-error "macro not found" }
+ // { dg-error "could not resolve trait" "" { target *-*-* } .-1 }
+ struct Test {}
+ 
+ #[derive(
+     Happy,   // { dg-error "macro not found" }
+     // { dg-error "could not resolve trait" "" { target *-*-* } .-1 }
+     Birthday // { dg-error "macro not found" }
+     // { dg-error "could not resolve trait" "" { target *-*-* } .-1 }
+ )]
+ struct MultiLine {}
+ 
+ #[derive(One, Two)] // { dg-error "macro not found" }
+ // { dg-error "could not resolve trait" "" { target *-*-* } .-1 }
+ struct SingleLine {}
\ No newline at end of file
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/match-scope.rs gcc-16-20260322/gcc/testsuite/rust/compile/match-scope.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/match-scope.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/rust/compile/match-scope.rs	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,9 ----
+ #![feature(no_core)]
+ #![no_core]
+ 
+ pub fn main() -> i32 {
+     match 12 {
+         x => {}
+     }
+     x // { dg-error "cannot find value 'x'" }
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/no_core_feature_gate.rs gcc-16-20260322/gcc/testsuite/rust/compile/no_core_feature_gate.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/no_core_feature_gate.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/rust/compile/no_core_feature_gate.rs	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,3 ----
+ #![no_core] // { dg-error "no_core is experimental" }
+ 
+ fn main() {}
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/parse_time_feature_gate.rs gcc-16-20260322/gcc/testsuite/rust/compile/parse_time_feature_gate.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/parse_time_feature_gate.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/rust/compile/parse_time_feature_gate.rs	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,6 ----
+ #![feature(no_core)]
+ #![no_core]
+ 
+ // { dg-error "arbitrary expressions in key-value attributes are unstable" "" { target *-*-* } .+1 }
+ #[export_name = concat!(stringify!(non), stringify!(literal))]
+ pub extern "C" fn attribute_test_function() {}
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/wildcard_const.rs gcc-16-20260322/gcc/testsuite/rust/compile/wildcard_const.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/wildcard_const.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/rust/compile/wildcard_const.rs	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,14 ----
+ #![feature(lang_items)]
+ #![feature(no_core)]
+ #![no_core]
+ 
+ macro_rules! assert {
+     ($cond:expr $(,)?) => {{ /* compiler built-in */ }};
+     ($cond:expr, $($arg:tt)+) => {{ /* compiler built-in */ }};
+ }
+ 
+ #[lang = "sized"]
+ trait Sized {}
+ 
+ const _: () = assert!(true);
+ const _: () = assert!(true);
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/wildcard_enum.rs gcc-16-20260322/gcc/testsuite/rust/compile/wildcard_enum.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/wildcard_enum.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/rust/compile/wildcard_enum.rs	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,8 ----
+ #![feature(no_core)]
+ #![no_core]
+ 
+ // { dg-error "expecting" "" { target *-*-* } .+1 }
+ enum _ {
+     Variant1,
+     Variant2,
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/wildcard_enum_variant.rs gcc-16-20260322/gcc/testsuite/rust/compile/wildcard_enum_variant.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/wildcard_enum_variant.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/rust/compile/wildcard_enum_variant.rs	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,9 ----
+ #![feature(no_core)]
+ #![no_core]
+ 
+ enum Test {
+     // { dg-error "expecting" "" { target *-*-* } .+1 }
+     _,
+ }
+ 
+ 
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/wildcard_static.rs gcc-16-20260322/gcc/testsuite/rust/compile/wildcard_static.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/wildcard_static.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/rust/compile/wildcard_static.rs	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,15 ----
+ #![feature(lang_items)]
+ #![feature(no_core)]
+ #![no_core]
+ 
+ macro_rules! assert {
+     ($cond:expr $(,)?) => {{ /* compiler built-in */ }};
+     ($cond:expr, $($arg:tt)+) => {{ /* compiler built-in */ }};
+ }
+ 
+ #[lang = "sized"]
+ trait Sized {}
+ 
+ // { dg-error "expecting" "" { target *-*-* } .+1 }
+ static _ :() = assert!(true);
+ 
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/wildcard_struct.rs gcc-16-20260322/gcc/testsuite/rust/compile/wildcard_struct.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/wildcard_struct.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/rust/compile/wildcard_struct.rs	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,7 ----
+ #![feature(no_core)]
+ #![no_core]
+ 
+ // { dg-error "expecting" "" { target *-*-* } .+1 }
+ struct _ {
+     a : i32,
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/compile/wildcard_variable.rs gcc-16-20260322/gcc/testsuite/rust/compile/wildcard_variable.rs
*** gcc-16-20260315/gcc/testsuite/rust/compile/wildcard_variable.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/rust/compile/wildcard_variable.rs	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,16 ----
+ #![feature(lang_items)]
+ #![feature(no_core)]
+ #![no_core]
+ 
+ macro_rules! assert {
+     ($cond:expr $(,)?) => {{ /* compiler built-in */ }};
+     ($cond:expr, $($arg:tt)+) => {{ /* compiler built-in */ }};
+ }
+ 
+ #[lang = "sized"]
+ trait Sized {}
+ 
+ fn _test() {
+     let _: () = assert!(true);
+     let _: () = assert!(true);
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/execute/bswap.rs gcc-16-20260322/gcc/testsuite/rust/execute/bswap.rs
*** gcc-16-20260315/gcc/testsuite/rust/execute/bswap.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/gcc/testsuite/rust/execute/bswap.rs	Sun Mar 22 22:32:13 2026
***************
*** 0 ****
--- 1,263 ----
+ // { dg-do run }
+ // { dg-options "-O2" }
+ 
+ /*
+  * Note on test design:
+  * This test uses a union-based type punning approach rather than standard
+  * integer literals (e.g., 0x..._u128) or bitwise shifts for 64-bit and 128-bit types.
+  * We do this for a few practical reasons:
+  *  gccrs doesn't support 128-bit integer literals yet.
+  *  Doing manual bitwise shifts on 32-bit targets currently triggers ICEs in the frontend.
+  *  Casting via raw pointers gets optimized away by GCC under -O2 due to strict aliasing rules.
+  * Using a #[repr(C)] union gives us a safe workaround.
+  *  As a bonus, by asserting against the physical memory layout ([u8; N]) instead
+  * of the logical integer value, this test is inherently endian-agnostic.
+  */
+ 
+ #![feature(intrinsics, lang_items, no_core)]
+ #![no_core]
+ 
+ #[lang = "sized"]
+ pub trait Sized {}
+ 
+ #[lang = "copy"]
+ pub trait Copy {}
+ 
+ extern "rust-intrinsic" {
+     pub fn bswap<T>(x: T) -> T;
+     pub fn abort() -> !;
+ }
+ 
+ #[repr(C)]
+ union U64Pun {
+     bytes: [u8; 8],
+     val: u64,
+ }
+ #[repr(C)]
+ union I64Pun {
+     bytes: [u8; 8],
+     val: i64,
+ }
+ #[repr(C)]
+ union U128Pun {
+     bytes: [u8; 16],
+     val: u128,
+ }
+ #[repr(C)]
+ union I128Pun {
+     bytes: [u8; 16],
+     val: i128,
+ }
+ 
+ fn test_bswap_16_and_32() {
+     if bswap(0x0102_u16) != 0x0201_u16 {
+         abort();
+     }
+     if bswap(0x0102_i16) != 0x0201_i16 {
+         abort();
+     }
+ 
+     if bswap(0x01020304_u32) != 0x04030201_u32 {
+         abort();
+     }
+     if bswap(0x01020304_i32) != 0x04030201_i32 {
+         abort();
+     }
+ }
+ 
+ fn test_bswap_u64() {
+     let in_pun = U64Pun {
+         bytes: [1, 2, 3, 4, 5, 6, 7, 8],
+     };
+     unsafe {
+         let out_pun = U64Pun {
+             val: bswap(in_pun.val),
+         };
+         if out_pun.bytes[0] != 8 {
+             abort();
+         }
+         if out_pun.bytes[1] != 7 {
+             abort();
+         }
+         if out_pun.bytes[2] != 6 {
+             abort();
+         }
+         if out_pun.bytes[3] != 5 {
+             abort();
+         }
+         if out_pun.bytes[4] != 4 {
+             abort();
+         }
+         if out_pun.bytes[5] != 3 {
+             abort();
+         }
+         if out_pun.bytes[6] != 2 {
+             abort();
+         }
+         if out_pun.bytes[7] != 1 {
+             abort();
+         }
+     }
+ }
+ 
+ fn test_bswap_i64() {
+     let in_pun = I64Pun {
+         bytes: [1, 2, 3, 4, 5, 6, 7, 8],
+     };
+     unsafe {
+         let out_pun = I64Pun {
+             val: bswap(in_pun.val),
+         };
+         if out_pun.bytes[0] != 8 {
+             abort();
+         }
+         if out_pun.bytes[1] != 7 {
+             abort();
+         }
+         if out_pun.bytes[2] != 6 {
+             abort();
+         }
+         if out_pun.bytes[3] != 5 {
+             abort();
+         }
+         if out_pun.bytes[4] != 4 {
+             abort();
+         }
+         if out_pun.bytes[5] != 3 {
+             abort();
+         }
+         if out_pun.bytes[6] != 2 {
+             abort();
+         }
+         if out_pun.bytes[7] != 1 {
+             abort();
+         }
+     }
+ }
+ 
+ fn test_bswap_u128() {
+     let in_pun = U128Pun {
+         bytes: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
+     };
+     unsafe {
+         let out_pun = U128Pun {
+             val: bswap(in_pun.val),
+         };
+         if out_pun.bytes[0] != 16 {
+             abort();
+         }
+         if out_pun.bytes[1] != 15 {
+             abort();
+         }
+         if out_pun.bytes[2] != 14 {
+             abort();
+         }
+         if out_pun.bytes[3] != 13 {
+             abort();
+         }
+         if out_pun.bytes[4] != 12 {
+             abort();
+         }
+         if out_pun.bytes[5] != 11 {
+             abort();
+         }
+         if out_pun.bytes[6] != 10 {
+             abort();
+         }
+         if out_pun.bytes[7] != 9 {
+             abort();
+         }
+         if out_pun.bytes[8] != 8 {
+             abort();
+         }
+         if out_pun.bytes[9] != 7 {
+             abort();
+         }
+         if out_pun.bytes[10] != 6 {
+             abort();
+         }
+         if out_pun.bytes[11] != 5 {
+             abort();
+         }
+         if out_pun.bytes[12] != 4 {
+             abort();
+         }
+         if out_pun.bytes[13] != 3 {
+             abort();
+         }
+         if out_pun.bytes[14] != 2 {
+             abort();
+         }
+         if out_pun.bytes[15] != 1 {
+             abort();
+         }
+     }
+ }
+ 
+ fn test_bswap_i128() {
+     let in_pun = I128Pun {
+         bytes: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
+     };
+     unsafe {
+         let out_pun = I128Pun {
+             val: bswap(in_pun.val),
+         };
+         if out_pun.bytes[0] != 16 {
+             abort();
+         }
+         if out_pun.bytes[1] != 15 {
+             abort();
+         }
+         if out_pun.bytes[2] != 14 {
+             abort();
+         }
+         if out_pun.bytes[3] != 13 {
+             abort();
+         }
+         if out_pun.bytes[4] != 12 {
+             abort();
+         }
+         if out_pun.bytes[5] != 11 {
+             abort();
+         }
+         if out_pun.bytes[6] != 10 {
+             abort();
+         }
+         if out_pun.bytes[7] != 9 {
+             abort();
+         }
+         if out_pun.bytes[8] != 8 {
+             abort();
+         }
+         if out_pun.bytes[9] != 7 {
+             abort();
+         }
+         if out_pun.bytes[10] != 6 {
+             abort();
+         }
+         if out_pun.bytes[11] != 5 {
+             abort();
+         }
+         if out_pun.bytes[12] != 4 {
+             abort();
+         }
+         if out_pun.bytes[13] != 3 {
+             abort();
+         }
+         if out_pun.bytes[14] != 2 {
+             abort();
+         }
+         if out_pun.bytes[15] != 1 {
+             abort();
+         }
+     }
+ }
+ 
+ fn main() -> i32 {
+     test_bswap_16_and_32();
+     test_bswap_u64();
+     test_bswap_i64();
+     test_bswap_u128();
+     test_bswap_i128();
+     0
+ }
diff -Nrcpad gcc-16-20260315/gcc/testsuite/rust/execute/torture/match-structpattern-tuplefield.rs gcc-16-20260322/gcc/testsuite/rust/execute/torture/match-structpattern-tuplefield.rs
*** gcc-16-20260315/gcc/testsuite/rust/execute/torture/match-structpattern-tuplefield.rs	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/gcc/testsuite/rust/execute/torture/match-structpattern-tuplefield.rs	Sun Mar 22 22:32:13 2026
*************** pub struct TupStruct (i32, i32);
*** 5,13 ****
  
  pub fn main() -> i32 {
      let mut t = TupStruct (1, 1);
      match t {
!         TupStruct { 0: 1, 1: b } => { b -= 1 }
          _ => {}
      }
!     b
  }
--- 5,14 ----
  
  pub fn main() -> i32 {
      let mut t = TupStruct (1, 1);
+     let mut ret = 1;
      match t {
!         TupStruct { 0: 1, 1: b } => { b -= 1; ret = b }
          _ => {}
      }
!     ret
  }
diff -Nrcpad gcc-16-20260315/gcc/tree-scalar-evolution.cc gcc-16-20260322/gcc/tree-scalar-evolution.cc
*** gcc-16-20260315/gcc/tree-scalar-evolution.cc	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/gcc/tree-scalar-evolution.cc	Sun Mar 22 22:32:13 2026
*************** scev_dfs::add_to_evolution (tree chrec_b
*** 880,888 ****
      }
  
    if (code == MINUS_EXPR)
!     to_add = chrec_fold_multiply (type, to_add, SCALAR_FLOAT_TYPE_P (type)
! 				  ? build_real (type, dconstm1)
! 				  : build_int_cst_type (type, -1));
  
    res = add_to_evolution_1 (chrec_before, to_add, at_stmt);
  
--- 880,902 ----
      }
  
    if (code == MINUS_EXPR)
!     {
!       if (INTEGRAL_TYPE_P (type)
! 	  && TYPE_OVERFLOW_UNDEFINED (type)
! 	  && !expr_not_equal_to (to_add,
! 				 wi::to_wide (TYPE_MIN_VALUE (type))))
! 	{
! 	  tree utype = unsigned_type_for (type);
! 	  to_add = chrec_convert_rhs (utype, to_add);
! 	  to_add = chrec_fold_multiply (utype, to_add,
! 					build_int_cst_type (utype, -1));
! 	  to_add = chrec_convert_rhs (type, to_add);
! 	}
!       else
! 	to_add = chrec_fold_multiply (type, to_add, SCALAR_FLOAT_TYPE_P (type)
! 				      ? build_real (type, dconstm1)
! 				      : build_int_cst_type (type, -1));
!     }
  
    res = add_to_evolution_1 (chrec_before, to_add, at_stmt);
  
diff -Nrcpad gcc-16-20260315/gcc/tree-ssa-pre.cc gcc-16-20260322/gcc/tree-ssa-pre.cc
*** gcc-16-20260315/gcc/tree-ssa-pre.cc	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/gcc/tree-ssa-pre.cc	Sun Mar 22 22:32:13 2026
*************** pre_expr_d::equal (const pre_expr_d *e1,
*** 290,296 ****
        return vn_nary_op_eq (PRE_EXPR_NARY (e1), PRE_EXPR_NARY (e2));
      case REFERENCE:
        return vn_reference_eq (PRE_EXPR_REFERENCE (e1),
! 			      PRE_EXPR_REFERENCE (e2));
      default:
        gcc_unreachable ();
      }
--- 290,296 ----
        return vn_nary_op_eq (PRE_EXPR_NARY (e1), PRE_EXPR_NARY (e2));
      case REFERENCE:
        return vn_reference_eq (PRE_EXPR_REFERENCE (e1),
! 			      PRE_EXPR_REFERENCE (e2), true);
      default:
        gcc_unreachable ();
      }
*************** get_or_alloc_expr_for_nary (vn_nary_op_t
*** 452,462 ****
    return result;
  }
  
! /* Given an REFERENCE, get or create a pre_expr to represent it.  */
  
  static pre_expr
  get_or_alloc_expr_for_reference (vn_reference_t reference,
! 				 location_t loc = UNKNOWN_LOCATION)
  {
    struct pre_expr_d expr;
    pre_expr result;
--- 452,468 ----
    return result;
  }
  
! /* Given an REFERENCE, get or create a pre_expr to represent it.  Assign
!    VALUE_ID to it or allocate a new value-id if it is zero.  Record
!    LOC as the original location of the expression.  If MOVE_OPERANDS
!    is true then ownership of REFERENCE->operands is transfered, otherwise
!    a copy is made if necessary.  */
  
  static pre_expr
  get_or_alloc_expr_for_reference (vn_reference_t reference,
! 				 unsigned value_id,
! 				 location_t loc = UNKNOWN_LOCATION,
! 				 bool move_operands = false)
  {
    struct pre_expr_d expr;
    pre_expr result;
*************** get_or_alloc_expr_for_reference (vn_refe
*** 467,479 ****
    PRE_EXPR_REFERENCE (&expr) = reference;
    result_id = lookup_expression_id (&expr);
    if (result_id != 0)
!     return expression_for_id (result_id);
  
    result = pre_expr_pool.allocate ();
    result->kind = REFERENCE;
    result->loc = loc;
!   result->value_id = reference->value_id;
!   PRE_EXPR_REFERENCE (result) = reference;
    alloc_expression_id (result);
    return result;
  }
--- 473,493 ----
    PRE_EXPR_REFERENCE (&expr) = reference;
    result_id = lookup_expression_id (&expr);
    if (result_id != 0)
!     {
!       if (move_operands)
! 	reference->operands.release ();
!       return expression_for_id (result_id);
!     }
  
    result = pre_expr_pool.allocate ();
    result->kind = REFERENCE;
    result->loc = loc;
!   result->value_id = value_id ? value_id : get_next_value_id ();
!   vn_reference_t ref = XOBNEW (&pre_expr_obstack, struct vn_reference_s);
!   *ref = *reference;
!   if (!move_operands)
!     ref->operands = ref->operands.copy ();
!   PRE_EXPR_REFERENCE (result) = ref;
    alloc_expression_id (result);
    return result;
  }
*************** bitmap_set_free (bitmap_set_t set)
*** 802,817 ****
    bitmap_clear (&set->values);
  }
  
  static void
! pre_expr_DFS (pre_expr expr, bitmap_set_t set, bitmap val_visited,
! 	      vec<pre_expr> &post);
  
  /* DFS walk leaders of VAL to their operands with leaders in SET, collecting
     expressions in SET in postorder into POST.  */
  
  static void
! pre_expr_DFS (unsigned val, bitmap_set_t set, bitmap val_visited,
! 	      vec<pre_expr> &post)
  {
    unsigned int i;
    bitmap_iterator bi;
--- 816,910 ----
    bitmap_clear (&set->values);
  }
  
+ 
+ /* Sort pre_expr after their value-id.  */
+ 
+ static int
+ expr_cmp (const void *a_, const void *b_, void *)
+ {
+   pre_expr a = *(pre_expr const *) a_;
+   pre_expr b = *(pre_expr const *) b_;
+   return a->value_id - b->value_id;
+ }
+ 
+ /* Return an expression that is a valid representation to insert for
+    both A and B reaching expressions.  Return NULL if neither works,
+    in this case all expressions of the value will be elided.  */
+ 
+ static pre_expr
+ prefer (pre_expr a, pre_expr b)
+ {
+   if (a->kind == REFERENCE && b->kind == REFERENCE)
+     {
+       auto &oprsa = PRE_EXPR_REFERENCE (a)->operands;
+       auto &oprsb = PRE_EXPR_REFERENCE (b)->operands;
+       if (oprsa.length () > 1 && oprsb.length () > 1)
+ 	{
+ 	  vn_reference_op_t vroa = &oprsa[oprsa.length () - 2];
+ 	  vn_reference_op_t vrob = &oprsb[oprsb.length () - 2];
+ 	  if (vroa->opcode == MEM_REF && vrob->opcode == MEM_REF)
+ 	    {
+ 	      pre_expr palign = NULL, psize = NULL;
+ 	      /* We have to canonicalize to the more conservative alignment.
+ 		 gcc.dg/torture/pr65270-?.c.*/
+ 	      if (TYPE_ALIGN (vroa->type) < TYPE_ALIGN (vrob->type))
+ 		palign = a;
+ 	      else if (TYPE_ALIGN (vroa->type) > TYPE_ALIGN (vrob->type))
+ 		palign = b;
+ 	      /* We have to canonicalize to the more conservative (smaller)
+ 		 innermost object access size.  gcc.dg/torture/pr110799.c.  */
+ 	      if (TYPE_SIZE (vroa->type) != TYPE_SIZE (vrob->type))
+ 		{
+ 		  if (!TYPE_SIZE (vroa->type))
+ 		    psize = a;
+ 		  else if (!TYPE_SIZE (vrob->type))
+ 		    psize = b;
+ 		  else if (TREE_CODE (TYPE_SIZE (vroa->type)) == INTEGER_CST
+ 			   && TREE_CODE (TYPE_SIZE (vrob->type)) == INTEGER_CST)
+ 		    {
+ 		      int cmp = tree_int_cst_compare (TYPE_SIZE (vroa->type),
+ 						      TYPE_SIZE (vrob->type));
+ 		      if (cmp < 0)
+ 			psize = a;
+ 		      else if (cmp > 0)
+ 			psize = b;
+ 		    }
+ 		  /* ???  What about non-constant sizes?  */
+ 		}
+ 	      if (palign && psize)
+ 		return NULL;
+ 	      /* Note we cannot leave it undecided because when having
+ 		 more than two expressions we have to keep doing
+ 		 pariwise reduction.  */
+ 	      return palign ? palign : (psize ? psize : b);
+ 	    }
+ 	}
+     }
+   /* Always prefer an non-REFERENCE, avoiding the above mess.  */
+   else if (a->kind == REFERENCE)
+     return b;
+   else if (b->kind == REFERENCE)
+     return a;
+   else if (a->kind == b->kind)
+     ;
+   /* And prefer NAME over anything else.  */
+   else if (b->kind == NAME)
+     return b;
+   else if (a->kind == NAME)
+     return a;
+   return b;
+ }
+ 
  static void
! pre_expr_DFS (pre_expr expr, bitmap_set_t set, bitmap exclusions,
! 	      bitmap val_visited, vec<pre_expr> &post);
  
  /* DFS walk leaders of VAL to their operands with leaders in SET, collecting
     expressions in SET in postorder into POST.  */
  
  static void
! pre_expr_DFS (unsigned val, bitmap_set_t set, bitmap exclusions,
! 	      bitmap val_visited, vec<pre_expr> &post)
  {
    unsigned int i;
    bitmap_iterator bi;
*************** pre_expr_DFS (unsigned val, bitmap_set_t
*** 822,842 ****
    if (!exprset->first->next)
      {
        EXECUTE_IF_SET_IN_BITMAP (exprset, 0, i, bi)
! 	if (bitmap_bit_p (&set->expressions, i))
! 	  pre_expr_DFS (expression_for_id (i), set, val_visited, post);
        return;
      }
  
    EXECUTE_IF_AND_IN_BITMAP (exprset, &set->expressions, 0, i, bi)
!     pre_expr_DFS (expression_for_id (i), set, val_visited, post);
  }
  
  /* DFS walk EXPR to its operands with leaders in SET, collecting
     expressions in SET in postorder into POST.  */
  
  static void
! pre_expr_DFS (pre_expr expr, bitmap_set_t set, bitmap val_visited,
! 	      vec<pre_expr> &post)
  {
    switch (expr->kind)
      {
--- 915,939 ----
    if (!exprset->first->next)
      {
        EXECUTE_IF_SET_IN_BITMAP (exprset, 0, i, bi)
! 	if (bitmap_bit_p (&set->expressions, i)
! 	    && !bitmap_bit_p (exclusions, i))
! 	  pre_expr_DFS (expression_for_id (i), set, exclusions,
! 			val_visited, post);
        return;
      }
  
    EXECUTE_IF_AND_IN_BITMAP (exprset, &set->expressions, 0, i, bi)
!     if (!bitmap_bit_p (exclusions, i))
!       pre_expr_DFS (expression_for_id (i), set, exclusions,
! 		    val_visited, post);
  }
  
  /* DFS walk EXPR to its operands with leaders in SET, collecting
     expressions in SET in postorder into POST.  */
  
  static void
! pre_expr_DFS (pre_expr expr, bitmap_set_t set, bitmap exclusions,
! 	      bitmap val_visited, vec<pre_expr> &post)
  {
    switch (expr->kind)
      {
*************** pre_expr_DFS (pre_expr expr, bitmap_set_
*** 852,858 ****
  	       recursed already.  Avoid the costly bitmap_find_leader.  */
  	    if (bitmap_bit_p (&set->values, op_val_id)
  		&& bitmap_set_bit (val_visited, op_val_id))
! 	      pre_expr_DFS (op_val_id, set, val_visited, post);
  	  }
  	break;
        }
--- 949,955 ----
  	       recursed already.  Avoid the costly bitmap_find_leader.  */
  	    if (bitmap_bit_p (&set->values, op_val_id)
  		&& bitmap_set_bit (val_visited, op_val_id))
! 	      pre_expr_DFS (op_val_id, set, exclusions, val_visited, post);
  	  }
  	break;
        }
*************** pre_expr_DFS (pre_expr expr, bitmap_set_
*** 874,880 ****
  		unsigned op_val_id = VN_INFO (op[n])->value_id;
  		if (bitmap_bit_p (&set->values, op_val_id)
  		    && bitmap_set_bit (val_visited, op_val_id))
! 		  pre_expr_DFS (op_val_id, set, val_visited, post);
  	      }
  	  }
  	break;
--- 971,977 ----
  		unsigned op_val_id = VN_INFO (op[n])->value_id;
  		if (bitmap_bit_p (&set->values, op_val_id)
  		    && bitmap_set_bit (val_visited, op_val_id))
! 		  pre_expr_DFS (op_val_id, set, exclusions, val_visited, post);
  	      }
  	  }
  	break;
*************** pre_expr_DFS (pre_expr expr, bitmap_set_
*** 884,906 ****
    post.quick_push (expr);
  }
  
! /* Generate an topological-ordered array of bitmap set SET.  */
  
  static vec<pre_expr>
! sorted_array_from_bitmap_set (bitmap_set_t set)
  {
    unsigned int i;
    bitmap_iterator bi;
    vec<pre_expr> result;
  
    /* Pre-allocate enough space for the array.  */
!   result.create (bitmap_count_bits (&set->expressions));
  
    auto_bitmap val_visited (&grand_bitmap_obstack);
    bitmap_tree_view (val_visited);
    FOR_EACH_VALUE_ID_IN_SET (set, i, bi)
      if (bitmap_set_bit (val_visited, i))
!       pre_expr_DFS (i, set, val_visited, result);
  
    return result;
  }
--- 981,1051 ----
    post.quick_push (expr);
  }
  
! /* Generate an topological-ordered array of bitmap set SET.  If FOR_INSERTION
!    is true then perform canonexpr on the set.  */
  
  static vec<pre_expr>
! sorted_array_from_bitmap_set (bitmap_set_t set, bool for_insertion)
  {
    unsigned int i;
    bitmap_iterator bi;
    vec<pre_expr> result;
  
    /* Pre-allocate enough space for the array.  */
!   unsigned cnt = bitmap_count_bits (&set->expressions);
!   result.create (cnt);
! 
!   /* For expressions with the same value from EXPRESSIONS retain only
!      expressions that can be inserted in place of all others.  */
!   auto_bitmap exclusions;
!   bitmap_tree_view (exclusions);
!   if (for_insertion && cnt > 1)
!     {
!       EXECUTE_IF_SET_IN_BITMAP (&set->expressions, 0, i, bi)
! 	result.safe_push (expression_for_id (i));
!       result.sort (expr_cmp, NULL);
!       for (unsigned i = 0; i < result.length () - 1; ++i)
! 	if (result[i]->value_id == result[i+1]->value_id)
! 	  {
! 	    if (pre_expr p = prefer (result[i], result[i+1]))
! 	      {
! 		/* We retain and iterate on exprs[i+1], if we want to
! 		   retain exprs[i], swap both.  */
! 		if (p == result[i])
! 		  std::swap (result[i], result[i+1]);
! 		bitmap_set_bit (exclusions, get_expression_id (result[i]));
! 	      }
! 	    else
! 	      {
! 		/* If neither works for pairwise chosing a conservative
! 		   alternative, drop all REFERENCE expressions for this value.
! 		   REFERENCE are always toplevel, so no chain should be
! 		   interrupted by pruning them.  */
! 		unsigned j, k;
! 		for (j = i;; --j)
! 		  if (j == 0
! 		      || result[j - 1]->value_id != result[i]->value_id)
! 		    break;
! 		for (k = j;; ++k)
! 		  {
! 		    if (k == result.length () - 1
! 			|| result[k + 1]->value_id != result[i]->value_id)
! 		      break;
! 		    if (result[k]->kind == REFERENCE)
! 		      bitmap_set_bit (exclusions,
! 				      get_expression_id (result[k]));
! 		  }
! 		i = k;
! 	      }
! 	  }
!       result.truncate (0);
!     }
  
    auto_bitmap val_visited (&grand_bitmap_obstack);
    bitmap_tree_view (val_visited);
    FOR_EACH_VALUE_ID_IN_SET (set, i, bi)
      if (bitmap_set_bit (val_visited, i))
!       pre_expr_DFS (i, set, exclusions, val_visited, result);
  
    return result;
  }
*************** phi_translate_1 (bitmap_set_t dest,
*** 1589,1596 ****
  						      newoperands.exists ()
  						      ? newoperands : operands,
  						      &newref, VN_WALK);
- 	    if (result)
- 	      newoperands.release ();
  
  	    /* We can always insert constants, so if we have a partial
  	       redundant constant load of another type try to translate it
--- 1734,1739 ----
*************** phi_translate_1 (bitmap_set_t dest,
*** 1605,1611 ****
  		      tem = NULL_TREE;
  		  }
  		if (tem)
! 		  return get_or_alloc_expr_for_constant (tem);
  	      }
  
  	    /* If we'd have to convert things we would need to validate
--- 1748,1757 ----
  		      tem = NULL_TREE;
  		  }
  		if (tem)
! 		  {
! 		    newoperands.release ();
! 		    return get_or_alloc_expr_for_constant (tem);
! 		  }
  	      }
  
  	    /* If we'd have to convert things we would need to validate
*************** phi_translate_1 (bitmap_set_t dest,
*** 1614,1620 ****
  	       type in the VN tables either, as that would assert.  */
  	    if (result
  		&& !useless_type_conversion_p (ref->type, TREE_TYPE (result)))
! 	      return NULL;
  	    else if (!result && newref
  		     && !useless_type_conversion_p (ref->type, newref->type))
  	      {
--- 1760,1769 ----
  	       type in the VN tables either, as that would assert.  */
  	    if (result
  		&& !useless_type_conversion_p (ref->type, TREE_TYPE (result)))
! 	      {
! 		newoperands.release ();
! 		return NULL;
! 	      }
  	    else if (!result && newref
  		     && !useless_type_conversion_p (ref->type, newref->type))
  	      {
*************** phi_translate_1 (bitmap_set_t dest,
*** 1627,1646 ****
  	    else
  	      {
  		if (changed || !same_valid)
! 		  new_val_id = get_next_value_id ();
  		else
  		  new_val_id = ref->value_id;
- 		if (!newoperands.exists ())
- 		  newoperands = operands.copy ();
- 		newref = vn_reference_insert_pieces (newvuse, ref->set,
- 						     ref->base_set,
- 						     ref->offset, ref->max_size,
- 						     ref->type, newoperands,
- 						     result, new_val_id);
- 		newoperands = vNULL;
  	      }
! 	    expr = get_or_alloc_expr_for_reference (newref, expr_loc);
! 	    add_to_value (new_val_id, expr);
  	  }
  	newoperands.release ();
  	return expr;
--- 1776,1800 ----
  	    else
  	      {
  		if (changed || !same_valid)
! 		  new_val_id = 0;
  		else
  		  new_val_id = ref->value_id;
  	      }
! 	    newref = XALLOCAVAR (struct vn_reference_s,
! 				 sizeof (vn_reference_s));
! 	    memcpy (newref, ref, sizeof (vn_reference_s));
! 	    newref->next = NULL;
! 	    newref->value_id = new_val_id;
! 	    newref->vuse = newvuse;
! 	    newref->operands
! 	      = newoperands.exists () ? newoperands : operands.copy ();
! 	    newoperands = vNULL;
! 	    newref->type = ref->type;
! 	    newref->result = result;
! 	    newref->hashcode = vn_reference_compute_hash (newref);
! 	    expr = get_or_alloc_expr_for_reference (newref, new_val_id,
! 						    expr_loc, true);
! 	    add_to_value (get_expr_value_id (expr), expr);
  	  }
  	newoperands.release ();
  	return expr;
*************** valid_in_sets (bitmap_set_t set1, bitmap
*** 1946,1952 ****
  static void
  clean (bitmap_set_t set1, bitmap_set_t set2 = NULL)
  {
!   vec<pre_expr> exprs = sorted_array_from_bitmap_set (set1);
    pre_expr expr;
    int i;
  
--- 2100,2106 ----
  static void
  clean (bitmap_set_t set1, bitmap_set_t set2 = NULL)
  {
!   vec<pre_expr> exprs = sorted_array_from_bitmap_set (set1, false);
    pre_expr expr;
    int i;
  
*************** do_hoist_insertion (basic_block block)
*** 3694,3700 ****
    hoistable_set.expressions = ANTIC_OUT->expressions;
  
    /* Now finally construct the topological-ordered expression set.  */
!   vec<pre_expr> exprs = sorted_array_from_bitmap_set (&hoistable_set);
  
    /* If there are candidate values for hoisting, insert expressions
       strategically to make the hoistable expressions fully redundant.  */
--- 3848,3854 ----
    hoistable_set.expressions = ANTIC_OUT->expressions;
  
    /* Now finally construct the topological-ordered expression set.  */
!   vec<pre_expr> exprs = sorted_array_from_bitmap_set (&hoistable_set, true);
  
    /* If there are candidate values for hoisting, insert expressions
       strategically to make the hoistable expressions fully redundant.  */
*************** insert (void)
*** 3844,3857 ****
  	      if (flag_tree_pre && !single_pred_p (block))
  		{
  		  vec<pre_expr> exprs
! 		    = sorted_array_from_bitmap_set (ANTIC_IN (block));
  		  /* Sorting is not perfect, iterate locally.  */
  		  while (do_pre_regular_insertion (block, dom, exprs))
  		    ;
  		  exprs.release ();
  		  if (do_partial_partial)
  		    {
! 		      exprs = sorted_array_from_bitmap_set (PA_IN (block));
  		      while (do_pre_partial_partial_insertion (block, dom,
  							       exprs))
  			;
--- 3998,4012 ----
  	      if (flag_tree_pre && !single_pred_p (block))
  		{
  		  vec<pre_expr> exprs
! 		    = sorted_array_from_bitmap_set (ANTIC_IN (block), true);
  		  /* Sorting is not perfect, iterate locally.  */
  		  while (do_pre_regular_insertion (block, dom, exprs))
  		    ;
  		  exprs.release ();
  		  if (do_partial_partial)
  		    {
! 		      exprs = sorted_array_from_bitmap_set (PA_IN (block),
! 							    true);
  		      while (do_pre_partial_partial_insertion (block, dom,
  							       exprs))
  			;
*************** compute_avail (function *fun)
*** 4089,4095 ****
  			|| !vn_reference_may_trap (ref)))
  		  {
  		    result = get_or_alloc_expr_for_reference
! 			       (ref, gimple_location (stmt));
  		    add_to_value (get_expr_value_id (result), result);
  		    bitmap_value_insert_into_set (EXP_GEN (block), result);
  		  }
--- 4244,4250 ----
  			|| !vn_reference_may_trap (ref)))
  		  {
  		    result = get_or_alloc_expr_for_reference
! 			       (ref, ref->value_id, gimple_location (stmt));
  		    add_to_value (get_expr_value_id (result), result);
  		    bitmap_value_insert_into_set (EXP_GEN (block), result);
  		  }
*************** compute_avail (function *fun)
*** 4141,4146 ****
--- 4296,4306 ----
  		  case VN_REFERENCE:
  		    {
  		      tree rhs1 = gimple_assign_rhs1 (stmt);
+ 		      /* There is no point in trying to handle aggregates,
+ 			 even when via punning we might get a value number
+ 			 corresponding to a register typed load.  */
+ 		      if (!is_gimple_reg_type (TREE_TYPE (rhs1)))
+ 			continue;
  		      ao_ref rhs1_ref;
  		      ao_ref_init (&rhs1_ref, rhs1);
  		      alias_set_type set = ao_ref_alias_set (&rhs1_ref);
*************** compute_avail (function *fun)
*** 4179,4199 ****
  		      vn_reference_lookup_pieces (gimple_vuse (stmt), set,
  						  base_set, TREE_TYPE (rhs1),
  						  operands, &ref, VN_WALK);
! 		      if (!ref)
  			{
  			  operands.release ();
  			  continue;
  			}
  
  		      /* If the REFERENCE traps and there was a preceding
  		         point in the block that might not return avoid
  			 adding the reference to EXP_GEN.  */
  		      if (BB_MAY_NOTRETURN (block)
! 			  && vn_reference_may_trap (ref))
! 			{
! 			  operands.release ();
! 			  continue;
! 			}
  
  		      /* If the value of the reference is not invalidated in
  			 this block until it is computed, add the expression
--- 4339,4362 ----
  		      vn_reference_lookup_pieces (gimple_vuse (stmt), set,
  						  base_set, TREE_TYPE (rhs1),
  						  operands, &ref, VN_WALK);
! 		      /* When there is no value recorded or the value was
! 			 recorded for a different type, fail, similar as
! 			 how we do during PHI translation.  */
! 		      if (!ref
! 			  || !useless_type_conversion_p (TREE_TYPE (rhs1),
! 							 ref->type))
  			{
  			  operands.release ();
  			  continue;
  			}
+ 		      operands.release ();
  
  		      /* If the REFERENCE traps and there was a preceding
  		         point in the block that might not return avoid
  			 adding the reference to EXP_GEN.  */
  		      if (BB_MAY_NOTRETURN (block)
! 			  && gimple_could_trap_p_1 (stmt, true, false))
! 			continue;
  
  		      /* If the value of the reference is not invalidated in
  			 this block until it is computed, add the expression
*************** compute_avail (function *fun)
*** 4217,4319 ****
  				= SSA_NAME_DEF_STMT (gimple_vuse (def_stmt));
  			    }
  			  if (!ok)
! 			    {
! 			      operands.release ();
! 			      continue;
! 			    }
  			}
  
! 		      /* If the load was value-numbered to another
! 			 load make sure we do not use its expression
! 			 for insertion if it wouldn't be a valid
! 			 replacement.  */
! 		      /* At the momemt we have a testcase
! 			 for hoist insertion of aligned vs. misaligned
! 			 variants in gcc.dg/torture/pr65270-1.c thus
! 			 with just alignment to be considered we can
! 			 simply replace the expression in the hashtable
! 			 with the most conservative one.  */
! 		      vn_reference_op_t ref1 = &ref->operands.last ();
! 		      while (ref1->opcode != TARGET_MEM_REF
! 			     && ref1->opcode != MEM_REF
! 			     && ref1 != &ref->operands[0])
! 			--ref1;
! 		      vn_reference_op_t ref2 = &operands.last ();
! 		      while (ref2->opcode != TARGET_MEM_REF
! 			     && ref2->opcode != MEM_REF
! 			     && ref2 != &operands[0])
! 			--ref2;
! 		      if ((ref1->opcode == TARGET_MEM_REF
! 			   || ref1->opcode == MEM_REF)
! 			  && (TYPE_ALIGN (ref1->type)
! 			      > TYPE_ALIGN (ref2->type)))
! 			ref1->type
! 			  = build_aligned_type (ref1->type,
! 						TYPE_ALIGN (ref2->type));
! 		      /* TBAA behavior is an obvious part so make sure
! 		         that the hashtable one covers this as well
! 			 by adjusting the ref alias set and its base.  */
! 		      if ((ref->set == set
! 			   || alias_set_subset_of (set, ref->set))
! 			  && (ref->base_set == base_set
! 			      || alias_set_subset_of (base_set, ref->base_set)))
! 			;
! 		      else if (ref1->opcode != ref2->opcode
! 			       || (ref1->opcode != MEM_REF
! 				   && ref1->opcode != TARGET_MEM_REF))
! 			{
! 			  /* With mismatching base opcodes or bases
! 			     other than MEM_REF or TARGET_MEM_REF we
! 			     can't do any easy TBAA adjustment.  */
! 			  operands.release ();
! 			  continue;
! 			}
! 		      else if (ref->set == set
! 			       || alias_set_subset_of (ref->set, set))
! 			{
! 			  tree reft = reference_alias_ptr_type (rhs1);
! 			  ref->set = set;
! 			  ref->base_set = set;
! 			  if (ref1->opcode == MEM_REF)
! 			    ref1->op0
! 			      = wide_int_to_tree (reft,
! 						  wi::to_wide (ref1->op0));
! 			  else
! 			    ref1->op2
! 			      = wide_int_to_tree (reft,
! 						  wi::to_wide (ref1->op2));
! 			}
! 		      else
! 			{
! 			  ref->set = 0;
! 			  ref->base_set = 0;
! 			  if (ref1->opcode == MEM_REF)
! 			    ref1->op0
! 			      = wide_int_to_tree (ptr_type_node,
! 						  wi::to_wide (ref1->op0));
! 			  else
! 			    ref1->op2
! 			      = wide_int_to_tree (ptr_type_node,
! 						  wi::to_wide (ref1->op2));
! 			}
! 		      /* We also need to make sure that the access path
! 			 ends in an access of the same size as otherwise
! 			 we might assume an access may not trap while in
! 			 fact it might.  That's independent of whether
! 			 TBAA is in effect.  */
! 		      if (TYPE_SIZE (ref1->type) != TYPE_SIZE (ref2->type)
! 			  && (! TYPE_SIZE (ref1->type)
! 			      || ! TYPE_SIZE (ref2->type)
! 			      || ! operand_equal_p (TYPE_SIZE (ref1->type),
! 						    TYPE_SIZE (ref2->type))))
! 			{
! 			  operands.release ();
! 			  continue;
! 			}
! 		      operands.release ();
  
  		      result = get_or_alloc_expr_for_reference
! 				 (ref, gimple_location (stmt));
  		      break;
  		    }
  
--- 4380,4408 ----
  				= SSA_NAME_DEF_STMT (gimple_vuse (def_stmt));
  			    }
  			  if (!ok)
! 			    continue;
  			}
  
! 		      /* Record the un-valueized expression for EXP_GEN.  */
! 		      copy_reference_ops_from_ref (rhs1, &operands);
! 		      vn_reference_t newref
! 			= XALLOCAVAR (struct vn_reference_s,
! 				      sizeof (vn_reference_s));
! 		      memset (newref, 0, sizeof (vn_reference_s));
! 		      newref->value_id = ref->value_id;
! 		      newref->vuse = gimple_vuse (stmt);
! 		      newref->operands = operands;
! 		      newref->type = TREE_TYPE (rhs1);
! 		      newref->set = set;
! 		      newref->base_set = base_set;
! 		      newref->offset = 0;
! 		      newref->max_size = -1;
! 		      newref->result = ref->result;
! 		      newref->hashcode = vn_reference_compute_hash (newref);
  
  		      result = get_or_alloc_expr_for_reference
! 				 (newref, newref->value_id,
! 				  gimple_location (stmt), true);
  		      break;
  		    }
  
*************** fini_pre ()
*** 4406,4411 ****
--- 4495,4503 ----
  {
    value_expressions.release ();
    constant_value_expressions.release ();
+   for (unsigned i = 1; i < expressions.length (); ++i)
+     if (expressions[i]->kind == REFERENCE)
+       PRE_EXPR_REFERENCE (expressions[i])->operands.release ();
    expressions.release ();
    bitmap_obstack_release (&grand_bitmap_obstack);
    bitmap_set_pool.release ();
diff -Nrcpad gcc-16-20260315/gcc/tree-ssa-sccvn.cc gcc-16-20260322/gcc/tree-ssa-sccvn.cc
*** gcc-16-20260315/gcc/tree-ssa-sccvn.cc	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/gcc/tree-ssa-sccvn.cc	Sun Mar 22 22:32:13 2026
*************** print_vn_reference_ops (FILE *outfile, c
*** 280,291 ****
  	      closebrace = true;
  	    }
  	}
        if (vro->op0 || vro->opcode == CALL_EXPR)
  	{
  	  if (!vro->op0)
  	    fprintf (outfile, internal_fn_name ((internal_fn)vro->clique));
  	  else
! 	    print_generic_expr (outfile, vro->op0);
  	  if (vro->op1)
  	    {
  	      fprintf (outfile, ",");
--- 280,301 ----
  	      closebrace = true;
  	    }
  	}
+       if (vro->opcode == MEM_REF || vro->opcode == TARGET_MEM_REF)
+ 	fprintf (outfile, "(A%d)", TYPE_ALIGN (vro->type));
        if (vro->op0 || vro->opcode == CALL_EXPR)
  	{
  	  if (!vro->op0)
  	    fprintf (outfile, internal_fn_name ((internal_fn)vro->clique));
  	  else
! 	    {
! 	      if (vro->opcode == MEM_REF || vro->opcode == TARGET_MEM_REF)
! 		{
! 		  fprintf (outfile, "(");
! 		  print_generic_expr (outfile, TREE_TYPE (vro->op0));
! 		  fprintf (outfile, ")");
! 		}
! 	      print_generic_expr (outfile, vro->op0);
! 	    }
  	  if (vro->op1)
  	    {
  	      fprintf (outfile, ",");
*************** vn_reference_op_compute_hash (const vn_r
*** 711,717 ****
  
  /* Compute a hash for the reference operation VR1 and return it.  */
  
! static hashval_t
  vn_reference_compute_hash (const vn_reference_t vr1)
  {
    inchash::hash hstate;
--- 721,727 ----
  
  /* Compute a hash for the reference operation VR1 and return it.  */
  
! hashval_t
  vn_reference_compute_hash (const vn_reference_t vr1)
  {
    inchash::hash hstate;
*************** vn_reference_compute_hash (const vn_refe
*** 764,773 ****
  }
  
  /* Return true if reference operations VR1 and VR2 are equivalent.  This
!    means they have the same set of operands and vuses.  */
  
  bool
! vn_reference_eq (const_vn_reference_t const vr1, const_vn_reference_t const vr2)
  {
    unsigned i, j;
  
--- 774,785 ----
  }
  
  /* Return true if reference operations VR1 and VR2 are equivalent.  This
!    means they have the same set of operands and vuses.  If LEXICAL
!    is true then the full access path has to be the same.  */
  
  bool
! vn_reference_eq (const_vn_reference_t const vr1, const_vn_reference_t const vr2,
! 		 bool lexical)
  {
    unsigned i, j;
  
*************** vn_reference_eq (const_vn_reference_t co
*** 864,870 ****
  	  else if (vro1->opcode == VIEW_CONVERT_EXPR && vro1->reverse)
  	    return false;
  	  reverse1 |= vro1->reverse;
! 	  if (known_eq (vro1->off, -1))
  	    break;
  	  off1 += vro1->off;
  	}
--- 876,882 ----
  	  else if (vro1->opcode == VIEW_CONVERT_EXPR && vro1->reverse)
  	    return false;
  	  reverse1 |= vro1->reverse;
! 	  if (lexical || known_eq (vro1->off, -1))
  	    break;
  	  off1 += vro1->off;
  	}
*************** vn_reference_eq (const_vn_reference_t co
*** 876,882 ****
  	  else if (vro2->opcode == VIEW_CONVERT_EXPR && vro2->reverse)
  	    return false;
  	  reverse2 |= vro2->reverse;
! 	  if (known_eq (vro2->off, -1))
  	    break;
  	  off2 += vro2->off;
  	}
--- 888,894 ----
  	  else if (vro2->opcode == VIEW_CONVERT_EXPR && vro2->reverse)
  	    return false;
  	  reverse2 |= vro2->reverse;
! 	  if (lexical || known_eq (vro2->off, -1))
  	    break;
  	  off2 += vro2->off;
  	}
*************** vn_reference_eq (const_vn_reference_t co
*** 904,909 ****
--- 916,942 ----
  	return false;
        if (!vn_reference_op_eq (vro1, vro2))
  	return false;
+       /* Both alignment and alias set are not relevant for the produced
+ 	 value but need to be included when doing lexical comparison.
+ 	 We also need to make sure that the access path ends in an
+ 	 access of the same size as otherwise we might assume an access
+ 	 may not trap while in fact it might.  */
+       if (lexical
+ 	  && (vro1->opcode == MEM_REF
+ 	      || vro1->opcode == TARGET_MEM_REF)
+ 	  && (TYPE_ALIGN (vro1->type) != TYPE_ALIGN (vro2->type)
+ 	      || (TYPE_SIZE (vro1->type) != TYPE_SIZE (vro2->type)
+ 		  && (! TYPE_SIZE (vro1->type)
+ 		      || ! TYPE_SIZE (vro2->type)
+ 		      || ! operand_equal_p (TYPE_SIZE (vro1->type),
+ 					    TYPE_SIZE (vro2->type))))
+ 	      || (get_deref_alias_set (vro1->opcode == MEM_REF
+ 				       ? TREE_TYPE (vro1->op0)
+ 				       : TREE_TYPE (vro1->op2))
+ 		  != get_deref_alias_set (vro2->opcode == MEM_REF
+ 					  ? TREE_TYPE (vro2->op0)
+ 					  : TREE_TYPE (vro2->op2)))))
+ 	return false;
        ++j;
        ++i;
      }
*************** vn_reference_eq (const_vn_reference_t co
*** 916,922 ****
  /* Copy the operations present in load/store REF into RESULT, a vector of
     vn_reference_op_s's.  */
  
! static void
  copy_reference_ops_from_ref (tree ref, vec<vn_reference_op_s> *result)
  {
    /* For non-calls, store the information that makes up the address.  */
--- 949,955 ----
  /* Copy the operations present in load/store REF into RESULT, a vector of
     vn_reference_op_s's.  */
  
! void
  copy_reference_ops_from_ref (tree ref, vec<vn_reference_op_s> *result)
  {
    /* For non-calls, store the information that makes up the address.  */
diff -Nrcpad gcc-16-20260315/gcc/tree-ssa-sccvn.h gcc-16-20260322/gcc/tree-ssa-sccvn.h
*** gcc-16-20260315/gcc/tree-ssa-sccvn.h	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/gcc/tree-ssa-sccvn.h	Sun Mar 22 22:32:13 2026
*************** vn_reference_t vn_reference_insert_piece
*** 274,286 ****
  					   poly_int64, poly_int64,
  					   tree, vec<vn_reference_op_s>,
  					   tree, unsigned int);
  void print_vn_reference_ops (FILE *, const vec<vn_reference_op_s>);
  
  bool vn_nary_op_eq (const_vn_nary_op_t const vno1,
  		    const_vn_nary_op_t const vno2);
  bool vn_nary_may_trap (vn_nary_op_t);
  bool vn_reference_may_trap (vn_reference_t);
! bool vn_reference_eq (const_vn_reference_t const, const_vn_reference_t const);
  
  unsigned int get_max_value_id (void);
  unsigned int get_max_constant_value_id (void);
--- 274,290 ----
  					   poly_int64, poly_int64,
  					   tree, vec<vn_reference_op_s>,
  					   tree, unsigned int);
+ void copy_reference_ops_from_ref (tree, vec<vn_reference_op_s> *);
+ hashval_t vn_reference_compute_hash (const vn_reference_t vr1);
+ 
  void print_vn_reference_ops (FILE *, const vec<vn_reference_op_s>);
  
  bool vn_nary_op_eq (const_vn_nary_op_t const vno1,
  		    const_vn_nary_op_t const vno2);
  bool vn_nary_may_trap (vn_nary_op_t);
  bool vn_reference_may_trap (vn_reference_t);
! bool vn_reference_eq (const_vn_reference_t const, const_vn_reference_t const,
! 		      bool = false);
  
  unsigned int get_max_value_id (void);
  unsigned int get_max_constant_value_id (void);
diff -Nrcpad gcc-16-20260315/gcc/tree-vect-loop.cc gcc-16-20260322/gcc/tree-vect-loop.cc
*** gcc-16-20260315/gcc/tree-vect-loop.cc	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/gcc/tree-vect-loop.cc	Sun Mar 22 22:32:13 2026
*************** _loop_vec_info::_loop_vec_info (class lo
*** 763,768 ****
--- 763,769 ----
      peeling_for_gaps (false),
      peeling_for_niter (false),
      early_breaks (false),
+     loop_iv_cond (NULL),
      user_unroll (false),
      no_data_dependencies (false),
      has_mask_store (false),
*************** vect_create_loop_vinfo (class loop *loop
*** 1693,1699 ****
  
    unsigned cond_id = 0;
    if (!LOOP_VINFO_NITERS_UNCOUNTED_P (loop_vinfo))
!       LOOP_VINFO_LOOP_IV_COND (loop_vinfo) = info->conds[cond_id++];
  
    for (; cond_id < info->conds.length (); cond_id ++)
      LOOP_VINFO_LOOP_CONDS (loop_vinfo).safe_push (info->conds[cond_id]);
--- 1694,1700 ----
  
    unsigned cond_id = 0;
    if (!LOOP_VINFO_NITERS_UNCOUNTED_P (loop_vinfo))
!     LOOP_VINFO_LOOP_IV_COND (loop_vinfo) = info->conds[cond_id++];
  
    for (; cond_id < info->conds.length (); cond_id ++)
      LOOP_VINFO_LOOP_CONDS (loop_vinfo).safe_push (info->conds[cond_id]);
diff -Nrcpad gcc-16-20260315/gcc/tree-vect-slp.cc gcc-16-20260322/gcc/tree-vect-slp.cc
*** gcc-16-20260315/gcc/tree-vect-slp.cc	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/gcc/tree-vect-slp.cc	Sun Mar 22 22:32:13 2026
*************** vect_analyze_slp (vec_info *vinfo, unsig
*** 5739,5745 ****
  				     slp_inst_kind_store, max_tree_size, &limit,
  				     force_single_lane)
  	&& loop_vinfo)
!       return opt_result::failure_at (vect_location, "SLP build failed.\n");
  
    /* For loops also start SLP discovery from non-grouped stores.  */
    if (loop_vinfo)
--- 5739,5748 ----
  				     slp_inst_kind_store, max_tree_size, &limit,
  				     force_single_lane)
  	&& loop_vinfo)
!       {
! 	release_scalar_stmts_to_slp_tree_map (bst_map);
! 	return opt_result::failure_at (vect_location, "SLP build failed.\n");
!       }
  
    /* For loops also start SLP discovery from non-grouped stores.  */
    if (loop_vinfo)
*************** vect_analyze_slp (vec_info *vinfo, unsig
*** 5760,5767 ****
  	    if (! vect_build_slp_instance (vinfo, slp_inst_kind_store,
  					   stmts, roots, remain, max_tree_size,
  					   &limit, bst_map, force_single_lane))
! 	      return opt_result::failure_at (vect_location,
! 					     "SLP build failed.\n");
  	  }
  
        stmt_vec_info stmt_info;
--- 5763,5773 ----
  	    if (! vect_build_slp_instance (vinfo, slp_inst_kind_store,
  					   stmts, roots, remain, max_tree_size,
  					   &limit, bst_map, force_single_lane))
! 	      {
! 		release_scalar_stmts_to_slp_tree_map (bst_map);
! 		return opt_result::failure_at (vect_location,
! 					       "SLP build failed.\n");
! 	      }
  	  }
  
        stmt_vec_info stmt_info;
*************** vect_analyze_slp (vec_info *vinfo, unsig
*** 5775,5782 ****
  	  if (! vect_build_slp_instance (vinfo, slp_inst_kind_store,
  					 stmts, roots, remain, max_tree_size,
  					 &limit, bst_map, force_single_lane))
! 	    return opt_result::failure_at (vect_location,
! 					   "SLP build failed.\n");
  	}
      }
  
--- 5781,5791 ----
  	  if (! vect_build_slp_instance (vinfo, slp_inst_kind_store,
  					 stmts, roots, remain, max_tree_size,
  					 &limit, bst_map, force_single_lane))
! 	    {
! 	      release_scalar_stmts_to_slp_tree_map (bst_map);
! 	      return opt_result::failure_at (vect_location,
! 					     "SLP build failed.\n");
! 	    }
  	}
      }
  
*************** vect_analyze_slp (vec_info *vinfo, unsig
*** 5807,5813 ****
        /* Find SLP sequences starting from groups of reductions.  */
        if (!vect_analyze_slp_reductions (loop_vinfo, max_tree_size, &limit,
  					bst_map, force_single_lane))
! 	return opt_result::failure_at (vect_location, "SLP build failed.\n");
  
        /* Make sure to vectorize only-live stmts, usually inductions.  */
        for (edge e : get_loop_exit_edges (LOOP_VINFO_LOOP (loop_vinfo)))
--- 5816,5825 ----
        /* Find SLP sequences starting from groups of reductions.  */
        if (!vect_analyze_slp_reductions (loop_vinfo, max_tree_size, &limit,
  					bst_map, force_single_lane))
! 	{
! 	  release_scalar_stmts_to_slp_tree_map (bst_map);
! 	  return opt_result::failure_at (vect_location, "SLP build failed.\n");
! 	}
  
        /* Make sure to vectorize only-live stmts, usually inductions.  */
        for (edge e : get_loop_exit_edges (LOOP_VINFO_LOOP (loop_vinfo)))
*************** vect_analyze_slp (vec_info *vinfo, unsig
*** 5836,5843 ****
  					       stmts, roots, remain,
  					       max_tree_size, &limit,
  					       bst_map, force_single_lane))
! 		  return opt_result::failure_at (vect_location,
! 						 "SLP build failed.\n");
  	      }
  	  }
  
--- 5848,5858 ----
  					       stmts, roots, remain,
  					       max_tree_size, &limit,
  					       bst_map, force_single_lane))
! 		  {
! 		    release_scalar_stmts_to_slp_tree_map (bst_map);
! 		    return opt_result::failure_at (vect_location,
! 						   "SLP build failed.\n");
! 		  }
  	      }
  	  }
  
*************** vect_analyze_slp (vec_info *vinfo, unsig
*** 5860,5865 ****
--- 5875,5881 ----
  	      || !integer_zerop (args1))
  	    {
  	      roots.release ();
+ 	      release_scalar_stmts_to_slp_tree_map (bst_map);
  	      return opt_result::failure_at (vect_location,
  					     "SLP build failed.\n");
  	    }
*************** vect_analyze_slp (vec_info *vinfo, unsig
*** 5881,5886 ****
--- 5897,5903 ----
  					 bst_map, force_single_lane))
  	    {
  	      roots.release ();
+ 	      release_scalar_stmts_to_slp_tree_map (bst_map);
  	      return opt_result::failure_at (vect_location,
  					     "SLP build failed.\n");
  	    }
diff -Nrcpad gcc-16-20260315/libcpp/ChangeLog gcc-16-20260322/libcpp/ChangeLog
*** gcc-16-20260315/libcpp/ChangeLog	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/libcpp/ChangeLog	Sun Mar 22 22:32:14 2026
***************
*** 1,3 ****
--- 1,9 ----
+ 2026-03-19  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/124466
+ 	* line-map.cc (linemap_location_from_module_p): Resolve loc in
+ 	case it's a macro location.
+ 
  2026-03-13  Jakub Jelinek  <jakub@redhat.com>
  
  	PR preprocessor/105412
diff -Nrcpad gcc-16-20260315/libcpp/line-map.cc gcc-16-20260322/libcpp/line-map.cc
*** gcc-16-20260315/libcpp/line-map.cc	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/libcpp/line-map.cc	Sun Mar 22 22:32:14 2026
*************** linemap_module_restore (line_maps *set,
*** 772,778 ****
  bool
  linemap_location_from_module_p (const line_maps *set, location_t loc)
  {
!   const line_map_ordinary *map = linemap_ordinary_map_lookup (set, loc);
    while (map && map->reason != LC_MODULE)
      map = linemap_included_from_linemap (set, map);
    return !!map;
--- 772,780 ----
  bool
  linemap_location_from_module_p (const line_maps *set, location_t loc)
  {
!   const line_map_ordinary *map = nullptr;
!   linemap_resolve_location (set, loc, LRK_SPELLING_LOCATION, &map);
! 
    while (map && map->reason != LC_MODULE)
      map = linemap_included_from_linemap (set, map);
    return !!map;
diff -Nrcpad gcc-16-20260315/libga68/ChangeLog gcc-16-20260322/libga68/ChangeLog
*** gcc-16-20260315/libga68/ChangeLog	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/libga68/ChangeLog	Sun Mar 22 22:32:14 2026
***************
*** 1,3 ****
--- 1,16 ----
+ 2026-03-21  Jose E. Marchesi  <jemarch@gnu.org>
+ 
+ 	* ga68-math.c: New file.
+ 	* floor.c: Imported from gnulib.
+ 	* configure.ac: Do not check for libm.
+ 	* Makefile.am (libga68_la_SOURCES): Add ga68-match.c.
+ 	* Makefile.in (am_libga68_la_OBJECTS): Regenerate.
+ 	* configure (ac_res): Likewise.
+ 
+ 2026-03-15  Jose E. Marchesi  <jemarch@gnu.org>
+ 
+ 	* ga68.map: Add public symbols from posix and standard preludes.
+ 
  2026-03-14  Jose E. Marchesi  <jemarch@gnu.org>
  
  	* standard.a68.in (float): Fix typo from RR and handle short* int
diff -Nrcpad gcc-16-20260315/libga68/Makefile.am gcc-16-20260322/libga68/Makefile.am
*** gcc-16-20260315/libga68/Makefile.am	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/libga68/Makefile.am	Sun Mar 22 22:32:14 2026
*************** libga68_la_SOURCES = libga68.c \
*** 129,134 ****
--- 129,135 ----
                       ga68-alloc.c \
                       ga68-error.c \
                       ga68-standenv.c \
+                      ga68-math.c \
                       ga68.h
  libga68_la_LIBTOOLFLAGS =
  libga68_la_CFLAGS = $(LIBGA68_GCFLAGS) $(LIBGA68_BOEHM_GC_INCLUDES)
diff -Nrcpad gcc-16-20260315/libga68/Makefile.in gcc-16-20260322/libga68/Makefile.in
*** gcc-16-20260315/libga68/Makefile.in	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/libga68/Makefile.in	Sun Mar 22 22:32:14 2026
*************** am__DEPENDENCIES_1 =
*** 173,179 ****
  am_libga68_la_OBJECTS = libga68_la-libga68.lo \
  	libga68_la-ga68-unistr.lo libga68_la-ga68-posix.lo \
  	libga68_la-ga68-alloc.lo libga68_la-ga68-error.lo \
! 	libga68_la-ga68-standenv.lo
  libga68_la_OBJECTS = $(am_libga68_la_OBJECTS)
  AM_V_lt = $(am__v_lt_@AM_V@)
  am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
--- 173,179 ----
  am_libga68_la_OBJECTS = libga68_la-libga68.lo \
  	libga68_la-ga68-unistr.lo libga68_la-ga68-posix.lo \
  	libga68_la-ga68-alloc.lo libga68_la-ga68-error.lo \
! 	libga68_la-ga68-standenv.lo libga68_la-ga68-math.lo
  libga68_la_OBJECTS = $(am_libga68_la_OBJECTS)
  AM_V_lt = $(am__v_lt_@AM_V@)
  am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
*************** libga68_la_SOURCES = libga68.c \
*** 468,473 ****
--- 468,474 ----
                       ga68-alloc.c \
                       ga68-error.c \
                       ga68-standenv.c \
+                      ga68-math.c \
                       ga68.h
  
  libga68_la_LIBTOOLFLAGS = 
*************** distclean-compile:
*** 592,597 ****
--- 593,599 ----
  
  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libga68_la-ga68-alloc.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libga68_la-ga68-error.Plo@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libga68_la-ga68-math.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libga68_la-ga68-posix.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libga68_la-ga68-standenv.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libga68_la-ga68-unistr.Plo@am__quote@
*************** libga68_la-ga68-standenv.lo: ga68-stande
*** 660,665 ****
--- 662,674 ----
  @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
  @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libga68_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libga68_la_CFLAGS) $(CFLAGS) -c -o libga68_la-ga68-standenv.lo `test -f 'ga68-standenv.c' || echo '$(srcdir)/'`ga68-standenv.c
  
+ libga68_la-ga68-math.lo: ga68-math.c
+ @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libga68_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libga68_la_CFLAGS) $(CFLAGS) -MT libga68_la-ga68-math.lo -MD -MP -MF $(DEPDIR)/libga68_la-ga68-math.Tpo -c -o libga68_la-ga68-math.lo `test -f 'ga68-math.c' || echo '$(srcdir)/'`ga68-math.c
+ @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libga68_la-ga68-math.Tpo $(DEPDIR)/libga68_la-ga68-math.Plo
+ @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ga68-math.c' object='libga68_la-ga68-math.lo' libtool=yes @AMDEPBACKSLASH@
+ @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libga68_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libga68_la_CFLAGS) $(CFLAGS) -c -o libga68_la-ga68-math.lo `test -f 'ga68-math.c' || echo '$(srcdir)/'`ga68-math.c
+ 
  mostlyclean-libtool:
  	-rm -f *.lo
  
diff -Nrcpad gcc-16-20260315/libga68/configure gcc-16-20260322/libga68/configure
*** gcc-16-20260315/libga68/configure	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/libga68/configure	Sun Mar 22 22:32:14 2026
*************** if test "$ac_res" != no; then :
*** 13320,13384 ****
  
  fi
  
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing cosf" >&5
- $as_echo_n "checking for library containing cosf... " >&6; }
- if ${ac_cv_search_cosf+:} false; then :
-   $as_echo_n "(cached) " >&6
- else
-   ac_func_search_save_LIBS=$LIBS
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
- /* end confdefs.h.  */
- 
- /* Override any GCC internal prototype to avoid an error.
-    Use char because int might match the return type of a GCC
-    builtin and then its argument prototype would still apply.  */
- #ifdef __cplusplus
- extern "C"
- #endif
- char cosf ();
- int
- main ()
- {
- return cosf ();
-   ;
-   return 0;
- }
- _ACEOF
- for ac_lib in '' m; do
-   if test -z "$ac_lib"; then
-     ac_res="none required"
-   else
-     ac_res=-l$ac_lib
-     LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
-   fi
-   if test x$gcc_no_link = xyes; then
-   as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
- fi
- if ac_fn_c_try_link "$LINENO"; then :
-   ac_cv_search_cosf=$ac_res
- fi
- rm -f core conftest.err conftest.$ac_objext \
-     conftest$ac_exeext
-   if ${ac_cv_search_cosf+:} false; then :
-   break
- fi
- done
- if ${ac_cv_search_cosf+:} false; then :
- 
- else
-   ac_cv_search_cosf=no
- fi
- rm conftest.$ac_ext
- LIBS=$ac_func_search_save_LIBS
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_cosf" >&5
- $as_echo "$ac_cv_search_cosf" >&6; }
- ac_res=$ac_cv_search_cosf
- if test "$ac_res" != no; then :
-   test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
- 
- fi
- 
  
  # Determine what GCC version number to use in filesystem paths.
  
--- 13320,13325 ----
diff -Nrcpad gcc-16-20260315/libga68/configure.ac gcc-16-20260322/libga68/configure.ac
*** gcc-16-20260315/libga68/configure.ac	Sun Mar 15 22:32:15 2026
--- gcc-16-20260322/libga68/configure.ac	Sun Mar 22 22:32:14 2026
*************** LIBGA68_CHECK_ATTRIBUTE_VISIBILITY
*** 175,181 ****
  
  # Search for needed functions in host libraries.
  AC_SEARCH_LIBS([malloc], [c])
- AC_SEARCH_LIBS([cosf], [m])
  
  # Determine what GCC version number to use in filesystem paths.
  GCC_BASE_VER
--- 175,180 ----
diff -Nrcpad gcc-16-20260315/libga68/floor.c gcc-16-20260322/libga68/floor.c
*** gcc-16-20260315/libga68/floor.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libga68/floor.c	Sun Mar 22 22:32:14 2026
***************
*** 0 ****
--- 1,115 ----
+ /* Round towards negative infinity.
+    Copyright (C) 2007, 2010-2026 Free Software Foundation, Inc.
+ 
+    Adapted from gnulib 0cca364da074782231685f955da2f0ce67d8c155.
+ 
+    GCC is free software; you can redistribute it and/or modify it under the
+    terms of the GNU General Public License as published by the Free Software
+    Foundation; either version 3, or (at your option) any later version.
+ 
+    GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+    FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+    details.
+ 
+    Under Section 7 of GPL version 3, you are granted additional permissions
+    described in the GCC Runtime Library Exception, version 3.1, as published by
+    the Free Software Foundation.
+ 
+    You should have received a copy of the GNU General Public License and a copy
+    of the GCC Runtime Library Exception along with this program; see the files
+    COPYING3 and COPYING.RUNTIME respectively.  If not, see
+    <http://www.gnu.org/licenses/>.  */
+ 
+ /* Written by Bruno Haible <bruno@clisp.org>, 2007.  */
+ /* Modified for libga68 by Jose E. Marchesi <jemarch@gnu.org>, 2026.  */
+ 
+ #include <float.h>
+ 
+ #ifdef USE_LONG_DOUBLE
+ # define FUNC floorl
+ # define DOUBLE long double
+ # define MANT_DIG LDBL_MANT_DIG
+ # define TWO_MANT_DIG LDBL_TWO_MANT_DIG
+ # define L_(literal) literal##L
+ #elif ! defined USE_FLOAT
+ # define FUNC floor
+ # define DOUBLE double
+ # define MANT_DIG DBL_MANT_DIG
+ # define TWO_MANT_DIG DBL_TWO_MANT_DIG
+ # define L_(literal) literal
+ #else /* defined USE_FLOAT */
+ # define FUNC floorf
+ # define DOUBLE float
+ # define MANT_DIG FLT_MANT_DIG
+ # define TWO_MANT_DIG FLT_TWO_MANT_DIG
+ # define L_(literal) literal##f
+ #endif
+ 
+ /* MSVC with option -fp:strict refuses to compile constant initializers that
+    contain floating-point operations.  Pacify this compiler.  */
+ #if defined _MSC_VER && !defined __clang__
+ # pragma fenv_access (off)
+ #endif
+ 
+ /* 2^(MANT_DIG-1).  */
+ static const DOUBLE TWO_MANT_DIG =
+   /* Assume MANT_DIG <= 5 * 31.
+      Use the identity
+        n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5).  */
+   (DOUBLE) (1U << ((MANT_DIG - 1) / 5))
+   * (DOUBLE) (1U << ((MANT_DIG - 1 + 1) / 5))
+   * (DOUBLE) (1U << ((MANT_DIG - 1 + 2) / 5))
+   * (DOUBLE) (1U << ((MANT_DIG - 1 + 3) / 5))
+   * (DOUBLE) (1U << ((MANT_DIG - 1 + 4) / 5));
+ 
+ DOUBLE
+ FUNC (DOUBLE x)
+ {
+   /* The use of 'volatile' guarantees that excess precision bits are dropped
+      at each addition step and before the following comparison at the caller's
+      site.  It is necessary on x86 systems where double-floats are not IEEE
+      compliant by default, to avoid that the results become platform and compiler
+      option dependent.  'volatile' is a portable alternative to gcc's
+      -ffloat-store option.  */
+   volatile DOUBLE y = x;
+   volatile DOUBLE z = y;
+ 
+   if (z > L_(0.0))
+     {
+       /* For 0 < x < 1, return +0.0 even if the current rounding mode is
+          FE_DOWNWARD.  */
+       if (z < L_(1.0))
+         z = L_(0.0);
+       /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1.  */
+       else if (z < TWO_MANT_DIG)
+         {
+           /* Round to the next integer (nearest or up or down, doesn't matter).  */
+           z += TWO_MANT_DIG;
+           z -= TWO_MANT_DIG;
+           /* Enforce rounding down.  */
+           if (z > y)
+             z -= L_(1.0);
+         }
+     }
+   else if (z < L_(0.0))
+     {
+       /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1.  */
+       if (z > - TWO_MANT_DIG)
+         {
+           /* Round to the next integer (nearest or up or down, doesn't matter).  */
+           z -= TWO_MANT_DIG;
+           z += TWO_MANT_DIG;
+           /* Enforce rounding down.  */
+           if (z > y)
+             z -= L_(1.0);
+         }
+     }
+   return z;
+ }
+ 
+ #undef FUNC
+ #undef DOUBLE
+ #undef MANT_DIG
+ #undef TWO_MANT_DIG
+ #undef L_
diff -Nrcpad gcc-16-20260315/libga68/ga68-math.c gcc-16-20260322/libga68/ga68-math.c
*** gcc-16-20260315/libga68/ga68-math.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libga68/ga68-math.c	Sun Mar 22 22:32:14 2026
***************
*** 0 ****
--- 1,40 ----
+ /* Run-time math routines.
+ 
+    Copyright (C) 2026 Jose E. Marchesi.
+ 
+    GCC is free software; you can redistribute it and/or modify it under the
+    terms of the GNU General Public License as published by the Free Software
+    Foundation; either version 3, or (at your option) any later version.
+ 
+    GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+    FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+    details.
+ 
+    Under Section 7 of GPL version 3, you are granted additional permissions
+    described in the GCC Runtime Library Exception, version 3.1, as published by
+    the Free Software Foundation.
+ 
+    You should have received a copy of the GNU General Public License and a copy
+    of the GCC Runtime Library Exception along with this program; see the files
+    COPYING3 and COPYING.RUNTIME respectively.  If not, see
+    <http://www.gnu.org/licenses/>.  */
+ 
+ /* The purpose of this file is to provide an implementation of math routines so
+    libga68.so doesn't have to depend on libm.  */
+ 
+ /* floorl */
+ 
+ #define USE_LONG_DOUBLE
+ #include "floor.c"
+ #undef USE_LONG_DOUBLE
+ 
+ /* floorf */
+ 
+ #define USE_FLOAT
+ #include "floor.c"
+ #undef USE_FLOAT
+ 
+ /* floor */
+ 
+ #include "floor.c"
diff -Nrcpad gcc-16-20260315/libgfortran/Makefile.am gcc-16-20260322/libgfortran/Makefile.am
*** gcc-16-20260315/libgfortran/Makefile.am	Sun Mar 15 22:32:16 2026
--- gcc-16-20260322/libgfortran/Makefile.am	Sun Mar 22 22:32:14 2026
*************** libgfortran_la_DEPENDENCIES = $(version_
*** 61,67 ****
  libcaf_shared_DEPS = caf/libcaf.h caf/caf_error.h
  libcaf_shared_SRCS = caf/caf_error.c
  
! cafexeclib_LTLIBRARIES = libcaf_single.la libcaf_shmem.la
  cafexeclibdir = $(libdir)/gcc/$(target_alias)/$(gcc_version)$(MULTISUBDIR)
  libcaf_single_la_SOURCES = caf/single.c $(libcaf_shared_SRCS)
  libcaf_single_la_LDFLAGS = -static
--- 61,67 ----
  libcaf_shared_DEPS = caf/libcaf.h caf/caf_error.h
  libcaf_shared_SRCS = caf/caf_error.c
  
! cafexeclib_LTLIBRARIES = libcaf_single.la
  cafexeclibdir = $(libdir)/gcc/$(target_alias)/$(gcc_version)$(MULTISUBDIR)
  libcaf_single_la_SOURCES = caf/single.c $(libcaf_shared_SRCS)
  libcaf_single_la_LDFLAGS = -static
*************** libcaf_single_la_DEPENDENCIES = $(libcaf
*** 69,74 ****
--- 69,75 ----
  libcaf_single_la_LINK = $(LINK) $(libcaf_single_la_LDFLAGS)
  
  if ENABLE_CAF_SHMEM
+ cafexeclib_LTLIBRARIES += libcaf_shmem.la
  libcaf_shmem_la_CFLAGS = $(CAF_SHMEM_CFLAGS)
  libcaf_shmem_la_SOURCES = $(libcaf_shared_SRCS) \
  	caf/shmem.c caf/shmem/alloc.c caf/shmem/allocator.c \
diff -Nrcpad gcc-16-20260315/libgfortran/Makefile.in gcc-16-20260322/libgfortran/Makefile.in
*** gcc-16-20260315/libgfortran/Makefile.in	Sun Mar 15 22:32:19 2026
--- gcc-16-20260322/libgfortran/Makefile.in	Sun Mar 22 22:32:18 2026
*************** host_triplet = @host@
*** 93,100 ****
  target_triplet = @target@
  @ENABLE_DARWIN_AT_RPATH_TRUE@am__append_1 = -Wc,-nodefaultrpaths \
  @ENABLE_DARWIN_AT_RPATH_TRUE@	-Wl,-rpath,@loader_path
! @LIBGFOR_MINIMAL_TRUE@am__append_2 = -DLIBGFOR_MINIMAL
! @LIBGFOR_MINIMAL_FALSE@am__append_3 = \
  @LIBGFOR_MINIMAL_FALSE@io/close.c \
  @LIBGFOR_MINIMAL_FALSE@io/file_pos.c \
  @LIBGFOR_MINIMAL_FALSE@io/format.c \
--- 93,101 ----
  target_triplet = @target@
  @ENABLE_DARWIN_AT_RPATH_TRUE@am__append_1 = -Wc,-nodefaultrpaths \
  @ENABLE_DARWIN_AT_RPATH_TRUE@	-Wl,-rpath,@loader_path
! @ENABLE_CAF_SHMEM_TRUE@am__append_2 = libcaf_shmem.la
! @LIBGFOR_MINIMAL_TRUE@am__append_3 = -DLIBGFOR_MINIMAL
! @LIBGFOR_MINIMAL_FALSE@am__append_4 = \
  @LIBGFOR_MINIMAL_FALSE@io/close.c \
  @LIBGFOR_MINIMAL_FALSE@io/file_pos.c \
  @LIBGFOR_MINIMAL_FALSE@io/format.c \
*************** target_triplet = @target@
*** 112,118 ****
  @LIBGFOR_MINIMAL_FALSE@io/fbuf.c \
  @LIBGFOR_MINIMAL_FALSE@io/async.c
  
! @LIBGFOR_MINIMAL_FALSE@am__append_4 = \
  @LIBGFOR_MINIMAL_FALSE@intrinsics/access.c \
  @LIBGFOR_MINIMAL_FALSE@intrinsics/c99_functions.c \
  @LIBGFOR_MINIMAL_FALSE@intrinsics/chdir.c \
--- 113,119 ----
  @LIBGFOR_MINIMAL_FALSE@io/fbuf.c \
  @LIBGFOR_MINIMAL_FALSE@io/async.c
  
! @LIBGFOR_MINIMAL_FALSE@am__append_5 = \
  @LIBGFOR_MINIMAL_FALSE@intrinsics/access.c \
  @LIBGFOR_MINIMAL_FALSE@intrinsics/c99_functions.c \
  @LIBGFOR_MINIMAL_FALSE@intrinsics/chdir.c \
*************** target_triplet = @target@
*** 145,153 ****
  @LIBGFOR_MINIMAL_FALSE@intrinsics/umask.c \
  @LIBGFOR_MINIMAL_FALSE@intrinsics/unlink.c
  
! @IEEE_SUPPORT_TRUE@am__append_5 = ieee/ieee_helper.c
! @LIBGFOR_MINIMAL_TRUE@am__append_6 = runtime/minimal.c
! @LIBGFOR_MINIMAL_FALSE@am__append_7 = \
  @LIBGFOR_MINIMAL_FALSE@runtime/backtrace.c \
  @LIBGFOR_MINIMAL_FALSE@runtime/convert_char.c \
  @LIBGFOR_MINIMAL_FALSE@runtime/environ.c \
--- 146,154 ----
  @LIBGFOR_MINIMAL_FALSE@intrinsics/umask.c \
  @LIBGFOR_MINIMAL_FALSE@intrinsics/unlink.c
  
! @IEEE_SUPPORT_TRUE@am__append_6 = ieee/ieee_helper.c
! @LIBGFOR_MINIMAL_TRUE@am__append_7 = runtime/minimal.c
! @LIBGFOR_MINIMAL_FALSE@am__append_8 = \
  @LIBGFOR_MINIMAL_FALSE@runtime/backtrace.c \
  @LIBGFOR_MINIMAL_FALSE@runtime/convert_char.c \
  @LIBGFOR_MINIMAL_FALSE@runtime/environ.c \
*************** am__objects_1 = caf/libcaf_shmem_la-caf_
*** 236,241 ****
--- 237,244 ----
  @ENABLE_CAF_SHMEM_TRUE@	caf/shmem/libcaf_shmem_la-teams_mgmt.lo \
  @ENABLE_CAF_SHMEM_TRUE@	caf/shmem/libcaf_shmem_la-thread_support.lo
  libcaf_shmem_la_OBJECTS = $(am_libcaf_shmem_la_OBJECTS)
+ @ENABLE_CAF_SHMEM_TRUE@am_libcaf_shmem_la_rpath = -rpath \
+ @ENABLE_CAF_SHMEM_TRUE@	$(cafexeclibdir)
  libcaf_single_la_LIBADD =
  am__objects_2 = caf/caf_error.lo
  am_libcaf_single_la_OBJECTS = caf/single.lo $(am__objects_2)
*************** AMTAR = @AMTAR@
*** 805,811 ****
  
  # Some targets require additional compiler options for IEEE compatibility.
  AM_CFLAGS = @AM_CFLAGS@ -fcx-fortran-rules $(SECTION_FLAGS) \
! 	$(IEEE_FLAGS) $(am__append_2)
  AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
  AM_FCFLAGS = @AM_FCFLAGS@ $(IEEE_FLAGS)
  AR = @AR@
--- 808,814 ----
  
  # Some targets require additional compiler options for IEEE compatibility.
  AM_CFLAGS = @AM_CFLAGS@ -fcx-fortran-rules $(SECTION_FLAGS) \
! 	$(IEEE_FLAGS) $(am__append_3)
  AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
  AM_FCFLAGS = @AM_FCFLAGS@ $(IEEE_FLAGS)
  AR = @AR@
*************** libgfortran_la_LDFLAGS = -version-info `
*** 989,995 ****
  libgfortran_la_DEPENDENCIES = $(version_dep) libgfortran.spec $(LIBQUADLIB_DEP)
  libcaf_shared_DEPS = caf/libcaf.h caf/caf_error.h
  libcaf_shared_SRCS = caf/caf_error.c
! cafexeclib_LTLIBRARIES = libcaf_single.la libcaf_shmem.la
  cafexeclibdir = $(libdir)/gcc/$(target_alias)/$(gcc_version)$(MULTISUBDIR)
  libcaf_single_la_SOURCES = caf/single.c $(libcaf_shared_SRCS)
  libcaf_single_la_LDFLAGS = -static
--- 992,998 ----
  libgfortran_la_DEPENDENCIES = $(version_dep) libgfortran.spec $(LIBQUADLIB_DEP)
  libcaf_shared_DEPS = caf/libcaf.h caf/caf_error.h
  libcaf_shared_SRCS = caf/caf_error.c
! cafexeclib_LTLIBRARIES = libcaf_single.la $(am__append_2)
  cafexeclibdir = $(libdir)/gcc/$(target_alias)/$(gcc_version)$(MULTISUBDIR)
  libcaf_single_la_SOURCES = caf/single.c $(libcaf_shared_SRCS)
  libcaf_single_la_LDFLAGS = -static
*************** AM_CPPFLAGS = -iquote$(srcdir)/io -I$(sr
*** 1021,1027 ****
  	      -I$(MULTIBUILDTOP)../libbacktrace \
  	      -I../libbacktrace
  
! gfor_io_src = io/size_from_kind.c $(am__append_3)
  gfor_io_headers = \
  io/io.h \
  io/fbuf.h \
--- 1024,1030 ----
  	      -I$(MULTIBUILDTOP)../libbacktrace \
  	      -I../libbacktrace
  
! gfor_io_src = io/size_from_kind.c $(am__append_4)
  gfor_io_headers = \
  io/io.h \
  io/fbuf.h \
*************** gfor_helper_src = intrinsics/associated.
*** 1044,1050 ****
  	intrinsics/selected_real_kind.f90 intrinsics/trigd.c \
  	intrinsics/unpack_generic.c runtime/in_pack_generic.c \
  	runtime/in_unpack_generic.c runtime/in_pack_class.c \
! 	runtime/in_unpack_class.c $(am__append_4) $(am__append_5)
  @IEEE_SUPPORT_TRUE@gfor_ieee_helper_src = ieee/ieee_helper.c
  @IEEE_SUPPORT_FALSE@gfor_ieee_src = 
  @IEEE_SUPPORT_TRUE@gfor_ieee_src = \
--- 1047,1053 ----
  	intrinsics/selected_real_kind.f90 intrinsics/trigd.c \
  	intrinsics/unpack_generic.c runtime/in_pack_generic.c \
  	runtime/in_unpack_generic.c runtime/in_pack_class.c \
! 	runtime/in_unpack_class.c $(am__append_5) $(am__append_6)
  @IEEE_SUPPORT_TRUE@gfor_ieee_helper_src = ieee/ieee_helper.c
  @IEEE_SUPPORT_FALSE@gfor_ieee_src = 
  @IEEE_SUPPORT_TRUE@gfor_ieee_src = \
*************** gfor_helper_src = intrinsics/associated.
*** 1054,1060 ****
  
  gfor_src = runtime/bounds.c runtime/compile_options.c \
  	runtime/deep_copy.c runtime/memory.c runtime/string.c \
! 	runtime/select.c $(am__append_6) $(am__append_7)
  i_matmul_c = \
  generated/matmul_i1.c \
  generated/matmul_i2.c \
--- 1057,1063 ----
  
  gfor_src = runtime/bounds.c runtime/compile_options.c \
  	runtime/deep_copy.c runtime/memory.c runtime/string.c \
! 	runtime/select.c $(am__append_7) $(am__append_8)
  i_matmul_c = \
  generated/matmul_i1.c \
  generated/matmul_i2.c \
*************** caf/shmem/libcaf_shmem_la-thread_support
*** 2038,2044 ****
  	caf/shmem/$(am__dirstamp) caf/shmem/$(DEPDIR)/$(am__dirstamp)
  
  libcaf_shmem.la: $(libcaf_shmem_la_OBJECTS) $(libcaf_shmem_la_DEPENDENCIES) $(EXTRA_libcaf_shmem_la_DEPENDENCIES) 
! 	$(AM_V_GEN)$(libcaf_shmem_la_LINK) -rpath $(cafexeclibdir) $(libcaf_shmem_la_OBJECTS) $(libcaf_shmem_la_LIBADD) $(LIBS)
  caf/single.lo: caf/$(am__dirstamp) caf/$(DEPDIR)/$(am__dirstamp)
  caf/caf_error.lo: caf/$(am__dirstamp) caf/$(DEPDIR)/$(am__dirstamp)
  
--- 2041,2047 ----
  	caf/shmem/$(am__dirstamp) caf/shmem/$(DEPDIR)/$(am__dirstamp)
  
  libcaf_shmem.la: $(libcaf_shmem_la_OBJECTS) $(libcaf_shmem_la_DEPENDENCIES) $(EXTRA_libcaf_shmem_la_DEPENDENCIES) 
! 	$(AM_V_GEN)$(libcaf_shmem_la_LINK) $(am_libcaf_shmem_la_rpath) $(libcaf_shmem_la_OBJECTS) $(libcaf_shmem_la_LIBADD) $(LIBS)
  caf/single.lo: caf/$(am__dirstamp) caf/$(DEPDIR)/$(am__dirstamp)
  caf/caf_error.lo: caf/$(am__dirstamp) caf/$(DEPDIR)/$(am__dirstamp)
  
diff -Nrcpad gcc-16-20260315/libgfortran/configure gcc-16-20260322/libgfortran/configure
*** gcc-16-20260315/libgfortran/configure	Sun Mar 15 22:32:20 2026
--- gcc-16-20260322/libgfortran/configure	Sun Mar 22 22:32:18 2026
*************** ac_link='$CC -o conftest$ac_exeext $CFLA
*** 18414,18419 ****
--- 18414,18457 ----
  ac_compiler_gnu=$ac_cv_c_compiler_gnu
  
  
+ # caf_shmem needs process-shared pthread primitives that are visible through
+ # the default pthread headers.  AX_PTHREAD already established the baseline
+ # pthread flags; this additional check only verifies that the specific
+ # process-shared API surface is usable for caf/shmem/thread_support.c.
+ if test x$enable_caf_shmem = xtrue; then
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for usable process-shared pthread support for caf_shmem" >&5
+ $as_echo_n "checking for usable process-shared pthread support for caf_shmem... " >&6; }
+   save_CFLAGS="$CFLAGS"
+   CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h.  */
+ #include <pthread.h>
+ int
+ main ()
+ {
+ pthread_mutexattr_t mattr;
+         pthread_condattr_t cattr;
+         (void) &pthread_mutexattr_setpshared;
+         (void) &pthread_condattr_setpshared;
+         return pthread_mutexattr_init (&mattr)
+           || pthread_condattr_init (&cattr)
+           || pthread_mutexattr_setpshared (&mattr, PTHREAD_PROCESS_SHARED)
+           || pthread_condattr_setpshared (&cattr, PTHREAD_PROCESS_SHARED);
+   ;
+   return 0;
+ }
+ _ACEOF
+ if ac_fn_c_try_compile "$LINENO"; then :
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+ $as_echo "yes" >&6; }
+ else
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ $as_echo "no" >&6; }
+      enable_caf_shmem=false
+ fi
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   CFLAGS="$save_CFLAGS"
+ fi
   if test x$enable_caf_shmem = xtrue; then
    ENABLE_CAF_SHMEM_TRUE=
    ENABLE_CAF_SHMEM_FALSE='#'
diff -Nrcpad gcc-16-20260315/libgfortran/configure.ac gcc-16-20260322/libgfortran/configure.ac
*** gcc-16-20260315/libgfortran/configure.ac	Sun Mar 15 22:32:16 2026
--- gcc-16-20260322/libgfortran/configure.ac	Sun Mar 22 22:32:14 2026
*************** AX_PTHREAD([
*** 351,356 ****
--- 351,380 ----
    ], [
    enable_caf_shmem=false
    ])
+ # caf_shmem needs process-shared pthread primitives that are visible through
+ # the default pthread headers.  AX_PTHREAD already established the baseline
+ # pthread flags; this additional check only verifies that the specific
+ # process-shared API surface is usable for caf/shmem/thread_support.c.
+ if test x$enable_caf_shmem = xtrue; then
+   AC_MSG_CHECKING([for usable process-shared pthread support for caf_shmem])
+   save_CFLAGS="$CFLAGS"
+   CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+   AC_COMPILE_IFELSE(
+     [AC_LANG_PROGRAM(
+       [[#include <pthread.h>]],
+       [[pthread_mutexattr_t mattr;
+         pthread_condattr_t cattr;
+         (void) &pthread_mutexattr_setpshared;
+         (void) &pthread_condattr_setpshared;
+         return pthread_mutexattr_init (&mattr)
+           || pthread_condattr_init (&cattr)
+           || pthread_mutexattr_setpshared (&mattr, PTHREAD_PROCESS_SHARED)
+           || pthread_condattr_setpshared (&cattr, PTHREAD_PROCESS_SHARED);]])],
+     [AC_MSG_RESULT([yes])],
+     [AC_MSG_RESULT([no])
+      enable_caf_shmem=false])
+   CFLAGS="$save_CFLAGS"
+ fi
  AM_CONDITIONAL([ENABLE_CAF_SHMEM], [test x$enable_caf_shmem = xtrue])
  
  # Check strerror_r, cannot be above as versions with two and three arguments exist
diff -Nrcpad gcc-16-20260315/libgomp/ChangeLog gcc-16-20260322/libgomp/ChangeLog
*** gcc-16-20260315/libgomp/ChangeLog	Sun Mar 15 22:32:16 2026
--- gcc-16-20260322/libgomp/ChangeLog	Sun Mar 22 22:32:15 2026
***************
*** 1,3 ****
--- 1,45 ----
+ 2026-03-20  Tobias Burnus  <tburnus@baylibre.com>
+ 	    Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* target.c (gomp_exit_data): Handle iterators.
+ 	* testsuite/libgomp.c-c++-common/target-enter-data-iterators-1.c: New.
+ 	* testsuite/libgomp.c-c++-common/target-update-iterators-2.c:
+ 	Also test "target exit data".
+ 	* testsuite/libgomp.c-c++-common/target-update-iterators-3.c:
+ 	Likewise.
+ 
+ 2026-03-20  Kwok Cheung Yeung  <kcyeung@baylibre.com>
+ 	    Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* testsuite/libgomp.c-c++-common/target-data-iterators-1.c: New.
+ 
+ 2026-03-18  Arsen Arsenović  <aarsenovic@baylibre.com>
+ 
+ 	* plugin/plugin-gcn.c (struct kernel_dispatch): Add a field to
+ 	hold a pointer to the allocation cache node this dispatch is
+ 	holding for kernel arguments, replacing kernarg_address.
+ 	(print_kernel_dispatch): Print the allocation pointer from that
+ 	node as kernargs address.
+ 	(struct agent_info): Add in an allocation cache field.
+ 	(alloc_kernargs_on_agent): New function.  Pulls kernel arguments
+ 	from the cache, or, if no appropriate node is found, allocates
+ 	new ones.
+ 	(create_kernel_dispatch): Use alloc_kernargs_on_agent to
+ 	allocate kernargs.
+ 	(release_kernel_dispatch): Use release_alloc_cache_node to
+ 	release kernargs.
+ 	(run_kernel): Update usages of kernarg_address to use the kernel
+ 	arguments cache node.
+ 	(GOMP_OFFLOAD_fini_device): Clean up kernargs cache.
+ 	(GOMP_OFFLOAD_init_device): Initialize kernargs cache.
+ 	* alloc_cache.h: New file.
+ 	* testsuite/libgomp.c/alloc_cache-1.c: New test.
+ 
+ 2026-03-17  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+ 
+ 	PR fortran/120286
+ 	* testsuite/libgomp.fortran/pr120286.f90: New test.
+ 
  2026-02-28  Kwok Cheung Yeung  <kcyeung@baylibre.com>
  
  	PR middle-end/113436
diff -Nrcpad gcc-16-20260315/libgomp/alloc_cache.h gcc-16-20260322/libgomp/alloc_cache.h
*** gcc-16-20260315/libgomp/alloc_cache.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libgomp/alloc_cache.h	Sun Mar 22 22:32:15 2026
***************
*** 0 ****
--- 1,144 ----
+ /* A simple allocation cache.
+    Copyright (C) 2026 Free Software Foundation, Inc.
+ 
+    This file is part of the GNU Offloading and Multi Processing Library
+    (libgomp).
+ 
+    Libgomp 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.
+ 
+    Libgomp 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/>.  */
+ 
+ #ifndef _ALLOC_CACHE_H
+ #define _ALLOC_CACHE_H
+ 
+ #include <assert.h>
+ #include <errno.h>
+ #include <stdlib.h>
+ #include <stdatomic.h>
+ #include <stddef.h>
+ #include <pthread.h>
+ 
+ /* A single cached allocation.  All fields immutable.  */
+ struct alloc_cache_node
+ {
+   /* When taken, someone is using this node, and we can't.  */
+   pthread_mutex_t lock;
+   void *allocation;
+   size_t size;
+ 
+   struct alloc_cache_node *next;
+ };
+ 
+ struct alloc_cache
+ {
+   _Atomic (struct alloc_cache_node *) head;
+ 
+   /* Could be made better by breaking it up into buckets eventually.  Our
+      current allocation pattern is such that most accesses are likely to only
+      ever use the smallest practical allocation, so there isn't much gain in
+      implementing buckets currently.
+ 
+      Currently, as it is used, this cache will likely be of size O(T) where T
+      is the max number of concurrently executing kernels during the lifetime of
+      the process.  I suspect this value is low, so even with a single bucket,
+      it is likely fast enough to search through.  */
+ };
+ 
+ /* Prepare CACHE for use, initializing it as empty.  */
+ static inline void
+ init_alloc_cache (struct alloc_cache *cache)
+ {
+   atomic_init (&cache->head, NULL);
+ }
+ 
+ /* Search through CACHE, looking for a non-taken node of large enough to fit
+    DESIRED_SIZE bytes.  Returns NULL if no such node exists.  */
+ static inline struct alloc_cache_node *
+ alloc_cache_try_find (struct alloc_cache *cache, size_t desired_size)
+ {
+   for (struct alloc_cache_node *node =
+ 	 atomic_load_explicit (&cache->head, memory_order_relaxed);
+        node;
+        node = node->next)
+     {
+       if (node->size < desired_size)
+ 	continue;
+ 
+       int ret;
+       if ((ret = pthread_mutex_trylock (&node->lock)) == EBUSY)
+ 	continue;
+       assert (ret == 0);
+ 
+       /* It worked!  We found a node that's large enough and free.  */
+       return node;
+     }
+ 
+   return NULL;
+ }
+ 
+ /* Add a new node for allocation ALLOCATION of SIZE bytes into the cache.  The
+    new node is acquired on return.  */
+ static inline struct alloc_cache_node *
+ alloc_cache_add_taken_node (struct alloc_cache *cache,
+ 			    void *allocation,
+ 			    size_t size)
+ {
+   struct alloc_cache_node *new_node = malloc (sizeof (*new_node));
+ 
+   if (!new_node)
+     return NULL;
+ 
+   *new_node = (struct alloc_cache_node) {
+     .lock = PTHREAD_MUTEX_INITIALIZER,
+     .allocation = allocation,
+     .size = size,
+     .next = NULL
+   };
+   pthread_mutex_lock (&new_node->lock);
+ 
+   /* Place it on the top of the stack.  */
+   struct alloc_cache_node *top = (atomic_load_explicit
+ 				  (&cache->head, memory_order_acquire));
+ 
+   do new_node->next = top;
+   while (!atomic_compare_exchange_weak_explicit
+ 	 (&cache->head, &top, new_node,
+ 	  memory_order_acq_rel, memory_order_acquire));
+ 
+   return new_node;
+ }
+ 
+ /* Allow NODE to be used by other users of its cache.  */
+ static inline void
+ release_alloc_cache_node (struct alloc_cache_node *node)
+ {
+   pthread_mutex_unlock (&node->lock);
+ }
+ 
+ /* Destroy NODE.  Caller is responsible for cleaning up the allocation inside
+    of NODE, and for making sure that it is not part of any cache that is going
+    to be used in the future.  */
+ static inline void
+ destroy_alloc_cache_node (struct alloc_cache_node *node)
+ {
+   pthread_mutex_destroy (&node->lock);
+   free (node);
+ }
+ 
+ 
+ #endif /* _ALLOC_CACHE_H  */
diff -Nrcpad gcc-16-20260315/libgomp/plugin/plugin-gcn.c gcc-16-20260322/libgomp/plugin/plugin-gcn.c
*** gcc-16-20260315/libgomp/plugin/plugin-gcn.c	Sun Mar 15 22:32:16 2026
--- gcc-16-20260322/libgomp/plugin/plugin-gcn.c	Sun Mar 22 22:32:15 2026
***************
*** 41,46 ****
--- 41,47 ----
  #include <hsa_ext_amd.h>
  #include <dlfcn.h>
  #include <signal.h>
+ #include "alloc_cache.h"
  #define _LIBGOMP_PLUGIN_INCLUDE 1
  #include "libgomp-plugin.h"
  #undef _LIBGOMP_PLUGIN_INCLUDE
*************** struct kernel_dispatch
*** 281,288 ****
    struct agent_info *agent;
    /* Pointer to a command queue associated with a kernel dispatch agent.  */
    void *queue;
!   /* Pointer to a memory space used for kernel arguments passing.  */
!   void *kernarg_address;
    /* Kernel object.  */
    uint64_t object;
    /* Synchronization signal used for dispatch synchronization.  */
--- 282,290 ----
    struct agent_info *agent;
    /* Pointer to a command queue associated with a kernel dispatch agent.  */
    void *queue;
!   /* Pointer to a memory space used for kernel arguments passing, wrapped in a
!      node from the agent kernel argument cache.  */
!   struct alloc_cache_node *kernarg_cache_node;
    /* Kernel object.  */
    uint64_t object;
    /* Synchronization signal used for dispatch synchronization.  */
*************** struct agent_info
*** 472,477 ****
--- 474,483 ----
    /* The HSA memory region from which to allocate kernel arguments.  */
    hsa_region_t kernarg_region;
  
+   /* A stack of allocations in kernarg_region of (sizeof (struct kernargs))
+      size each, used for ammortizing kernel argument allocation cost.  */
+   struct alloc_cache kernarg_cache;
+ 
    /* The HSA memory region from which to allocate device data.  */
    hsa_region_t data_region;
  
*************** dump_executable_symbols (hsa_executable_
*** 1082,1088 ****
  static void
  print_kernel_dispatch (struct kernel_dispatch *dispatch, unsigned indent)
  {
!   struct kernargs *kernargs = (struct kernargs *)dispatch->kernarg_address;
  
    fprintf (stderr, "%*sthis: %p\n", indent, "", dispatch);
    fprintf (stderr, "%*squeue: %p\n", indent, "", dispatch->queue);
--- 1088,1094 ----
  static void
  print_kernel_dispatch (struct kernel_dispatch *dispatch, unsigned indent)
  {
!   struct kernargs *kernargs = dispatch->kernarg_cache_node->allocation;
  
    fprintf (stderr, "%*sthis: %p\n", indent, "", dispatch);
    fprintf (stderr, "%*squeue: %p\n", indent, "", dispatch->queue);
*************** alloc_by_agent (struct agent_info *agent
*** 2004,2009 ****
--- 2010,2043 ----
    return ptr;
  }
  
+ /* Get a cached kernargs from AGENT, returning an existing one if any are
+    available.  Returns an alloc_cache_node whose value is this allocation.  */
+ 
+ static struct alloc_cache_node *
+ alloc_kernargs_on_agent (struct agent_info *agent, size_t size)
+ {
+   struct alloc_cache_node *ka_node = (alloc_cache_try_find
+ 				      (&agent->kernarg_cache, size));
+ 
+   /* The cache was empty.  */
+   if (!ka_node)
+     {
+       void *ka_addr;
+       hsa_status_t status = hsa_fns.hsa_memory_allocate_fn
+ 	(agent->kernarg_region, sizeof (struct kernargs), &ka_addr);
+       if (status != HSA_STATUS_SUCCESS)
+ 	hsa_fatal ("Could not allocate memory for GCN kernel arguments", status);
+ 
+       ka_node = alloc_cache_add_taken_node (&agent->kernarg_cache,
+ 					    ka_addr,
+ 					    size);
+       if (!ka_node)
+ 	GOMP_PLUGIN_fatal ("Could not allocate cache node for kernel arguments");
+     }
+ 
+   return ka_node;
+ }
+ 
  /* Create kernel dispatch data structure for given KERNEL, along with
     the necessary device signals and memory allocations.  */
  
*************** create_kernel_dispatch (struct kernel_in
*** 2054,2065 ****
        return NULL;
      }
  
!   status = hsa_fns.hsa_memory_allocate_fn (agent->kernarg_region,
! 					   sizeof (struct kernargs),
! 					   &shadow->kernarg_address);
!   if (status != HSA_STATUS_SUCCESS)
!     hsa_fatal ("Could not allocate memory for GCN kernel arguments", status);
!   struct kernargs *kernargs = shadow->kernarg_address;
  
    /* Zero-initialize the output_data (minimum needed).  */
    kernargs->abi.out_ptr = (int64_t)&kernargs->output_data;
--- 2088,2097 ----
        return NULL;
      }
  
!   /* Get an allocation, if possible from the cache.  */
!   shadow->kernarg_cache_node = (alloc_kernargs_on_agent
! 				(agent, sizeof (struct kernargs)));
!   struct kernargs *kernargs = shadow->kernarg_cache_node->allocation;
  
    /* Zero-initialize the output_data (minimum needed).  */
    kernargs->abi.out_ptr = (int64_t)&kernargs->output_data;
*************** release_kernel_dispatch (struct kernel_d
*** 2158,2170 ****
  {
    GCN_DEBUG ("Released kernel dispatch: %p\n", shadow);
  
!   struct kernargs *kernargs = shadow->kernarg_address;
    void *addr = (void *)kernargs->abi.arena_ptr;
    if (!addr)
      addr = (void *)kernargs->abi.stack_ptr;
    release_ephemeral_memories (shadow->agent, addr);
  
!   hsa_fns.hsa_memory_free_fn (shadow->kernarg_address);
  
    hsa_signal_t s;
    s.handle = shadow->signal;
--- 2190,2202 ----
  {
    GCN_DEBUG ("Released kernel dispatch: %p\n", shadow);
  
!   struct kernargs *kernargs = shadow->kernarg_cache_node->allocation;
    void *addr = (void *)kernargs->abi.arena_ptr;
    if (!addr)
      addr = (void *)kernargs->abi.stack_ptr;
    release_ephemeral_memories (shadow->agent, addr);
  
!   release_alloc_cache_node (shadow->kernarg_cache_node);
  
    hsa_signal_t s;
    s.handle = shadow->signal;
*************** run_kernel (struct kernel_info *kernel,
*** 2406,2417 ****
    packet->private_segment_size = shadow->private_segment_size;
    packet->group_segment_size = shadow->group_segment_size;
    packet->kernel_object = shadow->object;
!   packet->kernarg_address = shadow->kernarg_address;
    hsa_signal_t s;
    s.handle = shadow->signal;
    packet->completion_signal = s;
    hsa_fns.hsa_signal_store_relaxed_fn (s, 1);
!   memcpy (shadow->kernarg_address, &vars, sizeof (vars));
  
    GCN_DEBUG ("Copying kernel runtime pointer to kernarg_address\n");
  
--- 2438,2450 ----
    packet->private_segment_size = shadow->private_segment_size;
    packet->group_segment_size = shadow->group_segment_size;
    packet->kernel_object = shadow->object;
!   struct kernargs *kernargs = (packet->kernarg_address
! 			       = shadow->kernarg_cache_node->allocation);
    hsa_signal_t s;
    s.handle = shadow->signal;
    packet->completion_signal = s;
    hsa_fns.hsa_signal_store_relaxed_fn (s, 1);
!   memcpy (kernargs, &vars, sizeof (vars));
  
    GCN_DEBUG ("Copying kernel runtime pointer to kernarg_address\n");
  
*************** run_kernel (struct kernel_info *kernel,
*** 2437,2447 ****
  					     1000 * 1000,
  					     HSA_WAIT_STATE_BLOCKED) != 0)
      {
!       console_output (kernel, shadow->kernarg_address, false);
      }
!   console_output (kernel, shadow->kernarg_address, true);
  
-   struct kernargs *kernargs = shadow->kernarg_address;
    unsigned int return_value = (unsigned int)kernargs->output_data.return_value;
  
    release_kernel_dispatch (shadow);
--- 2470,2479 ----
  					     1000 * 1000,
  					     HSA_WAIT_STATE_BLOCKED) != 0)
      {
!       console_output (kernel, kernargs, false);
      }
!   console_output (kernel, kernargs, true);
  
    unsigned int return_value = (unsigned int)kernargs->output_data.return_value;
  
    release_kernel_dispatch (shadow);
*************** GOMP_OFFLOAD_init_device (int n)
*** 3766,3771 ****
--- 3798,3806 ----
    GCN_DEBUG ("Selected device data memory region:\n");
    dump_hsa_region (agent->data_region, NULL);
  
+   /* Prepare kernargs cache.  */
+   init_alloc_cache (&agent->kernarg_cache);
+ 
    GCN_DEBUG ("GCN agent %d initialized\n", n);
  
    agent->initialized = true;
*************** GOMP_OFFLOAD_fini_device (int n)
*** 4183,4188 ****
--- 4218,4234 ----
    if (status != HSA_STATUS_SUCCESS)
      return hsa_error ("Error destroying command queue", status);
  
+   /* Clean up kernargs cache.  */
+   struct alloc_cache_node *node = agent->kernarg_cache.head;
+   while (node)
+     {
+       hsa_fns.hsa_memory_free_fn (node->allocation);
+ 
+       struct alloc_cache_node *curr_node = node;
+       node = curr_node->next;
+       destroy_alloc_cache_node (curr_node);
+     }
+ 
    if (pthread_mutex_destroy (&agent->prog_mutex))
      {
        GOMP_PLUGIN_error ("Failed to destroy a GCN agent program mutex");
diff -Nrcpad gcc-16-20260315/libgomp/target.c gcc-16-20260322/libgomp/target.c
*** gcc-16-20260315/libgomp/target.c	Sun Mar 15 22:32:16 2026
--- gcc-16-20260322/libgomp/target.c	Sun Mar 22 22:32:15 2026
*************** gomp_exit_data (struct gomp_device_descr
*** 4308,4313 ****
--- 4308,4317 ----
        gomp_mutex_unlock (&devicep->lock);
        return;
      }
+   size_t *iterator_count = NULL;
+   bool iterators_p = false;
+   iterators_p = gomp_merge_iterator_maps (&mapnum, &hostaddrs, &sizes,
+ 					  (void**) &kinds, &iterator_count);
  
    for (i = 0; i < mapnum; i++)
      if ((kinds[i] & typemask) == GOMP_MAP_DETACH)
*************** gomp_exit_data (struct gomp_device_descr
*** 4407,4412 ****
--- 4411,4424 ----
      gomp_remove_var (devicep, remove_vars[i]);
  
    gomp_mutex_unlock (&devicep->lock);
+ 
+   if (iterators_p)
+     {
+       free (hostaddrs);
+       free (sizes);
+       free (kinds);
+       free (iterator_count);
+     }
  }
  
  void
diff -Nrcpad gcc-16-20260315/libgomp/testsuite/libgomp.c/alloc_cache-1.c gcc-16-20260322/libgomp/testsuite/libgomp.c/alloc_cache-1.c
*** gcc-16-20260315/libgomp/testsuite/libgomp.c/alloc_cache-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libgomp/testsuite/libgomp.c/alloc_cache-1.c	Sun Mar 22 22:32:15 2026
***************
*** 0 ****
--- 1,62 ----
+ /* { dg-do run } */
+ /* Unit-test the alloc cache DS.  */
+ #include <assert.h>
+ #include <stdint.h>
+ 
+ #include "alloc_cache.h"
+ 
+ int
+ main ()
+ {
+   struct alloc_cache cache;
+ 
+   init_alloc_cache (&cache);
+ 
+   /* Empty cache.  Should return NULL.  */
+   assert (alloc_cache_try_find (&cache, 16) == NULL);
+   assert (alloc_cache_try_find (&cache, 0) == NULL);
+ 
+   /* Populating it a bit.  */
+   {
+     for (int i = 0; i < 5; i++)
+       {
+ 	uintptr_t x = 1 << i;
+ 	__auto_type n = alloc_cache_add_taken_node (&cache, (void *) x, x);
+ 	assert (n);
+ 	assert (n->allocation == (void *)x);
+ 	release_alloc_cache_node (n);
+       }
+   }
+ 
+   /* Taking five things, each of size 1, should return the whole cache.  */
+   {
+     struct alloc_cache_node *n[5];
+     uint32_t gotten_nodes = 0;
+     for (int i = 0; i < 5; i++)
+       {
+ 	__auto_type node = n[i] = alloc_cache_try_find (&cache, 1);
+ 	uintptr_t x = (uintptr_t) node->allocation;
+ 	gotten_nodes |= x;
+ 	assert (x == 1
+ 		|| x == 2
+ 		|| x == 4
+ 		|| x == 8
+ 		|| x == 16);
+       }
+     assert (gotten_nodes == 0b11111);
+ 
+     /* ... and the cache should remain empty.  */
+     assert (alloc_cache_try_find (&cache, 0) == NULL);
+ 
+     for (int i = 0; i < 5; i++)
+       release_alloc_cache_node (n[i]);
+   }
+ 
+   /* Taking 16 twice should fail the second time.  */
+   {
+     __auto_type n = alloc_cache_try_find (&cache, 16);
+     assert (n != NULL && ((uintptr_t) n->allocation) == 16);
+     assert (alloc_cache_try_find (&cache, 16) == NULL);
+     release_alloc_cache_node (n);
+   }
+ }
diff -Nrcpad gcc-16-20260315/libgomp/testsuite/libgomp.c-c++-common/target-data-iterators-1.c gcc-16-20260322/libgomp/testsuite/libgomp.c-c++-common/target-data-iterators-1.c
*** gcc-16-20260315/libgomp/testsuite/libgomp.c-c++-common/target-data-iterators-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libgomp/testsuite/libgomp.c-c++-common/target-data-iterators-1.c	Sun Mar 22 22:32:15 2026
***************
*** 0 ****
--- 1,45 ----
+ /* { dg-do run } */
+ /* { dg-require-effective-target offload_device_nonshared_as } */
+ 
+ /* This testcase used to ICE.  Test that an array can appear more than once
+    in map clauses in combination with iterators.  */
+ 
+ #include <stdlib.h>
+ 
+ #define DIM 128
+ 
+ void
+ make_array (int *x[], int dim)
+ {
+   for (int i = 0; i < DIM; i++)
+     {
+       x[i] = (int *) malloc (sizeof (int));
+       *(x[i]) = i;
+     }
+ }
+ 
+ int
+ check_array (int *x[], int dim)
+ {
+   for (int i = 0; i < DIM; i++)
+     if (*(x[i]) != -i)
+       return 1;
+   return 0;
+ }
+ 
+ int
+ main (void)
+ {
+   int *x[DIM];
+   make_array (x, DIM);
+ 
+ #pragma omp target data map (iterator(it = 0:DIM), tofrom: x[it][:1]) \
+ 			map (to: x)
+ #pragma omp target
+     {
+       for (int i = 0; i < DIM; i++)
+ 	x[i][0] = -x[i][0];
+     }
+ 
+   return check_array (x, DIM);
+ }
diff -Nrcpad gcc-16-20260315/libgomp/testsuite/libgomp.c-c++-common/target-enter-data-iterators-1.c gcc-16-20260322/libgomp/testsuite/libgomp.c-c++-common/target-enter-data-iterators-1.c
*** gcc-16-20260315/libgomp/testsuite/libgomp.c-c++-common/target-enter-data-iterators-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libgomp/testsuite/libgomp.c-c++-common/target-enter-data-iterators-1.c	Sun Mar 22 22:32:15 2026
***************
*** 0 ****
--- 1,46 ----
+ /* { dg-do run } */
+ /* { dg-require-effective-target offload_device_nonshared_as } */
+ 
+ /* This testcase used to ICE.  Test that an array can appear more than once
+    in map clauses in combination with iterators.  */
+ 
+ #include <stdlib.h>
+ 
+ #define DIM 128
+ 
+ void
+ make_array (int *x[], int dim)
+ {
+   for (int i = 0; i < DIM; i++)
+     {
+       x[i] = (int *) malloc (sizeof (int));
+       *(x[i]) = i;
+     }
+ }
+ 
+ int
+ check_array (int *x[], int dim)
+ {
+   for (int i = 0; i < DIM; i++)
+     if (*(x[i]) != -i)
+       return 1;
+   return 0;
+ }
+ 
+ int
+ main (void)
+ {
+   int *x[DIM];
+   make_array (x, DIM);
+ 
+ #pragma omp target enter data map (iterator(it = 0:DIM), to: x[it][:1]) \
+ 			      map (to: x)
+ #pragma omp target
+     {
+       for (int i = 0; i < DIM; i++)
+ 	x[i][0] = -x[i][0];
+     }
+ #pragma omp target exit data map (iterator(it = 0:DIM), from: x[it][:1])
+ #pragma omp target exit data map (release: x)
+   return check_array (x, DIM);
+ }
diff -Nrcpad gcc-16-20260315/libgomp/testsuite/libgomp.c-c++-common/target-update-iterators-2.c gcc-16-20260322/libgomp/testsuite/libgomp.c-c++-common/target-update-iterators-2.c
*** gcc-16-20260315/libgomp/testsuite/libgomp.c-c++-common/target-update-iterators-2.c	Sun Mar 15 22:32:16 2026
--- gcc-16-20260322/libgomp/testsuite/libgomp.c-c++-common/target-update-iterators-2.c	Sun Mar 22 22:32:15 2026
*************** int main (void)
*** 54,58 ****
--- 54,74 ----
    for (int i = 0; i < DIM1; i++)
      for (int j = 0; j < DIM2; j++)
        sum += x[i][j];
+ 
+   /* Modify device copy again.  */
+   #pragma omp target map(present, alloc: x)
+     for (int i = 0; i < DIM1; i++)
+       for (int j = 0; j < DIM2; j++)
+ 	x[i][j] = (i + 1) * (j + 2) + 42;
+ 
+   /* Copy back to the host and check.  */
+   #pragma omp target exit data map(iterator(i=0:DIM1), from: x[i][ :DIM2])
+   #pragma omp target exit data map(release: x[ :DIM1])
+ 
+   for (int i = 0; i < DIM1; i++)
+     for (int j = 0; j < DIM2; j++)
+       if (x[i][j] != (i + 1) * (j + 2) + 42)
+ 	__builtin_abort ();
+ 
    return sum - expected;
  }
diff -Nrcpad gcc-16-20260315/libgomp/testsuite/libgomp.c-c++-common/target-update-iterators-3.c gcc-16-20260322/libgomp/testsuite/libgomp.c-c++-common/target-update-iterators-3.c
*** gcc-16-20260315/libgomp/testsuite/libgomp.c-c++-common/target-update-iterators-3.c	Sun Mar 15 22:32:16 2026
--- gcc-16-20260322/libgomp/testsuite/libgomp.c-c++-common/target-update-iterators-3.c	Sun Mar 22 22:32:15 2026
*************** int main (void)
*** 63,67 ****
--- 63,70 ----
      for (int j = 0; j < DIM2; j++)
        expected += x_new[i][j];
  
+   #pragma omp target exit data map(iterator(i=0:DIM1), release: x[i][ :DIM2])
+   #pragma omp target exit data map(release: x[ :DIM1])
+ 
    return sum - expected;
  }
diff -Nrcpad gcc-16-20260315/libgomp/testsuite/libgomp.fortran/pr120286.f90 gcc-16-20260322/libgomp/testsuite/libgomp.fortran/pr120286.f90
*** gcc-16-20260315/libgomp/testsuite/libgomp.fortran/pr120286.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libgomp/testsuite/libgomp.fortran/pr120286.f90	Sun Mar 22 22:32:15 2026
***************
*** 0 ****
--- 1,49 ----
+ ! { dg-do run }
+ !
+ ! PR fortran/120286 - scalar class pointers in OpenMP private/firstprivate
+ ! clauses must preserve association status without taking ownership.
+ 
+ program main
+   implicit none
+ 
+   type foo_t
+     integer :: dummy
+   end type foo_t
+ 
+   type fooPtr_t
+     class(foo_t), pointer :: p
+   end type fooPtr_t
+ 
+   type fooPtrStack_t
+     class(fooPtr_t), allocatable :: list(:)
+   end type fooPtrStack_t
+ 
+   type(fooPtrStack_t) :: x
+   class(foo_t), pointer :: ptr
+   integer :: it, n
+   logical :: ok
+ 
+   allocate (x%list(1))
+   allocate (x%list(1)%p)
+   x%list(1)%p%dummy = 7
+ 
+   do it = 1, 16
+ !$omp parallel do default(none) num_threads(2) private(n, ptr) shared(x)
+     do n = 1, 1
+       ptr => x%list(n)%p
+     end do
+ !$omp end parallel do
+   end do
+ 
+   if (.not. associated (x%list(1)%p)) stop 1
+   if (x%list(1)%p%dummy /= 7) stop 2
+ 
+   ptr => x%list(1)%p
+   ok = .false.
+ 
+ !$omp parallel default(none) num_threads(1) firstprivate(ptr) shared(x, ok)
+   ok = associated (ptr, x%list(1)%p) .and. ptr%dummy == 7
+ !$omp end parallel
+ 
+   if (.not. ok) stop 3
+ end program main
diff -Nrcpad gcc-16-20260315/libstdc++-v3/ChangeLog gcc-16-20260322/libstdc++-v3/ChangeLog
*** gcc-16-20260315/libstdc++-v3/ChangeLog	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/ChangeLog	Sun Mar 22 22:32:15 2026
***************
*** 1,3 ****
--- 1,263 ----
+ 2026-03-21  Matthias Kretz  <m.kretz@gsi.de>
+ 
+ 	* include/Makefile.am: Add simd headers.
+ 	* include/Makefile.in: Regenerate.
+ 	* include/bits/version.def (simd): New.
+ 	* include/bits/version.h: Regenerate.
+ 	* include/bits/simd_alg.h: New file.
+ 	* include/bits/simd_details.h: New file.
+ 	* include/bits/simd_flags.h: New file.
+ 	* include/bits/simd_iterator.h: New file.
+ 	* include/bits/simd_loadstore.h: New file.
+ 	* include/bits/simd_mask.h: New file.
+ 	* include/bits/simd_mask_reductions.h: New file.
+ 	* include/bits/simd_reductions.h: New file.
+ 	* include/bits/simd_vec.h: New file.
+ 	* include/bits/simd_x86.h: New file.
+ 	* include/bits/vec_ops.h: New file.
+ 	* include/std/simd: New file.
+ 	* testsuite/std/simd/arithmetic.cc: New test.
+ 	* testsuite/std/simd/arithmetic_expensive.cc: New test.
+ 	* testsuite/std/simd/create_tests.h: New file.
+ 	* testsuite/std/simd/creation.cc: New test.
+ 	* testsuite/std/simd/creation_expensive.cc: New test.
+ 	* testsuite/std/simd/loads.cc: New test.
+ 	* testsuite/std/simd/loads_expensive.cc: New test.
+ 	* testsuite/std/simd/mask2.cc: New test.
+ 	* testsuite/std/simd/mask2_expensive.cc: New test.
+ 	* testsuite/std/simd/mask.cc: New test.
+ 	* testsuite/std/simd/mask_expensive.cc: New test.
+ 	* testsuite/std/simd/reductions.cc: New test.
+ 	* testsuite/std/simd/reductions_expensive.cc: New test.
+ 	* testsuite/std/simd/shift_left.cc: New test.
+ 	* testsuite/std/simd/shift_left_expensive.cc: New test.
+ 	* testsuite/std/simd/shift_right.cc: New test.
+ 	* testsuite/std/simd/shift_right_expensive.cc: New test.
+ 	* testsuite/std/simd/simd_alg.cc: New test.
+ 	* testsuite/std/simd/simd_alg_expensive.cc: New test.
+ 	* testsuite/std/simd/sse_intrin.cc: New test.
+ 	* testsuite/std/simd/stores.cc: New test.
+ 	* testsuite/std/simd/stores_expensive.cc: New test.
+ 	* testsuite/std/simd/test_setup.h: New file.
+ 	* testsuite/std/simd/traits_common.cc: New test.
+ 	* testsuite/std/simd/traits_impl.cc: New test.
+ 	* testsuite/std/simd/traits_math.cc: New test.
+ 
+ 2026-03-20  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	PR libstdc++/122567
+ 	* src/c++20/tzdb.cc (tzdb::current_zone): Loop over all trailing
+ 	components of /etc/localtime path. Use readlink instead of
+ 	std::filesystem::read_symlink.
+ 
+ 2026-03-20  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* src/c++20/tzdb.cc [_AIX]: Change #ifndef to #ifdef.
+ 
+ 2026-03-20  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	PR libstdc++/124568
+ 	* testsuite/24_iterators/istreambuf_iterator/105580.cc: Add
+ 	no_pch option.
+ 
+ 2026-03-20  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* src/c++17/fs_path.cc (path::operator+=): Use pointer
+ 	comparison to detect aliasing instead of a loop.
+ 
+ 2026-03-20  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/std/generator (_Stateless_alloc): Swap order of
+ 	constraints.
+ 
+ 2026-03-19  François Dumont  <frs.dumont@gmail.com>
+ 
+ 	* src/c++11/debug.cc (_Safe_sequence_base::_M_detach_single): Do not
+ 	check if input iterator is equal to _M_iterators if already equals to
+ 	_M_const_iterators.
+ 	(_Safe_unordered_container_base::_M_detach_local_single): Do not check
+ 	if input local iterator is equal to _M_local_iterators if already equals
+ 	to _M_const_local_iterators.
+ 
+ 2026-03-19  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR libstdc++/121790
+ 	* src/c++23/std.cc.in: Add enable_nonlocking_formatter_optimization.
+ 
+ 2026-03-19  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR libstdc++/118030
+ 	* src/c++23/std.cc.in: Add allocation_result.
+ 
+ 2026-03-19  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/120775
+ 	* src/c++23/std.cc.in: Add is_reflection{,_v} and
+ 	is_consteval_only{,_v}.
+ 
+ 2026-03-19  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR libstdc++/119794
+ 	* src/c++23/std.cc.in: Add philox_engine and philox4x{32,64}.
+ 
+ 2026-03-19  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	* src/c++23/std.cc.in: Export views::indices.
+ 
+ 2026-03-19  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	PR libstdc++/124513
+ 	* src/c++20/tzdb.cc (operator>>(istream&, at_time::Indicator&)):
+ 	Do not peek at the next character if eofbit is already set.
+ 	(istream& operator>>(istream&, at_time&)): Skip whitespace
+ 	before the first character. Handle EOF when parsing "-" as time.
+ 	Do not peek for ":" or "." if eofbit already set.
+ 	* testsuite/std/time/time_zone/116110.cc (test_apia): Remove
+ 	offset of 24h now that the UNTIL time is parsed correctly.
+ 	* testsuite/std/time/time_zone/124513.cc: New test.
+ 
+ 2026-03-19  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	PR libstdc++/116110
+ 	* src/c++20/tzdb.cc (operator>>(istream&, ZoneInfo&)): Adjust
+ 	inf.m_until according to indicator suffix on AT time in UNTIL.
+ 	* testsuite/std/time/time_zone/116110.cc (test_kiritimati):
+ 	Remove FIXME now that the UNTIL time is adjusted for STDOFF.
+ 	(test_apia): Adjust FIXME now that UNTIL time is adusted for
+ 	STDOFF.
+ 	* testsuite/std/time/time_zone/get_info_sys.cc: Adjust expected
+ 	results to account for corrected logic.
+ 	* testsuite/std/time/zoned_time/1.cc: Likewise.
+ 
+ 2026-03-19  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	PR libstdc++/116110
+ 	* src/c++20/tzdb.cc (time_zone::_M_get_sys_info): Update
+ 	info.offset and info.save to values from the active rule.
+ 	* testsuite/std/time/time_zone/116110.cc: New test.
+ 
+ 2026-03-18  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* testsuite/17_intro/names.cc (ext, max_iter, ret, subs, Rg, Rs):
+ 	Define macros.
+ 	[__cplusplus < 201103] (mutex): Define macro.
+ 
+ 2026-03-18  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/experimental/bits/fs_path.h (path::stem)
+ 	(path::extension, path::has_stem, path::has_extension): Uglify
+ 	ext variable name.
+ 
+ 2026-03-18  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	* include/bits/regex_compiler.h (_Compiler::_M_pop): Uglify ret
+ 	variable name.
+ 
+ 2026-03-18  Tomasz Kamiński  <tkaminsk@redhat.com>
+ 
+ 	* include/std/mdspan (__mdspan::__index_type_cast): Handle
+ 	forwarding referene and use forward for class types.
+ 	* testsuite/23_containers/mdspan/int_like.h (ConstLValueInt)
+ 	(CustomIndexKind::ConstLValue): Define.
+ 	(CustomIndexType): Handle CustomIndexKind::ConstLValue.
+ 	* testsuite/23_containers/mdspan/at.cc: Test with ConstLValueInt.
+ 	* testsuite/23_containers/mdspan/extents/custom_integer.cc: Likewise.
+ 	* testsuite/23_containers/mdspan/mdspan.cc: Likewise.
+ 
+ 2026-03-17  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/bits/chrono_io.h (__formatter_duration::_S_subseconds):
+ 	Uglify subs variable name.
+ 	* include/bits/fs_path.h (path::stem, path::extension)
+ 	(path::has_stem, path::has_extension): Uglify ext parameter
+ 	name.
+ 	* include/ext/concurrence.h (__cond::wait, __cond::wait_recursive):
+ 	Uglify mutex parameter names.
+ 	* include/pstl/glue_algorithm_defs.h (generate_n): Uglify count
+ 	parameter name.
+ 	* include/std/ranges (zip_transform_view): Uglify Rs template
+ 	parameter name.
+ 	(__cartesian_is_sized_sentinel): Uglify FirstSent template
+ 	parameter name.
+ 	* include/tr1/riemann_zeta.tcc: Uglify max_size variable name.
+ 
+ 2026-03-17  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	PR libstdc++/124463
+ 	* include/bits/deque.tcc (__uninitialized_copy_a): Define
+ 	overloads for input and output iterators being std::deque
+ 	iterators, and for only the output iterator being a std::deque
+ 	iterator.
+ 	(__uninitialized_move_a): Overload for input and output
+ 	iterators being std::deque iterators.
+ 	* include/bits/stl_uninitialized.h (__uninitialized_copy_a)
+ 	(__uninitialized_move_a): Declare overloads for std::deque
+ 	iterators.
+ 
+ 2026-03-17  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	Revert:
+ 	2026-03-16  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	PR libstdc++/124268
+ 	* config/abi/pre/gnu.ver: Export symbols.
+ 	* src/Makefile.am: Add libmodulesconvenience.la to libstdc++
+ 	link.
+ 	* src/Makefile.in: Regenerate.
+ 	* src/c++23/Makefile.am: Create libmodulesconvenience.la
+ 	and populate it with std.o and std.compat.o interface units.
+ 	Add clean-local target.
+ 	* src/c++23/Makefile.in: Regenerate.
+ 
+ 2026-03-17  Tomasz Kamiński  <tkaminsk@redhat.com>
+ 
+ 	* testsuite/23_containers/mdspan/extents/ctor_ints.cc: Updated
+ 	is_explicit, and added more test cases.
+ 
+ 2026-03-16  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	PR libstdc++/124268
+ 	* config/abi/pre/gnu.ver: Export symbols.
+ 	* src/Makefile.am: Add libmodulesconvenience.la to libstdc++
+ 	link.
+ 	* src/Makefile.in: Regenerate.
+ 	* src/c++23/Makefile.am: Create libmodulesconvenience.la
+ 	and populate it with std.o and std.compat.o interface units.
+ 	Add clean-local target.
+ 	* src/c++23/Makefile.in: Regenerate.
+ 
+ 2026-03-16  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/bits/ranges_base.h (distance(It&&, Sent)): Only decay
+ 	arrays to pointers when the type is actually an array, as per
+ 	LWG 4242.
+ 	* testsuite/24_iterators/range_operations/distance.cc: Add test
+ 	for LWG 4242.
+ 
+ 2026-03-16  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* testsuite/29_atomics/atomic/compare_exchange_padding.cc:
+ 	Rewrite to be robust against spurious failures of weak compare
+ 	exchange, and to check padding bits more directly.
+ 
+ 2026-03-16  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/bits/allocator.h (allocator::allocate): Use specific
+ 	feature test macro for constexpr allocate and deallocate. Make
+ 	consteval path a discarded statement if sizeof(T) is ill-formed.
+ 	* include/bits/new_allocator.h (__new_allocator::allocate): Use
+ 	requires-expression for static_cast. Make function body a
+ 	discarded stament if sizeof(T) is ill-formed. Use if-constexpr
+ 	for alignment checks.
+ 
+ 2026-03-15  François Dumont  <frs.dumont@gmail.com>
+ 
+ 	PR libstdc++/124444
+ 	* include/debug/safe_sequence.h (_Safe_sequence::_M_invalidate_if_impl): New.
+ 	(_Safe_sequence::_M_invalidate_if): Call later if not __is_constant_evaluated.
+ 	* include/debug/safe_sequence.tcc: Rename _M_invalidate_if into
+ 	_M_invalidate_if_impl and remove C++20 constexpr.
+ 
  2026-03-14  Jonathan Wakely  <jwakely@redhat.com>
  
  	* include/std/text_encoding: Fix @since in Doxygen comment.
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/Makefile.am gcc-16-20260322/libstdc++-v3/include/Makefile.am
*** gcc-16-20260315/libstdc++-v3/include/Makefile.am	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/include/Makefile.am	Sun Mar 22 22:32:15 2026
*************** std_headers = \
*** 100,105 ****
--- 100,106 ----
  	${std_srcdir}/semaphore \
  	${std_srcdir}/set \
  	${std_srcdir}/shared_mutex \
+ 	${std_srcdir}/simd \
  	${std_srcdir}/spanstream \
  	${std_srcdir}/sstream \
  	${std_srcdir}/syncstream \
*************** bits_headers = \
*** 264,269 ****
--- 265,280 ----
  	${bits_srcdir}/shared_ptr.h \
  	${bits_srcdir}/shared_ptr_atomic.h \
  	${bits_srcdir}/shared_ptr_base.h \
+ 	${bits_srcdir}/simd_alg.h \
+ 	${bits_srcdir}/simd_details.h \
+ 	${bits_srcdir}/simd_flags.h \
+ 	${bits_srcdir}/simd_iterator.h \
+ 	${bits_srcdir}/simd_loadstore.h \
+ 	${bits_srcdir}/simd_mask.h \
+ 	${bits_srcdir}/simd_mask_reductions.h \
+ 	${bits_srcdir}/simd_reductions.h \
+ 	${bits_srcdir}/simd_vec.h \
+ 	${bits_srcdir}/simd_x86.h \
  	${bits_srcdir}/slice_array.h \
  	${bits_srcdir}/specfun.h \
  	${bits_srcdir}/sstream.tcc \
*************** bits_headers = \
*** 296,301 ****
--- 307,313 ----
  	${bits_srcdir}/valarray_array.tcc \
  	${bits_srcdir}/valarray_before.h \
  	${bits_srcdir}/valarray_after.h \
+ 	${bits_srcdir}/vec_ops.h \
  	${bits_srcdir}/vector.tcc
  endif GLIBCXX_HOSTED
  
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/Makefile.in gcc-16-20260322/libstdc++-v3/include/Makefile.in
*** gcc-16-20260315/libstdc++-v3/include/Makefile.in	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/include/Makefile.in	Sun Mar 22 22:32:15 2026
*************** std_freestanding = \
*** 459,464 ****
--- 459,465 ----
  @GLIBCXX_HOSTED_TRUE@	${std_srcdir}/semaphore \
  @GLIBCXX_HOSTED_TRUE@	${std_srcdir}/set \
  @GLIBCXX_HOSTED_TRUE@	${std_srcdir}/shared_mutex \
+ @GLIBCXX_HOSTED_TRUE@	${std_srcdir}/simd \
  @GLIBCXX_HOSTED_TRUE@	${std_srcdir}/spanstream \
  @GLIBCXX_HOSTED_TRUE@	${std_srcdir}/sstream \
  @GLIBCXX_HOSTED_TRUE@	${std_srcdir}/syncstream \
*************** bits_freestanding = \
*** 620,625 ****
--- 621,636 ----
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/shared_ptr.h \
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/shared_ptr_atomic.h \
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/shared_ptr_base.h \
+ @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/simd_alg.h \
+ @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/simd_details.h \
+ @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/simd_flags.h \
+ @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/simd_iterator.h \
+ @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/simd_loadstore.h \
+ @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/simd_mask.h \
+ @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/simd_mask_reductions.h \
+ @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/simd_reductions.h \
+ @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/simd_vec.h \
+ @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/simd_x86.h \
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/slice_array.h \
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/specfun.h \
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/sstream.tcc \
*************** bits_freestanding = \
*** 652,657 ****
--- 663,669 ----
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/valarray_array.tcc \
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/valarray_before.h \
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/valarray_after.h \
+ @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/vec_ops.h \
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/vector.tcc
  
  bits_host_headers = \
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/allocator.h gcc-16-20260322/libstdc++-v3/include/bits/allocator.h
*** gcc-16-20260315/libstdc++-v3/include/bits/allocator.h	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/include/bits/allocator.h	Sun Mar 22 22:32:15 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 188,198 ****
  #endif
        ~allocator() _GLIBCXX_NOTHROW { }
  
! #if __cplusplus > 201703L
        [[nodiscard,__gnu__::__always_inline__]]
        constexpr _Tp*
        allocate(size_t __n)
        {
  	if (std::__is_constant_evaluated())
  	  {
  	    if (__builtin_mul_overflow(__n, sizeof(_Tp), &__n))
--- 188,201 ----
  #endif
        ~allocator() _GLIBCXX_NOTHROW { }
  
! #if __cpp_constexpr_dynamic_alloc // >= C++20
        [[nodiscard,__gnu__::__always_inline__]]
        constexpr _Tp*
        allocate(size_t __n)
        {
+ #if __cpp_concepts
+ 	if constexpr (requires { sizeof(_Tp); })
+ #endif
  	if (std::__is_constant_evaluated())
  	  {
  	    if (__builtin_mul_overflow(__n, sizeof(_Tp), &__n))
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/chrono_io.h gcc-16-20260322/libstdc++-v3/include/bits/chrono_io.h
*** gcc-16-20260315/libstdc++-v3/include/bits/chrono_io.h	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/include/bits/chrono_io.h	Sun Mar 22 22:32:15 2026
*************** namespace __format
*** 1882,1889 ****
  	   {
  	     using _Attoseconds = _ChronoData<_CharT>::_Attoseconds;
  	     using _CRep = common_type_t<_Rep, typename _Attoseconds::rep>;
! 	     chrono::duration<_CRep, _Period> subs(__d.count());
! 	     return chrono::duration_cast<_Attoseconds>(subs);
  	   }
         }
  
--- 1882,1889 ----
  	   {
  	     using _Attoseconds = _ChronoData<_CharT>::_Attoseconds;
  	     using _CRep = common_type_t<_Rep, typename _Attoseconds::rep>;
! 	     chrono::duration<_CRep, _Period> __subs(__d.count());
! 	     return chrono::duration_cast<_Attoseconds>(__subs);
  	   }
         }
  
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/deque.tcc gcc-16-20260322/libstdc++-v3/include/bits/deque.tcc
*** gcc-16-20260315/libstdc++-v3/include/bits/deque.tcc	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/include/bits/deque.tcc	Sun Mar 22 22:32:15 2026
*************** _GLIBCXX_END_NAMESPACE_CONTAINER
*** 1549,1554 ****
--- 1549,1648 ----
        return __last2 != __first2;
      }
  
+ #if __cplusplus >= 201103L
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
+   template<typename _ITp, typename _IRef, typename _IPtr, typename _OTp,
+ 	   typename _Tp>
+     _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*>
+     __uninitialized_copy_a(
+       _GLIBCXX_STD_C::_Deque_iterator<_ITp, _IRef, _IPtr> __first,
+       _GLIBCXX_STD_C::_Deque_iterator<_ITp, _IRef, _IPtr> __last,
+       _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*> __result,
+       allocator<_Tp>&)
+     {
+       // In order to unwind all initialized elements, we just use the default
+       // implementation if construction can throw.
+       if constexpr (!__is_nothrow_constructible(_OTp, _IRef))
+ 	return std::__do_uninit_copy(__first, __last, __result);
+       else
+ 	while (__first != __last)
+ 	  {
+ 	    auto __from = __first._M_cur;
+ 	    ptrdiff_t __n;
+ 	    if (__first._M_node == __last._M_node)
+ 	      __n = __last._M_cur - __from;
+ 	    else
+ 	      __n = __first._M_last - __from;
+ 	    _OTp* __sres = __result._M_cur;
+ 	    __n = std::min<ptrdiff_t>(__n, __result._M_last - __result._M_cur);
+ 	    std::uninitialized_copy(__from, __from + __n, __result._M_cur);
+ 	    __first += __n;
+ 	    __result += __n;
+ 	  }
+       return __result;
+     }
+ 
+   template<typename _Iter, typename _OTp, typename _Tp>
+     __enable_if_t<__is_random_access_iter<_Iter>::value,
+ 		  _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*>>
+     __uninitialized_copy_a(_Iter __first, _Iter __last,
+       _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*> __result,
+       allocator<_Tp>&)
+     {
+       // In order to unwind all initialized elements, we just use the default
+       // implementation if construction can throw.
+       if constexpr (!__is_nothrow_constructible(_OTp, decltype(*__first)))
+ 	return std::__do_uninit_copy(__first, __last, __result);
+       else
+ 	while (__first != __last)
+ 	  {
+ 	    auto __n = std::min<ptrdiff_t>(__last - __first,
+ 					   __result._M_last - __result._M_cur);
+ 	    std::uninitialized_copy(__first, __first + __n, __result._M_cur);
+ 	    __first += __n;
+ 	    __result += __n;
+ 	  }
+       return __result;
+     }
+ 
+   template<typename _ITp, typename _IRef, typename _IPtr, typename _OTp,
+ 	   typename _Tp>
+     _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*>
+     __uninitialized_move_a(
+       _GLIBCXX_STD_C::_Deque_iterator<_ITp, _IRef, _IPtr> __first,
+       _GLIBCXX_STD_C::_Deque_iterator<_ITp, _IRef, _IPtr> __last,
+       _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*> __result,
+       allocator<_Tp>&)
+     {
+       // In order to unwind all initialized elements, we just use the default
+       // implementation if construction can throw.
+       if constexpr (!__is_nothrow_constructible(_OTp,
+ 						decltype(std::move(*__first))))
+ 	return std::uninitialized_copy(std::make_move_iterator(__first),
+ 				       std::make_move_iterator(__last),
+ 				       __result);
+       else
+ 	while (__first != __last)
+ 	  {
+ 	    auto __from = __first._M_cur;
+ 	    ptrdiff_t __n;
+ 	    if (__first._M_node == __last._M_node)
+ 	      __n = __last._M_cur - __from;
+ 	    else
+ 	      __n = __first._M_last - __from;
+ 	    __n = std::min<ptrdiff_t>(__n, __result._M_last - __result._M_cur);
+ 	    std::uninitialized_copy(std::make_move_iterator(__from),
+ 				    std::make_move_iterator(__from + __n),
+ 				    __result._M_cur);
+ 	    __first += __n;
+ 	    __result += __n;
+ 	  }
+       return __result;
+     }
+ #pragma GCC diagnostic pop
+ #endif // C++11
+ 
  _GLIBCXX_END_NAMESPACE_VERSION
  } // namespace std
  
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/fs_path.h gcc-16-20260322/libstdc++-v3/include/bits/fs_path.h
*** gcc-16-20260315/libstdc++-v3/include/bits/fs_path.h	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/include/bits/fs_path.h	Sun Mar 22 22:32:15 2026
*************** namespace __detail
*** 1304,1336 ****
    inline path
    path::stem() const
    {
!     auto ext = _M_find_extension();
!     if (ext.first && ext.second != 0)
!       return path{ext.first->substr(0, ext.second)};
      return {};
    }
  
    inline path
    path::extension() const
    {
!     auto ext = _M_find_extension();
!     if (ext.first && ext.second != string_type::npos)
!       return path{ext.first->substr(ext.second)};
      return {};
    }
  
    inline bool
    path::has_stem() const noexcept
    {
!     auto ext = _M_find_extension();
!     return ext.first && ext.second != 0;
    }
  
    inline bool
    path::has_extension() const noexcept
    {
!     auto ext = _M_find_extension();
!     return ext.first && ext.second != string_type::npos;
    }
  
    inline bool
--- 1304,1336 ----
    inline path
    path::stem() const
    {
!     auto __ext = _M_find_extension();
!     if (__ext.first && __ext.second != 0)
!       return path{__ext.first->substr(0, __ext.second)};
      return {};
    }
  
    inline path
    path::extension() const
    {
!     auto __ext = _M_find_extension();
!     if (__ext.first && __ext.second != string_type::npos)
!       return path{__ext.first->substr(__ext.second)};
      return {};
    }
  
    inline bool
    path::has_stem() const noexcept
    {
!     auto __ext = _M_find_extension();
!     return __ext.first && __ext.second != 0;
    }
  
    inline bool
    path::has_extension() const noexcept
    {
!     auto __ext = _M_find_extension();
!     return __ext.first && __ext.second != string_type::npos;
    }
  
    inline bool
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/new_allocator.h gcc-16-20260322/libstdc++-v3/include/bits/new_allocator.h
*** gcc-16-20260315/libstdc++-v3/include/bits/new_allocator.h	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/include/bits/new_allocator.h	Sun Mar 22 22:32:15 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 120,125 ****
--- 120,128 ----
  # define _GLIBCXX_OPERATOR_DELETE ::operator delete
  #endif
  
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
+ 
        // NB: __n is permitted to be 0.  The C++ standard says nothing
        // about what the return value is when __n == 0.
        _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR _Tp*
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 128,136 ****
  #if __cplusplus >= 201103L
  	// _GLIBCXX_RESOLVE_LIB_DEFECTS
  	// 3308. std::allocator<void>().allocate(n)
  	static_assert(sizeof(_Tp) != 0, "cannot allocate incomplete types");
! #endif
  
  	if (__builtin_expect(__n > this->_M_max_size(), false))
  	  {
  	    // _GLIBCXX_RESOLVE_LIB_DEFECTS
--- 131,147 ----
  #if __cplusplus >= 201103L
  	// _GLIBCXX_RESOLVE_LIB_DEFECTS
  	// 3308. std::allocator<void>().allocate(n)
+ #if ! __cpp_concepts
  	static_assert(sizeof(_Tp) != 0, "cannot allocate incomplete types");
! #else
! 	static_assert(requires { sizeof(_Tp); },
! 	  "cannot allocate incomplete types");
  
+ 	if constexpr (!requires { sizeof(_Tp); })
+ 	  return nullptr; // static_assert already failed
+ 	else
+ #endif
+ #endif
  	if (__builtin_expect(__n > this->_M_max_size(), false))
  	  {
  	    // _GLIBCXX_RESOLVE_LIB_DEFECTS
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 139,154 ****
  	      std::__throw_bad_array_new_length();
  	    std::__throw_bad_alloc();
  	  }
- 
  #if __cpp_aligned_new && __cplusplus >= 201103L
! 	if (alignof(_Tp) > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
  	  {
  	    std::align_val_t __al = std::align_val_t(alignof(_Tp));
  	    return static_cast<_Tp*>(_GLIBCXX_OPERATOR_NEW(__n * sizeof(_Tp),
  							   __al));
  	  }
  #endif
! 	return static_cast<_Tp*>(_GLIBCXX_OPERATOR_NEW(__n * sizeof(_Tp)));
        }
  
        // __p is not permitted to be a null pointer.
--- 150,165 ----
  	      std::__throw_bad_array_new_length();
  	    std::__throw_bad_alloc();
  	  }
  #if __cpp_aligned_new && __cplusplus >= 201103L
! 	else if constexpr (alignof(_Tp) > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
  	  {
  	    std::align_val_t __al = std::align_val_t(alignof(_Tp));
  	    return static_cast<_Tp*>(_GLIBCXX_OPERATOR_NEW(__n * sizeof(_Tp),
  							   __al));
  	  }
  #endif
! 	else
! 	  return static_cast<_Tp*>(_GLIBCXX_OPERATOR_NEW(__n * sizeof(_Tp)));
        }
  
        // __p is not permitted to be a null pointer.
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 162,168 ****
  #endif
  
  #if __cpp_aligned_new && __cplusplus >= 201103L
! 	if (alignof(_Tp) > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
  	  {
  	    _GLIBCXX_OPERATOR_DELETE(_GLIBCXX_SIZED_DEALLOC(__p, __n),
  				     std::align_val_t(alignof(_Tp)));
--- 173,179 ----
  #endif
  
  #if __cpp_aligned_new && __cplusplus >= 201103L
! 	if constexpr (alignof(_Tp) > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
  	  {
  	    _GLIBCXX_OPERATOR_DELETE(_GLIBCXX_SIZED_DEALLOC(__p, __n),
  				     std::align_val_t(alignof(_Tp)));
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 172,177 ****
--- 183,189 ----
  	_GLIBCXX_OPERATOR_DELETE(_GLIBCXX_SIZED_DEALLOC(__p, __n));
        }
  
+ #pragma GCC diagnostic pop
  #undef _GLIBCXX_SIZED_DEALLOC
  #undef _GLIBCXX_OPERATOR_DELETE
  #undef _GLIBCXX_OPERATOR_NEW
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/ranges_base.h gcc-16-20260322/libstdc++-v3/include/bits/ranges_base.h
*** gcc-16-20260315/libstdc++-v3/include/bits/ranges_base.h	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/include/bits/ranges_base.h	Sun Mar 22 22:32:15 2026
*************** namespace ranges
*** 969,976 ****
  
    struct __distance_fn final
    {
-     // _GLIBCXX_RESOLVE_LIB_DEFECTS
-     // 3664. LWG 3392 broke std::ranges::distance(a, a+3)
      template<typename _It, sentinel_for<_It> _Sent>
        requires (!sized_sentinel_for<_Sent, _It>)
        constexpr iter_difference_t<_It>
--- 969,974 ----
*************** namespace ranges
*** 985,995 ****
  	return __n;
        }
  
      template<typename _It, sized_sentinel_for<decay_t<_It>> _Sent>
        [[nodiscard, __gnu__::__always_inline__]]
        constexpr iter_difference_t<decay_t<_It>>
        operator()(_It&& __first, _Sent __last) const
!       { return __last - static_cast<const decay_t<_It>&>(__first); }
  
      template<range _Range>
        [[nodiscard, __gnu__::__always_inline__]]
--- 983,1002 ----
  	return __n;
        }
  
+     // _GLIBCXX_RESOLVE_LIB_DEFECTS
+     // 3392. cannot be used on a move-only iterator with a sized sentinel
+     // 3664. LWG 3392 broke std::ranges::distance(a, a+3)
+     // 4242. ranges::distance does not work with volatile iterators
      template<typename _It, sized_sentinel_for<decay_t<_It>> _Sent>
        [[nodiscard, __gnu__::__always_inline__]]
        constexpr iter_difference_t<decay_t<_It>>
        operator()(_It&& __first, _Sent __last) const
!       {
! 	if constexpr (!is_array_v<remove_reference_t<_It>>)
! 	  return __last - __first;
! 	else
! 	  return __last - static_cast<decay_t<_It>>(__first);
!       }
  
      template<range _Range>
        [[nodiscard, __gnu__::__always_inline__]]
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/regex_compiler.h gcc-16-20260322/libstdc++-v3/include/bits/regex_compiler.h
*** gcc-16-20260315/libstdc++-v3/include/bits/regex_compiler.h	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/include/bits/regex_compiler.h	Sun Mar 22 22:32:15 2026
*************** namespace __detail
*** 172,180 ****
        _StateSeqT
        _M_pop()
        {
! 	auto ret = _M_stack.top();
  	_M_stack.pop();
! 	return ret;
        }
  
        static _FlagT
--- 172,180 ----
        _StateSeqT
        _M_pop()
        {
! 	auto __ret = _M_stack.top();
  	_M_stack.pop();
! 	return __ret;
        }
  
        static _FlagT
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/simd_alg.h gcc-16-20260322/libstdc++-v3/include/bits/simd_alg.h
*** gcc-16-20260315/libstdc++-v3/include/bits/simd_alg.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/include/bits/simd_alg.h	Sun Mar 22 22:32:15 2026
***************
*** 0 ****
--- 1,98 ----
+ // Implementation of <simd> -*- C++ -*-
+ 
+ // Copyright The GNU Toolchain Authors.
+ //
+ // 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/>.
+ 
+ #ifndef _GLIBCXX_SIMD_ALG_H
+ #define _GLIBCXX_SIMD_ALG_H 1
+ 
+ #ifdef _GLIBCXX_SYSHDR
+ #pragma GCC system_header
+ #endif
+ 
+ #if __cplusplus >= 202400L
+ 
+ #include "simd_vec.h"
+ 
+ // psabi warnings are bogus because the ABI of the internal types never leaks into user code
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wpsabi"
+ 
+ // [simd.alg] -----------------------------------------------------------------
+ namespace std _GLIBCXX_VISIBILITY(default)
+ {
+ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ namespace simd
+ {
+   template<typename _Tp, typename _Ap>
+     [[__gnu__::__always_inline__]]
+     constexpr basic_vec<_Tp, _Ap>
+     min(const basic_vec<_Tp, _Ap>& __a, const basic_vec<_Tp, _Ap>& __b) noexcept
+     { return __select_impl(__a < __b, __a, __b); }
+ 
+   template<typename _Tp, typename _Ap>
+     [[__gnu__::__always_inline__]]
+     constexpr basic_vec<_Tp, _Ap>
+     max(const basic_vec<_Tp, _Ap>& __a, const basic_vec<_Tp, _Ap>& __b) noexcept
+     { return __select_impl(__a < __b, __b, __a); }
+ 
+   template<typename _Tp, typename _Ap>
+     [[__gnu__::__always_inline__]]
+     constexpr pair<basic_vec<_Tp, _Ap>, basic_vec<_Tp, _Ap>>
+     minmax(const basic_vec<_Tp, _Ap>& __a, const basic_vec<_Tp, _Ap>& __b) noexcept
+     { return {min(__a, __b), max(__a, __b)}; }
+ 
+   template<typename _Tp, typename _Ap>
+     [[__gnu__::__always_inline__]]
+     constexpr basic_vec<_Tp, _Ap>
+     clamp(const basic_vec<_Tp, _Ap>& __v, const basic_vec<_Tp, _Ap>& __lo,
+ 	  const basic_vec<_Tp, _Ap>& __hi)
+     {
+       __glibcxx_simd_precondition(none_of(__lo > __hi), "lower bound is larger than upper bound");
+       return max(__lo, min(__hi, __v));
+     }
+ 
+   template<typename _Tp, typename _Up>
+     constexpr auto
+     select(bool __c, const _Tp& __a, const _Up& __b)
+     -> remove_cvref_t<decltype(__c ? __a : __b)>
+     { return __c ? __a : __b; }
+ 
+   template<size_t _Bytes, typename _Ap, typename _Tp, typename _Up>
+     [[__gnu__::__always_inline__]]
+     constexpr auto
+     select(const basic_mask<_Bytes, _Ap>& __c, const _Tp& __a, const _Up& __b)
+     noexcept -> decltype(__select_impl(__c, __a, __b))
+     { return __select_impl(__c, __a, __b); }
+ } // namespace simd
+ 
+   using simd::min;
+   using simd::max;
+   using simd::minmax;
+   using simd::clamp;
+ 
+ _GLIBCXX_END_NAMESPACE_VERSION
+ } // namespace std
+ 
+ #pragma GCC diagnostic pop
+ #endif // C++26
+ #endif // _GLIBCXX_SIMD_ALG_H
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/simd_details.h gcc-16-20260322/libstdc++-v3/include/bits/simd_details.h
*** gcc-16-20260315/libstdc++-v3/include/bits/simd_details.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/include/bits/simd_details.h	Sun Mar 22 22:32:15 2026
***************
*** 0 ****
--- 1,1394 ----
+ // Implementation of <simd> -*- C++ -*-
+ 
+ // Copyright The GNU Toolchain Authors.
+ //
+ // 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/>.
+ 
+ #ifndef _GLIBCXX_SIMD_DETAILS_H
+ #define _GLIBCXX_SIMD_DETAILS_H 1
+ 
+ #ifdef _GLIBCXX_SYSHDR
+ #pragma GCC system_header
+ #endif
+ 
+ #if __cplusplus >= 202400L
+ 
+ #include <bit>
+ #include <bits/c++config.h> // _GLIBCXX_FLOAT_IS_IEEE_BINARY32
+ #include <bits/stl_function.h> // plus, minus, multiplies, ...
+ #include <bits/utility.h> // integer_sequence, etc.
+ #include <cmath> // for math_errhandling :(
+ #include <concepts>
+ #include <cstdint>
+ #include <limits>
+ #include <span> // for dynamic_extent
+ 
+ #if __CHAR_BIT__ != 8
+ // There are simply too many constants and bit operators that currently depend on CHAR_BIT == 8.
+ // Generalization to CHAR_BIT != 8 does not make sense without testability (i.e. a test target).
+ #error "<simd> is not supported for CHAR_BIT != 8"
+ #endif
+ 
+ // psabi warnings are bogus because the ABI of the internal types never leaks into user code
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wpsabi"
+ 
+ #if defined __x86_64__ || defined __i386__
+ #define _GLIBCXX_X86 1
+ #else
+ #define _GLIBCXX_X86 0
+ #endif
+ 
+ #ifndef _GLIBCXX_SIMD_NOEXCEPT
+ /** @internal
+  * For unit-testing preconditions, use this macro to remove noexcept.
+  */
+ #define _GLIBCXX_SIMD_NOEXCEPT noexcept
+ #endif
+ 
+ #define _GLIBCXX_SIMD_TOSTRING_IMPL(x) #x
+ #define _GLIBCXX_SIMD_TOSTRING(x) _GLIBCXX_SIMD_TOSTRING_IMPL(x)
+ 
+ // This is used for unit-testing precondition checking
+ #define __glibcxx_simd_precondition(expr, msg, ...)                                                \
+   __glibcxx_assert(expr)
+ 
+ namespace std _GLIBCXX_VISIBILITY(default)
+ {
+ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ 
+ namespace simd
+ {
+   template <typename _Tp>
+     inline constexpr _Tp
+     __iota = [] { static_assert(false, "invalid __iota specialization"); }();
+ 
+   // [simd.general] vectorizable types
+ 
+   template <typename _Tp>
+     concept __vectorizable_scalar
+       = same_as<remove_cv_t<_Tp>, _Tp>
+ #ifdef __STDCPP_BFLOAT16_T__
+ 	  && !same_as<_Tp, __gnu_cxx::__bfloat16_t>
+ #endif
+ 	  && ((integral<_Tp> && sizeof(_Tp) <= sizeof(0ULL) && !same_as<_Tp, bool>)
+ 		 || (floating_point<_Tp> && sizeof(_Tp) <= sizeof(double)));
+ 
+   // [simd.general] p2
+   template <typename _Tp>
+     concept __vectorizable = __vectorizable_scalar<_Tp>;
+ 
+   /** @internal
+    * Describes variants of _Abi.
+    */
+   enum class _AbiVariant : unsigned long long
+   {
+     _BitMask      = 0x01, // AVX512 bit-masks
+     _MaskVariants = 0x0f, // vector masks if bits [0:3] are 0
+   };
+ 
+   /** @internal
+    * Return @p __in with only bits set that are set in any of @p __to_keep.
+    */
+   consteval _AbiVariant
+   __filter_abi_variant(_AbiVariant __in, same_as<_AbiVariant> auto... __to_keep)
+   {
+     using _Up = underlying_type_t<_AbiVariant>;
+     return static_cast<_AbiVariant>(static_cast<_Up>(__in) & (static_cast<_Up>(__to_keep) | ...));
+   }
+ 
+   /** @internal
+    * Type used whenever no valid integer/value type exists.
+    */
+   struct _InvalidInteger
+   {};
+ 
+   /** @internal
+    * Alias for a signed integer type T such that sizeof(T) equals _Bytes.
+    *
+    * C++26 [simd.expos.defn]
+    */
+   template <size_t _Bytes>
+     using __integer_from
+       = decltype([] consteval {
+ 	  if constexpr (sizeof(signed char) == _Bytes)
+ 	    return static_cast<signed char>(0);
+ 	  else if constexpr (sizeof(signed short) == _Bytes)
+ 	    return static_cast<signed short>(0);
+ 	  else if constexpr (sizeof(signed int) == _Bytes)
+ 	    return static_cast<signed int>(0);
+ 	  else if constexpr (sizeof(signed long long) == _Bytes)
+ 	    return static_cast<signed long long>(0);
+ 	  else
+ 	    return _InvalidInteger();
+ 	}());
+ 
+   /** @internal
+    * Alias for an unsigned integer type T such that sizeof(T) equals _Bytes.
+    */
+   template <size_t _Bytes>
+     using _UInt = make_unsigned_t<__integer_from<_Bytes>>;
+ 
+   /** @internal
+    * Divide @p __x by @p __y while rounding up instead of down.
+    *
+    * Preconditions: __x >= 0 && __y > 0.
+    */
+   template <typename _Tp>
+     consteval _Tp
+     __div_ceil(_Tp __x, _Tp __y)
+     { return (__x + __y - 1) / __y; }
+ 
+   /** @internal
+    * Alias for an unsigned integer type that can store at least @p _NBits bits.
+    */
+   template <int _NBits>
+     requires (_NBits > 0 && _NBits <= numeric_limits<unsigned long long>::digits)
+     using _Bitmask = _UInt<__div_ceil(__bit_ceil(unsigned(_NBits)), unsigned(__CHAR_BIT__))>;
+ 
+   /** @internal
+    * Map a given type @p _Tp to an equivalent type.
+    *
+    * This helps with reducing the necessary branches && casts in the implementation as well as
+    * reducing the number of template instantiations.
+    */
+   template <typename _Tp>
+     struct __canonical_vec_type
+     { using type = _Tp; };
+ 
+   template <typename _Tp>
+     using __canonical_vec_type_t = typename __canonical_vec_type<_Tp>::type;
+ 
+ #if __SIZEOF_INT__ == __SIZEOF_LONG__
+   template <>
+     struct __canonical_vec_type<long>
+     { using type = int; };
+ 
+   template <>
+     struct __canonical_vec_type<unsigned long>
+     { using type = unsigned int; };
+ #elif __SIZEOF_LONG_LONG__ == __SIZEOF_LONG__
+   template <>
+     struct __canonical_vec_type<long>
+     { using type = long long; };
+ 
+   template <>
+     struct __canonical_vec_type<unsigned long>
+     { using type = unsigned long long; };
+ #endif
+ 
+   template <typename _Tp>
+     requires std::is_enum_v<_Tp>
+     struct __canonical_vec_type<_Tp>
+     { using type = __canonical_vec_type<std::underlying_type_t<_Tp>>::type; };
+ 
+   template <>
+     struct __canonical_vec_type<char>
+ #if __CHAR_UNSIGNED__
+     { using type = unsigned char; };
+ #else
+     { using type = signed char; };
+ #endif
+ 
+   template <>
+     struct __canonical_vec_type<char8_t>
+     { using type = unsigned char; };
+ 
+   template <>
+     struct __canonical_vec_type<char16_t>
+     { using type = uint_least16_t; };
+ 
+   template <>
+     struct __canonical_vec_type<char32_t>
+     { using type = uint_least32_t; };
+ 
+   template <>
+     struct __canonical_vec_type<wchar_t>
+     {
+       using type = std::__conditional_t<std::is_signed_v<wchar_t>,
+ 					simd::__integer_from<sizeof(wchar_t)>,
+ 					simd::_UInt<sizeof(wchar_t)>>;
+     };
+ 
+ #if defined(__FLT64_DIG__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
+   template <>
+     struct __canonical_vec_type<_Float64>
+     { using type = double; };
+ #endif
+ 
+ #if defined(__FLT32_DIG__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
+   template <>
+     struct __canonical_vec_type<_Float32>
+     { using type = float; };
+ #endif
+ 
+   /** @internal
+    * This ABI tag describes basic_vec objects that store one element per data member and basic_mask
+    * objects that store one bool data members.
+    *
+    * @tparam _Np   The number of elements, which also matches the number of data members in
+    *               basic_vec and basic_mask.
+    */
+   template <int _Np = 1>
+     struct _ScalarAbi
+     {
+       static constexpr int _S_size = _Np;
+ 
+       static constexpr int _S_nreg = _Np;
+ 
+       static constexpr _AbiVariant _S_variant = {};
+ 
+       template <typename _Tp>
+ 	using _DataType = __canonical_vec_type_t<_Tp>;
+ 
+       static constexpr bool _S_is_vecmask = false;
+ 
+       // in principle a bool is a 1-bit bitmask, but this is asking for an AVX512 bitmask
+       static constexpr bool _S_is_bitmask = false;
+ 
+       template <size_t>
+ 	using _MaskDataType = bool;
+ 
+       template <int _N2, int _Nreg2 = _N2>
+ 	static consteval _ScalarAbi<_N2>
+ 	_S_resize()
+ 	{
+ 	  static_assert(_N2 == _Nreg2);
+ 	  return {};
+ 	}
+     };
+ 
+   /** @internal
+    * This ABI tag describes basic_vec objects that store one or more objects declared with the
+    * [[gnu::vector_size(N)]] attribute.
+    * Applied to basic_mask objects, this ABI tag either describes corresponding vector-mask objects
+    * or bit-mask objects. Which one is used is determined via @p _Var.
+    *
+    * @tparam _Np    The number of elements.
+    * @tparam _Nreg  The number of registers needed to store @p _Np elements.
+    * @tparam _Var   Determines how complex value-types are layed out and whether mask types use
+    *                bit-masks or vector-masks.
+    */
+   template <int _Np, int _Nreg, underlying_type_t<_AbiVariant> _Var>
+     struct _Abi
+     {
+       static constexpr int _S_size = _Np;
+ 
+       /** @internal
+        * The number of registers needed to represent one basic_vec for the element type that was
+        * used on ABI deduction.
+        *
+        * Examples:
+        * - '_Abi< 8, 2>' for 'int' is 2x 128-bit
+        * - '_Abi< 9, 3>' for 'int' is 2x 128-bit and 1x 32-bit
+        * - '_Abi<10, 3>' for 'int' is 2x 128-bit and 1x 64-bit
+        * - '_Abi<10, 1>' for 'int' is 1x 512-bit
+        * - '_Abi<10, 2>' for 'int' is 1x 256-bit and 1x 64-bit
+        */
+       static constexpr int _S_nreg = _Nreg;
+ 
+       static_assert(_S_size > 0);
+       static_assert(_S_nreg > 0);
+ 
+       static constexpr _AbiVariant _S_variant = static_cast<_AbiVariant>(_Var);
+ 
+       static constexpr bool _S_is_bitmask
+ 	= __filter_abi_variant(_S_variant, _AbiVariant::_BitMask) == _AbiVariant::_BitMask;
+ 
+       static constexpr bool _S_is_vecmask = !_S_is_bitmask;
+ 
+       template <typename _Tp>
+ 	using _DataType = decltype([] {
+ 			    static_assert(_S_nreg == 1);
+ 			    if constexpr (_S_size == 1)
+ 			      return __canonical_vec_type_t<_Tp>();
+ 			    else
+ 			      {
+ 				constexpr int __n = __bit_ceil(unsigned(_S_size));
+ 				using _Vp [[__gnu__::__vector_size__(sizeof(_Tp) * __n)]]
+ 				  = __canonical_vec_type_t<_Tp>;
+ 				return _Vp();
+ 			      }
+ 			  }());
+ 
+       template <size_t _Bytes>
+ 	using _MaskDataType
+ 	  = decltype([] {
+ 	      static_assert(_S_nreg == 1);
+ 	      if constexpr (_S_size == 1)
+ 		return bool();
+ 	      else if constexpr (_S_is_vecmask)
+ 		{
+ 		  constexpr unsigned __vbytes = _Bytes * __bit_ceil(unsigned(_S_size));
+ 		  using _Vp [[__gnu__::__vector_size__(__vbytes)]] = __integer_from<_Bytes>;
+ 		  return _Vp();
+ 		}
+ 	      else if constexpr (_Nreg > 1)
+ 		return _InvalidInteger();
+ 	      else
+ 		return _Bitmask<_S_size>();
+ 	    }());
+ 
+       template <int _N2, int _Nreg2 = __div_ceil(_N2, _S_size)>
+ 	static consteval auto
+ 	_S_resize()
+ 	{
+ 	  if constexpr (_N2 == 1)
+ 	    return _Abi<1, 1, _Var>();
+ 	  else
+ 	    return _Abi<_N2, _Nreg2, _Var>();
+ 	}
+     };
+ 
+   /** @internal
+    * Alias for an _Abi specialization where the _AbiVariant bits are combined into a single integer
+    * value.
+    *
+    * Rationale: Consider diagnostic output and mangling of e.g. vec<int, 4> with AVX512. That's an
+    * alias for std::simd::basic_vec<int, std::simd::_Abi<4, 1, 1ull>>. If _AbiVariant were the
+    * template argument type of _Abi, the diagnostic output would be 'std::simd::basic_vec<int,
+    * std::simd::_Abi<4, 1, (std::simd::_AbiVariant)std::simd::_AbiVariant::_BitMask>>'. That's a lot
+    * longer, requires longer mangled names, and bakes the names of the enumerators into the ABI. As
+    * soon as bits of multiple _AbiVariants are combined, this becomes hard to parse for humans
+    * anyway.
+    */
+   template <int _Np, int _Nreg, _AbiVariant... _Vs>
+     using _Abi_t = _Abi<_Np, _Nreg, (static_cast<underlying_type_t<_AbiVariant>>(_Vs) | ... | 0)>;
+ 
+   /** @internal
+    * This type is used whenever ABI tag deduction can't give a useful answer.
+    */
+   struct _InvalidAbi
+   { static constexpr int _S_size = 0; };
+ 
+   /** @internal
+    * Satisfied if @p _Tp is a valid simd ABI tag. This is a necessary but not sufficient condition
+    * for an enabled basic_vec/basic_mask specialization.
+    */
+   template <typename _Tp>
+     concept __abi_tag
+       = same_as<decltype(_Tp::_S_variant), const _AbiVariant>
+ 	  && (_Tp::_S_size >= _Tp::_S_nreg) && (_Tp::_S_nreg >= 1)
+ 	  && requires(_Tp __x) {
+ 	    { __x.template _S_resize<_Tp::_S_size, _Tp::_S_nreg>() } -> same_as<_Tp>;
+ 	  };
+ 
+   template <typename _Tp>
+     concept __scalar_abi_tag
+       = same_as<_Tp, _ScalarAbi<_Tp::_S_size>> && __abi_tag<_Tp>;
+ 
+   // Determine if math functions must *raise* floating-point exceptions.
+   // math_errhandling may expand to an extern symbol, in which case we must assume fp exceptions
+   // need to be considered. A conforming C library must define math_errhandling, but in case it
+   // isn't defined we simply use the fallback.
+ #ifdef math_errhandling
+   template <int = 0>
+     requires requires { typename bool_constant<0 != (math_errhandling & MATH_ERREXCEPT)>; }
+     consteval bool
+     __handle_fpexcept_impl(int)
+     { return 0 != (math_errhandling & MATH_ERREXCEPT); }
+ #endif
+ 
+   // Fallback if math_errhandling doesn't work: implement correct exception behavior.
+   consteval bool
+   __handle_fpexcept_impl(float)
+   { return true; }
+ 
+   /** @internal
+    * This type can be used as a template parameter for avoiding ODR violations, where code needs to
+    * differ depending on optimization flags (mostly fp-math related).
+    */
+   struct _OptTraits
+   {
+     consteval bool
+     _M_test(int __bit) const
+     { return ((_M_build_flags >> __bit) & 1) == 1; }
+ 
+     // true iff floating-point operations can signal an exception (allow non-default handler)
+     consteval bool
+     _M_fp_may_signal() const
+     { return _M_test(0); }
+ 
+     // true iff floating-point operations can raise an exception flag
+     consteval bool
+     _M_fp_may_raise() const
+     { return _M_test(12); }
+ 
+     consteval bool
+     _M_fast_math() const
+     { return _M_test(1); }
+ 
+     consteval bool
+     _M_finite_math_only() const
+     { return _M_test(2); }
+ 
+     consteval bool
+     _M_no_signed_zeros() const
+     { return _M_test(3); }
+ 
+     consteval bool
+     _M_signed_zeros() const
+     { return !_M_test(3); }
+ 
+     consteval bool
+     _M_reciprocal_math() const
+     { return _M_test(4); }
+ 
+     consteval bool
+     _M_no_math_errno() const
+     { return _M_test(5); }
+ 
+     consteval bool
+     _M_math_errno() const
+     { return !_M_test(5); }
+ 
+     consteval bool
+     _M_associative_math() const
+     { return _M_test(6); }
+ 
+     consteval bool
+     _M_conforming_to_STDC_annex_G() const
+     { return _M_test(10) && !_M_finite_math_only(); }
+ 
+     consteval bool
+     _M_support_snan() const
+     { return _M_test(11); }
+ 
+     __UINT64_TYPE__ _M_build_flags
+       = 0
+ #if !__NO_TRAPPING_MATH__
+ 	  + (1 << 0)
+ #endif
+ 	  + (__handle_fpexcept_impl(0) << 12)
+ #if __FAST_MATH__
+ 	  + (1 << 1)
+ #endif
+ #if __FINITE_MATH_ONLY__
+ 	  + (1 << 2)
+ #endif
+ #if __NO_SIGNED_ZEROS__
+ 	  + (1 << 3)
+ #endif
+ #if __RECIPROCAL_MATH__
+ 	  + (1 << 4)
+ #endif
+ #if __NO_MATH_ERRNO__
+ 	  + (1 << 5)
+ #endif
+ #if __ASSOCIATIVE_MATH__
+ 	  + (1 << 6)
+ #endif
+ 	// bits 7, 8, and 9 reserved for __FLT_EVAL_METHOD__
+ #if __FLT_EVAL_METHOD__ == 1
+ 	  + (1 << 7)
+ #elif __FLT_EVAL_METHOD__ == 2
+ 	  + (2 << 7)
+ #elif __FLT_EVAL_METHOD__ != 0
+ 	  + (3 << 7)
+ #endif
+ 
+ 	// C Annex G defines the behavior of complex<T> where T is IEC60559 floating-point. If
+ 	// __STDC_IEC_60559_COMPLEX__ is defined then Annex G is implemented - and simd<complex>
+ 	// will do so as well. However, Clang never defines the macro.
+ #if defined __STDC_IEC_60559_COMPLEX__ || defined __STDC_IEC_559_COMPLEX__ || defined _GLIBCXX_CLANG
+ 	  + (1 << 10)
+ #endif
+ #if __SUPPORT_SNAN__
+ 	  + (1 << 11)
+ #endif
+ 	;
+   };
+ 
+   /** @internal
+    * Return true iff @p __s equals "1".
+    */
+   consteval bool
+   __streq_to_1(const char* __s)
+   { return __s != nullptr && __s[0] == '1' && __s[1] == '\0'; }
+ 
+   /** @internal
+    * If the macro given as @p feat is defined to 1, expands to a bit set at position @p off.
+    * Otherwise, expand to zero.
+    */
+ #define _GLIBCXX_SIMD_ARCH_FLAG(off, feat) \
+   (static_cast<__UINT64_TYPE__>(std::simd::__streq_to_1(_GLIBCXX_SIMD_TOSTRING_IMPL(feat))) << off)
+ 
+ #if _GLIBCXX_X86
+ 
+ #define _GLIBCXX_SIMD_ARCH_TRAITS_INIT {                      \
+   _GLIBCXX_SIMD_ARCH_FLAG(0, __MMX__)                         \
+     | _GLIBCXX_SIMD_ARCH_FLAG( 1, __SSE__)                    \
+     | _GLIBCXX_SIMD_ARCH_FLAG( 2, __SSE2__)                   \
+     | _GLIBCXX_SIMD_ARCH_FLAG( 3, __SSE3__)                   \
+     | _GLIBCXX_SIMD_ARCH_FLAG( 4, __SSSE3__)                  \
+     | _GLIBCXX_SIMD_ARCH_FLAG( 5, __SSE4_1__)                 \
+     | _GLIBCXX_SIMD_ARCH_FLAG( 6, __SSE4_2__)                 \
+     | _GLIBCXX_SIMD_ARCH_FLAG( 7, __POPCNT__)                 \
+     | _GLIBCXX_SIMD_ARCH_FLAG( 8, __AVX__)                    \
+     | _GLIBCXX_SIMD_ARCH_FLAG( 9, __F16C__)                   \
+     | _GLIBCXX_SIMD_ARCH_FLAG(10, __BMI__)                    \
+     | _GLIBCXX_SIMD_ARCH_FLAG(11, __BMI2__)                   \
+     | _GLIBCXX_SIMD_ARCH_FLAG(12, __LZCNT__)                  \
+     | _GLIBCXX_SIMD_ARCH_FLAG(13, __AVX2__)                   \
+     | _GLIBCXX_SIMD_ARCH_FLAG(14, __FMA__)                    \
+     | _GLIBCXX_SIMD_ARCH_FLAG(15, __AVX512F__)                \
+     | _GLIBCXX_SIMD_ARCH_FLAG(16, __AVX512CD__)               \
+     | _GLIBCXX_SIMD_ARCH_FLAG(17, __AVX512DQ__)               \
+     | _GLIBCXX_SIMD_ARCH_FLAG(18, __AVX512BW__)               \
+     | _GLIBCXX_SIMD_ARCH_FLAG(19, __AVX512VL__)               \
+     | _GLIBCXX_SIMD_ARCH_FLAG(20, __AVX512BITALG__)           \
+     | _GLIBCXX_SIMD_ARCH_FLAG(21, __AVX512VBMI__)             \
+     | _GLIBCXX_SIMD_ARCH_FLAG(22, __AVX512VBMI2__)            \
+     | _GLIBCXX_SIMD_ARCH_FLAG(23, __AVX512IFMA__)             \
+     | _GLIBCXX_SIMD_ARCH_FLAG(24, __AVX512VNNI__)             \
+     | _GLIBCXX_SIMD_ARCH_FLAG(25, __AVX512VPOPCNTDQ__)        \
+     | _GLIBCXX_SIMD_ARCH_FLAG(26, __AVX512FP16__)             \
+     | _GLIBCXX_SIMD_ARCH_FLAG(27, __AVX512BF16__)             \
+     | _GLIBCXX_SIMD_ARCH_FLAG(28, __AVXIFMA__)                \
+     | _GLIBCXX_SIMD_ARCH_FLAG(29, __AVXNECONVERT__)           \
+     | _GLIBCXX_SIMD_ARCH_FLAG(30, __AVXVNNI__)                \
+     | _GLIBCXX_SIMD_ARCH_FLAG(31, __AVXVNNIINT8__)            \
+     | _GLIBCXX_SIMD_ARCH_FLAG(32, __AVXVNNIINT16__)           \
+     | _GLIBCXX_SIMD_ARCH_FLAG(33, __AVX10_1__)                \
+     | _GLIBCXX_SIMD_ARCH_FLAG(34, __AVX10_2__)                \
+     | _GLIBCXX_SIMD_ARCH_FLAG(35, __AVX512VP2INTERSECT__)     \
+     | _GLIBCXX_SIMD_ARCH_FLAG(36, __SSE4A__)                  \
+     | _GLIBCXX_SIMD_ARCH_FLAG(37, __FMA4__)                   \
+     | _GLIBCXX_SIMD_ARCH_FLAG(38, __XOP__)                    \
+   }
+   // Should this include __APX_F__? I don't think it's relevant for use in constexpr-if branches =>
+   // no ODR issue? The same could be said about several other flags above that are not checked
+   // anywhere.
+ 
+   struct _ArchTraits
+   {
+     __UINT64_TYPE__ _M_flags = _GLIBCXX_SIMD_ARCH_TRAITS_INIT;
+ 
+     consteval bool
+     _M_test(int __bit) const
+     { return ((_M_flags >> __bit) & 1) == 1; }
+ 
+     consteval bool
+     _M_have_mmx() const
+     { return _M_test(0); }
+ 
+     consteval bool
+     _M_have_sse() const
+     { return _M_test(1); }
+ 
+     consteval bool
+     _M_have_sse2() const
+     { return _M_test(2); }
+ 
+     consteval bool
+     _M_have_sse3() const
+     { return _M_test(3); }
+ 
+     consteval bool
+     _M_have_ssse3() const
+     { return _M_test(4); }
+ 
+     consteval bool
+     _M_have_sse4_1() const
+     { return _M_test(5); }
+ 
+     consteval bool
+     _M_have_sse4_2() const
+     { return _M_test(6); }
+ 
+     consteval bool
+     _M_have_popcnt() const
+     { return _M_test(7); }
+ 
+     consteval bool
+     _M_have_avx() const
+     { return _M_test(8); }
+ 
+     consteval bool
+     _M_have_f16c() const
+     { return _M_test(9); }
+ 
+     consteval bool
+     _M_have_bmi() const
+     { return _M_test(10); }
+ 
+     consteval bool
+     _M_have_bmi2() const
+     { return _M_test(11); }
+ 
+     consteval bool
+     _M_have_lzcnt() const
+     { return _M_test(12); }
+ 
+     consteval bool
+     _M_have_avx2() const
+     { return _M_test(13); }
+ 
+     consteval bool
+     _M_have_fma() const
+     { return _M_test(14); }
+ 
+     consteval bool
+     _M_have_avx512f() const
+     { return _M_test(15); }
+ 
+     consteval bool
+     _M_have_avx512cd() const
+     { return _M_test(16); }
+ 
+     consteval bool
+     _M_have_avx512dq() const
+     { return _M_test(17); }
+ 
+     consteval bool
+     _M_have_avx512bw() const
+     { return _M_test(18); }
+ 
+     consteval bool
+     _M_have_avx512vl() const
+     { return _M_test(19); }
+ 
+     consteval bool
+     _M_have_avx512bitalg() const
+     { return _M_test(20); }
+ 
+     consteval bool
+     _M_have_avx512vbmi() const
+     { return _M_test(21); }
+ 
+     consteval bool
+     _M_have_avx512vbmi2() const
+     { return _M_test(22); }
+ 
+     consteval bool
+     _M_have_avx512ifma() const
+     { return _M_test(23); }
+ 
+     consteval bool
+     _M_have_avx512vnni() const
+     { return _M_test(24); }
+ 
+     consteval bool
+     _M_have_avx512vpopcntdq() const
+     { return _M_test(25); }
+ 
+     consteval bool
+     _M_have_avx512fp16() const
+     { return _M_test(26); }
+ 
+     consteval bool
+     _M_have_avx512bf16() const
+     { return _M_test(27); }
+ 
+     consteval bool
+     _M_have_avxifma() const
+     { return _M_test(28); }
+ 
+     consteval bool
+     _M_have_avxneconvert() const
+     { return _M_test(29); }
+ 
+     consteval bool
+     _M_have_avxvnni() const
+     { return _M_test(30); }
+ 
+     consteval bool
+     _M_have_avxvnniint8() const
+     { return _M_test(31); }
+ 
+     consteval bool
+     _M_have_avxvnniint16() const
+     { return _M_test(32); }
+ 
+     consteval bool
+     _M_have_avx10_1() const
+     { return _M_test(33); }
+ 
+     consteval bool
+     _M_have_avx10_2() const
+     { return _M_test(34); }
+ 
+     consteval bool
+     _M_have_avx512vp2intersect() const
+     { return _M_test(35); }
+ 
+     consteval bool
+     _M_have_sse4a() const
+     { return _M_test(36); }
+ 
+     consteval bool
+     _M_have_fma4() const
+     { return _M_test(37); }
+ 
+     consteval bool
+     _M_have_xop() const
+     { return _M_test(38); }
+ 
+     template <typename _Tp>
+       consteval bool
+       _M_eval_as_f32() const
+       { return is_same_v<_Tp, _Float16> && !_M_have_avx512fp16(); }
+   };
+ 
+   template <typename _Tp, _ArchTraits _Traits = {}>
+     consteval auto
+     __native_abi()
+     {
+       constexpr int __adj_sizeof = sizeof(_Tp) * (1 + is_same_v<_Tp, _Float16>);
+       if constexpr (!__vectorizable<_Tp>)
+ 	return _InvalidAbi();
+       else if constexpr (_Traits._M_have_avx512fp16())
+ 	return _Abi_t<64 / sizeof(_Tp), 1, _AbiVariant::_BitMask>();
+       else if constexpr (_Traits._M_have_avx512f())
+ 	return _Abi_t<64 / __adj_sizeof, 1, _AbiVariant::_BitMask>();
+       else if constexpr (is_same_v<_Tp, _Float16> && !_Traits._M_have_f16c())
+ 	return _ScalarAbi<1>();
+       else if constexpr (_Traits._M_have_avx2())
+ 	return _Abi_t<32 / __adj_sizeof, 1>();
+       else if constexpr (_Traits._M_have_avx() && is_floating_point_v<_Tp>)
+ 	return _Abi_t<32 / __adj_sizeof, 1>();
+       else if constexpr (_Traits._M_have_sse2())
+ 	return _Abi_t<16 / __adj_sizeof, 1>();
+       else if constexpr (_Traits._M_have_sse() && is_floating_point_v<_Tp>
+ 			   && sizeof(_Tp) == sizeof(float))
+ 	return _Abi_t<16 / __adj_sizeof, 1>();
+       // no MMX: we can't emit EMMS where it would be necessary
+       else
+ 	return _ScalarAbi<1>();
+     }
+ 
+ #else
+ 
+   // scalar fallback
+   struct _ArchTraits
+   {
+     __UINT64_TYPE__ _M_flags = 0;
+ 
+     constexpr bool
+     _M_test(int __bit) const
+     { return ((_M_flags >> __bit) & 1) == 1; }
+   };
+ 
+   template <typename _Tp>
+     consteval auto
+     __native_abi()
+     {
+       if constexpr (!__vectorizable<_Tp>)
+ 	return _InvalidAbi();
+       else
+ 	return _ScalarAbi<1>();
+     }
+ 
+ #endif
+ 
+   /** @internal
+    * You must use this type as template argument to function templates that are not declared
+    * always_inline (to avoid issues when linking code compiled with different compiler flags).
+    */
+   struct _TargetTraits
+   : _ArchTraits, _OptTraits
+   {};
+ 
+   /** @internal
+    * Alias for an ABI tag such that basic_vec<_Tp, __native_abi_t_<_Tp>> stores one SIMD register of
+    * optimal width.
+    *
+    * @tparam _Tp  A vectorizable type.
+    *
+    * C++26 [simd.expos.abi]
+    */
+   template <typename _Tp>
+     using __native_abi_t = decltype(std::simd::__native_abi<_Tp>());
+ 
+   template <typename _Tp, int _Np, _TargetTraits _Target = {}>
+     consteval auto
+     __deduce_abi()
+     {
+       constexpr auto __native = std::simd::__native_abi<_Tp>();
+       if constexpr (0 == __native._S_size || _Np <= 0)
+ 	return _InvalidAbi();
+       else if constexpr (_Np == __native._S_size)
+ 	return __native;
+       else
+ 	return __native.template _S_resize<_Np>();
+     }
+ 
+   /** @internal
+    * Alias for an ABI tag @c A such that `basic_vec<_Tp, A>` stores @p _Np elements.
+    *
+    * C++26 [simd.expos.abi]
+    */
+   template <typename _Tp, int _Np>
+     using __deduce_abi_t = decltype(std::simd::__deduce_abi<_Tp, _Np>());
+ 
+   /** @internal
+    * \c rebind implementation detail for basic_vec, and basic_mask where we know the destination
+    * value-type
+    */
+   template <typename _Tp, int _Np, __abi_tag _A0, _ArchTraits = {}>
+     consteval auto
+     __abi_rebind()
+     {
+       if constexpr (_Np <= 0 || !__vectorizable<_Tp>)
+ 	return _InvalidAbi();
+ 
+       else if constexpr (__scalar_abi_tag<_A0>)
+ 	return _A0::template _S_resize<_Np>();
+ 
+       else
+ 	{
+ 	  using _Native = remove_const_t<decltype(std::simd::__native_abi<_Tp>())>;
+ 	  static_assert(0 != _Native::_S_size);
+ 	  constexpr int __nreg = __div_ceil(_Np, _Native::_S_size);
+ 
+ 	  if constexpr (__scalar_abi_tag<_Native>)
+ 	    return _Native::template _S_resize<_Np>();
+ 	  else
+ 	    return _Abi_t<_Native::_S_size, 1, __filter_abi_variant(_A0::_S_variant,
+ 								    _AbiVariant::_MaskVariants)
+ 			 >::template _S_resize<_Np, __nreg>();
+ 	}
+     }
+ 
+   /** @internal
+    * @c rebind implementation detail for basic_mask.
+    *
+    * The important difference here is that we have no information about the actual value-type other
+    * than its @c sizeof. So `_Bytes == 8` could mean `complex<float>`, @c double, or @c int64_t.
+    * E.g. `_Np == 4` with AVX w/o AVX2 that's `vector(4) int`, `vector(4) long long`, or `2x
+    * vector(2) long long`.
+    * That's why this overload has the additional @p _IsOnlyResize parameter, which tells us that the
+    * value-type doesn't change.
+    */
+   template <size_t _Bytes, int _Np, __abi_tag _A0, bool _IsOnlyResize, _ArchTraits _Traits = {}>
+     consteval auto
+     __abi_rebind()
+     {
+       if constexpr (_Bytes == 0 || _Np <= 0)
+ 	return _InvalidAbi();
+ 
+       else if constexpr (__scalar_abi_tag<_A0>)
+ 	return _A0::template _S_resize<_Np>();
+ 
+ #if _GLIBCXX_X86
+       // AVX w/o AVX2:
+       // e.g. resize_t<8, mask<float, Whatever>> needs to be _Abi<8, 1> not _Abi<8, 2>
+       // We determine whether _A0 identifies an AVX vector by looking at the size of a native
+       // register. If it's 32, it's a YMM register, otherwise it's 16 or less.
+       else if constexpr (_IsOnlyResize
+ 			   && _Traits._M_have_avx() && !_Traits._M_have_avx2()
+ 			   && __bit_ceil(__div_ceil<unsigned>(
+ 					    _A0::_S_size, _A0::_S_nreg)) * _Bytes == 32)
+ 	{
+ 	  if constexpr (_Bytes == sizeof(double))
+ 	    return __abi_rebind<double, _Np, _A0>();
+ 	  else if constexpr (_Bytes == sizeof(float))
+ 	    return __abi_rebind<float, _Np, _A0>();
+ 	  else if constexpr (_Traits._M_have_f16c() && _Bytes == sizeof(_Float16))
+ 	    return __abi_rebind<_Float16, _Np, _A0>();
+ 	  else // impossible
+ 	    static_assert(false);
+ 	}
+ #endif
+ 
+       else
+ 	return __abi_rebind<__integer_from<_Bytes>, _Np, _A0>();
+     }
+ 
+   /** @internal
+    * Returns true unless _GLIBCXX_SIMD_COND_EXPLICIT_MASK_CONVERSION is defined.
+    *
+    * On IvyBridge, (vec<float> == 0.f) == (rebind_t<int, vec<float>> == 0) does not compile. It does
+    * compile on basically every other target, though. This is due to the difference in ABI tag:
+    * _Abi<8, 1, [...]> vs. _Abi<8, 2, [...]> (8 elements, 1 vs. 2 registers).
+    * I know how to define this funtion for libstdc++ to avoid interconvertible masks. The question
+    * is whether we can specify this in general for C++29.
+    *
+    * Idea: Is rebind_t<integer-from<...>, mask>::abi_type the same type as
+    *   deduce-t<integer-from<...>, mask::size()>? If yes, it's the "better" ABI tag. However, this
+    *   makes the conversion behavior dependent on compiler flags. Probably not what we want.
+    */
+   template <typename _To, typename _From>
+   consteval bool
+     __is_mask_conversion_explicit([[maybe_unused]] size_t __b0, [[maybe_unused]] size_t __b1)
+     {
+       constexpr int __n = _To::_S_size;
+       static_assert(__n == _From::_S_size);
+ #ifndef _GLIBCXX_SIMD_COND_EXPLICIT_MASK_CONVERSION
+       /// C++26 [simd.mask.ctor] uses unconditional explicit
+       return true;
+ #else
+       if (__b0 != __b1)
+ 	return true;
+ 
+       // everything is better than _ScalarAbi, except when converting to a single bool
+       if constexpr (__scalar_abi_tag<_To>)
+ 	return __n > 1;
+       else if constexpr (__scalar_abi_tag<_From>)
+ 	return true;
+ 
+       // converting to a bit-mask is better
+       else if constexpr (_To::_S_is_vecmask != _From::_S_is_vecmask)
+ 	return _To::_S_is_vecmask; // to vector-mask is explicit
+ 
+       // with vec-masks, fewer registers is better
+       else if constexpr (_From::_S_nreg != _To::_S_nreg)
+ 	return _From::_S_nreg < _To::_S_nreg;
+ 
+       else
+ 	__builtin_unreachable();
+ #endif
+     }
+ 
+   /** @internal
+    * An alias for a signed integer type.
+    *
+    * libstdc++ unconditionally uses @c int here, since it matches the return type of
+    * 'Bit Operation Builtins' in GCC.
+    *
+    * C++26 [simd.expos.defn]
+    */
+   using __simd_size_type = int;
+ 
+   // integral_constant shortcut
+   template <__simd_size_type _Xp>
+     inline constexpr integral_constant<__simd_size_type, _Xp> __simd_size_c = {};
+ 
+   // [simd.syn]
+   template <typename _Tp, typename _Ap = __native_abi_t<_Tp>>
+     class basic_vec;
+ 
+   template <typename _Tp, __simd_size_type _Np = __native_abi_t<_Tp>::_S_size>
+     using vec = basic_vec<_Tp, __deduce_abi_t<_Tp, _Np>>;
+ 
+   template <size_t _Bytes, typename _Ap = __native_abi_t<__integer_from<_Bytes>>>
+     class basic_mask;
+ 
+   template <typename _Tp, __simd_size_type _Np = __native_abi_t<_Tp>::_S_size>
+     using mask = basic_mask<sizeof(_Tp), __deduce_abi_t<_Tp, _Np>>;
+ 
+   // [simd.ctor] load constructor constraints
+   template <typename _Tp, size_t _Np = -1uz>
+     concept __static_sized_range
+       = ranges::sized_range<_Tp> && requires(_Tp&& __r) {
+ 	typename integral_constant<size_t, ranges::size(__r)>;
+ 	requires (_Np == -1uz || ranges::size(__r) == _Np);
+       };
+ 
+   template <typename _Rg>
+     consteval size_t
+     __static_range_size(_Rg& __r)
+     {
+       if constexpr (requires { typename integral_constant<size_t, ranges::size(__r)>; })
+ 	return ranges::size(__r);
+       else
+ 	return dynamic_extent;
+     }
+ 
+   // [simd.general] value-preserving
+   template <typename _From, typename _To>
+     concept __arithmetic_only_value_preserving_convertible_to
+       = convertible_to<_From, _To> && is_arithmetic_v<_From> && is_arithmetic_v<_To>
+ 	  && !(is_signed_v<_From> && is_unsigned_v<_To>)
+ 	  && numeric_limits<_From>::digits <= numeric_limits<_To>::digits
+ 	  && numeric_limits<_From>::max() <= numeric_limits<_To>::max()
+ 	  && numeric_limits<_From>::lowest() >= numeric_limits<_To>::lowest();
+ 
+   /** @internal
+    * Satisfied if the conversion from @p _From to @p _To is a value-preserving conversion.
+    *
+    * C++26 [simd.general]
+    */
+   template <typename _From, typename _To>
+     concept __value_preserving_convertible_to
+       = __arithmetic_only_value_preserving_convertible_to<_From, _To>;
+ 
+   // LWG4420
+   template <typename _From, typename _To>
+     concept __explicitly_convertible_to = requires {
+       static_cast<_To>(declval<_From>());
+     };
+ 
+   /** @internal
+    * C++26 [simd.expos]
+    */
+   template<typename _Tp>
+     concept __constexpr_wrapper_like
+       = convertible_to<_Tp, decltype(_Tp::value)>
+ 	  && equality_comparable_with<_Tp, decltype(_Tp::value)>
+ 	  && bool_constant<_Tp() == _Tp::value>::value
+ 	  && bool_constant<static_cast<decltype(_Tp::value)>(_Tp()) == _Tp::value>::value;
+ 
+   // [simd.ctor] explicit(...) of broadcast ctor
+   template <auto _From, typename _To>
+     concept __non_narrowing_constexpr_conversion
+       = is_arithmetic_v<decltype(_From)>
+ 	  && static_cast<decltype(_From)>(static_cast<_To>(_From)) == _From
+ 	  && !(unsigned_integral<_To> && _From < decltype(_From)())
+ 	  && _From <= std::numeric_limits<_To>::max()
+ 	  && _From >= std::numeric_limits<_To>::lowest();
+ 
+   // [simd.ctor] p4
+   // This implements LWG4436 (submitted on 2025-10-28)
+   template <typename _From, typename _To>
+     concept __broadcast_constructible
+       = ((convertible_to<_From, _To> && !is_arithmetic_v<remove_cvref_t<_From>>
+ 	    && !__constexpr_wrapper_like<remove_cvref_t<_From>>) // 4.1
+ 	   || __value_preserving_convertible_to<remove_cvref_t<_From>, _To> // 4.2
+ 	   || (__constexpr_wrapper_like<remove_cvref_t<_From>> // 4.3
+ 		 && __non_narrowing_constexpr_conversion<auto(remove_cvref_t<_From>::value),
+ 							 _To>));
+ 
+   // __higher_floating_point_rank_than<_Tp, U> (_Tp has higher or equal floating point rank than U)
+   template <typename _From, typename _To>
+     consteval bool
+     __higher_floating_point_rank_than()
+     {
+       return floating_point<_From> && floating_point<_To>
+ 	       && is_same_v<common_type_t<_From, _To>, _From> && !is_same_v<_From, _To>;
+     }
+ 
+   // __higher_integer_rank_than<_Tp, U> (_Tp has higher or equal integer rank than U)
+   template <typename _From, typename _To>
+     consteval bool
+     __higher_integer_rank_than()
+     {
+       return integral<_From> && integral<_To>
+ 	       && (sizeof(_From) > sizeof(_To) || is_same_v<common_type_t<_From, _To>, _From>)
+ 	       && !is_same_v<_From, _To>;
+     }
+ 
+   template <typename _From, typename _To>
+     concept __higher_rank_than
+       = __higher_floating_point_rank_than<_From, _To>() || __higher_integer_rank_than<_From, _To>();
+ 
+   struct __convert_flag;
+ 
+   template <typename _From, typename _To, typename... _Flags>
+     concept __loadstore_convertible_to
+       = same_as<_From, _To>
+ 	  || (__vectorizable<_From> && __vectorizable<_To>
+ 		&& (__value_preserving_convertible_to<_From, _To>
+ 		       || (__explicitly_convertible_to<_From, _To>
+ 			     && (std::is_same_v<_Flags, __convert_flag> || ...))));
+ 
+   template <typename _From, typename _To>
+     concept __simd_generator_convertible_to
+       = std::convertible_to<_From, _To>
+ 	  && (!is_arithmetic_v<_From> || __value_preserving_convertible_to<_From, _To>);
+ 
+   template <typename _Fp, typename _Tp, __simd_size_type... _Is>
+     requires (__simd_generator_convertible_to<
+ 		decltype(declval<_Fp>()(__simd_size_c<_Is>)), _Tp> && ...)
+     constexpr void
+     __simd_generator_invokable_impl(integer_sequence<__simd_size_type, _Is...>);
+ 
+   template <typename _Fp, typename _Tp, __simd_size_type _Np>
+     concept __simd_generator_invokable = requires {
+       __simd_generator_invokable_impl<_Fp, _Tp>(make_integer_sequence<__simd_size_type, _Np>());
+     };
+ 
+   template <typename _Fp>
+     concept __index_permutation_function_sized = requires(_Fp const& __f)
+       {
+ 	{ __f(0, 0) } -> std::integral;
+       };
+ 
+   template <typename _Fp, typename _Simd>
+     concept __index_permutation_function
+       = __index_permutation_function_sized<_Fp> || requires(_Fp const& __f) {
+ 	{ __f(0) } -> std::integral;
+       };
+ 
+   /** @internal
+    * The value of the @c _Bytes template argument to a @c basic_mask specialization.
+    *
+    * C++26 [simd.expos.defn]
+    */
+   template <typename _Tp>
+     constexpr size_t __mask_element_size = 0;
+ 
+   template <size_t _Bytes, __abi_tag _Ap>
+     constexpr size_t __mask_element_size<basic_mask<_Bytes, _Ap>> = _Bytes;
+ 
+   // [simd.expos]
+   template <typename _Vp>
+     concept __simd_vec_type
+       = same_as<_Vp, basic_vec<typename _Vp::value_type, typename _Vp::abi_type>>
+ 	  && is_default_constructible_v<_Vp>;
+ 
+   template <typename _Vp>
+     concept __simd_mask_type
+       = same_as<_Vp, basic_mask<__mask_element_size<_Vp>, typename _Vp::abi_type>>
+ 	&& is_default_constructible_v<_Vp>;
+ 
+   /** @internal
+    * Satisfied if @p _Tp is a data-parallel type.
+    */
+   template <typename _Vp>
+     concept __simd_vec_or_mask_type = __simd_vec_type<_Vp> || __simd_mask_type<_Vp>;
+ 
+   template <typename _Vp>
+     concept __simd_floating_point
+       = __simd_vec_type<_Vp> && floating_point<typename _Vp::value_type>;
+ 
+   template <typename _Vp>
+     concept __simd_integral
+       = __simd_vec_type<_Vp> && integral<typename _Vp::value_type>;
+ 
+   template <typename _Tp>
+     concept __converts_to_vec
+       = __simd_vec_type<decltype(declval<const _Tp&>() + declval<const _Tp&>())>;
+ 
+   template <__converts_to_vec _Tp>
+     using __deduced_vec_t = decltype(declval<const _Tp&>() + declval<const _Tp&>());
+ 
+   template <typename _Vp, typename _Tp>
+     using __make_compatible_simd_t
+       = decltype([] {
+ 	  using _Up = decltype(declval<const _Tp&>() + declval<const _Tp&>());
+ 	  if constexpr (__simd_vec_type<_Up>)
+ 	    return _Up();
+ 	  else
+ 	    return vec<_Up, _Vp::size()>();
+       }());
+ 
+   template <typename _Tp>
+     concept __math_floating_point = __simd_floating_point<__deduced_vec_t<_Tp>>;
+ 
+   template <typename _BinaryOperation, typename _Tp>
+     concept __reduction_binary_operation
+       = requires (const _BinaryOperation __binary_op, const vec<_Tp, 1> __v) {
+ 	{ __binary_op(__v, __v) } -> same_as<vec<_Tp, 1>>;
+       };
+ 
+   /** @internal
+    * Returns the highest index @c i where `(__bits >> i) & 1` equals @c 1.
+    */
+   [[__gnu__::__always_inline__]]
+   constexpr __simd_size_type
+   __highest_bit(std::unsigned_integral auto __bits)
+   {
+     using __gnu_cxx::__int_traits;
+     constexpr auto _Nd = __int_traits<decltype(__bits)>::__digits;
+     return _Nd - 1 - __countl_zero(__bits);
+   }
+ 
+   template <__vectorizable _Tp, __simd_size_type _Np, __abi_tag _Ap>
+     using __similar_mask = basic_mask<sizeof(_Tp), decltype(__abi_rebind<_Tp, _Np, _Ap>())>;
+ 
+   // Allow _Tp to be _InvalidInteger for __integer_from<16>
+   template <typename _Tp, __simd_size_type _Np, __abi_tag _Ap>
+     using __similar_vec = basic_vec<_Tp, decltype(__abi_rebind<_Tp, _Np, _Ap>())>;
+ 
+   // LWG4470 [simd.expos]
+   template <size_t _Bytes, typename _Ap>
+     using __simd_vec_from_mask_t = __similar_vec<__integer_from<_Bytes>, _Ap::_S_size, _Ap>;
+ 
+ #if _GLIBCXX_SIMD_THROW_ON_BAD_VALUE // used for unit tests (also see P3844)
+   class __bad_value_preserving_cast
+   {};
+ 
+ #define __glibcxx_on_bad_value_preserving_cast throw __bad_value_preserving_cast
+ #else
+   void __bad_value_preserving_cast(); // not defined
+ 
+ #define __glibcxx_on_bad_value_preserving_cast __bad_value_preserving_cast
+ #endif
+ 
+   template <typename _To, typename _From>
+ #if _GLIBCXX_SIMD_THROW_ON_BAD_VALUE // see P3844
+     [[__gnu__::__optimize__("exceptions")]] // work around potential -fno-exceptions
+ #endif
+     consteval _To
+     __value_preserving_cast(const _From& __x)
+     {
+       static_assert(is_arithmetic_v<_From>);
+       if constexpr (!__value_preserving_convertible_to<_From, _To>)
+ 	{
+ 	  using _Up = typename __make_unsigned<_From>::__type;
+ 	  if (static_cast<_Up>(static_cast<_To>(__x)) != static_cast<_Up>(__x))
+ 	    __glibcxx_on_bad_value_preserving_cast();
+ 	  else if constexpr (is_signed_v<_From> && is_unsigned_v<_To>)
+ 	    {
+ 	      if (__x < _From())
+ 		__glibcxx_on_bad_value_preserving_cast();
+ 	    }
+ 	  else if constexpr (unsigned_integral<_From> && signed_integral<_To>)
+ 	    {
+ 	      if (__x > numeric_limits<_To>::max())
+ 		__glibcxx_on_bad_value_preserving_cast();
+ 	    }
+ 	}
+       return static_cast<_To>(__x);
+     }
+ 
+   template <typename _From, typename _To>
+     concept __simd_vec_bcast_consteval
+       = __explicitly_convertible_to<_From, _To>
+ 	  && is_arithmetic_v<remove_cvref_t<_From>> && convertible_to<_From, _To>
+ 	  && !__value_preserving_convertible_to<remove_cvref_t<_From>, _To>
+ 	  && (is_same_v<common_type_t<_From, _To>, _To>
+ 		|| (is_same_v<remove_cvref_t<_From>, int> && is_integral_v<_To>)
+ 		|| (is_same_v<remove_cvref_t<_From>, unsigned> && unsigned_integral<_To>));
+ 
+   /** @internal
+    * std::pair is not trivially copyable, this one is
+    */
+   template <typename _T0, typename _T1>
+     struct __trivial_pair
+     {
+       _T0 _M_first;
+       _T1 _M_second;
+     };
+ 
+   template <typename _From, typename _To>
+     concept __converts_trivially = convertible_to<_From, _To>
+ 				     && sizeof(_From) == sizeof(_To)
+ 				     && is_integral_v<_From> == is_integral_v<_To>
+ 				     && is_floating_point_v<_From> == is_floating_point_v<_To>;
+ 
+   [[__gnu__::__always_inline__]]
+   constexpr void
+   __bit_foreach(unsigned_integral auto __bits, auto&& __fun)
+   {
+     static_assert(sizeof(__bits) >= sizeof(int)); // avoid promotion to int
+     while (__bits)
+       {
+ 	__fun(__countr_zero(__bits));
+ 	__bits &= (__bits - 1);
+       }
+   }
+ 
+   /** @internal
+    * Optimized @c memcpy for use in partial loads and stores.
+    *
+    * The implementation uses at most two fixed-size power-of-2 @c memcpy calls and reduces the
+    * number of branches to a minimum. The variable size is achieved by overlapping two @c memcpy
+    * calls.
+    *
+    * @tparam _Chunk   Copies @p __n times @p _Chunk bytes.
+    * @tparam _Max     Copy no more than @p _Max bytes.
+    *
+    * @param  __dst    The destination pointer.
+    * @param  __src    The source pointer.
+    * @param  __n      Thu number of chunks that need to be copied.
+    */
+   template <size_t _Chunk, size_t _Max>
+     inline void
+     __memcpy_chunks(byte* __restrict__ __dst, const byte* __restrict__ __src,
+ 		    size_t __n)
+     {
+       static_assert(_Max <= 64);
+       static_assert(__has_single_bit(_Chunk) && _Chunk <= 8);
+       size_t __bytes = _Chunk * __n;
+       if (__builtin_constant_p(__bytes))
+ 	{ // If __n is known via constant propagation use a single memcpy call. Since this is still
+ 	  // a fixed-size memcpy to the compiler, this leaves more room for optimization.
+ 	  __builtin_memcpy(__dst, __src, __bytes);
+ 	}
+       else if (__bytes > 32 && _Max > 32)
+ 	{
+ 	  __builtin_memcpy(__dst, __src, 32);
+ 	  __bytes -= 32;
+ 	  __builtin_memcpy(__dst + __bytes, __src + __bytes, 32);
+ 	}
+       else if (__bytes > 16 && _Max > 16)
+ 	{
+ 	  __builtin_memcpy(__dst, __src, 16);
+ 	  if constexpr (_Chunk == 8)
+ 	    {
+ 	      __bytes -= 8;
+ 	      __builtin_memcpy(__dst + __bytes, __src + __bytes, 8);
+ 	    }
+ 	  else
+ 	    {
+ 	      __bytes -= 16;
+ 	      __builtin_memcpy(__dst + __bytes, __src + __bytes, 16);
+ 	    }
+ 	}
+       else if (__bytes > 8 && _Max > 8)
+ 	{
+ 	  __builtin_memcpy(__dst, __src, 8);
+ 	  if constexpr (_Chunk == 4)
+ 	    {
+ 	      __bytes -= 4;
+ 	      __builtin_memcpy(__dst + __bytes, __src + __bytes, 4);
+ 	    }
+ 	  else if constexpr (_Chunk < 4)
+ 	    {
+ 	      __bytes -= 8;
+ 	      __builtin_memcpy(__dst + __bytes, __src + __bytes, 8);
+ 	    }
+ 	}
+       else if (__bytes > 4 && _Max > 4)
+ 	{
+ 	  __builtin_memcpy(__dst, __src, 4);
+ 	  if constexpr (_Chunk == 2)
+ 	    {
+ 	      __bytes -= 2;
+ 	      __builtin_memcpy(__dst + __bytes, __src + __bytes, 2);
+ 	    }
+ 	  else if constexpr (_Chunk == 1)
+ 	    {
+ 	      __bytes -= 4;
+ 	      __builtin_memcpy(__dst + __bytes, __src + __bytes, 4);
+ 	    }
+ 	}
+       else if (__bytes >= 2)
+ 	{
+ 	  __builtin_memcpy(__dst, __src, 2);
+ 	  if constexpr (_Chunk == 2)
+ 	    {
+ 	      __bytes -= 2;
+ 	      __builtin_memcpy(__dst + __bytes, __src + __bytes, 2);
+ 	    }
+ 	  else if constexpr (_Chunk == 1)
+ 	    {
+ 	      __bytes -= 1;
+ 	      __builtin_memcpy(__dst + __bytes, __src + __bytes, 1);
+ 	    }
+ 	}
+       else if (__bytes == 1)
+ 	__builtin_memcpy(__dst, __src, 1);
+     }
+ 
+   // [simd.reductions] identity_element = *see below*
+   template <typename _Tp, typename _BinaryOperation>
+     requires __is_one_of<_BinaryOperation,
+ 			 plus<>, multiplies<>, bit_and<>, bit_or<>, bit_xor<>>::value
+     consteval _Tp
+     __default_identity_element()
+     {
+       if constexpr (same_as<_BinaryOperation, multiplies<>>)
+ 	return _Tp(1);
+       else if constexpr (same_as<_BinaryOperation, bit_and<>>)
+ 	return _Tp(~_Tp());
+       else
+ 	return _Tp(0);
+     }
+ } // namespace simd
+ _GLIBCXX_END_NAMESPACE_VERSION
+ } // namespace std
+ 
+ #pragma GCC diagnostic pop
+ #endif // C++26
+ #endif // _GLIBCXX_SIMD_DETAILS_H
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/simd_flags.h gcc-16-20260322/libstdc++-v3/include/bits/simd_flags.h
*** gcc-16-20260315/libstdc++-v3/include/bits/simd_flags.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/include/bits/simd_flags.h	Sun Mar 22 22:32:15 2026
***************
*** 0 ****
--- 1,187 ----
+ // Implementation of <simd> -*- C++ -*-
+ 
+ // Copyright The GNU Toolchain Authors.
+ //
+ // 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/>.
+ 
+ #ifndef _GLIBCXX_SIMD_FLAGS_H
+ #define _GLIBCXX_SIMD_FLAGS_H 1
+ 
+ #ifdef _GLIBCXX_SYSHDR
+ #pragma GCC system_header
+ #endif
+ 
+ #if __cplusplus >= 202400L
+ 
+ #include "simd_details.h"
+ #include <bits/align.h> // assume_aligned
+ 
+ namespace std _GLIBCXX_VISIBILITY(default)
+ {
+ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ namespace simd
+ {
+   // [simd.traits]
+   // --- alignment ---
+   template <typename _Tp, typename _Up = typename _Tp::value_type>
+     struct alignment
+     {};
+ 
+   template <typename _Tp, typename _Ap, __vectorizable _Up>
+     struct alignment<basic_vec<_Tp, _Ap>, _Up>
+     : integral_constant<size_t, alignof(basic_vec<_Tp, _Ap>)>
+     {};
+ 
+   template <typename _Tp, typename _Up = typename _Tp::value_type>
+     constexpr size_t alignment_v = alignment<_Tp, _Up>::value;
+ 
+   // [simd.flags] -------------------------------------------------------------
+   struct _LoadStoreTag
+   {};
+ 
+   /** @internal
+    * `struct convert-flag`
+    *
+    * C++26 [simd.expos] / [simd.flags]
+    */
+   struct __convert_flag
+   : _LoadStoreTag
+   {};
+ 
+   /** @internal
+    * `struct aligned-flag`
+    *
+    * C++26 [simd.expos] / [simd.flags]
+    */
+   struct __aligned_flag
+   : _LoadStoreTag
+   {
+     template <typename _Tp, typename _Up>
+       [[__gnu__::__always_inline__]]
+       static constexpr _Up*
+       _S_adjust_pointer(_Up* __ptr)
+       { return assume_aligned<simd::alignment_v<_Tp, remove_cv_t<_Up>>>(__ptr); }
+   };
+ 
+   /** @internal
+    * `template<size_t N> struct overaligned-flag`
+    *
+    * @tparam _Np  alignment in bytes
+    *
+    * C++26 [simd.expos] / [simd.flags]
+    */
+   template <size_t _Np>
+     struct __overaligned_flag
+     : _LoadStoreTag
+     {
+       static_assert(__has_single_bit(_Np));
+ 
+       template <typename, typename _Up>
+ 	[[__gnu__::__always_inline__]]
+ 	static constexpr _Up*
+ 	_S_adjust_pointer(_Up* __ptr)
+ 	{ return assume_aligned<_Np>(__ptr); }
+     };
+ 
+   struct __partial_loadstore_flag
+   : _LoadStoreTag
+   {};
+ 
+ 
+   template <typename _Tp>
+     concept __loadstore_tag = is_base_of_v<_LoadStoreTag, _Tp>;
+ 
+   template <typename...>
+     struct flags;
+ 
+   template <typename... _Flags>
+     requires (__loadstore_tag<_Flags> && ...)
+     struct flags<_Flags...>
+     {
+       /** @internal
+        * Returns @c true if the given argument is part of this specialization, otherwise returns @c
+        * false.
+        */
+       template <typename _F0>
+ 	static consteval bool
+ 	_S_test(flags<_F0>)
+ 	{ return (is_same_v<_Flags, _F0> || ...); }
+ 
+       friend consteval flags
+       operator|(flags, flags<>)
+       { return flags{}; }
+ 
+       template <typename _T0, typename... _More>
+ 	friend consteval auto
+ 	operator|(flags, flags<_T0, _More...>)
+ 	{
+ 	  if constexpr ((same_as<_Flags, _T0> || ...))
+ 	    return flags<_Flags...>{} | flags<_More...>{};
+ 	  else
+ 	    return flags<_Flags..., _T0>{} | flags<_More...>{};
+ 	}
+ 
+       /** @internal
+        * Adjusts a pointer according to the alignment requirements of the flags.
+        *
+        * This function iterates over all flags in the pack and applies each flag's
+        * `_S_adjust_pointer` method to the input pointer. Flags that don't provide
+        * this method are ignored.
+        *
+        * @tparam _Tp  A basic_vec type for which a load/store pointer is adjusted
+        * @tparam _Up  The value-type of the input/output range
+        * @param __ptr  The pointer to the range
+        * @return The adjusted pointer
+        */
+       template <typename _Tp, typename _Up>
+ 	static constexpr _Up*
+ 	_S_adjust_pointer(_Up* __ptr)
+ 	{
+ 	  template for ([[maybe_unused]] constexpr auto __f : {_Flags()...})
+ 	    {
+ 	      if constexpr (requires {__f.template _S_adjust_pointer<_Tp>(__ptr); })
+ 		__ptr = __f.template _S_adjust_pointer<_Tp>(__ptr);
+ 	    }
+ 	  return __ptr;
+ 	}
+     };
+ 
+   inline constexpr flags<> flag_default {};
+ 
+   inline constexpr flags<__convert_flag> flag_convert {};
+ 
+   inline constexpr flags<__aligned_flag> flag_aligned {};
+ 
+   template <size_t _Np>
+     requires(__has_single_bit(_Np))
+     inline constexpr flags<__overaligned_flag<_Np>> flag_overaligned {};
+ 
+   /** @internal
+    * Pass to unchecked_load or unchecked_store to make it behave like partial_load / partial_store.
+    */
+   inline constexpr flags<__partial_loadstore_flag> __allow_partial_loadstore {};
+ 
+ } // namespace simd
+ _GLIBCXX_END_NAMESPACE_VERSION
+ } // namespace std
+ 
+ #endif // C++26
+ #endif // _GLIBCXX_SIMD_FLAGS_H
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/simd_iterator.h gcc-16-20260322/libstdc++-v3/include/bits/simd_iterator.h
*** gcc-16-20260315/libstdc++-v3/include/bits/simd_iterator.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/include/bits/simd_iterator.h	Sun Mar 22 22:32:15 2026
***************
*** 0 ****
--- 1,177 ----
+ // Implementation of <simd> -*- C++ -*-
+ 
+ // Copyright The GNU Toolchain Authors.
+ //
+ // 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/>.
+ 
+ #ifndef _GLIBCXX_SIMD_ITERATOR_H
+ #define _GLIBCXX_SIMD_ITERATOR_H 1
+ 
+ #ifdef _GLIBCXX_SYSHDR
+ #pragma GCC system_header
+ #endif
+ 
+ #if __cplusplus >= 202400L
+ 
+ #include "simd_details.h"
+ 
+ namespace std _GLIBCXX_VISIBILITY(default)
+ {
+ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ namespace simd
+ {
+   /** @internal
+    * Iterator type for basic_vec and basic_mask.
+    *
+    * C++26 [simd.iterator]
+    */
+   template <typename _Vp>
+     class __iterator
+     {
+       friend class __iterator<const _Vp>;
+ 
+       template <typename, typename>
+ 	friend class _VecBase;
+ 
+       template <size_t, typename>
+ 	friend class _MaskBase;
+ 
+       _Vp* _M_data = nullptr;
+ 
+       __simd_size_type _M_offset = 0;
+ 
+       constexpr
+       __iterator(_Vp& __d, __simd_size_type __off)
+       : _M_data(&__d), _M_offset(__off)
+       {}
+ 
+     public:
+       using value_type = typename _Vp::value_type;
+ 
+       using iterator_category = input_iterator_tag;
+ 
+       using iterator_concept = random_access_iterator_tag;
+ 
+       using difference_type = __simd_size_type;
+ 
+       constexpr __iterator() = default;
+ 
+       constexpr
+       __iterator(const __iterator &) = default;
+ 
+       constexpr __iterator&
+       operator=(const __iterator &) = default;
+ 
+       constexpr
+       __iterator(const __iterator<remove_const_t<_Vp>> &__i) requires is_const_v<_Vp>
+       : _M_data(__i._M_data), _M_offset(__i._M_offset)
+       {}
+ 
+       constexpr value_type
+       operator*() const
+       { return (*_M_data)[_M_offset]; } // checked in operator[]
+ 
+       constexpr __iterator&
+       operator++()
+       {
+ 	++_M_offset;
+ 	return *this;
+       }
+ 
+       constexpr __iterator
+       operator++(int)
+       {
+ 	__iterator r = *this;
+ 	++_M_offset;
+ 	return r;
+       }
+ 
+       constexpr __iterator&
+       operator--()
+       {
+ 	--_M_offset;
+ 	return *this;
+       }
+ 
+       constexpr __iterator
+       operator--(int)
+       {
+ 	__iterator r = *this;
+ 	--_M_offset;
+ 	return r;
+       }
+ 
+       constexpr __iterator&
+       operator+=(difference_type __x)
+       {
+ 	_M_offset += __x;
+ 	return *this;
+       }
+ 
+       constexpr __iterator&
+       operator-=(difference_type __x)
+       {
+ 	_M_offset -= __x;
+ 	return *this;
+       }
+ 
+       constexpr value_type
+       operator[](difference_type __i) const
+       { return (*_M_data)[_M_offset + __i]; } // checked in operator[]
+ 
+       constexpr friend bool operator==(__iterator __a, __iterator __b) = default;
+ 
+       constexpr friend bool operator==(__iterator __a, std::default_sentinel_t) noexcept
+       { return __a._M_offset == _Vp::size.value; }
+ 
+       constexpr friend auto operator<=>(__iterator __a, __iterator __b)
+       { return __a._M_offset <=> __b._M_offset; }
+ 
+       constexpr friend __iterator
+       operator+(const __iterator& __it, difference_type __x)
+       { return __iterator(*__it._M_data, __it._M_offset + __x); }
+ 
+       constexpr friend __iterator
+       operator+(difference_type __x, const __iterator& __it)
+       { return __iterator(*__it._M_data, __it._M_offset + __x); }
+ 
+       constexpr friend __iterator
+       operator-(const __iterator& __it, difference_type __x)
+       { return __iterator(*__it._M_data, __it._M_offset - __x); }
+ 
+       constexpr friend difference_type
+       operator-(__iterator __a, __iterator __b)
+       { return __a._M_offset - __b._M_offset; }
+ 
+       constexpr friend difference_type
+       operator-(__iterator __it, std::default_sentinel_t) noexcept
+       { return __it._M_offset - difference_type(_Vp::size.value); }
+ 
+       constexpr friend difference_type
+       operator-(std::default_sentinel_t, __iterator __it) noexcept
+       { return difference_type(_Vp::size.value) - __it._M_offset; }
+     };
+ } // namespace simd
+ _GLIBCXX_END_NAMESPACE_VERSION
+ } // namespace std
+ 
+ #endif // C++26
+ #endif // _GLIBCXX_SIMD_ITERATOR_H
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/simd_loadstore.h gcc-16-20260322/libstdc++-v3/include/bits/simd_loadstore.h
*** gcc-16-20260315/libstdc++-v3/include/bits/simd_loadstore.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/include/bits/simd_loadstore.h	Sun Mar 22 22:32:15 2026
***************
*** 0 ****
--- 1,408 ----
+ // Implementation of <simd> -*- C++ -*-
+ 
+ // Copyright The GNU Toolchain Authors.
+ //
+ // 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/>.
+ 
+ #ifndef _GLIBCXX_SIMD_LOADSTORE_H
+ #define _GLIBCXX_SIMD_LOADSTORE_H 1
+ 
+ #ifdef _GLIBCXX_SYSHDR
+ #pragma GCC system_header
+ #endif
+ 
+ #if __cplusplus >= 202400L
+ 
+ #include "simd_vec.h"
+ 
+ // psabi warnings are bogus because the ABI of the internal types never leaks into user code
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wpsabi"
+ 
+ // [simd.reductions] ----------------------------------------------------------
+ namespace std _GLIBCXX_VISIBILITY(default)
+ {
+ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ namespace simd
+ {
+   template <typename _Vp, typename _Tp>
+     struct __vec_load_return
+     { using type = _Vp; };
+ 
+   template <typename _Tp>
+     struct __vec_load_return<void, _Tp>
+     { using type = basic_vec<_Tp>; };
+ 
+   template <typename _Vp, typename _Tp>
+     using __vec_load_return_t = typename __vec_load_return<_Vp, _Tp>::type;
+ 
+   template <typename _Vp, typename _Tp>
+     using __load_mask_type_t = typename __vec_load_return_t<_Vp, _Tp>::mask_type;
+ 
+   template <typename _Tp>
+     concept __sized_contiguous_range
+       = ranges::contiguous_range<_Tp> && ranges::sized_range<_Tp>;
+ 
+   template <typename _Vp = void, __sized_contiguous_range _Rg, typename... _Flags>
+     [[__gnu__::__always_inline__]]
+     constexpr __vec_load_return_t<_Vp, ranges::range_value_t<_Rg>>
+     unchecked_load(_Rg&& __r, flags<_Flags...> __f = {})
+     {
+       using _Tp = ranges::range_value_t<_Rg>;
+       using _RV = __vec_load_return_t<_Vp, _Tp>;
+       using _Rp = typename _RV::value_type;
+       static_assert(__loadstore_convertible_to<ranges::range_value_t<_Rg>, _Rp, _Flags...>,
+ 		    "'flag_convert' must be used for conversions that are not value-preserving");
+ 
+       constexpr bool __allow_out_of_bounds = __f._S_test(__allow_partial_loadstore);
+       constexpr size_t __static_size = __static_range_size(__r);
+ 
+       if constexpr (!__allow_out_of_bounds && __static_sized_range<_Rg>)
+ 	static_assert(ranges::size(__r) >= _RV::size(), "given range must have sufficient size");
+ 
+       const auto* __ptr = __f.template _S_adjust_pointer<_RV>(ranges::data(__r));
+       const auto __rg_size = std::ranges::size(__r);
+       if constexpr (!__allow_out_of_bounds)
+ 	__glibcxx_simd_precondition(
+ 	  std::ranges::size(__r) >= _RV::size(),
+ 	  "Input range is too small. Did you mean to use 'partial_load'?");
+ 
+       if consteval
+ 	{
+ 	  return _RV([&](size_t __i) -> _Rp {
+ 		   if (__i >= __rg_size)
+ 		     return _Rp();
+ 		   else
+ 		     return static_cast<_Rp>(__r[__i]);
+ 		 });
+ 	}
+       else
+ 	{
+ 	  if constexpr ((__static_size != dynamic_extent && __static_size >= size_t(_RV::size()))
+ 			  || !__allow_out_of_bounds)
+ 	    return _RV(_LoadCtorTag(), __ptr);
+ 	  else
+ 	    return _RV::_S_partial_load(__ptr, __rg_size);
+ 	}
+     }
+ 
+   template <typename _Vp = void, __sized_contiguous_range _Rg, typename... _Flags>
+     [[__gnu__::__always_inline__]]
+     constexpr __vec_load_return_t<_Vp, ranges::range_value_t<_Rg>>
+     unchecked_load(_Rg&& __r, const __load_mask_type_t<_Vp, ranges::range_value_t<_Rg>>& __mask,
+ 		   flags<_Flags...> __f = {})
+     {
+       using _Tp = ranges::range_value_t<_Rg>;
+       using _RV = __vec_load_return_t<_Vp, _Tp>;
+       using _Rp = typename _RV::value_type;
+       static_assert(__vectorizable<_Tp>);
+       static_assert(__explicitly_convertible_to<_Tp, _Rp>);
+       static_assert(__loadstore_convertible_to<_Tp, _Rp, _Flags...>,
+ 		    "'flag_convert' must be used for conversions that are not value-preserving");
+ 
+       constexpr bool __allow_out_of_bounds = __f._S_test(__allow_partial_loadstore);
+       constexpr auto __static_size = __static_range_size(__r);
+ 
+       if constexpr (!__allow_out_of_bounds && __static_sized_range<_Rg>)
+ 	static_assert(ranges::size(__r) >= _RV::size(), "given range must have sufficient size");
+ 
+       const auto* __ptr = __f.template _S_adjust_pointer<_RV>(ranges::data(__r));
+ 
+       if constexpr (!__allow_out_of_bounds)
+ 	__glibcxx_simd_precondition(
+ 	  ranges::size(__r) >= size_t(_RV::size()),
+ 	  "Input range is too small. Did you mean to use 'partial_load'?");
+ 
+       const size_t __rg_size = ranges::size(__r);
+       if consteval
+ 	{
+ 	  return _RV([&](size_t __i) -> _Rp {
+ 		   if (__i >= __rg_size || !__mask[int(__i)])
+ 		     return _Rp();
+ 		   else
+ 		     return static_cast<_Rp>(__r[__i]);
+ 		 });
+ 	}
+       else
+ 	{
+ 	  constexpr bool __no_size_check
+ 	    = !__allow_out_of_bounds
+ 		|| (__static_size != dynamic_extent
+ 		      && __static_size >= size_t(_RV::size.value));
+ 	  if constexpr (_RV::size() == 1)
+ 	    return __mask[0] && (__no_size_check || __rg_size > 0) ? _RV(_LoadCtorTag(), __ptr)
+ 								   : _RV();
+ 	  else if constexpr (__no_size_check)
+ 	    return _RV::_S_masked_load(__ptr, __mask);
+ 	  else if (__rg_size >= size_t(_RV::size()))
+ 	    return _RV::_S_masked_load(__ptr, __mask);
+ 	  else if (__rg_size > 0)
+ 	    return _RV::_S_masked_load(
+ 		     __ptr, __mask && _RV::mask_type::_S_partial_mask_of_n(int(__rg_size)));
+ 	  else
+ 	    return _RV();
+ 	}
+     }
+ 
+   template <typename _Vp = void, contiguous_iterator _It, typename... _Flags>
+     [[__gnu__::__always_inline__]]
+     constexpr __vec_load_return_t<_Vp, iter_value_t<_It>>
+     unchecked_load(_It __first, iter_difference_t<_It> __n, flags<_Flags...> __f = {})
+     { return simd::unchecked_load<_Vp>(span<const iter_value_t<_It>>(__first, __n), __f); }
+ 
+   template <typename _Vp = void, contiguous_iterator _It, typename... _Flags>
+     [[__gnu__::__always_inline__]]
+     constexpr __vec_load_return_t<_Vp, iter_value_t<_It>>
+     unchecked_load(_It __first, iter_difference_t<_It> __n,
+ 		   const __load_mask_type_t<_Vp, iter_value_t<_It>>& __mask,
+ 		   flags<_Flags...> __f = {})
+     { return simd::unchecked_load<_Vp>(span<const iter_value_t<_It>>(__first, __n), __mask, __f); }
+ 
+   template <typename _Vp = void, contiguous_iterator _It, sized_sentinel_for<_It> _Sp,
+ 	    typename... _Flags>
+     [[__gnu__::__always_inline__]]
+     constexpr __vec_load_return_t<_Vp, iter_value_t<_It>>
+     unchecked_load(_It __first, _Sp __last, flags<_Flags...> __f = {})
+     { return simd::unchecked_load<_Vp>(span<const iter_value_t<_It>>(__first, __last), __f); }
+ 
+   template <typename _Vp = void, contiguous_iterator _It, sized_sentinel_for<_It> _Sp,
+ 	    typename... _Flags>
+     [[__gnu__::__always_inline__]]
+     constexpr __vec_load_return_t<_Vp, iter_value_t<_It>>
+     unchecked_load(_It __first, _Sp __last,
+ 		   const __load_mask_type_t<_Vp, iter_value_t<_It>>& __mask,
+ 		   flags<_Flags...> __f = {})
+     {
+       return simd::unchecked_load<_Vp>(span<const iter_value_t<_It>>(__first, __last), __mask, __f);
+     }
+ 
+   template <typename _Vp = void, __sized_contiguous_range _Rg, typename... _Flags>
+     [[__gnu__::__always_inline__]]
+     constexpr __vec_load_return_t<_Vp, ranges::range_value_t<_Rg>>
+     partial_load(_Rg&& __r, flags<_Flags...> __f = {})
+     { return simd::unchecked_load<_Vp>(__r, __f | __allow_partial_loadstore); }
+ 
+   template <typename _Vp = void, __sized_contiguous_range _Rg, typename... _Flags>
+     [[__gnu__::__always_inline__]]
+     constexpr __vec_load_return_t<_Vp, ranges::range_value_t<_Rg>>
+     partial_load(_Rg&& __r, const __load_mask_type_t<_Vp, ranges::range_value_t<_Rg>>& __mask,
+ 		 flags<_Flags...> __f = {})
+     { return simd::unchecked_load<_Vp>(__r, __mask, __f | __allow_partial_loadstore); }
+ 
+   template <typename _Vp = void, contiguous_iterator _It, typename... _Flags>
+     [[__gnu__::__always_inline__]]
+     constexpr __vec_load_return_t<_Vp, iter_value_t<_It>>
+     partial_load(_It __first, iter_difference_t<_It> __n, flags<_Flags...> __f = {})
+     { return partial_load<_Vp>(span<const iter_value_t<_It>>(__first, __n), __f); }
+ 
+   template <typename _Vp = void, contiguous_iterator _It, typename... _Flags>
+     [[__gnu__::__always_inline__]]
+     constexpr __vec_load_return_t<_Vp, iter_value_t<_It>>
+     partial_load(_It __first, iter_difference_t<_It> __n,
+ 		 const __load_mask_type_t<_Vp, iter_value_t<_It>>& __mask,
+ 		 flags<_Flags...> __f = {})
+     { return partial_load<_Vp>(span<const iter_value_t<_It>>(__first, __n), __mask, __f); }
+ 
+   template <typename _Vp = void, contiguous_iterator _It, sized_sentinel_for<_It> _Sp,
+ 	    typename... _Flags>
+     [[__gnu__::__always_inline__]]
+     constexpr __vec_load_return_t<_Vp, iter_value_t<_It>>
+     partial_load(_It __first, _Sp __last, flags<_Flags...> __f = {})
+     { return partial_load<_Vp>(span<const iter_value_t<_It>>(__first, __last), __f); }
+ 
+   template <typename _Vp = void, contiguous_iterator _It, sized_sentinel_for<_It> _Sp,
+ 	    typename... _Flags>
+     [[__gnu__::__always_inline__]]
+     constexpr __vec_load_return_t<_Vp, iter_value_t<_It>>
+     partial_load(_It __first, _Sp __last, const __load_mask_type_t<_Vp, iter_value_t<_It>>& __mask,
+ 		 flags<_Flags...> __f = {})
+     { return partial_load<_Vp>(span<const iter_value_t<_It>>(__first, __last), __mask, __f); }
+ 
+   template <typename _Tp, typename _Ap, __sized_contiguous_range _Rg, typename... _Flags>
+     requires indirectly_writable<ranges::iterator_t<_Rg>, _Tp>
+     [[__gnu__::__always_inline__]]
+     constexpr void
+     unchecked_store(const basic_vec<_Tp, _Ap>& __v, _Rg&& __r, flags<_Flags...> __f = {})
+     {
+       using _TV = basic_vec<_Tp, _Ap>;
+       static_assert(destructible<_TV>);
+       static_assert(__loadstore_convertible_to<_Tp, ranges::range_value_t<_Rg>, _Flags...>,
+ 		    "'flag_convert' must be used for conversions that are not value-preserving");
+ 
+       constexpr bool __allow_out_of_bounds = __f._S_test(__allow_partial_loadstore);
+       if constexpr (!__allow_out_of_bounds && __static_sized_range<_Rg>)
+ 	static_assert(ranges::size(__r) >= _TV::size(), "given range must have sufficient size");
+ 
+       auto* __ptr = __f.template _S_adjust_pointer<_TV>(ranges::data(__r));
+       const auto __rg_size = ranges::size(__r);
+       if constexpr (!__allow_out_of_bounds)
+ 	__glibcxx_simd_precondition(
+ 	  ranges::size(__r) >= _TV::size(),
+ 	  "output range is too small. Did you mean to use 'partial_store'?");
+ 
+       if consteval
+ 	{
+ 	  for (unsigned __i = 0; __i < __rg_size && __i < _TV::size(); ++__i)
+ 	    __ptr[__i] = static_cast<ranges::range_value_t<_Rg>>(__v[__i]);
+ 	}
+       else
+ 	{
+ 	  if constexpr (!__allow_out_of_bounds)
+ 	    __v._M_store(__ptr);
+ 	  else
+ 	    _TV::_S_partial_store(__v, __ptr, __rg_size);
+ 	}
+     }
+ 
+   template <typename _Tp, typename _Ap, __sized_contiguous_range _Rg, typename... _Flags>
+     requires indirectly_writable<ranges::iterator_t<_Rg>, _Tp>
+     [[__gnu__::__always_inline__]]
+     constexpr void
+     unchecked_store(const basic_vec<_Tp, _Ap>& __v, _Rg&& __r,
+ 		    const typename basic_vec<_Tp, _Ap>::mask_type& __mask,
+ 		    flags<_Flags...> __f = {})
+     {
+       using _TV = basic_vec<_Tp, _Ap>;
+       static_assert(__loadstore_convertible_to<_Tp, ranges::range_value_t<_Rg>, _Flags...>,
+ 		    "'flag_convert' must be used for conversions that are not value-preserving");
+ 
+       constexpr bool __allow_out_of_bounds = __f._S_test(__allow_partial_loadstore);
+       if constexpr (!__allow_out_of_bounds && __static_sized_range<_Rg>)
+ 	static_assert(ranges::size(__r) >= _TV::size(), "given range must have sufficient size");
+ 
+       auto* __ptr = __f.template _S_adjust_pointer<_TV>(ranges::data(__r));
+ 
+       if constexpr (!__allow_out_of_bounds)
+ 	__glibcxx_simd_precondition(
+ 	  ranges::size(__r) >= size_t(_TV::size()),
+ 	  "output range is too small. Did you mean to use 'partial_store'?");
+ 
+       const size_t __rg_size = ranges::size(__r);
+       if consteval
+ 	{
+ 	  for (int __i = 0; __i < _TV::size(); ++__i)
+ 	    {
+ 	      if (__mask[__i] && (!__allow_out_of_bounds || size_t(__i) < __rg_size))
+ 		__ptr[__i] = static_cast<ranges::range_value_t<_Rg>>(__v[__i]);
+ 	    }
+ 	}
+       else
+ 	{
+ 	  if (__allow_out_of_bounds && __rg_size < size_t(_TV::size()))
+ 	    _TV::_S_masked_store(__v, __ptr,
+ 				 __mask && _TV::mask_type::_S_partial_mask_of_n(int(__rg_size)));
+ 	  else
+ 	    _TV::_S_masked_store(__v, __ptr, __mask);
+ 	}
+     }
+ 
+   template <typename _Tp, typename _Ap, contiguous_iterator _It, typename... _Flags>
+     requires indirectly_writable<_It, _Tp>
+     [[__gnu__::__always_inline__]]
+     constexpr void
+     unchecked_store(const basic_vec<_Tp, _Ap>& __v, _It __first,
+ 		    iter_difference_t<_It> __n, flags<_Flags...> __f = {})
+     { simd::unchecked_store(__v, std::span<iter_value_t<_It>>(__first, __n), __f); }
+ 
+   template <typename _Tp, typename _Ap, contiguous_iterator _It, typename... _Flags>
+     requires indirectly_writable<_It, _Tp>
+     [[__gnu__::__always_inline__]]
+     constexpr void
+     unchecked_store(const basic_vec<_Tp, _Ap>& __v, _It __first, iter_difference_t<_It> __n,
+ 		    const typename basic_vec<_Tp, _Ap>::mask_type& __mask,
+ 		    flags<_Flags...> __f = {})
+     { simd::unchecked_store(__v, std::span<iter_value_t<_It>>(__first, __n), __mask, __f); }
+ 
+   template <typename _Tp, typename _Ap, contiguous_iterator _It, sized_sentinel_for<_It> _Sp,
+ 	    typename... _Flags>
+     requires indirectly_writable<_It, _Tp>
+     [[__gnu__::__always_inline__]]
+     constexpr void
+     unchecked_store(const basic_vec<_Tp, _Ap>& __v, _It __first, _Sp __last,
+ 		    flags<_Flags...> __f = {})
+     { simd::unchecked_store(__v, std::span<iter_value_t<_It>>(__first, __last), __f); }
+ 
+   template <typename _Tp, typename _Ap, contiguous_iterator _It, sized_sentinel_for<_It> _Sp,
+ 	    typename... _Flags>
+     requires indirectly_writable<_It, _Tp>
+     [[__gnu__::__always_inline__]]
+     constexpr void
+     unchecked_store(const basic_vec<_Tp, _Ap>& __v, _It __first, _Sp __last,
+ 		    const typename basic_vec<_Tp, _Ap>::mask_type& __mask,
+ 		    flags<_Flags...> __f = {})
+     { simd::unchecked_store(__v, std::span<iter_value_t<_It>>(__first, __last), __mask, __f); }
+ 
+   template <typename _Tp, typename _Ap, __sized_contiguous_range _Rg, typename... _Flags>
+     requires indirectly_writable<ranges::iterator_t<_Rg>, _Tp>
+     [[__gnu__::__always_inline__]]
+     constexpr void
+     partial_store(const basic_vec<_Tp, _Ap>& __v, _Rg&& __r, flags<_Flags...> __f = {})
+     { simd::unchecked_store(__v, __r, __f | __allow_partial_loadstore); }
+ 
+   template <typename _Tp, typename _Ap, __sized_contiguous_range _Rg, typename... _Flags>
+     requires indirectly_writable<ranges::iterator_t<_Rg>, _Tp>
+     [[__gnu__::__always_inline__]]
+     constexpr void
+     partial_store(const basic_vec<_Tp, _Ap>& __v, _Rg&& __r,
+ 		  const typename basic_vec<_Tp, _Ap>::mask_type& __mask,
+ 		  flags<_Flags...> __f = {})
+     { simd::unchecked_store(__v, __r, __mask, __f | __allow_partial_loadstore); }
+ 
+   template <typename _Tp, typename _Ap, contiguous_iterator _It, typename... _Flags>
+     requires indirectly_writable<_It, _Tp>
+     [[__gnu__::__always_inline__]]
+     constexpr void
+     partial_store(const basic_vec<_Tp, _Ap>& __v, _It __first, iter_difference_t<_It> __n,
+ 		  flags<_Flags...> __f = {})
+     { partial_store(__v, span(__first, __n), __f); }
+ 
+   template <typename _Tp, typename _Ap, contiguous_iterator _It, typename... _Flags>
+     requires indirectly_writable<_It, _Tp>
+     [[__gnu__::__always_inline__]]
+     constexpr void
+     partial_store(const basic_vec<_Tp, _Ap>& __v, _It __first, iter_difference_t<_It> __n,
+ 		  const typename basic_vec<_Tp, _Ap>::mask_type& __mask, flags<_Flags...> __f = {})
+     { partial_store(__v, span(__first, __n), __mask, __f); }
+ 
+   template <typename _Tp, typename _Ap, contiguous_iterator _It, sized_sentinel_for<_It> _Sp,
+ 	    typename... _Flags>
+     requires indirectly_writable<_It, _Tp>
+     [[__gnu__::__always_inline__]]
+     constexpr void
+     partial_store(const basic_vec<_Tp, _Ap>& __v, _It __first, _Sp __last,
+ 		  flags<_Flags...> __f = {})
+     { partial_store(__v, span(__first, __last), __f); }
+ 
+   template <typename _Tp, typename _Ap, contiguous_iterator _It, sized_sentinel_for<_It> _Sp,
+ 	    typename... _Flags>
+     requires indirectly_writable<_It, _Tp>
+     [[__gnu__::__always_inline__]]
+     constexpr void
+     partial_store(const basic_vec<_Tp, _Ap>& __v, _It __first, _Sp __last,
+ 		  const typename basic_vec<_Tp, _Ap>::mask_type& __mask, flags<_Flags...> __f = {})
+     { partial_store(__v, span(__first, __last), __mask, __f); }
+ } // namespace simd
+ _GLIBCXX_END_NAMESPACE_VERSION
+ } // namespace std
+ 
+ #pragma GCC diagnostic pop
+ #endif // C++26
+ #endif // _GLIBCXX_SIMD_LOADSTORE_H
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/simd_mask.h gcc-16-20260322/libstdc++-v3/include/bits/simd_mask.h
*** gcc-16-20260315/libstdc++-v3/include/bits/simd_mask.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/include/bits/simd_mask.h	Sun Mar 22 22:32:15 2026
***************
*** 0 ****
--- 1,1972 ----
+ // Implementation of <simd> -*- C++ -*-
+ 
+ // Copyright The GNU Toolchain Authors.
+ //
+ // 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/>.
+ 
+ #ifndef _GLIBCXX_SIMD_MASK_H
+ #define _GLIBCXX_SIMD_MASK_H 1
+ 
+ #ifdef _GLIBCXX_SYSHDR
+ #pragma GCC system_header
+ #endif
+ 
+ #if __cplusplus >= 202400L
+ 
+ #include "simd_iterator.h"
+ #include "vec_ops.h"
+ #if _GLIBCXX_X86
+ #include "simd_x86.h"
+ #endif
+ 
+ #include <bit>
+ #include <bitset>
+ 
+ // psabi warnings are bogus because the ABI of the internal types never leaks into user code
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wpsabi"
+ 
+ namespace std _GLIBCXX_VISIBILITY(default)
+ {
+ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ namespace simd
+ {
+   template <unsigned _Np>
+     struct _SwapNeighbors
+     {
+       consteval unsigned
+       operator()(unsigned __i, unsigned __size) const
+       {
+ 	if (__size % (2 * _Np) != 0)
+ 	  __builtin_abort(); // swap_neighbors<N> permutation requires a multiple of 2N elements
+ 	else if (std::has_single_bit(_Np))
+ 	  return __i ^ _Np;
+ 	else if (__i % (2 * _Np) >= _Np)
+ 	  return __i - _Np;
+ 	else
+ 	  return __i + _Np;
+       }
+     };
+ 
+   template <size_t _Np, size_t _Mp>
+     constexpr auto
+     __bitset_split(const bitset<_Mp>& __b)
+     {
+       constexpr auto __bits_per_word = __CHAR_BIT__ * __SIZEOF_LONG__;
+       if constexpr (_Np % __bits_per_word == 0)
+ 	{
+ 	  struct _Tmp
+ 	  {
+ 	    bitset<_Np> _M_lo;
+ 	    bitset<_Mp - _Np> _M_hi;
+ 	  };
+ 	  return __builtin_bit_cast(_Tmp, __b);
+ 	}
+       else
+ 	{
+ 	  constexpr auto __bits_per_ullong = __CHAR_BIT__ * __SIZEOF_LONG_LONG__;
+ 	  static_assert(_Mp <= __bits_per_ullong);
+ 	  using _Lo = _Bitmask<_Np>;
+ 	  using _Hi = _Bitmask<_Mp - _Np>;
+ 	  struct _Tmp
+ 	  {
+ 	    _Lo _M_lo;
+ 	    _Hi _M_hi;
+ 	  };
+ 	  return _Tmp {static_cast<_Lo>(__b.to_ullong()), static_cast<_Hi>(__b.to_ullong() >> _Np)};
+ 	}
+     }
+ 
+   static_assert(__bitset_split<64>(bitset<128>(1))._M_lo == bitset<64>(1));
+   static_assert(__bitset_split<64>(bitset<128>(1))._M_hi == bitset<64>(0));
+ 
+   // [simd.traits]
+   // --- rebind ---
+   template <typename _Tp, typename _Vp, _ArchTraits _Traits = {}>
+     struct rebind
+     {};
+ 
+   /**
+    * Computes a member @c type `basic_vec<_Tp, Abi>`, where @c Abi is chosen such that the
+    * number of elements is equal to `_Vp::size()` and features of the ABI tag (such as the
+    * internal representation of masks, or storage order of complex components) are preserved.
+    */
+   template <__vectorizable _Tp, __simd_vec_type _Vp, _ArchTraits _Traits>
+     //requires requires { typename __deduce_abi_t<_Tp, _Vp::size()>; }
+     struct rebind<_Tp, _Vp, _Traits>
+     { using type = __similar_vec<_Tp, _Vp::size(), typename _Vp::abi_type>; };
+ 
+   /**
+    * As above, except for @c basic_mask.
+    */
+   template <__vectorizable _Tp, __simd_mask_type _Mp, _ArchTraits _Traits>
+     //requires requires { typename __deduce_abi_t<_Tp, _Mp::size()>; }
+     struct rebind<_Tp, _Mp, _Traits>
+     { using type = __similar_mask<_Tp, _Mp::size(), typename _Mp::abi_type>; };
+ 
+   template <typename _Tp, typename _Vp>
+     using rebind_t = typename rebind<_Tp, _Vp>::type;
+ 
+   // --- resize ---
+   template <__simd_size_type _Np, typename _Vp, _ArchTraits _Traits = {}>
+     struct resize
+     {};
+ 
+   template <__simd_size_type _Np, __simd_vec_type _Vp, _ArchTraits _Traits>
+     requires (_Np >= 1)
+     //requires requires { typename __deduce_abi_t<typename _Vp::value_type, _Np>; }
+     struct resize<_Np, _Vp, _Traits>
+     { using type = __similar_vec<typename _Vp::value_type, _Np, typename _Vp::abi_type>; };
+ 
+   template <__simd_size_type _Np, __simd_mask_type _Mp, _ArchTraits _Traits>
+     requires (_Np >= 1)
+     //requires requires { typename __deduce_abi_t<typename _Mp::value_type, _Np>; }
+     struct resize<_Np, _Mp, _Traits>
+     {
+       using _A1 = decltype(__abi_rebind<__mask_element_size<_Mp>, _Np, typename _Mp::abi_type,
+ 					true>());
+ 
+       static_assert(__abi_tag<_A1>);
+ 
+       static_assert(_Mp::abi_type::_S_variant == _A1::_S_variant || __scalar_abi_tag<_A1>
+ 		      || __scalar_abi_tag<typename _Mp::abi_type>);
+ 
+       using type = basic_mask<__mask_element_size<_Mp>, _A1>;
+     };
+ 
+   template <__simd_size_type _Np, typename _Vp>
+     using resize_t = typename resize<_Np, _Vp>::type;
+ 
+   // [simd.syn]
+   inline constexpr __simd_size_type zero_element   = numeric_limits<int>::min();
+ 
+   inline constexpr __simd_size_type uninit_element = zero_element + 1;
+ 
+   // [simd.permute.static]
+   template<__simd_size_type _Np = 0, __simd_vec_or_mask_type _Vp,
+ 	   __index_permutation_function<_Vp> _IdxMap>
+     [[__gnu__::__always_inline__]]
+     constexpr resize_t<_Np == 0 ? _Vp::size() : _Np, _Vp>
+     permute(const _Vp& __v, _IdxMap&& __idxmap)
+     { return resize_t<_Np == 0 ? _Vp::size() : _Np, _Vp>::_S_static_permute(__v, __idxmap); }
+ 
+   // [simd.permute.dynamic]
+   template<__simd_vec_or_mask_type _Vp, __simd_integral _Ip>
+     [[__gnu__::__always_inline__]]
+     constexpr resize_t<_Ip::size(), _Vp>
+     permute(const _Vp& __v, const _Ip& __indices)
+     { return __v[__indices]; }
+ 
+   // [simd.creation] ----------------------------------------------------------
+   template<__simd_vec_type _Vp, typename _Ap>
+     [[__gnu__::__always_inline__]]
+     constexpr auto
+     chunk(const basic_vec<typename _Vp::value_type, _Ap>& __x) noexcept
+     { return __x.template _M_chunk<_Vp>(); }
+ 
+   template<__simd_mask_type _Mp, typename _Ap>
+     [[__gnu__::__always_inline__]]
+     constexpr auto
+     chunk(const basic_mask<__mask_element_size<_Mp>, _Ap>& __x) noexcept
+     { return __x.template _M_chunk<_Mp>(); }
+ 
+   template<__simd_size_type _Np, typename _Tp, typename _Ap>
+     [[__gnu__::__always_inline__]]
+     constexpr auto
+     chunk(const basic_vec<_Tp, _Ap>& __x) noexcept
+     -> decltype(chunk<resize_t<_Np, basic_vec<_Tp, _Ap>>>(__x))
+     { return chunk<resize_t<_Np, basic_vec<_Tp, _Ap>>>(__x); }
+ 
+   template<__simd_size_type _Np, size_t _Bytes, typename _Ap>
+     [[__gnu__::__always_inline__]]
+     constexpr auto
+     chunk(const basic_mask<_Bytes, _Ap>& __x) noexcept
+     -> decltype(chunk<resize_t<_Np, basic_mask<_Bytes, _Ap>>>(__x))
+     { return chunk<resize_t<_Np, basic_mask<_Bytes, _Ap>>>(__x); }
+ 
+   // LWG???? (reported 2025-11-25)
+   template<typename _Tp, typename _A0, typename... _Abis>
+     constexpr resize_t<(_A0::_S_size + ... + _Abis::_S_size), basic_vec<_Tp, _A0>>
+     cat(const basic_vec<_Tp, _A0>& __x0, const basic_vec<_Tp, _Abis>&... __xs) noexcept
+     {
+       return resize_t<(_A0::_S_size + ... + _Abis::_S_size), basic_vec<_Tp, _A0>>
+ 	       ::_S_concat(__x0, __xs...);
+     }
+ 
+   // LWG???? (reported 2025-11-25)
+   template<size_t _Bytes, typename _A0, typename... _Abis>
+     constexpr resize_t<(_A0::_S_size + ... + _Abis::_S_size), basic_mask<_Bytes, _A0>>
+     cat(const basic_mask<_Bytes, _A0>& __x0, const basic_mask<_Bytes, _Abis>&... __xs) noexcept
+     {
+       return resize_t<(_A0::_S_size + ... + _Abis::_S_size), basic_mask<_Bytes, _A0>>
+ 	       ::_S_concat(__x0, __xs...);
+     }
+ 
+   // implementation helper for chunk and cat
+   consteval int
+   __packs_to_skip_at_front(int __offset, initializer_list<int> __sizes)
+   {
+     int __i = 0;
+     int __n = 0;
+     for (int __s : __sizes)
+       {
+ 	__n += __s;
+ 	if (__n > __offset)
+ 	  return __i;
+ 	++__i;
+       }
+     __builtin_trap(); // called out of contract
+   }
+ 
+   consteval int
+   __packs_to_skip_at_back(int __offset, int __max, initializer_list<int> __sizes)
+   {
+     int __i = 0;
+     int __n = -__offset;
+     for (int __s : __sizes)
+       {
+ 	++__i;
+ 	__n += __s;
+ 	if (__n >= __max)
+ 	  return int(__sizes.size()) - __i;
+       }
+     return 0;
+   }
+ 
+   // in principle, this overload allows conversions to _Dst - and it wouldn't be wrong - but the
+   // general overload below is still a better candidate in overload resolution
+   template <typename _Dst>
+     [[__gnu__::__always_inline__]]
+     constexpr _Dst
+     __extract_simd_at(auto _Offset, const _Dst& __r, const auto&...)
+     requires(_Offset.value == 0)
+     { return __r; }
+ 
+   template <typename _Dst, typename _V0>
+     [[__gnu__::__always_inline__]]
+     constexpr _Dst
+     __extract_simd_at(auto _Offset, const _V0&, const _Dst& __r, const auto&...)
+     requires(_Offset.value == _V0::size.value)
+     { return __r; }
+ 
+   template <typename _Dst, typename... _Vs>
+     [[__gnu__::__always_inline__]]
+     constexpr _Dst
+     __extract_simd_at(auto _Offset, const _Vs&... __xs)
+     {
+       using _Adst = typename _Dst::abi_type;
+       if constexpr (_Adst::_S_nreg >= 2)
+ 	{
+ 	  using _Dst0 = remove_cvref_t<decltype(declval<_Dst>()._M_get_low())>;
+ 	  using _Dst1 = remove_cvref_t<decltype(declval<_Dst>()._M_get_high())>;
+ 	  return _Dst::_S_init(__extract_simd_at<_Dst0>(_Offset, __xs...),
+ 			       __extract_simd_at<_Dst1>(_Offset + _Dst0::size, __xs...));
+ 	}
+       else
+ 	{
+ 	  using _Ret = remove_cvref_t<decltype(declval<_Dst>()._M_get())>;
+ 	  constexpr bool __use_bitmask = __simd_mask_type<_Dst> && _Adst::_S_is_bitmask;
+ 	  constexpr int __dst_full_size = __bit_ceil(unsigned(_Adst::_S_size));
+ 	  constexpr int __nargs = sizeof...(__xs);
+ 	  using _Afirst = typename _Vs...[0]::abi_type;
+ 	  using _Alast = typename _Vs...[__nargs - 1]::abi_type;
+ 	  const auto& __x0 = __xs...[0];
+ 	  const auto& __xlast = __xs...[__nargs - 1];
+ 	  constexpr int __ninputs = (_Vs::size.value + ...);
+ 	  if constexpr (_Offset.value >= _Afirst::_S_size
+ 			  || __ninputs - _Offset.value - _Alast::_S_size >= _Adst::_S_size)
+ 	    { // can drop inputs at the front and/or back of the pack
+ 	      constexpr int __skip_front = __packs_to_skip_at_front(_Offset.value,
+ 								    {_Vs::size.value...});
+ 	      constexpr int __skip_back = __packs_to_skip_at_back(_Offset.value, _Adst::_S_size,
+ 								  {_Vs::size.value...});
+ 	      static_assert(__skip_front > 0 || __skip_back > 0);
+ 	      constexpr auto [...__skip] = _IotaArray<__skip_front>;
+ 	      constexpr auto [...__is] = _IotaArray<__nargs - __skip_front - __skip_back>;
+ 	      constexpr int __new_offset = _Offset.value - (0 + ... + _Vs...[__skip]::size.value);
+ 	      return __extract_simd_at<_Dst>(cw<__new_offset>, __xs...[__is + __skip_front]...);
+ 	    }
+ 	  else if constexpr (_Adst::_S_size == 1)
+ 	    { // trivial conversion to one value_type
+ 	      return _Dst(__x0[_Offset.value]);
+ 	    }
+ 	  else if constexpr (_Afirst::_S_nreg >= 2 || _Alast::_S_nreg >= 2)
+ 	    { // flatten first and/or last multi-register argument
+ 	      constexpr bool __flatten_first = _Afirst::_S_nreg >= 2;
+ 	      constexpr bool __flatten_last = __nargs > 1 && _Alast::_S_nreg >= 2;
+ 	      constexpr auto [...__is] = _IotaArray<__nargs - __flatten_first - __flatten_last>;
+ 	      if constexpr (__flatten_first && __flatten_last)
+ 		return __extract_simd_at<_Dst>(
+ 			 _Offset, __x0._M_get_low(), __x0._M_get_high(), __xs...[__is + 1]...,
+ 			 __xlast._M_get_low(), __xlast._M_get_high());
+ 	      else if constexpr (__flatten_first)
+ 		return __extract_simd_at<_Dst>(
+ 			 _Offset, __x0._M_get_low(), __x0._M_get_high(), __xs...[__is + 1]...);
+ 	      else
+ 		return __extract_simd_at<_Dst>(
+ 			 _Offset, __xs...[__is]..., __xlast._M_get_low(), __xlast._M_get_high());
+ 	    }
+ 	  else if constexpr (__simd_mask_type<_Dst>
+ 			       && ((_Adst::_S_variant != _Vs::abi_type::_S_variant
+ 				      && !__scalar_abi_tag<typename _Vs::abi_type>) || ...))
+ 	    { // convert ABI tag if incompatible
+ 	      return __extract_simd_at<_Dst>(
+ 		       _Offset, static_cast<const resize_t<_Vs::size.value, _Dst>&>(__xs)...);
+ 	    }
+ 
+ 	  // at this point __xs should be as small as possible; there may be some corner cases left
+ 
+ 	  else if constexpr (__nargs == 1)
+ 	    { // simple and optimal
+ 	      if constexpr (__use_bitmask)
+ 		return _Dst(_Ret(__x0._M_to_uint() >> _Offset.value));
+ 	      else
+ 		return _VecOps<_Ret>::_S_extract(__x0._M_concat_data(false), _Offset);
+ 	    }
+ 	  else if constexpr (__use_bitmask)
+ 	    { // fairly simple and optimal bit shifting solution
+ 	      static_assert(_Afirst::_S_nreg == 1);
+ 	      static_assert(_Offset.value < _Afirst::_S_size);
+ 	      int __offset = -_Offset.value;
+ 	      _Ret __r;
+ 	      template for (const auto& __x : {__xs...})
+ 		{
+ 		  if (__offset <= 0)
+ 		    __r = _Ret(__x._M_to_uint() >> -__offset);
+ 		  else if (__offset < _Adst::_S_size)
+ 		    __r |= _Ret(_Ret(__x._M_to_uint()) << __offset);
+ 		  __offset += __x.size.value;
+ 		}
+ 	      return _Dst(__r);
+ 	    }
+ 	  else if constexpr (__nargs == 2 && _Offset == 0 && _Adst::_S_nreg == 1
+ 			       && _Afirst::_S_size >= _Alast::_S_size
+ 			       && __has_single_bit(unsigned(_Afirst::_S_size)))
+ 	    { // simple __vec_concat
+ 	      if constexpr (_Afirst::_S_size == 1)
+ 		// even simpler init from two values
+ 		return _Ret{__x0._M_concat_data()[0], __xlast._M_concat_data()[0]};
+ 	      else
+ 		{
+ 		  const auto __v0 = __x0._M_concat_data();
+ 		  const auto __v1 = __vec_zero_pad_to<sizeof(__v0)>(__xlast._M_concat_data());
+ 		  return __vec_concat(__v0, __v1);
+ 		}
+ 	    }
+ 	  else if constexpr (__nargs == 2 && _Adst::_S_nreg == 1 && _Offset == 0
+ 			       && _Afirst::_S_nreg == 1 && _Alast::_S_size == 1)
+ 	    { // optimize insertion of one element at the end
+ 	      _Ret __r = __vec_zero_pad_to<sizeof(_Ret)>(__x0._M_get());
+ 	      __vec_set(__r, _Afirst::_S_size, __xlast._M_concat_data()[0]);
+ 	      return __r;
+ 	    }
+ 	  else if constexpr (__nargs == 2 && _Adst::_S_nreg == 1 && _Offset == 0
+ 			       && _Afirst::_S_nreg == 1 && _Alast::_S_size == 2)
+ 	    { // optimize insertion of two elements at the end
+ 	      _Ret __r = __vec_zero_pad_to<sizeof(_Ret)>(__x0._M_concat_data());
+ 	      const auto __x1 = __xlast._M_concat_data();
+ 	      if constexpr (sizeof(__x1) <= sizeof(double) && (_Afirst::_S_size & 1) == 0)
+ 		{ // can use a single insert instruction
+ 		  using _Up = __conditional_t<
+ 				is_floating_point_v<__vec_value_type<_Ret>>,
+ 				__conditional_t<sizeof(__x1) == sizeof(double), double, float>,
+ 				__integer_from<sizeof(__x1)>>;
+ 		  auto __r2 = __vec_bit_cast<_Up>(__r);
+ 		  __vec_set(__r2, _Afirst::_S_size / 2, __vec_bit_cast<_Up>(__x1)[0]);
+ 		  __r = reinterpret_cast<_Ret>(__r2);
+ 		}
+ 	      else
+ 		{
+ 		  __vec_set(__r, _Afirst::_S_size, __x1[0]);
+ 		  __vec_set(__r, _Afirst::_S_size + 1, __x1[1]);
+ 		}
+ 	      return __r;
+ 	    }
+ 	  else if constexpr (__nargs == 2 && _Afirst::_S_nreg == 1 && _Alast::_S_nreg == 1)
+ 	    { // optimize concat of two input vectors (e.g. using palignr)
+ 	      constexpr auto [...__is] = _IotaArray<__dst_full_size>;
+ 	      constexpr int __v2_offset = __width_of<decltype(__x0._M_concat_data())>;
+ 	      return __builtin_shufflevector(
+ 		       __x0._M_concat_data(), __xlast._M_concat_data(), [](int __i) consteval {
+ 		       if (__i < _Afirst::_S_size)
+ 			 return __i;
+ 		       __i -= _Afirst::_S_size;
+ 		       if (__i < _Alast::_S_size)
+ 			 return __i + __v2_offset;
+ 		       else
+ 			 return -1;
+ 		     }(__is + _Offset.value)...);
+ 	    }
+ 	  else if (__is_const_known(__xs...) || __ninputs == _Adst::_S_size)
+ 	    { // hard to optimize for the compiler, but necessary in constant expressions
+ 	      return _VecOps<_Ret>::_S_extract(
+ 		       __vec_concat_sized<__xs.size.value...>(__xs._M_concat_data(false)...),
+ 		       _Offset);
+ 	    }
+ 	  else
+ 	    { // fallback to concatenation in memory => load the result
+ 	      alignas(_Ret) __vec_value_type<_Ret>
+ 		__tmp[std::max(__ninputs, _Offset.value + __dst_full_size)] = {};
+ 	      int __offset = 0;
+ 	      template for (const auto& __x : {__xs...})
+ 		{
+ 		  if constexpr (__simd_mask_type<_Dst>)
+ 		    (-__x)._M_store(__tmp + __offset);
+ 		  else
+ 		    __x._M_store(__tmp + __offset);
+ 		  __offset += __x.size.value;
+ 		}
+ 	      _Ret __r;
+ 	      __builtin_memcpy(&__r, __tmp + _Offset.value, sizeof(_Ret));
+ 	      return __r;
+ 	    }
+ 	}
+     }
+ 
+   // [simd.mask] --------------------------------------------------------------
+   template <size_t _Bytes, typename _Ap>
+     class basic_mask
+     {
+     public:
+       using value_type = bool;
+ 
+       using abi_type = _Ap;
+ 
+ #define _GLIBCXX_DELETE_SIMD "This specialization is disabled because of an invalid combination "  \
+ 			     "of template arguments to basic_mask."
+ 
+       basic_mask() = delete(_GLIBCXX_DELETE_SIMD);
+ 
+       ~basic_mask() = delete(_GLIBCXX_DELETE_SIMD);
+ 
+       basic_mask(const basic_mask&) = delete(_GLIBCXX_DELETE_SIMD);
+ 
+       basic_mask& operator=(const basic_mask&) = delete(_GLIBCXX_DELETE_SIMD);
+ 
+ #undef _GLIBCXX_DELETE_SIMD
+     };
+ 
+   template <size_t _Bytes, typename _Ap>
+     class _MaskBase
+     {
+       using _Mp = basic_mask<_Bytes, _Ap>;
+ 
+     protected:
+       using _VecType = __simd_vec_from_mask_t<_Bytes, _Ap>;
+ 
+       static_assert(destructible<_VecType> || _Bytes > sizeof(0ull));
+ 
+     public:
+       using iterator = __iterator<_Mp>;
+ 
+       using const_iterator = __iterator<const _Mp>;
+ 
+       constexpr iterator
+       begin() noexcept
+       { return {static_cast<_Mp&>(*this), 0}; }
+ 
+       constexpr const_iterator
+       begin() const noexcept
+       { return cbegin(); }
+ 
+       constexpr const_iterator
+       cbegin() const noexcept
+       { return {static_cast<const _Mp&>(*this), 0}; }
+ 
+       constexpr default_sentinel_t
+       end() const noexcept
+       { return {}; }
+ 
+       constexpr default_sentinel_t
+       cend() const noexcept
+       { return {}; }
+ 
+       static constexpr auto size = __simd_size_c<_Ap::_S_size>;
+ 
+       _MaskBase() = default;
+ 
+       // LWG issue from 2026-03-04 / P4042R0
+       template <size_t _UBytes, typename _UAbi>
+ 	requires (_Ap::_S_size != _UAbi::_S_size)
+ 	explicit
+ 	_MaskBase(const basic_mask<_UBytes, _UAbi>&) = delete("size mismatch");
+ 
+       template <typename _Up, typename _UAbi>
+ 	explicit
+ 	_MaskBase(const basic_vec<_Up, _UAbi>&)
+ 	  = delete("use operator! or a comparison to convert a vec into a mask");
+ 
+       template <typename _Up, typename _UAbi>
+ 	requires (_Ap::_S_size != _UAbi::_S_size)
+ 	operator basic_vec<_Up, _UAbi>() const
+ 	  = delete("size mismatch");
+     };
+ 
+   template <size_t _Bytes, __abi_tag _Ap>
+     requires (_Ap::_S_nreg == 1)
+     class basic_mask<_Bytes, _Ap>
+     : public _MaskBase<_Bytes, _Ap>
+     {
+       using _Base = _MaskBase<_Bytes, _Ap>;
+ 
+       using _VecType = _Base::_VecType;
+ 
+       template <size_t, typename>
+ 	friend class basic_mask;
+ 
+       template <typename, typename>
+ 	friend class basic_vec;
+ 
+       static constexpr int _S_size = _Ap::_S_size;
+ 
+       using _DataType = typename _Ap::template _MaskDataType<_Bytes>;
+ 
+       static constexpr bool _S_has_bool_member = is_same_v<_DataType, bool>;
+ 
+       static constexpr bool _S_is_scalar = _S_has_bool_member;
+ 
+       static constexpr bool _S_use_bitmask = _Ap::_S_is_bitmask;
+ 
+       static constexpr int _S_full_size = [] {
+ 	if constexpr (_S_is_scalar)
+ 	  return _S_size;
+ 	else if constexpr (_S_use_bitmask && _S_size < __CHAR_BIT__)
+ 	  return __CHAR_BIT__;
+ 	else
+ 	  return __bit_ceil(unsigned(_S_size));
+       }();
+ 
+       static constexpr bool _S_is_partial = _S_size != _S_full_size;
+ 
+       static constexpr _DataType _S_implicit_mask = [] {
+ 	if constexpr (_S_is_scalar)
+ 	  return true;
+ 	else if (!_S_is_partial)
+ 	  return _DataType(~_DataType());
+ 	else if constexpr (_S_use_bitmask)
+ 	  return _DataType((_DataType(1) << _S_size) - 1);
+ 	else
+ 	  {
+ 	    constexpr auto [...__is] = _IotaArray<_S_full_size>;
+ 	    return _DataType{ (__is < _S_size ? -1 : 0)... };
+ 	  }
+       }();
+ 
+       // Actual padding bytes, not padding elements.
+       // => _S_padding_bytes is 0 even if _S_is_partial is true.
+       static constexpr size_t _S_padding_bytes = 0;
+ 
+       _DataType _M_data;
+ 
+     public:
+       using value_type = bool;
+ 
+       using abi_type = _Ap;
+ 
+       using iterator = _Base::iterator;
+ 
+       using const_iterator = _Base::const_iterator;
+ 
+       // internal but public API ----------------------------------------------
+       [[__gnu__::__always_inline__]]
+       static constexpr basic_mask
+       _S_init(_DataType __x)
+       {
+ 	basic_mask __r;
+ 	__r._M_data = __x;
+ 	return __r;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       static constexpr basic_mask
+       _S_init(unsigned_integral auto __bits)
+       { return basic_mask(__bits); }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr const _DataType&
+       _M_get() const
+       { return _M_data; }
+ 
+       /** @internal
+        * Bit-cast the given object @p __x to basic_mask.
+        *
+        * This is necessary for _S_nreg > 1 where the last element can be bool or when the sizeof
+        * doesn't match because of different alignment requirements of the sub-masks.
+        */
+       template <size_t _UBytes, typename _UAbi>
+ 	[[__gnu__::__always_inline__]]
+ 	static constexpr basic_mask
+ 	_S_recursive_bit_cast(const basic_mask<_UBytes, _UAbi>& __x)
+ 	{ return __builtin_bit_cast(basic_mask, __x._M_concat_data()); }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr auto
+       _M_concat_data(bool __do_sanitize = _S_is_partial) const
+       {
+ 	if constexpr (_S_is_scalar)
+ 	  return __vec_builtin_type<__integer_from<_Bytes>, 1>{__integer_from<_Bytes>(-_M_data)};
+ 	else
+ 	  {
+ 	    if constexpr (_S_is_partial)
+ 	      if (__do_sanitize)
+ 		return _DataType(_M_data & _S_implicit_mask);
+ 	    return _M_data;
+ 	  }
+       }
+ 
+       /** @internal
+        * Returns a mask where the first @p __n elements are true. All remaining elements are false.
+        *
+        * @pre @p __n > 0 && @p __n < _S_size
+        */
+       template <_ArchTraits _Traits = {}>
+ 	[[__gnu__::__always_inline__]]
+ 	static constexpr basic_mask
+ 	_S_partial_mask_of_n(int __n)
+ 	{
+ 	  static_assert(!_S_is_scalar);
+ 	  if constexpr (!_S_use_bitmask)
+ 	    {
+ 	      using _Ip = __integer_from<_Bytes>;
+ 	      __glibcxx_simd_precondition(__n >= 0 && __n <= numeric_limits<_Ip>::max(),
+ 					  "_S_partial_mask_of_n without _S_use_bitmask requires "
+ 					  "positive __n that does not overflow.");
+ 	      constexpr _DataType __0123
+ 		= __builtin_bit_cast(_DataType, _IotaArray<_Ip(_S_full_size)>);
+ 	      return basic_mask(__0123 < _Ip(__n));
+ 	    }
+ 	  else
+ 	    {
+ 	      __glibcxx_simd_precondition(__n >= 0 && __n <= 255,
+ 					  "The x86 BZHI instruction requires __n to "
+ 					  "only use bits 0:7");
+ #if __has_builtin(__builtin_ia32_bzhi_si)
+ 	      if constexpr (_S_size <= 32 && _Traits._M_have_bmi2())
+ 		return _S_init(_Bitmask<_S_size>(
+ 				 __builtin_ia32_bzhi_si(~0u >> (32 - _S_size), unsigned(__n))));
+ #endif
+ #if __has_builtin(__builtin_ia32_bzhi_di)
+ 	      else if constexpr (_S_size <= 64 && _Traits._M_have_bmi2())
+ 		return _S_init(__builtin_ia32_bzhi_di(~0ull >> (64 - _S_size), unsigned(__n)));
+ #endif
+ 	      if constexpr (_S_size <= 32)
+ 		{
+ 		  __glibcxx_simd_precondition(__n < 32, "invalid shift");
+ 		  return _S_init(_Bitmask<_S_size>((1u << unsigned(__n)) - 1));
+ 		}
+ 	      else if constexpr (_S_size <= 64)
+ 		{
+ 		  __glibcxx_simd_precondition(__n < 64, "invalid shift");
+ 		  return _S_init((1ull << unsigned(__n)) - 1);
+ 		}
+ 	      else
+ 		static_assert(false);
+ 	    }
+ 	}
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr basic_mask&
+       _M_and_neighbors()
+       {
+ 	if constexpr (_S_use_bitmask)
+ 	  _M_data &= ((_M_data >> 1) & 0x5555'5555'5555'5555ull)
+ 		       | ((_M_data << 1) & ~0x5555'5555'5555'5555ull);
+ 	else
+ 	  _M_data &= _VecOps<_DataType>::_S_swap_neighbors(_M_data);
+ 	return *this;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr basic_mask&
+       _M_or_neighbors()
+       {
+ 	if constexpr (_S_use_bitmask)
+ 	  _M_data |= ((_M_data >> 1) & 0x5555'5555'5555'5555ull)
+ 		       | ((_M_data << 1) & ~0x5555'5555'5555'5555ull);
+ 	else
+ 	  _M_data |= _VecOps<_DataType>::_S_swap_neighbors(_M_data);
+ 	return *this;
+       }
+ 
+       template <typename _Mp>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr auto _M_chunk() const noexcept
+ 	{
+ 	  constexpr int __n = _S_size / _Mp::_S_size;
+ 	  constexpr int __rem = _S_size % _Mp::_S_size;
+ 	  constexpr auto [...__is] = _IotaArray<__n>;
+ 	  if constexpr (__rem == 0)
+ 	    return array<_Mp, __n>{__extract_simd_at<_Mp>(cw<_Mp::_S_size * __is>, *this)...};
+ 	  else
+ 	    {
+ 	      using _Rest = resize_t<__rem, _Mp>;
+ 	      return tuple(__extract_simd_at<_Mp>(cw<_Mp::_S_size * __is>, *this)...,
+ 			   __extract_simd_at<_Rest>(cw<_Mp::_S_size * __n>, *this));
+ 	    }
+ 	}
+ 
+       [[__gnu__::__always_inline__]]
+       static constexpr const basic_mask&
+       _S_concat(const basic_mask& __x0) noexcept
+       { return __x0; }
+ 
+       template <typename... _As>
+ 	requires (sizeof...(_As) > 1)
+ 	[[__gnu__::__always_inline__]]
+ 	static constexpr basic_mask
+ 	_S_concat(const basic_mask<_Bytes, _As>&... __xs) noexcept
+ 	{
+ 	  static_assert(_S_size == (_As::_S_size + ...));
+ 	  return __extract_simd_at<basic_mask>(cw<0>, __xs...);
+ 	}
+ 
+       // [simd.mask.overview] default constructor -----------------------------
+       basic_mask() = default;
+ 
+       // [simd.mask.overview] conversion extensions ---------------------------
+       [[__gnu__::__always_inline__]]
+       constexpr
+       basic_mask(_DataType __x) requires(!_S_is_scalar && !_S_use_bitmask)
+ 	: _M_data(__x)
+       {}
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr
+       operator _DataType() requires(!_S_is_scalar && !_S_use_bitmask)
+       { return _M_data; }
+ 
+       // [simd.mask.ctor] broadcast constructor -------------------------------
+       [[__gnu__::__always_inline__]]
+       constexpr explicit
+       basic_mask(same_as<bool> auto __x) noexcept // LWG 4382.
+ 	: _M_data(__x ? _S_implicit_mask : _DataType())
+       {}
+ 
+       // [simd.mask.ctor] conversion constructor ------------------------------
+       template <size_t _UBytes, typename _UAbi>
+ 	requires (_S_size == _UAbi::_S_size)
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr explicit(__is_mask_conversion_explicit<_Ap, _UAbi>(_Bytes, _UBytes))
+ 	basic_mask(const basic_mask<_UBytes, _UAbi>& __x) noexcept
+ 	  : _M_data([&] [[__gnu__::__always_inline__]] {
+ 	      using _UV = basic_mask<_UBytes, _UAbi>;
+ 	      // bool to bool
+ 	      if constexpr (_S_is_scalar)
+ 		return __x[0];
+ 
+ 	      // converting from an "array of bool"
+ 	      else if constexpr (_UV::_S_is_scalar)
+ 		{
+ 		  constexpr auto [...__is] = _IotaArray<_S_size>;
+ 		  if constexpr (_S_use_bitmask)
+ 		    return ((_DataType(__x[__is]) << __is) | ...);
+ 		  else
+ 		    return _DataType{__vec_value_type<_DataType>(-__x[__is])...};
+ 		}
+ 
+ 	      // vec-/bit-mask to bit-mask | bit-mask to vec-mask
+ 	      else if constexpr (_S_use_bitmask || _UV::_S_use_bitmask)
+ 		return basic_mask(__x.to_bitset())._M_data;
+ 
+ 	      // vec-mask to vec-mask
+ 	      else if constexpr (_Bytes == _UBytes)
+ 		return _S_recursive_bit_cast(__x)._M_data;
+ 
+ 	      else
+ 		{
+ #if _GLIBCXX_X86
+ 		  // TODO: turn this into a __vec_mask_cast overload in simd_x86.h
+ 		  if constexpr (_Bytes == 1 && _UBytes == 2)
+ 		    if (!__is_const_known(__x))
+ 		      {
+ 			if constexpr (_UAbi::_S_nreg == 1)
+ 			  return __x86_cvt_vecmask<_DataType>(__x._M_data);
+ 			else if constexpr (_UAbi::_S_nreg == 2)
+ 			  {
+ 			    auto __lo = __x._M_data0._M_data;
+ 			    auto __hi = __vec_zero_pad_to<sizeof(__lo)>(
+ 					  __x._M_data1._M_concat_data());
+ 			    return __x86_cvt_vecmask<_DataType>(__lo, __hi);
+ 			  }
+ 		      }
+ #endif
+ 		  return __vec_mask_cast<_DataType>(__x._M_concat_data());
+ 		}
+ 	  }())
+ 	{}
+ 
+       using _Base::_MaskBase;
+ 
+       // [simd.mask.ctor] generator constructor -------------------------------
+       template <__simd_generator_invokable<bool, _S_size> _Fp>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr explicit
+ 	basic_mask(_Fp&& __gen)
+ 	  : _M_data([&] [[__gnu__::__always_inline__]] {
+ 	      constexpr auto [...__is] = _IotaArray<_S_size>;
+ 	      if constexpr (_S_is_scalar)
+ 		return __gen(__simd_size_c<0>);
+ 	      else if constexpr (_S_use_bitmask)
+ 		return _DataType(((_DataType(__gen(__simd_size_c<__is>)) << __is)
+ 				    | ...));
+ 	      else
+ 		return _DataType{__vec_value_type<_DataType>(
+ 				   __gen(__simd_size_c<__is>) ? -1 : 0)...};
+ 	    }())
+ 	{}
+ 
+       // [simd.mask.ctor] bitset constructor ----------------------------------
+       [[__gnu__::__always_inline__]]
+       constexpr
+       basic_mask(const same_as<bitset<_S_size>> auto& __b) noexcept // LWG 4382.
+       : basic_mask(static_cast<_Bitmask<_S_size>>(__b.to_ullong()))
+       {
+ 	// more than 64 elements in one register? not yet.
+ 	static_assert(_S_size <= numeric_limits<unsigned long long>::digits);
+       }
+ 
+       // [simd.mask.ctor] uint constructor ------------------------------------
+       template <unsigned_integral _Tp>
+ 	requires (!same_as<_Tp, bool>) // LWG 4382.
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr explicit
+ 	basic_mask(_Tp __val) noexcept
+ 	: _M_data([&] [[__gnu__::__always_inline__]] () {
+ 	    if constexpr (_S_use_bitmask)
+ 	      return __val;
+ 	    else if constexpr (_S_is_scalar)
+ 	      return bool(__val & 1);
+ 	    else if (__is_const_known(__val))
+ 	      {
+ 		constexpr auto [...__is] = _IotaArray<_S_size>;
+ 		return _DataType {__vec_value_type<_DataType>((__val & (1ull << __is)) == 0
+ 								? 0 : -1)...};
+ 	      }
+ 	    else
+ 	      {
+ 		using _Ip = typename _VecType::value_type;
+ 		_VecType __v0 = _Ip(__val);
+ 		constexpr int __bits_per_element = sizeof(_Ip) * __CHAR_BIT__;
+ 		constexpr _VecType __pow2 = _VecType(1) << (__iota<_VecType> % __bits_per_element);
+ 		if constexpr (_S_size < __bits_per_element)
+ 		  return ((__v0 & __pow2) > 0)._M_concat_data();
+ 		else if constexpr (_S_size == __bits_per_element)
+ 		  return ((__v0 & __pow2) != 0)._M_concat_data();
+ 		else
+ 		  {
+ 		    static_assert(_Bytes == 1);
+ 		    static_assert(sizeof(_Ip) == 1);
+ 		    _Bitmask<_S_size> __bits = __val;
+ 		    static_assert(sizeof(_VecType) % sizeof(__bits) == 0);
+ 		    if constexpr (sizeof(_DataType) == 32)
+ 		      {
+ 			__vec_builtin_type<_UInt<8>, 4> __v1 = {
+ 			  0xffu & (__bits >> (0 * __CHAR_BIT__)),
+ 			  0xffu & (__bits >> (1 * __CHAR_BIT__)),
+ 			  0xffu & (__bits >> (2 * __CHAR_BIT__)),
+ 			  0xffu & (__bits >> (3 * __CHAR_BIT__)),
+ 			};
+ 			__v1 *= 0x0101'0101'0101'0101ull;
+ 			__v0 = __builtin_bit_cast(_VecType, __v1);
+ 			return ((__v0 & __pow2) != 0)._M_data;
+ 		      }
+ 		    else
+ 		      {
+ 			using _V1 = vec<_Ip, sizeof(__bits)>;
+ 			_V1 __v1 = __builtin_bit_cast(_V1, __bits);
+ 			__v0 = _VecType::_S_static_permute(__v1, [](int __i) {
+ 				 return __i / __CHAR_BIT__;
+ 			       });
+ 			return ((__v0 & __pow2) != 0)._M_data;
+ 		      }
+ 		  }
+ 	      }
+ 	  }())
+ 	{}
+ 
+       //Effects: Initializes the first M elements to the corresponding bit values in val, where M is
+       //the smaller of size() and the number of bits in the value representation
+       //([basic.types.general]) of the type of val. If M is less than size(), the remaining elements
+       //are initialized to zero.
+ 
+ 
+       // [simd.mask.subscr] ---------------------------------------------------
+       [[__gnu__::__always_inline__]]
+       constexpr value_type
+       operator[](__simd_size_type __i) const
+       {
+ 	__glibcxx_simd_precondition(__i >= 0 && __i < _S_size, "subscript is out of bounds");
+ 	if constexpr (_S_is_scalar)
+ 	  return _M_data;
+ 	else if constexpr (_S_use_bitmask)
+ 	  return bool((_M_data >> __i) & 1);
+ 	else
+ 	  return _M_data[__i] & 1;
+       }
+ 
+       // [simd.mask.unary] ----------------------------------------------------
+       [[__gnu__::__always_inline__]]
+       constexpr basic_mask
+       operator!() const noexcept
+       {
+ 	if constexpr (_S_is_scalar)
+ 	  return _S_init(!_M_data);
+ 	else
+ 	  return _S_init(~_M_data);
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr _VecType
+       operator+() const noexcept requires destructible<_VecType>
+       { return operator _VecType(); }
+ 
+       constexpr _VecType
+       operator+() const noexcept = delete;
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr _VecType
+       operator-() const noexcept requires destructible<_VecType>
+       {
+ 	using _Ip = typename _VecType::value_type;
+ 	if constexpr (_S_is_scalar)
+ 	  return _Ip(-int(_M_data));
+ 	else if constexpr (_S_use_bitmask)
+ 	  return __select_impl(*this, _Ip(-1), _Ip());
+ 	else
+ 	  {
+ 	    static_assert(sizeof(_VecType) == sizeof(_M_data));
+ 	    return __builtin_bit_cast(_VecType, _M_data);
+ 	  }
+       }
+ 
+       constexpr _VecType
+       operator-() const noexcept = delete;
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr _VecType
+       operator~() const noexcept requires destructible<_VecType>
+       {
+ 	using _Ip = typename _VecType::value_type;
+ 	if constexpr (_S_is_scalar)
+ 	  return _Ip(~int(_M_data));
+ 	else if constexpr (_S_use_bitmask)
+ 	  return __select_impl(*this, _Ip(-2), _Ip(-1));
+ 	else
+ 	  {
+ 	    static_assert(sizeof(_VecType) == sizeof(_M_data));
+ 	    return __builtin_bit_cast(_VecType, _M_data) - _Ip(1);
+ 	  }
+       }
+ 
+       constexpr _VecType
+       operator~() const noexcept = delete;
+ 
+       // [simd.mask.conv] -----------------------------------------------------
+       template <typename _Up, typename _UAbi>
+ 	requires (_UAbi::_S_size == _S_size)
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr explicit(sizeof(_Up) != _Bytes)
+ 	operator basic_vec<_Up, _UAbi>() const noexcept
+ 	{
+ 	  if constexpr (_S_is_scalar)
+ 	    return _Up(_M_data);
+ 	  else
+ 	    {
+ 	      using _UV = basic_vec<_Up, _UAbi>;
+ 	      return __select_impl(static_cast<_UV::mask_type>(*this), _UV(1), _UV(0));
+ 	    }
+ 	}
+ 
+       using _Base::operator basic_vec;
+ 
+       // [simd.mask.namedconv] ------------------------------------------------
+       [[__gnu__::__always_inline__]]
+       constexpr bitset<_S_size>
+       to_bitset() const noexcept
+       {
+ 	// more than 64 elements in one register? not yet.
+ 	static_assert(_S_size <= numeric_limits<unsigned long long>::digits);
+ 	return to_ullong();
+       }
+ 
+       /** @internal
+        * Return the mask as the smallest possible unsigned integer (up to 64 bits).
+        *
+        * @tparam _Offset       Adjust the return type & value to start at bit @p _Offset.
+        * @tparam _Use_2_for_1  Store the value of every second element into one bit of the result.
+        *                       (precondition: each even/odd pair stores the same value)
+        */
+       template <int _Offset = 0, _ArchTraits _Traits = {}>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr _Bitmask<_S_size + _Offset>
+ 	_M_to_uint() const
+ 	{
+ 	  constexpr int __nbits = _S_size;
+ 	  static_assert(__nbits + _Offset <= numeric_limits<unsigned long long>::digits);
+ 	  // before shifting
+ 	  using _U0 = _Bitmask<__nbits>;
+ 	  // potentially wider type needed for shift by _Offset
+ 	  using _Ur = _Bitmask<__nbits + _Offset>;
+ 	  if constexpr (_S_is_scalar || _S_use_bitmask)
+ 	    {
+ 	      auto __bits = _M_data;
+ 	      if constexpr (_S_is_partial)
+ 		__bits &= _S_implicit_mask;
+ 	      return _Ur(__bits) << _Offset;
+ 	    }
+ 	  else
+ 	    {
+ #if _GLIBCXX_X86
+ 	      if (!__is_const_known(*this))
+ 		{
+ 		  _U0 __uint;
+ 		  if constexpr (_Bytes != 2) // movmskb would duplicate each bit
+ 		    __uint = _U0(__x86_movmsk(_M_data));
+ 		  else if constexpr (_Bytes == 2 && _Traits._M_have_bmi2())
+ 		    __uint = __bit_extract_even<__nbits>(__x86_movmsk(_M_data));
+ 		  else if constexpr (_Bytes == 2)
+ 		    return __similar_mask<char, __nbits, _Ap>(*this).template _M_to_uint<_Offset>();
+ 		  else
+ 		    static_assert(false);
+ 		  // TODO: with AVX512 use __builtin_ia32_cvt[bwdq]2mask(128|256|512)
+ 		  // TODO: Ask for compiler builtin to do the best of the above. This should also
+ 		  // combine with a preceding vector-mask compare to produce a bit-mask compare (on
+ 		  // AVX512)
+ 		  if constexpr (_S_is_partial)
+ 		    __uint &= (_U0(1) << _S_size) - 1;
+ 		  return _Ur(__uint) << _Offset;
+ 		}
+ #endif
+ 	      using _IV = _VecType;
+ 	      static_assert(destructible<_IV>);
+ 	      const typename _IV::mask_type& __k = [&] [[__gnu__::__always_inline__]] () {
+ 		if constexpr (is_same_v<typename _IV::mask_type, basic_mask>)
+ 		  return *this;
+ 		else
+ 		  return typename _IV::mask_type(*this);
+ 	      }();
+ 	      constexpr int __n = _IV::size();
+ 	      if constexpr (_Bytes * __CHAR_BIT__ >= __n) // '1 << __iota' cannot overflow
+ 		{ // reduce(select(k, powers_of_2, 0))
+ 		  constexpr _IV __pow2 = _IV(1) << __iota<_IV>;
+ 		  return _Ur(_U0(__select_impl(__k, __pow2, _IV())
+ 				   ._M_reduce(bit_or<>()))) << _Offset;
+ 		}
+ 	      else if constexpr (__n % __CHAR_BIT__ != 0)
+ 		{ // recurse after splitting in two
+ 		  constexpr int __n_lo = __n - __n % __CHAR_BIT__;
+ 		  const auto [__lo, __hi] = chunk<__n_lo>(__k);
+ 		  _Ur __bits = __hi.template _M_to_uint<_Offset + __n_lo>();
+ 		  return __bits | __lo.template _M_to_uint<_Offset>();
+ 		}
+ 	      else
+ 		{ // limit powers_of_2 to 1, 2, 4, ..., 128
+ 		  constexpr _IV __pow2 = _IV(1) << (__iota<_IV> % _IV(__CHAR_BIT__));
+ 		  _IV __x = __select_impl(__k, __pow2, _IV());
+ 		  // partial reductions of 8 neighboring elements
+ 		  __x |= _IV::_S_static_permute(__x, _SwapNeighbors<4>());
+ 		  __x |= _IV::_S_static_permute(__x, _SwapNeighbors<2>());
+ 		  __x |= _IV::_S_static_permute(__x, _SwapNeighbors<1>());
+ 		  // permute partial reduction results to the front
+ 		  __x = _IV::_S_static_permute(__x, [](int __i) {
+ 			  return __i * 8 < __n ? __i * 8 : uninit_element;
+ 			});
+ 		  // extract front as scalar unsigned
+ 		  _U0 __bits = __builtin_bit_cast(
+ 				 __similar_vec<_U0, __n * _Bytes / sizeof(_U0), _Ap>, __x)[0];
+ 		  // mask off unused bits
+ 		  if constexpr (!__has_single_bit(unsigned(__nbits)))
+ 		    __bits &= (_U0(1) << __nbits) - 1;
+ 		  return _Ur(__bits) << _Offset;
+ 		}
+ 	    }
+ 	}
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr unsigned long long
+       to_ullong() const
+       { return _M_to_uint(); }
+ 
+       // [simd.mask.binary] ---------------------------------------------------
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator&&(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return _S_init(__x._M_data & __y._M_data); }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator||(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return _S_init(__x._M_data | __y._M_data); }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator&(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return _S_init(__x._M_data & __y._M_data); }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator|(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return _S_init(__x._M_data | __y._M_data); }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator^(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return _S_init(__x._M_data ^ __y._M_data); }
+ 
+       // [simd.mask.cassign] --------------------------------------------------
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask&
+       operator&=(basic_mask& __x, const basic_mask& __y) noexcept
+       {
+ 	__x._M_data &= __y._M_data;
+ 	return __x;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask&
+       operator|=(basic_mask& __x, const basic_mask& __y) noexcept
+       {
+ 	__x._M_data |= __y._M_data;
+ 	return __x;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask&
+       operator^=(basic_mask& __x, const basic_mask& __y) noexcept
+       {
+ 	__x._M_data ^= __y._M_data;
+ 	return __x;
+       }
+ 
+       // [simd.mask.comparison] -----------------------------------------------
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator==(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return !(__x ^ __y); }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator!=(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return __x ^ __y; }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator>=(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return __x || !__y; }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator<=(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return !__x || __y; }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator>(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return __x && !__y; }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator<(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return !__x && __y; }
+ 
+       // [simd.mask.cond] -----------------------------------------------------
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       __select_impl(const basic_mask& __k, const basic_mask& __t, const basic_mask& __f) noexcept
+       {
+ 	if constexpr (!_S_use_bitmask)
+ 	  {
+ #if _GLIBCXX_X86
+ 	    // this works around bad code-gen when the compiler can't see that __k is a vector-mask.
+ 	    // This pattern, is recognized to match the x86 blend instructions, which only consider
+ 	    // the sign bit of the mask register. Also, without SSE4, if the compiler knows that __k
+ 	    // is a vector-mask, then the '< 0' is elided.
+ 	    return __k._M_data < 0 ? __t._M_data : __f._M_data;
+ #endif
+ 	    return __k._M_data ? __t._M_data : __f._M_data;
+ 	  }
+ 	else
+ 	  return (__k._M_data & __t._M_data) | (~__k._M_data & __f._M_data);
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       __select_impl(const basic_mask& __k, same_as<bool> auto __t, same_as<bool> auto __f) noexcept
+       {
+ 	if (__t == __f)
+ 	  return basic_mask(__t);
+ 	else
+ 	  return __t ? __k : !__k;
+       }
+ 
+       template <__vectorizable _T0, same_as<_T0> _T1>
+ 	requires (sizeof(_T0) == _Bytes)
+ 	[[__gnu__::__always_inline__]]
+ 	friend constexpr vec<_T0, _S_size>
+ 	__select_impl(const basic_mask& __k, const _T0& __t, const _T1& __f) noexcept
+ 	{
+ 	  if constexpr (_S_is_scalar)
+ 	    return __k._M_data ? __t : __f;
+ 	  else
+ 	    {
+ 	      using _Vp = vec<_T0, _S_size>;
+ 	      using _Mp = typename _Vp::mask_type;
+ 	      return __select_impl(_Mp(__k), _Vp(__t), _Vp(__f));
+ 	    }
+ 	}
+ 
+       // [simd.mask.reductions] implementation --------------------------------
+       [[__gnu__::__always_inline__]]
+       constexpr bool
+       _M_all_of() const noexcept
+       {
+ 	if constexpr (_S_is_scalar)
+ 	  return _M_data;
+ 	else if constexpr (_S_use_bitmask)
+ 	  {
+ 	    if constexpr (_S_is_partial)
+ 	      // PR120925 (partial kortest pattern not recognized)
+ 	      return (_M_data & _S_implicit_mask) == _S_implicit_mask;
+ 	    else
+ 	      return _M_data == _S_implicit_mask;
+ 	  }
+ #if _GLIBCXX_X86
+ 	else if (!__is_const_known(_M_data))
+ 	  return __x86_vecmask_all<_S_size>(_M_data);
+ #endif
+ 	else
+ 	  return _VecOps<_DataType, _S_size>::_S_all_of(_M_data);
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr bool
+       _M_any_of() const noexcept
+       {
+ 	if constexpr (_S_is_scalar)
+ 	  return _M_data;
+ 	else if constexpr (_S_use_bitmask)
+ 	  {
+ 	    if constexpr (_S_is_partial)
+ 	      // PR120925 (partial kortest pattern not recognized)
+ 	      return (_M_data & _S_implicit_mask) != 0;
+ 	    else
+ 	      return _M_data != 0;
+ 	  }
+ #if _GLIBCXX_X86
+ 	else if (!__is_const_known(_M_data))
+ 	  return __x86_vecmask_any<_S_size>(_M_data);
+ #endif
+ 	else
+ 	  return _VecOps<_DataType, _S_size>::_S_any_of(_M_data);
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr bool
+       _M_none_of() const noexcept
+       {
+ 	if constexpr (_S_is_scalar)
+ 	  return !_M_data;
+ 	else if constexpr (_S_use_bitmask)
+ 	  {
+ 	    if constexpr (_S_is_partial)
+ 	      // PR120925 (partial kortest pattern not recognized)
+ 	      return (_M_data & _S_implicit_mask) == 0;
+ 	    else
+ 	      return _M_data == 0;
+ 	  }
+ #if _GLIBCXX_X86
+ 	else if (!__is_const_known(_M_data))
+ 	  return __x86_vecmask_none<_S_size>(_M_data);
+ #endif
+ 	else
+ 	  return _VecOps<_DataType, _S_size>::_S_none_of(_M_data);
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr __simd_size_type
+       _M_reduce_count() const noexcept
+       {
+ 	if constexpr (_S_is_scalar)
+ 	  return int(_M_data);
+ 	else if constexpr (_S_size <= numeric_limits<unsigned>::digits)
+ 	  return __builtin_popcount(_M_to_uint());
+ 	else
+ 	  return __builtin_popcountll(to_ullong());
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr __simd_size_type
+       _M_reduce_min_index() const
+       {
+ 	const auto __bits = _M_to_uint();
+ 	__glibcxx_simd_precondition(__bits, "An empty mask does not have a min_index.");
+ 	if constexpr (_S_size == 1)
+ 	  return 0;
+ 	else
+ 	  return __countr_zero(__bits);
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr __simd_size_type
+       _M_reduce_max_index() const
+       {
+ 	const auto __bits = _M_to_uint();
+ 	__glibcxx_simd_precondition(__bits, "An empty mask does not have a max_index.");
+ 	if constexpr (_S_size == 1)
+ 	  return 0;
+ 	else
+ 	  return __highest_bit(__bits);
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr bool
+       __is_const_known(const basic_mask& __x)
+       { return __builtin_constant_p(__x._M_data); }
+     };
+ 
+   template <size_t _Bytes, __abi_tag _Ap>
+     requires (_Ap::_S_nreg > 1)
+     class basic_mask<_Bytes, _Ap>
+     : public _MaskBase<_Bytes, _Ap>
+     {
+       using _Base = _MaskBase<_Bytes, _Ap>;
+ 
+       using _VecType = _Base::_VecType;
+ 
+       template <size_t, typename>
+ 	friend class basic_mask;
+ 
+       template <typename, typename>
+ 	friend class basic_vec;
+ 
+       static constexpr int _S_size = _Ap::_S_size;
+ 
+       static constexpr int _N0 = __bit_ceil(unsigned(_S_size)) / 2;
+ 
+       static constexpr int _N1 = _S_size - _N0;
+ 
+       static constexpr int _Nreg0 = __bit_ceil(unsigned(_Ap::_S_nreg)) / 2;
+ 
+       static constexpr int _Nreg1 = _Ap::_S_nreg - _Nreg0;
+ 
+       // explicitly request _Nreg0 rather than use __abi_rebind. This way _Float16 can use half
+       // of native registers (since they convert to full float32 registers).
+       using _Abi0 = decltype(_Ap::template _S_resize<_N0, _Nreg0>());
+ 
+       using _Abi1 = decltype(_Ap::template _S_resize<_N1, _Nreg1>());
+ 
+       using _Mask0 = basic_mask<_Bytes, _Abi0>;
+ 
+       // the implementation (and users) depend on elements being contiguous in memory
+       static_assert(_Mask0::_S_padding_bytes == 0 && !_Mask0::_S_is_partial);
+ 
+       using _Mask1 = basic_mask<_Bytes, _Abi1>;
+ 
+       static constexpr bool _S_is_partial = _Mask1::_S_is_partial;
+ 
+       // _Ap::_S_nreg determines how deep the recursion goes. E.g. basic_mask<4, _Abi<8, 4>> cannot
+       // use basic_mask<4, _Abi<4, 1>> as _Mask0/1 types.
+       static_assert(_Mask0::abi_type::_S_nreg + _Mask1::abi_type::_S_nreg == _Ap::_S_nreg);
+ 
+       static constexpr bool _S_use_bitmask = _Mask0::_S_use_bitmask;
+ 
+       static constexpr bool _S_is_scalar = _Mask0::_S_is_scalar;
+ 
+       _Mask0 _M_data0;
+ 
+       _Mask1 _M_data1;
+ 
+       static constexpr bool _S_has_bool_member = _Mask1::_S_has_bool_member;
+ 
+       // by construction _N0 >= _N1
+       // => sizeof(_Mask0) >= sizeof(_Mask1)
+       //    and __alignof__(_Mask0) >= __alignof__(_Mask1)
+       static constexpr size_t _S_padding_bytes
+ 	= (__alignof__(_Mask0) == __alignof__(_Mask1)
+ 	     ? 0 : __alignof__(_Mask0) - (sizeof(_Mask1) % __alignof__(_Mask0)))
+ 	    + _Mask1::_S_padding_bytes;
+ 
+     public:
+       using value_type = bool;
+ 
+       using abi_type = _Ap;
+ 
+       using iterator = _Base::iterator;
+ 
+       using const_iterator = _Base::const_iterator;
+ 
+       [[__gnu__::__always_inline__]]
+       static constexpr basic_mask
+       _S_init(const _Mask0& __x, const _Mask1& __y)
+       {
+ 	basic_mask __r;
+ 	__r._M_data0 = __x;
+ 	__r._M_data1 = __y;
+ 	return __r;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       static constexpr basic_mask
+       _S_init(unsigned_integral auto __bits)
+       { return basic_mask(__bits); }
+ 
+       template <typename _U0, typename _U1>
+ 	[[__gnu__::__always_inline__]]
+ 	static constexpr basic_mask
+ 	_S_init(const __trivial_pair<_U0, _U1>& __bits)
+ 	{
+ 	  if constexpr (is_unsigned_v<_U0>)
+ 	    {
+ 	      static_assert(is_unsigned_v<_U1>);
+ 	      return _S_init(_Mask0(__bits._M_first), _Mask1(__bits._M_second));
+ 	    }
+ 	  else if constexpr (is_unsigned_v<_U1>)
+ 	    return _S_init(_Mask0::_S_init(__bits._M_first), _Mask1(__bits._M_second));
+ 	  else
+ 	    return _S_init(_Mask0::_S_init(__bits._M_first), _Mask1::_S_init(__bits._M_second));
+ 	}
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr const _Mask0&
+       _M_get_low() const
+       { return _M_data0; }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr const _Mask1&
+       _M_get_high() const
+       { return _M_data1; }
+ 
+       template <size_t _UBytes, typename _UAbi>
+ 	[[__gnu__::__always_inline__]]
+ 	static constexpr basic_mask
+ 	_S_recursive_bit_cast(const basic_mask<_UBytes, _UAbi>& __x)
+ 	{
+ 	  using _Mp = basic_mask<_UBytes, _UAbi>;
+ 	  if constexpr (_Mp::_S_has_bool_member || sizeof(basic_mask) > sizeof(__x)
+ 			  || _Mp::_S_padding_bytes != 0)
+ 	    return _S_init(__builtin_bit_cast(_Mask0, __x._M_data0),
+ 			   _Mask1::_S_recursive_bit_cast(__x._M_data1));
+ 	  else if constexpr (sizeof(basic_mask) == sizeof(__x))
+ 	    return __builtin_bit_cast(basic_mask, __x);
+ 	  else
+ 	    { // e.g. on IvyBridge (different alignment => different sizeof)
+ 	      struct _Tmp { alignas(_Mp) basic_mask _M_data; };
+ 	      return __builtin_bit_cast(_Tmp, __x)._M_data;
+ 	    }
+ 	}
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr auto
+       _M_concat_data(bool __do_sanitize = _S_is_partial) const
+       {
+ 	if constexpr (_S_use_bitmask)
+ 	  {
+ 	    static_assert(_S_size <= numeric_limits<unsigned long long>::digits,
+ 			  "cannot concat more than 64 bits");
+ 	    using _Up = _Bitmask<_S_size>;
+ 	    return _Up(_M_data0._M_concat_data() | (_Up(_M_data1._M_concat_data(__do_sanitize)) << _N0));
+ 	  }
+ 	else
+ 	  {
+ 	    auto __lo = _M_data0._M_concat_data();
+ 	    auto __hi = __vec_zero_pad_to<sizeof(__lo)>(_M_data1._M_concat_data(__do_sanitize));
+ 	    return __vec_concat(__lo, __hi);
+ 	  }
+       }
+ 
+       template <_ArchTraits _Traits = {}>
+ 	[[__gnu__::__always_inline__]]
+ 	static constexpr basic_mask
+ 	_S_partial_mask_of_n(int __n)
+ 	{
+ #if __has_builtin(__builtin_ia32_bzhi_di)
+ 	  if constexpr (_S_use_bitmask && _S_size <= 64 && _Traits._M_have_bmi2())
+ 	    return basic_mask(__builtin_ia32_bzhi_di(~0ull >> (64 - _S_size), unsigned(__n)));
+ #endif
+ 	  if constexpr (_N0 == 1)
+ 	    {
+ 	      static_assert(_S_size == 2); // => __n == 1
+ 	      return _S_init(_Mask0(true), _Mask1(false));
+ 	    }
+ 	  else if (__n < _N0)
+ 	    return _S_init(_Mask0::_S_partial_mask_of_n(__n), _Mask1(false));
+ 	  else if (__n == _N0 || _N1 == 1)
+ 	    return _S_init(_Mask0(true), _Mask1(false));
+ 	  else if constexpr (_N1 != 1)
+ 	    return _S_init(_Mask0(true), _Mask1::_S_partial_mask_of_n(__n - _N0));
+ 	}
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr basic_mask&
+       _M_and_neighbors()
+       {
+ 	_M_data0._M_and_neighbors();
+ 	_M_data1._M_and_neighbors();
+ 	return *this;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr basic_mask&
+       _M_or_neighbors()
+       {
+ 	_M_data0._M_or_neighbors();
+ 	_M_data1._M_or_neighbors();
+ 	return *this;
+       }
+ 
+       template <typename _Mp>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr auto
+ 	_M_chunk() const noexcept
+ 	{
+ 	  constexpr int __n = _S_size / _Mp::_S_size;
+ 	  constexpr int __rem = _S_size % _Mp::_S_size;
+ 	  constexpr auto [...__is] = _IotaArray<__n>;
+ 	  if constexpr (__rem == 0)
+ 	    return array<_Mp, __n>{__extract_simd_at<_Mp>(cw<_Mp::_S_size * __is>,
+ 							    _M_data0, _M_data1)...};
+ 	  else
+ 	    {
+ 	      using _Rest = resize_t<__rem, _Mp>;
+ 	      return tuple(__extract_simd_at<_Mp>(cw<_Mp::_S_size * __is>, _M_data0, _M_data1)...,
+ 			   __extract_simd_at<_Rest>(cw<_Mp::_S_size * __n>, _M_data0, _M_data1));
+ 	    }
+ 	}
+ 
+       [[__gnu__::__always_inline__]]
+       static constexpr basic_mask
+       _S_concat(const basic_mask& __x0) noexcept
+       { return __x0; }
+ 
+       template <typename... _As>
+ 	requires (sizeof...(_As) >= 2)
+ 	[[__gnu__::__always_inline__]]
+ 	static constexpr basic_mask
+ 	_S_concat(const basic_mask<_Bytes, _As>&... __xs) noexcept
+ 	{
+ 	  static_assert(_S_size == (_As::_S_size + ...));
+ 	  return _S_init(__extract_simd_at<_Mask0>(cw<0>, __xs...),
+ 			 __extract_simd_at<_Mask1>(cw<_N0>, __xs...));
+ 	}
+ 
+       // [simd.mask.overview] default constructor -----------------------------
+       basic_mask() = default;
+ 
+       // [simd.mask.overview] conversion extensions ---------------------------
+       // TODO: any?
+ 
+       // [simd.mask.ctor] broadcast constructor -------------------------------
+       [[__gnu__::__always_inline__]]
+       constexpr explicit
+       basic_mask(same_as<bool> auto __x) noexcept // LWG 4382.
+ 	: _M_data0(__x), _M_data1(__x)
+       {}
+ 
+       // [simd.mask.ctor] conversion constructor ------------------------------
+       template <size_t _UBytes, typename _UAbi>
+ 	requires (_S_size == _UAbi::_S_size)
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr explicit(__is_mask_conversion_explicit<_Ap, _UAbi>(_Bytes, _UBytes))
+ 	basic_mask(const basic_mask<_UBytes, _UAbi>& __x) noexcept
+ 	  : _M_data0([&] {
+ 	      if constexpr (_UAbi::_S_nreg > 1)
+ 		{
+ 		    return __x._M_data0;
+ 		}
+ 	      else if constexpr (_N0 == 1)
+ 		return _Mask0(__x[0]);
+ 	      else
+ 		return get<0>(chunk<_N0>(__x));
+ 	    }()),
+ 	    _M_data1([&] {
+ 	      if constexpr (_UAbi::_S_nreg > 1)
+ 		{
+ 		    return __x._M_data1;
+ 		}
+ 	      else if constexpr (_N1 == 1)
+ 		return _Mask1(__x[_N0]);
+ 	      else
+ 		return get<1>(chunk<_N0>(__x));
+ 	    }())
+ 	{}
+ 
+       using _Base::_MaskBase;
+ 
+       // [simd.mask.ctor] generator constructor -------------------------------
+       template <__simd_generator_invokable<bool, _S_size> _Fp>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr explicit
+ 	basic_mask(_Fp&& __gen)
+ 	  : _M_data0(__gen), _M_data1([&] [[__gnu__::__always_inline__]] (auto __i) {
+ 			       return __gen(__simd_size_c<__i + _N0>);
+ 			     })
+ 	{}
+ 
+       // [simd.mask.ctor] bitset constructor ----------------------------------
+       [[__gnu__::__always_inline__]]
+       constexpr
+       basic_mask(const same_as<bitset<_S_size>> auto& __b) noexcept // LWG 4382.
+       : _M_data0(__bitset_split<_N0>(__b)._M_lo), _M_data1(__bitset_split<_N0>(__b)._M_hi)
+       {}
+ 
+       // [simd.mask.ctor] uint constructor ------------------------------------------
+       template <unsigned_integral _Tp>
+ 	requires (!same_as<_Tp, bool>) // LWG 4382.
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr explicit
+ 	basic_mask(_Tp __val) noexcept
+ 	: _M_data0(static_cast<_Bitmask<_N0>>(__val)),
+ 	  _M_data1(sizeof(_Tp) * __CHAR_BIT__ > _N0
+ 		     ? static_cast<_Bitmask<_N1>>(__val >> _N0) : _Bitmask<_N1>())
+ 	{}
+ 
+       // [simd.mask.subscr] ---------------------------------------------------
+       [[__gnu__::__always_inline__]]
+       constexpr value_type
+       operator[](__simd_size_type __i) const
+       {
+ 	__glibcxx_simd_precondition(__i >= 0 && __i < _S_size, "subscript is out of bounds");
+ 	if (__is_const_known(__i))
+ 	  return __i < _N0 ? _M_data0[__i] : _M_data1[__i - _N0];
+ 	else if constexpr (_M_data1._S_has_bool_member)
+ 	  // in some cases the last element can be 'bool' instead of bit-/vector-mask;
+ 	  // e.g. mask<short, 17> is {mask<short, 16>, mask<short, 1>}, where the latter uses
+ 	  // _ScalarAbi<1>, which is stored as 'bool'
+ 	  return __i < _N0 ? _M_data0[__i] : _M_data1[__i - _N0];
+ 	else if constexpr (abi_type::_S_is_bitmask)
+ 	  {
+ 	    using _AliasingByte [[__gnu__::__may_alias__]] = unsigned char;
+ 	    return bool((reinterpret_cast<const _AliasingByte*>(this)
+ 			   [__i / __CHAR_BIT__] >> (__i % __CHAR_BIT__)) & 1);
+ 	  }
+ 	else
+ 	  {
+ 	    using _AliasingInt [[__gnu__::__may_alias__]] = __integer_from<_Bytes>;
+ 	    return reinterpret_cast<const _AliasingInt*>(this)[__i] != 0;
+ 	  }
+       }
+ 
+       // [simd.mask.unary] ----------------------------------------------------
+       [[__gnu__::__always_inline__]]
+       constexpr basic_mask
+       operator!() const noexcept
+       { return _S_init(!_M_data0, !_M_data1); }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr _VecType
+       operator+() const noexcept requires destructible<_VecType>
+       { return _VecType::_S_concat(+_M_data0, +_M_data1); }
+ 
+       constexpr _VecType
+       operator+() const noexcept = delete;
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr _VecType
+       operator-() const noexcept requires destructible<_VecType>
+       { return _VecType::_S_concat(-_M_data0, -_M_data1); }
+ 
+       constexpr _VecType
+       operator-() const noexcept = delete;
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr _VecType
+       operator~() const noexcept requires destructible<_VecType>
+       { return _VecType::_S_concat(~_M_data0, ~_M_data1); }
+ 
+       constexpr _VecType
+       operator~() const noexcept = delete;
+ 
+       // [simd.mask.conv] -----------------------------------------------------
+       template <typename _Up, typename _UAbi>
+ 	requires (_UAbi::_S_size == _S_size)
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr explicit(sizeof(_Up) != _Bytes)
+ 	operator basic_vec<_Up, _UAbi>() const noexcept
+ 	{
+ 	  using _Rp = basic_vec<_Up, _UAbi>;
+ 	  return _Rp::_S_init(static_cast<_Rp::_DataType0>(_M_data0),
+ 			      static_cast<_Rp::_DataType1>(_M_data1));
+ 	}
+ 
+       using _Base::operator basic_vec;
+ 
+       // [simd.mask.namedconv] ------------------------------------------------
+       [[__gnu__::__always_inline__]]
+       constexpr bitset<_S_size>
+       to_bitset() const noexcept
+       {
+ 	if constexpr (_S_size <= numeric_limits<unsigned long long>::digits)
+ 	  return to_ullong();
+ 	else
+ 	  {
+ 	    static_assert(_N0 % numeric_limits<unsigned long long>::digits == 0);
+ 	    struct _Tmp
+ 	    {
+ 	      bitset<_N0> _M_lo;
+ 	      bitset<_N1> _M_hi;
+ 	    } __tmp = {_M_data0.to_bitset(), _M_data1.to_bitset()};
+ 	    return __builtin_bit_cast(bitset<_S_size>, __tmp);
+ 	  }
+       }
+ 
+       template <int _Offset = 0, _ArchTraits _Traits = {}>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr auto
+ 	_M_to_uint() const
+ 	{
+ 	  constexpr int _N0x = _N0;
+ 	  if constexpr (_N0x >= numeric_limits<unsigned long long>::digits)
+ 	    {
+ 	      static_assert(_Offset == 0);
+ 	      return __trivial_pair {
+ 		_M_data0.template _M_to_uint<0>(),
+ 		_M_data1.template _M_to_uint<0>()
+ 	      };
+ 	    }
+ 	  else
+ 	    {
+ #if _GLIBCXX_X86
+ 	      if constexpr (_Bytes == 2 && !_Traits._M_have_bmi2() && _Ap::_S_nreg == 2
+ 			      && !_S_use_bitmask)
+ 		return __similar_mask<char, _S_size, _Ap>(*this).template _M_to_uint<_Offset>();
+ #endif
+ 	      auto __uint = _M_data1.template _M_to_uint<_N0x + _Offset>();
+ 	      __uint |= _M_data0.template _M_to_uint<_Offset>();
+ 	      return __uint;
+ 	    }
+ 	}
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr unsigned long long
+       to_ullong() const
+       {
+ 	if constexpr (_S_size <= numeric_limits<unsigned long long>::digits)
+ 	  return _M_to_uint();
+ 	else
+ 	  {
+ 	    __glibcxx_simd_precondition(_M_data1.to_ullong() == 0,
+ 					"to_ullong called on mask with 'true' elements at indices"
+ 					"higher than representable in a ullong");
+ 	    return _M_data0.to_ullong();
+ 	  }
+       }
+ 
+       // [simd.mask.binary]
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator&&(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return _S_init(__x._M_data0 && __y._M_data0, __x._M_data1 && __y._M_data1); }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator||(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return _S_init(__x._M_data0 || __y._M_data0, __x._M_data1 || __y._M_data1); }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator&(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return _S_init(__x._M_data0 & __y._M_data0, __x._M_data1 & __y._M_data1); }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator|(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return _S_init(__x._M_data0 | __y._M_data0, __x._M_data1 | __y._M_data1); }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator^(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return _S_init(__x._M_data0 ^ __y._M_data0, __x._M_data1 ^ __y._M_data1); }
+ 
+       // [simd.mask.cassign]
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask&
+       operator&=(basic_mask& __x, const basic_mask& __y) noexcept
+       {
+ 	__x._M_data0 &= __y._M_data0;
+ 	__x._M_data1 &= __y._M_data1;
+ 	return __x;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask&
+       operator|=(basic_mask& __x, const basic_mask& __y) noexcept
+       {
+ 	__x._M_data0 |= __y._M_data0;
+ 	__x._M_data1 |= __y._M_data1;
+ 	return __x;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask&
+       operator^=(basic_mask& __x, const basic_mask& __y) noexcept
+       {
+ 	__x._M_data0 ^= __y._M_data0;
+ 	__x._M_data1 ^= __y._M_data1;
+ 	return __x;
+       }
+ 
+       // [simd.mask.comparison] -----------------------------------------------
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator==(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return !(__x ^ __y); }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator!=(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return __x ^ __y; }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator>=(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return __x || !__y; }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator<=(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return !__x || __y; }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator>(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return __x && !__y; }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       operator<(const basic_mask& __x, const basic_mask& __y) noexcept
+       { return !__x && __y; }
+ 
+       // [simd.mask.cond] -----------------------------------------------------
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       __select_impl(const basic_mask& __k, const basic_mask& __t, const basic_mask& __f) noexcept
+       {
+ 	return _S_init(__select_impl(__k._M_data0, __t._M_data0, __f._M_data0),
+ 		       __select_impl(__k._M_data1, __t._M_data1, __f._M_data1));
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_mask
+       __select_impl(const basic_mask& __k, same_as<bool> auto __t, same_as<bool> auto __f) noexcept
+       {
+ 	if (__t == __f)
+ 	  return basic_mask(__t);
+ 	else
+ 	  return __t ? __k : !__k;
+       }
+ 
+       template <__vectorizable _T0, same_as<_T0> _T1>
+ 	requires (sizeof(_T0) == _Bytes)
+ 	[[__gnu__::__always_inline__]]
+ 	friend constexpr vec<_T0, _S_size>
+ 	__select_impl(const basic_mask& __k, const _T0& __t, const _T1& __f) noexcept
+ 	{
+ 	  using _Vp = vec<_T0, _S_size>;
+ 	  if constexpr (!is_same_v<basic_mask, typename _Vp::mask_type>)
+ 	    return __select_impl(static_cast<_Vp::mask_type>(__k), __t, __f);
+ 	  else
+ 	    return _Vp::_S_init(__select_impl(__k._M_data0, __t, __f),
+ 				__select_impl(__k._M_data1, __t, __f));
+ 	}
+ 
+       template <_ArchTraits _Traits = {}>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr bool
+ 	_M_all_of() const
+ 	{
+ 	  if constexpr (_N0 == _N1)
+ 	    return (_M_data0 && _M_data1)._M_all_of();
+ 	  else
+ 	    return _M_data0._M_all_of() && _M_data1._M_all_of();
+ 	}
+ 
+       template <_ArchTraits _Traits = {}>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr bool
+ 	_M_any_of() const
+ 	{
+ 	  if constexpr (_N0 == _N1)
+ 	    return (_M_data0 || _M_data1)._M_any_of();
+ 	  else
+ 	    return _M_data0._M_any_of() || _M_data1._M_any_of();
+ 	}
+ 
+       template <_ArchTraits _Traits = {}>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr bool
+ 	_M_none_of() const
+ 	{
+ 	  if constexpr (_N0 == _N1)
+ 	    return (_M_data0 || _M_data1)._M_none_of();
+ 	  else
+ 	    return _M_data0._M_none_of() && _M_data1._M_none_of();
+ 	}
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr __simd_size_type
+       _M_reduce_min_index() const
+       {
+ 	if constexpr (_S_size <= numeric_limits<unsigned long long>::digits)
+ 	  {
+ 	    const auto __bits = _M_to_uint();
+ 	    __glibcxx_simd_precondition(__bits, "An empty mask does not have a min_index.");
+ 	    if constexpr (_S_size == 1)
+ 	      return 0;
+ 	    else
+ 	      return __countr_zero(_M_to_uint());
+ 	  }
+ 	else if (_M_data0._M_none_of())
+ 	  return _M_data1._M_reduce_min_index() + _N0;
+ 	else
+ 	  return _M_data0._M_reduce_min_index();
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr __simd_size_type
+       _M_reduce_max_index() const
+       {
+ 	if constexpr (_S_size <= numeric_limits<unsigned long long>::digits)
+ 	  {
+ 	    const auto __bits = _M_to_uint();
+ 	    __glibcxx_simd_precondition(__bits, "An empty mask does not have a max_index.");
+ 	    if constexpr (_S_size == 1)
+ 	      return 0;
+ 	    else
+ 	      return __highest_bit(_M_to_uint());
+ 	  }
+ 	else if (_M_data1._M_none_of())
+ 	  return _M_data0._M_reduce_max_index();
+ 	else
+ 	  return _M_data1._M_reduce_max_index() + _N0;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr bool
+       __is_const_known(const basic_mask& __x)
+       { return __is_const_known(__x._M_data0) && __is_const_known(__x._M_data1); }
+     };
+ } // namespace simd
+ _GLIBCXX_END_NAMESPACE_VERSION
+ } // namespace std
+ 
+ #pragma GCC diagnostic pop
+ #endif // C++26
+ #endif // _GLIBCXX_SIMD_MASK_H
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/simd_mask_reductions.h gcc-16-20260322/libstdc++-v3/include/bits/simd_mask_reductions.h
*** gcc-16-20260315/libstdc++-v3/include/bits/simd_mask_reductions.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/include/bits/simd_mask_reductions.h	Sun Mar 22 22:32:15 2026
***************
*** 0 ****
--- 1,118 ----
+ // Implementation of <simd> -*- C++ -*-
+ 
+ // Copyright The GNU Toolchain Authors.
+ //
+ // 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/>.
+ 
+ #ifndef _GLIBCXX_SIMD_MASK_REDUCTIONS_H
+ #define _GLIBCXX_SIMD_MASK_REDUCTIONS_H 1
+ 
+ #ifdef _GLIBCXX_SYSHDR
+ #pragma GCC system_header
+ #endif
+ 
+ #if __cplusplus >= 202400L
+ 
+ #include "simd_mask.h"
+ 
+ // psabi warnings are bogus because the ABI of the internal types never leaks into user code
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wpsabi"
+ 
+ // [simd.mask.reductions] -----------------------------------------------------
+ namespace std _GLIBCXX_VISIBILITY(default)
+ {
+ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ namespace simd
+ {
+   template <size_t _Bytes, typename _Ap>
+     [[__gnu__::__always_inline__]]
+     constexpr bool
+     all_of(const basic_mask<_Bytes, _Ap>& __k) noexcept
+     { return __k._M_all_of(); }
+ 
+   template <size_t _Bytes, typename _Ap>
+     [[__gnu__::__always_inline__]]
+     constexpr bool
+     any_of(const basic_mask<_Bytes, _Ap>& __k) noexcept
+     { return __k._M_any_of(); }
+ 
+   template <size_t _Bytes, typename _Ap>
+     [[__gnu__::__always_inline__]]
+     constexpr bool
+     none_of(const basic_mask<_Bytes, _Ap>& __k) noexcept
+     { return __k._M_none_of(); }
+ 
+   template <size_t _Bytes, typename _Ap>
+     [[__gnu__::__always_inline__]]
+     constexpr __simd_size_type
+     reduce_count(const basic_mask<_Bytes, _Ap>& __k) noexcept
+     {
+       if constexpr (_Ap::_S_size == 1)
+ 	return +__k[0];
+       else if constexpr (_Ap::_S_is_vecmask)
+ 	return -reduce(-__k);
+       else
+ 	return __k._M_reduce_count();
+     }
+ 
+   template <size_t _Bytes, typename _Ap>
+     [[__gnu__::__always_inline__]]
+     constexpr __simd_size_type
+     reduce_min_index(const basic_mask<_Bytes, _Ap>& __k)
+     { return __k._M_reduce_min_index(); }
+ 
+   template <size_t _Bytes, typename _Ap>
+     [[__gnu__::__always_inline__]]
+     constexpr __simd_size_type
+     reduce_max_index(const basic_mask<_Bytes, _Ap>& __k)
+     { return __k._M_reduce_max_index(); }
+ 
+   constexpr bool
+   all_of(same_as<bool> auto __x) noexcept
+   { return __x; }
+ 
+   constexpr bool
+   any_of(same_as<bool> auto __x) noexcept
+   { return __x; }
+ 
+   constexpr bool
+   none_of(same_as<bool> auto __x) noexcept
+   { return !__x; }
+ 
+   constexpr __simd_size_type
+   reduce_count(same_as<bool> auto __x) noexcept
+   { return __x; }
+ 
+   constexpr __simd_size_type
+   reduce_min_index(same_as<bool> auto __x)
+   { return 0; }
+ 
+   constexpr __simd_size_type
+   reduce_max_index(same_as<bool> auto __x)
+   { return 0; }
+ } // namespace simd
+ _GLIBCXX_END_NAMESPACE_VERSION
+ } // namespace std
+ 
+ #pragma GCC diagnostic pop
+ #endif // C++26
+ #endif // _GLIBCXX_SIMD_MASK_REDUCTIONS_H
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/simd_reductions.h gcc-16-20260322/libstdc++-v3/include/bits/simd_reductions.h
*** gcc-16-20260315/libstdc++-v3/include/bits/simd_reductions.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/include/bits/simd_reductions.h	Sun Mar 22 22:32:15 2026
***************
*** 0 ****
--- 1,109 ----
+ // Implementation of <simd> -*- C++ -*-
+ 
+ // Copyright The GNU Toolchain Authors.
+ //
+ // 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/>.
+ 
+ #ifndef _GLIBCXX_SIMD_REDUCTIONS_H
+ #define _GLIBCXX_SIMD_REDUCTIONS_H 1
+ 
+ #ifdef _GLIBCXX_SYSHDR
+ #pragma GCC system_header
+ #endif
+ 
+ #if __cplusplus >= 202400L
+ 
+ #include "simd_vec.h"
+ 
+ // psabi warnings are bogus because the ABI of the internal types never leaks into user code
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wpsabi"
+ 
+ // [simd.reductions] ----------------------------------------------------------
+ namespace std _GLIBCXX_VISIBILITY(default)
+ {
+ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ namespace simd
+ {
+   template <typename _Tp, typename _Ap, __reduction_binary_operation<_Tp> _BinaryOperation = plus<>>
+     [[__gnu__::__always_inline__]]
+     constexpr _Tp
+     reduce(const basic_vec<_Tp, _Ap>& __x, _BinaryOperation __binary_op = {})
+     { return __x._M_reduce(__binary_op); }
+ 
+   template <typename _Tp, typename _Ap, __reduction_binary_operation<_Tp> _BinaryOperation = plus<>>
+     [[__gnu__::__always_inline__]]
+     constexpr _Tp
+     reduce(const basic_vec<_Tp, _Ap>& __x, const typename basic_vec<_Tp, _Ap>::mask_type& __mask,
+ 	   _BinaryOperation __binary_op = {}, type_identity_t<_Tp> __identity_element
+ 	     = __default_identity_element<_Tp, _BinaryOperation>())
+     { return reduce(__select_impl(__mask, __x, __identity_element), __binary_op); }
+ 
+   template <totally_ordered _Tp, typename _Ap>
+     [[__gnu__::__always_inline__]]
+     constexpr _Tp
+     reduce_min(const basic_vec<_Tp, _Ap>& __x) noexcept
+     {
+       return reduce(__x, []<typename _UV>(const _UV& __a, const _UV& __b) {
+ 	       return __select_impl(__a < __b, __a, __b);
+ 	     });
+     }
+ 
+   template <totally_ordered _Tp, typename _Ap>
+     [[__gnu__::__always_inline__]]
+     constexpr _Tp
+     reduce_min(const basic_vec<_Tp, _Ap>& __x,
+ 	       const typename basic_vec<_Tp, _Ap>::mask_type& __mask) noexcept
+     {
+       return reduce(__select_impl(__mask, __x, numeric_limits<_Tp>::max()),
+ 		    []<typename _UV>(const _UV& __a, const _UV& __b) {
+ 		      return __select_impl(__a < __b, __a, __b);
+ 		    });
+     }
+ 
+   template <totally_ordered _Tp, typename _Ap>
+     [[__gnu__::__always_inline__]]
+     constexpr _Tp
+     reduce_max(const basic_vec<_Tp, _Ap>& __x) noexcept
+     {
+       return reduce(__x, []<typename _UV>(const _UV& __a, const _UV& __b) {
+ 	       return __select_impl(__a < __b, __b, __a);
+ 	     });
+     }
+ 
+   template <totally_ordered _Tp, typename _Ap>
+     [[__gnu__::__always_inline__]]
+     constexpr _Tp
+     reduce_max(const basic_vec<_Tp, _Ap>& __x,
+ 	       const typename basic_vec<_Tp, _Ap>::mask_type& __mask) noexcept
+     {
+       return reduce(__select_impl(__mask, __x, numeric_limits<_Tp>::lowest()),
+ 		    []<typename _UV>(const _UV& __a, const _UV& __b) {
+ 		      return __select_impl(__a < __b, __b, __a);
+ 		    });
+     }
+ } // namespace simd
+ _GLIBCXX_END_NAMESPACE_VERSION
+ } // namespace std
+ 
+ #pragma GCC diagnostic pop
+ #endif // C++26
+ #endif // _GLIBCXX_SIMD_REDUCTIONS_H
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/simd_vec.h gcc-16-20260322/libstdc++-v3/include/bits/simd_vec.h
*** gcc-16-20260315/libstdc++-v3/include/bits/simd_vec.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/include/bits/simd_vec.h	Sun Mar 22 22:32:15 2026
***************
*** 0 ****
--- 1,2297 ----
+ // Implementation of <simd> -*- C++ -*-
+ 
+ // Copyright The GNU Toolchain Authors.
+ //
+ // 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/>.
+ 
+ #ifndef _GLIBCXX_SIMD_VEC_H
+ #define _GLIBCXX_SIMD_VEC_H 1
+ 
+ #ifdef _GLIBCXX_SYSHDR
+ #pragma GCC system_header
+ #endif
+ 
+ #if __cplusplus >= 202400L
+ 
+ #include "simd_mask.h"
+ #include "simd_flags.h"
+ 
+ #include <bits/utility.h>
+ #include <bits/stl_function.h>
+ #include <cmath>
+ 
+ // psabi warnings are bogus because the ABI of the internal types never leaks into user code
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wpsabi"
+ 
+ namespace std _GLIBCXX_VISIBILITY(default)
+ {
+ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ namespace simd
+ {
+   // disabled basic_vec
+   template <typename _Tp, typename _Ap>
+     class basic_vec
+     {
+     public:
+       using value_type = _Tp;
+ 
+       using abi_type = _Ap;
+ 
+       using mask_type = basic_mask<0, void>; // disabled
+ 
+ #define _GLIBCXX_DELETE_SIMD "This specialization is disabled because of an invalid combination "  \
+ 			     "of template arguments to basic_vec."
+ 
+       basic_vec() = delete(_GLIBCXX_DELETE_SIMD);
+ 
+       ~basic_vec() = delete(_GLIBCXX_DELETE_SIMD);
+ 
+       basic_vec(const basic_vec&) = delete(_GLIBCXX_DELETE_SIMD);
+ 
+       basic_vec& operator=(const basic_vec&) = delete(_GLIBCXX_DELETE_SIMD);
+ 
+ #undef _GLIBCXX_DELETE_SIMD
+     };
+ 
+   template <typename _Tp, typename _Ap>
+     class _VecBase
+     {
+       using _Vp = basic_vec<_Tp, _Ap>;
+ 
+     public:
+       using value_type = _Tp;
+ 
+       using abi_type = _Ap;
+ 
+       using mask_type = basic_mask<sizeof(_Tp), abi_type>;
+ 
+       using iterator = __iterator<_Vp>;
+ 
+       using const_iterator = __iterator<const _Vp>;
+ 
+       constexpr iterator
+       begin() noexcept
+       { return {static_cast<_Vp&>(*this), 0}; }
+ 
+       constexpr const_iterator
+       begin() const noexcept
+       { return cbegin(); }
+ 
+       constexpr const_iterator
+       cbegin() const noexcept
+       { return {static_cast<const _Vp&>(*this), 0}; }
+ 
+       constexpr default_sentinel_t
+       end() const noexcept
+       { return {}; }
+ 
+       constexpr default_sentinel_t
+       cend() const noexcept
+       { return {}; }
+ 
+       static constexpr auto size = __simd_size_c<_Ap::_S_size>;
+ 
+       _VecBase() = default;
+ 
+       // LWG issue from 2026-03-04 / P4042R0
+       template <typename _Up, typename _UAbi>
+ 	requires (_Ap::_S_size != _UAbi::_S_size)
+ 	_VecBase(const basic_vec<_Up, _UAbi>&) = delete("size mismatch");
+ 
+       template <typename _Up, typename _UAbi>
+ 	requires (_Ap::_S_size == _UAbi::_S_size) && (!__explicitly_convertible_to<_Up, _Tp>)
+ 	explicit
+ 	_VecBase(const basic_vec<_Up, _UAbi>&)
+ 	  = delete("the value types are not convertible");
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr _Vp
+       operator+(const _Vp& __x, const _Vp& __y) noexcept
+       {
+ 	_Vp __r = __x;
+ 	__r += __y;
+ 	return __r;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr _Vp
+       operator-(const _Vp& __x, const _Vp& __y) noexcept
+       {
+ 	_Vp __r = __x;
+ 	__r -= __y;
+ 	return __r;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr _Vp
+       operator*(const _Vp& __x, const _Vp& __y) noexcept
+       {
+ 	_Vp __r = __x;
+ 	__r *= __y;
+ 	return __r;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr _Vp
+       operator/(const _Vp& __x, const _Vp& __y) noexcept
+       {
+ 	_Vp __r = __x;
+ 	__r /= __y;
+ 	return __r;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr _Vp
+       operator%(const _Vp& __x, const _Vp& __y) noexcept
+       requires requires (_Tp __a) { __a % __a; }
+       {
+ 	_Vp __r = __x;
+ 	__r %= __y;
+ 	return __r;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr _Vp
+       operator&(const _Vp& __x, const _Vp& __y) noexcept
+       requires requires (_Tp __a) { __a & __a; }
+       {
+ 	_Vp __r = __x;
+ 	__r &= __y;
+ 	return __r;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr _Vp
+       operator|(const _Vp& __x, const _Vp& __y) noexcept
+       requires requires (_Tp __a) { __a | __a; }
+       {
+ 	_Vp __r = __x;
+ 	__r |= __y;
+ 	return __r;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr _Vp
+       operator^(const _Vp& __x, const _Vp& __y) noexcept
+       requires requires (_Tp __a) { __a ^ __a; }
+       {
+ 	_Vp __r = __x;
+ 	__r ^= __y;
+ 	return __r;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr _Vp
+       operator<<(const _Vp& __x, const _Vp& __y) _GLIBCXX_SIMD_NOEXCEPT
+       requires requires (_Tp __a) { __a << __a; }
+       {
+ 	_Vp __r = __x;
+ 	__r <<= __y;
+ 	return __r;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr _Vp
+       operator<<(const _Vp& __x, __simd_size_type __y) _GLIBCXX_SIMD_NOEXCEPT
+       requires requires (_Tp __a, __simd_size_type __b) { __a << __b; }
+       {
+ 	_Vp __r = __x;
+ 	__r <<= __y;
+ 	return __r;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr _Vp
+       operator>>(const _Vp& __x, const _Vp& __y) _GLIBCXX_SIMD_NOEXCEPT
+       requires requires (_Tp __a) { __a >> __a; }
+       {
+ 	_Vp __r = __x;
+ 	__r >>= __y;
+ 	return __r;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr _Vp
+       operator>>(const _Vp& __x, __simd_size_type __y) _GLIBCXX_SIMD_NOEXCEPT
+       requires requires (_Tp __a, __simd_size_type __b) { __a >> __b; }
+       {
+ 	_Vp __r = __x;
+ 	__r >>= __y;
+ 	return __r;
+       }
+     };
+ 
+   struct _LoadCtorTag
+   {};
+ 
+   template <integral _Tp>
+     inline constexpr _Tp __max_shift
+       = (sizeof(_Tp) < sizeof(int) ? sizeof(int) : sizeof(_Tp)) * __CHAR_BIT__;
+ 
+   template <__vectorizable _Tp, __abi_tag _Ap>
+     requires (_Ap::_S_nreg == 1)
+     class basic_vec<_Tp, _Ap>
+     : public _VecBase<_Tp, _Ap>
+     {
+       template <typename, typename>
+ 	friend class basic_vec;
+ 
+       template <size_t, typename>
+ 	friend class basic_mask;
+ 
+       static constexpr int _S_size = _Ap::_S_size;
+ 
+       static constexpr int _S_full_size = __bit_ceil(unsigned(_S_size));
+ 
+       static constexpr bool _S_is_scalar = _S_size == 1;
+ 
+       static constexpr bool _S_use_bitmask = _Ap::_S_is_bitmask && !_S_is_scalar;
+ 
+       using _DataType = typename _Ap::template _DataType<_Tp>;
+ 
+       /** @internal
+        * @brief Underlying vector data storage.
+        *
+        * This member holds the vector object using a GNU vector type or a platform-specific vector
+        * type determined by the ABI tag. For size 1 vectors, this is a single value (_Tp).
+        */
+       _DataType _M_data;
+ 
+       static constexpr bool _S_is_partial = sizeof(_M_data) > sizeof(_Tp) * _S_size;
+ 
+       using __canon_value_type = __canonical_vec_type_t<_Tp>;
+ 
+     public:
+       using value_type = _Tp;
+ 
+       using mask_type = _VecBase<_Tp, _Ap>::mask_type;
+ 
+       // internal but public API ----------------------------------------------
+       [[__gnu__::__always_inline__]]
+       static constexpr basic_vec
+       _S_init(_DataType __x)
+       {
+ 	basic_vec __r;
+ 	__r._M_data = __x;
+ 	return __r;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr const _DataType&
+       _M_get() const
+       { return _M_data; }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr bool
+       __is_const_known(const basic_vec& __x)
+       { return __builtin_constant_p(__x._M_data); }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr auto
+       _M_concat_data([[maybe_unused]] bool __do_sanitize = false) const
+       {
+ 	if constexpr (_S_is_scalar)
+ 	  return __vec_builtin_type<__canon_value_type, 1>{_M_data};
+ 	else
+ 	  return _M_data;
+       }
+ 
+       template <int _Size = _S_size, int _Offset = 0, typename _A0, typename _Fp>
+ 	[[__gnu__::__always_inline__]]
+ 	static constexpr basic_vec
+ 	_S_static_permute(const basic_vec<value_type, _A0>& __x, _Fp&& __idxmap)
+ 	{
+ 	  using _Xp = basic_vec<value_type, _A0>;
+ 	  basic_vec __r;
+ 	  if constexpr (_S_is_scalar)
+ 	    {
+ 	      constexpr __simd_size_type __j = [&] consteval {
+ 		if constexpr (__index_permutation_function_sized<_Fp>)
+ 		  return __idxmap(_Offset, _Size);
+ 		else
+ 		  return __idxmap(_Offset);
+ 	      }();
+ 	      if constexpr (__j == simd::zero_element || __j == simd::uninit_element)
+ 		return basic_vec();
+ 	      else
+ 		static_assert(__j >= 0 && __j < _Xp::_S_size);
+ 	      __r._M_data = __x[__j];
+ 	    }
+ 	  else
+ 	    {
+ 	      auto __idxmap2 = [=](auto __i) consteval {
+ 		if constexpr (int(__i + _Offset) >= _Size) // _S_full_size > _Size
+ 		  return __simd_size_c<simd::uninit_element>;
+ 		else if constexpr (__index_permutation_function_sized<_Fp>)
+ 		  return __simd_size_c<__idxmap(__i + _Offset, _Size)>;
+ 		else
+ 		  return __simd_size_c<__idxmap(__i + _Offset)>;
+ 	      };
+ 	      constexpr auto __adj_idx = [](auto __i) {
+ 		constexpr int __j = __i;
+ 		if constexpr (__j == simd::zero_element)
+ 		  return __simd_size_c<__bit_ceil(unsigned(_Xp::_S_size))>;
+ 		else if constexpr (__j == simd::uninit_element)
+ 		  return __simd_size_c<-1>;
+ 		else
+ 		  {
+ 		    static_assert(__j >= 0 && __j < _Xp::_S_size);
+ 		    return __simd_size_c<__j>;
+ 		  }
+ 	      };
+ 	      constexpr auto [...__is0] = _IotaArray<_S_size>;
+ 	      constexpr bool __needs_zero_element
+ 		= ((__idxmap2(__simd_size_c<__is0>).value == simd::zero_element) || ...);
+ 	      constexpr auto [...__is_full] = _IotaArray<_S_full_size>;
+ 	      if constexpr (_A0::_S_nreg == 2 && !__needs_zero_element)
+ 		{
+ 		  __r._M_data = __builtin_shufflevector(
+ 				  __x._M_data0._M_data, __x._M_data1._M_data,
+ 				  __adj_idx(__idxmap2(__simd_size_c<__is_full>)).value...);
+ 		}
+ 	      else
+ 		{
+ 		  __r._M_data = __builtin_shufflevector(
+ 				  __x._M_concat_data(), decltype(__x._M_concat_data())(),
+ 				  __adj_idx(__idxmap2(__simd_size_c<__is_full>)).value...);
+ 		}
+ 	    }
+ 	  return __r;
+ 	}
+ 
+       template <typename _Vp>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr auto
+ 	_M_chunk() const noexcept
+ 	{
+ 	  constexpr int __n = _S_size / _Vp::_S_size;
+ 	  constexpr int __rem = _S_size % _Vp::_S_size;
+ 	  constexpr auto [...__is] = _IotaArray<__n>;
+ 	  if constexpr (__rem == 0)
+ 	    return array<_Vp, __n> {__extract_simd_at<_Vp>(cw<_Vp::_S_size * __is>, *this)...};
+ 	  else
+ 	    {
+ 	      using _Rest = resize_t<__rem, _Vp>;
+ 	      return tuple(__extract_simd_at<_Vp>(cw<_Vp::_S_size * __is>, *this)...,
+ 			   __extract_simd_at<_Rest>(cw<_Vp::_S_size * __n>, *this));
+ 	    }
+ 	}
+ 
+       [[__gnu__::__always_inline__]]
+       static constexpr basic_vec
+       _S_concat(const basic_vec& __x0) noexcept
+       { return __x0; }
+ 
+       template <typename... _As>
+ 	requires (sizeof...(_As) > 1)
+ 	[[__gnu__::__always_inline__]]
+ 	static constexpr basic_vec
+ 	_S_concat(const basic_vec<value_type, _As>&... __xs) noexcept
+ 	{
+ 	  static_assert(_S_size == (_As::_S_size + ...));
+ 	  return __extract_simd_at<basic_vec>(cw<0>, __xs...);
+ 	}
+ 
+       /** @internal
+        * Shifts elements to the front by @p _Shift positions (or to the back for negative @p
+        * _Shift).
+        *
+        * This function moves elements towards lower indices (front of the vector).
+        * Elements that would shift beyond the vector bounds are replaced with zero. Negative shift
+        * values shift in the opposite direction.
+        *
+        * @warning The naming can be confusing due to little-endian byte order:
+        * - Despite the name "shifted_to_front", the underlying hardware instruction
+        *   shifts bits to the right (psrl...)
+        * - The function name refers to element indices, not bit positions
+        *
+        * @tparam _Shift Number of positions to shift elements towards the front.
+        *                Must be -size() < _Shift < size().
+        *
+        * @return A new vector with elements shifted to front or back.
+        *
+        * Example:
+        * @code
+        * __iota<vec<int, 4>>._M_elements_shifted_to_front<2>(); // {2, 3, 0, 0}
+        * __iota<vec<int, 4>>._M_elements_shifted_to_front<-2>(); // {0, 0, 0, 1}
+        * @endcode
+        */
+       template <int _Shift, _ArchTraits _Traits = {}>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr basic_vec
+ 	_M_elements_shifted_to_front() const
+ 	{
+ 	  static_assert(_Shift < _S_size && -_Shift < _S_size);
+ 	  if constexpr (_Shift == 0)
+ 	    return *this;
+ #ifdef __SSE2__
+ 	  else if (!__is_const_known(*this))
+ 	    {
+ 	      if constexpr (sizeof(_M_data) == 16 && _Shift > 0)
+ 		return reinterpret_cast<_DataType>(
+ 			 __builtin_ia32_psrldqi128(__vec_bit_cast<long long>(_M_data),
+ 						   _Shift * sizeof(value_type) * 8));
+ 	      else if constexpr (sizeof(_M_data) == 16 && _Shift < 0)
+ 		return reinterpret_cast<_DataType>(
+ 			 __builtin_ia32_pslldqi128(__vec_bit_cast<long long>(_M_data),
+ 						   -_Shift * sizeof(value_type) * 8));
+ 	      else if constexpr (sizeof(_M_data) < 16)
+ 		{
+ 		  auto __x = reinterpret_cast<__vec_builtin_type_bytes<long long, 16>>(
+ 			       __vec_zero_pad_to_16(_M_data));
+ 		  if constexpr (_Shift > 0)
+ 		    __x = __builtin_ia32_psrldqi128(__x, _Shift * sizeof(value_type) * 8);
+ 		  else
+ 		    __x = __builtin_ia32_pslldqi128(__x, -_Shift * sizeof(value_type) * 8);
+ 		  return _VecOps<_DataType>::_S_extract(__vec_bit_cast<__canon_value_type>(__x));
+ 		}
+ 	    }
+ #endif
+ 	  return _S_static_permute(*this, [](int __i) consteval {
+ 		   int __off = __i + _Shift;
+ 		   return __off >= _S_size || __off < 0 ? zero_element : __off;
+ 		 });
+ 	}
+ 
+       /** @internal
+        * @brief Set padding elements to @p __id; add more padding elements if necessary.
+        *
+        * @note This function can rearrange the element order since the result is only used for
+        * reductions.
+        */
+       template <typename _Vp, __canon_value_type __id>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr _Vp
+ 	_M_pad_to_T_with_value() const noexcept
+ 	{
+ 	  static_assert(!_Vp::_S_is_partial);
+ 	  static_assert(_Ap::_S_nreg == 1);
+ 	  if constexpr (sizeof(_Vp) == 32)
+ 	    { // when we need to reduce from a 512-bit register
+ 	      static_assert(sizeof(_M_data) == 32);
+ 	      constexpr auto __k = _Vp::mask_type::_S_partial_mask_of_n(_S_size);
+ 	      return __select_impl(__k, _Vp::_S_init(_M_data), __id);
+ 	    }
+ 	  else
+ 	    {
+ 	      static_assert(sizeof(_Vp) <= 16); // => max. 7 Bytes need to be zeroed
+ 	      static_assert(sizeof(_M_data) <= sizeof(_Vp));
+ 	      _Vp __v1 = __vec_zero_pad_to<sizeof(_Vp)>(_M_data);
+ 	      if constexpr (__id == 0 && _S_is_partial)
+ 		// cheapest solution: shift values to the back while shifting in zeros
+ 		// This is valid because we shift out padding elements and use all elements in a
+ 		// subsequent reduction.
+ 		__v1 = __v1.template _M_elements_shifted_to_front<-(_Vp::_S_size - _S_size)>();
+ 	      else if constexpr (_Vp::_S_size - _S_size == 1)
+ 		// if a single element needs to be changed, use an insert instruction
+ 		__vec_set(__v1._M_data, _Vp::_S_size - 1, __id);
+ 	      else if constexpr (__has_single_bit(unsigned(_Vp::_S_size - _S_size)))
+ 		{ // if 2^n elements need to be changed, use a single insert instruction
+ 		  constexpr int __n = _Vp::_S_size - _S_size;
+ 		  using _Ip = __integer_from<__n * sizeof(__canon_value_type)>;
+ 		  constexpr auto [...__is] = _IotaArray<__n>;
+ 		  constexpr __canon_value_type __idn[__n] = {((void)__is, __id)...};
+ 		  auto __vn = __vec_bit_cast<_Ip>(__v1._M_data);
+ 		  __vec_set(__vn, _Vp::_S_size / __n - 1, __builtin_bit_cast(_Ip, __idn));
+ 		  __v1._M_data = reinterpret_cast<typename _Vp::_DataType>(__vn);
+ 		}
+ 	      else if constexpr (__id != 0 && !_S_is_partial)
+ 		{ // if __vec_zero_pad_to added zeros in all the places where we need __id, a
+ 		  // bitwise or is sufficient (needs a vector constant for the __id vector, which
+ 		  // isn't optimal)
+ 		  constexpr _Vp __idn([](int __i) {
+ 				  return __i >= _S_size ? __id : __canon_value_type();
+ 				});
+ 		  __v1._M_data = __vec_or(__v1._M_data, __idn._M_data);
+ 		}
+ 	      else if constexpr (__id != 0 || _S_is_partial)
+ 		{ // fallback
+ 		  constexpr auto __k = _Vp::mask_type::_S_partial_mask_of_n(_S_size);
+ 		  __v1 = __select_impl(__k, __v1, __id);
+ 		}
+ 	      return __v1;
+ 	    }
+ 	}
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr auto
+       _M_reduce_to_half(auto __binary_op) const
+       {
+ 	static_assert(__has_single_bit(unsigned(_S_size)));
+ 	auto [__a, __b] = chunk<_S_size / 2>(*this);
+ 	return __binary_op(__a, __b);
+       }
+ 
+       template <typename _Rest, typename _BinaryOp>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr value_type
+ 	_M_reduce_tail(const _Rest& __rest, _BinaryOp __binary_op) const
+ 	{
+ 	  if constexpr (_S_is_scalar)
+ 	    return __binary_op(*this, __rest)._M_data;
+ 	  else if constexpr (_Rest::_S_size == _S_size)
+ 	    return __binary_op(*this, __rest)._M_reduce(__binary_op);
+ 	  else if constexpr (_Rest::_S_size > _S_size)
+ 	    {
+ 	      auto [__a, __b] = __rest.template _M_chunk<basic_vec>();
+ 	      return __binary_op(*this, __a)._M_reduce_tail(__b, __binary_op);
+ 	    }
+ 	  else if constexpr (_Rest::_S_size == 1)
+ 	    return __binary_op(_Rest(_M_reduce(__binary_op)), __rest)[0];
+ 	  else if constexpr (sizeof(_M_data) <= 16
+ 			       && requires { __default_identity_element<__canon_value_type, _BinaryOp>(); })
+ 	    { // extend __rest with identity element for more parallelism
+ 	      constexpr __canon_value_type __id
+ 		= __default_identity_element<__canon_value_type, _BinaryOp>();
+ 	      return __binary_op(_M_data, __rest.template _M_pad_to_T_with_value<basic_vec, __id>())
+ 		       ._M_reduce(__binary_op);
+ 	    }
+ 	  else
+ 	    return _M_reduce_to_half(__binary_op)._M_reduce_tail(__rest, __binary_op);
+ 	}
+ 
+       /** @internal
+        * @brief Reduction over @p __binary_op of all (non-padding) elements.
+        *
+        * @note The implementation assumes it is most efficient to first reduce to one 128-bit SIMD
+        * register and then shuffle elements while sticking to 128-bit registers.
+        */
+       template <typename _BinaryOp, _ArchTraits _Traits = {}>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr value_type
+ 	_M_reduce(_BinaryOp __binary_op) const
+ 	{
+ 	  constexpr bool __have_id_elem
+ 	    = requires { __default_identity_element<__canon_value_type, _BinaryOp>(); };
+ 	  if constexpr (_S_size == 1)
+ 	    return operator[](0);
+ 	  else if constexpr (_Traits.template _M_eval_as_f32<value_type>()
+ 			       && (is_same_v<_BinaryOp, plus<>>
+ 				     || is_same_v<_BinaryOp, multiplies<>>))
+ 	    return value_type(rebind_t<float, basic_vec>(*this)._M_reduce(__binary_op));
+ #ifdef __SSE2__
+ 	  else if constexpr (is_integral_v<value_type> && sizeof(value_type) == 1
+ 			       && is_same_v<decltype(__binary_op), multiplies<>>)
+ 	    {
+ 	      // convert to unsigned short because of missing 8-bit mul instruction
+ 	      // we don't need to preserve the order of elements
+ 	      //
+ 	      // The left columns under Latency and Throughput show bit-cast to ushort with shift by
+ 	      // 8. The right column uses the alternative in the else branch.
+ 	      // Benchmark on Intel Ultra 7 165U (AVX2)
+ 	      //   TYPE            Latency      Throughput
+ 	      //             [cycles/call]   [cycles/call]
+ 	      //schar, 2        9.11  7.73      3.17  3.21
+ 	      //schar, 4        31.6  34.9      5.11  6.97
+ 	      //schar, 8        35.7  41.5      7.77  7.17
+ 	      //schar, 16       36.7  44.1      6.66  8.96
+ 	      //schar, 32       42.2  61.1      8.82  10.1
+ 	      if constexpr (!_S_is_partial)
+ 		{ // If all elements participate in the reduction we can take this shortcut
+ 		  using _V16 = resize_t<_S_size / 2, rebind_t<unsigned short, basic_vec>>;
+ 		  auto __a = __builtin_bit_cast(_V16, *this);
+ 		  return __binary_op(__a, __a >> 8)._M_reduce(__binary_op);
+ 		}
+ 	      else
+ 		{
+ 		  using _V16 = rebind_t<unsigned short, basic_vec>;
+ 		  return _V16(*this)._M_reduce(__binary_op);
+ 		}
+ 	    }
+ #endif
+ 	  else if constexpr (__has_single_bit(unsigned(_S_size)))
+ 	    {
+ 	      if constexpr (sizeof(_M_data) > 16)
+ 		return _M_reduce_to_half(__binary_op)._M_reduce(__binary_op);
+ 	      else if constexpr (_S_size == 2)
+ 		return _M_reduce_to_half(__binary_op)[0];
+ 	      else
+ 		{
+ 		  static_assert(_S_size <= 16);
+ 		  auto __x = *this;
+ #ifdef __SSE2__
+ 		  if constexpr (sizeof(_M_data) <= 16 && is_integral_v<value_type>)
+ 		    {
+ 		      if constexpr (_S_size > 8)
+ 			__x = __binary_op(__x, __x.template _M_elements_shifted_to_front<8>());
+ 		      if constexpr (_S_size > 4)
+ 			__x = __binary_op(__x, __x.template _M_elements_shifted_to_front<4>());
+ 		      if constexpr (_S_size > 2)
+ 			__x = __binary_op(__x, __x.template _M_elements_shifted_to_front<2>());
+ 		      // We could also call __binary_op with vec<T, 1> arguments. However,
+ 		      // micro-benchmarking on Intel Ultra 7 165U showed this to be more efficient:
+ 		      return __binary_op(__x, __x.template _M_elements_shifted_to_front<1>())[0];
+ 		    }
+ #endif
+ 		  if constexpr (_S_size > 8)
+ 		    __x = __binary_op(__x, _S_static_permute(__x, _SwapNeighbors<8>()));
+ 		  if constexpr (_S_size > 4)
+ 		    __x = __binary_op(__x, _S_static_permute(__x, _SwapNeighbors<4>()));
+ #ifdef __SSE2__
+ 		  // avoid pshufb by "promoting" to int
+ 		  if constexpr (is_integral_v<value_type> && sizeof(value_type) <= 1)
+ 		    return value_type(resize_t<4, rebind_t<int, basic_vec>>(chunk<4>(__x)[0])
+ 					._M_reduce(__binary_op));
+ #endif
+ 		  if constexpr (_S_size > 2)
+ 		    __x = __binary_op(__x, _S_static_permute(__x, _SwapNeighbors<2>()));
+ 		  if constexpr (is_integral_v<value_type> && sizeof(value_type) == 2)
+ 		    return __binary_op(__x, _S_static_permute(__x, _SwapNeighbors<1>()))[0];
+ 		  else
+ 		    return __binary_op(vec<value_type, 1>(__x[0]), vec<value_type, 1>(__x[1]))[0];
+ 		}
+ 	    }
+ 	  else if constexpr (sizeof(_M_data) == 32)
+ 	    {
+ 	      const auto [__lo, __hi] = chunk<__bit_floor(unsigned(_S_size))>(*this);
+ 	      return __lo._M_reduce_tail(__hi, __binary_op);
+ 	    }
+ 	  else if constexpr (sizeof(_M_data) == 64)
+ 	    {
+ 	      // e.g. _S_size = 16 + 16 + 15 (vec<char, 47>)
+ 	      // -> 8 + 8 + 7 -> 4 + 4 + 3 -> 2 + 2 + 1 -> 1
+ 	      auto __chunked = chunk<__bit_floor(unsigned(_S_size)) / 2>(*this);
+ 	      using _Cp = decltype(__chunked);
+ 	      if constexpr (tuple_size_v<_Cp> == 4)
+ 		{
+ 		  const auto& [__a, __b, __c, __rest] = __chunked;
+ 		  constexpr bool __amd_cpu = _Traits._M_have_sse4a();
+ 		  if constexpr (__have_id_elem && __rest._S_size > 1 && __amd_cpu)
+ 		    { // do one 256-bit op -> one 128-bit op
+ 		      // 4 cycles on Zen4/5 until _M_reduce (short, 26, plus<>)
+ 		      // 9 cycles on Skylake-AVX512 until _M_reduce
+ 		      // 9 cycles on Zen4/5 until _M_reduce (short, 27, multiplies<>)
+ 		      // 17 cycles on Skylake-AVX512 until _M_reduce (short, 27, multiplies<>)
+ 		      const auto& [__a, __rest] = chunk<__bit_floor(unsigned(_S_size))>(*this);
+ 		      using _Vp = remove_cvref_t<decltype(__a)>;
+ 		      constexpr __canon_value_type __id
+ 			= __default_identity_element<__canon_value_type, _BinaryOp>();
+ 		      const _Vp __b = __rest.template _M_pad_to_T_with_value<_Vp, __id>();
+ 		      return __binary_op(__a, __b)._M_reduce(__binary_op);
+ 		    }
+ 		  else if constexpr (__have_id_elem && __rest._S_size > 1)
+ 		    { // do two 128-bit ops -> one 128-bit op
+ 		      // 5 cycles on Zen4/5 until _M_reduce (short, 26, plus<>)
+ 		      // 7 cycles on Skylake-AVX512 until _M_reduce (short, 26, plus<>)
+ 		      // 9 cycles on Zen4/5 until _M_reduce (short, 27, multiplies<>)
+ 		      // 16 cycles on Skylake-AVX512 until _M_reduce (short, 27, multiplies<>)
+ 		      using _Vp = remove_cvref_t<decltype(__a)>;
+ 		      constexpr __canon_value_type __id
+ 			= __default_identity_element<__canon_value_type, _BinaryOp>();
+ 		      const _Vp __d = __rest.template _M_pad_to_T_with_value<_Vp, __id>();
+ 		      return __binary_op(__binary_op(__a, __b), __binary_op(__c, __d))
+ 			       ._M_reduce(__binary_op);
+ 		    }
+ 		  else
+ 		    return __binary_op(__binary_op(__a, __b), __c)
+ 			     ._M_reduce_tail(__rest, __binary_op);
+ 		}
+ 	      else if constexpr (tuple_size_v<_Cp> == 3)
+ 		{
+ 		  const auto& [__a, __b, __rest] = __chunked;
+ 		  return __binary_op(__a, __b)._M_reduce_tail(__rest, __binary_op);
+ 		}
+ 	      else
+ 		static_assert(false);
+ 	    }
+ 	  else if constexpr (__have_id_elem)
+ 	    {
+ 	      constexpr __canon_value_type __id
+ 		= __default_identity_element<__canon_value_type, _BinaryOp>();
+ 	      using _Vp = resize_t<__bit_ceil(unsigned(_S_size)), basic_vec>;
+ 	      return _M_pad_to_T_with_value<_Vp, __id>()._M_reduce(__binary_op);
+ 	    }
+ 	  else
+ 	    {
+ 	      const auto& [__a, __rest] = chunk<__bit_floor(unsigned(_S_size))>(*this);
+ 	      return __a._M_reduce_tail(__rest, __binary_op);
+ 	    }
+ 	}
+ 
+       // [simd.math] ----------------------------------------------------------
+       //
+       // ISO/IEC 60559 on the classification operations (5.7.2 General Operations):
+       // "They are never exceptional, even for signaling NaNs."
+       //
+       template <_OptTraits _Traits = {}>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr mask_type
+ 	_M_isnan() const requires is_floating_point_v<value_type>
+ 	{
+ 	  if constexpr (_Traits._M_finite_math_only())
+ 	    return mask_type(false);
+ 	  else if constexpr (_S_is_scalar)
+ 	    return mask_type(std::isnan(_M_data));
+ 	  else if constexpr (_S_use_bitmask)
+ 	    return _M_isunordered(*this);
+ 	  else if constexpr (!_Traits._M_support_snan())
+ 	    return !(*this == *this);
+ 	  else if (__is_const_known(_M_data))
+ 	    return mask_type([&](int __i) { return std::isnan(_M_data[__i]); });
+ 	  else
+ 	    {
+ 	      // 60559: NaN is represented as Inf + non-zero mantissa bits
+ 	      using _Ip = __integer_from<sizeof(value_type)>;
+ 	      return __builtin_bit_cast(_Ip, numeric_limits<value_type>::infinity())
+ 		       < __builtin_bit_cast(rebind_t<_Ip, basic_vec>, _M_fabs());
+ 	    }
+ 	}
+ 
+       template <_TargetTraits _Traits = {}>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr mask_type
+ 	_M_isinf() const requires is_floating_point_v<value_type>
+ 	{
+ 	  if constexpr (_Traits._M_finite_math_only())
+ 	    return mask_type(false);
+ 	  else if constexpr (_S_is_scalar)
+ 	    return mask_type(std::isinf(_M_data));
+ 	  else if (__is_const_known(_M_data))
+ 	    return mask_type([&](int __i) { return std::isinf(_M_data[__i]); });
+ #ifdef _GLIBCXX_X86
+ 	  else if constexpr (_S_use_bitmask)
+ 	    return mask_type::_S_init(__x86_bitmask_isinf(_M_data));
+ 	  else if constexpr (_Traits._M_have_avx512dq())
+ 	    return __x86_bit_to_vecmask<typename mask_type::_DataType>(
+ 		     __x86_bitmask_isinf(_M_data));
+ #endif
+ 	  else
+ 	    {
+ 	      using _Ip = __integer_from<sizeof(value_type)>;
+ 	      return __vec_bit_cast<_Ip>(_M_fabs()._M_data)
+ 		       == __builtin_bit_cast(_Ip, numeric_limits<value_type>::infinity());
+ 	    }
+ 	}
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr basic_vec
+       _M_abs() const requires signed_integral<value_type>
+       { return _M_data < 0 ? -_M_data : _M_data; }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr basic_vec
+       _M_fabs() const requires floating_point<value_type>
+       {
+ 	if constexpr (_S_is_scalar)
+ 	  return std::fabs(_M_data);
+ 	else
+ 	  return __vec_and(__vec_not(_S_signmask<_DataType>), _M_data);
+       }
+ 
+       template <_TargetTraits _Traits = {}>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr mask_type
+ 	_M_isunordered(basic_vec __y) const requires is_floating_point_v<value_type>
+ 	{
+ 	  if constexpr (_Traits._M_finite_math_only())
+ 	    return mask_type(false);
+ 	  else if constexpr (_S_is_scalar)
+ 	    return mask_type(std::isunordered(_M_data, __y._M_data));
+ #ifdef _GLIBCXX_X86
+ 	  else if constexpr (_S_use_bitmask)
+ 	    return _M_bitmask_cmp<_X86Cmp::_Unord>(__y._M_data);
+ #endif
+ 	  else
+ 	    return mask_type([&](int __i) {
+ 		     return std::isunordered(_M_data[__i], __y._M_data[__i]);
+ 		   });
+ 	}
+ 
+       /** @internal
+        * Implementation of @ref partial_load.
+        *
+        * @param __mem  A pointer to an array of @p __n values. Can be complex or real.
+        * @param __n    Read no more than @p __n values from memory. However, depending on @p __mem
+        *               alignment, out of bounds reads are benign.
+        */
+       template <typename _Up, _ArchTraits _Traits = {}>
+ 	static inline basic_vec
+ 	_S_partial_load(const _Up* __mem, size_t __n)
+ 	{
+ 	  if constexpr (_S_is_scalar)
+ 	    return __n == 0 ? basic_vec() : basic_vec(static_cast<value_type>(*__mem));
+ 	  else if (__is_const_known_equal_to(__n >= size_t(_S_size), true))
+ 	    return basic_vec(_LoadCtorTag(), __mem);
+ 	  else if constexpr (!__converts_trivially<_Up, value_type>)
+ 	    return static_cast<basic_vec>(rebind_t<_Up, basic_vec>::_S_partial_load(__mem, __n));
+ 	  else
+ 	    {
+ #if _GLIBCXX_X86
+ 	      if constexpr (_Traits._M_have_avx512f()
+ 			      || (_Traits._M_have_avx() && sizeof(_Up) >= 4))
+ 		{
+ 		  const auto __k = __n < _S_size ? mask_type::_S_partial_mask_of_n(int(__n))
+ 						 : mask_type(true);
+ 		  return _S_masked_load(__mem, mask_type::_S_partial_mask_of_n(int(__n)));
+ 		}
+ #endif
+ 	      if (__n >= size_t(_S_size)) [[unlikely]]
+ 		return basic_vec(_LoadCtorTag(), __mem);
+ #if _GLIBCXX_X86 // TODO: where else is this "safe"?
+ 	      // allow out-of-bounds read when it cannot lead to a #GP
+ 	      else if (__is_const_known_equal_to(
+ 			 is_sufficiently_aligned<sizeof(_Up) * _S_full_size>(__mem), true))
+ 		return __select_impl(mask_type::_S_partial_mask_of_n(int(__n)),
+ 				     basic_vec(_LoadCtorTag(), __mem), basic_vec());
+ #endif
+ 	      else if constexpr (_S_size > 4)
+ 		{
+ 		  alignas(_DataType) byte __dst[sizeof(_DataType)] = {};
+ 		  const byte* __src = reinterpret_cast<const byte*>(__mem);
+ 		  __memcpy_chunks<sizeof(_Up), sizeof(_DataType)>(__dst, __src, __n);
+ 		  return __builtin_bit_cast(_DataType, __dst);
+ 		}
+ 	      else if (__n == 0) [[unlikely]]
+ 		return basic_vec();
+ 	      else if constexpr (_S_size == 2)
+ 		return _DataType {static_cast<value_type>(__mem[0]), 0};
+ 	      else
+ 		{
+ 		  constexpr auto [...__is] = _IotaArray<_S_size - 2>;
+ 		  return _DataType{
+ 		    static_cast<value_type>(__mem[0]),
+ 		    static_cast<value_type>(__is + 1 < __n ? __mem[__is + 1] : 0)...
+ 		  };
+ 		}
+ 	    }
+ 	}
+ 
+       /** @internal
+        * Loads elements from @p __mem according to mask @p __k.
+        *
+        * @param __mem Pointer (in)to array.
+        * @param __k   Mask controlling which elements to load. For each bit i in the mask:
+        *              - If bit i is 1: copy __mem[i] into result[i]
+        *              - If bit i is 0: result[i] is default initialized
+        *
+        * @note This function assumes it's called after determining that no other method
+        *       (like full load) is more appropriate. Calling with all mask bits set to 1
+        *       is suboptimal for performance but still correct.
+        */
+       template <typename _Up, _ArchTraits _Traits = {}>
+ 	static inline basic_vec
+ 	_S_masked_load(const _Up* __mem, mask_type __k)
+ 	{
+ 	  if constexpr (_S_size == 1)
+ 	    return __k[0] ? static_cast<value_type>(__mem[0]) : value_type();
+ #if _GLIBCXX_X86
+ 	  else if constexpr (_Traits._M_have_avx512f())
+ 	    return __x86_masked_load<_DataType>(__mem, __k._M_data);
+ 	  else if constexpr (_Traits._M_have_avx() && (sizeof(_Up) == 4 || sizeof(_Up) == 8))
+ 	    {
+ 	      if constexpr (__converts_trivially<_Up, value_type>)
+ 		return __x86_masked_load<_DataType>(__mem, __k._M_data);
+ 	      else
+ 		{
+ 		  using _UV = rebind_t<_Up, basic_vec>;
+ 		  return basic_vec(_UV::_S_masked_load(__mem, typename _UV::mask_type(__k)));
+ 		}
+ 	    }
+ #endif
+ 	  else if (__k._M_none_of()) [[unlikely]]
+ 	    return basic_vec();
+ 	  else if constexpr (_S_is_scalar)
+ 	    return basic_vec(static_cast<value_type>(*__mem));
+ 	  else
+ 	    {
+ 	      // Use at least 4-byte __bits in __bit_foreach for better code-gen
+ 	      _Bitmask<_S_size < 32 ? 32 : _S_size> __bits = __k._M_to_uint();
+ 	      [[assume(__bits != 0)]]; // because of '__k._M_none_of()' branch above
+ 	      if constexpr (__converts_trivially<_Up, value_type>)
+ 		{
+ 		  _DataType __r = {};
+ 		  __bit_foreach(__bits, [&] [[__gnu__::__always_inline__]] (int __i) {
+ 		    __r[__i] = __mem[__i];
+ 		  });
+ 		  return __r;
+ 		}
+ 	      else
+ 		{
+ 		  using _UV = rebind_t<_Up, basic_vec>;
+ 		  alignas(_UV) _Up __tmp[sizeof(_UV) / sizeof(_Up)] = {};
+ 		  __bit_foreach(__bits, [&] [[__gnu__::__always_inline__]] (int __i) {
+ 		    __tmp[__i] = __mem[__i];
+ 		  });
+ 		  return basic_vec(__builtin_bit_cast(_UV, __tmp));
+ 		}
+ 	    }
+ 	}
+ 
+       template <typename _Up>
+ 	[[__gnu__::__always_inline__]]
+ 	inline void
+ 	_M_store(_Up* __mem) const
+ 	{
+ 	  if constexpr (__converts_trivially<value_type, _Up>)
+ 	    __builtin_memcpy(__mem, &_M_data, sizeof(_Up) * _S_size);
+ 	  else
+ 	    rebind_t<_Up, basic_vec>(*this)._M_store(__mem);
+ 	}
+ 
+       /** @internal
+        * Implementation of @ref partial_store.
+        *
+        * @note This is a static function to allow passing @p __v via register in case the function
+        * is not inlined.
+        *
+        * @note The function is not marked @c __always_inline__ since code-gen can become fairly
+        * long.
+        */
+       template <typename _Up, _ArchTraits _Traits = {}>
+ 	static inline void
+ 	_S_partial_store(const basic_vec __v, _Up* __mem, size_t __n)
+ 	{
+ 	  if (__is_const_known_equal_to(__n >= _S_size, true))
+ 	    __v._M_store(__mem);
+ #if _GLIBCXX_X86
+ 	  else if constexpr (_Traits._M_have_avx512f() && !_S_is_scalar)
+ 	    {
+ 	      const auto __k = __n < _S_size ? mask_type::_S_partial_mask_of_n(int(__n))
+ 					     : mask_type(true);
+ 	      return _S_masked_store(__v, __mem, __k);
+ 	    }
+ #endif
+ 	  else if (__n >= _S_size) [[unlikely]]
+ 	    __v._M_store(__mem);
+ 	  else if (__n == 0) [[unlikely]]
+ 	    return;
+ 	  else if constexpr (__converts_trivially<value_type, _Up>)
+ 	    {
+ 	      byte* __dst = reinterpret_cast<byte*>(__mem);
+ 	      const byte* __src = reinterpret_cast<const byte*>(&__v._M_data);
+ 	      __memcpy_chunks<sizeof(_Up), sizeof(_M_data)>(__dst, __src, __n);
+ 	    }
+ 	  else
+ 	    {
+ 	      using _UV = rebind_t<_Up, basic_vec>;
+ 	      _UV::_S_partial_store(_UV(__v), __mem, __n);
+ 	    }
+ 	}
+ 
+       /** @internal
+        * Stores elements of @p __v to @p __mem according to mask @p __k.
+        *
+        * @param __v   Values to store to @p __mem.
+        * @param __mem Pointer (in)to array.
+        * @param __k   Mask controlling which elements to store. For each bit i in the mask:
+        *              - If bit i is 1: store __v[i] to __mem[i]
+        *              - If bit i is 0: __mem[i] is left unchanged
+        *
+        * @note This function assumes it's called after determining that no other method
+        *       (like full store) is more appropriate. Calling with all mask bits set to 1
+        *       is suboptimal for performance but still correct.
+        */
+       template <typename _Up, _ArchTraits _Traits = {}>
+ 	//[[__gnu__::__always_inline__]]
+ 	static inline void
+ 	_S_masked_store(const basic_vec __v, _Up* __mem, const mask_type __k)
+ 	{
+ #if _GLIBCXX_X86
+ 	  if constexpr (_Traits._M_have_avx512f())
+ 	    {
+ 	      __x86_masked_store(__v._M_data, __mem, __k._M_data);
+ 	      return;
+ 	    }
+ 	  else if constexpr (_Traits._M_have_avx() && (sizeof(_Up) == 4 || sizeof(_Up) == 8))
+ 	    {
+ 	      if constexpr (__converts_trivially<value_type, _Up>)
+ 		__x86_masked_store(__v._M_data, __mem, __k._M_data);
+ 	      else
+ 		{
+ 		  using _UV = rebind_t<_Up, basic_vec>;
+ 		  _UV::_S_masked_store(_UV(__v), __mem, typename _UV::mask_type(__k));
+ 		}
+ 	      return;
+ 	    }
+ #endif
+ 	  if (__k._M_none_of()) [[unlikely]]
+ 	    return;
+ 	  else if constexpr (_S_is_scalar)
+ 	    __mem[0] = __v._M_data;
+ 	  else
+ 	    {
+ 	      // Use at least 4-byte __bits in __bit_foreach for better code-gen
+ 	      _Bitmask<_S_size < 32 ? 32 : _S_size> __bits = __k._M_to_uint();
+ 	      [[assume(__bits != 0)]]; // because of '__k._M_none_of()' branch above
+ 	      if constexpr (__converts_trivially<value_type, _Up>)
+ 		{
+ 		  __bit_foreach(__bits, [&] [[__gnu__::__always_inline__]] (int __i) {
+ 		    __mem[__i] = __v[__i];
+ 		  });
+ 		}
+ 	      else
+ 		{
+ 		  const rebind_t<_Up, basic_vec> __cvted(__v);
+ 		  __bit_foreach(__bits, [&] [[__gnu__::__always_inline__]] (int __i) {
+ 		    __mem[__i] = __cvted[__i];
+ 		  });
+ 		}
+ 	    }
+ 	}
+ 
+       // [simd.overview] default constructor ----------------------------------
+       basic_vec() = default;
+ 
+       // [simd.overview] p2 impl-def conversions ------------------------------
+       using _NativeVecType = decltype([] {
+ 	    if constexpr (_S_is_scalar)
+ 	      return __vec_builtin_type<__canon_value_type, 1>();
+ 	    else
+ 	      return _DataType();
+ 	  }());
+       /**
+        * @brief Converting constructor from GCC vector builtins.
+        *
+        * This constructor enables direct construction from GCC vector builtins
+        * (`[[gnu::vector_size(N)]]`).
+        *
+        * @param __x GCC vector builtin to convert from.
+        *
+        * @note This constructor is not available when size() equals 1.
+        *
+        * @see operator _NativeVecType() for the reverse conversion.
+        */
+       constexpr
+       basic_vec(_NativeVecType __x)
+       : _M_data([&] [[__gnu__::__always_inline__]] {
+ 	  if constexpr (_S_is_scalar)
+ 	    return __x[0];
+ 	  else
+ 	    return __x;
+ 	}())
+       {}
+ 
+       /**
+        * @brief Conversion operator to GCC vector builtins.
+        *
+        * This operator enables implicit conversion from basic_vec to GCC vector builtins.
+        *
+        * @note This operator is not available when size() equals 1.
+        *
+        * @see basic_vec(_NativeVecType) for the reverse conversion.
+        */
+       constexpr
+       operator _NativeVecType() const
+       {
+ 	if constexpr (_S_is_scalar)
+ 	  return _NativeVecType{_M_data};
+ 	else
+ 	  return _M_data;
+       }
+ 
+ #if _GLIBCXX_X86
+       /**
+        * @brief Converting constructor from Intel Intrinsics (__m128, __m128i, ...).
+        */
+       template <__vec_builtin _IV>
+ 	requires same_as<__x86_intel_intrin_value_type<value_type>, __vec_value_type<_IV>>
+ 	  && (sizeof(_IV) == sizeof(_DataType) && sizeof(_IV) >= 16
+ 		 && !is_same_v<_IV, _DataType>)
+ 	constexpr
+ 	basic_vec(_IV __x)
+ 	: _M_data(reinterpret_cast<_DataType>(__x))
+ 	{}
+ 
+       /**
+        * @brief Conversion operator to Intel Intrinsics (__m128, __m128i, ...).
+        */
+       template <__vec_builtin _IV>
+ 	requires same_as<__x86_intel_intrin_value_type<value_type>, __vec_value_type<_IV>>
+ 	  && (sizeof(_IV) == sizeof(_DataType) && sizeof(_IV) >= 16
+ 		 && !is_same_v<_IV, _DataType>)
+ 	constexpr
+ 	operator _IV() const
+ 	{ return reinterpret_cast<_IV>(_M_data); }
+ #endif
+ 
+       // [simd.ctor] broadcast constructor ------------------------------------
+       /**
+        * @brief Broadcast constructor from scalar value.
+        *
+        * Constructs a vector where all elements are initialized to the same scalar value.
+        * The scalar value is converted to the vector's element type.
+        *
+        * @param __x Scalar value to broadcast to all vector elements.
+        * @tparam _Up Type of scalar value (must be explicitly convertible to value_type).
+        *
+        * @note The constructor is implicit if the conversion (if any) is value-preserving.
+        */
+       template <__explicitly_convertible_to<value_type> _Up>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr explicit(!__broadcast_constructible<_Up, value_type>)
+ 	basic_vec(_Up&& __x) noexcept
+ 	  : _M_data(_DataType() == _DataType() ? static_cast<value_type>(__x) : value_type())
+ 	{}
+ 
+       template <__simd_vec_bcast_consteval<value_type> _Up>
+ 	consteval
+ 	basic_vec(_Up&& __x)
+ 	: _M_data(_DataType() == _DataType()
+ 		    ? __value_preserving_cast<value_type>(__x) : value_type())
+ 	{}
+ 
+       // [simd.ctor] conversion constructor -----------------------------------
+       template <typename _Up, typename _UAbi, _TargetTraits _Traits = {}>
+ 	requires (_S_size == _UAbi::_S_size)
+ 	  && __explicitly_convertible_to<_Up, value_type>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr
+ 	explicit(!__value_preserving_convertible_to<_Up, value_type>
+ 		   || __higher_rank_than<_Up, value_type>)
+ 	basic_vec(const basic_vec<_Up, _UAbi>& __x) noexcept
+ 	: _M_data([&] [[__gnu__::__always_inline__]] {
+ 	    if constexpr (_S_is_scalar)
+ 	      return static_cast<value_type>(__x[0]);
+ 	    else if constexpr (_UAbi::_S_nreg >= 2)
+ 	      // __builtin_convertvector (__vec_cast) is inefficient for over-sized inputs.
+ 	      // Also e.g. vec<float, 12> -> vec<char, 12> (with SSE2) would otherwise emit 4
+ 	      // vcvttps2dq instructions, where only 3 are needed
+ 	      return _S_concat(resize_t<__x._N0, basic_vec>(__x._M_data0),
+ 			       resize_t<__x._N1, basic_vec>(__x._M_data1))._M_data;
+ 	    else
+ 	      return __vec_cast<_DataType>(__x._M_concat_data());
+ 	  }())
+ 	{}
+ 
+       using _VecBase<_Tp, _Ap>::_VecBase;
+ 
+       // [simd.ctor] generator constructor ------------------------------------
+       template <__simd_generator_invokable<value_type, _S_size> _Fp>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr explicit
+ 	basic_vec(_Fp&& __gen)
+ 	: _M_data([&] [[__gnu__::__always_inline__]] {
+ 	    constexpr auto [...__is] = _IotaArray<_S_size>;
+ 	    return _DataType{static_cast<value_type>(__gen(__simd_size_c<__is>))...};
+ 	  }())
+ 	{}
+ 
+       // [simd.ctor] load constructor -----------------------------------------
+       template <typename _Up>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr
+ 	basic_vec(_LoadCtorTag, const _Up* __ptr)
+ 	  : _M_data()
+ 	{
+ 	  if constexpr (_S_is_scalar)
+ 	    _M_data = static_cast<value_type>(__ptr[0]);
+ 	  else if consteval
+ 	    {
+ 	      constexpr auto [...__is] = _IotaArray<_S_size>;
+ 	      _M_data = _DataType{static_cast<value_type>(__ptr[__is])...};
+ 	    }
+ 	  else
+ 	    {
+ 	      if constexpr (__converts_trivially<_Up, value_type>)
+ 		// This assumes std::floatN_t to be bitwise equal to float/double
+ 		__builtin_memcpy(&_M_data, __ptr, sizeof(value_type) * _S_size);
+ 	      else
+ 		{
+ 		  __vec_builtin_type<_Up, _S_full_size> __tmp = {};
+ 		  __builtin_memcpy(&__tmp, __ptr, sizeof(_Up) * _S_size);
+ 		  _M_data = __vec_cast<_DataType>(__tmp);
+ 		}
+ 	    }
+ 	}
+ 
+       template <ranges::contiguous_range _Rg, typename... _Flags>
+ 	requires __static_sized_range<_Rg, _S_size>
+ 	  && __vectorizable<ranges::range_value_t<_Rg>>
+ 	  && __explicitly_convertible_to<ranges::range_value_t<_Rg>, value_type>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr
+ 	basic_vec(_Rg&& __range, flags<_Flags...> __flags = {})
+ 	  : basic_vec(_LoadCtorTag(), __flags.template _S_adjust_pointer<basic_vec>(
+ 					ranges::data(__range)))
+ 	{
+ 	  static_assert(__loadstore_convertible_to<ranges::range_value_t<_Rg>, value_type,
+ 						   _Flags...>);
+ 	}
+ 
+       // [simd.subscr] --------------------------------------------------------
+       /**
+        * @brief Return the value of the element at index @p __i.
+        *
+        * @pre __i >= 0 && __i < size().
+        */
+       [[__gnu__::__always_inline__]]
+       constexpr value_type
+       operator[](__simd_size_type __i) const
+       {
+ 	__glibcxx_simd_precondition(__i >= 0 && __i < _S_size, "subscript is out of bounds");
+ 	if constexpr (_S_is_scalar)
+ 	  return _M_data;
+ 	else
+ 	  return _M_data[__i];
+       }
+ 
+       // [simd.unary] unary operators -----------------------------------------
+       // increment and decrement are implemented in terms of operator+=/-= which avoids UB on
+       // padding elements while not breaking UBsan
+       [[__gnu__::__always_inline__]]
+       constexpr basic_vec&
+       operator++() noexcept requires requires(value_type __a) { ++__a; }
+       { return *this += value_type(1); }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr basic_vec
+       operator++(int) noexcept requires requires(value_type __a) { __a++; }
+       {
+ 	basic_vec __r = *this;
+ 	*this += value_type(1);
+ 	return __r;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr basic_vec&
+       operator--() noexcept requires requires(value_type __a) { --__a; }
+       { return *this -= value_type(1); }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr basic_vec
+       operator--(int) noexcept requires requires(value_type __a) { __a--; }
+       {
+ 	basic_vec __r = *this;
+ 	*this -= value_type(1);
+ 	return __r;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr mask_type
+       operator!() const noexcept requires requires(value_type __a) { !__a; }
+       { return *this == value_type(); }
+ 
+       /**
+        * @brief Unary plus operator (no-op).
+        *
+        * Returns an unchanged copy of the object.
+        */
+       [[__gnu__::__always_inline__]]
+       constexpr basic_vec
+       operator+() const noexcept requires requires(value_type __a) { +__a; }
+       { return *this; }
+ 
+       /**
+        * @brief Unary negation operator.
+        *
+        * Returns a new SIMD vector after element-wise negation.
+        */
+       [[__gnu__::__always_inline__]]
+       constexpr basic_vec
+       operator-() const noexcept requires requires(value_type __a) { -__a; }
+       { return _S_init(-_M_data); }
+ 
+       /**
+        * @brief Bitwise NOT / complement operator.
+        *
+        * Returns a new SIMD vector after element-wise complement.
+        */
+       [[__gnu__::__always_inline__]]
+       constexpr basic_vec
+       operator~() const noexcept requires requires(value_type __a) { ~__a; }
+       { return _S_init(~_M_data); }
+ 
+       // [simd.cassign] binary operators
+       /**
+        * @brief Bitwise AND operator.
+        *
+        * Returns a new SIMD vector after element-wise AND.
+        */
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_vec&
+       operator&=(basic_vec& __x, const basic_vec& __y) noexcept
+       requires requires(value_type __a) { __a & __a; }
+       {
+ 	__x._M_data &= __y._M_data;
+ 	return __x;
+       }
+ 
+       /**
+        * @brief Bitwise OR operator.
+        *
+        * Returns a new SIMD vector after element-wise OR.
+        */
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_vec&
+       operator|=(basic_vec& __x, const basic_vec& __y) noexcept
+       requires requires(value_type __a) { __a | __a; }
+       {
+ 	__x._M_data |= __y._M_data;
+ 	return __x;
+       }
+ 
+       /**
+        * @brief Bitwise XOR operator.
+        *
+        * Returns a new SIMD vector after element-wise XOR.
+        */
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_vec&
+       operator^=(basic_vec& __x, const basic_vec& __y) noexcept
+       requires requires(value_type __a) { __a ^ __a; }
+       {
+ 	__x._M_data ^= __y._M_data;
+ 	return __x;
+       }
+ 
+       /**
+        * @brief Applies the compound assignment operator element-wise.
+        *
+        * @pre If @c value_type is a signed integral type, the result is representable by @c
+        * value_type. (This does not apply to padding elements the implementation might add for
+        * non-power-of-2 widths.) UBsan will only see a call to @c unreachable() on overflow.
+        *
+        * @note The overflow detection code is discarded unless UBsan is active.
+        */
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_vec&
+       operator+=(basic_vec& __x, const basic_vec& __y) noexcept
+       requires requires(value_type __a) { __a + __a; }
+       {
+ 	if constexpr (_S_is_partial && is_integral_v<value_type> && is_signed_v<value_type>)
+ 	  { // avoid spurious UB on signed integer overflow of the padding element(s). But don't
+ 	    // remove UB of the active elements (so that UBsan can still do its job).
+ 	    //
+ 	    // This check is essentially free (at runtime) because DCE removes everything except
+ 	    // the final change to _M_data. The overflow check is only emitted if UBsan is active.
+ 	    //
+ 	    // The alternative would be to always zero padding elements after operations that can
+ 	    // produce non-zero values. However, right now:
+ 	    // - auto f(simd::mask<int, 3> k) { return +k; } is a single VPABSD and would have to
+ 	    //   sanitize
+ 	    // - bit_cast to basic_vec with non-zero padding elements is fine
+ 	    // - conversion from intrinsics can create non-zero padding elements
+ 	    // - shuffles are allowed to put whatever they want into padding elements for
+ 	    //   optimization purposes (e.g. for better instruction selection)
+ 	    using _UV = typename _Ap::template _DataType<make_unsigned_t<value_type>>;
+ 	    const _DataType __result
+ 	      = reinterpret_cast<_DataType>(reinterpret_cast<_UV>(__x._M_data)
+ 					      + reinterpret_cast<_UV>(__y._M_data));
+ 	    const auto __positive = __y > value_type();
+ 	    const auto __overflow = __positive != (__result > __x);
+ 	    if (__overflow._M_any_of())
+ 	      __builtin_unreachable(); // trigger UBsan
+ 	    __x._M_data = __result;
+ 	  }
+ 	else if constexpr (_TargetTraits()._M_eval_as_f32<value_type>())
+ 	  __x = basic_vec(rebind_t<float, basic_vec>(__x) + __y);
+ 	else
+ 	  __x._M_data += __y._M_data;
+ 	return __x;
+       }
+ 
+       /** @copydoc operator+=
+        */
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_vec&
+       operator-=(basic_vec& __x, const basic_vec& __y) noexcept
+       requires requires(value_type __a) { __a - __a; }
+       {
+ 	if constexpr (_S_is_partial && is_integral_v<value_type> && is_signed_v<value_type>)
+ 	  { // see comment on operator+=
+ 	    using _UV = typename _Ap::template _DataType<make_unsigned_t<value_type>>;
+ 	    const _DataType __result
+ 	      = reinterpret_cast<_DataType>(reinterpret_cast<_UV>(__x._M_data)
+ 					      - reinterpret_cast<_UV>(__y._M_data));
+ 	    const auto __positive = __y > value_type();
+ 	    const auto __overflow = __positive != (__result < __x);
+ 	    if (__overflow._M_any_of())
+ 	      __builtin_unreachable(); // trigger UBsan
+ 	    __x._M_data = __result;
+ 	  }
+ 	else if constexpr (_TargetTraits()._M_eval_as_f32<value_type>())
+ 	  __x = basic_vec(rebind_t<float, basic_vec>(__x) - __y);
+ 	else
+ 	  __x._M_data -= __y._M_data;
+ 	return __x;
+       }
+ 
+       /** @copydoc operator+=
+        */
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_vec&
+       operator*=(basic_vec& __x, const basic_vec& __y) noexcept
+       requires requires(value_type __a) { __a * __a; }
+       {
+ 	if constexpr (_S_is_partial && is_integral_v<value_type> && is_signed_v<value_type>)
+ 	  { // see comment on operator+=
+ 	    for (int __i = 0; __i < _S_size; ++__i)
+ 	      {
+ 		if (__builtin_mul_overflow_p(__x._M_data[__i], __y._M_data[__i], value_type()))
+ 		  __builtin_unreachable();
+ 	      }
+ 	    using _UV = typename _Ap::template _DataType<make_unsigned_t<value_type>>;
+ 	    __x._M_data = reinterpret_cast<_DataType>(reinterpret_cast<_UV>(__x._M_data)
+ 							* reinterpret_cast<_UV>(__y._M_data));
+ 	  }
+ 
+ 	// 'uint16 * uint16' promotes to int and can therefore lead to UB. The standard does not
+ 	// require to avoid the undefined behavior. It's unnecessary and easy to avoid. It's also
+ 	// unexpected because there's no UB on the vector types (which don't promote).
+ 	else if constexpr (_S_is_scalar && is_unsigned_v<value_type>
+ 			     && is_signed_v<decltype(value_type() * value_type())>)
+ 	  __x._M_data = unsigned(__x._M_data) * unsigned(__y._M_data);
+ 
+ 	else if constexpr (_TargetTraits()._M_eval_as_f32<value_type>())
+ 	  __x = basic_vec(rebind_t<float, basic_vec>(__x) * __y);
+ 
+ 	else
+ 	  __x._M_data *= __y._M_data;
+ 	return __x;
+       }
+ 
+       template <_TargetTraits _Traits = {}>
+ 	[[__gnu__::__always_inline__]]
+ 	friend constexpr basic_vec&
+ 	operator/=(basic_vec& __x, const basic_vec& __y) noexcept
+ 	requires requires(value_type __a) { __a / __a; }
+ 	{
+ 	  const basic_vec __result([&](int __i) -> value_type { return __x[__i] / __y[__i]; });
+ 	  if (__is_const_known(__result))
+ 	    // the optimizer already knows the values of the result
+ 	    return __x = __result;
+ 
+ #ifdef __SSE2__
+ 	  // x86 doesn't have integral SIMD division instructions
+ 	  // While division is faster, the required conversions are still a problem:
+ 	  // see PR121274, PR121284, and PR121296 for missed optimizations wrt. conversions
+ 	  //
+ 	  // With only 1 or 2 divisions, the conversion to and from fp is too expensive.
+ 	  if constexpr (is_integral_v<value_type> && _S_size > 2
+ 			  && __value_preserving_convertible_to<value_type, double>)
+ 	    {
+ 	      // If the denominator (y) is known to the optimizer, don't convert to fp because the
+ 	      // integral division can be translated into shifts/multiplications.
+ 	      if (!__is_const_known(__y))
+ 		{
+ 		  // With AVX512FP16 use vdivph for 8-bit integers
+ 		  if constexpr (_Traits._M_have_avx512fp16()
+ 				  && __value_preserving_convertible_to<value_type, _Float16>)
+ 		    return __x = basic_vec(rebind_t<_Float16, basic_vec>(__x) / __y);
+ 		  else if constexpr (__value_preserving_convertible_to<value_type, float>)
+ 		    return __x = basic_vec(rebind_t<float, basic_vec>(__x) / __y);
+ 		  else
+ 		    return __x = basic_vec(rebind_t<double, basic_vec>(__x) / __y);
+ 		}
+ 	    }
+ #endif
+ 	  if constexpr (_Traits._M_eval_as_f32<value_type>())
+ 	    return __x = basic_vec(rebind_t<float, basic_vec>(__x) / __y);
+ 
+ 	  basic_vec __y1 = __y;
+ 	  if constexpr (_S_is_partial)
+ 	    {
+ 	      if constexpr (is_integral_v<value_type>)
+ 		{
+ 		  // Assume integral division doesn't have SIMD instructions and must be done per
+ 		  // element anyway. Partial vectors should skip their padding elements.
+ 		  for (int __i = 0; __i < _S_size; ++__i)
+ 		    __x._M_data[__i] /= __y._M_data[__i];
+ 		  return __x;
+ 		}
+ 	      else
+ 		__y1 = __select_impl(mask_type::_S_init(mask_type::_S_implicit_mask),
+ 				     __y, basic_vec(value_type(1)));
+ 	    }
+ 	  __x._M_data /= __y1._M_data;
+ 	  return __x;
+ 	}
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_vec&
+       operator%=(basic_vec& __x, const basic_vec& __y) noexcept
+       requires requires(value_type __a) { __a % __a; }
+       {
+ 	static_assert(is_integral_v<value_type>);
+ 	if constexpr (_S_is_partial)
+ 	  {
+ 	    const basic_vec __y1 = __select_impl(mask_type::_S_init(mask_type::_S_implicit_mask),
+ 						 __y, basic_vec(value_type(1)));
+ 	    if (__is_const_known(__y1))
+ 	      __x._M_data %= __y1._M_data;
+ 	    else
+ 	      {
+ 		// Assume integral division doesn't have SIMD instructions and must be done per
+ 		// element anyway. Partial vectors should skip their padding elements.
+ 		for (int __i = 0; __i < _S_size; ++__i)
+ 		  __x._M_data[__i] %= __y._M_data[__i];
+ 	      }
+ 	  }
+ 	else
+ 	  __x._M_data %= __y._M_data;
+ 	return __x;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_vec&
+       operator<<=(basic_vec& __x, const basic_vec& __y) _GLIBCXX_SIMD_NOEXCEPT
+       requires requires(value_type __a) { __a << __a; }
+       {
+ 	__glibcxx_simd_precondition(is_unsigned_v<value_type> || all_of(__y >= value_type()),
+ 				    "negative shift is undefined behavior");
+ 	__glibcxx_simd_precondition(all_of(__y < __max_shift<value_type>),
+ 				    "too large shift invokes undefined behavior");
+ 	__x._M_data <<= __y._M_data;
+ 	return __x;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_vec&
+       operator>>=(basic_vec& __x, const basic_vec& __y) _GLIBCXX_SIMD_NOEXCEPT
+       requires requires(value_type __a) { __a >> __a; }
+       {
+ 	__glibcxx_simd_precondition(is_unsigned_v<value_type> || all_of(__y >= value_type()),
+ 				    "negative shift is undefined behavior");
+ 	__glibcxx_simd_precondition(all_of(__y < __max_shift<value_type>),
+ 				    "too large shift invokes undefined behavior");
+ 	__x._M_data >>= __y._M_data;
+ 	return __x;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_vec&
+       operator<<=(basic_vec& __x, __simd_size_type __y) _GLIBCXX_SIMD_NOEXCEPT
+       requires requires(value_type __a, __simd_size_type __b) { __a << __b; }
+       {
+ 	__glibcxx_simd_precondition(__y >= 0, "negative shift is undefined behavior");
+ 	__glibcxx_simd_precondition(__y < int(__max_shift<value_type>),
+ 				    "too large shift invokes undefined behavior");
+ 	__x._M_data <<= __y;
+ 	return __x;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_vec&
+       operator>>=(basic_vec& __x, __simd_size_type __y) _GLIBCXX_SIMD_NOEXCEPT
+       requires requires(value_type __a, __simd_size_type __b) { __a >> __b; }
+       {
+ 	__glibcxx_simd_precondition(__y >= 0, "negative shift is undefined behavior");
+ 	__glibcxx_simd_precondition(__y < int(__max_shift<value_type>),
+ 				    "too large shift invokes undefined behavior");
+ 	__x._M_data >>= __y;
+ 	return __x;
+       }
+ 
+       // [simd.comparison] ----------------------------------------------------
+ #if _GLIBCXX_X86
+       template <_X86Cmp _Cmp>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr mask_type
+ 	_M_bitmask_cmp(_DataType __y) const
+ 	{
+ 	  static_assert(_S_use_bitmask);
+ 	  if (__is_const_known(_M_data, __y))
+ 	    {
+ 	      constexpr auto [...__is] = _IotaArray<_S_size>;
+ 	      constexpr auto __cmp_op = [] [[__gnu__::__always_inline__]]
+ 					  (value_type __a, value_type __b) {
+ 		if constexpr (_Cmp == _X86Cmp::_Eq)
+ 		  return __a == __b;
+ 		else if constexpr (_Cmp == _X86Cmp::_Lt)
+ 		  return __a < __b;
+ 		else if constexpr (_Cmp == _X86Cmp::_Le)
+ 		  return __a <= __b;
+ 		else if constexpr (_Cmp == _X86Cmp::_Unord)
+ 		  return std::isunordered(__a, __b);
+ 		else if constexpr (_Cmp == _X86Cmp::_Neq)
+ 		  return __a != __b;
+ 		else if constexpr (_Cmp == _X86Cmp::_Nlt)
+ 		  return !(__a < __b);
+ 		else if constexpr (_Cmp == _X86Cmp::_Nle)
+ 		  return !(__a <= __b);
+ 		else
+ 		  static_assert(false);
+ 	      };
+ 	      const _Bitmask<_S_size> __bits
+ 		= ((__cmp_op(__vec_get(_M_data, __is), __vec_get(__y, __is))
+ 		      ? (1ULL << __is) : 0) | ...);
+ 	      return mask_type::_S_init(__bits);
+ 	    }
+ 	  else
+ 	    return mask_type::_S_init(__x86_bitmask_cmp<_Cmp>(_M_data, __y));
+ 	}
+ #endif
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr mask_type
+       operator==(const basic_vec& __x, const basic_vec& __y) noexcept
+       {
+ #if _GLIBCXX_X86
+ 	if constexpr (_S_use_bitmask)
+ 	  return __x._M_bitmask_cmp<_X86Cmp::_Eq>(__y._M_data);
+ 	else
+ #endif
+ 	  return mask_type::_S_init(__x._M_data == __y._M_data);
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr mask_type
+       operator!=(const basic_vec& __x, const basic_vec& __y) noexcept
+       {
+ #if _GLIBCXX_X86
+ 	if constexpr (_S_use_bitmask)
+ 	  return __x._M_bitmask_cmp<_X86Cmp::_Neq>(__y._M_data);
+ 	else
+ #endif
+ 	  return mask_type::_S_init(__x._M_data != __y._M_data);
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr mask_type
+       operator<(const basic_vec& __x, const basic_vec& __y) noexcept
+       {
+ #if _GLIBCXX_X86
+ 	if constexpr (_S_use_bitmask)
+ 	  return __x._M_bitmask_cmp<_X86Cmp::_Lt>(__y._M_data);
+ 	else
+ #endif
+ 	  return mask_type::_S_init(__x._M_data < __y._M_data);
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr mask_type
+       operator<=(const basic_vec& __x, const basic_vec& __y) noexcept
+       {
+ #if _GLIBCXX_X86
+ 	if constexpr (_S_use_bitmask)
+ 	  return __x._M_bitmask_cmp<_X86Cmp::_Le>(__y._M_data);
+ 	else
+ #endif
+ 	  return mask_type::_S_init(__x._M_data <= __y._M_data);
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr mask_type
+       operator>(const basic_vec& __x, const basic_vec& __y) noexcept
+       { return __y < __x; }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr mask_type
+       operator>=(const basic_vec& __x, const basic_vec& __y) noexcept
+       { return __y <= __x; }
+ 
+       // [simd.cond] ---------------------------------------------------------
+       template <_TargetTraits _Traits = {}>
+ 	[[__gnu__::__always_inline__]]
+ 	friend constexpr basic_vec
+ 	__select_impl(const mask_type& __k, const basic_vec& __t, const basic_vec& __f) noexcept
+ 	{
+ 	  if constexpr (_S_size == 1)
+ 	    return __k[0] ? __t : __f;
+ 	  else if constexpr (_S_use_bitmask)
+ 	    {
+ #if _GLIBCXX_X86
+ 	      if (__is_const_known(__k, __t, __f))
+ 		return basic_vec([&](int __i) { return __k[__i] ? __t[__i] : __f[__i]; });
+ 	      else
+ 		return __x86_bitmask_blend(__k._M_data, __t._M_data, __f._M_data);
+ #else
+ 	      static_assert(false, "TODO");
+ #endif
+ 	    }
+ 	  else if consteval
+ 	    {
+ 	      return __k._M_data ? __t._M_data : __f._M_data;
+ 	    }
+ 	  else
+ 	    {
+ 	      constexpr bool __uses_simd_register = sizeof(_M_data) >= 8;
+ 	      using _VO = _VecOps<_DataType>;
+ 	      if (_VO::_S_is_const_known_equal_to(__f._M_data, 0))
+ 		{
+ 		  if (is_integral_v<value_type> && __uses_simd_register
+ 			&& _VO::_S_is_const_known_equal_to(__t._M_data, 1))
+ 		    // This is equivalent to converting the mask into a vec of 0s and 1s. So +__k.
+ 		    // However, basic_mask::operator+ arrives here; returning +__k would be
+ 		    // recursive. Instead we use -__k (which is a no-op for vector-masks) and then
+ 		    // flip all -1 elements to +1 by taking the absolute value.
+ 		    return basic_vec((-__k)._M_abs());
+ 		  else
+ 		    return __vec_and(reinterpret_cast<_DataType>(__k._M_data), __t._M_data);
+ 		}
+ 	      else if (_VecOps<_DataType>::_S_is_const_known_equal_to(__t._M_data, 0))
+ 		{
+ 		  if (is_integral_v<value_type> && __uses_simd_register
+ 			&& _VO::_S_is_const_known_equal_to(__f._M_data, 1))
+ 		    return value_type(1) + basic_vec(-__k);
+ 		  else
+ 		    return __vec_and(reinterpret_cast<_DataType>(__vec_not(__k._M_data)), __f._M_data);
+ 		}
+ 	      else
+ 		{
+ #if _GLIBCXX_X86
+ 		  // this works around bad code-gen when the compiler can't see that __k is a vector-mask.
+ 		  // This pattern, is recognized to match the x86 blend instructions, which only consider
+ 		  // the sign bit of the mask register. Also, without SSE4, if the compiler knows that __k
+ 		  // is a vector-mask, then the '< 0' is elided.
+ 		  return __k._M_data < 0 ? __t._M_data : __f._M_data;
+ #endif
+ 		  return __k._M_data ? __t._M_data : __f._M_data;
+ 		}
+ 	    }
+ 	}
+     };
+ 
+   template <__vectorizable _Tp, __abi_tag _Ap>
+     requires (_Ap::_S_nreg > 1)
+     class basic_vec<_Tp, _Ap>
+     : public _VecBase<_Tp, _Ap>
+     {
+       template <typename, typename>
+ 	friend class basic_vec;
+ 
+       template <size_t, typename>
+ 	friend class basic_mask;
+ 
+       static constexpr int _S_size = _Ap::_S_size;
+ 
+       static constexpr int _N0 = __bit_ceil(unsigned(_S_size)) / 2;
+ 
+       static constexpr int _N1 = _S_size - _N0;
+ 
+       using _DataType0 = __similar_vec<_Tp, _N0, _Ap>;
+ 
+       // the implementation (and users) depend on elements being contiguous in memory
+       static_assert(_N0 * sizeof(_Tp) == sizeof(_DataType0));
+ 
+       using _DataType1 = __similar_vec<_Tp, _N1, _Ap>;
+ 
+       static_assert(_DataType0::abi_type::_S_nreg + _DataType1::abi_type::_S_nreg == _Ap::_S_nreg);
+ 
+       static constexpr bool _S_is_scalar = _DataType0::_S_is_scalar;
+ 
+       _DataType0 _M_data0;
+ 
+       _DataType1 _M_data1;
+ 
+       static constexpr bool _S_use_bitmask = _Ap::_S_is_bitmask;
+ 
+       static constexpr bool _S_is_partial = _DataType1::_S_is_partial;
+ 
+     public:
+       using value_type = _Tp;
+ 
+       using mask_type = _VecBase<_Tp, _Ap>::mask_type;
+ 
+       [[__gnu__::__always_inline__]]
+       static constexpr basic_vec
+       _S_init(const _DataType0& __x, const _DataType1& __y)
+       {
+ 	basic_vec __r;
+ 	__r._M_data0 = __x;
+ 	__r._M_data1 = __y;
+ 	return __r;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr const _DataType0&
+       _M_get_low() const
+       { return _M_data0; }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr const _DataType1&
+       _M_get_high() const
+       { return _M_data1; }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr bool
+       __is_const_known(const basic_vec& __x)
+       { return __is_const_known(__x._M_data0) && __is_const_known(__x._M_data1); }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr auto
+       _M_concat_data([[maybe_unused]] bool __do_sanitize = false) const
+       {
+ 	return __vec_concat(_M_data0._M_concat_data(false),
+ 			    __vec_zero_pad_to<sizeof(_M_data0)>(
+ 			      _M_data1._M_concat_data(__do_sanitize)));
+       }
+ 
+       template <int _Size = _S_size, int _Offset = 0, typename _A0, typename _Fp>
+ 	[[__gnu__::__always_inline__]]
+ 	static constexpr basic_vec
+ 	_S_static_permute(const basic_vec<value_type, _A0>& __x, _Fp&& __idxmap)
+ 	{
+ 	  return _S_init(
+ 		   _DataType0::template _S_static_permute<_Size, _Offset>(__x, __idxmap),
+ 		   _DataType1::template _S_static_permute<_Size, _Offset + _N0>(__x, __idxmap));
+ 	}
+ 
+       template <typename _Vp>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr auto
+ 	_M_chunk() const noexcept
+ 	{
+ 	  constexpr int __n = _S_size / _Vp::_S_size;
+ 	  constexpr int __rem = _S_size % _Vp::_S_size;
+ 	  constexpr auto [...__is] = _IotaArray<__n>;
+ 	  if constexpr (__rem == 0)
+ 	    return array<_Vp, __n>{__extract_simd_at<_Vp>(cw<_Vp::_S_size * __is>,
+ 							    _M_data0, _M_data1)...};
+ 	  else
+ 	    {
+ 	      using _Rest = resize_t<__rem, _Vp>;
+ 	      return tuple(__extract_simd_at<_Vp>(cw<_Vp::_S_size * __is>, _M_data0, _M_data1)...,
+ 			   __extract_simd_at<_Rest>(cw<_Vp::_S_size * __n>, _M_data0, _M_data1));
+ 	    }
+ 	}
+ 
+       [[__gnu__::__always_inline__]]
+       static constexpr const basic_vec&
+       _S_concat(const basic_vec& __x0) noexcept
+       { return __x0; }
+ 
+       template <typename... _As>
+ 	requires (sizeof...(_As) >= 2)
+ 	[[__gnu__::__always_inline__]]
+ 	static constexpr basic_vec
+ 	_S_concat(const basic_vec<value_type, _As>&... __xs) noexcept
+ 	{
+ 	  static_assert(_S_size == (_As::_S_size + ...));
+ 	  return _S_init(__extract_simd_at<_DataType0>(cw<0>, __xs...),
+ 			 __extract_simd_at<_DataType1>(cw<_N0>, __xs...));
+ 	}
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr auto
+       _M_reduce_to_half(auto __binary_op) const requires (_N0 == _N1)
+       { return __binary_op(_M_data0, _M_data1); }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr value_type
+       _M_reduce_tail(const auto& __rest, auto __binary_op) const
+       {
+ 	if constexpr (__rest.size() > _S_size)
+ 	  {
+ 	    auto [__a, __b] = __rest.template _M_chunk<basic_vec>();
+ 	    return __binary_op(*this, __a)._M_reduce_tail(__b, __binary_op);
+ 	  }
+ 	else if constexpr (__rest.size() == _S_size)
+ 	  return __binary_op(*this, __rest)._M_reduce(__binary_op);
+ 	else
+ 	  return _M_reduce_to_half(__binary_op)._M_reduce_tail(__rest, __binary_op);
+       }
+ 
+       template <typename _BinaryOp, _TargetTraits _Traits = {}>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr value_type
+ 	_M_reduce(_BinaryOp __binary_op) const
+ 	{
+ 	  if constexpr (_Traits.template _M_eval_as_f32<value_type>()
+ 			  && (is_same_v<_BinaryOp, plus<>>
+ 				 || is_same_v<_BinaryOp, multiplies<>>))
+ 	    return value_type(rebind_t<float, basic_vec>(*this)._M_reduce(__binary_op));
+ #ifdef __SSE2__
+ 	  else if constexpr (is_integral_v<value_type> && sizeof(value_type) == 1
+ 			       && is_same_v<decltype(__binary_op), multiplies<>>)
+ 	    {
+ 	      // convert to unsigned short because of missing 8-bit mul instruction
+ 	      // we don't need to preserve the order of elements
+ 	      //
+ 	      // The left columns under Latency and Throughput show bit-cast to ushort with shift by
+ 	      // 8. The right column uses the alternative in the else branch.
+ 	      // Benchmark on Intel Ultra 7 165U (AVX2)
+ 	      //   TYPE             Latency           Throughput
+ 	      //              [cycles/call]        [cycles/call]
+ 	      //schar, 64        59.9  70.7           10.5  13.3
+ 	      //schar, 128       81.4  97.2           12.2    21
+ 	      //schar, 256       92.4   129           17.2  35.2
+ 	      if constexpr (_DataType1::_S_is_scalar)
+ 		return __binary_op(_DataType1(_M_data0._M_reduce(__binary_op)), _M_data1)[0];
+ 	      // TODO: optimize trailing scalar (e.g. (8+8)+(8+1))
+ 	      else if constexpr (_S_size % 2 == 0)
+ 		{ // If all elements participate in the reduction we can take this shortcut
+ 		  using _V16 = resize_t<_S_size / 2, rebind_t<unsigned short, basic_vec>>;
+ 		  auto __a = __builtin_bit_cast(_V16, *this);
+ 		  return __binary_op(__a, __a >> __CHAR_BIT__)._M_reduce(__binary_op);
+ 		}
+ 	      else
+ 		{
+ 		  using _V16 = rebind_t<unsigned short, basic_vec>;
+ 		  return _V16(*this)._M_reduce(__binary_op);
+ 		}
+ 	    }
+ #endif
+ 	  else
+ 	    return _M_data0._M_reduce_tail(_M_data1, __binary_op);
+ 	}
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr mask_type
+       _M_isnan() const requires is_floating_point_v<value_type>
+       { return mask_type::_S_init(_M_data0._M_isnan(), _M_data1._M_isnan()); }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr mask_type
+       _M_isinf() const requires is_floating_point_v<value_type>
+       { return mask_type::_S_init(_M_data0._M_isinf(), _M_data1._M_isinf()); }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr mask_type
+       _M_isunordered(basic_vec __y) const requires is_floating_point_v<value_type>
+       {
+ 	return mask_type::_S_init(_M_data0._M_isunordered(__y._M_data0),
+ 				  _M_data1._M_isunordered(__y._M_data1));
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr basic_vec
+       _M_abs() const requires signed_integral<value_type>
+       { return _S_init(_M_data0._M_abs(), _M_data1._M_abs()); }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr basic_vec
+       _M_fabs() const requires floating_point<value_type>
+       { return _S_init(_M_data0._M_fabs(), _M_data1._M_fabs()); }
+ 
+       template <typename _Up>
+ 	[[__gnu__::__always_inline__]]
+ 	static inline basic_vec
+ 	_S_partial_load(const _Up* __mem, size_t __n)
+ 	{
+ 	  if (__n >= _N0)
+ 	    return _S_init(_DataType0(_LoadCtorTag(), __mem),
+ 			   _DataType1::_S_partial_load(__mem + _N0, __n - _N0));
+ 	  else
+ 	    return _S_init(_DataType0::_S_partial_load(__mem, __n),
+ 			   _DataType1());
+ 	}
+ 
+       template <typename _Up, _ArchTraits _Traits = {}>
+ 	static inline basic_vec
+ 	_S_masked_load(const _Up* __mem, mask_type __k)
+ 	{
+ 	  return _S_init(_DataType0::_S_masked_load(__mem, __k._M_data0),
+ 			 _DataType1::_S_masked_load(__mem + _N0, __k._M_data1));
+ 	}
+ 
+       template <typename _Up>
+ 	[[__gnu__::__always_inline__]]
+ 	inline void
+ 	_M_store(_Up* __mem) const
+ 	{
+ 	  _M_data0._M_store(__mem);
+ 	  _M_data1._M_store(__mem + _N0);
+ 	}
+ 
+       template <typename _Up>
+ 	[[__gnu__::__always_inline__]]
+ 	static inline void
+ 	_S_partial_store(const basic_vec& __v, _Up* __mem, size_t __n)
+ 	{
+ 	  if (__n >= _N0)
+ 	    {
+ 	      __v._M_data0._M_store(__mem);
+ 	      _DataType1::_S_partial_store(__v._M_data1, __mem + _N0, __n - _N0);
+ 	    }
+ 	  else
+ 	    {
+ 	      _DataType0::_S_partial_store(__v._M_data0, __mem, __n);
+ 	    }
+ 	}
+ 
+       template <typename _Up>
+ 	[[__gnu__::__always_inline__]]
+ 	static inline void
+ 	_S_masked_store(const basic_vec& __v, _Up* __mem, const mask_type& __k)
+ 	{
+ 	  _DataType0::_S_masked_store(__v._M_data0, __mem, __k._M_data0);
+ 	  _DataType1::_S_masked_store(__v._M_data1, __mem + _N0, __k._M_data1);
+ 	}
+ 
+       basic_vec() = default;
+ 
+       // [simd.overview] p2 impl-def conversions ------------------------------
+       using _NativeVecType = __vec_builtin_type<value_type, __bit_ceil(unsigned(_S_size))>;
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr
+       basic_vec(const _NativeVecType& __x)
+       : _M_data0(_VecOps<__vec_builtin_type<value_type, _N0>>::_S_extract(__x)),
+ 	_M_data1(_VecOps<__vec_builtin_type<value_type, __bit_ceil(unsigned(_N1))>>
+ 		   ::_S_extract(__x, integral_constant<int, _N0>()))
+       {}
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr
+       operator _NativeVecType() const
+       { return _M_concat_data(); }
+ 
+       // [simd.ctor] broadcast constructor ------------------------------------
+       template <__explicitly_convertible_to<value_type> _Up>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr explicit(!__broadcast_constructible<_Up, value_type>)
+ 	basic_vec(_Up&& __x) noexcept
+ 	  : _M_data0(static_cast<value_type>(__x)), _M_data1(static_cast<value_type>(__x))
+ 	{}
+ 
+       template <__simd_vec_bcast_consteval<value_type> _Up>
+ 	consteval
+ 	basic_vec(_Up&& __x)
+ 	: _M_data0(__value_preserving_cast<value_type>(__x)),
+ 	  _M_data1(__value_preserving_cast<value_type>(__x))
+ 	{}
+ 
+       // [simd.ctor] conversion constructor -----------------------------------
+       template <typename _Up, typename _UAbi>
+ 	requires (_S_size == _UAbi::_S_size)
+ 	  && __explicitly_convertible_to<_Up, value_type>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr
+ 	explicit(!__value_preserving_convertible_to<_Up, value_type>
+ 		   || __higher_rank_than<_Up, value_type>)
+ 	basic_vec(const basic_vec<_Up, _UAbi>& __x) noexcept
+ 	  : _M_data0(get<0>(chunk<_N0>(__x))),
+ 	    _M_data1(get<1>(chunk<_N0>(__x)))
+ 	{}
+ 
+       using _VecBase<_Tp, _Ap>::_VecBase;
+ 
+       // [simd.ctor] generator constructor ------------------------------------
+       template <__simd_generator_invokable<value_type, _S_size> _Fp>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr explicit
+ 	basic_vec(_Fp&& __gen)
+ 	  : _M_data0(__gen), _M_data1([&] [[__gnu__::__always_inline__]] (auto __i) {
+ 			       return __gen(__simd_size_c<__i + _N0>);
+ 			     })
+ 	{}
+ 
+       // [simd.ctor] load constructor -----------------------------------------
+       template <typename _Up>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr
+ 	basic_vec(_LoadCtorTag, const _Up* __ptr)
+ 	  : _M_data0(_LoadCtorTag(), __ptr),
+ 	    _M_data1(_LoadCtorTag(), __ptr + _N0)
+ 	{}
+ 
+       template <ranges::contiguous_range _Rg, typename... _Flags>
+ 	requires __static_sized_range<_Rg, _S_size>
+ 	  && __vectorizable<ranges::range_value_t<_Rg>>
+ 	  && __explicitly_convertible_to<ranges::range_value_t<_Rg>, value_type>
+ 	constexpr
+ 	basic_vec(_Rg&& __range, flags<_Flags...> __flags = {})
+ 	: basic_vec(_LoadCtorTag(),
+ 		    __flags.template _S_adjust_pointer<basic_vec>(ranges::data(__range)))
+ 	{
+ 	  static_assert(__loadstore_convertible_to<ranges::range_value_t<_Rg>, value_type,
+ 						   _Flags...>);
+ 	}
+ 
+       // [simd.subscr] --------------------------------------------------------
+       [[__gnu__::__always_inline__]]
+       constexpr value_type
+       operator[](__simd_size_type __i) const
+       {
+ 	__glibcxx_simd_precondition(__i >= 0 && __i < _S_size, "subscript is out of bounds");
+ 	if (__is_const_known(__i))
+ 	  return __i < _N0 ? _M_data0[__i] : _M_data1[__i - _N0];
+ 	else
+ 	  {
+ 	    using _AliasingT [[__gnu__::__may_alias__]] = value_type;
+ 	    return reinterpret_cast<const _AliasingT*>(this)[__i];
+ 	  }
+       }
+ 
+       // [simd.unary] unary operators -----------------------------------------
+       [[__gnu__::__always_inline__]]
+       constexpr basic_vec&
+       operator++() noexcept requires requires(value_type __a) { ++__a; }
+       {
+ 	++_M_data0;
+ 	++_M_data1;
+ 	return *this;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr basic_vec
+       operator++(int) noexcept requires requires(value_type __a) { __a++; }
+       {
+ 	basic_vec __r = *this;
+ 	++_M_data0;
+ 	++_M_data1;
+ 	return __r;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr basic_vec&
+       operator--() noexcept requires requires(value_type __a) { --__a; }
+       {
+ 	--_M_data0;
+ 	--_M_data1;
+ 	return *this;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr basic_vec
+       operator--(int) noexcept requires requires(value_type __a) { __a--; }
+       {
+ 	basic_vec __r = *this;
+ 	--_M_data0;
+ 	--_M_data1;
+ 	return __r;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr mask_type
+       operator!() const noexcept requires requires(value_type __a) { !__a; }
+       { return mask_type::_S_init(!_M_data0, !_M_data1); }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr basic_vec
+       operator+() const noexcept requires requires(value_type __a) { +__a; }
+       { return *this; }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr basic_vec
+       operator-() const noexcept requires requires(value_type __a) { -__a; }
+       { return _S_init(-_M_data0, -_M_data1); }
+ 
+       [[__gnu__::__always_inline__]]
+       constexpr basic_vec
+       operator~() const noexcept requires requires(value_type __a) { ~__a; }
+       { return _S_init(~_M_data0, ~_M_data1); }
+ 
+       // [simd.cassign] -------------------------------------------------------
+ #define _GLIBCXX_SIMD_DEFINE_OP(sym)                                 \
+       [[__gnu__::__always_inline__]]                                 \
+       friend constexpr basic_vec&                                    \
+       operator sym##=(basic_vec& __x, const basic_vec& __y) _GLIBCXX_SIMD_NOEXCEPT \
+       {                                                              \
+ 	__x._M_data0 sym##= __y._M_data0;                            \
+ 	__x._M_data1 sym##= __y._M_data1;                            \
+ 	return __x;                                                  \
+       }
+ 
+       _GLIBCXX_SIMD_DEFINE_OP(+)
+       _GLIBCXX_SIMD_DEFINE_OP(-)
+       _GLIBCXX_SIMD_DEFINE_OP(*)
+       _GLIBCXX_SIMD_DEFINE_OP(/)
+       _GLIBCXX_SIMD_DEFINE_OP(%)
+       _GLIBCXX_SIMD_DEFINE_OP(&)
+       _GLIBCXX_SIMD_DEFINE_OP(|)
+       _GLIBCXX_SIMD_DEFINE_OP(^)
+       _GLIBCXX_SIMD_DEFINE_OP(<<)
+       _GLIBCXX_SIMD_DEFINE_OP(>>)
+ 
+ #undef _GLIBCXX_SIMD_DEFINE_OP
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_vec&
+       operator<<=(basic_vec& __x, __simd_size_type __y) _GLIBCXX_SIMD_NOEXCEPT
+       requires requires(value_type __a, __simd_size_type __b) { __a << __b; }
+       {
+ 	__x._M_data0 <<= __y;
+ 	__x._M_data1 <<= __y;
+ 	return __x;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_vec&
+       operator>>=(basic_vec& __x, __simd_size_type __y) _GLIBCXX_SIMD_NOEXCEPT
+       requires requires(value_type __a, __simd_size_type __b) { __a >> __b; }
+       {
+ 	__x._M_data0 >>= __y;
+ 	__x._M_data1 >>= __y;
+ 	return __x;
+       }
+ 
+       // [simd.comparison] ----------------------------------------------------
+       [[__gnu__::__always_inline__]]
+       friend constexpr mask_type
+       operator==(const basic_vec& __x, const basic_vec& __y) noexcept
+       { return mask_type::_S_init(__x._M_data0 == __y._M_data0, __x._M_data1 == __y._M_data1); }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr mask_type
+       operator!=(const basic_vec& __x, const basic_vec& __y) noexcept
+       { return mask_type::_S_init(__x._M_data0 != __y._M_data0, __x._M_data1 != __y._M_data1); }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr mask_type
+       operator<(const basic_vec& __x, const basic_vec& __y) noexcept
+       { return mask_type::_S_init(__x._M_data0 < __y._M_data0, __x._M_data1 < __y._M_data1); }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr mask_type
+       operator<=(const basic_vec& __x, const basic_vec& __y) noexcept
+       { return mask_type::_S_init(__x._M_data0 <= __y._M_data0, __x._M_data1 <= __y._M_data1); }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr mask_type
+       operator>(const basic_vec& __x, const basic_vec& __y) noexcept
+       { return mask_type::_S_init(__x._M_data0 > __y._M_data0, __x._M_data1 > __y._M_data1); }
+ 
+       [[__gnu__::__always_inline__]]
+       friend constexpr mask_type
+       operator>=(const basic_vec& __x, const basic_vec& __y) noexcept
+       { return mask_type::_S_init(__x._M_data0 >= __y._M_data0, __x._M_data1 >= __y._M_data1); }
+ 
+       // [simd.cond] ---------------------------------------------------------
+       [[__gnu__::__always_inline__]]
+       friend constexpr basic_vec
+       __select_impl(const mask_type& __k, const basic_vec& __t, const basic_vec& __f) noexcept
+       {
+ 	return _S_init(__select_impl(__k._M_data0, __t._M_data0, __f._M_data0),
+ 		       __select_impl(__k._M_data1, __t._M_data1, __f._M_data1));
+       }
+     };
+ 
+   // [simd.overview] deduction guide ------------------------------------------
+   template <ranges::contiguous_range _Rg, typename... _Ts>
+     requires __static_sized_range<_Rg>
+     basic_vec(_Rg&& __r, _Ts...)
+     -> basic_vec<ranges::range_value_t<_Rg>,
+ 		 __deduce_abi_t<ranges::range_value_t<_Rg>,
+ #if 0 // PR117849
+ 				ranges::size(__r)>>;
+ #else
+ 				decltype(std::span(__r))::extent>>;
+ #endif
+ 
+   template <size_t _Bytes, typename _Ap>
+     basic_vec(basic_mask<_Bytes, _Ap>)
+     -> basic_vec<__integer_from<_Bytes>,
+ 		 decltype(__abi_rebind<__integer_from<_Bytes>, basic_mask<_Bytes, _Ap>::size.value,
+ 				       _Ap>())>;
+ 
+   // [P3319R5] ----------------------------------------------------------------
+   template <__vectorizable _Tp>
+     requires is_arithmetic_v<_Tp>
+     inline constexpr _Tp
+     __iota<_Tp> = _Tp();
+ 
+   template <typename _Tp, typename _Ap>
+     inline constexpr basic_vec<_Tp, _Ap>
+     __iota<basic_vec<_Tp, _Ap>> = basic_vec<_Tp, _Ap>([](_Tp __i) -> _Tp {
+       static_assert(_Ap::_S_size - 1 <= numeric_limits<_Tp>::max(),
+ 		    "iota object would overflow");
+       return __i;
+     });
+ } // namespace simd
+ _GLIBCXX_END_NAMESPACE_VERSION
+ } // namespace std
+ 
+ #pragma GCC diagnostic pop
+ #endif // C++26
+ #endif // _GLIBCXX_SIMD_VEC_H
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/simd_x86.h gcc-16-20260322/libstdc++-v3/include/bits/simd_x86.h
*** gcc-16-20260315/libstdc++-v3/include/bits/simd_x86.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/include/bits/simd_x86.h	Sun Mar 22 22:32:15 2026
***************
*** 0 ****
--- 1,1413 ----
+ // Implementation of <simd> -*- C++ -*-
+ 
+ // Copyright The GNU Toolchain Authors.
+ //
+ // 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/>.
+ 
+ #ifndef _GLIBCXX_SIMD_X86_H
+ #define _GLIBCXX_SIMD_X86_H 1
+ 
+ #ifdef _GLIBCXX_SYSHDR
+ #pragma GCC system_header
+ #endif
+ 
+ #if __cplusplus >= 202400L
+ 
+ #include "vec_ops.h"
+ 
+ #if !_GLIBCXX_X86
+ #error "wrong include for this target"
+ #endif
+ 
+ #pragma GCC push_options
+ // ensure GCC knows about the __builtin_ia32_* calls
+ #pragma GCC target("avx2,bmi,bmi2,avx512vl,avx512bw,avx512dq,avx10.2")
+ #pragma GCC pop_options
+ 
+ // psabi warnings are bogus because the ABI of the internal types never leaks into user code
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wpsabi"
+ 
+ namespace std _GLIBCXX_VISIBILITY(default)
+ {
+ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ namespace simd
+ {
+   static constexpr size_t __x86_max_general_register_size
+ #ifdef __x86_64__
+     = 8;
+ #else
+     = 4;
+ #endif
+ 
+   /** @internal
+    * Return a bit-mask for the given vector-mask.
+    *
+    * Caveats:
+    * 1. The bit-mask of 2-Byte vector-masks has duplicated entries (because of missing instruction)
+    * 2. The return type internally is 'int', but that fails on conversion to uint64 if the MSB of a
+    * YMM 1/2-Byte vector-mask is set (sign extension). Therefore these helper functions return
+    * unsigned instead.
+    * 3. ZMM inputs are not supported.
+    */
+   [[__gnu__::__always_inline__]]
+   inline unsigned
+   __x86_movmsk(__vec_builtin_type_bytes<__integer_from<8>, 16> __x)
+   { return __builtin_ia32_movmskpd(__vec_bit_cast<double>(__x)); }
+ 
+   [[__gnu__::__always_inline__]]
+   inline unsigned
+   __x86_movmsk(__vec_builtin_type_bytes<__integer_from<8>, 32> __x)
+   { return __builtin_ia32_movmskpd256(__vec_bit_cast<double>(__x)); }
+ 
+   [[__gnu__::__always_inline__]]
+   inline unsigned
+   __x86_movmsk(__vec_builtin_type_bytes<__integer_from<4>, 16> __x)
+   { return __builtin_ia32_movmskps(__vec_bit_cast<float>(__x)); }
+ 
+   template <_ArchTraits _Traits = {}>
+     [[__gnu__::__always_inline__]]
+     inline _Bitmask<8>
+     __x86_movmsk(__vec_builtin_type_bytes<__integer_from<4>, 8> __x)
+     {
+ #if __has_builtin(__builtin_ia32_pext_di)
+       if constexpr (_Traits._M_have_bmi2())
+ 	return _Bitmask<8>(__builtin_ia32_pext_di(
+ 			     __builtin_bit_cast(unsigned long long, __x),
+ 			     0x80000000'80000000ULL));
+ #endif
+       return _Bitmask<8>(__x86_movmsk(__vec_zero_pad_to_16(__x)));
+     }
+ 
+   [[__gnu__::__always_inline__]]
+   inline unsigned
+   __x86_movmsk(__vec_builtin_type_bytes<__integer_from<4>, 32> __x)
+   { return __builtin_ia32_movmskps256(__vec_bit_cast<float>(__x)); }
+ 
+   template <__vec_builtin _TV, auto _Traits = _ArchTraits()>
+     requires (sizeof(__vec_value_type<_TV>) <= 2)
+     [[__gnu__::__always_inline__]]
+     inline unsigned
+     __x86_movmsk(_TV __x)
+     {
+       static_assert(__width_of<_TV> > 1);
+       if constexpr (sizeof(__x) == 32)
+ 	return __builtin_ia32_pmovmskb256(__vec_bit_cast<char>(__x));
+       else if constexpr (sizeof(__x) == 16)
+ 	return __builtin_ia32_pmovmskb128(__vec_bit_cast<char>(__x));
+       else if constexpr (sizeof(__x) == 8)
+ 	{
+ #if __has_builtin(__builtin_ia32_pext_di)
+ 	  if constexpr (_Traits._M_have_bmi2())
+ 	    return __builtin_ia32_pext_di(__builtin_bit_cast(unsigned long long, __x),
+ 					  0x8080'8080'8080'8080ULL);
+ #endif
+ 	  return __x86_movmsk(__vec_zero_pad_to_16(__x));
+ 	}
+       else if constexpr (sizeof(__x) == 4)
+ 	{
+ #if __has_builtin(__builtin_ia32_pext_si)
+ 	  if constexpr (_Traits._M_have_bmi2())
+ 	    return __builtin_ia32_pext_si(__builtin_bit_cast(unsigned int, __x), 0x80808080u);
+ #endif
+ 	  return __x86_movmsk(__vec_zero_pad_to_16(__x));
+ 	}
+       else if constexpr (sizeof(__x) == 2)
+ 	{
+ 	  auto __bits = __builtin_bit_cast(unsigned short, __x);
+ #if __has_builtin(__builtin_ia32_pext_si)
+ 	  if constexpr (_Traits._M_have_bmi2())
+ 	    return __builtin_ia32_pext_si(__bits, 0x00008080u);
+ #endif
+ 	  return ((__bits >> 7) & 1) | ((__bits & 0x8000) >> 14);
+ 	}
+       else
+ 	static_assert(false);
+     }
+ 
+   template <__vec_builtin _TV, _ArchTraits _Traits = {}>
+     [[__gnu__::__always_inline__]]
+     inline bool
+     __x86_vec_is_zero(_TV __a)
+     {
+       using _Tp = __vec_value_type<_TV>;
+       static_assert(is_integral_v<_Tp>);
+       if constexpr (sizeof(_TV) <= __x86_max_general_register_size)
+ 	return __builtin_bit_cast(__integer_from<sizeof(_TV)>, __a) == 0;
+       else if constexpr (_Traits._M_have_avx())
+ 	{
+ 	  if constexpr (sizeof(_TV) == 32)
+ 	    return __builtin_ia32_ptestz256(__vec_bit_cast<long long>(__a),
+ 					    __vec_bit_cast<long long>(__a));
+ 	  else if constexpr (sizeof(_TV) == 16)
+ 	    return __builtin_ia32_ptestz128(__vec_bit_cast<long long>(__a),
+ 					    __vec_bit_cast<long long>(__a));
+ 	  else if constexpr (sizeof(_TV) < 16)
+ 	    return __x86_vec_is_zero(__vec_zero_pad_to_16(__a));
+ 	  else
+ 	    static_assert(false);
+ 	}
+       else if constexpr (_Traits._M_have_sse4_1())
+ 	{
+ 	  if constexpr (sizeof(_TV) == 16)
+ 	    return __builtin_ia32_ptestz128(__vec_bit_cast<long long>(__a),
+ 					    __vec_bit_cast<long long>(__a));
+ 	  else if constexpr (sizeof(_TV) < 16)
+ 	    return __x86_vec_is_zero(__vec_zero_pad_to_16(__a));
+ 	  else
+ 	    static_assert(false);
+ 	}
+       else
+ 	return __x86_movmsk(__a) == 0;
+     }
+ 
+   template <__vec_builtin _TV, _ArchTraits _Traits = {}>
+     [[__gnu__::__always_inline__]]
+     inline int
+     __x86_vec_testz(_TV __a, _TV __b)
+     {
+       static_assert(sizeof(_TV) == 16 || sizeof(_TV) == 32);
+       static_assert(_Traits._M_have_sse4_1());
+       if constexpr (sizeof(_TV) == 32)
+ 	return __builtin_ia32_ptestz256(__vec_bit_cast<long long>(__a),
+ 					__vec_bit_cast<long long>(__b));
+       else
+ 	return __builtin_ia32_ptestz128(__vec_bit_cast<long long>(__a),
+ 					__vec_bit_cast<long long>(__b));
+     }
+ 
+   template <__vec_builtin _TV, _ArchTraits _Traits = {}>
+     [[__gnu__::__always_inline__]]
+     inline int
+     __x86_vec_testc(_TV __a, _TV __b)
+     {
+       static_assert(sizeof(_TV) == 16 || sizeof(_TV) == 32);
+       static_assert(_Traits._M_have_sse4_1());
+       if constexpr (sizeof(_TV) == 32)
+ 	return __builtin_ia32_ptestc256(__vec_bit_cast<long long>(__a),
+ 					__vec_bit_cast<long long>(__b));
+       else
+ 	return __builtin_ia32_ptestc128(__vec_bit_cast<long long>(__a),
+ 					__vec_bit_cast<long long>(__b));
+     }
+ 
+   template <int _Np, __vec_builtin _TV, _ArchTraits _Traits = {}>
+     [[__gnu__::__always_inline__]]
+     inline bool
+     __x86_vecmask_all(_TV __k)
+     {
+       using _Tp = __vec_value_type<_TV>;
+       static_assert(is_integral_v<_Tp> && is_signed_v<_Tp>);
+       constexpr int __width = __width_of<_TV>;
+       static_assert(sizeof(__k) <= 32);
+       if constexpr (_Np == __width)
+ 	{
+ 	  if constexpr (sizeof(__k) <= __x86_max_general_register_size)
+ 	    {
+ 	      using _Ip = __integer_from<sizeof(__k)>;
+ 	      return __builtin_bit_cast(_Ip, __k) == ~_Ip();
+ 	    }
+ 	  else if constexpr (!_Traits._M_have_sse4_1())
+ 	    {
+ 	      constexpr unsigned __valid_bits = (1u << (sizeof(_Tp) == 2 ? _Np * 2 : _Np)) - 1;
+ 	      return __x86_movmsk(__k) == __valid_bits;
+ 	    }
+ 	  else if constexpr (sizeof(__k) < 16)
+ 	    return __x86_vecmask_all<_Np>(__vec_zero_pad_to_16(__k));
+ 	  else
+ 	    return 0 != __x86_vec_testc(__k, ~_TV());
+ 	}
+       else if constexpr (sizeof(__k) <= __x86_max_general_register_size)
+ 	{
+ 	  using _Ip = __integer_from<sizeof(__k)>;
+ 	  constexpr _Ip __valid_bits = (_Ip(1) << (_Np * sizeof(_Tp) * __CHAR_BIT__)) - 1;
+ 	  return (__builtin_bit_cast(_Ip, __k) & __valid_bits) == __valid_bits;
+ 	}
+       else if constexpr (!_Traits._M_have_sse4_1())
+ 	{
+ 	  constexpr unsigned __valid_bits = (1u << (sizeof(_Tp) == 2 ? _Np * 2 : _Np)) - 1;
+ 	  return (__x86_movmsk(__k) & __valid_bits) == __valid_bits;
+ 	}
+       else if constexpr (sizeof(__k) < 16)
+ 	return __x86_vecmask_all<_Np>(__vec_zero_pad_to_16(__k));
+       else
+ 	return 0 != __x86_vec_testc(__k, _S_vec_implicit_mask<_Np, _TV>);
+     }
+ 
+   template <int _Np, __vec_builtin _TV, _ArchTraits _Traits = {}>
+     [[__gnu__::__always_inline__]]
+     inline bool
+     __x86_vecmask_any(_TV __k)
+     {
+       using _Tp = __vec_value_type<_TV>;
+       static_assert(is_integral_v<_Tp> && is_signed_v<_Tp>);
+       constexpr int __width = __width_of<_TV>;
+       static_assert(sizeof(__k) <= 32);
+       if constexpr (_Np == __width)
+ 	return !__x86_vec_is_zero(__k);
+       else if constexpr (sizeof(__k) <= __x86_max_general_register_size)
+ 	{
+ 	  using _Ip = __integer_from<sizeof(__k)>;
+ 	  constexpr _Ip __valid_bits = (_Ip(1) << (_Np * sizeof(_Tp) * __CHAR_BIT__)) - 1;
+ 	  return (__builtin_bit_cast(_Ip, __k) & __valid_bits) != _Ip();
+ 	}
+       else if constexpr (!_Traits._M_have_sse4_1())
+ 	{
+ 	  constexpr unsigned __valid_bits = (1u << (sizeof(_Tp) == 2 ? _Np * 2 : _Np)) - 1;
+ 	  return (__x86_movmsk(__k) & __valid_bits) != 0;
+ 	}
+       else if constexpr (sizeof(__k) < 16)
+ 	return __x86_vecmask_any<_Np>(__vec_zero_pad_to_16(__k));
+       else
+ 	return 0 == __x86_vec_testz(__k, _S_vec_implicit_mask<_Np, _TV>);
+     }
+ 
+   template <int _Np, __vec_builtin _TV, _ArchTraits _Traits = {}>
+     [[__gnu__::__always_inline__]]
+     inline bool
+     __x86_vecmask_none(_TV __k)
+     {
+       using _Tp = __vec_value_type<_TV>;
+       static_assert(is_integral_v<_Tp> && is_signed_v<_Tp>);
+       constexpr int __width = __width_of<_TV>;
+       static_assert(sizeof(__k) <= 32);
+       if constexpr (_Np == __width)
+ 	return __x86_vec_is_zero(__k);
+       else if constexpr (sizeof(__k) <= __x86_max_general_register_size)
+ 	{
+ 	  using _Ip = __integer_from<sizeof(__k)>;
+ 	  constexpr _Ip __valid_bits = (_Ip(1) << (_Np * sizeof(_Tp) * __CHAR_BIT__)) - 1;
+ 	  return (__builtin_bit_cast(_Ip, __k) & __valid_bits) == _Ip();
+ 	}
+       else if constexpr (!_Traits._M_have_sse4_1())
+ 	{
+ 	  constexpr unsigned __valid_bits = (1u << (sizeof(_Tp) == 2 ? _Np * 2 : _Np)) - 1;
+ 	  return (__x86_movmsk(__k) & __valid_bits) == 0;
+ 	}
+       else if constexpr (sizeof(__k) < 16)
+ 	return __x86_vecmask_none<_Np>(__vec_zero_pad_to_16(__k));
+       else
+ 	return 0 != __x86_vec_testz(__k, _S_vec_implicit_mask<_Np, _TV>);
+     }
+ 
+   enum class _X86Cmp
+   {
+     _Eq = 0,
+     _Lt = 1,
+     _Le = 2,
+     _Unord = 3,
+     _Neq = 4,
+     _Nlt = 5,
+     _Nle = 6,
+   };
+ 
+   template <_X86Cmp _Cmp, __vec_builtin _TV, _ArchTraits _Traits = {}>
+     requires is_floating_point_v<__vec_value_type<_TV>>
+     [[__gnu__::__always_inline__]]
+     inline auto
+     __x86_bitmask_cmp(_TV __x, _TV __y)
+     {
+       constexpr int __c = int(_Cmp);
+       using _Tp = __vec_value_type<_TV>;
+       if constexpr (sizeof(_TV) == 64 && sizeof(_Tp) == 8)
+ 	return __builtin_ia32_cmppd512_mask(__x, __y, __c, -1, 4);
+       else if constexpr (sizeof(_TV) == 64 && sizeof(_Tp) == 4)
+ 	return __builtin_ia32_cmpps512_mask(__x, __y, __c, -1, 4);
+       else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 8)
+ 	return __builtin_ia32_cmppd256_mask(__x, __y, __c, -1);
+       else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 4)
+ 	return __builtin_ia32_cmpps256_mask(__x, __y, __c, -1);
+       else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 8)
+ 	return __builtin_ia32_cmppd128_mask(__x, __y, __c, -1);
+       else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 4)
+ 	return __builtin_ia32_cmpps128_mask(__x, __y, __c, -1);
+       else if constexpr (is_same_v<_Tp, _Float16>)
+ 	{
+ 	  if constexpr (sizeof(_TV) == 64 && _Traits._M_have_avx512fp16())
+ 	    return __builtin_ia32_cmpph512_mask(__x, __y, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 32 && _Traits._M_have_avx512fp16())
+ 	    return __builtin_ia32_cmpph256_mask(__x, __y, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 16 && _Traits._M_have_avx512fp16())
+ 	    return __builtin_ia32_cmpph128_mask(__x, __y, __c, -1);
+ 	  else if constexpr (sizeof(_TV) < 16 && _Traits._M_have_avx512fp16())
+ 	    return __x86_bitmask_cmp<_Cmp>(__vec_zero_pad_to_16(__x), __vec_zero_pad_to_16(__y));
+ 	  else
+ 	    {
+ 	      // without AVX512_FP16, float16_t size needs to match float32_t size
+ 	      // (cf. __native_abi())
+ 	      static_assert(sizeof(_TV) <= 32);
+ 	      return __x86_bitmask_cmp<_Cmp>(__vec_cast<float>(__x), __vec_cast<float>(__y));
+ 	    }
+ 	}
+       else if constexpr (sizeof(_TV) < 16)
+ 	return __x86_bitmask_cmp<_Cmp>(__vec_zero_pad_to_16(__x), __vec_zero_pad_to_16(__y));
+       else
+ 	static_assert(false);
+     }
+ 
+   template <typename _Tp>
+     using __x86_intrin_int
+       = decltype([] {
+ 	  if constexpr (sizeof(_Tp) == 1)
+ 	    return char();
+ 	  else
+ 	    return __integer_from<sizeof(_Tp)>();
+ 	}());
+ 
+   template <typename _Tp>
+     using __x86_intrin_type
+       = decltype([] {
+ 	  if constexpr (is_integral_v<_Tp> || sizeof(_Tp) <= 2)
+ 	    return __x86_intrin_int<_Tp>();
+ 	  else
+ 	    return __canonical_vec_type_t<_Tp>();
+ 	}());
+ 
+   template <typename _Tp>
+     using __x86_intel_intrin_value_type
+       = decltype([] {
+ 	  if constexpr (is_integral_v<_Tp>)
+ 	    return 0ll;
+ 	  else if constexpr (sizeof(_Tp) == 8)
+ 	    return 0.;
+ 	  else if constexpr (sizeof(_Tp) == 4)
+ 	    return 0.f;
+ 	  else if constexpr (sizeof(_Tp) == 2)
+ 	    return 0.f16;
+ 	}());
+ 
+ #if !_GLIBCXX_CLANG
+   // overload __vec_andnot from simd_detail.h
+   template <__vec_builtin _TV>
+     requires (sizeof(_TV) >= 16)
+     [[__gnu__::__always_inline__]]
+     constexpr _TV
+     __vec_andnot(_TV __a, _TV __b)
+     {
+       constexpr _TargetTraits _Traits = {};
+       using _Tp = __vec_value_type<_TV>;
+       using _UV = __vec_builtin_type<_UInt<sizeof(_Tp)>, __width_of<_TV>>;
+       if (__builtin_is_constant_evaluated()
+ 	    || (__builtin_constant_p(__a) && __builtin_constant_p(__b)))
+ 	return reinterpret_cast<_TV>(~reinterpret_cast<_UV>(__a) & reinterpret_cast<_UV>(__b));
+       else if constexpr (is_same_v<_Tp, _Float16>)
+ 	return reinterpret_cast<_TV>(__vec_andnot(__vec_bit_cast<float>(__a),
+ 						  __vec_bit_cast<float>(__b)));
+       else if constexpr (sizeof(_TV) == 16 && is_same_v<_Tp, float>)
+ 	return __builtin_ia32_andnps(__a, __b);
+       else if constexpr (sizeof(_TV) == 16 && is_same_v<_Tp, double>)
+ 	return __builtin_ia32_andnpd(__a, __b);
+       else if constexpr (sizeof(_TV) == 32 && is_same_v<_Tp, float>)
+ 	return __builtin_ia32_andnps256(__a, __b);
+       else if constexpr (sizeof(_TV) == 32 && is_same_v<_Tp, double>)
+ 	return __builtin_ia32_andnpd256(__a, __b);
+       else if constexpr (sizeof(_TV) == 64 && is_same_v<_Tp, float> && _Traits._M_have_avx512dq())
+ 	return __builtin_ia32_andnps512_mask(__a, __b, _TV{}, -1);
+       else if constexpr (sizeof(_TV) == 64 && is_same_v<_Tp, double> && _Traits._M_have_avx512dq())
+ 	return __builtin_ia32_andnpd512_mask(__a, __b, _TV{}, -1);
+       else
+ 	{
+ 	  auto __all = __vec_bit_cast<long long>(__a);
+ 	  auto __bll = __vec_bit_cast<long long>(__b);
+ 	  if constexpr (sizeof(_TV) == 16 && is_integral_v<_Tp>)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_pandn128(__all, __bll));
+ 	  else if constexpr (sizeof(_TV) == 32 && is_integral_v<_Tp> && _Traits._M_have_avx2())
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_andnotsi256(__all, __bll));
+ 	  else if constexpr (sizeof(_TV) == 32 && is_integral_v<_Tp>)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_andnpd256(__vec_bit_cast<double>(__a),
+ 								  __vec_bit_cast<double>(__b)));
+ 	  else if constexpr (sizeof(_TV) == 64)
+ 	    {
+ 	      auto __ai = __vec_bit_cast<int>(__a);
+ 	      auto __bi = __vec_bit_cast<int>(__b);
+ 	      return reinterpret_cast<_TV>(
+ 		       __builtin_ia32_pandnd512_mask(__ai, __bi, decltype(__ai)(), -1));
+ 	    }
+ 	}
+     }
+ #endif // not Clang
+ 
+   template <_X86Cmp _Cmp, __vec_builtin _TV, _ArchTraits _Traits = {}>
+     requires is_integral_v<__vec_value_type<_TV>>
+     [[__gnu__::__always_inline__]]
+     inline auto
+     __x86_bitmask_cmp(_TV __x, _TV __y)
+     {
+       constexpr int __c = int(_Cmp);
+       using _Tp = __vec_value_type<_TV>;
+       if constexpr (sizeof(_TV) < 16)
+ 	return __x86_bitmask_cmp<_Cmp>(__vec_zero_pad_to_16(__x), __vec_zero_pad_to_16(__y));
+       else if constexpr (is_signed_v<_Tp>)
+ 	{
+ 	  const auto __xi = __vec_bit_cast<__x86_intrin_int<_Tp>>(__x);
+ 	  const auto __yi = __vec_bit_cast<__x86_intrin_int<_Tp>>(__y);
+ 	  if constexpr (sizeof(_TV) == 64 && sizeof(_Tp) == 8)
+ 	    return __builtin_ia32_cmpq512_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 64 && sizeof(_Tp) == 4)
+ 	    return __builtin_ia32_cmpd512_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 64 && sizeof(_Tp) == 2)
+ 	    return __builtin_ia32_cmpw512_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 64 && sizeof(_Tp) == 1)
+ 	    return __builtin_ia32_cmpb512_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 8)
+ 	    return __builtin_ia32_cmpq256_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 4)
+ 	    return __builtin_ia32_cmpd256_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 2)
+ 	    return __builtin_ia32_cmpw256_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 1)
+ 	    return __builtin_ia32_cmpb256_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 8)
+ 	    return __builtin_ia32_cmpq128_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 4)
+ 	    return __builtin_ia32_cmpd128_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 2)
+ 	    return __builtin_ia32_cmpw128_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 1)
+ 	    return __builtin_ia32_cmpb128_mask(__xi, __yi, __c, -1);
+ 	  else
+ 	    static_assert(false);
+ 	}
+       else
+ 	{
+ 	  const auto __xi = __vec_bit_cast<__x86_intrin_int<_Tp>>(__x);
+ 	  const auto __yi = __vec_bit_cast<__x86_intrin_int<_Tp>>(__y);
+ 	  if constexpr (sizeof(_TV) == 64 && sizeof(_Tp) == 8)
+ 	    return __builtin_ia32_ucmpq512_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 64 && sizeof(_Tp) == 4)
+ 	    return __builtin_ia32_ucmpd512_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 64 && sizeof(_Tp) == 2)
+ 	    return __builtin_ia32_ucmpw512_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 64 && sizeof(_Tp) == 1)
+ 	    return __builtin_ia32_ucmpb512_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 8)
+ 	    return __builtin_ia32_ucmpq256_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 4)
+ 	    return __builtin_ia32_ucmpd256_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 2)
+ 	    return __builtin_ia32_ucmpw256_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 1)
+ 	    return __builtin_ia32_ucmpb256_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 8)
+ 	    return __builtin_ia32_ucmpq128_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 4)
+ 	    return __builtin_ia32_ucmpd128_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 2)
+ 	    return __builtin_ia32_ucmpw128_mask(__xi, __yi, __c, -1);
+ 	  else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 1)
+ 	    return __builtin_ia32_ucmpb128_mask(__xi, __yi, __c, -1);
+ 	  else
+ 	    static_assert(false);
+ 	}
+     }
+ 
+   template <__vec_builtin _TV, _ArchTraits _Traits = {}>
+     [[__gnu__::__always_inline__]]
+     inline auto
+     __x86_bitmask_isinf(_TV __x)
+     {
+       static_assert(_Traits._M_have_avx512dq());
+       using _Tp = __vec_value_type<_TV>;
+       static_assert(is_floating_point_v<_Tp>);
+       if constexpr (sizeof(_TV) == 64 && sizeof(_Tp) == 8)
+ 	return __builtin_ia32_fpclasspd512_mask(__x, 0x18, -1);
+       else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 8)
+ 	return __builtin_ia32_fpclasspd256_mask(__x, 0x18, -1);
+       else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 8)
+ 	return __builtin_ia32_fpclasspd128_mask(__x, 0x18, -1);
+       else if constexpr (sizeof(_TV) == 64 && sizeof(_Tp) == 4)
+ 	return __builtin_ia32_fpclassps512_mask(__x, 0x18, -1);
+       else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 4)
+ 	return __builtin_ia32_fpclassps256_mask(__x, 0x18, -1);
+       else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 4)
+ 	return __builtin_ia32_fpclassps128_mask(__x, 0x18, -1);
+       else if constexpr (sizeof(_TV) == 64 && sizeof(_Tp) == 2 && _Traits._M_have_avx512fp16())
+ 	return __builtin_ia32_fpclassph512_mask(__x, 0x18, -1);
+       else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 2 && _Traits._M_have_avx512fp16())
+ 	return __builtin_ia32_fpclassph256_mask(__x, 0x18, -1);
+       else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 2 && _Traits._M_have_avx512fp16())
+ 	return __builtin_ia32_fpclassph128_mask(__x, 0x18, -1);
+       else if constexpr (sizeof(_Tp) == 2 && !_Traits._M_have_avx512fp16())
+ 	return __x86_bitmask_isinf(__vec_cast<float>(__x));
+       else if constexpr (sizeof(_TV) < 16)
+ 	return __x86_bitmask_isinf(__vec_zero_pad_to_16(__x));
+       else
+ 	static_assert(false);
+     }
+ 
+   template <__vec_builtin _KV, _ArchTraits _Traits = {}>
+     [[__gnu__::__always_inline__]]
+     inline _KV
+     __x86_bit_to_vecmask(std::integral auto __bits)
+     {
+       using _Kp = __vec_value_type<_KV>;
+       static_assert((sizeof(__bits) * __CHAR_BIT__ == __width_of<_KV>)
+ 		      || (sizeof(__bits) == 1 && __CHAR_BIT__ > __width_of<_KV>));
+ 
+       if constexpr (sizeof(_Kp) == 1 && sizeof(_KV) == 64)
+ 	return __builtin_ia32_cvtmask2b512(__bits);
+       else if constexpr (sizeof(_Kp) == 1 && sizeof(_KV) == 32)
+ 	return __builtin_ia32_cvtmask2b256(__bits);
+       else if constexpr (sizeof(_Kp) == 1 && sizeof(_KV) == 16)
+ 	return __builtin_ia32_cvtmask2b128(__bits);
+       else if constexpr (sizeof(_Kp) == 1 && sizeof(_KV) <= 8)
+ 	return _VecOps<_KV>::_S_extract(__builtin_ia32_cvtmask2b128(__bits));
+ 
+       else if constexpr (sizeof(_Kp) == 2 && sizeof(_KV) == 64)
+ 	return __builtin_ia32_cvtmask2w512(__bits);
+       else if constexpr (sizeof(_Kp) == 2 && sizeof(_KV) == 32)
+ 	return __builtin_ia32_cvtmask2w256(__bits);
+       else if constexpr (sizeof(_Kp) == 2 && sizeof(_KV) == 16)
+ 	return __builtin_ia32_cvtmask2w128(__bits);
+       else if constexpr (sizeof(_Kp) == 2 && sizeof(_KV) <= 8)
+ 	return _VecOps<_KV>::_S_extract(__builtin_ia32_cvtmask2w128(__bits));
+ 
+       else if constexpr (sizeof(_Kp) == 4 && sizeof(_KV) == 64)
+ 	return __builtin_ia32_cvtmask2d512(__bits);
+       else if constexpr (sizeof(_Kp) == 4 && sizeof(_KV) == 32)
+ 	return __builtin_ia32_cvtmask2d256(__bits);
+       else if constexpr (sizeof(_Kp) == 4 && sizeof(_KV) <= 16)
+ 	return _VecOps<_KV>::_S_extract(__builtin_ia32_cvtmask2d128(__bits));
+ 
+       else if constexpr (sizeof(_Kp) == 8 && sizeof(_KV) == 64)
+ 	return __builtin_ia32_cvtmask2q512(__bits);
+       else if constexpr (sizeof(_Kp) == 8 && sizeof(_KV) == 32)
+ 	return __builtin_ia32_cvtmask2q256(__bits);
+       else if constexpr (sizeof(_Kp) == 8 && sizeof(_KV) == 16)
+ 	return __builtin_ia32_cvtmask2q128(__bits);
+ 
+       else
+ 	static_assert(false);
+     }
+ 
+   template <unsigned_integral _Kp, __vec_builtin _TV, _ArchTraits _Traits = {}>
+     requires is_integral_v<__vec_value_type<_TV>>
+     [[__gnu__::__always_inline__]]
+     constexpr inline _TV
+     __x86_bitmask_blend(_Kp __k, _TV __t, _TV __f)
+     {
+       using _Tp = __vec_value_type<_TV>;
+       using _Ip = __x86_intrin_int<_Tp>;
+       if constexpr (!is_same_v<_Ip, _Tp>)
+ 	return reinterpret_cast<_TV>(__x86_bitmask_blend(__k, __vec_bit_cast<_Ip>(__t),
+ 							 __vec_bit_cast<_Ip>(__f)));
+       else if constexpr (sizeof(_TV) == 64 && sizeof(_Tp) == 8)
+ 	return __builtin_ia32_blendmq_512_mask (__f, __t, __k);
+       else if constexpr (sizeof(_TV) == 64 && sizeof(_Tp) == 4)
+ 	return __builtin_ia32_blendmd_512_mask (__f, __t, __k);
+       else if constexpr (sizeof(_TV) == 64 && sizeof(_Tp) == 2)
+ 	return __builtin_ia32_blendmw_512_mask (__f, __t, __k);
+       else if constexpr (sizeof(_TV) == 64 && sizeof(_Tp) == 1)
+ 	return __builtin_ia32_blendmb_512_mask (__f, __t, __k);
+       else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 8)
+ 	return __builtin_ia32_blendmq_256_mask (__f, __t, __k);
+       else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 4)
+ 	return __builtin_ia32_blendmd_256_mask (__f, __t, __k);
+       else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 2)
+ 	return __builtin_ia32_blendmw_256_mask (__f, __t, __k);
+       else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 1)
+ 	return __builtin_ia32_blendmb_256_mask (__f, __t, __k);
+       else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 8)
+ 	return __builtin_ia32_blendmq_128_mask (__f, __t, __k);
+       else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 4)
+ 	return __builtin_ia32_blendmd_128_mask (__f, __t, __k);
+       else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 2)
+ 	return __builtin_ia32_blendmw_128_mask (__f, __t, __k);
+       else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 1)
+ 	return __builtin_ia32_blendmb_128_mask (__f, __t, __k);
+       else if constexpr (sizeof(_TV) < 16)
+ 	return _VecOps<_TV>::_S_extract(__x86_bitmask_blend(__k, __vec_zero_pad_to_16(__t),
+ 							    __vec_zero_pad_to_16(__f)));
+       else
+ 	static_assert(false);
+     }
+ 
+   template <unsigned_integral _Kp, __vec_builtin _TV, _ArchTraits _Traits = {}>
+     requires is_floating_point_v<__vec_value_type<_TV>>
+     [[__gnu__::__always_inline__]]
+     constexpr inline _TV
+     __x86_bitmask_blend(_Kp __k, _TV __t, _TV __f)
+     {
+       using _Tp = __vec_value_type<_TV>;
+       if constexpr (sizeof(_TV) == 64 && sizeof(_Tp) == 8)
+ 	return __builtin_ia32_blendmpd_512_mask (__f, __t, __k);
+       else if constexpr (sizeof(_TV) == 64 && sizeof(_Tp) == 4)
+ 	return __builtin_ia32_blendmps_512_mask (__f, __t, __k);
+       else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 8)
+ 	return __builtin_ia32_blendmpd_256_mask (__f, __t, __k);
+       else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 4)
+ 	return __builtin_ia32_blendmps_256_mask (__f, __t, __k);
+       else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 8)
+ 	return __builtin_ia32_blendmpd_128_mask (__f, __t, __k);
+       else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 4)
+ 	return __builtin_ia32_blendmps_128_mask (__f, __t, __k);
+       else if constexpr (is_same_v<_Tp, _Float16>)
+ 	{
+ 	  using _Up = __integer_from<sizeof(_Tp)>;
+ 	  return __vec_bit_cast<_Float16>(__x86_bitmask_blend(__k, __vec_bit_cast<_Up>(__t),
+ 							      __vec_bit_cast<_Up>(__f)));
+ 	}
+       else if constexpr (sizeof(_TV) < 16)
+ 	return _VecOps<_TV>::_S_extract(__x86_bitmask_blend(__k, __vec_zero_pad_to_16(__t),
+ 							    __vec_zero_pad_to_16(__f)));
+       else
+ 	static_assert(false);
+     }
+ 
+   template <int _OutputBits = 4, _ArchTraits _Traits = {}>
+     constexpr _Bitmask<1>
+     __bit_extract_even(_UInt<1> __x)
+     {
+       static_assert(_OutputBits <= 4);
+       constexpr _UInt<1> __mask = 0x55u >> ((4 - _OutputBits) * 2);
+ #if __has_builtin(__builtin_ia32_pext_si)
+       if constexpr (_Traits._M_have_bmi2())
+ 	return __builtin_ia32_pext_si(__x, __mask);
+ #endif
+       __x &= __mask;
+       __x |= __x >> 1;
+       __x &= 0x33u;
+       __x |= __x >> 2;
+       __x &= 0x0Fu;
+       return __x;
+     }
+ 
+   template <int _OutputBits = 8, _ArchTraits _Traits = {}>
+     constexpr _Bitmask<1>
+     __bit_extract_even(_UInt<2> __x)
+     {
+       if constexpr (_OutputBits <= 4)
+ 	return __bit_extract_even<_OutputBits>(_UInt<1>(__x));
+       else
+ 	{
+ 	  static_assert(_OutputBits <= 8);
+ 	  constexpr _UInt<2> __mask = 0x5555u >> ((8 - _OutputBits) * 2);
+ #if __has_builtin(__builtin_ia32_pext_si)
+ 	  if constexpr (_Traits._M_have_bmi2())
+ 	    return __builtin_ia32_pext_si(__x, __mask);
+ #endif
+ 	  __x &= __mask;
+ 	  __x |= __x >> 1;
+ 	  __x &= 0x3333u;
+ 	  __x |= __x >> 2;
+ 	  __x &= 0x0F0Fu;
+ 	  __x |= __x >> 4;
+ 	  return __x;
+ 	}
+     }
+ 
+   template <int _OutputBits = 16, _ArchTraits _Traits = {}>
+     constexpr _Bitmask<_OutputBits>
+     __bit_extract_even(_UInt<4> __x)
+     {
+       if constexpr (_OutputBits <= 4)
+ 	return __bit_extract_even<_OutputBits>(_UInt<1>(__x));
+       else if constexpr (_OutputBits <= 8)
+ 	return __bit_extract_even<_OutputBits>(_UInt<2>(__x));
+       else
+ 	{
+ 	  static_assert(_OutputBits <= 16);
+ 	  constexpr _UInt<4> __mask = 0x5555'5555u >> ((16 - _OutputBits) * 2);
+ #if __has_builtin(__builtin_ia32_pext_si)
+ 	  if constexpr (_Traits._M_have_bmi2())
+ 	    return __builtin_ia32_pext_si(__x, __mask);
+ #endif
+ 	  __x &= __mask;
+ 	  __x |= __x >> 1;
+ 	  __x &= 0x3333'3333u;
+ 	  __x |= __x >> 2;
+ 	  __x &= 0x0F0F'0F0Fu;
+ 	  __x |= __x >> 4;
+ 	  __x &= 0x00FF'00FFu;
+ 	  __x |= __x >> 8;
+ 	  return __x;
+ 	}
+     }
+ 
+   template <int _OutputBits = 32, _ArchTraits _Traits = {}>
+     constexpr _Bitmask<_OutputBits>
+     __bit_extract_even(_UInt<8> __x)
+     {
+       if constexpr (_OutputBits <= 4)
+ 	return __bit_extract_even<_OutputBits>(_UInt<1>(__x));
+       else if constexpr (_OutputBits <= 8)
+ 	return __bit_extract_even<_OutputBits>(_UInt<2>(__x));
+       else if constexpr (_OutputBits <= 16)
+ 	return __bit_extract_even<_OutputBits>(_UInt<4>(__x));
+       else
+ 	{
+ 	  static_assert(_OutputBits <= 32);
+ 	  constexpr _UInt<8> __mask = 0x5555'5555'5555'5555ull >> ((32 - _OutputBits) * 2);
+ #if __has_builtin(__builtin_ia32_pext_si)
+ 	  if constexpr (_Traits._M_have_bmi2())
+ 	    {
+ #if __has_builtin(__builtin_ia32_pext_di)
+ 	      return __builtin_ia32_pext_di(__x, __mask);
+ #else
+ 	      return __builtin_ia32_pext_si(__x, static_cast<unsigned>(__mask))
+ 		       | (__builtin_ia32_pext_si(__x >> 32, __mask >> 32) << 16);
+ #endif
+ 	    }
+ #endif
+ 	  __x &= __mask;
+ 	  __x |= __x >> 1;
+ 	  __x &= 0x3333'3333'3333'3333ull;
+ 	  __x |= __x >> 2;
+ 	  __x &= 0x0F0F'0F0F'0F0F'0F0Full;
+ 	  __x |= __x >> 4;
+ 	  __x &= 0x00FF'00FF'00FF'00FFull;
+ 	  __x |= __x >> 8;
+ 	  __x &= 0x0000'FFFF'0000'FFFFull;
+ 	  __x |= __x >> 16;
+ 	  return __x;
+ 	}
+     }
+ 
+   // input bits must be 0 for all bits > _InputBits
+   template <int _InputBits = -1, _ArchTraits _Traits = {}>
+     constexpr auto
+     __duplicate_each_bit(unsigned_integral auto __x)
+     {
+       constexpr int __input_bits = _InputBits == -1 ? sizeof(__x) * __CHAR_BIT__ : _InputBits;
+       static_assert(__input_bits >= 1);
+       static_assert(sizeof(__x) * __CHAR_BIT__ >= __input_bits);
+       if constexpr (__input_bits <= 8)
+ 	{
+ 	  constexpr _UInt<2> __mask = 0x5555u >> ((8 - __input_bits) * 2);
+ 	  if constexpr (__input_bits == 1)
+ 	    return _UInt<1>(__x * 3u);
+ #if __has_builtin(__builtin_ia32_pdep_si)
+ 	  else if constexpr (_Traits._M_have_bmi2())
+ 	    return _Bitmask<__input_bits * 2>(3u * __builtin_ia32_pdep_si(__x, __mask));
+ #endif
+ 	  else if constexpr (__input_bits == 2) // 0000'00BA
+ 	    return _UInt<1>(((__x + 0b0010u) & 0b0101u) * 3u); // 0B?A -> 0B0A -> BBAA
+ 	  else if constexpr (__input_bits <= 4) // 0000'DCBA
+ 	    {
+ 	      __x = ((__x << 2) | __x ) & 0b0011'0011u; // 00DC'??BA -> 00DC'00BA
+ 	      return _UInt<1>(((__x + 0b0010'0010u) & __mask) * 3u);     // -> DDCC'BBAA
+ 	    }
+ 	  else
+ 	    { // HGFE'DCBA
+ 	      _UInt<2> __y = ((__x << 4) | __x) & 0x0F0Fu; // HGFE'0000'DCBA
+ 	      __y |= __y << 2; // 00HG'??FE'00DC'??BA
+ 	      __y &= 0x3333u;  // 00HG'00FE'00DC'00BA
+ 	      __y += 0x2222u;  // 0H?G'0F?E'0D?C'0B?A
+ 	      return _UInt<2>((__y & __mask) * 3u); // HHGG'FFEE'DDCC'BBAA
+ 	    }
+ 	}
+       else if constexpr (__input_bits <= 16)
+ 	{
+ 	  constexpr _UInt<4> __mask = 0x5555'5555u >> ((16 - __input_bits) * 2);
+ #if __has_builtin(__builtin_ia32_pdep_si)
+ 	  if constexpr (_Traits._M_have_bmi2())
+ 	    return 3u * __builtin_ia32_pdep_si(__x, __mask);
+ #endif
+ 	  _UInt<4> __y = ((__x << 8) | __x) & 0x00FF00FFu;
+ 	  __y |= __y << 4;
+ 	  __y &= 0x0F0F'0F0Fu;
+ 	  __y |= __y << 2;
+ 	  __y &= 0x3333'3333u;
+ 	  return ((__y + 0x2222'2222u) & __mask) * 3;
+ 	}
+       else if constexpr (__input_bits <= 32)
+ 	{
+ 	  constexpr _UInt<8> __mask = 0x5555'5555'5555'5555u >> ((32 - __input_bits) * 2);
+ #if __has_builtin(__builtin_ia32_pdep_si)
+ 	  if constexpr (_Traits._M_have_bmi2())
+ 	    {
+ #if __has_builtin(__builtin_ia32_pdep_di)
+ 	      return 3ull * __builtin_ia32_pdep_di(__x, __mask);
+ #else
+ 	      const _UInt<8> __hi = 3 * __builtin_ia32_pdep_si(__x >> 16, __mask >> 32);
+ 	      return (3u * __builtin_ia32_pdep_si(__x, static_cast<unsigned>(__mask))) | __hi << 32;
+ #endif
+ 	    }
+ #endif
+ 	  _UInt<8> __y = ((__x & 0xFFFF'0000ull) << 16) | (__x & 0x0000'FFFFu);
+ 	  __y |= __y << 8;
+ 	  __y &= 0x00FF'00FF'00FF'00FFull;
+ 	  __y |= __y << 4;
+ 	  __y &= 0x0F0F'0F0F'0F0F'0F0Full;
+ 	  __y |= __y << 2;
+ 	  __y &= 0x3333'3333'3333'3333ull;
+ 	  return ((__y + 0x2222'2222'2222'2222ull) & __mask) * 3;
+ 	}
+       else
+ 	return __trivial_pair { __duplicate_each_bit(_UInt<4>(__x)),
+ 				__duplicate_each_bit<__input_bits - 32>(
+ 				  _Bitmask<__input_bits - 32>(__x >> 32)) };
+     }
+ 
+   template <int _InputBits = -1, typename _U0, typename _U1>
+     constexpr auto
+     __duplicate_each_bit(const __trivial_pair<_U0, _U1>& __x)
+     {
+       static_assert(_InputBits != -1 || is_unsigned_v<_U1>);
+       constexpr int __input_bits = _InputBits == -1 ? (sizeof(_U0) + sizeof(_U1)) * __CHAR_BIT__
+ 						    : _InputBits;
+       constexpr int __in0 = min(int(sizeof(_U0)) * __CHAR_BIT__, __input_bits);
+       constexpr int __in1 = __input_bits - __in0;
+       if constexpr (__in1 == 0)
+ 	return __duplicate_each_bit<__in0>(__x._M_first);
+       else
+ 	return __trivial_pair { __duplicate_each_bit<__in0>(__x._M_first),
+ 				__duplicate_each_bit<__in1>(__x._M_second) };
+     }
+ 
+   template <__vec_builtin _TV, _ArchTraits _Traits = {}>
+     [[__gnu__::__always_inline__]]
+     inline _TV
+     __x86_complex_multiplies(_TV __x, _TV __y)
+     {
+       using _Tp = __vec_value_type<_TV>;
+       using _VO = _VecOps<_TV>;
+ 
+       static_assert(_Traits._M_have_fma());
+       static_assert(is_floating_point_v<_Tp>);
+ 
+       if constexpr (!_Traits._M_have_avx512fp16() && sizeof(_Tp) == 2)
+ 	return __vec_cast<_Tp>(__x86_complex_multiplies(__vec_cast<float>(__x),
+ 							__vec_cast<float>(__y)));
+       else if constexpr (sizeof(_TV) < 16)
+ 	return _VO::_S_extract(__x86_complex_multiplies(__vec_zero_pad_to_16(__x),
+ 							__vec_zero_pad_to_16(__y)));
+ 
+       else
+ 	{
+ 	  _TV __x_real = _VO::_S_dup_even(__x);
+ 	  _TV __x_imag = _VO::_S_dup_odd(__x);
+ 	  _TV __y_swapped = _VO::_S_swap_neighbors(__y);
+ 
+ 	  if constexpr (sizeof(__x) == 16 && sizeof(_Tp) == 2)
+ 	    return __builtin_ia32_vfmaddsubph128_mask(__x_real, __y, __x_imag * __y_swapped, -1);
+ 	  else if constexpr (sizeof(__x) == 32 && sizeof(_Tp) == 2)
+ 	    return __builtin_ia32_vfmaddsubph256_mask(__x_real, __y, __x_imag * __y_swapped, -1);
+ 	  else if constexpr (sizeof(__x) == 64 && sizeof(_Tp) == 2)
+ 	    return __builtin_ia32_vfmaddsubph512_mask(
+ 		     __x_real, __y, __x_imag * __y_swapped, -1, 0x04);
+ 
+ 	  else if constexpr (sizeof(__x) == 16 && sizeof(_Tp) == 4)
+ 	    return __builtin_ia32_vfmaddsubps(__x_real, __y, __x_imag * __y_swapped);
+ 	  else if constexpr (sizeof(__x) == 32 && sizeof(_Tp) == 4)
+ 	    return __builtin_ia32_vfmaddsubps256(__x_real, __y, __x_imag * __y_swapped);
+ 	  else if constexpr (sizeof(__x) == 64 && sizeof(_Tp) == 4)
+ 	    return __builtin_ia32_vfmaddsubps512_mask(
+ 		     __x_real, __y, __x_imag * __y_swapped, -1, 0x04);
+ 
+ 	  else if constexpr (sizeof(__x) == 16 && sizeof(_Tp) == 8)
+ 	    return __builtin_ia32_vfmaddsubpd(__x_real, __y, __x_imag * __y_swapped);
+ 	  else if constexpr (sizeof(__x) == 32 && sizeof(_Tp) == 8)
+ 	    return __builtin_ia32_vfmaddsubpd256(__x_real, __y, __x_imag * __y_swapped);
+ 	  else if constexpr (sizeof(__x) == 64 && sizeof(_Tp) == 8)
+ 	    return __builtin_ia32_vfmaddsubpd512_mask(
+ 		     __x_real, __y, __x_imag * __y_swapped, -1, 0x04);
+ 
+ 	  else
+ 	    static_assert(false);
+ 	}
+     }
+ 
+   // FIXME: Work around PR121688
+   template <__vec_builtin _UV, __vec_builtin _TV>
+     [[__gnu__::__always_inline__]]
+     inline _UV
+     __x86_cvt_f16c(_TV __v)
+     {
+       constexpr bool __from_f16 = is_same_v<__vec_value_type<_TV>, _Float16>;
+       constexpr bool __to_f16 = !__from_f16;
+       if constexpr (__to_f16 && !is_same_v<__vec_value_type<_TV>, float>)
+ 	return __x86_cvt_f16c<_UV>(__vec_cast<float>(__v));
+       else if constexpr (__from_f16 && !is_same_v<__vec_value_type<_UV>, float>)
+ 	return __vec_cast<_UV>(__x86_cvt_f16c<__vec_builtin_type<float, __width_of<_TV>>>(__v));
+       else if constexpr (__from_f16)
+ 	{
+ 	  const auto __vi = __vec_bit_cast<__x86_intrin_int<_Float16>>(__v);
+ 	  if constexpr (sizeof(_TV) == 4)
+ 	    return __vec_split_lo(__builtin_ia32_vcvtph2ps(__vec_zero_pad_to_16(__vi)));
+ 	  else if constexpr (sizeof(_TV) == 8)
+ 	    return __builtin_ia32_vcvtph2ps(__vec_zero_pad_to_16(__vi));
+ 	  else if constexpr (sizeof(_TV) == 16)
+ 	    return __builtin_ia32_vcvtph2ps256(__vi);
+ 	  else if constexpr (sizeof(_TV) == 32)
+ 	    return __builtin_ia32_vcvtph2ps512_mask(__vi, __vec_builtin_type<float, 16>(), -1, 4);
+ 	  else if constexpr (sizeof(_TV) >= 64)
+ 	    return __vec_concat(__x86_cvt_f16c<__half_vec_builtin_t<_UV>>(__vec_split_lo(__v)),
+ 				__x86_cvt_f16c<__half_vec_builtin_t<_UV>>(__vec_split_hi(__v)));
+ 	  else
+ 	    static_assert(false);
+ 	}
+       else if constexpr (sizeof(_TV) == 8)
+ 	return reinterpret_cast<_UV>(
+ 		 __vec_split_lo(__vec_split_lo(__builtin_ia32_vcvtps2ph(
+ 						 __vec_zero_pad_to_16(__v), 4))));
+       else if constexpr (sizeof(_TV) == 16)
+ 	return reinterpret_cast<_UV>(__vec_split_lo(__builtin_ia32_vcvtps2ph(__v, 4)));
+       else if constexpr (sizeof(_TV) == 32)
+ 	return reinterpret_cast<_UV>(__builtin_ia32_vcvtps2ph256(__v, 4));
+       else if constexpr (sizeof(_TV) == 64)
+ 	return reinterpret_cast<_UV>(__builtin_ia32_vcvtps2ph512_mask(
+ 				       __v, 4, __vec_builtin_type<short, 16>(), -1));
+       else if constexpr (sizeof(_TV) >= 128)
+ 	return __vec_concat(__x86_cvt_f16c<__half_vec_builtin_t<_UV>>(__vec_split_lo(__v)),
+ 			    __x86_cvt_f16c<__half_vec_builtin_t<_UV>>(__vec_split_hi(__v)));
+       else
+ 	static_assert(false);
+     }
+ 
+   /** @internal
+    * AVX instructions typically work per 128-bit chunk. Horizontal operations thus produce vectors
+    * where the two 128-bit chunks in the center are swapped. This function works as a fix-up step.
+    */
+   template <__vec_builtin _TV>
+     [[__gnu__::__always_inline__]]
+     inline _TV
+     __x86_swizzle4x64_acbd(_TV __x)
+     {
+       static_assert(sizeof(_TV) == 32);
+       using _UV = __vec_builtin_type_bytes<long long, 32>;
+       return reinterpret_cast<_TV>(__builtin_shufflevector(reinterpret_cast<_UV>(__x), _UV(),
+ 							   0, 2, 1, 3));
+     }
+ 
+   /** @internal
+    * Like __builtin_convertvector but with a precondition that input values are either 0 or -1.
+    */
+   template <__vec_builtin _To, __vec_builtin _From>
+     [[__gnu__::__always_inline__]]
+     inline _To
+     __x86_cvt_vecmask(_From __k)
+     {
+       using _T0 = __vec_value_type<_From>;
+       using _T1 = __vec_value_type<_To>;
+       if constexpr (sizeof(_From) > sizeof(_To) && sizeof(_From) < 16)
+ 	{
+ 	  using _ToPadded = __vec_builtin_type_bytes<_T1, sizeof(_To) * 16 / sizeof(_From)>;
+ 	  return _VecOps<_To>::_S_extract(__x86_cvt_vecmask<_ToPadded>(__vec_zero_pad_to_16(__k)));
+ 	}
+       else if constexpr (sizeof(_T0) == 2 && sizeof(_T1) == 1) // -> packsswb
+ 	{
+ 	  if constexpr (sizeof(__k) == 16)
+ 	    return reinterpret_cast<_To>(__vec_split_lo(__builtin_ia32_packsswb128(__k, __k)));
+ 	  else if constexpr (sizeof(__k) == 32)
+ 	    return reinterpret_cast<_To>(
+ 		     __vec_split_lo(__x86_swizzle4x64_acbd(
+ 				      __builtin_ia32_packsswb256(__k, __k))));
+ 	  else
+ 	    static_assert(false);
+ 	}
+       else
+ 	static_assert(false, "TODO");
+     }
+ 
+   /** @internal
+    * Overload that concatenates @p __k0 and @p __k1 while converting.
+    */
+   template <__vec_builtin _To, __vec_builtin _From>
+     [[__gnu__::__always_inline__]]
+     inline _To
+     __x86_cvt_vecmask(_From __k0, _From __k1)
+     {
+       using _T0 = __vec_value_type<_From>;
+       using _T1 = __vec_value_type<_To>;
+       static_assert(sizeof(_From) >= 16);
+       if constexpr (sizeof(_T0) == 2 && sizeof(_T1) == 1) // -> packsswb
+ 	{
+ 	  if constexpr (sizeof(__k0) == 16)
+ 	    return reinterpret_cast<_To>(__builtin_ia32_packsswb128(__k0, __k1));
+ 	  else if constexpr (sizeof(__k0) == 32)
+ 	    return reinterpret_cast<_To>(__x86_swizzle4x64_acbd(
+ 					   __builtin_ia32_packsswb256(__k0, __k1)));
+ 	  else
+ 	    static_assert(false);
+ 	}
+       else
+ 	static_assert(false, "TODO");
+     }
+ 
+   /** @internal
+    * AVX512 masked (converting) loads
+    *
+    * @note AVX512VL and AVX512BW is required
+    */
+   template <__vec_builtin _TV, typename _Up, _ArchTraits _Traits = {}>
+     [[__gnu__::__always_inline__]]
+     inline _TV
+     __x86_masked_load(const _Up* __mem, unsigned_integral auto __k)
+     {
+       static_assert(_Traits._M_have_avx512vl() && _Traits._M_have_avx512bw());
+       using _Tp = __vec_value_type<_TV>;
+       constexpr int __n = __width_of<_TV>;
+       if constexpr (!__converts_trivially<_Up, _Tp>)
+ 	{
+ 	  const auto __uvec
+ 	    = __x86_masked_load<__vec_builtin_type<__canonical_vec_type_t<_Up>, __n>>(__mem, __k);
+ 	  return __vec_cast<_TV>(__uvec);
+ 	}
+       else if constexpr (sizeof(_TV) < 16)
+ 	{
+ 	  return _VecOps<_TV>::_S_extract(
+ 		   __x86_masked_load<__vec_builtin_type_bytes<_Tp, 16>>(__mem, __k));
+ 	}
+       else if constexpr (sizeof(_TV) > 64)
+ 	{
+ 	  return __vec_concat(
+ 		   __x86_masked_load<__vec_builtin_type<_Tp, __n / 2>>(__mem, __k),
+ 		   __x86_masked_load<__vec_builtin_type<_Tp, __n / 2>>(__mem + __n / 2, __k >> __n / 2)
+ 		 );
+ 	}
+       else if constexpr (sizeof(_TV) == 64)
+ 	{
+ 	  const auto* __src = reinterpret_cast<const __x86_intrin_type<_Up>*>(__mem);
+ 	  const __vec_builtin_type_bytes<__x86_intrin_type<_Up>, 64> __z = {};
+ 	  if constexpr (is_floating_point_v<_Tp> && sizeof(_Tp) == 4)
+ 	    return __builtin_ia32_loadups512_mask(__src, __z, __k);
+ 	  else if constexpr (is_floating_point_v<_Tp> && sizeof(_Tp) == 8)
+ 	    return __builtin_ia32_loadupd512_mask(__src, __z, __k);
+ 	  else if constexpr (sizeof(_Tp) == 1)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_loaddquqi512_mask(__src, __z, __k));
+ 	  else if constexpr (sizeof(_Tp) == 2)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_loaddquhi512_mask(__src, __z, __k));
+ 	  else if constexpr (sizeof(_Tp) == 4)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_loaddqusi512_mask(__src, __z, __k));
+ 	  else if constexpr (sizeof(_Tp) == 8)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_loaddqudi512_mask(__src, __z, __k));
+ 	  else
+ 	    static_assert(false);
+ 	}
+       else if constexpr (sizeof(_TV) == 32)
+ 	{
+ 	  const auto* __src = reinterpret_cast<const __x86_intrin_type<_Up>*>(__mem);
+ 	  const __vec_builtin_type_bytes<__x86_intrin_type<_Up>, 32> __z = {};
+ 	  if constexpr (is_floating_point_v<_Tp> && sizeof(_Tp) == 4)
+ 	    return __builtin_ia32_loadups256_mask(__src, __z, __k);
+ 	  else if constexpr (is_floating_point_v<_Tp> && sizeof(_Tp) == 8)
+ 	    return __builtin_ia32_loadupd256_mask(__src, __z, __k);
+ 	  else if constexpr (sizeof(_Tp) == 1)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_loaddquqi256_mask(__src, __z, __k));
+ 	  else if constexpr (sizeof(_Tp) == 2)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_loaddquhi256_mask(__src, __z, __k));
+ 	  else if constexpr (sizeof(_Tp) == 4)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_loaddqusi256_mask(__src, __z, __k));
+ 	  else if constexpr (sizeof(_Tp) == 8)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_loaddqudi256_mask(__src, __z, __k));
+ 	  else
+ 	    static_assert(false);
+ 	}
+       else if constexpr (sizeof(_TV) == 16)
+ 	{
+ 	  const auto* __src = reinterpret_cast<const __x86_intrin_type<_Up>*>(__mem);
+ 	  const __vec_builtin_type_bytes<__x86_intrin_type<_Up>, 16> __z = {};
+ 	  if constexpr (is_floating_point_v<_Tp> && sizeof(_Tp) == 4)
+ 	    return __builtin_ia32_loadups128_mask(__src, __z, __k);
+ 	  else if constexpr (is_floating_point_v<_Tp> && sizeof(_Tp) == 8)
+ 	    return __builtin_ia32_loadupd128_mask(__src, __z, __k);
+ 	  else if constexpr (sizeof(_Tp) == 1)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_loaddquqi128_mask(__src, __z, __k));
+ 	  else if constexpr (sizeof(_Tp) == 2)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_loaddquhi128_mask(__src, __z, __k));
+ 	  else if constexpr (sizeof(_Tp) == 4)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_loaddqusi128_mask(__src, __z, __k));
+ 	  else if constexpr (sizeof(_Tp) == 8)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_loaddqudi128_mask(__src, __z, __k));
+ 	  else
+ 	    static_assert(false);
+ 	}
+       else
+ 	static_assert(false);
+     }
+ 
+   /** @internal
+    * AVX(2) masked loads (only trivial conversions)
+    */
+   template <__vec_builtin _TV, typename _Up, __vec_builtin _KV, _ArchTraits _Traits = {}>
+     [[__gnu__::__always_inline__]]
+     inline _TV
+     __x86_masked_load(const _Up* __mem, const _KV __k)
+     {
+       using _Tp = __vec_value_type<_TV>;
+       static_assert(_Traits._M_have_avx() && __converts_trivially<_Up, _Tp> && sizeof(_Up) >= 4);
+       constexpr int __n = __width_of<_TV>;
+       using _IV = __vec_builtin_type<__x86_intrin_int<_Tp>, __n>;
+       const auto __vk = reinterpret_cast<_IV>(__k);
+       if constexpr (sizeof(_TV) < 16)
+ 	return _VecOps<_TV>::_S_extract(__x86_masked_load<__vec_builtin_type_bytes<_Tp, 16>>(
+ 					  __mem, __vec_zero_pad_to_16(__k)));
+       else if constexpr (_Traits._M_have_avx2() && is_integral_v<_Up>)
+ 	{
+ 	  const auto* __src
+ 	    = reinterpret_cast<const __vec_builtin_type<__x86_intrin_int<_Up>, __n>*>(__mem);
+ 	  if constexpr (sizeof(_Up) == 4 && sizeof(_TV) == 32)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_maskloadd256(__src, __vk));
+ 	  else if constexpr (sizeof(_Up) == 4 && sizeof(_TV) == 16)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_maskloadd(__src, __vk));
+ 	  else if constexpr (sizeof(_Up) == 8 && sizeof(_TV) == 32)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_maskloadq256(__src, __vk));
+ 	  else if constexpr (sizeof(_Up) == 8 && sizeof(_TV) == 16)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_maskloadq(__src, __vk));
+ 	  else
+ 	    static_assert(false);
+ 	}
+       else if constexpr (sizeof(_Up) == 4)
+ 	{
+ 	  const auto* __src = reinterpret_cast<const __vec_builtin_type<float, __n>*>(__mem);
+ 	  if constexpr (sizeof(_TV) == 32)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_maskloadps256(__src, __vk));
+ 	  else if constexpr (sizeof(_TV) == 16)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_maskloadps(__src, __vk));
+ 	  else
+ 	    static_assert(false);
+ 	}
+       else
+ 	{
+ 	  const auto* __src = reinterpret_cast<const __vec_builtin_type<double, __n>*>(__mem);
+ 	  if constexpr (sizeof(_TV) == 32)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_maskloadpd256(__src, __vk));
+ 	  else if constexpr (sizeof(_TV) == 16)
+ 	    return reinterpret_cast<_TV>(__builtin_ia32_maskloadpd(__src, __vk));
+ 	  else
+ 	    static_assert(false);
+ 	}
+     }
+ 
+   /** @internal
+    * AVX512 masked stores
+    *
+    * @note AVX512VL is required
+    */
+   template <__vec_builtin _TV, typename _Up>
+     [[__gnu__::__always_inline__]]
+     inline void
+     __x86_masked_store(const _TV __v, _Up* __mem, unsigned_integral auto __k)
+     {
+       using _Tp = __vec_value_type<_TV>;
+       constexpr int __n = __width_of<_TV>;
+       [[maybe_unused]] const auto __w = __vec_bit_cast<__x86_intrin_type<_Tp>>(__v);
+       if constexpr (sizeof(_TV) == 64)
+ 	{
+ 	  if constexpr (sizeof(_Tp) > sizeof(_Up) && is_integral_v<_Tp> && is_integral_v<_Up>)
+ 	    {
+ 	      auto* __dst = reinterpret_cast<
+ 			      __vec_builtin_type<__x86_intrin_int<_Up>, __n>*>(__mem);
+ 	      if constexpr (sizeof(_Tp) == 2)
+ 		__builtin_ia32_pmovwb512mem_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 4 && sizeof(_Up) == 1)
+ 		__builtin_ia32_pmovdb512mem_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 4 && sizeof(_Up) == 2)
+ 		__builtin_ia32_pmovdw512mem_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 8 && sizeof(_Up) == 1)
+ 		__builtin_ia32_pmovqb512mem_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 8 && sizeof(_Up) == 2)
+ 		__builtin_ia32_pmovqw512mem_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 8 && sizeof(_Up) == 4)
+ 		__builtin_ia32_pmovqd512mem_mask(__dst, __w, __k);
+ 	      else
+ 		static_assert(false);
+ 	    }
+ 	  else if constexpr (__converts_trivially<_Tp, _Up>)
+ 	    {
+ 	      auto* __dst = reinterpret_cast<__x86_intrin_type<_Up>*>(__mem);
+ 	      if constexpr (is_floating_point_v<_Tp> && sizeof(_Tp) == 4)
+ 		__builtin_ia32_storeups512_mask(__dst, __w, __k);
+ 	      else if constexpr (is_floating_point_v<_Tp> && sizeof(_Tp) == 8)
+ 		__builtin_ia32_storeupd512_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 1)
+ 		__builtin_ia32_storedquqi512_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 2)
+ 		__builtin_ia32_storedquhi512_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 4)
+ 		__builtin_ia32_storedqusi512_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 8)
+ 		__builtin_ia32_storedqudi512_mask(__dst, __w, __k);
+ 	      else
+ 		static_assert(false);
+ 	    }
+ 	  else if constexpr (sizeof(_Tp) >= sizeof(_Up))
+ 	    {
+ 	      if constexpr (is_floating_point_v<_Tp> && is_integral_v<_Up>
+ 			      && sizeof(_Tp) > sizeof(_Up))
+ 		__x86_masked_store(__vec_cast<__integer_from<sizeof(_Tp)>>(__v), __mem, __k);
+ 	      else
+ 		__x86_masked_store(__vec_cast<_Up>(__v), __mem, __k);
+ 	    }
+ 	  else
+ 	    {
+ 	      __x86_masked_store(__vec_split_lo(__v), __mem, _Bitmask<__n / 2>(__k));
+ 	      __x86_masked_store(__vec_split_hi(__v), __mem + __n / 2,
+ 				 _Bitmask<__n / 2>(__k >> (__n / 2)));
+ 	    }
+ 	}
+       else if constexpr (sizeof(_TV) == 32)
+ 	{
+ 	  if constexpr (sizeof(_Tp) > sizeof(_Up) && is_integral_v<_Tp> && is_integral_v<_Up>)
+ 	    {
+ 	      auto* __dst = reinterpret_cast<
+ 			      __vec_builtin_type<__x86_intrin_int<_Up>, __n>*>(__mem);
+ 	      if constexpr (sizeof(_Tp) == 2)
+ 		__builtin_ia32_pmovwb256mem_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 4 && sizeof(_Up) == 1)
+ 		__builtin_ia32_pmovdb256mem_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 4 && sizeof(_Up) == 2)
+ 		__builtin_ia32_pmovdw256mem_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 8 && sizeof(_Up) == 1)
+ 		__builtin_ia32_pmovqb256mem_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 8 && sizeof(_Up) == 2)
+ 		__builtin_ia32_pmovqw256mem_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 8 && sizeof(_Up) == 4)
+ 		__builtin_ia32_pmovqd256mem_mask(__dst, __w, __k);
+ 	      else
+ 		static_assert(false);
+ 	    }
+ 	  else if constexpr (__converts_trivially<_Tp, _Up>)
+ 	    {
+ 	      auto* __dst = reinterpret_cast<__x86_intrin_type<_Up>*>(__mem);
+ 	      if constexpr (is_floating_point_v<_Tp> && sizeof(_Tp) == 4)
+ 		__builtin_ia32_storeups256_mask(__dst, __w, __k);
+ 	      else if constexpr (is_floating_point_v<_Tp> && sizeof(_Tp) == 8)
+ 		__builtin_ia32_storeupd256_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 1)
+ 		__builtin_ia32_storedquqi256_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 2)
+ 		__builtin_ia32_storedquhi256_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 4)
+ 		__builtin_ia32_storedqusi256_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 8)
+ 		__builtin_ia32_storedqudi256_mask(__dst, __w, __k);
+ 	      else
+ 		static_assert(false);
+ 	    }
+ 	  else if constexpr (2 * sizeof(_Tp) >= sizeof(_Up))
+ 	    {
+ 	      __x86_masked_store(__vec_cast<_Up>(__v), __mem, __k);
+ 	    }
+ 	  else
+ 	    {
+ 	      __x86_masked_store(__vec_split_lo(__v), __mem, _Bitmask<__n / 2>(__k));
+ 	      __x86_masked_store(__vec_split_hi(__v), __mem + __n / 2,
+ 				 _Bitmask<__n / 2>(__k >> (__n / 2)));
+ 	    }
+ 	}
+       else if constexpr (sizeof(_TV) == 16)
+ 	{
+ 	  if constexpr (sizeof(_Tp) > sizeof(_Up) && is_integral_v<_Tp> && is_integral_v<_Up>)
+ 	    {
+ 	      auto* __dst = reinterpret_cast<
+ 			      __vec_builtin_type<__x86_intrin_int<_Up>, __n>*>(__mem);
+ 	      if constexpr (sizeof(_Tp) == 2)
+ 		__builtin_ia32_pmovwb128mem_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 4 && sizeof(_Up) == 1)
+ 		__builtin_ia32_pmovdb128mem_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 4 && sizeof(_Up) == 2)
+ 		__builtin_ia32_pmovdw128mem_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 8 && sizeof(_Up) == 1)
+ 		__builtin_ia32_pmovqb128mem_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 8 && sizeof(_Up) == 2)
+ 		__builtin_ia32_pmovqw128mem_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 8 && sizeof(_Up) == 4)
+ 		__builtin_ia32_pmovqd128mem_mask(reinterpret_cast<unsigned long long*>(__mem),
+ 						 __w, __k);
+ 	      else
+ 		static_assert(false);
+ 	    }
+ 	  else if constexpr (__converts_trivially<_Tp, _Up>)
+ 	    {
+ 	      auto* __dst = reinterpret_cast<__x86_intrin_type<_Up>*>(__mem);
+ 	      if constexpr (is_floating_point_v<_Tp> && sizeof(_Tp) == 4)
+ 		__builtin_ia32_storeups128_mask(__dst, __w, __k);
+ 	      else if constexpr (is_floating_point_v<_Tp> && sizeof(_Tp) == 8)
+ 		__builtin_ia32_storeupd128_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 1)
+ 		__builtin_ia32_storedquqi128_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 2)
+ 		__builtin_ia32_storedquhi128_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 4)
+ 		__builtin_ia32_storedqusi128_mask(__dst, __w, __k);
+ 	      else if constexpr (sizeof(_Tp) == 8)
+ 		__builtin_ia32_storedqudi128_mask(__dst, __w, __k);
+ 	      else
+ 		static_assert(false);
+ 	    }
+ 	  else if constexpr (4 * sizeof(_Tp) >= sizeof(_Up))
+ 	    {
+ 	      __x86_masked_store(__vec_cast<_Up>(__v), __mem, __k);
+ 	    }
+ 	  else
+ 	    {
+ 	      __x86_masked_store(__vec_cast<_Up>(__vec_split_lo(__v)), __mem,
+ 				 _Bitmask<__n / 2>(__k));
+ 	      __x86_masked_store(__vec_cast<_Up>(__vec_split_hi(__v)), __mem + __n / 2,
+ 				 _Bitmask<__n / 2>(__k >> (__n / 2)));
+ 	    }
+ 	}
+       else
+ 	__x86_masked_store(__vec_zero_pad_to_16(__v), __mem, __k);
+     }
+ 
+   /** @internal
+    * AVX(2) masked stores
+    */
+   template <__vec_builtin _TV, typename _Up, __vec_builtin _KV, _ArchTraits _Traits = {}>
+     [[__gnu__::__always_inline__]]
+     inline void
+     __x86_masked_store(const _TV __v, _Up* __mem, const _KV __k)
+     {
+       using _Tp = __vec_value_type<_TV>;
+       constexpr int __n = __width_of<_TV>;
+       static_assert(sizeof(_Tp) == 4 || sizeof(_Tp) == 8);
+       auto* __dst = reinterpret_cast<
+ 		      __vec_builtin_type<__x86_intrin_type<_Up>, __n>*>(__mem);
+       [[maybe_unused]] const auto __w = __vec_bit_cast<__x86_intrin_type<_Tp>>(__v);
+       if constexpr (sizeof(_TV) < 16)
+ 	__x86_masked_store(__vec_zero_pad_to_16(__v), __mem, __vec_zero_pad_to_16(__k));
+       else if constexpr (_Traits._M_have_avx2() && is_integral_v<_Tp>)
+ 	{
+ 	  if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 4)
+ 	    __builtin_ia32_maskstored256(__dst, __k, __w);
+ 	  else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 4)
+ 	    __builtin_ia32_maskstored(__dst, __k, __w);
+ 	  else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 8)
+ 	    __builtin_ia32_maskstoreq256(__dst, __k, __w);
+ 	  else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 8)
+ 	    __builtin_ia32_maskstoreq(__dst, __k, __w);
+ 	  else
+ 	    static_assert(false);
+ 	}
+       else
+ 	{
+ 	  if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 4)
+ 	    __builtin_ia32_maskstoreps256(__dst, __k, __w);
+ 	  else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 4)
+ 	    __builtin_ia32_maskstoreps(__dst, __k, __w);
+ 	  else if constexpr (sizeof(_TV) == 32 && sizeof(_Tp) == 8)
+ 	    __builtin_ia32_maskstorepd256(__dst, __k, __w);
+ 	  else if constexpr (sizeof(_TV) == 16 && sizeof(_Tp) == 8)
+ 	    __builtin_ia32_maskstorepd(__dst, __k, __w);
+ 	  else
+ 	    static_assert(false);
+ 	}
+     }
+ } // namespace simd
+ _GLIBCXX_END_NAMESPACE_VERSION
+ } // namespace std
+ 
+ #pragma GCC diagnostic pop
+ #endif // C++26
+ #endif // _GLIBCXX_SIMD_X86_H
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/stl_uninitialized.h gcc-16-20260322/libstdc++-v3/include/bits/stl_uninitialized.h
*** gcc-16-20260315/libstdc++-v3/include/bits/stl_uninitialized.h	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/include/bits/stl_uninitialized.h	Sun Mar 22 22:32:15 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 662,667 ****
--- 662,694 ----
      }
  #endif
  
+ #if __cplusplus >= 201103L
+   template<typename _ITp, typename _IRef, typename _IPtr, typename _OTp,
+ 	   typename _Tp>
+     _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*>
+     __uninitialized_copy_a(
+       _GLIBCXX_STD_C::_Deque_iterator<_ITp, _IRef, _IPtr> __first,
+       _GLIBCXX_STD_C::_Deque_iterator<_ITp, _IRef, _IPtr> __last,
+       _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*> __result,
+       allocator<_Tp>&);
+ 
+   template<typename _Iter, typename _OTp, typename _Tp>
+     __enable_if_t<__is_random_access_iter<_Iter>::value,
+ 		  _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*>>
+     __uninitialized_copy_a(_Iter __first, _Iter __last,
+       _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*> __result,
+       allocator<_Tp>&);
+ 
+   template<typename _ITp, typename _IRef, typename _IPtr, typename _OTp,
+ 	   typename _Tp>
+     _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*>
+     __uninitialized_move_a(
+       _GLIBCXX_STD_C::_Deque_iterator<_ITp, _IRef, _IPtr> __first,
+       _GLIBCXX_STD_C::_Deque_iterator<_ITp, _IRef, _IPtr> __last,
+       _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*> __result,
+       allocator<_Tp>&);
+ #endif
+ 
    template<typename _InputIterator, typename _ForwardIterator,
  	   typename _Allocator>
      _GLIBCXX20_CONSTEXPR
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/vec_ops.h gcc-16-20260322/libstdc++-v3/include/bits/vec_ops.h
*** gcc-16-20260315/libstdc++-v3/include/bits/vec_ops.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/include/bits/vec_ops.h	Sun Mar 22 22:32:15 2026
***************
*** 0 ****
--- 1,606 ----
+ // Implementation of <simd> -*- C++ -*-
+ 
+ // Copyright The GNU Toolchain Authors.
+ //
+ // 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/>.
+ 
+ #ifndef _GLIBCXX_VEC_OPS_H
+ #define _GLIBCXX_VEC_OPS_H 1
+ 
+ #ifdef _GLIBCXX_SYSHDR
+ #pragma GCC system_header
+ #endif
+ 
+ #if __cplusplus >= 202400L
+ 
+ #include "simd_details.h"
+ 
+ #include <bit>
+ #include <bits/utility.h>
+ 
+ // psabi warnings are bogus because the ABI of the internal types never leaks into user code
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wpsabi"
+ 
+ namespace std _GLIBCXX_VISIBILITY(default)
+ {
+ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ namespace simd
+ {
+   template <std::signed_integral _Tp>
+     constexpr bool
+     __signed_has_single_bit(_Tp __x)
+     { return __has_single_bit(make_unsigned_t<_Tp>(__x)); }
+ 
+   /**
+    * Alias for a vector builtin with given value type and total sizeof.
+    */
+   template <__vectorizable _Tp, size_t _Bytes>
+     requires (__has_single_bit(_Bytes))
+     using __vec_builtin_type_bytes [[__gnu__::__vector_size__(_Bytes)]] = _Tp;
+ 
+   /**
+    * Alias for a vector builtin with given value type @p _Tp and @p _Width.
+    */
+   template <__vectorizable _Tp, __simd_size_type _Width>
+     requires (__signed_has_single_bit(_Width))
+     using __vec_builtin_type = __vec_builtin_type_bytes<_Tp, sizeof(_Tp) * _Width>;
+ 
+   /**
+    * Constrain to any vector builtin with given value type and optional width.
+    */
+   template <typename _Tp, typename _ValueType,
+ 	    __simd_size_type _Width = sizeof(_Tp) / sizeof(_ValueType)>
+     concept __vec_builtin_of
+       = !is_class_v<_Tp> && !is_pointer_v<_Tp> && !is_arithmetic_v<_Tp>
+ 	  && __vectorizable<_ValueType>
+ 	  && _Width >= 1 && sizeof(_Tp) / sizeof(_ValueType) == _Width
+ 	  && same_as<__vec_builtin_type_bytes<_ValueType, sizeof(_Tp)>, _Tp>
+ 	  && requires(_Tp& __v, _ValueType __x) { __v[0] = __x; };
+ 
+   /**
+    * Constrain to any vector builtin.
+    */
+   template <typename _Tp>
+     concept __vec_builtin
+       = __vec_builtin_of<_Tp, remove_cvref_t<decltype(declval<const _Tp>()[0])>>;
+ 
+   /**
+    * Alias for the value type of the given __vec_builtin type @p _Tp.
+    */
+   template <__vec_builtin _Tp>
+     using __vec_value_type = remove_cvref_t<decltype(declval<const _Tp>()[0])>;
+ 
+   /**
+    * The width (number of value_type elements) of the given vector builtin or arithmetic type.
+    */
+   template <typename _Tp>
+     inline constexpr __simd_size_type __width_of = 1;
+ 
+   template <typename _Tp>
+     requires __vec_builtin<_Tp>
+     inline constexpr __simd_size_type __width_of<_Tp> = sizeof(_Tp) / sizeof(__vec_value_type<_Tp>);
+ 
+   /**
+    * Alias for a vector builtin with equal value type and new width @p _Np.
+    */
+   template <__simd_size_type _Np, __vec_builtin _TV>
+     using __resize_vec_builtin_t = __vec_builtin_type<__vec_value_type<_TV>, _Np>;
+ 
+   template <__vec_builtin _TV>
+     requires (__width_of<_TV> > 1)
+     using __half_vec_builtin_t = __resize_vec_builtin_t<__width_of<_TV> / 2, _TV>;
+ 
+   template <__vec_builtin _TV>
+     using __double_vec_builtin_t = __resize_vec_builtin_t<__width_of<_TV> * 2, _TV>;
+ 
+   template <typename _Up, __vec_builtin _TV>
+     [[__gnu__::__always_inline__]]
+     constexpr __vec_builtin_type_bytes<_Up, sizeof(_TV)>
+     __vec_bit_cast(_TV __v)
+     { return reinterpret_cast<__vec_builtin_type_bytes<_Up, sizeof(_TV)>>(__v); }
+ 
+   template <int _Np, __vec_builtin _TV>
+     requires signed_integral<__vec_value_type<_TV>>
+     static constexpr _TV _S_vec_implicit_mask = []<int... _Is> (integer_sequence<int, _Is...>) {
+       return _TV{ (_Is < _Np ? -1 : 0)... };
+     } (make_integer_sequence<int, __width_of<_TV>>());
+ 
+   /**
+    * Helper function to work around Clang not allowing v[i] in constant expressions.
+    */
+   template <__vec_builtin _TV>
+     [[__gnu__::__always_inline__]]
+     constexpr __vec_value_type<_TV>
+     __vec_get(_TV __v, int __i)
+     {
+ #ifdef _GLIBCXX_CLANG
+       if consteval
+ 	{
+ 	  return __builtin_bit_cast(array<__vec_value_type<_TV>, __width_of<_TV>>, __v)[__i];
+ 	}
+       else
+ #endif
+ 	{
+ 	  return __v[__i];
+ 	}
+     }
+ 
+   /**
+    * Helper function to work around Clang and GCC not allowing assignment to v[i] in constant
+    * expressions.
+    */
+   template <__vec_builtin _TV>
+     [[__gnu__::__always_inline__]]
+     constexpr void
+     __vec_set(_TV& __v, int __i, __vec_value_type<_TV> __x)
+     {
+       if consteval
+ 	{
+ #ifdef _GLIBCXX_CLANG
+ 	  auto __arr = __builtin_bit_cast(array<__vec_value_type<_TV>, __width_of<_TV>>, __v);
+ 	  __arr[__i] = __x;
+ 	  __v = __builtin_bit_cast(_TV, __arr);
+ #else
+ 	  constexpr auto [...__j] = _IotaArray<__width_of<_TV>>;
+ 	  __v = _TV{(__i == __j ? __x : __v[__j])...};
+ #endif
+ 	}
+       else
+ 	{
+ 	  __v[__i] = __x;
+ 	}
+     }
+ 
+   /** @internal
+    * Return vector builtin with all values from @p __a and @p __b.
+    */
+   template <__vec_builtin _TV>
+     [[__gnu__::__always_inline__]]
+     constexpr __vec_builtin_type<__vec_value_type<_TV>, __width_of<_TV> * 2>
+     __vec_concat(_TV __a, _TV __b)
+     {
+       constexpr auto [...__is] = _IotaArray<__width_of<_TV> * 2>;
+       return __builtin_shufflevector(__a, __b, __is...);
+     }
+ 
+   /** @internal
+    * Concatenate the first @p _N0 elements from @p __a with the first @p _N1 elements from @p __b
+    * with the elements from applying this function recursively to @p __rest.
+    *
+    * @pre _N0 <= __width_of<_TV0> && _N1 <= __width_of<_TV1> && _Ns <= __width_of<_TVs> && ...
+    *
+    * Strategy: Aim for a power-of-2 tree concat. E.g.
+    * - cat(2, 2, 2, 2) -> cat(4, 2, 2) -> cat(4, 4)
+    * - cat(2, 2, 2, 2, 8) -> cat(4, 2, 2, 8) -> cat(4, 4, 8) -> cat(8, 8)
+    */
+   template <int _N0, int _N1, int... _Ns, __vec_builtin _TV0, __vec_builtin _TV1,
+ 	   __vec_builtin... _TVs>
+     [[__gnu__::__always_inline__]]
+     constexpr __vec_builtin_type<__vec_value_type<_TV0>,
+ 				 __bit_ceil(unsigned(_N0 + (_N1 + ... + _Ns)))>
+     __vec_concat_sized(const _TV0& __a, const _TV1& __b, const _TVs&... __rest);
+ 
+   template <int _N0, int _N1, int _N2, int... _Ns, __vec_builtin _TV0, __vec_builtin _TV1,
+ 	    __vec_builtin _TV2, __vec_builtin... _TVs>
+     requires (__has_single_bit(unsigned(_N0))) && (_N0 >= (_N1 + _N2))
+     [[__gnu__::__always_inline__]]
+     constexpr __vec_builtin_type<__vec_value_type<_TV0>,
+ 				 __bit_ceil(unsigned(_N0 + _N1 + (_N2 + ... + _Ns)))>
+     __vec_concat_sized(const _TV0& __a, const _TV1& __b, const _TV2& __c, const _TVs&... __rest)
+     {
+       return __vec_concat_sized<_N0, _N1 + _N2, _Ns...>(
+ 	       __a, __vec_concat_sized<_N1, _N2>(__b, __c), __rest...);
+     }
+ 
+   template <int _N0, int _N1, int... _Ns, __vec_builtin _TV0, __vec_builtin _TV1,
+ 	   __vec_builtin... _TVs>
+     [[__gnu__::__always_inline__]]
+     constexpr __vec_builtin_type<__vec_value_type<_TV0>,
+ 				 __bit_ceil(unsigned(_N0 + (_N1 + ... + _Ns)))>
+     __vec_concat_sized(const _TV0& __a, const _TV1& __b, const _TVs&... __rest)
+     {
+       // __is is rounded up because we need to generate a power-of-2 vector:
+       constexpr auto [...__is] = _IotaArray<__bit_ceil(unsigned(_N0 + _N1)), int>;
+       const auto __ab = __builtin_shufflevector(__a, __b, [](int __i) consteval {
+ 			  if (__i < _N0) // copy from __a
+ 			    return __i;
+ 			  else if (__i < _N0 + _N1) // copy from __b
+ 			    return __i - _N0 + __width_of<_TV0>; // _N0 <= __width_of<_TV0>
+ 			  else // can't index into __rest
+ 			    return -1; // don't care
+ 			}(__is)...);
+       if constexpr (sizeof...(__rest) == 0)
+ 	return __ab;
+       else
+ 	return __vec_concat_sized<_N0 + _N1, _Ns...>(__ab, __rest...);
+     }
+ 
+   template <__vec_builtin _TV>
+     [[__gnu__::__always_inline__]]
+     constexpr __half_vec_builtin_t<_TV>
+     __vec_split_lo(_TV __v)
+     {
+       constexpr int __n = __width_of<_TV> / 2;
+       constexpr auto [...__is] = _IotaArray<__n>;
+       return __builtin_shufflevector(__v, __v, __is...);
+     }
+ 
+   template <__vec_builtin _TV>
+     [[__gnu__::__always_inline__]]
+     constexpr __half_vec_builtin_t<_TV>
+     __vec_split_hi(_TV __v)
+     {
+       constexpr int __n = __width_of<_TV> / 2;
+       constexpr auto [...__is] = _IotaArray<__n>;
+       return __builtin_shufflevector(__v, __v, (__n + __is)...);
+     }
+ 
+   /** @internal
+    * Return @p __x zero-padded to @p _Bytes bytes.
+    *
+    * Use this function when you need two objects of the same size (e.g. for __vec_concat).
+    */
+   template <size_t _Bytes, __vec_builtin _TV>
+     [[__gnu__::__always_inline__]]
+     constexpr auto
+     __vec_zero_pad_to(_TV __x)
+     {
+       if constexpr (sizeof(_TV) == _Bytes)
+ 	return __x;
+       else if constexpr (sizeof(_TV) <= sizeof(0ull))
+ 	{
+ 	  using _Up = _UInt<sizeof(_TV)>;
+ 	  __vec_builtin_type_bytes<_Up, _Bytes> __tmp = {__builtin_bit_cast(_Up, __x)};
+ 	  return __builtin_bit_cast(__vec_builtin_type_bytes<__vec_value_type<_TV>, _Bytes>, __tmp);
+ 	}
+       else if constexpr (sizeof(_TV) < _Bytes)
+ 	return __vec_zero_pad_to<_Bytes>(__vec_concat(__x, _TV()));
+       else
+ 	static_assert(false);
+     }
+ 
+   /** @internal
+    * Return a type with sizeof 16, add zero-padding to @p __x. The input must be smaller.
+    *
+    * Use this function instead of the above when you need to pad an argument for a SIMD builtin.
+    */
+   template <__vec_builtin _TV>
+     [[__gnu__::__always_inline__]]
+     constexpr auto
+     __vec_zero_pad_to_16(_TV __x)
+     {
+       static_assert(sizeof(_TV) < 16);
+       return __vec_zero_pad_to<16>(__x);
+     }
+ 
+   // work around __builtin_constant_p returning false unless passed a variable
+   // (__builtin_constant_p(x[0]) is false while __is_const_known(x[0]) is true)
+   template <typename _Tp>
+     [[__gnu__::__always_inline__]]
+     constexpr bool
+     __is_const_known(const _Tp& __x)
+     {
+       return __builtin_constant_p(__x);
+     }
+ 
+   [[__gnu__::__always_inline__]]
+   constexpr bool
+   __is_const_known(const auto&... __xs) requires(sizeof...(__xs) >= 2)
+   {
+     if consteval
+       {
+ 	return true;
+       }
+     else
+       {
+ 	return (__is_const_known(__xs) && ...);
+       }
+   }
+ 
+   [[__gnu__::__always_inline__]]
+   constexpr bool
+   __is_const_known_equal_to(const auto& __x, const auto& __expect)
+   { return __is_const_known(__x == __expect) && __x == __expect; }
+ 
+ #if _GLIBCXX_X86
+   template <__vec_builtin _UV, __vec_builtin _TV>
+     inline _UV
+     __x86_cvt_f16c(_TV __v);
+ #endif
+ 
+ 
+   /** @internal
+    * Simple wrapper around __builtin_convertvector to provide static_cast-like syntax.
+    *
+    * Works around GCC failing to use the F16C/AVX512F cvtps2ph/cvtph2ps instructions.
+    */
+   template <__vec_builtin _UV, __vec_builtin _TV, _ArchTraits _Traits = {}>
+     [[__gnu__::__always_inline__]]
+     constexpr _UV
+     __vec_cast(_TV __v)
+     {
+       static_assert(__width_of<_UV> == __width_of<_TV>);
+ #if _GLIBCXX_X86
+       using _Up = __vec_value_type<_UV>;
+       using _Tp = __vec_value_type<_TV>;
+       constexpr bool __to_f16 = is_same_v<_Up, _Float16>;
+       constexpr bool __from_f16 = is_same_v<_Tp, _Float16>;
+       constexpr bool __needs_f16c = _Traits._M_have_f16c() && !_Traits._M_have_avx512fp16()
+ 				      && (__to_f16 || __from_f16);
+       if (__needs_f16c && !__is_const_known(__v))
+ 	{ // Work around PR121688
+ 	  if constexpr (__needs_f16c)
+ 	    return __x86_cvt_f16c<_UV>(__v);
+ 	}
+       if constexpr (is_floating_point_v<_Tp> && is_integral_v<_Up>
+ 		      && sizeof(_UV) < sizeof(_TV) && sizeof(_Up) < sizeof(int))
+ 	{
+ 	  using _Ip = __integer_from<std::min(sizeof(int), sizeof(_Tp))>;
+ 	  using _IV = __vec_builtin_type<_Ip, __width_of<_TV>>;
+ 	  return __vec_cast<_UV>(__vec_cast<_IV>(__v));
+ 	}
+ #endif
+       return __builtin_convertvector(__v, _UV);
+     }
+ 
+   /** @internal
+    * Overload of the above cast function that determines the destination vector type from a given
+    * element type @p _Up and the `__width_of` the argument type.
+    *
+    * Calls the above overload.
+    */
+   template <__vectorizable _Up, __vec_builtin _TV>
+     [[__gnu__::__always_inline__]]
+     constexpr __vec_builtin_type<_Up, __width_of<_TV>>
+     __vec_cast(_TV __v)
+     { return __vec_cast<__vec_builtin_type<_Up, __width_of<_TV>>>(__v); }
+ 
+   /** @internal
+    * As above, but with additional precondition on possible values of the argument.
+    *
+    * Precondition: __k[i] is either 0 or -1 for all i.
+    */
+   template <__vec_builtin _UV, __vec_builtin _TV>
+     [[__gnu__::__always_inline__]]
+     constexpr _UV
+     __vec_mask_cast(_TV __k)
+     {
+       static_assert(signed_integral<__vec_value_type<_UV>>);
+       static_assert(signed_integral<__vec_value_type<_TV>>);
+       // TODO: __builtin_convertvector cannot be optimal because it doesn't consider input and
+       // output can only be 0 or -1.
+       return __builtin_convertvector(__k, _UV);
+     }
+ 
+   template <__vec_builtin _TV>
+     [[__gnu__::__always_inline__]]
+     constexpr _TV
+     __vec_xor(_TV __a, _TV __b)
+     {
+       using _Tp = __vec_value_type<_TV>;
+       if constexpr (is_floating_point_v<_Tp>)
+ 	{
+ 	  using _UV = __vec_builtin_type<__integer_from<sizeof(_Tp)>, __width_of<_TV>>;
+ 	  return __builtin_bit_cast(
+ 		   _TV, __builtin_bit_cast(_UV, __a) ^ __builtin_bit_cast(_UV, __b));
+ 	}
+       else
+ 	return __a ^ __b;
+     }
+ 
+   template <__vec_builtin _TV>
+     [[__gnu__::__always_inline__]]
+     constexpr _TV
+     __vec_or(_TV __a, _TV __b)
+     {
+       using _Tp = __vec_value_type<_TV>;
+       if constexpr (is_floating_point_v<_Tp>)
+ 	{
+ 	  using _UV = __vec_builtin_type<__integer_from<sizeof(_Tp)>, __width_of<_TV>>;
+ 	  return __builtin_bit_cast(
+ 		   _TV, __builtin_bit_cast(_UV, __a) | __builtin_bit_cast(_UV, __b));
+ 	}
+       else
+ 	return __a | __b;
+     }
+ 
+   template <__vec_builtin _TV>
+     [[__gnu__::__always_inline__]]
+     constexpr _TV
+     __vec_and(_TV __a, _TV __b)
+     {
+       using _Tp = __vec_value_type<_TV>;
+       if constexpr (is_floating_point_v<_Tp>)
+ 	{
+ 	  using _UV = __vec_builtin_type<__integer_from<sizeof(_Tp)>, __width_of<_TV>>;
+ 	  return __builtin_bit_cast(
+ 		   _TV, __builtin_bit_cast(_UV, __a) & __builtin_bit_cast(_UV, __b));
+ 	}
+       else
+ 	return __a & __b;
+     }
+ 
+   /** @internal
+    * Returns the bit-wise and of not @p __a and @p __b.
+    *
+    * Use __vec_and(__vec_not(__a), __b) unless an andnot instruction is necessary for optimization.
+    *
+    * @see __vec_andnot in simd_x86.h
+    */
+   template <__vec_builtin _TV>
+     [[__gnu__::__always_inline__]]
+     constexpr _TV
+     __vec_andnot(_TV __a, _TV __b)
+     {
+       using _Tp = __vec_value_type<_TV>;
+       using _UV = __vec_builtin_type<__integer_from<sizeof(_Tp)>, __width_of<_TV>>;
+       return __builtin_bit_cast(
+ 	       _TV, ~__builtin_bit_cast(_UV, __a) & __builtin_bit_cast(_UV, __b));
+     }
+ 
+   template <__vec_builtin _TV>
+     [[__gnu__::__always_inline__]]
+     constexpr _TV
+     __vec_not(_TV __a)
+     {
+       using _Tp = __vec_value_type<_TV>;
+       using _UV = __vec_builtin_type_bytes<__integer_from<sizeof(_Tp)>, sizeof(_TV)>;
+       if constexpr (is_floating_point_v<__vec_value_type<_TV>>)
+ 	return __builtin_bit_cast(_TV, ~__builtin_bit_cast(_UV, __a));
+       else
+ 	return ~__a;
+     }
+ 
+   /**
+    * An object of given type where only the sign bits are 1.
+    */
+   template <__vec_builtin _V>
+     requires std::floating_point<__vec_value_type<_V>>
+     constexpr _V _S_signmask = __vec_xor(_V() + 1, _V() - 1);
+ 
+   template <__vec_builtin _TV, int _Np = __width_of<_TV>,
+ 	    typename = make_integer_sequence<int, _Np>>
+     struct _VecOps;
+ 
+   template <__vec_builtin _TV, int _Np, int... _Is>
+     struct _VecOps<_TV, _Np, integer_sequence<int, _Is...>>
+     {
+       static_assert(_Np <= __width_of<_TV>);
+ 
+       using _Tp = __vec_value_type<_TV>;
+ 
+       using _HV = __half_vec_builtin_t<__conditional_t<_Np >= 2, _TV, __double_vec_builtin_t<_TV>>>;
+ 
+       [[__gnu__::__always_inline__]]
+       static constexpr _TV
+       _S_broadcast_to_even(_Tp __init)
+       { return _TV {((_Is & 1) == 0 ? __init : _Tp())...}; }
+ 
+       [[__gnu__::__always_inline__]]
+       static constexpr _TV
+       _S_broadcast_to_odd(_Tp __init)
+       { return _TV {((_Is & 1) == 1 ? __init : _Tp())...}; }
+ 
+       [[__gnu__::__always_inline__]]
+       static constexpr bool
+       _S_all_of(_TV __k) noexcept
+       { return (... && (__k[_Is] != 0)); }
+ 
+       [[__gnu__::__always_inline__]]
+       static constexpr bool
+       _S_any_of(_TV __k) noexcept
+       { return (... || (__k[_Is] != 0)); }
+ 
+       [[__gnu__::__always_inline__]]
+       static constexpr bool
+       _S_none_of(_TV __k) noexcept
+       { return (... && (__k[_Is] == 0)); }
+ 
+       template <typename _Offset = integral_constant<int, 0>>
+       [[__gnu__::__always_inline__]]
+       static constexpr _TV
+       _S_extract(__vec_builtin auto __x, _Offset = {})
+       {
+ 	static_assert(is_same_v<__vec_value_type<_TV>, __vec_value_type<decltype(__x)>>);
+ 	return __builtin_shufflevector(__x, decltype(__x)(), (_Is + _Offset::value)...);
+       }
+ 
+       // swap neighboring elements
+       [[__gnu__::__always_inline__]]
+       static constexpr _TV
+       _S_swap_neighbors(_TV __x)
+       { return __builtin_shufflevector(__x, __x, (_Is ^ 1)...); }
+ 
+       // duplicate even indexed elements, dropping the odd ones
+       [[__gnu__::__always_inline__]]
+       static constexpr _TV
+       _S_dup_even(_TV __x)
+       { return __builtin_shufflevector(__x, __x, (_Is & ~1)...); }
+ 
+       // duplicate odd indexed elements, dropping the even ones
+       [[__gnu__::__always_inline__]]
+       static constexpr _TV
+       _S_dup_odd(_TV __x)
+       { return __builtin_shufflevector(__x, __x, (_Is | 1)...); }
+ 
+       [[__gnu__::__always_inline__]]
+       static constexpr void
+       _S_overwrite_even_elements(_TV& __x, _HV __y) requires (_Np > 1)
+       {
+ 	constexpr __simd_size_type __n = __width_of<_TV>;
+ 	__x = __builtin_shufflevector(__x,
+ #ifdef _GLIBCXX_CLANG
+ 				      __vec_concat(__y, __y),
+ #else
+ 				      __y,
+ #endif
+ 				      ((_Is & 1) == 0 ? __n + _Is / 2 : _Is)...);
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       static constexpr void
+       _S_overwrite_even_elements(_TV& __xl, _TV& __xh, _TV __y)
+       {
+ 	constexpr __simd_size_type __nl = __width_of<_TV>;
+ 	constexpr __simd_size_type __nh = __nl * 3 / 2;
+ 	__xl = __builtin_shufflevector(__xl, __y, ((_Is & 1) == 0 ? __nl + _Is / 2 : _Is)...);
+ 	__xh = __builtin_shufflevector(__xh, __y, ((_Is & 1) == 0 ? __nh + _Is / 2 : _Is)...);
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       static constexpr void
+       _S_overwrite_odd_elements(_TV& __x, _HV __y) requires (_Np > 1)
+       {
+ 	constexpr __simd_size_type __n = __width_of<_TV>;
+ 	__x = __builtin_shufflevector(__x,
+ #ifdef _GLIBCXX_CLANG
+ 				      __vec_concat(__y, __y),
+ #else
+ 				      __y,
+ #endif
+ 				      ((_Is & 1) == 1 ? __n + _Is / 2 : _Is)...);
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       static constexpr void
+       _S_overwrite_odd_elements(_TV& __xl, _TV& __xh, _TV __y)
+       {
+ 	constexpr __simd_size_type __nl = __width_of<_TV>;
+ 	constexpr __simd_size_type __nh = __nl * 3 / 2;
+ 	__xl = __builtin_shufflevector(__xl, __y, ((_Is & 1) == 1 ? __nl + _Is / 2 : _Is)...);
+ 	__xh = __builtin_shufflevector(__xh, __y, ((_Is & 1) == 1 ? __nh + _Is / 2 : _Is)...);
+       }
+ 
+       // true if all elements are know to be equal to __ref at compile time
+       [[__gnu__::__always_inline__]]
+       static constexpr bool
+       _S_is_const_known_equal_to(_TV __x, _Tp __ref)
+       { return (__is_const_known_equal_to(__x[_Is], __ref) && ...); }
+ 
+     };
+ } // namespace simd
+ _GLIBCXX_END_NAMESPACE_VERSION
+ } // namespace std
+ 
+ #pragma GCC diagnostic pop
+ #endif // C++26
+ #endif // _GLIBCXX_VEC_OPS_H
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/version.def gcc-16-20260322/libstdc++-v3/include/bits/version.def
*** gcc-16-20260315/libstdc++-v3/include/bits/version.def	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/include/bits/version.def	Sun Mar 22 22:32:15 2026
*************** ftms = {
*** 2333,2338 ****
--- 2333,2351 ----
    };
  };
  
+ ftms = {
+   name = simd;
+   values = {
+     no_stdname = true; // TODO: change once complete
+     v = 202506;
+     cxxmin = 26;
+     extra_cond = "__cpp_structured_bindings >= 202411L "
+     "&& __cpp_expansion_statements >= 202411L "
+     "&& (__x86_64__ || __i386__)"; // TODO: lift initial restriction to x86
+     hosted = yes;
+   };
+ };
+ 
  // Standard test specifications.
  stds[97] = ">= 199711L";
  stds[03] = ">= 199711L";
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/bits/version.h gcc-16-20260322/libstdc++-v3/include/bits/version.h
*** gcc-16-20260315/libstdc++-v3/include/bits/version.h	Sun Mar 15 22:32:20 2026
--- gcc-16-20260322/libstdc++-v3/include/bits/version.h	Sun Mar 22 22:32:15 2026
***************
*** 2616,2619 ****
--- 2616,2628 ----
  #endif /* !defined(__cpp_lib_contracts) */
  #undef __glibcxx_want_contracts
  
+ #if !defined(__cpp_lib_simd)
+ # if (__cplusplus >  202302L) && _GLIBCXX_HOSTED && (__cpp_structured_bindings >= 202411L && __cpp_expansion_statements >= 202411L && (__x86_64__ || __i386__))
+ #  define __glibcxx_simd 202506L
+ #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_simd)
+ #  endif
+ # endif
+ #endif /* !defined(__cpp_lib_simd) */
+ #undef __glibcxx_want_simd
+ 
  #undef __glibcxx_want_all
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/experimental/bits/fs_path.h gcc-16-20260322/libstdc++-v3/include/experimental/bits/fs_path.h
*** gcc-16-20260315/libstdc++-v3/include/experimental/bits/fs_path.h	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/include/experimental/bits/fs_path.h	Sun Mar 22 22:32:15 2026
*************** namespace __detail
*** 1186,1218 ****
    inline path
    path::stem() const
    {
!     auto ext = _M_find_extension();
!     if (ext.first && ext.second != 0)
!       return path{ext.first->substr(0, ext.second)};
      return {};
    }
  
    inline path
    path::extension() const
    {
!     auto ext = _M_find_extension();
!     if (ext.first && ext.second != string_type::npos)
!       return path{ext.first->substr(ext.second)};
      return {};
    }
  
    inline bool
    path::has_stem() const
    {
!     auto ext = _M_find_extension();
!     return ext.first && ext.second != 0;
    }
  
    inline bool
    path::has_extension() const
    {
!     auto ext = _M_find_extension();
!     return ext.first && ext.second != string_type::npos;
    }
  
    inline bool
--- 1186,1218 ----
    inline path
    path::stem() const
    {
!     auto __ext = _M_find_extension();
!     if (__ext.first && __ext.second != 0)
!       return path{__ext.first->substr(0, __ext.second)};
      return {};
    }
  
    inline path
    path::extension() const
    {
!     auto __ext = _M_find_extension();
!     if (__ext.first && __ext.second != string_type::npos)
!       return path{__ext.first->substr(__ext.second)};
      return {};
    }
  
    inline bool
    path::has_stem() const
    {
!     auto __ext = _M_find_extension();
!     return __ext.first && __ext.second != 0;
    }
  
    inline bool
    path::has_extension() const
    {
!     auto __ext = _M_find_extension();
!     return __ext.first && __ext.second != string_type::npos;
    }
  
    inline bool
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/ext/concurrence.h gcc-16-20260322/libstdc++-v3/include/ext/concurrence.h
*** gcc-16-20260315/libstdc++-v3/include/ext/concurrence.h	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/include/ext/concurrence.h	Sun Mar 22 22:32:15 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 290,311 ****
  #endif
      }
  
!     void wait(__mutex *mutex)
      {
  #if __GTHREADS
        {
! 	  if (__gthread_cond_wait(&_M_cond, mutex->gthread_mutex()) != 0)
  	    __throw_concurrence_wait_error();
        }
  #endif
      }
  
!     void wait_recursive(__recursive_mutex *mutex)
      {
  #if __GTHREADS
        {
  	  if (__gthread_cond_wait_recursive(&_M_cond,
! 					    mutex->gthread_recursive_mutex())
  	      != 0)
  	    __throw_concurrence_wait_error();
        }
--- 290,311 ----
  #endif
      }
  
!     void wait(__mutex *__mx)
      {
  #if __GTHREADS
        {
! 	  if (__gthread_cond_wait(&_M_cond, __mx->gthread_mutex()) != 0)
  	    __throw_concurrence_wait_error();
        }
  #endif
      }
  
!     void wait_recursive(__recursive_mutex *__mx)
      {
  #if __GTHREADS
        {
  	  if (__gthread_cond_wait_recursive(&_M_cond,
! 					    __mx->gthread_recursive_mutex())
  	      != 0)
  	    __throw_concurrence_wait_error();
        }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/pstl/glue_algorithm_defs.h gcc-16-20260322/libstdc++-v3/include/pstl/glue_algorithm_defs.h
*** gcc-16-20260315/libstdc++-v3/include/pstl/glue_algorithm_defs.h	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/include/pstl/glue_algorithm_defs.h	Sun Mar 22 22:32:15 2026
*************** generate(_ExecutionPolicy&& __exec, _For
*** 202,208 ****
  
  template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Generator>
  __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
! generate_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Size count, _Generator __g);
  
  // [alg.remove]
  
--- 202,208 ----
  
  template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Generator>
  __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
! generate_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Size __count, _Generator __g);
  
  // [alg.remove]
  
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/std/generator gcc-16-20260322/libstdc++-v3/include/std/generator
*** gcc-16-20260315/libstdc++-v3/include/std/generator	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/include/std/generator	Sun Mar 22 22:32:15 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 423,430 ****
      };
  
      template<typename _All>
!     concept _Stateless_alloc = (allocator_traits<_All>::is_always_equal::value
! 				&& default_initializable<_All>);
  
      template<typename _Allocator>
        class _Promise_alloc
--- 423,431 ----
      };
  
      template<typename _All>
!     concept _Stateless_alloc
! 	= default_initializable<_All>
! 	    && allocator_traits<_All>::is_always_equal::value;
  
      template<typename _Allocator>
        class _Promise_alloc
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/std/mdspan gcc-16-20260322/libstdc++-v3/include/std/mdspan
*** gcc-16-20260315/libstdc++-v3/include/std/mdspan	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/include/std/mdspan	Sun Mar 22 22:32:15 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 80,89 ****
        return true;
      }
  
!     template<typename _IndexType, typename _OIndexType>
        constexpr _IndexType
!       __index_type_cast(_OIndexType&& __other)
        {
  	if constexpr (std::is_integral_v<_OIndexType>)
  	  {
  	    constexpr _IndexType __index_type_max
--- 80,92 ----
        return true;
      }
  
!     template<typename _IndexType, typename _OIndexTypeRef>
        constexpr _IndexType
!       __index_type_cast(_OIndexTypeRef&& __other)
        {
+ 	// _GLIBCXX_RESOLVE_LIB_DEFECTS
+ 	// 4020. extents::index-cast weirdness
+ 	using _OIndexType = std::remove_cvref_t<_OIndexTypeRef>;
  	if constexpr (std::is_integral_v<_OIndexType>)
  	  {
  	    constexpr _IndexType __index_type_max
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 100,106 ****
  	  }
  	else
  	  {
! 	    auto __ret = static_cast<_IndexType>(std::move(__other));
  	    if constexpr (std::is_signed_v<_IndexType>)
  	      __glibcxx_assert(__ret >= 0);
  	    return __ret;
--- 103,109 ----
  	  }
  	else
  	  {
! 	    auto __ret = static_cast<_IndexType>(std::forward<_OIndexTypeRef>(__other));
  	    if constexpr (std::is_signed_v<_IndexType>)
  	      __glibcxx_assert(__ret >= 0);
  	    return __ret;
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/std/ranges gcc-16-20260322/libstdc++-v3/include/std/ranges
*** gcc-16-20260315/libstdc++-v3/include/std/ranges	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/include/std/ranges	Sun Mar 22 22:32:15 2026
*************** namespace views::__adaptor
*** 5261,5268 ****
      { return _M_zip.size(); }
    };
  
!   template<class _Fp, class... Rs>
!     zip_transform_view(_Fp, Rs&&...) -> zip_transform_view<_Fp, views::all_t<Rs>...>;
  
    template<move_constructible _Fp, input_range... _Vs>
      requires (view<_Vs> && ...) && (sizeof...(_Vs) > 0) && is_object_v<_Fp>
--- 5261,5269 ----
      { return _M_zip.size(); }
    };
  
!   template<class _Fp, class... _Rs>
!     zip_transform_view(_Fp, _Rs&&...)
!       -> zip_transform_view<_Fp, views::all_t<_Rs>...>;
  
    template<move_constructible _Fp, input_range... _Vs>
      requires (view<_Vs> && ...) && (sizeof...(_Vs) > 0) && is_object_v<_Fp>
*************** namespace views::__adaptor
*** 8511,8519 ****
      template<typename... _Vs>
        concept __cartesian_product_is_sized = (sized_range<_Vs> && ...);
  
!     template<bool _Const, template<typename> class FirstSent, typename _First, typename... _Vs>
        concept __cartesian_is_sized_sentinel
! 	= (sized_sentinel_for<FirstSent<__maybe_const_t<_Const, _First>>,
  			      iterator_t<__maybe_const_t<_Const, _First>>>
  	   && ...
  	   && (sized_range<__maybe_const_t<_Const, _Vs>>
--- 8512,8521 ----
      template<typename... _Vs>
        concept __cartesian_product_is_sized = (sized_range<_Vs> && ...);
  
!     template<bool _Const, template<typename> class _FirstSent,
! 	     typename _First, typename... _Vs>
        concept __cartesian_is_sized_sentinel
! 	= (sized_sentinel_for<_FirstSent<__maybe_const_t<_Const, _First>>,
  			      iterator_t<__maybe_const_t<_Const, _First>>>
  	   && ...
  	   && (sized_range<__maybe_const_t<_Const, _Vs>>
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/std/simd gcc-16-20260322/libstdc++-v3/include/std/simd
*** gcc-16-20260315/libstdc++-v3/include/std/simd	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/include/std/simd	Sun Mar 22 22:32:15 2026
***************
*** 0 ****
--- 1,48 ----
+ // <simd> -*- C++ -*-
+ 
+ // Copyright The GNU Toolchain Authors.
+ //
+ // 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 simd
+  *  This is a Standard C++ Library header.
+  */
+ 
+ #ifndef _GLIBCXX_SIMD
+ #define _GLIBCXX_SIMD 1
+ 
+ #ifdef _GLIBCXX_SYSHDR
+ #pragma GCC system_header
+ #endif
+ 
+ #define __glibcxx_want_simd
+ #include <bits/version.h>
+ 
+ #ifdef __glibcxx_simd
+ 
+ #include "bits/simd_vec.h"
+ #include "bits/simd_loadstore.h"
+ #include "bits/simd_mask_reductions.h"
+ #include "bits/simd_reductions.h"
+ #include "bits/simd_alg.h"
+ 
+ #endif
+ #endif
diff -Nrcpad gcc-16-20260315/libstdc++-v3/include/tr1/riemann_zeta.tcc gcc-16-20260322/libstdc++-v3/include/tr1/riemann_zeta.tcc
*** gcc-16-20260315/libstdc++-v3/include/tr1/riemann_zeta.tcc	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/include/tr1/riemann_zeta.tcc	Sun Mar 22 22:32:15 2026
*************** namespace tr1
*** 83,91 ****
        if (__s < _Tp(1))
          std::__throw_domain_error(__N("Bad argument in zeta sum."));
  
!       const unsigned int max_iter = 10000;
        _Tp __zeta = _Tp(0);
!       for (unsigned int __k = 1; __k < max_iter; ++__k)
          {
            _Tp __term = std::pow(static_cast<_Tp>(__k), -__s);
            if (__term < std::numeric_limits<_Tp>::epsilon())
--- 83,91 ----
        if (__s < _Tp(1))
          std::__throw_domain_error(__N("Bad argument in zeta sum."));
  
!       const unsigned int __max_iter = 10000;
        _Tp __zeta = _Tp(0);
!       for (unsigned int __k = 1; __k < __max_iter; ++__k)
          {
            _Tp __term = std::pow(static_cast<_Tp>(__k), -__s);
            if (__term < std::numeric_limits<_Tp>::epsilon())
diff -Nrcpad gcc-16-20260315/libstdc++-v3/src/c++11/debug.cc gcc-16-20260322/libstdc++-v3/src/c++11/debug.cc
*** gcc-16-20260315/libstdc++-v3/src/c++11/debug.cc	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/src/c++11/debug.cc	Sun Mar 22 22:32:15 2026
*************** namespace __gnu_debug
*** 462,468 ****
      __it->_M_unlink();
      if (_M_const_iterators == __it)
        _M_const_iterators = __it->_M_next;
!     if (_M_iterators == __it)
        _M_iterators = __it->_M_next;
    }
  
--- 462,468 ----
      __it->_M_unlink();
      if (_M_const_iterators == __it)
        _M_const_iterators = __it->_M_next;
!     else if (_M_iterators == __it)
        _M_iterators = __it->_M_next;
    }
  
*************** namespace __gnu_debug
*** 711,717 ****
      __it->_M_unlink();
      if (_M_const_local_iterators == __it)
        _M_const_local_iterators = __it->_M_next;
!     if (_M_local_iterators == __it)
        _M_local_iterators = __it->_M_next;
    }
  
--- 711,717 ----
      __it->_M_unlink();
      if (_M_const_local_iterators == __it)
        _M_const_local_iterators = __it->_M_next;
!     else if (_M_local_iterators == __it)
        _M_local_iterators = __it->_M_next;
    }
  
diff -Nrcpad gcc-16-20260315/libstdc++-v3/src/c++17/fs_path.cc gcc-16-20260322/libstdc++-v3/src/c++17/fs_path.cc
*** gcc-16-20260315/libstdc++-v3/src/c++17/fs_path.cc	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/src/c++17/fs_path.cc	Sun Mar 22 22:32:15 2026
*************** path::operator+=(const path& p)
*** 927,935 ****
      return *this += p.native();
    // Handle p += *i where i is in [p.begin(),p.end()), for the same reason.
    if (_M_type() == _Type::_Multi && p._M_type() != _Type::_Multi)
!     for (const path& cmpt : *this)
!       if (&cmpt == &p) [[unlikely]]
  	return *this += p.native();
  
  #if _GLIBCXX_FILESYSTEM_IS_WINDOWS
    if (_M_type() == _Type::_Root_name
--- 927,937 ----
      return *this += p.native();
    // Handle p += *i where i is in [p.begin(),p.end()), for the same reason.
    if (_M_type() == _Type::_Multi && p._M_type() != _Type::_Multi)
!     {
!       const auto first = _M_cmpts.begin(), last = first + _M_cmpts.size();
!       if (!std::less<>()(&p, first) && std::less<>()(&p, last)) [[unlikely]]
  	return *this += p.native();
+     }
  
  #if _GLIBCXX_FILESYSTEM_IS_WINDOWS
    if (_M_type() == _Type::_Root_name
diff -Nrcpad gcc-16-20260315/libstdc++-v3/src/c++20/tzdb.cc gcc-16-20260322/libstdc++-v3/src/c++20/tzdb.cc
*** gcc-16-20260315/libstdc++-v3/src/c++20/tzdb.cc	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/src/c++20/tzdb.cc	Sun Mar 22 22:32:16 2026
***************
*** 35,46 ****
  #include <atomic>     // atomic<T*>, atomic<int>
  #include <memory>     // atomic<shared_ptr<T>>
  #include <mutex>      // mutex
  #if defined __GTHREADS && ! defined _GLIBCXX_HAS_GTHREADS
  # include <ext/concurrence.h> // __gnu_cxx::__mutex
  #endif
- #include <filesystem> // filesystem::read_symlink
  
! #ifndef _AIX
  # include <cstdlib>   // getenv
  #endif
  
--- 35,50 ----
  #include <atomic>     // atomic<T*>, atomic<int>
  #include <memory>     // atomic<shared_ptr<T>>
  #include <mutex>      // mutex
+ #include <iomanip>    // quoted
  #if defined __GTHREADS && ! defined _GLIBCXX_HAS_GTHREADS
  # include <ext/concurrence.h> // __gnu_cxx::__mutex
  #endif
  
! #if defined(_GLIBCXX_HAVE_READLINK) && defined(_GLIBCXX_HAVE_UNISTD_H)
! # include <unistd.h>  // readlink
! #endif
! 
! #ifdef _AIX
  # include <cstdlib>   // getenv
  #endif
  
*************** namespace std::chrono
*** 272,282 ****
        // If not, indic is unchanged. Callers should set a default first.
        friend istream& operator>>(istream& in, Indicator& indic)
        {
! 	auto [val, yes] = at_time::is_indicator(in.peek());
! 	if (yes)
  	  {
! 	    in.ignore(1);
! 	    indic = val;
  	  }
  	return in;
        }
--- 276,289 ----
        // If not, indic is unchanged. Callers should set a default first.
        friend istream& operator>>(istream& in, Indicator& indic)
        {
! 	if (!in.eof())
  	  {
! 	    auto [val, yes] = at_time::is_indicator(in.peek());
! 	    if (yes)
! 	      {
! 		in.ignore(1);
! 		indic = val;
! 	      }
  	  }
  	return in;
        }
*************** namespace std::chrono
*** 917,923 ****
  	  }
  
  	if (active_rule)
! 	  letters = active_rule->letters;
  	else if (first_std)
  	  letters = first_std->letters;
        }
--- 924,934 ----
  	  }
  
  	if (active_rule)
! 	  {
! 	    info.offset = ri.offset() + active_rule->save;
! 	    info.save = chrono::duration_cast<minutes>(active_rule->save);
! 	    letters = active_rule->letters;
! 	  }
  	else if (first_std)
  	  letters = first_std->letters;
        }
*************** namespace std::chrono
*** 1883,1910 ****
    tzdb::current_zone() const
    {
      // TODO cache this function's result?
  
  #if !defined(_AIX) && !defined(_GLIBCXX_HAVE_WINDOWS_H)
!     // Repeat the preprocessor condition used by filesystem::read_symlink,
!     // to avoid a dependency on src/c++17/fs_ops.o if it won't work anyway.
! #if defined(_GLIBCXX_HAVE_READLINK) && defined(_GLIBCXX_HAVE_SYS_STAT_H)
!     error_code ec;
!     // This should be a symlink to e.g. /usr/share/zoneinfo/Europe/London
!     auto path = filesystem::read_symlink("/etc/localtime", ec);
!     if (!ec)
        {
! 	auto first = path.begin(), last = path.end();
! 	if (std::distance(first, last) > 2)
  	  {
! 	    --last;
! 	    string name = last->string();
! 	    if (auto tz = do_locate_zone(this->zones, this->links, name))
! 	      return tz;
! 	    --last;
! 	    name = last->string() + '/' + name;
! 	    if (auto tz = do_locate_zone(this->zones, this->links, name))
  	      return tz;
  	  }
        }
  #endif
      // Otherwise, look for a file naming the time zone.
--- 1894,1980 ----
    tzdb::current_zone() const
    {
      // TODO cache this function's result?
+     // Could check the modification time of /etc/localtime, and not re-read
+     // it if it hasn't changed. reload_tzdb() could clear the cache too,
+     // to have a way to force a re-read.
  
  #if !defined(_AIX) && !defined(_GLIBCXX_HAVE_WINDOWS_H)
! #if defined(_GLIBCXX_HAVE_READLINK) && defined(_GLIBCXX_HAVE_UNISTD_H)
!     string_view str;
!     char buf[128]; // strlen("../usr/share/zoneinfo/...") is usually < 55
!     string dynbuf;
!     // /etc/localtime should be a symlink that ends with a zone name,
!     // e.g. /etc/localtime -> /usr/share/zoneinfo/Europe/London
!     // https://www.freedesktop.org/software/systemd/man/latest/localtime.html
!     // This should work on GNU/Linux, macOS, NetBSD, and OpenBSD.
!     // Some FreeBSD systems also use a symlink for /etc/localtime.
!     // Use readlink directly to avoid std::filesystem overhead.
!     if (auto n = ::readlink("/etc/localtime", buf, sizeof(buf)); n > 0)
        {
! 	if (static_cast<size_t>(n) < sizeof(buf))
! 	  str = string_view(buf, n);
! 	else [[unlikely]]
  	  {
! 	    // We read the symlink but it didn't fit in buf[], use dynbuf.
! 	    do
! 	      {
! 		n *= 2;
! 		dynbuf.__resize_and_overwrite(n, [](char* p, size_t len) {
! 		  auto n2 = ::readlink("/etc/localtime", p, len);
! 		  if (n2 == -1) // symlink removed or replaced by file?!
! 		    __throw_runtime_error("tzdb: error reading /etc/localtime");
! 		  const size_t r = n2;
! 		  return r < len ? r : 0;
! 		});
! 	      }
! 	    while (dynbuf.empty());
! 	    str = dynbuf;
! 	  }
!       }
! 
!     if (!str.empty())
!       {
! 	// Remove any redundant slashes so we can match zone names.
! 	// e.g. /usr/share/zoneinfo/Europe//London is a valid symlink,
! 	// but won't match against "Europe/London".
! 	if (auto pos = str.rfind("//"); pos != str.npos) [[unlikely]]
! 	  {
! 	    if (str.data() != dynbuf.data())
! 	      dynbuf = str;
! 	    string::size_type spos = pos;
! 	    do
! 	      {
! 		dynbuf.erase(spos, 1);
! 		spos = dynbuf.rfind("//", spos);
! 	      }
! 	    while (spos != dynbuf.npos);
! 	    str = dynbuf;
! 	  }
! 
! 	// Check the trailing components of the path against known zone names.
! 	// Valid IANA times zones can have one, two, or three parts, e.g.
! 	// "UTC", "Europe/London", and "America/Indiana/Indianapolis".
! 	// Custom tzdata.zi files could in theory use four or more parts.
! 
! 	auto pos = str.rfind('/');
! 	while (pos != str.npos && pos != 0)
! 	  {
! 	    if (auto tz = do_locate_zone(this->zones, this->links,
! 					 str.substr(pos + 1)))
  	      return tz;
+ 	    pos = str.rfind('/', pos - 1);
  	  }
+ 	// If we didn't match yet, try once more so that we will match
+ 	// a symlink to a relative path such as "Europe/London"
+ 	// or symlink to an absolute path such as "/Europe/London".
+ 	// Both cases seem unlikely because it would require either
+ 	// /etc/Europe or /Europe to be a directory (or a symlink to one)
+ 	// containing the TZif files, but it's theoretically possible.
+ 	// If pos==npos then pos+1 wraps to 0 and we use the whole string.
+ 	// If pos==0 then substr(1) discards the leading slash.
+ 	if (auto tz = do_locate_zone(this->zones, this->links,
+ 				     str.substr(pos + 1)))
+ 	  return tz;
        }
  #endif
      // Otherwise, look for a file naming the time zone.
*************** namespace std::chrono
*** 1941,1946 ****
--- 2011,2021 ----
  		  return tz;
  	      }
        }
+ 
+     // FIXME: For DragonFly BSD /etc/localtime is a copy of one of the
+     // zone files in /usr/share/zoneinfo so we need to compare its contents
+     // to each one until we find a match.
+ 
  #elif defined(_GLIBCXX_HAVE_WINDOWS_H)
      if (auto tz
  	= do_locate_zone(this->zones, this->links, detect_windows_zone()))
*************** namespace std::chrono
*** 2182,2191 ****
      istream& operator>>(istream& in, at_time& at)
      {
        int sign = 1;
!       if (in.peek() == '-')
  	{
  	  in.ignore(1);
! 	  if (auto [val, yes] = at_time::is_indicator(in.peek()); yes)
  	    {
  	      in.ignore(1);
  	      at.time = 0s;
--- 2257,2267 ----
      istream& operator>>(istream& in, at_time& at)
      {
        int sign = 1;
!       if (ws(in).peek() == '-')
  	{
  	  in.ignore(1);
! 	  if (auto [val, yes] = at_time::is_indicator(in.peek());
! 	      in.eof() || yes)
  	    {
  	      in.ignore(1);
  	      at.time = 0s;
*************** namespace std::chrono
*** 2204,2214 ****
  	  in.ignore(1); // discard the colon.
  	  in >> i;
  	  m = minutes{i};
! 	  if (in.peek() == ':')
  	    {
  	      in.ignore(1); // discard the colon.
  	      in >> i;
! 	      if (in.peek() == '.')
  		{
  		  double frac;
  		  in >> frac;
--- 2280,2290 ----
  	  in.ignore(1); // discard the colon.
  	  in >> i;
  	  m = minutes{i};
! 	  if (!in.eof() && in.peek() == ':')
  	    {
  	      in.ignore(1); // discard the colon.
  	      in >> i;
! 	      if (!in.eof() && in.peek() == '.')
  		{
  		  double frac;
  		  in >> frac;
*************** namespace std::chrono
*** 2285,2295 ****
  	  at_time t{};
  	  // XXX DAY should support ON format, e.g. lastSun or Sun>=8
  	  in >> m >> d >> t;
- 	  // XXX UNTIL field should be interpreted
- 	  // "using the rules in effect just before the transition"
- 	  // so might need to store as year_month_day and hh_mm_ss and only
- 	  // convert to a sys_time once we know the offset in effect.
  	  inf.m_until = sys_days(year(y)/m.m/day(d)) + seconds(t.time);
  	}
        else
  	inf.m_until = sys_days(year::max()/December/31);
--- 2361,2378 ----
  	  at_time t{};
  	  // XXX DAY should support ON format, e.g. lastSun or Sun>=8
  	  in >> m >> d >> t;
  	  inf.m_until = sys_days(year(y)/m.m/day(d)) + seconds(t.time);
+ 	  if (t.indicator != at_time::Universal)
+ 	    { // UNTIL uses "the rules in effect just before the transition"
+ 	      // adjust by STDOFF
+ 	      inf.m_until -= seconds(inf.m_offset);
+ 	      if (t.indicator != at_time::Standard)
+ 		{
+ 		  if (inf.m_expanded) // Not a named Rule, SAVE is known now.
+ 		    inf.m_until -= inf.m_save;
+ 		  // else Named Rule, SAVE is unknown. FIXME: PR 116110
+ 		}
+ 	    }
  	}
        else
  	inf.m_until = sys_days(year::max()/December/31);
diff -Nrcpad gcc-16-20260315/libstdc++-v3/src/c++23/std.cc.in gcc-16-20260322/libstdc++-v3/src/c++23/std.cc.in
*** gcc-16-20260315/libstdc++-v3/src/c++23/std.cc.in	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/src/c++23/std.cc.in	Sun Mar 22 22:32:16 2026
*************** export namespace std
*** 1384,1389 ****
--- 1384,1392 ----
    using std::range_format;
    using std::range_formatter;
  #endif
+ #if __glibcxx_print >= 202403L
+   using std::enable_nonlocking_formatter_optimization;
+ #endif
  }
  
  // <forward_list>
*************** export namespace std
*** 2055,2060 ****
--- 2058,2066 ----
    using std::start_lifetime_as;
    using std::start_lifetime_as_array;
  #endif
+ #ifdef __glibcxx_allocate_at_least
+   using std::allocation_result;
+ #endif
  }
  
  // 20.4 <memory_resource>
*************** export namespace std
*** 2556,2561 ****
--- 2562,2572 ----
    using std::uniform_random_bit_generator;
    using std::uniform_real_distribution;
    using std::weibull_distribution;
+ #if __cpp_lib_philox_engine
+   using std::philox_engine;
+   using std::philox4x32;
+   using std::philox4x64;
+ #endif
  }
  
  // <ranges>
*************** export namespace std
*** 2787,2792 ****
--- 2798,2806 ----
      using ranges::to_input_view;
      namespace views { using views::to_input; }
  #endif
+ #ifdef __cpp_lib_ranges_indices // C++ >= 26
+     namespace views { using views::indices; }
+ #endif
    }
  #if __glibcxx_ranges_to_container // C++ >= 23
    namespace ranges { using ranges::to; }
*************** export namespace std
*** 3552,3557 ****
--- 3566,3579 ----
    using std::is_implicit_lifetime;
    using std::is_implicit_lifetime_v;
  #endif
+ #if __cpp_impl_reflection >= 202506L
+   using std::is_reflection;
+   using std::is_reflection_v;
+ #if _GLIBCXX_USE_BUILTIN_TRAIT(__builtin_is_consteval_only)
+   using std::is_consteval_only;
+   using std::is_consteval_only_v;
+ #endif
+ #endif
  }
  
  // <typeindex>
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/17_intro/names.cc gcc-16-20260322/libstdc++-v3/testsuite/17_intro/names.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/17_intro/names.cc	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/testsuite/17_intro/names.cc	Sun Mar 22 22:32:16 2026
***************
*** 113,124 ****
--- 113,128 ----
  #define attributes (
  #define bin_op (
  #define clockid (
+ #define ext (
  #define func (
+ #define max_iter (
  #define max_val (
  #define min_val (
  #define object (
  #define ostr (
  #define policy (
+ #define ret (
+ #define subs (
  #define sz (
  #define tinfo (
  #define tmp (
***************
*** 126,131 ****
--- 130,136 ----
  #define value_t (
  
  #if __cplusplus < 201103L
+ #define mutex  (
  #define uses_allocator  (
  #endif
  
***************
*** 220,225 ****
--- 225,232 ----
  #define Proj2			Proj2 is not a reserved name
  #define Ptr			Ptr is not a reserved name
  #define Reference		Reference is not a reserved name
+ #define Rg			Rg is not a reserved name
+ #define Rs			Rs is not a reserved name
  #define Seq			Seq is not a reserved name
  #define Seq_RAIter		Seq_RAIter is not a reserved name
  #define Series			Series is not a reserved name
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/23_containers/mdspan/at.cc gcc-16-20260322/libstdc++-v3/testsuite/23_containers/mdspan/at.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/23_containers/mdspan/at.cc	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/testsuite/23_containers/mdspan/at.cc	Sun Mar 22 22:32:16 2026
*************** main()
*** 116,119 ****
--- 116,120 ----
    test_at<ThrowingInt, false, false>();
    test_at<MutatingInt, true, false>();
    test_at<RValueInt, true, false>();
+   test_at<ConstLValueInt, false, true>();
  }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_ints.cc gcc-16-20260322/libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_ints.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_ints.cc	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_ints.cc	Sun Mar 22 22:32:16 2026
*************** static_assert(std::is_constructible_v<st
*** 24,41 ****
  #endif
  
  // No implicit conversion from integer-like objects.
! template<typename Extent, typename... OExtents>
!   constexpr bool
    is_explicit()
    {
!     return std::is_nothrow_constructible_v<Extent, OExtents...>
! 	   && !std::is_convertible_v<Extent, OExtents...>;
    }
  
  static_assert(is_explicit<std::extents<int, 1>, int>());
  static_assert(is_explicit<std::extents<int, 1>, unsigned int>());
  static_assert(is_explicit<std::extents<unsigned int, 1>, int>());
  
  constexpr bool
  test_all()
  {
--- 24,53 ----
  #endif
  
  // No implicit conversion from integer-like objects.
! template<typename ExtentsType, typename OIndex, typename... RIndicies>
!   consteval bool
    is_explicit()
    {
!     if (!std::is_nothrow_constructible_v<ExtentsType, OIndex, RIndicies...>)
!       return false;
!     if constexpr (sizeof...(RIndicies) == 0)
!       if (std::is_convertible_v<OIndex, ExtentsType>)
! 	return false;
! 
!     extern void testConv(ExtentsType);
!     return !requires (OIndex index, RIndicies... rindicies)
!       { testConv({index, rindicies...}); };
    }
  
  static_assert(is_explicit<std::extents<int, 1>, int>());
  static_assert(is_explicit<std::extents<int, 1>, unsigned int>());
  static_assert(is_explicit<std::extents<unsigned int, 1>, int>());
  
+ static_assert(is_explicit<std::dextents<int, 1>, int>());
+ static_assert(is_explicit<std::dextents<int, 2>, int, int>());
+ static_assert(is_explicit<std::dextents<int, 3>, int, int, int>());
+ 
+ 	
  constexpr bool
  test_all()
  {
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/23_containers/mdspan/extents/custom_integer.cc gcc-16-20260322/libstdc++-v3/testsuite/23_containers/mdspan/extents/custom_integer.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/23_containers/mdspan/extents/custom_integer.cc	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/testsuite/23_containers/mdspan/extents/custom_integer.cc	Sun Mar 22 22:32:16 2026
*************** main()
*** 86,96 ****
--- 86,98 ----
    test_shape_all<ThrowingInt, false>();
    test_shape_all<MutatingInt, false>();
    test_shape_all<RValueInt, false>();
+   test_shape_all<ConstLValueInt, true>();
  
    test_pack_all<int, true>();
    test_pack_all<IntLike, true>();
    test_pack_all<ThrowingInt, false>();
    test_pack_all<MutatingInt, true>();
    test_pack_all<RValueInt, true>();
+   test_pack_all<ConstLValueInt, false>();
    return 0;
  }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/23_containers/mdspan/int_like.h gcc-16-20260322/libstdc++-v3/testsuite/23_containers/mdspan/int_like.h
*** gcc-16-20260315/libstdc++-v3/testsuite/23_containers/mdspan/int_like.h	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/testsuite/23_containers/mdspan/int_like.h	Sun Mar 22 22:32:16 2026
*************** enum class CustomIndexKind
*** 7,12 ****
--- 7,13 ----
    Throwing,
    Mutating,
    RValue,
+   ConstLValue,
  };
  
  template<CustomIndexKind Kind, bool Copyable = false>
*************** template<CustomIndexKind Kind, bool Copy
*** 57,62 ****
--- 58,72 ----
      requires (Kind == CustomIndexKind::RValue)
      { return value; }
  
+     constexpr
+     operator int() const& noexcept
+     requires (Kind == CustomIndexKind::ConstLValue)
+     { return value; }
+ 
+     operator int() const&&
+     requires (Kind == CustomIndexKind::ConstLValue)	   
+     = delete;
+ 
    private:
      int value;
    };
*************** using IntLike = CustomIndexType<CustomIn
*** 65,70 ****
--- 75,81 ----
  using ThrowingInt = CustomIndexType<CustomIndexKind::Throwing>;
  using MutatingInt = CustomIndexType<CustomIndexKind::Mutating>;
  using RValueInt = CustomIndexType<CustomIndexKind::RValue>;
+ using ConstLValueInt = CustomIndexType<CustomIndexKind::ConstLValue>;
  
  struct NotIntLike
  { };
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc gcc-16-20260322/libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc	Sun Mar 22 22:32:16 2026
*************** main()
*** 755,760 ****
--- 755,761 ----
    test_from_int_like<ThrowingInt, false, false>();
    test_from_int_like<MutatingInt, true, false>();
    test_from_int_like<RValueInt, true, false>();
+   test_from_int_like<ConstLValueInt, false, true>();
  
    test_from_opaque_accessor();
    test_from_base_class_accessor();
*************** main()
*** 767,772 ****
--- 768,774 ----
    test_access<ThrowingInt, false, false>();
    test_access<MutatingInt, true, false>();
    test_access<RValueInt, true, false>();
+   test_access<ConstLValueInt, false, true>();
  
    test_swap();
    static_assert(test_swap());
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/24_iterators/istreambuf_iterator/105580.cc gcc-16-20260322/libstdc++-v3/testsuite/24_iterators/istreambuf_iterator/105580.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/24_iterators/istreambuf_iterator/105580.cc	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/testsuite/24_iterators/istreambuf_iterator/105580.cc	Sun Mar 22 22:32:16 2026
***************
*** 1,5 ****
--- 1,6 ----
  // { dg-compile }
  // { dg-additional-options "-Wnull-dereference" }
+ // { dg-add-options no_pch }
  
  #include <string>
  #include <sstream>
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/24_iterators/range_operations/distance.cc gcc-16-20260322/libstdc++-v3/testsuite/24_iterators/range_operations/distance.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/24_iterators/range_operations/distance.cc	Sun Mar 15 22:32:17 2026
--- gcc-16-20260322/libstdc++-v3/testsuite/24_iterators/range_operations/distance.cc	Sun Mar 22 22:32:16 2026
*************** test06()
*** 154,159 ****
--- 154,176 ----
    VERIFY( std::ranges::distance(a+3, a) == -3 );
  }
  
+ void
+ test_lwg4242()
+ {
+   // LWG 4242. ranges::distance does not work with volatile iterators
+   int arr[] = {1, 2, 3};
+   int* volatile ptr = arr;
+   auto d1 = std::distance(ptr, arr + 3);
+   auto d2 = std::ranges::distance(ptr, arr + 3);
+   VERIFY( d1 == d2 );
+ 
+   // This is not part of LWG 4242 but it doesn't hurt to check it anyway:
+   volatile int vol_arr[1]{};
+   auto d3 = std::distance(vol_arr, vol_arr + 1);
+   auto d4 = std::ranges::distance(vol_arr, vol_arr + 1);
+   VERIFY( d3 == d4 );
+ }
+ 
  int
  main()
  {
*************** main()
*** 163,166 ****
--- 180,184 ----
    test04();
    test05();
    test06();
+   test_lwg4242();
  }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/29_atomics/atomic/compare_exchange_padding.cc gcc-16-20260322/libstdc++-v3/testsuite/29_atomics/atomic/compare_exchange_padding.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/29_atomics/atomic/compare_exchange_padding.cc	Sun Mar 15 22:32:18 2026
--- gcc-16-20260322/libstdc++-v3/testsuite/29_atomics/atomic/compare_exchange_padding.cc	Sun Mar 22 22:32:16 2026
***************
*** 1,22 ****
  // { dg-do run { target c++11 } }
  // { dg-require-atomic-cmpxchg-word "" }
  // { dg-add-options libatomic }
- // { dg-additional-options "-fno-tree-sra" }
  
  #include <atomic>
  #include <cstring>
  
  #include <testsuite_hooks.h>
  
! struct S { char c; short s; };
  
  void __attribute__((noinline,noipa))
  fill_struct(S& s)
  { std::memset(&s, 0xff, sizeof(S)); }
  
  bool
! compare_struct(const S& a, const S& b)
! { return std::memcmp(&a, &b, sizeof(S)) == 0; }
  
  int
  main ()
--- 1,52 ----
  // { dg-do run { target c++11 } }
  // { dg-require-atomic-cmpxchg-word "" }
  // { dg-add-options libatomic }
  
  #include <atomic>
  #include <cstring>
+ #include <cstdint>
  
  #include <testsuite_hooks.h>
  
! struct S
! {
!     char c;
!     alignas(2) std::int16_t s;
! 
!     bool operator==(const S& rhs) const { return c == rhs.c && s == rhs.s; }
! };
  
  void __attribute__((noinline,noipa))
  fill_struct(S& s)
  { std::memset(&s, 0xff, sizeof(S)); }
  
+ bool __attribute__((noinline,noipa))
+ padding_is_zero(const S& s)
+ {
+   unsigned char bytes[sizeof(S)];
+   std::memcpy(bytes, &s, sizeof(S));
+   return bytes[1] == 0;
+ }
+ 
  bool
! padding_is_zero(std::atomic<S>& a)
! {
!   const S dummy{};
! 
!   // a.load() does not necessarily preserve padding bits, because the
!   // temporary returned from a.load() might get SRA'd so that the two
!   // data members are copied in separate registers and padding bits are
!   // not copied.
!   S s = a.load();
! 
!   // So instead we use compare-exchange with an incorrect 'expected' value,
!   s.c = ~s.c;
!   // so that the compare will fail and return the value (including padding):
!   a.compare_exchange_weak(s, dummy);
! 
!   // Now we can inspect the padding bits to check they are zero:
!   return padding_is_zero(s);
! }
  
  int
  main ()
*************** main ()
*** 27,44 ****
    s.s = 42;
  
    std::atomic<S> as{ s };
!   auto ts = as.load(); // SRA might prevent copying of padding bits here.
!   VERIFY( !compare_struct(s, ts) ); // padding cleared on construction
    as.exchange(s);
!   auto es = as.load(); // SRA might prevent copying of padding bits here.
!   VERIFY( compare_struct(ts, es) ); // padding cleared on exchange
  
    S n;
    fill_struct(n);
    n.c = 'b';
    n.s = 71;
!   // padding cleared on compexchg
!   VERIFY( as.compare_exchange_weak(s, n) );
!   VERIFY( as.compare_exchange_strong(n, s) );
!   return 0;
  }
--- 57,91 ----
    s.s = 42;
  
    std::atomic<S> as{ s };
!   VERIFY( as.load() == s );      // members are set correctly
!   VERIFY( padding_is_zero(as) ); // but padding was cleared on construction
! 
!   ++s.s;
    as.exchange(s);
!   VERIFY( as.load() == s );      // members are set correctly
!   VERIFY( padding_is_zero(as) ); // but padding was cleared on construction
  
    S n;
    fill_struct(n);
    n.c = 'b';
    n.s = 71;
!   // padding in S ignored for compare, and padding in N not stored into AS:
!   VERIFY( as.compare_exchange_strong(s, n) );
!   VERIFY( as.load() == n );      // members are set correctly
!   VERIFY( padding_is_zero(as) ); // but padding was cleared on compare exchange
! 
!   S w;
!   fill_struct(w);
!   w.c = 'c';
!   w.s = 100;
!   // Weak compare exchange can fail spuriously, so loop a few times.
!   int count = 10;
!   do
!   {
!     VERIFY( --count ); // Should not keep failing indefinitely.
!     // padding in N ignored for compare, and padding in W not stored into AS:
!   } while ( ! as.compare_exchange_weak(n, w) );
!   auto ws = as.load(); // SRA might prevent copying of padding bits here.
!   VERIFY( as.load() == w );      // members are set correctly
!   VERIFY( padding_is_zero(as) ); // but padding was cleared on compare exchange
  }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/arithmetic.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/arithmetic.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/arithmetic.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/arithmetic.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,329 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ 
+ #include "test_setup.h"
+ 
+ static constexpr bool is_iec559 =
+ #ifdef __GCC_IEC_559
+       __GCC_IEC_559 >= 2;
+ #elif defined __STDC_IEC_559__
+       __STDC_IEC_559__ == 1;
+ #else
+       false;
+ #endif
+ 
+ #if VIR_NEXT_PATCH
+ template <typename V>
+   requires complex_like<typename V::value_type>
+   struct Tests<V>
+   {
+     using T = typename V::value_type;
+     using M = typename V::mask_type;
+     using Real = typename T::value_type;
+     using RealV = simd::rebind_t<Real, V>;
+ 
+     static_assert(std::is_floating_point_v<Real>);
+ 
+     static constexpr T min = std::numeric_limits<Real>::lowest();
+     static constexpr T norm_min = std::numeric_limits<Real>::min();
+     static constexpr T denorm_min = std::numeric_limits<Real>::denorm_min();
+     static constexpr T max = std::numeric_limits<Real>::max();
+     static constexpr T inf = std::numeric_limits<Real>::infinity();
+ 
+     ADD_TEST(plus_minus) {
+       std::tuple {V(), init_vec<V, C(1, 1), C(2, 2), C(3, 3)>},
+       [](auto& t, V x, V y) {
+ 	t.verify_equal(x + x, x);
+ 	t.verify_equal(x - x, x);
+ 	t.verify_equal(x + y, y);
+ 	t.verify_equal(y + x, y);
+ 	t.verify_equal(x - y, -y);
+ 	t.verify_equal(y - x, y);
+ 	t.verify_equal(x += T(1, -2), T(1, -2));
+ 	t.verify_equal(x = x + x, T(2, -4));
+ 	t.verify_equal(x = x - y, init_vec<V, C(1, -5), C(0, -6), C(-1, -7)>);
+ 	t.verify_equal(x, init_vec<V, C(1, -5), C(0, -6), C(-1, -7)>);
+       }
+     };
+ 
+     // complex multiplication & division has an edge case which is due to '-0. - -0.'. If we
+     // interpret negative zero to represent a value between denorm_min and 0 (exclusive) then we
+     // cannot know whether the resulting zero is negative or positive. ISO 60559 simply defines the
+     // result to be positive zero, but that's throwing away half of the truth.
+     //
+     // Consider (https://compiler-explorer.com/z/61cYhrE48):
+     // sqrt(x * complex{1.}) -> {0, +/-1}.
+     // The sign of the imaginary part depends on whether x is double{-1} or complex{-1.}. This is
+     // due to the type of the operand influencing the formula used for multiplication:
+     //
+     // 1. 'x * (u+iv)' is implemented as 'xu + i(xv)'
+     //
+     // 2. '(x+iy) * (u+iv)' is implemented as '(xu-yv) + i(xv+yu)'
+     //
+     // 'xv' is equal to -0 and 'yu' is equal to +0. Consequently the imaginary part in (1.) is -0
+     // and in (2.) it is (-0 + 0) which is +0. The example above then uses that difference to hit
+     // the branch cut on sqrt.
+ 
+     // (x+iy)(u+iv) = (xu-yv)+i(xv+yu)
+     // depending on FMA contraction or FLT_EVAL_METHOD 'inf - inf' can be 0, inf, -inf, or NaN (no
+     // contraction).
+     //
+     // Because of all these issues, verify_equal is implemented to interpret "an infinity" as equal
+     // to another infinity according to the interpretation of C23 Annex G.3.
+ 
+     ADD_TEST(multiplication_corner_cases) {
+       std::array {min, norm_min, denorm_min, max, inf},
+       [](auto& t, V x) {
+ 	t.verify_equal(x * x, x[0] * x[0]);
+ 	const V y = x * T(1, 1);
+ 	t.verify_equal(y * y, y[0] * y[0])(y);
+ 	x *= T(0, 1);
+ 	t.verify_equal(x * x, x[0] * x[0]);
+ 	x *= T(1, 1);
+ 	t.verify_equal(x * x, x[0] * x[0])(x);
+ 	x *= T(1, Real(.5));
+ 	t.verify_equal(x * x, x[0] * x[0])(x);
+       }
+     };
+ 
+     ADD_TEST(multiplication) {
+       std::tuple {V(), V(RealV(1), RealV()), V(RealV(), RealV(1)), init_vec<V, C(0, 2), C(2, 0), C(-1, 2)>},
+       [](auto& t, V x, V one, V I, V z) {
+ 	t.verify_equal(x * x, x);
+ 	t.verify_equal(x * z, x);
+ 	t.verify_equal(z * x, x);
+ 	t.verify_equal(one * one, one);
+ 	t.verify_equal(one * z, z);
+ 	t.verify_equal(z * one, z);
+ 
+ 	// Notes:
+ 	// inf + -inf -> NaN
+ 	//  0. + -0.  -> 0. (this is arbitrary, why not NaN: indeterminable sign?)
+ 	// complex(0.) * -complex(2., 2.) -> (0, -0)
+ 	//         0.  * -complex(2., 2.) -> (-0, -0)
+ 	//  => the *type* of the operand determines the sign of the zero, which is *impossible*
+ 	//     to implement with vec<complex>!
+ 	// complex(DBL_MAX, DBL_MAX) * complex(2., 2.) -> (-nan, inf) => θ got lost
+ 	// complex(1.) / complex(0., 0.) -> (inf, -nan) => θ got lost
+ 	// complex(1.) / complex(-0., 0.) -> (inf, -nan) => θ got lost
+ 	// complex(1.) / complex(0., -0.) -> (inf, -nan) => θ got lost
+ 	// complex(1.) / complex(-DBL_INF, 0.) -> (-0, -0) => θ is wrong
+ 
+ 	t.verify_bit_equal(one * I, I);
+ 
+ 	// (0+i0) * (-0-i0) -> (-0 + 0) + i(-0 + -0) -> 0-i0
+ 	t.verify_bit_equal(x * -x, T() * -T());
+ 	t.verify_bit_equal(-x * x, -T() * T());
+ 
+ 	t.verify_bit_equal(x * conj(x), T() * conj(T()));
+ 	t.verify_bit_equal(x * -conj(x), T() * -conj(T()));
+ 
+ 	// real * complex has extra overloads on complex but not on vec<complex>
+ 	// for vec<complex> the result therefore needs to be "bit equal" only to
+ 	// complex * complex
+ 	t.verify_equal(x.real() * -x, T().real() * -T());
+ 	t.verify_bit_equal(x.real() * -x, T() * -T());
+ 
+ 	t.verify_bit_equal(I * one, I);
+ 	t.verify_bit_equal(I * I, T(-1, 0));
+ 	t.verify_bit_equal(z * I, init_vec<V, C(-2, 0), C(0., 2.), C(-2, -1)>);
+ 	t.verify_bit_equal(std::complex{-0., 0.} * std::complex{0., 1.}, std::complex{-0., 0.});
+ 	t.verify_bit_equal(std::complex{-0., -1.} * std::complex{0., 0.}, std::complex{0., -0.});
+ 	t.verify_bit_equal(0. + -0., 0.);
+       }
+     };
+   };
+ #endif
+ 
+ template <typename V>
+   struct Tests
+   {
+     using T = typename V::value_type;
+     using M = typename V::mask_type;
+ 
+     static constexpr T min = std::numeric_limits<T>::lowest();
+     static constexpr T norm_min = std::numeric_limits<T>::min();
+     static constexpr T max = std::numeric_limits<T>::max();
+ 
+     ADD_TEST(plus0, requires(T x) { x + x; }) {
+       std::tuple{V(), init_vec<V, 1, 2, 3, 4, 5, 6, 7>},
+       [](auto& t, V x, V y) {
+ 	t.verify_equal(x + x, x);
+ 	t.verify_equal(x = x + T(1), T(1));
+ 	t.verify_equal(x + x, T(2));
+ 	t.verify_equal(x = x + y, init_vec<V, 2, 3, 4, 5, 6, 7, 8>);
+ 	t.verify_equal(x = x + -y, T(1));
+ 	t.verify_equal(x += y, init_vec<V, 2, 3, 4, 5, 6, 7, 8>);
+ 	t.verify_equal(x, init_vec<V, 2, 3, 4, 5, 6, 7, 8>);
+ 	t.verify_equal(x += -y, T(1));
+ 	t.verify_equal(x, T(1));
+       }
+     };
+ 
+     ADD_TEST(plus1, requires(T x) { x + x; }) {
+       std::tuple{test_iota<V>},
+       [](auto& t, V x) {
+ 	t.verify_equal(x + std::cw<0>, x);
+ 	t.verify_equal(std::cw<0> + x, x);
+ 	t.verify_equal(x + T(), x);
+ 	t.verify_equal(T() + x, x);
+ 	t.verify_equal(x + -x, V());
+ 	t.verify_equal(-x + x, V());
+       }
+     };
+ 
+     ADD_TEST(minus0, requires(T x) { x - x; }) {
+       std::tuple{T(1), T(0), init_vec<V, 1, 2, 3, 4, 5, 6, 7>},
+       [](auto& t, V x, V y, V z) {
+ 	t.verify_equal(x - y, x);
+ 	t.verify_equal(x - T(1), y);
+ 	t.verify_equal(y, x - T(1));
+ 	t.verify_equal(x - x, y);
+ 	t.verify_equal(x = z - x, init_vec<V, 0, 1, 2, 3, 4, 5, 6>);
+ 	t.verify_equal(x = z - x, V(1));
+ 	t.verify_equal(z -= x, init_vec<V, 0, 1, 2, 3, 4, 5, 6>);
+ 	t.verify_equal(z, init_vec<V, 0, 1, 2, 3, 4, 5, 6>);
+ 	t.verify_equal(z -= z, V(0));
+ 	t.verify_equal(z, V(0));
+       }
+     };
+ 
+     ADD_TEST(minus1, requires(T x) { x - x; }) {
+       std::tuple{test_iota<V>},
+       [](auto& t, V x) {
+ 	t.verify_equal(x - x, V());
+ 	t.verify_equal(x - std::cw<0>, x);
+ 	t.verify_equal(std::cw<0> - x, -x);
+ 	t.verify_equal(x - T(), x);
+ 	t.verify_equal(T() - x, -x);
+       }
+     };
+ 
+     ADD_TEST(times0, requires(T x) { x * x; }) {
+       std::tuple{T(0), T(1), T(2)},
+       [](auto& t, T v0, T v1, T v2) {
+ 	V x = v1;
+ 	V y = v0;
+ 	t.verify_equal(x * y, y);
+ 	t.verify_equal(x = x * T(2), T(2));
+ 	t.verify_equal(x * x, T(4));
+ 	y = init_vec<V, 1, 2, 3, 4, 5, 6, 7>;
+ 	t.verify_equal(x = x * y, init_vec<V, 2, 4, 6, 8, 10, 12, 14>);
+ 	y = v2;
+ 	// don't test norm_min/2*2 in the following. There's no guarantee, in
+ 	// general, that the result isn't flushed to zero (e.g. NEON without
+ 	// subnormals)
+ 	for (T n : {T(max - T(1)), std::is_floating_point_v<T> ? T(norm_min * T(3)) : min})
+ 	  {
+ 	    x = T(n / 2);
+ 	    t.verify_equal(x * y, V(n));
+ 	  }
+ 	if (std::is_integral<T>::value && std::is_unsigned<T>::value)
+ 	  {
+ 	    // test modulo arithmetics
+ 	    T n = max;
+ 	    x = n;
+ 	    for (T m : {T(2), T(7), T(max / 127), max})
+ 	      {
+ 		y = m;
+ 		// if T is of lower rank than int, `n * m` will promote to int
+ 		// before executing the multiplication. In this case an overflow
+ 		// will be UB (and ubsan will warn about it). The solution is to
+ 		// cast to uint in that case.
+ 		using U
+ 		  = std::conditional_t<(sizeof(T) < sizeof(int)), unsigned, T>;
+ 		t.verify_equal(x * y, V(T(U(n) * U(m))));
+ 	      }
+ 	  }
+ 	x = v2;
+ 	t.verify_equal(x *= init_vec<V, 1, 2, 3>, init_vec<V, 2, 4, 6>);
+ 	t.verify_equal(x, init_vec<V, 2, 4, 6>);
+       }
+     };
+ 
+     ADD_TEST(times1, requires(T x) { x * x; }) {
+       std::tuple{test_iota<V, 0, 11>},
+       [](auto& t, V x) {
+ 	t.verify_equal(x * x, V([](int i) { return T(T(i % 12) * T(i % 12)); }));
+ 	t.verify_equal(x * std::cw<1>, x);
+ 	t.verify_equal(std::cw<1> * x, x);
+ 	t.verify_equal(x * T(1), x);
+ 	t.verify_equal(T(1) * x, x);
+ 	t.verify_equal(x * T(-1), -x);
+ 	t.verify_equal(T(-1) * x, -x);
+       }
+     };
+ 
+     // avoid testing subnormals and expect minor deltas for non-IEC559 float
+     ADD_TEST(divide0, std::is_floating_point_v<T> && !is_iec559) {
+       std::tuple{T(2), init_vec<V, 1, 2, 3, 4, 5, 6, 7>},
+       [](auto& t, V x, V y) {
+ 	t.verify_equal_to_ulp(x / x, V(T(1)), 1);
+ 	t.verify_equal_to_ulp(T(3) / x, V(T(3) / T(2)), 1);
+ 	t.verify_equal_to_ulp(x / T(3), V(T(2) / T(3)), 1);
+ 	t.verify_equal_to_ulp(y / x, init_vec<V, .5, 1, 1.5, 2, 2.5, 3, 3.5>, 1);
+       }
+     };
+ 
+     // avoid testing subnormals and expect minor deltas for non-IEC559 float
+     ADD_TEST(divide1, std::is_floating_point_v<T> && !is_iec559) {
+       std::array{T{norm_min * 1024}, T{1}, T{}, T{-1}, T{max / 1024}, T{max / T(4.1)}, max, min},
+       [](auto& t, V a) {
+ 	V b = std::cw<2>;
+ 	V ref([&](int i) { return a[i] / 2; });
+ 	t.verify_equal_to_ulp(a / b, ref, 1);
+ 	a = select(a == std::cw<0>, T(1), a);
+ 	// -freciprocal-math together with flush-to-zero makes
+ 	// the following range restriction necessary (i.e.
+ 	// 1/|a| must be >= min). Intel vrcpps and vrcp14ps
+ 	// need some extra slack (use 1.1 instead of 1).
+ 	a = select(fabs(a) >= T(1.1) / norm_min, T(1), a);
+ 	t.verify_equal_to_ulp(a / a, V(1), 1)("\na = ", a);
+ 	ref = V([&](int i) { return 2 / a[i]; });
+ 	t.verify_equal_to_ulp(b / a, ref, 1)("\na = ", a);
+ 	t.verify_equal_to_ulp(b /= a, ref, 1);
+ 	t.verify_equal_to_ulp(b, ref, 1);
+       }
+     };
+ 
+     ADD_TEST(divide2, (is_iec559 || !std::is_floating_point_v<T>) && requires(T x) { x / x; }) {
+       std::tuple{T(2), init_vec<V, 1, 2, 3, 4, 5, 6, 7>, init_vec<V, T(max), T(norm_min)>,
+ 		 init_vec<V, T(norm_min), T(max)>, init_vec<V, T(max), T(norm_min) + 1>},
+       [](auto& t, V x, V y, V z, V a, V b) {
+ 	t.verify_equal(x / x, V(1));
+ 	t.verify_equal(T(3) / x, V(T(3) / T(2)));
+ 	t.verify_equal(x / T(3), V(T(2) / T(3)));
+ 	t.verify_equal(y / x, init_vec<V, .5, 1, 1.5, 2, 2.5, 3, 3.5>);
+ 	V ref = init_vec<V, T(max / 2), T(norm_min / 2)>;
+ 	t.verify_equal(z / x, ref);
+ 	ref = init_vec<V, T(norm_min / 2), T(max / 2)>;
+ 	t.verify_equal(a / x, ref);
+ 	t.verify_equal(b / b, V(1));
+ 	ref = init_vec<V, T(2 / max), T(2 / (norm_min + 1))>;
+ 	t.verify_equal(x / b, ref);
+ 	t.verify_equal(x /= b, ref);
+ 	t.verify_equal(x, ref);
+       }
+     };
+ 
+     static constexpr V from0 = test_iota<V, 0, 63>;
+     static constexpr V from1 = test_iota<V, 1, 64>;
+     static constexpr V from2 = test_iota<V, 2, 65>;
+ 
+     ADD_TEST(incdec, requires(T x) { ++x; x++; --x; x--; }) {
+       std::tuple{from0},
+       [](auto& t, V x) {
+ 	t.verify_equal(x++, from0);
+ 	t.verify_equal(x, from1);
+ 	t.verify_equal(++x, from2);
+ 	t.verify_equal(x, from2);
+ 
+ 	t.verify_equal(x--, from2);
+ 	t.verify_equal(x, from1);
+ 	t.verify_equal(--x, from0);
+ 	t.verify_equal(x, from0);
+       }
+     };
+   };
+ 
+ #include "create_tests.h"
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/arithmetic_expensive.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/arithmetic_expensive.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/arithmetic_expensive.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/arithmetic_expensive.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,7 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ // { dg-timeout-factor 2 }
+ // { dg-require-effective-target run_expensive_tests }
+ 
+ #define EXPENSIVE_TESTS 1
+ #include "arithmetic.cc" // { dg-prune-output "Wpsabi" }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/create_tests.h gcc-16-20260322/libstdc++-v3/testsuite/std/simd/create_tests.h
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/create_tests.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/create_tests.h	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,15 ----
+ #include <stdfloat>
+ 
+ void create_tests()
+ {
+   template for (auto t : {char(), short(), unsigned(), 0l, 0ull, float(), double()})
+     {
+       using T = decltype(t);
+ #ifndef EXPENSIVE_TESTS
+       [[maybe_unused]] Tests<simd::vec<T>> test;
+ #else
+       [[maybe_unused]] Tests<simd::vec<T, simd::vec<T>::size() + 3>> test0;
+       [[maybe_unused]] Tests<simd::vec<T, 1>> test1;
+ #endif
+     }
+ }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/creation.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/creation.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/creation.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/creation.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,69 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ 
+ #include "test_setup.h"
+ 
+ template <typename V>
+   struct Tests
+   {
+     using T = typename V::value_type;
+     using M = typename V::mask_type;
+ 
+     ADD_TEST(VecCatChunk) {
+       std::tuple{test_iota<V>, test_iota<V, 1>},
+       [](auto& t, const V v0, const V v1) {
+ 	auto c = cat(v0, v1);
+ 	t.verify_equal(c.size(), V::size() * 2);
+ 	for (int i = 0; i < V::size(); ++i)
+ 	  t.verify_equal(c[i], v0[i])(i);
+ 	for (int i = 0; i < V::size(); ++i)
+ 	  t.verify_equal(c[i + V::size()], v1[i])(i);
+ 	const auto [c0, c1] = simd::chunk<V>(c);
+ 	t.verify_equal(c0, v0);
+ 	t.verify_equal(c1, v1);
+ 	if constexpr (V::size() <= 35)
+ 	  {
+ 	    auto d = cat(v1, c, v0);
+ 	    for (int i = 0; i < V::size(); ++i)
+ 	      {
+ 		t.verify_equal(d[i], v1[i])(i);
+ 		t.verify_equal(d[i + V::size()], v0[i])(i);
+ 		t.verify_equal(d[i + 2 * V::size()], v1[i])(i);
+ 		t.verify_equal(d[i + 3 * V::size()], v0[i])(i);
+ 	      }
+ 	    const auto [...chunked] = simd::chunk<3>(d);
+ 	    t.verify_equal(cat(chunked...), d);
+ 	  }
+       }
+     };
+ 
+     ADD_TEST(MaskCatChunk) {
+       std::tuple{M([](int i) { return 1 == (i & 1); }), M([](int i) { return 1 == (i % 3); })},
+       [](auto& t, const M k0, const M k1) {
+ 	auto c = cat(k0, k1);
+ 	t.verify_equal(c.size(), V::size() * 2);
+ 	for (int i = 0; i < V::size(); ++i)
+ 	  t.verify_equal(c[i], k0[i])(i);
+ 	for (int i = 0; i < V::size(); ++i)
+ 	  t.verify_equal(c[i + V::size()], k1[i])(i);
+ 	const auto [c0, c1] = simd::chunk<M>(c);
+ 	t.verify_equal(c0, k0);
+ 	t.verify_equal(c1, k1);
+ 	if constexpr (V::size() <= 35)
+ 	  {
+ 	    auto d = cat(k1, c, k0);
+ 	    for (int i = 0; i < V::size(); ++i)
+ 	      {
+ 		t.verify_equal(d[i], k1[i])(i);
+ 		t.verify_equal(d[i + V::size()], k0[i])(i);
+ 		t.verify_equal(d[i + 2 * V::size()], k1[i])(i);
+ 		t.verify_equal(d[i + 3 * V::size()], k0[i])(i);
+ 	      }
+ 	    const auto [...chunked] = simd::chunk<3>(d);
+ 	    t.verify_equal(cat(chunked...), d);
+ 	  }
+       }
+     };
+   };
+ 
+ #include "create_tests.h" // { dg-prune-output "Wpsabi" }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/creation_expensive.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/creation_expensive.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/creation_expensive.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/creation_expensive.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,7 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ // { dg-timeout-factor 2 }
+ // { dg-require-effective-target run_expensive_tests }
+ 
+ #define EXPENSIVE_TESTS 1
+ #include "creation.cc" // { dg-prune-output "Wpsabi" }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/loads.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/loads.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/loads.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/loads.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,121 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ 
+ #include "test_setup.h"
+ #include <numeric>
+ 
+ template <typename T, std::size_t N, std::size_t Alignment>
+   class alignas(Alignment) aligned_array
+     : public std::array<T, N>
+   {};
+ 
+ template <typename V>
+   struct Tests
+   {
+     using T = typename V::value_type;
+     using M = typename V::mask_type;
+ 
+     static_assert(simd::alignment_v<V> <= 256);
+ 
+     ADD_TEST(load_zeros) {
+       std::tuple {aligned_array<T, V::size * 2, 256> {}, aligned_array<int, V::size * 2, 256> {}},
+       [](auto& t, auto mem, auto ints) {
+ 	t.verify_equal(simd::unchecked_load<V>(mem), V());
+ 	t.verify_equal(simd::partial_load<V>(mem), V());
+ 
+ 	t.verify_equal(simd::unchecked_load<V>(mem, simd::flag_aligned), V());
+ 	t.verify_equal(simd::partial_load<V>(mem, simd::flag_aligned), V());
+ 
+ 	t.verify_equal(simd::unchecked_load<V>(mem, simd::flag_overaligned<256>), V());
+ 	t.verify_equal(simd::partial_load<V>(mem, simd::flag_overaligned<256>), V());
+ 
+ 	t.verify_equal(simd::unchecked_load<V>(mem.begin() + 1, mem.end()), V());
+ 	t.verify_equal(simd::partial_load<V>(mem.begin() + 1, mem.end()), V());
+ 	t.verify_equal(simd::partial_load<V>(mem.begin() + 1, mem.begin() + 1), V());
+ 	t.verify_equal(simd::partial_load<V>(mem.begin() + 1, mem.begin() + 2), V());
+ 
+ 	t.verify_equal(simd::unchecked_load<V>(ints, simd::flag_convert), V());
+ 	t.verify_equal(simd::partial_load<V>(ints, simd::flag_convert), V());
+ 
+ 	t.verify_equal(simd::unchecked_load<V>(mem, M(true)), V());
+ 	t.verify_equal(simd::unchecked_load<V>(mem, M(false)), V());
+ 	t.verify_equal(simd::partial_load<V>(mem, M(true)), V());
+ 	t.verify_equal(simd::partial_load<V>(mem, M(false)), V());
+       }
+     };
+ 
+     static constexpr V ref = test_iota<V, 1, 0>;
+     static constexpr V ref1 = V([](int i) { return i == 0 ? T(1): T(); });
+ 
+     template <typename U>
+     static constexpr auto
+     make_iota_array()
+     {
+       aligned_array<U, V::size * 2, simd::alignment_v<V, U>> arr = {};
+       U init = 0;
+       for (auto& x : arr) x = (init += U(1));
+       return arr;
+     }
+ 
+     ADD_TEST(load_iotas, requires {T() + T(1);}) {
+       std::tuple {make_iota_array<T>(), make_iota_array<int>()},
+       [](auto& t, auto mem, auto ints) {
+ 	t.verify_equal(simd::unchecked_load<V>(mem), ref);
+ 	t.verify_equal(simd::partial_load<V>(mem), ref);
+ 
+ 	t.verify_equal(simd::unchecked_load<V>(mem.begin() + 1, mem.end()), ref + T(1));
+ 	t.verify_equal(simd::partial_load<V>(mem.begin() + 1, mem.end()), ref + T(1));
+ 	t.verify_equal(simd::partial_load<V>(mem.begin(), mem.begin() + 1), ref1);
+ 
+ 	t.verify_equal(simd::unchecked_load<V>(mem, simd::flag_aligned), ref);
+ 	t.verify_equal(simd::partial_load<V>(mem, simd::flag_aligned), ref);
+ 
+ 	t.verify_equal(simd::unchecked_load<V>(ints, simd::flag_convert), ref);
+ 	t.verify_equal(simd::partial_load<V>(ints, simd::flag_convert), ref);
+ 	t.verify_equal(simd::partial_load<V>(
+ 			 ints.begin(), ints.begin(), simd::flag_convert), V());
+ 	t.verify_equal(simd::partial_load<V>(
+ 			 ints.begin(), ints.begin() + 1, simd::flag_convert), ref1);
+ 
+ 	t.verify_equal(simd::unchecked_load<V>(mem, M(true)), ref);
+ 	t.verify_equal(simd::unchecked_load<V>(mem, M(false)), V());
+ 	t.verify_equal(simd::partial_load<V>(mem, M(true)), ref);
+ 	t.verify_equal(simd::partial_load<V>(mem, M(false)), V());
+       }
+     };
+ 
+     static constexpr M alternating = M([](int i) { return 1 == (i & 1); });
+     static constexpr V ref_k = select(alternating, ref, T());
+     static constexpr V ref_2 = select(M([](int i) { return i < 2; }), ref, T());
+     static constexpr V ref_k_2 = select(M([](int i) { return i < 2; }), ref_k, T());
+ 
+     ADD_TEST(masked_loads) {
+       std::tuple {make_iota_array<T>(), make_iota_array<int>(), alternating, M(true), M(false)},
+       [](auto& t, auto mem, auto ints, M k, M tr, M fa) {
+ 	t.verify_equal(simd::unchecked_load<V>(mem, tr), ref);
+ 	t.verify_equal(simd::unchecked_load<V>(mem, fa), V());
+ 	t.verify_equal(simd::unchecked_load<V>(mem, k), ref_k);
+ 
+ 	t.verify_equal(simd::unchecked_load<V>(ints, tr, simd::flag_convert), ref);
+ 	t.verify_equal(simd::unchecked_load<V>(ints, fa, simd::flag_convert), V());
+ 	t.verify_equal(simd::unchecked_load<V>(ints, k, simd::flag_convert), ref_k);
+ 
+ 	t.verify_equal(simd::partial_load<V>(mem, tr), ref);
+ 	t.verify_equal(simd::partial_load<V>(mem, fa), V());
+ 	t.verify_equal(simd::partial_load<V>(mem, k), ref_k);
+ 
+ 	t.verify_equal(simd::partial_load<V>(mem.begin(), mem.begin() + 2, tr), ref_2);
+ 	t.verify_equal(simd::partial_load<V>(mem.begin(), mem.begin() + 2, fa), V());
+ 	t.verify_equal(simd::partial_load<V>(mem.begin(), mem.begin() + 2, k), ref_k_2);
+ 
+ 	t.verify_equal(simd::partial_load<V>(ints.begin(), ints.begin() + 2, tr,
+ 					     simd::flag_convert), ref_2);
+ 	t.verify_equal(simd::partial_load<V>(ints.begin(), ints.begin() + 2, fa,
+ 					     simd::flag_convert), V());
+ 	t.verify_equal(simd::partial_load<V>(ints.begin(), ints.begin() + 2, k,
+ 					     simd::flag_convert), ref_k_2);
+       }
+     };
+   };
+ 
+ #include "create_tests.h"
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/loads_expensive.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/loads_expensive.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/loads_expensive.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/loads_expensive.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,7 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ // { dg-timeout-factor 2 }
+ // { dg-require-effective-target run_expensive_tests }
+ 
+ #define EXPENSIVE_TESTS 1
+ #include "loads.cc" // { dg-prune-output "Wpsabi" }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/mask.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/mask.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/mask.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/mask.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,112 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ 
+ #include "test_setup.h"
+ #include <utility>
+ 
+ namespace simd = std::simd;
+ 
+ template <std::size_t B, typename A>
+   consteval std::size_t
+   element_size(const simd::basic_mask<B, A>&)
+   { return B; }
+ 
+ template <typename V>
+   struct Tests
+   {
+     using T = typename V::value_type;
+     using M = typename V::mask_type;
+ 
+     ADD_TEST(Sanity) {
+       std::tuple{M([](int i) { return 1 == (i & 1); })},
+       [](auto& t, const M k) {
+ 	t.verify_equal(element_size(k), sizeof(T));
+ 	for (int i = 0; i < k.size(); i += 2)
+ 	  t.verify_equal(k[i], false)(k);
+ 	for (int i = 1; i < k.size(); i += 2)
+ 	  t.verify_equal(k[i], true)(k);
+       }
+     };
+ 
+     ADD_TEST(Reductions) {
+       std::tuple{M([](int i) { return 1 == (i & 1); }), M(true), M(false)},
+       [](auto& t, const M k, const M tr, const M fa) {
+ 	t.verify(!all_of(k))(k);
+ 	if constexpr (V::size() > 1)
+ 	  {
+ 	    t.verify(any_of(k))(k);
+ 	    t.verify(!none_of(k))(k);
+ 	  }
+ 
+ 	t.verify(all_of(tr));
+ 	t.verify(any_of(tr));
+ 	t.verify(!none_of(tr));
+ 
+ 	t.verify(!all_of(fa));
+ 	t.verify(!any_of(fa));
+ 	t.verify(none_of(fa));
+       }
+     };
+ 
+     ADD_TEST(CvtToInt, (sizeof(T) <= sizeof(0ull))) {
+       std::tuple{M([](int i) { return 1 == (i & 1); }), M(true), M(false), M([](int i) {
+ 		   return i % 13 == 0 || i % 7 == 0;
+       })},
+       [](auto& t, const M k, const M tr, const M fa, const M k2) {
+ 	t.verify_equal(V(+tr), V(1));
+ 	t.verify_equal(V(+fa), V());
+ 	t.verify_equal(V(+k), init_vec<V, 0, 1>);
+ 
+ 	if constexpr (std::is_integral_v<T>)
+ 	  {
+ 	    t.verify_equal(V(~tr), ~V(1));
+ 	    t.verify_equal(V(~fa), ~V(0));
+ 	    t.verify_equal(V(~k), ~init_vec<V, 0, 1>);
+ 	  }
+ 
+ 	t.verify(all_of(simd::rebind_t<char, M>(tr)));
+ 	t.verify(!all_of(simd::rebind_t<char, M>(fa)));
+ 	t.verify(!all_of(simd::rebind_t<char, M>(k)));
+ 
+ 	t.verify_equal(fa.to_ullong(), 0ull);
+ 	t.verify_equal(fa.to_bitset(), std::bitset<V::size()>());
+ 
+ 	// test whether 'M -> bitset -> M' is an identity transformation
+ 	t.verify_equal(M(fa.to_bitset()), fa)(fa.to_bitset());
+ 	t.verify_equal(M(tr.to_bitset()), tr)(tr.to_bitset());
+ 	t.verify_equal(M(k.to_bitset()), k)(k.to_bitset());
+ 	t.verify_equal(M(k2.to_bitset()), k2)(k2.to_bitset());
+ 
+ 	static_assert(sizeof(0ull) * CHAR_BIT == 64);
+ 	if constexpr (V::size() <= 64)
+ 	  {
+ 	    constexpr unsigned long long full = -1ull >> (64 - V::size());
+ 	    t.verify_equal(tr.to_ullong(), full)(std::hex, tr.to_ullong(), '^', full, "->",
+ 						 tr.to_ullong() ^ full);
+ 	    t.verify_equal(tr.to_bitset(), full);
+ 
+ 	    constexpr unsigned long long alternating = 0xaaaa'aaaa'aaaa'aaaaULL & full;
+ 	    t.verify_equal(k.to_ullong(), alternating)(std::hex, k.to_ullong(), '^', alternating,
+ 						       "->", k.to_ullong() ^ alternating);
+ 	    t.verify_equal(k.to_bitset(), alternating);
+ 
+ 	    // 0, 7, 13, 14, 21, 26, 28, 35, 39, 42, 49, 52, 56, 63, 65, ...
+ 	    constexpr unsigned long long bits7_13 = 0x8112'0488'1420'6081ULL & full;
+ 	    t.verify_equal(k2.to_ullong(), bits7_13)(std::hex, k2.to_ullong());
+ 	  }
+ 	else
+ 	  {
+ 	    constexpr unsigned long long full = -1ull;
+ 	    constexpr unsigned long long alternating = 0xaaaa'aaaa'aaaa'aaaaULL;
+ 	    int shift = M::size() - 64;
+ 	    t.verify_equal((tr.to_bitset() >> shift).to_ullong(), full);
+ 	    t.verify_equal((k.to_bitset() >> shift).to_ullong(), alternating);
+ 	  }
+ 
+ 	t.verify_equal(+tr, -(-tr));
+ 	t.verify_equal(-+tr, -tr);
+       }
+     };
+   };
+ 
+ #include "create_tests.h" // { dg-prune-output "Wpsabi" }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/mask2.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/mask2.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/mask2.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/mask2.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,108 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ 
+ #include "test_setup.h"
+ #include <utility>
+ 
+ template <typename V>
+   struct Tests
+   {
+     using T = typename V::value_type;
+     using M = typename V::mask_type;
+ 
+     static constexpr M alternating = M([](int i) { return 1 == (i & 1); });
+     static constexpr M k010 = M([](int i) { return 1 == (i % 3); });
+     static constexpr M k00111 = M([](int i) { return 2 < (i % 5); });
+ 
+     ADD_TEST(mask_conversion) {
+       std::array {alternating, k010, k00111},
+       [](auto& t, M k) {
+ 	template for (auto tmp : {char(), short(), int(), double()})
+ 	  {
+ 	    using U = decltype(tmp);
+ 	    using M2 = simd::rebind_t<U, M>;
+ 	    using M3 = simd::mask<U, V::size()>;
+ 	    const M2 ref2 = M2([&](int i) { return k[i]; });
+ 	    t.verify_equal(M2(k), ref2);
+ 	    t.verify_equal(M(M2(k)), k);
+ 	    if constexpr (!std::is_same_v<M2, M3>)
+ 	      {
+ 		const M3 ref3 = M3([&](int i) { return k[i]; });
+ 		t.verify_equal(M3(k), ref3);
+ 		t.verify_equal(M(M3(k)), k);
+ 		t.verify_equal(M2(M3(k)), ref2);
+ 		t.verify_equal(M3(M2(k)), ref3);
+ 	      }
+ 	  }
+       }
+     };
+ 
+     ADD_TEST(mask_reductions_sanity) {
+       std::tuple {M(true)},
+       [](auto& t, M x) {
+ 	t.verify_equal(std::simd::reduce_min_index(x), 0);
+ 	t.verify_equal(std::simd::reduce_max_index(x), V::size - 1);
+ 	t.verify_precondition_failure("An empty mask does not have a min_index.", [&] {
+ 	  std::simd::reduce_min_index(!x);
+ 	});
+ 	t.verify_precondition_failure("An empty mask does not have a max_index.", [&] {
+ 	  std::simd::reduce_max_index(!x);
+ 	});
+       }
+     };
+ 
+     ADD_TEST(mask_reductions) {
+       std::tuple{test_iota<V>, test_iota<V> == T(0)},
+       [](auto& t, V v, M k0) {
+ 	// Caveat:
+ 	// k0[n0 * (test_iota_max<V> + 1)] is true if it exists
+ 	// k[n * (test_iota_max<V> + 1) + i] is true if it exists
+ 	// none_of(k) is true if i > test_iota_max<V>
+ 	// by construction of test_iota_max:
+ 	static_assert(test_iota_max<V> < V::size());
+ 	for (int i = 0; i < int(test_iota_max<V>) + 1; ++i)
+ 	  {
+ 	    M k = v == T(i);
+ 
+ 	    const int nk = 1 + (V::size() - i - 1) / (test_iota_max<V> + 1);
+ 	    const int maxk = (nk - 1) * (test_iota_max<V> + 1) + i;
+ 	    t.verify(maxk < V::size());
+ 
+ 	    const int nk0 = 1 + (V::size() - 1) / (test_iota_max<V> + 1);
+ 	    const int maxk0 = (nk0 - 1) * (test_iota_max<V> + 1);
+ 	    t.verify(maxk0 < V::size());
+ 
+ 	    const int maxkork0 = std::max(maxk, maxk0);
+ 
+ 	    t.verify_equal(k[i], true);
+ 	    t.verify_equal(std::as_const(k)[i], true);
+ 	    t.verify_equal(std::simd::reduce_min_index(k), i)(k);
+ 	    t.verify_equal(std::simd::reduce_max_index(k), maxk)(k);
+ 	    t.verify_equal(std::simd::reduce_min_index(k || k0), 0);
+ 	    t.verify_equal(std::simd::reduce_max_index(k || k0), maxkork0);
+ 	    t.verify_equal(k, k);
+ 	    t.verify_not_equal(!k, k);
+ 	    t.verify_equal(k | k, k);
+ 	    t.verify_equal(k & k, k);
+ 	    t.verify(none_of(k ^ k));
+ 	    t.verify_equal(std::simd::reduce_count(k), nk);
+ 	    if constexpr (sizeof(T) <= sizeof(0ULL))
+ 	      t.verify_equal(-std::simd::reduce(-k), nk)(k)(-k);
+ 	    t.verify_equal(std::simd::reduce_count(!k), V::size - nk)(!k);
+ 	    if constexpr (V::size <= 128 && sizeof(T) <= sizeof(0ULL))
+ 	      t.verify_equal(-std::simd::reduce(-!k), V::size - nk)(-!k);
+ 	    t.verify(any_of(k));
+ 	    t.verify(bool(any_of(k & k0) ^ (i != 0)));
+ 	    k = M([&](int j) { return j == 0 ? true : k[j]; });
+ 	    t.verify_equal(k[i], true);
+ 	    t.verify_equal(std::as_const(k)[i], true);
+ 	    t.verify_equal(k[0], true);
+ 	    t.verify_equal(std::as_const(k)[0], true);
+ 	    t.verify_equal(std::simd::reduce_min_index(k), 0)(k);
+ 	    t.verify_equal(std::simd::reduce_max_index(k), maxk)(k);
+ 	  }
+       }
+     };
+   };
+ 
+ #include "create_tests.h" // { dg-prune-output "Wpsabi" }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/mask2_expensive.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/mask2_expensive.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/mask2_expensive.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/mask2_expensive.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,7 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ // { dg-require-effective-target run_expensive_tests }
+ // { dg-timeout-factor 2 }
+ 
+ #define EXPENSIVE_TESTS 1
+ #include "mask2.cc" // { dg-prune-output "Wpsabi" }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/mask_expensive.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/mask_expensive.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/mask_expensive.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/mask_expensive.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,7 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ // { dg-timeout-factor 2 }
+ // { dg-require-effective-target run_expensive_tests }
+ 
+ #define EXPENSIVE_TESTS 1
+ #include "mask.cc" // { dg-prune-output "Wpsabi" }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/reductions.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/reductions.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/reductions.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/reductions.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,90 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ 
+ #include "test_setup.h"
+ 
+ template <typename T, std::size_t N, std::size_t Alignment>
+   class alignas(Alignment) aligned_array
+     : public std::array<T, N>
+   {};
+ 
+ inline constexpr std::multiplies<> mul;
+ inline constexpr std::bit_and<> bit_and;
+ inline constexpr std::bit_or<> bit_or;
+ inline constexpr std::bit_xor<> bit_xor;
+ 
+ inline constexpr auto my_add = [](auto a, auto b) { return a + b; };
+ 
+ template <typename V>
+   struct Tests
+   {
+     using T = typename V::value_type;
+     using M = typename V::mask_type;
+ 
+     static_assert(simd::alignment_v<V> <= 256);
+ 
+     static consteval V
+     poisoned(T x)
+     {
+       if constexpr (sizeof(V) == sizeof(T) * V::size())
+ 	return V(x);
+       else
+ 	{
+ 	  using P = simd::resize_t<sizeof(V) / sizeof(T), V>;
+ 	  static_assert(P::size() > V::size());
+ 	  constexpr auto [...is] = std::_IotaArray<P::size()>;
+ 	  const T arr[P::size()] = {(is < V::size() ? x : T(7))...};
+ 	  return std::bit_cast<V>(P(arr));
+ 	}
+     }
+ 
+     ADD_TEST(Sum) {
+       std::tuple {poisoned(0), poisoned(1)},
+       [](auto& t, V v0, V v1) {
+ 	t.verify_equal(simd::reduce(v0), T(0));
+ 	t.verify_equal(simd::reduce(v1), T(V::size()));
+       }
+     };
+ 
+     ADD_TEST(Product) {
+       std::tuple {poisoned(0), poisoned(1)},
+       [](auto& t, V v0, V v1) {
+ 	t.verify_equal(simd::reduce(v0, mul), T(0));
+ 	t.verify_equal(simd::reduce(v1, mul), T(1));
+       }
+     };
+ 
+     ADD_TEST(UnknownSum) {
+       std::tuple {poisoned(0), poisoned(1)},
+       [](auto& t, V v0, V v1) {
+ 	t.verify_equal(simd::reduce(v0, my_add), T(0));
+ 	t.verify_equal(simd::reduce(v1, my_add), T(V::size()));
+       }
+     };
+ 
+     ADD_TEST(And, std::is_integral_v<T>) {
+       std::tuple {poisoned(0), poisoned(1)},
+       [](auto& t, V v0, V v1) {
+ 	t.verify_equal(simd::reduce(v0, bit_and), T(0));
+ 	t.verify_equal(simd::reduce(v1, bit_and), T(1));
+       }
+     };
+ 
+     ADD_TEST(Or, std::is_integral_v<T>) {
+       std::tuple {poisoned(0), poisoned(1)},
+       [](auto& t, V v0, V v1) {
+ 	t.verify_equal(simd::reduce(v0, bit_or), T(0));
+ 	t.verify_equal(simd::reduce(v1, bit_or), T(1));
+       }
+     };
+ 
+     ADD_TEST(Xor, std::is_integral_v<T>) {
+       std::tuple {poisoned(0), poisoned(1)},
+       [](auto& t, V v0, V v1) {
+ 	t.verify_equal(simd::reduce(v0, bit_xor), T(0));
+ 	t.verify_equal(simd::reduce(v1, bit_xor), T(V::size() & 1));
+       }
+     };
+   };
+ 
+ #include "create_tests.h"
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/reductions_expensive.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/reductions_expensive.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/reductions_expensive.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/reductions_expensive.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,7 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ // { dg-timeout-factor 2 }
+ // { dg-require-effective-target run_expensive_tests }
+ 
+ #define EXPENSIVE_TESTS 1
+ #include "reductions.cc"
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/shift_left.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/shift_left.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/shift_left.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/shift_left.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,67 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ 
+ #include "test_setup.h"
+ 
+ template <typename V>
+   requires (V::size() * sizeof(typename V::value_type) <= 70 * 4) // avoid exploding RAM usage
+   struct Tests<V>
+   {
+     using T = typename V::value_type;
+     using M = typename V::mask_type;
+ 
+     static constexpr int max = sizeof(T) == 8 ? 64 : 32;
+ 
+     ADD_TEST_N(known_shift, 4, std::is_integral_v<T>) {
+       std::tuple {test_iota<V, 0, 0>},
+       []<int N>(auto& t, const V x) {
+ 	constexpr int shift = max * (N + 1) / 4 - 1;
+ 	constexpr V vshift = T(shift);
+ 	const V vshiftx = vshift ^ (x & std::cw<1>);
+ 	V ref([](T i) -> T { return i << shift; });
+ 	V refx([](T i) -> T { return i << (shift ^ (i & 1)); });
+ 	t.verify_equal(x << shift, ref)("{:d} << {:d}", x, shift);
+ 	t.verify_equal(x << vshift, ref)("{:d} << {:d}", x, vshift);
+ 	t.verify_equal(x << vshiftx, refx)("{:d} << {:d}", x, vshiftx);
+ 	const auto y = ~x;
+ 	ref = V([](T i) -> T { return T(~i) << shift; });
+ 	refx = V([](T i) -> T { return T(~i) << (shift ^ (i & 1)); });
+ 	t.verify_equal(y << shift, ref)("{:d} << {:d}", y, shift);
+ 	t.verify_equal(y << vshift, ref)("{:d} << {:d}", y, vshift);
+ 	t.verify_equal(y << vshiftx, refx)("{:d} << {:d}", y, vshiftx);
+       }
+     };
+ 
+     ADD_TEST(unknown_shift, std::is_integral_v<T>) {
+       std::tuple {test_iota<V, 0, 0>},
+       [](auto& t, const V x) {
+ 	if !consteval
+ 	{
+ 	  for (int shift = 0; shift < max; ++shift)
+ 	    {
+ 	      const auto y = ~x;
+ 	      shift = make_value_unknown(shift);
+ 	      const V vshift = T(shift);
+ 	      V ref([=](T i) -> T { return i << shift; });
+ 	      t.verify_equal(x << shift, ref)("{:d} << {:d}", y, shift);
+ 	      t.verify_equal(x << vshift, ref)("{:d} << {:d}", y, vshift);
+ 	      ref = V([=](T i) -> T { return T(~i) << shift; });
+ 	      t.verify_equal(y << shift, ref)("{:d} << {:d}", y, shift);
+ 	      t.verify_equal(y << vshift, ref)("{:d} << {:d}", y, vshift);
+ 	    }
+ 	}
+       }
+     };
+   };
+ 
+ template <typename V>
+   struct Tests
+   {};
+ 
+ void create_tests()
+ {
+   template for (auto t : {char(), short(), unsigned(), 0l, 0ull})
+     [[maybe_unused]] Tests<simd::vec<decltype(t)>> test;
+   template for (constexpr int n : {1, 3, 17})
+     [[maybe_unused]] Tests<simd::vec<int, n>> test;
+ }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/shift_left_expensive.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/shift_left_expensive.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/shift_left_expensive.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/shift_left_expensive.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,7 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ // { dg-timeout-factor 2 }
+ // { dg-require-effective-target run_expensive_tests }
+ 
+ #define EXPENSIVE_TESTS 1
+ #include "shift_left.cc"
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/shift_right.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/shift_right.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/shift_right.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/shift_right.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,91 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ 
+ #include "test_setup.h"
+ 
+ template <typename V>
+   requires (V::size() * sizeof(typename V::value_type) <= 70 * 4) // avoid exploding RAM usage
+   struct Tests<V>
+   {
+     using T = typename V::value_type;
+     using M = typename V::mask_type;
+ 
+     static constexpr int max = sizeof(T) == 8 ? 64 : 32;
+ 
+     ADD_TEST_N(known_shift, 4, std::is_integral_v<T>) {
+       std::tuple {test_iota<V>},
+       []<int N>(auto& t, const V x) {
+ 	constexpr int shift = max * (N + 1) / 4 - 1;
+ 	constexpr T tmax = std::numeric_limits<T>::max();
+ 	constexpr V vshift = T(shift);
+ 	const V vshiftx = vshift ^ (x & std::cw<1>);
+ 	t.verify(__is_const_known(vshift));
+ 
+ 	V ref([&](int i) -> T { return x[i] >> shift; });
+ 	V refx([&](int i) -> T { return x[i] >> (shift ^ (i & 1)); });
+ 	t.verify_equal(x >> shift, ref)("{:d} >> {:d}", x, shift);
+ 	t.verify_equal(x >> vshift, ref)("{:d} >> {:d}", x, vshift);
+ 	t.verify_equal(x >> vshiftx, refx)("{:d} >> {:d}", x, vshiftx);
+ 
+ 	const V y = ~x;
+ 	ref = V([&](int i) -> T { return T(~x[i]) >> shift; });
+ 	refx = V([&](int i) -> T { return T(~x[i]) >> (shift ^ (i & 1)); });
+ 	t.verify_equal(y >> shift, ref)("{:d} >> {:d}", y, shift);
+ 	t.verify_equal(y >> vshift, ref)("{:d} >> {:d}", y, vshift);
+ 	t.verify_equal(y >> vshiftx, refx)("{:d} >> {:d}", y, vshiftx);
+ 
+ 	const V z = tmax - x;
+ 	ref = V([&](int i) -> T { return T(tmax - x[i]) >> shift; });
+ 	refx = V([&](int i) -> T { return T(tmax - x[i]) >> (shift ^ (i & 1)); });
+ 	t.verify_equal(z >> shift, ref)("{:d} >> {:d}", z, shift);
+ 	t.verify_equal(z >> vshift, ref)("{:d} >> {:d}", z, vshift);
+ 	t.verify_equal(z >> vshiftx, refx)("{:d} >> {:d}", z, vshiftx);
+       }
+     };
+ 
+     ADD_TEST(unknown_shift, std::is_integral_v<T>) {
+       std::tuple {test_iota<V>},
+       [](auto& t, const V x) {
+ 	for (int shift = 0; shift < max; ++shift)
+ 	  {
+ 	    constexpr T tmax = std::numeric_limits<T>::max();
+ 	    const V vshift = T(shift);
+ 	    const V vshiftx = vshift ^ (x & std::cw<1>);
+ 	    t.verify(std::is_constant_evaluated()
+ 		       || (!is_const_known(vshift) && !is_const_known(shift)));
+ 
+ 	    V ref([&](int i) -> T { return x[i] >> shift; });
+ 	    V refx([&](int i) -> T { return x[i] >> (shift ^ (i & 1)); });
+ 	    t.verify_equal(x >> shift, ref)("{:d} >> {:d}", x, shift);
+ 	    t.verify_equal(x >> vshift, ref)("{:d} >> {:d}", x, vshift);
+ 	    t.verify_equal(x >> vshiftx, refx)("{:d} >> {:d}", x, vshiftx);
+ 
+ 	    const V y = ~x;
+ 	    ref = V([&](int i) -> T { return T(~x[i]) >> shift; });
+ 	    refx = V([&](int i) -> T { return T(~x[i]) >> (shift ^ (i & 1)); });
+ 	    t.verify_equal(y >> shift, ref)("{:d} >> {:d}", y, shift);
+ 	    t.verify_equal(y >> vshift, ref)("{:d} >> {:d}", y, vshift);
+ 	    t.verify_equal(y >> vshiftx, refx)("{:d} >> {:d}", y, vshiftx);
+ 
+ 	    const V z = tmax - x;
+ 	    ref = V([&](int i) -> T { return T(tmax - x[i]) >> shift; });
+ 	    refx = V([&](int i) -> T { return T(tmax - x[i]) >> (shift ^ (i & 1)); });
+ 	    t.verify_equal(z >> shift, ref)("{:d} >> {:d}", z, shift);
+ 	    t.verify_equal(z >> vshift, ref)("{:d} >> {:d}", z, vshift);
+ 	    t.verify_equal(z >> vshiftx, refx)("{:d} >> {:d}", z, vshiftx);
+ 	  }
+       }
+     };
+   };
+ 
+ template <typename V>
+   struct Tests
+   {};
+ 
+ void create_tests()
+ {
+   template for (auto t : {char(), short(), unsigned(), 0l, 0ull})
+     [[maybe_unused]] Tests<simd::vec<decltype(t)>> test;
+   template for (constexpr int n : {1, 3, 17})
+     [[maybe_unused]] Tests<simd::vec<int, n>> test;
+ }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/shift_right_expensive.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/shift_right_expensive.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/shift_right_expensive.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/shift_right_expensive.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,7 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ // { dg-timeout-factor 2 }
+ // { dg-require-effective-target run_expensive_tests }
+ 
+ #define EXPENSIVE_TESTS 1
+ #include "shift_right.cc"
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/simd_alg.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/simd_alg.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/simd_alg.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/simd_alg.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,137 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ 
+ #include "test_setup.h"
+ #include <utility>
+ 
+ template <typename V>
+   struct Tests
+   {
+     using T = typename V::value_type;
+ 
+     using M = typename V::mask_type;
+ 
+     using pair = std::pair<V, V>;
+     static constexpr std::conditional_t<std::is_floating_point_v<T>, short, T> x_max
+       = test_iota_max<V, 1>;
+     static constexpr int x_max_int = static_cast<int>(x_max);
+ 
+     static constexpr V
+     reverse_iota(const V x)
+     {
+       if constexpr (std::is_enum_v<T>)
+ 	{
+ 	  using Vu = simd::rebind_t<std::underlying_type_t<T>, V>;
+ 	  return static_cast<V>(std::to_underlying(x_max) - static_cast<Vu>(x));
+ 	}
+       else
+ 	return x_max - x;
+     }
+ 
+     ADD_TEST(Select) {
+       std::tuple{test_iota<V, 0, 63>, test_iota<V, 1, 64>, T(2),
+ 		 M([](int i) { return 1 == (i & 1); }),
+ 		 M([](int i) { return 1 == (i % 3); })},
+       [](auto& t, const V x, const V y, const T z, const M k, const M k3) {
+ 	t.verify_equal(select(M(true), x, y), x);
+ 	t.verify_equal(select(M(false), x, y), y);
+ 	t.verify_equal(select(M(true), y, x), y);
+ 	t.verify_equal(select(M(false), y, x), x);
+ 	t.verify_equal(select(k, x, T()),
+ 		       V([](int i) { return (1 == (i & 1)) ? T(i & 63) : T(); }));
+ 
+ 	t.verify_equal(select(M(true), z, T()), z);
+ 	t.verify_equal(select(M(true), T(), z), V());
+ 	t.verify_equal(select(k, z, T()), V([](int i) { return (1 == (i & 1)) ? T(2) : T(); }));
+ 	t.verify_equal(select(k3, z, T()), V([](int i) { return (1 == (i % 3)) ? T(2) : T(); }));
+       }
+     };
+ 
+     ADD_TEST(Min, std::totally_ordered<T>) {
+       std::tuple{test_iota<V, 0, -1>, reverse_iota(test_iota<V, 0, -1>), test_iota<V, 1>},
+       [](auto& t, const V x, const V y, const V x1) {
+ 	t.verify_equal(min(x, x), x);
+ 	t.verify_equal(min(V(), x), V());
+ 	t.verify_equal(min(x, V()), V());
+ 	if constexpr (std::is_signed_v<T>)
+ 	  {
+ 	    t.verify_equal(min(-x, x), -x);
+ 	    t.verify_equal(min(x, -x), -x);
+ 	  }
+ 	t.verify_equal(min(x1, x), x);
+ 	t.verify_equal(min(x, x1), x);
+ 	t.verify_equal(min(x, y), min(y, x));
+ 	t.verify_equal(min(x, y), V([](int i) {
+ 				    i %= x_max_int;
+ 				    return std::min(T(x_max_int - i), T(i));
+ 				  }));
+       }
+     };
+ 
+     ADD_TEST(Max, std::totally_ordered<T>) {
+       std::tuple{test_iota<V, 0, -1>, reverse_iota(test_iota<V, 0, -1>), test_iota<V, 1>},
+       [](auto& t, const V x, const V y, const V x1) {
+ 	t.verify_equal(max(x, x), x);
+ 	t.verify_equal(max(V(), x), x);
+ 	t.verify_equal(max(x, V()), x);
+ 	if constexpr (std::is_signed_v<T>)
+ 	  {
+ 	    t.verify_equal(max(-x, x), x);
+ 	    t.verify_equal(max(x, -x), x);
+ 	  }
+ 	t.verify_equal(max(x1, x), x1);
+ 	t.verify_equal(max(x, x1), x1);
+ 	t.verify_equal(max(x, y), max(y, x));
+ 	t.verify_equal(max(x, y), V([](int i) {
+ 				    i %= x_max_int;
+ 				    return std::max(T(x_max_int - i), T(i));
+ 				  }));
+       }
+     };
+ 
+     ADD_TEST(Minmax, std::totally_ordered<T>) {
+       std::tuple{test_iota<V, 0, -1>, reverse_iota(test_iota<V, 0, -1>), test_iota<V, 1>},
+       [](auto& t, const V x, const V y, const V x1) {
+ 	t.verify_equal(minmax(x, x), pair{x, x});
+ 	t.verify_equal(minmax(V(), x), pair{V(), x});
+ 	t.verify_equal(minmax(x, V()), pair{V(), x});
+ 	if constexpr (std::is_signed_v<T>)
+ 	  {
+ 	    t.verify_equal(minmax(-x, x), pair{-x, x});
+ 	    t.verify_equal(minmax(x, -x), pair{-x, x});
+ 	  }
+ 	t.verify_equal(minmax(x1, x), pair{x, x1});
+ 	t.verify_equal(minmax(x, x1), pair{x, x1});
+ 	t.verify_equal(minmax(x, y), minmax(y, x));
+ 	t.verify_equal(minmax(x, y),
+ 		       pair{V([](int i) {
+ 			      i %= x_max_int;
+ 			      return std::min(T(x_max_int - i), T(i));
+ 			    }),
+ 			    V([](int i) {
+ 			      i %= x_max_int;
+ 			      return std::max(T(x_max_int - i), T(i));
+ 			    })});
+       }
+     };
+ 
+     ADD_TEST(Clamp, std::totally_ordered<T>) {
+       std::tuple{test_iota<V>, reverse_iota(test_iota<V>)},
+       [](auto& t, const V x, const V y) {
+ 	t.verify_equal(clamp(x, V(), x), x);
+ 	t.verify_equal(clamp(x, x, x), x);
+ 	t.verify_equal(clamp(V(), x, x), x);
+ 	t.verify_equal(clamp(V(), V(), x), V());
+ 	t.verify_equal(clamp(x, V(), V()), V());
+ 	t.verify_equal(clamp(x, V(), y), min(x, y));
+ 	t.verify_equal(clamp(y, V(), x), min(x, y));
+ 	if constexpr (std::is_signed_v<T>)
+ 	  {
+ 	    t.verify_equal(clamp(V(T(-test_iota_max<V>)), -x, x), -x);
+ 	    t.verify_equal(clamp(V(T(test_iota_max<V>)), -x, x), x);
+ 	  }
+       }
+     };
+   };
+ 
+ #include "create_tests.h"
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/simd_alg_expensive.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/simd_alg_expensive.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/simd_alg_expensive.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/simd_alg_expensive.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,7 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ // { dg-timeout-factor 2 }
+ // { dg-require-effective-target run_expensive_tests }
+ 
+ #define EXPENSIVE_TESTS 1
+ #include "simd_alg.cc" // { dg-prune-output "Wpsabi" }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/sse_intrin.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/sse_intrin.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/sse_intrin.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/sse_intrin.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,42 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ 
+ #include "test_setup.h"
+ 
+ #ifdef __SSE__
+ #include <x86intrin.h>
+ #endif
+ 
+ template <typename V>
+   struct Tests
+   {
+     using T = typename V::value_type;
+     using M = typename V::mask_type;
+ 
+     ADD_TEST(misc, !simd::__scalar_abi_tag<typename V::abi_type>) {
+       std::tuple{init_vec<V, 0, 100, 2, 54, 3>},
+       [](auto& t, V x) {
+ 	t.verify_equal(x, x);
+ 	if !consteval
+ 	{
+ #ifdef __SSE__
+ 	  V r = x;
+ 	  if constexpr (sizeof(x) == 16 && std::is_same_v<T, float>)
+ 	    t.verify_equal(r = _mm_and_ps(x, x), x);
+ #endif
+ #ifdef __SSE2__
+ 	  if constexpr (sizeof(x) == 16 && std::is_integral_v<T>)
+ 	    t.verify_equal(r = _mm_and_si128(x, x), x);
+ 	  if constexpr (sizeof(x) == 16 && std::is_same_v<T, double>)
+ 	    t.verify_equal(r = _mm_and_pd(x, x), x);
+ #endif
+ 	}
+       }
+     };
+   };
+ 
+ void create_tests()
+ {
+   template for (auto t : {char(), short(), unsigned(), 0l, 0ull, float(), double()})
+     [[maybe_unused]] Tests<simd::vec<decltype(t), 16 / sizeof(t)>> test;
+ }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/stores.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/stores.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/stores.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/stores.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,67 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ 
+ #include "test_setup.h"
+ 
+ template <typename V>
+   struct Tests
+   {
+     using T = typename V::value_type;
+     using M = typename V::mask_type;
+ 
+     static_assert(simd::alignment_v<V> <= 256);
+ 
+     ADD_TEST(stores, requires {T() + T(1);}) {
+       std::tuple {test_iota<V, 1, 0>, std::array<T, V::size * 2> {}, std::array<int, V::size * 2> {}},
+       [](auto& t, const V v, const auto& mem_init, const auto& ints_init) {
+ 	alignas(256) std::array<T, V::size * 2> mem = mem_init;
+ 	alignas(256) std::array<int, V::size * 2> ints = ints_init;
+ 
+ 	simd::unchecked_store(v, mem, simd::flag_aligned);
+ 	simd::unchecked_store(v, mem.begin() + V::size(), mem.end());
+ 	for (int i = 0; i < V::size; ++i)
+ 	  {
+ 	    t.verify_equal(mem[i], T(i + 1));
+ 	    t.verify_equal(mem[V::size + i], T(i + 1));
+ 	  }
+ #if VIR_NEXT_PATCH
+ 	if constexpr (complex_like<T>)
+ 	  {
+ 	  }
+ 	else
+ #endif
+ 	  {
+ 	    simd::unchecked_store(v, ints, simd::flag_convert);
+ 	    simd::partial_store(v, ints.begin() + V::size() + 1, ints.end(),
+ 			      simd::flag_convert | simd::flag_overaligned<alignof(int)>);
+ 	    for (int i = 0; i < V::size; ++i)
+ 	      {
+ 		t.verify_equal(ints[i], int(T(i + 1)));
+ 		t.verify_equal(ints[V::size + i], int(T(i)));
+ 	      }
+ 
+ 	    simd::unchecked_store(V(), ints.begin(), V::size(), simd::flag_convert);
+ 	    simd::unchecked_store(V(), ints.begin() + V::size(), V::size(), simd::flag_convert);
+ 	    for (int i = 0; i < 2 * V::size; ++i)
+ 	      t.verify_equal(ints[i], 0)("i =", i);
+ 
+ 	    if constexpr (V::size() > 1)
+ 	      {
+ 		simd::partial_store(v, ints.begin() + 1, V::size() - 2, simd::flag_convert);
+ 		for (int i = 0; i < V::size - 2; ++i)
+ 		  t.verify_equal(ints[i], int(T(i)));
+ 		t.verify_equal(ints[V::size - 1], 0);
+ 		t.verify_equal(ints[V::size], 0);
+ 	      }
+ 	    else
+ 	      {
+ 		simd::partial_store(v, ints.begin() + 1, 0, simd::flag_convert);
+ 		t.verify_equal(ints[0], 0);
+ 		t.verify_equal(ints[1], 0);
+ 	      }
+ 	  }
+       }
+     };
+   };
+ 
+ #include "create_tests.h"
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/stores_expensive.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/stores_expensive.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/stores_expensive.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/stores_expensive.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,7 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target x86 }
+ // { dg-timeout-factor 2 }
+ // { dg-require-effective-target run_expensive_tests }
+ 
+ #define EXPENSIVE_TESTS 1
+ #include "stores.cc"
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/test_setup.h gcc-16-20260322/libstdc++-v3/testsuite/std/simd/test_setup.h
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/test_setup.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/test_setup.h	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,809 ----
+ // Test framework for <simd> -*- C++ -*-
+ 
+ // Copyright The GNU Toolchain Authors.
+ //
+ // 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/>.
+ 
+ #ifndef SIMD_TEST_SETUP_H
+ #define SIMD_TEST_SETUP_H
+ 
+ #include <bits/simd_details.h>
+ #include <string_view>
+ 
+ namespace test
+ {
+   struct precondition_failure
+   {
+     std::string_view file;
+     int line;
+     std::string_view expr;
+     std::string_view msg;
+   };
+ 
+ #undef __glibcxx_simd_precondition
+ 
+ #define __glibcxx_simd_precondition(expr, msg, ...) \
+   do {                                              \
+     if (__builtin_expect(!bool(expr), false))       \
+       throw test::precondition_failure{__FILE__, __LINE__, #expr, msg}; \
+   } while(false)
+ }
+ 
+ #undef _GLIBCXX_SIMD_NOEXCEPT
+ #define _GLIBCXX_SIMD_NOEXCEPT noexcept(false)
+ 
+ #include <simd>
+ 
+ #include <source_location>
+ #include <iostream>
+ #include <concepts>
+ #include <cfenv>
+ #include <vector>
+ #include <cstdint>
+ #include <climits>
+ 
+ // global objects
+ static std::vector<void(*)()> test_functions = {};
+ 
+ static std::int64_t passed_tests = 0;
+ 
+ static std::int64_t failed_tests = 0;
+ 
+ static std::string_view test_name = "unknown";
+ 
+ // ------------------------------------------------
+ 
+ namespace simd = std::simd;
+ 
+ template <typename T>
+   struct is_character_type
+   : std::bool_constant<false>
+   {};
+ 
+ template <typename T>
+   inline constexpr bool is_character_type_v = is_character_type<T>::value;
+ 
+ template <typename T>
+   struct is_character_type<const T>
+   : is_character_type<T>
+   {};
+ 
+ template <typename T>
+   struct is_character_type<T&>
+   : is_character_type<T>
+   {};
+ 
+ template <> struct is_character_type<char> : std::bool_constant<true> {};
+ template <> struct is_character_type<wchar_t> : std::bool_constant<true> {};
+ template <> struct is_character_type<char8_t> : std::bool_constant<true> {};
+ template <> struct is_character_type<char16_t> : std::bool_constant<true> {};
+ template <> struct is_character_type<char32_t> : std::bool_constant<true> {};
+ 
+ std::ostream& operator<<(std::ostream& s, std::byte b)
+ { return s << std::hex << static_cast<unsigned>(b) << std::dec; }
+ 
+ template <typename T, typename Abi>
+ std::ostream& operator<<(std::ostream& s, std::simd::basic_vec<T, Abi> const& v)
+ {
+   if constexpr (std::is_arithmetic_v<T>)
+     {
+       using U = std::conditional_t<
+ 		  sizeof(T) == 1, int, std::conditional_t<
+ 					 is_character_type_v<T>,
+ 					 std::simd::_UInt<sizeof(T)>, T>>;
+       s << '[' << U(v[0]);
+       for (int i = 1; i < v.size(); ++i)
+ 	s << ", " << U(v[i]);
+     }
+   else
+     {
+       s << '[' << v[0];
+       for (int i = 1; i < v.size(); ++i)
+ 	s << ", " << v[i];
+     }
+   return s << ']';
+ }
+ 
+ template <std::size_t B, typename Abi>
+ std::ostream& operator<<(std::ostream& s, std::simd::basic_mask<B, Abi> const& v)
+ {
+   s << '<';
+   for (int i = 0; i < v.size(); ++i)
+     s << int(v[i]);
+   return s << '>';
+ }
+ 
+ template <std::simd::__vec_builtin V>
+   std::ostream& operator<<(std::ostream& s, V v)
+   { return s << std::simd::vec<std::simd::__vec_value_type<V>, std::simd::__width_of<V>>(v); }
+ 
+ template <typename T, typename U>
+   std::ostream& operator<<(std::ostream& s, const std::pair<T, U>& x)
+   { return s << '{' << x.first << ", " << x.second << '}'; }
+ 
+ template <typename T>
+   concept is_string_type
+     = is_character_type_v<std::ranges::range_value_t<T>>
+ 	&& std::is_convertible_v<T, std::basic_string_view<std::ranges::range_value_t<T>>>;
+ 
+ template <std::ranges::range R>
+   requires (!is_string_type<R>)
+   std::ostream& operator<<(std::ostream& s, R&& x)
+   {
+     s << '[';
+     auto it = std::ranges::begin(x);
+     if (it != std::ranges::end(x))
+       {
+ 	s << *it;
+ 	while (++it != std::ranges::end(x))
+ 	  s << ',' << *it;
+       }
+     return s << ']';
+   }
+ 
+ struct additional_info
+ {
+   const bool failed = false;
+ 
+   additional_info
+   operator()(auto const& value0, auto const&... more)
+   {
+     if (failed)
+       [&] {
+ 	std::cout << "  " << value0;
+ 	((std::cout << ' ' << more), ...);
+ 	std::cout << std::endl;
+       }();
+     return *this;
+   }
+ };
+ 
+ struct log_novalue {};
+ 
+ template <typename T>
+   struct unwrap_value_types
+   { using type = T; };
+ 
+ template <typename T>
+   requires requires { typename T::value_type; }
+   struct unwrap_value_types<T>
+   { using type = typename unwrap_value_types<typename T::value_type>::type; };
+ 
+ template <typename T>
+   using value_type_t = typename unwrap_value_types<std::remove_cvref_t<T>>::type;
+ 
+ template <typename T>
+   struct as_unsigned;
+ 
+ template <typename T>
+   using as_unsigned_t = typename as_unsigned<T>::type;
+ 
+ template <typename T>
+   requires (sizeof(T) == sizeof(unsigned char))
+   struct as_unsigned<T>
+   { using type = unsigned char; };
+ 
+ template <typename T>
+   requires (sizeof(T) == sizeof(unsigned short))
+   struct as_unsigned<T>
+   { using type = unsigned short; };
+ 
+ template <typename T>
+   requires (sizeof(T) == sizeof(unsigned int))
+   struct as_unsigned<T>
+   { using type = unsigned int; };
+ 
+ template <typename T>
+   requires (sizeof(T) == sizeof(unsigned long long))
+   struct as_unsigned<T>
+   { using type = unsigned long long; };
+ 
+ template <typename T, typename Abi>
+   struct as_unsigned<std::simd::basic_vec<T, Abi>>
+   { using type = std::simd::rebind_t<as_unsigned_t<T>, std::simd::basic_vec<T, Abi>>; };
+ 
+ template <typename T0, typename T1>
+   constexpr T0
+   ulp_distance_signed(T0 val0, const T1& ref1)
+   {
+     if constexpr (std::is_floating_point_v<T1>)
+       return ulp_distance_signed(val0, std::simd::rebind_t<T1, T0>(ref1));
+     else if constexpr (std::is_floating_point_v<value_type_t<T0>>)
+       {
+ 	int fp_exceptions = 0;
+ 	if !consteval
+ 	  {
+ 	    fp_exceptions = std::fetestexcept(FE_ALL_EXCEPT);
+ 	  }
+ 	using std::isnan;
+ 	using std::abs;
+ 	using T = value_type_t<T0>;
+ 	using L = std::numeric_limits<T>;
+ 	constexpr T0 signexp_mask = -L::infinity();
+ 	T0 ref0(ref1);
+ 	T1 val1(val0);
+ 	const auto subnormal = fabs(ref1) < L::min();
+ 	using I = as_unsigned_t<T1>;
+ 	const T1 eps1 = select(subnormal, L::denorm_min(),
+ 			       L::epsilon() * std::bit_cast<T0>(
+ 						std::bit_cast<I>(ref1)
+ 						  & std::bit_cast<I>(signexp_mask)));
+ 	const T0 ulp = select(val0 == ref0 || (isnan(val0) && isnan(ref0)),
+ 			      T0(), T0((ref1 - val1) / eps1));
+ 	if !consteval
+ 	  {
+ 	    std::feclearexcept(FE_ALL_EXCEPT ^ fp_exceptions);
+ 	  }
+ 	return ulp;
+       }
+     else
+       return ref1 - val0;
+   }
+ 
+ template <typename T0, typename T1>
+   constexpr T0
+   ulp_distance(const T0& val, const T1& ref)
+   {
+     auto ulp = ulp_distance_signed(val, ref);
+     using T = value_type_t<decltype(ulp)>;
+     if constexpr (std::is_unsigned_v<T>)
+       return ulp;
+     else
+       {
+ 	using std::abs;
+ 	return fabs(ulp);
+       }
+   }
+ 
+ template <typename T>
+   constexpr bool
+   bit_equal(const T& a, const T& b)
+   {
+     using std::simd::_UInt;
+     if constexpr (sizeof(T) <= sizeof(0ull))
+       return std::bit_cast<_UInt<sizeof(T)>>(a) == std::bit_cast<_UInt<sizeof(T)>>(b);
+     else if constexpr (std::simd::__simd_vec_or_mask_type<T>)
+       {
+ 	using TT = typename T::value_type;
+ 	if constexpr (std::is_integral_v<TT>)
+ 	  return all_of(a == b);
+ 	else
+ 	  {
+ 	    constexpr size_t uint_size = std::min(size_t(8), sizeof(TT));
+ 	    struct B
+ 	    {
+ 	      alignas(T) simd::rebind_t<_UInt<uint_size>,
+ 					simd::resize_t<T::size() * sizeof(TT) / uint_size, T>> data;
+ 	    };
+ 	    if constexpr (sizeof(B) == sizeof(a))
+ 	      return all_of(std::bit_cast<B>(a).data == std::bit_cast<B>(b).data);
+ 	    else
+ 	      {
+ 		auto [a0, a1] = chunk<std::bit_ceil(unsigned(T::size())) / 2>(a);
+ 		auto [b0, b1] = chunk<std::bit_ceil(unsigned(T::size())) / 2>(b);
+ 		return bit_equal(a0, b0) && bit_equal(a1, b1);
+ 	      }
+ 	  }
+       }
+     else
+       static_assert(false);
+   }
+ 
+ // treat as equal if either:
+ // - operator== yields true
+ // - or for floats, a and b are NaNs
+ template <typename V>
+   constexpr bool
+   equal_with_nan_and_inf_fixup(const V& a, const V& b)
+   {
+     auto eq = a == b;
+     if (std::simd::all_of(eq))
+       return true;
+     else if constexpr (std::simd::__simd_vec_type<V>)
+       {
+ 	using M = typename V::mask_type;
+ 	using T = typename V::value_type;
+ 	if constexpr (std::is_floating_point_v<T>)
+ 	  { // fix up nan == nan results
+ 	    eq |= a._M_isnan() && b._M_isnan();
+ 	  }
+ 	else
+ 	  return false;
+ 	return std::simd::all_of(eq);
+       }
+     else if constexpr (std::is_floating_point_v<V>)
+       return std::isnan(a) && std::isnan(b);
+     else
+       return false;
+   }
+ 
+ struct constexpr_verifier
+ {
+   struct ignore_the_rest
+   {
+     constexpr ignore_the_rest
+     operator()(auto const&, auto const&...)
+     { return *this; }
+   };
+ 
+   bool okay = true;
+ 
+   constexpr ignore_the_rest
+   verify_precondition_failure(std::string_view expected_msg, auto&& f) &
+   {
+     try
+       {
+ 	f();
+ 	okay = false;
+       }
+     catch (const test::precondition_failure& failure)
+       {
+ 	okay = okay && failure.msg == expected_msg;
+       }
+     catch (...)
+       {
+ 	okay = false;
+       }
+     return {};
+   }
+ 
+   constexpr ignore_the_rest
+   verify(const auto& k) &
+   {
+     okay = okay && std::simd::all_of(k);
+     return {};
+   }
+ 
+   constexpr ignore_the_rest
+   verify_equal(const auto& v, const auto& ref) &
+   {
+     using V = decltype(std::simd::select(v == ref, v, ref));
+     okay = okay && equal_with_nan_and_inf_fixup<V>(v, ref);
+     return {};
+   }
+ 
+   constexpr ignore_the_rest
+   verify_bit_equal(const auto& v, const auto& ref) &
+   {
+     using V = decltype(std::simd::select(v == ref, v, ref));
+     okay = okay && bit_equal<V>(v, ref);
+     return {};
+   }
+ 
+   template <typename T, typename U>
+     constexpr ignore_the_rest
+     verify_equal(const std::pair<T, U>& x, const std::pair<T, U>& y) &
+     {
+       verify_equal(x.first, y.first);
+       verify_equal(x.second, y.second);
+       return {};
+     }
+ 
+   constexpr ignore_the_rest
+   verify_not_equal(const auto& v, const auto& ref) &
+   {
+     okay = okay && std::simd::all_of(v != ref);
+     return {};
+   }
+ 
+   constexpr ignore_the_rest
+   verify_equal_to_ulp(const auto& x, const auto& y, float allowed_distance) &
+   {
+     okay = okay && std::simd::all_of(ulp_distance(x, y) <= allowed_distance);
+     return {};
+   }
+ 
+   constexpr_verifier() = default;
+ 
+   constexpr_verifier(const constexpr_verifier&) = delete;
+ 
+   constexpr_verifier(constexpr_verifier&&) = delete;
+ };
+ 
+ template <int... is>
+   [[nodiscard]]
+   consteval bool
+   constexpr_test(auto&& fun, auto&&... args)
+   {
+     constexpr_verifier t;
+     try
+       {
+ 	fun.template operator()<is...>(t, args...);
+       }
+     catch(const test::precondition_failure& fail)
+       {
+ 	return false;
+       }
+     return t.okay;
+   }
+ 
+ template <typename T>
+   T
+   make_value_unknown(const T& x)
+   { return *std::start_lifetime_as<T>(&x); }
+ 
+ template <typename T>
+   concept pair_specialization
+     = std::same_as<std::remove_cvref_t<T>, std::pair<typename std::remove_cvref_t<T>::first_type,
+ 						     typename std::remove_cvref_t<T>::second_type>>;
+ 
+ struct runtime_verifier
+ {
+   const std::string_view test_kind;
+ 
+   template <typename X, typename Y>
+     additional_info
+     log_failure(const X& x, const Y& y, std::source_location loc, std::string_view s)
+     {
+       ++failed_tests;
+       std::cout << loc.file_name() << ':' << loc.line() << ':' << loc.column() << ": in "
+ 		<< test_kind << " test of '" << test_name
+ 		<< "' " << s << " failed";
+       if constexpr (!std::is_same_v<X, log_novalue>)
+ 	{
+ 	  std::cout << ":\n   result: " << std::boolalpha;
+ 	  if constexpr (is_character_type_v<X>)
+ 	    std::cout << int(x);
+ 	  else
+ 	    std::cout << x;
+ 	  if constexpr (!std::is_same_v<decltype(y), const log_novalue&>)
+ 	    {
+ 	      std::cout << "\n expected: ";
+ 	      if constexpr (is_character_type_v<Y>)
+ 		std::cout << int(y);
+ 	      else
+ 		std::cout << y;
+ 	    }
+ 	}
+       std::cout << std::endl;
+       return additional_info {true};
+     }
+ 
+   [[gnu::always_inline]]
+   additional_info
+   verify_precondition_failure(std::string_view expected_msg, auto&& f,
+ 			      std::source_location loc = std::source_location::current()) &
+   {
+     try
+       {
+ 	f();
+ 	++failed_tests;
+ 	return log_failure(log_novalue(), log_novalue(), loc, "precondition failure not detected");
+       }
+     catch (const test::precondition_failure& failure)
+       {
+ 	if (failure.msg != expected_msg)
+ 	  {
+ 	    ++failed_tests;
+ 	    return log_failure(failure.msg, expected_msg, loc, "unexpected exception");
+ 	  }
+ 	else
+ 	  {
+ 	    ++passed_tests;
+ 	    return {};
+ 	  }
+       }
+     catch (...)
+       {
+ 	++failed_tests;
+ 	return log_failure(log_novalue(), log_novalue(), loc, "unexpected exception");
+       }
+   }
+ 
+   [[gnu::always_inline]]
+   additional_info
+   verify(auto&& k, std::source_location loc = std::source_location::current())
+   {
+     if (std::simd::all_of(k))
+       {
+ 	++passed_tests;
+ 	return {};
+       }
+     else
+       return log_failure(log_novalue(), log_novalue(), loc, "verify");
+   }
+ 
+   [[gnu::always_inline]]
+   additional_info
+   verify_equal(auto&& x, auto&& y,
+ 	       std::source_location loc = std::source_location::current())
+   {
+     bool ok;
+     if constexpr (pair_specialization<decltype(x)> && pair_specialization<decltype(y)>)
+       ok = std::simd::all_of(x.first == y.first) && std::simd::all_of(x.second == y.second);
+     else
+       ok = equal_with_nan_and_inf_fixup<decltype(std::simd::select(x == y, x, y))>(x, y);
+     if (ok)
+       {
+ 	++passed_tests;
+ 	return {};
+       }
+     else
+       return log_failure(x, y, loc, "verify_equal");
+   }
+ 
+   [[gnu::always_inline]]
+   additional_info
+   verify_bit_equal(auto&& x, auto&& y,
+ 		   std::source_location loc = std::source_location::current())
+   {
+     using V = decltype(std::simd::select(x == y, x, y));
+     if (bit_equal<V>(x, y))
+       {
+ 	++passed_tests;
+ 	return {};
+       }
+     else
+       return log_failure(x, y, loc, "verify_bit_equal");
+   }
+ 
+   [[gnu::always_inline]]
+   additional_info
+   verify_not_equal(auto&& x, auto&& y,
+ 		   std::source_location loc = std::source_location::current())
+   {
+     if (std::simd::all_of(x != y))
+       {
+ 	++passed_tests;
+ 	return {};
+       }
+     else
+       return log_failure(x, y, loc, "verify_not_equal");
+   }
+ 
+   // ulp_distance_signed can raise FP exceptions and thus must be conditionally executed
+   [[gnu::always_inline]]
+   additional_info
+   verify_equal_to_ulp(auto&& x, auto&& y, float allowed_distance,
+ 		      std::source_location loc = std::source_location::current())
+   {
+     const bool success = std::simd::all_of(ulp_distance(x, y) <= allowed_distance);
+     if (success)
+       {
+ 	++passed_tests;
+ 	return {};
+       }
+     else
+       return log_failure(x, y, loc, "verify_equal_to_ulp")
+ 	       ("distance:", ulp_distance_signed(x, y),
+ 		"\n allowed:", allowed_distance);
+   }
+ };
+ 
+ template <int... is>
+   [[gnu::noinline, gnu::noipa]]
+   void
+   runtime_test(auto&& fun, auto&&... args)
+   {
+     runtime_verifier t {"runtime"};
+     fun.template operator()<is...>(t, make_value_unknown(args)...);
+   }
+ 
+ template <typename T>
+   concept constant_value = requires {
+     typename std::integral_constant<std::remove_cvref_t<decltype(T::value)>, T::value>;
+   };
+ 
+ template <typename T>
+   [[gnu::always_inline]] inline bool
+   is_const_known(const T& x)
+   { return constant_value<T> || __builtin_constant_p(x); }
+ 
+ template <typename T, typename Abi>
+   [[gnu::always_inline]] inline bool
+   is_const_known(const std::simd::basic_vec<T, Abi>& x)
+   { return __is_const_known(x); }
+ 
+ template <std::size_t B, typename Abi>
+   [[gnu::always_inline]] inline bool
+   is_const_known(const std::simd::basic_mask<B, Abi>& x)
+   { return __is_const_known(x); }
+ 
+ template <std::ranges::sized_range R>
+   [[gnu::always_inline]] inline bool
+   is_const_known(const R& arr)
+   {
+     constexpr std::size_t N = std::ranges::size(arr);
+     constexpr auto [...is] = std::_IotaArray<N>;
+     return (is_const_known(arr[is]) && ...);
+   }
+ 
+ template <int... is>
+   [[gnu::always_inline, gnu::flatten]]
+   inline void
+   constprop_test(auto&& fun, auto... args)
+   {
+     runtime_verifier t{"constprop"};
+ #ifndef __clang__
+     t.verify((is_const_known(args) && ...))("=> Some argument(s) failed to constant-propagate.");
+ #endif
+     fun.template operator()<is...>(t, args...);
+   }
+ 
+ /**
+  * The value of the largest element in test_iota<V, Init>.
+  */
+ template <typename V, int Init = 0, int Max = V::size() + Init - 1>
+   constexpr value_type_t<V> test_iota_max
+     = sizeof(value_type_t<V>) < sizeof(int)
+ 	? std::min(int(std::numeric_limits<value_type_t<V>>::max()),
+ 		   Max < 0 ? std::min(V::size() + Init - 1,
+ 				      int(std::numeric_limits<value_type_t<V>>::max()) + Max)
+ 			   : Max)
+ 	: V::size() + Init - 1;
+ 
+ template <typename T, typename Abi, int Init, int Max>
+   requires std::is_enum_v<T>
+   constexpr T test_iota_max<simd::basic_vec<T, Abi>, Init, Max>
+     = static_cast<T>(test_iota_max<simd::basic_vec<std::underlying_type_t<T>, Abi>, Init, Max>);
+ 
+ /**
+  * Starts iota sequence at Init.
+  *
+  * With `Max == 0`: Wrap-around on overflow
+  * With `Max < 0`: Subtract from numeric_limits::max (to leave room for arithmetic ops)
+  * Otherwise: [Init..Max, Init..Max, ...] (inclusive)
+  *
+  * Use simd::__iota if a non-monotonic sequence is a bug.
+  */
+ template <typename V, int Init = 0, int MaxArg = int(test_iota_max<V, Init>)>
+   constexpr V test_iota = V([](int i) {
+ 	      constexpr int Max = MaxArg < 0 ? int(test_iota_max<V, Init, MaxArg>) : MaxArg;
+ 	      static_assert(Max == 0 || Max > Init || V::size() == 1);
+ 	      i += Init;
+ 	      if constexpr (Max > Init)
+ 		{
+ 		  while (i > Max)
+ 		    i -= Max - Init + 1;
+ 		}
+ 	      using T = value_type_t<V>;
+ 		return static_cast<T>(i);
+ 	    });
+ 
+ /**
+  * A data-parallel object initialized with {values..., values..., ...}
+  */
+ template <typename V, auto... values>
+   constexpr V init_vec = [] {
+     using T = typename V::value_type;
+     constexpr std::array<T, sizeof...(values)> arr = {T(values)...};
+     return V([&](size_t i) { return arr[i % arr.size()]; });
+   }();
+ 
+ template <typename V>
+   struct Tests;
+ 
+ template <typename T>
+   concept array_specialization
+     = std::same_as<T, std::array<typename T::value_type, std::tuple_size_v<T>>>;
+ 
+ template <typename Args = void, typename Fun = void>
+   struct add_test
+   {
+     alignas(std::bit_floor(sizeof(Args))) Args args;
+     Fun fun;
+   };
+ 
+ struct dummy_test
+ {
+   static constexpr std::array<int, 0> args = {};
+   static constexpr auto fun = [](auto&, auto...) {};
+ };
+ 
+ template <auto test_ref, int... is, std::size_t... arg_idx>
+   void
+   invoke_test_impl(std::index_sequence<arg_idx...>)
+   {
+     constexpr auto fun = test_ref->fun;
+     [[maybe_unused]] constexpr auto args = test_ref->args;
+ #ifdef EXPENSIVE_TESTS
+     constprop_test<is...>(fun, std::get<arg_idx>(args)...);
+     constexpr bool passed = constexpr_test<is...>(fun, std::get<arg_idx>(args)...);
+     if (passed)
+       ++passed_tests;
+     else
+       {
+ 	++failed_tests;
+ 	std::cout << "=> constexpr test of '" << test_name << "' failed.\n";
+       }
+ #endif
+     runtime_test<is...>(fun, std::get<arg_idx>(args)...);
+   }
+ 
+ template <auto test_ref, int... is>
+   void
+   invoke_test(std::string_view name)
+   {
+     test_name = name;
+     constexpr auto args = test_ref->args;
+     using A = std::remove_const_t<decltype(args)>;
+     if constexpr (array_specialization<A>)
+       { // call for each element
+ 	template for (constexpr std::size_t I : std::_IotaArray<args.size()>)
+ 	  {
+ 	    std::string tmp_name = std::string(name) + '|' + std::to_string(I);
+ 	    test_name = tmp_name;
+ 	    ((std::cout << "Testing '" << test_name) << ... << (' ' + std::to_string(is)))
+ 	      << ' ' << args[I] << "'\n";
+ 	    invoke_test_impl<test_ref, is...>(std::index_sequence<I>());
+ 	  }
+       }
+     else
+       {
+ 	((std::cout << "Testing '" << test_name) << ... << (' ' + std::to_string(is))) << "'\n";
+ 	invoke_test_impl<test_ref, is...>(std::make_index_sequence<std::tuple_size_v<A>>());
+       }
+   }
+ 
+ #define ADD_TEST(name, ...)                                                                        \
+     template <int>                                                                                 \
+       static constexpr auto name##_tmpl = dummy_test {};                                           \
+ 												   \
+     const int init_##name = [] {                                                                   \
+       test_functions.push_back([] { invoke_test<&name##_tmpl<0>>(#name); });                       \
+       return 0;                                                                                    \
+     }();                                                                                           \
+ 												   \
+     template <int Tmp>                                                                             \
+       requires (Tmp == 0) __VA_OPT__(&& (__VA_ARGS__))                                             \
+       static constexpr auto name##_tmpl<Tmp> = add_test
+ 
+ #define ADD_TEST_N(name, N, ...)                                                                   \
+     template <int>                                                                                 \
+       static constexpr auto name##_tmpl = dummy_test {};                                           \
+ 												   \
+     static void                                                                                    \
+     name()                                                                                         \
+     {                                                                                              \
+       template for (constexpr int i : std::_IotaArray<N, int>)                                     \
+ 	invoke_test<&name##_tmpl<0>, i>(#name);                                                    \
+     }                                                                                              \
+ 												   \
+     const int init_##name = [] {                                                                   \
+       test_functions.push_back(name);                                                              \
+       return 0;                                                                                    \
+     }();                                                                                           \
+ 												   \
+     template <int Tmp>                                                                             \
+       requires (Tmp == 0) __VA_OPT__(&& (__VA_ARGS__))                                             \
+       static constexpr auto name##_tmpl<Tmp> = add_test
+ 
+ void create_tests();
+ 
+ int main()
+ {
+   create_tests();
+   try
+     {
+       for (auto f : test_functions)
+ 	f();
+     }
+   catch(const test::precondition_failure& fail)
+     {
+       std::cout << fail.file << ':' << fail.line << ": Error: precondition '" << fail.expr
+ 		<< "' does not hold: " << fail.msg << '\n';
+       return EXIT_FAILURE;
+     }
+   std::cout << "Passed tests: " << passed_tests << "\nFailed tests: " << failed_tests << '\n';
+   return failed_tests != 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+ }
+ 
+ #endif  // SIMD_TEST_SETUP_H
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/traits_common.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/traits_common.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/traits_common.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/traits_common.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,710 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-require-effective-target x86 }
+ // { dg-timeout-factor 2 }
+ 
+ #include <simd>
+ #include <stdfloat>
+ 
+ namespace simd = std::simd;
+ 
+ // test that instantiation of the complete class is well-formed
+ template class simd::basic_vec<int, typename simd::vec<int, 1>::abi_type>;
+ template class simd::basic_vec<int, typename simd::vec<int, 5>::abi_type>;
+ template class simd::basic_vec<int, typename simd::vec<int, 8>::abi_type>;
+ template class simd::basic_vec<int, typename simd::vec<int, 13>::abi_type>;
+ template class simd::basic_vec<float, typename simd::vec<float, 8>::abi_type>;
+ template class simd::basic_vec<float, typename simd::vec<float, 13>::abi_type>;
+ 
+ constexpr auto default_mask_abi_variant =
+ #ifdef __AVX512F__
+   simd::_AbiVariant::_BitMask;
+ #else
+   simd::_AbiVariant();
+ #endif
+ 
+ namespace test01
+ {
+   using std::same_as;
+ 
+   using Abi1 = simd::_Abi_t<1, 1, default_mask_abi_variant>;
+   static_assert(same_as<simd::vec<int, 1>::abi_type, Abi1>);
+   static_assert(same_as<simd::vec<float, 1>::abi_type, Abi1>);
+ 
+ #if defined __SSE__ && !defined __AVX__
+   static_assert(same_as<simd::vec<float>::abi_type, simd::_Abi_t<4, 1>>);
+   static_assert(same_as<simd::vec<float, 3>::abi_type, simd::_Abi_t<3, 1>>);
+   static_assert(same_as<simd::vec<float, 7>::abi_type, simd::_Abi_t<7, 2>>);
+ 
+   static_assert(simd::vec<float>::size > 1);
+   static_assert(alignof(simd::vec<float>) > alignof(float));
+   static_assert(alignof(simd::vec<float, 4>) > alignof(float));
+   static_assert(alignof(simd::vec<float, 3>) > alignof(float));
+   static_assert(sizeof(simd::vec<float, 7>) == 2 * sizeof(simd::vec<float>));
+   static_assert(alignof(simd::vec<float, 7>) == alignof(simd::vec<float>));
+ #endif
+ }
+ 
+ namespace test02
+ {
+   using namespace std;
+   using namespace std::simd;
+ 
+   static_assert(!destructible<simd::basic_mask<7>>);
+ 
+   static_assert(same_as<simd::vec<int>::mask_type, simd::mask<int>>);
+   static_assert(same_as<simd::vec<float>::mask_type, simd::mask<float>>);
+   static_assert(same_as<simd::vec<float, 1>::mask_type, simd::mask<float, 1>>);
+ 
+   // ensure 'true ? int : vec<float>' doesn't work
+   template <typename T>
+     concept has_type_member = requires { typename T::type; };
+   static_assert(has_type_member<common_type<int, simd::vec<float>>>);
+ }
+ 
+ #if defined __AVX__ && !defined __AVX2__
+ static_assert(alignof(simd::mask<int, 8>) == 16);
+ static_assert(alignof(simd::mask<float, 8>) == 32);
+ static_assert(alignof(simd::mask<int, 16>) == 16);
+ static_assert(alignof(simd::mask<float, 16>) == 32);
+ static_assert(alignof(simd::mask<long long, 4>) == 16);
+ static_assert(alignof(simd::mask<double, 4>) == 32);
+ static_assert(alignof(simd::mask<long long, 8>) == 16);
+ static_assert(alignof(simd::mask<double, 8>) == 32);
+ static_assert(std::same_as<decltype(+simd::mask<float, 8>()), simd::vec<int, 8>>);
+ #endif
+ 
+ #if defined __SSE__ && !defined __F16C__ && defined __STDCPP_FLOAT16_T__
+ static_assert(simd::vec<std::float16_t>::size() == 1);
+ static_assert(simd::mask<std::float16_t>::size() == 1);
+ static_assert(alignof(simd::vec<std::float16_t, 8>) == alignof(std::float16_t));
+ static_assert(alignof(simd::rebind_t<std::float16_t, simd::vec<float>>) == alignof(std::float16_t));
+ static_assert(simd::rebind_t<std::float16_t, simd::mask<float>>::abi_type::_S_nreg
+ 		== simd::vec<float>::size());
+ #endif
+ 
+ template <auto X>
+   using Ic = std::integral_constant<std::remove_const_t<decltype(X)>, X>;
+ 
+ static_assert( std::convertible_to<Ic<1>, simd::vec<float>>);
+ static_assert(!std::convertible_to<Ic<1.1>, simd::vec<float>>);
+ static_assert(!std::convertible_to<simd::vec<int, 4>, simd::vec<float, 4>>);
+ static_assert(!std::convertible_to<simd::vec<float, 4>, simd::vec<int, 4>>);
+ static_assert( std::convertible_to<int, simd::vec<float>>);
+ static_assert( std::convertible_to<simd::vec<int, 4>, simd::vec<double, 4>>);
+ 
+ template <typename V>
+   concept has_static_size = requires {
+     { V::size } -> std::convertible_to<int>;
+     { V::size() } -> std::signed_integral;
+     { auto(V::size.value) } -> std::signed_integral;
+   };
+ 
+ template <typename V, typename T = typename V::value_type>
+   concept usable_vec_or_mask
+     = std::destructible<V>
+ 	&& std::is_nothrow_move_constructible_v<V>
+ 	&& std::is_nothrow_move_assignable_v<V>
+ 	&& std::is_nothrow_default_constructible_v<V>
+ 	&& std::is_trivially_copyable_v<V>
+ 	&& std::is_standard_layout_v<V>
+ 	&& std::ranges::random_access_range<V&>
+ 	&& !std::ranges::output_range<V&, T>
+ 	&& std::constructible_from<V, T> // broadcast
+ 	&& has_static_size<V>
+ 	&& simd::__simd_vec_or_mask_type<V>
+       ;
+ 
+ template <typename V, typename T = typename V::value_type>
+   concept usable_vec
+     = usable_vec_or_mask<V, T>
+ 	&& !std::convertible_to<V, std::array<T, V::size()>>
+ 	&& std::convertible_to<std::array<T, V::size()>, V>
+ 	&& std::constructible_from<V, simd::rebind_t<int, V>>
+ 	&& std::constructible_from<V, simd::rebind_t<float, V>>
+ 	&& !std::constructible_from<V, simd::resize_t<V::size() + 1, V>>
+ 	&& !std::constructible_from<V, simd::resize_t<V::size() + 1, typename V::mask_type>>
+ 	&& !std::constructible_from<typename V::mask_type, V>
+       ;
+ 
+ template <typename M, typename T = typename M::value_type>
+   concept usable_mask
+     = std::is_same_v<T, bool>
+ 	&& usable_vec_or_mask<M, T>
+ 	&& std::convertible_to<std::bitset<M::size()>, M>
+ 	&& std::constructible_from<M, unsigned long long>
+ 	&& std::constructible_from<M, unsigned char>
+ 	&& std::constructible_from<M, simd::rebind_t<int, M>>
+ 	&& std::constructible_from<M, simd::rebind_t<float, M>>
+ 	&& !std::constructible_from<M, simd::resize_t<M::size() + 1, M>>
+ 	&& !std::convertible_to<unsigned long long, M>
+ 	&& !std::convertible_to<unsigned char, M>
+ 	&& !std::convertible_to<bool, M>
+ 	&& !std::constructible_from<M, std::bitset<M::size() + 1>>
+ 	&& !std::constructible_from<M, std::bitset<M::size() - 1>>
+ 	&& !std::constructible_from<M, int>
+ 	&& !std::constructible_from<M, float>
+       ;
+ 
+ template <typename T>
+   struct test_usable_simd
+   {
+     static_assert(!usable_vec<simd::vec<T, 0>>);
+     static_assert(!has_static_size<simd::vec<T, 0>>);
+     static_assert(usable_vec<simd::vec<T, 1>>);
+     static_assert(usable_vec<simd::vec<T, 2>>);
+     static_assert(usable_vec<simd::vec<T, 3>>);
+     static_assert(usable_vec<simd::vec<T, 4>>);
+     static_assert(usable_vec<simd::vec<T, 7>>);
+     static_assert(usable_vec<simd::vec<T, 8>>);
+     static_assert(usable_vec<simd::vec<T, 16>>);
+     static_assert(usable_vec<simd::vec<T, 32>>);
+     static_assert(usable_vec<simd::vec<T, 63>>);
+     static_assert(usable_vec<simd::vec<T, 64>>);
+ 
+     static_assert(!usable_mask<simd::mask<T, 0>>);
+     static_assert(!has_static_size<simd::mask<T, 0>>);
+     static_assert(usable_mask<simd::mask<T, 1>>);
+     static_assert(usable_mask<simd::mask<T, 2>>);
+     static_assert(usable_mask<simd::mask<T, 3>>);
+     static_assert(usable_mask<simd::mask<T, 4>>);
+     static_assert(usable_mask<simd::mask<T, 7>>);
+     static_assert(usable_mask<simd::mask<T, 8>>);
+     static_assert(usable_mask<simd::mask<T, 16>>);
+     static_assert(usable_mask<simd::mask<T, 32>>);
+     static_assert(usable_mask<simd::mask<T, 63>>);
+     static_assert(usable_mask<simd::mask<T, 64>>);
+   };
+ 
+ template <template <typename> class Tpl>
+   struct instantiate_all_vectorizable
+   {
+     Tpl<float> a;
+     Tpl<double> b;
+     Tpl<char> c;
+     Tpl<char8_t> c8;
+     Tpl<char16_t> d;
+     Tpl<char32_t> e;
+     Tpl<wchar_t> f;
+     Tpl<signed char> g;
+     Tpl<unsigned char> h;
+     Tpl<short> i;
+     Tpl<unsigned short> j;
+     Tpl<int> k;
+     Tpl<unsigned int> l;
+     Tpl<long> m;
+     Tpl<unsigned long> n;
+     Tpl<long long> o;
+     Tpl<unsigned long long> p;
+ #ifdef __STDCPP_FLOAT16_T__
+     Tpl<std::float16_t> q;
+ #endif
+ #ifdef __STDCPP_FLOAT32_T__
+     Tpl<std::float32_t> r;
+ #endif
+ #ifdef __STDCPP_FLOAT64_T__
+     Tpl<std::float64_t> s;
+ #endif
+   };
+ 
+ template struct instantiate_all_vectorizable<test_usable_simd>;
+ 
+ // vec generator ctor ///////////////
+ 
+ namespace test_generator
+ {
+   struct udt_convertible_to_float
+   { operator float() const; };
+ 
+   static_assert( std::constructible_from<simd::vec<float>, float (&)(int)>);
+   static_assert(!std::convertible_to<float (&)(int), simd::vec<float>>);
+   static_assert(!std::constructible_from<simd::vec<float>, int (&)(int)>);
+   static_assert(!std::constructible_from<simd::vec<float>, double (&)(int)>);
+   static_assert( std::constructible_from<simd::vec<float>, short (&)(int)>);
+   static_assert(!std::constructible_from<simd::vec<float>, long double (&)(int)>);
+   static_assert( std::constructible_from<simd::vec<float>, udt_convertible_to_float (&)(int)>);
+ }
+ 
+ // mask generator ctor ///////////////
+ 
+ static_assert(
+   all_of(simd::mask<float, 4>([](int) { return true; }) == simd::mask<float, 4>(true)));
+ static_assert(
+   all_of(simd::mask<float, 4>([](int) { return false; }) == simd::mask<float, 4>(false)));
+ static_assert(
+   all_of(simd::mask<float, 4>([](int i) { return i < 2; })
+ 	   == simd::mask<float, 4>([](int i) {
+ 		return std::array{true, true, false, false}[i];
+ 	      })));
+ 
+ static_assert(all_of((simd::vec<int, 4>([](int i) { return i << 10; }) >> 10)
+ 		== simd::__iota<simd::vec<int, 4>>));
+ 
+ // vec iterators /////////////////////
+ 
+ #if SIMD_IS_A_RANGE
+ static_assert([] { simd::vec<float> x = {}; return x.begin() == x.begin(); }());
+ static_assert([] { simd::vec<float> x = {}; return x.begin() == x.cbegin(); }());
+ static_assert([] { simd::vec<float> x = {}; return x.cbegin() == x.begin(); }());
+ static_assert([] { simd::vec<float> x = {}; return x.cbegin() == x.cbegin(); }());
+ static_assert([] { simd::vec<float> x = {}; return x.begin() + x.size() == x.end(); }());
+ static_assert([] { simd::vec<float> x = {}; return x.end() == x.begin() + x.size(); }());
+ static_assert([] { simd::vec<float> x = {}; return x.begin() < x.end(); }());
+ static_assert([] { simd::vec<float> x = {}; return x.begin() <= x.end(); }());
+ static_assert(![] { simd::vec<float> x = {}; return x.begin() > x.end(); }());
+ static_assert(![] { simd::vec<float> x = {}; return x.begin() >= x.end(); }());
+ static_assert(![] { simd::vec<float> x = {}; return x.end() < x.begin(); }());
+ static_assert(![] { simd::vec<float> x = {}; return x.end() <= x.begin(); }());
+ static_assert([] { simd::vec<float> x = {}; return x.end() > x.begin(); }());
+ static_assert([] { simd::vec<float> x = {}; return x.end() >= x.begin(); }());
+ static_assert([] { simd::vec<float> x = {}; return x.end() - x.begin(); }() == simd::vec<float>::size());
+ static_assert([] { simd::vec<float> x = {}; return x.begin() - x.end(); }() == -simd::vec<float>::size());
+ static_assert([] { simd::vec<float> x = {}; return x.begin() - x.begin(); }() == 0);
+ static_assert([] { simd::vec<float> x = {}; return x.begin() + 1 - x.begin(); }() == 1);
+ static_assert([] { simd::vec<float> x = {}; return x.begin() + 1 - x.cbegin(); }() == 1);
+ #endif
+ 
+ // mask to vec ///////////////////////
+ 
+ // Clang says all kinds of expressions are not constant expressions. Why? Come on … explain! 🤷
+ #ifdef __clang__
+ #define AVOID_BROKEN_CLANG_FAILURES 1
+ #endif
+ 
+ #ifndef AVOID_BROKEN_CLANG_FAILURES
+ 
+ static_assert([] constexpr {
+   constexpr simd::mask<float, 7> a([](int i) -> bool { return i < 3; });
+   constexpr simd::basic_vec b = -a;
+   static_assert(b[0] == -(0 < 3));
+   static_assert(b[1] == -(1 < 3));
+   static_assert(b[2] == -(2 < 3));
+   static_assert(b[3] == -(3 < 3));
+   return all_of(b == simd::vec<int, 7>([](int i) { return -int(i < 3); }));
+ }());
+ 
+ static_assert([] constexpr {
+   constexpr simd::mask<float, 7> a([](int i) -> bool { return i < 3; });
+   constexpr simd::basic_vec b = ~a;
+   static_assert(b[0] == ~int(0 < 3));
+   static_assert(b[1] == ~int(1 < 3));
+   static_assert(b[2] == ~int(2 < 3));
+   static_assert(b[3] == ~int(3 < 3));
+   return all_of(b == simd::vec<int, 7>([](int i) { return ~int(i < 3); }));
+ }());
+ 
+ static_assert([] constexpr {
+   constexpr simd::mask<float, 4> a([](int i) -> bool { return i < 2; });
+   constexpr simd::basic_vec b = a;
+   static_assert(b[0] == 1);
+   static_assert(b[1] == 1);
+   static_assert(b[2] == 0);
+   return b[3] == 0;
+ }());
+ 
+ static_assert([] constexpr {
+   // Corner case on AVX w/o AVX2 systems. <float, 5> is an AVX register;
+   // <int, 5> is deduced as SSE + scalar.
+   constexpr simd::mask<float, 5> a([](int i) -> bool { return i >= 2; });
+   constexpr simd::basic_vec b = a;
+   static_assert(b[0] == 0);
+   static_assert(b[1] == 0);
+   static_assert(b[2] == 1);
+   static_assert(b[3] == 1);
+   static_assert(b[4] == 1);
+ #if defined __AVX2__ || !defined __AVX__
+   static_assert(all_of((b == 1) == a));
+ #endif
+   constexpr simd::mask<float, 8> a8([](int i) -> bool { return i <= 4; });
+   constexpr simd::basic_vec b8 = a8;
+   static_assert(b8[0] == 1);
+   static_assert(b8[1] == 1);
+   static_assert(b8[2] == 1);
+   static_assert(b8[3] == 1);
+   static_assert(b8[4] == 1);
+   static_assert(b8[5] == 0);
+   static_assert(b8[6] == 0);
+   static_assert(b8[7] == 0);
+ #if SIMD_MASK_IMPLICIT_CONVERSIONS || defined __AVX2__ || !defined __AVX__
+   static_assert(all_of((b8 == 1) == a8));
+ #endif
+   constexpr simd::mask<float, 15> a15([](int i) -> bool { return i <= 4; });
+   constexpr simd::basic_vec b15 = a15;
+   static_assert(b15[0] == 1);
+   static_assert(b15[4] == 1);
+   static_assert(b15[5] == 0);
+   static_assert(b15[8] == 0);
+   static_assert(b15[14] == 0);
+   static_assert(all_of((b15 == 1) == a15));
+   return true;
+ }());
+ 
+ static_assert([] constexpr {
+   constexpr simd::mask<float, 4> a([](int i) -> bool { return i < 2; });
+   constexpr simd::basic_vec b = ~a;
+   constexpr simd::basic_vec c = a;
+   static_assert(c[0] == int(a[0]));
+   static_assert(c[1] == int(a[1]));
+   static_assert(c[2] == int(a[2]));
+   static_assert(c[3] == int(a[3]));
+   static_assert(b[0] == ~int(0 < 2));
+   static_assert(b[1] == ~int(1 < 2));
+   static_assert(b[2] == ~int(2 < 2));
+   static_assert(b[3] == ~int(3 < 2));
+   return all_of(b == simd::vec<int, 4>([](int i) { return ~int(i < 2); }));
+ }());
+ #endif
+ 
+ // mask conversions //////////////////
+ namespace mask_conversion_tests
+ {
+   using simd::mask;
+ 
+   struct TestResult
+   {
+     int state;
+     unsigned long long a, b;
+   };
+ 
+   template <auto Res>
+     consteval void
+     check()
+     {
+       if constexpr (Res.state != 0 && Res.a != Res.b)
+ 	static_assert(Res.a == Res.b);
+       else
+ 	static_assert(Res.state == 0);
+     }
+ 
+   template <typename U>
+     consteval TestResult
+     do_test(const auto& k)
+     {
+       using M = simd::mask<U, k.size()>;
+       if constexpr (std::is_destructible_v<M>)
+ 	{
+ 	  if (!std::ranges::equal(M(k), k))
+ 	    {
+ 	      if constexpr (k.size() <= 64)
+ 		return {1, M(k).to_ullong(), k.to_ullong()};
+ 	      else
+ 		return {1, 0, 0};
+ 	    }
+ 	  else
+ 	    return {0, 0, 0};
+ 	}
+       else
+ 	return {0, 0, 0};
+     }
+ 
+   template <typename T, int N, int P = 0>
+     consteval void
+     do_test()
+     {
+       if constexpr (std::is_destructible_v<simd::mask<T, N>>)
+ 	{
+ 	  constexpr simd::mask<T, N> k([](int i) {
+ 		      if constexpr (P == 2)
+ 			return std::has_single_bit(unsigned(i));
+ 		      else if constexpr (P == 3)
+ 			return !std::has_single_bit(unsigned(i));
+ 		      else
+ 			return (i & 1) == P;
+ 		    });
+ 	  check<do_test<char>(    k)>();
+ 	  check<do_test<char>(!k)>();
+ 	  check<do_test<short>(    k)>();
+ 	  check<do_test<short>(!k)>();
+ 	  check<do_test<int>(    k)>();
+ 	  check<do_test<int>(!k)>();
+ 	  check<do_test<double>(    k)>();
+ 	  check<do_test<double>(!k)>();
+ #ifdef __STDCPP_FLOAT16_T__
+ 	  check<do_test<std::float16_t>(    k)>();
+ 	  check<do_test<std::float16_t>(!k)>();
+ #endif
+ 	  if constexpr (P <= 2)
+ 	    do_test<T, N, P + 1>();
+ 	}
+     }
+ 
+   template <typename T>
+     consteval bool
+     test()
+     {
+       using V = simd::mask<T>;
+       do_test<T, 1>();
+       do_test<T, V::size()>();
+       do_test<T, 2 * V::size()>();
+       do_test<T, 4 * V::size()>();
+       do_test<T, 5 * V::size()>();
+       do_test<T, 2 * V::size() + 1>();
+       do_test<T, 2 * V::size() - 1>();
+       do_test<T, V::size() / 2>();
+       do_test<T, V::size() / 3>();
+       do_test<T, V::size() / 5>();
+       return true;
+     }
+ 
+   static_assert(test<char>());
+   static_assert(test<short>());
+   static_assert(test<float>());
+   static_assert(test<double>());
+ #ifdef __STDCPP_FLOAT16_T__
+   static_assert(test<std::float16_t>());
+ #endif
+ }
+ 
+ // vec reductions ///////////////////
+ 
+ namespace simd_reduction_tests
+ {
+   static_assert(reduce(simd::vec<int, 7>(1)) == 7);
+   static_assert(reduce(simd::vec<int, 7>(2), std::multiplies<>()) == 128);
+   static_assert(reduce(simd::vec<int, 8>(2), std::bit_and<>()) == 2);
+   static_assert(reduce(simd::vec<int, 8>(2), std::bit_or<>()) == 2);
+   static_assert(reduce(simd::vec<int, 8>(2), std::bit_xor<>()) == 0);
+   static_assert(reduce(simd::vec<int, 3>(2), std::bit_and<>()) == 2);
+   static_assert(reduce(simd::vec<int, 6>(2), std::bit_and<>()) == 2);
+   static_assert(reduce(simd::vec<int, 7>(2), std::bit_and<>()) == 2);
+   static_assert(reduce(simd::vec<int, 7>(2), std::bit_or<>()) == 2);
+   static_assert(reduce(simd::vec<int, 7>(2), std::bit_xor<>()) == 2);
+ #ifndef AVOID_BROKEN_CLANG_FAILURES
+   static_assert(reduce(simd::vec<int, 4>(2), simd::mask<int, 4>(false)) == 0);
+   static_assert(reduce(simd::vec<int, 4>(2), simd::mask<int, 4>(false), std::multiplies<>()) == 1);
+   static_assert(reduce(simd::vec<int, 4>(2), simd::mask<int, 4>(false), std::bit_and<>()) == ~0);
+   static_assert(reduce(simd::vec<int, 4>(2), simd::mask<int, 4>(false), [](auto a, auto b) {
+ 		  return select(a < b, a, b);
+ 		}, __INT_MAX__) == __INT_MAX__);
+ #endif
+ 
+   template <typename BinaryOperation>
+     concept masked_reduce_works = requires(simd::vec<int, 4> a, simd::vec<int, 4> b) {
+       reduce(a, a < b, BinaryOperation());
+     };
+ 
+   static_assert(!masked_reduce_works<std::minus<>>);
+ }
+ 
+ // mask reductions ///////////////////
+ 
+ static_assert(all_of(simd::vec<float>() == simd::vec<float>()));
+ static_assert(any_of(simd::vec<float>() == simd::vec<float>()));
+ static_assert(!none_of(simd::vec<float>() == simd::vec<float>()));
+ static_assert(reduce_count(simd::vec<float>() == simd::vec<float>()) == simd::vec<float>::size);
+ static_assert(reduce_min_index(simd::vec<float>() == simd::vec<float>()) == 0);
+ static_assert(reduce_max_index(simd::vec<float>() == simd::vec<float>()) == simd::vec<float>::size - 1);
+ 
+ // chunk ////////////////////////
+ 
+ static_assert([] {
+   constexpr auto a = simd::vec<int, 8>([] (int i) { return i; });
+   auto a4 = chunk<simd::vec<int, 4>>(a);
+   auto a3 = chunk<simd::vec<int, 3>>(a);
+   auto a3_ = chunk<3>(a);
+   return a4.size() == 2 && std::same_as<decltype(a4), std::array<simd::vec<int, 4>, 2>>
+ 	   && std::tuple_size_v<decltype(a3)> == 3
+ 	   && all_of(std::get<0>(a3) == simd::vec<int, 3>([] (int i) { return i; }))
+ 	   && all_of(std::get<1>(a3) == simd::vec<int, 3>([] (int i) { return i + 3; }))
+ 	   && all_of(std::get<2>(a3) == simd::vec<int, 2>([] (int i) { return i + 6; }))
+ 	   && std::same_as<decltype(a3), decltype(a3_)>
+ 	   && all_of(std::get<0>(a3) == std::get<0>(a3_));
+ }());
+ 
+ static_assert([] {
+   constexpr simd::mask<int, 8> a([] (int i) -> bool { return i & 1; });
+   auto a4 = chunk<simd::mask<int, 4>>(a);
+   auto a3 = chunk<simd::mask<int, 3>>(a);
+   auto a3_ = chunk<3>(a);
+   return a4.size() == 2 && std::same_as<decltype(a4), std::array<simd::mask<int, 4>, 2>>
+ 	   && std::tuple_size_v<decltype(a3)> == 3
+ 	   && all_of(std::get<0>(a3) == simd::mask<int, 3>(
+ 					   [] (int i) -> bool { return i & 1; }))
+ 	   && all_of(std::get<1>(a3) == simd::mask<int, 3>(
+ 					   [] (int i) -> bool { return (i + 3) & 1; }))
+ 	   && all_of(std::get<2>(a3) == simd::mask<int, 2>(
+ 					   [] (int i) -> bool { return (i + 6) & 1; }))
+ 	   && std::same_as<decltype(a3), decltype(a3_)>
+ 	   && all_of(std::get<0>(a3) == std::get<0>(a3_));
+ }());
+ 
+ // cat ///////////////////////////
+ 
+ static_assert(all_of(simd::cat(simd::__iota<simd::vec<int, 3>>, simd::vec<int, 1>(3))
+ 		       == simd::__iota<simd::vec<int, 4>>));
+ 
+ static_assert(all_of(simd::cat(simd::__iota<simd::vec<int, 4>>, simd::__iota<simd::vec<int, 4>> + 4)
+ 		       == simd::__iota<simd::vec<int, 8>>));
+ 
+ static_assert(all_of(simd::cat(simd::__iota<simd::vec<double, 4>>, simd::__iota<simd::vec<double, 2>> + 4)
+ 		       == simd::__iota<simd::vec<double, 6>>));
+ 
+ static_assert(all_of(simd::cat(simd::__iota<simd::vec<double, 4>>, simd::__iota<simd::vec<double, 4>> + 4)
+ 		       == simd::__iota<simd::vec<double, 8>>));
+ 
+ // select ////////////////////////
+ 
+ #ifndef AVOID_BROKEN_CLANG_FAILURES
+ static_assert(all_of(simd::vec<long long, 8>(std::array{0, 0, 0, 0, 4, 4, 4, 4})
+ 		       == select(simd::__iota<simd::vec<double, 8>> < 4, 0ll, 4ll)));
+ 
+ static_assert(all_of(simd::vec<int, 8>(std::array{0, 0, 0, 0, 4, 4, 4, 4})
+ 		       == select(simd::__iota<simd::vec<float, 8>> < 4.f, 0, 4)));
+ #endif
+ 
+ // permute ////////////////////////
+ 
+ namespace permutations
+ {
+   struct _DuplicateEven
+   {
+     consteval unsigned
+     operator()(unsigned __i) const
+     { return __i & ~1u; }
+   };
+ 
+   inline constexpr _DuplicateEven duplicate_even {};
+ 
+   struct _DuplicateOdd
+   {
+     consteval unsigned
+     operator()(unsigned __i) const
+     { return __i | 1u; }
+   };
+ 
+   inline constexpr _DuplicateOdd duplicate_odd {};
+ 
+   template <unsigned _Np>
+     struct _SwapNeighbors
+     {
+       consteval unsigned
+       operator()(unsigned __i, unsigned __size) const
+       {
+ 	if (__size % (2 * _Np) != 0)
+ 	  abort(); // swap_neighbors<N> permutation requires a multiple of 2N elements
+ 	else if (std::has_single_bit(_Np))
+ 	  return __i ^ _Np;
+ 	else if (__i % (2 * _Np) >= _Np)
+ 	  return __i - _Np;
+ 	else
+ 	  return __i + _Np;
+       }
+     };
+ 
+   template <unsigned _Np = 1u>
+     inline constexpr _SwapNeighbors<_Np> swap_neighbors {};
+ 
+   template <int _Position>
+     struct _Broadcast
+     {
+       consteval int
+       operator()(int, int __size) const
+       { return _Position < 0 ? __size + _Position : _Position; }
+     };
+ 
+   template <int _Position>
+     inline constexpr _Broadcast<_Position> broadcast {};
+ 
+   inline constexpr _Broadcast<0> broadcast_first {};
+ 
+   inline constexpr _Broadcast<-1> broadcast_last {};
+ 
+   struct _Reverse
+   {
+     consteval int
+     operator()(int __i, int __size) const
+     { return __size - 1 - __i; }
+   };
+ 
+   inline constexpr _Reverse reverse {};
+ 
+   template <int _Offset>
+     struct _Rotate
+     {
+       consteval int
+       operator()(int __i, int __size) const
+       {
+ 	__i += _Offset;
+ 	__i %= __size;
+ 	if (__i < 0)
+ 	  __i += __size;
+ 	return __i;
+       }
+     };
+ 
+   template <int _Offset>
+     inline constexpr _Rotate<_Offset> rotate {};
+ 
+   template <int _Offset>
+     struct _Shift
+     {
+       consteval int
+       operator()(int __i, int __size) const
+       {
+ 	const int __j = __i + _Offset;
+ 	if (__j >= __size || -__j > __size)
+ 	  return simd::zero_element;
+ 	else if (__j < 0)
+ 	  return __size + __j;
+ 	else
+ 	  return __j;
+       }
+     };
+ 
+   template <int _Offset>
+     inline constexpr _Shift<_Offset> shift {};
+ }
+ 
+ static_assert(
+   all_of(simd::permute(simd::__iota<simd::vec<int>>, permutations::duplicate_even)
+ 	   == simd::__iota<simd::vec<int>> / 2 * 2));
+ 
+ static_assert(
+   all_of(simd::permute(simd::__iota<simd::vec<int>>, permutations::duplicate_odd)
+ 	   == simd::__iota<simd::vec<int>> / 2 * 2 + 1));
+ 
+ static_assert(
+   all_of(simd::permute(simd::__iota<simd::vec<int>>, permutations::swap_neighbors<1>)
+ 	   == simd::vec<int>([](int i) { return i ^ 1; })));
+ 
+ static_assert(
+   all_of(simd::permute(simd::__iota<simd::vec<int, 8>>,
+ 		      permutations::swap_neighbors<2>)
+ 	   == simd::vec<int, 8>(std::array{2, 3, 0, 1, 6, 7, 4, 5})));
+ 
+ static_assert(
+   all_of(simd::permute(simd::__iota<simd::vec<int, 12>>,
+ 		      permutations::swap_neighbors<3>)
+ 	   == simd::vec<int, 12>(
+ 		std::array{3, 4, 5, 0, 1, 2, 9, 10, 11, 6, 7, 8})));
+ 
+ static_assert(
+   all_of(simd::permute(simd::__iota<simd::vec<int>>, permutations::broadcast<1>)
+ 	   == simd::vec<int>(1)));
+ 
+ static_assert(
+   all_of(simd::permute(simd::__iota<simd::vec<int>>, permutations::broadcast_first)
+ 	   == simd::vec<int>(0)));
+ 
+ static_assert(
+   all_of(simd::permute(simd::__iota<simd::vec<int>>, permutations::broadcast_last)
+ 	   == simd::vec<int>(int(simd::vec<int>::size() - 1))));
+ 
+ static_assert(
+   all_of(simd::permute(simd::__iota<simd::vec<int>>, permutations::reverse)
+ 	   == simd::vec<int>([](int i) { return int(simd::vec<int>::size()) - 1 - i; })));
+ 
+ static_assert(
+   all_of(simd::permute(simd::__iota<simd::vec<int>>, permutations::rotate<1>)
+ 	   == (simd::__iota<simd::vec<int>> + 1) % int(simd::vec<int>::size())));
+ 
+ static_assert(
+   all_of(simd::permute(simd::__iota<simd::vec<int>>, permutations::rotate<2>)
+ 	   == (simd::__iota<simd::vec<int>> + 2) % int(simd::vec<int>::size())));
+ 
+ static_assert(
+   all_of(simd::permute(simd::__iota<simd::vec<int, 7>>, permutations::rotate<2>)
+ 	   == simd::vec<int, 7>(std::array {2, 3, 4, 5, 6, 0, 1})));
+ 
+ static_assert(
+   all_of(simd::permute(simd::__iota<simd::vec<int, 7>>, permutations::rotate<-2>)
+ 	   == simd::vec<int, 7>(std::array {5, 6, 0, 1, 2, 3, 4}))); // { dg-prune-output "Wpsabi" }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/traits_impl.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/traits_impl.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/traits_impl.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/traits_impl.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,185 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-require-effective-target x86 }
+ 
+ #define _GLIBCXX_SIMD_THROW_ON_BAD_VALUE 1
+ 
+ #include <bits/simd_details.h>
+ #include <bits/simd_flags.h>
+ #include <stdfloat>
+ 
+ namespace simd = std::simd;
+ 
+ using std::float16_t;
+ using std::float32_t;
+ using std::float64_t;
+ 
+ using namespace std::simd;
+ 
+ void test()
+ {
+   template for (auto t : {float(), double(), float16_t(), float32_t(), float64_t()})
+     {
+       using T = decltype(t);
+       static_assert(__vectorizable<T>);
+     }
+ 
+   static_assert(!__vectorizable<const float>);
+   static_assert(!__vectorizable<float&>);
+   static_assert(!__vectorizable<std::bfloat16_t>);
+ 
+   template for (constexpr int N : {1, 2, 4, 8})
+     {
+       static_assert(std::signed_integral<__integer_from<N>>);
+       static_assert(sizeof(__integer_from<N>) == N);
+       static_assert(__vectorizable<__integer_from<N>>);
+     }
+ 
+   static_assert(__div_ceil(5, 3) == 2);
+ 
+   static_assert(sizeof(_Bitmask<3>) == 1);
+   static_assert(sizeof(_Bitmask<30>) == 4);
+ 
+   static_assert(__scalar_abi_tag<_ScalarAbi<1>>);
+   static_assert(__scalar_abi_tag<_ScalarAbi<2>>);
+   static_assert(!__scalar_abi_tag<_Abi_t<1, 1>>);
+ 
+   static_assert(__abi_tag<_ScalarAbi<1>>);
+   static_assert(__abi_tag<_ScalarAbi<2>>);
+ 
+   using AN = decltype(__native_abi<float>());
+   using A1 = decltype(__native_abi<float>()._S_resize<1>());
+   static_assert(A1::_S_size == 1);
+   static_assert(A1::_S_nreg == 1);
+   static_assert(A1::_S_variant == AN::_S_variant);
+   static_assert(__scalar_abi_tag<A1> == __scalar_abi_tag<AN>);
+   static_assert(std::is_same_v<decltype(__abi_rebind<float, AN::_S_size, A1>()), AN>);
+   if constexpr (AN::_S_size >= 2) // the target has SIMD support for float
+     {
+       {
+ 	using A2 = decltype(__abi_rebind<float, 2, AN>());
+ 	static_assert(A2::_S_size == 2);
+ 	static_assert(A2::_S_nreg == 1);
+ 	static_assert(A2::_S_variant == AN::_S_variant);
+ 	using A2x = decltype(__abi_rebind<float, 2, decltype(__abi_rebind<float, 1, A2>())>());
+ 	static_assert(std::is_same_v<A2, A2x>);
+       }
+       using A4 = decltype(__abi_rebind<float, 4, AN>());
+       static_assert(A4::_S_size == 4);
+     }
+ 
+   static_assert(__streq_to_1("1"));
+   static_assert(!__streq_to_1(""));
+   static_assert(!__streq_to_1(nullptr));
+   static_assert(!__streq_to_1("0"));
+   static_assert(!__streq_to_1("1 "));
+ 
+   static_assert(__static_sized_range<int[4]>);
+   static_assert(__static_sized_range<int[4], 4>);
+   static_assert(__static_sized_range<std::array<int, 4>, 4>);
+ 
+   static_assert( __value_preserving_convertible_to<int, double>);
+   static_assert(!__value_preserving_convertible_to<int, float>);
+   static_assert( __value_preserving_convertible_to<float, double>);
+   static_assert(!__value_preserving_convertible_to<double, float>);
+ 
+   static_assert(__explicitly_convertible_to<float, float16_t>);
+   static_assert(__explicitly_convertible_to<long, float16_t>);
+ 
+   static_assert(__constexpr_wrapper_like<std::constant_wrapper<2>>);
+   static_assert(__constexpr_wrapper_like<std::integral_constant<int, 1>>);
+ 
+   static_assert(!__broadcast_constructible<int, float>);
+   static_assert(!__broadcast_constructible<int&, float>);
+   static_assert(!__broadcast_constructible<int&&, float>);
+   static_assert(!__broadcast_constructible<const int&, float>);
+   static_assert(!__broadcast_constructible<const int, float>);
+ 
+   static_assert(__broadcast_constructible<decltype(std::cw<2>), float>);
+   static_assert(__broadcast_constructible<decltype(std::cw<0.f>), std::float16_t>);
+ 
+ 
+   static_assert(__higher_rank_than<long, int>);
+   static_assert(__higher_rank_than<long long, long>);
+   static_assert(__higher_rank_than<int, short>);
+   static_assert(__higher_rank_than<short, char>);
+ 
+   static_assert(!__higher_rank_than<char, signed char>);
+   static_assert(!__higher_rank_than<signed char, char>);
+   static_assert(!__higher_rank_than<char, unsigned char>);
+   static_assert(!__higher_rank_than<unsigned char, char>);
+ 
+   static_assert(__higher_rank_than<unsigned int, short>);
+   static_assert(__higher_rank_than<unsigned long, int>);
+   static_assert(__higher_rank_than<unsigned long long, long>);
+ 
+   static_assert(__higher_rank_than<float, float16_t>);
+   static_assert(__higher_rank_than<float32_t, float>);
+   static_assert(__higher_rank_than<double, float32_t>);
+   static_assert(__higher_rank_than<double, float>);
+   static_assert(__higher_rank_than<float64_t, float32_t>);
+   static_assert(__higher_rank_than<float64_t, float>);
+   static_assert(__higher_rank_than<float64_t, double>);
+ 
+   static_assert(__loadstore_convertible_to<float, double>);
+   static_assert(__loadstore_convertible_to<int, double>);
+   static_assert(!__loadstore_convertible_to<int, float>);
+   static_assert(!__loadstore_convertible_to<int, float, __aligned_flag>);
+   static_assert(__loadstore_convertible_to<int, float, __convert_flag>);
+   static_assert(__loadstore_convertible_to<int, float, __aligned_flag, __convert_flag>);
+ 
+   static_assert(__mask_element_size<basic_mask<4>> == 4);
+ 
+   static_assert(__highest_bit(0b1000u) == 3);
+   static_assert(__highest_bit(0b10000001000ull) == 10);
+ }
+ 
+ consteval bool
+ throws(auto f)
+ {
+   try { f(); }
+   catch (...) { return true; }
+   return false;
+ }
+ 
+ static_assert(!throws([] { __value_preserving_cast<float>(1); }));
+ static_assert(!throws([] { __value_preserving_cast<float>(1.5); }));
+ static_assert(throws([] { __value_preserving_cast<float>(0x5EAF00D); }));
+ static_assert(throws([] { __value_preserving_cast<unsigned>(-1); }));
+ static_assert(!throws([] { __value_preserving_cast<unsigned short>(0xffff); }));
+ static_assert(throws([] { __value_preserving_cast<unsigned short>(0x10000); }));
+ 
+ static_assert(__converts_trivially<int, unsigned>);
+ #if __SIZEOF_LONG__ == __SIZEOF_LONG_LONG__
+ static_assert(__converts_trivially<long long, long>);
+ #elif __SIZEOF_INT__ == __SIZEOF_LONG__
+ static_assert(__converts_trivially<int, long>);
+ #endif
+ static_assert(__converts_trivially<float, float32_t>);
+ 
+ static_assert([] {
+   bool to_find[10] = {0, 1, 1, 1, 0, 1, 0, 0, 1};
+   __bit_foreach(0b100101110u, [&](int i) {
+     if (!to_find[i]) throw false;
+     to_find[i] = false;
+   });
+   for (bool b : to_find)
+     if (b)
+       return false;
+   return true;
+ }());
+ 
+ // flags ////////////////////////
+ static_assert(std::is_same_v<decltype(flag_default | flag_default), flags<>>);
+ static_assert(std::is_same_v<decltype(flag_convert | flag_default), flags<__convert_flag>>);
+ static_assert(std::is_same_v<decltype(flag_convert | flag_convert), flags<__convert_flag>>);
+ static_assert(std::is_same_v<decltype(flag_aligned | flag_convert),
+ 			     flags<__aligned_flag, __convert_flag>>);
+ static_assert(std::is_same_v<decltype(flag_aligned | flag_convert | flag_aligned),
+ 			     flags<__aligned_flag, __convert_flag>>);
+ static_assert(std::is_same_v<decltype(flag_aligned | (flag_convert | flag_aligned)),
+ 			     flags<__aligned_flag, __convert_flag>>);
+ 
+ static_assert(!flag_default._S_test(flag_convert));
+ static_assert(flag_convert._S_test(flag_convert));
+ static_assert(!flag_convert._S_test(flag_aligned));
+ static_assert((flag_overaligned<32> | flag_convert | flag_aligned)._S_test(flag_convert));
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/simd/traits_math.cc gcc-16-20260322/libstdc++-v3/testsuite/std/simd/traits_math.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/simd/traits_math.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/simd/traits_math.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,62 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-require-effective-target x86 }
+ 
+ #include <simd>
+ #include <stdfloat>
+ 
+ namespace simd = std::simd;
+ 
+ // vec.math ///////////////////////////////////////
+ 
+ namespace math_tests
+ {
+   using simd::__deduced_vec_t;
+   using simd::__math_floating_point;
+   using std::is_same_v;
+ 
+   using vf2 = simd::vec<float, 2>;
+   using vf4 = simd::vec<float, 4>;
+ 
+   template <typename T0, typename T1>
+     concept has_common_type = requires { typename std::common_type<T0, T1>::type; };
+ 
+   template <typename T>
+     concept has_deduced_vec = requires { typename simd::__deduced_vec_t<T>; };
+ 
+   static_assert(!has_common_type<vf2, vf4>);
+   static_assert( has_common_type<int, vf2>);
+ 
+   template <typename T, bool Strict = false>
+     struct holder
+     {
+       T value;
+ 
+       constexpr
+       operator const T&() const
+       { return value; }
+ 
+       template <typename U>
+ 	requires (!std::same_as<T, U>) && Strict
+ 	operator U() const = delete;
+     };
+ 
+   // The next always has a common_type because the UDT is convertible_to<float> and is not an
+   // arithmetic type:
+   static_assert( has_common_type<holder<int>, vf2>);
+ 
+   // It's up to the UDT to constrain itself better:
+   static_assert(!has_common_type<holder<int, true>, vf2>);
+ 
+   // However, a strict UDT can still work
+   static_assert( has_common_type<holder<float, true>, vf2>);
+ 
+   // Except if it needs any kind of conversion, even if it's value-preserving. Again the semantics
+   // are what the UDT defined.
+   static_assert(!has_common_type<holder<short, true>, vf2>);
+ 
+   static_assert(!has_deduced_vec<int>);
+   static_assert(!__math_floating_point<int>);
+   static_assert(!__math_floating_point<float>);
+   static_assert(!__math_floating_point<simd::vec<int>>);
+   static_assert( __math_floating_point<simd::vec<float>>);
+ }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/time/time_zone/116110.cc gcc-16-20260322/libstdc++-v3/testsuite/std/time/time_zone/116110.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/time/time_zone/116110.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/time/time_zone/116110.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,86 ----
+ // { dg-do run { target c++20 } }
+ // { dg-require-effective-target tzdb }
+ // { dg-require-effective-target cxx11_abi }
+ 
+ #include <chrono>
+ #include <testsuite_hooks.h>
+ 
+ using namespace std::chrono;
+ 
+ void
+ test_broken_hill()
+ {
+   /*
+   R AN 1996 2005 - Mar lastSun 2s 0 S
+   R AN 2000 o    - Aug lastSun 2s 1 D
+   Z Australia/Broken_Hill 9:25:48 -  LMT  1895 Feb
+                           10      -  AEST 1896 Aug 23
+                           9       -  ACST 1899 May
+                           9:30    AU AC%sT 1971
+                           9:30    AN AC%sT 2000
+                           9:30    AS AC%sT
+   */
+   auto* tz = locate_zone("Australia/Broken_Hill");
+   auto info = tz->get_info(sys_days(2000y/February/29d) + 23h + 23min + 23s);
+   VERIFY( info.offset == 630min );
+   VERIFY( info.save == 60min );
+   VERIFY( info.abbrev == "ACDT" );
+ }
+ 
+ void
+ test_kiritimati()
+ {
+   /* No named rules involved here, just change of fixed STDOFF at 1994-12-31:
+   Z Pacific/Kiritimati -10:29:20 - LMT 1901
+                        -10:40    - %z  1979 Oct
+                        -10       - %z  1994 Dec 31
+                         14       - %z
+   */
+   auto* tz = locate_zone("Pacific/Kiritimati");
+   local_seconds t = local_days(1994y/December/31);
+ 
+   sys_seconds ut(t.time_since_epoch() + 10h);
+   sys_info info;
+   info = tz->get_info(ut - 1s);
+   VERIFY( info.offset == -10h );
+   VERIFY( info.save == 0h );
+   VERIFY( info.abbrev == "-10" );
+   info = tz->get_info(ut);
+   VERIFY( info.offset == 14h );
+   VERIFY( info.save == 0h );
+   VERIFY( info.abbrev == "+14" );
+ }
+ 
+ void
+ test_apia()
+ {
+   /* Refers to same named rule before/after change at 2011-12-29 24:00
+      but the offset changed from -11h+1h to +13h+1h
+   Z Pacific/Apia 12:33:4  -  LMT 1892 Jul 5
+                 -11:26:56 -  LMT 1911
+                 -11:30    -  %z  1950
+                 -11       WS %z  2011 Dec 29 24
+                  13       WS %z
+   */
+   auto* tz = locate_zone("Pacific/Apia");
+   local_seconds t = local_days(2011y/December/29) + 24h;
+ 
+   // FIXME: this should be + 10h but we do not account for DST yet, so + 11h.
+   sys_seconds ut(t.time_since_epoch() + 11h );
+   sys_info info;
+   info = tz->get_info(ut - 1s);
+   VERIFY( info.offset == (-11h + info.save) );
+   VERIFY( info.save == 1h );
+   VERIFY( info.abbrev == "-10" );
+   info = tz->get_info(ut);
+   VERIFY( info.offset == (13h + info.save) );
+   VERIFY( info.save == 1h );
+   VERIFY( info.abbrev == "+14" );
+ }
+ 
+ int main()
+ {
+   test_broken_hill();
+   test_kiritimati();
+   test_apia();
+ }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/time/time_zone/124513.cc gcc-16-20260322/libstdc++-v3/testsuite/std/time/time_zone/124513.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/time/time_zone/124513.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260322/libstdc++-v3/testsuite/std/time/time_zone/124513.cc	Sun Mar 22 22:32:16 2026
***************
*** 0 ****
--- 1,111 ----
+ // { dg-do run { target c++20 } }
+ // { dg-require-effective-target tzdb }
+ // { dg-require-effective-target cxx11_abi }
+ // { dg-xfail-run-if "no weak override on AIX" { powerpc-ibm-aix* } }
+ 
+ #include <chrono>
+ #include <fstream>
+ #include <testsuite_hooks.h>
+ 
+ static bool override_used = false;
+ 
+ namespace __gnu_cxx
+ {
+   const char* zoneinfo_dir_override() {
+     override_used = true;
+     return "./";
+   }
+ }
+ 
+ void
+ test_mawson()
+ {
+   using namespace std::chrono;
+ 
+   std::ofstream("tzdata.zi") << R"(# version test1
+ Z Antarctica/Mawson 0 - -00 1954 F 13
+                     6 - %z  2009 O 18 2
+                     5 - %z
+ )";
+ 
+   const auto& db = reload_tzdb();
+   VERIFY( override_used ); // If this fails then XFAIL for the target.
+   VERIFY( db.version == "test1" );
+ 
+   auto zone = locate_zone("Antarctica/Mawson");
+   auto info = zone->get_info(sys_days(2009y/October/19));
+   VERIFY( info.begin == sys_days(2009y/October/17) + 20h);
+ }
+ 
+ void
+ test_custom()
+ {
+   using namespace std::chrono;
+ 
+   std::ofstream("tzdata.zi") << R"(# version test2
+ Z Test/Zomg 3:00:00 - LMT 1990 Mar 1 2
+             4       - DST 1990 Oct 1 2
+             3       - STD 1991 Mar 1 3:30
+             3       1 DST 1991 Oct 1 3:45:01
+             3       - STD 1992 Mar 1 -
+             3       1 DST 1992 Oct 1 -u
+             3       - STD 1993 Mar 1 -s
+             3       2 DST 1993 Oct 1 -s
+             3       - STD
+ 
+ Z Test/Zoinks 0:00  -    LMT 1990 Mar 1 2
+               0:00  1:00 DST 1990 Oct 1 3
+               0:00  -    STD 1991 Mar 1 1:30
+               0:00  1:00 DST 1991 Oct 1 3:30
+               0:00  -    STD
+ )";
+ 
+   const auto& db = reload_tzdb();
+   VERIFY( override_used ); // If this fails then XFAIL for the target.
+   VERIFY( db.version == "test2" );
+ 
+   const auto offset = 3h;
+ 
+   const time_zone* zone;
+   sys_info info;
+ 
+   zone = locate_zone("Test/Zomg");
+   info = zone->get_info(sys_days(1990y/June/1));
+   VERIFY( info.begin == sys_days(1990y/March/1) + 2h - 3h);
+   VERIFY( info.end   == sys_days(1990y/October/1) + 2h - 4h);
+ 
+   info = zone->get_info(sys_days(1991y/June/1));
+   VERIFY( info.begin == sys_days(1991y/March/1) + 3h + 30min - 3h);
+   VERIFY( info.end   == sys_days(1991y/October/1) + 3h + 45min + 1s - 4h);
+ 
+   info = zone->get_info(sys_days(1992y/June/1));
+   VERIFY( info.begin == sys_days(1992y/March/1) - 3h);
+   VERIFY( info.end   == sys_days(1992y/October/1));   // -u means midnight UTC
+ 
+   info = zone->get_info(sys_days(1992y/November/1));
+   VERIFY( info.begin == sys_days(1992y/October/1));    // -u means midnight UTC
+   VERIFY( info.end   == sys_days(1993y/March/1) - 3h); // -s means midnight STD
+ 
+   info = zone->get_info(sys_days(1993y/June/1));
+   VERIFY( info.begin == sys_days(1993y/March/1) -3h);  // -s means midnight STD
+   VERIFY( info.end   == sys_days(1993y/October/1) - 3h);
+ 
+ 
+   zone = locate_zone("Test/Zoinks");
+   info = zone->get_info(sys_days(1990y/June/1));
+   VERIFY( info.begin == sys_days(1990y/March/1) + 2h);
+   VERIFY( info.end   == sys_days(1990y/October/1) + 3h - 1h);
+ 
+   info = zone->get_info(sys_days(1991y/June/1));
+   VERIFY( info.begin == sys_days(1991y/March/1) + 1h + 30min);
+   VERIFY( info.end   == sys_days(1991y/October/1) + 3h + 30min - 1h);
+ 
+   info = zone->get_info(sys_days(1992y/June/1));
+   VERIFY( info.begin == sys_days(1991y/October/1) + 3h + 30min - 1h);
+ }
+ 
+ int main()
+ {
+   test_custom();
+   test_mawson();
+ }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/time/time_zone/get_info_sys.cc gcc-16-20260322/libstdc++-v3/testsuite/std/time/time_zone/get_info_sys.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/time/time_zone/get_info_sys.cc	Sun Mar 15 22:32:18 2026
--- gcc-16-20260322/libstdc++-v3/testsuite/std/time/time_zone/get_info_sys.cc	Sun Mar 22 22:32:16 2026
*************** test_zurich()
*** 12,44 ****
    const time_zone* const tz = locate_zone("Europe/Zurich");
  
    {
!     sys_days d = 1853y/July/16;
  
!     auto info = tz->get_info(d - 1s);
!     VERIFY( info.offset == (34min + 8s) );
      VERIFY( info.abbrev == "LMT" );
  
!     info = tz->get_info(d);
      VERIFY( info.offset == (29min + 46s) );
      VERIFY( info.abbrev == "BMT" );
  
!     info = tz->get_info(d + 1s);
      VERIFY( info.offset == (29min + 46s) );
      VERIFY( info.abbrev == "BMT" );
  
!     info = tz->get_info(d + 0.001s);
      VERIFY( info.offset == (29min + 46s) );
      VERIFY( info.abbrev == "BMT" );
    }
  
    {
      sys_days d = 1894y/June/1;
  
!     auto info = tz->get_info(d - 1s);
!     VERIFY( info.offset == (29min + 46s) );
      VERIFY( info.abbrev == "BMT" );
  
!     info = tz->get_info(d);
      VERIFY( info.offset == 1h );
      VERIFY( info.abbrev == "CET" );
    }
--- 12,48 ----
    const time_zone* const tz = locate_zone("Europe/Zurich");
  
    {
!     sys_days d = 1853y/July/16; // On this date ...
!     auto offset = 34min + 8s;   // ... local time is this far ahead of UTC,
!     auto t = d - offset;        // so LMT to BMT transition is at this time.
  
!     auto info = tz->get_info(t - 1s);
!     VERIFY( info.offset == offset );
      VERIFY( info.abbrev == "LMT" );
  
!     info = tz->get_info(t);
      VERIFY( info.offset == (29min + 46s) );
      VERIFY( info.abbrev == "BMT" );
  
!     info = tz->get_info(t + 1s);
      VERIFY( info.offset == (29min + 46s) );
      VERIFY( info.abbrev == "BMT" );
  
!     info = tz->get_info(t + 0.001s);
      VERIFY( info.offset == (29min + 46s) );
      VERIFY( info.abbrev == "BMT" );
    }
  
    {
      sys_days d = 1894y/June/1;
+     auto offset = 29min + 46s;
+     auto t = d - offset;
  
!     auto info = tz->get_info(t - 1s);
!     VERIFY( info.offset == offset );
      VERIFY( info.abbrev == "BMT" );
  
!     info = tz->get_info(t);
      VERIFY( info.offset == 1h );
      VERIFY( info.abbrev == "CET" );
    }
diff -Nrcpad gcc-16-20260315/libstdc++-v3/testsuite/std/time/zoned_time/1.cc gcc-16-20260322/libstdc++-v3/testsuite/std/time/zoned_time/1.cc
*** gcc-16-20260315/libstdc++-v3/testsuite/std/time/zoned_time/1.cc	Sun Mar 15 22:32:18 2026
--- gcc-16-20260322/libstdc++-v3/testsuite/std/time/zoned_time/1.cc	Sun Mar 22 22:32:16 2026
*************** test_zurich()
*** 48,71 ****
    const time_zone* const zurich = locate_zone("Europe/Zurich");
  
    {
!     sys_days d = 1853y/July/16;
  
!     auto z = zoned_seconds(zurich, sys_seconds(d) - 1s);
      auto info = z.get_info();
!     VERIFY( info.offset == (34min + 8s) );
      VERIFY( info.abbrev == "LMT" );
  
!     z = zoned_seconds(zurich, d);
      info = z.get_info();
      VERIFY( info.offset == (29min + 46s) );
      VERIFY( info.abbrev == "BMT" );
  
!     z = zoned_seconds(zurich, d + 1s);
      info = z.get_info();
      VERIFY( info.offset == (29min + 46s) );
      VERIFY( info.abbrev == "BMT" );
  
!     auto z2 = zoned_time(zurich, d + 0.001s);
      info = z2.get_info();
      VERIFY( info.offset == (29min + 46s) );
      VERIFY( info.abbrev == "BMT" );
--- 48,73 ----
    const time_zone* const zurich = locate_zone("Europe/Zurich");
  
    {
!     sys_days d = 1853y/July/16; // On this date ...
!     auto offset = 34min + 8s;   // ... local time is this far ahead of UTC,
!     auto t = d - offset;        // so LMT to BMT transition is at this time.
  
!     auto z = zoned_seconds(zurich, t - 1s);
      auto info = z.get_info();
!     VERIFY( info.offset == offset );
      VERIFY( info.abbrev == "LMT" );
  
!     z = zoned_seconds(zurich, t);
      info = z.get_info();
      VERIFY( info.offset == (29min + 46s) );
      VERIFY( info.abbrev == "BMT" );
  
!     z = zoned_seconds(zurich, t + 1s);
      info = z.get_info();
      VERIFY( info.offset == (29min + 46s) );
      VERIFY( info.abbrev == "BMT" );
  
!     auto z2 = zoned_time(zurich, t + 0.001s);
      info = z2.get_info();
      VERIFY( info.offset == (29min + 46s) );
      VERIFY( info.abbrev == "BMT" );
*************** test_zurich()
*** 73,85 ****
  
    {
      sys_days d = 1894y/June/1;
  
!     auto z = zoned_seconds(zurich, sys_seconds(d) - 1s);
      auto info = z.get_info();
      VERIFY( info.offset == (29min + 46s) );
      VERIFY( info.abbrev == "BMT" );
  
!     z = zoned_seconds(zurich, d);
      info = z.get_info();
      VERIFY( info.offset == 1h );
      VERIFY( info.abbrev == "CET" );
--- 75,89 ----
  
    {
      sys_days d = 1894y/June/1;
+     auto offset = 29min + 46s;
+     auto t = d - offset;
  
!     auto z = zoned_seconds(zurich, t - 1s);
      auto info = z.get_info();
      VERIFY( info.offset == (29min + 46s) );
      VERIFY( info.abbrev == "BMT" );
  
!     z = zoned_seconds(zurich, t);
      info = z.get_info();
      VERIFY( info.offset == 1h );
      VERIFY( info.abbrev == "CET" );
