diff -Nrcpad gcc-16-20250525/ChangeLog gcc-16-20250601/ChangeLog
*** gcc-16-20250525/ChangeLog	Sun May 25 22:32:04 2025
--- gcc-16-20250601/ChangeLog	Sun Jun  1 22:32:12 2025
***************
*** 1,3 ****
--- 1,15 ----
+ 2025-05-28  Kugan Vivekanandarajah  <kvivekananda@nvidia.com>
+ 
+ 	* Makefile.def: Fix typo in cpu_type
+ 	* Makefile.tpl: Add cpu_type
+ 
+ 2025-05-26  Kugan Vivekanandarajah  <kvivekananda@nvidia.com>
+ 
+ 	* Makefile.def: AUTO_PROFILE based on cpu_type.
+ 	* Makefile.in: Likewise.
+ 	* configure: Regenerate.
+ 	* configure.ac: Set autofdo_target.
+ 
  2025-05-23  Kishan Parmar  <kishan@linux.ibm.com>
  
  	* MAINTAINERS: Add myself to write after approval.
diff -Nrcpad gcc-16-20250525/LAST_UPDATED gcc-16-20250601/LAST_UPDATED
*** gcc-16-20250525/LAST_UPDATED	Sun May 25 22:32:20 2025
--- gcc-16-20250601/LAST_UPDATED	Sun Jun  1 22:32:53 2025
***************
*** 1 ****
! Obtained from git: master revision 2159f024f63c12fd356748ae8fc106bb9b355688
--- 1 ----
! Obtained from git: master revision 7624186f5f2e3fa6b3792c4af7136caea37e1ef2
diff -Nrcpad gcc-16-20250525/MD5SUMS gcc-16-20250601/MD5SUMS
*** gcc-16-20250525/MD5SUMS	Sun May 25 22:32:24 2025
--- gcc-16-20250601/MD5SUMS	Sun Jun  1 22:32:58 2025
***************
*** 1,5 ****
  # This file contains the MD5 checksums of the files in the
! # gcc-16-20250525.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-20250601.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
*************** b8acb527560fc760209d200fcfab8ff4  .githu
*** 21,35 ****
  fe60d87048567d4fe8c8a0ed2448bcc8  COPYING.RUNTIME
  d32239bcb673463ab874e80d47fae504  COPYING3
  6a6a8e020838b23406c81b19c1d46df6  COPYING3.LIB
! 5b0bd2f3846fef147b49d21edfb27410  ChangeLog
  fd4ecdf5d672efe2b0e409aca9cf9446  ChangeLog.jit
  09538b708302f1735f6fa05b622ecf5e  ChangeLog.tree-ssa
  24ab760126489e69436a43185dc3d202  INSTALL/README
! 04e6a407cf82a33adc950af99ab891ed  LAST_UPDATED
  1fae9b30243be44edfe4dbd7ea871d5f  MAINTAINERS
! b714b83dd28679b75c5fd3e619d35956  Makefile.def
! 9d0808afc70085c5ca8d45062fc59689  Makefile.in
! 7c87bc1ac5389b3184deb34c599d184f  Makefile.tpl
  80d26bc3b1ad4f6969a96a24c9181bf5  README
  d91842c1dd3e9080dd06b73340b682ee  SECURITY.txt
  a657821f65bab77f4fbf3a75cdee6da9  ar-lib
--- 21,35 ----
  fe60d87048567d4fe8c8a0ed2448bcc8  COPYING.RUNTIME
  d32239bcb673463ab874e80d47fae504  COPYING3
  6a6a8e020838b23406c81b19c1d46df6  COPYING3.LIB
! afe3eaf79848eca6a6d105020da15682  ChangeLog
  fd4ecdf5d672efe2b0e409aca9cf9446  ChangeLog.jit
  09538b708302f1735f6fa05b622ecf5e  ChangeLog.tree-ssa
  24ab760126489e69436a43185dc3d202  INSTALL/README
! 295a1811d8b4cdd3651ab7125a04811d  LAST_UPDATED
  1fae9b30243be44edfe4dbd7ea871d5f  MAINTAINERS
! 95166ed050922b15d201d1fa647b5872  Makefile.def
! 20b3d34e305ceb74fbf9ce3f1e57817f  Makefile.in
! 3893d3761aa0864c071907a44196451c  Makefile.tpl
  80d26bc3b1ad4f6969a96a24c9181bf5  README
  d91842c1dd3e9080dd06b73340b682ee  SECURITY.txt
  a657821f65bab77f4fbf3a75cdee6da9  ar-lib
*************** e2dc6b4fd62b77bff96b7951ef74f78f  config
*** 152,160 ****
  7ef51b0adb98e5c5f7aba46d2c7293f1  config/weakref.m4
  0163b672c888aaf1c8ad3e867a0ec9f1  config/zlib.m4
  db74a73c3c9c3cc71edec37c2436e082  config/zstd.m4
! f8cf984b041338224f4741fc5ef0bef6  configure
! 2f2d511befd4187993cfab36cd351319  configure.ac
! 6e5799b7fb0d09afe4d1055df7a1bb5a  contrib/ChangeLog
  5fc435c7928f858246df931ea3f3ece7  contrib/ChangeLog.jit
  7af8d2979bf1a7cfa88e30d05fa22be2  contrib/ChangeLog.tree-ssa
  13605e5ba7b533ecbe3a902b8ebe4079  contrib/analyze_brprob.py
--- 152,160 ----
  7ef51b0adb98e5c5f7aba46d2c7293f1  config/weakref.m4
  0163b672c888aaf1c8ad3e867a0ec9f1  config/zlib.m4
  db74a73c3c9c3cc71edec37c2436e082  config/zstd.m4
! 590e146a5e50931917f0605919922c2e  configure
! 065787892aa35b33dbf17a4247974de1  configure.ac
! ee0613335cef93cc6f0f9375ce947171  contrib/ChangeLog
  5fc435c7928f858246df931ea3f3ece7  contrib/ChangeLog.jit
  7af8d2979bf1a7cfa88e30d05fa22be2  contrib/ChangeLog.tree-ssa
  13605e5ba7b533ecbe3a902b8ebe4079  contrib/analyze_brprob.py
*************** d577ea19d05f19a8364f73c9901223b7  contri
*** 203,209 ****
  5c76e763f702a9ff0203a12551e348d0  contrib/gcc.doxy
  e1a3ba387b3d9bff3516856146cea62d  contrib/gcc_build
  a80a0165b2b8f366a31514e30720bd21  contrib/gcc_update
! 9a64b2964d8a4cc8e2c87ef77c440071  contrib/gen_autofdo_event.py
  067195076559951eff74b6655837f09f  contrib/gennews
  25491ab6a5a68d252f311f5a9c6f4c8f  contrib/git-add-user-branch.sh
  7e5729822d673e846d5ef26e1f1b8591  contrib/git-add-vendor-branch.sh
--- 203,209 ----
  5c76e763f702a9ff0203a12551e348d0  contrib/gcc.doxy
  e1a3ba387b3d9bff3516856146cea62d  contrib/gcc_build
  a80a0165b2b8f366a31514e30720bd21  contrib/gcc_update
! f1df2625cad7941fd494fda00a9ad5f1  contrib/gen_autofdo_event.py
  067195076559951eff74b6655837f09f  contrib/gennews
  25491ab6a5a68d252f311f5a9c6f4c8f  contrib/git-add-user-branch.sh
  7e5729822d673e846d5ef26e1f1b8591  contrib/git-add-vendor-branch.sh
*************** a22e70b3f29292d0e628450f4bb11e62  fixinc
*** 516,522 ****
  a916467b91076e631dd8edb7424769c7  gcc/COPYING.LIB
  d32239bcb673463ab874e80d47fae504  gcc/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/COPYING3.LIB
! 0507655c64e71cc84b7c9eb7f1868282  gcc/ChangeLog
  51281e73aa07fb62394bd72f3c9299ba  gcc/ChangeLog-1997
  f77af8c9ac412064886b00c5506123b5  gcc/ChangeLog-1998
  00a2e4ead1b289bf69bca0196fed6f9f  gcc/ChangeLog-1999
--- 516,522 ----
  a916467b91076e631dd8edb7424769c7  gcc/COPYING.LIB
  d32239bcb673463ab874e80d47fae504  gcc/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/COPYING3.LIB
! 64413e90528f7bd18b313f478c0f8386  gcc/ChangeLog
  51281e73aa07fb62394bd72f3c9299ba  gcc/ChangeLog-1997
  f77af8c9ac412064886b00c5506123b5  gcc/ChangeLog-1998
  00a2e4ead1b289bf69bca0196fed6f9f  gcc/ChangeLog-1999
*************** fb3fadb88e1d2b3b640cfaaa5ff11780  gcc/Ch
*** 553,565 ****
  3eb07e0b2e542409bf73d359f7f65609  gcc/ChangeLog.ptr
  e13638e26743ba41e6011b76cc00d9a9  gcc/ChangeLog.tree-ssa
  739ab47f6425bcea1d05e4fc0542de54  gcc/ChangeLog.tuples
! 7789a8c761f1126a022f72b15db18871  gcc/DATESTAMP
  deb513e591f23901188e22323bd3b1d4  gcc/DEV-PHASE
  eb92e1ff5e982ca07e173e0eb286d243  gcc/FSFChangeLog
  30e1e33411566388b3164558482dc5e6  gcc/FSFChangeLog.10
  36698274bb69e2ada20f5cc434f3caa5  gcc/FSFChangeLog.11
  4dc2573d948287a3722ce977490b026c  gcc/LANGUAGES
! 90d203bb833e9f22ccd67fed734a5bc8  gcc/Makefile.in
  ec6799501b2eb2923d5de6a66169dbd2  gcc/ONEWS
  15d6908b4409b0925d9f1c72b56b5cb7  gcc/README.Portability
  cd96bf34cb76c97f86704a59b9ddb18a  gcc/acinclude.m4
--- 553,565 ----
  3eb07e0b2e542409bf73d359f7f65609  gcc/ChangeLog.ptr
  e13638e26743ba41e6011b76cc00d9a9  gcc/ChangeLog.tree-ssa
  739ab47f6425bcea1d05e4fc0542de54  gcc/ChangeLog.tuples
! 09b52300350e408b25f6f8ade12c1cae  gcc/DATESTAMP
  deb513e591f23901188e22323bd3b1d4  gcc/DEV-PHASE
  eb92e1ff5e982ca07e173e0eb286d243  gcc/FSFChangeLog
  30e1e33411566388b3164558482dc5e6  gcc/FSFChangeLog.10
  36698274bb69e2ada20f5cc434f3caa5  gcc/FSFChangeLog.11
  4dc2573d948287a3722ce977490b026c  gcc/LANGUAGES
! 02f8738144124e21366e7814a6c926ce  gcc/Makefile.in
  ec6799501b2eb2923d5de6a66169dbd2  gcc/ONEWS
  15d6908b4409b0925d9f1c72b56b5cb7  gcc/README.Portability
  cd96bf34cb76c97f86704a59b9ddb18a  gcc/acinclude.m4
*************** c77616ec7ed7ec81357de9544f955910  gcc/at
*** 3189,3197 ****
  05d6a8f61e165cf9438457af9042b98f  gcc/attribs.cc
  1bdf6723b4c88b5b1495f718e4dd00c7  gcc/attribs.h
  54fb3cb1cab63227c50a50819ea1a3c3  gcc/auto-inc-dec.cc
! 3de302030b825a47ae596218c96f18fe  gcc/auto-profile.cc
  fe453e02b17197af9a9101edb6590b74  gcc/auto-profile.h
! db21702a52f8bcf4cf64f9fb345d9d8a  gcc/avoid-store-forwarding.cc
  b187aaef50f37afeeee1f8239d5aa033  gcc/avoid-store-forwarding.h
  db748cbed8c442a442779d8d857a3ae4  gcc/backend.h
  d6b885b0c4ea7cf856ba4b84021613ce  gcc/basic-block.h
--- 3189,3197 ----
  05d6a8f61e165cf9438457af9042b98f  gcc/attribs.cc
  1bdf6723b4c88b5b1495f718e4dd00c7  gcc/attribs.h
  54fb3cb1cab63227c50a50819ea1a3c3  gcc/auto-inc-dec.cc
! b2d17f9e0332eaa196506e9a769962d8  gcc/auto-profile.cc
  fe453e02b17197af9a9101edb6590b74  gcc/auto-profile.h
! b49502046f4647eae48740d67a1ad97e  gcc/avoid-store-forwarding.cc
  b187aaef50f37afeeee1f8239d5aa033  gcc/avoid-store-forwarding.h
  db748cbed8c442a442779d8d857a3ae4  gcc/backend.h
  d6b885b0c4ea7cf856ba4b84021613ce  gcc/basic-block.h
*************** f808dbcc1ad6add5a0867c4b3e03fc4d  gcc/bu
*** 3206,3219 ****
  d8ff60ecebd67b2be7141da80578a9ef  gcc/builtins.cc
  d7a735fed7d7781add6ff1f190c2496f  gcc/builtins.def
  bd61b50b47560dc1324bf507bea5d87e  gcc/builtins.h
! 23c67511bb682b5260b02be1aa252dce  gcc/c-family/ChangeLog
  ea3fa1f4d7390a105fa3caab4f79aaf7  gcc/c-family/ChangeLog.gimple-classes
  823fe168bb0f63a39de62d9f0251a1b5  gcc/c-family/c-ada-spec.cc
  4e83011bee68d9607834ed5335191d65  gcc/c-family/c-ada-spec.h
  5a2e850515c6ecb57ffe6c19cadc6656  gcc/c-family/c-attribs.cc
! ef8691fea2743b186609ec02d8c35859  gcc/c-family/c-common.cc
! 7d631d63d02c9fdb7b800977cd8dc894  gcc/c-family/c-common.def
! c6ac8fb15a8d6272184d999f651d660d  gcc/c-family/c-common.h
  1c57db57b8673a678e1501b694ea87e0  gcc/c-family/c-cppbuiltin.cc
  01db2d5cca29943c49bb372f2137d874  gcc/c-family/c-dump.cc
  3406e6deaa6e96339c86962c3c82e169  gcc/c-family/c-format.cc
--- 3206,3219 ----
  d8ff60ecebd67b2be7141da80578a9ef  gcc/builtins.cc
  d7a735fed7d7781add6ff1f190c2496f  gcc/builtins.def
  bd61b50b47560dc1324bf507bea5d87e  gcc/builtins.h
! 81ea8d610ae1622344be8caab17dbf6d  gcc/c-family/ChangeLog
  ea3fa1f4d7390a105fa3caab4f79aaf7  gcc/c-family/ChangeLog.gimple-classes
  823fe168bb0f63a39de62d9f0251a1b5  gcc/c-family/c-ada-spec.cc
  4e83011bee68d9607834ed5335191d65  gcc/c-family/c-ada-spec.h
  5a2e850515c6ecb57ffe6c19cadc6656  gcc/c-family/c-attribs.cc
! c2c735946b54e5b592fe957bb4732f76  gcc/c-family/c-common.cc
! c273c4ad95ccdbfe677146505900c62e  gcc/c-family/c-common.def
! 19fb19e4311805f52f48f30e7873ad2e  gcc/c-family/c-common.h
  1c57db57b8673a678e1501b694ea87e0  gcc/c-family/c-cppbuiltin.cc
  01db2d5cca29943c49bb372f2137d874  gcc/c-family/c-dump.cc
  3406e6deaa6e96339c86962c3c82e169  gcc/c-family/c-format.cc
*************** c6ac8fb15a8d6272184d999f651d660d  gcc/c-
*** 3223,3229 ****
  a4b7179d2e948bb7586a9143fbe05593  gcc/c-family/c-indentation.h
  4c01c042c599ee5c7b21aeb2c0cccbe8  gcc/c-family/c-lex.cc
  c880dc584a0fd4908e5df33dd81137b8  gcc/c-family/c-objc.h
! 3609801f0f05c77393ed160a1b16d1c8  gcc/c-family/c-omp.cc
  3a6dcb45673c45ce1464ac5794d8f636  gcc/c-family/c-opts.cc
  2f1a14531d3a436ca9f4aad2812c3898  gcc/c-family/c-pch.cc
  6e53d008a0c4738339154c353a50ff0a  gcc/c-family/c-ppoutput.cc
--- 3223,3229 ----
  a4b7179d2e948bb7586a9143fbe05593  gcc/c-family/c-indentation.h
  4c01c042c599ee5c7b21aeb2c0cccbe8  gcc/c-family/c-lex.cc
  c880dc584a0fd4908e5df33dd81137b8  gcc/c-family/c-objc.h
! 1876df40eecc9db5f99f1b943e7ed8f3  gcc/c-family/c-omp.cc
  3a6dcb45673c45ce1464ac5794d8f636  gcc/c-family/c-opts.cc
  2f1a14531d3a436ca9f4aad2812c3898  gcc/c-family/c-pch.cc
  6e53d008a0c4738339154c353a50ff0a  gcc/c-family/c-ppoutput.cc
*************** aaf683e3b02704cfbfab0627d82edf85  gcc/c-
*** 3249,3270 ****
  ce9d2259a1edb5d4b1f728988bd9ef6a  gcc/c-family/known-headers.h
  f09c431056b5138e7cfe8376e05de9a6  gcc/c-family/name-hint.h
  d71f74b5b48d9ec5e4e6463e7330121d  gcc/c-family/stub-objc.cc
! d431882d3264325f169f3d375e18ede9  gcc/c/ChangeLog
  b1fc09d2244c8e8a72b4df9bc9af30d7  gcc/c/Make-lang.in
  f1e5593aebd5cffb4b3cbffe6bd0860a  gcc/c/c-aux-info.cc
  178d24653bb20936d73bad078e70763c  gcc/c/c-convert.cc
! 24ee99269c34f1bfd67fcb1ca710db5c  gcc/c/c-decl.cc
  3601ac6299bb2579fedc2dcf2aba7773  gcc/c/c-errors.cc
  d9b5dea1631cefab5fe5ca3602db30f0  gcc/c/c-fold.cc
  d9c0725d061adffdf400457d91be3aed  gcc/c/c-lang.cc
  5466f6371f54fce4ae89206f7792bd01  gcc/c/c-lang.h
! de5ddc42b7b2fb6eea5a9db6d74836ca  gcc/c/c-objc-common.cc
! f9dc3d10fbfaa2d38905bc4e2579ba2b  gcc/c/c-objc-common.h
! 7ed42dc31e120d2cba156c0f7c375ee6  gcc/c/c-parser.cc
  9c122bd6feb8ae4a94420c890e654801  gcc/c/c-parser.h
  9179f46b6a06c7d734278f5ce2c55883  gcc/c/c-tree.def
! f7331ce09e3bb7374f8cebf0a2195d47  gcc/c/c-tree.h
! ab031e53098b729e77a138bdf742ec1c  gcc/c/c-typeck.cc
  cd371895d730dd64e947066b2e4378f8  gcc/c/config-lang.in
  1bd76a24d1322659f048abe2272a6f34  gcc/c/gccspec.cc
  c169f2d94910060e76c333db12b960b9  gcc/c/gimple-parser.cc
--- 3249,3270 ----
  ce9d2259a1edb5d4b1f728988bd9ef6a  gcc/c-family/known-headers.h
  f09c431056b5138e7cfe8376e05de9a6  gcc/c-family/name-hint.h
  d71f74b5b48d9ec5e4e6463e7330121d  gcc/c-family/stub-objc.cc
! 17788e40831e9f4517dcbcdfbdf89907  gcc/c/ChangeLog
  b1fc09d2244c8e8a72b4df9bc9af30d7  gcc/c/Make-lang.in
  f1e5593aebd5cffb4b3cbffe6bd0860a  gcc/c/c-aux-info.cc
  178d24653bb20936d73bad078e70763c  gcc/c/c-convert.cc
! 582473af68170ff4ab51cf79a342fa0a  gcc/c/c-decl.cc
  3601ac6299bb2579fedc2dcf2aba7773  gcc/c/c-errors.cc
  d9b5dea1631cefab5fe5ca3602db30f0  gcc/c/c-fold.cc
  d9c0725d061adffdf400457d91be3aed  gcc/c/c-lang.cc
  5466f6371f54fce4ae89206f7792bd01  gcc/c/c-lang.h
! 29c0a26baf73e55c081ac675fa7f87f8  gcc/c/c-objc-common.cc
! 757f583d06a3ec98336adbfc92b4e6a8  gcc/c/c-objc-common.h
! ea6a5b958887bedd49e539b5ae220033  gcc/c/c-parser.cc
  9c122bd6feb8ae4a94420c890e654801  gcc/c/c-parser.h
  9179f46b6a06c7d734278f5ce2c55883  gcc/c/c-tree.def
! 9cef7f8aed78affc01930dfcb3d3185c  gcc/c/c-tree.h
! 75eeb7a09737d9ec5312ddfd0f541122  gcc/c/c-typeck.cc
  cd371895d730dd64e947066b2e4378f8  gcc/c/config-lang.in
  1bd76a24d1322659f048abe2272a6f34  gcc/c/gccspec.cc
  c169f2d94910060e76c333db12b960b9  gcc/c/gimple-parser.cc
*************** bbad65845fcf9cdbc5137d96f92eacab  gcc/cf
*** 3294,3300 ****
  7c2358ab451ca13a153f64b7682d772a  gcc/cfgloopmanip.h
  20ff4e719c1fd355d84cd960d72aff7f  gcc/cfgrtl.cc
  28d9dedd6044321fe1df02d3575f81e9  gcc/cfgrtl.h
! afcd9ceffbf6a6dc558bcfb1d9f3807d  gcc/cgraph.cc
  cc50b703ddacf4f5ef66bd38576c5e1f  gcc/cgraph.h
  5fa2e94f261a8a6fc0d80b1c4b227d25  gcc/cgraphbuild.cc
  b87eab2b04054f0d3cd20768be99c655  gcc/cgraphclones.cc
--- 3294,3300 ----
  7c2358ab451ca13a153f64b7682d772a  gcc/cfgloopmanip.h
  20ff4e719c1fd355d84cd960d72aff7f  gcc/cfgrtl.cc
  28d9dedd6044321fe1df02d3575f81e9  gcc/cfgrtl.h
! e848a125c3f6457fe4403eb3726651e6  gcc/cgraph.cc
  cc50b703ddacf4f5ef66bd38576c5e1f  gcc/cgraph.h
  5fa2e94f261a8a6fc0d80b1c4b227d25  gcc/cgraphbuild.cc
  b87eab2b04054f0d3cd20768be99c655  gcc/cgraphclones.cc
*************** cd566058e56e0bdd6d5fc6174d575702  gcc/co
*** 3320,3326 ****
  e9f9397b294013c218ab16870d43e8ef  gcc/cobol/gcobolspec.cc
  9e37c8e8883f3c043bd5bf4392bd91f9  gcc/cobol/genapi.cc
  9405cedcadb1d8d4dc1ec68fc2fb0c59  gcc/cobol/genapi.h
! b04330097798bdf9cbc4959b4ecf7ce8  gcc/cobol/gengen.cc
  5a15fbb14271aa588750f652642e3b68  gcc/cobol/gengen.h
  03907d50aa67f715c8b1af3c9fc37fd2  gcc/cobol/genmath.cc
  d44e8c86d57fb704b6c1fbab3464fb9a  gcc/cobol/genmath.h
--- 3320,3326 ----
  e9f9397b294013c218ab16870d43e8ef  gcc/cobol/gcobolspec.cc
  9e37c8e8883f3c043bd5bf4392bd91f9  gcc/cobol/genapi.cc
  9405cedcadb1d8d4dc1ec68fc2fb0c59  gcc/cobol/genapi.h
! 033c74fe6abf78033a7be7135bc86e96  gcc/cobol/gengen.cc
  5a15fbb14271aa588750f652642e3b68  gcc/cobol/gengen.h
  03907d50aa67f715c8b1af3c9fc37fd2  gcc/cobol/genmath.cc
  d44e8c86d57fb704b6c1fbab3464fb9a  gcc/cobol/genmath.h
*************** ddbb7a934f8b8aa068e7b765c4375fbe  gcc/co
*** 3431,3437 ****
  d1e3bcda28d89d23e45fed74c629752a  gcc/config/aarch64/aarch64-c.cc
  ba4e797220b33827e769b09447623896  gcc/config/aarch64/aarch64-cc-fusion.cc
  133f61af7e288fe91ca31c659939c551  gcc/config/aarch64/aarch64-coff.h
! 307dc3ae557921b9ae7ec79c503e3493  gcc/config/aarch64/aarch64-cores.def
  f0a8397b1e293e23f65674cd004845ae  gcc/config/aarch64/aarch64-cost-tables.h
  bef2a61270424fd606c71d78d20ad675  gcc/config/aarch64/aarch64-d.cc
  36405b6300d5ec6ca8faf17212ad1bc9  gcc/config/aarch64/aarch64-d.h
--- 3431,3437 ----
  d1e3bcda28d89d23e45fed74c629752a  gcc/config/aarch64/aarch64-c.cc
  ba4e797220b33827e769b09447623896  gcc/config/aarch64/aarch64-cc-fusion.cc
  133f61af7e288fe91ca31c659939c551  gcc/config/aarch64/aarch64-coff.h
! 7dda5796a58478b5dadaba93a4cca59a  gcc/config/aarch64/aarch64-cores.def
  f0a8397b1e293e23f65674cd004845ae  gcc/config/aarch64/aarch64-cost-tables.h
  bef2a61270424fd606c71d78d20ad675  gcc/config/aarch64/aarch64-d.cc
  36405b6300d5ec6ca8faf17212ad1bc9  gcc/config/aarch64/aarch64-d.h
*************** d98f001d9d7b4c0bc18d715b4d512ab9  gcc/co
*** 3504,3509 ****
--- 3504,3510 ----
  034ef57fb17f601ded123d7a43b51d02  gcc/config/aarch64/cygming.h
  13b725f057e939c7ebe5bd19da1df7ee  gcc/config/aarch64/driver-aarch64.cc
  f713d33fdaee532813b56547dd070c8c  gcc/config/aarch64/fractional-cost.h
+ f7165d62ef852e1929a8fc9a85c01ab2  gcc/config/aarch64/gcc-auto-profile
  dfcdbda4a3bb64a86fdf64ce6fce0ae3  gcc/config/aarch64/geniterators.sh
  bc3b4ebfac8bfd42d3e9098f33585afd  gcc/config/aarch64/gentune.sh
  86eaf33edeb885c2c9ae2a9825879e59  gcc/config/aarch64/host-aarch64-darwin.cc
*************** e108c439db2df07c2f3568b86334ec16  gcc/co
*** 4154,4160 ****
  7bcbd255d807f30c40460ae60fb9ac0c  gcc/config/i386/freebsd64.h
  33b49ebfc38cdd3aec432be462771030  gcc/config/i386/fxsrintrin.h
  633192932be295b101e6b91080050160  gcc/config/i386/gas.h
! 23aca983be5fc469ede4a142e9209e33  gcc/config/i386/gcc-auto-profile
  cf7550e185f085130597d96f3f750f56  gcc/config/i386/geode.md
  0fa60b566e6b6bb6418eccdb74f0fd79  gcc/config/i386/gfniintrin.h
  880c7b716fd97054162f5aa17551d9fb  gcc/config/i386/glm.md
--- 4155,4161 ----
  7bcbd255d807f30c40460ae60fb9ac0c  gcc/config/i386/freebsd64.h
  33b49ebfc38cdd3aec432be462771030  gcc/config/i386/fxsrintrin.h
  633192932be295b101e6b91080050160  gcc/config/i386/gas.h
! 05f3ebe892e8fe139f8671fc072aab93  gcc/config/i386/gcc-auto-profile
  cf7550e185f085130597d96f3f750f56  gcc/config/i386/geode.md
  0fa60b566e6b6bb6418eccdb74f0fd79  gcc/config/i386/gfniintrin.h
  880c7b716fd97054162f5aa17551d9fb  gcc/config/i386/glm.md
*************** d3fb594d11281112ff8d8f304a000c4e  gcc/co
*** 4178,4184 ****
  a4a1a27264871bfba9de0f4fbdb4f3ac  gcc/config/i386/i386-c.cc
  54909bb70e074c14dcf4499a5baedc54  gcc/config/i386/i386-d.cc
  172dcd61afc5800b61ebb688838d9adc  gcc/config/i386/i386-d.h
! 42e783c69179913641c796350a28c8be  gcc/config/i386/i386-expand.cc
  c9c3969c00808c9b6809fbeab3e4a1d2  gcc/config/i386/i386-expand.h
  a2d9d361545bc99dfd0850cfdf4008c1  gcc/config/i386/i386-features.cc
  1ee34fa5f2ae92fd7d48419d8fc529f8  gcc/config/i386/i386-features.h
--- 4179,4185 ----
  a4a1a27264871bfba9de0f4fbdb4f3ac  gcc/config/i386/i386-c.cc
  54909bb70e074c14dcf4499a5baedc54  gcc/config/i386/i386-d.cc
  172dcd61afc5800b61ebb688838d9adc  gcc/config/i386/i386-d.h
! 73a463154d75e1c82f31b27ca557f7fe  gcc/config/i386/i386-expand.cc
  c9c3969c00808c9b6809fbeab3e4a1d2  gcc/config/i386/i386-expand.h
  a2d9d361545bc99dfd0850cfdf4008c1  gcc/config/i386/i386-features.cc
  1ee34fa5f2ae92fd7d48419d8fc529f8  gcc/config/i386/i386-features.h
*************** ae55d83d5b332e663522f2352f5a3282  gcc/co
*** 4193,4199 ****
  b19c27e8a900f9eeb7d73e2bb4b8d313  gcc/config/i386/i386-rust.cc
  24065393854cd1e08e3285bd707210fe  gcc/config/i386/i386-rust.h
  78d20fa951c51eb623997a6948444b3d  gcc/config/i386/i386.cc
! 12bd0bfd0392d37d28f0d3a075c22b32  gcc/config/i386/i386.h
  8a6e365060f13dd33aedf4d0582a8b82  gcc/config/i386/i386.md
  23985b411cb15228b631691265bfefe9  gcc/config/i386/i386.opt
  59cb9adff8fe9d24eed1cfac0c5bf62c  gcc/config/i386/i386.opt.urls
--- 4194,4200 ----
  b19c27e8a900f9eeb7d73e2bb4b8d313  gcc/config/i386/i386-rust.cc
  24065393854cd1e08e3285bd707210fe  gcc/config/i386/i386-rust.h
  78d20fa951c51eb623997a6948444b3d  gcc/config/i386/i386.cc
! a6cfbe637ab786c041cc2872a71bc247  gcc/config/i386/i386.h
  8a6e365060f13dd33aedf4d0582a8b82  gcc/config/i386/i386.md
  23985b411cb15228b631691265bfefe9  gcc/config/i386/i386.opt
  59cb9adff8fe9d24eed1cfac0c5bf62c  gcc/config/i386/i386.opt.urls
*************** b4cde95b709fc93c90bf4d6b3edc7fd0  gcc/co
*** 4305,4316 ****
  78c5d4aaa3e531354ff15f5de8bbe5f6  gcc/config/i386/x-mingw32
  1453972221e67e9b66910b97c6444e98  gcc/config/i386/x-mingw32-utf8
  458dd4e367214623fc01b5e796d65485  gcc/config/i386/x86-64.h
! 1a8b58eefca19359fa5d02ee4f2d2d30  gcc/config/i386/x86-tune-costs.h
  17e3f95274600e3d41c671903847d8ec  gcc/config/i386/x86-tune-sched-atom.cc
  acfa3e6ce1f37bbad35e49e06b663ea9  gcc/config/i386/x86-tune-sched-bd.cc
  13fcb5234b2d8208c12932d96efef72b  gcc/config/i386/x86-tune-sched-core.cc
  9054e39f9f68ade31cfdeb33e9c905ce  gcc/config/i386/x86-tune-sched.cc
! 29d864447ea152baac4880e98ba5796f  gcc/config/i386/x86-tune.def
  95b91fd21504348ecd2f8510ebab204c  gcc/config/i386/x86gprintrin.h
  1ef1746c703bfdb9c245f7b7276b7d56  gcc/config/i386/x86intrin.h
  709155b5a0371d397baf22295493b77b  gcc/config/i386/xm-cygwin.h
--- 4306,4317 ----
  78c5d4aaa3e531354ff15f5de8bbe5f6  gcc/config/i386/x-mingw32
  1453972221e67e9b66910b97c6444e98  gcc/config/i386/x-mingw32-utf8
  458dd4e367214623fc01b5e796d65485  gcc/config/i386/x86-64.h
! b4bf5ad9f215cd28c4f2443dcadaf245  gcc/config/i386/x86-tune-costs.h
  17e3f95274600e3d41c671903847d8ec  gcc/config/i386/x86-tune-sched-atom.cc
  acfa3e6ce1f37bbad35e49e06b663ea9  gcc/config/i386/x86-tune-sched-bd.cc
  13fcb5234b2d8208c12932d96efef72b  gcc/config/i386/x86-tune-sched-core.cc
  9054e39f9f68ade31cfdeb33e9c905ce  gcc/config/i386/x86-tune-sched.cc
! 923a6304c99ebb6bc9509acbe1afd4fd  gcc/config/i386/x86-tune.def
  95b91fd21504348ecd2f8510ebab204c  gcc/config/i386/x86gprintrin.h
  1ef1746c703bfdb9c245f7b7276b7d56  gcc/config/i386/x86intrin.h
  709155b5a0371d397baf22295493b77b  gcc/config/i386/xm-cygwin.h
*************** cd13b51383c99c08d86250b61fed3805  gcc/co
*** 4890,4897 ****
  540013c309ceb3efb2b16d728b1fc726  gcc/config/pru/t-pru
  a5e691ce14017f2a89283ed510bb78fd  gcc/config/riscv/arch-canonicalize
  16758263c2b4e1f25075a6baeb22e0a0  gcc/config/riscv/autovec-opt.md
! 4032274539da6915927b3fb611848f38  gcc/config/riscv/autovec.md
! 3a923d5960324ed1cd044158c2de7acd  gcc/config/riscv/bitmanip.md
  c21886991e632848d5622ed5a3188f75  gcc/config/riscv/constraints.md
  4e0968dc35562b151fd162778542718f  gcc/config/riscv/corev.def
  d404c19d5b1a2aca0a73917bb692bd96  gcc/config/riscv/corev.md
--- 4891,4898 ----
  540013c309ceb3efb2b16d728b1fc726  gcc/config/pru/t-pru
  a5e691ce14017f2a89283ed510bb78fd  gcc/config/riscv/arch-canonicalize
  16758263c2b4e1f25075a6baeb22e0a0  gcc/config/riscv/autovec-opt.md
! 829cbcecbc17da1539fb79b7512d1523  gcc/config/riscv/autovec.md
! 40e0e0684e3c3a934587129211c4674c  gcc/config/riscv/bitmanip.md
  c21886991e632848d5622ed5a3188f75  gcc/config/riscv/constraints.md
  4e0968dc35562b151fd162778542718f  gcc/config/riscv/corev.def
  d404c19d5b1a2aca0a73917bb692bd96  gcc/config/riscv/corev.md
*************** d7a63bbbf6653fc311084e8bb09d713b  gcc/co
*** 4923,4930 ****
  a8a293d3f8f01367abc68e7556a51898  gcc/config/riscv/riscv-ext-sifive.def
  85fb34f0d0de09dc83b4df6f525d78f9  gcc/config/riscv/riscv-ext-thead.def
  5551f756c3aae6dce60511f7f52efa5c  gcc/config/riscv/riscv-ext-ventana.def
! 885aec0bfffaa704ac0566a62fa5e613  gcc/config/riscv/riscv-ext.def
! abebc96ebce10e6cdf4f183d4fe9253f  gcc/config/riscv/riscv-ext.opt
  8463b74f5d66e1a7f0d58a7ae087d8ad  gcc/config/riscv/riscv-ext.opt.urls
  1b0b6b632f747d9387ef25821e8673b4  gcc/config/riscv/riscv-feature-bits.h
  b467d35485b39b25863e918609a322d0  gcc/config/riscv/riscv-ftypes.def
--- 4924,4931 ----
  a8a293d3f8f01367abc68e7556a51898  gcc/config/riscv/riscv-ext-sifive.def
  85fb34f0d0de09dc83b4df6f525d78f9  gcc/config/riscv/riscv-ext-thead.def
  5551f756c3aae6dce60511f7f52efa5c  gcc/config/riscv/riscv-ext-ventana.def
! b2c54459a7c24791287bb323e6f1e1f2  gcc/config/riscv/riscv-ext.def
! 8ba788831dfb8ea5b2ca13c4883ca31e  gcc/config/riscv/riscv-ext.opt
  8463b74f5d66e1a7f0d58a7ae087d8ad  gcc/config/riscv/riscv-ext.opt.urls
  1b0b6b632f747d9387ef25821e8673b4  gcc/config/riscv/riscv-feature-bits.h
  b467d35485b39b25863e918609a322d0  gcc/config/riscv/riscv-ftypes.def
*************** da4e034d23a8f2754b1dfce0122f286e  gcc/co
*** 4939,4963 ****
  5934e743da72bdc74e1d53f049b127fc  gcc/config/riscv/riscv-string.cc
  f2f90e0d4af72ad1c79aba2821be11b4  gcc/config/riscv/riscv-subset.h
  be3e0da2403121c429e21501de9c9b5f  gcc/config/riscv/riscv-target-attr.cc
! 121616f8e0ac1bc00f18def6efadd07d  gcc/config/riscv/riscv-v.cc
  0d419e9df116fed7ce6e0ae15131417e  gcc/config/riscv/riscv-v.h
  c5f3161dedd668dfb126ffb191cfb236  gcc/config/riscv/riscv-vect-permconst.cc
  8bb68ed754e01cc6cbd31b250968d7f6  gcc/config/riscv/riscv-vector-builtins-bases.cc
  689f453a4cdf7fa3e64a7f4bfba8f7dd  gcc/config/riscv/riscv-vector-builtins-bases.h
  bdc5f6caf56fd0411faf705e9c32ccd4  gcc/config/riscv/riscv-vector-builtins-functions.def
! 0227723636a8ad9cf968084248b5aa7b  gcc/config/riscv/riscv-vector-builtins-shapes.cc
  7e178dc137007d4ca1aaaaf29940c12f  gcc/config/riscv/riscv-vector-builtins-shapes.h
  83165bddb05b2721bc426bd1fe3ec4c0  gcc/config/riscv/riscv-vector-builtins-types.def
  e4137796901da09141309284b35af93c  gcc/config/riscv/riscv-vector-builtins.cc
  74c291180c302842c646af24c77d184c  gcc/config/riscv/riscv-vector-builtins.def
! f75c79d146d75e5489bb9983fcdd05f6  gcc/config/riscv/riscv-vector-builtins.h
  65ec1ed9e89dd3e0ac6f1970dad075b9  gcc/config/riscv/riscv-vector-costs.cc
  bd7a0d0d03ad4788f6cf7579df11a66e  gcc/config/riscv/riscv-vector-costs.h
  f51037a9e437f8e9ce7215b2da5ad4e2  gcc/config/riscv/riscv-vector-switch.def
  3c65f952c8116cc22f135cab9b639d28  gcc/config/riscv/riscv-vsetvl.cc
  16b7359c0b12895c0d7452fc89879a1a  gcc/config/riscv/riscv-vsetvl.def
  7082a18dbfc574d47bf71f4d50dd30f9  gcc/config/riscv/riscv-zicfilp.cc
! e0fd0f44787e05dbaa4e7351077bf9dc  gcc/config/riscv/riscv.cc
  1153302a8d65cedebba8e1a3f67931b2  gcc/config/riscv/riscv.h
  80eb1b2e57c5210d62f3ce508190ae70  gcc/config/riscv/riscv.md
  9ea65ab93a9cc69269d47111131897e5  gcc/config/riscv/riscv.opt
--- 4940,4964 ----
  5934e743da72bdc74e1d53f049b127fc  gcc/config/riscv/riscv-string.cc
  f2f90e0d4af72ad1c79aba2821be11b4  gcc/config/riscv/riscv-subset.h
  be3e0da2403121c429e21501de9c9b5f  gcc/config/riscv/riscv-target-attr.cc
! ac57826b303b5c245d7bfd38103fc05b  gcc/config/riscv/riscv-v.cc
  0d419e9df116fed7ce6e0ae15131417e  gcc/config/riscv/riscv-v.h
  c5f3161dedd668dfb126ffb191cfb236  gcc/config/riscv/riscv-vect-permconst.cc
  8bb68ed754e01cc6cbd31b250968d7f6  gcc/config/riscv/riscv-vector-builtins-bases.cc
  689f453a4cdf7fa3e64a7f4bfba8f7dd  gcc/config/riscv/riscv-vector-builtins-bases.h
  bdc5f6caf56fd0411faf705e9c32ccd4  gcc/config/riscv/riscv-vector-builtins-functions.def
! 1a84bfaa3f89d99edacd5d2eb1444186  gcc/config/riscv/riscv-vector-builtins-shapes.cc
  7e178dc137007d4ca1aaaaf29940c12f  gcc/config/riscv/riscv-vector-builtins-shapes.h
  83165bddb05b2721bc426bd1fe3ec4c0  gcc/config/riscv/riscv-vector-builtins-types.def
  e4137796901da09141309284b35af93c  gcc/config/riscv/riscv-vector-builtins.cc
  74c291180c302842c646af24c77d184c  gcc/config/riscv/riscv-vector-builtins.def
! 9b7d99df8e2f12e55ad2fce0020b462c  gcc/config/riscv/riscv-vector-builtins.h
  65ec1ed9e89dd3e0ac6f1970dad075b9  gcc/config/riscv/riscv-vector-costs.cc
  bd7a0d0d03ad4788f6cf7579df11a66e  gcc/config/riscv/riscv-vector-costs.h
  f51037a9e437f8e9ce7215b2da5ad4e2  gcc/config/riscv/riscv-vector-switch.def
  3c65f952c8116cc22f135cab9b639d28  gcc/config/riscv/riscv-vsetvl.cc
  16b7359c0b12895c0d7452fc89879a1a  gcc/config/riscv/riscv-vsetvl.def
  7082a18dbfc574d47bf71f4d50dd30f9  gcc/config/riscv/riscv-zicfilp.cc
! 77111d1ecb7b54dd27ec2b9177d75656  gcc/config/riscv/riscv.cc
  1153302a8d65cedebba8e1a3f67931b2  gcc/config/riscv/riscv.h
  80eb1b2e57c5210d62f3ce508190ae70  gcc/config/riscv/riscv.md
  9ea65ab93a9cc69269d47111131897e5  gcc/config/riscv/riscv.opt
*************** bcf728ad2379630774fd5bb529d4ee86  gcc/co
*** 4993,4999 ****
  fd8e9517de64ab23821ea1284ea6d7f6  gcc/config/riscv/thead.md
  b5e46305db1116cc1758b504ea37fe74  gcc/config/riscv/vector-bfloat16.md
  88f7597398d0c8b8b87baba5fd207996  gcc/config/riscv/vector-crypto.md
! 48377612cee1b361a5ead40b972cff2a  gcc/config/riscv/vector-iterators.md
  2aac5fc6721c093a0f679d0e14d196e1  gcc/config/riscv/vector.md
  4ffde0be9b9a0efe78c98b4407d00397  gcc/config/riscv/xiangshan.md
  0f64aaa114ab62a1a46f7ac422d6a129  gcc/config/riscv/zc.md
--- 4994,5000 ----
  fd8e9517de64ab23821ea1284ea6d7f6  gcc/config/riscv/thead.md
  b5e46305db1116cc1758b504ea37fe74  gcc/config/riscv/vector-bfloat16.md
  88f7597398d0c8b8b87baba5fd207996  gcc/config/riscv/vector-crypto.md
! 1deb0295523d56fc4fc04a68a1b7230a  gcc/config/riscv/vector-iterators.md
  2aac5fc6721c093a0f679d0e14d196e1  gcc/config/riscv/vector.md
  4ffde0be9b9a0efe78c98b4407d00397  gcc/config/riscv/xiangshan.md
  0f64aaa114ab62a1a46f7ac422d6a129  gcc/config/riscv/zc.md
*************** dce39de8bb20b88ffeb8b2073101dcfe  gcc/co
*** 5123,5129 ****
  5621b2aa0be1c71c3955c4e3bad6cf49  gcc/config/rs6000/rs6000-string.cc
  062e9e612338d86d0d47a3e1131384fa  gcc/config/rs6000/rs6000-tables.opt
  ce8de9a27f36b759a69194616c02eb38  gcc/config/rs6000/rs6000-tables.opt.urls
! a73b51e5388b6105a8a47c93eff5cce6  gcc/config/rs6000/rs6000.cc
  1d91827dae3ab7a332473805ac3cf40c  gcc/config/rs6000/rs6000.h
  ad1b62754d030b34f5ff67d2991b43b1  gcc/config/rs6000/rs6000.md
  77c1c38e6705e421b8838bf19f938cef  gcc/config/rs6000/rs6000.opt
--- 5124,5130 ----
  5621b2aa0be1c71c3955c4e3bad6cf49  gcc/config/rs6000/rs6000-string.cc
  062e9e612338d86d0d47a3e1131384fa  gcc/config/rs6000/rs6000-tables.opt
  ce8de9a27f36b759a69194616c02eb38  gcc/config/rs6000/rs6000-tables.opt.urls
! d822a29ff1ceb988b9b2d78d265bd752  gcc/config/rs6000/rs6000.cc
  1d91827dae3ab7a332473805ac3cf40c  gcc/config/rs6000/rs6000.h
  ad1b62754d030b34f5ff67d2991b43b1  gcc/config/rs6000/rs6000.md
  77c1c38e6705e421b8838bf19f938cef  gcc/config/rs6000/rs6000.opt
*************** dfb9fde7c7559a50905b02c01b6d6ee8  gcc/co
*** 5237,5243 ****
  bc0fb519f0c53f7b5e44aadede6fbfad  gcc/config/s390/tpf.opt
  34c54b547202715f11db388829243402  gcc/config/s390/tpf.opt.urls
  d225211a59c66716b9cad3d9a2f13af4  gcc/config/s390/vecintrin.h
! 3ae77d7fd4bbc29f646a0c46184867c8  gcc/config/s390/vector.md
  8f88205b80cb5c8a16a0f55c1bbc53ab  gcc/config/s390/vx-builtins.md
  7813da5eac25ac16f589b0319ad43386  gcc/config/s390/x-native
  f9d87cd50e032287752597f9c084e3f5  gcc/config/sh/constraints.md
--- 5238,5244 ----
  bc0fb519f0c53f7b5e44aadede6fbfad  gcc/config/s390/tpf.opt
  34c54b547202715f11db388829243402  gcc/config/s390/tpf.opt.urls
  d225211a59c66716b9cad3d9a2f13af4  gcc/config/s390/vecintrin.h
! 8bb1bfb83bd810b3288df759a96e644e  gcc/config/s390/vector.md
  8f88205b80cb5c8a16a0f55c1bbc53ab  gcc/config/s390/vx-builtins.md
  7813da5eac25ac16f589b0319ad43386  gcc/config/s390/x-native
  f9d87cd50e032287752597f9c084e3f5  gcc/config/sh/constraints.md
*************** f3a2992c8e85b13e50b261e26924d83f  gcc/co
*** 5486,5494 ****
  87fc5c87547999f715031b4ff99fb67b  gcc/config/xtensa/xtensa-dynconfig.cc
  c7be35a23fd70ac184dd9072319304c7  gcc/config/xtensa/xtensa-opts.h
  e59f31891252abdd41eedc784b25ed6b  gcc/config/xtensa/xtensa-protos.h
! 504e81f5a1c3f60de998db24e2e6e748  gcc/config/xtensa/xtensa.cc
  5cb04061b3da377a69382a940d1039cf  gcc/config/xtensa/xtensa.h
! 6c41f581d014120fecf4738375010780  gcc/config/xtensa/xtensa.md
  f0452ea712955ce21c9c149136850780  gcc/config/xtensa/xtensa.opt
  db57d7603312357e8c0cfb21c32353d1  gcc/config/xtensa/xtensa.opt.urls
  5583738d9d6612bf0f58bc6646eb1048  gcc/configure
--- 5487,5495 ----
  87fc5c87547999f715031b4ff99fb67b  gcc/config/xtensa/xtensa-dynconfig.cc
  c7be35a23fd70ac184dd9072319304c7  gcc/config/xtensa/xtensa-opts.h
  e59f31891252abdd41eedc784b25ed6b  gcc/config/xtensa/xtensa-protos.h
! 2bd87eff96be222b9cf1c13670673a28  gcc/config/xtensa/xtensa.cc
  5cb04061b3da377a69382a940d1039cf  gcc/config/xtensa/xtensa.h
! 5528f4afb3487f17616b6d07632ea09c  gcc/config/xtensa/xtensa.md
  f0452ea712955ce21c9c149136850780  gcc/config/xtensa/xtensa.opt
  db57d7603312357e8c0cfb21c32353d1  gcc/config/xtensa/xtensa.opt.urls
  5583738d9d6612bf0f58bc6646eb1048  gcc/configure
*************** a9c3cddee4e237141062720b72fe38cd  gcc/co
*** 5502,5508 ****
  5d31df44fc0a5b17beb74ce0ff38e214  gcc/coroutine-passes.cc
  2a5216aefb9cdf4b270ef8e599cc794f  gcc/coverage.cc
  722fb5fda78e55c5af5da72cad78751f  gcc/coverage.h
! cfdacfd5d45b6c5704cd06d6cb26bdbc  gcc/cp/ChangeLog
  70c059f2b75a2fc1bb95a526b21b8cd7  gcc/cp/ChangeLog-1993
  7cbd106e10a0ba7c052bee3fe20671c2  gcc/cp/ChangeLog-1994
  3b1e3ed23ad4363f75e6fd2fbb583dee  gcc/cp/ChangeLog-1995
--- 5503,5509 ----
  5d31df44fc0a5b17beb74ce0ff38e214  gcc/coroutine-passes.cc
  2a5216aefb9cdf4b270ef8e599cc794f  gcc/coverage.cc
  722fb5fda78e55c5af5da72cad78751f  gcc/coverage.h
! 2e40d1d55297be0ee2f1f45e35acfdbc  gcc/cp/ChangeLog
  70c059f2b75a2fc1bb95a526b21b8cd7  gcc/cp/ChangeLog-1993
  7cbd106e10a0ba7c052bee3fe20671c2  gcc/cp/ChangeLog-1994
  3b1e3ed23ad4363f75e6fd2fbb583dee  gcc/cp/ChangeLog-1995
*************** fce8de27014c109814b3f69be6a5d4f6  gcc/cp
*** 5543,5579 ****
  68fc21d4889b1c70ccf89747b98b1fb4  gcc/cp/cfns.h
  167833da56621df8026f51eb243c344a  gcc/cp/class.cc
  ee3fb2cc9b9557d3895f527353160bd4  gcc/cp/config-lang.in
! f749639c06fb1a8e259bd762fd131b3f  gcc/cp/constexpr.cc
! d132f7f4c080ce3048977e23e33b9b1c  gcc/cp/constraint.cc
  613233facbf4b0f1cff770ed6c49c666  gcc/cp/contracts.cc
  1f1cd3a021a2cd25741e252145ee8282  gcc/cp/contracts.h
! 58646f4e7ea19fc13b47ff6825cca56b  gcc/cp/coroutines.cc
! 50f398cce18f76ec8d119ddd9d133f78  gcc/cp/coroutines.h
! 4733988bab1e3fb37a7a14f899f2946e  gcc/cp/cp-gimplify.cc
  3bf6da2fd9bef7475fae5ee6d9cdcf15  gcc/cp/cp-lang.cc
  0083c32822e7d365ab0074f1807e8679  gcc/cp/cp-name-hint.h
! a46a06074cd68181251e3541b4689021  gcc/cp/cp-objcp-common.cc
! 7475950f94ad8c7218f451feb5e71424  gcc/cp/cp-objcp-common.h
! 6a7554ee20d49ef2b66e0b7cc2a696a1  gcc/cp/cp-trait.def
  ce9f2ccac9e2657417018bc8f8064421  gcc/cp/cp-tree.def
! 44182fbb2fc0412c377220ce5e905f04  gcc/cp/cp-tree.h
  e5ccdda9d62d96ac397910d0fa391b0a  gcc/cp/cp-ubsan.cc
  64450079a2dd9e5a8767bb5e4bf3d904  gcc/cp/cvt.cc
  28a2733b7abed60b2b102105bb7cebaf  gcc/cp/cxx-pretty-print.cc
  955ecfa636599a39229757737e271819  gcc/cp/cxx-pretty-print.h
  c1cc5dac36866c611933c037cc1d6f2f  gcc/cp/cxxapi-data.csv
! cc9928575f28fafacef718c5c80775db  gcc/cp/decl.cc
  7f116fdc50b24dcb13cdcf096636aef9  gcc/cp/decl.h
! f4e44eb1343e0b1fd3cbf861ac00bf41  gcc/cp/decl2.cc
  691a10b3246d19925433648ba9a4ea9a  gcc/cp/dump.cc
! 95586d6bf5468a4e5a8bf3c487e638bb  gcc/cp/error.cc
  86f47b28d673601022d0205cdd718f9d  gcc/cp/except.cc
  f1581b369c1962c764264b1b2af61ca2  gcc/cp/expr.cc
  3b7c086cfb4ed89e6ae40a09ca796704  gcc/cp/friend.cc
  3d079dd21f8a1ab95fb2d1f96d799283  gcc/cp/g++spec.cc
  30b9ed40d39cf78b95792ef5dca2aebb  gcc/cp/gen-cxxapi-file.py
  bcd77de9155d0bae5293da112f650e43  gcc/cp/init.cc
! 3a284f46bfaeb6d4743e14f00c862b70  gcc/cp/lambda.cc
  ac5d78393361c1bcb930119a896a14ca  gcc/cp/lang-specs.h
  3f94e0ee121cb5771179a202f19104bb  gcc/cp/lex.cc
  aaf76a9b03fd0532d2904aef004fd66a  gcc/cp/logic.cc
--- 5544,5580 ----
  68fc21d4889b1c70ccf89747b98b1fb4  gcc/cp/cfns.h
  167833da56621df8026f51eb243c344a  gcc/cp/class.cc
  ee3fb2cc9b9557d3895f527353160bd4  gcc/cp/config-lang.in
! db3faf1c61ef28c310bb2a316fbe9219  gcc/cp/constexpr.cc
! 3974710745a4b09b4184ea22766bf2d3  gcc/cp/constraint.cc
  613233facbf4b0f1cff770ed6c49c666  gcc/cp/contracts.cc
  1f1cd3a021a2cd25741e252145ee8282  gcc/cp/contracts.h
! 02dd0b9bd700b429ad1101df3c9510b5  gcc/cp/coroutines.cc
! 6cab15e3da872b87bf31d0d8bc16ba37  gcc/cp/coroutines.h
! b27703312a47b05aa0b0b8a0f8ba978f  gcc/cp/cp-gimplify.cc
  3bf6da2fd9bef7475fae5ee6d9cdcf15  gcc/cp/cp-lang.cc
  0083c32822e7d365ab0074f1807e8679  gcc/cp/cp-name-hint.h
! 7e2d2d0cd98f02686590d57bb37c0de9  gcc/cp/cp-objcp-common.cc
! acb30767d403ad5a0d7ae97437159ebe  gcc/cp/cp-objcp-common.h
! 144049f5deb1aa6987eb55e86f53cb45  gcc/cp/cp-trait.def
  ce9f2ccac9e2657417018bc8f8064421  gcc/cp/cp-tree.def
! cd060d00e4514a202ae88bb64d10ff84  gcc/cp/cp-tree.h
  e5ccdda9d62d96ac397910d0fa391b0a  gcc/cp/cp-ubsan.cc
  64450079a2dd9e5a8767bb5e4bf3d904  gcc/cp/cvt.cc
  28a2733b7abed60b2b102105bb7cebaf  gcc/cp/cxx-pretty-print.cc
  955ecfa636599a39229757737e271819  gcc/cp/cxx-pretty-print.h
  c1cc5dac36866c611933c037cc1d6f2f  gcc/cp/cxxapi-data.csv
! f267a13ff333261477fb6444ea11a684  gcc/cp/decl.cc
  7f116fdc50b24dcb13cdcf096636aef9  gcc/cp/decl.h
! 0447c75d7c7755b292b5f718de8ebac9  gcc/cp/decl2.cc
  691a10b3246d19925433648ba9a4ea9a  gcc/cp/dump.cc
! 2ae069e2eecf08cde8e9a6eadce384e1  gcc/cp/error.cc
  86f47b28d673601022d0205cdd718f9d  gcc/cp/except.cc
  f1581b369c1962c764264b1b2af61ca2  gcc/cp/expr.cc
  3b7c086cfb4ed89e6ae40a09ca796704  gcc/cp/friend.cc
  3d079dd21f8a1ab95fb2d1f96d799283  gcc/cp/g++spec.cc
  30b9ed40d39cf78b95792ef5dca2aebb  gcc/cp/gen-cxxapi-file.py
  bcd77de9155d0bae5293da112f650e43  gcc/cp/init.cc
! b802e8f4d91963d26f15f2d39ed1f219  gcc/cp/lambda.cc
  ac5d78393361c1bcb930119a896a14ca  gcc/cp/lang-specs.h
  3f94e0ee121cb5771179a202f19104bb  gcc/cp/lex.cc
  aaf76a9b03fd0532d2904aef004fd66a  gcc/cp/logic.cc
*************** aaf76a9b03fd0532d2904aef004fd66a  gcc/cp
*** 5581,5604 ****
  936bd061907a7a899c3285cf17b17674  gcc/cp/mapper-client.cc
  6c77b1fab5f6d146677090285a202a50  gcc/cp/mapper-client.h
  44e22b51797f89c9da996523a6d97f1c  gcc/cp/mapper-resolver.cc
! ae7940cd68d15195e055dd97ffe3cce9  gcc/cp/method.cc
! 501b5c19afd7e8ed9e052d69d4b8305a  gcc/cp/module.cc
! 4b320facb74b0245d0f0959fe26e2e71  gcc/cp/name-lookup.cc
! 9644410086c3beb90033e77613e9d1a7  gcc/cp/name-lookup.h
  e7fe06956aada61bcaae5168ad47a9c1  gcc/cp/operators.def
  813c253a000ee20d8d6598f56edc400e  gcc/cp/optimize.cc
! 3ef702d4f34b8fcb5f764ceed2514988  gcc/cp/parser.cc
  e8a3a03873c6294ff25a783941b8d8af  gcc/cp/parser.h
! ae60ecc480641515e422efd4efc1a861  gcc/cp/pt.cc
  a121c0a45933b618832614be1fbfd5c7  gcc/cp/ptree.cc
  ee1ddf1e1b9554bb1a10109ce8c6dee5  gcc/cp/rtti.cc
  a4930c49ed8f9e6b019399bd1faf86d0  gcc/cp/search.cc
! 3096647760bea4d3ef9c62689af2fb16  gcc/cp/semantics.cc
  b58bf61fbfed45af179b7104e72a9486  gcc/cp/std-name-hint.gperf
  2425db76c32085977eff047c982cebab  gcc/cp/std-name-hint.h
  e3798db73e0b3e892e772acbe569a5b8  gcc/cp/tree.cc
  bb1304379ac1bf9a568942bc7e976e8a  gcc/cp/type-utils.h
! a317127b240ff859aac823ff16758d88  gcc/cp/typeck.cc
  1fea2b59dbf93b59626d7546b3c1f738  gcc/cp/typeck2.cc
  aa6906e22dc44502ca268580e5b8dfdd  gcc/cp/vtable-class-hierarchy.cc
  c74d2f6cc5dcb1bf1953c093eb903b37  gcc/cppbuiltin.cc
--- 5582,5605 ----
  936bd061907a7a899c3285cf17b17674  gcc/cp/mapper-client.cc
  6c77b1fab5f6d146677090285a202a50  gcc/cp/mapper-client.h
  44e22b51797f89c9da996523a6d97f1c  gcc/cp/mapper-resolver.cc
! 5e988f88b0605dbac3e8ac682e35a5c6  gcc/cp/method.cc
! 57fffba05a90806e35bd63a82fa88cd2  gcc/cp/module.cc
! 06f95ada11e42d69946cf7b65d247c53  gcc/cp/name-lookup.cc
! 333c7af87a267d21ca401c727390365b  gcc/cp/name-lookup.h
  e7fe06956aada61bcaae5168ad47a9c1  gcc/cp/operators.def
  813c253a000ee20d8d6598f56edc400e  gcc/cp/optimize.cc
! 4dcc5fb073081331b649ac3f5c5b32dd  gcc/cp/parser.cc
  e8a3a03873c6294ff25a783941b8d8af  gcc/cp/parser.h
! 6b51cbdc7e51971407e1854a8c4dd9f5  gcc/cp/pt.cc
  a121c0a45933b618832614be1fbfd5c7  gcc/cp/ptree.cc
  ee1ddf1e1b9554bb1a10109ce8c6dee5  gcc/cp/rtti.cc
  a4930c49ed8f9e6b019399bd1faf86d0  gcc/cp/search.cc
! 2b9aafc946a3c94b8ab88daf9cbb43d8  gcc/cp/semantics.cc
  b58bf61fbfed45af179b7104e72a9486  gcc/cp/std-name-hint.gperf
  2425db76c32085977eff047c982cebab  gcc/cp/std-name-hint.h
  e3798db73e0b3e892e772acbe569a5b8  gcc/cp/tree.cc
  bb1304379ac1bf9a568942bc7e976e8a  gcc/cp/type-utils.h
! 13852edb69d95f44d9d68f38091e7966  gcc/cp/typeck.cc
  1fea2b59dbf93b59626d7546b3c1f738  gcc/cp/typeck2.cc
  aa6906e22dc44502ca268580e5b8dfdd  gcc/cp/vtable-class-hierarchy.cc
  c74d2f6cc5dcb1bf1953c093eb903b37  gcc/cppbuiltin.cc
*************** e0a7cab8692eb3cbd4b00c4494e48d70  gcc/di
*** 5890,5897 ****
  b14c12c33aee36a4d29601627a1a67da  gcc/diagnostic-core.h
  be405b20597be971120eee5709db8c4a  gcc/diagnostic-diagram.h
  a24233a009f0c9d29e034e6ba63082de  gcc/diagnostic-event-id.h
! 20f3c8d8f271e0a1b76f95a0f35dd184  gcc/diagnostic-format-html.cc
! 6641ef1cb8f529ccd664b0be9825f5a0  gcc/diagnostic-format-html.h
  d306b1c2d243e470e6dace9e9b9feb76  gcc/diagnostic-format-json.cc
  61f95df5bdbef545f0ad3dd04e2d5ac3  gcc/diagnostic-format-sarif.cc
  1b19f73dad314e0e6051d3657540cf0c  gcc/diagnostic-format-sarif.h
--- 5891,5898 ----
  b14c12c33aee36a4d29601627a1a67da  gcc/diagnostic-core.h
  be405b20597be971120eee5709db8c4a  gcc/diagnostic-diagram.h
  a24233a009f0c9d29e034e6ba63082de  gcc/diagnostic-event-id.h
! a8fb5a03da341de5a40d769537fec27c  gcc/diagnostic-format-html.cc
! 9dd0efe581c7fbd4e35dc41591b0893f  gcc/diagnostic-format-html.h
  d306b1c2d243e470e6dace9e9b9feb76  gcc/diagnostic-format-json.cc
  61f95df5bdbef545f0ad3dd04e2d5ac3  gcc/diagnostic-format-sarif.cc
  1b19f73dad314e0e6051d3657540cf0c  gcc/diagnostic-format-sarif.h
*************** e472f6066cc64e9f1cee0136404f0751  gcc/di
*** 5905,5919 ****
  124a9446918f0c1e7a8586ac4aea6729  gcc/diagnostic-macro-unwinding.h
  065e0c81be159417eacd100742107ecc  gcc/diagnostic-metadata.h
  e32f47c03714e4be891aef1903c8a04f  gcc/diagnostic-output-file.h
! f2ff47d3ccd0c593ec36e3b0d7623c81  gcc/diagnostic-path.cc
  c8cf51c44328a35a27753d130a351bd5  gcc/diagnostic-path.h
! f076eff7f3e051217ab4840269c685f8  gcc/diagnostic-show-locus.cc
  81a24429bc8eb52cbe24d574c6ec7e53  gcc/diagnostic-spec.cc
  375a39d1eff397ae7fcdce6e05c76d50  gcc/diagnostic-spec.h
  dabd477d68c54372f8519e7c917d4a11  gcc/diagnostic-url.h
! 63780c4dae685b261355641df247f399  gcc/diagnostic.cc
  03b04b0fb78353ca76570e5ef92cf756  gcc/diagnostic.def
! 133cbf0d28595e70f7bb74f62e112850  gcc/diagnostic.h
  bec68218d528467fd119bf2cd02bc358  gcc/digraph.cc
  18e73120a6e21ceac1adce40777000cf  gcc/digraph.h
  bb82bca6383082ead28f6f21f0a6223f  gcc/doc/analyzer.texi
--- 5906,5921 ----
  124a9446918f0c1e7a8586ac4aea6729  gcc/diagnostic-macro-unwinding.h
  065e0c81be159417eacd100742107ecc  gcc/diagnostic-metadata.h
  e32f47c03714e4be891aef1903c8a04f  gcc/diagnostic-output-file.h
! 9091b416f97aec3d64d98ec2fa0d1cbf  gcc/diagnostic-path-output.cc
! 312dae6bb0d15d051e44b2f61ac34fe1  gcc/diagnostic-path.cc
  c8cf51c44328a35a27753d130a351bd5  gcc/diagnostic-path.h
! b5c205f61575ea34203b1b3c8ff2bc26  gcc/diagnostic-show-locus.cc
  81a24429bc8eb52cbe24d574c6ec7e53  gcc/diagnostic-spec.cc
  375a39d1eff397ae7fcdce6e05c76d50  gcc/diagnostic-spec.h
  dabd477d68c54372f8519e7c917d4a11  gcc/diagnostic-url.h
! 0ccc10923de273560789625083e33b20  gcc/diagnostic.cc
  03b04b0fb78353ca76570e5ef92cf756  gcc/diagnostic.def
! 1d51aeacb86eb0d9f17d56d33fbc71fe  gcc/diagnostic.h
  bec68218d528467fd119bf2cd02bc358  gcc/digraph.cc
  18e73120a6e21ceac1adce40777000cf  gcc/digraph.h
  bb82bca6383082ead28f6f21f0a6223f  gcc/doc/analyzer.texi
*************** acdfc663791e4321372e79932070d05d  gcc/do
*** 5932,5938 ****
  81ae745aed5479afae430c578fa29055  gcc/doc/cppinternals.texi
  1a2d44757bb0f40b09493ac3863eba93  gcc/doc/cppopts.texi
  14b0532614eb25d7d84e7efd6664ecf3  gcc/doc/cppwarnopts.texi
! d13487362dc5f7115bb485c5cfe6f268  gcc/doc/extend.texi
  ddcdbcb699f5252a1c1219d92d87ed8b  gcc/doc/fragments.texi
  cd346f0c279f68138ef08c7addc796de  gcc/doc/frontends.texi
  a28615d9873d98f0d5f4ef8dd3e4c39d  gcc/doc/gcc.texi
--- 5934,5940 ----
  81ae745aed5479afae430c578fa29055  gcc/doc/cppinternals.texi
  1a2d44757bb0f40b09493ac3863eba93  gcc/doc/cppopts.texi
  14b0532614eb25d7d84e7efd6664ecf3  gcc/doc/cppwarnopts.texi
! 6da254e3af174f284fbb00d764e4d1ac  gcc/doc/extend.texi
  ddcdbcb699f5252a1c1219d92d87ed8b  gcc/doc/fragments.texi
  cd346f0c279f68138ef08c7addc796de  gcc/doc/frontends.texi
  a28615d9873d98f0d5f4ef8dd3e4c39d  gcc/doc/gcc.texi
*************** a28615d9873d98f0d5f4ef8dd3e4c39d  gcc/do
*** 5942,5948 ****
  6662694db9603d95a8c280ab3b6479ea  gcc/doc/gcov.texi
  cc49c44389e2d6e1bc60b761b5602112  gcc/doc/generic.texi
  6dd13335166acce8e899b838ecbd04bd  gcc/doc/gimple.texi
! d86921b1235f4213b89ef1d12d25a41a  gcc/doc/gm2.texi
  dc4ccd9843d88bc01c909438dabfd6ab  gcc/doc/gnu.texi
  e146722b4ab52551483390772327c93f  gcc/doc/gty.texi
  27e2895f33fff82c6e13b5b9e7b8df6b  gcc/doc/headerdirs.texi
--- 5944,5950 ----
  6662694db9603d95a8c280ab3b6479ea  gcc/doc/gcov.texi
  cc49c44389e2d6e1bc60b761b5602112  gcc/doc/generic.texi
  6dd13335166acce8e899b838ecbd04bd  gcc/doc/gimple.texi
! 9da760d0d109c3f78940f84365883d94  gcc/doc/gm2.texi
  dc4ccd9843d88bc01c909438dabfd6ab  gcc/doc/gnu.texi
  e146722b4ab52551483390772327c93f  gcc/doc/gty.texi
  27e2895f33fff82c6e13b5b9e7b8df6b  gcc/doc/headerdirs.texi
*************** ee4c7654f733cefcb73d4fd24f3e1b82  gcc/do
*** 5956,5962 ****
  e9b8122841fbfbbc30fee8ed6613c399  gcc/doc/include/texinfo.tex
  24cd0b31d695b3e960483721e348224d  gcc/doc/install.texi
  0f98706361e63fac2c35c2c4491eaac4  gcc/doc/install.texi2html
! 119a376efb9ae39379c82993e331310f  gcc/doc/invoke.texi
  47f1f55b3595acf670eb6193a0cbd933  gcc/doc/languages.texi
  5200cc28a2ab912efe66f0944995c45b  gcc/doc/libgcc.texi
  ef4f00c423089323edef1d3cff31a4a2  gcc/doc/libgdiagnostics/Makefile
--- 5958,5964 ----
  e9b8122841fbfbbc30fee8ed6613c399  gcc/doc/include/texinfo.tex
  24cd0b31d695b3e960483721e348224d  gcc/doc/install.texi
  0f98706361e63fac2c35c2c4491eaac4  gcc/doc/install.texi2html
! 2e083d680c56da042c23f14d39f97107  gcc/doc/invoke.texi
  47f1f55b3595acf670eb6193a0cbd933  gcc/doc/languages.texi
  5200cc28a2ab912efe66f0944995c45b  gcc/doc/libgcc.texi
  ef4f00c423089323edef1d3cff31a4a2  gcc/doc/libgdiagnostics/Makefile
*************** c9c36fbefa306c5ed545b38beb9d0a47  gcc/do
*** 5999,6013 ****
  2cd0efa7c8a7f870d4a0c0b2eed69798  gcc/doc/plugins.texi
  0603ab3940871fa2a55ddbd7c2719eb7  gcc/doc/poly-int.texi
  ee33d902cd60afae792843ff15ad6706  gcc/doc/portability.texi
! dddeee21c6a9b60cd853f27a5db81c4f  gcc/doc/riscv-ext.texi
  8489e4a02a5daa1d1ae726383b330653  gcc/doc/rtl.texi
  bd20fd07c5ee8f444bf1d3f5e64e066a  gcc/doc/service.texi
! 9aa36a97519b5c95abd0b5ab2af189ce  gcc/doc/sourcebuild.texi
! 14e3ed780980c4fff09173b869e850ed  gcc/doc/standards.texi
  fd3bf27e33907464460ab9208cdd2240  gcc/doc/tm.texi
  06d0869eb2bec892f989f31bcd7da233  gcc/doc/tm.texi.in
  c4168f9f01adf4dd8adc647c04107142  gcc/doc/tree-ssa.texi
! ae9630d440297a3022b231623c8406fc  gcc/doc/trouble.texi
  b94b7a4d6266f1e322684f068256dad9  gcc/doc/ux.texi
  a1be2415e4997dcc307935ed9a162b33  gcc/dojump.cc
  b0e42f8859b351c85a95aef45fde4bb0  gcc/dojump.h
--- 6001,6015 ----
  2cd0efa7c8a7f870d4a0c0b2eed69798  gcc/doc/plugins.texi
  0603ab3940871fa2a55ddbd7c2719eb7  gcc/doc/poly-int.texi
  ee33d902cd60afae792843ff15ad6706  gcc/doc/portability.texi
! 40dea4ec08aa318af2f8078a5d4f4691  gcc/doc/riscv-ext.texi
  8489e4a02a5daa1d1ae726383b330653  gcc/doc/rtl.texi
  bd20fd07c5ee8f444bf1d3f5e64e066a  gcc/doc/service.texi
! 1f35857360e800dead75de6b8f9feb8c  gcc/doc/sourcebuild.texi
! 7528f7e1e2755463754d0e45df406de2  gcc/doc/standards.texi
  fd3bf27e33907464460ab9208cdd2240  gcc/doc/tm.texi
  06d0869eb2bec892f989f31bcd7da233  gcc/doc/tm.texi.in
  c4168f9f01adf4dd8adc647c04107142  gcc/doc/tree-ssa.texi
! 5f62752970e47d350c8cbce47123d1cf  gcc/doc/trouble.texi
  b94b7a4d6266f1e322684f068256dad9  gcc/doc/ux.texi
  a1be2415e4997dcc307935ed9a162b33  gcc/dojump.cc
  b0e42f8859b351c85a95aef45fde4bb0  gcc/dojump.h
*************** e7580325e4512cd9f5c2d665b528fa8f  gcc/fi
*** 6063,6072 ****
  e8c5838138a5e07e5716964a8284e9a1  gcc/flags.h
  a798cdca802a57ffa3473ab610b37c86  gcc/fold-const-call.cc
  182559f127e8416b9e9abcffb267d5fc  gcc/fold-const-call.h
! 231ca43a15347c4b57b64ed5be4a7c8e  gcc/fold-const.cc
  f23dec03425a07611492fa2c061cd7d2  gcc/fold-const.h
  cd4e6baf5d162fbd41160606055f8297  gcc/fold-mem-offsets.cc
! 590cac4bee8bdf9b5a0e49ad8b4351c5  gcc/fortran/ChangeLog
  083c53fadafdcf3be46713838a51e36c  gcc/fortran/ChangeLog-2002
  2a4ca18d211fb2603139354fd16398ed  gcc/fortran/ChangeLog-2003
  e7462609ebd0dd7c874e0fc00e2833aa  gcc/fortran/ChangeLog-2004
--- 6065,6074 ----
  e8c5838138a5e07e5716964a8284e9a1  gcc/flags.h
  a798cdca802a57ffa3473ab610b37c86  gcc/fold-const-call.cc
  182559f127e8416b9e9abcffb267d5fc  gcc/fold-const-call.h
! 62673b998414c05d123a9e3cc51be1d9  gcc/fold-const.cc
  f23dec03425a07611492fa2c061cd7d2  gcc/fold-const.h
  cd4e6baf5d162fbd41160606055f8297  gcc/fold-mem-offsets.cc
! 5ae1e2a5050f5658095de058d9236982  gcc/fortran/ChangeLog
  083c53fadafdcf3be46713838a51e36c  gcc/fortran/ChangeLog-2002
  2a4ca18d211fb2603139354fd16398ed  gcc/fortran/ChangeLog-2003
  e7462609ebd0dd7c874e0fc00e2833aa  gcc/fortran/ChangeLog-2004
*************** db21881c77a22fd3dbfe253c364af5ee  gcc/fo
*** 6096,6102 ****
  6b01ec523f3bee8e2469370d106896e3  gcc/fortran/arith.h
  1f47886d616538f880e240f661990624  gcc/fortran/array.cc
  59221f5e105887dce9d0c1b7694aa86f  gcc/fortran/bbt.cc
! e62c0dddc621d789069283909758290a  gcc/fortran/check.cc
  ec152c8d16c33705590d8b2ddbcad0b7  gcc/fortran/class.cc
  60b1462a2f8d5fc08582de65eb85c8da  gcc/fortran/coarray.cc
  6047324cb87b56ae23d2293c5ef13ddb  gcc/fortran/config-lang.in
--- 6098,6104 ----
  6b01ec523f3bee8e2469370d106896e3  gcc/fortran/arith.h
  1f47886d616538f880e240f661990624  gcc/fortran/array.cc
  59221f5e105887dce9d0c1b7694aa86f  gcc/fortran/bbt.cc
! 1462def6554f5d5387d0168e32b6b9b6  gcc/fortran/check.cc
  ec152c8d16c33705590d8b2ddbcad0b7  gcc/fortran/class.cc
  60b1462a2f8d5fc08582de65eb85c8da  gcc/fortran/coarray.cc
  6047324cb87b56ae23d2293c5ef13ddb  gcc/fortran/config-lang.in
*************** d85e2f2fc3ee4721563bd47719063fb6  gcc/fo
*** 6111,6133 ****
  c33e2c4c7527bec8a125dd093dc59f2a  gcc/fortran/dependency.cc
  70111b1c7592e650c281b513c3cf2f47  gcc/fortran/dependency.h
  b6cce6988f87edda182aec1b6c3cd291  gcc/fortran/dump-parse-tree.cc
! 860343539ea7488e7bb44b94ea2b0f77  gcc/fortran/error.cc
! 70011758e3ef07529a2602cae826d6be  gcc/fortran/expr.cc
  88fde92a0336c0454c5baa0f3c24888a  gcc/fortran/f95-lang.cc
  e188a9b3cb73106cab46a15d36a12b66  gcc/fortran/frontend-passes.cc
  a39f360f255f1ef6dfd91ccefef63e05  gcc/fortran/gfc-diagnostic.def
  bd08c55098f00394b9922e6163c27b92  gcc/fortran/gfc-internals.texi
! 257d005ac9f4aaa1bdbef32fa2ebf950  gcc/fortran/gfortran.h
  d29bb6813221f46b4cde9df77292c412  gcc/fortran/gfortran.texi
  af66ab40a5434219772b76ad10035e45  gcc/fortran/gfortranspec.cc
! 5b932ef150fbb2f40ad9da6a623f8cfe  gcc/fortran/interface.cc
! bfd85e26b6baa268be01f175a7ffb800  gcc/fortran/intrinsic.cc
! 70dd32ae163321b5491726a011e7b091  gcc/fortran/intrinsic.h
  9d797fdefac716538b6bc5b3fe81dfa1  gcc/fortran/intrinsic.texi
  4a7f5923c18268b245556ded8e9ba554  gcc/fortran/invoke.texi
! a6ef46c79cebcc9bf1786f457fc01c4e  gcc/fortran/io.cc
  d2a28ef98f6f78d1608fb52204e013a5  gcc/fortran/ioparm.def
! e1af2a4e4b63d9970c78a257f54cd3b2  gcc/fortran/iresolve.cc
  40087b4e405f3e0f17ebd4f0e9b63f48  gcc/fortran/iso-c-binding.def
  085e3672e4679e2b51b9f144b552caed  gcc/fortran/iso-fortran-env.def
  5c4523263ea0f1cd46baacba848e1fd5  gcc/fortran/lang-specs.h
--- 6113,6135 ----
  c33e2c4c7527bec8a125dd093dc59f2a  gcc/fortran/dependency.cc
  70111b1c7592e650c281b513c3cf2f47  gcc/fortran/dependency.h
  b6cce6988f87edda182aec1b6c3cd291  gcc/fortran/dump-parse-tree.cc
! c7e7056eadbc33e368018f5bd15ae27e  gcc/fortran/error.cc
! db184b6596cd9f39834087b0dc7d0ed8  gcc/fortran/expr.cc
  88fde92a0336c0454c5baa0f3c24888a  gcc/fortran/f95-lang.cc
  e188a9b3cb73106cab46a15d36a12b66  gcc/fortran/frontend-passes.cc
  a39f360f255f1ef6dfd91ccefef63e05  gcc/fortran/gfc-diagnostic.def
  bd08c55098f00394b9922e6163c27b92  gcc/fortran/gfc-internals.texi
! 1444006812909ce97b06c4dcb555bbe3  gcc/fortran/gfortran.h
  d29bb6813221f46b4cde9df77292c412  gcc/fortran/gfortran.texi
  af66ab40a5434219772b76ad10035e45  gcc/fortran/gfortranspec.cc
! aea31b73f1b7395d6302c57cbbf4bacf  gcc/fortran/interface.cc
! 18ca0ff7b9d543b25078031bfadf0d2f  gcc/fortran/intrinsic.cc
! 751fb9c42a3297fe53e0e7de9564bb27  gcc/fortran/intrinsic.h
  9d797fdefac716538b6bc5b3fe81dfa1  gcc/fortran/intrinsic.texi
  4a7f5923c18268b245556ded8e9ba554  gcc/fortran/invoke.texi
! 40352b9b20b1301c44326264b3f12cd1  gcc/fortran/io.cc
  d2a28ef98f6f78d1608fb52204e013a5  gcc/fortran/ioparm.def
! e0ae917f78fe49a1e67153dca52a68b2  gcc/fortran/iresolve.cc
  40087b4e405f3e0f17ebd4f0e9b63f48  gcc/fortran/iso-c-binding.def
  085e3672e4679e2b51b9f144b552caed  gcc/fortran/iso-fortran-env.def
  5c4523263ea0f1cd46baacba848e1fd5  gcc/fortran/lang-specs.h
*************** e1af2a4e4b63d9970c78a257f54cd3b2  gcc/fo
*** 6137,6154 ****
  7c68f69965e5bb49d258d83ab6cb2fdd  gcc/fortran/match.cc
  047778859aa899389e3b7e65c1439faa  gcc/fortran/match.h
  8181d5e935b96288d9a51fb8138faefb  gcc/fortran/matchexp.cc
! 297213add624aabc75e1e83d2e504eef  gcc/fortran/mathbuiltins.def
! 70230d28b44bb64fc1df9ae9f4c3282c  gcc/fortran/misc.cc
  3b3c13f513e2236a6456d1d3b112404c  gcc/fortran/module.cc
  50632a137a18f04dcc1b089dbb5f27e3  gcc/fortran/openmp.cc
  8376eba2060129f13c5146a7773b2af7  gcc/fortran/options.cc
! 481905febb41a25db05b80d06034bc70  gcc/fortran/parse.cc
  c1b40e866a8bbe611aa65278fe2508d3  gcc/fortran/parse.h
! 1cf1562d97db565ece685237001c2e59  gcc/fortran/primary.cc
  062a6b3178d3ac0121e8d26b61d58185  gcc/fortran/resolve.cc
  8dc2391850ee95634781b6e296a096f6  gcc/fortran/scanner.cc
  3c39e0eef946c7f557ac375f23b9f3db  gcc/fortran/scanner.h
! 38e5c1a2f4745b159c28560743e51f55  gcc/fortran/simplify.cc
  3255bc920c3609e58d8a01f6464313e8  gcc/fortran/st.cc
  7fc6fb7f159830fc0d98a9cd72e5cdf9  gcc/fortran/symbol.cc
  c9238712914e77b971fde08221a31bf7  gcc/fortran/target-memory.cc
--- 6139,6156 ----
  7c68f69965e5bb49d258d83ab6cb2fdd  gcc/fortran/match.cc
  047778859aa899389e3b7e65c1439faa  gcc/fortran/match.h
  8181d5e935b96288d9a51fb8138faefb  gcc/fortran/matchexp.cc
! 763c37f838e32f5ed8ad600157a0d951  gcc/fortran/mathbuiltins.def
! 998aff51cf65acc4d9efe5abebaaaff6  gcc/fortran/misc.cc
  3b3c13f513e2236a6456d1d3b112404c  gcc/fortran/module.cc
  50632a137a18f04dcc1b089dbb5f27e3  gcc/fortran/openmp.cc
  8376eba2060129f13c5146a7773b2af7  gcc/fortran/options.cc
! 4dc9068325ab8f3c2ac3f22ee80283da  gcc/fortran/parse.cc
  c1b40e866a8bbe611aa65278fe2508d3  gcc/fortran/parse.h
! 8282ea5f4e00d5c64da552ea2f31dcc6  gcc/fortran/primary.cc
  062a6b3178d3ac0121e8d26b61d58185  gcc/fortran/resolve.cc
  8dc2391850ee95634781b6e296a096f6  gcc/fortran/scanner.cc
  3c39e0eef946c7f557ac375f23b9f3db  gcc/fortran/scanner.h
! d78cc6d6b48b8228757fb8b674f6ad9b  gcc/fortran/simplify.cc
  3255bc920c3609e58d8a01f6464313e8  gcc/fortran/st.cc
  7fc6fb7f159830fc0d98a9cd72e5cdf9  gcc/fortran/symbol.cc
  c9238712914e77b971fde08221a31bf7  gcc/fortran/target-memory.cc
*************** f574663ce227d0be2e77015c008d708b  gcc/fp
*** 6176,6182 ****
  12d3c07e3c878f7237f904820da28c93  gcc/function-abi.h
  6e9698e4411a03357b6e2b60bc91c827  gcc/function-tests.cc
  389fbe3fbd033ac11caeb4c52d344a91  gcc/function.cc
! f177e1c4e707bec79d4d662838428852  gcc/function.h
  3c08c56c1de3b165b954ab5c185284c5  gcc/fwprop.cc
  261433f3124bfa2a1421c42d657e0560  gcc/gcc-ar.cc
  97d2a41e7dd932e9ed72779b8745c81b  gcc/gcc-attribute-urlifier.cc
--- 6178,6184 ----
  12d3c07e3c878f7237f904820da28c93  gcc/function-abi.h
  6e9698e4411a03357b6e2b60bc91c827  gcc/function-tests.cc
  389fbe3fbd033ac11caeb4c52d344a91  gcc/function.cc
! da5d04420f440a4a085dc91d92c6bfbb  gcc/function.h
  3c08c56c1de3b165b954ab5c185284c5  gcc/fwprop.cc
  261433f3124bfa2a1421c42d657e0560  gcc/gcc-ar.cc
  97d2a41e7dd932e9ed72779b8745c81b  gcc/gcc-attribute-urlifier.cc
*************** d34323b4d6fe1da82a9a4c157463d875  gcc/gc
*** 6188,6194 ****
  74b8852724cd126309c2e814288bcaa4  gcc/gcc-urlifier.cc
  3ba51d67080efcd8791ea2eaf4103d72  gcc/gcc-urlifier.def
  7e2f3c81fe7c2381b433886ab2914fa7  gcc/gcc-urlifier.h
! 7ca1dc6e8d0934977e6df717c0fbe13c  gcc/gcc.cc
  265ae8f124014a92ca7dee798d9c2b46  gcc/gcc.h
  d66e80f2ea9c1b6754479c999040b857  gcc/gcov-counter.def
  c4e07547b91be991d1bed6c22015cec2  gcc/gcov-dump.cc
--- 6190,6196 ----
  74b8852724cd126309c2e814288bcaa4  gcc/gcc-urlifier.cc
  3ba51d67080efcd8791ea2eaf4103d72  gcc/gcc-urlifier.def
  7e2f3c81fe7c2381b433886ab2914fa7  gcc/gcc-urlifier.h
! db65d533f5b7156e8621f8ee7cfb6de9  gcc/gcc.cc
  265ae8f124014a92ca7dee798d9c2b46  gcc/gcc.h
  d66e80f2ea9c1b6754479c999040b857  gcc/gcov-counter.def
  c4e07547b91be991d1bed6c22015cec2  gcc/gcov-dump.cc
*************** d285de23bd302c6655bc95327336a8ec  gcc/ge
*** 6245,6251 ****
  c0aa0732013643fc9d7c8fc68bb85d6d  gcc/ggc-common.cc
  56234852a29fc6118c202cd256865b62  gcc/ggc-internal.h
  474e70e7a6dcba6240b3fe2511616cfa  gcc/ggc-none.cc
! 3f22c502e69545befd1d9a68f03adb4f  gcc/ggc-page.cc
  f6879ae08660f73788b6b784022ca89a  gcc/ggc-tests.cc
  2a2d277a27eda24ce951c4e0b47b5201  gcc/ggc.h
  fc01aba2ef6a14714b1f93c8cf4194e4  gcc/gimple-array-bounds.cc
--- 6247,6253 ----
  c0aa0732013643fc9d7c8fc68bb85d6d  gcc/ggc-common.cc
  56234852a29fc6118c202cd256865b62  gcc/ggc-internal.h
  474e70e7a6dcba6240b3fe2511616cfa  gcc/ggc-none.cc
! ec69854c50639d623fcfeccac45d7a05  gcc/ggc-page.cc
  f6879ae08660f73788b6b784022ca89a  gcc/ggc-tests.cc
  2a2d277a27eda24ce951c4e0b47b5201  gcc/ggc.h
  fc01aba2ef6a14714b1f93c8cf4194e4  gcc/gimple-array-bounds.cc
*************** da09d1e31d3994eb3d6958074d7b7ce5  gcc/gi
*** 6257,6264 ****
  7b4f02095ce9b7a43bee8570917b9dc7  gcc/gimple-expr.h
  6d8705e22a261973531ad62cf6514ed9  gcc/gimple-fold.cc
  563448545720cf30f89d6c372ef0033b  gcc/gimple-fold.h
! 98652c967ce7f8dda9a1c398caa0996a  gcc/gimple-harden-conditionals.cc
! 34959112cc04df5744be2b160e2f9d80  gcc/gimple-harden-control-flow.cc
  46c40ebab120d543476a2e46ac063bba  gcc/gimple-if-to-switch.cc
  c8b58b1fdd336324d189a3904520ad48  gcc/gimple-isel.cc
  319a859d4c4eb6948afa93d70a5c97ec  gcc/gimple-iterator.cc
--- 6259,6266 ----
  7b4f02095ce9b7a43bee8570917b9dc7  gcc/gimple-expr.h
  6d8705e22a261973531ad62cf6514ed9  gcc/gimple-fold.cc
  563448545720cf30f89d6c372ef0033b  gcc/gimple-fold.h
! 43ad47e8cd99d438040cf6937a3cbe5e  gcc/gimple-harden-conditionals.cc
! 78586a1c0ce6834da91809b77f98c6d7  gcc/gimple-harden-control-flow.cc
  46c40ebab120d543476a2e46ac063bba  gcc/gimple-if-to-switch.cc
  c8b58b1fdd336324d189a3904520ad48  gcc/gimple-isel.cc
  319a859d4c4eb6948afa93d70a5c97ec  gcc/gimple-iterator.cc
*************** a4e263e8871b92796b1fb32a725e3eaa  gcc/gi
*** 6303,6309 ****
  0a74fcfb6f542e62384811b3713681ce  gcc/gimple-ssa-backprop.cc
  3cfaaa2decd6de2542a919cfb8bdb93d  gcc/gimple-ssa-isolate-paths.cc
  b417ca4d3d865879d0e642790dafa8cf  gcc/gimple-ssa-nonnull-compare.cc
! 93101472142eb5910d34b5c961eee66b  gcc/gimple-ssa-sccopy.cc
  b551cb1f1566bf3aa2bca3816f2b1c98  gcc/gimple-ssa-split-paths.cc
  c7ec9ee38b6e99c1260bd3e794ead05f  gcc/gimple-ssa-sprintf.cc
  827b9a16d251acce8466dcb4fc8420da  gcc/gimple-ssa-store-merging.cc
--- 6305,6311 ----
  0a74fcfb6f542e62384811b3713681ce  gcc/gimple-ssa-backprop.cc
  3cfaaa2decd6de2542a919cfb8bdb93d  gcc/gimple-ssa-isolate-paths.cc
  b417ca4d3d865879d0e642790dafa8cf  gcc/gimple-ssa-nonnull-compare.cc
! 6ea5745e8124ad0db5a9165a20abac7c  gcc/gimple-ssa-sccopy.cc
  b551cb1f1566bf3aa2bca3816f2b1c98  gcc/gimple-ssa-split-paths.cc
  c7ec9ee38b6e99c1260bd3e794ead05f  gcc/gimple-ssa-sprintf.cc
  827b9a16d251acce8466dcb4fc8420da  gcc/gimple-ssa-store-merging.cc
*************** fc5706ae421aa8f2f9bba7fe2c637237  gcc/gi
*** 6325,6331 ****
  386cda8e463d97e1cd38f923b48af906  gcc/gimple.h
  140b5c45a362b9c0c981b683560d4ef8  gcc/gimplify-me.cc
  84814cb09300f3db388dd0d22133ccb4  gcc/gimplify-me.h
! 8c53ac4f655bf4ed40f3c2f5775f0ba6  gcc/gimplify.cc
  06f2b5470f6bc6f77e9b7966e34e5785  gcc/gimplify.h
  7df17d7c2bcdff0a474d633a02195544  gcc/ginclude/float.h
  d22f0a286107015428c4b28c0d17abda  gcc/ginclude/iso646.h
--- 6327,6333 ----
  386cda8e463d97e1cd38f923b48af906  gcc/gimple.h
  140b5c45a362b9c0c981b683560d4ef8  gcc/gimplify-me.cc
  84814cb09300f3db388dd0d22133ccb4  gcc/gimplify-me.h
! f0a53386866ab2a3ee350d3ed98f8271  gcc/gimplify.cc
  06f2b5470f6bc6f77e9b7966e34e5785  gcc/gimplify.h
  7df17d7c2bcdff0a474d633a02195544  gcc/ginclude/float.h
  d22f0a286107015428c4b28c0d17abda  gcc/ginclude/iso646.h
*************** dbde1f58891027c57962904adf116dea  gcc/gi
*** 6334,6339 ****
--- 6336,6342 ----
  4173972473fe10d5f36d5db6d53656ad  gcc/ginclude/stdatomic.h
  e0c5e6c23e0041bf162651752dfb4a78  gcc/ginclude/stdbool.h
  f56f438b8e888ab0575dc11b4c8a409e  gcc/ginclude/stdckdint.h
+ 836cb0e54639f2464873a188d1f52b3f  gcc/ginclude/stdcountof.h
  981a3e9b8b3bb56efa96e85345adcfc2  gcc/ginclude/stddef.h
  034d0dcdfe0322d31ea3a49ff558e5b7  gcc/ginclude/stdfix.h
  6717e34f2a0d0ed6b166bb83dcec0b84  gcc/ginclude/stdint-gcc.h
*************** eec072fb4c8277a3634cf4cdc0846598  gcc/in
*** 6465,6471 ****
  bcb802c64e78f80e8e46c799c7e449ad  gcc/intl.cc
  deb111e00b2b07aa631595045bce5003  gcc/intl.h
  47a65e558aff89879902e88b055c7b12  gcc/ipa-comdats.cc
! 698e3e9010521e8f3924bff81b6d6cd7  gcc/ipa-cp.cc
  b65413c6163d502dbe95a08ac40cb575  gcc/ipa-cp.h
  4b65c0ccf8c98e3a0e1526acb4ebd3a4  gcc/ipa-devirt.cc
  2956ae29acd688fd2229744edabdc027  gcc/ipa-fnsummary.cc
--- 6468,6474 ----
  bcb802c64e78f80e8e46c799c7e449ad  gcc/intl.cc
  deb111e00b2b07aa631595045bce5003  gcc/intl.h
  47a65e558aff89879902e88b055c7b12  gcc/ipa-comdats.cc
! c525294d84f849571e9e7e936d6b8e4d  gcc/ipa-cp.cc
  b65413c6163d502dbe95a08ac40cb575  gcc/ipa-cp.h
  4b65c0ccf8c98e3a0e1526acb4ebd3a4  gcc/ipa-devirt.cc
  2956ae29acd688fd2229744edabdc027  gcc/ipa-fnsummary.cc
*************** d33136e7edecd120aa035f0e1ad240b0  gcc/ip
*** 6491,6506 ****
  83c011375208cf1307980bcb1b18b67a  gcc/ipa-predicate.cc
  3290558dca39b32c0ca581e6c3427551  gcc/ipa-predicate.h
  efab6d5ed309040ea34311e2e35802fe  gcc/ipa-profile.cc
! 503dfb9e665e2a4311f44e83c522b044  gcc/ipa-prop.cc
  769c7da3be6c74b69be2f9572626e59f  gcc/ipa-prop.h
  1ab3b52af464e998b39403664a5ee0c4  gcc/ipa-pure-const.cc
  ce0496bede6d40e2fcfbc8277856fc23  gcc/ipa-ref.cc
  ee6c4ff9a86c5d0a68fa41c8da2b5c6f  gcc/ipa-ref.h
  0562ce724bce5cf2fea47f2f0c2e0007  gcc/ipa-reference.cc
  d4930f12a999a28238b013539b631f2f  gcc/ipa-reference.h
! db3094a0c46c1db21262added5d20318  gcc/ipa-split.cc
! 259429efa536a126922a043252fe06dd  gcc/ipa-sra.cc
! 59810ca6d9f512fe2332a63f844610db  gcc/ipa-strub.cc
  7441ae66ef417a1eed323b8c98c8e589  gcc/ipa-strub.h
  15fb2e7205c9068dc163478055d814aa  gcc/ipa-utils.cc
  3123c1da10da09196605cf2b230afdcd  gcc/ipa-utils.h
--- 6494,6509 ----
  83c011375208cf1307980bcb1b18b67a  gcc/ipa-predicate.cc
  3290558dca39b32c0ca581e6c3427551  gcc/ipa-predicate.h
  efab6d5ed309040ea34311e2e35802fe  gcc/ipa-profile.cc
! be8b91a88b033749209c11844ab4ebd7  gcc/ipa-prop.cc
  769c7da3be6c74b69be2f9572626e59f  gcc/ipa-prop.h
  1ab3b52af464e998b39403664a5ee0c4  gcc/ipa-pure-const.cc
  ce0496bede6d40e2fcfbc8277856fc23  gcc/ipa-ref.cc
  ee6c4ff9a86c5d0a68fa41c8da2b5c6f  gcc/ipa-ref.h
  0562ce724bce5cf2fea47f2f0c2e0007  gcc/ipa-reference.cc
  d4930f12a999a28238b013539b631f2f  gcc/ipa-reference.h
! 6a30eb3fed6340a45b517d7507d8f96a  gcc/ipa-split.cc
! 128fc9f66e07a64e6ebecfe0e1f78765  gcc/ipa-sra.cc
! acc1e51dba066adf0e91320e5f538606  gcc/ipa-strub.cc
  7441ae66ef417a1eed323b8c98c8e589  gcc/ipa-strub.h
  15fb2e7205c9068dc163478055d814aa  gcc/ipa-utils.cc
  3123c1da10da09196605cf2b230afdcd  gcc/ipa-utils.h
*************** aa4d0dc684f454901e907706abe9140d  gcc/js
*** 6610,6618 ****
  050f3124bc0b966ee56bf6aef5ba85b4  gcc/json.cc
  d4441c216144e8178e5c35e33874f04b  gcc/json.h
  47f18749c5685cd9ae918c4288aa5bf4  gcc/jump.cc
! 83a72f3e6c50fc5ea098d18cc8c61886  gcc/langhooks-def.h
! a3b66c94bb9836451a5a4e7e00d59aea  gcc/langhooks.cc
! 599d97bd29c2fd711d6aba59eeb21211  gcc/langhooks.h
  75deba840ba0746416d8a7516027f7b7  gcc/late-combine.cc
  c521215ec99f112111f648bd88759ca3  gcc/lazy-diagnostic-path.cc
  dc9c6fb11d3b3fffe354eff3daf0454c  gcc/lazy-diagnostic-path.h
--- 6613,6621 ----
  050f3124bc0b966ee56bf6aef5ba85b4  gcc/json.cc
  d4441c216144e8178e5c35e33874f04b  gcc/json.h
  47f18749c5685cd9ae918c4288aa5bf4  gcc/jump.cc
! f74891b3d3f9b6b3e0cbe66a7252cd83  gcc/langhooks-def.h
! fffab8c77115c6471e5e10dea11739e1  gcc/langhooks.cc
! 5918c7467c079a50e076e834bb3839c7  gcc/langhooks.h
  75deba840ba0746416d8a7516027f7b7  gcc/late-combine.cc
  c521215ec99f112111f648bd88759ca3  gcc/lazy-diagnostic-path.cc
  dc9c6fb11d3b3fffe354eff3daf0454c  gcc/lazy-diagnostic-path.h
*************** e44c0bf9cc0411d7bd57c6585eb6d0e4  gcc/lt
*** 6688,6694 ****
  b417a4bd52371186803e70c49d24764d  gcc/m2/COPYING.RUNTIME
  8f0e2cd40e05189ec81232da84bd6e1a  gcc/m2/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/m2/COPYING3.LIB
! 4c29c1f1467edefd2bb5034f06901c70  gcc/m2/ChangeLog
  33352ea845a8d2399793299f3e58a218  gcc/m2/Make-lang.in
  93fe99bf456561cd217f1c93d2ab7da7  gcc/m2/Make-maintainer.in
  6a74129fda00ca52ba9f953538250c45  gcc/m2/NEWS
--- 6691,6697 ----
  b417a4bd52371186803e70c49d24764d  gcc/m2/COPYING.RUNTIME
  8f0e2cd40e05189ec81232da84bd6e1a  gcc/m2/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/m2/COPYING3.LIB
! d7895300193dcb8a096d82229c689f40  gcc/m2/ChangeLog
  33352ea845a8d2399793299f3e58a218  gcc/m2/Make-lang.in
  93fe99bf456561cd217f1c93d2ab7da7  gcc/m2/Make-maintainer.in
  6a74129fda00ca52ba9f953538250c45  gcc/m2/NEWS
*************** dec6f2aff29cb5fe1427242c7c5e9bd7  gcc/m2
*** 6719,6726 ****
  4fd8de25a94ebe3d7dc535d77d35bcf1  gcc/m2/gm2-compiler/M2Bitset.mod
  d4b939b5e1e8ebd5bbfd57a171da0768  gcc/m2/gm2-compiler/M2CaseList.def
  d7fec62c2b6b02dd7e4572d655ab9df6  gcc/m2/gm2-compiler/M2CaseList.mod
! b6a105b49f033eae03d7e9f503b92233  gcc/m2/gm2-compiler/M2Check.def
! 9d86f689b3a62f4148d122fb1d6f2eaa  gcc/m2/gm2-compiler/M2Check.mod
  478260474362f8756893377722538db4  gcc/m2/gm2-compiler/M2Code.def
  0737ee73e0c5f6e620bab4cd1e3a96b6  gcc/m2/gm2-compiler/M2Code.mod
  7ec6d0e1d8778b77940a35fb413cc951  gcc/m2/gm2-compiler/M2ColorString.def
--- 6722,6729 ----
  4fd8de25a94ebe3d7dc535d77d35bcf1  gcc/m2/gm2-compiler/M2Bitset.mod
  d4b939b5e1e8ebd5bbfd57a171da0768  gcc/m2/gm2-compiler/M2CaseList.def
  d7fec62c2b6b02dd7e4572d655ab9df6  gcc/m2/gm2-compiler/M2CaseList.mod
! e77e63c641c7e1cd6a919ca2565d5a53  gcc/m2/gm2-compiler/M2Check.def
! 3866e1c7f421c02e592f801e8c90b62e  gcc/m2/gm2-compiler/M2Check.mod
  478260474362f8756893377722538db4  gcc/m2/gm2-compiler/M2Code.def
  0737ee73e0c5f6e620bab4cd1e3a96b6  gcc/m2/gm2-compiler/M2Code.mod
  7ec6d0e1d8778b77940a35fb413cc951  gcc/m2/gm2-compiler/M2ColorString.def
*************** f2f6ad340399124ac1dd7765e1b675a5  gcc/m2
*** 6747,6753 ****
  b3c98d490dd50cdd4e4de316e0deca54  gcc/m2/gm2-compiler/M2GCCDeclare.def
  0334dee0562359e9a335b23e63acc113  gcc/m2/gm2-compiler/M2GCCDeclare.mod
  3d68446acff53fae7c5d6c425f0cf67e  gcc/m2/gm2-compiler/M2GenGCC.def
! 48ce93daedd6c94ddc930c46264bf94a  gcc/m2/gm2-compiler/M2GenGCC.mod
  273c623529a07acbf2f80b58e2d7567e  gcc/m2/gm2-compiler/M2Graph.def
  4e2b3a2e0b4cc7af0785ab9e41438e6b  gcc/m2/gm2-compiler/M2Graph.mod
  0d543e40ef3f1bcdf8edf9e06baa1edb  gcc/m2/gm2-compiler/M2LangDump.def
--- 6750,6756 ----
  b3c98d490dd50cdd4e4de316e0deca54  gcc/m2/gm2-compiler/M2GCCDeclare.def
  0334dee0562359e9a335b23e63acc113  gcc/m2/gm2-compiler/M2GCCDeclare.mod
  3d68446acff53fae7c5d6c425f0cf67e  gcc/m2/gm2-compiler/M2GenGCC.def
! 27671eb59c0f3868cece3d034a2b15cd  gcc/m2/gm2-compiler/M2GenGCC.mod
  273c623529a07acbf2f80b58e2d7567e  gcc/m2/gm2-compiler/M2Graph.def
  4e2b3a2e0b4cc7af0785ab9e41438e6b  gcc/m2/gm2-compiler/M2Graph.mod
  0d543e40ef3f1bcdf8edf9e06baa1edb  gcc/m2/gm2-compiler/M2LangDump.def
*************** cccf272bab8c31a6af4113dc6a4e7b2d  gcc/m2
*** 6756,6767 ****
  0b2e870715b8c61c0f2f872a91124e0f  gcc/m2/gm2-compiler/M2Lex.mod
  a45ab5cf82c6f9afcaac634dd94f9e74  gcc/m2/gm2-compiler/M2LexBuf.def
  b112f4dc73573695c3456ad0128babea  gcc/m2/gm2-compiler/M2LexBuf.mod
! d5e90638a6be76d16e254f2d49424f5a  gcc/m2/gm2-compiler/M2MetaError.def
  e0b507413bb6cd0581c5eae75886518e  gcc/m2/gm2-compiler/M2MetaError.mod
  30199ab614068ba2ade7649d91420d13  gcc/m2/gm2-compiler/M2Optimize.def
  6b138f381fa3bee219d0c362567bbcb0  gcc/m2/gm2-compiler/M2Optimize.mod
! d327c19316a54d8729d7a771974b9719  gcc/m2/gm2-compiler/M2Options.def
! 3014d3d6b4d606a0404fc28e9bf73ae1  gcc/m2/gm2-compiler/M2Options.mod
  d4665bec21a330a2ea9d700f430b902c  gcc/m2/gm2-compiler/M2Pass.def
  27d906feaab7f1e1088a6e5561972605  gcc/m2/gm2-compiler/M2Pass.mod
  ba5338a3d56483c2fe43bb703d68d88a  gcc/m2/gm2-compiler/M2Preprocess.def
--- 6759,6770 ----
  0b2e870715b8c61c0f2f872a91124e0f  gcc/m2/gm2-compiler/M2Lex.mod
  a45ab5cf82c6f9afcaac634dd94f9e74  gcc/m2/gm2-compiler/M2LexBuf.def
  b112f4dc73573695c3456ad0128babea  gcc/m2/gm2-compiler/M2LexBuf.mod
! ce8b84d06b3a3f63e9c45f9a9d2c20ec  gcc/m2/gm2-compiler/M2MetaError.def
  e0b507413bb6cd0581c5eae75886518e  gcc/m2/gm2-compiler/M2MetaError.mod
  30199ab614068ba2ade7649d91420d13  gcc/m2/gm2-compiler/M2Optimize.def
  6b138f381fa3bee219d0c362567bbcb0  gcc/m2/gm2-compiler/M2Optimize.mod
! 4de3b1a67e6b8567572dd9a344366b3b  gcc/m2/gm2-compiler/M2Options.def
! 10a79e5e781dfec73ae9ae10d9aafe05  gcc/m2/gm2-compiler/M2Options.mod
  d4665bec21a330a2ea9d700f430b902c  gcc/m2/gm2-compiler/M2Pass.def
  27d906feaab7f1e1088a6e5561972605  gcc/m2/gm2-compiler/M2Pass.mod
  ba5338a3d56483c2fe43bb703d68d88a  gcc/m2/gm2-compiler/M2Preprocess.def
*************** ffffd6bd10c2f3d61aee939845cdb397  gcc/m2
*** 6769,6779 ****
  5aae879fe93711ac462b3871f94cfdfb  gcc/m2/gm2-compiler/M2Printf.def
  2984233cca97a1078980faba9ae9c1c5  gcc/m2/gm2-compiler/M2Printf.mod
  1f3929030e3dde0bd645746be5c341d3  gcc/m2/gm2-compiler/M2Quads.def
! 6f1b0894c94978c5d67c6d78679cec2a  gcc/m2/gm2-compiler/M2Quads.mod
  652e5da6749bca8b22b149208db30048  gcc/m2/gm2-compiler/M2Quiet.def
  fe82981e1fc213781973d90590cac13a  gcc/m2/gm2-compiler/M2Quiet.mod
! 9f24b5a3c0b7a01ab30febbaab5884ca  gcc/m2/gm2-compiler/M2Range.def
! 815279d5821105d8eb7675448b8ef8aa  gcc/m2/gm2-compiler/M2Range.mod
  4a2f65e7c18c35e70ddd63bff56f07c8  gcc/m2/gm2-compiler/M2Reserved.def
  dbf158483e30ce2911313b80d3d6c72c  gcc/m2/gm2-compiler/M2Reserved.mod
  ed9342d46dccb1fef2e7dd1b2a268c89  gcc/m2/gm2-compiler/M2SSA.def
--- 6772,6782 ----
  5aae879fe93711ac462b3871f94cfdfb  gcc/m2/gm2-compiler/M2Printf.def
  2984233cca97a1078980faba9ae9c1c5  gcc/m2/gm2-compiler/M2Printf.mod
  1f3929030e3dde0bd645746be5c341d3  gcc/m2/gm2-compiler/M2Quads.def
! e159a93e4a854ebc6c9c911c19e9352a  gcc/m2/gm2-compiler/M2Quads.mod
  652e5da6749bca8b22b149208db30048  gcc/m2/gm2-compiler/M2Quiet.def
  fe82981e1fc213781973d90590cac13a  gcc/m2/gm2-compiler/M2Quiet.mod
! 3a524bf1e1843ed3472cde4c27661681  gcc/m2/gm2-compiler/M2Range.def
! 6579931bd23b1667200a0f9d433fcb22  gcc/m2/gm2-compiler/M2Range.mod
  4a2f65e7c18c35e70ddd63bff56f07c8  gcc/m2/gm2-compiler/M2Reserved.def
  dbf158483e30ce2911313b80d3d6c72c  gcc/m2/gm2-compiler/M2Reserved.mod
  ed9342d46dccb1fef2e7dd1b2a268c89  gcc/m2/gm2-compiler/M2SSA.def
*************** fcea7fa814eb36ddef577d6be2c93e63  gcc/m2
*** 6890,6896 ****
  5788cdee0acc63304e8a5005f050e8db  gcc/m2/gm2-gcc/m2misc.cc
  421b5a035afb6002ff2a6ea75f46fb8b  gcc/m2/gm2-gcc/m2misc.def
  d1b31285582b67ba97d01e8e43b1b2d6  gcc/m2/gm2-gcc/m2misc.h
! 188c054ee4e9d54504fdcc6c5c61012f  gcc/m2/gm2-gcc/m2options.h
  fc9e0e22b8c78d20df127cd19a3d6992  gcc/m2/gm2-gcc/m2pp.cc
  bb3433f39db6f3c3cfdf3511e76c67e0  gcc/m2/gm2-gcc/m2pp.def
  698b9ffff0556061b1385c89a3262733  gcc/m2/gm2-gcc/m2pp.h
--- 6893,6899 ----
  5788cdee0acc63304e8a5005f050e8db  gcc/m2/gm2-gcc/m2misc.cc
  421b5a035afb6002ff2a6ea75f46fb8b  gcc/m2/gm2-gcc/m2misc.def
  d1b31285582b67ba97d01e8e43b1b2d6  gcc/m2/gm2-gcc/m2misc.h
! 0772ce4d76e23365f02b2e795ecdb061  gcc/m2/gm2-gcc/m2options.h
  fc9e0e22b8c78d20df127cd19a3d6992  gcc/m2/gm2-gcc/m2pp.cc
  bb3433f39db6f3c3cfdf3511e76c67e0  gcc/m2/gm2-gcc/m2pp.def
  698b9ffff0556061b1385c89a3262733  gcc/m2/gm2-gcc/m2pp.h
*************** b014a5a5babb9953d9f203bf4fd10046  gcc/m2
*** 6917,6923 ****
  d5db4a0704741e24958241fe74fd007c  gcc/m2/gm2-ici/README
  1a509083f6bbab06c5aa4fdf0bcdc613  gcc/m2/gm2-ici/m2linemap.c
  ef5415e8ad71dffb5daf39428970d577  gcc/m2/gm2-internals.texi
! 65582451d93c6fd35f508f86bf2f3258  gcc/m2/gm2-lang.cc
  9584a98fba37e1f4209b1a26ca795ec0  gcc/m2/gm2-lang.h
  2b1d730bdeb600463475d3bb94f17f12  gcc/m2/gm2-libiberty/README
  2293cd11c3bafff5a1517363d39a0273  gcc/m2/gm2-libiberty/choosetemp.def
--- 6920,6926 ----
  d5db4a0704741e24958241fe74fd007c  gcc/m2/gm2-ici/README
  1a509083f6bbab06c5aa4fdf0bcdc613  gcc/m2/gm2-ici/m2linemap.c
  ef5415e8ad71dffb5daf39428970d577  gcc/m2/gm2-internals.texi
! 40b61715b0303eb9e5585d065dc9f34e  gcc/m2/gm2-lang.cc
  9584a98fba37e1f4209b1a26ca795ec0  gcc/m2/gm2-lang.h
  2b1d730bdeb600463475d3bb94f17f12  gcc/m2/gm2-libiberty/README
  2293cd11c3bafff5a1517363d39a0273  gcc/m2/gm2-libiberty/choosetemp.def
*************** bcf0466406e2a958f390256fcdb71e90  gcc/m2
*** 7134,7140 ****
  8d73e14ade71f4eb2157891f0240fbdb  gcc/m2/gm2-libs-log/FloatingUtilities.def
  c8b643a1644e7213a7a9168f372236e0  gcc/m2/gm2-libs-log/FloatingUtilities.mod
  54b70a547bf2038b6a26f37ac5a132d4  gcc/m2/gm2-libs-log/InOut.def
! df6d092b094b6bf779c6dce71e8f2ca8  gcc/m2/gm2-libs-log/InOut.mod
  a03e7ac626c4153628f9a55ff67b1414  gcc/m2/gm2-libs-log/Keyboard.def
  5c23f823ba8713af6603b6786ded29c3  gcc/m2/gm2-libs-log/Keyboard.mod
  4ca2609946edd2a99dffa88148791946  gcc/m2/gm2-libs-log/LongIO.def
--- 7137,7143 ----
  8d73e14ade71f4eb2157891f0240fbdb  gcc/m2/gm2-libs-log/FloatingUtilities.def
  c8b643a1644e7213a7a9168f372236e0  gcc/m2/gm2-libs-log/FloatingUtilities.mod
  54b70a547bf2038b6a26f37ac5a132d4  gcc/m2/gm2-libs-log/InOut.def
! 5c65d91e46dccc389ad8ea5dd5f9eaed  gcc/m2/gm2-libs-log/InOut.mod
  a03e7ac626c4153628f9a55ff67b1414  gcc/m2/gm2-libs-log/Keyboard.def
  5c23f823ba8713af6603b6786ded29c3  gcc/m2/gm2-libs-log/Keyboard.mod
  4ca2609946edd2a99dffa88148791946  gcc/m2/gm2-libs-log/LongIO.def
*************** d02bb7b852c2149c474702f929b72f2d  gcc/m2
*** 7278,7284 ****
  295651a10667b286ed55c3afdcb0e117  gcc/m2/init/mcinit
  1926300919acbdbf55ed47c4997a459b  gcc/m2/init/ppginit
  0a585a032e28317a1dc67efc96504e1f  gcc/m2/lang-specs.h
! 6a1da4229612569b0d4a68e329c901e2  gcc/m2/lang.opt
  b78b0219cda3cd36f38421786dc862e7  gcc/m2/lang.opt.urls
  36221d63a7a556b1dbbd7b2aa1ddd8fa  gcc/m2/m2-tree.def
  a93d546f180b351bb03d87a0bb03ef2f  gcc/m2/m2-tree.h
--- 7281,7287 ----
  295651a10667b286ed55c3afdcb0e117  gcc/m2/init/mcinit
  1926300919acbdbf55ed47c4997a459b  gcc/m2/init/ppginit
  0a585a032e28317a1dc67efc96504e1f  gcc/m2/lang-specs.h
! dd05e0d11b332a529c7fc48a30234ecd  gcc/m2/lang.opt
  b78b0219cda3cd36f38421786dc862e7  gcc/m2/lang.opt.urls
  36221d63a7a556b1dbbd7b2aa1ddd8fa  gcc/m2/m2-tree.def
  a93d546f180b351bb03d87a0bb03ef2f  gcc/m2/m2-tree.h
*************** f9608e9005487c369e6c38949ab36fa1  gcc/m2
*** 7631,7637 ****
  88e10618d6f39a411b34e2245b93307b  gcc/machmode.def
  db2ee1a68662c8370d59f7e4f6cf917b  gcc/machmode.h
  486412acbbb6de10b080e31410a14f33  gcc/main.cc
! 471f52dc9f57af25d4b404e048625cff  gcc/match.pd
  63bf182c7c3a100e101b2129976be89b  gcc/mcf.cc
  795fbbc034a60f5af7e79dbe3bac65a0  gcc/mem-stats-traits.h
  295dcd7618653c13dcf063266752d06f  gcc/mem-stats.h
--- 7634,7640 ----
  88e10618d6f39a411b34e2245b93307b  gcc/machmode.def
  db2ee1a68662c8370d59f7e4f6cf917b  gcc/machmode.h
  486412acbbb6de10b080e31410a14f33  gcc/main.cc
! 4d4cc0fe73b53260006e09426a7156ea  gcc/match.pd
  63bf182c7c3a100e101b2129976be89b  gcc/mcf.cc
  795fbbc034a60f5af7e79dbe3bac65a0  gcc/mem-stats-traits.h
  295dcd7618653c13dcf063266752d06f  gcc/mem-stats.h
*************** c2186582925518f8871bcb0f066553f0  gcc/om
*** 7676,7682 ****
  f441ac6601a5a1f6ba5ca39bef20c13a  gcc/omp-expand.cc
  286190bcce78c62804516df6cd0d1684  gcc/omp-expand.h
  4690b68c8d78cbea16b05816b53a61cf  gcc/omp-general.cc
! 8da93c6a9f42421b5af39e03da74c94c  gcc/omp-general.h
  1324f8a540660f2cbdb237493c886d56  gcc/omp-low.cc
  73fb62acbdd74e28aff8cc147ee7fa11  gcc/omp-low.h
  bf774332919d8fc6ad76372ccefd0aa2  gcc/omp-oacc-kernels-decompose.cc
--- 7679,7685 ----
  f441ac6601a5a1f6ba5ca39bef20c13a  gcc/omp-expand.cc
  286190bcce78c62804516df6cd0d1684  gcc/omp-expand.h
  4690b68c8d78cbea16b05816b53a61cf  gcc/omp-general.cc
! cb2a8c86939322e491658cba12c21c2f  gcc/omp-general.h
  1324f8a540660f2cbdb237493c886d56  gcc/omp-low.cc
  73fb62acbdd74e28aff8cc147ee7fa11  gcc/omp-low.h
  bf774332919d8fc6ad76372ccefd0aa2  gcc/omp-oacc-kernels-decompose.cc
*************** fcb5b7227342c442bcddbcc06eaddcdc  gcc/op
*** 7712,7718 ****
  58f02a8817c05c6681ba150251b166e8  gcc/optinfo.h
  1c30e8950551cbe97bda991d288b7bb7  gcc/options-urls-cc-gen.awk
  06a83d971fd3a11f54c904ab9260cc09  gcc/opts-common.cc
! d07f1879b2cefcb7c42874ef3308019b  gcc/opts-diagnostic.cc
  bd138c731d5ef02ebe19e25375c465c8  gcc/opts-diagnostic.h
  dc49add7ae35ac8842b786b817fd79b3  gcc/opts-global.cc
  079a115ae417106f3e7f42b0272b866d  gcc/opts-jobserver.h
--- 7715,7721 ----
  58f02a8817c05c6681ba150251b166e8  gcc/optinfo.h
  1c30e8950551cbe97bda991d288b7bb7  gcc/options-urls-cc-gen.awk
  06a83d971fd3a11f54c904ab9260cc09  gcc/opts-common.cc
! 283d65838ceb0c8c1bff29483139efac  gcc/opts-diagnostic.cc
  bd138c731d5ef02ebe19e25375c465c8  gcc/opts-diagnostic.h
  dc49add7ae35ac8842b786b817fd79b3  gcc/opts-global.cc
  079a115ae417106f3e7f42b0272b866d  gcc/opts-jobserver.h
*************** b2f692287d25760afcef126c010f7078  gcc/pa
*** 7726,7733 ****
  718e6aebe38eb0dd2bf3d15b5553f760  gcc/params.opt
  2cc794e23d80a8c9f057a7e402c65fb8  gcc/params.opt.urls
  6f1352dbd329b2ebb19a8b1337497ea4  gcc/pass_manager.h
! 6ce308056f9fff6440a7a6770b2b8e33  gcc/passes.cc
! 8bef7ffcda2165b2b4a54854eb7ea8b4  gcc/passes.def
  e3f908061f2b051f55381b513a49022b  gcc/path-coverage.cc
  57048d71e78511e69e3d39d60cb2f1b7  gcc/plugin.cc
  995702441547e9826ffaea326d8be617  gcc/plugin.def
--- 7729,7736 ----
  718e6aebe38eb0dd2bf3d15b5553f760  gcc/params.opt
  2cc794e23d80a8c9f057a7e402c65fb8  gcc/params.opt.urls
  6f1352dbd329b2ebb19a8b1337497ea4  gcc/pass_manager.h
! cf39cd628f9dc29a9a191f4af2c68346  gcc/passes.cc
! fc39d16481e008cabb9733b116958d1c  gcc/passes.def
  e3f908061f2b051f55381b513a49022b  gcc/path-coverage.cc
  57048d71e78511e69e3d39d60cb2f1b7  gcc/plugin.cc
  995702441547e9826ffaea326d8be617  gcc/plugin.def
*************** b738479ec22d37eb065644041600a079  gcc/po
*** 7762,7768 ****
  49996ef12af53fc104c8c73884c06aa6  gcc/poly-int.h
  475f722ae164d853cf948309392e72fa  gcc/postreload-gcse.cc
  1696ccf7c912de56dfdeaaa05e52380e  gcc/postreload.cc
! ee21b4dde2cee6f5b2ad862f20f03f5d  gcc/predict.cc
  a4c4b609df2262702bd9691ce3ef1b39  gcc/predict.def
  5494603f698198c1a7d327aa6bbdb09a  gcc/predict.h
  00fb3c12fcc945bd00d0da1986741e41  gcc/prefix.cc
--- 7765,7771 ----
  49996ef12af53fc104c8c73884c06aa6  gcc/poly-int.h
  475f722ae164d853cf948309392e72fa  gcc/postreload-gcse.cc
  1696ccf7c912de56dfdeaaa05e52380e  gcc/postreload.cc
! a80ca7db0082a779807e807bc9b15ef6  gcc/predict.cc
  a4c4b609df2262702bd9691ce3ef1b39  gcc/predict.def
  5494603f698198c1a7d327aa6bbdb09a  gcc/predict.h
  00fb3c12fcc945bd00d0da1986741e41  gcc/prefix.cc
*************** a4c4b609df2262702bd9691ce3ef1b39  gcc/pr
*** 7770,7784 ****
  0afaaeb5db635f56227acae416021586  gcc/pretty-print-format-impl.h
  ed550d9201c53b2e183ac8da7882fb20  gcc/pretty-print-markup.h
  445beb21a2f28b79808b2eebd0fe4856  gcc/pretty-print-urlifier.h
! acf2d8993e38f78fc97fed199b329481  gcc/pretty-print.cc
! b23f4b4985ec787644b4d3dfb04eee2d  gcc/pretty-print.h
  0ca12a1ce54abc07cff889e360731637  gcc/prime-paths.cc
  a6e4e4fab174379976dcb09269c8de98  gcc/print-rtl-function.cc
  a5461dd81ec55dc6f56817a1f356f345  gcc/print-rtl.cc
  63499dea0e911b175def4a9153353027  gcc/print-rtl.h
  25b31c9113a977129e37056b6c5fd751  gcc/print-tree.cc
  469848c1e480b033f7ee22f68ec05f94  gcc/print-tree.h
! e8c35569a14575916739eaf1432f7c19  gcc/profile-count.cc
  baf3f698b3459c32f628569084b80d9c  gcc/profile-count.h
  be294583d74c167da1819e51e9001b52  gcc/profile.cc
  d30f617ac9705fc7dc5d14e744fe4ff0  gcc/profile.h
--- 7773,7787 ----
  0afaaeb5db635f56227acae416021586  gcc/pretty-print-format-impl.h
  ed550d9201c53b2e183ac8da7882fb20  gcc/pretty-print-markup.h
  445beb21a2f28b79808b2eebd0fe4856  gcc/pretty-print-urlifier.h
! 789a283532c12d0634290baa6a4de8dc  gcc/pretty-print.cc
! 191fccc415dd02373e9969178df93d03  gcc/pretty-print.h
  0ca12a1ce54abc07cff889e360731637  gcc/prime-paths.cc
  a6e4e4fab174379976dcb09269c8de98  gcc/print-rtl-function.cc
  a5461dd81ec55dc6f56817a1f356f345  gcc/print-rtl.cc
  63499dea0e911b175def4a9153353027  gcc/print-rtl.h
  25b31c9113a977129e37056b6c5fd751  gcc/print-tree.cc
  469848c1e480b033f7ee22f68ec05f94  gcc/print-tree.h
! c7fd66d165bf09ee75a0d6f411c424a5  gcc/profile-count.cc
  baf3f698b3459c32f628569084b80d9c  gcc/profile-count.h
  be294583d74c167da1819e51e9001b52  gcc/profile.cc
  d30f617ac9705fc7dc5d14e744fe4ff0  gcc/profile.h
*************** ae3ad005e8aa99428875298a3a4a9807  gcc/rt
*** 7829,7835 ****
  66b4e87db60474417ffffe027ae7f92f  gcc/rtl-ssa/blocks.cc
  520011b5e2ce3793d91dd754d2a666ee  gcc/rtl-ssa/blocks.h
  33b2e67a8ebbdcbe29d4b567f6ce3700  gcc/rtl-ssa/change-utils.h
! 3ee3460fd5a8e792c640416c7a25a465  gcc/rtl-ssa/changes.cc
  c607a19c0aef8e5e1a34995205ca21ad  gcc/rtl-ssa/changes.h
  3247cab7031af7ec0a17f27198004fd5  gcc/rtl-ssa/functions.cc
  ad760b8947b6feeec03df375bb3d68b9  gcc/rtl-ssa/functions.h
--- 7832,7838 ----
  66b4e87db60474417ffffe027ae7f92f  gcc/rtl-ssa/blocks.cc
  520011b5e2ce3793d91dd754d2a666ee  gcc/rtl-ssa/blocks.h
  33b2e67a8ebbdcbe29d4b567f6ce3700  gcc/rtl-ssa/change-utils.h
! e647f3e6fa2e04e4752edd000055f636  gcc/rtl-ssa/changes.cc
  c607a19c0aef8e5e1a34995205ca21ad  gcc/rtl-ssa/changes.h
  3247cab7031af7ec0a17f27198004fd5  gcc/rtl-ssa/functions.cc
  ad760b8947b6feeec03df375bb3d68b9  gcc/rtl-ssa/functions.h
*************** f39c55472711c984059aff01fd972f31  gcc/rt
*** 7847,7853 ****
  1105088521e8de72d332faeda31306c7  gcc/rtl.cc
  41ece3c6a40e9a14609645318016e228  gcc/rtl.def
  325c220265233bde9a9a0bf35ba8fecb  gcc/rtl.h
! 4ee5bf7f59df8ad15a444be0bc71cb4e  gcc/rtlanal.cc
  e38f02dbd2d0d8c027ccae4b785f3fb2  gcc/rtlanal.h
  f829c444b36f34672cb4a7b019c4513b  gcc/rtlhash.cc
  ce0129afbbfb3ab85e5bd8ce9672117d  gcc/rtlhash.h
--- 7850,7856 ----
  1105088521e8de72d332faeda31306c7  gcc/rtl.cc
  41ece3c6a40e9a14609645318016e228  gcc/rtl.def
  325c220265233bde9a9a0bf35ba8fecb  gcc/rtl.h
! b1f87a78aa0bcacaf49d45b0a31b4f3f  gcc/rtlanal.cc
  e38f02dbd2d0d8c027ccae4b785f3fb2  gcc/rtlanal.h
  f829c444b36f34672cb4a7b019c4513b  gcc/rtlhash.cc
  ce0129afbbfb3ab85e5bd8ce9672117d  gcc/rtlhash.h
*************** f47b1babbf39168c2829bbc0997f6b9b  gcc/sa
*** 8350,8357 ****
  1c4a31054492029cadf12999aee53d81  gcc/sanopt.cc
  ffcc8ac34ad1c40fd6aec56f005e22c8  gcc/sarif-replay.cc
  a92419791c8e8d842c6ef029d4537463  gcc/sarif-spec-urls.def
! f222bdd8af567c7806aeb6a3c767cc2c  gcc/sbitmap.cc
! 970d315ce608721d1e10ab704ba7dbf8  gcc/sbitmap.h
  c719b36bd1d2169ade6d4912ca97abe7  gcc/sched-deps.cc
  fb344dad78b286c2b8b8160a6e94c227  gcc/sched-ebb.cc
  37b5863c967088b8fd3f21ca88609243  gcc/sched-int.h
--- 8353,8360 ----
  1c4a31054492029cadf12999aee53d81  gcc/sanopt.cc
  ffcc8ac34ad1c40fd6aec56f005e22c8  gcc/sarif-replay.cc
  a92419791c8e8d842c6ef029d4537463  gcc/sarif-spec-urls.def
! 31050442ff986af301d1822bb48a2dc0  gcc/sbitmap.cc
! 17496ea3285b5b8563702a8c44caa8bd  gcc/sbitmap.h
  c719b36bd1d2169ade6d4912ca97abe7  gcc/sched-deps.cc
  fb344dad78b286c2b8b8160a6e94c227  gcc/sched-ebb.cc
  37b5863c967088b8fd3f21ca88609243  gcc/sched-int.h
*************** b69c0a60b87460456bf02111f39310dd  gcc/se
*** 8365,8382 ****
  0f03d3badfef7fb7c66d72631c12e55f  gcc/selftest-diagnostic-path.cc
  077cb17f489943323e35c165fe527d78  gcc/selftest-diagnostic-path.h
  60a6c5bd5960cea7c7c426b1443c533e  gcc/selftest-diagnostic-show-locus.h
! 3dfba798c74c337636b64e676e955ffb  gcc/selftest-diagnostic.cc
! 1b76756b9679c77ba0df2582680d7356  gcc/selftest-diagnostic.h
  109061be2ca9df2d7941d134aabdf120  gcc/selftest-json.cc
  065d0522cc6ea795703e89270514b149  gcc/selftest-json.h
  cf6dc6ad925fca1cf0c021015c344469  gcc/selftest-logical-location.cc
  74ebb02c30bec8d1c45c78a387c5ee18  gcc/selftest-logical-location.h
  22224372e5a2696e660289e86b2696a5  gcc/selftest-rtl.cc
  ab96230d11b93b85d4d1b85cc5d494ab  gcc/selftest-rtl.h
! 9fd8fee0950cc650b4e3340f0710c8fa  gcc/selftest-run-tests.cc
  777b0025fe2356f118cb24f2302ae4ff  gcc/selftest-tree.h
  220320c985328c0546a9a80a7353964e  gcc/selftest.cc
! 97d530c74f46b94c4de5ab31fbd2d38d  gcc/selftest.h
  71b83bf173726493d9fee558216a2e02  gcc/sese.cc
  62e0bec4b0ac9f8e027af35a2c2e2330  gcc/sese.h
  9123313dafdd85df1e747e738274ee2c  gcc/shortest-paths.h
--- 8368,8385 ----
  0f03d3badfef7fb7c66d72631c12e55f  gcc/selftest-diagnostic-path.cc
  077cb17f489943323e35c165fe527d78  gcc/selftest-diagnostic-path.h
  60a6c5bd5960cea7c7c426b1443c533e  gcc/selftest-diagnostic-show-locus.h
! da289341188bb47929b58cb05089f2b1  gcc/selftest-diagnostic.cc
! aa7a992403f9436fb020f56988773ed5  gcc/selftest-diagnostic.h
  109061be2ca9df2d7941d134aabdf120  gcc/selftest-json.cc
  065d0522cc6ea795703e89270514b149  gcc/selftest-json.h
  cf6dc6ad925fca1cf0c021015c344469  gcc/selftest-logical-location.cc
  74ebb02c30bec8d1c45c78a387c5ee18  gcc/selftest-logical-location.h
  22224372e5a2696e660289e86b2696a5  gcc/selftest-rtl.cc
  ab96230d11b93b85d4d1b85cc5d494ab  gcc/selftest-rtl.h
! 208622fee5e412189adf9fa83978e78a  gcc/selftest-run-tests.cc
  777b0025fe2356f118cb24f2302ae4ff  gcc/selftest-tree.h
  220320c985328c0546a9a80a7353964e  gcc/selftest.cc
! 22109e8fd0f9974a8bf1a2572bd74cf0  gcc/selftest.h
  71b83bf173726493d9fee558216a2e02  gcc/sese.cc
  62e0bec4b0ac9f8e027af35a2c2e2330  gcc/sese.h
  9123313dafdd85df1e747e738274ee2c  gcc/shortest-paths.h
*************** b1497a03867668af210c32280876fdd7  gcc/sy
*** 8439,8445 ****
  b4bbfe8a8f62eed5c75429762e88d324  gcc/targhooks.cc
  ae57260b8b60d8b8dfaef3556c3ac5e5  gcc/targhooks.h
  f39fcaa8197187283ccfed40107b426d  gcc/testsuite/.gitattributes
! 12da2c7ca7875baac09fdec412c2e929  gcc/testsuite/ChangeLog
  47e8e29b649ead73b8a1e4797da470ed  gcc/testsuite/ChangeLog-1993-2007
  35198a9e4fd31b935de8789faabf3351  gcc/testsuite/ChangeLog-2008
  0f19934540750356d1b91595cebfd9a8  gcc/testsuite/ChangeLog-2009
--- 8442,8448 ----
  b4bbfe8a8f62eed5c75429762e88d324  gcc/targhooks.cc
  ae57260b8b60d8b8dfaef3556c3ac5e5  gcc/targhooks.h
  f39fcaa8197187283ccfed40107b426d  gcc/testsuite/.gitattributes
! f2f620f972d5676dc010c4d60a28bf6c  gcc/testsuite/ChangeLog
  47e8e29b649ead73b8a1e4797da470ed  gcc/testsuite/ChangeLog-1993-2007
  35198a9e4fd31b935de8789faabf3351  gcc/testsuite/ChangeLog-2008
  0f19934540750356d1b91595cebfd9a8  gcc/testsuite/ChangeLog-2009
*************** dcd88cf4442d15fe1ee6cf0c65bec7ba  gcc/te
*** 18511,18517 ****
  b18e853bf462cafe38d3448d58a4e05c  gcc/testsuite/c-c++-common/gomp/attrs-3.c
  5f55dd34d269d2c286bae5200e580724  gcc/testsuite/c-c++-common/gomp/attrs-metadirective-1.c
  e7654509a8694bbd30fb1699591c8a0a  gcc/testsuite/c-c++-common/gomp/attrs-metadirective-2.c
! 06796489f85a7823fc889bcf3314163b  gcc/testsuite/c-c++-common/gomp/attrs-metadirective-3.c
  585d8f7a0b28941f42372f69b9fe2c54  gcc/testsuite/c-c++-common/gomp/attrs-metadirective-4.c
  08ed3f839b805c729a22134e3facfc56  gcc/testsuite/c-c++-common/gomp/attrs-metadirective-5.c
  a7fd5b945698db9b1babd132533f2610  gcc/testsuite/c-c++-common/gomp/attrs-metadirective-6.c
--- 18514,18520 ----
  b18e853bf462cafe38d3448d58a4e05c  gcc/testsuite/c-c++-common/gomp/attrs-3.c
  5f55dd34d269d2c286bae5200e580724  gcc/testsuite/c-c++-common/gomp/attrs-metadirective-1.c
  e7654509a8694bbd30fb1699591c8a0a  gcc/testsuite/c-c++-common/gomp/attrs-metadirective-2.c
! be58805a59309ad5d71c49c48877eb34  gcc/testsuite/c-c++-common/gomp/attrs-metadirective-3.c
  585d8f7a0b28941f42372f69b9fe2c54  gcc/testsuite/c-c++-common/gomp/attrs-metadirective-4.c
  08ed3f839b805c729a22134e3facfc56  gcc/testsuite/c-c++-common/gomp/attrs-metadirective-5.c
  a7fd5b945698db9b1babd132533f2610  gcc/testsuite/c-c++-common/gomp/attrs-metadirective-6.c
*************** fb5ac32eda4e938a1684263a6f7ccfa9  gcc/te
*** 18553,18558 ****
--- 18556,18571 ----
  4a818b745d1f8704ddb0479a4cad1ca2  gcc/testsuite/c-c++-common/gomp/combined-3.c
  bfb7ec61cc1300767edd2730dd158b24  gcc/testsuite/c-c++-common/gomp/critical-1.c
  c572ac0bc0904c15b451df6870cc393d  gcc/testsuite/c-c++-common/gomp/critical-2.c
+ cb01db9e31422d2aeabb9b538ed127e4  gcc/testsuite/c-c++-common/gomp/declare-mapper-10.c
+ 5c9c560c086262d32a4f6b30aee2d54b  gcc/testsuite/c-c++-common/gomp/declare-mapper-11.c
+ 9ff51a41887aad9526944e993a5a0a19  gcc/testsuite/c-c++-common/gomp/declare-mapper-12.c
+ c171c8a32c8d1c1f3a3851365cbb0405  gcc/testsuite/c-c++-common/gomp/declare-mapper-3.c
+ 2619b0487cae48530ad103fbc2632fc3  gcc/testsuite/c-c++-common/gomp/declare-mapper-4.c
+ 230e3c87df45ddf84188f7b5a5a4bb0e  gcc/testsuite/c-c++-common/gomp/declare-mapper-5.c
+ dcd1e9ab9770a159f8a1f17c76bd1b03  gcc/testsuite/c-c++-common/gomp/declare-mapper-6.c
+ da6887a595231a43cf61133bb43acdb5  gcc/testsuite/c-c++-common/gomp/declare-mapper-7.c
+ ff19abdaca7330b11f4fe567c52cdd16  gcc/testsuite/c-c++-common/gomp/declare-mapper-8.c
+ b3db7e455b5c08954578749d93304a57  gcc/testsuite/c-c++-common/gomp/declare-mapper-9.c
  4f4730edc635e08ce7fb782360034e79  gcc/testsuite/c-c++-common/gomp/declare-target-1.c
  b4cf3cba2eeac62573f40aac959d463d  gcc/testsuite/c-c++-common/gomp/declare-target-2.c
  5d9813953c9a6b9aeeb4294adf1df6e1  gcc/testsuite/c-c++-common/gomp/declare-target-3.c
*************** cb1823c24b3132640f493855244a27f1  gcc/te
*** 18568,18574 ****
  088dc5cb2525b333a6e4b9edd63428ed  gcc/testsuite/c-c++-common/gomp/declare-variant-12.c
  3426413eb6163ee2d46f83ece16a0bc4  gcc/testsuite/c-c++-common/gomp/declare-variant-13.c
  8201a9ce72c161a5bd2784541f8201fa  gcc/testsuite/c-c++-common/gomp/declare-variant-14.c
! be3f4339fea492cffacf01dd16b4b719  gcc/testsuite/c-c++-common/gomp/declare-variant-2.c
  5783ceed28bdb2e1617af49be1fe4d1d  gcc/testsuite/c-c++-common/gomp/declare-variant-3.c
  65b510d9e426dc2a3b6896eb93dd8335  gcc/testsuite/c-c++-common/gomp/declare-variant-4.c
  ee52d5fc3f8423c9720ccca8a58180a2  gcc/testsuite/c-c++-common/gomp/declare-variant-5.c
--- 18581,18587 ----
  088dc5cb2525b333a6e4b9edd63428ed  gcc/testsuite/c-c++-common/gomp/declare-variant-12.c
  3426413eb6163ee2d46f83ece16a0bc4  gcc/testsuite/c-c++-common/gomp/declare-variant-13.c
  8201a9ce72c161a5bd2784541f8201fa  gcc/testsuite/c-c++-common/gomp/declare-variant-14.c
! 2f33249e4eedd90971280884a3c04cab  gcc/testsuite/c-c++-common/gomp/declare-variant-2.c
  5783ceed28bdb2e1617af49be1fe4d1d  gcc/testsuite/c-c++-common/gomp/declare-variant-3.c
  65b510d9e426dc2a3b6896eb93dd8335  gcc/testsuite/c-c++-common/gomp/declare-variant-4.c
  ee52d5fc3f8423c9720ccca8a58180a2  gcc/testsuite/c-c++-common/gomp/declare-variant-5.c
*************** bbbe92047177151542b6ff825d52c4e4  gcc/te
*** 18688,18694 ****
  84b32011b7cc61bdab96dc5182d6fa16  gcc/testsuite/c-c++-common/gomp/map-3.c
  f26a9793012d174bb469a5a2bbe88ed8  gcc/testsuite/c-c++-common/gomp/map-4.c
  277cedbcd2effa8734f83ed409ddc325  gcc/testsuite/c-c++-common/gomp/map-5.c
! 3f07002bcd055fe038597454af146bd9  gcc/testsuite/c-c++-common/gomp/map-6.c
  b8e110ebbec9c6db80b28e633ae2f67e  gcc/testsuite/c-c++-common/gomp/map-7.c
  44f82c91ea0443cfcfe48ff2e2ad3f49  gcc/testsuite/c-c++-common/gomp/map-8.c
  3e29caf558ff43e0252f11af669e8da4  gcc/testsuite/c-c++-common/gomp/map-9.c
--- 18701,18707 ----
  84b32011b7cc61bdab96dc5182d6fa16  gcc/testsuite/c-c++-common/gomp/map-3.c
  f26a9793012d174bb469a5a2bbe88ed8  gcc/testsuite/c-c++-common/gomp/map-4.c
  277cedbcd2effa8734f83ed409ddc325  gcc/testsuite/c-c++-common/gomp/map-5.c
! 75e7977485d7d1918eed75db729711af  gcc/testsuite/c-c++-common/gomp/map-6.c
  b8e110ebbec9c6db80b28e633ae2f67e  gcc/testsuite/c-c++-common/gomp/map-7.c
  44f82c91ea0443cfcfe48ff2e2ad3f49  gcc/testsuite/c-c++-common/gomp/map-8.c
  3e29caf558ff43e0252f11af669e8da4  gcc/testsuite/c-c++-common/gomp/map-9.c
*************** cfaa12085558b78e5edbdb4a338479d2  gcc/te
*** 18701,18707 ****
  8fdb590ce90d1a3c558de7dc81a38d89  gcc/testsuite/c-c++-common/gomp/master-combined-2.c
  12e47fbbab05145794b374e5016428d4  gcc/testsuite/c-c++-common/gomp/metadirective-1.c
  c45748d5db81ae8afdbd43b3671480a6  gcc/testsuite/c-c++-common/gomp/metadirective-2.c
! ab7f63684f93bf69666a570da6e4bc5e  gcc/testsuite/c-c++-common/gomp/metadirective-3.c
  c4c693d3bd497dda156e8c80f281ec9f  gcc/testsuite/c-c++-common/gomp/metadirective-4.c
  41fd3da8d6c55ec28cc82c985ac26db9  gcc/testsuite/c-c++-common/gomp/metadirective-5.c
  73bada7c7787403df92d2dfc87280580  gcc/testsuite/c-c++-common/gomp/metadirective-6.c
--- 18714,18720 ----
  8fdb590ce90d1a3c558de7dc81a38d89  gcc/testsuite/c-c++-common/gomp/master-combined-2.c
  12e47fbbab05145794b374e5016428d4  gcc/testsuite/c-c++-common/gomp/metadirective-1.c
  c45748d5db81ae8afdbd43b3671480a6  gcc/testsuite/c-c++-common/gomp/metadirective-2.c
! 4064a5f9f31ac05197a3719255169379  gcc/testsuite/c-c++-common/gomp/metadirective-3.c
  c4c693d3bd497dda156e8c80f281ec9f  gcc/testsuite/c-c++-common/gomp/metadirective-4.c
  41fd3da8d6c55ec28cc82c985ac26db9  gcc/testsuite/c-c++-common/gomp/metadirective-5.c
  73bada7c7787403df92d2dfc87280580  gcc/testsuite/c-c++-common/gomp/metadirective-6.c
*************** c4c693d3bd497dda156e8c80f281ec9f  gcc/te
*** 18709,18714 ****
--- 18722,18728 ----
  c567b86bb1126d3b39271713b71a2141  gcc/testsuite/c-c++-common/gomp/metadirective-8.c
  cc1a17af4b834e9dce3121d7b1504e85  gcc/testsuite/c-c++-common/gomp/metadirective-construct.c
  bfe7bd722a9814c4e3724c6c94b3bdc4  gcc/testsuite/c-c++-common/gomp/metadirective-device.c
+ 76caa2cd758ae2f6b329164c66f75a05  gcc/testsuite/c-c++-common/gomp/metadirective-error-recovery.c
  6b4e94542efc1bd9b8aeafa5fe783d4d  gcc/testsuite/c-c++-common/gomp/metadirective-no-score.c
  69c97abaf5f460360c59b85da779c004  gcc/testsuite/c-c++-common/gomp/metadirective-target-device-1.c
  19d35171b50642272e61c9f69291eca9  gcc/testsuite/c-c++-common/gomp/metadirective-target-device-2.c
*************** e8f7b694ebd3603789b6992bc816222d  gcc/te
*** 18753,18758 ****
--- 18767,18773 ----
  d29126c43ce63e6c41ed6130742b15e2  gcc/testsuite/c-c++-common/gomp/pr118965-1.c
  424bcc14d1a0bf87f576aafc485996e9  gcc/testsuite/c-c++-common/gomp/pr118965-2.c
  c83ce004951a9a0719e190f7457302c7  gcc/testsuite/c-c++-common/gomp/pr119000.c
+ dfca692e0ac01a45a3200798a153ebf1  gcc/testsuite/c-c++-common/gomp/pr120180.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
*************** c5029b3ababd909d21fec108130560c2  gcc/te
*** 21803,21808 ****
--- 21818,21824 ----
  95d1fc3ce20e1869ccfe0388d864bb6f  gcc/testsuite/g++.dg/coroutines/pr106973.C
  7801d6d5799eadc6c00398b3003e9a6d  gcc/testsuite/g++.dg/coroutines/pr107768.C
  f0ecdfa3037177a9490a46764f03f03b  gcc/testsuite/g++.dg/coroutines/pr108620.C
+ 00e5597997342d1d4ffa052764327afc  gcc/testsuite/g++.dg/coroutines/pr109283.C
  3d4d02626804c550ebe1e4cd3be90908  gcc/testsuite/g++.dg/coroutines/pr109682.C
  e871dade9f29aef626c6c2b971763df6  gcc/testsuite/g++.dg/coroutines/pr110171-1.C
  2d41ae2373f79574814b547e58adf65b  gcc/testsuite/g++.dg/coroutines/pr110171.C
*************** b75b654187426934820f1e2a8a63aaad  gcc/te
*** 21827,21832 ****
--- 21843,21849 ----
  99fb6f2e5c0e7bc8a3c78cbf8090a91f  gcc/testsuite/g++.dg/coroutines/pr116506.C
  59d8e6cfa9a450642b4a378751f44e8a  gcc/testsuite/g++.dg/coroutines/pr116793-1.C
  16df01e113e50e8969f23cb32c1ab8fd  gcc/testsuite/g++.dg/coroutines/pr116880.C
+ 639bf3d722d542a1aab7bcbf3114716a  gcc/testsuite/g++.dg/coroutines/pr120453.C
  cbb42d13b1660a8eb1d40a3d88308140  gcc/testsuite/g++.dg/coroutines/pr93458-1-missing-traits.C
  d9151fc224e4913ed7ffacd748769917  gcc/testsuite/g++.dg/coroutines/pr93458-2-bad-traits.C
  e9b715cb41c54f5b179b4725b788e338  gcc/testsuite/g++.dg/coroutines/pr93458-3-missing-handle.C
*************** f4382f5ede902e4b05c952d6a46baa75  gcc/te
*** 26111,26116 ****
--- 26128,26134 ----
  f1fc38f24c3138cf2bcf0c1361f8b2c4  gcc/testsuite/g++.dg/cpp1z/constexpr-lambda26.C
  74b8e6f3e9a38c9d67cce0f399c25360  gcc/testsuite/g++.dg/cpp1z/constexpr-lambda27.C
  c41894a4bd54230ff06cc2b36b53cc79  gcc/testsuite/g++.dg/cpp1z/constexpr-lambda28.C
+ e85518e71d7fef041096cc39fc4a2ef8  gcc/testsuite/g++.dg/cpp1z/constexpr-lambda29.C
  7a1275d47f91f21fc9a37f0e47b89dad  gcc/testsuite/g++.dg/cpp1z/constexpr-lambda3.C
  5267d9825ab86007a9529cb6214eae5c  gcc/testsuite/g++.dg/cpp1z/constexpr-lambda4.C
  7b6d8d9af2ed24c66e7de295c6bd2cf9  gcc/testsuite/g++.dg/cpp1z/constexpr-lambda5.C
*************** d794673e83c406364ada43bb3424172f  gcc/te
*** 26587,26592 ****
--- 26605,26612 ----
  d74bbc201fde13d804d767363c281130  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda13.C
  ad90458ad42ff08d4a1c948d0770dd89  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda14.C
  51978f30a781d2e3a3434b8d371737b6  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda15.C
+ 4e4eee2cc98e967eb67c2b28b145f331  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda16.C
+ fe56bf124d429ccaa887937cdd60d625  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda17.C
  87abca8eb660254fbf201e771eef3751  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda2.C
  e8adbb443f8b231b244ffbcd64ee7da2  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda3.C
  0a50eb80a181d4196ff68849d37d2615  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda4.C
*************** c61f89754bf19eb066c90223050eb1d6  gcc/te
*** 26979,26984 ****
--- 26999,27005 ----
  4ca9ff6f446b7952827edf777db0b0ea  gcc/testsuite/g++.dg/cpp2a/concepts-lambda21.C
  f553dcaedc09d2c9050b889d62bcff97  gcc/testsuite/g++.dg/cpp2a/concepts-lambda22.C
  a33c273c880831d4ae8354f3eae13e25  gcc/testsuite/g++.dg/cpp2a/concepts-lambda23.C
+ c5f62ec8bee71a828d47886f4bfb04dc  gcc/testsuite/g++.dg/cpp2a/concepts-lambda24.C
  c1dc95530d3c5579fce346628c40061a  gcc/testsuite/g++.dg/cpp2a/concepts-lambda3.C
  6f185f0a7016ab67c7f0d4ffa7012182  gcc/testsuite/g++.dg/cpp2a/concepts-lambda4.C
  86976d8466300862e381a2182c187b35  gcc/testsuite/g++.dg/cpp2a/concepts-lambda5.C
*************** eaa93030439fd11d2f5366a3e4eafa8a  gcc/te
*** 28330,28336 ****
  1f68f132aa0d07e47ed9cf254749fe74  gcc/testsuite/g++.dg/diagnostic/array-init1.C
  f468ff0e470b813ba90ab6f552dfbb51  gcc/testsuite/g++.dg/diagnostic/auto-storage-1.C
  d6cd69df86e5ef21af4548c3401c93ba  gcc/testsuite/g++.dg/diagnostic/auto1.C
! dbe7540d52d144a747767d3100d8dffc  gcc/testsuite/g++.dg/diagnostic/bad-binary-ops-highlight-colors.C
  a0199877628a1e748c0f7d11f73710a8  gcc/testsuite/g++.dg/diagnostic/bad-binary-ops-no-highlight-colors.C
  2782c3a1ba0fe921f95b73de11d6bf55  gcc/testsuite/g++.dg/diagnostic/bad-binary-ops.C
  a91bf5789095e7895cce3a68b00c225e  gcc/testsuite/g++.dg/diagnostic/bad-binary-ops2.C
--- 28351,28357 ----
  1f68f132aa0d07e47ed9cf254749fe74  gcc/testsuite/g++.dg/diagnostic/array-init1.C
  f468ff0e470b813ba90ab6f552dfbb51  gcc/testsuite/g++.dg/diagnostic/auto-storage-1.C
  d6cd69df86e5ef21af4548c3401c93ba  gcc/testsuite/g++.dg/diagnostic/auto1.C
! 2503e842dfd3dd8566a7b35b7b7a7b79  gcc/testsuite/g++.dg/diagnostic/bad-binary-ops-highlight-colors.C
  a0199877628a1e748c0f7d11f73710a8  gcc/testsuite/g++.dg/diagnostic/bad-binary-ops-no-highlight-colors.C
  2782c3a1ba0fe921f95b73de11d6bf55  gcc/testsuite/g++.dg/diagnostic/bad-binary-ops.C
  a91bf5789095e7895cce3a68b00c225e  gcc/testsuite/g++.dg/diagnostic/bad-binary-ops2.C
*************** ad85d4d35e993bf787607ebe9b7902e3  gcc/te
*** 28372,28378 ****
  6d7540ee092b9f6493a209b3d3f89d93  gcc/testsuite/g++.dg/diagnostic/integral-array-size-1.C
  a435c50bbe06411da7ec50c48b8deb26  gcc/testsuite/g++.dg/diagnostic/lang-dump-1.C
  37b0194164dc105d145926e992c5fffa  gcc/testsuite/g++.dg/diagnostic/local1.C
! 063eace18fe92c580e56e42dca4b02d3  gcc/testsuite/g++.dg/diagnostic/long-short-colorization.C
  3cb4de68f3722265cb8bb8c3ec74b8c2  gcc/testsuite/g++.dg/diagnostic/long-short.C
  5e5dde276892455bc269dfa7e14e456a  gcc/testsuite/g++.dg/diagnostic/main1.C
  17ad778ff7ed164cbd2116ff51b37594  gcc/testsuite/g++.dg/diagnostic/main2.C
--- 28393,28399 ----
  6d7540ee092b9f6493a209b3d3f89d93  gcc/testsuite/g++.dg/diagnostic/integral-array-size-1.C
  a435c50bbe06411da7ec50c48b8deb26  gcc/testsuite/g++.dg/diagnostic/lang-dump-1.C
  37b0194164dc105d145926e992c5fffa  gcc/testsuite/g++.dg/diagnostic/local1.C
! 763b42f375838618bc5f0bbbb49cf539  gcc/testsuite/g++.dg/diagnostic/long-short-colorization.C
  3cb4de68f3722265cb8bb8c3ec74b8c2  gcc/testsuite/g++.dg/diagnostic/long-short.C
  5e5dde276892455bc269dfa7e14e456a  gcc/testsuite/g++.dg/diagnostic/main1.C
  17ad778ff7ed164cbd2116ff51b37594  gcc/testsuite/g++.dg/diagnostic/main2.C
*************** d84b4e6ad32eec6b47fea11f39244dd7  gcc/te
*** 29376,29381 ****
--- 29397,29403 ----
  986a829ca110a6da40ad4e40333b4eb5  gcc/testsuite/g++.dg/ext/is_convertible5.C
  d74301fd930f4a488c9e941cdd242900  gcc/testsuite/g++.dg/ext/is_convertible6.C
  ebb1df191bcea60ed6342dad182b8901  gcc/testsuite/g++.dg/ext/is_deducible1.C
+ 94a516051a47d1b7e866ec47efa5de01  gcc/testsuite/g++.dg/ext/is_destructible1.C
  9da1ecf7ca599ccc9c1677e62cfc809f  gcc/testsuite/g++.dg/ext/is_empty.C
  51590a59aaf8715b9fe4a7ae06414cb8  gcc/testsuite/g++.dg/ext/is_empty2.C
  904cd436fd5b5ebe1349610a0aa7c2da  gcc/testsuite/g++.dg/ext/is_enum.C
*************** fe6047f5ca7e2eac34792a3acc1193c2  gcc/te
*** 29997,30002 ****
--- 30019,30027 ----
  73dc4c4897395dc7c307860e0c371fe1  gcc/testsuite/g++.dg/gomp/critical-1.C
  67c49c3ef2f12e8a48820530d769fbd8  gcc/testsuite/g++.dg/gomp/critical-2.C
  d51c209a538c8e7658a85ca99d8eb17b  gcc/testsuite/g++.dg/gomp/critical-3.C
+ f1e5ae067b71374e5049e8732e446e72  gcc/testsuite/g++.dg/gomp/declare-mapper-1.C
+ 84e11a9dba783ae27aefc99c4aba6f86  gcc/testsuite/g++.dg/gomp/declare-mapper-2.C
+ ba4a8a9f66e6db7ad17cae2882bb6ca2  gcc/testsuite/g++.dg/gomp/declare-mapper-3.C
  c33309167faeafe5c8b09666ffbcb15d  gcc/testsuite/g++.dg/gomp/declare-simd-1.C
  6363ff64193eeb8db033202fd0e140f2  gcc/testsuite/g++.dg/gomp/declare-simd-2.C
  28a86261a1a2a55a8d3a9adc105c5e51  gcc/testsuite/g++.dg/gomp/declare-simd-3.C
*************** ace106d74abcf8296a991293066c7c51  gcc/te
*** 30289,30294 ****
--- 30314,30320 ----
  d5056d7847f2753ff16e19275fe96735  gcc/testsuite/g++.dg/gomp/target-1.C
  8c284b2db0213aba2b9a945275ec6d74  gcc/testsuite/g++.dg/gomp/target-2.C
  e9b0e4dd4a2b6b1859c38faf273fc7ed  gcc/testsuite/g++.dg/gomp/target-3.C
+ 74316308fd39fecd67837ae2b456f6ce  gcc/testsuite/g++.dg/gomp/target-4.C
  1b305722cc5c4a70d422333277766f99  gcc/testsuite/g++.dg/gomp/target-lambda-2.C
  cb5219ee6745fc371bfbb0e484f3205e  gcc/testsuite/g++.dg/gomp/target-simd-clone-1.C
  e033ffcb572e3c374bf58a0eebd43584  gcc/testsuite/g++.dg/gomp/target-simd-clone-2.C
*************** ad9ef329572dab16f2d3d5613538cd3f  gcc/te
*** 32639,32644 ****
--- 32665,32676 ----
  95ab3577dee99f3d59838a96f1cbf4fc  gcc/testsuite/g++.dg/modules/mod-tpl-2_b.C
  01ccb2b6298aefa6bdbf400348e85b26  gcc/testsuite/g++.dg/modules/modules.exp
  f49c118362c9a45e801940d0725a767d  gcc/testsuite/g++.dg/modules/mutual-friend.ii
+ 522ea2d0697f7dd4d211f07fa012628f  gcc/testsuite/g++.dg/modules/namespace-10_a.C
+ c4e2bef9f271df6507d07f9534e10fc1  gcc/testsuite/g++.dg/modules/namespace-10_b.C
+ acc44b255da381d3379b82b7a2be08a4  gcc/testsuite/g++.dg/modules/namespace-10_c.C
+ 522ea2d0697f7dd4d211f07fa012628f  gcc/testsuite/g++.dg/modules/namespace-11_a.C
+ 8bd7c9bc6bc6420a27fcfa01da459409  gcc/testsuite/g++.dg/modules/namespace-11_b.C
+ 1a4722733f0faef247f75ca253527150  gcc/testsuite/g++.dg/modules/namespace-11_c.C
  ebce3d8effe71472ad6b1910c0b435f6  gcc/testsuite/g++.dg/modules/namespace-1_a.C
  c34c17e18223f5c84607e68a5f2dd81a  gcc/testsuite/g++.dg/modules/namespace-1_b.C
  9fc8de4ea84d52d9c619890b0581ed9e  gcc/testsuite/g++.dg/modules/namespace-1_c.C
*************** c7ee628b9bb8433e87d87a5ed98d0da6  gcc/te
*** 32656,32661 ****
--- 32688,32697 ----
  f11bca3804e59924f208cd381adb0539  gcc/testsuite/g++.dg/modules/namespace-6_b.C
  a23c2aab0228579e73d832a7bd5fe6fb  gcc/testsuite/g++.dg/modules/namespace-7_a.C
  a2648578444af56ac1e9d70da075b223  gcc/testsuite/g++.dg/modules/namespace-7_b.C
+ 40a947a17164c4f66d9cb7f3fb8121ef  gcc/testsuite/g++.dg/modules/namespace-8_a.C
+ 3807710fb21e17df0a770ff60750e70d  gcc/testsuite/g++.dg/modules/namespace-8_b.C
+ 1c90ba7b966bbeeaad94e2a5fe23742a  gcc/testsuite/g++.dg/modules/namespace-9_a.C
+ 696f96d984fd8e7028cb1ee43b30f765  gcc/testsuite/g++.dg/modules/namespace-9_b.C
  df4019992d5e5a1273b138d6bd686af4  gcc/testsuite/g++.dg/modules/nest-1_a.C
  4473568de7cd981f9865964a715d52c9  gcc/testsuite/g++.dg/modules/nest-1_b.C
  30dd50d7bea9010cc0f08e61a8de0daa  gcc/testsuite/g++.dg/modules/nest-1_c.C
*************** bb9719af4ef365b9625ed93e9794b8b2  gcc/te
*** 35132,35138 ****
  436d3d1e052b227d2661a53bc1d71e69  gcc/testsuite/g++.dg/plugin/self-assign-test-2.C
  e051d5cb1d92744fe18b74552249a54e  gcc/testsuite/g++.dg/plugin/self-assign-test-3.C
  5f9b6973b5f55304febb17e03d56165d  gcc/testsuite/g++.dg/plugin/selfassign.cc
! ec7d7e2e0cb8ea0be53af452dbc8214c  gcc/testsuite/g++.dg/plugin/show-template-tree-color-labels.C
  669d6447cc7cb76ea3787b8008016b3f  gcc/testsuite/g++.dg/plugin/show-template-tree-color-no-elide-type.C
  6a6dbcbab6d373e63c771d4d3f143ebb  gcc/testsuite/g++.dg/plugin/show-template-tree-color-no-highlight-colors.C
  946f03549b5d21aa38c5f97b1f198eac  gcc/testsuite/g++.dg/plugin/show-template-tree-color.C
--- 35168,35174 ----
  436d3d1e052b227d2661a53bc1d71e69  gcc/testsuite/g++.dg/plugin/self-assign-test-2.C
  e051d5cb1d92744fe18b74552249a54e  gcc/testsuite/g++.dg/plugin/self-assign-test-3.C
  5f9b6973b5f55304febb17e03d56165d  gcc/testsuite/g++.dg/plugin/selfassign.cc
! efc88a1fcd8ac51821ec0b7d0de5ad56  gcc/testsuite/g++.dg/plugin/show-template-tree-color-labels.C
  669d6447cc7cb76ea3787b8008016b3f  gcc/testsuite/g++.dg/plugin/show-template-tree-color-no-elide-type.C
  6a6dbcbab6d373e63c771d4d3f143ebb  gcc/testsuite/g++.dg/plugin/show-template-tree-color-no-highlight-colors.C
  946f03549b5d21aa38c5f97b1f198eac  gcc/testsuite/g++.dg/plugin/show-template-tree-color.C
*************** a96998418d91d4b5dc3f731cea3de4a2  gcc/te
*** 37985,37990 ****
--- 38021,38028 ----
  1ed2f7f5509c5567092c5b86b727d17e  gcc/testsuite/g++.dg/tree-ssa/pr115275.C
  1865c2c1e91d7842887b0fbc0a5a8cbc  gcc/testsuite/g++.dg/tree-ssa/pr116868.C
  0c911fc6a4e7b6d42fea1d5986454ce2  gcc/testsuite/g++.dg/tree-ssa/pr117123.C
+ 82fde88840bd9ced80ca703c33fb8d73  gcc/testsuite/g++.dg/tree-ssa/pr117965-1.C
+ 201851a6bde948fe39368db60e2fedc7  gcc/testsuite/g++.dg/tree-ssa/pr117965-2.C
  284302237efd60e1d517c0925cad7644  gcc/testsuite/g++.dg/tree-ssa/pr118924.C
  ed3340a40acd33f762437309c5501969  gcc/testsuite/g++.dg/tree-ssa/pr119903-1.C
  482a64ed60783060cd1097d55e09aa68  gcc/testsuite/g++.dg/tree-ssa/pr13146.C
*************** f23b91fd4df934b4b8cb89c14e082b05  gcc/te
*** 42961,42966 ****
--- 42999,43009 ----
  0ec10c6dd8c46db7332b15201fba84ba  gcc/testsuite/g++.target/i386/m128-check.h
  a1f73425439294ed2e5c470eb6a67f31  gcc/testsuite/g++.target/i386/m256-check.h
  ae8574e23abf3d9af1504b3bec6f9ec6  gcc/testsuite/g++.target/i386/mangling-alias1.C
+ 4e700e994b817984ed104fabbd34d2c4  gcc/testsuite/g++.target/i386/mv-symbols1.C
+ c0b24207688618b815731387510d9bed  gcc/testsuite/g++.target/i386/mv-symbols2.C
+ 9d62ccf3abbeb46b904b5883b04e23eb  gcc/testsuite/g++.target/i386/mv-symbols3.C
+ 033c2350ee83928b63a175abd3ca193c  gcc/testsuite/g++.target/i386/mv-symbols4.C
+ 67a61614c9369134cad01c88a6a753ea  gcc/testsuite/g++.target/i386/mv-symbols5.C
  d9283642c1e353810c049d439e8f3c60  gcc/testsuite/g++.target/i386/mv1.C
  c996cc7c2a4c7d02d3a6fcb89d3bc8db  gcc/testsuite/g++.target/i386/mv10.C
  5dc72e87fb3dc9a6c73b652710d87007  gcc/testsuite/g++.target/i386/mv11.C
*************** dc39143004995c38b524d1b929c9c96c  gcc/te
*** 42995,43000 ****
--- 43038,43047 ----
  3b58c2bbe7b4b5baffcd354353b6daef  gcc/testsuite/g++.target/i386/mv7.C
  c2d5d87b3488ab338dcccb9091181331  gcc/testsuite/g++.target/i386/mv8.C
  95cfb2367a4c0ee22bbee8a3f260ef2f  gcc/testsuite/g++.target/i386/mv9.C
+ 8d7c7951a883b42e55801c2dd20b6d78  gcc/testsuite/g++.target/i386/mvc-symbols1.C
+ 27be0855705ca551409efda354c7792e  gcc/testsuite/g++.target/i386/mvc-symbols2.C
+ 26179b0d8e69cab406e6430a59097190  gcc/testsuite/g++.target/i386/mvc-symbols3.C
+ e64a0b5e7c6fdf60a7781eda297065c2  gcc/testsuite/g++.target/i386/mvc-symbols4.C
  563c9aefd1fd3be06389622e7e8a4a9e  gcc/testsuite/g++.target/i386/mvc1.C
  d6311a7425b0ffbce5c97b4589a89b54  gcc/testsuite/g++.target/i386/mvc2.C
  3d6e618a583f6dcb9bd35e6148518988  gcc/testsuite/g++.target/i386/mvc3.C
*************** ac49cc2a622b01c5caa9253f83c5bdee  gcc/te
*** 43210,43215 ****
--- 43257,43266 ----
  3ab7d6c274311edec73365c855c97595  gcc/testsuite/g++.target/powerpc/altivec-types-4.C
  1dcc294b786a601d5c1b5d4178563803  gcc/testsuite/g++.target/powerpc/const2.C
  bd1c35be302338df14b1aa330813797d  gcc/testsuite/g++.target/powerpc/darwin-minversion-1.C
+ f5b7ccbd3f678bc70227be8126507efb  gcc/testsuite/g++.target/powerpc/mvc-symbols1.C
+ 183dc83aec115f5380cf8f58c39d6ba6  gcc/testsuite/g++.target/powerpc/mvc-symbols2.C
+ 27ab04c73a66dce635c16a5d1371e7fc  gcc/testsuite/g++.target/powerpc/mvc-symbols3.C
+ 76b63716511a7a9a89213699818696da  gcc/testsuite/g++.target/powerpc/mvc-symbols4.C
  d424a431fe3d449ee6974b8ea63bbdab  gcc/testsuite/g++.target/powerpc/powerpc.exp
  bafc15005abdfe9131f6074efde175eb  gcc/testsuite/g++.target/powerpc/ppc64-sighandle-cr.C
  e20e538d4bb1e80f32276f6a48219247  gcc/testsuite/g++.target/powerpc/pr101168.C
*************** a72aed4598b891bea75a07eca33210c9  gcc/te
*** 49073,49079 ****
  f55a1275009ff460210d4b9c67a189a3  gcc/testsuite/gcc.dg/autopar/uns-outer-4.c
  0e589f3e4ce3143c9d88fb74f872e3fe  gcc/testsuite/gcc.dg/autopar/uns-outer-5.c
  f5e8e01c793a266fa480ec93df8de475  gcc/testsuite/gcc.dg/autopar/uns-outer-6.c
! 9a764ae28675016de8dd9f39b7d74baf  gcc/testsuite/gcc.dg/bad-binary-ops-highlight-colors.c
  4e6b4fa1db2abdf58b19d9c6c2ea54e3  gcc/testsuite/gcc.dg/bad-binary-ops-no-highlight-colors.c
  66a2373ba20bd9b0ef16c05942372b8b  gcc/testsuite/gcc.dg/bad-binary-ops.c
  c3ec1cf03ff502f2425714ca80d1c941  gcc/testsuite/gcc.dg/bad-dereference.c
--- 49124,49130 ----
  f55a1275009ff460210d4b9c67a189a3  gcc/testsuite/gcc.dg/autopar/uns-outer-4.c
  0e589f3e4ce3143c9d88fb74f872e3fe  gcc/testsuite/gcc.dg/autopar/uns-outer-5.c
  f5e8e01c793a266fa480ec93df8de475  gcc/testsuite/gcc.dg/autopar/uns-outer-6.c
! 6c8363518f7f811f9f3d3ec42376d1f1  gcc/testsuite/gcc.dg/bad-binary-ops-highlight-colors.c
  4e6b4fa1db2abdf58b19d9c6c2ea54e3  gcc/testsuite/gcc.dg/bad-binary-ops-no-highlight-colors.c
  66a2373ba20bd9b0ef16c05942372b8b  gcc/testsuite/gcc.dg/bad-binary-ops.c
  c3ec1cf03ff502f2425714ca80d1c941  gcc/testsuite/gcc.dg/bad-dereference.c
*************** e781844c1655d36c9b6e04d59aad8996  gcc/te
*** 50485,50490 ****
--- 50536,50552 ----
  79de76f1d9fe6810bc65fa1f39adc1dc  gcc/testsuite/gcc.dg/conv-1.c
  3a476a2d0c391587638c234c7b082c5a  gcc/testsuite/gcc.dg/conv-2.c
  89b18c0becd2933f025acc401a0aeaf8  gcc/testsuite/gcc.dg/conv-3.c
+ c797c0159985b6cfaaf4ab160451c3a4  gcc/testsuite/gcc.dg/countof-compat.c
+ 0f09a247339fa2424e036901f8dcafde  gcc/testsuite/gcc.dg/countof-compile.c
+ 608b1948fb6a190311fada69744220cd  gcc/testsuite/gcc.dg/countof-no-compat.c
+ 7eafaa58e5bb4cc4c83cb69e9e31f04c  gcc/testsuite/gcc.dg/countof-pedantic-errors.c
+ 81a7004a604039f5fe3afa412103c8ef  gcc/testsuite/gcc.dg/countof-pedantic.c
+ 3c990b81bd268128dda0c1c13b15d2b6  gcc/testsuite/gcc.dg/countof-stdcountof.c
+ 473d7d2d415511d975bd4b75ac461589  gcc/testsuite/gcc.dg/countof-vla.c
+ 95d803733514c62f5030f851cf4d6576  gcc/testsuite/gcc.dg/countof-vmt.c
+ d3099a3667b8afecd160ce8735eef28f  gcc/testsuite/gcc.dg/countof-zero-compile.c
+ 21bc98d5821bf6957c3d97d727cfc3a1  gcc/testsuite/gcc.dg/countof-zero.c
+ 19e2ff748d93d4aa52715d07da439c17  gcc/testsuite/gcc.dg/countof.c
  6bc56500657f8c3b71b20af4c69e967f  gcc/testsuite/gcc.dg/cpp/#cmdlne-M-2.h
  efe7e7710c90559c2ce6e719d57e85cf  gcc/testsuite/gcc.dg/cpp/19921210-1.c
  fd87d37c0d8c780e43c22463e7f47466  gcc/testsuite/gcc.dg/cpp/19930510-1.c
*************** d48360a30dc24fbd67e388a9848b02d3  gcc/te
*** 52180,52191 ****
  1cbc4a0f562f400d1b4cd399fccdaed8  gcc/testsuite/gcc.dg/format/c99-strftime-2.c
  4a0af73997f2fabfe3b83d5cbdd917f5  gcc/testsuite/gcc.dg/format/cast-1.c
  2bbc64aef0d11089fcc505ed72a3896e  gcc/testsuite/gcc.dg/format/cmn-err-1.c
! 36614cc57d59aebe75e577cdc78e6b1d  gcc/testsuite/gcc.dg/format/colors.c
  6211f331e7746a849fa866af08fc8795  gcc/testsuite/gcc.dg/format/dfp-printf-1.c
  6af7fd86fadcfa6889af48973673b3e8  gcc/testsuite/gcc.dg/format/dfp-scanf-1.c
  597c2cef1b33bb71739d311ee56278e3  gcc/testsuite/gcc.dg/format/diag-1.c
  76b3d68f4d248a85562e894eb00f75c7  gcc/testsuite/gcc.dg/format/diag-2.c
! 4b091c1e85a61834e81c1e1af1595a86  gcc/testsuite/gcc.dg/format/diagnostic-ranges.c
  859d88caa1eeeb23ca9b76526b3a4f3e  gcc/testsuite/gcc.dg/format/errmk-1.c
  07bb1882393eddf8452ebd19e6a983d2  gcc/testsuite/gcc.dg/format/ext-1.c
  3577888fe5114465e0ca15f283d3e87f  gcc/testsuite/gcc.dg/format/ext-10.c
--- 52242,52254 ----
  1cbc4a0f562f400d1b4cd399fccdaed8  gcc/testsuite/gcc.dg/format/c99-strftime-2.c
  4a0af73997f2fabfe3b83d5cbdd917f5  gcc/testsuite/gcc.dg/format/cast-1.c
  2bbc64aef0d11089fcc505ed72a3896e  gcc/testsuite/gcc.dg/format/cmn-err-1.c
! d0cadc3c4a24250334c4419a1d8bb229  gcc/testsuite/gcc.dg/format/colors.c
  6211f331e7746a849fa866af08fc8795  gcc/testsuite/gcc.dg/format/dfp-printf-1.c
  6af7fd86fadcfa6889af48973673b3e8  gcc/testsuite/gcc.dg/format/dfp-scanf-1.c
  597c2cef1b33bb71739d311ee56278e3  gcc/testsuite/gcc.dg/format/diag-1.c
  76b3d68f4d248a85562e894eb00f75c7  gcc/testsuite/gcc.dg/format/diag-2.c
! 05d13d6010a50527d41c5437992de40c  gcc/testsuite/gcc.dg/format/diagnostic-ranges-html.py
! 014b97f7e69a48e2a765439bbd73799a  gcc/testsuite/gcc.dg/format/diagnostic-ranges.c
  859d88caa1eeeb23ca9b76526b3a4f3e  gcc/testsuite/gcc.dg/format/errmk-1.c
  07bb1882393eddf8452ebd19e6a983d2  gcc/testsuite/gcc.dg/format/ext-1.c
  3577888fe5114465e0ca15f283d3e87f  gcc/testsuite/gcc.dg/format/ext-10.c
*************** c16263fe97e9a67347f142108b0ef45c  gcc/te
*** 52481,52486 ****
--- 52544,52550 ----
  8274444b50d1968c43296a7054673b34  gcc/testsuite/gcc.dg/gnu23-tag-composite-3.c
  62aa66dd9de4209944d261bb9c728665  gcc/testsuite/gcc.dg/gnu23-tag-composite-4.c
  55eb38c543312d9a8ec407d5dc57ab64  gcc/testsuite/gcc.dg/gnu23-tag-composite-5.c
+ 887f4e5101f5e72489cd28cddbde9ca9  gcc/testsuite/gcc.dg/gnu23-tag-composite-6.c
  c85fa6543a15d51c958fa06a431c31a0  gcc/testsuite/gcc.dg/gnu23-tag-enum-1.c
  91a4022639b4da631739955963491d18  gcc/testsuite/gcc.dg/gnu23-typeof-1.c
  f4cdcfdd20fcbe93fb5c641aa6f0e1e7  gcc/testsuite/gcc.dg/gnu23-utf8char-1.c
*************** a711c9451bdf512fdc17116c6ecdc398  gcc/te
*** 52623,52628 ****
--- 52687,52695 ----
  1a2c5c09aa0be5fb46a4f5f23aa6e736  gcc/testsuite/gcc.dg/gomp/critical-2.c
  03bbd187d9153b4add585d80ff21398a  gcc/testsuite/gcc.dg/gomp/critical-3.c
  5ed058cff064ccd6bdbb074b4f718aef  gcc/testsuite/gcc.dg/gomp/critical-4.c
+ 7b2543468f17a89ea0ff9cf4f888aa5f  gcc/testsuite/gcc.dg/gomp/declare-mapper-10.c
+ f8f36c2928f3dc4295a92789d3d12a13  gcc/testsuite/gcc.dg/gomp/declare-mapper-11.c
+ 352a35f47290ab485f720463b95f6818  gcc/testsuite/gcc.dg/gomp/declare-mapper-13.c
  9855504c29153e58227e4911a1d26e10  gcc/testsuite/gcc.dg/gomp/declare-simd-1.c
  dbf4fad9a516a5e21a83632a1bc47d48  gcc/testsuite/gcc.dg/gomp/declare-simd-2.c
  eaf20ce005642d7f04c4f181f7d0e142  gcc/testsuite/gcc.dg/gomp/declare-simd-3.c
*************** b67cfbf3900e01ed3c366e88b3a04171  gcc/te
*** 52849,52855 ****
  cd8b1db623a07d865bb9a34cd8affe37  gcc/testsuite/gcc.dg/gomp/tls-2.c
  f0694a8a27ae0ef269767479c6b54201  gcc/testsuite/gcc.dg/gomp/udr-1.c
  84f6fddc1b541b53471d9bd5725c75db  gcc/testsuite/gcc.dg/gomp/udr-2.c
! ce7f414e0b315f56a4c5e6b6f61c2ddf  gcc/testsuite/gcc.dg/gomp/udr-3.c
  79c19553e59dc76750e93a7bd9060361  gcc/testsuite/gcc.dg/gomp/udr-4.c
  cc2e57695051196863b0f1a101527357  gcc/testsuite/gcc.dg/gomp/uninit-1.c
  3900107f28986c0a648cdde2b189d84f  gcc/testsuite/gcc.dg/gomp/vla-1.c
--- 52916,52922 ----
  cd8b1db623a07d865bb9a34cd8affe37  gcc/testsuite/gcc.dg/gomp/tls-2.c
  f0694a8a27ae0ef269767479c6b54201  gcc/testsuite/gcc.dg/gomp/udr-1.c
  84f6fddc1b541b53471d9bd5725c75db  gcc/testsuite/gcc.dg/gomp/udr-2.c
! 5aaa2dbf78fff9702e257e3058fc3441  gcc/testsuite/gcc.dg/gomp/udr-3.c
  79c19553e59dc76750e93a7bd9060361  gcc/testsuite/gcc.dg/gomp/udr-4.c
  cc2e57695051196863b0f1a101527357  gcc/testsuite/gcc.dg/gomp/uninit-1.c
  3900107f28986c0a648cdde2b189d84f  gcc/testsuite/gcc.dg/gomp/vla-1.c
*************** dc12526b2575b25bbb0263164484aeb3  gcc/te
*** 53327,53334 ****
  0df11bb9dd20d8cf406324e2baa18d83  gcc/testsuite/gcc.dg/hoist-register-pressure-2.c
  dd0c3d86be7753351dad89d50055a01e  gcc/testsuite/gcc.dg/hoist-register-pressure-3.c
  1010470d2b35619d2f4a98c1e6fa225e  gcc/testsuite/gcc.dg/html-output/html-output.exp
! b8ec5fe4c9b79ab341b7f8254518341f  gcc/testsuite/gcc.dg/html-output/missing-semicolon.c
! 391dd897de95521d86a0046e1c4468fd  gcc/testsuite/gcc.dg/html-output/missing-semicolon.py
  87ba2fabf5289d6525439ba48a5c27f8  gcc/testsuite/gcc.dg/hwasan/hwasan.exp
  f20946bfbddc67e74cf619bd02e31549  gcc/testsuite/gcc.dg/hwasan/nested-functions-0.c
  36c11146134a4d86c84c359d41e52a7c  gcc/testsuite/gcc.dg/hwasan/nested-functions-1.c
--- 53394,53401 ----
  0df11bb9dd20d8cf406324e2baa18d83  gcc/testsuite/gcc.dg/hoist-register-pressure-2.c
  dd0c3d86be7753351dad89d50055a01e  gcc/testsuite/gcc.dg/hoist-register-pressure-3.c
  1010470d2b35619d2f4a98c1e6fa225e  gcc/testsuite/gcc.dg/html-output/html-output.exp
! a018345881bf4270a8876a6eeba3dbd1  gcc/testsuite/gcc.dg/html-output/missing-semicolon.c
! e6ff5beefb29ac113aac5326a601cafb  gcc/testsuite/gcc.dg/html-output/missing-semicolon.py
  87ba2fabf5289d6525439ba48a5c27f8  gcc/testsuite/gcc.dg/hwasan/hwasan.exp
  f20946bfbddc67e74cf619bd02e31549  gcc/testsuite/gcc.dg/hwasan/nested-functions-0.c
  36c11146134a4d86c84c359d41e52a7c  gcc/testsuite/gcc.dg/hwasan/nested-functions-1.c
*************** d8f0256cde05093b9738e8287c58d5c3  gcc/te
*** 53663,53668 ****
--- 53730,53736 ----
  e39432b4ae7797e55b13f6d2fd29a4a6  gcc/testsuite/gcc.dg/ipa/pr119852.c
  fc7c9c751d59b444d0ab30c4d9029491  gcc/testsuite/gcc.dg/ipa/pr120044-1.c
  538e5a7542c72b7ea4e4375cbebde001  gcc/testsuite/gcc.dg/ipa/pr120044-2.c
+ 3c119ebca762218e529eb71f0df740de  gcc/testsuite/gcc.dg/ipa/pr120295.c
  c8295ff7fd7e271d17e7609620f5dfcb  gcc/testsuite/gcc.dg/ipa/pr42706.c
  e4887053c792f4f78b03804c148839ce  gcc/testsuite/gcc.dg/ipa/pr45644.c
  6e1b4f2c5d0c0d768778da8e3b7df828  gcc/testsuite/gcc.dg/ipa/pr48195.c
*************** ab9b438d79da41ae2faa25073b1f68ff  gcc/te
*** 54675,54682 ****
  49685be9087563d411cc61352a593d84  gcc/testsuite/gcc.dg/plugin/diagnostic-test-inlining-2.c
  48a41768247d6b150673cba3b15e815e  gcc/testsuite/gcc.dg/plugin/diagnostic-test-inlining-3.c
  c5d2a11e1172f48545387ed92bd56a11  gcc/testsuite/gcc.dg/plugin/diagnostic-test-inlining-4.c
! 2f6d3531c8a7ff10b2169db12c85ac09  gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-html.c
! 8be2430788dcc1a6ae0a4cc7c30c5873  gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-html.py
  6efed2ab62fc17f3db08dc04e528fe7a  gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-sarif.c
  ee3ed621610bc5bdf108f395f4789d4e  gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-sarif.py
  ce81f72fcd363c22f9fce9cd0b0c76b1  gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata.c
--- 54743,54750 ----
  49685be9087563d411cc61352a593d84  gcc/testsuite/gcc.dg/plugin/diagnostic-test-inlining-2.c
  48a41768247d6b150673cba3b15e815e  gcc/testsuite/gcc.dg/plugin/diagnostic-test-inlining-3.c
  c5d2a11e1172f48545387ed92bd56a11  gcc/testsuite/gcc.dg/plugin/diagnostic-test-inlining-4.c
! 2c9483e9d5c0705e4216466c0d4cb610  gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-html.c
! 9916139bbb2f3261a2a96711a6570353  gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-html.py
  6efed2ab62fc17f3db08dc04e528fe7a  gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-sarif.c
  ee3ed621610bc5bdf108f395f4789d4e  gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-sarif.py
  ce81f72fcd363c22f9fce9cd0b0c76b1  gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata.c
*************** bbfef80ea240ea4caf713082caf0f5d2  gcc/te
*** 54687,54696 ****
  df5927e5a5b0b123f415b49583084acd  gcc/testsuite/gcc.dg/plugin/diagnostic-test-nesting-text-indented.c
  a7db561cc35fce636b1dca4e7394ba77  gcc/testsuite/gcc.dg/plugin/diagnostic-test-nesting-text-plain.c
  a6a63e4d673f32d534d3afc18a7f8218  gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-1.c
! fb9717e6ab3262077d1f36d8db47b895  gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.c
! a404eebba6b7914db64c997a0b4b5ffe  gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.py
  5f17663596e733b7a39a6b737dc9ea56  gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-3.c
! 9c2ec1cc8d8b83dbb2bda70a9f54dcf4  gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-4.c
  d69b80e0a539be7739a33736ee0e8aaf  gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-5.c
  a58becab25d695c02613dbc4348f124b  gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-multithreaded-inline-events.c
  3c5192534d44afd6ef8195407225eeb4  gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-multithreaded-sarif.c
--- 54755,54765 ----
  df5927e5a5b0b123f415b49583084acd  gcc/testsuite/gcc.dg/plugin/diagnostic-test-nesting-text-indented.c
  a7db561cc35fce636b1dca4e7394ba77  gcc/testsuite/gcc.dg/plugin/diagnostic-test-nesting-text-plain.c
  a6a63e4d673f32d534d3afc18a7f8218  gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-1.c
! aa01caff792d42166912b838479f96af  gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.c
! 722d8a07900a13a760a0fde5657152cd  gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.py
  5f17663596e733b7a39a6b737dc9ea56  gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-3.c
! 9c0af25560d6f1bb77ab2c9926f2b350  gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-4.c
! 57c053ce857b30e57cbffe40b5afcb7a  gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-4.py
  d69b80e0a539be7739a33736ee0e8aaf  gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-5.c
  a58becab25d695c02613dbc4348f124b  gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-multithreaded-inline-events.c
  3c5192534d44afd6ef8195407225eeb4  gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-multithreaded-sarif.c
*************** e3e97716f12c8844ebfbdbbd534e6ff2  gcc/te
*** 54699,54711 ****
  7049acd785444dd8554dd09b160777de  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-GCC_EXTRA_DIAGNOSTIC_OUTPUT-fixits-v1.c
  d7b8d6a01abe683de027809614a2b63f  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-GCC_EXTRA_DIAGNOSTIC_OUTPUT-fixits-v2.c
  d97d9296064e2548698cc70191b940fe  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw-line-numbers-2.c
! e6d483f4d25a7c647c63671ff7dc5c50  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw-line-numbers.c
  a59c3c55e77b2ab336a32f5ffc9ed6ba  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw.c
  8d518bbaaec0b4d6c532cae93ab3eaff  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-color-line-numbers.c
  3f8571aac41f9a607da0ac8cca932644  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-color.c
  7288fef9790277fe3bb349e82cef1875  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-generate-patch.c
  c1874b847baa5d41d58aa2db643143da  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-no-labels.c
  2c7e32cd8f076c6b6406aef7209045e7  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-parseable-fixits.c
  39f1ab78432ac25892fad284e179d8ac  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-trees-1.c
  bb20191ab0ad6e0d6ba368003d857339  gcc/testsuite/gcc.dg/plugin/diagnostic-test-string-literals-1.c
  1a45355cf06403e775b5d7ab5b2a59f7  gcc/testsuite/gcc.dg/plugin/diagnostic-test-string-literals-2.c
--- 54768,54781 ----
  7049acd785444dd8554dd09b160777de  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-GCC_EXTRA_DIAGNOSTIC_OUTPUT-fixits-v1.c
  d7b8d6a01abe683de027809614a2b63f  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-GCC_EXTRA_DIAGNOSTIC_OUTPUT-fixits-v2.c
  d97d9296064e2548698cc70191b940fe  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw-line-numbers-2.c
! 23b67c1167871870119bf469a67fdd70  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw-line-numbers.c
  a59c3c55e77b2ab336a32f5ffc9ed6ba  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw.c
  8d518bbaaec0b4d6c532cae93ab3eaff  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-color-line-numbers.c
  3f8571aac41f9a607da0ac8cca932644  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-color.c
  7288fef9790277fe3bb349e82cef1875  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-generate-patch.c
  c1874b847baa5d41d58aa2db643143da  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-no-labels.c
  2c7e32cd8f076c6b6406aef7209045e7  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-parseable-fixits.c
+ 6be5a14816d5901eb94ffd36d9e7e096  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus.py
  39f1ab78432ac25892fad284e179d8ac  gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-trees-1.c
  bb20191ab0ad6e0d6ba368003d857339  gcc/testsuite/gcc.dg/plugin/diagnostic-test-string-literals-1.c
  1a45355cf06403e775b5d7ab5b2a59f7  gcc/testsuite/gcc.dg/plugin/diagnostic-test-string-literals-2.c
*************** bb20191ab0ad6e0d6ba368003d857339  gcc/te
*** 54716,54722 ****
  ac52c5d4de0c71ac6754e0b97aa2d1aa  gcc/testsuite/gcc.dg/plugin/diagnostic-test-text-art-none.c
  42f7a9a0ce93b9a8f3456309a30456af  gcc/testsuite/gcc.dg/plugin/diagnostic-test-text-art-unicode-bw.c
  60342111ed9bfef70e8686e973bb3988  gcc/testsuite/gcc.dg/plugin/diagnostic-test-text-art-unicode-color.c
! 34c7b4e34dfe3469b8dd42ca4a14f1bd  gcc/testsuite/gcc.dg/plugin/diagnostic_group_plugin.cc
  760ef2ce64f353acb078fd7035069296  gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_show_trees.cc
  db3e6ef9ec4da923b133090fdbe255cc  gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_inlining.cc
  55c90f2e521240707723c45e6dbb1902  gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_metadata.cc
--- 54786,54792 ----
  ac52c5d4de0c71ac6754e0b97aa2d1aa  gcc/testsuite/gcc.dg/plugin/diagnostic-test-text-art-none.c
  42f7a9a0ce93b9a8f3456309a30456af  gcc/testsuite/gcc.dg/plugin/diagnostic-test-text-art-unicode-bw.c
  60342111ed9bfef70e8686e973bb3988  gcc/testsuite/gcc.dg/plugin/diagnostic-test-text-art-unicode-color.c
! 9bcc777bd2ff3fade830e2b8c7a4cacd  gcc/testsuite/gcc.dg/plugin/diagnostic_group_plugin.cc
  760ef2ce64f353acb078fd7035069296  gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_show_trees.cc
  db3e6ef9ec4da923b133090fdbe255cc  gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_inlining.cc
  55c90f2e521240707723c45e6dbb1902  gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_metadata.cc
*************** e33af444b933ae4b76c6fd6ea535e112  gcc/te
*** 55413,55418 ****
--- 55483,55493 ----
  cb7b5505103ef079e746dd619a21ee86  gcc/testsuite/gcc.dg/pr120057-2.c
  5db833c38de3e5ade44290c729fb748c  gcc/testsuite/gcc.dg/pr120074.c
  c1520f6dceb2ad219f9c1f006e65ea92  gcc/testsuite/gcc.dg/pr120277.c
+ 5bcef1d2686ff4144a4a4fcce9aad3ec  gcc/testsuite/gcc.dg/pr120353.c
+ 419de75d508972d0daecf2c3b360b2c8  gcc/testsuite/gcc.dg/pr120354.c
+ 689934c8e3065936b13e4d29e7945bf3  gcc/testsuite/gcc.dg/pr120380.c
+ fa5bb8fde0acecb33a479faffc86bd94  gcc/testsuite/gcc.dg/pr120381.c
+ 9444444b4f048eadd4b6a2d7592f5fca  gcc/testsuite/gcc.dg/pr120480.c
  bc5ddfbbc46f4e0cce1629d1b58d3090  gcc/testsuite/gcc.dg/pr12603.c
  72a2fca76cb69617ae36bab93c7ec0d7  gcc/testsuite/gcc.dg/pr12625-1.c
  6f0ef61e5a12db5f11da839b2988c5e1  gcc/testsuite/gcc.dg/pr13519-1.c
*************** faa7f4600800bdbdaab47877d0fb7746  gcc/te
*** 59142,59147 ****
--- 59217,59225 ----
  e1b9ad351c56aebfaff790ff4002bf6e  gcc/testsuite/gcc.dg/torture/pr120182.c
  0c3297c6ebf6e4adcaeec164dfe8e9ac  gcc/testsuite/gcc.dg/torture/pr120211-1.c
  a0d2174875961d5bb3004aad3d93d7d7  gcc/testsuite/gcc.dg/torture/pr120276.c
+ e9469d38b4234580f9b2284233404b3c  gcc/testsuite/gcc.dg/torture/pr120341-1.c
+ aef01c040da8abd2a1e547ed6a07eb5a  gcc/testsuite/gcc.dg/torture/pr120341-2.c
+ 12e839fd30c3a301bab4708aee3c9815  gcc/testsuite/gcc.dg/torture/pr120347.c
  590593d14c26e1d9ed776d01fc734a3c  gcc/testsuite/gcc.dg/torture/pr120369-1.c
  ded4330fd1cd52783bd9b1761db038ef  gcc/testsuite/gcc.dg/torture/pr16104-1.c
  fc265ee05da2f29f0e92804661cd1f28  gcc/testsuite/gcc.dg/torture/pr17526.c
*************** be86bc81622216478087ebb0eb3b5c80  gcc/te
*** 63357,63362 ****
--- 63435,63441 ----
  2e8ef919adf71384d818b8d001167e81  gcc/testsuite/gcc.dg/vect/bb-slp-pr114435.c
  70f6ab93795e7362efbb766199500951  gcc/testsuite/gcc.dg/vect/bb-slp-pr114799.c
  449a56358af2ecccab64ebf0a2c70ef8  gcc/testsuite/gcc.dg/vect/bb-slp-pr115777.c
+ 536ff3716470f738cfa7ae45d07e10f8  gcc/testsuite/gcc.dg/vect/bb-slp-pr119181.c
  7985ca78d6f56c0a2c1475513068be88  gcc/testsuite/gcc.dg/vect/bb-slp-pr119960-1.c
  d46400927215059ca9b31c5b97f6e386  gcc/testsuite/gcc.dg/vect/bb-slp-pr54400.c
  5472e7bf338627077f4e6ce8cce9944e  gcc/testsuite/gcc.dg/vect/bb-slp-pr58135.c
*************** a9f60b255bd045a55a1c552ca8a26db4  gcc/te
*** 64854,64859 ****
--- 64933,64939 ----
  90cc5ab3d9018cf2d36987fb47ac2d3b  gcc/testsuite/gcc.dg/vect/vect-early-break_134-pr120089.c
  3081c4b62e6b3d9d8577275748ef795d  gcc/testsuite/gcc.dg/vect/vect-early-break_135-pr120143.c
  d69a35cfdc5358c8603e5c2e35112d75  gcc/testsuite/gcc.dg/vect/vect-early-break_135-pr120211.c
+ b14a7c563931d32378d5a7c177b4a9c9  gcc/testsuite/gcc.dg/vect/vect-early-break_136-pr120357.c
  73bc7475d6af2bd77455abec5df316e4  gcc/testsuite/gcc.dg/vect/vect-early-break_14.c
  e90473e2ecf7c08db9278bdca5060773  gcc/testsuite/gcc.dg/vect/vect-early-break_15.c
  2232d395ceff11af9b28f269e86162c9  gcc/testsuite/gcc.dg/vect/vect-early-break_16.c
*************** ef2cdb48cbe0dedfce0d7eb770a1f30f  gcc/te
*** 85674,85679 ****
--- 85754,85760 ----
  3cee806d4474b5711bc99a7abe73cadc  gcc/testsuite/gcc.target/i386/pr119549.c
  bb420ee68e25b3f2c223a9b99a8e7c79  gcc/testsuite/gcc.target/i386/pr119784a.c
  038406363ec46be9b531268d03546b94  gcc/testsuite/gcc.target/i386/pr119784b.c
+ 1eb4ee8a31ea901f2b8b18e1346e6d95  gcc/testsuite/gcc.target/i386/pr119884.c
  940e784d589973675da003c24eabc2ee  gcc/testsuite/gcc.target/i386/pr119919.c
  0a65f7a12fa8d04fa79c2af4b21b5f14  gcc/testsuite/gcc.target/i386/pr120031.c
  dd47421a141f36dc244e35b0237335f0  gcc/testsuite/gcc.target/i386/pr120360.c
*************** e2839913fadc6a00676c8f02deb3f59e  gcc/te
*** 87619,87624 ****
--- 87700,87706 ----
  7429731d2f6b996b2f421b87eac73d71  gcc/testsuite/gcc.target/i386/recip-vec-sqrtf-avx.c
  1935b0b3b4df5ba36df8c1e173c94607  gcc/testsuite/gcc.target/i386/recip-vec-sqrtf.c
  794b883a440dddb0d157e35b449464f1  gcc/testsuite/gcc.target/i386/record-mcount.c
+ 8d7f031cc6d3b9e16f0bc0d367cf2533  gcc/testsuite/gcc.target/i386/reduc-pshuf.c
  27b94da412b0e514a304cb667a1125f1  gcc/testsuite/gcc.target/i386/regparm-stdcall.c
  f460909450afd8b803c32061496a4d75  gcc/testsuite/gcc.target/i386/regparm.c
  e47bbd1acfd37236fccff011d4c82e82  gcc/testsuite/gcc.target/i386/reload-1.c
*************** f2246fb526840289cc94bd7e8b0c994a  gcc/te
*** 88532,88538 ****
  17c2d170d498fc9c2649c0cb8d5bd3b9  gcc/testsuite/gcc.target/i386/vect-epilogues-2.c
  21d76cc37d837035f538fac85d36fdf4  gcc/testsuite/gcc.target/i386/vect-epilogues-3.c
  a6ff603f96682f9f6d8b7309ee1c3088  gcc/testsuite/gcc.target/i386/vect-epilogues-4.c
! 249b46507d08e98058d76d830dc7822a  gcc/testsuite/gcc.target/i386/vect-epilogues-5.c
  44589af45370ba4865592d1e9e717b40  gcc/testsuite/gcc.target/i386/vect-float16-1.c
  22c6e6a37c837040af7566c0ebd70233  gcc/testsuite/gcc.target/i386/vect-float16-10.c
  412a2e12fa51e461ac9fc29d0bcadfae  gcc/testsuite/gcc.target/i386/vect-float16-11.c
--- 88614,88620 ----
  17c2d170d498fc9c2649c0cb8d5bd3b9  gcc/testsuite/gcc.target/i386/vect-epilogues-2.c
  21d76cc37d837035f538fac85d36fdf4  gcc/testsuite/gcc.target/i386/vect-epilogues-3.c
  a6ff603f96682f9f6d8b7309ee1c3088  gcc/testsuite/gcc.target/i386/vect-epilogues-4.c
! bd48480826774a1e0edcea9a018ebf1b  gcc/testsuite/gcc.target/i386/vect-epilogues-5.c
  44589af45370ba4865592d1e9e717b40  gcc/testsuite/gcc.target/i386/vect-float16-1.c
  22c6e6a37c837040af7566c0ebd70233  gcc/testsuite/gcc.target/i386/vect-float16-10.c
  412a2e12fa51e461ac9fc29d0bcadfae  gcc/testsuite/gcc.target/i386/vect-float16-11.c
*************** b4225e859cdd92f35ddd7b8b8b438a8c  gcc/te
*** 93544,93549 ****
--- 93626,93633 ----
  bec789a6108435830e82b6fdd221cb51  gcc/testsuite/gcc.target/riscv/arch-54.c
  8b84caba9ce32304ca1b5db7befd5c29  gcc/testsuite/gcc.target/riscv/arch-55.c
  f6c8f50458c8df94ccafb1928e48202a  gcc/testsuite/gcc.target/riscv/arch-56.c
+ 0c96ef9c808f4ca24e79e559697eea21  gcc/testsuite/gcc.target/riscv/arch-57.c
+ ff856fed5ddef759c9032d497def7520  gcc/testsuite/gcc.target/riscv/arch-58.c
  2cd6ade559b1ab254703146aa7008e18  gcc/testsuite/gcc.target/riscv/arch-6.c
  81519955d6644acb55c78120405494a5  gcc/testsuite/gcc.target/riscv/arch-7.c
  def4ef484e9166f9a01c65a411a9d916  gcc/testsuite/gcc.target/riscv/arch-8.c
*************** bcfaff8c96a5626a9e266625ed326c1c  gcc/te
*** 94431,94436 ****
--- 94515,94547 ----
  c06e6ed768abf01be45f07cd0f30d0f2  gcc/testsuite/gcc.target/riscv/rv32i_zcmp.c
  3e4bfa9ed1e14f800d0563ed26507250  gcc/testsuite/gcc.target/riscv/rvv/autovec/align-1.c
  1331d22c6b347ed0f6bbf2533892ae7e  gcc/testsuite/gcc.target/riscv/rvv/autovec/align-2.c
+ aaa81c96ac467d4f428ed13b3a12b601  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg.h
+ e1d6485e0aa259551489ed62980019fe  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i16-from-i32.c
+ 78f9d5f72ae542de31e4ae1f8ab556cd  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i16-from-i64.c
+ 84c40fa236aef7913b6773891e80a5be  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i32-from-i64.c
+ 48fa56954356e702faa8b1b55a4396d8  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i8-from-i16.c
+ fa2be3e0b7306d27df8607b7b1cbed59  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i8-from-i32.c
+ 44f4eedc2d9224298a86315fc7119f82  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i8-from-i64.c
+ af6653e2e32f0b1f6e153a7b476ec8f2  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i16-from-i32.c
+ 891dd9dc35f87c068f46f93e5ad66180  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i16-from-i64.c
+ fe53f601206bab816ad7a5bf728787dd  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i32-from-i64.c
+ 2b6fb6c484989ade64ea8c517ca6f796  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i8-from-i16.c
+ 6140bdd7a1e913756db9fac3b3309a45  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i8-from-i32.c
+ 2f8729a91ead1cff35931466d83c4ce9  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i8-from-i64.c
+ 9fe3f977c34ad6766f00f208bc7f24d1  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_data.h
+ 69e76564b4fe14441fdbab3fe9d86230  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i16-from-i32.c
+ 317573095b091e8e0bf3bea23476f91d  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i16-from-i64.c
+ 76cc49f4d01d4c6c9921f8e9d67ed2ec  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i32-from-i64.c
+ 03151e9b6effb2473607ec8b58009389  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i16.c
+ 647a42c25b1b1afb623dc95cdac155b3  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i32.c
+ df8e47c40339f640d7a56eb5f8f7bb57  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i64.c
+ 111a5c6db053dabd42b492ca8dd578b2  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i16-from-i32.c
+ 82184d992308f929fad9c9530cb7566e  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i16-from-i64.c
+ 697077860d252792660950a1249e29f2  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i32-from-i64.c
+ e7321dd181eeec3b57e977ecae2c5bd6  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i16.c
+ a7b448328c7597335e45b71033ae0c8e  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i32.c
+ c09231d04f636ba67afb00333382e76a  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i64.c
+ c741cae5e21d28ce38de150928d9ac2e  gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_run.h
  703460f530006a4fc7115645853f1a43  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/copysign-run.c
  cbdfece595adf310fc82fb6d6a77a7e9  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/copysign-rv32gcv.c
  fb13eb42f5f3a0b2a5afb3a09d77ff4e  gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/copysign-rv64gcv.c
*************** a98d30dc75773026799b3df3f3f8381a  gcc/te
*** 95207,95217 ****
  a0d3c0787f790a47ce268b55b81d62dd  gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc_zvfh_run-10.c
  979e78c5ed1d2ba91a46584480362b26  gcc/testsuite/gcc.target/riscv/rvv/autovec/riscv_vector.h
  0e18415d78f87bdf98f3eb96f98969b3  gcc/testsuite/gcc.target/riscv/rvv/autovec/rotr.c
! 61873facbf862f814e763a966d84e059  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_arith.h
  6f530e5176febab88f9aeaf7130a08e2  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_binary_vvv_run.h
  2051a9c90b6c265bff2dcbd75138e2be  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_binary_vvx_run.h
  4b3a9b370d9da4cbc5629a1633cc4b37  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_binary_vx_run.h
! 3fd9ed039403846143577a4d90a75922  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_data.h
  ad82cda06983f97da259909744286ef6  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add-1-s16.c
  ef5d162de2581d4ca808b2873f2c688a  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add-1-s32.c
  7c33cbff6d939e62cb26f72c6b52a89b  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add-1-s64.c
--- 95318,95328 ----
  a0d3c0787f790a47ce268b55b81d62dd  gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc_zvfh_run-10.c
  979e78c5ed1d2ba91a46584480362b26  gcc/testsuite/gcc.target/riscv/rvv/autovec/riscv_vector.h
  0e18415d78f87bdf98f3eb96f98969b3  gcc/testsuite/gcc.target/riscv/rvv/autovec/rotr.c
! e98b7eb5bce2a3f200e39895b49eb3f6  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_arith.h
  6f530e5176febab88f9aeaf7130a08e2  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_binary_vvv_run.h
  2051a9c90b6c265bff2dcbd75138e2be  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_binary_vvx_run.h
  4b3a9b370d9da4cbc5629a1633cc4b37  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_binary_vx_run.h
! 62e749ea2cd2570a713d5c0b3285a1ba  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_data.h
  ad82cda06983f97da259909744286ef6  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add-1-s16.c
  ef5d162de2581d4ca808b2873f2c688a  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add-1-s32.c
  7c33cbff6d939e62cb26f72c6b52a89b  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add-1-s64.c
*************** a34d327beaf5542af2a60e0b64d39717  gcc/te
*** 95244,95249 ****
--- 95355,95371 ----
  4a009684e0cc39abbff50cf131a371ea  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add-run-4-s32.c
  0f467946252321315e38669390d30663  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add-run-4-s64.c
  e50dd7b73fefb92d60509ad72f08709c  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add-run-4-s8.c
+ 7b538b48e46bffcc2fd7200c7e87420a  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i16.c
+ 52ca0e1a1bb7537a87c1d39cf9e94146  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i32.c
+ a0aff92bf1905e8d3c6ba4337e4c888e  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i64.c
+ 5209b588a556fc5310e4e14bd59fdf17  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i8.c
+ f63c9b288c71e4c8138b29b277430432  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i16.c
+ 224a5418c643ff57e5208e14f51ce9f4  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i32.c
+ c9484920bdef7ef029e3c5651c27a5fe  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i64.c
+ df57dfbc4e39682cb0f7568ec53ecb52  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i8.c
+ d92bbcd643cb45b724e85335f4d110f6  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i16.c
+ e52af1e50657adeb9ef0df22ae04edfa  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i32.c
+ 6dda8daab079fdce2bd0c82d885ce60f  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i8.c
  584aef2673a45f7521741e718370dca4  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_sub-1-i16.c
  1c70d4f26b0f0d1cdebc3c8fb14786d2  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_sub-1-i32.c
  65f28a842011906422d137d6fdf70637  gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_sub-1-i64.c
*************** a46e2469358be5cd090ef9c30487d38f  gcc/te
*** 96178,96189 ****
  cd375212683d2e89715f19dd60b794dc  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/and-1.c
  88e56d281c9e6014e958274256c0072e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/and-2.c
  52d7d158c0478eb8f538175017d6dc33  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/and-3.c
! 99dc5cd621fd744af09d3cc4cc07d7b6  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-1.c
! 54a6cc53a3947a533272cb86d096e7ea  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-2.c
! 6a77ddcde9aec47bfb46cb76cbeb970a  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-3.c
! c4f1e57a8dcde0d7416e239ed9cb99f0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-4.c
! 33ee4112b159ea44d94bb25dc469847d  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-5.c
! a85f7942d45e11d731824fcce04022da  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-6.c
  c921c5085b27858499e470f23a40d71c  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/bswap16-0.c
  b31c88d47d78f741076463728b6d8bd9  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-1.c
  a4cf378028e723371c5f17d244a90e7c  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-10.c
--- 96300,96311 ----
  cd375212683d2e89715f19dd60b794dc  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/and-1.c
  88e56d281c9e6014e958274256c0072e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/and-2.c
  52d7d158c0478eb8f538175017d6dc33  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/and-3.c
! 529639583855663c08bb8c7850efe0ba  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-1.c
! 8aba7a7b76dda3e6a5df8c344c7e874c  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-2.c
! 4eb798e553b2577fee6ea882fc4a943b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-3.c
! 45f2fd8fd5ae4ac56d21e8996be1837b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-4.c
! c93cf42525a1c616ab0e12687755dfc0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-5.c
! 648888d42e42549adab8222e0efc29a7  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-6.c
  c921c5085b27858499e470f23a40d71c  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/bswap16-0.c
  b31c88d47d78f741076463728b6d8bd9  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-1.c
  a4cf378028e723371c5f17d244a90e7c  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-10.c
*************** f95d4e0ecca41e722099be6b52b3efe7  gcc/te
*** 96610,96665 ****
  35044d6a949091b4c23addf451f035ed  gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-rv64.c
  0026b1e2310b7242895d290cff3f1e9e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-template.h
  2d052315288cbb1a315add9fb76abbc3  gcc/testsuite/gcc.target/riscv/rvv/autovec/vreinterpet-fixed.c
! 227621b889d0cbccd8b57b75a0300433  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i16.c
! c0929acca222e58c77ad7823d297621c  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i32.c
! c89a8346f6325167aaf896fd21f2b36f  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i64.c
! 79818437fbddf807482a893070bffb2b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i8.c
! 7957ecbc758d321044639b2a484282e3  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c
! 224def4c2257e16654f90f02e4a5757c  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c
! 7a290439b713a9d0b0573a94dddf7db0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c
! 607905fa9f09b30f648b4132b1419d7f  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c
! 2a10483885fdc62512a4123e3652dc1a  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i16.c
! c9a9e9b4e4402d856e5b08399d372cdb  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i32.c
! 231cc1e70194d06df0ebcb9837508576  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i64.c
! fc7fd552014010daccc14f04fe718a32  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i8.c
! d193bd89cfcca47231a6fbe493d084be  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c
! 864659adf1587be8edce2d83163f4d3a  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c
! 28cbc219d97f0e5b3a18e6297326a99b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c
! be9fec7129a7771cd38118ef1ba52150  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c
! 036e276584dab3bffc3af09cbf5b0141  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i16.c
! 8a9c4fc481905bb569540b64f19dbc7e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i32.c
! 825999848fac3bdf93405b44ae3759b9  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i64.c
! 963ab6c27a37763c521c1ab2fd30e36c  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i8.c
! fbbae994701ac579c50fdb07a14510bb  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c
! 63ce0d532a9576ede889e54193d5d295  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c
! f9a5cab7faf32113892896e96ffda27c  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c
! fb9b888da57b9acf705827c02d5f747d  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c
! 8d905ee078aecfbfe3537779f9a7fd54  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i16.c
! 19846f901fed3d3ce5c77f76a14d87aa  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i32.c
! ce3da65e8cc04c67e7ce506fb8743286  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i64.c
! b76d995b847e4d18b96ef5680125006f  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i8.c
! 8c0f1dd3bc69995c2c999cfc7a860740  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c
! bb18f92e6aa3b36e6eec328b193376f8  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c
! 6b55a8ab17169303dce880dbcefaed82  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c
! 5b73cb343085af8df39d7f22cf0c816b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c
! 964c07ac7d5003040c604320f20fbbaa  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i16.c
! 687abeb06acb6f67010c8c6763c2be77  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i32.c
! b8b5d7e5942a2e78a137f934d762d9d0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i64.c
! 53005c28be429a38ca739ecd056c4bf3  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i8.c
! f74c1adb250f62bb7fdb0e178f4a8d5e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c
! a1736f50e8c90210b65fa361c7f7c4fb  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c
! dcb66447fa9681ac20ca66fbfc222284  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c
! a8c923a161cbde04b37ec60379d83743  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c
! 3f268e516d9a10b560592a7f3fd6083c  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i16.c
! 903cc24c9edadea8c191ef2715fe627c  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i32.c
! 5c72faf16f196ff19a0e59de02ad1e28  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i64.c
! 52bc2fab2454f6e47a8fd94bca83eb4d  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i8.c
! ae225a0763d73897fb894553890d8d94  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c
! dee43b6e6af76584831e8f1937feb6b4  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c
! 72cabf3ce17869bae41454de964e63cb  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c
! a8a8bf4c0f5ea4a2372c9b04047d656d  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c
  f6a301d0db99423158844de969165511  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary.h
! a330195a1803011649a01040d554bce3  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h
  ccb9cff4438796fd5c2c015df2204a55  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_run.h
  f82d1e3332267f884d6990983f9a5c50  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vadd-run-1-i16.c
  9f3b8184fd845e5425e43d0e12950ff1  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vadd-run-1-i32.c
--- 96732,96787 ----
  35044d6a949091b4c23addf451f035ed  gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-rv64.c
  0026b1e2310b7242895d290cff3f1e9e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-template.h
  2d052315288cbb1a315add9fb76abbc3  gcc/testsuite/gcc.target/riscv/rvv/autovec/vreinterpet-fixed.c
! 1e775906de0386ccad66365774476348  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i16.c
! 5534ae12c7f39e11118c08a31209ea6b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i32.c
! 5d957d885d75a2e76ace85884045a161  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i64.c
! 21366b0593b625873efe01c9b41995bc  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i8.c
! 17c46c92262637b6b2a3cf54419aaff1  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c
! bfc4aa594d0351faaaf4032d01ec995b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c
! fb9277ec0eae5be6ab59e23b4a788f32  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c
! 63dda1a81ed2fee8aaf50012005f98da  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c
! 023704934c2ea36008dca58f2d5e14b0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i16.c
! c080508affc89c8add9d5ae37d284947  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i32.c
! fbf1917b447ca8ccbac7fc421dc982e3  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i64.c
! 63a1b5648ff4e288783cdf7a8e13f911  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i8.c
! 74d76d27689efb5a69722bc970e696ae  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c
! ef6fb1613bc6c29af302eb911cf2bdee  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c
! a1a9d21a074c486a6028341761f1695e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c
! b9128002a5df73436556c83c38ff0d88  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c
! 98c05ba95925eb6e57d216683018de08  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i16.c
! 920443cd96c1af24b0e03df6c9a30d01  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i32.c
! 646d4ab1d5d4cdfc1d8cedf97504af6f  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i64.c
! 406bec0d78552a5f194c5b5b1083befc  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i8.c
! d5d18a4912d586cd48af5f1db1c55f9f  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c
! b886baed5cd62f78487fbef9d21ce100  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c
! ace3e7d56113073d063532db2f796b41  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c
! a7b4d8554e4e17f9146dc2f836740781  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c
! 68a828f6f9db283ada9214f631628f2b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i16.c
! 9c36305fef8302c44ff5728f1ef44dff  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i32.c
! d63df10df8286d42b9b1b025b6aae17f  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i64.c
! 0ca45f29eb963d85b5e34dcd1ee9b08b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i8.c
! 26d33f7055af51bdaeb496022bb2da16  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c
! 5d053fa9f1dfb913a723540bb8da485a  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c
! 94b5b85ddabee1b0f6eae44f2ca0fe39  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c
! ac2e4e6672b79733a409c1e638ae39b0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c
! 036c850865f35187c4739ebae91eb885  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i16.c
! 6368165a7bc5d82c874fca3bb60a2225  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i32.c
! 2e14fa314e6f087a959aa06419fd46cc  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i64.c
! 3395eebefc4deeb1395066fe5ae794e5  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i8.c
! 49dd85ecd69f913bc1c0a38c704b7fd3  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c
! 13781ecadf5b97cbef9ab79fc129c8b0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c
! 7424d954645f85a2ebffd7a64a3cae9b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c
! f7bb21d36952eb51a0164cf2b8b06329  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c
! a8e75b8f7bf3e74116b0938758823854  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i16.c
! b7deaabbd5dcece0ad6055d645f69e38  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i32.c
! e50d030f1984c15a7bf0b769fe6437ed  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i64.c
! 5ea80134f16b628dfe2319a2bcc27275  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i8.c
! a5921c43f33f1c876fa9c963742e35b1  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c
! 8e9ac4356e5eb95ae23000af90d91bcc  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c
! 37a014140c99343c2df45d2b3f80232a  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c
! 78174bf0377e0d9bb59e86bc42649f84  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c
  f6a301d0db99423158844de969165511  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary.h
! 574f7febaea2062329d43239aefb5189  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h
  ccb9cff4438796fd5c2c015df2204a55  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_run.h
  f82d1e3332267f884d6990983f9a5c50  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vadd-run-1-i16.c
  9f3b8184fd845e5425e43d0e12950ff1  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vadd-run-1-i32.c
*************** f45220ac5d3b632c2b85a02c4ba7b949  gcc/te
*** 96677,96682 ****
--- 96799,96808 ----
  6c202fff5843e60c2537c34d55f27524  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vand-run-1-u32.c
  fd7186aaa46dcb3f9896b7632d2e89dc  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vand-run-1-u64.c
  daed14994427ff6ab8a37961118d2c0c  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vand-run-1-u8.c
+ 9076cf8f652bb87f5614bdec4824fc2f  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i16.c
+ f3610778d536959133cfda7115cd7ca8  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i32.c
+ 8b6a8f2a6c0bc3be747fd220041e321f  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i64.c
+ 7422ef85e90b4a00f37f77f709ef9219  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i8.c
  90a5b2f99307ef1d58eb01275ec12ab5  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vor-run-1-i16.c
  73f8419d7d51dd6d9657973ca7153119  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vor-run-1-i32.c
  6559ebf5f269f0c83f81f6a5726fdaf8  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vor-run-1-i64.c
*************** e0a029ed9e4f9f4ab4383ebb4a63f046  gcc/te
*** 96701,96709 ****
  10bbd930713d9d02d87a6861d8201dc0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsub-run-1-u32.c
  0e5d7afeb387b9c36c90fcf1d8fd7134  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsub-run-1-u64.c
  d8e11260f6cbaa9942a95a889d2d3dcd  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsub-run-1-u8.c
  836cc87f131d9d080542fe18ca8f7841  gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-run.c
! f1082aad0502554eeebed17813742243  gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv32gcv.c
! c63c1dda7e0edaae3a19ada81d8d2297  gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv64gcv.c
  b3a10f963daabd4c0545bcbe870d8b78  gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-template.h
  37f00fa125caf733543d0cf3aa59e817  gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-1.c
  b352fdfb9e52a7c01a1b2bedc6b37b32  gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-10.c
--- 96827,96843 ----
  10bbd930713d9d02d87a6861d8201dc0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsub-run-1-u32.c
  0e5d7afeb387b9c36c90fcf1d8fd7134  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsub-run-1-u64.c
  d8e11260f6cbaa9942a95a889d2d3dcd  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsub-run-1-u8.c
+ a0289a49fbec6d012c69ed3175a98cc5  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i16.c
+ 8f2d02d5d8980d2c4e052c4379664339  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i32.c
+ 9b067e08dc0bd77cc07cc4461f85c9ef  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i64.c
+ 52c0ac3c4909c902189a78dd9fc2bccd  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i8.c
+ 4b4e01ade183cdfeee237953674426a1  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u16.c
+ 8f2d02d5d8980d2c4e052c4379664339  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u32.c
+ 8d7233deaa2c5490a9767684770727ae  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u64.c
+ 840249b053ac4f1f4bb99aa3c0ecdc82  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u8.c
  836cc87f131d9d080542fe18ca8f7841  gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-run.c
! aeb0d50dcb40664d3bf3d024edf8eed6  gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv32gcv.c
! 4643fde202857860772ea93f75bc542e  gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv64gcv.c
  b3a10f963daabd4c0545bcbe870d8b78  gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-template.h
  37f00fa125caf733543d0cf3aa59e817  gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-1.c
  b352fdfb9e52a7c01a1b2bedc6b37b32  gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/widen-10.c
*************** c68a73138459484ead0cddce6ce27d08  gcc/te
*** 97418,97423 ****
--- 97552,97558 ----
  eaed30eccbeb952165411cfd2c789b72  gcc/testsuite/gcc.target/riscv/rvv/base/pr118872.c
  96272d16f134fa97f27114f27089793a  gcc/testsuite/gcc.target/riscv/rvv/base/pr118931-run-1.c
  b8ddadeddd15bd6f079e943b9036825d  gcc/testsuite/gcc.target/riscv/rvv/base/pr119115.c
+ 3086321c9a12d3eecd8f1f9ad8ecac7a  gcc/testsuite/gcc.target/riscv/rvv/base/pr120436.c
  c05efbdfaafc64ad34b3d1c4b60a38eb  gcc/testsuite/gcc.target/riscv/rvv/base/pr90263.c
  be75fd39ea9b3d01e3e22294359fb482  gcc/testsuite/gcc.target/riscv/rvv/base/pragma-2.c
  20a3b581af8087da2c1170d56ff52971  gcc/testsuite/gcc.target/riscv/rvv/base/pragma-3.c
*************** dde1d893b4472b276d447ead0c97e442  gcc/te
*** 98174,98190 ****
  7f31a7c50e03b68fe40b0726cc298552  gcc/testsuite/gcc.target/riscv/sat/sat_s_add-run-4-i32.c
  35ea489efd365d6bd0cc999e14ad6f26  gcc/testsuite/gcc.target/riscv/sat/sat_s_add-run-4-i64.c
  444d9e26b41e65940d45cfd005358d3a  gcc/testsuite/gcc.target/riscv/sat/sat_s_add-run-4-i8.c
! 69ad40c6f5b2b845ba28b763a2b07586  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-1.c
! 4711507a15160bda26f78a6b808531d1  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1.c
! 659c3b9c2b70b894dc633748c3f56890  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-2-1.c
! 6dcd87589943dfc9030b3633c6d4cfcb  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-2.c
! 5355149b6c04b1eae8c847ab040357a9  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-3-1.c
! 374d49b2d55e472d1f0781ca71e28189  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-3.c
! 4a1cfa948836efdfbc211d7c65522a88  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-4.c
! b7c4298263d04cbde35e1ceba2c465cd  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1.c
! 016632a11998964a2b28160809398729  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-2.c
! ea5dbcd1a21c558970e9d1567fe1a599  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-3.c
! 2d4143b611147be29b4b0d805f52a604  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-4.c
  72810fff8f00c0146a77f13c9741cbbf  gcc/testsuite/gcc.target/riscv/sat/sat_s_sub-1-i16.c
  9361bec687751a64dfe2b0a3c1e1f4ab  gcc/testsuite/gcc.target/riscv/sat/sat_s_sub-1-i32.c
  51af994b03c7a92302c8bdbbc2dc6ac1  gcc/testsuite/gcc.target/riscv/sat/sat_s_sub-1-i64.c
--- 98309,98325 ----
  7f31a7c50e03b68fe40b0726cc298552  gcc/testsuite/gcc.target/riscv/sat/sat_s_add-run-4-i32.c
  35ea489efd365d6bd0cc999e14ad6f26  gcc/testsuite/gcc.target/riscv/sat/sat_s_add-run-4-i64.c
  444d9e26b41e65940d45cfd005358d3a  gcc/testsuite/gcc.target/riscv/sat/sat_s_add-run-4-i8.c
! e11e93f672c95ede30a7d5026b91f367  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i16.c
! a94361e04473a2c6b07f0006cc21020d  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i32.c
! 97d8b0836937f8fe659245f11700da42  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i64.c
! 30f5c02a7e982b6c8bb655d3137af05e  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i8.c
! 194d1aa63a23ecbc52c282602dee47e8  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i16.c
! b6c05474c1e42c3da50dba2524519d3e  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i32.c
! bebbfe3ec914363870604dd8ac4deb8c  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i64.c
! d5476a9625b2e72d3532d647b6bf4d1d  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i8.c
! 659c3b9c2b70b894dc633748c3f56890  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i16.c
! 5355149b6c04b1eae8c847ab040357a9  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i32.c
! 69ad40c6f5b2b845ba28b763a2b07586  gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i8.c
  72810fff8f00c0146a77f13c9741cbbf  gcc/testsuite/gcc.target/riscv/sat/sat_s_sub-1-i16.c
  9361bec687751a64dfe2b0a3c1e1f4ab  gcc/testsuite/gcc.target/riscv/sat/sat_s_sub-1-i32.c
  51af994b03c7a92302c8bdbbc2dc6ac1  gcc/testsuite/gcc.target/riscv/sat/sat_s_sub-1-i64.c
*************** aa3e4f00345b3711bbfa1e907634ef21  gcc/te
*** 99650,99655 ****
--- 99785,99791 ----
  169d707eaa516f15920084e04db14562  gcc/testsuite/gcc.target/s390/vector/vec-extend-1.c
  150569802f570140ee29c25fab8c7abc  gcc/testsuite/gcc.target/s390/vector/vec-extend-2.c
  45d2bf3bb41134f98627857b16cb3af3  gcc/testsuite/gcc.target/s390/vector/vec-extend-3.c
+ b33ae2a3cf0aa29c64a964582851eeb8  gcc/testsuite/gcc.target/s390/vector/vec-extract-1.c
  b015126e7fb7ce82a8d5140428c4e192  gcc/testsuite/gcc.target/s390/vector/vec-genbytemask-1.c
  56c4b1af3959c56145108f2f9535cc8f  gcc/testsuite/gcc.target/s390/vector/vec-genbytemask-2.c
  6e67081d0ff79468862afe5e9e976749  gcc/testsuite/gcc.target/s390/vector/vec-genmask-1.c
*************** aac15cbd63557a6d4fce6fbf70f1e964  gcc/te
*** 99663,99668 ****
--- 99799,99805 ----
  3f0e273f04c5175b1fdb100976e981c6  gcc/testsuite/gcc.target/s390/vector/vec-nopeel-1.c
  36edbd8af8f3368a9b83ac5c88068cfc  gcc/testsuite/gcc.target/s390/vector/vec-nopeel-2.c
  604b357bf5bdc9c25e2e900ed77fd858  gcc/testsuite/gcc.target/s390/vector/vec-scalar-cmp-1.c
+ cc7a1ed2835edcf4012504114d5db9f0  gcc/testsuite/gcc.target/s390/vector/vec-set-1.c
  8de36944e18edbbcc735c9baad533f52  gcc/testsuite/gcc.target/s390/vector/vec-shift-1.c
  0abbe44ec35d751d3115d16aa8369ae5  gcc/testsuite/gcc.target/s390/vector/vec-shift-10.c
  6fec2a086b59ab219eb8ca3127c359d7  gcc/testsuite/gcc.target/s390/vector/vec-shift-11.c
*************** bcf9cbe8f6dcade38e751db85acbf9b4  gcc/te
*** 106553,106559 ****
  3fe88d45ed4469bd39dc91bac863922d  gcc/testsuite/gfortran.dg/c_f_pointer_tests_3.f90
  e981ae3c610dd9839cfb023166f7eff9  gcc/testsuite/gfortran.dg/c_f_pointer_tests_4.f90
  c346b2fefbaf50e43e1029f18ab9a9ef  gcc/testsuite/gfortran.dg/c_f_pointer_tests_5.f90
! 198e45e07722d7e2520bc4b280a49219  gcc/testsuite/gfortran.dg/c_f_pointer_tests_6.f90
  0b80eb392f4e3e83bc15612cb9208b4d  gcc/testsuite/gfortran.dg/c_f_pointer_tests_7.f90
  3ebb7270a1c7e8ff9b05aa304958ca0b  gcc/testsuite/gfortran.dg/c_f_pointer_tests_8.f90
  f82e9b9c0fd2496c70490c91bc661d8b  gcc/testsuite/gfortran.dg/c_f_pointer_tests_9.f90
--- 106690,106696 ----
  3fe88d45ed4469bd39dc91bac863922d  gcc/testsuite/gfortran.dg/c_f_pointer_tests_3.f90
  e981ae3c610dd9839cfb023166f7eff9  gcc/testsuite/gfortran.dg/c_f_pointer_tests_4.f90
  c346b2fefbaf50e43e1029f18ab9a9ef  gcc/testsuite/gfortran.dg/c_f_pointer_tests_5.f90
! b09906ea02ce8406cdd3e27bb94de042  gcc/testsuite/gfortran.dg/c_f_pointer_tests_6.f90
  0b80eb392f4e3e83bc15612cb9208b4d  gcc/testsuite/gfortran.dg/c_f_pointer_tests_7.f90
  3ebb7270a1c7e8ff9b05aa304958ca0b  gcc/testsuite/gfortran.dg/c_f_pointer_tests_8.f90
  f82e9b9c0fd2496c70490c91bc661d8b  gcc/testsuite/gfortran.dg/c_f_pointer_tests_9.f90
*************** f921a7c5a0e4098dd6b6edf4e317a4e1  gcc/te
*** 107195,107203 ****
  082efd8f928b26368f7bd7dc47edc279  gcc/testsuite/gfortran.dg/comma.f
  ca9b384b7523fa630f1d4edff3cd4267  gcc/testsuite/gfortran.dg/comma_IO_extension_1.f90
  7b4fe3be18cf5d3e2bcac0b98a2191d6  gcc/testsuite/gfortran.dg/comma_IO_extension_2.f90
! b68510025102f4e42c5ab3a0ebf1b5aa  gcc/testsuite/gfortran.dg/comma_format_extension_1.f
  e9f174aaa655ec093b7c3dc075581e89  gcc/testsuite/gfortran.dg/comma_format_extension_2.f
! cc4fd56c375338d8c90f15498b4ab793  gcc/testsuite/gfortran.dg/comma_format_extension_3.f
  4958e703e9cee5c3b3f544b53b66a7f9  gcc/testsuite/gfortran.dg/comma_format_extension_4.f
  e9defd3400b97dd717e34ceddbb15145  gcc/testsuite/gfortran.dg/common_1.f
  ad56b8ccf93a09af1f57171e13ba7a6a  gcc/testsuite/gfortran.dg/common_1.f90
--- 107332,107340 ----
  082efd8f928b26368f7bd7dc47edc279  gcc/testsuite/gfortran.dg/comma.f
  ca9b384b7523fa630f1d4edff3cd4267  gcc/testsuite/gfortran.dg/comma_IO_extension_1.f90
  7b4fe3be18cf5d3e2bcac0b98a2191d6  gcc/testsuite/gfortran.dg/comma_IO_extension_2.f90
! ec24e870adfc77943201e1bbbfafd506  gcc/testsuite/gfortran.dg/comma_format_extension_1.f
  e9f174aaa655ec093b7c3dc075581e89  gcc/testsuite/gfortran.dg/comma_format_extension_2.f
! b8189d20e299da9e84298a2e0fcba5c7  gcc/testsuite/gfortran.dg/comma_format_extension_3.f
  4958e703e9cee5c3b3f544b53b66a7f9  gcc/testsuite/gfortran.dg/comma_format_extension_4.f
  e9defd3400b97dd717e34ceddbb15145  gcc/testsuite/gfortran.dg/common_1.f
  ad56b8ccf93a09af1f57171e13ba7a6a  gcc/testsuite/gfortran.dg/common_1.f90
*************** c023e0a33575555c4fdeb791d5d41ad0  gcc/te
*** 107295,107301 ****
  3c614c06c041b57a9bfb2da993bb9cf5  gcc/testsuite/gfortran.dg/continuation_10.f90
  bb6da1fae598452b743d9abf13df084f  gcc/testsuite/gfortran.dg/continuation_11.f90
  c328c2f39088b37a00d617231b1b4ba4  gcc/testsuite/gfortran.dg/continuation_12.f90
! 428e9897af8aad931c6d536f688f55cc  gcc/testsuite/gfortran.dg/continuation_13.f90
  6338b1bd0bab5dcc6fd438e06a3741cf  gcc/testsuite/gfortran.dg/continuation_14.f
  0bc57d8d644674307567cf8e56a49f4d  gcc/testsuite/gfortran.dg/continuation_15.f90
  2446b64e901d92fd4f806ad312a1c4c9  gcc/testsuite/gfortran.dg/continuation_16.f90
--- 107432,107438 ----
  3c614c06c041b57a9bfb2da993bb9cf5  gcc/testsuite/gfortran.dg/continuation_10.f90
  bb6da1fae598452b743d9abf13df084f  gcc/testsuite/gfortran.dg/continuation_11.f90
  c328c2f39088b37a00d617231b1b4ba4  gcc/testsuite/gfortran.dg/continuation_12.f90
! bad4e01e4755ca37b2856ca71f3c2cf3  gcc/testsuite/gfortran.dg/continuation_13.f90
  6338b1bd0bab5dcc6fd438e06a3741cf  gcc/testsuite/gfortran.dg/continuation_14.f
  0bc57d8d644674307567cf8e56a49f4d  gcc/testsuite/gfortran.dg/continuation_15.f90
  2446b64e901d92fd4f806ad312a1c4c9  gcc/testsuite/gfortran.dg/continuation_16.f90
*************** ea87431a0369f9e7268297efe801335a  gcc/te
*** 107467,107475 ****
  7634f260da3c6ee6123a7feaf3e1ab68  gcc/testsuite/gfortran.dg/dec_logical_xor_3.f03
  6c2657198caaa08b6452cb68d6a5d9b9  gcc/testsuite/gfortran.dg/dec_math.f90
  11fbf6587979490cca68492521824101  gcc/testsuite/gfortran.dg/dec_math_2.f90
! f007474e5e62779dd82a956460020608  gcc/testsuite/gfortran.dg/dec_math_3.f90
  89e13391077c863487552207c651a1aa  gcc/testsuite/gfortran.dg/dec_math_4.f90
! c72afcd1bf036ac396f29c7e70a4f3bd  gcc/testsuite/gfortran.dg/dec_math_5.f90
  9f5739a83e88bd4a8b6a45ff713e1e4f  gcc/testsuite/gfortran.dg/dec_parameter_1.f
  5d6d04868c5d0b68526b644166397060  gcc/testsuite/gfortran.dg/dec_parameter_2.f90
  fda7b33d4e9546e000649a147e272b6b  gcc/testsuite/gfortran.dg/dec_parameter_3.f90
--- 107604,107613 ----
  7634f260da3c6ee6123a7feaf3e1ab68  gcc/testsuite/gfortran.dg/dec_logical_xor_3.f03
  6c2657198caaa08b6452cb68d6a5d9b9  gcc/testsuite/gfortran.dg/dec_math.f90
  11fbf6587979490cca68492521824101  gcc/testsuite/gfortran.dg/dec_math_2.f90
! 29e815bce13b86ce80bd1fed6e71fc7c  gcc/testsuite/gfortran.dg/dec_math_3.f90
  89e13391077c863487552207c651a1aa  gcc/testsuite/gfortran.dg/dec_math_4.f90
! 4e9c51c540ad0e6488e481ffa53adcb2  gcc/testsuite/gfortran.dg/dec_math_5.f90
! da0272c8efe7f1b873e98e2e83f1bc1b  gcc/testsuite/gfortran.dg/dec_math_6.f90
  9f5739a83e88bd4a8b6a45ff713e1e4f  gcc/testsuite/gfortran.dg/dec_parameter_1.f
  5d6d04868c5d0b68526b644166397060  gcc/testsuite/gfortran.dg/dec_parameter_2.f90
  fda7b33d4e9546e000649a147e272b6b  gcc/testsuite/gfortran.dg/dec_parameter_3.f90
*************** dc7d54ba6e5343392a078289a8be6aa6  gcc/te
*** 109959,109964 ****
--- 110097,110104 ----
  962d8a92334a686213a7137fec487e5c  gcc/testsuite/gfortran.dg/inquiry_type_ref_4.f90
  5bcc839204ebb7bdda5b2971ec2fa18a  gcc/testsuite/gfortran.dg/inquiry_type_ref_5.f90
  ccf33533a999932df9398a5043aa2663  gcc/testsuite/gfortran.dg/inquiry_type_ref_6.f90
+ daf6f0fd151bfeee633990c6a4862e3c  gcc/testsuite/gfortran.dg/inquiry_type_ref_7.f90
+ 7048bef5cd973a2f962aea02fa7739d3  gcc/testsuite/gfortran.dg/inquiry_type_ref_8.f90
  7b3179321b390998d95ad39afea45624  gcc/testsuite/gfortran.dg/int_1.f90
  237886a0b756c8b89a124de63f69aefc  gcc/testsuite/gfortran.dg/int_2.f90
  1c33ddb023260200cdcf3434b09db9b0  gcc/testsuite/gfortran.dg/int_3.f90
*************** acaf66d3dc5deb01e00f08388b6101b3  gcc/te
*** 110065,110070 ****
--- 110205,110211 ----
  a63ff5460cdc25350f43a09d899581db  gcc/testsuite/gfortran.dg/interface_6.f90
  bf9bf5f797c809b218621993da43cbb7  gcc/testsuite/gfortran.dg/interface_60.f90
  85a77119c68cac58df232d99d18cd405  gcc/testsuite/gfortran.dg/interface_61.f90
+ bd1bbf51e59c4440656fb9a45b99f6e0  gcc/testsuite/gfortran.dg/interface_62.f90
  b4d472d28fc0ac004218dc87eb241306  gcc/testsuite/gfortran.dg/interface_7.f90
  9b6e2c6769e8d31142faefbb1e2b8fa0  gcc/testsuite/gfortran.dg/interface_8.f90
  741aacf0bd439f6874a87ea56712aadc  gcc/testsuite/gfortran.dg/interface_9.f90
*************** bfe9a93946cdb6a9b66dd7249e65330d  gcc/te
*** 111337,111344 ****
  f4f853788012858a0134517250a7832c  gcc/testsuite/gfortran.dg/pr119836_3.f90
  a961dfda22a9cdab00655e080457bd32  gcc/testsuite/gfortran.dg/pr119836_4.f90
  8a73c3d21e2517a33bb24d479ee49a4d  gcc/testsuite/gfortran.dg/pr119948.f90
! 0aa06bb713ed3dd03bc512a34518210f  gcc/testsuite/gfortran.dg/pr120049_a.f90
! 38ba5cfd4681c69d997eef7b122252a0  gcc/testsuite/gfortran.dg/pr120049_b.f90
  9cab825b7d82f17e4206621b6f50a699  gcc/testsuite/gfortran.dg/pr120152_1.f90
  e79a5fff5c4841ba8e2da41f54be1c1c  gcc/testsuite/gfortran.dg/pr120152_2.f90
  5b917458eb8d86935d5781cfdfe8f5e7  gcc/testsuite/gfortran.dg/pr120153.f90
--- 111478,111486 ----
  f4f853788012858a0134517250a7832c  gcc/testsuite/gfortran.dg/pr119836_3.f90
  a961dfda22a9cdab00655e080457bd32  gcc/testsuite/gfortran.dg/pr119836_4.f90
  8a73c3d21e2517a33bb24d479ee49a4d  gcc/testsuite/gfortran.dg/pr119948.f90
! b077fcbfe9cec19c19f0cd33e978b948  gcc/testsuite/gfortran.dg/pr120049_2.f90
! 590ff128e6eb7429ddd91a02e4b826c5  gcc/testsuite/gfortran.dg/pr120049_a.f90
! 2b24b9137232d611e7c0b6a8ecf96b4d  gcc/testsuite/gfortran.dg/pr120049_b.f90
  9cab825b7d82f17e4206621b6f50a699  gcc/testsuite/gfortran.dg/pr120152_1.f90
  e79a5fff5c4841ba8e2da41f54be1c1c  gcc/testsuite/gfortran.dg/pr120152_2.f90
  5b917458eb8d86935d5781cfdfe8f5e7  gcc/testsuite/gfortran.dg/pr120153.f90
*************** b5d72ddf37fa215a8a2ba4553362cbfd  gcc/te
*** 115066,115071 ****
--- 115208,115215 ----
  db64b3313172b59590b6f9b32f53a1ce  gcc/testsuite/gm2/pim/fail/shift2.mod
  571ec1fadb9b82dc9bc0fa9c60f3f97d  gcc/testsuite/gm2/pim/fail/strconst.def
  8aa2d8325556f352b6b882fd4cd11895  gcc/testsuite/gm2/pim/fail/subrange7.mod
+ b59f1e85df1cb23494635521d407b761  gcc/testsuite/gm2/pim/fail/testcharint.mod
+ 151cbaca9312ffa2f0ebf171aa2a28e9  gcc/testsuite/gm2/pim/fail/testindrx.mod
  5083c906d07f937882178cefe6402cb6  gcc/testsuite/gm2/pim/fail/tinyadr.mod
  8e5aab038017a365fd18f47d250ad74e  gcc/testsuite/gm2/pim/fail/tinyconst.mod
  fee9872b16570ba80886c91358d5072a  gcc/testsuite/gm2/pim/fail/tinyfor4.mod
*************** fbc17565218bf6416842770d3da67ef5  gcc/te
*** 115088,115093 ****
--- 115232,115239 ----
  7c7c809552d42a50bff70592ebf6b2b0  gcc/testsuite/gm2/pim/options/optimize/run/pass/pim-options-optimize-run-pass.exp
  cee505de5fa1b51118f12fcc7bbed319  gcc/testsuite/gm2/pim/options/optimize/run/pass/testadd.mod
  9b4ff834f4fda732f403341ef20fcb41  gcc/testsuite/gm2/pim/pass/ABSBug.mod
+ ac435dc05f7be0c0c817cd3bc9cfb976  gcc/testsuite/gm2/pim/pass/ReturnType.mod
+ fca677e44c8952272f41abcceed55ab5  gcc/testsuite/gm2/pim/pass/ReturnType2.mod
  e026269fe28e5f09779af73f2cea83b1  gcc/testsuite/gm2/pim/pass/TestLong4.mod
  30a108d56cb05733a64006648ee09503  gcc/testsuite/gm2/pim/pass/TestLong7.mod
  3ca903eb9c23ee2cc7ac89972a5900f1  gcc/testsuite/gm2/pim/pass/TestLong8.mod
*************** cce3b11c80bfaa050f9fcd714bbfec6b  gcc/te
*** 115485,115490 ****
--- 115631,115639 ----
  f9c16774d6b8b09168e5501d129d2b39  gcc/testsuite/gm2/pim/pass/teststdio.mod
  f4f9aa0135b313903e7725725c4385e1  gcc/testsuite/gm2/pim/pass/testvar.mod
  2766ea673865a5df26f15613124635c6  gcc/testsuite/gm2/pim/pass/testvarin.mod
+ df692dcf70e6973b335e42351b4a4f9b  gcc/testsuite/gm2/pim/pass/testxindr.mod
+ dd12697584e19ba55d3242f9922c3789  gcc/testsuite/gm2/pim/pass/testxindr2.mod
+ e0d7532d7c4f6c81574527e57d21470a  gcc/testsuite/gm2/pim/pass/testxindr3.mod
  a3c1301ea024074c9366c4c040c30c58  gcc/testsuite/gm2/pim/pass/timeio.mod
  f9a69e63d5cd69eba1535f2774b2439b  gcc/testsuite/gm2/pim/pass/timeio2.mod
  15a371045a8d153776c3929053091f38  gcc/testsuite/gm2/pim/pass/timeio3.mod
*************** d0480aca937a9fe678328be80c523277  gcc/te
*** 118330,118335 ****
--- 118479,118487 ----
  9a8b9c8338f7df1d565755ffc671257e  gcc/testsuite/gnat.dg/sso16.adb
  fd304d08c4ca43544588bd14358a9c0a  gcc/testsuite/gnat.dg/sso17.adb
  6c87692ce5565e68f354b3b1cb842c39  gcc/testsuite/gnat.dg/sso18.adb
+ cdfa97b1a7bac5b60e459fbf3ee9756c  gcc/testsuite/gnat.dg/sso19.adb
+ 6367b98ba2d81621222585f72f1e5945  gcc/testsuite/gnat.dg/sso19_pkg.adb
+ 7f8cba13ebb19736c7d5565686e47063  gcc/testsuite/gnat.dg/sso19_pkg.ads
  ff784f7bca69d0717e740273960b0387  gcc/testsuite/gnat.dg/sso2.adb
  ccf43eb5df39869bb23ff9110d3b93cb  gcc/testsuite/gnat.dg/sso2.ads
  6fe64945c0d0238672cdece04341c316  gcc/testsuite/gnat.dg/sso3.adb
*************** cde7364d679bf019115a37fca70a6f52  gcc/te
*** 120951,120957 ****
  628b339f01ad2b5a5afbfe6c0220ad31  gcc/testsuite/lib/go-dg.exp
  a658e6e3511698723b87be3277ba706d  gcc/testsuite/lib/go-torture.exp
  450868d4f15f0faade8c693e132ee071  gcc/testsuite/lib/go.exp
! 4d4ee74f8efa14144bb881dddf7109e4  gcc/testsuite/lib/htmltest.py
  8699bdd60911dccd7ce56e96f4032646  gcc/testsuite/lib/hwasan-dg.exp
  570d1ec9b7a393a25ac703df89bbc0ee  gcc/testsuite/lib/lto.exp
  645e8af17b334c4e279636a7b47dacbe  gcc/testsuite/lib/mike-g++.exp
--- 121103,121109 ----
  628b339f01ad2b5a5afbfe6c0220ad31  gcc/testsuite/lib/go-dg.exp
  a658e6e3511698723b87be3277ba706d  gcc/testsuite/lib/go-torture.exp
  450868d4f15f0faade8c693e132ee071  gcc/testsuite/lib/go.exp
! 02cc772d453bb1a08e1225f882b3d895  gcc/testsuite/lib/htmltest.py
  8699bdd60911dccd7ce56e96f4032646  gcc/testsuite/lib/hwasan-dg.exp
  570d1ec9b7a393a25ac703df89bbc0ee  gcc/testsuite/lib/lto.exp
  645e8af17b334c4e279636a7b47dacbe  gcc/testsuite/lib/mike-g++.exp
*************** eb1595e729e2eaac81c7ffe330d8f24e  gcc/te
*** 120991,120997 ****
  f7940f4f8c24d9f0bf4d062473f55777  gcc/testsuite/lib/scanwpaipa.exp
  23e89ca46b182663a4139064b179545f  gcc/testsuite/lib/target-libpath.exp
  d9a6726c38c578e1cd46631ee7f92d0a  gcc/testsuite/lib/target-supports-dg.exp
! aafe97f37150827f05b7bb18a0b8cae3  gcc/testsuite/lib/target-supports.exp
  cfe4a2f0a83382048de060dc6669cbb9  gcc/testsuite/lib/target-utils.exp
  e45ee1a35539730bd823a310ad306ded  gcc/testsuite/lib/timeout-dg.exp
  b755c82fb5ee43ef6c852f23fbdc8704  gcc/testsuite/lib/timeout.exp
--- 121143,121149 ----
  f7940f4f8c24d9f0bf4d062473f55777  gcc/testsuite/lib/scanwpaipa.exp
  23e89ca46b182663a4139064b179545f  gcc/testsuite/lib/target-libpath.exp
  d9a6726c38c578e1cd46631ee7f92d0a  gcc/testsuite/lib/target-supports-dg.exp
! 4deee301121f2a90e9c8bcf047dca363  gcc/testsuite/lib/target-supports.exp
  cfe4a2f0a83382048de060dc6669cbb9  gcc/testsuite/lib/target-utils.exp
  e45ee1a35539730bd823a310ad306ded  gcc/testsuite/lib/timeout-dg.exp
  b755c82fb5ee43ef6c852f23fbdc8704  gcc/testsuite/lib/timeout.exp
*************** b528a0932f50504df146d112f7d01a5c  gcc/tr
*** 123458,123464 ****
  1718a36253ebbb17fe4570fc768216c9  gcc/tree-chrec.cc
  0e4a484c6387f9be0a506783637432f9  gcc/tree-chrec.h
  631f383225878af718642d2a458aefae  gcc/tree-complex.cc
! 1a4cfcc258f7e90de06692e266fb2918  gcc/tree-core.h
  77244f55dae576a255f5b69b70774e54  gcc/tree-data-ref.cc
  e43a555cdaab9a97ba3910364910f865  gcc/tree-data-ref.h
  f01aeac56dffd44808096094e2bf76c1  gcc/tree-dfa.cc
--- 123610,123616 ----
  1718a36253ebbb17fe4570fc768216c9  gcc/tree-chrec.cc
  0e4a484c6387f9be0a506783637432f9  gcc/tree-chrec.h
  631f383225878af718642d2a458aefae  gcc/tree-complex.cc
! 1a9926a2b4d9d10890518028b449835f  gcc/tree-core.h
  77244f55dae576a255f5b69b70774e54  gcc/tree-data-ref.cc
  e43a555cdaab9a97ba3910364910f865  gcc/tree-data-ref.h
  f01aeac56dffd44808096094e2bf76c1  gcc/tree-dfa.cc
*************** e046a9c4874579f81515c4b3d9106b63  gcc/tr
*** 123475,123481 ****
  7e063b1edd28723f3f432596c39cfbee  gcc/tree-hasher.h
  3b55b5e5e173904c824977c38dc00a9c  gcc/tree-if-conv.cc
  002c9568898504ca2025dcacf5151fd6  gcc/tree-if-conv.h
! dbe6b6114696eccb16929a6a255e4cd8  gcc/tree-inline.cc
  326f91431bfd3c15d8ddd74699d666e6  gcc/tree-inline.h
  90ca59c0844cd326f35f9cae17ec174b  gcc/tree-into-ssa.cc
  ef1cb0fba517532ecda9f4e0dd5218f7  gcc/tree-into-ssa.h
--- 123627,123633 ----
  7e063b1edd28723f3f432596c39cfbee  gcc/tree-hasher.h
  3b55b5e5e173904c824977c38dc00a9c  gcc/tree-if-conv.cc
  002c9568898504ca2025dcacf5151fd6  gcc/tree-if-conv.h
! a15ad5f558018215e101a6526b81aac4  gcc/tree-inline.cc
  326f91431bfd3c15d8ddd74699d666e6  gcc/tree-inline.h
  90ca59c0844cd326f35f9cae17ec174b  gcc/tree-into-ssa.cc
  ef1cb0fba517532ecda9f4e0dd5218f7  gcc/tree-into-ssa.h
*************** ef1cb0fba517532ecda9f4e0dd5218f7  gcc/tr
*** 123486,123504 ****
  809e077fea6aa1e38be693ae0a16dee1  gcc/tree-loop-distribution.cc
  62502d6fd9aa927353d7437dc2a6da17  gcc/tree-nested.cc
  b9bad013f5186a6cf78fe8adbe457945  gcc/tree-nested.h
! b32d8d9d2ed18752b632ccafa2e29737  gcc/tree-nrv.cc
  e29c56f554dbdf5acd832105e721212a  gcc/tree-object-size.cc
  2726009c7d301c88845d73276d4dc3b9  gcc/tree-object-size.h
  705de1f086aac33c4497bc30aeb31610  gcc/tree-outof-ssa.cc
  b9d636bd9641f3038bbe37a70684e18e  gcc/tree-outof-ssa.h
  9d8acbaaafb1fa52b064abcc90b3b50c  gcc/tree-parloops.cc
  beaa17685ead93eee17f6373d004c4c4  gcc/tree-parloops.h
! 316bf60cf7fdc1c96eb341a7f0b6bdc2  gcc/tree-pass.h
  3c7e6c651df0a795a0b1b01ca9c75a4d  gcc/tree-phinodes.cc
  460fc341cb2d78f53e0a27c81de36a7d  gcc/tree-phinodes.h
  10ba4bea4c7470735678acc6088c06d5  gcc/tree-predcom.cc
  529cb4117fb3ff7fd899c570bd97e944  gcc/tree-pretty-print-markup.h
! bbbc61c764eab6baf4f05f8c97e7235d  gcc/tree-pretty-print.cc
  fd4dd1219acc650a4f7855faa0097964  gcc/tree-pretty-print.h
  f2fea638426d89fe9ea58081e5c46b3a  gcc/tree-profile.cc
  fba416ae78dc089ae1624feee90fb7ab  gcc/tree-scalar-evolution.cc
--- 123638,123656 ----
  809e077fea6aa1e38be693ae0a16dee1  gcc/tree-loop-distribution.cc
  62502d6fd9aa927353d7437dc2a6da17  gcc/tree-nested.cc
  b9bad013f5186a6cf78fe8adbe457945  gcc/tree-nested.h
! 45fa4d8e792d6ddd01efa95b7e6dd98e  gcc/tree-nrv.cc
  e29c56f554dbdf5acd832105e721212a  gcc/tree-object-size.cc
  2726009c7d301c88845d73276d4dc3b9  gcc/tree-object-size.h
  705de1f086aac33c4497bc30aeb31610  gcc/tree-outof-ssa.cc
  b9d636bd9641f3038bbe37a70684e18e  gcc/tree-outof-ssa.h
  9d8acbaaafb1fa52b064abcc90b3b50c  gcc/tree-parloops.cc
  beaa17685ead93eee17f6373d004c4c4  gcc/tree-parloops.h
! 0224dae246531c3f6a9a0a488efc6fbc  gcc/tree-pass.h
  3c7e6c651df0a795a0b1b01ca9c75a4d  gcc/tree-phinodes.cc
  460fc341cb2d78f53e0a27c81de36a7d  gcc/tree-phinodes.h
  10ba4bea4c7470735678acc6088c06d5  gcc/tree-predcom.cc
  529cb4117fb3ff7fd899c570bd97e944  gcc/tree-pretty-print-markup.h
! 5fdac46b7c48b07cde7b3ee6816d646f  gcc/tree-pretty-print.cc
  fd4dd1219acc650a4f7855faa0097964  gcc/tree-pretty-print.h
  f2fea638426d89fe9ea58081e5c46b3a  gcc/tree-profile.cc
  fba416ae78dc089ae1624feee90fb7ab  gcc/tree-scalar-evolution.cc
*************** be605b5b6cac7c418bd348b54f9d47cf  gcc/tr
*** 123519,123532 ****
  4b3c2e3456bae55a01edd98396b099a1  gcc/tree-ssa-dce.h
  adfc498b0c97a8123c02d418757df496  gcc/tree-ssa-dom.cc
  0046e212ff1b9f3f4d27d055aa299c47  gcc/tree-ssa-dom.h
! ac4bc0bb050755c3e348029c5befafed  gcc/tree-ssa-dse.cc
  a6d83be241a72da1740cf6c5b2ce7d52  gcc/tree-ssa-dse.h
! a698f85f3f3d5b7c0e87e778bd1718f5  gcc/tree-ssa-forwprop.cc
  0915c4bbeb42abdda8799c2b27e5db12  gcc/tree-ssa-ifcombine.cc
  488acc5feebebd58899e9146d82d4af4  gcc/tree-ssa-live.cc
  cf4bde43ab3b843eff45bac243d4116d  gcc/tree-ssa-live.h
  02e9a1bf25d500979aa57640611d72bc  gcc/tree-ssa-loop-ch.cc
! dded0ae90495fa0bc20b75515f44ff61  gcc/tree-ssa-loop-im.cc
  21088fa37f899ccd0056bf3486157db9  gcc/tree-ssa-loop-ivcanon.cc
  df7cccabb4135a99eecc2460dc05e7bb  gcc/tree-ssa-loop-ivopts.cc
  1f70c217ef5bd5f655512b9232754870  gcc/tree-ssa-loop-ivopts.h
--- 123671,123684 ----
  4b3c2e3456bae55a01edd98396b099a1  gcc/tree-ssa-dce.h
  adfc498b0c97a8123c02d418757df496  gcc/tree-ssa-dom.cc
  0046e212ff1b9f3f4d27d055aa299c47  gcc/tree-ssa-dom.h
! 0f6ebc5926581225fb177dc311db6708  gcc/tree-ssa-dse.cc
  a6d83be241a72da1740cf6c5b2ce7d52  gcc/tree-ssa-dse.h
! 69ca90defcef8ccf04da828a8d949c66  gcc/tree-ssa-forwprop.cc
  0915c4bbeb42abdda8799c2b27e5db12  gcc/tree-ssa-ifcombine.cc
  488acc5feebebd58899e9146d82d4af4  gcc/tree-ssa-live.cc
  cf4bde43ab3b843eff45bac243d4116d  gcc/tree-ssa-live.h
  02e9a1bf25d500979aa57640611d72bc  gcc/tree-ssa-loop-ch.cc
! 19ecf917f4744e78f79919216eef6388  gcc/tree-ssa-loop-im.cc
  21088fa37f899ccd0056bf3486157db9  gcc/tree-ssa-loop-ivcanon.cc
  df7cccabb4135a99eecc2460dc05e7bb  gcc/tree-ssa-loop-ivopts.cc
  1f70c217ef5bd5f655512b9232754870  gcc/tree-ssa-loop-ivopts.h
*************** fbcc93539b376489c1256eb8cf2d4800  gcc/tr
*** 123539,123550 ****
  57dcd3919dadb6f23e2bcefe55f7cd14  gcc/tree-ssa-loop-unswitch.cc
  2f97e7f187f4f4cce48b71489ef542a0  gcc/tree-ssa-loop.cc
  538146c17730f67ffcc58afdfcc93712  gcc/tree-ssa-loop.h
! 819958f599a9ce6affe2c76279435a33  gcc/tree-ssa-math-opts.cc
  c0b0549adb2c1140cf285901abb5a78c  gcc/tree-ssa-math-opts.h
  0ed882dedcd92c361bc556587aaa4b74  gcc/tree-ssa-operands.cc
  da72a60de8a6f51a635ead26120d3cc7  gcc/tree-ssa-operands.h
! 256a40dd52f3cef99d5e57620e5c4948  gcc/tree-ssa-phiopt.cc
! 0864f59d85045caee0a643f82fa6d20c  gcc/tree-ssa-phiprop.cc
  2dc49a3648eb85067602e95bd942eb2a  gcc/tree-ssa-pre.cc
  207e8eba5552b33b5aae2de6e7c1f35d  gcc/tree-ssa-propagate.cc
  299c5d8dabcb4a4d30bab51fbedc4e68  gcc/tree-ssa-propagate.h
--- 123691,123702 ----
  57dcd3919dadb6f23e2bcefe55f7cd14  gcc/tree-ssa-loop-unswitch.cc
  2f97e7f187f4f4cce48b71489ef542a0  gcc/tree-ssa-loop.cc
  538146c17730f67ffcc58afdfcc93712  gcc/tree-ssa-loop.h
! d380b6f85525112b40e562d94546fe3f  gcc/tree-ssa-math-opts.cc
  c0b0549adb2c1140cf285901abb5a78c  gcc/tree-ssa-math-opts.h
  0ed882dedcd92c361bc556587aaa4b74  gcc/tree-ssa-operands.cc
  da72a60de8a6f51a635ead26120d3cc7  gcc/tree-ssa-operands.h
! 9a655b07daffd1a35031f99a649952a0  gcc/tree-ssa-phiopt.cc
! 482f2356d81c3633ca476cd6628908b8  gcc/tree-ssa-phiprop.cc
  2dc49a3648eb85067602e95bd942eb2a  gcc/tree-ssa-pre.cc
  207e8eba5552b33b5aae2de6e7c1f35d  gcc/tree-ssa-propagate.cc
  299c5d8dabcb4a4d30bab51fbedc4e68  gcc/tree-ssa-propagate.h
*************** af4c63760c432f66b1c6c8e7e7666699  gcc/tr
*** 123581,123603 ****
  1001d7e4347de60f6d9e93f421ad5d6f  gcc/tree-switch-conversion.cc
  ebb8ac3717c1bf5db4371da2f3cf6af7  gcc/tree-switch-conversion.h
  7286ca79f7a1747d76089d76bc171abd  gcc/tree-tailcall.cc
! 2a9d02531d373e9030a89a8b56a73896  gcc/tree-vect-data-refs.cc
  5d8bb0df796ceea958fd65c5aedb5bce  gcc/tree-vect-generic.cc
  cc0bdf3f684b251509b8552d2d8549a3  gcc/tree-vect-loop-manip.cc
! 52844e104e182fdd3e6bb5d9c826f5a6  gcc/tree-vect-loop.cc
  da6336ee0c69409d59d2599d74cc5717  gcc/tree-vect-patterns.cc
  baa70369c21f662d5e61d1296052d231  gcc/tree-vect-slp-patterns.cc
! 39f80d088fedac688a25df45b3a1a8db  gcc/tree-vect-slp.cc
! fbcd8824f307d22466b149001f07dbac  gcc/tree-vect-stmts.cc
  c8efeee600d612c4bae8dda4bd45ee54  gcc/tree-vector-builder.cc
  258611ff1e83cc7680e8c9f033499665  gcc/tree-vector-builder.h
  a4620080dfbf6757116ace6cfaae648f  gcc/tree-vectorizer.cc
  1e97b9d695553eed3822a8652957ba57  gcc/tree-vectorizer.h
! cb2defb55935eac3f24944ba204230f0  gcc/tree-vrp.cc
  a19edad681d27130bd2a0d83768ac946  gcc/tree-vrp.h
! 415ce023fed5d6876500bc4dcf6c29f8  gcc/tree.cc
! 30b153627c3d353d3d1d7d419396c500  gcc/tree.def
! 271bf6d3776051f12b554ddf50123eda  gcc/tree.h
  b642c83968cda285afc700da2fb276d5  gcc/treestruct.def
  84205f5a5b424f30ce8c527b234e3f94  gcc/tristate.cc
  ea37ace5dddab6f4b2b9608516bebc35  gcc/tristate.h
--- 123733,123755 ----
  1001d7e4347de60f6d9e93f421ad5d6f  gcc/tree-switch-conversion.cc
  ebb8ac3717c1bf5db4371da2f3cf6af7  gcc/tree-switch-conversion.h
  7286ca79f7a1747d76089d76bc171abd  gcc/tree-tailcall.cc
! 1caa0a6844a979f057f1230a923a29f3  gcc/tree-vect-data-refs.cc
  5d8bb0df796ceea958fd65c5aedb5bce  gcc/tree-vect-generic.cc
  cc0bdf3f684b251509b8552d2d8549a3  gcc/tree-vect-loop-manip.cc
! 74ef1ea5c410a50a0742a2f04c2b11a9  gcc/tree-vect-loop.cc
  da6336ee0c69409d59d2599d74cc5717  gcc/tree-vect-patterns.cc
  baa70369c21f662d5e61d1296052d231  gcc/tree-vect-slp-patterns.cc
! c2d8929f6d6edd9804d3f9736a1928ce  gcc/tree-vect-slp.cc
! 11618946c6f0797979d1478d40f5b3b0  gcc/tree-vect-stmts.cc
  c8efeee600d612c4bae8dda4bd45ee54  gcc/tree-vector-builder.cc
  258611ff1e83cc7680e8c9f033499665  gcc/tree-vector-builder.h
  a4620080dfbf6757116ace6cfaae648f  gcc/tree-vectorizer.cc
  1e97b9d695553eed3822a8652957ba57  gcc/tree-vectorizer.h
! 1bed475667cbd8dee00c3b7da964ca5b  gcc/tree-vrp.cc
  a19edad681d27130bd2a0d83768ac946  gcc/tree-vrp.h
! bfca89f89db797ca2d3bd8f01de95e48  gcc/tree.cc
! 2b3067f4ee14760d08fdfee4eb6b8a00  gcc/tree.def
! bbe477ec66fdc58d5448219647183eda  gcc/tree.h
  b642c83968cda285afc700da2fb276d5  gcc/treestruct.def
  84205f5a5b424f30ce8c527b234e3f94  gcc/tristate.cc
  ea37ace5dddab6f4b2b9608516bebc35  gcc/tristate.h
*************** e3fa3f45e512510e34655f420629cbd8  gcc/wa
*** 123649,123654 ****
--- 123801,123808 ----
  88adca0d34004d3f3c8775540086085e  gcc/wide-int.cc
  4fc8c5d5a4dbeb10715da964977f1c81  gcc/wide-int.h
  818a3384157138e5a3f6fbc6368d2b11  gcc/xcoff.h
+ 3ed8fd509bbf160b502fe7e9e2e4c2c5  gcc/xml-printer.h
+ 532976101da1840b74721d5ded6dfc25  gcc/xml.h
  172b2c568a40257f5c2537762154fa0b  gnattools/ChangeLog
  d8c97efb6bf9731cb774fb1b1b60a266  gnattools/Makefile.in
  813c7b1a065693bfcbc0b340b658fa5a  gnattools/configure
*************** c4e8176c1964a5ebe0a55900f2141299  gotool
*** 123664,123670 ****
  eb2aeb3a6cffe7b26a8f1c8a2da23dcd  gotools/gofmt.1
  59530bdf33659b29e73d4adb9f9f6552  include/COPYING
  d32239bcb673463ab874e80d47fae504  include/COPYING3
! 62cf92b2b85d9ae606d261998e4cd83a  include/ChangeLog
  4263432a72ff47ed8bf420208ee7eea5  include/ChangeLog-9103
  a43d76108493b20da790f953f829c6a5  include/ChangeLog.jit
  44b123c52a2755c9e6bf43ec0c33ae49  include/ansidecl.h
--- 123818,123824 ----
  eb2aeb3a6cffe7b26a8f1c8a2da23dcd  gotools/gofmt.1
  59530bdf33659b29e73d4adb9f9f6552  include/COPYING
  d32239bcb673463ab874e80d47fae504  include/COPYING3
! d255c4b2b46cb2adbce2b5b091a31495  include/ChangeLog
  4263432a72ff47ed8bf420208ee7eea5  include/ChangeLog-9103
  a43d76108493b20da790f953f829c6a5  include/ChangeLog.jit
  44b123c52a2755c9e6bf43ec0c33ae49  include/ansidecl.h
*************** f69c85bce2eefec959834977b0e363aa  includ
*** 123688,123694 ****
  e27e2525cf1fed8c89039e133b1e2c85  include/gcc-interface.h
  694b878ad158b166bb65de38ff902f39  include/gdb/gdb-index.h
  c67dacb4baed3b58603898c91e8b3a43  include/getopt.h
! 0419604485a5e70c17c71a998a9875a6  include/gomp-constants.h
  94b47e7bd114c7bfa9d2eb1ffc606526  include/hashtab.h
  a60e7538de6c6058ce9da2c087d4f509  include/hsa.h
  add6cc404aee74ef33ad44cf7930a899  include/hsa_ext_amd.h
--- 123842,123848 ----
  e27e2525cf1fed8c89039e133b1e2c85  include/gcc-interface.h
  694b878ad158b166bb65de38ff902f39  include/gdb/gdb-index.h
  c67dacb4baed3b58603898c91e8b3a43  include/getopt.h
! 888b2635636e8d809997a21f6333ef01  include/gomp-constants.h
  94b47e7bd114c7bfa9d2eb1ffc606526  include/hashtab.h
  a60e7538de6c6058ce9da2c087d4f509  include/hsa.h
  add6cc404aee74ef33ad44cf7930a899  include/hsa_ext_amd.h
*************** a3eb5dee2788fe0a6c42502ba658eddd  libffi
*** 124449,124455 ****
  0f3c94e520870e194cf525de7ec404dc  libffi/testsuite/libffi.go/ffitest.h
  6cfb66c1c00023abb2c2276d85f16e77  libffi/testsuite/libffi.go/go.exp
  189dc193fd0e627a2d55b2e84871edc5  libffi/testsuite/libffi.go/static-chain.h
! f89178c2bbc924180ee712bfaa8dce72  libgcc/ChangeLog
  b1229d68a3a67c6e30daf30379e7bb8f  libgcc/Makefile.in
  66cc3d23127b54e932766f13d603ec3d  libgcc/config.host
  46412830a2ee8a02503ccc921912c3cf  libgcc/config.in
--- 124603,124609 ----
  0f3c94e520870e194cf525de7ec404dc  libffi/testsuite/libffi.go/ffitest.h
  6cfb66c1c00023abb2c2276d85f16e77  libffi/testsuite/libffi.go/go.exp
  189dc193fd0e627a2d55b2e84871edc5  libffi/testsuite/libffi.go/static-chain.h
! 6d7336828e4b7ba6e44945786de20240  libgcc/ChangeLog
  b1229d68a3a67c6e30daf30379e7bb8f  libgcc/Makefile.in
  66cc3d23127b54e932766f13d603ec3d  libgcc/config.host
  46412830a2ee8a02503ccc921912c3cf  libgcc/config.in
*************** b38cbc5c54988720ae33d36a2ff78fd3  libgcc
*** 124595,124615 ****
  5ab16e6eec7523296afc7c8bfee38565  libgcc/config/avr/lib1funcs.S
  622f81485f02d0eac2caaafa7d3a2fd1  libgcc/config/avr/lib2-object.mk
  e6604d88f15777c25f5d887ca1f9148c  libgcc/config/avr/lib2funcs.c
! bbc9be0dbe25f7a80d79f2142f440a70  libgcc/config/avr/libf7/ChangeLog
  dd74908d3b47db38a7aaa2e9f130f20f  libgcc/config/avr/libf7/asm-defs.h
! 3103440dc20d49809c04a54b365507d7  libgcc/config/avr/libf7/f7-renames.h
! bbf6f4b2dc04ce0f729b2cde8dd85995  libgcc/config/avr/libf7/f7-wraps.h
! c0d4a5a9b2844505ec941ff60cae008f  libgcc/config/avr/libf7/f7renames.sh
  76d89fdf12c2153d7cf3d12c025a8713  libgcc/config/avr/libf7/f7wraps.sh
  b77774db3e278767f77ced55b8e1fe89  libgcc/config/avr/libf7/libf7-array.def
  5d9def53110ec07e8f29e66d593d758f  libgcc/config/avr/libf7/libf7-asm-object.mk
  ec9b30a882ac6a7401555a33253eb439  libgcc/config/avr/libf7/libf7-asm.sx
  6b4886ae302fca1fa733831066c5c830  libgcc/config/avr/libf7/libf7-c-object.mk
! 47dccabf16372b55fb7154bd70ce141f  libgcc/config/avr/libf7/libf7-common.mk
  29f415bcdf1f8cf82363009ed90158a0  libgcc/config/avr/libf7/libf7-const.def
  4be27333f32f04990c0af746c07ffd5d  libgcc/config/avr/libf7/libf7-constdef.h
! 8624b35b63a7f1a504184c87a54d1d6a  libgcc/config/avr/libf7/libf7.c
! 8e9057f6203221845c4aec6f2c3826df  libgcc/config/avr/libf7/libf7.h
  2921a86fef727ada45668b8c0f091e33  libgcc/config/avr/libf7/t-libf7
  bf9360cfc14e0b0129af5560893f374e  libgcc/config/avr/libf7/t-libf7-math
  761826027ebb1cfbb089d23904494606  libgcc/config/avr/libf7/t-libf7-math-symbols
--- 124749,124769 ----
  5ab16e6eec7523296afc7c8bfee38565  libgcc/config/avr/lib1funcs.S
  622f81485f02d0eac2caaafa7d3a2fd1  libgcc/config/avr/lib2-object.mk
  e6604d88f15777c25f5d887ca1f9148c  libgcc/config/avr/lib2funcs.c
! 46687607f9c28d82f0df88c7015113a6  libgcc/config/avr/libf7/ChangeLog
  dd74908d3b47db38a7aaa2e9f130f20f  libgcc/config/avr/libf7/asm-defs.h
! a5efc328f8686b92830ca73ea0b4d047  libgcc/config/avr/libf7/f7-renames.h
! 9bc93ce2b7213ad3cabff898a2d31774  libgcc/config/avr/libf7/f7-wraps.h
! b9901623ec29c1c4dd98d6fae040518c  libgcc/config/avr/libf7/f7renames.sh
  76d89fdf12c2153d7cf3d12c025a8713  libgcc/config/avr/libf7/f7wraps.sh
  b77774db3e278767f77ced55b8e1fe89  libgcc/config/avr/libf7/libf7-array.def
  5d9def53110ec07e8f29e66d593d758f  libgcc/config/avr/libf7/libf7-asm-object.mk
  ec9b30a882ac6a7401555a33253eb439  libgcc/config/avr/libf7/libf7-asm.sx
  6b4886ae302fca1fa733831066c5c830  libgcc/config/avr/libf7/libf7-c-object.mk
! 8c31d45420a77d0121484bfbb4e9304c  libgcc/config/avr/libf7/libf7-common.mk
  29f415bcdf1f8cf82363009ed90158a0  libgcc/config/avr/libf7/libf7-const.def
  4be27333f32f04990c0af746c07ffd5d  libgcc/config/avr/libf7/libf7-constdef.h
! ec9773d81bd91f723677eed83c9e9e33  libgcc/config/avr/libf7/libf7.c
! 96bca6a7335f821140d30c203401c36e  libgcc/config/avr/libf7/libf7.h
  2921a86fef727ada45668b8c0f091e33  libgcc/config/avr/libf7/t-libf7
  bf9360cfc14e0b0129af5560893f374e  libgcc/config/avr/libf7/t-libf7-math
  761826027ebb1cfbb089d23904494606  libgcc/config/avr/libf7/t-libf7-math-symbols
*************** eb3161bf886026cdcf8a78cea885fdd2  libgcc
*** 125731,125737 ****
  b5d3fe85dff400a82befa6b901b438ec  libgcc/config/t-slibgcc-nolc-override
  bb217aa78bbf6b6a7c7844f73152110d  libgcc/config/t-slibgcc-sld
  ff76526856565673089b174b185fab45  libgcc/config/t-slibgcc-vms
! 728706cea0cc1b4dba4d73e79ffe9aeb  libgcc/config/t-softfp
  1ec9425eada0171d381f5f9b47b613a9  libgcc/config/t-softfp-compat
  72f41afb67b3c3c67809819763244452  libgcc/config/t-softfp-excl
  14ecf481060b3893ba43c6e09ff40eab  libgcc/config/t-softfp-sfdf
--- 125885,125891 ----
  b5d3fe85dff400a82befa6b901b438ec  libgcc/config/t-slibgcc-nolc-override
  bb217aa78bbf6b6a7c7844f73152110d  libgcc/config/t-slibgcc-sld
  ff76526856565673089b174b185fab45  libgcc/config/t-slibgcc-vms
! 7116c3b0824ae4ff7d3e58ab2e390fda  libgcc/config/t-softfp
  1ec9425eada0171d381f5f9b47b613a9  libgcc/config/t-softfp-compat
  72f41afb67b3c3c67809819763244452  libgcc/config/t-softfp-excl
  14ecf481060b3893ba43c6e09ff40eab  libgcc/config/t-softfp-sfdf
*************** de96265c7729e32d34788d54b20167e0  libgcc
*** 125834,125841 ****
  b501abcd327c6d2c95f76d40d4266a4e  libgcc/soft-fp/adddf3.c
  305a99dae8d1353c9137371842d1a94a  libgcc/soft-fp/addsf3.c
  fe381f26f76f7f8998160bba0429aa49  libgcc/soft-fp/addtf3.c
! a1277bec9c4f2affe32b91e14dc1eb72  libgcc/soft-fp/bitint.h
! d86da8fd88c560243cc2d5c29e7d9caf  libgcc/soft-fp/bitintpow10.c
  0df1c9dddd6ff4f1de4b75bb05f87fd7  libgcc/soft-fp/bitintpow10.h
  1b314340a7e13d053c2234216b9b01fe  libgcc/soft-fp/brain.h
  2386952f10f05ef43a443fcc7227885f  libgcc/soft-fp/divdf3.c
--- 125988,125995 ----
  b501abcd327c6d2c95f76d40d4266a4e  libgcc/soft-fp/adddf3.c
  305a99dae8d1353c9137371842d1a94a  libgcc/soft-fp/addsf3.c
  fe381f26f76f7f8998160bba0429aa49  libgcc/soft-fp/addtf3.c
! 9eb8a8f79f887ec39cb571fbd1c83e65  libgcc/soft-fp/bitint.h
! 3e9aa45a76cbe4c6797e817d110a591d  libgcc/soft-fp/bitintpow10.c
  0df1c9dddd6ff4f1de4b75bb05f87fd7  libgcc/soft-fp/bitintpow10.h
  1b314340a7e13d053c2234216b9b01fe  libgcc/soft-fp/brain.h
  2386952f10f05ef43a443fcc7227885f  libgcc/soft-fp/divdf3.c
*************** efe1642746afadab822e08839d276498  libgcc
*** 125856,125863 ****
  66340c3328535b5f6e68ddc9db4efb09  libgcc/soft-fp/extendsfdf2.c
  78f440be9e0f50b1f4162f5732b660e1  libgcc/soft-fp/extendsftf2.c
  8374c48f9513f1ff2bed38a1563c9ade  libgcc/soft-fp/extendxftf2.c
! 614b02ac7496ccd3800e4887ef92ce65  libgcc/soft-fp/fixddbitint.c
! d5b92b2d4367d46734a82308285dfdb5  libgcc/soft-fp/fixddti.c
  9b7084cd807529338f94206e941c9a7d  libgcc/soft-fp/fixdfbitint.c
  1d66e1f4ca287eb6fccf875f0db91236  libgcc/soft-fp/fixdfdi.c
  e0442ba7e2c2f461c4a660a661c279d5  libgcc/soft-fp/fixdfsi.c
--- 126010,126017 ----
  66340c3328535b5f6e68ddc9db4efb09  libgcc/soft-fp/extendsfdf2.c
  78f440be9e0f50b1f4162f5732b660e1  libgcc/soft-fp/extendsftf2.c
  8374c48f9513f1ff2bed38a1563c9ade  libgcc/soft-fp/extendxftf2.c
! e4e4eeacb65c8206fab82eb665002a56  libgcc/soft-fp/fixddbitint.c
! bae270daf9fc0247f7ca7cce9e36606f  libgcc/soft-fp/fixddti.c
  9b7084cd807529338f94206e941c9a7d  libgcc/soft-fp/fixdfbitint.c
  1d66e1f4ca287eb6fccf875f0db91236  libgcc/soft-fp/fixdfdi.c
  e0442ba7e2c2f461c4a660a661c279d5  libgcc/soft-fp/fixdfsi.c
*************** e0442ba7e2c2f461c4a660a661c279d5  libgcc
*** 125865,125905 ****
  be2495fa4c655c1d61addf11f714dd26  libgcc/soft-fp/fixhfdi.c
  4884866175e9676bd6aa1210b20c5773  libgcc/soft-fp/fixhfsi.c
  f35c3d1edd76cb9ba029a92a1405338a  libgcc/soft-fp/fixhfti.c
! 38da2d6fd365702be35792bd2ae86944  libgcc/soft-fp/fixsdbitint.c
! 7774ace7174806629eef7b5437ef5c72  libgcc/soft-fp/fixsdti.c
  a69c115ca8ca953992c25396b2d932e0  libgcc/soft-fp/fixsfbitint.c
  440f8346f68db4efb08b00fe172edb50  libgcc/soft-fp/fixsfdi.c
  767943fe3923c0a1766d923e07c8c334  libgcc/soft-fp/fixsfsi.c
  244dace544760e31a58cb24edda75ab7  libgcc/soft-fp/fixsfti.c
! bfa788f0c36fbaa7864252bd05609112  libgcc/soft-fp/fixtdbitint.c
! 99b62d38fdfb9556eab9ebf8d64b2c9b  libgcc/soft-fp/fixtdti.c
  0b2caa247b80db2f1c0af8921eb3fffd  libgcc/soft-fp/fixtfbitint.c
  405551d1a6fcc6aece0a6e16e5e244f9  libgcc/soft-fp/fixtfdi.c
  6ab5656d92048e6656e2fe0de73e4c44  libgcc/soft-fp/fixtfsi.c
  7082436c92df5b85ae94b9495ad464c1  libgcc/soft-fp/fixtfti.c
! af5ca70de54d8c7df0222ea76a01c83f  libgcc/soft-fp/fixunsddti.c
  57898d3ff8cc90376db235567c29e948  libgcc/soft-fp/fixunsdfdi.c
  ada53bc7756387a8502e2507720b035f  libgcc/soft-fp/fixunsdfsi.c
  3a8f37c1361812154996da1a5e9599f4  libgcc/soft-fp/fixunsdfti.c
  21fe23f358f61a4e26d29b11e6d0f7e6  libgcc/soft-fp/fixunshfdi.c
  9d9677c6da96142038aa3251ac82be71  libgcc/soft-fp/fixunshfsi.c
  ca7d48b7d45390b3df9e82c2f30f36dd  libgcc/soft-fp/fixunshfti.c
! 618609eb7afa1e3abc6af5a5c483ea24  libgcc/soft-fp/fixunssdti.c
  f72d40f70dcd4ab269b0e2244932c2ea  libgcc/soft-fp/fixunssfdi.c
  73b77e9508be3df7ef3dedca5eef5fb5  libgcc/soft-fp/fixunssfsi.c
  a8e89d494f10e00744b973ef74e03630  libgcc/soft-fp/fixunssfti.c
! d75378b78259fb6ce7e9bbcdc4afeddc  libgcc/soft-fp/fixunstdti.c
  556a22ddec531aed905074a8ea139a68  libgcc/soft-fp/fixunstfdi.c
  c7baaf1dede8faef62bc97069e3a86dc  libgcc/soft-fp/fixunstfsi.c
  64ec2ba422a53cee91738d36152761ff  libgcc/soft-fp/fixunstfti.c
  71f5d551c8220bb6bae49ae9844ee3ef  libgcc/soft-fp/fixxfbitint.c
  2f65d16fe846139ca2fea2b0bc6e1eb8  libgcc/soft-fp/floatbitintbf.c
! c0681473d948d312312e5fcc8c5eedf9  libgcc/soft-fp/floatbitintdd.c
  d6b9ae9c4e25f67dadc41d8a09c84e04  libgcc/soft-fp/floatbitintdf.c
  ca806b79a546199d74b76d72af9fe97c  libgcc/soft-fp/floatbitinthf.c
! b549586c0fea79a1eeec50668390a337  libgcc/soft-fp/floatbitintsd.c
  4450c34038f0cf95075cfc4acb83147b  libgcc/soft-fp/floatbitintsf.c
! 48c90a4a60f91d2506ea74bd9d2c0dce  libgcc/soft-fp/floatbitinttd.c
  e34cf3c7fec37ae2be10b5ca0b40b257  libgcc/soft-fp/floatbitinttf.c
  e99db9782e77a9096d87e8a9bf4d52cc  libgcc/soft-fp/floatbitintxf.c
  e1aba14c8b19b67e96db9f797148af40  libgcc/soft-fp/floatdibf.c
--- 126019,126059 ----
  be2495fa4c655c1d61addf11f714dd26  libgcc/soft-fp/fixhfdi.c
  4884866175e9676bd6aa1210b20c5773  libgcc/soft-fp/fixhfsi.c
  f35c3d1edd76cb9ba029a92a1405338a  libgcc/soft-fp/fixhfti.c
! 5d66af3e2606f2cc11f8634df23e83e2  libgcc/soft-fp/fixsdbitint.c
! 4abefb193a253b2b8ef4e268ff1f8fc3  libgcc/soft-fp/fixsdti.c
  a69c115ca8ca953992c25396b2d932e0  libgcc/soft-fp/fixsfbitint.c
  440f8346f68db4efb08b00fe172edb50  libgcc/soft-fp/fixsfdi.c
  767943fe3923c0a1766d923e07c8c334  libgcc/soft-fp/fixsfsi.c
  244dace544760e31a58cb24edda75ab7  libgcc/soft-fp/fixsfti.c
! 29e5c634f685a0811f0ffcb89d665ba2  libgcc/soft-fp/fixtdbitint.c
! c8a666ec85411450698fc9d22ec1d492  libgcc/soft-fp/fixtdti.c
  0b2caa247b80db2f1c0af8921eb3fffd  libgcc/soft-fp/fixtfbitint.c
  405551d1a6fcc6aece0a6e16e5e244f9  libgcc/soft-fp/fixtfdi.c
  6ab5656d92048e6656e2fe0de73e4c44  libgcc/soft-fp/fixtfsi.c
  7082436c92df5b85ae94b9495ad464c1  libgcc/soft-fp/fixtfti.c
! 7b14f00d7e5aa14fbcf0536e44a65154  libgcc/soft-fp/fixunsddti.c
  57898d3ff8cc90376db235567c29e948  libgcc/soft-fp/fixunsdfdi.c
  ada53bc7756387a8502e2507720b035f  libgcc/soft-fp/fixunsdfsi.c
  3a8f37c1361812154996da1a5e9599f4  libgcc/soft-fp/fixunsdfti.c
  21fe23f358f61a4e26d29b11e6d0f7e6  libgcc/soft-fp/fixunshfdi.c
  9d9677c6da96142038aa3251ac82be71  libgcc/soft-fp/fixunshfsi.c
  ca7d48b7d45390b3df9e82c2f30f36dd  libgcc/soft-fp/fixunshfti.c
! f7beeb428a75bbe9626fa798093e2782  libgcc/soft-fp/fixunssdti.c
  f72d40f70dcd4ab269b0e2244932c2ea  libgcc/soft-fp/fixunssfdi.c
  73b77e9508be3df7ef3dedca5eef5fb5  libgcc/soft-fp/fixunssfsi.c
  a8e89d494f10e00744b973ef74e03630  libgcc/soft-fp/fixunssfti.c
! f7238b1664481733665ab73e2da4d9fd  libgcc/soft-fp/fixunstdti.c
  556a22ddec531aed905074a8ea139a68  libgcc/soft-fp/fixunstfdi.c
  c7baaf1dede8faef62bc97069e3a86dc  libgcc/soft-fp/fixunstfsi.c
  64ec2ba422a53cee91738d36152761ff  libgcc/soft-fp/fixunstfti.c
  71f5d551c8220bb6bae49ae9844ee3ef  libgcc/soft-fp/fixxfbitint.c
  2f65d16fe846139ca2fea2b0bc6e1eb8  libgcc/soft-fp/floatbitintbf.c
! 5e7ac6467c7e49fcc74191320ef2126b  libgcc/soft-fp/floatbitintdd.c
  d6b9ae9c4e25f67dadc41d8a09c84e04  libgcc/soft-fp/floatbitintdf.c
  ca806b79a546199d74b76d72af9fe97c  libgcc/soft-fp/floatbitinthf.c
! 19bdada8e4d3baae9fb468abae456734  libgcc/soft-fp/floatbitintsd.c
  4450c34038f0cf95075cfc4acb83147b  libgcc/soft-fp/floatbitintsf.c
! 065990cdb8d87cd5958051b4aeb1af5c  libgcc/soft-fp/floatbitinttd.c
  e34cf3c7fec37ae2be10b5ca0b40b257  libgcc/soft-fp/floatbitinttf.c
  e99db9782e77a9096d87e8a9bf4d52cc  libgcc/soft-fp/floatbitintxf.c
  e1aba14c8b19b67e96db9f797148af40  libgcc/soft-fp/floatdibf.c
*************** f85e25a797c23cce258273754ddec970  libgcc
*** 125913,125924 ****
  54b4c5443e79e51443d4fad220bc2efd  libgcc/soft-fp/floatsisf.c
  8c77a60f0cb82b4a03aaa604111c3917  libgcc/soft-fp/floatsitf.c
  2bae6ee688abda61b223fbf5b25717c1  libgcc/soft-fp/floattibf.c
! 4f93dee1d8259062de7ce3af92233e39  libgcc/soft-fp/floattidd.c
  5b4ee2ed81bcc63bd1d9e4bb9b67cf8a  libgcc/soft-fp/floattidf.c
  06cdbcfb2194128912579a06c8f42382  libgcc/soft-fp/floattihf.c
! 5897bbc2dfc0f13d19063ff33cfeda69  libgcc/soft-fp/floattisd.c
  6e719ab7cae6203215443826f176392d  libgcc/soft-fp/floattisf.c
! 02f30ff7220cafc12e4e9efb8c55e5ee  libgcc/soft-fp/floattitd.c
  a9a45db6ebbb0bbf20a2f595b2ac714d  libgcc/soft-fp/floattitf.c
  be1a053bdfcb6c04a22e60ad1700a803  libgcc/soft-fp/floatundibf.c
  c8c37355af10b7e73d8dd055f5fec1d1  libgcc/soft-fp/floatundidf.c
--- 126067,126078 ----
  54b4c5443e79e51443d4fad220bc2efd  libgcc/soft-fp/floatsisf.c
  8c77a60f0cb82b4a03aaa604111c3917  libgcc/soft-fp/floatsitf.c
  2bae6ee688abda61b223fbf5b25717c1  libgcc/soft-fp/floattibf.c
! 26628922897dfafb2192a91b8a40be20  libgcc/soft-fp/floattidd.c
  5b4ee2ed81bcc63bd1d9e4bb9b67cf8a  libgcc/soft-fp/floattidf.c
  06cdbcfb2194128912579a06c8f42382  libgcc/soft-fp/floattihf.c
! 551ce7f1f1f870ce67207f34560310e1  libgcc/soft-fp/floattisd.c
  6e719ab7cae6203215443826f176392d  libgcc/soft-fp/floattisf.c
! 04e27fd214e280f95a3dcc3ad6597163  libgcc/soft-fp/floattitd.c
  a9a45db6ebbb0bbf20a2f595b2ac714d  libgcc/soft-fp/floattitf.c
  be1a053bdfcb6c04a22e60ad1700a803  libgcc/soft-fp/floatundibf.c
  c8c37355af10b7e73d8dd055f5fec1d1  libgcc/soft-fp/floatundidf.c
*************** cc4e37dc543a3767b463816094f3c0b9  libgcc
*** 125931,125942 ****
  a32ae0cec8bb9ac510eaf6f3c72fb19c  libgcc/soft-fp/floatunsisf.c
  75f27d311c21a9e7d716bc4d3b4f4e3b  libgcc/soft-fp/floatunsitf.c
  a96996bf9295a924afc141cd5d6b0f6d  libgcc/soft-fp/floatuntibf.c
! d21150feed47dc71ba378957abaeb181  libgcc/soft-fp/floatuntidd.c
  c95a41904ff52abb3a4a89a598e7424d  libgcc/soft-fp/floatuntidf.c
  be697682ed2a5184039fc8ca04c59be7  libgcc/soft-fp/floatuntihf.c
! b831af306bdeb9bea3c7f5d8510e9e0a  libgcc/soft-fp/floatuntisd.c
  b0e6031ca3ec610e349ff2abc3d12622  libgcc/soft-fp/floatuntisf.c
! 445d96fd26d036f013fd9cabf215f69a  libgcc/soft-fp/floatuntitd.c
  a73152ad84ccafda24237cacca1f4e2d  libgcc/soft-fp/floatuntitf.c
  295099b34643dc167502a661f4a3739b  libgcc/soft-fp/gedf2.c
  a55cc715e80d85457942c40067b65a87  libgcc/soft-fp/gesf2.c
--- 126085,126096 ----
  a32ae0cec8bb9ac510eaf6f3c72fb19c  libgcc/soft-fp/floatunsisf.c
  75f27d311c21a9e7d716bc4d3b4f4e3b  libgcc/soft-fp/floatunsitf.c
  a96996bf9295a924afc141cd5d6b0f6d  libgcc/soft-fp/floatuntibf.c
! 68dd7cc92eb8caa2d68484431b9cf82e  libgcc/soft-fp/floatuntidd.c
  c95a41904ff52abb3a4a89a598e7424d  libgcc/soft-fp/floatuntidf.c
  be697682ed2a5184039fc8ca04c59be7  libgcc/soft-fp/floatuntihf.c
! ecca258019ae5fbca5b44759bfb8ac87  libgcc/soft-fp/floatuntisd.c
  b0e6031ca3ec610e349ff2abc3d12622  libgcc/soft-fp/floatuntisf.c
! 762c53a22c72c9c641f030f3a042661a  libgcc/soft-fp/floatuntitd.c
  a73152ad84ccafda24237cacca1f4e2d  libgcc/soft-fp/floatuntitf.c
  295099b34643dc167502a661f4a3739b  libgcc/soft-fp/gedf2.c
  a55cc715e80d85457942c40067b65a87  libgcc/soft-fp/gesf2.c
*************** c452346edcf88bc8ab6ef406a68080a7  libgco
*** 126032,126038 ****
  0cf9ce2863c11a8fd875185c371fe6e6  libgcobol/io.cc
  b054056cc4fe4de7a78d34e43f2f3bab  libgcobol/io.h
  6fa2e26d11c71898dae520939b992484  libgcobol/libgcobol-fp.h
! 15e7de0bbfd51efecba4824d8b2c8f5d  libgcobol/libgcobol.cc
  a92501f6652c6261f981817076ae3254  libgcobol/libgcobol.h
  469e0f6e21e357ff8b53b9d17373a6c8  libgcobol/libgcobol.spec.in
  78eae29429f976b3df0dd2d9df4a2193  libgcobol/valconv.cc
--- 126186,126192 ----
  0cf9ce2863c11a8fd875185c371fe6e6  libgcobol/io.cc
  b054056cc4fe4de7a78d34e43f2f3bab  libgcobol/io.h
  6fa2e26d11c71898dae520939b992484  libgcobol/libgcobol-fp.h
! 6b4abab251a709804127a341160cc352  libgcobol/libgcobol.cc
  a92501f6652c6261f981817076ae3254  libgcobol/libgcobol.h
  469e0f6e21e357ff8b53b9d17373a6c8  libgcobol/libgcobol.spec.in
  78eae29429f976b3df0dd2d9df4a2193  libgcobol/valconv.cc
*************** a3a7e9ca6057da9ca42e03e41e1c73f7  libgo/
*** 132598,132604 ****
  dcdf1b680b15b372bdb64cc5107d51b6  libgo/testsuite/libgo-test-support.exp.in
  bf162aa572f7b96b25dbd2b027845d32  libgo/testsuite/libgo.testmain/testmain.exp
  cc9d2a0e34e31ba866a8caf9f46f48f3  libgomp/.gitattributes
! d5e00171faacd4ab21ff8d92b04bd5a1  libgomp/ChangeLog
  0d55aa862aee66efdc5f8d62c94ff8fb  libgomp/ChangeLog.graphite
  883cfea6de23904b83d6bd58a729c866  libgomp/Makefile.am
  54c7bc8277669e3bf5f1a3db179ae206  libgomp/Makefile.in
--- 132752,132758 ----
  dcdf1b680b15b372bdb64cc5107d51b6  libgo/testsuite/libgo-test-support.exp.in
  bf162aa572f7b96b25dbd2b027845d32  libgo/testsuite/libgo.testmain/testmain.exp
  cc9d2a0e34e31ba866a8caf9f46f48f3  libgomp/.gitattributes
! 23f93a1e2ea2750012773a409106a8e5  libgomp/ChangeLog
  0d55aa862aee66efdc5f8d62c94ff8fb  libgomp/ChangeLog.graphite
  883cfea6de23904b83d6bd58a729c866  libgomp/Makefile.am
  54c7bc8277669e3bf5f1a3db179ae206  libgomp/Makefile.in
*************** f4c32f19e8df86d2ac9c3d4cc4e788f1  libgom
*** 132737,132747 ****
  c798aea0a594e97c71edb3bd8cb93579  libgomp/iter.c
  c3d837ee5481f078c8b7875c1c8306be  libgomp/iter_ull.c
  0214d07a09a5c6e422ca9541c3f6cba4  libgomp/libgomp-plugin.c
! 1aa4ba0a2ee049ea5df6f42bca4e756e  libgomp/libgomp-plugin.h
! 69e5cac35d68ce6db01326f45f2fc005  libgomp/libgomp.h
! 794094e4a415fa9d14baf5f132c3d098  libgomp/libgomp.map
  8b2aa50aecad82171348a6918309afd6  libgomp/libgomp.spec.in
! 407d25c7bf887d85293fd46c20e6021d  libgomp/libgomp.texi
  519d28879206bae759d85cd3bb7b493b  libgomp/libgomp_f.h.in
  fdadcc861565b686070908326f5e5914  libgomp/libgomp_g.h
  a5060d745455b036a62cc46de1fe0576  libgomp/lock.c
--- 132891,132901 ----
  c798aea0a594e97c71edb3bd8cb93579  libgomp/iter.c
  c3d837ee5481f078c8b7875c1c8306be  libgomp/iter_ull.c
  0214d07a09a5c6e422ca9541c3f6cba4  libgomp/libgomp-plugin.c
! e1c9e7654ef894ec21f40582e0d7f0d5  libgomp/libgomp-plugin.h
! 5495bce7ebe90689b3e7213f8dd34827  libgomp/libgomp.h
! c2271585c33cfaeb8d6cade91601376a  libgomp/libgomp.map
  8b2aa50aecad82171348a6918309afd6  libgomp/libgomp.spec.in
! 2d209f6d15ff305897fab02c733d54ca  libgomp/libgomp.texi
  519d28879206bae759d85cd3bb7b493b  libgomp/libgomp_f.h.in
  fdadcc861565b686070908326f5e5914  libgomp/libgomp_g.h
  a5060d745455b036a62cc46de1fe0576  libgomp/lock.c
*************** cab85a447a3c3a83164ef65672d00b92  libgom
*** 132752,132758 ****
  266ba320079e69e58163b7adf1d2c441  libgomp/oacc-host.c
  5eb42012fde17dd5875ac784c0d5f688  libgomp/oacc-init.c
  1776f2de108801a59696220c3147b649  libgomp/oacc-int.h
! 400376422733dbef89bcfba6e2080481  libgomp/oacc-mem.c
  ec5cbb804396f78976ddc8aa63a99e23  libgomp/oacc-parallel.c
  b6edffd0cc3b521c5885b285ddc3deaf  libgomp/oacc-plugin.c
  cabec5d2660028884f23c85bd403f01e  libgomp/oacc-plugin.h
--- 132906,132912 ----
  266ba320079e69e58163b7adf1d2c441  libgomp/oacc-host.c
  5eb42012fde17dd5875ac784c0d5f688  libgomp/oacc-init.c
  1776f2de108801a59696220c3147b649  libgomp/oacc-int.h
! b5f453f5f79ea26deab3885d9998ec68  libgomp/oacc-mem.c
  ec5cbb804396f78976ddc8aa63a99e23  libgomp/oacc-parallel.c
  b6edffd0cc3b521c5885b285ddc3deaf  libgomp/oacc-plugin.c
  cabec5d2660028884f23c85bd403f01e  libgomp/oacc-plugin.h
*************** a6450e2f5f7558ce92992048a3735241  libgom
*** 132761,132776 ****
  6bcd80e4e6537ec863c1d376f34de561  libgomp/omp.h.in
  c86ce0e3a2aeecaa5351b6f1ba8032e5  libgomp/omp_lib.f90.in
  49663c3c3b724a5241612aae66a868dd  libgomp/omp_lib.h.in
! 15d191aa150796691f341d8808a5f17d  libgomp/openacc.f90
! 4df662cad500e0c691a4fea12fe597e8  libgomp/openacc.h
! 43edbbeac3271b68d0e5066d23ca21d9  libgomp/openacc_lib.h
  70196de117934b7f120ff364699b0142  libgomp/ordered.c
  5d03c6596f36bc8b6127cd047fb71b81  libgomp/parallel.c
  b62a5d146dc237f28322cddf18c8a8bc  libgomp/plugin/Makefrag.am
  5a5c5a37c066333fa237c308a243cda1  libgomp/plugin/configfrag.ac
  89a0efb8035fb3af682d1d4081804427  libgomp/plugin/cuda-lib.def
! e035626b14d9141df4ba5b2b5b5ffba0  libgomp/plugin/plugin-gcn.c
! 4bebe1a11c4ab5644f9975d133ec51c5  libgomp/plugin/plugin-nvptx.c
  0f2fc4f7d0850afd090ba2bb43681c8a  libgomp/priority_queue.c
  5c28f5f7bbc16dada259efc296bbe9f3  libgomp/priority_queue.h
  f1eee47026bb1c516cd1b3a9b9c1c5fa  libgomp/scope.c
--- 132915,132930 ----
  6bcd80e4e6537ec863c1d376f34de561  libgomp/omp.h.in
  c86ce0e3a2aeecaa5351b6f1ba8032e5  libgomp/omp_lib.f90.in
  49663c3c3b724a5241612aae66a868dd  libgomp/omp_lib.h.in
! 442785d02c04a38d6b923e1aff5ee030  libgomp/openacc.f90
! 0380c0cfc562bb08603d6ff4bb9c8311  libgomp/openacc.h
! 858bdcba6ddb1d7c44faa6e75b0a94e7  libgomp/openacc_lib.h
  70196de117934b7f120ff364699b0142  libgomp/ordered.c
  5d03c6596f36bc8b6127cd047fb71b81  libgomp/parallel.c
  b62a5d146dc237f28322cddf18c8a8bc  libgomp/plugin/Makefrag.am
  5a5c5a37c066333fa237c308a243cda1  libgomp/plugin/configfrag.ac
  89a0efb8035fb3af682d1d4081804427  libgomp/plugin/cuda-lib.def
! 12dc44ffcfc062ba40f0f9088273060e  libgomp/plugin/plugin-gcn.c
! 37125a02810ccf86efdad50fea6e5a07  libgomp/plugin/plugin-nvptx.c
  0f2fc4f7d0850afd090ba2bb43681c8a  libgomp/priority_queue.c
  5c28f5f7bbc16dada259efc296bbe9f3  libgomp/priority_queue.h
  f1eee47026bb1c516cd1b3a9b9c1c5fa  libgomp/scope.c
*************** f1eee47026bb1c516cd1b3a9b9c1c5fa  libgom
*** 132781,132787 ****
  6562eda8ef1a1fd0a2a0a9e5621f684b  libgomp/splay-tree.h
  1775f6ebbed5a9aef1882e66136d9e2b  libgomp/target-cxa-dso-dtor.c
  a8a23ca7c25ca51062b636b0c099096a  libgomp/target-indirect.c
! e10777c5b3796fb8a332899a2d7eb38a  libgomp/target.c
  8f03749b5187ce4fb4dce3f7d5b2d9f7  libgomp/task.c
  865cdfdff84a15247efff279e8aca77f  libgomp/taskloop.c
  f540431686cf02c11ae33b1cd66e01ca  libgomp/team.c
--- 132935,132941 ----
  6562eda8ef1a1fd0a2a0a9e5621f684b  libgomp/splay-tree.h
  1775f6ebbed5a9aef1882e66136d9e2b  libgomp/target-cxa-dso-dtor.c
  a8a23ca7c25ca51062b636b0c099096a  libgomp/target-indirect.c
! b12414cad453ffe50d802be0428e1960  libgomp/target.c
  8f03749b5187ce4fb4dce3f7d5b2d9f7  libgomp/task.c
  865cdfdff84a15247efff279e8aca77f  libgomp/taskloop.c
  f540431686cf02c11ae33b1cd66e01ca  libgomp/team.c
*************** e4c259ceb3f0850ee4a9c2d8db93fa19  libgom
*** 132854,132859 ****
--- 133008,133021 ----
  46280f072d47ab513989684a0c34bbbd  libgomp/testsuite/libgomp.c++/ctor-7.C
  cf8630c02b905d98e08a439066bb9815  libgomp/testsuite/libgomp.c++/ctor-8.C
  0bd7fe39119bfc0574561c1e381edc5b  libgomp/testsuite/libgomp.c++/ctor-9.C
+ 3b8f9635872e44615536b61fe9b4503a  libgomp/testsuite/libgomp.c++/declare-mapper-1.C
+ 987f700fd57f5c8c92a389fdd52a802f  libgomp/testsuite/libgomp.c++/declare-mapper-2.C
+ 4e0438a4c672c7f69409c78f983e6f85  libgomp/testsuite/libgomp.c++/declare-mapper-3.C
+ 70244eac2278da21748c2106cfa3f9ee  libgomp/testsuite/libgomp.c++/declare-mapper-4.C
+ dd899efe3ad96d4bc43aa80269da28e9  libgomp/testsuite/libgomp.c++/declare-mapper-5.C
+ dd6b619ee130db82170781062477eb42  libgomp/testsuite/libgomp.c++/declare-mapper-6.C
+ 94c964b235f72b68d9bed9ab44fc25de  libgomp/testsuite/libgomp.c++/declare-mapper-7.C
+ 2eb1d9d112637bbafc20c3a646030e32  libgomp/testsuite/libgomp.c++/declare-mapper-8.C
  23c42bd29433374ffd8ef4b669c3ab98  libgomp/testsuite/libgomp.c++/declare-target-indirect-1.C
  69326cfd40097e393a1bdb2e95e9052d  libgomp/testsuite/libgomp.c++/declare_target-1.C
  9680d8fd6dafdcd73ddfb70fce9898b5  libgomp/testsuite/libgomp.c++/default-1.C
*************** ec937bfca18dd06fec284c99ab526c23  libgom
*** 133069,133074 ****
--- 133231,133259 ----
  1b7a2eb974fffd17e48fc15d7d3f22f9  libgomp/testsuite/libgomp.c++/target-exceptions-throw-2.C
  488d32eeb21a3eeda82ddf89a2bfa708  libgomp/testsuite/libgomp.c++/target-exceptions-throw-3.C
  3e34525fadfa0f7d151d5ffe7f6c0f3d  libgomp/testsuite/libgomp.c++/target-exit-data-reftoptr-1.C
+ b83d91a3813efbf02b55efe0117eff39  libgomp/testsuite/libgomp.c++/target-flex-10.C
+ 1990d65ffda2ff57200ec61c5027c0bd  libgomp/testsuite/libgomp.c++/target-flex-100.C
+ 8b43f813306c222879f3b03bd3e728cc  libgomp/testsuite/libgomp.c++/target-flex-101.C
+ fe4d74edf4ec5a3375e54ddd28a8796a  libgomp/testsuite/libgomp.c++/target-flex-11.C
+ 0a4ab3e4091f832114123d88913f8a70  libgomp/testsuite/libgomp.c++/target-flex-12.C
+ 5ff5527ae7d116bd8013ae15730da4b2  libgomp/testsuite/libgomp.c++/target-flex-2000.C
+ 3d7f92c220984f9b5df143d83454b2d9  libgomp/testsuite/libgomp.c++/target-flex-2001.C
+ 954995091329c954f03416c9d68fcd53  libgomp/testsuite/libgomp.c++/target-flex-2002.C
+ 77f35f53669a7226e09fcbe543d61a78  libgomp/testsuite/libgomp.c++/target-flex-2003.C
+ 79ba21f64aded5953ed95cdb188656e1  libgomp/testsuite/libgomp.c++/target-flex-30.C
+ 563f2c38d177db2c2abb6025bf23e8dd  libgomp/testsuite/libgomp.c++/target-flex-300.C
+ f11b154ef2f8af567a2bba1f78f3422b  libgomp/testsuite/libgomp.c++/target-flex-31.C
+ 2e210834ba5b83143580624d7853e294  libgomp/testsuite/libgomp.c++/target-flex-32.C
+ 74c1c725cb1b123cf394d2d4f68e97f6  libgomp/testsuite/libgomp.c++/target-flex-33.C
+ 972b82f01a6edf4943dc9782cdfb5dde  libgomp/testsuite/libgomp.c++/target-flex-41.C
+ 7aa950ef84725f2baef1cbe81d116606  libgomp/testsuite/libgomp.c++/target-flex-60.C
+ 35f9209b4dd56a2cac6e72ee9e1cdd56  libgomp/testsuite/libgomp.c++/target-flex-61.C
+ b5f6d6ba64189d7870c4b4912d2af06b  libgomp/testsuite/libgomp.c++/target-flex-62.C
+ 78f769fdafe753971a11ba1f544862d6  libgomp/testsuite/libgomp.c++/target-flex-70.C
+ 819954da74d83a55a001d86b6644a0fc  libgomp/testsuite/libgomp.c++/target-flex-80.C
+ 54a02975b37691efc1c05ed51a76557a  libgomp/testsuite/libgomp.c++/target-flex-81.C
+ d241074614c759c57e84e4b52f049edc  libgomp/testsuite/libgomp.c++/target-flex-90.C
+ 868cc196b1bcad33d596bb9de56108d6  libgomp/testsuite/libgomp.c++/target-flex-common.h
  4f1a5a6faf4e4b1e94a99f3df7f59dfd  libgomp/testsuite/libgomp.c++/target-has-device-addr-2.C
  c2ea975d3e14f144e2ade23a720b62bd  libgomp/testsuite/libgomp.c++/target-has-device-addr-4.C
  e259056e47b1dc505accadfe5b89d17a  libgomp/testsuite/libgomp.c++/target-has-device-addr-5.C
*************** d60133477ad2d5ea3c1aca648a09ac9f  libgom
*** 133087,133092 ****
--- 133272,133314 ----
  d01f6cd5771f7784c8ce461cf8b60255  libgomp/testsuite/libgomp.c++/target-same-name-2-a.C
  b0372bd118a07b6674371887148186be  libgomp/testsuite/libgomp.c++/target-same-name-2-b.C
  e20a8ae264dd60aac921ec743e8b6ef6  libgomp/testsuite/libgomp.c++/target-same-name-2.C
+ 49bec1188a7f331490fd1a884f5ffe7d  libgomp/testsuite/libgomp.c++/target-std__array-concurrent-usm.C
+ 3b233a453c3bb44b7fe238e719baaab0  libgomp/testsuite/libgomp.c++/target-std__array-concurrent.C
+ abc1f024f366b278405b58df17afe0cd  libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent-usm.C
+ 8bcc7935a48ea91610acb80b5099cfcf  libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent.C
+ 46a820315e87c64c2043cfe42375298c  libgomp/testsuite/libgomp.c++/target-std__cmath.C
+ 31a5c6ae9e1ebbc7d44b7d279bd40b98  libgomp/testsuite/libgomp.c++/target-std__complex.C
+ 983898d3a6fba310a33cc99a690e61cd  libgomp/testsuite/libgomp.c++/target-std__deque-concurrent-usm.C
+ 38a9fa8246afedbc1c1efbe0e9ec1e36  libgomp/testsuite/libgomp.c++/target-std__deque-concurrent.C
+ 004d662871b98820d0b7077a8db62a9f  libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent.C
+ 9284d636ffccb124c0191ed0a94dfb39  libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C
+ 1f377677e5b07bccd785fa7f52568e33  libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C
+ d9a8a0d044e2015bfbdf791ead014021  libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent.C
+ 35f877f9bcff198b68b3c7adbe76cc90  libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent-usm.C
+ fdec3ba1b0908da4a102cb7c82a03a71  libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent.C
+ f957ac83f08d36891003338813dcd03d  libgomp/testsuite/libgomp.c++/target-std__list-concurrent-usm.C
+ 9ae571f820c7288512759c98e324522e  libgomp/testsuite/libgomp.c++/target-std__list-concurrent.C
+ 9215d28cde00a16495049615bac940cb  libgomp/testsuite/libgomp.c++/target-std__map-concurrent-usm.C
+ aafa0a49328d827ce7bd9ef6ad8f9e4d  libgomp/testsuite/libgomp.c++/target-std__map-concurrent.C
+ 5e320404381ef41bf4828273a4162e96  libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent-usm.C
+ f365edc7dfad2127e50ef850bdf70310  libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent.C
+ 02fbac6f0c9f081d4eb14d7a2f7a0041  libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent-usm.C
+ 870d16f297d84c8add772ed331876a43  libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent.C
+ 733f4878044be0e7b75ce52065c6cd77  libgomp/testsuite/libgomp.c++/target-std__numbers.C
+ 5c629252d916db885e993c42be0fa90e  libgomp/testsuite/libgomp.c++/target-std__set-concurrent-usm.C
+ 7d6db87f2bf1a8af87fa7c2bd2510cee  libgomp/testsuite/libgomp.c++/target-std__set-concurrent.C
+ 85fcbd49d3999b48d99d829e637b8eac  libgomp/testsuite/libgomp.c++/target-std__span-concurrent-usm.C
+ 71ab4f627e6d304b2b607c5f1a8b714f  libgomp/testsuite/libgomp.c++/target-std__span-concurrent.C
+ 07a67441f7fdd81abbf6c76f9adb48f7  libgomp/testsuite/libgomp.c++/target-std__unordered_map-concurrent.C
+ 2f3a1c1a1d16e63b8d4ec3e87fb3b3c4  libgomp/testsuite/libgomp.c++/target-std__unordered_multimap-concurrent.C
+ c6ffcb486ca72e20c5b5a8aa4e218c32  libgomp/testsuite/libgomp.c++/target-std__unordered_multiset-concurrent.C
+ 6b57b6d8473c3645b2bf7ed07ac18605  libgomp/testsuite/libgomp.c++/target-std__unordered_set-concurrent.C
+ 8183c34ab1e3da10e4d19400ad68a32c  libgomp/testsuite/libgomp.c++/target-std__valarray-1.C
+ 94b5f7b92b7c4edffc6cfe54dfd4fdee  libgomp/testsuite/libgomp.c++/target-std__valarray-1.output
+ 965d40172dd9afb6a0a83d60c260bfbb  libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent-usm.C
+ 606c20e786b4a247245b41b2c684700c  libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent.C
+ 22adb89598c33012dbbc8c38c19501ce  libgomp/testsuite/libgomp.c++/target-std__vector-concurrent-usm.C
+ 50720f2d9b3b20280c020df7032e9281  libgomp/testsuite/libgomp.c++/target-std__vector-concurrent.C
  dd3ce96eb6e1a02d995c05804baf3219  libgomp/testsuite/libgomp.c++/target-this-1.C
  7ecd542ef8fc4d3c7a2e77af16f33ddc  libgomp/testsuite/libgomp.c++/target-this-2.C
  b259a40bb59294ea9e4a97ffe6189132  libgomp/testsuite/libgomp.c++/target-this-3.C
*************** e84312e49f013526d73d8d431b003123  libgom
*** 133188,133193 ****
--- 133410,133421 ----
  65874eb51aef9c0a8ebb700f6708ac82  libgomp/testsuite/libgomp.c-c++-common/cancel-taskgroup-4.c
  9fe6259058ff7671b0dadfe2a5eea80f  libgomp/testsuite/libgomp.c-c++-common/critical-hint-1.c
  a4ab197aeadddd54aec1345501b5ea69  libgomp/testsuite/libgomp.c-c++-common/critical-hint-2.c
+ 61e48ed628966d420618cb7384f5f541  libgomp/testsuite/libgomp.c-c++-common/declare-mapper-10.c
+ 7fb33d18278bb358c50e0f3b90eaf2b8  libgomp/testsuite/libgomp.c-c++-common/declare-mapper-11.c
+ 7bf9aeaac3ee27d9e5e0565434fb4186  libgomp/testsuite/libgomp.c-c++-common/declare-mapper-12.c
+ 34db3bfd2242053022ea450a1a211e90  libgomp/testsuite/libgomp.c-c++-common/declare-mapper-13.c
+ e1fa8ce4f72dcee9fa7fa3c1656fbf01  libgomp/testsuite/libgomp.c-c++-common/declare-mapper-14.c
+ 4ac23cf49f0b483f9a8a3ad62ab94899  libgomp/testsuite/libgomp.c-c++-common/declare-mapper-9.c
  a91d1e81f6056f17808a3f96ef2583c6  libgomp/testsuite/libgomp.c-c++-common/declare-target-indirect-1.c
  340f18f5450878329ed68937e697b129  libgomp/testsuite/libgomp.c-c++-common/declare-target-indirect-2.c
  12e3ee01b70343537315551db476c391  libgomp/testsuite/libgomp.c-c++-common/declare_target-1.c
*************** e590f10fae9bf053ed7123777b03bf32  libgom
*** 133387,133393 ****
  c1475af16cfcc82bec0d85875d542fdb  libgomp/testsuite/libgomp.c-c++-common/target-41.c
  d87524b525b7f424e584af640f4b038b  libgomp/testsuite/libgomp.c-c++-common/target-42.c
  ae24e1c7b9fc9100ef17c4595417ef54  libgomp/testsuite/libgomp.c-c++-common/target-45.c
! 4d8aae1b1f6de692fe1f648c2cf17905  libgomp/testsuite/libgomp.c-c++-common/target-abi-struct-1-O0.c
  606f84c99a4efc1405feef5c9b230de4  libgomp/testsuite/libgomp.c-c++-common/target-cdtor-1.c
  1120f9e50460c0396d1ae405ffd3e780  libgomp/testsuite/libgomp.c-c++-common/target-has-device-addr-1.c
  038d0072f445d0120f15c605ec76e54a  libgomp/testsuite/libgomp.c-c++-common/target-imperfect-transform-1.c
--- 133615,133622 ----
  c1475af16cfcc82bec0d85875d542fdb  libgomp/testsuite/libgomp.c-c++-common/target-41.c
  d87524b525b7f424e584af640f4b038b  libgomp/testsuite/libgomp.c-c++-common/target-42.c
  ae24e1c7b9fc9100ef17c4595417ef54  libgomp/testsuite/libgomp.c-c++-common/target-45.c
! 4d80e900b1dc39b9c34d4f6576cfd9be  libgomp/testsuite/libgomp.c-c++-common/target-abi-struct-1-O0.c
! 6814c54bc25aa3da74822d5d4717c414  libgomp/testsuite/libgomp.c-c++-common/target-abi-struct-1.c
  606f84c99a4efc1405feef5c9b230de4  libgomp/testsuite/libgomp.c-c++-common/target-cdtor-1.c
  1120f9e50460c0396d1ae405ffd3e780  libgomp/testsuite/libgomp.c-c++-common/target-has-device-addr-1.c
  038d0072f445d0120f15c605ec76e54a  libgomp/testsuite/libgomp.c-c++-common/target-imperfect-transform-1.c
*************** b916bf010c1060aa6d0c7f50cf781f71  libgom
*** 134259,134265 ****
  a4b7a9ace17dd9b075800abbfd0733ce  libgomp/testsuite/libgomp.fortran/map-subarray.f90
  eaa2fd770a7d57561f30521ae9f2fc9f  libgomp/testsuite/libgomp.fortran/map-subcomponents.f90
  235b8f3fb869589084e0e80ba5622db7  libgomp/testsuite/libgomp.fortran/masked-1.f90
! 7baca0f45786073c31a549db83ba6091  libgomp/testsuite/libgomp.fortran/metadirective-1.f90
  e9a079a2d85004b1722782adaa37de8a  libgomp/testsuite/libgomp.fortran/metadirective-2.f90
  6aff6b0d1880a8753ea2d552f0048670  libgomp/testsuite/libgomp.fortran/metadirective-3.f90
  5ae2ae972961030d963d73631aecabe3  libgomp/testsuite/libgomp.fortran/metadirective-4.f90
--- 134488,134494 ----
  a4b7a9ace17dd9b075800abbfd0733ce  libgomp/testsuite/libgomp.fortran/map-subarray.f90
  eaa2fd770a7d57561f30521ae9f2fc9f  libgomp/testsuite/libgomp.fortran/map-subcomponents.f90
  235b8f3fb869589084e0e80ba5622db7  libgomp/testsuite/libgomp.fortran/masked-1.f90
! ec20980a81092ce674f723fa288b8c79  libgomp/testsuite/libgomp.fortran/metadirective-1.f90
  e9a079a2d85004b1722782adaa37de8a  libgomp/testsuite/libgomp.fortran/metadirective-2.f90
  6aff6b0d1880a8753ea2d552f0048670  libgomp/testsuite/libgomp.fortran/metadirective-3.f90
  5ae2ae972961030d963d73631aecabe3  libgomp/testsuite/libgomp.fortran/metadirective-4.f90
*************** b4fc04813771a8801e90ced112679b03  libgom
*** 134608,134614 ****
  de42c25c26112c8021572c2875414fe1  libgomp/testsuite/libgomp.oacc-c++/routine-1-trailing-return-type.C
  e791213d5152b9450d6c3d86211b78cd  libgomp/testsuite/libgomp.oacc-c++/template-reduction.C
  c3cc3d873e54843cfbb40f4c262b6b98  libgomp/testsuite/libgomp.oacc-c++/this.C
! c3ce4f9d067129eeb94fbbd5ac912cca  libgomp/testsuite/libgomp.oacc-c-c++-common/abi-struct-1.c
  451978dda3b58f6a597aa1b515da90e7  libgomp/testsuite/libgomp.oacc-c-c++-common/abort-1.c
  2187ea0d1f3ce15e1d66e17ed2fecfc6  libgomp/testsuite/libgomp.oacc-c-c++-common/abort-2.c
  659c1e7c321078b832a4fe638bb81184  libgomp/testsuite/libgomp.oacc-c-c++-common/abort-3.c
--- 134837,134843 ----
  de42c25c26112c8021572c2875414fe1  libgomp/testsuite/libgomp.oacc-c++/routine-1-trailing-return-type.C
  e791213d5152b9450d6c3d86211b78cd  libgomp/testsuite/libgomp.oacc-c++/template-reduction.C
  c3cc3d873e54843cfbb40f4c262b6b98  libgomp/testsuite/libgomp.oacc-c++/this.C
! 84f65adec018c9bfca203adf6992e2f9  libgomp/testsuite/libgomp.oacc-c-c++-common/abi-struct-1.c
  451978dda3b58f6a597aa1b515da90e7  libgomp/testsuite/libgomp.oacc-c-c++-common/abort-1.c
  2187ea0d1f3ce15e1d66e17ed2fecfc6  libgomp/testsuite/libgomp.oacc-c-c++-common/abort-2.c
  659c1e7c321078b832a4fe638bb81184  libgomp/testsuite/libgomp.oacc-c-c++-common/abort-3.c
*************** e52bf66ad30053b87fac627a1f4109d6  libgom
*** 134633,134638 ****
--- 134862,134868 ----
  63ff72d59e981e772ed78cb7307de12e  libgomp/testsuite/libgomp.oacc-c-c++-common/acc_map_data-host_already-1.c
  d36c56b9b161368fbce8efe09449dbf6  libgomp/testsuite/libgomp.oacc-c-c++-common/acc_map_data-host_already-2.c
  01102bb5cd8ca990a37df199ebd6f6dd  libgomp/testsuite/libgomp.oacc-c-c++-common/acc_map_data-host_already-3.c
+ 252d2b4959ce80ee4e51022d7df7feed  libgomp/testsuite/libgomp.oacc-c-c++-common/acc_memcpy_device-1.c
  5e49a4a09577b3e3af65ed5092bde13c  libgomp/testsuite/libgomp.oacc-c-c++-common/acc_on_device-1.c
  05b66fbd6c12c103181fc52d3bf21146  libgomp/testsuite/libgomp.oacc-c-c++-common/acc_prof-dispatch-1.c
  c20cad710294b1d13c0dc2b1460754f2  libgomp/testsuite/libgomp.oacc-c-c++-common/acc_prof-init-1.c
*************** c9683c99e94f6e35b6a3266a17594788  libgom
*** 135036,135041 ****
--- 135266,135272 ----
  23819c21b173d31a96499e53ce2c30bd  libgomp/testsuite/libgomp.oacc-fortran/acc-memcpy.f90
  b679de5ffd18c9aa9dde2bffdaf92c7f  libgomp/testsuite/libgomp.oacc-fortran/acc_get_property.f90
  4d28dca537d7fed909bb00ab9ac2565d  libgomp/testsuite/libgomp.oacc-fortran/acc_host_device_ptr.f90
+ 2ed6b5eda8ab9729c2ce12d504e856b9  libgomp/testsuite/libgomp.oacc-fortran/acc_memcpy_device-1.f90
  b6bba590bb04152334d347ff9ad78585  libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-1.f90
  7eea7269e36d7c56e10c9b1d3a71f65a  libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-2.f
  4df44003cf3f41333ad84f1cdec2d686  libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-3.f
*************** d680e7307fb59fe24f8431e179191f16  libssp
*** 137566,137572 ****
  534c3fb4a88e5c1f70db35c12b7742c3  libssp/vsnprintf-chk.c
  34daeb04a522ee796098df4446d6ce61  libssp/vsprintf-chk.c
  9e2de2e1f20ab0ffa2201164de02824f  libstdc++-v3/.editorconfig
! e2bda6f183c8c4cb55d15323ead63576  libstdc++-v3/ChangeLog
  7aa6c40440a44fcf5ec94c066160c2f8  libstdc++-v3/ChangeLog-1998
  7aff86600b6a1ed3fa87305075a92db0  libstdc++-v3/ChangeLog-1999
  a6f28e8fc9bb07696a9e068b439a3a87  libstdc++-v3/ChangeLog-2000
--- 137797,137803 ----
  534c3fb4a88e5c1f70db35c12b7742c3  libssp/vsnprintf-chk.c
  34daeb04a522ee796098df4446d6ce61  libssp/vsprintf-chk.c
  9e2de2e1f20ab0ffa2201164de02824f  libstdc++-v3/.editorconfig
! 7246aefe1ba623e78c9e6f1d3d62d5c2  libstdc++-v3/ChangeLog
  7aa6c40440a44fcf5ec94c066160c2f8  libstdc++-v3/ChangeLog-1998
  7aff86600b6a1ed3fa87305075a92db0  libstdc++-v3/ChangeLog-1999
  a6f28e8fc9bb07696a9e068b439a3a87  libstdc++-v3/ChangeLog-2000
*************** a94321c8d0dbbc71741ebf0f1cc9828c  libstd
*** 137597,137605 ****
  b569b721263ae74c6a8e285903fb9906  libstdc++-v3/Makefile.am
  5ae0a394d413d225772c3b38a114cce2  libstdc++-v3/Makefile.in
  f372af73db4ac0ad88e43199e1f29e08  libstdc++-v3/README
! 16f3647e8941e565bc8b5d208fe98e7a  libstdc++-v3/acinclude.m4
  13f29ef95664bfe876c83f7743ca504d  libstdc++-v3/aclocal.m4
! be75bd5b7d919ff69f604dfbb6bc65e9  libstdc++-v3/config.h.in
  9e25b4e524e0d639f272a9e96bab0ce3  libstdc++-v3/config/abi/compatibility.h
  0be6fea010f86e442ad030f82858fb73  libstdc++-v3/config/abi/post/aarch64-linux-gnu/baseline_symbols.txt
  730569c0ef38f6e6322b3c4ac65253ce  libstdc++-v3/config/abi/post/alpha-linux-gnu/baseline_symbols.txt
--- 137828,137836 ----
  b569b721263ae74c6a8e285903fb9906  libstdc++-v3/Makefile.am
  5ae0a394d413d225772c3b38a114cce2  libstdc++-v3/Makefile.in
  f372af73db4ac0ad88e43199e1f29e08  libstdc++-v3/README
! 1b7f506a6758f8c512f1e8bf81f58fca  libstdc++-v3/acinclude.m4
  13f29ef95664bfe876c83f7743ca504d  libstdc++-v3/aclocal.m4
! 42629a3961df47287a44fd149ab68b39  libstdc++-v3/config.h.in
  9e25b4e524e0d639f272a9e96bab0ce3  libstdc++-v3/config/abi/compatibility.h
  0be6fea010f86e442ad030f82858fb73  libstdc++-v3/config/abi/post/aarch64-linux-gnu/baseline_symbols.txt
  730569c0ef38f6e6322b3c4ac65253ce  libstdc++-v3/config/abi/post/alpha-linux-gnu/baseline_symbols.txt
*************** abc6f4755fae8c6e8f45ce5fee798654  libstd
*** 137632,137638 ****
  47c8d77956f3c48e132885f7b30c2cdf  libstdc++-v3/config/abi/post/x86_64-linux-gnu/x32/baseline_symbols.txt
  5c4c38aeca254313c616b84337c937c3  libstdc++-v3/config/abi/pre/float128.ver
  07b85b9691cd7b04b3427e50e222f983  libstdc++-v3/config/abi/pre/gnu-versioned-namespace.ver
! 5115259bafa81c9269c0d5e13b641cc0  libstdc++-v3/config/abi/pre/gnu.ver
  b01f8da8f4373070847fe317fe8a546e  libstdc++-v3/config/abi/pre/none.ver
  f48bfa11a1f6ebbba6b09b9618c997f2  libstdc++-v3/config/allocator/malloc_allocator_base.h
  229729de73da6f9ba6e1bf4c48f51f24  libstdc++-v3/config/allocator/new_allocator_base.h
--- 137863,137869 ----
  47c8d77956f3c48e132885f7b30c2cdf  libstdc++-v3/config/abi/post/x86_64-linux-gnu/x32/baseline_symbols.txt
  5c4c38aeca254313c616b84337c937c3  libstdc++-v3/config/abi/pre/float128.ver
  07b85b9691cd7b04b3427e50e222f983  libstdc++-v3/config/abi/pre/gnu-versioned-namespace.ver
! 8d56060d07ceda1d69f68b249d0dc34d  libstdc++-v3/config/abi/pre/gnu.ver
  b01f8da8f4373070847fe317fe8a546e  libstdc++-v3/config/abi/pre/none.ver
  f48bfa11a1f6ebbba6b09b9618c997f2  libstdc++-v3/config/allocator/malloc_allocator_base.h
  229729de73da6f9ba6e1bf4c48f51f24  libstdc++-v3/config/allocator/new_allocator_base.h
*************** ed199f6700a016816d625b286bf25ead  libstd
*** 137791,137797 ****
  8913cf14e458f9cfae745a0d939c97e4  libstdc++-v3/config/os/vxworks/ctype_configure_char.cc
  e29a526ec89ed09bf39b0aa4fd4c5d79  libstdc++-v3/config/os/vxworks/ctype_inline.h
  788b66dfe66c25c24ff60bf253c9c7ff  libstdc++-v3/config/os/vxworks/os_defines.h
! 3c16f788a894abc8eba5de7089bfc3bf  libstdc++-v3/configure
  315146bda822dcbf6f5677aac62442a6  libstdc++-v3/configure.ac
  22c2981483d92dbe80dc732e50bfdbcd  libstdc++-v3/configure.host
  450cc52f6f6f0abf59940662504c450e  libstdc++-v3/crossconfig.m4
--- 138022,138028 ----
  8913cf14e458f9cfae745a0d939c97e4  libstdc++-v3/config/os/vxworks/ctype_configure_char.cc
  e29a526ec89ed09bf39b0aa4fd4c5d79  libstdc++-v3/config/os/vxworks/ctype_inline.h
  788b66dfe66c25c24ff60bf253c9c7ff  libstdc++-v3/config/os/vxworks/os_defines.h
! b2fbd0f6a63be76d6d8548dba1d8bf8f  libstdc++-v3/configure
  315146bda822dcbf6f5677aac62442a6  libstdc++-v3/configure.ac
  22c2981483d92dbe80dc732e50bfdbcd  libstdc++-v3/configure.host
  450cc52f6f6f0abf59940662504c450e  libstdc++-v3/crossconfig.m4
*************** d66f986053e4755f0517ff5cfe90b2b5  libstd
*** 137800,137806 ****
  3f7ff07f68cc7610addc1921bc125548  libstdc++-v3/doc/doxygen/Intro.3
  8ddc98aa9ea49005b27aed1d2798e2fc  libstdc++-v3/doc/doxygen/doxygroups.cc
  520db39aef0e2a59418132af88b897ed  libstdc++-v3/doc/doxygen/mainpage.html
! 5e2d61148769fb7fc2d5e5a17c850bcb  libstdc++-v3/doc/doxygen/stdheader.cc
  1273764cd133c402d2d3f22cf2913af5  libstdc++-v3/doc/doxygen/tables.html
  575fc7a15bb0116a3eb836e702ee9792  libstdc++-v3/doc/doxygen/user.cfg.in
  66e139590a163a3e9d632f33fbe1d1b3  libstdc++-v3/doc/html/README
--- 138031,138037 ----
  3f7ff07f68cc7610addc1921bc125548  libstdc++-v3/doc/doxygen/Intro.3
  8ddc98aa9ea49005b27aed1d2798e2fc  libstdc++-v3/doc/doxygen/doxygroups.cc
  520db39aef0e2a59418132af88b897ed  libstdc++-v3/doc/doxygen/mainpage.html
! 9e50e6ed5219a6fa4058265ed4809638  libstdc++-v3/doc/doxygen/stdheader.cc
  1273764cd133c402d2d3f22cf2913af5  libstdc++-v3/doc/doxygen/tables.html
  575fc7a15bb0116a3eb836e702ee9792  libstdc++-v3/doc/doxygen/user.cfg.in
  66e139590a163a3e9d632f33fbe1d1b3  libstdc++-v3/doc/html/README
*************** ea0c531c09fa230f346f8ba700961e4a  libstd
*** 137973,137979 ****
  4fceea62121ba1fe214414a7506d385e  libstdc++-v3/doc/html/manual/stringstreams.html
  52f0c68b15c7a2b6e098bcfb8da0094b  libstdc++-v3/doc/html/manual/support.html
  fcdceeabf3a95117ea22e93a0354e564  libstdc++-v3/doc/html/manual/termination.html
! 994a609aea3823f777eda71567bc8ed4  libstdc++-v3/doc/html/manual/test.html
  c39b927efcec5ac84139c1490c8ef320  libstdc++-v3/doc/html/manual/traits.html
  530b96535baacfe35df2e65f9dfe7efc  libstdc++-v3/doc/html/manual/unordered_associative.html
  8aa9b7bfbe5a730701f97de49e583432  libstdc++-v3/doc/html/manual/using.html
--- 138204,138210 ----
  4fceea62121ba1fe214414a7506d385e  libstdc++-v3/doc/html/manual/stringstreams.html
  52f0c68b15c7a2b6e098bcfb8da0094b  libstdc++-v3/doc/html/manual/support.html
  fcdceeabf3a95117ea22e93a0354e564  libstdc++-v3/doc/html/manual/termination.html
! 428c7db4a31405ff14baac9e08214658  libstdc++-v3/doc/html/manual/test.html
  c39b927efcec5ac84139c1490c8ef320  libstdc++-v3/doc/html/manual/traits.html
  530b96535baacfe35df2e65f9dfe7efc  libstdc++-v3/doc/html/manual/unordered_associative.html
  8aa9b7bfbe5a730701f97de49e583432  libstdc++-v3/doc/html/manual/using.html
*************** e12241b98a6c1e835b7b1d1bb31761ca  libstd
*** 138219,138225 ****
  f585d9116a5f533123166622818c4252  libstdc++-v3/doc/xml/manual/status_cxxtr24733.xml
  bfd38fc5f1090656a5139c94c16ea163  libstdc++-v3/doc/xml/manual/strings.xml
  2b80feb1b53a8d0895a292620ec430b2  libstdc++-v3/doc/xml/manual/support.xml
! c540dcb615e766afe887215bd7795e42  libstdc++-v3/doc/xml/manual/test.xml
  e2e099be3dd6a4b7a940a7232635ee2c  libstdc++-v3/doc/xml/manual/test_policy_data_structures.xml
  89a63a549c3438b3bee6bbf18f4c8b3e  libstdc++-v3/doc/xml/manual/using.xml
  257e301935b13b4b045e571fa248a4d8  libstdc++-v3/doc/xml/manual/using_exceptions.xml
--- 138450,138456 ----
  f585d9116a5f533123166622818c4252  libstdc++-v3/doc/xml/manual/status_cxxtr24733.xml
  bfd38fc5f1090656a5139c94c16ea163  libstdc++-v3/doc/xml/manual/strings.xml
  2b80feb1b53a8d0895a292620ec430b2  libstdc++-v3/doc/xml/manual/support.xml
! 0dc4244a8b03857d947e6dbc4d0e9133  libstdc++-v3/doc/xml/manual/test.xml
  e2e099be3dd6a4b7a940a7232635ee2c  libstdc++-v3/doc/xml/manual/test_policy_data_structures.xml
  89a63a549c3438b3bee6bbf18f4c8b3e  libstdc++-v3/doc/xml/manual/using.xml
  257e301935b13b4b045e571fa248a4d8  libstdc++-v3/doc/xml/manual/using_exceptions.xml
*************** b820e3490221bb85cbf6bcdde0aa8150  libstd
*** 138227,138234 ****
  c587674e0c370a2d6ccc5213ab3e4e65  libstdc++-v3/doc/xml/spine.xml
  bd966b4a0df6f2a84f9770525581d45c  libstdc++-v3/doc/xsl/customization.xsl.in
  42d14268f2b16c54a6bc2f71538a838c  libstdc++-v3/fragment.am
! 7b87678ad26980cfd3f61ffec87439e1  libstdc++-v3/include/Makefile.am
! ae425609ae2fe546893a19529f01920c  libstdc++-v3/include/Makefile.in
  9909a8468983e231e92c9e286c9765fb  libstdc++-v3/include/backward/auto_ptr.h
  83254dbbadebf6a7aeb58f3cdbf117e9  libstdc++-v3/include/backward/backward_warning.h
  38985095b8ea422bf8bfa31ec65d803c  libstdc++-v3/include/backward/binders.h
--- 138458,138465 ----
  c587674e0c370a2d6ccc5213ab3e4e65  libstdc++-v3/doc/xml/spine.xml
  bd966b4a0df6f2a84f9770525581d45c  libstdc++-v3/doc/xsl/customization.xsl.in
  42d14268f2b16c54a6bc2f71538a838c  libstdc++-v3/fragment.am
! 6da931890771a9730ff5c1b82de5da53  libstdc++-v3/include/Makefile.am
! 44451083932a2866b1c2f068798da403  libstdc++-v3/include/Makefile.in
  9909a8468983e231e92c9e286c9765fb  libstdc++-v3/include/backward/auto_ptr.h
  83254dbbadebf6a7aeb58f3cdbf117e9  libstdc++-v3/include/backward/backward_warning.h
  38985095b8ea422bf8bfa31ec65d803c  libstdc++-v3/include/backward/binders.h
*************** c2f5862787920c2fc07b4f499e362a00  libstd
*** 138244,138256 ****
  d18c16b3c9c3ab2e7d487de90ec27d17  libstdc++-v3/include/bits/allocator.h
  a65f3932e944795c8e78b00d2e7f11a0  libstdc++-v3/include/bits/atomic_base.h
  7c88fbee1dffec663e740720882b5344  libstdc++-v3/include/bits/atomic_futex.h
! c2ed9b9ed62b02a5aba9733f5b376172  libstdc++-v3/include/bits/atomic_timed_wait.h
! bb69994569d6bb0513c7fbd4d74bc697  libstdc++-v3/include/bits/atomic_wait.h
  3f7a7ce2588d1e8ea4f282e9f41ac292  libstdc++-v3/include/bits/basic_ios.h
  c54b27ddff7542cc6baa362f62fb5778  libstdc++-v3/include/bits/basic_ios.tcc
  c12d9fe807732868ad54545f1cc14f66  libstdc++-v3/include/bits/basic_string.h
  ae1074cab6b583707efdb40bf0099caf  libstdc++-v3/include/bits/basic_string.tcc
! 200662cd7d76e4a1990ec1207ae62a51  libstdc++-v3/include/bits/boost_concept_check.h
  a155d2afa910d24be0955f42c4585228  libstdc++-v3/include/bits/c++0x_warning.h
  047d91e40a978dcbedbfd761ecb495d4  libstdc++-v3/include/bits/c++config
  5384dfbb9eb9731df3aca40e40d55350  libstdc++-v3/include/bits/char_traits.h
--- 138475,138487 ----
  d18c16b3c9c3ab2e7d487de90ec27d17  libstdc++-v3/include/bits/allocator.h
  a65f3932e944795c8e78b00d2e7f11a0  libstdc++-v3/include/bits/atomic_base.h
  7c88fbee1dffec663e740720882b5344  libstdc++-v3/include/bits/atomic_futex.h
! 0bf65d82e78abe234a4e15c14c84874f  libstdc++-v3/include/bits/atomic_timed_wait.h
! f94cf4ee734e4fa2ce091a9513437593  libstdc++-v3/include/bits/atomic_wait.h
  3f7a7ce2588d1e8ea4f282e9f41ac292  libstdc++-v3/include/bits/basic_ios.h
  c54b27ddff7542cc6baa362f62fb5778  libstdc++-v3/include/bits/basic_ios.tcc
  c12d9fe807732868ad54545f1cc14f66  libstdc++-v3/include/bits/basic_string.h
  ae1074cab6b583707efdb40bf0099caf  libstdc++-v3/include/bits/basic_string.tcc
! 858c4ad0f5f089f87e6b1feede7e0da5  libstdc++-v3/include/bits/boost_concept_check.h
  a155d2afa910d24be0955f42c4585228  libstdc++-v3/include/bits/c++0x_warning.h
  047d91e40a978dcbedbfd761ecb495d4  libstdc++-v3/include/bits/c++config
  5384dfbb9eb9731df3aca40e40d55350  libstdc++-v3/include/bits/char_traits.h
*************** b194eb42ed4e3bc3a3f65805561d45c8  libstd
*** 138274,138286 ****
  b13fecc1efb3b85dacbed61c6d2a7eed  libstdc++-v3/include/bits/fs_ops.h
  5fa932fcea9eb5ed9e3683af8d5e9276  libstdc++-v3/include/bits/fs_path.h
  b3da24b61a3e8219dde982b2734707ec  libstdc++-v3/include/bits/fstream.tcc
  bda3ca60f2214f1bd6656e6612aff428  libstdc++-v3/include/bits/functexcept.h
  edde9c9d1c9e267663f60a9f5cfe3ebe  libstdc++-v3/include/bits/functional_hash.h
! 35b965444633ef8a16e9b0bff5820be5  libstdc++-v3/include/bits/funcwrap.h
  f656180781457f5f36a26b5902da4b6f  libstdc++-v3/include/bits/gslice.h
  a94b98a38c3eb27aa6644a5fb468c9de  libstdc++-v3/include/bits/gslice_array.h
  df03a6e1a88ea69759bc32441b171cb9  libstdc++-v3/include/bits/hashtable.h
  bafd340e02d232fc7ced1eb5f68967ce  libstdc++-v3/include/bits/hashtable_policy.h
  473034b12d8308be48d4a3b85fe19d83  libstdc++-v3/include/bits/indirect_array.h
  ab0c92c57c5ec5cb9d0bfb3a7963d00c  libstdc++-v3/include/bits/invoke.h
  11d329b94f374c9cc8f95f7e5a958ee5  libstdc++-v3/include/bits/ios_base.h
--- 138505,138519 ----
  b13fecc1efb3b85dacbed61c6d2a7eed  libstdc++-v3/include/bits/fs_ops.h
  5fa932fcea9eb5ed9e3683af8d5e9276  libstdc++-v3/include/bits/fs_path.h
  b3da24b61a3e8219dde982b2734707ec  libstdc++-v3/include/bits/fstream.tcc
+ 1efda0b9414dbcb2a24dcc2f2c3c7311  libstdc++-v3/include/bits/funcref_impl.h
  bda3ca60f2214f1bd6656e6612aff428  libstdc++-v3/include/bits/functexcept.h
  edde9c9d1c9e267663f60a9f5cfe3ebe  libstdc++-v3/include/bits/functional_hash.h
! 6217558ddc01f2e832a716fac968c679  libstdc++-v3/include/bits/funcwrap.h
  f656180781457f5f36a26b5902da4b6f  libstdc++-v3/include/bits/gslice.h
  a94b98a38c3eb27aa6644a5fb468c9de  libstdc++-v3/include/bits/gslice_array.h
  df03a6e1a88ea69759bc32441b171cb9  libstdc++-v3/include/bits/hashtable.h
  bafd340e02d232fc7ced1eb5f68967ce  libstdc++-v3/include/bits/hashtable_policy.h
+ 42122e18adc4626dd5757c66dd0b2bc4  libstdc++-v3/include/bits/indirect.h
  473034b12d8308be48d4a3b85fe19d83  libstdc++-v3/include/bits/indirect_array.h
  ab0c92c57c5ec5cb9d0bfb3a7963d00c  libstdc++-v3/include/bits/invoke.h
  11d329b94f374c9cc8f95f7e5a958ee5  libstdc++-v3/include/bits/ios_base.h
*************** cffd73f057e9c37be8d8f13e0e97c5c0  libstd
*** 138337,138350 ****
  27e294ed24336b703f9fb025b6d69f51  libstdc++-v3/include/bits/regex_scanner.tcc
  22a9676313472917eaaccc27ddfb10f4  libstdc++-v3/include/bits/requires_hosted.h
  88c654658dd63604dd22c1f147bd3956  libstdc++-v3/include/bits/sat_arith.h
! 87a0d4884c4158e55cdf85ecb18c715e  libstdc++-v3/include/bits/semaphore_base.h
  614b105136bea17f03ea2e00796f7f8e  libstdc++-v3/include/bits/shared_ptr.h
  23c0ae833e9a425540f0dd796ba1f1fb  libstdc++-v3/include/bits/shared_ptr_atomic.h
  b19c9b29864e7bd05e1b27c3ba9afbb4  libstdc++-v3/include/bits/shared_ptr_base.h
  d050e025f60dc3eef08990d737b75085  libstdc++-v3/include/bits/slice_array.h
  67cd790795bafd7c20715ef4d1f9d2d3  libstdc++-v3/include/bits/specfun.h
  de3723b929f14af1731389010c14893b  libstdc++-v3/include/bits/sstream.tcc
! e447352e9df05640e24a5f9f85d288ce  libstdc++-v3/include/bits/std_abs.h
  c35a5da0369f3af2e9e202c9c8510914  libstdc++-v3/include/bits/std_function.h
  5b3bd66db6802c89905c016f488a41d0  libstdc++-v3/include/bits/std_mutex.h
  bb19c550085b43f6251959e05791f4c6  libstdc++-v3/include/bits/std_thread.h
--- 138570,138583 ----
  27e294ed24336b703f9fb025b6d69f51  libstdc++-v3/include/bits/regex_scanner.tcc
  22a9676313472917eaaccc27ddfb10f4  libstdc++-v3/include/bits/requires_hosted.h
  88c654658dd63604dd22c1f147bd3956  libstdc++-v3/include/bits/sat_arith.h
! 46c485225068f767bd33c09c42cd2e46  libstdc++-v3/include/bits/semaphore_base.h
  614b105136bea17f03ea2e00796f7f8e  libstdc++-v3/include/bits/shared_ptr.h
  23c0ae833e9a425540f0dd796ba1f1fb  libstdc++-v3/include/bits/shared_ptr_atomic.h
  b19c9b29864e7bd05e1b27c3ba9afbb4  libstdc++-v3/include/bits/shared_ptr_base.h
  d050e025f60dc3eef08990d737b75085  libstdc++-v3/include/bits/slice_array.h
  67cd790795bafd7c20715ef4d1f9d2d3  libstdc++-v3/include/bits/specfun.h
  de3723b929f14af1731389010c14893b  libstdc++-v3/include/bits/sstream.tcc
! 59b16730440e89a81d7071a74053fed6  libstdc++-v3/include/bits/std_abs.h
  c35a5da0369f3af2e9e202c9c8510914  libstdc++-v3/include/bits/std_function.h
  5b3bd66db6802c89905c016f488a41d0  libstdc++-v3/include/bits/std_mutex.h
  bb19c550085b43f6251959e05791f4c6  libstdc++-v3/include/bits/std_thread.h
*************** e10663748871662214948efa4440ceaa  libstd
*** 138389,138402 ****
  23e3769341c471dd17aa42c532a2e463  libstdc++-v3/include/bits/unordered_set.h
  a29de34311f884bb0a7bb8854fe4ce34  libstdc++-v3/include/bits/uses_allocator.h
  b9489856439b8ba5238cd45b2f65370a  libstdc++-v3/include/bits/uses_allocator_args.h
! 9365eb52cff94c5ebad645ee1c38ab45  libstdc++-v3/include/bits/utility.h
  a462fb6c466b34fa25624b7fab6323e3  libstdc++-v3/include/bits/valarray_after.h
  a229b5c8ad2904a3b3173239225596c4  libstdc++-v3/include/bits/valarray_array.h
  3ddbcccf58411251c2825ae41b697844  libstdc++-v3/include/bits/valarray_array.tcc
  a4c99020fc6d28e94d24a3f60a71b6ec  libstdc++-v3/include/bits/valarray_before.h
  7e44d906c5281d878723bac525e69466  libstdc++-v3/include/bits/vector.tcc
! 74f1f2455bfeb2a9e34f3d7c02a9be3c  libstdc++-v3/include/bits/version.def
! e6b0601c27473c8a3fad862bdba79816  libstdc++-v3/include/bits/version.h
  0db0dfc5d016435e64398e3bb70098d3  libstdc++-v3/include/bits/version.tpl
  6ccd70c0c36dd38ba559c1fc5a05fbd0  libstdc++-v3/include/c/cassert
  c31b54f25b2f8c7ca3ca3eec930d4e1d  libstdc++-v3/include/c/cctype
--- 138622,138635 ----
  23e3769341c471dd17aa42c532a2e463  libstdc++-v3/include/bits/unordered_set.h
  a29de34311f884bb0a7bb8854fe4ce34  libstdc++-v3/include/bits/uses_allocator.h
  b9489856439b8ba5238cd45b2f65370a  libstdc++-v3/include/bits/uses_allocator_args.h
! 6398214eff52e51af4e8b1eb3eadf034  libstdc++-v3/include/bits/utility.h
  a462fb6c466b34fa25624b7fab6323e3  libstdc++-v3/include/bits/valarray_after.h
  a229b5c8ad2904a3b3173239225596c4  libstdc++-v3/include/bits/valarray_array.h
  3ddbcccf58411251c2825ae41b697844  libstdc++-v3/include/bits/valarray_array.tcc
  a4c99020fc6d28e94d24a3f60a71b6ec  libstdc++-v3/include/bits/valarray_before.h
  7e44d906c5281d878723bac525e69466  libstdc++-v3/include/bits/vector.tcc
! d853651c7ad86b2c623638876a56db01  libstdc++-v3/include/bits/version.def
! 1263f7f3bb7e19b0cf0b109e4da9982e  libstdc++-v3/include/bits/version.h
  0db0dfc5d016435e64398e3bb70098d3  libstdc++-v3/include/bits/version.tpl
  6ccd70c0c36dd38ba559c1fc5a05fbd0  libstdc++-v3/include/c/cassert
  c31b54f25b2f8c7ca3ca3eec930d4e1d  libstdc++-v3/include/c/cctype
*************** f1cc3238df41adc204bc4f90accc63f3  libstd
*** 138946,138952 ****
  d891b88417c6426b21aee63c74ec4e98  libstdc++-v3/include/std/any
  d434b6703454e6fece0bb6ab907894d5  libstdc++-v3/include/std/array
  0629d22f554a52275f62402292b23e12  libstdc++-v3/include/std/atomic
! 4f32c26cb6bb867bc482113b2f4a9eb1  libstdc++-v3/include/std/barrier
  3522a71755241728e1ff2d4f931ff5be  libstdc++-v3/include/std/bit
  5651be4f16ccfbe8539766c53154dc20  libstdc++-v3/include/std/bitset
  3fca3267513b72857aff767e71c81692  libstdc++-v3/include/std/charconv
--- 139179,139185 ----
  d891b88417c6426b21aee63c74ec4e98  libstdc++-v3/include/std/any
  d434b6703454e6fece0bb6ab907894d5  libstdc++-v3/include/std/array
  0629d22f554a52275f62402292b23e12  libstdc++-v3/include/std/atomic
! d1730a41b18e21cbac0f5328aad2d223  libstdc++-v3/include/std/barrier
  3522a71755241728e1ff2d4f931ff5be  libstdc++-v3/include/std/bit
  5651be4f16ccfbe8539766c53154dc20  libstdc++-v3/include/std/bitset
  3fca3267513b72857aff767e71c81692  libstdc++-v3/include/std/charconv
*************** c3c1dced3bd41cb17dfb1d65d089f9d3  libstd
*** 138960,138971 ****
  ae96a272e65886b9386e26db37971da1  libstdc++-v3/include/std/execution
  13f5f9752c9229e8ce2f5a145ba63b2a  libstdc++-v3/include/std/expected
  c2e511ae49957a9f02446e544d201582  libstdc++-v3/include/std/filesystem
! f178b6bdcfd6bb2ca46e3cdf19989aaf  libstdc++-v3/include/std/flat_map
  8a5fa0a4bb554b2db8c2fed26a6993ca  libstdc++-v3/include/std/flat_set
  185c76e0066f6c1f63b259bc67e3671e  libstdc++-v3/include/std/format
  fa4316749922813b44f2ee282452813b  libstdc++-v3/include/std/forward_list
  e790ae6877466aa86b47f36d201e8563  libstdc++-v3/include/std/fstream
! 52b0de886d5de3c5cf37079e9e0c831e  libstdc++-v3/include/std/functional
  d472ad4b1b5c12e2f731980802d15b50  libstdc++-v3/include/std/future
  d91bc94f2a9c1ff7f642d23c27ec66ae  libstdc++-v3/include/std/generator
  90e01b4e65cec5c0a3786580b2529edb  libstdc++-v3/include/std/iomanip
--- 139193,139204 ----
  ae96a272e65886b9386e26db37971da1  libstdc++-v3/include/std/execution
  13f5f9752c9229e8ce2f5a145ba63b2a  libstdc++-v3/include/std/expected
  c2e511ae49957a9f02446e544d201582  libstdc++-v3/include/std/filesystem
! 9a3c9583f416afcb392d75d922d864a1  libstdc++-v3/include/std/flat_map
  8a5fa0a4bb554b2db8c2fed26a6993ca  libstdc++-v3/include/std/flat_set
  185c76e0066f6c1f63b259bc67e3671e  libstdc++-v3/include/std/format
  fa4316749922813b44f2ee282452813b  libstdc++-v3/include/std/forward_list
  e790ae6877466aa86b47f36d201e8563  libstdc++-v3/include/std/fstream
! 866d33497e4338e4e1a5289de701f9ba  libstdc++-v3/include/std/functional
  d472ad4b1b5c12e2f731980802d15b50  libstdc++-v3/include/std/future
  d91bc94f2a9c1ff7f642d23c27ec66ae  libstdc++-v3/include/std/generator
  90e01b4e65cec5c0a3786580b2529edb  libstdc++-v3/include/std/iomanip
*************** bf5ea5fbda7bfdc1dc462f0303fc4e99  libstd
*** 138974,138986 ****
  f7460188b5b2ffa503809fc888af8523  libstdc++-v3/include/std/iostream
  f025fc1b4184111fce84c2384de325d2  libstdc++-v3/include/std/istream
  b33cecab88c41408b5c244cc328a9cae  libstdc++-v3/include/std/iterator
! 86744254568b7b346eb02ae64f5957f3  libstdc++-v3/include/std/latch
  ed6663b9ff729b09c2bacefa3568d1fc  libstdc++-v3/include/std/limits
  c9ef2791c2dc0d6c98a1a85c8f6aa473  libstdc++-v3/include/std/list
  f4af31191dea172207576960ad71d42d  libstdc++-v3/include/std/locale
  8b76fc7da76f0579c2fd1f22821d03be  libstdc++-v3/include/std/map
! b77e4376dc6faaaf47d13c3b912c9af6  libstdc++-v3/include/std/mdspan
! ba52fc2e0904a31a08183de15bd8c424  libstdc++-v3/include/std/memory
  9e86c11ff29d60fddf403674e9182b36  libstdc++-v3/include/std/memory_resource
  a7b8e00d6cf56ea696ec15140b7c1d15  libstdc++-v3/include/std/mutex
  ef0d0725f5b70a4c1b5b62b84b2b63f7  libstdc++-v3/include/std/numbers
--- 139207,139219 ----
  f7460188b5b2ffa503809fc888af8523  libstdc++-v3/include/std/iostream
  f025fc1b4184111fce84c2384de325d2  libstdc++-v3/include/std/istream
  b33cecab88c41408b5c244cc328a9cae  libstdc++-v3/include/std/iterator
! ccf8cf0658fcc1d11f161189c25b7aa7  libstdc++-v3/include/std/latch
  ed6663b9ff729b09c2bacefa3568d1fc  libstdc++-v3/include/std/limits
  c9ef2791c2dc0d6c98a1a85c8f6aa473  libstdc++-v3/include/std/list
  f4af31191dea172207576960ad71d42d  libstdc++-v3/include/std/locale
  8b76fc7da76f0579c2fd1f22821d03be  libstdc++-v3/include/std/map
! 1acc29ca9bc70866ca3b49f2fd2d6c5b  libstdc++-v3/include/std/mdspan
! 0520cac0dd2a0a1a25f885c7830b6051  libstdc++-v3/include/std/memory
  9e86c11ff29d60fddf403674e9182b36  libstdc++-v3/include/std/memory_resource
  a7b8e00d6cf56ea696ec15140b7c1d15  libstdc++-v3/include/std/mutex
  ef0d0725f5b70a4c1b5b62b84b2b63f7  libstdc++-v3/include/std/numbers
*************** b944796362aa39fc1cba3747d2247464  libstd
*** 138994,139000 ****
  a28bf4bed6789b61535d4b05ff48ba76  libstdc++-v3/include/std/ratio
  400d95a1fd416911b5c47562d7a586cf  libstdc++-v3/include/std/regex
  1bad2aed72c4537e7f08d24c1bf7d375  libstdc++-v3/include/std/scoped_allocator
! d0ccdc68b53e4f9522c73c04bfb81928  libstdc++-v3/include/std/semaphore
  9b8d5c4868a64371c6591ccd2d8ae5f0  libstdc++-v3/include/std/set
  ee32950ba29d7cda3e788de0776d8c16  libstdc++-v3/include/std/shared_mutex
  61856a4d90554afdb8c60710d5dea8c5  libstdc++-v3/include/std/source_location
--- 139227,139233 ----
  a28bf4bed6789b61535d4b05ff48ba76  libstdc++-v3/include/std/ratio
  400d95a1fd416911b5c47562d7a586cf  libstdc++-v3/include/std/regex
  1bad2aed72c4537e7f08d24c1bf7d375  libstdc++-v3/include/std/scoped_allocator
! 29188a81b4040317360024eb2b7e3e61  libstdc++-v3/include/std/semaphore
  9b8d5c4868a64371c6591ccd2d8ae5f0  libstdc++-v3/include/std/set
  ee32950ba29d7cda3e788de0776d8c16  libstdc++-v3/include/std/shared_mutex
  61856a4d90554afdb8c60710d5dea8c5  libstdc++-v3/include/std/source_location
*************** fbb127f006c65ae37d591c627cc6235c  libstd
*** 139310,139317 ****
  85b9d2e407dc7113a97234b2c23e96dc  libstdc++-v3/src/c++17/ryu/ryu_generic_128.h
  e66e202fb59625eb933c316b0bf9ee34  libstdc++-v3/src/c++17/string-inst.cc
  6bbe101ec337afce54e0c8dee6fdd6d3  libstdc++-v3/src/c++17/uint128_t.h
! 0edfe617c00f631005dac6355acaf259  libstdc++-v3/src/c++20/Makefile.am
! fc90aab2bcae05d7286b5666cd1f2be8  libstdc++-v3/src/c++20/Makefile.in
  94b3ab191e8fe566a951ac2b4f081c40  libstdc++-v3/src/c++20/format.cc
  939eb3ac7ce3c32a8b2aac493f053893  libstdc++-v3/src/c++20/sstream-inst.cc
  e9e89f4578e59d252e4caaf0b63d6dfb  libstdc++-v3/src/c++20/tzdata.zi
--- 139543,139551 ----
  85b9d2e407dc7113a97234b2c23e96dc  libstdc++-v3/src/c++17/ryu/ryu_generic_128.h
  e66e202fb59625eb933c316b0bf9ee34  libstdc++-v3/src/c++17/string-inst.cc
  6bbe101ec337afce54e0c8dee6fdd6d3  libstdc++-v3/src/c++17/uint128_t.h
! b077554d5097430340afb0af8789ea1a  libstdc++-v3/src/c++20/Makefile.am
! a70eb0f686f8378eddb86ac7513b4c9a  libstdc++-v3/src/c++20/Makefile.in
! 05b9269e2a6b70c0137a3caaff658ad4  libstdc++-v3/src/c++20/atomic.cc
  94b3ab191e8fe566a951ac2b4f081c40  libstdc++-v3/src/c++20/format.cc
  939eb3ac7ce3c32a8b2aac493f053893  libstdc++-v3/src/c++20/sstream-inst.cc
  e9e89f4578e59d252e4caaf0b63d6dfb  libstdc++-v3/src/c++20/tzdata.zi
*************** d85f3a53465585d54b96880e79456c79  libstd
*** 139322,139328 ****
  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
! 3372027d66ac2aa70b14ecba9d8eaf90  libstdc++-v3/src/c++23/std.cc.in
  ef2786c62e1aa27a5405d7bf70e5212c  libstdc++-v3/src/c++23/std.compat.cc.in
  97527213996a1ca6a0910b1ab5f6c3a3  libstdc++-v3/src/c++26/Makefile.am
  5dd6b2acd5d63f897ba1545bb9a07d25  libstdc++-v3/src/c++26/Makefile.in
--- 139556,139562 ----
  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
! 97e12936d967ba1f57b5e77ffdeba0e9  libstdc++-v3/src/c++23/std.cc.in
  ef2786c62e1aa27a5405d7bf70e5212c  libstdc++-v3/src/c++23/std.compat.cc.in
  97527213996a1ca6a0910b1ab5f6c3a3  libstdc++-v3/src/c++26/Makefile.am
  5dd6b2acd5d63f897ba1545bb9a07d25  libstdc++-v3/src/c++26/Makefile.in
*************** d80381bdd74336b121a4f087efc21dbb  libstd
*** 139389,139395 ****
  9f5552f4018925c716ba0a0498c09af9  libstdc++-v3/testsuite/17_intro/badnames.cc
  ecc5ca146d152b00b47e21b42b75654e  libstdc++-v3/testsuite/17_intro/freestanding.cc
  d5df5ddc3b7c5dba2e687798eaa28551  libstdc++-v3/testsuite/17_intro/headers/c++1998/103650.cc
! 345d73b159ab977cac2e2661993ce03a  libstdc++-v3/testsuite/17_intro/headers/c++1998/49745.cc
  834f0265b392711ace65bcb3dbec2e63  libstdc++-v3/testsuite/17_intro/headers/c++1998/all.cc
  886105b90081de6ff824c6d35f4a3a75  libstdc++-v3/testsuite/17_intro/headers/c++1998/all_attributes.cc
  cef6538efd459dca7408eca86afd7fb1  libstdc++-v3/testsuite/17_intro/headers/c++1998/all_c++200x_compatibility.cc
--- 139623,139629 ----
  9f5552f4018925c716ba0a0498c09af9  libstdc++-v3/testsuite/17_intro/badnames.cc
  ecc5ca146d152b00b47e21b42b75654e  libstdc++-v3/testsuite/17_intro/freestanding.cc
  d5df5ddc3b7c5dba2e687798eaa28551  libstdc++-v3/testsuite/17_intro/headers/c++1998/103650.cc
! 146efc6439cf02cb738cf8da2c405274  libstdc++-v3/testsuite/17_intro/headers/c++1998/49745.cc
  834f0265b392711ace65bcb3dbec2e63  libstdc++-v3/testsuite/17_intro/headers/c++1998/all.cc
  886105b90081de6ff824c6d35f4a3a75  libstdc++-v3/testsuite/17_intro/headers/c++1998/all_attributes.cc
  cef6538efd459dca7408eca86afd7fb1  libstdc++-v3/testsuite/17_intro/headers/c++1998/all_c++200x_compatibility.cc
*************** d100df3b99954e5e2a1e25ac7967528c  libstd
*** 139412,139418 ****
  fa6dd9de47fc1161957dd77bcc925b13  libstdc++-v3/testsuite/17_intro/headers/c++2011/stdc++_multiple_inclusion.cc
  e4a354a67235724c5f38b1fc51630071  libstdc++-v3/testsuite/17_intro/headers/c++2014/parallel_mode.cc
  1b083d4d975f6db8c98c387c2bf43571  libstdc++-v3/testsuite/17_intro/headers/c++2017/parallel_mode.cc
! 7f01089dc29f96fc0646e5f6eac22088  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
--- 139646,139652 ----
  fa6dd9de47fc1161957dd77bcc925b13  libstdc++-v3/testsuite/17_intro/headers/c++2011/stdc++_multiple_inclusion.cc
  e4a354a67235724c5f38b1fc51630071  libstdc++-v3/testsuite/17_intro/headers/c++2014/parallel_mode.cc
  1b083d4d975f6db8c98c387c2bf43571  libstdc++-v3/testsuite/17_intro/headers/c++2017/parallel_mode.cc
! 01e7ded25173115a457f55be07713814  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
*************** b1e66e2c7061c4da356d95b75e45b9f1  libstd
*** 140067,140072 ****
--- 140301,140313 ----
  ae2ce9313b5b55e9f92c8d0a2fdcd6ba  libstdc++-v3/testsuite/20_util/function_objects/range.cmp/lwg3530.cc
  d0675e06358623699e0ac00ab3a3b4ff  libstdc++-v3/testsuite/20_util/function_objects/range.cmp/not_equal_to.cc
  aaf31ad5f5751b35d44492f62dcf0929  libstdc++-v3/testsuite/20_util/function_objects/searchers.cc
+ f75ada21895a46443c0cf6c6c4272819  libstdc++-v3/testsuite/20_util/function_ref/assign.cc
+ 0b6df94ae01a6ff6d9ad55670d292d3e  libstdc++-v3/testsuite/20_util/function_ref/call.cc
+ e6bab8c83483438e3bf29c2ea7c9df3b  libstdc++-v3/testsuite/20_util/function_ref/cons.cc
+ 3de18ca48e3562cca5c9ed68264b9830  libstdc++-v3/testsuite/20_util/function_ref/cons_neg.cc
+ 2dc395f781a824c875fe168bd37ff7a8  libstdc++-v3/testsuite/20_util/function_ref/conv.cc
+ 251b2d0a159c5328e727be53f574da1f  libstdc++-v3/testsuite/20_util/function_ref/deduction.cc
+ 07ac98f7c18f41e232e70b8b3bbe462d  libstdc++-v3/testsuite/20_util/function_ref/mutation.cc
  73764ddebcfc0e9d84061e05bfaa4b19  libstdc++-v3/testsuite/20_util/has_unique_object_representations/requirements/explicit_instantiation.cc
  602383b745f03a3986179ef6272aa326  libstdc++-v3/testsuite/20_util/has_unique_object_representations/requirements/typedefs.cc
  7bbb4b378536783fcfba507c0ee6d368  libstdc++-v3/testsuite/20_util/has_unique_object_representations/value.cc
*************** a7a35556c59d5e1ad18b95e1dd1b842d  libstd
*** 142089,142095 ****
  b213bdb1eb571850e3ef2c115fb2f51b  libstdc++-v3/testsuite/22_locale/num_put/put/char/8.cc
  7014b4561d2c8eb753c766b1284b32c1  libstdc++-v3/testsuite/22_locale/num_put/put/char/9.cc
  c93ea9b9ac462cdfb14dee7252bb6a80  libstdc++-v3/testsuite/22_locale/num_put/put/char/9780-2.cc
! 100f3767472d256f64668bf920a042c6  libstdc++-v3/testsuite/22_locale/num_put/put/char/lwg4084.cc
  1df5c4694a982d1e8fa4f9b7730c524e  libstdc++-v3/testsuite/22_locale/num_put/put/char/wrapped_env.cc
  2e044021a8a0a495d19fc9213be4c111  libstdc++-v3/testsuite/22_locale/num_put/put/char/wrapped_locale.cc
  1a46293029fd8c2e8dfd1c6c3d2cbcf2  libstdc++-v3/testsuite/22_locale/num_put/put/wchar_t/1.cc
--- 142330,142336 ----
  b213bdb1eb571850e3ef2c115fb2f51b  libstdc++-v3/testsuite/22_locale/num_put/put/char/8.cc
  7014b4561d2c8eb753c766b1284b32c1  libstdc++-v3/testsuite/22_locale/num_put/put/char/9.cc
  c93ea9b9ac462cdfb14dee7252bb6a80  libstdc++-v3/testsuite/22_locale/num_put/put/char/9780-2.cc
! 8bc6374dce499a96ccc4da66644e31c4  libstdc++-v3/testsuite/22_locale/num_put/put/char/lwg4084.cc
  1df5c4694a982d1e8fa4f9b7730c524e  libstdc++-v3/testsuite/22_locale/num_put/put/char/wrapped_env.cc
  2e044021a8a0a495d19fc9213be4c111  libstdc++-v3/testsuite/22_locale/num_put/put/char/wrapped_locale.cc
  1a46293029fd8c2e8dfd1c6c3d2cbcf2  libstdc++-v3/testsuite/22_locale/num_put/put/wchar_t/1.cc
*************** fed94c950cb0e7ee34bd0eaf1f853d80  libstd
*** 142370,142376 ****
  cd3f181e118a4a1f049fea0eb75d38fb  libstdc++-v3/testsuite/23_containers/deque/capacity/max_size.cc
  b2ef79fde4fc391feb864d1b62136ec8  libstdc++-v3/testsuite/23_containers/deque/capacity/moveable.cc
  1e4ac3b2c61f13624b43c2ad43f4b938  libstdc++-v3/testsuite/23_containers/deque/capacity/resize_size.cc
! f981d24913a20b7f0ccdfba2d15e0b4e  libstdc++-v3/testsuite/23_containers/deque/capacity/shrink_to_fit.cc
  16b3c7ec13b7c7f8383897b0b9b43e15  libstdc++-v3/testsuite/23_containers/deque/check_construct_destroy.cc
  8079c5b7928faa98b0949b4b5b6c5546  libstdc++-v3/testsuite/23_containers/deque/cons/1.cc
  266cc333b3bdeca8fadc10be6f05b182  libstdc++-v3/testsuite/23_containers/deque/cons/2.cc
--- 142611,142617 ----
  cd3f181e118a4a1f049fea0eb75d38fb  libstdc++-v3/testsuite/23_containers/deque/capacity/max_size.cc
  b2ef79fde4fc391feb864d1b62136ec8  libstdc++-v3/testsuite/23_containers/deque/capacity/moveable.cc
  1e4ac3b2c61f13624b43c2ad43f4b938  libstdc++-v3/testsuite/23_containers/deque/capacity/resize_size.cc
! af40fcb8989cd9d8490d1b1e64ad02ad  libstdc++-v3/testsuite/23_containers/deque/capacity/shrink_to_fit.cc
  16b3c7ec13b7c7f8383897b0b9b43e15  libstdc++-v3/testsuite/23_containers/deque/check_construct_destroy.cc
  8079c5b7928faa98b0949b4b5b6c5546  libstdc++-v3/testsuite/23_containers/deque/cons/1.cc
  266cc333b3bdeca8fadc10be6f05b182  libstdc++-v3/testsuite/23_containers/deque/cons/2.cc
*************** c5f32b33de65013c0fc106b121d9adb9  libstd
*** 142455,142462 ****
  66d8e0b64dc2f55b235d2a74c80953c3  libstdc++-v3/testsuite/23_containers/deque/types/pmr_typedefs.cc
  2ef42205ec9719ecefddda3ad2adc42a  libstdc++-v3/testsuite/23_containers/deque/types/pmr_typedefs_debug.cc
  ca98b78997105b8f93c1c653568b6095  libstdc++-v3/testsuite/23_containers/deque/version.cc
! d76f6e7bfc3bf0fca1d75b6ec3435afe  libstdc++-v3/testsuite/23_containers/flat_map/1.cc
! 8e2b02d90d1195f3d96314101a171c51  libstdc++-v3/testsuite/23_containers/flat_multimap/1.cc
  9b2f42aff2cc15dfd3a3f7693a799f84  libstdc++-v3/testsuite/23_containers/flat_multiset/1.cc
  76d6af8252b5ad047167bd10312d53bc  libstdc++-v3/testsuite/23_containers/flat_set/1.cc
  0c9946a785a1bcd0c52de4c0d17ff0e9  libstdc++-v3/testsuite/23_containers/forward_list/48101-2_neg.cc
--- 142696,142703 ----
  66d8e0b64dc2f55b235d2a74c80953c3  libstdc++-v3/testsuite/23_containers/deque/types/pmr_typedefs.cc
  2ef42205ec9719ecefddda3ad2adc42a  libstdc++-v3/testsuite/23_containers/deque/types/pmr_typedefs_debug.cc
  ca98b78997105b8f93c1c653568b6095  libstdc++-v3/testsuite/23_containers/deque/version.cc
! 4aca23a1e685aa528cdd1856f1e726cf  libstdc++-v3/testsuite/23_containers/flat_map/1.cc
! 710f5ae26fb931929eec91619c0d93b9  libstdc++-v3/testsuite/23_containers/flat_multimap/1.cc
  9b2f42aff2cc15dfd3a3f7693a799f84  libstdc++-v3/testsuite/23_containers/flat_multiset/1.cc
  76d6af8252b5ad047167bd10312d53bc  libstdc++-v3/testsuite/23_containers/flat_set/1.cc
  0c9946a785a1bcd0c52de4c0d17ff0e9  libstdc++-v3/testsuite/23_containers/forward_list/48101-2_neg.cc
*************** ef8992fce519e4aeb10d10129736a163  libstd
*** 142849,142854 ****
--- 143090,143096 ----
  1a429dd433a9cca8518d6eeaf0db7ff4  libstdc++-v3/testsuite/23_containers/map/version.cc
  cf53330bcd33cbf3f9444b6c9c76a483  libstdc++-v3/testsuite/23_containers/mdspan/extents/class_mandates_neg.cc
  58d322becec5c5e65c19f17834e2a082  libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_copy.cc
+ d6a92413b18ed23d766b31740507b346  libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_default.cc
  d4de13f0203d7d66539b205b64e6fdf5  libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_ints.cc
  74773d6a3d965e479de89f3fe5d7058d  libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_shape.cc
  7dddbd46b2322b83e499829b9330469c  libstdc++-v3/testsuite/23_containers/mdspan/extents/custom_integer.cc
*************** f9ade43cfbd598c0df31fad70de89cb8  libstd
*** 143196,143202 ****
  035338db38454e0c8e7d3350734c07be  libstdc++-v3/testsuite/23_containers/unordered_map/48101_neg.cc
  a4ce6f287792de7483f5a6b7747c931f  libstdc++-v3/testsuite/23_containers/unordered_map/55043.cc
  6d6d17f3a9efdbb10a024915c0a1156e  libstdc++-v3/testsuite/23_containers/unordered_map/59548.cc
! 1f15cd9ba0c8adc02adb6ba31ffaad0f  libstdc++-v3/testsuite/23_containers/unordered_map/96088.cc
  67dd0e5b43af479051df9dfac62efc18  libstdc++-v3/testsuite/23_containers/unordered_map/allocator/copy.cc
  a8a01e13c592c286a47b813f1503adbb  libstdc++-v3/testsuite/23_containers/unordered_map/allocator/copy_assign.cc
  15f0e9013d8974f1ea0f47d999658e75  libstdc++-v3/testsuite/23_containers/unordered_map/allocator/default_init.cc
--- 143438,143444 ----
  035338db38454e0c8e7d3350734c07be  libstdc++-v3/testsuite/23_containers/unordered_map/48101_neg.cc
  a4ce6f287792de7483f5a6b7747c931f  libstdc++-v3/testsuite/23_containers/unordered_map/55043.cc
  6d6d17f3a9efdbb10a024915c0a1156e  libstdc++-v3/testsuite/23_containers/unordered_map/59548.cc
! bc7b24b838c758174409de869b8b4697  libstdc++-v3/testsuite/23_containers/unordered_map/96088.cc
  67dd0e5b43af479051df9dfac62efc18  libstdc++-v3/testsuite/23_containers/unordered_map/allocator/copy.cc
  a8a01e13c592c286a47b813f1503adbb  libstdc++-v3/testsuite/23_containers/unordered_map/allocator/copy_assign.cc
  15f0e9013d8974f1ea0f47d999658e75  libstdc++-v3/testsuite/23_containers/unordered_map/allocator/default_init.cc
*************** c96a367e9d58f24cfb14a39371dff105  libstd
*** 143318,143324 ****
  aa96d0376e9aba476cba14d071c087db  libstdc++-v3/testsuite/23_containers/unordered_multimap/48101-3_neg.cc
  18afb1f0601e09d960a83179b09bdc99  libstdc++-v3/testsuite/23_containers/unordered_multimap/48101_neg.cc
  2eb6297ac36c6e2001df2b3a08d9675e  libstdc++-v3/testsuite/23_containers/unordered_multimap/55043.cc
! 89d672ca658454c8a1406d06339c2a7f  libstdc++-v3/testsuite/23_containers/unordered_multimap/96088.cc
  754f47800400fdbd4c9cd9f51eff9561  libstdc++-v3/testsuite/23_containers/unordered_multimap/allocator/copy.cc
  4017a3428f0b11c9aaab8585328070fd  libstdc++-v3/testsuite/23_containers/unordered_multimap/allocator/copy_assign.cc
  5ebdfe9c6d24f8f5cbc9a78f13da2f21  libstdc++-v3/testsuite/23_containers/unordered_multimap/allocator/minimal.cc
--- 143560,143566 ----
  aa96d0376e9aba476cba14d071c087db  libstdc++-v3/testsuite/23_containers/unordered_multimap/48101-3_neg.cc
  18afb1f0601e09d960a83179b09bdc99  libstdc++-v3/testsuite/23_containers/unordered_multimap/48101_neg.cc
  2eb6297ac36c6e2001df2b3a08d9675e  libstdc++-v3/testsuite/23_containers/unordered_multimap/55043.cc
! 11e3b79fab64f9754e51c635fbbdbaef  libstdc++-v3/testsuite/23_containers/unordered_multimap/96088.cc
  754f47800400fdbd4c9cd9f51eff9561  libstdc++-v3/testsuite/23_containers/unordered_multimap/allocator/copy.cc
  4017a3428f0b11c9aaab8585328070fd  libstdc++-v3/testsuite/23_containers/unordered_multimap/allocator/copy_assign.cc
  5ebdfe9c6d24f8f5cbc9a78f13da2f21  libstdc++-v3/testsuite/23_containers/unordered_multimap/allocator/minimal.cc
*************** e9483856d776cb864c24735441f0baff  libstd
*** 143422,143428 ****
  861e93d0d620b135b1b3e673b5c8d1f5  libstdc++-v3/testsuite/23_containers/unordered_multiset/48101-3_neg.cc
  eca7eab5ba65fe69c4dbecd9a94b3127  libstdc++-v3/testsuite/23_containers/unordered_multiset/48101_neg.cc
  a5e65f31bf9cd70a00a9ac951b7f5e14  libstdc++-v3/testsuite/23_containers/unordered_multiset/55043.cc
! b5bbd6d87e68629a916c735a8b244b36  libstdc++-v3/testsuite/23_containers/unordered_multiset/96088.cc
  12ebd6ff35e9eb092907ff50a2384f2e  libstdc++-v3/testsuite/23_containers/unordered_multiset/allocator/copy.cc
  e9de85537441201577412baa78db4c53  libstdc++-v3/testsuite/23_containers/unordered_multiset/allocator/copy_assign.cc
  e0662f8f290eaa08f77eb2fb62245070  libstdc++-v3/testsuite/23_containers/unordered_multiset/allocator/minimal.cc
--- 143664,143670 ----
  861e93d0d620b135b1b3e673b5c8d1f5  libstdc++-v3/testsuite/23_containers/unordered_multiset/48101-3_neg.cc
  eca7eab5ba65fe69c4dbecd9a94b3127  libstdc++-v3/testsuite/23_containers/unordered_multiset/48101_neg.cc
  a5e65f31bf9cd70a00a9ac951b7f5e14  libstdc++-v3/testsuite/23_containers/unordered_multiset/55043.cc
! 2fa5bc1db87592c3d9cf37b61136fbaf  libstdc++-v3/testsuite/23_containers/unordered_multiset/96088.cc
  12ebd6ff35e9eb092907ff50a2384f2e  libstdc++-v3/testsuite/23_containers/unordered_multiset/allocator/copy.cc
  e9de85537441201577412baa78db4c53  libstdc++-v3/testsuite/23_containers/unordered_multiset/allocator/copy_assign.cc
  e0662f8f290eaa08f77eb2fb62245070  libstdc++-v3/testsuite/23_containers/unordered_multiset/allocator/minimal.cc
*************** d2146145a60cc49e2fdb57e67bc1d105  libstd
*** 143526,143532 ****
  193ce48cff616f92f00463cf14ccdf7b  libstdc++-v3/testsuite/23_containers/unordered_set/63456.cc
  a368a2fc967b8932d7c2716356398fed  libstdc++-v3/testsuite/23_containers/unordered_set/85965.cc
  081be01cca50da520b0af531462a08a0  libstdc++-v3/testsuite/23_containers/unordered_set/92124.cc
! ba5ca65519316fa0bcdf231d6641a767  libstdc++-v3/testsuite/23_containers/unordered_set/96088.cc
  bd41b183f230e2d83442d5babc12736b  libstdc++-v3/testsuite/23_containers/unordered_set/allocator/copy.cc
  47f414ad4c89c9086d261ca21e83af4a  libstdc++-v3/testsuite/23_containers/unordered_set/allocator/copy_assign.cc
  31f3c884b6892a5138691283c8bc5e9d  libstdc++-v3/testsuite/23_containers/unordered_set/allocator/default_init.cc
--- 143768,143774 ----
  193ce48cff616f92f00463cf14ccdf7b  libstdc++-v3/testsuite/23_containers/unordered_set/63456.cc
  a368a2fc967b8932d7c2716356398fed  libstdc++-v3/testsuite/23_containers/unordered_set/85965.cc
  081be01cca50da520b0af531462a08a0  libstdc++-v3/testsuite/23_containers/unordered_set/92124.cc
! c21baed7e53121f2ecc9d887bc9be08e  libstdc++-v3/testsuite/23_containers/unordered_set/96088.cc
  bd41b183f230e2d83442d5babc12736b  libstdc++-v3/testsuite/23_containers/unordered_set/allocator/copy.cc
  47f414ad4c89c9086d261ca21e83af4a  libstdc++-v3/testsuite/23_containers/unordered_set/allocator/copy_assign.cc
  31f3c884b6892a5138691283c8bc5e9d  libstdc++-v3/testsuite/23_containers/unordered_set/allocator/default_init.cc
*************** dbf77bad38ce01a34ca48b8453f71b33  libstd
*** 144001,144007 ****
  631af97d6c75b598ecf8901dc62067b2  libstdc++-v3/testsuite/24_iterators/operations/lwg2353.cc
  6bde3bb2f9a2b62486e8c9685deaf408  libstdc++-v3/testsuite/24_iterators/operations/next.cc
  63d0109ebf6fe2e478e89b2605e32b4b  libstdc++-v3/testsuite/24_iterators/operations/prev.cc
! 95675cb492b581170fee6e0845b372a9  libstdc++-v3/testsuite/24_iterators/operations/prev_neg.cc
  61b9c09bf9d35ba5395570c0bedc3eff  libstdc++-v3/testsuite/24_iterators/ostream_iterator/1.cc
  0a63df123798a9a002bf1c744d12f2fb  libstdc++-v3/testsuite/24_iterators/ostream_iterator/70766.cc
  7120f4eb778bdec67204b3c5ac16886a  libstdc++-v3/testsuite/24_iterators/ostream_iterator/requirements/base_classes.cc
--- 144243,144249 ----
  631af97d6c75b598ecf8901dc62067b2  libstdc++-v3/testsuite/24_iterators/operations/lwg2353.cc
  6bde3bb2f9a2b62486e8c9685deaf408  libstdc++-v3/testsuite/24_iterators/operations/next.cc
  63d0109ebf6fe2e478e89b2605e32b4b  libstdc++-v3/testsuite/24_iterators/operations/prev.cc
! a2679590959d29aac857516c1f15b08d  libstdc++-v3/testsuite/24_iterators/operations/prev_neg.cc
  61b9c09bf9d35ba5395570c0bedc3eff  libstdc++-v3/testsuite/24_iterators/ostream_iterator/1.cc
  0a63df123798a9a002bf1c744d12f2fb  libstdc++-v3/testsuite/24_iterators/ostream_iterator/70766.cc
  7120f4eb778bdec67204b3c5ac16886a  libstdc++-v3/testsuite/24_iterators/ostream_iterator/requirements/base_classes.cc
*************** b9ca560d061fd2101bc5bf3bf7502040  libstd
*** 144977,144983 ****
  410db2e8aa8df74425347e0e0885c613  libstdc++-v3/testsuite/26_numerics/headers/cmath/53503.cc
  c2d021928b9f2195d6c1170479bb3859  libstdc++-v3/testsuite/26_numerics/headers/cmath/60401.cc
  b5e07de73b5610780344c3969cbf1b72  libstdc++-v3/testsuite/26_numerics/headers/cmath/60637.cc
! 05618c9a2dd1a7db9d47d3c1a29cd9aa  libstdc++-v3/testsuite/26_numerics/headers/cmath/82644.cc
  dbf2d5c557791261217976d7c10e2c8a  libstdc++-v3/testsuite/26_numerics/headers/cmath/c99_classification_macros_c++11.cc
  48f4f7bb7c17ea98a9d02f4491ed03d8  libstdc++-v3/testsuite/26_numerics/headers/cmath/c99_classification_macros_c++23.cc
  61ad87d18d985c605d0c8c5121333121  libstdc++-v3/testsuite/26_numerics/headers/cmath/c99_classification_macros_c++98.cc
--- 145219,145225 ----
  410db2e8aa8df74425347e0e0885c613  libstdc++-v3/testsuite/26_numerics/headers/cmath/53503.cc
  c2d021928b9f2195d6c1170479bb3859  libstdc++-v3/testsuite/26_numerics/headers/cmath/60401.cc
  b5e07de73b5610780344c3969cbf1b72  libstdc++-v3/testsuite/26_numerics/headers/cmath/60637.cc
! 127642aa0c4f47ba0496a390b940ca45  libstdc++-v3/testsuite/26_numerics/headers/cmath/82644.cc
  dbf2d5c557791261217976d7c10e2c8a  libstdc++-v3/testsuite/26_numerics/headers/cmath/c99_classification_macros_c++11.cc
  48f4f7bb7c17ea98a9d02f4491ed03d8  libstdc++-v3/testsuite/26_numerics/headers/cmath/c99_classification_macros_c++23.cc
  61ad87d18d985c605d0c8c5121333121  libstdc++-v3/testsuite/26_numerics/headers/cmath/c99_classification_macros_c++98.cc
*************** f496e93f7e9535af5c3ac36949b1562b  libstd
*** 145011,145016 ****
--- 145253,145259 ----
  fa2fffdc74d1c71da3e95f4d5fea4eed  libstdc++-v3/testsuite/26_numerics/headers/cstdlib/2190.cc
  72e849e5c3dbbff5f037a450a9e3b39f  libstdc++-v3/testsuite/26_numerics/headers/cstdlib/54686.cc
  9e358b76611496435f600dff7787a72d  libstdc++-v3/testsuite/26_numerics/headers/cstdlib/60401.cc
+ caf0644e0d7699c6a133d99ad8a45677  libstdc++-v3/testsuite/26_numerics/headers/cstdlib/abs128.cc
  0a2851cd7f729df2c512cac5fd7cd753  libstdc++-v3/testsuite/26_numerics/headers/cstdlib/dr2192.cc
  a8e61a4c82556e91891f6f1f968aedbf  libstdc++-v3/testsuite/26_numerics/headers/cstdlib/dr2192_neg.cc
  8533d4433e4e18a391b3160983b61c7e  libstdc++-v3/testsuite/26_numerics/headers/cstdlib/dr2735.cc
*************** b3d8282607956ee4826df350c5a70605  libstd
*** 146783,146789 ****
  f08bda434201147cbbae0882f57b6f85  libstdc++-v3/testsuite/29_atomics/atomic/requirements/typedefs.cc
  f51c048c81346d717df317430049cb80  libstdc++-v3/testsuite/29_atomics/atomic/requirements/types_neg.cc
  4ba60a21ca727b934f2ac2dcda3e7eba  libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/1.cc
! db9040fffdbcb3b64ec9382c91ed665d  libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/100334.cc
  0c57c2f91f968ace2a2fc16b2f362a94  libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/102994.cc
  62513df9153146f9259029770f2ed55b  libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/2.cc
  051d0476748c18a98db0b8aa7f357b8e  libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/bool.cc
--- 147026,147032 ----
  f08bda434201147cbbae0882f57b6f85  libstdc++-v3/testsuite/29_atomics/atomic/requirements/typedefs.cc
  f51c048c81346d717df317430049cb80  libstdc++-v3/testsuite/29_atomics/atomic/requirements/types_neg.cc
  4ba60a21ca727b934f2ac2dcda3e7eba  libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/1.cc
! d83dbdce3ea29e2b1a8cef08ae7b805f  libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/100334.cc
  0c57c2f91f968ace2a2fc16b2f362a94  libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/102994.cc
  62513df9153146f9259029770f2ed55b  libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/2.cc
  051d0476748c18a98db0b8aa7f357b8e  libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/bool.cc
*************** d8113b1741061ea9e18a21992a52e9b3  libstd
*** 146836,146842 ****
  ae6700b4bf5b034e318443bed6ddfe00  libstdc++-v3/testsuite/29_atomics/atomic_integral/requirements/standard_layout.cc
  67a7c5f355d86ec391313b189990e536  libstdc++-v3/testsuite/29_atomics/atomic_integral/requirements/trivial.cc
  60777342aa8417d9342641e5ddea0ff6  libstdc++-v3/testsuite/29_atomics/atomic_integral/requirements/typedefs.cc
! 77d86dcb08ba2fbe354e43ff82613b7e  libstdc++-v3/testsuite/29_atomics/atomic_integral/wait_notify.cc
  2520a5ed0800d70a9eed602c5f43cdb9  libstdc++-v3/testsuite/29_atomics/atomic_ref/bool.cc
  32c306fa56643321c7e2c4c7920c2990  libstdc++-v3/testsuite/29_atomics/atomic_ref/compare_exchange_padding.cc
  d2f689741866931a30a544aad7d4f9de  libstdc++-v3/testsuite/29_atomics/atomic_ref/deduction.cc
--- 147079,147085 ----
  ae6700b4bf5b034e318443bed6ddfe00  libstdc++-v3/testsuite/29_atomics/atomic_integral/requirements/standard_layout.cc
  67a7c5f355d86ec391313b189990e536  libstdc++-v3/testsuite/29_atomics/atomic_integral/requirements/trivial.cc
  60777342aa8417d9342641e5ddea0ff6  libstdc++-v3/testsuite/29_atomics/atomic_integral/requirements/typedefs.cc
! 8019a55f591bbf7ad697e4f3cf7d9904  libstdc++-v3/testsuite/29_atomics/atomic_integral/wait_notify.cc
  2520a5ed0800d70a9eed602c5f43cdb9  libstdc++-v3/testsuite/29_atomics/atomic_ref/bool.cc
  32c306fa56643321c7e2c4c7920c2990  libstdc++-v3/testsuite/29_atomics/atomic_ref/compare_exchange_padding.cc
  d2f689741866931a30a544aad7d4f9de  libstdc++-v3/testsuite/29_atomics/atomic_ref/deduction.cc
*************** d64918f853977f3af217ab9dc4e7db07  libstd
*** 146877,146882 ****
--- 147120,147127 ----
  a5d6607362cb1730b0eb170378baada8  libstdc++-v3/testsuite/30_threads/barrier/arrive_and_drop.cc
  d44eb2ed4480e7bdd222001853336093  libstdc++-v3/testsuite/30_threads/barrier/arrive_and_wait.cc
  22c8451c0cac084a6c1677ab2d250568  libstdc++-v3/testsuite/30_threads/barrier/completion.cc
+ f73c3005579f355eead377fe939119a0  libstdc++-v3/testsuite/30_threads/barrier/cons.cc
+ f965da2a54e1f9ba8baa63ebe6bd8fab  libstdc++-v3/testsuite/30_threads/barrier/lwg3898.cc
  5fec9dcec58b3fdb79b6bc04bbc6b8ac  libstdc++-v3/testsuite/30_threads/call_once/39909.cc
  189b59966abaa4bc85553e6d82e6d90b  libstdc++-v3/testsuite/30_threads/call_once/49668.cc
  574a14df8931e79947604a5c5324e3db  libstdc++-v3/testsuite/30_threads/call_once/60497.cc
*************** c08ecc556763caa8424e75d0366adda3  libstd
*** 147067,147079 ****
  f4a8a2d74bc16221b34e102342dd7256  libstdc++-v3/testsuite/30_threads/scoped_lock/requirements/explicit_instantiation.cc
  a5016633d435a0151778486da6a6bb36  libstdc++-v3/testsuite/30_threads/scoped_lock/requirements/typedefs.cc
  ca8bc8826b00f7ab2b7b4922e5f675c6  libstdc++-v3/testsuite/30_threads/semaphore/1.cc
! e7a6c2bc00e156939f96d542373fea2d  libstdc++-v3/testsuite/30_threads/semaphore/100806.cc
  6c93d0876a2bf86d96675d4c9a30d8b7  libstdc++-v3/testsuite/30_threads/semaphore/2.cc
  9b53d7368cacb8dc413d6a74cb85bcb5  libstdc++-v3/testsuite/30_threads/semaphore/least_max_value_neg.cc
- b8ca5db991085efe7f58473647eff82a  libstdc++-v3/testsuite/30_threads/semaphore/platform_try_acquire_for.cc
  5afa3086b34916390261ea23a2491501  libstdc++-v3/testsuite/30_threads/semaphore/try_acquire.cc
  4f207de1d73d5bd34d9e8795669f8336  libstdc++-v3/testsuite/30_threads/semaphore/try_acquire_for.cc
- 015184b0a1766764ba755a3942a47ae0  libstdc++-v3/testsuite/30_threads/semaphore/try_acquire_posix.cc
  c9dd80031d6b79f53eaac381d40b5587  libstdc++-v3/testsuite/30_threads/semaphore/try_acquire_until.cc
  c5cb880fec7ba8a061cab8fbdfa71e18  libstdc++-v3/testsuite/30_threads/shared_future/cons/assign.cc
  f1e22f182f98e9cd74e79b69efe28617  libstdc++-v3/testsuite/30_threads/shared_future/cons/constexpr.cc
--- 147312,147323 ----
  f4a8a2d74bc16221b34e102342dd7256  libstdc++-v3/testsuite/30_threads/scoped_lock/requirements/explicit_instantiation.cc
  a5016633d435a0151778486da6a6bb36  libstdc++-v3/testsuite/30_threads/scoped_lock/requirements/typedefs.cc
  ca8bc8826b00f7ab2b7b4922e5f675c6  libstdc++-v3/testsuite/30_threads/semaphore/1.cc
! 57c8658b1850c9bcf97a3d0f4692e542  libstdc++-v3/testsuite/30_threads/semaphore/100806.cc
  6c93d0876a2bf86d96675d4c9a30d8b7  libstdc++-v3/testsuite/30_threads/semaphore/2.cc
+ 2b0ad80e57172787d7d892d819efc6a6  libstdc++-v3/testsuite/30_threads/semaphore/cons.cc
  9b53d7368cacb8dc413d6a74cb85bcb5  libstdc++-v3/testsuite/30_threads/semaphore/least_max_value_neg.cc
  5afa3086b34916390261ea23a2491501  libstdc++-v3/testsuite/30_threads/semaphore/try_acquire.cc
  4f207de1d73d5bd34d9e8795669f8336  libstdc++-v3/testsuite/30_threads/semaphore/try_acquire_for.cc
  c9dd80031d6b79f53eaac381d40b5587  libstdc++-v3/testsuite/30_threads/semaphore/try_acquire_until.cc
  c5cb880fec7ba8a061cab8fbdfa71e18  libstdc++-v3/testsuite/30_threads/shared_future/cons/assign.cc
  f1e22f182f98e9cd74e79b69efe28617  libstdc++-v3/testsuite/30_threads/shared_future/cons/constexpr.cc
*************** cad95ece17e740fb1f7b03b1d78b76a1  libstd
*** 147554,147560 ****
  a2a09869b9694d902f8143e6fe259895  libstdc++-v3/testsuite/experimental/memory_resource/new_delete_resource.cc
  ae07841c664c8d013f629a5ace0dfe50  libstdc++-v3/testsuite/experimental/memory_resource/null_memory_resource.cc
  3107784fe960cbb520edd9c5bc6fe291  libstdc++-v3/testsuite/experimental/memory_resource/resource_adaptor.cc
! bee6e51d376b6b2953327fed03cca438  libstdc++-v3/testsuite/experimental/names.cc
  c3a63eae7968117044a7c2462f8fca16  libstdc++-v3/testsuite/experimental/net/buffer/arithmetic.cc
  9b444aabd71eae2c828b01f2c72a01c1  libstdc++-v3/testsuite/experimental/net/buffer/const.cc
  e5f7a5f053b81f20998e5834b64d953e  libstdc++-v3/testsuite/experimental/net/buffer/creation.cc
--- 147798,147804 ----
  a2a09869b9694d902f8143e6fe259895  libstdc++-v3/testsuite/experimental/memory_resource/new_delete_resource.cc
  ae07841c664c8d013f629a5ace0dfe50  libstdc++-v3/testsuite/experimental/memory_resource/null_memory_resource.cc
  3107784fe960cbb520edd9c5bc6fe291  libstdc++-v3/testsuite/experimental/memory_resource/resource_adaptor.cc
! e8b20912d948455f8c08fe9b1a2a9f00  libstdc++-v3/testsuite/experimental/names.cc
  c3a63eae7968117044a7c2462f8fca16  libstdc++-v3/testsuite/experimental/net/buffer/arithmetic.cc
  9b444aabd71eae2c828b01f2c72a01c1  libstdc++-v3/testsuite/experimental/net/buffer/const.cc
  e5f7a5f053b81f20998e5834b64d953e  libstdc++-v3/testsuite/experimental/net/buffer/creation.cc
*************** cce32ddc9f763f73b9ecdd456f62dad8  libstd
*** 148440,148446 ****
  d52aff2e6dfd886a32da7955635ed09e  libstdc++-v3/testsuite/std/format/arguments/args_neg.cc
  0ae0aa3194832d790df652a9ef7d17c7  libstdc++-v3/testsuite/std/format/arguments/lwg3810.cc
  088e48d84af728cffa21af00b37e3c04  libstdc++-v3/testsuite/std/format/context.cc
! f80b4b5da8b26e8bebec2557463e6436  libstdc++-v3/testsuite/std/format/debug.cc
  4e1e1bd1eb1b2db2e9f55215527ebcd0  libstdc++-v3/testsuite/std/format/debug_nonunicode.cc
  3f84148bfc5153a2278f3c8c413dad98  libstdc++-v3/testsuite/std/format/error.cc
  6425de3f85b700ce40dd3b11d934ee43  libstdc++-v3/testsuite/std/format/format_string.cc
--- 148684,148690 ----
  d52aff2e6dfd886a32da7955635ed09e  libstdc++-v3/testsuite/std/format/arguments/args_neg.cc
  0ae0aa3194832d790df652a9ef7d17c7  libstdc++-v3/testsuite/std/format/arguments/lwg3810.cc
  088e48d84af728cffa21af00b37e3c04  libstdc++-v3/testsuite/std/format/context.cc
! ac6943ffc556ba9453e858169233ff57  libstdc++-v3/testsuite/std/format/debug.cc
  4e1e1bd1eb1b2db2e9f55215527ebcd0  libstdc++-v3/testsuite/std/format/debug_nonunicode.cc
  3f84148bfc5153a2278f3c8c413dad98  libstdc++-v3/testsuite/std/format/error.cc
  6425de3f85b700ce40dd3b11d934ee43  libstdc++-v3/testsuite/std/format/format_string.cc
*************** e7d2a20ce851bd6197787606fcea68bd  libstd
*** 148452,148458 ****
  9da8b451d80f7ce437c2c7f6cfcee138  libstdc++-v3/testsuite/std/format/formatter/requirements.cc
  a1d452e66d840a306985b18ad9ae0a8e  libstdc++-v3/testsuite/std/format/functions/107871.cc
  a7244ffd437f4addc853cfdd012c5cba  libstdc++-v3/testsuite/std/format/functions/114519.cc
! 237708e398bc572134fcc5d5ca701f62  libstdc++-v3/testsuite/std/format/functions/format.cc
  8ee425f04d2e4782e67ab2eb62208b7f  libstdc++-v3/testsuite/std/format/functions/format_to.cc
  c5e2b63672ec2df6fdcba9b4e1ba3ba0  libstdc++-v3/testsuite/std/format/functions/format_to_n.cc
  f859e29ec6cd7017c9d0abc60ed4b8ce  libstdc++-v3/testsuite/std/format/functions/size.cc
--- 148696,148702 ----
  9da8b451d80f7ce437c2c7f6cfcee138  libstdc++-v3/testsuite/std/format/formatter/requirements.cc
  a1d452e66d840a306985b18ad9ae0a8e  libstdc++-v3/testsuite/std/format/functions/107871.cc
  a7244ffd437f4addc853cfdd012c5cba  libstdc++-v3/testsuite/std/format/functions/114519.cc
! 65da57eca7a76cae7e4d9d49643039ed  libstdc++-v3/testsuite/std/format/functions/format.cc
  8ee425f04d2e4782e67ab2eb62208b7f  libstdc++-v3/testsuite/std/format/functions/format_to.cc
  c5e2b63672ec2df6fdcba9b4e1ba3ba0  libstdc++-v3/testsuite/std/format/functions/format_to_n.cc
  f859e29ec6cd7017c9d0abc60ed4b8ce  libstdc++-v3/testsuite/std/format/functions/size.cc
*************** e45555ead95d55c0d93f49cd0bd71984  libstd
*** 148471,148476 ****
--- 148715,148728 ----
  c400d0d58ad702f461b28668dc629c09  libstdc++-v3/testsuite/std/format/string.cc
  9818aa3a29f6312d9efbbdc1369fdc1f  libstdc++-v3/testsuite/std/format/string_neg.cc
  dc89beebf6f3de0a9e0df54272ec2939  libstdc++-v3/testsuite/std/format/tuple.cc
+ 1ee4f09d4811a5b094ebc85dd48142f9  libstdc++-v3/testsuite/std/memory/indirect/copy.cc
+ 2b0944a1839541995d0521288e45e718  libstdc++-v3/testsuite/std/memory/indirect/copy_alloc.cc
+ b66acde099f00f183d242567d716ce77  libstdc++-v3/testsuite/std/memory/indirect/ctor.cc
+ 7cd605544175affb50e32aca7d11e0e5  libstdc++-v3/testsuite/std/memory/indirect/incomplete.cc
+ 3a2f27b06480e76c264f7c639bb1d676  libstdc++-v3/testsuite/std/memory/indirect/invalid_neg.cc
+ 47d2f6e77c7a9f2340bdb3f3d4b87adb  libstdc++-v3/testsuite/std/memory/indirect/move.cc
+ f7f913b9b36585aa320d330e01a6161e  libstdc++-v3/testsuite/std/memory/indirect/move_alloc.cc
+ bd53b7a3045c16d0fa75e9a8be586efe  libstdc++-v3/testsuite/std/memory/indirect/relops.cc
  716be24e6491ab60adb349f3f5c0b720  libstdc++-v3/testsuite/std/ranges/97600.cc
  9f1ea1f1671d48aea7ae18a55694c05d  libstdc++-v3/testsuite/std/ranges/access/101782.cc
  ccd1ddf5ca05fc6916f617c3d3b1a4c6  libstdc++-v3/testsuite/std/ranges/access/begin.cc
*************** a87e1152f6bc2804b93ce070a51eeb54  libstd
*** 148597,148602 ****
--- 148849,148855 ----
  61d414725d4c256089a1075c566c8b58  libstdc++-v3/testsuite/std/time/day/1.cc
  9b5b79c912b11d4f48e1fb35fb111742  libstdc++-v3/testsuite/std/time/day/io.cc
  1cfa2f31c3dde7297b8ca55ba69d3f47  libstdc++-v3/testsuite/std/time/exceptions.cc
+ 797c16d4856f9d25867258ef9a3bd8dd  libstdc++-v3/testsuite/std/time/format/empty_spec.cc
  90714e66b9741259bb9b9cd2ea23288c  libstdc++-v3/testsuite/std/time/format/format.cc
  06b738d93b3d78681b0da48efd0a60bf  libstdc++-v3/testsuite/std/time/format/localized.cc
  9cd4d6791c125e40939cae77277f928d  libstdc++-v3/testsuite/std/time/format/pr117085.cc
*************** bbbd22e9353d1437c3adc6e0ff6b5a3a  libstd
*** 149365,149371 ****
  b42a4c3e06ba1cc6a691782e7e7471a8  libstdc++-v3/testsuite/util/statistic/sample_mean.hpp
  e40ab277ce041f5e5e285fc7d50cb06f  libstdc++-v3/testsuite/util/statistic/sample_mean_confidence_checker.hpp
  f2b0e4d916814dffed575ea22219e282  libstdc++-v3/testsuite/util/statistic/sample_variance.hpp
! 653e45896c749a0d78a1d9615b3660a7  libstdc++-v3/testsuite/util/testsuite_abi.cc
  115aa7d14fbe6ab56dfbe3ea70aae859  libstdc++-v3/testsuite/util/testsuite_abi.h
  48ffba86c4669f3a97144b731fcff6cd  libstdc++-v3/testsuite/util/testsuite_abi_check.cc
  5181eaba4b9bb86b0b6e535b11d64fe3  libstdc++-v3/testsuite/util/testsuite_allocator.cc
--- 149618,149624 ----
  b42a4c3e06ba1cc6a691782e7e7471a8  libstdc++-v3/testsuite/util/statistic/sample_mean.hpp
  e40ab277ce041f5e5e285fc7d50cb06f  libstdc++-v3/testsuite/util/statistic/sample_mean_confidence_checker.hpp
  f2b0e4d916814dffed575ea22219e282  libstdc++-v3/testsuite/util/statistic/sample_variance.hpp
! e6f20cdd0565758ddfc709021eccfe0c  libstdc++-v3/testsuite/util/testsuite_abi.cc
  115aa7d14fbe6ab56dfbe3ea70aae859  libstdc++-v3/testsuite/util/testsuite_abi.h
  48ffba86c4669f3a97144b731fcff6cd  libstdc++-v3/testsuite/util/testsuite_abi_check.cc
  5181eaba4b9bb86b0b6e535b11d64fe3  libstdc++-v3/testsuite/util/testsuite_allocator.cc
diff -Nrcpad gcc-16-20250525/Makefile.def gcc-16-20250601/Makefile.def
*** gcc-16-20250525/Makefile.def	Sun May 25 22:32:04 2025
--- gcc-16-20250601/Makefile.def	Sun Jun  1 22:32:12 2025
*************** bootstrap_stage = {
*** 758,764 ****
  	bootstrap_target=profiledbootstrap ; };
  bootstrap_stage = {
  	id=autoprofile ; prev=1 ;
!         autoprofile="$$s/gcc/config/i386/$(AUTO_PROFILE)" ; };
  bootstrap_stage = {
  	id=autofeedback ; prev=autoprofile ;
  	bootstrap_target=autoprofiledbootstrap ;
--- 758,764 ----
  	bootstrap_target=profiledbootstrap ; };
  bootstrap_stage = {
  	id=autoprofile ; prev=1 ;
!         autoprofile="$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE)" ; };
  bootstrap_stage = {
  	id=autofeedback ; prev=autoprofile ;
  	bootstrap_target=autoprofiledbootstrap ;
diff -Nrcpad gcc-16-20250525/Makefile.in gcc-16-20250601/Makefile.in
*** gcc-16-20250525/Makefile.in	Sun May 25 22:32:04 2025
--- gcc-16-20250601/Makefile.in	Sun Jun  1 22:32:52 2025
*************** build_alias=@build_noncanonical@
*** 38,43 ****
--- 38,44 ----
  build_vendor=@build_vendor@
  build_os=@build_os@
  build=@build@
+ cpu_type=@cpu_type@
  host_alias=@host_noncanonical@
  host_vendor=@host_vendor@
  host_os=@host_os@
*************** all-stageautoprofile-bfd: configure-stag
*** 4271,4277 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/bfd && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 4272,4278 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/bfd && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-opcodes: configure-
*** 5411,5417 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/opcodes && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 5412,5418 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/opcodes && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-binutils: configure
*** 6551,6557 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/binutils && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 6552,6558 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/binutils && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-fixincludes: config
*** 10037,10043 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/fixincludes && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 10038,10044 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/fixincludes && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-gas: configure-stag
*** 11617,11623 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/gas && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 11618,11624 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/gas && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-gcc: configure-stag
*** 12766,12772 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/gcc && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 12767,12773 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/gcc && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-gmp: configure-stag
*** 13915,13921 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/gmp && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 13916,13922 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/gmp && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-mpfr: configure-sta
*** 15052,15058 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/mpfr && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 15053,15059 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/mpfr && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-mpc: configure-stag
*** 16189,16195 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/mpc && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 16190,16196 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/mpc && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-isl: configure-stag
*** 17326,17332 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/isl && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 17327,17333 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/isl && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-gold: configure-sta
*** 18454,18460 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/gold && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 18455,18461 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/gold && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-gettext: configure-
*** 20539,20545 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/gettext && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 20540,20546 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/gettext && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-ld: configure-stage
*** 22449,22455 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/ld && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 22450,22456 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/ld && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-libbacktrace: confi
*** 23589,23595 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/libbacktrace && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 23590,23596 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/libbacktrace && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-libcpp: configure-s
*** 24729,24735 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/libcpp && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 24730,24736 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/libcpp && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-libcody: configure-
*** 25869,25875 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/libcody && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 25870,25876 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/libcody && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-libdecnumber: confi
*** 26858,26864 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/libdecnumber && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 26859,26865 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/libdecnumber && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-libiberty: configur
*** 28460,28466 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/libiberty && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 28461,28467 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/libiberty && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-libiberty-linker-pl
*** 29609,29615 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/libiberty-linker-plugin && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 29610,29616 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/libiberty-linker-plugin && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-libiconv: configure
*** 30758,30764 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/libiconv && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 30759,30765 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/libiconv && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-zlib: configure-sta
*** 34130,34136 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/zlib && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 34131,34137 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/zlib && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-lto-plugin: configu
*** 40321,40327 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/lto-plugin && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 40322,40328 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/lto-plugin && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-libctf: configure-s
*** 42397,42403 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/libctf && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 42398,42404 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/libctf && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-libsframe: configur
*** 43537,43543 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/libsframe && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 43538,43544 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/libsframe && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-libgrust: configure
*** 44677,44683 ****
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/libgrust && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
--- 44678,44684 ----
  	$(HOST_EXPORTS) \
  	$(POSTSTAGE1_HOST_EXPORTS)  \
  	cd $(HOST_SUBDIR)/libgrust && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
  		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
*************** all-stageautoprofile-target-libstdc++-v3
*** 45939,45945 ****
  	$(RAW_CXX_TARGET_EXPORTS) \
  	  \
  	cd $(TARGET_SUBDIR)/libstdc++-v3 && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(CFLAGS_FOR_TARGET)" \
  		CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \
--- 45940,45946 ----
  	$(RAW_CXX_TARGET_EXPORTS) \
  	  \
  	cd $(TARGET_SUBDIR)/libstdc++-v3 && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(CFLAGS_FOR_TARGET)" \
  		CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \
*************** all-stageautoprofile-target-libsanitizer
*** 47209,47215 ****
  	$(RAW_CXX_TARGET_EXPORTS) \
  	  \
  	cd $(TARGET_SUBDIR)/libsanitizer && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(CFLAGS_FOR_TARGET)" \
  		CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \
--- 47210,47216 ----
  	$(RAW_CXX_TARGET_EXPORTS) \
  	  \
  	cd $(TARGET_SUBDIR)/libsanitizer && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(CFLAGS_FOR_TARGET)" \
  		CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \
*************** all-stageautoprofile-target-libvtv: conf
*** 48479,48485 ****
  	$(RAW_CXX_TARGET_EXPORTS) \
  	  \
  	cd $(TARGET_SUBDIR)/libvtv && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(CFLAGS_FOR_TARGET)" \
  		CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \
--- 48480,48486 ----
  	$(RAW_CXX_TARGET_EXPORTS) \
  	  \
  	cd $(TARGET_SUBDIR)/libvtv && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(CFLAGS_FOR_TARGET)" \
  		CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \
*************** all-stageautoprofile-target-libgcc: conf
*** 50719,50725 ****
  	$(NORMAL_TARGET_EXPORTS) \
  	  \
  	cd $(TARGET_SUBDIR)/libgcc && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(CFLAGS_FOR_TARGET)" \
  		CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \
--- 50720,50726 ----
  	$(NORMAL_TARGET_EXPORTS) \
  	  \
  	cd $(TARGET_SUBDIR)/libgcc && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(CFLAGS_FOR_TARGET)" \
  		CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \
*************** all-stageautoprofile-target-libbacktrace
*** 51951,51957 ****
  	$(NORMAL_TARGET_EXPORTS) \
  	  \
  	cd $(TARGET_SUBDIR)/libbacktrace && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(CFLAGS_FOR_TARGET)" \
  		CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \
--- 51952,51958 ----
  	$(NORMAL_TARGET_EXPORTS) \
  	  \
  	cd $(TARGET_SUBDIR)/libbacktrace && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(CFLAGS_FOR_TARGET)" \
  		CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \
*************** all-stageautoprofile-target-libphobos: c
*** 55128,55134 ****
  	$(NORMAL_TARGET_EXPORTS) \
  	  \
  	cd $(TARGET_SUBDIR)/libphobos && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(CFLAGS_FOR_TARGET)" \
  		CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \
--- 55129,55135 ----
  	$(NORMAL_TARGET_EXPORTS) \
  	  \
  	cd $(TARGET_SUBDIR)/libphobos && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(CFLAGS_FOR_TARGET)" \
  		CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \
*************** all-stageautoprofile-target-zlib: config
*** 58258,58264 ****
  	$(NORMAL_TARGET_EXPORTS) \
  	  \
  	cd $(TARGET_SUBDIR)/zlib && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(CFLAGS_FOR_TARGET)" \
  		CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \
--- 58259,58265 ----
  	$(NORMAL_TARGET_EXPORTS) \
  	  \
  	cd $(TARGET_SUBDIR)/zlib && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(CFLAGS_FOR_TARGET)" \
  		CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \
*************** all-stageautoprofile-target-libgomp: con
*** 60983,60989 ****
  	$(NORMAL_TARGET_EXPORTS) \
  	  \
  	cd $(TARGET_SUBDIR)/libgomp && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(CFLAGS_FOR_TARGET)" \
  		CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \
--- 60984,60990 ----
  	$(NORMAL_TARGET_EXPORTS) \
  	  \
  	cd $(TARGET_SUBDIR)/libgomp && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(CFLAGS_FOR_TARGET)" \
  		CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \
*************** all-stageautoprofile-target-libatomic: c
*** 62738,62744 ****
  	$(NORMAL_TARGET_EXPORTS) \
  	  \
  	cd $(TARGET_SUBDIR)/libatomic && \
! 	$$s/gcc/config/i386/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(CFLAGS_FOR_TARGET)" \
  		CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \
--- 62739,62745 ----
  	$(NORMAL_TARGET_EXPORTS) \
  	  \
  	cd $(TARGET_SUBDIR)/libatomic && \
! 	$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \
  	$(MAKE) $(BASE_FLAGS_TO_PASS) \
  		CFLAGS="$(CFLAGS_FOR_TARGET)" \
  		CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \
diff -Nrcpad gcc-16-20250525/Makefile.tpl gcc-16-20250601/Makefile.tpl
*** gcc-16-20250525/Makefile.tpl	Sun May 25 22:32:04 2025
--- gcc-16-20250601/Makefile.tpl	Sun Jun  1 22:32:12 2025
*************** build_alias=@build_noncanonical@
*** 41,46 ****
--- 41,47 ----
  build_vendor=@build_vendor@
  build_os=@build_os@
  build=@build@
+ cpu_type=@cpu_type@
  host_alias=@host_noncanonical@
  host_vendor=@host_vendor@
  host_os=@host_os@
diff -Nrcpad gcc-16-20250525/configure gcc-16-20250601/configure
*** gcc-16-20250525/configure	Sun May 25 22:32:04 2025
--- gcc-16-20250601/configure	Sun Jun  1 22:32:52 2025
*************** CPPFLAGS
*** 730,735 ****
--- 730,736 ----
  LDFLAGS
  CFLAGS
  CC
+ cpu_type
  target_subdir
  host_subdir
  build_subdir
*************** case "${target}" in
*** 3395,3400 ****
--- 3396,3404 ----
      ;;
  esac
  
+ cpu_type=`echo ${host} | sed 's/-.*$//'`
+ 
+ 
  # Disable libssp for some systems.
  case "${target}" in
    avr-*-*)
diff -Nrcpad gcc-16-20250525/configure.ac gcc-16-20250601/configure.ac
*** gcc-16-20250525/configure.ac	Sun May 25 22:32:04 2025
--- gcc-16-20250601/configure.ac	Sun Jun  1 22:32:13 2025
*************** case "${target}" in
*** 621,626 ****
--- 621,629 ----
      ;;
  esac
  
+ cpu_type=`echo ${host} | sed 's/-.*$//'`
+ AC_SUBST(cpu_type)
+ 
  # Disable libssp for some systems.
  case "${target}" in
    avr-*-*)
diff -Nrcpad gcc-16-20250525/contrib/ChangeLog gcc-16-20250601/contrib/ChangeLog
*** gcc-16-20250525/contrib/ChangeLog	Sun May 25 22:32:04 2025
--- gcc-16-20250601/contrib/ChangeLog	Sun Jun  1 22:32:13 2025
***************
*** 1,3 ****
--- 1,8 ----
+ 2025-05-27  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* gen_autofdo_event.py: Add support for AMD Zen 3 and
+ 	later CPUs.
+ 
  2025-05-23  Andi Kleen  <ak@gcc.gnu.org>
  
  	* diffsummary.py: New file.
diff -Nrcpad gcc-16-20250525/contrib/gen_autofdo_event.py gcc-16-20250601/contrib/gen_autofdo_event.py
*** gcc-16-20250525/contrib/gen_autofdo_event.py	Sun May 25 22:32:04 2025
--- gcc-16-20250601/contrib/gen_autofdo_event.py	Sun Jun  1 22:32:13 2025
*************** if [ "$1" = "--all" ] ; then
*** 138,145 ****
    shift
  fi
  
! if ! grep -q Intel /proc/cpuinfo ; then
!   echo >&2 "Only Intel CPUs supported"
    exit 1
  fi
  
--- 138,153 ----
    shift
  fi
  
! if grep -q AuthenticAMD /proc/cpuinfo ; then
!   vendor=AMD
!   if ! grep -q " brs" /proc/cpuinfo && ! grep -q amd_lbr_v2 /proc/cpuinfo ; then
!     echo >&2 "AMD CPU with brs (Zen 3) or amd_lbr_v2 (Zen 4+) feature is required"
!     exit 1
!   fi
! elif grep -q Intel /proc/cpuinfo ; then
!   vendor=Intel
! else
!   echo >&2 "Only AMD and Intel CPUs supported"
    exit 1
  fi
  
*************** if grep -q hypervisor /proc/cpuinfo ; th
*** 147,153 ****
    echo >&2 "Warning: branch profiling may not be functional in VMs"
  fi
  
! case `grep -E -q "^cpu family\s*: 6" /proc/cpuinfo &&
    grep -E "^model\s*:" /proc/cpuinfo | head -n1` in''')
      for event, mod in eventmap.items():
          for m in mod[:-1]:
--- 155,161 ----
    echo >&2 "Warning: branch profiling may not be functional in VMs"
  fi
  
! case `test $vendor = Intel && grep -E -q "^cpu family\s*: 6" /proc/cpuinfo &&
    grep -E "^model\s*:" /proc/cpuinfo | head -n1` in''')
      for event, mod in eventmap.items():
          for m in mod[:-1]:
*************** case `grep -E -q "^cpu family\s*: 6" /pr
*** 156,163 ****
      print(r'''*)
          if perf list br_inst_retired | grep -q br_inst_retired.near_taken ; then
              E=br_inst_retired.near_taken:p
          else
! echo >&2 "Unknown CPU. Run contrib/gen_autofdo_event.py --all --script to update script."
  	  exit 1
          fi ;;''')
      print(r"esac")
--- 164,176 ----
      print(r'''*)
          if perf list br_inst_retired | grep -q br_inst_retired.near_taken ; then
              E=br_inst_retired.near_taken:p
+         elif perf list ex_ret_brn_tkn | grep -q ex_ret_brn_tkn ; then
+             E=ex_ret_brn_tkn:P$FLAGS
+         elif $vendor = Intel ; then
+ echo >&2 "Unknown Intel CPU. Run contrib/gen_autofdo_event.py --all --script to update script."
+ 	  exit 1
          else
! echo >&2 "AMD CPU without support for ex_ret_brn_tkn event"
  	  exit 1
          fi ;;''')
      print(r"esac")
diff -Nrcpad gcc-16-20250525/gcc/ChangeLog gcc-16-20250601/gcc/ChangeLog
*** gcc-16-20250525/gcc/ChangeLog	Sun May 25 22:32:04 2025
--- gcc-16-20250601/gcc/ChangeLog	Sun Jun  1 22:32:13 2025
***************
*** 1,3 ****
--- 1,775 ----
+ 2025-05-31  Andrew Pinski  <quic_apinski@quicinc.com>
+ 
+ 	* function.h (struct function): Remove last_verified.
+ 	* gimple-harden-conditionals.cc (pass_data_harden_compares): Remove
+ 	TODO_verify_il.
+ 	(pass_data_harden_conditional_branches): Likewise.
+ 	* gimple-harden-control-flow.cc (pass_harden_control_flow_redundancy::execute):
+ 	Don't return TODO_verify_il.
+ 	* ipa-strub.cc (pass_data_ipa_strub): Remove TODO_verify_il.
+ 	* passes.cc (TODO_verify_il): Define.
+ 	(execute_function_todo): Don't use or set last_verified.
+ 	(clear_last_verified): Remove.
+ 	(execute_one_ipa_transform_pass): Update comment before execute_todo.
+ 	Assert that none of the todos have TODO_verify_il set on it.
+ 	(execute_one_pass): Don't call clear_last_verified on all functions.
+ 	Assert that none of the todos have TODO_verify_il set on it.
+ 	* tree-inline.cc (initialize_cfun): Don't copy last_verified.
+ 	* tree-pass.h (TODO_verify_all): Remove.
+ 	* tree-vrp.cc (pass_data_early_vrp): Remove TODO_verify_all.
+ 	(pass_data_fast_vrp): Likewise.
+ 
+ 2025-05-31  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/120357
+ 	* tree-vect-loop.cc (vect_create_epilog_for_reduction): Create
+ 	the conditional reduction induction IV increment before the
+ 	main IV exit.
+ 
+ 2025-05-31  Gaius Mulley  <gaiusmod2@gmail.com>
+ 
+ 	PR modula2/120389
+ 	* doc/gm2.texi (-fm2-strict-type-reason): Document new flag.
+ 
+ 2025-05-30  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR other/116792
+ 	* diagnostic-format-html.cc (HTML_STYLE): Add ".highlight-a" and
+ 	".highlight-b".
+ 	(html_builder::make_element_for_diagnostic): Handle begin_color
+ 	and end_color.
+ 	* diagnostic-show-locus.cc (to_html::to_html): Add "richloc"
+ 	param and use it to initialize m_richloc.
+ 	(to_html::colorize_text_for_range_idx): Drop.
+ 	(to_html::get_location_range_by_idx): New.
+ 	(to_html::get_highlight_color_for_range_idx): New.
+ 	(to_html::m_richloc): New field.
+ 	(print_html_span_start): Update for new param of to_html ctor.
+ 	(line_printer::m_was_in_range_p): New field.
+ 	(line_printer::m_last_range_idx): New field.
+ 	(layout_printer<Sink>::print_source_line): Use set_in_range
+ 	and set_outside_range rather than colorization calls.
+ 	(layout_printer<Sink>::set_in_range): New.
+ 	(layout_printer<Sink>::set_outside_range): New.
+ 	(layout_printer<Sink>::print_annotation_line): Use set_in_range
+ 	and set_outside_range rather than colorization calls.
+ 	(layout_printer<to_text>::begin_label): Convert param from label
+ 	to state_idx.  Add "is_label_text" param and use it to guard logic
+ 	for turning off colorization within paths.
+ 	(layout_printer<to_html>::begin_label): Likewise.  Push <span>
+ 	for any highlight color.
+ 	(layout_printer<to_text>::end_label): Likewise.
+ 	(layout_printer<to_text>::end_label): Likewise, popping the
+ 	<span>.
+ 	(layout_printer<Sink>::print_any_labels): Convert begin/end_label
+ 	calls to pass in state_idx rather than label.  Use begin/end_label
+ 	rather than colorization calls.
+ 	(layout_printer<Sink>::layout_printer): Likewise.
+ 	(layout_printer<Sink>::layout_printer): Initialize new fields.
+ 	(diagnostic_source_print_policy::print_as_html): Update for new
+ 	param of to_html ctor.
+ 
+ 2025-05-30  Andrew Pinski  <quic_apinski@quicinc.com>
+ 
+ 	* passes.cc (execute_all_ipa_transforms): Fix typo in
+ 	commenet.
+ 
+ 2025-05-30  Joseph Myers  <josmyers@redhat.com>
+ 
+ 	* doc/standards.texi (C Language): Document library facilities
+ 	provided in terms of headers not declaring functions with external
+ 	linkage, not in terms of headers required of freestanding
+ 	implementations.
+ 	* doc/sourcebuild.texi (Subdirectories, Headers): Likewise.
+ 	* doc/trouble.texi (Standard Libraries): Likewise.
+ 
+ 2025-05-30  Pan Li  <pan2.li@intel.com>
+ 
+ 	* config/riscv/autovec.md (avg<v_double_trunc>3_ceil): Add insn
+ 	expand to leverage vaadd with rnu directly.
+ 
+ 2025-05-30  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/120341
+ 	* tree-ssa-loop-im.cc (can_sm_ref_p): STRING_CSTs are readonly.
+ 	* tree-ssa-phiopt.cc (cond_store_replacement): Likewise.
+ 
+ 2025-05-30  Thomas Schwinge  <tschwinge@baylibre.com>
+ 	    Richard Biener  <rguenther@suse.de>
+ 
+ 	PR middle-end/119835
+ 	* tree-nrv.cc (pass_nrv::execute): Defuse 'RESULT_DECL' check.
+ 
+ 2025-05-30  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* diagnostic-show-locus.cc (colorizer::m_current_named_color): New
+ 	field.
+ 	(colorizer::set_named_color): Use it to consolidate repeated calls
+ 	to the same color.
+ 
+ 2025-05-30  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/120457
+ 	* tree-vect-slp.cc (vect_lower_load_permutations): Implement
+ 	the same heuristics as load vectorization for single-element
+ 	interleaving that spans multiple vectors.
+ 
+ 2025-05-30  Richard Sandiford  <richard.sandiford@arm.com>
+ 
+ 	PR rtl-optimization/120347
+ 	* rtlanal.cc (rtx_properties::try_to_add_src): Don't drop the
+ 	IN_MEM_LOAD and IN_MEM_STORE flags for autoinc registers.
+ 	* rtl-ssa/changes.cc (recog_level2): Check whether an
+ 	RTX_AUTOINCed register also appears outside of an address.
+ 
+ 2025-05-30  Julian Brown  <julian@codesourcery.com>
+ 	    Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* gimplify.cc (gimplify_omp_ctx): Add IMPLICIT_MAPPERS field.
+ 	(new_omp_context): Initialise IMPLICIT_MAPPERS hash map.
+ 	(delete_omp_context): Delete IMPLICIT_MAPPERS hash map.
+ 	(instantiate_mapper_info): New structs.
+ 	(remap_mapper_decl_1, omp_mapper_copy_decl, omp_instantiate_mapper,
+ 	omp_instantiate_implicit_mappers): New functions.
+ 	(gimplify_scan_omp_clauses): Handle MAPPER_BINDING clauses.
+ 	(gimplify_adjust_omp_clauses): Instantiate implicit declared mappers.
+ 	(gimplify_omp_declare_mapper): New function.
+ 	(gimplify_expr): Call above function.
+ 	* langhooks-def.h (lhd_omp_mapper_lookup,
+ 	lhd_omp_extract_mapper_directive, lhd_omp_map_array_section): Add
+ 	prototypes.
+ 	(LANG_HOOKS_OMP_FINISH_MAPPER_CLAUSES,
+ 	LANG_HOOKS_OMP_MAPPER_LOOKUP, LANG_HOOKS_OMP_EXTRACT_MAPPER_DIRECTIVE,
+ 	LANG_HOOKS_OMP_MAP_ARRAY_SECTION): Define macros.
+ 	(LANG_HOOK_DECLS): Add above macros.
+ 	* langhooks.cc (lhd_omp_mapper_lookup,
+ 	lhd_omp_extract_mapper_directive, lhd_omp_map_array_section): New
+ 	dummy functions.
+ 	* langhooks.h (lang_hooks_for_decls): Add OMP_FINISH_MAPPER_CLAUSES,
+ 	OMP_MAPPER_LOOKUP, OMP_EXTRACT_MAPPER_DIRECTIVE, OMP_MAP_ARRAY_SECTION
+ 	hooks.
+ 	* omp-general.h (omp_name_type<T>): Add templatized struct, hash type
+ 	traits (for omp_name_type<tree> specialization).
+ 	(omp_mapper_list<T>): Add struct.
+ 	* tree-core.h (omp_clause_code): Add OMP_CLAUSE__MAPPER_BINDING_.
+ 	* tree-pretty-print.cc (dump_omp_clause): Support GOMP_MAP_UNSET,
+ 	GOMP_MAP_PUSH_MAPPER_NAME, GOMP_MAP_POP_MAPPER_NAME artificial mapping
+ 	clauses.  Support OMP_CLAUSE__MAPPER_BINDING_ and OMP_DECLARE_MAPPER.
+ 	* tree.cc (omp_clause_num_ops, omp_clause_code_name): Add
+ 	OMP_CLAUSE__MAPPER_BINDING_.
+ 	* tree.def (OMP_DECLARE_MAPPER): New tree code.
+ 	* tree.h (OMP_DECLARE_MAPPER_ID, OMP_DECLARE_MAPPER_DECL,
+ 	OMP_DECLARE_MAPPER_CLAUSES): New defines.
+ 	(OMP_CLAUSE__MAPPER_BINDING__ID, OMP_CLAUSE__MAPPER_BINDING__DECL,
+ 	OMP_CLAUSE__MAPPER_BINDING__MAPPER): New defines.
+ 
+ 2025-05-30  Andrew Pinski  <quic_apinski@quicinc.com>
+ 
+ 	* gimple-ssa-sccopy.cc (scc_copy_prop::replace_scc_by_value): Return true
+ 	if something was done.
+ 	(scc_copy_prop::propagate): Return true if something was changed.
+ 	(pass_sccopy::execute): Return TODO_cleanup_cfg if a prop happened.
+ 
+ 2025-05-30  Kugan Vivekanandarajah  <kvivekananda@nvidia.com>
+ 
+ 	* auto-profile.cc (function_instance::merge): New.
+ 	(autofdo_source_profile::read): Call merge.
+ 
+ 2025-05-29  Kugan Vivekanandarajah  <kvivekananda@nvidia.com>
+ 
+ 	* config/aarch64/gcc-auto-profile: Make script executable.
+ 
+ 2025-05-29  Andrew Pinski  <quic_apinski@quicinc.com>
+ 
+ 	* tree-ssa-forwprop.cc (optimize_memcpy_to_memset): Adds
+ 	statistics when the statement changed.
+ 
+ 2025-05-29  Andrew Pinski  <quic_apinski@quicinc.com>
+ 
+ 	* tree-ssa-forwprop.cc (optimize_memcpy_to_memset): Change check
+ 	from NULL/non-ssa name to default name.
+ 
+ 2025-05-29  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* diagnostic-format-html.cc (HTML_STYLE): Fix PatternFly URL in
+ 	comment.
+ 
+ 2025-05-29  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* diagnostic-format-html.cc
+ 	(html_builder::make_element_for_diagnostic::html_token_printer):
+ 	Reimplement in terms of xml::printer.
+ 	(html_builder::make_element_for_diagnostic): Create an
+ 	xml::printer and use it with the html_token_printer.
+ 
+ 2025-05-29  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* diagnostic-format-html.cc (html_builder::make_metadata_element):
+ 	Gracefully handle the case where "url" is null.
+ 
+ 2025-05-29  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* pretty-print.cc (pretty_printer::pretty_printer): Use "nullptr"
+ 	rather than "NULL".  Remove explicit delete of
+ 	m_format_postprocessor.
+ 	* pretty-print.h (format_postprocessor::clone): Use unique_ptr.
+ 	(pretty_printer::set_format_postprocessor): New.
+ 	(pretty_printer::m_format_postprocessor): Use unique_ptr.
+ 	(pp_format_postprocessor): Update for use of unique_ptr, removing
+ 	reference from return type.
+ 
+ 2025-05-29  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	PR ipa/120295
+ 	* ipa-prop.cc (update_jump_functions_after_inlining): Do not
+ 	combine pass-through jump functions with type-casts changing
+ 	signedness.
+ 
+ 2025-05-29  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	* ipa-prop.cc (ipa_dump_jump_function): Fix whitespace when
+ 	dumping IPA VRs.
+ 
+ 2025-05-29  Pranav Gorantla  <Pranav.Gorantla@amd.com>
+ 
+ 	* config/i386/i386-expand.cc (emit_reduc_half): Use shuffles to
+ 	generate reduc half for V4SI, similar modes.
+ 	* config/i386/i386.h (TARGET_SSE_REDUCTION_PREFER_PSHUF): New Macro.
+ 	* config/i386/x86-tune.def (X86_TUNE_SSE_REDUCTION_PREFER_PSHUF):
+ 	New tuning.
+ 
+ 2025-05-29  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR bootstrap/120464
+ 	* ggc-page.cc (struct ggc_globals): Fix up comment formatting.
+ 	(find_free_list): Likewise.
+ 	(alloc_page): For defined(USING_MALLOC_PAGE_GROUPS) use
+ 	free_list->free_pages instead of G.free_pages.
+ 	(do_release_pages): Add n1 and n2 arguments, make them used.
+ 	Move defined(USING_MALLOC_PAGE_GROUPS) page group freeing to
+ 	release_pages and dumping of statistics as well.  Formatting fixes.
+ 	(release_pages): Adjust do_release_pages caller, move here
+ 	defined(USING_MALLOC_PAGE_GROUPS) page group freeing and dumping
+ 	of statistics.
+ 	(ggc_handle_finalizers): Fix up comment formatting and typo.
+ 
+ 2025-05-29  Jerry Zhang Jian  <jerry.zhangjian@sifive.com>
+ 
+ 	* config/riscv/riscv-ext.def: New extensions
+ 	* config/riscv/riscv-ext.opt: Auto re-generated
+ 	* doc/riscv-ext.texi: Auto re-generated
+ 
+ 2025-05-29  Pan Li  <pan2.li@intel.com>
+ 
+ 	* config/riscv/riscv-v.cc (expand_vx_binary_vec_dup_vec): Add
+ 	new case for MULT op.
+ 	(expand_vx_binary_vec_vec_dup): Ditto.
+ 	* config/riscv/riscv.cc (riscv_rtx_costs): Ditto.
+ 	* config/riscv/vector-iterators.md: Add new op mult to no_shift_vx_ops.
+ 
+ 2025-05-28  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	PR target/119298
+ 	* config/i386/x86-tune-costs.h (struct processor_costs): Set addss cost
+ 	back to 2.
+ 
+ 2025-05-28  Robin Dapp  <rdapp.gcc@gmail.com>
+ 
+ 	* tree-vect-stmts.cc (vectorizable_load): Remove non-SLP paths.
+ 
+ 2025-05-28  Robin Dapp  <rdapp@ventanamicro.com>
+ 
+ 	PR target/120436
+ 	* config/riscv/riscv-vector-builtins-shapes.cc (struct vset_def):
+ 	Avoid division by zero.
+ 	(struct vget_def): Ditto.
+ 	* config/riscv/riscv-vector-builtins.h (struct function_group_info):
+ 	Use required_extensions_specified instead of duplicating code.
+ 
+ 2025-05-28  Pan Li  <pan2.li@intel.com>
+ 
+ 	* config/riscv/autovec.md (avg<v_double_trunc>3_floor): Add insn
+ 	expand to leverage vaadd directly.
+ 
+ 2025-05-28  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* cgraph.cc (cgraph_edge::maybe_hot_p): For auto-fdo turn 0
+ 	to non-zero.
+ 	* ipa-cp.cc (cs_interesting_for_ipcp_p): Do not trust
+ 	auto-fdo 0.
+ 	* profile-count.cc (profile_count::adjust_for_ipa_scaling): Likewise.
+ 	(profile_count::from_gcov_type): Fix formating.
+ 
+ 2025-05-28  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* predict.cc (rebuild_frequencies): look harder for presence
+ 	of profile feedback.
+ 
+ 2025-05-28  Yuta Mukai  <mukai.yuta@fujitsu.com>
+ 
+ 	* config/aarch64/aarch64-cores.def (fujitsu-monaka): Update ISA
+ 	features.
+ 
+ 2025-05-28  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* predict.cc (set_even_probabilities): Set quality to guessed.
+ 
+ 2025-05-28  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* auto-profile.cc (update_count_by_afdo_count): New function.
+ 	(afdo_set_bb_count): Add debug output; only set count if it is
+ 	non-zero.
+ 	(afdo_find_equiv_class): Add debug output.
+ 	(afdo_calculate_branch_prob): Fix formating.
+ 	(afdo_annotate_cfg): Add debug output; do not erase static
+ 	profile if autofdo profile is all 0.
+ 
+ 2025-05-28  Haochen Jiang  <haochen.jiang@intel.com>
+ 
+ 	* doc/extend.texi (C Extensions): Add missing menu items.
+ 
+ 2025-05-28  liuhongt  <hongtao.liu@intel.com>
+ 
+ 	PR tree-optimization/119181
+ 	* tree-vect-data-refs.cc (vect_analyze_data_ref_accesses):
+ 	Split datarefs when there's a gap bigger than
+ 	MAX_BITSIZE_MODE_ANY_MODE.
+ 
+ 2025-05-27  Jason Merrill  <jason@redhat.com>
+ 
+ 	PR c++/120400
+ 	* fold-const.cc (simple_operand_p): False for vars with
+ 	DECL_VALUE_EXPR.
+ 
+ 2025-05-27  Alejandro Colomar  <alx@kernel.org>
+ 
+ 	PR c/117025
+ 	* Makefile.in (USER_H): Add <stdcountof.h>.
+ 	* ginclude/stdcountof.h: New file.
+ 
+ 2025-05-27  Alejandro Colomar  <alx@kernel.org>
+ 	    Martin Uecker  <uecker@tugraz.at>
+ 
+ 	PR c/117025
+ 	* doc/extend.texi: Document _Countof operator.
+ 
+ 2025-05-27  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* config/i386/gcc-auto-profile: regenerate.
+ 
+ 2025-05-27  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* auto-profile.cc (function_instance::mark_annotated): Remove.
+ 	(function_instance::total_annotated_count): Remove.
+ 	(autofdo_source_profile::mark_annotated): Remove.
+ 	(afdo_set_bb_count): Do not mark annotated locations.
+ 	(afdo_annotate_cfg): Likewise.
+ 
+ 2025-05-27  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	* ipa-sra.cc (scan_expr_access): Also disqualify storage order
+ 	barriers from splitting.
+ 	* tree.h (storage_order_barrier_p): Also return false if the
+ 	operand of the VIEW_CONVERT_EXPR has reverse storage order.
+ 
+ 2025-05-27  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR other/116792
+ 	* diagnostic-format-html.cc: Define INCLUDE_STRING.
+ 	Include "xml.h", "xml-printer.h", and "json.h".
+ 	(html_generation_options::html_generation_options): New.
+ 	(namespace xml): Move decls to xml.h and convert from using
+ 	label_text to std::string.
+ 	(xml::text::write_as_xml): Reimplement indentation so it is done
+ 	by this node, rather than the parent.
+ 	(xml::node_with_children::add_text): Convert from label_text to
+ 	std::string.  Consolidate runs of text into a single node.
+ 	(xml::document::write_as_xml): Reimplement indentation.
+ 	(xml::element::write_as_xml): Reimplement indentation so it is
+ 	done by this node, rather than the parent.  Convert from
+ 	label_text to std::string.  Update attribute-printing to new
+ 	representation to preserve insertion order.
+ 	(xml::element::set_attr): Convert from label_text to std::string.
+ 	Record insertion order.
+ 	(xml::raw::write_as_xml): New.
+ 	(xml::printer::printer): New.
+ 	(xml::printer::push_tag): New.
+ 	(xml::printer::push_tag_with_class): New.
+ 	(xml::printer::pop_tag): New.
+ 	(xml::printer::set_attr): New.
+ 	(xml::printer::add_text): New.
+ 	(xml::printer::add_raw): New.
+ 	(xml::printer::push_element): New.
+ 	(xml::printer::append): New.
+ 	(xml::printer::get_insertion_point): New.
+ 	(html_builder::add_focus_id): New.
+ 	(html_builder::m_html_gen_opts): New field.
+ 	(html_builder::m_head_element): New field.
+ 	(html_builder::m_next_diag_id): New field.
+ 	(html_builder::m_ui_focus_ids): New field.
+ 	(make_div): Convert from label_text to std::string.
+ 	(make_span): Likewise.
+ 	(HTML_STYLE): New.
+ 	(HTML_SCRIPT): New.
+ 	(html_builder::html_builder): Fix indentation.  Add
+ 	"html_gen_opts" param.  Initialize new fields.  Reimplement
+ 	using xml::printer.  Optionally add style and script tags.
+ 	(class html_path_label_writer): New.
+ 	(html_builder::make_element_for_diagnostic): Convert from
+ 	label_text to std::string. Set "id" on "gcc-diagnostic" and
+ 	"gcc-message" <div> elements; add the latter to the focus ids.
+ 	Use diagnostic_context::maybe_show_locus_as_html rather than
+ 	html_builder::make_element_for_source.  Use print_path_as_html
+ 	rather than html_builder::make_element_for_path.
+ 	(html_builder::make_element_for_source): Drop.
+ 	(html_builder::make_element_for_path): Drop.
+ 	(html_builder::make_element_for_patch): Convert from label_text to
+ 	std::string.
+ 	(html_builder::make_metadata_element): Likewise.  Use
+ 	xml::printer.
+ 	(html_builder::make_element_for_metadata): Convert from label_text
+ 	to std::string.
+ 	(html_builder::emit_diagram): Expand comment.
+ 	(html_builder::flush_to_file): Write out initializer for
+ 	"focus_ids" into javascript.
+ 	(html_output_format::html_output_format): Add param
+ 	"html_gen_opts" and use it to initialize m_builder.
+ 	(html_file_output_format::html_file_output_format): Likewise, to
+ 	initialize base class.
+ 	(make_html_sink): Likewise, to pass to ctor.
+ 	(selftest::test_html_diagnostic_context::test_html_diagnostic_context):
+ 	Set up html_generation_options.
+ 	(selftest::html_buffered_output_format::html_buffered_output_format):
+ 	Add html_gen_opts param.
+ 	(selftest::test_simple_log): Add id attributes to expected text
+ 	for "gcc-diagnostic" and "gcc-message" elements.  Update
+ 	whitespace for indentation fixes.
+ 	(selftest::test_metadata): Update whitespace for indentation
+ 	fixes.
+ 	(selftest::test_printer): New selftest.
+ 	(selftest::test_attribute_ordering): New selftest.
+ 	(selftest::diagnostic_format_html_cc_tests): Call the new
+ 	selftests.
+ 	* diagnostic-format-html.h (struct html_generation_options): New.
+ 	(make_html_sink): Add "html_gen_opts" param.
+ 	(print_path_as_html): New decl.
+ 	* diagnostic-path-output.cc: Define INCLUDE_MAP.  Add includes of
+ 	"diagnostic-format-html.h", "xml.h", and "xml-printer.h".
+ 	(path_print_policy::path_print_policy): Add ctor.
+ 	(path_print_policy::get_diagram_theme): Fix whitespace.
+ 	(struct stack_frame): New.
+ 	(begin_html_stack_frame): New function.
+ 	(end_html_stack_frame): New function.
+ 	(emit_svg_arrow): New function.
+ 	(event_range::print): Rename to...
+ 	(event_range::print_as_text): ...this.  Update call to
+ 	diagnostic_start_span.
+ 	(event_range::print_as_html): New, based on the above, but ported
+ 	from pretty_printer to xml::printer.
+ 	(thread_event_printer::print_swimlane_for_event_range): Rename
+ 	to...
+ 	(thread_event_printer::print_swimlane_for_event_range_as_text):
+ 	...this.  Update for renaming of event_range::print to
+ 	event_range::print_as_text.
+ 	(thread_event_printer::print_swimlane_for_event_range_as_html):
+ 	New.
+ 	(print_path_summary_as_text): Update for "_as_text" renaming.
+ 	(print_path_summary_as_html): New.
+ 	(print_path_as_html): New.
+ 	* diagnostic-show-locus.cc: Add defines of INCLUDE_MAP and
+ 	INCLUDE_STRING.  Add includes of "xml.h" and "xml-printer.h".
+ 	(struct char_display_policy): Replace "m_print_cb" with
+ 	"m_print_text_cb" and "m_print_html_cb".
+ 	(struct to_text): New.
+ 	(struct to_html): New.
+ 	(get_printer): New.
+ 	(default_diagnostic_start_span_fn<to_text>): New.
+ 	(default_diagnostic_start_span_fn<to_html>): New.
+ 	(class layout): Update "friend class layout_printer;" for
+ 	template.
+ 	(enum class margin_kind): New.
+ 	(class layout_printer): Convert into a template.
+ 	(layout_printer::m_pp): Replace field with...
+ 	(layout_printer::m_sink): ...this.
+ 	(layout_printer::m_colorizer): Drop field in favor of a pointer
+ 	in the "to_text" sink.
+ 	(default_print_decoded_ch): Convert into a template.
+ 	(escape_as_bytes_print): Likewise.
+ 	(escape_as_unicode_print): Likewise.
+ 	(make_char_policy): Update to use both text and html callbacks.
+ 	(layout_printer::print_gap_in_line_numbering): Replace with...
+ 	(layout_printer<to_text>::print_gap_in_line_numbering): ...this
+ 	(layout_printer<to_html>::print_gap_in_line_numbering): ...and
+ 	this.
+ 	(layout_printer::print_source_line): Convert to template, using
+ 	m_sink.
+ 	(layout_printer::print_leftmost_column): Likewise.
+ 	(layout_printer::start_annotation_line): Likewise.
+ 	(layout_printer<to_text>::end_line): New.
+ 	(layout_printer<to_html>::end_line): New.
+ 	(layout_printer::print_annotation_line): Convert to template,
+ 	using m_sink.
+ 	(class line_label): Add field m_original_range_idx.
+ 	(layout_printer<to_text>::begin_label): New.
+ 	(layout_printer<to_html>::begin_label): New.
+ 	(layout_printer<to_text>::end_label): New.
+ 	(layout_printer<to_html>::end_label): New.
+ 	(layout_printer::print_any_labels): Convert to template, using
+ 	m_sink.
+ 	(layout_printer::print_leading_fixits): Likewise.
+ 	(layout_printer::print_trailing_fixits): Likewise.
+ 	(layout_printer::print_newline): Drop.
+ 	(layout_printer::move_to_column): Convert to template, using
+ 	m_sink.
+ 	(layout_printer::show_ruler): Likewise.
+ 	(layout_printer::print_line): Likewise.
+ 	(layout_printer::print_any_right_to_left_edge_lines): Likewise.
+ 	(layout_printer::layout_printer): Likewise.
+ 	(diagnostic_context::maybe_show_locus_as_html): New.
+ 	(diagnostic_source_print_policy::diagnostic_source_print_policy):
+ 	Update for split of start_span_cb into text vs html variants.
+ 	(diagnostic_source_print_policy::print): Update for use of
+ 	templates; use to_text.
+ 	(diagnostic_source_print_policy::print_as_html): New.
+ 	(layout_printer::print): Convert to template, using m_sink.
+ 	(selftest::make_element_for_locus): New.
+ 	(selftest::make_raw_html_for_locus): New.
+ 	(selftest::test_layout_x_offset_display_utf8): Update for use of
+ 	templates.
+ 	(selftest::test_layout_x_offset_display_tab): Likewise.
+ 	(selftest::test_one_liner_caret_and_range): Add test coverage of
+ 	HTML output.
+ 	(selftest::test_one_liner_labels): Likewise.
+ 	* diagnostic.cc (diagnostic_context::initialize): Update for split
+ 	of start_span_cb into text vs html variants.
+ 	(default_diagnostic_start_span_fn): Move to
+ 	diagnostic-show-locus.cc, converting to template.
+ 	* diagnostic.h (class xml::printer): New forward decl.
+ 	(diagnostic_start_span_fn): Replace typedef with "using",
+ 	converting to a template.
+ 	(struct to_text): New forward decl.
+ 	(struct to_html): New forward decl.
+ 	(get_printer): New decl.
+ 	(diagnostic_location_print_policy::print_text_span_start): New
+ 	decl.
+ 	(diagnostic_location_print_policy::print_html_span_start): New
+ 	decl.
+ 	(class html_label_writer): New.
+ 	(diagnostic_source_print_policy::print_as_html): New decl.
+ 	(diagnostic_source_print_policy::get_start_span_fn): Replace
+ 	with...
+ 	(diagnostic_source_print_policy::get_text_start_span_fn): ...this
+ 	(diagnostic_source_print_policy::get_html_start_span_fn): ...and
+ 	this
+ 	(diagnostic_source_print_policy::m_start_span_cb): Replace with...
+ 	(diagnostic_source_print_policy::m_text_start_span_cb): ...this
+ 	(diagnostic_source_print_policy::m_html_start_span_cb): ...and
+ 	this.
+ 	(diagnostic_context::maybe_show_locus_as_html): New decl.
+ 	(diagnostic_context::m_text_callbacks::m_start_span): Replace
+ 	with...
+ 	(diagnostic_context::m_text_callbacks::m_text_start_span): ...this
+ 	(diagnostic_context::m_text_callbacks::m_html_start_span): ...and
+ 	this.
+ 	(diagnostic_start_span): Update for template change.
+ 	(diagnostic_show_locus_as_html): New inline function.
+ 	(default_diagnostic_start_span_fn): Convert to template.
+ 	* doc/invoke.texi (experimental-html): Add "css" and "javascript"
+ 	keys.
+ 	* opts-diagnostic.cc (html_scheme_handler::make_sink): Likewise.
+ 	* selftest-diagnostic.cc
+ 	(selftest::test_diagnostic_context::start_span_cb): Update for
+ 	template changes.
+ 	* selftest-diagnostic.h
+ 	(selftest::test_diagnostic_context::start_span_cb): Likewise.
+ 	* xml-printer.h: New file.
+ 	* xml.h: New file, based on material in diagnostic-format-html.cc,
+ 	but using std::string rather than label_text.
+ 	(xml::element::m_key_insertion_order): New field.
+ 	(struct xml::raw): New.
+ 
+ 2025-05-27  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* Makefile.in (OBJS-libcommon): Add diagnostic-path-output.o.
+ 	* diagnostic-path-output.cc: New file, taken from material in
+ 	diagnostic-path.cc.
+ 	* diagnostic-path.cc: Drop includes of
+ 	"diagnostic-macro-unwinding.h", "intl.h", "gcc-rich-location.h",
+ 	"diagnostic-color.h", "diagnostic-event-id.h",
+ 	"diagnostic-label-effects.h", "pretty-print-markup.h",
+ 	"selftest.h", "selftest-diagnostic.h",
+ 	"selftest-diagnostic-path.h", "text-art/theme.h", and
+ 	"diagnostic-format-text.h".
+ 	(class path_print_policy): Move to diagnostic-path-output.cc.
+ 	(class path_label): Likewise.
+ 	(can_consolidate_events): Likewise.
+ 	(class per_thread_summary): Likewise.
+ 	(struct event_range): Likewise.
+ 	(struct path_summary): Likewise.
+ 	(per_thread_summary::interprocedural_p): Likewise.
+ 	(path_summary::path_summary): Likewise.
+ 	(write_indent): Likewise.
+ 	(base_indent): Likewise.
+ 	(per_frame_indent): Likewise.
+ 	(class thread_event_printer): Likewise.
+ 	(print_path_summary_as_text): Likewise.
+ 	(class element_event_desc): Likewise.
+ 	(diagnostic_text_output_format::print_path): Likewise.
+ 	(selftest::path_events_have_column_data_p): Likewise.
+ 	(selftest::test_empty_path): Likewise.
+ 	(selftest::test_intraprocedural_path): Likewise.
+ 	(selftest::test_interprocedural_path_1): Likewise.
+ 	(selftest::test_interprocedural_path_2): Likewise.
+ 	(selftest::test_recursion): Likewise.
+ 	(class selftest::control_flow_test): Likewise.
+ 	(selftest::test_control_flow_1): Likewise.
+ 	(selftest::test_control_flow_2): Likewise.
+ 	(selftest::test_control_flow_3): Likewise.
+ 	(selftest::assert_cfg_edge_path_streq): Likewise.
+ 	(ASSERT_CFG_EDGE_PATH_STREQ): Likewise.
+ 	(selftest::test_control_flow_4): Likewise.
+ 	(selftest::test_control_flow_5): Likewise.
+ 	(selftest::test_control_flow_6): Likewise.
+ 	(selftest::control_flow_tests): Likewise.
+ 	(selftest::diagnostic_path_cc_tests): Likewise, renaming
+ 	accordingly.
+ 	* selftest-run-tests.cc (selftest::run_tests): Update for
+ 	move of path-printing selftests.
+ 	* selftest.h (selftest::diagnostic_path_cc_tests): Replace decl
+ 	with...
+ 	(selftest::diagnostic_path_output_cc_tests): ...this.
+ 
+ 2025-05-27  Juergen Christ  <jchrist@linux.ibm.com>
+ 
+ 	* config/s390/vector.md(*vec_extract<mode>): Fix mnemonic.
+ 
+ 2025-05-27  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/117965
+ 	* tree-ssa-phiprop.cc (phivn_valid_p): Remove.
+ 	(propagate_with_phi): Pass in virtual PHI node from BB,
+ 	rewrite load motion validity check to require the same
+ 	virtual use along all paths.
+ 
+ 2025-05-27  Konstantinos Eleftheriou  <konstantinos.eleftheriou@vrull.eu>
+ 
+ 	PR rtl-optimization/119884
+ 	* avoid-store-forwarding.cc (process_store_forwarding):
+ 	Use `lowpart_subreg` for the base register initialization
+ 	and remove redundant stores from the store/load sequence.
+ 
+ 2025-05-27  Konstantinos Eleftheriou  <konstantinos.eleftheriou@vrull.eu>
+ 
+ 	* sbitmap.cc (bitmap_any_bit_in_range_p):
+ 	Call and return the result of `bitmap_bit_in_range_p` with the
+ 	`any_inverted` parameter set to false.
+ 	(bitmap_bit_in_range_p): New function.
+ 	(bitmap_all_bits_in_range_p): New function.
+ 	* sbitmap.h (bitmap_all_bits_in_range_p): New function.
+ 
+ 2025-05-27  Konstantinos Eleftheriou  <konstantinos.eleftheriou@vrull.eu>
+ 
+ 	* sbitmap.cc (bitmap_bit_in_range_p): Renamed the function.
+ 	(bitmap_any_bit_in_range_p): New function name.
+ 	(bitmap_bit_in_range_p_checking): Renamed the function.
+ 	(bitmap_any_bit_in_range_p_checking): New function name.
+ 	(test_set_range): Updated function calls to use the new name.
+ 	(test_bit_in_range): Likewise.
+ 	* sbitmap.h (bitmap_bit_in_range_p): Renamed the function.
+ 	(bitmap_any_bit_in_range_p): New function name.
+ 	* tree-ssa-dse.cc (live_bytes_read):
+ 	Updated function call to use the new name.
+ 
+ 2025-05-27  Co-authored-by: Jeff Law  <jlaw@ventanamicro.com>
+ 
+ 	* config/riscv/bitmanip.md (andi+bclr splits): Simplified from
+ 	prior define_insn_and_splits.
+ 	* config/riscv/riscv.cc (synthesize_and): Add support for andi+bclr
+ 	sequences.
+ 
+ 2025-05-27  Pan Li  <pan2.li@intel.com>
+ 
+ 	* config/riscv/riscv-v.cc (expand_vx_binary_vec_dup_vec): Add
+ 	new case for XOR op.
+ 	(expand_vx_binary_vec_vec_dup): Diito.
+ 	* config/riscv/riscv.cc (riscv_rtx_costs): Ditto.
+ 	* config/riscv/vector-iterators.md: Add new op or to no_shift_vx_ops.
+ 
+ 2025-05-27  Juergen Christ  <jchrist@linux.ibm.com>
+ 
+ 	* config/s390/vector.md (VF): New mode iterator.
+ 	(VEC_SET_NONFLOAT): New mode iterator.
+ 	(VEC_SET_SINGLEFLOAT): New mode iterator.
+ 	(*vec_set<mode>): Split pattern in two.
+ 	(*vec_setv2df): Extract special handling for V2DF mode.
+ 	(*vec_extract<mode>): Split pattern in two.
+ 
+ 2025-05-27  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* doc/extend.texi (Common Variable Attributes): Fix typo in
+ 	description of nonstring.
+ 
+ 2025-05-27  Kito Cheng  <kito.cheng@sifive.com>
+ 
+ 	* gcc.cc (find_multilib_os_dir_by_multilib_dir): New.
+ 	(set_multilib_dir): Fix multilib_os_dir and multiarch_dir
+ 	if multilib_os_dir is not set.
+ 
+ 2025-05-27  xuli  <xuli1@eswincomputing.com>
+ 
+ 	* match.pd: add singned vector SAT_ADD IMM form1 matching.
+ 
+ 2025-05-27  xuli  <xuli1@eswincomputing.com>
+ 
+ 	* match.pd: Add signed scalar SAT_ADD IMM form1 with IMM=-1 matching.
+ 	* tree-ssa-math-opts.cc (match_unsigned_saturation_add): Adapt function name.
+ 	(match_saturation_add_with_assign): Match signed and unsigned SAT_ADD with assign.
+ 	(math_opts_dom_walker::after_dom_children): Match imm=-1 signed SAT_ADD with NOP_EXPR case.
+ 
+ 2025-05-26  Jason Merrill  <jason@redhat.com>
+ 
+ 	* doc/invoke.texi: Move C++ -fdump-lang to C++ section.
+ 	Add -fdump-lang-tinst.
+ 
+ 2025-05-26  Kugan Vivekanandarajah  <kvivekananda@nvidia.com>
+ 
+ 	* config/aarch64/gcc-auto-profile: New file.
+ 
+ 2025-05-26  Segher Boessenkool  <segher@kernel.crashing.org>
+ 
+ 	* config/rs6000/rs6000.cc: Remove include of reload.h .
+ 
+ 2025-05-26  Kugan Vivekanandarajah  <kvivekananda@nvidia.com>
+ 
+ 	* ipa-split.cc (pass_feedback_split_functions::clone): New.
+ 	* passes.def: Enable pass_feedback_split_functions for
+ 	pass_ipa_auto_profile.
+ 
+ 2025-05-25  Michael J. Eager  <eager@eagercon.com>
+ 
+ 	PR target/86772
+ 	Tracking CVE-2017-5753
+ 	* config/microblaze/microblaze.cc (TARGET_HAVE_SPECULATION_SAFE_VALUE):
+ 	Define to speculation_save_value_not_needed
+ 
+ 2025-05-25  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* config/i386/i386.cc (ix86_builtin_vectorization_cost):
+ 	use sse_op instead of addss to cost vinsertti128 and vinsertti64x4;
+ 	compute correct mode of vinsertti128.
+ 	(ix86_vector_costs::add_stmt_cost): For integer 256bit and 512bit
+ 	vector constructions account more integer_to_sse moves.
+ 
+ 2025-05-25  LIU Hao  <lh_mouse@126.com>
+ 
+ 	PR target/53929
+ 	PR target/80881
+ 	* config/i386/i386-protos.h (ix86_asm_output_labelref): Declare new
+ 	function for quoting user-defined symbols in Intel syntax.
+ 	* config/i386/i386.cc (ix86_asm_output_labelref): Implement it.
+ 	* config/i386/i386.h (ASM_OUTPUT_LABELREF): Use it.
+ 	* config/i386/cygming.h (ASM_OUTPUT_LABELREF): Use it.
+ 
  2025-05-24  Shreya Munnangi  <smunnangi1@ventanamicro.com>
  
  	* config/riscv/riscv.cc (synthesize_and): Use a srl+andi+sll
diff -Nrcpad gcc-16-20250525/gcc/DATESTAMP gcc-16-20250601/gcc/DATESTAMP
*** gcc-16-20250525/gcc/DATESTAMP	Sun May 25 22:32:04 2025
--- gcc-16-20250601/gcc/DATESTAMP	Sun Jun  1 22:32:13 2025
***************
*** 1 ****
! 20250525
--- 1 ----
! 20250601
diff -Nrcpad gcc-16-20250525/gcc/Makefile.in gcc-16-20250601/gcc/Makefile.in
*** gcc-16-20250525/gcc/Makefile.in	Sun May 25 22:32:04 2025
--- gcc-16-20250601/gcc/Makefile.in	Sun Jun  1 22:32:13 2025
*************** USER_H = $(srcdir)/ginclude/float.h \
*** 480,485 ****
--- 480,486 ----
  	 $(srcdir)/ginclude/stdalign.h \
  	 $(srcdir)/ginclude/stdatomic.h \
  	 $(srcdir)/ginclude/stdckdint.h \
+ 	 $(srcdir)/ginclude/stdcountof.h \
  	 $(EXTRA_HEADERS)
  
  USER_H_INC_NEXT_PRE = @user_headers_inc_next_pre@
*************** OBJS-libcommon = diagnostic-spec.o diagn
*** 1856,1861 ****
--- 1857,1863 ----
  	diagnostic-global-context.o \
  	diagnostic-macro-unwinding.o \
  	diagnostic-path.o \
+ 	diagnostic-path-output.o \
  	diagnostic-show-locus.o \
  	edit-context.o \
  	pretty-print.o intl.o \
diff -Nrcpad gcc-16-20250525/gcc/auto-profile.cc gcc-16-20250601/gcc/auto-profile.cc
*** gcc-16-20250525/gcc/auto-profile.cc	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/auto-profile.cc	Sun Jun  1 22:32:13 2025
*************** public:
*** 151,157 ****
       Each inline stack should only be used to annotate IR once.
       This will be enforced when instruction-level discriminator
       is supported.  */
-   bool annotated;
  };
  
  /* operator< for "const char *".  */
--- 151,156 ----
*************** public:
*** 234,239 ****
--- 233,242 ----
    function_instance *get_function_instance_by_decl (unsigned lineno,
                                                      tree decl) const;
  
+   /* Merge profile of clones.  Note that cloning hasnt been performed when
+      we annotate the CFG (at this stage).  */
+   void merge (function_instance *other);
+ 
    /* Store the profile info for LOC in INFO. Return TRUE if profile info
       is found.  */
    bool get_count_info (location_t loc, count_info *info) const;
*************** public:
*** 242,250 ****
       MAP, return the total count for all inlined indirect calls.  */
    gcov_type find_icall_target_map (gcall *stmt, icall_target_map *map) const;
  
-   /* Sum of counts that is used during annotation.  */
-   gcov_type total_annotated_count () const;
- 
    /* Mark LOC as annotated.  */
    void mark_annotated (location_t loc);
  
--- 245,250 ----
*************** public:
*** 314,322 ****
       Return true if INFO is updated.  */
    bool update_inlined_ind_target (gcall *stmt, count_info *info);
  
-   /* Mark LOC as annotated.  */
-   void mark_annotated (location_t loc);
- 
  private:
    /* Map from function_instance name index (in string_table) to
       function_instance.  */
--- 314,319 ----
*************** function_instance::get_function_instance
*** 565,570 ****
--- 562,588 ----
    return NULL;
  }
  
+ /* Merge profile of clones.  Note that cloning hasnt been performed when
+    we annotate the CFG (at this stage).  */
+ 
+ void function_instance::merge (function_instance *other)
+ {
+   total_count_ += other->total_count_;
+   head_count_ += other->head_count_;
+ 
+   for (callsite_map::const_iterator iter = other->callsites.begin ();
+        iter != other->callsites.end (); ++iter)
+     if (callsites.count (iter->first) == 0)
+ 	callsites[iter->first] = iter->second;
+ 
+   for (position_count_map::const_iterator iter = pos_counts.begin ();
+        iter != pos_counts.end (); ++iter)
+     if (pos_counts.count (iter->first) == 0)
+       pos_counts[iter->first] = iter->second;
+     else
+       pos_counts[iter->first].count += iter->second.count;
+ }
+ 
  /* Store the profile info for LOC in INFO. Return TRUE if profile info
     is found.  */
  
*************** function_instance::get_count_info (locat
*** 578,594 ****
    return true;
  }
  
- /* Mark LOC as annotated.  */
- 
- void
- function_instance::mark_annotated (location_t loc)
- {
-   position_count_map::iterator iter = pos_counts.find (loc);
-   if (iter == pos_counts.end ())
-     return;
-   iter->second.annotated = true;
- }
- 
  /* Read the inlined indirect call target profile for STMT and store it in
     MAP, return the total count for all inlined indirect calls.  */
  
--- 596,601 ----
*************** function_instance::read_function_instanc
*** 685,706 ****
    return s;
  }
  
- /* Sum of counts that is used during annotation.  */
- 
- gcov_type
- function_instance::total_annotated_count () const
- {
-   gcov_type ret = 0;
-   for (callsite_map::const_iterator iter = callsites.begin ();
-        iter != callsites.end (); ++iter)
-     ret += iter->second->total_annotated_count ();
-   for (position_count_map::const_iterator iter = pos_counts.begin ();
-        iter != pos_counts.end (); ++iter)
-     if (iter->second.annotated)
-       ret += iter->second.count;
-   return ret;
- }
- 
  /* Member functions for autofdo_source_profile.  */
  
  autofdo_source_profile::~autofdo_source_profile ()
--- 692,697 ----
*************** autofdo_source_profile::get_count_info (
*** 748,768 ****
    return s->get_count_info (stack[0].second, info);
  }
  
- /* Mark LOC as annotated.  */
- 
- void
- autofdo_source_profile::mark_annotated (location_t loc)
- {
-   inline_stack stack;
-   get_inline_stack (loc, &stack);
-   if (stack.length () == 0)
-     return;
-   function_instance *s = get_function_instance_by_inline_stack (stack);
-   if (s == NULL)
-     return;
-   s->mark_annotated (stack[0].second);
- }
- 
  /* Update value profile INFO for STMT from the inlined indirect callsite.
     Return true if INFO is updated.  */
  
--- 739,744 ----
*************** autofdo_source_profile::read ()
*** 887,893 ****
        function_instance::function_instance_stack stack;
        function_instance *s = function_instance::read_function_instance (
            &stack, gcov_read_counter ());
!       map_[s->name ()] = s;
      }
    return true;
  }
--- 863,876 ----
        function_instance::function_instance_stack stack;
        function_instance *s = function_instance::read_function_instance (
            &stack, gcov_read_counter ());
!       int fun_id = afdo_string_table->get_index
! 	      (afdo_string_table->get_name (s->name ()));
!       /* If function_instace with get_original_name (without the clone
! 	 suffix) exixts, merge the function instances.  */
!       if (map_.count (fun_id) == 0)
! 	map_[fun_id] = s;
!       else
! 	map_[fun_id]->merge (s);
      }
    return true;
  }
*************** set_bb_annotated (basic_block bb, bb_set
*** 1110,1115 ****
--- 1093,1111 ----
    annotated->insert (bb);
  }
  
+ /* Update profile_count by known autofdo count.  */
+ void
+ update_count_by_afdo_count (profile_count *count, gcov_type c)
+ {
+   if (c)
+     *count = profile_count::from_gcov_type (c).afdo ();
+   /* In case we have guessed profile which is already zero, preserve
+      quality info.  */
+   else if (count->nonzero_p ()
+ 	   || count->quality () == GUESSED)
+     *count = profile_count::zero ().afdo ();
+ }
+ 
  /* For a given BB, set its execution count. Attach value profile if a stmt
     is not in PROMOTED, because we only want to promote an indirect call once.
     Return TRUE if BB is annotated.  */
*************** static bool
*** 1118,1127 ****
  afdo_set_bb_count (basic_block bb, const stmt_set &promoted)
  {
    gimple_stmt_iterator gsi;
-   edge e;
-   edge_iterator ei;
    gcov_type max_count = 0;
    bool has_annotated = false;
  
    for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
      {
--- 1114,1123 ----
  afdo_set_bb_count (basic_block bb, const stmt_set &promoted)
  {
    gimple_stmt_iterator gsi;
    gcov_type max_count = 0;
    bool has_annotated = false;
+   if (dump_file)
+     fprintf (dump_file, " Looking up AFDO count of bb %i\n", bb->index);
  
    for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
      {
*************** afdo_set_bb_count (basic_block bb, const
*** 1133,1138 ****
--- 1129,1140 ----
          {
            if (info.count > max_count)
              max_count = info.count;
+ 	  if (dump_file && info.count)
+ 	    {
+ 	      fprintf (dump_file, "  count %" PRIu64 " in stmt: ",
+ 		       (int64_t)info.count);
+ 	      print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
+ 	    }
            has_annotated = true;
            if (info.targets.size () > 0
                && promoted.find (stmt) == promoted.end ())
*************** afdo_set_bb_count (basic_block bb, const
*** 1163,1168 ****
--- 1165,1177 ----
  		{
  		  if (info.count > max_count)
  		    max_count = info.count;
+ 		  if (dump_file && info.count)
+ 		    {
+ 		      fprintf (dump_file,
+ 			       "  phi op in BB %i with count %" PRIu64": ",
+ 			       bb_succ->index, (int64_t)info.count);
+ 		      print_gimple_stmt (dump_file, phi, 0, TDF_SLIM);
+ 		    }
  		  has_annotated = true;
  		}
  	    }
*************** afdo_set_bb_count (basic_block bb, const
*** 1172,1192 ****
  	return false;
      }
  
!   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
!     afdo_source_profile->mark_annotated (gimple_location (gsi_stmt (gsi)));
!   for (gphi_iterator gpi = gsi_start_phis (bb);
!        !gsi_end_p (gpi);
!        gsi_next (&gpi))
      {
!       gphi *phi = gpi.phi ();
!       size_t i;
!       for (i = 0; i < gimple_phi_num_args (phi); i++)
!         afdo_source_profile->mark_annotated (gimple_phi_arg_location (phi, i));
      }
-   FOR_EACH_EDGE (e, ei, bb->succs)
-   afdo_source_profile->mark_annotated (e->goto_locus);
- 
-   bb->count = profile_count::from_gcov_type (max_count).afdo ();
    return true;
  }
  
--- 1181,1194 ----
  	return false;
      }
  
!   if (max_count)
      {
!       update_count_by_afdo_count (&bb->count, max_count);
!       if (dump_file)
! 	fprintf (dump_file,
! 		 " Annotated bb %i with count %" PRId64 "\n",
! 		 bb->index, (int64_t)max_count);
      }
    return true;
  }
  
*************** afdo_find_equiv_class (bb_set *annotated
*** 1219,1224 ****
--- 1221,1234 ----
  	  bb1->aux = bb;
  	  if (bb1->count > bb->count && is_bb_annotated (bb1, *annotated_bb))
  	    {
+ 	      if (dump_file)
+ 		{
+ 		  fprintf (dump_file,
+ 			   "  Copying count of bb %i to bb %i; count is:",
+ 			   bb1->index,
+ 			   bb->index);
+ 		  bb1->count.dump (dump_file);
+ 		}
  	      bb->count = bb1->count;
  	      set_bb_annotated (bb, annotated_bb);
  	    }
*************** afdo_find_equiv_class (bb_set *annotated
*** 1231,1236 ****
--- 1241,1254 ----
  	  bb1->aux = bb;
  	  if (bb1->count > bb->count && is_bb_annotated (bb1, *annotated_bb))
  	    {
+ 	      if (dump_file)
+ 		{
+ 		  fprintf (dump_file,
+ 			   "  Copying count of bb %i to bb %i; count is:",
+ 			   bb1->index,
+ 			   bb->index);
+ 		  bb1->count.dump (dump_file);
+ 		}
  	      bb->count = bb1->count;
  	      set_bb_annotated (bb, annotated_bb);
  	    }
*************** afdo_calculate_branch_prob (bb_set *anno
*** 1476,1482 ****
        else
          total_count += AFDO_EINFO (e)->get_count ();
      }
!     if (num_unknown_succ == 0 && total_count.nonzero_p())
        {
  	FOR_EACH_EDGE (e, ei, bb->succs)
  	  e->probability
--- 1494,1500 ----
        else
          total_count += AFDO_EINFO (e)->get_count ();
      }
!     if (num_unknown_succ == 0 && total_count.nonzero_p ())
        {
  	FOR_EACH_EDGE (e, ei, bb->succs)
  	  e->probability
*************** afdo_annotate_cfg (const stmt_set &promo
*** 1577,1598 ****
            current_function_decl);
  
    if (s == NULL)
!     return;
!   ENTRY_BLOCK_PTR_FOR_FN (cfun)->count
!      = profile_count::from_gcov_type (s->head_count ()).afdo ();
!   EXIT_BLOCK_PTR_FOR_FN (cfun)->count = profile_count::zero ().afdo ();
!   profile_count max_count = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count;
  
    FOR_EACH_BB_FN (bb, cfun)
      {
-       /* As autoFDO uses sampling approach, we have to assume that all
- 	 counters are zero when not seen by autoFDO.  */
-       bb->count = profile_count::zero ().afdo ();
        if (afdo_set_bb_count (bb, promoted_stmts))
! 	set_bb_annotated (bb, &annotated_bb);
!       if (bb->count > max_count)
! 	max_count = bb->count;
      }
    if (ENTRY_BLOCK_PTR_FOR_FN (cfun)->count
        > ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb->count)
      {
--- 1595,1649 ----
            current_function_decl);
  
    if (s == NULL)
!     {
!       if (dump_file)
! 	fprintf (dump_file, "No afdo profile for %s",
! 		 cgraph_node::get (current_function_decl)->dump_name ());
!       return;
!     }
  
+   if (dump_file)
+     fprintf (dump_file, "\n\nAnnotating BB profile of %s\n",
+ 	     cgraph_node::get (current_function_decl)->dump_name ());
+ 
+   /* In the first pass only store non-zero counts.  */
+   gcov_type head_count = s->head_count ();
+   bool profile_found = head_count > 0;
    FOR_EACH_BB_FN (bb, cfun)
      {
        if (afdo_set_bb_count (bb, promoted_stmts))
! 	{
! 	  if (bb->count.quality () == AFDO)
! 	    {
! 	      gcc_assert (bb->count.nonzero_p ());
! 	      profile_found = true;
! 	    }
! 	  set_bb_annotated (bb, &annotated_bb);
! 	}
!     }
!   /* Exit without clobbering static profile if there was no
!      non-zero count.
!      ??? Instead of keeping guessed profile we can introduce
!      GUESSED_GLOBAL0_AFDO.  */
!   if (!profile_found)
!     {
!       if (dump_file)
! 	fprintf (dump_file, "No afdo samples found; keeping original profile");
!       return;
      }
+ 
+   /* Update profile.  */
+   update_count_by_afdo_count (&ENTRY_BLOCK_PTR_FOR_FN (cfun)->count,
+ 			      head_count);
+   update_count_by_afdo_count (&EXIT_BLOCK_PTR_FOR_FN (cfun)->count, 0);
+   profile_count max_count = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count;
+ 
+   FOR_EACH_BB_FN (bb, cfun)
+     if (bb->count.quality () != AFDO)
+       update_count_by_afdo_count (&bb->count, 0);
+     else
+       max_count = max_count.max (bb->count);
+ 
    if (ENTRY_BLOCK_PTR_FOR_FN (cfun)->count
        > ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb->count)
      {
*************** afdo_annotate_cfg (const stmt_set &promo
*** 1607,1621 ****
            = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count;
        set_bb_annotated (EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb, &annotated_bb);
      }
!   afdo_source_profile->mark_annotated (
!       DECL_SOURCE_LOCATION (current_function_decl));
!   afdo_source_profile->mark_annotated (cfun->function_start_locus);
!   afdo_source_profile->mark_annotated (cfun->function_end_locus);
!   if (max_count.nonzero_p())
!     {
!       /* Calculate, propagate count and probability information on CFG.  */
!       afdo_calculate_branch_prob (&annotated_bb);
!     }
    cgraph_node::get(current_function_decl)->count
        = ENTRY_BLOCK_PTR_FOR_FN(cfun)->count;
    update_max_bb_count ();
--- 1658,1667 ----
            = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count;
        set_bb_annotated (EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb, &annotated_bb);
      }
!   gcc_assert (max_count.nonzero_p ());
!   /* Calculate, propagate count and probability information on CFG.  */
!   afdo_calculate_branch_prob (&annotated_bb);
! 
    cgraph_node::get(current_function_decl)->count
        = ENTRY_BLOCK_PTR_FOR_FN(cfun)->count;
    update_max_bb_count ();
diff -Nrcpad gcc-16-20250525/gcc/avoid-store-forwarding.cc gcc-16-20250601/gcc/avoid-store-forwarding.cc
*** gcc-16-20250525/gcc/avoid-store-forwarding.cc	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/avoid-store-forwarding.cc	Sun Jun  1 22:32:13 2025
*************** process_store_forwarding (vec<store_fwd_
*** 176,195 ****
    /* 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.  */
  
    sbitmap forwarded_bytes = sbitmap_alloc (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_bit_in_range_p (forwarded_bytes, it->offset,
! 				 it->offset + store_size - 1))
! 	break;
        bitmap_set_range (forwarded_bytes, it->offset, store_size);
      }
  
--- 176,203 ----
    /* 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.  */
  
    sbitmap forwarded_bytes = sbitmap_alloc (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);
      }
  
*************** process_store_forwarding (vec<store_fwd_
*** 215,220 ****
--- 223,237 ----
  	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;
  
*************** process_store_forwarding (vec<store_fwd_
*** 231,248 ****
      {
        it->mov_reg = gen_reg_rtx (GET_MODE (it->store_mem));
        rtx_insn *insns = NULL;
  
        /* If we're eliminating the load then find the store with zero offset
  	 and use it as the base register to avoid a bit insert if possible.  */
!       if (load_elim && it->offset == 0)
  	{
  	  start_sequence ();
  
! 	  machine_mode dest_mode = GET_MODE (dest);
! 	  rtx base_reg = it->mov_reg;
! 	  if (known_gt (GET_MODE_BITSIZE (dest_mode),
! 			GET_MODE_BITSIZE (GET_MODE (it->mov_reg))))
! 	    base_reg = gen_rtx_ZERO_EXTEND (dest_mode, it->mov_reg);
  
  	  if (base_reg)
  	    {
--- 248,263 ----
      {
        it->mov_reg = gen_reg_rtx (GET_MODE (it->store_mem));
        rtx_insn *insns = NULL;
+       const bool has_zero_offset = it->offset == 0;
  
        /* If we're eliminating the load then find the store with zero offset
  	 and use it as the base register to avoid a bit insert if possible.  */
!       if (load_elim && has_zero_offset)
  	{
  	  start_sequence ();
  
! 	  rtx base_reg = lowpart_subreg (GET_MODE (dest), it->mov_reg,
! 					 GET_MODE (it->mov_reg));
  
  	  if (base_reg)
  	    {
*************** process_store_forwarding (vec<store_fwd_
*** 380,385 ****
--- 395,410 ----
  	      print_rtl_single (dump_file, insn);
  	    }
  	}
+ 
+       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++;
*************** process_store_forwarding (vec<store_fwd_
*** 399,404 ****
--- 424,433 ----
        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)
diff -Nrcpad gcc-16-20250525/gcc/c/ChangeLog gcc-16-20250601/gcc/c/ChangeLog
*** gcc-16-20250525/gcc/c/ChangeLog	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/c/ChangeLog	Sun Jun  1 22:32:13 2025
***************
*** 1,3 ****
--- 1,99 ----
+ 2025-05-30  Qing Zhao  <qing.zhao@oracle.com>
+ 
+ 	PR c/120354
+ 	* c-decl.cc (finish_struct): Or the results for TYPE_INCLUDES_FLEXARRAY.
+ 
+ 2025-05-30  Qing Zhao  <qing.zhao@oracle.com>
+ 
+ 	PR c/120353
+ 	* c-decl.cc (finish_struct): Copy TYPE_INCLUDES_FLEXARRAY marking
+ 	to all the variant types of the current structure type.
+ 
+ 2025-05-30  Julian Brown  <julian@codesourcery.com>
+ 
+ 	* c-decl.cc (c_omp_mapper_id, c_omp_mapper_decl, c_omp_mapper_lookup,
+ 	c_omp_extract_mapper_directive, c_omp_map_array_section,
+ 	c_omp_scan_mapper_bindings_r, c_omp_scan_mapper_bindings): New
+ 	functions.
+ 	* c-objc-common.h (LANG_HOOKS_OMP_FINISH_MAPPER_CLAUSES,
+ 	LANG_HOOKS_OMP_MAPPER_LOOKUP, LANG_HOOKS_OMP_EXTRACT_MAPPER_DIRECTIVE,
+ 	LANG_HOOKS_OMP_MAP_ARRAY_SECTION): Define langhooks for C.
+ 	* c-parser.cc (c_parser_omp_clause_map): Add declare_mapper_p
+ 	parameter; handle mapper modifier.
+ 	(c_parser_omp_all_clauses): Update call to c_parser_omp_clause_map.
+ 	(c_parser_omp_target): Instantiate explicit mappers and record bindings
+ 	for implicit mappers.
+ 	(c_parser_omp_declare_mapper): Parse "declare mapper" directives.
+ 	(c_parser_omp_declare): Support "declare mapper".
+ 	(c_parser_omp_declare_reduction): Use inform not error_at.
+ 	* c-tree.h (c_omp_finish_mapper_clauses, c_omp_mapper_lookup,
+ 	c_omp_extract_mapper_directive, c_omp_map_array_section,
+ 	c_omp_mapper_id, c_omp_mapper_decl, c_omp_scan_mapper_bindings,
+ 	c_omp_instantiate_mappers): Add prototypes.
+ 	* c-typeck.cc (c_finish_omp_clauses): Handle GOMP_MAP_PUSH_MAPPER_NAME
+ 	and GOMP_MAP_POP_MAPPER_NAME.
+ 	(c_omp_finish_mapper_clauses): New function (langhook).
+ 
+ 2025-05-30  Martin Uecker  <uecker@tugraz.at>
+ 
+ 	PR c/120381
+ 	* c-typeck.cc (composite_type_internal): Stop recursion for
+ 	swapped pairs.
+ 
+ 2025-05-29  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* c-parser.cc (c_parser_skip_to_closing_brace): New, copied from
+ 	the equivalent function in the C++ front end.
+ 	(c_parser_skip_to_end_of_block_or_statement): Pass false to
+ 	the error flag.
+ 	(c_parser_omp_context_selector): Immediately return error_mark_node
+ 	after giving an error that the integer trait property is invalid,
+ 	similarly to C++ front end.
+ 	(c_parser_omp_context_selector_specification): Likewise handle
+ 	error return from c_parser_omp_context_selector similarly to C++.
+ 	(c_parser_omp_metadirective): Do not call
+ 	c_parser_skip_to_end_of_block_or_statement after an error.
+ 
+ 2025-05-29  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR c/120180
+ 	* c-parser.cc (c_parser_omp_metadirective): Only consume the
+ 	token if it is the expected close paren.
+ 
+ 2025-05-27  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c/117025
+ 	* c-parser.cc (c_parser_sizeof_or_countof_expression): Use
+ 	C2Y rather than C23 in pedwarn_c23.
+ 
+ 2025-05-27  Alejandro Colomar  <alx@kernel.org>
+ 
+ 	PR c/117025
+ 	* c-parser.cc (c_parser_sizeof_or_countof_expression):
+ 	Add -Wpedantic diagnostic for _Countof in <= C23 mode.
+ 
+ 2025-05-27  Alejandro Colomar  <alx@kernel.org>
+ 	    Martin Uecker  <uecker@tugraz.at>
+ 
+ 	PR c/117025
+ 	* c-tree.h (in_countof): Add global variable declaration.
+ 	(c_expr_countof_expr): Add function prototype.
+ 	(c_expr_countof_type): Add function prototype.
+ 	* c-decl.cc (start_struct, finish_struct): Add support for
+ 	_Countof.
+ 	(start_enum, finish_enum): Add support for _Countof.
+ 	* c-parser.cc (c_parser_sizeof_expression): New macro.
+ 	(c_parser_countof_expression): New macro.
+ 	(c_parser_sizeof_or_countof_expression): Rename function and add
+ 	support for _Countof.
+ 	(c_parser_unary_expression): Add RID_COUNTOF entry.
+ 	* c-typeck.cc (in_countof): Add global variable.
+ 	(build_external_ref): Add support for _Countof.
+ 	(record_maybe_used_decl): Add support for _Countof.
+ 	(pop_maybe_used): Add support for _Countof.
+ 	(is_top_array_vla): New function.
+ 	(c_expr_countof_expr, c_expr_countof_type): New functions.
+ 
  2025-05-02  Jakub Jelinek  <jakub@redhat.com>
  
  	PR c/120057
diff -Nrcpad gcc-16-20250525/gcc/c/c-decl.cc gcc-16-20250601/gcc/c/c-decl.cc
*** gcc-16-20250525/gcc/c/c-decl.cc	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/c/c-decl.cc	Sun Jun  1 22:32:13 2025
*************** start_struct (location_t loc, enum tree_
*** 8943,8954 ****
       within a statement expr used within sizeof, et. al.  This is not
       terribly serious as C++ doesn't permit statement exprs within
       sizeof anyhow.  */
!   if (warn_cxx_compat && (in_sizeof || in_typeof || in_alignof))
      warning_at (loc, OPT_Wc___compat,
  		"defining type in %qs expression is invalid in C++",
! 		(in_sizeof
! 		 ? "sizeof"
! 		 : (in_typeof ? "typeof" : "alignof")));
  
    if (in_underspecified_init)
      error_at (loc, "%qT defined in underspecified object initializer", ref);
--- 8943,8956 ----
       within a statement expr used within sizeof, et. al.  This is not
       terribly serious as C++ doesn't permit statement exprs within
       sizeof anyhow.  */
!   if (warn_cxx_compat
!       && (in_sizeof || in_typeof || in_alignof || in_countof))
      warning_at (loc, OPT_Wc___compat,
  		"defining type in %qs expression is invalid in C++",
! 		(in_sizeof ? "sizeof"
! 		 : in_typeof ? "typeof"
! 		 : in_alignof ? "alignof"
! 		 : "_Countof"));
  
    if (in_underspecified_init)
      error_at (loc, "%qT defined in underspecified object initializer", ref);
*************** finish_struct (location_t loc, tree t, t
*** 9647,9661 ****
        DECL_NOT_FLEXARRAY (x) = !is_flexible_array_member_p (is_last_field, x);
  
        /* Set TYPE_INCLUDES_FLEXARRAY for the context of x, t.
! 	 when x is an array and is the last field.  */
        if (TREE_CODE (TREE_TYPE (x)) == ARRAY_TYPE)
  	TYPE_INCLUDES_FLEXARRAY (t)
! 	  = is_last_field && c_flexible_array_member_type_p (TREE_TYPE (x));
        /* Recursively set TYPE_INCLUDES_FLEXARRAY for the context of x, t
  	 when x is an union or record and is the last field.  */
        else if (RECORD_OR_UNION_TYPE_P (TREE_TYPE (x)))
  	TYPE_INCLUDES_FLEXARRAY (t)
! 	  = is_last_field && TYPE_INCLUDES_FLEXARRAY (TREE_TYPE (x));
  
        if (warn_flex_array_member_not_at_end
  	  && !is_last_field
--- 9649,9666 ----
        DECL_NOT_FLEXARRAY (x) = !is_flexible_array_member_p (is_last_field, x);
  
        /* Set TYPE_INCLUDES_FLEXARRAY for the context of x, t.
! 	 when x is an array and is the last field.
! 	 There is only one last_field for a structure type, but there might
! 	 be multiple last_fields for a union type, therefore we should ORed
! 	 the result for multiple last_fields.  */
        if (TREE_CODE (TREE_TYPE (x)) == ARRAY_TYPE)
  	TYPE_INCLUDES_FLEXARRAY (t)
! 	  |= is_last_field && c_flexible_array_member_type_p (TREE_TYPE (x));
        /* Recursively set TYPE_INCLUDES_FLEXARRAY for the context of x, t
  	 when x is an union or record and is the last field.  */
        else if (RECORD_OR_UNION_TYPE_P (TREE_TYPE (x)))
  	TYPE_INCLUDES_FLEXARRAY (t)
! 	  |= is_last_field && TYPE_INCLUDES_FLEXARRAY (TREE_TYPE (x));
  
        if (warn_flex_array_member_not_at_end
  	  && !is_last_field
*************** finish_struct (location_t loc, tree t, t
*** 9891,9896 ****
--- 9896,9902 ----
        C_TYPE_VARIABLE_SIZE (x) = C_TYPE_VARIABLE_SIZE (t);
        C_TYPE_VARIABLY_MODIFIED (x) = C_TYPE_VARIABLY_MODIFIED (t);
        C_TYPE_INCOMPLETE_VARS (x) = NULL_TREE;
+       TYPE_INCLUDES_FLEXARRAY (x) = TYPE_INCLUDES_FLEXARRAY (t);
      }
  
    /* Update type location to the one of the definition, instead of e.g.
*************** finish_struct (location_t loc, tree t, t
*** 9923,9929 ****
  	 struct_types.  */
        if (warn_cxx_compat
  	  && struct_parse_info != NULL
! 	  && !in_sizeof && !in_typeof && !in_alignof)
  	struct_parse_info->struct_types.safe_push (t);
       }
  
--- 9929,9935 ----
  	 struct_types.  */
        if (warn_cxx_compat
  	  && struct_parse_info != NULL
! 	  && !in_sizeof && !in_typeof && !in_alignof && !in_countof)
  	struct_parse_info->struct_types.safe_push (t);
       }
  
*************** start_enum (location_t loc, struct c_enu
*** 10097,10108 ****
    /* FIXME: This will issue a warning for a use of a type defined
       within sizeof in a statement expr.  This is not terribly serious
       as C++ doesn't permit statement exprs within sizeof anyhow.  */
!   if (warn_cxx_compat && (in_sizeof || in_typeof || in_alignof))
      warning_at (loc, OPT_Wc___compat,
  		"defining type in %qs expression is invalid in C++",
! 		(in_sizeof
! 		 ? "sizeof"
! 		 : (in_typeof ? "typeof" : "alignof")));
  
    if (in_underspecified_init)
      error_at (loc, "%qT defined in underspecified object initializer",
--- 10103,10116 ----
    /* FIXME: This will issue a warning for a use of a type defined
       within sizeof in a statement expr.  This is not terribly serious
       as C++ doesn't permit statement exprs within sizeof anyhow.  */
!   if (warn_cxx_compat
!       && (in_sizeof || in_typeof || in_alignof || in_countof))
      warning_at (loc, OPT_Wc___compat,
  		"defining type in %qs expression is invalid in C++",
! 		(in_sizeof ? "sizeof"
! 		 : in_typeof ? "typeof"
! 		 : in_alignof ? "alignof"
! 		 : "_Countof"));
  
    if (in_underspecified_init)
      error_at (loc, "%qT defined in underspecified object initializer",
*************** finish_enum (tree enumtype, tree values,
*** 10296,10302 ****
       struct_types.  */
    if (warn_cxx_compat
        && struct_parse_info != NULL
!       && !in_sizeof && !in_typeof && !in_alignof)
      struct_parse_info->struct_types.safe_push (enumtype);
  
    /* Check for consistency with previous definition */
--- 10304,10310 ----
       struct_types.  */
    if (warn_cxx_compat
        && struct_parse_info != NULL
!       && !in_sizeof && !in_typeof && !in_alignof && !in_countof)
      struct_parse_info->struct_types.safe_push (enumtype);
  
    /* Check for consistency with previous definition */
*************** c_check_omp_declare_reduction_r (tree *t
*** 13819,13824 ****
--- 13827,14000 ----
    return NULL_TREE;
  }
  
+ /* Return identifier to look up for omp declare mapper.  */
+ 
+ tree
+ c_omp_mapper_id (tree mapper_id)
+ {
+   const char *p = NULL;
+ 
+   const char prefix[] = "omp declare mapper ";
+ 
+   if (mapper_id == NULL_TREE)
+     p = "<default>";
+   else if (TREE_CODE (mapper_id) == IDENTIFIER_NODE)
+     p = IDENTIFIER_POINTER (mapper_id);
+   else
+     return error_mark_node;
+ 
+   size_t lenp = sizeof (prefix);
+   size_t len = strlen (p);
+   char *name = XALLOCAVEC (char, lenp + len);
+   memcpy (name, prefix, lenp - 1);
+   memcpy (name + lenp - 1, p, len + 1);
+   return get_identifier (name);
+ }
+ 
+ /* Lookup MAPPER_ID in the current scope, or create an artificial
+    VAR_DECL, bind it into the current scope and return it.  */
+ 
+ tree
+ c_omp_mapper_decl (tree mapper_id)
+ {
+   struct c_binding *b = I_SYMBOL_BINDING (mapper_id);
+   if (b != NULL && B_IN_CURRENT_SCOPE (b))
+     return b->decl;
+ 
+   tree decl = build_decl (BUILTINS_LOCATION, VAR_DECL,
+ 			  mapper_id, integer_type_node);
+   DECL_ARTIFICIAL (decl) = 1;
+   DECL_EXTERNAL (decl) = 1;
+   TREE_STATIC (decl) = 1;
+   TREE_PUBLIC (decl) = 0;
+   bind (mapper_id, decl, current_scope, true, false, BUILTINS_LOCATION);
+   return decl;
+ }
+ 
+ /* Lookup MAPPER_ID in the first scope where it has entry for TYPE.  */
+ 
+ tree
+ c_omp_mapper_lookup (tree mapper_id, tree type)
+ {
+   if (!RECORD_OR_UNION_TYPE_P (type))
+     return NULL_TREE;
+ 
+   mapper_id = c_omp_mapper_id (mapper_id);
+ 
+   struct c_binding *b = I_SYMBOL_BINDING (mapper_id);
+   while (b)
+     {
+       tree t;
+       for (t = DECL_INITIAL (b->decl); t; t = TREE_CHAIN (t))
+ 	if (comptypes (TREE_PURPOSE (t), type))
+ 	  return TREE_VALUE (t);
+       b = b->shadowed;
+     }
+   return NULL_TREE;
+ }
+ 
+ /* For C, we record a pointer to the mapper itself without wrapping it in an
+    artificial function or similar.  So, just return it.  */
+ 
+ tree
+ c_omp_extract_mapper_directive (tree mapper)
+ {
+   return mapper;
+ }
+ 
+ /* For now we can handle singleton OMP_ARRAY_SECTIONs with custom mappers, but
+    nothing more complicated.  */
+ 
+ tree
+ c_omp_map_array_section (location_t loc, tree t)
+ {
+   tree low = TREE_OPERAND (t, 1);
+   tree len = TREE_OPERAND (t, 2);
+ 
+   if (len && integer_onep (len))
+     {
+       t = TREE_OPERAND (t, 0);
+ 
+       if (!low)
+ 	low = integer_zero_node;
+ 
+       t = build_array_ref (loc, t, low);
+     }
+ 
+   return t;
+ }
+ 
+ /* Helper function for below function.  */
+ 
+ static tree
+ c_omp_scan_mapper_bindings_r (tree *tp, int *walk_subtrees, void *ptr)
+ {
+   tree t = *tp;
+   omp_mapper_list<tree> *mlist = (omp_mapper_list<tree> *) ptr;
+   tree aggr_type = NULL_TREE;
+ 
+   if (TREE_CODE (t) == SIZEOF_EXPR
+       || TREE_CODE (t) == ALIGNOF_EXPR)
+     {
+       *walk_subtrees = 0;
+       return NULL_TREE;
+     }
+ 
+   if (TREE_CODE (t) == OMP_CLAUSE)
+     return NULL_TREE;
+ 
+   if (TREE_CODE (t) == COMPONENT_REF
+       && RECORD_OR_UNION_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
+     aggr_type = TREE_TYPE (TREE_OPERAND (t, 0));
+   else if ((TREE_CODE (t) == VAR_DECL
+ 	    || TREE_CODE (t) == PARM_DECL
+ 	    || TREE_CODE (t) == RESULT_DECL)
+ 	   && RECORD_OR_UNION_TYPE_P (TREE_TYPE (t)))
+     aggr_type = TREE_TYPE (t);
+ 
+   if (aggr_type)
+     {
+       tree mapper_fn = c_omp_mapper_lookup (NULL_TREE, aggr_type);
+       if (mapper_fn)
+ 	mlist->add_mapper (NULL_TREE, aggr_type, mapper_fn);
+     }
+ 
+   return NULL_TREE;
+ }
+ 
+ /* Scan an offload region's body, and record uses of struct- or union-typed
+    variables.  Add _mapper_binding_ fake clauses to *CLAUSES_PTR.  */
+ 
+ void
+ c_omp_scan_mapper_bindings (location_t loc, tree *clauses_ptr, tree body)
+ {
+   hash_set<omp_name_type<tree>> seen_types;
+   auto_vec<tree> mappers;
+   omp_mapper_list<tree> mlist (&seen_types, &mappers);
+ 
+   walk_tree_without_duplicates (&body, c_omp_scan_mapper_bindings_r, &mlist);
+ 
+   unsigned int i;
+   tree mapper;
+   FOR_EACH_VEC_ELT (mappers, i, mapper)
+     c_omp_find_nested_mappers (&mlist, mapper);
+ 
+   FOR_EACH_VEC_ELT (mappers, i, mapper)
+     {
+       if (mapper == error_mark_node)
+ 	continue;
+       tree mapper_name = OMP_DECLARE_MAPPER_ID (mapper);
+       tree decl = OMP_DECLARE_MAPPER_DECL (mapper);
+ 
+       tree c = build_omp_clause (loc, OMP_CLAUSE__MAPPER_BINDING_);
+       OMP_CLAUSE__MAPPER_BINDING__ID (c) = mapper_name;
+       OMP_CLAUSE__MAPPER_BINDING__DECL (c) = decl;
+       OMP_CLAUSE__MAPPER_BINDING__MAPPER (c) = mapper;
+ 
+       OMP_CLAUSE_CHAIN (c) = *clauses_ptr;
+       *clauses_ptr = c;
+     }
+ }
  
  bool
  c_check_in_current_scope (tree decl)
diff -Nrcpad gcc-16-20250525/gcc/c/c-objc-common.cc gcc-16-20250601/gcc/c/c-objc-common.cc
*** gcc-16-20250525/gcc/c/c-objc-common.cc	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/c/c-objc-common.cc	Sun Jun  1 22:32:13 2025
*************** get_aka_type (tree type)
*** 216,221 ****
--- 216,226 ----
  	  return canonical ? canonical : type;
  	}
      }
+   /* For tagged types ignore attributes because they will otherwise
+      be ignored later causing a warning inside diagnostics which leads
+      to an ICE.  */
+   if (RECORD_OR_UNION_TYPE_P (type) || TREE_CODE (type) == ENUMERAL_TYPE)
+     return build_qualified_type (result, TYPE_QUALS (type));
    return build_type_attribute_qual_variant (result, TYPE_ATTRIBUTES (type),
  					    TYPE_QUALS (type));
  }
diff -Nrcpad gcc-16-20250525/gcc/c/c-objc-common.h gcc-16-20250601/gcc/c/c-objc-common.h
*** gcc-16-20250525/gcc/c/c-objc-common.h	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/c/c-objc-common.h	Sun Jun  1 22:32:13 2025
*************** static const scoped_attribute_specs *con
*** 137,142 ****
--- 137,154 ----
  #undef LANG_HOOKS_OMP_CLAUSE_ASSIGN_OP
  #define LANG_HOOKS_OMP_CLAUSE_ASSIGN_OP c_omp_clause_copy_ctor
  
+ #undef LANG_HOOKS_OMP_FINISH_MAPPER_CLAUSES
+ #define LANG_HOOKS_OMP_FINISH_MAPPER_CLAUSES c_omp_finish_mapper_clauses
+ 
+ #undef LANG_HOOKS_OMP_MAPPER_LOOKUP
+ #define LANG_HOOKS_OMP_MAPPER_LOOKUP c_omp_mapper_lookup
+ 
+ #undef LANG_HOOKS_OMP_EXTRACT_MAPPER_DIRECTIVE
+ #define LANG_HOOKS_OMP_EXTRACT_MAPPER_DIRECTIVE c_omp_extract_mapper_directive
+ 
+ #undef LANG_HOOKS_OMP_MAP_ARRAY_SECTION
+ #define LANG_HOOKS_OMP_MAP_ARRAY_SECTION c_omp_map_array_section
+ 
  #undef LANG_HOOKS_TREE_INLINING_VAR_MOD_TYPE_P
  #define LANG_HOOKS_TREE_INLINING_VAR_MOD_TYPE_P c_var_mod_p
  #endif /* GCC_C_OBJC_COMMON */
diff -Nrcpad gcc-16-20250525/gcc/c/c-parser.cc gcc-16-20250601/gcc/c/c-parser.cc
*** gcc-16-20250525/gcc/c/c-parser.cc	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/c/c-parser.cc	Sun Jun  1 22:32:13 2025
*************** along with GCC; see the file COPYING3.
*** 77,83 ****
  #include "asan.h"
  #include "c-family/c-ubsan.h"
  #include "gcc-urlifier.h"
! 
  /* We need to walk over decls with incomplete struct/union/enum types
     after parsing the whole translation unit.
     In finish_decl(), if the decl is static, has incomplete
--- 77,83 ----
  #include "asan.h"
  #include "c-family/c-ubsan.h"
  #include "gcc-urlifier.h"
! 
  /* We need to walk over decls with incomplete struct/union/enum types
     after parsing the whole translation unit.
     In finish_decl(), if the decl is static, has incomplete
*************** c_parser_skip_to_end_of_parameter (c_par
*** 1420,1425 ****
--- 1420,1470 ----
    parser->error = false;
  }
  
+ /* Skip tokens until a non-nested closing curly brace is the next
+    token, or there are no more tokens. Return true in the first case,
+    false otherwise.  */
+ 
+ static bool
+ c_parser_skip_to_closing_brace (c_parser *parser)
+ {
+   unsigned nesting_depth = 0;
+ 
+   while (true)
+     {
+       c_token *token = c_parser_peek_token (parser);
+ 
+       switch (token->type)
+ 	{
+ 	case CPP_PRAGMA_EOL:
+ 	  if (!parser->in_pragma)
+ 	    break;
+ 	  /* FALLTHRU */
+ 	case CPP_EOF:
+ 	  /* If we've run out of tokens, stop.  */
+ 	  return false;
+ 
+ 	case CPP_CLOSE_BRACE:
+ 	  /* If the next token is a non-nested `}', then we have reached
+ 	     the end of the current block.  */
+ 	  if (nesting_depth-- == 0)
+ 	    return true;
+ 	  break;
+ 
+ 	case CPP_OPEN_BRACE:
+ 	  /* If it the next token is a `{', then we are entering a new
+ 	     block.  Consume the entire block.  */
+ 	  ++nesting_depth;
+ 	  break;
+ 
+ 	default:
+ 	  break;
+ 	}
+ 
+       /* Consume the token.  */
+       c_parser_consume_token (parser);
+     }
+ }
+ 
  /* Expect to be at the end of the pragma directive and consume an
     end of line marker.  */
  
*************** c_parser_skip_to_end_of_block_or_stateme
*** 1535,1541 ****
  	     here for secondary error recovery, after parser->error has
  	     been cleared.  */
  	  c_parser_consume_pragma (parser);
! 	  c_parser_skip_to_pragma_eol (parser);
  	  parser->error = save_error;
  	  continue;
  
--- 1580,1586 ----
  	     here for secondary error recovery, after parser->error has
  	     been cleared.  */
  	  c_parser_consume_pragma (parser);
! 	  c_parser_skip_to_pragma_eol (parser, false);
  	  parser->error = save_error;
  	  continue;
  
*************** static struct c_expr c_parser_binary_exp
*** 1737,1743 ****
  						 tree);
  static struct c_expr c_parser_cast_expression (c_parser *, struct c_expr *);
  static struct c_expr c_parser_unary_expression (c_parser *);
! static struct c_expr c_parser_sizeof_expression (c_parser *);
  static struct c_expr c_parser_alignof_expression (c_parser *);
  static struct c_expr c_parser_postfix_expression (c_parser *);
  static struct c_expr c_parser_postfix_expression_after_paren_type (c_parser *,
--- 1782,1791 ----
  						 tree);
  static struct c_expr c_parser_cast_expression (c_parser *, struct c_expr *);
  static struct c_expr c_parser_unary_expression (c_parser *);
! static inline struct c_expr c_parser_sizeof_expression (c_parser *);
! static inline struct c_expr c_parser_countof_expression (c_parser *);
! static struct c_expr c_parser_sizeof_or_countof_expression (c_parser *,
! 							    enum rid);
  static struct c_expr c_parser_alignof_expression (c_parser *);
  static struct c_expr c_parser_postfix_expression (c_parser *);
  static struct c_expr c_parser_postfix_expression_after_paren_type (c_parser *,
*************** c_parser_cast_expression (c_parser *pars
*** 10452,10460 ****
--- 10500,10512 ----
       ++ unary-expression
       -- unary-expression
       unary-operator cast-expression
+      _Countof unary-expression
+      _Countof ( type-name )
       sizeof unary-expression
       sizeof ( type-name )
  
+    (_Countof is new in C2y.)
+ 
     unary-operator: one of
       & * + - ~ !
  
*************** c_parser_unary_expression (c_parser *par
*** 10572,10577 ****
--- 10624,10631 ----
      case CPP_KEYWORD:
        switch (c_parser_peek_token (parser)->keyword)
  	{
+ 	case RID_COUNTOF:
+ 	  return c_parser_countof_expression (parser);
  	case RID_SIZEOF:
  	  return c_parser_sizeof_expression (parser);
  	case RID_ALIGNOF:
*************** c_parser_unary_expression (c_parser *par
*** 10610,10631 ****
  
  /* Parse a sizeof expression.  */
  
! static struct c_expr
  c_parser_sizeof_expression (c_parser *parser)
  {
    struct c_expr expr;
    struct c_expr result;
    location_t expr_loc;
!   gcc_assert (c_parser_next_token_is_keyword (parser, RID_SIZEOF));
  
    location_t start;
    location_t finish = UNKNOWN_LOCATION;
  
    start = c_parser_peek_token (parser)->location;
  
    c_parser_consume_token (parser);
    c_inhibit_evaluation_warnings++;
!   in_sizeof++;
    if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
        && c_token_starts_compound_literal (c_parser_peek_2nd_token (parser)))
      {
--- 10664,10709 ----
  
  /* Parse a sizeof expression.  */
  
! static inline struct c_expr
  c_parser_sizeof_expression (c_parser *parser)
  {
+   return c_parser_sizeof_or_countof_expression (parser, RID_SIZEOF);
+ }
+ 
+ /* Parse a _Countof expression.  */
+ 
+ static inline struct c_expr
+ c_parser_countof_expression (c_parser *parser)
+ {
+   return c_parser_sizeof_or_countof_expression (parser, RID_COUNTOF);
+ }
+ 
+ /* Parse a sizeof or _Countof expression.  */
+ 
+ static struct c_expr
+ c_parser_sizeof_or_countof_expression (c_parser *parser, enum rid rid)
+ {
+   const char *op_name = (rid == RID_COUNTOF) ? "_Countof" : "sizeof";
    struct c_expr expr;
    struct c_expr result;
    location_t expr_loc;
!   gcc_assert (c_parser_next_token_is_keyword (parser, rid));
  
    location_t start;
    location_t finish = UNKNOWN_LOCATION;
  
    start = c_parser_peek_token (parser)->location;
  
+   if (rid == RID_COUNTOF)
+     pedwarn_c23 (start, OPT_Wpedantic,
+ 		 "ISO C does not support %qs before C2Y", op_name);
+ 
    c_parser_consume_token (parser);
    c_inhibit_evaluation_warnings++;
!   if (rid == RID_COUNTOF)
!     in_countof++;
!   else
!     in_sizeof++;
    if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
        && c_token_starts_compound_literal (c_parser_peek_2nd_token (parser)))
      {
*************** c_parser_sizeof_expression (c_parser *pa
*** 10646,10652 ****
  	     for parsing error; the parsing of the expression could have
  	     called record_maybe_used_decl.  */
  	  expr.set_error ();
! 	  goto sizeof_expr;
  	}
        if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
  	{
--- 10724,10730 ----
  	     for parsing error; the parsing of the expression could have
  	     called record_maybe_used_decl.  */
  	  expr.set_error ();
! 	  goto Xof_expr;
  	}
        if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
  	{
*************** c_parser_sizeof_expression (c_parser *pa
*** 10654,10684 ****
  							       type_name,
  							       expr_loc);
  	  finish = expr.get_finish ();
! 	  goto sizeof_expr;
  	}
        /* sizeof ( type-name ).  */
        if (scspecs)
! 	error_at (expr_loc, "storage class specifier in %<sizeof%>");
        if (type_name->specs->alignas_p)
  	error_at (type_name->specs->locations[cdw_alignas],
! 		  "alignment specified for type name in %<sizeof%>");
        c_inhibit_evaluation_warnings--;
!       in_sizeof--;
!       result = c_expr_sizeof_type (expr_loc, type_name);
      }
    else
      {
        expr_loc = c_parser_peek_token (parser)->location;
        expr = c_parser_unary_expression (parser);
        finish = expr.get_finish ();
!     sizeof_expr:
        c_inhibit_evaluation_warnings--;
!       in_sizeof--;
        mark_exp_read (expr.value);
        if (TREE_CODE (expr.value) == COMPONENT_REF
  	  && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
! 	error_at (expr_loc, "%<sizeof%> applied to a bit-field");
!       result = c_expr_sizeof_expr (expr_loc, expr);
      }
    if (finish == UNKNOWN_LOCATION)
      finish = start;
--- 10732,10776 ----
  							       type_name,
  							       expr_loc);
  	  finish = expr.get_finish ();
! 	  goto Xof_expr;
  	}
        /* sizeof ( type-name ).  */
        if (scspecs)
! 	error_at (expr_loc, "storage class specifier in %qs", op_name);
        if (type_name->specs->alignas_p)
  	error_at (type_name->specs->locations[cdw_alignas],
! 		  "alignment specified for type name in %qs", op_name);
        c_inhibit_evaluation_warnings--;
!       if (rid == RID_COUNTOF)
! 	{
! 	  in_countof--;
! 	  result = c_expr_countof_type (expr_loc, type_name);
! 	}
!       else
! 	{
! 	  in_sizeof--;
! 	  result = c_expr_sizeof_type (expr_loc, type_name);
! 	}
      }
    else
      {
        expr_loc = c_parser_peek_token (parser)->location;
        expr = c_parser_unary_expression (parser);
        finish = expr.get_finish ();
!     Xof_expr:
        c_inhibit_evaluation_warnings--;
!       if (rid == RID_COUNTOF)
! 	in_countof--;
!       else
! 	in_sizeof--;
        mark_exp_read (expr.value);
        if (TREE_CODE (expr.value) == COMPONENT_REF
  	  && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
! 	error_at (expr_loc, "%qs applied to a bit-field", op_name);
!       if (rid == RID_COUNTOF)
! 	result = c_expr_countof_expr (expr_loc, expr);
!       else
! 	result = c_expr_sizeof_expr (expr_loc, expr);
      }
    if (finish == UNKNOWN_LOCATION)
      finish = start;
*************** c_parser_omp_clause_doacross (c_parser *
*** 19941,19951 ****
       always | close */
  
  static tree
! c_parser_omp_clause_map (c_parser *parser, tree list)
  {
    location_t clause_loc = c_parser_peek_token (parser)->location;
-   enum gomp_map_kind kind = GOMP_MAP_TOFROM;
    tree nl, c;
  
    matching_parens parens;
    if (!parens.require_open (parser))
--- 20033,20043 ----
       always | close */
  
  static tree
! c_parser_omp_clause_map (c_parser *parser, tree list, bool declare_mapper_p)
  {
    location_t clause_loc = c_parser_peek_token (parser)->location;
    tree nl, c;
+   enum gomp_map_kind kind = declare_mapper_p ? GOMP_MAP_UNSET : GOMP_MAP_TOFROM;
  
    matching_parens parens;
    if (!parens.require_open (parser))
*************** c_parser_omp_clause_map (c_parser *parse
*** 19963,19974 ****
--- 20055,20080 ----
  
        if (c_parser_peek_nth_token_raw (parser, pos + 1)->type == CPP_COMMA)
  	pos++;
+       else if (c_parser_peek_nth_token_raw (parser, pos + 1)->type
+ 	       == CPP_OPEN_PAREN)
+ 	{
+ 	  unsigned int npos = pos + 2;
+ 	  if (c_parser_check_balanced_raw_token_sequence (parser, &npos)
+ 	      && (c_parser_peek_nth_token_raw (parser, npos)->type
+ 		  == CPP_CLOSE_PAREN)
+ 	      && (c_parser_peek_nth_token_raw (parser, npos + 1)->type
+ 		  == CPP_COMMA))
+ 	    pos = npos + 1;
+ 	}
+ 
        pos++;
      }
  
    int always_modifier = 0;
    int close_modifier = 0;
    int present_modifier = 0;
+   int mapper_modifier = 0;
+   tree mapper_name = NULL_TREE;
    for (int pos = 1; pos < map_kind_pos; ++pos)
      {
        c_token *tok = c_parser_peek_token (parser);
*************** c_parser_omp_clause_map (c_parser *parse
*** 19989,19994 ****
--- 20095,20101 ----
  	      return list;
  	    }
  	  always_modifier++;
+ 	  c_parser_consume_token (parser);
  	}
        else if (strcmp ("close", p) == 0)
  	{
*************** c_parser_omp_clause_map (c_parser *parse
*** 19999,20004 ****
--- 20106,20171 ----
  	      return list;
  	    }
  	  close_modifier++;
+ 	  c_parser_consume_token (parser);
+ 	}
+       else if (strcmp ("mapper", p) == 0)
+ 	{
+ 	  c_parser_consume_token (parser);
+ 
+ 	  matching_parens mparens;
+ 	  if (mparens.require_open (parser))
+ 	    {
+ 	      if (mapper_modifier)
+ 		{
+ 		  c_parser_error (parser, "too many %<mapper%> modifiers");
+ 		  /* Assume it's a well-formed mapper modifier, even if it
+ 		     seems to be in the wrong place.  */
+ 		  c_parser_consume_token (parser);
+ 		  mparens.require_close (parser);
+ 		  parens.skip_until_found_close (parser);
+ 		  return list;
+ 		}
+ 
+ 	      tok = c_parser_peek_token (parser);
+ 
+ 	      switch (tok->type)
+ 		{
+ 		case CPP_NAME:
+ 		  {
+ 		    mapper_name = tok->value;
+ 		    c_parser_consume_token (parser);
+ 		    if (declare_mapper_p)
+ 		      {
+ 			error_at (tok->location,
+ 				  "in %<declare mapper%> directives, parameter "
+ 				  "to %<mapper%> modifier must be %<default%>");
+ 		      }
+ 		  }
+ 		  break;
+ 
+ 		case CPP_KEYWORD:
+ 		  if (tok->keyword == RID_DEFAULT)
+ 		    {
+ 		      c_parser_consume_token (parser);
+ 		      break;
+ 		    }
+ 		  /* Fallthrough.  */
+ 
+ 		default:
+ 		  error_at (tok->location,
+ 			    "expected identifier or %<default%>");
+ 		  return list;
+ 		}
+ 
+ 	      if (!mparens.require_close (parser))
+ 		{
+ 		  parens.skip_until_found_close (parser);
+ 		  return list;
+ 		}
+ 
+ 	      mapper_modifier++;
+ 	      pos += 3;
+ 	    }
  	}
        else if (strcmp ("present", p) == 0)
  	{
*************** c_parser_omp_clause_map (c_parser *parse
*** 20009,20024 ****
  	      return list;
  	    }
  	  present_modifier++;
  	}
        else
  	{
  	  c_parser_error (parser, "%<map%> clause with map-type modifier other "
! 				  "than %<always%>, %<close%> or %<present%>");
  	  parens.skip_until_found_close (parser);
  	  return list;
  	}
- 
- 	c_parser_consume_token (parser);
      }
  
    if (c_parser_next_token_is (parser, CPP_NAME)
--- 20176,20191 ----
  	      return list;
  	    }
  	  present_modifier++;
+ 	  c_parser_consume_token (parser);
  	}
        else
  	{
  	  c_parser_error (parser, "%<map%> clause with map-type modifier other "
! 				  "than %<always%>, %<close%>, %<mapper%> or "
! 				  "%<present%>");
  	  parens.skip_until_found_close (parser);
  	  return list;
  	}
      }
  
    if (c_parser_next_token_is (parser, CPP_NAME)
*************** c_parser_omp_clause_map (c_parser *parse
*** 20062,20069 ****
    nl = c_parser_omp_variable_list (parser, clause_loc, OMP_CLAUSE_MAP, list,
  				   true);
  
    for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
!     OMP_CLAUSE_SET_MAP_KIND (c, kind);
  
    parens.skip_until_found_close (parser);
    return nl;
--- 20229,20258 ----
    nl = c_parser_omp_variable_list (parser, clause_loc, OMP_CLAUSE_MAP, list,
  				   true);
  
+   tree last_new = NULL_TREE;
+ 
    for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
!     {
!       OMP_CLAUSE_SET_MAP_KIND (c, kind);
!       last_new = c;
!     }
! 
!   if (mapper_name)
!     {
!       tree name = build_omp_clause (input_location, OMP_CLAUSE_MAP);
!       OMP_CLAUSE_SET_MAP_KIND (name, GOMP_MAP_PUSH_MAPPER_NAME);
!       OMP_CLAUSE_DECL (name) = mapper_name;
!       OMP_CLAUSE_CHAIN (name) = nl;
!       nl = name;
! 
!       gcc_assert (last_new);
! 
!       name = build_omp_clause (input_location, OMP_CLAUSE_MAP);
!       OMP_CLAUSE_SET_MAP_KIND (name, GOMP_MAP_POP_MAPPER_NAME);
!       OMP_CLAUSE_DECL (name) = null_pointer_node;
!       OMP_CLAUSE_CHAIN (name) = OMP_CLAUSE_CHAIN (last_new);
!       OMP_CLAUSE_CHAIN (last_new) = name;
!     }
  
    parens.skip_until_found_close (parser);
    return nl;
*************** c_parser_omp_all_clauses (c_parser *pars
*** 21432,21438 ****
  	  c_name = "interop";
  	  break;
  	case PRAGMA_OMP_CLAUSE_MAP:
! 	  clauses = c_parser_omp_clause_map (parser, clauses);
  	  c_name = "map";
  	  break;
  	case PRAGMA_OMP_CLAUSE_USE_DEVICE_PTR:
--- 21621,21627 ----
  	  c_name = "interop";
  	  break;
  	case PRAGMA_OMP_CLAUSE_MAP:
! 	  clauses = c_parser_omp_clause_map (parser, clauses, false);
  	  c_name = "map";
  	  break;
  	case PRAGMA_OMP_CLAUSE_USE_DEVICE_PTR:
*************** c_parser_omp_target (c_parser *parser, e
*** 26251,26257 ****
  {
    location_t loc = c_parser_peek_token (parser)->location;
    c_parser_consume_pragma (parser);
!   tree *pc = NULL, stmt, block;
  
    if (context != pragma_stmt && context != pragma_compound)
      {
--- 26440,26446 ----
  {
    location_t loc = c_parser_peek_token (parser)->location;
    c_parser_consume_pragma (parser);
!   tree *pc = NULL, stmt, block, body, clauses;
  
    if (context != pragma_stmt && context != pragma_compound)
      {
*************** c_parser_omp_target (c_parser *parser, e
*** 26406,26415 ****
    stmt = make_node (OMP_TARGET);
    TREE_TYPE (stmt) = void_type_node;
  
!   OMP_TARGET_CLAUSES (stmt)
!     = c_parser_omp_all_clauses (parser, OMP_TARGET_CLAUSE_MASK,
! 				"#pragma omp target", false);
!   for (tree c = OMP_TARGET_CLAUSES (stmt); c; c = OMP_CLAUSE_CHAIN (c))
      if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_IN_REDUCTION)
        {
  	tree nc = build_omp_clause (OMP_CLAUSE_LOCATION (c), OMP_CLAUSE_MAP);
--- 26595,26603 ----
    stmt = make_node (OMP_TARGET);
    TREE_TYPE (stmt) = void_type_node;
  
!   clauses = c_parser_omp_all_clauses (parser, OMP_TARGET_CLAUSE_MASK,
! 				      "#pragma omp target", false);
!   for (tree c = clauses; c; c = OMP_CLAUSE_CHAIN (c))
      if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_IN_REDUCTION)
        {
  	tree nc = build_omp_clause (OMP_CLAUSE_LOCATION (c), OMP_CLAUSE_MAP);
*************** c_parser_omp_target (c_parser *parser, e
*** 26418,26431 ****
  	OMP_CLAUSE_CHAIN (nc) = OMP_CLAUSE_CHAIN (c);
  	OMP_CLAUSE_CHAIN (c) = nc;
        }
!   OMP_TARGET_CLAUSES (stmt)
!     = c_finish_omp_clauses (OMP_TARGET_CLAUSES (stmt), C_ORT_OMP_TARGET);
!   c_omp_adjust_map_clauses (OMP_TARGET_CLAUSES (stmt), true);
  
-   pc = &OMP_TARGET_CLAUSES (stmt);
    keep_next_level ();
    block = c_begin_compound_stmt (true);
!   add_stmt (c_parser_omp_structured_block (parser, if_p));
    OMP_TARGET_BODY (stmt) = c_end_compound_stmt (loc, block, true);
  
    SET_EXPR_LOCATION (stmt, loc);
--- 26606,26624 ----
  	OMP_CLAUSE_CHAIN (nc) = OMP_CLAUSE_CHAIN (c);
  	OMP_CLAUSE_CHAIN (c) = nc;
        }
!   clauses = c_omp_instantiate_mappers (clauses);
!   clauses  = c_finish_omp_clauses (clauses, C_ORT_OMP_TARGET);
!   c_omp_adjust_map_clauses (clauses, true);
  
    keep_next_level ();
    block = c_begin_compound_stmt (true);
!   body = c_parser_omp_structured_block (parser, if_p);
! 
!   c_omp_scan_mapper_bindings (loc, &clauses, body);
! 
!   add_stmt (body);
!   OMP_TARGET_CLAUSES (stmt) = clauses;
!   pc = &OMP_TARGET_CLAUSES (stmt);
    OMP_TARGET_BODY (stmt) = c_end_compound_stmt (loc, block, true);
  
    SET_EXPR_LOCATION (stmt, loc);
*************** c_parser_omp_context_selector (c_parser
*** 26774,26792 ****
  	    case OMP_TRAIT_PROPERTY_DEV_NUM_EXPR:
  	    case OMP_TRAIT_PROPERTY_BOOL_EXPR:
  	      t = c_parser_expr_no_commas (parser, NULL).value;
! 	      if (t != error_mark_node)
  		{
! 		  mark_exp_read (t);
! 		  t = c_fully_fold (t, false, NULL);
! 		  if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
! 		    error_at (token->location,
! 			      "property must be integer expression");
! 		  else
! 		    properties = make_trait_property (NULL_TREE, t,
! 						      properties);
  		}
! 	      else
! 		return error_mark_node;
  	      break;
  	    case OMP_TRAIT_PROPERTY_CLAUSE_LIST:
  	      if (sel == OMP_TRAIT_CONSTRUCT_SIMD)
--- 26967,26983 ----
  	    case OMP_TRAIT_PROPERTY_DEV_NUM_EXPR:
  	    case OMP_TRAIT_PROPERTY_BOOL_EXPR:
  	      t = c_parser_expr_no_commas (parser, NULL).value;
! 	      if (t == error_mark_node)
! 		return error_mark_node;
! 	      mark_exp_read (t);
! 	      t = c_fully_fold (t, false, NULL);
! 	      if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
  		{
! 		  error_at (token->location,
! 			    "property must be integer expression");
! 		  return error_mark_node;
  		}
! 	      properties = make_trait_property (NULL_TREE, t, properties);
  	      break;
  	    case OMP_TRAIT_PROPERTY_CLAUSE_LIST:
  	      if (sel == OMP_TRAIT_CONSTRUCT_SIMD)
*************** c_parser_omp_context_selector_specificat
*** 26888,26898 ****
  
        tree selectors = c_parser_omp_context_selector (parser, set, parms);
        if (selectors == error_mark_node)
! 	ret = error_mark_node;
        else if (ret != error_mark_node)
  	ret = make_trait_set_selector (set, selectors, ret);
  
!       braces.skip_until_found_close (parser);
  
        if (c_parser_next_token_is (parser, CPP_COMMA))
  	c_parser_consume_token (parser);
--- 27079,27092 ----
  
        tree selectors = c_parser_omp_context_selector (parser, set, parms);
        if (selectors == error_mark_node)
! 	{
! 	  c_parser_skip_to_closing_brace (parser);
! 	  ret = error_mark_node;
! 	}
        else if (ret != error_mark_node)
  	ret = make_trait_set_selector (set, selectors, ret);
  
!       braces.require_close (parser);
  
        if (c_parser_next_token_is (parser, CPP_COMMA))
  	c_parser_consume_token (parser);
*************** c_parser_omp_end (c_parser *parser)
*** 27797,27802 ****
--- 27991,28141 ----
      }
  }
  
+ /* OpenMP 5.0
+    #pragma omp declare mapper ([mapper-identifier :] type var) \
+ 			      [clause [ [,] clause ] ... ] new-line  */
+ 
+ static void
+ c_parser_omp_declare_mapper (c_parser *parser, enum pragma_context context)
+ {
+   tree type, mapper_name = NULL_TREE, var = NULL_TREE, stmt, stmtlist;
+   tree maplist = NULL_TREE, mapper_id, mapper_decl, t;
+   c_token *token;
+ 
+   if (context == pragma_struct || context == pragma_param)
+     {
+       error ("%<#pragma omp declare mapper%> not at file or block scope");
+       goto fail;
+     }
+ 
+   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
+     goto fail;
+ 
+   token = c_parser_peek_token (parser);
+ 
+   if (c_parser_peek_2nd_token (parser)->type == CPP_COLON)
+     {
+       switch (token->type)
+ 	{
+ 	case CPP_NAME:
+ 	  mapper_name = token->value;
+ 	  c_parser_consume_token (parser);
+ 	  break;
+ 	case CPP_KEYWORD:
+ 	  if (token->keyword == RID_DEFAULT)
+ 	    {
+ 	      mapper_name = NULL_TREE;
+ 	      c_parser_consume_token (parser);
+ 	      break;
+ 	    }
+ 	  /* Fallthrough.  */
+ 	default:
+ 	  error_at (token->location, "expected identifier or %<default%>");
+ 	  c_parser_skip_to_pragma_eol (parser, false);
+ 	  return;
+ 	}
+ 
+       if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
+ 	goto fail;
+     }
+ 
+   mapper_id = c_omp_mapper_id (mapper_name);
+   mapper_decl = c_omp_mapper_decl (mapper_id);
+ 
+   {
+     location_t loc = c_parser_peek_token (parser)->location;
+     struct c_type_name *ctype = c_parser_type_name (parser);
+     type = groktypename (ctype, NULL, NULL);
+     if (type == error_mark_node)
+       goto fail;
+     if (!RECORD_OR_UNION_TYPE_P (type))
+       {
+ 	error_at (loc, "%qT is not a struct or union type in "
+ 		  "%<#pragma omp declare mapper%>", type);
+ 	c_parser_skip_to_pragma_eol (parser, false);
+ 	return;
+       }
+     for (tree t = DECL_INITIAL (mapper_decl); t; t = TREE_CHAIN (t))
+       if (comptypes (TREE_PURPOSE (t), type))
+ 	{
+ 	  error_at (loc, "redeclaration of %qs %<#pragma omp declare "
+ 		    "mapper%> for type %qT", IDENTIFIER_POINTER (mapper_id)
+ 		      + sizeof ("omp declare mapper ") - 1,
+ 		    type);
+ 	  tree prevmapper = TREE_VALUE (t);
+ 	  /* Hmm, this location might not be very accurate.  */
+ 	  location_t ploc
+ 	    = DECL_SOURCE_LOCATION (OMP_DECLARE_MAPPER_DECL (prevmapper));
+ 	  inform (ploc, "%<#pragma omp declare mapper%> "
+ 			"previously declared here");
+ 	  c_parser_skip_to_pragma_eol (parser, false);
+ 	  return;
+ 	}
+   }
+ 
+   token = c_parser_peek_token (parser);
+   if (token->type == CPP_NAME)
+     {
+       var = build_decl (token->location, VAR_DECL, token->value, type);
+       c_parser_consume_token (parser);
+       DECL_ARTIFICIAL (var) = 1;
+     }
+   else
+     {
+       error_at (token->location, "expected identifier");
+       goto fail;
+     }
+ 
+   if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
+     goto fail;
+ 
+   push_scope ();
+   stmtlist = push_stmt_list ();
+   pushdecl (var);
+   DECL_CONTEXT (var) = current_function_decl;
+ 
+   while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
+     {
+       location_t here;
+       pragma_omp_clause c_kind;
+       here = c_parser_peek_token (parser)->location;
+       c_kind = c_parser_omp_clause_name (parser);
+       if (c_kind != PRAGMA_OMP_CLAUSE_MAP)
+ 	{
+ 	  error_at (here, "unexpected clause");
+ 	  goto fail;
+ 	}
+       maplist = c_parser_omp_clause_map (parser, maplist, true);
+     }
+ 
+   if (maplist == NULL_TREE)
+     {
+       error_at (input_location, "missing %<map%> clause");
+       goto fail;
+     }
+ 
+   stmt = make_node (OMP_DECLARE_MAPPER);
+   TREE_TYPE (stmt) = type;
+   OMP_DECLARE_MAPPER_ID (stmt) = mapper_name;
+   OMP_DECLARE_MAPPER_DECL (stmt) = var;
+   OMP_DECLARE_MAPPER_CLAUSES (stmt) = maplist;
+ 
+   add_stmt (stmt);
+ 
+   pop_stmt_list (stmtlist);
+   pop_scope ();
+ 
+   c_parser_skip_to_pragma_eol (parser);
+ 
+   t = tree_cons (type, stmt, DECL_INITIAL (mapper_decl));
+   DECL_INITIAL (mapper_decl) = t;
+ 
+   return;
+ 
+  fail:
+   c_parser_skip_to_pragma_eol (parser);
+ }
+ 
  /* OpenMP 4.0
     #pragma omp declare reduction (reduction-id : typename-list : expression) \
        initializer-clause[opt] new-line
*************** c_parser_omp_declare_reduction (c_parser
*** 27923,27930 ****
  		    location_t ploc
  		      = DECL_SOURCE_LOCATION (TREE_VEC_ELT (TREE_VALUE (t),
  							    0));
! 		    error_at (ploc, "previous %<#pragma omp declare "
! 				    "reduction%>");
  		    break;
  		  }
  	      if (t == NULL_TREE)
--- 28262,28269 ----
  		    location_t ploc
  		      = DECL_SOURCE_LOCATION (TREE_VEC_ELT (TREE_VALUE (t),
  							    0));
! 		    inform (ploc, "%<#pragma omp declare reduction%> "
! 				  "previously declared here");
  		    break;
  		  }
  	      if (t == NULL_TREE)
*************** c_parser_omp_declare (c_parser *parser,
*** 28188,28193 ****
--- 28527,28538 ----
  	  c_parser_omp_declare_reduction (parser, context);
  	  return false;
  	}
+       if (strcmp (p, "mapper") == 0)
+ 	{
+ 	  c_parser_consume_token (parser);
+ 	  c_parser_omp_declare_mapper (parser, context);
+ 	  return false;
+ 	}
        if (!flag_openmp)  /* flag_openmp_simd  */
  	{
  	  c_parser_skip_to_pragma_eol (parser, false);
*************** c_parser_omp_metadirective (c_parser *pa
*** 29097,29103 ****
  	    {
  	      error_at (match_loc, "too many %<otherwise%> or %<default%> "
  			"clauses in %<metadirective%>");
- 	      c_parser_skip_to_end_of_block_or_statement (parser, true);
  	      goto error;
  	    }
  	  default_seen = true;
--- 29442,29447 ----
*************** c_parser_omp_metadirective (c_parser *pa
*** 29106,29119 ****
  	{
  	  error_at (match_loc, "%<otherwise%> or %<default%> clause "
  		    "must appear last in %<metadirective%>");
- 	  c_parser_skip_to_end_of_block_or_statement (parser, true);
  	  goto error;
  	}
        if (!default_p && strcmp (p, "when") != 0)
  	{
  	  error_at (match_loc, "%qs is not valid for %qs",
  		    p, "metadirective");
- 	  c_parser_skip_to_end_of_block_or_statement (parser, true);
  	  goto error;
  	}
  
--- 29450,29461 ----
*************** c_parser_omp_metadirective (c_parser *pa
*** 29181,29187 ****
        if (i == 0)
  	{
  	  error_at (loc, "expected directive name");
- 	  c_parser_skip_to_end_of_block_or_statement (parser, true);
  	  goto error;
  	}
  
--- 29523,29528 ----
*************** c_parser_omp_metadirective (c_parser *pa
*** 29249,29255 ****
  	      goto add;
  	    case CPP_CLOSE_PAREN:
  	      if (nesting_depth-- == 0)
! 		break;
  	      goto add;
  	    default:
  	    add:
--- 29590,29599 ----
  	      goto add;
  	    case CPP_CLOSE_PAREN:
  	      if (nesting_depth-- == 0)
! 		{
! 		  c_parser_consume_token (parser);
! 		  break;
! 		}
  	      goto add;
  	    default:
  	    add:
*************** c_parser_omp_metadirective (c_parser *pa
*** 29261,29268 ****
  	  break;
  	}
  
-       c_parser_consume_token (parser);
- 
        if (!skip)
  	{
  	  c_token eol_token;
--- 29605,29610 ----
*************** c_parser_omp_metadirective (c_parser *pa
*** 29389,29397 ****
    return;
  
  error:
    if (parser->in_pragma)
!     c_parser_skip_to_pragma_eol (parser);
!   c_parser_skip_to_end_of_block_or_statement (parser, true);
  }
  
  /* Main entry point to parsing most OpenMP pragmas.  */
--- 29731,29739 ----
    return;
  
  error:
+   /* Skip the metadirective pragma.  Do not skip the metadirective body.  */
    if (parser->in_pragma)
!     c_parser_skip_to_pragma_eol (parser, false);
  }
  
  /* Main entry point to parsing most OpenMP pragmas.  */
diff -Nrcpad gcc-16-20250525/gcc/c/c-tree.h gcc-16-20250601/gcc/c/c-tree.h
*** gcc-16-20250525/gcc/c/c-tree.h	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/c/c-tree.h	Sun Jun  1 22:32:13 2025
*************** extern int c_type_dwarf_attribute (const
*** 765,770 ****
--- 765,771 ----
  /* in c-typeck.cc */
  extern int in_alignof;
  extern int in_sizeof;
+ extern int in_countof;
  extern int in_typeof;
  extern bool c_in_omp_for;
  extern bool c_omp_array_section_p;
*************** extern tree build_external_ref (location
*** 827,832 ****
--- 828,836 ----
  extern void pop_maybe_used (bool);
  extern struct c_expr c_expr_sizeof_expr (location_t, struct c_expr);
  extern struct c_expr c_expr_sizeof_type (location_t, struct c_type_name *);
+ extern struct c_expr c_expr_countof_expr (location_t, struct c_expr);
+ extern struct c_expr c_expr_countof_type (location_t loc,
+ 					  struct c_type_name *);
  extern struct c_expr parser_build_unary_op (location_t, enum tree_code,
      					    struct c_expr);
  extern struct c_expr parser_build_binary_op (location_t,
*************** extern tree c_finish_omp_task (location_
*** 884,889 ****
--- 888,897 ----
  extern void c_finish_omp_cancel (location_t, tree);
  extern void c_finish_omp_cancellation_point (location_t, tree);
  extern tree c_finish_omp_clauses (tree, enum c_omp_region_type);
+ extern tree c_omp_finish_mapper_clauses (tree);
+ extern tree c_omp_mapper_lookup (tree, tree);
+ extern tree c_omp_extract_mapper_directive (tree);
+ extern tree c_omp_map_array_section (location_t, tree);
  extern tree c_build_va_arg (location_t, tree, location_t, tree);
  extern tree c_finish_transaction (location_t, tree, int);
  extern bool c_tree_equal (tree, tree);
*************** extern tree c_omp_reduction_id (enum tre
*** 942,947 ****
--- 950,959 ----
  extern tree c_omp_reduction_decl (tree);
  extern tree c_omp_reduction_lookup (tree, tree);
  extern tree c_check_omp_declare_reduction_r (tree *, int *, void *);
+ extern tree c_omp_mapper_id (tree);
+ extern tree c_omp_mapper_decl (tree);
+ extern void c_omp_scan_mapper_bindings (location_t, tree *, tree);
+ extern tree c_omp_instantiate_mappers (tree);
  extern bool c_check_in_current_scope (tree);
  extern void c_pushtag (location_t, tree, tree);
  extern void c_bind (location_t, tree, bool);
diff -Nrcpad gcc-16-20250525/gcc/c/c-typeck.cc gcc-16-20250601/gcc/c/c-typeck.cc
*** gcc-16-20250525/gcc/c/c-typeck.cc	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/c/c-typeck.cc	Sun Jun  1 22:32:13 2025
*************** int in_alignof;
*** 72,77 ****
--- 72,80 ----
  /* The level of nesting inside "sizeof".  */
  int in_sizeof;
  
+ /* The level of nesting inside "countof".  */
+ int in_countof;
+ 
  /* The level of nesting inside "typeof".  */
  int in_typeof;
  
*************** composite_type_internal (tree t1, tree t
*** 773,779 ****
  	     construction, return it.  */
  
  	  for (struct composite_cache *c = cache; c != NULL; c = c->next)
! 	    if (c->t1 == t1 && c->t2 == t2)
  	       return c->composite;
  
  	  /* Otherwise, create a new type node and link it into the cache.  */
--- 776,782 ----
  	     construction, return it.  */
  
  	  for (struct composite_cache *c = cache; c != NULL; c = c->next)
! 	    if ((c->t1 == t1 && c->t2 == t2) || (c->t1 == t2 && c->t2 == t1))
  	       return c->composite;
  
  	  /* Otherwise, create a new type node and link it into the cache.  */
*************** build_external_ref (location_t loc, tree
*** 3540,3546 ****
  
    if (TREE_CODE (ref) == FUNCTION_DECL && !in_alignof)
      {
!       if (!in_sizeof && !in_typeof)
  	C_DECL_USED (ref) = 1;
        else if (DECL_INITIAL (ref) == NULL_TREE
  	       && DECL_EXTERNAL (ref)
--- 3543,3549 ----
  
    if (TREE_CODE (ref) == FUNCTION_DECL && !in_alignof)
      {
!       if (!in_sizeof && !in_typeof && !in_countof)
  	C_DECL_USED (ref) = 1;
        else if (DECL_INITIAL (ref) == NULL_TREE
  	       && DECL_EXTERNAL (ref)
*************** struct maybe_used_decl
*** 3596,3602 ****
  {
    /* The decl.  */
    tree decl;
!   /* The level seen at (in_sizeof + in_typeof).  */
    int level;
    /* The next one at this level or above, or NULL.  */
    struct maybe_used_decl *next;
--- 3599,3605 ----
  {
    /* The decl.  */
    tree decl;
!   /* The level seen at (in_sizeof + in_typeof + in_countof).  */
    int level;
    /* The next one at this level or above, or NULL.  */
    struct maybe_used_decl *next;
*************** record_maybe_used_decl (tree decl)
*** 3614,3620 ****
  {
    struct maybe_used_decl *t = XOBNEW (&parser_obstack, struct maybe_used_decl);
    t->decl = decl;
!   t->level = in_sizeof + in_typeof;
    t->next = maybe_used_decls;
    maybe_used_decls = t;
  }
--- 3617,3623 ----
  {
    struct maybe_used_decl *t = XOBNEW (&parser_obstack, struct maybe_used_decl);
    t->decl = decl;
!   t->level = in_sizeof + in_typeof + in_countof;
    t->next = maybe_used_decls;
    maybe_used_decls = t;
  }
*************** void
*** 3628,3634 ****
  pop_maybe_used (bool used)
  {
    struct maybe_used_decl *p = maybe_used_decls;
!   int cur_level = in_sizeof + in_typeof;
    while (p && p->level > cur_level)
      {
        if (used)
--- 3631,3637 ----
  pop_maybe_used (bool used)
  {
    struct maybe_used_decl *p = maybe_used_decls;
!   int cur_level = in_sizeof + in_typeof + in_countof;
    while (p && p->level > cur_level)
      {
        if (used)
*************** c_expr_sizeof_type (location_t loc, stru
*** 3738,3743 ****
--- 3741,3850 ----
    return ret;
  }
  
+ static bool
+ is_top_array_vla (tree type)
+ {
+   bool zero, var;
+   tree d;
+ 
+   if (TREE_CODE (type) != ARRAY_TYPE)
+     return false;
+   if (!COMPLETE_TYPE_P (type))
+     return false;
+ 
+   d = TYPE_DOMAIN (type);
+   zero = !TYPE_MAX_VALUE (d);
+   if (zero)
+     return false;
+ 
+   var = (TREE_CODE (TYPE_MIN_VALUE (d)) != INTEGER_CST
+ 	 || TREE_CODE (TYPE_MAX_VALUE (d)) != INTEGER_CST);
+   return var;
+ }
+ 
+ /* Return the result of countof applied to EXPR.  */
+ 
+ struct c_expr
+ c_expr_countof_expr (location_t loc, struct c_expr expr)
+ {
+   struct c_expr ret;
+   if (expr.value == error_mark_node)
+     {
+       ret.value = error_mark_node;
+       ret.original_code = ERROR_MARK;
+       ret.original_type = NULL;
+       ret.m_decimal = 0;
+       pop_maybe_used (false);
+     }
+   else
+     {
+       bool expr_const_operands = true;
+ 
+       tree folded_expr = c_fully_fold (expr.value, require_constant_value,
+ 				       &expr_const_operands);
+       ret.value = c_countof_type (loc, TREE_TYPE (folded_expr));
+       c_last_sizeof_arg = expr.value;
+       c_last_sizeof_loc = loc;
+       ret.original_code = COUNTOF_EXPR;
+       ret.original_type = NULL;
+       ret.m_decimal = 0;
+       if (is_top_array_vla (TREE_TYPE (folded_expr)))
+ 	{
+ 	  /* countof is evaluated when given a vla.  */
+ 	  ret.value = build2 (C_MAYBE_CONST_EXPR, TREE_TYPE (ret.value),
+ 			      folded_expr, ret.value);
+ 	  C_MAYBE_CONST_EXPR_NON_CONST (ret.value) = !expr_const_operands;
+ 	  SET_EXPR_LOCATION (ret.value, loc);
+ 	}
+       pop_maybe_used (is_top_array_vla (TREE_TYPE (folded_expr)));
+     }
+   return ret;
+ }
+ 
+ /* Return the result of countof applied to T, a structure for the type
+    name passed to countof (rather than the type itself).  LOC is the
+    location of the original expression.  */
+ 
+ struct c_expr
+ c_expr_countof_type (location_t loc, struct c_type_name *t)
+ {
+   tree type;
+   struct c_expr ret;
+   tree type_expr = NULL_TREE;
+   bool type_expr_const = true;
+   type = groktypename (t, &type_expr, &type_expr_const);
+   ret.value = c_countof_type (loc, type);
+   c_last_sizeof_arg = type;
+   c_last_sizeof_loc = loc;
+   ret.original_code = COUNTOF_EXPR;
+   ret.original_type = NULL;
+   ret.m_decimal = 0;
+   if (type == error_mark_node)
+     {
+       ret.value = error_mark_node;
+       ret.original_code = ERROR_MARK;
+     }
+   else
+   if ((type_expr || TREE_CODE (ret.value) == INTEGER_CST)
+       && is_top_array_vla (type))
+     {
+       /* If the type is a [*] array, it is a VLA but is represented as
+ 	 having a size of zero.  In such a case we must ensure that
+ 	 the result of countof does not get folded to a constant by
+ 	 c_fully_fold, because if the number of elements is evaluated
+ 	 the result is not constant and so
+ 	 constraints on zero or negative size arrays must not be applied
+ 	 when this countof call is inside another array declarator.  */
+       if (!type_expr)
+ 	type_expr = integer_zero_node;
+       ret.value = build2 (C_MAYBE_CONST_EXPR, TREE_TYPE (ret.value),
+ 			  type_expr, ret.value);
+       C_MAYBE_CONST_EXPR_NON_CONST (ret.value) = !type_expr_const;
+     }
+   pop_maybe_used (type != error_mark_node ? is_top_array_vla (type) : false);
+   return ret;
+ }
+ 
  /* Build a function call to function FUNCTION with parameters PARAMS.
     The function call is at LOC.
     PARAMS is a list--a chain of TREE_LIST nodes--in which the
*************** c_finish_omp_clauses (tree clauses, enum
*** 16840,16845 ****
--- 16947,16958 ----
  	case OMP_CLAUSE_MAP:
  	  if (OMP_CLAUSE_MAP_IMPLICIT (c) && !implicit_moved)
  	    goto move_implicit;
+ 	  if (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_PUSH_MAPPER_NAME
+ 	      || OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_POP_MAPPER_NAME)
+ 	    {
+ 	      remove = true;
+ 	      break;
+ 	    }
  	  /* FALLTHRU */
  	case OMP_CLAUSE_TO:
  	case OMP_CLAUSE_FROM:
*************** c_finish_omp_clauses (tree clauses, enum
*** 17780,17785 ****
--- 17893,17907 ----
    return clauses;
  }
  
+ /* Do processing necessary to make CLAUSES well-formed, where CLAUSES result
+    from implicit instantiation of user-defined mappers (in gimplify.cc).  */
+ 
+ tree
+ c_omp_finish_mapper_clauses (tree clauses)
+ {
+   return c_finish_omp_clauses (clauses, C_ORT_OMP);
+ }
+ 
  /* Return code to initialize DST with a copy constructor from SRC.
     C doesn't have copy constructors nor assignment operators, only for
     _Atomic vars we need to perform __atomic_load from src into a temporary
diff -Nrcpad gcc-16-20250525/gcc/c-family/ChangeLog gcc-16-20250601/gcc/c-family/ChangeLog
*** gcc-16-20250525/gcc/c-family/ChangeLog	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/c-family/ChangeLog	Sun Jun  1 22:32:13 2025
***************
*** 1,3 ****
--- 1,25 ----
+ 2025-05-30  Julian Brown  <julian@codesourcery.com>
+ 	    Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* c-common.h (c_omp_region_type): Add C_ORT_DECLARE_MAPPER and
+ 	C_ORT_OMP_DECLARE_MAPPER codes.
+ 	(omp_mapper_list): Add forward declaration.
+ 	(c_omp_find_nested_mappers, c_omp_instantiate_mappers): Add prototypes.
+ 	* c-omp.cc (c_omp_find_nested_mappers): New function.
+ 	(remap_mapper_decl_info): New struct.
+ 	(remap_mapper_decl_1, omp_instantiate_mapper,
+ 	c_omp_instantiate_mappers): New functions.
+ 
+ 2025-05-27  Alejandro Colomar  <alx@kernel.org>
+ 	    Martin Uecker  <uecker@tugraz.at>
+ 
+ 	PR c/117025
+ 	* c-common.h (enum rid): Add RID_COUNTOF.
+ 	(c_countof_type): New function prototype.
+ 	* c-common.def (COUNTOF_EXPR): New tree.
+ 	* c-common.cc (c_common_reswords): Add RID_COUNTOF entry.
+ 	(c_countof_type): New function.
+ 
  2025-05-23  Jason Merrill  <jason@redhat.com>
  
  	* c-format.cc (flag_chars_t::validate): Control quoting warnings
diff -Nrcpad gcc-16-20250525/gcc/c-family/c-common.cc gcc-16-20250601/gcc/c-family/c-common.cc
*** gcc-16-20250525/gcc/c-family/c-common.cc	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/c-family/c-common.cc	Sun Jun  1 22:32:13 2025
*************** const struct c_common_resword c_common_r
*** 394,399 ****
--- 394,400 ----
  {
    { "_Alignas",		RID_ALIGNAS,   D_CONLY },
    { "_Alignof",		RID_ALIGNOF,   D_CONLY },
+   { "_Countof",		RID_COUNTOF,   D_CONLY },
    { "_Atomic",		RID_ATOMIC,    D_CONLY },
    { "_BitInt",		RID_BITINT,    D_CONLY },
    { "_Bool",		RID_BOOL,      D_CONLY },
*************** c_alignof_expr (location_t loc, tree exp
*** 4080,4085 ****
--- 4081,4111 ----
  
    return fold_convert_loc (loc, size_type_node, t);
  }
+ 
+ /* Implement the _Countof keyword:
+    Return the number of elements of an array.  */
+ 
+ tree
+ c_countof_type (location_t loc, tree type)
+ {
+   enum tree_code type_code;
+ 
+   type_code = TREE_CODE (type);
+   if (type_code != ARRAY_TYPE)
+     {
+       error_at (loc, "invalid application of %<_Countof%> to type %qT", type);
+       return error_mark_node;
+     }
+   if (!COMPLETE_TYPE_P (type))
+     {
+       error_at (loc,
+ 		"invalid application of %<_Countof%> to incomplete type %qT",
+ 		type);
+       return error_mark_node;
+     }
+ 
+   return array_type_nelts_top (type);
+ }
  
  /* Handle C and C++ default attributes.  */
  
diff -Nrcpad gcc-16-20250525/gcc/c-family/c-common.def gcc-16-20250601/gcc/c-family/c-common.def
*** gcc-16-20250525/gcc/c-family/c-common.def	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/c-family/c-common.def	Sun Jun  1 22:32:13 2025
*************** DEFTREECODE (EXCESS_PRECISION_EXPR, "exc
*** 50,55 ****
--- 50,58 ----
     number.  */
  DEFTREECODE (USERDEF_LITERAL, "userdef_literal", tcc_exceptional, 3)
  
+ /* Represents a 'countof' expression.  */
+ DEFTREECODE (COUNTOF_EXPR, "countof_expr", tcc_expression, 1)
+ 
  /* Represents a 'sizeof' expression during C++ template expansion,
     or for the purpose of -Wsizeof-pointer-memaccess warning.  */
  DEFTREECODE (SIZEOF_EXPR, "sizeof_expr", tcc_expression, 1)
diff -Nrcpad gcc-16-20250525/gcc/c-family/c-common.h gcc-16-20250601/gcc/c-family/c-common.h
*** gcc-16-20250525/gcc/c-family/c-common.h	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/c-family/c-common.h	Sun Jun  1 22:32:13 2025
*************** enum rid
*** 105,110 ****
--- 105,111 ----
  
    /* C extensions */
    RID_ASM,       RID_TYPEOF,   RID_TYPEOF_UNQUAL, RID_ALIGNOF,  RID_ATTRIBUTE,
+   RID_COUNTOF,
    RID_C23_VA_START, RID_VA_ARG,
    RID_EXTENSION, RID_IMAGPART, RID_REALPART, RID_LABEL,    RID_CHOOSE_EXPR,
    RID_TYPES_COMPATIBLE_P,      RID_BUILTIN_COMPLEX,	   RID_BUILTIN_SHUFFLE,
*************** extern tree c_common_truthvalue_conversi
*** 890,895 ****
--- 891,897 ----
  extern void c_apply_type_quals_to_decl (int, tree);
  extern tree c_sizeof_or_alignof_type (location_t, tree, bool, bool, int);
  extern tree c_alignof_expr (location_t, tree);
+ extern tree c_countof_type (location_t, tree);
  /* Print an error message for invalid operands to arith operation CODE.
     NOP_EXPR is used as a special case (see truthvalue_conversion).  */
  extern void binary_op_error (rich_location *, enum tree_code, tree, tree);
*************** enum c_omp_region_type
*** 1301,1310 ****
--- 1303,1314 ----
    C_ORT_TARGET			= 1 << 3,
    C_ORT_EXIT_DATA		= 1 << 4,
    C_ORT_INTEROP			= 1 << 5,
+   C_ORT_DECLARE_MAPPER		= 1 << 6,
    C_ORT_OMP_DECLARE_SIMD	= C_ORT_OMP | C_ORT_DECLARE_SIMD,
    C_ORT_OMP_TARGET		= C_ORT_OMP | C_ORT_TARGET,
    C_ORT_OMP_EXIT_DATA		= C_ORT_OMP | C_ORT_EXIT_DATA,
    C_ORT_OMP_INTEROP		= C_ORT_OMP | C_ORT_INTEROP,
+   C_ORT_OMP_DECLARE_MAPPER	= C_ORT_OMP | C_ORT_DECLARE_MAPPER,
    C_ORT_ACC_TARGET		= C_ORT_ACC | C_ORT_TARGET
  };
  
*************** extern enum omp_clause_defaultmap_kind c
*** 1343,1348 ****
--- 1347,1355 ----
  extern tree c_omp_check_context_selector (location_t, tree);
  extern void c_omp_mark_declare_variant (location_t, tree, tree);
  extern void c_omp_adjust_map_clauses (tree, bool);
+ template<typename T> struct omp_mapper_list;
+ extern void c_omp_find_nested_mappers (struct omp_mapper_list<tree> *, tree);
+ extern tree c_omp_instantiate_mappers (tree);
  
  namespace omp_addr_tokenizer { struct omp_addr_token; }
  typedef omp_addr_tokenizer::omp_addr_token omp_addr_token;
diff -Nrcpad gcc-16-20250525/gcc/c-family/c-omp.cc gcc-16-20250601/gcc/c-family/c-omp.cc
*** gcc-16-20250525/gcc/c-family/c-omp.cc	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/c-family/c-omp.cc	Sun Jun  1 22:32:13 2025
*************** c_omp_address_inspector::expand_map_clau
*** 4282,4287 ****
--- 4282,4587 ----
    return error_mark_node;
  }
  
+ /* Given a mapper function MAPPER_FN, recursively scan through the map clauses
+    for that mapper, and if any of those should use a (named or unnamed) mapper
+    themselves, add it to MLIST.  */
+ 
+ void
+ c_omp_find_nested_mappers (omp_mapper_list<tree> *mlist, tree mapper_fn)
+ {
+   tree mapper = lang_hooks.decls.omp_extract_mapper_directive (mapper_fn);
+   tree mapper_name = NULL_TREE;
+ 
+   if (mapper == error_mark_node)
+     return;
+ 
+   gcc_assert (TREE_CODE (mapper) == OMP_DECLARE_MAPPER);
+ 
+   for (tree clause = OMP_DECLARE_MAPPER_CLAUSES (mapper);
+        clause;
+        clause = OMP_CLAUSE_CHAIN (clause))
+     {
+       tree expr = OMP_CLAUSE_DECL (clause);
+       enum gomp_map_kind clause_kind = OMP_CLAUSE_MAP_KIND (clause);
+       tree elem_type;
+ 
+       if (clause_kind == GOMP_MAP_PUSH_MAPPER_NAME)
+ 	{
+ 	  mapper_name = expr;
+ 	  continue;
+ 	}
+       else if (clause_kind == GOMP_MAP_POP_MAPPER_NAME)
+ 	{
+ 	  mapper_name = NULL_TREE;
+ 	  continue;
+ 	}
+ 
+       gcc_assert (TREE_CODE (expr) != TREE_LIST);
+       if (TREE_CODE (expr) == OMP_ARRAY_SECTION)
+ 	{
+ 	  while (TREE_CODE (expr) == OMP_ARRAY_SECTION)
+ 	    expr = TREE_OPERAND (expr, 0);
+ 
+ 	  elem_type = TREE_TYPE (expr);
+ 	}
+       else
+ 	elem_type = TREE_TYPE (expr);
+ 
+       /* This might be too much... or not enough?  */
+       while (TREE_CODE (elem_type) == ARRAY_TYPE
+ 	     || TREE_CODE (elem_type) == POINTER_TYPE
+ 	     || TREE_CODE (elem_type) == REFERENCE_TYPE)
+ 	elem_type = TREE_TYPE (elem_type);
+ 
+       elem_type = TYPE_MAIN_VARIANT (elem_type);
+ 
+       if (RECORD_OR_UNION_TYPE_P (elem_type)
+ 	  && !mlist->contains (mapper_name, elem_type))
+ 	{
+ 	  tree nested_mapper_fn
+ 	    = lang_hooks.decls.omp_mapper_lookup (mapper_name, elem_type);
+ 
+ 	  if (nested_mapper_fn)
+ 	    {
+ 	      mlist->add_mapper (mapper_name, elem_type, nested_mapper_fn);
+ 	      c_omp_find_nested_mappers (mlist, nested_mapper_fn);
+ 	    }
+ 	  else if (mapper_name)
+ 	    {
+ 	      error ("mapper %qE not found for type %qT", mapper_name,
+ 		     elem_type);
+ 	      continue;
+ 	    }
+ 	}
+     }
+ }
+ 
+ struct remap_mapper_decl_info
+ {
+   tree dummy_var;
+   tree expr;
+ };
+ 
+ /* Helper for rewriting DUMMY_VAR into EXPR in a map clause decl.  */
+ 
+ static tree
+ remap_mapper_decl_1 (tree *tp, int *walk_subtrees, void *data)
+ {
+   remap_mapper_decl_info *map_info = (remap_mapper_decl_info *) data;
+ 
+   if (operand_equal_p (*tp, map_info->dummy_var))
+     {
+       *tp = map_info->expr;
+       *walk_subtrees = 0;
+     }
+ 
+   return NULL_TREE;
+ }
+ 
+ /* Instantiate a mapper MAPPER for expression EXPR, adding new clauses to
+    OUTLIST.  OUTER_KIND is the mapping kind to use if not already specified in
+    the mapper declaration.  */
+ 
+ static tree *
+ omp_instantiate_mapper (tree *outlist, tree mapper, tree expr,
+ 			enum gomp_map_kind outer_kind)
+ {
+   tree clauses = OMP_DECLARE_MAPPER_CLAUSES (mapper);
+   tree dummy_var = OMP_DECLARE_MAPPER_DECL (mapper);
+   tree mapper_name = NULL_TREE;
+ 
+   remap_mapper_decl_info map_info;
+   map_info.dummy_var = dummy_var;
+   map_info.expr = expr;
+ 
+   for (tree c = clauses; c; c = OMP_CLAUSE_CHAIN (c))
+     {
+       tree unshared = unshare_expr (c);
+       enum gomp_map_kind clause_kind = OMP_CLAUSE_MAP_KIND (c);
+       tree t = OMP_CLAUSE_DECL (unshared);
+       tree type = NULL_TREE;
+       bool nonunit_array_with_mapper = false;
+ 
+       if (clause_kind == GOMP_MAP_PUSH_MAPPER_NAME)
+ 	{
+ 	  mapper_name = t;
+ 	  continue;
+ 	}
+       else if (clause_kind == GOMP_MAP_POP_MAPPER_NAME)
+ 	{
+ 	  mapper_name = NULL_TREE;
+ 	  continue;
+ 	}
+ 
+       if (TREE_CODE (t) == OMP_ARRAY_SECTION)
+ 	{
+ 	  location_t loc = OMP_CLAUSE_LOCATION (c);
+ 	  tree t2 = lang_hooks.decls.omp_map_array_section (loc, t);
+ 
+ 	  if (t2 == t)
+ 	    {
+ 	      nonunit_array_with_mapper = true;
+ 	      /* We'd want use the mapper for the element type if this worked:
+ 		 look that one up.  */
+ 	      type = TREE_TYPE (TREE_TYPE (t));
+ 	    }
+ 	  else
+ 	    {
+ 	      t = t2;
+ 	      type = TREE_TYPE (t);
+ 	    }
+ 	}
+       else
+ 	type = TREE_TYPE (t);
+ 
+       gcc_assert (type);
+ 
+       if (type == error_mark_node)
+ 	continue;
+ 
+       walk_tree (&unshared, remap_mapper_decl_1, &map_info, NULL);
+ 
+       if (OMP_CLAUSE_MAP_KIND (unshared) == GOMP_MAP_UNSET)
+ 	OMP_CLAUSE_SET_MAP_KIND (unshared, outer_kind);
+ 
+       type = TYPE_MAIN_VARIANT (type);
+ 
+       tree mapper_fn = lang_hooks.decls.omp_mapper_lookup (mapper_name, type);
+ 
+       if (mapper_fn && nonunit_array_with_mapper)
+ 	{
+ 	  sorry ("user-defined mapper with non-unit length array section");
+ 	  continue;
+ 	}
+       else if (mapper_fn)
+ 	{
+ 	  tree nested_mapper
+ 	    = lang_hooks.decls.omp_extract_mapper_directive (mapper_fn);
+ 	  if (nested_mapper != mapper)
+ 	    {
+ 	      if (clause_kind == GOMP_MAP_UNSET)
+ 		clause_kind = outer_kind;
+ 
+ 	      outlist = omp_instantiate_mapper (outlist, nested_mapper,
+ 						t, clause_kind);
+ 	      continue;
+ 	    }
+ 	}
+       else if (mapper_name)
+ 	{
+ 	  error ("mapper %qE not found for type %qT", mapper_name, type);
+ 	  continue;
+ 	}
+ 
+       *outlist = unshared;
+       outlist = &OMP_CLAUSE_CHAIN (unshared);
+     }
+ 
+   return outlist;
+ }
+ 
+ /* Given a list of CLAUSES, scan each clause and invoke a user-defined mapper
+    appropriate to the type of the data in that clause, if such a mapper is
+    visible in the current parsing context.  */
+ 
+ tree
+ c_omp_instantiate_mappers (tree clauses)
+ {
+   tree c, *pc, mapper_name = NULL_TREE;
+ 
+   for (pc = &clauses, c = clauses; c; c = *pc)
+     {
+       bool using_mapper = false;
+ 
+       switch (OMP_CLAUSE_CODE (c))
+ 	{
+ 	case OMP_CLAUSE_MAP:
+ 	  {
+ 	    tree t = OMP_CLAUSE_DECL (c);
+ 	    tree type = NULL_TREE;
+ 	    bool nonunit_array_with_mapper = false;
+ 
+ 	    if (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_PUSH_MAPPER_NAME
+ 		|| OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_POP_MAPPER_NAME)
+ 	      {
+ 		if (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_PUSH_MAPPER_NAME)
+ 		  mapper_name = OMP_CLAUSE_DECL (c);
+ 		else
+ 		  mapper_name = NULL_TREE;
+ 		pc = &OMP_CLAUSE_CHAIN (c);
+ 		continue;
+ 	      }
+ 
+ 	    if (TREE_CODE (t) == OMP_ARRAY_SECTION)
+ 	      {
+ 		location_t loc = OMP_CLAUSE_LOCATION (c);
+ 		tree t2 = lang_hooks.decls.omp_map_array_section (loc, t);
+ 
+ 		if (t2 == t)
+ 		  {
+ 		    /* !!! Array sections of size >1 with mappers for elements
+ 		       are hard to support.  Do something here.  */
+ 		    nonunit_array_with_mapper = true;
+ 		    type = TREE_TYPE (TREE_TYPE (t));
+ 		  }
+ 		else
+ 		  {
+ 		    t = t2;
+ 		    type = TREE_TYPE (t);
+ 		  }
+ 	      }
+ 	    else
+ 	      type = TREE_TYPE (t);
+ 
+ 	    if (type == NULL_TREE || type == error_mark_node)
+ 	      {
+ 		pc = &OMP_CLAUSE_CHAIN (c);
+ 		continue;
+ 	      }
+ 
+ 	    enum gomp_map_kind kind = OMP_CLAUSE_MAP_KIND (c);
+ 	    if (kind == GOMP_MAP_UNSET)
+ 	      kind = GOMP_MAP_TOFROM;
+ 
+ 	    type = TYPE_MAIN_VARIANT (type);
+ 
+ 	    tree mapper_fn
+ 	      = lang_hooks.decls.omp_mapper_lookup (mapper_name, type);
+ 
+ 	    if (mapper_fn && nonunit_array_with_mapper)
+ 	      {
+ 		sorry ("user-defined mapper with non-unit length "
+ 		       "array section");
+ 		using_mapper = true;
+ 	      }
+ 	    else if (mapper_fn)
+ 	      {
+ 		tree mapper
+ 		  = lang_hooks.decls.omp_extract_mapper_directive (mapper_fn);
+ 		pc = omp_instantiate_mapper (pc, mapper, t, kind);
+ 		using_mapper = true;
+ 	      }
+ 	    else if (mapper_name)
+ 	      {
+ 		error ("mapper %qE not found for type %qT", mapper_name, type);
+ 		using_mapper = true;
+ 	      }
+ 	  }
+ 	  break;
+ 
+ 	default:
+ 	  ;
+ 	}
+ 
+       if (using_mapper)
+ 	*pc = OMP_CLAUSE_CHAIN (c);
+       else
+ 	pc = &OMP_CLAUSE_CHAIN (c);
+     }
+ 
+   return clauses;
+ }
+ 
  const struct c_omp_directive c_omp_directives[] = {
    /* Keep this alphabetically sorted by the first word.  Non-null second/third
       if any should precede null ones.  */
diff -Nrcpad gcc-16-20250525/gcc/cgraph.cc gcc-16-20250601/gcc/cgraph.cc
*** gcc-16-20250525/gcc/cgraph.cc	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/cgraph.cc	Sun Jun  1 22:32:13 2025
*************** cgraph_edge::maybe_hot_p (sreal scale)
*** 3019,3025 ****
  
    /* Use IPA count and if it s not available appy local heuristics.  */
    if (c.initialized_p ())
!     return maybe_hot_count_p (NULL, c * scale);
    if (!count.initialized_p ())
      return true;
    cgraph_node *where = caller->inlined_to ? caller->inlined_to : caller;
--- 3019,3032 ----
  
    /* Use IPA count and if it s not available appy local heuristics.  */
    if (c.initialized_p ())
!     {
!       /* A special case; AFDO zero means that function may quite possibly
! 	 be executed few times per execution.  If scale is large, we still
! 	 want to consider the call hot.  */
!       if (c.quality () == AFDO)
! 	c = c.force_nonzero ();
!       return maybe_hot_count_p (NULL, c * scale);
!     }
    if (!count.initialized_p ())
      return true;
    cgraph_node *where = caller->inlined_to ? caller->inlined_to : caller;
diff -Nrcpad gcc-16-20250525/gcc/cobol/gengen.cc gcc-16-20250601/gcc/cobol/gengen.cc
*** gcc-16-20250525/gcc/cobol/gengen.cc	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/cobol/gengen.cc	Sun Jun  1 22:32:13 2025
*************** gg_printf(const char *format_string, ...
*** 2152,2169 ****
    int nargs = 0;
    tree args[ARG_LIMIT];
  
-   // Because this routine is intended for debugging, we are sending the
-   // text to STDERR
- 
-   // Because we don't actually use stderr ourselves, we just pick it up as a
-   // VOID_P and pass it along to fprintf()
-   tree t_stderr = gg_declare_variable(VOID_P, "stderr",
-                                       NULL_TREE,
-                                       vs_external_reference);
- 
-   gg_push_context();
- 
-   args[nargs++] = t_stderr;
    args[nargs++] = build_string_literal(strlen(format_string)+1, format_string);
  
    va_list ap;
--- 2152,2157 ----
*************** gg_printf(const char *format_string, ...
*** 2197,2203 ****
    static tree function = NULL_TREE;
    if( !function )
      {
!     function = gg_get_function_address(INT, "fprintf");
      }
  
    tree stmt = build_call_array_loc (location_from_lineno(),
--- 2185,2191 ----
    static tree function = NULL_TREE;
    if( !function )
      {
!     function = gg_get_function_address(INT, "__gg__fprintf_stderr");
      }
  
    tree stmt = build_call_array_loc (location_from_lineno(),
*************** gg_printf(const char *format_string, ...
*** 2206,2213 ****
                                      nargs,
                                      args);
    gg_append_statement(stmt);
- 
-   gg_pop_context();
    }
  
  tree
--- 2194,2199 ----
diff -Nrcpad gcc-16-20250525/gcc/config/aarch64/aarch64-cores.def gcc-16-20250601/gcc/config/aarch64/aarch64-cores.def
*** gcc-16-20250525/gcc/config/aarch64/aarch64-cores.def	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/config/aarch64/aarch64-cores.def	Sun Jun  1 22:32:14 2025
*************** AARCH64_CORE("octeontx2f95mm", octeontx2
*** 132,138 ****
  
  /* Fujitsu ('F') cores. */
  AARCH64_CORE("a64fx", a64fx, a64fx, V8_2A,  (F16, SVE), a64fx, 0x46, 0x001, -1)
! AARCH64_CORE("fujitsu-monaka", fujitsu_monaka, cortexa57, V9_3A, (F16, FP8, LS64, RNG, CRYPTO, SVE2_AES, SVE2_BITPERM, SVE2_SHA3, SVE2_SM4), fujitsu_monaka, 0x46, 0x003, -1)
  
  /* HiSilicon ('H') cores. */
  AARCH64_CORE("tsv110",  tsv110, tsv110, V8_2A,  (CRYPTO, F16), tsv110,   0x48, 0xd01, -1)
--- 132,138 ----
  
  /* Fujitsu ('F') cores. */
  AARCH64_CORE("a64fx", a64fx, a64fx, V8_2A,  (F16, SVE), a64fx, 0x46, 0x001, -1)
! AARCH64_CORE("fujitsu-monaka", fujitsu_monaka, cortexa57, V9_3A, (F16, FAMINMAX, FP8FMA, FP8DOT2, FP8DOT4, LS64, LUT, RNG, CRYPTO, SVE2_AES, SVE2_BITPERM, SVE2_SHA3, SVE2_SM4), fujitsu_monaka, 0x46, 0x003, -1)
  
  /* HiSilicon ('H') cores. */
  AARCH64_CORE("tsv110",  tsv110, tsv110, V8_2A,  (CRYPTO, F16), tsv110,   0x48, 0xd01, -1)
diff -Nrcpad gcc-16-20250525/gcc/config/aarch64/gcc-auto-profile gcc-16-20250601/gcc/config/aarch64/gcc-auto-profile
*** gcc-16-20250525/gcc/config/aarch64/gcc-auto-profile	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/config/aarch64/gcc-auto-profile	Sun Jun  1 22:32:14 2025
***************
*** 0 ****
--- 1,53 ----
+ #!/bin/sh
+ # Profile workload for gcc profile feedback (autofdo) using Linux perf.
+ # Copyright The GNU Toolchain Authors.
+ #
+ # This file is part of GCC.
+ #
+ # GCC is free software; you can redistribute it and/or modify it under
+ # the terms of the GNU General Public License as published by the Free
+ # Software Foundation; either version 3, or (at your option) any later
+ # version.
+ 
+ # GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ # for more details.
+ 
+ # You should have received a copy of the GNU General Public License
+ # along with GCC; see the file COPYING3.  If not see
+ # <http://www.gnu.org/licenses/>.  */
+ 
+ # Run perf record with branch stack sampling and check for
+ # specific error message to see if it is supported.
+ use_brbe=true
+ output=$(perf record -j any,u /bin/true 2>&1)
+ case "$output" in
+   *"PMU Hardware or event type doesn't support branch stack sampling."*)
+     use_brbe=false;;
+   *)
+     use_brbe=true;;
+ esac
+ 
+ FLAGS=u
+ if [ "$1" = "--kernel" ] ; then
+   FLAGS=k
+   shift
+ elif [ "$1" = "--all" ] ; then
+   FLAGS=u,k
+   shift
+ fi
+ 
+ if [ "$use_brbe" = true ] ; then
+   if grep -q hypervisor /proc/cpuinfo ; then
+     echo >&2 "Warning: branch profiling may not be functional in VMs"
+   fi
+   set -x
+   perf record -j any,$FLAGS "$@"
+   set +x
+ else
+   echo >&2 "Warning: branch profiling may not be functional without BRBE"
+   set -x
+   perf record "$@"
+   set +x
+ fi
diff -Nrcpad gcc-16-20250525/gcc/config/i386/gcc-auto-profile gcc-16-20250601/gcc/config/i386/gcc-auto-profile
*** gcc-16-20250525/gcc/config/i386/gcc-auto-profile	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/config/i386/gcc-auto-profile	Sun Jun  1 22:32:14 2025
*************** if [ "$1" = "--all" ] ; then
*** 24,31 ****
    shift
  fi
  
! if ! grep -q Intel /proc/cpuinfo ; then
!   echo >&2 "Only Intel CPUs supported"
    exit 1
  fi
  
--- 24,39 ----
    shift
  fi
  
! if grep -q AuthenticAMD /proc/cpuinfo ; then
!   vendor=AMD
!   if ! grep -q " brs" /proc/cpuinfo && ! grep -q amd_lbr_v2 /proc/cpuinfo ; then
!     echo >&2 "AMD CPU with brs (Zen 3) or amd_lbr_v2 (Zen 4+) feature is required"
!     exit 1
!   fi
! elif grep -q Intel /proc/cpuinfo ; then
!   vendor=Intel
! else
!   echo >&2 "Only AMD and Intel CPUs supported"
    exit 1
  fi
  
*************** if grep -q hypervisor /proc/cpuinfo ; th
*** 33,39 ****
    echo >&2 "Warning: branch profiling may not be functional in VMs"
  fi
  
! case `grep -E -q "^cpu family\s*: 6" /proc/cpuinfo &&
    grep -E "^model\s*:" /proc/cpuinfo | head -n1` in
  model*:\ 46|\
  model*:\ 30|\
--- 41,47 ----
    echo >&2 "Warning: branch profiling may not be functional in VMs"
  fi
  
! case `test $vendor = Intel && grep -E -q "^cpu family\s*: 6" /proc/cpuinfo &&
    grep -E "^model\s*:" /proc/cpuinfo | head -n1` in
  model*:\ 46|\
  model*:\ 30|\
*************** model*:\ 126|\
*** 82,87 ****
--- 90,97 ----
  model*:\ 167|\
  model*:\ 140|\
  model*:\ 141|\
+ model*:\ 143|\
+ model*:\ 207|\
  model*:\ 106|\
  model*:\ 108|\
  model*:\ 173|\
*************** model*:\ 174) E="cpu/event=0xc4,umask=0x
*** 89,103 ****
  model*:\ 134|\
  model*:\ 150|\
  model*:\ 156) E="cpu/event=0xc4,umask=0xfe/p$FLAGS" ;;
! model*:\ 143|\
! model*:\ 207) E="cpu/event=0xc4,umask=0x20/p$FLAGS" ;;
! model*:\ 190) E="cpu/event=0xc4,umask=0xc0/$FLAGS" ;;
  model*:\ 190) E="cpu/event=0xc4,umask=0xfe/$FLAGS" ;;
  *)
          if perf list br_inst_retired | grep -q br_inst_retired.near_taken ; then
              E=br_inst_retired.near_taken:p
          else
! echo >&2 "Unknown CPU. Run contrib/gen_autofdo_event.py --all --script to update script."
  	  exit 1
          fi ;;
  esac
--- 99,118 ----
  model*:\ 134|\
  model*:\ 150|\
  model*:\ 156) E="cpu/event=0xc4,umask=0xfe/p$FLAGS" ;;
! model*:\ 190|\
! model*:\ 175|\
! model*:\ 182) E="cpu/event=0xc4,umask=0xc0/$FLAGS" ;;
  model*:\ 190) E="cpu/event=0xc4,umask=0xfe/$FLAGS" ;;
  *)
          if perf list br_inst_retired | grep -q br_inst_retired.near_taken ; then
              E=br_inst_retired.near_taken:p
+         elif perf list ex_ret_brn_tkn | grep -q ex_ret_brn_tkn ; then
+             E=ex_ret_brn_tkn:P$FLAGS
+         elif $vendor = Intel ; then
+ echo >&2 "Unknown Intel CPU. Run contrib/gen_autofdo_event.py --all --script to update script."
+ 	  exit 1
          else
! echo >&2 "AMD CPU without support for ex_ret_brn_tkn event"
  	  exit 1
          fi ;;
  esac
diff -Nrcpad gcc-16-20250525/gcc/config/i386/i386-expand.cc gcc-16-20250601/gcc/config/i386/i386-expand.cc
*** gcc-16-20250525/gcc/config/i386/i386-expand.cc	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/config/i386/i386-expand.cc	Sun Jun  1 22:32:14 2025
*************** emit_reduc_half (rtx dest, rtx src, int
*** 18724,18729 ****
--- 18724,18756 ----
      case E_V8HFmode:
      case E_V4SImode:
      case E_V2DImode:
+       if (TARGET_SSE_REDUCTION_PREFER_PSHUF)
+ 	{
+ 	  if (i == 128)
+ 	    {
+ 	      d = gen_reg_rtx (V4SImode);
+ 	      tem = gen_sse2_pshufd_1 (
+ 		  d, force_reg (V4SImode, gen_lowpart (V4SImode, src)),
+ 		  GEN_INT (2), GEN_INT (3), GEN_INT (2), GEN_INT (3));
+ 	      break;
+ 	    }
+ 	  else if (i == 64)
+ 	    {
+ 	      d = gen_reg_rtx (V4SImode);
+ 	      tem = gen_sse2_pshufd_1 (
+ 		  d, force_reg (V4SImode, gen_lowpart (V4SImode, src)),
+ 		  GEN_INT (1), GEN_INT (1), GEN_INT (1), GEN_INT (1));
+ 	      break;
+ 	    }
+ 	  else if (i == 32)
+ 	    {
+ 	      d = gen_reg_rtx (V8HImode);
+ 	      tem = gen_sse2_pshuflw_1 (
+ 		  d, force_reg (V8HImode, gen_lowpart (V8HImode, src)),
+ 		  GEN_INT (1), GEN_INT (1), GEN_INT (1), GEN_INT (1));
+ 	      break;
+ 	    }
+ 	}
        d = gen_reg_rtx (V1TImode);
        tem = gen_sse2_lshrv1ti3 (d, gen_lowpart (V1TImode, src),
  				GEN_INT (i / 2));
diff -Nrcpad gcc-16-20250525/gcc/config/i386/i386.h gcc-16-20250601/gcc/config/i386/i386.h
*** gcc-16-20250525/gcc/config/i386/i386.h	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/config/i386/i386.h	Sun Jun  1 22:32:14 2025
*************** extern unsigned char ix86_tune_features[
*** 490,496 ****
  #define TARGET_SSE_MOVCC_USE_BLENDV \
  	ix86_tune_features[X86_TUNE_SSE_MOVCC_USE_BLENDV]
  #define TARGET_ALIGN_TIGHT_LOOPS \
! 	 ix86_tune_features[X86_TUNE_ALIGN_TIGHT_LOOPS]
  
  
  /* Feature tests against the various architecture variations.  */
--- 490,498 ----
  #define TARGET_SSE_MOVCC_USE_BLENDV \
  	ix86_tune_features[X86_TUNE_SSE_MOVCC_USE_BLENDV]
  #define TARGET_ALIGN_TIGHT_LOOPS \
! 	ix86_tune_features[X86_TUNE_ALIGN_TIGHT_LOOPS]
! #define TARGET_SSE_REDUCTION_PREFER_PSHUF \
! 	ix86_tune_features[X86_TUNE_SSE_REDUCTION_PREFER_PSHUF]
  
  
  /* Feature tests against the various architecture variations.  */
diff -Nrcpad gcc-16-20250525/gcc/config/i386/x86-tune-costs.h gcc-16-20250601/gcc/config/i386/x86-tune-costs.h
*** gcc-16-20250525/gcc/config/i386/x86-tune-costs.h	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/config/i386/x86-tune-costs.h	Sun Jun  1 22:32:14 2025
*************** struct processor_costs znver5_cost = {
*** 2252,2258 ****
    COSTS_N_INSNS (1),			/* cost of cheap SSE instruction.  */
    /* ADDSS has throughput 2 and latency 2
       (in some cases when source is another addition).  */
!   COSTS_N_INSNS (3),			/* cost of ADDSS/SD SUBSS/SD insns.  */
    /* MULSS has throughput 2 and latency 3.  */
    COSTS_N_INSNS (3),			/* cost of MULSS instruction.  */
    COSTS_N_INSNS (3),			/* cost of MULSD instruction.  */
--- 2252,2258 ----
    COSTS_N_INSNS (1),			/* cost of cheap SSE instruction.  */
    /* ADDSS has throughput 2 and latency 2
       (in some cases when source is another addition).  */
!   COSTS_N_INSNS (2),			/* cost of ADDSS/SD SUBSS/SD insns.  */
    /* MULSS has throughput 2 and latency 3.  */
    COSTS_N_INSNS (3),			/* cost of MULSS instruction.  */
    COSTS_N_INSNS (3),			/* cost of MULSD instruction.  */
diff -Nrcpad gcc-16-20250525/gcc/config/i386/x86-tune.def gcc-16-20250601/gcc/config/i386/x86-tune.def
*** gcc-16-20250525/gcc/config/i386/x86-tune.def	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/config/i386/x86-tune.def	Sun Jun  1 22:32:14 2025
*************** DEF_TUNE (X86_TUNE_V2DF_REDUCTION_PREFER
*** 572,577 ****
--- 572,582 ----
  DEF_TUNE (X86_TUNE_SSE_MOVCC_USE_BLENDV,
  	  "sse_movcc_use_blendv", ~m_CORE_ATOM)
  
+ /* X86_TUNE_V4SI_REDUCTION_PREFER_SHUFD: Prefer pshuf to reduce V16QI,
+    V8HI, V8HI, V4SI, V4FI, V2DI modes when lshr are costlier. */
+ DEF_TUNE (X86_TUNE_SSE_REDUCTION_PREFER_PSHUF,
+    "sse_reduction_prefer_pshuf", m_ZNVER4 | m_ZNVER5)
+ 
  /*****************************************************************************/
  /* AVX instruction selection tuning (some of SSE flags affects AVX, too)     */
  /*****************************************************************************/
diff -Nrcpad gcc-16-20250525/gcc/config/riscv/autovec.md gcc-16-20250601/gcc/config/riscv/autovec.md
*** gcc-16-20250525/gcc/config/riscv/autovec.md	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/config/riscv/autovec.md	Sun Jun  1 22:32:14 2025
***************
*** 2491,2509 ****
        (sign_extend:VWEXTI
         (match_operand:<V_DOUBLE_TRUNC> 2 "register_operand"))))))]
    "TARGET_VECTOR"
! {
!   /* First emit a widening addition.  */
!   rtx tmp1 = gen_reg_rtx (<MODE>mode);
!   rtx ops1[] = {tmp1, operands[1], operands[2]};
!   insn_code icode = code_for_pred_dual_widen (PLUS, SIGN_EXTEND, <MODE>mode);
!   riscv_vector::emit_vlmax_insn (icode, riscv_vector::BINARY_OP, ops1);
! 
!   /* Then a narrowing shift.  */
!   rtx ops2[] = {operands[0], tmp1, const1_rtx};
!   icode = code_for_pred_narrow_scalar (ASHIFTRT, <MODE>mode);
!   riscv_vector::emit_vlmax_insn (icode, riscv_vector::BINARY_OP, ops2);
!   DONE;
! })
  
  (define_expand "avg<v_double_trunc>3_ceil"
   [(set (match_operand:<V_DOUBLE_TRUNC> 0 "register_operand")
--- 2491,2503 ----
        (sign_extend:VWEXTI
         (match_operand:<V_DOUBLE_TRUNC> 2 "register_operand"))))))]
    "TARGET_VECTOR"
!   {
!     insn_code icode = code_for_pred (UNSPEC_VAADD, <V_DOUBLE_TRUNC>mode);
!     riscv_vector::emit_vlmax_insn (icode, riscv_vector::BINARY_OP_VXRM_RDN,
! 				   operands);
!     DONE;
!   }
! )
  
  (define_expand "avg<v_double_trunc>3_ceil"
   [(set (match_operand:<V_DOUBLE_TRUNC> 0 "register_operand")
***************
*** 2517,2541 ****
  	(match_operand:<V_DOUBLE_TRUNC> 2 "register_operand")))
        (const_int 1)))))]
    "TARGET_VECTOR"
! {
!   /* First emit a widening addition.  */
!   rtx tmp1 = gen_reg_rtx (<MODE>mode);
!   rtx ops1[] = {tmp1, operands[1], operands[2]};
!   insn_code icode = code_for_pred_dual_widen (PLUS, SIGN_EXTEND, <MODE>mode);
!   riscv_vector::emit_vlmax_insn (icode, riscv_vector::BINARY_OP, ops1);
! 
!   /* Then add 1.  */
!   rtx tmp2 = gen_reg_rtx (<MODE>mode);
!   rtx ops2[] = {tmp2, tmp1, const1_rtx};
!   icode = code_for_pred_scalar (PLUS, <MODE>mode);
!   riscv_vector::emit_vlmax_insn (icode, riscv_vector::BINARY_OP, ops2);
! 
!   /* Finally, a narrowing shift.  */
!   rtx ops3[] = {operands[0], tmp2, const1_rtx};
!   icode = code_for_pred_narrow_scalar (ASHIFTRT, <MODE>mode);
!   riscv_vector::emit_vlmax_insn (icode, riscv_vector::BINARY_OP, ops3);
!   DONE;
! })
  
  ;; csrwi vxrm, 2
  ;; vaaddu.vv vd, vs2, vs1
--- 2511,2523 ----
  	(match_operand:<V_DOUBLE_TRUNC> 2 "register_operand")))
        (const_int 1)))))]
    "TARGET_VECTOR"
!   {
!     insn_code icode = code_for_pred (UNSPEC_VAADD, <V_DOUBLE_TRUNC>mode);
!     riscv_vector::emit_vlmax_insn (icode, riscv_vector::BINARY_OP_VXRM_RNU,
! 				   operands);
!     DONE;
!   }
! )
  
  ;; csrwi vxrm, 2
  ;; vaaddu.vv vd, vs2, vs1
***************
*** 2546,2552 ****
    "TARGET_VECTOR"
  {
    insn_code icode = code_for_pred (UNSPEC_VAADDU, <MODE>mode);
!   riscv_vector::emit_vlmax_insn (icode, riscv_vector::BINARY_OP_VXRM_RDN, operands);
    DONE;
  })
  
--- 2528,2535 ----
    "TARGET_VECTOR"
  {
    insn_code icode = code_for_pred (UNSPEC_VAADDU, <MODE>mode);
!   riscv_vector::emit_vlmax_insn (icode, riscv_vector::BINARY_OP_VXRM_RDN,
! 				 operands);
    DONE;
  })
  
***************
*** 2559,2565 ****
    "TARGET_VECTOR"
  {
    insn_code icode = code_for_pred (UNSPEC_VAADDU, <MODE>mode);
!   riscv_vector::emit_vlmax_insn (icode, riscv_vector::BINARY_OP_VXRM_RNU, operands);
    DONE;
  })
  
--- 2542,2549 ----
    "TARGET_VECTOR"
  {
    insn_code icode = code_for_pred (UNSPEC_VAADDU, <MODE>mode);
!   riscv_vector::emit_vlmax_insn (icode, riscv_vector::BINARY_OP_VXRM_RNU,
! 				 operands);
    DONE;
  })
  
***************
*** 2584,2590 ****
     (match_operand:V_VLSF 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_ceil (operands[0], operands[1], <MODE>mode, <VCONVERT>mode);
      DONE;
    }
  )
--- 2568,2575 ----
     (match_operand:V_VLSF 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_ceil (operands[0], operands[1], <MODE>mode,
! 				   <VCONVERT>mode);
      DONE;
    }
  )
***************
*** 2594,2600 ****
     (match_operand:V_VLSF 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_floor (operands[0], operands[1], <MODE>mode, <VCONVERT>mode);
      DONE;
    }
  )
--- 2579,2586 ----
     (match_operand:V_VLSF 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_floor (operands[0], operands[1], <MODE>mode,
! 				    <VCONVERT>mode);
      DONE;
    }
  )
***************
*** 2604,2610 ****
     (match_operand:V_VLSF 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_nearbyint (operands[0], operands[1], <MODE>mode, <VCONVERT>mode);
      DONE;
    }
  )
--- 2590,2597 ----
     (match_operand:V_VLSF 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_nearbyint (operands[0], operands[1], <MODE>mode,
! 					<VCONVERT>mode);
      DONE;
    }
  )
***************
*** 2614,2620 ****
     (match_operand:V_VLSF 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_rint (operands[0], operands[1], <MODE>mode, <VCONVERT>mode);
      DONE;
    }
  )
--- 2601,2608 ----
     (match_operand:V_VLSF 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_rint (operands[0], operands[1], <MODE>mode,
! 				   <VCONVERT>mode);
      DONE;
    }
  )
***************
*** 2624,2630 ****
     (match_operand:V_VLSF 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_round (operands[0], operands[1], <MODE>mode, <VCONVERT>mode);
      DONE;
    }
  )
--- 2612,2619 ----
     (match_operand:V_VLSF 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_round (operands[0], operands[1], <MODE>mode,
! 				    <VCONVERT>mode);
      DONE;
    }
  )
***************
*** 2634,2640 ****
     (match_operand:V_VLSF 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_trunc (operands[0], operands[1], <MODE>mode, <VCONVERT>mode);
      DONE;
    }
  )
--- 2623,2630 ----
     (match_operand:V_VLSF 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_trunc (operands[0], operands[1], <MODE>mode,
! 				    <VCONVERT>mode);
      DONE;
    }
  )
***************
*** 2644,2650 ****
     (match_operand:V_VLSF 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_roundeven (operands[0], operands[1], <MODE>mode, <VCONVERT>mode);
      DONE;
    }
  )
--- 2634,2641 ----
     (match_operand:V_VLSF 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_roundeven (operands[0], operands[1], <MODE>mode,
! 					<VCONVERT>mode);
      DONE;
    }
  )
***************
*** 2701,2707 ****
     (match_operand:V_VLS_F_CONVERT_SI 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_lceil (operands[0], operands[1], <MODE>mode, <V_F2SI_CONVERT>mode);
      DONE;
    }
  )
--- 2692,2699 ----
     (match_operand:V_VLS_F_CONVERT_SI 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_lceil (operands[0], operands[1], <MODE>mode,
! 				    <V_F2SI_CONVERT>mode);
      DONE;
    }
  )
***************
*** 2711,2717 ****
     (match_operand:V_VLS_F_CONVERT_DI 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_lceil (operands[0], operands[1], <MODE>mode, <V_F2DI_CONVERT>mode);
      DONE;
    }
  )
--- 2703,2710 ----
     (match_operand:V_VLS_F_CONVERT_DI 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_lceil (operands[0], operands[1], <MODE>mode,
! 				    <V_F2DI_CONVERT>mode);
      DONE;
    }
  )
***************
*** 2721,2727 ****
     (match_operand:V_VLS_F_CONVERT_SI 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_lfloor (operands[0], operands[1], <MODE>mode, <V_F2SI_CONVERT>mode);
      DONE;
    }
  )
--- 2714,2721 ----
     (match_operand:V_VLS_F_CONVERT_SI 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_lfloor (operands[0], operands[1], <MODE>mode,
! 				     <V_F2SI_CONVERT>mode);
      DONE;
    }
  )
***************
*** 2731,2737 ****
     (match_operand:V_VLS_F_CONVERT_DI 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_lfloor (operands[0], operands[1], <MODE>mode, <V_F2DI_CONVERT>mode);
      DONE;
    }
  )
--- 2725,2732 ----
     (match_operand:V_VLS_F_CONVERT_DI 1 "register_operand")]
    "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math"
    {
!     riscv_vector::expand_vec_lfloor (operands[0], operands[1], <MODE>mode,
! 				     <V_F2DI_CONVERT>mode);
      DONE;
    }
  )
***************
*** 2763,2769 ****
     (match_operand:V_VLSI 2 "register_operand")]
    "TARGET_VECTOR"
    {
!     riscv_vector::expand_vec_usadd (operands[0], operands[1], operands[2], <MODE>mode);
      DONE;
    }
  )
--- 2758,2765 ----
     (match_operand:V_VLSI 2 "register_operand")]
    "TARGET_VECTOR"
    {
!     riscv_vector::expand_vec_usadd (operands[0], operands[1], operands[2],
! 				    <MODE>mode);
      DONE;
    }
  )
***************
*** 2774,2780 ****
     (match_operand:V_VLSI 2 "register_operand")]
    "TARGET_VECTOR"
    {
!     riscv_vector::expand_vec_ssadd (operands[0], operands[1], operands[2], <MODE>mode);
      DONE;
    }
  )
--- 2770,2777 ----
     (match_operand:V_VLSI 2 "register_operand")]
    "TARGET_VECTOR"
    {
!     riscv_vector::expand_vec_ssadd (operands[0], operands[1], operands[2],
! 				    <MODE>mode);
      DONE;
    }
  )
***************
*** 2785,2791 ****
     (match_operand:V_VLSI 2 "register_operand")]
    "TARGET_VECTOR"
    {
!     riscv_vector::expand_vec_ussub (operands[0], operands[1], operands[2], <MODE>mode);
      DONE;
    }
  )
--- 2782,2789 ----
     (match_operand:V_VLSI 2 "register_operand")]
    "TARGET_VECTOR"
    {
!     riscv_vector::expand_vec_ussub (operands[0], operands[1], operands[2],
! 				    <MODE>mode);
      DONE;
    }
  )
***************
*** 2796,2802 ****
     (match_operand:V_VLSI 2 "register_operand")]
    "TARGET_VECTOR"
    {
!     riscv_vector::expand_vec_sssub (operands[0], operands[1], operands[2], <MODE>mode);
      DONE;
    }
  )
--- 2794,2801 ----
     (match_operand:V_VLSI 2 "register_operand")]
    "TARGET_VECTOR"
    {
!     riscv_vector::expand_vec_sssub (operands[0], operands[1], operands[2],
! 				    <MODE>mode);
      DONE;
    }
  )
diff -Nrcpad gcc-16-20250525/gcc/config/riscv/bitmanip.md gcc-16-20250601/gcc/config/riscv/bitmanip.md
*** gcc-16-20250525/gcc/config/riscv/bitmanip.md	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/config/riscv/bitmanip.md	Sun Jun  1 22:32:14 2025
***************
*** 846,859 ****
    [(set_attr "type" "bitmanip")])
  
  ;; In case we have "val & ~IMM" where ~IMM has 2 bits set.
! (define_insn_and_split "*bclri<mode>_nottwobits"
!   [(set (match_operand:X 0 "register_operand" "=r")
! 	(and:X (match_operand:X 1 "register_operand" "r")
! 	       (match_operand:X 2 "const_nottwobits_not_arith_operand" "i")))
!    (clobber (match_scratch:X 3 "=&r"))]
    "TARGET_ZBS && !paradoxical_subreg_p (operands[1])"
-   "#"
-   "&& reload_completed"
    [(set (match_dup 3) (and:X (match_dup 1) (match_dup 4)))
     (set (match_dup 0) (and:X (match_dup 3) (match_dup 5)))]
  {
--- 846,857 ----
    [(set_attr "type" "bitmanip")])
  
  ;; In case we have "val & ~IMM" where ~IMM has 2 bits set.
! (define_split
!   [(set (match_operand:X 0 "register_operand")
! 	(and:X (match_operand:X 1 "register_operand")
! 	       (match_operand:X 2 "const_nottwobits_not_arith_operand")))
!    (clobber (match_operand:X 3 "register_operand"))]
    "TARGET_ZBS && !paradoxical_subreg_p (operands[1])"
    [(set (match_dup 3) (and:X (match_dup 1) (match_dup 4)))
     (set (match_dup 0) (and:X (match_dup 3) (match_dup 5)))]
  {
***************
*** 862,881 ****
  
    operands[4] = GEN_INT (~bits | topbit);
    operands[5] = GEN_INT (~topbit);
! }
! [(set_attr "type" "bitmanip")])
  
  ;; In case of a paradoxical subreg, the sign bit and the high bits are
  ;; not allowed to be changed
! (define_insn_and_split "*bclridisi_nottwobits"
!   [(set (match_operand:DI 0 "register_operand" "=r")
! 	(and:DI (match_operand:DI 1 "register_operand" "r")
! 		(match_operand:DI 2 "const_nottwobits_not_arith_operand" "i")))
!    (clobber (match_scratch:DI 3 "=&r"))]
    "TARGET_64BIT && TARGET_ZBS
     && clz_hwi (~UINTVAL (operands[2])) > 33"
-   "#"
-   "&& reload_completed"
    [(set (match_dup 3) (and:DI (match_dup 1) (match_dup 4)))
     (set (match_dup 0) (and:DI (match_dup 3) (match_dup 5)))]
  {
--- 860,876 ----
  
    operands[4] = GEN_INT (~bits | topbit);
    operands[5] = GEN_INT (~topbit);
! })
  
  ;; In case of a paradoxical subreg, the sign bit and the high bits are
  ;; not allowed to be changed
! (define_split
!   [(set (match_operand:DI 0 "register_operand")
! 	(and:DI (match_operand:DI 1 "register_operand")
! 		(match_operand:DI 2 "const_nottwobits_not_arith_operand")))
!    (clobber (match_operand:DI 3 "register_operand"))]
    "TARGET_64BIT && TARGET_ZBS
     && clz_hwi (~UINTVAL (operands[2])) > 33"
    [(set (match_dup 3) (and:DI (match_dup 1) (match_dup 4)))
     (set (match_dup 0) (and:DI (match_dup 3) (match_dup 5)))]
  {
***************
*** 884,891 ****
  
    operands[4] = GEN_INT (~bits | topbit);
    operands[5] = GEN_INT (~topbit);
! }
! [(set_attr "type" "bitmanip")])
  
  ;; An outer AND with a constant where bits 31..63 are 0 can be seen as
  ;; a virtual zero extension from 31 to 64 bits.
--- 879,885 ----
  
    operands[4] = GEN_INT (~bits | topbit);
    operands[5] = GEN_INT (~topbit);
! })
  
  ;; An outer AND with a constant where bits 31..63 are 0 can be seen as
  ;; a virtual zero extension from 31 to 64 bits.
***************
*** 1061,1074 ****
  [(set_attr "type" "bitmanip")])
  
  ;; Same to use blcri + andi and blcri + bclri
! (define_insn_and_split "*andi<mode>_extrabit"
!   [(set (match_operand:X 0 "register_operand" "=r")
! 	(and:X (match_operand:X 1 "register_operand" "r")
! 	       (match_operand:X 2 "not_uimm_extra_bit_or_nottwobits" "i")))
!    (clobber (match_scratch:X 3 "=&r"))]
    "TARGET_ZBS && !not_single_bit_mask_operand (operands[2], VOIDmode)"
-   "#"
-   "&& reload_completed"
    [(set (match_dup 3) (and:X (match_dup 1) (match_dup 4)))
     (set (match_dup 0) (and:X (match_dup 3) (match_dup 5)))]
  {
--- 1055,1066 ----
  [(set_attr "type" "bitmanip")])
  
  ;; Same to use blcri + andi and blcri + bclri
! (define_split
!   [(set (match_operand:X 0 "register_operand")
! 	(and:X (match_operand:X 1 "register_operand")
! 	       (match_operand:X 2 "not_uimm_extra_bit_or_nottwobits")))
!    (clobber (match_operand:X 3 "register_operand"))]
    "TARGET_ZBS && !not_single_bit_mask_operand (operands[2], VOIDmode)"
    [(set (match_dup 3) (and:X (match_dup 1) (match_dup 4)))
     (set (match_dup 0) (and:X (match_dup 3) (match_dup 5)))]
  {
***************
*** 1077,1084 ****
  
    operands[4] = GEN_INT (bits | topbit);
    operands[5] = GEN_INT (~topbit);
! }
! [(set_attr "type" "bitmanip")])
  
  ;; If we have the ZBA extension, then we can clear the upper half of a 64
  ;; bit object with a zext.w.  So if we have AND where the constant would
--- 1069,1075 ----
  
    operands[4] = GEN_INT (bits | topbit);
    operands[5] = GEN_INT (~topbit);
! })
  
  ;; If we have the ZBA extension, then we can clear the upper half of a 64
  ;; bit object with a zext.w.  So if we have AND where the constant would
diff -Nrcpad gcc-16-20250525/gcc/config/riscv/riscv-ext.def gcc-16-20250601/gcc/config/riscv/riscv-ext.def
*** gcc-16-20250525/gcc/config/riscv/riscv-ext.def	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/config/riscv/riscv-ext.def	Sun Jun  1 22:32:14 2025
*************** DEFINE_RISCV_EXT(
*** 1728,1733 ****
--- 1728,1746 ----
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
+   /* NAME */ smdbltrp,
+   /* UPPERCAE_NAME */ SMDBLTRP,
+   /* FULL_NAME */ "Double Trap Extensions",
+   /* DESC */ "",
+   /* URL */ ,
+   /* DEP_EXTS */ ({"zicsr"}),
+   /* SUPPORTED_VERSIONS */ ({{1, 0}}),
+   /* FLAG_GROUP */ sm,
+   /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
+   /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
+   /* EXTRA_EXTENSION_FLAGS */ 0)
+ 
+ DEFINE_RISCV_EXT(
    /* NAME */ ssaia,
    /* UPPERCAE_NAME */ SSAIA,
    /* FULL_NAME */ "Advanced interrupt architecture extension for supervisor-mode",
*************** DEFINE_RISCV_EXT(
*** 1815,1820 ****
--- 1828,1846 ----
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ ss,
    /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
+   /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
+   /* EXTRA_EXTENSION_FLAGS */ 0)
+ 
+ DEFINE_RISCV_EXT(
+   /* NAME */ ssdbltrp,
+   /* UPPERCAE_NAME */ SSDBLTRP,
+   /* FULL_NAME */ "Double Trap Extensions",
+   /* DESC */ "",
+   /* URL */ ,
+   /* DEP_EXTS */ ({"zicsr"}),
+   /* SUPPORTED_VERSIONS */ ({{1, 0}}),
+   /* FLAG_GROUP */ ss,
+   /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
    /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
diff -Nrcpad gcc-16-20250525/gcc/config/riscv/riscv-ext.opt gcc-16-20250601/gcc/config/riscv/riscv-ext.opt
*** gcc-16-20250525/gcc/config/riscv/riscv-ext.opt	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/config/riscv/riscv-ext.opt	Sun Jun  1 22:32:14 2025
*************** Mask(SMNPM) Var(riscv_sm_subext)
*** 343,348 ****
--- 343,350 ----
  
  Mask(SMSTATEEN) Var(riscv_sm_subext)
  
+ Mask(SMDBLTRP) Var(riscv_sm_subext)
+ 
  Mask(SSAIA) Var(riscv_ss_subext)
  
  Mask(SSCOFPMF) Var(riscv_ss_subext)
*************** Mask(SSTC) Var(riscv_ss_subext)
*** 357,362 ****
--- 359,366 ----
  
  Mask(SSSTRICT) Var(riscv_ss_subext)
  
+ Mask(SSDBLTRP) Var(riscv_ss_subext)
+ 
  Mask(SUPM) Var(riscv_su_subext)
  
  Mask(SVINVAL) Var(riscv_sv_subext)
diff -Nrcpad gcc-16-20250525/gcc/config/riscv/riscv-v.cc gcc-16-20250601/gcc/config/riscv/riscv-v.cc
*** gcc-16-20250525/gcc/config/riscv/riscv-v.cc	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/config/riscv/riscv-v.cc	Sun Jun  1 22:32:14 2025
*************** expand_vx_binary_vec_dup_vec (rtx op_0,
*** 5535,5540 ****
--- 5535,5542 ----
      case PLUS:
      case AND:
      case IOR:
+     case XOR:
+     case MULT:
        icode = code_for_pred_scalar (code, mode);
        break;
      case MINUS:
*************** expand_vx_binary_vec_vec_dup (rtx op_0,
*** 5563,5568 ****
--- 5565,5572 ----
      case MINUS:
      case AND:
      case IOR:
+     case XOR:
+     case MULT:
        icode = code_for_pred_scalar (code, mode);
        break;
      default:
diff -Nrcpad gcc-16-20250525/gcc/config/riscv/riscv-vector-builtins-shapes.cc gcc-16-20250601/gcc/config/riscv/riscv-vector-builtins-shapes.cc
*** gcc-16-20250525/gcc/config/riscv/riscv-vector-builtins-shapes.cc	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/config/riscv/riscv-vector-builtins-shapes.cc	Sun Jun  1 22:32:14 2025
*************** struct vset_def : public build_base
*** 908,913 ****
--- 908,915 ----
    {
      poly_int64 outer_size = GET_MODE_SIZE (c.arg_mode (0));
      poly_int64 inner_size = GET_MODE_SIZE (c.arg_mode (2));
+     if (maybe_eq (inner_size, 0))
+       return false;
      unsigned int nvecs = exact_div (outer_size, inner_size).to_constant ();
      return c.require_immediate (1, 0, nvecs - 1);
    }
*************** struct vget_def : public misc_def
*** 920,925 ****
--- 922,929 ----
    {
      poly_int64 outer_size = GET_MODE_SIZE (c.arg_mode (0));
      poly_int64 inner_size = GET_MODE_SIZE (c.ret_mode ());
+     if (maybe_eq (inner_size, 0))
+       return false;
      unsigned int nvecs = exact_div (outer_size, inner_size).to_constant ();
      return c.require_immediate (1, 0, nvecs - 1);
    }
diff -Nrcpad gcc-16-20250525/gcc/config/riscv/riscv-vector-builtins.h gcc-16-20250601/gcc/config/riscv/riscv-vector-builtins.h
*** gcc-16-20250525/gcc/config/riscv/riscv-vector-builtins.h	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/config/riscv/riscv-vector-builtins.h	Sun Jun  1 22:32:14 2025
*************** struct function_group_info
*** 331,375 ****
    /* Return true if required extension is enabled */
    bool match (required_ext ext_value) const
    {
!     switch (ext_value)
!     {
!       case VECTOR_EXT:
!         return TARGET_VECTOR;
!       case ZVBB_EXT:
!         return TARGET_ZVBB;
!       case ZVBB_OR_ZVKB_EXT:
!         return (TARGET_ZVBB || TARGET_ZVKB);
!       case ZVBC_EXT:
!         return TARGET_ZVBC;
!       case ZVKG_EXT:
!         return TARGET_ZVKG;
!       case ZVKNED_EXT:
!         return TARGET_ZVKNED;
!       case ZVKNHA_OR_ZVKNHB_EXT:
!         return (TARGET_ZVKNHA || TARGET_ZVKNHB);
!       case ZVKNHB_EXT:
!         return TARGET_ZVKNHB;
!       case ZVKSED_EXT:
!         return TARGET_ZVKSED;
!       case ZVKSH_EXT:
!         return TARGET_ZVKSH;
!       case XTHEADVECTOR_EXT:
! 	return TARGET_XTHEADVECTOR;
!       case ZVFBFMIN_EXT:
! 	return TARGET_ZVFBFMIN;
!       case ZVFBFWMA_EXT:
! 	return TARGET_ZVFBFWMA;
!       case XSFVQMACCQOQ_EXT:
! 	return TARGET_XSFVQMACCQOQ;
!       case XSFVQMACCDOD_EXT:
! 	return TARGET_XSFVQMACCDOD;
!       case XSFVFNRCLIPXFQF_EXT:
! 	return TARGET_XSFVFNRCLIPXFQF;
!       case XSFVCP_EXT:
! 	return TARGET_XSFVCP;
!       default:
!         gcc_unreachable ();
!     }
    }
    /* The base name, as a string.  */
    const char *base_name;
--- 331,337 ----
    /* Return true if required extension is enabled */
    bool match (required_ext ext_value) const
    {
!     return required_extensions_specified (ext_value);
    }
    /* The base name, as a string.  */
    const char *base_name;
diff -Nrcpad gcc-16-20250525/gcc/config/riscv/riscv.cc gcc-16-20250601/gcc/config/riscv/riscv.cc
*** gcc-16-20250525/gcc/config/riscv/riscv.cc	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/config/riscv/riscv.cc	Sun Jun  1 22:32:14 2025
*************** riscv_rtx_costs (rtx x, machine_mode mod
*** 3918,3923 ****
--- 3918,3925 ----
  	      case MINUS:
  	      case AND:
  	      case IOR:
+ 	      case XOR:
+ 	      case MULT:
  		{
  		  rtx op_0 = XEXP (x, 0);
  		  rtx op_1 = XEXP (x, 1);
*************** synthesize_and (rtx operands[3])
*** 14621,14639 ****
        return true;
      }
  
    /* If the remaining budget has gone to less than zero, it
       forces the value into a register and performs the AND
       operation.  It returns TRUE to the caller so the caller
       knows code generation is complete.
       FIXME: This is hacked to always be enabled until the last
       patch in the series is enabled.  */
!   if (1)
      {
        rtx x = force_reg (word_mode, operands[2]);
        x = gen_rtx_AND (word_mode, operands[1], x);
        emit_insn (gen_rtx_SET (operands[0], x));
        return true;
      }
  }
  
  
--- 14623,14692 ----
        return true;
      }
  
+   /* The special cases didn't apply.  It's entirely possible we may
+      want to combine some of the ideas above with bclr, but for now
+      those are deferred until we see them popping up in practice.  */
+ 
+   unsigned HOST_WIDE_INT ival = ~INTVAL (operands[2]);
+ 
+   /* Clear as many bits using andi as we can.  */
+   if ((ival & HOST_WIDE_INT_UC (0x7ff)) != 0x0)
+     {
+       ival &= ~HOST_WIDE_INT_UC (0x7ff);
+       budget--;
+     }
+ 
+   /* And handle remaining bits via bclr.  */
+   while (TARGET_ZBS && ival)
+     {
+       unsigned HOST_WIDE_INT tmpval = HOST_WIDE_INT_UC (1) << ctz_hwi (ival);
+       ival &= ~tmpval;
+       budget--;
+     }
+ 
    /* If the remaining budget has gone to less than zero, it
       forces the value into a register and performs the AND
       operation.  It returns TRUE to the caller so the caller
       knows code generation is complete.
       FIXME: This is hacked to always be enabled until the last
       patch in the series is enabled.  */
!   if (ival || budget < 0)
      {
        rtx x = force_reg (word_mode, operands[2]);
        x = gen_rtx_AND (word_mode, operands[1], x);
        emit_insn (gen_rtx_SET (operands[0], x));
        return true;
      }
+ 
+   /* Synthesis is better than loading the constant.  */
+   ival = ~INTVAL (operands[2]);
+   input = operands[1];
+ 
+   /* Clear any of the lower 11 bits we need.  */
+   if ((ival & HOST_WIDE_INT_UC (0x7ff)) != 0)
+     {
+       rtx x = GEN_INT (~(ival & HOST_WIDE_INT_UC (0x7ff)));
+       x = gen_rtx_AND (word_mode, input, x);
+       output = gen_reg_rtx (word_mode);
+       emit_insn (gen_rtx_SET (output, x));
+       input = output;
+       ival &= ~HOST_WIDE_INT_UC (0x7ff);
+     }
+ 
+   /* Clear the rest with bclr.  */
+   while (ival)
+     {
+       unsigned HOST_WIDE_INT tmpval = HOST_WIDE_INT_UC (1) << ctz_hwi (ival);
+       rtx x = GEN_INT (~tmpval);
+       x = gen_rtx_AND (word_mode, input, x);
+       output = gen_reg_rtx (word_mode);
+       emit_insn (gen_rtx_SET (output, x));
+       input = output;
+       ival &= ~tmpval;
+     }
+ 
+   emit_move_insn (operands[0], input);
+   return true;
  }
  
  
diff -Nrcpad gcc-16-20250525/gcc/config/riscv/vector-iterators.md gcc-16-20250601/gcc/config/riscv/vector-iterators.md
*** gcc-16-20250525/gcc/config/riscv/vector-iterators.md	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/config/riscv/vector-iterators.md	Sun Jun  1 22:32:14 2025
***************
*** 4042,4048 ****
  ])
  
  (define_code_iterator any_int_binop_no_shift_vx [
!   plus minus and ior
  ])
  
  (define_code_iterator any_int_unop [neg not])
--- 4042,4048 ----
  ])
  
  (define_code_iterator any_int_binop_no_shift_vx [
!   plus minus and ior xor mult
  ])
  
  (define_code_iterator any_int_unop [neg not])
diff -Nrcpad gcc-16-20250525/gcc/config/rs6000/rs6000.cc gcc-16-20250601/gcc/config/rs6000/rs6000.cc
*** gcc-16-20250525/gcc/config/rs6000/rs6000.cc	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/config/rs6000/rs6000.cc	Sun Jun  1 22:32:14 2025
***************
*** 55,61 ****
  #include "output.h"
  #include "common/common-target.h"
  #include "langhooks.h"
- #include "reload.h"
  #include "sched-int.h"
  #include "gimplify.h"
  #include "gimple-iterator.h"
--- 55,60 ----
diff -Nrcpad gcc-16-20250525/gcc/config/s390/vector.md gcc-16-20250601/gcc/config/s390/vector.md
*** gcc-16-20250525/gcc/config/s390/vector.md	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/config/s390/vector.md	Sun Jun  1 22:32:14 2025
***************
*** 75,80 ****
--- 75,82 ----
  			   V1DF V2DF
  			   (V1TF "TARGET_VXE") (TF "TARGET_VXE")])
  
+ (define_mode_iterator VF [(V2SF "TARGET_VXE") (V4SF "TARGET_VXE") V2DF])
+ 
  ; All modes present in V_HW1 and VFT.
  (define_mode_iterator V_HW1_FT [V16QI V8HI V4SI V2DI V1TI V1DF
  			       V2DF (V1SF "TARGET_VXE") (V2SF "TARGET_VXE")
***************
*** 506,531 ****
  		   UNSPEC_VEC_SET))]
    "TARGET_VX")
  
  ; FIXME: Support also vector mode operands for 1
  ; FIXME: A target memory operand seems to be useful otherwise we end
  ; up with vl vlvgg vst.  Shouldn't the middle-end be able to handle
  ; that itself?
  ; vlvgb, vlvgh, vlvgf, vlvgg, vleb, vleh, vlef, vleg, vleib, vleih, vleif, vleig
  (define_insn "*vec_set<mode>"
!   [(set (match_operand:V                    0 "register_operand"  "=v,v,v")
! 	(unspec:V [(match_operand:<non_vec> 1 "general_operand"    "d,R,K")
! 		   (match_operand:SI        2 "nonmemory_operand" "an,I,I")
! 		   (match_operand:V         3 "register_operand"   "0,0,0")]
! 		  UNSPEC_VEC_SET))]
    "TARGET_VX
     && (!CONST_INT_P (operands[2])
!        || UINTVAL (operands[2]) < GET_MODE_NUNITS (<V:MODE>mode))"
    "@
     vlvg<bhfgq>\t%v0,%1,%Y2
     vle<bhfgq>\t%v0,%1,%2
     vlei<bhfgq>\t%v0,%1,%2"
    [(set_attr "op_type" "VRS,VRX,VRI")])
  
  ; vlvgb, vlvgh, vlvgf, vlvgg
  (define_insn "*vec_set<mode>_plus"
    [(set (match_operand:V                      0 "register_operand" "=v")
--- 508,596 ----
  		   UNSPEC_VEC_SET))]
    "TARGET_VX")
  
+ ; Iterator for vec_set that does not use special float/vect overlay tricks
+ (define_mode_iterator VEC_SET_NONFLOAT
+   [V1QI V2QI V4QI V8QI V16QI V1HI V2HI V4HI V8HI V1SI V2SI V4SI V1DI V2DI V2SF V4SF])
+ ; Iterator for single element float vectors
+ (define_mode_iterator VEC_SET_SINGLEFLOAT [(V1SF "TARGET_VXE") V1DF (V1TF "TARGET_VXE")])
+ 
  ; FIXME: Support also vector mode operands for 1
  ; FIXME: A target memory operand seems to be useful otherwise we end
  ; up with vl vlvgg vst.  Shouldn't the middle-end be able to handle
  ; that itself?
  ; vlvgb, vlvgh, vlvgf, vlvgg, vleb, vleh, vlef, vleg, vleib, vleih, vleif, vleig
  (define_insn "*vec_set<mode>"
!   [(set (match_operand:VEC_SET_NONFLOAT      0 "register_operand"  "=v,v,v")
! 	(unspec:VEC_SET_NONFLOAT
! 	  [(match_operand:<non_vec>          1 "general_operand"    "d,R,K")
! 	   (match_operand:SI                 2 "nonmemory_operand" "an,I,I")
! 	   (match_operand:VEC_SET_NONFLOAT   3 "register_operand"   "0,0,0")]
! 	  UNSPEC_VEC_SET))]
    "TARGET_VX
     && (!CONST_INT_P (operands[2])
!        || UINTVAL (operands[2]) < GET_MODE_NUNITS (<VEC_SET_NONFLOAT:MODE>mode))"
    "@
     vlvg<bhfgq>\t%v0,%1,%Y2
     vle<bhfgq>\t%v0,%1,%2
     vlei<bhfgq>\t%v0,%1,%2"
    [(set_attr "op_type" "VRS,VRX,VRI")])
  
+ (define_insn "*vec_set<mode>"
+   [(set (match_operand:VEC_SET_SINGLEFLOAT     0 "register_operand"  "=v,v")
+ 	(unspec:VEC_SET_SINGLEFLOAT
+ 	  [(match_operand:<non_vec>            1 "general_operand"    "v,R")
+ 	   (match_operand:SI                   2 "nonmemory_operand" "an,I")
+ 	   (match_operand:VEC_SET_SINGLEFLOAT  3 "register_operand"   "0,0")]
+ 	  UNSPEC_VEC_SET))]
+   "TARGET_VX"
+   "@
+    vlr\t%v0,%v1
+    vle<bhfgq>\t%v0,%1,0"
+  [(set_attr "op_type" "VRR,VRX")])
+ 
+ (define_insn "*vec_setv2df"
+   [(set (match_operand:V2DF                    0 "register_operand"  "=v,v,v,v")
+ 	(unspec:V2DF [(match_operand:DF        1 "general_operand"    "d,R,K,v")
+ 		      (match_operand:SI        2 "nonmemory_operand" "an,I,I,n")
+ 		      (match_operand:V2DF      3 "register_operand"   "0,0,0,0")]
+ 		     UNSPEC_VEC_SET))]
+   "TARGET_VX
+    && (!CONST_INT_P (operands[2])
+        || UINTVAL (operands[2]) < GET_MODE_NUNITS (V2DFmode))"
+   "@
+    vlvgg\t%v0,%1,%Y2
+    vleg\t%v0,%1,%2
+    vleig\t%v0,%1,%2
+    #"
+   [(set_attr "op_type" "VRS,VRX,VRI,*")])
+ 
+ (define_split
+   [(set (match_operand:V2DF            0 "register_operand"  "")
+ 	(unspec:V2DF [(match_operand:DF    1 "register_operand"  "")
+ 		      (match_operand:SI        2 "const_int_operand" "")
+ 		      (match_operand:V2DF      3 "register_operand"  "")]
+ 		     UNSPEC_VEC_SET))]
+   "TARGET_VX
+    && (UINTVAL (operands[2]) < GET_MODE_NUNITS (V2DFmode))
+    && reload_completed
+    && VECTOR_REGNO_P (REGNO (operands[1]))"
+    [(set (match_dup 0)
+       (vec_select:V2DF
+         (vec_concat:V4DF
+ 	  (match_dup 1)
+ 	  (match_dup 3))
+ 	(parallel [(const_int 0) (match_dup 4)])))]
+ {
+     operands[1] = gen_rtx_REG (V2DFmode, REGNO (operands[1]));
+     if (UINTVAL (operands[2]) == 0)
+       operands[4] = GEN_INT (3);
+     else
+     {
+       std::swap (operands[1], operands[3]);
+       operands[4] = GEN_INT (2);
+     }
+ })
+ 
  ; vlvgb, vlvgh, vlvgf, vlvgg
  (define_insn "*vec_set<mode>_plus"
    [(set (match_operand:V                      0 "register_operand" "=v")
***************
*** 562,579 ****
  (define_insn "*vec_extract<mode>"
    [(set (match_operand:<non_vec> 0 "nonimmediate_operand" "=d,R")
         (vec_select:<non_vec>
!          (match_operand:V        1 "nonmemory_operand"  "v,v")
           (parallel
            [(match_operand:SI     2 "nonmemory_operand" "an,I")])))]
    "TARGET_VX"
    {
      if (CONST_INT_P (operands[2]))
! 	  operands[2] = GEN_INT (UINTVAL (operands[2]) & (GET_MODE_NUNITS (<V:MODE>mode) - 1));
      if (which_alternative == 0)
        return "vlgv<bhfgq>\t%0,%v1,%Y2";
  	return "vste<bhfgq>\t%v1,%0,%2";
    }
!   [(set_attr "op_type" "VRS,VRX")])
  
  ; vlgvb, vlgvh, vlgvf, vlgvg
  (define_insn "*vec_extract<mode>_plus"
--- 627,692 ----
  (define_insn "*vec_extract<mode>"
    [(set (match_operand:<non_vec> 0 "nonimmediate_operand" "=d,R")
         (vec_select:<non_vec>
!          (match_operand:VI       1 "nonmemory_operand"  "v,v")
           (parallel
            [(match_operand:SI     2 "nonmemory_operand" "an,I")])))]
    "TARGET_VX"
    {
      if (CONST_INT_P (operands[2]))
! 	  operands[2] = GEN_INT (UINTVAL (operands[2]) & (GET_MODE_NUNITS (<VI:MODE>mode) - 1));
      if (which_alternative == 0)
        return "vlgv<bhfgq>\t%0,%v1,%Y2";
  	return "vste<bhfgq>\t%v1,%0,%2";
    }
!   [(set_attr "op_type" "VRS,VRX")
!    (set_attr "mnemonic" "vlgv<bhfgq>,vste<bhfgq>")])
! 
! (define_insn "*vec_extract<mode>"
!   [(set (match_operand:<non_vec> 0 "nonimmediate_operand" "=d,R,v")
!        (vec_select:<non_vec>
!          (match_operand:VF       1 "nonmemory_operand"  "v,v,v")
!          (parallel
!           [(match_operand:SI     2 "nonmemory_operand" "an,I,n")])))]
!   "TARGET_VX"
!   {
!     if (CONST_INT_P (operands[2]))
!       operands[2] = GEN_INT (UINTVAL (operands[2]) & (GET_MODE_NUNITS (<VF:MODE>mode) - 1));
!     if (which_alternative == 0)
!       return "vlgv<bhfgq>\t%0,%v1,%Y2";
!     else if (which_alternative == 1)
!       return "vste<bhfgq>\t%v1,%0,%2";
!     else
!       return "#";
!   }
!   [(set_attr "op_type" "VRS,VRX,*")
!    (set_attr "mnemonic" "vlgv<bhfgq>,vste<bhfgq>,*")])
! 
! (define_split
!   [(set (match_operand:<non_vec> 0 "register_operand" "")
!        (vec_select:<non_vec>
!          (match_operand:VF       1 "register_operand"  "")
!          (parallel
!           [(match_operand:SI     2 "const_int_operand" "")])))]
!   "TARGET_VX && reload_completed && VECTOR_REGNO_P (REGNO (operands[0]))"
!   [(set (match_dup 0)
!         (vec_duplicate:VF
!            (vec_select:<non_vec>
!               (match_dup 1)
!               (parallel [(match_dup 2)]))))]
! {
!     unsigned HOST_WIDE_INT idx = UINTVAL (operands[2]) & (GET_MODE_NUNITS (<VF:MODE>mode) - 1);
!     if (idx == 0)
!       {
!         rtx dest = gen_rtx_REG (<VF:MODE>mode, REGNO (operands[0]));
!         emit_insn (gen_mov<VF:mode> (dest, operands[1]));
!         DONE;
!       }
!     else
!       {
!         operands[0] = gen_rtx_REG (<VF:MODE>mode, REGNO (operands[0]));
!         operands[2] = GEN_INT (idx);
!       }
! })
  
  ; vlgvb, vlgvh, vlgvf, vlgvg
  (define_insn "*vec_extract<mode>_plus"
***************
*** 611,620 ****
  ; Replicate from vector element
  ; vrepb, vreph, vrepf, vrepg
  (define_insn "*vec_splat<mode>"
!   [(set (match_operand:V_128_NOSINGLE   0 "register_operand" "=v")
! 	(vec_duplicate:V_128_NOSINGLE
  	 (vec_select:<non_vec>
! 	  (match_operand:V_128_NOSINGLE 1 "register_operand"  "v")
  	  (parallel
  	   [(match_operand:QI 2 "const_mask_operand" "C")]))))]
    "TARGET_VX && UINTVAL (operands[2]) < GET_MODE_NUNITS (<MODE>mode)"
--- 724,733 ----
  ; Replicate from vector element
  ; vrepb, vreph, vrepf, vrepg
  (define_insn "*vec_splat<mode>"
!   [(set (match_operand:V   0 "register_operand" "=v")
! 	(vec_duplicate:V
  	 (vec_select:<non_vec>
! 	  (match_operand:V 1 "register_operand"  "v")
  	  (parallel
  	   [(match_operand:QI 2 "const_mask_operand" "C")]))))]
    "TARGET_VX && UINTVAL (operands[2]) < GET_MODE_NUNITS (<MODE>mode)"
diff -Nrcpad gcc-16-20250525/gcc/config/xtensa/xtensa.cc gcc-16-20250601/gcc/config/xtensa/xtensa.cc
*** gcc-16-20250525/gcc/config/xtensa/xtensa.cc	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/config/xtensa/xtensa.cc	Sun Jun  1 22:32:14 2025
*************** along with GCC; see the file COPYING3.
*** 48,54 ****
  #include "alias.h"
  #include "explow.h"
  #include "expr.h"
- #include "reload.h"
  #include "langhooks.h"
  #include "gimplify.h"
  #include "builtins.h"
--- 48,53 ----
*************** static void xtensa_output_mi_thunk (FILE
*** 197,202 ****
--- 196,203 ----
  				    tree function);
  
  static rtx xtensa_delegitimize_address (rtx);
+ static reg_class_t xtensa_ira_change_pseudo_allocno_class (int, reg_class_t,
+ 							   reg_class_t);
  
  
  
*************** static rtx xtensa_delegitimize_address (
*** 366,371 ****
--- 367,375 ----
  #undef TARGET_DIFFERENT_ADDR_DISPLACEMENT_P
  #define TARGET_DIFFERENT_ADDR_DISPLACEMENT_P hook_bool_void_true
  
+ #undef TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS
+ #define TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS xtensa_ira_change_pseudo_allocno_class
+ 
  struct gcc_target targetm = TARGET_INITIALIZER;
  
  
*************** xtensa_register_move_cost (machine_mode
*** 4432,4443 ****
  	  && reg_class_subset_p (to, AR_REGS)))
      return 2;
  
!   /* The cost between AR_REGS and FR_REGS must be <= 8 (2x the default
!      MEMORY_MOVE_COST) to avoid unwanted spills, and > 4 (2x the above
!      case) to avoid excessive register-to-register moves.  */
    if ((reg_class_subset_p (from, AR_REGS) && to == FP_REGS)
        || (from == FP_REGS && reg_class_subset_p (to, AR_REGS)))
!     return 5;
  
    if ((reg_class_subset_p (from, AR_REGS) && to == ACC_REG)
        || (from == ACC_REG && reg_class_subset_p (to, AR_REGS)))
--- 4436,4445 ----
  	  && reg_class_subset_p (to, AR_REGS)))
      return 2;
  
!   /* The cost between AR_REGS and FR_REGS is 2 (the default value).  */
    if ((reg_class_subset_p (from, AR_REGS) && to == FP_REGS)
        || (from == FP_REGS && reg_class_subset_p (to, AR_REGS)))
!     return 2;
  
    if ((reg_class_subset_p (from, AR_REGS) && to == ACC_REG)
        || (from == ACC_REG && reg_class_subset_p (to, AR_REGS)))
*************** xtensa_delegitimize_address (rtx op)
*** 5433,5436 ****
--- 5435,5454 ----
    return op;
  }
  
+ /* Implement TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS, in order to tell
+    the register allocator to avoid using ALL_REGS rclass.  */
+ 
+ static reg_class_t
+ xtensa_ira_change_pseudo_allocno_class (int regno, reg_class_t allocno_class,
+ 					reg_class_t best_class)
+ {
+   if (allocno_class != ALL_REGS)
+     return allocno_class;
+ 
+   if (best_class != ALL_REGS)
+     return best_class;
+ 
+   return FLOAT_MODE_P (PSEUDO_REGNO_MODE (regno)) ? FP_REGS : AR_REGS;
+ }
+ 
  #include "gt-xtensa.h"
diff -Nrcpad gcc-16-20250525/gcc/config/xtensa/xtensa.md gcc-16-20250601/gcc/config/xtensa/xtensa.md
*** gcc-16-20250525/gcc/config/xtensa/xtensa.md	Sun May 25 22:32:05 2025
--- gcc-16-20250601/gcc/config/xtensa/xtensa.md	Sun Jun  1 22:32:14 2025
***************
*** 1453,1459 ****
  })
  
  (define_insn "movsf_internal"
!   [(set (match_operand:SF 0 "nonimmed_operand" "=f,f,^U,D,a,D,R,a,f,a,a,W,a,U")
  	(match_operand:SF 1 "move_operand" "f,^U,f,d,T,R,d,r,r,f,Y,iF,U,r"))]
    "((register_operand (operands[0], SFmode)
       || register_operand (operands[1], SFmode))
--- 1453,1459 ----
  })
  
  (define_insn "movsf_internal"
!   [(set (match_operand:SF 0 "nonimmed_operand" "=f,f,U,D,a,D,R,a,f,a,a,W,a,U")
  	(match_operand:SF 1 "move_operand" "f,^U,f,d,T,R,d,r,r,f,Y,iF,U,r"))]
    "((register_operand (operands[0], SFmode)
       || register_operand (operands[1], SFmode))
diff -Nrcpad gcc-16-20250525/gcc/cp/ChangeLog gcc-16-20250601/gcc/cp/ChangeLog
*** gcc-16-20250525/gcc/cp/ChangeLog	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/ChangeLog	Sun Jun  1 22:32:14 2025
***************
*** 1,3 ****
--- 1,180 ----
+ 2025-05-30  Jason Merrill  <jason@redhat.com>
+ 
+ 	PR c++/113563
+ 	* lambda.cc (lambda_capture_field_type): Handle 'this' normally.
+ 	(build_capture_proxy): Special-case 'this' by-ref capture more.
+ 	(nonlambda_method_basetype): Look through xobj lambdas.
+ 
+ 2025-05-30  Julian Brown  <julian@codesourcery.com>
+ 	    Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* constexpr.cc (reduced_constant_expression_p): Add OMP_DECLARE_MAPPER
+ 	case.
+ 	(cxx_eval_constant_expression, potential_constant_expression_1):
+ 	Likewise.
+ 	* cp-gimplify.cc (cxx_omp_finish_mapper_clauses): New function.
+ 	* cp-objcp-common.h (LANG_HOOKS_OMP_FINISH_MAPPER_CLAUSES,
+ 	LANG_HOOKS_OMP_MAPPER_LOOKUP, LANG_HOOKS_OMP_EXTRACT_MAPPER_DIRECTIVE,
+ 	LANG_HOOKS_OMP_MAP_ARRAY_SECTION): Define langhooks.
+ 	* cp-tree.h (lang_decl_base): Add omp_declare_mapper_p field.  Recount
+ 	spare bits comment.
+ 	(DECL_OMP_DECLARE_MAPPER_P): New macro.
+ 	(omp_mapper_id): Add prototype.
+ 	(cp_check_omp_declare_mapper): Add prototype.
+ 	(omp_instantiate_mappers): Add prototype.
+ 	(cxx_omp_finish_mapper_clauses): Add prototype.
+ 	(cxx_omp_mapper_lookup): Add prototype.
+ 	(cxx_omp_extract_mapper_directive): Add prototype.
+ 	(cxx_omp_map_array_section): Add prototype.
+ 	* decl.cc (check_initializer): Add OpenMP declare mapper support.
+ 	(cp_finish_decl): Set DECL_INITIAL for OpenMP declare mapper var decls
+ 	as appropriate.
+ 	* decl2.cc (mark_used): Instantiate OpenMP "declare mapper" magic var
+ 	decls.
+ 	* error.cc (dump_omp_declare_mapper): New function.
+ 	(dump_simple_decl): Use above.
+ 	* parser.cc (cp_parser_omp_clause_map): Add KIND parameter.  Support
+ 	"mapper" modifier.
+ 	(cp_parser_omp_all_clauses): Add KIND argument to
+ 	cp_parser_omp_clause_map call.
+ 	(cp_parser_omp_target): Call omp_instantiate_mappers before
+ 	finish_omp_clauses.
+ 	(cp_parser_omp_declare_mapper): New function.
+ 	(cp_parser_omp_declare): Add "declare mapper" support.
+ 	* pt.cc (tsubst_decl): Adjust name of "declare mapper" magic var decls
+ 	once we know their type.
+ 	(tsubst_omp_clauses): Call omp_instantiate_mappers before
+ 	finish_omp_clauses, for target regions.
+ 	(tsubst_expr): Support OMP_DECLARE_MAPPER nodes.
+ 	(instantiate_decl): Instantiate initialiser (i.e definition) for OpenMP
+ 	declare mappers.
+ 	* semantics.cc (gimplify.h): Include.
+ 	(omp_mapper_id, omp_mapper_lookup, omp_extract_mapper_directive,
+ 	cxx_omp_map_array_section, cp_check_omp_declare_mapper): New functions.
+ 	(finish_omp_clauses): Delete GOMP_MAP_PUSH_MAPPER_NAME and
+ 	GOMP_MAP_POP_MAPPER_NAME artificial clauses.
+ 	(omp_target_walk_data): Add MAPPERS field.
+ 	(finish_omp_target_clauses_r): Scan for uses of struct/union/class type
+ 	variables.
+ 	(finish_omp_target_clauses): Create artificial mapper binding clauses
+ 	for used structs/unions/classes in offload region.
+ 
+ 2025-05-29  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* error.cc (cxx_format_postprocessor::clone): Update to use
+ 	unique_ptr.
+ 	(cxx_dump_pretty_printer::cxx_dump_pretty_printer): Likewise.
+ 	(cxx_initialize_diagnostics): Likewise.
+ 
+ 2025-05-29  Jason Merrill  <jason@redhat.com>
+ 
+ 	PR c++/113563
+ 	* lambda.cc (build_capture_proxy): Check pointerness of the
+ 	member, not the proxy type.
+ 	(lambda_expr_this_capture): Don't assume current_class_ref.
+ 	(nonlambda_method_basetype): Likewise.
+ 	* semantics.cc (finish_non_static_data_member): Don't assume
+ 	TREE_TYPE (object) is set.
+ 	(finish_this_expr): Check current_class_type for lambda,
+ 	not current_class_ref.
+ 
+ 2025-05-29  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	PR c++/109283
+ 	* coroutines.cc (find_any_await): Only save the statement
+ 	pointer if the caller passes a place for it.
+ 	(flatten_await_stmt): When checking that ternary expressions
+ 	have been handled, also check that they contain a co_await.
+ 
+ 2025-05-29  Jason Merrill  <jason@redhat.com>
+ 
+ 	* decl.cc (start_decl): Also set invalid_constexpr
+ 	for maybe_constexpr_fn.
+ 	* parser.cc (cp_parser_jump_statement): Likewise.
+ 	* constexpr.cc (potential_constant_expression_1): Ignore
+ 	goto to an artificial label.
+ 
+ 2025-05-29  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* parser.cc (cp_parser_omp_metadirective): Do not call
+ 	cp_parser_skip_to_end_of_block_or_statement after an error.
+ 
+ 2025-05-29  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR c/120180
+ 	* parser.cc (cp_parser_omp_metadirective): Only consume the
+ 	token if it is the expected close paren.
+ 
+ 2025-05-29  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	* coroutines.cc (analyze_fn_parms): No longer
+ 	create a parameter copy guard var.
+ 	* coroutines.h (struct param_info): Remove the
+ 	entry for the parameter copy destructor guard.
+ 
+ 2025-05-29  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	PR c++/120453
+ 	* cp-tree.h (DECL_RAMP_P): New.
+ 	* typeck.cc (check_return_expr): Use DECL_RAMP_P instead
+ 	of DECL_RAMP_FN.
+ 
+ 2025-05-29  Jason Merrill  <jason@redhat.com>
+ 
+ 	PR c++/107600
+ 	* cp-trait.def (IS_DESTRUCTIBLE, IS_NOTHROW_DESTRUCTIBLE)
+ 	(IS_TRIVIALLY_DESTRUCTIBLE): New.
+ 	* constraint.cc (diagnose_trait_expr): Explain them.
+ 	* method.cc (destructible_expr): New.
+ 	(is_xible_helper): Use it.
+ 	* semantics.cc (finish_trait_expr): Handle new traits.
+ 	(trait_expr_value): Likewise.  Complain about asking
+ 	whether a deleted dtor is trivial.
+ 
+ 2025-05-28  Jason Merrill  <jason@redhat.com>
+ 
+ 	* module.cc (module_state::write_namespaces): Write
+ 	using-directives.
+ 	(module_state::read_namespaces): And read them.
+ 	* name-lookup.cc (add_using_namespace): Add overload.  Build a
+ 	USING_DECL for modules.
+ 	(name_lookup::search_usings, name_lookup::queue_usings)
+ 	(using_directives_contain_std_p): Strip the USING_DECL.
+ 	* name-lookup.h: Declare it.
+ 	* parser.cc (cp_parser_import_declaration): Set MK_EXPORTING
+ 	for export import.
+ 
+ 2025-05-27  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	* coroutines.cc (cp_coroutine_transform::build_ramp_function):
+ 	Replace TRUTH_AND_EXPR with TRUTH_ANDIF_EXPR in three places.
+ 
+ 2025-05-26  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	PR c++/120413
+ 	* semantics.cc (finish_omp_target_clauses_r): Handle
+ 	BIND_EXPR with empty BIND_EXPR_BLOCK.
+ 
+ 2025-05-26  Jason Merrill  <jason@redhat.com>
+ 
+ 	* cp-tree.h: Declare tinst_dump_id.
+ 	* cp-objcp-common.cc (cp_register_dumps): Set it.
+ 	* pt.cc (push_tinst_level_loc): Dump it.
+ 	(reopen_tinst_level): Here too.
+ 	(tinst_complete_p): New.
+ 	(instantiate_pending_templates): Don't reopen_tinst_level for
+ 	already-complete instantiations.
+ 
+ 2025-05-26  Jason Merrill  <jason@redhat.com>
+ 
+ 	* cp-tree.h (class cxx_dump_pretty_printer): New.
+ 	* error.cc (cxx_dump_pretty_printer): Ctor/dtor definitions.
+ 
+ 2025-05-25  Jason Merrill  <jason@redhat.com>
+ 
+ 	* error.cc (dump_template_bindings): Correct skipping of
+ 	redundant bindings.
+ 
  2025-05-23  Nathaniel Shead  <nathanieloshead@gmail.com>
  
  	PR c++/120363
diff -Nrcpad gcc-16-20250525/gcc/cp/constexpr.cc gcc-16-20250601/gcc/cp/constexpr.cc
*** gcc-16-20250525/gcc/cp/constexpr.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/constexpr.cc	Sun Jun  1 22:32:14 2025
*************** reduced_constant_expression_p (tree t)
*** 3529,3534 ****
--- 3529,3537 ----
        /* Even if we can't lower this yet, it's constant.  */
        return true;
  
+     case OMP_DECLARE_MAPPER:
+       return true;
+ 
      case CONSTRUCTOR:
        /* And we need to handle PTRMEM_CST wrapped in a CONSTRUCTOR.  */
        tree field;
*************** cxx_eval_constant_expression (const cons
*** 7838,7843 ****
--- 7841,7847 ----
      case LABEL_EXPR:
      case CASE_LABEL_EXPR:
      case PREDICT_EXPR:
+     case OMP_DECLARE_MAPPER:
        return t;
  
      case PARM_DECL:
*************** potential_constant_expression_1 (tree t,
*** 10532,10537 ****
--- 10536,10546 ----
  			  "expression", t);
        return false;
  
+     case OMP_DECLARE_MAPPER:
+       /* This can be used to initialize VAR_DECLs: it's treated as a magic
+ 	 constant.  */
+       return true;
+ 
      case ASM_EXPR:
        if (flags & tf_error)
  	inline_asm_in_constexpr_error (loc, fundef_p);
*************** potential_constant_expression_1 (tree t,
*** 10979,10984 ****
--- 10988,10996 ----
  	    *jump_target = *target;
  	    return true;
  	  }
+ 	if (DECL_ARTIFICIAL (*target))
+ 	  /* The user didn't write this goto, this isn't the problem.  */
+ 	  return true;
  	if (flags & tf_error)
  	  constexpr_error (loc, fundef_p, "%<goto%> is not a constant "
  			   "expression");
diff -Nrcpad gcc-16-20250525/gcc/cp/constraint.cc gcc-16-20250601/gcc/cp/constraint.cc
*** gcc-16-20250525/gcc/cp/constraint.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/constraint.cc	Sun Jun  1 22:32:14 2025
*************** diagnose_trait_expr (tree expr, tree arg
*** 3100,3105 ****
--- 3100,3108 ----
      case CPTK_IS_CONVERTIBLE:
        inform (loc, "  %qT is not convertible from %qE", t2, t1);
        break;
+     case CPTK_IS_DESTRUCTIBLE:
+       inform (loc, "  %qT is not destructible", t1);
+       break;
      case CPTK_IS_EMPTY:
        inform (loc, "  %qT is not an empty class", t1);
        break;
*************** diagnose_trait_expr (tree expr, tree arg
*** 3145,3150 ****
--- 3148,3156 ----
      case CPTK_IS_NOTHROW_CONVERTIBLE:
        inform (loc, "  %qT is not nothrow convertible from %qE", t2, t1);
        break;
+     case CPTK_IS_NOTHROW_DESTRUCTIBLE:
+       inform (loc, "  %qT is not nothrow destructible", t1);
+       break;
      case CPTK_IS_NOTHROW_INVOCABLE:
        if (!t2)
  	inform (loc, "  %qT is not nothrow invocable", t1);
*************** diagnose_trait_expr (tree expr, tree arg
*** 3194,3199 ****
--- 3200,3208 ----
      case CPTK_IS_TRIVIALLY_COPYABLE:
        inform (loc, "  %qT is not trivially copyable", t1);
        break;
+     case CPTK_IS_TRIVIALLY_DESTRUCTIBLE:
+       inform (loc, "  %qT is not trivially destructible", t1);
+       break;
      case CPTK_IS_UNBOUNDED_ARRAY:
        inform (loc, "  %qT is not an unbounded array", t1);
        break;
diff -Nrcpad gcc-16-20250525/gcc/cp/coroutines.cc gcc-16-20250601/gcc/cp/coroutines.cc
*** gcc-16-20250525/gcc/cp/coroutines.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/coroutines.cc	Sun Jun  1 22:32:14 2025
*************** find_any_await (tree *stmt, int *dosub,
*** 2865,2872 ****
    if (TREE_CODE (*stmt) == CO_AWAIT_EXPR)
      {
        *dosub = 0; /* We don't need to consider this any further.  */
!       tree **p = (tree **) d;
!       *p = stmt;
        return *stmt;
      }
    return NULL_TREE;
--- 2865,2872 ----
    if (TREE_CODE (*stmt) == CO_AWAIT_EXPR)
      {
        *dosub = 0; /* We don't need to consider this any further.  */
!       if (d)
! 	*(tree **)d = stmt;
        return *stmt;
      }
    return NULL_TREE;
*************** flatten_await_stmt (var_nest_node *n, ha
*** 3116,3122 ****
  	  bool already_present = promoted->add (var);
  	  gcc_checking_assert (!already_present);
  	  tree inner = TARGET_EXPR_INITIAL (init);
! 	  gcc_checking_assert (TREE_CODE (inner) != COND_EXPR);
  	  init = cp_build_modify_expr (input_location, var, INIT_EXPR, init,
  				       tf_warning_or_error);
  	  /* Simplify for the case that we have an init containing the temp
--- 3116,3124 ----
  	  bool already_present = promoted->add (var);
  	  gcc_checking_assert (!already_present);
  	  tree inner = TARGET_EXPR_INITIAL (init);
! 	  gcc_checking_assert
! 	    (TREE_CODE (inner) != COND_EXPR
! 	     || !cp_walk_tree (&inner, find_any_await, nullptr, nullptr));
  	  init = cp_build_modify_expr (input_location, var, INIT_EXPR, init,
  				       tf_warning_or_error);
  	  /* Simplify for the case that we have an init containing the temp
*************** analyze_fn_parms (tree orig, hash_map<tr
*** 4089,4105 ****
  	}
        parm.field_id = name;
        if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (parm.frame_type))
! 	{
! 	  char *buf = xasprintf ("_Coro_q%u_%s_live", parm_num,
! 				 DECL_NAME (arg) ? IDENTIFIER_POINTER (name)
! 						 : "__unnamed");
! 	  parm.guard_var
! 	    = coro_build_artificial_var (UNKNOWN_LOCATION, get_identifier (buf),
! 					 boolean_type_node, orig,
! 					 boolean_false_node);
! 	  free (buf);
! 	  parm.trivial_dtor = false;
! 	}
        else
  	parm.trivial_dtor = true;
      }
--- 4091,4097 ----
  	}
        parm.field_id = name;
        if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (parm.frame_type))
! 	parm.trivial_dtor = false;
        else
  	parm.trivial_dtor = true;
      }
*************** cp_coroutine_transform::build_ramp_funct
*** 4944,4950 ****
        tree frame_cleanup = push_stmt_list ();
        tree do_fr_cleanup
  	= build1_loc (loc, TRUTH_NOT_EXPR, boolean_type_node, iarc_x);
!       do_fr_cleanup = build2_loc (loc, TRUTH_AND_EXPR, boolean_type_node,
  				  coro_before_return, do_fr_cleanup);
        r = build3 (COND_EXPR, void_type_node, do_fr_cleanup,
  			     delete_frame_call, void_node);
--- 4936,4942 ----
        tree frame_cleanup = push_stmt_list ();
        tree do_fr_cleanup
  	= build1_loc (loc, TRUTH_NOT_EXPR, boolean_type_node, iarc_x);
!       do_fr_cleanup = build2_loc (loc, TRUTH_ANDIF_EXPR, boolean_type_node,
  				  coro_before_return, do_fr_cleanup);
        r = build3 (COND_EXPR, void_type_node, do_fr_cleanup,
  			     delete_frame_call, void_node);
*************** cp_coroutine_transform::build_ramp_funct
*** 5036,5042 ****
  		  tree do_cleanup
  		    = build1_loc (loc, TRUTH_NOT_EXPR, boolean_type_node, iarc_x);
  		  do_cleanup
! 		    = build2_loc (loc, TRUTH_AND_EXPR, boolean_type_node,
  				  coro_before_return, do_cleanup);
  		  r = build3_loc (loc, COND_EXPR, void_type_node, do_cleanup,
  				  parm.fr_copy_dtor, void_node);
--- 5028,5034 ----
  		  tree do_cleanup
  		    = build1_loc (loc, TRUTH_NOT_EXPR, boolean_type_node, iarc_x);
  		  do_cleanup
! 		    = build2_loc (loc, TRUTH_ANDIF_EXPR, boolean_type_node,
  				  coro_before_return, do_cleanup);
  		  r = build3_loc (loc, COND_EXPR, void_type_node, do_cleanup,
  				  parm.fr_copy_dtor, void_node);
*************** cp_coroutine_transform::build_ramp_funct
*** 5096,5102 ****
  	  tree promise_cleanup = push_stmt_list ();
  	  tree do_cleanup
  	    = build1_loc (loc, TRUTH_NOT_EXPR, boolean_type_node, iarc_x);
! 	  do_cleanup = build2_loc (loc, TRUTH_AND_EXPR, boolean_type_node,
  				   coro_before_return, do_cleanup);
  	  r = build3 (COND_EXPR, void_type_node, do_cleanup,
  		      promise_dtor, void_node);
--- 5088,5094 ----
  	  tree promise_cleanup = push_stmt_list ();
  	  tree do_cleanup
  	    = build1_loc (loc, TRUTH_NOT_EXPR, boolean_type_node, iarc_x);
! 	  do_cleanup = build2_loc (loc, TRUTH_ANDIF_EXPR, boolean_type_node,
  				   coro_before_return, do_cleanup);
  	  r = build3 (COND_EXPR, void_type_node, do_cleanup,
  		      promise_dtor, void_node);
diff -Nrcpad gcc-16-20250525/gcc/cp/coroutines.h gcc-16-20250601/gcc/cp/coroutines.h
*** gcc-16-20250525/gcc/cp/coroutines.h	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/coroutines.h	Sun Jun  1 22:32:14 2025
*************** struct param_info
*** 9,15 ****
    vec<tree *> *body_uses; /* Worklist of uses, void if there are none.  */
    tree frame_type;   /* The type used to represent this parm in the frame.  */
    tree orig_type;    /* The original type of the parm (not as passed).  */
-   tree guard_var;    /* If we need a DTOR on exception, this bool guards it.  */
    tree fr_copy_dtor; /* If we need a DTOR on exception, this is it.  */
    bool by_ref;       /* Was passed by reference.  */
    bool pt_ref;       /* Was a pointer to object.  */
--- 9,14 ----
diff -Nrcpad gcc-16-20250525/gcc/cp/cp-gimplify.cc gcc-16-20250601/gcc/cp/cp-gimplify.cc
*** gcc-16-20250525/gcc/cp/cp-gimplify.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/cp-gimplify.cc	Sun Jun  1 22:32:14 2025
*************** cxx_omp_finish_clause (tree c, gimple_se
*** 2809,2814 ****
--- 2809,2820 ----
      }
  }
  
+ tree
+ cxx_omp_finish_mapper_clauses (tree clauses)
+ {
+   return finish_omp_clauses (clauses, C_ORT_OMP);
+ }
+ 
  /* Return true if DECL's DECL_VALUE_EXPR (if any) should be
     disregarded in OpenMP construct, because it is going to be
     remapped during OpenMP lowering.  SHARED is true if DECL
diff -Nrcpad gcc-16-20250525/gcc/cp/cp-objcp-common.cc gcc-16-20250601/gcc/cp/cp-objcp-common.cc
*** gcc-16-20250525/gcc/cp/cp-objcp-common.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/cp-objcp-common.cc	Sun Jun  1 22:32:14 2025
*************** cp_register_dumps (gcc::dump_manager *du
*** 614,619 ****
--- 614,621 ----
      (".raw", "lang-raw", "lang-raw", DK_lang, OPTGROUP_NONE, false);
    coro_dump_id = dumps->dump_register
      (".coro", "lang-coro", "lang-coro", DK_lang, OPTGROUP_NONE, false);
+   tinst_dump_id = dumps->dump_register
+     (".tinst", "lang-tinst", "lang-tinst", DK_lang, OPTGROUP_NONE, false);
  }
  
  void
diff -Nrcpad gcc-16-20250525/gcc/cp/cp-objcp-common.h gcc-16-20250601/gcc/cp/cp-objcp-common.h
*** gcc-16-20250525/gcc/cp/cp-objcp-common.h	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/cp-objcp-common.h	Sun Jun  1 22:32:14 2025
*************** static const scoped_attribute_specs *con
*** 190,195 ****
--- 190,204 ----
  #define LANG_HOOKS_OMP_CLAUSE_DTOR cxx_omp_clause_dtor
  #undef LANG_HOOKS_OMP_FINISH_CLAUSE
  #define LANG_HOOKS_OMP_FINISH_CLAUSE cxx_omp_finish_clause
+ #undef LANG_HOOKS_OMP_FINISH_MAPPER_CLAUSES
+ #define LANG_HOOKS_OMP_FINISH_MAPPER_CLAUSES cxx_omp_finish_mapper_clauses
+ #undef LANG_HOOKS_OMP_MAPPER_LOOKUP
+ #define LANG_HOOKS_OMP_MAPPER_LOOKUP cxx_omp_mapper_lookup
+ #undef LANG_HOOKS_OMP_EXTRACT_MAPPER_DIRECTIVE
+ #define LANG_HOOKS_OMP_EXTRACT_MAPPER_DIRECTIVE \
+   cxx_omp_extract_mapper_directive
+ #undef LANG_HOOKS_OMP_MAP_ARRAY_SECTION
+ #define LANG_HOOKS_OMP_MAP_ARRAY_SECTION cxx_omp_map_array_section
  #undef LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE
  #define LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE cxx_omp_privatize_by_reference
  #undef LANG_HOOKS_OMP_DISREGARD_VALUE_EXPR
diff -Nrcpad gcc-16-20250525/gcc/cp/cp-trait.def gcc-16-20250601/gcc/cp/cp-trait.def
*** gcc-16-20250525/gcc/cp/cp-trait.def	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/cp-trait.def	Sun Jun  1 22:32:14 2025
*************** DEFTRAIT_EXPR (IS_CLASS, "__is_class", 1
*** 71,76 ****
--- 71,77 ----
  DEFTRAIT_EXPR (IS_CONST, "__is_const", 1)
  DEFTRAIT_EXPR (IS_CONSTRUCTIBLE, "__is_constructible", -1)
  DEFTRAIT_EXPR (IS_CONVERTIBLE, "__is_convertible", 2)
+ DEFTRAIT_EXPR (IS_DESTRUCTIBLE, "__is_destructible", 1)
  DEFTRAIT_EXPR (IS_EMPTY, "__is_empty", 1)
  DEFTRAIT_EXPR (IS_ENUM, "__is_enum", 1)
  DEFTRAIT_EXPR (IS_FINAL, "__is_final", 1)
*************** DEFTRAIT_EXPR (IS_MEMBER_POINTER, "__is_
*** 84,89 ****
--- 85,91 ----
  DEFTRAIT_EXPR (IS_NOTHROW_ASSIGNABLE, "__is_nothrow_assignable", 2)
  DEFTRAIT_EXPR (IS_NOTHROW_CONSTRUCTIBLE, "__is_nothrow_constructible", -1)
  DEFTRAIT_EXPR (IS_NOTHROW_CONVERTIBLE, "__is_nothrow_convertible", 2)
+ DEFTRAIT_EXPR (IS_NOTHROW_DESTRUCTIBLE, "__is_nothrow_destructible", 1)
  DEFTRAIT_EXPR (IS_NOTHROW_INVOCABLE, "__is_nothrow_invocable", -1)
  DEFTRAIT_EXPR (IS_OBJECT, "__is_object", 1)
  DEFTRAIT_EXPR (IS_POINTER_INTERCONVERTIBLE_BASE_OF, "__is_pointer_interconvertible_base_of", 2)
*************** DEFTRAIT_EXPR (IS_TRIVIAL, "__is_trivial
*** 98,103 ****
--- 100,106 ----
  DEFTRAIT_EXPR (IS_TRIVIALLY_ASSIGNABLE, "__is_trivially_assignable", 2)
  DEFTRAIT_EXPR (IS_TRIVIALLY_CONSTRUCTIBLE, "__is_trivially_constructible", -1)
  DEFTRAIT_EXPR (IS_TRIVIALLY_COPYABLE, "__is_trivially_copyable", 1)
+ DEFTRAIT_EXPR (IS_TRIVIALLY_DESTRUCTIBLE, "__is_trivially_destructible", -1)
  DEFTRAIT_EXPR (IS_UNBOUNDED_ARRAY, "__is_unbounded_array", 1)
  DEFTRAIT_EXPR (IS_UNION, "__is_union", 1)
  DEFTRAIT_EXPR (IS_VIRTUAL_BASE_OF, "__builtin_is_virtual_base_of", 2)
diff -Nrcpad gcc-16-20250525/gcc/cp/cp-tree.h gcc-16-20250601/gcc/cp/cp-tree.h
*** gcc-16-20250525/gcc/cp/cp-tree.h	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/cp-tree.h	Sun Jun  1 22:32:14 2025
*************** struct GTY(()) lang_decl_base {
*** 2975,2981 ****
  
    unsigned module_keyed_decls_p : 1;	   /* has keys, applies to all decls */
  
!   /* 11 spare bits.  */
  };
  
  /* True for DECL codes which have template info and access.  */
--- 2975,2984 ----
  
    unsigned module_keyed_decls_p : 1;	   /* has keys, applies to all decls */
  
!   /* VAR_DECL being used to represent an OpenMP declared mapper.  */
!   unsigned omp_declare_mapper_p : 1;
! 
!   /* 10 spare bits.  */
  };
  
  /* True for DECL codes which have template info and access.  */
*************** get_vec_init_expr (tree t)
*** 4530,4535 ****
--- 4533,4543 ----
  #define DECL_OMP_DECLARE_REDUCTION_P(NODE) \
    (LANG_DECL_FN_CHECK (DECL_COMMON_CHECK (NODE))->omp_declare_reduction_p)
  
+ /* Nonzero if NODE is an artificial FUNCTION_DECL for
+    #pragma omp declare mapper.  */
+ #define DECL_OMP_DECLARE_MAPPER_P(NODE) \
+   (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))->u.base.omp_declare_mapper_p)
+ 
  /* Nonzero if DECL has been declared threadprivate by
     #pragma omp threadprivate.  */
  #define CP_DECL_THREADPRIVATE_P(DECL) \
*************** decl_template_parm_check (const_tree t,
*** 5522,5527 ****
--- 5530,5539 ----
  #define DECL_RAMP_FN(NODE) \
    (coro_get_ramp_function (NODE))
  
+ /* For a FUNCTION_DECL this is true if it is a coroutine ramp.  */
+ #define DECL_RAMP_P(NODE) \
+   DECL_COROUTINE_P (NODE) && !DECL_RAMP_FN (NODE)
+ 
  /* True for an OMP_ATOMIC that has dependent parameters.  These are stored
     as an expr in operand 1, and integer_zero_node or clauses in operand 0.  */
  #define OMP_ATOMIC_DEPENDENT_P(NODE) \
*************** extern int class_dump_id;
*** 6822,6827 ****
--- 6834,6840 ----
  extern int module_dump_id;
  extern int raw_dump_id;
  extern int coro_dump_id;
+ extern int tinst_dump_id;
  
  /* Whether the current context is manifestly constant-evaluated.
     Used by the constexpr machinery to control folding of
*************** extern void cp_check_const_attributes (t
*** 7322,7327 ****
--- 7335,7363 ----
  extern void maybe_propagate_warmth_attributes (tree, tree);
  
  /* in error.cc */
+ /* A class for pretty-printing to -flang-dump-XXX files.  Used like
+ 
+    if (cxx_dump_pretty_printer pp {foo_dump_id})
+      {
+        pp_printf (&pp, ...);
+      }
+ 
+    If the dump is enabled, the pretty printer will open the dump file and
+    attach to it, and flush and close the file on destruction.  */
+ 
+ class cxx_dump_pretty_printer: public pretty_printer
+ {
+   int phase;
+   FILE *outf;
+   dump_flags_t flags;
+ 
+ public:
+   cxx_dump_pretty_printer (int phase);
+   operator bool() { return outf != nullptr; }
+   bool has_flag (dump_flags_t f) { return (flags & f); }
+   ~cxx_dump_pretty_printer ();
+ };
+ 
  extern const char *type_as_string		(tree, int);
  extern const char *type_as_string_translate	(tree, int);
  extern const char *decl_as_string		(tree, int);
*************** extern tree finish_qualified_id_expr		(t
*** 8068,8078 ****
--- 8104,8117 ----
  extern void simplify_aggr_init_expr		(tree *);
  extern void finalize_nrv			(tree, tree);
  extern tree omp_reduction_id			(enum tree_code, tree, tree);
+ extern tree omp_mapper_id			(tree, tree);
  extern tree cp_remove_omp_priv_cleanup_stmt	(tree *, int *, void *);
  extern bool cp_check_omp_declare_reduction	(tree);
+ extern bool cp_check_omp_declare_mapper		(tree);
  extern void finish_omp_declare_simd_methods	(tree);
  extern tree cp_finish_omp_init_prefer_type	(tree);
  extern tree finish_omp_clauses			(tree, enum c_omp_region_type);
+ extern tree omp_instantiate_mappers		(tree);
  extern tree push_omp_privatization_clauses	(bool);
  extern void pop_omp_privatization_clauses	(tree);
  extern void save_omp_privatization_clauses	(vec<tree> &);
*************** extern tree cxx_omp_clause_copy_ctor		(t
*** 8668,8673 ****
--- 8707,8716 ----
  extern tree cxx_omp_clause_assign_op		(tree, tree, tree);
  extern tree cxx_omp_clause_dtor			(tree, tree);
  extern void cxx_omp_finish_clause		(tree, gimple_seq *, bool);
+ extern tree cxx_omp_finish_mapper_clauses	(tree);
+ extern tree cxx_omp_mapper_lookup		(tree, tree);
+ extern tree cxx_omp_extract_mapper_directive	(tree);
+ extern tree cxx_omp_map_array_section		(location_t, tree);
  extern bool cxx_omp_privatize_by_reference	(const_tree);
  extern bool cxx_omp_disregard_value_expr	(tree, bool);
  extern void cp_fold_function			(tree);
diff -Nrcpad gcc-16-20250525/gcc/cp/decl.cc gcc-16-20250601/gcc/cp/decl.cc
*** gcc-16-20250525/gcc/cp/decl.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/decl.cc	Sun Jun  1 22:32:14 2025
*************** start_decl (const cp_declarator *declara
*** 6198,6219 ****
      }
  
    if (current_function_decl && VAR_P (decl)
!       && DECL_DECLARED_CONSTEXPR_P (current_function_decl)
        && cxx_dialect < cxx23)
      {
        bool ok = false;
        if (CP_DECL_THREAD_LOCAL_P (decl) && !DECL_REALLY_EXTERN (decl))
! 	error_at (DECL_SOURCE_LOCATION (decl),
! 		  "%qD defined %<thread_local%> in %qs function only "
! 		  "available with %<-std=c++23%> or %<-std=gnu++23%>", decl,
! 		  DECL_IMMEDIATE_FUNCTION_P (current_function_decl)
! 		  ? "consteval" : "constexpr");
        else if (TREE_STATIC (decl))
! 	error_at (DECL_SOURCE_LOCATION (decl),
! 		  "%qD defined %<static%> in %qs function only available "
! 		  "with %<-std=c++23%> or %<-std=gnu++23%>", decl,
! 		  DECL_IMMEDIATE_FUNCTION_P (current_function_decl)
! 		  ? "consteval" : "constexpr");
        else
  	ok = true;
        if (!ok)
--- 6198,6225 ----
      }
  
    if (current_function_decl && VAR_P (decl)
!       && maybe_constexpr_fn (current_function_decl)
        && cxx_dialect < cxx23)
      {
        bool ok = false;
        if (CP_DECL_THREAD_LOCAL_P (decl) && !DECL_REALLY_EXTERN (decl))
! 	{
! 	  if (DECL_DECLARED_CONSTEXPR_P (current_function_decl))
! 	    error_at (DECL_SOURCE_LOCATION (decl),
! 		      "%qD defined %<thread_local%> in %qs function only "
! 		      "available with %<-std=c++23%> or %<-std=gnu++23%>", decl,
! 		      DECL_IMMEDIATE_FUNCTION_P (current_function_decl)
! 		      ? "consteval" : "constexpr");
! 	}
        else if (TREE_STATIC (decl))
! 	{
! 	  if (DECL_DECLARED_CONSTEXPR_P (current_function_decl))
! 	    error_at (DECL_SOURCE_LOCATION (decl),
! 		      "%qD defined %<static%> in %qs function only available "
! 		      "with %<-std=c++23%> or %<-std=gnu++23%>", decl,
! 		      DECL_IMMEDIATE_FUNCTION_P (current_function_decl)
! 		      ? "consteval" : "constexpr");
! 	}
        else
  	ok = true;
        if (!ok)
*************** check_initializer (tree decl, tree init,
*** 7871,7876 ****
--- 7877,7888 ----
      }
    else if (!init && DECL_REALLY_EXTERN (decl))
      ;
+   else if (flag_openmp
+ 	   && VAR_P (decl)
+ 	   && DECL_LANG_SPECIFIC (decl)
+ 	   && DECL_OMP_DECLARE_MAPPER_P (decl)
+ 	   && TREE_CODE (init) == OMP_DECLARE_MAPPER)
+     return NULL_TREE;
    else if (init || type_build_ctor_call (type)
  	   || TYPE_REF_P (type))
      {
*************** cp_finish_decl (tree decl, tree init, bo
*** 9191,9204 ****
  	  varpool_node::get_create (decl);
  	}
  
        /* Convert the initializer to the type of DECL, if we have not
  	 already initialized DECL.  */
!       if (!DECL_INITIALIZED_P (decl)
! 	  /* If !DECL_EXTERNAL then DECL is being defined.  In the
! 	     case of a static data member initialized inside the
! 	     class-specifier, there can be an initializer even if DECL
! 	     is *not* defined.  */
! 	  && (!DECL_EXTERNAL (decl) || init))
  	{
  	  cleanups = make_tree_vector ();
  	  init = check_initializer (decl, init, flags, &cleanups);
--- 9203,9225 ----
  	  varpool_node::get_create (decl);
  	}
  
+       if (flag_openmp
+ 	  && VAR_P (decl)
+ 	  && DECL_LANG_SPECIFIC (decl)
+ 	  && DECL_OMP_DECLARE_MAPPER_P (decl)
+ 	  && init)
+ 	{
+ 	  gcc_assert (TREE_CODE (init) == OMP_DECLARE_MAPPER);
+ 	  DECL_INITIAL (decl) = init;
+ 	}
        /* Convert the initializer to the type of DECL, if we have not
  	 already initialized DECL.  */
!       else if (!DECL_INITIALIZED_P (decl)
! 	       /* If !DECL_EXTERNAL then DECL is being defined.  In the
! 		  case of a static data member initialized inside the
! 		  class-specifier, there can be an initializer even if DECL
! 		  is *not* defined.  */
! 	       && (!DECL_EXTERNAL (decl) || init))
  	{
  	  cleanups = make_tree_vector ();
  	  init = check_initializer (decl, init, flags, &cleanups);
diff -Nrcpad gcc-16-20250525/gcc/cp/decl2.cc gcc-16-20250601/gcc/cp/decl2.cc
*** gcc-16-20250525/gcc/cp/decl2.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/decl2.cc	Sun Jun  1 22:32:14 2025
*************** mark_used (tree decl, tsubst_flags_t com
*** 6408,6419 ****
  
    /* If DECL has a deduced return type, we need to instantiate it now to
       find out its type.  For OpenMP user defined reductions, we need them
!      instantiated for reduction clauses which inline them by hand directly.  */
    if (undeduced_auto_decl (decl)
        || (VAR_P (decl)
  	  && VAR_HAD_UNKNOWN_BOUND (decl))
        || (TREE_CODE (decl) == FUNCTION_DECL
! 	  && DECL_OMP_DECLARE_REDUCTION_P (decl)))
      maybe_instantiate_decl (decl);
  
    if (!decl_dependent_p (decl)
--- 6408,6424 ----
  
    /* If DECL has a deduced return type, we need to instantiate it now to
       find out its type.  For OpenMP user defined reductions, we need them
!      instantiated for reduction clauses which inline them by hand directly.
!      OpenMP declared mappers are used implicitly so must be instantiated
!      before they can be detected.  */
    if (undeduced_auto_decl (decl)
        || (VAR_P (decl)
  	  && VAR_HAD_UNKNOWN_BOUND (decl))
        || (TREE_CODE (decl) == FUNCTION_DECL
! 	  && DECL_OMP_DECLARE_REDUCTION_P (decl))
!       || (TREE_CODE (decl) == VAR_DECL
! 	  && DECL_LANG_SPECIFIC (decl)
! 	  && DECL_OMP_DECLARE_MAPPER_P (decl)))
      maybe_instantiate_decl (decl);
  
    if (!decl_dependent_p (decl)
diff -Nrcpad gcc-16-20250525/gcc/cp/error.cc gcc-16-20250601/gcc/cp/error.cc
*** gcc-16-20250525/gcc/cp/error.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/error.cc	Sun Jun  1 22:32:14 2025
*************** class cxx_format_postprocessor : public
*** 182,190 ****
    : m_type_a (), m_type_b ()
    {}
  
!   format_postprocessor *clone() const final override
    {
!     return new cxx_format_postprocessor ();
    }
  
    void handle (pretty_printer *pp) final override;
--- 182,191 ----
    : m_type_a (), m_type_b ()
    {}
  
!   std::unique_ptr<format_postprocessor>
!   clone() const final override
    {
!     return std::make_unique<cxx_format_postprocessor> ();
    }
  
    void handle (pretty_printer *pp) final override;
*************** class cxx_format_postprocessor : public
*** 193,198 ****
--- 194,225 ----
    deferred_printed_type m_type_b;
  };
  
+ /* Constructor and destructor for cxx_dump_pretty_printer, defined here to
+    avoid needing to move cxx_format_postprocessor into the header as well.  */
+ 
+ cxx_dump_pretty_printer::
+ cxx_dump_pretty_printer (int phase)
+   : phase (phase)
+ {
+   outf = dump_begin (phase, &flags);
+   if (outf)
+     {
+       pp_format_decoder (this) = cp_printer;
+       set_format_postprocessor (std::make_unique<cxx_format_postprocessor> ());
+       set_output_stream (outf);
+     }
+ }
+ 
+ cxx_dump_pretty_printer::
+ ~cxx_dump_pretty_printer ()
+ {
+   if (outf)
+     {
+       pp_flush (this);
+       dump_end (phase, outf);
+     }
+ }
+ 
  /* Return the in-scope template that's currently being parsed, or
     NULL_TREE otherwise.  */
  
*************** void
*** 274,280 ****
  cxx_initialize_diagnostics (diagnostic_context *context)
  {
    cxx_pretty_printer *pp = new cxx_pretty_printer ();
!   pp_format_postprocessor (pp) = new cxx_format_postprocessor ();
    context->set_pretty_printer (std::unique_ptr<pretty_printer> (pp));
  
    c_common_diagnostics_set_defaults (context);
--- 301,307 ----
  cxx_initialize_diagnostics (diagnostic_context *context)
  {
    cxx_pretty_printer *pp = new cxx_pretty_printer ();
!   pp->set_format_postprocessor (std::make_unique<cxx_format_postprocessor> ());
    context->set_pretty_printer (std::unique_ptr<pretty_printer> (pp));
  
    c_common_diagnostics_set_defaults (context);
*************** dump_global_iord (cxx_pretty_printer *pp
*** 1255,1266 ****
--- 1282,1318 ----
    pp_printf (pp, p, DECL_SOURCE_FILE (t));
  }
  
+ /* Write a representation of OpenMP "declare mapper" T to PP in a manner
+    suitable for error messages.  */
+ 
+ static void
+ dump_omp_declare_mapper (cxx_pretty_printer *pp, tree t, int flags)
+ {
+   pp_string (pp, "#pragma omp declare mapper");
+   if (t == NULL_TREE || t == error_mark_node)
+     return;
+   pp_space (pp);
+   pp_cxx_left_paren (pp);
+   if (OMP_DECLARE_MAPPER_ID (t))
+     {
+       pp_cxx_tree_identifier (pp, OMP_DECLARE_MAPPER_ID (t));
+       pp_colon (pp);
+     }
+   dump_type (pp, TREE_TYPE (t), flags);
+   pp_cxx_right_paren (pp);
+ }
+ 
  static void
  dump_simple_decl (cxx_pretty_printer *pp, tree t, tree type, int flags)
  {
    if (VAR_P (t) && DECL_NTTP_OBJECT_P (t))
      return dump_expr (pp, DECL_INITIAL (t), flags);
  
+   if (TREE_CODE (t) == VAR_DECL
+       && DECL_LANG_SPECIFIC (t)
+       && DECL_OMP_DECLARE_MAPPER_P (t))
+     return dump_omp_declare_mapper (pp, DECL_INITIAL (t), flags);
+ 
    if (flags & TFF_DECL_SPECIFIERS)
      {
        if (concept_definition_p (t))
diff -Nrcpad gcc-16-20250525/gcc/cp/lambda.cc gcc-16-20250601/gcc/cp/lambda.cc
*** gcc-16-20250525/gcc/cp/lambda.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/lambda.cc	Sun Jun  1 22:32:14 2025
*************** lambda_capture_field_type (tree expr, bo
*** 218,226 ****
    tree type;
    bool is_this = is_this_parameter (tree_strip_nop_conversions (expr));
  
!   if (is_this)
!     type = TREE_TYPE (expr);
!   else if (explicit_init_p)
      {
        tree auto_node = make_auto ();
  
--- 218,224 ----
    tree type;
    bool is_this = is_this_parameter (tree_strip_nop_conversions (expr));
  
!   if (explicit_init_p)
      {
        tree auto_node = make_auto ();
  
*************** lambda_capture_field_type (tree expr, bo
*** 259,265 ****
  
        type = non_reference (unlowered_expr_type (expr));
  
!       if (by_reference_p || TREE_CODE (type) == FUNCTION_TYPE)
  	type = build_reference_type (type);
      }
  
--- 257,263 ----
  
        type = non_reference (unlowered_expr_type (expr));
  
!       if ((by_reference_p && !is_this) || TREE_CODE (type) == FUNCTION_TYPE)
  	type = build_reference_type (type);
      }
  
*************** build_capture_proxy (tree member, tree i
*** 440,452 ****
    else
      name = get_identifier (IDENTIFIER_POINTER (DECL_NAME (member)) + 2);
  
!   type = lambda_proxy_type (object);
! 
!   if (name == this_identifier && !INDIRECT_TYPE_P (type))
      {
!       type = build_pointer_type (type);
!       type = cp_build_qualified_type (type, TYPE_QUAL_CONST);
!       object = build_fold_addr_expr_with_type (object, type);
      }
  
    if (DECL_VLA_CAPTURE_P (member))
--- 438,458 ----
    else
      name = get_identifier (IDENTIFIER_POINTER (DECL_NAME (member)) + 2);
  
!   if (name == this_identifier && TYPE_PTR_P (TREE_TYPE (member)))
!     /* Avoid DECLTYPE_TYPE for by-ref 'this' capture in an xobj lambda; the
!        constness of the closure doesn't matter just like it doesn't matter to
!        other by-ref capture.  It's simpler to handle this special case here
!        than in lambda_proxy_type.  */
!     type = TREE_TYPE (member);
!   else
      {
!       type = lambda_proxy_type (object);
!       if (name == this_identifier)
! 	{
! 	  type = build_pointer_type (type);
! 	  type = cp_build_qualified_type (type, TYPE_QUAL_CONST);
! 	  object = build_fold_addr_expr_with_type (object, type);
! 	}
      }
  
    if (DECL_VLA_CAPTURE_P (member))
*************** lambda_expr_this_capture (tree lambda, i
*** 921,928 ****
    else
      {
        /* To make sure that current_class_ref is for the lambda.  */
!       gcc_assert (TYPE_MAIN_VARIANT (TREE_TYPE (current_class_ref))
! 		  == LAMBDA_EXPR_CLOSURE (lambda));
  
        result = this_capture;
  
--- 927,935 ----
    else
      {
        /* To make sure that current_class_ref is for the lambda.  */
!       gcc_assert (!current_class_ref
! 		  || (TYPE_MAIN_VARIANT (TREE_TYPE (current_class_ref))
! 		      == LAMBDA_EXPR_CLOSURE (lambda)));
  
        result = this_capture;
  
*************** current_nonlambda_function (void)
*** 1037,1048 ****
  tree
  nonlambda_method_basetype (void)
  {
-   if (!current_class_ref)
-     return NULL_TREE;
- 
    tree type = current_class_type;
    if (!type || !LAMBDA_TYPE_P (type))
!     return type;
  
    while (true)
      {
--- 1044,1052 ----
  tree
  nonlambda_method_basetype (void)
  {
    tree type = current_class_type;
    if (!type || !LAMBDA_TYPE_P (type))
!     return current_class_ref ? type : NULL_TREE;
  
    while (true)
      {
*************** nonlambda_method_basetype (void)
*** 1054,1060 ****
  
        tree fn = TYPE_CONTEXT (type);
        if (!fn || TREE_CODE (fn) != FUNCTION_DECL
! 	  || !DECL_IOBJ_MEMBER_FUNCTION_P (fn))
  	/* No enclosing non-lambda method.  */
  	return NULL_TREE;
        if (!LAMBDA_FUNCTION_P (fn))
--- 1058,1064 ----
  
        tree fn = TYPE_CONTEXT (type);
        if (!fn || TREE_CODE (fn) != FUNCTION_DECL
! 	  || !DECL_OBJECT_MEMBER_FUNCTION_P (fn))
  	/* No enclosing non-lambda method.  */
  	return NULL_TREE;
        if (!LAMBDA_FUNCTION_P (fn))
diff -Nrcpad gcc-16-20250525/gcc/cp/method.cc gcc-16-20250601/gcc/cp/method.cc
*** gcc-16-20250525/gcc/cp/method.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/method.cc	Sun Jun  1 22:32:14 2025
*************** constructible_expr (tree to, tree from)
*** 2330,2335 ****
--- 2330,2348 ----
    return expr;
  }
  
+ /* Return declval<T>().~T() treated as an unevaluated operand.  */
+ 
+ static tree
+ destructible_expr (tree to)
+ {
+   cp_unevaluated cp_uneval_guard;
+   int flags = LOOKUP_NORMAL|LOOKUP_DESTRUCTOR;
+   to = build_trait_object (to);
+   tree r = build_delete (input_location, TREE_TYPE (to), to,
+ 			 sfk_complete_destructor, flags, 0, tf_none);
+   return r;
+ }
+ 
  /* Returns a tree iff TO is assignable (if CODE is MODIFY_EXPR) or
     constructible (otherwise) from FROM, which is a single type for
     assignment or a list of types for construction.  */
*************** is_xible_helper (enum tree_code code, tr
*** 2346,2351 ****
--- 2359,2366 ----
    tree expr;
    if (code == MODIFY_EXPR)
      expr = assignable_expr (to, from);
+   else if (code == BIT_NOT_EXPR)
+     expr = destructible_expr (to);
    else if (trivial && TREE_VEC_LENGTH (from) > 1
  	   && cxx_dialect < cxx20)
      return error_mark_node; // only 0- and 1-argument ctors can be trivial
diff -Nrcpad gcc-16-20250525/gcc/cp/module.cc gcc-16-20250601/gcc/cp/module.cc
*** gcc-16-20250525/gcc/cp/module.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/module.cc	Sun Jun  1 22:32:14 2025
*************** module_state::write_namespaces (elf_out
*** 16865,16875 ****
--- 16865,16879 ----
    bytes_out sec (to);
    sec.begin ();
  
+   hash_map<tree, unsigned> ns_map;
+ 
    for (unsigned ix = 0; ix != num; ix++)
      {
        depset *b = spaces[ix];
        tree ns = b->get_entity ();
  
+       ns_map.put (ns, ix);
+ 
        /* This could be an anonymous namespace even for a named module,
  	 since we can still emit no-linkage decls.  */
        gcc_checking_assert (TREE_CODE (ns) == NAMESPACE_DECL);
*************** module_state::write_namespaces (elf_out
*** 16911,16916 ****
--- 16915,16945 ----
  	}
      }
  
+   /* Now write exported using-directives, as a sequence of 1-origin indices in
+      the spaces array (not entity indices): First the using namespace, then the
+      used namespaces.  And then a zero terminating the list.  :: is
+      represented as index -1.  */
+   auto emit_one_ns = [&](unsigned ix, tree ns) {
+     for (auto udir: NAMESPACE_LEVEL (ns)->using_directives)
+       {
+ 	if (TREE_CODE (udir) != USING_DECL || !DECL_MODULE_EXPORT_P (udir))
+ 	  continue;
+ 	tree ns2 = USING_DECL_DECLS (udir);
+ 	dump() && dump ("Writing using-directive in %N for %N",
+ 			ns, ns2);
+ 	sec.u (ix);
+ 	sec.u (*ns_map.get (ns2) + 1);
+       }
+   };
+   emit_one_ns (-1, global_namespace);
+   for (unsigned ix = 0; ix != num; ix++)
+     {
+       depset *b = spaces[ix];
+       tree ns = b->get_entity ();
+       emit_one_ns (ix + 1, ns);
+     }
+   sec.u (0);
+ 
    sec.end (to, to->name (MOD_SNAME_PFX ".nms"), crc_p);
    dump.outdent ();
  }
*************** module_state::read_namespaces (unsigned
*** 16929,16934 ****
--- 16958,16965 ----
    dump () && dump ("Reading namespaces");
    dump.indent ();
  
+   tree *ns_map = XALLOCAVEC (tree, num);
+ 
    for (unsigned ix = 0; ix != num; ix++)
      {
        unsigned entity_index = sec.u ();
*************** module_state::read_namespaces (unsigned
*** 16990,16995 ****
--- 17021,17028 ----
  	DECL_ATTRIBUTES (inner)
  	  = tree_cons (get_identifier ("abi_tag"), tags, DECL_ATTRIBUTES (inner));
  
+       ns_map[ix] = inner;
+ 
        /* Install the namespace.  */
        (*entity_ary)[entity_lwm + entity_index] = inner;
        if (DECL_MODULE_IMPORT_P (inner))
*************** module_state::read_namespaces (unsigned
*** 17004,17009 ****
--- 17037,17080 ----
  	    *slot = entity_lwm + entity_index;
  	}
      }
+ 
+   /* Read the exported using-directives.  */
+   while (unsigned ix = sec.u ())
+     {
+       tree ns;
+       if (ix == (unsigned)-1)
+ 	ns = global_namespace;
+       else
+ 	{
+ 	  if (--ix >= num)
+ 	    {
+ 	      sec.set_overrun ();
+ 	      break;
+ 	    }
+ 	  ns = ns_map [ix];
+ 	}
+       unsigned ix2 = sec.u ();
+       if (--ix2 >= num)
+ 	{
+ 	  sec.set_overrun ();
+ 	  break;
+ 	}
+       tree ns2 = ns_map [ix2];
+       if (directness)
+ 	{
+ 	  dump() && dump ("Reading using-directive in %N for %N",
+ 			  ns, ns2);
+ 	  /* In an export import this will mark the using-directive as
+ 	     exported, so it will be emitted again.  */
+ 	  add_using_namespace (ns, ns2);
+ 	}
+       else
+ 	/* Ignore using-directives from indirect imports, we only want them
+ 	   from our own imports.  */
+ 	dump() && dump ("Ignoring using-directive in %N for %N",
+ 			ns, ns2);
+     }
+ 
    dump.outdent ();
    if (!sec.end (from ()))
      return false;
diff -Nrcpad gcc-16-20250525/gcc/cp/name-lookup.cc gcc-16-20250601/gcc/cp/name-lookup.cc
*** gcc-16-20250525/gcc/cp/name-lookup.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/name-lookup.cc	Sun Jun  1 22:32:14 2025
*************** name_lookup::search_usings (tree scope)
*** 1049,1055 ****
    bool found = false;
    if (vec<tree, va_gc> *usings = NAMESPACE_LEVEL (scope)->using_directives)
      for (unsigned ix = usings->length (); ix--;)
!       found |= search_qualified ((*usings)[ix], true);
  
    /* Look in its inline children.  */
    if (vec<tree, va_gc> *inlinees = DECL_NAMESPACE_INLINEES (scope))
--- 1049,1055 ----
    bool found = false;
    if (vec<tree, va_gc> *usings = NAMESPACE_LEVEL (scope)->using_directives)
      for (unsigned ix = usings->length (); ix--;)
!       found |= search_qualified (strip_using_decl ((*usings)[ix]), true);
  
    /* Look in its inline children.  */
    if (vec<tree, va_gc> *inlinees = DECL_NAMESPACE_INLINEES (scope))
*************** name_lookup::queue_usings (using_queue&
*** 1121,1127 ****
  {
    if (usings)
      for (unsigned ix = usings->length (); ix--;)
!       queue_namespace (queue, depth, (*usings)[ix]);
  }
  
  /* Unqualified namespace lookup in SCOPE.
--- 1121,1127 ----
  {
    if (usings)
      for (unsigned ix = usings->length (); ix--;)
!       queue_namespace (queue, depth, strip_using_decl ((*usings)[ix]));
  }
  
  /* Unqualified namespace lookup in SCOPE.
*************** using_directives_contain_std_p (vec<tree
*** 6868,6874 ****
      return false;
  
    for (unsigned ix = usings->length (); ix--;)
!     if ((*usings)[ix] == std_node)
        return true;
  
    return false;
--- 6868,6874 ----
      return false;
  
    for (unsigned ix = usings->length (); ix--;)
!     if (strip_using_decl ((*usings)[ix]) == std_node)
        return true;
  
    return false;
*************** add_using_namespace (vec<tree, va_gc> *&
*** 8943,8951 ****
--- 8943,8969 ----
        if ((*usings)[ix] == target)
  	return;
  
+   if (modules_p ())
+     {
+       tree u = build_lang_decl (USING_DECL, NULL_TREE, NULL_TREE);
+       USING_DECL_DECLS (u) = target;
+       DECL_MODULE_EXPORT_P (u) = module_exporting_p ();
+       DECL_MODULE_PURVIEW_P (u) = module_purview_p ();
+       target = u;
+     }
    vec_safe_push (usings, target);
  }
  
+ /* Convenience overload for the above, taking the user as its first
+    parameter.  */
+ 
+ void
+ add_using_namespace (tree ns, tree target)
+ {
+   add_using_namespace (NAMESPACE_LEVEL (ns)->using_directives,
+ 		       ORIGINAL_NAMESPACE (target));
+ }
+ 
  /* Tell the debug system of a using directive.  */
  
  static void
diff -Nrcpad gcc-16-20250525/gcc/cp/name-lookup.h gcc-16-20250601/gcc/cp/name-lookup.h
*** gcc-16-20250525/gcc/cp/name-lookup.h	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/name-lookup.h	Sun Jun  1 22:32:14 2025
*************** extern cxx_binding *outer_binding (tree,
*** 462,467 ****
--- 462,468 ----
  extern void cp_emit_debug_info_for_using (tree, tree);
  
  extern void finish_nonmember_using_decl (tree scope, tree name);
+ extern void add_using_namespace (tree, tree);
  extern void finish_using_directive (tree target, tree attribs);
  void push_local_extern_decl_alias (tree decl);
  extern tree pushdecl (tree, bool hiding = false);
diff -Nrcpad gcc-16-20250525/gcc/cp/parser.cc gcc-16-20250601/gcc/cp/parser.cc
*** gcc-16-20250525/gcc/cp/parser.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/parser.cc	Sun Jun  1 22:32:14 2025
*************** cp_parser_jump_statement (cp_parser* par
*** 15431,15441 ****
  
      case RID_GOTO:
        if (parser->in_function_body
! 	  && DECL_DECLARED_CONSTEXPR_P (current_function_decl)
  	  && cxx_dialect < cxx23)
  	{
! 	  error ("%<goto%> in %<constexpr%> function only available with "
! 		 "%<-std=c++23%> or %<-std=gnu++23%>");
  	  cp_function_chain->invalid_constexpr = true;
  	}
  
--- 15431,15442 ----
  
      case RID_GOTO:
        if (parser->in_function_body
! 	  && maybe_constexpr_fn (current_function_decl)
  	  && cxx_dialect < cxx23)
  	{
! 	  if (DECL_DECLARED_CONSTEXPR_P (current_function_decl))
! 	    error ("%<goto%> in %<constexpr%> function only available with "
! 		   "%<-std=c++23%> or %<-std=gnu++23%>");
  	  cp_function_chain->invalid_constexpr = true;
  	}
  
*************** cp_parser_import_declaration (cp_parser
*** 15827,15833 ****
--- 15828,15840 ----
  		      " must not be from header inclusion");
  	}
  
+       auto mk = module_kind;
+       if (exporting)
+ 	module_kind |= MK_EXPORTING;
+ 
        import_module (mod, token->location, exporting, attrs, parse_in);
+ 
+       module_kind = mk;
      }
  }
  
*************** cp_parser_omp_clause_from_to (cp_parser
*** 42417,42429 ****
     map ( [map-type-modifier[,] ...] map-kind: variable-list )
  
     map-type-modifier:
!      always | close */
  
  static tree
! cp_parser_omp_clause_map (cp_parser *parser, tree list)
  {
    tree nlist, c;
!   enum gomp_map_kind kind = GOMP_MAP_TOFROM;
  
    if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
      return list;
--- 42424,42436 ----
     map ( [map-type-modifier[,] ...] map-kind: variable-list )
  
     map-type-modifier:
!      always | close | mapper ( mapper-name )  */
  
  static tree
! cp_parser_omp_clause_map (cp_parser *parser, tree list, bool declare_mapper_p)
  {
    tree nlist, c;
!   enum gomp_map_kind kind = declare_mapper_p ? GOMP_MAP_UNSET : GOMP_MAP_TOFROM;
  
    if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
      return list;
*************** cp_parser_omp_clause_map (cp_parser *par
*** 42441,42452 ****
--- 42448,42464 ----
  
        if (cp_lexer_peek_nth_token (parser->lexer, pos + 1)->type == CPP_COMMA)
  	pos++;
+       else if (cp_lexer_peek_nth_token (parser->lexer, pos + 1)->type
+ 	       == CPP_OPEN_PAREN)
+ 	pos = cp_parser_skip_balanced_tokens (parser, pos + 1);
        pos++;
      }
  
    bool always_modifier = false;
    bool close_modifier = false;
    bool present_modifier = false;
+   bool mapper_modifier = false;
+   tree mapper_name = NULL_TREE;
    for (int pos = 1; pos < map_kind_pos; ++pos)
      {
        cp_token *tok = cp_lexer_peek_token (parser->lexer);
*************** cp_parser_omp_clause_map (cp_parser *par
*** 42469,42474 ****
--- 42481,42487 ----
  	      return list;
  	    }
  	  always_modifier = true;
+ 	  cp_lexer_consume_token (parser->lexer);
  	}
        else if (strcmp ("close", p) == 0)
  	{
*************** cp_parser_omp_clause_map (cp_parser *par
*** 42482,42487 ****
--- 42495,42571 ----
  	      return list;
  	    }
  	  close_modifier = true;
+ 	  cp_lexer_consume_token (parser->lexer);
+ 	}
+       else if (strcmp ("mapper", p) == 0)
+ 	{
+ 	  cp_lexer_consume_token (parser->lexer);
+ 
+ 	  matching_parens parens;
+ 	  if (parens.require_open (parser))
+ 	    {
+ 	      if (mapper_modifier)
+ 		{
+ 		  cp_parser_error (parser, "too many %<mapper%> modifiers");
+ 		  /* Assume it's a well-formed mapper modifier, even if it
+ 		     seems to be in the wrong place.  */
+ 		  cp_lexer_consume_token (parser->lexer);
+ 		  parens.require_close (parser);
+ 		  cp_parser_skip_to_closing_parenthesis (parser,
+ 							 /*recovering=*/true,
+ 							 /*or_comma=*/false,
+ 							 /*consume_paren=*/
+ 							 true);
+ 		  return list;
+ 		}
+ 
+ 	      tok = cp_lexer_peek_token (parser->lexer);
+ 	      switch (tok->type)
+ 		{
+ 		case CPP_NAME:
+ 		  {
+ 		    cp_expr e = cp_parser_identifier (parser);
+ 		    if (e != error_mark_node)
+ 		      mapper_name = e;
+ 		    else
+ 		      goto err;
+ 		    if (declare_mapper_p)
+ 		      {
+ 			error_at (e.get_location (),
+ 				  "in %<declare mapper%> directives, parameter "
+ 				  "to %<mapper%> modifier must be %<default%>");
+ 		      }
+ 		  }
+ 		break;
+ 
+ 		case CPP_KEYWORD:
+ 		  if (tok->keyword == RID_DEFAULT)
+ 		    {
+ 		      cp_lexer_consume_token (parser->lexer);
+ 		      break;
+ 		    }
+ 		  /* Fallthrough.  */
+ 
+ 		default:
+ 		err:
+ 		  cp_parser_error (parser,
+ 				   "expected identifier or %<default%>");
+ 		  return list;
+ 		}
+ 
+ 	      if (!parens.require_close (parser))
+ 		{
+ 		  cp_parser_skip_to_closing_parenthesis (parser,
+ 							 /*recovering=*/true,
+ 							 /*or_comma=*/false,
+ 							 /*consume_paren=*/
+ 							 true);
+ 		  return list;
+ 		}
+ 
+ 	      mapper_modifier = true;
+ 	      pos += 3;
+ 	    }
  	}
        else if (strcmp ("present", p) == 0)
  	{
*************** cp_parser_omp_clause_map (cp_parser *par
*** 42495,42513 ****
  	      return list;
  	    }
  	  present_modifier = true;
!        }
        else
  	{
! 	  cp_parser_error (parser, "%<map%> clause with map-type modifier other"
! 				   " than %<always%>, %<close%> or %<present%>");
  	  cp_parser_skip_to_closing_parenthesis (parser,
  						 /*recovering=*/true,
  						 /*or_comma=*/false,
  						 /*consume_paren=*/true);
  	  return list;
  	}
- 
- 	cp_lexer_consume_token (parser->lexer);
      }
  
    if (cp_lexer_next_token_is (parser->lexer, CPP_NAME)
--- 42579,42597 ----
  	      return list;
  	    }
  	  present_modifier = true;
! 	  cp_lexer_consume_token (parser->lexer);
! 	}
        else
  	{
! 	  cp_parser_error (parser, "%<map%> clause with map-type modifier "
! 				   "other than %<always%>, %<close%>, "
! 				   "%<mapper%> or %<present%>");
  	  cp_parser_skip_to_closing_parenthesis (parser,
  						 /*recovering=*/true,
  						 /*or_comma=*/false,
  						 /*consume_paren=*/true);
  	  return list;
  	}
      }
  
    if (cp_lexer_next_token_is (parser->lexer, CPP_NAME)
*************** cp_parser_omp_clause_map (cp_parser *par
*** 42563,42570 ****
  					  NULL, true);
    finish_scope ();
  
    for (c = nlist; c != list; c = OMP_CLAUSE_CHAIN (c))
!     OMP_CLAUSE_SET_MAP_KIND (c, kind);
  
    return nlist;
  }
--- 42647,42676 ----
  					  NULL, true);
    finish_scope ();
  
+   tree last_new = NULL_TREE;
+ 
    for (c = nlist; c != list; c = OMP_CLAUSE_CHAIN (c))
!     {
!       OMP_CLAUSE_SET_MAP_KIND (c, kind);
!       last_new = c;
!     }
! 
!   if (mapper_name)
!     {
!       tree name = build_omp_clause (input_location, OMP_CLAUSE_MAP);
!       OMP_CLAUSE_SET_MAP_KIND (name, GOMP_MAP_PUSH_MAPPER_NAME);
!       OMP_CLAUSE_DECL (name) = mapper_name;
!       OMP_CLAUSE_CHAIN (name) = nlist;
!       nlist = name;
! 
!       gcc_assert (last_new);
! 
!       name = build_omp_clause (input_location, OMP_CLAUSE_MAP);
!       OMP_CLAUSE_SET_MAP_KIND (name, GOMP_MAP_POP_MAPPER_NAME);
!       OMP_CLAUSE_DECL (name) = null_pointer_node;
!       OMP_CLAUSE_CHAIN (name) = OMP_CLAUSE_CHAIN (last_new);
!       OMP_CLAUSE_CHAIN (last_new) = name;
!     }
  
    return nlist;
  }
*************** cp_parser_omp_all_clauses (cp_parser *pa
*** 43892,43898 ****
  	  c_name = "detach";
  	  break;
  	case PRAGMA_OMP_CLAUSE_MAP:
! 	  clauses = cp_parser_omp_clause_map (parser, clauses);
  	  c_name = "map";
  	  break;
  	case PRAGMA_OMP_CLAUSE_DEVICE:
--- 43998,44005 ----
  	  c_name = "detach";
  	  break;
  	case PRAGMA_OMP_CLAUSE_MAP:
! 	  clauses = cp_parser_omp_clause_map (parser, clauses,
! 					      /*mapper=*/false);
  	  c_name = "map";
  	  break;
  	case PRAGMA_OMP_CLAUSE_DEVICE:
*************** cp_parser_omp_target (cp_parser *parser,
*** 48898,48903 ****
--- 49005,49012 ----
  	OMP_CLAUSE_CHAIN (nc) = OMP_CLAUSE_CHAIN (c);
  	OMP_CLAUSE_CHAIN (c) = nc;
        }
+   if (!processing_template_decl)
+     clauses = c_omp_instantiate_mappers (clauses);
    clauses = finish_omp_clauses (clauses, C_ORT_OMP_TARGET);
  
    c_omp_adjust_map_clauses (clauses, true);
*************** cp_parser_omp_metadirective (cp_parser *
*** 51451,51457 ****
  	    {
  	      error_at (match_loc, "too many %<otherwise%> or %<default%> "
  			"clauses in %<metadirective%>");
- 	      cp_parser_skip_to_end_of_block_or_statement (parser, true);
  	      goto fail;
  	    }
  	  else
--- 51560,51565 ----
*************** cp_parser_omp_metadirective (cp_parser *
*** 51461,51474 ****
  	{
  	  error_at (match_loc, "%<otherwise%> or %<default%> clause "
  		    "must appear last in %<metadirective%>");
- 	  cp_parser_skip_to_end_of_block_or_statement (parser, true);
  	  goto fail;
  	}
        if (!default_p && strcmp (p, "when") != 0)
  	{
  	  error_at (match_loc, "%qs is not valid for %qs",
  		    p, "metadirective");
- 	  cp_parser_skip_to_end_of_block_or_statement (parser, true);
  	  goto fail;
  	}
  
--- 51569,51580 ----
*************** cp_parser_omp_metadirective (cp_parser *
*** 51537,51543 ****
        if (i == 0)
  	{
  	  error_at (loc, "expected directive name");
- 	  cp_parser_skip_to_end_of_block_or_statement (parser, true);
  	  goto fail;
  	}
  
--- 51643,51648 ----
*************** cp_parser_omp_metadirective (cp_parser *
*** 51610,51616 ****
  	      goto add;
  	    case CPP_CLOSE_PAREN:
  	      if (nesting_depth-- == 0)
! 		break;
  	      goto add;
  	    default:
  	    add:
--- 51715,51724 ----
  	      goto add;
  	    case CPP_CLOSE_PAREN:
  	      if (nesting_depth-- == 0)
! 		{
! 		  cp_lexer_consume_token (parser->lexer);
! 		  break;
! 		}
  	      goto add;
  	    default:
  	    add:
*************** cp_parser_omp_metadirective (cp_parser *
*** 51622,51629 ****
  	  break;
  	}
  
-       cp_lexer_consume_token (parser->lexer);
- 
        if (!skip)
  	{
  	  cp_token eol_token = {};
--- 51730,51735 ----
*************** cp_parser_omp_metadirective (cp_parser *
*** 51755,51765 ****
    return;
  
  fail:
!   /* Skip the metadirective pragma.  */
    cp_parser_skip_to_pragma_eol (parser, pragma_tok);
- 
-   /* Skip the metadirective body.  */
-   cp_parser_skip_to_end_of_block_or_statement (parser, true);
  }
  
  
--- 51861,51868 ----
    return;
  
  fail:
!   /* Skip the metadirective pragma.  Do not skip the metadirective body.  */
    cp_parser_skip_to_pragma_eol (parser, pragma_tok);
  }
  
  
*************** cp_parser_omp_declare_reduction (cp_pars
*** 52178,52183 ****
--- 52281,52455 ----
    obstack_free (&declarator_obstack, p);
  }
  
+ /* OpenMP 5.0
+    #pragma omp declare mapper([mapper-identifier:]type var) \
+ 	       [clause[[,] clause] ... ] new-line  */
+ 
+ static void
+ cp_parser_omp_declare_mapper (cp_parser *parser, cp_token *pragma_tok,
+ 			      enum pragma_context)
+ {
+   cp_token *token = NULL;
+   tree type = NULL_TREE, vardecl = NULL_TREE, block = NULL_TREE;
+   bool block_scope = false;
+   /* Don't create location wrapper nodes within "declare mapper"
+      directives.  */
+   auto_suppress_location_wrappers sentinel;
+   tree mapper_name = NULL_TREE;
+   tree mapper_id, id, placeholder, mapper, maplist = NULL_TREE;
+ 
+   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
+     goto fail;
+ 
+   if (current_function_decl)
+     block_scope = true;
+ 
+   token = cp_lexer_peek_token (parser->lexer);
+ 
+   if (cp_lexer_nth_token_is (parser->lexer, 2, CPP_COLON))
+     {
+       switch (token->type)
+ 	{
+ 	case CPP_NAME:
+ 	  {
+ 	    cp_expr e = cp_parser_identifier (parser);
+ 	    if (e != error_mark_node)
+ 	      mapper_name = e;
+ 	    else
+ 	      goto fail;
+ 	  }
+ 	  break;
+ 
+ 	case CPP_KEYWORD:
+ 	  if (token->keyword == RID_DEFAULT)
+ 	    {
+ 	      mapper_name = NULL_TREE;
+ 	      cp_lexer_consume_token (parser->lexer);
+ 	      break;
+ 	    }
+ 	  /* Fallthrough.  */
+ 
+ 	default:
+ 	  cp_parser_error (parser, "expected identifier or %<default%>");
+ 	}
+ 
+       if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
+ 	goto fail;
+     }
+ 
+   {
+     const char *saved_message = parser->type_definition_forbidden_message;
+     parser->type_definition_forbidden_message
+       = G_("types may not be defined within %<declare mapper%>");
+     type_id_in_expr_sentinel s (parser);
+     type = cp_parser_type_id (parser);
+     parser->type_definition_forbidden_message = saved_message;
+   }
+ 
+   if (type == error_mark_node)
+     goto fail;
+   if (dependent_type_p (type))
+     mapper_id = omp_mapper_id (mapper_name, NULL_TREE);
+   else
+     mapper_id = omp_mapper_id (mapper_name, type);
+ 
+   vardecl = build_lang_decl (VAR_DECL, mapper_id, type);
+   DECL_ARTIFICIAL (vardecl) = 1;
+   TREE_STATIC (vardecl) = 1;
+   TREE_PUBLIC (vardecl) = 0;
+   DECL_EXTERNAL (vardecl) = 0;
+   DECL_DECLARED_CONSTEXPR_P (vardecl) = 1;
+   DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (vardecl) = 1;
+   DECL_OMP_DECLARE_MAPPER_P (vardecl) = 1;
+ 
+   keep_next_level (true);
+   block = begin_omp_structured_block ();
+ 
+   if (block_scope)
+     DECL_CONTEXT (vardecl) = current_function_decl;
+   else if (current_class_type)
+     DECL_CONTEXT (vardecl) = current_class_type;
+   else
+     DECL_CONTEXT (vardecl) = current_namespace;
+ 
+   if (processing_template_decl)
+     vardecl = push_template_decl (vardecl);
+ 
+   if ((id = cp_parser_declarator_id (parser, false)) == error_mark_node)
+     goto fail;
+ 
+   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
+     {
+       finish_omp_structured_block (block);
+       goto fail;
+     }
+ 
+   placeholder = build_lang_decl (VAR_DECL, id, type);
+   DECL_CONTEXT (placeholder) = DECL_CONTEXT (vardecl);
+   if (processing_template_decl)
+     placeholder = push_template_decl (placeholder);
+   pushdecl (placeholder);
+   cp_finish_decl (placeholder, NULL_TREE, 0, NULL_TREE, 0);
+   DECL_ARTIFICIAL (placeholder) = 1;
+   TREE_USED (placeholder) = 1;
+ 
+   while (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL))
+     {
+       pragma_omp_clause c_kind = cp_parser_omp_clause_name (parser);
+       if (c_kind != PRAGMA_OMP_CLAUSE_MAP)
+ 	{
+ 	  if (c_kind != PRAGMA_OMP_CLAUSE_NONE)
+ 	    cp_parser_error (parser, "unexpected clause");
+ 	  finish_omp_structured_block (block);
+ 	  goto fail;
+ 	}
+       maplist = cp_parser_omp_clause_map (parser, maplist, /*mapper=*/true);
+       if (maplist == NULL_TREE)
+ 	break;
+     }
+ 
+   if (maplist == NULL_TREE)
+     {
+       cp_parser_error (parser, "missing %<map%> clause");
+       finish_omp_structured_block (block);
+       goto fail;
+     }
+ 
+   mapper = make_node (OMP_DECLARE_MAPPER);
+   TREE_TYPE (mapper) = type;
+   OMP_DECLARE_MAPPER_ID (mapper) = mapper_name;
+   OMP_DECLARE_MAPPER_DECL (mapper) = placeholder;
+   OMP_DECLARE_MAPPER_CLAUSES (mapper) = maplist;
+ 
+   finish_omp_structured_block (block);
+ 
+   DECL_INITIAL (vardecl) = mapper;
+ 
+   if (current_class_type)
+     {
+       if (processing_template_decl)
+ 	{
+ 	  retrofit_lang_decl (vardecl);
+ 	  SET_DECL_VAR_DECLARED_INLINE_P (vardecl);
+ 	}
+       finish_static_data_member_decl (vardecl, mapper,
+ 				      /*init_const_expr_p=*/true, NULL_TREE, 0);
+       finish_member_declaration (vardecl);
+     }
+   else if (processing_template_decl && block_scope)
+     add_decl_expr (vardecl);
+   else
+     pushdecl (vardecl);
+ 
+   cp_check_omp_declare_mapper (vardecl);
+ 
+   cp_parser_require_pragma_eol (parser, pragma_tok);
+   return;
+ 
+ fail:
+   cp_parser_skip_to_pragma_eol (parser, pragma_tok);
+ }
+ 
  /* OpenMP 4.0
     #pragma omp declare simd declare-simd-clauses[optseq] new-line
     #pragma omp declare reduction (reduction-id : typename-list : expression) \
*************** cp_parser_omp_declare (cp_parser *parser
*** 52222,52227 ****
--- 52494,52505 ----
  					   context);
  	  return false;
  	}
+       if (strcmp (p, "mapper") == 0)
+ 	{
+ 	  cp_lexer_consume_token (parser->lexer);
+ 	  cp_parser_omp_declare_mapper (parser, pragma_tok, context);
+ 	  return false;
+ 	}
        if (!flag_openmp)  /* flag_openmp_simd  */
  	{
  	  cp_parser_skip_to_pragma_eol (parser, pragma_tok);
*************** cp_parser_omp_declare (cp_parser *parser
*** 52235,52241 ****
  	}
      }
    cp_parser_error (parser, "expected %<simd%>, %<reduction%>, "
! 			   "%<target%> or %<variant%>");
    cp_parser_require_pragma_eol (parser, pragma_tok);
    return false;
  }
--- 52513,52519 ----
  	}
      }
    cp_parser_error (parser, "expected %<simd%>, %<reduction%>, "
! 			   "%<target%>, %<mapper%> or %<variant%>");
    cp_parser_require_pragma_eol (parser, pragma_tok);
    return false;
  }
diff -Nrcpad gcc-16-20250525/gcc/cp/pt.cc gcc-16-20250601/gcc/cp/pt.cc
*** gcc-16-20250525/gcc/cp/pt.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/pt.cc	Sun Jun  1 22:32:14 2025
*************** limit_bad_template_recursion (tree decl)
*** 11378,11383 ****
--- 11378,11384 ----
  static int tinst_depth;
  extern int max_tinst_depth;
  int depth_reached;
+ int tinst_dump_id;
  
  static GTY(()) struct tinst_level *last_error_tinst_level;
  
*************** push_tinst_level_loc (tree tldcl, tree t
*** 11430,11435 ****
--- 11431,11470 ----
    set_refcount_ptr (new_level->next, current_tinst_level);
    set_refcount_ptr (current_tinst_level, new_level);
  
+   if (cxx_dump_pretty_printer pp {tinst_dump_id})
+     {
+ #if __GNUC__ >= 10
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wformat-diag"
+ #endif
+       bool list_p = new_level->list_p ();
+       if (list_p && !pp.has_flag (TDF_DETAILS))
+ 	/* Skip non-instantiations unless -details.  */;
+       else
+ 	{
+ 	  if (tinst_depth == 0)
+ 	    pp_newline (&pp);
+ 	  if (loc && pp.has_flag (TDF_LINENO))
+ 	    {
+ 	      for (int i = 0; i < tinst_depth; ++i)
+ 		pp_space (&pp);
+ 	      const expanded_location el = expand_location (loc);
+ 	      pp_printf (&pp, "%s:%d:%d", el.file, el.line, el.column);
+ 	      pp_newline (&pp);
+ 	    }
+ 	  for (int i = 0; i < tinst_depth; ++i)
+ 	    pp_space (&pp);
+ 	  if (list_p)
+ 	    pp_printf (&pp, "S %S", new_level->get_node ());
+ 	  else
+ 	    pp_printf (&pp, "I %D", tldcl);
+ 	  pp_newline (&pp);
+ 	}
+ #if __GNUC__ >= 10
+ #pragma GCC diagnostic pop
+ #endif
+     }
+ 
    ++tinst_depth;
    if (GATHER_STATISTICS && (tinst_depth > depth_reached))
      depth_reached = tinst_depth;
*************** pop_tinst_level (void)
*** 11481,11486 ****
--- 11516,11535 ----
    --tinst_depth;
  }
  
+ /* True if the instantiation represented by LEVEL is complete.  */
+ 
+ static bool
+ tinst_complete_p (struct tinst_level *level)
+ {
+   gcc_assert (!level->list_p ());
+   tree node = level->get_node ();
+   if (TYPE_P (node))
+     return COMPLETE_TYPE_P (node);
+   else
+     return (DECL_TEMPLATE_INSTANTIATED (node)
+ 	    || DECL_TEMPLATE_SPECIALIZATION (node));
+ }
+ 
  /* We're instantiating a deferred template; restore the template
     instantiation context in which the instantiation was requested, which
     is one step out from LEVEL.  Return the corresponding DECL or TYPE.  */
*************** reopen_tinst_level (struct tinst_level *
*** 11499,11504 ****
--- 11548,11585 ----
    if (current_tinst_level && !current_tinst_level->had_errors)
      current_tinst_level->errors = errorcount+sorrycount;
  
+   if (cxx_dump_pretty_printer pp {tinst_dump_id})
+     {
+ #if __GNUC__ >= 10
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wformat-diag"
+ #endif
+       /* Dump the reopened instantiation context.  */
+       t = current_tinst_level;
+       if (!pp.has_flag (TDF_DETAILS))
+ 	/* Skip non-instantiations unless -details.  */
+ 	while (t && t->list_p ())
+ 	  t = t->next;
+       if (t)
+ 	{
+ 	  static tree last_ctx = NULL_TREE;
+ 	  tree ctx = t->get_node ();
+ 	  if (ctx != last_ctx)
+ 	    {
+ 	      last_ctx = ctx;
+ 	      pp_newline (&pp);
+ 	      if (t->list_p ())
+ 		pp_printf (&pp, "RS %S", ctx);
+ 	      else
+ 		pp_printf (&pp, "RI %D", ctx);
+ 	      pp_newline (&pp);
+ 	    }
+ 	}
+ #if __GNUC__ >= 10
+ #pragma GCC diagnostic pop
+ #endif
+     }
+ 
    tree decl = level->maybe_get_node ();
    if (decl && modules_p ())
      {
*************** tsubst_decl (tree t, tree args, tsubst_f
*** 15908,15914 ****
  		  = remove_attribute ("visibility", DECL_ATTRIBUTES (r));
  	      }
  	    determine_visibility (r);
! 	    if ((!local_p || TREE_STATIC (t)) && DECL_SECTION_NAME (t))
  	      set_decl_section_name (r, t);
  	  }
  
--- 15989,15998 ----
  		  = remove_attribute ("visibility", DECL_ATTRIBUTES (r));
  	      }
  	    determine_visibility (r);
! 	    if ((!local_p || TREE_STATIC (t))
! 		&& !(flag_openmp && DECL_LANG_SPECIFIC (t)
! 		     && DECL_OMP_DECLARE_MAPPER_P (t))
! 		&& DECL_SECTION_NAME (t))
  	      set_decl_section_name (r, t);
  	  }
  
*************** tsubst_decl (tree t, tree args, tsubst_f
*** 15960,15965 ****
--- 16044,16056 ----
  	      SET_TYPE_STRUCTURAL_EQUALITY (TREE_TYPE (r));
  	  }
  
+ 	if (flag_openmp
+ 	    && VAR_P (t)
+ 	    && DECL_LANG_SPECIFIC (t)
+ 	    && DECL_OMP_DECLARE_MAPPER_P (t)
+ 	    && strchr (IDENTIFIER_POINTER (DECL_NAME (t)), '~') == NULL)
+ 	  DECL_NAME (r) = omp_mapper_id (DECL_NAME (t), TREE_TYPE (r));
+ 
  	layout_decl (r, 0);
        }
        break;
*************** tsubst_omp_clauses (tree clauses, enum c
*** 18232,18239 ****
      }
  
    new_clauses = nreverse (new_clauses);
!   if (ort != C_ORT_OMP_DECLARE_SIMD)
      {
        new_clauses = finish_omp_clauses (new_clauses, ort);
        if (linear_no_step)
  	for (nc = new_clauses; nc; nc = OMP_CLAUSE_CHAIN (nc))
--- 18323,18332 ----
      }
  
    new_clauses = nreverse (new_clauses);
!   if (ort != C_ORT_OMP_DECLARE_SIMD && ort != C_ORT_OMP_DECLARE_MAPPER)
      {
+       if (ort == C_ORT_OMP_TARGET)
+ 	new_clauses = c_omp_instantiate_mappers (new_clauses);
        new_clauses = finish_omp_clauses (new_clauses, ort);
        if (linear_no_step)
  	for (nc = new_clauses; nc; nc = OMP_CLAUSE_CHAIN (nc))
*************** tsubst_stmt (tree t, tree args, tsubst_f
*** 19953,19958 ****
--- 20046,20067 ----
  	break;
        }
  
+     case OMP_DECLARE_MAPPER:
+       {
+ 	t = copy_node (t);
+ 
+ 	tree decl = OMP_DECLARE_MAPPER_DECL (t);
+ 	decl = tsubst (decl, args, complain, in_decl);
+ 	tree type = tsubst (TREE_TYPE (t), args, complain, in_decl);
+ 	tree clauses = OMP_DECLARE_MAPPER_CLAUSES (t);
+ 	clauses = tsubst_omp_clauses (clauses, C_ORT_OMP_DECLARE_MAPPER, args,
+ 				      complain, in_decl);
+ 	TREE_TYPE (t) = type;
+ 	OMP_DECLARE_MAPPER_DECL (t) = decl;
+ 	OMP_DECLARE_MAPPER_CLAUSES (t) = clauses;
+ 	RETURN (t);
+       }
+ 
      case TRANSACTION_EXPR:
        {
  	int flags = 0;
*************** tsubst_expr (tree t, tree args, tsubst_f
*** 21012,21017 ****
--- 21121,21143 ----
  	RETURN (build_omp_array_section (EXPR_LOCATION (t), op0, op1, op2));
        }
  
+     case OMP_DECLARE_MAPPER:
+       {
+ 	t = copy_node (t);
+ 
+ 	tree decl = OMP_DECLARE_MAPPER_DECL (t);
+ 	DECL_OMP_DECLARE_MAPPER_P (decl) = 1;
+ 	decl = tsubst (decl, args, complain, in_decl);
+ 	tree type = tsubst (TREE_TYPE (t), args, complain, in_decl);
+ 	tree clauses = OMP_DECLARE_MAPPER_CLAUSES (t);
+ 	clauses = tsubst_omp_clauses (clauses, C_ORT_OMP_DECLARE_MAPPER, args,
+ 				      complain, in_decl);
+ 	TREE_TYPE (t) = type;
+ 	OMP_DECLARE_MAPPER_DECL (t) = decl;
+ 	OMP_DECLARE_MAPPER_CLAUSES (t) = clauses;
+ 	RETURN (t);
+       }
+ 
      case SIZEOF_EXPR:
        if (PACK_EXPANSION_P (TREE_OPERAND (t, 0))
  	  || ARGUMENT_PACK_P (TREE_OPERAND (t, 0)))
*************** instantiate_decl (tree d, bool defer_ok,
*** 27955,27961 ****
        || (external_p && VAR_P (d))
        /* Handle here a deleted function too, avoid generating
  	 its body (c++/61080).  */
!       || deleted_p)
      {
        /* The definition of the static data member is now required so
  	 we must substitute the initializer.  */
--- 28081,28089 ----
        || (external_p && VAR_P (d))
        /* Handle here a deleted function too, avoid generating
  	 its body (c++/61080).  */
!       || deleted_p
!       /* We need the initializer for an OpenMP declare mapper.  */
!       || (VAR_P (d) && DECL_LANG_SPECIFIC (d) && DECL_OMP_DECLARE_MAPPER_P (d)))
      {
        /* The definition of the static data member is now required so
  	 we must substitute the initializer.  */
*************** instantiate_pending_templates (int retri
*** 28068,28081 ****
        reconsider = 0;
        while (*t)
  	{
! 	  tree instantiation = reopen_tinst_level ((*t)->tinst);
! 	  bool complete = false;
  
! 	  if (limit_bad_template_recursion (instantiation))
! 	    /* Do nothing.  */;
! 	  else if (TYPE_P (instantiation))
  	    {
! 	      if (!COMPLETE_TYPE_P (instantiation))
  		{
  		  instantiate_class_template (instantiation);
  		  if (CLASSTYPE_TEMPLATE_INSTANTIATION (instantiation))
--- 28196,28211 ----
        reconsider = 0;
        while (*t)
  	{
! 	  struct tinst_level *tinst = (*t)->tinst;
! 	  bool complete = tinst_complete_p (tinst);
  
! 	  if (!complete)
  	    {
! 	      tree instantiation = reopen_tinst_level (tinst);
! 
! 	      if (limit_bad_template_recursion (instantiation))
! 		/* Do nothing.  */;
! 	      else if (TYPE_P (instantiation))
  		{
  		  instantiate_class_template (instantiation);
  		  if (CLASSTYPE_TEMPLATE_INSTANTIATION (instantiation))
*************** instantiate_pending_templates (int retri
*** 28092,28104 ****
  		  if (COMPLETE_TYPE_P (instantiation))
  		    reconsider = 1;
  		}
! 
! 	      complete = COMPLETE_TYPE_P (instantiation);
! 	    }
! 	  else
! 	    {
! 	      if (!DECL_TEMPLATE_SPECIALIZATION (instantiation)
! 		  && !DECL_TEMPLATE_INSTANTIATED (instantiation))
  		{
  		  instantiation
  		    = instantiate_decl (instantiation,
--- 28222,28228 ----
  		  if (COMPLETE_TYPE_P (instantiation))
  		    reconsider = 1;
  		}
! 	      else
  		{
  		  instantiation
  		    = instantiate_decl (instantiation,
*************** instantiate_pending_templates (int retri
*** 28108,28115 ****
  		    reconsider = 1;
  		}
  
! 	      complete = (DECL_TEMPLATE_SPECIALIZATION (instantiation)
! 			  || DECL_TEMPLATE_INSTANTIATED (instantiation));
  	    }
  
  	  if (complete)
--- 28232,28241 ----
  		    reconsider = 1;
  		}
  
! 	      complete = tinst_complete_p (tinst);
! 
! 	      tinst_depth = 0;
! 	      set_refcount_ptr (current_tinst_level);
  	    }
  
  	  if (complete)
*************** instantiate_pending_templates (int retri
*** 28126,28133 ****
  	      last = *t;
  	      t = &(*t)->next;
  	    }
- 	  tinst_depth = 0;
- 	  set_refcount_ptr (current_tinst_level);
  	}
        last_pending_template = last;
      }
--- 28252,28257 ----
diff -Nrcpad gcc-16-20250525/gcc/cp/semantics.cc gcc-16-20250601/gcc/cp/semantics.cc
*** gcc-16-20250525/gcc/cp/semantics.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/semantics.cc	Sun Jun  1 22:32:14 2025
*************** along with GCC; see the file COPYING3.
*** 45,50 ****
--- 45,51 ----
  #include "gomp-constants.h"
  #include "predict.h"
  #include "memmodel.h"
+ #include "gimplify.h"
  
  /* There routines provide a modular interface to perform many parsing
     operations.  They may therefore be used during actual parsing, or
*************** finish_non_static_data_member (tree decl
*** 2770,2776 ****
        else if (PACK_EXPANSION_P (type))
  	/* Don't bother trying to represent this.  */
  	type = NULL_TREE;
!       else if (WILDCARD_TYPE_P (TREE_TYPE (object)))
  	/* We don't know what the eventual quals will be, so punt until
  	   instantiation time.
  
--- 2771,2777 ----
        else if (PACK_EXPANSION_P (type))
  	/* Don't bother trying to represent this.  */
  	type = NULL_TREE;
!       else if (!TREE_TYPE (object) || WILDCARD_TYPE_P (TREE_TYPE (object)))
  	/* We don't know what the eventual quals will be, so punt until
  	   instantiation time.
  
*************** finish_this_expr (void)
*** 3605,3620 ****
  {
    tree result = NULL_TREE;
  
!   if (current_class_ptr)
!     {
!       tree type = TREE_TYPE (current_class_ref);
! 
!       /* In a lambda expression, 'this' refers to the captured 'this'.  */
!       if (LAMBDA_TYPE_P (type))
!         result = lambda_expr_this_capture (CLASSTYPE_LAMBDA_EXPR (type), true);
!       else
!         result = current_class_ptr;
!     }
  
    if (result)
      /* The keyword 'this' is a prvalue expression.  */
--- 3606,3616 ----
  {
    tree result = NULL_TREE;
  
!   if (current_class_type && LAMBDA_TYPE_P (current_class_type))
!     result = (lambda_expr_this_capture
! 	      (CLASSTYPE_LAMBDA_EXPR (current_class_type), /*add*/true));
!   else if (current_class_ptr)
!     result = current_class_ptr;
  
    if (result)
      /* The keyword 'this' is a prvalue expression.  */
*************** omp_reduction_lookup (location_t loc, tr
*** 6745,6750 ****
--- 6741,6837 ----
    return id;
  }
  
+ /* Return identifier to look up for omp declare mapper.  */
+ 
+ tree
+ omp_mapper_id (tree mapper_id, tree type)
+ {
+   const char *p = NULL;
+   const char *m = NULL;
+ 
+   if (mapper_id == NULL_TREE)
+     p = "";
+   else if (TREE_CODE (mapper_id) == IDENTIFIER_NODE)
+     p = IDENTIFIER_POINTER (mapper_id);
+   else
+     return error_mark_node;
+ 
+   if (type != NULL_TREE)
+     m = mangle_type_string (TYPE_MAIN_VARIANT (type));
+ 
+   const char prefix[] = "omp declare mapper ";
+   size_t lenp = sizeof (prefix);
+   if (strncmp (p, prefix, lenp - 1) == 0)
+     lenp = 1;
+   size_t len = strlen (p);
+   size_t lenm = m ? strlen (m) + 1 : 0;
+   char *name = XALLOCAVEC (char, lenp + len + lenm);
+   memcpy (name, prefix, lenp - 1);
+   memcpy (name + lenp - 1, p, len + 1);
+   if (m)
+     {
+       name[lenp + len - 1] = '~';
+       memcpy (name + lenp + len, m, lenm);
+     }
+   return get_identifier (name);
+ }
+ 
+ tree
+ cxx_omp_mapper_lookup (tree id, tree type)
+ {
+   if (!RECORD_OR_UNION_TYPE_P (type))
+     return NULL_TREE;
+   id = omp_mapper_id (id, type);
+   return lookup_name (id);
+ }
+ 
+ tree
+ cxx_omp_extract_mapper_directive (tree vardecl)
+ {
+   gcc_assert (TREE_CODE (vardecl) == VAR_DECL);
+ 
+   /* Instantiate the decl if we haven't already.  */
+   mark_used (vardecl);
+   tree body = DECL_INITIAL (vardecl);
+ 
+   if (TREE_CODE (body) == STATEMENT_LIST)
+     {
+       tree_stmt_iterator tsi = tsi_start (body);
+       gcc_assert (TREE_CODE (tsi_stmt (tsi)) == DECL_EXPR);
+       tsi_next (&tsi);
+       body = tsi_stmt (tsi);
+     }
+ 
+   gcc_assert (TREE_CODE (body) == OMP_DECLARE_MAPPER);
+ 
+   return body;
+ }
+ 
+ /* For now we can handle singleton OMP_ARRAY_SECTIONs with custom mappers, but
+    nothing more complicated.  */
+ 
+ tree
+ cxx_omp_map_array_section (location_t loc, tree t)
+ {
+   tree low = TREE_OPERAND (t, 1);
+   tree len = TREE_OPERAND (t, 2);
+ 
+   if (len && integer_onep (len))
+     {
+       t = TREE_OPERAND (t, 0);
+ 
+       if (!low)
+ 	low = integer_zero_node;
+ 
+       if (TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE)
+ 	t = convert_from_reference (t);
+ 
+       t = build_array_ref (loc, t, low);
+     }
+ 
+   return t;
+ }
+ 
  /* Helper function for cp_parser_omp_declare_reduction_exprs
     and tsubst_omp_udr.
     Remove CLEANUP_STMT for data (omp_priv variable).
*************** finish_omp_reduction_clause (tree c, boo
*** 7226,7231 ****
--- 7313,7345 ----
    return false;
  }
  
+ /* Check an instance of an "omp declare mapper" function.  */
+ 
+ bool
+ cp_check_omp_declare_mapper (tree udm)
+ {
+   tree type = TREE_TYPE (udm);
+   location_t loc = DECL_SOURCE_LOCATION (udm);
+ 
+   if (type == error_mark_node)
+     return false;
+ 
+   if (!processing_template_decl && !RECORD_OR_UNION_TYPE_P (type))
+     {
+       error_at (loc, "%qT is not a struct, union or class type in "
+ 		"%<#pragma omp declare mapper%>", type);
+       return false;
+     }
+   if (!processing_template_decl && CLASSTYPE_VBASECLASSES (type))
+     {
+       error_at (loc, "%qT must not be a virtual base class in "
+ 		"%<#pragma omp declare mapper%>", type);
+       return false;
+     }
+ 
+   return true;
+ }
+ 
  /* Called from finish_struct_1.  linear(this) or linear(this:step)
     clauses might not be finalized yet because the class has been incomplete
     when parsing #pragma omp declare simd methods.  Fix those up now.  */
*************** finish_omp_clauses (tree clauses, enum c
*** 8870,8875 ****
--- 8984,8995 ----
  	case OMP_CLAUSE_MAP:
  	  if (OMP_CLAUSE_MAP_IMPLICIT (c) && !implicit_moved)
  	    goto move_implicit;
+ 	  if (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_PUSH_MAPPER_NAME
+ 	      || OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_POP_MAPPER_NAME)
+ 	    {
+ 	      remove = true;
+ 	      break;
+ 	    }
  	  /* FALLTHRU */
  	case OMP_CLAUSE_TO:
  	case OMP_CLAUSE_FROM:
*************** struct omp_target_walk_data
*** 10489,10494 ****
--- 10609,10616 ----
    /* Local variables declared inside a BIND_EXPR, used to filter out such
       variables when recording lambda_objects_accessed.  */
    hash_set<tree> local_decls;
+ 
+   omp_mapper_list<tree> *mappers;
  };
  
  /* Helper function of finish_omp_target_clauses, called via
*************** finish_omp_target_clauses_r (tree *tp, i
*** 10502,10507 ****
--- 10624,10630 ----
    struct omp_target_walk_data *data = (struct omp_target_walk_data *) ptr;
    tree current_object = data->current_object;
    tree current_closure = data->current_closure;
+   omp_mapper_list<tree> *mlist = data->mappers;
  
    /* References inside of these expression codes shouldn't incur any
       form of mapping, so return early.  */
*************** finish_omp_target_clauses_r (tree *tp, i
*** 10515,10520 ****
--- 10638,10664 ----
    if (TREE_CODE (t) == OMP_CLAUSE)
      return NULL_TREE;
  
+   if (!processing_template_decl)
+     {
+       tree aggr_type = NULL_TREE;
+ 
+       if (TREE_CODE (t) == COMPONENT_REF
+ 	  && RECORD_OR_UNION_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
+ 	aggr_type = TREE_TYPE (TREE_OPERAND (t, 0));
+       else if ((TREE_CODE (t) == VAR_DECL
+ 		|| TREE_CODE (t) == PARM_DECL
+ 		|| TREE_CODE (t) == RESULT_DECL)
+ 	       && RECORD_OR_UNION_TYPE_P (TREE_TYPE (t)))
+ 	aggr_type = TREE_TYPE (t);
+ 
+       if (aggr_type)
+ 	{
+ 	  tree mapper_fn = cxx_omp_mapper_lookup (NULL_TREE, aggr_type);
+ 	  if (mapper_fn)
+ 	    mlist->add_mapper (NULL_TREE, aggr_type, mapper_fn);
+ 	}
+     }
+ 
    if (current_object)
      {
        tree this_expr = TREE_OPERAND (current_object, 0);
*************** finish_omp_target_clauses_r (tree *tp, i
*** 10565,10574 ****
  
    if (TREE_CODE (t) == BIND_EXPR)
      {
!       tree block = BIND_EXPR_BLOCK (t);
!       for (tree var = BLOCK_VARS (block); var; var = DECL_CHAIN (var))
! 	if (!data->local_decls.contains (var))
! 	  data->local_decls.add (var);
        return NULL_TREE;
      }
  
--- 10709,10718 ----
  
    if (TREE_CODE (t) == BIND_EXPR)
      {
!       if (tree block = BIND_EXPR_BLOCK (t))
! 	for (tree var = BLOCK_VARS (block); var; var = DECL_CHAIN (var))
! 	  if (!data->local_decls.contains (var))
! 	    data->local_decls.add (var);
        return NULL_TREE;
      }
  
*************** finish_omp_target_clauses (location_t lo
*** 10617,10626 ****
    else
      data.current_closure = NULL_TREE;
  
-   cp_walk_tree_without_duplicates (&body, finish_omp_target_clauses_r, &data);
- 
    auto_vec<tree, 16> new_clauses;
  
    tree omp_target_this_expr = NULL_TREE;
    tree *explicit_this_deref_map = NULL;
    if (data.this_expr_accessed)
--- 10761,10808 ----
    else
      data.current_closure = NULL_TREE;
  
    auto_vec<tree, 16> new_clauses;
  
+   if (!processing_template_decl)
+     {
+       hash_set<omp_name_type<tree> > seen_types;
+       auto_vec<tree> mapper_fns;
+       omp_mapper_list<tree> mlist (&seen_types, &mapper_fns);
+       data.mappers = &mlist;
+ 
+       cp_walk_tree_without_duplicates (&body, finish_omp_target_clauses_r,
+ 				       &data);
+ 
+       unsigned int i;
+       tree mapper_fn;
+       FOR_EACH_VEC_ELT (mapper_fns, i, mapper_fn)
+ 	c_omp_find_nested_mappers (&mlist, mapper_fn);
+ 
+       FOR_EACH_VEC_ELT (mapper_fns, i, mapper_fn)
+ 	{
+ 	  tree mapper = cxx_omp_extract_mapper_directive (mapper_fn);
+ 	  if (mapper == error_mark_node)
+ 	    continue;
+ 	  tree mapper_name = OMP_DECLARE_MAPPER_ID (mapper);
+ 	  tree decl = OMP_DECLARE_MAPPER_DECL (mapper);
+ 	  if (BASELINK_P (mapper_fn))
+ 	    mapper_fn = BASELINK_FUNCTIONS (mapper_fn);
+ 
+ 	  tree c = build_omp_clause (loc, OMP_CLAUSE__MAPPER_BINDING_);
+ 	  OMP_CLAUSE__MAPPER_BINDING__ID (c) = mapper_name;
+ 	  OMP_CLAUSE__MAPPER_BINDING__DECL (c) = decl;
+ 	  OMP_CLAUSE__MAPPER_BINDING__MAPPER (c) = mapper_fn;
+ 
+ 	  new_clauses.safe_push (c);
+ 	}
+     }
+   else
+     {
+       data.mappers = NULL;
+       cp_walk_tree_without_duplicates (&body, finish_omp_target_clauses_r,
+ 				       &data);
+     }
+ 
    tree omp_target_this_expr = NULL_TREE;
    tree *explicit_this_deref_map = NULL;
    if (data.this_expr_accessed)
*************** trait_expr_value (cp_trait_kind kind, tr
*** 13235,13240 ****
--- 13417,13430 ----
  
      case CPTK_HAS_TRIVIAL_DESTRUCTOR:
        type1 = strip_array_types (type1);
+       if (CLASS_TYPE_P (type1) && type_build_dtor_call (type1))
+ 	{
+ 	  deferring_access_check_sentinel dacs (dk_no_check);
+ 	  tree fn = get_dtor (type1, tf_none);
+ 	  if (!fn && !seen_error ())
+ 	    warning (0, "checking %qs for type %qT with a destructor that "
+ 		     "cannot be called", "__has_trivial_destructor", type1);
+ 	}
        return (trivial_type_p (type1) || type_code1 == REFERENCE_TYPE
  	      || (CLASS_TYPE_P (type1)
  		  && TYPE_HAS_TRIVIAL_DESTRUCTOR (type1)));
*************** trait_expr_value (cp_trait_kind kind, tr
*** 13290,13295 ****
--- 13480,13488 ----
      case CPTK_IS_CONVERTIBLE:
        return is_convertible (type1, type2);
  
+     case CPTK_IS_DESTRUCTIBLE:
+       return is_xible (BIT_NOT_EXPR, type1, NULL_TREE);
+ 
      case CPTK_IS_EMPTY:
        return NON_UNION_CLASS_TYPE_P (type1) && CLASSTYPE_EMPTY_P (type1);
  
*************** trait_expr_value (cp_trait_kind kind, tr
*** 13329,13334 ****
--- 13522,13530 ----
      case CPTK_IS_NOTHROW_CONVERTIBLE:
        return is_nothrow_convertible (type1, type2);
  
+     case CPTK_IS_NOTHROW_DESTRUCTIBLE:
+       return is_nothrow_xible (BIT_NOT_EXPR, type1, NULL_TREE);
+ 
      case CPTK_IS_NOTHROW_INVOCABLE:
        return expr_noexcept_p (build_invoke (type1, type2, tf_none), tf_none);
  
*************** trait_expr_value (cp_trait_kind kind, tr
*** 13371,13376 ****
--- 13567,13575 ----
      case CPTK_IS_TRIVIALLY_COPYABLE:
        return trivially_copyable_p (type1);
  
+     case CPTK_IS_TRIVIALLY_DESTRUCTIBLE:
+       return is_trivially_xible (BIT_NOT_EXPR, type1, NULL_TREE);
+ 
      case CPTK_IS_UNBOUNDED_ARRAY:
        return array_of_unknown_bound_p (type1);
  
*************** finish_trait_expr (location_t loc, cp_tr
*** 13543,13548 ****
--- 13742,13750 ----
      case CPTK_HAS_NOTHROW_COPY:
      case CPTK_HAS_TRIVIAL_COPY:
      case CPTK_HAS_TRIVIAL_DESTRUCTOR:
+     case CPTK_IS_DESTRUCTIBLE:
+     case CPTK_IS_NOTHROW_DESTRUCTIBLE:
+     case CPTK_IS_TRIVIALLY_DESTRUCTIBLE:
        if (!check_trait_type (type1))
  	return error_mark_node;
        break;
diff -Nrcpad gcc-16-20250525/gcc/cp/typeck.cc gcc-16-20250601/gcc/cp/typeck.cc
*** gcc-16-20250525/gcc/cp/typeck.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/cp/typeck.cc	Sun Jun  1 22:32:14 2025
*************** check_return_expr (tree retval, bool *no
*** 11466,11472 ****
        /* Don't check copy-initialization for NRV in a coroutine ramp; we
  	 implement this case as NRV, but it's specified as directly
  	 initializing the return value from get_return_object().  */
!       if (DECL_RAMP_FN (current_function_decl) && named_return_value_okay_p)
  	converted = true;
  
        /* First convert the value to the function's return type, then
--- 11466,11472 ----
        /* Don't check copy-initialization for NRV in a coroutine ramp; we
  	 implement this case as NRV, but it's specified as directly
  	 initializing the return value from get_return_object().  */
!       if (DECL_RAMP_P (current_function_decl) && named_return_value_okay_p)
  	converted = true;
  
        /* First convert the value to the function's return type, then
diff -Nrcpad gcc-16-20250525/gcc/diagnostic-format-html.cc gcc-16-20250601/gcc/diagnostic-format-html.cc
*** gcc-16-20250525/gcc/diagnostic-format-html.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/diagnostic-format-html.cc	Sun Jun  1 22:32:14 2025
*************** along with GCC; see the file COPYING3.
*** 20,25 ****
--- 20,26 ----
  
  #include "config.h"
  #define INCLUDE_MAP
+ #define INCLUDE_STRING
  #define INCLUDE_VECTOR
  #include "system.h"
  #include "coretypes.h"
*************** along with GCC; see the file COPYING3.
*** 36,41 ****
--- 37,53 ----
  #include "pretty-print-urlifier.h"
  #include "edit-context.h"
  #include "intl.h"
+ #include "xml.h"
+ #include "xml-printer.h"
+ #include "json.h"
+ 
+ // struct html_generation_options
+ 
+ html_generation_options::html_generation_options ()
+ : m_css (true),
+   m_javascript (true)
+ {
+ }
  
  namespace xml {
  
*************** namespace xml {
*** 46,102 ****
  #  pragma GCC diagnostic ignored "-Wformat-diag"
  #endif
  
- struct node
- {
-   virtual ~node () {}
-   virtual void write_as_xml (pretty_printer *pp,
- 			     int depth, bool indent) const = 0;
-   void dump (FILE *out) const;
-   void DEBUG_FUNCTION dump () const { dump (stderr); }
- };
- 
- struct text : public node
- {
-   text (label_text str)
-   : m_str (std::move (str))
-   {}
- 
-   void write_as_xml (pretty_printer *pp,
- 		     int depth, bool indent) const final override;
- 
-   label_text m_str;
- };
- 
- struct node_with_children : public node
- {
-   void add_child (std::unique_ptr<node> node);
-   void add_text (label_text str);
- 
-   std::vector<std::unique_ptr<node>> m_children;
- };
- 
- struct document : public node_with_children
- {
-   void write_as_xml (pretty_printer *pp,
- 		     int depth, bool indent) const final override;
- };
- 
- struct element : public node_with_children
- {
-   element (const char *kind, bool preserve_whitespace)
-   : m_kind (kind),
-     m_preserve_whitespace (preserve_whitespace)
-   {}
- 
-   void write_as_xml (pretty_printer *pp,
- 		     int depth, bool indent) const final override;
- 
-   void set_attr (const char *name, label_text value);
- 
-   const char *m_kind;
-   bool m_preserve_whitespace;
-   std::map<const char *, label_text> m_attributes;
- };
  
  /* Implementation.  */
  
--- 58,63 ----
*************** node::dump (FILE *out) const
*** 146,154 ****
  /* struct text : public node.  */
  
  void
! text::write_as_xml (pretty_printer *pp, int /*depth*/, bool /*indent*/) const
  {
!   write_escaped_text (pp, m_str.get ());
  }
  
  /* struct node_with_children : public node.  */
--- 107,122 ----
  /* struct text : public node.  */
  
  void
! text::write_as_xml (pretty_printer *pp, int depth, bool indent) const
  {
!   if (indent)
!     {
!       for (int i = 0; i < depth; ++i)
! 	pp_string (pp, "  ");
!     }
!   write_escaped_text (pp, m_str.c_str ());
!   if (indent)
!     pp_newline (pp);
  }
  
  /* struct node_with_children : public node.  */
*************** node_with_children::add_child (std::uniq
*** 161,169 ****
  }
  
  void
! node_with_children::add_text (label_text str)
  {
!   gcc_assert (str.get ());
    add_child (std::make_unique <text> (std::move (str)));
  }
  
--- 129,143 ----
  }
  
  void
! node_with_children::add_text (std::string str)
  {
!   // Consolidate runs of text
!   if (!m_children.empty ())
!     if (text *t = m_children.back ()->dyn_cast_text ())
!       {
! 	t->m_str += std::move (str);
! 	return;
!       }
    add_child (std::make_unique <text> (std::move (str)));
  }
  
*************** document::write_as_xml (pretty_printer *
*** 177,182 ****
--- 151,158 ----
    pp_string (pp, "<!DOCTYPE html\n"
  	     "     PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n"
  	     "     \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">");
+   if (indent)
+     pp_newline (pp);
    for (auto &iter : m_children)
      iter->write_as_xml (pp, depth, indent);
  }
*************** element::write_as_xml (pretty_printer *p
*** 188,235 ****
  {
    if (indent)
      {
-       pp_newline (pp);
        for (int i = 0; i < depth; ++i)
  	pp_string (pp, "  ");
      }
  
!   if (m_preserve_whitespace)
!     indent = false;
! 
!   pp_printf (pp, "<%s", m_kind);
!   for (auto &attr : m_attributes)
      {
!       pp_printf (pp, " %s=\"", attr.first);
!       write_escaped_text (pp, attr.second.get ());
!       pp_string (pp, "\"");
      }
    if (m_children.empty ())
!     pp_string (pp, " />");
    else
      {
        pp_string (pp, ">");
        for (auto &child : m_children)
! 	child->write_as_xml (pp, depth + 1, indent);
!       if (indent)
  	{
- 	  pp_newline (pp);
  	  for (int i = 0; i < depth; ++i)
  	    pp_string (pp, "  ");
  	}
!       pp_printf (pp, "</%s>", m_kind);
      }
  }
  
  void
! element::set_attr (const char *name, label_text value)
  {
    m_attributes[name] = std::move (value);
  }
  
  #if __GNUC__ >= 10
  #  pragma GCC diagnostic pop
  #endif
  
  } // namespace xml
  
  class html_builder;
--- 164,302 ----
  {
    if (indent)
      {
        for (int i = 0; i < depth; ++i)
  	pp_string (pp, "  ");
      }
  
!   pp_printf (pp, "<%s", m_kind.c_str ());
!   for (auto &key : m_key_insertion_order)
      {
!       auto iter = m_attributes.find (key);
!       if (iter != m_attributes.end ())
! 	{
! 	  pp_printf (pp, " %s=\"", key.c_str ());
! 	  write_escaped_text (pp, iter->second.c_str ());
! 	  pp_string (pp, "\"");
! 	}
      }
    if (m_children.empty ())
!     pp_string (pp, "/>");
    else
      {
+       const bool indent_children = m_preserve_whitespace ? false : indent;
        pp_string (pp, ">");
+       if (indent_children)
+ 	pp_newline (pp);
        for (auto &child : m_children)
! 	child->write_as_xml (pp, depth + 1, indent_children);
!       if (indent_children)
  	{
  	  for (int i = 0; i < depth; ++i)
  	    pp_string (pp, "  ");
  	}
!       pp_printf (pp, "</%s>", m_kind.c_str ());
      }
+ 
+   if (indent)
+     pp_newline (pp);
  }
  
  void
! element::set_attr (const char *name, std::string value)
  {
+   auto iter = m_attributes.find (name);
+   if (iter == m_attributes.end ())
+     m_key_insertion_order.push_back (name);
    m_attributes[name] = std::move (value);
  }
  
+ // struct raw : public node
+ 
+ void
+ raw::write_as_xml (pretty_printer *pp,
+ 		   int /*depth*/, bool /*indent*/) const
+ {
+   pp_string (pp, m_xml_src.c_str ());
+ }
+ 
  #if __GNUC__ >= 10
  #  pragma GCC diagnostic pop
  #endif
  
+ // class printer
+ 
+ printer::printer (element &insertion_point)
+ {
+   m_open_tags.push_back (&insertion_point);
+ }
+ 
+ void
+ printer::push_tag (std::string name,
+ 		   bool preserve_whitespace)
+ {
+   push_element
+     (std::make_unique<element> (std::move (name),
+ 				preserve_whitespace));
+ }
+ 
+ void
+ printer::push_tag_with_class (std::string name, std::string class_,
+ 			      bool preserve_whitespace)
+ {
+   auto new_element
+     = std::make_unique<element> (std::move (name),
+ 				 preserve_whitespace);
+   new_element->set_attr ("class", class_);
+   push_element (std::move (new_element));
+ }
+ 
+ void
+ printer::pop_tag ()
+ {
+   m_open_tags.pop_back ();
+ }
+ 
+ void
+ printer::set_attr (const char *name, std::string value)
+ {
+   m_open_tags.back ()->set_attr (name, value);
+ }
+ 
+ void
+ printer::add_text (std::string text)
+ {
+   element *parent = m_open_tags.back ();
+   parent->add_text (std::move (text));
+ }
+ 
+ void
+ printer::add_raw (std::string text)
+ {
+   element *parent = m_open_tags.back ();
+   parent->add_child (std::make_unique<xml::raw> (std::move (text)));
+ }
+ 
+ void
+ printer::push_element (std::unique_ptr<element> new_element)
+ {
+   element *parent = m_open_tags.back ();
+   m_open_tags.push_back (new_element.get ());
+   parent->add_child (std::move (new_element));
+ }
+ 
+ void
+ printer::append (std::unique_ptr<node> new_node)
+ {
+   element *parent = m_open_tags.back ();
+   parent->add_child (std::move (new_node));
+ }
+ 
+ element *
+ printer::get_insertion_point () const
+ {
+   return m_open_tags.back ();
+ }
+ 
  } // namespace xml
  
  class html_builder;
*************** public:
*** 284,290 ****
  
    html_builder (diagnostic_context &context,
  		pretty_printer &pp,
! 		const line_maps *line_maps);
  
    void on_report_diagnostic (const diagnostic_info &diagnostic,
  			     diagnostic_t orig_diag_kind,
--- 351,358 ----
  
    html_builder (diagnostic_context &context,
  		pretty_printer &pp,
! 		const line_maps *line_maps,
! 		const html_generation_options &html_gen_opts);
  
    void on_report_diagnostic (const diagnostic_info &diagnostic,
  			     diagnostic_t orig_diag_kind,
*************** public:
*** 310,323 ****
    make_element_for_metadata (const diagnostic_metadata &metadata);
  
    std::unique_ptr<xml::element>
-   make_element_for_source (const diagnostic_info &diagnostic);
- 
-   std::unique_ptr<xml::element>
-   make_element_for_path (const diagnostic_path &path);
- 
-   std::unique_ptr<xml::element>
    make_element_for_patch (const diagnostic_info &diagnostic);
  
  private:
    std::unique_ptr<xml::element>
    make_element_for_diagnostic (const diagnostic_info &diagnostic,
--- 378,390 ----
    make_element_for_metadata (const diagnostic_metadata &metadata);
  
    std::unique_ptr<xml::element>
    make_element_for_patch (const diagnostic_info &diagnostic);
  
+   void add_focus_id (std::string focus_id)
+   {
+     m_ui_focus_ids.append_string (focus_id.c_str ());
+   }
+ 
  private:
    std::unique_ptr<xml::element>
    make_element_for_diagnostic (const diagnostic_info &diagnostic,
*************** private:
*** 330,343 ****
    diagnostic_context &m_context;
    pretty_printer *m_printer;
    const line_maps *m_line_maps;
  
    std::unique_ptr<xml::document> m_document;
    xml::element *m_diagnostics_element;
    std::unique_ptr<xml::element> m_cur_diagnostic_element;
  };
  
  static std::unique_ptr<xml::element>
! make_div (label_text class_)
  {
    auto div = std::make_unique<xml::element> ("div", false);
    div->set_attr ("class", std::move (class_));
--- 397,414 ----
    diagnostic_context &m_context;
    pretty_printer *m_printer;
    const line_maps *m_line_maps;
+   html_generation_options m_html_gen_opts;
  
    std::unique_ptr<xml::document> m_document;
+   xml::element *m_head_element;
    xml::element *m_diagnostics_element;
    std::unique_ptr<xml::element> m_cur_diagnostic_element;
+   int m_next_diag_id; // for handing out unique IDs
+   json::array m_ui_focus_ids;
  };
  
  static std::unique_ptr<xml::element>
! make_div (std::string class_)
  {
    auto div = std::make_unique<xml::element> ("div", false);
    div->set_attr ("class", std::move (class_));
*************** make_div (label_text class_)
*** 345,351 ****
  }
  
  static std::unique_ptr<xml::element>
! make_span (label_text class_)
  {
    auto span = std::make_unique<xml::element> ("span", true);
    span->set_attr ("class", std::move (class_));
--- 416,422 ----
  }
  
  static std::unique_ptr<xml::element>
! make_span (std::string class_)
  {
    auto span = std::make_unique<xml::element> ("span", true);
    span->set_attr ("class", std::move (class_));
*************** diagnostic_html_format_buffer::flush ()
*** 400,444 ****
  
  /* class html_builder.  */
  
  /* html_builder's ctor.  */
  
  html_builder::html_builder (diagnostic_context &context,
! 			      pretty_printer &pp,
! 			      const line_maps *line_maps)
  : m_context (context),
    m_printer (&pp),
!   m_line_maps (line_maps)
  {
    gcc_assert (m_line_maps);
  
    m_document = std::make_unique<xml::document> ();
    {
      auto html_element = std::make_unique<xml::element> ("html", false);
!     html_element->set_attr
!       ("xmlns",
!        label_text::borrow ("http://www.w3.org/1999/xhtml"));
      {
        {
! 	auto head_element = std::make_unique<xml::element> ("head", false);
  	{
! 	  auto title_element = std::make_unique<xml::element> ("title", true);
! 	  label_text title (label_text::borrow ("Title goes here")); // TODO
! 	  title_element->add_text (std::move (title));
! 	  head_element->add_child (std::move (title_element));
  	}
! 	html_element->add_child (std::move (head_element));
  
! 	auto body_element = std::make_unique<xml::element> ("body", false);
! 	{
! 	  auto diagnostics_element
! 	    = make_div (label_text::borrow ("gcc-diagnostic-list"));
! 	  m_diagnostics_element = diagnostics_element.get ();
! 	  body_element->add_child (std::move (diagnostics_element));
! 	}
! 	html_element->add_child (std::move (body_element));
        }
      }
-     m_document->add_child (std::move (html_element));
    }
  }
  
--- 471,625 ----
  
  /* class html_builder.  */
  
+ /* Style information for writing out HTML paths.
+    Colors taken from https://pf3.patternfly.org/v3/styles/color-palette/ */
+ 
+ static const char * const HTML_STYLE
+   = ("  <style>\n"
+      "    .linenum { color: white;\n"
+      "               background-color: #0088ce;\n"
+      "               white-space: pre;\n"
+      "               border-right: 1px solid black; }\n"
+      "    .ruler { color: red;\n"
+      "              white-space: pre; }\n"
+      "    .source { color: blue;\n"
+      "              white-space: pre; }\n"
+      "    .annotation { color: green;\n"
+      "                  white-space: pre; }\n"
+      "    .linenum-gap { text-align: center;\n"
+      "                   border-top: 1px solid black;\n"
+      "                   border-right: 1px solid black;\n"
+      "                   background-color: #ededed; }\n"
+      "    .source-gap { border-bottom: 1px dashed black;\n"
+      "                  border-top: 1px dashed black;\n"
+      "                  background-color: #ededed; }\n"
+      "    .no-locus-event { font-family: monospace;\n"
+      "                      color: green;\n"
+      "                      white-space: pre; }\n"
+      "    .funcname { font-weight: bold; }\n"
+      "    .events-hdr { color: white;\n"
+      "                  background-color: #030303; }\n"
+      "    .event-range {  border: 1px solid black;\n"
+      "                    padding: 0px; }\n"
+      "    .event-range-with-margin { border-spacing: 0; }\n"
+      "    .locus { font-family: monospace;\n"
+      "             border-spacing: 0px; }\n"
+      "    .selected { color: white;\n"
+      "                background-color: #0088ce; }\n"
+      "    .stack-frame-with-margin { border-spacing: 0; }\n"
+      "    .stack-frame {  padding: 5px;\n"
+      "                    box-shadow: 0 5px 10px 0 rgba(0, 0, 0, 0.5); }\n"
+      "    .frame-funcname { text-align: right;\n"
+      "                      font-style: italic; } \n"
+      "    .highlight-a { color: #703fec;\n" // pf-purple-400
+      "                   font-weight: bold; }\n"
+      "    .highlight-b { color: #3f9c35;\n" // pf-green-400
+      "                   font-weight: bold; }\n"
+      "  </style>\n");
+ 
+ /* A little JavaScript for ease of navigation.
+    Keys j/k move forward and backward cyclically through a list
+    of focus ids (written out in another <script> tag as the HTML
+    is flushed).  */
+ 
+ const char * const HTML_SCRIPT
+   = ("  var current_focus_idx = 0;\n"
+      "\n"
+      "  function get_focus_span (focus_idx)\n"
+      "  {\n"
+      "      const element_id = focus_ids[focus_idx];\n"
+      "      return document.getElementById(element_id);\n"
+      "  }\n"
+      "  function unhighlight_current_focus_idx ()\n"
+      "  {\n"
+      "      get_focus_span (current_focus_idx).classList.remove ('selected');\n"
+      "  }\n"
+      "  function highlight_current_focus_idx ()\n"
+      "  {\n"
+      "      const el = get_focus_span (current_focus_idx);\n"
+      "      el.classList.add ('selected');\n"
+      "      // Center the element on the screen\n"
+      "      const top_y = el.getBoundingClientRect ().top + window.pageYOffset;\n"
+      "      const middle = top_y - (window.innerHeight / 2);\n"
+      "      window.scrollTo (0, middle);\n"
+      "  }\n"
+      "  function select_prev_focus_idx ()\n"
+      "  {\n"
+      "      unhighlight_current_focus_idx ();\n"
+      "      if (current_focus_idx > 0)\n"
+      "          current_focus_idx -= 1;\n"
+      "      else\n"
+      "          current_focus_idx = focus_ids.length - 1;\n"
+      "      highlight_current_focus_idx ();\n"
+      "  }\n"
+      "  function select_next_focus_idx ()\n"
+      "  {\n"
+      "      unhighlight_current_focus_idx ();\n"
+      "      if (current_focus_idx < focus_ids.length - 1)\n"
+      "          current_focus_idx += 1;\n"
+      "      else\n"
+      "          current_focus_idx = 0;\n"
+      "      highlight_current_focus_idx ();\n"
+      "  }\n"
+      "  document.addEventListener('keydown', function (ev) {\n"
+      "      if (ev.key == 'j')\n"
+      "          select_next_focus_idx ();\n"
+      "      else if (ev.key == 'k')\n"
+      "          select_prev_focus_idx ();\n"
+      "  });\n"
+      "  highlight_current_focus_idx ();\n");
+ 
  /* html_builder's ctor.  */
  
  html_builder::html_builder (diagnostic_context &context,
! 			    pretty_printer &pp,
! 			    const line_maps *line_maps,
! 			    const html_generation_options &html_gen_opts)
  : m_context (context),
    m_printer (&pp),
!   m_line_maps (line_maps),
!   m_html_gen_opts (html_gen_opts),
!   m_head_element (nullptr),
!   m_diagnostics_element (nullptr),
!   m_next_diag_id (0)
  {
    gcc_assert (m_line_maps);
  
    m_document = std::make_unique<xml::document> ();
    {
      auto html_element = std::make_unique<xml::element> ("html", false);
!     html_element->set_attr ("xmlns",
! 			    "http://www.w3.org/1999/xhtml");
!     xml::printer xp (*html_element.get ());
!     m_document->add_child (std::move (html_element));
! 
      {
+       xml::auto_print_element head (xp, "head");
+       m_head_element = xp.get_insertion_point ();
        {
! 	xml::auto_print_element title (xp, "title", true);
! 	xp.add_text ("Title goes here");
!       }
!       if (m_html_gen_opts.m_css)
! 	xp.add_raw (HTML_STYLE);
!       if (m_html_gen_opts.m_javascript)
  	{
! 	  xp.push_tag ("script");
! 	  /* Escaping rules are different for HTML <script> elements,
! 	     so add the script "raw" for now.  */
! 	  xp.add_raw (HTML_SCRIPT);
! 	  xp.pop_tag (); // script
  	}
!     }
  
!     {
!       xml::auto_print_element body (xp, "body");
!       {
! 	auto diagnostics_element = make_div ("gcc-diagnostic-list");
! 	m_diagnostics_element = diagnostics_element.get ();
! 	xp.append (std::move (diagnostics_element));
        }
      }
    }
  }
  
*************** html_builder::on_report_diagnostic (cons
*** 477,482 ****
--- 658,702 ----
      }
  }
  
+ /* Custom subclass of html_label_writer.
+    Wrap labels within a <span> element, supplying them with event IDs.
+    Add the IDs to the list of focus IDs.  */
+ 
+ class html_path_label_writer : public html_label_writer
+ {
+ public:
+   html_path_label_writer (xml::printer &xp,
+ 			  html_builder &builder,
+ 			  const std::string &event_id_prefix)
+   : m_xp (xp),
+     m_html_builder (builder),
+     m_event_id_prefix (event_id_prefix),
+     m_next_event_idx (0)
+   {
+   }
+ 
+   void begin_label () final override
+   {
+     m_xp.push_tag_with_class ("span", "event", true);
+     pretty_printer pp;
+     pp_printf (&pp, "%s%i",
+ 	       m_event_id_prefix.c_str (), m_next_event_idx++);
+     m_xp.set_attr ("id", pp_formatted_text (&pp));
+     m_html_builder.add_focus_id (pp_formatted_text (&pp));
+   }
+ 
+   void end_label () final override
+   {
+     m_xp.pop_tag (); // span
+   }
+ 
+ private:
+   xml::printer &m_xp;
+   html_builder &m_html_builder;
+   const std::string &m_event_id_prefix;
+   int m_next_event_idx;
+ };
+ 
  std::unique_ptr<xml::element>
  html_builder::make_element_for_diagnostic (const diagnostic_info &diagnostic,
  					   diagnostic_t orig_diag_kind)
*************** html_builder::make_element_for_diagnosti
*** 484,494 ****
    class html_token_printer : public token_printer
    {
    public:
!     html_token_printer (html_builder &builder,
! 			 xml::element &parent_element)
!     : m_builder (builder)
      {
-       m_open_elements.push_back (&parent_element);
      }
      void print_tokens (pretty_printer */*pp*/,
  		       const pp_token_list &tokens) final override
--- 704,712 ----
    class html_token_printer : public token_printer
    {
    public:
!     html_token_printer (xml::printer &xp)
!     : m_xp (xp)
      {
      }
      void print_tokens (pretty_printer */*pp*/,
  		       const pp_token_list &tokens) final override
*************** html_builder::make_element_for_diagnosti
*** 506,576 ****
  	      pp_token_text *sub = as_a <pp_token_text *> (iter);
  	      /* The value might be in the obstack, so we may need to
  		 copy it.  */
! 	      insertion_element ().add_text
! 		(label_text::take (xstrdup (sub->m_value.get ())));
  	    }
  	    break;
  
  	  case pp_token::kind::begin_color:
  	  case pp_token::kind::end_color:
! 	    /* These are no-ops.  */
  	    break;
  
  	  case pp_token::kind::begin_quote:
  	    {
! 	      insertion_element ().add_text (label_text::borrow (open_quote));
! 	      push_element (make_span (label_text::borrow ("gcc-quoted-text")));
  	    }
  	    break;
  	  case pp_token::kind::end_quote:
  	    {
! 	      pop_element ();
! 	      insertion_element ().add_text (label_text::borrow (close_quote));
  	    }
  	    break;
  
  	  case pp_token::kind::begin_url:
  	    {
  	      pp_token_begin_url *sub = as_a <pp_token_begin_url *> (iter);
! 	      auto anchor = std::make_unique<xml::element> ("a", true);
! 	      anchor->set_attr ("href", std::move (sub->m_value));
! 	      push_element (std::move (anchor));
  	    }
  	    break;
  	  case pp_token::kind::end_url:
! 	    pop_element ();
  	    break;
  	  }
      }
  
    private:
!     xml::element &insertion_element () const
!     {
!       return *m_open_elements.back ();
!     }
!     void push_element (std::unique_ptr<xml::element> new_element)
!     {
!       xml::element &current_top = insertion_element ();
!       m_open_elements.push_back (new_element.get ());
!       current_top.add_child (std::move (new_element));
!     }
!     void pop_element ()
!     {
!       m_open_elements.pop_back ();
!     }
! 
!     html_builder &m_builder;
!     /* We maintain a stack of currently "open" elements.
!        Children are added to the topmost open element.  */
!     std::vector<xml::element *> m_open_elements;
    };
  
!   auto diag_element = make_div (label_text::borrow ("gcc-diagnostic"));
  
    // TODO: might be nice to emulate the text output format, but colorize it
  
!   auto message_span = make_span (label_text::borrow ("gcc-message"));
!   html_token_printer tok_printer (*this, *message_span.get ());
    m_printer->set_token_printer (&tok_printer);
    pp_output_formatted_text (m_printer, m_context.get_urlifier ());
    m_printer->set_token_printer (nullptr);
--- 724,795 ----
  	      pp_token_text *sub = as_a <pp_token_text *> (iter);
  	      /* The value might be in the obstack, so we may need to
  		 copy it.  */
! 	      m_xp.add_text (sub->m_value.get ());
  	    }
  	    break;
  
  	  case pp_token::kind::begin_color:
+ 	    {
+ 	      pp_token_begin_color *sub = as_a <pp_token_begin_color *> (iter);
+ 	      gcc_assert (sub->m_value.get ());
+ 	      m_xp.push_tag_with_class ("span", sub->m_value.get ());
+ 	    }
+ 	    break;
+ 
  	  case pp_token::kind::end_color:
! 	    m_xp.pop_tag ();
  	    break;
  
  	  case pp_token::kind::begin_quote:
  	    {
! 	      m_xp.add_text (open_quote);
! 	      m_xp.push_tag_with_class ("span", "gcc-quoted-text");
  	    }
  	    break;
  	  case pp_token::kind::end_quote:
  	    {
! 	      m_xp.pop_tag ();
! 	      m_xp.add_text (close_quote);
  	    }
  	    break;
  
  	  case pp_token::kind::begin_url:
  	    {
  	      pp_token_begin_url *sub = as_a <pp_token_begin_url *> (iter);
! 	      m_xp.push_tag ("a", true);
! 	      m_xp.set_attr ("href", sub->m_value.get ());
  	    }
  	    break;
  	  case pp_token::kind::end_url:
! 	    m_xp.pop_tag ();
  	    break;
  	  }
      }
  
    private:
!     xml::printer &m_xp;
    };
  
!   auto diag_element = make_div ("gcc-diagnostic");
! 
!   const int diag_idx = m_next_diag_id++;
!   std::string diag_id;
!   {
!     pretty_printer pp;
!     pp_printf (&pp, "gcc-diag-%i", diag_idx);
!     diag_id = pp_formatted_text (&pp);
!   }
!   diag_element->set_attr ("id", diag_id);
  
    // TODO: might be nice to emulate the text output format, but colorize it
  
!   auto message_span = make_span ("gcc-message");
!   std::string message_span_id (diag_id + "-message");
!   message_span->set_attr ("id", message_span_id);
!   add_focus_id (message_span_id);
! 
!   xml::printer xp (*message_span.get ());
!   html_token_printer tok_printer (xp);
    m_printer->set_token_printer (&tok_printer);
    pp_output_formatted_text (m_printer, m_context.get_urlifier ());
    m_printer->set_token_printer (nullptr);
*************** html_builder::make_element_for_diagnosti
*** 579,585 ****
  
    if (diagnostic.metadata)
      {
!       diag_element->add_text (label_text::borrow (" "));
        diag_element->add_child
  	(make_element_for_metadata (*diagnostic.metadata));
      }
--- 798,804 ----
  
    if (diagnostic.metadata)
      {
!       diag_element->add_text (" ");
        diag_element->add_child
  	(make_element_for_metadata (*diagnostic.metadata));
      }
*************** html_builder::make_element_for_diagnosti
*** 592,623 ****
        label_text option_url = label_text::take
  	(m_context.make_option_url (diagnostic.option_id));
  
!       diag_element->add_text (label_text::borrow (" "));
!       auto option_span = make_span (label_text::borrow ("gcc-option"));
!       option_span->add_text (label_text::borrow ("["));
        {
  	if (option_url.get ())
  	  {
  	    auto anchor = std::make_unique<xml::element> ("a", true);
! 	    anchor->set_attr ("href", std::move (option_url));
! 	    anchor->add_text (std::move (option_text));
  	    option_span->add_child (std::move (anchor));
  	  }
  	else
! 	  option_span->add_text (std::move (option_text));
! 	option_span->add_text (label_text::borrow ("]"));
        }
        diag_element->add_child (std::move (option_span));
      }
  
    /* Source (and fix-it hints).  */
!   if (auto source_element = make_element_for_source (diagnostic))
!     diag_element->add_child (std::move (source_element));
  
    /* Execution path.  */
    if (auto path = diagnostic.richloc->get_path ())
!     if (auto path_element = make_element_for_path (*path))
!       diag_element->add_child (std::move (path_element));
  
    if (auto patch_element = make_element_for_patch (diagnostic))
      diag_element->add_child (std::move (patch_element));
--- 811,857 ----
        label_text option_url = label_text::take
  	(m_context.make_option_url (diagnostic.option_id));
  
!       diag_element->add_text (" ");
!       auto option_span = make_span ("gcc-option");
!       option_span->add_text ("[");
        {
  	if (option_url.get ())
  	  {
  	    auto anchor = std::make_unique<xml::element> ("a", true);
! 	    anchor->set_attr ("href", option_url.get ());
! 	    anchor->add_text (option_text.get ());
  	    option_span->add_child (std::move (anchor));
  	  }
  	else
! 	  option_span->add_text (option_text.get ());
! 	option_span->add_text ("]");
        }
        diag_element->add_child (std::move (option_span));
      }
  
    /* Source (and fix-it hints).  */
!   {
!     xml::printer xp (*diag_element);
!     m_context.m_last_location = UNKNOWN_LOCATION;
!     m_context.maybe_show_locus_as_html (*diagnostic.richloc,
! 					m_context.m_source_printing,
! 					diagnostic.kind,
! 					xp,
! 					nullptr,
! 					nullptr);
!   }
  
    /* Execution path.  */
    if (auto path = diagnostic.richloc->get_path ())
!     {
!       xml::printer xp (*diag_element);
!       std::string event_id_prefix (diag_id + "-event-");
!       html_path_label_writer event_label_writer (xp, *this,
! 						 event_id_prefix);
!       diagnostic_source_print_policy dspp (m_context);
!       print_path_as_html (xp, *path, m_context, &event_label_writer,
! 			  dspp);
!     }
  
    if (auto patch_element = make_element_for_patch (diagnostic))
      diag_element->add_child (std::move (patch_element));
*************** html_builder::make_element_for_diagnosti
*** 626,686 ****
  }
  
  std::unique_ptr<xml::element>
- html_builder::make_element_for_source (const diagnostic_info &diagnostic)
- {
-   // TODO: ideally we'd like to capture elements within the following:
-   m_context.m_last_location = UNKNOWN_LOCATION;
-   pp_clear_output_area (m_printer);
-   diagnostic_show_locus (&m_context,
- 			 m_context.m_source_printing,
- 			 diagnostic.richloc, diagnostic.kind,
- 			 m_printer);
-   auto text = label_text::take (xstrdup (pp_formatted_text (m_printer)));
-   pp_clear_output_area (m_printer);
- 
-   if (strlen (text.get ()) == 0)
-     return nullptr;
- 
-   auto pre = std::make_unique<xml::element> ("pre", true);
-   pre->set_attr ("class", label_text::borrow ("gcc-annotated-source"));
-   pre->add_text (std::move (text));
-   return pre;
- }
- 
- std::unique_ptr<xml::element>
- html_builder::make_element_for_path (const diagnostic_path &path)
- {
-   m_context.m_last_location = UNKNOWN_LOCATION;
-   diagnostic_text_output_format text_format (m_context);
-   pp_show_color (text_format.get_printer ()) = false;
-   pp_buffer (text_format.get_printer ())->m_flush_p = false;
-   // TODO: ideally we'd like to capture elements within the following:
-   text_format.print_path (path);
-   auto text = label_text::take
-     (xstrdup (pp_formatted_text (text_format.get_printer ())));
- 
-   if (strlen (text.get ()) == 0)
-     return nullptr;
- 
-   auto pre = std::make_unique<xml::element> ("pre", true);
-   pre->set_attr ("class", label_text::borrow ("gcc-execution-path"));
-   pre->add_text (std::move (text));
-   return pre;
- }
- 
- std::unique_ptr<xml::element>
  html_builder::make_element_for_patch (const diagnostic_info &diagnostic)
  {
    edit_context ec (m_context.get_file_cache ());
    ec.add_fixits (diagnostic.richloc);
    if (char *diff = ec.generate_diff (true))
!     if (strlen (diff) > 0)
!       {
! 	auto element = std::make_unique<xml::element> ("pre", true);
! 	element->set_attr ("class", label_text::borrow ("gcc-generated-patch"));
! 	element->add_text (label_text::take (diff));
! 	return element;
!       }
    return nullptr;
  }
  
--- 860,882 ----
  }
  
  std::unique_ptr<xml::element>
  html_builder::make_element_for_patch (const diagnostic_info &diagnostic)
  {
    edit_context ec (m_context.get_file_cache ());
    ec.add_fixits (diagnostic.richloc);
    if (char *diff = ec.generate_diff (true))
!     {
!       if (strlen (diff) > 0)
! 	{
! 	  auto element = std::make_unique<xml::element> ("pre", true);
! 	  element->set_attr ("class", "gcc-generated-patch");
! 	  element->add_text (diff);
! 	  free (diff);
! 	  return element;
! 	}
!       else
! 	free (diff);
!     }
    return nullptr;
  }
  
*************** std::unique_ptr<xml::element>
*** 688,709 ****
  html_builder::make_metadata_element (label_text label,
  				     label_text url)
  {
!   auto item = make_span (label_text::borrow ("gcc-metadata-item"));
!   item->add_text (label_text::borrow ("["));
    {
!     auto anchor = std::make_unique<xml::element> ("a", true);
!     anchor->set_attr ("href", std::move (url));
!     anchor->add_child (std::make_unique<xml::text> (std::move (label)));
!     item->add_child (std::move (anchor));
    }
!   item->add_text (label_text::borrow ("]"));
    return item;
  }
  
  std::unique_ptr<xml::element>
  html_builder::make_element_for_metadata (const diagnostic_metadata &metadata)
  {
!   auto span_metadata = make_span (label_text::borrow ("gcc-metadata"));
  
    int cwe = metadata.get_cwe ();
    if (cwe)
--- 884,910 ----
  html_builder::make_metadata_element (label_text label,
  				     label_text url)
  {
!   auto item = make_span ("gcc-metadata-item");
!   xml::printer xp (*item.get ());
!   xp.add_text ("[");
    {
!     if (url.get ())
!       {
! 	xp.push_tag ("a", true);
! 	xp.set_attr ("href", url.get ());
!       }
!     xp.add_text (label.get ());
!     if (url.get ())
!       xp.pop_tag ();
    }
!   xp.add_text ("]");
    return item;
  }
  
  std::unique_ptr<xml::element>
  html_builder::make_element_for_metadata (const diagnostic_metadata &metadata)
  {
!   auto span_metadata = make_span ("gcc-metadata");
  
    int cwe = metadata.get_cwe ();
    if (cwe)
*************** html_builder::emit_diagram (const diagno
*** 737,743 ****
    /* We must be within the emission of a top-level diagnostic.  */
    gcc_assert (m_cur_diagnostic_element);
  
!   // TODO
  }
  
  /* Implementation of "end_group_cb" for HTML output.  */
--- 938,944 ----
    /* We must be within the emission of a top-level diagnostic.  */
    gcc_assert (m_cur_diagnostic_element);
  
!   // TODO: currently a no-op
  }
  
  /* Implementation of "end_group_cb" for HTML output.  */
*************** html_builder::end_group ()
*** 757,762 ****
--- 958,977 ----
  void
  html_builder::flush_to_file (FILE *outf)
  {
+   if (m_html_gen_opts.m_javascript)
+     {
+       gcc_assert (m_head_element);
+       xml::printer xp (*m_head_element);
+       /* Add an initialization of the global js variable "focus_ids"
+ 	 using the array of IDs we saved as we went.  */
+       xp.push_tag ("script");
+       pretty_printer pp;
+       pp_string (&pp, "focus_ids = ");
+       m_ui_focus_ids.print (&pp, true);
+       pp_string (&pp, ";\n");
+       xp.add_raw (pp_formatted_text (&pp));
+       xp.pop_tag (); // script
+     }
    auto top = m_document.get ();
    top->dump (outf);
    fprintf (outf, "\n");
*************** public:
*** 842,850 ****
  
  protected:
    html_output_format (diagnostic_context &context,
! 		      const line_maps *line_maps)
    : diagnostic_output_format (context),
!     m_builder (context, *get_printer (), line_maps),
      m_buffer (nullptr)
    {}
  
--- 1057,1066 ----
  
  protected:
    html_output_format (diagnostic_context &context,
! 		      const line_maps *line_maps,
! 		      const html_generation_options &html_gen_opts)
    : diagnostic_output_format (context),
!     m_builder (context, *get_printer (), line_maps, html_gen_opts),
      m_buffer (nullptr)
    {}
  
*************** class html_file_output_format : public h
*** 857,864 ****
  public:
    html_file_output_format (diagnostic_context &context,
  			   const line_maps *line_maps,
  			   diagnostic_output_file output_file)
!   : html_output_format (context, line_maps),
      m_output_file (std::move (output_file))
    {
      gcc_assert (m_output_file.get_open_file ());
--- 1073,1081 ----
  public:
    html_file_output_format (diagnostic_context &context,
  			   const line_maps *line_maps,
+ 			   const html_generation_options &html_gen_opts,
  			   diagnostic_output_file output_file)
!   : html_output_format (context, line_maps, html_gen_opts),
      m_output_file (std::move (output_file))
    {
      gcc_assert (m_output_file.get_open_file ());
*************** diagnostic_output_format_open_html_file
*** 922,932 ****
--- 1139,1151 ----
  std::unique_ptr<diagnostic_output_format>
  make_html_sink (diagnostic_context &context,
  		const line_maps &line_maps,
+ 		const html_generation_options &html_gen_opts,
  		diagnostic_output_file output_file)
  {
    auto sink
      = std::make_unique<html_file_output_format> (context,
  						 &line_maps,
+ 						 html_gen_opts,
  						 std::move (output_file));
    sink->update_printer ();
    return sink;
*************** class test_html_diagnostic_context : pub
*** 945,952 ****
  public:
    test_html_diagnostic_context ()
    {
      auto sink = std::make_unique<html_buffered_output_format> (*this,
! 							       line_table);
      sink->update_printer ();
      m_format = sink.get (); // borrowed
  
--- 1164,1175 ----
  public:
    test_html_diagnostic_context ()
    {
+     html_generation_options html_gen_opts;
+     html_gen_opts.m_css = false;
+     html_gen_opts.m_javascript = false;
      auto sink = std::make_unique<html_buffered_output_format> (*this,
! 							       line_table,
! 							       html_gen_opts);
      sink->update_printer ();
      m_format = sink.get (); // borrowed
  
*************** private:
*** 968,975 ****
    {
    public:
      html_buffered_output_format (diagnostic_context &context,
! 				 const line_maps *line_maps)
!     : html_output_format (context, line_maps)
      {
      }
      bool machine_readable_stderr_p () const final override
--- 1191,1199 ----
    {
    public:
      html_buffered_output_format (diagnostic_context &context,
! 				 const line_maps *line_maps,
! 				 const html_generation_options &html_gen_opts)
!     : html_output_format (context, line_maps, html_gen_opts)
      {
      }
      bool machine_readable_stderr_p () const final override
*************** test_simple_log ()
*** 1009,1020 ****
        "  </head>\n"
        "  <body>\n"
        "    <div class=\"gcc-diagnostic-list\">\n"
!       "      <div class=\"gcc-diagnostic\">\n"
!       "        <span class=\"gcc-message\">this is a test: `<span class=\"gcc-quoted-text\">foo</span>&apos;</span>\n"
        "      </div>\n"
        "    </div>\n"
        "  </body>\n"
!       "</html>"));
  }
  
  static void
--- 1233,1244 ----
        "  </head>\n"
        "  <body>\n"
        "    <div class=\"gcc-diagnostic-list\">\n"
!       "      <div class=\"gcc-diagnostic\" id=\"gcc-diag-0\">\n"
!       "        <span class=\"gcc-message\" id=\"gcc-diag-0-message\">this is a test: `<span class=\"gcc-quoted-text\">foo</span>&apos;</span>\n"
        "      </div>\n"
        "    </div>\n"
        "  </body>\n"
!       "</html>\n"));
  }
  
  static void
*************** test_metadata ()
*** 1031,1037 ****
      element->write_as_xml (&pp, 0, true);
      ASSERT_STREQ
        (pp_formatted_text (&pp),
-        "\n"
         "<span class=\"gcc-metadata\">"
         "<span class=\"gcc-metadata-item\">"
         "["
--- 1255,1260 ----
*************** test_metadata ()
*** 1040,1046 ****
         "</a>"
         "]"
         "</span>"
!        "</span>");
    }
  
    {
--- 1263,1269 ----
         "</a>"
         "]"
         "</span>"
!        "</span>\n");
    }
  
    {
*************** test_metadata ()
*** 1053,1059 ****
      element->write_as_xml (&pp, 0, true);
      ASSERT_STREQ
        (pp_formatted_text (&pp),
-        "\n"
         "<span class=\"gcc-metadata\">"
         "<span class=\"gcc-metadata-item\">"
         "["
--- 1276,1281 ----
*************** test_metadata ()
*** 1062,1071 ****
         "</a>"
         "]"
         "</span>"
!        "</span>");
    }
  }
  
  /* Run all of the selftests within this file.  */
  
  void
--- 1284,1354 ----
         "</a>"
         "]"
         "</span>"
!        "</span>\n");
    }
  }
  
+ static void
+ test_printer ()
+ {
+   xml::element top ("top", false);
+   xml::printer xp (top);
+   xp.push_tag ("foo");
+   xp.add_text ("hello");
+   xp.push_tag ("bar");
+   xp.set_attr ("size", "3");
+   xp.set_attr ("color", "red");
+   xp.add_text ("world");
+   xp.push_tag ("baz");
+   xp.pop_tag ();
+   xp.pop_tag ();
+   xp.pop_tag ();
+ 
+   pretty_printer pp;
+   top.write_as_xml (&pp, 0, true);
+   ASSERT_STREQ
+     (pp_formatted_text (&pp),
+      "<top>\n"
+      "  <foo>\n"
+      "    hello\n"
+      "    <bar size=\"3\" color=\"red\">\n"
+      "      world\n"
+      "      <baz/>\n"
+      "    </bar>\n"
+      "  </foo>\n"
+      "</top>\n");
+ }
+ 
+ // Verify that element attributes preserve insertion order.
+ 
+ static void
+ test_attribute_ordering ()
+ {
+   xml::element top ("top", false);
+   xml::printer xp (top);
+   xp.push_tag ("chronological");
+   xp.set_attr ("maldon", "991");
+   xp.set_attr ("hastings", "1066");
+   xp.set_attr ("edgehill", "1642");
+   xp.set_attr ("naseby", "1645");
+   xp.pop_tag ();
+   xp.push_tag ("alphabetical");
+   xp.set_attr ("edgehill", "1642");
+   xp.set_attr ("hastings", "1066");
+   xp.set_attr ("maldon", "991");
+   xp.set_attr ("naseby", "1645");
+   xp.pop_tag ();
+ 
+   pretty_printer pp;
+   top.write_as_xml (&pp, 0, true);
+   ASSERT_STREQ
+     (pp_formatted_text (&pp),
+      "<top>\n"
+      "  <chronological maldon=\"991\" hastings=\"1066\" edgehill=\"1642\" naseby=\"1645\"/>\n"
+      "  <alphabetical edgehill=\"1642\" hastings=\"1066\" maldon=\"991\" naseby=\"1645\"/>\n"
+      "</top>\n");
+ }
+ 
  /* Run all of the selftests within this file.  */
  
  void
*************** diagnostic_format_html_cc_tests ()
*** 1074,1079 ****
--- 1357,1364 ----
    auto_fix_quotes fix_quotes;
    test_simple_log ();
    test_metadata ();
+   test_printer ();
+   test_attribute_ordering ();
  }
  
  } // namespace selftest
diff -Nrcpad gcc-16-20250525/gcc/diagnostic-format-html.h gcc-16-20250601/gcc/diagnostic-format-html.h
*** gcc-16-20250525/gcc/diagnostic-format-html.h	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/diagnostic-format-html.h	Sun Jun  1 22:32:14 2025
*************** along with GCC; see the file COPYING3.
*** 24,29 ****
--- 24,37 ----
  #include "diagnostic-format.h"
  #include "diagnostic-output-file.h"
  
+ struct html_generation_options
+ {
+   html_generation_options ();
+ 
+   bool m_css;
+   bool m_javascript;
+ };
+ 
  extern diagnostic_output_file
  diagnostic_output_format_open_html_file (diagnostic_context &context,
  					 line_maps *line_maps,
*************** diagnostic_output_format_open_html_file
*** 32,37 ****
--- 40,53 ----
  extern std::unique_ptr<diagnostic_output_format>
  make_html_sink (diagnostic_context &context,
  		const line_maps &line_maps,
+ 		const html_generation_options &html_gen_opts,
  		diagnostic_output_file output_file);
  
+ extern void
+ print_path_as_html (xml::printer &xp,
+ 		    const diagnostic_path &path,
+ 		    diagnostic_context &dc,
+ 		    html_label_writer *event_label_writer,
+ 		    const diagnostic_source_print_policy &dspp);
+ 
  #endif /* ! GCC_DIAGNOSTIC_FORMAT_HTML_H */
diff -Nrcpad gcc-16-20250525/gcc/diagnostic-path-output.cc gcc-16-20250601/gcc/diagnostic-path-output.cc
*** gcc-16-20250525/gcc/diagnostic-path-output.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/diagnostic-path-output.cc	Sun Jun  1 22:32:14 2025
***************
*** 0 ****
--- 1,2713 ----
+ /* Printing paths through the code associated with a diagnostic.
+    Copyright (C) 2019-2025 Free Software Foundation, Inc.
+    Contributed by David Malcolm <dmalcolm@redhat.com>
+ 
+ This file is part of GCC.
+ 
+ GCC is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 3, or (at your option) any later
+ version.
+ 
+ GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ for more details.
+ 
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3.  If not see
+ <http://www.gnu.org/licenses/>.  */
+ 
+ #include "config.h"
+ #define INCLUDE_ALGORITHM
+ #define INCLUDE_MAP
+ #define INCLUDE_STRING
+ #define INCLUDE_VECTOR
+ #include "system.h"
+ #include "coretypes.h"
+ #include "diagnostic.h"
+ #include "diagnostic-macro-unwinding.h"
+ #include "intl.h"
+ #include "diagnostic-path.h"
+ #include "gcc-rich-location.h"
+ #include "diagnostic-color.h"
+ #include "diagnostic-event-id.h"
+ #include "diagnostic-label-effects.h"
+ #include "pretty-print-markup.h"
+ #include "selftest.h"
+ #include "selftest-diagnostic.h"
+ #include "selftest-diagnostic-path.h"
+ #include "text-art/theme.h"
+ #include "diagnostic-format-text.h"
+ #include "diagnostic-format-html.h"
+ #include "xml.h"
+ #include "xml-printer.h"
+ 
+ /* Disable warnings about missing quoting in GCC diagnostics for the print
+    calls below.  */
+ #if __GNUC__ >= 10
+ #  pragma GCC diagnostic push
+ #  pragma GCC diagnostic ignored "-Wformat-diag"
+ #endif
+ 
+ /* Anonymous namespace for path-printing code.  */
+ 
+ namespace {
+ 
+ /* A bundle of state for printing a path.  */
+ 
+ class path_print_policy
+ {
+ public:
+   path_print_policy (const diagnostic_text_output_format &text_output)
+   : m_source_policy (text_output.get_context ())
+   {
+   }
+ 
+   path_print_policy (const diagnostic_context &dc)
+   : m_source_policy (dc)
+   {
+   }
+ 
+   text_art::theme *
+   get_diagram_theme () const
+   {
+     return m_source_policy.get_diagram_theme ();
+   }
+ 
+   const diagnostic_source_print_policy &
+   get_source_policy () const { return m_source_policy; }
+ 
+ private:
+   diagnostic_source_print_policy m_source_policy;
+ };
+ 
+ /* Subclass of range_label for showing a particular event
+    when showing a consecutive run of events within a diagnostic_path as
+    labelled ranges within one gcc_rich_location.  */
+ 
+ class path_label : public range_label
+ {
+  public:
+   path_label (const diagnostic_path &path,
+ 	      const pretty_printer &ref_pp,
+ 	      unsigned start_idx,
+ 	      bool colorize,
+ 	      bool allow_emojis)
+   : m_path (path),
+     m_ref_pp (ref_pp),
+     m_start_idx (start_idx), m_effects (*this),
+     m_colorize (colorize), m_allow_emojis (allow_emojis)
+   {}
+ 
+   label_text get_text (unsigned range_idx) const final override
+   {
+     unsigned event_idx = m_start_idx + range_idx;
+     const diagnostic_event &event = m_path.get_event (event_idx);
+ 
+     const diagnostic_event::meaning meaning (event.get_meaning ());
+ 
+     auto pp = m_ref_pp.clone ();
+     pp_show_color (pp.get ()) = m_colorize;
+     diagnostic_event_id_t event_id (event_idx);
+ 
+     pp_printf (pp.get (), "%@", &event_id);
+     pp_space (pp.get ());
+ 
+     if (meaning.m_verb == diagnostic_event::VERB_danger
+ 	&& m_allow_emojis)
+       {
+ 	pp_unicode_character (pp.get (), 0x26A0); /* U+26A0 WARNING SIGN.  */
+ 	/* Append U+FE0F VARIATION SELECTOR-16 to select the emoji
+ 	   variation of the char.  */
+ 	pp_unicode_character (pp.get (), 0xFE0F);
+ 	/* U+26A0 WARNING SIGN has East_Asian_Width == Neutral, but in its
+ 	   emoji variant is printed (by vte at least) with a 2nd half
+ 	   overlapping the next char.  Hence we add two spaces here: a space
+ 	   to be covered by this overlap, plus another space of padding.  */
+ 	pp_string (pp.get (), "  ");
+       }
+ 
+     event.print_desc (*pp.get ());
+ 
+     label_text result
+       = label_text::take (xstrdup (pp_formatted_text (pp.get ())));
+     return result;
+   }
+ 
+   const label_effects *get_effects (unsigned /*range_idx*/) const
+   {
+     return &m_effects;
+   }
+ 
+  private:
+   class path_label_effects : public label_effects
+   {
+   public:
+     path_label_effects (const path_label &path_label)
+     : m_path_label (path_label)
+     {
+     }
+     bool has_in_edge (unsigned range_idx) const final override
+     {
+       if (const diagnostic_event *prev_event
+ 	    = m_path_label.get_prev_event (range_idx))
+ 	return prev_event->connect_to_next_event_p ();
+       return false;
+     }
+     bool has_out_edge (unsigned range_idx) const final override
+     {
+       const diagnostic_event &event = m_path_label.get_event (range_idx);
+       return event.connect_to_next_event_p ();
+     }
+ 
+   private:
+     const path_label &m_path_label;
+   };
+ 
+   const diagnostic_event &get_event (unsigned range_idx) const
+   {
+     unsigned event_idx = m_start_idx + range_idx;
+     return m_path.get_event (event_idx);
+   }
+ 
+   const diagnostic_event *get_prev_event (unsigned range_idx) const
+   {
+     if (m_start_idx + range_idx == 0)
+       return nullptr;
+     unsigned event_idx = m_start_idx + range_idx - 1;
+     return &m_path.get_event (event_idx);
+   }
+ 
+   const diagnostic_path &m_path;
+   const pretty_printer &m_ref_pp;
+   unsigned m_start_idx;
+   path_label_effects m_effects;
+   const bool m_colorize;
+   const bool m_allow_emojis;
+ };
+ 
+ /* Return true if E1 and E2 can be consolidated into the same run of events
+    when printing a diagnostic_path.  */
+ 
+ static bool
+ can_consolidate_events (const diagnostic_path &path,
+ 			const diagnostic_event &e1,
+ 			unsigned ev1_idx,
+ 			const diagnostic_event &e2,
+ 			unsigned ev2_idx,
+ 			bool check_locations)
+ {
+   if (e1.get_thread_id () != e2.get_thread_id ())
+     return false;
+ 
+   if (!path.same_function_p (ev1_idx, ev2_idx))
+     return false;
+ 
+   if (e1.get_stack_depth () != e2.get_stack_depth ())
+     return false;
+ 
+   if (check_locations)
+     {
+       location_t loc1 = e1.get_location ();
+       location_t loc2 = e2.get_location ();
+ 
+       if (loc1 < RESERVED_LOCATION_COUNT
+ 	  || loc2 < RESERVED_LOCATION_COUNT)
+ 	return false;
+ 
+       /* Neither can be macro-based.  */
+       if (linemap_location_from_macro_expansion_p (line_table, loc1))
+ 	return false;
+       if (linemap_location_from_macro_expansion_p (line_table, loc2))
+ 	return false;
+     }
+ 
+   /* Passed all the tests.  */
+   return true;
+ }
+ 
+ struct event_range;
+ struct path_summary;
+ class thread_event_printer;
+ 
+ /* A bundle of information about all of the events in a diagnostic_path
+    relating to a specific path, for use by path_summary.  */
+ 
+ class per_thread_summary
+ {
+ public:
+   per_thread_summary (const diagnostic_path &path,
+ 		      const logical_location_manager &logical_loc_mgr,
+ 		      label_text name, unsigned swimlane_idx)
+   : m_path (path),
+     m_logical_loc_mgr (logical_loc_mgr),
+     m_name (std::move (name)),
+     m_swimlane_idx (swimlane_idx),
+     m_last_event (nullptr),
+     m_min_depth (INT_MAX),
+     m_max_depth (INT_MIN)
+   {}
+ 
+   void update_depth_limits (int stack_depth)
+   {
+     if (stack_depth < m_min_depth)
+       m_min_depth = stack_depth;
+     if (stack_depth > m_max_depth)
+       m_max_depth = stack_depth;
+   }
+ 
+   const char *get_name () const { return m_name.get (); }
+   unsigned get_swimlane_index () const { return m_swimlane_idx; }
+ 
+   bool interprocedural_p () const;
+ 
+ private:
+   friend struct path_summary;
+   friend class thread_event_printer;
+   friend struct event_range;
+ 
+   const diagnostic_path &m_path;
+   const logical_location_manager &m_logical_loc_mgr;
+ 
+   const label_text m_name;
+ 
+   /* The "swimlane index" is the order in which this per_thread_summary
+      was created, for use when printing the events.  */
+   const unsigned m_swimlane_idx;
+ 
+   // The event ranges specific to this thread:
+   auto_vec<event_range *> m_event_ranges;
+ 
+   const diagnostic_event *m_last_event;
+ 
+   int m_min_depth;
+   int m_max_depth;
+ };
+ 
+ /* A stack frame for use in HTML output, holding child stack frames,
+    and event ranges. */
+ 
+ struct stack_frame
+ {
+   stack_frame (std::unique_ptr<stack_frame> parent,
+ 	       logical_location logical_loc,
+ 	       int stack_depth)
+   : m_parent (std::move (parent)),
+     m_logical_loc (logical_loc),
+     m_stack_depth (stack_depth)
+   {}
+ 
+   std::unique_ptr<stack_frame> m_parent;
+   logical_location m_logical_loc;
+   const int m_stack_depth;
+ };
+ 
+ /* Begin emitting content relating to a new stack frame within PARENT.
+    Allocated a new stack_frame and return it.  */
+ 
+ static std::unique_ptr<stack_frame>
+ begin_html_stack_frame (xml::printer &xp,
+ 			std::unique_ptr<stack_frame> parent,
+ 			logical_location logical_loc,
+ 			int stack_depth,
+ 			const logical_location_manager *logical_loc_mgr)
+ {
+   if (logical_loc)
+     {
+       gcc_assert (logical_loc_mgr);
+       xp.push_tag_with_class ("table", "stack-frame-with-margin", false);
+       xp.push_tag ("tr", false);
+       {
+ 	xp.push_tag_with_class ("td", "interprocmargin", false);
+ 	xp.set_attr ("style", "padding-left: 100px");
+ 	xp.pop_tag ();
+       }
+       xp.push_tag_with_class ("td", "stack-frame", false);
+       label_text funcname
+ 	= logical_loc_mgr->get_name_for_path_output (logical_loc);
+       if (funcname.get ())
+ 	{
+ 	  xp.push_tag_with_class ("div", "frame-funcname", false);
+ 	  xp.push_tag ("span", true);
+ 	  xp.add_text (funcname.get ());
+ 	  xp.pop_tag (); // span
+ 	  xp.pop_tag (); // div
+ 	}
+     }
+   return std::make_unique<stack_frame> (std::move (parent),
+ 					logical_loc,
+ 					stack_depth);
+ }
+ 
+ /* Finish emitting content for FRAME and delete it.
+    Return parent.  */
+ 
+ static std::unique_ptr<stack_frame>
+ end_html_stack_frame (xml::printer &xp,
+ 		      std::unique_ptr<stack_frame> frame)
+ {
+   auto parent = std::move (frame->m_parent);
+   if (frame->m_logical_loc)
+     {
+       xp.pop_tag (); // td
+       xp.pop_tag (); // tr
+       xp.pop_tag (); // table
+     }
+   return parent;
+ }
+ 
+ /* Append an HTML <div> element to XP containing an SVG arrow representing
+    a change in stack depth from OLD_DEPTH to NEW_DEPTH.  */
+ 
+ static void
+ emit_svg_arrow (xml::printer &xp, int old_depth, int new_depth)
+ {
+   const int pixels_per_depth = 100;
+   const int min_depth = MIN (old_depth, new_depth);
+   const int base_x = 20;
+   const int excess = 30;
+   const int last_x
+     = base_x + (old_depth - min_depth) * pixels_per_depth;
+   const int this_x
+     = base_x + (new_depth - min_depth) * pixels_per_depth;
+   pretty_printer tmp_pp;
+   pretty_printer *pp = &tmp_pp;
+   pp_printf (pp, "<div class=\"%s\">\n",
+ 	     old_depth < new_depth
+ 	     ? "between-ranges-call" : "between-ranges-return");
+   pp_printf (pp, "  <svg height=\"30\" width=\"%i\">\n",
+ 	     MAX (last_x, this_x) + excess);
+   pp_string
+     (pp,
+      "    <defs>\n"
+      "      <marker id=\"arrowhead\" markerWidth=\"10\" markerHeight=\"7\"\n"
+      "              refX=\"0\" refY=\"3.5\" orient=\"auto\" stroke=\"#0088ce\" fill=\"#0088ce\">\n"
+      "      <polygon points=\"0 0, 10 3.5, 0 7\"/>\n"
+      "      </marker>\n"
+      "    </defs>\n");
+   pp_printf (pp,
+ 	     "    <polyline points=\"%i,0 %i,10 %i,10 %i,20\"\n",
+ 	     last_x, last_x, this_x, this_x);
+   pp_string
+     (pp,
+      "              style=\"fill:none;stroke: #0088ce\"\n"
+      "              marker-end=\"url(#arrowhead)\"/>\n"
+      "  </svg>\n"
+      "</div>\n\n");
+   xp.add_raw (pp_formatted_text (pp));
+ }
+ 
+ /* A range of consecutive events within a diagnostic_path, all within the
+    same thread, and with the same fndecl and stack_depth, and which are suitable
+    to print with a single call to diagnostic_show_locus.  */
+ struct event_range
+ {
+   /* A struct for tracking the mergability of labels on a particular
+      source line.  In particular, track information about links between
+      labels to ensure that we only consolidate events involving links
+      that the source-printing code is able to handle (splitting them
+      otherwise).  */
+   struct per_source_line_info
+   {
+     void init (int line)
+     {
+       m_line = line;
+       m_has_in_edge = false;
+       m_has_out_edge = false;
+       m_min_label_source_column = INT_MAX;
+       m_max_label_source_column = INT_MIN;
+     }
+ 
+     /* Return true if our source-printing/labelling/linking code can handle
+        the events already on this source line, *and* a new event at COLUMN.  */
+     bool
+     can_add_label_for_event_p (bool has_in_edge,
+ 			       const diagnostic_event *prev_event,
+ 			       bool has_out_edge,
+ 			       int column) const
+     {
+       /* Any existing in-edge has to be the left-most label on its
+ 	 source line.  */
+       if (m_has_in_edge && column < m_min_label_source_column)
+ 	return false;
+       /* Any existing out-edge has to be the right-most label on its
+ 	 source line.  */
+       if (m_has_out_edge && column > m_max_label_source_column)
+ 	return false;
+       /* Can't have more than one in-edge.  */
+       if (m_has_in_edge && has_in_edge)
+ 	return false;
+       /* Can't have more than one out-edge.  */
+       if (m_has_out_edge && has_out_edge)
+ 	return false;
+ 
+       if (has_in_edge)
+ 	{
+ 	  /* Any new in-edge needs to be the left-most label on its
+ 	     source line.  */
+ 	  if (column > m_min_label_source_column)
+ 	    return false;
+ 
+ 	  gcc_assert (prev_event);
+ 	  const location_t prev_loc = prev_event->get_location ();
+ 	  expanded_location prev_exploc
+ 	    = linemap_client_expand_location_to_spelling_point
+ 		(line_table, prev_loc, LOCATION_ASPECT_CARET);
+ 	  /* The destination in-edge's line number has to be <= the
+ 	     source out-edge's line number (if any).  */
+ 	  if (prev_exploc.line >= m_line)
+ 	    return false;
+ 	}
+ 
+       /* Any new out-edge needs to be the right-most label on its
+ 	 source line.  */
+       if (has_out_edge)
+ 	if (column < m_max_label_source_column)
+ 	  return false;
+ 
+       /* All checks passed; we can add the new event at COLUMN.  */
+       return true;
+     }
+ 
+     void
+     add_label_for_event (bool has_in_edge, bool has_out_edge, int column)
+     {
+       if (has_in_edge)
+ 	m_has_in_edge = true;
+       if (has_out_edge)
+ 	m_has_out_edge = true;
+       m_min_label_source_column = std::min (m_min_label_source_column, column);
+       m_max_label_source_column = std::max (m_max_label_source_column, column);
+     }
+ 
+     int m_line;
+     bool m_has_in_edge;
+     bool m_has_out_edge;
+     int m_min_label_source_column;
+     int m_max_label_source_column;
+   };
+ 
+   event_range (const diagnostic_path &path,
+ 	       const pretty_printer &ref_pp,
+ 	       unsigned start_idx,
+ 	       const diagnostic_event &initial_event,
+ 	       per_thread_summary &t,
+ 	       bool show_event_links,
+ 	       bool colorize_labels,
+ 	       bool allow_emojis)
+   : m_path (path),
+     m_initial_event (initial_event),
+     m_logical_loc (initial_event.get_logical_location ()),
+     m_stack_depth (initial_event.get_stack_depth ()),
+     m_start_idx (start_idx), m_end_idx (start_idx),
+     m_path_label (path, ref_pp,
+ 		  start_idx, colorize_labels, allow_emojis),
+     m_richloc (initial_event.get_location (), &m_path_label, nullptr),
+     m_thread_id (initial_event.get_thread_id ()),
+     m_per_thread_summary (t),
+     m_show_event_links (show_event_links)
+   {
+     if (m_show_event_links)
+       {
+ 	expanded_location exploc
+ 	  = linemap_client_expand_location_to_spelling_point
+ 	  (line_table, initial_event.get_location (), LOCATION_ASPECT_CARET);
+ 	per_source_line_info &source_line_info
+ 	  = get_per_source_line_info (exploc.line);
+ 
+ 	const diagnostic_event *prev_thread_event = t.m_last_event;
+ 	const bool has_in_edge
+ 	  = (prev_thread_event
+ 	     ? prev_thread_event->connect_to_next_event_p ()
+ 	     : false);
+ 	const bool has_out_edge = initial_event.connect_to_next_event_p ();
+ 
+ 	source_line_info.add_label_for_event
+ 	  (has_in_edge, has_out_edge, exploc.column);
+       }
+   }
+ 
+   per_source_line_info &
+   get_per_source_line_info (int source_line)
+   {
+     bool existed = false;
+     per_source_line_info &result
+       = m_source_line_info_map.get_or_insert (source_line, &existed);
+     if (!existed)
+       result.init (source_line);
+     return result;
+   }
+ 
+   bool maybe_add_event (const path_print_policy &policy,
+ 			const diagnostic_event &new_ev,
+ 			unsigned new_ev_idx,
+ 			bool check_rich_locations)
+   {
+     if (!can_consolidate_events (m_path,
+ 				 m_initial_event, m_start_idx,
+ 				 new_ev, new_ev_idx,
+ 				 check_rich_locations))
+       return false;
+ 
+     /* Verify compatibility of the new label and existing labels
+        with respect to the link-printing code.  */
+     expanded_location exploc
+       = linemap_client_expand_location_to_spelling_point
+       (line_table, new_ev.get_location (), LOCATION_ASPECT_CARET);
+     per_source_line_info &source_line_info
+       = get_per_source_line_info (exploc.line);
+     const diagnostic_event *prev_event = nullptr;
+     if (new_ev_idx > 0)
+       prev_event = &m_path.get_event (new_ev_idx - 1);
+     const bool has_in_edge = (prev_event
+ 			      ? prev_event->connect_to_next_event_p ()
+ 			      : false);
+     const bool has_out_edge = new_ev.connect_to_next_event_p ();
+     if (m_show_event_links)
+       if (!source_line_info.can_add_label_for_event_p
+ 	  (has_in_edge, prev_event,
+ 	   has_out_edge, exploc.column))
+ 	return false;
+ 
+     /* Potentially verify that the locations are sufficiently close.  */
+     if (check_rich_locations)
+       if (!m_richloc.add_location_if_nearby (policy.get_source_policy (),
+ 					     new_ev.get_location (),
+ 					     false, &m_path_label))
+ 	return false;
+ 
+     m_end_idx = new_ev_idx;
+     m_per_thread_summary.m_last_event = &new_ev;
+ 
+     if (m_show_event_links)
+       source_line_info.add_label_for_event
+ 	(has_in_edge, has_out_edge, exploc.column);
+ 
+     return true;
+   }
+ 
+   /* Print the events in this range to PP, typically as a single
+      call to diagnostic_show_locus.  */
+ 
+   void print_as_text (pretty_printer &pp,
+ 		      diagnostic_text_output_format &text_output,
+ 		      diagnostic_source_effect_info *effect_info)
+   {
+     location_t initial_loc = m_initial_event.get_location ();
+ 
+     diagnostic_context &dc = text_output.get_context ();
+ 
+     /* Emit a span indicating the filename (and line/column) if the
+        line has changed relative to the last call to
+        diagnostic_show_locus.  */
+     if (dc.m_source_printing.enabled)
+       {
+ 	expanded_location exploc
+ 	  = linemap_client_expand_location_to_spelling_point
+ 	  (line_table, initial_loc, LOCATION_ASPECT_CARET);
+ 	if (exploc.file != LOCATION_FILE (dc.m_last_location))
+ 	  {
+ 	    diagnostic_location_print_policy loc_policy (text_output);
+ 	    loc_policy.print_text_span_start (dc, pp, exploc);
+ 	  }
+       }
+ 
+     /* If we have an UNKNOWN_LOCATION (or BUILTINS_LOCATION) as the
+        primary location for an event, diagnostic_show_locus won't print
+        anything.
+ 
+        In particular the label for the event won't get printed.
+        Fail more gracefully in this case by showing the event
+        index and text, at no particular location.  */
+     if (get_pure_location (initial_loc) <= BUILTINS_LOCATION)
+       {
+ 	for (unsigned i = m_start_idx; i <= m_end_idx; i++)
+ 	  {
+ 	    const diagnostic_event &iter_event = m_path.get_event (i);
+ 	    diagnostic_event_id_t event_id (i);
+ 	    pp_printf (&pp, " %@: ", &event_id);
+ 	    iter_event.print_desc (pp);
+ 	    pp_newline (&pp);
+ 	  }
+ 	return;
+       }
+ 
+     /* Call diagnostic_show_locus to show the events using labels.  */
+     diagnostic_show_locus (&dc, text_output.get_source_printing_options (),
+ 			   &m_richloc, DK_DIAGNOSTIC_PATH, &pp,
+ 			   effect_info);
+ 
+     /* If we have a macro expansion, show the expansion to the user.  */
+     if (linemap_location_from_macro_expansion_p (line_table, initial_loc))
+       {
+ 	gcc_assert (m_start_idx == m_end_idx);
+ 	maybe_unwind_expanded_macro_loc (text_output, initial_loc);
+       }
+   }
+ 
+   /* Print the events in this range to XP, typically as a single
+      call to diagnostic_show_locus_as_html.  */
+ 
+   void print_as_html (xml::printer &xp,
+ 		      diagnostic_context &dc,
+ 		      diagnostic_source_effect_info *effect_info,
+ 		      html_label_writer *event_label_writer)
+   {
+     location_t initial_loc = m_initial_event.get_location ();
+ 
+     /* Emit a span indicating the filename (and line/column) if the
+        line has changed relative to the last call to
+        diagnostic_show_locus.  */
+     if (dc.m_source_printing.enabled)
+       {
+ 	expanded_location exploc
+ 	  = linemap_client_expand_location_to_spelling_point
+ 	  (line_table, initial_loc, LOCATION_ASPECT_CARET);
+ 	if (exploc.file != LOCATION_FILE (dc.m_last_location))
+ 	  {
+ 	    diagnostic_location_print_policy loc_policy (dc);
+ 	    loc_policy.print_html_span_start (dc, xp, exploc);
+ 	  }
+       }
+ 
+     /* If we have an UNKNOWN_LOCATION (or BUILTINS_LOCATION) as the
+        primary location for an event, diagnostic_show_locus_as_html won't print
+        anything.
+ 
+        In particular the label for the event won't get printed.
+        Fail more gracefully in this case by showing the event
+        index and text, at no particular location.  */
+     if (get_pure_location (initial_loc) <= BUILTINS_LOCATION)
+       {
+ 	for (unsigned i = m_start_idx; i <= m_end_idx; i++)
+ 	  {
+ 	    const diagnostic_event &iter_event = m_path.get_event (i);
+ 	    diagnostic_event_id_t event_id (i);
+ 	    pretty_printer pp;
+ 	    pp_printf (&pp, " %@: ", &event_id);
+ 	    iter_event.print_desc (pp);
+ 	    if (event_label_writer)
+ 	      event_label_writer->begin_label ();
+ 	    xp.add_text (pp_formatted_text (&pp));
+ 	    if (event_label_writer)
+ 	      event_label_writer->end_label ();
+ 	  }
+ 	return;
+       }
+ 
+     /* Call diagnostic_show_locus_as_html to show the source,
+        showing events using labels.  */
+     diagnostic_show_locus_as_html (&dc, dc.m_source_printing,
+ 				   &m_richloc, DK_DIAGNOSTIC_PATH, xp,
+ 				   effect_info, event_label_writer);
+ 
+     // TODO: show macro expansions
+   }
+ 
+   const diagnostic_path &m_path;
+   const diagnostic_event &m_initial_event;
+   logical_location m_logical_loc;
+   int m_stack_depth;
+   unsigned m_start_idx;
+   unsigned m_end_idx;
+   path_label m_path_label;
+   gcc_rich_location m_richloc;
+   diagnostic_thread_id_t m_thread_id;
+   per_thread_summary &m_per_thread_summary;
+   hash_map<int_hash<int, -1, -2>,
+ 	   per_source_line_info> m_source_line_info_map;
+   bool m_show_event_links;
+ };
+ 
+ /* A struct for grouping together the events in a diagnostic_path into
+    ranges of events, partitioned by thread and by stack frame (i.e. by fndecl
+    and stack depth).  */
+ 
+ struct path_summary
+ {
+   path_summary (const path_print_policy &policy,
+ 		const pretty_printer &ref_pp,
+ 		const diagnostic_path &path,
+ 		bool check_rich_locations,
+ 		bool colorize = false,
+ 		bool show_event_links = true);
+ 
+   const logical_location_manager &get_logical_location_manager () const
+   {
+     return m_logical_loc_mgr;
+   }
+   unsigned get_num_ranges () const { return m_ranges.length (); }
+   bool multithreaded_p () const { return m_per_thread_summary.length () > 1; }
+ 
+   const per_thread_summary &get_events_for_thread_id (diagnostic_thread_id_t tid)
+   {
+     per_thread_summary **slot = m_thread_id_to_events.get (tid);
+     gcc_assert (slot);
+     gcc_assert (*slot);
+     return **slot;
+   }
+ 
+   const logical_location_manager &m_logical_loc_mgr;
+   auto_delete_vec <event_range> m_ranges;
+   auto_delete_vec <per_thread_summary> m_per_thread_summary;
+   hash_map<int_hash<diagnostic_thread_id_t, -1, -2>,
+ 	   per_thread_summary *> m_thread_id_to_events;
+ 
+ private:
+   per_thread_summary &
+   get_or_create_events_for_thread_id (const diagnostic_path &path,
+ 				      diagnostic_thread_id_t tid)
+   {
+     if (per_thread_summary **slot = m_thread_id_to_events.get (tid))
+       return **slot;
+ 
+     const diagnostic_thread &thread = path.get_thread (tid);
+     per_thread_summary *pts
+       = new per_thread_summary (path,
+ 				m_logical_loc_mgr,
+ 				thread.get_name (false),
+ 				m_per_thread_summary.length ());
+     m_thread_id_to_events.put (tid, pts);
+     m_per_thread_summary.safe_push (pts);
+     return *pts;
+   }
+ };
+ 
+ /* Return true iff there is more than one stack frame used by the events
+    of this thread.  */
+ 
+ bool
+ per_thread_summary::interprocedural_p () const
+ {
+   if (m_event_ranges.is_empty ())
+     return false;
+   int first_stack_depth = m_event_ranges[0]->m_stack_depth;
+   for (auto range : m_event_ranges)
+     {
+       if (!m_path.same_function_p (m_event_ranges[0]->m_start_idx,
+ 				   range->m_start_idx))
+ 	  return true;
+       if (range->m_stack_depth != first_stack_depth)
+ 	return true;
+     }
+   return false;
+ }
+ 
+ /* path_summary's ctor.  */
+ 
+ path_summary::path_summary (const path_print_policy &policy,
+ 			    const pretty_printer &ref_pp,
+ 			    const diagnostic_path &path,
+ 			    bool check_rich_locations,
+ 			    bool colorize,
+ 			    bool show_event_links)
+ : m_logical_loc_mgr (path.get_logical_location_manager ())
+ {
+   const unsigned num_events = path.num_events ();
+ 
+   event_range *cur_event_range = NULL;
+   for (unsigned idx = 0; idx < num_events; idx++)
+     {
+       const diagnostic_event &event = path.get_event (idx);
+       const diagnostic_thread_id_t thread_id = event.get_thread_id ();
+       per_thread_summary &pts
+ 	= get_or_create_events_for_thread_id (path, thread_id);
+ 
+       pts.update_depth_limits (event.get_stack_depth ());
+ 
+       if (cur_event_range)
+ 	if (cur_event_range->maybe_add_event (policy,
+ 					      event,
+ 					      idx, check_rich_locations))
+ 	  continue;
+ 
+       auto theme = policy.get_diagram_theme ();
+       const bool allow_emojis = theme ? theme->emojis_p () : false;
+       cur_event_range = new event_range (path, ref_pp,
+ 					 idx, event, pts,
+ 					 show_event_links,
+ 					 colorize,
+ 					 allow_emojis);
+       m_ranges.safe_push (cur_event_range);
+       pts.m_event_ranges.safe_push (cur_event_range);
+       pts.m_last_event = &event;
+     }
+ }
+ 
+ /* Write SPACES to PP.  */
+ 
+ static void
+ write_indent (pretty_printer *pp, int spaces)
+ {
+   for (int i = 0; i < spaces; i++)
+     pp_space (pp);
+ }
+ 
+ static const int base_indent = 2;
+ static const int per_frame_indent = 2;
+ 
+ /* A bundle of state for printing event_range instances for a particular
+    thread.  */
+ 
+ class thread_event_printer
+ {
+ public:
+   thread_event_printer (const per_thread_summary &t, bool show_depths)
+   : m_per_thread_summary (t),
+     m_show_depths (show_depths),
+     m_cur_indent (base_indent),
+     m_vbar_column_for_depth (),
+     m_num_printed (0)
+   {
+   }
+ 
+   /* Get the previous event_range within this thread, if any.  */
+   const event_range *get_any_prev_range () const
+   {
+     if (m_num_printed > 0)
+       return m_per_thread_summary.m_event_ranges[m_num_printed - 1];
+     else
+       return nullptr;
+   }
+ 
+   /* Get the next event_range within this thread, if any.  */
+   const event_range *get_any_next_range () const
+   {
+     if (m_num_printed < m_per_thread_summary.m_event_ranges.length () - 1)
+       return m_per_thread_summary.m_event_ranges[m_num_printed + 1];
+     else
+       return nullptr;
+   }
+ 
+   void
+   print_swimlane_for_event_range_as_text (diagnostic_text_output_format &text_output,
+ 					  pretty_printer *pp,
+ 					  const logical_location_manager &logical_loc_mgr,
+ 					  event_range *range,
+ 					  diagnostic_source_effect_info *effect_info)
+   {
+     gcc_assert (pp);
+     const char *const line_color = "path";
+     const char *start_line_color
+       = colorize_start (pp_show_color (pp), line_color);
+     const char *end_line_color = colorize_stop (pp_show_color (pp));
+ 
+     text_art::ascii_theme fallback_theme;
+     text_art::theme *theme = text_output.get_diagram_theme ();
+     if (!theme)
+       theme = &fallback_theme;
+ 
+     cppchar_t depth_marker_char = theme->get_cppchar
+       (text_art::theme::cell_kind::INTERPROCEDURAL_DEPTH_MARKER);
+     /* e.g. "|".  */
+ 
+     const bool interprocedural_p = m_per_thread_summary.interprocedural_p ();
+ 
+     write_indent (pp, m_cur_indent);
+     if (const event_range *prev_range = get_any_prev_range ())
+       {
+ 	if (range->m_stack_depth > prev_range->m_stack_depth)
+ 	  {
+ 	    gcc_assert (interprocedural_p);
+ 	    /* Show pushed stack frame(s).  */
+ 	    cppchar_t left = theme->get_cppchar
+ 	      (text_art::theme::cell_kind::INTERPROCEDURAL_PUSH_FRAME_LEFT);
+ 	    cppchar_t middle = theme->get_cppchar
+ 	      (text_art::theme::cell_kind::INTERPROCEDURAL_PUSH_FRAME_MIDDLE);
+ 	    cppchar_t right = theme->get_cppchar
+ 	      (text_art::theme::cell_kind::INTERPROCEDURAL_PUSH_FRAME_RIGHT);
+ 	    /* e.g. "+--> ".  */
+ 	    pp_string (pp, start_line_color);
+ 	    pp_unicode_character (pp, left);
+ 	    pp_unicode_character (pp, middle);
+ 	    pp_unicode_character (pp, middle);
+ 	    pp_unicode_character (pp, right);
+ 	    pp_space (pp);
+ 	    pp_string (pp, end_line_color);
+ 	    m_cur_indent += 5;
+ 	  }
+       }
+     if (range->m_logical_loc)
+       {
+ 	label_text name
+ 	  (logical_loc_mgr.get_name_for_path_output (range->m_logical_loc));
+ 	if (name.get ())
+ 	  pp_printf (pp, "%qs: ", name.get ());
+       }
+     if (range->m_start_idx == range->m_end_idx)
+       pp_printf (pp, "event %i",
+ 		 range->m_start_idx + 1);
+     else
+       pp_printf (pp, "events %i-%i",
+ 		 range->m_start_idx + 1, range->m_end_idx + 1);
+     if (m_show_depths)
+       pp_printf (pp, " (depth %i)", range->m_stack_depth);
+     pp_newline (pp);
+ 
+     /* Print a run of events.  */
+     if (interprocedural_p)
+       {
+ 	write_indent (pp, m_cur_indent + per_frame_indent);
+ 	pp_string (pp, start_line_color);
+ 	pp_unicode_character (pp, depth_marker_char);
+ 	pp_string (pp, end_line_color);
+ 	pp_newline (pp);
+ 
+ 	char *saved_prefix = pp_take_prefix (pp);
+ 	char *prefix;
+ 	{
+ 	  pretty_printer tmp_pp;
+ 	  write_indent (&tmp_pp, m_cur_indent + per_frame_indent);
+ 	  pp_string (&tmp_pp, start_line_color);
+ 	  pp_unicode_character (&tmp_pp, depth_marker_char);
+ 	  pp_string (&tmp_pp, end_line_color);
+ 	  prefix = xstrdup (pp_formatted_text (&tmp_pp));
+ 	}
+ 	pp_set_prefix (pp, prefix);
+ 	pp_prefixing_rule (pp) = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
+ 	range->print_as_text (*pp, text_output, effect_info);
+ 	pp_set_prefix (pp, saved_prefix);
+ 
+ 	write_indent (pp, m_cur_indent + per_frame_indent);
+ 	pp_string (pp, start_line_color);
+ 	pp_unicode_character (pp, depth_marker_char);
+ 	pp_string (pp, end_line_color);
+ 	pp_newline (pp);
+       }
+     else
+       range->print_as_text (*pp, text_output, effect_info);
+ 
+     if (const event_range *next_range = get_any_next_range ())
+       {
+ 	if (range->m_stack_depth > next_range->m_stack_depth)
+ 	  {
+ 	    if (m_vbar_column_for_depth.get (next_range->m_stack_depth))
+ 	      {
+ 		/* Show returning from stack frame(s), by printing
+ 		   something like:
+ 		   "                   |\n"
+ 		   "     <-------------+\n"
+ 		   "     |\n".  */
+ 		gcc_assert (interprocedural_p);
+ 		cppchar_t left = theme->get_cppchar
+ 		  (text_art::theme::cell_kind::INTERPROCEDURAL_POP_FRAMES_LEFT);
+ 		cppchar_t middle = theme->get_cppchar
+ 		  (text_art::theme::cell_kind::INTERPROCEDURAL_POP_FRAMES_MIDDLE);
+ 		cppchar_t right = theme->get_cppchar
+ 		  (text_art::theme::cell_kind::INTERPROCEDURAL_POP_FRAMES_RIGHT);
+ 		int vbar_for_next_frame
+ 		  = *m_vbar_column_for_depth.get (next_range->m_stack_depth);
+ 
+ 		int indent_for_next_frame
+ 		  = vbar_for_next_frame - per_frame_indent;
+ 		write_indent (pp, vbar_for_next_frame);
+ 		pp_string (pp, start_line_color);
+ 		pp_unicode_character (pp, left);
+ 		for (int i = indent_for_next_frame + per_frame_indent;
+ 		     i < m_cur_indent + per_frame_indent - 1; i++)
+ 		  pp_unicode_character (pp, middle);
+ 		pp_unicode_character (pp, right);
+ 		pp_string (pp, end_line_color);
+ 		pp_newline (pp);
+ 		m_cur_indent = indent_for_next_frame;
+ 
+ 		write_indent (pp, vbar_for_next_frame);
+ 		pp_string (pp, start_line_color);
+ 		pp_unicode_character (pp, depth_marker_char);
+ 		pp_string (pp, end_line_color);
+ 		pp_newline (pp);
+ 	      }
+ 	    else
+ 	      {
+ 		/* Handle disjoint paths (e.g. a callback at some later
+ 		   time).  */
+ 		m_cur_indent = base_indent;
+ 	      }
+ 	  }
+ 	else if (range->m_stack_depth < next_range->m_stack_depth)
+ 	  {
+ 	    /* Prepare to show pushed stack frame.  */
+ 	    gcc_assert (interprocedural_p);
+ 	    gcc_assert (range->m_stack_depth != EMPTY);
+ 	    gcc_assert (range->m_stack_depth != DELETED);
+ 	    m_vbar_column_for_depth.put (range->m_stack_depth,
+ 					 m_cur_indent + per_frame_indent);
+ 	    m_cur_indent += per_frame_indent;
+ 	  }
+       }
+ 
+     m_num_printed++;
+   }
+ 
+   void
+   print_swimlane_for_event_range_as_html (diagnostic_context &dc,
+ 					  xml::printer &xp,
+ 					  html_label_writer *event_label_writer,
+ 					  event_range *range,
+ 					  diagnostic_source_effect_info *effect_info)
+   {
+     range->print_as_html (xp, dc, effect_info, event_label_writer);
+     m_num_printed++;
+   }
+ 
+   int get_cur_indent () const { return m_cur_indent; }
+ 
+ private:
+   const per_thread_summary &m_per_thread_summary;
+   bool m_show_depths;
+ 
+   /* Print the ranges.  */
+   int m_cur_indent;
+ 
+   /* Keep track of column numbers of existing '|' characters for
+      stack depths we've already printed.  */
+   static const int EMPTY = -1;
+   static const int DELETED = -2;
+   typedef int_hash <int, EMPTY, DELETED> vbar_hash;
+   hash_map <vbar_hash, int> m_vbar_column_for_depth;
+ 
+   /* How many event ranges within this swimlane have we printed.
+      This is the index of the next event_range to print.  */
+   unsigned  m_num_printed;
+ };
+ 
+ /* Print path_summary PS to TEXT_OUTPUT, giving an overview of the
+    interprocedural calls and returns.
+ 
+    Print the event descriptions in a nested form, printing the event
+    descriptions within calls to diagnostic_show_locus, using labels to
+    show the events:
+ 
+    'foo' (events 1-2)
+      | NN |
+      |    |
+      +--> 'bar' (events 3-4)
+             | NN |
+             |    |
+             +--> 'baz' (events 5-6)
+                    | NN |
+                    |    |
+      <------------ +
+      |
+    'foo' (events 7-8)
+      | NN |
+      |    |
+      +--> 'bar' (events 9-10)
+             | NN |
+             |    |
+             +--> 'baz' (events 11-12)
+                    | NN |
+                    |    |
+ 
+    If SHOW_DEPTHS is true, append " (depth N)" to the header of each run
+    of events.
+ 
+    For events with UNKNOWN_LOCATION, print a summary of each the event.  */
+ 
+ static void
+ print_path_summary_as_text (const path_summary &ps,
+ 			    diagnostic_text_output_format &text_output,
+ 			    bool show_depths)
+ {
+   pretty_printer *const pp = text_output.get_printer ();
+ 
+   std::vector<thread_event_printer> thread_event_printers;
+   for (auto t : ps.m_per_thread_summary)
+     thread_event_printers.push_back (thread_event_printer (*t, show_depths));
+ 
+   unsigned i;
+   event_range *range;
+   int last_out_edge_column = -1;
+   FOR_EACH_VEC_ELT (ps.m_ranges, i, range)
+     {
+       const int swimlane_idx
+ 	= range->m_per_thread_summary.get_swimlane_index ();
+       if (ps.multithreaded_p ())
+ 	if (i == 0 || ps.m_ranges[i - 1]->m_thread_id != range->m_thread_id)
+ 	  {
+ 	    if (i > 0)
+ 	      pp_newline (pp);
+ 	    pp_printf (pp, "Thread: %qs",
+ 		       range->m_per_thread_summary.get_name ());
+ 	    pp_newline (pp);
+ 	  }
+       thread_event_printer &tep = thread_event_printers[swimlane_idx];
+       /* Wire up any trailing out-edge from previous range to leading in-edge
+ 	 of this range.  */
+       diagnostic_source_effect_info effect_info;
+       effect_info.m_leading_in_edge_column = last_out_edge_column;
+       tep.print_swimlane_for_event_range_as_text
+ 	(text_output, pp,
+ 	 ps.get_logical_location_manager (),
+ 	 range, &effect_info);
+       last_out_edge_column = effect_info.m_trailing_out_edge_column;
+     }
+ }
+ 
+ /* Print PS as HTML to XP, using DC and, if non-null EVENT_LABEL_WRITER.  */
+ 
+ static void
+ print_path_summary_as_html (const path_summary &ps,
+ 			    diagnostic_context &dc,
+ 			    xml::printer &xp,
+ 			    html_label_writer *event_label_writer,
+ 			    bool show_depths)
+ {
+   std::vector<thread_event_printer> thread_event_printers;
+   for (auto t : ps.m_per_thread_summary)
+     thread_event_printers.push_back (thread_event_printer (*t, show_depths));
+ 
+   const logical_location_manager *logical_loc_mgr
+     = dc.get_logical_location_manager ();
+ 
+   xp.push_tag_with_class ("div", "event-ranges", false);
+ 
+   /* Group the ranges into stack frames.  */
+   std::unique_ptr<stack_frame> curr_frame;
+   unsigned i;
+   event_range *range;
+   int last_out_edge_column = -1;
+   FOR_EACH_VEC_ELT (ps.m_ranges, i, range)
+     {
+       const int swimlane_idx
+ 	= range->m_per_thread_summary.get_swimlane_index ();
+ 
+       const logical_location this_logical_loc = range->m_logical_loc;
+       const int this_depth = range->m_stack_depth;
+       if (curr_frame)
+ 	{
+ 	  int old_stack_depth = curr_frame->m_stack_depth;
+ 	  if (this_depth > curr_frame->m_stack_depth)
+ 	    {
+ 	      emit_svg_arrow (xp, old_stack_depth, this_depth);
+ 	      curr_frame
+ 		= begin_html_stack_frame (xp,
+ 					  std::move (curr_frame),
+ 					  range->m_logical_loc,
+ 					  range->m_stack_depth,
+ 					  logical_loc_mgr);
+ 	    }
+ 	  else
+ 	    {
+ 	      while (this_depth < curr_frame->m_stack_depth
+ 		     || this_logical_loc != curr_frame->m_logical_loc)
+ 		{
+ 		  curr_frame = end_html_stack_frame (xp, std::move (curr_frame));
+ 		  if (curr_frame == NULL)
+ 		    {
+ 		      curr_frame
+ 			= begin_html_stack_frame (xp,
+ 						  nullptr,
+ 						  range->m_logical_loc,
+ 						  range->m_stack_depth,
+ 						  logical_loc_mgr);
+ 		      break;
+ 		    }
+ 		}
+ 	      emit_svg_arrow (xp, old_stack_depth, this_depth);
+ 	    }
+ 	}
+       else
+ 	{
+ 	  curr_frame = begin_html_stack_frame (xp,
+ 					       NULL,
+ 					       range->m_logical_loc,
+ 					       range->m_stack_depth,
+ 					       logical_loc_mgr);
+ 	}
+ 
+       xp.push_tag_with_class ("table", "event-range-with-margin", false);
+       xp.push_tag ("tr", false);
+       xp.push_tag_with_class ("td", "event-range", false);
+       xp.push_tag_with_class ("div", "events-hdr", true);
+       if (range->m_logical_loc)
+ 	{
+ 	  gcc_assert (logical_loc_mgr);
+ 	  label_text funcname
+ 	    = logical_loc_mgr->get_name_for_path_output (range->m_logical_loc);
+ 	  if (funcname.get ())
+ 	    {
+ 	      xp.push_tag_with_class ("span", "funcname", true);
+ 	      xp.add_text (funcname.get ());
+ 	      xp.pop_tag (); //span
+ 	      xp.add_text (": ");
+ 	    }
+ 	}
+       {
+ 	xp.push_tag_with_class ("span", "event-ids", true);
+ 	pretty_printer pp;
+ 	if (range->m_start_idx == range->m_end_idx)
+ 	  pp_printf (&pp, "event %i",
+ 		     range->m_start_idx + 1);
+ 	else
+ 	  pp_printf (&pp, "events %i-%i",
+ 		     range->m_start_idx + 1, range->m_end_idx + 1);
+ 	xp.add_text (pp_formatted_text (&pp));
+ 	xp.pop_tag (); // span
+       }
+       if (show_depths)
+ 	{
+ 	  xp.add_text (" ");
+ 	  xp.push_tag_with_class ("span", "depth", true);
+ 	  pretty_printer pp;
+ 	  pp_printf (&pp, "(depth %i)", range->m_stack_depth);
+ 	  xp.add_text (pp_formatted_text (&pp));
+ 	  xp.pop_tag (); //span
+ 	}
+       xp.pop_tag (); // div
+ 
+       /* Print a run of events.  */
+       thread_event_printer &tep = thread_event_printers[swimlane_idx];
+       /* Wire up any trailing out-edge from previous range to leading in-edge
+ 	 of this range.  */
+       diagnostic_source_effect_info effect_info;
+       effect_info.m_leading_in_edge_column = last_out_edge_column;
+       tep.print_swimlane_for_event_range_as_html (dc, xp, event_label_writer,
+ 						  range, &effect_info);
+       last_out_edge_column = effect_info.m_trailing_out_edge_column;
+ 
+       xp.pop_tag (); // td
+       xp.pop_tag (); // tr
+       xp.pop_tag (); // table
+     }
+ 
+   /* Close outstanding frames.  */
+   while (curr_frame)
+     curr_frame = end_html_stack_frame (xp, std::move (curr_frame));
+ 
+   xp.pop_tag (); // div
+ }
+ 
+ } /* end of anonymous namespace for path-printing code.  */
+ 
+ class element_event_desc : public pp_element
+ {
+ public:
+   element_event_desc (const diagnostic_event &event)
+   : m_event (event)
+   {
+   }
+ 
+   void add_to_phase_2 (pp_markup::context &ctxt) final override
+   {
+     auto pp = ctxt.m_pp.clone ();
+     m_event.print_desc (*pp.get ());
+     pp_string (&ctxt.m_pp, pp_formatted_text (pp.get ()));
+   }
+ 
+ private:
+   const diagnostic_event &m_event;
+ };
+ 
+ /* Print PATH according to the context's path_format.  */
+ 
+ void
+ diagnostic_text_output_format::print_path (const diagnostic_path &path)
+ {
+   const unsigned num_events = path.num_events ();
+ 
+   switch (get_context ().get_path_format ())
+     {
+     case DPF_NONE:
+       /* Do nothing.  */
+       return;
+ 
+     case DPF_SEPARATE_EVENTS:
+       {
+ 	/* A note per event.  */
+ 	auto &logical_loc_mgr = path.get_logical_location_manager ();
+ 	for (unsigned i = 0; i < num_events; i++)
+ 	  {
+ 	    const diagnostic_event &event = path.get_event (i);
+ 	    element_event_desc e_event_desc (event);
+ 	    diagnostic_event_id_t event_id (i);
+ 	    if (get_context ().show_path_depths_p ())
+ 	      {
+ 		int stack_depth = event.get_stack_depth ();
+ 		/* -fdiagnostics-path-format=separate-events doesn't print
+ 		   fndecl information, so with -fdiagnostics-show-path-depths
+ 		   print the fndecls too, if any.  */
+ 		if (logical_location logical_loc
+ 		      = event.get_logical_location ())
+ 		  {
+ 		    label_text name
+ 		      (logical_loc_mgr.get_name_for_path_output (logical_loc));
+ 		    inform (event.get_location (),
+ 			    "%@ %e (fndecl %qs, depth %i)",
+ 			    &event_id, &e_event_desc,
+ 			    name.get (), stack_depth);
+ 		  }
+ 		else
+ 		  inform (event.get_location (),
+ 			  "%@ %e (depth %i)",
+ 			  &event_id, &e_event_desc,
+ 			  stack_depth);
+ 	      }
+ 	    else
+ 	      inform (event.get_location (),
+ 		      "%@ %e", &event_id, &e_event_desc);
+ 	  }
+       }
+       break;
+ 
+     case DPF_INLINE_EVENTS:
+       {
+ 	/* Consolidate related events.  */
+ 	path_print_policy policy (*this);
+ 	pretty_printer *const pp = get_printer ();
+ 	const bool check_rich_locations = true;
+ 	const bool colorize = pp_show_color (pp);
+ 	const bool show_event_links = m_source_printing.show_event_links_p;
+ 	path_summary summary (policy,
+ 			      *pp,
+ 			      path,
+ 			      check_rich_locations,
+ 			      colorize,
+ 			      show_event_links);
+ 	char *saved_prefix = pp_take_prefix (pp);
+ 	pp_set_prefix (pp, NULL);
+ 	print_path_summary_as_text (summary, *this,
+ 				    get_context ().show_path_depths_p ());
+ 	pp_flush (pp);
+ 	pp_set_prefix (pp, saved_prefix);
+       }
+       break;
+     }
+ }
+ 
+ /* Print PATH as HTML to XP, using DC and DSPP for settings.
+    If non-null, use EVENT_LABEL_WRITER when writing events.  */
+ 
+ void
+ print_path_as_html (xml::printer &xp,
+ 		    const diagnostic_path &path,
+ 		    diagnostic_context &dc,
+ 		    html_label_writer *event_label_writer,
+ 		    const diagnostic_source_print_policy &dspp)
+ {
+   path_print_policy policy (dc);
+   const bool check_rich_locations = true;
+   const bool colorize = false;
+   const diagnostic_source_printing_options &source_printing_opts
+     = dspp.get_options ();
+   const bool show_event_links = source_printing_opts.show_event_links_p;
+   path_summary summary (policy,
+ 			*dc.get_reference_printer (),
+ 			path,
+ 			check_rich_locations,
+ 			colorize,
+ 			show_event_links);
+   print_path_summary_as_html (summary, dc, xp, event_label_writer,
+ 			      dc.show_path_depths_p ());
+ }
+ 
+ #if CHECKING_P
+ 
+ namespace selftest {
+ 
+ /* Return true iff all events in PATH have locations for which column data
+    is available, so that selftests that require precise string output can
+    bail out for awkward line_table cases.  */
+ 
+ static bool
+ path_events_have_column_data_p (const diagnostic_path &path)
+ {
+   for (unsigned idx = 0; idx < path.num_events (); idx++)
+     {
+       location_t event_loc = path.get_event (idx).get_location ();
+       if (line_table->get_pure_location (event_loc)
+ 	  > LINE_MAP_MAX_LOCATION_WITH_COLS)
+ 	return false;
+       if (line_table->get_start (event_loc) > LINE_MAP_MAX_LOCATION_WITH_COLS)
+ 	return false;
+       if (line_table->get_finish (event_loc) > LINE_MAP_MAX_LOCATION_WITH_COLS)
+ 	return false;
+     }
+   return true;
+ }
+ 
+ /* Verify that empty paths are handled gracefully.  */
+ 
+ static void
+ test_empty_path (pretty_printer *event_pp)
+ {
+   test_diagnostic_path path (event_pp);
+   ASSERT_FALSE (path.interprocedural_p ());
+ 
+   test_diagnostic_context dc;
+   diagnostic_text_output_format text_output (dc);
+   path_print_policy policy (text_output);
+   path_summary summary (policy, *event_pp, path, false);
+   ASSERT_EQ (summary.get_num_ranges (), 0);
+ 
+   print_path_summary_as_text (summary, text_output, true);
+   ASSERT_STREQ ("",
+ 		pp_formatted_text (text_output.get_printer ()));
+ }
+ 
+ /* Verify that print_path_summary works on a purely intraprocedural path.  */
+ 
+ static void
+ test_intraprocedural_path (pretty_printer *event_pp)
+ {
+   test_diagnostic_path path (event_pp);
+   const char *const funcname = "foo";
+   path.add_event (UNKNOWN_LOCATION, funcname, 0, "first %qs", "free");
+   path.add_event (UNKNOWN_LOCATION, funcname, 0, "double %qs", "free");
+ 
+   ASSERT_FALSE (path.interprocedural_p ());
+ 
+   test_diagnostic_context dc;
+   diagnostic_text_output_format text_output (dc);
+   path_print_policy policy (text_output);
+   path_summary summary (policy, *event_pp, path, false, false, false);
+   ASSERT_EQ (summary.get_num_ranges (), 1);
+ 
+   print_path_summary_as_text (summary, text_output, true);
+   ASSERT_STREQ ("  `foo': events 1-2 (depth 0)\n"
+ 		" (1): first `free'\n"
+ 		" (2): double `free'\n",
+ 		pp_formatted_text (text_output.get_printer ()));
+ }
+ 
+ /* Verify that print_path_summary works on an interprocedural path.  */
+ 
+ static void
+ test_interprocedural_path_1 (pretty_printer *event_pp)
+ {
+   test_diagnostic_path path (event_pp);
+   path.add_entry ("test", 0);
+   path.add_call ("test", 0, "make_boxed_int");
+   path.add_call ("make_boxed_int", 1, "wrapped_malloc");
+   path.add_event (UNKNOWN_LOCATION,
+ 		  "wrapped_malloc", 2, "calling malloc");
+   path.add_return ("test", 0);
+   path.add_call ("test", 0, "free_boxed_int");
+   path.add_call ("free_boxed_int", 1, "wrapped_free");
+   path.add_event (UNKNOWN_LOCATION, "wrapped_free", 2, "calling free");
+   path.add_return ("test", 0);
+   path.add_call ("test", 0, "free_boxed_int");
+   path.add_call ("free_boxed_int", 1, "wrapped_free");
+   path.add_event (UNKNOWN_LOCATION, "wrapped_free", 2, "calling free");
+   ASSERT_EQ (path.num_events (), 18);
+ 
+   ASSERT_TRUE (path.interprocedural_p ());
+ 
+   {
+     test_diagnostic_context dc;
+     diagnostic_text_output_format text_output (dc, nullptr, false);
+     path_print_policy policy (text_output);
+     path_summary summary (policy, *event_pp, path, false);
+     ASSERT_EQ (summary.get_num_ranges (), 9);
+ 
+     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
+     print_path_summary_as_text (summary, text_output, true);
+     ASSERT_STREQ
+       ("  `test': events 1-2 (depth 0)\n"
+        "    |\n"
+        "    | (1): entering `test'\n"
+        "    | (2): calling `make_boxed_int'\n"
+        "    |\n"
+        "    +--> `make_boxed_int': events 3-4 (depth 1)\n"
+        "           |\n"
+        "           | (3): entering `make_boxed_int'\n"
+        "           | (4): calling `wrapped_malloc'\n"
+        "           |\n"
+        "           +--> `wrapped_malloc': events 5-6 (depth 2)\n"
+        "                  |\n"
+        "                  | (5): entering `wrapped_malloc'\n"
+        "                  | (6): calling malloc\n"
+        "                  |\n"
+        "    <-------------+\n"
+        "    |\n"
+        "  `test': events 7-8 (depth 0)\n"
+        "    |\n"
+        "    | (7): returning to `test'\n"
+        "    | (8): calling `free_boxed_int'\n"
+        "    |\n"
+        "    +--> `free_boxed_int': events 9-10 (depth 1)\n"
+        "           |\n"
+        "           | (9): entering `free_boxed_int'\n"
+        "           | (10): calling `wrapped_free'\n"
+        "           |\n"
+        "           +--> `wrapped_free': events 11-12 (depth 2)\n"
+        "                  |\n"
+        "                  | (11): entering `wrapped_free'\n"
+        "                  | (12): calling free\n"
+        "                  |\n"
+        "    <-------------+\n"
+        "    |\n"
+        "  `test': events 13-14 (depth 0)\n"
+        "    |\n"
+        "    | (13): returning to `test'\n"
+        "    | (14): calling `free_boxed_int'\n"
+        "    |\n"
+        "    +--> `free_boxed_int': events 15-16 (depth 1)\n"
+        "           |\n"
+        "           | (15): entering `free_boxed_int'\n"
+        "           | (16): calling `wrapped_free'\n"
+        "           |\n"
+        "           +--> `wrapped_free': events 17-18 (depth 2)\n"
+        "                  |\n"
+        "                  | (17): entering `wrapped_free'\n"
+        "                  | (18): calling free\n"
+        "                  |\n",
+        pp_formatted_text (text_output.get_printer ()));
+   }
+   {
+     test_diagnostic_context dc;
+     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE);
+     diagnostic_text_output_format text_output (dc);
+     path_print_policy policy (text_output);
+     path_summary summary (policy, *event_pp, path, false);
+     print_path_summary_as_text (summary, text_output, true);
+     ASSERT_STREQ
+       ("  `test': events 1-2 (depth 0)\n"
+        "    │\n"
+        "    │ (1): entering `test'\n"
+        "    │ (2): calling `make_boxed_int'\n"
+        "    │\n"
+        "    └──> `make_boxed_int': events 3-4 (depth 1)\n"
+        "           │\n"
+        "           │ (3): entering `make_boxed_int'\n"
+        "           │ (4): calling `wrapped_malloc'\n"
+        "           │\n"
+        "           └──> `wrapped_malloc': events 5-6 (depth 2)\n"
+        "                  │\n"
+        "                  │ (5): entering `wrapped_malloc'\n"
+        "                  │ (6): calling malloc\n"
+        "                  │\n"
+        "    <─────────────┘\n"
+        "    │\n"
+        "  `test': events 7-8 (depth 0)\n"
+        "    │\n"
+        "    │ (7): returning to `test'\n"
+        "    │ (8): calling `free_boxed_int'\n"
+        "    │\n"
+        "    └──> `free_boxed_int': events 9-10 (depth 1)\n"
+        "           │\n"
+        "           │ (9): entering `free_boxed_int'\n"
+        "           │ (10): calling `wrapped_free'\n"
+        "           │\n"
+        "           └──> `wrapped_free': events 11-12 (depth 2)\n"
+        "                  │\n"
+        "                  │ (11): entering `wrapped_free'\n"
+        "                  │ (12): calling free\n"
+        "                  │\n"
+        "    <─────────────┘\n"
+        "    │\n"
+        "  `test': events 13-14 (depth 0)\n"
+        "    │\n"
+        "    │ (13): returning to `test'\n"
+        "    │ (14): calling `free_boxed_int'\n"
+        "    │\n"
+        "    └──> `free_boxed_int': events 15-16 (depth 1)\n"
+        "           │\n"
+        "           │ (15): entering `free_boxed_int'\n"
+        "           │ (16): calling `wrapped_free'\n"
+        "           │\n"
+        "           └──> `wrapped_free': events 17-18 (depth 2)\n"
+        "                  │\n"
+        "                  │ (17): entering `wrapped_free'\n"
+        "                  │ (18): calling free\n"
+        "                  │\n",
+        pp_formatted_text (text_output.get_printer ()));
+   }
+ 
+ }
+ 
+ /* Example where we pop the stack to an intermediate frame, rather than the
+    initial one.  */
+ 
+ static void
+ test_interprocedural_path_2 (pretty_printer *event_pp)
+ {
+   test_diagnostic_path path (event_pp);
+   path.add_entry ("foo", 0);
+   path.add_call ("foo", 0, "bar");
+   path.add_call ("bar", 1, "baz");
+   path.add_return ("bar", 1);
+   path.add_call ("bar", 1, "baz");
+   ASSERT_EQ (path.num_events (), 8);
+ 
+   ASSERT_TRUE (path.interprocedural_p ());
+ 
+   {
+     test_diagnostic_context dc;
+     diagnostic_text_output_format text_output (dc);
+     path_print_policy policy (text_output);
+     path_summary summary (policy, *event_pp, path, false);
+     ASSERT_EQ (summary.get_num_ranges (), 5);
+     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
+     print_path_summary_as_text (summary, text_output, true);
+     ASSERT_STREQ
+       ("  `foo': events 1-2 (depth 0)\n"
+        "    |\n"
+        "    | (1): entering `foo'\n"
+        "    | (2): calling `bar'\n"
+        "    |\n"
+        "    +--> `bar': events 3-4 (depth 1)\n"
+        "           |\n"
+        "           | (3): entering `bar'\n"
+        "           | (4): calling `baz'\n"
+        "           |\n"
+        "           +--> `baz': event 5 (depth 2)\n"
+        "                  |\n"
+        "                  | (5): entering `baz'\n"
+        "                  |\n"
+        "           <------+\n"
+        "           |\n"
+        "         `bar': events 6-7 (depth 1)\n"
+        "           |\n"
+        "           | (6): returning to `bar'\n"
+        "           | (7): calling `baz'\n"
+        "           |\n"
+        "           +--> `baz': event 8 (depth 2)\n"
+        "                  |\n"
+        "                  | (8): entering `baz'\n"
+        "                  |\n",
+        pp_formatted_text (text_output.get_printer ()));
+   }
+   {
+     test_diagnostic_context dc;
+     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE);
+     diagnostic_text_output_format text_output (dc);
+     path_print_policy policy (text_output);
+     path_summary summary (policy, *event_pp, path, false);
+     print_path_summary_as_text (summary, text_output, true);
+     ASSERT_STREQ
+       ("  `foo': events 1-2 (depth 0)\n"
+        "    │\n"
+        "    │ (1): entering `foo'\n"
+        "    │ (2): calling `bar'\n"
+        "    │\n"
+        "    └──> `bar': events 3-4 (depth 1)\n"
+        "           │\n"
+        "           │ (3): entering `bar'\n"
+        "           │ (4): calling `baz'\n"
+        "           │\n"
+        "           └──> `baz': event 5 (depth 2)\n"
+        "                  │\n"
+        "                  │ (5): entering `baz'\n"
+        "                  │\n"
+        "           <──────┘\n"
+        "           │\n"
+        "         `bar': events 6-7 (depth 1)\n"
+        "           │\n"
+        "           │ (6): returning to `bar'\n"
+        "           │ (7): calling `baz'\n"
+        "           │\n"
+        "           └──> `baz': event 8 (depth 2)\n"
+        "                  │\n"
+        "                  │ (8): entering `baz'\n"
+        "                  │\n",
+        pp_formatted_text (text_output.get_printer ()));
+   }
+ }
+ 
+ /* Verify that print_path_summary is sane in the face of a recursive
+    diagnostic_path.  */
+ 
+ static void
+ test_recursion (pretty_printer *event_pp)
+ {
+  test_diagnostic_path path (event_pp);
+   path.add_entry ("factorial", 0);
+   for (int depth = 0; depth < 3; depth++)
+     path.add_call ("factorial", depth, "factorial");
+   ASSERT_EQ (path.num_events (), 7);
+ 
+   ASSERT_TRUE (path.interprocedural_p ());
+ 
+   {
+     test_diagnostic_context dc;
+     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
+ 
+     diagnostic_text_output_format text_output (dc);
+     path_print_policy policy (text_output);
+     path_summary summary (policy, *event_pp, path, false);
+     ASSERT_EQ (summary.get_num_ranges (), 4);
+ 
+     print_path_summary_as_text (summary, text_output, true);
+     ASSERT_STREQ
+       ("  `factorial': events 1-2 (depth 0)\n"
+        "    |\n"
+        "    | (1): entering `factorial'\n"
+        "    | (2): calling `factorial'\n"
+        "    |\n"
+        "    +--> `factorial': events 3-4 (depth 1)\n"
+        "           |\n"
+        "           | (3): entering `factorial'\n"
+        "           | (4): calling `factorial'\n"
+        "           |\n"
+        "           +--> `factorial': events 5-6 (depth 2)\n"
+        "                  |\n"
+        "                  | (5): entering `factorial'\n"
+        "                  | (6): calling `factorial'\n"
+        "                  |\n"
+        "                  +--> `factorial': event 7 (depth 3)\n"
+        "                         |\n"
+        "                         | (7): entering `factorial'\n"
+        "                         |\n",
+        pp_formatted_text (text_output.get_printer ()));
+   }
+   {
+     test_diagnostic_context dc;
+     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE);
+ 
+     diagnostic_text_output_format text_output (dc);
+     path_print_policy policy (text_output);
+     path_summary summary (policy, *event_pp, path, false);
+     print_path_summary_as_text (summary, text_output, true);
+     ASSERT_STREQ
+       ("  `factorial': events 1-2 (depth 0)\n"
+        "    │\n"
+        "    │ (1): entering `factorial'\n"
+        "    │ (2): calling `factorial'\n"
+        "    │\n"
+        "    └──> `factorial': events 3-4 (depth 1)\n"
+        "           │\n"
+        "           │ (3): entering `factorial'\n"
+        "           │ (4): calling `factorial'\n"
+        "           │\n"
+        "           └──> `factorial': events 5-6 (depth 2)\n"
+        "                  │\n"
+        "                  │ (5): entering `factorial'\n"
+        "                  │ (6): calling `factorial'\n"
+        "                  │\n"
+        "                  └──> `factorial': event 7 (depth 3)\n"
+        "                         │\n"
+        "                         │ (7): entering `factorial'\n"
+        "                         │\n",
+        pp_formatted_text (text_output.get_printer ()));
+   }
+ }
+ 
+ /* Helper class for writing tests of control flow visualization.  */
+ 
+ class control_flow_test
+ {
+ public:
+   control_flow_test (const location &loc,
+ 		     const line_table_case &case_,
+ 		     const char *content)
+   : m_tmp_file (loc, ".c", content,
+ 		/* gcc_rich_location::add_location_if_nearby implicitly
+ 		   uses global_dc's file_cache, so we need to evict
+ 		   tmp when we're done.  */
+ 		&global_dc->get_file_cache ()),
+     m_ltt (case_)
+   {
+     m_ord_map
+       = linemap_check_ordinary (linemap_add (line_table, LC_ENTER, false,
+ 					     m_tmp_file.get_filename (), 0));
+     linemap_line_start (line_table, 1, 100);
+   }
+ 
+   location_t get_line_and_column (int line, int column)
+   {
+     return linemap_position_for_line_and_column (line_table, m_ord_map,
+ 						 line, column);
+   }
+ 
+   location_t get_line_and_columns (int line, int first_column, int last_column)
+   {
+     return get_line_and_columns (line,
+ 				 first_column, first_column, last_column);
+   }
+ 
+   location_t get_line_and_columns (int line,
+ 				   int first_column,
+ 				   int caret_column,
+ 				   int last_column)
+   {
+     return make_location (get_line_and_column (line, caret_column),
+ 			  get_line_and_column (line, first_column),
+ 			  get_line_and_column (line, last_column));
+   }
+ 
+ private:
+   temp_source_file m_tmp_file;
+   line_table_test m_ltt;
+   const line_map_ordinary *m_ord_map;
+ };
+ 
+ /* Example of event edges where all events can go in the same layout,
+    testing the 6 combinations of:
+    - ASCII vs Unicode vs event links off
+    - line numbering on and off.  */
+ 
+ static void
+ test_control_flow_1 (const line_table_case &case_,
+ 		     pretty_printer *event_pp)
+ {
+   /* Create a tempfile and write some text to it.
+      ...000000000111111111122222222223333333333.
+      ...123456789012345678901234567890123456789.  */
+   const char *content
+     = ("int test (int *p)\n" /* line 1.  */
+        "{\n"                 /* line 2.  */
+        "  if (p)\n"          /* line 3.  */
+        "    return 0;\n"     /* line 4.  */
+        "  return *p;\n"      /* line 5.  */
+        "}\n");               /* line 6.  */
+ 
+   control_flow_test t (SELFTEST_LOCATION, case_, content);
+ 
+   const location_t conditional = t.get_line_and_column (3, 7);
+   const location_t cfg_dest = t.get_line_and_column (5, 10);
+ 
+   test_diagnostic_path path (event_pp);
+   path.add_event (conditional, nullptr, 0,
+ 		  "following %qs branch (when %qs is NULL)...",
+ 		  "false", "p");
+   path.connect_to_next_event ();
+ 
+   path.add_event (cfg_dest, nullptr, 0,
+ 		  "...to here");
+   path.add_event (cfg_dest, nullptr, 0,
+ 		  "dereference of NULL %qs",
+ 		  "p");
+ 
+   if (!path_events_have_column_data_p (path))
+     return;
+ 
+ 
+   {
+     test_diagnostic_context dc;
+     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
+     dc.m_source_printing.show_event_links_p = true;
+     diagnostic_text_output_format text_output (dc);
+     path_print_policy policy (text_output);
+     path_summary summary (policy, *event_pp, path, true);
+     print_path_summary_as_text (summary, text_output, false);
+     ASSERT_STREQ
+       ("  events 1-3\n"
+        "FILENAME:3:7:\n"
+        "   if (p)\n"
+        "       ^\n"
+        "       |\n"
+        "       (1) following `false' branch (when `p' is NULL)... ->-+\n"
+        "                                                             |\n"
+        "FILENAME:5:10:\n"
+        "                                                             |\n"
+        "+------------------------------------------------------------+\n"
+        "|  return *p;\n"
+        "|         ~\n"
+        "|         |\n"
+        "+-------->(2) ...to here\n"
+        "          (3) dereference of NULL `p'\n",
+        pp_formatted_text (text_output.get_printer ()));
+   }
+   {
+     test_diagnostic_context dc;
+     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
+     dc.m_source_printing.show_event_links_p = false;
+     diagnostic_text_output_format text_output (dc);
+     path_print_policy policy (text_output);
+     path_summary summary (policy, *event_pp, path, true);
+     print_path_summary_as_text (summary, text_output, false);
+     ASSERT_STREQ
+       ("  events 1-3\n"
+        "FILENAME:3:7:\n"
+        "   if (p)\n"
+        "       ^\n"
+        "       |\n"
+        "       (1) following `false' branch (when `p' is NULL)...\n"
+        "FILENAME:5:10:\n"
+        "   return *p;\n"
+        "          ~\n"
+        "          |\n"
+        "          (2) ...to here\n"
+        "          (3) dereference of NULL `p'\n",
+        pp_formatted_text (text_output.get_printer ()));
+   }
+   {
+     test_diagnostic_context dc;
+     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
+     dc.m_source_printing.show_line_numbers_p = true;
+     dc.m_source_printing.show_event_links_p = true;
+     diagnostic_text_output_format text_output (dc);
+     path_print_policy policy (text_output);
+     path_summary summary (policy, *event_pp, path, true);
+     print_path_summary_as_text (summary, text_output, false);
+     ASSERT_STREQ
+       ("  events 1-3\n"
+        "FILENAME:3:7:\n"
+        "    3 |   if (p)\n"
+        "      |       ^\n"
+        "      |       |\n"
+        "      |       (1) following `false' branch (when `p' is NULL)... ->-+\n"
+        "      |                                                             |\n"
+        "      |                                                             |\n"
+        "      |+------------------------------------------------------------+\n"
+        "    4 ||    return 0;\n"
+        "    5 ||  return *p;\n"
+        "      ||         ~\n"
+        "      ||         |\n"
+        "      |+-------->(2) ...to here\n"
+        "      |          (3) dereference of NULL `p'\n",
+        pp_formatted_text (text_output.get_printer ()));
+   }
+   {
+     test_diagnostic_context dc;
+     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
+     dc.m_source_printing.show_line_numbers_p = true;
+     dc.m_source_printing.show_event_links_p = false;
+     diagnostic_text_output_format text_output (dc);
+     path_print_policy policy (text_output);
+     path_summary summary (policy, *event_pp, path, true);
+     print_path_summary_as_text (summary, text_output, false);
+     ASSERT_STREQ
+       ("  events 1-3\n"
+        "FILENAME:3:7:\n"
+        "    3 |   if (p)\n"
+        "      |       ^\n"
+        "      |       |\n"
+        "      |       (1) following `false' branch (when `p' is NULL)...\n"
+        "    4 |     return 0;\n"
+        "    5 |   return *p;\n"
+        "      |          ~\n"
+        "      |          |\n"
+        "      |          (2) ...to here\n"
+        "      |          (3) dereference of NULL `p'\n",
+        pp_formatted_text (text_output.get_printer ()));
+   }
+   {
+     test_diagnostic_context dc;
+     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE);
+     dc.m_source_printing.show_event_links_p = true;
+     diagnostic_text_output_format text_output (dc);
+     path_print_policy policy (text_output);
+     path_summary summary (policy, *event_pp, path, true);
+     print_path_summary_as_text (summary, text_output, false);
+     ASSERT_STREQ
+       ("  events 1-3\n"
+        "FILENAME:3:7:\n"
+        "   if (p)\n"
+        "       ^\n"
+        "       |\n"
+        "       (1) following `false' branch (when `p' is NULL)... ─>─┐\n"
+        "                                                             │\n"
+        "FILENAME:5:10:\n"
+        "                                                             │\n"
+        "┌────────────────────────────────────────────────────────────┘\n"
+        "│  return *p;\n"
+        "│         ~\n"
+        "│         |\n"
+        "└────────>(2) ...to here\n"
+        "          (3) dereference of NULL `p'\n",
+        pp_formatted_text (text_output.get_printer ()));
+   }
+   {
+     test_diagnostic_context dc;
+     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE);
+     dc.m_source_printing.show_event_links_p = true;
+     dc.m_source_printing.show_line_numbers_p = true;
+     diagnostic_text_output_format text_output (dc);
+     path_print_policy policy (text_output);
+     path_summary summary (policy, *event_pp, path, true);
+     print_path_summary_as_text (summary, text_output, false);
+     ASSERT_STREQ
+       ("  events 1-3\n"
+        "FILENAME:3:7:\n"
+        "    3 |   if (p)\n"
+        "      |       ^\n"
+        "      |       |\n"
+        "      |       (1) following `false' branch (when `p' is NULL)... ─>─┐\n"
+        "      |                                                             │\n"
+        "      |                                                             │\n"
+        "      |┌────────────────────────────────────────────────────────────┘\n"
+        "    4 |│    return 0;\n"
+        "    5 |│  return *p;\n"
+        "      |│         ~\n"
+        "      |│         |\n"
+        "      |└────────>(2) ...to here\n"
+        "      |          (3) dereference of NULL `p'\n",
+        pp_formatted_text (text_output.get_printer ()));
+   }
+ }
+ 
+ /* Complex example involving a backedge.  */
+ 
+ static void
+ test_control_flow_2 (const line_table_case &case_,
+ 		     pretty_printer *event_pp)
+ {
+   /* Create a tempfile and write some text to it.
+      ...000000000111111111122222222223333333333.
+      ...123456789012345678901234567890123456789.  */
+   const char *content
+     = ("int for_loop_noop_next (struct node *n)\n" /* <--------- line 1.  */
+        "{\n" /* <----------------------------------------------- line 2.  */
+        "  int sum = 0;\n" /* <---------------------------------- line 3.  */
+        "  for (struct node *iter = n; iter; iter->next)\n" /* <- line 4.  */
+        "    sum += n->val;\n" /* <------------------------------ line 5.  */
+        "  return sum;\n" /* <----------------------------------- line 6.  */
+        "}\n");  /* <-------------------------------------------- line 7.  */
+   /* Adapted from infinite-loop-linked-list.c where
+      "iter->next" should be "iter = iter->next".  */
+ 
+   control_flow_test t (SELFTEST_LOCATION, case_, content);
+ 
+   const location_t iter_test = t.get_line_and_columns (4, 31, 34);
+   const location_t loop_body_start = t.get_line_and_columns (5, 12, 17);
+   const location_t loop_body_end = t.get_line_and_columns (5, 5, 9, 17);
+ 
+   test_diagnostic_path path (event_pp);
+   path.add_event (iter_test, nullptr, 0, "infinite loop here");
+ 
+   path.add_event (iter_test, nullptr, 0, "looping from here...");
+   path.connect_to_next_event ();
+ 
+   path.add_event (loop_body_start, nullptr, 0, "...to here");
+ 
+   path.add_event (loop_body_end, nullptr, 0, "looping back...");
+   path.connect_to_next_event ();
+ 
+   path.add_event (iter_test, nullptr, 0, "...to here");
+ 
+   if (!path_events_have_column_data_p (path))
+     return;
+ 
+   {
+     test_diagnostic_context dc;
+     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
+     dc.m_source_printing.show_event_links_p = true;
+     dc.m_source_printing.show_line_numbers_p = true;
+     diagnostic_text_output_format text_output (dc);
+     path_print_policy policy (text_output);
+     path_summary summary (policy, *event_pp, path, true);
+     print_path_summary_as_text (summary, text_output, false);
+     ASSERT_STREQ
+       ("  events 1-3\n"
+        "FILENAME:4:31:\n"
+        "    4 |   for (struct node *iter = n; iter; iter->next)\n"
+        "      |                               ^~~~\n"
+        "      |                               |\n"
+        "      |                               (1) infinite loop here\n"
+        "      |                               (2) looping from here... ->-+\n"
+        "      |                                                           |\n"
+        "      |                                                           |\n"
+        "      |+----------------------------------------------------------+\n"
+        "    5 ||    sum += n->val;\n"
+        "      ||           ~~~~~~              \n"
+        "      ||           |\n"
+        "      |+---------->(3) ...to here\n"
+        /* We need to start an new event_range here as event (4) is to the
+ 	  left of event (3), and thus (4) would mess up the in-edge to (3).  */
+        "  event 4\n"
+        "    5 |     sum += n->val;\n"
+        "      |     ~~~~^~~~~~~~~\n"
+        "      |         |\n"
+        "      |         (4) looping back... ->-+\n"
+        "      |                                |\n"
+        /* We need to start an new event_range here as event (4) with an
+ 	  out-edge is on a later line (line 5) than its destination event (5),
+ 	  on line 4.  */
+        "  event 5\n"
+        "      |                                |\n"
+        "      |+-------------------------------+\n"
+        "    4 ||  for (struct node *iter = n; iter; iter->next)\n"
+        "      ||                              ^~~~\n"
+        "      ||                              |\n"
+        "      |+----------------------------->(5) ...to here\n",
+        pp_formatted_text (text_output.get_printer ()));
+   }
+ }
+ 
+ /* Complex example involving a backedge and both an in-edge and out-edge
+    on the same line.  */
+ 
+ static void
+ test_control_flow_3 (const line_table_case &case_,
+ 		     pretty_printer *event_pp)
+ {
+   /* Create a tempfile and write some text to it.
+      ...000000000111111111122222222223333333333.
+      ...123456789012345678901234567890123456789.  */
+   const char *content
+     = ("void test_missing_comparison_in_for_condition_1 (int n)\n"
+        "{\n" /* <------------------------- line 2.  */
+        "  for (int i = 0; n; i++)\n" /* <- line 3.  */
+        "    {\n" /* <--------------------- line 4.  */
+        "    }\n" /* <--------------------- line 5.  */
+        "}\n"); /* <----------------------- line 6.  */
+   /* Adapted from infinite-loop-1.c where the condition should have been
+      "i < n", rather than just "n".  */
+ 
+   control_flow_test t (SELFTEST_LOCATION, case_, content);
+ 
+   const location_t iter_test = t.get_line_and_column (3, 19);
+   const location_t iter_next = t.get_line_and_columns (3, 22, 24);
+ 
+   test_diagnostic_path path (event_pp);
+   path.add_event (iter_test, nullptr, 0, "infinite loop here");
+ 
+   path.add_event (iter_test, nullptr, 0, "looping from here...");
+   path.connect_to_next_event ();
+ 
+   path.add_event (iter_next, nullptr, 0, "...to here");
+ 
+   path.add_event (iter_next, nullptr, 0, "looping back...");
+   path.connect_to_next_event ();
+ 
+   path.add_event (iter_test, nullptr, 0, "...to here");
+ 
+   if (!path_events_have_column_data_p (path))
+     return;
+ 
+   {
+     test_diagnostic_context dc;
+     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
+     dc.m_source_printing.show_event_links_p = true;
+     dc.m_source_printing.show_line_numbers_p = true;
+     diagnostic_text_output_format text_output (dc);
+     path_print_policy policy (text_output);
+     path_summary summary (policy, *event_pp, path, true);
+     print_path_summary_as_text (summary, text_output, false);
+     ASSERT_STREQ
+       ("  events 1-2\n"
+        "FILENAME:3:19:\n"
+        "    3 |   for (int i = 0; n; i++)\n"
+        "      |                   ^\n"
+        "      |                   |\n"
+        "      |                   (1) infinite loop here\n"
+        "      |                   (2) looping from here... ->-+\n"
+        "      |                                               |\n"
+        "  events 3-4\n"
+        "      |                                               |\n"
+        "      |+----------------------------------------------+\n"
+        "    3 ||  for (int i = 0; n; i++)\n"
+        "      ||                     ^~~\n"
+        "      ||                     |\n"
+        "      |+-------------------->(3) ...to here\n"
+        "      |                      (4) looping back... ->-+\n"
+        "      |                                             |\n"
+        /* We need to start an new event_range here as event (4) with an
+ 	  out-edge is on the same line as its destination event (5), but
+ 	  to the right, which we can't handle as a single event_range. */
+        "  event 5\n"
+        "      |                                             |\n"
+        "      |+--------------------------------------------+\n"
+        "    3 ||  for (int i = 0; n; i++)\n"
+        "      ||                  ^\n"
+        "      ||                  |\n"
+        "      |+----------------->(5) ...to here\n",
+        pp_formatted_text (text_output.get_printer ()));
+   }
+ }
+ 
+ /* Implementation of ASSERT_CFG_EDGE_PATH_STREQ.  */
+ 
+ static void
+ assert_cfg_edge_path_streq (const location &loc,
+ 			    pretty_printer *event_pp,
+ 			    const location_t src_loc,
+ 			    const location_t dst_loc,
+ 			    const char *expected_str)
+ {
+   test_diagnostic_path path (event_pp);
+   path.add_event (src_loc, nullptr, 0, "from here...");
+   path.connect_to_next_event ();
+ 
+   path.add_event (dst_loc, nullptr, 0, "...to here");
+ 
+   if (!path_events_have_column_data_p (path))
+     return;
+ 
+   test_diagnostic_context dc;
+   dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
+   dc.m_source_printing.show_event_links_p = true;
+   dc.m_source_printing.show_line_numbers_p = true;
+   diagnostic_text_output_format text_output (dc);
+   path_print_policy policy (text_output);
+   path_summary summary (policy, *event_pp, path, true);
+   print_path_summary_as_text (summary, text_output, false);
+   ASSERT_STREQ_AT (loc, expected_str,
+ 		   pp_formatted_text (text_output.get_printer ()));
+ }
+ 
+ /* Assert that if we make a path with an event with "from here..." at SRC_LOC
+    leading to an event "...to here" at DST_LOC that we print the path
+    as EXPECTED_STR.  */
+ 
+ #define ASSERT_CFG_EDGE_PATH_STREQ(SRC_LOC, DST_LOC, EXPECTED_STR) \
+   assert_cfg_edge_path_streq ((SELFTEST_LOCATION), (event_pp),	   \
+ 			      (SRC_LOC), (DST_LOC), (EXPECTED_STR))
+ 
+ /* Various examples of edge, trying to cover all combinations of:
+    - relative x positive of src label and dst label
+    - relative y position of labels:
+      - on same line
+      - on next line
+      - on line after next
+      - big gap, where src is before dst
+      - big gap, where src is after dst
+    and other awkward cases.  */
+ 
+ static void
+ test_control_flow_4 (const line_table_case &case_,
+ 		     pretty_printer *event_pp)
+ {
+   std::string many_lines;
+   for (int i = 1; i <= 100; i++)
+     /* ............000000000111
+        ............123456789012.  */
+     many_lines += "LHS      RHS\n";
+   control_flow_test t (SELFTEST_LOCATION, case_, many_lines.c_str ());
+ 
+   /* Same line.  */
+   {
+     /* LHS -> RHS.  */
+     ASSERT_CFG_EDGE_PATH_STREQ
+       (t.get_line_and_columns (3, 1, 3),
+        t.get_line_and_columns (3, 10, 12),
+        ("  event 1\n"
+ 	"FILENAME:3:1:\n"
+ 	"    3 | LHS      RHS\n"
+ 	"      | ^~~\n"
+ 	"      | |\n"
+ 	"      | (1) from here... ->-+\n"
+ 	"      |                     |\n"
+ 	"  event 2\n"
+ 	"      |                     |\n"
+ 	"      |+--------------------+\n"
+ 	"    3 ||LHS      RHS\n"
+ 	"      ||         ^~~\n"
+ 	"      ||         |\n"
+ 	"      |+-------->(2) ...to here\n"));
+ 
+     /*  RHS -> LHS.  */
+     ASSERT_CFG_EDGE_PATH_STREQ
+       (t.get_line_and_columns (3, 10, 12),
+        t.get_line_and_columns (3, 1, 3),
+        ("  event 1\n"
+ 	"FILENAME:3:10:\n"
+ 	"    3 | LHS      RHS\n"
+ 	"      |          ^~~\n"
+ 	"      |          |\n"
+ 	"      |          (1) from here... ->-+\n"
+ 	"      |                              |\n"
+ 	"  event 2\n"
+ 	"      |                              |\n"
+ 	"      |+-----------------------------+\n"
+ 	"    3 ||LHS      RHS\n"
+ 	"      ||^~~\n"
+ 	"      |||\n"
+ 	"      |+(2) ...to here\n"));
+   }
+ 
+   /* Next line.  */
+   {
+     /* LHS -> RHS.  */
+     ASSERT_CFG_EDGE_PATH_STREQ
+       (t.get_line_and_columns (3, 1, 3),
+        t.get_line_and_columns (4, 5, 7),
+        ("  events 1-2\n"
+ 	"FILENAME:3:1:\n"
+ 	"    3 | LHS      RHS\n"
+ 	"      | ^~~\n"
+ 	"      | |\n"
+ 	"      | (1) from here... ->-+\n"
+ 	"      |                     |\n"
+ 	"      |                     |\n"
+ 	"      |+--------------------+\n"
+ 	"    4 ||LHS      RHS\n"
+ 	"      ||    ~~~\n"
+ 	"      ||    |\n"
+ 	"      |+--->(2) ...to here\n"));
+ 
+     /*  RHS -> LHS.  */
+     ASSERT_CFG_EDGE_PATH_STREQ
+       (t.get_line_and_columns (3, 10, 12),
+        t.get_line_and_columns (4, 1, 3),
+        ("  events 1-2\n"
+ 	"FILENAME:3:10:\n"
+ 	"    3 | LHS      RHS\n"
+ 	"      |          ^~~\n"
+ 	"      |          |\n"
+ 	"      |          (1) from here... ->-+\n"
+ 	"      |                              |\n"
+ 	"      |                              |\n"
+ 	"      |+-----------------------------+\n"
+ 	"    4 ||LHS      RHS\n"
+ 	"      ||~~~       \n"
+ 	"      |||\n"
+ 	"      |+(2) ...to here\n"));
+   }
+ 
+   /* Line after next.  */
+   {
+     /* LHS -> RHS.  */
+     ASSERT_CFG_EDGE_PATH_STREQ
+       (t.get_line_and_columns (3, 1, 3),
+        t.get_line_and_columns (5, 10, 12),
+        ("  events 1-2\n"
+ 	"FILENAME:3:1:\n"
+ 	"    3 | LHS      RHS\n"
+ 	"      | ^~~\n"
+ 	"      | |\n"
+ 	"      | (1) from here... ->-+\n"
+ 	"      |                     |\n"
+ 	"      |                     |\n"
+ 	"      |+--------------------+\n"
+ 	"    4 ||LHS      RHS\n"
+ 	"    5 ||LHS      RHS\n"
+ 	"      ||         ~~~\n"
+ 	"      ||         |\n"
+ 	"      |+-------->(2) ...to here\n"));
+ 
+     /*  RHS -> LHS.  */
+     ASSERT_CFG_EDGE_PATH_STREQ
+       (t.get_line_and_columns (3, 10, 12),
+        t.get_line_and_columns (5, 1, 3),
+        ("  events 1-2\n"
+ 	"FILENAME:3:10:\n"
+ 	"    3 | LHS      RHS\n"
+ 	"      |          ^~~\n"
+ 	"      |          |\n"
+ 	"      |          (1) from here... ->-+\n"
+ 	"      |                              |\n"
+ 	"      |                              |\n"
+ 	"      |+-----------------------------+\n"
+ 	"    4 ||LHS      RHS\n"
+ 	"    5 ||LHS      RHS\n"
+ 	"      ||~~~       \n"
+ 	"      |||\n"
+ 	"      |+(2) ...to here\n"));
+   }
+ 
+   /* Big gap, increasing line number.  */
+   {
+     /* LHS -> RHS.  */
+     ASSERT_CFG_EDGE_PATH_STREQ
+       (t.get_line_and_columns (3, 1, 3),
+        t.get_line_and_columns (97, 10, 12),
+        ("  events 1-2\n"
+ 	"FILENAME:3:1:\n"
+ 	"    3 | LHS      RHS\n"
+ 	"      | ^~~\n"
+ 	"      | |\n"
+ 	"      | (1) from here... ->-+\n"
+ 	"      |                     |\n"
+ 	"......\n"
+ 	"      |                     |\n"
+ 	"      |+--------------------+\n"
+ 	"   97 ||LHS      RHS\n"
+ 	"      ||         ~~~\n"
+ 	"      ||         |\n"
+ 	"      |+-------->(2) ...to here\n"));
+ 
+     /*  RHS -> LHS.  */
+     ASSERT_CFG_EDGE_PATH_STREQ
+       (t.get_line_and_columns (3, 10, 12),
+        t.get_line_and_columns (97, 1, 3),
+        ("  events 1-2\n"
+ 	"FILENAME:3:10:\n"
+ 	"    3 | LHS      RHS\n"
+ 	"      |          ^~~\n"
+ 	"      |          |\n"
+ 	"      |          (1) from here... ->-+\n"
+ 	"      |                              |\n"
+ 	"......\n"
+ 	"      |                              |\n"
+ 	"      |+-----------------------------+\n"
+ 	"   97 ||LHS      RHS\n"
+ 	"      ||~~~       \n"
+ 	"      |||\n"
+ 	"      |+(2) ...to here\n"));
+   }
+ 
+   /* Big gap, decreasing line number.  */
+   {
+     /* LHS -> RHS.  */
+     ASSERT_CFG_EDGE_PATH_STREQ
+       (t.get_line_and_columns (97, 1, 3),
+        t.get_line_and_columns (3, 10, 12),
+        ("  event 1\n"
+ 	"FILENAME:97:1:\n"
+ 	"   97 | LHS      RHS\n"
+ 	"      | ^~~\n"
+ 	"      | |\n"
+ 	"      | (1) from here... ->-+\n"
+ 	"      |                     |\n"
+ 	"  event 2\n"
+ 	"      |                     |\n"
+ 	"      |+--------------------+\n"
+ 	"    3 ||LHS      RHS\n"
+ 	"      ||         ^~~\n"
+ 	"      ||         |\n"
+ 	"      |+-------->(2) ...to here\n"));
+ 
+     /*  RHS -> LHS.  */
+     ASSERT_CFG_EDGE_PATH_STREQ
+       (t.get_line_and_columns (97, 10, 12),
+        t.get_line_and_columns (3, 1, 3),
+        ("  event 1\n"
+ 	"FILENAME:97:10:\n"
+ 	"   97 | LHS      RHS\n"
+ 	"      |          ^~~\n"
+ 	"      |          |\n"
+ 	"      |          (1) from here... ->-+\n"
+ 	"      |                              |\n"
+ 	"  event 2\n"
+ 	"      |                              |\n"
+ 	"      |+-----------------------------+\n"
+ 	"    3 ||LHS      RHS\n"
+ 	"      ||^~~\n"
+ 	"      |||\n"
+ 	"      |+(2) ...to here\n"));
+   }
+ 
+   /* Unknown src.  */
+   {
+     ASSERT_CFG_EDGE_PATH_STREQ
+       (UNKNOWN_LOCATION,
+        t.get_line_and_columns (3, 10, 12),
+        ("  event 1\n"
+ 	" (1): from here...\n"
+ 	"  event 2\n"
+ 	"FILENAME:3:10:\n"
+ 	"    3 | LHS      RHS\n"
+ 	"      |          ^~~\n"
+ 	"      |          |\n"
+ 	"      |+-------->(2) ...to here\n"));
+   }
+ 
+   /* Unknown dst.  */
+   {
+     ASSERT_CFG_EDGE_PATH_STREQ
+       (t.get_line_and_columns (3, 1, 3),
+        UNKNOWN_LOCATION,
+        ("  event 1\n"
+ 	"FILENAME:3:1:\n"
+ 	"    3 | LHS      RHS\n"
+ 	"      | ^~~\n"
+ 	"      | |\n"
+ 	"      | (1) from here... ->-+\n"
+ 	"      |                     |\n"
+ 	"  event 2\n"
+ 	"FILENAME:\n"
+ 	" (2): ...to here\n"));
+   }
+ }
+ 
+ /* Another complex example, adapted from data-model-20.c.  */
+ 
+ static void
+ test_control_flow_5 (const line_table_case &case_,
+ 		     pretty_printer *event_pp)
+ {
+   /* Create a tempfile and write some text to it.
+      ...000000000111111111122222222223333333333444444444455555555556666666666.
+      ...123456789012345678901234567890123456789012345678901234567890123456789.  */
+   const char *content
+     = ("  if ((arr = (struct foo **)malloc(n * sizeof(struct foo *))) == NULL)\n"
+        "    return NULL;\n" /* <------------------------- line 2.  */
+        "\n" /* <----------------------------------------- line 3.  */
+        "  for (i = 0; i < n; i++) {\n" /* <-------------- line 4.  */
+        "    if ((arr[i] = (struct foo *)malloc(sizeof(struct foo))) == NULL) {\n");
+ 
+   control_flow_test t (SELFTEST_LOCATION, case_, content);
+ 
+   test_diagnostic_path path (event_pp);
+   /* (1) */
+   path.add_event (t.get_line_and_column (1, 6), nullptr, 0,
+ 		  "following %qs branch (when %qs is non-NULL)...",
+ 		  "false", "arr");
+   path.connect_to_next_event ();
+ 
+   /* (2) */
+   path.add_event (t.get_line_and_columns (4, 8, 10, 12), nullptr, 0,
+ 		  "...to here");
+ 
+   /* (3) */
+   path.add_event (t.get_line_and_columns (4, 15, 17, 19), nullptr, 0,
+ 		  "following %qs branch (when %qs)...",
+ 		  "true", "i < n");
+   path.connect_to_next_event ();
+ 
+   /* (4) */
+   path.add_event (t.get_line_and_column (5, 13), nullptr, 0,
+ 		  "...to here");
+ 
+   /* (5) */
+   path.add_event (t.get_line_and_columns (5, 33, 58), nullptr, 0,
+ 		  "allocated here");
+ 
+   if (!path_events_have_column_data_p (path))
+     return;
+ 
+   {
+     test_diagnostic_context dc;
+     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
+     dc.m_source_printing.show_event_links_p = true;
+     dc.m_source_printing.show_line_numbers_p = true;
+     diagnostic_text_output_format text_output (dc);
+     path_print_policy policy (text_output);
+     path_summary summary (policy, *event_pp, path, true);
+     print_path_summary_as_text (summary, text_output, false);
+     ASSERT_STREQ
+       ("  events 1-5\n"
+        "FILENAME:1:6:\n"
+        "    1 |   if ((arr = (struct foo **)malloc(n * sizeof(struct foo *))) == NULL)\n"
+        "      |      ^\n"
+        "      |      |\n"
+        "      |      (1) following `false' branch (when `arr' is non-NULL)... ->-+\n"
+        "      |                                                                  |\n"
+        "......\n"
+        "      |                                                                  |\n"
+        "      |+-----------------------------------------------------------------+\n"
+        "    4 ||  for (i = 0; i < n; i++) {\n"
+        "      ||       ~~~~~  ~~~~~\n"
+        "      ||         |      |\n"
+        "      ||         |      (3) following `true' branch (when `i < n')... ->-+\n"
+        "      |+-------->(2) ...to here                                          |\n"
+        "      |                                                                  |\n"
+        "      |                                                                  |\n"
+        "      |+-----------------------------------------------------------------+\n"
+        "    5 ||    if ((arr[i] = (struct foo *)malloc(sizeof(struct foo))) == NULL) {\n"
+        "      ||            ~                   ~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+        "      ||            |                   |\n"
+        "      |+----------->(4) ...to here      (5) allocated here\n",
+        pp_formatted_text (text_output.get_printer ()));
+   }
+ }
+ 
+ /* Another complex example, adapted from loop-3.c.  */
+ 
+ static void
+ test_control_flow_6 (const line_table_case &case_,
+ 		     pretty_printer *event_pp)
+ {
+   /* Create a tempfile and write some text to it.
+      ...000000000111111111122222222223333333.
+      ...123456789012345678901234567890123456.  */
+   const char *content
+     = ("#include <stdlib.h>\n" /* <------------------ line 1.  */
+        "\n" /* <------------------------------------- line 2.  */
+        "void test(int c)\n" /* <--------------------- line 3.  */
+        "{\n" /* <------------------------------------ line 4.  */
+        "  int i;\n" /* <----------------------------- line 5.  */
+        "  char *buffer = (char*)malloc(256);\n" /* <- line 6.  */
+        "\n" /* <------------------------------------- line 7.  */
+        "  for (i=0; i<255; i++) {\n" /* <------------ line 8.  */
+        "    buffer[i] = c;\n" /* <------------------- line 9.  */
+        "\n" /* <------------------------------------- line 10.  */
+        "    free(buffer);\n" /* <-------------------- line 11.  */
+        "  }\n"); /* <-------------------------------- line 12.  */
+ 
+   control_flow_test t (SELFTEST_LOCATION, case_, content);
+ 
+   test_diagnostic_path path (event_pp);
+   /* (1) */
+   path.add_event (t.get_line_and_columns (6, 25, 35), nullptr, 0,
+ 		  "allocated here");
+ 
+   /* (2) */
+   path.add_event (t.get_line_and_columns (8, 13, 14, 17), nullptr, 0,
+ 		  "following %qs branch (when %qs)...",
+ 		  "true", "i <= 254");
+   path.connect_to_next_event ();
+ 
+   /* (3) */
+   path.add_event (t.get_line_and_columns (9, 5, 15, 17), nullptr, 0,
+ 		  "...to here");
+ 
+   /* (4) */
+   path.add_event (t.get_line_and_columns (8, 13, 14, 17), nullptr, 0,
+ 		  "following %qs branch (when %qs)...",
+ 		  "true", "i <= 254");
+   path.connect_to_next_event ();
+ 
+   /* (5) */
+   path.add_event (t.get_line_and_columns (9, 5, 15, 17), nullptr, 0,
+ 		  "...to here");
+ 
+   if (!path_events_have_column_data_p (path))
+     return;
+ 
+   {
+     test_diagnostic_context dc;
+     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
+     dc.m_source_printing.show_event_links_p = true;
+     dc.m_source_printing.show_line_numbers_p = true;
+     diagnostic_text_output_format text_output (dc);
+     path_print_policy policy (text_output);
+     path_summary summary (policy, *event_pp, path, true);
+     print_path_summary_as_text (summary, text_output, false);
+     ASSERT_STREQ
+       ("  events 1-3\n"
+        "FILENAME:6:25:\n"
+        "    6 |   char *buffer = (char*)malloc(256);\n"
+        "      |                         ^~~~~~~~~~~\n"
+        "      |                         |\n"
+        "      |                         (1) allocated here\n"
+        "    7 | \n"
+        "    8 |   for (i=0; i<255; i++) {\n"
+        "      |             ~~~~~        \n"
+        "      |              |\n"
+        "      |              (2) following `true' branch (when `i <= 254')... ->-+\n"
+        "      |                                                                  |\n"
+        "      |                                                                  |\n"
+        "      |+-----------------------------------------------------------------+\n"
+        "    9 ||    buffer[i] = c;\n"
+        "      ||    ~~~~~~~~~~~~~        \n"
+        "      ||              |\n"
+        "      |+------------->(3) ...to here\n"
+        "  events 4-5\n"
+        "    8 |   for (i=0; i<255; i++) {\n"
+        "      |             ~^~~~\n"
+        "      |              |\n"
+        "      |              (4) following `true' branch (when `i <= 254')... ->-+\n"
+        "      |                                                                  |\n"
+        "      |                                                                  |\n"
+        "      |+-----------------------------------------------------------------+\n"
+        "    9 ||    buffer[i] = c;\n"
+        "      ||    ~~~~~~~~~~~~~\n"
+        "      ||              |\n"
+        "      |+------------->(5) ...to here\n",
+        pp_formatted_text (text_output.get_printer ()));
+   }
+ }
+ 
+ static void
+ control_flow_tests (const line_table_case &case_)
+ {
+   pretty_printer pp;
+   pp_show_color (&pp) = false;
+ 
+   test_control_flow_1 (case_, &pp);
+   test_control_flow_2 (case_, &pp);
+   test_control_flow_3 (case_, &pp);
+   test_control_flow_4 (case_, &pp);
+   test_control_flow_5 (case_, &pp);
+   test_control_flow_6 (case_, &pp);
+ }
+ 
+ /* Run all of the selftests within this file.  */
+ 
+ void
+ diagnostic_path_output_cc_tests ()
+ {
+   pretty_printer pp;
+   pp_show_color (&pp) = false;
+ 
+   auto_fix_quotes fix_quotes;
+   test_empty_path (&pp);
+   test_intraprocedural_path (&pp);
+   test_interprocedural_path_1 (&pp);
+   test_interprocedural_path_2 (&pp);
+   test_recursion (&pp);
+   for_each_line_table_case (control_flow_tests);
+ }
+ 
+ } // namespace selftest
+ 
+ #if __GNUC__ >= 10
+ #  pragma GCC diagnostic pop
+ #endif
+ 
+ #endif /* #if CHECKING_P */
diff -Nrcpad gcc-16-20250525/gcc/diagnostic-path.cc gcc-16-20250601/gcc/diagnostic-path.cc
*** gcc-16-20250525/gcc/diagnostic-path.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/diagnostic-path.cc	Sun Jun  1 22:32:14 2025
*************** along with GCC; see the file COPYING3.
*** 25,43 ****
  #include "system.h"
  #include "coretypes.h"
  #include "diagnostic.h"
- #include "diagnostic-macro-unwinding.h"
- #include "intl.h"
  #include "diagnostic-path.h"
- #include "gcc-rich-location.h"
- #include "diagnostic-color.h"
- #include "diagnostic-event-id.h"
- #include "diagnostic-label-effects.h"
- #include "pretty-print-markup.h"
- #include "selftest.h"
- #include "selftest-diagnostic.h"
- #include "selftest-diagnostic-path.h"
- #include "text-art/theme.h"
- #include "diagnostic-format-text.h"
  
  /* Disable warnings about missing quoting in GCC diagnostics for the print
     calls below.  */
--- 25,31 ----
*************** void debug (diagnostic_path *path)
*** 226,2540 ****
    inform (&richloc, "debug path");
  }
  
- /* Anonymous namespace for path-printing code.  */
- 
- namespace {
- 
- /* A bundle of state for printing a path.  */
- 
- class path_print_policy
- {
- public:
-   path_print_policy (const diagnostic_text_output_format &text_output)
-   : m_source_policy (text_output.get_context ())
-   {
-   }
- 
-   text_art::theme *
-   get_diagram_theme () const
-   {
-     return  m_source_policy.get_diagram_theme ();
-   }
- 
-   const diagnostic_source_print_policy &
-   get_source_policy () const { return m_source_policy; }
- 
- private:
-   diagnostic_source_print_policy m_source_policy;
- };
- 
- /* Subclass of range_label for showing a particular event
-    when showing a consecutive run of events within a diagnostic_path as
-    labelled ranges within one gcc_rich_location.  */
- 
- class path_label : public range_label
- {
-  public:
-   path_label (const diagnostic_path &path,
- 	      const pretty_printer &ref_pp,
- 	      unsigned start_idx,
- 	      bool colorize,
- 	      bool allow_emojis)
-   : m_path (path),
-     m_ref_pp (ref_pp),
-     m_start_idx (start_idx), m_effects (*this),
-     m_colorize (colorize), m_allow_emojis (allow_emojis)
-   {}
- 
-   label_text get_text (unsigned range_idx) const final override
-   {
-     unsigned event_idx = m_start_idx + range_idx;
-     const diagnostic_event &event = m_path.get_event (event_idx);
- 
-     const diagnostic_event::meaning meaning (event.get_meaning ());
- 
-     auto pp = m_ref_pp.clone ();
-     pp_show_color (pp.get ()) = m_colorize;
-     diagnostic_event_id_t event_id (event_idx);
- 
-     pp_printf (pp.get (), "%@", &event_id);
-     pp_space (pp.get ());
- 
-     if (meaning.m_verb == diagnostic_event::VERB_danger
- 	&& m_allow_emojis)
-       {
- 	pp_unicode_character (pp.get (), 0x26A0); /* U+26A0 WARNING SIGN.  */
- 	/* Append U+FE0F VARIATION SELECTOR-16 to select the emoji
- 	   variation of the char.  */
- 	pp_unicode_character (pp.get (), 0xFE0F);
- 	/* U+26A0 WARNING SIGN has East_Asian_Width == Neutral, but in its
- 	   emoji variant is printed (by vte at least) with a 2nd half
- 	   overlapping the next char.  Hence we add two spaces here: a space
- 	   to be covered by this overlap, plus another space of padding.  */
- 	pp_string (pp.get (), "  ");
-       }
- 
-     event.print_desc (*pp.get ());
- 
-     label_text result
-       = label_text::take (xstrdup (pp_formatted_text (pp.get ())));
-     return result;
-   }
- 
-   const label_effects *get_effects (unsigned /*range_idx*/) const
-   {
-     return &m_effects;
-   }
- 
-  private:
-   class path_label_effects : public label_effects
-   {
-   public:
-     path_label_effects (const path_label &path_label)
-     : m_path_label (path_label)
-     {
-     }
-     bool has_in_edge (unsigned range_idx) const final override
-     {
-       if (const diagnostic_event *prev_event
- 	    = m_path_label.get_prev_event (range_idx))
- 	return prev_event->connect_to_next_event_p ();
-       return false;
-     }
-     bool has_out_edge (unsigned range_idx) const final override
-     {
-       const diagnostic_event &event = m_path_label.get_event (range_idx);
-       return event.connect_to_next_event_p ();
-     }
- 
-   private:
-     const path_label &m_path_label;
-   };
- 
-   const diagnostic_event &get_event (unsigned range_idx) const
-   {
-     unsigned event_idx = m_start_idx + range_idx;
-     return m_path.get_event (event_idx);
-   }
- 
-   const diagnostic_event *get_prev_event (unsigned range_idx) const
-   {
-     if (m_start_idx + range_idx == 0)
-       return nullptr;
-     unsigned event_idx = m_start_idx + range_idx - 1;
-     return &m_path.get_event (event_idx);
-   }
- 
-   const diagnostic_path &m_path;
-   const pretty_printer &m_ref_pp;
-   unsigned m_start_idx;
-   path_label_effects m_effects;
-   const bool m_colorize;
-   const bool m_allow_emojis;
- };
- 
- /* Return true if E1 and E2 can be consolidated into the same run of events
-    when printing a diagnostic_path.  */
- 
- static bool
- can_consolidate_events (const diagnostic_path &path,
- 			const diagnostic_event &e1,
- 			unsigned ev1_idx,
- 			const diagnostic_event &e2,
- 			unsigned ev2_idx,
- 			bool check_locations)
- {
-   if (e1.get_thread_id () != e2.get_thread_id ())
-     return false;
- 
-   if (!path.same_function_p (ev1_idx, ev2_idx))
-     return false;
- 
-   if (e1.get_stack_depth () != e2.get_stack_depth ())
-     return false;
- 
-   if (check_locations)
-     {
-       location_t loc1 = e1.get_location ();
-       location_t loc2 = e2.get_location ();
- 
-       if (loc1 < RESERVED_LOCATION_COUNT
- 	  || loc2 < RESERVED_LOCATION_COUNT)
- 	return false;
- 
-       /* Neither can be macro-based.  */
-       if (linemap_location_from_macro_expansion_p (line_table, loc1))
- 	return false;
-       if (linemap_location_from_macro_expansion_p (line_table, loc2))
- 	return false;
-     }
- 
-   /* Passed all the tests.  */
-   return true;
- }
- 
- struct event_range;
- struct path_summary;
- class thread_event_printer;
- 
- /* A bundle of information about all of the events in a diagnostic_path
-    relating to a specific path, for use by path_summary.  */
- 
- class per_thread_summary
- {
- public:
-   per_thread_summary (const diagnostic_path &path,
- 		      const logical_location_manager &logical_loc_mgr,
- 		      label_text name, unsigned swimlane_idx)
-   : m_path (path),
-     m_logical_loc_mgr (logical_loc_mgr),
-     m_name (std::move (name)),
-     m_swimlane_idx (swimlane_idx),
-     m_last_event (nullptr),
-     m_min_depth (INT_MAX),
-     m_max_depth (INT_MIN)
-   {}
- 
-   void update_depth_limits (int stack_depth)
-   {
-     if (stack_depth < m_min_depth)
-       m_min_depth = stack_depth;
-     if (stack_depth > m_max_depth)
-       m_max_depth = stack_depth;
-   }
- 
-   const char *get_name () const { return m_name.get (); }
-   unsigned get_swimlane_index () const { return m_swimlane_idx; }
- 
-   bool interprocedural_p () const;
- 
- private:
-   friend struct path_summary;
-   friend class thread_event_printer;
-   friend struct event_range;
- 
-   const diagnostic_path &m_path;
-   const logical_location_manager &m_logical_loc_mgr;
- 
-   const label_text m_name;
- 
-   /* The "swimlane index" is the order in which this per_thread_summary
-      was created, for use when printing the events.  */
-   const unsigned m_swimlane_idx;
- 
-   // The event ranges specific to this thread:
-   auto_vec<event_range *> m_event_ranges;
- 
-   const diagnostic_event *m_last_event;
- 
-   int m_min_depth;
-   int m_max_depth;
- };
- 
- /* A range of consecutive events within a diagnostic_path, all within the
-    same thread, and with the same fndecl and stack_depth, and which are suitable
-    to print with a single call to diagnostic_show_locus.  */
- struct event_range
- {
-   /* A struct for tracking the mergability of labels on a particular
-      source line.  In particular, track information about links between
-      labels to ensure that we only consolidate events involving links
-      that the source-printing code is able to handle (splitting them
-      otherwise).  */
-   struct per_source_line_info
-   {
-     void init (int line)
-     {
-       m_line = line;
-       m_has_in_edge = false;
-       m_has_out_edge = false;
-       m_min_label_source_column = INT_MAX;
-       m_max_label_source_column = INT_MIN;
-     }
- 
-     /* Return true if our source-printing/labelling/linking code can handle
-        the events already on this source line, *and* a new event at COLUMN.  */
-     bool
-     can_add_label_for_event_p (bool has_in_edge,
- 			       const diagnostic_event *prev_event,
- 			       bool has_out_edge,
- 			       int column) const
-     {
-       /* Any existing in-edge has to be the left-most label on its
- 	 source line.  */
-       if (m_has_in_edge && column < m_min_label_source_column)
- 	return false;
-       /* Any existing out-edge has to be the right-most label on its
- 	 source line.  */
-       if (m_has_out_edge && column > m_max_label_source_column)
- 	return false;
-       /* Can't have more than one in-edge.  */
-       if (m_has_in_edge && has_in_edge)
- 	return false;
-       /* Can't have more than one out-edge.  */
-       if (m_has_out_edge && has_out_edge)
- 	return false;
- 
-       if (has_in_edge)
- 	{
- 	  /* Any new in-edge needs to be the left-most label on its
- 	     source line.  */
- 	  if (column > m_min_label_source_column)
- 	    return false;
- 
- 	  gcc_assert (prev_event);
- 	  const location_t prev_loc = prev_event->get_location ();
- 	  expanded_location prev_exploc
- 	    = linemap_client_expand_location_to_spelling_point
- 		(line_table, prev_loc, LOCATION_ASPECT_CARET);
- 	  /* The destination in-edge's line number has to be <= the
- 	     source out-edge's line number (if any).  */
- 	  if (prev_exploc.line >= m_line)
- 	    return false;
- 	}
- 
-       /* Any new out-edge needs to be the right-most label on its
- 	 source line.  */
-       if (has_out_edge)
- 	if (column < m_max_label_source_column)
- 	  return false;
- 
-       /* All checks passed; we can add the new event at COLUMN.  */
-       return true;
-     }
- 
-     void
-     add_label_for_event (bool has_in_edge, bool has_out_edge, int column)
-     {
-       if (has_in_edge)
- 	m_has_in_edge = true;
-       if (has_out_edge)
- 	m_has_out_edge = true;
-       m_min_label_source_column = std::min (m_min_label_source_column, column);
-       m_max_label_source_column = std::max (m_max_label_source_column, column);
-     }
- 
-     int m_line;
-     bool m_has_in_edge;
-     bool m_has_out_edge;
-     int m_min_label_source_column;
-     int m_max_label_source_column;
-   };
- 
-   event_range (const diagnostic_path &path,
- 	       const pretty_printer &ref_pp,
- 	       unsigned start_idx,
- 	       const diagnostic_event &initial_event,
- 	       per_thread_summary &t,
- 	       bool show_event_links,
- 	       bool colorize_labels,
- 	       bool allow_emojis)
-   : m_path (path),
-     m_initial_event (initial_event),
-     m_logical_loc (initial_event.get_logical_location ()),
-     m_stack_depth (initial_event.get_stack_depth ()),
-     m_start_idx (start_idx), m_end_idx (start_idx),
-     m_path_label (path, ref_pp,
- 		  start_idx, colorize_labels, allow_emojis),
-     m_richloc (initial_event.get_location (), &m_path_label, nullptr),
-     m_thread_id (initial_event.get_thread_id ()),
-     m_per_thread_summary (t),
-     m_show_event_links (show_event_links)
-   {
-     if (m_show_event_links)
-       {
- 	expanded_location exploc
- 	  = linemap_client_expand_location_to_spelling_point
- 	  (line_table, initial_event.get_location (), LOCATION_ASPECT_CARET);
- 	per_source_line_info &source_line_info
- 	  = get_per_source_line_info (exploc.line);
- 
- 	const diagnostic_event *prev_thread_event = t.m_last_event;
- 	const bool has_in_edge
- 	  = (prev_thread_event
- 	     ? prev_thread_event->connect_to_next_event_p ()
- 	     : false);
- 	const bool has_out_edge = initial_event.connect_to_next_event_p ();
- 
- 	source_line_info.add_label_for_event
- 	  (has_in_edge, has_out_edge, exploc.column);
-       }
-   }
- 
-   per_source_line_info &
-   get_per_source_line_info (int source_line)
-   {
-     bool existed = false;
-     per_source_line_info &result
-       = m_source_line_info_map.get_or_insert (source_line, &existed);
-     if (!existed)
-       result.init (source_line);
-     return result;
-   }
- 
-   bool maybe_add_event (const path_print_policy &policy,
- 			const diagnostic_event &new_ev,
- 			unsigned new_ev_idx,
- 			bool check_rich_locations)
-   {
-     if (!can_consolidate_events (m_path,
- 				 m_initial_event, m_start_idx,
- 				 new_ev, new_ev_idx,
- 				 check_rich_locations))
-       return false;
- 
-     /* Verify compatibility of the new label and existing labels
-        with respect to the link-printing code.  */
-     expanded_location exploc
-       = linemap_client_expand_location_to_spelling_point
-       (line_table, new_ev.get_location (), LOCATION_ASPECT_CARET);
-     per_source_line_info &source_line_info
-       = get_per_source_line_info (exploc.line);
-     const diagnostic_event *prev_event = nullptr;
-     if (new_ev_idx > 0)
-       prev_event = &m_path.get_event (new_ev_idx - 1);
-     const bool has_in_edge = (prev_event
- 			      ? prev_event->connect_to_next_event_p ()
- 			      : false);
-     const bool has_out_edge = new_ev.connect_to_next_event_p ();
-     if (m_show_event_links)
-       if (!source_line_info.can_add_label_for_event_p
- 	  (has_in_edge, prev_event,
- 	   has_out_edge, exploc.column))
- 	return false;
- 
-     /* Potentially verify that the locations are sufficiently close.  */
-     if (check_rich_locations)
-       if (!m_richloc.add_location_if_nearby (policy.get_source_policy (),
- 					     new_ev.get_location (),
- 					     false, &m_path_label))
- 	return false;
- 
-     m_end_idx = new_ev_idx;
-     m_per_thread_summary.m_last_event = &new_ev;
- 
-     if (m_show_event_links)
-       source_line_info.add_label_for_event
- 	(has_in_edge, has_out_edge, exploc.column);
- 
-     return true;
-   }
- 
-   /* Print the events in this range to PP, typically as a single
-      call to diagnostic_show_locus.  */
- 
-   void print (pretty_printer &pp,
- 	      diagnostic_text_output_format &text_output,
- 	      diagnostic_source_effect_info *effect_info)
-   {
-     location_t initial_loc = m_initial_event.get_location ();
- 
-     diagnostic_context &dc = text_output.get_context ();
- 
-     /* Emit a span indicating the filename (and line/column) if the
-        line has changed relative to the last call to
-        diagnostic_show_locus.  */
-     if (dc.m_source_printing.enabled)
-       {
- 	expanded_location exploc
- 	  = linemap_client_expand_location_to_spelling_point
- 	  (line_table, initial_loc, LOCATION_ASPECT_CARET);
- 	if (exploc.file != LOCATION_FILE (dc.m_last_location))
- 	  {
- 	    diagnostic_location_print_policy loc_policy (text_output);
- 	    diagnostic_start_span (&dc) (loc_policy, &pp, exploc);
- 	  }
-       }
- 
-     /* If we have an UNKNOWN_LOCATION (or BUILTINS_LOCATION) as the
-        primary location for an event, diagnostic_show_locus won't print
-        anything.
- 
-        In particular the label for the event won't get printed.
-        Fail more gracefully in this case by showing the event
-        index and text, at no particular location.  */
-     if (get_pure_location (initial_loc) <= BUILTINS_LOCATION)
-       {
- 	for (unsigned i = m_start_idx; i <= m_end_idx; i++)
- 	  {
- 	    const diagnostic_event &iter_event = m_path.get_event (i);
- 	    diagnostic_event_id_t event_id (i);
- 	    pp_printf (&pp, " %@: ", &event_id);
- 	    iter_event.print_desc (pp);
- 	    pp_newline (&pp);
- 	  }
- 	return;
-       }
- 
-     /* Call diagnostic_show_locus to show the events using labels.  */
-     diagnostic_show_locus (&dc, text_output.get_source_printing_options (),
- 			   &m_richloc, DK_DIAGNOSTIC_PATH, &pp,
- 			   effect_info);
- 
-     /* If we have a macro expansion, show the expansion to the user.  */
-     if (linemap_location_from_macro_expansion_p (line_table, initial_loc))
-       {
- 	gcc_assert (m_start_idx == m_end_idx);
- 	maybe_unwind_expanded_macro_loc (text_output, initial_loc);
-       }
-   }
- 
-   const diagnostic_path &m_path;
-   const diagnostic_event &m_initial_event;
-   logical_location m_logical_loc;
-   int m_stack_depth;
-   unsigned m_start_idx;
-   unsigned m_end_idx;
-   path_label m_path_label;
-   gcc_rich_location m_richloc;
-   diagnostic_thread_id_t m_thread_id;
-   per_thread_summary &m_per_thread_summary;
-   hash_map<int_hash<int, -1, -2>,
- 	   per_source_line_info> m_source_line_info_map;
-   bool m_show_event_links;
- };
- 
- /* A struct for grouping together the events in a diagnostic_path into
-    ranges of events, partitioned by thread and by stack frame (i.e. by fndecl
-    and stack depth).  */
- 
- struct path_summary
- {
-   path_summary (const path_print_policy &policy,
- 		const pretty_printer &ref_pp,
- 		const diagnostic_path &path,
- 		bool check_rich_locations,
- 		bool colorize = false,
- 		bool show_event_links = true);
- 
-   const logical_location_manager &get_logical_location_manager () const
-   {
-     return m_logical_loc_mgr;
-   }
-   unsigned get_num_ranges () const { return m_ranges.length (); }
-   bool multithreaded_p () const { return m_per_thread_summary.length () > 1; }
- 
-   const per_thread_summary &get_events_for_thread_id (diagnostic_thread_id_t tid)
-   {
-     per_thread_summary **slot = m_thread_id_to_events.get (tid);
-     gcc_assert (slot);
-     gcc_assert (*slot);
-     return **slot;
-   }
- 
-   const logical_location_manager &m_logical_loc_mgr;
-   auto_delete_vec <event_range> m_ranges;
-   auto_delete_vec <per_thread_summary> m_per_thread_summary;
-   hash_map<int_hash<diagnostic_thread_id_t, -1, -2>,
- 	   per_thread_summary *> m_thread_id_to_events;
- 
- private:
-   per_thread_summary &
-   get_or_create_events_for_thread_id (const diagnostic_path &path,
- 				      diagnostic_thread_id_t tid)
-   {
-     if (per_thread_summary **slot = m_thread_id_to_events.get (tid))
-       return **slot;
- 
-     const diagnostic_thread &thread = path.get_thread (tid);
-     per_thread_summary *pts
-       = new per_thread_summary (path,
- 				m_logical_loc_mgr,
- 				thread.get_name (false),
- 				m_per_thread_summary.length ());
-     m_thread_id_to_events.put (tid, pts);
-     m_per_thread_summary.safe_push (pts);
-     return *pts;
-   }
- };
- 
- /* Return true iff there is more than one stack frame used by the events
-    of this thread.  */
- 
- bool
- per_thread_summary::interprocedural_p () const
- {
-   if (m_event_ranges.is_empty ())
-     return false;
-   int first_stack_depth = m_event_ranges[0]->m_stack_depth;
-   for (auto range : m_event_ranges)
-     {
-       if (!m_path.same_function_p (m_event_ranges[0]->m_start_idx,
- 				   range->m_start_idx))
- 	  return true;
-       if (range->m_stack_depth != first_stack_depth)
- 	return true;
-     }
-   return false;
- }
- 
- /* path_summary's ctor.  */
- 
- path_summary::path_summary (const path_print_policy &policy,
- 			    const pretty_printer &ref_pp,
- 			    const diagnostic_path &path,
- 			    bool check_rich_locations,
- 			    bool colorize,
- 			    bool show_event_links)
- : m_logical_loc_mgr (path.get_logical_location_manager ())
- {
-   const unsigned num_events = path.num_events ();
- 
-   event_range *cur_event_range = NULL;
-   for (unsigned idx = 0; idx < num_events; idx++)
-     {
-       const diagnostic_event &event = path.get_event (idx);
-       const diagnostic_thread_id_t thread_id = event.get_thread_id ();
-       per_thread_summary &pts
- 	= get_or_create_events_for_thread_id (path, thread_id);
- 
-       pts.update_depth_limits (event.get_stack_depth ());
- 
-       if (cur_event_range)
- 	if (cur_event_range->maybe_add_event (policy,
- 					      event,
- 					      idx, check_rich_locations))
- 	  continue;
- 
-       auto theme = policy.get_diagram_theme ();
-       const bool allow_emojis = theme ? theme->emojis_p () : false;
-       cur_event_range = new event_range (path, ref_pp,
- 					 idx, event, pts,
- 					 show_event_links,
- 					 colorize,
- 					 allow_emojis);
-       m_ranges.safe_push (cur_event_range);
-       pts.m_event_ranges.safe_push (cur_event_range);
-       pts.m_last_event = &event;
-     }
- }
- 
- /* Write SPACES to PP.  */
- 
- static void
- write_indent (pretty_printer *pp, int spaces)
- {
-   for (int i = 0; i < spaces; i++)
-     pp_space (pp);
- }
- 
- static const int base_indent = 2;
- static const int per_frame_indent = 2;
- 
- /* A bundle of state for printing event_range instances for a particular
-    thread.  */
- 
- class thread_event_printer
- {
- public:
-   thread_event_printer (const per_thread_summary &t, bool show_depths)
-   : m_per_thread_summary (t),
-     m_show_depths (show_depths),
-     m_cur_indent (base_indent),
-     m_vbar_column_for_depth (),
-     m_num_printed (0)
-   {
-   }
- 
-   /* Get the previous event_range within this thread, if any.  */
-   const event_range *get_any_prev_range () const
-   {
-     if (m_num_printed > 0)
-       return m_per_thread_summary.m_event_ranges[m_num_printed - 1];
-     else
-       return nullptr;
-   }
- 
-   /* Get the next event_range within this thread, if any.  */
-   const event_range *get_any_next_range () const
-   {
-     if (m_num_printed < m_per_thread_summary.m_event_ranges.length () - 1)
-       return m_per_thread_summary.m_event_ranges[m_num_printed + 1];
-     else
-       return nullptr;
-   }
- 
-   void
-   print_swimlane_for_event_range (diagnostic_text_output_format &text_output,
- 				  pretty_printer *pp,
- 				  const logical_location_manager &logical_loc_mgr,
- 				  event_range *range,
- 				  diagnostic_source_effect_info *effect_info)
-   {
-     gcc_assert (pp);
-     const char *const line_color = "path";
-     const char *start_line_color
-       = colorize_start (pp_show_color (pp), line_color);
-     const char *end_line_color = colorize_stop (pp_show_color (pp));
- 
-     text_art::ascii_theme fallback_theme;
-     text_art::theme *theme = text_output.get_diagram_theme ();
-     if (!theme)
-       theme = &fallback_theme;
- 
-     cppchar_t depth_marker_char = theme->get_cppchar
-       (text_art::theme::cell_kind::INTERPROCEDURAL_DEPTH_MARKER);
-     /* e.g. "|".  */
- 
-     const bool interprocedural_p = m_per_thread_summary.interprocedural_p ();
- 
-     write_indent (pp, m_cur_indent);
-     if (const event_range *prev_range = get_any_prev_range ())
-       {
- 	if (range->m_stack_depth > prev_range->m_stack_depth)
- 	  {
- 	    gcc_assert (interprocedural_p);
- 	    /* Show pushed stack frame(s).  */
- 	    cppchar_t left = theme->get_cppchar
- 	      (text_art::theme::cell_kind::INTERPROCEDURAL_PUSH_FRAME_LEFT);
- 	    cppchar_t middle = theme->get_cppchar
- 	      (text_art::theme::cell_kind::INTERPROCEDURAL_PUSH_FRAME_MIDDLE);
- 	    cppchar_t right = theme->get_cppchar
- 	      (text_art::theme::cell_kind::INTERPROCEDURAL_PUSH_FRAME_RIGHT);
- 	    /* e.g. "+--> ".  */
- 	    pp_string (pp, start_line_color);
- 	    pp_unicode_character (pp, left);
- 	    pp_unicode_character (pp, middle);
- 	    pp_unicode_character (pp, middle);
- 	    pp_unicode_character (pp, right);
- 	    pp_space (pp);
- 	    pp_string (pp, end_line_color);
- 	    m_cur_indent += 5;
- 	  }
-       }
-     if (range->m_logical_loc)
-       {
- 	label_text name
- 	  (logical_loc_mgr.get_name_for_path_output (range->m_logical_loc));
- 	if (name.get ())
- 	  pp_printf (pp, "%qs: ", name.get ());
-       }
-     if (range->m_start_idx == range->m_end_idx)
-       pp_printf (pp, "event %i",
- 		 range->m_start_idx + 1);
-     else
-       pp_printf (pp, "events %i-%i",
- 		 range->m_start_idx + 1, range->m_end_idx + 1);
-     if (m_show_depths)
-       pp_printf (pp, " (depth %i)", range->m_stack_depth);
-     pp_newline (pp);
- 
-     /* Print a run of events.  */
-     if (interprocedural_p)
-       {
- 	write_indent (pp, m_cur_indent + per_frame_indent);
- 	pp_string (pp, start_line_color);
- 	pp_unicode_character (pp, depth_marker_char);
- 	pp_string (pp, end_line_color);
- 	pp_newline (pp);
- 
- 	char *saved_prefix = pp_take_prefix (pp);
- 	char *prefix;
- 	{
- 	  pretty_printer tmp_pp;
- 	  write_indent (&tmp_pp, m_cur_indent + per_frame_indent);
- 	  pp_string (&tmp_pp, start_line_color);
- 	  pp_unicode_character (&tmp_pp, depth_marker_char);
- 	  pp_string (&tmp_pp, end_line_color);
- 	  prefix = xstrdup (pp_formatted_text (&tmp_pp));
- 	}
- 	pp_set_prefix (pp, prefix);
- 	pp_prefixing_rule (pp) = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
- 	range->print (*pp, text_output, effect_info);
- 	pp_set_prefix (pp, saved_prefix);
- 
- 	write_indent (pp, m_cur_indent + per_frame_indent);
- 	pp_string (pp, start_line_color);
- 	pp_unicode_character (pp, depth_marker_char);
- 	pp_string (pp, end_line_color);
- 	pp_newline (pp);
-       }
-     else
-       range->print (*pp, text_output, effect_info);
- 
-     if (const event_range *next_range = get_any_next_range ())
-       {
- 	if (range->m_stack_depth > next_range->m_stack_depth)
- 	  {
- 	    if (m_vbar_column_for_depth.get (next_range->m_stack_depth))
- 	      {
- 		/* Show returning from stack frame(s), by printing
- 		   something like:
- 		   "                   |\n"
- 		   "     <-------------+\n"
- 		   "     |\n".  */
- 		gcc_assert (interprocedural_p);
- 		cppchar_t left = theme->get_cppchar
- 		  (text_art::theme::cell_kind::INTERPROCEDURAL_POP_FRAMES_LEFT);
- 		cppchar_t middle = theme->get_cppchar
- 		  (text_art::theme::cell_kind::INTERPROCEDURAL_POP_FRAMES_MIDDLE);
- 		cppchar_t right = theme->get_cppchar
- 		  (text_art::theme::cell_kind::INTERPROCEDURAL_POP_FRAMES_RIGHT);
- 		int vbar_for_next_frame
- 		  = *m_vbar_column_for_depth.get (next_range->m_stack_depth);
- 
- 		int indent_for_next_frame
- 		  = vbar_for_next_frame - per_frame_indent;
- 		write_indent (pp, vbar_for_next_frame);
- 		pp_string (pp, start_line_color);
- 		pp_unicode_character (pp, left);
- 		for (int i = indent_for_next_frame + per_frame_indent;
- 		     i < m_cur_indent + per_frame_indent - 1; i++)
- 		  pp_unicode_character (pp, middle);
- 		pp_unicode_character (pp, right);
- 		pp_string (pp, end_line_color);
- 		pp_newline (pp);
- 		m_cur_indent = indent_for_next_frame;
- 
- 		write_indent (pp, vbar_for_next_frame);
- 		pp_string (pp, start_line_color);
- 		pp_unicode_character (pp, depth_marker_char);
- 		pp_string (pp, end_line_color);
- 		pp_newline (pp);
- 	      }
- 	    else
- 	      {
- 		/* Handle disjoint paths (e.g. a callback at some later
- 		   time).  */
- 		m_cur_indent = base_indent;
- 	      }
- 	  }
- 	else if (range->m_stack_depth < next_range->m_stack_depth)
- 	  {
- 	    /* Prepare to show pushed stack frame.  */
- 	    gcc_assert (interprocedural_p);
- 	    gcc_assert (range->m_stack_depth != EMPTY);
- 	    gcc_assert (range->m_stack_depth != DELETED);
- 	    m_vbar_column_for_depth.put (range->m_stack_depth,
- 					 m_cur_indent + per_frame_indent);
- 	    m_cur_indent += per_frame_indent;
- 	  }
-       }
- 
-     m_num_printed++;
-   }
- 
-   int get_cur_indent () const { return m_cur_indent; }
- 
- private:
-   const per_thread_summary &m_per_thread_summary;
-   bool m_show_depths;
- 
-   /* Print the ranges.  */
-   int m_cur_indent;
- 
-   /* Keep track of column numbers of existing '|' characters for
-      stack depths we've already printed.  */
-   static const int EMPTY = -1;
-   static const int DELETED = -2;
-   typedef int_hash <int, EMPTY, DELETED> vbar_hash;
-   hash_map <vbar_hash, int> m_vbar_column_for_depth;
- 
-   /* How many event ranges within this swimlane have we printed.
-      This is the index of the next event_range to print.  */
-   unsigned  m_num_printed;
- };
- 
- /* Print path_summary PS to TEXT_OUTPUT, giving an overview of the
-    interprocedural calls and returns.
- 
-    Print the event descriptions in a nested form, printing the event
-    descriptions within calls to diagnostic_show_locus, using labels to
-    show the events:
- 
-    'foo' (events 1-2)
-      | NN |
-      |    |
-      +--> 'bar' (events 3-4)
-             | NN |
-             |    |
-             +--> 'baz' (events 5-6)
-                    | NN |
-                    |    |
-      <------------ +
-      |
-    'foo' (events 7-8)
-      | NN |
-      |    |
-      +--> 'bar' (events 9-10)
-             | NN |
-             |    |
-             +--> 'baz' (events 11-12)
-                    | NN |
-                    |    |
- 
-    If SHOW_DEPTHS is true, append " (depth N)" to the header of each run
-    of events.
- 
-    For events with UNKNOWN_LOCATION, print a summary of each the event.  */
- 
- static void
- print_path_summary_as_text (const path_summary &ps,
- 			    diagnostic_text_output_format &text_output,
- 			    bool show_depths)
- {
-   pretty_printer *const pp = text_output.get_printer ();
- 
-   std::vector<thread_event_printer> thread_event_printers;
-   for (auto t : ps.m_per_thread_summary)
-     thread_event_printers.push_back (thread_event_printer (*t, show_depths));
- 
-   unsigned i;
-   event_range *range;
-   int last_out_edge_column = -1;
-   FOR_EACH_VEC_ELT (ps.m_ranges, i, range)
-     {
-       const int swimlane_idx
- 	= range->m_per_thread_summary.get_swimlane_index ();
-       if (ps.multithreaded_p ())
- 	if (i == 0 || ps.m_ranges[i - 1]->m_thread_id != range->m_thread_id)
- 	  {
- 	    if (i > 0)
- 	      pp_newline (pp);
- 	    pp_printf (pp, "Thread: %qs",
- 		       range->m_per_thread_summary.get_name ());
- 	    pp_newline (pp);
- 	  }
-       thread_event_printer &tep = thread_event_printers[swimlane_idx];
-       /* Wire up any trailing out-edge from previous range to leading in-edge
- 	 of this range.  */
-       diagnostic_source_effect_info effect_info;
-       effect_info.m_leading_in_edge_column = last_out_edge_column;
-       tep.print_swimlane_for_event_range (text_output, pp,
- 					  ps.get_logical_location_manager (),
- 					  range, &effect_info);
-       last_out_edge_column = effect_info.m_trailing_out_edge_column;
-     }
- }
- 
- } /* end of anonymous namespace for path-printing code.  */
- 
- class element_event_desc : public pp_element
- {
- public:
-   element_event_desc (const diagnostic_event &event)
-   : m_event (event)
-   {
-   }
- 
-   void add_to_phase_2 (pp_markup::context &ctxt) final override
-   {
-     auto pp = ctxt.m_pp.clone ();
-     m_event.print_desc (*pp.get ());
-     pp_string (&ctxt.m_pp, pp_formatted_text (pp.get ()));
-   }
- 
- private:
-   const diagnostic_event &m_event;
- };
- 
- /* Print PATH according to the context's path_format.  */
- 
- void
- diagnostic_text_output_format::print_path (const diagnostic_path &path)
- {
-   const unsigned num_events = path.num_events ();
- 
-   switch (get_context ().get_path_format ())
-     {
-     case DPF_NONE:
-       /* Do nothing.  */
-       return;
- 
-     case DPF_SEPARATE_EVENTS:
-       {
- 	/* A note per event.  */
- 	auto &logical_loc_mgr = path.get_logical_location_manager ();
- 	for (unsigned i = 0; i < num_events; i++)
- 	  {
- 	    const diagnostic_event &event = path.get_event (i);
- 	    element_event_desc e_event_desc (event);
- 	    diagnostic_event_id_t event_id (i);
- 	    if (get_context ().show_path_depths_p ())
- 	      {
- 		int stack_depth = event.get_stack_depth ();
- 		/* -fdiagnostics-path-format=separate-events doesn't print
- 		   fndecl information, so with -fdiagnostics-show-path-depths
- 		   print the fndecls too, if any.  */
- 		if (logical_location logical_loc
- 		      = event.get_logical_location ())
- 		  {
- 		    label_text name
- 		      (logical_loc_mgr.get_name_for_path_output (logical_loc));
- 		    inform (event.get_location (),
- 			    "%@ %e (fndecl %qs, depth %i)",
- 			    &event_id, &e_event_desc,
- 			    name.get (), stack_depth);
- 		  }
- 		else
- 		  inform (event.get_location (),
- 			  "%@ %e (depth %i)",
- 			  &event_id, &e_event_desc,
- 			  stack_depth);
- 	      }
- 	    else
- 	      inform (event.get_location (),
- 		      "%@ %e", &event_id, &e_event_desc);
- 	  }
-       }
-       break;
- 
-     case DPF_INLINE_EVENTS:
-       {
- 	/* Consolidate related events.  */
- 	path_print_policy policy (*this);
- 	pretty_printer *const pp = get_printer ();
- 	const bool check_rich_locations = true;
- 	const bool colorize = pp_show_color (pp);
- 	const bool show_event_links = m_source_printing.show_event_links_p;
- 	path_summary summary (policy,
- 			      *pp,
- 			      path,
- 			      check_rich_locations,
- 			      colorize,
- 			      show_event_links);
- 	char *saved_prefix = pp_take_prefix (pp);
- 	pp_set_prefix (pp, NULL);
- 	print_path_summary_as_text (summary, *this,
- 				    get_context ().show_path_depths_p ());
- 	pp_flush (pp);
- 	pp_set_prefix (pp, saved_prefix);
-       }
-       break;
-     }
- }
- 
- #if CHECKING_P
- 
- namespace selftest {
- 
- /* Return true iff all events in PATH have locations for which column data
-    is available, so that selftests that require precise string output can
-    bail out for awkward line_table cases.  */
- 
- static bool
- path_events_have_column_data_p (const diagnostic_path &path)
- {
-   for (unsigned idx = 0; idx < path.num_events (); idx++)
-     {
-       location_t event_loc = path.get_event (idx).get_location ();
-       if (line_table->get_pure_location (event_loc)
- 	  > LINE_MAP_MAX_LOCATION_WITH_COLS)
- 	return false;
-       if (line_table->get_start (event_loc) > LINE_MAP_MAX_LOCATION_WITH_COLS)
- 	return false;
-       if (line_table->get_finish (event_loc) > LINE_MAP_MAX_LOCATION_WITH_COLS)
- 	return false;
-     }
-   return true;
- }
- 
- /* Verify that empty paths are handled gracefully.  */
- 
- static void
- test_empty_path (pretty_printer *event_pp)
- {
-   test_diagnostic_path path (event_pp);
-   ASSERT_FALSE (path.interprocedural_p ());
- 
-   test_diagnostic_context dc;
-   diagnostic_text_output_format text_output (dc);
-   path_print_policy policy (text_output);
-   path_summary summary (policy, *event_pp, path, false);
-   ASSERT_EQ (summary.get_num_ranges (), 0);
- 
-   print_path_summary_as_text (summary, text_output, true);
-   ASSERT_STREQ ("",
- 		pp_formatted_text (text_output.get_printer ()));
- }
- 
- /* Verify that print_path_summary works on a purely intraprocedural path.  */
- 
- static void
- test_intraprocedural_path (pretty_printer *event_pp)
- {
-   test_diagnostic_path path (event_pp);
-   const char *const funcname = "foo";
-   path.add_event (UNKNOWN_LOCATION, funcname, 0, "first %qs", "free");
-   path.add_event (UNKNOWN_LOCATION, funcname, 0, "double %qs", "free");
- 
-   ASSERT_FALSE (path.interprocedural_p ());
- 
-   test_diagnostic_context dc;
-   diagnostic_text_output_format text_output (dc);
-   path_print_policy policy (text_output);
-   path_summary summary (policy, *event_pp, path, false, false, false);
-   ASSERT_EQ (summary.get_num_ranges (), 1);
- 
-   print_path_summary_as_text (summary, text_output, true);
-   ASSERT_STREQ ("  `foo': events 1-2 (depth 0)\n"
- 		" (1): first `free'\n"
- 		" (2): double `free'\n",
- 		pp_formatted_text (text_output.get_printer ()));
- }
- 
- /* Verify that print_path_summary works on an interprocedural path.  */
- 
- static void
- test_interprocedural_path_1 (pretty_printer *event_pp)
- {
-   test_diagnostic_path path (event_pp);
-   path.add_entry ("test", 0);
-   path.add_call ("test", 0, "make_boxed_int");
-   path.add_call ("make_boxed_int", 1, "wrapped_malloc");
-   path.add_event (UNKNOWN_LOCATION,
- 		  "wrapped_malloc", 2, "calling malloc");
-   path.add_return ("test", 0);
-   path.add_call ("test", 0, "free_boxed_int");
-   path.add_call ("free_boxed_int", 1, "wrapped_free");
-   path.add_event (UNKNOWN_LOCATION, "wrapped_free", 2, "calling free");
-   path.add_return ("test", 0);
-   path.add_call ("test", 0, "free_boxed_int");
-   path.add_call ("free_boxed_int", 1, "wrapped_free");
-   path.add_event (UNKNOWN_LOCATION, "wrapped_free", 2, "calling free");
-   ASSERT_EQ (path.num_events (), 18);
- 
-   ASSERT_TRUE (path.interprocedural_p ());
- 
-   {
-     test_diagnostic_context dc;
-     diagnostic_text_output_format text_output (dc, nullptr, false);
-     path_print_policy policy (text_output);
-     path_summary summary (policy, *event_pp, path, false);
-     ASSERT_EQ (summary.get_num_ranges (), 9);
- 
-     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
-     print_path_summary_as_text (summary, text_output, true);
-     ASSERT_STREQ
-       ("  `test': events 1-2 (depth 0)\n"
-        "    |\n"
-        "    | (1): entering `test'\n"
-        "    | (2): calling `make_boxed_int'\n"
-        "    |\n"
-        "    +--> `make_boxed_int': events 3-4 (depth 1)\n"
-        "           |\n"
-        "           | (3): entering `make_boxed_int'\n"
-        "           | (4): calling `wrapped_malloc'\n"
-        "           |\n"
-        "           +--> `wrapped_malloc': events 5-6 (depth 2)\n"
-        "                  |\n"
-        "                  | (5): entering `wrapped_malloc'\n"
-        "                  | (6): calling malloc\n"
-        "                  |\n"
-        "    <-------------+\n"
-        "    |\n"
-        "  `test': events 7-8 (depth 0)\n"
-        "    |\n"
-        "    | (7): returning to `test'\n"
-        "    | (8): calling `free_boxed_int'\n"
-        "    |\n"
-        "    +--> `free_boxed_int': events 9-10 (depth 1)\n"
-        "           |\n"
-        "           | (9): entering `free_boxed_int'\n"
-        "           | (10): calling `wrapped_free'\n"
-        "           |\n"
-        "           +--> `wrapped_free': events 11-12 (depth 2)\n"
-        "                  |\n"
-        "                  | (11): entering `wrapped_free'\n"
-        "                  | (12): calling free\n"
-        "                  |\n"
-        "    <-------------+\n"
-        "    |\n"
-        "  `test': events 13-14 (depth 0)\n"
-        "    |\n"
-        "    | (13): returning to `test'\n"
-        "    | (14): calling `free_boxed_int'\n"
-        "    |\n"
-        "    +--> `free_boxed_int': events 15-16 (depth 1)\n"
-        "           |\n"
-        "           | (15): entering `free_boxed_int'\n"
-        "           | (16): calling `wrapped_free'\n"
-        "           |\n"
-        "           +--> `wrapped_free': events 17-18 (depth 2)\n"
-        "                  |\n"
-        "                  | (17): entering `wrapped_free'\n"
-        "                  | (18): calling free\n"
-        "                  |\n",
-        pp_formatted_text (text_output.get_printer ()));
-   }
-   {
-     test_diagnostic_context dc;
-     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE);
-     diagnostic_text_output_format text_output (dc);
-     path_print_policy policy (text_output);
-     path_summary summary (policy, *event_pp, path, false);
-     print_path_summary_as_text (summary, text_output, true);
-     ASSERT_STREQ
-       ("  `test': events 1-2 (depth 0)\n"
-        "    │\n"
-        "    │ (1): entering `test'\n"
-        "    │ (2): calling `make_boxed_int'\n"
-        "    │\n"
-        "    └──> `make_boxed_int': events 3-4 (depth 1)\n"
-        "           │\n"
-        "           │ (3): entering `make_boxed_int'\n"
-        "           │ (4): calling `wrapped_malloc'\n"
-        "           │\n"
-        "           └──> `wrapped_malloc': events 5-6 (depth 2)\n"
-        "                  │\n"
-        "                  │ (5): entering `wrapped_malloc'\n"
-        "                  │ (6): calling malloc\n"
-        "                  │\n"
-        "    <─────────────┘\n"
-        "    │\n"
-        "  `test': events 7-8 (depth 0)\n"
-        "    │\n"
-        "    │ (7): returning to `test'\n"
-        "    │ (8): calling `free_boxed_int'\n"
-        "    │\n"
-        "    └──> `free_boxed_int': events 9-10 (depth 1)\n"
-        "           │\n"
-        "           │ (9): entering `free_boxed_int'\n"
-        "           │ (10): calling `wrapped_free'\n"
-        "           │\n"
-        "           └──> `wrapped_free': events 11-12 (depth 2)\n"
-        "                  │\n"
-        "                  │ (11): entering `wrapped_free'\n"
-        "                  │ (12): calling free\n"
-        "                  │\n"
-        "    <─────────────┘\n"
-        "    │\n"
-        "  `test': events 13-14 (depth 0)\n"
-        "    │\n"
-        "    │ (13): returning to `test'\n"
-        "    │ (14): calling `free_boxed_int'\n"
-        "    │\n"
-        "    └──> `free_boxed_int': events 15-16 (depth 1)\n"
-        "           │\n"
-        "           │ (15): entering `free_boxed_int'\n"
-        "           │ (16): calling `wrapped_free'\n"
-        "           │\n"
-        "           └──> `wrapped_free': events 17-18 (depth 2)\n"
-        "                  │\n"
-        "                  │ (17): entering `wrapped_free'\n"
-        "                  │ (18): calling free\n"
-        "                  │\n",
-        pp_formatted_text (text_output.get_printer ()));
-   }
- 
- }
- 
- /* Example where we pop the stack to an intermediate frame, rather than the
-    initial one.  */
- 
- static void
- test_interprocedural_path_2 (pretty_printer *event_pp)
- {
-   test_diagnostic_path path (event_pp);
-   path.add_entry ("foo", 0);
-   path.add_call ("foo", 0, "bar");
-   path.add_call ("bar", 1, "baz");
-   path.add_return ("bar", 1);
-   path.add_call ("bar", 1, "baz");
-   ASSERT_EQ (path.num_events (), 8);
- 
-   ASSERT_TRUE (path.interprocedural_p ());
- 
-   {
-     test_diagnostic_context dc;
-     diagnostic_text_output_format text_output (dc);
-     path_print_policy policy (text_output);
-     path_summary summary (policy, *event_pp, path, false);
-     ASSERT_EQ (summary.get_num_ranges (), 5);
-     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
-     print_path_summary_as_text (summary, text_output, true);
-     ASSERT_STREQ
-       ("  `foo': events 1-2 (depth 0)\n"
-        "    |\n"
-        "    | (1): entering `foo'\n"
-        "    | (2): calling `bar'\n"
-        "    |\n"
-        "    +--> `bar': events 3-4 (depth 1)\n"
-        "           |\n"
-        "           | (3): entering `bar'\n"
-        "           | (4): calling `baz'\n"
-        "           |\n"
-        "           +--> `baz': event 5 (depth 2)\n"
-        "                  |\n"
-        "                  | (5): entering `baz'\n"
-        "                  |\n"
-        "           <------+\n"
-        "           |\n"
-        "         `bar': events 6-7 (depth 1)\n"
-        "           |\n"
-        "           | (6): returning to `bar'\n"
-        "           | (7): calling `baz'\n"
-        "           |\n"
-        "           +--> `baz': event 8 (depth 2)\n"
-        "                  |\n"
-        "                  | (8): entering `baz'\n"
-        "                  |\n",
-        pp_formatted_text (text_output.get_printer ()));
-   }
-   {
-     test_diagnostic_context dc;
-     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE);
-     diagnostic_text_output_format text_output (dc);
-     path_print_policy policy (text_output);
-     path_summary summary (policy, *event_pp, path, false);
-     print_path_summary_as_text (summary, text_output, true);
-     ASSERT_STREQ
-       ("  `foo': events 1-2 (depth 0)\n"
-        "    │\n"
-        "    │ (1): entering `foo'\n"
-        "    │ (2): calling `bar'\n"
-        "    │\n"
-        "    └──> `bar': events 3-4 (depth 1)\n"
-        "           │\n"
-        "           │ (3): entering `bar'\n"
-        "           │ (4): calling `baz'\n"
-        "           │\n"
-        "           └──> `baz': event 5 (depth 2)\n"
-        "                  │\n"
-        "                  │ (5): entering `baz'\n"
-        "                  │\n"
-        "           <──────┘\n"
-        "           │\n"
-        "         `bar': events 6-7 (depth 1)\n"
-        "           │\n"
-        "           │ (6): returning to `bar'\n"
-        "           │ (7): calling `baz'\n"
-        "           │\n"
-        "           └──> `baz': event 8 (depth 2)\n"
-        "                  │\n"
-        "                  │ (8): entering `baz'\n"
-        "                  │\n",
-        pp_formatted_text (text_output.get_printer ()));
-   }
- }
- 
- /* Verify that print_path_summary is sane in the face of a recursive
-    diagnostic_path.  */
- 
- static void
- test_recursion (pretty_printer *event_pp)
- {
-  test_diagnostic_path path (event_pp);
-   path.add_entry ("factorial", 0);
-   for (int depth = 0; depth < 3; depth++)
-     path.add_call ("factorial", depth, "factorial");
-   ASSERT_EQ (path.num_events (), 7);
- 
-   ASSERT_TRUE (path.interprocedural_p ());
- 
-   {
-     test_diagnostic_context dc;
-     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
- 
-     diagnostic_text_output_format text_output (dc);
-     path_print_policy policy (text_output);
-     path_summary summary (policy, *event_pp, path, false);
-     ASSERT_EQ (summary.get_num_ranges (), 4);
- 
-     print_path_summary_as_text (summary, text_output, true);
-     ASSERT_STREQ
-       ("  `factorial': events 1-2 (depth 0)\n"
-        "    |\n"
-        "    | (1): entering `factorial'\n"
-        "    | (2): calling `factorial'\n"
-        "    |\n"
-        "    +--> `factorial': events 3-4 (depth 1)\n"
-        "           |\n"
-        "           | (3): entering `factorial'\n"
-        "           | (4): calling `factorial'\n"
-        "           |\n"
-        "           +--> `factorial': events 5-6 (depth 2)\n"
-        "                  |\n"
-        "                  | (5): entering `factorial'\n"
-        "                  | (6): calling `factorial'\n"
-        "                  |\n"
-        "                  +--> `factorial': event 7 (depth 3)\n"
-        "                         |\n"
-        "                         | (7): entering `factorial'\n"
-        "                         |\n",
-        pp_formatted_text (text_output.get_printer ()));
-   }
-   {
-     test_diagnostic_context dc;
-     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE);
- 
-     diagnostic_text_output_format text_output (dc);
-     path_print_policy policy (text_output);
-     path_summary summary (policy, *event_pp, path, false);
-     print_path_summary_as_text (summary, text_output, true);
-     ASSERT_STREQ
-       ("  `factorial': events 1-2 (depth 0)\n"
-        "    │\n"
-        "    │ (1): entering `factorial'\n"
-        "    │ (2): calling `factorial'\n"
-        "    │\n"
-        "    └──> `factorial': events 3-4 (depth 1)\n"
-        "           │\n"
-        "           │ (3): entering `factorial'\n"
-        "           │ (4): calling `factorial'\n"
-        "           │\n"
-        "           └──> `factorial': events 5-6 (depth 2)\n"
-        "                  │\n"
-        "                  │ (5): entering `factorial'\n"
-        "                  │ (6): calling `factorial'\n"
-        "                  │\n"
-        "                  └──> `factorial': event 7 (depth 3)\n"
-        "                         │\n"
-        "                         │ (7): entering `factorial'\n"
-        "                         │\n",
-        pp_formatted_text (text_output.get_printer ()));
-   }
- }
- 
- /* Helper class for writing tests of control flow visualization.  */
- 
- class control_flow_test
- {
- public:
-   control_flow_test (const location &loc,
- 		     const line_table_case &case_,
- 		     const char *content)
-   : m_tmp_file (loc, ".c", content,
- 		/* gcc_rich_location::add_location_if_nearby implicitly
- 		   uses global_dc's file_cache, so we need to evict
- 		   tmp when we're done.  */
- 		&global_dc->get_file_cache ()),
-     m_ltt (case_)
-   {
-     m_ord_map
-       = linemap_check_ordinary (linemap_add (line_table, LC_ENTER, false,
- 					     m_tmp_file.get_filename (), 0));
-     linemap_line_start (line_table, 1, 100);
-   }
- 
-   location_t get_line_and_column (int line, int column)
-   {
-     return linemap_position_for_line_and_column (line_table, m_ord_map,
- 						 line, column);
-   }
- 
-   location_t get_line_and_columns (int line, int first_column, int last_column)
-   {
-     return get_line_and_columns (line,
- 				 first_column, first_column, last_column);
-   }
- 
-   location_t get_line_and_columns (int line,
- 				   int first_column,
- 				   int caret_column,
- 				   int last_column)
-   {
-     return make_location (get_line_and_column (line, caret_column),
- 			  get_line_and_column (line, first_column),
- 			  get_line_and_column (line, last_column));
-   }
- 
- private:
-   temp_source_file m_tmp_file;
-   line_table_test m_ltt;
-   const line_map_ordinary *m_ord_map;
- };
- 
- /* Example of event edges where all events can go in the same layout,
-    testing the 6 combinations of:
-    - ASCII vs Unicode vs event links off
-    - line numbering on and off.  */
- 
- static void
- test_control_flow_1 (const line_table_case &case_,
- 		     pretty_printer *event_pp)
- {
-   /* Create a tempfile and write some text to it.
-      ...000000000111111111122222222223333333333.
-      ...123456789012345678901234567890123456789.  */
-   const char *content
-     = ("int test (int *p)\n" /* line 1.  */
-        "{\n"                 /* line 2.  */
-        "  if (p)\n"          /* line 3.  */
-        "    return 0;\n"     /* line 4.  */
-        "  return *p;\n"      /* line 5.  */
-        "}\n");               /* line 6.  */
- 
-   control_flow_test t (SELFTEST_LOCATION, case_, content);
- 
-   const location_t conditional = t.get_line_and_column (3, 7);
-   const location_t cfg_dest = t.get_line_and_column (5, 10);
- 
-   test_diagnostic_path path (event_pp);
-   path.add_event (conditional, nullptr, 0,
- 		  "following %qs branch (when %qs is NULL)...",
- 		  "false", "p");
-   path.connect_to_next_event ();
- 
-   path.add_event (cfg_dest, nullptr, 0,
- 		  "...to here");
-   path.add_event (cfg_dest, nullptr, 0,
- 		  "dereference of NULL %qs",
- 		  "p");
- 
-   if (!path_events_have_column_data_p (path))
-     return;
- 
- 
-   {
-     test_diagnostic_context dc;
-     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
-     dc.m_source_printing.show_event_links_p = true;
-     diagnostic_text_output_format text_output (dc);
-     path_print_policy policy (text_output);
-     path_summary summary (policy, *event_pp, path, true);
-     print_path_summary_as_text (summary, text_output, false);
-     ASSERT_STREQ
-       ("  events 1-3\n"
-        "FILENAME:3:7:\n"
-        "   if (p)\n"
-        "       ^\n"
-        "       |\n"
-        "       (1) following `false' branch (when `p' is NULL)... ->-+\n"
-        "                                                             |\n"
-        "FILENAME:5:10:\n"
-        "                                                             |\n"
-        "+------------------------------------------------------------+\n"
-        "|  return *p;\n"
-        "|         ~\n"
-        "|         |\n"
-        "+-------->(2) ...to here\n"
-        "          (3) dereference of NULL `p'\n",
-        pp_formatted_text (text_output.get_printer ()));
-   }
-   {
-     test_diagnostic_context dc;
-     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
-     dc.m_source_printing.show_event_links_p = false;
-     diagnostic_text_output_format text_output (dc);
-     path_print_policy policy (text_output);
-     path_summary summary (policy, *event_pp, path, true);
-     print_path_summary_as_text (summary, text_output, false);
-     ASSERT_STREQ
-       ("  events 1-3\n"
-        "FILENAME:3:7:\n"
-        "   if (p)\n"
-        "       ^\n"
-        "       |\n"
-        "       (1) following `false' branch (when `p' is NULL)...\n"
-        "FILENAME:5:10:\n"
-        "   return *p;\n"
-        "          ~\n"
-        "          |\n"
-        "          (2) ...to here\n"
-        "          (3) dereference of NULL `p'\n",
-        pp_formatted_text (text_output.get_printer ()));
-   }
-   {
-     test_diagnostic_context dc;
-     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
-     dc.m_source_printing.show_line_numbers_p = true;
-     dc.m_source_printing.show_event_links_p = true;
-     diagnostic_text_output_format text_output (dc);
-     path_print_policy policy (text_output);
-     path_summary summary (policy, *event_pp, path, true);
-     print_path_summary_as_text (summary, text_output, false);
-     ASSERT_STREQ
-       ("  events 1-3\n"
-        "FILENAME:3:7:\n"
-        "    3 |   if (p)\n"
-        "      |       ^\n"
-        "      |       |\n"
-        "      |       (1) following `false' branch (when `p' is NULL)... ->-+\n"
-        "      |                                                             |\n"
-        "      |                                                             |\n"
-        "      |+------------------------------------------------------------+\n"
-        "    4 ||    return 0;\n"
-        "    5 ||  return *p;\n"
-        "      ||         ~\n"
-        "      ||         |\n"
-        "      |+-------->(2) ...to here\n"
-        "      |          (3) dereference of NULL `p'\n",
-        pp_formatted_text (text_output.get_printer ()));
-   }
-   {
-     test_diagnostic_context dc;
-     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
-     dc.m_source_printing.show_line_numbers_p = true;
-     dc.m_source_printing.show_event_links_p = false;
-     diagnostic_text_output_format text_output (dc);
-     path_print_policy policy (text_output);
-     path_summary summary (policy, *event_pp, path, true);
-     print_path_summary_as_text (summary, text_output, false);
-     ASSERT_STREQ
-       ("  events 1-3\n"
-        "FILENAME:3:7:\n"
-        "    3 |   if (p)\n"
-        "      |       ^\n"
-        "      |       |\n"
-        "      |       (1) following `false' branch (when `p' is NULL)...\n"
-        "    4 |     return 0;\n"
-        "    5 |   return *p;\n"
-        "      |          ~\n"
-        "      |          |\n"
-        "      |          (2) ...to here\n"
-        "      |          (3) dereference of NULL `p'\n",
-        pp_formatted_text (text_output.get_printer ()));
-   }
-   {
-     test_diagnostic_context dc;
-     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE);
-     dc.m_source_printing.show_event_links_p = true;
-     diagnostic_text_output_format text_output (dc);
-     path_print_policy policy (text_output);
-     path_summary summary (policy, *event_pp, path, true);
-     print_path_summary_as_text (summary, text_output, false);
-     ASSERT_STREQ
-       ("  events 1-3\n"
-        "FILENAME:3:7:\n"
-        "   if (p)\n"
-        "       ^\n"
-        "       |\n"
-        "       (1) following `false' branch (when `p' is NULL)... ─>─┐\n"
-        "                                                             │\n"
-        "FILENAME:5:10:\n"
-        "                                                             │\n"
-        "┌────────────────────────────────────────────────────────────┘\n"
-        "│  return *p;\n"
-        "│         ~\n"
-        "│         |\n"
-        "└────────>(2) ...to here\n"
-        "          (3) dereference of NULL `p'\n",
-        pp_formatted_text (text_output.get_printer ()));
-   }
-   {
-     test_diagnostic_context dc;
-     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE);
-     dc.m_source_printing.show_event_links_p = true;
-     dc.m_source_printing.show_line_numbers_p = true;
-     diagnostic_text_output_format text_output (dc);
-     path_print_policy policy (text_output);
-     path_summary summary (policy, *event_pp, path, true);
-     print_path_summary_as_text (summary, text_output, false);
-     ASSERT_STREQ
-       ("  events 1-3\n"
-        "FILENAME:3:7:\n"
-        "    3 |   if (p)\n"
-        "      |       ^\n"
-        "      |       |\n"
-        "      |       (1) following `false' branch (when `p' is NULL)... ─>─┐\n"
-        "      |                                                             │\n"
-        "      |                                                             │\n"
-        "      |┌────────────────────────────────────────────────────────────┘\n"
-        "    4 |│    return 0;\n"
-        "    5 |│  return *p;\n"
-        "      |│         ~\n"
-        "      |│         |\n"
-        "      |└────────>(2) ...to here\n"
-        "      |          (3) dereference of NULL `p'\n",
-        pp_formatted_text (text_output.get_printer ()));
-   }
- }
- 
- /* Complex example involving a backedge.  */
- 
- static void
- test_control_flow_2 (const line_table_case &case_,
- 		     pretty_printer *event_pp)
- {
-   /* Create a tempfile and write some text to it.
-      ...000000000111111111122222222223333333333.
-      ...123456789012345678901234567890123456789.  */
-   const char *content
-     = ("int for_loop_noop_next (struct node *n)\n" /* <--------- line 1.  */
-        "{\n" /* <----------------------------------------------- line 2.  */
-        "  int sum = 0;\n" /* <---------------------------------- line 3.  */
-        "  for (struct node *iter = n; iter; iter->next)\n" /* <- line 4.  */
-        "    sum += n->val;\n" /* <------------------------------ line 5.  */
-        "  return sum;\n" /* <----------------------------------- line 6.  */
-        "}\n");  /* <-------------------------------------------- line 7.  */
-   /* Adapted from infinite-loop-linked-list.c where
-      "iter->next" should be "iter = iter->next".  */
- 
-   control_flow_test t (SELFTEST_LOCATION, case_, content);
- 
-   const location_t iter_test = t.get_line_and_columns (4, 31, 34);
-   const location_t loop_body_start = t.get_line_and_columns (5, 12, 17);
-   const location_t loop_body_end = t.get_line_and_columns (5, 5, 9, 17);
- 
-   test_diagnostic_path path (event_pp);
-   path.add_event (iter_test, nullptr, 0, "infinite loop here");
- 
-   path.add_event (iter_test, nullptr, 0, "looping from here...");
-   path.connect_to_next_event ();
- 
-   path.add_event (loop_body_start, nullptr, 0, "...to here");
- 
-   path.add_event (loop_body_end, nullptr, 0, "looping back...");
-   path.connect_to_next_event ();
- 
-   path.add_event (iter_test, nullptr, 0, "...to here");
- 
-   if (!path_events_have_column_data_p (path))
-     return;
- 
-   {
-     test_diagnostic_context dc;
-     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
-     dc.m_source_printing.show_event_links_p = true;
-     dc.m_source_printing.show_line_numbers_p = true;
-     diagnostic_text_output_format text_output (dc);
-     path_print_policy policy (text_output);
-     path_summary summary (policy, *event_pp, path, true);
-     print_path_summary_as_text (summary, text_output, false);
-     ASSERT_STREQ
-       ("  events 1-3\n"
-        "FILENAME:4:31:\n"
-        "    4 |   for (struct node *iter = n; iter; iter->next)\n"
-        "      |                               ^~~~\n"
-        "      |                               |\n"
-        "      |                               (1) infinite loop here\n"
-        "      |                               (2) looping from here... ->-+\n"
-        "      |                                                           |\n"
-        "      |                                                           |\n"
-        "      |+----------------------------------------------------------+\n"
-        "    5 ||    sum += n->val;\n"
-        "      ||           ~~~~~~              \n"
-        "      ||           |\n"
-        "      |+---------->(3) ...to here\n"
-        /* We need to start an new event_range here as event (4) is to the
- 	  left of event (3), and thus (4) would mess up the in-edge to (3).  */
-        "  event 4\n"
-        "    5 |     sum += n->val;\n"
-        "      |     ~~~~^~~~~~~~~\n"
-        "      |         |\n"
-        "      |         (4) looping back... ->-+\n"
-        "      |                                |\n"
-        /* We need to start an new event_range here as event (4) with an
- 	  out-edge is on a later line (line 5) than its destination event (5),
- 	  on line 4.  */
-        "  event 5\n"
-        "      |                                |\n"
-        "      |+-------------------------------+\n"
-        "    4 ||  for (struct node *iter = n; iter; iter->next)\n"
-        "      ||                              ^~~~\n"
-        "      ||                              |\n"
-        "      |+----------------------------->(5) ...to here\n",
-        pp_formatted_text (text_output.get_printer ()));
-   }
- }
- 
- /* Complex example involving a backedge and both an in-edge and out-edge
-    on the same line.  */
- 
- static void
- test_control_flow_3 (const line_table_case &case_,
- 		     pretty_printer *event_pp)
- {
-   /* Create a tempfile and write some text to it.
-      ...000000000111111111122222222223333333333.
-      ...123456789012345678901234567890123456789.  */
-   const char *content
-     = ("void test_missing_comparison_in_for_condition_1 (int n)\n"
-        "{\n" /* <------------------------- line 2.  */
-        "  for (int i = 0; n; i++)\n" /* <- line 3.  */
-        "    {\n" /* <--------------------- line 4.  */
-        "    }\n" /* <--------------------- line 5.  */
-        "}\n"); /* <----------------------- line 6.  */
-   /* Adapted from infinite-loop-1.c where the condition should have been
-      "i < n", rather than just "n".  */
- 
-   control_flow_test t (SELFTEST_LOCATION, case_, content);
- 
-   const location_t iter_test = t.get_line_and_column (3, 19);
-   const location_t iter_next = t.get_line_and_columns (3, 22, 24);
- 
-   test_diagnostic_path path (event_pp);
-   path.add_event (iter_test, nullptr, 0, "infinite loop here");
- 
-   path.add_event (iter_test, nullptr, 0, "looping from here...");
-   path.connect_to_next_event ();
- 
-   path.add_event (iter_next, nullptr, 0, "...to here");
- 
-   path.add_event (iter_next, nullptr, 0, "looping back...");
-   path.connect_to_next_event ();
- 
-   path.add_event (iter_test, nullptr, 0, "...to here");
- 
-   if (!path_events_have_column_data_p (path))
-     return;
- 
-   {
-     test_diagnostic_context dc;
-     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
-     dc.m_source_printing.show_event_links_p = true;
-     dc.m_source_printing.show_line_numbers_p = true;
-     diagnostic_text_output_format text_output (dc);
-     path_print_policy policy (text_output);
-     path_summary summary (policy, *event_pp, path, true);
-     print_path_summary_as_text (summary, text_output, false);
-     ASSERT_STREQ
-       ("  events 1-2\n"
-        "FILENAME:3:19:\n"
-        "    3 |   for (int i = 0; n; i++)\n"
-        "      |                   ^\n"
-        "      |                   |\n"
-        "      |                   (1) infinite loop here\n"
-        "      |                   (2) looping from here... ->-+\n"
-        "      |                                               |\n"
-        "  events 3-4\n"
-        "      |                                               |\n"
-        "      |+----------------------------------------------+\n"
-        "    3 ||  for (int i = 0; n; i++)\n"
-        "      ||                     ^~~\n"
-        "      ||                     |\n"
-        "      |+-------------------->(3) ...to here\n"
-        "      |                      (4) looping back... ->-+\n"
-        "      |                                             |\n"
-        /* We need to start an new event_range here as event (4) with an
- 	  out-edge is on the same line as its destination event (5), but
- 	  to the right, which we can't handle as a single event_range. */
-        "  event 5\n"
-        "      |                                             |\n"
-        "      |+--------------------------------------------+\n"
-        "    3 ||  for (int i = 0; n; i++)\n"
-        "      ||                  ^\n"
-        "      ||                  |\n"
-        "      |+----------------->(5) ...to here\n",
-        pp_formatted_text (text_output.get_printer ()));
-   }
- }
- 
- /* Implementation of ASSERT_CFG_EDGE_PATH_STREQ.  */
- 
- static void
- assert_cfg_edge_path_streq (const location &loc,
- 			    pretty_printer *event_pp,
- 			    const location_t src_loc,
- 			    const location_t dst_loc,
- 			    const char *expected_str)
- {
-   test_diagnostic_path path (event_pp);
-   path.add_event (src_loc, nullptr, 0, "from here...");
-   path.connect_to_next_event ();
- 
-   path.add_event (dst_loc, nullptr, 0, "...to here");
- 
-   if (!path_events_have_column_data_p (path))
-     return;
- 
-   test_diagnostic_context dc;
-   dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
-   dc.m_source_printing.show_event_links_p = true;
-   dc.m_source_printing.show_line_numbers_p = true;
-   diagnostic_text_output_format text_output (dc);
-   path_print_policy policy (text_output);
-   path_summary summary (policy, *event_pp, path, true);
-   print_path_summary_as_text (summary, text_output, false);
-   ASSERT_STREQ_AT (loc, expected_str,
- 		   pp_formatted_text (text_output.get_printer ()));
- }
- 
- /* Assert that if we make a path with an event with "from here..." at SRC_LOC
-    leading to an event "...to here" at DST_LOC that we print the path
-    as EXPECTED_STR.  */
- 
- #define ASSERT_CFG_EDGE_PATH_STREQ(SRC_LOC, DST_LOC, EXPECTED_STR) \
-   assert_cfg_edge_path_streq ((SELFTEST_LOCATION), (event_pp),	   \
- 			      (SRC_LOC), (DST_LOC), (EXPECTED_STR))
- 
- /* Various examples of edge, trying to cover all combinations of:
-    - relative x positive of src label and dst label
-    - relative y position of labels:
-      - on same line
-      - on next line
-      - on line after next
-      - big gap, where src is before dst
-      - big gap, where src is after dst
-    and other awkward cases.  */
- 
- static void
- test_control_flow_4 (const line_table_case &case_,
- 		     pretty_printer *event_pp)
- {
-   std::string many_lines;
-   for (int i = 1; i <= 100; i++)
-     /* ............000000000111
-        ............123456789012.  */
-     many_lines += "LHS      RHS\n";
-   control_flow_test t (SELFTEST_LOCATION, case_, many_lines.c_str ());
- 
-   /* Same line.  */
-   {
-     /* LHS -> RHS.  */
-     ASSERT_CFG_EDGE_PATH_STREQ
-       (t.get_line_and_columns (3, 1, 3),
-        t.get_line_and_columns (3, 10, 12),
-        ("  event 1\n"
- 	"FILENAME:3:1:\n"
- 	"    3 | LHS      RHS\n"
- 	"      | ^~~\n"
- 	"      | |\n"
- 	"      | (1) from here... ->-+\n"
- 	"      |                     |\n"
- 	"  event 2\n"
- 	"      |                     |\n"
- 	"      |+--------------------+\n"
- 	"    3 ||LHS      RHS\n"
- 	"      ||         ^~~\n"
- 	"      ||         |\n"
- 	"      |+-------->(2) ...to here\n"));
- 
-     /*  RHS -> LHS.  */
-     ASSERT_CFG_EDGE_PATH_STREQ
-       (t.get_line_and_columns (3, 10, 12),
-        t.get_line_and_columns (3, 1, 3),
-        ("  event 1\n"
- 	"FILENAME:3:10:\n"
- 	"    3 | LHS      RHS\n"
- 	"      |          ^~~\n"
- 	"      |          |\n"
- 	"      |          (1) from here... ->-+\n"
- 	"      |                              |\n"
- 	"  event 2\n"
- 	"      |                              |\n"
- 	"      |+-----------------------------+\n"
- 	"    3 ||LHS      RHS\n"
- 	"      ||^~~\n"
- 	"      |||\n"
- 	"      |+(2) ...to here\n"));
-   }
- 
-   /* Next line.  */
-   {
-     /* LHS -> RHS.  */
-     ASSERT_CFG_EDGE_PATH_STREQ
-       (t.get_line_and_columns (3, 1, 3),
-        t.get_line_and_columns (4, 5, 7),
-        ("  events 1-2\n"
- 	"FILENAME:3:1:\n"
- 	"    3 | LHS      RHS\n"
- 	"      | ^~~\n"
- 	"      | |\n"
- 	"      | (1) from here... ->-+\n"
- 	"      |                     |\n"
- 	"      |                     |\n"
- 	"      |+--------------------+\n"
- 	"    4 ||LHS      RHS\n"
- 	"      ||    ~~~\n"
- 	"      ||    |\n"
- 	"      |+--->(2) ...to here\n"));
- 
-     /*  RHS -> LHS.  */
-     ASSERT_CFG_EDGE_PATH_STREQ
-       (t.get_line_and_columns (3, 10, 12),
-        t.get_line_and_columns (4, 1, 3),
-        ("  events 1-2\n"
- 	"FILENAME:3:10:\n"
- 	"    3 | LHS      RHS\n"
- 	"      |          ^~~\n"
- 	"      |          |\n"
- 	"      |          (1) from here... ->-+\n"
- 	"      |                              |\n"
- 	"      |                              |\n"
- 	"      |+-----------------------------+\n"
- 	"    4 ||LHS      RHS\n"
- 	"      ||~~~       \n"
- 	"      |||\n"
- 	"      |+(2) ...to here\n"));
-   }
- 
-   /* Line after next.  */
-   {
-     /* LHS -> RHS.  */
-     ASSERT_CFG_EDGE_PATH_STREQ
-       (t.get_line_and_columns (3, 1, 3),
-        t.get_line_and_columns (5, 10, 12),
-        ("  events 1-2\n"
- 	"FILENAME:3:1:\n"
- 	"    3 | LHS      RHS\n"
- 	"      | ^~~\n"
- 	"      | |\n"
- 	"      | (1) from here... ->-+\n"
- 	"      |                     |\n"
- 	"      |                     |\n"
- 	"      |+--------------------+\n"
- 	"    4 ||LHS      RHS\n"
- 	"    5 ||LHS      RHS\n"
- 	"      ||         ~~~\n"
- 	"      ||         |\n"
- 	"      |+-------->(2) ...to here\n"));
- 
-     /*  RHS -> LHS.  */
-     ASSERT_CFG_EDGE_PATH_STREQ
-       (t.get_line_and_columns (3, 10, 12),
-        t.get_line_and_columns (5, 1, 3),
-        ("  events 1-2\n"
- 	"FILENAME:3:10:\n"
- 	"    3 | LHS      RHS\n"
- 	"      |          ^~~\n"
- 	"      |          |\n"
- 	"      |          (1) from here... ->-+\n"
- 	"      |                              |\n"
- 	"      |                              |\n"
- 	"      |+-----------------------------+\n"
- 	"    4 ||LHS      RHS\n"
- 	"    5 ||LHS      RHS\n"
- 	"      ||~~~       \n"
- 	"      |||\n"
- 	"      |+(2) ...to here\n"));
-   }
- 
-   /* Big gap, increasing line number.  */
-   {
-     /* LHS -> RHS.  */
-     ASSERT_CFG_EDGE_PATH_STREQ
-       (t.get_line_and_columns (3, 1, 3),
-        t.get_line_and_columns (97, 10, 12),
-        ("  events 1-2\n"
- 	"FILENAME:3:1:\n"
- 	"    3 | LHS      RHS\n"
- 	"      | ^~~\n"
- 	"      | |\n"
- 	"      | (1) from here... ->-+\n"
- 	"      |                     |\n"
- 	"......\n"
- 	"      |                     |\n"
- 	"      |+--------------------+\n"
- 	"   97 ||LHS      RHS\n"
- 	"      ||         ~~~\n"
- 	"      ||         |\n"
- 	"      |+-------->(2) ...to here\n"));
- 
-     /*  RHS -> LHS.  */
-     ASSERT_CFG_EDGE_PATH_STREQ
-       (t.get_line_and_columns (3, 10, 12),
-        t.get_line_and_columns (97, 1, 3),
-        ("  events 1-2\n"
- 	"FILENAME:3:10:\n"
- 	"    3 | LHS      RHS\n"
- 	"      |          ^~~\n"
- 	"      |          |\n"
- 	"      |          (1) from here... ->-+\n"
- 	"      |                              |\n"
- 	"......\n"
- 	"      |                              |\n"
- 	"      |+-----------------------------+\n"
- 	"   97 ||LHS      RHS\n"
- 	"      ||~~~       \n"
- 	"      |||\n"
- 	"      |+(2) ...to here\n"));
-   }
- 
-   /* Big gap, decreasing line number.  */
-   {
-     /* LHS -> RHS.  */
-     ASSERT_CFG_EDGE_PATH_STREQ
-       (t.get_line_and_columns (97, 1, 3),
-        t.get_line_and_columns (3, 10, 12),
-        ("  event 1\n"
- 	"FILENAME:97:1:\n"
- 	"   97 | LHS      RHS\n"
- 	"      | ^~~\n"
- 	"      | |\n"
- 	"      | (1) from here... ->-+\n"
- 	"      |                     |\n"
- 	"  event 2\n"
- 	"      |                     |\n"
- 	"      |+--------------------+\n"
- 	"    3 ||LHS      RHS\n"
- 	"      ||         ^~~\n"
- 	"      ||         |\n"
- 	"      |+-------->(2) ...to here\n"));
- 
-     /*  RHS -> LHS.  */
-     ASSERT_CFG_EDGE_PATH_STREQ
-       (t.get_line_and_columns (97, 10, 12),
-        t.get_line_and_columns (3, 1, 3),
-        ("  event 1\n"
- 	"FILENAME:97:10:\n"
- 	"   97 | LHS      RHS\n"
- 	"      |          ^~~\n"
- 	"      |          |\n"
- 	"      |          (1) from here... ->-+\n"
- 	"      |                              |\n"
- 	"  event 2\n"
- 	"      |                              |\n"
- 	"      |+-----------------------------+\n"
- 	"    3 ||LHS      RHS\n"
- 	"      ||^~~\n"
- 	"      |||\n"
- 	"      |+(2) ...to here\n"));
-   }
- 
-   /* Unknown src.  */
-   {
-     ASSERT_CFG_EDGE_PATH_STREQ
-       (UNKNOWN_LOCATION,
-        t.get_line_and_columns (3, 10, 12),
-        ("  event 1\n"
- 	" (1): from here...\n"
- 	"  event 2\n"
- 	"FILENAME:3:10:\n"
- 	"    3 | LHS      RHS\n"
- 	"      |          ^~~\n"
- 	"      |          |\n"
- 	"      |+-------->(2) ...to here\n"));
-   }
- 
-   /* Unknown dst.  */
-   {
-     ASSERT_CFG_EDGE_PATH_STREQ
-       (t.get_line_and_columns (3, 1, 3),
-        UNKNOWN_LOCATION,
-        ("  event 1\n"
- 	"FILENAME:3:1:\n"
- 	"    3 | LHS      RHS\n"
- 	"      | ^~~\n"
- 	"      | |\n"
- 	"      | (1) from here... ->-+\n"
- 	"      |                     |\n"
- 	"  event 2\n"
- 	"FILENAME:\n"
- 	" (2): ...to here\n"));
-   }
- }
- 
- /* Another complex example, adapted from data-model-20.c.  */
- 
- static void
- test_control_flow_5 (const line_table_case &case_,
- 		     pretty_printer *event_pp)
- {
-   /* Create a tempfile and write some text to it.
-      ...000000000111111111122222222223333333333444444444455555555556666666666.
-      ...123456789012345678901234567890123456789012345678901234567890123456789.  */
-   const char *content
-     = ("  if ((arr = (struct foo **)malloc(n * sizeof(struct foo *))) == NULL)\n"
-        "    return NULL;\n" /* <------------------------- line 2.  */
-        "\n" /* <----------------------------------------- line 3.  */
-        "  for (i = 0; i < n; i++) {\n" /* <-------------- line 4.  */
-        "    if ((arr[i] = (struct foo *)malloc(sizeof(struct foo))) == NULL) {\n");
- 
-   control_flow_test t (SELFTEST_LOCATION, case_, content);
- 
-   test_diagnostic_path path (event_pp);
-   /* (1) */
-   path.add_event (t.get_line_and_column (1, 6), nullptr, 0,
- 		  "following %qs branch (when %qs is non-NULL)...",
- 		  "false", "arr");
-   path.connect_to_next_event ();
- 
-   /* (2) */
-   path.add_event (t.get_line_and_columns (4, 8, 10, 12), nullptr, 0,
- 		  "...to here");
- 
-   /* (3) */
-   path.add_event (t.get_line_and_columns (4, 15, 17, 19), nullptr, 0,
- 		  "following %qs branch (when %qs)...",
- 		  "true", "i < n");
-   path.connect_to_next_event ();
- 
-   /* (4) */
-   path.add_event (t.get_line_and_column (5, 13), nullptr, 0,
- 		  "...to here");
- 
-   /* (5) */
-   path.add_event (t.get_line_and_columns (5, 33, 58), nullptr, 0,
- 		  "allocated here");
- 
-   if (!path_events_have_column_data_p (path))
-     return;
- 
-   {
-     test_diagnostic_context dc;
-     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
-     dc.m_source_printing.show_event_links_p = true;
-     dc.m_source_printing.show_line_numbers_p = true;
-     diagnostic_text_output_format text_output (dc);
-     path_print_policy policy (text_output);
-     path_summary summary (policy, *event_pp, path, true);
-     print_path_summary_as_text (summary, text_output, false);
-     ASSERT_STREQ
-       ("  events 1-5\n"
-        "FILENAME:1:6:\n"
-        "    1 |   if ((arr = (struct foo **)malloc(n * sizeof(struct foo *))) == NULL)\n"
-        "      |      ^\n"
-        "      |      |\n"
-        "      |      (1) following `false' branch (when `arr' is non-NULL)... ->-+\n"
-        "      |                                                                  |\n"
-        "......\n"
-        "      |                                                                  |\n"
-        "      |+-----------------------------------------------------------------+\n"
-        "    4 ||  for (i = 0; i < n; i++) {\n"
-        "      ||       ~~~~~  ~~~~~\n"
-        "      ||         |      |\n"
-        "      ||         |      (3) following `true' branch (when `i < n')... ->-+\n"
-        "      |+-------->(2) ...to here                                          |\n"
-        "      |                                                                  |\n"
-        "      |                                                                  |\n"
-        "      |+-----------------------------------------------------------------+\n"
-        "    5 ||    if ((arr[i] = (struct foo *)malloc(sizeof(struct foo))) == NULL) {\n"
-        "      ||            ~                   ~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
-        "      ||            |                   |\n"
-        "      |+----------->(4) ...to here      (5) allocated here\n",
-        pp_formatted_text (text_output.get_printer ()));
-   }
- }
- 
- /* Another complex example, adapted from loop-3.c.  */
- 
- static void
- test_control_flow_6 (const line_table_case &case_,
- 		     pretty_printer *event_pp)
- {
-   /* Create a tempfile and write some text to it.
-      ...000000000111111111122222222223333333.
-      ...123456789012345678901234567890123456.  */
-   const char *content
-     = ("#include <stdlib.h>\n" /* <------------------ line 1.  */
-        "\n" /* <------------------------------------- line 2.  */
-        "void test(int c)\n" /* <--------------------- line 3.  */
-        "{\n" /* <------------------------------------ line 4.  */
-        "  int i;\n" /* <----------------------------- line 5.  */
-        "  char *buffer = (char*)malloc(256);\n" /* <- line 6.  */
-        "\n" /* <------------------------------------- line 7.  */
-        "  for (i=0; i<255; i++) {\n" /* <------------ line 8.  */
-        "    buffer[i] = c;\n" /* <------------------- line 9.  */
-        "\n" /* <------------------------------------- line 10.  */
-        "    free(buffer);\n" /* <-------------------- line 11.  */
-        "  }\n"); /* <-------------------------------- line 12.  */
- 
-   control_flow_test t (SELFTEST_LOCATION, case_, content);
- 
-   test_diagnostic_path path (event_pp);
-   /* (1) */
-   path.add_event (t.get_line_and_columns (6, 25, 35), nullptr, 0,
- 		  "allocated here");
- 
-   /* (2) */
-   path.add_event (t.get_line_and_columns (8, 13, 14, 17), nullptr, 0,
- 		  "following %qs branch (when %qs)...",
- 		  "true", "i <= 254");
-   path.connect_to_next_event ();
- 
-   /* (3) */
-   path.add_event (t.get_line_and_columns (9, 5, 15, 17), nullptr, 0,
- 		  "...to here");
- 
-   /* (4) */
-   path.add_event (t.get_line_and_columns (8, 13, 14, 17), nullptr, 0,
- 		  "following %qs branch (when %qs)...",
- 		  "true", "i <= 254");
-   path.connect_to_next_event ();
- 
-   /* (5) */
-   path.add_event (t.get_line_and_columns (9, 5, 15, 17), nullptr, 0,
- 		  "...to here");
- 
-   if (!path_events_have_column_data_p (path))
-     return;
- 
-   {
-     test_diagnostic_context dc;
-     dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII);
-     dc.m_source_printing.show_event_links_p = true;
-     dc.m_source_printing.show_line_numbers_p = true;
-     diagnostic_text_output_format text_output (dc);
-     path_print_policy policy (text_output);
-     path_summary summary (policy, *event_pp, path, true);
-     print_path_summary_as_text (summary, text_output, false);
-     ASSERT_STREQ
-       ("  events 1-3\n"
-        "FILENAME:6:25:\n"
-        "    6 |   char *buffer = (char*)malloc(256);\n"
-        "      |                         ^~~~~~~~~~~\n"
-        "      |                         |\n"
-        "      |                         (1) allocated here\n"
-        "    7 | \n"
-        "    8 |   for (i=0; i<255; i++) {\n"
-        "      |             ~~~~~        \n"
-        "      |              |\n"
-        "      |              (2) following `true' branch (when `i <= 254')... ->-+\n"
-        "      |                                                                  |\n"
-        "      |                                                                  |\n"
-        "      |+-----------------------------------------------------------------+\n"
-        "    9 ||    buffer[i] = c;\n"
-        "      ||    ~~~~~~~~~~~~~        \n"
-        "      ||              |\n"
-        "      |+------------->(3) ...to here\n"
-        "  events 4-5\n"
-        "    8 |   for (i=0; i<255; i++) {\n"
-        "      |             ~^~~~\n"
-        "      |              |\n"
-        "      |              (4) following `true' branch (when `i <= 254')... ->-+\n"
-        "      |                                                                  |\n"
-        "      |                                                                  |\n"
-        "      |+-----------------------------------------------------------------+\n"
-        "    9 ||    buffer[i] = c;\n"
-        "      ||    ~~~~~~~~~~~~~\n"
-        "      ||              |\n"
-        "      |+------------->(5) ...to here\n",
-        pp_formatted_text (text_output.get_printer ()));
-   }
- }
- 
- static void
- control_flow_tests (const line_table_case &case_)
- {
-   pretty_printer pp;
-   pp_show_color (&pp) = false;
- 
-   test_control_flow_1 (case_, &pp);
-   test_control_flow_2 (case_, &pp);
-   test_control_flow_3 (case_, &pp);
-   test_control_flow_4 (case_, &pp);
-   test_control_flow_5 (case_, &pp);
-   test_control_flow_6 (case_, &pp);
- }
- 
- /* Run all of the selftests within this file.  */
- 
- void
- diagnostic_path_cc_tests ()
- {
-   pretty_printer pp;
-   pp_show_color (&pp) = false;
- 
-   auto_fix_quotes fix_quotes;
-   test_empty_path (&pp);
-   test_intraprocedural_path (&pp);
-   test_interprocedural_path_1 (&pp);
-   test_interprocedural_path_2 (&pp);
-   test_recursion (&pp);
-   for_each_line_table_case (control_flow_tests);
- }
- 
- } // namespace selftest
- 
  #if __GNUC__ >= 10
  #  pragma GCC diagnostic pop
  #endif
- 
- #endif /* #if CHECKING_P */
--- 214,219 ----
diff -Nrcpad gcc-16-20250525/gcc/diagnostic-show-locus.cc gcc-16-20250601/gcc/diagnostic-show-locus.cc
*** gcc-16-20250525/gcc/diagnostic-show-locus.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/diagnostic-show-locus.cc	Sun Jun  1 22:32:14 2025
*************** along with GCC; see the file COPYING3.
*** 19,24 ****
--- 19,26 ----
  <http://www.gnu.org/licenses/>.  */
  
  #include "config.h"
+ #define INCLUDE_MAP
+ #define INCLUDE_STRING
  #define INCLUDE_VECTOR
  #include "system.h"
  #include "coretypes.h"
*************** along with GCC; see the file COPYING3.
*** 37,42 ****
--- 39,46 ----
  #include "text-art/types.h"
  #include "text-art/theme.h"
  #include "diagnostic-label-effects.h"
+ #include "xml.h"
+ #include "xml-printer.h"
  
  #ifdef HAVE_TERMIOS_H
  # include <termios.h>
*************** struct point_state
*** 70,76 ****
    bool draw_caret_p;
  };
  
! /* A class to inject colorization codes when printing the diagnostic locus.
  
     It has one kind of colorization for each of:
       - normal text
--- 74,81 ----
    bool draw_caret_p;
  };
  
! /* A class to inject colorization codes when printing the diagnostic locus
!    as text.
  
     It has one kind of colorization for each of:
       - normal text
*************** class colorizer
*** 143,148 ****
--- 148,154 ----
    const char *m_fixit_insert;
    const char *m_fixit_delete;
    const char *m_stop_color;
+   std::string m_current_named_color;
  };
  
  /* In order to handle multibyte sources properly, all of this logic needs to be
*************** struct char_display_policy : public cpp_
*** 369,385 ****
   public:
    char_display_policy (int tabstop,
  		       int (*width_cb) (cppchar_t c),
! 		       void (*print_cb) (pretty_printer *pp,
! 					 const cpp_decoded_char &cp))
    : cpp_char_column_policy (tabstop, width_cb),
!     m_print_cb (print_cb)
    {
    }
  
!   void (*m_print_cb) (pretty_printer *pp,
! 		      const cpp_decoded_char &cp);
  };
  
  /* A class to control the overall layout when printing a diagnostic.
  
     The layout is determined within the constructor.
--- 375,738 ----
   public:
    char_display_policy (int tabstop,
  		       int (*width_cb) (cppchar_t c),
! 		       void (*print_text_cb) (to_text &sink,
! 					      const cpp_decoded_char &cp),
! 		       void (*print_html_cb) (to_html &sink,
! 					      const cpp_decoded_char &cp))
    : cpp_char_column_policy (tabstop, width_cb),
!     m_print_text_cb (print_text_cb),
!     m_print_html_cb (print_html_cb)
    {
    }
  
!   void (*m_print_text_cb) (to_text &sink,
! 			   const cpp_decoded_char &cp);
!   void (*m_print_html_cb) (to_html &sink,
! 			   const cpp_decoded_char &cp);
  };
  
+ template <typename Sink> class layout_printer;
+ 
+ } // anonymous namespace
+ 
+ /* This code is written generically to write either:
+    - text, to a pretty_printer, potentially with colorization codes, or
+    - html, to an xml::printer, with nested HTML tags.
+ 
+    This is handled via a "Sink" template, which is either to_text
+    or to_html.  */
+ 
+ /* Writing text output.  */
+ 
+ struct to_text
+ {
+   friend class layout_printer<to_text>;
+ 
+   to_text (pretty_printer &pp,
+ 	   colorizer &colorizer)
+   : m_pp (pp),
+     m_colorizer (&colorizer)
+   {
+     m_saved_rule = pp_prefixing_rule (&m_pp);
+     pp_prefixing_rule (&m_pp) = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
+   }
+   to_text (pretty_printer &pp,
+ 	   colorizer *colorizer)
+   : m_pp (pp),
+     m_colorizer (colorizer)
+   {
+     m_saved_rule = pp_prefixing_rule (&m_pp);
+     pp_prefixing_rule (&m_pp) = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
+   }
+   ~to_text ()
+   {
+ 
+     pp_prefixing_rule (&m_pp) = m_saved_rule;
+   }
+ 
+   static bool is_text () { return true; }
+   static bool is_html () { return false; }
+ 
+   void emit_text_prefix ()
+   {
+     pp_emit_prefix (&m_pp);
+   }
+ 
+   void push_html_tag (std::string, bool)
+   {
+     // no-op for text
+   }
+   void push_html_tag_with_class (std::string, std::string, bool)
+   {
+     // no-op for text
+   }
+   void pop_html_tag (std::string)
+   {
+     // no-op for text
+   }
+ 
+   void add_html_tag_with_class (std::string, std::string, bool)
+   {
+     // no-op for text
+   }
+ 
+   void add_space ()
+   {
+     pp_space (&m_pp);
+   }
+ 
+   void add_character (cppchar_t ch)
+   {
+     pp_unicode_character (&m_pp, ch);
+   }
+ 
+   void add_utf8_byte (char b)
+   {
+     pp_character (&m_pp, b);
+   }
+ 
+   void add_text (const char *text)
+   {
+     pp_string (&m_pp, text);
+   }
+ 
+   void print_decoded_char (const char_display_policy &char_policy,
+ 			   cpp_decoded_char cp)
+   {
+     char_policy.m_print_text_cb (*this, cp);
+   }
+ 
+   void colorize_text_ensure_normal ()
+   {
+     gcc_assert (m_colorizer);
+     m_colorizer->set_normal_text ();
+   }
+ 
+   void colorize_text_for_range_idx (int range_idx)
+   {
+     gcc_assert (m_colorizer);
+     m_colorizer->set_range (range_idx);
+   }
+ 
+   void colorize_text_for_cfg_edge ()
+   {
+     gcc_assert (m_colorizer);
+     m_colorizer->set_cfg_edge ();
+   }
+ 
+   void colorize_text_for_fixit_insert ()
+   {
+     gcc_assert (m_colorizer);
+     m_colorizer->set_fixit_insert ();
+   }
+ 
+   void colorize_text_for_fixit_delete ()
+   {
+     gcc_assert (m_colorizer);
+     m_colorizer->set_fixit_delete ();
+   }
+ 
+   void
+   invoke_start_span_fn (const diagnostic_source_print_policy &source_policy,
+ 			const diagnostic_location_print_policy &loc_policy,
+ 			const expanded_location &exploc)
+   {
+     source_policy.get_text_start_span_fn () (loc_policy, *this, exploc);
+   }
+ 
+   // Text-specific functions
+   void add_newline ()
+   {
+     pp_newline (&m_pp);
+   }
+ 
+   pretty_printer &m_pp;
+ private:
+   colorizer *m_colorizer;
+   diagnostic_prefixing_rule_t m_saved_rule;
+ };
+ 
+ /* Writing HTML output.  */
+ 
+ struct to_html
+ {
+   friend class layout_printer<to_html>;
+ 
+   to_html (xml::printer &xp,
+ 	   const rich_location *richloc,
+ 	   html_label_writer *html_label_writer)
+   : m_xp (xp),
+     m_richloc (richloc),
+     m_html_label_writer (html_label_writer)
+   {}
+ 
+   static bool is_text () { return false; }
+   static bool is_html () { return true; }
+ 
+   void emit_text_prefix ()
+   {
+     // no-op for HTML
+   }
+ 
+   void push_html_tag (std::string name,
+ 		      bool preserve_whitespace)
+   {
+     m_xp.push_tag (std::move (name), preserve_whitespace);
+   }
+ 
+   void push_html_tag_with_class (std::string name,
+ 				 std::string class_,
+ 				 bool preserve_whitespace)
+   {
+     m_xp.push_tag_with_class (std::move (name),
+ 			      std::move (class_),
+ 			      preserve_whitespace);
+   }
+ 
+   void pop_html_tag (std::string /*name*/)
+   {
+     m_xp.pop_tag ();
+   }
+ 
+   void add_html_tag_with_class (std::string name,
+ 				std::string class_,
+ 				bool preserve_whitespace)
+   {
+     auto element = std::make_unique<xml::element> (std::move (name),
+ 						   preserve_whitespace);
+     element->set_attr ("class", std::move (class_));
+     m_xp.append (std::move (element));
+   }
+ 
+   void add_raw_html (const char *src)
+   {
+     m_xp.add_raw (src);
+   }
+ 
+   void add_space ()
+   {
+     m_xp.add_text (" ");
+   }
+ 
+   void add_character (cppchar_t ch)
+   {
+     pp_clear_output_area (&m_scratch_pp);
+     pp_unicode_character (&m_scratch_pp, ch);
+     m_xp.add_text (pp_formatted_text (&m_scratch_pp));
+   }
+ 
+   void add_utf8_byte (char b)
+   {
+     m_xp.add_text (std::string (1, b));
+   }
+ 
+   void add_text (const char *text)
+   {
+     m_xp.add_text (text);
+   }
+ 
+   void print_decoded_char (const char_display_policy &char_policy,
+ 			   cpp_decoded_char cp)
+   {
+     char_policy.m_print_html_cb (*this, cp);
+   }
+ 
+   void colorize_text_ensure_normal ()
+   {
+     // no-op for HTML
+   }
+ 
+   void colorize_text_for_cfg_edge ()
+   {
+     // no-op for HTML
+   }
+ 
+   void colorize_text_for_fixit_insert ()
+   {
+     // no-op for HTML
+   }
+ 
+   void colorize_text_for_fixit_delete ()
+   {
+     // no-op for HTML
+   }
+ 
+   void
+   invoke_start_span_fn (const diagnostic_source_print_policy &source_policy,
+ 			const diagnostic_location_print_policy &loc_policy,
+ 			const expanded_location &exploc)
+   {
+     source_policy.get_html_start_span_fn () (loc_policy, *this, exploc);
+   }
+ 
+   const location_range *
+   get_location_range_by_idx (int range_idx)
+   {
+     if (!m_richloc)
+       return nullptr;
+     return m_richloc->get_range (range_idx);
+   }
+ 
+   const char *
+   get_highlight_color_for_range_idx (int range_idx)
+   {
+     const location_range *const loc_range
+       = get_location_range_by_idx (range_idx);
+     if (!loc_range)
+       return nullptr;
+     return loc_range->m_highlight_color;
+   }
+ 
+   xml::printer &m_xp;
+   const rich_location *m_richloc;
+ private:
+   html_label_writer *m_html_label_writer;
+   pretty_printer m_scratch_pp;
+ };
+ 
+ void
+ diagnostic_location_print_policy::
+ print_text_span_start (const diagnostic_context &dc,
+ 		       pretty_printer &pp,
+ 		       const expanded_location &exploc)
+ {
+   to_text sink (pp, nullptr);
+   diagnostic_source_print_policy source_policy (dc);
+   source_policy.get_text_start_span_fn () (*this, sink, exploc);
+ }
+ 
+ void
+ diagnostic_location_print_policy::
+ print_html_span_start (const diagnostic_context &dc,
+ 		       xml::printer &xp,
+ 		       const expanded_location &exploc)
+ {
+   to_html sink (xp, nullptr, nullptr);
+   diagnostic_source_print_policy source_policy (dc);
+   source_policy.get_html_start_span_fn () (*this, sink, exploc);
+ }
+ 
+ pretty_printer *
+ get_printer (to_text &sink)
+ {
+   return &sink.m_pp;
+ }
+ 
+ template<>
+ void
+ default_diagnostic_start_span_fn<to_text> (const diagnostic_location_print_policy &loc_policy,
+ 					   to_text &sink,
+ 					   expanded_location exploc)
+ {
+   const diagnostic_column_policy &column_policy
+     = loc_policy.get_column_policy ();
+   label_text text
+     = column_policy.get_location_text (exploc,
+ 				       loc_policy.show_column_p (),
+ 				       pp_show_color (&sink.m_pp));
+   pp_string (&sink.m_pp, text.get ());
+   pp_newline (&sink.m_pp);
+ }
+ 
+ template<>
+ void
+ default_diagnostic_start_span_fn<to_html> (const diagnostic_location_print_policy &loc_policy,
+ 					   to_html &sink,
+ 					   expanded_location exploc)
+ {
+   const diagnostic_column_policy &column_policy
+     = loc_policy.get_column_policy ();
+   label_text text
+     = column_policy.get_location_text (exploc,
+ 				       loc_policy.show_column_p (),
+ 				       false);
+   sink.m_xp.push_tag_with_class ("span", "location", true);
+   sink.m_xp.add_text (text.get ());
+   sink.m_xp.pop_tag (); // span
+ }
+ 
+ namespace {
+ 
  /* A class to control the overall layout when printing a diagnostic.
  
     The layout is determined within the constructor.
*************** struct char_display_policy : public cpp_
*** 392,398 ****
  class layout
  {
   public:
!   friend class layout_printer;
  
    layout (const diagnostic_source_print_policy &source_policy,
  	  const rich_location &richloc,
--- 745,752 ----
  class layout
  {
   public:
!   friend class layout_printer<to_text>;
!   friend class layout_printer<to_html>;
  
    layout (const diagnostic_source_print_policy &source_policy,
  	  const rich_location &richloc,
*************** class layout
*** 458,473 ****
    bool m_escape_on_output;
  };
  
! /* A bundle of state for printing a particular layout
!    to a particular pretty_printer.  */
  
  class layout_printer
  {
  public:
!   layout_printer (pretty_printer &pp,
  		  const layout &layout,
! 		  const rich_location &richloc,
! 		  diagnostic_t diagnostic_kind);
  
    void print (const diagnostic_source_print_policy &source_policy);
  
--- 812,835 ----
    bool m_escape_on_output;
  };
  
! class line_label;
! 
! enum class margin_kind
! {
!   normal,
!   insertion,
!   ruler
! };
  
+ /* A bundle of state for printing a particular layout
+    to a particular Sink (either to_text or to_html).  */
+ template <typename Sink>
  class layout_printer
  {
  public:
!   layout_printer (Sink &sink,
  		  const layout &layout,
! 		  bool is_diagnostic_path);
  
    void print (const diagnostic_source_print_policy &source_policy);
  
*************** private:
*** 485,507 ****
    line_bounds print_source_line (linenum_type row, const char *line,
  				 int line_bytes);
    void print_leftmost_column ();
!   void start_annotation_line (char margin_char = ' ');
    void print_annotation_line (linenum_type row, const line_bounds lbounds);
    void print_any_labels (linenum_type row);
    void print_trailing_fixits (linenum_type row);
-   void print_newline ();
  
    void
    move_to_column (int *column, int dest_column, bool add_left_margin);
  
    void print_any_right_to_left_edge_lines ();
  
  private:
!   pretty_printer &m_pp;
    const layout &m_layout;
-   colorizer m_colorizer;
    bool m_is_diagnostic_path;
  
    /* Fields for handling links between labels (e.g. for showing CFG edges
       in execution paths).
       Note that the logic for printing such links makes various simplifying
--- 847,876 ----
    line_bounds print_source_line (linenum_type row, const char *line,
  				 int line_bytes);
    void print_leftmost_column ();
!   void start_annotation_line (enum margin_kind);
!   void end_line ();
    void print_annotation_line (linenum_type row, const line_bounds lbounds);
    void print_any_labels (linenum_type row);
+   void begin_label (int state_idx, bool is_label_text);
+   void end_label (int state_idx, bool is_label_text);
    void print_trailing_fixits (linenum_type row);
  
    void
    move_to_column (int *column, int dest_column, bool add_left_margin);
  
    void print_any_right_to_left_edge_lines ();
  
+   void set_in_range (int range_idx);
+   void set_outside_range ();
+ 
  private:
!   Sink &m_sink;
    const layout &m_layout;
    bool m_is_diagnostic_path;
  
+   bool m_was_in_range_p;
+   int m_last_range_idx;
+ 
    /* Fields for handling links between labels (e.g. for showing CFG edges
       in execution paths).
       Note that the logic for printing such links makes various simplifying
*************** colorizer::~colorizer ()
*** 586,594 ****
--- 955,967 ----
  void
  colorizer::set_named_color (const char *color)
  {
+   if (m_current_state == STATE_NAMED_COLOR
+       && color == m_current_named_color)
+     return;
    finish_state (m_current_state);
    m_current_state = STATE_NAMED_COLOR;
    pp_string (&m_pp, colorize_start (pp_show_color (&m_pp), color));
+   m_current_named_color = color;
  }
  
  /* Update state, printing color codes if necessary if there's a state
*************** fixit_cmp (const void *p_a, const void *
*** 1178,1185 ****
  /* Callback for char_display_policy::m_print_cb for printing source chars
     when not escaping the source.  */
  
  static void
! default_print_decoded_ch (pretty_printer *pp,
  			  const cpp_decoded_char &decoded_ch)
  {
    for (const char *ptr = decoded_ch.m_start_byte;
--- 1551,1559 ----
  /* Callback for char_display_policy::m_print_cb for printing source chars
     when not escaping the source.  */
  
+ template <class Sink>
  static void
! default_print_decoded_ch (Sink &sink,
  			  const cpp_decoded_char &decoded_ch)
  {
    for (const char *ptr = decoded_ch.m_start_byte;
*************** default_print_decoded_ch (pretty_printer
*** 1187,1197 ****
      {
        if (*ptr == '\0' || *ptr == '\r')
  	{
! 	  pp_space (pp);
  	  continue;
  	}
  
!       pp_character (pp, *ptr);
      }
  }
  
--- 1561,1571 ----
      {
        if (*ptr == '\0' || *ptr == '\r')
  	{
! 	  sink.add_space ();
  	  continue;
  	}
  
!       sink.add_utf8_byte (*ptr);
      }
  }
  
*************** escape_as_bytes_width (cppchar_t ch)
*** 1219,1226 ****
  /* Callback for char_display_policy::m_print_cb for printing source chars
     when escaping with DIAGNOSTICS_ESCAPE_FORMAT_BYTES.  */
  
  static void
! escape_as_bytes_print (pretty_printer *pp,
  		       const cpp_decoded_char &decoded_ch)
  {
    if (!decoded_ch.m_valid_ch)
--- 1593,1601 ----
  /* Callback for char_display_policy::m_print_cb for printing source chars
     when escaping with DIAGNOSTICS_ESCAPE_FORMAT_BYTES.  */
  
+ template <typename Sink>
  static void
! escape_as_bytes_print (Sink &sink,
  		       const cpp_decoded_char &decoded_ch)
  {
    if (!decoded_ch.m_valid_ch)
*************** escape_as_bytes_print (pretty_printer *p
*** 1230,1243 ****
  	{
  	  char buf[16];
  	  sprintf (buf, "<%02x>", (unsigned char)*iter);
! 	  pp_string (pp, buf);
  	}
        return;
      }
  
    cppchar_t ch = decoded_ch.m_ch;
    if (ch < 0x80 && ISPRINT (ch))
!     pp_character (pp, ch);
    else
      {
        for (const char *iter = decoded_ch.m_start_byte;
--- 1605,1618 ----
  	{
  	  char buf[16];
  	  sprintf (buf, "<%02x>", (unsigned char)*iter);
! 	  sink.add_text (buf);
  	}
        return;
      }
  
    cppchar_t ch = decoded_ch.m_ch;
    if (ch < 0x80 && ISPRINT (ch))
!     sink.add_character (ch);
    else
      {
        for (const char *iter = decoded_ch.m_start_byte;
*************** escape_as_bytes_print (pretty_printer *p
*** 1245,1251 ****
  	{
  	  char buf[16];
  	  sprintf (buf, "<%02x>", (unsigned char)*iter);
! 	  pp_string (pp, buf);
  	}
      }
  }
--- 1620,1626 ----
  	{
  	  char buf[16];
  	  sprintf (buf, "<%02x>", (unsigned char)*iter);
! 	  sink.add_text (buf);
  	}
      }
  }
*************** escape_as_unicode_width (cppchar_t ch)
*** 1275,1298 ****
  /* Callback for char_display_policy::m_print_cb for printing source chars
     when escaping with DIAGNOSTICS_ESCAPE_FORMAT_UNICODE.  */
  
  static void
! escape_as_unicode_print (pretty_printer *pp,
  			 const cpp_decoded_char &decoded_ch)
  {
    if (!decoded_ch.m_valid_ch)
      {
!       escape_as_bytes_print (pp, decoded_ch);
        return;
      }
  
    cppchar_t ch = decoded_ch.m_ch;
    if (ch < 0x80 && ISPRINT (ch))
!     pp_character (pp, ch);
    else
      {
        char buf[16];
        sprintf (buf, "<U+%04X>", ch);
!       pp_string (pp, buf);
      }
  }
  
--- 1650,1674 ----
  /* Callback for char_display_policy::m_print_cb for printing source chars
     when escaping with DIAGNOSTICS_ESCAPE_FORMAT_UNICODE.  */
  
+ template <typename Sink>
  static void
! escape_as_unicode_print (Sink &sink,
  			 const cpp_decoded_char &decoded_ch)
  {
    if (!decoded_ch.m_valid_ch)
      {
!       escape_as_bytes_print<Sink> (sink, decoded_ch);
        return;
      }
  
    cppchar_t ch = decoded_ch.m_ch;
    if (ch < 0x80 && ISPRINT (ch))
!     sink.add_character (ch);
    else
      {
        char buf[16];
        sprintf (buf, "<U+%04X>", ch);
!       sink.add_text (buf);
      }
  }
  
*************** make_char_policy (const diagnostic_sourc
*** 1306,1312 ****
    char_display_policy result
      (source_policy.get_column_policy ().get_tabstop (),
       cpp_wcwidth,
!      default_print_decoded_ch);
  
    /* If the diagnostic suggests escaping non-ASCII bytes, then
       use policy from user-supplied options.  */
--- 1682,1689 ----
    char_display_policy result
      (source_policy.get_column_policy ().get_tabstop (),
       cpp_wcwidth,
!      default_print_decoded_ch<to_text>,
!      default_print_decoded_ch<to_html>);
  
    /* If the diagnostic suggests escaping non-ASCII bytes, then
       use policy from user-supplied options.  */
*************** make_char_policy (const diagnostic_sourc
*** 1319,1329 ****
  	  gcc_unreachable ();
  	case DIAGNOSTICS_ESCAPE_FORMAT_UNICODE:
  	  result.m_width_cb = escape_as_unicode_width;
! 	  result.m_print_cb = escape_as_unicode_print;
  	  break;
  	case DIAGNOSTICS_ESCAPE_FORMAT_BYTES:
  	  result.m_width_cb = escape_as_bytes_width;
! 	  result.m_print_cb = escape_as_bytes_print;
  	  break;
  	}
      }
--- 1696,1708 ----
  	  gcc_unreachable ();
  	case DIAGNOSTICS_ESCAPE_FORMAT_UNICODE:
  	  result.m_width_cb = escape_as_unicode_width;
! 	  result.m_print_text_cb = escape_as_unicode_print<to_text>;
! 	  result.m_print_html_cb = escape_as_unicode_print<to_html>;
  	  break;
  	case DIAGNOSTICS_ESCAPE_FORMAT_BYTES:
  	  result.m_width_cb = escape_as_bytes_width;
! 	  result.m_print_text_cb = escape_as_bytes_print<to_text>;
! 	  result.m_print_html_cb = escape_as_bytes_print<to_html>;
  	  break;
  	}
      }
*************** layout::will_show_line_p (linenum_type r
*** 1530,1546 ****
  /* Print a line showing a gap in the line numbers, for showing the boundary
     between two line spans.  */
  
  void
! layout_printer::print_gap_in_line_numbering ()
  {
    gcc_assert (m_layout.m_options.show_line_numbers_p);
  
!   pp_emit_prefix (&m_pp);
  
    for (int i = 0; i < m_layout.get_linenum_width () + 1; i++)
!     pp_character (&m_pp, '.');
  
!   pp_newline (&m_pp);
  }
  
  /* Return true iff we should print a heading when starting the
--- 1909,1940 ----
  /* Print a line showing a gap in the line numbers, for showing the boundary
     between two line spans.  */
  
+ template<>
  void
! layout_printer<to_text>::print_gap_in_line_numbering ()
  {
    gcc_assert (m_layout.m_options.show_line_numbers_p);
  
!   m_sink.emit_text_prefix ();
  
    for (int i = 0; i < m_layout.get_linenum_width () + 1; i++)
!     m_sink.add_character ('.');
  
!   m_sink.add_newline ();
! }
! 
! template<>
! void
! layout_printer<to_html>::print_gap_in_line_numbering ()
! {
!   gcc_assert (m_layout.m_options.show_line_numbers_p);
! 
!   m_sink.add_raw_html
!     ("<tbody class=\"line-span-jump\">\n"
!      "<tr class=\"line-span-jump-row\">"
!      "<td class=\"linenum-gap\">[...]</td>"
!      "<td class=\"source-gap\"/></tr>\n"
!      "</tbody>\n");
  }
  
  /* Return true iff we should print a heading when starting the
*************** layout::calculate_x_offset_display ()
*** 1854,1874 ****
     colorization and tab expansion, this function tracks the line position in
     both byte and display column units.  */
  
  line_bounds
! layout_printer::print_source_line (linenum_type row, const char *line, int line_bytes)
  {
!   m_colorizer.set_normal_text ();
! 
!   pp_emit_prefix (&m_pp);
    if (m_layout.m_options.show_line_numbers_p)
      {
        int width = num_digits (row);
        for (int i = 0; i < m_layout.get_linenum_width () - width; i++)
! 	pp_space (&m_pp);
!       pp_printf (&m_pp, "%i |", row);
      }
  
    print_leftmost_column ();
  
    /* We will stop printing the source line at any trailing whitespace.  */
    line_bytes = get_line_bytes_without_trailing_whitespace (line,
--- 2248,2279 ----
     colorization and tab expansion, this function tracks the line position in
     both byte and display column units.  */
  
+ template<typename Sink>
  line_bounds
! layout_printer<Sink>::print_source_line (linenum_type row,
! 					 const char *line,
! 					 int line_bytes)
  {
!   m_sink.colorize_text_ensure_normal ();
!   m_sink.push_html_tag ("tr", true);
!   m_sink.emit_text_prefix ();
    if (m_layout.m_options.show_line_numbers_p)
      {
+       m_sink.push_html_tag_with_class ("td", "linenum", true);
        int width = num_digits (row);
        for (int i = 0; i < m_layout.get_linenum_width () - width; i++)
! 	m_sink.add_space ();
!       char buf[20];
!       sprintf (buf, "%i", row);
!       m_sink.add_text (buf);
!       if (Sink::is_text ())
! 	m_sink.add_text (" |");
!       m_sink.pop_html_tag ("td");
      }
  
+   m_sink.push_html_tag_with_class ("td", "left-margin", true);
    print_leftmost_column ();
+   m_sink.pop_html_tag ("td");
  
    /* We will stop printing the source line at any trailing whitespace.  */
    line_bytes = get_line_bytes_without_trailing_whitespace (line,
*************** layout_printer::print_source_line (linen
*** 1879,1884 ****
--- 2284,2291 ----
       tab expansion, and for implementing m_x_offset_display.  */
    cpp_display_width_computation dw (line, line_bytes, m_layout.m_char_policy);
  
+   m_sink.push_html_tag_with_class ("td", "source", true);
+ 
    /* Skip the first m_x_offset_display display columns.  In case the leading
       portion that will be skipped ends with a character with wcwidth > 1, then
       it is possible we skipped too much, so account for that by padding with
*************** layout_printer::print_source_line (linen
*** 1889,1895 ****
    for (int skipped_display_cols
  	 = dw.advance_display_cols (m_layout.m_x_offset_display);
         skipped_display_cols > m_layout.m_x_offset_display; --skipped_display_cols)
!     pp_space (&m_pp);
  
    /* Print the line and compute the line_bounds.  */
    line_bounds lbounds;
--- 2296,2302 ----
    for (int skipped_display_cols
  	 = dw.advance_display_cols (m_layout.m_x_offset_display);
         skipped_display_cols > m_layout.m_x_offset_display; --skipped_display_cols)
!     m_sink.add_space ();
  
    /* Print the line and compute the line_bounds.  */
    line_bounds lbounds;
*************** layout_printer::print_source_line (linen
*** 1917,1925 ****
  						    CU_BYTES,
  						    &state);
  	  if (in_range_p)
! 	    m_colorizer.set_range (state.range_idx);
  	  else
! 	    m_colorizer.set_normal_text ();
  	}
  
        /* Get the display width of the next character to be output, expanding
--- 2324,2332 ----
  						    CU_BYTES,
  						    &state);
  	  if (in_range_p)
! 	    set_in_range (state.range_idx);
  	  else
! 	    set_outside_range ();
  	}
  
        /* Get the display width of the next character to be output, expanding
*************** layout_printer::print_source_line (linen
*** 1933,1939 ****
  	  /* The returned display width is the number of spaces into which the
  	     tab should be expanded.  */
  	  for (int i = 0; i != this_display_width; ++i)
! 	    pp_space (&m_pp);
  	  continue;
  	}
  
--- 2340,2346 ----
  	  /* The returned display width is the number of spaces into which the
  	     tab should be expanded.  */
  	  for (int i = 0; i != this_display_width; ++i)
! 	    m_sink.add_space ();
  	  continue;
  	}
  
*************** layout_printer::print_source_line (linen
*** 1947,1956 ****
  	}
  
        /* Output the character.  */
!       m_layout.m_char_policy.m_print_cb (&m_pp, cp);
        c = dw.next_byte ();
      }
!   print_newline ();
    return lbounds;
  }
  
--- 2354,2364 ----
  	}
  
        /* Output the character.  */
!       m_sink.print_decoded_char (m_layout.m_char_policy, cp);
        c = dw.next_byte ();
      }
!   set_outside_range ();
!   end_line ();
    return lbounds;
  }
  
*************** layout::should_print_annotation_line_p (
*** 1975,1982 ****
  /* Print the leftmost column after the margin, which is used for showing
     links between labels (e.g. for CFG edges in execution paths).  */
  
  void
! layout_printer::print_leftmost_column ()
  {
    if (!get_options ().show_event_links_p)
      gcc_assert (m_link_lhs_state == link_lhs_state::none);
--- 2383,2391 ----
  /* Print the leftmost column after the margin, which is used for showing
     links between labels (e.g. for CFG edges in execution paths).  */
  
+ template<typename Sink>
  void
! layout_printer<Sink>::print_leftmost_column ()
  {
    if (!get_options ().show_event_links_p)
      gcc_assert (m_link_lhs_state == link_lhs_state::none);
*************** layout_printer::print_leftmost_column ()
*** 1986,2061 ****
      default:
        gcc_unreachable ();
      case link_lhs_state::none:
!       pp_space (&m_pp);
        break;
      case link_lhs_state::rewinding_to_lhs:
        {
! 	m_colorizer.set_cfg_edge ();
  	const cppchar_t ch = get_theme ().get_cppchar
  	  (text_art::theme::cell_kind::CFG_FROM_LEFT_TO_DOWN);
! 	pp_unicode_character (&m_pp, ch);
! 	m_colorizer.set_normal_text ();
        }
        break;
      case link_lhs_state::at_lhs:
        {
! 	m_colorizer.set_cfg_edge ();
  	const cppchar_t ch = get_theme ().get_cppchar
  	  (text_art::theme::cell_kind::CFG_DOWN);
! 	pp_unicode_character (&m_pp, ch);
! 	m_colorizer.set_normal_text ();
        }
        break;
      case link_lhs_state::indenting_to_dest:
        {
! 	m_colorizer.set_cfg_edge ();
  	const cppchar_t ch = get_theme ().get_cppchar
  	  (text_art::theme::cell_kind::CFG_FROM_DOWN_TO_RIGHT);
! 	pp_unicode_character (&m_pp, ch);
! 	m_colorizer.set_normal_text ();
        }
        break;
      }
  }
  
! /* Begin an annotation line.  If m_show_line_numbers_p, print the left
!    margin, which is empty for annotation lines.
     After any left margin, print a leftmost column, which is used for
!    showing links between labels (e.g. for CFG edges in execution paths).  */
  
  void
! layout_printer::start_annotation_line (char margin_char)
  {
!   pp_emit_prefix (&m_pp);
    if (get_options ().show_line_numbers_p)
      {
        /* Print the margin.  If MARGIN_CHAR != ' ', then print up to 3
  	 of it, right-aligned, padded with spaces.  */
        int i;
        for (i = 0; i < m_layout.m_linenum_width - 3; i++)
! 	pp_space (&m_pp);
        for (; i < m_layout.m_linenum_width; i++)
! 	pp_character (&m_pp, margin_char);
!       pp_string (&m_pp, " |");
      }
!   if (margin_char == ' ')
      print_leftmost_column ();
    else
!     pp_character (&m_pp, margin_char);
  }
  
  /* Print a line consisting of the caret/underlines for the given
     source line.  */
  
  void
! layout_printer::print_annotation_line (linenum_type row,
! 				       const line_bounds lbounds)
  {
    int x_bound = m_layout.get_x_bound_for_row (row,
  					      m_layout.m_exploc.m_display_col,
  					      lbounds.m_last_non_ws_disp_col);
  
!   start_annotation_line ();
  
    for (int column = 1 + m_layout.m_x_offset_display; column < x_bound; column++)
      {
--- 2395,2553 ----
      default:
        gcc_unreachable ();
      case link_lhs_state::none:
!       m_sink.add_space ();
        break;
      case link_lhs_state::rewinding_to_lhs:
        {
! 	m_sink.colorize_text_for_cfg_edge ();
  	const cppchar_t ch = get_theme ().get_cppchar
  	  (text_art::theme::cell_kind::CFG_FROM_LEFT_TO_DOWN);
! 	m_sink.add_character (ch);
! 	m_sink.colorize_text_ensure_normal ();
        }
        break;
      case link_lhs_state::at_lhs:
        {
! 	m_sink.colorize_text_for_cfg_edge ();
  	const cppchar_t ch = get_theme ().get_cppchar
  	  (text_art::theme::cell_kind::CFG_DOWN);
! 	m_sink.add_character (ch);
! 	m_sink.colorize_text_ensure_normal ();
        }
        break;
      case link_lhs_state::indenting_to_dest:
        {
! 	m_sink.colorize_text_for_cfg_edge ();
  	const cppchar_t ch = get_theme ().get_cppchar
  	  (text_art::theme::cell_kind::CFG_FROM_DOWN_TO_RIGHT);
! 	m_sink.add_character (ch);
! 	m_sink.colorize_text_ensure_normal ();
        }
        break;
      }
  }
  
! /* Begin an annotation line for either text or html output
! 
!    If m_show_line_numbers_p, print the left margin, which is empty
!    for annotation lines.
     After any left margin, print a leftmost column, which is used for
!    showing links between labels (e.g. for CFG edges in execution paths).
  
+    For text sinks, this also first prints the text prefix.
+    For html sinks, this also pushes <tr> and <td> open tags, where the
+    <td> is for the coming annotations.  */
+ 
+ template<typename Sink>
  void
! layout_printer<Sink>::start_annotation_line (enum margin_kind margin)
  {
!   m_sink.emit_text_prefix ();
!   m_sink.push_html_tag ("tr", true);
! 
!   char margin_char = (margin == margin_kind::insertion
! 		      ? '+'
! 		      : ' ');
! 
    if (get_options ().show_line_numbers_p)
      {
        /* Print the margin.  If MARGIN_CHAR != ' ', then print up to 3
  	 of it, right-aligned, padded with spaces.  */
+       m_sink.push_html_tag_with_class ("td", "linenum", true);
        int i;
        for (i = 0; i < m_layout.m_linenum_width - 3; i++)
! 	m_sink.add_space ();
        for (; i < m_layout.m_linenum_width; i++)
! 	m_sink.add_character (margin_char);
!       if (Sink::is_text ())
! 	m_sink.add_text (" |");
!       m_sink.pop_html_tag ("td");
      }
! 
!   m_sink.push_html_tag_with_class ("td", "left-margin", true);
!   if (margin == margin_kind::insertion)
!     m_sink.add_character (margin_char);
!   else
      print_leftmost_column ();
+   m_sink.pop_html_tag ("td");
+ 
+   m_sink.push_html_tag_with_class ("td",
+ 				   (margin == margin_kind::ruler
+ 				    ? "ruler"
+ 				    : "annotation"),
+ 				   true);
+ }
+ 
+ /* End a source or annotation line: text implementation.
+    Reset any colorization and emit a newline.  */
+ 
+ template<>
+ void
+ layout_printer<to_text>::end_line ()
+ {
+   m_sink.colorize_text_ensure_normal ();
+   m_sink.add_newline ();
+ }
+ 
+ /* End a source or annotation line: HTML implementation.
+    Close the <td> and <tr> tags.  */
+ 
+ template<>
+ void
+ layout_printer<to_html>::end_line ()
+ {
+   m_sink.pop_html_tag ("td");
+   m_sink.pop_html_tag ("tr");
+ }
+ 
+ /* Handle the various transitions between being-in-range and
+    not-being-in-a-range, and between ranges.  */
+ 
+ template<typename Sink>
+ void
+ layout_printer<Sink>::set_in_range (int range_idx)
+ {
+   if (m_was_in_range_p)
+     {
+       if (m_last_range_idx != range_idx)
+ 	{
+ 	  /* transition between ranges.  */
+ 	  end_label (m_last_range_idx, false);
+ 	  begin_label (range_idx, false);
+ 	}
+     }
    else
!     {
!       /* transition from "not in a range" to "in a range".  */
!       begin_label (range_idx, false);
!       m_was_in_range_p = true;
!     }
!   m_last_range_idx = range_idx;
! }
! 
! template<typename Sink>
! void
! layout_printer<Sink>::set_outside_range ()
! {
!   if (m_was_in_range_p)
!     /* transition from "in a range" to "not in a range".  */
!     end_label (m_last_range_idx, false);
!   m_was_in_range_p = false;
  }
  
  /* Print a line consisting of the caret/underlines for the given
     source line.  */
  
+ template<typename Sink>
  void
! layout_printer<Sink>::print_annotation_line (linenum_type row,
! 					     const line_bounds lbounds)
  {
    int x_bound = m_layout.get_x_bound_for_row (row,
  					      m_layout.m_exploc.m_display_col,
  					      lbounds.m_last_non_ws_disp_col);
  
!   start_annotation_line (margin_kind::normal);
  
    for (int column = 1 + m_layout.m_x_offset_display; column < x_bound; column++)
      {
*************** layout_printer::print_annotation_line (l
*** 2067,2075 ****
  						CU_DISPLAY_COLS,
  						&state);
        if (in_range_p)
  	{
  	  /* Within a range.  Draw either the caret or an underline.  */
- 	  m_colorizer.set_range (state.range_idx);
  	  if (state.draw_caret_p)
  	    {
  	      /* Draw the caret.  */
--- 2559,2571 ----
  						CU_DISPLAY_COLS,
  						&state);
        if (in_range_p)
+ 	set_in_range (state.range_idx);
+       else
+ 	set_outside_range ();
+ 
+       if (in_range_p)
  	{
  	  /* Within a range.  Draw either the caret or an underline.  */
  	  if (state.draw_caret_p)
  	    {
  	      /* Draw the caret.  */
*************** layout_printer::print_annotation_line (l
*** 2078,2096 ****
  		caret_char = get_options ().caret_chars[state.range_idx];
  	      else
  		caret_char = '^';
! 	      pp_character (&m_pp, caret_char);
  	    }
  	  else
! 	    pp_character (&m_pp, '~');
  	}
        else
  	{
  	  /* Not in a range.  */
! 	  m_colorizer.set_normal_text ();
! 	  pp_character (&m_pp, ' ');
  	}
      }
!   print_newline ();
  }
  
  /* A version of label_text that can live inside a vec.
--- 2574,2594 ----
  		caret_char = get_options ().caret_chars[state.range_idx];
  	      else
  		caret_char = '^';
! 	      m_sink.add_character (caret_char);
  	    }
  	  else
! 	    m_sink.add_character ('~');
  	}
        else
  	{
  	  /* Not in a range.  */
! 	  m_sink.add_character (' ');
  	}
      }
! 
!   set_outside_range ();
! 
!   end_line ();
  }
  
  /* A version of label_text that can live inside a vec.
*************** struct pod_label_text
*** 2126,2136 ****
  class line_label
  {
  public:
!   line_label (int state_idx, int column,
  	      label_text text,
  	      bool has_in_edge,
  	      bool has_out_edge)
!   : m_state_idx (state_idx), m_column (column),
      m_text (std::move (text)), m_label_line (0), m_has_vbar (true),
      m_has_in_edge (has_in_edge),
      m_has_out_edge (has_out_edge)
--- 2624,2636 ----
  class line_label
  {
  public:
!   line_label (unsigned original_range_idx,
! 	      int state_idx, int column,
  	      label_text text,
  	      bool has_in_edge,
  	      bool has_out_edge)
!   : m_original_range_idx (original_range_idx),
!     m_state_idx (state_idx), m_column (column),
      m_text (std::move (text)), m_label_line (0), m_has_vbar (true),
      m_has_in_edge (has_in_edge),
      m_has_out_edge (has_out_edge)
*************** public:
*** 2158,2163 ****
--- 2658,2664 ----
      return -compare (ll1->m_state_idx, ll2->m_state_idx);
    }
  
+   unsigned m_original_range_idx;
    int m_state_idx;
    int m_column;
    pod_label_text m_text;
*************** public:
*** 2168,2176 ****
    bool m_has_out_edge;
  };
  
  /* Print any labels in this row.  */
  void
! layout_printer::print_any_labels (linenum_type row)
  {
    int i;
    auto_vec<line_label> labels;
--- 2669,2734 ----
    bool m_has_out_edge;
  };
  
+ /* Implementations of layout_printer::{begin,end}_label for
+    to_text and to_html.
+ 
+    RANGE_IDX is the index of the range within the rich_location.
+ 
+    IS_LABEL_TEXT is true for the text of the label,
+    false when quoting the source code, underlining the source
+    code, and for the vertical bars connecting the underlines
+    to the text of the label.  */
+ 
+ template<>
+ void
+ layout_printer<to_text>::begin_label (int range_idx,
+ 				      bool is_label_text)
+ {
+   /* Colorize the text, unless it's for labels for events in a
+      diagnostic_path.  */
+   if (is_label_text && m_is_diagnostic_path)
+     return;
+ 
+   gcc_assert (m_sink.m_colorizer);
+   m_sink.m_colorizer->set_range (range_idx);
+ }
+ 
+ template<>
+ void
+ layout_printer<to_html>::begin_label (int range_idx,
+ 				      bool is_label_text)
+ {
+   if (is_label_text && m_sink.m_html_label_writer)
+     m_sink.m_html_label_writer->begin_label ();
+ 
+   if (const char *highlight_color
+ 	= m_sink.get_highlight_color_for_range_idx (range_idx))
+     m_sink.m_xp.push_tag_with_class ("span", highlight_color);
+ }
+ 
+ template<>
+ void
+ layout_printer<to_text>::end_label (int, bool)
+ {
+   m_sink.colorize_text_ensure_normal ();
+ }
+ 
+ template<>
+ void
+ layout_printer<to_html>::end_label (int range_idx,
+ 				    bool is_label_text)
+ {
+   if (m_sink.get_highlight_color_for_range_idx (range_idx))
+     m_sink.m_xp.pop_tag ();
+ 
+   if (is_label_text && m_sink.m_html_label_writer)
+     m_sink.m_html_label_writer->end_label ();
+ }
+ 
  /* Print any labels in this row.  */
+ template <typename Sink>
  void
! layout_printer<Sink>::print_any_labels (linenum_type row)
  {
    int i;
    auto_vec<line_label> labels;
*************** layout_printer::print_any_labels (linenu
*** 2203,2209 ****
  	if (text.get () == NULL)
  	  continue;
  
! 	labels.safe_push (line_label (i, disp_col, std::move (text),
  				      range->has_in_edge (),
  				      range->has_out_edge ()));
        }
--- 2761,2768 ----
  	if (text.get () == NULL)
  	  continue;
  
! 	labels.safe_push (line_label (range->m_original_idx,
! 				      i, disp_col, std::move (text),
  				      range->has_in_edge (),
  				      range->has_out_edge ()));
        }
*************** layout_printer::print_any_labels (linenu
*** 2288,2294 ****
  	    gcc_assert (get_options ().show_event_links_p);
  	    m_link_lhs_state = link_lhs_state::indenting_to_dest;
  	  }
! 	start_annotation_line ();
  
  	int column = 1 + m_layout.m_x_offset_display;
  	line_label *label;
--- 2847,2853 ----
  	    gcc_assert (get_options ().show_event_links_p);
  	    m_link_lhs_state = link_lhs_state::indenting_to_dest;
  	  }
! 	start_annotation_line (margin_kind::normal);
  
  	int column = 1 + m_layout.m_x_offset_display;
  	line_label *label;
*************** layout_printer::print_any_labels (linenu
*** 2310,2341 ****
  		       . ^~~~~~~~~~~~~
  		       . this text.  */
  		    gcc_assert (get_options ().show_event_links_p);
! 		    m_colorizer.set_cfg_edge ();
  		    const cppchar_t right= get_theme ().get_cppchar
  		      (text_art::theme::cell_kind::CFG_RIGHT);
  		    while (column < label->m_column - 1)
  		      {
! 			pp_unicode_character (&m_pp, right);
  			column++;
  		      }
  		    if (column == label->m_column - 1)
  		      {
! 			pp_character (&m_pp, '>');
  			column++;
  		      }
! 		    m_colorizer.set_normal_text ();
  		    m_link_lhs_state = link_lhs_state::none;
  		    label_line_with_in_edge = -1;
  		  }
  		else
  		  move_to_column (&column, label->m_column, true);
  		gcc_assert (column == label->m_column);
! 		/* Colorize the text, unless it's for events in a
! 		   diagnostic_path.  */
! 		if (!m_is_diagnostic_path)
! 		  m_colorizer.set_range (label->m_state_idx);
! 		pp_string (&m_pp, label->m_text.m_buffer);
! 		m_colorizer.set_normal_text ();
  		column += label->m_display_width;
  		if (get_options ().show_event_links_p && label->m_has_out_edge)
  		  {
--- 2869,2899 ----
  		       . ^~~~~~~~~~~~~
  		       . this text.  */
  		    gcc_assert (get_options ().show_event_links_p);
! 		    m_sink.colorize_text_for_cfg_edge ();
  		    const cppchar_t right= get_theme ().get_cppchar
  		      (text_art::theme::cell_kind::CFG_RIGHT);
  		    while (column < label->m_column - 1)
  		      {
! 			m_sink.add_character (right);
  			column++;
  		      }
  		    if (column == label->m_column - 1)
  		      {
! 			m_sink.add_character ('>');
  			column++;
  		      }
! 		    m_sink.colorize_text_ensure_normal ();
  		    m_link_lhs_state = link_lhs_state::none;
  		    label_line_with_in_edge = -1;
  		  }
  		else
  		  move_to_column (&column, label->m_column, true);
  		gcc_assert (column == label->m_column);
! 
! 		begin_label (label->m_state_idx, true);
! 		m_sink.add_text (label->m_text.m_buffer);
! 		end_label (label->m_state_idx, true);
! 
  		column += label->m_display_width;
  		if (get_options ().show_event_links_p && label->m_has_out_edge)
  		  {
*************** layout_printer::print_any_labels (linenu
*** 2350,2362 ****
  		      (text_art::theme::cell_kind::CFG_RIGHT);
  		    const cppchar_t from_right_to_down= get_theme ().get_cppchar
  		      (text_art::theme::cell_kind::CFG_FROM_RIGHT_TO_DOWN);
! 		    m_colorizer.set_cfg_edge ();
! 		    pp_space (&m_pp);
! 		    pp_unicode_character (&m_pp, right);
! 		    pp_unicode_character (&m_pp, '>');
! 		    pp_unicode_character (&m_pp, right);
! 		    pp_unicode_character (&m_pp, from_right_to_down);
! 		    m_colorizer.set_normal_text ();
  		    column += 5;
  		    m_link_rhs_column = column - 1;
  		  }
--- 2908,2920 ----
  		      (text_art::theme::cell_kind::CFG_RIGHT);
  		    const cppchar_t from_right_to_down= get_theme ().get_cppchar
  		      (text_art::theme::cell_kind::CFG_FROM_RIGHT_TO_DOWN);
! 		    m_sink.colorize_text_for_cfg_edge ();
! 		    m_sink.add_space ();
! 		    m_sink.add_character (right);
! 		    m_sink.add_character ('>');
! 		    m_sink.add_character (right);
! 		    m_sink.add_character (from_right_to_down);
! 		    m_sink.colorize_text_ensure_normal ();
  		    column += 5;
  		    m_link_rhs_column = column - 1;
  		  }
*************** layout_printer::print_any_labels (linenu
*** 2365,2373 ****
  	      {
  		gcc_assert (column <= label->m_column);
  		move_to_column (&column, label->m_column, true);
! 		m_colorizer.set_range (label->m_state_idx);
! 		pp_character (&m_pp, '|');
! 		m_colorizer.set_normal_text ();
  		column++;
  	      }
  	  }
--- 2923,2931 ----
  	      {
  		gcc_assert (column <= label->m_column);
  		move_to_column (&column, label->m_column, true);
! 		begin_label (label->m_state_idx, false);
! 		m_sink.add_character ('|');
! 		end_label (label->m_state_idx, false);
  		column++;
  	      }
  	  }
*************** layout_printer::print_any_labels (linenu
*** 2377,2390 ****
  	if (m_link_rhs_column != -1 && column < m_link_rhs_column)
  	  {
  	    move_to_column (&column, m_link_rhs_column, true);
! 	    m_colorizer.set_cfg_edge ();
  	    const cppchar_t down= get_theme ().get_cppchar
  	      (text_art::theme::cell_kind::CFG_DOWN);
! 	    pp_unicode_character (&m_pp, down);
! 	    m_colorizer.set_normal_text ();
  	  }
  
! 	print_newline ();
        }
      }
  
--- 2935,2948 ----
  	if (m_link_rhs_column != -1 && column < m_link_rhs_column)
  	  {
  	    move_to_column (&column, m_link_rhs_column, true);
! 	    m_sink.colorize_text_for_cfg_edge ();
  	    const cppchar_t down= get_theme ().get_cppchar
  	      (text_art::theme::cell_kind::CFG_DOWN);
! 	    m_sink.add_character (down);
! 	    m_sink.colorize_text_ensure_normal ();
  	  }
  
! 	end_line ();
        }
      }
  
*************** layout_printer::print_any_labels (linenu
*** 2393,2406 ****
    if (m_link_rhs_column != -1)
      {
        int column = 1 + m_layout.m_x_offset_display;
!       start_annotation_line ();
        move_to_column (&column, m_link_rhs_column, true);
!       m_colorizer.set_cfg_edge ();
        const cppchar_t down= get_theme ().get_cppchar
  	(text_art::theme::cell_kind::CFG_DOWN);
!       pp_unicode_character (&m_pp, down);
!       m_colorizer.set_normal_text ();
!       print_newline ();
      }
  
    /* Clean up.  */
--- 2951,2963 ----
    if (m_link_rhs_column != -1)
      {
        int column = 1 + m_layout.m_x_offset_display;
!       start_annotation_line (margin_kind::normal);
        move_to_column (&column, m_link_rhs_column, true);
!       m_sink.colorize_text_for_cfg_edge ();
        const cppchar_t down= get_theme ().get_cppchar
  	(text_art::theme::cell_kind::CFG_DOWN);
!       m_sink.add_character (down);
!       end_line ();
      }
  
    /* Clean up.  */
*************** layout_printer::print_any_labels (linenu
*** 2417,2424 ****
     They are printed on lines of their own, before the source line
     itself, with a leading '+'.  */
  
  void
! layout_printer::print_leading_fixits (linenum_type row)
  {
    for (unsigned int i = 0; i < m_layout.m_fixit_hints.length (); i++)
      {
--- 2974,2982 ----
     They are printed on lines of their own, before the source line
     itself, with a leading '+'.  */
  
+ template <typename Sink>
  void
! layout_printer<Sink>::print_leading_fixits (linenum_type row)
  {
    for (unsigned int i = 0; i < m_layout.m_fixit_hints.length (); i++)
      {
*************** layout_printer::print_leading_fixits (li
*** 2438,2453 ****
  	     and the inserted line with "insert" colorization
  	     helps them stand out from each other, and from
  	     the surrounding text.  */
! 	  m_colorizer.set_normal_text ();
! 	  start_annotation_line ('+');
! 	  m_colorizer.set_fixit_insert ();
  	  /* Print all but the trailing newline of the fix-it hint.
  	     We have to print the newline separately to avoid
  	     getting additional pp prefixes printed.  */
  	  for (size_t i = 0; i < hint->get_length () - 1; i++)
! 	    pp_character (&m_pp, hint->get_string ()[i]);
! 	  m_colorizer.set_normal_text ();
! 	  pp_newline (&m_pp);
  	}
      }
  }
--- 2996,3010 ----
  	     and the inserted line with "insert" colorization
  	     helps them stand out from each other, and from
  	     the surrounding text.  */
! 	  m_sink.colorize_text_ensure_normal ();
! 	  start_annotation_line (margin_kind::insertion);
! 	  m_sink.colorize_text_for_fixit_insert ();
  	  /* Print all but the trailing newline of the fix-it hint.
  	     We have to print the newline separately to avoid
  	     getting additional pp prefixes printed.  */
  	  for (size_t i = 0; i < hint->get_length () - 1; i++)
! 	    m_sink.add_character (hint->get_string ()[i]);
! 	  end_line ();
  	}
      }
  }
*************** line_corrections::add_hint (const fixit_
*** 2877,2884 ****
     Fix-it hints that insert new lines are handled separately,
     in layout::print_leading_fixits.  */
  
  void
! layout_printer::print_trailing_fixits (linenum_type row)
  {
    /* Build a list of correction instances for the line,
       potentially consolidating hints (for the sake of readability).  */
--- 3434,3442 ----
     Fix-it hints that insert new lines are handled separately,
     in layout::print_leading_fixits.  */
  
+ template<typename Sink>
  void
! layout_printer<Sink>::print_trailing_fixits (linenum_type row)
  {
    /* Build a list of correction instances for the line,
       potentially consolidating hints (for the sake of readability).  */
*************** layout_printer::print_trailing_fixits (l
*** 2904,2910 ****
    int column = 1 + m_layout.m_x_offset_display;
  
    if (!corrections.m_corrections.is_empty ())
!     start_annotation_line ();
  
    FOR_EACH_VEC_ELT (corrections.m_corrections, i, c)
      {
--- 3462,3468 ----
    int column = 1 + m_layout.m_x_offset_display;
  
    if (!corrections.m_corrections.is_empty ())
!     start_annotation_line (margin_kind::normal);
  
    FOR_EACH_VEC_ELT (corrections.m_corrections, i, c)
      {
*************** layout_printer::print_trailing_fixits (l
*** 2914,2922 ****
  	  /* This assumes the insertion just affects one line.  */
  	  int start_column = c->m_printed_columns.start;
  	  move_to_column (&column, start_column, true);
! 	  m_colorizer.set_fixit_insert ();
! 	  pp_string (&m_pp, c->m_text);
! 	  m_colorizer.set_normal_text ();
  	  column += c->m_display_cols;
  	}
        else
--- 3472,3480 ----
  	  /* This assumes the insertion just affects one line.  */
  	  int start_column = c->m_printed_columns.start;
  	  move_to_column (&column, start_column, true);
! 	  m_sink.colorize_text_for_fixit_insert ();
! 	  m_sink.add_text (c->m_text);
! 	  m_sink.colorize_text_ensure_normal ();
  	  column += c->m_display_cols;
  	}
        else
*************** layout_printer::print_trailing_fixits (l
*** 2932,2941 ****
  	      || c->m_byte_length == 0)
  	    {
  	      move_to_column (&column, start_column, true);
! 	      m_colorizer.set_fixit_delete ();
  	      for (; column <= finish_column; column++)
! 		pp_character (&m_pp, '-');
! 	      m_colorizer.set_normal_text ();
  	    }
  	  /* Print the replacement text.  REPLACE also covers
  	     removals, so only do this extra work (potentially starting
--- 3490,3499 ----
  	      || c->m_byte_length == 0)
  	    {
  	      move_to_column (&column, start_column, true);
! 	      m_sink.colorize_text_for_fixit_delete ();
  	      for (; column <= finish_column; column++)
! 		m_sink.add_character ('-');
! 	      m_sink.colorize_text_ensure_normal ();
  	    }
  	  /* Print the replacement text.  REPLACE also covers
  	     removals, so only do this extra work (potentially starting
*************** layout_printer::print_trailing_fixits (l
*** 2943,2969 ****
  	  if (c->m_byte_length > 0)
  	    {
  	      move_to_column (&column, start_column, true);
! 	      m_colorizer.set_fixit_insert ();
! 	      pp_string (&m_pp, c->m_text);
! 	      m_colorizer.set_normal_text ();
  	      column += c->m_display_cols;
  	    }
  	}
      }
  
    /* Add a trailing newline, if necessary.  */
    move_to_column (&column, 1 + m_layout.m_x_offset_display, false);
  }
  
- /* Disable any colorization and emit a newline.  */
- 
- void
- layout_printer::print_newline ()
- {
-   m_colorizer.set_normal_text ();
-   pp_newline (&m_pp);
- }
- 
  /* Return true if (ROW/COLUMN) is within a range of the layout.
     If it returns true, OUT_STATE is written to, with the
     range index, and whether we should draw the caret at
--- 3501,3521 ----
  	  if (c->m_byte_length > 0)
  	    {
  	      move_to_column (&column, start_column, true);
! 	      m_sink.colorize_text_for_fixit_insert ();
! 	      m_sink.add_text (c->m_text);
! 	      m_sink.colorize_text_ensure_normal ();
  	      column += c->m_display_cols;
  	    }
  	}
      }
  
+   if (!corrections.m_corrections.is_empty ())
+     m_sink.pop_html_tag ("td");
+ 
    /* Add a trailing newline, if necessary.  */
    move_to_column (&column, 1 + m_layout.m_x_offset_display, false);
  }
  
  /* Return true if (ROW/COLUMN) is within a range of the layout.
     If it returns true, OUT_STATE is written to, with the
     range index, and whether we should draw the caret at
*************** layout::get_x_bound_for_row (linenum_typ
*** 3060,3086 ****
     and updating *COLUMN.  If ADD_LEFT_MARGIN, then print the (empty)
     left margin after any newline.  */
  
  void
! layout_printer::move_to_column (int *column,
! 				int dest_column,
! 				bool add_left_margin)
  {
    /* Start a new line if we need to.  */
    if (*column > dest_column)
      {
!       print_newline ();
        if (add_left_margin)
! 	start_annotation_line ();
        *column = 1 + m_layout.m_x_offset_display;
      }
  
    while (*column < dest_column)
      {
        /* For debugging column issues, it can be helpful to replace this
! 	 pp_space call with
! 	   pp_character (&m_pp, '0' + (*column % 10));
  	 to visualize the changing value of "*column".  */
!       pp_space (&m_pp);
        (*column)++;
      }
  }
--- 3612,3639 ----
     and updating *COLUMN.  If ADD_LEFT_MARGIN, then print the (empty)
     left margin after any newline.  */
  
+ template<typename Sink>
  void
! layout_printer<Sink>::move_to_column (int *column,
! 				      int dest_column,
! 				      bool add_left_margin)
  {
    /* Start a new line if we need to.  */
    if (*column > dest_column)
      {
!       end_line ();
        if (add_left_margin)
! 	start_annotation_line (margin_kind::normal);
        *column = 1 + m_layout.m_x_offset_display;
      }
  
    while (*column < dest_column)
      {
        /* For debugging column issues, it can be helpful to replace this
! 	 add_space call with
! 	   m_sink.add_character ('0' + (*column % 10));
  	 to visualize the changing value of "*column".  */
!       m_sink.add_space ();
        (*column)++;
      }
  }
*************** layout_printer::move_to_column (int *col
*** 3088,3136 ****
  /* For debugging layout issues, render a ruler giving column numbers
     (after the 1-column indent).  */
  
  void
! layout_printer::show_ruler (int max_column)
  {
    /* Hundreds.  */
    if (max_column > 99)
      {
!       start_annotation_line ();
        for (int column = 1 + m_layout.m_x_offset_display;
  	   column <= max_column;
  	   ++column)
  	if (column % 10 == 0)
! 	  pp_character (&m_pp, '0' + (column / 100) % 10);
  	else
! 	  pp_space (&m_pp);
!       pp_newline (&m_pp);
      }
  
    /* Tens.  */
!   start_annotation_line ();
    for (int column = 1 + m_layout.m_x_offset_display;
         column <= max_column;
         ++column)
      if (column % 10 == 0)
!       pp_character (&m_pp, '0' + (column / 10) % 10);
      else
!       pp_space (&m_pp);
!   pp_newline (&m_pp);
  
    /* Units.  */
!   start_annotation_line ();
    for (int column = 1 + m_layout.m_x_offset_display;
         column <= max_column;
         ++column)
!     pp_character (&m_pp, '0' + (column % 10));
!   pp_newline (&m_pp);
  }
  
  /* Print leading fix-its (for new lines inserted before the source line)
     then the source line, followed by an annotation line
     consisting of any caret/underlines, then any fixits.
     If the source line can't be read, print nothing.  */
  void
! layout_printer::print_line (linenum_type row)
  {
    char_span line
      = m_layout.m_file_cache.get_source_line (m_layout.m_exploc.file, row);
--- 3641,3695 ----
  /* For debugging layout issues, render a ruler giving column numbers
     (after the 1-column indent).  */
  
+ template<typename Sink>
  void
! layout_printer<Sink>::show_ruler (int max_column)
  {
+   m_sink.push_html_tag_with_class("thead", "ruler", false);
+ 
    /* Hundreds.  */
    if (max_column > 99)
      {
!       start_annotation_line (margin_kind::ruler);
        for (int column = 1 + m_layout.m_x_offset_display;
  	   column <= max_column;
  	   ++column)
  	if (column % 10 == 0)
! 	  m_sink.add_character ('0' + (column / 100) % 10);
  	else
! 	  m_sink.add_space ();
!       end_line ();
      }
  
    /* Tens.  */
!   start_annotation_line (margin_kind::ruler);
    for (int column = 1 + m_layout.m_x_offset_display;
         column <= max_column;
         ++column)
      if (column % 10 == 0)
!       m_sink.add_character ('0' + (column / 10) % 10);
      else
!       m_sink.add_space ();
!   end_line ();
  
    /* Units.  */
!   start_annotation_line (margin_kind::ruler);
    for (int column = 1 + m_layout.m_x_offset_display;
         column <= max_column;
         ++column)
!     m_sink.add_character ('0' + (column % 10));
!   end_line ();
! 
!   m_sink.pop_html_tag("thead"); // thead
  }
  
  /* Print leading fix-its (for new lines inserted before the source line)
     then the source line, followed by an annotation line
     consisting of any caret/underlines, then any fixits.
     If the source line can't be read, print nothing.  */
+ template<typename Sink>
  void
! layout_printer<Sink>::print_line (linenum_type row)
  {
    char_span line
      = m_layout.m_file_cache.get_source_line (m_layout.m_exploc.file, row);
*************** layout_printer::print_line (linenum_type
*** 3154,3161 ****
     showing the link entering at the top right and emerging
     at the bottom left.  */
  
  void
! layout_printer::print_any_right_to_left_edge_lines ()
  {
    if (m_link_rhs_column == -1)
      /* Can also happen if the out-edge had UNKNOWN_LOCATION.  */
--- 3713,3721 ----
     showing the link entering at the top right and emerging
     at the bottom left.  */
  
+ template<typename Sink>
  void
! layout_printer<Sink>::print_any_right_to_left_edge_lines ()
  {
    if (m_link_rhs_column == -1)
      /* Can also happen if the out-edge had UNKNOWN_LOCATION.  */
*************** layout_printer::print_any_right_to_left_
*** 3164,3194 ****
    gcc_assert (get_options ().show_event_links_p);
  
    /* Print the line with "|".  */
!   start_annotation_line ();
    int column = 1 + m_layout.m_x_offset_display;
    move_to_column (&column, m_link_rhs_column, true);
!   m_colorizer.set_cfg_edge ();
    const cppchar_t down= get_theme ().get_cppchar
      (text_art::theme::cell_kind::CFG_DOWN);
!   pp_unicode_character (&m_pp, down);
!   m_colorizer.set_normal_text ();
!   pp_newline (&m_pp);
  
    /* Print the line with "┌──────────────────────────────────────────┘".  */
    m_link_lhs_state = link_lhs_state::rewinding_to_lhs;
!   start_annotation_line ();
!   m_colorizer.set_cfg_edge ();
    const cppchar_t left= get_theme ().get_cppchar
      (text_art::theme::cell_kind::CFG_LEFT);
    for (int column = 1 + m_layout.m_x_offset_display;
         column < m_link_rhs_column;
         ++column)
!     pp_unicode_character (&m_pp, left);
    const cppchar_t from_down_to_left = get_theme ().get_cppchar
      (text_art::theme::cell_kind::CFG_FROM_DOWN_TO_LEFT);
!   pp_unicode_character (&m_pp, from_down_to_left);
!   m_colorizer.set_normal_text ();
!   pp_newline (&m_pp);
  
    /* We now have a link line on the LHS,
       and no longer have one on the RHS.  */
--- 3724,3753 ----
    gcc_assert (get_options ().show_event_links_p);
  
    /* Print the line with "|".  */
!   start_annotation_line (margin_kind::normal);
! 
    int column = 1 + m_layout.m_x_offset_display;
    move_to_column (&column, m_link_rhs_column, true);
!   m_sink.colorize_text_for_cfg_edge ();
    const cppchar_t down= get_theme ().get_cppchar
      (text_art::theme::cell_kind::CFG_DOWN);
!   m_sink.add_character (down);
!   end_line ();
  
    /* Print the line with "┌──────────────────────────────────────────┘".  */
    m_link_lhs_state = link_lhs_state::rewinding_to_lhs;
!   start_annotation_line (margin_kind::normal);
!   m_sink.colorize_text_for_cfg_edge ();
    const cppchar_t left= get_theme ().get_cppchar
      (text_art::theme::cell_kind::CFG_LEFT);
    for (int column = 1 + m_layout.m_x_offset_display;
         column < m_link_rhs_column;
         ++column)
!     m_sink.add_character (left);
    const cppchar_t from_down_to_left = get_theme ().get_cppchar
      (text_art::theme::cell_kind::CFG_FROM_DOWN_TO_LEFT);
!   m_sink.add_character (from_down_to_left);
!   end_line ();
  
    /* We now have a link line on the LHS,
       and no longer have one on the RHS.  */
*************** layout_printer::print_any_right_to_left_
*** 3196,3209 ****
    m_link_rhs_column = -1;
  }
  
! layout_printer::layout_printer (pretty_printer &pp,
! 				const layout &layout,
! 				const rich_location &richloc,
! 				diagnostic_t diagnostic_kind)
! : m_pp (pp),
    m_layout (layout),
!   m_colorizer (m_pp, richloc, diagnostic_kind),
!   m_is_diagnostic_path (diagnostic_kind == DK_DIAGNOSTIC_PATH),
    m_link_lhs_state (link_lhs_state::none),
    m_link_rhs_column (-1)
  {
--- 3755,3769 ----
    m_link_rhs_column = -1;
  }
  
! template<typename Sink>
! layout_printer<Sink>::layout_printer (Sink &sink,
! 				      const layout &layout,
! 				      bool is_diagnostic_path)
! : m_sink (sink),
    m_layout (layout),
!   m_is_diagnostic_path (is_diagnostic_path),
!   m_was_in_range_p (false),
!   m_last_range_idx (0),
    m_link_lhs_state (link_lhs_state::none),
    m_link_rhs_column (-1)
  {
*************** diagnostic_context::maybe_show_locus (co
*** 3293,3303 ****
    source_policy.print (pp, richloc, diagnostic_kind, effects);
  }
  
  diagnostic_source_print_policy::
  diagnostic_source_print_policy (const diagnostic_context &dc)
  : m_options (dc.m_source_printing),
    m_location_policy (dc),
!   m_start_span_cb (dc.m_text_callbacks.m_start_span),
    m_file_cache (dc.get_file_cache ()),
    m_diagram_theme (dc.get_diagram_theme ()),
    m_escape_format (dc.get_escape_format ())
--- 3853,3899 ----
    source_policy.print (pp, richloc, diagnostic_kind, effects);
  }
  
+ /* As above, but print in HTML form to XP.
+    If non-null, use LABEL_WRITER when writing labelled ranges.  */
+ 
+ void
+ diagnostic_context::maybe_show_locus_as_html (const rich_location &richloc,
+ 					      const diagnostic_source_printing_options &opts,
+ 					      diagnostic_t diagnostic_kind,
+ 					      xml::printer &xp,
+ 					      diagnostic_source_effect_info *effects,
+ 					      html_label_writer *label_writer)
+ {
+   const location_t loc = richloc.get_loc ();
+   /* Do nothing if source-printing has been disabled.  */
+   if (!opts.enabled)
+     return;
+ 
+   /* Don't attempt to print source for UNKNOWN_LOCATION and for builtins.  */
+   if (loc <= BUILTINS_LOCATION)
+     return;
+ 
+   /* Don't print the same source location twice in a row, unless we have
+      fix-it hints, or multiple locations, or a label.  */
+   if (loc == m_last_location
+       && richloc.get_num_fixit_hints () == 0
+       && richloc.get_num_locations () == 1
+       && richloc.get_range (0)->m_label == NULL)
+     return;
+ 
+   m_last_location = loc;
+ 
+   diagnostic_source_print_policy source_policy (*this, opts);
+   source_policy.print_as_html (xp, richloc, diagnostic_kind, effects,
+ 			       label_writer);
+ }
+ 
  diagnostic_source_print_policy::
  diagnostic_source_print_policy (const diagnostic_context &dc)
  : m_options (dc.m_source_printing),
    m_location_policy (dc),
!   m_text_start_span_cb (dc.m_text_callbacks.m_text_start_span),
!   m_html_start_span_cb (dc.m_text_callbacks.m_html_start_span),
    m_file_cache (dc.get_file_cache ()),
    m_diagram_theme (dc.get_diagram_theme ()),
    m_escape_format (dc.get_escape_format ())
*************** diagnostic_source_print_policy (const di
*** 3309,3315 ****
  				const diagnostic_source_printing_options &opts)
  : m_options (opts),
    m_location_policy (dc),
!   m_start_span_cb (dc.m_text_callbacks.m_start_span),
    m_file_cache (dc.get_file_cache ()),
    m_diagram_theme (dc.get_diagram_theme ()),
    m_escape_format (dc.get_escape_format ())
--- 3905,3912 ----
  				const diagnostic_source_printing_options &opts)
  : m_options (opts),
    m_location_policy (dc),
!   m_text_start_span_cb (dc.m_text_callbacks.m_text_start_span),
!   m_html_start_span_cb (dc.m_text_callbacks.m_html_start_span),
    m_file_cache (dc.get_file_cache ()),
    m_diagram_theme (dc.get_diagram_theme ()),
    m_escape_format (dc.get_escape_format ())
*************** diagnostic_source_print_policy::print (p
*** 3329,3343 ****
    const
  {
    layout layout (*this, richloc, effects);
!   layout_printer lp (pp, layout, richloc, diagnostic_kind);
    lp.print (*this);
  }
  
  void
! layout_printer::print (const diagnostic_source_print_policy &source_policy)
  {
!   diagnostic_prefixing_rule_t saved_rule = pp_prefixing_rule (&m_pp);
!   pp_prefixing_rule (&m_pp) = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
  
    if (get_options ().show_ruler_p)
      show_ruler (m_layout.m_x_offset_display + get_options ().max_width);
--- 3926,3961 ----
    const
  {
    layout layout (*this, richloc, effects);
!   colorizer col (pp, richloc, diagnostic_kind);
!   to_text sink (pp, col);
!   layout_printer<to_text> lp (sink, layout,
! 			      diagnostic_kind == DK_DIAGNOSTIC_PATH);
    lp.print (*this);
  }
  
+ /* As above, but print in HTML form to XP.
+    If non-null, use LABEL_WRITER when writing labelled ranges.  */
+ 
  void
! diagnostic_source_print_policy::print_as_html (xml::printer &xp,
! 					       const rich_location &richloc,
! 					       diagnostic_t diagnostic_kind,
! 					       diagnostic_source_effect_info *effects,
! 					       html_label_writer *label_writer)
!   const
  {
!   layout layout (*this, richloc, effects);
!   to_html sink (xp, &richloc, label_writer);
!   layout_printer<to_html> lp (sink, layout,
! 			      diagnostic_kind == DK_DIAGNOSTIC_PATH);
!   lp.print (*this);
! }
! 
! template <typename Sink>
! void
! layout_printer<Sink>::print (const diagnostic_source_print_policy &source_policy)
! {
!   m_sink.push_html_tag_with_class ("table", "locus", false);
  
    if (get_options ().show_ruler_p)
      show_ruler (m_layout.m_x_offset_display + get_options ().max_width);
*************** layout_printer::print (const diagnostic_
*** 3362,3388 ****
  		= m_layout.get_expanded_location (line_span);
  	      const diagnostic_location_print_policy &
  		loc_policy = source_policy.get_location_policy ();
! 	      source_policy.get_start_span_fn () (loc_policy, &m_pp, exploc);
  	    }
  	}
        /* Iterate over the lines within this span (using linenum_arith_t to
  	 avoid overflow with 0xffffffff causing an infinite loop).  */
        linenum_arith_t last_line = line_span->get_last_line ();
        for (linenum_arith_t row = line_span->get_first_line ();
  	   row <= last_line; row++)
  	print_line (row);
      }
  
    if (auto effect_info = m_layout.m_effect_info)
      effect_info->m_trailing_out_edge_column = m_link_rhs_column;
  
!   pp_prefixing_rule (&m_pp) = saved_rule;
  }
  
  #if CHECKING_P
  
  namespace selftest {
  
  /* Selftests for diagnostic_show_locus.  */
  
  diagnostic_show_locus_fixture::
--- 3980,4044 ----
  		= m_layout.get_expanded_location (line_span);
  	      const diagnostic_location_print_policy &
  		loc_policy = source_policy.get_location_policy ();
! 	      m_sink.invoke_start_span_fn (source_policy, loc_policy, exploc);
  	    }
  	}
+ 
+       m_sink.push_html_tag_with_class ("tbody", "line-span", false);
+ 
        /* Iterate over the lines within this span (using linenum_arith_t to
  	 avoid overflow with 0xffffffff causing an infinite loop).  */
        linenum_arith_t last_line = line_span->get_last_line ();
        for (linenum_arith_t row = line_span->get_first_line ();
  	   row <= last_line; row++)
  	print_line (row);
+ 
+       m_sink.pop_html_tag ("tbody");
      }
  
    if (auto effect_info = m_layout.m_effect_info)
      effect_info->m_trailing_out_edge_column = m_link_rhs_column;
  
!   m_sink.pop_html_tag ("table");
  }
  
  #if CHECKING_P
  
  namespace selftest {
  
+ static std::unique_ptr<xml::node>
+ make_element_for_locus (const rich_location &rich_loc,
+ 			diagnostic_t kind,
+ 			diagnostic_context &dc)
+ {
+   dc.m_last_location = UNKNOWN_LOCATION;
+ 
+   xml::element wrapper ("wrapper", false);
+   xml::printer xp (wrapper);
+   dc.maybe_show_locus_as_html (rich_loc,
+ 			       dc.m_source_printing,
+ 			       kind,
+ 			       xp,
+ 			       nullptr,
+ 			       nullptr); // label_writer
+   if (wrapper.m_children.size () > 0)
+     return std::move (wrapper.m_children[0]);
+   else
+     return nullptr;
+ }
+ 
+ static label_text
+ make_raw_html_for_locus (const rich_location &rich_loc,
+ 			 diagnostic_t kind,
+ 			 diagnostic_context &dc)
+ {
+   auto node = make_element_for_locus (rich_loc, kind, dc);
+   pretty_printer pp;
+   if (node)
+     node->write_as_xml (&pp, 0, true);
+   return label_text::take (xstrdup (pp_formatted_text (&pp)));
+ }
+ 
  /* Selftests for diagnostic_show_locus.  */
  
  diagnostic_show_locus_fixture::
*************** test_layout_x_offset_display_utf8 (const
*** 3600,3606 ****
  			   linemap_position_for_column (line_table,
  							emoji_col));
      layout test_layout (policy, richloc, nullptr);
!     layout_printer lp (*dc.get_reference_printer (), test_layout, richloc, DK_ERROR);
      lp.print (policy);
      ASSERT_STREQ ("     |         1         \n"
  		  "     |         1         \n"
--- 4256,4265 ----
  			   linemap_position_for_column (line_table,
  							emoji_col));
      layout test_layout (policy, richloc, nullptr);
!     colorizer col (*dc.get_reference_printer (),
! 		   richloc, DK_ERROR);
!     to_text sink (*dc.get_reference_printer (), col);
!     layout_printer<to_text> lp (sink, test_layout, false);
      lp.print (policy);
      ASSERT_STREQ ("     |         1         \n"
  		  "     |         1         \n"
*************** test_layout_x_offset_display_utf8 (const
*** 3627,3633 ****
  			   linemap_position_for_column (line_table,
  							emoji_col + 2));
      layout test_layout (dc, richloc, nullptr);
!     layout_printer lp (*dc.get_reference_printer (), test_layout, richloc, DK_ERROR);
      lp.print (policy);
      ASSERT_STREQ ("     |        1         1 \n"
  		  "     |        1         2 \n"
--- 4286,4295 ----
  			   linemap_position_for_column (line_table,
  							emoji_col + 2));
      layout test_layout (dc, richloc, nullptr);
!     colorizer col (*dc.get_reference_printer (),
! 		   richloc, DK_ERROR);
!     to_text sink (*dc.get_reference_printer (), col);
!     layout_printer<to_text> lp (sink, test_layout, false);
      lp.print (policy);
      ASSERT_STREQ ("     |        1         1 \n"
  		  "     |        1         2 \n"
*************** test_layout_x_offset_display_tab (const
*** 3708,3714 ****
        dc.m_tabstop = tabstop;
        diagnostic_source_print_policy policy (dc);
        layout test_layout (policy, richloc, nullptr);
!       layout_printer lp (*dc.get_reference_printer (), test_layout, richloc, DK_ERROR);
        lp.print (policy);
        const char *out = pp_formatted_text (dc.get_reference_printer ());
        ASSERT_EQ (NULL, strchr (out, '\t'));
--- 4370,4379 ----
        dc.m_tabstop = tabstop;
        diagnostic_source_print_policy policy (dc);
        layout test_layout (policy, richloc, nullptr);
!       colorizer col (*dc.get_reference_printer (),
! 		     richloc, DK_ERROR);
!       to_text sink (*dc.get_reference_printer (), col);
!       layout_printer<to_text> lp (sink, test_layout, false);
        lp.print (policy);
        const char *out = pp_formatted_text (dc.get_reference_printer ());
        ASSERT_EQ (NULL, strchr (out, '\t'));
*************** test_layout_x_offset_display_tab (const
*** 3733,3739 ****
        dc.m_source_printing.show_line_numbers_p = true;
        diagnostic_source_print_policy policy (dc);
        layout test_layout (policy, richloc, nullptr);
!       layout_printer lp (*dc.get_reference_printer (), test_layout, richloc, DK_ERROR);
        lp.print (policy);
  
        /* We have arranged things so that two columns will be printed before
--- 4398,4407 ----
        dc.m_source_printing.show_line_numbers_p = true;
        diagnostic_source_print_policy policy (dc);
        layout test_layout (policy, richloc, nullptr);
!       colorizer col (*dc.get_reference_printer (),
! 		     richloc, DK_ERROR);
!       to_text sink (*dc.get_reference_printer (), col);
!       layout_printer<to_text> lp (sink, test_layout, false);
        lp.print (policy);
  
        /* We have arranged things so that two columns will be printed before
*************** test_one_liner_caret_and_range ()
*** 3814,3819 ****
--- 4482,4513 ----
    ASSERT_STREQ (" foo = bar.field;\n"
  		"       ~~~^~~~~~\n",
  		dc.test_show_locus (richloc));
+ 
+   {
+     test_diagnostic_context dc;
+     auto out = make_raw_html_for_locus (richloc, DK_ERROR, dc);
+      ASSERT_STREQ
+        ("<table class=\"locus\">\n"
+ 	"  <tbody class=\"line-span\">\n"
+ 	"    <tr><td class=\"left-margin\"> </td><td class=\"source\">foo = bar.field;</td></tr>\n"
+ 	"    <tr><td class=\"left-margin\"> </td><td class=\"annotation\">      ~~~^~~~~~</td></tr>\n"
+ 	"  </tbody>\n"
+ 	"</table>\n",
+ 	out.get ());
+   }
+   {
+     test_diagnostic_context dc;
+     dc.m_source_printing.show_line_numbers_p = true;
+     auto out = make_raw_html_for_locus (richloc, DK_ERROR, dc);
+      ASSERT_STREQ
+        ("<table class=\"locus\">\n"
+ 	"  <tbody class=\"line-span\">\n"
+ 	"    <tr><td class=\"linenum\">    1</td><td class=\"left-margin\"> </td><td class=\"source\">foo = bar.field;</td></tr>\n"
+ 	"    <tr><td class=\"linenum\">     </td><td class=\"left-margin\"> </td><td class=\"annotation\">      ~~~^~~~~~</td></tr>\n"
+ 	"  </tbody>\n"
+ 	"</table>\n",
+ 	out.get ());
+   }
  }
  
  /* Multiple ranges and carets.  */
*************** test_one_liner_labels ()
*** 4231,4236 ****
--- 4925,4948 ----
  		  " |     label 1\n"
  		  " label 0\n",
  		  dc.test_show_locus (richloc));
+ 
+     {
+       test_diagnostic_context dc;
+       dc.m_source_printing.show_line_numbers_p = true;
+       auto out = make_raw_html_for_locus (richloc, DK_ERROR, dc);
+       ASSERT_STREQ
+ 	("<table class=\"locus\">\n"
+ 	 "  <tbody class=\"line-span\">\n"
+ 	 "    <tr><td class=\"linenum\">    1</td><td class=\"left-margin\"> </td><td class=\"source\">foo = bar.field;</td></tr>\n"
+ 	 "    <tr><td class=\"linenum\">     </td><td class=\"left-margin\"> </td><td class=\"annotation\">^~~   ~~~ ~~~~~</td></tr>\n"
+ 	 "    <tr><td class=\"linenum\">     </td><td class=\"left-margin\"> </td><td class=\"annotation\">|     |   |</td></tr>\n"
+ 	 "    <tr><td class=\"linenum\">     </td><td class=\"left-margin\"> </td><td class=\"annotation\">|     |   label 2</td></tr>\n"
+ 	 "    <tr><td class=\"linenum\">     </td><td class=\"left-margin\"> </td><td class=\"annotation\">|     label 1</td></tr>\n"
+ 	 "    <tr><td class=\"linenum\">     </td><td class=\"left-margin\"> </td><td class=\"annotation\">label 0</td></tr>\n"
+ 	 "  </tbody>\n"
+ 	 "</table>\n",
+ 	 out.get ());
+     }
    }
  
    /* Example of boundary conditions: label 0 and 1 have just enough clearance,
diff -Nrcpad gcc-16-20250525/gcc/diagnostic.cc gcc-16-20250601/gcc/diagnostic.cc
*** gcc-16-20250525/gcc/diagnostic.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/diagnostic.cc	Sun Jun  1 22:32:14 2025
*************** diagnostic_context::initialize (int n_op
*** 250,256 ****
    m_internal_error = nullptr;
    m_adjust_diagnostic_info = nullptr;
    m_text_callbacks.m_begin_diagnostic = default_diagnostic_text_starter;
!   m_text_callbacks.m_start_span = default_diagnostic_start_span_fn;
    m_text_callbacks.m_end_diagnostic = default_diagnostic_text_finalizer;
    m_option_mgr = nullptr;
    m_urlifier_stack = new auto_vec<urlifier_stack_node> ();
--- 250,259 ----
    m_internal_error = nullptr;
    m_adjust_diagnostic_info = nullptr;
    m_text_callbacks.m_begin_diagnostic = default_diagnostic_text_starter;
!   m_text_callbacks.m_text_start_span
!     = default_diagnostic_start_span_fn<to_text>;
!   m_text_callbacks.m_html_start_span
!     = default_diagnostic_start_span_fn<to_html>;
    m_text_callbacks.m_end_diagnostic = default_diagnostic_text_finalizer;
    m_option_mgr = nullptr;
    m_urlifier_stack = new auto_vec<urlifier_stack_node> ();
*************** logical_location_manager::function_p (ke
*** 1071,1091 ****
      }
  }
  
- void
- default_diagnostic_start_span_fn (const diagnostic_location_print_policy &loc_policy,
- 				  pretty_printer *pp,
- 				  expanded_location exploc)
- {
-   const diagnostic_column_policy &column_policy
-     = loc_policy.get_column_policy ();
-   label_text text
-     = column_policy.get_location_text (exploc,
- 				       loc_policy.show_column_p (),
- 				       pp_show_color (pp));
-   pp_string (pp, text.get ());
-   pp_newline (pp);
- }
- 
  /* Interface to specify diagnostic kind overrides.  Returns the
     previous setting, or DK_UNSPECIFIED if the parameters are out of
     range.  If OPTION_ID is zero, the new setting is for all the
--- 1074,1079 ----
diff -Nrcpad gcc-16-20250525/gcc/diagnostic.h gcc-16-20250601/gcc/diagnostic.h
*** gcc-16-20250525/gcc/diagnostic.h	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/diagnostic.h	Sun Jun  1 22:32:14 2025
*************** namespace text_art
*** 31,36 ****
--- 31,41 ----
    class theme;
  } // namespace text_art
  
+ namespace xml
+ {
+   class printer;
+ } // namespace xml
+ 
  /* An enum for controlling what units to use for the column number
     when diagnostics are output, used by the -fdiagnostics-column-unit option.
     Tabs will be expanded or not according to the value of -ftabstop.  The origin
*************** class diagnostic_source_print_policy;
*** 177,186 ****
  typedef void (*diagnostic_text_starter_fn) (diagnostic_text_output_format &,
  					    const diagnostic_info *);
  
! typedef void
! (*diagnostic_start_span_fn) (const diagnostic_location_print_policy &,
! 			     pretty_printer *,
! 			     expanded_location);
  
  typedef void (*diagnostic_text_finalizer_fn) (diagnostic_text_output_format &,
  					      const diagnostic_info *,
--- 182,196 ----
  typedef void (*diagnostic_text_starter_fn) (diagnostic_text_output_format &,
  					    const diagnostic_info *);
  
! struct to_text;
! struct to_html;
! 
! extern pretty_printer *get_printer (to_text &);
! 
! template <typename Sink>
! using diagnostic_start_span_fn = void (*) (const diagnostic_location_print_policy &,
! 					   Sink &sink,
! 					   expanded_location);
  
  typedef void (*diagnostic_text_finalizer_fn) (diagnostic_text_output_format &,
  					      const diagnostic_info *,
*************** public:
*** 389,399 ****
--- 399,430 ----
    const diagnostic_column_policy &
    get_column_policy () const { return m_column_policy; }
  
+   void
+   print_text_span_start (const diagnostic_context &dc,
+ 			 pretty_printer &pp,
+ 			 const expanded_location &exploc);
+ 
+   void
+   print_html_span_start (const diagnostic_context &dc,
+ 			 xml::printer &xp,
+ 			 const expanded_location &exploc);
+ 
  private:
    diagnostic_column_policy m_column_policy;
    bool m_show_column;
  };
  
+ /* Abstract base class for optionally supplying extra tags when writing
+    out annotation labels in HTML output.  */
+ 
+ class html_label_writer
+ {
+ public:
+   virtual ~html_label_writer () {}
+   virtual void begin_label () = 0;
+   virtual void end_label () = 0;
+ };
+ 
  /* A bundle of state for printing source within a diagnostic,
     to isolate the interactions between diagnostic_context and the
     implementation of diagnostic_show_locus.  */
*************** public:
*** 411,421 ****
  	 diagnostic_t diagnostic_kind,
  	 diagnostic_source_effect_info *effect_info) const;
  
    const diagnostic_source_printing_options &
    get_options () const { return m_options; }
  
!   diagnostic_start_span_fn
!   get_start_span_fn () const { return m_start_span_cb; }
  
    file_cache &
    get_file_cache () const { return m_file_cache; }
--- 442,462 ----
  	 diagnostic_t diagnostic_kind,
  	 diagnostic_source_effect_info *effect_info) const;
  
+   void
+   print_as_html (xml::printer &xp,
+ 		 const rich_location &richloc,
+ 		 diagnostic_t diagnostic_kind,
+ 		 diagnostic_source_effect_info *effect_info,
+ 		 html_label_writer *label_writer) const;
+ 
    const diagnostic_source_printing_options &
    get_options () const { return m_options; }
  
!   diagnostic_start_span_fn<to_text>
!   get_text_start_span_fn () const { return m_text_start_span_cb; }
! 
!   diagnostic_start_span_fn<to_html>
!   get_html_start_span_fn () const { return m_html_start_span_cb; }
  
    file_cache &
    get_file_cache () const { return m_file_cache; }
*************** public:
*** 442,448 ****
  private:
    const diagnostic_source_printing_options &m_options;
    class diagnostic_location_print_policy m_location_policy;
!   diagnostic_start_span_fn m_start_span_cb;
    file_cache &m_file_cache;
  
    /* Other data copied from diagnostic_context.  */
--- 483,490 ----
  private:
    const diagnostic_source_printing_options &m_options;
    class diagnostic_location_print_policy m_location_policy;
!   diagnostic_start_span_fn<to_text> m_text_start_span_cb;
!   diagnostic_start_span_fn<to_html> m_html_start_span_cb;
    file_cache &m_file_cache;
  
    /* Other data copied from diagnostic_context.  */
*************** public:
*** 508,514 ****
    /* Give access to m_text_callbacks.  */
    friend diagnostic_text_starter_fn &
    diagnostic_text_starter (diagnostic_context *context);
!   friend diagnostic_start_span_fn &
    diagnostic_start_span (diagnostic_context *context);
    friend diagnostic_text_finalizer_fn &
    diagnostic_text_finalizer (diagnostic_context *context);
--- 550,556 ----
    /* Give access to m_text_callbacks.  */
    friend diagnostic_text_starter_fn &
    diagnostic_text_starter (diagnostic_context *context);
!   friend diagnostic_start_span_fn<to_text> &
    diagnostic_start_span (diagnostic_context *context);
    friend diagnostic_text_finalizer_fn &
    diagnostic_text_finalizer (diagnostic_context *context);
*************** public:
*** 602,607 ****
--- 644,655 ----
  			 diagnostic_t diagnostic_kind,
  			 pretty_printer &pp,
  			 diagnostic_source_effect_info *effect_info);
+   void maybe_show_locus_as_html (const rich_location &richloc,
+ 				 const diagnostic_source_printing_options &opts,
+ 				 diagnostic_t diagnostic_kind,
+ 				 xml::printer &xp,
+ 				 diagnostic_source_effect_info *effect_info,
+ 				 html_label_writer *label_writer);
  
    void emit_diagram (const diagnostic_diagram &diagram);
  
*************** private:
*** 882,888 ****
      /* This function is called by diagnostic_show_locus in between
         disjoint spans of source code, so that the context can print
         something to indicate that a new span of source code has begun.  */
!     diagnostic_start_span_fn m_start_span;
  
      /* This function is called after the diagnostic message is printed.  */
      diagnostic_text_finalizer_fn m_end_diagnostic;
--- 930,937 ----
      /* This function is called by diagnostic_show_locus in between
         disjoint spans of source code, so that the context can print
         something to indicate that a new span of source code has begun.  */
!     diagnostic_start_span_fn<to_text> m_text_start_span;
!     diagnostic_start_span_fn<to_html> m_html_start_span;
  
      /* This function is called after the diagnostic message is printed.  */
      diagnostic_text_finalizer_fn m_end_diagnostic;
*************** diagnostic_text_starter (diagnostic_cont
*** 1040,1049 ****
  /* Client supplied function called between disjoint spans of source code,
     so that the context can print
     something to indicate that a new span of source code has begun.  */
! inline diagnostic_start_span_fn &
  diagnostic_start_span (diagnostic_context *context)
  {
!   return context->m_text_callbacks.m_start_span;
  }
  
  /* Client supplied function called after a diagnostic message is
--- 1089,1098 ----
  /* Client supplied function called between disjoint spans of source code,
     so that the context can print
     something to indicate that a new span of source code has begun.  */
! inline diagnostic_start_span_fn<to_text> &
  diagnostic_start_span (diagnostic_context *context)
  {
!   return context->m_text_callbacks.m_text_start_span;
  }
  
  /* Client supplied function called after a diagnostic message is
*************** diagnostic_show_locus (diagnostic_contex
*** 1128,1133 ****
--- 1177,1197 ----
    context->maybe_show_locus (*richloc, opts, diagnostic_kind, *pp, effect_info);
  }
  
+ inline void
+ diagnostic_show_locus_as_html (diagnostic_context *context,
+ 			       const diagnostic_source_printing_options &opts,
+ 			       rich_location *richloc,
+ 			       diagnostic_t diagnostic_kind,
+ 			       xml::printer &xp,
+ 			       diagnostic_source_effect_info *effect_info = nullptr,
+ 			       html_label_writer *label_writer = nullptr)
+ {
+   gcc_assert (context);
+   gcc_assert (richloc);
+   context->maybe_show_locus_as_html (*richloc, opts, diagnostic_kind, xp,
+ 				     effect_info, label_writer);
+ }
+ 
  /* Because we read source files a second time after the frontend did it the
     first time, we need to know how the frontend handled things like character
     set conversion and UTF-8 BOM stripping, in order to make everything
*************** extern void diagnostic_set_info_translat
*** 1201,1208 ****
  #endif
  void default_diagnostic_text_starter (diagnostic_text_output_format &,
  				      const diagnostic_info *);
  void default_diagnostic_start_span_fn (const diagnostic_location_print_policy &,
! 				       pretty_printer *,
  				       expanded_location);
  void default_diagnostic_text_finalizer (diagnostic_text_output_format &,
  					const diagnostic_info *,
--- 1265,1273 ----
  #endif
  void default_diagnostic_text_starter (diagnostic_text_output_format &,
  				      const diagnostic_info *);
+ template <typename Sink>
  void default_diagnostic_start_span_fn (const diagnostic_location_print_policy &,
! 				       Sink &sink,
  				       expanded_location);
  void default_diagnostic_text_finalizer (diagnostic_text_output_format &,
  					const diagnostic_info *,
diff -Nrcpad gcc-16-20250525/gcc/doc/extend.texi gcc-16-20250601/gcc/doc/extend.texi
*** gcc-16-20250525/gcc/doc/extend.texi	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/doc/extend.texi	Sun Jun  1 22:32:14 2025
*************** extensions, accepted by GCC in C90 mode
*** 31,36 ****
--- 31,37 ----
  * Thread-Local::        Per-thread variables.
  * OpenMP::              Multiprocessing extensions.
  * OpenACC::             Extensions for offloading code to accelerator devices.
+ * _Countof::            The number of elements of arrays.
  * Inline::              Defining inline functions (as fast as macros).
  * Volatiles::           What constitutes an access to a volatile object.
  * Using Assembly Language with C:: Instructions and extensions for interfacing C with assembler.
*************** truncate the copy without appending the
*** 7323,7329 ****
  Using the attribute makes it possible to suppress the warning.  However,
  when the array is declared with the attribute the call to @code{strlen} is
  diagnosed because when the array doesn't contain a @code{NUL}-terminated
! string the call is undefined.  To copy, compare, of search non-string
  character arrays use the @code{memcpy}, @code{memcmp}, @code{memchr},
  and other functions that operate on arrays of bytes.  In addition,
  calling @code{strnlen} and @code{strndup} with such arrays is safe
--- 7324,7330 ----
  Using the attribute makes it possible to suppress the warning.  However,
  when the array is declared with the attribute the call to @code{strlen} is
  diagnosed because when the array doesn't contain a @code{NUL}-terminated
! string the call is undefined.  To copy, compare, or search non-string
  character arrays use the @code{memcpy}, @code{memcmp}, @code{memchr},
  and other functions that operate on arrays of bytes.  In addition,
  calling @code{strnlen} and @code{strndup} with such arrays is safe
*************** library.
*** 10693,10698 ****
--- 10694,10729 ----
  @xref{OpenMP and OpenACC Options}, for additional options useful with
  @option{-fopenacc}.
  
+ @node _Countof
+ @section Determining the Number of Elements of Arrays
+ @cindex _Countof
+ @cindex number of elements
+ 
+ The keyword @code{_Countof} determines
+ the number of elements of an array operand.
+ Its syntax is similar to @code{sizeof}.
+ The operand must be
+ a parenthesized complete array type name
+ or an expression of such a type.
+ For example:
+ 
+ @smallexample
+ int a[n];
+ _Countof (a);  // returns n
+ _Countof (int [7][3]);  // returns 7
+ @end smallexample
+ 
+ The result of this operator is an integer constant expression,
+ unless the array has a variable number of elements.
+ The operand is only evaluated
+ if the array has a variable number of elements.
+ For example:
+ 
+ @smallexample
+ _Countof (int [7][n++]);  // integer constant expression
+ _Countof (int [n++][7]);  // run-time value; n++ is evaluated
+ @end smallexample
+ 
  @node Inline
  @section An Inline Function is As Fast As a Macro
  @cindex inline functions
diff -Nrcpad gcc-16-20250525/gcc/doc/gm2.texi gcc-16-20250601/gcc/doc/gm2.texi
*** gcc-16-20250525/gcc/doc/gm2.texi	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/doc/gm2.texi	Sun Jun  1 22:32:14 2025
*************** lines compiled.
*** 540,545 ****
--- 540,548 ----
  @item -fm2-strict-type
  experimental flag to turn on the new strict type checker.
  
+ @item -fm2-strict-type-reason
+ provides more detail why the types are incompatible.
+ 
  @item -fm2-whole-program
  compile all implementation modules and program module at once.  Notice
  that you need to take care if you are compiling different dialect
diff -Nrcpad gcc-16-20250525/gcc/doc/invoke.texi gcc-16-20250601/gcc/doc/invoke.texi
*** gcc-16-20250525/gcc/doc/invoke.texi	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/doc/invoke.texi	Sun Jun  1 22:32:14 2025
*************** Enable support for the C++ coroutines ex
*** 3297,3302 ****
--- 3297,3346 ----
  Permit the C++ front end to note all candidates during overload resolution
  failure, including when a deleted function is selected.
  
+ @item -fdump-lang-
+ @itemx -fdump-lang-@var{switch}
+ @itemx -fdump-lang-@var{switch}-@var{options}
+ @itemx -fdump-lang-@var{switch}-@var{options}=@var{filename}
+ Control the dumping of C++-specific information.  The @var{options}
+ and @var{filename} portions behave as described in the
+ @option{-fdump-tree} option.  The following @var{switch} values are
+ accepted:
+ 
+ @table @samp
+ @item all
+ Enable all of the below.
+ 
+ @opindex fdump-lang-class
+ @item class
+ Dump class hierarchy information.  Virtual table information is emitted
+ unless '@option{slim}' is specified.
+ 
+ @opindex fdump-lang-module
+ @item module
+ Dump module information.  Options @option{lineno} (locations),
+ @option{graph} (reachability), @option{blocks} (clusters),
+ @option{uid} (serialization), @option{alias} (mergeable),
+ @option{asmname} (Elrond), @option{eh} (mapper) & @option{vops}
+ (macros) may provide additional information.
+ 
+ @opindex fdump-lang-raw
+ @item raw
+ Dump the raw internal tree data.
+ 
+ @opindex fdump-lang-tinst
+ @item tinst
+ Dump the sequence of template instantiations, indented to show the
+ depth of recursion.  The @option{lineno} option adds the source
+ location where the instantiation was triggered, and the
+ @option{details} option also dumps pre-instantiation substitutions
+ such as those performed during template argument deduction.
+ 
+ Lines in the .tinst dump start with @samp{I} for an instantiation,
+ @samp{S} for another substitution, and @samp{R[IS]} for the reopened
+ context of a deferred instantiation.
+ 
+ @end table
+ 
  @opindex fno-elide-constructors
  @opindex felide-constructors
  @item -fno-elide-constructors
*************** in this release.
*** 6075,6092 ****
  
  @item experimental-html
  Emit diagnostics to a file in HTML format.  This scheme is experimental,
! and may go away in future GCC releases.  The details of the output are
! also subject to change.
  
  Supported keys are:
  
  @table @gcctabopt
  
  @item file=@var{FILENAME}
  Specify the filename to write the HTML output to, potentially with a
  leading absolute or relative path.  If not specified, it defaults to
  @file{@var{source}.html}.
  
  @end table
  
  @end table
--- 6119,6143 ----
  
  @item experimental-html
  Emit diagnostics to a file in HTML format.  This scheme is experimental,
! and may go away in future GCC releases.  The keys and details of the output
! are also subject to change.
  
  Supported keys are:
  
  @table @gcctabopt
  
+ @item css=@r{[}yes@r{|}no@r{]}
+ Add an embedded <style> to the generated HTML.  Defaults to yes.
+ 
  @item file=@var{FILENAME}
  Specify the filename to write the HTML output to, potentially with a
  leading absolute or relative path.  If not specified, it defaults to
  @file{@var{source}.html}.
  
+ @item javascript=@r{[}yes@r{|}no@r{]}
+ Add an embedded <script> to the generated HTML providing a barebones UI
+ for viewing results.  Defaults to yes.
+ 
  @end table
  
  @end table
*************** Dump language-specific information.  The
*** 20891,20920 ****
  @itemx -fdump-lang-@var{switch}-@var{options}=@var{filename}
  Control the dumping of language-specific information.  The @var{options}
  and @var{filename} portions behave as described in the
! @option{-fdump-tree} option.  The following @var{switch} values are
! accepted:
! 
! @table @samp
! @item all
! 
! Enable all language-specific dumps.
! 
! @item class
! Dump class hierarchy information.  Virtual table information is emitted
! unless '@option{slim}' is specified.  This option is applicable to C++ only.
! 
! @item module
! Dump module information.  Options @option{lineno} (locations),
! @option{graph} (reachability), @option{blocks} (clusters),
! @option{uid} (serialization), @option{alias} (mergeable),
! @option{asmname} (Elrond), @option{eh} (mapper) & @option{vops}
! (macros) may provide additional information.  This option is
! applicable to C++ only.
! 
! @item raw
! Dump the raw internal tree data.  This option is applicable to C++ only.
! 
! @end table
  
  @opindex fdump-passes
  @item -fdump-passes
--- 20942,20951 ----
  @itemx -fdump-lang-@var{switch}-@var{options}=@var{filename}
  Control the dumping of language-specific information.  The @var{options}
  and @var{filename} portions behave as described in the
! @option{-fdump-tree} option.  @option{-fdump-tree-all} enables all
! language-specific dumps; other options vary with the language.  For
! instance, see @xref{C++ Dialect Options} for the @option{-fdump-lang}
! flags supported by the C++ front-end.
  
  @opindex fdump-passes
  @item -fdump-passes
diff -Nrcpad gcc-16-20250525/gcc/doc/riscv-ext.texi gcc-16-20250601/gcc/doc/riscv-ext.texi
*** gcc-16-20250525/gcc/doc/riscv-ext.texi	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/doc/riscv-ext.texi	Sun Jun  1 22:32:14 2025
***************
*** 510,515 ****
--- 510,519 ----
  @tab 1.0
  @tab State enable extension
  
+ @item smdbltrp
+ @tab 1.0
+ @tab Double Trap Extensions
+ 
  @item ssaia
  @tab 1.0
  @tab Advanced interrupt architecture extension for supervisor-mode
***************
*** 538,543 ****
--- 542,551 ----
  @tab 1.0
  @tab ssstrict extension
  
+ @item ssdbltrp
+ @tab 1.0
+ @tab Double Trap Extensions
+ 
  @item supm
  @tab 1.0
  @tab supm extension
diff -Nrcpad gcc-16-20250525/gcc/doc/sourcebuild.texi gcc-16-20250601/gcc/doc/sourcebuild.texi
*** gcc-16-20250525/gcc/doc/sourcebuild.texi	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/doc/sourcebuild.texi	Sun Jun  1 22:32:14 2025
*************** man pages and support for converting the
*** 215,224 ****
  HTML@.  @xref{Documentation}.
  
  @item ginclude
! System headers installed by GCC, mainly those required by the C
! standard of freestanding implementations.  @xref{Headers, , Headers
! Installed by GCC}, for details of when these and other headers are
! installed.
  
  @item po
  Message catalogs with translations of messages produced by GCC into
--- 215,224 ----
  HTML@.  @xref{Documentation}.
  
  @item ginclude
! System headers installed by GCC, mainly those defined by the C
! standard that do not declare functions with external linkage.
! @xref{Headers, , Headers Installed by GCC}, for details of when these
! and other headers are installed.
  
  @item po
  Message catalogs with translations of messages produced by GCC into
*************** Headers Installed by GCC}, for more info
*** 326,332 ****
  In general, GCC expects the system C library to provide most of the
  headers to be used with it.  However, GCC will fix those headers if
  necessary to make them work with GCC, and will install some headers
! required of freestanding implementations.  These headers are installed
  in @file{@var{libsubdir}/include}.  Headers for non-C runtime
  libraries are also installed by GCC; these are not documented here.
  (FIXME: document them somewhere.)
--- 326,333 ----
  In general, GCC expects the system C library to provide most of the
  headers to be used with it.  However, GCC will fix those headers if
  necessary to make them work with GCC, and will install some headers
! of its own, mainly headers that do not declare functions with external
! linkage.  These headers are installed
  in @file{@var{libsubdir}/include}.  Headers for non-C runtime
  libraries are also installed by GCC; these are not documented here.
  (FIXME: document them somewhere.)
*************** representation of floating point numbers
*** 351,358 ****
  GCC also installs its own version of @code{<limits.h>}; this is generated
  from @file{glimits.h}, together with @file{limitx.h} and
  @file{limity.h} if the system also has its own version of
! @code{<limits.h>}.  (GCC provides its own header because it is
! required of ISO C freestanding implementations, but needs to include
  the system header from its own header as well because other standards
  such as POSIX specify additional values to be defined in
  @code{<limits.h>}.)  The system's @code{<limits.h>} header is used via
--- 352,359 ----
  GCC also installs its own version of @code{<limits.h>}; this is generated
  from @file{glimits.h}, together with @file{limitx.h} and
  @file{limity.h} if the system also has its own version of
! @code{<limits.h>}.  (GCC provides its own header because it does not
! declare functions with external linkage, but needs to include
  the system header from its own header as well because other standards
  such as POSIX specify additional values to be defined in
  @code{<limits.h>}.)  The system's @code{<limits.h>} header is used via
diff -Nrcpad gcc-16-20250525/gcc/doc/standards.texi gcc-16-20250601/gcc/doc/standards.texi
*** gcc-16-20250525/gcc/doc/standards.texi	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/doc/standards.texi	Sun Jun  1 22:32:14 2025
*************** library facilities: those in @code{<floa
*** 152,158 ****
  @code{<iso646.h>}; since C99, also those in @code{<stdbool.h>} and
  @code{<stdint.h>}; and since C11, also those in @code{<stdalign.h>}
  and @code{<stdnoreturn.h>}.  In addition, complex types, added in C99, are not
! required for freestanding implementations.  
  
  The standard also defines two environments for programs, a
  @dfn{freestanding environment}, required of all implementations and
--- 152,160 ----
  @code{<iso646.h>}; since C99, also those in @code{<stdbool.h>} and
  @code{<stdint.h>}; and since C11, also those in @code{<stdalign.h>}
  and @code{<stdnoreturn.h>}.  In addition, complex types, added in C99, are not
! required for freestanding implementations.  Since C23, freestanding
! implementations are required to support a larger range of library
! facilities, including some functions from other headers.
  
  The standard also defines two environments for programs, a
  @dfn{freestanding environment}, required of all implementations and
*************** a program using the facilities of an
*** 167,179 ****
  operating system is an example of a program running in a hosted environment.
  
  @opindex ffreestanding
! GCC aims towards being usable as a conforming freestanding
! implementation, or as the compiler for a conforming hosted
! implementation.  By default, it acts as the compiler for a hosted
  implementation, defining @code{__STDC_HOSTED__} as @code{1} and
  presuming that when the names of ISO C functions are used, they have
! the semantics defined in the standard.  To make it act as a conforming
! freestanding implementation for a freestanding environment, use the
  option @option{-ffreestanding}; it then defines
  @code{__STDC_HOSTED__} to @code{0} and does not make assumptions about the
  meanings of function names from the standard library, with exceptions
--- 169,181 ----
  operating system is an example of a program running in a hosted environment.
  
  @opindex ffreestanding
! GCC aims towards being usable as the compiler for a conforming
! freestanding or hosted implementation.
! By default, it acts as the compiler for a hosted
  implementation, defining @code{__STDC_HOSTED__} as @code{1} and
  presuming that when the names of ISO C functions are used, they have
! the semantics defined in the standard.  To make it act as the compiler
! for a freestanding environment, use the
  option @option{-ffreestanding}; it then defines
  @code{__STDC_HOSTED__} to @code{0} and does not make assumptions about the
  meanings of function names from the standard library, with exceptions
*************** noted below.  To build an OS kernel, you
*** 181,192 ****
  your own arrangements for linking and startup.
  @xref{C Dialect Options,,Options Controlling C Dialect}.
  
! GCC does not provide the library facilities required only of hosted
! implementations, nor yet all the facilities required by C99 of
! freestanding implementations on all platforms.  
! To use the facilities of a hosted
! environment, you need to find them elsewhere (for example, in the
! GNU C library).  @xref{Standard Libraries,,Standard Libraries}.
  
  Most of the compiler support routines used by GCC are present in
  @file{libgcc}, but there are a few exceptions.  GCC requires the
--- 183,206 ----
  your own arrangements for linking and startup.
  @xref{C Dialect Options,,Options Controlling C Dialect}.
  
! GCC generally provides library facilities in headers that do not
! declare functions with external linkage (which includes the headers
! required by C11 and before to be provided by freestanding
! implementations), but not those included in other headers.
! Additionally, GCC provides @code{<stdatomic.h>}, even though it
! declares some functions with external linkage (which are provided in
! @code{libatomic}).  On a few platforms, some of the headers not
! declaring functions with external linkage are instead obtained from
! the OS's C library, which may mean that they lack support for features
! from more recent versions of the C standard that are supported in
! GCC's own versions of those headers.  On some platforms, GCC provides
! @code{<tgmath.h>} (but this implementation does not support interfaces
! added in C23).
! 
! To use the facilities of a hosted environment, and some of the
! facilities required in a freestanding environment by C23, you need to
! find them elsewhere (for example, in the GNU C library).
! @xref{Standard Libraries,,Standard Libraries}.
  
  Most of the compiler support routines used by GCC are present in
  @file{libgcc}, but there are a few exceptions.  GCC requires the
diff -Nrcpad gcc-16-20250525/gcc/doc/trouble.texi gcc-16-20250601/gcc/doc/trouble.texi
*** gcc-16-20250525/gcc/doc/trouble.texi	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/doc/trouble.texi	Sun Jun  1 22:32:14 2025
*************** as to use the proper set, but you'll hav
*** 494,503 ****
  @section Standard Libraries
  
  @opindex Wall
! GCC by itself attempts to be a conforming freestanding implementation.
  @xref{Standards,,Language Standards Supported by GCC}, for details of
! what this means.  Beyond the library facilities required of such an
! implementation, the rest of the C library is supplied by the vendor of
  the operating system.  If that C library doesn't conform to the C
  standards, then your programs might get warnings (especially when using
  @option{-Wall}) that you don't expect.
--- 494,505 ----
  @section Standard Libraries
  
  @opindex Wall
! GCC by itself attempts to provide the compiler part of a conforming
! implementation, but only a limited subset of the library part of such
! an implementation.
  @xref{Standards,,Language Standards Supported by GCC}, for details of
! what this means.  Beyond the limited library facilities described
! there, the rest of the C library is supplied by the vendor of
  the operating system.  If that C library doesn't conform to the C
  standards, then your programs might get warnings (especially when using
  @option{-Wall}) that you don't expect.
diff -Nrcpad gcc-16-20250525/gcc/fold-const.cc gcc-16-20250601/gcc/fold-const.cc
*** gcc-16-20250525/gcc/fold-const.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/fold-const.cc	Sun Jun  1 22:32:14 2025
*************** simple_operand_p (const_tree exp)
*** 5085,5090 ****
--- 5085,5095 ----
  		 #pragma weak, etc).  */
  	      && ! TREE_PUBLIC (exp)
  	      && ! DECL_EXTERNAL (exp)
+ 	      /* DECL_VALUE_EXPR will expand to something non-simple.  */
+ 	      && ! ((VAR_P (exp)
+ 		     || TREE_CODE (exp) == PARM_DECL
+ 		     || TREE_CODE (exp) == RESULT_DECL)
+ 		    && DECL_HAS_VALUE_EXPR_P (exp))
  	      /* Weakrefs are not safe to be read, since they can be NULL.
   		 They are !TREE_PUBLIC && !DECL_EXTERNAL but still
  		 have DECL_WEAK flag set.  */
diff -Nrcpad gcc-16-20250525/gcc/fortran/ChangeLog gcc-16-20250601/gcc/fortran/ChangeLog
*** gcc-16-20250525/gcc/fortran/ChangeLog	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/fortran/ChangeLog	Sun Jun  1 22:32:14 2025
***************
*** 1,3 ****
--- 1,105 ----
+ 2025-05-30  Harald Anlauf  <anlauf@gmx.de>
+ 
+ 	PR fortran/102599
+ 	PR fortran/114022
+ 	* expr.cc (simplify_complex_array_inquiry_ref): Helper function for
+ 	simplification of inquiry references (%re/%im) of constant complex
+ 	arrays.
+ 	(find_inquiry_ref): Use it for handling %re/%im inquiry references
+ 	of complex arrays.
+ 	(scalarize_intrinsic_call): Fix frontend memleak.
+ 	* primary.cc (gfc_match_varspec): When the reference is NULL, the
+ 	previous simplification has succeeded in evaluating inquiry
+ 	references also of arrays.
+ 
+ 2025-05-30  Thomas Koenig  <tkoenig@gcc.gnu.org>
+ 
+ 	PR fortran/120355
+ 	* interface.cc (compare_parameter): If the global function has a
+ 	result clause, take typespec from there for the comparison against
+ 	the dummy argument.
+ 
+ 2025-05-30  Julian Brown  <julian@codesourcery.com>
+ 	    Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* parse.cc (tree.h, fold-const.h, tree-hash-traits.h): Add includes
+ 	(for additions to omp-general.h).
+ 
+ 2025-05-29  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+ 
+ 	PR fortran/120049
+ 	* check.cc(check_c_ptr_2): Rephrase error message
+ 	for clarity.
+ 
+ 2025-05-28  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	PR fortran/113152
+ 	* simplify.cc (gfc_simplify_cospi, gfc_simplify_sinpi): Avoid using
+ 	mpfr_fmod_ui in the MPFR < 4.2.0 version.
+ 
+ 2025-05-28  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+ 
+ 	PR fortran/119856
+ 	* io.cc: Set missing comma error checks to STD_STD_LEGACY.
+ 
+ 2025-05-28  Yuao Ma  <c8ef@outlook.com>
+ 	    Steven G. Kargl  <kargl@gcc.gnu.org>
+ 
+ 	PR fortran/113152
+ 	* gfortran.h (enum gfc_isym_id): Add new enum.
+ 	* intrinsic.cc (add_functions): Register new intrinsics. Changing the call
+ 	from gfc_resolve_trigd{,2} to gfc_resolve_trig{,2}.
+ 	* intrinsic.h (gfc_simplify_acospi, gfc_simplify_asinpi,
+ 	gfc_simplify_asinpi, gfc_simplify_atanpi, gfc_simplify_atan2pi,
+ 	gfc_simplify_cospi, gfc_simplify_sinpi, gfc_simplify_tanpi): New.
+ 	(gfc_resolve_trig): Rename from gfc_resolve_trigd.
+ 	(gfc_resolve_trig2): Rename from gfc_resolve_trigd2.
+ 	* iresolve.cc (gfc_resolve_trig): Rename from gfc_resolve_trigd.
+ 	(gfc_resolve_trig2): Rename from gfc_resolve_trigd2.
+ 	* mathbuiltins.def: Add 7 new math builtins and re-align.
+ 	* simplify.cc (gfc_simplify_acos, gfc_simplify_asin,
+ 	gfc_simplify_acosd, gfc_simplify_asind): Revise error message.
+ 	(gfc_simplify_acospi, gfc_simplify_asinpi,
+ 	gfc_simplify_asinpi, gfc_simplify_atanpi, gfc_simplify_atan2pi,
+ 	gfc_simplify_cospi, gfc_simplify_sinpi, gfc_simplify_tanpi): New.
+ 
+ 2025-05-27  Harald Anlauf  <anlauf@gmx.de>
+ 
+ 	PR fortran/101735
+ 	* primary.cc (gfc_match_varspec): Correct order of logic.
+ 
+ 2025-05-27  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+ 
+ 	PR fortran/120049
+ 	* check.cc (gfc_check_c_associated): Use new helper functions.
+ 	Only call check_c_ptr_1 if optional c_ptr_2 tests succeed.
+ 	(check_c_ptr_1): Handle only c_ptr_1 checks.
+ 	(check_c_ptr_2): Expand checks for c_ptr_2 and handle cases
+ 	where there is no derived pointer in the gfc_expr and check
+ 	the inmod_sym_id only if it exists.
+ 	* misc.cc (gfc_typename): Handle the case for BT_VOID rather
+ 	than throw an internal error.
+ 
+ 2025-05-27  Harald Anlauf  <anlauf@gmx.de>
+ 
+ 	PR fortran/101735
+ 	* expr.cc (find_inquiry_ref): If an inquiry reference applies to
+ 	a substring, use that, and calculate substring length if needed.
+ 	* primary.cc (extend_ref): Also handle attaching to end of
+ 	reference chain for appending.
+ 	(gfc_match_varspec): Discrimate between arrays of character and
+ 	substrings of them.  If a substring is taken from a character
+ 	component of a derived type, get the proper typespec so that
+ 	inquiry references work correctly.
+ 	(gfc_match_rvalue): Handle corner case where we hit a seemingly
+ 	dangling '%' and missed an inquiry reference. Try another match.
+ 
+ 2025-05-27  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR other/116792
+ 	* error.cc (gfc_diagnostic_start_span): Update for diagnostic.h
+ 	changes.
+ 
  2025-05-19  Harald Anlauf  <anlauf@gmx.de>
  
  	PR fortran/120099
diff -Nrcpad gcc-16-20250525/gcc/fortran/check.cc gcc-16-20250601/gcc/fortran/check.cc
*** gcc-16-20250525/gcc/fortran/check.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/fortran/check.cc	Sun Jun  1 22:32:14 2025
*************** gfc_check_c_sizeof (gfc_expr *arg)
*** 5952,6000 ****
  }
  
  
! bool
! gfc_check_c_associated (gfc_expr *c_ptr_1, gfc_expr *c_ptr_2)
  {
!   if (c_ptr_1)
!     {
!       if (c_ptr_1->expr_type == EXPR_FUNCTION && c_ptr_1->ts.type == BT_VOID)
! 	return true;
  
!       if (c_ptr_1->ts.type != BT_DERIVED
! 	  || c_ptr_1->ts.u.derived->from_intmod != INTMOD_ISO_C_BINDING
! 	  || (c_ptr_1->ts.u.derived->intmod_sym_id != ISOCBINDING_PTR
! 	      && c_ptr_1->ts.u.derived->intmod_sym_id != ISOCBINDING_FUNPTR))
! 	{
! 	  gfc_error ("Argument C_PTR_1 at %L to C_ASSOCIATED shall have the "
! 		     "type TYPE(C_PTR) or TYPE(C_FUNPTR)", &c_ptr_1->where);
! 	  return false;
! 	}
!     }
  
!   if (!scalar_check (c_ptr_1, 0))
      return false;
  
!   if (c_ptr_2)
!     {
!       if (c_ptr_2->expr_type == EXPR_FUNCTION && c_ptr_2->ts.type == BT_VOID)
! 	return true;
  
!       if (c_ptr_2->ts.type != BT_DERIVED
! 	  || c_ptr_2->ts.u.derived->from_intmod != INTMOD_ISO_C_BINDING
! 	  || (c_ptr_1->ts.u.derived->intmod_sym_id
! 	      != c_ptr_2->ts.u.derived->intmod_sym_id))
  	{
! 	  gfc_error ("Argument C_PTR_2 at %L to C_ASSOCIATED shall have the "
! 		   "same type as C_PTR_1: %s instead of %s", &c_ptr_1->where,
! 		   gfc_typename (&c_ptr_1->ts), gfc_typename (&c_ptr_2->ts));
! 	  return false;
  	}
!     }
  
!   if (c_ptr_2 && !scalar_check (c_ptr_2, 1))
      return false;
  
!   return true;
  }
  
  
--- 5952,6061 ----
  }
  
  
! /* Helper functions check_c_ptr_1 and check_c_ptr_2
!    used in gfc_check_c_associated.  */
! 
! static inline
! bool check_c_ptr_1 (gfc_expr *c_ptr_1)
  {
!   if ((c_ptr_1->ts.type == BT_VOID)
!       && (c_ptr_1->expr_type == EXPR_FUNCTION))
!     return true;
  
!   if (c_ptr_1->ts.type != BT_DERIVED
!       || c_ptr_1->ts.u.derived->from_intmod != INTMOD_ISO_C_BINDING
!       || (c_ptr_1->ts.u.derived->intmod_sym_id != ISOCBINDING_PTR
! 	  && c_ptr_1->ts.u.derived->intmod_sym_id != ISOCBINDING_FUNPTR))
! 	goto check_1_error;
  
!   if ((c_ptr_1->ts.type == BT_DERIVED)
!        && (c_ptr_1->expr_type == EXPR_STRUCTURE)
!        && (c_ptr_1->ts.u.derived->intmod_sym_id
! 	   == ISOCBINDING_NULL_FUNPTR))
!     goto check_1_error;
! 
!   if (scalar_check (c_ptr_1, 0))
!     return true;
!   else
!     /*  Return since the check_1_error message may not apply here. */
      return false;
  
! check_1_error:
  
!   gfc_error ("Argument C_PTR_1 at %L to C_ASSOCIATED shall have the "
! 	     "type TYPE(C_PTR) or TYPE(C_FUNPTR)", &c_ptr_1->where);
!   return false;
! }
! 
! static inline
! bool check_c_ptr_2 (gfc_expr *c_ptr_1, gfc_expr *c_ptr_2)
! {
!   switch (c_ptr_2->ts.type)
!   {
!     case BT_VOID:
!       if (c_ptr_2->expr_type == EXPR_FUNCTION)
  	{
! 	  if ((c_ptr_1->ts.type == BT_DERIVED)
! 	       && c_ptr_1->expr_type == EXPR_STRUCTURE
! 	       && (c_ptr_1->ts.u.derived->intmod_sym_id
! 		  == ISOCBINDING_FUNPTR))
! 	    goto check_2_error;
  	}
!       break;
  
!     case BT_DERIVED:
!       if ((c_ptr_2->expr_type == EXPR_STRUCTURE)
! 	   && (c_ptr_2->ts.u.derived->intmod_sym_id == ISOCBINDING_PTR)
! 	   && (c_ptr_1->ts.type == BT_VOID)
! 	   && (c_ptr_1->expr_type == EXPR_FUNCTION))
! 	return scalar_check (c_ptr_2, 1);
! 
!       if ((c_ptr_2->expr_type == EXPR_STRUCTURE)
! 	   && (c_ptr_1->ts.type == BT_VOID)
! 	   && (c_ptr_1->expr_type == EXPR_FUNCTION))
! 	goto check_2_error;
! 
!       if (c_ptr_2->ts.u.derived->from_intmod != INTMOD_ISO_C_BINDING)
! 	goto check_2_error;
! 
!       if (c_ptr_1->ts.type == BT_DERIVED
! 	  && (c_ptr_1->ts.u.derived->intmod_sym_id
! 	      != c_ptr_2->ts.u.derived->intmod_sym_id))
! 	goto check_2_error;
!       break;
! 
!     default:
!       goto check_2_error;
!   }
! 
!   if (scalar_check (c_ptr_2, 1))
!     return true;
!   else
!     /*  Return since the check_2_error message may not apply here. */
      return false;
  
! check_2_error:
! 
!   gfc_error ("Argument C_PTR_2 at %L to C_ASSOCIATED shall have the "
! 	     "same type as C_PTR_1, found %s instead of %s", &c_ptr_2->where,
! 	     gfc_typename (&c_ptr_2->ts), gfc_typename (&c_ptr_1->ts));
! 
!   return false;
!  }
! 
! 
! bool
! gfc_check_c_associated (gfc_expr *c_ptr_1, gfc_expr *c_ptr_2)
! {
!   if (c_ptr_2)
!     {
!       if (check_c_ptr_2 (c_ptr_1, c_ptr_2))
! 	return check_c_ptr_1 (c_ptr_1);
!       else
! 	return false;
!     }
!   else
!     return check_c_ptr_1 (c_ptr_1);
  }
  
  
diff -Nrcpad gcc-16-20250525/gcc/fortran/error.cc gcc-16-20250601/gcc/fortran/error.cc
*** gcc-16-20250525/gcc/fortran/error.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/fortran/error.cc	Sun Jun  1 22:32:14 2025
*************** gfc_diagnostic_text_starter (diagnostic_
*** 618,626 ****
  
  static void
  gfc_diagnostic_start_span (const diagnostic_location_print_policy &loc_policy,
! 			   pretty_printer *pp,
  			   expanded_location exploc)
  {
    const bool colorize = pp_show_color (pp);
    char *locus_prefix
      = gfc_diagnostic_build_locus_prefix (loc_policy, exploc, colorize);
--- 618,627 ----
  
  static void
  gfc_diagnostic_start_span (const diagnostic_location_print_policy &loc_policy,
! 			   to_text &sink,
  			   expanded_location exploc)
  {
+   pretty_printer *pp = get_printer (sink);
    const bool colorize = pp_show_color (pp);
    char *locus_prefix
      = gfc_diagnostic_build_locus_prefix (loc_policy, exploc, colorize);
diff -Nrcpad gcc-16-20250525/gcc/fortran/expr.cc gcc-16-20250601/gcc/fortran/expr.cc
*** gcc-16-20250525/gcc/fortran/expr.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/fortran/expr.cc	Sun Jun  1 22:32:14 2025
*************** find_substring_ref (gfc_expr *p, gfc_exp
*** 1838,1843 ****
--- 1838,1892 ----
  }
  
  
+ /* Simplify inquiry references (%re/%im) of constant complex arrays.
+    Used by find_inquiry_ref.  */
+ 
+ static gfc_expr *
+ simplify_complex_array_inquiry_ref (gfc_expr *p, inquiry_type inquiry)
+ {
+   gfc_expr *e, *r, *result;
+   gfc_constructor_base base;
+   gfc_constructor *c;
+ 
+   if ((inquiry != INQUIRY_RE && inquiry != INQUIRY_IM)
+       || p->expr_type != EXPR_ARRAY
+       || p->ts.type != BT_COMPLEX
+       || p->rank <= 0
+       || p->value.constructor == NULL
+       || !gfc_is_constant_array_expr (p))
+     return NULL;
+ 
+   /* Simplify array sections.  */
+   gfc_simplify_expr (p, 0);
+ 
+   result = gfc_get_array_expr (BT_REAL, p->ts.kind, &p->where);
+   result->rank = p->rank;
+   result->shape = gfc_copy_shape (p->shape, p->rank);
+ 
+   base = p->value.constructor;
+   for (c = gfc_constructor_first (base); c; c = gfc_constructor_next (c))
+     {
+       e = c->expr;
+       if (e->expr_type != EXPR_CONSTANT)
+ 	goto fail;
+ 
+       r = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
+       if (inquiry == INQUIRY_RE)
+ 	mpfr_set (r->value.real, mpc_realref (e->value.complex), GFC_RND_MODE);
+       else
+ 	mpfr_set (r->value.real, mpc_imagref (e->value.complex), GFC_RND_MODE);
+ 
+       gfc_constructor_append_expr (&result->value.constructor, r, &e->where);
+     }
+ 
+   return result;
+ 
+ fail:
+   gfc_free_expr (result);
+   return NULL;
+ }
+ 
+ 
  /* Pull an inquiry result out of an expression.  */
  
  static bool
*************** find_inquiry_ref (gfc_expr *p, gfc_expr
*** 1846,1852 ****
--- 1895,1903 ----
    gfc_ref *ref;
    gfc_ref *inquiry = NULL;
    gfc_ref *inquiry_head;
+   gfc_ref *ref_ss = NULL;
    gfc_expr *tmp;
+   bool nofail = false;
  
    tmp = gfc_copy_expr (p);
  
*************** find_inquiry_ref (gfc_expr *p, gfc_expr
*** 1862,1867 ****
--- 1913,1921 ----
  	  {
  	    inquiry = ref->next;
  	    ref->next = NULL;
+ 	    if (ref->type == REF_SUBSTRING)
+ 	      ref_ss = ref;
+ 	    break;
  	  }
      }
  
*************** find_inquiry_ref (gfc_expr *p, gfc_expr
*** 1891,1896 ****
--- 1945,1972 ----
  	  if (!gfc_notify_std (GFC_STD_F2003, "LEN part_ref at %C"))
  	    goto cleanup;
  
+ 	  /* Inquire length of substring?  */
+ 	  if (ref_ss)
+ 	    {
+ 	      if (ref_ss->u.ss.start->expr_type == EXPR_CONSTANT
+ 		  && ref_ss->u.ss.end->expr_type == EXPR_CONSTANT)
+ 		{
+ 		  HOST_WIDE_INT istart, iend, length;
+ 		  istart = gfc_mpz_get_hwi (ref_ss->u.ss.start->value.integer);
+ 		  iend = gfc_mpz_get_hwi (ref_ss->u.ss.end->value.integer);
+ 
+ 		  if (istart <= iend)
+ 		    length = iend - istart + 1;
+ 		  else
+ 		    length = 0;
+ 		  *newp = gfc_get_int_expr (gfc_default_integer_kind,
+ 					    NULL, length);
+ 		  break;
+ 		}
+ 	      else
+ 		goto cleanup;
+ 	    }
+ 
  	  if (tmp->ts.u.cl->length
  	      && tmp->ts.u.cl->length->expr_type == EXPR_CONSTANT)
  	    *newp = gfc_copy_expr (tmp->ts.u.cl->length);
*************** find_inquiry_ref (gfc_expr *p, gfc_expr
*** 1921,1944 ****
  	  break;
  
  	case INQUIRY_RE:
! 	  if (tmp->ts.type != BT_COMPLEX || tmp->expr_type != EXPR_CONSTANT)
  	    goto cleanup;
  
  	  if (!gfc_notify_std (GFC_STD_F2008, "RE part_ref at %C"))
  	    goto cleanup;
  
  	  *newp = gfc_get_constant_expr (BT_REAL, tmp->ts.kind, &tmp->where);
  	  mpfr_set ((*newp)->value.real,
  		    mpc_realref (tmp->value.complex), GFC_RND_MODE);
  	  break;
  
  	case INQUIRY_IM:
! 	  if (tmp->ts.type != BT_COMPLEX || tmp->expr_type != EXPR_CONSTANT)
  	    goto cleanup;
  
  	  if (!gfc_notify_std (GFC_STD_F2008, "IM part_ref at %C"))
  	    goto cleanup;
  
  	  *newp = gfc_get_constant_expr (BT_REAL, tmp->ts.kind, &tmp->where);
  	  mpfr_set ((*newp)->value.real,
  		    mpc_imagref (tmp->value.complex), GFC_RND_MODE);
--- 1997,2046 ----
  	  break;
  
  	case INQUIRY_RE:
! 	  if (tmp->ts.type != BT_COMPLEX)
  	    goto cleanup;
  
  	  if (!gfc_notify_std (GFC_STD_F2008, "RE part_ref at %C"))
  	    goto cleanup;
  
+ 	  if (tmp->expr_type == EXPR_ARRAY)
+ 	    {
+ 	      *newp = simplify_complex_array_inquiry_ref (tmp, INQUIRY_RE);
+ 	      if (*newp != NULL)
+ 		{
+ 		  nofail = true;
+ 		  break;
+ 		}
+ 	    }
+ 
+ 	  if (tmp->expr_type != EXPR_CONSTANT)
+ 	    goto cleanup;
+ 
  	  *newp = gfc_get_constant_expr (BT_REAL, tmp->ts.kind, &tmp->where);
  	  mpfr_set ((*newp)->value.real,
  		    mpc_realref (tmp->value.complex), GFC_RND_MODE);
  	  break;
  
  	case INQUIRY_IM:
! 	  if (tmp->ts.type != BT_COMPLEX)
  	    goto cleanup;
  
  	  if (!gfc_notify_std (GFC_STD_F2008, "IM part_ref at %C"))
  	    goto cleanup;
  
+ 	  if (tmp->expr_type == EXPR_ARRAY)
+ 	    {
+ 	      *newp = simplify_complex_array_inquiry_ref (tmp, INQUIRY_IM);
+ 	      if (*newp != NULL)
+ 		{
+ 		  nofail = true;
+ 		  break;
+ 		}
+ 	    }
+ 
+ 	  if (tmp->expr_type != EXPR_CONSTANT)
+ 	    goto cleanup;
+ 
  	  *newp = gfc_get_constant_expr (BT_REAL, tmp->ts.kind, &tmp->where);
  	  mpfr_set ((*newp)->value.real,
  		    mpc_imagref (tmp->value.complex), GFC_RND_MODE);
*************** find_inquiry_ref (gfc_expr *p, gfc_expr
*** 1951,1957 ****
  
    if (!(*newp))
      goto cleanup;
!   else if ((*newp)->expr_type != EXPR_CONSTANT)
      {
        gfc_free_expr (*newp);
        goto cleanup;
--- 2053,2059 ----
  
    if (!(*newp))
      goto cleanup;
!   else if ((*newp)->expr_type != EXPR_CONSTANT && !nofail)
      {
        gfc_free_expr (*newp);
        goto cleanup;
*************** scalarize_intrinsic_call (gfc_expr *e, b
*** 2523,2529 ****
  	    rank[n] = a->expr->rank;
  	  else
  	    rank[n] = 1;
! 	  ctor = gfc_constructor_copy (a->expr->value.constructor);
  	  args[n] = gfc_constructor_first (ctor);
  	}
        else
--- 2625,2631 ----
  	    rank[n] = a->expr->rank;
  	  else
  	    rank[n] = 1;
! 	  ctor = a->expr->value.constructor;
  	  args[n] = gfc_constructor_first (ctor);
  	}
        else
diff -Nrcpad gcc-16-20250525/gcc/fortran/gfortran.h gcc-16-20250601/gcc/fortran/gfortran.h
*** gcc-16-20250525/gcc/fortran/gfortran.h	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/fortran/gfortran.h	Sun Jun  1 22:32:14 2025
*************** enum gfc_isym_id
*** 721,726 ****
--- 721,734 ----
       remains compatible.  */
    GFC_ISYM_SU_KIND,
    GFC_ISYM_UINT,
+ 
+   GFC_ISYM_ACOSPI,
+   GFC_ISYM_ASINPI,
+   GFC_ISYM_ATANPI,
+   GFC_ISYM_ATAN2PI,
+   GFC_ISYM_COSPI,
+   GFC_ISYM_SINPI,
+   GFC_ISYM_TANPI,
  };
  
  enum init_local_logical
diff -Nrcpad gcc-16-20250525/gcc/fortran/interface.cc gcc-16-20250601/gcc/fortran/interface.cc
*** gcc-16-20250525/gcc/fortran/interface.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/fortran/interface.cc	Sun Jun  1 22:32:14 2025
*************** compare_parameter (gfc_symbol *formal, g
*** 2547,2553 ****
  			}
  		      else if (formal->attr.function)
  			{
! 			  if (!gfc_compare_types (&global_asym->ts,
  						  &formal->ts))
  			    {
  			      gfc_error ("Type mismatch at %L passing global "
--- 2547,2560 ----
  			}
  		      else if (formal->attr.function)
  			{
! 			  gfc_typespec ts;
! 
! 			  if (global_asym->result)
! 			    ts = global_asym->result->ts;
! 			  else
! 			    ts = global_asym->ts;
! 
! 			  if (!gfc_compare_types (&ts,
  						  &formal->ts))
  			    {
  			      gfc_error ("Type mismatch at %L passing global "
diff -Nrcpad gcc-16-20250525/gcc/fortran/intrinsic.cc gcc-16-20250601/gcc/fortran/intrinsic.cc
*** gcc-16-20250525/gcc/fortran/intrinsic.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/fortran/intrinsic.cc	Sun Jun  1 22:32:14 2025
*************** add_functions (void)
*** 3452,3488 ****
  
    add_sym_1 ("acosd", GFC_ISYM_ACOSD, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dr, GFC_STD_F2023,
! 	     gfc_check_fn_r, gfc_simplify_acosd, gfc_resolve_trigd,
  	     x, BT_REAL, dr, REQUIRED);
  
    make_generic ("acosd", GFC_ISYM_ACOSD, GFC_STD_F2023);
  
    add_sym_1 ("dacosd", GFC_ISYM_ACOSD, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dd, GFC_STD_GNU,
! 	     gfc_check_fn_d, gfc_simplify_acosd, gfc_resolve_trigd,
  	     x, BT_REAL, dd, REQUIRED);
  
    add_sym_1 ("asind", GFC_ISYM_ASIND, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dr, GFC_STD_F2023,
! 	     gfc_check_fn_r, gfc_simplify_asind, gfc_resolve_trigd,
  	     x, BT_REAL, dr, REQUIRED);
  
    make_generic ("asind", GFC_ISYM_ASIND, GFC_STD_F2023);
  
    add_sym_1 ("dasind", GFC_ISYM_ASIND, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dd, GFC_STD_GNU,
! 	     gfc_check_fn_d, gfc_simplify_asind, gfc_resolve_trigd,
  	     x, BT_REAL, dd, REQUIRED);
  
    add_sym_1 ("atand", GFC_ISYM_ATAND, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dr, GFC_STD_F2023,
! 	     gfc_check_fn_r, gfc_simplify_atand, gfc_resolve_trigd,
  	     x, BT_REAL, dr, REQUIRED);
  
    /* Two-argument version of atand, equivalent to atan2d.  */
    add_sym_2 ("atand", GFC_ISYM_ATAN2D, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dr, GFC_STD_F2023,
! 	     gfc_check_atan2, gfc_simplify_atan2d, gfc_resolve_trigd2,
  	     y, BT_REAL, dr, REQUIRED,
  	     x, BT_REAL, dr, REQUIRED);
  
--- 3452,3488 ----
  
    add_sym_1 ("acosd", GFC_ISYM_ACOSD, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dr, GFC_STD_F2023,
! 	     gfc_check_fn_r, gfc_simplify_acosd, gfc_resolve_trig,
  	     x, BT_REAL, dr, REQUIRED);
  
    make_generic ("acosd", GFC_ISYM_ACOSD, GFC_STD_F2023);
  
    add_sym_1 ("dacosd", GFC_ISYM_ACOSD, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dd, GFC_STD_GNU,
! 	     gfc_check_fn_d, gfc_simplify_acosd, gfc_resolve_trig,
  	     x, BT_REAL, dd, REQUIRED);
  
    add_sym_1 ("asind", GFC_ISYM_ASIND, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dr, GFC_STD_F2023,
! 	     gfc_check_fn_r, gfc_simplify_asind, gfc_resolve_trig,
  	     x, BT_REAL, dr, REQUIRED);
  
    make_generic ("asind", GFC_ISYM_ASIND, GFC_STD_F2023);
  
    add_sym_1 ("dasind", GFC_ISYM_ASIND, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dd, GFC_STD_GNU,
! 	     gfc_check_fn_d, gfc_simplify_asind, gfc_resolve_trig,
  	     x, BT_REAL, dd, REQUIRED);
  
    add_sym_1 ("atand", GFC_ISYM_ATAND, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dr, GFC_STD_F2023,
! 	     gfc_check_fn_r, gfc_simplify_atand, gfc_resolve_trig,
  	     x, BT_REAL, dr, REQUIRED);
  
    /* Two-argument version of atand, equivalent to atan2d.  */
    add_sym_2 ("atand", GFC_ISYM_ATAN2D, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dr, GFC_STD_F2023,
! 	     gfc_check_atan2, gfc_simplify_atan2d, gfc_resolve_trig2,
  	     y, BT_REAL, dr, REQUIRED,
  	     x, BT_REAL, dr, REQUIRED);
  
*************** add_functions (void)
*** 3490,3501 ****
  
    add_sym_1 ("datand", GFC_ISYM_ATAND, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dd, GFC_STD_GNU,
! 	     gfc_check_fn_d, gfc_simplify_atand, gfc_resolve_trigd,
  	     x, BT_REAL, dd, REQUIRED);
  
    add_sym_2 ("atan2d", GFC_ISYM_ATAN2D, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dr, GFC_STD_F2023,
! 	     gfc_check_atan2, gfc_simplify_atan2d, gfc_resolve_trigd2,
  	     y, BT_REAL, dr, REQUIRED,
  	     x, BT_REAL, dr, REQUIRED);
  
--- 3490,3501 ----
  
    add_sym_1 ("datand", GFC_ISYM_ATAND, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dd, GFC_STD_GNU,
! 	     gfc_check_fn_d, gfc_simplify_atand, gfc_resolve_trig,
  	     x, BT_REAL, dd, REQUIRED);
  
    add_sym_2 ("atan2d", GFC_ISYM_ATAN2D, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dr, GFC_STD_F2023,
! 	     gfc_check_atan2, gfc_simplify_atan2d, gfc_resolve_trig2,
  	     y, BT_REAL, dr, REQUIRED,
  	     x, BT_REAL, dr, REQUIRED);
  
*************** add_functions (void)
*** 3503,3580 ****
  
    add_sym_2 ("datan2d", GFC_ISYM_ATAN2D, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dd, GFC_STD_GNU,
! 	     gfc_check_datan2, gfc_simplify_atan2d, gfc_resolve_trigd2,
  	     y, BT_REAL, dd, REQUIRED,
  	     x, BT_REAL, dd, REQUIRED);
  
    add_sym_1 ("cosd", GFC_ISYM_COSD, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dr, GFC_STD_F2023,
! 	     gfc_check_fn_r, gfc_simplify_cosd, gfc_resolve_trigd,
  	     x, BT_REAL, dr, REQUIRED);
  
    make_generic ("cosd", GFC_ISYM_COSD, GFC_STD_F2023);
  
    add_sym_1 ("dcosd", GFC_ISYM_COSD, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dd, GFC_STD_GNU,
! 	     gfc_check_fn_d, gfc_simplify_cosd, gfc_resolve_trigd,
  	     x, BT_REAL, dd, REQUIRED);
  
    add_sym_1 ("cotan", GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dr, GFC_STD_GNU,
! 	     gfc_check_fn_rc2008, gfc_simplify_cotan, gfc_resolve_trigd,
  	     x, BT_REAL, dr, REQUIRED);
  
    add_sym_1 ("dcotan", GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dd, GFC_STD_GNU,
! 	     gfc_check_fn_d, gfc_simplify_cotan, gfc_resolve_trigd,
  	     x, BT_REAL, dd, REQUIRED);
  
    add_sym_1 ("ccotan", GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_COMPLEX, dz, GFC_STD_GNU,
! 	     NULL, gfc_simplify_cotan, gfc_resolve_trigd,
  	     x, BT_COMPLEX, dz, REQUIRED);
  
    add_sym_1 ("zcotan", GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_COMPLEX, dd, GFC_STD_GNU,
! 	     NULL, gfc_simplify_cotan, gfc_resolve_trigd,
  	     x, BT_COMPLEX, dd, REQUIRED);
  
    make_generic ("cotan", GFC_ISYM_COTAN, GFC_STD_GNU);
  
    add_sym_1 ("cotand", GFC_ISYM_COTAND, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dr, GFC_STD_GNU,
! 	     gfc_check_fn_r, gfc_simplify_cotand, gfc_resolve_trigd,
  	     x, BT_REAL, dr, REQUIRED);
  
    add_sym_1 ("dcotand", GFC_ISYM_COTAND, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dd, GFC_STD_GNU,
! 	     gfc_check_fn_d, gfc_simplify_cotand, gfc_resolve_trigd,
  	     x, BT_REAL, dd, REQUIRED);
  
    make_generic ("cotand", GFC_ISYM_COTAND, GFC_STD_GNU);
  
    add_sym_1 ("sind", GFC_ISYM_SIND, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dr, GFC_STD_F2023,
! 	     gfc_check_fn_r, gfc_simplify_sind, gfc_resolve_trigd,
  	     x, BT_REAL, dr, REQUIRED);
  
    make_generic ("sind", GFC_ISYM_SIND, GFC_STD_F2023);
  
    add_sym_1 ("dsind", GFC_ISYM_SIND, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dd, GFC_STD_GNU,
! 	     gfc_check_fn_d, gfc_simplify_sind, gfc_resolve_trigd,
  	     x, BT_REAL, dd, REQUIRED);
  
    add_sym_1 ("tand", GFC_ISYM_TAND, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dr, GFC_STD_F2023,
! 	     gfc_check_fn_r, gfc_simplify_tand, gfc_resolve_trigd,
  	     x, BT_REAL, dr, REQUIRED);
  
    make_generic ("tand", GFC_ISYM_TAND, GFC_STD_F2023);
  
    add_sym_1 ("dtand", GFC_ISYM_TAND, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dd, GFC_STD_GNU,
! 	     gfc_check_fn_d, gfc_simplify_tand, gfc_resolve_trigd,
  	     x, BT_REAL, dd, REQUIRED);
  
    /* The following function is internally used for coarray libray functions.
--- 3503,3580 ----
  
    add_sym_2 ("datan2d", GFC_ISYM_ATAN2D, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dd, GFC_STD_GNU,
! 	     gfc_check_datan2, gfc_simplify_atan2d, gfc_resolve_trig2,
  	     y, BT_REAL, dd, REQUIRED,
  	     x, BT_REAL, dd, REQUIRED);
  
    add_sym_1 ("cosd", GFC_ISYM_COSD, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dr, GFC_STD_F2023,
! 	     gfc_check_fn_r, gfc_simplify_cosd, gfc_resolve_trig,
  	     x, BT_REAL, dr, REQUIRED);
  
    make_generic ("cosd", GFC_ISYM_COSD, GFC_STD_F2023);
  
    add_sym_1 ("dcosd", GFC_ISYM_COSD, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dd, GFC_STD_GNU,
! 	     gfc_check_fn_d, gfc_simplify_cosd, gfc_resolve_trig,
  	     x, BT_REAL, dd, REQUIRED);
  
    add_sym_1 ("cotan", GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dr, GFC_STD_GNU,
! 	     gfc_check_fn_rc2008, gfc_simplify_cotan, gfc_resolve_trig,
  	     x, BT_REAL, dr, REQUIRED);
  
    add_sym_1 ("dcotan", GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dd, GFC_STD_GNU,
! 	     gfc_check_fn_d, gfc_simplify_cotan, gfc_resolve_trig,
  	     x, BT_REAL, dd, REQUIRED);
  
    add_sym_1 ("ccotan", GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_COMPLEX, dz, GFC_STD_GNU,
! 	     NULL, gfc_simplify_cotan, gfc_resolve_trig,
  	     x, BT_COMPLEX, dz, REQUIRED);
  
    add_sym_1 ("zcotan", GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_COMPLEX, dd, GFC_STD_GNU,
! 	     NULL, gfc_simplify_cotan, gfc_resolve_trig,
  	     x, BT_COMPLEX, dd, REQUIRED);
  
    make_generic ("cotan", GFC_ISYM_COTAN, GFC_STD_GNU);
  
    add_sym_1 ("cotand", GFC_ISYM_COTAND, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dr, GFC_STD_GNU,
! 	     gfc_check_fn_r, gfc_simplify_cotand, gfc_resolve_trig,
  	     x, BT_REAL, dr, REQUIRED);
  
    add_sym_1 ("dcotand", GFC_ISYM_COTAND, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dd, GFC_STD_GNU,
! 	     gfc_check_fn_d, gfc_simplify_cotand, gfc_resolve_trig,
  	     x, BT_REAL, dd, REQUIRED);
  
    make_generic ("cotand", GFC_ISYM_COTAND, GFC_STD_GNU);
  
    add_sym_1 ("sind", GFC_ISYM_SIND, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dr, GFC_STD_F2023,
! 	     gfc_check_fn_r, gfc_simplify_sind, gfc_resolve_trig,
  	     x, BT_REAL, dr, REQUIRED);
  
    make_generic ("sind", GFC_ISYM_SIND, GFC_STD_F2023);
  
    add_sym_1 ("dsind", GFC_ISYM_SIND, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dd, GFC_STD_GNU,
! 	     gfc_check_fn_d, gfc_simplify_sind, gfc_resolve_trig,
  	     x, BT_REAL, dd, REQUIRED);
  
    add_sym_1 ("tand", GFC_ISYM_TAND, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dr, GFC_STD_F2023,
! 	     gfc_check_fn_r, gfc_simplify_tand, gfc_resolve_trig,
  	     x, BT_REAL, dr, REQUIRED);
  
    make_generic ("tand", GFC_ISYM_TAND, GFC_STD_F2023);
  
    add_sym_1 ("dtand", GFC_ISYM_TAND, CLASS_ELEMENTAL, ACTUAL_YES,
  	     BT_REAL, dd, GFC_STD_GNU,
! 	     gfc_check_fn_d, gfc_simplify_tand, gfc_resolve_trig,
  	     x, BT_REAL, dd, REQUIRED);
  
    /* The following function is internally used for coarray libray functions.
*************** add_functions (void)
*** 3590,3595 ****
--- 3590,3646 ----
  	     REQUIRED, val, BT_INTEGER, di, REQUIRED, i, BT_INTEGER, di,
  	     REQUIRED);
    make_from_module ();
+ 
+   /* The half-cycle trigonometric functions were added by Fortran 2023.  */
+ 
+   add_sym_1 ("acospi", GFC_ISYM_ACOSPI, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr,
+ 	     GFC_STD_F2023, gfc_check_fn_r, gfc_simplify_acospi,
+ 	     gfc_resolve_trig, x, BT_REAL, dr, REQUIRED);
+ 
+   make_generic ("acospi", GFC_ISYM_ACOSPI, GFC_STD_F2023);
+ 
+   add_sym_1 ("asinpi", GFC_ISYM_ASINPI, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr,
+ 	     GFC_STD_F2023, gfc_check_fn_r, gfc_simplify_asinpi,
+ 	     gfc_resolve_trig, x, BT_REAL, dr, REQUIRED);
+ 
+   make_generic ("asinpi", GFC_ISYM_ASINPI, GFC_STD_F2023);
+ 
+   add_sym_1 ("atanpi", GFC_ISYM_ATANPI, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr,
+ 	     GFC_STD_F2023, gfc_check_fn_r, gfc_simplify_atanpi,
+ 	     gfc_resolve_trig, x, BT_REAL, dr, REQUIRED);
+ 
+   /* Two-argument version of atanpi, equivalent to atan2pi.  */
+   add_sym_2 ("atanpi", GFC_ISYM_ATAN2PI, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL,
+ 	     dr, GFC_STD_F2023, gfc_check_atan2, gfc_simplify_atan2pi,
+ 	     gfc_resolve_trig2, y, BT_REAL, dr, REQUIRED, x, BT_REAL, dr,
+ 	     REQUIRED);
+ 
+   make_generic ("atanpi", GFC_ISYM_ATANPI, GFC_STD_F2023);
+ 
+   add_sym_2 ("atan2pi", GFC_ISYM_ATAN2PI, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL,
+ 	     dr, GFC_STD_F2023, gfc_check_atan2, gfc_simplify_atan2pi,
+ 	     gfc_resolve_trig2, y, BT_REAL, dr, REQUIRED, x, BT_REAL, dr,
+ 	     REQUIRED);
+ 
+   make_generic ("atan2pi", GFC_ISYM_ATAN2PI, GFC_STD_F2023);
+ 
+   add_sym_1 ("cospi", GFC_ISYM_COSPI, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr,
+ 	     GFC_STD_F2023, gfc_check_fn_r, gfc_simplify_cospi,
+ 	     gfc_resolve_trig, x, BT_REAL, dr, REQUIRED);
+ 
+   make_generic ("cospi", GFC_ISYM_COSPI, GFC_STD_F2023);
+ 
+   add_sym_1 ("sinpi", GFC_ISYM_SINPI, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr,
+ 	     GFC_STD_F2023, gfc_check_fn_r, gfc_simplify_sinpi,
+ 	     gfc_resolve_trig, x, BT_REAL, dr, REQUIRED);
+ 
+   make_generic ("sinpi", GFC_ISYM_SINPI, GFC_STD_F2023);
+ 
+   add_sym_1 ("tanpi", GFC_ISYM_TANPI, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr,
+ 	     GFC_STD_F2023, gfc_check_fn_r, gfc_simplify_tanpi,
+ 	     gfc_resolve_trig, x, BT_REAL, dr, REQUIRED);
+ 
+   make_generic ("tanpi", GFC_ISYM_TANPI, GFC_STD_F2023);
  }
  
  
diff -Nrcpad gcc-16-20250525/gcc/fortran/intrinsic.h gcc-16-20250601/gcc/fortran/intrinsic.h
*** gcc-16-20250525/gcc/fortran/intrinsic.h	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/fortran/intrinsic.h	Sun Jun  1 22:32:14 2025
*************** gfc_expr *gfc_simplify_achar (gfc_expr *
*** 246,251 ****
--- 246,252 ----
  gfc_expr *gfc_simplify_acos (gfc_expr *);
  gfc_expr *gfc_simplify_acosd (gfc_expr *);
  gfc_expr *gfc_simplify_acosh (gfc_expr *);
+ gfc_expr *gfc_simplify_acospi (gfc_expr *);
  gfc_expr *gfc_simplify_adjustl (gfc_expr *);
  gfc_expr *gfc_simplify_adjustr (gfc_expr *);
  gfc_expr *gfc_simplify_aimag (gfc_expr *);
*************** gfc_expr *gfc_simplify_and (gfc_expr *,
*** 259,269 ****
--- 260,273 ----
  gfc_expr *gfc_simplify_any (gfc_expr *, gfc_expr *);
  gfc_expr *gfc_simplify_asin (gfc_expr *);
  gfc_expr *gfc_simplify_asinh (gfc_expr *);
+ gfc_expr *gfc_simplify_asinpi (gfc_expr *);
  gfc_expr *gfc_simplify_atan (gfc_expr *);
  gfc_expr *gfc_simplify_atand (gfc_expr *);
  gfc_expr *gfc_simplify_atanh (gfc_expr *);
+ gfc_expr *gfc_simplify_atanpi (gfc_expr *);
  gfc_expr *gfc_simplify_atan2 (gfc_expr *, gfc_expr *);
  gfc_expr *gfc_simplify_atan2d (gfc_expr *, gfc_expr *);
+ gfc_expr *gfc_simplify_atan2pi (gfc_expr *, gfc_expr *);
  gfc_expr *gfc_simplify_bessel_j0 (gfc_expr *);
  gfc_expr *gfc_simplify_bessel_j1 (gfc_expr *);
  gfc_expr *gfc_simplify_bessel_jn (gfc_expr *, gfc_expr *);
*************** gfc_expr *gfc_simplify_conjg (gfc_expr *
*** 288,293 ****
--- 292,298 ----
  gfc_expr *gfc_simplify_cos (gfc_expr *);
  gfc_expr *gfc_simplify_cosd (gfc_expr *);
  gfc_expr *gfc_simplify_cosh (gfc_expr *);
+ gfc_expr *gfc_simplify_cospi (gfc_expr *);
  gfc_expr *gfc_simplify_cotan (gfc_expr *);
  gfc_expr *gfc_simplify_cotand (gfc_expr *);
  gfc_expr *gfc_simplify_count (gfc_expr *, gfc_expr *, gfc_expr *);
*************** gfc_expr *gfc_simplify_shiftr (gfc_expr
*** 421,426 ****
--- 426,432 ----
  gfc_expr *gfc_simplify_sin (gfc_expr *);
  gfc_expr *gfc_simplify_sind (gfc_expr *);
  gfc_expr *gfc_simplify_sinh (gfc_expr *);
+ gfc_expr *gfc_simplify_sinpi (gfc_expr *);
  gfc_expr *gfc_simplify_size (gfc_expr *, gfc_expr *, gfc_expr *);
  gfc_expr *gfc_simplify_sizeof (gfc_expr *);
  gfc_expr *gfc_simplify_storage_size (gfc_expr *, gfc_expr *);
*************** gfc_expr *gfc_simplify_sum (gfc_expr *,
*** 432,437 ****
--- 438,444 ----
  gfc_expr *gfc_simplify_tan (gfc_expr *);
  gfc_expr *gfc_simplify_tand (gfc_expr *);
  gfc_expr *gfc_simplify_tanh (gfc_expr *);
+ gfc_expr *gfc_simplify_tanpi (gfc_expr *);
  gfc_expr *gfc_simplify_this_image (gfc_expr *, gfc_expr *, gfc_expr *);
  gfc_expr *gfc_simplify_tiny (gfc_expr *);
  gfc_expr *gfc_simplify_trailz (gfc_expr *);
*************** void gfc_resolve_time (gfc_expr *);
*** 631,638 ****
  void gfc_resolve_time8 (gfc_expr *);
  void gfc_resolve_transfer (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *);
  void gfc_resolve_transpose (gfc_expr *, gfc_expr *);
! void gfc_resolve_trigd (gfc_expr *, gfc_expr *);
! void gfc_resolve_trigd2 (gfc_expr *, gfc_expr *, gfc_expr *);
  void gfc_resolve_trim (gfc_expr *, gfc_expr *);
  void gfc_resolve_ttynam (gfc_expr *, gfc_expr *);
  void gfc_resolve_ubound (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *);
--- 638,645 ----
  void gfc_resolve_time8 (gfc_expr *);
  void gfc_resolve_transfer (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *);
  void gfc_resolve_transpose (gfc_expr *, gfc_expr *);
! void gfc_resolve_trig (gfc_expr *, gfc_expr *);
! void gfc_resolve_trig2 (gfc_expr *, gfc_expr *, gfc_expr *);
  void gfc_resolve_trim (gfc_expr *, gfc_expr *);
  void gfc_resolve_ttynam (gfc_expr *, gfc_expr *);
  void gfc_resolve_ubound (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *);
diff -Nrcpad gcc-16-20250525/gcc/fortran/io.cc gcc-16-20250601/gcc/fortran/io.cc
*** gcc-16-20250525/gcc/fortran/io.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/fortran/io.cc	Sun Jun  1 22:32:14 2025
*************** between_desc:
*** 1228,1234 ****
      default:
        if (mode != MODE_FORMAT)
  	format_locus.nextc += format_string_pos - 1;
!       if (!gfc_notify_std (GFC_STD_GNU, "Missing comma at %L", &format_locus))
  	return false;
        /* If we do not actually return a failure, we need to unwind this
           before the next round.  */
--- 1228,1235 ----
      default:
        if (mode != MODE_FORMAT)
  	format_locus.nextc += format_string_pos - 1;
!       if (!gfc_notify_std (GFC_STD_LEGACY,
! 	  "Missing comma in FORMAT string at %L", &format_locus))
  	return false;
        /* If we do not actually return a failure, we need to unwind this
           before the next round.  */
*************** extension_optional_comma:
*** 1290,1296 ****
      default:
        if (mode != MODE_FORMAT)
  	format_locus.nextc += format_string_pos;
!       if (!gfc_notify_std (GFC_STD_GNU, "Missing comma at %L", &format_locus))
  	return false;
        /* If we do not actually return a failure, we need to unwind this
           before the next round.  */
--- 1291,1298 ----
      default:
        if (mode != MODE_FORMAT)
  	format_locus.nextc += format_string_pos;
!       if (!gfc_notify_std (GFC_STD_LEGACY,
! 	  "Missing comma in FORMAT string at %L", &format_locus))
  	return false;
        /* If we do not actually return a failure, we need to unwind this
           before the next round.  */
diff -Nrcpad gcc-16-20250525/gcc/fortran/iresolve.cc gcc-16-20250601/gcc/fortran/iresolve.cc
*** gcc-16-20250525/gcc/fortran/iresolve.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/fortran/iresolve.cc	Sun Jun  1 22:32:14 2025
*************** gfc_resolve_trim (gfc_expr *f, gfc_expr
*** 3435,3447 ****
    f->value.function.name = gfc_get_string ("__trim_%d", string->ts.kind);
  }
  
! 
! /* Resolve the degree trigonometric functions.  This amounts to setting
     the function return type-spec from its argument and building a
     library function names of the form _gfortran_sind_r4.  */
  
  void
! gfc_resolve_trigd (gfc_expr *f, gfc_expr *x)
  {
    f->ts = x->ts;
    f->value.function.name
--- 3435,3446 ----
    f->value.function.name = gfc_get_string ("__trim_%d", string->ts.kind);
  }
  
! /* Resolve the trigonometric functions.  This amounts to setting
     the function return type-spec from its argument and building a
     library function names of the form _gfortran_sind_r4.  */
  
  void
! gfc_resolve_trig (gfc_expr *f, gfc_expr *x)
  {
    f->ts = x->ts;
    f->value.function.name
*************** gfc_resolve_trigd (gfc_expr *f, gfc_expr
*** 3450,3458 ****
  		      gfc_type_abi_kind (&x->ts));
  }
  
- 
  void
! gfc_resolve_trigd2 (gfc_expr *f, gfc_expr *y, gfc_expr *x)
  {
    f->ts = y->ts;
    f->value.function.name
--- 3449,3456 ----
  		      gfc_type_abi_kind (&x->ts));
  }
  
  void
! gfc_resolve_trig2 (gfc_expr *f, gfc_expr *y, gfc_expr *x)
  {
    f->ts = y->ts;
    f->value.function.name
diff -Nrcpad gcc-16-20250525/gcc/fortran/mathbuiltins.def gcc-16-20250601/gcc/fortran/mathbuiltins.def
*** gcc-16-20250525/gcc/fortran/mathbuiltins.def	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/fortran/mathbuiltins.def	Sun Jun  1 22:32:14 2025
*************** along with GCC; see the file COPYING3.
*** 23,56 ****
  
     Use DEFINE_MATH_BUILTIN_C if the complex versions of the builtin are
     also available.  */
! DEFINE_MATH_BUILTIN_C (ACOS,  "acos",   0)
! DEFINE_MATH_BUILTIN_C (ACOSH, "acosh",  0)
! DEFINE_MATH_BUILTIN_C (ASIN,  "asin",   0)
! DEFINE_MATH_BUILTIN_C (ASINH, "asinh",  0)
! DEFINE_MATH_BUILTIN_C (ATAN,  "atan",   0)
! DEFINE_MATH_BUILTIN_C (ATANH, "atanh",  0)
! DEFINE_MATH_BUILTIN   (ATAN2, "atan2",  1)
! DEFINE_MATH_BUILTIN_C (COS,   "cos",    0)
! DEFINE_MATH_BUILTIN_C (COSH,  "cosh",   0)
! DEFINE_MATH_BUILTIN_C (EXP,   "exp",    0)
! DEFINE_MATH_BUILTIN_C (LOG,   "log",    0)
! DEFINE_MATH_BUILTIN_C (LOG10, "log10",  0)
! DEFINE_MATH_BUILTIN_C (SIN,   "sin",    0)
! DEFINE_MATH_BUILTIN_C (SINH,  "sinh",   0)
! DEFINE_MATH_BUILTIN_C (SQRT,  "sqrt",   0)
! DEFINE_MATH_BUILTIN_C (TAN,   "tan",    0)
! DEFINE_MATH_BUILTIN_C (TANH,  "tanh",   0)
! DEFINE_MATH_BUILTIN   (J0,    "j0",     0)
! DEFINE_MATH_BUILTIN   (J1,    "j1",     0)
! DEFINE_MATH_BUILTIN   (JN,    "jn",     5)
! DEFINE_MATH_BUILTIN   (Y0,    "y0",     0)
! DEFINE_MATH_BUILTIN   (Y1,    "y1",     0)
! DEFINE_MATH_BUILTIN   (YN,    "yn",     5)
! DEFINE_MATH_BUILTIN   (ERF,   "erf",    0)
! DEFINE_MATH_BUILTIN   (ERFC,  "erfc",   0)
! DEFINE_MATH_BUILTIN   (TGAMMA,"tgamma", 0)
! DEFINE_MATH_BUILTIN   (LGAMMA,"lgamma", 0)
! DEFINE_MATH_BUILTIN   (HYPOT, "hypot",  1)
  
  /* OTHER_BUILTIN (CODE, NAME, PROTOTYPE_TYPE, CONST)
     For floating-point builtins that do not directly correspond to a
--- 23,63 ----
  
     Use DEFINE_MATH_BUILTIN_C if the complex versions of the builtin are
     also available.  */
! DEFINE_MATH_BUILTIN_C (ACOS,    "acos",    0)
! DEFINE_MATH_BUILTIN_C (ACOSH,   "acosh",   0)
! DEFINE_MATH_BUILTIN   (ACOSPI,  "acospi",  0)
! DEFINE_MATH_BUILTIN_C (ASIN,    "asin",    0)
! DEFINE_MATH_BUILTIN_C (ASINH,   "asinh",   0)
! DEFINE_MATH_BUILTIN   (ASINPI,  "asinpi",  0)
! DEFINE_MATH_BUILTIN_C (ATAN,    "atan",    0)
! DEFINE_MATH_BUILTIN   (ATAN2,   "atan2",   1)
! DEFINE_MATH_BUILTIN   (ATAN2PI, "atan2pi", 1)
! DEFINE_MATH_BUILTIN_C (ATANH,   "atanh",   0)
! DEFINE_MATH_BUILTIN   (ATANPI,  "atanpi",  0)
! DEFINE_MATH_BUILTIN_C (COS,     "cos",     0)
! DEFINE_MATH_BUILTIN_C (COSH,    "cosh",    0)
! DEFINE_MATH_BUILTIN   (COSPI,   "cospi",   0)
! DEFINE_MATH_BUILTIN   (ERF,     "erf",     0)
! DEFINE_MATH_BUILTIN   (ERFC,    "erfc",    0)
! DEFINE_MATH_BUILTIN_C (EXP,     "exp",     0)
! DEFINE_MATH_BUILTIN   (HYPOT,   "hypot",   1)
! DEFINE_MATH_BUILTIN   (J0,      "j0",      0)
! DEFINE_MATH_BUILTIN   (J1,      "j1",      0)
! DEFINE_MATH_BUILTIN   (JN,      "jn",      5)
! DEFINE_MATH_BUILTIN   (LGAMMA,  "lgamma",  0)
! DEFINE_MATH_BUILTIN_C (LOG,     "log",     0)
! DEFINE_MATH_BUILTIN_C (LOG10,   "log10",   0)
! DEFINE_MATH_BUILTIN_C (SIN,     "sin",     0)
! DEFINE_MATH_BUILTIN_C (SINH,    "sinh",    0)
! DEFINE_MATH_BUILTIN   (SINPI,   "sinpi",   0)
! DEFINE_MATH_BUILTIN_C (SQRT,    "sqrt",    0)
! DEFINE_MATH_BUILTIN_C (TAN,     "tan",     0)
! DEFINE_MATH_BUILTIN_C (TANH,    "tanh",    0)
! DEFINE_MATH_BUILTIN   (TANPI,   "tanpi",   0)
! DEFINE_MATH_BUILTIN   (TGAMMA,  "tgamma",  0)
! DEFINE_MATH_BUILTIN   (Y0,      "y0",      0)
! DEFINE_MATH_BUILTIN   (Y1,      "y1",      0)
! DEFINE_MATH_BUILTIN   (YN,      "yn",      5)
  
  /* OTHER_BUILTIN (CODE, NAME, PROTOTYPE_TYPE, CONST)
     For floating-point builtins that do not directly correspond to a
diff -Nrcpad gcc-16-20250525/gcc/fortran/misc.cc gcc-16-20250601/gcc/fortran/misc.cc
*** gcc-16-20250525/gcc/fortran/misc.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/fortran/misc.cc	Sun Jun  1 22:32:14 2025
*************** gfc_typename (gfc_typespec *ts, bool for
*** 214,219 ****
--- 214,222 ----
      case BT_UNKNOWN:
        strcpy (buffer, "UNKNOWN");
        break;
+     case BT_VOID:
+       strcpy (buffer, "VOID");
+       break;
      default:
        gfc_internal_error ("gfc_typename(): Undefined type");
      }
diff -Nrcpad gcc-16-20250525/gcc/fortran/parse.cc gcc-16-20250601/gcc/fortran/parse.cc
*** gcc-16-20250525/gcc/fortran/parse.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/fortran/parse.cc	Sun Jun  1 22:32:14 2025
*************** along with GCC; see the file COPYING3.
*** 27,32 ****
--- 27,35 ----
  #include "match.h"
  #include "parse.h"
  #include "tree-core.h"
+ #include "tree.h"
+ #include "fold-const.h"
+ #include "tree-hash-traits.h"
  #include "omp-general.h"
  
  /* Current statement label.  Zero means no statement label.  Because new_st
diff -Nrcpad gcc-16-20250525/gcc/fortran/primary.cc gcc-16-20250601/gcc/fortran/primary.cc
*** gcc-16-20250525/gcc/fortran/primary.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/fortran/primary.cc	Sun Jun  1 22:32:14 2025
*************** extend_ref (gfc_expr *primary, gfc_ref *
*** 2102,2111 ****
  {
    if (primary->ref == NULL)
      primary->ref = tail = gfc_get_ref ();
    else
      {
-       if (tail == NULL)
- 	gfc_internal_error ("extend_ref(): Bad tail");
        tail->next = gfc_get_ref ();
        tail = tail->next;
      }
--- 2102,2119 ----
  {
    if (primary->ref == NULL)
      primary->ref = tail = gfc_get_ref ();
+   else if (tail == NULL)
+     {
+       /* Set tail to end of reference chain.  */
+       for (gfc_ref *ref = primary->ref; ref; ref = ref->next)
+ 	if (ref->next == NULL)
+ 	  {
+ 	    tail = ref;
+ 	    break;
+ 	  }
+     }
    else
      {
        tail->next = gfc_get_ref ();
        tail = tail->next;
      }
*************** gfc_match_varspec (gfc_expr *primary, in
*** 2302,2310 ****
        gfc_array_spec *as;
        bool coarray_only = sym->attr.codimension && !sym->attr.dimension
  			  && sym->ts.type == BT_CHARACTER;
  
        tail = extend_ref (primary, tail);
!       tail->type = REF_ARRAY;
  
        /* In EQUIVALENCE, we don't know yet whether we are seeing
  	 an array, character variable or array of character
--- 2310,2331 ----
        gfc_array_spec *as;
        bool coarray_only = sym->attr.codimension && !sym->attr.dimension
  			  && sym->ts.type == BT_CHARACTER;
+       gfc_ref *ref, *strarr = NULL;
  
        tail = extend_ref (primary, tail);
!       if (sym->ts.type == BT_CHARACTER && tail->type == REF_SUBSTRING)
! 	{
! 	  gcc_assert (sym->attr.dimension);
! 	  /* Find array reference for substrings of character arrays.  */
! 	  for (ref = primary->ref; ref && ref->next; ref = ref->next)
! 	    if (ref->type == REF_ARRAY && ref->next->type == REF_SUBSTRING)
! 	      {
! 		strarr = ref;
! 		break;
! 	      }
! 	}
!       else
! 	tail->type = REF_ARRAY;
  
        /* In EQUIVALENCE, we don't know yet whether we are seeing
  	 an array, character variable or array of character
*************** gfc_match_varspec (gfc_expr *primary, in
*** 2317,2323 ****
        else
  	as = sym->as;
  
!       m = gfc_match_array_ref (&tail->u.ar, as, equiv_flag, as ? as->corank : 0,
  			       coarray_only);
        if (m != MATCH_YES)
  	return m;
--- 2338,2345 ----
        else
  	as = sym->as;
  
!       ref = strarr ? strarr : tail;
!       m = gfc_match_array_ref (&ref->u.ar, as, equiv_flag, as ? as->corank : 0,
  			       coarray_only);
        if (m != MATCH_YES)
  	return m;
*************** gfc_match_varspec (gfc_expr *primary, in
*** 2483,2488 ****
--- 2505,2511 ----
      {
        bool t;
        gfc_symtree *tbp;
+       gfc_typespec *ts = &primary->ts;
  
        m = gfc_match_name (name);
        if (m == MATCH_NO)
*************** gfc_match_varspec (gfc_expr *primary, in
*** 2490,2497 ****
        if (m != MATCH_YES)
  	return MATCH_ERROR;
  
        intrinsic = false;
!       if (primary->ts.type != BT_CLASS && primary->ts.type != BT_DERIVED)
  	{
  	  inquiry = is_inquiry_ref (name, &tmp);
  	  if (inquiry)
--- 2513,2530 ----
        if (m != MATCH_YES)
  	return MATCH_ERROR;
  
+       /* For derived type components find typespec of ultimate component.  */
+       if (ts->type == BT_DERIVED && primary->ref)
+ 	{
+ 	  for (gfc_ref *ref = primary->ref; ref; ref = ref->next)
+ 	    {
+ 	      if (ref->type == REF_COMPONENT && ref->u.c.component)
+ 		ts = &ref->u.c.component->ts;
+ 	    }
+ 	}
+ 
        intrinsic = false;
!       if (ts->type != BT_CLASS && ts->type != BT_DERIVED)
  	{
  	  inquiry = is_inquiry_ref (name, &tmp);
  	  if (inquiry)
*************** gfc_match_varspec (gfc_expr *primary, in
*** 2564,2570 ****
  			return MATCH_ERROR;
  		    }
  		  else if (tmp->u.i == INQUIRY_LEN
! 			   && primary->ts.type != BT_CHARACTER)
  		    {
  			gfc_error ("The LEN part_ref at %C must be applied "
  				   "to a CHARACTER expression");
--- 2597,2603 ----
  			return MATCH_ERROR;
  		    }
  		  else if (tmp->u.i == INQUIRY_LEN
! 			   && ts->type != BT_CHARACTER)
  		    {
  			gfc_error ("The LEN part_ref at %C must be applied "
  				   "to a CHARACTER expression");
*************** gfc_match_varspec (gfc_expr *primary, in
*** 2659,2664 ****
--- 2692,2702 ----
  	primary->ref = tmp;
        else
  	{
+ 	  /* Find end of reference chain if inquiry reference and tail not
+ 	     set.  */
+ 	  if (tail == NULL && inquiry && tmp)
+ 	    tail = extend_ref (primary, tail);
+ 
  	  /* Set by the for loop below for the last component ref.  */
  	  gcc_assert (tail != NULL);
  	  tail->next = tmp;
*************** gfc_match_varspec (gfc_expr *primary, in
*** 2678,2683 ****
--- 2716,2724 ----
  	  if (primary->expr_type == EXPR_CONSTANT)
  	    goto check_done;
  
+ 	  if (primary->ref == NULL)
+ 	    goto check_done;
+ 
  	  switch (tmp->u.i)
  	    {
  	    case INQUIRY_RE:
*************** check_substring:
*** 2828,2833 ****
--- 2869,2875 ----
  	  if (substring)
  	    primary->ts.u.cl = NULL;
  
+ 	  gfc_gobble_whitespace ();
  	  if (gfc_peek_ascii_char () == '(')
  	    {
  	      gfc_error_now ("Unexpected array/substring ref at %C");
*************** gfc_match_rvalue (gfc_expr **result)
*** 4271,4276 ****
--- 4313,4328 ----
        return MATCH_ERROR;
      }
  
+   /* Scan for possible inquiry references.  */
+   if (m == MATCH_YES
+       && e->expr_type == EXPR_VARIABLE
+       && gfc_peek_ascii_char () == '%')
+       {
+ 	m = gfc_match_varspec (e, 0, false, false);
+ 	if (m == MATCH_NO)
+ 	  m = MATCH_YES;
+       }
+ 
    if (m == MATCH_YES)
      {
        e->where = where;
diff -Nrcpad gcc-16-20250525/gcc/fortran/simplify.cc gcc-16-20250601/gcc/fortran/simplify.cc
*** gcc-16-20250525/gcc/fortran/simplify.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/fortran/simplify.cc	Sun Jun  1 22:32:14 2025
*************** gfc_simplify_acos (gfc_expr *x)
*** 885,891 ****
  	if (mpfr_cmp_si (x->value.real, 1) > 0
  	    || mpfr_cmp_si (x->value.real, -1) < 0)
  	  {
! 	    gfc_error ("Argument of ACOS at %L must be between -1 and 1",
  		       &x->where);
  	    return &gfc_bad_expr;
  	  }
--- 885,892 ----
  	if (mpfr_cmp_si (x->value.real, 1) > 0
  	    || mpfr_cmp_si (x->value.real, -1) < 0)
  	  {
! 	    gfc_error ("Argument of ACOS at %L must be within the closed "
! 		       "interval [-1, 1]",
  		       &x->where);
  	    return &gfc_bad_expr;
  	  }
*************** gfc_simplify_asin (gfc_expr *x)
*** 1162,1168 ****
  	if (mpfr_cmp_si (x->value.real, 1) > 0
  	    || mpfr_cmp_si (x->value.real, -1) < 0)
  	  {
! 	    gfc_error ("Argument of ASIN at %L must be between -1 and 1",
  		       &x->where);
  	    return &gfc_bad_expr;
  	  }
--- 1163,1170 ----
  	if (mpfr_cmp_si (x->value.real, 1) > 0
  	    || mpfr_cmp_si (x->value.real, -1) < 0)
  	  {
! 	    gfc_error ("Argument of ASIN at %L must be within the closed "
! 		       "interval [-1, 1]",
  		       &x->where);
  	    return &gfc_bad_expr;
  	  }
*************** gfc_simplify_acosd (gfc_expr *x)
*** 1213,1220 ****
    if (mpfr_cmp_si (x->value.real, 1) > 0
        || mpfr_cmp_si (x->value.real, -1) < 0)
      {
!       gfc_error ("Argument of ACOSD at %L must be between -1 and 1",
! 		 &x->where);
        return &gfc_bad_expr;
      }
  
--- 1215,1223 ----
    if (mpfr_cmp_si (x->value.real, 1) > 0
        || mpfr_cmp_si (x->value.real, -1) < 0)
      {
!       gfc_error (
! 	"Argument of ACOSD at %L must be within the closed interval [-1, 1]",
! 	&x->where);
        return &gfc_bad_expr;
      }
  
*************** gfc_simplify_asind (gfc_expr *x)
*** 1243,1250 ****
    if (mpfr_cmp_si (x->value.real, 1) > 0
        || mpfr_cmp_si (x->value.real, -1) < 0)
      {
!       gfc_error ("Argument of ASIND at %L must be between -1 and 1",
! 		 &x->where);
        return &gfc_bad_expr;
      }
  
--- 1246,1254 ----
    if (mpfr_cmp_si (x->value.real, 1) > 0
        || mpfr_cmp_si (x->value.real, -1) < 0)
      {
!       gfc_error (
! 	"Argument of ASIND at %L must be within the closed interval [-1, 1]",
! 	&x->where);
        return &gfc_bad_expr;
      }
  
*************** gfc_simplify_atan2 (gfc_expr *y, gfc_exp
*** 1383,1389 ****
  
    if (mpfr_zero_p (y->value.real) && mpfr_zero_p (x->value.real))
      {
!       gfc_error ("If first argument of ATAN2 at %L is zero, then the "
  		 "second argument must not be zero", &y->where);
        return &gfc_bad_expr;
      }
--- 1387,1393 ----
  
    if (mpfr_zero_p (y->value.real) && mpfr_zero_p (x->value.real))
      {
!       gfc_error ("If the first argument of ATAN2 at %L is zero, then the "
  		 "second argument must not be zero", &y->where);
        return &gfc_bad_expr;
      }
*************** gfc_simplify_atan2d (gfc_expr *y, gfc_ex
*** 1962,1968 ****
  
    if (mpfr_zero_p (y->value.real) && mpfr_zero_p (x->value.real))
      {
!       gfc_error ("If first argument of ATAN2D at %L is zero, then the "
  		 "second argument must not be zero", &y->where);
        return &gfc_bad_expr;
      }
--- 1966,1972 ----
  
    if (mpfr_zero_p (y->value.real) && mpfr_zero_p (x->value.real))
      {
!       gfc_error ("If the first argument of ATAN2D at %L is zero, then the "
  		 "second argument must not be zero", &y->where);
        return &gfc_bad_expr;
      }
*************** gfc_simplify_cosh (gfc_expr *x)
*** 2151,2156 ****
--- 2155,2404 ----
    return range_check (result, "COSH");
  }
  
+ gfc_expr *
+ gfc_simplify_acospi (gfc_expr *x)
+ {
+   gfc_expr *result;
+ 
+   if (x->expr_type != EXPR_CONSTANT)
+     return NULL;
+ 
+   if (mpfr_cmp_si (x->value.real, 1) > 0 || mpfr_cmp_si (x->value.real, -1) < 0)
+     {
+       gfc_error (
+ 	"Argument of ACOSPI at %L must be within the closed interval [-1, 1]",
+ 	&x->where);
+       return &gfc_bad_expr;
+     }
+ 
+   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
+ 
+ #if MPFR_VERSION >= MPFR_VERSION_NUM(4, 2, 0)
+   mpfr_acospi (result->value.real, x->value.real, GFC_RND_MODE);
+ #else
+   mpfr_t pi, tmp;
+   mpfr_inits2 (2 * mpfr_get_prec (x->value.real), pi, tmp, NULL);
+   mpfr_const_pi (pi, GFC_RND_MODE);
+   mpfr_acos (tmp, x->value.real, GFC_RND_MODE);
+   mpfr_div (result->value.real, tmp, pi, GFC_RND_MODE);
+   mpfr_clears (pi, tmp, NULL);
+ #endif
+ 
+   return result;
+ }
+ 
+ gfc_expr *
+ gfc_simplify_asinpi (gfc_expr *x)
+ {
+   gfc_expr *result;
+ 
+   if (x->expr_type != EXPR_CONSTANT)
+     return NULL;
+ 
+   if (mpfr_cmp_si (x->value.real, 1) > 0 || mpfr_cmp_si (x->value.real, -1) < 0)
+     {
+       gfc_error (
+ 	"Argument of ASINPI at %L must be within the closed interval [-1, 1]",
+ 	&x->where);
+       return &gfc_bad_expr;
+     }
+ 
+   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
+ 
+ #if MPFR_VERSION >= MPFR_VERSION_NUM(4, 2, 0)
+   mpfr_asinpi (result->value.real, x->value.real, GFC_RND_MODE);
+ #else
+   mpfr_t pi, tmp;
+   mpfr_inits2 (2 * mpfr_get_prec (x->value.real), pi, tmp, NULL);
+   mpfr_const_pi (pi, GFC_RND_MODE);
+   mpfr_asin (tmp, x->value.real, GFC_RND_MODE);
+   mpfr_div (result->value.real, tmp, pi, GFC_RND_MODE);
+   mpfr_clears (pi, tmp, NULL);
+ #endif
+ 
+   return result;
+ }
+ 
+ gfc_expr *
+ gfc_simplify_atanpi (gfc_expr *x)
+ {
+   gfc_expr *result;
+ 
+   if (x->expr_type != EXPR_CONSTANT)
+     return NULL;
+ 
+   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
+ 
+ #if MPFR_VERSION >= MPFR_VERSION_NUM(4, 2, 0)
+   mpfr_atanpi (result->value.real, x->value.real, GFC_RND_MODE);
+ #else
+   mpfr_t pi, tmp;
+   mpfr_inits2 (2 * mpfr_get_prec (x->value.real), pi, tmp, NULL);
+   mpfr_const_pi (pi, GFC_RND_MODE);
+   mpfr_atan (tmp, x->value.real, GFC_RND_MODE);
+   mpfr_div (result->value.real, tmp, pi, GFC_RND_MODE);
+   mpfr_clears (pi, tmp, NULL);
+ #endif
+ 
+   return range_check (result, "ATANPI");
+ }
+ 
+ gfc_expr *
+ gfc_simplify_atan2pi (gfc_expr *y, gfc_expr *x)
+ {
+   gfc_expr *result;
+ 
+   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
+     return NULL;
+ 
+   if (mpfr_zero_p (y->value.real) && mpfr_zero_p (x->value.real))
+     {
+       gfc_error ("If the first argument of ATAN2PI at %L is zero, then the "
+ 		 "second argument must not be zero",
+ 		 &y->where);
+       return &gfc_bad_expr;
+     }
+ 
+   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
+ 
+ #if MPFR_VERSION >= MPFR_VERSION_NUM(4, 2, 0)
+   mpfr_atan2pi (result->value.real, y->value.real, x->value.real, GFC_RND_MODE);
+ #else
+   mpfr_t pi, tmp;
+   mpfr_inits2 (2 * mpfr_get_prec (x->value.real), pi, tmp, NULL);
+   mpfr_const_pi (pi, GFC_RND_MODE);
+   mpfr_atan2 (tmp, y->value.real, x->value.real, GFC_RND_MODE);
+   mpfr_div (result->value.real, tmp, pi, GFC_RND_MODE);
+   mpfr_clears (pi, tmp, NULL);
+ #endif
+ 
+   return range_check (result, "ATAN2PI");
+ }
+ 
+ gfc_expr *
+ gfc_simplify_cospi (gfc_expr *x)
+ {
+   gfc_expr *result;
+ 
+   if (x->expr_type != EXPR_CONSTANT)
+     return NULL;
+ 
+   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
+ 
+ #if MPFR_VERSION >= MPFR_VERSION_NUM(4, 2, 0)
+   mpfr_cospi (result->value.real, x->value.real, GFC_RND_MODE);
+ #else
+   mpfr_t cs, n, r, two;
+   int s;
+ 
+   mpfr_inits2 (2 * mpfr_get_prec (x->value.real), cs, n, r, two, NULL);
+ 
+   mpfr_abs (r, x->value.real, GFC_RND_MODE);
+   mpfr_modf (n, r, r, GFC_RND_MODE);
+ 
+   if (mpfr_cmp_d (r, 0.5) == 0)
+     {
+       mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
+       return result;
+     }
+ 
+   mpfr_set_ui (two, 2, GFC_RND_MODE);
+   mpfr_fmod (cs, n, two, GFC_RND_MODE);
+   s = mpfr_cmp_ui (cs, 0) == 0 ? 1 : -1;
+ 
+   mpfr_const_pi (cs, GFC_RND_MODE);
+   mpfr_mul (cs, cs, r, GFC_RND_MODE);
+   mpfr_cos (cs, cs, GFC_RND_MODE);
+   mpfr_mul_si (result->value.real, cs, s, GFC_RND_MODE);
+ 
+   mpfr_clears (cs, n, r, two, NULL);
+ #endif
+ 
+   return range_check (result, "COSPI");
+ }
+ 
+ gfc_expr *
+ gfc_simplify_sinpi (gfc_expr *x)
+ {
+   gfc_expr *result;
+ 
+   if (x->expr_type != EXPR_CONSTANT)
+     return NULL;
+ 
+   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
+ 
+ #if MPFR_VERSION >= MPFR_VERSION_NUM(4, 2, 0)
+   mpfr_sinpi (result->value.real, x->value.real, GFC_RND_MODE);
+ #else
+   mpfr_t sn, n, r, two;
+   int s;
+ 
+   mpfr_inits2 (2 * mpfr_get_prec (x->value.real), sn, n, r, two, NULL);
+ 
+   mpfr_abs (r, x->value.real, GFC_RND_MODE);
+   mpfr_modf (n, r, r, GFC_RND_MODE);
+ 
+   if (mpfr_cmp_d (r, 0.0) == 0)
+     {
+       mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
+       return result;
+     }
+ 
+   mpfr_set_ui (two, 2, GFC_RND_MODE);
+   mpfr_fmod (sn, n, two, GFC_RND_MODE);
+   s = mpfr_cmp_si (x->value.real, 0) < 0 ? -1 : 1;
+   s *= mpfr_cmp_ui (sn, 0) == 0 ? 1 : -1;
+ 
+   mpfr_const_pi (sn, GFC_RND_MODE);
+   mpfr_mul (sn, sn, r, GFC_RND_MODE);
+   mpfr_sin (sn, sn, GFC_RND_MODE);
+   mpfr_mul_si (result->value.real, sn, s, GFC_RND_MODE);
+ 
+   mpfr_clears (sn, n, r, two, NULL);
+ #endif
+ 
+   return range_check (result, "SINPI");
+ }
+ 
+ gfc_expr *
+ gfc_simplify_tanpi (gfc_expr *x)
+ {
+   gfc_expr *result;
+ 
+   if (x->expr_type != EXPR_CONSTANT)
+     return NULL;
+ 
+   result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
+ 
+ #if MPFR_VERSION >= MPFR_VERSION_NUM(4, 2, 0)
+   mpfr_tanpi (result->value.real, x->value.real, GFC_RND_MODE);
+ #else
+   mpfr_t tn, n, r;
+   int s;
+ 
+   mpfr_inits2 (2 * mpfr_get_prec (x->value.real), tn, n, r, NULL);
+ 
+   mpfr_abs (r, x->value.real, GFC_RND_MODE);
+   mpfr_modf (n, r, r, GFC_RND_MODE);
+ 
+   if (mpfr_cmp_d (r, 0.0) == 0)
+     {
+       mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
+       return result;
+     }
+ 
+   s = mpfr_cmp_si (x->value.real, 0) < 0 ? -1 : 1;
+ 
+   mpfr_const_pi (tn, GFC_RND_MODE);
+   mpfr_mul (tn, tn, r, GFC_RND_MODE);
+   mpfr_tan (tn, tn, GFC_RND_MODE);
+   mpfr_mul_si (result->value.real, tn, s, GFC_RND_MODE);
+ 
+   mpfr_clears (tn, n, r, NULL);
+ #endif
+ 
+   return range_check (result, "TANPI");
+ }
  
  gfc_expr *
  gfc_simplify_count (gfc_expr *mask, gfc_expr *dim, gfc_expr *kind)
diff -Nrcpad gcc-16-20250525/gcc/function.h gcc-16-20250601/gcc/function.h
*** gcc-16-20250525/gcc/function.h	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/function.h	Sun Jun  1 22:32:14 2025
*************** struct GTY(()) function {
*** 333,339 ****
  
    /* Properties used by the pass manager.  */
    unsigned int curr_properties;
-   unsigned int last_verified;
  
    /* Different from normal TODO_flags which are handled right at the
       beginning or the end of one pass execution, the pending_TODOs
--- 333,338 ----
diff -Nrcpad gcc-16-20250525/gcc/gcc.cc gcc-16-20250601/gcc/gcc.cc
*** gcc-16-20250525/gcc/gcc.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/gcc.cc	Sun Jun  1 22:32:14 2025
*************** default_arg (const char *p, int len)
*** 9747,9752 ****
--- 9747,9849 ----
    return 0;
  }
  
+ /* Use multilib_dir as key to find corresponding multilib_os_dir and
+    multiarch_dir.  */
+ 
+ static void
+ find_multilib_os_dir_by_multilib_dir (const char *multilib_dir,
+ 				      const char **p_multilib_os_dir,
+ 				      const char **p_multiarch_dir)
+ {
+   const char *p = multilib_select;
+   unsigned int this_path_len;
+   const char *this_path;
+   int ok = 0;
+ 
+   while (*p != '\0')
+     {
+       /* Ignore newlines.  */
+       if (*p == '\n')
+ 	{
+ 	  ++p;
+ 	  continue;
+ 	}
+ 
+       /* Get the initial path.  */
+       this_path = p;
+       while (*p != ' ')
+ 	{
+ 	  if (*p == '\0')
+ 	    {
+ 	      fatal_error (input_location, "multilib select %qs %qs is invalid",
+ 			   multilib_select, multilib_reuse);
+ 	    }
+ 	  ++p;
+ 	}
+       this_path_len = p - this_path;
+ 
+       ok = 0;
+ 
+       /* Skip any arguments, we don't care at this stage.  */
+       while (*++p != ';');
+ 
+       if (this_path_len != 1
+ 	  || this_path[0] != '.')
+ 	{
+ 	  char *new_multilib_dir = XNEWVEC (char, this_path_len + 1);
+ 	  char *q;
+ 
+ 	  strncpy (new_multilib_dir, this_path, this_path_len);
+ 	  new_multilib_dir[this_path_len] = '\0';
+ 	  q = strchr (new_multilib_dir, ':');
+ 	  if (q != NULL)
+ 	    *q = '\0';
+ 
+ 	  if (strcmp (new_multilib_dir, multilib_dir) == 0)
+ 	    ok = 1;
+ 	}
+ 
+       /* Found matched multilib_dir, update multilib_os_dir and
+ 	 multiarch_dir.  */
+       if (ok)
+ 	{
+ 	  const char *q = this_path, *end = this_path + this_path_len;
+ 
+ 	  while (q < end && *q != ':')
+ 	    q++;
+ 	  if (q < end)
+ 	    {
+ 	      const char *q2 = q + 1, *ml_end = end;
+ 	      char *new_multilib_os_dir;
+ 
+ 	      while (q2 < end && *q2 != ':')
+ 		q2++;
+ 	      if (*q2 == ':')
+ 		ml_end = q2;
+ 	      if (ml_end - q == 1)
+ 		*p_multilib_os_dir = xstrdup (".");
+ 	      else
+ 		{
+ 		  new_multilib_os_dir = XNEWVEC (char, ml_end - q);
+ 		  memcpy (new_multilib_os_dir, q + 1, ml_end - q - 1);
+ 		  new_multilib_os_dir[ml_end - q - 1] = '\0';
+ 		  *p_multilib_os_dir = new_multilib_os_dir;
+ 		}
+ 
+ 	      if (q2 < end && *q2 == ':')
+ 		{
+ 		  char *new_multiarch_dir = XNEWVEC (char, end - q2);
+ 		  memcpy (new_multiarch_dir, q2 + 1, end - q2 - 1);
+ 		  new_multiarch_dir[end - q2 - 1] = '\0';
+ 		  *p_multiarch_dir = new_multiarch_dir;
+ 		}
+ 	      break;
+ 	    }
+ 	}
+       ++p;
+     }
+ }
+ 
  /* Work out the subdirectory to use based on the options. The format of
     multilib_select is a list of elements. Each element is a subdirectory
     name followed by a list of options followed by a semicolon. The format
*************** set_multilib_dir (void)
*** 10025,10031 ****
        multilib_os_dir = NULL;
      }
    else if (multilib_dir != NULL && multilib_os_dir == NULL)
!     multilib_os_dir = multilib_dir;
  }
  
  /* Print out the multiple library subdirectory selection
--- 10122,10137 ----
        multilib_os_dir = NULL;
      }
    else if (multilib_dir != NULL && multilib_os_dir == NULL)
!     {
!       /* Give second chance to search matched multilib_os_dir again by matching
! 	 the multilib_dir since some target may use TARGET_COMPUTE_MULTILIB
! 	 hook rather than the builtin way.  */
!       find_multilib_os_dir_by_multilib_dir (multilib_dir, &multilib_os_dir,
! 					    &multiarch_dir);
! 
!       if (multilib_os_dir == NULL)
! 	multilib_os_dir = multilib_dir;
!     }
  }
  
  /* Print out the multiple library subdirectory selection
diff -Nrcpad gcc-16-20250525/gcc/ggc-page.cc gcc-16-20250601/gcc/ggc-page.cc
*** gcc-16-20250525/gcc/ggc-page.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/ggc-page.cc	Sun Jun  1 22:32:14 2025
*************** static struct ggc_globals
*** 426,432 ****
    int dev_zero_fd;
  #endif
  
!   /* A cache of free system pages. Entry 0 is fallback.  */
    struct free_list free_lists[num_free_list];
  
  #ifdef USING_MALLOC_PAGE_GROUPS
--- 426,432 ----
    int dev_zero_fd;
  #endif
  
!   /* A cache of free system pages.  Entry 0 is fallback.  */
    struct free_list free_lists[num_free_list];
  
  #ifdef USING_MALLOC_PAGE_GROUPS
*************** find_free_list (size_t entry_size)
*** 787,793 ****
  	  return &G.free_lists[i];
  	}
      }
!   /* Fallback. Does this happen?  */
    if (GATHER_STATISTICS)
      G.stats.fallback++;
    return &G.free_lists[0];
--- 787,793 ----
  	  return &G.free_lists[i];
  	}
      }
!   /* Fallback.  Does this happen?  */
    if (GATHER_STATISTICS)
      G.stats.fallback++;
    return &G.free_lists[0];
*************** alloc_page (unsigned order)
*** 955,961 ****
        /* If we allocated multiple pages, put the rest on the free list.  */
        if (multiple_pages)
  	{
! 	  struct page_entry *e, *f = G.free_pages;
  	  for (a = enda - G.pagesize; a != page; a -= G.pagesize)
  	    {
  	      e = XCNEWVAR (struct page_entry, page_entry_size);
--- 955,961 ----
        /* If we allocated multiple pages, put the rest on the free list.  */
        if (multiple_pages)
  	{
! 	  struct page_entry *e, *f = free_list->free_pages;
  	  for (a = enda - G.pagesize; a != page; a -= G.pagesize)
  	    {
  	      e = XCNEWVAR (struct page_entry, page_entry_size);
*************** free_page (page_entry *entry)
*** 1073,1082 ****
  /* Release the free page cache for FREE_LIST to the system.  */
  
  static void
! do_release_pages (struct free_list *free_list)
  {
!   size_t n1 = 0;
!   size_t n2 = 0;
  #ifdef USING_MADVISE
    page_entry *p, *start_p;
    char *start;
--- 1073,1082 ----
  /* Release the free page cache for FREE_LIST to the system.  */
  
  static void
! do_release_pages (struct free_list *free_list, size_t &n1, size_t &n2)
  {
!   (void) n1;
!   (void) n2;
  #ifdef USING_MADVISE
    page_entry *p, *start_p;
    char *start;
*************** do_release_pages (struct free_list *free
*** 1089,1095 ****
       This allows other allocators to grab these areas if needed.
       This is only done on larger chunks to avoid fragmentation.
       This does not always work because the free_pages list is only
!      approximately sorted. */
  
    p = free_list->free_pages;
    prev = NULL;
--- 1089,1095 ----
       This allows other allocators to grab these areas if needed.
       This is only done on larger chunks to avoid fragmentation.
       This does not always work because the free_pages list is only
!      approximately sorted.  */
  
    p = free_list->free_pages;
    prev = NULL;
*************** do_release_pages (struct free_list *free
*** 1104,1110 ****
          {
            len += p->bytes;
  	  if (!p->discarded)
! 	      mapped_len += p->bytes;
  	  newprev = p;
            p = p->next;
          }
--- 1104,1110 ----
          {
            len += p->bytes;
  	  if (!p->discarded)
! 	    mapped_len += p->bytes;
  	  newprev = p;
            p = p->next;
          }
*************** do_release_pages (struct free_list *free
*** 1129,1135 ****
     }
  
    /* Now give back the fragmented pages to the OS, but keep the address
!      space to reuse it next time. */
  
    for (p = free_list->free_pages; p; )
      {
--- 1129,1135 ----
     }
  
    /* Now give back the fragmented pages to the OS, but keep the address
!      space to reuse it next time.  */
  
    for (p = free_list->free_pages; p; )
      {
*************** do_release_pages (struct free_list *free
*** 1149,1158 ****
          }
        /* Give the page back to the kernel, but don't free the mapping.
           This avoids fragmentation in the virtual memory map of the
!  	 process. Next time we can reuse it by just touching it. */
        madvise (start, len, MADV_DONTNEED);
        /* Don't count those pages as mapped to not touch the garbage collector
!          unnecessarily. */
        G.bytes_mapped -= len;
        n2 += len;
        while (start_p != p)
--- 1149,1158 ----
          }
        /* Give the page back to the kernel, but don't free the mapping.
           This avoids fragmentation in the virtual memory map of the
! 	 process.  Next time we can reuse it by just touching it.  */
        madvise (start, len, MADV_DONTNEED);
        /* Don't count those pages as mapped to not touch the garbage collector
! 	 unnecessarily.  */
        G.bytes_mapped -= len;
        n2 += len;
        while (start_p != p)
*************** do_release_pages (struct free_list *free
*** 1195,1201 ****
  #endif
  #ifdef USING_MALLOC_PAGE_GROUPS
    page_entry **pp, *p;
-   page_group **gp, *g;
  
    /* Remove all pages from free page groups from the list.  */
    pp = &free_list->free_pages;
--- 1195,1200 ----
*************** do_release_pages (struct free_list *free
*** 1207,1212 ****
--- 1206,1225 ----
        }
      else
        pp = &p->next;
+ #endif
+ }
+ 
+ /* Release the free page cache to the system.  */
+ 
+ static void
+ release_pages ()
+ {
+   size_t n1 = 0;
+   size_t n2 = 0;
+   for (int i = 0; i < num_free_list; i++)
+     do_release_pages (&G.free_lists[i], n1, n2);
+ #ifdef USING_MALLOC_PAGE_GROUPS
+   page_group **gp, *g;
  
    /* Remove all free page groups, and release the storage.  */
    gp = &G.page_groups;
*************** do_release_pages (struct free_list *free
*** 1232,1246 ****
      }
  }
  
- /* Release the free page cache to the system.  */
- 
- static void
- release_pages ()
- {
-   for (int i = 0; i < num_free_list; i++)
-     do_release_pages (&G.free_lists[i]);
- }
- 
  /* This table provides a fast way to determine ceil(log_2(size)) for
     allocation requests.  The minimum allocation size is eight bytes.  */
  #define NUM_SIZE_LOOKUP 512
--- 1245,1250 ----
*************** clear_marks (void)
*** 2008,2016 ****
      }
  }
  
! /* Check if any blocks with a registered finalizer have become unmarked. If so
     run the finalizer and unregister it because the block is about to be freed.
!    Note that no garantee is made about what order finalizers will run in so
     touching other objects in gc memory is extremely unwise.  */
  
  static void
--- 2012,2020 ----
      }
  }
  
! /* Check if any blocks with a registered finalizer have become unmarked.  If so
     run the finalizer and unregister it because the block is about to be freed.
!    Note that no guarantee is made about what order finalizers will run in so
     touching other objects in gc memory is extremely unwise.  */
  
  static void
diff -Nrcpad gcc-16-20250525/gcc/gimple-harden-conditionals.cc gcc-16-20250601/gcc/gimple-harden-conditionals.cc
*** gcc-16-20250525/gcc/gimple-harden-conditionals.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/gimple-harden-conditionals.cc	Sun Jun  1 22:32:14 2025
*************** const pass_data pass_data_harden_compare
*** 61,68 ****
    0,	    // properties_destroyed
    0,	    // properties_start
    TODO_update_ssa
!   | TODO_cleanup_cfg
!   | TODO_verify_il, // properties_finish
  };
  
  class pass_harden_compares : public gimple_opt_pass
--- 61,67 ----
    0,	    // properties_destroyed
    0,	    // properties_start
    TODO_update_ssa
!   | TODO_cleanup_cfg, // properties_finish
  };
  
  class pass_harden_compares : public gimple_opt_pass
*************** const pass_data pass_data_harden_conditi
*** 96,103 ****
    0,	    // properties_destroyed
    0,	    // properties_start
    TODO_update_ssa
!   | TODO_cleanup_cfg
!   | TODO_verify_il, // properties_finish
  };
  
  class pass_harden_conditional_branches : public gimple_opt_pass
--- 95,101 ----
    0,	    // properties_destroyed
    0,	    // properties_start
    TODO_update_ssa
!   | TODO_cleanup_cfg, // properties_finish
  };
  
  class pass_harden_conditional_branches : public gimple_opt_pass
diff -Nrcpad gcc-16-20250525/gcc/gimple-harden-control-flow.cc gcc-16-20250601/gcc/gimple-harden-control-flow.cc
*** gcc-16-20250525/gcc/gimple-harden-control-flow.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/gimple-harden-control-flow.cc	Sun Jun  1 22:32:14 2025
*************** pass_harden_control_flow_redundancy::exe
*** 1549,1556 ****
  
    return
      TODO_update_ssa
!     | TODO_cleanup_cfg
!     | TODO_verify_il;
  }
  
  /* Instantiate a hardcfr pass.  */
--- 1549,1555 ----
  
    return
      TODO_update_ssa
!     | TODO_cleanup_cfg;
  }
  
  /* Instantiate a hardcfr pass.  */
diff -Nrcpad gcc-16-20250525/gcc/gimple-ssa-sccopy.cc gcc-16-20250601/gcc/gimple-ssa-sccopy.cc
*** gcc-16-20250525/gcc/gimple-ssa-sccopy.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/gimple-ssa-sccopy.cc	Sun Jun  1 22:32:14 2025
*************** class scc_copy_prop
*** 464,470 ****
  public:
    scc_copy_prop ();
    ~scc_copy_prop ();
!   void propagate ();
  
  private:
    /* Bitmap tracking statements which were propagated so that they can be
--- 464,470 ----
  public:
    scc_copy_prop ();
    ~scc_copy_prop ();
!   bool propagate ();
  
  private:
    /* Bitmap tracking statements which were propagated so that they can be
*************** private:
*** 474,488 ****
    void visit_op (tree op, hash_set<tree> &outer_ops,
  				hash_set<gimple *> &scc_set, bool &is_inner,
  				tree &last_outer_op);
!   void replace_scc_by_value (vec<gimple *> scc, tree val);
  };
  
  /* For each statement from given SCC, replace its usages by value
     VAL.  */
  
! void
  scc_copy_prop::replace_scc_by_value (vec<gimple *> scc, tree val)
  {
    for (gimple *stmt : scc)
      {
        tree name = gimple_get_lhs (stmt);
--- 474,489 ----
    void visit_op (tree op, hash_set<tree> &outer_ops,
  				hash_set<gimple *> &scc_set, bool &is_inner,
  				tree &last_outer_op);
!   bool replace_scc_by_value (vec<gimple *> scc, tree val);
  };
  
  /* For each statement from given SCC, replace its usages by value
     VAL.  */
  
! bool
  scc_copy_prop::replace_scc_by_value (vec<gimple *> scc, tree val)
  {
+   bool didsomething = false;
    for (gimple *stmt : scc)
      {
        tree name = gimple_get_lhs (stmt);
*************** scc_copy_prop::replace_scc_by_value (vec
*** 497,506 ****
--- 498,509 ----
  	}
        replace_uses_by (name, val);
        bitmap_set_bit (dead_stmts, SSA_NAME_VERSION (name));
+       didsomething = true;
      }
  
    if (dump_file)
      fprintf (dump_file, "Replacing SCC of size %d\n", scc.length ());
+   return didsomething;
  }
  
  /* Part of 'scc_copy_prop::propagate ()'.  */
*************** scc_copy_prop::visit_op (tree op, hash_s
*** 566,574 ****
       Braun, Buchwald, Hack, Leissa, Mallon, Zwinkau, 2013, LNCS vol. 7791,
       Section 3.2.  */
  
! void
  scc_copy_prop::propagate ()
  {
    auto_vec<gimple *> useful_stmts = get_all_stmt_may_generate_copy ();
    scc_discovery discovery;
  
--- 569,578 ----
       Braun, Buchwald, Hack, Leissa, Mallon, Zwinkau, 2013, LNCS vol. 7791,
       Section 3.2.  */
  
! bool
  scc_copy_prop::propagate ()
  {
+   bool didsomething = false;
    auto_vec<gimple *> useful_stmts = get_all_stmt_may_generate_copy ();
    scc_discovery discovery;
  
*************** scc_copy_prop::propagate ()
*** 636,642 ****
  	{
  	  /* The only operand in outer_ops.  */
  	  tree outer_op = last_outer_op;
! 	  replace_scc_by_value (scc, outer_op);
  	}
        else if (outer_ops.elements () > 1)
  	{
--- 640,646 ----
  	{
  	  /* The only operand in outer_ops.  */
  	  tree outer_op = last_outer_op;
! 	  didsomething |= replace_scc_by_value (scc, outer_op);
  	}
        else if (outer_ops.elements () > 1)
  	{
*************** scc_copy_prop::propagate ()
*** 651,656 ****
--- 655,661 ----
  
        scc.release ();
      }
+   return didsomething;
  }
  
  scc_copy_prop::scc_copy_prop ()
*************** const pass_data pass_data_sccopy =
*** 683,689 ****
    0, /* properties_provided */
    0, /* properties_destroyed */
    0, /* todo_flags_start */
!   TODO_update_ssa | TODO_cleanup_cfg, /* todo_flags_finish */
  };
  
  class pass_sccopy : public gimple_opt_pass
--- 688,694 ----
    0, /* properties_provided */
    0, /* properties_destroyed */
    0, /* todo_flags_start */
!   0, /* todo_flags_finish */
  };
  
  class pass_sccopy : public gimple_opt_pass
*************** unsigned
*** 703,710 ****
  pass_sccopy::execute (function *)
  {
    scc_copy_prop sccopy;
!   sccopy.propagate ();
!   return 0;
  }
  
  } // anon namespace
--- 708,714 ----
  pass_sccopy::execute (function *)
  {
    scc_copy_prop sccopy;
!   return sccopy.propagate () ?  TODO_cleanup_cfg : 0;
  }
  
  } // anon namespace
diff -Nrcpad gcc-16-20250525/gcc/gimplify.cc gcc-16-20250601/gcc/gimplify.cc
*** gcc-16-20250525/gcc/gimplify.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/gimplify.cc	Sun Jun  1 22:32:14 2025
*************** struct gimplify_omp_ctx
*** 273,278 ****
--- 273,279 ----
  {
    struct gimplify_omp_ctx *outer_context;
    splay_tree variables;
+   hash_map<omp_name_type<tree>, tree> *implicit_mappers;
    hash_set<tree> *privatized_types;
    tree clauses;
    /* Iteration variables in an OMP_FOR.  */
*************** new_omp_context (enum omp_region_type re
*** 507,512 ****
--- 508,514 ----
    c = XCNEW (struct gimplify_omp_ctx);
    c->outer_context = gimplify_omp_ctxp;
    c->variables = splay_tree_new (splay_tree_compare_decl_uid, 0, 0);
+   c->implicit_mappers = new hash_map<omp_name_type<tree>, tree>;
    c->privatized_types = new hash_set<tree>;
    c->location = input_location;
    c->region_type = region_type;
*************** delete_omp_context (struct gimplify_omp_
*** 530,535 ****
--- 532,538 ----
  {
    splay_tree_delete (c->variables);
    delete c->privatized_types;
+   delete c->implicit_mappers;
    c->loop_iter_var.release ();
    XDELETE (c);
  }
*************** error_out:
*** 12892,12897 ****
--- 12895,13112 ----
    return success;
  }
  
+ struct instantiate_mapper_info
+ {
+   tree *mapper_clauses_p;
+   struct gimplify_omp_ctx *omp_ctx;
+   gimple_seq *pre_p;
+ };
+ 
+ /* Helper function for omp_instantiate_mapper.  */
+ 
+ static tree
+ remap_mapper_decl_1 (tree *tp, int *walk_subtrees, void *data)
+ {
+   copy_body_data *id = (copy_body_data *) data;
+ 
+   if (DECL_P (*tp))
+     {
+       tree replacement = remap_decl (*tp, id);
+       if (*tp != replacement)
+ 	{
+ 	  *tp = unshare_expr (replacement);
+ 	  *walk_subtrees = 0;
+ 	}
+     }
+ 
+   return NULL_TREE;
+ }
+ 
+ /* A copy_decl implementation (for use with tree-inline.cc functions) that
+    only transform decls or SSA names that are part of a map we already
+    prepared.  */
+ 
+ static tree
+ omp_mapper_copy_decl (tree var, copy_body_data *cb)
+ {
+   tree *repl = cb->decl_map->get (var);
+ 
+   if (repl)
+     return *repl;
+ 
+   return var;
+ }
+ 
+ static tree *
+ omp_instantiate_mapper (gimple_seq *pre_p,
+ 			hash_map<omp_name_type<tree>, tree> *implicit_mappers,
+ 			tree mapperfn, tree expr, enum gomp_map_kind outer_kind,
+ 			tree *mapper_clauses_p)
+ {
+   tree mapper_name = NULL_TREE;
+   tree mapper = lang_hooks.decls.omp_extract_mapper_directive (mapperfn);
+   gcc_assert (TREE_CODE (mapper) == OMP_DECLARE_MAPPER);
+ 
+   tree clause = OMP_DECLARE_MAPPER_CLAUSES (mapper);
+   tree dummy_var = OMP_DECLARE_MAPPER_DECL (mapper);
+ 
+   /* The "extraction map" is used to map the mapper variable in the "declare
+      mapper" directive, and also any temporary variables that have been created
+      as part of expanding the mapper function's body (which are expanded as a
+      "bind" expression in the pre_p sequence).  */
+   hash_map<tree, tree> extraction_map;
+ 
+   extraction_map.put (dummy_var, expr);
+   extraction_map.put (expr, expr);
+ 
+   /* This copy_body_data is only used to remap the decls in the
+      OMP_DECLARE_MAPPER tree node expansion itself.  All relevant decls should
+      already be in the current function.  */
+   copy_body_data id;
+   memset (&id, 0, sizeof (id));
+   id.src_fn = current_function_decl;
+   id.dst_fn = current_function_decl;
+   id.src_cfun = cfun;
+   id.decl_map = &extraction_map;
+   id.copy_decl = omp_mapper_copy_decl;
+   id.transform_call_graph_edges = CB_CGE_DUPLICATE; // ???
+   id.transform_new_cfg = true; // ???
+ 
+   for (; clause; clause = OMP_CLAUSE_CHAIN (clause))
+     {
+       enum gomp_map_kind map_kind = OMP_CLAUSE_MAP_KIND (clause);
+       tree *nested_mapper_p = NULL;
+ 
+       if (map_kind == GOMP_MAP_PUSH_MAPPER_NAME)
+ 	{
+ 	  mapper_name = OMP_CLAUSE_DECL (clause);
+ 	  continue;
+ 	}
+       else if (map_kind == GOMP_MAP_POP_MAPPER_NAME)
+ 	{
+ 	  mapper_name = NULL_TREE;
+ 	  continue;
+ 	}
+ 
+       tree decl = OMP_CLAUSE_DECL (clause);
+       tree unshared, type;
+       bool nonunit_array_with_mapper = false;
+ 
+       if (TREE_CODE (decl) == OMP_ARRAY_SECTION)
+ 	{
+ 	  location_t loc = OMP_CLAUSE_LOCATION (clause);
+ 	  tree tmp = lang_hooks.decls.omp_map_array_section (loc, decl);
+ 	  if (tmp == decl)
+ 	    {
+ 	      unshared = unshare_expr (clause);
+ 	      nonunit_array_with_mapper = true;
+ 	      type = TREE_TYPE (TREE_TYPE (decl));
+ 	    }
+ 	  else
+ 	    {
+ 	      unshared = build_omp_clause (OMP_CLAUSE_LOCATION (clause),
+ 					   OMP_CLAUSE_CODE (clause));
+ 	      OMP_CLAUSE_DECL (unshared) = tmp;
+ 	      OMP_CLAUSE_SIZE (unshared)
+ 		= DECL_P (tmp) ? DECL_SIZE_UNIT (tmp)
+ 			       : TYPE_SIZE_UNIT (TREE_TYPE (tmp));
+ 	      type = TREE_TYPE (tmp);
+ 	    }
+ 	}
+       else
+ 	{
+ 	  unshared = unshare_expr (clause);
+ 	  type = TREE_TYPE (decl);
+ 	}
+ 
+       walk_tree (&unshared, remap_mapper_decl_1, &id, NULL);
+ 
+       if (OMP_CLAUSE_MAP_KIND (unshared) == GOMP_MAP_UNSET)
+ 	OMP_CLAUSE_SET_MAP_KIND (unshared, outer_kind);
+ 
+       decl = OMP_CLAUSE_DECL (unshared);
+       type = TYPE_MAIN_VARIANT (type);
+ 
+       nested_mapper_p = implicit_mappers->get ({ mapper_name, type });
+ 
+       if (nested_mapper_p && *nested_mapper_p != mapperfn)
+ 	{
+ 	  if (nonunit_array_with_mapper)
+ 	    {
+ 	      sorry ("user-defined mapper with non-unit length array section");
+ 	      continue;
+ 	    }
+ 
+ 	  if (map_kind == GOMP_MAP_UNSET)
+ 	    map_kind = outer_kind;
+ 
+ 	  mapper_clauses_p
+ 	    = omp_instantiate_mapper (pre_p, implicit_mappers,
+ 				      *nested_mapper_p, decl, map_kind,
+ 				      mapper_clauses_p);
+ 	  continue;
+ 	}
+ 
+       *mapper_clauses_p = unshared;
+       mapper_clauses_p = &OMP_CLAUSE_CHAIN (unshared);
+     }
+ 
+   return mapper_clauses_p;
+ }
+ 
+ static int
+ omp_instantiate_implicit_mappers (splay_tree_node n, void *data)
+ {
+   tree decl = (tree) n->key;
+   instantiate_mapper_info *im_info = (instantiate_mapper_info *) data;
+   gimplify_omp_ctx *ctx = im_info->omp_ctx;
+   tree *mapper_p = NULL;
+   tree type = TREE_TYPE (decl);
+   bool ref_p = false;
+   unsigned flags = n->value;
+ 
+   if (flags & (GOVD_EXPLICIT | GOVD_LOCAL))
+     return 0;
+   if ((flags & GOVD_SEEN) == 0)
+     return 0;
+   /* If we already have clauses pertaining to a struct variable, then we don't
+      want to implicitly invoke a user-defined mapper.  */
+   if ((flags & GOVD_EXPLICIT) != 0 && AGGREGATE_TYPE_P (TREE_TYPE (decl)))
+     return 0;
+ 
+   if (TREE_CODE (type) == REFERENCE_TYPE)
+     {
+       ref_p = true;
+       type = TREE_TYPE (type);
+     }
+ 
+   type = TYPE_MAIN_VARIANT (type);
+ 
+   if (DECL_P (decl) && type && AGGREGATE_TYPE_P (type))
+     {
+       gcc_assert (ctx);
+       mapper_p = ctx->implicit_mappers->get ({ NULL_TREE, type });
+     }
+ 
+   if (mapper_p)
+     {
+       /* If we have a reference, map the pointed-to object rather than the
+ 	 reference itself.  */
+       if (ref_p)
+ 	decl = build_fold_indirect_ref (decl);
+ 
+       im_info->mapper_clauses_p
+ 	= omp_instantiate_mapper (im_info->pre_p, ctx->implicit_mappers,
+ 				  *mapper_p, decl, GOMP_MAP_TOFROM,
+ 				  im_info->mapper_clauses_p);
+       /* Make sure we don't map the same variable implicitly in
+ 	 gimplify_adjust_omp_clauses_1 also.  */
+       n->value |= GOVD_EXPLICIT;
+     }
+ 
+   return 0;
+ }
+ 
  /* Scan the OMP clauses in *LIST_P, installing mappings into a new
     and previous omp contexts.  */
  
*************** gimplify_scan_omp_clauses (tree *list_p,
*** 13688,13693 ****
--- 13903,13919 ----
  	    }
  	  goto do_notice;
  
+ 	case OMP_CLAUSE__MAPPER_BINDING_:
+ 	  {
+ 	    tree name = OMP_CLAUSE__MAPPER_BINDING__ID (c);
+ 	    tree var = OMP_CLAUSE__MAPPER_BINDING__DECL (c);
+ 	    tree type = TYPE_MAIN_VARIANT (TREE_TYPE (var));
+ 	    tree fndecl = OMP_CLAUSE__MAPPER_BINDING__MAPPER (c);
+ 	    ctx->implicit_mappers->put ({ name, type }, fndecl);
+ 	    remove = true;
+ 	    break;
+ 	  }
+ 
  	case OMP_CLAUSE_USE_DEVICE_PTR:
  	case OMP_CLAUSE_USE_DEVICE_ADDR:
  	  flags = GOVD_EXPLICIT;
*************** gimplify_adjust_omp_clauses (gimple_seq
*** 14772,14777 ****
--- 14998,15027 ----
        || code == OMP_TARGET_ENTER_DATA
        || code == OMP_TARGET_EXIT_DATA)
      {
+       tree mapper_clauses = NULL_TREE;
+       instantiate_mapper_info im_info;
+ 
+       im_info.mapper_clauses_p = &mapper_clauses;
+       im_info.omp_ctx = ctx;
+       im_info.pre_p = pre_p;
+ 
+       splay_tree_foreach (ctx->variables,
+ 			  omp_instantiate_implicit_mappers,
+ 			  (void *) &im_info);
+ 
+       if (mapper_clauses)
+ 	{
+ 	  mapper_clauses
+ 	    = lang_hooks.decls.omp_finish_mapper_clauses (mapper_clauses);
+ 
+ 	  /* Stick the implicitly-expanded mapper clauses at the end of the
+ 	     clause list.  */
+ 	  tree *tail = list_p;
+ 	  while (*tail)
+ 	    tail = &OMP_CLAUSE_CHAIN (*tail);
+ 	  *tail = mapper_clauses;
+ 	}
+ 
        vec<omp_mapping_group> *groups;
        groups = omp_gather_mapping_groups (list_p);
        hash_map<tree_operand_hash_no_se, omp_mapping_group *> *grpmap = NULL;
*************** gimplify_omp_metadirective (tree *expr_p
*** 19257,19262 ****
--- 19507,19521 ----
    return GS_OK;
  }
  
+ /* Gimplify an OMP_DECLARE_MAPPER node (by just removing it).  */
+ 
+ static enum gimplify_status
+ gimplify_omp_declare_mapper (tree *expr_p)
+ {
+   *expr_p = NULL_TREE;
+   return GS_ALL_DONE;
+ }
+ 
  /* Convert the GENERIC expression tree *EXPR_P to GIMPLE.  If the
     expression produces a value to be used as an operand inside a GIMPLE
     statement, the value will be stored back in *EXPR_P.  This value will
*************** gimplify_expr (tree *expr_p, gimple_seq
*** 20218,20223 ****
--- 20477,20486 ----
  	  ret = GS_ALL_DONE;
  	  break;
  
+ 	case OMP_DECLARE_MAPPER:
+ 	  ret = gimplify_omp_declare_mapper (expr_p);
+ 	  break;
+ 
  	case TRANSACTION_EXPR:
  	  ret = gimplify_transaction (expr_p, pre_p);
  	  break;
diff -Nrcpad gcc-16-20250525/gcc/ginclude/stdcountof.h gcc-16-20250601/gcc/ginclude/stdcountof.h
*** gcc-16-20250525/gcc/ginclude/stdcountof.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/ginclude/stdcountof.h	Sun Jun  1 22:32:14 2025
***************
*** 0 ****
--- 1,31 ----
+ /* Copyright (C) 2025 Free Software Foundation, Inc.
+ 
+ This file is part of GCC.
+ 
+ GCC is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+ 
+ GCC is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ 
+ 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/>.  */
+ 
+ /* ISO C2Y: 7.21 Array count <stdcountof.h>.  */
+ 
+ #ifndef _STDCOUNTOF_H
+ #define _STDCOUNTOF_H
+ 
+ #define countof  _Countof
+ 
+ #endif	/* stdcountof.h */
diff -Nrcpad gcc-16-20250525/gcc/ipa-cp.cc gcc-16-20250601/gcc/ipa-cp.cc
*** gcc-16-20250525/gcc/ipa-cp.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/ipa-cp.cc	Sun Jun  1 22:32:14 2025
*************** cs_interesting_for_ipcp_p (cgraph_edge *
*** 544,551 ****
    if (e->count.ipa ().nonzero_p ())
      return true;
    /* If local (possibly guseed or adjusted 0 profile) claims edge is
!      not executed, do not propagate.  */
!   if (e->count.initialized_p () && !e->count.nonzero_p ())
      return false;
    /* If we have zero IPA profile, still consider edge for cloning
       in case we do partial training.  */
--- 544,555 ----
    if (e->count.ipa ().nonzero_p ())
      return true;
    /* If local (possibly guseed or adjusted 0 profile) claims edge is
!      not executed, do not propagate.
!      Do not trust AFDO since branch needs to be executed multiple
!      time to count while we want to propagate even call called
!      once during the train run if callee is important.  */
!   if (e->count.initialized_p () && !e->count.nonzero_p ()
!       && e->count.quality () != AFDO)
      return false;
    /* If we have zero IPA profile, still consider edge for cloning
       in case we do partial training.  */
diff -Nrcpad gcc-16-20250525/gcc/ipa-prop.cc gcc-16-20250601/gcc/ipa-prop.cc
*** gcc-16-20250525/gcc/ipa-prop.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/ipa-prop.cc	Sun Jun  1 22:32:14 2025
*************** ipa_dump_jump_function (FILE *f, ipa_jum
*** 542,547 ****
--- 542,548 ----
  
    if (jump_func->m_vr)
      {
+       fprintf (f, "         ");
        jump_func->m_vr->dump (f);
        fprintf (f, "\n");
      }
*************** update_jump_functions_after_inlining (st
*** 3329,3334 ****
--- 3330,3339 ----
    ipa_edge_args *args = ipa_edge_args_sum->get (e);
    if (!args)
      return;
+   ipa_node_params *old_inline_root_info = ipa_node_params_sum->get (cs->callee);
+   ipa_node_params *new_inline_root_info
+     = ipa_node_params_sum->get (cs->caller->inlined_to
+ 				? cs->caller->inlined_to : cs->caller);
    int count = ipa_get_cs_argument_count (args);
    int i;
  
*************** update_jump_functions_after_inlining (st
*** 3540,3545 ****
--- 3545,3574 ----
  		    enum tree_code operation;
  		    operation = ipa_get_jf_pass_through_operation (src);
  
+ 		    tree old_ir_ptype = ipa_get_type (old_inline_root_info,
+ 						      dst_fid);
+ 		    tree new_ir_ptype = ipa_get_type (new_inline_root_info,
+ 						      formal_id);
+ 		    if (!useless_type_conversion_p (old_ir_ptype, new_ir_ptype))
+ 		      {
+ 			/* Jump-function construction now permits type-casts
+ 			   from an integer to another if the latter can hold
+ 			   all values or has at least the same precision.
+ 			   However, as we're combining multiple pass-through
+ 			   functions together, we are losing information about
+ 			   signedness and thus if conversions should sign or
+ 			   zero extend.  Therefore we must prevent combining
+ 			   such jump-function if signednesses do not match.  */
+ 			if (!INTEGRAL_TYPE_P (old_ir_ptype)
+ 			    || !INTEGRAL_TYPE_P (new_ir_ptype)
+ 			    || (TYPE_UNSIGNED (new_ir_ptype)
+ 				!= TYPE_UNSIGNED (old_ir_ptype)))
+ 			  {
+ 			    ipa_set_jf_unknown (dst);
+ 			    continue;
+ 			  }
+ 		      }
+ 
  		    if (operation == NOP_EXPR)
  		      {
  			bool agg_p;
diff -Nrcpad gcc-16-20250525/gcc/ipa-split.cc gcc-16-20250601/gcc/ipa-split.cc
*** gcc-16-20250525/gcc/ipa-split.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/ipa-split.cc	Sun Jun  1 22:32:14 2025
*************** public:
*** 1992,1997 ****
--- 1992,2001 ----
        return execute_feedback_split_functions ();
      }
  
+   opt_pass * clone () final override
+   {
+     return new pass_feedback_split_functions (m_ctxt);
+   }
  }; // class pass_feedback_split_functions
  
  bool
diff -Nrcpad gcc-16-20250525/gcc/ipa-sra.cc gcc-16-20250601/gcc/ipa-sra.cc
*** gcc-16-20250525/gcc/ipa-sra.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/ipa-sra.cc	Sun Jun  1 22:32:14 2025
*************** scan_expr_access (tree expr, gimple *stm
*** 1848,1853 ****
--- 1848,1859 ----
    if (!desc || !desc->split_candidate)
      return;
  
+   if (storage_order_barrier_p (expr))
+     {
+       disqualify_split_candidate (desc, "Encountered a storage order barrier.");
+       return;
+     }
+ 
    if (!poffset.is_constant (&offset)
        || !psize.is_constant (&size)
        || !pmax_size.is_constant (&max_size))
diff -Nrcpad gcc-16-20250525/gcc/ipa-strub.cc gcc-16-20250601/gcc/ipa-strub.cc
*** gcc-16-20250525/gcc/ipa-strub.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/ipa-strub.cc	Sun Jun  1 22:32:14 2025
*************** const pass_data pass_data_ipa_strub = {
*** 1770,1777 ****
    0,	    // properties_start
    TODO_update_ssa
    | TODO_cleanup_cfg
!   | TODO_rebuild_cgraph_edges
!   | TODO_verify_il, // properties_finish
  };
  
  class pass_ipa_strub : public simple_ipa_opt_pass
--- 1770,1776 ----
    0,	    // properties_start
    TODO_update_ssa
    | TODO_cleanup_cfg
!   | TODO_rebuild_cgraph_edges, // properties_finish
  };
  
  class pass_ipa_strub : public simple_ipa_opt_pass
diff -Nrcpad gcc-16-20250525/gcc/langhooks-def.h gcc-16-20250601/gcc/langhooks-def.h
*** gcc-16-20250525/gcc/langhooks-def.h	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/langhooks-def.h	Sun Jun  1 22:32:14 2025
*************** extern bool lhd_omp_deep_mapping_p (cons
*** 90,95 ****
--- 90,98 ----
  extern tree lhd_omp_deep_mapping_cnt (const gimple *, tree, gimple_seq *);
  extern void lhd_omp_deep_mapping (const gimple *, tree, unsigned HOST_WIDE_INT,
  				  tree, tree, tree, tree, tree, gimple_seq *);
+ extern tree lhd_omp_mapper_lookup (tree, tree);
+ extern tree lhd_omp_extract_mapper_directive (tree);
+ extern tree lhd_omp_map_array_section (location_t, tree);
  struct gimplify_omp_ctx;
  extern void lhd_omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *,
  					       tree);
*************** extern tree lhd_unit_size_without_reusab
*** 279,284 ****
--- 282,292 ----
  #define LANG_HOOKS_OMP_DEEP_MAPPING_P lhd_omp_deep_mapping_p
  #define LANG_HOOKS_OMP_DEEP_MAPPING_CNT lhd_omp_deep_mapping_cnt
  #define LANG_HOOKS_OMP_DEEP_MAPPING lhd_omp_deep_mapping
+ #define LANG_HOOKS_OMP_FINISH_MAPPER_CLAUSES lhd_pass_through_t
+ #define LANG_HOOKS_OMP_MAPPER_LOOKUP lhd_omp_mapper_lookup
+ #define LANG_HOOKS_OMP_EXTRACT_MAPPER_DIRECTIVE \
+   lhd_omp_extract_mapper_directive
+ #define LANG_HOOKS_OMP_MAP_ARRAY_SECTION lhd_omp_map_array_section
  #define LANG_HOOKS_OMP_ALLOCATABLE_P hook_bool_tree_false
  #define LANG_HOOKS_OMP_SCALAR_P lhd_omp_scalar_p
  #define LANG_HOOKS_OMP_SCALAR_TARGET_P hook_bool_tree_false
*************** extern tree lhd_unit_size_without_reusab
*** 316,321 ****
--- 324,333 ----
    LANG_HOOKS_OMP_DEEP_MAPPING_P, \
    LANG_HOOKS_OMP_DEEP_MAPPING_CNT, \
    LANG_HOOKS_OMP_DEEP_MAPPING, \
+   LANG_HOOKS_OMP_FINISH_MAPPER_CLAUSES, \
+   LANG_HOOKS_OMP_MAPPER_LOOKUP, \
+   LANG_HOOKS_OMP_EXTRACT_MAPPER_DIRECTIVE, \
+   LANG_HOOKS_OMP_MAP_ARRAY_SECTION, \
    LANG_HOOKS_OMP_ALLOCATABLE_P, \
    LANG_HOOKS_OMP_SCALAR_P, \
    LANG_HOOKS_OMP_SCALAR_TARGET_P, \
diff -Nrcpad gcc-16-20250525/gcc/langhooks.cc gcc-16-20250601/gcc/langhooks.cc
*** gcc-16-20250525/gcc/langhooks.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/langhooks.cc	Sun Jun  1 22:32:14 2025
*************** lhd_omp_deep_mapping (const gimple *, tr
*** 669,674 ****
--- 669,700 ----
  {
  }
  
+ /* Look up an OpenMP "declare mapper" mapper.  */
+ 
+ tree
+ lhd_omp_mapper_lookup (tree, tree)
+ {
+   return NULL_TREE;
+ }
+ 
+ /* Given the representation used by the front-end to contain a mapper
+    directive, return the statement for the directive itself.  */
+ 
+ tree
+ lhd_omp_extract_mapper_directive (tree)
+ {
+   return error_mark_node;
+ }
+ 
+ /* Return a simplified form for OMP_ARRAY_SECTION argument, or
+    error_mark_node if impossible.  */
+ 
+ tree
+ lhd_omp_map_array_section (location_t, tree)
+ {
+   return error_mark_node;
+ }
+ 
  /* Return true if DECL is a scalar variable (for the purpose of
     implicit firstprivatization & mapping). Only if alloc_ptr_ok
     are allocatables and pointers accepted. */
diff -Nrcpad gcc-16-20250525/gcc/langhooks.h gcc-16-20250601/gcc/langhooks.h
*** gcc-16-20250525/gcc/langhooks.h	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/langhooks.h	Sun Jun  1 22:32:14 2025
*************** struct lang_hooks_for_decls
*** 328,333 ****
--- 328,349 ----
  			    tree data, tree sizes, tree kinds,
  			    tree offset_data, tree offset, gimple_seq *seq);
  
+   /* Finish language-specific processing on mapping nodes after expanding
+      user-defined mappers.  */
+   tree (*omp_finish_mapper_clauses) (tree clauses);
+ 
+   /* Find a mapper in the current parsing context, given a NAME (or
+      NULL_TREE) and TYPE.  */
+   tree (*omp_mapper_lookup) (tree name, tree type);
+ 
+   /* Return the statement for the mapper directive definition, from the
+      representation used to contain it (e.g. an inline function
+      declaration).  */
+   tree (*omp_extract_mapper_directive) (tree fndecl);
+ 
+   /* Return a simplified form for OMP_ARRAY_SECTION argument.  */
+   tree (*omp_map_array_section) (location_t, tree t);
+ 
    /* Return true if DECL is an allocatable variable (for the purpose of
       implicit mapping).  */
    bool (*omp_allocatable_p) (tree decl);
diff -Nrcpad gcc-16-20250525/gcc/m2/ChangeLog gcc-16-20250601/gcc/m2/ChangeLog
*** gcc-16-20250525/gcc/m2/ChangeLog	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/m2/ChangeLog	Sun Jun  1 22:32:14 2025
***************
*** 1,3 ****
--- 1,100 ----
+ 2025-06-01  Gaius Mulley  <gaiusmod2@gmail.com>
+ 
+ 	PR modula2/120497
+ 	* gm2-compiler/M2Range.mod (IsAssignmentCompatible): Remove from
+ 	import list.
+ 	(FoldTypeReturnFunc): Rewrite to skip the Lvalue of a var
+ 	variable.
+ 	(CodeTypeReturnFunc): Ditto.
+ 	(CodeTypeIndrX): Call AssignmentTypeCompatible rather than
+ 	IsAssignmentCompatible.
+ 	(FoldTypeIndrX): Ditto.
+ 
+ 2025-05-31  Gaius Mulley  <gaiusmod2@gmail.com>
+ 
+ 	PR modula2/120389
+ 	* gm2-compiler/M2Check.def (AssignmentTypeCompatible): Add new
+ 	parameter enableReason.
+ 	* gm2-compiler/M2Check.mod (EquivalenceProcedure): New type.
+ 	(falseReason2): New procedure function.
+ 	(falseReason1): Ditto.
+ 	(falseReason0): Ditto.
+ 	(checkTypeEquivalence): Rewrite.
+ 	(checkUnboundedArray): Ditto.
+ 	(checkUnbounded): Ditto.
+ 	(checkArrayTypeEquivalence): Ditto.
+ 	(checkCharStringTypeEquivalence): Ditto.
+ 	(buildError4): Add false reason.
+ 	(buildError2): Ditto.
+ 	(IsTyped): Use GetDType.
+ 	(IsTypeEquivalence): New procedure function.
+ 	(checkVarTypeEquivalence): Ditto.
+ 	(checkVarEquivalence ): Rewrite.
+ 	(checkConstMeta): Ditto.
+ 	(checkEnumField): New procedure function.
+ 	(checkEnumFieldEquivalence): Ditto.
+ 	(checkSubrangeTypeEquivalence): Rewrite.
+ 	(checkSystemEquivalence): Ditto.
+ 	(checkTypeKindViolation): Ditto.
+ 	(doCheckPair): Ditto.
+ 	(InitEquivalenceArray): New procedure.
+ 	(addEquivalence): Ditto.
+ 	(checkProcType): Rewrite.
+ 	(deconstruct): Deallocate reason string.
+ 	(AssignmentTypeCompatible): Initialize reason and reasonEnable
+ 	fields.
+ 	(ParameterTypeCompatible): Ditto.
+ 	(doExpressionTypeCompatible): Ditto.
+ 	* gm2-compiler/M2GenGCC.mod (CodeIndrX) Rewrite.
+ 	(CheckBinaryExpressionTypes): Rewrite and simplify now that the
+ 	type checker is more robust.
+ 	(CheckElementSetTypes): Ditto.
+ 	(CodeXIndr): Add new range assignment type check.
+ 	* gm2-compiler/M2MetaError.def: Correct comments.
+ 	* gm2-compiler/M2Options.def (SetStrictTypeAssignment): New procedure.
+ 	(SetStrictTypeReason): Ditto.
+ 	* gm2-compiler/M2Options.mod: (SetStrictTypeAssignment): New procedure.
+ 	(SetStrictTypeReason): Ditto.
+ 	(StrictTypeReason): Initialize.
+ 	(StrictTypeAssignment): Ditto.
+ 	* gm2-compiler/M2Quads.mod (CheckBreak): Delete.
+ 	(BreakQuad): New global variable.
+ 	(BreakAtQuad): Delete.
+ 	(gdbhook): New procedure.
+ 	(BreakWhenQuadCreated): Ditto.
+ 	(CheckBreak): Ditto.
+ 	(Init): Call BreakWhenQuadCreated and gdbhook.
+ 	(doBuildAssignment): Add type assignment range check.
+ 	(CheckProcTypeAndProcedure): Only check if the procedure
+ 	types differ.
+ 	(doIndrX): Add type IndrX range check.
+ 	(CheckReturnType): Add range return type check.
+ 	* gm2-compiler/M2Range.def (InitTypesIndrXCheck): New procedure
+ 	function.
+ 	(InitTypesReturnTypeCheck): Ditto.
+ 	* gm2-compiler/M2Range.mod (InitTypesIndrXCheck): New procedure
+ 	function.
+ 	(InitTypesReturnTypeCheck): Ditto.
+ 	(HandlerExists): Add new clauses.
+ 	(FoldAssignment): Pass extra FALSE parameter to
+ 	AssignmentTypeCompatible.
+ 	(FoldTypeReturnFunc): New procedure.
+ 	(FoldTypeAssign): Ditto.
+ 	(FoldTypeIndrX): Ditto.
+ 	(CodeTypeAssign): Rewrite.
+ 	(CodeTypeIndrX): New procedure.
+ 	(CodeTypeReturnFunc): Ditto.
+ 	(FoldTypeCheck): Add new case clauses.
+ 	(CodeTypeCheck): Ditto.
+ 	(FoldRangeCheckLower): Ditto.
+ 	(IssueWarning): Ditto.
+ 	* gm2-gcc/m2options.h (M2Options_SetStrictTypeAssignment): New
+ 	function prototype.
+ 	(M2Options_SetStrictTypeReason): Ditto.
+ 	* gm2-lang.cc (gm2_langhook_handle_option): New case clause
+ 	OPT_fm2_strict_type_reason.
+ 	* lang.opt (-fm2-strict-type-reason): New option.
+ 
  2025-05-22  Gaius Mulley  <gaiusmod2@gmail.com>
  
  	PR modula2/120389
diff -Nrcpad gcc-16-20250525/gcc/m2/gm2-compiler/M2Check.def gcc-16-20250601/gcc/m2/gm2-compiler/M2Check.def
*** gcc-16-20250525/gcc/m2/gm2-compiler/M2Check.def	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/m2/gm2-compiler/M2Check.def	Sun Jun  1 22:32:14 2025
*************** PROCEDURE ParameterTypeCompatible (token
*** 50,56 ****
  *)
  
  PROCEDURE AssignmentTypeCompatible (token: CARDINAL; format: ARRAY OF CHAR;
!                                     des, expr: CARDINAL) : BOOLEAN ;
  
  
  (*
--- 50,57 ----
  *)
  
  PROCEDURE AssignmentTypeCompatible (token: CARDINAL; format: ARRAY OF CHAR;
!                                     des, expr: CARDINAL;
!                                     enableReason: BOOLEAN) : BOOLEAN ;
  
  
  (*
diff -Nrcpad gcc-16-20250525/gcc/m2/gm2-compiler/M2Check.mod gcc-16-20250601/gcc/m2/gm2-compiler/M2Check.mod
*** gcc-16-20250525/gcc/m2/gm2-compiler/M2Check.mod	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/m2/gm2-compiler/M2Check.mod	Sun Jun  1 22:32:14 2025
*************** FROM M2System IMPORT IsSystemType, IsGen
*** 36,61 ****
  FROM M2Base IMPORT IsParameterCompatible, IsAssignmentCompatible, IsExpressionCompatible, IsComparisonCompatible, IsBaseType, IsMathType, ZType, CType, RType, IsComplexType, Char ;
  FROM Indexing IMPORT Index, InitIndex, GetIndice, PutIndice, KillIndex, HighIndice, LowIndice, IncludeIndiceIntoIndex, ForeachIndiceInIndexDo ;
  FROM M2Error IMPORT Error, InternalError, NewError, ErrorString, ChainError ;
! FROM M2MetaError IMPORT MetaErrorStringT2, MetaErrorStringT3, MetaErrorStringT4, MetaString2, MetaString3, MetaString4, MetaError1 ;
  FROM StrLib IMPORT StrEqual ;
  FROM M2Debug IMPORT Assert ;
  
! FROM SymbolTable IMPORT NulSym, IsRecord, IsSet, GetDType, GetSType, IsType,
                          SkipType, IsProcedure, NoOfParamAny, IsVarParamAny, GetNth,
                          GetNthParamAny, IsProcType, IsVar, IsEnumeration, IsArray,
                          IsSubrange, GetArraySubscript, IsConst,
                          IsReallyPointer, IsPointer, IsParameter, ModeOfAddr,
!                         GetMode, GetType, IsUnbounded, IsComposite, IsConstructor,
                          IsParameter, IsConstString, IsConstLitInternal, IsConstLit,
                          GetStringLength, GetProcedureProcType, IsHiddenType,
!                         IsHiddenReallyPointer, GetDimension ;
  
  FROM M2GCCDeclare IMPORT GetTypeMin, GetTypeMax ;
  FROM M2System IMPORT Address ;
  FROM M2ALU IMPORT Equ, PushIntegerTree ;
  FROM m2expr IMPORT AreConstantsEqual ;
! FROM SymbolConversion IMPORT Mod2Gcc ;
! FROM DynamicStrings IMPORT String, InitString, KillString ;
  FROM M2LexBuf IMPORT GetTokenNo ;
  FROM Storage IMPORT ALLOCATE ;
  FROM SYSTEM IMPORT ADR ;
--- 36,68 ----
  FROM M2Base IMPORT IsParameterCompatible, IsAssignmentCompatible, IsExpressionCompatible, IsComparisonCompatible, IsBaseType, IsMathType, ZType, CType, RType, IsComplexType, Char ;
  FROM Indexing IMPORT Index, InitIndex, GetIndice, PutIndice, KillIndex, HighIndice, LowIndice, IncludeIndiceIntoIndex, ForeachIndiceInIndexDo ;
  FROM M2Error IMPORT Error, InternalError, NewError, ErrorString, ChainError ;
! 
! FROM M2MetaError IMPORT MetaErrorStringT0, MetaErrorStringT2, MetaErrorStringT3,
!                         MetaErrorStringT4,
!                         MetaString0, MetaString1, MetaString2, MetaString3,
!                         MetaString4,
!                         MetaError0, MetaError1 ;
! 
  FROM StrLib IMPORT StrEqual ;
  FROM M2Debug IMPORT Assert ;
  
! FROM SymbolTable IMPORT NulSym, IsRecord, IsSet, GetDType, GetType, IsType,
                          SkipType, IsProcedure, NoOfParamAny, IsVarParamAny, GetNth,
                          GetNthParamAny, IsProcType, IsVar, IsEnumeration, IsArray,
                          IsSubrange, GetArraySubscript, IsConst,
                          IsReallyPointer, IsPointer, IsParameter, ModeOfAddr,
!                         GetMode, IsUnbounded, IsComposite, IsConstructor,
                          IsParameter, IsConstString, IsConstLitInternal, IsConstLit,
                          GetStringLength, GetProcedureProcType, IsHiddenType,
!                         IsHiddenReallyPointer, GetDimension, IsFieldEnumeration ;
  
  FROM M2GCCDeclare IMPORT GetTypeMin, GetTypeMax ;
  FROM M2System IMPORT Address ;
  FROM M2ALU IMPORT Equ, PushIntegerTree ;
+ FROM M2Options IMPORT StrictTypeReason ;
  FROM m2expr IMPORT AreConstantsEqual ;
! FROM SymbolConversion IMPORT Mod2Gcc, GccKnowsAbout ;
! FROM DynamicStrings IMPORT String, InitString, KillString, ConCat, Mark ;
  FROM M2LexBuf IMPORT GetTokenNo ;
  FROM Storage IMPORT ALLOCATE ;
  FROM SYSTEM IMPORT ADR ;
*************** FROM libc IMPORT printf ;
*** 63,69 ****
  
  
  CONST
!    debugging = FALSE ;
  
  TYPE
     errorSig = POINTER TO RECORD
--- 70,77 ----
  
  
  CONST
!    debugging     = FALSE ;
!    MaxEquvalence = 20 ;
  
  TYPE
     errorSig = POINTER TO RECORD
*************** TYPE
*** 83,88 ****
--- 91,98 ----
     checkType = (parameter, assignment, expression) ;
  
     tInfo = POINTER TO RECORD
+                          reasonEnable: BOOLEAN ;
+                          reason,
                           format    : String ;
                           kind      : checkType ;
                           token,
*************** TYPE
*** 105,115 ****
  
     status = (true, false, unknown, visited, unused) ;
  
  
  VAR
!    pairFreeList : pair ;
!    tinfoFreeList: tInfo ;
!    errors       : Index ;
  
  
  (*
--- 115,128 ----
  
     status = (true, false, unknown, visited, unused) ;
  
+    EquivalenceProcedure = PROCEDURE (status, tInfo, CARDINAL, CARDINAL) : status ;
  
  VAR
!    pairFreeList   : pair ;
!    tinfoFreeList  : tInfo ;
!    errors         : Index ;
!    HighEquivalence: CARDINAL ;
!    Equivalence    : ARRAY [1..MaxEquvalence] OF EquivalenceProcedure ;
  
  
  (*
*************** END dumptInfo ;
*** 159,164 ****
--- 172,224 ----
  
  
  (*
+    falseReason2 - return false.  It also stores the message as the
+                   reason for the false value.
+ *)
+ 
+ PROCEDURE falseReason2 (message: ARRAY OF CHAR; tinfo: tInfo;
+                         left, right: CARDINAL) : status ;
+ BEGIN
+    IF tinfo^.reasonEnable AND (tinfo^.reason = NIL)
+    THEN
+       tinfo^.reason := MetaString2 (InitString (message), left, right)
+    END ;
+    RETURN false
+ END falseReason2 ;
+ 
+ 
+ (*
+    falseReason1 - return false.  It also stores the message as the
+                   reason for the false value.
+ *)
+ 
+ PROCEDURE falseReason1 (message: ARRAY OF CHAR; tinfo: tInfo;
+                         operand: CARDINAL) : status ;
+ BEGIN
+    IF tinfo^.reasonEnable AND (tinfo^.reason = NIL)
+    THEN
+       tinfo^.reason := MetaString1 (InitString (message), operand)
+    END ;
+    RETURN false
+ END falseReason1 ;
+ 
+ 
+ (*
+    falseReason0 - return false.  It also stores the message as the
+                   reason for the false value.
+ *)
+ 
+ PROCEDURE falseReason0 (message: ARRAY OF CHAR; tinfo: tInfo) : status ;
+ BEGIN
+    IF tinfo^.reasonEnable AND (tinfo^.reason = NIL)
+    THEN
+       tinfo^.reason := MetaString0 (InitString (message))
+    END ;
+    RETURN false
+ END falseReason0 ;
+ 
+ 
+ (*
     isKnown - returns BOOLEAN:TRUE if result is status:true or status:false.
  *)
  
*************** END isFalse ;
*** 192,222 ****
     checkTypeEquivalence - returns TRUE if left and right can be skipped and found to be equal.
  *)
  
! PROCEDURE checkTypeEquivalence (result: status; left, right: CARDINAL) : status ;
! VAR
!    leftT, rightT: CARDINAL ;
  BEGIN
!    (* firstly check to see if we already have resolved this as false.  *)
!    IF isFalse (result)
     THEN
!       RETURN result
!    ELSE
!       (* check to see if we dont care about left or right.  *)
!       IF (left = NulSym) OR (right = NulSym)
        THEN
           RETURN true
-       ELSE
-          leftT := SkipType (left) ;
-          rightT := SkipType (right) ;
-          IF leftT = rightT
-          THEN
-             RETURN true
-          ELSIF IsType (leftT) AND IsType (rightT)
-          THEN
-             (* the fundamental types are definitely different.  *)
-             RETURN false
-          END
        END
     END ;
     RETURN result
  END checkTypeEquivalence ;
--- 252,280 ----
     checkTypeEquivalence - returns TRUE if left and right can be skipped and found to be equal.
  *)
  
! PROCEDURE checkTypeEquivalence (result: status;
!                                 tinfo: tInfo;
!                                 left, right: CARDINAL) : status ;
  BEGIN
!    IF left = right
     THEN
!       RETURN true
!    ELSIF IsType (left) AND IsType (right)
!    THEN
!       IF IsHiddenType (left) AND IsHiddenType (right)
!       THEN
!          RETURN falseReason2 ('opaque types {%1a} {%2a} differ', tinfo, left, right)
!       ELSIF (IsHiddenType (left) AND (right = Address)) OR
!             (IsHiddenType (right) AND (left = Address))
        THEN
           RETURN true
        END
+    ELSIF IsTypeEquivalence (left)
+    THEN
+       RETURN checkPair (result, tinfo, GetDType (left), right)
+    ELSIF IsTypeEquivalence (right)
+    THEN
+       RETURN checkPair (result, tinfo, left, GetDType (right))
     END ;
     RETURN result
  END checkTypeEquivalence ;
*************** BEGIN
*** 246,258 ****
        PushIntegerTree (Mod2Gcc (rLow)) ;
        IF NOT Equ (tinfo^.token)
        THEN
!          RETURN false
        END ;
        PushIntegerTree (Mod2Gcc (lHigh)) ;
        PushIntegerTree (Mod2Gcc (rHigh)) ;
        IF NOT Equ (tinfo^.token)
        THEN
!          RETURN false
        END
     END ;
     RETURN true
--- 304,318 ----
        PushIntegerTree (Mod2Gcc (rLow)) ;
        IF NOT Equ (tinfo^.token)
        THEN
!          RETURN falseReason2 ('low values of the subrange types {%1a} {%2a} differ',
!                               tinfo, left, right)
        END ;
        PushIntegerTree (Mod2Gcc (lHigh)) ;
        PushIntegerTree (Mod2Gcc (rHigh)) ;
        IF NOT Equ (tinfo^.token)
        THEN
!          RETURN falseReason2 ('high values of the subrange types {%1a} {%2a} differ',
!                               tinfo, left, right)
        END
     END ;
     RETURN true
*************** END checkSubrange ;
*** 266,271 ****
--- 326,332 ----
  *)
  
  PROCEDURE checkUnboundedArray (result: status;
+                                tinfo: tInfo;
                                 unbounded, array: CARDINAL) : status ;
  VAR
     dim   : CARDINAL ;
*************** BEGIN
*** 280,292 ****
        Assert (IsUnbounded (unbounded)) ;
        Assert (IsArray (array)) ;
        dim := GetDimension (unbounded) ;
!       ubtype := GetType (unbounded) ;
        type := array ;
        REPEAT
!          type := GetType (type) ;
           DEC (dim) ;
           (* Check type equivalences.  *)
!          IF checkTypeEquivalence (result, type, ubtype) = true
           THEN
              RETURN true
           END ;
--- 341,353 ----
        Assert (IsUnbounded (unbounded)) ;
        Assert (IsArray (array)) ;
        dim := GetDimension (unbounded) ;
!       ubtype := GetDType (unbounded) ;
        type := array ;
        REPEAT
!          type := GetDType (type) ;
           DEC (dim) ;
           (* Check type equivalences.  *)
!          IF checkTypeEquivalence (result, tinfo, type, ubtype) = true
           THEN
              RETURN true
           END ;
*************** BEGIN
*** 294,304 ****
           (* If we have run out of dimensions we conclude false.  *)
           IF dim = 0
           THEN
!             RETURN false
           END ;
        UNTIL NOT IsArray (type)
     END ;
!    RETURN false
  END checkUnboundedArray ;
  
  
--- 355,367 ----
           (* If we have run out of dimensions we conclude false.  *)
           IF dim = 0
           THEN
!             RETURN falseReason0 ('unbounded array has less dimensions than the array',
!                                  tinfo)
           END ;
        UNTIL NOT IsArray (type)
     END ;
!    RETURN falseReason0 ('array has less dimensions than the unbounded array',
!                         tinfo)
  END checkUnboundedArray ;
  
  
*************** BEGIN
*** 327,340 ****
           referenced.  We use GetDimension for 'bar' which is 2.  *)
        IF GetDimension (formal) # GetDimension (tinfo^.actual)
        THEN
!          RETURN false
        END ;
!       IF checkTypeEquivalence (result, GetType (formal), GetType (actual)) = true
        THEN
           RETURN true
        END
     END ;
!    RETURN false
  END checkUnboundedUnbounded ;
  
  
--- 390,407 ----
           referenced.  We use GetDimension for 'bar' which is 2.  *)
        IF GetDimension (formal) # GetDimension (tinfo^.actual)
        THEN
!          RETURN falseReason2 ('the formal parameter unbounded array {%1a} has a different number' +
!                               '  of dimensions to the actual parameter unbounded array {%2a}',
!                               tinfo, formal, actual)
        END ;
!       IF checkTypeEquivalence (result, tinfo, GetType (formal), GetType (actual)) = true
        THEN
           RETURN true
        END
     END ;
!    RETURN falseReason2 ('the formal unbounded array type {%1a}' +
!                         ' and the actual unbounded array type {%2a} differ',
!                         tinfo, formal, actual)
  END checkUnboundedUnbounded ;
  
  
*************** BEGIN
*** 373,382 ****
              END
           ELSIF IsArray (right)
           THEN
!             RETURN checkUnboundedArray (result, unbounded, right)
           ELSIF IsUnbounded (right)
           THEN
              RETURN checkUnboundedUnbounded (result, tinfo, unbounded, right)
           END
        END
     END ;
--- 440,453 ----
              END
           ELSIF IsArray (right)
           THEN
!             RETURN checkUnboundedArray (result, tinfo, unbounded, right)
           ELSIF IsUnbounded (right)
           THEN
              RETURN checkUnboundedUnbounded (result, tinfo, unbounded, right)
+          ELSE
+             RETURN falseReason2 ('the formal unbounded array type {%1a}' +
+                                  ' and the actual unbounded array type {%2a} differ',
+                                  tinfo, unbounded, right)
           END
        END
     END ;
*************** BEGIN
*** 400,406 ****
     THEN
        lSub := GetArraySubscript (left) ;
        rSub := GetArraySubscript (right) ;
!       result := checkPair (result, tinfo, GetSType (left), GetSType (right)) ;
        IF (lSub # NulSym) AND (rSub # NulSym)
        THEN
           result := checkSubrange (result, tinfo, getSType (lSub), getSType (rSub))
--- 471,477 ----
     THEN
        lSub := GetArraySubscript (left) ;
        rSub := GetArraySubscript (right) ;
!       result := checkPair (result, tinfo, GetDType (left), GetDType (right)) ;
        IF (lSub # NulSym) AND (rSub # NulSym)
        THEN
           result := checkSubrange (result, tinfo, getSType (lSub), getSType (rSub))
*************** BEGIN
*** 423,453 ****
        END
     ELSIF IsArray (left) AND IsConst (right)
     THEN
!       result := checkPair (result, tinfo, GetType (left), GetType (right))
     ELSIF IsArray (right) AND IsConst (left)
     THEN
!       result := checkPair (result, tinfo, GetType (left), GetType (right))
     END ;
     RETURN result
  END checkArrayTypeEquivalence ;
  
  
  (*
!    checkGenericTypeEquivalence - check left and right for generic equivalence.
  *)
  
! PROCEDURE checkGenericTypeEquivalence (result: status; left, right: CARDINAL) : status ;
  BEGIN
     IF isFalse (result)
     THEN
        RETURN result
!    ELSIF left = right
     THEN
!       RETURN true
!    ELSE
!       RETURN result
!    END
! END checkGenericTypeEquivalence ;
  
  
  (*
--- 494,551 ----
        END
     ELSIF IsArray (left) AND IsConst (right)
     THEN
!       result := checkPair (result, tinfo, GetDType (left), GetDType (right))
     ELSIF IsArray (right) AND IsConst (left)
     THEN
!       result := checkPair (result, tinfo, GetDType (left), GetDType (right))
     END ;
     RETURN result
  END checkArrayTypeEquivalence ;
  
  
  (*
!    checkCharStringTypeEquivalence - check char and string constants for type equivalence.
  *)
  
! PROCEDURE checkCharStringTypeEquivalence (result: status; tinfo: tInfo;
!                                           left, right: CARDINAL) : status ;
  BEGIN
     IF isFalse (result)
     THEN
        RETURN result
!    ELSIF left = Char
     THEN
!       IF IsConst (right)
!       THEN
!          (* We might not know the length of the string yet, in which case we return true.  *)
!          IF IsConstString (right) AND
!             ((NOT GccKnowsAbout (right)) OR (GetStringLength (tinfo^.token, right) <= 1))
!          THEN
!             RETURN true
!          ELSE
!             RETURN falseReason2 ('the string {%2a} does not fit into a {%1a}',
!                                  tinfo, left, right)
!          END
!       ELSIF IsParameter (right)
!       THEN
!          right := GetDType (right) ;
!          IF (right = Char) OR (IsUnbounded (right) AND (SkipType (GetDType (right)) = Char))
!          THEN
!             RETURN true
!          END
!       ELSIF IsArray (right)
!       THEN
!          IF Char = SkipType (GetDType (right))
!          THEN
!             RETURN true
!          END
!       END
!    ELSIF right = Char
!    THEN
!       RETURN checkCharStringTypeEquivalence (result, tinfo, right, left)
!    END ;
!    RETURN result
! END checkCharStringTypeEquivalence ;
  
  
  (*
*************** BEGIN
*** 491,497 ****
     THEN
        IF tinfo^.error = NIL
        THEN
!          (* need to create top level error message first.  *)
           tinfo^.error := NewError (tinfo^.token) ;
           (* The parameters to MetaString4 in buildError4 must match the order
              of paramters passed to ParameterTypeCompatible.  *)
--- 589,595 ----
     THEN
        IF tinfo^.error = NIL
        THEN
!          (* We need to create top level error message first.  *)
           tinfo^.error := NewError (tinfo^.token) ;
           (* The parameters to MetaString4 in buildError4 must match the order
              of paramters passed to ParameterTypeCompatible.  *)
*************** BEGIN
*** 499,507 ****
                             tinfo^.procedure,
                             tinfo^.formal, tinfo^.actual,
                             tinfo^.nth) ;
           ErrorString (tinfo^.error, s)
        END ;
!       (* and also generate a sub error containing detail.  *)
        IF (left # tinfo^.left) OR (right # tinfo^.right)
        THEN
           MetaError1 ('formal parameter {%1EDad}', right) ;
--- 597,613 ----
                             tinfo^.procedure,
                             tinfo^.formal, tinfo^.actual,
                             tinfo^.nth) ;
+          (* Append the overall reason for the failure.  *)
+          IF tinfo^.reason # NIL
+          THEN
+             (* The string tinfo^.reason is given to the error handler.  *)
+             s := ConCat (s, Mark (InitString (" because "))) ;
+             s := ConCat (s, tinfo^.reason) ;
+             tinfo^.reason := NIL   (* Hand over deconstructing to M2MetaError.  *)
+          END ;
           ErrorString (tinfo^.error, s)
        END ;
!       (* And now also generate a sub error containing detail.  *)
        IF (left # tinfo^.left) OR (right # tinfo^.right)
        THEN
           MetaError1 ('formal parameter {%1EDad}', right) ;
*************** END buildError4 ;
*** 512,518 ****
  
  
  (*
!    buildError2 - generate a MetaString2 error.  This is called by all three kinds of errors.
  *)
  
  PROCEDURE buildError2 (tinfo: tInfo; left, right: CARDINAL) ;
--- 618,624 ----
  
  
  (*
!    buildError2 - generate a MetaString2 error.
  *)
  
  PROCEDURE buildError2 (tinfo: tInfo; left, right: CARDINAL) ;
*************** BEGIN
*** 543,548 ****
--- 649,662 ----
                                         left, right)
  
           END ;
+          (* Lastly the overall reason for the failure.  *)
+          IF tinfo^.reason # NIL
+          THEN
+             (* The string tinfo^.reason is given to the error handler.  *)
+             s := ConCat (s, Mark (InitString (" because "))) ;
+             s := ConCat (s, tinfo^.reason) ;
+             tinfo^.reason := NIL   (* Hand over deconstructing to M2MetaError.  *)
+          END ;
           ErrorString (tinfo^.error, s)
        END
     END
*************** BEGIN
*** 559,565 ****
     THEN
        RETURN true
     ELSE
!       (* check whether errors are required.  *)
        IF tinfo^.format # NIL
        THEN
           CASE tinfo^.kind OF
--- 673,679 ----
     THEN
        RETURN true
     ELSE
!       (* Check whether errors are required.  *)
        IF tinfo^.format # NIL
        THEN
           CASE tinfo^.kind OF
*************** PROCEDURE IsTyped (sym: CARDINAL) : BOOL
*** 700,710 ****
  BEGIN
     RETURN IsVar (sym) OR IsParameter (sym) OR IsConstructor (sym) OR
            (IsConst (sym) AND IsConstructor (sym)) OR IsParameter (sym) OR
!           (IsConst (sym) AND (GetType (sym) # NulSym))
  END IsTyped ;
  
  
  (*
     isLValue -
  *)
  
--- 814,834 ----
  BEGIN
     RETURN IsVar (sym) OR IsParameter (sym) OR IsConstructor (sym) OR
            (IsConst (sym) AND IsConstructor (sym)) OR IsParameter (sym) OR
!           (IsConst (sym) AND (GetDType (sym) # NulSym))
  END IsTyped ;
  
  
  (*
+    IsTypeEquivalence - returns TRUE if sym is a type equivalence symbol.
+ *)
+ 
+ PROCEDURE IsTypeEquivalence (sym: CARDINAL) : BOOLEAN ;
+ BEGIN
+    RETURN IsType (sym) AND (GetDType (sym) # NulSym) AND (GetDType (sym) # sym)
+ END IsTypeEquivalence ;
+ 
+ 
+ (*
     isLValue -
  *)
  
*************** END isLValue ;
*** 715,720 ****
--- 839,876 ----
  
  
  (*
+    checkVarTypeEquivalence -
+ *)
+ 
+ PROCEDURE checkVarTypeEquivalence (result: status; tinfo: tInfo;
+                                    left, right: CARDINAL) : status ;
+ BEGIN
+    IF isFalse (result)
+    THEN
+       RETURN result
+    ELSIF (left = NulSym) OR (right = NulSym)
+    THEN
+       RETURN true
+    ELSE
+       IF IsVar (left) OR IsVar (right)
+       THEN
+          (* Either left or right will change, so we can call doCheckPair.  *)
+          IF IsVar (left)
+          THEN
+             left := getType (left)
+          END ;
+          IF IsVar (right)
+          THEN
+             right := getType (right)
+          END ;
+          RETURN doCheckPair (result, tinfo, left, right)
+       END
+    END ;
+    RETURN result
+ END checkVarTypeEquivalence ;
+ 
+ 
+ (*
     checkVarEquivalence - this test must be done early as it checks the symbol mode.
                           An LValue is treated as a pointer during assignment and the
                           LValue is attached to a variable.  This function skips the variable
*************** END isLValue ;
*** 722,761 ****
  *)
  
  PROCEDURE checkVarEquivalence (result: status; tinfo: tInfo;
!                                left, right: CARDINAL) : status ;
  BEGIN
     IF isFalse (result)
     THEN
        RETURN result
!    ELSIF IsTyped (left) OR IsTyped (right)
     THEN
        IF tinfo^.kind = assignment
        THEN
           (* LValues are only relevant during assignment.  *)
!          IF isLValue (left) AND (NOT isLValue (right))
           THEN
!             IF SkipType (getType (right)) = Address
              THEN
                 RETURN true
!             ELSIF IsPointer (SkipType (getType (right)))
              THEN
!                right := GetDType (SkipType (getType (right)))
              END
!          ELSIF isLValue (right) AND (NOT isLValue (left))
           THEN
!             IF SkipType (getType (left)) = Address
              THEN
                 RETURN true
!             ELSIF IsPointer (SkipType (getType (left)))
              THEN
!                left := GetDType (SkipType (getType (left)))
              END
           END
        END ;
!       RETURN doCheckPair (result, tinfo, getType (left), getType (right))
!    ELSE
!       RETURN result
!    END
  END checkVarEquivalence ;
  
  
--- 878,921 ----
  *)
  
  PROCEDURE checkVarEquivalence (result: status; tinfo: tInfo;
!                                des, expr: CARDINAL) : status ;
  BEGIN
     IF isFalse (result)
     THEN
        RETURN result
!    ELSIF IsTyped (des) OR IsTyped (expr)
     THEN
        IF tinfo^.kind = assignment
        THEN
+          IF GetDType (des) = GetDType (expr)
+          THEN
+             RETURN true
           (* LValues are only relevant during assignment.  *)
!          ELSIF isLValue (des) AND (NOT isLValue (expr))
           THEN
!             IF SkipType (getType (expr)) = Address
              THEN
                 RETURN true
!             ELSIF IsPointer (SkipType (getType (expr)))
              THEN
!                expr := GetDType (SkipType (getType (expr))) ;
!                RETURN doCheckPair (result, tinfo, getType (des), expr)
              END
!          ELSIF isLValue (expr) AND (NOT isLValue (des))
           THEN
!             IF SkipType (getType (des)) = Address
              THEN
                 RETURN true
!             ELSIF IsPointer (SkipType (getType (des)))
              THEN
!                des := GetDType (SkipType (getType (des))) ;
!                RETURN doCheckPair (result, tinfo, des, getType (expr))
              END
           END
        END ;
!       RETURN doCheckPair (result, tinfo, getType (des), getType (expr))
!    END ;
!    RETURN result
  END checkVarEquivalence ;
  
  
*************** BEGIN
*** 790,799 ****
                 IsProcedure (typeRight) OR IsRecord (typeRight) OR
                 IsReallyPointer (typeRight)
           THEN
!             RETURN false
           ELSIF IsArray (typeRight)
           THEN
!             RETURN doCheckPair (result, tinfo, Char, GetType (typeRight))
           ELSIF GetStringLength (tinfo^.token, left) = 1
           THEN
              RETURN doCheckPair (result, tinfo, Char, typeRight)
--- 950,964 ----
                 IsProcedure (typeRight) OR IsRecord (typeRight) OR
                 IsReallyPointer (typeRight)
           THEN
!             RETURN falseReason1 ('constant string is incompatible with {%1ad}',
!                                  tinfo, typeRight)
           ELSIF IsArray (typeRight)
           THEN
!             RETURN doCheckPair (result, tinfo, Char, GetDType (typeRight))
!          ELSIF NOT GccKnowsAbout (left)
!          THEN
!             (* We do not know the length of this string, so assume true.  *)
!             RETURN true
           ELSIF GetStringLength (tinfo^.token, left) = 1
           THEN
              RETURN doCheckPair (result, tinfo, Char, typeRight)
*************** BEGIN
*** 805,811 ****
        typeLeft := GetDType (left) ;
        IF IsZRCType (typeLeft) AND IsUnbounded (typeRight)
        THEN
!          RETURN false
        ELSE
           RETURN doCheckPair (result, tinfo, typeLeft, typeRight)
        END
--- 970,978 ----
        typeLeft := GetDType (left) ;
        IF IsZRCType (typeLeft) AND IsUnbounded (typeRight)
        THEN
!          RETURN falseReason2 ('the constant {%1a} is incompatible' +
!                               ' with an unbounded array of {%2a}',
!                               tinfo, typeLeft, typeRight)
        ELSE
           RETURN doCheckPair (result, tinfo, typeLeft, typeRight)
        END
*************** END checkConstMeta ;
*** 815,820 ****
--- 982,1039 ----
  
  
  (*
+    checkEnumField -
+ *)
+ 
+ PROCEDURE checkEnumField (result: status; tinfo: tInfo;
+                           left, right: CARDINAL) : status ;
+ VAR
+    typeRight: CARDINAL ;
+ BEGIN
+    Assert (IsFieldEnumeration (left)) ;
+    IF isFalse (result)
+    THEN
+       RETURN result
+    ELSIF IsTyped (right)
+    THEN
+       typeRight := GetDType (right) ;
+       IF typeRight = NulSym
+       THEN
+          RETURN result
+       ELSE
+          RETURN doCheckPair (result, tinfo, GetDType (left), typeRight)
+       END
+    END ;
+    RETURN result
+ END checkEnumField ;
+ 
+ 
+ (*
+    checkEnumFieldEquivalence -
+ *)
+ 
+ PROCEDURE checkEnumFieldEquivalence (result: status; tinfo: tInfo;
+                                      left, right: CARDINAL) : status ;
+ BEGIN
+    IF isFalse (result)
+    THEN
+       RETURN result
+    ELSIF (left = NulSym) OR (right = NulSym)
+    THEN
+       (* No option but to return true.  *)
+       RETURN true
+    ELSIF IsFieldEnumeration (left)
+    THEN
+       RETURN checkEnumField (result, tinfo, left, right)
+    ELSIF IsFieldEnumeration (right)
+    THEN
+       RETURN checkEnumField (result, tinfo, right, left)
+    END ;
+    RETURN result
+ END checkEnumFieldEquivalence ;
+ 
+ 
+ (*
     checkConstEquivalence - this check can be done first as it checks symbols which
                             may have no type.  Ie constant strings.  These constants
                             will likely have their type set during quadruple folding.
*************** BEGIN
*** 861,874 ****
        IF IsSubrange (right)
        THEN
           RETURN doCheckPair (result, tinfo, left, GetDType (right))
-       END ;
-       IF left = right
-       THEN
-          RETURN true
-       ELSE
-          RETURN result
        END
!    END
  END checkSubrangeTypeEquivalence ;
  
  
--- 1080,1088 ----
        IF IsSubrange (right)
        THEN
           RETURN doCheckPair (result, tinfo, left, GetDType (right))
        END
!    END ;
!    RETURN result
  END checkSubrangeTypeEquivalence ;
  
  
*************** PROCEDURE isZRC (zrc, sym: CARDINAL) : B
*** 892,898 ****
  BEGIN
     IF IsConst (sym)
     THEN
!       sym := SkipType (GetType (sym))
     END ;
     IF (zrc = CType) AND (IsComplexN (sym) OR IsComplexType (sym))
     THEN
--- 1106,1112 ----
  BEGIN
     IF IsConst (sym)
     THEN
!       sym := SkipType (GetDType (sym))
     END ;
     IF (zrc = CType) AND (IsComplexN (sym) OR IsComplexType (sym))
     THEN
*************** PROCEDURE isSameSizeConst (a, b: CARDINA
*** 911,921 ****
  BEGIN
     IF IsConst (a)
     THEN
!       a := SkipType (GetType (a)) ;
        RETURN isZRC (a, b) OR (a = b) OR ((a # NulSym) AND isSameSize (a, b))
     ELSIF IsConst (b)
     THEN
!       b := SkipType (GetType (b)) ;
        RETURN isZRC (b, a) OR (a = b) OR ((b # NulSym) AND isSameSize (a, b))
     END ;
     RETURN FALSE
--- 1125,1135 ----
  BEGIN
     IF IsConst (a)
     THEN
!       a := SkipType (GetDType (a)) ;
        RETURN isZRC (a, b) OR (a = b) OR ((a # NulSym) AND isSameSize (a, b))
     ELSIF IsConst (b)
     THEN
!       b := SkipType (GetDType (b)) ;
        RETURN isZRC (b, a) OR (a = b) OR ((b # NulSym) AND isSameSize (a, b))
     END ;
     RETURN FALSE
*************** END isSameSize ;
*** 936,948 ****
     checkSystemEquivalence - check whether left and right are system types and whether they have the same size.
  *)
  
! PROCEDURE checkSystemEquivalence (result: status; left, right: CARDINAL) : status ;
  BEGIN
     IF isFalse (result) OR (result = visited)
     THEN
        RETURN result
     ELSE
        IF (IsGenericSystemType (left) OR IsGenericSystemType (right)) AND
           isSameSize (left, right)
        THEN
           RETURN true
--- 1150,1164 ----
     checkSystemEquivalence - check whether left and right are system types and whether they have the same size.
  *)
  
! PROCEDURE checkSystemEquivalence (result: status; tinfo: tInfo <* unused *>;
!                                   left, right: CARDINAL) : status ;
  BEGIN
     IF isFalse (result) OR (result = visited)
     THEN
        RETURN result
     ELSE
        IF (IsGenericSystemType (left) OR IsGenericSystemType (right)) AND
+          GccKnowsAbout (left) AND GccKnowsAbout (right) AND
           isSameSize (left, right)
        THEN
           RETURN true
*************** END checkSystemEquivalence ;
*** 957,963 ****
                              a set, record or array.
  *)
  
! PROCEDURE checkTypeKindViolation (result: status;
                                    left, right: CARDINAL) : status ;
  BEGIN
     IF isFalse (result) OR (result = visited)
--- 1173,1179 ----
                              a set, record or array.
  *)
  
! PROCEDURE checkTypeKindViolation (result: status; tinfo: tInfo;
                                    left, right: CARDINAL) : status ;
  BEGIN
     IF isFalse (result) OR (result = visited)
*************** BEGIN
*** 969,975 ****
           (IsRecord (left) OR IsRecord (right)) OR
           (IsArray (left) OR IsArray (right))
        THEN
!          RETURN false
        END
     END ;
     RETURN result
--- 1185,1192 ----
           (IsRecord (left) OR IsRecord (right)) OR
           (IsArray (left) OR IsArray (right))
        THEN
!          RETURN falseReason2 ('a {%1ad} is incompatible with a {%2ad}',
!                               tinfo, left, right)
        END
     END ;
     RETURN result
*************** END checkTypeKindViolation ;
*** 977,983 ****
  
  
  (*
!    doCheckPair - invoke a series of ordered type checks checking compatibility
                   between left and right modula2 symbols.
                   Pre-condition: left and right are modula-2 symbols.
                                  tinfo is configured.
--- 1194,1200 ----
  
  
  (*
!    doCheckPair - invoke a series of type checks checking compatibility
                   between left and right modula2 symbols.
                   Pre-condition: left and right are modula-2 symbols.
                                  tinfo is configured.
*************** END checkTypeKindViolation ;
*** 989,1038 ****
  
  PROCEDURE doCheckPair (result: status; tinfo: tInfo;
                         left, right: CARDINAL) : status ;
  BEGIN
!    IF isFalse (result) OR (result = visited)
     THEN
        RETURN return (result, tinfo, left, right)
     ELSIF left = right
     THEN
        RETURN return (true, tinfo, left, right)
     ELSE
!       result := checkConstEquivalence (unknown, tinfo, left, right) ;
!       IF NOT isKnown (result)
!       THEN
!          result := checkVarEquivalence (unknown, tinfo, left, right) ;
!          IF NOT isKnown (result)
           THEN
!             result := checkSystemEquivalence (unknown, left, right) ;
!             IF NOT isKnown (result)
!             THEN
!                result := checkSubrangeTypeEquivalence (unknown, tinfo, left, right) ;
!                IF NOT isKnown (result)
!                THEN
!                   result := checkBaseTypeEquivalence (unknown, tinfo, left, right) ;
!                   IF NOT isKnown (result)
!                   THEN
!                      result := checkTypeEquivalence (unknown, left, right) ;
!                      IF NOT isKnown (result)
!                      THEN
!                         result := checkArrayTypeEquivalence (result, tinfo, left, right) ;
!                         IF NOT isKnown (result)
!                         THEN
!                            result := checkGenericTypeEquivalence (result, left, right) ;
!                            IF NOT isKnown (result)
!                            THEN
!                               result := checkTypeKindEquivalence (result, tinfo, left, right) ;
!                               IF NOT isKnown (result)
!                               THEN
!                                  result := checkTypeKindViolation (result, left, right)
!                               END
!                            END
!                         END
!                      END
!                   END
!                END
!             END
!          END
        END
     END ;
     RETURN return (result, tinfo, left, right)
--- 1206,1233 ----
  
  PROCEDURE doCheckPair (result: status; tinfo: tInfo;
                         left, right: CARDINAL) : status ;
+ VAR
+    i: CARDINAL ;
  BEGIN
!    IF (left = NulSym) OR (right = NulSym)
!    THEN
!       (* We cannot check NulSym.  *)
!       RETURN true
!    ELSIF isKnown (result)
     THEN
        RETURN return (result, tinfo, left, right)
     ELSIF left = right
     THEN
        RETURN return (true, tinfo, left, right)
     ELSE
!       i := 1 ;
!       WHILE i <= HighEquivalence DO
!          result := Equivalence[i] (result, tinfo, left, right) ;
!          IF isKnown (result)
           THEN
!             RETURN return (result, tinfo, left, right)
!          END ;
!          INC (i)
        END
     END ;
     RETURN return (result, tinfo, left, right)
*************** END doCheckPair ;
*** 1040,1045 ****
--- 1235,1279 ----
  
  
  (*
+    InitEquivalenceArray - populate the Equivalence array with the
+                           checking procedures.
+ *)
+ 
+ PROCEDURE InitEquivalenceArray ;
+ BEGIN
+    HighEquivalence := 0 ;
+    addEquivalence (checkVarEquivalence) ;
+    addEquivalence (checkVarTypeEquivalence) ;
+    addEquivalence (checkCharStringTypeEquivalence) ;
+    addEquivalence (checkConstEquivalence);
+    addEquivalence (checkEnumFieldEquivalence) ;
+    addEquivalence (checkSystemEquivalence) ;
+    addEquivalence (checkSubrangeTypeEquivalence) ;
+    addEquivalence (checkBaseTypeEquivalence) ;
+    addEquivalence (checkTypeEquivalence) ;
+    addEquivalence (checkArrayTypeEquivalence) ;
+    addEquivalence (checkTypeKindEquivalence) ;
+    addEquivalence (checkTypeKindViolation)
+ END InitEquivalenceArray ;
+ 
+ 
+ (*
+    addEquivalence - places proc into Equivalence array.
+ *)
+ 
+ PROCEDURE addEquivalence (proc: EquivalenceProcedure) ;
+ BEGIN
+    INC (HighEquivalence) ;
+    IF HighEquivalence <= MaxEquvalence
+    THEN
+       Equivalence[HighEquivalence] := proc
+    ELSE
+       InternalError ('increase MaxEquivalence constant in M2Check.mod')
+    END
+ END addEquivalence ;
+ 
+ 
+ (*
     checkProcType -
  *)
  
*************** BEGIN
*** 1090,1095 ****
--- 1324,1335 ----
        i := 1 ;
        n := NoOfParamAny (left) ;
        WHILE i <= n DO
+          IF isFalse (result) OR (result = visited)
+          THEN
+             (* Seen a mismatch therefore return.  *)
+             RETURN return (result, tinfo, left, right)
+          END ;
+          result := unknown ;   (* Each parameter must match.  *)
           IF IsVarParamAny (left, i) # IsVarParamAny (right, i)
           THEN
              IF IsVarParamAny (left, i)
*************** BEGIN
*** 1281,1287 ****
  END checkProcTypeEquivalence ;
  
  
- 
  (*
     checkTypeKindEquivalence -
  *)
--- 1521,1526 ----
*************** BEGIN
*** 1551,1557 ****
     THEN
        RETURN Address
     ELSE
!       RETURN GetSType (sym)
     END
  END getSType ;
  
--- 1790,1796 ----
     THEN
        RETURN Address
     ELSE
!       RETURN GetDType (sym)
     END
  END getSType ;
  
*************** BEGIN
*** 1627,1637 ****
           printf ("doCheck (%d, %d)\n", left, right) ;
           dumptInfo (tinfo)
        END ;
!       IF isInternal (left) OR isInternal (right)
        THEN
           (* Do not check constants which have been generated internally.
!             Currently these are generated by the default BY constant value
!             in a FOR loop.  *)
           RETURN TRUE
        END ;
        (*
--- 1866,1884 ----
           printf ("doCheck (%d, %d)\n", left, right) ;
           dumptInfo (tinfo)
        END ;
!       IF (left = NulSym) OR (right = NulSym)
!       THEN
!          (* Cannot test if a type is NulSym, we assume true.
!             It maybe that later on a symbols type is set and later
!             on checking will be called and more accurately resolved.
!             For example constant strings can be concatenated during
!             the quadruple folding phase.  *)
!          RETURN TRUE
!       ELSIF isInternal (left) OR isInternal (right)
        THEN
           (* Do not check constants which have been generated internally.
!             Currently these are generated by the default BY constant
!             value in a FOR loop.  *)
           RETURN TRUE
        END ;
        (*
*************** BEGIN
*** 1650,1658 ****
        result := tinfo^.checkFunc (unknown, tinfo, left, right) ;
        IF isKnown (result)
        THEN
!          (* remove this pair from the unresolved list.  *)
           exclude (tinfo^.unresolved, left, right) ;
!          (* add it to the resolved list.  *)
           include (tinfo^.resolved, left, right, result) ;
           IF result = false
           THEN
--- 1897,1905 ----
        result := tinfo^.checkFunc (unknown, tinfo, left, right) ;
        IF isKnown (result)
        THEN
!          (* Remove this pair from the unresolved list.  *)
           exclude (tinfo^.unresolved, left, right) ;
!          (* Add it to the resolved list.  *)
           include (tinfo^.resolved, left, right, result) ;
           IF result = false
           THEN
*************** END deconstructIndex ;
*** 1757,1762 ****
--- 2004,2010 ----
  PROCEDURE deconstruct (tinfo: tInfo) ;
  BEGIN
     tinfo^.format := KillString (tinfo^.format) ;
+    tinfo^.reason := KillString (tinfo^.reason) ;
     tinfo^.visited := deconstructIndex (tinfo^.visited) ;
     tinfo^.resolved := deconstructIndex (tinfo^.resolved) ;
     tinfo^.unresolved := deconstructIndex (tinfo^.unresolved)
*************** END collapseString ;
*** 1803,1813 ****
  *)
  
  PROCEDURE AssignmentTypeCompatible (token: CARDINAL; format: ARRAY OF CHAR;
!                                     des, expr: CARDINAL) : BOOLEAN ;
  VAR
     tinfo: tInfo ;
  BEGIN
     tinfo := newtInfo () ;
     tinfo^.format := collapseString (format) ;
     tinfo^.token := token ;
     tinfo^.kind := assignment ;
--- 2051,2064 ----
  *)
  
  PROCEDURE AssignmentTypeCompatible (token: CARDINAL; format: ARRAY OF CHAR;
!                                     des, expr: CARDINAL;
!                                     enableReason: BOOLEAN) : BOOLEAN ;
  VAR
     tinfo: tInfo ;
  BEGIN
     tinfo := newtInfo () ;
+    tinfo^.reason := NIL ;
+    tinfo^.reasonEnable := enableReason AND StrictTypeReason ;
     tinfo^.format := collapseString (format) ;
     tinfo^.token := token ;
     tinfo^.kind := assignment ;
*************** BEGIN
*** 1852,1857 ****
--- 2103,2110 ----
     tinfo := newtInfo () ;
     formalT := getSType (formal) ;
     actualT := getSType (actual) ;
+    tinfo^.reasonEnable := StrictTypeReason ;
+    tinfo^.reason := NIL ;
     tinfo^.format := collapseString (format) ;
     tinfo^.token := token ;
     tinfo^.kind := parameter ;
*************** VAR
*** 1896,1901 ****
--- 2149,2156 ----
     tinfo: tInfo ;
  BEGIN
     tinfo := newtInfo () ;
+    tinfo^.reasonEnable := StrictTypeReason ;
+    tinfo^.reason := NIL ;
     tinfo^.format := collapseString (format) ;
     tinfo^.token := token ;
     tinfo^.kind := expression ;
*************** PROCEDURE init ;
*** 1960,1966 ****
  BEGIN
     pairFreeList  := NIL ;
     tinfoFreeList := NIL ;
!    errors        := InitIndex (1)
  END init ;
  
  
--- 2215,2222 ----
  BEGIN
     pairFreeList  := NIL ;
     tinfoFreeList := NIL ;
!    errors        := InitIndex (1) ;
!    InitEquivalenceArray
  END init ;
  
  
diff -Nrcpad gcc-16-20250525/gcc/m2/gm2-compiler/M2GenGCC.mod gcc-16-20250601/gcc/m2/gm2-compiler/M2GenGCC.mod
*** gcc-16-20250525/gcc/m2/gm2-compiler/M2GenGCC.mod	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/m2/gm2-compiler/M2GenGCC.mod	Sun Jun  1 22:32:14 2025
*************** BEGIN
*** 681,687 ****
     IfGreOp            : CodeIfGre (q) |
     IfInOp             : CodeIfIn (q) |
     IfNotInOp          : CodeIfNotIn (q) |
!    IndrXOp            : CodeIndrX (q, op1, op2, op3) |
     XIndrOp            : CodeXIndr (q) |
     CallOp             : CodeCall (CurrentQuadToken, op3) |
     ParamOp            : CodeParam (q) |
--- 681,687 ----
     IfGreOp            : CodeIfGre (q) |
     IfInOp             : CodeIfIn (q) |
     IfNotInOp          : CodeIfNotIn (q) |
!    IndrXOp            : CodeIndrX (q) |
     XIndrOp            : CodeXIndr (q) |
     CallOp             : CodeCall (CurrentQuadToken, op3) |
     ParamOp            : CodeParam (q) |
*************** BEGIN
*** 3004,3010 ****
                  despos, op2pos, exprpos) ;
     Assert (op2pos = UnknownTokenNo) ;
     IF StrictTypeChecking AND
!       (NOT AssignmentTypeCompatible (despos, "", des, expr))
     THEN
        MetaErrorT2 (MakeVirtualTok (becomespos, despos, exprpos),
                     'assignment check caught mismatch between {%1Ead} and {%2ad}',
--- 3004,3010 ----
                  despos, op2pos, exprpos) ;
     Assert (op2pos = UnknownTokenNo) ;
     IF StrictTypeChecking AND
!       (NOT AssignmentTypeCompatible (despos, "", des, expr, TRUE))
     THEN
        MetaErrorT2 (MakeVirtualTok (becomespos, despos, exprpos),
                     'assignment check caught mismatch between {%1Ead} and {%2ad}',
*************** BEGIN
*** 3233,3239 ****
        IF SkipType(GetTypeMode(op1))#SkipType(GetTypeMode(op3))
        THEN
           DescribeTypeError (tokenno, op1, op3) ;
!          (* Assigning an errant op3 might ICE, therefore it is safer to return op1.  *)         
           RETURN( Mod2Gcc (op1) )
        END
     END ;
--- 3233,3239 ----
        IF SkipType(GetTypeMode(op1))#SkipType(GetTypeMode(op3))
        THEN
           DescribeTypeError (tokenno, op1, op3) ;
!          (* Assigning an errant op3 might ICE, therefore it is safer to return op1.  *)
           RETURN( Mod2Gcc (op1) )
        END
     END ;
*************** BEGIN
*** 3550,3556 ****
     location := TokenToLocation (virtpos) ;
  
     IF StrictTypeChecking AND
!       (NOT AssignmentTypeCompatible (virtpos, "", des, expr))
     THEN
        ErrorMessageDecl (virtpos,
                          'assignment check caught mismatch between {%1Ead} and {%2ad}',
--- 3550,3556 ----
     location := TokenToLocation (virtpos) ;
  
     IF StrictTypeChecking AND
!       (NOT AssignmentTypeCompatible (virtpos, "", des, expr, TRUE))
     THEN
        ErrorMessageDecl (virtpos,
                          'assignment check caught mismatch between {%1Ead} and {%2ad}',
*************** END NoWalkProcedure ;
*** 3918,3925 ****
  
  PROCEDURE CheckBinaryExpressionTypes (quad: CARDINAL; p: WalkAction) : BOOLEAN ;
  VAR
-    lefttype,
-    righttype,
     des, left, right: CARDINAL ;
     typeChecking,
     constExpr,
--- 3918,3923 ----
*************** BEGIN
*** 3937,3946 ****
     IF typeChecking AND (op # LogicalRotateOp) AND (op # LogicalShiftOp)
     THEN
        subexprpos := MakeVirtualTok (operatorpos, leftpos, rightpos) ;
-       lefttype := GetType (left) ;
-       righttype := GetType (right) ;
        IF StrictTypeChecking AND
!          (NOT ExpressionTypeCompatible (subexprpos, "", lefttype, righttype,
                                          StrictTypeChecking, FALSE))
        THEN
           MetaErrorT2 (subexprpos,
--- 3935,3942 ----
     IF typeChecking AND (op # LogicalRotateOp) AND (op # LogicalShiftOp)
     THEN
        subexprpos := MakeVirtualTok (operatorpos, leftpos, rightpos) ;
        IF StrictTypeChecking AND
!          (NOT ExpressionTypeCompatible (subexprpos, "", left, right,
                                          StrictTypeChecking, FALSE))
        THEN
           MetaErrorT2 (subexprpos,
*************** BEGIN
*** 3950,3968 ****
           SubQuad (quad) ;
           p (des) ;
           RETURN FALSE
-       END ;
-       (* --fixme-- the ExpressionTypeCompatible above should be enough
-          and the code below can be removed once ExpressionTypeCompatible
-          is bug free.  *)
-       IF NOT IsExpressionCompatible (lefttype, righttype)
-       THEN
-          ErrorMessageDecl (subexprpos,
-                            'expression mismatch between {%1Etad} and {%2tad}',
-                            left, right, TRUE) ;
-          NoChange := FALSE ;
-          SubQuad (quad) ;
-          p (des) ;
-          RETURN FALSE
        END
     END ;
     RETURN TRUE
--- 3946,3951 ----
*************** END CheckBinaryExpressionTypes ;
*** 3978,3984 ****
  
  PROCEDURE CheckElementSetTypes (quad: CARDINAL) : BOOLEAN ;
  VAR
-    lefttype,
     righttype,
     ignore, left, right: CARDINAL ;
     constExpr,
--- 3961,3966 ----
*************** BEGIN
*** 3995,4007 ****
                  overflowChecking, constExpr,
                  leftpos, rightpos, ignorepos) ;
     subexprpos := MakeVirtualTok (operatorpos, leftpos, rightpos) ;
-    lefttype := GetType (left) ;
     righttype := GetType (right) ;
-    (* --fixme-- the ExpressionTypeCompatible below does not always catch
-       type errors, it needs to be fixed and then some of the subsequent tests
-       can be removed (and/or this procedure function rewritten).  *)
     IF StrictTypeChecking AND
!       (NOT ExpressionTypeCompatible (subexprpos, "", lefttype, righttype,
                                       StrictTypeChecking, TRUE))
     THEN
        MetaErrorT2 (subexprpos,
--- 3977,3985 ----
                  overflowChecking, constExpr,
                  leftpos, rightpos, ignorepos) ;
     subexprpos := MakeVirtualTok (operatorpos, leftpos, rightpos) ;
     righttype := GetType (right) ;
     IF StrictTypeChecking AND
!       (NOT ExpressionTypeCompatible (subexprpos, "", left, right,
                                       StrictTypeChecking, TRUE))
     THEN
        MetaErrorT2 (subexprpos,
*************** BEGIN
*** 4020,4036 ****
        SubQuad (quad) ;
        RETURN FALSE
     END ;
-    righttype := GetType (SkipType (righttype)) ;
-    (* Now fall though and compare the set element left against the type of set righttype.  *)
-    IF NOT IsExpressionCompatible (lefttype, righttype)
-    THEN
-       ErrorMessageDecl (subexprpos,
-                         'the types used in expression {%1Etad} {%kIN} {%2tad} are incompatible',
-                         left, right, TRUE) ;
-       NoChange := FALSE ;
-       SubQuad (quad) ;
-       RETURN FALSE
-    END ;
     RETURN TRUE
  END CheckElementSetTypes ;
  
--- 3998,4003 ----
*************** END CodeIfNotIn ;
*** 8174,8198 ****
     (op2 is the type of the data being indirectly copied)
  *)
  
! PROCEDURE CodeIndrX (quad: CARDINAL; op1, op2, op3: CARDINAL) ;
  VAR
!    location: location_t ;
  BEGIN
!    location := TokenToLocation (CurrentQuadToken) ;
  
     (*
        Follow the Quadruple rules:
     *)
!    DeclareConstant (CurrentQuadToken, op3) ;  (* checks to see whether it is a constant and declares it *)
!    DeclareConstructor (CurrentQuadToken, quad, op3) ;
!    IF IsConstString (op3)
     THEN
        InternalError ('not expecting to index through a constant string')
     ELSE
        (*
           Mem[op1] := Mem[Mem[op3]]
        *)
!       BuildAssignmentStatement (location, Mod2Gcc (op1), BuildIndirect (location, Mod2Gcc (op3), Mod2Gcc (op2)))
     END
  END CodeIndrX ;
  
--- 8141,8192 ----
     (op2 is the type of the data being indirectly copied)
  *)
  
! PROCEDURE CodeIndrX (quad: CARDINAL) ;
  VAR
!    constExpr,
!    overflowChecking: BOOLEAN ;
!    op              : QuadOperator ;
!    tokenno,
!    left,
!    type,
!    right,
!    leftpos,
!    rightpos,
!    typepos,
!    indrxpos        : CARDINAL ;
!    length,
!    newstr          : tree ;
!    location        : location_t ;
  BEGIN
!    GetQuadOtok (quad, indrxpos, op, left, type, right,
!                 overflowChecking, constExpr,
!                 leftpos, typepos, rightpos) ;
!    tokenno := MakeVirtualTok (indrxpos, leftpos, rightpos) ;
!    location := TokenToLocation (tokenno) ;
  
     (*
        Follow the Quadruple rules:
     *)
!    DeclareConstant (rightpos, right) ;  (* Checks to see whether it is a constant
!                                            and if necessary declare it.  *)
!    DeclareConstructor (rightpos, quad, right) ;
!    IF IsConstString (right)
     THEN
        InternalError ('not expecting to index through a constant string')
+    ELSIF StrictTypeChecking AND
+       (NOT AssignmentTypeCompatible (indrxpos, "", left, GetType (right), TRUE))
+    THEN
+       MetaErrorT2 (tokenno,
+                    'assignment check caught mismatch between {%1Ead} and {%2ad}',
+                    left, right) ;
+       SubQuad (quad)
     ELSE
+ 
        (*
           Mem[op1] := Mem[Mem[op3]]
        *)
!       BuildAssignmentStatement (location, Mod2Gcc (left),
!                                 BuildIndirect (location, Mod2Gcc (right), Mod2Gcc (type)))
     END
  END CodeIndrX ;
  
*************** BEGIN
*** 8230,8236 ****
     DeclareConstant (rightpos, right) ;
     DeclareConstructor (rightpos, quad, right) ;
     IF StrictTypeChecking AND
!       (NOT AssignmentTypeCompatible (xindrpos, "", GetType (left), right))
     THEN
        MetaErrorT2 (tokenno,
                     'assignment check caught mismatch between {%1Ead} and {%2ad}',
--- 8224,8230 ----
     DeclareConstant (rightpos, right) ;
     DeclareConstructor (rightpos, quad, right) ;
     IF StrictTypeChecking AND
!       (NOT AssignmentTypeCompatible (xindrpos, "", GetType (left), right, TRUE))
     THEN
        MetaErrorT2 (tokenno,
                     'assignment check caught mismatch between {%1Ead} and {%2ad}',
diff -Nrcpad gcc-16-20250525/gcc/m2/gm2-compiler/M2MetaError.def gcc-16-20250601/gcc/m2/gm2-compiler/M2MetaError.def
*** gcc-16-20250525/gcc/m2/gm2-compiler/M2MetaError.def	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/m2/gm2-compiler/M2MetaError.def	Sun Jun  1 22:32:14 2025
*************** FROM NameKey IMPORT Name ;
*** 93,101 ****
      %}        }
      the error messages may also embed optional strings such as:
  
!     {%1a:this string is emitted if the symbol name is non null}
!     {!%1a:this string is emitted if the symbol name is null}
!     {!%1a:{%1d}}
             if the symbol name does not exist then print a description
             of the symbol.
      {%1atd} was incompatible with the return type of the procedure
--- 93,101 ----
      %}        }
      the error messages may also embed optional strings such as:
  
!     {%1a:this string is emitted if the symbol name is null}
!     {!%1a:this string is emitted if the symbol name is non null}
!     {%1a:{%1d}}
             if the symbol name does not exist then print a description
             of the symbol.
      {%1atd} was incompatible with the return type of the procedure
diff -Nrcpad gcc-16-20250525/gcc/m2/gm2-compiler/M2Options.def gcc-16-20250601/gcc/m2/gm2-compiler/M2Options.def
*** gcc-16-20250525/gcc/m2/gm2-compiler/M2Options.def	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/m2/gm2-compiler/M2Options.def	Sun Jun  1 22:32:14 2025
*************** VAR
*** 87,92 ****
--- 87,94 ----
     LineDirectives,               (* Should compiler understand preprocessor  *)
                                   (* # linenumber "filename" markers?         *)
     StrictTypeChecking,           (* -fm2-strict-type experimental checker.   *)
+    StrictTypeAssignment,         (* -fm2-strict-assignment.                  *)
+    StrictTypeReason,             (* -fm2-strict-reason.                      *)
     CPreProcessor,                (* Must we run the cpp on the source?       *)
     Xcode,                        (* Should errors follow Xcode format?       *)
     ExtendedOpaque,               (* Do we allow non pointer opaque types?    *)
*************** PROCEDURE SetStrictTypeChecking (value:
*** 756,761 ****
--- 758,777 ----
  
  
  (*
+    SetStrictTypeAssignment - assigns the StrictTypeAssignment flag to value.
+ *)
+ 
+ PROCEDURE SetStrictTypeAssignment (value: BOOLEAN) ;
+ 
+ 
+ (*
+    SetStrictTypeReason - assigns the StrictTypeReason flag to value.
+ *)
+ 
+ PROCEDURE SetStrictTypeReason (value: BOOLEAN) ;
+ 
+ 
+ (*
     setdefextension - set the source file definition module extension to arg.
                       This should include the . and by default it is set to .def.
  *)
diff -Nrcpad gcc-16-20250525/gcc/m2/gm2-compiler/M2Options.mod gcc-16-20250601/gcc/m2/gm2-compiler/M2Options.mod
*** gcc-16-20250525/gcc/m2/gm2-compiler/M2Options.mod	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/m2/gm2-compiler/M2Options.mod	Sun Jun  1 22:32:14 2025
*************** END SetStrictTypeChecking ;
*** 657,662 ****
--- 657,682 ----
  
  
  (*
+    SetStrictTypeAssignment - assigns the StrictTypeAssignment flag to value.
+ *)
+ 
+ PROCEDURE SetStrictTypeAssignment (value: BOOLEAN) ;
+ BEGIN
+    StrictTypeAssignment := value
+ END SetStrictTypeAssignment ;
+ 
+ 
+ (*
+    SetStrictTypeReason - assigns the StrictTypeReason flag to value.
+ *)
+ 
+ PROCEDURE SetStrictTypeReason (value: BOOLEAN) ;
+ BEGIN
+    StrictTypeReason := value
+ END SetStrictTypeReason ;
+ 
+ 
+ (*
     SetVerboseUnbounded - sets the VerboseUnbounded flag to, value.
  *)
  
*************** BEGIN
*** 2111,2116 ****
--- 2131,2138 ----
     UnusedVariableChecking            := FALSE ;
     UnusedParameterChecking           := FALSE ;
     StrictTypeChecking                := TRUE ;
+    StrictTypeAssignment              := TRUE ;
+    StrictTypeReason                  := TRUE ;
     AutoInit                          := FALSE ;
     SaveTemps                         := FALSE ;
     ScaffoldDynamic                   := TRUE ;
diff -Nrcpad gcc-16-20250525/gcc/m2/gm2-compiler/M2Quads.mod gcc-16-20250601/gcc/m2/gm2-compiler/M2Quads.mod
*** gcc-16-20250525/gcc/m2/gm2-compiler/M2Quads.mod	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/m2/gm2-compiler/M2Quads.mod	Sun Jun  1 22:32:14 2025
*************** FROM M2Options IMPORT NilChecking,
*** 226,231 ****
--- 226,232 ----
                        GenerateLineDebug, Exceptions,
                        Profiling, Coding, Optimizing,
                        UninitVariableChecking,
+                       StrictTypeAssignment,
                        ScaffoldDynamic, ScaffoldStatic, cflag,
                        ScaffoldMain, SharedFlag, WholeProgram,
                        GetDumpDir, GetM2DumpFilter,
*************** FROM M2Range IMPORT InitAssignmentRangeC
*** 258,265 ****
--- 259,268 ----
                      InitRotateCheck,
                      InitShiftCheck,
                      InitTypesAssignmentCheck,
+                     InitTypesIndrXCheck,
                      InitTypesExpressionCheck,
                      InitTypesParameterCheck,
+                     InitTypesReturnTypeCheck,
                      InitForLoopBeginRangeCheck,
                      InitForLoopToRangeCheck,
                      InitForLoopEndRangeCheck,
*************** IMPORT M2Error, FIO, SFIO, DynamicString
*** 284,290 ****
  CONST
     DebugStackOn = TRUE ;
     DebugVarients = FALSE ;
-    BreakAtQuad = 758 ;
     DebugTokPos = FALSE ;
  
  TYPE
--- 287,292 ----
*************** VAR
*** 397,402 ****
--- 399,405 ----
                                        (* in order.                               *)
     NoOfQuads            : CARDINAL ;  (* Number of used quadruples.              *)
     Head                 : CARDINAL ;  (* Head of the list of quadruples.         *)
+    BreakQuad            : CARDINAL ;  (* Stop when BreakQuad is created.         *)
  
  
  (*
*************** BEGIN
*** 1487,1508 ****
  END AddQuadInformation ;
  
  
- PROCEDURE stop ; BEGIN END stop ;
- 
- 
- (*
-    CheckBreak - check whether QuadNo = BreakAtQuad and if so call stop.
- *)
- 
- PROCEDURE CheckBreak (QuadNo: CARDINAL) ;
- BEGIN
-    IF QuadNo = BreakAtQuad
-    THEN
-       stop
-    END
- END CheckBreak ;
- 
- 
  (*
     PutQuadO - alters a quadruple QuadNo with Op, Oper1, Oper2, Oper3, and
                sets a boolean to determinine whether overflow should be checked.
--- 1490,1495 ----
*************** BEGIN
*** 3888,3893 ****
--- 3875,3884 ----
        THEN
           MetaErrorT1 (combinedtok, 'combined {%1Oad}', Des)
        END ;
+       IF StrictTypeAssignment
+       THEN
+          BuildRange (InitTypesAssignmentCheck (combinedtok, Des, Exp))
+       END ;
        IF (GetSType (Des) # NulSym) AND (NOT IsSet (GetDType (Des)))
        THEN
           (* Tell code generator to test runtime values of assignment so ensure we
*************** VAR
*** 5628,5634 ****
     proctok,
     paramtok    : CARDINAL ;
     n1, n2      : Name ;
!    ParamCheckId,   
     Dim,
     Actual,
     FormalI,
--- 5619,5625 ----
     proctok,
     paramtok    : CARDINAL ;
     n1, n2      : Name ;
!    ParamCheckId,
     Dim,
     Actual,
     FormalI,
*************** VAR
*** 5770,5811 ****
     CheckedProcedure: CARDINAL ;
     e               : Error ;
  BEGIN
-    n := NoOfParamAny (ProcType) ;
     IF IsVar(call) OR IsTemporary(call) OR IsParameter(call)
     THEN
        CheckedProcedure := GetDType(call)
     ELSE
        CheckedProcedure := call
     END ;
!    IF n # NoOfParamAny (CheckedProcedure)
     THEN
!       e := NewError(GetDeclaredMod(ProcType)) ;
!       n1 := GetSymName(call) ;
!       n2 := GetSymName(ProcType) ;
!       ErrorFormat2(e, 'procedure (%a) is a parameter being passed as variable (%a) but they are declared with different number of parameters',
!                    n1, n2) ;
!       e := ChainError(GetDeclaredMod(call), e) ;
!       t := NoOfParamAny (CheckedProcedure) ;
!       IF n<2
        THEN
!          ErrorFormat3(e, 'procedure (%a) is being called incorrectly with (%d) parameter, declared with (%d)',
!                       n1, n, t)
!       ELSE
!          ErrorFormat3(e, 'procedure (%a) is being called incorrectly with (%d) parameters, declared with (%d)',
!                       n1, n, t)
!       END
!    ELSE
!       i := 1 ;
!       WHILE i<=n DO
!          IF IsVarParamAny (ProcType, i) # IsVarParamAny (CheckedProcedure, i)
           THEN
!             MetaError3 ('parameter {%3n} in {%1dD} causes a mismatch it was declared as a {%2d}', ProcType, GetNth (ProcType, i), i) ;
!             MetaError3 ('parameter {%3n} in {%1dD} causes a mismatch it was declared as a {%2d}', call, GetNth (call, i), i)
!          END ;
!          BuildRange (InitTypesParameterCheck (tokno, CheckedProcedure, i,
!                                               GetNthParamAnyClosest (CheckedProcedure, i, GetCurrentModule ()),
!                                               GetParam (ProcType, i), ParamCheckId)) ;
!          INC(i)
        END
     END
  END CheckProcTypeAndProcedure ;
--- 5761,5806 ----
     CheckedProcedure: CARDINAL ;
     e               : Error ;
  BEGIN
     IF IsVar(call) OR IsTemporary(call) OR IsParameter(call)
     THEN
        CheckedProcedure := GetDType(call)
     ELSE
        CheckedProcedure := call
     END ;
!    IF ProcType # CheckedProcedure
     THEN
!       n := NoOfParamAny (ProcType) ;
!       (* We need to check the formal parameters between the procedure and proc type.  *)
!       IF n # NoOfParamAny (CheckedProcedure)
        THEN
!          e := NewError(GetDeclaredMod(ProcType)) ;
!          n1 := GetSymName(call) ;
!          n2 := GetSymName(ProcType) ;
!          ErrorFormat2(e, 'procedure (%a) is a parameter being passed as variable (%a) but they are declared with different number of parameters',
!                       n1, n2) ;
!          e := ChainError(GetDeclaredMod(call), e) ;
!          t := NoOfParamAny (CheckedProcedure) ;
!          IF n<2
           THEN
!             ErrorFormat3(e, 'procedure (%a) is being called incorrectly with (%d) parameter, declared with (%d)',
!                          n1, n, t)
!          ELSE
!             ErrorFormat3(e, 'procedure (%a) is being called incorrectly with (%d) parameters, declared with (%d)',
!                          n1, n, t)
!          END
!       ELSE
!          i := 1 ;
!          WHILE i<=n DO
!             IF IsVarParamAny (ProcType, i) # IsVarParamAny (CheckedProcedure, i)
!             THEN
!                MetaError3 ('parameter {%3n} in {%1dD} causes a mismatch it was declared as a {%2d}', ProcType, GetNth (ProcType, i), i) ;
!                MetaError3 ('parameter {%3n} in {%1dD} causes a mismatch it was declared as a {%2d}', call, GetNth (call, i), i)
!             END ;
!             BuildRange (InitTypesParameterCheck (tokno, CheckedProcedure, i,
!                                                  GetNthParamAnyClosest (CheckedProcedure, i, GetCurrentModule ()),
!                                                  GetParam (ProcType, i), ParamCheckId)) ;
!             INC(i)
!          END
        END
     END
  END CheckProcTypeAndProcedure ;
*************** END ExpectVariable ;
*** 6272,6292 ****
     doIndrX - perform des = *exp with a conversion if necessary.
  *)
  
! PROCEDURE doIndrX (tok: CARDINAL;
!                    des, exp: CARDINAL) ;
  VAR
     t: CARDINAL ;
  BEGIN
!    IF GetDType(des)=GetDType(exp)
     THEN
        GenQuadOtok (tok, IndrXOp, des, GetSType (des), exp, TRUE,
                     tok, tok, tok)
     ELSE
        t := MakeTemporary (tok, RightValue) ;
        PutVar (t, GetSType (exp)) ;
        GenQuadOtok (tok, IndrXOp, t, GetSType (exp), exp, TRUE,
                     tok, tok, tok) ;
!       GenQuadOtok (tok, BecomesOp, des, NulSym, doVal (GetSType(des), t), TRUE,
                     tok, UnknownTokenNo, tok)
     END
  END doIndrX ;
--- 6267,6290 ----
     doIndrX - perform des = *exp with a conversion if necessary.
  *)
  
! PROCEDURE doIndrX (tok: CARDINAL; des, exp: CARDINAL) ;
  VAR
     t: CARDINAL ;
  BEGIN
!    IF GetDType (des) = GetDType (exp)
     THEN
        GenQuadOtok (tok, IndrXOp, des, GetSType (des), exp, TRUE,
                     tok, tok, tok)
     ELSE
+       IF StrictTypeAssignment
+       THEN
+          BuildRange (InitTypesIndrXCheck (tok, des, exp))
+       END ;
        t := MakeTemporary (tok, RightValue) ;
        PutVar (t, GetSType (exp)) ;
        GenQuadOtok (tok, IndrXOp, t, GetSType (exp), exp, TRUE,
                     tok, tok, tok) ;
!       GenQuadOtok (tok, BecomesOp, des, NulSym, doVal (GetSType (des), t), TRUE,
                     tok, UnknownTokenNo, tok)
     END
  END doIndrX ;
*************** BEGIN
*** 11295,11301 ****
                     n1, n2)
     ELSE
        (* this checks the types are compatible, not the data contents.  *)
!       BuildRange (InitTypesAssignmentCheck (tokno, currentProc, actualVal))
     END
  END CheckReturnType ;
  
--- 11293,11299 ----
                     n1, n2)
     ELSE
        (* this checks the types are compatible, not the data contents.  *)
!       BuildRange (InitTypesReturnTypeCheck (tokno, currentProc, actualVal))
     END
  END CheckReturnType ;
  
*************** END StressStack ;
*** 16061,16072 ****
--- 16059,16113 ----
  
  
  (*
+    gdbhook - a debugger convenience hook.
+ *)
+ 
+ PROCEDURE gdbhook ;
+ END gdbhook ;
+ 
+ 
+ (*
+    BreakWhenQuadCreated - to be called interactively by gdb.
+ *)
+ 
+ PROCEDURE BreakWhenQuadCreated (quad: CARDINAL) ;
+ BEGIN
+    BreakQuad := quad
+ END BreakWhenQuadCreated ;
+ 
+ 
+ (*
+    CheckBreak - if quad = BreakQuad then call gdbhook.
+ *)
+ 
+ PROCEDURE CheckBreak (quad: CARDINAL) ;
+ BEGIN
+    IF quad = BreakQuad
+    THEN
+       gdbhook
+    END
+ END CheckBreak ;
+ 
+ 
+ (*
     Init - initialize the M2Quads module, all the stacks, all the lists
            and the quads list.
  *)
  
  PROCEDURE Init ;
  BEGIN
+    BreakWhenQuadCreated (0) ;  (* Disable the intereactive quad watch.  *)
+    (* To examine the quad table when a quad is created run cc1gm2 from gdb
+       and set a break point on gdbhook.
+       (gdb) break gdbhook
+       (gdb) run
+       Now below interactively call BreakWhenQuadCreated with the quad
+       under investigation.  *)
+    gdbhook ;
+    (* Now is the time to interactively call gdb, for example:
+       (gdb) print BreakWhenQuadCreated (1234)
+       (gdb) cont
+       and you will arrive at gdbhook when this quad is created.  *)
     LogicalOrTok := MakeKey('_LOR') ;
     LogicalAndTok := MakeKey('_LAND') ;
     LogicalXorTok := MakeKey('_LXOR') ;
diff -Nrcpad gcc-16-20250525/gcc/m2/gm2-compiler/M2Range.def gcc-16-20250601/gcc/m2/gm2-compiler/M2Range.def
*** gcc-16-20250525/gcc/m2/gm2-compiler/M2Range.def	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/m2/gm2-compiler/M2Range.def	Sun Jun  1 22:32:14 2025
*************** PROCEDURE InitTypesExpressionCheck (tokn
*** 291,296 ****
--- 291,314 ----
  
  
  (*
+    InitTypesIndrXCheck - checks to see that the types of d and e
+                          are assignment compatible.  The type checking
+                          will dereference *e during the type check.
+                          d = *e.
+ *)
+ 
+ PROCEDURE InitTypesIndrXCheck (tokno: CARDINAL; d, e: CARDINAL) : CARDINAL ;
+ 
+ 
+ (*
+    InitTypesReturnTypeCheck - checks to see that the type of val can
+                                    be returned from func.
+ *)
+ 
+ PROCEDURE InitTypesReturnTypeCheck (tokno: CARDINAL; func, val: CARDINAL) : CARDINAL ;
+ 
+ 
+ (*
     InitCaseBounds - creates a case bound range check.
  *)
  
diff -Nrcpad gcc-16-20250525/gcc/m2/gm2-compiler/M2Range.mod gcc-16-20250601/gcc/m2/gm2-compiler/M2Range.mod
*** gcc-16-20250525/gcc/m2/gm2-compiler/M2Range.mod	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/m2/gm2-compiler/M2Range.mod	Sun Jun  1 22:32:15 2025
*************** FROM M2Debug IMPORT Assert ;
*** 58,64 ****
  FROM Indexing IMPORT Index, InitIndex, InBounds, PutIndice, GetIndice ;
  FROM Storage IMPORT ALLOCATE ;
  FROM M2ALU IMPORT PushIntegerTree, PushInt, ConvertToInt, Equ, Gre, Less, GreEqu ;
! FROM M2Options IMPORT VariantValueChecking, CaseEnumChecking, GetPIM ;
  
  FROM M2Error IMPORT Error, InternalError, ErrorFormat0, ErrorFormat1, ErrorFormat2, FlushErrors,
                      GetAnnounceScope ;
--- 58,64 ----
  FROM Indexing IMPORT Index, InitIndex, InBounds, PutIndice, GetIndice ;
  FROM Storage IMPORT ALLOCATE ;
  FROM M2ALU IMPORT PushIntegerTree, PushInt, ConvertToInt, Equ, Gre, Less, GreEqu ;
! FROM M2Options IMPORT VariantValueChecking, CaseEnumChecking, GetPIM, StrictTypeAssignment ;
  
  FROM M2Error IMPORT Error, InternalError, ErrorFormat0, ErrorFormat1, ErrorFormat2, FlushErrors,
                      GetAnnounceScope ;
*************** FROM M2Check IMPORT ParameterTypeCompati
*** 91,97 ****
  
  FROM M2Base IMPORT Nil, IsRealType, GetBaseTypeMinMax,
                     Cardinal, Integer, ZType, IsComplexType,
-                    IsAssignmentCompatible,
                     IsExpressionCompatible,
                     IsParameterCompatible,
                     ExceptionAssign,
--- 91,96 ----
*************** FROM M2CaseList IMPORT CaseBoundsResolve
*** 115,121 ****
  TYPE
     TypeOfRange = (assignment, returnassignment, subrangeassignment,
                    inc, dec, incl, excl, shift, rotate,
!                   typeexpr, typeassign, typeparam, paramassign,
                    staticarraysubscript,
                    dynamicarraysubscript,
                    forloopbegin, forloopto, forloopend,
--- 114,122 ----
  TYPE
     TypeOfRange = (assignment, returnassignment, subrangeassignment,
                    inc, dec, incl, excl, shift, rotate,
!                   typeindrx, typeexpr, typeassign, typeparam,
!                   typereturn,
!                   paramassign,
                    staticarraysubscript,
                    dynamicarraysubscript,
                    forloopbegin, forloopto, forloopend,
*************** BEGIN
*** 289,297 ****
     excl                 : RETURN( ExceptionExcl ) |
     shift                : RETURN( ExceptionShift ) |
     rotate               : RETURN( ExceptionRotate ) |
!    typeassign           : InternalError ('not expecting this case value') |
!    typeparam            : InternalError ('not expecting this case value') |
!    typeexpr             : InternalError ('not expecting this case value') |
     paramassign          : RETURN( ExceptionParameterBounds ) |
     staticarraysubscript : RETURN( ExceptionStaticArray ) |
     dynamicarraysubscript: RETURN( ExceptionDynamicArray ) |
--- 290,299 ----
     excl                 : RETURN( ExceptionExcl ) |
     shift                : RETURN( ExceptionShift ) |
     rotate               : RETURN( ExceptionRotate ) |
!    typeassign,
!    typeparam,
!    typeexpr,
!    typeindrx            : InternalError ('not expecting this case value') |
     paramassign          : RETURN( ExceptionParameterBounds ) |
     staticarraysubscript : RETURN( ExceptionStaticArray ) |
     dynamicarraysubscript: RETURN( ExceptionDynamicArray ) |
*************** END InitRotateCheck ;
*** 822,828 ****
  
  
  (*
!    InitTypesAssignmentCheck - checks to see that the types of, d, and, e,
                                are assignment compatible.
  *)
  
--- 824,830 ----
  
  
  (*
!    InitTypesAssignmentCheck - checks to see that the types of d and e
                                are assignment compatible.
  *)
  
*************** END InitTypesAssignmentCheck ;
*** 837,842 ****
--- 839,876 ----
  
  
  (*
+    InitTypesIndrXCheck - checks to see that the types of d and e
+                          are assignment compatible.  The type checking
+                          will dereference *e during the type check.
+                          d = *e.
+ *)
+ 
+ PROCEDURE InitTypesIndrXCheck (tokno: CARDINAL; d, e: CARDINAL) : CARDINAL ;
+ VAR
+    r: CARDINAL ;
+ BEGIN
+    r := InitRange () ;
+    Assert (PutRangeNoLow (tokno, GetIndice (RangeIndex, r), typeindrx, d, e) # NIL) ;
+    RETURN r
+ END InitTypesIndrXCheck ;
+ 
+ 
+ (*
+    InitTypesReturnTypeCheck - checks to see that the types of des and func
+                               are assignment compatible.
+ *)
+ 
+ PROCEDURE InitTypesReturnTypeCheck (tokno: CARDINAL; func, val: CARDINAL) : CARDINAL ;
+ VAR
+    r: CARDINAL ;
+ BEGIN
+    r := InitRange () ;
+    Assert (PutRangeNoLow (tokno, GetIndice (RangeIndex, r), typereturn, func, val) # NIL) ;
+    RETURN r
+ END InitTypesReturnTypeCheck ;
+ 
+ 
+ (*
     InitTypesParameterCheck - checks to see that the types of, d,
                               and, e, are parameter compatible.
  *)
*************** BEGIN
*** 1219,1227 ****
        excl                 : RETURN( ExceptionExcl#NulSym ) |
        shift                : RETURN( ExceptionShift#NulSym ) |
        rotate               : RETURN( ExceptionRotate#NulSym ) |
!       typeassign           : RETURN( FALSE ) |
!       typeparam            : RETURN( FALSE ) |
!       typeexpr             : RETURN( FALSE ) |
        paramassign          : RETURN( ExceptionParameterBounds#NulSym ) |
        staticarraysubscript : RETURN( ExceptionStaticArray#NulSym ) |
        dynamicarraysubscript: RETURN( ExceptionDynamicArray#NulSym ) |
--- 1253,1263 ----
        excl                 : RETURN( ExceptionExcl#NulSym ) |
        shift                : RETURN( ExceptionShift#NulSym ) |
        rotate               : RETURN( ExceptionRotate#NulSym ) |
!       typereturn,
!       typeassign,
!       typeparam,
!       typeexpr,
!       typeindrx            : RETURN( FALSE ) |
        paramassign          : RETURN( ExceptionParameterBounds#NulSym ) |
        staticarraysubscript : RETURN( ExceptionStaticArray#NulSym ) |
        dynamicarraysubscript: RETURN( ExceptionDynamicArray#NulSym ) |
*************** END HandlerExists ;
*** 1246,1252 ****
  
  
  (*
!    FoldAssignment -
  *)
  
  PROCEDURE FoldAssignment (tokenno: CARDINAL; q: CARDINAL; r: CARDINAL) ;
--- 1282,1290 ----
  
  
  (*
!    FoldAssignment - attempts to fold the range violation checks.
!                     It does not issue errors on type violations as that
!                     is performed by FoldTypeAssign.
  *)
  
  PROCEDURE FoldAssignment (tokenno: CARDINAL; q: CARDINAL; r: CARDINAL) ;
*************** BEGIN
*** 1259,1265 ****
        TryDeclareConstant (exprtok, expr) ;
        IF desLowestType # NulSym
        THEN
!          IF AssignmentTypeCompatible (tokenno, "", des, expr)
           THEN
              IF GccKnowsAbout (expr) AND IsConst (expr) AND
                 GetMinMax (tokenno, desLowestType, min, max)
--- 1297,1303 ----
        TryDeclareConstant (exprtok, expr) ;
        IF desLowestType # NulSym
        THEN
!          IF AssignmentTypeCompatible (tokenno, "", des, expr, FALSE)
           THEN
              IF GccKnowsAbout (expr) AND IsConst (expr) AND
                 GetMinMax (tokenno, desLowestType, min, max)
*************** BEGIN
*** 1275,1280 ****
--- 1313,1320 ----
                 END
              END
           ELSE
+             (* We do not issue an error if these types are incompatible here
+                as this is done by FoldTypeAssign.  *)
              SubQuad (q)
           END
        END
*************** END FoldRotate ;
*** 1757,1777 ****
  
  
  (*
     FoldTypeAssign -
  *)
  
  PROCEDURE FoldTypeAssign (q: CARDINAL; tokenNo: CARDINAL; des, expr: CARDINAL; r: CARDINAL) ;
  VAR
     exprType: CARDINAL ;
  BEGIN
!    IF IsProcedure(expr)
     THEN
        exprType := expr
     ELSE
!       exprType := GetType(expr)
     END ;
! 
!    IF IsAssignmentCompatible (GetType(des), exprType)
     THEN
        SubQuad(q)
     ELSE
--- 1797,1890 ----
  
  
  (*
+    FoldTypeReturnFunc - checks to see that val can be returned from func.
+ *)
+ 
+ PROCEDURE FoldTypeReturnFunc (q: CARDINAL; tokenNo: CARDINAL; func, val: CARDINAL; r: CARDINAL) ;
+ VAR
+    valType,
+    returnType: CARDINAL ;
+ BEGIN
+    returnType := GetType (func) ;
+    IF returnType = NulSym
+    THEN
+       IF NOT reportedError (r)
+       THEN
+          MetaErrorsT2 (tokenNo,
+                        'procedure {%1Da} is not a procedure function',
+                        '{%2ad} cannot be returned from {%1Da}',
+                        func, val) ;
+          SubQuad(q)
+       END
+    ELSE
+       valType := val ;
+       IF IsVar (val) AND (GetMode (val) = LeftValue)
+       THEN
+          valType := GetType (val)
+       END ;
+       IF AssignmentTypeCompatible (tokenNo, "", returnType, valType, FALSE)
+       THEN
+          SubQuad (q)
+       ELSE
+          IF NOT reportedError (r)
+          THEN
+             MetaErrorsT2 (tokenNo,
+                           'the return type {%1Etad} used in procedure {%1Da}',
+                           'is incompatible with the returned expression {%1ad}}',
+                           func, val) ;
+             setReported (r) ;
+             FlushErrors
+          END
+       END
+    END
+ END FoldTypeReturnFunc ;
+ 
+ 
+ (*
     FoldTypeAssign -
  *)
  
  PROCEDURE FoldTypeAssign (q: CARDINAL; tokenNo: CARDINAL; des, expr: CARDINAL; r: CARDINAL) ;
+ BEGIN
+    IF NOT reportedError (r)
+    THEN
+       IF AssignmentTypeCompatible (tokenNo,
+                                    'assignment designator {%1Ea} {%1ta:of type {%1ta}}' +
+                                    ' cannot be assigned with' +
+                                    ' {%2ad: a {%2td} {%2ad}}{!%2ad: {%2ad} of type {%2tad}}',
+                                    des, expr, TRUE)
+       THEN
+          SubQuad (q)
+       ELSE
+          setReported (r) ;
+          FlushErrors
+       END
+    END
+ END FoldTypeAssign ;
+ 
+ 
+ (*
+    FoldTypeIndrX - check to see that des = *expr is type compatible.
+ *)
+ 
+ PROCEDURE FoldTypeIndrX (q: CARDINAL; tokenNo: CARDINAL; des, expr: CARDINAL; r: CARDINAL) ;
  VAR
+    desType,
     exprType: CARDINAL ;
  BEGIN
!    (* Need to skip over a variable or temporary in des and expr so
!       long as expr is not a procedure.  In the case of des = *expr,
!       both expr and des will be variables due to the property of
!       indirection.  *)
!    desType := GetType (des) ;
!    IF IsProcedure (expr)
     THEN
+       (* Must not GetType for a procedure as it gives the return type.  *)
        exprType := expr
     ELSE
!       exprType := GetType (expr)
     END ;
!    IF AssignmentTypeCompatible (tokenNo, "", GetType (des), GetType (expr), FALSE)
     THEN
        SubQuad(q)
     ELSE
*************** BEGIN
*** 1785,1798 ****
                            des, expr) ;
           ELSE
              MetaErrorT3 (tokenNo,
!                          'assignment designator {%1Ea} {%1ta:of type {%1ta}} {%1d:is a {%1d}} and expression {%2a} {%3ad:of type {%3ad}} are incompatible',
                           des, expr, exprType)
           END ;
           setReported (r) ;
           FlushErrors
        END
     END
! END FoldTypeAssign ;
  
  
  (*
--- 1898,1913 ----
                            des, expr) ;
           ELSE
              MetaErrorT3 (tokenNo,
!                          'assignment designator {%1Ea} {%1ta:of type {%1ta}}' +
!                          ' {%1d:is a {%1d}} and expression {%2a} {%3ad:of type' +
!                          ' {%3ad}} are incompatible',
                           des, expr, exprType)
           END ;
           setReported (r) ;
           FlushErrors
        END
     END
! END FoldTypeIndrX ;
  
  
  (*
*************** END FoldTypeExpr ;
*** 1859,1893 ****
  *)
  
  PROCEDURE CodeTypeAssign (tokenNo: CARDINAL; des, expr: CARDINAL; r: CARDINAL) ;
  VAR
!    exprType: CARDINAL ;
  BEGIN
!    IF IsProcedure(expr)
     THEN
!       exprType := expr
     ELSE
!       exprType := GetType(expr)
!    END ;
!    IF NOT IsAssignmentCompatible(GetType(des), exprType)
     THEN
        IF NOT reportedError (r)
        THEN
!          IF IsProcedure(des)
           THEN
!             MetaErrorsT2(tokenNo,
!                          'the return type {%1Etad} declared in procedure {%1Da}',
!                          'is incompatible with the returned expression {%2EUa} {%2tad:of type {%2tad}}',
!                          des, expr) ;
           ELSE
!             MetaErrorT2(tokenNo,
!                         'assignment designator {%1Ea} {%1ta:of type {%1ta}} {%1d:is a {%1d}} and expression {%2a} {%2tad:of type {%2tad}} are incompatible',
!                         des, expr)
           END ;
           setReported (r)
        END
        (* FlushErrors *)
     END
! END CodeTypeAssign ;
  
  
  (*
--- 1974,2063 ----
  *)
  
  PROCEDURE CodeTypeAssign (tokenNo: CARDINAL; des, expr: CARDINAL; r: CARDINAL) ;
+ BEGIN
+    IF NOT AssignmentTypeCompatible (tokenNo, "", des, expr, FALSE)
+    THEN
+       IF NOT reportedError (r)
+       THEN
+          MetaErrorT2 (tokenNo,
+                       'assignment designator {%1Ea} {%1ta:of type {%1ta}} {%1d:is a {%1d}} and expression {%2a} {%2tad:of type {%2tad}} are incompatible',
+                       des, expr)
+       END ;
+       setReported (r)
+    END
+ END CodeTypeAssign ;
+ 
+ 
+ (*
+    CodeTypeReturnFunc -
+ *)
+ 
+ PROCEDURE CodeTypeReturnFunc (tokenNo: CARDINAL; func, val: CARDINAL; r: CARDINAL) ;
  VAR
!    valType,
!    returnType: CARDINAL ;
  BEGIN
!    returnType := GetType (func) ;
!    IF returnType = NulSym
     THEN
!       IF NOT reportedError (r)
!       THEN
!          MetaErrorsT2 (tokenNo,
!                        'procedure {%1Da} is not a procedure function',
!                        '{%2ad} cannot be returned from {%1Da}',
!                        func, val) ;
!       END
     ELSE
!       valType := val ;
!       IF IsVar (val) AND (GetMode (val) = LeftValue)
!       THEN
!          valType := GetType (val)
!       END ;
!       IF NOT AssignmentTypeCompatible (tokenNo, "", returnType, valType, FALSE)
!       THEN
!          IF NOT reportedError (r)
!          THEN
!             MetaErrorsT2 (tokenNo,
!                           'the return type {%1Etad} used in procedure function {%1Da}',
!                           'is incompatible with the returned expression {%2EUa} {%2tad:of type {%2tad}}',
!                           func, val)
!          END
!       END
!    END
! END CodeTypeReturnFunc ;
! 
! 
! (*
!    CodeTypeIndrX - checks that des = *expr is type compatible and generates an error if they
!                    are not compatible.  It skips over the LValue type so that to allow
!                    the error messages to pick up the source variable name rather than
!                    a temporary name or vague name 'expression'.
! *)
! 
! PROCEDURE CodeTypeIndrX (tokenNo: CARDINAL; des, expr: CARDINAL; r: CARDINAL) ;
! BEGIN
!    IF NOT AssignmentTypeCompatible (tokenNo, "", GetType (des), GetType (expr), FALSE)
     THEN
        IF NOT reportedError (r)
        THEN
!          IF IsProcedure (des)
           THEN
!             MetaErrorsT2 (tokenNo,
!                           'the return type {%1Etad} declared in procedure {%1Da}',
!                           'is incompatible with the returned expression {%2EUa} {%2tad:of type {%2tad}}',
!                           des, expr) ;
           ELSE
!             MetaErrorT2 (tokenNo,
!                          'assignment designator {%1Ea} {%1ta:of type {%1ta}}' +
!                          ' {%1d:is a {%1d}} and expression {%2a}' +
!                          ' {%2tad:of type {%2tad}} are incompatible',
!                          des, expr)
           END ;
           setReported (r)
        END
        (* FlushErrors *)
     END
! END CodeTypeIndrX ;
  
  
  (*
*************** BEGIN
*** 1941,1949 ****
        THEN
           CASE type OF
  
!          typeassign:  FoldTypeAssign(q, tokenNo, des, expr, r) |
!          typeparam:   FoldTypeParam(q, tokenNo, des, expr, procedure, paramNo, r) |
!          typeexpr:    FoldTypeExpr(q, tokenNo, des, expr, strict, isin, r)
  
           ELSE
              InternalError ('not expecting to reach this point')
--- 2111,2121 ----
        THEN
           CASE type OF
  
!          typeassign:  FoldTypeAssign (q, tokenNo, des, expr, r) |
!          typeparam :  FoldTypeParam (q, tokenNo, des, expr, procedure, paramNo, r) |
!          typeexpr  :  FoldTypeExpr (q, tokenNo, des, expr, strict, isin, r) |
!          typeindrx :  FoldTypeIndrX (q, tokenNo, des, expr, r) |
!          typereturn:  FoldTypeReturnFunc (q, tokenNo, des, expr, r)
  
           ELSE
              InternalError ('not expecting to reach this point')
*************** BEGIN
*** 1974,1982 ****
        THEN
           CASE type OF
  
!          typeassign:  CodeTypeAssign(tokenNo, des, expr, r) |
!          typeparam:   CodeTypeParam(tokenNo, des, expr, procedure, paramNo) |
!          typeexpr:    CodeTypeExpr(tokenNo, des, expr, strict, isin, r)
  
           ELSE
              InternalError ('not expecting to reach this point')
--- 2146,2156 ----
        THEN
           CASE type OF
  
!          typeassign:  CodeTypeAssign (tokenNo, des, expr, r) |
!          typeparam :  CodeTypeParam (tokenNo, des, expr, procedure, paramNo) |
!          typeexpr  :  CodeTypeExpr (tokenNo, des, expr, strict, isin, r) |
!          typeindrx :  CodeTypeIndrX (tokenNo, des, expr, r) |
!          typereturn:  CodeTypeReturnFunc (tokenNo, des, expr, r)
  
           ELSE
              InternalError ('not expecting to reach this point')
*************** BEGIN
*** 2005,2011 ****
     success := TRUE ;
     WITH p^ DO
        combinedtok := MakeVirtual2Tok (destok, exprtok) ;
!       IF NOT AssignmentTypeCompatible (combinedtok, "", des, expr)
        THEN
           MetaErrorT2 (combinedtok,
                        'type incompatibility between {%1Et} and {%2t} detected during the assignment of the designator {%1a} to the first expression {%2a} in the {%kFOR} loop',
--- 2179,2185 ----
     success := TRUE ;
     WITH p^ DO
        combinedtok := MakeVirtual2Tok (destok, exprtok) ;
!       IF NOT AssignmentTypeCompatible (combinedtok, "", des, expr, TRUE)
        THEN
           MetaErrorT2 (combinedtok,
                        'type incompatibility between {%1Et} and {%2t} detected during the assignment of the designator {%1a} to the first expression {%2a} in the {%kFOR} loop',
*************** BEGIN
*** 2419,2427 ****
        excl                 :  FoldExcl(tokenno, quad, range) |
        shift                :  FoldShift(tokenno, quad, range) |
        rotate               :  FoldRotate(tokenno, quad, range) |
!       typeassign           :  FoldTypeCheck(tokenno, quad, range) |
!       typeparam            :  FoldTypeCheck(tokenno, quad, range) |
!       typeexpr             :  FoldTypeCheck(tokenno, quad, range) |
        paramassign          :  FoldParameterAssign(tokenno, quad, range) |
        staticarraysubscript :  FoldStaticArraySubscript(tokenno, quad, range) |
        dynamicarraysubscript:  FoldDynamicArraySubscript(tokenno, quad, range) |
--- 2593,2603 ----
        excl                 :  FoldExcl(tokenno, quad, range) |
        shift                :  FoldShift(tokenno, quad, range) |
        rotate               :  FoldRotate(tokenno, quad, range) |
!       typereturn,
!       typeassign,
!       typeparam,
!       typeexpr,
!       typeindrx            :  FoldTypeCheck (tokenno, quad, range) |
        paramassign          :  FoldParameterAssign(tokenno, quad, range) |
        staticarraysubscript :  FoldStaticArraySubscript(tokenno, quad, range) |
        dynamicarraysubscript:  FoldDynamicArraySubscript(tokenno, quad, range) |
*************** BEGIN
*** 3557,3562 ****
--- 3733,3740 ----
        typeassign           :  s := NIL |
        typeparam            :  s := NIL |
        typeexpr             :  s := NIL |
+       typeindrx            :  s := InitString ('assignment between designator {%1ad} and {%2ad} is incompatible') |
+       typereturn           :  s := InitString ('the value {%2ad} returned from procedure function {%1a} is type incompatible, expecting {%1tad} rather than a {%2tad}') |
        paramassign          :  s := InitString('if this call is executed then the actual parameter {%2Wa} will be out of range of the {%3N} formal parameter {%1a}') |
        staticarraysubscript :  s := InitString('if this access to the static array {%1Wa:{%2a:{%1a}[{%2a}]}} is ever made then the index will be out of bounds in the {%3N} array subscript') |
        dynamicarraysubscript:  s := InitString('if this access to the dynamic array {%1Wa:{%2a:{%1a}[{%2a}]}} is ever made then the index will be out of bounds in the {%3N} array subscript') |
*************** BEGIN
*** 3605,3613 ****
        excl                 :  CodeInclExcl (tokenNo, r, function, message) |
        shift,
        rotate               :  CodeShiftRotate (tokenNo, r, function, message) |
!       typeassign           :  CodeTypeCheck (tokenNo, r) |
!       typeparam            :  CodeTypeCheck (tokenNo, r) |
!       typeexpr             :  CodeTypeCheck (tokenNo, r) |
        staticarraysubscript :  CodeStaticArraySubscript (tokenNo, r, function, message) |
        dynamicarraysubscript:  CodeDynamicArraySubscript (tokenNo, r, function, message) |
        forloopbegin         :  CodeForLoopBegin (tokenNo, r, function, message) |
--- 3783,3793 ----
        excl                 :  CodeInclExcl (tokenNo, r, function, message) |
        shift,
        rotate               :  CodeShiftRotate (tokenNo, r, function, message) |
!       typeassign,
!       typeparam,
!       typeexpr,
!       typeindrx,
!       typereturn           :  CodeTypeCheck (tokenNo, r) |
        staticarraysubscript :  CodeStaticArraySubscript (tokenNo, r, function, message) |
        dynamicarraysubscript:  CodeDynamicArraySubscript (tokenNo, r, function, message) |
        forloopbegin         :  CodeForLoopBegin (tokenNo, r, function, message) |
*************** BEGIN
*** 3743,3748 ****
--- 3923,3930 ----
        rotate               :  WriteString('rotate(') ; WriteOperand(des) ; WriteString(', ') ; WriteOperand(expr) |
        typeexpr             :  WriteString('expr compatible (') ; WriteOperand(des) ; WriteString(', ') ; WriteOperand(expr) |
        typeassign           :  WriteString('assignment compatible (') ; WriteOperand(des) ; WriteString(', ') ; WriteOperand(expr) |
+       typeindrx            :  WriteString('indrx compatible (') ; WriteOperand(des) ; WriteString(', ') ; WriteOperand(expr) |
+       typereturn           :  WriteString('return compatible (') ; WriteOperand(des) ; WriteString(', ') ; WriteOperand(expr) |
        typeparam            :  WriteString('parameter compatible (') ; WriteOperand(des) ; WriteString(', ') ; WriteOperand(expr) |
        paramassign          :  WriteString('parameter range (') ; WriteOperand(des) ; WriteString(', ') ; WriteOperand(expr) |
        staticarraysubscript :  WriteString('staticarraysubscript(') ; WriteOperand(des) ; WriteString(', ') ; WriteOperand(expr) |
diff -Nrcpad gcc-16-20250525/gcc/m2/gm2-gcc/m2options.h gcc-16-20250601/gcc/m2/gm2-gcc/m2options.h
*** gcc-16-20250525/gcc/m2/gm2-gcc/m2options.h	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/m2/gm2-gcc/m2options.h	Sun Jun  1 22:32:15 2025
*************** EXTERN char *M2Options_GetM2DumpFilter (
*** 168,173 ****
--- 168,175 ----
  EXTERN void M2Options_SetM2DebugTraceFilter (bool value, const char *arg);
  EXTERN bool M2Options_SetM2Dump (bool value, const char *arg);
  EXTERN bool M2Options_GetDumpGimple (void);
+ EXTERN void M2Options_SetStrictTypeAssignment (bool value);
+ EXTERN void M2Options_SetStrictTypeReason (bool value);
  
  #undef EXTERN
  #endif /* m2options_h.  */
diff -Nrcpad gcc-16-20250525/gcc/m2/gm2-lang.cc gcc-16-20250601/gcc/m2/gm2-lang.cc
*** gcc-16-20250525/gcc/m2/gm2-lang.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/m2/gm2-lang.cc	Sun Jun  1 22:32:15 2025
*************** gm2_langhook_handle_option (
*** 525,530 ****
--- 525,533 ----
      case OPT_fm2_strict_type:
        M2Options_SetStrictTypeChecking (value);
        return 1;
+     case OPT_fm2_strict_type_reason:
+       M2Options_SetStrictTypeReason (value);
+       return 1;
      case OPT_fm2_debug_trace_:
        M2Options_SetM2DebugTraceFilter (value, arg);
        return 1;
diff -Nrcpad gcc-16-20250525/gcc/m2/gm2-libs-log/InOut.mod gcc-16-20250601/gcc/m2/gm2-libs-log/InOut.mod
*** gcc-16-20250525/gcc/m2/gm2-libs-log/InOut.mod	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/m2/gm2-libs-log/InOut.mod	Sun Jun  1 22:32:15 2025
*************** END WriteString ;
*** 257,272 ****
  PROCEDURE LocalWrite (ch: CHAR) ;
  BEGIN
     FIO.WriteChar(outFile, ch) ;
!    Done := FIO.IsNoError(outFile)
! (*
!    IF outUsed
!    THEN
!       FIO.WriteChar(outFile, ch) ;
!       Done := FIO.IsNoError(outFile)
!    ELSE
!       Done := (write(stdout, ADR(ch), 1) = 1)
!    END
! *)
  END LocalWrite ;
  
  
--- 257,264 ----
  PROCEDURE LocalWrite (ch: CHAR) ;
  BEGIN
     FIO.WriteChar(outFile, ch) ;
!    Done := FIO.IsNoError(outFile) ;
!    FIO.FlushBuffer (outFile)
  END LocalWrite ;
  
  
diff -Nrcpad gcc-16-20250525/gcc/m2/lang.opt gcc-16-20250601/gcc/m2/lang.opt
*** gcc-16-20250525/gcc/m2/lang.opt	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/m2/lang.opt	Sun Jun  1 22:32:15 2025
*************** fm2-strict-type
*** 190,195 ****
--- 190,199 ----
  Modula-2
  experimental flag to turn on the new strict type checker
  
+ fm2-strict-type-reason
+ Modula-2
+ provides more detail why the types are incompatible
+ 
  fm2-whole-program
  Modula-2
  compile all implementation modules and program module at once
diff -Nrcpad gcc-16-20250525/gcc/match.pd gcc-16-20250601/gcc/match.pd
*** gcc-16-20250525/gcc/match.pd	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/match.pd	Sun Jun  1 22:32:15 2025
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 3438,3443 ****
--- 3438,3453 ----
  	 (signed_integer_sat_val @0)
  	 @2))
   (match (signed_integer_sat_add @0 @1)
+   /* T SUM = (T)((UT)X + (UT)IMM)
+      SAT_S_ADD = (X ^ SUM) < 0 && (X ^ IMM) >= 0 ? (-(T)(X < 0) ^ MAX) : SUM  */
+   (cond^ (bit_and:c (lt (bit_xor @0 (nop_convert@2 (plus (nop_convert @0)
+ 							 INTEGER_CST@1)))
+ 			integer_zerop)
+ 		    (ge (bit_xor:c @0 INTEGER_CST@3) integer_zerop))
+ 	 (signed_integer_sat_val @0)
+ 	 @2)
+   (if (wi::eq_p (wi::to_wide (@1), wi::to_wide (@3)))))
+  (match (signed_integer_sat_add @0 @1)
     /* SUM = .ADD_OVERFLOW (X, Y)
        SAT_S_ADD = IMAGPART_EXPR (SUM) != 0 ? (-(T)(X < 0) ^ MAX) : SUM  */
    (cond^ (ne (imagpart (IFN_ADD_OVERFLOW:c@2 @0 @1)) integer_zerop)
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 3461,3467 ****
  			(bit_xor:c @0 INTEGER_CST@3)) integer_zerop)
  	 (signed_integer_sat_val @0)
  	 @2)
!   (if (wi::bit_and (wi::to_wide (@1), wi::to_wide (@3)) == 0))))
  
  /* Saturation sub for signed integer.  */
  (if (INTEGRAL_TYPE_P (type) && !TYPE_UNSIGNED (type))
--- 3471,3494 ----
  			(bit_xor:c @0 INTEGER_CST@3)) integer_zerop)
  	 (signed_integer_sat_val @0)
  	 @2)
!   (if (wi::bit_and (wi::to_wide (@1), wi::to_wide (@3)) == 0)))
! 
! (match (signed_integer_sat_add @0 @1)
!   /* T SUM = (T)((UT)X + (UT)-1);
!      SAT_S_ADD = (X ^ -1) < 0 ? SUM : (X ^ SUM) >= 0 ? SUM
! 						      : (x < 0) ? MIN : MAX  */
!   (convert (cond^ (lt (bit_and:c @0 (nop_convert (negate (nop_convert @0))))
!              integer_zerop)
! 	 INTEGER_CST@2
! 	 (plus (nop_convert @0) integer_all_onesp@1)))
!    (with
!     {
!      unsigned precision = TYPE_PRECISION (type);
!      wide_int c1 = wi::to_wide (@1);
!      wide_int c2 = wi::to_wide (@2);
!      wide_int sum = wi::add (c1, c2);
!     }
!     (if (wi::eq_p (sum, wi::max_value (precision, SIGNED)))))))
  
  /* Saturation sub for signed integer.  */
  (if (INTEGRAL_TYPE_P (type) && !TYPE_UNSIGNED (type))
diff -Nrcpad gcc-16-20250525/gcc/omp-general.h gcc-16-20250601/gcc/omp-general.h
*** gcc-16-20250525/gcc/omp-general.h	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/omp-general.h	Sun Jun  1 22:32:15 2025
*************** get_openacc_privatization_dump_flags ()
*** 254,259 ****
--- 254,345 ----
  
  extern tree omp_build_component_ref (tree obj, tree field);
  
+ template <typename T>
+ struct omp_name_type
+ {
+   tree name;
+   T type;
+ };
+ 
+ template <>
+ struct default_hash_traits <omp_name_type<tree> >
+   : typed_noop_remove <omp_name_type<tree> >
+ {
+   GTY((skip)) typedef omp_name_type<tree> value_type;
+   GTY((skip)) typedef omp_name_type<tree> compare_type;
+ 
+   static hashval_t
+   hash (omp_name_type<tree> p)
+   {
+     return p.name ? iterative_hash_expr (p.name, TYPE_UID (p.type))
+ 		  : TYPE_UID (p.type);
+   }
+ 
+   static const bool empty_zero_p = true;
+ 
+   static bool
+   is_empty (omp_name_type<tree> p)
+   {
+     return p.type == NULL;
+   }
+ 
+   static bool
+   is_deleted (omp_name_type<tree>)
+   {
+     return false;
+   }
+ 
+   static bool
+   equal (const omp_name_type<tree> &a, const omp_name_type<tree> &b)
+   {
+     if (a.name == NULL_TREE && b.name == NULL_TREE)
+       return a.type == b.type;
+     else if (a.name == NULL_TREE || b.name == NULL_TREE)
+       return false;
+     else
+       return a.name == b.name && a.type == b.type;
+   }
+ 
+   static void
+   mark_empty (omp_name_type<tree> &e)
+   {
+     e.type = NULL;
+   }
+ };
+ 
+ template <typename T>
+ struct omp_mapper_list
+ {
+   hash_set<omp_name_type<T>> *seen_types;
+   vec<tree> *mappers;
+ 
+   omp_mapper_list (hash_set<omp_name_type<T>> *s, vec<tree> *m)
+     : seen_types (s), mappers (m) { }
+ 
+   void add_mapper (tree name, T type, tree mapperfn)
+   {
+     /* We can't hash a NULL_TREE...  */
+     if (!name)
+       name = void_node;
+ 
+     omp_name_type<T> n_t = { name, type };
+ 
+     if (seen_types->contains (n_t))
+       return;
+ 
+     seen_types->add (n_t);
+     mappers->safe_push (mapperfn);
+   }
+ 
+   bool contains (tree name, T type)
+   {
+     if (!name)
+       name = void_node;
+ 
+     return seen_types->contains ({ name, type });
+   }
+ };
+ 
  namespace omp_addr_tokenizer {
  
  /* These are the ways of accessing a variable that have special-case handling
diff -Nrcpad gcc-16-20250525/gcc/opts-diagnostic.cc gcc-16-20250601/gcc/opts-diagnostic.cc
*** gcc-16-20250525/gcc/opts-diagnostic.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/opts-diagnostic.cc	Sun Jun  1 22:32:15 2025
*************** html_scheme_handler::make_sink (const co
*** 545,565 ****
  				const char *unparsed_arg,
  				const scheme_name_and_params &parsed_arg) const
  {
    label_text filename;
    for (auto& iter : parsed_arg.m_kvs)
      {
        const std::string &key = iter.first;
        const std::string &value = iter.second;
        if (key == "file")
  	{
  	  filename = label_text::take (xstrdup (value.c_str ()));
  	  continue;
  	}
  
        /* Key not found.  */
        auto_vec<const char *> known_keys;
        known_keys.safe_push ("file");
!       ctxt.report_unknown_key (unparsed_arg, key, get_scheme_name (), known_keys);
        return nullptr;
      }
  
--- 545,584 ----
  				const char *unparsed_arg,
  				const scheme_name_and_params &parsed_arg) const
  {
+   bool css = true;
    label_text filename;
+   bool javascript = true;
    for (auto& iter : parsed_arg.m_kvs)
      {
        const std::string &key = iter.first;
        const std::string &value = iter.second;
+       if (key == "css")
+ 	{
+ 	  if (!parse_bool_value (ctxt, unparsed_arg, key, value,
+ 				 css))
+ 	    return nullptr;
+ 	  continue;
+ 	}
        if (key == "file")
  	{
  	  filename = label_text::take (xstrdup (value.c_str ()));
  	  continue;
  	}
+       if (key == "javascript")
+ 	{
+ 	  if (!parse_bool_value (ctxt, unparsed_arg, key, value,
+ 				 javascript))
+ 	    return nullptr;
+ 	  continue;
+ 	}
  
        /* Key not found.  */
        auto_vec<const char *> known_keys;
+       known_keys.safe_push ("css");
        known_keys.safe_push ("file");
!       known_keys.safe_push ("javascript");
!       ctxt.report_unknown_key (unparsed_arg, key, get_scheme_name (),
! 			       known_keys);
        return nullptr;
      }
  
*************** html_scheme_handler::make_sink (const co
*** 579,586 ****
--- 598,610 ----
    if (!output_file)
      return nullptr;
  
+   html_generation_options html_gen_opts;
+   html_gen_opts.m_css = css;
+   html_gen_opts.m_javascript = javascript;
+ 
    auto sink = make_html_sink (ctxt.m_dc,
  			      *line_table,
+ 			      html_gen_opts,
  			      std::move (output_file));
    return sink;
  }
diff -Nrcpad gcc-16-20250525/gcc/passes.cc gcc-16-20250601/gcc/passes.cc
*** gcc-16-20250525/gcc/passes.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/passes.cc	Sun Jun  1 22:32:15 2025
*************** along with GCC; see the file COPYING3.
*** 64,69 ****
--- 64,72 ----
  #include "stringpool.h"
  #include "attribs.h"
  
+ /* Reserved TODOs */
+ #define TODO_verify_il			(1u << 31)
+ 
  using namespace gcc;
  
  /* This is used for debugging.  It allows the current pass to printed
*************** execute_function_todo (function *fn, voi
*** 2059,2065 ****
  {
    bool from_ipa_pass = (cfun == NULL);
    unsigned int flags = (size_t)data;
-   flags &= ~fn->last_verified;
    if (!flags)
      return;
  
--- 2062,2067 ----
*************** execute_function_todo (function *fn, voi
*** 2127,2134 ****
        gcc_assert (dom_info_state (fn, CDI_POST_DOMINATORS) == pre_verify_pstate);
      }
  
-   fn->last_verified = flags & TODO_verify_all;
- 
    pop_cfun ();
  
    /* For IPA passes make sure to release dominator info, it can be
--- 2129,2134 ----
*************** verify_interpass_invariants (void)
*** 2193,2206 ****
    gcc_checking_assert (!fold_deferring_overflow_warnings_p ());
  }
  
- /* Clear the last verified flag.  */
- 
- static void
- clear_last_verified (function *fn, void *data ATTRIBUTE_UNUSED)
- {
-   fn->last_verified = 0;
- }
- 
  /* Helper function. Verify that the properties has been turn into the
     properties expected by the pass.  */
  
--- 2193,2198 ----
*************** execute_one_ipa_transform_pass (struct c
*** 2339,2351 ****
    if (pass->tv_id != TV_NONE)
      timevar_push (pass->tv_id);
  
    /* Run pre-pass verification.  */
    execute_todo (ipa_pass->function_transform_todo_flags_start);
  
    /* Do it!  */
    todo_after = ipa_pass->function_transform (node);
  
!   /* Run post-pass cleanup and verification.  */
    execute_todo (todo_after);
    verify_interpass_invariants ();
  
--- 2331,2345 ----
    if (pass->tv_id != TV_NONE)
      timevar_push (pass->tv_id);
  
+   gcc_checking_assert (!(ipa_pass->function_transform_todo_flags_start & TODO_verify_il));
    /* Run pre-pass verification.  */
    execute_todo (ipa_pass->function_transform_todo_flags_start);
  
    /* Do it!  */
    todo_after = ipa_pass->function_transform (node);
  
!   /* Run post-pass cleanup.  */
!   gcc_checking_assert (!(todo_after & TODO_verify_il));
    execute_todo (todo_after);
    verify_interpass_invariants ();
  
*************** execute_all_ipa_transforms (bool do_not_
*** 2391,2397 ****
  
    for (auto p : node->ipa_transforms_to_apply)
      {
!       /* To get consistent statistics, we need to account each functio
  	 to each IPA pass.  */
        if (report)
  	{
--- 2385,2391 ----
  
    for (auto p : node->ipa_transforms_to_apply)
      {
!       /* To get consistent statistics, we need to account each function
  	 to each IPA pass.  */
        if (report)
  	{
*************** execute_one_pass (opt_pass *pass)
*** 2649,2654 ****
--- 2643,2649 ----
  
  
    /* Run pre-pass verification.  */
+   gcc_checking_assert (!(pass->todo_flags_start & TODO_verify_il));
    execute_todo (pass->todo_flags_start);
  
    if (flag_checking)
*************** execute_one_pass (opt_pass *pass)
*** 2697,2707 ****
        return true;
      }
  
-   do_per_function (clear_last_verified, NULL);
- 
    do_per_function (update_properties_after_pass, pass);
  
    /* Run post-pass cleanup and verification.  */
    execute_todo (todo_after | pass->todo_flags_finish | TODO_verify_il);
    if (profile_report)
      {
--- 2692,2702 ----
        return true;
      }
  
    do_per_function (update_properties_after_pass, pass);
  
    /* Run post-pass cleanup and verification.  */
+   gcc_checking_assert (!(todo_after & TODO_verify_il));
+   gcc_checking_assert (!(pass->todo_flags_finish & TODO_verify_il));
    execute_todo (todo_after | pass->todo_flags_finish | TODO_verify_il);
    if (profile_report)
      {
diff -Nrcpad gcc-16-20250525/gcc/passes.def gcc-16-20250601/gcc/passes.def
*** gcc-16-20250525/gcc/passes.def	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/passes.def	Sun Jun  1 22:32:15 2025
*************** along with GCC; see the file COPYING3.
*** 140,145 ****
--- 140,148 ----
  
    NEXT_PASS (pass_target_clone);
    NEXT_PASS (pass_ipa_auto_profile);
+   PUSH_INSERT_PASSES_WITHIN (pass_ipa_auto_profile)
+       NEXT_PASS (pass_feedback_split_functions);
+   POP_INSERT_PASSES ()
    NEXT_PASS (pass_ipa_tree_profile);
    PUSH_INSERT_PASSES_WITHIN (pass_ipa_tree_profile)
        NEXT_PASS (pass_feedback_split_functions);
diff -Nrcpad gcc-16-20250525/gcc/predict.cc gcc-16-20250601/gcc/predict.cc
*** gcc-16-20250525/gcc/predict.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/predict.cc	Sun Jun  1 22:32:15 2025
*************** set_even_probabilities (basic_block bb,
*** 961,967 ****
  	    if (unlikely_edges != NULL && unlikely_edges->contains (e))
  	      e->probability = profile_probability::very_unlikely ();
  	    else
! 	      e->probability = all / scale;
  	  }
  	else
  	  e->probability = profile_probability::never ();
--- 961,967 ----
  	    if (unlikely_edges != NULL && unlikely_edges->contains (e))
  	      e->probability = profile_probability::very_unlikely ();
  	    else
! 	      e->probability = (all / scale).guessed ();
  	  }
  	else
  	  e->probability = profile_probability::never ();
*************** rebuild_frequencies (void)
*** 4444,4454 ****
--- 4444,4457 ----
    bool inconsistency_found = false;
    bool uninitialized_probablity_found = false;
    bool uninitialized_count_found = false;
+   bool feedback_found = false;
  
    cfun->cfg->count_max = profile_count::uninitialized ();
    FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun), NULL, next_bb)
      {
        cfun->cfg->count_max = cfun->cfg->count_max.max (bb->count);
+       if (bb->count.nonzero_p () && bb->count.quality () >= AFDO)
+ 	feedback_found = true;
        /* Uninitialized count may be result of inlining or an omision in an
           optimization pass.  */
        if (!bb->count.initialized_p ())
*************** rebuild_frequencies (void)
*** 4516,4523 ****
       Propagating from probabilities would make profile look consistent, but
       because probablities after code duplication may not be representative
       for a given run, we would only propagate the error further.  */
!   if (ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.ipa ().nonzero_p ()
!       && !uninitialized_count_found)
      {
        if (dump_file)
  	fprintf (dump_file,
--- 4519,4525 ----
       Propagating from probabilities would make profile look consistent, but
       because probablities after code duplication may not be representative
       for a given run, we would only propagate the error further.  */
!   if (feedback_found && !uninitialized_count_found)
      {
        if (dump_file)
  	fprintf (dump_file,
diff -Nrcpad gcc-16-20250525/gcc/pretty-print.cc gcc-16-20250601/gcc/pretty-print.cc
*** gcc-16-20250525/gcc/pretty-print.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/pretty-print.cc	Sun Jun  1 22:32:15 2025
*************** pretty_printer::pretty_printer (int maxi
*** 2461,2467 ****
      m_indent_skip (0),
      m_wrapping (),
      m_format_decoder (nullptr),
!     m_format_postprocessor (NULL),
      m_token_printer (nullptr),
      m_emitted_prefix (false),
      m_need_newline (false),
--- 2461,2467 ----
      m_indent_skip (0),
      m_wrapping (),
      m_format_decoder (nullptr),
!     m_format_postprocessor (nullptr),
      m_token_printer (nullptr),
      m_emitted_prefix (false),
      m_need_newline (false),
*************** pretty_printer::pretty_printer (const pr
*** 2487,2493 ****
    m_indent_skip (other.m_indent_skip),
    m_wrapping (other.m_wrapping),
    m_format_decoder (other.m_format_decoder),
!   m_format_postprocessor (NULL),
    m_token_printer (other.m_token_printer),
    m_emitted_prefix (other.m_emitted_prefix),
    m_need_newline (other.m_need_newline),
--- 2487,2493 ----
    m_indent_skip (other.m_indent_skip),
    m_wrapping (other.m_wrapping),
    m_format_decoder (other.m_format_decoder),
!   m_format_postprocessor (nullptr),
    m_token_printer (other.m_token_printer),
    m_emitted_prefix (other.m_emitted_prefix),
    m_need_newline (other.m_need_newline),
*************** pretty_printer::pretty_printer (const pr
*** 2508,2515 ****
  
  pretty_printer::~pretty_printer ()
  {
-   if (m_format_postprocessor)
-     delete m_format_postprocessor;
    m_buffer->~output_buffer ();
    XDELETE (m_buffer);
    free (m_prefix);
--- 2508,2513 ----
diff -Nrcpad gcc-16-20250525/gcc/pretty-print.h gcc-16-20250601/gcc/pretty-print.h
*** gcc-16-20250525/gcc/pretty-print.h	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/pretty-print.h	Sun Jun  1 22:32:15 2025
*************** class format_postprocessor
*** 196,202 ****
  {
   public:
    virtual ~format_postprocessor () {}
!   virtual format_postprocessor *clone() const = 0;
    virtual void handle (pretty_printer *) = 0;
  };
  
--- 196,202 ----
  {
   public:
    virtual ~format_postprocessor () {}
!   virtual std::unique_ptr<format_postprocessor> clone() const = 0;
    virtual void handle (pretty_printer *) = 0;
  };
  
*************** inline int & pp_indentation (pretty_prin
*** 229,235 ****
  inline bool & pp_translate_identifiers (pretty_printer *pp);
  inline bool & pp_show_color (pretty_printer *pp);
  inline printer_fn &pp_format_decoder (pretty_printer *pp);
! inline format_postprocessor *& pp_format_postprocessor (pretty_printer *pp);
  inline bool & pp_show_highlight_colors (pretty_printer *pp);
  
  class urlifier;
--- 229,235 ----
  inline bool & pp_translate_identifiers (pretty_printer *pp);
  inline bool & pp_show_color (pretty_printer *pp);
  inline printer_fn &pp_format_decoder (pretty_printer *pp);
! inline format_postprocessor *pp_format_postprocessor (pretty_printer *pp);
  inline bool & pp_show_highlight_colors (pretty_printer *pp);
  
  class urlifier;
*************** public:
*** 256,262 ****
    friend bool & pp_translate_identifiers (pretty_printer *pp);
    friend bool & pp_show_color (pretty_printer *pp);
    friend printer_fn &pp_format_decoder (pretty_printer *pp);
!   friend format_postprocessor *& pp_format_postprocessor (pretty_printer *pp);
    friend bool & pp_show_highlight_colors (pretty_printer *pp);
  
    friend void pp_output_formatted_text (pretty_printer *,
--- 256,262 ----
    friend bool & pp_translate_identifiers (pretty_printer *pp);
    friend bool & pp_show_color (pretty_printer *pp);
    friend printer_fn &pp_format_decoder (pretty_printer *pp);
!   friend format_postprocessor * pp_format_postprocessor (pretty_printer *pp);
    friend bool & pp_show_highlight_colors (pretty_printer *pp);
  
    friend void pp_output_formatted_text (pretty_printer *,
*************** public:
*** 316,321 ****
--- 316,326 ----
    void set_real_maximum_length ();
    int remaining_character_count_for_line ();
  
+   void set_format_postprocessor (std::unique_ptr<format_postprocessor> p)
+   {
+     m_format_postprocessor = std::move (p);
+   }
+ 
    void dump (FILE *out, int indent) const;
    void DEBUG_FUNCTION dump () const { dump (stderr, 0); }
  
*************** private:
*** 356,362 ****
       have been processed, to allow for client-specific postprocessing.
       This is used by the C++ frontend for handling the %H and %I
       format codes (which interract with each other).  */
!   format_postprocessor *m_format_postprocessor;
  
    /* This is used by pp_output_formatted_text after it has converted all
       formatted chunks into a single list of tokens.
--- 361,367 ----
       have been processed, to allow for client-specific postprocessing.
       This is used by the C++ frontend for handling the %H and %I
       format codes (which interract with each other).  */
!   std::unique_ptr<format_postprocessor> m_format_postprocessor;
  
    /* This is used by pp_output_formatted_text after it has converted all
       formatted chunks into a single list of tokens.
*************** pp_format_decoder (pretty_printer *pp)
*** 443,452 ****
    return pp->m_format_decoder;
  }
  
! inline format_postprocessor *&
  pp_format_postprocessor (pretty_printer *pp)
  {
!   return pp->m_format_postprocessor;
  }
  
  inline bool &
--- 448,457 ----
    return pp->m_format_decoder;
  }
  
! inline format_postprocessor *
  pp_format_postprocessor (pretty_printer *pp)
  {
!   return pp->m_format_postprocessor.get ();
  }
  
  inline bool &
diff -Nrcpad gcc-16-20250525/gcc/profile-count.cc gcc-16-20250601/gcc/profile-count.cc
*** gcc-16-20250525/gcc/profile-count.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/profile-count.cc	Sun Jun  1 22:32:15 2025
*************** profile_count::adjust_for_ipa_scaling (p
*** 364,371 ****
    /* Scaling to zero is always zero.  */
    if (*num == zero ())
      return;
!   /* If den is non-zero we are safe.  */
!   if (den->force_nonzero () == *den)
      return;
    /* Force both to non-zero so we do not push profiles to 0 when
       both num == 0 and den == 0.  */
--- 364,375 ----
    /* Scaling to zero is always zero.  */
    if (*num == zero ())
      return;
!   /* If den is non-zero we are safe.
!      However take care of zeros in AFDO profiles since
!      they simply means that no useful samples were collected.
!      Called function still may contain important loop.  */
!   if (den->force_nonzero () == *den
!       && num->quality () != AFDO)
      return;
    /* Force both to non-zero so we do not push profiles to 0 when
       both num == 0 and den == 0.  */
*************** profile_count::combine_with_ipa_count_wi
*** 417,433 ****
  
  profile_count
  profile_count::from_gcov_type (gcov_type v, profile_quality quality)
!   {
!     profile_count ret;
!     gcc_checking_assert (v >= 0);
!     if (dump_file && v >= (gcov_type)max_count)
!       fprintf (dump_file,
! 	       "Capping gcov count %" PRId64 " to max_count %" PRId64 "\n",
! 	       (int64_t) v, (int64_t) max_count);
!     ret.m_val = MIN (v, (gcov_type)max_count);
!     ret.m_quality = quality;
!     return ret;
!   }
  
  /* COUNT1 times event happens with *THIS probability, COUNT2 times OTHER
     happens with COUNT2 probability.  Return probability that either *THIS or
--- 421,437 ----
  
  profile_count
  profile_count::from_gcov_type (gcov_type v, profile_quality quality)
! {
!   profile_count ret;
!   gcc_checking_assert (v >= 0);
!   if (dump_file && v >= (gcov_type)max_count)
!     fprintf (dump_file,
! 	     "Capping gcov count %" PRId64 " to max_count %" PRId64 "\n",
! 	     (int64_t) v, (int64_t) max_count);
!   ret.m_val = MIN (v, (gcov_type)max_count);
!   ret.m_quality = quality;
!   return ret;
! }
  
  /* COUNT1 times event happens with *THIS probability, COUNT2 times OTHER
     happens with COUNT2 probability.  Return probability that either *THIS or
diff -Nrcpad gcc-16-20250525/gcc/rtl-ssa/changes.cc gcc-16-20250601/gcc/rtl-ssa/changes.cc
*** gcc-16-20250525/gcc/rtl-ssa/changes.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/rtl-ssa/changes.cc	Sun Jun  1 22:32:15 2025
*************** recog_level2 (insn_change &change, add_r
*** 1106,1111 ****
--- 1106,1129 ----
  	    }
  	}
  
+   // Per rtl.texi, registers that are modified using RTX_AUTOINC operations
+   // cannot also appear outside an address.
+   vec_rtx_properties properties;
+   properties.add_pattern (pat);
+   for (rtx_obj_reference def : properties.refs ())
+     if (def.is_pre_post_modify ())
+       for (rtx_obj_reference use : properties.refs ())
+ 	if (def.regno == use.regno && !use.in_address ())
+ 	  {
+ 	    if (dump_file && (dump_flags & TDF_DETAILS))
+ 	      {
+ 		fprintf (dump_file, "register %d is both auto-modified"
+ 			 " and used outside an address:\n", def.regno);
+ 		print_rtl_single (dump_file, pat);
+ 	      }
+ 	    return false;
+ 	  }
+ 
    // check_asm_operands checks the constraints after RA, so we don't
    // need to do it again.
    if (reload_completed && !asm_p)
diff -Nrcpad gcc-16-20250525/gcc/rtlanal.cc gcc-16-20250601/gcc/rtlanal.cc
*** gcc-16-20250525/gcc/rtlanal.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/rtlanal.cc	Sun Jun  1 22:32:15 2025
*************** rtx_properties::try_to_add_src (const_rt
*** 2235,2241 ****
  	{
  	  has_pre_post_modify = true;
  
! 	  unsigned int addr_flags = (base_flags
  				     | rtx_obj_flags::IS_PRE_POST_MODIFY
  				     | rtx_obj_flags::IS_READ);
  	  try_to_add_dest (XEXP (x, 0), addr_flags);
--- 2235,2241 ----
  	{
  	  has_pre_post_modify = true;
  
! 	  unsigned int addr_flags = (flags
  				     | rtx_obj_flags::IS_PRE_POST_MODIFY
  				     | rtx_obj_flags::IS_READ);
  	  try_to_add_dest (XEXP (x, 0), addr_flags);
diff -Nrcpad gcc-16-20250525/gcc/sbitmap.cc gcc-16-20250601/gcc/sbitmap.cc
*** gcc-16-20250525/gcc/sbitmap.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/sbitmap.cc	Sun Jun  1 22:32:15 2025
*************** bitmap_set_range (sbitmap bmap, unsigned
*** 326,336 ****
    bmap->elms[start_word] |= mask;
  }
  
! /* Return TRUE if any bit between START and END inclusive is set within
!    the simple bitmap BMAP.  Return FALSE otherwise.  */
  
! bool
! bitmap_bit_in_range_p (const_sbitmap bmap, unsigned int start, unsigned int end)
  {
    gcc_checking_assert (start <= end);
    bitmap_check_index (bmap, end);
--- 326,338 ----
    bmap->elms[start_word] |= mask;
  }
  
! /* Helper function for bitmap_any_bit_in_range_p and
!    bitmap_all_bits_in_range_p.  If ANY_INVERTED is true, the function checks
!    if any bit in the range is unset.  */
  
! static bool
! bitmap_bit_in_range_p (const_sbitmap bmap, unsigned int start,
! 		       unsigned int end, bool any_inverted)
  {
    gcc_checking_assert (start <= end);
    bitmap_check_index (bmap, end);
*************** bitmap_bit_in_range_p (const_sbitmap bma
*** 350,356 ****
  
        SBITMAP_ELT_TYPE low_mask = ((SBITMAP_ELT_TYPE)1 << start_bitno) - 1;
        SBITMAP_ELT_TYPE mask = high_mask - low_mask;
!       if (bmap->elms[start_word] & mask)
  	return true;
        start_word++;
      }
--- 352,359 ----
  
        SBITMAP_ELT_TYPE low_mask = ((SBITMAP_ELT_TYPE)1 << start_bitno) - 1;
        SBITMAP_ELT_TYPE mask = high_mask - low_mask;
!       const SBITMAP_ELT_TYPE expected_partial = any_inverted ? mask : 0;
!       if ((bmap->elms[start_word] & mask) != expected_partial)
  	return true;
        start_word++;
      }
*************** bitmap_bit_in_range_p (const_sbitmap bma
*** 360,368 ****
  
    /* Now test words at a time until we hit a partial word.  */
    unsigned int nwords = (end_word - start_word);
    while (nwords)
      {
!       if (bmap->elms[start_word])
  	return true;
        start_word++;
        nwords--;
--- 363,372 ----
  
    /* Now test words at a time until we hit a partial word.  */
    unsigned int nwords = (end_word - start_word);
+   const SBITMAP_ELT_TYPE expected = any_inverted ? ~(SBITMAP_ELT_TYPE)0 : 0;
    while (nwords)
      {
!       if (bmap->elms[start_word] != expected)
  	return true;
        start_word++;
        nwords--;
*************** bitmap_bit_in_range_p (const_sbitmap bma
*** 372,378 ****
    SBITMAP_ELT_TYPE mask = ~(SBITMAP_ELT_TYPE)0;
    if (end_bitno + 1 < SBITMAP_ELT_BITS)
      mask = ((SBITMAP_ELT_TYPE)1 << (end_bitno + 1)) - 1;
!   return (bmap->elms[start_word] & mask) != 0;
  }
  
  #if GCC_VERSION < 3400
--- 376,403 ----
    SBITMAP_ELT_TYPE mask = ~(SBITMAP_ELT_TYPE)0;
    if (end_bitno + 1 < SBITMAP_ELT_BITS)
      mask = ((SBITMAP_ELT_TYPE)1 << (end_bitno + 1)) - 1;
!   const SBITMAP_ELT_TYPE expected_partial = any_inverted ? mask : 0;
!   return (bmap->elms[start_word] & mask) != expected_partial;
! }
! 
! /* Return TRUE if all bits between START and END inclusive are set within
!    the simple bitmap BMAP.  Return FALSE otherwise.  */
! 
! bool
! bitmap_all_bits_in_range_p (const_sbitmap bmap, unsigned int start,
! 			    unsigned int end)
! {
!   return !bitmap_bit_in_range_p (bmap, start, end, true);
! }
! 
! /* Return TRUE if any bit between START and END inclusive is set within
!    the simple bitmap BMAP.  Return FALSE otherwise.  */
! 
! bool
! bitmap_any_bit_in_range_p (const_sbitmap bmap, unsigned int start,
! 			   unsigned int end)
! {
!   return bitmap_bit_in_range_p (bmap, start, end, false);
  }
  
  #if GCC_VERSION < 3400
*************** namespace selftest {
*** 863,876 ****
  
  /* Selftests for sbitmaps.  */
  
! /* Checking function that uses both bitmap_bit_in_range_p and
     loop of bitmap_bit_p and verifies consistent results.  */
  
  static bool
! bitmap_bit_in_range_p_checking (sbitmap s, unsigned int start,
  				unsigned end)
  {
!   bool r1 = bitmap_bit_in_range_p (s, start, end);
    bool r2 = false;
  
    for (unsigned int i = start; i <= end; i++)
--- 888,901 ----
  
  /* Selftests for sbitmaps.  */
  
! /* Checking function that uses both bitmap_any_bit_in_range_p and
     loop of bitmap_bit_p and verifies consistent results.  */
  
  static bool
! bitmap_any_bit_in_range_p_checking (sbitmap s, unsigned int start,
  				unsigned end)
  {
!   bool r1 = bitmap_any_bit_in_range_p (s, start, end);
    bool r2 = false;
  
    for (unsigned int i = start; i <= end; i++)
*************** test_set_range ()
*** 893,925 ****
    bitmap_clear (s);
  
    bitmap_set_range (s, 0, 1);
!   ASSERT_TRUE (bitmap_bit_in_range_p_checking (s, 0, 0));
!   ASSERT_FALSE (bitmap_bit_in_range_p_checking (s, 1, 15));
    bitmap_set_range (s, 15, 1);
!   ASSERT_FALSE (bitmap_bit_in_range_p_checking (s, 1, 14));
!   ASSERT_TRUE (bitmap_bit_in_range_p_checking (s, 15, 15));
    sbitmap_free (s);
  
    s = sbitmap_alloc (1024);
    bitmap_clear (s);
    bitmap_set_range (s, 512, 1);
!   ASSERT_FALSE (bitmap_bit_in_range_p_checking (s, 0, 511));
!   ASSERT_FALSE (bitmap_bit_in_range_p_checking (s, 513, 1023));
!   ASSERT_TRUE (bitmap_bit_in_range_p_checking (s, 512, 512));
!   ASSERT_TRUE (bitmap_bit_in_range_p_checking (s, 508, 512));
!   ASSERT_TRUE (bitmap_bit_in_range_p_checking (s, 508, 513));
!   ASSERT_FALSE (bitmap_bit_in_range_p_checking (s, 508, 511));
  
    bitmap_clear (s);
    bitmap_set_range (s, 512, 64);
!   ASSERT_FALSE (bitmap_bit_in_range_p_checking (s, 0, 511));
!   ASSERT_FALSE (bitmap_bit_in_range_p_checking (s, 512 + 64, 1023));
!   ASSERT_TRUE (bitmap_bit_in_range_p_checking (s, 512, 512));
!   ASSERT_TRUE (bitmap_bit_in_range_p_checking (s, 512 + 63, 512 + 63));
    sbitmap_free (s);
  }
  
! /* Verify bitmap_bit_in_range_p functions for sbitmap.  */
  
  static void
  test_bit_in_range ()
--- 918,950 ----
    bitmap_clear (s);
  
    bitmap_set_range (s, 0, 1);
!   ASSERT_TRUE (bitmap_any_bit_in_range_p_checking (s, 0, 0));
!   ASSERT_FALSE (bitmap_any_bit_in_range_p_checking (s, 1, 15));
    bitmap_set_range (s, 15, 1);
!   ASSERT_FALSE (bitmap_any_bit_in_range_p_checking (s, 1, 14));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p_checking (s, 15, 15));
    sbitmap_free (s);
  
    s = sbitmap_alloc (1024);
    bitmap_clear (s);
    bitmap_set_range (s, 512, 1);
!   ASSERT_FALSE (bitmap_any_bit_in_range_p_checking (s, 0, 511));
!   ASSERT_FALSE (bitmap_any_bit_in_range_p_checking (s, 513, 1023));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p_checking (s, 512, 512));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p_checking (s, 508, 512));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p_checking (s, 508, 513));
!   ASSERT_FALSE (bitmap_any_bit_in_range_p_checking (s, 508, 511));
  
    bitmap_clear (s);
    bitmap_set_range (s, 512, 64);
!   ASSERT_FALSE (bitmap_any_bit_in_range_p_checking (s, 0, 511));
!   ASSERT_FALSE (bitmap_any_bit_in_range_p_checking (s, 512 + 64, 1023));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p_checking (s, 512, 512));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p_checking (s, 512 + 63, 512 + 63));
    sbitmap_free (s);
  }
  
! /* Verify bitmap_any_bit_in_range_p functions for sbitmap.  */
  
  static void
  test_bit_in_range ()
*************** test_bit_in_range ()
*** 927,941 ****
    sbitmap s = sbitmap_alloc (1024);
    bitmap_clear (s);
  
!   ASSERT_FALSE (bitmap_bit_in_range_p (s, 512, 1023));
    bitmap_set_bit (s, 100);
  
!   ASSERT_FALSE (bitmap_bit_in_range_p (s, 512, 1023));
!   ASSERT_FALSE (bitmap_bit_in_range_p (s, 0, 99));
!   ASSERT_FALSE (bitmap_bit_in_range_p (s, 101, 1023));
!   ASSERT_TRUE (bitmap_bit_in_range_p (s, 1, 100));
!   ASSERT_TRUE (bitmap_bit_in_range_p (s, 64, 100));
!   ASSERT_TRUE (bitmap_bit_in_range_p (s, 100, 100));
    ASSERT_TRUE (bitmap_bit_p (s, 100));
  
    sbitmap_free (s);
--- 952,966 ----
    sbitmap s = sbitmap_alloc (1024);
    bitmap_clear (s);
  
!   ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 512, 1023));
    bitmap_set_bit (s, 100);
  
!   ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 512, 1023));
!   ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 0, 99));
!   ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 101, 1023));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 1, 100));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 64, 100));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 100, 100));
    ASSERT_TRUE (bitmap_bit_p (s, 100));
  
    sbitmap_free (s);
*************** test_bit_in_range ()
*** 943,996 ****
    s = sbitmap_alloc (64);
    bitmap_clear (s);
    bitmap_set_bit (s, 63);
!   ASSERT_TRUE (bitmap_bit_in_range_p (s, 0, 63));
!   ASSERT_TRUE (bitmap_bit_in_range_p (s, 1, 63));
!   ASSERT_TRUE (bitmap_bit_in_range_p (s, 63, 63));
    ASSERT_TRUE (bitmap_bit_p (s, 63));
    sbitmap_free (s);
  
    s = sbitmap_alloc (1024);
    bitmap_clear (s);
    bitmap_set_bit (s, 128);
!   ASSERT_FALSE (bitmap_bit_in_range_p (s, 0, 127));
!   ASSERT_FALSE (bitmap_bit_in_range_p (s, 129, 1023));
  
!   ASSERT_TRUE (bitmap_bit_in_range_p (s, 0, 128));
!   ASSERT_TRUE (bitmap_bit_in_range_p (s, 1, 128));
!   ASSERT_TRUE (bitmap_bit_in_range_p (s, 128, 255));
!   ASSERT_TRUE (bitmap_bit_in_range_p (s, 128, 254));
    ASSERT_TRUE (bitmap_bit_p (s, 128));
  
    bitmap_clear (s);
    bitmap_set_bit (s, 8);
!   ASSERT_TRUE (bitmap_bit_in_range_p (s, 0, 8));
!   ASSERT_TRUE (bitmap_bit_in_range_p (s, 0, 12));
!   ASSERT_TRUE (bitmap_bit_in_range_p (s, 0, 63));
!   ASSERT_TRUE (bitmap_bit_in_range_p (s, 0, 127));
!   ASSERT_TRUE (bitmap_bit_in_range_p (s, 0, 512));
!   ASSERT_TRUE (bitmap_bit_in_range_p (s, 8, 8));
    ASSERT_TRUE (bitmap_bit_p (s, 8));
  
    bitmap_clear (s);
!   ASSERT_FALSE (bitmap_bit_in_range_p (s, 0, 0));
!   ASSERT_FALSE (bitmap_bit_in_range_p (s, 0, 8));
!   ASSERT_FALSE (bitmap_bit_in_range_p (s, 0, 63));
!   ASSERT_FALSE (bitmap_bit_in_range_p (s, 1, 63));
!   ASSERT_FALSE (bitmap_bit_in_range_p (s, 0, 256));
  
    bitmap_set_bit (s, 0);
    bitmap_set_bit (s, 16);
    bitmap_set_bit (s, 32);
    bitmap_set_bit (s, 48);
    bitmap_set_bit (s, 64);
!   ASSERT_TRUE (bitmap_bit_in_range_p (s, 0, 0));
!   ASSERT_TRUE (bitmap_bit_in_range_p (s, 1, 16));
!   ASSERT_TRUE (bitmap_bit_in_range_p (s, 48, 63));
!   ASSERT_TRUE (bitmap_bit_in_range_p (s, 64, 64));
!   ASSERT_FALSE (bitmap_bit_in_range_p (s, 1, 15));
!   ASSERT_FALSE (bitmap_bit_in_range_p (s, 17, 31));
!   ASSERT_FALSE (bitmap_bit_in_range_p (s, 49, 63));
!   ASSERT_FALSE (bitmap_bit_in_range_p (s, 65, 1023));
    sbitmap_free (s);
  }
  
--- 968,1021 ----
    s = sbitmap_alloc (64);
    bitmap_clear (s);
    bitmap_set_bit (s, 63);
!   ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 0, 63));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 1, 63));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 63, 63));
    ASSERT_TRUE (bitmap_bit_p (s, 63));
    sbitmap_free (s);
  
    s = sbitmap_alloc (1024);
    bitmap_clear (s);
    bitmap_set_bit (s, 128);
!   ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 0, 127));
!   ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 129, 1023));
  
!   ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 0, 128));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 1, 128));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 128, 255));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 128, 254));
    ASSERT_TRUE (bitmap_bit_p (s, 128));
  
    bitmap_clear (s);
    bitmap_set_bit (s, 8);
!   ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 0, 8));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 0, 12));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 0, 63));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 0, 127));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 0, 512));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 8, 8));
    ASSERT_TRUE (bitmap_bit_p (s, 8));
  
    bitmap_clear (s);
!   ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 0, 0));
!   ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 0, 8));
!   ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 0, 63));
!   ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 1, 63));
!   ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 0, 256));
  
    bitmap_set_bit (s, 0);
    bitmap_set_bit (s, 16);
    bitmap_set_bit (s, 32);
    bitmap_set_bit (s, 48);
    bitmap_set_bit (s, 64);
!   ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 0, 0));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 1, 16));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 48, 63));
!   ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 64, 64));
!   ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 1, 15));
!   ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 17, 31));
!   ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 49, 63));
!   ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 65, 1023));
    sbitmap_free (s);
  }
  
diff -Nrcpad gcc-16-20250525/gcc/sbitmap.h gcc-16-20250601/gcc/sbitmap.h
*** gcc-16-20250525/gcc/sbitmap.h	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/sbitmap.h	Sun Jun  1 22:32:15 2025
*************** along with GCC; see the file COPYING3.
*** 51,57 ****
       * set_difference		: bitmap_and_compl
       * set_disjuction		: (not implemented)
       * set_compare		: bitmap_equal_p
!      * bit_in_range_p		: bitmap_bit_in_range_p
  
     Some operations on 3 sets that occur frequently in data flow problems
     are also implemented:
--- 51,57 ----
       * set_difference		: bitmap_and_compl
       * set_disjuction		: (not implemented)
       * set_compare		: bitmap_equal_p
!      * any_bit_in_range_p	: bitmap_any_bit_in_range_p
  
     Some operations on 3 sets that occur frequently in data flow problems
     are also implemented:
*************** extern bool bitmap_and (sbitmap, const_s
*** 287,293 ****
  extern bool bitmap_ior (sbitmap, const_sbitmap, const_sbitmap);
  extern bool bitmap_xor (sbitmap, const_sbitmap, const_sbitmap);
  extern bool bitmap_subset_p (const_sbitmap, const_sbitmap);
! extern bool bitmap_bit_in_range_p (const_sbitmap, unsigned int, unsigned int);
  
  extern int bitmap_first_set_bit (const_sbitmap);
  extern int bitmap_last_set_bit (const_sbitmap);
--- 287,296 ----
  extern bool bitmap_ior (sbitmap, const_sbitmap, const_sbitmap);
  extern bool bitmap_xor (sbitmap, const_sbitmap, const_sbitmap);
  extern bool bitmap_subset_p (const_sbitmap, const_sbitmap);
! extern bool bitmap_any_bit_in_range_p (const_sbitmap, unsigned int,
! 				       unsigned int);
! extern bool bitmap_all_bits_in_range_p (const_sbitmap, unsigned int,
! 					unsigned int);
  
  extern int bitmap_first_set_bit (const_sbitmap);
  extern int bitmap_last_set_bit (const_sbitmap);
diff -Nrcpad gcc-16-20250525/gcc/selftest-diagnostic.cc gcc-16-20250601/gcc/selftest-diagnostic.cc
*** gcc-16-20250525/gcc/selftest-diagnostic.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/selftest-diagnostic.cc	Sun Jun  1 22:32:15 2025
*************** test_diagnostic_context::~test_diagnosti
*** 58,68 ****
  void
  test_diagnostic_context::
  start_span_cb (const diagnostic_location_print_policy &loc_policy,
! 	       pretty_printer *pp,
  	       expanded_location exploc)
  {
    exploc.file = "FILENAME";
!   default_diagnostic_start_span_fn (loc_policy, pp, exploc);
  }
  
  bool
--- 58,68 ----
  void
  test_diagnostic_context::
  start_span_cb (const diagnostic_location_print_policy &loc_policy,
! 	       to_text &sink,
  	       expanded_location exploc)
  {
    exploc.file = "FILENAME";
!   default_diagnostic_start_span_fn<to_text> (loc_policy, sink, exploc);
  }
  
  bool
diff -Nrcpad gcc-16-20250525/gcc/selftest-diagnostic.h gcc-16-20250601/gcc/selftest-diagnostic.h
*** gcc-16-20250525/gcc/selftest-diagnostic.h	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/selftest-diagnostic.h	Sun Jun  1 22:32:15 2025
*************** class test_diagnostic_context : public d
*** 40,46 ****
       real filename (to avoid printing the names of tempfiles).  */
    static void
    start_span_cb (const diagnostic_location_print_policy &,
! 		 pretty_printer *,
  		 expanded_location exploc);
  
    /* Report a diagnostic to this context.  For a selftest, this
--- 40,46 ----
       real filename (to avoid printing the names of tempfiles).  */
    static void
    start_span_cb (const diagnostic_location_print_policy &,
! 		 to_text &sink,
  		 expanded_location exploc);
  
    /* Report a diagnostic to this context.  For a selftest, this
diff -Nrcpad gcc-16-20250525/gcc/selftest-run-tests.cc gcc-16-20250601/gcc/selftest-run-tests.cc
*** gcc-16-20250525/gcc/selftest-run-tests.cc	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/selftest-run-tests.cc	Sun Jun  1 22:32:15 2025
*************** selftest::run_tests ()
*** 106,112 ****
    spellcheck_cc_tests ();
    spellcheck_tree_cc_tests ();
    tree_cfg_cc_tests ();
!   diagnostic_path_cc_tests ();
    simple_diagnostic_path_cc_tests ();
    lazy_diagnostic_path_cc_tests ();
    attribs_cc_tests ();
--- 106,112 ----
    spellcheck_cc_tests ();
    spellcheck_tree_cc_tests ();
    tree_cfg_cc_tests ();
!   diagnostic_path_output_cc_tests ();
    simple_diagnostic_path_cc_tests ();
    lazy_diagnostic_path_cc_tests ();
    attribs_cc_tests ();
diff -Nrcpad gcc-16-20250525/gcc/selftest.h gcc-16-20250601/gcc/selftest.h
*** gcc-16-20250525/gcc/selftest.h	Sun May 25 22:32:06 2025
--- gcc-16-20250601/gcc/selftest.h	Sun Jun  1 22:32:15 2025
*************** extern void diagnostic_color_cc_tests ()
*** 224,230 ****
  extern void diagnostic_format_html_cc_tests ();
  extern void diagnostic_format_json_cc_tests ();
  extern void diagnostic_format_sarif_cc_tests ();
! extern void diagnostic_path_cc_tests ();
  extern void diagnostic_show_locus_cc_tests ();
  extern void digraph_cc_tests ();
  extern void dumpfile_cc_tests ();
--- 224,230 ----
  extern void diagnostic_format_html_cc_tests ();
  extern void diagnostic_format_json_cc_tests ();
  extern void diagnostic_format_sarif_cc_tests ();
! extern void diagnostic_path_output_cc_tests ();
  extern void diagnostic_show_locus_cc_tests ();
  extern void digraph_cc_tests ();
  extern void dumpfile_cc_tests ();
diff -Nrcpad gcc-16-20250525/gcc/testsuite/ChangeLog gcc-16-20250601/gcc/testsuite/ChangeLog
*** gcc-16-20250525/gcc/testsuite/ChangeLog	Sun May 25 22:32:07 2025
--- gcc-16-20250601/gcc/testsuite/ChangeLog	Sun Jun  1 22:32:15 2025
***************
*** 1,3 ****
--- 1,552 ----
+ 2025-06-01  Gaius Mulley  <gaiusmod2@gmail.com>
+ 
+ 	PR modula2/120497
+ 	* gm2/pim/pass/ReturnType.mod: New test.
+ 	* gm2/pim/pass/ReturnType2.mod: New test.
+ 
+ 2025-05-31  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/120357
+ 	* gcc.dg/vect/vect-early-break_136-pr120357.c: New testcase.
+ 
+ 2025-05-31  Gaius Mulley  <gaiusmod2@gmail.com>
+ 
+ 	PR modula2/120389
+ 	* gm2/pim/fail/testcharint.mod: New test.
+ 	* gm2/pim/fail/testindrx.mod: New test.
+ 	* gm2/pim/pass/testxindr.mod: New test.
+ 	* gm2/pim/pass/testxindr2.mod: New test.
+ 	* gm2/pim/pass/testxindr3.mod: New test.
+ 
+ 2025-05-30  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR other/116792
+ 	* gcc.dg/format/diagnostic-ranges-html.py: New test script.
+ 	* gcc.dg/format/diagnostic-ranges.c: Add HTML generation to
+ 	options, and invoke the new script to check the HTML output.
+ 
+ 2025-05-30  Jason Merrill  <jason@redhat.com>
+ 
+ 	PR c++/120123
+ 	* g++.dg/cpp23/explicit-obj-lambda18.C: New test.
+ 
+ 2025-05-30  Harald Anlauf  <anlauf@gmx.de>
+ 
+ 	PR fortran/102599
+ 	PR fortran/114022
+ 	* gfortran.dg/inquiry_type_ref_8.f90: New test.
+ 
+ 2025-05-30  Jason Merrill  <jason@redhat.com>
+ 
+ 	PR c++/113563
+ 	* g++.dg/cpp23/explicit-obj-lambda17.C: New test.
+ 
+ 2025-05-30  Qing Zhao  <qing.zhao@oracle.com>
+ 
+ 	PR c/120354
+ 	* gcc.dg/pr120354.c: New test.
+ 
+ 2025-05-30  Qing Zhao  <qing.zhao@oracle.com>
+ 
+ 	PR c/120353
+ 	* gcc.dg/pr120353.c: New test.
+ 
+ 2025-05-30  Pan Li  <pan2.li@intel.com>
+ 
+ 	* gcc.target/riscv/rvv/autovec/avg.h: Add test helper macros.
+ 	* gcc.target/riscv/rvv/autovec/avg_data.h: Add test data for
+ 	avg_ceil.
+ 	* gcc.target/riscv/rvv/autovec/avg_ceil-1-i16-from-i32.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_ceil-1-i16-from-i64.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_ceil-1-i32-from-i64.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_ceil-1-i8-from-i16.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_ceil-1-i8-from-i32.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_ceil-1-i8-from-i64.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i16-from-i32.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i16-from-i64.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i32-from-i64.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i8-from-i16.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i8-from-i32.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i8-from-i64.c: New test.
+ 
+ 2025-05-30  Pan Li  <pan2.li@intel.com>
+ 
+ 	* gcc.target/riscv/rvv/autovec/vls/avg-4.c: Update asm check
+ 	to vaadd.
+ 	* gcc.target/riscv/rvv/autovec/vls/avg-5.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vls/avg-6.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/widen/vec-avg-rv32gcv.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/widen/vec-avg-rv64gcv.c: Ditto.
+ 
+ 2025-05-30  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/120341
+ 	* gcc.dg/torture/pr120341-1.c: New testcase.
+ 	* gcc.dg/torture/pr120341-2.c: Likewise.
+ 
+ 2025-05-30  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR target/120480
+ 	* gcc.dg/pr120480.c: New test.
+ 
+ 2025-05-30  Julian Brown  <julian@codesourcery.com>
+ 
+ 	* c-c++-common/gomp/declare-mapper-3.c: Enable for C.
+ 	* c-c++-common/gomp/declare-mapper-4.c: Likewise.
+ 	* c-c++-common/gomp/declare-mapper-5.c: Likewise.
+ 	* c-c++-common/gomp/declare-mapper-6.c: Likewise.
+ 	* c-c++-common/gomp/declare-mapper-7.c: Likewise.
+ 	* c-c++-common/gomp/declare-mapper-8.c: Likewise.
+ 	* c-c++-common/gomp/declare-mapper-9.c: Likewise.
+ 	* c-c++-common/gomp/declare-mapper-10.c: Likewise.
+ 	* c-c++-common/gomp/declare-mapper-12.c: Likewise.
+ 	* c-c++-common/gomp/map-6.c: Update dg-error.
+ 	* gcc.dg/gomp/udr-3.c: Update for change to dg-note.
+ 	* c-c++-common/gomp/declare-mapper-11.c: New.
+ 	* gcc.dg/gomp/declare-mapper-10.c: New test.
+ 	* gcc.dg/gomp/declare-mapper-11.c: New test.
+ 	* gcc.dg/gomp/declare-mapper-13.c: New test.
+ 
+ 2025-05-30  Thomas Koenig  <tkoenig@gcc.gnu.org>
+ 
+ 	PR fortran/120355
+ 	* gfortran.dg/interface_62.f90: New test.
+ 
+ 2025-05-30  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* g++.dg/diagnostic/bad-binary-ops-highlight-colors.C: Update
+ 	expected multiline output for quoted source and underlines to
+ 	reflect emitting color codes when changes happen, rather than
+ 	per character.
+ 	* g++.dg/diagnostic/long-short-colorization.C: Likewise.
+ 	* g++.dg/plugin/show-template-tree-color-labels.C: Likewise.
+ 	* gcc.dg/bad-binary-ops-highlight-colors.c: Likewise.
+ 	* gcc.dg/format/colors.c: Likewise.
+ 
+ 2025-05-30  Richard Sandiford  <richard.sandiford@arm.com>
+ 
+ 	PR rtl-optimization/120347
+ 	* gcc.dg/torture/pr120347.c: New test.
+ 
+ 2025-05-30  Julian Brown  <julian@codesourcery.com>
+ 	    Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* c-c++-common/gomp/map-6.c: Update error scan output.
+ 	* c-c++-common/gomp/declare-mapper-3.c: New test (only enabled for C++
+ 	for now).
+ 	* c-c++-common/gomp/declare-mapper-4.c: Likewise.
+ 	* c-c++-common/gomp/declare-mapper-5.c: Likewise.
+ 	* c-c++-common/gomp/declare-mapper-6.c: Likewise.
+ 	* c-c++-common/gomp/declare-mapper-7.c: Likewise.
+ 	* c-c++-common/gomp/declare-mapper-8.c: Likewise.
+ 	* c-c++-common/gomp/declare-mapper-9.c: Likewise.
+ 	* c-c++-common/gomp/declare-mapper-10.c: Likewise.
+ 	* c-c++-common/gomp/declare-mapper-12.c: Likewise.
+ 	* g++.dg/gomp/declare-mapper-1.C: New test.
+ 	* g++.dg/gomp/declare-mapper-2.C: New test.
+ 	* g++.dg/gomp/declare-mapper-3.C: New test.
+ 
+ 2025-05-30  Martin Uecker  <uecker@tugraz.at>
+ 
+ 	PR c/120381
+ 	* gcc.dg/pr120381.c: New test.
+ 	* gcc.dg/gnu23-tag-composite-6.c: New test.
+ 
+ 2025-05-29  Kugan Vivekanandarajah  <kvivekananda@nvidia.com>
+ 
+ 	* lib/target-supports.exp: Enable autofdo tests for aarch64.
+ 
+ 2025-05-29  Jason Merrill  <jason@redhat.com>
+ 
+ 	PR c++/113563
+ 	* g++.dg/cpp23/explicit-obj-lambda16.C: New test.
+ 
+ 2025-05-29  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	PR c++/109283
+ 	* g++.dg/coroutines/pr109283.C: New test.
+ 
+ 2025-05-29  Jason Merrill  <jason@redhat.com>
+ 
+ 	* g++.dg/cpp1z/constexpr-lambda29.C: New test.
+ 
+ 2025-05-29  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+ 
+ 	PR fortran/120049
+ 	* gfortran.dg/c_f_pointer_tests_6.f90: Adjust dg-error
+ 	directive.
+ 
+ 2025-05-29  Alice Carlotti  <alice.carlotti@arm.com>
+ 	    Alfie Richards  <alfie.richards@arm.com>
+ 
+ 	* g++.target/i386/mv-symbols1.C: New test.
+ 	* g++.target/i386/mv-symbols2.C: New test.
+ 	* g++.target/i386/mv-symbols3.C: New test.
+ 	* g++.target/i386/mv-symbols4.C: New test.
+ 	* g++.target/i386/mv-symbols5.C: New test.
+ 	* g++.target/i386/mvc-symbols1.C: New test.
+ 	* g++.target/i386/mvc-symbols2.C: New test.
+ 	* g++.target/i386/mvc-symbols3.C: New test.
+ 	* g++.target/i386/mvc-symbols4.C: New test.
+ 
+ 2025-05-29  Alice Carlotti  <alice.carlotti@arm.com>
+ 	    Alfie Richards  <alfie.richards@arm.com>
+ 
+ 	* g++.target/powerpc/mvc-symbols1.C: New test.
+ 	* g++.target/powerpc/mvc-symbols2.C: New test.
+ 	* g++.target/powerpc/mvc-symbols3.C: New test.
+ 	* g++.target/powerpc/mvc-symbols4.C: New test.
+ 
+ 2025-05-29  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* c-c++-common/gomp/declare-variant-2.c: Adjust patterns now that
+ 	C and C++ now behave similarly.
+ 	* c-c++-common/gomp/metadirective-error-recovery.c: New.
+ 
+ 2025-05-29  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR c/120180
+ 	* c-c++-common/gomp/pr120180.c: New.
+ 
+ 2025-05-29  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	PR c++/120453
+ 	* g++.dg/coroutines/pr120453.C: New test.
+ 
+ 2025-05-29  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	PR ipa/120295
+ 	* gcc.dg/ipa/pr120295.c: New test.
+ 
+ 2025-05-29  Pranav Gorantla  <Pranav.Gorantla@amd.com>
+ 
+ 	* gcc.target/i386/reduc-pshuf.c: New test.
+ 
+ 2025-05-29  Jerry Zhang Jian  <jerry.zhangjian@sifive.com>
+ 
+ 	* gcc.target/riscv/arch-57.c: New test
+ 	* gcc.target/riscv/arch-58.c: New test
+ 
+ 2025-05-29  Pan Li  <pan2.li@intel.com>
+ 
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i16.c: Add asm
+ 	check for vmul.vx combine.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i16.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i16.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i8.c: Ditto.
+ 
+ 2025-05-29  Pan Li  <pan2.li@intel.com>
+ 
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i16.c: Add asm check
+ 	for vmul.vx combine.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i16.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i16.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h: Add test
+ 	data for vmul run test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i16.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i32.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i64.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i8.c: New test.
+ 
+ 2025-05-29  Jason Merrill  <jason@redhat.com>
+ 
+ 	PR c++/107600
+ 	* g++.dg/ext/is_destructible1.C: New test.
+ 
+ 2025-05-28  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+ 
+ 	PR fortran/119586
+ 	* gfortran.dg/comma_format_extension_1.f: Update dg-options to
+ 	"-std=legacy".
+ 	* gfortran.dg/comma_format_extension_3.f: Likewise.
+ 	* gfortran.dg/continuation_13.f90: Likewise.
+ 
+ 2025-05-28  Yuao Ma  <c8ef@outlook.com>
+ 	    Steven G. Kargl  <kargl@gcc.gnu.org>
+ 
+ 	PR fortran/113152
+ 	* gfortran.dg/dec_math_3.f90: Test invalid input.
+ 	* gfortran.dg/dec_math_5.f90: Test valid output.
+ 	* gfortran.dg/dec_math_6.f90: New test.
+ 
+ 2025-05-28  Robin Dapp  <rdapp@ventanamicro.com>
+ 
+ 	PR target/120436
+ 	* gcc.target/riscv/rvv/base/pr120436.c: New test.
+ 
+ 2025-05-28  Jason Merrill  <jason@redhat.com>
+ 
+ 	* g++.dg/modules/namespace-8_a.C: New test.
+ 	* g++.dg/modules/namespace-8_b.C: New test.
+ 	* g++.dg/modules/namespace-9_a.C: New test.
+ 	* g++.dg/modules/namespace-9_b.C: New test.
+ 	* g++.dg/modules/namespace-10_a.C: New test.
+ 	* g++.dg/modules/namespace-10_b.C: New test.
+ 	* g++.dg/modules/namespace-10_c.C: New test.
+ 	* g++.dg/modules/namespace-11_a.C: New test.
+ 	* g++.dg/modules/namespace-11_b.C: New test.
+ 	* g++.dg/modules/namespace-11_c.C: New test.
+ 
+ 2025-05-28  Pan Li  <pan2.li@intel.com>
+ 
+ 	* gcc.target/riscv/rvv/autovec/avg.h: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_data.h: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_floor-1-i16-from-i32.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_floor-1-i16-from-i64.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_floor-1-i32-from-i64.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i16.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i32.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i64.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_floor-run-1-i16-from-i32.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_floor-run-1-i16-from-i64.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_floor-run-1-i32-from-i64.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i16.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i32.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i64.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/avg_run.h: New test.
+ 
+ 2025-05-28  Pan Li  <pan2.li@intel.com>
+ 
+ 	* gcc.target/riscv/rvv/autovec/vls/avg-1.c: Update asm check
+ 	to vaadd.
+ 	* gcc.target/riscv/rvv/autovec/vls/avg-2.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vls/avg-3.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/widen/vec-avg-rv32gcv.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/widen/vec-avg-rv64gcv.c: Ditto.
+ 
+ 2025-05-28  liuhongt  <hongtao.liu@intel.com>
+ 
+ 	* gcc.dg/vect/bb-slp-pr119181.c: New test.
+ 
+ 2025-05-27  Alejandro Colomar  <alx@kernel.org>
+ 
+ 	PR c/117025
+ 	* gcc.dg/countof-compat.c: New test.
+ 	* gcc.dg/countof-no-compat.c: New test.
+ 	* gcc.dg/countof-pedantic.c: New test.
+ 	* gcc.dg/countof-pedantic-errors.c: New test.
+ 
+ 2025-05-27  Alejandro Colomar  <alx@kernel.org>
+ 
+ 	PR c/117025
+ 	* gcc.dg/countof-stdcountof.c: New test.
+ 
+ 2025-05-27  Alejandro Colomar  <alx@kernel.org>
+ 	    Martin Uecker  <uecker@tugraz.at>
+ 
+ 	PR c/117025
+ 	* gcc.dg/countof-compile.c: New test.
+ 	* gcc.dg/countof-vla.c: New test.
+ 	* gcc.dg/countof-vmt.c: New test.
+ 	* gcc.dg/countof-zero-compile.c: New test.
+ 	* gcc.dg/countof-zero.c: New test.
+ 	* gcc.dg/countof.c: New test.
+ 
+ 2025-05-27  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+ 
+ 	PR fortran/120049
+ 	* gfortran.dg/pr120049_a.f90: Update test directives.
+ 	* gfortran.dg/pr120049_b.f90: Update test directives
+ 	* gfortran.dg/pr120049_2.f90: New test.
+ 	Co-Authored-By: Steve Kargl <kargl@gcc.gnu.org>
+ 
+ 2025-05-27  Harald Anlauf  <anlauf@gmx.de>
+ 
+ 	PR fortran/101735
+ 	* gfortran.dg/inquiry_type_ref_7.f90: New test.
+ 
+ 2025-05-27  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	* gnat.dg/sso19.adb: New test.
+ 	* gnat.dg/sso19_pkg.ads, gnat.dg/sso19_pkg.adb: New helper.
+ 
+ 2025-05-27  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR other/116792
+ 	* gcc.dg/html-output/missing-semicolon.c: Add ":javascript=no" to
+ 	html output.
+ 	* gcc.dg/html-output/missing-semicolon.py: Move repeated
+ 	definitions into lib/htmltest.py.
+ 	* gcc.dg/plugin/diagnostic_group_plugin.cc: Update for template
+ 	changes.
+ 	* gcc.dg/plugin/diagnostic-test-metadata-html.c: Add
+ 	":javascript=no" to html output.  Add
+ 	"-fdiagnostics-show-line-numbers".
+ 	* gcc.dg/plugin/diagnostic-test-metadata-html.py: Move repeated
+ 	definitions into lib/htmltest.py.  Add checks of annotated source.
+ 	* gcc.dg/plugin/diagnostic-test-paths-2.c: Add ":javascript=no" to
+ 	html output.
+ 	* gcc.dg/plugin/diagnostic-test-paths-2.py: Move repeated
+ 	definitions into lib/htmltest.py.  Add checks of execution path.
+ 	* gcc.dg/plugin/diagnostic-test-paths-4.c: Add
+ 	-fdiagnostics-add-output=experimental-html:javascript=no.  Add
+ 	invocation ot diagnostic-test-paths-4.py.
+ 	* gcc.dg/plugin/diagnostic-test-paths-4.py: New test script.
+ 	* gcc.dg/plugin/diagnostic-test-show-locus-bw-line-numbers.c: Add
+ 	-fdiagnostics-add-output=experimental-html:javascript=no.  Add
+ 	invocation of diagnostic-test-show-locus.py.
+ 	* gcc.dg/plugin/diagnostic-test-show-locus.py: New test script.
+ 	* lib/htmltest.py: New test support script.
+ 
+ 2025-05-27  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/117965
+ 	* g++.dg/tree-ssa/pr117965-1.C: New testcase.
+ 	* g++.dg/tree-ssa/pr117965-2.C: Likewise.
+ 
+ 2025-05-27  Konstantinos Eleftheriou  <konstantinos.eleftheriou@vrull.eu>
+ 
+ 	PR rtl-optimization/119884
+ 	* gcc.target/i386/pr119884.c: New test.
+ 
+ 2025-05-27  Pan Li  <pan2.li@intel.com>
+ 
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i16.c: Add asm check
+ 	for vxor.vx combine.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i16.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i16.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c: Ditto.
+ 
+ 2025-05-27  Pan Li  <pan2.li@intel.com>
+ 
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i16.c: Add asm check
+ 	for vxor.vx combine.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i16.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i16.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h: Add test
+ 	data for vxor run test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i16.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i32.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i64.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i8.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u16.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u32.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u64.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u8.c: New test.
+ 
+ 2025-05-27  Juergen Christ  <jchrist@linux.ibm.com>
+ 
+ 	* gcc.target/s390/vector/vec-extract-1.c: New test.
+ 	* gcc.target/s390/vector/vec-set-1.c: New test.
+ 
+ 2025-05-27  xuli  <xuli1@eswincomputing.com>
+ 
+ 	* gcc.target/riscv/rvv/autovec/sat/vec_sat_arith.h: add signed vec SAT_ADD IMM form1.
+ 	* gcc.target/riscv/rvv/autovec/sat/vec_sat_data.h: add sat_s_add_imm data.
+ 	* gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i16.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i32.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i64.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i8.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i16.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i32.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i64.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i8.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i16.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i32.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i8.c: New test.
+ 
+ 2025-05-27  xuli  <xuli1@eswincomputing.com>
+ 
+ 	* gcc.target/riscv/sat/sat_s_add_imm-2.c: Move to...
+ 	* gcc.target/riscv/sat/sat_s_add_imm-1-i16.c: ...here.
+ 	* gcc.target/riscv/sat/sat_s_add_imm-3.c: Move to...
+ 	* gcc.target/riscv/sat/sat_s_add_imm-1-i32.c: ...here.
+ 	* gcc.target/riscv/sat/sat_s_add_imm-4.c: Move to...
+ 	* gcc.target/riscv/sat/sat_s_add_imm-1-i64.c: ...here.
+ 	* gcc.target/riscv/sat/sat_s_add_imm-1.c: Move to...
+ 	* gcc.target/riscv/sat/sat_s_add_imm-1-i8.c: ...here.
+ 	* gcc.target/riscv/sat/sat_s_add_imm-run-2.c: Move to...
+ 	* gcc.target/riscv/sat/sat_s_add_imm-run-1-i16.c: ...here.
+ 	* gcc.target/riscv/sat/sat_s_add_imm-run-3.c: Move to...
+ 	* gcc.target/riscv/sat/sat_s_add_imm-run-1-i32.c: ...here.
+ 	* gcc.target/riscv/sat/sat_s_add_imm-run-4.c: Move to...
+ 	* gcc.target/riscv/sat/sat_s_add_imm-run-1-i64.c: ...here.
+ 	* gcc.target/riscv/sat/sat_s_add_imm-run-1.c: Move to...
+ 	* gcc.target/riscv/sat/sat_s_add_imm-run-1-i8.c: ...here.
+ 	* gcc.target/riscv/sat/sat_s_add_imm-2-1.c: Move to...
+ 	* gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i16.c: ...here.
+ 	* gcc.target/riscv/sat/sat_s_add_imm-3-1.c: Move to...
+ 	* gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i32.c: ...here.
+ 	* gcc.target/riscv/sat/sat_s_add_imm-1-1.c: Move to...
+ 	* gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i8.c: ...here.
+ 
+ 2025-05-26  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	PR middle-end/118694
+ 	* c-c++-common/gomp/attrs-metadirective-3.c: Change to never
+ 	expect 'omp metadirective' in the dump. If !offload_nvptx, check
+ 	that no 'teams' shows up in the dump; for offload_nvptx, expect
+ 	OMP_NEXT_VARIANT and an error about directive between 'target'
+ 	and 'teams'.
+ 	* c-c++-common/gomp/metadirective-3.c: Likewise.
+ 
+ 2025-05-26  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	PR c++/120413
+ 	* g++.dg/gomp/target-4.C: New test.
+ 
+ 2025-05-26  Richard Biener  <rguenther@suse.de>
+ 
+ 	* gcc.target/i386/vect-epilogues-5.c: Adjust.
+ 
  2025-05-24  Eric Botcazou  <ebotcazou@adacore.com>
  
  	* ada/acats-4/elabd.lst: New file.
diff -Nrcpad gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/attrs-metadirective-3.c gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/attrs-metadirective-3.c
*** gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/attrs-metadirective-3.c	Sun May 25 22:32:07 2025
--- gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/attrs-metadirective-3.c	Sun Jun  1 22:32:17 2025
*************** f (int x[], int y[], int z[])
*** 9,15 ****
  {
    int i;
  
!   [[omp::sequence (directive (target map(to: x, y) map(from: z)),
  		   directive (metadirective
  			      when (device={arch("nvptx")}: teams loop)
  			      default (parallel loop)))]]
--- 9,15 ----
  {
    int i;
  
!   [[omp::sequence (directive (target map(to: x, y) map(from: z)),  /* { dg-bogus "'target' construct with nested 'teams' construct contains directives outside of the 'teams' construct" "PR118694" { xfail offload_nvptx } }  */ 
  		   directive (metadirective
  			      when (device={arch("nvptx")}: teams loop)
  			      default (parallel loop)))]]
*************** f (int x[], int y[], int z[])
*** 20,24 ****
  /* If offload device "nvptx" isn't supported, the front end can eliminate
     that alternative and not produce a metadirective at all.  Otherwise this
     won't be resolved until late.  */
! /* { dg-final { scan-tree-dump-not "#pragma omp metadirective" "gimple" { target { ! offload_nvptx } } } } */
! /* { dg-final { scan-tree-dump "#pragma omp metadirective" "gimple" { target { offload_nvptx } } } } */
--- 20,25 ----
  /* If offload device "nvptx" isn't supported, the front end can eliminate
     that alternative and not produce a metadirective at all.  Otherwise this
     won't be resolved until late.  */
! /* { dg-final { scan-tree-dump-not "#pragma omp metadirective" "gimple" } } */
! /* { dg-final { scan-tree-dump-not " teams" "gimple" { target { ! offload_nvptx } } } } */
! /* { dg-final { scan-tree-dump "variant.\[0-9\]+ = \\\[omp_next_variant\\\] OMP_NEXT_VARIANT <0,\[\r\n \]+construct context = 14\[\r\n \]+1: device = \\{arch \\(.nvptx.\\)\\}\[\r\n \]+2: >;" "gimple" { target { offload_nvptx } } } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-mapper-10.c gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-mapper-10.c
*** gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-mapper-10.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-mapper-10.c	Sun Jun  1 22:32:17 2025
***************
*** 0 ****
--- 1,30 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "-fdump-tree-gimple" } */
+ 
+ struct S {
+   int x,y;
+ };
+ 
+ #pragma omp declare mapper(default : struct S var) map(mapper(default), tofrom: var)
+ #pragma omp declare mapper(only_x : struct S var) map(mapper(default), tofrom: var.x)
+ 
+ void f(){
+   struct S z = {1,2};
+ #pragma omp target defaultmap(alloc)
+   z.x += 5;
+ #pragma omp target map(z)
+   z.x += 7;
+ #pragma omp target map(mapper(default), tofrom: z)
+   z.x += 8;
+ #pragma omp target map(mapper(only_x), tofrom: z)
+   z.x += 9;
+ if (z.x != 1+5+7+8+9) __builtin_abort ();
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "#pragma omp target num_teams\\(-2\\) thread_limit\\(0\\) defaultmap\\(alloc\\) map\\(tofrom:z \\\[len: 8\\\]\\)" 1 "gimple" } }  */
+ /* { dg-final { scan-tree-dump-times "#pragma omp target num_teams\\(-2\\) thread_limit\\(0\\) map\\(tofrom:z \\\[len: 8\\\]\\)" 2 "gimple" } }  */
+ /* { dg-final { scan-tree-dump-times "#pragma omp target num_teams\\(-2\\) thread_limit\\(0\\) map\\(struct:z \\\[len: 1\\\]\\) map\\(tofrom:z.x \\\[len: 4\\\]\\)" 1 "gimple" } }  */
+ 
+ int main() {
+   f();
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-mapper-11.c gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-mapper-11.c
*** gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-mapper-11.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-mapper-11.c	Sun Jun  1 22:32:17 2025
***************
*** 0 ****
--- 1,70 ----
+ #pragma omp declare mapper (int v)
+ // { dg-error "missing 'map' clause before end of line" "" { target c++ } .-1 }
+ // { dg-error "'int' is not a struct or union type in '#pragma omp declare mapper'" "" { target c } .-2 }
+ 
+ #pragma omp declare mapper (float v) map()
+ // { dg-error "expected primary-expression before '\\)' token" "" { target c++ } .-1 }
+ // { dg-error "'float' is not a struct, union or class type in '#pragma omp declare mapper'" "" { target c++ } .-2 }
+ // { dg-error "'float' is not a struct or union type in '#pragma omp declare mapper'" "" { target c } .-3 }
+ 
+ #pragma omp declare mapper (char v) map(v)
+ // { dg-error "'char' is not a struct, union or class type in '#pragma omp declare mapper'" "" { target c++ } .-1 }
+ // { dg-error "'char' is not a struct or union type in '#pragma omp declare mapper'" "" { target c } .-2 }
+ 
+ struct XT {
+   int x;
+ };
+ #pragma omp declare mapper (XT y) map()
+ // { dg-error "expected primary-expression before '\\)' token" "" { target c++ } .-1 }
+ // { dg-error "unknown type name 'XT'" "" { target c } .-2 }
+ // { dg-error "expected end of line before 'y'" "" { target c } .-3 }
+ #pragma omp declare mapper ( bar : struct XT y) map()
+ // { dg-error "expected primary-expression before '\\)' token" "" { target c++ } .-1 }
+ // { dg-error "expected expression before '\\)' token" "" { target c } .-2 }
+ 
+ struct t {
+   int x;
+ };
+ 
+ typedef struct t myStruct;
+ 
+ #pragma omp declare mapper(t)
+ // { dg-error "expected unqualified-id before '\\)' token" "" { target c++ } .-1 }
+ // { dg-error "unknown type name 't'" "" { target c } .-2 }
+ // { dg-error "expected end of line before '\\)' token" "" { target c } .-3 }
+ #pragma omp declare mapper(struct t)
+ // { dg-error "expected unqualified-id before '\\)' token" "" { target c++ } .-1 }
+ // { dg-error "expected identifier" "" { target c } .-2 }
+ // { dg-error "expected end of line before '\\)' token" "" { target c } .-3 }
+ #pragma omp declare mapper(myStruct)
+ // { dg-error "expected unqualified-id before '\\)' token" "" { target c++ } .-1 }
+ // { dg-error "expected identifier" "" { target c } .-2 }
+ // { dg-error "expected end of line before '\\)' token" "" { target c } .-3 }
+ 
+ #pragma omp declare mapper(name : t v)  map()
+ // { dg-error "expected primary-expression before '\\)' token" "" { target c++ } .-1 }
+ // { dg-error "unknown type name 't'" "" { target c } .-2 }
+ // { dg-error "expected end of line before 'v'" "" { target c } .-3 }
+ 
+ #pragma omp declare mapper(fancy : struct t v) map(always,present,close,mapper(d),tofrom: v) // { dg-error "in 'declare mapper' directives, parameter to 'mapper' modifier must be 'default'" }
+ 
+ #pragma omp declare mapper(myStruct v) map(v, v.x)
+ // { dg-note "'#pragma omp declare mapper \\(myStruct\\)' previously declared here" "" { target c++ } .-1 }
+ // { dg-note "'#pragma omp declare mapper' previously declared here" "" { target c } .-2 }
+ #pragma omp declare mapper(default : struct t v) map(v, v.x)
+ // { dg-error "redefinition of '#pragma omp declare mapper \\(t\\)'" "" { target c++ } .-1 }
+ // { dg-error "redeclaration of '<default>' '#pragma omp declare mapper' for type 'struct t'" "" { target c } .-2 }
+ 
+ union u_t { };
+ union u_q { };
+ 
+ #pragma omp declare mapper(union u_t v) map()
+ // { dg-error "expected primary-expression before '\\)' token" "" { target c++ } .-1 }
+ // { dg-error "expected expression before '\\)' token" "" { target c } .-2 }
+ 
+ #pragma omp declare mapper( one : union u_t v) map(v)
+ // { dg-note "'#pragma omp declare mapper \\(one: u_t\\)' previously declared here" "" { target c++ } .-1 }
+ // { dg-note "'#pragma omp declare mapper' previously declared here" "" { target c } .-2 }
+ #pragma omp declare mapper( one : union u_t u) map( u )
+ // { dg-error "redefinition of '#pragma omp declare mapper \\(one: u_t\\)'" "" { target c++ } .-1 }
+ // { dg-error "redeclaration of 'one' '#pragma omp declare mapper' for type 'union u_t'" "" { target c } .-2 }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-mapper-12.c gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-mapper-12.c
*** gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-mapper-12.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-mapper-12.c	Sun Jun  1 22:32:17 2025
***************
*** 0 ****
--- 1,22 ----
+ /* { dg-do compile } */
+ 
+ struct XYZ {
+   int a;
+   int *b;
+   int c;
+ };
+ 
+ #pragma omp declare mapper(struct XYZ t)
+ /* { dg-error "missing 'map' clause" "" { target c } .-1 } */
+ /* { dg-error "missing 'map' clause before end of line" "" { target c++ } .-2 } */
+ 
+ struct ABC {
+   int *a;
+   int b;
+   int c;
+ };
+ 
+ #pragma omp declare mapper(struct ABC d) firstprivate(d.b) 
+ /* { dg-error "unexpected clause" "" { target c } .-1 } */
+ /* { dg-error "expected end of line before '\\(' token" "" { target c } .-2 } */
+ /* { dg-error "unexpected clause before '\\(' token" "" { target c++ } .-3 } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-mapper-3.c gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-mapper-3.c
*** gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-mapper-3.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-mapper-3.c	Sun Jun  1 22:32:17 2025
***************
*** 0 ****
--- 1,30 ----
+ // { dg-do compile }
+ // { dg-additional-options "-fdump-tree-gimple" }
+ 
+ #include <stdlib.h>
+ 
+ // Test named mapper invocation.
+ 
+ struct S {
+   int *ptr;
+   int size;
+ };
+ 
+ int main (int argc, char *argv[])
+ {
+   int N = 1024;
+ #pragma omp declare mapper (mapN:struct S s) map(to:s.ptr, s.size) \
+ 					     map(s.ptr[:N])
+ 
+   struct S s;
+   s.ptr = (int *) malloc (sizeof (int) * N);
+ 
+ #pragma omp target map(mapper(mapN), tofrom: s)
+ // { dg-final { scan-tree-dump {map\(struct:s \[len: 2\]\) map\(alloc:s\.ptr \[len: [0-9]+\]\) map\(to:s\.size \[len: [0-9]+\]\) map\(tofrom:\*_[0-9]+ \[len: _[0-9]+\]\) map\(attach:s\.ptr \[bias: 0\]\)} "gimple" } }
+   {
+     for (int i = 0; i < N; i++)
+       s.ptr[i]++;
+   }
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-mapper-4.c gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-mapper-4.c
*** gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-mapper-4.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-mapper-4.c	Sun Jun  1 22:32:17 2025
***************
*** 0 ****
--- 1,78 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "-fdump-tree-original" } */
+ 
+ /* Check mapper binding clauses.  */
+ 
+ struct Y {
+   int z;
+ };
+ 
+ struct Z {
+   int z;
+ };
+ 
+ #pragma omp declare mapper (struct Y y) map(tofrom: y)
+ #pragma omp declare mapper (struct Z z) map(tofrom: z)
+ 
+ int foo (void)
+ {
+   struct Y yy;
+   struct Z zz;
+   int dummy;
+ 
+ #pragma omp target data map(dummy)
+   {
+   #pragma omp target
+     {
+       yy.z++;
+       zz.z++;
+     }
+     yy.z++;
+   }
+   return yy.z;
+ }
+ 
+ struct P
+ {
+   struct Z *zp;
+ };
+ 
+ int bar (void)
+ {
+   struct Y yy;
+   struct Z zz;
+   struct P pp;
+   struct Z t;
+   int dummy;
+ 
+   pp.zp = &t;
+ 
+ #pragma omp declare mapper (struct Y y) map(tofrom: y.z)
+ #pragma omp declare mapper (struct Z z) map(tofrom: z.z)
+ 
+ #pragma omp target data map(dummy)
+   {
+   #pragma omp target
+     {
+       yy.z++;
+       zz.z++;
+     }
+     yy.z++;
+   }
+ 
+   #pragma omp declare mapper(struct P x) map(to:x.zp) map(tofrom:*x.zp)
+ 
+   #pragma omp target
+   {
+     zz = *pp.zp;
+   }
+ 
+   return zz.z;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times {mapper_binding\(struct Y,omp declare mapper ~1Y\) mapper_binding\(struct Z,omp declare mapper ~1Z\)} 2 "original" { target c++ } } } */
+ /* { dg-final { scan-tree-dump {mapper_binding\(struct Z,omp declare mapper ~1Z\) mapper_binding\(struct P,omp declare mapper ~1P\)} "original" { target c++ } } } */
+ 
+ /* { dg-final { scan-tree-dump {mapper_binding\(struct Z,#pragma omp declare mapper \(struct Z z\) map\(tofrom:z\)\) mapper_binding\(struct Y,#pragma omp declare mapper \(struct Y y\) map\(tofrom:y\)\)} "original" { target c } } } */
+ /* { dg-final { scan-tree-dump {mapper_binding\(struct Z,#pragma omp declare mapper \(struct Z z\) map\(tofrom:z\.z\)\) mapper_binding\(struct Y,#pragma omp declare mapper \(struct Y y\) map\(tofrom:y\.z\)\)} "original" { target c } } } */
+ /* { dg-final { scan-tree-dump {mapper_binding\(struct P,#pragma omp declare mapper \(struct P x\) map\(tofrom:\(x\.zp\)\[0:1\]\) map\(to:x.zp\)\) mapper_binding\(struct Z,#pragma omp declare mapper \(struct Z z\) map\(tofrom:z\.z\)\)} "original" { target c } } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-mapper-5.c gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-mapper-5.c
*** gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-mapper-5.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-mapper-5.c	Sun Jun  1 22:32:17 2025
***************
*** 0 ****
--- 1,26 ----
+ /* { dg-do compile } */
+ 
+ typedef struct S_ {
+   int *myarr;
+   int size;
+ } S;
+ 
+ #pragma omp declare mapper (named: struct S_ v) map(to:v.size, v.myarr) \
+ 						map(tofrom: v.myarr[0:v.size])
+ /* { dg-note "'#pragma omp declare mapper' previously declared here" "" { target c } .-2 } */
+ /* { dg-note "'#pragma omp declare mapper \\(named: S_\\)' previously defined here" "" { target c++ } .-3 } */
+ 
+ #pragma omp declare mapper (named: S v) map(to:v.size, v.myarr) \
+ 					map(tofrom: v.myarr[0:v.size])
+ /* { dg-error "redeclaration of 'named' '#pragma omp declare mapper' for type 'S' \\\{aka 'struct S_'\\\}" "" { target c } .-2 } */
+ /* { dg-error "redefinition of '#pragma omp declare mapper \\(named: S\\)'" "" { target c++ } .-3 } */
+ 
+ #pragma omp declare mapper (struct S_ v) map(to:v.size, v.myarr) \
+ 					 map(tofrom: v.myarr[0:v.size])
+ /* { dg-note "'#pragma omp declare mapper' previously declared here" "" { target c } .-2 } */
+ /* { dg-note "'#pragma omp declare mapper \\(S_\\)' previously defined here" "" { target c++ } .-3 } */
+ 
+ #pragma omp declare mapper (S v) map(to:v.size, v.myarr) \
+ 				 map(tofrom: v.myarr[0:v.size])
+ /* { dg-error "redeclaration of '<default>' '#pragma omp declare mapper' for type 'S' \\\{aka 'struct S_'\\\}" "" { target c } .-2 } */
+ /* { dg-error "redefinition of '#pragma omp declare mapper \\(S\\)'" "" { target c++ } .-3 } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-mapper-6.c gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-mapper-6.c
*** gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-mapper-6.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-mapper-6.c	Sun Jun  1 22:32:17 2025
***************
*** 0 ****
--- 1,23 ----
+ /* { dg-do compile } */
+ 
+ int x = 5;
+ 
+ struct Q {
+   int *arr1;
+   int *arr2;
+   int *arr3;
+ };
+ 
+ #pragma omp declare mapper (struct Q myq) map(myq.arr2[0:x])
+ 
+ struct R {
+   int *arr1;
+   int *arr2;
+   int *arr3;
+ };
+ 
+ #pragma omp declare mapper (struct R myr) map(myr.arr3[0:y])
+ /* { dg-error "'y' undeclared" "" { target c } .-1 } */
+ /* { dg-error "'y' was not declared in this scope" "" { target c++ } .-2 } */
+ 
+ int y = 7;
diff -Nrcpad gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-mapper-7.c gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-mapper-7.c
*** gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-mapper-7.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-mapper-7.c	Sun Jun  1 22:32:17 2025
***************
*** 0 ****
--- 1,29 ----
+ /* { dg-do compile } */
+ 
+ struct Q {
+   int *arr1;
+   int *arr2;
+   int *arr3;
+ };
+ 
+ int foo (void)
+ {
+   int x = 5;
+   #pragma omp declare mapper (struct Q myq) map(myq.arr2[0:x])
+   return x;
+ }
+ 
+ struct R {
+   int *arr1;
+   int *arr2;
+   int *arr3;
+ };
+ 
+ int bar (void)
+ {
+   #pragma omp declare mapper (struct R myr) map(myr.arr3[0:y])
+   /* { dg-error "'y' undeclared" "" { target c } .-1 } */
+   /* { dg-error "'y' was not declared in this scope" "" { target c++ } .-2 } */
+   int y = 7;
+   return y;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-mapper-8.c gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-mapper-8.c
*** gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-mapper-8.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-mapper-8.c	Sun Jun  1 22:32:17 2025
***************
*** 0 ****
--- 1,43 ----
+ /* { dg-do compile } */
+ 
+ struct Q {
+   int *arr1;
+   int *arr2;
+   int *arr3;
+   int len;
+ };
+ 
+ struct R {
+   struct Q qarr[5];
+ };
+ 
+ struct R2 {
+   struct Q *qptr;
+ };
+ 
+ #pragma omp declare mapper (struct Q myq) map(myq.arr1[0:myq.len]) \
+ 					  map(myq.arr2[0:myq.len]) \
+ 					  map(myq.arr3[0:myq.len])
+ 
+ #pragma omp declare mapper (struct R myr) map(myr.qarr[2:3])
+ 
+ #pragma omp declare mapper (struct R2 myr2) map(myr2.qptr[2:3])
+ 
+ int main (int argc, char *argv[])
+ {
+   struct R r;
+   struct R2 r2;
+   int N = 256;
+ 
+ #pragma omp target
+ /* { dg-message "sorry, unimplemented: user-defined mapper with non-unit length array section" "" { target *-*-* } .-1 } */
+   {
+     for (int i = 2; i < 5; i++)
+       for (int j = 0; j < N; j++)
+ 	{
+ 	  r.qarr[i].arr1[j]++;
+ 	  r2.qptr[i].arr2[j]++;
+ 	}
+   }
+ }
+ 
diff -Nrcpad gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-mapper-9.c gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-mapper-9.c
*** gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-mapper-9.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-mapper-9.c	Sun Jun  1 22:32:17 2025
***************
*** 0 ****
--- 1,34 ----
+ /* { dg-do compile } */
+ 
+ int x = 5;
+ 
+ struct Q {
+   int *arr1;
+   int *arr2;
+   int *arr3;
+ };
+ 
+ int y = 5;
+ 
+ #pragma omp declare mapper (struct Q myq) map(myq.arr2[0:x])
+ /* { dg-note "'#pragma omp declare mapper' previously declared here" "" { target c } .-1 } */
+ /* { dg-note "'#pragma omp declare mapper \\(Q\\)' previously defined here" "" { target c++ } .-2 } */
+ 
+ #pragma omp declare mapper (struct Q myq) map(myq.arr2[0:y])
+ /* { dg-error "redeclaration of '<default>' '#pragma omp declare mapper' for type 'struct Q'" "" { target c } .-1 } */
+ /* { dg-error "redefinition of '#pragma omp declare mapper \\(Q\\)'" "" { target c++ } .-2 } */
+ 
+ struct R {
+   int *arr1;
+ };
+ 
+ void foo (void)
+ {
+ #pragma omp declare mapper (struct R myr) map(myr.arr1[0:x])
+ /* { dg-note "'#pragma omp declare mapper' previously declared here" "" { target c } .-1 } */
+ /* { dg-note "'#pragma omp declare mapper \\(R\\)' previously declared here" "" { target c++ } .-2 } */
+ 
+ #pragma omp declare mapper (struct R myr) map(myr.arr1[0:y])
+ /* { dg-error "redeclaration of '<default>' '#pragma omp declare mapper' for type 'struct R'" "" { target c } .-1 } */
+ /* { dg-error "redeclaration of '#pragma omp declare mapper \\(R\\)'" "" { target c++ } .-2 } */
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-variant-2.c gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-variant-2.c
*** gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/declare-variant-2.c	Sun May 25 22:32:07 2025
--- gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/declare-variant-2.c	Sun Jun  1 22:32:17 2025
*************** void f23 (void);
*** 47,56 ****
  #pragma omp declare variant (f1) match(construct={teams,parallel,master,for})	/* { dg-warning "unknown selector 'master' for context selector set 'construct'" } */
  void f24 (void);
  #pragma omp declare variant (f1) match(construct={parallel(1	/* { dg-error "selector 'parallel' does not accept any properties" } */
! void f25 (void);						/* { dg-error "expected '\\\}' before end of line" "" { target c++ } .-1 } */
! 								/* { dg-error "expected '\\\}' before '\\(' token" "" { target c } .-2 } */
  #pragma omp declare variant (f1) match(construct={parallel(1)})	/* { dg-error "selector 'parallel' does not accept any properties" } */
! void f26 (void);							/* { dg-error "expected '\\\}' before '\\(' token" "" { target c } .-1 } */
  #pragma omp declare variant (f0) match(construct={simd(12)})	/* { dg-error "expected \[^\n\r]* clause before" } */
  void f27 (void);						/* { dg-error "'\\)' before numeric constant" "" { target c++ } .-1 } */
  #pragma omp declare variant (f1) match(construct={parallel},construct={for})	/* { dg-error "selector set 'construct' specified more than once" } */
--- 47,55 ----
  #pragma omp declare variant (f1) match(construct={teams,parallel,master,for})	/* { dg-warning "unknown selector 'master' for context selector set 'construct'" } */
  void f24 (void);
  #pragma omp declare variant (f1) match(construct={parallel(1	/* { dg-error "selector 'parallel' does not accept any properties" } */
! void f25 (void);						/* { dg-error "expected '\\\}' before end of line" "" { target *-*-* } .-1 } */
  #pragma omp declare variant (f1) match(construct={parallel(1)})	/* { dg-error "selector 'parallel' does not accept any properties" } */
! void f26 (void);
  #pragma omp declare variant (f0) match(construct={simd(12)})	/* { dg-error "expected \[^\n\r]* clause before" } */
  void f27 (void);						/* { dg-error "'\\)' before numeric constant" "" { target c++ } .-1 } */
  #pragma omp declare variant (f1) match(construct={parallel},construct={for})	/* { dg-error "selector set 'construct' specified more than once" } */
*************** void f46 (void);
*** 96,108 ****
  #pragma omp declare variant (f1) match(implementation={vendor("foobar")})	/* { dg-warning "unknown property '.foobar.' of 'vendor' selector" } */
  void f47 (void);
  #pragma omp declare variant (f1) match(implementation={unified_address(yes)})	/* { dg-error "selector 'unified_address' does not accept any properties" } */
! void f48 (void);								/* { dg-error "expected '\\\}' before '\\(' token" "" { target c } .-1 } */
  #pragma omp declare variant (f1) match(implementation={unified_shared_memory(no)})	/* { dg-error "selector 'unified_shared_memory' does not accept any properties" } */
! void f49 (void);									/* { dg-error "expected '\\\}' before '\\(' token" "" { target c } .-1 } */
  #pragma omp declare variant (f1) match(implementation={dynamic_allocators(42)})	/* { dg-error "selector 'dynamic_allocators' does not accept any properties" } */
! void f50 (void);								/* { dg-error "expected '\\\}' before '\\(' token" "" { target c } .-1 } */
  #pragma omp declare variant (f1) match(implementation={reverse_offload()})	/* { dg-error "selector 'reverse_offload' does not accept any properties" } */
! void f51 (void);								/* { dg-error "expected '\\\}' before '\\(' token" "" { target c } .-1 } */
  #pragma omp declare variant (f1) match(implementation={atomic_default_mem_order})	/* { dg-error "expected '\\(' before '\\\}' token" } */
  void f52 (void);
  #pragma omp declare variant (f1) match(implementation={atomic_default_mem_order(acquire)})
--- 95,107 ----
  #pragma omp declare variant (f1) match(implementation={vendor("foobar")})	/* { dg-warning "unknown property '.foobar.' of 'vendor' selector" } */
  void f47 (void);
  #pragma omp declare variant (f1) match(implementation={unified_address(yes)})	/* { dg-error "selector 'unified_address' does not accept any properties" } */
! void f48 (void);
  #pragma omp declare variant (f1) match(implementation={unified_shared_memory(no)})	/* { dg-error "selector 'unified_shared_memory' does not accept any properties" } */
! void f49 (void);
  #pragma omp declare variant (f1) match(implementation={dynamic_allocators(42)})	/* { dg-error "selector 'dynamic_allocators' does not accept any properties" } */
! void f50 (void);
  #pragma omp declare variant (f1) match(implementation={reverse_offload()})	/* { dg-error "selector 'reverse_offload' does not accept any properties" } */
! void f51 (void);
  #pragma omp declare variant (f1) match(implementation={atomic_default_mem_order})	/* { dg-error "expected '\\(' before '\\\}' token" } */
  void f52 (void);
  #pragma omp declare variant (f1) match(implementation={atomic_default_mem_order(acquire)})
diff -Nrcpad gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/map-6.c gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/map-6.c
*** gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/map-6.c	Sun May 25 22:32:07 2025
--- gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/map-6.c	Sun Jun  1 22:32:17 2025
*************** foo (void)
*** 13,32 ****
    #pragma omp target map (to:a)
    ;
  
!   #pragma omp target map (a to: b) /* { dg-error "'map' clause with map-type modifier other than 'always', 'close' or 'present'" } */
!   ;
  
!   #pragma omp target map (close, a to: b) /* { dg-error "'map' clause with map-type modifier other than 'always', 'close' or 'present'" } */
!   ;
  
!   #pragma omp target enter data map(b7) map (close, a to: b) /* { dg-error "'map' clause with map-type modifier other than 'always', 'close' or 'present'" } */
!   ;
  
!   #pragma omp target exit data map(b7) map (close, a from: b) /* { dg-error "'map' clause with map-type modifier other than 'always', 'close' or 'present'" } */
!   ;
  
!   #pragma omp target data map(b7) map (close, a from: b) /* { dg-error "'map' clause with map-type modifier other than 'always', 'close' or 'present'" } */
!   ;
  
  
    #pragma omp target map (close a) /* { dg-error "'close' undeclared" "" { target c } } */ 
--- 13,32 ----
    #pragma omp target map (to:a)
    ;
  
!   #pragma omp target map (a to: b) /* { dg-error "'map' clause with map-type modifier other than 'always', 'close', 'mapper' or 'present'" "" { target c++ } } */
!   ; /* { dg-error "'map' clause with map-type modifier other than 'always', 'close', 'mapper' or 'present' before 'a'" "" { target c } .-1 }  */
  
!   #pragma omp target map (close, a to: b) /* { dg-error "'map' clause with map-type modifier other than 'always', 'close', 'mapper' or 'present'" "" { target c++ } } */
!   ; /* { dg-error "'map' clause with map-type modifier other than 'always', 'close', 'mapper' or 'present' before 'a'" "" { target c } .-1 }  */
  
!   #pragma omp target enter data map(b7) map (close, a to: b) /* { dg-error "'map' clause with map-type modifier other than 'always', 'close', 'mapper' or 'present'" "" { target c++ } } */
!   ; /* { dg-error "'map' clause with map-type modifier other than 'always', 'close', 'mapper' or 'present' before 'a'" "" { target c } .-1 }  */
  
!   #pragma omp target exit data map(b7) map (close, a from: b) /* { dg-error "'map' clause with map-type modifier other than 'always', 'close', 'mapper' or 'present'" "" { target c++ } } */
!   ; /* { dg-error "'map' clause with map-type modifier other than 'always', 'close', 'mapper' or 'present' before 'a'" "" { target c } .-1 }  */
  
!   #pragma omp target data map(b7) map (close, a from: b) /* { dg-error "'map' clause with map-type modifier other than 'always', 'close', 'mapper' or 'present'" "" { target c++ } } */
!   ; /* { dg-error "'map' clause with map-type modifier other than 'always', 'close', 'mapper' or 'present' before 'a'" "" { target c } .-1 }  */
  
  
    #pragma omp target map (close a) /* { dg-error "'close' undeclared" "" { target c } } */ 
diff -Nrcpad gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/metadirective-3.c gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/metadirective-3.c
*** gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/metadirective-3.c	Sun May 25 22:32:07 2025
--- gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/metadirective-3.c	Sun Jun  1 22:32:17 2025
*************** f (int x[], int y[], int z[])
*** 8,14 ****
  {
    int i;
  
!   #pragma omp target map(to: x, y) map(from: z)
      #pragma omp metadirective \
  	when (device={arch("nvptx")}: teams loop) \
  	default (parallel loop)
--- 8,14 ----
  {
    int i;
  
!   #pragma omp target map(to: x, y) map(from: z)  /* { dg-bogus "'target' construct with nested 'teams' construct contains directives outside of the 'teams' construct" "PR118694" { xfail offload_nvptx } }  */ 
      #pragma omp metadirective \
  	when (device={arch("nvptx")}: teams loop) \
  	default (parallel loop)
*************** f (int x[], int y[], int z[])
*** 19,23 ****
  /* If offload device "nvptx" isn't supported, the front end can eliminate
     that alternative and not produce a metadirective at all.  Otherwise this
     won't be resolved until late.  */
! /* { dg-final { scan-tree-dump-not "#pragma omp metadirective" "gimple" { target { ! offload_nvptx } } } } */
! /* { dg-final { scan-tree-dump "#pragma omp metadirective" "gimple" { target { offload_nvptx } } } } */
--- 19,24 ----
  /* If offload device "nvptx" isn't supported, the front end can eliminate
     that alternative and not produce a metadirective at all.  Otherwise this
     won't be resolved until late.  */
! /* { dg-final { scan-tree-dump-not "#pragma omp metadirective" "gimple" } } */
! /* { dg-final { scan-tree-dump-not " teams" "gimple" { target { ! offload_nvptx } } } } */
! /* { dg-final { scan-tree-dump "variant.\[0-9\]+ = \\\[omp_next_variant\\\] OMP_NEXT_VARIANT <0,\[\r\n \]+construct context = 14\[\r\n \]+1: device = \\{arch \\(.nvptx.\\)\\}\[\r\n \]+2: >;" "gimple" { target { offload_nvptx } } } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/metadirective-error-recovery.c gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/metadirective-error-recovery.c
*** gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/metadirective-error-recovery.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/metadirective-error-recovery.c	Sun Jun  1 22:32:17 2025
***************
*** 0 ****
--- 1,20 ----
+ /* { dg-do compile } */
+ 
+ /* This test used to ICE in C and only diagnose the first error in C++.  */
+ 
+ struct s {
+   int a, b;
+ };
+ 
+ void f (int aa, int bb)
+ {
+   struct s s1, s2;
+   s1.a = aa;
+   s1.b = bb;
+   s2.a = aa + 1;
+   s2.b = bb + 1;
+ 
+   /* A struct is not a valid argument for the condition selector.  */
+   #pragma omp metadirective when(user={condition(s1)} : nothing) otherwise(nothing)  /* { dg-error "property must be integer expression" } */
+   #pragma omp metadirective when(user={condition(s2)} : nothing) otherwise(nothing)  /* { dg-error "property must be integer expression" } */
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/pr120180.c gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/pr120180.c
*** gcc-16-20250525/gcc/testsuite/c-c++-common/gomp/pr120180.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/c-c++-common/gomp/pr120180.c	Sun Jun  1 22:32:17 2025
***************
*** 0 ****
--- 1,22 ----
+ /* { dg-do compile } */
+ 
+ /* This test used to ICE after erroring on the metadirective in the
+    loop nest.  */
+ 
+ int main()
+ {
+   int blksize = 15000;
+   double *qq;
+   int i, k, nq;
+ 
+   #pragma omp metadirective when(user={condition(0)}: target teams distribute parallel for collapse(2) map(qq[:0]) private(i)) \
+                             when(user={condition(0)}: target teams distribute parallel for map(qq[:0]) private(i)) \
+                             when(user={condition(1)}: target teams loop collapse(2) map(qq[:0]) private(i))
+   for(k=0; k<blksize; k++)
+     {
+ #pragma omp metadirective when(user={condition(0)}: simd) default() // { dg-error "intervening code must not contain OpenMP directives" }
+       for (i=0; i<nq; i++)
+         qq[k*nq + i] = 0.0;
+     }
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/coroutines/pr109283.C gcc-16-20250601/gcc/testsuite/g++.dg/coroutines/pr109283.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/coroutines/pr109283.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/coroutines/pr109283.C	Sun Jun  1 22:32:18 2025
***************
*** 0 ****
--- 1,23 ----
+ // PR 109283.
+ // This used to ICE from a check set too widely.
+ #include <coroutine>
+ 
+ struct foo
+ { ~foo(); };
+ 
+ struct task
+ {
+    struct promise_type
+    {
+        std::suspend_never initial_suspend();
+        std::suspend_never final_suspend() noexcept;
+        std::suspend_never yield_value(foo);
+        void return_void();
+        void unhandled_exception(); 
+        task get_return_object();
+    };
+ };
+ 
+ task source(int b) {
+    co_yield b ? foo{} : foo{};
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/coroutines/pr120453.C gcc-16-20250601/gcc/testsuite/g++.dg/coroutines/pr120453.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/coroutines/pr120453.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/coroutines/pr120453.C	Sun Jun  1 22:32:18 2025
***************
*** 0 ****
--- 1,95 ----
+ // PR120453 - reduced testcase amended to add a TaskBase move constructor
+ // and a LazyTask destructor, to more closely match the original code.
+ // { dg-additional-options "-w" }
+ namespace std {
+ template <typename> struct __coroutine_traits_impl;
+ template <typename _Result>
+   requires requires { typename _Result; }
+ struct __coroutine_traits_impl<_Result>;
+ template <typename _Result, typename> struct coroutine_traits : _Result {};
+ template <typename = void> struct coroutine_handle {
+   static coroutine_handle from_address(void *);
+   operator coroutine_handle<>();
+   void *address();
+ };
+ struct suspend_never {
+   bool await_ready();
+   void await_suspend(coroutine_handle<>);
+   void await_resume();
+ };
+ } // namespace std
+ 
+ namespace QCoro {
+ namespace detail {
+ template <typename T>
+ concept has_await_methods = requires(T t) { t; };
+ } // namespace detail
+ 
+ template <typename T>
+ concept Awaitable = detail::has_await_methods<T>;
+ namespace detail {
+ struct TaskFinalSuspend {
+   bool await_ready() noexcept;
+   template <typename Promise>
+   void await_suspend(std::coroutine_handle<Promise>) noexcept;
+   void await_resume() noexcept;
+ };
+ struct TaskPromiseBase {
+   std::suspend_never initial_suspend();
+   auto final_suspend() noexcept { return TaskFinalSuspend{}; }
+   template <Awaitable T> auto &&await_transform(T &&);
+ };
+ struct TaskPromise : TaskPromiseBase {
+   void unhandled_exception();
+ };
+ template <typename> struct TaskAwaiterBase {
+   bool await_ready();
+   void await_suspend(std::coroutine_handle<>);
+ };
+ template <typename, template <typename> class, typename> struct TaskBase {
+   TaskBase() = default;
+   TaskBase(TaskBase &&) = default;
+   void operator=(TaskBase &&);
+   auto operator co_await() const;
+   std::coroutine_handle<> mCoroutine;
+ };
+ } // namespace detail
+ template <typename> struct Task : detail::TaskBase<int, Task, int> {};
+ } // namespace QCoro
+ 
+ namespace QCoro::detail {
+ template <Awaitable T> auto &&TaskPromiseBase::await_transform(T &&awaitable) {
+   return awaitable;
+ }
+ 
+ template <typename T, template <typename> class TaskImpl, typename PromiseType>
+ auto TaskBase<T, TaskImpl, PromiseType>::operator co_await() const {
+   class TaskAwaiter : public TaskAwaiterBase<PromiseType> {
+   public:
+     TaskAwaiter(std::coroutine_handle<>);
+     auto await_resume() {}
+   };
+   return TaskAwaiter{mCoroutine};
+ }
+ 
+ } // namespace QCoro::detail
+ 
+ namespace QCoro {
+ template <typename T> class LazyTask ;
+ namespace detail {
+ struct LazyTaskPromise : TaskPromise {
+   LazyTask<int> get_return_object();
+ };
+ } // namespace detail
+ 
+ template <typename T> struct LazyTask : detail::TaskBase<int, LazyTask, int> {
+   typedef detail::LazyTaskPromise promise_type;
+   ~LazyTask();
+ };
+ 
+ auto coro = [] -> LazyTask<int>
+ {
+   co_await [] -> Task<int> { return {}; }();
+ };
+ 
+ } // namespace QCoro
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda29.C gcc-16-20250601/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda29.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda29.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda29.C	Sun Jun  1 22:32:19 2025
***************
*** 0 ****
--- 1,19 ----
+ // Test that we don't make lambdas with goto/static implicitly constexpr
+ // when an explicitly constexpr function would be ill-formed.
+ 
+ // { dg-do compile { target c++17 } }
+ 
+ int main()
+ {
+   constexpr int a = [] {
+     return 42;
+     goto label;
+   label:
+     return 142;
+   }();				// { dg-error "" "" { target c++20_down } }
+ 
+   constexpr int b = [] {
+     return 42;
+     static int i;
+   }();				// { dg-error "" "" { target c++20_down } }
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda16.C gcc-16-20250601/gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda16.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda16.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda16.C	Sun Jun  1 22:32:19 2025
***************
*** 0 ****
--- 1,39 ----
+ // PR c++/113563
+ // { dg-do compile { target c++23 } }
+ 
+ struct S {
+   int x_;
+   void f() {
+     [this](this auto) {
+       this->x_ = 42;
+       return this;
+     }();
+   }
+ };
+ 
+ struct R {
+   int x;
+ 
+   auto foo() {
+     return [*this](this auto &self) {
+       this->x = 4;
+     };
+   }
+ };
+ 
+ 
+ struct A
+ {
+     int n;
+     void fun()
+     {
+         auto _ = [&](this auto self) { return n; };
+     }
+ };
+ 
+ struct B {
+   int i = 42;
+   int foo() {
+     return [this](this auto &&self) { auto p = &i; return *p; }();
+   }
+ };
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda17.C gcc-16-20250601/gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda17.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda17.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda17.C	Sun Jun  1 22:32:19 2025
***************
*** 0 ****
--- 1,144 ----
+ // PR c++/113563
+ // { dg-do run { target c++23 } }
+ 
+ template <typename T>
+ T&& move(T& value) { return static_cast<T&&>(value); }
+ 
+ template <typename T, typename U> constexpr bool is_same = false;
+ template <typename T> constexpr bool is_same<T, T> = true;
+ 
+ template <typename T> constexpr bool is_const_ref = false;
+ template <typename T> constexpr bool is_const_ref<const T> = true;
+ template <typename T> constexpr bool is_const_ref<const T&> = true;
+ template <typename T> constexpr bool is_const_ref<const T&&> = true;
+ 
+ template <typename T> constexpr int refqual = 0;
+ template <typename T> constexpr int refqual<T&> = 1;
+ template <typename T> constexpr int refqual<T&&> = 2;
+ 
+ struct S {
+   int x;
+ 
+   // 'this' properly acts as a pointer
+   auto byref_a() {
+     return [this](this auto) { return this->x; };
+   }
+   auto byref_b() {
+     return [this](this auto) { return x; };
+   }
+   auto byref_c() {
+     return [&](this auto) { return x; };
+   }
+   auto byref_d() {
+     return [=](this auto) { return x; };  // { dg-warning "implicit capture" }
+   }
+   auto byref_e() {
+     return [this](this auto) {
+       return [this](this auto) {
+ 	return this->x;
+       }();
+     };
+   }
+   auto byref_f() {
+     return [&](this auto) {
+       return [&](this auto) {
+ 	return x;
+       }();
+     };
+   }
+ 
+   // capturing '*this' stores a copy
+   auto byval_a() {
+     return [*this](this auto) { return this->x; };
+   }
+   auto byval_b() {
+     return [*this](this auto) { return x; };
+   }
+   auto byval_c() {
+     return [*this](this auto) {
+       return [=](this auto) {	// { dg-warning "implicit capture" }
+ 	return this->x;
+       }();
+     };
+   }
+   auto byval_d() {
+     return [*this](this auto) {
+       return [&](this auto) {
+ 	return x;
+       }();
+     };
+   }
+ 
+   // value category doesn't change with self when capture ref
+   auto byref_cat_1() {
+     return [this](this auto&& self) {
+       static_assert(is_same<decltype((x)), int&>);
+     };
+   }
+   auto byref_cat_2() const {
+     return [this](this auto&& self) {
+       static_assert(is_same<decltype((x)), const int&>);
+     };
+   }
+ 
+   // value category does change with self when capture val
+   auto byval_cat() {
+     return [*this](this auto&& self) {
+       static_assert(is_const_ref<decltype((x))> == is_const_ref<decltype((self))>);
+       static_assert(refqual<decltype((x))> == refqual<decltype((self))>);
+     };
+   }
+ };
+ 
+ int main() {
+   S s{ 5 };
+ 
+   auto ra = s.byref_a();
+   auto rb = s.byref_b();
+   auto rc = s.byref_c();
+   auto rd = s.byref_d();
+   auto re = s.byref_e();
+   auto rf = s.byref_f();
+ 
+   auto va = s.byval_a();
+   auto vb = s.byval_b();
+   auto vc = s.byval_c();
+   auto vd = s.byval_d();
+ 
+   s.x = 10;
+ 
+   if (ra() != 10
+       || rb() != 10
+       || rc() != 10
+       || rd() != 10
+       || re() != 10
+       || rf() != 10)
+     __builtin_abort();
+ 
+   if (va() != 5
+       || vb() != 5
+       || vc() != 5
+       || vd() != 5)
+     __builtin_abort();
+ 
+   auto r_nonconst_1 = s.byref_cat_1();
+   const auto r_const_1 = r_nonconst_1;
+   r_nonconst_1();
+   move(r_nonconst_1)();
+   r_const_1();
+   move(r_nonconst_1)();
+ 
+   auto r_nonconst_2 = s.byref_cat_2();
+   const auto r_const_2 = r_nonconst_2;
+   r_nonconst_2();
+   move(r_nonconst_2)();
+   r_const_2();
+   move(r_nonconst_2)();
+ 
+   auto v_nonconst = s.byval_cat();
+   const auto v_const = v_nonconst;
+   v_nonconst();
+   move(v_nonconst)();
+   v_const();
+   move(v_nonconst)();
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/cpp2a/concepts-lambda24.C gcc-16-20250601/gcc/testsuite/g++.dg/cpp2a/concepts-lambda24.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/cpp2a/concepts-lambda24.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/cpp2a/concepts-lambda24.C	Sun Jun  1 22:32:19 2025
***************
*** 0 ****
--- 1,13 ----
+ // PR c++/120123
+ // { dg-do compile { target c++20 } }
+ 
+ struct H {
+     void member(int) {}
+     void call() {
+         [this]() {
+             [this](const auto& v)
+                 requires requires { /*this->*/member(v); }
+             { return member(v); }(0);
+         };
+     }
+ };
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/diagnostic/bad-binary-ops-highlight-colors.C gcc-16-20250601/gcc/testsuite/g++.dg/diagnostic/bad-binary-ops-highlight-colors.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/diagnostic/bad-binary-ops-highlight-colors.C	Sun May 25 22:32:08 2025
--- gcc-16-20250601/gcc/testsuite/g++.dg/diagnostic/bad-binary-ops-highlight-colors.C	Sun Jun  1 22:32:19 2025
*************** int test_4 (void)
*** 23,30 ****
       { dg-end-multiline-output "" } */
  
    /* { dg-begin-multiline-output "" }
!    return [01;32m[Kc[m[K[01;32m[Ka[m[K[01;32m[Kl[m[K[01;32m[Kl[m[K[01;32m[Ke[m[K[01;32m[Ke[m[K[01;32m[K_[m[K[01;32m[K4[m[K[01;32m[Ka[m[K[01;32m[K [m[K[01;32m[K([m[K[01;32m[K)[m[K [01;31m[K+[m[K [01;34m[Kc[m[K[01;34m[Ka[m[K[01;34m[Kl[m[K[01;34m[Kl[m[K[01;34m[Ke[m[K[01;34m[Ke[m[K[01;34m[K_[m[K[01;34m[K4[m[K[01;34m[Kb[m[K[01;34m[K [m[K[01;34m[K([m[K[01;34m[K)[m[K;
!           [01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K [01;31m[K^[m[K [01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K
                      [01;32m[K|[m[K              [01;34m[K|[m[K
                      [01;32m[KS {aka s}[m[K      [01;34m[KT {aka t}[m[K
       { dg-end-multiline-output "" } */
--- 23,30 ----
       { dg-end-multiline-output "" } */
  
    /* { dg-begin-multiline-output "" }
!    return [01;32m[Kcallee_4a ()[m[K [01;31m[K+[m[K [01;34m[Kcallee_4b ()[m[K;
!           [01;32m[K~~~~~~~~~~~~[m[K [01;31m[K^[m[K [01;34m[K~~~~~~~~~~~~[m[K
                      [01;32m[K|[m[K              [01;34m[K|[m[K
                      [01;32m[KS {aka s}[m[K      [01;34m[KT {aka t}[m[K
       { dg-end-multiline-output "" } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/diagnostic/long-short-colorization.C gcc-16-20250601/gcc/testsuite/g++.dg/diagnostic/long-short-colorization.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/diagnostic/long-short-colorization.C	Sun May 25 22:32:08 2025
--- gcc-16-20250601/gcc/testsuite/g++.dg/diagnostic/long-short-colorization.C	Sun Jun  1 22:32:19 2025
***************
*** 6,19 ****
  long short int a;
  /* { dg-begin-multiline-output "" }
  [m[K'[01m[K[01;32m[Klong[m[K[m[K' and '[01m[K[01;34m[Kshort[m[K[m[K' specified together
!  [01;32m[Kl[m[K[01;32m[Ko[m[K[01;32m[Kn[m[K[01;32m[Kg[m[K [01;34m[Ks[m[K[01;34m[Kh[m[K[01;34m[Ko[m[K[01;34m[Kr[m[K[01;34m[Kt[m[K int a;
!  [01;32m[K^[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K [01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K
     { dg-end-multiline-output "" } */
  short long int b;
  /* { dg-begin-multiline-output "" }
  [m[K'[01m[K[01;32m[Klong[m[K[m[K' and '[01m[K[01;34m[Kshort[m[K[m[K' specified together
!  [01;34m[Ks[m[K[01;34m[Kh[m[K[01;34m[Ko[m[K[01;34m[Kr[m[K[01;34m[Kt[m[K [01;32m[Kl[m[K[01;32m[Ko[m[K[01;32m[Kn[m[K[01;32m[Kg[m[K int b;
!  [01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K [01;32m[K^[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K
     { dg-end-multiline-output "" } */
  
  // Discard the remaining colorized output that confuses dejagnu.
--- 6,19 ----
  long short int a;
  /* { dg-begin-multiline-output "" }
  [m[K'[01m[K[01;32m[Klong[m[K[m[K' and '[01m[K[01;34m[Kshort[m[K[m[K' specified together
!  [01;32m[Klong[m[K [01;34m[Kshort[m[K int a;
!  [01;32m[K^~~~[m[K [01;34m[K~~~~~[m[K
     { dg-end-multiline-output "" } */
  short long int b;
  /* { dg-begin-multiline-output "" }
  [m[K'[01m[K[01;32m[Klong[m[K[m[K' and '[01m[K[01;34m[Kshort[m[K[m[K' specified together
!  [01;34m[Kshort[m[K [01;32m[Klong[m[K int b;
!  [01;34m[K~~~~~[m[K [01;32m[K^~~~[m[K
     { dg-end-multiline-output "" } */
  
  // Discard the remaining colorized output that confuses dejagnu.
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/ext/is_destructible1.C gcc-16-20250601/gcc/testsuite/g++.dg/ext/is_destructible1.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/ext/is_destructible1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/ext/is_destructible1.C	Sun Jun  1 22:32:19 2025
***************
*** 0 ****
--- 1,60 ----
+ // PR c++/107600
+ // { dg-do compile { target c++11 } }
+ 
+ #define SA(X) static_assert ((X), #X)
+ 
+ namespace N1 {
+   struct A { ~A() = delete; };
+ 
+   SA (!__is_destructible (A));
+   SA (!__is_nothrow_destructible (A));
+   SA (!__is_trivially_destructible (A));
+ 
+   bool b = __has_trivial_destructor (A); // { dg-message "has_trivial_destructor" }
+ }
+ 
+ namespace N2 {
+   struct A { protected: ~A() = default; };
+ 
+   SA (!__is_destructible (A));
+   SA (!__is_nothrow_destructible (A));
+   SA (!__is_trivially_destructible (A));
+   SA (__has_trivial_destructor (A));
+ }
+ 
+ namespace N3 {
+   struct A { ~A(); };
+ 
+   SA (__is_destructible (A));
+   SA (__is_nothrow_destructible (A));
+   SA (!__is_trivially_destructible (A));
+   SA (!__has_trivial_destructor (A));
+ }
+ 
+ namespace N4 {
+   struct A { ~A() noexcept (false); };
+ 
+   SA (__is_destructible (A));
+   SA (!__is_nothrow_destructible (A));
+   SA (!__is_trivially_destructible (A));
+   SA (!__has_trivial_destructor (A));
+ }
+ 
+ namespace N5 {
+   struct A { ~A() = default; };
+ 
+   SA (__is_destructible (A));
+   SA (__is_nothrow_destructible (A));
+   SA (__is_trivially_destructible (A));
+   SA (__has_trivial_destructor (A));
+ }
+ 
+ namespace N6 {
+   struct A { };
+ 
+   SA (__is_destructible (A));
+   SA (__is_nothrow_destructible (A));
+   SA (__is_trivially_destructible (A));
+   SA (__has_trivial_destructor (A));
+ }
+ 
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/gomp/declare-mapper-1.C gcc-16-20250601/gcc/testsuite/g++.dg/gomp/declare-mapper-1.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/gomp/declare-mapper-1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/gomp/declare-mapper-1.C	Sun Jun  1 22:32:19 2025
***************
*** 0 ****
--- 1,58 ----
+ // { dg-do compile }
+ // { dg-additional-options "-fdump-tree-gimple" }
+ 
+ // "omp declare mapper" support -- check expansion in gimple.
+ 
+ struct S {
+   int *ptr;
+   int size;
+ };
+ 
+ #define N 64
+ 
+ #pragma omp declare mapper (S w) map(w.size, w.ptr, w.ptr[:w.size])
+ #pragma omp declare mapper (foo:S w) map(to:w.size, w.ptr) map(w.ptr[:w.size])
+ 
+ int main (int argc, char *argv[])
+ {
+   S s;
+   s.ptr = new int[N];
+   s.size = N;
+ 
+ #pragma omp declare mapper (bar:S w) map(w.size, w.ptr, w.ptr[:w.size])
+ 
+ #pragma omp target
+   {
+     for (int i = 0; i < N; i++)
+       s.ptr[i]++;
+   }
+ 
+ #pragma omp target map(tofrom: s)
+   {
+     for (int i = 0; i < N; i++)
+       s.ptr[i]++;
+   }
+ 
+ #pragma omp target map(mapper(default), tofrom: s)
+   {
+     for (int i = 0; i < N; i++)
+       s.ptr[i]++;
+   }
+ 
+ #pragma omp target map(mapper(foo), alloc: s)
+   {
+     for (int i = 0; i < N; i++)
+       s.ptr[i]++;
+   }
+ 
+ #pragma omp target map(mapper(bar), tofrom: s)
+   {
+     for (int i = 0; i < N; i++)
+       s.ptr[i]++;
+   }
+ 
+   return 0;
+ }
+ 
+ // { dg-final { scan-tree-dump-times {map\(struct:s \[len: 2\]\) map\(alloc:s\.ptr \[len: [0-9]+\]\) map\(tofrom:s\.size \[len: [0-9]+\]\) map\(tofrom:\*_[0-9]+ \[len: _[0-9]+\]\) map\(attach:s\.ptr \[bias: 0\]\)} 4 "gimple" } }
+ // { dg-final { scan-tree-dump-times {map\(struct:s \[len: 2\]\) map\(alloc:s\.ptr \[len: [0-9]+\]\) map\(to:s\.size \[len: [0-9]+\]\) map\(alloc:\*_[0-9]+ \[len: _[0-9]+\]\) map\(attach:s\.ptr \[bias: 0\]\)} 1 "gimple" } }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/gomp/declare-mapper-2.C gcc-16-20250601/gcc/testsuite/g++.dg/gomp/declare-mapper-2.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/gomp/declare-mapper-2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/gomp/declare-mapper-2.C	Sun Jun  1 22:32:19 2025
***************
*** 0 ****
--- 1,30 ----
+ // { dg-do compile }
+ 
+ // Error-checking tests for "omp declare mapper".
+ 
+ struct S {
+   int *ptr;
+   int size;
+ };
+ 
+ struct Z {
+   int z;
+ };
+ 
+ int main (int argc, char *argv[])
+ {
+ #pragma omp declare mapper (S v) map(v.size, v.ptr[:v.size]) // { dg-note "'#pragma omp declare mapper \\(S\\)' previously declared here" }
+ 
+   /* This one's a duplicate.  */
+ #pragma omp declare mapper (default: S v) map (to: v.size) map (v) // { dg-error "redeclaration of '#pragma omp declare mapper \\(S\\)'" }
+ 
+   /* ...and this one doesn't use a "base language identifier" for the mapper
+      name.  */
+ #pragma omp declare mapper (case: S v) map (to: v.size) // { dg-error "expected identifier or 'default' before 'case'" }
+   // { dg-error "expected ':' before 'case'" "" { target *-*-* } .-1 }
+ 
+   /* A non-struct/class/union type isn't supposed to work.  */
+ #pragma omp declare mapper (name:Z [5]foo) map (foo[0].z) // { dg-error "'Z \\\[5\\\]' is not a struct, union or class type in '#pragma omp declare mapper'" }
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/gomp/declare-mapper-3.C gcc-16-20250601/gcc/testsuite/g++.dg/gomp/declare-mapper-3.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/gomp/declare-mapper-3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/gomp/declare-mapper-3.C	Sun Jun  1 22:32:19 2025
***************
*** 0 ****
--- 1,39 ----
+ #pragma omp declare mapper (int v)  // { dg-error "missing 'map' clause before end of line" }
+ #pragma omp declare mapper (float v) map()  // { dg-error "expected primary-expression before '\\)' token" }
+ // { dg-error "'float' is not a struct, union or class type in '#pragma omp declare mapper'" "" { target *-*-* } .-1 }
+ 
+ #pragma omp declare mapper (char v) map(v)  // { dg-error "'char' is not a struct, union or class type in '#pragma omp declare mapper'" }
+ 
+ struct XT {
+   int x;
+ };
+ #pragma omp declare mapper (XT y) map()  // { dg-error "expected primary-expression before '\\)' token" }
+ 
+ struct t {
+   int x;
+ };
+ 
+ typedef struct t myStruct;
+ 
+ #pragma omp declare mapper(t) // { dg-error "expected unqualified-id before '\\)' token" }
+ #pragma omp declare mapper(struct t) // { dg-error "expected unqualified-id before '\\)' token" }
+ #pragma omp declare mapper(myStruct) // { dg-error "expected unqualified-id before '\\)' token" }
+ 
+ #pragma omp declare mapper(name : t v)  map() // { dg-error "expected primary-expression before '\\)' token" } 
+ 
+ #pragma omp declare mapper(fancy : struct t v) map(always,present,close,mapper(d),tofrom: v) // { dg-error "in 'declare mapper' directives, parameter to 'mapper' modifier must be 'default'" }
+ 
+ #pragma omp declare mapper(myStruct v) map(v, v.x)  // { dg-note "'#pragma omp declare mapper \\(myStruct\\)' previously declared here" }
+ #pragma omp declare mapper(default : t v) map(v, v.x) // { dg-error "redefinition of '#pragma omp declare mapper \\(t\\)'" }
+ 
+ 
+ class A { };
+ class B : public virtual A { };
+ 
+ #pragma omp declare mapper(class B ci) map(ci)  // { dg-error "'B' must not be a virtual base class in '#pragma omp declare mapper'" }
+ 
+ #pragma omp declare mapper(T v) mapper(v) // { dg-error "'T' does not name a type" }
+ 
+ union u_t { };
+ 
+ #pragma omp declare mapper(u_t v) map()  // { dg-error "expected primary-expression before '\\)' token" }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/gomp/target-4.C gcc-16-20250601/gcc/testsuite/g++.dg/gomp/target-4.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/gomp/target-4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/gomp/target-4.C	Sun Jun  1 22:32:19 2025
***************
*** 0 ****
--- 1,22 ----
+ // { dg-do compile { target c++11 } }
+ // PR c++/120413
+ 
+ struct S
+ {
+   S() {}
+   ~S() {}
+ };
+ 
+ struct array
+ {
+   S _arr[1];
+ };
+ 
+ int main()
+ {
+ #pragma omp target
+   {
+     array arr{};
+   }
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/modules/namespace-10_a.C gcc-16-20250601/gcc/testsuite/g++.dg/modules/namespace-10_a.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/modules/namespace-10_a.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/modules/namespace-10_a.C	Sun Jun  1 22:32:20 2025
***************
*** 0 ****
--- 1,11 ----
+ // { dg-additional-options -fmodules }
+ 
+ export module M1;
+ 
+ namespace A
+ {
+   export using AT = int;
+ }
+ 
+ export using namespace A;
+ inline AT var;
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/modules/namespace-10_b.C gcc-16-20250601/gcc/testsuite/g++.dg/modules/namespace-10_b.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/modules/namespace-10_b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/modules/namespace-10_b.C	Sun Jun  1 22:32:20 2025
***************
*** 0 ****
--- 1,9 ----
+ // { dg-additional-options "-fmodules" }
+ 
+ export module M2;
+ import M1;
+ 
+ namespace A
+ {
+   export using A::AT;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/modules/namespace-10_c.C gcc-16-20250601/gcc/testsuite/g++.dg/modules/namespace-10_c.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/modules/namespace-10_c.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/modules/namespace-10_c.C	Sun Jun  1 22:32:20 2025
***************
*** 0 ****
--- 1,6 ----
+ // { dg-additional-options -fmodules }
+ 
+ import M2;
+ 
+ A::AT var1;
+ AT var2;			// { dg-error "AT" }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/modules/namespace-11_a.C gcc-16-20250601/gcc/testsuite/g++.dg/modules/namespace-11_a.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/modules/namespace-11_a.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/modules/namespace-11_a.C	Sun Jun  1 22:32:20 2025
***************
*** 0 ****
--- 1,11 ----
+ // { dg-additional-options -fmodules }
+ 
+ export module M1;
+ 
+ namespace A
+ {
+   export using AT = int;
+ }
+ 
+ export using namespace A;
+ inline AT var;
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/modules/namespace-11_b.C gcc-16-20250601/gcc/testsuite/g++.dg/modules/namespace-11_b.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/modules/namespace-11_b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/modules/namespace-11_b.C	Sun Jun  1 22:32:20 2025
***************
*** 0 ****
--- 1,9 ----
+ // { dg-additional-options "-fmodules" }
+ 
+ export module M2;
+ export import M1;
+ 
+ namespace A
+ {
+   export using A::AT;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/modules/namespace-11_c.C gcc-16-20250601/gcc/testsuite/g++.dg/modules/namespace-11_c.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/modules/namespace-11_c.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/modules/namespace-11_c.C	Sun Jun  1 22:32:20 2025
***************
*** 0 ****
--- 1,6 ----
+ // { dg-additional-options -fmodules }
+ 
+ import M2;
+ 
+ A::AT var1;
+ AT var2;
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/modules/namespace-8_a.C gcc-16-20250601/gcc/testsuite/g++.dg/modules/namespace-8_a.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/modules/namespace-8_a.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/modules/namespace-8_a.C	Sun Jun  1 22:32:20 2025
***************
*** 0 ****
--- 1,12 ----
+ // { dg-additional-options "-fmodules" }
+ 
+ export module M;
+ 
+ export namespace B
+ {
+   int i;
+ }
+ export namespace C
+ {
+   using namespace B;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/modules/namespace-8_b.C gcc-16-20250601/gcc/testsuite/g++.dg/modules/namespace-8_b.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/modules/namespace-8_b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/modules/namespace-8_b.C	Sun Jun  1 22:32:20 2025
***************
*** 0 ****
--- 1,8 ----
+ // { dg-additional-options "-fmodules" }
+ 
+ import M;
+ 
+ int main()
+ {
+   C::i = 42;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/modules/namespace-9_a.C gcc-16-20250601/gcc/testsuite/g++.dg/modules/namespace-9_a.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/modules/namespace-9_a.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/modules/namespace-9_a.C	Sun Jun  1 22:32:20 2025
***************
*** 0 ****
--- 1,11 ----
+ // { dg-additional-options -fmodules }
+ 
+ export module M;
+ 
+ namespace A
+ {
+   export using AT = int;
+ }
+ 
+ using namespace A;
+ inline AT var;
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/modules/namespace-9_b.C gcc-16-20250601/gcc/testsuite/g++.dg/modules/namespace-9_b.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/modules/namespace-9_b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/modules/namespace-9_b.C	Sun Jun  1 22:32:20 2025
***************
*** 0 ****
--- 1,6 ----
+ // { dg-additional-options -fmodules }
+ 
+ import M;
+ 
+ A::AT var1;
+ AT var2;			// { dg-error "AT" }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/plugin/show-template-tree-color-labels.C gcc-16-20250601/gcc/testsuite/g++.dg/plugin/show-template-tree-color-labels.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/plugin/show-template-tree-color-labels.C	Sun May 25 22:32:08 2025
--- gcc-16-20250601/gcc/testsuite/g++.dg/plugin/show-template-tree-color-labels.C	Sun Jun  1 22:32:20 2025
*************** void test_1 (vector<double> vec)
*** 16,23 ****
    fn_1 (vec);
    /* { dg-begin-multiline-output "" }
  could not convert '[01m[Kvec[m[K' from '[01m[Kvector<[01;32m[Kdouble[m[K>[m[K' to '[01m[Kvector<[01;34m[Kint[m[K>[m[K'
!    fn_1 ([01;32m[Kv[m[K[01;32m[Ke[m[K[01;32m[Kc[m[K);
!          [01;32m[K^[m[K[01;32m[K~[m[K[01;32m[K~[m[K
           [01;32m[K|[m[K
           [01;32m[Kvector<double>[m[K
       { dg-end-multiline-output "" } */
--- 16,23 ----
    fn_1 (vec);
    /* { dg-begin-multiline-output "" }
  could not convert '[01m[Kvec[m[K' from '[01m[Kvector<[01;32m[Kdouble[m[K>[m[K' to '[01m[Kvector<[01;34m[Kint[m[K>[m[K'
!    fn_1 ([01;32m[Kvec[m[K);
!          [01;32m[K^~~[m[K
           [01;32m[K|[m[K
           [01;32m[Kvector<double>[m[K
       { dg-end-multiline-output "" } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/tree-ssa/pr117965-1.C gcc-16-20250601/gcc/testsuite/g++.dg/tree-ssa/pr117965-1.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/tree-ssa/pr117965-1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/tree-ssa/pr117965-1.C	Sun Jun  1 22:32:21 2025
***************
*** 0 ****
--- 1,28 ----
+ // { dg-do compile }
+ // { dg-options "-O2 -fdump-tree-phiopt1" }
+ 
+ void f();
+ void f(int&);
+ 
+ static inline const int &
+ clamp(const int &v, const int &min, const int &max)
+ {
+   const int &t = (v > min) ? v : min;
+   return t > max ? max : t;
+ }
+ 
+ void clamp2(int num1) {
+   try {
+   int low = -12, high = 12;
+   f();
+   num1 = clamp(num1, low, high);
+   f(num1);
+   } catch(...)
+   {
+        __builtin_printf("caught.\n");
+         return;
+   }
+ }
+ 
+ // { dg-final { scan-tree-dump-times "MAX" 1 "phiopt1" } } */
+ // { dg-final { scan-tree-dump-times "MIN" 1 "phiopt1" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.dg/tree-ssa/pr117965-2.C gcc-16-20250601/gcc/testsuite/g++.dg/tree-ssa/pr117965-2.C
*** gcc-16-20250525/gcc/testsuite/g++.dg/tree-ssa/pr117965-2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.dg/tree-ssa/pr117965-2.C	Sun Jun  1 22:32:21 2025
***************
*** 0 ****
--- 1,19 ----
+ // { dg-do compile { target c++17 } }
+ // { dg-options "-O2 -fdump-tree-phiopt1" }
+ 
+ #include <iostream>
+ #include <algorithm>
+ 
+ void clamp2 ()
+ {
+   float low = -1.0f, high = 1.0f;
+   float num1, num2, num3;
+   std::cin >> num1;
+   num1 = std::clamp(num1, low, high);
+   std::cout << num1;
+ }
+ 
+ // { dg-final { scan-tree-dump-times " < -1.0" 1 "phiopt1" } }
+ // { dg-final { scan-tree-dump-times " \\\? -1.0e\\\+0 : " 1 "phiopt1" } }
+ // { dg-final { scan-tree-dump-times " > 1.0" 1 "phiopt1" } }
+ // { dg-final { scan-tree-dump-times " \\\? 1.0e\\\+0 : " 1 "phiopt1" } }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.target/i386/mv-symbols1.C gcc-16-20250601/gcc/testsuite/g++.target/i386/mv-symbols1.C
*** gcc-16-20250525/gcc/testsuite/g++.target/i386/mv-symbols1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.target/i386/mv-symbols1.C	Sun Jun  1 22:32:21 2025
***************
*** 0 ****
--- 1,68 ----
+ /* { dg-do compile } */
+ /* { dg-require-ifunc "" } */
+ /* { dg-options "-O0" } */
+ 
+ __attribute__((target("default")))
+ int foo ()
+ {
+   return 1;
+ }
+ 
+ __attribute__((target("arch=slm")))
+ int foo ()
+ {
+   return 3;
+ }
+ 
+ __attribute__((target("sse4.2")))
+ int foo ()
+ {
+   return 5;
+ }
+ 
+ __attribute__((target("sse4.2")))
+ int foo (int)
+ {
+   return 6;
+ }
+ 
+ __attribute__((target("arch=slm")))
+ int foo (int)
+ {
+   return 4;
+ }
+ 
+ __attribute__((target("default")))
+ int foo (int)
+ {
+   return 2;
+ }
+ 
+ int bar()
+ {
+   return foo ();
+ }
+ 
+ int bar(int x)
+ {
+   return foo (x);
+ }
+ 
+ /* When updating any of the symbol names in these tests, make sure to also
+    update any tests for their absence in mvc-symbolsN.C */
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3foov:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.arch_slm:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.sse4.2:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.resolver:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\tcall\t_Z7_Z3foovv\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z7_Z3foovv, @gnu_indirect_function\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z7_Z3foovv,_Z3foov\.resolver\n" 1 } } */
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3fooi:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.arch_slm:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.sse4.2:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.resolver:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\tcall\t_Z7_Z3fooii\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z7_Z3fooii, @gnu_indirect_function\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z7_Z3fooii,_Z3fooi\.resolver\n" 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.target/i386/mv-symbols2.C gcc-16-20250601/gcc/testsuite/g++.target/i386/mv-symbols2.C
*** gcc-16-20250525/gcc/testsuite/g++.target/i386/mv-symbols2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.target/i386/mv-symbols2.C	Sun Jun  1 22:32:21 2025
***************
*** 0 ****
--- 1,56 ----
+ /* { dg-do compile } */
+ /* { dg-require-ifunc "" } */
+ /* { dg-options "-O0" } */
+ 
+ __attribute__((target("default")))
+ int foo ()
+ {
+   return 1;
+ }
+ 
+ __attribute__((target("arch=slm")))
+ int foo ()
+ {
+   return 3;
+ }
+ 
+ __attribute__((target("sse4.2")))
+ int foo ()
+ {
+   return 5;
+ }
+ 
+ __attribute__((target("sse4.2")))
+ int foo (int)
+ {
+   return 6;
+ }
+ 
+ __attribute__((target("arch=slm")))
+ int foo (int)
+ {
+   return 4;
+ }
+ 
+ __attribute__((target("default")))
+ int foo (int)
+ {
+   return 2;
+ }
+ 
+ /* When updating any of the symbol names in these tests, make sure to also
+    update any tests for their absence in mvc-symbolsN.C */
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3foov:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.arch_slm:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.sse4.2:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.resolver:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z7_Z3foovv, @gnu_indirect_function\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z7_Z3foovv,_Z3foov\.resolver\n" 0 } } */
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3fooi:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.arch_slm:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.sse4.2:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.resolver:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z7_Z3fooii, @gnu_indirect_function\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z7_Z3fooii,_Z3fooi\.resolver\n" 0 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.target/i386/mv-symbols3.C gcc-16-20250601/gcc/testsuite/g++.target/i386/mv-symbols3.C
*** gcc-16-20250525/gcc/testsuite/g++.target/i386/mv-symbols3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.target/i386/mv-symbols3.C	Sun Jun  1 22:32:21 2025
***************
*** 0 ****
--- 1,44 ----
+ /* { dg-do compile } */
+ /* { dg-require-ifunc "" } */
+ /* { dg-options "-O0" } */
+ 
+ __attribute__((target("default")))
+ int foo ();
+ 
+ __attribute__((target("arch=slm")))
+ int foo ();
+ 
+ __attribute__((target("sse4.2")))
+ int foo ();
+ 
+ __attribute__((target("sse4.2")))
+ int foo (int);
+ 
+ __attribute__((target("arch=slm")))
+ int foo (int);
+ 
+ __attribute__((target("default")))
+ int foo (int);
+ 
+ int bar()
+ {
+   return foo ();
+ }
+ 
+ /* When updating any of the symbol names in these tests, make sure to also
+    update any tests for their absence in mvc-symbolsN.C */
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3foov:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.arch_slm:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.sse4.2:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.resolver:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\tcall\t_Z7_Z3foovv\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z7_Z3foovv, @gnu_indirect_function\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z7_Z3foovv,_Z3foov\.resolver\n" 1 } } */
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3fooi:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.arch_slm:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.sse4.2:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.resolver:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z7_Z3fooii, @gnu_indirect_function\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z7_Z3fooii,_Z3fooi\.resolver\n" 0 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.target/i386/mv-symbols4.C gcc-16-20250601/gcc/testsuite/g++.target/i386/mv-symbols4.C
*** gcc-16-20250525/gcc/testsuite/g++.target/i386/mv-symbols4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.target/i386/mv-symbols4.C	Sun Jun  1 22:32:21 2025
***************
*** 0 ****
--- 1,50 ----
+ /* { dg-do compile } */
+ /* { dg-require-ifunc "" } */
+ /* { dg-options "-O0" } */
+ 
+ __attribute__((target("default")))
+ int foo ()
+ {
+   return 1;
+ }
+ 
+ __attribute__((target("arch=slm")))
+ int foo ();
+ 
+ __attribute__((target("sse4.2")))
+ int foo ();
+ 
+ __attribute__((target("sse4.2")))
+ int foo (int);
+ 
+ __attribute__((target("arch=slm")))
+ int foo (int);
+ 
+ __attribute__((target("default")))
+ int foo (int)
+ {
+   return 2;
+ }
+ 
+ int bar()
+ {
+   return foo ();
+ }
+ 
+ /* When updating any of the symbol names in these tests, make sure to also
+    update any tests for their absence in mvc-symbolsN.C */
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3foov:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.arch_slm:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.sse4.2:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.resolver:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\tcall\t_Z7_Z3foovv\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z7_Z3foovv, @gnu_indirect_function\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z7_Z3foovv,_Z3foov\.resolver\n" 1 } } */
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3fooi:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.arch_slm:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.sse4.2:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.resolver:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z7_Z3fooii, @gnu_indirect_function\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z7_Z3fooii,_Z3fooi\.resolver\n" 0 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.target/i386/mv-symbols5.C gcc-16-20250601/gcc/testsuite/g++.target/i386/mv-symbols5.C
*** gcc-16-20250525/gcc/testsuite/g++.target/i386/mv-symbols5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.target/i386/mv-symbols5.C	Sun Jun  1 22:32:21 2025
***************
*** 0 ****
--- 1,56 ----
+ /* { dg-do compile } */
+ /* { dg-require-ifunc "" } */
+ /* { dg-options "-O0" } */
+ 
+ __attribute__((target("default")))
+ int foo ();
+ 
+ __attribute__((target("arch=slm")))
+ int foo ()
+ {
+   return 3;
+ }
+ 
+ __attribute__((target("sse4.2")))
+ int foo ()
+ {
+   return 5;
+ }
+ 
+ __attribute__((target("sse4.2")))
+ int foo (int)
+ {
+   return 6;
+ }
+ 
+ __attribute__((target("arch=slm")))
+ int foo (int)
+ {
+   return 4;
+ }
+ 
+ __attribute__((target("default")))
+ int foo (int);
+ 
+ int bar()
+ {
+   return foo ();
+ }
+ 
+ /* When updating any of the symbol names in these tests, make sure to also
+    update any tests for their absence in mvc-symbolsN.C */
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3foov:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.arch_slm:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.sse4.2:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.resolver:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\tcall\t_Z7_Z3foovv\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z7_Z3foovv, @gnu_indirect_function\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z7_Z3foovv,_Z3foov\.resolver\n" 1 } } */
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3fooi:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.arch_slm:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.sse4.2:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.resolver:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z7_Z3fooii, @gnu_indirect_function\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z7_Z3fooii,_Z3fooi\.resolver\n" 0 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.target/i386/mvc-symbols1.C gcc-16-20250601/gcc/testsuite/g++.target/i386/mvc-symbols1.C
*** gcc-16-20250525/gcc/testsuite/g++.target/i386/mvc-symbols1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.target/i386/mvc-symbols1.C	Sun Jun  1 22:32:21 2025
***************
*** 0 ****
--- 1,44 ----
+ /* { dg-do compile } */
+ /* { dg-require-ifunc "" } */
+ /* { dg-options "-O0" } */
+ 
+ __attribute__((target_clones("default", "arch=slm", "sse4.2")))
+ int foo ()
+ {
+   return 1;
+ }
+ 
+ __attribute__((target_clones("sse4.2", "arch=slm", "default")))
+ int foo (int)
+ {
+   return 2;
+ }
+ 
+ int bar()
+ {
+   return foo ();
+ }
+ 
+ int bar(int x)
+ {
+   return foo (x);
+ }
+ 
+ /* When updating any of the symbol names in these tests, make sure to also
+    update any tests for their absence in mvc-symbolsN.C */
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.default:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.arch_slm:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.sse4_2:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.resolver:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\tcall\t_Z3foov\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z3foov, @gnu_indirect_function\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z3foov,_Z3foov\.resolver\n" 1 } } */
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3fooi.default:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.arch_slm:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.sse4_2:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.resolver:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\tcall\t_Z3fooi\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z3fooi, @gnu_indirect_function\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z3fooi,_Z3fooi\.resolver\n" 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.target/i386/mvc-symbols2.C gcc-16-20250601/gcc/testsuite/g++.target/i386/mvc-symbols2.C
*** gcc-16-20250525/gcc/testsuite/g++.target/i386/mvc-symbols2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.target/i386/mvc-symbols2.C	Sun Jun  1 22:32:21 2025
***************
*** 0 ****
--- 1,29 ----
+ /* { dg-do compile } */
+ /* { dg-require-ifunc "" } */
+ /* { dg-options "-O0" } */
+ 
+ __attribute__((target_clones("default", "arch=slm", "sse4.2")))
+ int foo ()
+ {
+   return 1;
+ }
+ 
+ __attribute__((target_clones("sse4.2", "arch=slm", "default")))
+ int foo (int)
+ {
+   return 2;
+ }
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.default:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.arch_slm:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.sse4_2:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.resolver:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z3foov, @gnu_indirect_function\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z3foov,_Z3foov\.resolver\n" 1 } } */
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3fooi.default:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.arch_slm:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.sse4_2:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.resolver:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z3fooi, @gnu_indirect_function\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z3fooi,_Z3fooi\.resolver\n" 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.target/i386/mvc-symbols3.C gcc-16-20250601/gcc/testsuite/g++.target/i386/mvc-symbols3.C
*** gcc-16-20250525/gcc/testsuite/g++.target/i386/mvc-symbols3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.target/i386/mvc-symbols3.C	Sun Jun  1 22:32:21 2025
***************
*** 0 ****
--- 1,35 ----
+ /* { dg-do compile } */
+ /* { dg-require-ifunc "" } */
+ /* { dg-options "-O0" } */
+ 
+ __attribute__((target_clones("default", "arch=slm", "sse4.2")))
+ int foo ();
+ 
+ __attribute__((target_clones("sse4.2", "arch=slm", "default")))
+ int foo (int);
+ 
+ int bar()
+ {
+   return foo ();
+ }
+ 
+ int bar(int x)
+ {
+   return foo (x);
+ }
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.default:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.arch_slm:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.sse4_2:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.resolver:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\tcall\t_Z3foov\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z3foov, @gnu_indirect_function\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z3foov,_Z3foov\.resolver\n" 1 } } */
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3fooi.default:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.arch_slm:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.sse4_2:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.resolver:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\tcall\t_Z3fooi\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z3fooi, @gnu_indirect_function\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z3fooi,_Z3fooi\.resolver\n" 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.target/i386/mvc-symbols4.C gcc-16-20250601/gcc/testsuite/g++.target/i386/mvc-symbols4.C
*** gcc-16-20250525/gcc/testsuite/g++.target/i386/mvc-symbols4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.target/i386/mvc-symbols4.C	Sun Jun  1 22:32:21 2025
***************
*** 0 ****
--- 1,23 ----
+ /* { dg-do compile } */
+ /* { dg-require-ifunc "" } */
+ /* { dg-options "-O0" } */
+ 
+ __attribute__((target_clones("default", "arch=slm", "sse4.2")))
+ int foo ();
+ 
+ __attribute__((target_clones("sse4.2", "arch=slm", "default")))
+ int foo (int);
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.default:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.arch_slm:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.sse4_2:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.resolver:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z3foov, @gnu_indirect_function\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z3foov,_Z3foov\.resolver\n" 0 } } */
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3fooi.default:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.arch_slm:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.sse4_2:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.resolver:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z3fooi, @gnu_indirect_function\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z3fooi,_Z3fooi\.resolver\n" 0 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.target/powerpc/mvc-symbols1.C gcc-16-20250601/gcc/testsuite/g++.target/powerpc/mvc-symbols1.C
*** gcc-16-20250525/gcc/testsuite/g++.target/powerpc/mvc-symbols1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.target/powerpc/mvc-symbols1.C	Sun Jun  1 22:32:22 2025
***************
*** 0 ****
--- 1,47 ----
+ /* { dg-do compile } */
+ /* { dg-require-ifunc "" } */
+ /* { dg-options "-O0" } */
+ 
+ __attribute__((target_clones("default", "cpu=power6", "cpu=power6x")))
+ int foo ()
+ {
+   return 1;
+ }
+ 
+ __attribute__((target_clones("cpu=power6x", "cpu=power6", "default")))
+ int foo (int)
+ {
+   return 2;
+ }
+ 
+ int bar()
+ {
+   return foo ();
+ }
+ 
+ int bar(int x)
+ {
+   return foo (x);
+ }
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.default:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.cpu_power6:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.cpu_power6x:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.resolver:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\tbl _Z3foov\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z3foov, @gnu_indirect_function\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z3foov,_Z3foov\.resolver\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.quad\t_Z3foov\.default\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.quad\t_Z3foov\.cpu_power6\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.quad\t_Z3foov\.cpu_power6x\n" 0 } } */
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.default:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.cpu_power6:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.cpu_power6x:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.resolver:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\tbl _Z3fooi\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z3fooi, @gnu_indirect_function\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z3fooi,_Z3fooi\.resolver\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.quad\t_Z3fooi\.default\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.quad\t_Z3fooi\.cpu_power6\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.quad\t_Z3fooi\.cpu_power6x\n" 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.target/powerpc/mvc-symbols2.C gcc-16-20250601/gcc/testsuite/g++.target/powerpc/mvc-symbols2.C
*** gcc-16-20250525/gcc/testsuite/g++.target/powerpc/mvc-symbols2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.target/powerpc/mvc-symbols2.C	Sun Jun  1 22:32:22 2025
***************
*** 0 ****
--- 1,35 ----
+ /* { dg-do compile } */
+ /* { dg-require-ifunc "" } */
+ /* { dg-options "-O0" } */
+ 
+ __attribute__((target_clones("default", "cpu=power6", "cpu=power6x")))
+ int foo ()
+ {
+   return 1;
+ }
+ 
+ __attribute__((target_clones("cpu=power6x", "cpu=power6", "default")))
+ int foo (int)
+ {
+   return 2;
+ }
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.default:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.cpu_power6:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.cpu_power6x:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.resolver:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z3foov, @gnu_indirect_function\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z3foov,_Z3foov\.resolver\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.quad\t_Z3foov\.default\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.quad\t_Z3foov\.cpu_power6\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.quad\t_Z3foov\.cpu_power6x\n" 0 } } */
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.default:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.cpu_power6:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.cpu_power6x:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.resolver:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z3fooi, @gnu_indirect_function\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z3fooi,_Z3fooi\.resolver\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.quad\t_Z3fooi\.default\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.quad\t_Z3fooi\.cpu_power6\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.quad\t_Z3fooi\.cpu_power6x\n" 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.target/powerpc/mvc-symbols3.C gcc-16-20250601/gcc/testsuite/g++.target/powerpc/mvc-symbols3.C
*** gcc-16-20250525/gcc/testsuite/g++.target/powerpc/mvc-symbols3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.target/powerpc/mvc-symbols3.C	Sun Jun  1 22:32:22 2025
***************
*** 0 ****
--- 1,41 ----
+ /* { dg-do compile } */
+ /* { dg-require-ifunc "" } */
+ /* { dg-options "-O0" } */
+ 
+ __attribute__((target_clones("default", "cpu=power6", "cpu=power6x")))
+ int foo ();
+ 
+ __attribute__((target_clones("cpu=power6x", "cpu=power6", "default")))
+ int foo (int);
+ 
+ int bar()
+ {
+   return foo ();
+ }
+ 
+ int bar(int x)
+ {
+   return foo (x);
+ }
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.default:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.cpu_power6:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.cpu_power6x:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.resolver:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\tbl _Z3foov\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z3foov, @gnu_indirect_function\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z3foov,_Z3foov\.resolver\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.quad\t_Z3foov\.default\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.quad\t_Z3foov\.cpu_power6\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.quad\t_Z3foov\.cpu_power6x\n" 0 } } */
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.default:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.cpu_power6:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.cpu_power6x:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.resolver:\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\tbl _Z3fooi\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z3fooi, @gnu_indirect_function\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z3fooi,_Z3fooi\.resolver\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.quad\t_Z3foov\.default\n" 1 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.quad\t_Z3fooi\.cpu_power6\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.quad\t_Z3fooi\.cpu_power6x\n" 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/g++.target/powerpc/mvc-symbols4.C gcc-16-20250601/gcc/testsuite/g++.target/powerpc/mvc-symbols4.C
*** gcc-16-20250525/gcc/testsuite/g++.target/powerpc/mvc-symbols4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/g++.target/powerpc/mvc-symbols4.C	Sun Jun  1 22:32:22 2025
***************
*** 0 ****
--- 1,29 ----
+ /* { dg-do compile } */
+ /* { dg-require-ifunc "" } */
+ /* { dg-options "-O0" } */
+ 
+ __attribute__((target_clones("default", "cpu=power6", "cpu=power6x")))
+ int foo ();
+ 
+ __attribute__((target_clones("cpu=power6x", "cpu=power6", "default")))
+ int foo (int);
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.default:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.cpu_power6:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.cpu_power6x:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3foov\.resolver:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z3foov, @gnu_indirect_function\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z3foov,_Z3foov\.resolver\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\tlis \[\\d\]+,_Z3foov\.default@ha\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\tlis \[\\d\]+,_Z3foov\.cpu_power6@ha\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\tlis \[\\d\]+,_Z3foov\.cpu_power6x@ha\n" 0 } } */
+ 
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.default:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.cpu_power6:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.cpu_power6x:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n_Z3fooi\.resolver:\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.type\t_Z3fooi, @gnu_indirect_function\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\t\.set\t_Z3fooi,_Z3fooi\.resolver\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\tlis \[\\d\]+,_Z3fooi\.default@ha\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\tlis \[\\d\]+,_Z3fooi\.cpu_power6@ha\n" 0 } } */
+ /* { dg-final { scan-assembler-times "\n\tlis \[\\d\]+,_Z3fooi\.cpu_power6x@ha\n" 0 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/bad-binary-ops-highlight-colors.c gcc-16-20250601/gcc/testsuite/gcc.dg/bad-binary-ops-highlight-colors.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/bad-binary-ops-highlight-colors.c	Sun May 25 22:32:09 2025
--- gcc-16-20250601/gcc/testsuite/gcc.dg/bad-binary-ops-highlight-colors.c	Sun Jun  1 22:32:23 2025
*************** int test_4 (void)
*** 23,30 ****
       { dg-end-multiline-output "" } */
  
    /* { dg-begin-multiline-output "" }
!    return [01;32m[Kc[m[K[01;32m[Ka[m[K[01;32m[Kl[m[K[01;32m[Kl[m[K[01;32m[Ke[m[K[01;32m[Ke[m[K[01;32m[K_[m[K[01;32m[K4[m[K[01;32m[Ka[m[K[01;32m[K [m[K[01;32m[K([m[K[01;32m[K)[m[K [01;31m[K+[m[K [01;34m[Kc[m[K[01;34m[Ka[m[K[01;34m[Kl[m[K[01;34m[Kl[m[K[01;34m[Ke[m[K[01;34m[Ke[m[K[01;34m[K_[m[K[01;34m[K4[m[K[01;34m[Kb[m[K[01;34m[K [m[K[01;34m[K([m[K[01;34m[K)[m[K;
!           [01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K[01;32m[K~[m[K [01;31m[K^[m[K [01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K
            [01;32m[K|[m[K              [01;34m[K|[m[K
            [01;32m[K|[m[K              [01;34m[KT {aka struct t}[m[K
            [01;32m[KS {aka struct s}[m[K
--- 23,30 ----
       { dg-end-multiline-output "" } */
  
    /* { dg-begin-multiline-output "" }
!    return [01;32m[Kcallee_4a ()[m[K [01;31m[K+[m[K [01;34m[Kcallee_4b ()[m[K;
!           [01;32m[K~~~~~~~~~~~~[m[K [01;31m[K^[m[K [01;34m[K~~~~~~~~~~~~[m[K
            [01;32m[K|[m[K              [01;34m[K|[m[K
            [01;32m[K|[m[K              [01;34m[KT {aka struct t}[m[K
            [01;32m[KS {aka struct s}[m[K
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/countof-compat.c gcc-16-20250601/gcc/testsuite/gcc.dg/countof-compat.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/countof-compat.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/countof-compat.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,8 ----
+ /* { dg-do compile } */
+ /* { dg-options "-std=c2y -pedantic-errors -Wc23-c2y-compat" } */
+ 
+ #include <stdcountof.h>
+ 
+ int a[1];
+ int b[countof(a)];
+ int c[_Countof(a)];  /* { dg-warning "ISO C does not support" } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/countof-compile.c gcc-16-20250601/gcc/testsuite/gcc.dg/countof-compile.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/countof-compile.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/countof-compile.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,124 ----
+ /* { dg-do compile } */
+ /* { dg-options "-std=c2y -pedantic-errors" } */
+ 
+ #define NULL  ((void *) 0)
+ 
+ extern int x[];
+ 
+ static int w[] = {1, 2, 3};
+ 
+ void
+ completed (void)
+ {
+   int i = 42;
+   int a[] = {1, 2, i};
+ 
+   _Static_assert(_Countof (w) == 3);
+   _Static_assert(_Countof (a) == 3);
+ }
+ 
+ void
+ incomplete (int p[])
+ {
+   _Countof (x);  /* { dg-error "incomplete" } */
+ 
+   /* We want to support array parameters in the future,
+      which should change this from "invalid" to "incomplete".  */
+   _Countof (p);  /* { dg-error "invalid" } */
+ }
+ 
+ void
+ fam (void)
+ {
+   struct {
+     int x;
+     int fam[];
+   } s;
+ 
+   _Countof (s.fam); /* { dg-error "incomplete" } */
+ }
+ 
+ void
+ param (int n, int p[n])
+ {
+   /* We want to support array parameters in the future,
+      which would make this work.  */
+   _Countof (p);  /* { dg-error "invalid" } */
+ }
+ 
+ void fix_fix (int i, char (*a)[3][5], int (*x)[_Countof (*a)],
+ 	      short (*)[_Generic(x, int (*)[3]: 1)]);
+ void fix_var (int i, char (*a)[3][i], int (*x)[_Countof (*a)],
+ 	      short (*)[_Generic(x, int (*)[3]: 1)]);
+ void fix_uns (int i, char (*a)[3][*], int (*x)[_Countof (*a)],
+ 	      short (*)[_Generic(x, int (*)[3]: 1)]);
+ 
+ void
+ func (void)
+ {
+   int  i3[3];
+   int  i5[5];
+   char c35[3][5];
+ 
+   fix_fix (5, &c35, &i3, NULL);
+   fix_fix (5, &c35, &i5, NULL); /* { dg-error "incompatible-pointer-types" } */
+ 
+   fix_var (5, &c35, &i3, NULL);
+   fix_var (5, &c35, &i5, NULL); /* { dg-error "incompatible-pointer-types" } */
+ 
+   fix_uns (5, &c35, &i3, NULL);
+   fix_uns (5, &c35, &i5, NULL); /* { dg-error "incompatible-pointer-types" } */
+ }
+ 
+ void
+ non_arr(void)
+ {
+   int x;
+   int *p;
+   struct s {
+     int x[3];
+   } s;
+ 
+   _Countof (x); /* { dg-error "invalid" } */
+   _Countof (int); /* { dg-error "invalid" } */
+   _Countof (s); /* { dg-error "invalid" } */
+   _Countof (struct s); /* { dg-error "invalid" } */
+   _Countof (&x); /* { dg-error "invalid" } */
+   _Countof (p); /* { dg-error "invalid" } */
+   _Countof (int *); /* { dg-error "invalid" } */
+   _Countof (&s.x); /* { dg-error "invalid" } */
+   _Countof (int (*)[3]); /* { dg-error "invalid" } */
+ }
+ 
+ static int f1();
+ static int f2(); /* { dg-error "never defined" } */
+ int a[10][9];
+ int n;
+ 
+ void
+ syms(void)
+ {
+   int b[n][n];
+ 
+   _Countof (a[f1()]);
+   _Countof (b[f2()]);
+ }
+ 
+ void
+ no_parens(void)
+ {
+   _Static_assert(_Countof a == 10);
+   _Static_assert(_Countof *a == 9);
+   _Static_assert(_Countof (int [3]) {} == 3);
+ 
+   _Countof int [3]; /* { dg-error "expected expression before" } */
+ }
+ 
+ void
+ const_expr(void)
+ {
+   int n = 7;
+ 
+   _Static_assert (_Countof (int [3][n]) == 3);
+   _Static_assert (_Countof (int [n][3]) == 7); /* { dg-error "not constant" } */
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/countof-no-compat.c gcc-16-20250601/gcc/testsuite/gcc.dg/countof-no-compat.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/countof-no-compat.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/countof-no-compat.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,5 ----
+ /* { dg-do compile } */
+ /* { dg-options "-std=c23 -pedantic-errors -Wno-c23-c2y-compat" } */
+ 
+ int a[1];
+ int b[_Countof(a)];
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/countof-pedantic-errors.c gcc-16-20250601/gcc/testsuite/gcc.dg/countof-pedantic-errors.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/countof-pedantic-errors.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/countof-pedantic-errors.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,8 ----
+ /* { dg-do compile } */
+ /* { dg-options "-std=c23 -pedantic-errors" } */
+ 
+ #include <stdcountof.h>
+ 
+ int a[1];
+ int b[countof(a)];
+ int c[_Countof(a)];  /* { dg-error "ISO C does not support" } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/countof-pedantic.c gcc-16-20250601/gcc/testsuite/gcc.dg/countof-pedantic.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/countof-pedantic.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/countof-pedantic.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,8 ----
+ /* { dg-do compile } */
+ /* { dg-options "-std=c23 -pedantic" } */
+ 
+ #include <stdcountof.h>
+ 
+ int a[1];
+ int b[countof(a)];
+ int c[_Countof(a)];  /* { dg-warning "ISO C does not support" } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/countof-stdcountof.c gcc-16-20250601/gcc/testsuite/gcc.dg/countof-stdcountof.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/countof-stdcountof.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/countof-stdcountof.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,24 ----
+ /* { dg-do run } */
+ /* { dg-options "-std=c2y -pedantic-errors" } */
+ 
+ #include <stdcountof.h>
+ 
+ #define assert(e)  ((e) ? (void) 0 : __builtin_abort ())
+ 
+ extern int strcmp (const char *, const char *);
+ 
+ #ifndef countof
+ #error "countof not defined"
+ #endif
+ 
+ int a[3];
+ int b[countof a];
+ 
+ #define str(x) #x
+ #define xstr(x) str(x)
+ 
+ int
+ main (void)
+ {
+   assert (strcmp (xstr(countof), "_Countof") == 0);
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/countof-vla.c gcc-16-20250601/gcc/testsuite/gcc.dg/countof-vla.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/countof-vla.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/countof-vla.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,35 ----
+ /* { dg-do compile } */
+ /* { dg-options "-std=c2y -pedantic-errors -Wvla-parameter" } */
+ 
+ void fix_fix (int i,
+ 	      char (*a)[3][5],
+ 	      int (*x)[_Countof (*a)],
+ 	      short (*)[_Generic(x, int (*)[3]: 1)]);
+ void fix_var (int i,
+ 	      char (*a)[3][i], /* dg-warn "variable" */
+ 	      int (*x)[_Countof (*a)],
+ 	      short (*)[_Generic(x, int (*)[3]: 1)]);
+ void fix_uns (int i,
+ 	      char (*a)[3][*],
+ 	      int (*x)[_Countof (*a)],
+ 	      short (*)[_Generic(x, int (*)[3]: 1)]);
+ 
+ void var_fix (int i,
+ 	      char (*a)[i][5], /* dg-warn "variable" */
+ 	      int (*x)[_Countof (*a)]); /* dg-warn "variable" */
+ void var_var (int i,
+ 	      char (*a)[i][i], /* dg-warn "variable" */
+ 	      int (*x)[_Countof (*a)]); /* dg-warn "variable" */
+ void var_uns (int i,
+ 	      char (*a)[i][*], /* dg-warn "variable" */
+ 	      int (*x)[_Countof (*a)]); /* dg-warn "variable" */
+ 
+ void uns_fix (int i,
+ 	      char (*a)[*][5],
+ 	      int (*x)[_Countof (*a)]);
+ void uns_var (int i,
+ 	      char (*a)[*][i], /* dg-warn "variable" */
+ 	      int (*x)[_Countof (*a)]);
+ void uns_uns (int i,
+ 	      char (*a)[*][*],
+ 	      int (*x)[_Countof (*a)]);
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/countof-vmt.c gcc-16-20250601/gcc/testsuite/gcc.dg/countof-vmt.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/countof-vmt.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/countof-vmt.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,20 ----
+ /* { dg-do run } */
+ /* { dg-options "-std=gnu2y" } */
+ 
+ #define assert(e)  ((e) ? (void) 0 : __builtin_abort ())
+ 
+ void
+ inner_vla_noeval (void)
+ {
+   int i;
+ 
+   i = 3;
+   static_assert (_Countof (struct {int x[i++];}[3]) == 3);
+   assert (i == 3);
+ }
+ 
+ int
+ main (void)
+ {
+   inner_vla_noeval ();
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/countof-zero-compile.c gcc-16-20250601/gcc/testsuite/gcc.dg/countof-zero-compile.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/countof-zero-compile.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/countof-zero-compile.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,38 ----
+ /* { dg-do compile } */
+ /* { dg-options "-std=gnu2y" } */
+ 
+ static int z[0];
+ static int y[_Countof (z)];
+ 
+ _Static_assert(_Countof (y) == 0);
+ 
+ void
+ completed (void)
+ {
+   int z[] = {};
+ 
+   static_assert (_Countof (z) == 0);
+ }
+ 
+ void zro_fix (int i,
+ 	      char (*a)[0][5],
+ 	      int (*x)[_Countof (*a)],
+ 	      short (*)[_Generic(x, int (*)[0]: 1)]);
+ void zro_var (int i,
+ 	      char (*a)[0][i], /* dg-warn "variable" */
+ 	      int (*x)[_Countof (*a)],
+ 	      short (*)[_Generic(x, int (*)[0]: 1)]);
+ void zro_uns (int i,
+ 	      char (*a)[0][*],
+ 	      int (*x)[_Countof (*a)],
+ 	      short (*)[_Generic(x, int (*)[0]: 1)]);
+ 
+ void
+ const_expr(void)
+ {
+   int n = 7;
+ 
+   _Static_assert (_Countof (int [0][3]) == 0);
+   _Static_assert (_Countof (int [0]) == 0);
+   _Static_assert (_Countof (int [0][n]) == 0);
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/countof-zero.c gcc-16-20250601/gcc/testsuite/gcc.dg/countof-zero.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/countof-zero.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/countof-zero.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,31 ----
+ /* { dg-do run } */
+ /* { dg-options "-std=gnu2y" } */
+ 
+ #define assert(e)  ((e) ? (void) 0 : __builtin_abort ())
+ 
+ void
+ vla (void)
+ {
+   unsigned n;
+ 
+   n = 0;
+   int z[n];
+   assert (_Countof (z) == 0);
+ }
+ 
+ void
+ matrix_vla (void)
+ {
+   int i;
+ 
+   i = 0;
+   assert (_Countof (int [i++][4]) == 0);
+   assert (i == 0 + 1);
+ }
+ 
+ int
+ main (void)
+ {
+   vla ();
+   matrix_vla ();
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/countof.c gcc-16-20250601/gcc/testsuite/gcc.dg/countof.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/countof.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/countof.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,120 ----
+ /* { dg-do run } */
+ /* { dg-options "-std=c2y -pedantic-errors" } */
+ 
+ #define assert(e)  ((e) ? (void) 0 : __builtin_abort ())
+ 
+ void
+ array (void)
+ {
+   short a[7];
+ 
+   static_assert (_Countof (a) == 7);
+   static_assert (_Countof (unsigned [99]) == 99);
+ }
+ 
+ void
+ completed (void)
+ {
+   int a[] = {1, 2, 3};
+ 
+   static_assert (_Countof (a) == 3);
+ }
+ 
+ void
+ vla (void)
+ {
+   unsigned n;
+ 
+   n = 99;
+   assert (_Countof (short [n - 10]) == 99 - 10);
+ 
+   int v[n / 2];
+   assert (_Countof (v) == 99 / 2);
+ }
+ 
+ void
+ member (void)
+ {
+   struct {
+     int a[8];
+   } s;
+ 
+   static_assert (_Countof (s.a) == 8);
+ }
+ 
+ void
+ vla_eval (void)
+ {
+   int i;
+ 
+   i = 7;
+   assert (_Countof (struct {int x;}[i++]) == 7);
+   assert (i == 7 + 1);
+ 
+   int v[i];
+   int (*p)[i];
+   p = &v;
+   assert (_Countof (*p++) == i);
+   assert (p - 1 == &v);
+ }
+ 
+ void
+ array_noeval (void)
+ {
+   long a[5];
+   long (*p)[_Countof (a)];
+ 
+   p = &a;
+   static_assert (_Countof (*p++) == 5);
+   assert (p == &a);
+ }
+ 
+ void
+ matrix_fixed (void)
+ {
+   int i;
+ 
+   static_assert (_Countof (int [7][4]) == 7);
+   i = 3;
+   static_assert (_Countof (int [7][i]) == 7);
+ }
+ 
+ void
+ matrix_vla (void)
+ {
+   int i, j;
+ 
+   i = 7;
+   assert (_Countof (int [i++][4]) == 7);
+   assert (i == 7 + 1);
+ 
+   i = 9;
+   j = 3;
+   assert (_Countof (int [i++][j]) == 9);
+   assert (i == 9 + 1);
+ }
+ 
+ void
+ no_parens(void)
+ {
+   int n = 3;
+   int a[7];
+   int v[n];
+ 
+   static_assert (_Countof a == 7); 
+   assert (_Countof v == 3); 
+ }
+ 
+ int
+ main (void)
+ {
+   array ();
+   completed ();
+   vla ();
+   member ();
+   vla_eval ();
+   array_noeval ();
+   matrix_fixed ();
+   matrix_vla ();
+   no_parens ();
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/format/colors.c gcc-16-20250601/gcc/testsuite/gcc.dg/format/colors.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/format/colors.c	Sun May 25 22:32:09 2025
--- gcc-16-20250601/gcc/testsuite/gcc.dg/format/colors.c	Sun Jun  1 22:32:23 2025
*************** void test_mismatching_types (const char
*** 15,22 ****
  warning: [m[Kformat '[01m[K[01;32m[K%i[m[K[m[K' expects argument of type '[01m[K[01;32m[Kint[m[K[m[K', but argument 2 has type '[01m[K[01;34m[Kconst char *[m[K[m[K' [[01;35m[K-Wformat=[m[K]
     { dg-end-multiline-output "" } */
  /* { dg-begin-multiline-output "" }
!    printf("hello [01;32m[K%[m[K[01;32m[Ki[m[K", [01;34m[Km[m[K[01;34m[Ks[m[K[01;34m[Kg[m[K);
!                  [01;32m[K~[m[K[01;32m[K^[m[K   [01;34m[K~[m[K[01;34m[K~[m[K[01;34m[K~[m[K
                    [01;32m[K|[m[K   [01;34m[K|[m[K
                    [01;32m[Kint[m[K [01;34m[Kconst char *[m[K
                   [32m[K%s[m[K
--- 15,22 ----
  warning: [m[Kformat '[01m[K[01;32m[K%i[m[K[m[K' expects argument of type '[01m[K[01;32m[Kint[m[K[m[K', but argument 2 has type '[01m[K[01;34m[Kconst char *[m[K[m[K' [[01;35m[K-Wformat=[m[K]
     { dg-end-multiline-output "" } */
  /* { dg-begin-multiline-output "" }
!    printf("hello [01;32m[K%i[m[K", [01;34m[Kmsg[m[K);
!                  [01;32m[K~^[m[K   [01;34m[K~~~[m[K
                    [01;32m[K|[m[K   [01;34m[K|[m[K
                    [01;32m[Kint[m[K [01;34m[Kconst char *[m[K
                   [32m[K%s[m[K
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/format/diagnostic-ranges-html.py gcc-16-20250601/gcc/testsuite/gcc.dg/format/diagnostic-ranges-html.py
*** gcc-16-20250525/gcc/testsuite/gcc.dg/format/diagnostic-ranges-html.py	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/format/diagnostic-ranges-html.py	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,99 ----
+ from htmltest import *
+ 
+ import pytest
+ 
+ @pytest.fixture(scope='function', autouse=True)
+ def html_tree():
+     return html_tree_from_env()
+ 
+ def assert_highlighted_text(element, expected_highlight, expected_text):
+     assert_tag(element, 'span')
+     assert_class(element, expected_highlight)
+     assert element.text == expected_text
+ 
+ def test_message(html_tree):
+     """
+     Verify that the quoted text in the message has the correct
+     highlight colors.
+     """
+     diag = get_diag_by_index(html_tree, 0)
+     msg = get_message_within_diag(diag)
+ 
+     assert_tag(msg[0], 'span')
+     assert_class(msg[0], 'gcc-quoted-text')
+     assert_highlighted_text(msg[0][0], 'highlight-a', '%i')
+ 
+     assert_tag(msg[1], 'span')
+     assert_class(msg[1], 'gcc-quoted-text')
+     assert_highlighted_text(msg[1][0], 'highlight-a', 'int')
+ 
+     assert_tag(msg[2], 'span')
+     assert_class(msg[2], 'gcc-quoted-text')
+     assert_highlighted_text(msg[2][0], 'highlight-b', 'const char *')
+ 
+ def test_annotations(html_tree):
+     """
+     Verify that the labels in the annotations have the correct
+     highlight colors.
+     """
+     diag = get_diag_by_index(html_tree, 0)
+     locus = get_locus_within_diag(diag)
+     tbody = locus.find('xhtml:tbody', ns)
+     assert tbody.attrib['class'] == 'line-span'
+ 
+     rows = tbody.findall('xhtml:tr', ns)
+ 
+     # Source row
+     row = rows[0]
+     tds = row.findall('xhtml:td', ns)
+     assert len(tds) == 2
+     assert_class(tds[1], 'source')
+     assert_highlighted_text(tds[1][0], 'highlight-a', '%i')
+     assert_highlighted_text(tds[1][1], 'highlight-b', 'msg')
+     
+     # Underline row:
+     row = rows[1]
+     tds = row.findall('xhtml:td', ns)
+     assert len(tds) == 2
+     assert_class(tds[1], 'annotation')
+     assert_highlighted_text(tds[1][0], 'highlight-a', '~^')
+     assert_highlighted_text(tds[1][1], 'highlight-b', '~~~')
+     
+     # vline row:
+     row = rows[2]
+     tds = row.findall('xhtml:td', ns)
+     assert len(tds) == 2
+     assert_class(tds[1], 'annotation')
+     assert_highlighted_text(tds[1][0], 'highlight-a', '|')
+     assert_highlighted_text(tds[1][1], 'highlight-b', '|')
+     
+     # Label row:
+     row = rows[3]
+     tds = row.findall('xhtml:td', ns)
+     assert len(tds) == 2
+     assert_class(tds[1], 'annotation')
+     assert_highlighted_text(tds[1][0], 'highlight-a', 'int')
+     assert_highlighted_text(tds[1][1], 'highlight-b', 'const char *')
+ 
+ # For reference, here's the generated HTML:
+ """
+         <span class="gcc-message" id="gcc-diag-0-message">format &apos;<span class="gcc-quoted-text"><span class="high
+ light-a">%i</span></span>&apos; expects argument of type &apos;<span class="gcc-quoted-text"><span class="highlight-a"
+ >int</span></span>&apos;, but argument 2 has type &apos;<span class="gcc-quoted-text"><span class="highlight-b">const 
+ char *</span></span>&apos;</span>
+          
+         <span class="gcc-option">[<a href="https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wformat">-Wfo
+ rmat=</a>]</span>
+         <table class="locus">
+           <tbody class="line-span">
+             <tr><td class="left-margin"> </td><td class="source">  printf(&quot;hello <span class="highlight-a">%i</span>&quot;, <span class="highlight-b">msg</span>);  /* { dg-warning &quot;format &apos;%i&apos; expects argument of type &apos;int&apos;, but argument 2 has type &apos;const char \\*&apos; &quot; } */</td></tr>
+             <tr><td class="left-margin"> </td><td class="annotation">                <span class="highlight-a">~^</spa
+ n>   <span class="highlight-b">~~~</span></td></tr>
+             <tr><td class="left-margin"> </td><td class="annotation">                 <span class="highlight-a">|</spa
+ n>   <span class="highlight-b">|</span></td></tr>
+             <tr><td class="left-margin"> </td><td class="annotation">                 <span class="highlight-a">int</s
+ pan> <span class="highlight-b">const char *</span></td></tr>
+             <tr><td class="left-margin"> </td><td class="annotation">                %s</td></tr>
+           </tbody>
+         </table>
+ """
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/format/diagnostic-ranges.c gcc-16-20250601/gcc/testsuite/gcc.dg/format/diagnostic-ranges.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/format/diagnostic-ranges.c	Sun May 25 22:32:09 2025
--- gcc-16-20250601/gcc/testsuite/gcc.dg/format/diagnostic-ranges.c	Sun Jun  1 22:32:23 2025
***************
*** 1,4 ****
! /* { dg-options "-Wformat -fdiagnostics-show-caret" } */
  
  /* See PR 52952. */
  
--- 1,4 ----
! /* { dg-options "-Wformat -fdiagnostics-show-caret -fdiagnostics-add-output=experimental-html:javascript=no" } */
  
  /* See PR 52952. */
  
*************** void test_const_arrays (void)
*** 390,392 ****
--- 390,396 ----
                         double
     { dg-end-multiline-output "" } */
  }
+ 
+ /* Use a Python script to verify various properties about the generated
+    HTML file:
+    { dg-final { run-html-pytest diagnostic-ranges.c "diagnostic-ranges-html.py" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/gnu23-tag-composite-6.c gcc-16-20250601/gcc/testsuite/gcc.dg/gnu23-tag-composite-6.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/gnu23-tag-composite-6.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/gnu23-tag-composite-6.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,11 ----
+ /* { dg-do compile } */
+ /* { dg-options "-std=gnu23" } */
+ 
+ int f()
+ {
+     typedef struct foo bar;
+     struct foo { typeof(({ (struct foo { bar * x; }){ }; })) * x; } *q;
+     typeof(q->x) p;
+     1 ? p : q;
+ }
+ 
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/gomp/declare-mapper-10.c gcc-16-20250601/gcc/testsuite/gcc.dg/gomp/declare-mapper-10.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/gomp/declare-mapper-10.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/gomp/declare-mapper-10.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,61 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "-fdump-tree-gimple" } */
+ 
+ // "omp declare mapper" support -- check expansion in gimple.
+ 
+ #include <stdlib.h>
+ 
+ struct S {
+   int *ptr;
+   int size;
+ };
+ 
+ #define N 64
+ 
+ #pragma omp declare mapper (struct S w) map(w.size, w.ptr, w.ptr[:w.size])
+ #pragma omp declare mapper (foo:struct S w) map(to:w.size, w.ptr) \
+ 					    map(w.ptr[:w.size])
+ 
+ int main (int argc, char *argv[])
+ {
+   struct S s;
+   s.ptr = (int *) malloc (sizeof (int) * N);
+   s.size = N;
+ 
+ #pragma omp declare mapper (bar:struct S w) map(w.size, w.ptr, w.ptr[:w.size])
+ 
+ #pragma omp target
+   {
+     for (int i = 0; i < N; i++)
+       s.ptr[i]++;
+   }
+ 
+ #pragma omp target map(tofrom: s)
+   {
+     for (int i = 0; i < N; i++)
+       s.ptr[i]++;
+   }
+ 
+ #pragma omp target map(mapper(default), tofrom: s)
+   {
+     for (int i = 0; i < N; i++)
+       s.ptr[i]++;
+   }
+ 
+ #pragma omp target map(mapper(foo), alloc: s)
+   {
+     for (int i = 0; i < N; i++)
+       s.ptr[i]++;
+   }
+ 
+ #pragma omp target map(mapper(bar), tofrom: s)
+   {
+     for (int i = 0; i < N; i++)
+       s.ptr[i]++;
+   }
+ 
+   return 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times {map\(struct:s \[len: 2\]\) map\(tofrom:s\.ptr \[len: [0-9]+\]\) map\(tofrom:s\.size \[len: [0-9]+\]\) map\(tofrom:\*_[0-9]+ \[len: _[0-9]+\]\) map\(attach:s\.ptr \[bias: 0\]\)} 4 "gimple" { target c++ } } } */
+ /* { dg-final { scan-tree-dump-times {map\(struct:s \[len: 2\]\) map\(to:s\.ptr \[len: [0-9]+\]\) map\(to:s\.size \[len: [0-9]+\]\) map\(alloc:\*_[0-9]+ \[len: _[0-9]+\]\) map\(attach:s\.ptr \[bias: 0\]\)} 1 "gimple" { target c++ } } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/gomp/declare-mapper-11.c gcc-16-20250601/gcc/testsuite/gcc.dg/gomp/declare-mapper-11.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/gomp/declare-mapper-11.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/gomp/declare-mapper-11.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,33 ----
+ // { dg-do compile }
+ 
+ // Error-checking tests for "omp declare mapper".
+ 
+ typedef struct {
+   int *ptr;
+   int size;
+ } S;
+ 
+ typedef struct {
+   int z;
+ } Z;
+ 
+ int main (int argc, char *argv[])
+ {
+ #pragma omp declare mapper (S v) map(v.size, v.ptr[:v.size])
+ /* { dg-note "'#pragma omp declare mapper' previously declared here" "" { target c } .-1 } */
+ 
+   /* This one's a duplicate.  */
+ #pragma omp declare mapper (default: S v) map (to: v.size) map (v)
+ /* { dg-error "redeclaration of '<default>' '#pragma omp declare mapper' for type 'S'" "" { target c } .-1 } */
+ 
+   /* ...and this one doesn't use a "base language identifier" for the mapper
+      name.  */
+ #pragma omp declare mapper (case: S v) map (to: v.size)
+ /* { dg-error "expected identifier or 'default'" "" { target c } .-1 } */
+ 
+   /* A non-struct/class/union type isn't supposed to work.  */
+ #pragma omp declare mapper (name:Z [5]foo) map (foo[0].z)
+ /* { dg-error "'Z\\\[5\\\]' is not a struct or union type in '#pragma omp declare mapper'" "" { target c } .-1 } */
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/gomp/declare-mapper-13.c gcc-16-20250601/gcc/testsuite/gcc.dg/gomp/declare-mapper-13.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/gomp/declare-mapper-13.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/gomp/declare-mapper-13.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,13 ----
+ /* { dg-do compile } */
+ 
+ struct S { int y; };
+ 
+ struct V
+ {
+   int x;
+   #pragma omp declare mapper (bar: struct S s: s) map(s)	/* { dg-error "'#pragma omp declare mapper' not at file or block scope" } */
+   /* { dg-error "expected end of line before '\\(' token" "" { target *-*-* } .-1 }  */
+   #pragma omp declare mapper (struct V z : z) map(z)		/* { dg-error "'#pragma omp declare mapper' not at file or block scope" } */
+   /* { dg-error "expected end of line before '\\(' token" "" { target *-*-* } .-1 }  */
+ };
+ 
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/gomp/udr-3.c gcc-16-20250601/gcc/testsuite/gcc.dg/gomp/udr-3.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/gomp/udr-3.c	Sun May 25 22:32:09 2025
--- gcc-16-20250601/gcc/testsuite/gcc.dg/gomp/udr-3.c	Sun Jun  1 22:32:23 2025
*************** f2 ()
*** 31,43 ****
    #pragma omp declare reduction (bar: struct S: omp_out.s += omp_in.s) initializer (bar (&omp_orig)) /* { dg-error "one of the initializer call arguments should be" } */
  }
  
! #pragma omp declare reduction (+: struct U: omp_out.u *= omp_in.u)		/* { dg-error "previous" } */
  #pragma omp declare reduction (+: struct U: omp_out.u += omp_in.u)		/* { dg-error "redeclaration of" } */
  
  void
  f3 ()
  {
!   #pragma omp declare reduction (f3: struct U: omp_out.u *= omp_in.u)		/* { dg-error "previous" } */
    #pragma omp declare reduction (f3: struct U: omp_out.u += omp_in.u)		/* { dg-error "redeclaration of" } */
  }
  
--- 31,43 ----
    #pragma omp declare reduction (bar: struct S: omp_out.s += omp_in.s) initializer (bar (&omp_orig)) /* { dg-error "one of the initializer call arguments should be" } */
  }
  
! #pragma omp declare reduction (+: struct U: omp_out.u *= omp_in.u)		/* { dg-note "'#pragma omp declare reduction' previously declared here" } */
  #pragma omp declare reduction (+: struct U: omp_out.u += omp_in.u)		/* { dg-error "redeclaration of" } */
  
  void
  f3 ()
  {
!   #pragma omp declare reduction (f3: struct U: omp_out.u *= omp_in.u)		/* { dg-note "'#pragma omp declare reduction' previously declared here" } */
    #pragma omp declare reduction (f3: struct U: omp_out.u += omp_in.u)		/* { dg-error "redeclaration of" } */
  }
  
*************** struct V
*** 47,53 ****
    #pragma omp declare reduction (bar: struct S: omp_out.s += omp_in.s)		/* { dg-error "not at file or block scope" } */
  };
  
! #pragma omp declare reduction (n3: long: omp_out += omp_in)		/* { dg-error "previous" } */
  #pragma omp declare reduction (n3: long int: omp_out += omp_in)		/* { dg-error "redeclaration of" } */
  #pragma omp declare reduction (n3: short unsigned: omp_out += omp_in)
  #pragma omp declare reduction (n3: short int: omp_out += omp_in)
--- 47,53 ----
    #pragma omp declare reduction (bar: struct S: omp_out.s += omp_in.s)		/* { dg-error "not at file or block scope" } */
  };
  
! #pragma omp declare reduction (n3: long: omp_out += omp_in)		/* { dg-note "'#pragma omp declare reduction' previously declared here" } */
  #pragma omp declare reduction (n3: long int: omp_out += omp_in)		/* { dg-error "redeclaration of" } */
  #pragma omp declare reduction (n3: short unsigned: omp_out += omp_in)
  #pragma omp declare reduction (n3: short int: omp_out += omp_in)
*************** struct V
*** 55,61 ****
  void
  f4 (void)
  {
!   #pragma omp declare reduction (f4: long: omp_out += omp_in)		/* { dg-error "previous" } */
    #pragma omp declare reduction (f4: long int: omp_out += omp_in)	/* { dg-error "redeclaration of" } */
    #pragma omp declare reduction (f4: short unsigned: omp_out += omp_in)
    #pragma omp declare reduction (f4: short int: omp_out += omp_in)
--- 55,61 ----
  void
  f4 (void)
  {
!   #pragma omp declare reduction (f4: long: omp_out += omp_in)		/* { dg-note "'#pragma omp declare reduction' previously declared here" } */
    #pragma omp declare reduction (f4: long int: omp_out += omp_in)	/* { dg-error "redeclaration of" } */
    #pragma omp declare reduction (f4: short unsigned: omp_out += omp_in)
    #pragma omp declare reduction (f4: short int: omp_out += omp_in)
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/html-output/missing-semicolon.c gcc-16-20250601/gcc/testsuite/gcc.dg/html-output/missing-semicolon.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/html-output/missing-semicolon.c	Sun May 25 22:32:09 2025
--- gcc-16-20250601/gcc/testsuite/gcc.dg/html-output/missing-semicolon.c	Sun Jun  1 22:32:23 2025
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-fdiagnostics-add-output=experimental-html" } */
  
  /* Verify that basics of HTML output work.  */
  
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-fdiagnostics-add-output=experimental-html:javascript=no" } */
  
  /* Verify that basics of HTML output work.  */
  
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/html-output/missing-semicolon.py gcc-16-20250601/gcc/testsuite/gcc.dg/html-output/missing-semicolon.py
*** gcc-16-20250525/gcc/testsuite/gcc.dg/html-output/missing-semicolon.py	Sun May 25 22:32:09 2025
--- gcc-16-20250601/gcc/testsuite/gcc.dg/html-output/missing-semicolon.py	Sun Jun  1 22:32:23 2025
*************** import pytest
*** 18,29 ****
  def html_tree():
      return html_tree_from_env()
  
- XHTML = 'http://www.w3.org/1999/xhtml'
- ns = {'xhtml': XHTML}
- 
- def make_tag(local_name):
-     return f'{{{XHTML}}}' + local_name
- 
  def test_basics(html_tree):
      root = html_tree.getroot ()
      assert root.tag == make_tag('html')
--- 18,23 ----
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/ipa/pr120295.c gcc-16-20250601/gcc/testsuite/gcc.dg/ipa/pr120295.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/ipa/pr120295.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/ipa/pr120295.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,66 ----
+ /* { dg-do run } */
+ /* { dg-options "-O3" } */
+ 
+ struct {
+   signed a;
+ } b;
+ int a, f, j, l;
+ char c, k, g, e;
+ short d[2] = {0};
+ int *i = &j;
+ 
+ volatile int glob;
+ void __attribute__((noipa)) sth (const char *, int a)
+ {
+   glob = a;
+   return;
+ }
+ 
+ void marker_37() {
+   a++;
+   sth ("%d\n", a);
+ }
+ unsigned long long m(unsigned, char, unsigned, short);
+ int n(int, unsigned char, long long);
+ int o(long long, unsigned, unsigned);
+ unsigned short p(void) {
+   int *r = &l;
+   *r |= ({
+     long long y = (m(c, c, 0, c), b.a);
+     y;
+   });
+   return 0;
+ }
+ unsigned long long m(unsigned q, char v, unsigned s, short u) {
+   unsigned short ab = 5;
+   if (n(q, ab, d[1]))
+     for (; g; g++)
+       ;
+   return c;
+ }
+ int n(int af, unsigned char e, long long ae) {
+   unsigned ag = 4;
+   int *ah = &f;
+   *ah = ({ short ad = o(af, f, ag); ad<0 || ad> e; });
+   return *i;
+ }
+ int o(long long aj, unsigned ai, unsigned ak) {
+   for (; e; e--) {
+     int *al = &f;
+     for (; k; k++)
+       *al = 0;
+   }
+   if (18446744073709551606UL != (unsigned long long) aj)
+     ;
+   else
+     marker_37();
+   return ak;
+ }
+ int f123() {
+   c = 0xf6;
+   p();
+   return 0;
+ }
+ int main() {
+   return f123();
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-html.c gcc-16-20250601/gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-html.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-html.c	Sun May 25 22:32:09 2025
--- gcc-16-20250601/gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-html.c	Sun Jun  1 22:32:23 2025
***************
*** 1,6 ****
  /* { dg-do compile } */
! /* { dg-options "-fdiagnostics-set-output=experimental-html" } */
! /* { dg-additional-options "-fdiagnostics-show-caret" } */
  
  extern char *gets (char *s);
  
--- 1,6 ----
  /* { dg-do compile } */
! /* { dg-options "-fdiagnostics-set-output=experimental-html:javascript=no" } */
! /* { dg-additional-options "-fdiagnostics-show-caret -fdiagnostics-show-line-numbers" } */
  
  extern char *gets (char *s);
  
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-html.py gcc-16-20250601/gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-html.py
*** gcc-16-20250525/gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-html.py	Sun May 25 22:32:09 2025
--- gcc-16-20250601/gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-html.py	Sun Jun  1 22:32:23 2025
*************** import pytest
*** 8,19 ****
  def html_tree():
      return html_tree_from_env()
  
- XHTML = 'http://www.w3.org/1999/xhtml'
- ns = {'xhtml': XHTML}
- 
- def make_tag(local_name):
-     return f'{{{XHTML}}}' + local_name
- 
  def test_metadata(html_tree):
      root = html_tree.getroot ()
      assert root.tag == make_tag('html')
--- 8,13 ----
*************** def test_metadata(html_tree):
*** 48,58 ****
      assert metadata[1][0].text == 'STR34-C'
      assert metadata[1][0].tail == ']'
  
!     src = diag.find('xhtml:pre', ns)
!     assert src.attrib['class'] == 'gcc-annotated-source'
!     assert src.text == (
!         '   gets (buf);\n'
!         '   ^~~~~~~~~~\n')
  
  # For reference, here's the generated HTML:
  """
--- 42,62 ----
      assert metadata[1][0].text == 'STR34-C'
      assert metadata[1][0].tail == ']'
  
!     src = diag.find('xhtml:table', ns)
!     assert src.attrib['class'] == 'locus'
! 
!     tbody = src.find('xhtml:tbody', ns)
!     assert tbody.attrib['class'] == 'line-span'
! 
!     rows = tbody.findall('xhtml:tr', ns)
! 
!     quoted_src_tr = rows[0]
!     assert_quoted_line(quoted_src_tr,
!                        '   10', '  gets (buf);')
!     
!     annotation_tr = rows[1]
!     assert_annotation_line(annotation_tr,
!                            '  ^~~~~~~~~~')
  
  # For reference, here's the generated HTML:
  """
*************** def test_metadata(html_tree):
*** 60,67 ****
      <div class="gcc-diagnostic-list">
        <div class="gcc-diagnostic">
          <span class="gcc-message">never use &apos;<span class="gcc-quoted-text">gets</span>&apos;</span> 
!         <span class="gcc-metadata"><span class="gcc-metadata-item">[<a href="https://cwe.mitre.org/data/definitions/242.html">CWE-242</a>]</span><span class="gcc-metadata-item">[<a href="https://example.com/">STR34-C</a>]</span></span>
!         ...etc...
        </div>
      </div>
    </body>
--- 64,76 ----
      <div class="gcc-diagnostic-list">
        <div class="gcc-diagnostic">
          <span class="gcc-message">never use &apos;<span class="gcc-quoted-text">gets</span>&apos;</span> 
!         <span class="gcc-metadata"><span class="gcc-metadata-item">[<a href="https://cwe.mitre.org/data/definitions/242.html">CWE-242</a>]</span><span class="gcc-metadata-item">[<a href="https://example.com/">STR34-C</a>]</span></span><table class="locus">
! <tbody class="line-span">
! <tr><td class="linenum">   10</td> <td class="source">  gets (buf);</td></tr>
! <tr><td class="linenum"/><td class="annotation">  ^~~~~~~~~~</td></tr>
! </tbody>
! </table>
! 
        </div>
      </div>
    </body>
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.c gcc-16-20250601/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.c	Sun May 25 22:32:09 2025
--- gcc-16-20250601/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.c	Sun Jun  1 22:32:23 2025
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-fdiagnostics-show-caret -fdiagnostics-show-line-numbers -fdiagnostics-path-format=inline-events -fdiagnostics-add-output=experimental-html" } */
  
  #include <stddef.h>
  #include <stdlib.h>
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-fdiagnostics-show-caret -fdiagnostics-show-line-numbers -fdiagnostics-path-format=inline-events -fdiagnostics-add-output=experimental-html:javascript=no" } */
  
  #include <stddef.h>
  #include <stdlib.h>
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.py gcc-16-20250601/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.py
*** gcc-16-20250525/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.py	Sun May 25 22:32:09 2025
--- gcc-16-20250601/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.py	Sun Jun  1 22:32:23 2025
*************** import pytest
*** 8,19 ****
  def html_tree():
      return html_tree_from_env()
  
- XHTML = 'http://www.w3.org/1999/xhtml'
- ns = {'xhtml': XHTML}
- 
- def make_tag(local_name):
-     return f'{{{XHTML}}}' + local_name
- 
  def test_paths(html_tree):
      root = html_tree.getroot ()
      assert root.tag == make_tag('html')
--- 8,13 ----
*************** def test_paths(html_tree):
*** 29,35 ****
      assert diag is not None
      assert diag.attrib['class'] == 'gcc-diagnostic'
  
!     pre = diag.findall('xhtml:pre', ns)
!     assert pre[0].attrib['class'] == 'gcc-annotated-source'
!     assert pre[1].attrib['class'] == 'gcc-execution-path'
!     assert pre[1].text.startswith("  'make_a_list_of_random_ints_badly': events 1-3")
--- 23,41 ----
      assert diag is not None
      assert diag.attrib['class'] == 'gcc-diagnostic'
  
!     event_ranges = diag.find('xhtml:div', ns)
!     assert_class(event_ranges, 'event-ranges')
! 
!     frame_margin = event_ranges.find('xhtml:table', ns)
!     assert_class(frame_margin, 'stack-frame-with-margin')
! 
!     tr = frame_margin.find('xhtml:tr', ns)
!     assert tr is not None
!     tds = tr.findall('xhtml:td', ns)
!     assert len(tds) == 2
! 
!     assert_class(tds[0], 'interprocmargin')
! 
!     test_frame = tds[1]
!     assert_frame(test_frame, 'make_a_list_of_random_ints_badly')
!     assert_event_range_with_margin(test_frame[1])
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-4.c gcc-16-20250601/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-4.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-4.c	Sun May 25 22:32:09 2025
--- gcc-16-20250601/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-4.c	Sun Jun  1 22:32:23 2025
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-fdiagnostics-path-format=inline-events -fdiagnostics-show-caret -fdiagnostics-show-line-numbers" } */
  /* { dg-enable-nn-line-numbers "" } */
  
  #include <stdio.h>
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-fdiagnostics-path-format=inline-events -fdiagnostics-show-caret -fdiagnostics-show-line-numbers -fdiagnostics-add-output=experimental-html:javascript=no" } */
  /* { dg-enable-nn-line-numbers "" } */
  
  #include <stdio.h>
*************** void test (void)
*** 82,84 ****
--- 82,88 ----
                    |      |   (9) calling 'fprintf'
                    |
     { dg-end-multiline-output "" } */
+ 
+ /* Use a Python script to verify various properties about the generated
+    HTML file:
+    { dg-final { run-html-pytest diagnostic-test-paths-4.c "diagnostic-test-paths-4.py" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-4.py gcc-16-20250601/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-4.py
*** gcc-16-20250525/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-4.py	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-4.py	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,190 ----
+ # Verify that interprocedural execution paths work in HTML output.
+ 
+ from htmltest import *
+ 
+ import pytest
+ 
+ @pytest.fixture(scope='function', autouse=True)
+ def html_tree():
+     return html_tree_from_env()
+ 
+ def test_paths(html_tree):
+     diag = get_diag_by_index(html_tree, 0)
+     src = get_locus_within_diag (diag)
+ 
+     tbody = src.find('xhtml:tbody', ns)
+     assert_class(tbody, 'line-span')
+ 
+     rows = tbody.findall('xhtml:tr', ns)
+ 
+     quoted_src_tr = rows[0]
+     assert_quoted_line(quoted_src_tr,
+                        '   13', '  fprintf(stderr, "LOG: %s", msg); /* { dg-warning "call to \'fprintf\' from within signal handler" } */')
+     
+     annotation_tr = rows[1]
+     assert_annotation_line(annotation_tr,
+                            '  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
+ 
+     event_ranges = diag.find('xhtml:div', ns)
+     assert_class(event_ranges, 'event-ranges')
+ 
+     test_frame_margin = event_ranges.find('xhtml:table', ns)
+     assert_class(test_frame_margin, 'stack-frame-with-margin')
+ 
+     tr = test_frame_margin.find('xhtml:tr', ns)
+     assert tr is not None
+     tds = tr.findall('xhtml:td', ns)
+     assert len(tds) == 2
+ 
+     assert_class(tds[0], 'interprocmargin')
+ 
+     test_frame = tds[1]
+     assert_frame(test_frame, 'test')
+     assert_event_range_with_margin(test_frame[1])
+ 
+ # For reference, generated HTML looks like this:
+ """
+ <table class="stack-frame-with-margin"><tr>
+   <td class="interprocmargin" style="padding-left: 100px"/>
+   <td class="stack-frame">
+ <div class="frame-funcname"><span>test</span></div><table class="event-range-with-margin"><tr>
+   <td class="event-range">
+     <div class="events-hdr"><span class="funcname">test</span>: <span class="event-ids">events 1-2</span></div>
+ <table class="locus">
+ <tbody class="line-span">
+ <tr><td class="linenum">   27</td> <td class="source">{</td></tr>
+ <tr><td class="linenum"/><td class="annotation">^</td></tr>
+ <tr><td class="linenum"/><td class="annotation">|</td></tr>
+ <tr><td class="linenum"/><td class="annotation">(1) entering 'test'</td></tr>
+ <tr><td class="linenum">   28</td> <td class="source">  register_handler ();</td></tr>
+ <tr><td class="linenum"/><td class="annotation">  ~~~~~~~~~~~~~~~~~~~</td></tr>
+ <tr><td class="linenum"/><td class="annotation">  |</td></tr>
+ <tr><td class="linenum"/><td class="annotation">  (2) calling 'register_handler'</td></tr>
+ </tbody>
+ </table>
+ </td></tr></table>
+ <div class="between-ranges-call">
+   <svg height="30" width="150">
+     <defs>
+       <marker id="arrowhead" markerWidth="10" markerHeight="7"
+               refX="0" refY="3.5" orient="auto" stroke="#0088ce" fill="#0088ce">
+       <polygon points="0 0, 10 3.5, 0 7"/>
+       </marker>
+     </defs>
+     <polyline points="20,0 20,10 120,10 120,20"
+               style="fill:none;stroke: #0088ce"
+               marker-end="url(#arrowhead)"/>
+   </svg>
+ </div>
+ 
+ <table class="stack-frame-with-margin"><tr>
+   <td class="interprocmargin" style="padding-left: 100px"/>
+   <td class="stack-frame">
+ <div class="frame-funcname"><span>register_handler</span></div><table class="event-range-with-margin"><tr>
+   <td class="event-range">
+     <div class="events-hdr"><span class="funcname">register_handler</span>: <span class="event-ids">events 3-4</span></div>
+ <table class="locus">
+ <tbody class="line-span">
+ <tr><td class="linenum">   22</td> <td class="source">{</td></tr>
+ <tr><td class="linenum"/><td class="annotation">^</td></tr>
+ <tr><td class="linenum"/><td class="annotation">|</td></tr>
+ <tr><td class="linenum"/><td class="annotation">(3) entering 'register_handler'</td></tr>
+ <tr><td class="linenum">   23</td> <td class="source">  signal(SIGINT, int_handler);</td></tr>
+ <tr><td class="linenum"/><td class="annotation">  ~~~~~~~~~~~~~~~~~~~~~~~~~~~</td></tr>
+ <tr><td class="linenum"/><td class="annotation">  |</td></tr>
+ <tr><td class="linenum"/><td class="annotation">  (4) registering 'int_handler' as signal handler</td></tr>
+ </tbody>
+ </table>
+ </td></tr></table>
+ </td></tr></table>
+ </td></tr></table>
+ <div class="between-ranges-return">
+   <svg height="30" width="250">
+     <defs>
+       <marker id="arrowhead" markerWidth="10" markerHeight="7"
+               refX="0" refY="3.5" orient="auto" stroke="#0088ce" fill="#0088ce">
+       <polygon points="0 0, 10 3.5, 0 7"/>
+       </marker>
+     </defs>
+     <polyline points="220,0 220,10 20,10 20,20"
+               style="fill:none;stroke: #0088ce"
+               marker-end="url(#arrowhead)"/>
+   </svg>
+ </div>
+ 
+ <table class="event-range-with-margin"><tr>
+   <td class="event-range">
+     <div class="events-hdr"><span class="event-ids">event 5</span></div>
+  (5): later on, when the signal is delivered to the process
+ </td></tr></table>
+ <div class="between-ranges-call">
+   <svg height="30" width="150">
+     <defs>
+       <marker id="arrowhead" markerWidth="10" markerHeight="7"
+               refX="0" refY="3.5" orient="auto" stroke="#0088ce" fill="#0088ce">
+       <polygon points="0 0, 10 3.5, 0 7"/>
+       </marker>
+     </defs>
+     <polyline points="20,0 20,10 120,10 120,20"
+               style="fill:none;stroke: #0088ce"
+               marker-end="url(#arrowhead)"/>
+   </svg>
+ </div>
+ 
+ <table class="stack-frame-with-margin"><tr>
+   <td class="interprocmargin" style="padding-left: 100px"/>
+   <td class="stack-frame">
+ <div class="frame-funcname"><span>int_handler</span></div><table class="event-range-with-margin"><tr>
+   <td class="event-range">
+     <div class="events-hdr"><span class="funcname">int_handler</span>: <span class="event-ids">events 6-7</span></div>
+ <table class="locus">
+ <tbody class="line-span">
+ <tr><td class="linenum">   17</td> <td class="source">{</td></tr>
+ <tr><td class="linenum"/><td class="annotation">^</td></tr>
+ <tr><td class="linenum"/><td class="annotation">|</td></tr>
+ <tr><td class="linenum"/><td class="annotation">(6) entering 'int_handler'</td></tr>
+ <tr><td class="linenum">   18</td> <td class="source">  custom_logger("got signal");</td></tr>
+ <tr><td class="linenum"/><td class="annotation">  ~~~~~~~~~~~~~~~~~~~~~~~~~~~</td></tr>
+ <tr><td class="linenum"/><td class="annotation">  |</td></tr>
+ <tr><td class="linenum"/><td class="annotation">  (7) calling 'custom_logger'</td></tr>
+ </tbody>
+ </table>
+ </td></tr></table>
+ <div class="between-ranges-call">
+   <svg height="30" width="150">
+     <defs>
+       <marker id="arrowhead" markerWidth="10" markerHeight="7"
+               refX="0" refY="3.5" orient="auto" stroke="#0088ce" fill="#0088ce">
+       <polygon points="0 0, 10 3.5, 0 7"/>
+       </marker>
+     </defs>
+     <polyline points="20,0 20,10 120,10 120,20"
+               style="fill:none;stroke: #0088ce"
+               marker-end="url(#arrowhead)"/>
+   </svg>
+ </div>
+ 
+ <table class="stack-frame-with-margin"><tr>
+   <td class="interprocmargin" style="padding-left: 100px"/>
+   <td class="stack-frame">
+ <div class="frame-funcname"><span>custom_logger</span></div><table class="event-range-with-margin"><tr>
+   <td class="event-range">
+     <div class="events-hdr"><span class="funcname">custom_logger</span>: <span class="event-ids">events 8-9</span></div>
+ <table class="locus">
+ <tbody class="line-span">
+ <tr><td class="linenum">   12</td> <td class="source">{</td></tr>
+ <tr><td class="linenum"/><td class="annotation">^</td></tr>
+ <tr><td class="linenum"/><td class="annotation">|</td></tr>
+ <tr><td class="linenum"/><td class="annotation">(8) entering 'custom_logger'</td></tr>
+ <tr><td class="linenum">   13</td> <td class="source">  fprintf(stderr, "LOG: %s", msg); /* { dg-warning "call to 'fprintf' from within signal handler" } */</td></tr>
+ <tr><td class="linenum"/><td class="annotation">  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</td></tr>
+ <tr><td class="linenum"/><td class="annotation">  |</td></tr>
+ <tr><td class="linenum"/><td class="annotation">  (9) calling 'fprintf'</td></tr>
+ </tbody>
+ </table>
+ </td></tr></table>
+ </td></tr></table>
+ </td></tr></table>
+ 
+ </div>
+     """
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw-line-numbers.c gcc-16-20250601/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw-line-numbers.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw-line-numbers.c	Sun May 25 22:32:09 2025
--- gcc-16-20250601/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw-line-numbers.c	Sun Jun  1 22:32:23 2025
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-O -fdiagnostics-show-caret -fdiagnostics-show-line-numbers" } */
  
  /* This is a collection of unittests for diagnostic_show_locus;
     see the overview in diagnostic_plugin_test_show_locus.c.
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-O -fdiagnostics-show-caret -fdiagnostics-show-line-numbers -fdiagnostics-add-output=experimental-html:javascript=no" } */
  
  /* This is a collection of unittests for diagnostic_show_locus;
     see the overview in diagnostic_plugin_test_show_locus.c.
*************** void test_fixit_insert_newline (void)
*** 118,120 ****
--- 118,124 ----
     { dg-end-multiline-output "" } */
  #endif
  }
+ 
+ /* Use a Python script to verify various properties about the generated
+    HTML file:
+    { dg-final { run-html-pytest diagnostic-test-show-locus-bw-line-numbers.c "diagnostic-test-show-locus.py" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus.py gcc-16-20250601/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus.py
*** gcc-16-20250525/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus.py	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus.py	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,111 ----
+ # Verify that diagnostic-show-locus.cc works with HTML output.
+ 
+ from htmltest import *
+ 
+ import pytest
+ 
+ @pytest.fixture(scope='function', autouse=True)
+ def html_tree():
+     return html_tree_from_env()
+ 
+ #def get_tr_within_thead(thead, idx)
+ 
+ def get_ruler_text(thead, idx):
+     trs = thead.findall('xhtml:tr', ns)
+     tr = trs[idx]
+     tds = tr.findall('xhtml:td', ns)
+     assert len(tds) == 3
+     assert_class(tds[2], 'ruler')
+     return tds[2].text
+ 
+ def test_very_wide_line(html_tree):
+     diag = get_diag_by_index(html_tree, 2)
+     src = get_locus_within_diag(diag)
+ 
+     # Check ruler
+     thead = src.find('xhtml:thead', ns)
+     assert_class(thead, 'ruler')
+     trs = thead.findall('xhtml:tr', ns)
+     assert len(trs) == 3
+ 
+     assert get_ruler_text(thead, 0) == '       0         0         0         0         0         1         1   '
+     assert get_ruler_text(thead, 1) == '       5         6         7         8         9         0         1   '
+     assert get_ruler_text(thead, 2) == '34567890123456789012345678901234567890123456789012345678901234567890123'
+ 
+     # Check quoted source
+     tbody = src.find('xhtml:tbody', ns)
+     assert_class(tbody, 'line-span')
+     trs = tbody.findall('xhtml:tr', ns)
+     assert len(trs) == 5
+     assert_quoted_line(trs[0], '   43', '                                      float f = foo * bar; /* { dg-warning "95: test" } */')
+     assert_annotation_line(trs[1],      '                                                ~~~~^~~~~')
+     assert_annotation_line(trs[2],      '                                                    |')
+     assert_annotation_line(trs[3],      '                                                    label 0')
+     assert_annotation_line(trs[4],      '                                                bar * foo')
+ 
+ def test_fixit_insert(html_tree):
+     diag = get_diag_by_index(html_tree, 3)
+     msg = get_message_within_diag(diag)
+     assert msg.text == 'example of insertion hints'
+ 
+     src = get_locus_within_diag(diag)
+ 
+     # Check quoted source
+     tbody = src.find('xhtml:tbody', ns)
+     assert_class(tbody, 'line-span')
+     trs = tbody.findall('xhtml:tr', ns)
+     assert len(trs) == 3
+     assert_quoted_line(trs[0], '   63', '   int a[2][2] = { 0, 1 , 2, 3 }; /* { dg-warning "insertion hints" } */')
+     assert_annotation_line(trs[1],      '                   ^~~~')
+     assert_annotation_line(trs[2],      '                   {   }')
+ 
+ def test_fixit_remove(html_tree):
+     diag = get_diag_by_index(html_tree, 4)
+     msg = get_message_within_diag(diag)
+     assert msg.text == 'example of a removal hint'
+ 
+     src = get_locus_within_diag(diag)
+ 
+     # Check quoted source
+     tbody = src.find('xhtml:tbody', ns)
+     assert_class(tbody, 'line-span')
+     trs = tbody.findall('xhtml:tr', ns)
+     assert len(trs) == 3
+     assert_quoted_line(trs[0], '   77', '  int a;; /* { dg-warning "example of a removal hint" } */')
+     assert_annotation_line(trs[1],      '        ^')
+     assert_annotation_line(trs[2],      '        -')
+ 
+ def test_fixit_replace(html_tree):
+     diag = get_diag_by_index(html_tree, 5)
+     msg = get_message_within_diag(diag)
+     assert msg.text == 'example of a replacement hint'
+ 
+     src = get_locus_within_diag(diag)
+ 
+     # Check quoted source
+     tbody = src.find('xhtml:tbody', ns)
+     assert_class(tbody, 'line-span')
+     trs = tbody.findall('xhtml:tr', ns)
+     assert len(trs) == 3
+     assert_quoted_line(trs[0], '   91', '  gtk_widget_showall (dlg); /* { dg-warning "example of a replacement hint" } */')
+     assert_annotation_line(trs[1],      '  ^~~~~~~~~~~~~~~~~~')
+     assert_annotation_line(trs[2],      '  gtk_widget_show_all')
+ 
+ def test_fixit_insert_newline(html_tree):
+     diag = get_diag_by_index(html_tree, 6)
+     msg = get_message_within_diag(diag)
+     assert msg.text == 'example of newline insertion hint'
+ 
+     src = get_locus_within_diag(diag)
+ 
+     # Check quoted source
+     tbody = src.find('xhtml:tbody', ns)
+     assert_class(tbody, 'line-span')
+     trs = tbody.findall('xhtml:tr', ns)
+     assert len(trs) == 4
+     assert_quoted_line(trs[0], '  109', '      x = a;')
+     assert_annotation_line(trs[1],      '      break;',
+                            expected_line_num='  +++',
+                            expected_left_margin='+')
+     assert_quoted_line(trs[2], '  110', "    case 'b':  /* { dg-warning \"newline insertion\" } */")
+     assert_annotation_line(trs[3],      '    ^~~~~~~~')
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/plugin/diagnostic_group_plugin.cc gcc-16-20250601/gcc/testsuite/gcc.dg/plugin/diagnostic_group_plugin.cc
*** gcc-16-20250525/gcc/testsuite/gcc.dg/plugin/diagnostic_group_plugin.cc	Sun May 25 22:32:09 2025
--- gcc-16-20250601/gcc/testsuite/gcc.dg/plugin/diagnostic_group_plugin.cc	Sun Jun  1 22:32:23 2025
*************** test_diagnostic_text_starter (diagnostic
*** 176,184 ****
  
  void
  test_diagnostic_start_span_fn (const diagnostic_location_print_policy &,
! 			       pretty_printer *pp,
  			       expanded_location)
  {
    pp_string (pp, "START_SPAN_FN: ");
    pp_newline (pp);
  }
--- 176,185 ----
  
  void
  test_diagnostic_start_span_fn (const diagnostic_location_print_policy &,
! 			       to_text &sink,
  			       expanded_location)
  {
+   pretty_printer *pp = get_printer (sink);
    pp_string (pp, "START_SPAN_FN: ");
    pp_newline (pp);
  }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/pr120353.c gcc-16-20250601/gcc/testsuite/gcc.dg/pr120353.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/pr120353.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/pr120353.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,11 ----
+ /* PR120353: Test for -Wflex-array-member-not-at-end on structure with 
+    typedef.  */ 
+ /* { dg-do compile } */
+ /* { dg-options "-Wflex-array-member-not-at-end" } */
+ 
+ typedef struct flex flex_t;
+ struct flex { int n; int data[]; };
+ struct out_flex_mid {flex_t flex_data;  int m; }; /* { dg-warning "structure containing a flexible array member is not at the end of another structure" } */
+ 
+ typedef struct flex flex_t1;
+ struct out_flex_mid1 {flex_t1 flex_data1; int n; }; /* { dg-warning "structure containing a flexible array member is not at the end of another structure" } */ 
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/pr120354.c gcc-16-20250601/gcc/testsuite/gcc.dg/pr120354.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/pr120354.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/pr120354.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,33 ----
+ /* PR120354: Test for -Wflex-array-member-not-at-end on union with 
+    flexible array members.  */ 
+ /* { dg-do compile } */
+ /* { dg-options "-Wflex-array-member-not-at-end" } */
+ 
+ struct P {};
+ union L {};
+ 
+ union X {
+     int x[];
+     struct P y;
+ };
+ 
+ struct T {
+     union X x;	/* { dg-warning "structure containing a flexible array member is not at the end of another structure" } */
+     int plug;
+ };
+ 
+ struct Q {
+     int len;
+     int data[];
+ };
+ 
+ union Y {
+     struct Q q;
+     union L y;
+ };
+ 
+ struct S {
+     union Y y;  /* { dg-warning "structure containing a flexible array member is not at the end of another structure" } */
+     int plug;
+ };
+ 
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/pr120380.c gcc-16-20250601/gcc/testsuite/gcc.dg/pr120380.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/pr120380.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/pr120380.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,24 ----
+ /* PR c/120380 */
+ /* { dg-do compile } */
+ 
+ struct pair_t {
+   char c;
+   int i;
+ };
+ typedef struct foo_ {			/* { dg-error "no member" } */
+   struct foo_ {				/* { dg-error "nested redefinition" } */
+ 	  				/* { dg-error "no member" "" { target *-*-* } .-1 } */
+     struct foo_ {			/* { dg-error "nested redefinition" } */
+       int value;
+     }
+   }					/* { dg-error "does not declare anything" } */
+ 					/* { dg-error "no semicolon" "" { target *-*-* } .-1 } */
+ } __attribute__((packed)) foo;		/* { dg-error "does not declare anything" } */
+ 					/* { dg-error "no semicolon" "" { target *-*-* } .-1 } */
+ struct pair_t p = {0, 1};
+ foo *addr = (foo *)&p.i;
+ int main() {
+   addr->value = 0;			/* { dg-error "has no member" } */
+   return 0;
+ }
+ 
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/pr120381.c gcc-16-20250601/gcc/testsuite/gcc.dg/pr120381.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/pr120381.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/pr120381.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,10 ----
+ /* PR120381 */
+ /* { dg-do compile } */
+ 
+ struct A {
+   struct A {		/* { dg-error "nested redefinition" } */
+     struct A *p;
+   } *p;
+ };
+ int foo(const struct A *q) { return q->p == q; }
+ 
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/pr120480.c gcc-16-20250601/gcc/testsuite/gcc.dg/pr120480.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/pr120480.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/pr120480.c	Sun Jun  1 22:32:23 2025
***************
*** 0 ****
--- 1,11 ----
+ /* PR target/120480 */
+ /* { dg-do compile } */
+ /* { dg-options "-O0" } */
+ 
+ struct S { int a, b, c; } s;
+ 
+ void
+ foo (void)
+ {
+   struct S t = s;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/torture/pr120341-1.c gcc-16-20250601/gcc/testsuite/gcc.dg/torture/pr120341-1.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/torture/pr120341-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/torture/pr120341-1.c	Sun Jun  1 22:32:24 2025
***************
*** 0 ****
--- 1,11 ----
+ /* { dg-do run } */
+ /* { dg-additional-options "-fallow-store-data-races" } */
+ 
+ char a, *b;
+ int main()
+ {
+   b = "0";
+   if (a)
+     b[0]++;
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/torture/pr120341-2.c gcc-16-20250601/gcc/testsuite/gcc.dg/torture/pr120341-2.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/torture/pr120341-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/torture/pr120341-2.c	Sun Jun  1 22:32:24 2025
***************
*** 0 ****
--- 1,13 ----
+ /* { dg-do run } */
+ /* { dg-additional-options "-fallow-store-data-races" } */
+ 
+ char a, *b;
+ int main()
+ {
+   while (a)
+     {
+       b = "0";
+       b[0]++;
+     }
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/torture/pr120347.c gcc-16-20250601/gcc/testsuite/gcc.dg/torture/pr120347.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/torture/pr120347.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/torture/pr120347.c	Sun Jun  1 22:32:24 2025
***************
*** 0 ****
--- 1,13 ----
+ /* { dg-do assemble } */
+ /* { dg-additional-options "-march=armv7-a -mthumb" { target { arm_arch_v7a_ok && arm_thumb2_ok } } } */
+ 
+ void *end;
+ void **start;
+ void main(void)
+ {
+   for (; end; start++) {
+     if (*start)
+       return;
+     *start = start;
+   }
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/vect/bb-slp-pr119181.c gcc-16-20250601/gcc/testsuite/gcc.dg/vect/bb-slp-pr119181.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/vect/bb-slp-pr119181.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/vect/bb-slp-pr119181.c	Sun Jun  1 22:32:24 2025
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do compile } */
+ void
+ foo (int* a, int* restrict b)
+ {
+     b[0] = a[0] * a[64];
+     b[1] = a[65] * a[1];
+     b[2] = a[2] * a[66];
+     b[3] = a[67] * a[3];
+     b[4] = a[68] * a[4];
+     b[5] = a[69] * a[5];
+     b[6] = a[6] * a[70];
+     b[7] = a[7] * a[71];
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "optimized: basic block" 1 "slp2" { target vect_int_mult } } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.dg/vect/vect-early-break_136-pr120357.c gcc-16-20250601/gcc/testsuite/gcc.dg/vect/vect-early-break_136-pr120357.c
*** gcc-16-20250525/gcc/testsuite/gcc.dg/vect/vect-early-break_136-pr120357.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.dg/vect/vect-early-break_136-pr120357.c	Sun Jun  1 22:32:24 2025
***************
*** 0 ****
--- 1,13 ----
+ /* { dg-do compile } */
+ /* { dg-add-options vect_early_break } */
+ /* { dg-additional-options "-O3" } */
+ 
+ char a;
+ unsigned long long t[2][22];
+ int u[22];
+ void f(void)
+ {
+   for (int v = 0; v < 22; v++)
+     for (_Bool w = 0; w < (u[v] < 0) + 1; w = 1)
+       a *= 0 != t[w][v];
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/i386/pr119884.c gcc-16-20250601/gcc/testsuite/gcc.target/i386/pr119884.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/i386/pr119884.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/i386/pr119884.c	Sun Jun  1 22:32:28 2025
***************
*** 0 ****
--- 1,13 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -fno-dse -favoid-store-forwarding" } */
+ 
+ typedef __attribute__((__vector_size__(64))) char V;
+ char c;
+ V v;
+ 
+ char
+ foo()
+ {
+   v *= c;
+   return v[0];
+ }
\ No newline at end of file
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/i386/reduc-pshuf.c gcc-16-20250601/gcc/testsuite/gcc.target/i386/reduc-pshuf.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/i386/reduc-pshuf.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/i386/reduc-pshuf.c	Sun Jun  1 22:32:28 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -march=znver5 " } */
+ 
+ #define N 32
+ #define T short
+ T
+ foo (T *a)
+ {
+   T sum = 0;
+   for (int i = 0; i < N; i++)
+     sum += a[i];
+   return sum;
+ }
+ 
+ /* { dg-final { scan-assembler-times "vpsrl" 0 } } */
+ /* { dg-final { scan-assembler-times "vpshuf" 3 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/i386/vect-epilogues-5.c gcc-16-20250601/gcc/testsuite/gcc.target/i386/vect-epilogues-5.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/i386/vect-epilogues-5.c	Sun May 25 22:32:11 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/i386/vect-epilogues-5.c	Sun Jun  1 22:32:28 2025
*************** int test (signed char *data, int n)
*** 9,13 ****
    return sum;
  }
  
! /* { dg-final { scan-tree-dump-times "loop vectorized using 64 byte vectors" 2 "vect" } } */
  /* { dg-final { scan-tree-dump-not "loop vectorized using 32 byte vectors" "vect" } } */
--- 9,14 ----
    return sum;
  }
  
! /* { dg-final { scan-tree-dump-times "loop vectorized using 64 byte vectors" 1 "vect" } } */
! /* { dg-final { scan-tree-dump-times "epilogue loop vectorized using masked 64 byte vectors" 1 "vect" } } */
  /* { dg-final { scan-tree-dump-not "loop vectorized using 32 byte vectors" "vect" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/arch-57.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/arch-57.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/arch-57.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/arch-57.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,6 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64i_smdbltrp -mabi=lp64" } */
+ 
+ void foo(){}
+ 
+ /* { dg-final { scan-assembler ".attribute arch, \"rv64i2p1_zicsr2p0_smdbltrp1p0\"" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/arch-58.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/arch-58.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/arch-58.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/arch-58.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,6 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64i_ssdbltrp -mabi=lp64" } */
+ 
+ void foo(){}
+ 
+ /* { dg-final { scan-assembler ".attribute arch, \"rv64i2p1_zicsr2p0_ssdbltrp1p0\"" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg.h gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg.h
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg.h	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,40 ----
+ #ifndef HAVE_DEFINED_AVG_H
+ #define HAVE_DEFINED_AVG_H
+ 
+ #include <stdint.h>
+ 
+ #define DEF_AVG_0(NT, WT, NAME)                                 \
+ __attribute__((noinline))                                       \
+ void                                                            \
+ test_##NAME##_##WT##_##NT##_0(NT * restrict a, NT * restrict b, \
+ 			      NT * restrict out, int n)         \
+ {                                                               \
+   for (int i = 0; i < n; i++) {                                 \
+     out[i] = (NT)(((WT)a[i] + (WT)b[i]) >> 1);                  \
+   }                                                             \
+ }
+ #define DEF_AVG_0_WRAP(NT, WT, NAME) DEF_AVG_0(NT, WT, NAME)
+ 
+ #define RUN_AVG_0(NT, WT, NAME, a, b, out, n) \
+   test_##NAME##_##WT##_##NT##_0(a, b, out, n)
+ #define RUN_AVG_0_WRAP(NT, WT, NAME, a, b, out, n) \
+   RUN_AVG_0(NT, WT, NAME, a, b, out, n)
+ 
+ #define DEF_AVG_1(NT, WT, NAME)                                 \
+ __attribute__((noinline))                                       \
+ void                                                            \
+ test_##NAME##_##WT##_##NT##_1(NT * restrict a, NT * restrict b, \
+ 			      NT * restrict out, int n)         \
+ {                                                               \
+   for (int i = 0; i < n; i++) {                                 \
+     out[i] = (NT)(((WT)a[i] + (WT)b[i] + 1) >> 1);              \
+   }                                                             \
+ }
+ #define DEF_AVG_1_WRAP(NT, WT, NAME) DEF_AVG_1(NT, WT, NAME)
+ 
+ #define RUN_AVG_1(NT, WT, NAME, a, b, out, n) \
+   test_##NAME##_##WT##_##NT##_1(a, b, out, n)
+ #define RUN_AVG_1_WRAP(NT, WT, NAME, a, b, out, n) \
+   RUN_AVG_1(NT, WT, NAME, a, b, out, n)
+ 
+ #endif
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i16-from-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i16-from-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i16-from-i32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i16-from-i32.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+ 
+ #include "avg.h"
+ 
+ #define NT int16_t
+ #define WT int32_t
+ 
+ DEF_AVG_1(NT, WT, avg_ceil)
+ 
+ /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*0} 1 } } */
+ /* { dg-final { scan-assembler-times {vaadd.vv} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i16-from-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i16-from-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i16-from-i64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i16-from-i64.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+ 
+ #include "avg.h"
+ 
+ #define NT int16_t
+ #define WT int64_t
+ 
+ DEF_AVG_1(NT, WT, avg_ceil)
+ 
+ /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*0} 1 } } */
+ /* { dg-final { scan-assembler-times {vaadd.vv} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i32-from-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i32-from-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i32-from-i64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i32-from-i64.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+ 
+ #include "avg.h"
+ 
+ #define NT int32_t
+ #define WT int64_t
+ 
+ DEF_AVG_1(NT, WT, avg_ceil)
+ 
+ /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*0} 1 } } */
+ /* { dg-final { scan-assembler-times {vaadd.vv} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i8-from-i16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i8-from-i16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i8-from-i16.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i8-from-i16.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+ 
+ #include "avg.h"
+ 
+ #define NT int8_t
+ #define WT int16_t
+ 
+ DEF_AVG_1(NT, WT, avg_ceil)
+ 
+ /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*0} 1 } } */
+ /* { dg-final { scan-assembler-times {vaadd.vv} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i8-from-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i8-from-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i8-from-i32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i8-from-i32.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+ 
+ #include "avg.h"
+ 
+ #define NT int8_t
+ #define WT int32_t
+ 
+ DEF_AVG_1(NT, WT, avg_ceil)
+ 
+ /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*0} 1 } } */
+ /* { dg-final { scan-assembler-times {vaadd.vv} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i8-from-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i8-from-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i8-from-i64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-1-i8-from-i64.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+ 
+ #include "avg.h"
+ 
+ #define NT int8_t
+ #define WT int64_t
+ 
+ DEF_AVG_1(NT, WT, avg_ceil)
+ 
+ /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*0} 1 } } */
+ /* { dg-final { scan-assembler-times {vaadd.vv} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i16-from-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i16-from-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i16-from-i32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i16-from-i32.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 -O3" } */
+ 
+ #include "avg.h"
+ #include "avg_data.h"
+ 
+ #define WT   int32_t
+ #define NT   int16_t
+ #define NAME avg_ceil
+ 
+ DEF_AVG_1_WRAP(NT, WT, NAME)
+ 
+ #define TEST_DATA                            TEST_AVG_DATA_WRAP(NT, NAME)
+ #define TEST_RUN(NT, WT, NAME, a, b, out, n) RUN_AVG_1_WRAP(NT, WT, NAME, a, b, out, n)
+ 
+ #include "avg_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i16-from-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i16-from-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i16-from-i64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i16-from-i64.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 -O3" } */
+ 
+ #include "avg.h"
+ #include "avg_data.h"
+ 
+ #define WT   int64_t
+ #define NT   int16_t
+ #define NAME avg_ceil
+ 
+ DEF_AVG_1_WRAP(NT, WT, NAME)
+ 
+ #define TEST_DATA                            TEST_AVG_DATA_WRAP(NT, NAME)
+ #define TEST_RUN(NT, WT, NAME, a, b, out, n) RUN_AVG_1_WRAP(NT, WT, NAME, a, b, out, n)
+ 
+ #include "avg_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i32-from-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i32-from-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i32-from-i64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i32-from-i64.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 -O3" } */
+ 
+ #include "avg.h"
+ #include "avg_data.h"
+ 
+ #define WT   int64_t
+ #define NT   int32_t
+ #define NAME avg_ceil
+ 
+ DEF_AVG_1_WRAP(NT, WT, NAME)
+ 
+ #define TEST_DATA                            TEST_AVG_DATA_WRAP(NT, NAME)
+ #define TEST_RUN(NT, WT, NAME, a, b, out, n) RUN_AVG_1_WRAP(NT, WT, NAME, a, b, out, n)
+ 
+ #include "avg_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i8-from-i16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i8-from-i16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i8-from-i16.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i8-from-i16.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 -O3" } */
+ 
+ #include "avg.h"
+ #include "avg_data.h"
+ 
+ #define WT   int16_t
+ #define NT   int8_t
+ #define NAME avg_ceil
+ 
+ DEF_AVG_1_WRAP(NT, WT, NAME)
+ 
+ #define TEST_DATA                            TEST_AVG_DATA_WRAP(NT, NAME)
+ #define TEST_RUN(NT, WT, NAME, a, b, out, n) RUN_AVG_1_WRAP(NT, WT, NAME, a, b, out, n)
+ 
+ #include "avg_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i8-from-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i8-from-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i8-from-i32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i8-from-i32.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 -O3" } */
+ 
+ #include "avg.h"
+ #include "avg_data.h"
+ 
+ #define WT   int32_t
+ #define NT   int8_t
+ #define NAME avg_ceil
+ 
+ DEF_AVG_1_WRAP(NT, WT, NAME)
+ 
+ #define TEST_DATA                            TEST_AVG_DATA_WRAP(NT, NAME)
+ #define TEST_RUN(NT, WT, NAME, a, b, out, n) RUN_AVG_1_WRAP(NT, WT, NAME, a, b, out, n)
+ 
+ #include "avg_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i8-from-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i8-from-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i8-from-i64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_ceil-run-1-i8-from-i64.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 -O3" } */
+ 
+ #include "avg.h"
+ #include "avg_data.h"
+ 
+ #define WT   int64_t
+ #define NT   int8_t
+ #define NAME avg_ceil
+ 
+ DEF_AVG_1_WRAP(NT, WT, NAME)
+ 
+ #define TEST_DATA                            TEST_AVG_DATA_WRAP(NT, NAME)
+ #define TEST_RUN(NT, WT, NAME, a, b, out, n) RUN_AVG_1_WRAP(NT, WT, NAME, a, b, out, n)
+ 
+ #include "avg_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_data.h gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_data.h
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_data.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_data.h	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,361 ----
+ #ifndef HAVE_DEFINED_AVG_DATA_H
+ #define HAVE_DEFINED_AVG_DATA_H
+ 
+ #define N 16
+ 
+ #define TEST_AVG_DATA(T, NAME)      test_##T##_##NAME##_data
+ #define TEST_AVG_DATA_WRAP(T, NAME) TEST_AVG_DATA(T, NAME)
+ 
+ int8_t TEST_AVG_DATA(int8_t, avg_floor)[][3][N] =
+ {
+   {
+     {
+        0,  0,  0,  0,
+        1,  1,  1,  1,
+       -1, -1, -1, -1,
+        8,  8,  8,  8,
+     },
+     {
+        0,  0,  0,  0,
+        0,  0,  0,  0,
+       -2, -2, -2, -2,
+        1,  1,  1,  1,
+     },
+     {
+        0,  0,  0,  0,
+        0,  0,  0,  0,
+       -2, -2, -2, -2,
+        4,  4,  4,  4,
+     },
+   },
+   {
+     {
+        127,  127,  127,  127,
+        127,  127,  127,  127,
+       -128, -128, -128, -128,
+       -128, -128, -128, -128,
+     },
+     {
+        126,  126,  126,  126,
+         -2,   -2,   -2,   -2,
+        127,  127,  127,  127,
+       -127, -127, -127, -127,
+     },
+     {
+        126,  126,  126,  126,
+         62,   62,   62,   62,
+         -1,   -1,   -1,   -1,
+       -128, -128, -128, -128,
+     },
+   },
+ };
+ 
+ int16_t TEST_AVG_DATA(int16_t, avg_floor)[][3][N] =
+ {
+   {
+     {
+        0,  0,  0,  0,
+        1,  1,  1,  1,
+       -1, -1, -1, -1,
+        8,  8,  8,  8,
+     },
+     {
+        0,  0,  0,  0,
+        0,  0,  0,  0,
+       -2, -2, -2, -2,
+        1,  1,  1,  1,
+     },
+     {
+        0,  0,  0,  0,
+        0,  0,  0,  0,
+       -2, -2, -2, -2,
+        4,  4,  4,  4,
+     },
+   },
+   {
+     {
+        32767,  32767,  32767,  32767,
+        32767,  32767,  32767,  32767,
+       -32768, -32768, -32768, -32768,
+       -32768, -32768, -32768, -32768,
+     },
+     {
+        32766,  32766,  32766,  32766,
+           -2,     -2,     -2,     -2,
+        32767,  32767,  32767,  32767,
+       -32767, -32767, -32767, -32767,
+     },
+     {
+        32766,  32766,  32766,  32766,
+        16382,  16382,  16382,  16382,
+           -1,     -1,     -1,     -1,
+       -32768, -32768, -32768, -32768,
+     },
+   },
+ };
+ 
+ int32_t TEST_AVG_DATA(int32_t, avg_floor)[][3][N] =
+ {
+   {
+     {
+        0,  0,  0,  0,
+        1,  1,  1,  1,
+       -1, -1, -1, -1,
+        8,  8,  8,  8,
+     },
+     {
+        0,  0,  0,  0,
+        0,  0,  0,  0,
+       -2, -2, -2, -2,
+        1,  1,  1,  1,
+     },
+     {
+        0,  0,  0,  0,
+        0,  0,  0,  0,
+       -2, -2, -2, -2,
+        4,  4,  4,  4,
+     },
+   },
+   {
+     {
+        2147483647,  2147483647,  2147483647,  2147483647,
+        2147483647,  2147483647,  2147483647,  2147483647,
+       -2147483648, -2147483648, -2147483648, -2147483648,
+       -2147483648, -2147483648, -2147483648, -2147483648,
+     },
+     {
+        2147483646,  2147483646,  2147483646,  2147483646,
+                -2,          -2,          -2,          -2,
+        2147483647,  2147483647,  2147483647,  2147483647,
+       -2147483647, -2147483647, -2147483647, -2147483647,
+     },
+     {
+        2147483646,  2147483646,  2147483646,  2147483646,
+        1073741822,  1073741822,  1073741822,  1073741822,
+                -1,          -1,          -1,          -1,
+       -2147483648, -2147483648, -2147483648, -2147483648,
+     },
+   },
+ };
+ 
+ int64_t TEST_AVG_DATA(int64_t, avg_floor)[][3][N] =
+ {
+   {
+     {
+        0,  0,  0,  0,
+        1,  1,  1,  1,
+       -1, -1, -1, -1,
+        8,  8,  8,  8,
+     },
+     {
+        0,  0,  0,  0,
+        0,  0,  0,  0,
+       -2, -2, -2, -2,
+        1,  1,  1,  1,
+     },
+     {
+        0,  0,  0,  0,
+        0,  0,  0,  0,
+       -2, -2, -2, -2,
+        4,  4,  4,  4,
+     },
+   },
+   {
+     {
+        9223372036854775807ull,  9223372036854775807ull,  9223372036854775807ull,  9223372036854775807ull,
+        9223372036854775807ull,  9223372036854775807ull,  9223372036854775807ull,  9223372036854775807ull,
+       -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull,
+       -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull,
+     },
+     {
+        9223372036854775806ull,  9223372036854775806ull,  9223372036854775806ull,  9223372036854775806ull,
+        9223372036854775807ull,  9223372036854775807ull,  9223372036854775807ull,  9223372036854775807ull,
+                         -2ull,                   -2ull,                   -2ull,                   -2ull,
+       -9223372036854775807ull, -9223372036854775807ull, -9223372036854775807ull, -9223372036854775807ull,
+     },
+     {
+        9223372036854775806ull,  9223372036854775806ull,  9223372036854775806ull,  9223372036854775806ull,
+        4611686018427387902ull,  4611686018427387902ull,  4611686018427387902ull,  4611686018427387902ull,
+                         -1ull,                   -1ull,                   -1ull,                   -1ull,
+       -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull,
+     },
+   },
+ };
+ 
+ int8_t TEST_AVG_DATA(int8_t, avg_ceil)[][3][N] =
+ {
+   {
+     {
+        0,  0,  0,  0,
+        1,  1,  1,  1,
+       -1, -1, -1, -1,
+        8,  8,  8,  8,
+     },
+     {
+        0,  0,  0,  0,
+        0,  0,  0,  0,
+       -2, -2, -2, -2,
+        1,  1,  1,  1,
+     },
+     {
+        0,  0,  0,  0,
+        1,  1,  1,  1,
+       -1, -1, -1, -1,
+        5,  5,  5,  5,
+     },
+   },
+   {
+     {
+        127,  127,  127,  127,
+        127,  127,  127,  127,
+       -128, -128, -128, -128,
+       -128, -128, -128, -128,
+     },
+     {
+        126,  126,  126,  126,
+         -2,   -2,   -2,   -2,
+        127,  127,  127,  127,
+       -127, -127, -127, -127,
+     },
+     {
+        127,  127,  127,  127,
+         63,   63,   63,   63,
+          0,    0,    0,    0,
+       -127, -127, -127, -127,
+     },
+   },
+ };
+ 
+ int16_t TEST_AVG_DATA(int16_t, avg_ceil)[][3][N] =
+ {
+   {
+     {
+        0,  0,  0,  0,
+        1,  1,  1,  1,
+       -1, -1, -1, -1,
+        8,  8,  8,  8,
+     },
+     {
+        0,  0,  0,  0,
+        0,  0,  0,  0,
+       -2, -2, -2, -2,
+        1,  1,  1,  1,
+     },
+     {
+        0,  0,  0,  0,
+        1,  1,  1,  1,
+       -1, -1, -1, -1,
+        5,  5,  5,  5,
+     },
+   },
+   {
+     {
+        32767,  32767,  32767,  32767,
+        32767,  32767,  32767,  32767,
+       -32768, -32768, -32768, -32768,
+       -32768, -32768, -32768, -32768,
+     },
+     {
+        32766,  32766,  32766,  32766,
+           -2,     -2,     -2,     -2,
+        32767,  32767,  32767,  32767,
+       -32767, -32767, -32767, -32767,
+     },
+     {
+        32767,  32767,  32767,  32767,
+        16383,  16383,  16383,  16383,
+            0,      0,      0,      0,
+       -32767, -32767, -32767, -32767,
+     },
+   },
+ };
+ 
+ int32_t TEST_AVG_DATA(int32_t, avg_ceil)[][3][N] =
+ {
+   {
+     {
+        0,  0,  0,  0,
+        1,  1,  1,  1,
+       -1, -1, -1, -1,
+        8,  8,  8,  8,
+     },
+     {
+        0,  0,  0,  0,
+        0,  0,  0,  0,
+       -2, -2, -2, -2,
+        1,  1,  1,  1,
+     },
+     {
+        0,  0,  0,  0,
+        1,  1,  1,  1,
+       -1, -1, -1, -1,
+        5,  5,  5,  5,
+     },
+   },
+   {
+     {
+        2147483647,  2147483647,  2147483647,  2147483647,
+        2147483647,  2147483647,  2147483647,  2147483647,
+       -2147483648, -2147483648, -2147483648, -2147483648,
+       -2147483648, -2147483648, -2147483648, -2147483648,
+     },
+     {
+        2147483646,  2147483646,  2147483646,  2147483646,
+                -2,          -2,          -2,          -2,
+        2147483647,  2147483647,  2147483647,  2147483647,
+       -2147483647, -2147483647, -2147483647, -2147483647,
+     },
+     {
+        2147483647,  2147483647,  2147483647,  2147483647,
+        1073741823,  1073741823,  1073741823,  1073741823,
+                 0,           0,           0,           0,
+       -2147483647, -2147483647, -2147483647, -2147483647,
+     },
+   },
+ };
+ 
+ int64_t TEST_AVG_DATA(int64_t, avg_ceil)[][3][N] =
+ {
+   {
+     {
+        0,  0,  0,  0,
+        1,  1,  1,  1,
+       -1, -1, -1, -1,
+        8,  8,  8,  8,
+     },
+     {
+        0,  0,  0,  0,
+        0,  0,  0,  0,
+       -2, -2, -2, -2,
+        1,  1,  1,  1,
+     },
+     {
+        0,  0,  0,  0,
+        1,  1,  1,  1,
+       -1, -1, -1, -1,
+        5,  5,  5,  5,
+     },
+   },
+   {
+     {
+        9223372036854775807ull,  9223372036854775807ull,  9223372036854775807ull,  9223372036854775807ull,
+        9223372036854775807ull,  9223372036854775807ull,  9223372036854775807ull,  9223372036854775807ull,
+       -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull,
+       -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull,
+     },
+     {
+        9223372036854775806ull,  9223372036854775806ull,  9223372036854775806ull,  9223372036854775806ull,
+        9223372036854775807ull,  9223372036854775807ull,  9223372036854775807ull,  9223372036854775807ull,
+                         -2ull,                   -2ull,                   -2ull,                   -2ull,
+       -9223372036854775807ull, -9223372036854775807ull, -9223372036854775807ull, -9223372036854775807ull,
+     },
+     {
+        9223372036854775807ull,  9223372036854775807ull,  9223372036854775807ull,  9223372036854775807ull,
+        4611686018427387903ull,  4611686018427387903ull,  4611686018427387903ull,  4611686018427387903ull,
+                          0ull,                    0ull,                    0ull,                    0ull,
+       -9223372036854775807ull, -9223372036854775807ull, -9223372036854775807ull, -9223372036854775807ull,
+     },
+   },
+ };
+ 
+ #endif
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i16-from-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i16-from-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i16-from-i32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i16-from-i32.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+ 
+ #include "avg.h"
+ 
+ #define NT int16_t
+ #define WT int32_t
+ 
+ DEF_AVG_0(NT, WT, avg_floor)
+ 
+ /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 1 } } */
+ /* { dg-final { scan-assembler-times {vaadd.vv} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i16-from-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i16-from-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i16-from-i64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i16-from-i64.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+ 
+ #include "avg.h"
+ 
+ #define NT int16_t
+ #define WT int64_t
+ 
+ DEF_AVG_0(NT, WT, avg_floor)
+ 
+ /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 1 } } */
+ /* { dg-final { scan-assembler-times {vaadd.vv} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i32-from-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i32-from-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i32-from-i64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i32-from-i64.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+ 
+ #include "avg.h"
+ 
+ #define NT int32_t
+ #define WT int64_t
+ 
+ DEF_AVG_0(NT, WT, avg_floor)
+ 
+ /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 1 } } */
+ /* { dg-final { scan-assembler-times {vaadd.vv} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i16.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i16.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+ 
+ #include "avg.h"
+ 
+ #define NT int8_t
+ #define WT int16_t
+ 
+ DEF_AVG_0(NT, WT, avg_floor)
+ 
+ /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 1 } } */
+ /* { dg-final { scan-assembler-times {vaadd.vv} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i32.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+ 
+ #include "avg.h"
+ 
+ #define NT int8_t
+ #define WT int32_t
+ 
+ DEF_AVG_0(NT, WT, avg_floor)
+ 
+ /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 1 } } */
+ /* { dg-final { scan-assembler-times {vaadd.vv} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i64.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+ 
+ #include "avg.h"
+ 
+ #define NT int8_t
+ #define WT int64_t
+ 
+ DEF_AVG_0(NT, WT, avg_floor)
+ 
+ /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 1 } } */
+ /* { dg-final { scan-assembler-times {vaadd.vv} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i16-from-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i16-from-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i16-from-i32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i16-from-i32.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 -O3" } */
+ 
+ #include "avg.h"
+ #include "avg_data.h"
+ 
+ #define WT   int32_t
+ #define NT   int16_t
+ #define NAME avg_floor
+ 
+ DEF_AVG_0_WRAP(NT, WT, NAME)
+ 
+ #define TEST_DATA                            TEST_AVG_DATA_WRAP(NT, NAME)
+ #define TEST_RUN(NT, WT, NAME, a, b, out, n) RUN_AVG_0_WRAP(NT, WT, NAME, a, b, out, n)
+ 
+ #include "avg_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i16-from-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i16-from-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i16-from-i64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i16-from-i64.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 -O3" } */
+ 
+ #include "avg.h"
+ #include "avg_data.h"
+ 
+ #define WT   int64_t
+ #define NT   int16_t
+ #define NAME avg_floor
+ 
+ DEF_AVG_0_WRAP(NT, WT, NAME)
+ 
+ #define TEST_DATA                            TEST_AVG_DATA_WRAP(NT, NAME)
+ #define TEST_RUN(NT, WT, NAME, a, b, out, n) RUN_AVG_0_WRAP(NT, WT, NAME, a, b, out, n)
+ 
+ #include "avg_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i32-from-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i32-from-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i32-from-i64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i32-from-i64.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 -O3" } */
+ 
+ #include "avg.h"
+ #include "avg_data.h"
+ 
+ #define WT   int64_t
+ #define NT   int32_t
+ #define NAME avg_floor
+ 
+ DEF_AVG_0_WRAP(NT, WT, NAME)
+ 
+ #define TEST_DATA                            TEST_AVG_DATA_WRAP(NT, NAME)
+ #define TEST_RUN(NT, WT, NAME, a, b, out, n) RUN_AVG_0_WRAP(NT, WT, NAME, a, b, out, n)
+ 
+ #include "avg_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i16.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i16.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 -O3" } */
+ 
+ #include "avg.h"
+ #include "avg_data.h"
+ 
+ #define WT   int16_t
+ #define NT   int8_t
+ #define NAME avg_floor
+ 
+ DEF_AVG_0_WRAP(NT, WT, NAME)
+ 
+ #define TEST_DATA                            TEST_AVG_DATA_WRAP(NT, NAME)
+ #define TEST_RUN(NT, WT, NAME, a, b, out, n) RUN_AVG_0_WRAP(NT, WT, NAME, a, b, out, n)
+ 
+ #include "avg_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i32.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 -O3" } */
+ 
+ #include "avg.h"
+ #include "avg_data.h"
+ 
+ #define WT   int32_t
+ #define NT   int8_t
+ #define NAME avg_floor
+ 
+ DEF_AVG_0_WRAP(NT, WT, NAME)
+ 
+ #define TEST_DATA                            TEST_AVG_DATA_WRAP(NT, NAME)
+ #define TEST_RUN(NT, WT, NAME, a, b, out, n) RUN_AVG_0_WRAP(NT, WT, NAME, a, b, out, n)
+ 
+ #include "avg_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i64.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 -O3" } */
+ 
+ #include "avg.h"
+ #include "avg_data.h"
+ 
+ #define WT   int64_t
+ #define NT   int8_t
+ #define NAME avg_floor
+ 
+ DEF_AVG_0_WRAP(NT, WT, NAME)
+ 
+ #define TEST_DATA                            TEST_AVG_DATA_WRAP(NT, NAME)
+ #define TEST_RUN(NT, WT, NAME, a, b, out, n) RUN_AVG_0_WRAP(NT, WT, NAME, a, b, out, n)
+ 
+ #include "avg_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_run.h gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_run.h
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_run.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_run.h	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,26 ----
+ #ifndef HAVE_DEFINED_AVG_RUN_H
+ #define HAVE_DEFINED_AVG_RUN_H
+ 
+ int
+ main ()
+ {
+   unsigned i, k;
+   NT out[N];
+ 
+   for (i = 0; i < sizeof (TEST_DATA) / sizeof (TEST_DATA[0]); i++)
+     {
+       NT *a = TEST_DATA[i][0];
+       NT *b = TEST_DATA[i][1];
+       NT *expect = TEST_DATA[i][2];
+ 
+       TEST_RUN (NT, WT, NAME, a, b, out, N);
+ 
+       for (k = 0; k < N; k++)
+ 	if (out[k] != expect[k])
+ 	  __builtin_abort ();
+     }
+ 
+   return 0;
+ }
+ 
+ #endif
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_arith.h gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_arith.h
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_arith.h	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_arith.h	Sun Jun  1 22:32:29 2025
*************** vec_sat_s_add_##T##_fmt_4 (T *out, T *op
*** 345,350 ****
--- 345,375 ----
  #define RUN_VEC_SAT_S_ADD_FMT_4_WRAP(T, out, op_1, op_2, N) \
    RUN_VEC_SAT_S_ADD_FMT_4(T, out, op_1, op_2, N)
  
+ #define DEF_VEC_SAT_S_ADD_IMM_FMT_1(INDEX, T, UT, IMM, MIN, MAX)     \
+ void __attribute__((noinline))                                       \
+ vec_sat_s_add_imm_##T##_fmt_1##_##INDEX (T *out, T *op_1, unsigned limit) \
+ {                                                                    \
+   unsigned i;                                                        \
+   for (i = 0; i < limit; i++)                                        \
+     {                                                                \
+       T x = op_1[i];                                                 \
+       T sum = (UT)x + (UT)IMM;                                       \
+       out[i] = (x ^ IMM) < 0                                         \
+         ? sum                                                        \
+         : (sum ^ x) >= 0                                             \
+           ? sum                                                      \
+           : x < 0 ? MIN : MAX;                                       \
+     }                                                                \
+ }
+ #define DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(INDEX, T, UT, IMM, MIN, MAX) \
+   DEF_VEC_SAT_S_ADD_IMM_FMT_1(INDEX, T, UT, IMM, MIN, MAX)
+ 
+ #define RUN_VEC_SAT_S_ADD_IMM_FMT_1(INDEX, T, out, in, expect, IMM, N) \
+   vec_sat_s_add_imm_##T##_fmt_1##_##INDEX (out, in, N);             \
+   VALIDATE_RESULT (out, expect, N)
+ #define RUN_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(INDEX, T, out, in, expect, IMM, N) \
+   RUN_VEC_SAT_S_ADD_IMM_FMT_1(INDEX, T, out, in, expect, IMM, N)
+ 
  /******************************************************************************/
  /* Saturation Sub (Unsigned and Signed)                                       */
  /******************************************************************************/
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_data.h gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_data.h
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_data.h	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_data.h	Sun Jun  1 22:32:29 2025
*************** uint64_t TEST_UNARY_DATA(uint64_t, sat_u
*** 744,749 ****
--- 744,989 ----
    },
  };
  
+ int8_t TEST_UNARY_DATA(int8_t, sat_s_add_imm)[][2][N] =
+ {
+   { /* For add imm -128 */
+     {
+       -128, 0, 100, 127,
+       -128, 0, 100, 127,
+       -128, 0, 100, 127,
+       -128, 0, 100, 127,
+     },
+     {
+       -128, -128, -28, -1,
+       -128, -128, -28, -1,
+       -128, -128, -28, -1,
+       -128, -128, -28, -1,
+     },
+   },
+   { /* For add imm 0 */
+     {
+       -128, 0, 100, 127,
+       -128, 0, 100, 127,
+       -128, 0, 100, 127,
+       -128, 0, 100, 127,
+     },
+     {
+       -128, 0, 100, 127,
+       -128, 0, 100, 127,
+       -128, 0, 100, 127,
+       -128, 0, 100, 127,
+     },
+   },
+   { /* For add imm 1 */
+     {
+       -128, 0, 100, 127,
+       -128, 0, 100, 127,
+       -128, 0, 100, 127,
+       -128, 0, 100, 127,
+     },
+     {
+       -127, 1, 101, 127,
+       -127, 1, 101, 127,
+       -127, 1, 101, 127,
+       -127, 1, 101, 127,
+     },
+   },
+   { /* For add imm 127 */
+     {
+       -128, 0, 100, 127,
+       -128, 0, 100, 127,
+       -128, 0, 100, 127,
+       -128, 0, 100, 127,
+     },
+     {
+       -1, 127, 127, 127,
+       -1, 127, 127, 127,
+       -1, 127, 127, 127,
+       -1, 127, 127, 127,
+     },
+   },
+ };
+ 
+ int16_t TEST_UNARY_DATA(int16_t, sat_s_add_imm)[][2][N] =
+ {
+   { /* For add imm -32768 */
+     {
+       -32768, 0, 100, 32767,
+       -32768, 0, 100, 32767,
+       -32768, 0, 100, 32767,
+       -32768, 0, 100, 32767,
+     },
+     {
+       -32768, -32768, -32668, -1,
+       -32768, -32768, -32668, -1,
+       -32768, -32768, -32668, -1,
+       -32768, -32768, -32668, -1,
+     },
+   },
+   { /* For add imm 0 */
+     {
+       -32768, 0, 100, 32767,
+       -32768, 0, 100, 32767,
+       -32768, 0, 100, 32767,
+       -32768, 0, 100, 32767,
+     },
+     {
+       -32768, 0, 100, 32767,
+       -32768, 0, 100, 32767,
+       -32768, 0, 100, 32767,
+       -32768, 0, 100, 32767,
+     },
+   },
+   { /* For add imm 1 */
+     {
+       -32768, 0, 100, 32767,
+       -32768, 0, 100, 32767,
+       -32768, 0, 100, 32767,
+       -32768, 0, 100, 32767,
+     },
+     {
+       -32767, 1, 101, 32767,
+       -32767, 1, 101, 32767,
+       -32767, 1, 101, 32767,
+       -32767, 1, 101, 32767,
+     },
+   },
+   { /* For add imm 32767 */
+     {
+       -32768, 0, 100, 32767,
+       -32768, 0, 100, 32767,
+       -32768, 0, 100, 32767,
+       -32768, 0, 100, 32767,
+     },
+     {
+       -1, 32767, 32767, 32767,
+       -1, 32767, 32767, 32767,
+       -1, 32767, 32767, 32767,
+       -1, 32767, 32767, 32767,
+     },
+   },
+ };
+ 
+ int32_t TEST_UNARY_DATA(int32_t, sat_s_add_imm)[][2][N] =
+ {
+   { /* For add imm -2147483648 */
+     {
+       -2147483648, 0, 100, 2147483647,
+       -2147483648, 0, 100, 2147483647,
+       -2147483648, 0, 100, 2147483647,
+       -2147483648, 0, 100, 2147483647,
+     },
+     {
+       -2147483648, -2147483648, -2147483548, -1,
+       -2147483648, -2147483648, -2147483548, -1,
+       -2147483648, -2147483648, -2147483548, -1,
+       -2147483648, -2147483648, -2147483548, -1,
+     },
+   },
+   { /* For add imm 0 */
+     {
+       -2147483648, 0, 100, 2147483647,
+       -2147483648, 0, 100, 2147483647,
+       -2147483648, 0, 100, 2147483647,
+       -2147483648, 0, 100, 2147483647,
+     },
+     {
+       -2147483648, 0, 100, 2147483647,
+       -2147483648, 0, 100, 2147483647,
+       -2147483648, 0, 100, 2147483647,
+       -2147483648, 0, 100, 2147483647,
+     },
+   },
+   { /* For add imm 1 */
+     {
+       -2147483648, 0, 100, 2147483647,
+       -2147483648, 0, 100, 2147483647,
+       -2147483648, 0, 100, 2147483647,
+       -2147483648, 0, 100, 2147483647,
+     },
+     {
+       -2147483647, 1, 101, 2147483647,
+       -2147483647, 1, 101, 2147483647,
+       -2147483647, 1, 101, 2147483647,
+       -2147483647, 1, 101, 2147483647,
+     },
+   },
+   { /* For add imm 2147483647 */
+     {
+       -2147483648, 0, 100, 2147483647,
+       -2147483648, 0, 100, 2147483647,
+       -2147483648, 0, 100, 2147483647,
+       -2147483648, 0, 100, 2147483647,
+     },
+     {
+       -1, 2147483647, 2147483647, 2147483647,
+       -1, 2147483647, 2147483647, 2147483647,
+       -1, 2147483647, 2147483647, 2147483647,
+       -1, 2147483647, 2147483647, 2147483647,
+     },
+   },
+ };
+ 
+ int64_t TEST_UNARY_DATA(int64_t, sat_s_add_imm)[][2][N] =
+ {
+   { /* For add imm -9223372036854775808ll */
+     {
+       INT64_MIN, 0, 100, INT64_MAX,
+       INT64_MIN, 0, 100, INT64_MAX,
+       INT64_MIN, 0, 100, INT64_MAX,
+       INT64_MIN, 0, 100, INT64_MAX,
+     },
+     {
+       INT64_MIN, INT64_MIN, -9223372036854775708ll, -1,
+       INT64_MIN, INT64_MIN, -9223372036854775708ll, -1,
+       INT64_MIN, INT64_MIN, -9223372036854775708ll, -1,
+       INT64_MIN, INT64_MIN, -9223372036854775708ll, -1,
+     },
+   },
+   { /* For add imm 0 */
+     {
+       INT64_MIN, 0, 100, INT64_MAX,
+       INT64_MIN, 0, 100, INT64_MAX,
+       INT64_MIN, 0, 100, INT64_MAX,
+       INT64_MIN, 0, 100, INT64_MAX,
+     },
+     {
+       INT64_MIN, 0, 100, INT64_MAX,
+       INT64_MIN, 0, 100, INT64_MAX,
+       INT64_MIN, 0, 100, INT64_MAX,
+       INT64_MIN, 0, 100, INT64_MAX,
+     },
+   },
+   { /* For add imm 1 */
+     {
+       INT64_MIN, 0, 100, INT64_MAX,
+       INT64_MIN, 0, 100, INT64_MAX,
+       INT64_MIN, 0, 100, INT64_MAX,
+       INT64_MIN, 0, 100, INT64_MAX,
+     },
+     {
+       -INT64_MAX, 1, 101, INT64_MAX,
+       -INT64_MAX, 1, 101, INT64_MAX,
+       -INT64_MAX, 1, 101, INT64_MAX,
+       -INT64_MAX, 1, 101, INT64_MAX,
+     },
+   },
+   { /* For add imm 9223372036854775807ll */
+     {
+       INT64_MIN, 0, 100, INT64_MAX,
+       INT64_MIN, 0, 100, INT64_MAX,
+       INT64_MIN, 0, 100, INT64_MAX,
+       INT64_MIN, 0, 100, INT64_MAX,
+     },
+     {
+       -1, INT64_MAX, INT64_MAX, INT64_MAX,
+       -1, INT64_MAX, INT64_MAX, INT64_MAX,
+       -1, INT64_MAX, INT64_MAX, INT64_MAX,
+       -1, INT64_MAX, INT64_MAX, INT64_MAX,
+     },
+   },
+ };
+ 
  #define TEST_BINARY_DATA_NAME(T1, T2, NAME) test_bin_##T1##_##T2##_##NAME##_data
  #define TEST_BINARY_DATA_NAME_WRAP(T1, T2, NAME) \
    TEST_BINARY_DATA_NAME(T1, T2, NAME)
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i16.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i16.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,10 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d -ftree-vectorize -fdump-tree-optimized" } */
+ 
+ #include "vec_sat_arith.h"
+ 
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int16_t, uint16_t, 9, INT16_MIN, INT16_MAX)
+ 
+ /* { dg-final { scan-tree-dump-times ".SAT_ADD " 1 "optimized" { target { no-opts "-O2" } } } } */
+ /* { dg-final { scan-tree-dump-times ".SAT_ADD " 2 "optimized" { target { no-opts "-O3" } } } } */
+ /* { dg-final { scan-assembler-times {vsadd\.vi} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i32.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,10 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d -ftree-vectorize -fdump-tree-optimized" } */
+ 
+ #include "vec_sat_arith.h"
+ 
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int32_t, uint32_t, 9, INT32_MIN, INT32_MAX)
+ 
+ /* { dg-final { scan-tree-dump-times ".SAT_ADD " 1 "optimized" { target { no-opts "-O2" } } } } */
+ /* { dg-final { scan-tree-dump-times ".SAT_ADD " 2 "optimized" { target { no-opts "-O3" } } } } */
+ /* { dg-final { scan-assembler-times {vsadd\.vi} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i64.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,10 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d -ftree-vectorize -fdump-tree-optimized" } */
+ 
+ #include "vec_sat_arith.h"
+ 
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int64_t, uint64_t, 9, INT64_MIN, INT64_MAX)
+ 
+ /* { dg-final { scan-tree-dump-times ".SAT_ADD " 1 "optimized" { target { no-opts "-O2" } } } } */
+ /* { dg-final { scan-tree-dump-times ".SAT_ADD " 2 "optimized" { target { no-opts "-O3" } } } } */
+ /* { dg-final { scan-assembler-times {vsadd\.vi} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i8.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i8.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,10 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d -ftree-vectorize -fdump-tree-optimized" } */
+ 
+ #include "vec_sat_arith.h"
+ 
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int8_t, uint8_t, 9, INT8_MIN, INT8_MAX)
+ 
+ /* { dg-final { scan-tree-dump-times ".SAT_ADD " 1 "optimized" { target { no-opts "-O2" } } } } */
+ /* { dg-final { scan-tree-dump-times ".SAT_ADD " 2 "optimized" { target { no-opts "-O3" } } } } */
+ /* { dg-final { scan-assembler-times {vsadd\.vi} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i16.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i16.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,28 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99" } */
+ 
+ #include "vec_sat_arith.h"
+ #include "vec_sat_data.h"
+ 
+ #define T int16_t
+ #define RUN(INDEX, T, out, in, expect, IMM, N) \
+   RUN_VEC_SAT_S_ADD_IMM_FMT_1_WRAP (INDEX, T, out, in, expect, IMM, N)
+ 
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(0, int16_t, uint16_t, -32768, INT16_MIN, INT16_MAX)
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(1, int16_t, uint16_t, 0, INT16_MIN, INT16_MAX)
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(2, int16_t, uint16_t, 1, INT16_MIN, INT16_MAX)
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(3, int16_t, uint16_t, 32767, INT16_MIN, INT16_MAX)
+ 
+ int
+ main ()
+ {
+   T out[N];
+   T (*d)[2][N] = TEST_UNARY_DATA_WRAP (T, sat_s_add_imm);
+ 
+   RUN (0, T, out, d[0][0], d[0][1], -32768, N);
+   RUN (1, T, out, d[1][0], d[1][1], 0,    N);
+   RUN (2, T, out, d[2][0], d[2][1], 1,    N);
+   RUN (3, T, out, d[3][0], d[3][1], 32767,  N);
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i32.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,28 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99" } */
+ 
+ #include "vec_sat_arith.h"
+ #include "vec_sat_data.h"
+ 
+ #define T int32_t
+ #define RUN(INDEX, T, out, in, expect, IMM, N) \
+   RUN_VEC_SAT_S_ADD_IMM_FMT_1_WRAP (INDEX, T, out, in, expect, IMM, N)
+ 
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(0, int32_t, uint32_t, -2147483648, INT32_MIN, INT32_MAX)
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(1, int32_t, uint32_t, 0, INT32_MIN, INT32_MAX)
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(2, int32_t, uint32_t, 1, INT32_MIN, INT32_MAX)
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(3, int32_t, uint32_t, 2147483647, INT32_MIN, INT32_MAX)
+ 
+ int
+ main ()
+ {
+   T out[N];
+   T (*d)[2][N] = TEST_UNARY_DATA_WRAP (T, sat_s_add_imm);
+ 
+   RUN (0, T, out, d[0][0], d[0][1], -2147483648, N);
+   RUN (1, T, out, d[1][0], d[1][1], 0,    N);
+   RUN (2, T, out, d[2][0], d[2][1], 1,    N);
+   RUN (3, T, out, d[3][0], d[3][1], 2147483647,  N);
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i64.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,28 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99" } */
+ 
+ #include "vec_sat_arith.h"
+ #include "vec_sat_data.h"
+ 
+ #define T int64_t
+ #define RUN(INDEX, T, out, in, expect, IMM, N) \
+   RUN_VEC_SAT_S_ADD_IMM_FMT_1_WRAP (INDEX, T, out, in, expect, IMM, N)
+ 
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(0, int64_t, uint64_t, INT64_MIN, INT64_MIN, INT64_MAX)
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(1, int64_t, uint64_t, 0, INT64_MIN, INT64_MAX)
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(2, int64_t, uint64_t, 1, INT64_MIN, INT64_MAX)
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(3, int64_t, uint64_t, INT64_MAX, INT64_MIN, INT64_MAX)
+ 
+ int
+ main ()
+ {
+   T out[N];
+   T (*d)[2][N] = TEST_UNARY_DATA_WRAP (T, sat_s_add_imm);
+ 
+   RUN (0, T, out, d[0][0], d[0][1], INT64_MIN, N);
+   RUN (1, T, out, d[1][0], d[1][1], 0,    N);
+   RUN (2, T, out, d[2][0], d[2][1], 1,    N);
+   RUN (3, T, out, d[3][0], d[3][1], INT64_MAX,  N);
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i8.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i8.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,28 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99" } */
+ 
+ #include "vec_sat_arith.h"
+ #include "vec_sat_data.h"
+ 
+ #define T int8_t
+ #define RUN(INDEX, T, out, in, expect, IMM, N) \
+   RUN_VEC_SAT_S_ADD_IMM_FMT_1_WRAP (INDEX, T, out, in, expect, IMM, N)
+ 
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(0, int8_t, uint8_t, -128, INT8_MIN, INT8_MAX)
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(1, int8_t, uint8_t, 0, INT8_MIN, INT8_MAX)
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(2, int8_t, uint8_t, 1, INT8_MIN, INT8_MAX)
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(3, int8_t, uint8_t, 127, INT8_MIN, INT8_MAX)
+ 
+ int
+ main ()
+ {
+   T out[N];
+   T (*d)[2][N] = TEST_UNARY_DATA_WRAP (T, sat_s_add_imm);
+ 
+   RUN (0, T, out, d[0][0], d[0][1], -128, N);
+   RUN (1, T, out, d[1][0], d[1][1], 0,    N);
+   RUN (2, T, out, d[2][0], d[2][1], 1,    N);
+   RUN (3, T, out, d[3][0], d[3][1], 127,  N);
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i16.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i16.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,9 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized" } */
+ 
+ #include "vec_sat_arith.h"
+ 
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int16_t, uint16_t, -32769, INT16_MIN, INT16_MAX)
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1(1, int16_t, uint16_t, 32768, INT16_MIN, INT16_MAX)
+ 
+ /* { dg-final { scan-tree-dump-not ".SAT_ADD " "optimized" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i32.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,9 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized" } */
+ 
+ #include "vec_sat_arith.h"
+ 
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int32_t, uint32_t, -2147483649, INT32_MIN, INT32_MAX)
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1(1, int32_t, uint32_t, 2147483648, INT32_MIN, INT32_MAX)
+ 
+ /* { dg-final { scan-tree-dump-not ".SAT_ADD " "optimized" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i8.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i8.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,10 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv -mabi=lp64d -ftree-vectorize -fdump-tree-optimized" } */
+ 
+ #include "vec_sat_arith.h"
+ 
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int8_t, uint8_t, 200, INT8_MIN, INT8_MAX)
+ DEF_VEC_SAT_S_ADD_IMM_FMT_1(1, int8_t, uint8_t, -300, INT8_MIN, INT8_MAX)
+ 
+ /* { dg-final { scan-tree-dump-not ".SAT_ADD " "optimized" } } */
+ 
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-1.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-1.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-1.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-1.c	Sun Jun  1 22:32:29 2025
*************** DEF_AVG_FLOOR (uint8_t, uint16_t, 512)
*** 25,33 ****
  DEF_AVG_FLOOR (uint8_t, uint16_t, 1024)
  DEF_AVG_FLOOR (uint8_t, uint16_t, 2048)
  
! /* { dg-final { scan-assembler-times {vwadd\.vv} 10 } } */
! /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 10 } } */
! /* { dg-final { scan-assembler-times {vnsra\.wi} 10 } } */
  /* { dg-final { scan-assembler-times {vaaddu\.vv} 10 } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
  /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */
--- 25,32 ----
  DEF_AVG_FLOOR (uint8_t, uint16_t, 1024)
  DEF_AVG_FLOOR (uint8_t, uint16_t, 2048)
  
! /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 20 } } */
! /* { dg-final { scan-assembler-times {vaadd\.vv} 10 } } */
  /* { dg-final { scan-assembler-times {vaaddu\.vv} 10 } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
  /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-2.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-2.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-2.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-2.c	Sun Jun  1 22:32:29 2025
*************** DEF_AVG_FLOOR (uint16_t, uint32_t, 256)
*** 23,31 ****
  DEF_AVG_FLOOR (uint16_t, uint32_t, 512)
  DEF_AVG_FLOOR (uint16_t, uint32_t, 1024)
  
! /* { dg-final { scan-assembler-times {vwadd\.vv} 9 } } */
! /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 9 } } */
! /* { dg-final { scan-assembler-times {vnsra\.wi} 9 } } */
  /* { dg-final { scan-assembler-times {vaaddu\.vv} 9 } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
  /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */
--- 23,30 ----
  DEF_AVG_FLOOR (uint16_t, uint32_t, 512)
  DEF_AVG_FLOOR (uint16_t, uint32_t, 1024)
  
! /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 18 } } */
! /* { dg-final { scan-assembler-times {vaadd\.vv} 9 } } */
  /* { dg-final { scan-assembler-times {vaaddu\.vv} 9 } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
  /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-3.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-3.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-3.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-3.c	Sun Jun  1 22:32:29 2025
*************** DEF_AVG_FLOOR (uint32_t, uint64_t, 128)
*** 21,29 ****
  DEF_AVG_FLOOR (uint32_t, uint64_t, 256)
  DEF_AVG_FLOOR (uint32_t, uint64_t, 512)
  
! /* { dg-final { scan-assembler-times {vwadd\.vv} 8 } } */
! /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 8 } } */
! /* { dg-final { scan-assembler-times {vnsra\.wi} 8 } } */
  /* { dg-final { scan-assembler-times {vaaddu\.vv} 8 } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
  /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */
--- 21,28 ----
  DEF_AVG_FLOOR (uint32_t, uint64_t, 256)
  DEF_AVG_FLOOR (uint32_t, uint64_t, 512)
  
! /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 16 } } */
! /* { dg-final { scan-assembler-times {vaadd\.vv} 8 } } */
  /* { dg-final { scan-assembler-times {vaaddu\.vv} 8 } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
  /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-4.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-4.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-4.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-4.c	Sun Jun  1 22:32:29 2025
*************** DEF_AVG_CEIL (uint8_t, uint16_t, 512)
*** 25,35 ****
  DEF_AVG_CEIL (uint8_t, uint16_t, 1024)
  DEF_AVG_CEIL (uint8_t, uint16_t, 2048)
  
! /* { dg-final { scan-assembler-times {vwadd\.vv} 10 } } */
! /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*0} 10 } } */
! /* { dg-final { scan-assembler-times {vnsra\.wi} 10 } } */
  /* { dg-final { scan-assembler-times {vaaddu\.vv} 10 } } */
- /* { dg-final { scan-assembler-times {vadd\.vi} 10 } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
  /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */
  /* { dg-final { scan-tree-dump-not "2,2" "optimized" } } */
--- 25,33 ----
  DEF_AVG_CEIL (uint8_t, uint16_t, 1024)
  DEF_AVG_CEIL (uint8_t, uint16_t, 2048)
  
! /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*0} 20 } } */
! /* { dg-final { scan-assembler-times {vaadd\.vv} 10 } } */
  /* { dg-final { scan-assembler-times {vaaddu\.vv} 10 } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
  /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */
  /* { dg-final { scan-tree-dump-not "2,2" "optimized" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-5.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-5.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-5.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-5.c	Sun Jun  1 22:32:29 2025
*************** DEF_AVG_CEIL (uint16_t, uint32_t, 256)
*** 23,33 ****
  DEF_AVG_CEIL (uint16_t, uint32_t, 512)
  DEF_AVG_CEIL (uint16_t, uint32_t, 1024)
  
! /* { dg-final { scan-assembler-times {vwadd\.vv} 9 } } */
! /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*0} 9 } } */
! /* { dg-final { scan-assembler-times {vnsra\.wi} 9 } } */
  /* { dg-final { scan-assembler-times {vaaddu\.vv} 9 } } */
! /* { dg-final { scan-assembler-times {vadd\.vi} 9 } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
  /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */
  /* { dg-final { scan-tree-dump-not "2,2" "optimized" } } */
--- 23,31 ----
  DEF_AVG_CEIL (uint16_t, uint32_t, 512)
  DEF_AVG_CEIL (uint16_t, uint32_t, 1024)
  
! /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*0} 18 } } */
  /* { dg-final { scan-assembler-times {vaaddu\.vv} 9 } } */
! /* { dg-final { scan-assembler-times {vaadd\.vv} 9 } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
  /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */
  /* { dg-final { scan-tree-dump-not "2,2" "optimized" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-6.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-6.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-6.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-6.c	Sun Jun  1 22:32:29 2025
*************** DEF_AVG_CEIL (uint16_t, uint32_t, 128)
*** 21,31 ****
  DEF_AVG_CEIL (uint16_t, uint32_t, 256)
  DEF_AVG_CEIL (uint16_t, uint32_t, 512)
  
! /* { dg-final { scan-assembler-times {vwadd\.vv} 8 } } */
! /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*0} 8 } } */
! /* { dg-final { scan-assembler-times {vnsra\.wi} 8 } } */
  /* { dg-final { scan-assembler-times {vaaddu\.vv} 8 } } */
! /* { dg-final { scan-assembler-times {vadd\.vi} 8 } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
  /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */
  /* { dg-final { scan-tree-dump-not "2,2" "optimized" } } */
--- 21,29 ----
  DEF_AVG_CEIL (uint16_t, uint32_t, 256)
  DEF_AVG_CEIL (uint16_t, uint32_t, 512)
  
! /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*0} 16 } } */
  /* { dg-final { scan-assembler-times {vaaddu\.vv} 8 } } */
! /* { dg-final { scan-assembler-times {vaadd\.vv} 8 } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
  /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */
  /* { dg-final { scan-tree-dump-not "2,2" "optimized" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i16.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i16.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub);
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
+ DEF_VX_BINARY_CASE_0_WRAP(T, *, mul)
  
  /* { dg-final { scan-assembler-times {vadd.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vsub.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vrsub.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vand.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vor.vx} 1 } } */
+ /* { dg-final { scan-assembler-times {vxor.vx} 1 } } */
+ /* { dg-final { scan-assembler-times {vmul.vx} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i32.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i32.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub);
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
+ DEF_VX_BINARY_CASE_0_WRAP(T, *, mul)
  
  /* { dg-final { scan-assembler-times {vadd.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vsub.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vrsub.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vand.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vor.vx} 1 } } */
+ /* { dg-final { scan-assembler-times {vxor.vx} 1 } } */
+ /* { dg-final { scan-assembler-times {vmul.vx} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i64.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i64.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub);
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
+ DEF_VX_BINARY_CASE_0_WRAP(T, *, mul)
  
  /* { dg-final { scan-assembler-times {vadd.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vsub.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vrsub.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vand.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vor.vx} 1 } } */
+ /* { dg-final { scan-assembler-times {vxor.vx} 1 } } */
+ /* { dg-final { scan-assembler-times {vmul.vx} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i8.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i8.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub);
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
+ DEF_VX_BINARY_CASE_0_WRAP(T, *, mul)
  
  /* { dg-final { scan-assembler-times {vadd.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vsub.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vrsub.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vand.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vor.vx} 1 } } */
+ /* { dg-final { scan-assembler-times {vxor.vx} 1 } } */
+ /* { dg-final { scan-assembler-times {vmul.vx} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub);
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
  
  /* { dg-final { scan-assembler-times {vadd.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vsub.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vrsub.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vand.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vor.vx} 1 } } */
+ /* { dg-final { scan-assembler-times {vxor.vx} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub);
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
  
  /* { dg-final { scan-assembler-times {vadd.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vsub.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vrsub.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vand.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vor.vx} 1 } } */
+ /* { dg-final { scan-assembler-times {vxor.vx} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub);
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
  
  /* { dg-final { scan-assembler-times {vadd.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vsub.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vrsub.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vand.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vor.vx} 1 } } */
+ /* { dg-final { scan-assembler-times {vxor.vx} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub);
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
  
  /* { dg-final { scan-assembler-times {vadd.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vsub.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vrsub.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vand.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vor.vx} 1 } } */
+ /* { dg-final { scan-assembler-times {vxor.vx} 1 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i16.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i16.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub)
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
+ DEF_VX_BINARY_CASE_0_WRAP(T, *, mul)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
  /* { dg-final { scan-assembler-not {vrsub.vx} } } */
  /* { dg-final { scan-assembler-not {vand.vx} } } */
  /* { dg-final { scan-assembler-not {vor.vx} } } */
+ /* { dg-final { scan-assembler-not {vxor.vx} } } */
+ /* { dg-final { scan-assembler-not {vmul.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i32.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i32.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub)
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
+ DEF_VX_BINARY_CASE_0_WRAP(T, *, mul)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
  /* { dg-final { scan-assembler-not {vrsub.vx} } } */
  /* { dg-final { scan-assembler-not {vand.vx} } } */
  /* { dg-final { scan-assembler-not {vor.vx} } } */
+ /* { dg-final { scan-assembler-not {vxor.vx} } } */
+ /* { dg-final { scan-assembler-not {vmul.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i64.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i64.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub)
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
+ DEF_VX_BINARY_CASE_0_WRAP(T, *, mul)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
  /* { dg-final { scan-assembler-not {vrsub.vx} } } */
  /* { dg-final { scan-assembler-not {vand.vx} } } */
  /* { dg-final { scan-assembler-not {vor.vx} } } */
+ /* { dg-final { scan-assembler-not {vxor.vx} } } */
+ /* { dg-final { scan-assembler-not {vmul.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i8.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i8.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub)
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
+ DEF_VX_BINARY_CASE_0_WRAP(T, *, mul)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
  /* { dg-final { scan-assembler-not {vrsub.vx} } } */
  /* { dg-final { scan-assembler-not {vand.vx} } } */
  /* { dg-final { scan-assembler-not {vor.vx} } } */
+ /* { dg-final { scan-assembler-not {vxor.vx} } } */
+ /* { dg-final { scan-assembler-not {vmul.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub)
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
  /* { dg-final { scan-assembler-not {vrsub.vx} } } */
  /* { dg-final { scan-assembler-not {vand.vx} } } */
  /* { dg-final { scan-assembler-not {vor.vx} } } */
+ /* { dg-final { scan-assembler-not {vxor.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub)
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
  /* { dg-final { scan-assembler-not {vrsub.vx} } } */
  /* { dg-final { scan-assembler-not {vand.vx} } } */
  /* { dg-final { scan-assembler-not {vor.vx} } } */
+ /* { dg-final { scan-assembler-not {vxor.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub)
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
  /* { dg-final { scan-assembler-not {vrsub.vx} } } */
  /* { dg-final { scan-assembler-not {vand.vx} } } */
  /* { dg-final { scan-assembler-not {vor.vx} } } */
+ /* { dg-final { scan-assembler-not {vxor.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub)
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
  /* { dg-final { scan-assembler-not {vrsub.vx} } } */
  /* { dg-final { scan-assembler-not {vand.vx} } } */
  /* { dg-final { scan-assembler-not {vor.vx} } } */
+ /* { dg-final { scan-assembler-not {vxor.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i16.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i16.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub)
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
+ DEF_VX_BINARY_CASE_0_WRAP(T, *, mul)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
  /* { dg-final { scan-assembler-not {vrsub.vx} } } */
  /* { dg-final { scan-assembler-not {vand.vx} } } */
  /* { dg-final { scan-assembler-not {vor.vx} } } */
+ /* { dg-final { scan-assembler-not {vxor.vx} } } */
+ /* { dg-final { scan-assembler-not {vmul.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i32.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i32.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub)
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
+ DEF_VX_BINARY_CASE_0_WRAP(T, *, mul)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
  /* { dg-final { scan-assembler-not {vrsub.vx} } } */
  /* { dg-final { scan-assembler-not {vand.vx} } } */
  /* { dg-final { scan-assembler-not {vor.vx} } } */
+ /* { dg-final { scan-assembler-not {vxor.vx} } } */
+ /* { dg-final { scan-assembler-not {vmul.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i64.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i64.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub)
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
+ DEF_VX_BINARY_CASE_0_WRAP(T, *, mul)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
  /* { dg-final { scan-assembler-not {vrsub.vx} } } */
  /* { dg-final { scan-assembler-not {vand.vx} } } */
  /* { dg-final { scan-assembler-not {vor.vx} } } */
+ /* { dg-final { scan-assembler-not {vxor.vx} } } */
+ /* { dg-final { scan-assembler-not {vmul.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i8.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i8.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub)
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
+ DEF_VX_BINARY_CASE_0_WRAP(T, *, mul)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
  /* { dg-final { scan-assembler-not {vrsub.vx} } } */
  /* { dg-final { scan-assembler-not {vand.vx} } } */
  /* { dg-final { scan-assembler-not {vor.vx} } } */
+ /* { dg-final { scan-assembler-not {vxor.vx} } } */
+ /* { dg-final { scan-assembler-not {vmul.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub)
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
  /* { dg-final { scan-assembler-not {vrsub.vx} } } */
  /* { dg-final { scan-assembler-not {vand.vx} } } */
  /* { dg-final { scan-assembler-not {vor.vx} } } */
+ /* { dg-final { scan-assembler-not {vxor.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub)
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
  /* { dg-final { scan-assembler-not {vrsub.vx} } } */
  /* { dg-final { scan-assembler-not {vand.vx} } } */
  /* { dg-final { scan-assembler-not {vor.vx} } } */
+ /* { dg-final { scan-assembler-not {vxor.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0(T, -, sub)
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_0(T, -, rsub)
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
  /* { dg-final { scan-assembler-not {vrsub.vx} } } */
  /* { dg-final { scan-assembler-not {vand.vx} } } */
  /* { dg-final { scan-assembler-not {vor.vx} } } */
+ /* { dg-final { scan-assembler-not {vxor.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub)
  DEF_VX_BINARY_CASE_0_WRAP(T, &, and)
  DEF_VX_BINARY_CASE_0_WRAP(T, |, or)
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
  /* { dg-final { scan-assembler-not {vrsub.vx} } } */
  /* { dg-final { scan-assembler-not {vand.vx} } } */
  /* { dg-final { scan-assembler-not {vor.vx} } } */
+ /* { dg-final { scan-assembler-not {vxor.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i16.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i16.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X16)
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X16)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X16)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X16)
+ DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY_X16)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
+ /* { dg-final { scan-assembler {vmul.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i32.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i32.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X4)
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X4)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X4)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X4)
+ DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY_X4)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
+ /* { dg-final { scan-assembler {vmul.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i64.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i64.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY)
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY)
+ DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
+ /* { dg-final { scan-assembler {vmul.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i8.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i8.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X16)
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X16)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X16)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X16)
+ DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY_X16)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
+ /* { dg-final { scan-assembler {vmul.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X16)
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X16)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X16)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X16)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X4)
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X4)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X4)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X4)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY)
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X16)
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X16)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X16)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X16)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i16.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i16.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X8)
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X8)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X8)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X8)
+ DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY_X8)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
+ /* { dg-final { scan-assembler-not {vmul.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i32.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i32.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X4)
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X4)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X4)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X4)
+ DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY_X4)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
+ /* { dg-final { scan-assembler {vmul.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i64.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i64.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY)
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY)
+ DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
+ /* { dg-final { scan-assembler {vmul.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i8.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i8.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X16)
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X16)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X16)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X16)
+ DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY_X16)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
+ /* { dg-final { scan-assembler-not {vmul.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X8)
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X8)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X8)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X8)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X4)
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X4)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X4)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X4)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY)
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X16)
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X16)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X16)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X16)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i16.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i16.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X8);
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X8)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X8)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X8)
+ DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY_X8)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
+ /* { dg-final { scan-assembler-not {vmul.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i32.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i32.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X4);
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X4)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X4)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X4)
+ DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY_X4)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
+ /* { dg-final { scan-assembler {vmul.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i64.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i64.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY);
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY)
+ DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
  /* { dg-final { scan-assembler-not {vrsub.vx} } } */
  /* { dg-final { scan-assembler-not {vand.vx} } } */
  /* { dg-final { scan-assembler-not {vor.vx} } } */
+ /* { dg-final { scan-assembler-not {vxor.vx} } } */
+ /* { dg-final { scan-assembler-not {vmul.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i8.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i8.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,22 ----
  DEF_VX_BINARY_REVERSE_CASE_1(T, -, rsub, VX_BINARY_REVERSE_BODY_X16);
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X16)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X16)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X16)
+ DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY_X16)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
+ /* { dg-final { scan-assembler-not {vmul.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X8);
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X8)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X8)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X8)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X4);
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X4)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X4)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X4)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY);
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
  /* { dg-final { scan-assembler-not {vrsub.vx} } } */
  /* { dg-final { scan-assembler-not {vand.vx} } } */
  /* { dg-final { scan-assembler-not {vor.vx} } } */
+ /* { dg-final { scan-assembler-not {vxor.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c	Sun Jun  1 22:32:29 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_
*** 10,18 ****
--- 10,20 ----
  DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X16);
  DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X16)
  DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X16)
+ DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X16)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
  /* { dg-final { scan-assembler {vrsub.vx} } } */
  /* { dg-final { scan-assembler {vand.vx} } } */
  /* { dg-final { scan-assembler {vor.vx} } } */
+ /* { dg-final { scan-assembler {vxor.vx} } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h	Sun Jun  1 22:32:29 2025
*************** uint64_t TEST_BINARY_DATA(uint64_t, or)[
*** 1966,1969 ****
--- 1966,2557 ----
    },
  };
  
+ int8_t TEST_BINARY_DATA(int8_t, xor)[][3][N] =
+ {
+   {
+     { 0x1 },
+     {
+        0x1,  0x1,  0x1,  0x1,
+        0x2,  0x2,  0x2,  0x2,
+        0x0,  0x0,  0x0,  0x0,
+       0xff, 0xff, 0xff, 0xff,
+     },
+     {
+        0x0,  0x0,  0x0,  0x0,
+        0x3,  0x3,  0x3,  0x3,
+        0x1,  0x1,  0x1,  0x1,
+       0xfe, 0xfe, 0xfe, 0xfe,
+     },
+   },
+   {
+     { 0x7f },
+     {
+       0x7f, 0x7f, 0x7f, 0x7f,
+       0x80, 0x80, 0x80, 0x80,
+        0xf,  0xf,  0xf,  0xf,
+       0x70, 0x70, 0x70, 0x70,
+     },
+     {
+        0x0,  0x0,  0x0,  0x0,
+       0xff, 0xff, 0xff, 0xff,
+       0x70, 0x70, 0x70, 0x70,
+        0xf,  0xf,  0xf,  0xf,
+     },
+   },
+   {
+     { 0xf0 },
+     {
+       0xff, 0xff, 0xff, 0xff,
+       0x1f, 0x1f, 0x1f, 0x1f,
+       0x80, 0x80, 0x80, 0x80,
+        0x1,  0x1,  0x1,  0x1,
+     },
+     {
+        0xf,  0xf,  0xf,  0xf,
+       0xef, 0xef, 0xef, 0xef,
+       0x70, 0x70, 0x70, 0x70,
+       0xf1, 0xf1, 0xf1, 0xf1,
+     },
+   },
+ };
+ 
+ int16_t TEST_BINARY_DATA(int16_t, xor)[][3][N] =
+ {
+   {
+     { 0x1 },
+     {
+          0x1,    0x1,    0x1,    0x1,
+          0x2,    0x2,    0x2,    0x2,
+          0x0,    0x0,    0x0,    0x0,
+       0xffff, 0xffff, 0xffff, 0xffff,
+     },
+     {
+          0x0,    0x0,    0x0,    0x0,
+          0x3,    0x3,    0x3,    0x3,
+          0x1,    0x1,    0x1,    0x1,
+       0xfffe, 0xfffe, 0xfffe, 0xfffe,
+     },
+   },
+   {
+     { 0x7fff },
+     {
+       0x7fff, 0x7fff, 0x7fff, 0x7fff,
+       0x8000, 0x8000, 0x8000, 0x8000,
+          0xf,    0xf,    0xf,    0xf,
+       0x7000, 0x7000, 0x7000, 0x7000,
+     },
+     {
+          0x0,    0x0,    0x0,    0x0,
+       0xffff, 0xffff, 0xffff, 0xffff,
+       0x7ff0, 0x7ff0, 0x7ff0, 0x7ff0,
+       0x0fff, 0x0fff, 0x0fff, 0x0fff,
+     },
+   },
+   {
+     { 0xfff0 },
+     {
+       0xffff, 0xffff, 0xffff, 0xffff,
+         0x1f,   0x1f,   0x1f,   0x1f,
+       0x8000, 0x8000, 0x8000, 0x8000,
+          0x1,    0x1,    0x1,    0x1,
+     },
+     {
+          0xf,    0xf,    0xf,    0xf,
+       0xffef, 0xffef, 0xffef, 0xffef,
+       0x7ff0, 0x7ff0, 0x7ff0, 0x7ff0,
+       0xfff1, 0xfff1, 0xfff1, 0xfff1,
+     },
+   },
+ };
+ 
+ int32_t TEST_BINARY_DATA(int32_t, xor)[][3][N] =
+ {
+   {
+     { 0x1 },
+     {
+              0x1,        0x1,        0x1,        0x1,
+              0x2,        0x2,        0x2,        0x2,
+              0x0,        0x0,        0x0,        0x0,
+       0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+     },
+     {
+              0x0,        0x0,        0x0,        0x0,
+              0x3,        0x3,        0x3,        0x3,
+              0x1,        0x1,        0x1,        0x1,
+       0xfffffffe, 0xfffffffe, 0xfffffffe, 0xfffffffe,
+     },
+   },
+   {
+     { 0x7fffffff },
+     {
+       0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff,
+       0x80000000, 0x80000000, 0x80000000, 0x80000000,
+              0xf,        0xf,        0xf,        0xf,
+       0x70000000, 0x70000000, 0x70000000, 0x70000000,
+     },
+     {
+              0x0,        0x0,        0x0,        0x0,
+       0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+       0x7ffffff0, 0x7ffffff0, 0x7ffffff0, 0x7ffffff0,
+        0xfffffff,  0xfffffff,  0xfffffff,  0xfffffff,
+     },
+   },
+   {
+     { 0xfffffff0 },
+     {
+       0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+             0x1f,       0x1f,       0x1f,       0x1f,
+       0x80000000, 0x80000000, 0x80000000, 0x80000000,
+              0x1,        0x1,        0x1,        0x1,
+     },
+     {
+              0xf,        0xf,        0xf,        0xf,
+       0xffffffef, 0xffffffef, 0xffffffef, 0xffffffef,
+       0x7ffffff0, 0x7ffffff0, 0x7ffffff0, 0x7ffffff0,
+       0xfffffff1, 0xfffffff1, 0xfffffff1, 0xfffffff1,
+     },
+   },
+ };
+ 
+ int64_t TEST_BINARY_DATA(int64_t, xor)[][3][N] =
+ {
+   {
+     { 0x1 },
+     {
+                         0x1,                   0x1,                   0x1,                   0x1,
+                         0x2,                   0x2,                   0x2,                   0x2,
+                         0x0,                   0x0,                   0x0,                   0x0,
+       0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull,
+     },
+     {
+                         0x0,                   0x0,                   0x0,                   0x0,
+                         0x3,                   0x3,                   0x3,                   0x3,
+                         0x1,                   0x1,                   0x1,                   0x1,
+       0xfffffffffffffffeull, 0xfffffffffffffffeull, 0xfffffffffffffffeull, 0xfffffffffffffffeull,
+     },
+   },
+   {
+     { 0x7fffffffffffffffull },
+     {
+       0x7fffffffffffffffull, 0x7fffffffffffffffull, 0x7fffffffffffffffull, 0x7fffffffffffffffull,
+       0x8000000000000000ull, 0x8000000000000000ull, 0x8000000000000000ull, 0x8000000000000000ull,
+                         0xf,                   0xf,                   0xf,                   0xf,
+       0x7000000000000000ull, 0x7000000000000000ull, 0x7000000000000000ull, 0x7000000000000000ull,
+     },
+     {
+                         0x0,                   0x0,                   0x0,                   0x0,
+       0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull,
+       0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull,
+        0xfffffffffffffffull,  0xfffffffffffffffull,  0xfffffffffffffffull,  0xfffffffffffffffull,
+     },
+   },
+   {
+     { 0xfffffffffffffff0ull },
+     {
+       0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull,
+                        0x1f,                  0x1f,                  0x1f,                  0x1f,
+       0x8000000000000000ull, 0x8000000000000000ull, 0x8000000000000000ull, 0x8000000000000000ull,
+                         0x1,                   0x1,                   0x1,                   0x1,
+     },
+     {
+                         0xf,                   0xf,                   0xf,                   0xf,
+       0xffffffffffffffefull, 0xffffffffffffffefull, 0xffffffffffffffefull, 0xffffffffffffffefull,
+       0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull,
+       0xfffffffffffffff1ull, 0xfffffffffffffff1ull, 0xfffffffffffffff1ull, 0xfffffffffffffff1ull,
+     },
+   },
+ };
+ 
+ uint8_t TEST_BINARY_DATA(uint8_t, xor)[][3][N] =
+ {
+   {
+     { 0x1 },
+     {
+        0x1,  0x1,  0x1,  0x1,
+        0x2,  0x2,  0x2,  0x2,
+        0x0,  0x0,  0x0,  0x0,
+       0xff, 0xff, 0xff, 0xff,
+     },
+     {
+        0x0,  0x0,  0x0,  0x0,
+        0x3,  0x3,  0x3,  0x3,
+        0x1,  0x1,  0x1,  0x1,
+       0xfe, 0xfe, 0xfe, 0xfe,
+     },
+   },
+   {
+     { 0x7f },
+     {
+       0x7f, 0x7f, 0x7f, 0x7f,
+       0x80, 0x80, 0x80, 0x80,
+        0xf,  0xf,  0xf,  0xf,
+       0x70, 0x70, 0x70, 0x70,
+     },
+     {
+        0x0,  0x0,  0x0,  0x0,
+       0xff, 0xff, 0xff, 0xff,
+       0x70, 0x70, 0x70, 0x70,
+        0xf,  0xf,  0xf,  0xf,
+     },
+   },
+   {
+     { 0xf0 },
+     {
+       0xff, 0xff, 0xff, 0xff,
+       0x1f, 0x1f, 0x1f, 0x1f,
+       0x80, 0x80, 0x80, 0x80,
+        0x1,  0x1,  0x1,  0x1,
+     },
+     {
+        0xf,  0xf,  0xf,  0xf,
+       0xef, 0xef, 0xef, 0xef,
+       0x70, 0x70, 0x70, 0x70,
+       0xf1, 0xf1, 0xf1, 0xf1,
+     },
+   },
+ };
+ 
+ uint16_t TEST_BINARY_DATA(uint16_t, xor)[][3][N] =
+ {
+   {
+     { 0x1 },
+     {
+          0x1,    0x1,    0x1,    0x1,
+          0x2,    0x2,    0x2,    0x2,
+          0x0,    0x0,    0x0,    0x0,
+       0xffff, 0xffff, 0xffff, 0xffff,
+     },
+     {
+          0x0,    0x0,    0x0,    0x0,
+          0x3,    0x3,    0x3,    0x3,
+          0x1,    0x1,    0x1,    0x1,
+       0xfffe, 0xfffe, 0xfffe, 0xfffe,
+     },
+   },
+   {
+     { 0x7fff },
+     {
+       0x7fff, 0x7fff, 0x7fff, 0x7fff,
+       0x8000, 0x8000, 0x8000, 0x8000,
+          0xf,    0xf,    0xf,    0xf,
+       0x7000, 0x7000, 0x7000, 0x7000,
+     },
+     {
+          0x0,    0x0,    0x0,    0x0,
+       0xffff, 0xffff, 0xffff, 0xffff,
+       0x7ff0, 0x7ff0, 0x7ff0, 0x7ff0,
+       0x0fff, 0x0fff, 0x0fff, 0x0fff,
+     },
+   },
+   {
+     { 0xfff0 },
+     {
+       0xffff, 0xffff, 0xffff, 0xffff,
+         0x1f,   0x1f,   0x1f,   0x1f,
+       0x8000, 0x8000, 0x8000, 0x8000,
+          0x1,    0x1,    0x1,    0x1,
+     },
+     {
+          0xf,    0xf,    0xf,    0xf,
+       0xffef, 0xffef, 0xffef, 0xffef,
+       0x7ff0, 0x7ff0, 0x7ff0, 0x7ff0,
+       0xfff1, 0xfff1, 0xfff1, 0xfff1,
+     },
+   },
+ };
+ 
+ uint32_t TEST_BINARY_DATA(uint32_t, xor)[][3][N] =
+ {
+   {
+     { 0x1 },
+     {
+              0x1,        0x1,        0x1,        0x1,
+              0x2,        0x2,        0x2,        0x2,
+              0x0,        0x0,        0x0,        0x0,
+       0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+     },
+     {
+              0x0,        0x0,        0x0,        0x0,
+              0x3,        0x3,        0x3,        0x3,
+              0x1,        0x1,        0x1,        0x1,
+       0xfffffffe, 0xfffffffe, 0xfffffffe, 0xfffffffe,
+     },
+   },
+   {
+     { 0x7fffffff },
+     {
+       0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff,
+       0x80000000, 0x80000000, 0x80000000, 0x80000000,
+              0xf,        0xf,        0xf,        0xf,
+       0x70000000, 0x70000000, 0x70000000, 0x70000000,
+     },
+     {
+              0x0,        0x0,        0x0,        0x0,
+       0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+       0x7ffffff0, 0x7ffffff0, 0x7ffffff0, 0x7ffffff0,
+        0xfffffff,  0xfffffff,  0xfffffff,  0xfffffff,
+     },
+   },
+   {
+     { 0xfffffff0 },
+     {
+       0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+             0x1f,       0x1f,       0x1f,       0x1f,
+       0x80000000, 0x80000000, 0x80000000, 0x80000000,
+              0x1,        0x1,        0x1,        0x1,
+     },
+     {
+              0xf,        0xf,        0xf,        0xf,
+       0xffffffef, 0xffffffef, 0xffffffef, 0xffffffef,
+       0x7ffffff0, 0x7ffffff0, 0x7ffffff0, 0x7ffffff0,
+       0xfffffff1, 0xfffffff1, 0xfffffff1, 0xfffffff1,
+     },
+   },
+ };
+ 
+ uint64_t TEST_BINARY_DATA(uint64_t, xor)[][3][N] =
+ {
+   {
+     { 0x1 },
+     {
+                         0x1,                   0x1,                   0x1,                   0x1,
+                         0x2,                   0x2,                   0x2,                   0x2,
+                         0x0,                   0x0,                   0x0,                   0x0,
+       0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull,
+     },
+     {
+                         0x0,                   0x0,                   0x0,                   0x0,
+                         0x3,                   0x3,                   0x3,                   0x3,
+                         0x1,                   0x1,                   0x1,                   0x1,
+       0xfffffffffffffffeull, 0xfffffffffffffffeull, 0xfffffffffffffffeull, 0xfffffffffffffffeull,
+     },
+   },
+   {
+     { 0x7fffffffffffffffull },
+     {
+       0x7fffffffffffffffull, 0x7fffffffffffffffull, 0x7fffffffffffffffull, 0x7fffffffffffffffull,
+       0x8000000000000000ull, 0x8000000000000000ull, 0x8000000000000000ull, 0x8000000000000000ull,
+                         0xf,                   0xf,                   0xf,                   0xf,
+       0x7000000000000000ull, 0x7000000000000000ull, 0x7000000000000000ull, 0x7000000000000000ull,
+     },
+     {
+                         0x0,                   0x0,                   0x0,                   0x0,
+       0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull,
+       0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull,
+        0xfffffffffffffffull,  0xfffffffffffffffull,  0xfffffffffffffffull,  0xfffffffffffffffull,
+     },
+   },
+   {
+     { 0xfffffffffffffff0ull },
+     {
+       0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull,
+                        0x1f,                  0x1f,                  0x1f,                  0x1f,
+       0x8000000000000000ull, 0x8000000000000000ull, 0x8000000000000000ull, 0x8000000000000000ull,
+                         0x1,                   0x1,                   0x1,                   0x1,
+     },
+     {
+                         0xf,                   0xf,                   0xf,                   0xf,
+       0xffffffffffffffefull, 0xffffffffffffffefull, 0xffffffffffffffefull, 0xffffffffffffffefull,
+       0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull,
+       0xfffffffffffffff1ull, 0xfffffffffffffff1ull, 0xfffffffffffffff1ull, 0xfffffffffffffff1ull,
+     },
+   },
+ };
+ 
+ int8_t TEST_BINARY_DATA(int8_t, mul)[][3][N] =
+ {
+   {
+     { 1 },
+     {
+        0,  0,  0,  0,
+        1,  1,  1,  1,
+       -1, -1, -1, -1,
+       -2, -2, -2, -2,
+     },
+     {
+        0,  0,  0,  0,
+        1,  1,  1,  1,
+       -1, -1, -1, -1,
+       -2, -2, -2, -2,
+     },
+   },
+   {
+     { 127 },
+     {
+          0,    0,    0,    0,
+         -1,   -1,   -1,   -1,
+       -128, -128, -128, -128,
+         -2,   -2,   -2,   -2,
+     },
+     {
+          0,    0,    0,    0,
+       -127, -127, -127, -127,
+       -128, -128, -128, -128,
+          2,    2,    2,    2,
+     },
+   },
+   {
+     { -128 },
+     {
+          0,    0,    0,    0,
+          1,    1,    1,    1,
+        127,  127,  127,  127,
+          2,    2,    2,    2,
+     },
+     {
+          0,    0,    0,    0,
+       -128, -128, -128, -128,
+       -128, -128, -128, -128,
+          0,    0,    0,    0,
+     },
+   },
+ };
+ 
+ int16_t TEST_BINARY_DATA(int16_t, mul)[][3][N] =
+ {
+   {
+     { 1 },
+     {
+        0,  0,  0,  0,
+        1,  1,  1,  1,
+       -1, -1, -1, -1,
+       -2, -2, -2, -2,
+     },
+     {
+        0,  0,  0,  0,
+        1,  1,  1,  1,
+       -1, -1, -1, -1,
+       -2, -2, -2, -2,
+     },
+   },
+   {
+     { 32767 },
+     {
+            0,      0,      0,      0,
+           -1,     -1,     -1,     -1,
+       -32768, -32768, -32768, -32768,
+           -2,     -2,     -2,     -2,
+     },
+     {
+            0,      0,      0,      0,
+       -32767, -32767, -32767, -32767,
+       -32768, -32768, -32768, -32768,
+            2,      2,      2,      2,
+     },
+   },
+   {
+     { -32768 },
+     {
+            0,      0,      0,      0,
+            1,      1,      1,      1,
+        32767,  32767,  32767,  32767,
+            2,      2,      2,      2,
+     },
+     {
+            0,      0,      0,      0,
+       -32768, -32768, -32768, -32768,
+       -32768, -32768, -32768, -32768,
+            0,      0,      0,      0,
+     },
+   },
+ };
+ 
+ int32_t TEST_BINARY_DATA(int32_t, mul)[][3][N] =
+ {
+   {
+     { 1 },
+     {
+        0,  0,  0,  0,
+        1,  1,  1,  1,
+       -1, -1, -1, -1,
+       -2, -2, -2, -2,
+     },
+     {
+        0,  0,  0,  0,
+        1,  1,  1,  1,
+       -1, -1, -1, -1,
+       -2, -2, -2, -2,
+     },
+   },
+   {
+     { 2147483647 },
+     {
+                 0,           0,           0,           0,
+                -1,          -1,          -1,          -1,
+       -2147483648, -2147483648, -2147483648, -2147483648,
+                -2,          -2,          -2,          -2,
+     },
+     {
+                 0,           0,           0,           0,
+       -2147483647, -2147483647, -2147483647, -2147483647,
+       -2147483648, -2147483648, -2147483648, -2147483648,
+                 2,           2,           2,           2,
+     },
+   },
+   {
+     { -2147483648 },
+     {
+                 0,           0,           0,           0,
+                 1,           1,           1,           1,
+        2147483647,  2147483647,  2147483647,  2147483647,
+                 2,           2,           2,           2,
+     },
+     {
+                 0,           0,           0,           0,
+       -2147483648, -2147483648, -2147483648, -2147483648,
+       -2147483648, -2147483648, -2147483648, -2147483648,
+                 0,           0,           0,           0,
+     },
+   },
+ };
+ 
+ int64_t TEST_BINARY_DATA(int64_t, mul)[][3][N] =
+ {
+   {
+     { 1 },
+     {
+        0,  0,  0,  0,
+        1,  1,  1,  1,
+       -1, -1, -1, -1,
+       -2, -2, -2, -2,
+     },
+     {
+        0,  0,  0,  0,
+        1,  1,  1,  1,
+       -1, -1, -1, -1,
+       -2, -2, -2, -2,
+     },
+   },
+   {
+     { 9223372036854775807ll },
+     {
+                             0,                       0,                       0,                       0,
+                            -1,                      -1,                      -1,                      -1,
+       -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull,
+                            -2,                      -2,                      -2,                      -2,
+     },
+     {
+                             0,                       0,                       0,                       0,
+        -9223372036854775807ll,  -9223372036854775807ll,  -9223372036854775807ll,  -9223372036854775807ll,
+       -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull,
+                             2,                       2,                       2,                       2,
+     },
+   },
+   {
+     { -9223372036854775808ull },
+     {
+                            0,                      0,                      0,                      0,
+                            1,                      1,                      1,                      1,
+        9223372036854775807ll,  9223372036854775807ll,  9223372036854775807ll,  9223372036854775807ll,
+                            2,                      2,                      2,                      2,
+     },
+     {
+                             0,                       0,                       0,                       0,
+       -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull,
+       -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull,
+                             0,                       0,                       0,                       0,
+     },
+   },
+ };
+ 
  #endif
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i16.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i16.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */
+ 
+ #include "vx_binary.h"
+ #include "vx_binary_data.h"
+ 
+ #define T    int16_t
+ #define NAME mul
+ 
+ DEF_VX_BINARY_CASE_0_WRAP(T, *, NAME)
+ 
+ #define TEST_DATA                        TEST_BINARY_DATA_WRAP(T, NAME)
+ #define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n)
+ 
+ #include "vx_binary_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i32.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */
+ 
+ #include "vx_binary.h"
+ #include "vx_binary_data.h"
+ 
+ #define T    int32_t
+ #define NAME mul
+ 
+ DEF_VX_BINARY_CASE_0_WRAP(T, *, NAME)
+ 
+ #define TEST_DATA                        TEST_BINARY_DATA_WRAP(T, NAME)
+ #define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n)
+ 
+ #include "vx_binary_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i64.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */
+ 
+ #include "vx_binary.h"
+ #include "vx_binary_data.h"
+ 
+ #define T    int64_t
+ #define NAME mul
+ 
+ DEF_VX_BINARY_CASE_0_WRAP(T, *, NAME)
+ 
+ #define TEST_DATA                        TEST_BINARY_DATA_WRAP(T, NAME)
+ #define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n)
+ 
+ #include "vx_binary_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i8.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i8.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */
+ 
+ #include "vx_binary.h"
+ #include "vx_binary_data.h"
+ 
+ #define T    int8_t
+ #define NAME mul
+ 
+ DEF_VX_BINARY_CASE_0_WRAP(T, *, NAME)
+ 
+ #define TEST_DATA                        TEST_BINARY_DATA_WRAP(T, NAME)
+ #define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n)
+ 
+ #include "vx_binary_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i16.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i16.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */
+ 
+ #include "vx_binary.h"
+ #include "vx_binary_data.h"
+ 
+ #define T    int16_t
+ #define NAME xor
+ 
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, NAME)
+ 
+ #define TEST_DATA                        TEST_BINARY_DATA_WRAP(T, NAME)
+ #define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n)
+ 
+ #include "vx_binary_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i32.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */
+ 
+ #include "vx_binary.h"
+ #include "vx_binary_data.h"
+ 
+ #define T    int32_t
+ #define NAME xor
+ 
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, NAME)
+ 
+ #define TEST_DATA                        TEST_BINARY_DATA_WRAP(T, NAME)
+ #define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n)
+ 
+ #include "vx_binary_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i64.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */
+ 
+ #include "vx_binary.h"
+ #include "vx_binary_data.h"
+ 
+ #define T    int64_t
+ #define NAME xor
+ 
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, NAME)
+ 
+ #define TEST_DATA                        TEST_BINARY_DATA_WRAP(T, NAME)
+ #define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n)
+ 
+ #include "vx_binary_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i8.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i8.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */
+ 
+ #include "vx_binary.h"
+ #include "vx_binary_data.h"
+ 
+ #define T    int8_t
+ #define NAME xor
+ 
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, NAME)
+ 
+ #define TEST_DATA                        TEST_BINARY_DATA_WRAP(T, NAME)
+ #define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n)
+ 
+ #include "vx_binary_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u16.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u16.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */
+ 
+ #include "vx_binary.h"
+ #include "vx_binary_data.h"
+ 
+ #define T    uint16_t
+ #define NAME xor
+ 
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, NAME)
+ 
+ #define TEST_DATA                        TEST_BINARY_DATA_WRAP(T, NAME)
+ #define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n)
+ 
+ #include "vx_binary_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u32.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */
+ 
+ #include "vx_binary.h"
+ #include "vx_binary_data.h"
+ 
+ #define T    int32_t
+ #define NAME xor
+ 
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, NAME)
+ 
+ #define TEST_DATA                        TEST_BINARY_DATA_WRAP(T, NAME)
+ #define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n)
+ 
+ #include "vx_binary_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u64.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */
+ 
+ #include "vx_binary.h"
+ #include "vx_binary_data.h"
+ 
+ #define T    uint64_t
+ #define NAME xor
+ 
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, NAME)
+ 
+ #define TEST_DATA                        TEST_BINARY_DATA_WRAP(T, NAME)
+ #define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n)
+ 
+ #include "vx_binary_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u8.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u8.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */
+ 
+ #include "vx_binary.h"
+ #include "vx_binary_data.h"
+ 
+ #define T    uint8_t
+ #define NAME xor
+ 
+ DEF_VX_BINARY_CASE_0_WRAP(T, ^, NAME)
+ 
+ #define TEST_DATA                        TEST_BINARY_DATA_WRAP(T, NAME)
+ #define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n)
+ 
+ #include "vx_binary_run.h"
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv32gcv.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv32gcv.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv32gcv.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv32gcv.c	Sun Jun  1 22:32:29 2025
***************
*** 3,11 ****
  
  #include "vec-avg-template.h"
  
! /* { dg-final { scan-assembler-times {\tvwadd\.vv} 6 } } */
! /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*0} 3 } } */
! /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 3 } } */
! /* { dg-final { scan-assembler-times {\tvadd\.vi} 3 } } */
! /* { dg-final { scan-assembler-times {\tvnsra.wi} 6 } } */
  /* { dg-final { scan-assembler-times {vaaddu\.vv} 6 } } */
--- 3,8 ----
  
  #include "vec-avg-template.h"
  
! /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 6 } } */
  /* { dg-final { scan-assembler-times {vaaddu\.vv} 6 } } */
+ /* { dg-final { scan-assembler-times {vaadd\.vv} 6 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv64gcv.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv64gcv.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv64gcv.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv64gcv.c	Sun Jun  1 22:32:29 2025
***************
*** 3,11 ****
  
  #include "vec-avg-template.h"
  
! /* { dg-final { scan-assembler-times {\tvwadd\.vv} 6 } } */
! /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*0} 3 } } */
! /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 3 } } */
! /* { dg-final { scan-assembler-times {\tvadd\.vi} 3 } } */
! /* { dg-final { scan-assembler-times {\tvnsra\.wi} 6 } } */
  /* { dg-final { scan-assembler-times {vaaddu\.vv} 6 } } */
--- 3,8 ----
  
  #include "vec-avg-template.h"
  
! /* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 6 } } */
  /* { dg-final { scan-assembler-times {vaaddu\.vv} 6 } } */
+ /* { dg-final { scan-assembler-times {vaadd\.vv} 6 } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/base/pr120436.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/base/pr120436.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/rvv/base/pr120436.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/rvv/base/pr120436.c	Sun Jun  1 22:32:29 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d -O0" } */
+ 
+ /* Use -O0 as otherwise the unused intrinsics get
+    optimized away.  We used to ICE here instead of
+    emitting an error.  */
+ 
+ #include "riscv_vector.h"
+ 
+ void
+ clean_subreg (int32_t *in, int32_t *out, size_t m) /* { dg-error {this operation requires the RVV ISA extension} } */
+ {
+   vint16m8_t v24, v8, v16;
+   vint32m8_t result = __riscv_vle32_v_i32m8 (in, 32); /* { dg-error {built-in function '__riscv_vle32_v_i32m8\(in, 32\)' requires the 'v' ISA extension} } */
+   vint32m1_t v0 = __riscv_vget_v_i32m8_i32m1 (result, 0);
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-1.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-1.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-1.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-1.c	Thu Jan  1 00:00:00 1970
***************
*** 1,9 ****
- /* { dg-do compile } */
- /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized" } */
- 
- #include "sat_arith.h"
- 
- DEF_SAT_S_ADD_IMM_FMT_1(0, int8_t, uint8_t, -129, INT8_MIN, INT8_MAX)
- DEF_SAT_S_ADD_IMM_FMT_1(1, int8_t, uint8_t, 128, INT8_MIN, INT8_MAX)
- 
- /* { dg-final { scan-tree-dump-not ".SAT_ADD " "optimized" } } */
--- 0 ----
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i16.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i16.c	Sun Jun  1 22:32:30 2025
***************
*** 0 ****
--- 1,57 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized -fno-schedule-insns -fno-schedule-insns2" } */
+ /* { dg-final { check-function-bodies "**" "" } } */
+ 
+ #include "sat_arith.h"
+ 
+ /*
+ ** sat_s_add_imm_int16_t_fmt_1_0:
+ **	addi\s+[atx][0-9]+,\s*a0,\s*-7
+ **	xori\s+[atx][0-9]+,\s*a0,\s*-7
+ **	xor\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+
+ **	srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*15
+ **	srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*15
+ **	xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
+ **	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
+ **	andi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
+ **	srai\s+a0,\s*a0,\s*63
+ **	li\s+[atx][0-9]+,\s*32768
+ **	addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
+ **	xor\s+[atx][0-9]+,\s*[atx][0-9]+,\s*a0
+ **	neg\s+a0,\s*[atx][0-9]+
+ **	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*a0
+ **	addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
+ **	and\s+a0,\s*[atx][0-9]+,\s*[atx][0-9]+
+ **	or\s+a0,\s*a0,\s*[atx][0-9]+
+ **	slliw\s+a0,\s*a0,\s*16
+ **	sraiw\s+a0,\s*a0,\s*16
+ **	ret
+ */
+ DEF_SAT_S_ADD_IMM_FMT_1(0, int16_t, uint16_t, -7, INT16_MIN, INT16_MAX)
+ 
+ /*
+ ** sat_s_add_imm_int16_t_fmt_1_1:
+ ** 	addi\s+[atx][0-9]+,\s*a0,\s*-1
+ ** 	not\s+[atx][0-9]+,\s*a0
+ ** 	xor\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+
+ ** 	srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*15
+ ** 	srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*15
+ ** 	xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
+ ** 	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
+ ** 	andi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
+ ** 	srai\s+a0,\s*a0,\s*63
+ ** 	li\s+[atx][0-9]+,\s*32768
+ ** 	addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
+ ** 	xor\s+[atx][0-9]+,\s*[atx][0-9]+,\s*a0
+ ** 	neg\s+a0,\s*[atx][0-9]+
+ ** 	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*a0
+ ** 	addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
+ ** 	and\s+a0,\s*[atx][0-9]+,\s*[atx][0-9]+
+ ** 	or\s+a0,\s*a0,\s*[atx][0-9]+
+ ** 	slliw\s+a0,\s*a0,\s*16
+ ** 	sraiw\s+a0,\s*a0,\s*16
+ ** 	ret
+ */
+ DEF_SAT_S_ADD_IMM_FMT_1(1, int16_t, uint16_t, -1, INT16_MIN, INT16_MAX)
+ 
+ /* { dg-final { scan-tree-dump-times ".SAT_ADD " 2 "optimized" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i32.c	Sun Jun  1 22:32:30 2025
***************
*** 0 ****
--- 1,54 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized -fno-schedule-insns -fno-schedule-insns2" } */
+ /* { dg-final { check-function-bodies "**" "" } } */
+ 
+ #include "sat_arith.h"
+ 
+ /*
+ ** sat_s_add_imm_int32_t_fmt_1_0:
+ **	addi\s+[atx][0-9]+,\s*a0,\s*10
+ **	xor\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+
+ **	srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*31
+ **	srli\s+[atx][0-9]+,\s*a0,\s*31
+ **	xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
+ **	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
+ **	andi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
+ **	srai\s+a0,\s*a0,\s*63
+ **	li\s+[atx][0-9]+,\s*-2147483648
+ **	xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
+ **	xor\s+[atx][0-9]+,\s*[atx][0-9]+,\s*a0
+ **	neg\s+a0,\s*[atx][0-9]+
+ **	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*a0
+ **	addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
+ **	and\s+a0,\s*[atx][0-9]+,\s*[atx][0-9]+
+ **	or\s+a0,a0,\s*[atx][0-9]+
+ **	sext.w\s+a0,\s*a0
+ **	ret
+ */
+ DEF_SAT_S_ADD_IMM_FMT_1(0, int32_t, uint32_t, 10, INT32_MIN, INT32_MAX)
+ 
+ /*
+ ** sat_s_add_imm_int32_t_fmt_1_1:
+ **	addi\s+[atx][0-9]+,\s*a0,\s*-1
+ **	not\s+[atx][0-9]+,\s*a0
+ **	xor\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+
+ **	srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*31
+ **	srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*31
+ **	xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
+ **	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
+ **	andi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
+ **	srai\s+a0,\s*a0,\s*63
+ **	li\s+[atx][0-9]+,\s*-2147483648
+ **	xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
+ **	xor\s+[atx][0-9]+,\s*[atx][0-9]+,\s*a0
+ **	neg\s+a0,\s*[atx][0-9]+
+ **	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*a0
+ **	addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
+ **	and\s+a0,\s*[atx][0-9]+,\s*[atx][0-9]+
+ **	or\s+a0,\s*a0,\s*[atx][0-9]+
+ **	sext.w\s+a0,\s*a0
+ **	ret
+ */
+ DEF_SAT_S_ADD_IMM_FMT_1(1, int32_t, uint32_t, -1, INT32_MIN, INT32_MAX)
+ 
+ /* { dg-final { scan-tree-dump-times ".SAT_ADD " 2 "optimized" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i64.c	Sun Jun  1 22:32:30 2025
***************
*** 0 ****
--- 1,48 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized -fno-schedule-insns -fno-schedule-insns2" } */
+ /* { dg-final { check-function-bodies "**" "" } } */
+ 
+ #include "sat_arith.h"
+ 
+ /*
+ ** sat_s_add_imm_int64_t_fmt_1_0:
+ **	addi\s+[atx][0-9]+,\s*a0,\s*10
+ **	xor\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+
+ **	srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*63
+ **	srli\s+[atx][0-9]+,\s*a0,\s*63
+ **	xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
+ **	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
+ **	srai\s+[atx][0-9]+,\s*a0,\s*63
+ **	li\s+[atx][0-9]+,\s*-1
+ **	srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
+ **	xor\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
+ **	neg\s+[atx][0-9]+,\s*[atx][0-9]+
+ **	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
+ **	addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
+ **	and\s+a0,\s*[atx][0-9]+,\s*[atx][0-9]+
+ **	or\s+a0,\s*a0,\s*[atx][0-9]+
+ **	ret
+ */
+ DEF_SAT_S_ADD_IMM_FMT_1(0, int64_t, uint64_t, 10, INT64_MIN, INT64_MAX)
+ 
+ /*
+ ** sat_s_add_imm_int64_t_fmt_1_1:
+ **	addi\s+[atx][0-9]+,\s*a0,\s*-1
+ **	xor\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+
+ **	srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*63
+ **	slti\s+[atx][0-9]+,\s*a0,\s*0
+ **	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
+ **	srai\s+[atx][0-9]+,\s*a0,\s*63
+ **	li\s+[atx][0-9]+,\s*-1
+ **	srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
+ **	xor\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
+ **	neg\s+[atx][0-9]+,\s*[atx][0-9]+
+ **	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
+ **	addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
+ **	and\s+a0,\s*[atx][0-9]+,\s*[atx][0-9]+
+ **	or\s+a0,\s*a0,\s*[atx][0-9]+
+ **	ret
+ */
+ DEF_SAT_S_ADD_IMM_FMT_1(1, int64_t, uint64_t, -1, INT64_MIN, INT64_MAX)
+ 
+ /* { dg-final { scan-tree-dump-times ".SAT_ADD " 2 "optimized" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i8.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i8.c	Sun Jun  1 22:32:30 2025
***************
*** 0 ****
--- 1,49 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized -fno-schedule-insns -fno-schedule-insns2" } */
+ /* { dg-final { check-function-bodies "**" "" } } */
+ 
+ #include "sat_arith.h"
+ 
+ /*
+ ** sat_s_add_imm_int8_t_fmt_1_0:
+ **	addi\s+[atx][0-9]+,\s*a0,\s*9
+ **	xor\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+
+ **	srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*7
+ **	srli\s+[atx][0-9]+,\s*a0,\s*7
+ **	xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
+ **	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
+ **	andi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
+ **	srai\s+a0,\s*a0,\s*63
+ **	xori\s+[atx][0-9]+,\s*a0,\s*127
+ **	neg\s+a0,\s*[atx][0-9]+
+ **	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*a0
+ **	addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
+ **	and\s+a0,\s*[atx][0-9]+,\s*[atx][0-9]+
+ **	or\s+a0,\s*a0,\s*[atx][0-9]+
+ **	slliw\s+a0,\s*a0,\s*24
+ **	sraiw\s+a0,\s*a0,\s*24
+ **	ret
+ */
+ DEF_SAT_S_ADD_IMM_FMT_1(0, int8_t, uint8_t, 9, INT8_MIN, INT8_MAX)
+ 
+ /*
+ ** sat_s_add_imm_int8_t_fmt_1_1:
+ ** 	addi\s+[atx][0-9]+,\s*a0,\s*-1
+ ** 	xor\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+
+ ** 	and\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+
+ ** 	slli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*56
+ ** 	srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*63
+ ** 	srai\s+a0,\s*a0,\s*63
+ ** 	xori\s+[atx][0-9]+,\s*a0,\s*127
+ ** 	neg\s+a0,\s*a5
+ ** 	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*a0
+ ** 	addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
+ ** 	and\s+a0,\s*[atx][0-9]+,\s*[atx][0-9]+
+ ** 	or\s+a0,\s*a0,\s*[atx][0-9]+
+ ** 	slliw\s+a0,\s*a0,\s*24
+ ** 	sraiw\s+a0,\s*a0,\s*24
+ ** 	ret
+ */
+ DEF_SAT_S_ADD_IMM_FMT_1(1, int8_t, uint8_t, -1, INT8_MIN, INT8_MAX)
+ 
+ /* { dg-final { scan-tree-dump-times ".SAT_ADD " 2 "optimized" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1.c	Thu Jan  1 00:00:00 1970
***************
*** 1,29 ****
- /* { dg-do compile } */
- /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized -fno-schedule-insns -fno-schedule-insns2" } */
- /* { dg-final { check-function-bodies "**" "" } } */
- 
- #include "sat_arith.h"
- 
- /*
- ** sat_s_add_imm_int8_t_fmt_1_0:
- **	addi\s+[atx][0-9]+,\s*a0,\s*9
- **	xor\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+
- **	srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*7
- **	srli\s+[atx][0-9]+,\s*a0,\s*7
- **	xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
- **	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
- **	andi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
- **	srai\s+a0,\s*a0,\s*63
- **	xori\s+[atx][0-9]+,\s*a0,\s*127
- **	neg\s+a0,\s*[atx][0-9]+
- **	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*a0
- **	addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
- **	and\s+a0,\s*[atx][0-9]+,\s*[atx][0-9]+
- **	or\s+a0,\s*a0,\s*[atx][0-9]+
- **	slliw\s+a0,\s*a0,\s*24
- **	sraiw\s+a0,\s*a0,\s*24
- **	ret
- */
- DEF_SAT_S_ADD_IMM_FMT_1(0, int8_t, uint8_t, 9, INT8_MIN, INT8_MAX)
- 
- /* { dg-final { scan-tree-dump-times ".SAT_ADD " 1 "optimized" } } */
--- 0 ----
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-2-1.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-2-1.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-2-1.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-2-1.c	Thu Jan  1 00:00:00 1970
***************
*** 1,9 ****
- /* { dg-do compile } */
- /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized" } */
- 
- #include "sat_arith.h"
- 
- DEF_SAT_S_ADD_IMM_FMT_1(0, int16_t, uint16_t, -32769, INT16_MIN, INT16_MAX)
- DEF_SAT_S_ADD_IMM_FMT_1(1, int16_t, uint16_t, 32768, INT16_MIN, INT16_MAX)
- 
- /* { dg-final { scan-tree-dump-not ".SAT_ADD " "optimized" } } */
--- 0 ----
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-2.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-2.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-2.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-2.c	Thu Jan  1 00:00:00 1970
***************
*** 1,32 ****
- /* { dg-do compile } */
- /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized -fno-schedule-insns -fno-schedule-insns2" } */
- /* { dg-final { check-function-bodies "**" "" } } */
- 
- #include "sat_arith.h"
- 
- /*
- ** sat_s_add_imm_int16_t_fmt_1_0:
- **	addi\s+[atx][0-9]+,\s*a0,\s*-7
- **	xori\s+[atx][0-9]+,\s*a0,\s*-7
- **	xor\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+
- **	srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*15
- **	srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*15
- **	xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
- **	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
- **	andi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
- **	srai\s+a0,\s*a0,\s*63
- **	li\s+[atx][0-9]+,\s*32768
- **	addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
- **	xor\s+[atx][0-9]+,\s*[atx][0-9]+,\s*a0
- **	neg\s+a0,\s*[atx][0-9]+
- **	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*a0
- **	addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
- **	and\s+a0,\s*[atx][0-9]+,\s*[atx][0-9]+
- **	or\s+a0,\s*a0,\s*[atx][0-9]+
- **	slliw\s+a0,\s*a0,\s*16
- **	sraiw\s+a0,\s*a0,\s*16
- **	ret
- */
- DEF_SAT_S_ADD_IMM_FMT_1(0, int16_t, uint16_t, -7, INT16_MIN, INT16_MAX)
- 
- /* { dg-final { scan-tree-dump-times ".SAT_ADD " 1 "optimized" } } */
--- 0 ----
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-3-1.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-3-1.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-3-1.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-3-1.c	Thu Jan  1 00:00:00 1970
***************
*** 1,9 ****
- /* { dg-do compile } */
- /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized" } */
- 
- #include "sat_arith.h"
- 
- DEF_SAT_S_ADD_IMM_FMT_1(0, int32_t, uint32_t, -2147483649, INT32_MIN, INT32_MAX)
- DEF_SAT_S_ADD_IMM_FMT_1(1, int32_t, uint32_t, 2147483648, INT32_MIN, INT32_MAX)
- 
- /* { dg-final { scan-tree-dump-not ".SAT_ADD " "optimized" } } */
--- 0 ----
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-3.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-3.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-3.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-3.c	Thu Jan  1 00:00:00 1970
***************
*** 1,30 ****
- /* { dg-do compile } */
- /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized -fno-schedule-insns -fno-schedule-insns2" } */
- /* { dg-final { check-function-bodies "**" "" } } */
- 
- #include "sat_arith.h"
- 
- /*
- ** sat_s_add_imm_int32_t_fmt_1_0:
- **	addi\s+[atx][0-9]+,\s*a0,\s*10
- **	xor\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+
- **	srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*31
- **	srli\s+[atx][0-9]+,\s*a0,\s*31
- **	xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
- **	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
- **	andi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
- **	srai\s+a0,\s*a0,\s*63
- **	li\s+[atx][0-9]+,\s*-2147483648
- **	xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
- **	xor\s+[atx][0-9]+,\s*[atx][0-9]+,\s*a0
- **	neg\s+a0,\s*[atx][0-9]+
- **	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*a0
- **	addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
- **	and\s+a0,\s*[atx][0-9]+,\s*[atx][0-9]+
- **	or\s+a0,a0,\s*[atx][0-9]+
- **	sext.w\s+a0,\s*a0
- **	ret
- */
- DEF_SAT_S_ADD_IMM_FMT_1(0, int32_t, uint32_t, 10, INT32_MIN, INT32_MAX)
- 
- /* { dg-final { scan-tree-dump-times ".SAT_ADD " 1 "optimized" } } */
--- 0 ----
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-4.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-4.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-4.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-4.c	Thu Jan  1 00:00:00 1970
***************
*** 1,28 ****
- /* { dg-do compile } */
- /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized -fno-schedule-insns -fno-schedule-insns2" } */
- /* { dg-final { check-function-bodies "**" "" } } */
- 
- #include "sat_arith.h"
- 
- /*
- ** sat_s_add_imm_int64_t_fmt_1_0:
- **	addi\s+[atx][0-9]+,\s*a0,\s*10
- **	xor\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+
- **	srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*63
- **	srli\s+[atx][0-9]+,\s*a0,\s*63
- **	xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
- **	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
- **	srai\s+[atx][0-9]+,\s*a0,\s*63
- **	li\s+[atx][0-9]+,\s*-1
- **	srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
- **	xor\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
- **	neg\s+[atx][0-9]+,\s*[atx][0-9]+
- **	and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
- **	addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
- **	and\s+a0,\s*[atx][0-9]+,\s*[atx][0-9]+
- **	or\s+a0,\s*a0,\s*[atx][0-9]+
- **	ret
- */
- DEF_SAT_S_ADD_IMM_FMT_1(0, int64_t, uint64_t, 10, INT64_MIN, INT64_MAX)
- 
- /* { dg-final { scan-tree-dump-times ".SAT_ADD " 1 "optimized" } } */
--- 0 ----
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i16.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i16.c	Sun Jun  1 22:32:30 2025
***************
*** 0 ****
--- 1,48 ----
+ /* { dg-do run } */
+ /* { dg-additional-options "-std=c99" } */
+ 
+ #include "sat_arith.h"
+ 
+ DEF_SAT_S_ADD_IMM_FMT_1(0, int16_t, uint16_t, -32768, INT16_MIN, INT16_MAX)
+ DEF_SAT_S_ADD_IMM_FMT_1(1, int16_t, uint16_t, 32767, INT16_MIN, INT16_MAX)
+ DEF_SAT_S_ADD_IMM_FMT_1(2, int16_t, uint16_t, 100, INT16_MIN, INT16_MAX)
+ DEF_SAT_S_ADD_IMM_FMT_1(3, int16_t, uint16_t, -100, INT16_MIN, INT16_MAX)
+ DEF_SAT_S_ADD_IMM_FMT_1(4, int16_t, uint16_t, -1, INT16_MIN, INT16_MAX)
+ 
+ #define T                       int16_t
+ #define RUN(INDEX,T, x, expect) RUN_SAT_S_ADD_IMM_FMT_1(INDEX, T, x, expect)
+ 
+ T d[][2] = {
+   /* arg_0,   expect */
+   {     -1,     -32768, },
+   {      2,     -32766, },
+   {      1,      32767, },
+   {    -10,      32757, },
+   {  32669,      32767, },
+   { -32768,     -32668, },
+   { -32768,     -32768, },
+   {      0,       -100, },
+   { -32768,     -32768, },
+   {      0,         -1, },
+ };
+ 
+ int
+ main ()
+ {
+   RUN (0, T, d[0][0], d[0][1]);
+   RUN (0, T, d[1][0], d[1][1]);
+ 
+   RUN (1, T, d[2][0], d[2][1]);
+   RUN (1, T, d[3][0], d[3][1]);
+ 
+   RUN (2, T, d[4][0], d[4][1]);
+   RUN (2, T, d[5][0], d[5][1]);
+ 
+   RUN (3, T, d[6][0], d[6][1]);
+   RUN (3, T, d[7][0], d[7][1]);
+ 
+   RUN (4, T, d[8][0], d[8][1]);
+   RUN (4, T, d[9][0], d[9][1]);
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i32.c	Sun Jun  1 22:32:30 2025
***************
*** 0 ****
--- 1,48 ----
+ /* { dg-do run } */
+ /* { dg-additional-options "-std=c99" } */
+ 
+ #include "sat_arith.h"
+ 
+ DEF_SAT_S_ADD_IMM_FMT_1(0, int32_t, uint32_t, -2147483648, INT32_MIN, INT32_MAX)
+ DEF_SAT_S_ADD_IMM_FMT_1(1, int32_t, uint32_t, 2147483647, INT32_MIN, INT32_MAX)
+ DEF_SAT_S_ADD_IMM_FMT_1(2, int32_t, uint32_t, 100, INT32_MIN, INT32_MAX)
+ DEF_SAT_S_ADD_IMM_FMT_1(3, int32_t, uint32_t, -100, INT32_MIN, INT32_MAX)
+ DEF_SAT_S_ADD_IMM_FMT_1(4, int32_t, uint32_t, -1, INT32_MIN, INT32_MAX)
+ 
+ #define T                       int32_t
+ #define RUN(INDEX,T, x, expect) RUN_SAT_S_ADD_IMM_FMT_1(INDEX, T, x, expect)
+ 
+ T d[][2] = {
+   /* arg_0,   expect */
+   {     -1,     -2147483648, },
+   {      2,     -2147483646, },
+   {      1,      2147483647, },
+   {    -10,      2147483637, },
+   {    300,             400, },
+   {   -300,            -200, },
+   {    100,               0, },
+   {      0,            -100, },
+   {    100,              99, },
+   {      0,              -1, },
+ };
+ 
+ int
+ main ()
+ {
+   RUN (0, T, d[0][0], d[0][1]);
+   RUN (0, T, d[1][0], d[1][1]);
+ 
+   RUN (1, T, d[2][0], d[2][1]);
+   RUN (1, T, d[3][0], d[3][1]);
+ 
+   RUN (2, T, d[4][0], d[4][1]);
+   RUN (2, T, d[5][0], d[5][1]);
+ 
+   RUN (3, T, d[6][0], d[6][1]);
+   RUN (3, T, d[7][0], d[7][1]);
+ 
+   RUN (4, T, d[8][0], d[8][1]);
+   RUN (4, T, d[9][0], d[9][1]);
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i64.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i64.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i64.c	Sun Jun  1 22:32:30 2025
***************
*** 0 ****
--- 1,48 ----
+ /* { dg-do run } */
+ /* { dg-additional-options "-std=c99" } */
+ 
+ #include "sat_arith.h"
+ 
+ DEF_SAT_S_ADD_IMM_FMT_1(0, int64_t, uint64_t, (-9223372036854775807ll - 1), INT64_MIN, INT64_MAX)
+ DEF_SAT_S_ADD_IMM_FMT_1(1, int64_t, uint64_t, 9223372036854775807ll, INT64_MIN, INT64_MAX)
+ DEF_SAT_S_ADD_IMM_FMT_1(2, int64_t, uint64_t, 100, INT64_MIN, INT64_MAX)
+ DEF_SAT_S_ADD_IMM_FMT_1(3, int64_t, uint64_t, -100, INT64_MIN, INT64_MAX)
+ DEF_SAT_S_ADD_IMM_FMT_1(4, int64_t, uint64_t, -1, INT64_MIN, INT64_MAX)
+ 
+ #define T                       int64_t
+ #define RUN(INDEX,T, x, expect) RUN_SAT_S_ADD_IMM_FMT_1(INDEX, T, x, expect)
+ 
+ T d[][2] = {
+   /* arg_0,   expect */
+   {     -1,     (-9223372036854775807ll - 1), },
+   {      2,           -9223372036854775806ll, },
+   {      1,            9223372036854775807ll, },
+   {     -7,            9223372036854775800ll, },
+   {      0,                              100, },
+   {     -1,                               99, },
+   {      0,                             -100, },
+   {    100,                                0, },
+   {      0,                               -1, },
+   {    100,                               99, },
+ };
+ 
+ int
+ main ()
+ {
+   RUN (0, T, d[0][0], d[0][1]);
+   RUN (0, T, d[1][0], d[1][1]);
+ 
+   RUN (1, T, d[2][0], d[2][1]);
+   RUN (1, T, d[3][0], d[3][1]);
+ 
+   RUN (2, T, d[4][0], d[4][1]);
+   RUN (2, T, d[5][0], d[5][1]);
+ 
+   RUN (3, T, d[6][0], d[6][1]);
+   RUN (3, T, d[7][0], d[7][1]);
+ 
+   RUN (4, T, d[8][0], d[8][1]);
+   RUN (4, T, d[9][0], d[9][1]);
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i8.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i8.c	Sun Jun  1 22:32:30 2025
***************
*** 0 ****
--- 1,48 ----
+ /* { dg-do run } */
+ /* { dg-additional-options "-std=c99" } */
+ 
+ #include "sat_arith.h"
+ 
+ DEF_SAT_S_ADD_IMM_FMT_1(0, int8_t, uint8_t, -128, INT8_MIN, INT8_MAX)
+ DEF_SAT_S_ADD_IMM_FMT_1(1, int8_t, uint8_t, 127, INT8_MIN, INT8_MAX)
+ DEF_SAT_S_ADD_IMM_FMT_1(2, int8_t, uint8_t, 6, INT8_MIN, INT8_MAX)
+ DEF_SAT_S_ADD_IMM_FMT_1(3, int8_t, uint8_t, -6, INT8_MIN, INT8_MAX)
+ DEF_SAT_S_ADD_IMM_FMT_1(4, int8_t, uint8_t, -1, INT8_MIN, INT8_MAX)
+ 
+ #define T                       int8_t
+ #define RUN(INDEX,T, x, expect) RUN_SAT_S_ADD_IMM_FMT_1(INDEX, T, x, expect)
+ 
+ T d[][2] = {
+   /* arg_0,   expect */
+   {     -1,     -128, },
+   {      2,     -126, },
+   {      1,      127, },
+   {    -10,      117, },
+   {    122,      127, },
+   {    -10,       -4, },
+   {   -128,     -128, },
+   {    127,      121, },
+   {   -128,     -128, },
+   {    1,          0, },
+ };
+ 
+ int
+ main ()
+ {
+   RUN (0, T, d[0][0], d[0][1]);
+   RUN (0, T, d[1][0], d[1][1]);
+ 
+   RUN (1, T, d[2][0], d[2][1]);
+   RUN (1, T, d[3][0], d[3][1]);
+ 
+   RUN (2, T, d[4][0], d[4][1]);
+   RUN (2, T, d[5][0], d[5][1]);
+ 
+   RUN (3, T, d[6][0], d[6][1]);
+   RUN (3, T, d[7][0], d[7][1]);
+ 
+   RUN (4, T, d[8][0], d[8][1]);
+   RUN (4, T, d[9][0], d[9][1]);
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1.c	Thu Jan  1 00:00:00 1970
***************
*** 1,42 ****
- /* { dg-do run } */
- /* { dg-additional-options "-std=c99" } */
- 
- #include "sat_arith.h"
- 
- DEF_SAT_S_ADD_IMM_FMT_1(0, int8_t, uint8_t, -128, INT8_MIN, INT8_MAX)
- DEF_SAT_S_ADD_IMM_FMT_1(1, int8_t, uint8_t, 127, INT8_MIN, INT8_MAX)
- DEF_SAT_S_ADD_IMM_FMT_1(2, int8_t, uint8_t, 6, INT8_MIN, INT8_MAX)
- DEF_SAT_S_ADD_IMM_FMT_1(3, int8_t, uint8_t, -6, INT8_MIN, INT8_MAX)
- 
- #define T                       int8_t
- #define RUN(INDEX,T, x, expect) RUN_SAT_S_ADD_IMM_FMT_1(INDEX, T, x, expect)
- 
- T d[][2] = {
-   /* arg_0,   expect */
-   {     -1,     -128, },
-   {      2,     -126, },
-   {      1,      127, },
-   {    -10,      117, },
-   {    122,      127, },
-   {    -10,       -4, },
-   {   -128,     -128, },
-   {    127,      121, },
- };
- 
- int
- main ()
- {
-   RUN (0, T, d[0][0], d[0][1]);
-   RUN (0, T, d[1][0], d[1][1]);
- 
-   RUN (1, T, d[2][0], d[2][1]);
-   RUN (1, T, d[3][0], d[3][1]);
- 
-   RUN (2, T, d[4][0], d[4][1]);
-   RUN (2, T, d[5][0], d[5][1]);
- 
-   RUN (3, T, d[6][0], d[6][1]);
-   RUN (3, T, d[7][0], d[7][1]);
- 
-   return 0;
- }
--- 0 ----
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-2.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-2.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-2.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-2.c	Thu Jan  1 00:00:00 1970
***************
*** 1,42 ****
- /* { dg-do run } */
- /* { dg-additional-options "-std=c99" } */
- 
- #include "sat_arith.h"
- 
- DEF_SAT_S_ADD_IMM_FMT_1(0, int16_t, uint16_t, -32768, INT16_MIN, INT16_MAX)
- DEF_SAT_S_ADD_IMM_FMT_1(1, int16_t, uint16_t, 32767, INT16_MIN, INT16_MAX)
- DEF_SAT_S_ADD_IMM_FMT_1(2, int16_t, uint16_t, 100, INT16_MIN, INT16_MAX)
- DEF_SAT_S_ADD_IMM_FMT_1(3, int16_t, uint16_t, -100, INT16_MIN, INT16_MAX)
- 
- #define T                       int16_t
- #define RUN(INDEX,T, x, expect) RUN_SAT_S_ADD_IMM_FMT_1(INDEX, T, x, expect)
- 
- T d[][2] = {
-   /* arg_0,   expect */
-   {     -1,     -32768, },
-   {      2,     -32766, },
-   {      1,      32767, },
-   {    -10,      32757, },
-   {  32669,      32767, },
-   { -32768,     -32668, },
-   { -32768,     -32768, },
-   {      0,       -100, },
- };
- 
- int
- main ()
- {
-   RUN (0, T, d[0][0], d[0][1]);
-   RUN (0, T, d[1][0], d[1][1]);
- 
-   RUN (1, T, d[2][0], d[2][1]);
-   RUN (1, T, d[3][0], d[3][1]);
- 
-   RUN (2, T, d[4][0], d[4][1]);
-   RUN (2, T, d[5][0], d[5][1]);
- 
-   RUN (3, T, d[6][0], d[6][1]);
-   RUN (3, T, d[7][0], d[7][1]);
- 
-   return 0;
- }
--- 0 ----
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-3.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-3.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-3.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-3.c	Thu Jan  1 00:00:00 1970
***************
*** 1,42 ****
- /* { dg-do run } */
- /* { dg-additional-options "-std=c99" } */
- 
- #include "sat_arith.h"
- 
- DEF_SAT_S_ADD_IMM_FMT_1(0, int32_t, uint32_t, -2147483648, INT32_MIN, INT32_MAX)
- DEF_SAT_S_ADD_IMM_FMT_1(1, int32_t, uint32_t, 2147483647, INT32_MIN, INT32_MAX)
- DEF_SAT_S_ADD_IMM_FMT_1(2, int32_t, uint32_t, 100, INT32_MIN, INT32_MAX)
- DEF_SAT_S_ADD_IMM_FMT_1(3, int32_t, uint32_t, -100, INT32_MIN, INT32_MAX)
- 
- #define T                       int32_t
- #define RUN(INDEX,T, x, expect) RUN_SAT_S_ADD_IMM_FMT_1(INDEX, T, x, expect)
- 
- T d[][2] = {
-   /* arg_0,   expect */
-   {     -1,     -2147483648, },
-   {      2,     -2147483646, },
-   {      1,      2147483647, },
-   {    -10,      2147483637, },
-   {    300,             400, },
-   {   -300,            -200, },
-   {    100,               0, },
-   {      0,            -100, },
- };
- 
- int
- main ()
- {
-   RUN (0, T, d[0][0], d[0][1]);
-   RUN (0, T, d[1][0], d[1][1]);
- 
-   RUN (1, T, d[2][0], d[2][1]);
-   RUN (1, T, d[3][0], d[3][1]);
- 
-   RUN (2, T, d[4][0], d[4][1]);
-   RUN (2, T, d[5][0], d[5][1]);
- 
-   RUN (3, T, d[6][0], d[6][1]);
-   RUN (3, T, d[7][0], d[7][1]);
- 
-   return 0;
- }
--- 0 ----
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-4.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-4.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-4.c	Sun May 25 22:32:12 2025
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-4.c	Thu Jan  1 00:00:00 1970
***************
*** 1,42 ****
- /* { dg-do run } */
- /* { dg-additional-options "-std=c99" } */
- 
- #include "sat_arith.h"
- 
- DEF_SAT_S_ADD_IMM_FMT_1(0, int64_t, uint64_t, (-9223372036854775807ll - 1), INT64_MIN, INT64_MAX)
- DEF_SAT_S_ADD_IMM_FMT_1(1, int64_t, uint64_t, 9223372036854775807ll, INT64_MIN, INT64_MAX)
- DEF_SAT_S_ADD_IMM_FMT_1(2, int64_t, uint64_t, 100, INT64_MIN, INT64_MAX)
- DEF_SAT_S_ADD_IMM_FMT_1(3, int64_t, uint64_t, -100, INT64_MIN, INT64_MAX)
- 
- #define T                       int64_t
- #define RUN(INDEX,T, x, expect) RUN_SAT_S_ADD_IMM_FMT_1(INDEX, T, x, expect)
- 
- T d[][2] = {
-   /* arg_0,   expect */
-   {     -1,     (-9223372036854775807ll - 1), },
-   {      2,           -9223372036854775806ll, },
-   {      1,            9223372036854775807ll, },
-   {     -7,            9223372036854775800ll, },
-   {      0,                              100, },
-   {     -1,                               99, },
-   {      0,                             -100, },
-   {    100,                                0, },
- };
- 
- int
- main ()
- {
-   RUN (0, T, d[0][0], d[0][1]);
-   RUN (0, T, d[1][0], d[1][1]);
- 
-   RUN (1, T, d[2][0], d[2][1]);
-   RUN (1, T, d[3][0], d[3][1]);
- 
-   RUN (2, T, d[4][0], d[4][1]);
-   RUN (2, T, d[5][0], d[5][1]);
- 
-   RUN (3, T, d[6][0], d[6][1]);
-   RUN (3, T, d[7][0], d[7][1]);
- 
-   return 0;
- }
--- 0 ----
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i16.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i16.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i16.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i16.c	Sun Jun  1 22:32:30 2025
***************
*** 0 ****
--- 1,9 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized" } */
+ 
+ #include "sat_arith.h"
+ 
+ DEF_SAT_S_ADD_IMM_FMT_1(0, int16_t, uint16_t, -32769, INT16_MIN, INT16_MAX)
+ DEF_SAT_S_ADD_IMM_FMT_1(1, int16_t, uint16_t, 32768, INT16_MIN, INT16_MAX)
+ 
+ /* { dg-final { scan-tree-dump-not ".SAT_ADD " "optimized" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i32.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i32.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i32.c	Sun Jun  1 22:32:30 2025
***************
*** 0 ****
--- 1,9 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized" } */
+ 
+ #include "sat_arith.h"
+ 
+ DEF_SAT_S_ADD_IMM_FMT_1(0, int32_t, uint32_t, -2147483649, INT32_MIN, INT32_MAX)
+ DEF_SAT_S_ADD_IMM_FMT_1(1, int32_t, uint32_t, 2147483648, INT32_MIN, INT32_MAX)
+ 
+ /* { dg-final { scan-tree-dump-not ".SAT_ADD " "optimized" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i8.c gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i8.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i8.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i8.c	Sun Jun  1 22:32:30 2025
***************
*** 0 ****
--- 1,9 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized" } */
+ 
+ #include "sat_arith.h"
+ 
+ DEF_SAT_S_ADD_IMM_FMT_1(0, int8_t, uint8_t, -129, INT8_MIN, INT8_MAX)
+ DEF_SAT_S_ADD_IMM_FMT_1(1, int8_t, uint8_t, 128, INT8_MIN, INT8_MAX)
+ 
+ /* { dg-final { scan-tree-dump-not ".SAT_ADD " "optimized" } } */
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/s390/vector/vec-extract-1.c gcc-16-20250601/gcc/testsuite/gcc.target/s390/vector/vec-extract-1.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/s390/vector/vec-extract-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/s390/vector/vec-extract-1.c	Sun Jun  1 22:32:30 2025
***************
*** 0 ****
--- 1,190 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=z14 -mzarch" } */
+ /* { dg-final { check-function-bodies "**" "" } } */
+ 
+ typedef double V2DF __attribute__((vector_size(16)));
+ typedef float V4SF __attribute__((vector_size(16)));
+ typedef float V2SF __attribute__((vector_size(8)));
+ typedef double V1DF __attribute__((vector_size(8)));
+ typedef float V1SF __attribute__((vector_size(4)));
+ typedef long double V1TF __attribute__((vector_size(16)));
+ 
+ /*
+ ** extractfirstdouble:
+ **	vlr	%v0,%v24
+ **	br	%r14
+ */
+ double
+ extractfirstdouble (V2DF x)
+ {
+   return x[0];
+ }
+ 
+ /*
+ ** extractseconddouble:
+ **	vrepg	%v0,%v24,1
+ **	br	%r14
+ */
+ double
+ extractseconddouble (V2DF x)
+ {
+   return x[1];
+ }
+ 
+ /*
+ ** extractnthdouble:
+ **	vlgvg	(%r.),%v24,0\(%r2\)
+ **	ldgr	%f0,\1
+ **	br	%r14
+ */
+ double
+ extractnthdouble (V2DF x, int n)
+ {
+   return x[n];
+ }
+ 
+ /*
+ ** sumfirstdouble:
+ **	vfadb	%v0,%v24,%v26
+ **	br	%r14
+ */
+ double
+ sumfirstdouble (V2DF x, V2DF y)
+ {
+   return (x + y)[0];
+ }
+ 
+ /*
+ ** extractfirstfloat:
+ **	vlr	%v0,%v24
+ **	br	%r14
+ */
+ float
+ extractfirstfloat (V4SF x)
+ {
+   return x[0];
+ }
+ 
+ /*
+ ** extractsecondfloat:
+ **	vrepf	%v0,%v24,1
+ **	br	%r14
+ */
+ float
+ extractsecondfloat (V4SF x)
+ {
+   return x[1];
+ }
+ 
+ /*
+ ** extractthirdfloat:
+ **	vrepf	%v0,%v24,2
+ **	br	%r14
+ */
+ float
+ extractthirdfloat (V4SF x)
+ {
+   return x[2];
+ }
+ 
+ /*
+ ** extractfourthfloat:
+ **	vrepf	%v0,%v24,3
+ **	br	%r14
+ */
+ float
+ extractfourthfloat (V4SF x)
+ {
+   return x[3];
+ }
+ 
+ /*
+ ** extractnthfloat:
+ **	vlgvf	(%r.),%v24,0\(%r2\)
+ **	vlvgf	%v0,\1,0
+ **	br	%r14
+ */
+ float
+ extractnthfloat (V4SF x, int n)
+ {
+   return x[n];
+ }
+ 
+ /*
+ ** sumfirstfloat:
+ **	vfasb	%v0,%v24,%v26
+ **	br	%r14
+ */
+ float
+ sumfirstfloat (V4SF x, V4SF y)
+ {
+   return (x + y)[0];
+ }
+ 
+ /*
+ ** extractfirst2:
+ **	vlr	%v0,%v24
+ **	br	%r14
+ */
+ float
+ extractfirst2 (V2SF x)
+ {
+   return x[0];
+ }
+ 
+ /*
+ ** extractsecond2:
+ **	vrepf	%v0,%v24,1
+ **	br	%r14
+ */
+ float
+ extractsecond2 (V2SF x)
+ {
+   return x[1];
+ }
+ 
+ /*
+ ** extractnth2:
+ **	vlgvf	(%r.),%v24,0\(%r2\)
+ **	vlvgf	%v0,\1,0
+ **	br	%r14
+ */
+ float
+ extractnth2 (V2SF x, int n)
+ {
+   return x[n];
+ }
+ 
+ /*
+ ** extractsinglef:
+ **	vlr	%v0,%v24
+ **	br	%r14
+ */
+ float
+ extractsinglef (V1SF x)
+ {
+   return x[0];
+ }
+ 
+ /*
+ ** extractsingled:
+ **	vlr	%v0,%v24
+ **	br	%r14
+ */
+ double
+ extractsingled (V1DF x)
+ {
+   return x[0];
+ }
+ 
+ /*
+ ** extractsingleld:
+ **	vlr	(%v.),%v24
+ **	vst	\1,0\(%r2\),3
+ **	br	%r14
+ */
+ long double
+ extractsingleld (V1TF x)
+ {
+   return x[0];
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gcc.target/s390/vector/vec-set-1.c gcc-16-20250601/gcc/testsuite/gcc.target/s390/vector/vec-set-1.c
*** gcc-16-20250525/gcc/testsuite/gcc.target/s390/vector/vec-set-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gcc.target/s390/vector/vec-set-1.c	Sun Jun  1 22:32:30 2025
***************
*** 0 ****
--- 1,133 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=z14 -mzarch" } */
+ /* { dg-final { check-function-bodies "**" "" } } */
+ 
+ typedef double V2DF __attribute__((vector_size(16)));
+ typedef double V1DF __attribute__((vector_size(8)));
+ typedef float V4SF __attribute__((vector_size(16)));
+ 
+ /*
+ ** setdf0:
+ **	vpdi	%v24,%v0,%v24,1
+ **	br	%r14
+ */
+ V2DF
+ setdf0 (V2DF x, double y)
+ {
+   x[0] = y;
+   return x;
+ }
+ 
+ /*
+ ** setdf1:
+ **	vmrhg	%v24,%v24,%v0
+ **	br	%r14
+ */
+ V2DF
+ setdf1 (V2DF x, double y)
+ {
+   x[1] = y;
+   return x;
+ }
+ 
+ /*
+ ** setdfn:
+ **	lgdr	(%r.),%f0
+ **	vlvgg	%v24,\1,0\(%r2\)
+ **	br	%r14
+ */
+ V2DF
+ setdfn (V2DF x, double y, int n)
+ {
+   x[n] = y;
+   return x;
+ }
+ 
+ /*
+ ** set1df:
+ **	vlr	%v24,%v0
+ **	br	%r14
+ */
+ V1DF
+ set1df (V1DF x, double y)
+ {
+   x[0] = y;
+   return x;
+ }
+ 
+ /*
+ ** set1dfn:
+ **	vlr	%v24,%v0
+ **	br	%r14
+ */
+ V1DF
+ set1dfn (V1DF x, double y, int n)
+ {
+   x[n] = y;
+   return x;
+ }
+ 
+ /*
+ ** setsf0:
+ **	lgdr	(%r.),%f0
+ **	vlvgf	%v24,\1,0
+ **	br	%r14
+ */
+ V4SF
+ setsf0 (V4SF x, float y)
+ {
+   x[0] = y;
+   return x;
+ }
+ 
+ /*
+ ** setsf1:
+ **	lgdr	(%r.),%f0
+ **	vlvgf	%v24,\1,1
+ **	br	%r14
+ */
+ V4SF
+ setsf1 (V4SF x, float y)
+ {
+   x[1] = y;
+   return x;
+ }
+ 
+ /*
+ ** setsf0:
+ **	lgdr	(%r.),%f0
+ **	vlvgf	%v24,\1,2
+ **	br	%r14
+ */
+ V4SF
+ setsf2 (V4SF x, float y)
+ {
+   x[2] = y;
+   return x;
+ }
+ 
+ /*
+ ** setsf1:
+ **	lgdr	(%r.),%f0
+ **	vlvgf	%v24,\1,3
+ **	br	%r14
+ */
+ V4SF
+ setsf3 (V4SF x, float y)
+ {
+   x[3] = y;
+   return x;
+ }
+ 
+ /*
+ ** setsfn:
+ **	lgdr	(%r.),%f0
+ **	vlvgf	%v24,\1,0\(%r2\)
+ **	br	%r14
+ */
+ V4SF
+ setsfn (V4SF x, float y, int n)
+ {
+   x[n] = y;
+   return x;
+ }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gfortran.dg/c_f_pointer_tests_6.f90 gcc-16-20250601/gcc/testsuite/gfortran.dg/c_f_pointer_tests_6.f90
*** gcc-16-20250525/gcc/testsuite/gfortran.dg/c_f_pointer_tests_6.f90	Sun May 25 22:32:13 2025
--- gcc-16-20250601/gcc/testsuite/gfortran.dg/c_f_pointer_tests_6.f90	Sun Jun  1 22:32:31 2025
*************** contains
*** 38,43 ****
      type(my_c_ptr_0) :: my_ptr2
      type(c_funptr) :: myfun
      print *,c_associated(my_ptr,my_ptr2)
!     print *,c_associated(my_ptr,myfun) ! { dg-error "Argument C_PTR_2 at .1. to C_ASSOCIATED shall have the same type as C_PTR_1: TYPE.c_ptr. instead of TYPE.c_funptr." }
    end subroutine
  end
--- 38,43 ----
      type(my_c_ptr_0) :: my_ptr2
      type(c_funptr) :: myfun
      print *,c_associated(my_ptr,my_ptr2)
!     print *,c_associated(my_ptr,myfun) ! { dg-error "Argument C_PTR_2 at .1. to C_ASSOCIATED shall have the same type as C_PTR_1, found TYPE.c_funptr. instead of TYPE.c_ptr." }
    end subroutine
  end
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gfortran.dg/comma_format_extension_1.f gcc-16-20250601/gcc/testsuite/gfortran.dg/comma_format_extension_1.f
*** gcc-16-20250525/gcc/testsuite/gfortran.dg/comma_format_extension_1.f	Sun May 25 22:32:13 2025
--- gcc-16-20250601/gcc/testsuite/gfortran.dg/comma_format_extension_1.f	Sun Jun  1 22:32:31 2025
***************
*** 1,5 ****
  ! { dg-do compile }
! ! { dg-options "" }
  ! test that the extension for a missing comma is accepted
  
        subroutine mysub
--- 1,5 ----
  ! { dg-do compile }
! ! { dg-options "-std=legacy" }
  ! test that the extension for a missing comma is accepted
  
        subroutine mysub
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gfortran.dg/comma_format_extension_3.f gcc-16-20250601/gcc/testsuite/gfortran.dg/comma_format_extension_3.f
*** gcc-16-20250525/gcc/testsuite/gfortran.dg/comma_format_extension_3.f	Sun May 25 22:32:13 2025
--- gcc-16-20250601/gcc/testsuite/gfortran.dg/comma_format_extension_3.f	Sun Jun  1 22:32:31 2025
***************
*** 3,9 ****
  ! did do the correct thing at runtime.
  ! Note the missing , before i1 in the format.
  ! { dg-do run }
! ! { dg-options "" }
        character*12 c
  
        write (c,100) 0, 1
--- 3,9 ----
  ! did do the correct thing at runtime.
  ! Note the missing , before i1 in the format.
  ! { dg-do run }
! ! { dg-options "-std=legacy" }
        character*12 c
  
        write (c,100) 0, 1
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gfortran.dg/continuation_13.f90 gcc-16-20250601/gcc/testsuite/gfortran.dg/continuation_13.f90
*** gcc-16-20250525/gcc/testsuite/gfortran.dg/continuation_13.f90	Sun May 25 22:32:13 2025
--- gcc-16-20250601/gcc/testsuite/gfortran.dg/continuation_13.f90	Sun Jun  1 22:32:31 2025
***************
*** 1,5 ****
  ! { dg-do run }
! ! { dg-options "-std=gnu" }
  ! PR64506
  character(25) :: astring
  
--- 1,5 ----
  ! { dg-do run }
! ! { dg-options "-std=legacy" }
  ! PR64506
  character(25) :: astring
  
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gfortran.dg/dec_math_3.f90 gcc-16-20250601/gcc/testsuite/gfortran.dg/dec_math_3.f90
*** gcc-16-20250525/gcc/testsuite/gfortran.dg/dec_math_3.f90	Sun May 25 22:32:13 2025
--- gcc-16-20250601/gcc/testsuite/gfortran.dg/dec_math_3.f90	Sun Jun  1 22:32:31 2025
***************
*** 1,8 ****
  ! { dg-options "-std=gnu" }
  ! { dg-do compile }
  
! ! Former ICE when simplifying asind, plus wrong function name in error message
! real, parameter :: d = asind(1.1) ! { dg-error "Argument of ASIND at.*must be between -1 and 1" }
! print *, d
  
  end
--- 1,17 ----
  ! { dg-options "-std=gnu" }
  ! { dg-do compile }
  
! real, parameter :: dacos = acosd(1.1) ! { dg-error "Argument of ACOSD at .1. must be within the closed interval \\\[-1, 1\\\]" }
! print *, dacos
! real, parameter :: dasin = asind(-1.1) ! { dg-error "Argument of ASIND at .1. must be within the closed interval \\\[-1, 1\\\]" }
! print *, dasin
! real, parameter :: datan2 = atan2d(0.0, 0.0) ! { dg-error "If the first argument of ATAN2D at .1. is zero, then the second argument must not be zero" }
! print *, datan2
! real, parameter :: piacos = acospi(-1.1) ! { dg-error "Argument of ACOSPI at .1. must be within the closed interval \\\[-1, 1\\\]" }
! print *, piacos
! real, parameter :: piasin = asinpi(1.1) ! { dg-error "Argument of ASINPI at .1. must be within the closed interval \\\[-1, 1\\\]" }
! print *, piasin
! real, parameter :: piatan2 = atan2pi(0.0, 0.0) ! { dg-error "If the first argument of ATAN2PI at .1. is zero, then the second argument must not be zero" }
! print *, piatan2
  
  end
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gfortran.dg/dec_math_5.f90 gcc-16-20250601/gcc/testsuite/gfortran.dg/dec_math_5.f90
*** gcc-16-20250525/gcc/testsuite/gfortran.dg/dec_math_5.f90	Sun May 25 22:32:13 2025
--- gcc-16-20250601/gcc/testsuite/gfortran.dg/dec_math_5.f90	Sun Jun  1 22:32:31 2025
*************** program p
*** 101,104 ****
--- 101,167 ----
    if (abs(b1 - 0.5) > e2) stop 38
    if (abs(c1 - 0.5) > e3) stop 39
    if (abs(d1 - 0.5) > e4) stop 40
+ 
+   a1 = acospi(0.5)
+   b1 = acospi(-0.5)
+   c1 = acospi(0.5)
+   d1 = acospi(-0.5)
+   if (abs(a1 - 1.0 / 3) > e1) stop 41
+   if (abs(b1 - 2.0 / 3) > e2) stop 42
+   if (abs(c1 - 1.0 / 3) > e3) stop 43
+   if (abs(d1 - 2.0 / 3) > e4) stop 44
+ 
+   a1 = asinpi(0.5)
+   b1 = asinpi(-0.5)
+   c1 = asinpi(0.5)
+   d1 = asinpi(-0.5)
+   if (abs(a1 - 1.0 / 6) > e1) stop 45
+   if (abs(b1 + 1.0 / 6) > e2) stop 46
+   if (abs(c1 - 1.0 / 6) > e3) stop 47
+   if (abs(d1 + 1.0 / 6) > e4) stop 48
+ 
+   a1 = atanpi(1.0)
+   b1 = atanpi(-1.0)
+   c1 = atanpi(1.0)
+   d1 = atanpi(-1.0)
+   if (abs(a1 - 0.25) > e1) stop 49
+   if (abs(b1 + 0.25) > e2) stop 50
+   if (abs(c1 - 0.25) > e3) stop 51
+   if (abs(d1 + 0.25) > e4) stop 52
+ 
+   a1 = atan2pi(1.0, 1.0)
+   b1 = atan2pi(1.0, 1.0)
+   c1 = atan2pi(1.0, 1.0)
+   d1 = atan2pi(1.0, 1.0)
+   if (abs(a1 - 0.25) > e1) stop 53
+   if (abs(b1 - 0.25) > e2) stop 54
+   if (abs(c1 - 0.25) > e3) stop 55
+   if (abs(d1 - 0.25) > e4) stop 56
+ 
+   a1 = cospi(1._4 / 3)
+   b1 = cospi(-1._8 / 3)
+   c1 = cospi(4._ep / 3)
+   d1 = cospi(-4._16 / 3)
+   if (abs(a1 - 0.5) > e1) stop 57
+   if (abs(b1 - 0.5) > e2) stop 58
+   if (abs(c1 + 0.5) > e3) stop 59
+   if (abs(d1 + 0.5) > e4) stop 60
+ 
+   a1 = sinpi(1._4 / 6)
+   b1 = sinpi(-1._8 / 6)
+   c1 = sinpi(5._ep / 6)
+   d1 = sinpi(-7._16 / 6)
+   if (abs(a1 - 0.5) > e1) stop 61
+   if (abs(b1 + 0.5) > e2) stop 62
+   if (abs(c1 - 0.5) > e3) stop 63
+   if (abs(d1 - 0.5) > e4) stop 64
+ 
+   a1 = tanpi(0.25)
+   b1 = tanpi(-0.25)
+   c1 = tanpi(1.25)
+   d1 = tanpi(-1.25)
+   if (abs(a1 - 1.0) > e1) stop 65
+   if (abs(b1 + 1.0) > e2) stop 66
+   if (abs(c1 - 1.0) > e3) stop 67
+   if (abs(d1 + 1.0) > e4) stop 68
  end program p
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gfortran.dg/dec_math_6.f90 gcc-16-20250601/gcc/testsuite/gfortran.dg/dec_math_6.f90
*** gcc-16-20250525/gcc/testsuite/gfortran.dg/dec_math_6.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gfortran.dg/dec_math_6.f90	Sun Jun  1 22:32:31 2025
***************
*** 0 ****
--- 1,12 ----
+ ! { dg-options "-std=f2018" }
+ ! { dg-do compile }
+ 
+ intrinsic :: acospi ! { dg-error "The intrinsic 'acospi' declared INTRINSIC at .1. is not available in the current standard settings but new in Fortran 2023. Use an appropriate '-std=\\*' option or enable '-fall-intrinsics' in order to use it" }
+ intrinsic :: asinpi ! { dg-error "The intrinsic 'asinpi' declared INTRINSIC at .1. is not available in the current standard settings but new in Fortran 2023. Use an appropriate '-std=\\*' option or enable '-fall-intrinsics' in order to use it" }
+ intrinsic :: atanpi ! { dg-error "The intrinsic 'atanpi' declared INTRINSIC at .1. is not available in the current standard settings but new in Fortran 2023. Use an appropriate '-std=\\*' option or enable '-fall-intrinsics' in order to use it" }
+ intrinsic :: atan2pi ! { dg-error "The intrinsic 'atan2pi' declared INTRINSIC at .1. is not available in the current standard settings but new in Fortran 2023. Use an appropriate '-std=\\*' option or enable '-fall-intrinsics' in order to use it" }
+ intrinsic :: cospi ! { dg-error "The intrinsic 'cospi' declared INTRINSIC at .1. is not available in the current standard settings but new in Fortran 2023. Use an appropriate '-std=\\*' option or enable '-fall-intrinsics' in order to use it" }
+ intrinsic :: sinpi ! { dg-error "The intrinsic 'sinpi' declared INTRINSIC at .1. is not available in the current standard settings but new in Fortran 2023. Use an appropriate '-std=\\*' option or enable '-fall-intrinsics' in order to use it" }
+ intrinsic :: tanpi ! { dg-error "The intrinsic 'tanpi' declared INTRINSIC at .1. is not available in the current standard settings but new in Fortran 2023. Use an appropriate '-std=\\*' option or enable '-fall-intrinsics' in order to use it" }
+ 
+ end
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gfortran.dg/inquiry_type_ref_7.f90 gcc-16-20250601/gcc/testsuite/gfortran.dg/inquiry_type_ref_7.f90
*** gcc-16-20250525/gcc/testsuite/gfortran.dg/inquiry_type_ref_7.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gfortran.dg/inquiry_type_ref_7.f90	Sun Jun  1 22:32:31 2025
***************
*** 0 ****
--- 1,62 ----
+ ! { dg-do compile }
+ ! { dg-additional-options "-fdump-tree-original" }
+ !
+ ! PR fortran/101735 - substrings and parsing of type parameter inquiries
+ 
+ program p
+   implicit none
+   integer, parameter :: ck = 4
+   character(len=5)         :: str  = ""
+   character(len=5)         :: str2(4)
+   character(len=5,kind=ck) :: str4 = ck_""
+   type t
+      character(len=5) :: str(4)
+   end type t
+   type(t) :: var
+   integer :: x, y 
+ 
+   integer, parameter :: i1 = kind (str(1:3))
+   integer, parameter :: j1 = str (1:3) % kind
+   integer, parameter :: k1 = (str(1:3) % kind)
+   integer, parameter :: kk = str (1:3) % kind % kind
+ 
+   integer, parameter :: i4 = kind (str4(1:3))
+   integer, parameter :: j4 = str4 (1:3) % kind
+   integer, parameter :: ll = str4 (1:3) % len
+ 
+   integer, parameter :: i2 = len (str(1:3))
+   integer, parameter :: j2 = str (1:3) % len
+   integer, parameter :: k2 = (str(1:3) % len)
+   integer, parameter :: lk = str (1:3) % len  % kind
+ 
+   integer, parameter :: l4 = str2      (:) (2:3) % len
+   integer, parameter :: l5 = var % str (:) (2:4) % len
+   integer, parameter :: k4 = str2      (:) (2:3) % kind
+   integer, parameter :: k5 = var % str (:) (2:4) % kind
+   integer, parameter :: k6 = str2      (:) (2:3) % len % kind
+   integer, parameter :: k7 = var % str (:) (2:4) % len % kind
+ 
+   if (i1 /= 1) stop 1
+   if (j1 /= 1) stop 2
+   if (k1 /= 1) stop 3
+ 
+   if (i4 /= ck) stop 4
+   if (j4 /= ck) stop 5
+   if (ll /= 3)  stop 6
+ 
+   if (kk /= 4) stop 7
+   if (lk /= 4) stop 8
+ 
+   if (i2 /= 3) stop 9
+   if (j2 /= 3) stop 10
+   if (k2 /= 3) stop 11
+ 
+   if (l4 /= 2) stop 12
+   if (l5 /= 3) stop 13
+   if (k4 /= 1) stop 14
+   if (k5 /= 1) stop 15
+   if (k6 /= 4) stop 16
+   if (k7 /= 4) stop 17
+ end
+ 
+ ! { dg-final { scan-tree-dump-not "_gfortran_stop_numeric" "original" } }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gfortran.dg/inquiry_type_ref_8.f90 gcc-16-20250601/gcc/testsuite/gfortran.dg/inquiry_type_ref_8.f90
*** gcc-16-20250525/gcc/testsuite/gfortran.dg/inquiry_type_ref_8.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gfortran.dg/inquiry_type_ref_8.f90	Sun Jun  1 22:32:31 2025
***************
*** 0 ****
--- 1,214 ----
+ ! { dg-do compile }
+ ! { dg-additional-options "-O0 -fdump-tree-original -std=f2018" }
+ !
+ ! PR fortran/102599 - type parameter inquiries and constant complex arrays
+ ! PR fortran/114022 - likewise
+ !
+ ! Everything below shall be simplified at compile time.
+ 
+ module mod
+   implicit none
+   public :: wp, c0, z0, y, test1
+   private
+ 
+   integer            :: j
+   integer, parameter :: n  = 5
+   integer, parameter :: wp = 8
+   type :: cx
+      real(wp) :: re
+      real(wp) :: im
+   end type cx
+   type(cx),    parameter :: c0(*) = [(cx   (j,-j),   j=1,n)]
+   complex(wp), parameter :: z0(*) = [(cmplx(j,-j,wp),j=1,n)]
+ 
+   type :: my_type
+      complex(wp) :: z(n) = z0
+      type(cx)    :: c(n) = c0
+   end type my_type
+   type(my_type), parameter :: y = my_type()
+ 
+ contains
+ 
+   ! Check simplification for inquiries of host-associated variables
+   subroutine test1 ()
+     ! Inquiries and full arrays
+     real(wp), parameter :: r0(*) = real  (z0)
+     real(wp), parameter :: i0(*) = aimag (z0)
+     real(wp), parameter :: r1(*) = c0 % re
+     real(wp), parameter :: i1(*) = c0 % im
+     real(wp), parameter :: r2(*) = z0 % re
+     real(wp), parameter :: i2(*) = z0 % im
+     real(wp), parameter :: r3(*) = y % c % re
+     real(wp), parameter :: i3(*) = y % c % im
+     real(wp), parameter :: r4(*) = y % z % re
+     real(wp), parameter :: i4(*) = y % z % im
+ 
+     logical, parameter :: l1 = all (r1 == r0)
+     logical, parameter :: l2 = all (i1 == i0)
+     logical, parameter :: l3 = all (r1 == r2)
+     logical, parameter :: l4 = all (i1 == i2)
+     logical, parameter :: l5 = all (r3 == r4)
+     logical, parameter :: l6 = all (i3 == i4)
+     logical, parameter :: l7 = all (r1 == r3)
+     logical, parameter :: l8 = all (i1 == i3)
+ 
+     ! Inquiries and array sections
+     real(wp), parameter :: p0(*) = real (z0(::2))
+     real(wp), parameter :: q0(*) = aimag (z0(::2))
+     real(wp), parameter :: p1(*) = c0(::2) % re
+     real(wp), parameter :: q1(*) = c0(::2) % im
+     real(wp), parameter :: p2(*) = z0(::2) % re
+     real(wp), parameter :: q2(*) = z0(::2) % im
+     real(wp), parameter :: p3(*) = y % c(::2) % re
+     real(wp), parameter :: q3(*) = y % c(::2) % im
+     real(wp), parameter :: p4(*) = y % z(::2) % re
+     real(wp), parameter :: q4(*) = y % z(::2) % im
+ 
+     logical, parameter :: m1 = all (p1 == p0)
+     logical, parameter :: m2 = all (q1 == q0)
+     logical, parameter :: m3 = all (p1 == p2)
+     logical, parameter :: m4 = all (q1 == q2)
+     logical, parameter :: m5 = all (p3 == p4)
+     logical, parameter :: m6 = all (q3 == q4)
+     logical, parameter :: m7 = all (p1 == p3)
+     logical, parameter :: m8 = all (q1 == q3)
+ 
+     ! Inquiries and vector subscripts
+     real(wp), parameter :: v0(*) = real (z0([3,2]))
+     real(wp), parameter :: w0(*) = aimag (z0([3,2]))
+     real(wp), parameter :: v1(*) = c0([3,2]) % re
+     real(wp), parameter :: w1(*) = c0([3,2]) % im
+     real(wp), parameter :: v2(*) = z0([3,2]) % re
+     real(wp), parameter :: w2(*) = z0([3,2]) % im
+     real(wp), parameter :: v3(*) = y % c([3,2]) % re
+     real(wp), parameter :: w3(*) = y % c([3,2]) % im
+     real(wp), parameter :: v4(*) = y % z([3,2]) % re
+     real(wp), parameter :: w4(*) = y % z([3,2]) % im
+ 
+     logical, parameter :: o1 = all (v1 == v0)
+     logical, parameter :: o2 = all (w1 == w0)
+     logical, parameter :: o3 = all (v1 == v2)
+     logical, parameter :: o4 = all (w1 == w2)
+     logical, parameter :: o5 = all (v3 == v4)
+     logical, parameter :: o6 = all (w3 == w4)
+     logical, parameter :: o7 = all (v1 == v3)
+     logical, parameter :: o8 = all (w1 == w3)
+ 
+     ! Miscellaneous
+     complex(wp),     parameter :: x(-1:*) = cmplx (r1,i1,kind=wp)
+     real(x%re%kind), parameter :: r(*) = x % re
+     real(x%im%kind), parameter :: i(*) = x % im
+     real(x%re%kind), parameter :: s(*) = [ x(:) % re ]
+     real(x%im%kind), parameter :: t(*) = [ x(:) % im ]
+ 
+     integer, parameter :: kr = x % re % kind
+     integer, parameter :: ki = x % im % kind
+     integer, parameter :: kx = x %      kind
+ 
+     if (kr /= wp .or. ki /= wp .or. kx /= wp) stop 1
+     if (any (r /= r1)) stop 2
+     if (any (i /= i1)) stop 3
+     if (any (s /= r1)) stop 4
+     if (any (t /= i1)) stop 5
+ 
+     if (.not. all ([l1,l2,l3,l4,l5,l6,l7,l8])) stop 6
+     if (.not. all ([m1,m2,m3,m4,m5,m6,m7,m8])) stop 7
+     if (.not. all ([o1,o2,o3,o4,o5,o6,o7,o8])) stop 8
+   end subroutine test1
+ end
+ 
+ program p
+   use mod, only: wp, c0, z0, y, test1
+   implicit none
+   call test1 ()
+   call test2 ()
+ contains
+   ! Check simplification for inquiries of use-associated variables
+   subroutine test2 ()
+     ! Inquiries and full arrays
+     real(wp), parameter :: r0(*) = real (z0)
+     real(wp), parameter :: i0(*) = aimag (z0)
+     real(wp), parameter :: r1(*) = c0 % re
+     real(wp), parameter :: i1(*) = c0 % im
+     real(wp), parameter :: r2(*) = z0 % re
+     real(wp), parameter :: i2(*) = z0 % im
+     real(wp), parameter :: r3(*) = y % c % re
+     real(wp), parameter :: i3(*) = y % c % im
+     real(wp), parameter :: r4(*) = y % z % re
+     real(wp), parameter :: i4(*) = y % z % im
+ 
+     logical, parameter :: l1 = all (r1 == r0)
+     logical, parameter :: l2 = all (i1 == i0)
+     logical, parameter :: l3 = all (r1 == r2)
+     logical, parameter :: l4 = all (i1 == i2)
+     logical, parameter :: l5 = all (r3 == r4)
+     logical, parameter :: l6 = all (i3 == i4)
+     logical, parameter :: l7 = all (r1 == r3)
+     logical, parameter :: l8 = all (i1 == i3)
+ 
+     ! Inquiries and array sections
+     real(wp), parameter :: p0(*) = real (z0(::2))
+     real(wp), parameter :: q0(*) = aimag (z0(::2))
+     real(wp), parameter :: p1(*) = c0(::2) % re
+     real(wp), parameter :: q1(*) = c0(::2) % im
+     real(wp), parameter :: p2(*) = z0(::2) % re
+     real(wp), parameter :: q2(*) = z0(::2) % im
+     real(wp), parameter :: p3(*) = y % c(::2) % re
+     real(wp), parameter :: q3(*) = y % c(::2) % im
+     real(wp), parameter :: p4(*) = y % z(::2) % re
+     real(wp), parameter :: q4(*) = y % z(::2) % im
+ 
+     logical, parameter :: m1 = all (p1 == p0)
+     logical, parameter :: m2 = all (q1 == q0)
+     logical, parameter :: m3 = all (p1 == p2)
+     logical, parameter :: m4 = all (q1 == q2)
+     logical, parameter :: m5 = all (p3 == p4)
+     logical, parameter :: m6 = all (q3 == q4)
+     logical, parameter :: m7 = all (p1 == p3)
+     logical, parameter :: m8 = all (q1 == q3)
+ 
+     ! Inquiries and vector subscripts
+     real(wp), parameter :: v0(*) = real (z0([3,2]))
+     real(wp), parameter :: w0(*) = aimag (z0([3,2]))
+     real(wp), parameter :: v1(*) = c0([3,2]) % re
+     real(wp), parameter :: w1(*) = c0([3,2]) % im
+     real(wp), parameter :: v2(*) = z0([3,2]) % re
+     real(wp), parameter :: w2(*) = z0([3,2]) % im
+     real(wp), parameter :: v3(*) = y % c([3,2]) % re
+     real(wp), parameter :: w3(*) = y % c([3,2]) % im
+     real(wp), parameter :: v4(*) = y % z([3,2]) % re
+     real(wp), parameter :: w4(*) = y % z([3,2]) % im
+ 
+     logical, parameter :: o1 = all (v1 == v0)
+     logical, parameter :: o2 = all (w1 == w0)
+     logical, parameter :: o3 = all (v1 == v2)
+     logical, parameter :: o4 = all (w1 == w2)
+     logical, parameter :: o5 = all (v3 == v4)
+     logical, parameter :: o6 = all (w3 == w4)
+     logical, parameter :: o7 = all (v1 == v3)
+     logical, parameter :: o8 = all (w1 == w3)
+ 
+     ! Miscellaneous
+     complex(wp),     parameter :: x(-1:*) = cmplx (r1,i1,kind=wp)
+     real(x%re%kind), parameter :: r(*) = x % re
+     real(x%im%kind), parameter :: i(*) = x % im
+     real(x%re%kind), parameter :: s(*) = [ x(:) % re ]
+     real(x%im%kind), parameter :: t(*) = [ x(:) % im ]
+ 
+     integer, parameter :: kr = x % re % kind
+     integer, parameter :: ki = x % im % kind
+     integer, parameter :: kx = x %      kind
+ 
+     if (kr /= wp .or. ki /= wp .or. kx /= wp) stop 11
+     if (any (r /= r1)) stop 12
+     if (any (i /= i1)) stop 13
+     if (any (s /= r1)) stop 14
+     if (any (t /= i1)) stop 15
+ 
+     if (.not. all ([l1,l2,l3,l4,l5,l6,l7,l8])) stop 16
+     if (.not. all ([m1,m2,m3,m4,m5,m6,m7,m8])) stop 17
+     if (.not. all ([o1,o2,o3,o4,o5,o6,o7,o8])) stop 18
+   end subroutine test2
+ end
+ 
+ ! { dg-final { scan-tree-dump-not "_gfortran_stop_numeric" "original" } }
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gfortran.dg/interface_62.f90 gcc-16-20250601/gcc/testsuite/gfortran.dg/interface_62.f90
*** gcc-16-20250525/gcc/testsuite/gfortran.dg/interface_62.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gfortran.dg/interface_62.f90	Sun Jun  1 22:32:31 2025
***************
*** 0 ****
--- 1,39 ----
+ ! { dg-do compile }
+ ! PR fortran/120355 - this was rejected because the typespec from
+ ! the RESULT clause was not picked up.
+ ! Test case jsberg@bnl.gov.
+ 
+ program p
+   implicit none
+   integer :: i,j
+   interface
+      function s(x) result(y)
+        implicit none
+        integer, intent(in) :: x
+        integer :: y
+      end function s
+   end interface
+   i = 0
+   call t(s,i,j)
+ contains
+   subroutine t(f,x,y)
+     implicit none
+     integer, intent(in) :: x
+     integer, intent(out) :: y
+     interface
+        function f(x) result(y)
+          implicit none
+          integer, intent(in) :: x
+          integer :: y
+        end function f
+     end interface
+     y = f(x)
+   end subroutine t
+ end program p
+ 
+ function s(x) result(y)
+   implicit none
+   integer, intent(in) :: x
+   integer :: y
+   y = 1 - x
+ end function s
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gfortran.dg/pr120049_2.f90 gcc-16-20250601/gcc/testsuite/gfortran.dg/pr120049_2.f90
*** gcc-16-20250525/gcc/testsuite/gfortran.dg/pr120049_2.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gfortran.dg/pr120049_2.f90	Sun Jun  1 22:32:31 2025
***************
*** 0 ****
--- 1,62 ----
+ ! Compiled with pr120049_b.f90
+ ! { dg-options -O0 }
+ ! { dg-do compile }
+ ! { dg-compile-aux-modules "pr120049_b.f90" }
+ !
+ ! Test the fix for PR120049
+ program tests_gtk_sup
+   use gtk_sup
+   implicit none
+   
+   type mytype
+     integer :: myint
+   end type mytype
+   type(mytype) :: ijkl = mytype(42)
+   logical :: truth
+   real :: var1
+   type(c_ptr), target :: val
+   type(c_funptr), target :: fptr
+   character(15) :: stringy
+   complex :: certainly
+   truth = .true.
+   var1 = 86.
+   stringy = "what the hay!"
+   certainly = (3.14,-4.13)
+   if (c_associated(val, c_loc(val))) then
+     stop 1
+   endif
+   if (c_associated(c_loc(val), val)) then
+     stop 2
+   endif
+   print *, c_associated(fptr, C_NULL_FUNPTR)
+   print *, c_associated(c_loc(val), C_NULL_PTR)
+   print *, c_associated(C_NULL_PTR, c_loc(val)) 
+   print *, c_associated(c_loc(val), 42) ! { dg-error "C_ASSOCIATED shall have the" }
+   print *, c_associated(c_loc(val), .42) ! { dg-error "C_ASSOCIATED shall have the" }
+   print *, c_associated(c_loc(val), truth) ! { dg-error "C_ASSOCIATED shall have the" }
+   print *, c_associated(c_loc(val), .false.) ! { dg-error "C_ASSOCIATED shall have the" }
+   print *, c_associated(c_loc(val), var1) ! { dg-error "C_ASSOCIATED shall have the" }
+   print *, c_associated(c_loc(val), stringy) ! { dg-error "C_ASSOCIATED shall have the" }
+   print *, c_associated(c_loc(val), certainly) ! { dg-error "C_ASSOCIATED shall have the" }
+   print *, c_associated(42) ! { dg-error "C_ASSOCIATED shall have the" }
+   print *, c_associated(.42) ! { dg-error "C_ASSOCIATED shall have the" }
+   print *, c_associated(truth) ! { dg-error "C_ASSOCIATED shall have the" }
+   print *, c_associated(.false.) ! { dg-error "C_ASSOCIATED shall have the" }
+   print *, c_associated(var1) ! { dg-error "C_ASSOCIATED shall have the" }
+   print *, c_associated(stringy) ! { dg-error "C_ASSOCIATED shall have the" }
+   print *, c_associated(certainly) ! { dg-error "C_ASSOCIATED shall have the" }
+   print *, c_associated(.42) ! { dg-error "C_ASSOCIATED shall have the" }
+   print *, c_associated(val, testit(val)) ! { dg-error "C_ASSOCIATED shall have the" }
+   print *, c_associated(testit(val), val) ! { dg-error "C_ASSOCIATED shall have the" }
+   print *, c_associated(testit(val)) ! { dg-error "C_ASSOCIATED shall have the" }
+   print *, c_associated(c_loc(val), C_NULL_FUNPTR) ! { dg-error "C_ASSOCIATED shall have the" }
+   print *, c_associated(C_NULL_FUNPTR, c_loc(val)) ! { dg-error "C_ASSOCIATED shall have the" }
+ contains
+ 
+   function testit (avalue) result(res)
+     type(c_ptr) :: avalue
+     type(mytype) :: res
+     res%myint = 42
+   end function
+ 
+ end program tests_gtk_sup
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gfortran.dg/pr120049_a.f90 gcc-16-20250601/gcc/testsuite/gfortran.dg/pr120049_a.f90
*** gcc-16-20250525/gcc/testsuite/gfortran.dg/pr120049_a.f90	Sun May 25 22:32:13 2025
--- gcc-16-20250601/gcc/testsuite/gfortran.dg/pr120049_a.f90	Sun Jun  1 22:32:31 2025
***************
*** 1,5 ****
! ! { dg-do preprocess }
! ! { dg-additional-options "-cpp" }
  !
  ! Test the fix for PR86248
  program tests_gtk_sup
--- 1,8 ----
! ! Compiled with pr120049_b.f90
! ! { dg-options -O0 }
! ! { dg-do run }
! ! { dg-compile-aux-modules "pr120049_b.f90" }
! ! { dg-additional-sources pr120049_b.f90 }
  !
  ! Test the fix for PR86248
  program tests_gtk_sup
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gfortran.dg/pr120049_b.f90 gcc-16-20250601/gcc/testsuite/gfortran.dg/pr120049_b.f90
*** gcc-16-20250525/gcc/testsuite/gfortran.dg/pr120049_b.f90	Sun May 25 22:32:13 2025
--- gcc-16-20250601/gcc/testsuite/gfortran.dg/pr120049_b.f90	Sun Jun  1 22:32:31 2025
***************
*** 1,5 ****
- ! { dg-do  run }
- ! { dg-additional-sources pr120049_a.f90 }
  !
  ! Module for pr120049.f90
  !
--- 1,3 ----
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gm2/pim/fail/testcharint.mod gcc-16-20250601/gcc/testsuite/gm2/pim/fail/testcharint.mod
*** gcc-16-20250525/gcc/testsuite/gm2/pim/fail/testcharint.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gm2/pim/fail/testcharint.mod	Sun Jun  1 22:32:32 2025
***************
*** 0 ****
--- 1,8 ----
+ MODULE testcharint ;  (*!m2iso+gm2*)
+ 
+ VAR
+    ch: CHAR ;
+    i : INTEGER ;
+ BEGIN
+    ch := i
+ END testcharint.
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gm2/pim/fail/testindrx.mod gcc-16-20250601/gcc/testsuite/gm2/pim/fail/testindrx.mod
*** gcc-16-20250525/gcc/testsuite/gm2/pim/fail/testindrx.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gm2/pim/fail/testindrx.mod	Sun Jun  1 22:32:32 2025
***************
*** 0 ****
--- 1,8 ----
+ MODULE testindrx ;  (*!m2iso+gm2*)
+ 
+ VAR
+    x: ARRAY [1..5] OF INTEGER ;
+    ch: CHAR ;
+ BEGIN
+    ch := x[1]
+ END testindrx.
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gm2/pim/pass/ReturnType.mod gcc-16-20250601/gcc/testsuite/gm2/pim/pass/ReturnType.mod
*** gcc-16-20250525/gcc/testsuite/gm2/pim/pass/ReturnType.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gm2/pim/pass/ReturnType.mod	Sun Jun  1 22:32:32 2025
***************
*** 0 ****
--- 1,17 ----
+ MODULE ReturnType ;
+ 
+ TYPE
+    bar = POINTER TO CARDINAL ;
+ 
+ 
+ PROCEDURE foo (VAR value: bar) : bar ;
+ BEGIN
+    RETURN value
+ END foo ;
+ 
+ VAR
+    b: bar ;
+ BEGIN
+    b := NIL ;
+    b := foo (b)
+ END ReturnType.
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gm2/pim/pass/ReturnType2.mod gcc-16-20250601/gcc/testsuite/gm2/pim/pass/ReturnType2.mod
*** gcc-16-20250525/gcc/testsuite/gm2/pim/pass/ReturnType2.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gm2/pim/pass/ReturnType2.mod	Sun Jun  1 22:32:32 2025
***************
*** 0 ****
--- 1,19 ----
+ MODULE ReturnType2 ;
+ 
+ TYPE
+    bar = POINTER TO RECORD
+                        field: CARDINAL ;
+                     END ;
+ 
+ 
+ PROCEDURE foo (VAR value: bar) : bar ;
+ BEGIN
+    RETURN value
+ END foo ;
+ 
+ VAR
+    b: bar ;
+ BEGIN
+    b := NIL ;
+    b := foo (b)
+ END ReturnType2.
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gm2/pim/pass/testxindr.mod gcc-16-20250601/gcc/testsuite/gm2/pim/pass/testxindr.mod
*** gcc-16-20250525/gcc/testsuite/gm2/pim/pass/testxindr.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gm2/pim/pass/testxindr.mod	Sun Jun  1 22:32:32 2025
***************
*** 0 ****
--- 1,17 ----
+ MODULE testxindr ;  (*!m2iso+gm2*)
+ 
+ CONST
+    NulName = 0 ;
+ 
+ TYPE
+    Name = CARDINAL ;
+ 
+    ptr = POINTER TO RECORD
+                        n: Name ;
+                     END ;
+ 
+ VAR
+    p: ptr ;
+ BEGIN
+    p^.n := NulName
+ END testxindr.
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gm2/pim/pass/testxindr2.mod gcc-16-20250601/gcc/testsuite/gm2/pim/pass/testxindr2.mod
*** gcc-16-20250525/gcc/testsuite/gm2/pim/pass/testxindr2.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gm2/pim/pass/testxindr2.mod	Sun Jun  1 22:32:32 2025
***************
*** 0 ****
--- 1,17 ----
+ MODULE testxindr2 ;  (*!m2iso+gm2*)
+ 
+ CONST
+    NulName = 0 ;
+ TYPE
+    Name = CARDINAL ;
+ 
+ PROCEDURE set (VAR n: Name) ;
+ BEGIN
+    n := NulName
+ END set ;
+ 
+ VAR
+    n: Name ;
+ BEGIN
+    set (n)
+ END testxindr2.
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gm2/pim/pass/testxindr3.mod gcc-16-20250601/gcc/testsuite/gm2/pim/pass/testxindr3.mod
*** gcc-16-20250525/gcc/testsuite/gm2/pim/pass/testxindr3.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gm2/pim/pass/testxindr3.mod	Sun Jun  1 22:32:32 2025
***************
*** 0 ****
--- 1,15 ----
+ MODULE testxindr3 ;  (*!m2iso+gm2*)
+ 
+ CONST
+    NulName = 0 ;
+ 
+ PROCEDURE set (VAR n: CARDINAL) ;
+ BEGIN
+    n := NulName
+ END set ;
+ 
+ VAR
+    n: CARDINAL ;
+ BEGIN
+    set (n)
+ END testxindr3.
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gnat.dg/sso19.adb gcc-16-20250601/gcc/testsuite/gnat.dg/sso19.adb
*** gcc-16-20250525/gcc/testsuite/gnat.dg/sso19.adb	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gnat.dg/sso19.adb	Sun Jun  1 22:32:32 2025
***************
*** 0 ****
--- 1,13 ----
+ --  { dg-do run }
+ --  { dg-options "-O2" }
+ 
+ with SSO19_Pkg; use SSO19_Pkg;
+ 
+ procedure SSO19 is
+   R : constant Rec := (D => (I => 8, F => 4.6095713E-41));
+ 
+ begin
+   if not Is_Valid (R) then
+     raise Program_Error;
+   end if;
+ end;
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gnat.dg/sso19_pkg.adb gcc-16-20250601/gcc/testsuite/gnat.dg/sso19_pkg.adb
*** gcc-16-20250525/gcc/testsuite/gnat.dg/sso19_pkg.adb	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gnat.dg/sso19_pkg.adb	Sun Jun  1 22:32:32 2025
***************
*** 0 ****
--- 1,13 ----
+ package body SSO19_Pkg is
+ 
+   function Is_Valid_Private (Item : Data) return Boolean is
+   begin
+     return Item.I'Valid and Item.F'Valid;
+   end Is_Valid_Private;
+ 
+   function Is_Valid (Item : Rec) return Boolean is
+   begin
+     return Is_Valid_Private (Item.D);
+   end Is_Valid;
+ 
+ end SSO19_Pkg;
diff -Nrcpad gcc-16-20250525/gcc/testsuite/gnat.dg/sso19_pkg.ads gcc-16-20250601/gcc/testsuite/gnat.dg/sso19_pkg.ads
*** gcc-16-20250525/gcc/testsuite/gnat.dg/sso19_pkg.ads	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/testsuite/gnat.dg/sso19_pkg.ads	Sun Jun  1 22:32:32 2025
***************
*** 0 ****
--- 1,24 ----
+ with System;
+ 
+ package SSO19_Pkg is
+ 
+   subtype Small_Int is Short_Integer range -1000 .. 1000;
+ 
+   type Data is record
+     I : Small_Int;
+     F : Float;
+   end record;
+   for Data use record
+     I at 0 range 0 .. 15;
+     F at 4 range 0 .. 31;
+   end record;
+   for Data'Bit_Order use System.High_Order_First;
+   for Data'Scalar_Storage_Order use System.High_Order_First;
+ 
+   type Rec is record
+     D : Data;
+   end record;
+ 
+   function Is_Valid (Item : Rec) return Boolean;
+ 
+ end SSO19_Pkg;
diff -Nrcpad gcc-16-20250525/gcc/testsuite/lib/htmltest.py gcc-16-20250601/gcc/testsuite/lib/htmltest.py
*** gcc-16-20250525/gcc/testsuite/lib/htmltest.py	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/testsuite/lib/htmltest.py	Sun Jun  1 22:32:33 2025
*************** def html_tree_from_env():
*** 7,9 ****
--- 7,99 ----
      html_filename += '.html'
      print('html_filename: %r' % html_filename)
      return ET.parse(html_filename)
+ 
+ XHTML = 'http://www.w3.org/1999/xhtml'
+ ns = {'xhtml': XHTML}
+ 
+ def make_tag(local_name):
+     return f'{{{XHTML}}}' + local_name
+ 
+ def assert_tag(element, expected):
+     assert element.tag == make_tag(expected)
+ 
+ def assert_class(element, expected):
+     assert element.attrib['class'] == expected
+ 
+ def assert_quoted_line(tr, expected_line_num, expected_src):
+     """Verify that tr is a line of quoted source."""
+     tds = tr.findall('xhtml:td', ns)
+     assert len(tds) == 3
+     assert_class(tds[0], 'linenum')
+     assert tds[0].text == expected_line_num
+     assert_class(tds[1], 'left-margin')
+     assert tds[1].text == ' '
+     assert_class(tds[2], 'source')
+     assert tds[2].text == expected_src
+ 
+ def assert_annotation_line(tr, expected_src,
+                            expected_line_num='     ',
+                            expected_left_margin=' '):
+     """Verify that tr is an annotation line."""
+     tds = tr.findall('xhtml:td', ns)
+     assert len(tds) == 3
+     assert_class(tds[0], 'linenum')
+     assert tds[0].text == expected_line_num
+     assert_class(tds[1], 'left-margin')
+     assert tds[1].text == expected_left_margin
+     assert_class(tds[2], 'annotation')
+     assert tds[2].text == expected_src
+ 
+ def assert_frame(frame, expected_fnname):
+     """
+     Assert that frame is of class 'stack-frame'
+     and has a child showing the expected fnname.
+     """
+     assert_class(frame, 'stack-frame')
+     funcname = frame[0]
+     assert_class(funcname, 'frame-funcname')
+     span = funcname[0]
+     assert_tag(span, 'span')
+     assert span.text == expected_fnname
+ 
+ def assert_event_range_with_margin(element):
+     """
+     Verify that "element" is an event-range-with-margin
+     """
+     assert_tag(element, 'table')
+     assert_class(element, 'event-range-with-margin')
+     tr = element.find('xhtml:tr', ns)
+     assert tr is not None
+     td = tr.find('xhtml:td', ns)
+     assert_class(td, 'event-range')
+ 
+     events_hdr = td.find('xhtml:div', ns)
+     assert_class(events_hdr, 'events-hdr')
+ 
+     #...etc
+ 
+ def get_diag_by_index(html_tree, index):
+     root = html_tree.getroot ()
+     assert root.tag == make_tag('html')
+ 
+     body = root.find('xhtml:body', ns)
+     assert body is not None
+ 
+     diag_list = body.find('xhtml:div', ns)
+     assert diag_list is not None
+     assert_class(diag_list, 'gcc-diagnostic-list')
+ 
+     diags = diag_list.findall('xhtml:div', ns)
+     diag = diags[index]
+     assert_class(diag, 'gcc-diagnostic')
+     return diag
+ 
+ def get_message_within_diag(diag_element):
+     msg = diag_element.find('xhtml:span', ns)
+     assert_class(msg, 'gcc-message')
+     return msg
+ 
+ def get_locus_within_diag(diag_element):
+     src = diag_element.find('xhtml:table', ns)
+     assert_class(src, 'locus')
+     return src
diff -Nrcpad gcc-16-20250525/gcc/testsuite/lib/target-supports.exp gcc-16-20250601/gcc/testsuite/lib/target-supports.exp
*** gcc-16-20250525/gcc/testsuite/lib/target-supports.exp	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/testsuite/lib/target-supports.exp	Sun Jun  1 22:32:33 2025
*************** proc check_effective_target_keeps_null_p
*** 759,765 ****
  # this allows parallelism of 16 and higher of parallel gcc-auto-profile
  proc profopt-perf-wrapper { } {
      global srcdir
!     return "$srcdir/../config/i386/gcc-auto-profile --all -m8 "
  }
  
  # Return true if profiling is supported on the target.
--- 759,771 ----
  # this allows parallelism of 16 and higher of parallel gcc-auto-profile
  proc profopt-perf-wrapper { } {
      global srcdir
!     if { [check_effective_target_x86] } {
!     	return "$srcdir/../config/i386/gcc-auto-profile -m8"
!     }
!     if { [istarget aarch64*-*-*] } {
!     	return "$srcdir/../config/aarch64/gcc-auto-profile -m8"
!     }
!     return ""
  }
  
  # Return true if profiling is supported on the target.
*************** proc check_profiling_available { test_wh
*** 778,785 ****
      }
  
      if { $test_what == "-fauto-profile" } {
! 	if { !([check_effective_target_x86] && [istarget *-*-linux*]) } {
! 	    verbose "autofdo only supported on linux"
  	    return 0
  	}
  	# not cross compiling?
--- 784,790 ----
      }
  
      if { $test_what == "-fauto-profile" } {
! 	if { !([check_effective_target_autofdo]) } {
  	    return 0
  	}
  	# not cross compiling?
*************** proc check_profiling_available { test_wh
*** 787,799 ****
  	    verbose "autofdo not supported for non native builds"
  	    return 0
  	}
! 	set event [profopt-perf-wrapper]
! 	if {$event == "" } {
  	    verbose "autofdo not supported"
  	    return 0
  	}
  	global srcdir
! 	set status [remote_exec host "$srcdir/../config/i386/gcc-auto-profile" "-m8 true -v >/dev/null"]
  	if { [lindex $status 0] != 0 } {
  	    verbose "autofdo not supported because perf does not work"
  	    return 0
--- 792,805 ----
  	    verbose "autofdo not supported for non native builds"
  	    return 0
  	}
! 	set wrapper [profopt-perf-wrapper]
! 	if {$wrapper == "" } {
  	    verbose "autofdo not supported"
  	    return 0
  	}
+ 	puts $wrapper
  	global srcdir
! 	set status [remote_exec host "$wrapper true -v >/dev/null"]
  	if { [lindex $status 0] != 0 } {
  	    verbose "autofdo not supported because perf does not work"
  	    return 0
*************** proc check_effective_target_fpic { } {
*** 1423,1428 ****
--- 1429,1451 ----
      return 0
  }
  
+ # Check if target supports autofdo.
+ 
+ proc check_effective_target_autofdo { } {
+     if { !([istarget *-*-linux*]) } {
+ 	verbose "autofdo only supported on linux"
+ 	return 0
+     }
+     if { [check_effective_target_x86] } {
+ 	return 1
+     }
+     if { [istarget aarch64*-*-*] } {
+ 	return 1
+     }
+     return 0
+ }
+ 
+ 
  # On AArch64, if -fpic is not supported, then we will fall back to -fPIC
  # silently.  So, we can't rely on above "check_effective_target_fpic" as it
  # assumes compiler will give warning if -fpic not supported.  Here we check
diff -Nrcpad gcc-16-20250525/gcc/tree-core.h gcc-16-20250601/gcc/tree-core.h
*** gcc-16-20250525/gcc/tree-core.h	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/tree-core.h	Sun Jun  1 22:32:33 2025
*************** enum omp_clause_code {
*** 368,373 ****
--- 368,377 ----
    /* OpenMP clause: doacross ({source,sink}:vec).  */
    OMP_CLAUSE_DOACROSS,
  
+   /* OpenMP mapper binding: record implicit mappers in scope for aggregate
+      types used within an offload region.  */
+   OMP_CLAUSE__MAPPER_BINDING_,
+ 
    /* Internal structure to hold OpenACC cache directive's variable-list.
       #pragma acc cache (variable-list).  */
    OMP_CLAUSE__CACHE_,
diff -Nrcpad gcc-16-20250525/gcc/tree-inline.cc gcc-16-20250601/gcc/tree-inline.cc
*** gcc-16-20250525/gcc/tree-inline.cc	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/tree-inline.cc	Sun Jun  1 22:32:33 2025
*************** initialize_cfun (tree new_fndecl, tree c
*** 2866,2872 ****
    cfun->nonlocal_goto_save_area = src_cfun->nonlocal_goto_save_area;
    cfun->function_end_locus = src_cfun->function_end_locus;
    cfun->curr_properties = src_cfun->curr_properties;
-   cfun->last_verified = src_cfun->last_verified;
    cfun->va_list_gpr_size = src_cfun->va_list_gpr_size;
    cfun->va_list_fpr_size = src_cfun->va_list_fpr_size;
    cfun->has_nonlocal_label = src_cfun->has_nonlocal_label;
--- 2866,2871 ----
diff -Nrcpad gcc-16-20250525/gcc/tree-nrv.cc gcc-16-20250601/gcc/tree-nrv.cc
*** gcc-16-20250525/gcc/tree-nrv.cc	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/tree-nrv.cc	Sun Jun  1 22:32:33 2025
*************** pass_nrv::execute (function *fun)
*** 167,182 ****
        for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
  	{
  	  gimple *stmt = gsi_stmt (gsi);
- 	  tree ret_val;
  
  	  if (greturn *return_stmt = dyn_cast <greturn *> (stmt))
  	    {
! 	      /* In a function with an aggregate return value, the
! 		 gimplifier has changed all non-empty RETURN_EXPRs to
! 		 return the RESULT_DECL.  */
! 	      ret_val = gimple_return_retval (return_stmt);
! 	      if (ret_val)
! 		gcc_assert (ret_val == result);
  	    }
  	  else if (gimple_has_lhs (stmt)
  		   && gimple_get_lhs (stmt) == result)
--- 167,187 ----
        for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
  	{
  	  gimple *stmt = gsi_stmt (gsi);
  
  	  if (greturn *return_stmt = dyn_cast <greturn *> (stmt))
  	    {
! 	      /* We cannot perform NRV optimizations in a function with an
! 		 aggregate return value if there is a return that does not
! 		 return RESULT_DECL.  We used to assert this scenario doesn't
! 		 happen: the gimplifier has changed all non-empty RETURN_EXPRs
! 		 to return the RESULT_DECL.  However, per PR119835 we may run
! 		 into this scenario for offloading compilation, and therefore
! 		 gracefully bail out.  */
! 	      if (tree ret_val = gimple_return_retval (return_stmt))
! 		{
! 		  if (ret_val != result)
! 		    return 0;
! 		}
  	    }
  	  else if (gimple_has_lhs (stmt)
  		   && gimple_get_lhs (stmt) == result)
diff -Nrcpad gcc-16-20250525/gcc/tree-pass.h gcc-16-20250601/gcc/tree-pass.h
*** gcc-16-20250525/gcc/tree-pass.h	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/tree-pass.h	Sun Jun  1 22:32:33 2025
*************** protected:
*** 236,244 ****
    (PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh | PROP_gimple_lomp)
  
  /* To-do flags.  */
  #define TODO_do_not_ggc_collect		(1 << 1)
  #define TODO_cleanup_cfg        	(1 << 5)
- #define TODO_verify_il			(1 << 6)
  #define TODO_dump_symtab		(1 << 7)
  #define TODO_remove_functions		(1 << 8)
  
--- 236,244 ----
    (PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh | PROP_gimple_lomp)
  
  /* To-do flags.  */
+ /* Note (1ul << 31) is reserved for TODO_verify_il. */
  #define TODO_do_not_ggc_collect		(1 << 1)
  #define TODO_cleanup_cfg        	(1 << 5)
  #define TODO_dump_symtab		(1 << 7)
  #define TODO_remove_functions		(1 << 8)
  
*************** protected:
*** 308,313 ****
--- 308,315 ----
     and stop pass manager.  */
  #define TODO_discard_function		(1 << 23)
  
+ /* (1ul << 31) is reserved for TODO_verify_il. */
+ 
  /* Internally used in execute_function_todo().  */
  #define TODO_update_ssa_any		\
      (TODO_update_ssa			\
*************** protected:
*** 315,322 ****
       | TODO_update_ssa_full_phi		\
       | TODO_update_ssa_only_virtuals)
  
- #define TODO_verify_all TODO_verify_il
- 
  /* To-do flags for pending_TODOs.  */
  
  /* Tell the next scalar cleanup pass that there is
--- 317,322 ----
diff -Nrcpad gcc-16-20250525/gcc/tree-pretty-print.cc gcc-16-20250601/gcc/tree-pretty-print.cc
*** gcc-16-20250525/gcc/tree-pretty-print.cc	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/tree-pretty-print.cc	Sun Jun  1 22:32:33 2025
*************** dump_omp_clause (pretty_printer *pp, tre
*** 1122,1127 ****
--- 1122,1136 ----
  	case GOMP_MAP_ALWAYS_PRESENT_TOFROM:
  	  pp_string (pp, "always,present,tofrom");
  	  break;
+ 	case GOMP_MAP_UNSET:
+ 	  pp_string (pp, "unset");
+ 	  break;
+ 	case GOMP_MAP_PUSH_MAPPER_NAME:
+ 	  pp_string (pp, "push_mapper");
+ 	  break;
+ 	case GOMP_MAP_POP_MAPPER_NAME:
+ 	  pp_string (pp, "pop_mapper");
+ 	  break;
  	default:
  	  gcc_unreachable ();
  	}
*************** dump_omp_clause (pretty_printer *pp, tre
*** 1200,1205 ****
--- 1209,1231 ----
  			 spc, flags, false);
        goto print_clause_size;
  
+     case OMP_CLAUSE__MAPPER_BINDING_:
+       pp_string (pp, "mapper_binding(");
+       if (OMP_CLAUSE__MAPPER_BINDING__ID (clause))
+ 	{
+ 	  dump_generic_node (pp, OMP_CLAUSE__MAPPER_BINDING__ID (clause), spc,
+ 			     flags, false);
+ 	  pp_comma (pp);
+ 	}
+       dump_generic_node (pp,
+ 			 TREE_TYPE (OMP_CLAUSE__MAPPER_BINDING__DECL (clause)),
+ 			 spc, flags, false);
+       pp_comma (pp);
+       dump_generic_node (pp, OMP_CLAUSE__MAPPER_BINDING__MAPPER (clause), spc,
+ 			 flags, false);
+       pp_right_paren (pp);
+       break;
+ 
      case OMP_CLAUSE_NUM_TEAMS:
        pp_string (pp, "num_teams(");
        if (OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR (clause))
*************** dump_generic_node (pretty_printer *pp, t
*** 4263,4268 ****
--- 4289,4309 ----
        pp_string (pp, ")>");
        break;
  
+     case OMP_DECLARE_MAPPER:
+       pp_string (pp, "#pragma omp declare mapper (");
+       if (OMP_DECLARE_MAPPER_ID (node))
+ 	{
+ 	  dump_generic_node (pp, OMP_DECLARE_MAPPER_ID (node), spc, flags,
+ 			     false);
+ 	  pp_colon (pp);
+ 	}
+       dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
+       pp_space (pp);
+       dump_generic_node (pp, OMP_DECLARE_MAPPER_DECL (node), spc, flags, false);
+       pp_right_paren (pp);
+       dump_omp_clauses (pp, OMP_DECLARE_MAPPER_CLAUSES (node), spc, flags);
+       break;
+ 
      case TRANSACTION_EXPR:
        if (TRANSACTION_EXPR_OUTER (node))
  	pp_string (pp, "__transaction_atomic [[outer]]");
diff -Nrcpad gcc-16-20250525/gcc/tree-ssa-dse.cc gcc-16-20250601/gcc/tree-ssa-dse.cc
*** gcc-16-20250525/gcc/tree-ssa-dse.cc	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/tree-ssa-dse.cc	Sun Jun  1 22:32:33 2025
*************** live_bytes_read (ao_ref *use_ref, ao_ref
*** 842,848 ****
  	return true;
  
        /* Now check if any of the remaining bits in use_ref are set in LIVE.  */
!       return bitmap_bit_in_range_p (live, start, (start + size - 1));
      }
    return true;
  }
--- 842,848 ----
  	return true;
  
        /* Now check if any of the remaining bits in use_ref are set in LIVE.  */
!       return bitmap_any_bit_in_range_p (live, start, (start + size - 1));
      }
    return true;
  }
diff -Nrcpad gcc-16-20250525/gcc/tree-ssa-forwprop.cc gcc-16-20250601/gcc/tree-ssa-forwprop.cc
*** gcc-16-20250525/gcc/tree-ssa-forwprop.cc	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/tree-ssa-forwprop.cc	Sun Jun  1 22:32:33 2025
*************** struct _vec_perm_simplify_seq
*** 205,211 ****
  typedef struct _vec_perm_simplify_seq *vec_perm_simplify_seq;
  
  static bool forward_propagate_addr_expr (tree, tree, bool);
- static void optimize_vector_load (gimple_stmt_iterator *);
  
  /* Set to true if we delete dead edges during the optimization.  */
  static bool cfg_changed;
--- 205,210 ----
*************** optimize_memcpy_to_memset (gimple_stmt_i
*** 1226,1232 ****
    gimple *defstmt;
    unsigned limit = param_sccvn_max_alias_queries_per_access;
    do {
!     if (vuse == NULL || TREE_CODE (vuse) != SSA_NAME)
        return false;
      defstmt = SSA_NAME_DEF_STMT (vuse);
      if (is_a <gphi*>(defstmt))
--- 1225,1232 ----
    gimple *defstmt;
    unsigned limit = param_sccvn_max_alias_queries_per_access;
    do {
!     /* If the vuse is the default definition, then there is no stores beforhand. */
!     if (SSA_NAME_IS_DEFAULT_DEF (vuse))
        return false;
      defstmt = SSA_NAME_DEF_STMT (vuse);
      if (is_a <gphi*>(defstmt))
*************** optimize_memcpy_to_memset (gimple_stmt_i
*** 1323,1328 ****
--- 1323,1329 ----
        tree ctor = build_constructor (TREE_TYPE (dest), NULL);
        gimple_assign_set_rhs_from_tree (gsip, ctor);
        update_stmt (stmt);
+       statistics_counter_event (cfun, "copy zeroing propagation of aggregate", 1);
      }
    else /* If stmt is memcpy, transform it into memset.  */
      {
*************** optimize_memcpy_to_memset (gimple_stmt_i
*** 1332,1337 ****
--- 1333,1339 ----
        gimple_call_set_fntype (call, TREE_TYPE (fndecl));
        gimple_call_set_arg (call, 1, val);
        update_stmt (stmt);
+       statistics_counter_event (cfun, "memcpy to memset changed", 1);
      }
  
    if (dump_file && (dump_flags & TDF_DETAILS))
*************** optimize_vector_load (gimple_stmt_iterat
*** 3384,3389 ****
--- 3386,3392 ----
    gimple *stmt = gsi_stmt (*gsi);
    tree lhs = gimple_assign_lhs (stmt);
    tree rhs = gimple_assign_rhs1 (stmt);
+   tree vuse = gimple_vuse (stmt);
  
    /* Gather BIT_FIELD_REFs to rewrite, looking through
       VEC_UNPACK_{LO,HI}_EXPR.  */
*************** optimize_vector_load (gimple_stmt_iterat
*** 3492,3497 ****
--- 3495,3501 ----
  	  gimple *new_stmt = gimple_build_assign (tem, new_rhs);
  	  location_t loc = gimple_location (use_stmt);
  	  gimple_set_location (new_stmt, loc);
+ 	  gimple_set_vuse (new_stmt, vuse);
  	  gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
  	  /* Perform scalar promotion.  */
  	  new_stmt = gimple_build_assign (gimple_assign_lhs (use_stmt),
*************** optimize_vector_load (gimple_stmt_iterat
*** 3511,3516 ****
--- 3515,3521 ----
  						  new_rhs);
  	  location_t loc = gimple_location (use_stmt);
  	  gimple_set_location (new_stmt, loc);
+ 	  gimple_set_vuse (new_stmt, vuse);
  	  gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
  	}
        gimple_stmt_iterator gsi2 = gsi_for_stmt (use_stmt);
*************** const pass_data pass_data_forwprop =
*** 4164,4170 ****
    0, /* properties_provided */
    0, /* properties_destroyed */
    0, /* todo_flags_start */
!   TODO_update_ssa, /* todo_flags_finish */
  };
  
  class pass_forwprop : public gimple_opt_pass
--- 4169,4175 ----
    0, /* properties_provided */
    0, /* properties_destroyed */
    0, /* todo_flags_start */
!   0, /* todo_flags_finish */
  };
  
  class pass_forwprop : public gimple_opt_pass
*************** pass_forwprop::execute (function *fun)
*** 4401,4406 ****
--- 4406,4412 ----
  	         component-wise loads.  */
  	      use_operand_p use_p;
  	      imm_use_iterator iter;
+ 	      tree vuse = gimple_vuse (stmt);
  	      bool rewrite = true;
  	      FOR_EACH_IMM_USE_FAST (use_p, iter, lhs)
  		{
*************** pass_forwprop::execute (function *fun)
*** 4440,4445 ****
--- 4446,4452 ----
  
  		      location_t loc = gimple_location (use_stmt);
  		      gimple_set_location (new_stmt, loc);
+ 		      gimple_set_vuse (new_stmt, vuse);
  		      gimple_stmt_iterator gsi2 = gsi_for_stmt (use_stmt);
  		      unlink_stmt_vdef (use_stmt);
  		      gsi_remove (&gsi2, true);
diff -Nrcpad gcc-16-20250525/gcc/tree-ssa-loop-im.cc gcc-16-20250601/gcc/tree-ssa-loop-im.cc
*** gcc-16-20250525/gcc/tree-ssa-loop-im.cc	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/tree-ssa-loop-im.cc	Sun Jun  1 22:32:33 2025
*************** can_sm_ref_p (class loop *loop, im_mem_r
*** 3307,3313 ****
       explicitly.  */
    base = get_base_address (ref->mem.ref);
    if ((tree_could_trap_p (ref->mem.ref)
!        || (DECL_P (base) && TREE_READONLY (base)))
        /* ???  We can at least use false here, allowing loads?  We
  	 are forcing conditional stores if the ref is not always
  	 stored to later anyway.  So this would only guard
--- 3307,3314 ----
       explicitly.  */
    base = get_base_address (ref->mem.ref);
    if ((tree_could_trap_p (ref->mem.ref)
!        || (DECL_P (base) && TREE_READONLY (base))
!        || TREE_CODE (base) == STRING_CST)
        /* ???  We can at least use false here, allowing loads?  We
  	 are forcing conditional stores if the ref is not always
  	 stored to later anyway.  So this would only guard
diff -Nrcpad gcc-16-20250525/gcc/tree-ssa-math-opts.cc gcc-16-20250601/gcc/tree-ssa-math-opts.cc
*** gcc-16-20250525/gcc/tree-ssa-math-opts.cc	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/tree-ssa-math-opts.cc	Sun Jun  1 22:32:33 2025
*************** build_saturation_binary_arith_call_and_i
*** 4104,4118 ****
   *   _10 = -_9;
   *   _12 = _7 | _10;
   *   =>
!  *   _12 = .SAT_ADD (_4, _6);  */
  
  static void
! match_unsigned_saturation_add (gimple_stmt_iterator *gsi, gassign *stmt)
  {
    tree ops[2];
    tree lhs = gimple_assign_lhs (stmt);
  
!   if (gimple_unsigned_integer_sat_add (lhs, ops, NULL))
      build_saturation_binary_arith_call_and_replace (gsi, IFN_SAT_ADD, lhs,
  						    ops[0], ops[1]);
  }
--- 4104,4137 ----
   *   _10 = -_9;
   *   _12 = _7 | _10;
   *   =>
!  *   _12 = .SAT_ADD (_4, _6);
!  *
!  * Try to match IMM=-1 saturation signed add with assign.
!  * <bb 2> [local count: 1073741824]:
!  * x.0_1 = (unsigned char) x_5(D);
!  * _3 = -x.0_1;
!  * _10 = (signed char) _3;
!  * _8 = x_5(D) & _10;
!  * if (_8 < 0)
!  *   goto <bb 4>; [1.40%]
!  * else
!  *   goto <bb 3>; [98.60%]
!  * <bb 3> [local count: 434070867]:
!  * _2 = x.0_1 + 255;
!  * <bb 4> [local count: 1073741824]:
!  * # _9 = PHI <_2(3), 128(2)>
!  * _4 = (int8_t) _9;
!  *   =>
!  * _4 = .SAT_ADD (x_5, -1); */
  
  static void
! match_saturation_add_with_assign (gimple_stmt_iterator *gsi, gassign *stmt)
  {
    tree ops[2];
    tree lhs = gimple_assign_lhs (stmt);
  
!   if (gimple_unsigned_integer_sat_add (lhs, ops, NULL)
!       || gimple_signed_integer_sat_add (lhs, ops, NULL))
      build_saturation_binary_arith_call_and_replace (gsi, IFN_SAT_ADD, lhs,
  						    ops[0], ops[1]);
  }
*************** math_opts_dom_walker::after_dom_children
*** 6403,6409 ****
  	      break;
  
  	    case PLUS_EXPR:
! 	      match_unsigned_saturation_add (&gsi, as_a<gassign *> (stmt));
  	      match_unsigned_saturation_sub (&gsi, as_a<gassign *> (stmt));
  	      /* fall-through  */
  	    case MINUS_EXPR:
--- 6422,6428 ----
  	      break;
  
  	    case PLUS_EXPR:
! 	      match_saturation_add_with_assign (&gsi, as_a<gassign *> (stmt));
  	      match_unsigned_saturation_sub (&gsi, as_a<gassign *> (stmt));
  	      /* fall-through  */
  	    case MINUS_EXPR:
*************** math_opts_dom_walker::after_dom_children
*** 6429,6435 ****
  	      break;
  
  	    case BIT_IOR_EXPR:
! 	      match_unsigned_saturation_add (&gsi, as_a<gassign *> (stmt));
  	      match_unsigned_saturation_trunc (&gsi, as_a<gassign *> (stmt));
  	      /* fall-through  */
  	    case BIT_XOR_EXPR:
--- 6448,6454 ----
  	      break;
  
  	    case BIT_IOR_EXPR:
! 	      match_saturation_add_with_assign (&gsi, as_a<gassign *> (stmt));
  	      match_unsigned_saturation_trunc (&gsi, as_a<gassign *> (stmt));
  	      /* fall-through  */
  	    case BIT_XOR_EXPR:
*************** math_opts_dom_walker::after_dom_children
*** 6450,6455 ****
--- 6469,6475 ----
  
  	    case NOP_EXPR:
  	      match_unsigned_saturation_trunc (&gsi, as_a<gassign *> (stmt));
+ 	      match_saturation_add_with_assign (&gsi, as_a<gassign *> (stmt));
  	      break;
  
  	    default:;
diff -Nrcpad gcc-16-20250525/gcc/tree-ssa-phiopt.cc gcc-16-20250601/gcc/tree-ssa-phiopt.cc
*** gcc-16-20250525/gcc/tree-ssa-phiopt.cc	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/tree-ssa-phiopt.cc	Sun Jun  1 22:32:33 2025
*************** cond_store_replacement (basic_block midd
*** 3525,3532 ****
  	  /* tree_could_trap_p is a predicate for rvalues, so check
  	     for readonly memory explicitly.  */
  	  || ((base = get_base_address (lhs))
! 	      && DECL_P (base)
! 	      && TREE_READONLY (base)))
  	return false;
      }
  
--- 3525,3533 ----
  	  /* tree_could_trap_p is a predicate for rvalues, so check
  	     for readonly memory explicitly.  */
  	  || ((base = get_base_address (lhs))
! 	      && ((DECL_P (base)
! 		   && TREE_READONLY (base))
! 		  || TREE_CODE (base) == STRING_CST)))
  	return false;
      }
  
diff -Nrcpad gcc-16-20250525/gcc/tree-ssa-phiprop.cc gcc-16-20250601/gcc/tree-ssa-phiprop.cc
*** gcc-16-20250525/gcc/tree-ssa-phiprop.cc	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/tree-ssa-phiprop.cc	Sun Jun  1 22:32:33 2025
*************** struct phiprop_d
*** 99,133 ****
    tree vuse;
  };
  
- /* Verify if the value recorded for NAME in PHIVN is still valid at
-    the start of basic block BB.  */
- 
- static bool
- phivn_valid_p (struct phiprop_d *phivn, tree name, basic_block bb)
- {
-   tree vuse = phivn[SSA_NAME_VERSION (name)].vuse;
-   gimple *use_stmt;
-   imm_use_iterator ui2;
-   bool ok = true;
- 
-   /* The def stmts of the virtual uses need to be dominated by bb.  */
-   gcc_assert (vuse != NULL_TREE);
- 
-   FOR_EACH_IMM_USE_STMT (use_stmt, ui2, vuse)
-     {
-       /* If BB does not dominate a VDEF, the value is invalid.  */
-       if ((gimple_vdef (use_stmt) != NULL_TREE
- 	   || gimple_code (use_stmt) == GIMPLE_PHI)
- 	  && !dominated_by_p (CDI_DOMINATORS, gimple_bb (use_stmt), bb))
- 	{
- 	  ok = false;
- 	  break;
- 	}
-     }
- 
-   return ok;
- }
- 
  /* Insert a new phi node for the dereference of PHI at basic_block
     BB with the virtual operands from USE_STMT.  */
  
--- 99,104 ----
*************** chk_uses (tree, tree *idx, void *data)
*** 275,286 ****
        <Lx>:;
     Returns true if a transformation was done and edge insertions
     need to be committed.  Global data PHIVN and N is used to track
!    past transformation results.  We need to be especially careful here
     with aliasing issues as we are moving memory reads.  */
  
  static bool
! propagate_with_phi (basic_block bb, gphi *phi, struct phiprop_d *phivn,
! 		    size_t n, bitmap dce_ssa_names)
  {
    tree ptr = PHI_RESULT (phi);
    gimple *use_stmt;
--- 246,258 ----
        <Lx>:;
     Returns true if a transformation was done and edge insertions
     need to be committed.  Global data PHIVN and N is used to track
!    past transformation results.  VPHI is the virtual PHI node in BB
!    if there is one.  We need to be especially careful here
     with aliasing issues as we are moving memory reads.  */
  
  static bool
! propagate_with_phi (basic_block bb, gphi *vphi, gphi *phi,
! 		    struct phiprop_d *phivn, size_t n, bitmap dce_ssa_names)
  {
    tree ptr = PHI_RESULT (phi);
    gimple *use_stmt;
*************** propagate_with_phi (basic_block bb, gphi
*** 298,303 ****
--- 270,276 ----
  	  && TYPE_MODE (TREE_TYPE (TREE_TYPE (ptr))) == BLKmode))
      return false;
  
+   tree up_vuse = NULL_TREE;
    /* Check if we can "cheaply" dereference all phi arguments.  */
    FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_USE)
      {
*************** propagate_with_phi (basic_block bb, gphi
*** 315,328 ****
  	    return false;
  	  arg = gimple_assign_rhs1 (def_stmt);
  	}
!       if (TREE_CODE (arg) != ADDR_EXPR
! 	  && !(TREE_CODE (arg) == SSA_NAME
  	       && SSA_NAME_VERSION (arg) < n
  	       && phivn[SSA_NAME_VERSION (arg)].value != NULL_TREE
  	       && (!type
  		   || types_compatible_p
! 		       (type, TREE_TYPE (phivn[SSA_NAME_VERSION (arg)].value)))
! 	       && phivn_valid_p (phivn, arg, bb)))
  	return false;
        if (!type
  	  && TREE_CODE (arg) == SSA_NAME)
--- 288,315 ----
  	    return false;
  	  arg = gimple_assign_rhs1 (def_stmt);
  	}
!       if (TREE_CODE (arg) == ADDR_EXPR)
! 	;
!       /* When we have an SSA name see if we previously encountered a
! 	 dereference of it.  */
!       else if (TREE_CODE (arg) == SSA_NAME
  	       && SSA_NAME_VERSION (arg) < n
  	       && phivn[SSA_NAME_VERSION (arg)].value != NULL_TREE
  	       && (!type
  		   || types_compatible_p
! 		       (type, TREE_TYPE (phivn[SSA_NAME_VERSION (arg)].value))))
! 	{
! 	  /* The dereference should be under the VUSE that's active in BB.
! 	     If the BB has no virtual PHI then record the common "incoming"
! 	     vuse.  */
! 	  if (vphi)
! 	    up_vuse = gimple_phi_arg_def (vphi, phi_arg_index_from_use (arg_p));
! 	  if (!up_vuse)
! 	    up_vuse = phivn[SSA_NAME_VERSION (arg)].vuse;
! 	  else if (up_vuse != phivn[SSA_NAME_VERSION (arg)].vuse)
! 	    return false;
! 	}
!       else
  	return false;
        if (!type
  	  && TREE_CODE (arg) == SSA_NAME)
*************** propagate_with_phi (basic_block bb, gphi
*** 372,388 ****
  	    && !gimple_has_volatile_ops (use_stmt)))
  	continue;
  
!       /* Check if we can move the loads.  The def stmt of the virtual use
! 	 needs to be in a different basic block dominating bb.  When the
  	 def is an edge-inserted one we know it dominates us.  */
        vuse = gimple_vuse (use_stmt);
!       def_stmt = SSA_NAME_DEF_STMT (vuse);
!       if (!SSA_NAME_IS_DEFAULT_DEF (vuse)
! 	  && (gimple_bb (def_stmt) == bb
! 	      || (gimple_bb (def_stmt)
! 		  && !dominated_by_p (CDI_DOMINATORS,
! 				      bb, gimple_bb (def_stmt)))))
! 	goto next;
  
        /* Found a proper dereference with an aggregate copy.  Just
           insert aggregate copies on the edges instead.  */
--- 359,390 ----
  	    && !gimple_has_volatile_ops (use_stmt)))
  	continue;
  
!       /* Check if we can move the loads.  This is when the virtual use
! 	 is the same as the one active at the start of BB which we know
! 	 either from its virtual PHI def or from the common incoming
! 	 VUSE.  If neither is present make sure the def stmt of the virtual
! 	 use is in a different basic block dominating BB.  When the
  	 def is an edge-inserted one we know it dominates us.  */
        vuse = gimple_vuse (use_stmt);
!       if (vphi)
! 	{
! 	  if (vuse != gimple_phi_result (vphi))
! 	    goto next;
! 	}
!       else if (up_vuse)
! 	{
! 	  if (vuse != up_vuse)
! 	    goto next;
! 	}
!       else
! 	{
! 	  def_stmt = SSA_NAME_DEF_STMT (vuse);
! 	  if (!SSA_NAME_IS_DEFAULT_DEF (vuse)
! 	      && (gimple_bb (def_stmt) == bb
! 		  || !dominated_by_p (CDI_DOMINATORS,
! 				      bb, gimple_bb (def_stmt))))
! 	    goto next;
! 	}
  
        /* Found a proper dereference with an aggregate copy.  Just
           insert aggregate copies on the edges instead.  */
*************** pass_phiprop::execute (function *fun)
*** 535,542 ****
           edges avoid blocks with abnormal predecessors.  */
        if (bb_has_abnormal_pred (bb))
  	continue;
        for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
! 	did_something |= propagate_with_phi (bb, gsi.phi (), phivn, n, dce_ssa_names);
      }
  
    if (did_something)
--- 537,546 ----
           edges avoid blocks with abnormal predecessors.  */
        if (bb_has_abnormal_pred (bb))
  	continue;
+       gphi *vphi = get_virtual_phi (bb);
        for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
! 	did_something |= propagate_with_phi (bb, vphi, gsi.phi (),
! 					     phivn, n, dce_ssa_names);
      }
  
    if (did_something)
diff -Nrcpad gcc-16-20250525/gcc/tree-vect-data-refs.cc gcc-16-20250601/gcc/tree-vect-data-refs.cc
*** gcc-16-20250525/gcc/tree-vect-data-refs.cc	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/tree-vect-data-refs.cc	Sun Jun  1 22:32:34 2025
*************** vect_analyze_data_ref_accesses (vec_info
*** 3682,3687 ****
--- 3682,3694 ----
  		      != type_size_a))
  		break;
  
+ 	      /* For datarefs with big gap, it's better to split them into different
+ 		 groups.
+ 		 .i.e a[0], a[1], a[2], .. a[7], a[100], a[101],..., a[107]  */
+ 	      if ((unsigned HOST_WIDE_INT)(init_b - init_prev) * tree_to_uhwi (szb)
+ 		  > MAX_BITSIZE_MODE_ANY_MODE / BITS_PER_UNIT)
+ 		break;
+ 
  	      /* If the step (if not zero or non-constant) is smaller than the
  		 difference between data-refs' inits this splits groups into
  		 suitable sizes.  */
diff -Nrcpad gcc-16-20250525/gcc/tree-vect-loop.cc gcc-16-20250601/gcc/tree-vect-loop.cc
*** gcc-16-20250525/gcc/tree-vect-loop.cc	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/tree-vect-loop.cc	Sun Jun  1 22:32:34 2025
*************** vect_create_epilog_for_reduction (loop_v
*** 6016,6022 ****
        /* Create an induction variable.  */
        gimple_stmt_iterator incr_gsi;
        bool insert_after;
!       vect_iv_increment_position (loop_exit, &incr_gsi, &insert_after);
        create_iv (series_vect, PLUS_EXPR, vec_step, NULL_TREE, loop, &incr_gsi,
  		 insert_after, &indx_before_incr, &indx_after_incr);
  
--- 6016,6023 ----
        /* Create an induction variable.  */
        gimple_stmt_iterator incr_gsi;
        bool insert_after;
!       vect_iv_increment_position (LOOP_VINFO_IV_EXIT (loop_vinfo),
! 				  &incr_gsi, &insert_after);
        create_iv (series_vect, PLUS_EXPR, vec_step, NULL_TREE, loop, &incr_gsi,
  		 insert_after, &indx_before_incr, &indx_after_incr);
  
diff -Nrcpad gcc-16-20250525/gcc/tree-vect-slp.cc gcc-16-20250601/gcc/tree-vect-slp.cc
*** gcc-16-20250525/gcc/tree-vect-slp.cc	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/tree-vect-slp.cc	Sun Jun  1 22:32:34 2025
*************** vect_lower_load_permutations (loop_vec_i
*** 4557,4562 ****
--- 4557,4571 ----
        if (!SLP_TREE_CHILDREN (load).is_empty ())
  	continue;
  
+       /* For single-element interleaving spanning multiple vectors avoid
+ 	 lowering, we want to use VMAT_ELEMENTWISE later.  */
+       if (ld_lanes_lanes == 0
+ 	  && SLP_TREE_LANES (load) == 1
+ 	  && !DR_GROUP_NEXT_ELEMENT (first)
+ 	  && maybe_gt (group_lanes,
+ 		       TYPE_VECTOR_SUBPARTS (SLP_TREE_VECTYPE (load))))
+ 	return;
+ 
        /* We want to pattern-match special cases here and keep those
  	 alone.  Candidates are splats and load-lane.  */
  
diff -Nrcpad gcc-16-20250525/gcc/tree-vect-stmts.cc gcc-16-20250601/gcc/tree-vect-stmts.cc
*** gcc-16-20250525/gcc/tree-vect-stmts.cc	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/tree-vect-stmts.cc	Sun Jun  1 22:32:34 2025
*************** vectorizable_load (vec_info *vinfo,
*** 10689,10696 ****
  	  first_dr_info = dr_info;
  	}
  
!       if (slp && grouped_load
! 	  && memory_access_type == VMAT_STRIDED_SLP)
  	{
  	  group_size = DR_GROUP_SIZE (first_stmt_info);
  	  ref_type = get_group_alias_ptr_type (first_stmt_info);
--- 10689,10695 ----
  	  first_dr_info = dr_info;
  	}
  
!       if (grouped_load && memory_access_type == VMAT_STRIDED_SLP)
  	{
  	  group_size = DR_GROUP_SIZE (first_stmt_info);
  	  ref_type = get_group_alias_ptr_type (first_stmt_info);
*************** vectorizable_load (vec_info *vinfo,
*** 10830,10851 ****
  	  ltype = build_aligned_type (ltype, align * BITS_PER_UNIT);
  	}
  
!       if (slp)
  	{
! 	  /* For SLP permutation support we need to load the whole group,
! 	     not only the number of vector stmts the permutation result
! 	     fits in.  */
! 	  if (slp_perm)
! 	    {
! 	      /* We don't yet generate SLP_TREE_LOAD_PERMUTATIONs for
! 		 variable VF.  */
! 	      unsigned int const_vf = vf.to_constant ();
! 	      ncopies = CEIL (group_size * const_vf, const_nunits);
! 	      dr_chain.create (ncopies);
! 	    }
! 	  else
! 	    ncopies = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
  	}
        unsigned int group_el = 0;
        unsigned HOST_WIDE_INT
  	elsz = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (vectype)));
--- 10829,10848 ----
  	  ltype = build_aligned_type (ltype, align * BITS_PER_UNIT);
  	}
  
!       /* For SLP permutation support we need to load the whole group,
! 	 not only the number of vector stmts the permutation result
! 	 fits in.  */
!       if (slp_perm)
  	{
! 	  /* We don't yet generate SLP_TREE_LOAD_PERMUTATIONs for
! 	     variable VF.  */
! 	  unsigned int const_vf = vf.to_constant ();
! 	  ncopies = CEIL (group_size * const_vf, const_nunits);
! 	  dr_chain.create (ncopies);
  	}
+       else
+ 	ncopies = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
+ 
        unsigned int group_el = 0;
        unsigned HOST_WIDE_INT
  	elsz = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (vectype)));
*************** vectorizable_load (vec_info *vinfo,
*** 10883,10896 ****
  		CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, new_temp);
  
  	      group_el += lnel;
! 	      if (! slp
! 		  || group_el == group_size)
  		{
  		  n_groups++;
  		  /* When doing SLP make sure to not load elements from
  		     the next vector iteration, those will not be accessed
  		     so just use the last element again.  See PR107451.  */
! 		  if (!slp || known_lt (n_groups, vf))
  		    {
  		      tree newoff = copy_ssa_name (running_off);
  		      gimple *incr
--- 10880,10892 ----
  		CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, new_temp);
  
  	      group_el += lnel;
! 	      if (group_el == group_size)
  		{
  		  n_groups++;
  		  /* When doing SLP make sure to not load elements from
  		     the next vector iteration, those will not be accessed
  		     so just use the last element again.  See PR107451.  */
! 		  if (known_lt (n_groups, vf))
  		    {
  		      tree newoff = copy_ssa_name (running_off);
  		      gimple *incr
*************** vectorizable_load (vec_info *vinfo,
*** 10938,10956 ****
  
  	  if (!costing_p)
  	    {
! 	      if (slp)
! 		{
! 		  if (slp_perm)
! 		    dr_chain.quick_push (gimple_assign_lhs (new_stmt));
! 		  else
! 		    slp_node->push_vec_def (new_stmt);
! 		}
  	      else
! 		{
! 		  if (j == 0)
! 		    *vec_stmt = new_stmt;
! 		  STMT_VINFO_VEC_STMTS (stmt_info).safe_push (new_stmt);
! 		}
  	    }
  	}
        if (slp_perm)
--- 10934,10943 ----
  
  	  if (!costing_p)
  	    {
! 	      if (slp_perm)
! 		dr_chain.quick_push (gimple_assign_lhs (new_stmt));
  	      else
! 		slp_node->push_vec_def (new_stmt);
  	    }
  	}
        if (slp_perm)
diff -Nrcpad gcc-16-20250525/gcc/tree-vrp.cc gcc-16-20250601/gcc/tree-vrp.cc
*** gcc-16-20250525/gcc/tree-vrp.cc	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/tree-vrp.cc	Sun Jun  1 22:32:34 2025
*************** const pass_data pass_data_early_vrp =
*** 1297,1303 ****
    0, /* properties_provided */
    0, /* properties_destroyed */
    0, /* todo_flags_start */
!   ( TODO_cleanup_cfg | TODO_update_ssa | TODO_verify_all ),
  };
  
  const pass_data pass_data_fast_vrp =
--- 1297,1303 ----
    0, /* properties_provided */
    0, /* properties_destroyed */
    0, /* todo_flags_start */
!   ( TODO_cleanup_cfg | TODO_update_ssa ),
  };
  
  const pass_data pass_data_fast_vrp =
*************** const pass_data pass_data_fast_vrp =
*** 1310,1316 ****
    0, /* properties_provided */
    0, /* properties_destroyed */
    0, /* todo_flags_start */
!   ( TODO_cleanup_cfg | TODO_update_ssa | TODO_verify_all ),
  };
  
  
--- 1310,1316 ----
    0, /* properties_provided */
    0, /* properties_destroyed */
    0, /* todo_flags_start */
!   ( TODO_cleanup_cfg | TODO_update_ssa ),
  };
  
  
diff -Nrcpad gcc-16-20250525/gcc/tree.cc gcc-16-20250601/gcc/tree.cc
*** gcc-16-20250525/gcc/tree.cc	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/tree.cc	Sun Jun  1 22:32:34 2025
*************** unsigned const char omp_clause_num_ops[]
*** 326,331 ****
--- 326,332 ----
    2, /* OMP_CLAUSE_MAP  */
    1, /* OMP_CLAUSE_HAS_DEVICE_ADDR  */
    1, /* OMP_CLAUSE_DOACROSS  */
+   3, /* OMP_CLAUSE__MAPPER_BINDING_  */
    2, /* OMP_CLAUSE__CACHE_  */
    1, /* OMP_CLAUSE_DESTROY  */
    2, /* OMP_CLAUSE_INIT  */
*************** const char * const omp_clause_code_name[
*** 428,433 ****
--- 429,435 ----
    "map",
    "has_device_addr",
    "doacross",
+   "_mapper_binding_",
    "_cache_",
    "destroy",
    "init",
diff -Nrcpad gcc-16-20250525/gcc/tree.def gcc-16-20250601/gcc/tree.def
*** gcc-16-20250525/gcc/tree.def	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/tree.def	Sun Jun  1 22:32:34 2025
*************** DEFTREECODE (OMP_STRUCTURED_BLOCK, "omp_
*** 1346,1351 ****
--- 1346,1358 ----
     Operand 0: OMP_MASTER_BODY: Master section body.  */
  DEFTREECODE (OMP_MASTER, "omp_master", tcc_statement, 1)
  
+ /* OpenMP - #pragma omp declare mapper ([id:] type var) [clause1 ... clauseN]
+    Operand 0: Identifier.
+    Operand 1: Variable decl.
+    Operand 2: List of clauses.
+    The type of the construct is used for the type to be mapped.  */
+ DEFTREECODE (OMP_DECLARE_MAPPER, "omp_declare_mapper", tcc_statement, 3)
+ 
  /* OpenACC - #pragma acc cache (variable1 ... variableN)
     Operand 0: OACC_CACHE_CLAUSES: List of variables (transformed into
  	OMP_CLAUSE__CACHE_ clauses).  */
diff -Nrcpad gcc-16-20250525/gcc/tree.h gcc-16-20250601/gcc/tree.h
*** gcc-16-20250525/gcc/tree.h	Sun May 25 22:32:14 2025
--- gcc-16-20250601/gcc/tree.h	Sun Jun  1 22:32:34 2025
*************** class auto_suppress_location_wrappers
*** 1625,1630 ****
--- 1625,1637 ----
  #define OMP_METADIRECTIVE_VARIANT_BODY(v) \
    TREE_VALUE (TREE_VALUE (v))
  
+ #define OMP_DECLARE_MAPPER_ID(NODE) \
+   TREE_OPERAND (OMP_DECLARE_MAPPER_CHECK (NODE), 0)
+ #define OMP_DECLARE_MAPPER_DECL(NODE) \
+   TREE_OPERAND (OMP_DECLARE_MAPPER_CHECK (NODE), 1)
+ #define OMP_DECLARE_MAPPER_CLAUSES(NODE) \
+   TREE_OPERAND (OMP_DECLARE_MAPPER_CHECK (NODE), 2)
+ 
  #define OMP_SCAN_BODY(NODE)	TREE_OPERAND (OMP_SCAN_CHECK (NODE), 0)
  #define OMP_SCAN_CLAUSES(NODE)	TREE_OPERAND (OMP_SCAN_CHECK (NODE), 1)
  
*************** class auto_suppress_location_wrappers
*** 2118,2123 ****
--- 2125,2142 ----
  #define OMP_TARGET_DEVICE_MATCHES_PROPERTIES(NODE)	\
    TREE_OPERAND (OMP_TARGET_DEVICE_MATCHES_CHECK (NODE), 1)
  
+ #define OMP_CLAUSE__MAPPER_BINDING__ID(NODE) \
+   OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, \
+ 			OMP_CLAUSE__MAPPER_BINDING_), 0)
+ 
+ #define OMP_CLAUSE__MAPPER_BINDING__DECL(NODE) \
+   OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, \
+ 			OMP_CLAUSE__MAPPER_BINDING_), 1)
+ 
+ #define OMP_CLAUSE__MAPPER_BINDING__MAPPER(NODE) \
+   OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, \
+ 			OMP_CLAUSE__MAPPER_BINDING_), 2)
+ 
  /* SSA_NAME accessors.  */
  
  /* Whether SSA_NAME NODE is a virtual operand.  This simply caches the
*************** storage_order_barrier_p (const_tree t)
*** 5499,5505 ****
        && TYPE_REVERSE_STORAGE_ORDER (TREE_TYPE (op)))
      return true;
  
!   return false;
  }
  
  /* Given a DECL or TYPE, return the scope in which it was declared, or
--- 5518,5524 ----
        && TYPE_REVERSE_STORAGE_ORDER (TREE_TYPE (op)))
      return true;
  
!   return reverse_storage_order_for_component_p (op);
  }
  
  /* Given a DECL or TYPE, return the scope in which it was declared, or
diff -Nrcpad gcc-16-20250525/gcc/xml-printer.h gcc-16-20250601/gcc/xml-printer.h
*** gcc-16-20250525/gcc/xml-printer.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/xml-printer.h	Sun Jun  1 22:32:34 2025
***************
*** 0 ****
--- 1,84 ----
+ /* Classes for creating XML trees by appending.
+    Copyright (C) 2025 Free Software Foundation, Inc.
+    Contributed by David Malcolm <dmalcolm@redhat.com>.
+ 
+ This file is part of GCC.
+ 
+ GCC is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 3, or (at your option) any later
+ version.
+ 
+ GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ for more details.
+ 
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3.  If not see
+ <http://www.gnu.org/licenses/>.  */
+ 
+ #ifndef GCC_XML_PRINTER_H
+ #define GCC_XML_PRINTER_H
+ 
+ namespace xml {
+ 
+ class node;
+   class element;
+ 
+ /* A class for creating XML trees by appending to an insertion
+    point, with a stack of open tags.  */
+ 
+ class printer
+ {
+ public:
+   printer (element &insertion_point);
+ 
+   void push_tag (std::string name,
+ 		 bool preserve_whitespace = false);
+   void push_tag_with_class (std::string name,
+ 			    std::string class_,
+ 			    bool preserve_whitespace = false);
+   void pop_tag ();
+ 
+   void set_attr (const char *name, std::string value);
+ 
+   void add_text (std::string text);
+ 
+   void add_raw (std::string text);
+ 
+   void push_element (std::unique_ptr<element> new_element);
+ 
+   void append (std::unique_ptr<node> new_node);
+ 
+   element *get_insertion_point () const;
+ 
+ private:
+   // borrowed ptrs:
+   std::vector<element *> m_open_tags;
+ };
+ 
+ // RAII for push/pop element on xml::printer
+ 
+ class auto_print_element
+ {
+ public:
+   auto_print_element (printer &printer,
+ 		      std::string name,
+ 		      bool preserve_whitespace = false)
+   : m_printer (printer)
+   {
+     m_printer.push_tag (name, preserve_whitespace);
+   }
+   ~auto_print_element ()
+   {
+     m_printer.pop_tag ();
+   }
+ 
+ private:
+   printer &m_printer;
+ };
+ 
+ } // namespace xml
+ 
+ #endif /* GCC_XML_PRINTER_H.  */
diff -Nrcpad gcc-16-20250525/gcc/xml.h gcc-16-20250601/gcc/xml.h
*** gcc-16-20250525/gcc/xml.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/gcc/xml.h	Sun Jun  1 22:32:34 2025
***************
*** 0 ****
--- 1,113 ----
+ /* Classes for representing XML trees.
+    Copyright (C) 2024-2025 Free Software Foundation, Inc.
+    Contributed by David Malcolm <dmalcolm@redhat.com>.
+ 
+ This file is part of GCC.
+ 
+ GCC is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 3, or (at your option) any later
+ version.
+ 
+ GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ for more details.
+ 
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3.  If not see
+ <http://www.gnu.org/licenses/>.  */
+ 
+ #ifndef GCC_XML_H
+ #define GCC_XML_H
+ 
+ namespace xml {
+ 
+ // Forward decls; indentation reflects inheritance
+ struct node;
+   struct text;
+   struct node_with_children;
+     struct document;
+     struct element;
+ 
+ struct node
+ {
+   virtual ~node () {}
+   virtual void write_as_xml (pretty_printer *pp,
+ 			     int depth, bool indent) const = 0;
+   virtual text *dyn_cast_text ()
+   {
+     return 0;
+   }
+   void dump (FILE *out) const;
+   void DEBUG_FUNCTION dump () const { dump (stderr); }
+ };
+ 
+ struct text : public node
+ {
+   text (std::string str)
+   : m_str (std::move (str))
+   {}
+ 
+   void write_as_xml (pretty_printer *pp,
+ 		     int depth, bool indent) const final override;
+ 
+   text *dyn_cast_text () final override
+   {
+     return this;
+   }
+ 
+   std::string m_str;
+ };
+ 
+ struct node_with_children : public node
+ {
+   void add_child (std::unique_ptr<node> node);
+   void add_text (std::string str);
+ 
+   std::vector<std::unique_ptr<node>> m_children;
+ };
+ 
+ struct document : public node_with_children
+ {
+   void write_as_xml (pretty_printer *pp,
+ 		     int depth, bool indent) const final override;
+ };
+ 
+ struct element : public node_with_children
+ {
+   element (std::string kind, bool preserve_whitespace)
+     : m_kind (std::move (kind)),
+     m_preserve_whitespace (preserve_whitespace)
+   {}
+ 
+   void write_as_xml (pretty_printer *pp,
+ 		     int depth, bool indent) const final override;
+ 
+   void set_attr (const char *name, std::string value);
+ 
+   std::string m_kind;
+   bool m_preserve_whitespace;
+   std::map<std::string, std::string> m_attributes;
+   std::vector<std::string> m_key_insertion_order;
+ };
+ 
+ /* A fragment of raw XML source, to be spliced in directly.
+    Use sparingly.  */
+ 
+ struct raw : public node
+ {
+   raw (std::string xml_src)
+   : m_xml_src (xml_src)
+   {
+   }
+ 
+   void write_as_xml (pretty_printer *pp,
+ 		     int depth, bool indent) const final override;
+ 
+   std::string m_xml_src;
+ };
+ 
+ } // namespace xml
+ 
+ #endif /* GCC_XML_H.  */
diff -Nrcpad gcc-16-20250525/include/ChangeLog gcc-16-20250601/include/ChangeLog
*** gcc-16-20250525/include/ChangeLog	Sun May 25 22:32:14 2025
--- gcc-16-20250601/include/ChangeLog	Sun Jun  1 22:32:34 2025
***************
*** 1,3 ****
--- 1,10 ----
+ 2025-05-30  Julian Brown  <julian@codesourcery.com>
+ 	    Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* gomp-constants.h (gomp_map_kind): Add GOMP_MAP_UNSET,
+ 	GOMP_MAP_PUSH_MAPPER_NAME, GOMP_MAP_POP_MAPPER_NAME artificial mapping
+ 	clause types.
+ 
  2025-05-14  Andreas Schwab  <schwab@suse.de>
  
  	* libiberty.h (mkstemps): Remove duplicate.
diff -Nrcpad gcc-16-20250525/include/gomp-constants.h gcc-16-20250601/include/gomp-constants.h
*** gcc-16-20250525/include/gomp-constants.h	Sun May 25 22:32:14 2025
--- gcc-16-20250601/include/gomp-constants.h	Sun Jun  1 22:32:34 2025
*************** enum gomp_map_kind
*** 209,215 ****
      GOMP_MAP_PRESENT_ALLOC =		(GOMP_MAP_LAST | 4),
      GOMP_MAP_PRESENT_TO =		(GOMP_MAP_LAST | 5),
      GOMP_MAP_PRESENT_FROM =		(GOMP_MAP_LAST | 6),
!     GOMP_MAP_PRESENT_TOFROM =		(GOMP_MAP_LAST | 7)
    };
  
  #define GOMP_MAP_COPY_TO_P(X) \
--- 209,221 ----
      GOMP_MAP_PRESENT_ALLOC =		(GOMP_MAP_LAST | 4),
      GOMP_MAP_PRESENT_TO =		(GOMP_MAP_LAST | 5),
      GOMP_MAP_PRESENT_FROM =		(GOMP_MAP_LAST | 6),
!     GOMP_MAP_PRESENT_TOFROM =		(GOMP_MAP_LAST | 7),
!     /* Unset, used for "declare mapper" maps with no explicit data movement
!        specified.  These use the movement specified at the invocation site.  */
!     GOMP_MAP_UNSET =			(GOMP_MAP_LAST | 8),
!     /* Used to record the name of a named mapper.  */
!     GOMP_MAP_PUSH_MAPPER_NAME =		(GOMP_MAP_LAST | 9),
!     GOMP_MAP_POP_MAPPER_NAME =		(GOMP_MAP_LAST | 10)
    };
  
  #define GOMP_MAP_COPY_TO_P(X) \
diff -Nrcpad gcc-16-20250525/libgcc/ChangeLog gcc-16-20250601/libgcc/ChangeLog
*** gcc-16-20250525/libgcc/ChangeLog	Sun May 25 22:32:14 2025
--- gcc-16-20250601/libgcc/ChangeLog	Sun Jun  1 22:32:34 2025
***************
*** 1,3 ****
--- 1,88 ----
+ 2025-05-27  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	* config/t-softfp (softfp_bid_list): Don't guard with
+ 	$(enable_decimal_float) == bid.
+ 	* soft-fp/bitint.h (__bid_pow10bitint): For
+ 	!defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_pow10bitint.
+ 	(__dpd_d2bbitint, __dpd_b2dbitint): Declare.
+ 	* soft-fp/bitintpow10.c (__dpd_d2bbitint, __dpd_b2dbitint): New
+ 	variables.
+ 	* soft-fp/fixsdbitint.c (__bid_fixsdbitint): For
+ 	!defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_fixsdbitint.
+ 	Add DPD support.  Fix big-endian support.
+ 	* soft-fp/fixddbitint.c (__bid_fixddbitint): For
+ 	!defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_fixddbitint.
+ 	Add DPD support.  Fix big-endian support.
+ 	* soft-fp/fixtdbitint.c (__bid_fixtdbitint): For
+ 	!defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_fixtdbitint.
+ 	Add DPD support.  Fix big-endian support.
+ 	* soft-fp/fixsdti.c (__bid_fixsdbitint): For
+ 	!defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_fixsdbitint.
+ 	(__bid_fixsdti): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to
+ 	__dpd_fixsdti.
+ 	* soft-fp/fixddti.c (__bid_fixddbitint): For
+ 	!defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_fixddbitint.
+ 	(__bid_fixddti): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to
+ 	__dpd_fixddti.
+ 	* soft-fp/fixtdti.c (__bid_fixtdbitint): For
+ 	!defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_fixtdbitint.
+ 	(__bid_fixtdti): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to
+ 	__dpd_fixtdti.
+ 	* soft-fp/fixunssdti.c (__bid_fixsdbitint): For
+ 	!defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_fixsdbitint.
+ 	(__bid_fixunssdti): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine
+ 	to __dpd_fixunssdti.
+ 	* soft-fp/fixunsddti.c (__bid_fixddbitint): For
+ 	!defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_fixddbitint.
+ 	(__bid_fixunsddti): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine
+ 	to __dpd_fixunsddti.
+ 	* soft-fp/fixunstdti.c (__bid_fixtdbitint): For
+ 	!defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_fixtdbitint.
+ 	(__bid_fixunstdti): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine
+ 	to __dpd_fixunstdti.
+ 	* soft-fp/floatbitintsd.c (__bid_floatbitintsd): For
+ 	!defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_floatbitintsd.
+ 	Add DPD support.  Avoid calling __builtin_clzll with 0 argument.  Fix
+ 	big-endian support.
+ 	* soft-fp/floatbitintdd.c (__bid_floatbitintdd): For
+ 	!defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_floatbitintdd.
+ 	Add DPD support.  Avoid calling __builtin_clzll with 0 argument.  Fix
+ 	big-endian support.
+ 	* soft-fp/floatbitinttd.c (__bid_floatbitinttd): For
+ 	!defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_floatbitinttd.
+ 	Add DPD support.  Avoid calling __builtin_clzll with 0 argument.  Fix
+ 	big-endian support.
+ 	* soft-fp/floattisd.c (__bid_floatbitintsd): For
+ 	!defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_floatbitintsd.
+ 	(__bid_floattisd): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to
+ 	__dpd_floattisd.
+ 	* soft-fp/floattidd.c (__bid_floatbitintdd): For
+ 	!defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_floatbitintdd.
+ 	(__bid_floattidd): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to
+ 	__dpd_floattidd.
+ 	* soft-fp/floattitd.c (__bid_floatbitinttd): For
+ 	!defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_floatbitinttd.
+ 	(__bid_floattitd): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to
+ 	__dpd_floattitd.
+ 	* soft-fp/floatuntisd.c (__bid_floatbitintsd): For
+ 	!defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_floatbitintsd.
+ 	(__bid_floatuntisd): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine
+ 	to __dpd_floatuntisd.
+ 	* soft-fp/floatuntidd.c (__bid_floatbitintdd): For
+ 	!defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_floatbitintdd.
+ 	(__bid_floatuntidd): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine
+ 	to __dpd_floatuntidd.
+ 	* soft-fp/floatuntitd.c (__bid_floatbitinttd): For
+ 	!defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_floatbitinttd.
+ 	(__bid_floatuntitd): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine
+ 	to __dpd_floatuntitd.
+ 
+ 2025-05-25  LIU Hao  <lh_mouse@126.com>
+ 
+ 	* config.host: Enable mcf thread model for aarch64-*-mingw*.
+ 	* config/i386/t-mingw-mcfgthread: Move to...
+ 	* config/mingw/t-mingw-mcfgthread: ...here.
+ 
  2025-05-21  Alexandre Oliva  <oliva@adacore.com>
  
  	* config/gthr-vxworks-thread.c: Include string.h for memset.
diff -Nrcpad gcc-16-20250525/libgcc/config/avr/libf7/ChangeLog gcc-16-20250601/libgcc/config/avr/libf7/ChangeLog
*** gcc-16-20250525/libgcc/config/avr/libf7/ChangeLog	Sun May 25 22:32:14 2025
--- gcc-16-20250601/libgcc/config/avr/libf7/ChangeLog	Sun Jun  1 22:32:34 2025
***************
*** 1,3 ****
--- 1,18 ----
+ 2025-05-27  Georg-Johann Lay  <avr@gjlay.de>
+ 
+ 	PR target/120442
+ 	* libf7-common.mk (LIBF_C_PARTS, m_ddd): Add fdim.
+ 	* libf7.h (f7_fdim): New proto.
+ 	* libf7.c (f7_fdim): New function.
+ 	* f7renames.sh (f7_fdim): Add rename.
+ 	* f7-wraps.h: Rebuild
+ 	* f7-renames.h: Rebuild
+ 
+ 2025-05-27  Georg-Johann Lay  <avr@gjlay.de>
+ 
+ 	PR target/120441
+ 	* libf7.c (f7_exp): Limit aa->expo to 10 (not to 9).
+ 
  2025-03-22  Georg-Johann Lay  <avr@gjlay.de>
  
  	* t-libf7 (libgcc-objects): Only add objects when building
diff -Nrcpad gcc-16-20250525/libgcc/config/avr/libf7/f7-renames.h gcc-16-20250601/libgcc/config/avr/libf7/f7-renames.h
*** gcc-16-20250525/libgcc/config/avr/libf7/f7-renames.h	Sun May 25 22:32:14 2025
--- gcc-16-20250601/libgcc/config/avr/libf7/f7-renames.h	Sun Jun  1 22:32:34 2025
***************
*** 97,102 ****
--- 97,103 ----
  #define f7_acos __f7_acos
  #define f7_atan __f7_atan
  #define f7_atan2 __f7_atan2
+ #define f7_fdim __f7_fdim
  #define f7_mul_noround __f7_mul_noround
  #define f7_sqrt16_round __f7_sqrt16_round
  #define f7_sqrt16_floor __f7_sqrt16_floor
diff -Nrcpad gcc-16-20250525/libgcc/config/avr/libf7/f7-wraps.h gcc-16-20250601/libgcc/config/avr/libf7/f7-wraps.h
*** gcc-16-20250525/libgcc/config/avr/libf7/f7-wraps.h	Sun May 25 22:32:14 2025
--- gcc-16-20250601/libgcc/config/avr/libf7/f7-wraps.h	Sun Jun  1 22:32:34 2025
*************** _ENDF __extendsfdf2
*** 239,245 ****
  
  ;; Functions that usually live in libm:  Depending on [long] double layout,
  ;; define <name> and <name>l as weak alias(es) of __<name> for <name> in:
! ;; pow fmin fmax fmod hypot atan2
  
  ;; double __pow (double, double)
  #ifdef F7MOD_D_pow_
--- 239,245 ----
  
  ;; Functions that usually live in libm:  Depending on [long] double layout,
  ;; define <name> and <name>l as weak alias(es) of __<name> for <name> in:
! ;; pow fmin fmax fmod hypot atan2 fdim
  
  ;; double __pow (double, double)
  #ifdef F7MOD_D_pow_
*************** _DEFUN __atan2
*** 313,318 ****
--- 313,330 ----
  _ENDF __atan2
  #endif /* F7MOD_D_atan2_ */
  
+ ;; double __fdim (double, double)
+ #ifdef F7MOD_D_fdim_
+ _DEFUN __fdim
+     DALIAS fdim
+     LALIAS fdiml
+     .global F7_NAME(fdim)
+     ldi     ZH,     hi8(gs(F7_NAME(fdim)))
+     ldi     ZL,     lo8(gs(F7_NAME(fdim)))
+     F7jmp   call_ddd
+ _ENDF __fdim
+ #endif /* F7MOD_D_fdim_ */
+ 
  ;; Functions that usually live in libm:  Depending on [long] double layout,
  ;; define <name> and <name>l as weak alias(es) of __<name> for <name> in:
  ;; ldexp frexp
diff -Nrcpad gcc-16-20250525/libgcc/config/avr/libf7/f7renames.sh gcc-16-20250601/libgcc/config/avr/libf7/f7renames.sh
*** gcc-16-20250525/libgcc/config/avr/libf7/f7renames.sh	Sun May 25 22:32:14 2025
--- gcc-16-20250601/libgcc/config/avr/libf7/f7renames.sh	Sun Jun  1 22:32:34 2025
*************** EOF
*** 35,43 ****
  
      c)
          if [ x${PRE} != xf7_ ]; then
!             echo " "
              echo "/* Renames for libf7.c, libf7.h.  */"
!             echo " "
              for x in $*; do
                  echo "#define f7_$x ${PRE}$x"
              done
--- 35,43 ----
  
      c)
          if [ x${PRE} != xf7_ ]; then
!             echo ""
              echo "/* Renames for libf7.c, libf7.h.  */"
!             echo ""
              for x in $*; do
                  echo "#define f7_$x ${PRE}$x"
              done
*************** EOF
*** 46,54 ****
  
      cst)
          if [ x${PRE} != xf7_ ]; then
!             echo " "
              echo "/* Renames for libf7.c, libf7.h.  */"
!             echo " "
              for x in $*; do
                  echo "#define f7_const_${x}   ${PRE}const_${x}"
                  echo "#define f7_const_${x}_P ${PRE}const_${x}_P"
--- 46,54 ----
  
      cst)
          if [ x${PRE} != xf7_ ]; then
!             echo ""
              echo "/* Renames for libf7.c, libf7.h.  */"
!             echo ""
              for x in $*; do
                  echo "#define f7_const_${x}   ${PRE}const_${x}"
                  echo "#define f7_const_${x}_P ${PRE}const_${x}_P"
*************** EOF
*** 58,66 ****
  
      asm)
          if [ x${PRE} != xf7_ ]; then
!             echo " "
              echo "/* Renames for libf7-asm.sx, f7-wraps.h.  */"
!             echo " "
              for x in $*; do
                  echo "#define f7_${x}_asm ${PRE}${x}_asm"
              done
--- 58,66 ----
  
      asm)
          if [ x${PRE} != xf7_ ]; then
!             echo ""
              echo "/* Renames for libf7-asm.sx, f7-wraps.h.  */"
!             echo ""
              for x in $*; do
                  echo "#define f7_${x}_asm ${PRE}${x}_asm"
              done
diff -Nrcpad gcc-16-20250525/libgcc/config/avr/libf7/libf7-common.mk gcc-16-20250601/libgcc/config/avr/libf7/libf7-common.mk
*** gcc-16-20250525/libgcc/config/avr/libf7/libf7-common.mk	Sun May 25 22:32:14 2025
--- gcc-16-20250601/libgcc/config/avr/libf7/libf7-common.mk	Sun Jun  1 22:32:34 2025
*************** F7_C_PARTS += set_float get_float get_do
*** 8,14 ****
  F7_C_PARTS += fabs neg fmin fmax minmax truncx trunc floor ceil round lround
  F7_C_PARTS += horner logx log log10 log2 exp pow10 pow powi
  F7_C_PARTS += sin cos tan cotan sincos sinh cosh tanh sinhcosh
! F7_C_PARTS += asinacos asin acos atan atan2
  F7_C_PARTS += abscmp_msb_ge cmp cmp_abs cmp_unordered
  
  F7_C_PARTS += const_1 const_1_2 const_1_3
--- 8,14 ----
  F7_C_PARTS += fabs neg fmin fmax minmax truncx trunc floor ceil round lround
  F7_C_PARTS += horner logx log log10 log2 exp pow10 pow powi
  F7_C_PARTS += sin cos tan cotan sincos sinh cosh tanh sinhcosh
! F7_C_PARTS += asinacos asin acos atan atan2 fdim
  F7_C_PARTS += abscmp_msb_ge cmp cmp_abs cmp_unordered
  
  F7_C_PARTS += const_1 const_1_2 const_1_3
*************** g_xdd_cmp += le lt ge gt ne eq unord
*** 34,40 ****
  g_dx += floatunsidf floatsidf extendsfdf2
  g_xd += fixdfsi fixdfdi fixunsdfdi fixunsdfsi truncdfsf2
  
! m_ddd += pow fmin fmax fmod hypot atan2
  m_ddx += ldexp frexp
  m_dd += sqrt cbrt exp exp10 pow10 log log10 log2 sin cos tan cotan asin acos atan
  m_dd += ceil floor trunc round sinh cosh tanh
--- 34,40 ----
  g_dx += floatunsidf floatsidf extendsfdf2
  g_xd += fixdfsi fixdfdi fixunsdfdi fixunsdfsi truncdfsf2
  
! m_ddd += pow fmin fmax fmod hypot atan2 fdim
  m_ddx += ldexp frexp
  m_dd += sqrt cbrt exp exp10 pow10 log log10 log2 sin cos tan cotan asin acos atan
  m_dd += ceil floor trunc round sinh cosh tanh
*************** F7F += lrint ldexp frexp exp logx log lo
*** 59,65 ****
  F7F += minmax fmax fmin floor ceil round lround trunc truncx
  F7F += horner pow10 exp10 pow powi
  F7F += sin cos tan cotan sincos sinh cosh tanh sinhcosh
! F7F += asinacos asin acos atan atan2
  F7F += mul_noround sqrt16_round sqrt16_floor
  F7F += clr_mant_lsbs abscmp_msb_ge lshrdi3 ashldi3
  F7F += assert
--- 59,65 ----
  F7F += minmax fmax fmin floor ceil round lround trunc truncx
  F7F += horner pow10 exp10 pow powi
  F7F += sin cos tan cotan sincos sinh cosh tanh sinhcosh
! F7F += asinacos asin acos atan atan2 fdim
  F7F += mul_noround sqrt16_round sqrt16_floor
  F7F += clr_mant_lsbs abscmp_msb_ge lshrdi3 ashldi3
  F7F += assert
diff -Nrcpad gcc-16-20250525/libgcc/config/avr/libf7/libf7.c gcc-16-20250601/libgcc/config/avr/libf7/libf7.c
*** gcc-16-20250525/libgcc/config/avr/libf7/libf7.c	Sun May 25 22:32:14 2025
--- gcc-16-20250601/libgcc/config/avr/libf7/libf7.c	Sun Jun  1 22:32:34 2025
*************** void f7_sub (f7_t *cc, const f7_t *aa, c
*** 928,933 ****
--- 928,948 ----
  #endif // F7MOD_sub_
  
  
+ #ifdef F7MOD_fdim_
+ F7_WEAK
+ void f7_fdim (f7_t *cc, const f7_t *aa, const f7_t *bb)
+ {
+   int8_t cmp = f7_cmp_unordered (aa, bb, true /*with_sign*/);
+   if (cmp == INT8_MIN)
+     return f7_set_nan (cc);
+   if (cmp < 0)
+     return f7_clr (cc);
+ 
+   f7_sub (cc, aa, bb);
+ }
+ #endif // F7MOD_fdim_
+ 
+ 
  #ifdef F7MOD_addsub_
  static void return_with_sign (f7_t *cc, const f7_t *aa, int8_t c_sign)
  {
*************** void f7_exp (f7_t *cc, const f7_t *aa)
*** 1649,1658 ****
      return f7_set_nan (cc);
  
    /* The maximal exponent of 2 for a double is 1023, hence we may limit
!      to  |A| < 1023 * ln2 ~ 709.  We limit to  1024 ~ 1.99 * 2^9  */
  
    if (f7_class_inf (a_class)
!       || (f7_class_nonzero (a_class) && aa->expo >= 9))
      {
        if (f7_class_sign (a_class))
  	return f7_clr (cc);
--- 1664,1673 ----
      return f7_set_nan (cc);
  
    /* The maximal exponent of 2 for a double is 1023, hence we may limit
!      to  |A| < 1023 * ln2 ~ 709.  We limit to  1024 = 2^10  */
  
    if (f7_class_inf (a_class)
!       || (f7_class_nonzero (a_class) && aa->expo >= 10))
      {
        if (f7_class_sign (a_class))
  	return f7_clr (cc);
diff -Nrcpad gcc-16-20250525/libgcc/config/avr/libf7/libf7.h gcc-16-20250601/libgcc/config/avr/libf7/libf7.h
*** gcc-16-20250525/libgcc/config/avr/libf7/libf7.h	Sun May 25 22:32:14 2025
--- gcc-16-20250601/libgcc/config/avr/libf7/libf7.h	Sun Jun  1 22:32:34 2025
*************** extern void f7_cos (f7_t*, const f7_t*);
*** 612,617 ****
--- 612,618 ----
  extern void f7_tan (f7_t*, const f7_t*);
  extern void f7_atan (f7_t*, const f7_t*);
  extern void f7_atan2 (f7_t*, const f7_t*, const f7_t*);
+ extern void f7_fdim (f7_t*, const f7_t*, const f7_t*);
  extern void f7_asin (f7_t*, const f7_t*);
  extern void f7_acos (f7_t*, const f7_t*);
  extern void f7_tanh (f7_t*, const f7_t*);
diff -Nrcpad gcc-16-20250525/libgcc/config/t-softfp gcc-16-20250601/libgcc/config/t-softfp
*** gcc-16-20250525/libgcc/config/t-softfp	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/config/t-softfp	Sun Jun  1 22:32:34 2025
*************** softfp_floatint_funcs = fix$(m)$(i) fixu
*** 67,79 ****
  softfp_floatbitint_funcs = fix$(m)bitint floatbitint$(m)
  softfp_bid_list := 
  ifeq ($(decimal_float),yes)
- ifeq ($(enable_decimal_float),bid)
  softfp_bid_list += bitintpow10 \
  		   $(foreach m,sd dd td,fix$(m)bitint floatbitint$(m) \
  					fix$(m)ti fixuns$(m)ti \
  					floatti$(m) floatunti$(m))
  endif
- endif
  
  softfp_func_list := \
    $(foreach m,$(softfp_float_modes), \
--- 67,77 ----
diff -Nrcpad gcc-16-20250525/libgcc/soft-fp/bitint.h gcc-16-20250601/libgcc/soft-fp/bitint.h
*** gcc-16-20250525/libgcc/soft-fp/bitint.h	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/soft-fp/bitint.h	Sun Jun  1 22:32:34 2025
***************
*** 1,7 ****
  /* Software floating-point emulation.
     Definitions for _BitInt implementation details.
  
!    Copyright (C) 2023 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
--- 1,7 ----
  /* Software floating-point emulation.
     Definitions for _BitInt implementation details.
  
!    Copyright (C) 2023-2025 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
*************** extern void __divmodbitint4 (UBILtype *,
*** 352,357 ****
--- 352,361 ----
  			     const UBILtype *, SItype,
  			     const UBILtype *, SItype);
  
+ #ifndef ENABLE_DECIMAL_BID_FORMAT
+ #define __bid_pow10bitint __dpd_pow10bitint
+ extern const unsigned short __dpd_d2bbitint[1024], __dpd_b2dbitint[1000];
+ #endif
  extern USItype __bid_pow10bitint (UBILtype *, SItype, USItype);
  
  #endif /* __BITINT_MAXWIDTH__ */
diff -Nrcpad gcc-16-20250525/libgcc/soft-fp/bitintpow10.c gcc-16-20250601/libgcc/soft-fp/bitintpow10.c
*** gcc-16-20250525/libgcc/soft-fp/bitintpow10.c	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/soft-fp/bitintpow10.c	Sun Jun  1 22:32:34 2025
***************
*** 1,7 ****
  /* Software floating-point emulation.
     Compute powers of 10 into _BitInt.
  
!    Copyright (C) 2023 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
--- 1,7 ----
  /* Software floating-point emulation.
     Compute powers of 10 into _BitInt.
  
!    Copyright (C) 2023-2025 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
*************** __bid_pow10bitint (UBILtype *r, SItype r
*** 130,132 ****
--- 130,470 ----
      }
  }
  #endif
+ 
+ #ifndef ENABLE_DECIMAL_BID_FORMAT
+ /* DPD encoded 10-bit number to decimal table.  */
+ const unsigned short __dpd_d2bbitint[1024] = {
+   0, 1, 2, 3, 4, 5, 6, 7,
+   8, 9, 80, 81, 800, 801, 880, 881,
+   10, 11, 12, 13, 14, 15, 16, 17,
+   18, 19, 90, 91, 810, 811, 890, 891,
+   20, 21, 22, 23, 24, 25, 26, 27,
+   28, 29, 82, 83, 820, 821, 808, 809,
+   30, 31, 32, 33, 34, 35, 36, 37,
+   38, 39, 92, 93, 830, 831, 818, 819,
+   40, 41, 42, 43, 44, 45, 46, 47,
+   48, 49, 84, 85, 840, 841, 88, 89,
+   50, 51, 52, 53, 54, 55, 56, 57,
+   58, 59, 94, 95, 850, 851, 98, 99,
+   60, 61, 62, 63, 64, 65, 66, 67,
+   68, 69, 86, 87, 860, 861, 888, 889,
+   70, 71, 72, 73, 74, 75, 76, 77,
+   78, 79, 96, 97, 870, 871, 898, 899,
+   100, 101, 102, 103, 104, 105, 106, 107,
+   108, 109, 180, 181, 900, 901, 980, 981,
+   110, 111, 112, 113, 114, 115, 116, 117,
+   118, 119, 190, 191, 910, 911, 990, 991,
+   120, 121, 122, 123, 124, 125, 126, 127,
+   128, 129, 182, 183, 920, 921, 908, 909,
+   130, 131, 132, 133, 134, 135, 136, 137,
+   138, 139, 192, 193, 930, 931, 918, 919,
+   140, 141, 142, 143, 144, 145, 146, 147,
+   148, 149, 184, 185, 940, 941, 188, 189,
+   150, 151, 152, 153, 154, 155, 156, 157,
+   158, 159, 194, 195, 950, 951, 198, 199,
+   160, 161, 162, 163, 164, 165, 166, 167,
+   168, 169, 186, 187, 960, 961, 988, 989,
+   170, 171, 172, 173, 174, 175, 176, 177,
+   178, 179, 196, 197, 970, 971, 998, 999,
+   200, 201, 202, 203, 204, 205, 206, 207,
+   208, 209, 280, 281, 802, 803, 882, 883,
+   210, 211, 212, 213, 214, 215, 216, 217,
+   218, 219, 290, 291, 812, 813, 892, 893,
+   220, 221, 222, 223, 224, 225, 226, 227,
+   228, 229, 282, 283, 822, 823, 828, 829,
+   230, 231, 232, 233, 234, 235, 236, 237,
+   238, 239, 292, 293, 832, 833, 838, 839,
+   240, 241, 242, 243, 244, 245, 246, 247,
+   248, 249, 284, 285, 842, 843, 288, 289,
+   250, 251, 252, 253, 254, 255, 256, 257,
+   258, 259, 294, 295, 852, 853, 298, 299,
+   260, 261, 262, 263, 264, 265, 266, 267,
+   268, 269, 286, 287, 862, 863, 888, 889,
+   270, 271, 272, 273, 274, 275, 276, 277,
+   278, 279, 296, 297, 872, 873, 898, 899,
+   300, 301, 302, 303, 304, 305, 306, 307,
+   308, 309, 380, 381, 902, 903, 982, 983,
+   310, 311, 312, 313, 314, 315, 316, 317,
+   318, 319, 390, 391, 912, 913, 992, 993,
+   320, 321, 322, 323, 324, 325, 326, 327,
+   328, 329, 382, 383, 922, 923, 928, 929,
+   330, 331, 332, 333, 334, 335, 336, 337,
+   338, 339, 392, 393, 932, 933, 938, 939,
+   340, 341, 342, 343, 344, 345, 346, 347,
+   348, 349, 384, 385, 942, 943, 388, 389,
+   350, 351, 352, 353, 354, 355, 356, 357,
+   358, 359, 394, 395, 952, 953, 398, 399,
+   360, 361, 362, 363, 364, 365, 366, 367,
+   368, 369, 386, 387, 962, 963, 988, 989,
+   370, 371, 372, 373, 374, 375, 376, 377,
+   378, 379, 396, 397, 972, 973, 998, 999,
+   400, 401, 402, 403, 404, 405, 406, 407,
+   408, 409, 480, 481, 804, 805, 884, 885,
+   410, 411, 412, 413, 414, 415, 416, 417,
+   418, 419, 490, 491, 814, 815, 894, 895,
+   420, 421, 422, 423, 424, 425, 426, 427,
+   428, 429, 482, 483, 824, 825, 848, 849,
+   430, 431, 432, 433, 434, 435, 436, 437,
+   438, 439, 492, 493, 834, 835, 858, 859,
+   440, 441, 442, 443, 444, 445, 446, 447,
+   448, 449, 484, 485, 844, 845, 488, 489,
+   450, 451, 452, 453, 454, 455, 456, 457,
+   458, 459, 494, 495, 854, 855, 498, 499,
+   460, 461, 462, 463, 464, 465, 466, 467,
+   468, 469, 486, 487, 864, 865, 888, 889,
+   470, 471, 472, 473, 474, 475, 476, 477,
+   478, 479, 496, 497, 874, 875, 898, 899,
+   500, 501, 502, 503, 504, 505, 506, 507,
+   508, 509, 580, 581, 904, 905, 984, 985,
+   510, 511, 512, 513, 514, 515, 516, 517,
+   518, 519, 590, 591, 914, 915, 994, 995,
+   520, 521, 522, 523, 524, 525, 526, 527,
+   528, 529, 582, 583, 924, 925, 948, 949,
+   530, 531, 532, 533, 534, 535, 536, 537,
+   538, 539, 592, 593, 934, 935, 958, 959,
+   540, 541, 542, 543, 544, 545, 546, 547,
+   548, 549, 584, 585, 944, 945, 588, 589,
+   550, 551, 552, 553, 554, 555, 556, 557,
+   558, 559, 594, 595, 954, 955, 598, 599,
+   560, 561, 562, 563, 564, 565, 566, 567,
+   568, 569, 586, 587, 964, 965, 988, 989,
+   570, 571, 572, 573, 574, 575, 576, 577,
+   578, 579, 596, 597, 974, 975, 998, 999,
+   600, 601, 602, 603, 604, 605, 606, 607,
+   608, 609, 680, 681, 806, 807, 886, 887,
+   610, 611, 612, 613, 614, 615, 616, 617,
+   618, 619, 690, 691, 816, 817, 896, 897,
+   620, 621, 622, 623, 624, 625, 626, 627,
+   628, 629, 682, 683, 826, 827, 868, 869,
+   630, 631, 632, 633, 634, 635, 636, 637,
+   638, 639, 692, 693, 836, 837, 878, 879,
+   640, 641, 642, 643, 644, 645, 646, 647,
+   648, 649, 684, 685, 846, 847, 688, 689,
+   650, 651, 652, 653, 654, 655, 656, 657,
+   658, 659, 694, 695, 856, 857, 698, 699,
+   660, 661, 662, 663, 664, 665, 666, 667,
+   668, 669, 686, 687, 866, 867, 888, 889,
+   670, 671, 672, 673, 674, 675, 676, 677,
+   678, 679, 696, 697, 876, 877, 898, 899,
+   700, 701, 702, 703, 704, 705, 706, 707,
+   708, 709, 780, 781, 906, 907, 986, 987,
+   710, 711, 712, 713, 714, 715, 716, 717,
+   718, 719, 790, 791, 916, 917, 996, 997,
+   720, 721, 722, 723, 724, 725, 726, 727,
+   728, 729, 782, 783, 926, 927, 968, 969,
+   730, 731, 732, 733, 734, 735, 736, 737,
+   738, 739, 792, 793, 936, 937, 978, 979,
+   740, 741, 742, 743, 744, 745, 746, 747,
+   748, 749, 784, 785, 946, 947, 788, 789,
+   750, 751, 752, 753, 754, 755, 756, 757,
+   758, 759, 794, 795, 956, 957, 798, 799,
+   760, 761, 762, 763, 764, 765, 766, 767,
+   768, 769, 786, 787, 966, 967, 988, 989,
+   770, 771, 772, 773, 774, 775, 776, 777,
+   778, 779, 796, 797, 976, 977, 998, 999
+ };
+ 
+ /* Decimal to DPD encoded 10-bit number table.  */
+ const unsigned short __dpd_b2dbitint[1000] = {
+   0x000, 0x001, 0x002, 0x003, 0x004,
+   0x005, 0x006, 0x007, 0x008, 0x009,
+   0x010, 0x011, 0x012, 0x013, 0x014,
+   0x015, 0x016, 0x017, 0x018, 0x019,
+   0x020, 0x021, 0x022, 0x023, 0x024,
+   0x025, 0x026, 0x027, 0x028, 0x029,
+   0x030, 0x031, 0x032, 0x033, 0x034,
+   0x035, 0x036, 0x037, 0x038, 0x039,
+   0x040, 0x041, 0x042, 0x043, 0x044,
+   0x045, 0x046, 0x047, 0x048, 0x049,
+   0x050, 0x051, 0x052, 0x053, 0x054,
+   0x055, 0x056, 0x057, 0x058, 0x059,
+   0x060, 0x061, 0x062, 0x063, 0x064,
+   0x065, 0x066, 0x067, 0x068, 0x069,
+   0x070, 0x071, 0x072, 0x073, 0x074,
+   0x075, 0x076, 0x077, 0x078, 0x079,
+   0x00a, 0x00b, 0x02a, 0x02b, 0x04a,
+   0x04b, 0x06a, 0x06b, 0x04e, 0x04f,
+   0x01a, 0x01b, 0x03a, 0x03b, 0x05a,
+   0x05b, 0x07a, 0x07b, 0x05e, 0x05f,
+   0x080, 0x081, 0x082, 0x083, 0x084,
+   0x085, 0x086, 0x087, 0x088, 0x089,
+   0x090, 0x091, 0x092, 0x093, 0x094,
+   0x095, 0x096, 0x097, 0x098, 0x099,
+   0x0a0, 0x0a1, 0x0a2, 0x0a3, 0x0a4,
+   0x0a5, 0x0a6, 0x0a7, 0x0a8, 0x0a9,
+   0x0b0, 0x0b1, 0x0b2, 0x0b3, 0x0b4,
+   0x0b5, 0x0b6, 0x0b7, 0x0b8, 0x0b9,
+   0x0c0, 0x0c1, 0x0c2, 0x0c3, 0x0c4,
+   0x0c5, 0x0c6, 0x0c7, 0x0c8, 0x0c9,
+   0x0d0, 0x0d1, 0x0d2, 0x0d3, 0x0d4,
+   0x0d5, 0x0d6, 0x0d7, 0x0d8, 0x0d9,
+   0x0e0, 0x0e1, 0x0e2, 0x0e3, 0x0e4,
+   0x0e5, 0x0e6, 0x0e7, 0x0e8, 0x0e9,
+   0x0f0, 0x0f1, 0x0f2, 0x0f3, 0x0f4,
+   0x0f5, 0x0f6, 0x0f7, 0x0f8, 0x0f9,
+   0x08a, 0x08b, 0x0aa, 0x0ab, 0x0ca,
+   0x0cb, 0x0ea, 0x0eb, 0x0ce, 0x0cf,
+   0x09a, 0x09b, 0x0ba, 0x0bb, 0x0da,
+   0x0db, 0x0fa, 0x0fb, 0x0de, 0x0df,
+   0x100, 0x101, 0x102, 0x103, 0x104,
+   0x105, 0x106, 0x107, 0x108, 0x109,
+   0x110, 0x111, 0x112, 0x113, 0x114,
+   0x115, 0x116, 0x117, 0x118, 0x119,
+   0x120, 0x121, 0x122, 0x123, 0x124,
+   0x125, 0x126, 0x127, 0x128, 0x129,
+   0x130, 0x131, 0x132, 0x133, 0x134,
+   0x135, 0x136, 0x137, 0x138, 0x139,
+   0x140, 0x141, 0x142, 0x143, 0x144,
+   0x145, 0x146, 0x147, 0x148, 0x149,
+   0x150, 0x151, 0x152, 0x153, 0x154,
+   0x155, 0x156, 0x157, 0x158, 0x159,
+   0x160, 0x161, 0x162, 0x163, 0x164,
+   0x165, 0x166, 0x167, 0x168, 0x169,
+   0x170, 0x171, 0x172, 0x173, 0x174,
+   0x175, 0x176, 0x177, 0x178, 0x179,
+   0x10a, 0x10b, 0x12a, 0x12b, 0x14a,
+   0x14b, 0x16a, 0x16b, 0x14e, 0x14f,
+   0x11a, 0x11b, 0x13a, 0x13b, 0x15a,
+   0x15b, 0x17a, 0x17b, 0x15e, 0x15f,
+   0x180, 0x181, 0x182, 0x183, 0x184,
+   0x185, 0x186, 0x187, 0x188, 0x189,
+   0x190, 0x191, 0x192, 0x193, 0x194,
+   0x195, 0x196, 0x197, 0x198, 0x199,
+   0x1a0, 0x1a1, 0x1a2, 0x1a3, 0x1a4,
+   0x1a5, 0x1a6, 0x1a7, 0x1a8, 0x1a9,
+   0x1b0, 0x1b1, 0x1b2, 0x1b3, 0x1b4,
+   0x1b5, 0x1b6, 0x1b7, 0x1b8, 0x1b9,
+   0x1c0, 0x1c1, 0x1c2, 0x1c3, 0x1c4,
+   0x1c5, 0x1c6, 0x1c7, 0x1c8, 0x1c9,
+   0x1d0, 0x1d1, 0x1d2, 0x1d3, 0x1d4,
+   0x1d5, 0x1d6, 0x1d7, 0x1d8, 0x1d9,
+   0x1e0, 0x1e1, 0x1e2, 0x1e3, 0x1e4,
+   0x1e5, 0x1e6, 0x1e7, 0x1e8, 0x1e9,
+   0x1f0, 0x1f1, 0x1f2, 0x1f3, 0x1f4,
+   0x1f5, 0x1f6, 0x1f7, 0x1f8, 0x1f9,
+   0x18a, 0x18b, 0x1aa, 0x1ab, 0x1ca,
+   0x1cb, 0x1ea, 0x1eb, 0x1ce, 0x1cf,
+   0x19a, 0x19b, 0x1ba, 0x1bb, 0x1da,
+   0x1db, 0x1fa, 0x1fb, 0x1de, 0x1df,
+   0x200, 0x201, 0x202, 0x203, 0x204,
+   0x205, 0x206, 0x207, 0x208, 0x209,
+   0x210, 0x211, 0x212, 0x213, 0x214,
+   0x215, 0x216, 0x217, 0x218, 0x219,
+   0x220, 0x221, 0x222, 0x223, 0x224,
+   0x225, 0x226, 0x227, 0x228, 0x229,
+   0x230, 0x231, 0x232, 0x233, 0x234,
+   0x235, 0x236, 0x237, 0x238, 0x239,
+   0x240, 0x241, 0x242, 0x243, 0x244,
+   0x245, 0x246, 0x247, 0x248, 0x249,
+   0x250, 0x251, 0x252, 0x253, 0x254,
+   0x255, 0x256, 0x257, 0x258, 0x259,
+   0x260, 0x261, 0x262, 0x263, 0x264,
+   0x265, 0x266, 0x267, 0x268, 0x269,
+   0x270, 0x271, 0x272, 0x273, 0x274,
+   0x275, 0x276, 0x277, 0x278, 0x279,
+   0x20a, 0x20b, 0x22a, 0x22b, 0x24a,
+   0x24b, 0x26a, 0x26b, 0x24e, 0x24f,
+   0x21a, 0x21b, 0x23a, 0x23b, 0x25a,
+   0x25b, 0x27a, 0x27b, 0x25e, 0x25f,
+   0x280, 0x281, 0x282, 0x283, 0x284,
+   0x285, 0x286, 0x287, 0x288, 0x289,
+   0x290, 0x291, 0x292, 0x293, 0x294,
+   0x295, 0x296, 0x297, 0x298, 0x299,
+   0x2a0, 0x2a1, 0x2a2, 0x2a3, 0x2a4,
+   0x2a5, 0x2a6, 0x2a7, 0x2a8, 0x2a9,
+   0x2b0, 0x2b1, 0x2b2, 0x2b3, 0x2b4,
+   0x2b5, 0x2b6, 0x2b7, 0x2b8, 0x2b9,
+   0x2c0, 0x2c1, 0x2c2, 0x2c3, 0x2c4,
+   0x2c5, 0x2c6, 0x2c7, 0x2c8, 0x2c9,
+   0x2d0, 0x2d1, 0x2d2, 0x2d3, 0x2d4,
+   0x2d5, 0x2d6, 0x2d7, 0x2d8, 0x2d9,
+   0x2e0, 0x2e1, 0x2e2, 0x2e3, 0x2e4,
+   0x2e5, 0x2e6, 0x2e7, 0x2e8, 0x2e9,
+   0x2f0, 0x2f1, 0x2f2, 0x2f3, 0x2f4,
+   0x2f5, 0x2f6, 0x2f7, 0x2f8, 0x2f9,
+   0x28a, 0x28b, 0x2aa, 0x2ab, 0x2ca,
+   0x2cb, 0x2ea, 0x2eb, 0x2ce, 0x2cf,
+   0x29a, 0x29b, 0x2ba, 0x2bb, 0x2da,
+   0x2db, 0x2fa, 0x2fb, 0x2de, 0x2df,
+   0x300, 0x301, 0x302, 0x303, 0x304,
+   0x305, 0x306, 0x307, 0x308, 0x309,
+   0x310, 0x311, 0x312, 0x313, 0x314,
+   0x315, 0x316, 0x317, 0x318, 0x319,
+   0x320, 0x321, 0x322, 0x323, 0x324,
+   0x325, 0x326, 0x327, 0x328, 0x329,
+   0x330, 0x331, 0x332, 0x333, 0x334,
+   0x335, 0x336, 0x337, 0x338, 0x339,
+   0x340, 0x341, 0x342, 0x343, 0x344,
+   0x345, 0x346, 0x347, 0x348, 0x349,
+   0x350, 0x351, 0x352, 0x353, 0x354,
+   0x355, 0x356, 0x357, 0x358, 0x359,
+   0x360, 0x361, 0x362, 0x363, 0x364,
+   0x365, 0x366, 0x367, 0x368, 0x369,
+   0x370, 0x371, 0x372, 0x373, 0x374,
+   0x375, 0x376, 0x377, 0x378, 0x379,
+   0x30a, 0x30b, 0x32a, 0x32b, 0x34a,
+   0x34b, 0x36a, 0x36b, 0x34e, 0x34f,
+   0x31a, 0x31b, 0x33a, 0x33b, 0x35a,
+   0x35b, 0x37a, 0x37b, 0x35e, 0x35f,
+   0x380, 0x381, 0x382, 0x383, 0x384,
+   0x385, 0x386, 0x387, 0x388, 0x389,
+   0x390, 0x391, 0x392, 0x393, 0x394,
+   0x395, 0x396, 0x397, 0x398, 0x399,
+   0x3a0, 0x3a1, 0x3a2, 0x3a3, 0x3a4,
+   0x3a5, 0x3a6, 0x3a7, 0x3a8, 0x3a9,
+   0x3b0, 0x3b1, 0x3b2, 0x3b3, 0x3b4,
+   0x3b5, 0x3b6, 0x3b7, 0x3b8, 0x3b9,
+   0x3c0, 0x3c1, 0x3c2, 0x3c3, 0x3c4,
+   0x3c5, 0x3c6, 0x3c7, 0x3c8, 0x3c9,
+   0x3d0, 0x3d1, 0x3d2, 0x3d3, 0x3d4,
+   0x3d5, 0x3d6, 0x3d7, 0x3d8, 0x3d9,
+   0x3e0, 0x3e1, 0x3e2, 0x3e3, 0x3e4,
+   0x3e5, 0x3e6, 0x3e7, 0x3e8, 0x3e9,
+   0x3f0, 0x3f1, 0x3f2, 0x3f3, 0x3f4,
+   0x3f5, 0x3f6, 0x3f7, 0x3f8, 0x3f9,
+   0x38a, 0x38b, 0x3aa, 0x3ab, 0x3ca,
+   0x3cb, 0x3ea, 0x3eb, 0x3ce, 0x3cf,
+   0x39a, 0x39b, 0x3ba, 0x3bb, 0x3da,
+   0x3db, 0x3fa, 0x3fb, 0x3de, 0x3df,
+   0x00c, 0x00d, 0x10c, 0x10d, 0x20c,
+   0x20d, 0x30c, 0x30d, 0x02e, 0x02f,
+   0x01c, 0x01d, 0x11c, 0x11d, 0x21c,
+   0x21d, 0x31c, 0x31d, 0x03e, 0x03f,
+   0x02c, 0x02d, 0x12c, 0x12d, 0x22c,
+   0x22d, 0x32c, 0x32d, 0x12e, 0x12f,
+   0x03c, 0x03d, 0x13c, 0x13d, 0x23c,
+   0x23d, 0x33c, 0x33d, 0x13e, 0x13f,
+   0x04c, 0x04d, 0x14c, 0x14d, 0x24c,
+   0x24d, 0x34c, 0x34d, 0x22e, 0x22f,
+   0x05c, 0x05d, 0x15c, 0x15d, 0x25c,
+   0x25d, 0x35c, 0x35d, 0x23e, 0x23f,
+   0x06c, 0x06d, 0x16c, 0x16d, 0x26c,
+   0x26d, 0x36c, 0x36d, 0x32e, 0x32f,
+   0x07c, 0x07d, 0x17c, 0x17d, 0x27c,
+   0x27d, 0x37c, 0x37d, 0x33e, 0x33f,
+   0x00e, 0x00f, 0x10e, 0x10f, 0x20e,
+   0x20f, 0x30e, 0x30f, 0x06e, 0x06f,
+   0x01e, 0x01f, 0x11e, 0x11f, 0x21e,
+   0x21f, 0x31e, 0x31f, 0x07e, 0x07f,
+   0x08c, 0x08d, 0x18c, 0x18d, 0x28c,
+   0x28d, 0x38c, 0x38d, 0x0ae, 0x0af,
+   0x09c, 0x09d, 0x19c, 0x19d, 0x29c,
+   0x29d, 0x39c, 0x39d, 0x0be, 0x0bf,
+   0x0ac, 0x0ad, 0x1ac, 0x1ad, 0x2ac,
+   0x2ad, 0x3ac, 0x3ad, 0x1ae, 0x1af,
+   0x0bc, 0x0bd, 0x1bc, 0x1bd, 0x2bc,
+   0x2bd, 0x3bc, 0x3bd, 0x1be, 0x1bf,
+   0x0cc, 0x0cd, 0x1cc, 0x1cd, 0x2cc,
+   0x2cd, 0x3cc, 0x3cd, 0x2ae, 0x2af,
+   0x0dc, 0x0dd, 0x1dc, 0x1dd, 0x2dc,
+   0x2dd, 0x3dc, 0x3dd, 0x2be, 0x2bf,
+   0x0ec, 0x0ed, 0x1ec, 0x1ed, 0x2ec,
+   0x2ed, 0x3ec, 0x3ed, 0x3ae, 0x3af,
+   0x0fc, 0x0fd, 0x1fc, 0x1fd, 0x2fc,
+   0x2fd, 0x3fc, 0x3fd, 0x3be, 0x3bf,
+   0x08e, 0x08f, 0x18e, 0x18f, 0x28e,
+   0x28f, 0x38e, 0x38f, 0x0ee, 0x0ef,
+   0x09e, 0x09f, 0x19e, 0x19f, 0x29e,
+   0x29f, 0x39e, 0x39f, 0x0fe, 0x0ff
+ };
+ #endif
diff -Nrcpad gcc-16-20250525/libgcc/soft-fp/fixddbitint.c gcc-16-20250601/libgcc/soft-fp/fixddbitint.c
*** gcc-16-20250525/libgcc/soft-fp/fixddbitint.c	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/soft-fp/fixddbitint.c	Sun Jun  1 22:32:34 2025
***************
*** 1,7 ****
  /* Software floating-point emulation.
     Convert _Decimal64 to signed or unsigned _BitInt.
  
!    Copyright (C) 2023 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
--- 1,7 ----
  /* Software floating-point emulation.
     Convert _Decimal64 to signed or unsigned _BitInt.
  
!    Copyright (C) 2023-2025 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
*************** see the files COPYING3 and COPYING.RUNTI
*** 28,33 ****
--- 28,36 ----
  #include "bitint.h"
  
  #ifdef __BITINT_MAXWIDTH__
+ #ifndef ENABLE_DECIMAL_BID_FORMAT
+ #define __bid_fixddbitint __dpd_fixddbitint
+ #endif
  extern void __bid_fixddbitint (UBILtype *, SItype, _Decimal64);
  
  void
*************** __bid_fixddbitint (UBILtype *r, SItype r
*** 48,53 ****
--- 51,57 ----
    u.d = a;
    t = u.u >> 51;
    sgn = (DItype) u.u < 0;
+ #ifdef ENABLE_DECIMAL_BID_FORMAT
    if ((t & (3 << 10)) != (3 << 10))
      {
        mantissa = u.u & ((((UDItype) 1) << 53) - 1);
*************** __bid_fixddbitint (UBILtype *r, SItype r
*** 61,66 ****
--- 65,95 ----
        if (mantissa > (UDItype) 9999999999999999)
  	mantissa = 0;
      }
+ #else
+   if ((t & (15 << 8)) != (15 << 8))
+     {
+       exponent = (u.u >> 50) & 255;
+       if ((t & (3 << 10)) != (3 << 10))
+ 	{
+ 	  mantissa = ((t >> 7) & 7) * 1000;
+ 	  exponent += (t >> 2) & (3 << 8);
+ 	}
+       else
+ 	{
+ 	  mantissa = ((t >> 7) & 1) ? 9000 : 8000;
+ 	  exponent += t & (3 << 8);
+ 	}
+       mantissa += __dpd_d2bbitint[(u.u >> 40) & 1023];
+       mantissa *= 1000;
+       mantissa += __dpd_d2bbitint[(u.u >> 30) & 1023];
+       mantissa *= 1000;
+       mantissa += __dpd_d2bbitint[(u.u >> 20) & 1023];
+       mantissa *= 1000;
+       mantissa += __dpd_d2bbitint[(u.u >> 10) & 1023];
+       mantissa *= 1000;
+       mantissa += __dpd_d2bbitint[u.u & 1023];
+     }
+ #endif
    else
      {
        FP_SET_EXCEPTION (FP_EX_INVALID
*************** __bid_fixddbitint (UBILtype *r, SItype r
*** 162,168 ****
        if (res_limbs + low_zeros > rn && resv[BITINT_END (0, res_limbs - 1)])
  	goto ovf_ex;
        if ((arprec % BIL_TYPE_SIZE) != 0
! 	  && (resv[BITINT_END (rn - res_limbs, rn - 1) - low_zeros]
  	      & ((UBILtype) -1 << (arprec % BIL_TYPE_SIZE))) != 0)
  	goto ovf_ex;
        min_limbs = rn - low_zeros;
--- 191,197 ----
        if (res_limbs + low_zeros > rn && resv[BITINT_END (0, res_limbs - 1)])
  	goto ovf_ex;
        if ((arprec % BIL_TYPE_SIZE) != 0
! 	  && (resv[BITINT_END (res_limbs + low_zeros - rn, rn - 1 - low_zeros)]
  	      & ((UBILtype) -1 << (arprec % BIL_TYPE_SIZE))) != 0)
  	goto ovf_ex;
        min_limbs = rn - low_zeros;
diff -Nrcpad gcc-16-20250525/libgcc/soft-fp/fixddti.c gcc-16-20250601/libgcc/soft-fp/fixddti.c
*** gcc-16-20250525/libgcc/soft-fp/fixddti.c	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/soft-fp/fixddti.c	Sun Jun  1 22:32:34 2025
***************
*** 1,7 ****
  /* Software floating-point emulation.
     Convert _Decimal64 to 128bit signed integer.
  
!    Copyright (C) 2023 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
--- 1,7 ----
  /* Software floating-point emulation.
     Convert _Decimal64 to 128bit signed integer.
  
!    Copyright (C) 2023-2025 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
*************** see the files COPYING3 and COPYING.RUNTI
*** 28,33 ****
--- 28,37 ----
  #include "bitint.h"
  
  #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__)
+ #ifndef ENABLE_DECIMAL_BID_FORMAT
+ #define __bid_fixddbitint __dpd_fixddbitint
+ #define __bid_fixddti __dpd_fixddti
+ #endif
  extern void __bid_fixddbitint (UBILtype *, SItype, _Decimal64);
  extern TItype __bid_fixddti (_Decimal64);
  
diff -Nrcpad gcc-16-20250525/libgcc/soft-fp/fixsdbitint.c gcc-16-20250601/libgcc/soft-fp/fixsdbitint.c
*** gcc-16-20250525/libgcc/soft-fp/fixsdbitint.c	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/soft-fp/fixsdbitint.c	Sun Jun  1 22:32:34 2025
***************
*** 1,7 ****
  /* Software floating-point emulation.
     Convert _Decimal32 to signed or unsigned _BitInt.
  
!    Copyright (C) 2023 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
--- 1,7 ----
  /* Software floating-point emulation.
     Convert _Decimal32 to signed or unsigned _BitInt.
  
!    Copyright (C) 2023-2025 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
*************** see the files COPYING3 and COPYING.RUNTI
*** 28,33 ****
--- 28,36 ----
  #include "bitint.h"
  
  #ifdef __BITINT_MAXWIDTH__
+ #ifndef ENABLE_DECIMAL_BID_FORMAT
+ #define __bid_fixsdbitint __dpd_fixsdbitint
+ #endif
  extern void __bid_fixsdbitint (UBILtype *, SItype, _Decimal32);
  
  void
*************** __bid_fixsdbitint (UBILtype *r, SItype r
*** 48,53 ****
--- 51,57 ----
    u.d = a;
    t = u.u >> 21;
    sgn = (SItype) u.u < 0;
+ #ifdef ENABLE_DECIMAL_BID_FORMAT
    if ((t & (3 << 8)) != (3 << 8))
      {
        mantissa = u.u & ((((USItype) 1) << 23) - 1);
*************** __bid_fixsdbitint (UBILtype *r, SItype r
*** 61,66 ****
--- 65,89 ----
        if (mantissa > (USItype) 9999999)
  	mantissa = 0;
      }
+ #else
+   if ((t & (15 << 6)) != (15 << 6))
+     {
+       exponent = (u.u >> 20) & 63;
+       if ((t & (3 << 8)) != (3 << 8))
+ 	{
+ 	  mantissa = ((t >> 5) & 7) * 1000;
+ 	  exponent += (t >> 2) & (3 << 6);
+ 	}
+       else
+ 	{
+ 	  mantissa = ((t >> 5) & 1) ? 9000 : 8000;
+ 	  exponent += t & (3 << 6);
+ 	}
+       mantissa += __dpd_d2bbitint[(u.u >> 10) & 1023];
+       mantissa *= 1000;
+       mantissa += __dpd_d2bbitint[u.u & 1023];
+     }
+ #endif
    else
      {
        FP_SET_EXCEPTION (FP_EX_INVALID
*************** __bid_fixsdbitint (UBILtype *r, SItype r
*** 153,159 ****
        if (res_limbs + low_zeros > rn && resv[BITINT_END (0, res_limbs - 1)])
  	goto ovf_ex;
        if ((arprec % BIL_TYPE_SIZE) != 0
! 	  && (resv[BITINT_END (rn - res_limbs, rn - 1) - low_zeros]
  	      & ((UBILtype) -1 << (arprec % BIL_TYPE_SIZE))) != 0)
  	goto ovf_ex;
        min_limbs = rn - low_zeros;
--- 176,182 ----
        if (res_limbs + low_zeros > rn && resv[BITINT_END (0, res_limbs - 1)])
  	goto ovf_ex;
        if ((arprec % BIL_TYPE_SIZE) != 0
! 	  && (resv[BITINT_END (res_limbs + low_zeros - rn, rn - 1 - low_zeros)]
  	      & ((UBILtype) -1 << (arprec % BIL_TYPE_SIZE))) != 0)
  	goto ovf_ex;
        min_limbs = rn - low_zeros;
diff -Nrcpad gcc-16-20250525/libgcc/soft-fp/fixsdti.c gcc-16-20250601/libgcc/soft-fp/fixsdti.c
*** gcc-16-20250525/libgcc/soft-fp/fixsdti.c	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/soft-fp/fixsdti.c	Sun Jun  1 22:32:34 2025
*************** see the files COPYING3 and COPYING.RUNTI
*** 28,33 ****
--- 28,37 ----
  #include "bitint.h"
  
  #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__)
+ #ifndef ENABLE_DECIMAL_BID_FORMAT
+ #define __bid_fixsdbitint __dpd_fixsdbitint
+ #define __bid_fixsdti __dpd_fixsdti
+ #endif
  extern void __bid_fixsdbitint (UBILtype *, SItype, _Decimal32);
  extern TItype __bid_fixsdti (_Decimal32);
  
diff -Nrcpad gcc-16-20250525/libgcc/soft-fp/fixtdbitint.c gcc-16-20250601/libgcc/soft-fp/fixtdbitint.c
*** gcc-16-20250525/libgcc/soft-fp/fixtdbitint.c	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/soft-fp/fixtdbitint.c	Sun Jun  1 22:32:34 2025
***************
*** 1,7 ****
  /* Software floating-point emulation.
     Convert _Decimal128 to signed or unsigned _BitInt.
  
!    Copyright (C) 2023 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
--- 1,7 ----
  /* Software floating-point emulation.
     Convert _Decimal128 to signed or unsigned _BitInt.
  
!    Copyright (C) 2023-2025 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
*************** see the files COPYING3 and COPYING.RUNTI
*** 28,33 ****
--- 28,36 ----
  #include "bitint.h"
  
  #ifdef __BITINT_MAXWIDTH__
+ #ifndef ENABLE_DECIMAL_BID_FORMAT
+ #define __bid_fixtdbitint __dpd_fixtdbitint
+ #endif
  extern void __bid_fixtdbitint (UBILtype *, SItype, _Decimal128);
  
  void
*************** __bid_fixtdbitint (UBILtype *r, SItype r
*** 50,55 ****
--- 53,59 ----
    mantissalo = u.u[__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__];
    t = mantissahi >> 47;
    sgn = (DItype) mantissahi < 0;
+ #ifdef ENABLE_DECIMAL_BID_FORMAT
    if ((t & (3 << 14)) != (3 << 14))
      {
        mantissahi &= ((((UDItype) 1) << 49) - 1);
*************** __bid_fixtdbitint (UBILtype *r, SItype r
*** 68,73 ****
--- 72,123 ----
        mantissalo = 0;
        exponent = t & 0x3fff;
      }
+ #else
+   if ((t & (15 << 12)) != (15 << 12))
+     {
+       exponent = (mantissahi >> 46) & 4095;
+       if ((t & (3 << 14)) != (3 << 14))
+ 	{
+ 	  exponent += (t >> 2) & (3 << 12);
+ 	  t = ((t >> 11) & 7) * 1000;
+ 	}
+       else
+ 	{
+ 	  exponent += t & (3 << 12);
+ 	  t = ((t >> 11) & 1) ? 9000 : 8000;
+ 	}
+       t += __dpd_d2bbitint[(mantissahi >> (100 - 64)) & 1023];
+       t *= 1000;
+       t += __dpd_d2bbitint[(mantissahi >> (90 - 64)) & 1023];
+       t *= 1000;
+       t += __dpd_d2bbitint[(mantissahi >> (80 - 64)) & 1023];
+       t *= 1000;
+       t += __dpd_d2bbitint[(mantissahi >> (70 - 64)) & 1023];
+       t *= 1000;
+       t += __dpd_d2bbitint[((mantissahi & 63) << 4)
+ 			   + ((mantissalo >> 60) & 15)];
+       t *= 1000;
+       t += __dpd_d2bbitint[mantissalo >> 50 & 1023];
+ #ifdef __SIZEOF_INT128__
+       unsigned __int128 m = t;
+ #else
+       unsigned _BitInt(128) m = t;
+ #endif
+       m *= 1000000000000000ULL;
+       t = __dpd_d2bbitint[(mantissalo >> 40) & 1023];
+       t *= 1000;
+       t += __dpd_d2bbitint[(mantissalo >> 30) & 1023];
+       t *= 1000;
+       t += __dpd_d2bbitint[(mantissalo >> 20) & 1023];
+       t *= 1000;
+       t += __dpd_d2bbitint[(mantissalo >> 10) & 1023];
+       t *= 1000;
+       t += __dpd_d2bbitint[mantissalo & 1023];
+       m += t;
+       mantissahi = m >> 64;
+       mantissalo = m;
+     }
+ #endif
    else
      {
        FP_SET_EXCEPTION (FP_EX_INVALID
*************** __bid_fixtdbitint (UBILtype *r, SItype r
*** 199,205 ****
        if (res_limbs + low_zeros > rn && resv[BITINT_END (0, res_limbs - 1)])
  	goto ovf_ex;
        if ((arprec % BIL_TYPE_SIZE) != 0
! 	  && (resv[BITINT_END (rn - res_limbs, rn - 1) - low_zeros]
  	      & ((UBILtype) -1 << (arprec % BIL_TYPE_SIZE))) != 0)
  	goto ovf_ex;
        min_limbs = rn - low_zeros;
--- 249,255 ----
        if (res_limbs + low_zeros > rn && resv[BITINT_END (0, res_limbs - 1)])
  	goto ovf_ex;
        if ((arprec % BIL_TYPE_SIZE) != 0
! 	  && (resv[BITINT_END (res_limbs + low_zeros - rn, rn - 1 - low_zeros)]
  	      & ((UBILtype) -1 << (arprec % BIL_TYPE_SIZE))) != 0)
  	goto ovf_ex;
        min_limbs = rn - low_zeros;
diff -Nrcpad gcc-16-20250525/libgcc/soft-fp/fixtdti.c gcc-16-20250601/libgcc/soft-fp/fixtdti.c
*** gcc-16-20250525/libgcc/soft-fp/fixtdti.c	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/soft-fp/fixtdti.c	Sun Jun  1 22:32:34 2025
***************
*** 1,7 ****
  /* Software floating-point emulation.
     Convert _Decimal128 to 128bit signed integer.
  
!    Copyright (C) 2023 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
--- 1,7 ----
  /* Software floating-point emulation.
     Convert _Decimal128 to 128bit signed integer.
  
!    Copyright (C) 2023-2025 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
*************** see the files COPYING3 and COPYING.RUNTI
*** 28,33 ****
--- 28,37 ----
  #include "bitint.h"
  
  #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__)
+ #ifndef ENABLE_DECIMAL_BID_FORMAT
+ #define __bid_fixtdbitint __dpd_fixtdbitint
+ #define __bid_fixtdti __dpd_fixtdti
+ #endif
  extern void __bid_fixtdbitint (UBILtype *, SItype, _Decimal128);
  extern TItype __bid_fixtdti (_Decimal128);
  
diff -Nrcpad gcc-16-20250525/libgcc/soft-fp/fixunsddti.c gcc-16-20250601/libgcc/soft-fp/fixunsddti.c
*** gcc-16-20250525/libgcc/soft-fp/fixunsddti.c	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/soft-fp/fixunsddti.c	Sun Jun  1 22:32:34 2025
***************
*** 1,7 ****
  /* Software floating-point emulation.
     Convert _Decimal64 to 128bit unsigned integer.
  
!    Copyright (C) 2023 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
--- 1,7 ----
  /* Software floating-point emulation.
     Convert _Decimal64 to 128bit unsigned integer.
  
!    Copyright (C) 2023-2025 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
*************** see the files COPYING3 and COPYING.RUNTI
*** 28,33 ****
--- 28,37 ----
  #include "bitint.h"
  
  #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__)
+ #ifndef ENABLE_DECIMAL_BID_FORMAT
+ #define __bid_fixddbitint __dpd_fixddbitint
+ #define __bid_fixunsddti __dpd_fixunsddti
+ #endif
  extern void __bid_fixddbitint (UBILtype *, SItype, _Decimal64);
  extern UTItype __bid_fixunsddti (_Decimal64);
  
diff -Nrcpad gcc-16-20250525/libgcc/soft-fp/fixunssdti.c gcc-16-20250601/libgcc/soft-fp/fixunssdti.c
*** gcc-16-20250525/libgcc/soft-fp/fixunssdti.c	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/soft-fp/fixunssdti.c	Sun Jun  1 22:32:34 2025
***************
*** 1,7 ****
  /* Software floating-point emulation.
     Convert _Decimal32 to 128bit unsigned integer.
  
!    Copyright (C) 2023 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
--- 1,7 ----
  /* Software floating-point emulation.
     Convert _Decimal32 to 128bit unsigned integer.
  
!    Copyright (C) 2023-2025 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
*************** see the files COPYING3 and COPYING.RUNTI
*** 28,33 ****
--- 28,37 ----
  #include "bitint.h"
  
  #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__)
+ #ifndef ENABLE_DECIMAL_BID_FORMAT
+ #define __bid_fixsdbitint __dpd_fixsdbitint
+ #define __bid_fixunssdti __dpd_fixunssdti
+ #endif
  extern void __bid_fixsdbitint (UBILtype *, SItype, _Decimal32);
  extern UTItype __bid_fixunssdti (_Decimal32);
  
diff -Nrcpad gcc-16-20250525/libgcc/soft-fp/fixunstdti.c gcc-16-20250601/libgcc/soft-fp/fixunstdti.c
*** gcc-16-20250525/libgcc/soft-fp/fixunstdti.c	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/soft-fp/fixunstdti.c	Sun Jun  1 22:32:34 2025
***************
*** 1,7 ****
  /* Software floating-point emulation.
     Convert _Decimal128 to 128bit unsigned integer.
  
!    Copyright (C) 2023 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
--- 1,7 ----
  /* Software floating-point emulation.
     Convert _Decimal128 to 128bit unsigned integer.
  
!    Copyright (C) 2023-2025 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
*************** see the files COPYING3 and COPYING.RUNTI
*** 28,33 ****
--- 28,37 ----
  #include "bitint.h"
  
  #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__)
+ #ifndef ENABLE_DECIMAL_BID_FORMAT
+ #define __bid_fixtdbitint __dpd_fixtdbitint
+ #define __bid_fixunstdti __dpd_fixunstdti
+ #endif
  extern void __bid_fixtdbitint (UBILtype *, SItype, _Decimal128);
  extern UTItype __bid_fixunstdti (_Decimal128);
  
diff -Nrcpad gcc-16-20250525/libgcc/soft-fp/floatbitintdd.c gcc-16-20250601/libgcc/soft-fp/floatbitintdd.c
*** gcc-16-20250525/libgcc/soft-fp/floatbitintdd.c	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/soft-fp/floatbitintdd.c	Sun Jun  1 22:32:34 2025
***************
*** 1,7 ****
  /* Software floating-point emulation.
     Convert a _BitInt to _Decimal64.
  
!    Copyright (C) 2023 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
--- 1,7 ----
  /* Software floating-point emulation.
     Convert a _BitInt to _Decimal64.
  
!    Copyright (C) 2023-2025 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
*************** see the files COPYING3 and COPYING.RUNTI
*** 28,33 ****
--- 28,36 ----
  #include "bitint.h"
  
  #ifdef __BITINT_MAXWIDTH__
+ #ifndef ENABLE_DECIMAL_BID_FORMAT
+ #define __bid_floatbitintdd __dpd_floatbitintdd
+ #endif
  extern _Decimal64 __bid_floatbitintdd (const UBILtype *, SItype);
  
  _Decimal64
*************** __bid_floatbitintdd (const UBILtype *i,
*** 51,57 ****
      }
    if (iprec < 0)
      {
!       SItype n = sizeof (0ULL) * __CHAR_BIT__ + 1 - __builtin_clzll (~msb);
        aiprec = (in - 1) * BIL_TYPE_SIZE + n;
      }
    else if (msb == 0)
--- 54,64 ----
      }
    if (iprec < 0)
      {
!       SItype n;
!       if (msb == ~(UBILtype) 0)
! 	n = 1;
!       else
! 	n = sizeof (0ULL) * __CHAR_BIT__ + 1 - __builtin_clzll (~msb);
        aiprec = (in - 1) * BIL_TYPE_SIZE + n;
      }
    else if (msb == 0)
*************** __bid_floatbitintdd (const UBILtype *i,
*** 118,124 ****
  	}
        else
  	{
! 	  __builtin_memcpy (buf + BITINT_END (q_limbs - in + 1, 0), i,
  			    (in - 1) * sizeof (UBILtype));
  	  buf[BITINT_END (q_limbs - in, in - 1)] = msb;
  	  if (iprec < 0)
--- 125,132 ----
  	}
        else
  	{
! 	  __builtin_memcpy (buf + BITINT_END (q_limbs - in + 1, 0),
! 			    i + BITINT_END (1, 0),
  			    (in - 1) * sizeof (UBILtype));
  	  buf[BITINT_END (q_limbs - in, in - 1)] = msb;
  	  if (iprec < 0)
*************** __bid_floatbitintdd (const UBILtype *i,
*** 239,244 ****
--- 247,253 ----
      }
  
    exponent += 398;
+ #ifdef ENABLE_DECIMAL_BID_FORMAT
    if (mantissa >= (UDItype) 0x20000000000000)
      u.u = (((((iprec < 0) << 2) | (UDItype) 3) << 61)
  	   | (((UDItype) exponent) << 51)
*************** __bid_floatbitintdd (const UBILtype *i,
*** 247,256 ****
--- 256,295 ----
      u.u = ((((UDItype) (iprec < 0)) << 63)
  	   | (((UDItype) exponent) << 53)
  	   | mantissa);
+ #else
+   u.u = mantissa;
+   mantissa = __dpd_b2dbitint[u.u % 1000];
+   u.u /= 1000;
+   mantissa |= ((UDItype) __dpd_b2dbitint[u.u % 1000]) << 10;
+   u.u /= 1000;
+   mantissa |= ((UDItype) __dpd_b2dbitint[u.u % 1000]) << 20;
+   u.u /= 1000;
+   mantissa |= ((UDItype) __dpd_b2dbitint[u.u % 1000]) << 30;
+   u.u /= 1000;
+   mantissa |= ((UDItype) __dpd_b2dbitint[u.u % 1000]) << 40;
+   u.u /= 1000;
+   if (u.u >= 8)
+     u.u = (((((iprec < 0) << 2) | (UDItype) 3) << 61)
+ 	   | (((UDItype) exponent & (3 << 8)) << 51)
+ 	   | ((u.u & 1) << 58)
+ 	   | (((UDItype) exponent & 255) << 50)
+ 	   | mantissa);
+   else
+     u.u = ((((UDItype) (iprec < 0)) << 63)
+ 	   | (((UDItype) exponent & (3 << 8)) << 53)
+ 	   | (u.u << 58)
+ 	   | (((UDItype) exponent & 255) << 50)
+ 	   | mantissa);
+ #endif
    if (inexact)
      {
        ui.u = ((((UDItype) (iprec < 0)) << 63)
+ #ifdef ENABLE_DECIMAL_BID_FORMAT
  	      | (((UDItype) (exponent - 1)) << 53)
+ #else
+ 	      | (((UDItype) (exponent - 1) & (3 << 8)) << 53)
+ 	      | (((UDItype) (exponent - 1) & 255) << 50)
+ #endif
  	      | (inexact + 3));
        __asm ("" : "+g" (u.d));
        __asm ("" : "+g" (ui.d));
diff -Nrcpad gcc-16-20250525/libgcc/soft-fp/floatbitintsd.c gcc-16-20250601/libgcc/soft-fp/floatbitintsd.c
*** gcc-16-20250525/libgcc/soft-fp/floatbitintsd.c	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/soft-fp/floatbitintsd.c	Sun Jun  1 22:32:34 2025
***************
*** 1,7 ****
  /* Software floating-point emulation.
     Convert a _BitInt to _Decimal32.
  
!    Copyright (C) 2023 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
--- 1,7 ----
  /* Software floating-point emulation.
     Convert a _BitInt to _Decimal32.
  
!    Copyright (C) 2023-2025 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
*************** see the files COPYING3 and COPYING.RUNTI
*** 28,33 ****
--- 28,36 ----
  #include "bitint.h"
  
  #ifdef __BITINT_MAXWIDTH__
+ #ifndef ENABLE_DECIMAL_BID_FORMAT
+ #define __bid_floatbitintsd __dpd_floatbitintsd
+ #endif
  extern _Decimal32 __bid_floatbitintsd (const UBILtype *, SItype);
  
  _Decimal32
*************** __bid_floatbitintsd (const UBILtype *i,
*** 51,57 ****
      }
    if (iprec < 0)
      {
!       SItype n = sizeof (0ULL) * __CHAR_BIT__ + 1 - __builtin_clzll (~msb);
        aiprec = (in - 1) * BIL_TYPE_SIZE + n;
      }
    else if (msb == 0)
--- 54,64 ----
      }
    if (iprec < 0)
      {
!       SItype n;
!       if (msb == ~(UBILtype) 0)
! 	n = 1;
!       else
! 	n = sizeof (0ULL) * __CHAR_BIT__ + 1 - __builtin_clzll (~msb);
        aiprec = (in - 1) * BIL_TYPE_SIZE + n;
      }
    else if (msb == 0)
*************** __bid_floatbitintsd (const UBILtype *i,
*** 117,123 ****
  	}
        else
  	{
! 	  __builtin_memcpy (buf + BITINT_END (q_limbs - in + 1, 0), i,
  			    (in - 1) * sizeof (UBILtype));
  	  buf[BITINT_END (q_limbs - in, in - 1)] = msb;
  	  if (iprec < 0)
--- 124,131 ----
  	}
        else
  	{
! 	  __builtin_memcpy (buf + BITINT_END (q_limbs - in + 1, 0),
! 			    i + BITINT_END (1, 0),
  			    (in - 1) * sizeof (UBILtype));
  	  buf[BITINT_END (q_limbs - in, in - 1)] = msb;
  	  if (iprec < 0)
*************** __bid_floatbitintsd (const UBILtype *i,
*** 210,215 ****
--- 218,224 ----
      }
  
    exponent += 101;
+ #ifdef ENABLE_DECIMAL_BID_FORMAT
    if (mantissa >= (USItype) 0x800000)
      u.u = (((((iprec < 0) << 2) | (USItype) 3) << 29)
  	   | (((USItype) exponent) << 21)
*************** __bid_floatbitintsd (const UBILtype *i,
*** 218,227 ****
--- 227,260 ----
      u.u = ((((USItype) (iprec < 0)) << 31)
  	   | (((USItype) exponent) << 23)
  	   | mantissa);
+ #else
+   u.u = mantissa;
+   mantissa = __dpd_b2dbitint[u.u % 1000];
+   u.u /= 1000;
+   mantissa |= ((USItype) __dpd_b2dbitint[u.u % 1000]) << 10;
+   u.u /= 1000;
+   if (u.u >= 8)
+     u.u = (((((iprec < 0) << 2) | (USItype) 3) << 29)
+ 	   | (((USItype) exponent & (3 << 6)) << 21)
+ 	   | ((u.u & 1) << 26)
+ 	   | (((USItype) exponent & 63) << 20)
+ 	   | mantissa);
+   else
+     u.u = ((((USItype) (iprec < 0)) << 31)
+ 	   | (((USItype) exponent & (3 << 6)) << 23)
+ 	   | (u.u << 26)
+ 	   | (((USItype) exponent & 63) << 20)
+ 	   | mantissa);
+ #endif
    if (inexact)
      {
        ui.u = ((((USItype) (iprec < 0)) << 31)
+ #ifdef ENABLE_DECIMAL_BID_FORMAT
  	      | (((USItype) (exponent - 1)) << 23)
+ #else
+ 	      | (((USItype) (exponent - 1) & (3 << 6)) << 23)
+ 	      | (((USItype) (exponent - 1) & 63) << 20)
+ #endif
  	      | (inexact + 3));
        __asm ("" : "+g" (u.d));
        __asm ("" : "+g" (ui.d));
diff -Nrcpad gcc-16-20250525/libgcc/soft-fp/floatbitinttd.c gcc-16-20250601/libgcc/soft-fp/floatbitinttd.c
*** gcc-16-20250525/libgcc/soft-fp/floatbitinttd.c	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/soft-fp/floatbitinttd.c	Sun Jun  1 22:32:34 2025
***************
*** 1,7 ****
  /* Software floating-point emulation.
     Convert a _BitInt to _Decimal128.
  
!    Copyright (C) 2023 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
--- 1,7 ----
  /* Software floating-point emulation.
     Convert a _BitInt to _Decimal128.
  
!    Copyright (C) 2023-2025 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
*************** see the files COPYING3 and COPYING.RUNTI
*** 28,33 ****
--- 28,36 ----
  #include "bitint.h"
  
  #ifdef __BITINT_MAXWIDTH__
+ #ifndef ENABLE_DECIMAL_BID_FORMAT
+ #define __bid_floatbitinttd __dpd_floatbitinttd
+ #endif
  extern _Decimal128 __bid_floatbitinttd (const UBILtype *, SItype);
  
  _Decimal128
*************** __bid_floatbitinttd (const UBILtype *i,
*** 51,57 ****
      }
    if (iprec < 0)
      {
!       SItype n = sizeof (0ULL) * __CHAR_BIT__ + 1 - __builtin_clzll (~msb);
        aiprec = (in - 1) * BIL_TYPE_SIZE + n;
      }
    else if (msb == 0)
--- 54,64 ----
      }
    if (iprec < 0)
      {
!       SItype n;
!       if (msb == ~(UBILtype) 0)
! 	n = 1;
!       else
! 	n = sizeof (0ULL) * __CHAR_BIT__ + 1 - __builtin_clzll (~msb);
        aiprec = (in - 1) * BIL_TYPE_SIZE + n;
      }
    else if (msb == 0)
*************** __bid_floatbitinttd (const UBILtype *i,
*** 117,123 ****
  	}
        else
  	{
! 	  __builtin_memcpy (buf + BITINT_END (q_limbs - in + 1, 0), i,
  			    (in - 1) * sizeof (UBILtype));
  	  buf[BITINT_END (q_limbs - in, in - 1)] = msb;
  	  if (iprec < 0)
--- 124,131 ----
  	}
        else
  	{
! 	  __builtin_memcpy (buf + BITINT_END (q_limbs - in + 1, 0),
! 			    i + BITINT_END (1, 0),
  			    (in - 1) * sizeof (UBILtype));
  	  buf[BITINT_END (q_limbs - in, in - 1)] = msb;
  	  if (iprec < 0)
*************** __bid_floatbitinttd (const UBILtype *i,
*** 253,267 ****
--- 261,329 ----
      }
  
    exponent += 6176;
+ #ifdef ENABLE_DECIMAL_BID_FORMAT
    u.u[__FLOAT_WORD_ORDER__ != __ORDER_BIG_ENDIAN__]
      = ((((UDItype) (iprec < 0)) << 63)
         | (((UDItype) exponent) << 49)
         | mantissahi);
+ #else
+ #ifdef __SIZEOF_INT128__
+   unsigned __int128 m = mantissahi;
+ #else
+   unsigned _BitInt(128) m = mantissahi;
+ #endif
+   m = (m << 64) | mantissalo;
+   u.u[0] = m / 1000000000000000ULL;
+   u.u[1] = m % 1000000000000000ULL;
+   mantissalo = __dpd_b2dbitint[u.u[1] % 1000];
+   u.u[1] /= 1000;
+   mantissalo |= ((UDItype) __dpd_b2dbitint[u.u[1] % 1000]) << 10;
+   u.u[1] /= 1000;
+   mantissalo |= ((UDItype) __dpd_b2dbitint[u.u[1] % 1000]) << 20;
+   u.u[1] /= 1000;
+   mantissalo |= ((UDItype) __dpd_b2dbitint[u.u[1] % 1000]) << 30;
+   u.u[1] /= 1000;
+   mantissalo |= ((UDItype) __dpd_b2dbitint[u.u[1] % 1000]) << 40;
+   mantissalo |= ((UDItype) __dpd_b2dbitint[u.u[0] % 1000]) << 50;
+   u.u[0] /= 1000;
+   mantissahi = __dpd_b2dbitint[u.u[0] % 1000];
+   u.u[0] /= 1000;
+   mantissalo |= mantissahi << 60;
+   mantissahi >>= 4;
+   mantissahi |= ((UDItype) __dpd_b2dbitint[u.u[0] % 1000]) << 6;
+   u.u[0] /= 1000;
+   mantissahi |= ((UDItype) __dpd_b2dbitint[u.u[0] % 1000]) << 16;
+   u.u[0] /= 1000;
+   mantissahi |= ((UDItype) __dpd_b2dbitint[u.u[0] % 1000]) << 26;
+   u.u[0] /= 1000;
+   mantissahi |= ((UDItype) __dpd_b2dbitint[u.u[0] % 1000]) << 36;
+   u.u[0] /= 1000;
+   if (u.u[0] >= 8)
+     u.u[__FLOAT_WORD_ORDER__ != __ORDER_BIG_ENDIAN__]
+       = (((((iprec < 0) << 2) | (UDItype) 3) << 61)
+ 	 | (((UDItype) exponent & (3 << 12)) << 47)
+ 	 | ((u.u[0] & 1) << 58)
+ 	 | (((UDItype) exponent & 4095) << 46)
+ 	 | mantissahi);
+   else
+     u.u[__FLOAT_WORD_ORDER__ != __ORDER_BIG_ENDIAN__]
+       = ((((UDItype) (iprec < 0)) << 63)
+ 	 | (((UDItype) exponent & (3 << 12)) << 49)
+ 	 | (u.u[0] << 58)
+ 	 | (((UDItype) exponent & 4095) << 46)
+ 	 | mantissahi);
+ #endif
    u.u[__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__] = mantissalo;
    if (inexact)
      {
        ui.u[__FLOAT_WORD_ORDER__ != __ORDER_BIG_ENDIAN__]
+ #ifdef ENABLE_DECIMAL_BID_FORMAT
  	= (((UDItype) (iprec < 0)) << 63) | (((UDItype) exponent - 1) << 49);
+ #else
+ 	= ((((UDItype) (iprec < 0)) << 63)
+ 	   | ((((UDItype) exponent - 1) & (3 << 12)) << 49)
+ 	   | ((((UDItype) exponent - 1) & 4095) << 46));
+ #endif
        ui.u[__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__] = inexact + 3;
        __asm ("" : "+g" (u.d));
        __asm ("" : "+g" (ui.d));
diff -Nrcpad gcc-16-20250525/libgcc/soft-fp/floattidd.c gcc-16-20250601/libgcc/soft-fp/floattidd.c
*** gcc-16-20250525/libgcc/soft-fp/floattidd.c	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/soft-fp/floattidd.c	Sun Jun  1 22:32:34 2025
***************
*** 1,7 ****
  /* Software floating-point emulation.
     Convert a 128bit signed integer to _Decimal64.
  
!    Copyright (C) 2023 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
--- 1,7 ----
  /* Software floating-point emulation.
     Convert a 128bit signed integer to _Decimal64.
  
!    Copyright (C) 2023-2025 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
*************** see the files COPYING3 and COPYING.RUNTI
*** 28,33 ****
--- 28,37 ----
  #include "bitint.h"
  
  #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__)
+ #ifndef ENABLE_DECIMAL_BID_FORMAT
+ #define __bid_floatbitintdd __dpd_floatbitintdd
+ #define __bid_floattidd __dpd_floattidd
+ #endif
  extern _Decimal64 __bid_floatbitintdd (const UBILtype *, SItype);
  extern _Decimal64 __bid_floattidd (TItype);
  
diff -Nrcpad gcc-16-20250525/libgcc/soft-fp/floattisd.c gcc-16-20250601/libgcc/soft-fp/floattisd.c
*** gcc-16-20250525/libgcc/soft-fp/floattisd.c	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/soft-fp/floattisd.c	Sun Jun  1 22:32:34 2025
***************
*** 1,7 ****
  /* Software floating-point emulation.
     Convert a 128bit signed integer to _Decimal32.
  
!    Copyright (C) 2023 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
--- 1,7 ----
  /* Software floating-point emulation.
     Convert a 128bit signed integer to _Decimal32.
  
!    Copyright (C) 2023-2025 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
*************** see the files COPYING3 and COPYING.RUNTI
*** 28,33 ****
--- 28,37 ----
  #include "bitint.h"
  
  #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__)
+ #ifndef ENABLE_DECIMAL_BID_FORMAT
+ #define __bid_floatbitintsd __dpd_floatbitintsd
+ #define __bid_floattisd __dpd_floattisd
+ #endif
  extern _Decimal32 __bid_floatbitintsd (const UBILtype *, SItype);
  extern _Decimal32 __bid_floattisd (TItype);
  
diff -Nrcpad gcc-16-20250525/libgcc/soft-fp/floattitd.c gcc-16-20250601/libgcc/soft-fp/floattitd.c
*** gcc-16-20250525/libgcc/soft-fp/floattitd.c	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/soft-fp/floattitd.c	Sun Jun  1 22:32:34 2025
***************
*** 1,7 ****
  /* Software floating-point emulation.
     Convert a 128bit signed integer to _Decimal128.
  
!    Copyright (C) 2023 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
--- 1,7 ----
  /* Software floating-point emulation.
     Convert a 128bit signed integer to _Decimal128.
  
!    Copyright (C) 2023-2025 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
*************** see the files COPYING3 and COPYING.RUNTI
*** 28,33 ****
--- 28,37 ----
  #include "bitint.h"
  
  #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__)
+ #ifndef ENABLE_DECIMAL_BID_FORMAT
+ #define __bid_floatbitinttd __dpd_floatbitinttd
+ #define __bid_floattitd __dpd_floattitd
+ #endif
  extern _Decimal128 __bid_floatbitinttd (const UBILtype *, SItype);
  extern _Decimal128 __bid_floattitd (TItype);
  
diff -Nrcpad gcc-16-20250525/libgcc/soft-fp/floatuntidd.c gcc-16-20250601/libgcc/soft-fp/floatuntidd.c
*** gcc-16-20250525/libgcc/soft-fp/floatuntidd.c	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/soft-fp/floatuntidd.c	Sun Jun  1 22:32:34 2025
***************
*** 1,7 ****
  /* Software floating-point emulation.
     Convert a 128bit unsigned integer to _Decimal64.
  
!    Copyright (C) 2023 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
--- 1,7 ----
  /* Software floating-point emulation.
     Convert a 128bit unsigned integer to _Decimal64.
  
!    Copyright (C) 2023-2025 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
*************** see the files COPYING3 and COPYING.RUNTI
*** 28,33 ****
--- 28,37 ----
  #include "bitint.h"
  
  #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__)
+ #ifndef ENABLE_DECIMAL_BID_FORMAT
+ #define __bid_floatbitintdd __dpd_floatbitintdd
+ #define __bid_floatunstidd __dpd_floatunstidd
+ #endif
  extern _Decimal64 __bid_floatbitintdd (const UBILtype *, SItype);
  extern _Decimal64 __bid_floatunstidd (UTItype);
  
diff -Nrcpad gcc-16-20250525/libgcc/soft-fp/floatuntisd.c gcc-16-20250601/libgcc/soft-fp/floatuntisd.c
*** gcc-16-20250525/libgcc/soft-fp/floatuntisd.c	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/soft-fp/floatuntisd.c	Sun Jun  1 22:32:34 2025
***************
*** 1,7 ****
  /* Software floating-point emulation.
     Convert a 128bit unsigned integer to _Decimal32.
  
!    Copyright (C) 2023 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
--- 1,7 ----
  /* Software floating-point emulation.
     Convert a 128bit unsigned integer to _Decimal32.
  
!    Copyright (C) 2023-2025 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
*************** see the files COPYING3 and COPYING.RUNTI
*** 28,33 ****
--- 28,37 ----
  #include "bitint.h"
  
  #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__)
+ #ifndef ENABLE_DECIMAL_BID_FORMAT
+ #define __bid_floatbitintsd __dpd_floatbitintsd
+ #define __bid_floatunstisd __dpd_floatunstisd
+ #endif
  extern _Decimal32 __bid_floatbitintsd (const UBILtype *, SItype);
  extern _Decimal32 __bid_floatunstisd (UTItype);
  
diff -Nrcpad gcc-16-20250525/libgcc/soft-fp/floatuntitd.c gcc-16-20250601/libgcc/soft-fp/floatuntitd.c
*** gcc-16-20250525/libgcc/soft-fp/floatuntitd.c	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcc/soft-fp/floatuntitd.c	Sun Jun  1 22:32:34 2025
***************
*** 1,7 ****
  /* Software floating-point emulation.
     Convert a 128bit unsigned integer to _Decimal128.
  
!    Copyright (C) 2023 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
--- 1,7 ----
  /* Software floating-point emulation.
     Convert a 128bit unsigned integer to _Decimal128.
  
!    Copyright (C) 2023-2025 Free Software Foundation, Inc.
  
  This file is part of GCC.
  
*************** see the files COPYING3 and COPYING.RUNTI
*** 28,33 ****
--- 28,37 ----
  #include "bitint.h"
  
  #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__)
+ #ifndef ENABLE_DECIMAL_BID_FORMAT
+ #define __bid_floatbitinttd __dpd_floatbitinttd
+ #define __bid_floatunstitd __dpd_floatunstitd
+ #endif
  extern _Decimal128 __bid_floatbitinttd (const UBILtype *, SItype);
  extern _Decimal128 __bid_floatunstitd (UTItype);
  
diff -Nrcpad gcc-16-20250525/libgcobol/libgcobol.cc gcc-16-20250601/libgcobol/libgcobol.cc
*** gcc-16-20250525/libgcobol/libgcobol.cc	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgcobol/libgcobol.cc	Sun Jun  1 22:32:34 2025
***************
*** 49,54 ****
--- 49,55 ----
  #include <signal.h>
  #include <syslog.h>
  #include <unistd.h>
+ #include <stdarg.h>
  #if __has_include(<errno.h>)
  # include <errno.h> // for program_invocation_short_name
  #endif
*************** __gg__set_env_value(cblc_field_t   *valu
*** 13151,13153 ****
--- 13152,13167 ----
    // And now, anticlimactically, set the variable:
    setenv(trimmed_env, trimmed_val, 1);
    }
+ 
+ extern "C"
+ void
+ __gg__fprintf_stderr(const char *format_string, ...)
+   {
+   /*  This routine allows the compiler to send stuff to stderr in a way
+       that is straightforward to use..  */
+   va_list ap;
+   va_start(ap, format_string);
+   vfprintf(stderr, format_string, ap);
+   va_end(ap);
+   }
+ 
diff -Nrcpad gcc-16-20250525/libgomp/ChangeLog gcc-16-20250601/libgomp/ChangeLog
*** gcc-16-20250525/libgomp/ChangeLog	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgomp/ChangeLog	Sun Jun  1 22:32:36 2025
***************
*** 1,3 ****
--- 1,168 ----
+ 2025-05-30  Thomas Schwinge  <tschwinge@baylibre.com>
+ 
+ 	* testsuite/libgomp.c++/target-std__valarray-1.C: New.
+ 	* testsuite/libgomp.c++/target-std__valarray-1.output: Likewise.
+ 
+ 2025-05-30  Thomas Schwinge  <tschwinge@baylibre.com>
+ 
+ 	* testsuite/libgomp.c++/target-std__array-concurrent-usm.C: New.
+ 	* testsuite/libgomp.c++/target-std__array-concurrent.C: Adjust.
+ 	* testsuite/libgomp.c++/target-std__bitset-concurrent-usm.C: New.
+ 	* testsuite/libgomp.c++/target-std__bitset-concurrent.C: Adjust.
+ 	* testsuite/libgomp.c++/target-std__deque-concurrent-usm.C: New.
+ 	* testsuite/libgomp.c++/target-std__deque-concurrent.C: Adjust.
+ 	* testsuite/libgomp.c++/target-std__forward_list-concurrent-usm.C: New.
+ 	* testsuite/libgomp.c++/target-std__forward_list-concurrent.C: Adjust.
+ 	* testsuite/libgomp.c++/target-std__list-concurrent-usm.C: New.
+ 	* testsuite/libgomp.c++/target-std__list-concurrent.C: Adjust.
+ 	* testsuite/libgomp.c++/target-std__map-concurrent-usm.C: New.
+ 	* testsuite/libgomp.c++/target-std__map-concurrent.C: Adjust.
+ 	* testsuite/libgomp.c++/target-std__multimap-concurrent-usm.C: New.
+ 	* testsuite/libgomp.c++/target-std__multimap-concurrent.C: Adjust.
+ 	* testsuite/libgomp.c++/target-std__multiset-concurrent-usm.C: New.
+ 	* testsuite/libgomp.c++/target-std__multiset-concurrent.C: Adjust.
+ 	* testsuite/libgomp.c++/target-std__set-concurrent-usm.C: New.
+ 	* testsuite/libgomp.c++/target-std__set-concurrent.C: Adjust.
+ 	* testsuite/libgomp.c++/target-std__span-concurrent-usm.C: New.
+ 	* testsuite/libgomp.c++/target-std__span-concurrent.C: Adjust.
+ 	* testsuite/libgomp.c++/target-std__valarray-concurrent-usm.C: New.
+ 	* testsuite/libgomp.c++/target-std__valarray-concurrent.C: Adjust.
+ 	* testsuite/libgomp.c++/target-std__vector-concurrent-usm.C: New.
+ 	* testsuite/libgomp.c++/target-std__vector-concurrent.C: Adjust.
+ 
+ 2025-05-30  Kwok Cheung Yeung  <kcyeung@baylibre.com>
+ 	    Thomas Schwinge  <tschwinge@baylibre.com>
+ 
+ 	* testsuite/libgomp.c++/target-std__array-concurrent.C: New.
+ 	* testsuite/libgomp.c++/target-std__bitset-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__deque-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__flat_map-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__flat_set-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__forward_list-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__list-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__map-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__multimap-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__multiset-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__set-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__span-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__unordered_map-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__unordered_multimap-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__unordered_multiset-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__unordered_set-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__valarray-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__vector-concurrent.C: Likewise.
+ 
+ 2025-05-30  Kwok Cheung Yeung  <kcyeung@baylibre.com>
+ 
+ 	* testsuite/libgomp.c++/target-std__cmath.C: New.
+ 	* testsuite/libgomp.c++/target-std__complex.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__numbers.C: Likewise.
+ 
+ 2025-05-30  Waffl3x  <waffl3x@baylibre.com>
+ 	    Thomas Schwinge  <tschwinge@baylibre.com>
+ 
+ 	* testsuite/libgomp.c++/target-flex-10.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-100.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-101.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-11.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-12.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-2000.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-2001.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-2002.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-2003.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-30.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-300.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-31.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-32.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-33.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-41.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-60.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-61.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-62.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-70.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-80.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-81.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-90.C: New test.
+ 	* testsuite/libgomp.c++/target-flex-common.h: New test.
+ 
+ 2025-05-30  Thomas Schwinge  <tschwinge@baylibre.com>
+ 	    Richard Biener  <rguenther@suse.de>
+ 
+ 	PR middle-end/119835
+ 	* testsuite/libgomp.oacc-c-c++-common/abi-struct-1.c:
+ 	'#pragma GCC optimize "-fno-inline"'.
+ 	* testsuite/libgomp.c-c++-common/target-abi-struct-1.c: New.
+ 	* testsuite/libgomp.c-c++-common/target-abi-struct-1-O0.c: Adjust.
+ 
+ 2025-05-30  Julian Brown  <julian@codesourcery.com>
+ 
+ 	* testsuite/libgomp.c-c++-common/declare-mapper-9.c: Enable for C.
+ 	* testsuite/libgomp.c-c++-common/declare-mapper-10.c: Likewise.
+ 	* testsuite/libgomp.c-c++-common/declare-mapper-11.c: Likewise.
+ 	* testsuite/libgomp.c-c++-common/declare-mapper-12.c: Likewise.
+ 	* testsuite/libgomp.c-c++-common/declare-mapper-13.c: Likewise.
+ 	* testsuite/libgomp.c-c++-common/declare-mapper-14.c: Likewise.
+ 
+ 2025-05-30  Julian Brown  <julian@codesourcery.com>
+ 	    Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* testsuite/libgomp.c++/declare-mapper-1.C: New test.
+ 	* testsuite/libgomp.c++/declare-mapper-2.C: New test.
+ 	* testsuite/libgomp.c++/declare-mapper-3.C: New test.
+ 	* testsuite/libgomp.c++/declare-mapper-4.C: New test.
+ 	* testsuite/libgomp.c++/declare-mapper-5.C: New test.
+ 	* testsuite/libgomp.c++/declare-mapper-6.C: New test.
+ 	* testsuite/libgomp.c++/declare-mapper-7.C: New test.
+ 	* testsuite/libgomp.c++/declare-mapper-8.C: New test.
+ 	* testsuite/libgomp.c-c++-common/declare-mapper-9.c: New test (only
+ 	enabled for C++ for now).
+ 	* testsuite/libgomp.c-c++-common/declare-mapper-10.c: Likewise.
+ 	* testsuite/libgomp.c-c++-common/declare-mapper-11.c: Likewise.
+ 	* testsuite/libgomp.c-c++-common/declare-mapper-12.c: Likewise.
+ 	* testsuite/libgomp.c-c++-common/declare-mapper-13.c: Likewise.
+ 	* testsuite/libgomp.c-c++-common/declare-mapper-14.c: Likewise.
+ 
+ 2025-05-29  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	PR libgomp/93226
+ 	* libgomp-plugin.h (GOMP_OFFLOAD_openacc_async_dev2dev): New
+ 	prototype.
+ 	* libgomp.h (struct acc_dispatch_t): Add dev2dev_func.
+ 	(gomp_copy_dev2dev): New prototype.
+ 	* libgomp.map (OACC_2.6.1): New; add acc_memcpy_device{,_async}.
+ 	* libgomp.texi (acc_memcpy_device): New.
+ 	* oacc-mem.c (memcpy_tofrom_device): Change to take from/to
+ 	device boolean; use memcpy not memmove; add early return if
+ 	size == 0 or same device + same ptr.
+ 	(acc_memcpy_to_device, acc_memcpy_to_device_async,
+ 	acc_memcpy_from_device, acc_memcpy_from_device_async): Update.
+ 	(acc_memcpy_device, acc_memcpy_device_async): New.
+ 	* openacc.f90 (acc_memcpy_device, acc_memcpy_device_async):
+ 	Add interface.
+ 	* openacc_lib.h (acc_memcpy_device, acc_memcpy_device_async):
+ 	Likewise.
+ 	* openacc.h (acc_memcpy_device, acc_memcpy_device_async): Add
+ 	prototype.
+ 	* plugin/plugin-gcn.c (GOMP_OFFLOAD_openacc_async_host2dev):
+ 	Update comment.
+ 	(GOMP_OFFLOAD_openacc_async_dev2host): Update call.
+ 	(GOMP_OFFLOAD_openacc_async_dev2dev): New.
+ 	* plugin/plugin-nvptx.c (cuda_memcpy_dev_sanity_check): New.
+ 	(GOMP_OFFLOAD_dev2dev): Call it.
+ 	(GOMP_OFFLOAD_openacc_async_dev2dev): New.
+ 	* target.c (gomp_copy_dev2dev): New.
+ 	(gomp_load_plugin_for_device): Load dev2dev and async_dev2dev.
+ 	* testsuite/libgomp.oacc-c-c++-common/acc_memcpy_device-1.c: New test.
+ 	* testsuite/libgomp.oacc-fortran/acc_memcpy_device-1.f90: New test.
+ 
+ 2025-05-28  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	PR middle-end/118694
+ 	* testsuite/libgomp.fortran/metadirective-1.f90: xfail when
+ 	compiling (also) for nvptx offloading as an error is then expected.
+ 
  2025-05-23  Tobias Burnus  <tburnus@baylibre.com>
  
  	PR middle-end/118694
diff -Nrcpad gcc-16-20250525/libgomp/libgomp-plugin.h gcc-16-20250601/libgomp/libgomp-plugin.h
*** gcc-16-20250525/libgomp/libgomp-plugin.h	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgomp/libgomp-plugin.h	Sun Jun  1 22:32:36 2025
*************** extern bool GOMP_OFFLOAD_openacc_async_d
*** 200,205 ****
--- 200,207 ----
  						 struct goacc_asyncqueue *);
  extern bool GOMP_OFFLOAD_openacc_async_host2dev (int, void *, const void *, size_t,
  						 struct goacc_asyncqueue *);
+ extern bool GOMP_OFFLOAD_openacc_async_dev2dev (int, void *, const void *, size_t,
+ 						struct goacc_asyncqueue *);
  extern void *GOMP_OFFLOAD_openacc_cuda_get_current_device (void);
  extern void *GOMP_OFFLOAD_openacc_cuda_get_current_context (void);
  extern void *GOMP_OFFLOAD_openacc_cuda_get_stream (struct goacc_asyncqueue *);
diff -Nrcpad gcc-16-20250525/libgomp/libgomp.h gcc-16-20250601/libgomp/libgomp.h
*** gcc-16-20250525/libgomp/libgomp.h	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgomp/libgomp.h	Sun Jun  1 22:32:36 2025
*************** typedef struct acc_dispatch_t
*** 1360,1365 ****
--- 1360,1366 ----
      __typeof (GOMP_OFFLOAD_openacc_async_exec) *exec_func;
      __typeof (GOMP_OFFLOAD_openacc_async_dev2host) *dev2host_func;
      __typeof (GOMP_OFFLOAD_openacc_async_host2dev) *host2dev_func;
+     __typeof (GOMP_OFFLOAD_openacc_async_dev2dev) *dev2dev_func;
    } async;
  
    __typeof (GOMP_OFFLOAD_openacc_get_property) *get_property_func;
*************** extern void gomp_copy_host2dev (struct g
*** 1467,1472 ****
--- 1468,1476 ----
  extern void gomp_copy_dev2host (struct gomp_device_descr *,
  				struct goacc_asyncqueue *, void *, const void *,
  				size_t);
+ extern void gomp_copy_dev2dev (struct gomp_device_descr *,
+ 			       struct goacc_asyncqueue *, void *, const void *,
+ 			       size_t);
  extern uintptr_t gomp_map_val (struct target_mem_desc *, void **, size_t);
  extern bool gomp_attach_pointer (struct gomp_device_descr *,
  				 struct goacc_asyncqueue *, splay_tree,
diff -Nrcpad gcc-16-20250525/libgomp/libgomp.map gcc-16-20250601/libgomp/libgomp.map
*** gcc-16-20250525/libgomp/libgomp.map	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgomp/libgomp.map	Sun Jun  1 22:32:36 2025
*************** OACC_2.6 {
*** 609,614 ****
--- 609,620 ----
  	acc_get_property_string_h_;
  } OACC_2.5.1;
  
+ OACC_2.6.1 {
+   global:
+ 	acc_memcpy_device;
+ 	acc_memcpy_device_async;
+ } OACC_2.6;
+ 
  GOACC_2.0 {
    global:
  	GOACC_data_end;
diff -Nrcpad gcc-16-20250525/libgomp/libgomp.texi gcc-16-20250601/libgomp/libgomp.texi
*** gcc-16-20250525/libgomp/libgomp.texi	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgomp/libgomp.texi	Sun Jun  1 22:32:36 2025
*************** acceleration device.
*** 4763,4768 ****
--- 4763,4769 ----
                                  present on device.
  * acc_memcpy_to_device::        Copy host memory to device memory.
  * acc_memcpy_from_device::      Copy device memory to host memory.
+ * acc_memcpy_device::           Copy memory within a device.
  * acc_attach::                  Let device pointer point to device-pointer target.
  * acc_detach::                  Let device pointer point to host-pointer target.
  
*************** This function copies device memory speci
*** 5836,5841 ****
--- 5837,5880 ----
  @end table
  
  
+ 
+ @node acc_memcpy_device
+ @section @code{acc_memcpy_device} -- Copy memory within a device.
+ @table @asis
+ @item @emph{Description}
+ This function copies device memory from one memory location to another
+ on the current device.  It copies @var{bytes} bytes of data from the device
+ address, specified by @var{data_dev_src}, to the device address
+ @var{data_dev_dest}.  The @code{_async} version performs the transfer
+ asnychronously using the queue associated with @var{async_arg}.
+ 
+ @item @emph{C/C++}:
+ @multitable @columnfractions .20 .80
+ @item @emph{Prototype}: @tab @code{void acc_memcpy_device(d_void* data_dev_dest,}
+ @item                   @tab @code{d_void* data_dev_src, size_t bytes);}
+ @item @emph{Prototype}: @tab @code{void acc_memcpy_device_async(d_void* data_dev_dest,}
+ @item                   @tab @code{d_void* data_dev_src, size_t bytes, int async_arg);}
+ @end multitable
+ 
+ @item @emph{Fortran}:
+ @multitable @columnfractions .20 .80
+ @item @emph{Interface}: @tab @code{subroutine acc_memcpy_device(data_dev_dest, &}
+ @item                   @tab @code{data_dev_src, bytes)}
+ @item @emph{Interface}: @tab @code{subroutine acc_memcpy_device_async(data_dev_dest, &}
+ @item                   @tab @code{data_dev_src, bytes, async_arg)}
+ @item                   @tab @code{type(c_ptr), value :: data_dev_dest}
+ @item                   @tab @code{type(c_ptr), value :: data_dev_src}
+ @item                   @tab @code{integer(c_size_t), value :: bytes}
+ @item                   @tab @code{integer(acc_handle_kind), value :: async_arg}
+ @end multitable
+ 
+ @item @emph{Reference}:
+ @uref{https://www.openacc.org, OpenACC specification v2.6}, section
+ 3.2.33.  @uref{https://www.openacc.org, OpenACC specification v3.3}, section
+ 3.2.28.
+ @end table
+ 
+ 
  
  @node acc_attach
  @section @code{acc_attach} -- Let device pointer point to device-pointer target.
diff -Nrcpad gcc-16-20250525/libgomp/oacc-mem.c gcc-16-20250601/libgomp/oacc-mem.c
*** gcc-16-20250525/libgomp/oacc-mem.c	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgomp/oacc-mem.c	Sun Jun  1 22:32:36 2025
*************** acc_free (void *d)
*** 171,191 ****
  }
  
  static void
! memcpy_tofrom_device (bool from, void *d, void *h, size_t s, int async,
! 		      const char *libfnname)
  {
    /* No need to call lazy open here, as the device pointer must have
       been obtained from a routine that did that.  */
    struct goacc_thread *thr = goacc_thread ();
  
    assert (thr && thr->dev);
  
    if (thr->dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
      {
!       if (from)
! 	memmove (h, d, s);
!       else
! 	memmove (d, h, s);
        return;
      }
  
--- 171,192 ----
  }
  
  static void
! memcpy_tofrom_device (bool dev_to, bool dev_from, void *dst, void *src,
! 		      size_t s, int async, const char *libfnname)
  {
    /* No need to call lazy open here, as the device pointer must have
       been obtained from a routine that did that.  */
    struct goacc_thread *thr = goacc_thread ();
  
    assert (thr && thr->dev);
+   if (s == 0)
+     return;
  
    if (thr->dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
      {
!       if (src == dst)
! 	return;
!       memcpy (dst, src, s);
        return;
      }
  
*************** memcpy_tofrom_device (bool from, void *d
*** 199,208 ****
      }
  
    goacc_aq aq = get_goacc_asyncqueue (async);
!   if (from)
!     gomp_copy_dev2host (thr->dev, aq, h, d, s);
    else
!     gomp_copy_host2dev (thr->dev, aq, d, h, s, false, /* TODO: cbuf? */ NULL);
  
    if (profiling_p)
      {
--- 200,214 ----
      }
  
    goacc_aq aq = get_goacc_asyncqueue (async);
!   if (dev_to && dev_from)
!     {
!       if (dst != src)
! 	gomp_copy_dev2dev (thr->dev, aq, dst, src, s);
!     }
!   else if (dev_from)
!     gomp_copy_dev2host (thr->dev, aq, dst, src, s);
    else
!     gomp_copy_host2dev (thr->dev, aq, dst, src, s, false, /* TODO: cbuf? */ NULL);
  
    if (profiling_p)
      {
*************** memcpy_tofrom_device (bool from, void *d
*** 214,238 ****
  void
  acc_memcpy_to_device (void *d, void *h, size_t s)
  {
!   memcpy_tofrom_device (false, d, h, s, acc_async_sync, __FUNCTION__);
  }
  
  void
  acc_memcpy_to_device_async (void *d, void *h, size_t s, int async)
  {
!   memcpy_tofrom_device (false, d, h, s, async, __FUNCTION__);
  }
  
  void
  acc_memcpy_from_device (void *h, void *d, size_t s)
  {
!   memcpy_tofrom_device (true, d, h, s, acc_async_sync, __FUNCTION__);
  }
  
  void
  acc_memcpy_from_device_async (void *h, void *d, size_t s, int async)
  {
!   memcpy_tofrom_device (true, d, h, s, async, __FUNCTION__);
  }
  
  /* Return the device pointer that corresponds to host data H.  Or NULL
--- 220,256 ----
  void
  acc_memcpy_to_device (void *d, void *h, size_t s)
  {
!   memcpy_tofrom_device (true, false, d, h, s, acc_async_sync, __FUNCTION__);
  }
  
  void
  acc_memcpy_to_device_async (void *d, void *h, size_t s, int async)
  {
!   memcpy_tofrom_device (true, false, d, h, s, async, __FUNCTION__);
  }
  
  void
  acc_memcpy_from_device (void *h, void *d, size_t s)
  {
!   memcpy_tofrom_device (false, true, h, d, s, acc_async_sync, __FUNCTION__);
  }
  
  void
  acc_memcpy_from_device_async (void *h, void *d, size_t s, int async)
  {
!   memcpy_tofrom_device (false, true, h, d, s, async, __FUNCTION__);
! }
! 
! void
! acc_memcpy_device (void *dst, void *src, size_t s)
! {
!   memcpy_tofrom_device (true, true, dst, src, s, acc_async_sync, __FUNCTION__);
! }
! 
! void
! acc_memcpy_device_async (void *dst, void *src, size_t s, int async)
! {
!   memcpy_tofrom_device (true, true, dst, src, s, async, __FUNCTION__);
  }
  
  /* Return the device pointer that corresponds to host data H.  Or NULL
diff -Nrcpad gcc-16-20250525/libgomp/openacc.f90 gcc-16-20250601/libgomp/openacc.f90
*** gcc-16-20250525/libgomp/openacc.f90	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgomp/openacc.f90	Sun Jun  1 22:32:36 2025
*************** module openacc
*** 797,802 ****
--- 797,803 ----
    public :: acc_copyout_finalize, acc_delete_finalize
    public :: acc_memcpy_to_device, acc_memcpy_to_device_async
    public :: acc_memcpy_from_device, acc_memcpy_from_device_async
+   public :: acc_memcpy_device, acc_memcpy_device_async
  
    integer, parameter :: openacc_version = 201711
  
*************** module openacc
*** 1043,1048 ****
--- 1044,1070 ----
        type(c_ptr), value :: data_dev_src
        integer(c_size_t), value :: bytes
        integer(acc_handle_kind), value :: async_arg
+     end subroutine
+   end interface
+ 
+   interface
+     subroutine acc_memcpy_device (data_dev_dest, data_dev_src, bytes) bind(C)
+       use iso_c_binding, only: c_ptr, c_size_t
+       type(c_ptr), value :: data_dev_dest
+       type(c_ptr), value :: data_dev_src
+       integer(c_size_t), value :: bytes
+     end subroutine
+   end interface
+ 
+   interface
+     subroutine acc_memcpy_device_async (data_dev_dest, data_dev_src,  &
+                                         bytes, async_arg) bind(C)
+       use iso_c_binding, only: c_ptr, c_size_t
+       import :: acc_handle_kind
+       type(c_ptr), value :: data_dev_dest
+       type(c_ptr), value :: data_dev_src
+       integer(c_size_t), value :: bytes
+       integer(acc_handle_kind), value :: async_arg
      end subroutine
    end interface
  
diff -Nrcpad gcc-16-20250525/libgomp/openacc.h gcc-16-20250601/libgomp/openacc.h
*** gcc-16-20250525/libgomp/openacc.h	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgomp/openacc.h	Sun Jun  1 22:32:36 2025
*************** void *acc_hostptr (void *) __GOACC_NOTHR
*** 123,128 ****
--- 123,129 ----
  int acc_is_present (void *, size_t) __GOACC_NOTHROW;
  void acc_memcpy_to_device (void *, void *, size_t) __GOACC_NOTHROW;
  void acc_memcpy_from_device (void *, void *, size_t) __GOACC_NOTHROW;
+ void acc_memcpy_device (void *, void *, size_t) __GOACC_NOTHROW;
  void acc_attach (void **) __GOACC_NOTHROW;
  void acc_attach_async (void **, int) __GOACC_NOTHROW;
  void acc_detach (void **) __GOACC_NOTHROW;
*************** void acc_delete_finalize_async (void *,
*** 136,142 ****
  void acc_detach_finalize (void **) __GOACC_NOTHROW;
  void acc_detach_finalize_async (void **, int) __GOACC_NOTHROW;
  
! /* Async functions, specified in OpenACC 2.5.  */
  void acc_copyin_async (void *, size_t, int) __GOACC_NOTHROW;
  void acc_create_async (void *, size_t, int) __GOACC_NOTHROW;
  void acc_copyout_async (void *, size_t, int) __GOACC_NOTHROW;
--- 137,143 ----
  void acc_detach_finalize (void **) __GOACC_NOTHROW;
  void acc_detach_finalize_async (void **, int) __GOACC_NOTHROW;
  
! /* Async functions, specified in OpenACC 2.5, acc_memcpy_device in 2.6.  */
  void acc_copyin_async (void *, size_t, int) __GOACC_NOTHROW;
  void acc_create_async (void *, size_t, int) __GOACC_NOTHROW;
  void acc_copyout_async (void *, size_t, int) __GOACC_NOTHROW;
*************** void acc_update_device_async (void *, si
*** 145,150 ****
--- 146,152 ----
  void acc_update_self_async (void *, size_t, int) __GOACC_NOTHROW;
  void acc_memcpy_to_device_async (void *, void *, size_t, int) __GOACC_NOTHROW;
  void acc_memcpy_from_device_async (void *, void *, size_t, int) __GOACC_NOTHROW;
+ void acc_memcpy_device_async (void *, void *, size_t, int) __GOACC_NOTHROW;
  
  /* CUDA-specific routines.  */
  void *acc_get_current_cuda_device (void) __GOACC_NOTHROW;
diff -Nrcpad gcc-16-20250525/libgomp/openacc_lib.h gcc-16-20250601/libgomp/openacc_lib.h
*** gcc-16-20250525/libgomp/openacc_lib.h	Sun May 25 22:32:15 2025
--- gcc-16-20250601/libgomp/openacc_lib.h	Sun Jun  1 22:32:36 2025
***************
*** 528,533 ****
--- 528,557 ----
          end subroutine
        end interface
  
+       interface
+         subroutine acc_memcpy_device(data_dev_dest, data_dev_src,       &
+      &                               bytes) bind(C)
+           use iso_c_binding, only: c_ptr, c_size_t
+           type(c_ptr), value :: data_dev_dest
+           type(c_ptr), value :: data_dev_src
+           integer(c_size_t), value :: bytes
+         end subroutine
+       end interface
+ 
+       interface
+         subroutine acc_memcpy_device_async(data_dev_dest,               &
+      &                                     data_dev_src, bytes,         &
+      &                                     async_arg) bind(C)
+           use iso_c_binding, only: c_ptr, c_size_t
+           import :: acc_handle_kind
+           type(c_ptr), value :: data_dev_dest
+           type(c_ptr), value :: data_dev_src
+           integer(c_size_t), value :: bytes
+           integer(acc_handle_kind), value :: async_arg
+         end subroutine
+       end interface
+ 
+ 
        interface acc_copyin_async
          subroutine acc_copyin_async_32_h (a, len, async)
            use iso_c_binding, only: c_int32_t
diff -Nrcpad gcc-16-20250525/libgomp/plugin/plugin-gcn.c gcc-16-20250601/libgomp/plugin/plugin-gcn.c
*** gcc-16-20250525/libgomp/plugin/plugin-gcn.c	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libgomp/plugin/plugin-gcn.c	Sun Jun  1 22:32:36 2025
*************** GOMP_OFFLOAD_openacc_async_queue_callbac
*** 5079,5085 ****
    queue_push_callback (aq, fn, data);
  }
  
! /* Queue up an asynchronous data copy from host to DEVICE.  */
  
  bool
  GOMP_OFFLOAD_openacc_async_host2dev (int device, void *dst, const void *src,
--- 5079,5086 ----
    queue_push_callback (aq, fn, data);
  }
  
! /* Queue up an asynchronous data copy from host to DEVICE.
!    (Also handles dev2host and dev2dev.)  */
  
  bool
  GOMP_OFFLOAD_openacc_async_host2dev (int device, void *dst, const void *src,
*************** bool
*** 5097,5106 ****
  GOMP_OFFLOAD_openacc_async_dev2host (int device, void *dst, const void *src,
  				     size_t n, struct goacc_asyncqueue *aq)
  {
!   struct agent_info *agent = get_agent_info (device);
!   assert (agent == aq->agent);
!   queue_push_copy (aq, dst, src, n);
!   return true;
  }
  
  union goacc_property_value
--- 5098,5113 ----
  GOMP_OFFLOAD_openacc_async_dev2host (int device, void *dst, const void *src,
  				     size_t n, struct goacc_asyncqueue *aq)
  {
!   return GOMP_OFFLOAD_openacc_async_host2dev (device, dst, src, n, aq);
! }
! 
! /* Queue up an asynchronous data copy from DEVICE to DEVICE.  */
! 
! bool
! GOMP_OFFLOAD_openacc_async_dev2dev (int device, void *dst, const void *src,
! 				    size_t n, struct goacc_asyncqueue *aq)
! {
!   return GOMP_OFFLOAD_openacc_async_host2dev (device, dst, src, n, aq);
  }
  
  union goacc_property_value
diff -Nrcpad gcc-16-20250525/libgomp/plugin/plugin-nvptx.c gcc-16-20250601/libgomp/plugin/plugin-nvptx.c
*** gcc-16-20250525/libgomp/plugin/plugin-nvptx.c	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libgomp/plugin/plugin-nvptx.c	Sun Jun  1 22:32:36 2025
*************** GOMP_OFFLOAD_openacc_async_queue_callbac
*** 2019,2024 ****
--- 2019,2052 ----
  }
  
  static bool
+ cuda_memcpy_dev_sanity_check (const void *d1, const void *d2, size_t s)
+ {
+   CUdeviceptr pb1, pb2;
+   size_t ps1, ps2;
+   if (!s)
+     return true;
+   if (!d1 || !d2)
+     {
+       GOMP_PLUGIN_error ("invalid device address");
+       return false;
+     }
+   CUDA_CALL (cuMemGetAddressRange, &pb1, &ps1, (CUdeviceptr) d1);
+   CUDA_CALL (cuMemGetAddressRange, &pb2, &ps2, (CUdeviceptr) d2);
+   if (!pb1 || !pb2)
+     {
+       GOMP_PLUGIN_error ("invalid device address");
+       return false;
+     }
+   if ((void *)(d1 + s) > (void *)(pb1 + ps1)
+       || (void *)(d2 + s) > (void *)(pb2 + ps2))
+     {
+       GOMP_PLUGIN_error ("invalid size");
+       return false;
+     }
+   return true;
+ }
+ 
+ static bool
  cuda_memcpy_sanity_check (const void *h, const void *d, size_t s)
  {
    CUdeviceptr pb;
*************** GOMP_OFFLOAD_dev2host (int ord, void *ds
*** 2077,2082 ****
--- 2105,2113 ----
  bool
  GOMP_OFFLOAD_dev2dev (int ord, void *dst, const void *src, size_t n)
  {
+   if (!nvptx_attach_host_thread_to_device (ord)
+       || !cuda_memcpy_dev_sanity_check (dst, src, n))
+     return false;
    CUDA_CALL (cuMemcpyDtoDAsync, (CUdeviceptr) dst, (CUdeviceptr) src, n, NULL);
    return true;
  }
*************** GOMP_OFFLOAD_openacc_async_dev2host (int
*** 2288,2293 ****
--- 2319,2336 ----
    return true;
  }
  
+ bool
+ GOMP_OFFLOAD_openacc_async_dev2dev (int ord, void *dst, const void *src,
+ 				    size_t n, struct goacc_asyncqueue *aq)
+ {
+   if (!nvptx_attach_host_thread_to_device (ord)
+       || !cuda_memcpy_dev_sanity_check (dst, src, n))
+     return false;
+   CUDA_CALL (cuMemcpyDtoDAsync, (CUdeviceptr) dst, (CUdeviceptr) src, n,
+ 	     aq->cuda_stream);
+   return true;
+ }
+ 
  union goacc_property_value
  GOMP_OFFLOAD_openacc_get_property (int n, enum goacc_property prop)
  {
diff -Nrcpad gcc-16-20250525/libgomp/target.c gcc-16-20250601/libgomp/target.c
*** gcc-16-20250525/libgomp/target.c	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libgomp/target.c	Sun Jun  1 22:32:36 2025
*************** gomp_copy_dev2host (struct gomp_device_d
*** 461,466 ****
--- 461,479 ----
      gomp_device_copy (devicep, devicep->dev2host_func, "host", h, "dev", d, sz);
  }
  
+ attribute_hidden void
+ gomp_copy_dev2dev (struct gomp_device_descr *devicep,
+ 		   struct goacc_asyncqueue *aq,
+ 		   void *dst, const void *src, size_t sz)
+ {
+   if (__builtin_expect (aq != NULL, 0))
+     goacc_device_copy_async (devicep, devicep->openacc.async.dev2dev_func,
+ 			     "dev", dst, "dev", src, NULL, sz, aq);
+   else
+     gomp_device_copy (devicep, devicep->dev2dev_func, "dev", dst,
+ 		      "dev", src, sz);
+ }
+ 
  static void
  gomp_free_device_memory (struct gomp_device_descr *devicep, void *devptr)
  {
*************** gomp_load_plugin_for_device (struct gomp
*** 5573,5578 ****
--- 5586,5592 ----
  	  || !DLSYM_OPT (openacc.async.exec, openacc_async_exec)
  	  || !DLSYM_OPT (openacc.async.dev2host, openacc_async_dev2host)
  	  || !DLSYM_OPT (openacc.async.host2dev, openacc_async_host2dev)
+ 	  || !DLSYM_OPT (openacc.async.dev2dev, openacc_async_dev2dev)
  	  || !DLSYM_OPT (openacc.get_property, openacc_get_property))
  	{
  	  /* Require all the OpenACC handlers if we have
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/declare-mapper-1.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/declare-mapper-1.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/declare-mapper-1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/declare-mapper-1.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,87 ----
+ // { dg-do run }
+ 
+ #include <cstdlib>
+ #include <cassert>
+ 
+ #define N 64
+ 
+ struct points
+ {
+   double *x;
+   double *y;
+   double *z;
+   size_t len;
+ };
+ 
+ #pragma omp declare mapper(points p) map(to:p.x, p.y, p.z) \
+ 				     map(p.x[0:p.len]) \
+ 				     map(p.y[0:p.len]) \
+ 				     map(p.z[0:p.len])
+ 
+ struct shape
+ {
+   points tmp;
+   points *pts;
+   int metadata[128];
+ };
+ 
+ #pragma omp declare mapper(shape s) map(tofrom:s.pts, *s.pts) map(alloc:s.tmp)
+ 
+ void
+ alloc_points (points *pts, size_t sz)
+ {
+   pts->x = new double[sz];
+   pts->y = new double[sz];
+   pts->z = new double[sz];
+   pts->len = sz;
+   for (int i = 0; i < sz; i++)
+     pts->x[i] = pts->y[i] = pts->z[i] = 0;
+ }
+ 
+ int main (int argc, char *argv[])
+ {
+   shape myshape;
+   points mypts;
+ 
+   myshape.pts = &mypts;
+ 
+   alloc_points (&myshape.tmp, N);
+   myshape.pts = new points;
+   alloc_points (myshape.pts, N);
+ 
+   #pragma omp target map(myshape)
+   {
+     for (int i = 0; i < N; i++)
+       {
+ 	myshape.pts->x[i]++;
+ 	myshape.pts->y[i]++;
+ 	myshape.pts->z[i]++;
+       }
+   }
+ 
+   for (int i = 0; i < N; i++)
+     {
+       assert (myshape.pts->x[i] == 1);
+       assert (myshape.pts->y[i] == 1);
+       assert (myshape.pts->z[i] == 1);
+     }
+ 
+   #pragma omp target
+   {
+     for (int i = 0; i < N; i++)
+       {
+ 	myshape.pts->x[i]++;
+ 	myshape.pts->y[i]++;
+ 	myshape.pts->z[i]++;
+       }
+   }
+ 
+   for (int i = 0; i < N; i++)
+     {
+       assert (myshape.pts->x[i] == 2);
+       assert (myshape.pts->y[i] == 2);
+       assert (myshape.pts->z[i] == 2);
+     }
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/declare-mapper-2.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/declare-mapper-2.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/declare-mapper-2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/declare-mapper-2.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,55 ----
+ // { dg-do run }
+ 
+ #include <cassert>
+ 
+ #define N 256
+ 
+ struct doublebuf
+ {
+   int buf_a[N][N];
+   int buf_b[N][N];
+ };
+ 
+ #pragma omp declare mapper(lo:doublebuf b) map(b.buf_a[0:N/2][0:N]) \
+ 					   map(b.buf_b[0:N/2][0:N])
+ 
+ #pragma omp declare mapper(hi:doublebuf b) map(b.buf_a[N/2:N/2][0:N]) \
+ 					   map(b.buf_b[N/2:N/2][0:N])
+ 
+ int main (int argc, char *argv[])
+ {
+   doublebuf db;
+ 
+   for (int i = 0; i < N; i++)
+     for (int j = 0; j < N; j++)
+       db.buf_a[i][j] = db.buf_b[i][j] = 0;
+ 
+   #pragma omp target map(mapper(lo), tofrom:db)
+   {
+     for (int i = 0; i < N / 2; i++)
+       for (int j = 0; j < N; j++)
+ 	{
+ 	  db.buf_a[i][j]++;
+ 	  db.buf_b[i][j]++;
+ 	}
+   }
+ 
+   #pragma omp target map(mapper(hi), tofrom:db)
+   {
+     for (int i = N / 2; i < N; i++)
+       for (int j = 0; j < N; j++)
+ 	{
+ 	  db.buf_a[i][j]++;
+ 	  db.buf_b[i][j]++;
+ 	}
+   }
+ 
+   for (int i = 0; i < N; i++)
+     for (int j = 0; j < N; j++)
+       {
+ 	assert (db.buf_a[i][j] == 1);
+ 	assert (db.buf_b[i][j] == 1);
+       }
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/declare-mapper-3.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/declare-mapper-3.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/declare-mapper-3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/declare-mapper-3.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,63 ----
+ // { dg-do run }
+ 
+ #include <cstdlib>
+ #include <cassert>
+ 
+ struct S {
+   int *myarr;
+ };
+ 
+ #pragma omp declare mapper (S s) map(to:s.myarr) map (tofrom: s.myarr[0:20])
+ 
+ namespace A {
+ #pragma omp declare mapper (S s) map(to:s.myarr) map (tofrom: s.myarr[0:100])
+ }
+ 
+ namespace B {
+ #pragma omp declare mapper (S s) map(to:s.myarr) map (tofrom: s.myarr[100:100])
+ }
+ 
+ namespace A
+ {
+   void incr_a (S my_s)
+   {
+ #pragma omp target
+     {
+       for (int i = 0; i < 100; i++)
+ 	my_s.myarr[i]++;
+     }
+   }
+ }
+ 
+ namespace B
+ {
+   void incr_b (S my_s)
+   {
+ #pragma omp target
+     {
+       for (int i = 100; i < 200; i++)
+ 	my_s.myarr[i]++;
+     }
+   }
+ }
+ 
+ int main (int argc, char *argv[])
+ {
+   S my_s;
+ 
+   my_s.myarr = (int *) calloc (200, sizeof (int));
+ 
+ #pragma omp target
+   {
+     for (int i = 0; i < 20; i++)
+       my_s.myarr[i]++;
+   }
+ 
+   A::incr_a (my_s);
+   B::incr_b (my_s);
+ 
+   for (int i = 0; i < 200; i++)
+     assert (my_s.myarr[i] == (i < 20) ? 2 : 1);
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/declare-mapper-4.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/declare-mapper-4.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/declare-mapper-4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/declare-mapper-4.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,63 ----
+ // { dg-do run }
+ 
+ #include <cstdlib>
+ #include <cassert>
+ 
+ struct S {
+   int *myarr;
+ };
+ 
+ #pragma omp declare mapper (S s) map(to:s.myarr) map (tofrom: s.myarr[0:20])
+ 
+ namespace A {
+ #pragma omp declare mapper (S s) map(to:s.myarr) map (tofrom: s.myarr[0:100])
+ }
+ 
+ namespace B {
+ #pragma omp declare mapper (S s) map(to:s.myarr) map (tofrom: s.myarr[100:100])
+ }
+ 
+ namespace A
+ {
+   void incr_a (S &my_s)
+   {
+ #pragma omp target
+     {
+       for (int i = 0; i < 100; i++)
+ 	my_s.myarr[i]++;
+     }
+   }
+ }
+ 
+ namespace B
+ {
+   void incr_b (S &my_s)
+   {
+ #pragma omp target
+     {
+       for (int i = 100; i < 200; i++)
+ 	my_s.myarr[i]++;
+     }
+   }
+ }
+ 
+ int main (int argc, char *argv[])
+ {
+   S my_s;
+ 
+   my_s.myarr = (int *) calloc (200, sizeof (int));
+ 
+ #pragma omp target
+   {
+     for (int i = 0; i < 20; i++)
+       my_s.myarr[i]++;
+   }
+ 
+   A::incr_a (my_s);
+   B::incr_b (my_s);
+ 
+   for (int i = 0; i < 200; i++)
+     assert (my_s.myarr[i] == (i < 20) ? 2 : 1);
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/declare-mapper-5.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/declare-mapper-5.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/declare-mapper-5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/declare-mapper-5.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,52 ----
+ // { dg-do run }
+ 
+ #include <cassert>
+ 
+ struct S
+ {
+   int *myarr;
+   int len;
+ };
+ 
+ class C
+ {
+   S smemb;
+ #pragma omp declare mapper (custom:S s) map(to:s.myarr) \
+ 					map(tofrom:s.myarr[0:s.len])
+ 
+ public:
+   C(int l)
+   {
+     smemb.myarr = new int[l];
+     smemb.len = l;
+     for (int i = 0; i < l; i++)
+       smemb.myarr[i] = 0;
+   }
+   void bump();
+   void check();
+ };
+ 
+ void
+ C::bump ()
+ {
+ #pragma omp target map(mapper(custom), tofrom: smemb)
+   {
+     for (int i = 0; i < smemb.len; i++)
+       smemb.myarr[i]++;
+   }
+ }
+ 
+ void
+ C::check ()
+ {
+   for (int i = 0; i < smemb.len; i++)
+     assert (smemb.myarr[i] == 1);
+ }
+ 
+ int main (int argc, char *argv[])
+ {
+   C test (100);
+   test.bump ();
+   test.check ();
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/declare-mapper-6.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/declare-mapper-6.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/declare-mapper-6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/declare-mapper-6.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,37 ----
+ // { dg-do run }
+ 
+ #include <cassert>
+ 
+ template <typename T>
+ void adjust (T param)
+ {
+ #pragma omp declare mapper (T x) map(to:x.len, x.base) \
+ 				 map(tofrom:x.base[0:x.len])
+ 
+ #pragma omp target
+   for (int i = 0; i < param.len; i++)
+     param.base[i]++;
+ }
+ 
+ struct S {
+   int len;
+   int *base;
+ };
+ 
+ int main (int argc, char *argv[])
+ {
+   S a;
+ 
+   a.len = 100;
+   a.base = new int[a.len];
+ 
+   for (int i = 0; i < a.len; i++)
+     a.base[i] = 0;
+ 
+   adjust (a);
+ 
+   for (int i = 0; i < a.len; i++)
+     assert (a.base[i] == 1);
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/declare-mapper-7.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/declare-mapper-7.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/declare-mapper-7.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/declare-mapper-7.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,59 ----
+ // { dg-do run }
+ 
+ #include <cassert>
+ 
+ struct S
+ {
+   int *myarr;
+ };
+ 
+ struct T
+ {
+   S *s;
+ };
+ 
+ #pragma omp declare mapper (s100: S x) map(to: x.myarr) \
+ 				       map(tofrom: x.myarr[0:100])
+ // Define this because ...
+ #pragma omp declare mapper (default: S x) map(to: x.myarr) \
+ 					  map(tofrom: x.myarr[0:100])
+ 
+ 
+ void
+ bump (T t)
+ {
+   /* Here we have an implicit/default mapper invoking a named mapper.  We
+      need to make sure that can be located properly at gimplification
+      time.  */
+ 
+ // ... the following is invalid in OpenMP - albeit supported by GCC
+ // (after disabling:  error: in ‘declare mapper’ directives, parameter to ‘mapper’ modifier must be ‘default’ )
+ 
+ // #pragma omp declare mapper (T t) map(to:t.s) map(mapper(s100), tofrom: t.s[0])
+ 
+ // ... thus, we now use ...
+ #pragma omp declare mapper (T t) map(to:t.s) map(mapper(default), tofrom: t.s[0])
+ 
+ #pragma omp target
+   for (int i = 0; i < 100; i++)
+     t.s->myarr[i]++;
+ }
+ 
+ int main (int argc, char *argv[])
+ {
+   S my_s;
+   T my_t;
+ 
+   my_s.myarr = new int[100];
+   my_t.s = &my_s;
+ 
+   for (int i = 0; i < 100; i++)
+     my_s.myarr[i] = 0;
+ 
+   bump (my_t);
+ 
+   for (int i = 0; i < 100; i++)
+     assert (my_s.myarr[i] == 1);
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/declare-mapper-8.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/declare-mapper-8.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/declare-mapper-8.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/declare-mapper-8.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,61 ----
+ // { dg-do run }
+ 
+ #include <cassert>
+ 
+ struct S
+ {
+   int *myarr;
+   int len;
+ };
+ 
+ template<typename T>
+ class C
+ {
+   T memb;
+ #pragma omp declare mapper (T t) map(to:t.len, t.myarr) \
+ 				 map(tofrom:t.myarr[0:t.len])
+ 
+ public:
+   C(int sz);
+   ~C();
+   void bump();
+   void check();
+ };
+ 
+ template<typename T>
+ C<T>::C(int sz)
+ {
+   memb.myarr = new int[sz];
+   for (int i = 0; i < sz; i++)
+     memb.myarr[i] = 0;
+   memb.len = sz;
+ }
+ 
+ template<typename T>
+ C<T>::~C()
+ {
+   delete[] memb.myarr;
+ }
+ 
+ template<typename T>
+ void C<T>::bump()
+ {
+ #pragma omp target map(memb)
+   for (int i = 0; i < memb.len; i++)
+     memb.myarr[i]++;
+ }
+ 
+ template<typename T>
+ void C<T>::check()
+ {
+   for (int i = 0; i < memb.len; i++)
+     assert (memb.myarr[i] == 1);
+ }
+ 
+ int main(int argc, char *argv[])
+ {
+   C<S> c_int(100);
+   c_int.bump();
+   c_int.check();
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-10.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-10.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-10.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-10.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,215 ----
+ /* Basic container usage.  */
+ 
+ #include <vector>
+ #include <deque>
+ #include <list>
+ #include <set>
+ #include <map>
+ #if __cplusplus >= 201103L
+ #include <array>
+ #include <forward_list>
+ #include <unordered_set>
+ #include <unordered_map>
+ #endif
+ 
+ bool vector_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       std::vector<int> vector;
+       ok = vector.empty();
+     }
+   return ok;
+ }
+ 
+ bool deque_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       std::deque<int> deque;
+       ok = deque.empty();
+     }
+   return ok;
+ }
+ 
+ bool list_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       std::list<int> list;
+       ok = list.empty();
+     }
+   return ok;
+ }
+ 
+ bool map_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       std::map<int, int> map;
+       ok = map.empty();
+     }
+   return ok;
+ }
+ 
+ bool set_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       std::set<int> set;
+       ok = set.empty();
+     }
+   return ok;
+ }
+ 
+ bool multimap_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       std::multimap<int, int> multimap;
+       ok = multimap.empty();
+     }
+   return ok;
+ }
+ 
+ bool multiset_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       std::multiset<int, int> multiset;
+       ok = multiset.empty();
+     }
+   return ok;
+ }
+ 
+ #if __cplusplus >= 201103L
+ 
+ bool array_test()
+ {
+   static constexpr std::size_t array_size = 42;
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       std::array<int, array_size> array{};
+       ok = array[0] == 0
+ 	   && array[array_size - 1] == 0;
+     }
+   return ok;
+ }
+ 
+ bool forward_list_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       std::forward_list<int> forward_list;
+       ok = forward_list.empty();
+     }
+   return ok;
+ }
+ 
+ bool unordered_map_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       std::unordered_map<int, int> unordered_map;
+       ok = unordered_map.empty();
+     }
+   return ok;
+ }
+ 
+ bool unordered_set_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       std::unordered_set<int> unordered_set;
+       ok = unordered_set.empty();
+     }
+   return ok;
+ }
+ 
+ bool unordered_multimap_test()
+ {
+ 
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       std::unordered_multimap<int, int> unordered_multimap;
+       ok = unordered_multimap.empty();
+     }
+   return ok;
+ }
+ 
+ bool unordered_multiset_test()
+ {
+ 
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       std::unordered_multiset<int> unordered_multiset;
+       ok = unordered_multiset.empty();
+     }
+   return ok;
+ }
+ 
+ #else
+ bool array_test() { return true; }
+ bool forward_list_test() { return true; }
+ bool unordered_map_test() { return true; }
+ bool unordered_set_test() { return true; }
+ bool unordered_multimap_test() { return true; }
+ bool unordered_multiset_test() { return true; }
+ #endif
+ 
+ int main()
+ {
+   const bool vec_res                = vector_test();
+   __builtin_printf("vector            : %s\n", vec_res                ? "PASS" : "FAIL");
+   const bool deque_res              = deque_test();
+   __builtin_printf("deque             : %s\n", deque_res              ? "PASS" : "FAIL");
+   const bool list_res               = list_test();
+   __builtin_printf("list              : %s\n", list_res               ? "PASS" : "FAIL");
+   const bool map_res                = map_test();
+   __builtin_printf("map               : %s\n", map_res                ? "PASS" : "FAIL");
+   const bool set_res                = set_test();
+   __builtin_printf("set               : %s\n", set_res                ? "PASS" : "FAIL");
+   const bool multimap_res           = multimap_test();
+   __builtin_printf("multimap          : %s\n", multimap_res           ? "PASS" : "FAIL");
+   const bool multiset_res           = multiset_test();
+   __builtin_printf("multiset          : %s\n", multiset_res           ? "PASS" : "FAIL");
+   const bool array_res              = array_test();
+   __builtin_printf("array             : %s\n", array_res              ? "PASS" : "FAIL");
+   const bool forward_list_res       = forward_list_test();
+   __builtin_printf("forward_list      : %s\n", forward_list_res       ? "PASS" : "FAIL");
+   const bool unordered_map_res      = unordered_map_test();
+   __builtin_printf("unordered_map     : %s\n", unordered_map_res      ? "PASS" : "FAIL");
+   const bool unordered_set_res      = unordered_set_test();
+   __builtin_printf("unordered_set     : %s\n", unordered_set_res      ? "PASS" : "FAIL");
+   const bool unordered_multimap_res = unordered_multimap_test();
+   __builtin_printf("unordered_multimap: %s\n", unordered_multimap_res ? "PASS" : "FAIL");
+   const bool unordered_multiset_res = unordered_multiset_test();
+   __builtin_printf("unordered_multiset: %s\n", unordered_multiset_res ? "PASS" : "FAIL");
+   const bool ok = vec_res
+ 		  && deque_res
+ 		  && list_res
+ 		  && map_res
+ 		  && set_res
+ 		  && multimap_res
+ 		  && multiset_res
+ 		  && array_res
+ 		  && forward_list_res
+ 		  && unordered_map_res
+ 		  && unordered_set_res
+ 		  && unordered_multimap_res
+ 		  && unordered_multiset_res;
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-100.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-100.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-100.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-100.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,210 ----
+ /* Container adaptors in target region.
+    Does not test comparison operators other than equality to allow these tests
+    to be generalized to arbitrary input data.  */
+ 
+ #include <algorithm>
+ #include <cstdio>
+ #include <deque>
+ #include <queue>
+ #include <stack>
+ #include <vector>
+ 
+ #include "target-flex-common.h"
+ 
+ template<typename T, std::size_t Size>
+ bool test_stack(T (&arr)[Size])
+ {
+   bool ok;
+   #pragma omp target map(from: ok) map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       const std::size_t half_size = Size / 2;
+       const T first_element = arr[0];
+       const T middle_element = arr[half_size - 1];
+       const T last_element = arr[Size - 1];
+       typedef std::stack<T, std::vector<T> > stack_type;
+       stack_type stack;
+       VERIFY (stack.empty());
+       VERIFY (stack.size() == 0);
+       {
+ 	/* Do half with push.  */
+ 	std::size_t idx = 0;
+ 	for (; idx < half_size; ++idx)
+ 	  {
+ 	    stack.push(arr[idx]);
+ 	    VERIFY (stack.top() == arr[idx]);
+ 	  }
+ 	VERIFY (stack.size() == half_size);
+ 	VERIFY (static_cast<const stack_type&>(stack).size() == half_size);
+ 	for (; idx < Size; ++idx)
+ 	  {
+ 	    #if __cplusplus >= 201103L
+ 	      /* Do the rest with emplace if C++11 or higher.  */
+ 	      stack.emplace(arr[idx]);
+ 	    #else
+ 	      /* Otherwise just use push again.  */
+ 	      stack.push(arr[idx]);
+ 	    #endif
+ 	    VERIFY (stack.top() == arr[idx]);
+ 	  }
+ 	VERIFY (stack.size() == Size);
+ 	VERIFY (static_cast<const stack_type&>(stack).size() == Size);
+ 
+ 	const stack_type stack_orig = stack_type(std::vector<T>(arr, arr + Size));
+ 	VERIFY (stack == stack_orig);
+ 	/* References are contained in their own scope so we don't accidently
+ 	   add tests referencing them after they have been invalidated.  */
+ 	{
+ 	  const T& const_top = static_cast<const stack_type&>(stack).top();
+ 	  VERIFY (const_top == last_element);
+ 	  T& mutable_top = stack.top();
+ 	  mutable_top = first_element;
+ 	  VERIFY (const_top == first_element);
+ 	}
+ 	/* Will only compare inequal if the first and last elements are different.  */
+ 	VERIFY (first_element != last_element || stack != stack_orig);
+ 	for (std::size_t count = Size - half_size; count != 0; --count)
+ 	  stack.pop();
+ 	VERIFY (stack.top() == middle_element);
+ 	const stack_type stack_half_orig = stack_type(std::vector<T>(arr, arr + half_size));
+ 	VERIFY (stack == stack_half_orig);
+       }
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ template<typename T, std::size_t Size>
+ bool test_queue(T (&arr)[Size])
+ {
+   bool ok;
+   #pragma omp target map(from: ok) map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       const std::size_t half_size = Size / 2;
+       const T first_element = arr[0];
+       const T last_element = arr[Size - 1];
+       typedef std::queue<T, std::deque<T> > queue_type;
+       queue_type queue;
+       VERIFY (queue.empty());
+       VERIFY (queue.size() == 0);
+       {
+ 	/* Do half with push.  */
+ 	std::size_t idx = 0;
+ 	for (; idx < half_size; ++idx)
+ 	  {
+ 	    queue.push(arr[idx]);
+ 	    VERIFY (queue.back() == arr[idx]);
+ 	    VERIFY (queue.front() == first_element);
+ 	  }
+ 	VERIFY (queue.size() == half_size);
+ 	VERIFY (static_cast<const queue_type&>(queue).size() == half_size);
+ 	for (; idx < Size; ++idx)
+ 	  {
+ 	    #if __cplusplus >= 201103L
+ 	      /* Do the rest with emplace if C++11 or higher.  */
+ 	      queue.emplace(arr[idx]);
+ 	    #else
+ 	      /* Otherwise just use push again.  */
+ 	      queue.push(arr[idx]);
+ 	    #endif
+ 	    VERIFY (queue.back() == arr[idx]);
+ 	  }
+ 	VERIFY (queue.size() == Size);
+ 	VERIFY (static_cast<const queue_type&>(queue).size() == Size);
+ 
+ 	const queue_type queue_orig = queue_type(std::deque<T>(arr, arr + Size));
+ 	VERIFY (queue == queue_orig);
+ 
+ 	/* References are contained in their own scope so we don't accidently
+ 	   add tests referencing them after they have been invalidated.  */
+ 	{
+ 	  const T& const_front = static_cast<const queue_type&>(queue).front();
+ 	  VERIFY (const_front == first_element);
+ 	  T& mutable_front = queue.front();
+ 
+ 	  const T& const_back = static_cast<const queue_type&>(queue).back();
+ 	  VERIFY (const_back == last_element);
+ 	  T& mutable_back = queue.back();
+ 	  {
+ 	    using std::swap;
+ 	    swap(mutable_front, mutable_back);
+ 	  }
+ 	  VERIFY (const_front == last_element);
+ 	  VERIFY (const_back == first_element);
+ 	  /* Will only compare inequal if the first and last elements are different.  */
+ 	  VERIFY (first_element != last_element || queue != queue_orig);
+ 	  /* Return the last element to normal for the next comparison.  */
+ 	  mutable_back = last_element;
+ 	}
+ 
+ 	const T middle_element = arr[half_size];
+ 	for (std::size_t count = Size - half_size; count != 0; --count)
+ 	  queue.pop();
+ 	VERIFY (queue.front() == middle_element);
+ 	const queue_type queue_upper_half = queue_type(std::deque<T>(arr + half_size, arr + Size));
+ 	VERIFY (queue == queue_upper_half);
+       }
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ template<typename T, std::size_t Size>
+ bool test_priority_queue(T (&arr)[Size], const T min_value, const T max_value)
+ {
+   bool ok;
+   #pragma omp target map(from: ok) map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       typedef std::priority_queue<T, std::vector<T> > priority_queue_type;
+       {
+ 	priority_queue_type pqueue;
+ 	VERIFY (pqueue.empty());
+ 	VERIFY (pqueue.size() == 0);
+       }
+       {
+ 	priority_queue_type pqueue(arr, arr + Size);
+ 	VERIFY (!pqueue.empty());
+ 	VERIFY (pqueue.size() == Size);
+ 	VERIFY (static_cast<const priority_queue_type&>(pqueue).size() == Size);
+ 
+ 	const T old_max = pqueue.top();
+ 
+ 	#if __cplusplus >= 201103L
+ 	  pqueue.emplace(max_value);
+ 	#else
+ 	  pqueue.push(max_value);
+ 	#endif
+ 	VERIFY (pqueue.top() == max_value);
+ 	pqueue.pop();
+ 	VERIFY (pqueue.top() == old_max);
+ 	pqueue.push(min_value);
+ 	VERIFY (pqueue.top() == old_max);
+ 	pqueue.push(max_value);
+ 	VERIFY (pqueue.top() == max_value);
+ 	pqueue.pop();
+ 	VERIFY (pqueue.top() == old_max);
+ 	VERIFY (pqueue.size() == Size + 1);
+ 
+ 	for (std::size_t count = Size; count != 0; --count)
+ 	  pqueue.pop();
+ 	VERIFY (pqueue.size() == 1);
+ 	VERIFY (pqueue.top() == min_value);
+       }
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ int main()
+ {
+   int arr[10] = {0,1,2,3,4,5,6,7,8,9};
+ 
+   return test_stack(arr)
+ 	 && test_queue(arr)
+ 	 && test_priority_queue(arr, 0, 1000) ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-101.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-101.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-101.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-101.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,136 ----
+ /* { dg-additional-options -std=c++23 } */
+ 
+ /* C++23 container adaptors in target region.
+    Severely needs additional tests.  */
+ 
+ #include <cstdio>
+ #include <utility>
+ #include <version>
+ 
+ #if __cpp_lib_flat_map >= 202207L
+ #define ENABLE_FLAT_MAP 1
+ #endif
+ #if __cpp_lib_flat_set >= 202207L
+ #define ENABLE_FLAT_SET 1
+ #endif
+ 
+ #ifdef ENABLE_FLAT_MAP
+ #include <flat_map>
+ #endif
+ #ifdef ENABLE_FLAT_SET
+ #include <flat_set>
+ #endif
+ 
+ #include "target-flex-common.h"
+ 
+ #ifdef ENABLE_FLAT_MAP
+ template<typename K, typename V, typename std::size_t Size>
+ bool test_flat_map(std::pair<K, V> (&arr)[Size])
+ {
+   bool ok;
+   #pragma omp target map(from: ok) map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       {
+ 	using flat_map_type = std::flat_map<K, V>;
+ 	flat_map_type map = {arr, arr + Size};
+ 
+ 	VERIFY (!map.empty());
+ 	for (const auto& element : arr)
+ 	  VERIFY (map.contains(element.first));
+       }
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ template<typename K, typename V, typename std::size_t Size>
+ bool test_flat_multimap(std::pair<K, V> (&arr)[Size])
+ {
+   bool ok;
+   #pragma omp target map(from: ok) map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       {
+ 	using flat_map_type = std::flat_map<K, V>;
+ 	flat_map_type map = {arr, arr + Size};
+ 
+ 	VERIFY (!map.empty());
+ 	for (const auto& element : arr)
+ 	  VERIFY (map.contains(element.first));
+       }
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ #else
+ template<typename K, typename V, typename std::size_t Size>
+ bool test_flat_map(std::pair<K, V> (&arr)[Size]) { return true; }
+ 
+ template<typename K, typename V, typename std::size_t Size>
+ bool test_flat_multimap(std::pair<K, V> (&arr)[Size]) { return true; }
+ #endif
+ 
+ #ifdef ENABLE_FLAT_SET
+ template<typename T, typename std::size_t Size>
+ bool test_flat_set(T (&arr)[Size])
+ {
+   bool ok;
+   #pragma omp target map(from: ok) map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       {
+ 	using flat_set_type = std::flat_set<T>;
+ 	flat_set_type set = {arr, arr + Size};
+ 
+ 	VERIFY (!set.empty());
+ 	for (const auto& element : arr)
+ 	  VERIFY (set.contains(element));
+       }
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ template<typename T, typename std::size_t Size>
+ bool test_flat_multiset(T (&arr)[Size])
+ {
+   bool ok;
+   #pragma omp target map(from: ok) map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       {
+ 	using flat_multiset_type = std::flat_multiset<T>;
+ 	flat_multiset_type multiset = {arr, arr + Size};
+ 
+ 	VERIFY (!multiset.empty());
+ 	for (const auto& element : arr)
+ 	  VERIFY (multiset.contains(element));
+       }
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ #else
+ template<typename T, typename std::size_t Size>
+ bool test_flat_set(T (&arr)[Size]) { return true; }
+ 
+ template<typename T, typename std::size_t Size>
+ bool test_flat_multiset(T (&arr)[Size]) { return true; }
+ #endif
+ 
+ int main()
+ {
+   int arr[10] = {0,1,2,3,4,5,6,7,8,9};
+   std::pair<int, int> pairs[10] = {{ 1,  2}, { 2,  4}, { 3,  6}, { 4,  8}, { 5, 10},
+ 				   { 6, 12}, { 7, 14}, { 8, 16}, { 9, 18}, {10, 20}};
+ 
+   return test_flat_set(arr)
+ 	 && test_flat_multiset(arr)
+ 	 && test_flat_map(pairs)
+ 	 && test_flat_multimap(pairs) ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-11.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-11.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-11.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-11.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,444 ----
+ /* Check constructors/destructors are called in containers.  */
+ 
+ #include <vector>
+ #include <deque>
+ #include <list>
+ #include <set>
+ #include <map>
+ #include <utility>
+ #if __cplusplus >= 201103L
+ #include <array>
+ #include <forward_list>
+ #include <unordered_set>
+ #include <unordered_map>
+ #endif
+ 
+ #include "target-flex-common.h"
+ 
+ struct indirect_counter
+ {
+   typedef int counter_value_type;
+   counter_value_type *_count_ptr;
+ 
+   indirect_counter(counter_value_type *count_ptr) BL_NOEXCEPT : _count_ptr(count_ptr) {
+     ++(*_count_ptr);
+   }
+   indirect_counter(const indirect_counter& other) BL_NOEXCEPT : _count_ptr(other._count_ptr) {
+     ++(*_count_ptr);
+   }
+   /* Don't declare a move constructor, we want to copy no matter what.  */
+   ~indirect_counter() {
+     --(*_count_ptr);
+   }
+ };
+ 
+ bool operator==(indirect_counter const& lhs, indirect_counter const& rhs) BL_NOEXCEPT
+   { return lhs._count_ptr == rhs._count_ptr; }
+ bool operator<(indirect_counter const& lhs, indirect_counter const& rhs) BL_NOEXCEPT
+   { return lhs._count_ptr < rhs._count_ptr; }
+ 
+ #if __cplusplus >= 201103L
+ template<>
+ struct std::hash<indirect_counter>
+ {
+   std::size_t operator()(const indirect_counter& ic) const noexcept
+     { return std::hash<indirect_counter::counter_value_type *>{}(ic._count_ptr); }
+ };
+ #endif
+ 
+ /* Not a container, just a sanity check really.  */
+ bool automatic_lifetime_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       bool inner_ok = true;
+       int counter = 0;
+       {
+ 	indirect_counter c = indirect_counter(&counter);
+ 	indirect_counter(static_cast<int*>(&counter));
+       }
+       VERIFY (counter == 0);
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ bool vector_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       bool inner_ok = true;
+       int counter = 0;
+       {
+ 	std::vector<indirect_counter> vec(42, indirect_counter(&counter));
+ 	VERIFY (counter == 42);
+ 	vec.resize(32, indirect_counter(&counter));
+ 	VERIFY (counter == 32);
+ 	vec.push_back(indirect_counter(&counter));
+ 	VERIFY (counter == 33);
+ 	vec.pop_back();
+ 	VERIFY (counter == 32);
+ 	vec.pop_back();
+ 	VERIFY (counter == 31);
+ 	vec.resize(100, indirect_counter(&counter));
+ 	VERIFY (counter == 100);
+       }
+       VERIFY (counter == 0);
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ bool deque_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       bool inner_ok = true;
+       int counter = 0;
+       {
+ 	std::deque<indirect_counter> vec(42, indirect_counter(&counter));
+ 	VERIFY (counter == 42);
+ 	vec.resize(32, indirect_counter(&counter));
+ 	VERIFY (counter == 32);
+ 	vec.push_back(indirect_counter(&counter));
+ 	VERIFY (counter == 33);
+ 	vec.pop_back();
+ 	VERIFY (counter == 32);
+ 	vec.pop_back();
+ 	VERIFY (counter == 31);
+ 	vec.resize(100, indirect_counter(&counter));
+ 	VERIFY (counter == 100);
+       }
+       VERIFY (counter == 0);
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ bool list_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       bool inner_ok = true;
+       int counter = 0;
+       {
+ 	std::list<indirect_counter> list(42, indirect_counter(&counter));
+ 	VERIFY (counter == 42);
+ 	list.resize(32, indirect_counter(&counter));
+ 	VERIFY (counter == 32);
+ 	list.push_back(indirect_counter(&counter));
+ 	VERIFY (counter == 33);
+ 	list.pop_back();
+ 	VERIFY (counter == 32);
+ 	list.pop_back();
+ 	VERIFY (counter == 31);
+ 	list.resize(100, indirect_counter(&counter));
+ 	VERIFY (counter == 100);
+       }
+       VERIFY (counter == 0);
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ bool map_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       bool inner_ok = true;
+       int counter = 0;
+       {
+ 	std::map<int, indirect_counter> map;
+ 	map.insert(std::make_pair(1, indirect_counter(&counter)));
+ 	VERIFY (counter == 1);
+ 	map.insert(std::make_pair(1, indirect_counter(&counter)));
+ 	VERIFY (counter == 1);
+ 	map.insert(std::make_pair(2, indirect_counter(&counter)));
+ 	VERIFY (counter == 2);
+       }
+       VERIFY (counter == 0);
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ bool set_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       bool inner_ok = true;
+       int counter0 = 0;
+       int counter1 = 0;
+       {
+ 	std::set<indirect_counter> set;
+ 	set.insert(indirect_counter(&counter0));
+ 	VERIFY (counter0 == 1);
+ 	set.insert(indirect_counter(&counter0));
+ 	VERIFY (counter0 == 1);
+ 	set.insert(indirect_counter(&counter1));
+ 	VERIFY (counter0 == 1 && counter1 == 1);
+       }
+       VERIFY (counter0 == 0 && counter1 == 0);
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ bool multimap_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       bool inner_ok = true;
+       int counter = 0;
+       {
+ 	std::multimap<int, indirect_counter> multimap;
+ 	multimap.insert(std::make_pair(1, indirect_counter(&counter)));
+ 	VERIFY (counter == 1);
+ 	multimap.insert(std::make_pair(1, indirect_counter(&counter)));
+ 	VERIFY (counter == 2);
+ 	multimap.insert(std::make_pair(2, indirect_counter(&counter)));
+ 	VERIFY (counter == 3);
+       }
+       VERIFY (counter == 0);
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ bool multiset_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       bool inner_ok = true;
+       int counter0 = 0;
+       int counter1 = 0;
+       {
+ 	std::multiset<indirect_counter> multiset;
+ 	multiset.insert(indirect_counter(&counter0));
+ 	VERIFY (counter0 == 1);
+ 	multiset.insert(indirect_counter(&counter0));
+ 	VERIFY (counter0 == 2);
+ 	multiset.insert(indirect_counter(&counter1));
+ 	VERIFY (counter0 == 2 && counter1 == 1);
+       }
+       VERIFY (counter0 == 0 && counter1 == 0);
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ #if __cplusplus >= 201103L
+ 
+ bool array_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       bool inner_ok = true;
+       int counter = 0;
+       {
+ 	indirect_counter ic(&counter);
+ 	std::array<indirect_counter, 10> array{ic, ic, ic, ic, ic,
+ 					       ic, ic, ic, ic, ic};
+ 	VERIFY (counter == 11);
+       }
+       VERIFY (counter == 0);
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ bool forward_list_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       bool inner_ok = true;
+       int counter = 0;
+       {
+ 	std::forward_list<indirect_counter> forward_list(42, indirect_counter(&counter));
+ 	VERIFY (counter == 42);
+ 	forward_list.resize(32, indirect_counter(&counter));
+ 	VERIFY (counter == 32);
+ 	forward_list.push_front(indirect_counter(&counter));
+ 	VERIFY (counter == 33);
+ 	forward_list.pop_front();
+ 	VERIFY (counter == 32);
+ 	forward_list.pop_front();
+ 	VERIFY (counter == 31);
+ 	forward_list.resize(100, indirect_counter(&counter));
+ 	VERIFY (counter == 100);
+       }
+       VERIFY (counter == 0);
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ bool unordered_map_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       bool inner_ok = true;
+       int counter = 0;
+       {
+ 	std::unordered_map<int, indirect_counter> unordered_map;
+ 	unordered_map.insert({1, indirect_counter(&counter)});
+ 	VERIFY (counter == 1);
+ 	unordered_map.insert({1, indirect_counter(&counter)});
+ 	VERIFY (counter == 1);
+ 	unordered_map.insert({2, indirect_counter(&counter)});
+ 	VERIFY (counter == 2);
+       }
+       VERIFY (counter == 0);
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ bool unordered_set_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       bool inner_ok = true;
+       int counter0 = 0;
+       int counter1 = 0;
+       {
+ 	std::unordered_set<indirect_counter> unordered_set;
+ 	unordered_set.insert(indirect_counter(&counter0));
+ 	VERIFY (counter0 == 1);
+ 	unordered_set.insert(indirect_counter(&counter0));
+ 	VERIFY (counter0 == 1);
+ 	unordered_set.insert(indirect_counter(&counter1));
+ 	VERIFY (counter0 == 1 && counter1 == 1);
+       }
+       VERIFY (counter0 == 0 && counter1 == 0);
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ bool unordered_multimap_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       bool inner_ok = true;
+       int counter = 0;
+       {
+ 	std::unordered_multimap<int, indirect_counter> unordered_multimap;
+ 	unordered_multimap.insert({1, indirect_counter(&counter)});
+ 	VERIFY (counter == 1);
+ 	unordered_multimap.insert({1, indirect_counter(&counter)});
+ 	VERIFY (counter == 2);
+ 	unordered_multimap.insert({2, indirect_counter(&counter)});
+ 	VERIFY (counter == 3);
+       }
+       VERIFY (counter == 0);
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ bool unordered_multiset_test()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       bool inner_ok = true;
+       int counter0 = 0;
+       int counter1 = 0;
+       {
+ 	std::unordered_multiset<indirect_counter> unordered_multiset;
+ 	unordered_multiset.insert(indirect_counter(&counter0));
+ 	VERIFY (counter0 == 1);
+ 	unordered_multiset.insert(indirect_counter(&counter0));
+ 	VERIFY (counter0 == 2);
+ 	unordered_multiset.insert(indirect_counter(&counter1));
+ 	VERIFY (counter0 == 2 && counter1 == 1);
+       }
+       VERIFY (counter0 == 0 && counter1 == 0);
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ #else
+ bool array_test() { return true; }
+ bool forward_list_test() { return true; }
+ bool unordered_map_test() { return true; }
+ bool unordered_set_test() { return true; }
+ bool unordered_multimap_test() { return true; }
+ bool unordered_multiset_test() { return true; }
+ #endif
+ 
+ int main()
+ {
+   const bool auto_res               = automatic_lifetime_test();
+   const bool vec_res                = vector_test();
+   const bool deque_res              = deque_test();
+   const bool list_res               = list_test();
+   const bool map_res                = map_test();
+   const bool set_res                = set_test();
+   const bool multimap_res           = multimap_test();
+   const bool multiset_res           = multiset_test();
+   const bool array_res              = array_test();
+   const bool forward_list_res       = forward_list_test();
+   const bool unordered_map_res      = unordered_map_test();
+   const bool unordered_set_res      = unordered_set_test();
+   const bool unordered_multimap_res = unordered_multimap_test();
+   const bool unordered_multiset_res = unordered_multiset_test();
+   std::printf("sanity check      : %s\n", auto_res               ? "PASS" : "FAIL");
+   std::printf("vector            : %s\n", vec_res                ? "PASS" : "FAIL");
+   std::printf("deque             : %s\n", deque_res              ? "PASS" : "FAIL");
+   std::printf("list              : %s\n", list_res               ? "PASS" : "FAIL");
+   std::printf("map               : %s\n", map_res                ? "PASS" : "FAIL");
+   std::printf("set               : %s\n", set_res                ? "PASS" : "FAIL");
+   std::printf("multimap          : %s\n", multimap_res           ? "PASS" : "FAIL");
+   std::printf("multiset          : %s\n", multiset_res           ? "PASS" : "FAIL");
+   std::printf("array             : %s\n", array_res              ? "PASS" : "FAIL");
+   std::printf("forward_list      : %s\n", forward_list_res       ? "PASS" : "FAIL");
+   std::printf("unordered_map     : %s\n", unordered_map_res      ? "PASS" : "FAIL");
+   std::printf("unordered_set     : %s\n", unordered_set_res      ? "PASS" : "FAIL");
+   std::printf("unordered_multimap: %s\n", unordered_multimap_res ? "PASS" : "FAIL");
+   std::printf("unordered_multiset: %s\n", unordered_multiset_res ? "PASS" : "FAIL");
+   const bool ok = auto_res
+ 		  && vec_res
+ 		  && deque_res
+ 		  && list_res
+ 		  && map_res
+ 		  && set_res
+ 		  && multimap_res
+ 		  && multiset_res
+ 		  && array_res
+ 		  && forward_list_res
+ 		  && unordered_map_res
+ 		  && unordered_set_res
+ 		  && unordered_multimap_res
+ 		  && unordered_multiset_res;
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-12.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-12.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-12.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-12.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,736 ----
+ /* Populated with mapped data, validate, mutate, validate again.
+    The cases using sets do not mutate.
+    Note: Some of the code in here really sucks due to being made to be
+    compatible with c++98.  */
+ 
+ #include <vector>
+ #include <deque>
+ #include <list>
+ #include <set>
+ #include <map>
+ #if __cplusplus >= 201103L
+ #include <array>
+ #include <forward_list>
+ #include <unordered_set>
+ #include <unordered_map>
+ #endif
+ 
+ #include <limits>
+ #include <iterator>
+ 
+ #include "target-flex-common.h"
+ 
+ template<bool B, class T = void>
+ struct enable_if {};
+  
+ template<class T>
+ struct enable_if<true, T> { typedef T type; };
+ 
+ struct identity_func
+ {
+ #if __cplusplus < 201103L
+   template<typename T>
+   T& operator()(T& arg) const BL_NOEXCEPT { return arg; }
+   template<typename T>
+   T const& operator()(T const& arg) const BL_NOEXCEPT { return arg; }
+ #else
+   template<typename T>
+   constexpr T&& operator()(T&& arg) const BL_NOEXCEPT { return std::forward<T>(arg); }
+ #endif
+ };
+ 
+ /* Applies projection to the second iterator.  */
+ template<typename It0, typename It1, typename Proj>
+ bool validate_sequential_elements(const It0 begin0, const It0 end0,
+ 				  const It1 begin1, const It1 end1,
+ 				  Proj proj) BL_NOEXCEPT
+ {
+   It0 it0 = begin0;
+   It1 it1 = begin1;
+   for (; it0 != end0; ++it0, ++it1)
+     {
+       /* Sizes mismatch, don't bother aborting though just fail the test.  */
+       if (it1 == end1)
+ 	return false;
+       if (*it0 != proj(*it1))
+ 	return false;
+     }
+   /* Sizes mismatch, do as above.  */
+   if (it1 != end1)
+     return false;
+   return true;
+ }
+ 
+ template<typename It0, typename It1>
+ bool validate_sequential_elements(const It0 begin0, const It0 end0,
+ 				  const It1 begin1, const It1 end1) BL_NOEXCEPT
+ {
+   return validate_sequential_elements(begin0, end0, begin1, end1, identity_func());
+ }
+ 
+ /* Inefficient, but simple.  */
+ template<typename It, typename OutIt>
+ void simple_copy(const It begin, const It end, OutIt out) BL_NOEXCEPT
+ {
+   for (It it = begin; it != end; ++it, ++out)
+     *out = *it;
+ }
+ 
+ template<typename It, typename MutateFn>
+ void simple_mutate(const It begin, const It end, MutateFn mut_fn) BL_NOEXCEPT
+ {
+   for (It it = begin; it != end; ++it)
+     *it = mut_fn(*it);
+ }
+ 
+ template<typename MutationFunc, typename T, std::size_t Size>
+ bool vector_test(const T (&arr)[Size])
+ {
+   bool ok;
+   T out_arr[Size];
+   T out_mut_arr[Size];
+   #pragma omp target map(from: ok, out_arr[:Size], out_mut_arr[:Size]) \
+ 		     map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       {
+ 	std::vector<T> vector(arr, arr + Size);
+ 	VERIFY (validate_sequential_elements(vector.begin(), vector.end(),
+ 					     arr, arr + Size));
+ 	simple_copy(vector.begin(), vector.end(), out_arr);
+ 	simple_mutate(vector.begin(), vector.end(), MutationFunc());
+ 	VERIFY (validate_sequential_elements(vector.begin(), vector.end(),
+ 					     arr, arr + Size, MutationFunc()));
+ 	simple_copy(vector.begin(), vector.end(), out_mut_arr);
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   VERIFY_NON_TARGET (validate_sequential_elements(out_arr, out_arr + Size,
+ 						  arr, arr + Size));
+   VERIFY_NON_TARGET (validate_sequential_elements(out_mut_arr, out_mut_arr + Size,
+ 						  arr, arr + Size, MutationFunc()));
+   return true;
+ }
+ 
+ template<typename MutationFunc, typename T, std::size_t Size>
+ bool deque_test(const T (&arr)[Size])
+ {
+   bool ok;
+   T out_arr[Size];
+   T out_mut_arr[Size];
+   #pragma omp target map(from: ok, out_arr[:Size], out_mut_arr[:Size]) \
+ 		     map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       {
+ 	std::deque<T> deque(arr, arr + Size);
+ 	VERIFY (validate_sequential_elements(deque.begin(), deque.end(),
+ 					     arr, arr + Size));
+ 	simple_copy(deque.begin(), deque.end(), out_arr);
+ 	simple_mutate(deque.begin(), deque.end(), MutationFunc());
+ 	VERIFY (validate_sequential_elements(deque.begin(), deque.end(),
+ 					     arr, arr + Size, MutationFunc()));
+ 	simple_copy(deque.begin(), deque.end(), out_mut_arr);
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   VERIFY_NON_TARGET (validate_sequential_elements(out_arr, out_arr + Size,
+ 						  arr, arr + Size));
+   VERIFY_NON_TARGET (validate_sequential_elements(out_mut_arr, out_mut_arr + Size,
+ 						  arr, arr + Size, MutationFunc()));
+   return true;
+ }
+ 
+ template<typename MutationFunc, typename T, std::size_t Size>
+ bool list_test(const T (&arr)[Size])
+ {
+   bool ok;
+   T out_arr[Size];
+   T out_mut_arr[Size];
+   #pragma omp target map(from: ok, out_arr[:Size], out_mut_arr[:Size]) \
+ 		     map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       {
+ 	std::list<T> list(arr, arr + Size);
+ 	VERIFY (validate_sequential_elements(list.begin(), list.end(),
+ 					     arr, arr + Size));
+ 	simple_copy(list.begin(), list.end(), out_arr);
+ 	simple_mutate(list.begin(), list.end(), MutationFunc());
+ 	VERIFY (validate_sequential_elements(list.begin(), list.end(),
+ 					     arr, arr + Size, MutationFunc()));
+ 	simple_copy(list.begin(), list.end(), out_mut_arr);
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   VERIFY_NON_TARGET (validate_sequential_elements(out_arr, out_arr + Size,
+ 						  arr, arr + Size));
+   VERIFY_NON_TARGET (validate_sequential_elements(out_mut_arr, out_mut_arr + Size,
+ 						  arr, arr + Size, MutationFunc()));
+   return true;
+ }
+ 
+ template<typename T>
+ const T& get_key(const T& arg) BL_NOEXCEPT
+   { return arg; }
+ template<typename K, typename V>
+ const K& get_key(const std::pair<K, V>& pair) BL_NOEXCEPT
+   { return pair.first; }
+ template<typename T>
+ const T& get_value(const T& arg) BL_NOEXCEPT
+   { return arg; }
+ template<typename K, typename V>
+ const K& get_value(const std::pair<K, V>& pair) BL_NOEXCEPT
+   { return pair.second; }
+ 
+ template<typename T>
+ struct key_type { typedef T type; };
+ template<typename K, typename V>
+ struct key_type<std::pair<K, V> > { typedef K type; };
+ 
+ template<typename Proj, typename Container, typename It>
+ bool validate_associative(const Container& container,
+ 			  const It compare_begin,
+ 			  const It compare_end,
+ 			  Proj proj) BL_NOEXCEPT
+ {
+   const typename Container::const_iterator elem_end = container.end();
+   for (It compare_it = compare_begin; compare_it != compare_end; ++compare_it)
+     {
+       const typename Container::const_iterator elem_it = container.find(get_key(*compare_it));
+       VERIFY_NON_TARGET (elem_it != elem_end);
+       VERIFY_NON_TARGET (proj(get_value(*compare_it)) == get_value(*elem_it));
+     }
+   return true;
+ }
+ 
+ template<typename Container, typename It>
+ bool validate_associative(const Container& container,
+ 			  const It compare_begin,
+ 			  const It compare_end) BL_NOEXCEPT
+ {
+   return validate_associative(container, compare_begin, compare_end, identity_func());
+ }
+ 
+ template<typename It, typename MutateFn>
+ void simple_mutate_map(const It begin, const It end, MutateFn mut_fn) BL_NOEXCEPT
+ {
+   for (It it = begin; it != end; ++it)
+     it->second = mut_fn(it->second);
+ }
+ 
+ template<typename It, typename OutIter>
+ void simple_copy_unique(const It begin, const It end, OutIter out) BL_NOEXCEPT
+ {
+   /* In case anyone reads this, I want it to be known that I hate c++98.  */
+   typedef typename key_type<typename std::iterator_traits<It>::value_type>::type key_t;
+   std::set<key_t> already_seen;
+   for (It it = begin; it != end; ++it, ++out)
+     {
+       key_t key = get_key(*it);
+       if (already_seen.find(key) != already_seen.end())
+ 	continue;
+       already_seen.insert(key);
+       *out = *it;
+     }
+ }
+ 
+ template<typename MutationFunc, typename K, typename V, std::size_t Size>
+ bool map_test(const std::pair<K, V> (&arr)[Size])
+ {
+   std::map<K, V> reference_map(arr, arr + Size);
+   bool ok;
+   /* Both sizes should be the same.  */
+   std::pair<K, V> out_pairs[Size];
+   std::size_t out_size;
+   std::pair<K, V> out_pairs_mut[Size];
+   std::size_t out_size_mut;
+   #pragma omp target map(from: ok, out_pairs[:Size], out_size, \
+ 			       out_pairs_mut[:Size], out_size_mut) \
+ 		     map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       {
+ 	std::vector<std::pair<K, V> > unique_elems;
+ 	simple_copy_unique(arr, arr + Size,
+ 			   std::back_insert_iterator<std::vector<std::pair<K, V> > >(unique_elems));
+ 
+ 	std::map<K, V> map(arr, arr + Size);
+ 	VERIFY (validate_associative(map, unique_elems.begin(), unique_elems.end()));
+ 	simple_copy(map.begin(), map.end(), out_pairs);
+ 	out_size = map.size();
+ 	simple_mutate_map(map.begin(), map.end(), MutationFunc());
+ 	VERIFY (validate_associative(map, unique_elems.begin(), unique_elems.end(),
+ 				     MutationFunc()));
+ 	simple_copy(map.begin(), map.end(), out_pairs_mut);
+ 	out_size_mut = map.size();
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   VERIFY_NON_TARGET (out_size == out_size_mut);
+   VERIFY_NON_TARGET (validate_associative(reference_map,
+ 					  out_pairs, out_pairs + out_size));
+   simple_mutate_map(reference_map.begin(), reference_map.end(), MutationFunc());
+   VERIFY_NON_TARGET (validate_associative(reference_map,
+ 					  out_pairs_mut, out_pairs_mut + out_size_mut));
+   return true;
+ }
+ 
+ template<typename T, std::size_t Size>
+ bool set_test(const T (&arr)[Size])
+ {
+   std::set<T> reference_set(arr, arr + Size);
+   bool ok;
+   /* Both sizes should be the same.  */
+   T out_arr[Size];
+   std::size_t out_size;
+   #pragma omp target map(from: ok, out_arr[:Size], out_size) \
+ 		     map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       {
+ 	std::vector<T> unique_elems;
+ 	simple_copy_unique(arr, arr + Size,
+ 			   std::back_insert_iterator<std::vector<T> >(unique_elems));
+ 
+ 	std::set<T> set(arr, arr + Size);
+ 	VERIFY (validate_associative(set, unique_elems.begin(), unique_elems.end()));
+ 	simple_copy(set.begin(), set.end(), out_arr);
+ 	out_size = set.size();
+ 	/* Sets can't be mutated, we could create another set with mutated
+ 	   but it gets a little annoying and probably isn't an interesting test.  */
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   VERIFY_NON_TARGET (validate_associative(reference_set,
+ 					  out_arr, out_arr + out_size));
+   return true;
+ }
+ 
+ template<typename Proj, typename Container, typename It>
+ bool validate_multi_associative(const Container& container,
+ 				const It compare_begin,
+ 				const It compare_end,
+ 				Proj proj) BL_NOEXCEPT
+ {
+   /* Once again, for the poor soul reviewing these, I hate c++98.  */
+   typedef typename key_type<typename std::iterator_traits<It>::value_type>::type key_t;
+   typedef std::map<key_t, std::size_t> counter_map; 
+   counter_map key_count_map;
+   for (It it = compare_begin; it != compare_end; ++it)
+     {
+       const key_t& key = get_key(*it);
+       typename counter_map::iterator counter_it
+ 	= key_count_map.find(key);
+       if (counter_it != key_count_map.end())
+ 	++counter_it->second;
+       else
+ 	key_count_map.insert(std::pair<const key_t, std::size_t>(key, std::size_t(1)));
+     }
+   const typename Container::const_iterator elem_end = container.end();
+   for (It compare_it = compare_begin; compare_it != compare_end; ++compare_it)
+     {
+       const key_t& key = get_key(*compare_it);
+       typename counter_map::iterator count_it = key_count_map.find(key);
+       std::size_t key_count = count_it != key_count_map.end() ? count_it->second
+ 							      : std::size_t(0);
+       VERIFY_NON_TARGET (key_count > std::size_t(0) && "this will never happen");
+       /* This gets tested multiple times but that should be fine.  */
+       VERIFY_NON_TARGET (key_count == container.count(key));
+       typename Container::const_iterator elem_it = container.find(key);
+       /* This will never happen if the previous case passed.  */
+       VERIFY_NON_TARGET (elem_it != elem_end);
+       bool found_element = false;
+       for (; elem_it != elem_end; ++elem_it)
+ 	if (proj(get_value(*compare_it)) == get_value(*elem_it))
+ 	  {
+ 	    found_element = true;
+ 	    break;
+ 	  }
+       VERIFY_NON_TARGET (found_element);
+     }
+   return true;
+ }
+ 
+ template<typename Container, typename It>
+ bool validate_multi_associative(const Container& container,
+ 				const It compare_begin,
+ 				const It compare_end) BL_NOEXCEPT
+ {
+   return validate_multi_associative(container, compare_begin, compare_end, identity_func());
+ }
+ 
+ template<typename MutationFunc, typename K, typename V, std::size_t Size>
+ bool multimap_test(const std::pair<K, V> (&arr)[Size])
+ {
+   std::multimap<K, V> reference_multimap(arr, arr + Size);
+   bool ok;
+   std::pair<K, V> out_pairs[Size];
+   std::pair<K, V> out_pairs_mut[Size];
+   #pragma omp target map(from: ok, out_pairs[:Size], out_pairs_mut[:Size]) \
+ 		     map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       {
+ 	std::multimap<K, V> multimap(arr, arr + Size);
+ 	VERIFY (validate_multi_associative(multimap, arr, arr + Size));
+ 	simple_copy(multimap.begin(), multimap.end(), out_pairs);
+ 	simple_mutate_map(multimap.begin(), multimap.end(), MutationFunc());
+ 	VERIFY (validate_multi_associative(multimap, arr, arr + Size, MutationFunc()));
+ 	simple_copy(multimap.begin(), multimap.end(), out_pairs_mut);
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   VERIFY_NON_TARGET (validate_multi_associative(reference_multimap,
+ 						out_pairs, out_pairs + Size));
+   simple_mutate_map(reference_multimap.begin(), reference_multimap.end(), MutationFunc());
+   VERIFY_NON_TARGET (validate_multi_associative(reference_multimap,
+ 						out_pairs_mut, out_pairs_mut + Size));
+   return true;
+ }
+ 
+ template<typename T, std::size_t Size>
+ bool multiset_test(const T (&arr)[Size])
+ {
+   std::multiset<T> reference_multiset(arr, arr + Size);
+   bool ok;
+   T out_arr[Size];
+   #pragma omp target map(from: ok, out_arr[:Size]) \
+ 		     map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       {
+ 	std::multiset<T> set(arr, arr + Size);
+ 	VERIFY (validate_multi_associative(set, arr, arr + Size));
+ 	simple_copy(set.begin(), set.end(), out_arr);
+ 	/* Sets can't be mutated, we could create another set with mutated
+ 	   but it gets a little annoying and probably isn't an interesting test.  */
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   VERIFY_NON_TARGET (validate_multi_associative(reference_multiset,
+ 						out_arr, out_arr + Size));
+   return true;
+ }
+ 
+ #if __cplusplus >= 201103L
+ 
+ template<typename MutationFunc, typename T, std::size_t Size>
+ bool array_test(const T (&arr)[Size])
+ {
+   bool ok;
+   T out_arr[Size];
+   T out_mut_arr[Size];
+   #pragma omp target map(from: ok, out_arr[:Size], out_mut_arr[:Size]) \
+ 		     map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       {
+ 	std::array<T, Size> std_array{};
+ 	/* Special case for std::array since it can't be initialized
+ 	   with iterators.  */
+ 	{
+ 	  T zero_val = T{};
+ 	  for (auto it = std_array.begin(); it != std_array.end(); ++it)
+ 	    VERIFY (*it == zero_val);
+ 	}
+ 	simple_copy(arr, arr + Size, std_array.begin());
+ 	VERIFY (validate_sequential_elements(std_array.begin(), std_array.end(),
+ 					     arr, arr + Size));
+ 	simple_copy(std_array.begin(), std_array.end(), out_arr);
+ 	simple_mutate(std_array.begin(), std_array.end(), MutationFunc());
+ 	VERIFY (validate_sequential_elements(std_array.begin(), std_array.end(),
+ 					     arr, arr + Size, MutationFunc()));
+ 	simple_copy(std_array.begin(), std_array.end(), out_mut_arr);
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   VERIFY_NON_TARGET (validate_sequential_elements(out_arr, out_arr + Size,
+ 						  arr, arr + Size));
+   VERIFY_NON_TARGET (validate_sequential_elements(out_mut_arr, out_mut_arr + Size,
+ 						  arr, arr + Size, MutationFunc()));
+   return true;
+ }
+ 
+ template<typename MutationFunc, typename T, std::size_t Size>
+ bool forward_list_test(const T (&arr)[Size])
+ {
+   bool ok;
+   T out_arr[Size];
+   T out_mut_arr[Size];
+   #pragma omp target map(from: ok, out_arr[:Size], out_mut_arr[:Size]) \
+ 		     map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       {
+ 	std::forward_list<T> fwd_list(arr, arr + Size);
+ 	VERIFY (validate_sequential_elements(fwd_list.begin(), fwd_list.end(),
+ 					     arr, arr + Size));
+ 	simple_copy(fwd_list.begin(), fwd_list.end(), out_arr);
+ 	simple_mutate(fwd_list.begin(), fwd_list.end(), MutationFunc());
+ 	VERIFY (validate_sequential_elements(fwd_list.begin(), fwd_list.end(),
+ 					     arr, arr + Size, MutationFunc()));
+ 	simple_copy(fwd_list.begin(), fwd_list.end(), out_mut_arr);
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   VERIFY_NON_TARGET (validate_sequential_elements(out_arr, out_arr + Size,
+ 						  arr, arr + Size));
+   VERIFY_NON_TARGET (validate_sequential_elements(out_mut_arr, out_mut_arr + Size,
+ 						  arr, arr + Size, MutationFunc()));
+   return true;
+ }
+ 
+ template<typename MutationFunc, typename K, typename V, std::size_t Size>
+ bool unordered_map_test(const std::pair<K, V> (&arr)[Size])
+ {
+   std::unordered_map<K, V> reference_map(arr, arr + Size);
+   bool ok;
+   /* Both sizes should be the same.  */
+   std::pair<K, V> out_pairs[Size];
+   std::size_t out_size;
+   std::pair<K, V> out_pairs_mut[Size];
+   std::size_t out_size_mut;
+   #pragma omp target map(from: ok, out_pairs[:Size], out_size, \
+ 			       out_pairs_mut[:Size], out_size_mut) \
+ 		     map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       {
+ 	std::vector<std::pair<K, V> > unique_elems;
+ 	simple_copy_unique(arr, arr + Size,
+ 			   std::back_insert_iterator<std::vector<std::pair<K, V> > >(unique_elems));
+ 
+ 	std::unordered_map<K, V> map(arr, arr + Size);
+ 	VERIFY (validate_associative(map, unique_elems.begin(), unique_elems.end()));
+ 	simple_copy(map.begin(), map.end(), out_pairs);
+ 	out_size = map.size();
+ 	simple_mutate_map(map.begin(), map.end(), MutationFunc());
+ 	VERIFY (validate_associative(map, unique_elems.begin(), unique_elems.end(),
+ 				     MutationFunc()));
+ 	simple_copy(map.begin(), map.end(), out_pairs_mut);
+ 	out_size_mut = map.size();
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   VERIFY_NON_TARGET (out_size == out_size_mut);
+   VERIFY_NON_TARGET (validate_associative(reference_map,
+ 					  out_pairs, out_pairs + out_size));
+   simple_mutate_map(reference_map.begin(), reference_map.end(), MutationFunc());
+   VERIFY_NON_TARGET (validate_associative(reference_map,
+ 					  out_pairs_mut, out_pairs_mut + out_size_mut));
+   return true;
+ }
+ 
+ template<typename T, std::size_t Size>
+ bool unordered_set_test(const T (&arr)[Size])
+ {
+   std::unordered_set<T> reference_set(arr, arr + Size);
+   bool ok;
+   /* Both sizes should be the same.  */
+   T out_arr[Size];
+   std::size_t out_size;
+   #pragma omp target map(from: ok, out_arr[:Size], out_size) \
+ 		     map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       {
+ 	std::vector<T> unique_elems;
+ 	simple_copy_unique(arr, arr + Size,
+ 			   std::back_insert_iterator<std::vector<T> >(unique_elems));
+ 
+ 	std::unordered_set<T> set(arr, arr + Size);
+ 	VERIFY (validate_associative(set, unique_elems.begin(), unique_elems.end()));
+ 	simple_copy(set.begin(), set.end(), out_arr);
+ 	out_size = set.size();
+ 	/* Sets can't be mutated, we could create another set with mutated
+ 	   but it gets a little annoying and probably isn't an interesting test.  */
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   VERIFY_NON_TARGET (validate_associative(reference_set,
+ 					  out_arr, out_arr + out_size));
+   return true;
+ }
+ 
+ template<typename MutationFunc, typename K, typename V, std::size_t Size>
+ bool unordered_multimap_test(const std::pair<K, V> (&arr)[Size])
+ {
+   std::unordered_multimap<K, V> reference_multimap(arr, arr + Size);
+   bool ok;
+   std::pair<K, V> out_pairs[Size];
+   std::pair<K, V> out_pairs_mut[Size];
+   #pragma omp target map(from: ok, out_pairs[:Size], out_pairs_mut[:Size]) \
+ 		     map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       {
+ 	std::unordered_multimap<K, V> multimap(arr, arr + Size);
+ 	VERIFY (validate_multi_associative(multimap, arr, arr + Size));
+ 	simple_copy(multimap.begin(), multimap.end(), out_pairs);
+ 	simple_mutate_map(multimap.begin(), multimap.end(), MutationFunc());
+ 	VERIFY (validate_multi_associative(multimap, arr, arr + Size, MutationFunc()));
+ 	simple_copy(multimap.begin(), multimap.end(), out_pairs_mut);
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   VERIFY_NON_TARGET (validate_multi_associative(reference_multimap,
+ 						out_pairs, out_pairs + Size));
+   simple_mutate_map(reference_multimap.begin(), reference_multimap.end(), MutationFunc());
+   VERIFY_NON_TARGET (validate_multi_associative(reference_multimap,
+ 						out_pairs_mut, out_pairs_mut + Size));
+   return true;
+ }
+ 
+ template<typename T, std::size_t Size>
+ bool unordered_multiset_test(const T (&arr)[Size])
+ {
+   std::unordered_multiset<T> reference_multiset(arr, arr + Size);
+   bool ok;
+   T out_arr[Size];
+   #pragma omp target map(from: ok, out_arr[:Size]) \
+ 		     map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       {
+ 	std::unordered_multiset<T> set(arr, arr + Size);
+ 	VERIFY (validate_multi_associative(set, arr, arr + Size));
+ 	simple_copy(set.begin(), set.end(), out_arr);
+ 	/* Sets can't be mutated, we could create another set with mutated
+ 	   but it gets a little annoying and probably isn't an interesting test.  */
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   VERIFY_NON_TARGET (validate_multi_associative(reference_multiset,
+ 						out_arr, out_arr + Size));
+   return true;
+ }
+ 
+ #else
+ template<typename, typename T, std::size_t Size> bool array_test(const T (&arr)[Size]) { return true; }
+ template<typename, typename T, std::size_t Size> bool forward_list_test(const T (&arr)[Size]) { return true; }
+ template<typename, typename T, std::size_t Size> bool unordered_map_test(const T (&arr)[Size]) { return true; }
+ template<typename T, std::size_t Size> bool unordered_set_test(const T (&arr)[Size]) { return true; }
+ template<typename, typename T, std::size_t Size> bool unordered_multimap_test(const T (&arr)[Size]) { return true; }
+ template<typename T, std::size_t Size> bool unordered_multiset_test(const T (&arr)[Size]) { return true; }
+ #endif
+ 
+ /* This clamps to the maximum value to guard against overflowing,
+    assuming std::numeric_limits is specialized for T.  */
+ struct multiply_by_2
+ {
+   template<typename T>
+   typename enable_if<std::numeric_limits<T>::is_specialized, T>::type
+   operator()(T arg) const BL_NOEXCEPT {
+     if (arg < static_cast<T>(0))
+       {
+ 	if (std::numeric_limits<T>::min() / static_cast<T>(2) >= arg)
+ 	  return std::numeric_limits<T>::min();
+       }
+     else
+       {
+ 	if (std::numeric_limits<T>::max() / static_cast<T>(2) <= arg)
+ 	  return std::numeric_limits<T>::max();
+       }
+     return arg * 2;
+   }
+   template<typename T>
+   typename enable_if<!std::numeric_limits<T>::is_specialized, T>::type
+   operator()(T arg) const BL_NOEXCEPT {
+     return arg * 2;
+   }
+ };
+ 
+ int main()
+ {
+   int data[8] = {0, 1, 2, 3, 4, 5, 6, 7};
+   std::pair<int, int> pairs[10] = {std::pair<int, int>( 1,  2),
+ 				   std::pair<int, int>( 2,  4),
+ 				   std::pair<int, int>( 3,  6),
+ 				   std::pair<int, int>( 4,  8),
+ 				   std::pair<int, int>( 5, 10),
+ 				   std::pair<int, int>( 6, 12),
+ 				   std::pair<int, int>( 7, 14),
+ 				   std::pair<int, int>( 8, 16),
+ 				   std::pair<int, int>( 9, 18),
+ 				   std::pair<int, int>(10, 20)};
+   const bool vec_res                = vector_test<multiply_by_2>(data);
+   const bool deque_res              = deque_test<multiply_by_2>(data);
+   const bool list_res               = list_test<multiply_by_2>(data);
+   const bool map_res                = map_test<multiply_by_2>(pairs);
+   const bool set_res                = set_test(data);
+   const bool multimap_res           = multimap_test<multiply_by_2>(pairs);
+   const bool multiset_res           = multiset_test(data);
+   const bool array_res              = array_test<multiply_by_2>(data);
+   const bool forward_list_res       = forward_list_test<multiply_by_2>(data);
+   const bool unordered_map_res      = unordered_map_test<multiply_by_2>(pairs);
+   const bool unordered_set_res      = unordered_set_test(data);
+   const bool unordered_multimap_res = unordered_multimap_test<multiply_by_2>(pairs);
+   const bool unordered_multiset_res = unordered_multiset_test(data);
+   std::printf("vector            : %s\n", vec_res                ? "PASS" : "FAIL");
+   std::printf("deque             : %s\n", deque_res              ? "PASS" : "FAIL");
+   std::printf("list              : %s\n", list_res               ? "PASS" : "FAIL");
+   std::printf("map               : %s\n", map_res                ? "PASS" : "FAIL");
+   std::printf("set               : %s\n", set_res                ? "PASS" : "FAIL");
+   std::printf("multimap          : %s\n", multimap_res           ? "PASS" : "FAIL");
+   std::printf("multiset          : %s\n", multiset_res           ? "PASS" : "FAIL");
+   std::printf("array             : %s\n", array_res              ? "PASS" : "FAIL");
+   std::printf("forward_list      : %s\n", forward_list_res       ? "PASS" : "FAIL");
+   std::printf("unordered_map     : %s\n", unordered_map_res      ? "PASS" : "FAIL");
+   std::printf("unordered_set     : %s\n", unordered_set_res      ? "PASS" : "FAIL");
+   std::printf("unordered_multimap: %s\n", unordered_multimap_res ? "PASS" : "FAIL");
+   std::printf("unordered_multiset: %s\n", unordered_multiset_res ? "PASS" : "FAIL");
+   const bool ok = vec_res
+ 		  && deque_res
+ 		  && list_res
+ 		  && map_res
+ 		  && set_res
+ 		  && multimap_res
+ 		  && multiset_res
+ 		  && array_res
+ 		  && forward_list_res
+ 		  && unordered_map_res
+ 		  && unordered_set_res
+ 		  && unordered_multimap_res
+ 		  && unordered_multiset_res;
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-2000.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-2000.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-2000.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-2000.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,32 ----
+ /* Tiny tuple test.  */
+ 
+ #include <tuple>
+ 
+ #include "target-flex-common.h"
+ 
+ bool test(int arg)
+ {
+   bool ok;
+   int out;
+   std::tuple tup = {'a', arg, 3.14f};
+   #pragma omp target map(from: ok, out) map(to: tup)
+     {
+       bool inner_ok = true;
+       {
+ 	VERIFY (std::get<0>(tup) == 'a');
+ 	out = std::get<1>(tup);
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   VERIFY_NON_TARGET (out == arg);
+   return true;
+ }
+ 
+ int main()
+ {
+   volatile int arg = 42u;
+   return test(arg) ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-2001.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-2001.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-2001.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-2001.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,61 ----
+ /* { dg-additional-options "-std=c++20" } */
+ 
+ /* Functional  */
+ 
+ #include <functional>
+ #include <utility>
+ 
+ #include "target-flex-common.h"
+ 
+ template<typename T,typename Fn>
+ auto invoke_unary(T&& a, Fn&& fn) noexcept
+ {
+   return std::invoke(std::forward<Fn>(fn),
+ 		     std::forward<T>(a));
+ }
+ 
+ template<typename T, typename U, typename Fn>
+ auto invoke_binary(T&& a, U&& b, Fn&& fn) noexcept
+ {
+   return std::invoke(std::forward<Fn>(fn),
+ 		     std::forward<T>(a),
+ 		     std::forward<U>(b));
+ }
+ 
+ bool test(unsigned arg)
+ {
+   bool ok;
+   #pragma omp target map(from: ok) map(to: arg)
+     {
+       bool inner_ok = true;
+       {
+ 	VERIFY (std::plus{}(arg, 2) == arg + 2);
+ 	auto bound_plus_arg = std::bind_front(std::plus{}, arg);
+ 	VERIFY (bound_plus_arg(10) == arg + 10);
+ 	VERIFY (bound_plus_arg(20) == arg + 20);
+ 
+ 	VERIFY (std::not_fn(std::not_equal_to{})(arg, arg));
+ 	VERIFY (invoke_binary(arg, arg, std::not_fn(std::not_equal_to{})));
+ 	auto bound_equals_arg = std::bind_front(std::not_fn(std::not_equal_to{}), arg);
+ 	VERIFY (bound_equals_arg(arg));
+ 	VERIFY (std::not_fn(bound_equals_arg)(arg + 1));
+ 	VERIFY (invoke_unary(arg, bound_equals_arg));
+ 
+ 	VERIFY (std::not_fn(std::ranges::not_equal_to{})(arg, arg));
+ 	VERIFY (invoke_binary(arg, arg, std::not_fn(std::ranges::not_equal_to{})));
+ 	auto bound_ranges_equals_arg = std::bind_front(std::not_fn(std::ranges::not_equal_to{}), arg);
+ 	VERIFY (bound_ranges_equals_arg(arg));
+ 	VERIFY (std::not_fn(bound_ranges_equals_arg)(arg + 1));
+ 	VERIFY (invoke_unary(arg, bound_ranges_equals_arg));
+       }
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ int main()
+ {
+   volatile unsigned arg = 42u;
+   return test(arg) ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-2002.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-2002.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-2002.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-2002.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,97 ----
+ /* { dg-additional-options "-std=c++23" } */
+ 
+ /* expected/optional  */
+ 
+ #include <optional>
+ #include <expected>
+ 
+ #include "target-flex-common.h"
+ 
+ std::optional<unsigned> make_optional(bool b, unsigned arg = 0u) noexcept
+ {
+   if (!b)
+     return std::nullopt;
+   return {arg};
+ }
+ 
+ bool test_optional(unsigned arg)
+ {
+   bool ok;
+   #pragma omp target map(from: ok) map(to: arg)
+     {
+       bool inner_ok = true;
+       {
+ 	auto null_opt = make_optional(false);
+ 	VERIFY (!null_opt);
+ 	VERIFY (!null_opt.has_value());
+ 	VERIFY (null_opt.value_or(arg * 2u) == arg * 2u);
+ 	VERIFY (null_opt.or_else([&](){ return std::optional<unsigned>{arg}; })
+ 			.transform([](int a){ return a * 2u; })
+ 			.value_or(0) == arg * 2u);
+ 
+ 	auto opt = make_optional(true, arg);
+ 	VERIFY (opt);
+ 	VERIFY (opt.has_value());
+ 	VERIFY (opt.value() == arg);
+ 	VERIFY (*opt == arg);
+ 	VERIFY (opt.value_or(arg + 42) == arg);
+ 	VERIFY (opt.or_else([&](){ return std::optional<unsigned>{arg + 42}; })
+ 		   .transform([](int a){ return a * 2u; })
+ 		   .value_or(0) == arg * 2u);
+       }
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ struct my_error
+ {
+   int _e;
+ };
+ 
+ std::expected<unsigned, my_error> make_expected(bool b, unsigned arg = 0u) noexcept
+ {
+   if (!b)
+     return std::unexpected{my_error{-1}};
+   return {arg};
+ }
+ 
+ bool test_expected(unsigned arg)
+ {
+   bool ok;
+   #pragma omp target map(from: ok) map(to: arg)
+     {
+       bool inner_ok = true;
+       {
+ 	auto unexpected = make_expected(false);
+ 	VERIFY (!unexpected);
+ 	VERIFY (!unexpected.has_value());
+ 	VERIFY (unexpected.error()._e == -1);
+ 	VERIFY (unexpected.value_or(arg * 2u) == arg * 2u);
+ 	VERIFY (unexpected.or_else([&](my_error e){ return std::expected<unsigned, my_error>{arg}; })
+ 			  .transform([](int a){ return a * 2u; })
+ 			  .value_or(0) == arg * 2u);
+ 
+ 	auto expected = make_expected(true, arg);
+ 	VERIFY (expected);
+ 	VERIFY (expected.has_value());
+ 	VERIFY (expected.value() == arg);
+ 	VERIFY (*expected == arg);
+ 	VERIFY (expected.value_or(arg + 42) == arg);
+ 	VERIFY (expected.or_else([&](my_error e){ return std::expected<unsigned, my_error>{std::unexpected{e}}; })
+ 			.transform([](int a){ return a * 2u; })
+ 			.value_or(0) == arg * 2u);
+       }
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ int main()
+ {
+   volatile unsigned arg = 42;
+   return test_optional(arg)
+ 	 && test_expected(arg) ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-2003.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-2003.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-2003.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-2003.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,176 ----
+ /* { dg-additional-options "-std=c++20" } */
+ 
+ /* bit_cast and memcpy  */
+ 
+ #include <bit>
+ #include <cstring>
+ 
+ #include "target-flex-common.h"
+ 
+ struct S0
+ {
+   int _v0;
+   char _v1;
+   long long _v2;
+ };
+ 
+ struct S1
+ {
+   int _v0;
+   char _v1;
+   long long _v2;
+ };
+ 
+ bool test_bit_cast(int arg)
+ {
+   bool ok;
+   S1 s1_out;
+   #pragma omp target map(from: ok, s1_out) map(to: arg)
+     {
+       bool inner_ok = true;
+       {
+ 	long long v = static_cast<long long>(arg + 42ll);
+ 	S0 s = {arg, 'a', v};
+ 	VERIFY (std::bit_cast<S1>(s)._v0 == arg);
+ 	VERIFY (std::bit_cast<S1>(s)._v1 == 'a');
+ 	VERIFY (std::bit_cast<S1>(s)._v2 == v);
+ 	s1_out = std::bit_cast<S1>(s);
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   long long v = static_cast<long long>(arg + 42ll);
+   VERIFY_NON_TARGET (std::bit_cast<S0>(s1_out)._v0 == arg);
+   VERIFY_NON_TARGET (std::bit_cast<S0>(s1_out)._v1 == 'a');
+   VERIFY_NON_TARGET (std::bit_cast<S0>(s1_out)._v2 == v);
+   return true;
+ }
+ 
+ 
+ struct OutStruct
+ {
+   std::size_t _id;
+   void *_next;
+ };
+ 
+ struct Extendable1
+ {
+   std::size_t _id;
+   void *_next;
+   int _v;
+ };
+ 
+ struct Extendable2
+ {
+   std::size_t _id;
+   void *_next;
+   char _str[256];
+ };
+ 
+ struct Extendable3
+ {
+   std::size_t _id;
+   void *_next;
+   const int *_nums;
+   std::size_t _size;
+ };
+ 
+ struct ExtendableUnknown
+ {
+   std::size_t _id;
+   void *_next;
+ };
+ 
+ template<typename To, std::size_t Id>
+ To *get_extendable(void *p)
+ {
+   while (p != nullptr)
+     {
+       OutStruct out;
+       std::memcpy(&out, p, sizeof(OutStruct));
+       if (out._id == Id)
+ 	return static_cast<To *>(p);
+       p = out._next;
+     }
+   return nullptr;
+ }
+ 
+ bool test_memcpy(int arg, const int *nums, std::size_t nums_size)
+ {
+   bool ok;
+   Extendable2 e2_out;
+   #pragma omp target map(from: ok, e2_out) map(to: arg, nums[:nums_size], nums_size)
+     {
+       bool inner_ok = true;
+       {
+ 	Extendable3 e3 = {3u, nullptr, nums, nums_size};
+ 	ExtendableUnknown u1 = {100u, &e3};
+ 	Extendable2 e2 = {2u, &u1, {'H', 'e', 'l', 'l', 'o', '!', '\000'}};
+ 	ExtendableUnknown u2 = {101u, &e2};
+ 	ExtendableUnknown u3 = {102u, &u2};
+ 	ExtendableUnknown u4 = {142u, &u3};
+ 	Extendable1 e1 = {1u, &u4, arg};
+ 
+ 	void *p = &e1;
+ 	while (p != nullptr)
+ 	  {
+ 	    /* You can always cast a pointer to a struct to a pointer to
+ 	       the type of it's first member.  */
+ 	    switch (*static_cast<std::size_t *>(p))
+ 	      {
+ 		case 1:
+ 		  {
+ 		    Extendable1 *e1_p = static_cast<Extendable1 *>(p);
+ 		    p = e1_p->_next;
+ 		    VERIFY (e1_p->_v == arg);
+ 		    break;
+ 		  }
+ 		case 2:
+ 		  {
+ 		    Extendable2 *e2_p = static_cast<Extendable2 *>(p);
+ 		    p = e2_p->_next;
+ 		    VERIFY (std::strcmp(e2_p->_str, "Hello!") == 0);
+ 		    break;
+ 		  }
+ 		case 3:
+ 		  {
+ 		    Extendable3 *e3_p = static_cast<Extendable3 *>(p);
+ 		    p = e3_p->_next;
+ 		    VERIFY (nums == e3_p->_nums);
+ 		    VERIFY (nums_size == e3_p->_size);
+ 		    break;
+ 		  }
+ 		default:
+ 		  {
+ 		    /* Casting to a pointer to OutStruct invokes undefined
+ 		       behavior though, memcpy is required to extract the _next
+ 		       member.  */
+ 		    OutStruct out;
+ 		    std::memcpy(&out, p, sizeof(OutStruct));
+ 		    p = out._next;
+ 		  }
+ 	      }
+ 	  }
+ 	Extendable2 *e2_p = get_extendable<Extendable2, 2u>(&e1);
+ 	VERIFY (e2_p != nullptr);
+ 	e2_out = *e2_p;
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   VERIFY_NON_TARGET (e2_out._id == 2u);
+   VERIFY_NON_TARGET (std::strcmp(e2_out._str, "Hello!") == 0);
+   return true;
+ }
+ 
+ int main()
+ {
+   volatile int arg = 42;
+   int arr[8] = {0, 1, 2, 3, 4, 5, 6, 7};
+   return test_bit_cast(arg)
+ 	 && test_memcpy(arg, arr, 8) ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-30.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-30.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-30.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-30.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,51 ----
+ /* std::initializer_list in target region.  */
+ 
+ #include <initializer_list>
+ #include <array>
+ 
+ #include "target-flex-common.h"
+ 
+ bool test_initializer_list(int arg)
+ {
+   static constexpr std::size_t out_arr_size = 7;
+   int out_arr[out_arr_size];
+   bool ok;
+   #pragma omp target map(from: ok, out_arr[:out_arr_size]) map(to: arg)
+     {
+       bool inner_ok = true;
+       {
+ 	auto il = {0, 1, 2, 3, 4, 5, arg};
+ 
+ 	int sum = 0;
+ 	for (auto const& e : il)
+ 	  sum += e;
+ 	VERIFY (sum == 0 + 1 + 2 + 3 + 4 + 5 + arg);
+ 
+ 	auto* out_it = out_arr;
+ 	const auto* const out_end = out_arr + out_arr_size;
+ 	for (auto const& e : il)
+ 	  {
+ 	    VERIFY (out_it != out_end);
+ 	    *out_it = e;
+ 	    ++out_it;
+ 	  }
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+ 
+   std::array<int, out_arr_size> reference_array = {0, 1, 2, 3, 4, 5, arg};
+   const auto *out_arr_it = out_arr;
+   for (auto const& e : reference_array)
+     VERIFY_NON_TARGET (e == *(out_arr_it++));
+ 
+   return true;
+ }
+ 
+ int main()
+ {
+   volatile int arg = 42;
+   return test_initializer_list(arg) ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-300.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-300.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-300.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-300.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,49 ----
+ /* { dg-additional-options -std=c++23 } */
+ 
+ /* numerics  */
+ 
+ #include <algorithm>
+ #include <numeric>
+ #include <ranges>
+ #include <span>
+ #include <vector>
+ 
+ //TODO PR120454 "C++ constexpr vs. OpenMP implicit mapping"
+ #pragma omp declare target(std::ranges::all_of, std::ranges::iota)
+ 
+ #include "target-flex-common.h"
+ 
+ namespace stdr = std::ranges;
+ 
+ bool test(std::size_t arg)
+ {
+   bool ok;
+   int midpoint_out;
+   std::vector<int> vec(arg);
+   int *data = vec.data();
+   std::size_t size = vec.size();
+   #pragma omp target defaultmap(none) map(from: ok, midpoint_out) map(tofrom: data[:size]) map(to: arg, size)
+     {
+       std::span span = {data, size};
+       bool inner_ok = true;
+       {
+ 	VERIFY (stdr::all_of(span, [](int v){ return v == int{}; }));
+ 	stdr::iota(span, 0);
+ 	midpoint_out = *std::midpoint(span.data(), span.data() + span.size());
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   VERIFY_NON_TARGET (stdr::equal(vec, std::views::iota(0, static_cast<int>(vec.size()))));
+   VERIFY_NON_TARGET (*std::midpoint(vec.data(), vec.data() + vec.size())
+ 		     == midpoint_out);
+   return true;
+ }
+ 
+ int main()
+ {
+   volatile std::size_t arg = 42;
+   return test(arg) ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-31.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-31.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-31.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-31.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,80 ----
+ /* std::initializer_list in target region.  */
+ 
+ #include <initializer_list>
+ 
+ #include "target-flex-common.h"
+ 
+ struct S0
+ {
+   int _v;
+   S0(std::initializer_list<int> il)
+     : _v(0)
+   {
+     for (auto const& e : il)
+       _v += e;
+   }
+ };
+ 
+ struct S1
+ {
+   int _v;
+   template<typename T>
+   S1(std::initializer_list<T> il)
+     : _v(0)
+   {
+     for (auto const& e : il)
+       _v += e;
+   }
+ };
+ 
+ template<typename T>
+ struct S2
+ {
+   T _v;
+   S2(std::initializer_list<T> il)
+     : _v(0)
+   {
+     for (auto const& e : il)
+       _v += e;
+   }
+ };
+ 
+ #if __cplusplus >= 201703L
+ template<typename T>
+ S2(std::initializer_list<T>) -> S2<T>;
+ #endif
+ 
+ bool test_initializer_list(int arg)
+ {
+   bool ok;
+   #pragma omp target map(from: ok) map(to: arg)
+     {
+       bool inner_ok = true;
+       {
+ 	static constexpr int partial_sum = 0 + 1 + 2 + 3 + 4 + 5;
+ 
+ 	S0 s0{0, 1, 2, 3, 4, 5, arg};
+ 	VERIFY (s0._v == partial_sum + arg);
+ 
+ 	S1 s1{0, 1, 2, 3, 4, 5, arg};
+ 	VERIFY (s1._v == partial_sum + arg);
+ 
+ 	S2<int> s2{0, 1, 2, 3, 4, 5, arg};
+ 	VERIFY (s2._v == partial_sum + arg);
+ 
+ 	#if __cplusplus >= 201703L
+ 	  S2 s2_ctad{0, 1, 2, 3, 4, 5, arg};
+ 	  VERIFY (s2_ctad._v == partial_sum + arg);
+ 	#endif
+       }
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ int main()
+ {
+   volatile int arg = 42;
+   return test_initializer_list(arg) ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-32.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-32.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-32.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-32.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,50 ----
+ /* std::initializer_list constructor of std::vector (explicit template arg) */
+ 
+ #include <vector>
+ #include <array>
+ 
+ #include "target-flex-common.h"
+ 
+ bool test_initializer_list(int arg)
+ {
+   static constexpr std::size_t out_arr_size = 7;
+   int out_arr[out_arr_size];
+   bool ok;
+   #pragma omp target map(from: ok, out_arr[:out_arr_size]) map(to: arg)
+     {
+       bool inner_ok = true;
+       {
+ 	std::vector<int> vec{0, 1, 2, 3, 4, 5, arg};
+ 	int sum = 0;
+ 	for (auto const& e : vec)
+ 	  sum += e;
+ 	VERIFY (sum == 0 + 1 + 2 + 3 + 4 + 5 + arg);
+ 
+ 	auto* out_it = out_arr;
+ 	const auto* const out_end = out_arr + out_arr_size;
+ 	for (auto const& e : vec)
+ 	  {
+ 	    VERIFY (out_it != out_end);
+ 	    *out_it = e;
+ 	    ++out_it;
+ 	  }
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+ 
+   std::array<int, out_arr_size> reference_array = {0, 1, 2, 3, 4, 5, arg};
+   const auto *out_arr_it = out_arr;
+   for (auto const& e : reference_array)
+     VERIFY_NON_TARGET (e == *(out_arr_it++));
+ 
+   return true;
+ }
+ 
+ int main()
+ {
+   volatile int arg = 42;
+   return test_initializer_list(arg) ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-33.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-33.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-33.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-33.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,52 ----
+ /* { dg-additional-options "-std=c++17" } */
+ 
+ /* deduced std::initializer_list constructor of std::vector (CTAD) */
+ 
+ #include <vector>
+ #include <array>
+ 
+ #include "target-flex-common.h"
+ 
+ bool test_initializer_list(int arg)
+ {
+   static constexpr std::size_t out_arr_size = 7;
+   int out_arr[out_arr_size];
+   bool ok;
+   #pragma omp target map(from: ok, out_arr[:out_arr_size]) map(to: arg)
+     {
+       bool inner_ok = true;
+       {
+ 	std::vector vec{0, 1, 2, 3, 4, 5, arg};
+ 	int sum = 0;
+ 	for (auto const& e : vec)
+ 	  sum += e;
+ 	VERIFY (sum == 0 + 1 + 2 + 3 + 4 + 5 + arg);
+ 
+ 	auto* out_it = out_arr;
+ 	const auto* const out_end = out_arr + out_arr_size;
+ 	for (auto const& e : vec)
+ 	  {
+ 	    VERIFY (out_it != out_end);
+ 	    *out_it = e;
+ 	    ++out_it;
+ 	  }
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+ 
+   std::array<int, out_arr_size> reference_array = {0, 1, 2, 3, 4, 5, arg};
+   const auto *out_arr_it = out_arr;
+   for (auto const& e : reference_array)
+     VERIFY_NON_TARGET (e == *(out_arr_it++));
+ 
+   return true;
+ }
+ 
+ int main()
+ {
+   volatile int arg = 42;
+   return test_initializer_list(arg) ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-41.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-41.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-41.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-41.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,94 ----
+ /* { dg-additional-options "-std=c++20" } */
+ 
+ /* <iterator> c++20  */
+ 
+ /* std::common_iterator uses std::variant.  */
+ 
+ #include <vector>
+ #include <iterator>
+ #include <span>
+ 
+ //TODO PR120454 "C++ constexpr vs. OpenMP implicit mapping"
+ #pragma omp declare target(std::ranges::distance, std::ranges::next)
+ 
+ #include "target-flex-common.h"
+ 
+ namespace stdr = std::ranges;
+ 
+ template<typename It0, typename It1>
+ bool simple_equal(const It0 begin0, const It0 end0,
+ 		  const It1 begin1, const It1 end1) BL_NOEXCEPT
+ {
+   It0 it0 = begin0;
+   It1 it1 = begin1;
+   for (; it0 != end0; ++it0, ++it1)
+     if (it1 == end1 || *it0 != *it1)
+       return false;
+   return true;
+ }
+ 
+ template<typename It, typename OutIt>
+ void simple_copy(const It begin, const It end, OutIt out) BL_NOEXCEPT
+ {
+   for (It it = begin; it != end; ++it, ++out)
+     *out = *it;
+ }
+ 
+ template<typename T, std::size_t Size>
+ bool test(const T (&arr)[Size])
+ {
+   bool ok;
+   T out_rev_arr[Size];
+   T out_fwd_arr[Size];
+   T out_first_half_arr[Size / 2];
+   #pragma omp target defaultmap(none) \
+ 		     map(from: ok, out_rev_arr[:Size], out_fwd_arr[:Size], \
+ 			       out_first_half_arr[:Size / 2]) \
+ 		     map(to: arr[:Size])
+     {
+       bool inner_ok = true;
+       {
+ 	std::span<const T> span = {arr, Size};
+ 	std::vector<T> rev_vec(std::reverse_iterator{span.end()},
+ 			       std::reverse_iterator{span.begin()});
+ 	VERIFY (std::distance(span.begin(), span.end())
+ 		== std::distance(rev_vec.begin(), rev_vec.end()));
+ 	VERIFY (stdr::distance(span.begin(), span.end())
+ 		== stdr::distance(rev_vec.begin(), rev_vec.end()));
+ 	VERIFY (stdr::distance(span) == stdr::distance(rev_vec));
+ 	VERIFY (simple_equal(span.begin(), span.end(),
+ 			     std::reverse_iterator{rev_vec.end()},
+ 			     std::reverse_iterator{rev_vec.begin()}));
+ 	simple_copy(rev_vec.begin(), rev_vec.end(), out_rev_arr);
+ 	simple_copy(std::reverse_iterator{rev_vec.end()},
+ 		    std::reverse_iterator{rev_vec.begin()},
+ 		    out_fwd_arr);
+ 	using counted_iter = std::counted_iterator<decltype(span.begin())>;
+ 	using common_iter = std::common_iterator<counted_iter,
+ 						 std::default_sentinel_t>;
+ 	std::vector<T> front_half;
+ 	simple_copy(common_iter{counted_iter{span.begin(), Size / 2}},
+ 		    common_iter{std::default_sentinel},
+ 		    std::back_insert_iterator{front_half});
+ 	VERIFY (simple_equal(span.begin(), stdr::next(span.begin(), Size / 2),
+ 			     front_half.begin(), front_half.end()));
+ 	simple_copy(front_half.begin(), front_half.end(), out_first_half_arr);
+       }
+       end:
+       ok = inner_ok;
+     }
+   VERIFY_NON_TARGET (simple_equal(std::reverse_iterator{arr + Size},
+ 				  std::reverse_iterator{arr},
+ 				  out_rev_arr, out_rev_arr + Size));
+   VERIFY_NON_TARGET (simple_equal(arr, arr + Size,
+ 				  out_fwd_arr, out_fwd_arr + Size));
+   VERIFY_NON_TARGET (simple_equal(arr, arr + Size / 2,
+ 				  out_first_half_arr, out_first_half_arr + Size / 2));
+   return ok;
+ }
+ 
+ int main()
+ {
+   int arr[] = {0, 1, 2, 3, 4, 5, 6, 7};
+   return test(arr) ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-60.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-60.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-60.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-60.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,46 ----
+ /* algorithms pre c++20 */
+ 
+ #include <algorithm>
+ #include <vector>
+ 
+ #include "target-flex-common.h"
+ 
+ template<typename T, std::size_t Size>
+ bool test(const T (&arr)[Size])
+ {
+   bool ok;
+   T out_2x_arr[Size];
+   T out_shifted_arr[Size];
+   #pragma omp target map(from: ok, out_2x_arr[:Size], out_shifted_arr[:Size]) \
+ 		     map(to: arr[:Size])
+     {
+       std::vector<T> vec(Size);
+       std::vector<T> mutated(Size);
+       bool inner_ok = true;
+       {
+ 	std::copy(arr, arr + Size, vec.begin());
+ 	VERIFY (std::equal(arr, arr + Size, vec.begin()));
+ 	std::transform(vec.begin(), vec.end(), mutated.begin(),
+ 		       [](const T& v){ return v * 2; });
+ 	std::copy(mutated.begin(), mutated.end(), out_2x_arr);
+ 	std::rotate(vec.begin(), std::next(vec.begin(), Size / 2), vec.end());
+ 	std::copy(vec.begin(), vec.end(), out_shifted_arr);
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   VERIFY_NON_TARGET (std::equal(arr, arr + Size, out_2x_arr,
+ 				[](const T& a, const T& b){ return a * 2 == b; }));
+   std::vector<T> shifted(arr, arr + Size);
+   std::rotate(shifted.begin(), std::next(shifted.begin(), Size / 2), shifted.end());
+   VERIFY_NON_TARGET (std::equal(out_shifted_arr, out_shifted_arr + Size, shifted.begin()));
+   return true;
+ }
+ 
+ int main()
+ {
+   int arr[] = {0, 1, 2, 3, 4, 5, 6, 7};
+   return test(arr) ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-61.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-61.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-61.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-61.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,54 ----
+ /* { dg-additional-options "-std=c++20" } */
+ 
+ /* ranged algorithms c++20 */
+ 
+ #include <algorithm>
+ #include <ranges>
+ #include <vector>
+ 
+ //TODO PR120454 "C++ constexpr vs. OpenMP implicit mapping"
+ #pragma omp declare target(std::ranges::copy, std::ranges::equal, std::ranges::rotate, std::ranges::transform)
+ 
+ #include "target-flex-common.h"
+ 
+ namespace stdr = std::ranges;
+ 
+ template<typename T, std::size_t Size>
+ bool test(const T (&arr)[Size])
+ {
+   bool ok;
+   T out_2x_arr[Size];
+   T out_shifted_arr[Size];
+   #pragma omp target defaultmap(none) \
+ 		     map(from: ok, out_2x_arr[:Size], out_shifted_arr[:Size]) \
+ 		     map(to: arr[:Size])
+     {
+       std::vector<T> vec(Size);
+       std::vector<T> mutated(Size);
+       bool inner_ok = true;
+       {
+ 	stdr::copy(arr, vec.begin());
+ 	VERIFY (stdr::equal(arr, vec));
+ 	stdr::transform(vec, mutated.begin(),
+ 			[](const T& v){ return v * 2; });
+ 	stdr::copy(mutated, out_2x_arr);
+ 	stdr::rotate(vec, std::next(vec.begin(), Size / 2));
+ 	stdr::copy(vec, out_shifted_arr);
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   VERIFY_NON_TARGET (stdr::equal(arr, out_2x_arr, stdr::equal_to{}, [](const T& v){ return v * 2; }));
+   std::vector<T> shifted(arr, arr + Size);
+   stdr::rotate(shifted, std::next(shifted.begin(), Size / 2));
+   VERIFY_NON_TARGET (stdr::equal(out_shifted_arr, shifted));
+   return true;
+ }
+ 
+ int main()
+ {
+   int arr[] = {0, 1, 2, 3, 4, 5, 6, 7};
+   return test(arr) ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-62.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-62.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-62.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-62.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,50 ----
+ /* { dg-additional-options -std=c++23 } */
+ 
+ /* std::views stuff.  Also tests std::tuple with std::views::zip.  */
+ 
+ #include <algorithm>
+ #include <ranges>
+ #include <span>
+ 
+ //TODO PR120454 "C++ constexpr vs. OpenMP implicit mapping"
+ #pragma omp declare target(std::ranges::all_of, std::ranges::equal, std::ranges::fold_left, std::views::reverse, std::views::zip)
+ 
+ #include "target-flex-common.h"
+ 
+ namespace stdr = std::ranges;
+ namespace stdv = std::views;
+ 
+ bool f()
+ {
+   const int arr_fwd[8] = {0, 1, 2, 3, 4, 5, 6, 7};
+   const int arr_rev[8] = {7, 6, 5, 4, 3, 2, 1, 0};
+ 
+   bool ok;
+   #pragma omp target defaultmap(none) map(from: ok) map(to: arr_fwd[:8], arr_rev[:8])
+     {
+       std::span<const int> fwd = {arr_fwd, 8};
+       std::span<const int> rev = {arr_rev, 8};
+       bool inner_ok = true;
+       {
+ 	VERIFY(stdr::equal(fwd, rev | stdv::reverse));
+ 	VERIFY(stdr::equal(fwd | stdv::drop(4) | stdv::reverse,
+ 			   rev | stdv::take(4)));
+ 	for (auto [first, second] : stdv::zip(fwd, rev))
+ 	  VERIFY(first + second == 7);
+ 	auto plus = [](int a, int b){ return a + b; };
+ 	auto is_even = [](int v){ return v % 2 == 0; };
+ 	VERIFY(stdr::fold_left(fwd | stdv::filter(is_even), 0, plus)
+ 	       == 12);
+ 	VERIFY(stdr::all_of(fwd | stdv::transform([](int v){ return v * 2; }),
+ 			    is_even));
+       }
+       end:
+       ok = inner_ok;
+     }
+   return ok;
+ }
+ 
+ int main()
+ {
+   return f() ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-70.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-70.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-70.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-70.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,26 ----
+ /* CTAD in target regions.  */
+ 
+ template<typename T>
+ struct S
+ {
+   T _v;
+ };
+ 
+ template<typename T>
+ S(T) -> S<T>;
+ 
+ bool f()
+ {
+   bool ok;
+   #pragma omp target map(from: ok)
+     {
+       S s{42};
+       ok = s._v == 42;
+     }
+   return ok;
+ }
+ 
+ int main()
+ {
+   return f() ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-80.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-80.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-80.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-80.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,49 ----
+ // { dg-additional-options "-std=c++20" }
+ 
+ /* std::span  */
+ 
+ #include <span>
+ 
+ #include "target-flex-common.h"
+ 
+ template<typename It0, typename It1>
+ bool simple_equal(It0 it0, const It0 end0,
+ 		  It1 it1, const It1 end1) noexcept
+ {
+   for (; it0 != end0; ++it0, ++it1)
+     if (it1 == end1 || *it0 != *it1)
+       return false;
+   return true;
+ }
+ 
+ template<typename T, std::size_t Size>
+ bool test(const T (&arr)[Size])
+ {
+   bool ok;
+   T out_arr[Size];
+   #pragma omp target map(from: ok) map(to: arr[:Size])
+     {
+       std::span span = {arr, Size};
+       bool inner_ok = true;
+       {
+ 	VERIFY (!span.empty());
+ 	VERIFY (span.size() == Size);
+ 	auto out_it = out_arr;
+ 	for (auto elem : span)
+ 	  *(out_it++) = elem;
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   VERIFY_NON_TARGET (simple_equal(arr, arr + Size,
+ 				  out_arr, out_arr + Size));
+   return true;
+ }
+ 
+ int main()
+ {
+   int arr[8] = {0, 1, 2, 3, 4, 5, 6, 7};
+   return test(arr) ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-81.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-81.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-81.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-81.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,75 ----
+ /* { dg-additional-options "-std=c++20" } */
+ 
+ #include <ranges>
+ #include <span>
+ #include <type_traits>
+ #include <vector>
+ 
+ #include "target-flex-common.h"
+ 
+ namespace stdr = std::ranges;
+ 
+ template<typename It0, typename It1>
+ bool simple_equal(It0 it0, const It0 end0,
+ 		  It1 it1, const It1 end1) noexcept
+ {
+   for (; it0 != end0; ++it0, ++it1)
+     if (it1 == end1 || *it0 != *it1)
+       return false;
+   return true;
+ }
+ 
+ template<typename Rn0, typename Rn1>
+ bool simple_equal(Rn0&& rn0, Rn1&& rn1) noexcept
+ {
+   return simple_equal(stdr::begin(rn0), stdr::end(rn0),
+ 		      stdr::begin(rn1), stdr::end(rn1));
+ }
+ 
+ template<typename Rn>
+ bool test(Rn&& range)
+ {
+   using value_type = stdr::range_value_t<std::remove_cvref_t<Rn>>;
+   std::vector<value_type> vec = {stdr::begin(range), stdr::end(range)};
+   value_type *data = vec.data();
+   std::size_t size = vec.size();
+   bool ok;
+   #pragma omp target map(from: ok) map(tofrom: data[:size]) map(to: size)
+     {
+       std::vector<value_type> orig = {data, data + size};
+       std::span<value_type> span = {data, size};
+       bool inner_ok = true;
+       {
+ 	auto mul_by_2 = [](const value_type& v){ return v * 2; };
+ 	VERIFY (simple_equal(orig, span));
+ 	for (auto& elem : span)
+ 	  elem = mul_by_2(elem);
+ 	VERIFY (simple_equal(orig | std::views::transform(mul_by_2), span));
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   auto mul_by_2 = [](const value_type& v){ return v * 2; };
+   VERIFY_NON_TARGET (simple_equal(range | std::views::transform(mul_by_2), vec));
+   return true;
+ }
+ 
+ struct my_int
+ {
+   int _v;
+   bool operator==(my_int const&) const = default;
+   my_int operator*(int rhs) const noexcept {
+     return {_v * rhs};
+   }
+ };
+ 
+ int main()
+ {
+   std::vector<int> ints = {1, 2, 3, 4, 5};
+   const bool ints_res = test(ints);
+   std::vector<my_int> my_ints = {my_int{1}, my_int{2}, my_int{3}, my_int{4}, my_int{5}};
+   const bool my_ints_res = test(my_ints);
+   return ints_res && my_ints_res ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-90.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-90.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-90.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-90.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,107 ----
+ /* structured bindings  */
+ 
+ #include <array>
+ #include <tuple>
+ 
+ #include "target-flex-common.h"
+ 
+ template<typename Array, typename Tuple, typename Struct>
+ bool test(Array array, Tuple tuple, Struct s)
+ {
+   bool ok;
+   auto array_2nd_in = std::get<2>(array);
+   auto tuple_2nd_in = std::get<2>(tuple);
+   auto s_2nd_in = s._2;
+   decltype(array_2nd_in) array_2nd_out_0;
+   decltype(tuple_2nd_in) tuple_2nd_out_0;
+   decltype(s_2nd_in) s_2nd_out_0;
+   decltype(array_2nd_in) array_2nd_out_1;
+   decltype(tuple_2nd_in) tuple_2nd_out_1;
+   decltype(s_2nd_in) s_2nd_out_1;
+   decltype(array_2nd_in) array_2nd_out_2;
+   decltype(tuple_2nd_in) tuple_2nd_out_2;
+   decltype(s_2nd_in) s_2nd_out_2;
+   #pragma omp target map(from: ok, \
+ 			       array_2nd_out_0, tuple_2nd_out_0, s_2nd_out_0, \
+ 			       array_2nd_out_1, tuple_2nd_out_1, s_2nd_out_1, \
+ 			       array_2nd_out_2, tuple_2nd_out_2, s_2nd_out_2) \
+ 		     map(to: array_2nd_in, tuple_2nd_in, s_2nd_in, array, tuple, s)
+     {
+       bool inner_ok = true;
+       {
+ 	{
+ 	  auto [array_0th, array_1st, array_2nd] = array;
+ 	  VERIFY (array_2nd_in == array_2nd);
+ 	  VERIFY (std::get<2>(array) == array_2nd);
+ 	  array_2nd_out_0 = array_2nd;
+ 	  auto [tuple_0th, tuple_1st, tuple_2nd] = tuple;
+ 	  VERIFY (tuple_2nd_in == tuple_2nd);
+ 	  VERIFY (std::get<2>(tuple) == tuple_2nd);
+ 	  tuple_2nd_out_0 = tuple_2nd;
+ 	  auto [s_0th, s_1st, s_2nd] = s;
+ 	  VERIFY (s_2nd_in == s_2nd);
+ 	  VERIFY (s._2 == s_2nd);
+ 	  s_2nd_out_0 = s_2nd;
+ 	}
+ 	{
+ 	  auto& [array_0th, array_1st, array_2nd] = array;
+ 	  VERIFY (array_2nd_in == array_2nd);
+ 	  VERIFY (std::get<2>(array) == array_2nd);
+ 	  array_2nd_out_1 = array_2nd;
+ 	  auto& [tuple_0th, tuple_1st, tuple_2nd] = tuple;
+ 	  VERIFY (tuple_2nd_in == tuple_2nd);
+ 	  VERIFY (std::get<2>(tuple) == tuple_2nd);
+ 	  tuple_2nd_out_1 = tuple_2nd;
+ 	  auto& [s_0th, s_1st, s_2nd] = s;
+ 	  VERIFY (s_2nd_in == s_2nd);
+ 	  VERIFY (s._2 == s_2nd);
+ 	  s_2nd_out_1 = s_2nd;
+ 	}
+ 	{
+ 	  const auto& [array_0th, array_1st, array_2nd] = array;
+ 	  VERIFY (array_2nd_in == array_2nd);
+ 	  VERIFY (std::get<2>(array) == array_2nd);
+ 	  array_2nd_out_2 = array_2nd;
+ 	  const auto& [tuple_0th, tuple_1st, tuple_2nd] = tuple;
+ 	  VERIFY (tuple_2nd_in == tuple_2nd);
+ 	  VERIFY (std::get<2>(tuple) == tuple_2nd);
+ 	  tuple_2nd_out_2 = tuple_2nd;
+ 	  const auto& [s_0th, s_1st, s_2nd] = s;
+ 	  VERIFY (s_2nd_in == s_2nd);
+ 	  VERIFY (s._2 == s_2nd);
+ 	  s_2nd_out_2 = s_2nd;
+ 	}
+       }
+       end:
+       ok = inner_ok;
+     }
+   if (!ok)
+     return false;
+   VERIFY_NON_TARGET (array_2nd_out_0 == array_2nd_in);
+   VERIFY_NON_TARGET (tuple_2nd_out_0 == tuple_2nd_in);
+   VERIFY_NON_TARGET (s_2nd_out_0 == s_2nd_in);
+   VERIFY_NON_TARGET (array_2nd_out_1 == array_2nd_in);
+   VERIFY_NON_TARGET (tuple_2nd_out_1 == tuple_2nd_in);
+   VERIFY_NON_TARGET (s_2nd_out_1 == s_2nd_in);
+   VERIFY_NON_TARGET (array_2nd_out_2 == array_2nd_in);
+   VERIFY_NON_TARGET (tuple_2nd_out_2 == tuple_2nd_in);
+   VERIFY_NON_TARGET (s_2nd_out_2 == s_2nd_in);
+ 
+   return true;
+ }
+ 
+ struct S
+ {
+   char _0;
+   float _1;
+   int _2;
+ };
+ 
+ int main()
+ {
+   const bool test_res
+     = test(std::array{0, 1, 2},
+ 	   std::tuple{'a', 3.14f, 42},
+ 	   S{'a', 3.14f, 42});
+   return test_res ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-common.h gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-common.h
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-flex-common.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-flex-common.h	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,40 ----
+ #include <cstdio>
+ 
+ #if __cplusplus >= 201103L
+   #define BL_NOEXCEPT noexcept
+ #else
+   #define BL_NOEXCEPT throw()
+ #endif
+ 
+ #if defined __has_builtin
+ # if __has_builtin (__builtin_LINE)
+ #  define VERIFY_LINE __builtin_LINE ()
+ # endif
+ #endif
+ #if !defined VERIFY_LINE
+ # define VERIFY_LINE __LINE__
+ #endif
+ 
+ /* I'm not a huge fan of macros but in the interest of keeping the code that
+    isn't being tested as simple as possible, we use them.  */
+ 
+ #define VERIFY(EXPR) \
+   do {										\
+     if (!(EXPR))								\
+       {										\
+ 	std::printf("VERIFY ln: %d `" #EXPR "` evaluated to false\n",		\
+ 		    VERIFY_LINE);						\
+ 	inner_ok = false;							\
+ 	goto end;								\
+       }										\
+   } while (false)
+ 
+ #define VERIFY_NON_TARGET(EXPR) \
+   do {										\
+     if (!(EXPR))								\
+       {										\
+ 	std::printf("VERIFY ln: %d `" #EXPR "` evaluated to false\n",		\
+ 		    VERIFY_LINE);						\
+ 	return false;								\
+       }										\
+   } while (false)
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__array-concurrent-usm.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__array-concurrent-usm.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__array-concurrent-usm.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__array-concurrent-usm.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,5 ----
+ #pragma omp requires unified_shared_memory self_maps
+ 
+ #define MEM_SHARED
+ 
+ #include "target-std__array-concurrent.C"
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__array-concurrent.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__array-concurrent.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__array-concurrent.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__array-concurrent.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,62 ----
+ // { dg-do run }
+ // { dg-additional-options -DMEM_SHARED { target offload_device_shared_as } }
+ 
+ #include <stdlib.h>
+ #include <time.h>
+ #include <array>
+ #include <algorithm>
+ 
+ #define N 50000
+ 
+ void init (int data[])
+ {
+   for (int i = 0; i < N; ++i)
+     data[i] = rand ();
+ }
+ 
+ #pragma omp declare target
+ bool validate (const std::array<int,N> &arr, int data[])
+ {
+   for (int i = 0; i < N; ++i)
+     if (arr[i] != data[i] * data[i])
+       return false;
+   return true;
+ }
+ #pragma omp end declare target
+ 
+ int main (void)
+ {
+   int data[N];
+   bool ok;
+   std::array<int,N> arr;
+ 
+   srand (time (NULL));
+   init (data);
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target data map (to: data[:N]) map (alloc: arr)
+ #endif
+     {
+       #pragma omp target
+ 	{
+ #ifndef MEM_SHARED
+ 	  new (&arr) std::array<int,N> ();
+ #endif
+ 	  std::copy (data, data + N, arr.begin ());
+ 	}
+ 
+       #pragma omp target teams distribute parallel for
+ 	for (int i = 0; i < N; ++i)
+ 	  arr[i] *= arr[i];
+ 
+       #pragma omp target map (from: ok)
+ 	{
+ 	  ok = validate (arr, data);
+ #ifndef MEM_SHARED
+ 	  arr.~array ();
+ #endif
+ 	}
+     }
+ 
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent-usm.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent-usm.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent-usm.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent-usm.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,5 ----
+ #pragma omp requires unified_shared_memory self_maps
+ 
+ #define MEM_SHARED
+ 
+ #include "target-std__bitset-concurrent.C"
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,69 ----
+ // { dg-do run }
+ // { dg-additional-options -DMEM_SHARED { target offload_device_shared_as } }
+ 
+ #include <stdlib.h>
+ #include <time.h>
+ #include <bitset>
+ #include <set>
+ #include <algorithm>
+ 
+ #define N 4000
+ #define MAX 16384
+ 
+ void init (int data[])
+ {
+   std::set<int> _set;
+   for (int i = 0; i < N; ++i)
+     {
+       // Avoid duplicates in data array.
+       do
+ 	data[i] = rand () % MAX;
+       while (_set.find (data[i]) != _set.end ());
+       _set.insert (data[i]);
+     }
+ }
+ 
+ bool validate (int sum, int data[])
+ {
+   int total = 0;
+   for (int i = 0; i < N; ++i)
+     total += data[i];
+   return sum == total;
+ }
+ 
+ int main (void)
+ {
+   int data[N];
+   std::bitset<MAX> _set;
+   int sum = 0;
+ 
+   srand (time (NULL));
+   init (data);
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target data map (to: data[:N]) map (alloc: _set)
+ #endif
+     {
+       #pragma omp target
+ 	{
+ #ifndef MEM_SHARED
+ 	  new (&_set) std::bitset<MAX> ();
+ #endif
+ 	  for (int i = 0; i < N; ++i)
+ 	    _set[data[i]] = true;
+ 	}
+ 
+       #pragma omp target teams distribute parallel for reduction (+:sum)
+ 	for (int i = 0; i < MAX; ++i)
+ 	  if (_set[i])
+ 	    sum += i;
+ 
+ #ifndef MEM_SHARED
+       #pragma omp target
+ 	_set.~bitset ();
+ #endif
+     }
+ 
+   bool ok = validate (sum, data);
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__cmath.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__cmath.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__cmath.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__cmath.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,340 ----
+ // { dg-do run }
+ // { dg-additional-options "-std=c++20" }
+ 
+ #include <cmath>
+ #include <numbers>
+ 
+ #define FP_EQUAL(x,y) (std::abs ((x) - (y)) < 1E-6)
+ 
+ #pragma omp declare target
+ template<typename T> bool test_basic ()
+ {
+   T x = -3.456789;
+   T y = 1.234567;
+   T z = 5.678901;
+ 
+   if (std::abs (x) != -x)
+     return false;
+   if (!FP_EQUAL (std::trunc (x / y) * y + std::fmod (x, y), x))
+     return false;
+   if (!FP_EQUAL (x - std::round (x / y) * y, std::remainder (x, y)))
+     return false;
+   if (!FP_EQUAL (std::fma (x, y, z), x * y + z))
+     return false;
+   if (std::fmax (x, y) != (x > y ? x : y))
+     return false;
+   if (std::fmin (x, y) != (x < y ? x : y))
+     return false;
+   if (std::fdim (x, y) != std::max(x - y, (T) 0.0))
+     return false;
+   if (std::fdim (y, x) != std::max(y - x, (T) 0.0))
+     return false;
+   return true;
+ }
+ 
+ template<typename T> bool test_exp ()
+ {
+   T x = -4.567890;
+   T y = 2.345678;
+ 
+   if (!FP_EQUAL (std::exp (x), std::pow (std::numbers::e_v<T>, x)))
+     return false;
+   if (!FP_EQUAL (std::exp2 (y), std::pow ((T) 2.0, y)))
+     return false;
+   if (!FP_EQUAL (std::expm1 (y), std::exp (y) - (T) 1.0))
+     return false;
+   if (!FP_EQUAL (std::log (std::exp (x)), x))
+     return false;
+   if (!FP_EQUAL (std::log10 (std::pow ((T) 10.0, y)), y))
+     return false;
+   if (!FP_EQUAL (std::log2 (std::exp2 (y)), y))
+     return false;
+   if (!FP_EQUAL (std::log1p (std::expm1 (y)), y))
+     return false;
+   return true;
+ }
+ 
+ template<typename T> bool test_power ()
+ {
+   T x = 7.234251;
+   T y = 0.340128;
+ 
+   if (!FP_EQUAL (std::log (std::pow (x, y)) / std::log (x), y))
+     return false;
+   if (!FP_EQUAL (std::sqrt (x) * std::sqrt (x), x))
+     return false;
+   if (!FP_EQUAL (std::cbrt (x) * std::cbrt (x) * std::cbrt (x), x))
+     return false;
+   if (!FP_EQUAL (std::hypot (x, y), std::sqrt (x * x + y * y)))
+     return false;
+   return true;
+ }
+ 
+ template<typename T> bool test_trig ()
+ {
+   T theta = std::numbers::pi / 4;
+   T phi = std::numbers::pi / 6;
+ 
+   if (!FP_EQUAL (std::sin (theta), std::sqrt ((T) 2) / 2))
+     return false;
+   if (!FP_EQUAL (std::sin (phi), 0.5))
+     return false;
+   if (!FP_EQUAL (std::cos (theta), std::sqrt ((T) 2) / 2))
+     return false;
+   if (!FP_EQUAL (std::cos (phi), std::sqrt ((T) 3) / 2))
+     return false;
+   if (!FP_EQUAL (std::tan (theta), 1.0))
+     return false;
+   if (!FP_EQUAL (std::tan (phi), std::sqrt ((T) 3) / 3))
+     return false;
+ 
+   T x = 0.33245623;
+ 
+   if (!FP_EQUAL (std::asin (std::sin (x)), x))
+     return false;
+   if (!FP_EQUAL (std::acos (std::cos (x)), x))
+     return false;
+   if (!FP_EQUAL (std::atan (std::tan (x)), x))
+     return false;
+   if (!FP_EQUAL (std::atan2 (std::sin (x), std::cos (x)), x))
+     return false;
+   return true;
+ }
+ 
+ template<typename T> bool test_hyperbolic ()
+ {
+   T x = 0.7423532;
+ 
+   if (!FP_EQUAL (std::sinh (x), (std::exp (x) - std::exp (-x)) / (T) 2.0))
+     return false;
+   if (!FP_EQUAL (std::cosh (x), (std::exp (x) + std::exp (-x)) / (T) 2.0))
+     return false;
+   if (!FP_EQUAL (std::tanh (x), std::sinh (x) / std::cosh (x)))
+     return false;
+   if (!FP_EQUAL (std::asinh (std::sinh (x)), x))
+     return false;
+   if (!FP_EQUAL (std::acosh (std::cosh (x)), x))
+     return false;
+   if (!FP_EQUAL (std::atanh (std::tanh (x)), x))
+     return false;
+   return true;
+ }
+ 
+ template<typename T> bool test_erf ()
+ {
+   if (!FP_EQUAL (std::erf ((T) 0), 0))
+     return false;
+   if (!FP_EQUAL (std::erf ((T) INFINITY), 1))
+     return false;
+   if (!FP_EQUAL (std::erf ((T) -INFINITY), -1))
+     return false;
+ 
+   if (!FP_EQUAL (std::erfc (0), 1))
+     return false;
+   if (!FP_EQUAL (std::erfc ((T) INFINITY), 0))
+     return false;
+   if (!FP_EQUAL (std::erfc ((T) -INFINITY), 2))
+     return false;
+ 
+   return true;
+ }
+ 
+ template<typename T> bool test_gamma ()
+ {
+   if (!FP_EQUAL (std::tgamma ((T) 5), 4*3*2*1))
+     return false;
+   if (!FP_EQUAL (std::tgamma ((T) 0.5), std::sqrt (std::numbers::pi_v<T>)))
+     return false;
+   if (!FP_EQUAL (std::tgamma ((T) -0.5), (T) -2 * std::sqrt (std::numbers::pi_v<T>)))
+     return false;
+   if (!FP_EQUAL (std::tgamma ((T) 2.5), (T) 0.75 * std::sqrt (std::numbers::pi_v<T>)))
+     return false;
+   if (!FP_EQUAL (std::tgamma ((T) -2.5), (T) -8.0/15 * std::sqrt (std::numbers::pi_v<T>)))
+     return false;
+ 
+   if (!FP_EQUAL (std::lgamma ((T) 5), std::log ((T) 4*3*2*1)))
+     return false;
+   if (!FP_EQUAL (std::lgamma ((T) 0.5), std::log (std::sqrt (std::numbers::pi_v<T>))))
+     return false;
+   if (!FP_EQUAL (std::lgamma ((T) 2.5),
+ 		 std::log ((T) 0.75 * std::sqrt (std::numbers::pi_v<T>))))
+     return false;
+ 
+   return true;
+ }
+ 
+ template<typename T> bool test_rounding ()
+ {
+   T x = -2.5678;
+   T y = 3.6789;
+ 
+   if (std::ceil (x) != -2)
+     return false;
+   if (std::floor (x) != -3)
+     return false;
+   if (std::trunc (x) != -2)
+     return false;
+   if (std::round (x) != -3)
+     return false;
+ 
+   if (std::ceil (y) != 4)
+     return false;
+   if (std::floor (y) != 3)
+     return false;
+   if (std::trunc (y) != 3)
+     return false;
+   if (std::round (y) != 4)
+     return false;
+ 
+   /* Not testing std::rint and std::nearbyint due to dependence on
+      floating-point environment.  */
+ 
+   return true;
+ }
+ 
+ template<typename T> bool test_fpmanip ()
+ {
+   T x = -2.3456789;
+   T y = 3.6789012;
+   int exp;
+ 
+   T mantissa = std::frexp (x, &exp);
+   if (std::ldexp (mantissa, exp) != x)
+     return false;
+   if (std::logb (x) + 1 != exp)
+     return false;
+   if (std::ilogb (x) + 1 != exp)
+     return false;
+   if (std::scalbn (x, -exp) != mantissa)
+     return false;
+ 
+   T next = std::nextafter (x, y);
+   if (!(next > x && next < y))
+     return false;
+ 
+ #if 0
+   /* TODO Due to 'std::nexttoward' using 'long double to', this triggers a
+      '80-bit-precision floating-point numbers unsupported (mode ‘XF’)' error
+      with x86_64 host and nvptx, GCN offload compilers, or
+      '128-bit-precision floating-point numbers unsupported (mode ‘TF’)' error
+      with powerpc64le host and nvptx offload compiler, for example;
+      PR71064 'nvptx offloading: "long double" data type'.
+      It ought to work on systems where the host's 'long double' is the same as
+      'double' ('DF'): aarch64, for example?  */
+   next = std::nexttoward (x, y);
+   if (!(next > x && next < y))
+     return false;
+ #endif
+ 
+   if (std::copysign (x, y) != std::abs (x))
+     return false;
+   if (std::copysign (y, x) != -y)
+     return false;
+ 
+   return true;
+ }
+ 
+ template<typename T> bool test_classify ()
+ {
+   T x = -2.3456789;
+   T y = 3.6789012;
+ 
+   if (std::fpclassify (x) != FP_NORMAL || std::fpclassify (y) != FP_NORMAL)
+     return false;
+   if (std::fpclassify ((T) INFINITY) != FP_INFINITE
+       || std::fpclassify ((T) -INFINITY) != FP_INFINITE)
+     return false;
+   if (std::fpclassify ((T) 0.0) != FP_ZERO)
+     return false;
+   if (std::fpclassify ((T) NAN) != FP_NAN)
+     return false;
+   if (!std::isfinite (x) || !std::isfinite (y))
+     return false;
+   if (std::isfinite ((T) INFINITY) || std::isfinite ((T) -INFINITY))
+     return false;
+   if (std::isinf (x) || std::isinf (y))
+     return false;
+   if (!std::isinf ((T) INFINITY) || !std::isinf ((T) -INFINITY))
+     return false;
+   if (std::isnan (x) || std::isnan (y))
+     return false;
+   if (!std::isnan ((T) 0.0 / (T) 0.0))
+     return false;
+   if (std::isnan (x) || std::isnan (y))
+     return false;
+   if (!std::isnormal (x) || !std::isnormal (y))
+     return false;
+   if (std::isnormal ((T) 0.0) || std::isnormal ((T) INFINITY) || std::isnormal ((T) NAN))
+     return false;
+   if (!std::signbit (x) || std::signbit (y))
+     return false;
+ 
+   return true;
+ }
+ 
+ template<typename T> bool test_compare ()
+ {
+   T x = 5.6789012;
+   T y = 8.9012345;
+ 
+   if (std::isgreater (x, y))
+     return false;
+   if (std::isgreater (x, x))
+     return false;
+   if (std::isgreaterequal (x, y))
+     return false;
+   if (!std::isgreaterequal (x, x))
+     return false;
+   if (!std::isless (x, y))
+     return false;
+   if (std::isless (x, x))
+     return false;
+   if (!std::islessequal (x, y))
+     return false;
+   if (!std::islessequal (x, x))
+     return false;
+   if (!std::islessgreater (x, y))
+     return false;
+   if (std::islessgreater (x, x))
+     return false;
+   if (std::isunordered (x, y))
+     return false;
+   if (!std::isunordered (x, NAN))
+     return false;
+   return true;
+ }
+ #pragma omp end declare target
+ 
+ #define RUN_TEST(func) \
+ { \
+   pass++; \
+   bool ok = test_##func<float> (); \
+   if (!ok) { result = pass; break; } \
+   pass++; \
+   ok = test_##func<double> (); \
+   if (!ok) { result = pass; break; } \
+ }
+ 
+ int main (void)
+ {
+   int result = 0;
+ 
+   #pragma omp target map (tofrom: result)
+     do {
+       int pass = 0;
+ 
+       RUN_TEST (basic);
+       RUN_TEST (exp);
+       RUN_TEST (power);
+       RUN_TEST (trig);
+       RUN_TEST (hyperbolic);
+       RUN_TEST (erf);
+       RUN_TEST (gamma);
+       RUN_TEST (rounding);
+       RUN_TEST (fpmanip);
+       RUN_TEST (classify);
+       RUN_TEST (compare);
+     } while (false);
+ 
+   return result;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__complex.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__complex.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__complex.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__complex.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,175 ----
+ // { dg-do run }
+ // { dg-additional-options "-std=c++20" }
+ 
+ #include <cmath>
+ #include <complex>
+ #include <numbers>
+ 
+ using namespace std::complex_literals;
+ 
+ #define FP_EQUAL(x,y) (std::abs ((x) - (y)) < 1E-6)
+ #define COMPLEX_EQUAL(x,y) (FP_EQUAL ((x).real (), (y).real ()) \
+ 			    && FP_EQUAL ((x).imag (), (y).imag ()))
+ 
+ #pragma omp declare target
+ template<typename T> bool test_complex ()
+ {
+   std::complex<T> z (-1.334, 5.763);
+ 
+   if (!FP_EQUAL (z.real (), (T) -1.334))
+     return false;
+   if (!FP_EQUAL (z.imag (), (T) 5.763))
+     return false;
+   if (!FP_EQUAL (std::abs (z),
+ 		 std::sqrt (z.real () * z.real () + z.imag () * z.imag ())))
+     return false;
+   if (!FP_EQUAL (std::arg (z), std::atan2 (z.imag (), z.real ())))
+     return false;
+   if (!FP_EQUAL (std::norm (z), z.real () * z.real () + z.imag () * z.imag ()))
+     return false;
+ 
+   auto conj = std::conj (z);
+   if (!FP_EQUAL (conj.real (), z.real ())
+       || !FP_EQUAL (conj.imag (), -z.imag ()))
+     return false;
+ 
+   if (std::proj (z) != z)
+     return false;
+ 
+   auto infz1 = std::proj (std::complex<float> (INFINITY, -1));
+   if (infz1.real () != INFINITY || infz1.imag () != (T) -0.0)
+     return false;
+   auto infz2 = std::proj (std::complex<float> (0, -INFINITY));
+   if (infz2.real () != INFINITY || infz2.imag () != (T) -0.0)
+     return false;
+ 
+   auto polarz = std::polar ((T) 1.5, std::numbers::pi_v<T> / 4);
+   if (!FP_EQUAL (polarz.real (), (T) 1.5 * std::cos (std::numbers::pi_v<T> / 4))
+       || !FP_EQUAL (polarz.imag (),
+ 		    (T) 1.5* std::sin (std::numbers::pi_v<T> / 4)))
+     return false;
+ 
+   return true;
+ }
+ 
+ template<typename T> bool test_complex_exp_log ()
+ {
+   std::complex<T> z (-1.724, -3.763);
+ 
+   // Euler's identity
+   auto eulerz = std::exp (std::complex<T> (0, std::numbers::pi));
+   eulerz += 1.0;
+   if (!COMPLEX_EQUAL (eulerz, std::complex<T> ()))
+     return false;
+ 
+   auto my_exp_z
+     = std::complex<T> (std::exp (z.real ()) * std::cos (z.imag ()),
+ 		       std::exp (z.real ()) * std::sin (z.imag ()));
+   if (!COMPLEX_EQUAL (std::exp (z), my_exp_z))
+     return false;
+ 
+   if (!COMPLEX_EQUAL (std::log10 (z),
+ 		      std::log (z) / std::log (std::complex<T> (10))))
+     return false;
+ 
+   return true;
+ }
+ 
+ template<typename T> bool test_complex_trig ()
+ {
+   std::complex<T> z (std::numbers::pi / 8, std::numbers::pi / 10);
+   const std::complex<T> i (0, 1);
+ 
+   auto my_sin_z
+     = std::complex<T> (std::sin (z.real ()) * std::cosh (z.imag ()),
+ 		       std::cos (z.real ()) * std::sinh (z.imag ()));
+   if (!COMPLEX_EQUAL (std::sin (z), my_sin_z))
+     return false;
+ 
+   auto my_cos_z
+     = std::complex<T> (std::cos (z.real ()) * std::cosh (z.imag ()),
+ 		       -std::sin (z.real ()) * std::sinh (z.imag ()));
+   if (!COMPLEX_EQUAL (std::cos (z), my_cos_z))
+     return false;
+ 
+   auto my_tan_z
+     = std::complex<T> (std::sin (2*z.real ()), std::sinh (2*z.imag ()))
+       / (std::cos (2*z.real ()) + std::cosh (2*z.imag ()));
+   if (!COMPLEX_EQUAL (std::tan (z), my_tan_z))
+     return false;
+ 
+   auto my_sinh_z
+     = std::complex<T> (std::sinh (z.real ()) * std::cos (z.imag ()),
+ 		       std::cosh (z.real ()) * std::sin (z.imag ()));
+   if (!COMPLEX_EQUAL (std::sinh (z), my_sinh_z))
+     return false;
+ 
+   auto my_cosh_z
+     = std::complex<T> (std::cosh (z.real ()) * std::cos (z.imag ()),
+ 		       std::sinh (z.real ()) * std::sin (z.imag ()));
+   if (!COMPLEX_EQUAL (std::cosh (z), my_cosh_z))
+     return false;
+ 
+   auto my_tanh_z
+     = std::complex<T> (std::sinh (2*z.real ()),
+ 		       std::sin (2*z.imag ()))
+ 		       / (std::cosh (2*z.real ()) + std::cos (2*z.imag ()));
+   if (!COMPLEX_EQUAL (std::tanh (z), my_tanh_z))
+     return false;
+ 
+   auto my_asin_z = -i * std::log (i * z + std::sqrt ((T) 1.0 - z*z));
+   if (!COMPLEX_EQUAL (std::asin (z), my_asin_z))
+     return false;
+ 
+   auto my_acos_z
+     = std::complex<T> (std::numbers::pi / 2)
+ 		       + i * std::log (i * z + std::sqrt ((T) 1.0 - z*z));
+   if (!COMPLEX_EQUAL (std::acos (z), my_acos_z))
+     return false;
+ 
+   auto my_atan_z = std::complex<T> (0, -0.5) * (std::log ((i - z) / (i + z)));
+   if (!COMPLEX_EQUAL (std::atan (z), my_atan_z))
+     return false;
+ 
+   auto my_asinh_z = std::log (z + std::sqrt (z*z + (T) 1.0));
+   if (!COMPLEX_EQUAL (std::asinh (z), my_asinh_z))
+     return false;
+ 
+   auto my_acosh_z = std::log (z + std::sqrt (z*z - (T) 1.0));
+   if (!COMPLEX_EQUAL (std::acosh (z), my_acosh_z))
+     return false;
+ 
+   auto my_atanh_z
+     = std::complex<T> (0.5) * (std::log ((T) 1.0 + z) - std::log ((T) 1.0 - z));
+   if (!COMPLEX_EQUAL (std::atanh (z), my_atanh_z))
+     return false;
+ 
+   return true;
+ }
+ #pragma omp end declare target
+ 
+ #define RUN_TEST(func) \
+ { \
+   pass++; \
+   bool ok = test_##func<float> (); \
+   if (!ok) { result = pass; break; } \
+   pass++; \
+   ok = test_##func<double> (); \
+   if (!ok) { result = pass; break; } \
+ }
+ 
+ int main (void)
+ {
+   int result = 0;
+ 
+   #pragma omp target map (tofrom: result)
+     do {
+       int pass = 0;
+ 
+       RUN_TEST (complex);
+       RUN_TEST (complex_exp_log);
+       RUN_TEST (complex_trig);
+     } while (false);
+ 
+   return result;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__deque-concurrent-usm.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__deque-concurrent-usm.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__deque-concurrent-usm.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__deque-concurrent-usm.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,5 ----
+ #pragma omp requires unified_shared_memory self_maps
+ 
+ #define MEM_SHARED
+ 
+ #include "target-std__deque-concurrent.C"
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__deque-concurrent.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__deque-concurrent.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__deque-concurrent.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__deque-concurrent.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,64 ----
+ // { dg-do run }
+ // { dg-additional-options -DMEM_SHARED { target offload_device_shared_as } }
+ 
+ #include <stdlib.h>
+ #include <time.h>
+ #include <deque>
+ #include <algorithm>
+ 
+ #define N 50000
+ 
+ void init (int data[])
+ {
+   for (int i = 0; i < N; ++i)
+     data[i] = rand ();
+ }
+ 
+ #pragma omp declare target
+ bool validate (const std::deque<int> &_deque, int data[])
+ {
+   for (int i = 0; i < N; ++i)
+     if (_deque[i] != data[i] * data[i])
+       return false;
+   return true;
+ }
+ #pragma omp end declare target
+ 
+ int main (void)
+ {
+   int data[N];
+   bool ok;
+ 
+   srand (time (NULL));
+   init (data);
+ 
+ #ifdef MEM_SHARED
+   std::deque<int> _deque (std::begin (data), std::end (data));
+ #else
+   std::deque<int> _deque;
+ #endif
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target data map (to: data[:N]) map (alloc: _deque)
+ #endif
+     {
+ #ifndef MEM_SHARED
+       #pragma omp target
+ 	new (&_deque) std::deque<int> (std::begin (data), std::end (data));
+ #endif
+ 
+       #pragma omp target teams distribute parallel for
+ 	for (int i = 0; i < N; ++i)
+ 	  _deque[i] *= _deque[i];
+ 
+       #pragma omp target map (from: ok)
+ 	{
+ 	  ok = validate (_deque, data);
+ #ifndef MEM_SHARED
+ 	  _deque.~deque ();
+ #endif
+ 	}
+     }
+ 
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,71 ----
+ // { dg-do run }
+ // { dg-additional-options "-std=c++23" }
+ // { dg-additional-options -DMEM_SHARED { target offload_device_shared_as } }
+ 
+ /* { dg-ice {TODO PR120450} { offload_target_amdgcn && { ! offload_device_shared_as } } }
+    { dg-excess-errors {'mkoffload' failure etc.} { xfail { offload_target_amdgcn && { ! offload_device_shared_as } } } }
+    (For effective-target 'offload_device_shared_as', we've got '-DMEM_SHARED', and therefore don't invoke the constructor with placement new.)  */
+ 
+ #include <stdlib.h>
+ #include <time.h>
+ #include <set>
+ #include <flat_map>
+ 
+ #define N 3000
+ 
+ void init (int data[], bool unique)
+ {
+   std::set<int> _set;
+   for (int i = 0; i < N; ++i)
+     {
+       // Avoid duplicates in data array if unique is true.
+       do
+ 	data[i] = rand ();
+       while (unique && _set.count (data[i]) > 0);
+       _set.insert (data[i]);
+     }
+ }
+ 
+ bool validate (long long sum, int keys[], int data[])
+ {
+   long long total = 0;
+   for (int i = 0; i < N; ++i)
+     total += (long long) keys[i] * data[i];
+   return sum == total;
+ }
+ 
+ int main (void)
+ {
+   int keys[N], data[N];
+   std::flat_map<int,int> _map;
+ 
+   srand (time (NULL));
+   init (keys, true);
+   init (data, false);
+ 
+   #pragma omp target enter data map (to: keys[:N], data[:N]) map (alloc: _map)
+ 
+   #pragma omp target
+     {
+ #ifndef MEM_SHARED
+       new (&_map) std::flat_map<int,int> ();
+ #endif
+       for (int i = 0; i < N; ++i)
+ 	_map[keys[i]] = data[i];
+     }
+ 
+   long long sum = 0;
+   #pragma omp target teams distribute parallel for reduction (+:sum)
+     for (int i = 0; i < N; ++i)
+       sum += (long long) keys[i] * _map[keys[i]];
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target
+     _map.~flat_map ();
+ #endif
+ 
+   #pragma omp target exit data map (release: _map)
+ 
+   bool ok = validate (sum, keys, data);
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,70 ----
+ // { dg-do run }
+ // { dg-additional-options "-std=c++23" }
+ // { dg-additional-options -DMEM_SHARED { target offload_device_shared_as } }
+ 
+ /* { dg-ice {TODO PR120450} { offload_target_amdgcn && { ! offload_device_shared_as } } }
+    { dg-excess-errors {'mkoffload' failure etc.} { xfail { offload_target_amdgcn && { ! offload_device_shared_as } } } }
+    (For effective-target 'offload_device_shared_as', we've got '-DMEM_SHARED', and therefore don't invoke the constructor with placement new.)  */
+ 
+ #include <stdlib.h>
+ #include <time.h>
+ #include <flat_map>
+ 
+ // Make sure that KEY_MAX is less than N to ensure some duplicate keys.
+ #define N 3000
+ #define KEY_MAX 1000
+ 
+ void init (int data[], int max)
+ {
+   for (int i = 0; i < N; ++i)
+     data[i] = i % max;
+ }
+ 
+ bool validate (long long sum, int keys[], int data[])
+ {
+   long long total = 0;
+   for (int i = 0; i < N; ++i)
+     total += (long long) keys[i] * data[i];
+   return sum == total;
+ }
+ 
+ int main (void)
+ {
+   int keys[N], data[N];
+   std::flat_multimap<int,int> _map;
+ 
+   srand (time (NULL));
+   init (keys, KEY_MAX);
+   init (data, RAND_MAX);
+ 
+   #pragma omp target enter data map (to: keys[:N], data[:N]) map (alloc: _map)
+ 
+   #pragma omp target
+     {
+ #ifndef MEM_SHARED
+       new (&_map) std::flat_multimap<int,int> ();
+ #endif
+       for (int i = 0; i < N; ++i)
+ 	_map.insert({keys[i], data[i]});
+     }
+ 
+   long long sum = 0;
+   #pragma omp target teams distribute parallel for reduction (+:sum)
+     for (int i = 0; i < KEY_MAX; ++i)
+       {
+ 	auto range = _map.equal_range (i);
+ 	for (auto it = range.first; it != range.second; ++it) {
+ 	  sum += (long long) it->first * it->second;
+ 	}
+       }
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target
+     _map.~flat_multimap ();
+ #endif
+ 
+   #pragma omp target exit data map (release: _map)
+ 
+   bool ok = validate (sum, keys, data);
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,60 ----
+ // { dg-do run }
+ // { dg-additional-options "-std=c++23" }
+ // { dg-additional-options -DMEM_SHARED { target offload_device_shared_as } }
+ 
+ #include <stdlib.h>
+ #include <time.h>
+ #include <flat_set>
+ #include <algorithm>
+ 
+ // MAX should be less than N to ensure that some duplicates occur.
+ #define N 4000
+ #define MAX 1000
+ 
+ void init (int data[])
+ {
+   for (int i = 0; i < N; ++i)
+     data[i] = rand () % MAX;
+ }
+ 
+ bool validate (int sum, int data[])
+ {
+   int total = 0;
+   for (int i = 0; i < N; ++i)
+     total += data[i];
+   return sum == total;
+ }
+ 
+ int main (void)
+ {
+   int data[N];
+   std::flat_multiset<int> set;
+   int sum = 0;
+ 
+   srand (time (NULL));
+   init (data);
+ 
+   #pragma omp target data map (to: data[:N]) map (alloc: set)
+     {
+       #pragma omp target
+ 	{
+ #ifndef MEM_SHARED
+ 	  new (&set) std::flat_multiset<int> ();
+ #endif
+ 	  for (int i = 0; i < N; ++i)
+ 	    set.insert (data[i]);
+ 	}
+ 
+       #pragma omp target teams distribute parallel for reduction (+:sum)
+ 	for (int i = 0; i < MAX; ++i)
+ 	  sum += i * set.count (i);
+ 
+ #ifndef MEM_SHARED
+       #pragma omp target
+ 	set.~flat_multiset ();
+ #endif
+     }
+ 
+   bool ok = validate (sum, data);
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,67 ----
+ // { dg-do run }
+ // { dg-additional-options "-std=c++23" }
+ // { dg-additional-options -DMEM_SHARED { target offload_device_shared_as } }
+ 
+ #include <stdlib.h>
+ #include <time.h>
+ #include <flat_set>
+ #include <algorithm>
+ 
+ #define N 4000
+ #define MAX 16384
+ 
+ void init (int data[])
+ {
+   std::flat_set<int> _set;
+   for (int i = 0; i < N; ++i)
+     {
+       // Avoid duplicates in data array.
+       do
+ 	data[i] = rand () % MAX;
+       while (_set.count (data[i]) != 0);
+       _set.insert (data[i]);
+     }
+ }
+ 
+ bool validate (int sum, int data[])
+ {
+   int total = 0;
+   for (int i = 0; i < N; ++i)
+     total += data[i];
+   return sum == total;
+ }
+ 
+ int main (void)
+ {
+   int data[N];
+   std::flat_set<int> _set;
+   int sum = 0;
+ 
+   srand (time (NULL));
+   init (data);
+ 
+   #pragma omp target data map (to: data[:N]) map (alloc: _set)
+     {
+       #pragma omp target
+ 	{
+ #ifndef MEM_SHARED
+ 	  new (&_set) std::flat_set<int> ();
+ #endif
+ 	  for (int i = 0; i < N; ++i)
+ 	    _set.insert (data[i]);
+ 	}
+ 
+       #pragma omp target teams distribute parallel for reduction (+:sum)
+ 	for (int i = 0; i < MAX; ++i)
+ 	  if (_set.count (i) > 0)
+ 	    sum += i;
+ 
+ #ifndef MEM_SHARED
+       #pragma omp target
+ 	_set.~flat_set ();
+ #endif
+     }
+ 
+   bool ok = validate (sum, data);
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent-usm.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent-usm.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent-usm.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent-usm.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,5 ----
+ #pragma omp requires unified_shared_memory self_maps
+ 
+ #define MEM_SHARED
+ 
+ #include "target-std__forward_list-concurrent.C"
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,83 ----
+ // { dg-do run }
+ // { dg-additional-options -DMEM_SHARED { target offload_device_shared_as } }
+ 
+ #include <stdlib.h>
+ #include <time.h>
+ #include <omp.h>
+ #include <forward_list>
+ #include <algorithm>
+ 
+ #define N 3000
+ 
+ void init (int data[])
+ {
+   for (int i = 0; i < N; ++i)
+     data[i] = rand ();
+ }
+ 
+ #pragma omp declare target
+ bool validate (const std::forward_list<int> &list, int data[])
+ {
+   int i = 0;
+   for (auto &v : list)
+     {
+       if (v != data[i] * data[i])
+ 	return false;
+       ++i;
+     }
+   return true;
+ }
+ #pragma omp end declare target
+ 
+ int main (void)
+ {
+   int data[N];
+   bool ok;
+ 
+   srand (time (NULL));
+   init (data);
+ 
+ #ifdef MEM_SHARED
+   std::forward_list<int> list (std::begin (data), std::end (data));
+ #else
+   std::forward_list<int> list;
+ #endif
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target data map (to: data[:N]) map (alloc: list)
+ #endif
+     {
+ #ifndef MEM_SHARED
+       #pragma omp target
+ 	new (&list) std::forward_list<int> (std::begin (data), std::end (data));
+ #endif
+ 
+       #pragma omp target teams
+ 	do
+ 	  {
+ 	    int len = N / omp_get_num_teams () + (N % omp_get_num_teams () > 0);
+ 	    int start = len * omp_get_team_num ();
+ 	    if (start >= N)
+ 	      break;
+ 	    if (start + len >= N)
+ 	      len = N - start;
+ 	    auto it = list.begin ();
+ 	    std::advance (it, start);
+ 	    for (int i = 0; i < len; ++i)
+ 	      {
+ 		*it *= *it;
+ 		++it;
+ 	      }
+ 	  } while (false);
+ 
+       #pragma omp target map (from: ok)
+ 	{
+ 	  ok = validate (list, data);
+ #ifndef MEM_SHARED
+ 	  list.~forward_list ();
+ #endif
+ 	}
+     }
+ 
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__list-concurrent-usm.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__list-concurrent-usm.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__list-concurrent-usm.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__list-concurrent-usm.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,5 ----
+ #pragma omp requires unified_shared_memory self_maps
+ 
+ #define MEM_SHARED
+ 
+ #include "target-std__list-concurrent.C"
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__list-concurrent.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__list-concurrent.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__list-concurrent.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__list-concurrent.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,83 ----
+ // { dg-do run }
+ // { dg-additional-options -DMEM_SHARED { target offload_device_shared_as } }
+ 
+ #include <stdlib.h>
+ #include <time.h>
+ #include <omp.h>
+ #include <list>
+ #include <algorithm>
+ 
+ #define N 3000
+ 
+ void init (int data[])
+ {
+   for (int i = 0; i < N; ++i)
+     data[i] = rand ();
+ }
+ 
+ #pragma omp declare target
+ bool validate (const std::list<int> &_list, int data[])
+ {
+   int i = 0;
+   for (auto &v : _list)
+     {
+       if (v != data[i] * data[i])
+ 	return false;
+       ++i;
+     }
+   return true;
+ }
+ #pragma omp end declare target
+ 
+ int main (void)
+ {
+   int data[N];
+   bool ok;
+ 
+   srand (time (NULL));
+   init (data);
+ 
+ #ifdef MEM_SHARED
+   std::list<int> _list (std::begin (data), std::end (data));
+ #else
+   std::list<int> _list;
+ #endif
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target data map (to: data[:N]) map (alloc: _list)
+ #endif
+     {
+ #ifndef MEM_SHARED
+       #pragma omp target
+ 	new (&_list) std::list<int> (std::begin (data), std::end (data));
+ #endif
+ 
+       #pragma omp target teams
+ 	do
+ 	  {
+ 	    int len = N / omp_get_num_teams () + (N % omp_get_num_teams () > 0);
+ 	    int start = len * omp_get_team_num ();
+ 	    if (start >= N)
+ 	      break;
+ 	    if (start + len >= N)
+ 	      len = N - start;
+ 	    auto it = _list.begin ();
+ 	    std::advance (it, start);
+ 	    for (int i = 0; i < len; ++i)
+ 	      {
+ 		*it *= *it;
+ 		++it;
+ 	      }
+ 	  } while (false);
+ 
+       #pragma omp target map (from: ok)
+ 	{
+ 	  ok = validate (_list, data);
+ #ifndef MEM_SHARED
+ 	  _list.~list ();
+ #endif
+ 	}
+     }
+ 
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__map-concurrent-usm.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__map-concurrent-usm.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__map-concurrent-usm.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__map-concurrent-usm.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,5 ----
+ #pragma omp requires unified_shared_memory self_maps
+ 
+ #define MEM_SHARED
+ 
+ #include "target-std__map-concurrent.C"
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__map-concurrent.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__map-concurrent.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__map-concurrent.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__map-concurrent.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,70 ----
+ // { dg-do run }
+ // { dg-additional-options -DMEM_SHARED { target offload_device_shared_as } }
+ 
+ #include <stdlib.h>
+ #include <time.h>
+ #include <set>
+ #include <map>
+ 
+ #define N 3000
+ 
+ void init (int data[], bool unique)
+ {
+   std::set<int> _set;
+   for (int i = 0; i < N; ++i)
+     {
+       // Avoid duplicates in data array if unique is true.
+       do
+ 	data[i] = rand ();
+       while (unique && _set.find (data[i]) != _set.end ());
+       _set.insert (data[i]);
+     }
+ }
+ 
+ bool validate (long long sum, int keys[], int data[])
+ {
+   long long total = 0;
+   for (int i = 0; i < N; ++i)
+     total += (long long) keys[i] * data[i];
+   return sum == total;
+ }
+ 
+ int main (void)
+ {
+   int keys[N], data[N];
+   std::map<int,int> _map;
+ 
+   srand (time (NULL));
+   init (keys, true);
+   init (data, false);
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target enter data map (to: keys[:N], data[:N]) map (alloc: _map)
+ #endif
+ 
+   #pragma omp target
+     {
+ #ifndef MEM_SHARED
+       new (&_map) std::map<int,int> ();
+ #endif
+       for (int i = 0; i < N; ++i)
+ 	_map[keys[i]] = data[i];
+     }
+ 
+   long long sum = 0;
+   #pragma omp target teams distribute parallel for reduction (+:sum)
+     for (int i = 0; i < N; ++i)
+       sum += (long long) keys[i] * _map[keys[i]];
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target
+     _map.~map ();
+ #endif
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target exit data map (release: _map)
+ #endif
+ 
+   bool ok = validate (sum, keys, data);
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent-usm.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent-usm.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent-usm.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent-usm.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,5 ----
+ #pragma omp requires unified_shared_memory self_maps
+ 
+ #define MEM_SHARED
+ 
+ #include "target-std__multimap-concurrent.C"
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,68 ----
+ // { dg-do run }
+ // { dg-additional-options -DMEM_SHARED { target offload_device_shared_as } }
+ 
+ #include <stdlib.h>
+ #include <time.h>
+ #include <map>
+ 
+ // Make sure that KEY_MAX is less than N to ensure some duplicate keys.
+ #define N 3000
+ #define KEY_MAX 1000
+ 
+ void init (int data[], int max)
+ {
+   for (int i = 0; i < N; ++i)
+     data[i] = rand () % max;
+ }
+ 
+ bool validate (long long sum, int keys[], int data[])
+ {
+   long long total = 0;
+   for (int i = 0; i < N; ++i)
+     total += (long long) keys[i] * data[i];
+   return sum == total;
+ }
+ 
+ int main (void)
+ {
+   int keys[N], data[N];
+   std::multimap<int,int> _map;
+ 
+   srand (time (NULL));
+   init (keys, KEY_MAX);
+   init (data, RAND_MAX);
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target enter data map (to: keys[:N], data[:N]) map (alloc: _map)
+ #endif
+ 
+   #pragma omp target
+     {
+ #ifndef MEM_SHARED
+       new (&_map) std::multimap<int,int> ();
+ #endif
+       for (int i = 0; i < N; ++i)
+ 	_map.insert({keys[i], data[i]});
+     }
+ 
+   long long sum = 0;
+   #pragma omp target teams distribute parallel for reduction (+:sum)
+     for (int i = 0; i < KEY_MAX; ++i)
+       {
+ 	auto range = _map.equal_range (i);
+ 	for (auto it = range.first; it != range.second; ++it)
+ 	  sum += (long long) it->first * it->second;
+       }
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target
+     _map.~multimap ();
+ #endif
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target exit data map (release: _map)
+ #endif
+ 
+   bool ok = validate (sum, keys, data);
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent-usm.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent-usm.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent-usm.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent-usm.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,5 ----
+ #pragma omp requires unified_shared_memory self_maps
+ 
+ #define MEM_SHARED
+ 
+ #include "target-std__multiset-concurrent.C"
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,62 ----
+ // { dg-do run }
+ // { dg-additional-options -DMEM_SHARED { target offload_device_shared_as } }
+ 
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <set>
+ #include <algorithm>
+ 
+ // MAX should be less than N to ensure that some duplicates occur.
+ #define N 4000
+ #define MAX 1000
+ 
+ void init (int data[])
+ {
+   for (int i = 0; i < N; ++i)
+     data[i] = rand () % MAX;
+ }
+ 
+ bool validate (int sum, int data[])
+ {
+   int total = 0;
+   for (int i = 0; i < N; ++i)
+     total += data[i];
+   return sum == total;
+ }
+ 
+ int main (void)
+ {
+   int data[N];
+   std::multiset<int> set;
+   int sum = 0;
+ 
+   srand (time (NULL));
+   init (data);
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target data map (to: data[:N]) map (alloc: set)
+ #endif
+     {
+       #pragma omp target
+ 	{
+ #ifndef MEM_SHARED
+ 	  new (&set) std::multiset<int> ();
+ #endif
+ 	  for (int i = 0; i < N; ++i)
+ 	    set.insert (data[i]);
+ 	}
+ 
+       #pragma omp target teams distribute parallel for reduction (+:sum)
+ 	for (int i = 0; i < MAX; ++i)
+ 	  sum += i * set.count (i);
+ 
+ #ifndef MEM_SHARED
+       #pragma omp target
+ 	set.~multiset ();
+ #endif
+     }
+ 
+   bool ok = validate (sum, data);
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__numbers.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__numbers.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__numbers.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__numbers.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,93 ----
+ // { dg-do run }
+ // { dg-additional-options "-std=c++20" }
+ 
+ #include <cmath>
+ #include <numbers>
+ 
+ #define FP_EQUAL(x,y) (std::abs ((x) - (y)) < 1E-6)
+ 
+ #pragma omp declare target
+ template<typename T> bool test_pi ()
+ {
+   if (!FP_EQUAL (std::sin (std::numbers::pi_v<T>), (T) 0.0))
+     return false;
+   if (!FP_EQUAL (std::cos (std::numbers::pi_v<T>), (T) -1.0))
+     return false;
+   if (!FP_EQUAL (std::numbers::pi_v<T> * std::numbers::inv_pi_v<T>, (T) 1.0))
+     return false;
+   if (!FP_EQUAL (std::numbers::pi_v<T> * std::numbers::inv_sqrtpi_v<T>
+ 		 * std::numbers::inv_sqrtpi_v<T>, (T) 1.0))
+     return false;
+   return true;
+ }
+ 
+ template<typename T> bool test_sqrt ()
+ {
+   if (!FP_EQUAL (std::numbers::sqrt2_v<T> * std::numbers::sqrt2_v<T>, (T) 2.0))
+     return false;
+   if (!FP_EQUAL (std::numbers::sqrt3_v<T> * std::numbers::sqrt3_v<T>, (T) 3.0))
+     return false;
+   return true;
+ }
+ 
+ template<typename T> bool test_phi ()
+ {
+   T myphi = ((T) 1.0 + std::sqrt ((T) 5.0)) / (T) 2.0;
+   if (!FP_EQUAL (myphi, std::numbers::phi_v<T>))
+     return false;
+   return true;
+ }
+ 
+ template<typename T> bool test_log ()
+ {
+   if (!FP_EQUAL (std::log ((T) 2.0), std::numbers::ln2_v<T>))
+     return false;
+   if (!FP_EQUAL (std::log ((T) 10.0), std::numbers::ln10_v<T>))
+     return false;
+   if (!FP_EQUAL (std::log2 ((T) std::numbers::e), std::numbers::log2e_v<T>))
+     return false;
+   if (!FP_EQUAL (std::log10 ((T) std::numbers::e), std::numbers::log10e_v<T>))
+     return false;
+   return true;
+ }
+ 
+ template<typename T> bool test_egamma ()
+ {
+   T myegamma = 0.0;
+   #pragma omp parallel for reduction(+:myegamma)
+     for (int k = 2; k < 100000; ++k)
+       myegamma += (std::riemann_zeta (k) - 1) / k;
+   myegamma = (T) 1 - myegamma;
+   if (!FP_EQUAL (myegamma, std::numbers::egamma_v<T>))
+     return false;
+   return true;
+ }
+ #pragma omp end declare target
+ 
+ #define RUN_TEST(func) \
+ { \
+   pass++; \
+   bool ok = test_##func<float> (); \
+   if (!ok) { result = pass; break; } \
+   pass++; \
+   ok = test_##func<double> (); \
+   if (!ok) { result = pass; break; } \
+ }
+ 
+ int main (void)
+ {
+   int result = 0;
+ 
+   #pragma omp target map (tofrom: result)
+     do {
+       int pass = 0;
+ 
+       RUN_TEST (pi);
+       RUN_TEST (sqrt);
+       RUN_TEST (phi);
+       RUN_TEST (log);
+       RUN_TEST (egamma);
+     } while (false);
+ 
+   return result;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__set-concurrent-usm.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__set-concurrent-usm.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__set-concurrent-usm.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__set-concurrent-usm.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,5 ----
+ #pragma omp requires unified_shared_memory self_maps
+ 
+ #define MEM_SHARED
+ 
+ #include "target-std__set-concurrent.C"
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__set-concurrent.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__set-concurrent.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__set-concurrent.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__set-concurrent.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,68 ----
+ // { dg-do run }
+ // { dg-additional-options -DMEM_SHARED { target offload_device_shared_as } }
+ 
+ #include <stdlib.h>
+ #include <time.h>
+ #include <set>
+ #include <algorithm>
+ 
+ #define N 4000
+ #define MAX 16384
+ 
+ void init (int data[])
+ {
+   std::set<int> _set;
+   for (int i = 0; i < N; ++i)
+     {
+       // Avoid duplicates in data array.
+       do
+ 	data[i] = rand () % MAX;
+       while (_set.find (data[i]) != _set.end ());
+       _set.insert (data[i]);
+     }
+ }
+ 
+ bool validate (int sum, int data[])
+ {
+   int total = 0;
+   for (int i = 0; i < N; ++i)
+     total += data[i];
+   return sum == total;
+ }
+ 
+ int main (void)
+ {
+   int data[N];
+   std::set<int> _set;
+   int sum = 0;
+ 
+   srand (time (NULL));
+   init (data);
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target data map (to: data[:N]) map (alloc: _set)
+ #endif
+     {
+       #pragma omp target
+ 	{
+ #ifndef MEM_SHARED
+ 	  new (&_set) std::set<int> ();
+ #endif
+ 	  for (int i = 0; i < N; ++i)
+ 	    _set.insert (data[i]);
+ 	}
+ 
+       #pragma omp target teams distribute parallel for reduction (+:sum)
+ 	for (int i = 0; i < MAX; ++i)
+ 	  if (_set.find (i) != _set.end ())
+ 	    sum += i;
+ 
+ #ifndef MEM_SHARED
+       #pragma omp target
+ 	_set.~set ();
+ #endif
+     }
+ 
+   bool ok = validate (sum, data);
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__span-concurrent-usm.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__span-concurrent-usm.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__span-concurrent-usm.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__span-concurrent-usm.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,7 ----
+ // { dg-additional-options "-std=c++20" }
+ 
+ #pragma omp requires unified_shared_memory self_maps
+ 
+ #define MEM_SHARED
+ 
+ #include "target-std__span-concurrent.C"
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__span-concurrent.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__span-concurrent.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__span-concurrent.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__span-concurrent.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,66 ----
+ // { dg-do run }
+ // { dg-additional-options "-std=c++20" }
+ // { dg-additional-options -DMEM_SHARED { target offload_device_shared_as } }
+ 
+ #include <stdlib.h>
+ #include <time.h>
+ #include <span>
+ 
+ #define N 64
+ 
+ void init (int data[])
+ {
+   for (int i = 0; i < N; ++i)
+     data[i] = rand ();
+ }
+ 
+ #pragma omp declare target
+ bool validate (const std::span<int, N> &span, int data[])
+ {
+   for (int i = 0; i < N; ++i)
+     if (span[i] != data[i] * data[i])
+       return false;
+   return true;
+ }
+ #pragma omp end declare target
+ 
+ int main (void)
+ {
+   int data[N];
+   bool ok;
+   int elements[N];
+   std::span<int, N> span(elements);
+ 
+   srand (time (NULL));
+   init (data);
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target enter data map (to: data[:N]) map (alloc: elements, span)
+ #endif
+ 
+   #pragma omp target
+     {
+ #ifndef MEM_SHARED
+       new (&span) std::span<int, N> (elements);
+ #endif
+       std::copy (data, data + N, span.begin ());
+     }
+ 
+   #pragma omp target teams distribute parallel for
+     for (int i = 0; i < N; ++i)
+       span[i] *= span[i];
+ 
+   #pragma omp target map (from: ok)
+     {
+       ok = validate (span, data);
+ #ifndef MEM_SHARED
+       span.~span ();
+ #endif
+     }
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target exit data map (release: elements, span)
+ #endif
+ 
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__unordered_map-concurrent.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__unordered_map-concurrent.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__unordered_map-concurrent.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__unordered_map-concurrent.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,66 ----
+ // { dg-do run }
+ // { dg-additional-options -DMEM_SHARED { target offload_device_shared_as } }
+ 
+ #include <stdlib.h>
+ #include <time.h>
+ #include <set>
+ #include <unordered_map>
+ 
+ #define N 3000
+ 
+ void init (int data[], bool unique)
+ {
+   std::set<int> _set;
+   for (int i = 0; i < N; ++i)
+     {
+       // Avoid duplicates in data array if unique is true.
+       do
+ 	data[i] = rand ();
+       while (unique && _set.count (data[i]) > 0);
+       _set.insert (data[i]);
+     }
+ }
+ 
+ bool validate (long long sum, int keys[], int data[])
+ {
+   long long total = 0;
+   for (int i = 0; i < N; ++i)
+     total += (long long) keys[i] * data[i];
+   return sum == total;
+ }
+ 
+ int main (void)
+ {
+   int keys[N], data[N];
+   std::unordered_map<int,int> _map;
+ 
+   srand (time (NULL));
+   init (keys, true);
+   init (data, false);
+ 
+   #pragma omp target enter data map (to: keys[:N], data[:N]) map (alloc: _map)
+ 
+   #pragma omp target
+     {
+ #ifndef MEM_SHARED
+       new (&_map) std::unordered_map<int,int> ();
+ #endif
+       for (int i = 0; i < N; ++i)
+ 	_map[keys[i]] = data[i];
+     }
+ 
+   long long sum = 0;
+   #pragma omp target teams distribute parallel for reduction (+:sum)
+     for (int i = 0; i < N; ++i)
+       sum += (long long) keys[i] * _map[keys[i]];
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target
+     _map.~unordered_map ();
+ #endif
+ 
+   #pragma omp target exit data map (release: _map)
+ 
+   bool ok = validate (sum, keys, data);
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__unordered_multimap-concurrent.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__unordered_multimap-concurrent.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__unordered_multimap-concurrent.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__unordered_multimap-concurrent.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,65 ----
+ // { dg-do run }
+ // { dg-additional-options -DMEM_SHARED { target offload_device_shared_as } }
+ 
+ #include <stdlib.h>
+ #include <time.h>
+ #include <unordered_map>
+ 
+ // Make sure that KEY_MAX is less than N to ensure some duplicate keys.
+ #define N 3000
+ #define KEY_MAX 1000
+ 
+ void init (int data[], int max)
+ {
+   for (int i = 0; i < N; ++i)
+     data[i] = i % max;
+ }
+ 
+ bool validate (long long sum, int keys[], int data[])
+ {
+   long long total = 0;
+   for (int i = 0; i < N; ++i)
+     total += (long long) keys[i] * data[i];
+   return sum == total;
+ }
+ 
+ int main (void)
+ {
+   int keys[N], data[N];
+   std::unordered_multimap<int,int> _map;
+ 
+   srand (time (NULL));
+   init (keys, KEY_MAX);
+   init (data, RAND_MAX);
+ 
+   #pragma omp target enter data map (to: keys[:N], data[:N]) map (alloc: _map)
+ 
+   #pragma omp target
+     {
+ #ifndef MEM_SHARED
+       new (&_map) std::unordered_multimap<int,int> ();
+ #endif
+       for (int i = 0; i < N; ++i)
+ 	_map.insert({keys[i], data[i]});
+     }
+ 
+   long long sum = 0;
+   #pragma omp target teams distribute parallel for reduction (+:sum)
+     for (int i = 0; i < KEY_MAX; ++i)
+       {
+ 	auto range = _map.equal_range (i);
+ 	for (auto it = range.first; it != range.second; ++it) {
+ 	  sum += (long long) it->first * it->second;
+ 	}
+       }
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target
+     _map.~unordered_multimap ();
+ #endif
+ 
+   #pragma omp target exit data map (release: _map)
+ 
+   bool ok = validate (sum, keys, data);
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__unordered_multiset-concurrent.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__unordered_multiset-concurrent.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__unordered_multiset-concurrent.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__unordered_multiset-concurrent.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,59 ----
+ // { dg-do run }
+ // { dg-additional-options -DMEM_SHARED { target offload_device_shared_as } }
+ 
+ #include <stdlib.h>
+ #include <time.h>
+ #include <unordered_set>
+ #include <algorithm>
+ 
+ // MAX should be less than N to ensure that some duplicates occur.
+ #define N 4000
+ #define MAX 1000
+ 
+ void init (int data[])
+ {
+   for (int i = 0; i < N; ++i)
+     data[i] = rand () % MAX;
+ }
+ 
+ bool validate (int sum, int data[])
+ {
+   int total = 0;
+   for (int i = 0; i < N; ++i)
+     total += data[i];
+   return sum == total;
+ }
+ 
+ int main (void)
+ {
+   int data[N];
+   std::unordered_multiset<int> set;
+   int sum = 0;
+ 
+   srand (time (NULL));
+   init (data);
+ 
+   #pragma omp target data map (to: data[:N]) map (alloc: set)
+     {
+       #pragma omp target
+ 	{
+ #ifndef MEM_SHARED
+ 	  new (&set) std::unordered_multiset<int> ();
+ #endif
+ 	  for (int i = 0; i < N; ++i)
+ 	    set.insert (data[i]);
+ 	}
+ 
+       #pragma omp target teams distribute parallel for reduction (+:sum)
+ 	for (int i = 0; i < MAX; ++i)
+ 	  sum += i * set.count (i);
+ 
+ #ifndef MEM_SHARED
+       #pragma omp target
+ 	set.~unordered_multiset ();
+ #endif
+     }
+ 
+   bool ok = validate (sum, data);
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__unordered_set-concurrent.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__unordered_set-concurrent.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__unordered_set-concurrent.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__unordered_set-concurrent.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,66 ----
+ // { dg-do run }
+ // { dg-additional-options -DMEM_SHARED { target offload_device_shared_as } }
+ 
+ #include <stdlib.h>
+ #include <time.h>
+ #include <unordered_set>
+ #include <algorithm>
+ 
+ #define N 4000
+ #define MAX 16384
+ 
+ void init (int data[])
+ {
+   std::unordered_set<int> _set;
+   for (int i = 0; i < N; ++i)
+     {
+       // Avoid duplicates in data array.
+       do
+ 	data[i] = rand () % MAX;
+       while (_set.count (data[i]) != 0);
+       _set.insert (data[i]);
+     }
+ }
+ 
+ bool validate (int sum, int data[])
+ {
+   int total = 0;
+   for (int i = 0; i < N; ++i)
+     total += data[i];
+   return sum == total;
+ }
+ 
+ int main (void)
+ {
+   int data[N];
+   std::unordered_set<int> _set;
+   int sum = 0;
+ 
+   srand (time (NULL));
+   init (data);
+ 
+   #pragma omp target data map (to: data[:N]) map (alloc: _set)
+     {
+       #pragma omp target
+ 	{
+ #ifndef MEM_SHARED
+ 	  new (&_set) std::unordered_set<int> ();
+ #endif
+ 	  for (int i = 0; i < N; ++i)
+ 	    _set.insert (data[i]);
+ 	}
+ 
+       #pragma omp target teams distribute parallel for reduction (+:sum)
+ 	for (int i = 0; i < MAX; ++i)
+ 	  if (_set.count (i) > 0)
+ 	    sum += i;
+ 
+ #ifndef MEM_SHARED
+       #pragma omp target
+ 	_set.~unordered_set ();
+ #endif
+     }
+ 
+   bool ok = validate (sum, data);
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__valarray-1.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__valarray-1.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__valarray-1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__valarray-1.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,179 ----
+ // { dg-additional-options -std=c++20 }
+ // { dg-output-file target-std__valarray-1.output }
+ 
+ #include <valarray>
+ #include <ostream>
+ #include <sstream>
+ 
+ 
+ /*TODO Work around PR118484 "ICE during IPA pass: cp, segfault in determine_versionability ipa-cp.cc:467".
+ 
+ We can't:
+ 
+     #pragma omp declare target(std::basic_streambuf<char, std::char_traits<char>>::basic_streambuf)
+ 
+ ... because:
+ 
+     error: overloaded function name ‘std::basic_streambuf<char>::__ct ’ in clause ‘enter’
+ 
+ Therefore, use dummy classes in '#pragma omp declare target':
+ */
+ 
+ #pragma omp declare target
+ 
+ // For 'std::basic_streambuf<char, std::char_traits<char> >::basic_streambuf':
+ 
+ class dummy_basic_streambuf__char
+   : public std::basic_streambuf<char>
+ {
+ public:
+   dummy_basic_streambuf__char() {}
+ };
+ 
+ // For 'std::basic_ios<char, std::char_traits<char> >::basic_ios()':
+ 
+ class dummy_basic_ios__char
+   : public std::basic_ios<char>
+ {
+ public:
+   dummy_basic_ios__char() {}
+ };
+ 
+ #pragma omp end declare target
+ 
+ 
+ int main()
+ {
+   // Due to PR120021 "Offloading vs. C++ 'std::initializer_list'", we can't construct these on the device.
+   std::initializer_list<int> v1_i = {10, 20, 30, 40, 50};
+   const int *v1_i_data = std::data(v1_i);
+   size_t v1_i_size = v1_i.size();
+   std::initializer_list<int> v2_i = {5, 4, 3, 2, 1};
+   const int *v2_i_data = std::data(v2_i);
+   size_t v2_i_size = v2_i.size();
+   std::initializer_list<int> shiftData_i = {1, 2, 3, 4, 5};
+   const int *shiftData_i_data = std::data(shiftData_i);
+   size_t shiftData_i_size = shiftData_i.size();
+ #pragma omp target \
+   defaultmap(none) \
+   map(to: v1_i_data[:v1_i_size], v1_i_size, \
+           v2_i_data[:v2_i_size], v2_i_size, \
+           shiftData_i_data[:shiftData_i_size], shiftData_i_size)
+   {
+     /* Manually set up a buffer we can stream into, similar to 'cout << [...]', and print it at the end of region.  */
+     std::stringbuf out_b;
+     std::ostream out(&out_b);
+ 
+     std::valarray<int> v1(v1_i_data, v1_i_size);
+     out << "\nv1:";
+     for (auto val : v1)
+       out << " " << val;
+ 
+     std::valarray<int> v2(v2_i_data, v2_i_size);
+     out << "\nv2:";
+     for (auto val : v2)
+       out << " " << val;
+ 
+     std::valarray<int> sum = v1 + v2;
+     out << "\nv1 + v2:";
+     for (auto val : sum)
+       out << " " << val;
+ 
+     std::valarray<int> diff = v1 - v2;
+     out << "\nv1 - v2:";
+     for (auto val : diff)
+       out << " " << val;
+ 
+     std::valarray<int> product = v1 * v2;
+     out << "\nv1 * v2:";
+     for (auto val : product)
+       out << " " << val;
+ 
+     std::valarray<int> quotient = v1 / v2;
+     out << "\nv1 / v2:";
+     for (auto val : quotient)
+       out << " " << val;
+ 
+     std::valarray<int> squares = pow(v1, 2);
+     out << "\npow(v1, 2):";
+     for (auto val : squares)
+       out << " " << val;
+ 
+     std::valarray<int> sinhs = sinh(v2);
+     out << "\nsinh(v2):";
+     for (auto val : sinhs)
+       out << " " << val;
+ 
+     std::valarray<int> logs = log(v1 * v2);
+     out << "\nlog(v1 * v2):";
+     for (auto val : logs)
+       out << " " << val;
+ 
+     std::valarray<int> data(12);
+     for (size_t i = 0; i < data.size(); ++i)
+       data[i] = i;
+     out << "\nOriginal array:";
+     for (auto val : data)
+       out << " " << val;
+ 
+     std::slice slice1(2, 5, 1);
+     std::valarray<int> sliced1 = data[slice1];
+     out << "\nSlice(2, 5, 1):";
+     for (auto val : sliced1)
+       out << " " << val;
+ 
+     std::slice slice2(1, 4, 3);
+     std::valarray<int> sliced2 = data[slice2];
+     out << "\nSlice(1, 4, 3):";
+     for (auto val : sliced2)
+       out << " " << val;
+ 
+     data[slice1] = 99;
+     out << "\nArray after slice modification:";
+     for (auto val : data)
+       out << " " << val;
+ 
+     std::valarray<bool> mask = (v1 > 20);
+     out << "\nElements of v1 > 20:";
+     for (size_t i = 0; i < v1.size(); ++i)
+       {
+ 	if (mask[i])
+ 	  out << " " << v1[i];
+       }
+ 
+     std::valarray<int> masked = v1[mask];
+     out << "\nMasked array:";
+     for (auto val : masked)
+       out << " " << val;
+ 
+     std::valarray<int> shiftData(shiftData_i_data, shiftData_i_size);
+     out << "\nOriginal shiftData:";
+     for (auto val : shiftData)
+       out << " " << val;
+ 
+     std::valarray<int> shifted = shiftData.shift(2);
+     out << "\nshift(2):";
+     for (auto val : shifted)
+       out << " " << val;
+ 
+     std::valarray<int> cshifted = shiftData.cshift(-1);
+     out << "\ncshift(-1):";
+     for (auto val : cshifted)
+       out << " " << val;
+ 
+     out << "\nSum(v1): " << v1.sum();
+     out << "\nMin(v1): " << v1.min();
+     out << "\nMax(v1): " << v1.max();
+ 
+     out << "\n";
+ 
+     /* Terminate with a NUL.  Otherwise, we'd have to use:
+            __builtin_printf("%.*s", (int) out_b_sv.size(), out_b_sv.data());
+        ... which nvptx 'printf', as implemented via PTX 'vprintf', doesn't support (TODO).  */
+     out << '\0';
+     std::string_view out_b_sv = out_b.view();
+     __builtin_printf("%s", out_b_sv.data());
+   }
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__valarray-1.output gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__valarray-1.output
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__valarray-1.output	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__valarray-1.output	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,22 ----
+ 
+ v1: 10 20 30 40 50
+ v2: 5 4 3 2 1
+ v1 + v2: 15 24 33 42 51
+ v1 - v2: 5 16 27 38 49
+ v1 * v2: 50 80 90 80 50
+ v1 / v2: 2 5 10 20 50
+ pow(v1, 2): 100 400 900 1600 2500
+ sinh(v2): 74 27 10 3 1
+ log(v1 * v2): 3 4 4 4 3
+ Original array: 0 1 2 3 4 5 6 7 8 9 10 11
+ Slice(2, 5, 1): 2 3 4 5 6
+ Slice(1, 4, 3): 1 4 7 10
+ Array after slice modification: 0 1 99 99 99 99 99 7 8 9 10 11
+ Elements of v1 > 20: 30 40 50
+ Masked array: 30 40 50
+ Original shiftData: 1 2 3 4 5
+ shift(2): 3 4 5 0 0
+ cshift(-1): 5 1 2 3 4
+ Sum(v1): 150
+ Min(v1): 10
+ Max(v1): 50
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent-usm.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent-usm.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent-usm.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent-usm.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,5 ----
+ #pragma omp requires unified_shared_memory self_maps
+ 
+ #define MEM_SHARED
+ 
+ #include "target-std__valarray-concurrent.C"
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,66 ----
+ // { dg-do run }
+ // { dg-additional-options -DMEM_SHARED { target offload_device_shared_as } }
+ 
+ #include <stdlib.h>
+ #include <time.h>
+ #include <valarray>
+ 
+ #define N 50000
+ 
+ void init (int data[])
+ {
+   for (int i = 0; i < N; ++i)
+     data[i] = rand ();
+ }
+ 
+ #pragma omp declare target
+ bool validate (const std::valarray<int> &arr, int data[])
+ {
+   for (int i = 0; i < N; ++i)
+     if (arr[i] != data[i] * data[i] + i)
+       return false;
+   return true;
+ }
+ #pragma omp end declare target
+ 
+ int main (void)
+ {
+   int data[N];
+   bool ok;
+ 
+   srand (time (NULL));
+   init (data);
+ 
+ #ifdef MEM_SHARED
+   std::valarray<int> arr (data, N);
+ #else
+   std::valarray<int> arr;
+ #endif
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target data map (to: data[:N]) map (alloc: arr)
+ #endif
+     {
+       #pragma omp target
+ 	{
+ #ifndef MEM_SHARED
+ 	  new (&arr) std::valarray<int> (data, N);
+ #endif
+ 	  arr *= arr;
+ 	}
+ 
+       #pragma omp target teams distribute parallel for
+ 	for (int i = 0; i < N; ++i)
+ 	  arr[i] += i;
+ 
+       #pragma omp target map (from: ok)
+ 	{
+ 	  ok = validate (arr, data);
+ #ifndef MEM_SHARED
+ 	  arr.~valarray ();
+ #endif
+ 	}
+     }
+ 
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__vector-concurrent-usm.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__vector-concurrent-usm.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__vector-concurrent-usm.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__vector-concurrent-usm.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,5 ----
+ #pragma omp requires unified_shared_memory self_maps
+ 
+ #define MEM_SHARED
+ 
+ #include "target-std__vector-concurrent.C"
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__vector-concurrent.C gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__vector-concurrent.C
*** gcc-16-20250525/libgomp/testsuite/libgomp.c++/target-std__vector-concurrent.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c++/target-std__vector-concurrent.C	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,63 ----
+ // { dg-do run }
+ // { dg-additional-options -DMEM_SHARED { target offload_device_shared_as } }
+ 
+ #include <stdlib.h>
+ #include <time.h>
+ #include <vector>
+ 
+ #define N 50000
+ 
+ void init (int data[])
+ {
+   for (int i = 0; i < N; ++i)
+     data[i] = rand ();
+ }
+ 
+ #pragma omp declare target
+ bool validate (const std::vector<int> &vec, int data[])
+ {
+   for (int i = 0; i < N; ++i)
+     if (vec[i] != data[i] * data[i])
+       return false;
+   return true;
+ }
+ #pragma omp end declare target
+ 
+ int main (void)
+ {
+   int data[N];
+   bool ok;
+ 
+   srand (time (NULL));
+   init (data);
+ 
+ #ifdef MEM_SHARED
+   std::vector<int> vec (data, data + N);
+ #else
+   std::vector<int> vec;
+ #endif
+ 
+ #ifndef MEM_SHARED
+   #pragma omp target data map (to: data[:N]) map (alloc: vec)
+ #endif
+     {
+ #ifndef MEM_SHARED
+       #pragma omp target
+ 	new (&vec) std::vector<int> (data, data + N);
+ #endif
+ 
+       #pragma omp target teams distribute parallel for
+ 	for (int i = 0; i < N; ++i)
+ 	  vec[i] *= vec[i];
+ 
+       #pragma omp target map (from: ok)
+ 	{
+ 	  ok = validate (vec, data);
+ #ifndef MEM_SHARED
+ 	  vec.~vector ();
+ #endif
+ 	}
+     }
+ 
+   return ok ? 0 : 1;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-10.c gcc-16-20250601/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-10.c
*** gcc-16-20250525/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-10.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-10.c	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,64 ----
+ /* { dg-do run } */
+ 
+ #include <string.h>
+ #include <stdlib.h>
+ #include <assert.h>
+ 
+ #define N 64
+ 
+ typedef struct {
+   int *arr;
+   int size;
+ } B;
+ 
+ #pragma omp declare mapper (mapB : B myb) map(to: myb.size, myb.arr) \
+ 					  map(tofrom: myb.arr[0:myb.size])
+ // While GCC handles more, only default is ...
+ #pragma omp declare mapper (default : B myb) map(to: myb.size, myb.arr) \
+ 					  map(tofrom: myb.arr[0:myb.size])
+ 
+ struct A {
+   int *arr1;
+   B *arr2;
+   int arr3[N];
+ };
+ 
+ int
+ main (int argc, char *argv[])
+ {
+   struct A var;
+ 
+   memset (&var, 0, sizeof var);
+   var.arr1 = (int *) calloc (N, sizeof (int));
+   var.arr2 = (B *) malloc (sizeof (B));
+   var.arr2->arr = (int *) calloc (N, sizeof (float));
+   var.arr2->size = N;
+ 
+   {
+     // ... permitted here:
+     #pragma omp declare mapper (struct A x) map(to: x.arr1, x.arr2) \
+ 			  map(tofrom: x.arr1[0:N]) \
+ 			  map(mapper(default), tofrom: x.arr2[0:1])
+     #pragma omp target
+     {
+       for (int i = 0; i < N; i++)
+ 	{
+ 	  var.arr1[i]++;
+ 	  var.arr2->arr[i]++;
+ 	}
+     }
+   }
+ 
+   for (int i = 0; i < N; i++)
+     {
+       assert (var.arr1[i] == 1);
+       assert (var.arr2->arr[i] == 1);
+       assert (var.arr3[i] == 0);
+     }
+ 
+   free (var.arr1);
+   free (var.arr2->arr);
+   free (var.arr2);
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-11.c gcc-16-20250601/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-11.c
*** gcc-16-20250525/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-11.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-11.c	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,59 ----
+ /* { dg-do run } */
+ 
+ #include <string.h>
+ #include <stdlib.h>
+ #include <assert.h>
+ 
+ #define N 64
+ 
+ typedef struct B_tag {
+   int *arr;
+   int size;
+ } B;
+ 
+ #pragma omp declare mapper (B myb) map(to: myb.size, myb.arr) \
+ 				   map(tofrom: myb.arr[0:myb.size])
+ 
+ struct A {
+   int *arr1;
+   B *arr2;
+   int arr3[N];
+ };
+ 
+ int
+ main (int argc, char *argv[])
+ {
+   struct A var;
+ 
+   memset (&var, 0, sizeof var);
+   var.arr1 = (int *) calloc (N, sizeof (int));
+   var.arr2 = (B *) malloc (sizeof (B));
+   var.arr2->arr = (int *) calloc (N, sizeof (int));
+   var.arr2->size = N;
+ 
+   {
+     #pragma omp declare mapper (struct A x) map(to: x.arr1, x.arr2) \
+ 			map(tofrom: x.arr1[0:N]) map(tofrom: x.arr2[0:1])
+     #pragma omp target
+     {
+       for (int i = 0; i < N; i++)
+ 	{
+ 	  var.arr1[i]++;
+ 	  var.arr2->arr[i]++;
+ 	}
+     }
+   }
+ 
+   for (int i = 0; i < N; i++)
+     {
+       assert (var.arr1[i] == 1);
+       assert (var.arr2->arr[i] == 1);
+       assert (var.arr3[i] == 0);
+     }
+ 
+   free (var.arr1);
+   free (var.arr2->arr);
+   free (var.arr2);
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-12.c gcc-16-20250601/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-12.c
*** gcc-16-20250525/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-12.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-12.c	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,94 ----
+ /* { dg-do run } */
+ 
+ #include <string.h>
+ #include <stdlib.h>
+ #include <assert.h>
+ 
+ #define N 64
+ 
+ typedef struct {
+   int *arr;
+   int size;
+ } B;
+ 
+ #pragma omp declare mapper (samename : B myb) map(to: myb.size, myb.arr) \
+ 					      map(tofrom: myb.arr[0:myb.size])
+ // While GCC handles more, only default is ...
+ #pragma omp declare mapper (default : B myb) map(to: myb.size, myb.arr) \
+ 					      map(tofrom: myb.arr[0:myb.size])
+ typedef struct {
+   int *arr;
+   int size;
+ } C;
+ 
+ 
+ struct A {
+   int *arr1;
+   B *arr2;
+   C *arr3;
+ };
+ 
+ int
+ main (int argc, char *argv[])
+ {
+   struct A var;
+ 
+   memset (&var, 0, sizeof var);
+   var.arr1 = (int *) calloc (N, sizeof (int));
+   var.arr2 = (B *) malloc (sizeof (B));
+   var.arr2->arr = (int *) calloc (N, sizeof (int));
+   var.arr2->size = N;
+   var.arr3 = (C *) malloc (sizeof (C));
+   var.arr3->arr = (int *) calloc (N, sizeof (int));
+   var.arr3->size = N;
+ 
+   {
+     // ... permitted here.
+     #pragma omp declare mapper (struct A x) map(to: x.arr1, x.arr2) \
+ 			map(tofrom: x.arr1[0:N]) \
+ 			map(mapper(default), tofrom: x.arr2[0:1])
+     #pragma omp target
+     {
+       for (int i = 0; i < N; i++)
+ 	{
+ 	  var.arr1[i]++;
+ 	  var.arr2->arr[i]++;
+ 	}
+     }
+   }
+ 
+   {
+     #pragma omp declare mapper (samename : C myc) map(to: myc.size, myc.arr) \
+ 			map(tofrom: myc.arr[0:myc.size])
+     // While GCC handles more, only default is ...
+     #pragma omp declare mapper (default : C myc) map(to: myc.size, myc.arr) \
+ 			map(tofrom: myc.arr[0:myc.size])
+     // ... permitted here.
+     #pragma omp declare mapper (struct A x) map(to: x.arr1, x.arr3) \
+ 			map(tofrom: x.arr1[0:N]) \
+ 			map(mapper( default ) , tofrom: *x.arr3)
+     #pragma omp target
+     {
+       for (int i = 0; i < N; i++)
+ 	{
+ 	  var.arr1[i]++;
+ 	  var.arr3->arr[i]++;
+ 	}
+     }
+   }
+ 
+   for (int i = 0; i < N; i++)
+     {
+       assert (var.arr1[i] == 2);
+       assert (var.arr2->arr[i] == 1);
+       assert (var.arr3->arr[i] == 1);
+     }
+ 
+   free (var.arr1);
+   free (var.arr2->arr);
+   free (var.arr2);
+   free (var.arr3->arr);
+   free (var.arr3);
+ 
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-13.c gcc-16-20250601/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-13.c
*** gcc-16-20250525/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-13.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-13.c	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,55 ----
+ /* { dg-do run } */
+ 
+ #include <assert.h>
+ 
+ struct T {
+   int a;
+   int b;
+   int c;
+ };
+ 
+ void foo (void)
+ {
+   struct T x;
+   x.a = x.b = x.c = 0;
+ 
+ #pragma omp target
+   {
+     x.a++;
+     x.c++;
+   }
+ 
+   assert (x.a == 1);
+   assert (x.b == 0);
+   assert (x.c == 1);
+ }
+ 
+ // An identity mapper.  This should do the same thing as the default!
+ #pragma omp declare mapper (struct T v) map(v)
+ 
+ void bar (void)
+ {
+   struct T x;
+   x.a = x.b = x.c = 0;
+ 
+ #pragma omp target
+   {
+     x.b++;
+   }
+ 
+ #pragma omp target map(x)
+   {
+     x.a++;
+   }
+ 
+   assert (x.a == 1);
+   assert (x.b == 1);
+   assert (x.c == 0);
+ }
+ 
+ int main (int argc, char *argv[])
+ {
+   foo ();
+   bar ();
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-14.c gcc-16-20250601/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-14.c
*** gcc-16-20250525/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-14.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-14.c	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,57 ----
+ /* { dg-do run } */
+ 
+ #include <stdlib.h>
+ #include <assert.h>
+ 
+ struct Z {
+   int *arr;
+ };
+ 
+ void baz (struct Z *zarr, int len)
+ {
+ #pragma omp declare mapper (struct Z myvar) map(to: myvar.arr) \
+ 					    map(tofrom: myvar.arr[0:len])
+   zarr[0].arr = (int *) calloc (len, sizeof (int));
+   zarr[5].arr = (int *) calloc (len, sizeof (int));
+ 
+ #pragma omp target map(zarr, *zarr)
+   {
+     for (int i = 0; i < len; i++)
+       zarr[0].arr[i]++;
+   }
+ 
+ #pragma omp target map(zarr, zarr[5])
+   {
+     for (int i = 0; i < len; i++)
+       zarr[5].arr[i]++;
+   }
+ 
+ #pragma omp target map(zarr[5])
+   {
+     for (int i = 0; i < len; i++)
+       zarr[5].arr[i]++;
+   }
+ 
+ #pragma omp target map(zarr, zarr[5:1])
+   {
+     for (int i = 0; i < len; i++)
+       zarr[5].arr[i]++;
+   }
+ 
+   for (int i = 0; i < len; i++)
+     assert (zarr[0].arr[i] == 1);
+ 
+   for (int i = 0; i < len; i++)
+     assert (zarr[5].arr[i] == 3);
+ 
+   free (zarr[5].arr);
+   free (zarr[0].arr);
+ }
+ 
+ int
+ main (int argc, char *argv[])
+ {
+   struct Z myzarr[10];
+   baz (myzarr, 256);
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-9.c gcc-16-20250601/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-9.c
*** gcc-16-20250525/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-9.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c-c++-common/declare-mapper-9.c	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1,62 ----
+ /* { dg-do run } */
+ 
+ #include <string.h>
+ #include <stdlib.h>
+ #include <assert.h>
+ 
+ #define N 64
+ 
+ struct A {
+   int *arr1;
+   float *arr2;
+   int arr3[N];
+ };
+ 
+ int
+ main (int argc, char *argv[])
+ {
+   struct A var;
+ 
+   memset (&var, 0, sizeof var);
+   var.arr1 = (int *) calloc (N, sizeof (int));
+   var.arr2 = (float *) calloc (N, sizeof (float));
+ 
+   {
+     #pragma omp declare mapper (struct A x) map(to: x.arr1) \
+ 					    map(tofrom: x.arr1[0:N])
+     #pragma omp target
+     {
+       for (int i = 0; i < N; i++)
+ 	var.arr1[i]++;
+     }
+   }
+ 
+   {
+     #pragma omp declare mapper (struct A x) map(to: x.arr2) \
+ 					    map(tofrom: x.arr2[0:N])
+     #pragma omp target
+     {
+       for (int i = 0; i < N; i++)
+ 	var.arr2[i]++;
+     }
+   }
+ 
+   {
+     #pragma omp declare mapper (struct A x) map(tofrom: x.arr3[0:N])
+     #pragma omp target
+     {
+       for (int i = 0; i < N; i++)
+ 	var.arr3[i]++;
+     }
+   }
+ 
+   for (int i = 0; i < N; i++)
+     {
+       assert (var.arr1[i] == 1);
+       assert (var.arr2[i] == 1);
+       assert (var.arr3[i] == 1);
+     }
+ 
+   free (var.arr1);
+   free (var.arr2);
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c-c++-common/target-abi-struct-1-O0.c gcc-16-20250601/libgomp/testsuite/libgomp.c-c++-common/target-abi-struct-1-O0.c
*** gcc-16-20250525/libgomp/testsuite/libgomp.c-c++-common/target-abi-struct-1-O0.c	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libgomp/testsuite/libgomp.c-c++-common/target-abi-struct-1-O0.c	Sun Jun  1 22:32:36 2025
***************
*** 1,3 ****
  /* { dg-additional-options -O0 } */
  
! #include "../libgomp.oacc-c-c++-common/abi-struct-1.c"
--- 1,3 ----
  /* { dg-additional-options -O0 } */
  
! #include "target-abi-struct-1.c"
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.c-c++-common/target-abi-struct-1.c gcc-16-20250601/libgomp/testsuite/libgomp.c-c++-common/target-abi-struct-1.c
*** gcc-16-20250525/libgomp/testsuite/libgomp.c-c++-common/target-abi-struct-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.c-c++-common/target-abi-struct-1.c	Sun Jun  1 22:32:36 2025
***************
*** 0 ****
--- 1 ----
+ #include "../libgomp.oacc-c-c++-common/abi-struct-1.c"
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.fortran/metadirective-1.f90 gcc-16-20250601/libgomp/testsuite/libgomp.fortran/metadirective-1.f90
*** gcc-16-20250525/libgomp/testsuite/libgomp.fortran/metadirective-1.f90	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libgomp/testsuite/libgomp.fortran/metadirective-1.f90	Sun Jun  1 22:32:37 2025
***************
*** 1,4 ****
! ! { dg-do run }
  
  program test
    implicit none
--- 1,5 ----
! ! { dg-do run { target { ! offload_target_nvptx } } }
! ! { dg-do compile { target offload_target_nvptx } }
  
  program test
    implicit none
*************** program test
*** 33,38 ****
--- 34,43 ----
  contains
    subroutine f (x, y, z)
      integer :: x(N), y(N), z(N)
+     ! The following fails as on the host the target side cannot be
+     ! resolved - and the 'teams' or not status affects how 'target'
+     ! is called. -> See PR118694, esp. comment 9.
+     ! Note also the dg-do compile above for offload_target_nvptx
  
      !$omp target map (to: x, y) map(from: z)
        block
*************** contains
*** 43,48 ****
--- 48,54 ----
  	  z(i) = x(i) * y(i)
  	enddo
        end block
+     ! { dg-bogus "'target' construct with nested 'teams' construct contains directives outside of the 'teams' construct" "PR118694" { xfail offload_target_nvptx } .-9 }  */
    end subroutine
    subroutine g (x, y, z)
      integer :: x(N), y(N), z(N)
*************** contains
*** 56,61 ****
--- 62,68 ----
  	  z(i) = x(i) * y(i)
  	enddo
      end block
+     ! { dg-bogus "'target' construct with nested 'teams' construct contains directives outside of the 'teams' construct" "PR118694" { xfail offload_target_nvptx } .-9 }  */
      !$omp end target
    end subroutine
  end program
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.oacc-c-c++-common/abi-struct-1.c gcc-16-20250601/libgomp/testsuite/libgomp.oacc-c-c++-common/abi-struct-1.c
*** gcc-16-20250525/libgomp/testsuite/libgomp.oacc-c-c++-common/abi-struct-1.c	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libgomp/testsuite/libgomp.oacc-c-c++-common/abi-struct-1.c	Sun Jun  1 22:32:37 2025
***************
*** 1,6 ****
  /* Inspired by 'gcc.target/nvptx/abi-struct-arg.c', 'gcc.target/nvptx/abi-struct-ret.c'.  */
  
! /* See also '../libgomp.c-c++-common/target-abi-struct-1-O0.c'.  */
  
  typedef struct {} empty;  /* See 'gcc/doc/extend.texi', "Empty Structures".  */
  typedef struct {char a;} schar;
--- 1,10 ----
  /* Inspired by 'gcc.target/nvptx/abi-struct-arg.c', 'gcc.target/nvptx/abi-struct-ret.c'.  */
  
! /* See also '../libgomp.c-c++-common/target-abi-struct-1.c'.  */
! 
! /* To exercise PR119835 (if optimizations enabled): disable inlining, so that
!    GIMPLE passes still see the functions that return aggregate types.  */
! #pragma GCC optimize "-fno-inline"
  
  typedef struct {} empty;  /* See 'gcc/doc/extend.texi', "Empty Structures".  */
  typedef struct {char a;} schar;
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.oacc-c-c++-common/acc_memcpy_device-1.c gcc-16-20250601/libgomp/testsuite/libgomp.oacc-c-c++-common/acc_memcpy_device-1.c
*** gcc-16-20250525/libgomp/testsuite/libgomp.oacc-c-c++-common/acc_memcpy_device-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.oacc-c-c++-common/acc_memcpy_device-1.c	Sun Jun  1 22:32:37 2025
***************
*** 0 ****
--- 1,96 ----
+ /* { dg-prune-output "using .vector_length \\(32\\)" } */
+ 
+ /* PR libgomp/93226  */
+ 
+ #include <stdlib.h>
+ #include <stdint.h>
+ #include <string.h>
+ #include <openacc.h>
+ 
+ enum { N = 1024 };
+ 
+ static int D[N];
+ #pragma acc declare device_resident(D)
+ 
+ #pragma acc routine
+ intptr_t init_d()
+ {
+   for (int i = 0; i < N; i++)
+     D[i] = 27*i;
+   return (intptr_t) &D[0];
+ }
+ 
+ int
+ main ()
+ {
+   int *a, *b, *e;
+   void *d_a, *d_b, *d_c, *d_d, *d_e, *d_f;
+   intptr_t intptr;
+   bool fail = false;
+ 
+   a = (int *) malloc (N*sizeof (int));
+   b = (int *) malloc (N*sizeof (int));
+   e = (int *) malloc (N*sizeof (int));
+   d_c = acc_malloc (N*sizeof (int));
+   d_f = acc_malloc (N*sizeof (int));
+ 
+   memset (e, 0xff, N*sizeof (int));
+   d_e = acc_copyin (e, N*sizeof (int));
+ 
+   #pragma acc serial copyout(intptr)
+     intptr = init_d ();
+   d_d = (void*) intptr;
+   acc_memcpy_device (d_c, d_d, N*sizeof (int));
+ 
+   #pragma acc serial copy(fail) deviceptr(d_c) firstprivate(intptr)
+   {
+     int *cc = (int *) d_c;
+     int *dd = (int *) intptr;
+     for (int i = 0; i < N; i++)
+       if (dd[i] != 27*i || cc[i] != 27*i)
+ 	{
+ 	  fail = true;
+ 	  __builtin_abort ();
+ 	}
+   }
+   if (fail) __builtin_abort ();
+ 
+   for (int i = 0; i < N; i++)
+     a[i] = 11*i;
+   for (int i = 0; i < N; i++)
+     b[i] = 31*i;
+ 
+   d_a = acc_copyin (a, N*sizeof (int));
+   acc_copyin_async (b, N*sizeof (int), acc_async_noval);
+ 
+   #pragma acc parallel deviceptr(d_c) async
+   {
+     int *cc = (int *) d_c;
+     #pragma acc loop
+     for (int i = 0; i < N; i++)
+       cc[i] = -17*i;
+   }
+ 
+   acc_memcpy_device_async (d_d, d_a, N*sizeof (int), acc_async_noval);
+   acc_memcpy_device_async (d_f, d_c, N*sizeof (int), acc_async_noval);
+   acc_wait (acc_async_noval);
+   d_b = acc_deviceptr (b);
+   acc_memcpy_device_async (d_e, d_b, N*sizeof (int), acc_async_noval);
+   acc_wait (acc_async_noval);
+ 
+   #pragma acc serial deviceptr(d_d, d_e, d_f) copy(fail)
+   {
+     int *dd = (int *) d_d;
+     int *ee = (int *) d_e;
+     int *ff = (int *) d_f;
+     for (int i = 0; i < N; i++)
+       if (dd[i] != 11*i
+ 	  || ee[i] != 31*i
+ 	  || ff[i] != -17*i)
+ 	{
+ 	  fail = true;
+ 	  __builtin_abort ();
+ 	}
+   }
+   if (fail) __builtin_abort ();
+ }
diff -Nrcpad gcc-16-20250525/libgomp/testsuite/libgomp.oacc-fortran/acc_memcpy_device-1.f90 gcc-16-20250601/libgomp/testsuite/libgomp.oacc-fortran/acc_memcpy_device-1.f90
*** gcc-16-20250525/libgomp/testsuite/libgomp.oacc-fortran/acc_memcpy_device-1.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libgomp/testsuite/libgomp.oacc-fortran/acc_memcpy_device-1.f90	Sun Jun  1 22:32:37 2025
***************
*** 0 ****
--- 1,113 ----
+ ! { dg-prune-output "using .vector_length \\(32\\)" }
+ 
+ ! PR libgomp/93226  */
+ 
+ module m
+   use iso_c_binding
+   use openacc
+   implicit none (external, type)
+ 
+   integer, parameter :: N = 1024
+ 
+   integer :: D(N)
+   !$acc declare device_resident(D)
+ 
+ contains
+ 
+   integer(c_intptr_t) function init_d()
+     !$acc routine
+     integer :: i
+     do i = 1, N
+       D(i) = 27*i
+     end do
+     init_d = loc(D)
+   end
+ end module
+ 
+ program main
+   use m
+   implicit none (external, type)
+ 
+   integer, allocatable, target :: a(:), b(:), e(:)
+   type(c_ptr) :: d_a, d_b, d_c, d_d, d_e, d_f
+   integer(c_intptr_t) intptr
+   integer :: i
+   logical fail
+ 
+   fail = .false.
+ 
+   allocate(a(N), b(N), e(N))
+   d_c = acc_malloc (N*c_sizeof (i))
+   d_f = acc_malloc (N*c_sizeof (i))
+ 
+   e = huge(e)
+   call acc_copyin (e, N*c_sizeof (i));
+   d_e = acc_deviceptr (e);
+ 
+   !$acc serial copyout(intptr)
+     intptr = init_d ()
+   !$acc end serial
+   d_d = transfer(intptr, d_d)
+   call acc_memcpy_device (d_c, d_d, N*c_sizeof (i))
+ 
+   !$acc serial copy(fail) copy(a) deviceptr(d_c, d_d) firstprivate(intptr)
+     block
+       integer, pointer :: cc(:), dd(:)
+       call c_f_pointer (d_c, cc, [N])
+       call c_f_pointer (d_d, dd, [N])
+       a = cc
+       do i = 1, N
+         if (dd(i) /= 27*i .or. cc(i) /= 27*i) then
+           fail = .true.
+           stop 1
+         end if
+       end do
+     end block
+   !$acc end serial
+   if (fail) error stop 1
+ 
+   do i = 1, N
+     a(i) = 11*i
+     b(i) = 31*i
+   end do
+ 
+   call acc_copyin (a, N*c_sizeof (i))
+   d_a = acc_deviceptr (a)
+   call acc_copyin_async (b, N*c_sizeof (i), acc_async_noval)
+ 
+   !$acc parallel deviceptr(d_c) private(i) async
+     block
+       integer, pointer :: cc(:)
+       call c_f_pointer (d_c, cc, [N])
+       !$acc loop
+       do i = 1, N
+         cc(i) = -17*i
+       end do
+     end block
+   !$acc end parallel
+ 
+   call acc_memcpy_device_async (d_d, d_a, N*c_sizeof (i), acc_async_noval)
+   call acc_memcpy_device_async (d_f, d_c, N*c_sizeof (i), acc_async_noval)
+   call acc_wait (acc_async_noval)
+   d_b = acc_deviceptr (b)
+   call acc_memcpy_device_async (d_e, d_b, N*c_sizeof (i), acc_async_noval)
+   call acc_wait (acc_async_noval)
+ 
+   !$acc serial deviceptr(d_d, d_e, d_f) private(i) copy(fail)
+     block
+     integer, pointer :: dd(:), ee(:), ff(:)
+     call c_f_pointer (d_d, dd, [N])
+     call c_f_pointer (d_e, ee, [N])
+     call c_f_pointer (d_f, ff, [N])
+     do i = 1, N
+       if (dd(i) /= 11*i        &
+           .or. ee(i) /= 31*i   &
+           .or. ff(i) /= -17*i) then
+         fail = .true.
+         stop 2
+       end if
+     end do
+     end block
+   !$acc end serial
+   if (fail) error stop 2
+ end
diff -Nrcpad gcc-16-20250525/libstdc++-v3/ChangeLog gcc-16-20250601/libstdc++-v3/ChangeLog
*** gcc-16-20250525/libstdc++-v3/ChangeLog	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libstdc++-v3/ChangeLog	Sun Jun  1 22:32:40 2025
***************
*** 1,3 ****
--- 1,456 ----
+ 2025-05-30  Tomasz Kamiński  <tkaminsk@redhat.com>
+ 
+ 	* testsuite/std/time/format/empty_spec.cc: New test.
+ 
+ 2025-05-30  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/bits/atomic_timed_wait.h: Use __wait_result_type.
+ 	* include/bits/atomic_wait.h (__wait_result_type): New struct.
+ 	(__wait_args::_M_prep_for_wait_on): Rename to _M_setup_wait, use
+ 	__wait_result_type.
+ 	(__atomic_wait_address): Adjust to call _M_setup_wait.
+ 	* src/c++20/atomic.cc (__spin_impl): Use __wait_result_type.
+ 	(__wait_impl): Likewise.
+ 	(__spin_until_impl): Likewise.
+ 	(__wait_until_impl): Likewise.
+ 
+ 2025-05-30  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	PR libstdc++/118494
+ 	PR libstdc++/110854
+ 	PR libstdc++/98749
+ 	* acinclude.m4 (GLIBCXX_CHECK_GTHREADS): Remove checks for
+ 	sem_timedwait. Do not define _GLIBCXX_HAVE_POSIX_SEMAPHORE.
+ 	* config.h.in: Regenerate.
+ 	* configure: Regenerate.
+ 	* include/bits/semaphore_base.h (__platform_semaphore): Remove.
+ 	(__atomic_semaphore): Replace with __semaphore_base<bool> and
+ 	make type of _M_count depend on template parameter. Fix _S_max
+ 	constant to use correct type.
+ 	(__semaphore_base::_M_try_acquire): Qualify to avoid ADL.
+ 	(__semaphore_base::_M_release): Return old value. Remove FIXME
+ 	comment.
+ 	(__semaphore_impl): Replace typedef with alias template.
+ 	* include/bits/version.def (semaphore): Do not depend on
+ 	_GLIBCXX_HAVE_POSIX_SEMAPHORE.
+ 	* include/bits/version.h: Regenerate.
+ 	* include/std/semaphore (semaphore): Adjust type of _M_sem
+ 	member. Add constexpr to constructor. Add assertions to
+ 	(semaphore::semaphore(ptrdiff_t)): Add constexpr. Add assertion
+ 	for precondition.
+ 	(semaphore::release): Add assertion using value returned from
+ 	_M_release.
+ 	* testsuite/30_threads/semaphore/100806.cc: Increase template
+ 	argument for std::counting_semaphore, so constructor
+ 	precondition is met.
+ 	* testsuite/30_threads/semaphore/cons.cc: New test.
+ 	* testsuite/30_threads/semaphore/try_acquire_posix.cc: Remove.
+ 	* testsuite/30_threads/semaphore/platform_try_acquire_for.cc:
+ 	Removed.
+ 
+ 2025-05-30  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/std/barrier (__tree_barrier_base): New class.
+ 	(__tree_barrier): Move non-dependent code into
+ 	__tree_barrier_base and derive from it.
+ 
+ 2025-05-30  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	PR libstdc++/118395
+ 	PR libstdc++/108974
+ 	PR libstdc++/98749
+ 	* include/std/barrier (__tree_barrier): Use default
+ 	member-initializers. Change _M_state member from
+ 	unique_ptr<__state_t[]> to atomic<__state_t*>. Add
+ 	no_unique_address attribute to _M_completion.
+ 	(__tree_barrier::_M_arrive): Load value from _M_state.
+ 	(__tree_barrier::_M_invoke_completion): New member function to
+ 	ensure a throwing completion function will terminate, as
+ 	proposed in LWG 3898.
+ 	(__tree_barrier::max): Reduce by one to avoid overflow.
+ 	(__tree_barrier::__tree_barrier): Add constexpr. Qualify call to
+ 	std::move. Remove mem-initializers made unnecessary by default
+ 	member-initializers. Add precondition check. Only allocate state
+ 	array if not constant evaluated.
+ 	(__tree_barrier::arrive): Add precondition check. Do deferred
+ 	initialization of _M_state if needed.
+ 	(barrier): Add static_assert, as proposed in LWG 3898.
+ 	(barrier::barrier): Add constexpr.
+ 	* testsuite/30_threads/barrier/cons.cc: New test.
+ 	* testsuite/30_threads/barrier/lwg3898.cc: New test.
+ 
+ 2025-05-30  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/std/latch (latch::arrive_and_wait): Optimise.
+ 
+ 2025-05-30  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* config/abi/pre/gnu.ver: Add new symbol version and exports.
+ 	* include/bits/atomic_timed_wait.h (__platform_wait_until): Move
+ 	to atomic.cc.
+ 	(__cond_wait_until, __spin_until_impl): Likewise.
+ 	(__wait_until_impl): Likewise. Change __wait_args_base parameter
+ 	to non-const reference and change third parameter to
+ 	__wait_clock_t::duration.
+ 	(__wait_until): Change __wait_args_base parameter to non-const
+ 	reference. Change Call time_since_epoch() to get duration from
+ 	time_point.
+ 	(__wait_for): Change __wait_args_base parameter to non-const
+ 	reference.
+ 	(__atomic_wait_address_until): Call _M_prep_for_wait_on on args.
+ 	(__atomic_wait_address_for): Likewise.
+ 	(__atomic_wait_address_until_v): Qualify call to avoid ADL. Do
+ 	not forward __vfn.
+ 	* include/bits/atomic_wait.h (__platform_wait_uses_type): Use
+ 	alignof(T) not alignof(T*).
+ 	(__futex_wait_flags, __platform_wait, __platform_notify)
+ 	(__waitable_state, __spin_impl, __notify_impl): Move to
+ 	atomic.cc.
+ 	(__wait_impl): Likewise. Change __wait_args_base parameter to
+ 	non-const reference.
+ 	(__wait_args_base::_M_wait_state): New data member.
+ 	(__wait_args_base::_M_prep_for_wait_on): New member function.
+ 	(__wait_args_base::_M_load_proxy_wait_val): New member
+ 	function.
+ 	(__wait_args_base::_S_memory_order_for): Remove member function.
+ 	(__atomic_wait_address): Call _M_prep_for_wait_on on args.
+ 	(__atomic_wait_address_v): Qualify call to avoid ADL.
+ 	* src/c++20/Makefile.am: Add new file.
+ 	* src/c++20/Makefile.in: Regenerate.
+ 	* src/c++20/atomic.cc: New file.
+ 	* testsuite/17_intro/headers/c++1998/49745.cc: Remove XFAIL for
+ 	C++20 and later.
+ 	* testsuite/29_atomics/atomic/wait_notify/100334.cc: Remove use
+ 	of internal implementation details.
+ 	* testsuite/util/testsuite_abi.cc: Add GLIBCXX_3.4.35 version.
+ 
+ 2025-05-30  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/bits/atomic_timed_wait.h (__wait_until_impl): Adjust
+ 	to use new naming.
+ 	* include/bits/atomic_wait.h (__waiter_pool_impl): Rename to
+ 	__waitable_state.
+ 	(__waiter_pool_impl::_S_wait): Rename to _M_waiters.
+ 	(__waiter_pool_impl::_S_impl_for): Rename to _S_state_for.
+ 	(__waiter_pool_impl::_S_track): Adjust to use new naming.
+ 	(__wait_impl, __notify_impl): Likewise.
+ 	* testsuite/29_atomics/atomic/wait_notify/100334.cc: Adjust to
+ 	use new naming.
+ 
+ 2025-05-30  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/bits/atomic_timed_wait.h
+ 	(__atomic_wait_address_until_v): Replace __atomic_compare with
+ 	__atomic_eq.
+ 	(__atomic_wait_address_for_v): Likewise.
+ 	* include/bits/atomic_wait.h (__atomic_compare): Rename to
+ 	__atomic_eq.
+ 	(__atomic_wait_address_v): Replace __atomic_compare with
+ 	__atomic_eq.
+ 
+ 2025-05-30  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/bits/atomic_timed_wait.h (__wait_until_impl): Change
+ 	first parameter to const void* and then static_cast to const
+ 	__platform_wait_t* when not using proxied wait.
+ 	(__wait_until): Change first parameter to const void*.
+ 	(__wait_for): Likewise.
+ 	(__atomic_wait_address_until): Remove reinterpret_cast and allow
+ 	address to implicitly convert to const void* instead.
+ 	(__atomic_wait_address_for): Likewise.
+ 	* include/bits/atomic_wait.h: (__wait_impl, __notify_impl):
+ 	Change first parameter to const void* and then static_cast to
+ 	const __platform_wait_t* when not using proxied wait.
+ 	(__atomic_wait_address, __atomic_notify_address) Remove
+ 	reinterpret_cast and allow address to implicitly convert to
+ 	const void* instead.
+ 
+ 2025-05-30  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/bits/atomic_wait.h (__platform_wait): Change function
+ 	template to a normal function. The parameter is always
+ 	__platform_wait_t* which is just int* for this implementation of
+ 	the function.
+ 	(__platform_notify): Likewise.
+ 
+ 2025-05-30  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/bits/atomic_timed_wait.h (__to_wait_clock): Do not use
+ 	chrono::ceil if clock and duration are already correct type.
+ 	(__wait_until): Always call __to_wait_clock.
+ 
+ 2025-05-30  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/bits/atomic_wait.h (__notify_impl): Increment the
+ 	proxy value before returning early for the uncontended case.
+ 
+ 2025-05-30  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/bits/atomic_timed_wait.h (__cond_wait_impl): Add
+ 	missing inline keyword.
+ 	(__spin_until_impl): Change parameter from pointer to reference.
+ 	Replace make_pair with list-initialization.  Initialize variable
+ 	for return value.
+ 	(__wait_until_impl): Likewise. Remove some preprocessor
+ 	conditional logic. Use _S_track for contention tracking.
+ 	Avoid unnecessary const_cast.
+ 	(__wait_until): Change parameter from pointer to reference.
+ 	Replace make_pair with list-initialization.
+ 	(__wait_for):  Change parameter from pointer to reference. Add
+ 	__do_spin flag to args.
+ 	* include/bits/atomic_wait.h (__waiter_pool_impl::_S_track): New
+ 	function returning an RAII object for contention tracking.
+ 	(__wait_flags): Do not set the __do_spin flag in the __spin_only
+ 	enumerator. Comment out the unused __abi_version_mask
+ 	enumerator.  Define operator| and operator|= overloads.
+ 	(__wait_args_base::operator&): Define.
+ 	(__wait_args::operator&, __wait_args::_S_default_flags): Remove.
+ 	(__wait_args::operator|, __wait_args::operator|=): Remove.
+ 	(__spin_impl): Change parameter from pointer to reference.
+ 	Replace make_pair call with list-initialization.
+ 	(__wait_impl): Likewise.  Remove some preprocessor conditional
+ 	logic.  Always store old value in __args._M_old. Avoid
+ 	unnecessary const_cast. Use _S_track.
+ 	(__notify_impl): Change parameter to reference. Remove some
+ 	preprocessor conditional logic.
+ 	(__atomic_wait_address): Add comment. Update __args._M_old on
+ 	each iteration.
+ 	(__atomic_wait_address_v): Add comment.
+ 	* include/std/latch (latch::wait): Adjust predicates for new
+ 	logic.
+ 	* testsuite/29_atomics/atomic_integral/wait_notify.cc: Improve
+ 	test.
+ 
+ 2025-05-30  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/bits/atomic_timed_wait.h: Whitespace fixes.
+ 	* include/bits/atomic_wait.h: Likewise.
+ 
+ 2025-05-30  Thomas Rodgers  <trodgers@redhat.com>
+ 
+ 	* include/bits/atomic_timed_wait.h (__spin_until_impl): Accept
+ 	__wait_args as const __wait_args_base*.
+ 	(__wait_until_impl): Likewise.
+ 	(__wait_until): Likewise.
+ 	(__wait_for): Likewise.
+ 	(__atomic_wait_address_until): Pass __wait_args by address.
+ 	(__atomic_wait_address_for): Likewise.
+ 	* include/bits/atomic_wait.h (__wait_args_base): New struct.
+ 	(__wait_args): Derive from __wait_args_base.
+ 	(__wait_args::__wait_args()): Adjust ctors to call call base ctor.
+ 	(__wait_args::__wait_args(const __wait_args_base&)): New ctor.
+ 	(__wait_args::operator|=): New method.
+ 	(__wait_args::_S_flags_for): Change return type to
+ 	__wait_flags.
+ 	(__spin_impl): Accept __wait_args as const __wait_args_base*.
+ 	(__wait_impl): Likewise.
+ 	(__notify_impl): Likewise.
+ 	(__atomic_wait_address): Pass __wait_args by address.
+ 	(__atomic_wait_address_v): Likewise.
+ 	(__atomic_notify_address): Likewise.
+ 
+ 2025-05-30  Thomas Rodgers  <trodgers@redhat.com>
+ 
+ 	* include/bits/atomic_timed_wait.h:
+ 	(__detail::__platform_wait_until_impl): Rename to
+ 	__platform_wait_until.
+ 	(__detail::__platform_wait_until): Remove previous
+ 	definition.
+ 	(__detail::__cond_wait_until_impl): Rename to
+ 	__cond_wait_until.
+ 	(__detail::__cond_wait_until): Remove previous
+ 	definition.
+ 	(__detail::__spin_until_impl): New function.
+ 	(__detail::__wait_until_impl): New function.
+ 	(__detail::__wait_until): New function.
+ 	(__detail::__wait_for): New function.
+ 	(__detail::__timed_waiter_pool): Remove type.
+ 	(__detail::__timed_backoff_spin_policy): Remove type.
+ 	(__detail::__timed_waiter): Remove type.
+ 	(__detail::__enters_timed_wait): Remove type alias.
+ 	(__detail::__bare_timed_wait): Remove type alias.
+ 	(__atomic_wait_address_until): Adjust to new implementation
+ 	detail.
+ 	(__atomic_wait_address_until_v): Likewise.
+ 	(__atomic_wait_address_bare): Remove.
+ 	(__atomic_wait_address_for): Adjust to new implementation
+ 	detail.
+ 	(__atomic_wait_address_for_v): Likewise.
+ 	(__atomic_wait_address_for_bare): Remove.
+ 	* include/bits/atomic_wait.h: Include bits/stl_pair.h.
+ 	(__detail::__default_spin_policy): Remove type.
+ 	(__detail::__atomic_spin): Remove function.
+ 	(__detail::__waiter_pool_base): Rename to __waiter_pool_impl.
+ 	Remove _M_notify.  Rename _S_for to _S_impl_for.
+ 	(__detail::__waiter_base): Remove type.
+ 	(__detail::__waiter_pool): Remove type.
+ 	(__detail::__waiter): Remove type.
+ 	(__detail::__enters_wait): Remove type alias.
+ 	(__detail::__bare_wait): Remove type alias.
+ 	(__detail::__wait_flags): New enum.
+ 	(__detail::__wait_args): New struct.
+ 	(__detail::__wait_result_type): New type alias.
+ 	(__detail::__spin_impl): New function.
+ 	(__detail::__wait_impl): New function.
+ 	(__atomic_wait_address): Adjust to new implementation detail.
+ 	(__atomic_wait_address_v): Likewise.
+ 	(__atomic_notify_address): Likewise.
+ 	(__atomic_wait_address_bare): Delete.
+ 	(__atomic_notify_address_bare): Likewise.
+ 	* include/bits/semaphore_base.h: Adjust implementation to
+ 	use new __atomic_wait_address_v contract.
+ 	* include/std/barrier: Adjust implementation to use new
+ 	__atomic_wait contract.
+ 	* include/std/latch: Adjust implementation to use new
+ 	__atomic_wait contract.
+ 	* testsuite/29_atomics/atomic/wait_notify/100334.cc (main):
+ 	Adjust to for __detail::__waiter_pool_base renaming.
+ 
+ 2025-05-29  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	* include/std/flat_map (_Flat_map_impl::operator==): Compare
+ 	keys and values separately.
+ 
+ 2025-05-29  Patrick Palka  <ppalka@redhat.com>
+ 	    Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	PR libstdc++/120465
+ 	* include/std/flat_map (_Flat_map_impl::_M_erase_if): Use a
+ 	projection with ranges::remove_if to pass a pair instead of
+ 	a tuple to the predicate.
+ 	* testsuite/23_containers/flat_map/1.cc (test07): Strengthen
+ 	to expect the argument passed to the predicate is a pair.
+ 	* testsuite/23_containers/flat_multimap/1.cc (test07): Likewise.
+ 
+ 2025-05-29  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* testsuite/17_intro/names.cc [_AIX] (a): Undefine.
+ 	* testsuite/experimental/names.cc [_AIX] (ptr): Undefine.
+ 
+ 2025-05-29  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* testsuite/22_locale/num_put/put/char/lwg4084.cc [_AIX]: Adjust
+ 	expected output for NaN and infinity.
+ 
+ 2025-05-29  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* testsuite/23_containers/deque/capacity/shrink_to_fit.cc:
+ 	Remove dg-xfail-run-if for AIX.
+ 	* testsuite/23_containers/unordered_map/96088.cc: Replace
+ 	dg-xfail-run-if with dg-require-effective-target c++20.
+ 	* testsuite/23_containers/unordered_multimap/96088.cc: Likewise.
+ 	* testsuite/23_containers/unordered_multiset/96088.cc: Likewise.
+ 	* testsuite/23_containers/unordered_set/96088.cc: Likewise.
+ 
+ 2025-05-29  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/bits/boost_concept_check.h: Disable -Wlong-long
+ 	warnings.
+ 	* testsuite/24_iterators/operations/prev_neg.cc: Adjust dg-error
+ 	line number.
+ 
+ 2025-05-29  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* doc/xml/manual/test.xml: Remove outdated documentation on
+ 	testing with -std options in --target_board.
+ 	* doc/html/manual/test.html: Regenerate.
+ 
+ 2025-05-27  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* testsuite/17_intro/names.cc [_AIX] (n): Undefine.
+ 	* testsuite/experimental/names.cc [_AIX] (ptr): Undefine.
+ 
+ 2025-05-27  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* testsuite/std/format/debug.cc: Disable for targets with 16-bit
+ 	wchar_t.
+ 	* testsuite/std/format/functions/format.cc: Use -DUNICODE for
+ 	targets with 32-bit wchar_t.
+ 	(test_unicode) [UNICODE]: Only run checks when UNICODE is
+ 	defined.
+ 
+ 2025-05-27  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/Makefile.in: Regenerate.
+ 
+ 2025-05-27  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	PR libstdc++/96710
+ 	* include/bits/std_abs.h [__SIZEOF_INT128__] (abs(__int128)):
+ 	Define.
+ 	[_GLIBCXX_USE_FLOAT128] (abs(__float128)): Enable definition for
+ 	strict modes.
+ 	* testsuite/26_numerics/headers/cmath/82644.cc: Use strict_std
+ 	instead of defining __STRICT_ANSI__.
+ 	* testsuite/26_numerics/headers/cstdlib/abs128.cc: New test.
+ 
+ 2025-05-27  Luc Grosheintz  <luc.grosheintz@gmail.com>
+ 
+ 	* include/std/mdspan: Value initialize the array storing the
+ 	dynamic extents.
+ 	* testsuite/23_containers/mdspan/extents/ctor_default.cc: New
+ 	test.
+ 
+ 2025-05-26  Tomasz Kamiński  <tkaminsk@redhat.com>
+ 
+ 	PR libstdc++/119152
+ 	* testsuite/std/memory/indirect/ctor.cc: Run test_inplace_ctor.
+ 
+ 2025-05-26  Jonathan Wakely  <jwakely@redhat.com>
+ 	    Tomasz Kamiński  <tkaminsk@redhat.com>
+ 
+ 	PR libstdc++/119152
+ 	* doc/doxygen/stdheader.cc: Added indirect.h file.
+ 	* include/Makefile.am: Add new header.
+ 	* include/Makefile.in: Regenerate.
+ 	* include/bits/indirect.h: New file.
+ 	* include/bits/version.def (indirect): Define.
+ 	* include/bits/version.h: Regenerate.
+ 	* include/std/memory: Include new header.
+ 	* testsuite/std/memory/indirect/copy.cc
+ 	* testsuite/std/memory/indirect/copy_alloc.cc
+ 	* testsuite/std/memory/indirect/ctor.cc
+ 	* testsuite/std/memory/indirect/incomplete.cc
+ 	* testsuite/std/memory/indirect/invalid_neg.cc
+ 	* testsuite/std/memory/indirect/move.cc
+ 	* testsuite/std/memory/indirect/move_alloc.cc
+ 	* testsuite/std/memory/indirect/relops.cc
+ 
+ 2025-05-26  Tomasz Kamiński  <tkaminsk@redhat.com>
+ 
+ 	PR libstdc++/119126
+ 	* doc/doxygen/stdheader.cc: Added funcref_impl.h file.
+ 	* include/Makefile.am: Added funcref_impl.h file.
+ 	* include/Makefile.in: Added funcref_impl.h file.
+ 	* include/bits/funcref_impl.h: New file.
+ 	* include/bits/funcwrap.h: (_Ptrs::_M_obj): Const-qualify.
+ 	(_Storage::_M_ptr, _Storage::_M_ref): Remove.
+ 	(__polyfunc::__cast_to) Define.
+ 	(_Base_invoker::_S_ptrs, _Base_invoker::_S_nttp)
+ 	(_Base_invoker::_S_bind_ptrs, _Base_invoker::_S_bind_ref)
+ 	(_Base_invoker::_S_call_ptrs): Define.
+ 	(_Base_invoker::_S_call_storage): Foward to _S_call_ptrs.
+ 	(_Manager::_S_local, _Manager::_S_ptr): Adjust for _M_obj being
+ 	const qualified.
+ 	(__polyfunc::_Manager, __polyfunc::_Mo_base): Guard with
+ 	__glibcxx_move_only_function || __glibcxx_copyable_function.
+ 	(__polyfunc::__skip_first_arg, __polyfunc::__deduce_funcref)
+ 	(std::function_ref) [__glibcxx_function_ref]: Define.
+ 	* include/bits/utility.h (std::nontype_t, std::nontype)
+ 	(__is_nontype_v) [__glibcxx_function_ref]: Define.
+ 	* include/bits/version.def: Define function_ref.
+ 	* include/bits/version.h: Regenerate.
+ 	* include/std/functional: Define __cpp_lib_function_ref.
+ 	* src/c++23/std.cc.in (std::nontype_t, std::nontype)
+ 	(std::function_ref) [__cpp_lib_function_ref]: Export.
+ 	* testsuite/20_util/function_ref/assign.cc: New test.
+ 	* testsuite/20_util/function_ref/call.cc: New test.
+ 	* testsuite/20_util/function_ref/cons.cc: New test.
+ 	* testsuite/20_util/function_ref/cons_neg.cc: New test.
+ 	* testsuite/20_util/function_ref/conv.cc: New test.
+ 	* testsuite/20_util/function_ref/deduction.cc: New test.
+ 	* testsuite/20_util/function_ref/mutation.cc: New test.
+ 
  2025-05-23  Jonathan Wakely  <jwakely@redhat.com>
  
  	PR libstdc++/120384
diff -Nrcpad gcc-16-20250525/libstdc++-v3/acinclude.m4 gcc-16-20250601/libstdc++-v3/acinclude.m4
*** gcc-16-20250525/libstdc++-v3/acinclude.m4	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libstdc++-v3/acinclude.m4	Sun Jun  1 22:32:40 2025
*************** AC_DEFUN([GLIBCXX_CHECK_GTHREADS], [
*** 4293,4335 ****
      fi
    fi
  
-   AC_CHECK_HEADER(semaphore.h, [
-     AC_MSG_CHECKING([for POSIX Semaphores and sem_timedwait])
-     AC_TRY_COMPILE([
- 	#include <unistd.h>
- 	#include <semaphore.h>
- 	#include <limits.h>
-       ],
-       [
- 	#if !defined _POSIX_TIMEOUTS || _POSIX_TIMEOUTS <= 0
- 	# error "POSIX Timeouts option not supported"
- 	#elif !defined _POSIX_SEMAPHORES || _POSIX_SEMAPHORES <= 0
- 	# error "POSIX Semaphores option not supported"
- 	#else
- 	#if defined SEM_VALUE_MAX
- 	constexpr int sem_value_max = SEM_VALUE_MAX;
- 	#elif defined _POSIX_SEM_VALUE_MAX
- 	constexpr int sem_value_max = _POSIX_SEM_VALUE_MAX;
- 	#else
- 	# error "SEM_VALUE_MAX not available"
- 	#endif
- 	sem_t sem;
- 	sem_init(&sem, 0, sem_value_max);
- 	struct timespec ts = { 0 };
- 	sem_timedwait(&sem, &ts);
- 	#endif
-       ],
-       [ac_have_posix_semaphore=yes],
-       [ac_have_posix_semaphore=no])],
-       [ac_have_posix_semaphore=no])
- 
-   if test $ac_have_posix_semaphore = yes ; then
-     AC_DEFINE(HAVE_POSIX_SEMAPHORE,
- 	      1,
- 	      [Define to 1 if POSIX Semaphores with sem_timedwait are available in <semaphore.h>.])
-   fi
-   AC_MSG_RESULT([$ac_have_posix_semaphore])
- 
    CXXFLAGS="$ac_save_CXXFLAGS"
    AC_LANG_RESTORE
  ])
--- 4293,4298 ----
diff -Nrcpad gcc-16-20250525/libstdc++-v3/config/abi/pre/gnu.ver gcc-16-20250601/libstdc++-v3/config/abi/pre/gnu.ver
*** gcc-16-20250525/libstdc++-v3/config/abi/pre/gnu.ver	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libstdc++-v3/config/abi/pre/gnu.ver	Sun Jun  1 22:32:40 2025
*************** GLIBCXX_3.4.34 {
*** 2544,2551 ****
--- 2544,2562 ----
      # void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<bool>(char const*, size_t)
      # and wide char version
      _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE12_M_constructILb[01]EEEvPK[cw][jmy];
+ 
  } GLIBCXX_3.4.33;
  
+ # GCC 16.1.0
+ GLIBCXX_3.4.35 {
+ 
+     _ZNSt8__detail11__wait_implEPKvRNS_16__wait_args_baseE;
+     _ZNSt8__detail13__notify_implEPKvbRKNS_16__wait_args_baseE;
+     _ZNSt8__detail17__wait_until_implEPKvRNS_16__wait_args_baseERKNSt6chrono8durationI[lx]St5ratioIL[lx]1EL[lx]1000000000EEEE;
+     _ZNSt8__detail11__wait_args22_M_load_proxy_wait_valEPKv;
+ 
+ } GLIBCXX_3.4.34;
+ 
  # Symbols in the support library (libsupc++) have their own tag.
  CXXABI_1.3 {
  
diff -Nrcpad gcc-16-20250525/libstdc++-v3/config.h.in gcc-16-20250601/libstdc++-v3/config.h.in
*** gcc-16-20250525/libstdc++-v3/config.h.in	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libstdc++-v3/config.h.in	Sun Jun  1 22:32:40 2025
***************
*** 314,323 ****
  /* Define to 1 if you have the `posix_memalign' function. */
  #undef HAVE_POSIX_MEMALIGN
  
- /* Define to 1 if POSIX Semaphores with sem_timedwait are available in
-    <semaphore.h>. */
- #undef HAVE_POSIX_SEMAPHORE
- 
  /* Define to 1 if you have the `powf' function. */
  #undef HAVE_POWF
  
--- 314,319 ----
diff -Nrcpad gcc-16-20250525/libstdc++-v3/configure gcc-16-20250601/libstdc++-v3/configure
*** gcc-16-20250525/libstdc++-v3/configure	Sun May 25 22:32:19 2025
--- gcc-16-20250601/libstdc++-v3/configure	Sun Jun  1 22:32:40 2025
*************** fi
*** 51990,52053 ****
      fi
    fi
  
-   ac_fn_cxx_check_header_mongrel "$LINENO" "semaphore.h" "ac_cv_header_semaphore_h" "$ac_includes_default"
- if test "x$ac_cv_header_semaphore_h" = xyes; then :
- 
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for POSIX Semaphores and sem_timedwait" >&5
- $as_echo_n "checking for POSIX Semaphores and sem_timedwait... " >&6; }
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
- /* end confdefs.h.  */
- 
- 	#include <unistd.h>
- 	#include <semaphore.h>
- 	#include <limits.h>
- 
- int
- main ()
- {
- 
- 	#if !defined _POSIX_TIMEOUTS || _POSIX_TIMEOUTS <= 0
- 	# error "POSIX Timeouts option not supported"
- 	#elif !defined _POSIX_SEMAPHORES || _POSIX_SEMAPHORES <= 0
- 	# error "POSIX Semaphores option not supported"
- 	#else
- 	#if defined SEM_VALUE_MAX
- 	constexpr int sem_value_max = SEM_VALUE_MAX;
- 	#elif defined _POSIX_SEM_VALUE_MAX
- 	constexpr int sem_value_max = _POSIX_SEM_VALUE_MAX;
- 	#else
- 	# error "SEM_VALUE_MAX not available"
- 	#endif
- 	sem_t sem;
- 	sem_init(&sem, 0, sem_value_max);
- 	struct timespec ts = { 0 };
- 	sem_timedwait(&sem, &ts);
- 	#endif
- 
-   ;
-   return 0;
- }
- _ACEOF
- if ac_fn_cxx_try_compile "$LINENO"; then :
-   ac_have_posix_semaphore=yes
- else
-   ac_have_posix_semaphore=no
- fi
- rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- else
-   ac_have_posix_semaphore=no
- fi
- 
- 
- 
-   if test $ac_have_posix_semaphore = yes ; then
- 
- $as_echo "#define HAVE_POSIX_SEMAPHORE 1" >>confdefs.h
- 
-   fi
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_have_posix_semaphore" >&5
- $as_echo "$ac_have_posix_semaphore" >&6; }
- 
    CXXFLAGS="$ac_save_CXXFLAGS"
    ac_ext=c
  ac_cpp='$CPP $CPPFLAGS'
--- 51990,51995 ----
*************** $as_echo "$glibcxx_cv_libbacktrace_atomi
*** 53601,53607 ****
      CXXFLAGS='-O0 -S'
  
      cat > conftest.$ac_ext << EOF
! #line 53604 "configure"
  #include <stddef.h>
  int main()
  {
--- 53543,53549 ----
      CXXFLAGS='-O0 -S'
  
      cat > conftest.$ac_ext << EOF
! #line 53546 "configure"
  #include <stddef.h>
  int main()
  {
diff -Nrcpad gcc-16-20250525/libstdc++-v3/doc/doxygen/stdheader.cc gcc-16-20250601/libstdc++-v3/doc/doxygen/stdheader.cc
*** gcc-16-20250525/libstdc++-v3/doc/doxygen/stdheader.cc	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libstdc++-v3/doc/doxygen/stdheader.cc	Sun Jun  1 22:32:40 2025
*************** void init_map()
*** 55,60 ****
--- 55,61 ----
      headers["functional_hash.h"]        = "functional";
      headers["mofunc_impl.h"]            = "functional";
      headers["cpyfunc_impl.h"]           = "functional";
+     headers["funcref_impl.h"]           = "functional";
      headers["funcwrap.h"]               = "functional";
      headers["invoke.h"]                 = "functional";
      headers["ranges_cmp.h"]             = "functional";
*************** void init_map()
*** 105,110 ****
--- 106,112 ----
      headers["uses_allocator.h"]         = "memory";
      headers["uses_allocator_args.h"]    = "memory";
      headers["out_ptr.h"]                = "memory";
+     headers["indirect.h"]               = "memory";
      headers["memory_resource.h"]        = "memory_resource";
      headers["unique_lock.h"]            = "mutex";
      headers["sat_arith.h"]              = "numeric";
diff -Nrcpad gcc-16-20250525/libstdc++-v3/doc/html/manual/test.html gcc-16-20250601/libstdc++-v3/doc/html/manual/test.html
*** gcc-16-20250525/libstdc++-v3/doc/html/manual/test.html	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libstdc++-v3/doc/html/manual/test.html	Sun Jun  1 22:32:41 2025
*************** cat 27_io/objects/char/3_xin.in | a.out<
*** 339,354 ****
        you could use:
  </p><pre class="programlisting">    make check RUNTESTFLAGS=--target_board=unix/-O1/-D_GLIBCXX_ASSERTIONS</pre><p>
      </p><p>
-       The <code class="option">--target_board</code> option can also be used to run the
-       tests multiple times in different variations. For example, to run the
-       entire testsuite three times using <code class="option">-O3</code> but with
-       different <code class="option">-std</code> options:
- </p><pre class="programlisting">    make check 'RUNTESTFLAGS=--target_board=unix/-O3\"{-std=gnu++98,-std=gnu++11,-std=gnu++17}\"'</pre><p>
-       N.B. that set of variations could also be written as
-       <code class="literal">unix/-O3\"{-std=gnu++98,-std=gnu++11,}\"</code> so that
-       the third variation would use the default for <code class="option">-std</code>
-       (which is <code class="option">-std=gnu++17</code> as of GCC 11).
-     </p><p>
        Since GCC 14, the libstdc++ testsuite has built-in support for running
        tests with more than one <code class="option">-std</code>, similar to the G++ tests.
        Adding <code class="code">set v3_std_list { 11 17 23 }</code> to
--- 339,344 ----
*************** cat 27_io/objects/char/3_xin.in | a.out<
*** 359,364 ****
--- 349,357 ----
        as a comma-separated list in the <code class="envar">GLIBCXX_TESTSUITE_STDS</code>
        environment variable, e.g. <code class="envar">GLIBCXX_TESTSUITE_STDS=11,17,23</code>
        is equivalent to the <code class="code">v3_std_list</code> value above.
+       Before GCC 14, the <code class="option">--target_board</code> option could be
+       used to run the tests with different <code class="option">-std</code> options,
+       but this no longer works.
      </p><p>
        To run the libstdc++ test suite under the
        <a class="link" href="debug_mode.html" title="Chapter 17. Debug Mode">debug mode</a>, use
diff -Nrcpad gcc-16-20250525/libstdc++-v3/doc/xml/manual/test.xml gcc-16-20250601/libstdc++-v3/doc/xml/manual/test.xml
*** gcc-16-20250525/libstdc++-v3/doc/xml/manual/test.xml	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libstdc++-v3/doc/xml/manual/test.xml	Sun Jun  1 22:32:41 2025
*************** cat 27_io/objects/char/3_xin.in | a.out<
*** 585,602 ****
      </para>
  
      <para>
-       The <option>--target_board</option> option can also be used to run the
-       tests multiple times in different variations. For example, to run the
-       entire testsuite three times using <option>-O3</option> but with
-       different <option>-std</option> options:
- <programlisting>    make check 'RUNTESTFLAGS=--target_board=unix/-O3\"{-std=gnu++98,-std=gnu++11,-std=gnu++17}\"'</programlisting>
-       N.B. that set of variations could also be written as
-       <literal>unix/-O3\"{-std=gnu++98,-std=gnu++11,}\"</literal> so that
-       the third variation would use the default for <option>-std</option>
-       (which is <option>-std=gnu++17</option> as of GCC 11).
-     </para>
- 
-     <para>
        Since GCC 14, the libstdc++ testsuite has built-in support for running
        tests with more than one <option>-std</option>, similar to the G++ tests.
        Adding <code>set v3_std_list { 11 17 23 }</code> to
--- 585,590 ----
*************** cat 27_io/objects/char/3_xin.in | a.out<
*** 607,612 ****
--- 595,603 ----
        as a comma-separated list in the <envar>GLIBCXX_TESTSUITE_STDS</envar>
        environment variable, e.g. <envar>GLIBCXX_TESTSUITE_STDS=11,17,23</envar>
        is equivalent to the <code>v3_std_list</code> value above.
+       Before GCC 14, the <option>--target_board</option> option could be
+       used to run the tests with different <option>-std</option> options,
+       but this no longer works.
      </para>
  
      <para>
diff -Nrcpad gcc-16-20250525/libstdc++-v3/include/Makefile.am gcc-16-20250601/libstdc++-v3/include/Makefile.am
*** gcc-16-20250525/libstdc++-v3/include/Makefile.am	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libstdc++-v3/include/Makefile.am	Sun Jun  1 22:32:41 2025
*************** bits_headers = \
*** 205,215 ****
--- 205,217 ----
  	${bits_srcdir}/fs_ops.h \
  	${bits_srcdir}/fs_path.h \
  	${bits_srcdir}/fstream.tcc \
+ 	${bits_srcdir}/funcref_impl.h \
  	${bits_srcdir}/funcwrap.h \
  	${bits_srcdir}/gslice.h \
  	${bits_srcdir}/gslice_array.h \
  	${bits_srcdir}/hashtable.h \
  	${bits_srcdir}/hashtable_policy.h \
+ 	${bits_srcdir}/indirect.h \
  	${bits_srcdir}/indirect_array.h \
  	${bits_srcdir}/ios_base.h \
  	${bits_srcdir}/istream.tcc \
diff -Nrcpad gcc-16-20250525/libstdc++-v3/include/Makefile.in gcc-16-20250601/libstdc++-v3/include/Makefile.in
*** gcc-16-20250525/libstdc++-v3/include/Makefile.in	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libstdc++-v3/include/Makefile.in	Sun Jun  1 22:32:41 2025
*************** bits_freestanding = \
*** 558,568 ****
--- 558,570 ----
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/fs_ops.h \
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/fs_path.h \
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/fstream.tcc \
+ @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/funcref_impl.h \
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/funcwrap.h \
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/gslice.h \
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/gslice_array.h \
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/hashtable.h \
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/hashtable_policy.h \
+ @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/indirect.h \
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/indirect_array.h \
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/ios_base.h \
  @GLIBCXX_HOSTED_TRUE@	${bits_srcdir}/istream.tcc \
diff -Nrcpad gcc-16-20250525/libstdc++-v3/include/bits/atomic_timed_wait.h gcc-16-20250601/libstdc++-v3/include/bits/atomic_timed_wait.h
*** gcc-16-20250525/libstdc++-v3/include/bits/atomic_timed_wait.h	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libstdc++-v3/include/bits/atomic_timed_wait.h	Sun Jun  1 22:32:41 2025
***************
*** 37,43 ****
  #include <bits/atomic_wait.h>
  
  #if __glibcxx_atomic_wait
- #include <bits/functional_hash.h>
  #include <bits/this_thread_sleep.h>
  #include <bits/chrono.h>
  
--- 37,42 ----
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 70,452 ****
  					       _Dur>& __atime) noexcept
        {
  	using __w_dur = typename __wait_clock_t::duration;
! 	return chrono::ceil<__w_dur>(__atime);
        }
  
  #ifdef _GLIBCXX_HAVE_LINUX_FUTEX
  #define _GLIBCXX_HAVE_PLATFORM_TIMED_WAIT
-     // returns true if wait ended before timeout
-     template<typename _Dur>
-       bool
-       __platform_wait_until_impl(const __platform_wait_t* __addr,
- 				 __platform_wait_t __old,
- 				 const chrono::time_point<__wait_clock_t, _Dur>&
- 				      __atime) noexcept
-       {
- 	auto __s = chrono::time_point_cast<chrono::seconds>(__atime);
- 	auto __ns = chrono::duration_cast<chrono::nanoseconds>(__atime - __s);
- 
- 	struct timespec __rt =
- 	{
- 	  static_cast<std::time_t>(__s.time_since_epoch().count()),
- 	  static_cast<long>(__ns.count())
- 	};
- 
- 	auto __e = syscall (SYS_futex, __addr,
- 			    static_cast<int>(__futex_wait_flags::
- 						__wait_bitset_private),
- 			    __old, &__rt, nullptr,
- 			    static_cast<int>(__futex_wait_flags::
- 						__bitset_match_any));
- 
- 	if (__e)
- 	  {
- 	    if (errno == ETIMEDOUT)
- 	      return false;
- 	    if (errno != EINTR && errno != EAGAIN)
- 	      __throw_system_error(errno);
- 	  }
- 	return true;
-       }
- 
-     // returns true if wait ended before timeout
-     template<typename _Clock, typename _Dur>
-       bool
-       __platform_wait_until(const __platform_wait_t* __addr, __platform_wait_t __old,
- 			    const chrono::time_point<_Clock, _Dur>& __atime)
-       {
- 	if constexpr (is_same_v<__wait_clock_t, _Clock>)
- 	  {
- 	    return __platform_wait_until_impl(__addr, __old, __atime);
- 	  }
- 	else
- 	  {
- 	    if (!__platform_wait_until_impl(__addr, __old,
- 					    __to_wait_clock(__atime)))
- 	      {
- 		// We got a timeout when measured against __clock_t but
- 		// we need to check against the caller-supplied clock
- 		// to tell whether we should return a timeout.
- 		if (_Clock::now() < __atime)
- 		  return true;
- 	      }
- 	    return false;
- 	  }
-       }
  #else
! // define _GLIBCXX_HAVE_PLATFORM_TIMED_WAIT and implement __platform_wait_until()
  // if there is a more efficient primitive supported by the platform
! // (e.g. __ulock_wait())which is better than pthread_cond_clockwait
! #endif // ! PLATFORM_TIMED_WAIT
! 
! #ifdef _GLIBCXX_HAS_GTHREADS
!     // Returns true if wait ended before timeout.
!     // _Clock must be either steady_clock or system_clock.
!     template<typename _Clock, typename _Dur>
!       bool
!       __cond_wait_until_impl(__condvar& __cv, mutex& __mx,
! 			     const chrono::time_point<_Clock, _Dur>& __atime)
!       {
! 	static_assert(std::__is_one_of<_Clock, chrono::steady_clock,
! 					       chrono::system_clock>::value);
! 
! 	auto __s = chrono::time_point_cast<chrono::seconds>(__atime);
! 	auto __ns = chrono::duration_cast<chrono::nanoseconds>(__atime - __s);
! 
! 	__gthread_time_t __ts =
! 	  {
! 	    static_cast<std::time_t>(__s.time_since_epoch().count()),
! 	    static_cast<long>(__ns.count())
! 	  };
  
! #ifdef _GLIBCXX_USE_PTHREAD_COND_CLOCKWAIT
! 	if constexpr (is_same_v<chrono::steady_clock, _Clock>)
! 	  __cv.wait_until(__mx, CLOCK_MONOTONIC, __ts);
! 	else
! #endif
! 	  __cv.wait_until(__mx, __ts);
! 	return _Clock::now() < __atime;
!       }
  
!     // returns true if wait ended before timeout
      template<typename _Clock, typename _Dur>
!       bool
!       __cond_wait_until(__condvar& __cv, mutex& __mx,
! 	  const chrono::time_point<_Clock, _Dur>& __atime)
        {
! #ifdef _GLIBCXX_USE_PTHREAD_COND_CLOCKWAIT
! 	if constexpr (is_same_v<_Clock, chrono::steady_clock>)
! 	  return __detail::__cond_wait_until_impl(__cv, __mx, __atime);
! 	else
! #endif
! 	if constexpr (is_same_v<_Clock, chrono::system_clock>)
! 	  return __detail::__cond_wait_until_impl(__cv, __mx, __atime);
! 	else
! 	  {
! 	    if (__cond_wait_until_impl(__cv, __mx,
! 				       __to_wait_clock(__atime)))
! 	      {
! 		// We got a timeout when measured against __clock_t but
! 		// we need to check against the caller-supplied clock
! 		// to tell whether we should return a timeout.
! 		if (_Clock::now() < __atime)
! 		  return true;
! 	      }
! 	    return false;
! 	  }
!       }
! #endif // _GLIBCXX_HAS_GTHREADS
  
!     struct __timed_waiter_pool : __waiter_pool_base
!     {
!       // returns true if wait ended before timeout
!       template<typename _Clock, typename _Dur>
! 	bool
! 	_M_do_wait_until(__platform_wait_t* __addr, __platform_wait_t __old,
! 			 const chrono::time_point<_Clock, _Dur>& __atime)
! 	{
! #ifdef _GLIBCXX_HAVE_PLATFORM_TIMED_WAIT
! 	  return __platform_wait_until(__addr, __old, __atime);
! #else
! 	  __platform_wait_t __val;
! 	  __atomic_load(__addr, &__val, __ATOMIC_RELAXED);
! 	  if (__val == __old)
  	    {
! 	      lock_guard<mutex> __l(_M_mtx);
! 	      return __cond_wait_until(_M_cv, _M_mtx, __atime);
  	    }
! 	  else
! 	    return true;
! #endif // _GLIBCXX_HAVE_PLATFORM_TIMED_WAIT
! 	}
!     };
! 
!     struct __timed_backoff_spin_policy
!     {
!       __wait_clock_t::time_point _M_deadline;
!       __wait_clock_t::time_point _M_t0;
! 
!       template<typename _Clock, typename _Dur>
! 	__timed_backoff_spin_policy(chrono::time_point<_Clock, _Dur>
! 				      __deadline = _Clock::time_point::max(),
! 				    chrono::time_point<_Clock, _Dur>
! 				      __t0 = _Clock::now()) noexcept
! 	  : _M_deadline(__to_wait_clock(__deadline))
! 	  , _M_t0(__to_wait_clock(__t0))
! 	{ }
! 
!       bool
!       operator()() const noexcept
!       {
! 	using namespace literals::chrono_literals;
! 	auto __now = __wait_clock_t::now();
! 	if (_M_deadline <= __now)
! 	  return false;
! 
! 	// FIXME: this_thread::sleep_for not available #ifdef _GLIBCXX_NO_SLEEP
! 
! 	auto __elapsed = __now - _M_t0;
! 	if (__elapsed > 128ms)
! 	  {
! 	    this_thread::sleep_for(64ms);
! 	  }
! 	else if (__elapsed > 64us)
! 	  {
! 	    this_thread::sleep_for(__elapsed / 2);
! 	  }
! 	else if (__elapsed > 4us)
! 	  {
! 	    __thread_yield();
! 	  }
! 	else
! 	  return false;
! 	return true;
        }
-     };
  
!     template<typename _EntersWait>
!       struct __timed_waiter : __waiter_base<__timed_waiter_pool>
        {
! 	using __base_type = __waiter_base<__timed_waiter_pool>;
! 
! 	template<typename _Tp>
! 	  __timed_waiter(const _Tp* __addr) noexcept
! 	  : __base_type(__addr)
! 	{
! 	  if constexpr (_EntersWait::value)
! 	    _M_w._M_enter_wait();
! 	}
! 
! 	~__timed_waiter()
! 	{
! 	  if constexpr (_EntersWait::value)
! 	    _M_w._M_leave_wait();
! 	}
! 
! 	// returns true if wait ended before timeout
! 	template<typename _Tp, typename _ValFn,
! 		 typename _Clock, typename _Dur>
! 	  bool
! 	  _M_do_wait_until_v(_Tp __old, _ValFn __vfn,
! 			     const chrono::time_point<_Clock, _Dur>&
! 								__atime) noexcept
! 	  {
! 	    __platform_wait_t __val;
! 	    if (_M_do_spin(__old, std::move(__vfn), __val,
! 			   __timed_backoff_spin_policy(__atime)))
! 	      return true;
! 	    return __base_type::_M_w._M_do_wait_until(__base_type::_M_addr, __val, __atime);
! 	  }
! 
! 	// returns true if wait ended before timeout
! 	template<typename _Pred,
! 		 typename _Clock, typename _Dur>
! 	  bool
! 	  _M_do_wait_until(_Pred __pred, __platform_wait_t __val,
! 			  const chrono::time_point<_Clock, _Dur>&
! 							      __atime) noexcept
! 	  {
! 	    for (auto __now = _Clock::now(); __now < __atime;
! 		  __now = _Clock::now())
! 	      {
! 		if (__base_type::_M_w._M_do_wait_until(
! 		      __base_type::_M_addr, __val, __atime)
! 		    && __pred())
! 		  return true;
! 
! 		if (__base_type::_M_do_spin(__pred, __val,
! 			       __timed_backoff_spin_policy(__atime, __now)))
! 		  return true;
! 	      }
! 	    return false;
! 	  }
! 
! 	// returns true if wait ended before timeout
! 	template<typename _Pred,
! 		 typename _Clock, typename _Dur>
! 	  bool
! 	  _M_do_wait_until(_Pred __pred,
! 			   const chrono::time_point<_Clock, _Dur>&
! 								__atime) noexcept
! 	  {
! 	    __platform_wait_t __val;
! 	    if (__base_type::_M_do_spin(__pred, __val,
! 					__timed_backoff_spin_policy(__atime)))
! 	      return true;
! 	    return _M_do_wait_until(__pred, __val, __atime);
! 	  }
! 
! 	template<typename _Tp, typename _ValFn,
! 		 typename _Rep, typename _Period>
! 	  bool
! 	  _M_do_wait_for_v(_Tp __old, _ValFn __vfn,
! 			   const chrono::duration<_Rep, _Period>&
! 								__rtime) noexcept
! 	  {
! 	    __platform_wait_t __val;
! 	    if (_M_do_spin_v(__old, std::move(__vfn), __val))
! 	      return true;
! 
! 	    if (!__rtime.count())
! 	      return false; // no rtime supplied, and spin did not acquire
! 
! 	    auto __reltime = chrono::ceil<__wait_clock_t::duration>(__rtime);
! 
! 	    return __base_type::_M_w._M_do_wait_until(
! 					  __base_type::_M_addr,
! 					  __val,
! 					  chrono::steady_clock::now() + __reltime);
! 	  }
! 
! 	template<typename _Pred,
! 		 typename _Rep, typename _Period>
! 	  bool
! 	  _M_do_wait_for(_Pred __pred,
! 			 const chrono::duration<_Rep, _Period>& __rtime) noexcept
  	  {
! 	    __platform_wait_t __val;
! 	    if (__base_type::_M_do_spin(__pred, __val))
! 	      return true;
! 
! 	    if (!__rtime.count())
! 	      return false; // no rtime supplied, and spin did not acquire
! 
! 	    auto __reltime = chrono::ceil<__wait_clock_t::duration>(__rtime);
! 
! 	    return _M_do_wait_until(__pred, __val,
! 				    chrono::steady_clock::now() + __reltime);
  	  }
-       };
  
!     using __enters_timed_wait = __timed_waiter<std::true_type>;
!     using __bare_timed_wait = __timed_waiter<std::false_type>;
    } // namespace __detail
  
    // returns true if wait ended before timeout
!   template<typename _Tp, typename _ValFn,
  	   typename _Clock, typename _Dur>
      bool
!     __atomic_wait_address_until_v(const _Tp* __addr, _Tp&& __old, _ValFn&& __vfn,
! 			const chrono::time_point<_Clock, _Dur>&
! 			    __atime) noexcept
      {
!       __detail::__enters_timed_wait __w{__addr};
!       return __w._M_do_wait_until_v(__old, __vfn, __atime);
      }
  
!   template<typename _Tp, typename _Pred,
! 	   typename _Clock, typename _Dur>
      bool
!     __atomic_wait_address_until(const _Tp* __addr, _Pred __pred,
! 				const chrono::time_point<_Clock, _Dur>&
! 							      __atime) noexcept
      {
!       __detail::__enters_timed_wait __w{__addr};
!       return __w._M_do_wait_until(__pred, __atime);
      }
  
!   template<typename _Pred,
  	   typename _Clock, typename _Dur>
      bool
!     __atomic_wait_address_until_bare(const __detail::__platform_wait_t* __addr,
! 				_Pred __pred,
! 				const chrono::time_point<_Clock, _Dur>&
! 							      __atime) noexcept
      {
!       __detail::__bare_timed_wait __w{__addr};
!       return __w._M_do_wait_until(__pred, __atime);
      }
  
!   template<typename _Tp, typename _ValFn,
  	   typename _Rep, typename _Period>
      bool
!     __atomic_wait_address_for_v(const _Tp* __addr, _Tp&& __old, _ValFn&& __vfn,
! 		      const chrono::duration<_Rep, _Period>& __rtime) noexcept
      {
!       __detail::__enters_timed_wait __w{__addr};
!       return __w._M_do_wait_for_v(__old, __vfn, __rtime);
      }
  
!   template<typename _Tp, typename _Pred,
! 	   typename _Rep, typename _Period>
      bool
!     __atomic_wait_address_for(const _Tp* __addr, _Pred __pred,
! 		      const chrono::duration<_Rep, _Period>& __rtime) noexcept
      {
! 
!       __detail::__enters_timed_wait __w{__addr};
!       return __w._M_do_wait_for(__pred, __rtime);
      }
  
!   template<typename _Pred,
  	   typename _Rep, typename _Period>
      bool
!     __atomic_wait_address_for_bare(const __detail::__platform_wait_t* __addr,
! 			_Pred __pred,
! 			const chrono::duration<_Rep, _Period>& __rtime) noexcept
      {
!       __detail::__bare_timed_wait __w{__addr};
!       return __w._M_do_wait_for(__pred, __rtime);
      }
  _GLIBCXX_END_NAMESPACE_VERSION
  } // namespace std
--- 69,228 ----
  					       _Dur>& __atime) noexcept
        {
  	using __w_dur = typename __wait_clock_t::duration;
! 	if constexpr (is_same_v<__w_dur, _Dur>)
! 	  return __atime;
! 	else
! 	  return chrono::ceil<__w_dur>(__atime);
        }
  
  #ifdef _GLIBCXX_HAVE_LINUX_FUTEX
  #define _GLIBCXX_HAVE_PLATFORM_TIMED_WAIT
  #else
! // define _GLIBCXX_HAVE_PLATFORM_TIMED_WAIT and implement __platform_wait_until
  // if there is a more efficient primitive supported by the platform
! // (e.g. __ulock_wait) which is better than pthread_cond_clockwait.
! #endif // ! HAVE_LINUX_FUTEX
  
!     __wait_result_type
!     __wait_until_impl(const void* __addr, __wait_args_base& __args,
! 		      const __wait_clock_t::duration& __atime);
  
!     // Returns {true, val} if wait ended before a timeout.
      template<typename _Clock, typename _Dur>
!       __wait_result_type
!       __wait_until(const void* __addr, __wait_args_base& __args,
! 		   const chrono::time_point<_Clock, _Dur>& __atime) noexcept
        {
! 	auto __at = __detail::__to_wait_clock(__atime);
! 	auto __res = __detail::__wait_until_impl(__addr, __args,
! 						 __at.time_since_epoch());
  
! 	if constexpr (!is_same_v<__wait_clock_t, _Clock>)
! 	  if (__res._M_timeout)
  	    {
! 	      // We got a timeout when measured against __clock_t but
! 	      // we need to check against the caller-supplied clock
! 	      // to tell whether we should return a timeout.
! 	      if (_Clock::now() < __atime)
! 		__res._M_timeout = false;
  	    }
! 	return __res;
        }
  
!     template<typename _Rep, typename _Period>
!       __wait_result_type
!       __wait_for(const void* __addr, __wait_args_base& __args,
! 		 const chrono::duration<_Rep, _Period>& __rtime) noexcept
        {
! 	if (!__rtime.count())
  	  {
! 	    // no rtime supplied, just spin a bit
! 	    __args._M_flags |= __wait_flags::__do_spin | __wait_flags::__spin_only;
! 	    return __detail::__wait_impl(__addr, __args);
  	  }
  
! 	auto const __reltime = chrono::ceil<__wait_clock_t::duration>(__rtime);
! 	auto const __atime = chrono::steady_clock::now() + __reltime;
! 	return __detail::__wait_until(__addr, __args, __atime);
!       }
    } // namespace __detail
  
    // returns true if wait ended before timeout
!   template<typename _Tp,
! 	   typename _Pred, typename _ValFn,
  	   typename _Clock, typename _Dur>
      bool
!     __atomic_wait_address_until(const _Tp* __addr, _Pred&& __pred,
! 				_ValFn&& __vfn,
! 				const chrono::time_point<_Clock, _Dur>& __atime,
! 				bool __bare_wait = false) noexcept
      {
!       __detail::__wait_args __args{ __addr, __bare_wait };
!       _Tp __val = __args._M_setup_wait(__addr, __vfn);
!       while (!__pred(__val))
! 	{
! 	  auto __res = __detail::__wait_until(__addr, __args, __atime);
! 	  if (__res._M_timeout)
! 	    return false; // C++26 will also return last observed __val
! 	  __val = __args._M_setup_wait(__addr, __vfn, __res);
! 	}
!       return true; // C++26 will also return last observed __val
      }
  
!   template<typename _Clock, typename _Dur>
      bool
!     __atomic_wait_address_until_v(const __detail::__platform_wait_t* __addr,
! 				  __detail::__platform_wait_t __old,
! 				  int __order,
! 				  const chrono::time_point<_Clock, _Dur>& __atime,
! 				  bool __bare_wait = false) noexcept
      {
!       __detail::__wait_args __args{ __addr, __old, __order, __bare_wait };
!       auto __res = __detail::__wait_until(__addr, &__args, __atime);
!       return __res.first; // C++26 will also return last observed __val
      }
  
!   template<typename _Tp, typename _ValFn,
  	   typename _Clock, typename _Dur>
      bool
!     __atomic_wait_address_until_v(const _Tp* __addr, _Tp&& __old,
! 				  _ValFn&& __vfn,
! 				  const chrono::time_point<_Clock, _Dur>& __atime,
! 				  bool __bare_wait = false) noexcept
      {
!       auto __pfn = [&](const _Tp& __val) {
! 	return !__detail::__atomic_eq(__old, __val);
!       };
!       return std::__atomic_wait_address_until(__addr, __pfn, __vfn, __atime,
! 					      __bare_wait);
      }
  
!   template<typename _Tp,
! 	   typename _Pred, typename _ValFn,
  	   typename _Rep, typename _Period>
      bool
!     __atomic_wait_address_for(const _Tp* __addr, _Pred&& __pred,
! 			      _ValFn&& __vfn,
! 			      const chrono::duration<_Rep, _Period>& __rtime,
! 			      bool __bare_wait = false) noexcept
      {
!       __detail::__wait_args __args{ __addr, __bare_wait };
!       _Tp __val = __args._M_setup_wait(__addr, __vfn);
!       while (!__pred(__val))
! 	{
! 	  auto __res = __detail::__wait_for(__addr, __args, __rtime);
! 	  if (__res._M_timeout)
! 	    return false; // C++26 will also return last observed __val
! 	  __val = __args._M_setup_wait(__addr, __vfn);
! 	}
!       return true; // C++26 will also return last observed __val
      }
  
!   template<typename _Rep, typename _Period>
      bool
!     __atomic_wait_address_for_v(const __detail::__platform_wait_t* __addr,
! 				__detail::__platform_wait_t __old,
! 				int __order,
! 				const chrono::time_point<_Rep, _Period>& __rtime,
! 				bool __bare_wait = false) noexcept
      {
!       __detail::__wait_args __args{ __addr, __old, __order, __bare_wait };
!       auto __res = __detail::__wait_for(__addr, __args, __rtime);
!       return !__res._M_timeout; // C++26 will also return last observed __val
      }
  
!   template<typename _Tp, typename _ValFn,
  	   typename _Rep, typename _Period>
      bool
!     __atomic_wait_address_for_v(const _Tp* __addr, _Tp&& __old, _ValFn&& __vfn,
! 				const chrono::duration<_Rep, _Period>& __rtime,
! 				bool __bare_wait = false) noexcept
      {
!       auto __pfn = [&](const _Tp& __val) {
! 	return !__detail::__atomic_eq(__old, __val);
!       };
!       return __atomic_wait_address_for(__addr, __pfn, forward<_ValFn>(__vfn),
! 				       __rtime, __bare_wait);
      }
  _GLIBCXX_END_NAMESPACE_VERSION
  } // namespace std
diff -Nrcpad gcc-16-20250525/libstdc++-v3/include/bits/atomic_wait.h gcc-16-20250601/libstdc++-v3/include/bits/atomic_wait.h
*** gcc-16-20250525/libstdc++-v3/include/bits/atomic_wait.h	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libstdc++-v3/include/bits/atomic_wait.h	Sun Jun  1 22:32:41 2025
***************
*** 37,56 ****
  #include <bits/version.h>
  
  #if __glibcxx_atomic_wait
- #include <cstdint>
- #include <bits/functional_hash.h>
  #include <bits/gthr.h>
  #include <ext/numeric_traits.h>
  
! #ifdef _GLIBCXX_HAVE_LINUX_FUTEX
! # include <cerrno>
! # include <climits>
! # include <unistd.h>
! # include <syscall.h>
! # include <bits/functexcept.h>
! #endif
! 
! # include <bits/std_mutex.h>  // std::mutex, std::__condvar
  
  namespace std _GLIBCXX_VISIBILITY(default)
  {
--- 37,46 ----
  #include <bits/version.h>
  
  #if __glibcxx_atomic_wait
  #include <bits/gthr.h>
  #include <ext/numeric_traits.h>
  
! #include <bits/stl_pair.h>
  
  namespace std _GLIBCXX_VISIBILITY(default)
  {
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 81,140 ****
  #ifdef _GLIBCXX_HAVE_PLATFORM_WAIT
        = is_scalar_v<_Tp>
  	&& ((sizeof(_Tp) == sizeof(__detail::__platform_wait_t))
! 	&& (alignof(_Tp*) >= __detail::__platform_wait_alignment));
  #else
        = false;
  #endif
  
    namespace __detail
    {
- #ifdef _GLIBCXX_HAVE_LINUX_FUTEX
-     enum class __futex_wait_flags : int
-     {
- #ifdef _GLIBCXX_HAVE_LINUX_FUTEX_PRIVATE
-       __private_flag = 128,
- #else
-       __private_flag = 0,
- #endif
-       __wait = 0,
-       __wake = 1,
-       __wait_bitset = 9,
-       __wake_bitset = 10,
-       __wait_private = __wait | __private_flag,
-       __wake_private = __wake | __private_flag,
-       __wait_bitset_private = __wait_bitset | __private_flag,
-       __wake_bitset_private = __wake_bitset | __private_flag,
-       __bitset_match_any = -1
-     };
- 
-     template<typename _Tp>
-       void
-       __platform_wait(const _Tp* __addr, __platform_wait_t __val) noexcept
-       {
- 	auto __e = syscall (SYS_futex, static_cast<const void*>(__addr),
- 			    static_cast<int>(__futex_wait_flags::__wait_private),
- 			    __val, nullptr);
- 	if (!__e || errno == EAGAIN)
- 	  return;
- 	if (errno != EINTR)
- 	  __throw_system_error(errno);
-       }
- 
-     template<typename _Tp>
-       void
-       __platform_notify(const _Tp* __addr, bool __all) noexcept
-       {
- 	syscall (SYS_futex, static_cast<const void*>(__addr),
- 		 static_cast<int>(__futex_wait_flags::__wake_private),
- 		 __all ? INT_MAX : 1);
-       }
- #endif
- 
      inline void
      __thread_yield() noexcept
      {
  #if defined _GLIBCXX_HAS_GTHREADS && defined _GLIBCXX_USE_SCHED_YIELD
!      __gthread_yield();
  #endif
      }
  
--- 71,88 ----
  #ifdef _GLIBCXX_HAVE_PLATFORM_WAIT
        = is_scalar_v<_Tp>
  	&& ((sizeof(_Tp) == sizeof(__detail::__platform_wait_t))
! 	&& (alignof(_Tp) >= __detail::__platform_wait_alignment));
  #else
        = false;
  #endif
  
    namespace __detail
    {
      inline void
      __thread_yield() noexcept
      {
  #if defined _GLIBCXX_HAS_GTHREADS && defined _GLIBCXX_USE_SCHED_YIELD
!       __gthread_yield();
  #endif
      }
  
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 148,481 ****
  #endif
      }
  
-     inline constexpr auto __atomic_spin_count_relax = 12;
-     inline constexpr auto __atomic_spin_count = 16;
- 
-     struct __default_spin_policy
-     {
-       bool
-       operator()() const noexcept
-       { return false; }
-     };
- 
-     template<typename _Pred,
- 	     typename _Spin = __default_spin_policy>
-       bool
-       __atomic_spin(_Pred& __pred, _Spin __spin = _Spin{ }) noexcept
-       {
- 	for (auto __i = 0; __i < __atomic_spin_count; ++__i)
- 	  {
- 	    if (__pred())
- 	      return true;
- 
- 	    if (__i < __atomic_spin_count_relax)
- 	      __detail::__thread_relax();
- 	    else
- 	      __detail::__thread_yield();
- 	  }
- 
- 	while (__spin())
- 	  {
- 	    if (__pred())
- 	      return true;
- 	  }
- 
- 	return false;
-       }
- 
      // return true if equal
      template<typename _Tp>
!       bool __atomic_compare(const _Tp& __a, const _Tp& __b)
        {
  	// TODO make this do the correct padding bit ignoring comparison
  	return __builtin_memcmp(&__a, &__b, sizeof(_Tp)) == 0;
        }
  
!     struct __waiter_pool_base
      {
!       // Don't use std::hardware_destructive_interference_size here because we
!       // don't want the layout of library types to depend on compiler options.
!       static constexpr auto _S_align = 64;
! 
!       alignas(_S_align) __platform_wait_t _M_wait = 0;
! 
! #ifndef _GLIBCXX_HAVE_PLATFORM_WAIT
!       mutex _M_mtx;
! #endif
  
!       alignas(_S_align) __platform_wait_t _M_ver = 0;
  
! #ifndef _GLIBCXX_HAVE_PLATFORM_WAIT
!       __condvar _M_cv;
! #endif
!       __waiter_pool_base() = default;
  
!       void
!       _M_enter_wait() noexcept
!       { __atomic_fetch_add(&_M_wait, 1, __ATOMIC_SEQ_CST); }
  
!       void
!       _M_leave_wait() noexcept
!       { __atomic_fetch_sub(&_M_wait, 1, __ATOMIC_RELEASE); }
  
        bool
!       _M_waiting() const noexcept
!       {
! 	__platform_wait_t __res;
! 	__atomic_load(&_M_wait, &__res, __ATOMIC_SEQ_CST);
! 	return __res != 0;
!       }
! 
!       void
!       _M_notify(__platform_wait_t* __addr, [[maybe_unused]] bool __all,
! 		bool __bare) noexcept
!       {
! #ifdef _GLIBCXX_HAVE_PLATFORM_WAIT
! 	if (__addr == &_M_ver)
! 	  {
! 	    __atomic_fetch_add(__addr, 1, __ATOMIC_SEQ_CST);
! 	    __all = true;
! 	  }
! 
! 	if (__bare || _M_waiting())
! 	  __platform_notify(__addr, __all);
! #else
! 	{
! 	  lock_guard<mutex> __l(_M_mtx);
! 	  __atomic_fetch_add(__addr, 1, __ATOMIC_RELAXED);
! 	}
! 	if (__bare || _M_waiting())
! 	  _M_cv.notify_all();
! #endif
!       }
! 
!       static __waiter_pool_base&
!       _S_for(const void* __addr) noexcept
        {
! 	constexpr __UINTPTR_TYPE__ __ct = 16;
! 	static __waiter_pool_base __w[__ct];
! 	auto __key = ((__UINTPTR_TYPE__)__addr >> 2) % __ct;
! 	return __w[__key];
        }
      };
  
!     struct __waiter_pool : __waiter_pool_base
      {
!       void
!       _M_do_wait(const __platform_wait_t* __addr, __platform_wait_t __old) noexcept
!       {
! #ifdef _GLIBCXX_HAVE_PLATFORM_WAIT
! 	__platform_wait(__addr, __old);
! #else
! 	__platform_wait_t __val;
! 	__atomic_load(__addr, &__val, __ATOMIC_SEQ_CST);
! 	if (__val == __old)
! 	  {
! 	    lock_guard<mutex> __l(_M_mtx);
! 	    __atomic_load(__addr, &__val, __ATOMIC_RELAXED);
! 	    if (__val == __old)
! 	      _M_cv.wait(_M_mtx);
! 	  }
! #endif // __GLIBCXX_HAVE_PLATFORM_WAIT
!       }
!     };
! 
!     template<typename _Tp>
!       struct __waiter_base
!       {
! 	using __waiter_type = _Tp;
  
! 	__waiter_type& _M_w;
! 	__platform_wait_t* _M_addr;
  
! 	template<typename _Up>
! 	  static __platform_wait_t*
! 	  _S_wait_addr(const _Up* __a, __platform_wait_t* __b)
! 	  {
! 	    if constexpr (__platform_wait_uses_type<_Up>)
! 	      return reinterpret_cast<__platform_wait_t*>(const_cast<_Up*>(__a));
! 	    else
! 	      return __b;
! 	  }
  
! 	static __waiter_type&
! 	_S_for(const void* __addr) noexcept
  	{
! 	  static_assert(sizeof(__waiter_type) == sizeof(__waiter_pool_base));
! 	  auto& res = __waiter_pool_base::_S_for(__addr);
! 	  return reinterpret_cast<__waiter_type&>(res);
! 	}
! 
! 	template<typename _Up>
! 	  explicit __waiter_base(const _Up* __addr) noexcept
! 	    : _M_w(_S_for(__addr))
! 	    , _M_addr(_S_wait_addr(__addr, &_M_w._M_ver))
! 	  { }
! 
! 	void
! 	_M_notify(bool __all, bool __bare = false) noexcept
! 	{ _M_w._M_notify(_M_addr, __all, __bare); }
! 
! 	template<typename _Up, typename _ValFn,
! 		 typename _Spin = __default_spin_policy>
! 	  static bool
! 	  _S_do_spin_v(__platform_wait_t* __addr,
! 		       const _Up& __old, _ValFn __vfn,
! 		       __platform_wait_t& __val,
! 		       _Spin __spin = _Spin{ })
! 	  {
! 	    auto const __pred = [=]
! 	      { return !__detail::__atomic_compare(__old, __vfn()); };
! 
! 	    if constexpr (__platform_wait_uses_type<_Up>)
! 	      {
! 		__builtin_memcpy(&__val, &__old, sizeof(__val));
! 	      }
! 	    else
! 	      {
! 		__atomic_load(__addr, &__val, __ATOMIC_ACQUIRE);
! 	      }
! 	    return __atomic_spin(__pred, __spin);
! 	  }
! 
! 	template<typename _Up, typename _ValFn,
! 		 typename _Spin = __default_spin_policy>
! 	  bool
! 	  _M_do_spin_v(const _Up& __old, _ValFn __vfn,
! 		       __platform_wait_t& __val,
! 		       _Spin __spin = _Spin{ })
! 	  { return _S_do_spin_v(_M_addr, __old, __vfn, __val, __spin); }
! 
! 	template<typename _Pred,
! 		 typename _Spin = __default_spin_policy>
! 	  static bool
! 	  _S_do_spin(const __platform_wait_t* __addr,
! 		     _Pred __pred,
! 		     __platform_wait_t& __val,
! 		     _Spin __spin = _Spin{ })
! 	  {
! 	    __atomic_load(__addr, &__val, __ATOMIC_ACQUIRE);
! 	    return __atomic_spin(__pred, __spin);
! 	  }
! 
! 	template<typename _Pred,
! 		 typename _Spin = __default_spin_policy>
! 	  bool
! 	  _M_do_spin(_Pred __pred, __platform_wait_t& __val,
! 		     _Spin __spin = _Spin{ })
! 	  { return _S_do_spin(_M_addr, __pred, __val, __spin); }
!       };
  
!     template<typename _EntersWait>
!       struct __waiter : __waiter_base<__waiter_pool>
!       {
! 	using __base_type = __waiter_base<__waiter_pool>;
  
! 	template<typename _Tp>
! 	  explicit __waiter(const _Tp* __addr) noexcept
! 	    : __base_type(__addr)
! 	  {
! 	    if constexpr (_EntersWait::value)
! 	      _M_w._M_enter_wait();
! 	  }
  
! 	~__waiter()
  	{
! 	  if constexpr (_EntersWait::value)
! 	    _M_w._M_leave_wait();
  	}
  
! 	template<typename _Tp, typename _ValFn>
! 	  void
! 	  _M_do_wait_v(_Tp __old, _ValFn __vfn)
! 	  {
! 	    do
! 	      {
! 		__platform_wait_t __val;
! 		if (__base_type::_M_do_spin_v(__old, __vfn, __val))
! 		  return;
! 		__base_type::_M_w._M_do_wait(__base_type::_M_addr, __val);
! 	      }
! 	    while (__detail::__atomic_compare(__old, __vfn()));
! 	  }
! 
! 	template<typename _Pred>
! 	  void
! 	  _M_do_wait(_Pred __pred) noexcept
! 	  {
! 	    do
! 	      {
! 		__platform_wait_t __val;
! 		if (__base_type::_M_do_spin(__pred, __val))
! 		  return;
! 		__base_type::_M_w._M_do_wait(__base_type::_M_addr, __val);
! 	      }
! 	    while (!__pred());
! 	  }
!       };
  
!     using __enters_wait = __waiter<std::true_type>;
!     using __bare_wait = __waiter<std::false_type>;
    } // namespace __detail
  
!   template<typename _Tp, typename _ValFn>
      void
!     __atomic_wait_address_v(const _Tp* __addr, _Tp __old,
! 			    _ValFn __vfn) noexcept
      {
!       __detail::__enters_wait __w(__addr);
!       __w._M_do_wait_v(__old, __vfn);
      }
  
!   template<typename _Tp, typename _Pred>
!     void
!     __atomic_wait_address(const _Tp* __addr, _Pred __pred) noexcept
!     {
!       __detail::__enters_wait __w(__addr);
!       __w._M_do_wait(__pred);
!     }
  
!   // This call is to be used by atomic types which track contention externally
!   template<typename _Pred>
      void
!     __atomic_wait_address_bare(const __detail::__platform_wait_t* __addr,
! 			       _Pred __pred) noexcept
      {
! #ifdef _GLIBCXX_HAVE_PLATFORM_WAIT
!       do
! 	{
! 	  __detail::__platform_wait_t __val;
! 	  if (__detail::__bare_wait::_S_do_spin(__addr, __pred, __val))
! 	    return;
! 	  __detail::__platform_wait(__addr, __val);
! 	}
!       while (!__pred());
! #else // !_GLIBCXX_HAVE_PLATFORM_WAIT
!       __detail::__bare_wait __w(__addr);
!       __w._M_do_wait(__pred);
! #endif
      }
  
    template<typename _Tp>
      void
!     __atomic_notify_address(const _Tp* __addr, bool __all) noexcept
      {
!       __detail::__bare_wait __w(__addr);
!       __w._M_notify(__all);
      }
  
-   // This call is to be used by atomic types which track contention externally
-   inline void
-   __atomic_notify_address_bare(const __detail::__platform_wait_t* __addr,
- 			       bool __all) noexcept
-   {
- #ifdef _GLIBCXX_HAVE_PLATFORM_WAIT
-     __detail::__platform_notify(__addr, __all);
- #else
-     __detail::__bare_wait __w(__addr);
-     __w._M_notify(__all, true);
- #endif
-   }
  _GLIBCXX_END_NAMESPACE_VERSION
  } // namespace std
  #endif // __glibcxx_atomic_wait
--- 96,284 ----
  #endif
      }
  
      // return true if equal
      template<typename _Tp>
!       inline bool
!       __atomic_eq(const _Tp& __a, const _Tp& __b)
        {
  	// TODO make this do the correct padding bit ignoring comparison
  	return __builtin_memcmp(&__a, &__b, sizeof(_Tp)) == 0;
        }
  
!     // lightweight std::optional<__platform_wait_t>
!     struct __wait_result_type
      {
!       __platform_wait_t _M_val;
!       unsigned char _M_has_val : 1; // _M_val value was loaded before return.
!       unsigned char _M_timeout : 1; // Waiting function ended with timeout.
!       unsigned char _M_unused : 6;  // padding
!     };
  
!     enum class __wait_flags : __UINT_LEAST32_TYPE__
!     {
!        __abi_version = 0,
!        __proxy_wait = 1,
!        __track_contention = 2,
!        __do_spin = 4,
!        __spin_only = 8, // Ignored unless __do_spin is also set.
!        // __abi_version_mask = 0xffff0000,
!     };
  
!     [[__gnu__::__always_inline__]]
!     constexpr __wait_flags
!     operator|(__wait_flags __l, __wait_flags __r) noexcept
!     {
!       using _Ut = underlying_type_t<__wait_flags>;
!       return static_cast<__wait_flags>(static_cast<_Ut>(__l)
! 					 | static_cast<_Ut>(__r));
!     }
  
!     [[__gnu__::__always_inline__]]
!     constexpr __wait_flags&
!     operator|=(__wait_flags& __l, __wait_flags __r) noexcept
!     { return __l = __l | __r; }
  
!     // Simple aggregate containing arguments used by implementation details.
!     struct __wait_args_base
!     {
!       __wait_flags _M_flags;
!       int _M_order = __ATOMIC_ACQUIRE;
!       __platform_wait_t _M_old = 0;
!       void* _M_wait_state = nullptr;
  
+       // Test whether _M_flags & __flags is non-zero.
        bool
!       operator&(__wait_flags __flags) const noexcept
        {
! 	 using _Ut = underlying_type_t<__wait_flags>;
! 	 return static_cast<_Ut>(_M_flags) & static_cast<_Ut>(__flags);
        }
      };
  
!     // Utility for populating a __wait_args_base structure.
!     struct __wait_args : __wait_args_base
      {
!       template<typename _Tp> requires (!is_same_v<_Tp, __wait_args>)
! 	explicit
! 	__wait_args(const _Tp* __addr, bool __bare_wait = false) noexcept
! 	: __wait_args_base{ _S_flags_for(__addr, __bare_wait) }
! 	{ }
  
!       __wait_args(const __platform_wait_t* __addr, __platform_wait_t __old,
! 		  int __order, bool __bare_wait = false) noexcept
!       : __wait_args_base{ _S_flags_for(__addr, __bare_wait), __order, __old }
!       { }
  
!       __wait_args(const __wait_args&) noexcept = default;
!       __wait_args& operator=(const __wait_args&) noexcept = default;
  
!       template<typename _ValFn,
! 	       typename _Tp = decay_t<decltype(std::declval<_ValFn&>()())>>
! 	_Tp
! 	_M_setup_wait(const void* __addr, _ValFn __vfn,
! 		      __wait_result_type __res = {})
  	{
! 	  if constexpr (__platform_wait_uses_type<_Tp>)
! 	    {
! 	      // If the wait is not proxied, the value we check when waiting
! 	      // is the value of the atomic variable itself.
  
! 	      if (__res._M_has_val) // The previous wait loaded a recent value.
! 		{
! 		  _M_old = __res._M_val;
! 		  return __builtin_bit_cast(_Tp, __res._M_val);
! 		}
! 	      else // Load the value from __vfn
! 		{
! 		  _Tp __val = __vfn();
! 		  _M_old = __builtin_bit_cast(__platform_wait_t, __val);
! 		  return __val;
! 		}
! 	    }
! 	  else // It's a proxy wait and the proxy's _M_ver is used.
! 	    {
! 	      if (__res._M_has_val) // The previous wait loaded a recent value.
! 		_M_old = __res._M_val;
! 	      else // Load _M_ver from the proxy (must happen before __vfn()).
! 		_M_load_proxy_wait_val(__addr);
! 	      return __vfn();
! 	    }
! 	}
  
!     private:
!       // Populates _M_wait_state and _M_old from the proxy for __addr.
!       void
!       _M_load_proxy_wait_val(const void* __addr);
  
!       template<typename _Tp>
! 	static constexpr __wait_flags
! 	_S_flags_for(const _Tp*, bool __bare_wait) noexcept
  	{
! 	  using enum __wait_flags;
! 	  __wait_flags __res = __abi_version | __do_spin;
! 	  if (!__bare_wait)
! 	    __res |= __track_contention;
! 	  if constexpr (!__platform_wait_uses_type<_Tp>)
! 	    __res |= __proxy_wait;
! 	  return __res;
  	}
+     };
  
!     __wait_result_type
!     __wait_impl(const void* __addr, __wait_args_base&);
  
!     void
!     __notify_impl(const void* __addr, bool __all, const __wait_args_base&);
    } // namespace __detail
  
!   // Wait on __addr while __pred(__vfn()) is false.
!   // If __bare_wait is false, increment a counter while waiting.
!   // For callers that keep their own count of waiters, use __bare_wait=true.
!   template<typename _Tp, typename _Pred, typename _ValFn>
      void
!     __atomic_wait_address(const _Tp* __addr, _Pred&& __pred, _ValFn&& __vfn,
! 			  bool __bare_wait = false) noexcept
      {
!       __detail::__wait_args __args{ __addr, __bare_wait };
!       _Tp __val = __args._M_setup_wait(__addr, __vfn);
!       while (!__pred(__val))
! 	{
! 	  auto __res = __detail::__wait_impl(__addr, __args);
! 	  __val = __args._M_setup_wait(__addr, __vfn, __res);
! 	}
!       // C++26 will return __val
      }
  
!   inline void
!   __atomic_wait_address_v(const __detail::__platform_wait_t* __addr,
! 			  __detail::__platform_wait_t __old,
! 			  int __order)
!   {
!     __detail::__wait_args __args{ __addr, __old, __order };
!     // C++26 will not ignore the return value here
!     __detail::__wait_impl(__addr, __args);
!   }
  
!   // Wait on __addr while __vfn() == __old is true.
!   template<typename _Tp, typename _ValFn>
      void
!     __atomic_wait_address_v(const _Tp* __addr, _Tp __old,
! 			    _ValFn __vfn) noexcept
      {
!       auto __pfn = [&](const _Tp& __val)
! 	  { return !__detail::__atomic_eq(__old, __val); };
!       std::__atomic_wait_address(__addr, __pfn, forward<_ValFn>(__vfn));
      }
  
    template<typename _Tp>
      void
!     __atomic_notify_address(const _Tp* __addr, bool __all,
! 			    bool __bare_wait = false) noexcept
      {
!       __detail::__wait_args __args{ __addr, __bare_wait };
!       __detail::__notify_impl(__addr, __all, __args);
      }
  
  _GLIBCXX_END_NAMESPACE_VERSION
  } // namespace std
  #endif // __glibcxx_atomic_wait
diff -Nrcpad gcc-16-20250525/libstdc++-v3/include/bits/boost_concept_check.h gcc-16-20250601/libstdc++-v3/include/bits/boost_concept_check.h
*** gcc-16-20250525/libstdc++-v3/include/bits/boost_concept_check.h	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libstdc++-v3/include/bits/boost_concept_check.h	Sun Jun  1 22:32:41 2025
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 68,73 ****
--- 68,74 ----
  
  #pragma GCC diagnostic push
  #pragma GCC diagnostic ignored "-Wunused-local-typedefs"
+ #pragma GCC diagnostic ignored "-Wlong-long"
  
  #define _IsUnused __attribute__ ((__unused__))
  
diff -Nrcpad gcc-16-20250525/libstdc++-v3/include/bits/funcref_impl.h gcc-16-20250601/libstdc++-v3/include/bits/funcref_impl.h
*** gcc-16-20250525/libstdc++-v3/include/bits/funcref_impl.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/include/bits/funcref_impl.h	Sun Jun  1 22:32:41 2025
***************
*** 0 ****
--- 1,198 ----
+ // Implementation of std::function_ref -*- 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 include/bits/funcref_impl.h
+  *  This is an internal header file, included by other library headers.
+  *  Do not attempt to use it directly. @headername{functional}
+  */
+ 
+ #ifndef _GLIBCXX_MOF_CV
+ # define _GLIBCXX_MOF_CV
+ #endif
+ 
+ namespace std _GLIBCXX_VISIBILITY(default)
+ {
+ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ 
+   /// @cond undocumented
+   namespace __polyfunc
+   {
+     template<bool _Noex, typename _Ret, typename _Class, typename... _Args>
+       struct __skip_first_arg<_Ret(_Class::*)(_Args...) _GLIBCXX_MOF_CV
+ 			      noexcept(_Noex)>
+       { using type = _Ret(_Args...) noexcept(_Noex); };
+ 
+     template<bool _Noex, typename _Ret, typename _Class, typename... _Args>
+       struct __skip_first_arg<_Ret(_Class::*)(_Args...) _GLIBCXX_MOF_CV&
+ 			      noexcept(_Noex)>
+       { using type = _Ret(_Args...) noexcept(_Noex); };
+   } // namespace __polyfunc
+   /// @endcond
+ 
+   /**
+    *  @brief Non-owning polymorphic function wrapper.
+    *  @ingroup functors
+    *  @since C++26
+    *  @headerfile functional
+    *
+    *  The `std::function_ref` class template is a non-owning call wrapper,
+    *  that refers to a bound object. Using function_ref outside of the lifetime
+    *  of the bound object has undefined behavior.
+    *
+    *  It supports const-qualification and no-throw guarantees. The
+    *  qualifications and exception-specification of the signature are respected
+    *  when invoking the reference function.
+    */
+   template<typename _Res, typename... _ArgTypes, bool _Noex>
+     class function_ref<_Res(_ArgTypes...) _GLIBCXX_MOF_CV
+ 		       noexcept(_Noex)>
+     {
+       using _Invoker = __polyfunc::_Invoker<_Noex, _Res, _ArgTypes...>;
+       using _Signature = _Invoker::_Signature;
+ 
+       // [func.wrap.ref.ctor]/1 is-invokable-using
+       template<typename... _Tps>
+ 	static constexpr bool __is_invocable_using
+ 	  = __conditional_t<_Noex,
+ 			    is_nothrow_invocable_r<_Res, _Tps..., _ArgTypes...>,
+ 			    is_invocable_r<_Res, _Tps..., _ArgTypes...>>::value;
+ 
+     public:
+       /// Target and bound object is function pointed by parameter.
+       template<typename _Fn>
+ 	requires is_function_v<_Fn> && __is_invocable_using<_Fn*>
+ 	function_ref(_Fn* __fn) noexcept
+ 	{
+ 	  __glibcxx_assert(__fn != nullptr);
+ 	  _M_invoke = _Invoker::template _S_ptrs<_Fn*>();
+ 	  _M_init(__fn);
+ 	}
+ 
+       /// Target and bound object is object referenced by parameter.
+       template<typename _Fn, typename _Vt = remove_reference_t<_Fn>>
+ 	requires (!is_same_v<remove_cv_t<_Vt>, function_ref>)
+ 	       && (!is_member_pointer_v<_Vt>)
+ 	       // We deviate from standard by having this condition, that forces
+ 	       // function references to use _Fn* constructors. This simplies
+ 	       // implementation and provide better diagnostic when used in
+ 	       // constant expression (above constructor is not constexpr).
+ 	       && (!is_function_v<_Vt>)
+ 	       && __is_invocable_using<_Vt _GLIBCXX_MOF_CV&>
+ 	constexpr
+ 	function_ref(_Fn&& __f) noexcept
+ 	{
+ 	  _M_invoke = _Invoker::template _S_ptrs<_Vt _GLIBCXX_MOF_CV&>();
+ 	  _M_init(std::addressof(__f));
+ 	}
+ 
+       // _GLIBCXX_RESOLVE_LIB_DEFECTS
+       // 4256. Incorrect constrains for function_ref constructors from nontype
+       /// Target object is __fn. There is no bound object.
+       template<auto __fn>
+ 	requires __is_invocable_using<const decltype(__fn)&>
+ 	constexpr
+ 	function_ref(nontype_t<__fn>) noexcept
+ 	{
+ 	  using _Fn = remove_cv_t<decltype(__fn)>;
+ 	  if constexpr (is_pointer_v<_Fn> || is_member_pointer_v<_Fn>)
+ 	    static_assert(__fn != nullptr);
+ 
+ 	  _M_invoke = &_Invoker::template _S_nttp<__fn>;
+ 	  _M_ptrs._M_obj = nullptr;
+ 	}
+ 
+       /// Target object is equivalent to std::bind_front<_fn>(std::ref(__ref)).
+       /// Bound object is object referenced by second parameter.
+       template<auto __fn, typename _Up, typename _Td = remove_reference_t<_Up>>
+ 	requires (!is_rvalue_reference_v<_Up&&>)
+ 	  && __is_invocable_using<const decltype(__fn)&, _Td _GLIBCXX_MOF_CV&>
+ 	constexpr
+ 	function_ref(nontype_t<__fn>, _Up&& __ref) noexcept
+ 	{
+ 	  using _Fn = remove_cv_t<decltype(__fn)>;
+ 	  if constexpr (is_pointer_v<_Fn> || is_member_pointer_v<_Fn>)
+ 	    static_assert(__fn != nullptr);
+ 
+ 	  using _Tr = _Td _GLIBCXX_MOF_CV&;
+ 	  if constexpr (is_member_pointer_v<_Fn> && is_lvalue_reference_v<_Tr>)
+ 	    // N.B. invoking member pointer on lvalue produces the same effects,
+ 	    // as invoking it on pointer to that lvalue.
+ 	    _M_invoke = &_Invoker::template _S_bind_ptr<__fn, _Td _GLIBCXX_MOF_CV>;
+ 	  else
+ 	    _M_invoke = &_Invoker::template _S_bind_ref<__fn, _Tr>;
+ 	  _M_init(std::addressof(__ref));
+ 	}
+ 
+       /// Target object is equivalent to std::bind_front<_fn>(__ptr).
+       /// Bound object is object pointed by second parameter (if any).
+       template<auto __fn, typename _Td>
+ 	requires __is_invocable_using<const decltype(__fn)&, _Td _GLIBCXX_MOF_CV*>
+ 	constexpr
+ 	function_ref(nontype_t<__fn>, _Td _GLIBCXX_MOF_CV* __ptr) noexcept
+ 	{
+ 	  using _Fn = remove_cv_t<decltype(__fn)>;
+ 	  if constexpr (is_pointer_v<_Fn> || is_member_pointer_v<_Fn>)
+ 	    static_assert(__fn != nullptr);
+ 	  if constexpr (is_member_pointer_v<_Fn>)
+ 	    __glibcxx_assert(__ptr != nullptr);
+ 
+ 	  _M_invoke = &_Invoker::template _S_bind_ptr<__fn, _Td _GLIBCXX_MOF_CV>;
+ 	  _M_init(__ptr);
+ 	}
+ 
+       template<typename _Tp>
+ 	requires (!is_same_v<_Tp, function_ref>)
+ 	       && (!is_pointer_v<_Tp>) && (!__is_nontype_v<_Tp>)
+ 	function_ref&
+ 	operator=(_Tp) = delete;
+ 
+       /** Invoke the target object.
+        *
+        * The bound object will be invoked using the supplied arguments,
+        * and as const or non-const, as dictated by the template arguments
+        * of the `function_ref` specialization.
+        */
+       _Res
+       operator()(_ArgTypes... __args) const noexcept(_Noex)
+       { return _M_invoke(_M_ptrs, std::forward<_ArgTypes>(__args)...); }
+ 
+     private:
+       template<typename _Tp>
+ 	constexpr void
+ 	_M_init(_Tp* __ptr) noexcept
+ 	{
+ 	  if constexpr (is_function_v<_Tp>)
+ 	    _M_ptrs._M_func = reinterpret_cast<void(*)()>(__ptr);
+ 	  else
+ 	    _M_ptrs._M_obj = __ptr;
+ 	}
+ 
+       typename _Invoker::__ptrs_func_t _M_invoke;
+       __polyfunc::_Ptrs _M_ptrs;
+     };
+ 
+ #undef _GLIBCXX_MOF_CV
+ 
+ _GLIBCXX_END_NAMESPACE_VERSION
+ } // namespace std
diff -Nrcpad gcc-16-20250525/libstdc++-v3/include/bits/funcwrap.h gcc-16-20250601/libstdc++-v3/include/bits/funcwrap.h
*** gcc-16-20250525/libstdc++-v3/include/bits/funcwrap.h	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libstdc++-v3/include/bits/funcwrap.h	Sun Jun  1 22:32:41 2025
***************
*** 1,4 ****
! // Implementation of std::move_only_function and std::copyable_function -*- C++ -*-
  
  // Copyright The GNU Toolchain Authors.
  //
--- 1,5 ----
! // Implementation of std::move_only_function, std::copyable_function
! // and std::function_ref  -*- C++ -*-
  
  // Copyright The GNU Toolchain Authors.
  //
***************
*** 36,42 ****
  
  #include <bits/version.h>
  
! #if defined(__glibcxx_move_only_function) || defined(__glibcxx_copyable_function)
  
  #include <bits/invoke.h>
  #include <bits/utility.h>
--- 37,43 ----
  
  #include <bits/version.h>
  
! #if __glibcxx_move_only_function || __glibcxx_copyable_function || __glibcxx_function_ref
  
  #include <bits/invoke.h>
  #include <bits/utility.h>
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 53,62 ****
    {
      union _Ptrs
      {
!       void* _M_obj;
        void (*_M_func)();
      };
  
     struct _Storage
     {
       void*       _M_addr() noexcept       { return &_M_bytes[0]; }
--- 54,77 ----
    {
      union _Ptrs
      {
!       const void* _M_obj;
        void (*_M_func)();
      };
  
+    template<typename _Tp>
+      [[__gnu__::__always_inline__]]
+      constexpr auto*
+      __cast_to(_Ptrs __ptrs) noexcept
+      {
+        using _Td = remove_reference_t<_Tp>;
+        if constexpr (is_function_v<_Td>)
+ 	 return reinterpret_cast<_Td*>(__ptrs._M_func);
+        else if constexpr (is_const_v<_Td>)
+ 	 return static_cast<_Td*>(__ptrs._M_obj);
+        else
+ 	 return static_cast<_Td*>(const_cast<void*>(__ptrs._M_obj));
+      }
+ 
     struct _Storage
     {
       void*       _M_addr() noexcept       { return &_M_bytes[0]; }
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 97,128 ****
  	   ::new (_M_addr()) _Tp(std::forward<_Args>(__args)...);
         }
  
-      template<typename _Tp>
-        [[__gnu__::__always_inline__]]
-        _Tp*
-        _M_ptr() const noexcept
-        {
- 	 if constexpr (!_S_stored_locally<remove_const_t<_Tp>>())
- 	   return static_cast<_Tp*>(_M_ptrs._M_obj);
- 	 else if constexpr (is_const_v<_Tp>)
- 	   return static_cast<_Tp*>(_M_addr());
- 	 else
- 	   // _Manager and _Invoker pass _Storage by const&, even for mutable sources.
- 	   return static_cast<_Tp*>(const_cast<void*>(_M_addr()));
-        }
- 
-      template<typename _Ref>
-        [[__gnu__::__always_inline__]]
-        _Ref
-        _M_ref() const noexcept
-        {
- 	 using _Tp = remove_reference_t<_Ref>;
- 	 if constexpr (is_function_v<remove_pointer_t<_Tp>>)
- 	   return reinterpret_cast<_Tp>(_M_ptrs._M_func);
- 	 else
- 	   return static_cast<_Ref>(*_M_ptr<_Tp>());
-        }
- 
       // We want to have enough space to store a simple delegate type.
       struct _Delegate { void (_Storage::*__pfm)(); _Storage* __obj; };
       union {
--- 112,117 ----
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 143,148 ****
--- 132,168 ----
  	 _S_storage()
  	 { return &_S_call_storage<_Adjust_target<_Tp>>; }
  
+        using __ptrs_func_t = _Ret(*)(_Ptrs, _Args...) noexcept(_Noex);
+        template<typename _Tp>
+ 	 static consteval __ptrs_func_t
+ 	 _S_ptrs()
+ 	 { return &_S_call_ptrs<_Adjust_target<_Tp>>; }
+ 
+ #ifdef __glibcxx_function_ref // C++ >= 26
+        template<auto __fn>
+ 	 static _Ret
+ 	 _S_nttp(_Ptrs, _Args... __args) noexcept(_Noex)
+ 	 { return std::__invoke_r<_Ret>(__fn, std::forward<_Args>(__args)...); }
+ 
+        template<auto __fn, typename _Tp>
+ 	 static _Ret
+ 	 _S_bind_ptr(_Ptrs __ptrs, _Args... __args) noexcept(_Noex)
+ 	 {
+ 	   auto* __p = __polyfunc::__cast_to<_Tp>(__ptrs);
+ 	   return std::__invoke_r<_Ret>(__fn, __p,
+ 					std::forward<_Args>(__args)...);
+ 	 }
+ 
+        template<auto __fn, typename _Ref>
+ 	 static _Ret
+ 	 _S_bind_ref(_Ptrs __ptrs, _Args... __args) noexcept(_Noex)
+ 	 {
+ 	   auto* __p = __polyfunc::__cast_to<_Ref>(__ptrs);
+ 	   return std::__invoke_r<_Ret>(__fn, static_cast<_Ref>(*__p),
+ 					std::forward<_Args>(__args)...);
+ 	 }
+ #endif // __glibcxx_function_ref
+ 
       private:
         template<typename _Tp, typename _Td = remove_cvref_t<_Tp>>
  	 using _Adjust_target =
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 152,159 ****
  	 static _Ret
  	 _S_call_storage(const _Storage& __ref, _Args... __args) noexcept(_Noex)
  	 {
! 	   return std::__invoke_r<_Ret>(__ref._M_ref<_Tp>(),
! 					std::forward<_Args>(__args)...);
  	 }
       };
  
--- 172,200 ----
  	 static _Ret
  	 _S_call_storage(const _Storage& __ref, _Args... __args) noexcept(_Noex)
  	 {
! 	   _Ptrs __ptrs;
! 	   if constexpr (is_function_v<remove_pointer_t<_Tp>>)
! 	     __ptrs._M_func = __ref._M_ptrs._M_func;
! 	   else if constexpr (!_Storage::_S_stored_locally<remove_cvref_t<_Tp>>())
! 	     __ptrs._M_obj = __ref._M_ptrs._M_obj;
! 	   else
! 	     __ptrs._M_obj = __ref._M_addr();
! 	   return _S_call_ptrs<_Tp>(__ptrs, std::forward<_Args>(__args)...);
! 	 }
! 
!        template<typename _Tp>
! 	 static _Ret
! 	 _S_call_ptrs(_Ptrs __ptrs, _Args... __args) noexcept(_Noex)
! 	 {
! 	   if constexpr (is_function_v<remove_pointer_t<_Tp>>)
! 	     return std::__invoke_r<_Ret>(reinterpret_cast<_Tp>(__ptrs._M_func),
! 					  std::forward<_Args>(__args)...);
! 	   else
! 	     {
! 	       auto* __p = __polyfunc::__cast_to<_Tp>(__ptrs);
! 	       return std::__invoke_r<_Ret>(static_cast<_Tp>(*__p),
! 					    std::forward<_Args>(__args)...);
! 	     }
  	 }
       };
  
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 184,189 ****
--- 225,231 ----
  	 return false;
       }
  
+ #if __glibcxx_move_only_function || __glibcxx_copyable_function
     struct _Manager
     {
       enum class _Op
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 241,247 ****
         switch (__op)
         {
  	 case _Op::_Address:
! 	   __target._M_ptrs._M_obj = const_cast<void*>(__src->_M_addr());
  	   return;
  	 case _Op::_Move:
  	 case _Op::_Copy:
--- 283,289 ----
         switch (__op)
         {
  	 case _Op::_Address:
! 	   __target._M_ptrs._M_obj = __src->_M_addr();
  	   return;
  	 case _Op::_Move:
  	 case _Op::_Copy:
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 263,286 ****
  	 switch (__op)
  	 {
  	   case _Op::_Address:
! 	     __target._M_ptrs._M_obj = __src->_M_ptr<_Tp>();
  	     return;
  	   case _Op::_Move:
  	     {
! 	       _Tp* __obj = __src->_M_ptr<_Tp>();
  	       ::new(__target._M_addr()) _Tp(std::move(*__obj));
  	       __obj->~_Tp();
  	     }
  	     return;
  	   case _Op::_Destroy:
! 	     __target._M_ptr<_Tp>()->~_Tp();
  	     return;
  	   case _Op::_Copy:
  	     if constexpr (_Provide_copy)
! 	       ::new (__target._M_addr()) _Tp(__src->_M_ref<const _Tp&>());
! 	     else
! 	       __builtin_unreachable();
! 	     return;
  	 }
         }
  
--- 305,330 ----
  	 switch (__op)
  	 {
  	   case _Op::_Address:
! 	     __target._M_ptrs._M_obj = __src->_M_addr();
  	     return;
  	   case _Op::_Move:
  	     {
! 	       _Tp* __obj = static_cast<_Tp*>(const_cast<void*>(__src->_M_addr()));
  	       ::new(__target._M_addr()) _Tp(std::move(*__obj));
  	       __obj->~_Tp();
  	     }
  	     return;
  	   case _Op::_Destroy:
! 	     static_cast<_Tp*>(__target._M_addr())->~_Tp();
  	     return;
  	   case _Op::_Copy:
  	     if constexpr (_Provide_copy)
! 	       {
! 		 auto* __obj = static_cast<const _Tp*>(__src->_M_addr());
! 		 ::new (__target._M_addr()) _Tp(*__obj);
! 		 return;
! 	       }
! 	     __builtin_unreachable();
  	 }
         }
  
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 296,309 ****
  	     __target._M_ptrs._M_obj = __src->_M_ptrs._M_obj;
  	     return;
  	   case _Op::_Destroy:
! 	     delete __target._M_ptr<_Tp>();
  	     return;
  	   case _Op::_Copy:
  	     if constexpr (_Provide_copy)
! 	       __target._M_ptrs._M_obj = new _Tp(__src->_M_ref<const _Tp&>());
! 	     else
! 	       __builtin_unreachable();
! 	     return;
  	  }
  	}
     };
--- 340,355 ----
  	     __target._M_ptrs._M_obj = __src->_M_ptrs._M_obj;
  	     return;
  	   case _Op::_Destroy:
! 	     delete static_cast<const _Tp*>(__target._M_ptrs._M_obj);
  	     return;
  	   case _Op::_Copy:
  	     if constexpr (_Provide_copy)
! 	       {
! 		 auto* __obj = static_cast<const _Tp*>(__src->_M_ptrs._M_obj);
! 		 __target._M_ptrs._M_obj = new _Tp(*__obj);
! 		 return;
! 	       }
! 	     __builtin_unreachable();
  	  }
  	}
     };
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 382,388 ****
       friend class _Cpy_base;
  #endif // __glibcxx_copyable_function
     };
! 
  } // namespace __polyfunc
    /// @endcond
  
--- 428,434 ----
       friend class _Cpy_base;
  #endif // __glibcxx_copyable_function
     };
! #endif // __glibcxx_copyable_function || __glibcxx_copyable_function
  } // namespace __polyfunc
    /// @endcond
  
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 468,473 ****
--- 514,563 ----
    }  // namespace __detail::__variant
  #endif // __glibcxx_copyable_function
  
+ #ifdef __glibcxx_function_ref  // C++ >= 26
+   /// @cond undocumented
+   namespace __polyfunc
+   {
+     template<typename _Sig>
+       struct __skip_first_arg;
+ 
+     // Additional partial specializations are defined in bits/funcref_impl.h
+     template<bool _Noex, typename _Ret, typename _Arg, typename... _Args>
+       struct __skip_first_arg<_Ret(*)(_Arg, _Args...) noexcept(_Noex)>
+       { using type = _Ret(_Args...) noexcept(_Noex); };
+ 
+     template<typename _Fn, typename _Tr>
+       consteval auto
+       __deduce_funcref()
+       {
+ 	if constexpr (is_member_object_pointer_v<_Fn>)
+ 	  // TODO Consider reporting issue to make this noexcept
+ 	  return static_cast<invoke_result_t<_Fn, _Tr>(*)()>(nullptr);
+ 	else
+ 	  return static_cast<__skip_first_arg<_Fn>::type*>(nullptr);
+       }
+   } // namespace __polyfunc
+   /// @endcond
+ 
+   template<typename... _Signature>
+     class function_ref; // not defined
+ 
+   template<typename _Fn>
+     requires is_function_v<_Fn>
+     function_ref(_Fn*) -> function_ref<_Fn>;
+ 
+   template<auto __f, class _Fn = remove_pointer_t<decltype(__f)>>
+     requires is_function_v<_Fn>
+     function_ref(nontype_t<__f>) -> function_ref<_Fn>;
+ 
+   template<auto __f, typename _Tp, class _Fn = decltype(__f)>
+     requires is_member_pointer_v<_Fn> || is_function_v<remove_pointer_t<_Fn>>
+     function_ref(nontype_t<__f>, _Tp&&)
+       -> function_ref<
+ 	   remove_pointer_t<decltype(__polyfunc::__deduce_funcref<_Fn, _Tp&>())>>;
+ 
+ #endif // __glibcxx_function_ref
+ 
  _GLIBCXX_END_NAMESPACE_VERSION
  } // namespace std
  
*************** _GLIBCXX_END_NAMESPACE_VERSION
*** 503,507 ****
  #include "cpyfunc_impl.h"
  #endif // __glibcxx_copyable_function
  
! #endif // __glibcxx_copyable_function || __glibcxx_copyable_function
  #endif // _GLIBCXX_FUNCWRAP_H
--- 593,603 ----
  #include "cpyfunc_impl.h"
  #endif // __glibcxx_copyable_function
  
! #ifdef __glibcxx_function_ref  // C++ >= 26
! #include "funcref_impl.h"
! #define _GLIBCXX_MOF_CV const
! #include "funcref_impl.h"
! #endif // __glibcxx_function_ref
! 
! #endif // move_only_function || copyable_function || function_ref
  #endif // _GLIBCXX_FUNCWRAP_H
diff -Nrcpad gcc-16-20250525/libstdc++-v3/include/bits/indirect.h gcc-16-20250601/libstdc++-v3/include/bits/indirect.h
*** gcc-16-20250525/libstdc++-v3/include/bits/indirect.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/include/bits/indirect.h	Sun Jun  1 22:32:41 2025
***************
*** 0 ****
--- 1,459 ----
+ // Vocabulary Types for Composite Class Design -*- 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 include/bits/indirect.h
+  *  This is an internal header file, included by other library headers.
+  *  Do not attempt to use it directly. @headername{memory}
+  */
+ 
+ #ifndef _GLIBCXX_INDIRECT_H
+ #define _GLIBCXX_INDIRECT_H 1
+ 
+ #pragma GCC system_header
+ 
+ #include <bits/version.h>
+ 
+ #if __glibcxx_indirect || __glibcxx_polymorphic // >= C++26
+ #include <compare>
+ #include <initializer_list>
+ #include <bits/allocator.h>
+ #include <bits/alloc_traits.h>
+ #include <bits/allocated_ptr.h>   // __allocate_guarded
+ #include <bits/uses_allocator.h>  // allocator_arg_t
+ #include <bits/utility.h>         // __is_in_place_type_v
+ #include <bits/functional_hash.h> // hash
+ #include <bits/memory_resource.h> // polymorphic_allocator
+ 
+ namespace std _GLIBCXX_VISIBILITY(default)
+ {
+ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ 
+ #if  __glibcxx_indirect
+   template<typename _Tp, typename _Alloc = allocator<_Tp>>
+     class indirect;
+ 
+   template<typename _Tp>
+     constexpr bool __is_indirect = false;
+   template<typename _Tp, typename _Alloc>
+     constexpr bool __is_indirect<indirect<_Tp, _Alloc>> = true;
+ 
+ #if _GLIBCXX_HOSTED
+   namespace pmr
+   {
+     template<typename _Tp>
+       using indirect = indirect<_Tp, polymorphic_allocator<_Tp>>;
+   }
+ #endif
+ 
+   // [indirect], class template indirect
+   template<typename _Tp, typename _Alloc>
+     class indirect
+     {
+       static_assert(is_object_v<_Tp>);
+       static_assert(!is_array_v<_Tp>);
+       static_assert(!is_same_v<_Tp, in_place_t>);
+       static_assert(!__is_in_place_type_v<_Tp>);
+       static_assert(!is_const_v<_Tp> && !is_volatile_v<_Tp>);
+ 
+       using _ATraits = allocator_traits<_Alloc>;
+       static_assert(is_same_v<_Tp, typename _ATraits::value_type>);
+ 
+     public:
+       using value_type = _Tp;
+       using allocator_type = _Alloc;
+       using pointer = typename allocator_traits<_Alloc>::pointer;
+       using const_pointer = typename allocator_traits<_Alloc>::const_pointer;
+ 
+       constexpr explicit
+       indirect() requires is_default_constructible_v<_Alloc>
+       : _M_objp(_M_make_obj_chk())
+       { }
+ 
+       constexpr explicit
+       indirect(allocator_arg_t, const _Alloc& __a)
+       : _M_alloc(__a), _M_objp(_M_make_obj_chk())
+       { }
+ 
+       constexpr
+       indirect(const indirect& __o)
+       : indirect(allocator_arg,
+ 		 _ATraits::select_on_container_copy_construction(__o._M_alloc),
+ 		 __o)
+       { }
+ 
+       constexpr
+       indirect(allocator_arg_t, const _Alloc& __a, const indirect& __other)
+       : _M_alloc(__a)
+       {
+ 	if (__other._M_objp)
+ 	  _M_objp = _M_make_obj_chk(__other.__get());
+ 	else
+ 	  _M_objp = nullptr;
+       }
+ 
+       constexpr
+       indirect(indirect&& __other) noexcept
+       : _M_alloc(std::move(__other._M_alloc)),
+ 	_M_objp(std::__exchange(__other._M_objp, nullptr))
+       { }
+ 
+       constexpr
+       indirect(allocator_arg_t, const _Alloc& __a,
+ 	       indirect&& __other) noexcept(_ATraits::is_always_equal::value)
+       : _M_alloc(__a),
+ 	_M_objp(std::__exchange(__other._M_objp, nullptr))
+       {
+ 	if constexpr (!_ATraits::is_always_equal::value)
+ 	  if (_M_objp && _M_alloc != __other._M_alloc)
+ 	    {
+ 	      static_assert(sizeof(_Tp) != 0, "must be a complete type");
+ 
+ 	      // _M_alloc cannot free _M_objp, give it back to __other.
+ 	      __other._M_objp = std::__exchange(_M_objp, nullptr);
+ 	      // And create a new object that can be freed by _M_alloc.
+ 	      _M_objp = _M_make_obj(std::move(*__other._M_objp));
+ 	    }
+       }
+ 
+       template<typename _Up = _Tp>
+ 	requires (!is_same_v<remove_cvref_t<_Up>, in_place_t>)
+ 	  && (!is_same_v<remove_cvref_t<_Up>, indirect>)
+ 	  && is_constructible_v<_Tp, _Up>
+ 	  && is_default_constructible_v<_Alloc>
+ 	constexpr explicit
+ 	indirect(_Up&& __u)
+ 	: _M_objp(_M_make_obj(std::forward<_Up>(__u)))
+ 	{ }
+ 
+       template<typename _Up = _Tp>
+ 	requires (!is_same_v<remove_cvref_t<_Up>, in_place_t>)
+ 	  && (!is_same_v<remove_cvref_t<_Up>, indirect>)
+ 	  && is_constructible_v<_Tp, _Up>
+ 	constexpr explicit
+ 	indirect(allocator_arg_t, const _Alloc& __a, _Up&& __u)
+ 	: _M_alloc(__a), _M_objp(_M_make_obj(std::forward<_Up>(__u)))
+ 	{ }
+ 
+       template<typename... _Us>
+ 	requires is_constructible_v<_Tp, _Us...>
+ 	  && is_default_constructible_v<_Alloc>
+ 	constexpr explicit
+ 	indirect(in_place_t, _Us&&... __us)
+ 	: _M_objp(_M_make_obj(std::forward<_Us>(__us)...))
+ 	{ }
+ 
+       template<typename... _Us>
+ 	requires is_constructible_v<_Tp, _Us...>
+ 	constexpr explicit
+ 	indirect(allocator_arg_t, const _Alloc& __a, in_place_t, _Us&&... __us)
+ 	: _M_alloc(__a),
+ 	  _M_objp(_M_make_obj(std::forward<_Us>(__us)...))
+ 	{ }
+ 
+       template<typename _Ip, typename... _Us>
+ 	requires is_constructible_v<_Tp, initializer_list<_Ip>&, _Us...>
+ 	  && is_default_constructible_v<_Alloc>
+ 	constexpr explicit
+ 	indirect(in_place_t, initializer_list<_Ip> __il, _Us&&... __us)
+ 	: _M_objp(_M_make_obj(__il, std::forward<_Us>(__us)...))
+ 	{ }
+ 
+       template<typename _Ip, typename... _Us>
+ 	requires is_constructible_v<_Tp, initializer_list<_Ip>&, _Us...>
+ 	constexpr explicit
+ 	indirect(allocator_arg_t, const _Alloc& __a,
+ 		 in_place_t, initializer_list<_Ip> __il, _Us&&... __us)
+ 	: _M_alloc(__a),
+ 	  _M_objp(_M_make_obj(__il, std::forward<_Us>(__us)...))
+ 	{ }
+ 
+       constexpr ~indirect()
+       {
+ 	static_assert(sizeof(_Tp) != 0, "must be a complete type");
+ 	_M_reset(nullptr);
+       }
+ 
+       constexpr indirect&
+       operator=(const indirect& __other)
+       {
+ 	static_assert(is_copy_assignable_v<_Tp>);
+ 	static_assert(is_copy_constructible_v<_Tp>);
+ 
+ 	if (__builtin_addressof(__other) == this) [[unlikely]]
+ 	  return *this;
+ 
+ 	constexpr bool __pocca
+ 	  = _ATraits::propagate_on_container_copy_assignment::value;
+ 
+ 	pointer __ptr = nullptr;
+ 	if (__other._M_objp)
+ 	  {
+ 	    if (_ATraits::is_always_equal::value
+ 		  || _M_alloc == __other._M_alloc)
+ 	      {
+ 		if (_M_objp)
+ 		  {
+ 		    *_M_objp = __other.__get();
+ 		    if constexpr (__pocca)
+ 		      _M_alloc = __other._M_alloc;
+ 		    return *this;
+ 		  }
+ 	      }
+ 	    const indirect& __x = __pocca ? __other : *this;
+ 	    __ptr = __x._M_make_obj(__other.__get());
+ 	  }
+ 
+ 	_M_reset(__ptr);
+ 
+ 	if constexpr (__pocca)
+ 	  _M_alloc = __other._M_alloc;
+ 
+ 	return *this;
+       }
+ 
+       constexpr indirect&
+       operator=(indirect&& __other)
+       noexcept(_ATraits::propagate_on_container_move_assignment::value
+ 		 || _ATraits::is_always_equal::value)
+       {
+ 	// N5008 says is_copy_constructible_v<T> here, but that seems wrong.
+ 	// We only require move-constructible, and only for unequal allocators.
+ 
+ 	if (__builtin_addressof(__other) == this) [[unlikely]]
+ 	  return *this;
+ 
+ 	constexpr bool __pocma
+ 	  = _ATraits::propagate_on_container_move_assignment::value;
+ 
+ 	pointer __ptr = nullptr;
+ 
+ 	// _GLIBCXX_RESOLVE_LIB_DEFECTS
+ 	// 4251. Move assignment for indirect unnecessarily requires copy construction
+ 	if constexpr (_ATraits::is_always_equal::value || __pocma)
+ 	  __ptr = std::__exchange(__other._M_objp, nullptr);
+ 	else if (_M_alloc == __other._M_alloc)
+ 	  __ptr = std::__exchange(__other._M_objp, nullptr);
+ 	else if (__other._M_objp)
+ 	  {
+ 	    static_assert(is_move_constructible_v<_Tp>);
+ 	    __ptr = _M_make_obj(std::move(*__other._M_objp));
+ 	  }
+ 
+ 	_M_reset(__ptr);
+ 
+ 	if constexpr (__pocma)
+ 	  _M_alloc = __other._M_alloc;
+ 
+ 	return *this;
+       }
+ 
+       template<typename _Up = _Tp>
+ 	requires (!is_same_v<remove_cvref_t<_Up>, indirect>)
+ 	  && is_constructible_v<_Tp, _Up> && is_assignable_v<_Tp&, _Up>
+ 	constexpr indirect&
+ 	operator=(_Up&& __u)
+ 	{
+ 	  if (_M_objp == nullptr)
+ 	    _M_objp = _M_make_obj(std::forward<_Up>(__u));
+ 	  else
+ 	    *_M_objp = std::forward<_Up>(__u);
+ 
+ 	  return *this;
+ 	}
+ 
+       template<typename _Self>
+       constexpr auto&&
+       operator*(this _Self&& __self) noexcept
+       {
+ 	__glibcxx_assert(__self._M_objp != nullptr);
+ 	return std::forward_like<_Self>(*((_Self)__self)._M_objp);
+       }
+ 
+       constexpr const_pointer
+       operator->() const noexcept
+       {
+ 	// Do we want to enforce this? __glibcxx_assert(_M_objp != nullptr);
+ 	return _M_objp;
+       }
+ 
+       constexpr pointer
+       operator->() noexcept
+       {
+ 	// Do we want to enforce this? __glibcxx_assert(_M_objp != nullptr);
+ 	return _M_objp;
+       }
+ 
+       constexpr bool
+       valueless_after_move() const noexcept { return _M_objp == nullptr; }
+ 
+       constexpr allocator_type
+       get_allocator() const noexcept { return _M_alloc; }
+ 
+       constexpr void
+       swap(indirect& __other)
+       noexcept(_ATraits::propagate_on_container_swap::value
+ 		 || _ATraits::is_always_equal::value)
+       {
+ 	using std::swap;
+ 	swap(_M_objp, __other._M_objp);
+ 	if constexpr (_ATraits::propagate_on_container_swap::value)
+ 	  swap(_M_alloc, __other._M_alloc);
+ 	else if constexpr (!_ATraits::is_always_equal::value)
+ 	  __glibcxx_assert(_M_alloc == __other._M_alloc);
+       }
+ 
+       friend constexpr void
+       swap(indirect& __lhs, indirect& __rhs)
+       noexcept(_ATraits::propagate_on_container_swap::value
+ 		 || _ATraits::is_always_equal::value)
+       { __lhs.swap(__rhs); }
+ 
+       template<typename _Up, typename _Alloc2>
+ 	requires requires (const _Tp& __t, const _Up& __u) { __t == __u; }
+ 	friend constexpr bool
+ 	operator==(const indirect& __lhs, const indirect<_Up, _Alloc2>& __rhs)
+ 	noexcept(noexcept(*__lhs == *__rhs))
+ 	{
+ 	  if (!__lhs._M_objp || !__rhs._M_objp)
+ 	    return bool(__lhs._M_objp) == bool(__rhs._M_objp);
+ 	  else
+ 	    return __lhs.__get() == __rhs.__get();
+ 	}
+ 
+       template<typename _Up>
+ 	requires (!__is_indirect<_Up>) // See PR c++/99599
+ 	  && requires (const _Tp& __t, const _Up& __u) { __t == __u; }
+ 	friend constexpr bool
+ 	operator==(const indirect& __lhs, const _Up& __rhs)
+ 	noexcept(noexcept(*__lhs == __rhs))
+ 	{
+ 	  if (!__lhs._M_objp)
+ 	    return false;
+ 	  else
+ 	    return __lhs.__get() == __rhs;
+ 	}
+ 
+       template<typename _Up, typename _Alloc2>
+ 	friend constexpr __detail::__synth3way_t<_Tp, _Up>
+ 	operator<=>(const indirect& __lhs, const indirect<_Up, _Alloc2>& __rhs)
+ 	noexcept(noexcept(__detail::__synth3way(*__lhs, *__rhs)))
+ 	{
+ 	  if (!__lhs._M_objp || !__rhs._M_objp)
+ 	    return bool(__lhs._M_objp) <=> bool(__rhs._M_objp);
+ 	  else
+ 	    return __detail::__synth3way(__lhs.__get(), __rhs.__get());
+ 	}
+ 
+       template<typename _Up>
+ 	requires (!__is_indirect<_Up>) // See PR c++/99599
+ 	friend constexpr __detail::__synth3way_t<_Tp, _Up>
+ 	operator<=>(const indirect& __lhs, const _Up& __rhs)
+ 	noexcept(noexcept(__detail::__synth3way(*__lhs, __rhs)))
+ 	{
+ 	  if (!__lhs._M_objp)
+ 	    return strong_ordering::less;
+ 	  else
+ 	    return __detail::__synth3way(__lhs.__get(), __rhs);
+ 	}
+ 
+     private:
+       template<typename, typename> friend class indirect;
+ 
+       constexpr void
+       _M_reset(pointer __ptr) noexcept
+       {
+ 	if (_M_objp)
+ 	  {
+ 	    _ATraits::destroy(_M_alloc, std::to_address(_M_objp));
+ 	    _ATraits::deallocate(_M_alloc, _M_objp, 1);
+ 	  }
+ 	_M_objp = __ptr;
+       }
+ 
+       template<typename... _Args>
+ 	constexpr pointer
+ 	_M_make_obj(_Args&&... __args) const
+ 	{
+ 	  _Scoped_allocation __sa(_M_alloc, in_place,
+ 				  std::forward<_Args>(__args)...);
+ 	  return __sa.release();
+ 	}
+ 
+       // Enforces is_constructible check and then calls _M_make_obj.
+       template<typename... _Args>
+ 	[[__gnu__::__always_inline__]]
+ 	constexpr pointer
+ 	_M_make_obj_chk(_Args&&... __args) const
+ 	{
+ 	  static_assert(is_constructible_v<_Tp, _Args...>);
+ 	  return _M_make_obj(std::forward<_Args>(__args)...);
+ 	}
+ 
+       // Always-const accessor that avoids ADL for operator*.
+       // This can be preferable to using *_M_objp because that might give _Tp&.
+       // This can be preferable to using **this because that does ADL.
+       [[__gnu__::__always_inline__]]
+       constexpr const _Tp&
+       __get() const noexcept
+       { return *_M_objp; }
+ 
+       [[no_unique_address]] _Alloc _M_alloc = _Alloc();
+       pointer _M_objp; // Pointer to the owned object.
+     };
+ 
+   template<typename _Value>
+     indirect(_Value) -> indirect<_Value>;
+ 
+   template<typename _Alloc, typename _Value>
+     indirect(allocator_arg_t, _Alloc, _Value)
+       -> indirect<_Value, __alloc_rebind<_Alloc, _Value>>;
+ 
+   // [indirect.hash], hash support
+   template<typename _Tp, typename _Alloc>
+     requires is_default_constructible_v<hash<_Tp>>
+     struct hash<indirect<_Tp, _Alloc>>
+     {
+       constexpr size_t
+       operator()(const indirect<_Tp, _Alloc>& __t) const
+       noexcept(noexcept(hash<_Tp>{}(*__t)))
+       {
+ 	// We pick an arbitrary hash for valueless indirect objects
+ 	// which hopefully usual values of _Tp won't typically hash to.
+ 	if (__t.valueless_after_move())
+ 	  return -4444zu;
+ 	return hash<_Tp>{}(*__t);
+       }
+     };
+ 
+   template<typename _Tp, typename _Alloc>
+     struct __is_fast_hash<hash<indirect<_Tp, _Alloc>>>
+     : __is_fast_hash<hash<_Tp>>
+     { };
+ #endif // __glibcxx_indirect
+ 
+  _GLIBCXX_END_NAMESPACE_VERSION
+ } // namespace
+ #endif // C++26 __glibcxx_indirect || __glibcxx_polymorphic
+ 
+ #endif // _GLIBCXX_INDIRECT_H
diff -Nrcpad gcc-16-20250525/libstdc++-v3/include/bits/semaphore_base.h gcc-16-20250601/libstdc++-v3/include/bits/semaphore_base.h
*** gcc-16-20250525/libstdc++-v3/include/bits/semaphore_base.h	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libstdc++-v3/include/bits/semaphore_base.h	Sun Jun  1 22:32:41 2025
***************
*** 34,190 ****
  #pragma GCC system_header
  #endif
  
  #include <bits/atomic_base.h>
  #include <bits/chrono.h>
- #if __glibcxx_atomic_wait
  #include <bits/atomic_timed_wait.h>
  #include <ext/numeric_traits.h>
- #endif // __cpp_lib_atomic_wait
- 
- #ifdef _GLIBCXX_HAVE_POSIX_SEMAPHORE
- # include <cerrno>	// errno, EINTR, EAGAIN etc.
- # include <limits.h>	// SEM_VALUE_MAX
- # include <semaphore.h>	// sem_t, sem_init, sem_wait, sem_post etc.
- #elif defined(_GLIBCXX_USE_POSIX_SEMAPHORE)
- # warning "POSIX semaphore not available, ignoring _GLIBCXX_USE_POSIX_SEMAPHORE"
- # undef _GLIBCXX_USE_POSIX_SEMAPHORE
- #endif
  
  namespace std _GLIBCXX_VISIBILITY(default)
  {
  _GLIBCXX_BEGIN_NAMESPACE_VERSION
  
! #ifdef _GLIBCXX_HAVE_POSIX_SEMAPHORE
!   struct __platform_semaphore
    {
!     using __clock_t = chrono::system_clock;
! #ifdef SEM_VALUE_MAX
!     static constexpr ptrdiff_t _S_max = SEM_VALUE_MAX;
! #else
!     static constexpr ptrdiff_t _S_max = _POSIX_SEM_VALUE_MAX;
! #endif
! 
!     explicit __platform_semaphore(ptrdiff_t __count) noexcept
!     {
!       sem_init(&_M_semaphore, 0, __count);
!     }
! 
!     __platform_semaphore(const __platform_semaphore&) = delete;
!     __platform_semaphore& operator=(const __platform_semaphore&) = delete;
! 
!     ~__platform_semaphore()
!     { sem_destroy(&_M_semaphore); }
! 
!     _GLIBCXX_ALWAYS_INLINE void
!     _M_acquire() noexcept
!     {
!       while (sem_wait(&_M_semaphore))
! 	if (errno != EINTR)
! 	  std::__terminate();
!     }
! 
!     _GLIBCXX_ALWAYS_INLINE bool
!     _M_try_acquire() noexcept
!     {
!       while (sem_trywait(&_M_semaphore))
! 	{
! 	  if (errno == EAGAIN) // already locked
! 	    return false;
! 	  else if (errno != EINTR)
! 	    std::__terminate();
! 	  // else got EINTR so retry
! 	}
!       return true;
!     }
! 
!     _GLIBCXX_ALWAYS_INLINE void
!     _M_release(ptrdiff_t __update) noexcept
!     {
!       for(; __update != 0; --__update)
! 	if (sem_post(&_M_semaphore))
! 	  std::__terminate();
!     }
! 
!     bool
!     _M_try_acquire_until_impl(const chrono::time_point<__clock_t>& __atime)
!       noexcept
!     {
!       auto __s = chrono::time_point_cast<chrono::seconds>(__atime);
!       auto __ns = chrono::duration_cast<chrono::nanoseconds>(__atime - __s);
! 
!       struct timespec __ts =
!       {
! 	static_cast<std::time_t>(__s.time_since_epoch().count()),
! 	static_cast<long>(__ns.count())
!       };
! 
!       while (sem_timedwait(&_M_semaphore, &__ts))
! 	{
! 	  if (errno == ETIMEDOUT)
! 	    return false;
! 	  else if (errno != EINTR)
! 	    std::__terminate();
! 	}
!       return true;
!     }
! 
!     template<typename _Clock, typename _Duration>
!       bool
!       _M_try_acquire_until(const chrono::time_point<_Clock,
! 			   _Duration>& __atime) noexcept
!       {
! 	if constexpr (std::is_same_v<__clock_t, _Clock>)
! 	  {
! 	    using _Dur = __clock_t::duration;
! 	    return _M_try_acquire_until_impl(chrono::ceil<_Dur>(__atime));
! 	  }
! 	else
! 	  {
! 	    // TODO: if _Clock is monotonic_clock we could use
! 	    // sem_clockwait with CLOCK_MONOTONIC.
! 
! 	    const typename _Clock::time_point __c_entry = _Clock::now();
! 	    const auto __s_entry = __clock_t::now();
! 	    const auto __delta = __atime - __c_entry;
! 	    const auto __s_atime = __s_entry + __delta;
! 	    if (_M_try_acquire_until_impl(__s_atime))
! 	      return true;
  
! 	    // We got a timeout when measured against __clock_t but
! 	    // we need to check against the caller-supplied clock
! 	    // to tell whether we should return a timeout.
! 	    return (_Clock::now() < __atime);
! 	  }
!       }
  
!     template<typename _Rep, typename _Period>
!       _GLIBCXX_ALWAYS_INLINE bool
!       _M_try_acquire_for(const chrono::duration<_Rep, _Period>& __rtime)
! 	noexcept
!       { return _M_try_acquire_until(__clock_t::now() + __rtime); }
  
!   private:
!     sem_t _M_semaphore;
!   };
! #endif // _GLIBCXX_HAVE_POSIX_SEMAPHORE
  
! #if __glibcxx_atomic_wait
!   struct __atomic_semaphore
!   {
!     static constexpr ptrdiff_t _S_max = __gnu_cxx::__int_traits<int>::__max;
!     explicit __atomic_semaphore(__detail::__platform_wait_t __count) noexcept
!       : _M_counter(__count)
      {
!       __glibcxx_assert(__count >= 0 && __count <= _S_max);
      }
  
-     __atomic_semaphore(const __atomic_semaphore&) = delete;
-     __atomic_semaphore& operator=(const __atomic_semaphore&) = delete;
- 
      static _GLIBCXX_ALWAYS_INLINE bool
!     _S_do_try_acquire(__detail::__platform_wait_t* __counter) noexcept
      {
-       auto __old = __atomic_impl::load(__counter, memory_order::acquire);
        if (__old == 0)
  	return false;
  
--- 34,78 ----
  #pragma GCC system_header
  #endif
  
+ #include <bits/version.h>
+ 
+ #ifdef __glibcxx_semaphore // C++ >= 20 && hosted && atomic_wait
  #include <bits/atomic_base.h>
  #include <bits/chrono.h>
  #include <bits/atomic_timed_wait.h>
  #include <ext/numeric_traits.h>
  
  namespace std _GLIBCXX_VISIBILITY(default)
  {
  _GLIBCXX_BEGIN_NAMESPACE_VERSION
  
!   template<bool _Platform_wait>
!   struct __semaphore_base
    {
!     using __count_type = __conditional_t<_Platform_wait,
! 					 __detail::__platform_wait_t,
! 					 ptrdiff_t>;
  
!     static constexpr ptrdiff_t _S_max
!       = __gnu_cxx::__int_traits<__count_type>::__max;
  
!     constexpr explicit
!     __semaphore_base(__count_type __count) noexcept
!     : _M_counter(__count)
!     { }
  
!     __semaphore_base(const __semaphore_base&) = delete;
!     __semaphore_base& operator=(const __semaphore_base&) = delete;
  
!     static _GLIBCXX_ALWAYS_INLINE __count_type
!     _S_get_current(__count_type* __counter) noexcept
      {
!       return __atomic_impl::load(__counter, memory_order::acquire);
      }
  
      static _GLIBCXX_ALWAYS_INLINE bool
!     _S_do_try_acquire(__count_type* __counter, __count_type __old) noexcept
      {
        if (__old == 0)
  	return false;
  
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 197,264 ****
      _GLIBCXX_ALWAYS_INLINE void
      _M_acquire() noexcept
      {
!       auto const __pred =
! 	[this] { return _S_do_try_acquire(&this->_M_counter); };
!       std::__atomic_wait_address_bare(&_M_counter, __pred);
      }
  
      bool
      _M_try_acquire() noexcept
      {
!       auto const __pred =
! 	[this] { return _S_do_try_acquire(&this->_M_counter); };
!       return std::__detail::__atomic_spin(__pred);
      }
  
      template<typename _Clock, typename _Duration>
        _GLIBCXX_ALWAYS_INLINE bool
!       _M_try_acquire_until(const chrono::time_point<_Clock,
! 			   _Duration>& __atime) noexcept
        {
! 	auto const __pred =
! 	  [this] { return _S_do_try_acquire(&this->_M_counter); };
! 
! 	return __atomic_wait_address_until_bare(&_M_counter, __pred, __atime);
        }
  
      template<typename _Rep, typename _Period>
        _GLIBCXX_ALWAYS_INLINE bool
!       _M_try_acquire_for(const chrono::duration<_Rep, _Period>& __rtime)
! 	noexcept
        {
! 	auto const __pred =
! 	  [this] { return _S_do_try_acquire(&this->_M_counter); };
! 
! 	return __atomic_wait_address_for_bare(&_M_counter, __pred, __rtime);
        }
  
!     _GLIBCXX_ALWAYS_INLINE void
      _M_release(ptrdiff_t __update) noexcept
      {
!       if (0 < __atomic_impl::fetch_add(&_M_counter, __update, memory_order_release))
! 	return;
!       if (__update > 1)
! 	__atomic_notify_address_bare(&_M_counter, true);
!       else
! 	__atomic_notify_address_bare(&_M_counter, true);
! // FIXME - Figure out why this does not wake a waiting thread
! //	__atomic_notify_address_bare(&_M_counter, false);
      }
  
    private:
!     alignas(__detail::__platform_wait_alignment)
!     __detail::__platform_wait_t _M_counter;
    };
- #endif // __cpp_lib_atomic_wait
  
! // Note: the _GLIBCXX_USE_POSIX_SEMAPHORE macro can be used to force the
! // use of Posix semaphores (sem_t). Doing so however, alters the ABI.
! #if defined __glibcxx_atomic_wait && !_GLIBCXX_USE_POSIX_SEMAPHORE
!   using __semaphore_impl = __atomic_semaphore;
! #elif _GLIBCXX_HAVE_POSIX_SEMAPHORE
!   using __semaphore_impl = __platform_semaphore;
! #endif
  
  _GLIBCXX_END_NAMESPACE_VERSION
  } // namespace std
  #endif // _GLIBCXX_SEMAPHORE_BASE_H
--- 85,155 ----
      _GLIBCXX_ALWAYS_INLINE void
      _M_acquire() noexcept
      {
!       auto const __vfn = [this]{ return _S_get_current(&this->_M_counter); };
!       auto const __pred = [this](__count_type __cur) {
! 	return _S_do_try_acquire(&this->_M_counter, __cur);
!       };
!       std::__atomic_wait_address(&_M_counter, __pred, __vfn, true);
      }
  
      bool
      _M_try_acquire() noexcept
      {
!       auto const __vfn = [this]{ return _S_get_current(&this->_M_counter); };
!       auto const __pred = [this](__count_type __cur) {
! 	return _S_do_try_acquire(&this->_M_counter, __cur);
!       };
!       using __detail::__wait_clock_t;
!       return std::__atomic_wait_address_for(&_M_counter, __pred, __vfn,
! 					    __wait_clock_t::duration(),
! 					    true);
      }
  
      template<typename _Clock, typename _Duration>
        _GLIBCXX_ALWAYS_INLINE bool
!       _M_try_acquire_until(const chrono::time_point<_Clock, _Duration>& __atime) noexcept
        {
! 	auto const __vfn = [this]{ return _S_get_current(&this->_M_counter); };
! 	auto const __pred = [this](__count_type __cur) {
! 	  return _S_do_try_acquire(&this->_M_counter, __cur);
! 	};
! 	return std::__atomic_wait_address_until(&_M_counter, __pred, __vfn,
! 						__atime, true);
        }
  
      template<typename _Rep, typename _Period>
        _GLIBCXX_ALWAYS_INLINE bool
!       _M_try_acquire_for(const chrono::duration<_Rep, _Period>& __rtime) noexcept
        {
! 	auto const __vfn = [this]{ return _S_get_current(&this->_M_counter); };
! 	auto const __pred = [this](__count_type __cur) {
! 	  return _S_do_try_acquire(&this->_M_counter, __cur);
! 	};
! 	return std::__atomic_wait_address_for(&_M_counter, __pred, __vfn,
! 					      __rtime, true);
        }
  
!     _GLIBCXX_ALWAYS_INLINE ptrdiff_t
      _M_release(ptrdiff_t __update) noexcept
      {
!       auto __old = __atomic_impl::fetch_add(&_M_counter, __update,
! 					    memory_order::release);
!       if (__old == 0 && __update > 0)
! 	__atomic_notify_address(&_M_counter, true, true);
!       return __old;
      }
  
    private:
!     alignas(_Platform_wait ? __detail::__platform_wait_alignment
! 			   : __alignof__(__count_type))
!     __count_type _M_counter;
    };
  
!   template<ptrdiff_t _Max>
!     using __semaphore_impl
!       = __semaphore_base<(_Max <= __semaphore_base<true>::_S_max)>;
  
  _GLIBCXX_END_NAMESPACE_VERSION
  } // namespace std
+ #endif // __glibcxx_semaphore
  #endif // _GLIBCXX_SEMAPHORE_BASE_H
diff -Nrcpad gcc-16-20250525/libstdc++-v3/include/bits/std_abs.h gcc-16-20250601/libstdc++-v3/include/bits/std_abs.h
*** gcc-16-20250525/libstdc++-v3/include/bits/std_abs.h	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libstdc++-v3/include/bits/std_abs.h	Sun Jun  1 22:32:41 2025
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 103,108 ****
--- 103,115 ----
    abs(__GLIBCXX_TYPE_INT_N_3 __x) { return __x >= 0 ? __x : -__x; }
  #endif
  
+ #if defined __STRICT_ANSI__ && defined __SIZEOF_INT128__
+   // In strict modes __GLIBCXX_TYPE_INT_N_0 is not defined for __int128,
+   // but we want to always define std::abs(__int128).
+   __extension__ inline _GLIBCXX_CONSTEXPR __int128
+   abs(__int128 __x) { return __x >= 0 ? __x : -__x; }
+ #endif
+ 
  #if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
    constexpr _Float16
    abs(_Float16 __x)
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 137,143 ****
    { return __gnu_cxx::__bfloat16_t(__builtin_fabsf(__x)); }
  #endif
  
! #if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
    __extension__ inline _GLIBCXX_CONSTEXPR
    __float128
    abs(__float128 __x)
--- 144,150 ----
    { return __gnu_cxx::__bfloat16_t(__builtin_fabsf(__x)); }
  #endif
  
! #if defined(_GLIBCXX_USE_FLOAT128)
    __extension__ inline _GLIBCXX_CONSTEXPR
    __float128
    abs(__float128 __x)
diff -Nrcpad gcc-16-20250525/libstdc++-v3/include/bits/utility.h gcc-16-20250601/libstdc++-v3/include/bits/utility.h
*** gcc-16-20250525/libstdc++-v3/include/bits/utility.h	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libstdc++-v3/include/bits/utility.h	Sun Jun  1 22:32:41 2025
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 316,321 ****
--- 316,338 ----
    inline constexpr sorted_equivalent_t sorted_equivalent{};
  #endif
  
+ #if __glibcxx_function_ref // >= C++26
+   template<auto>
+     struct nontype_t
+     {
+       explicit nontype_t() = default;
+     };
+ 
+   template<auto __val>
+     constexpr nontype_t<__val> nontype{};
+ 
+   template<typename>
+     inline constexpr bool __is_nontype_v = false;
+ 
+   template<auto __val>
+     inline constexpr bool __is_nontype_v<nontype_t<__val>> = true;
+ #endif
+ 
  _GLIBCXX_END_NAMESPACE_VERSION
  } // namespace
  
diff -Nrcpad gcc-16-20250525/libstdc++-v3/include/bits/version.def gcc-16-20250601/libstdc++-v3/include/bits/version.def
*** gcc-16-20250525/libstdc++-v3/include/bits/version.def	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libstdc++-v3/include/bits/version.def	Sun Jun  1 22:32:41 2025
*************** ftms = {
*** 1363,1369 ****
      v = 201907;
      cxxmin = 20;
      hosted = yes;
!     extra_cond = "__glibcxx_atomic_wait || _GLIBCXX_HAVE_POSIX_SEMAPHORE";
    };
  };
  
--- 1363,1369 ----
      v = 201907;
      cxxmin = 20;
      hosted = yes;
!     extra_cond = "__glibcxx_atomic_wait";
    };
  };
  
*************** ftms = {
*** 1757,1762 ****
--- 1757,1770 ----
  };
  
  ftms = {
+   name = function_ref;
+   values = {
+     v = 202306;
+     cxxmin = 26;
+   };
+ };
+ 
+ ftms = {
    name = out_ptr;
    values = {
      v = 202311;
*************** ftms = {
*** 1961,1966 ****
--- 1969,1983 ----
    };
  };
  
+ ftms = {
+   name = indirect;
+   values = {
+     v = 202502;
+     cxxmin = 26;
+     hosted = yes;
+   };
+ };
+ 
  // Standard test specifications.
  stds[97] = ">= 199711L";
  stds[03] = ">= 199711L";
diff -Nrcpad gcc-16-20250525/libstdc++-v3/include/bits/version.h gcc-16-20250601/libstdc++-v3/include/bits/version.h
*** gcc-16-20250525/libstdc++-v3/include/bits/version.h	Sun May 25 22:32:16 2025
--- gcc-16-20250601/libstdc++-v3/include/bits/version.h	Sun Jun  1 22:32:41 2025
***************
*** 1499,1505 ****
  #undef __glibcxx_want_move_iterator_concept
  
  #if !defined(__cpp_lib_semaphore)
! # if (__cplusplus >= 202002L) && _GLIBCXX_HOSTED && (__glibcxx_atomic_wait || _GLIBCXX_HAVE_POSIX_SEMAPHORE)
  #  define __glibcxx_semaphore 201907L
  #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_semaphore)
  #   define __cpp_lib_semaphore 201907L
--- 1499,1505 ----
  #undef __glibcxx_want_move_iterator_concept
  
  #if !defined(__cpp_lib_semaphore)
! # if (__cplusplus >= 202002L) && _GLIBCXX_HOSTED && (__glibcxx_atomic_wait)
  #  define __glibcxx_semaphore 201907L
  #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_semaphore)
  #   define __cpp_lib_semaphore 201907L
***************
*** 1958,1963 ****
--- 1958,1973 ----
  #endif /* !defined(__cpp_lib_copyable_function) && defined(__glibcxx_want_copyable_function) */
  #undef __glibcxx_want_copyable_function
  
+ #if !defined(__cpp_lib_function_ref)
+ # if (__cplusplus >  202302L)
+ #  define __glibcxx_function_ref 202306L
+ #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_function_ref)
+ #   define __cpp_lib_function_ref 202306L
+ #  endif
+ # endif
+ #endif /* !defined(__cpp_lib_function_ref) && defined(__glibcxx_want_function_ref) */
+ #undef __glibcxx_want_function_ref
+ 
  #if !defined(__cpp_lib_out_ptr)
  # if (__cplusplus >= 202100L)
  #  define __glibcxx_out_ptr 202311L
***************
*** 2193,2196 ****
--- 2203,2216 ----
  #endif /* !defined(__cpp_lib_modules) && defined(__glibcxx_want_modules) */
  #undef __glibcxx_want_modules
  
+ #if !defined(__cpp_lib_indirect)
+ # if (__cplusplus >  202302L) && _GLIBCXX_HOSTED
+ #  define __glibcxx_indirect 202502L
+ #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_indirect)
+ #   define __cpp_lib_indirect 202502L
+ #  endif
+ # endif
+ #endif /* !defined(__cpp_lib_indirect) && defined(__glibcxx_want_indirect) */
+ #undef __glibcxx_want_indirect
+ 
  #undef __glibcxx_want_all
diff -Nrcpad gcc-16-20250525/libstdc++-v3/include/std/barrier gcc-16-20250601/libstdc++-v3/include/std/barrier
*** gcc-16-20250525/libstdc++-v3/include/std/barrier	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/include/std/barrier	Sun Jun  1 22:32:41 2025
*************** It looks different from literature pseud
*** 81,185 ****
  
    enum class __barrier_phase_t : unsigned char { };
  
!   template<typename _CompletionF>
!     class __tree_barrier
      {
!       using __atomic_phase_ref_t = std::__atomic_ref<__barrier_phase_t>;
!       using __atomic_phase_const_ref_t = std::__atomic_ref<const __barrier_phase_t>;
!       static constexpr auto __phase_alignment =
! 		      __atomic_phase_ref_t::required_alignment;
  
!       using __tickets_t = std::array<__barrier_phase_t, 64>;
!       struct alignas(64) /* naturally-align the heap state */ __state_t
!       {
! 	alignas(__phase_alignment) __tickets_t __tickets;
!       };
  
!       ptrdiff_t _M_expected;
!       unique_ptr<__state_t[]> _M_state;
!       __atomic_base<ptrdiff_t> _M_expected_adjustment;
!       _CompletionF _M_completion;
  
!       alignas(__phase_alignment) __barrier_phase_t  _M_phase;
  
!       bool
!       _M_arrive(__barrier_phase_t __old_phase, size_t __current)
!       {
! 	const auto __old_phase_val = static_cast<unsigned char>(__old_phase);
! 	const auto __half_step =
! 			   static_cast<__barrier_phase_t>(__old_phase_val + 1);
! 	const auto __full_step =
! 			   static_cast<__barrier_phase_t>(__old_phase_val + 2);
  
! 	size_t __current_expected = _M_expected;
! 	__current %= ((_M_expected + 1) >> 1);
  
! 	for (int __round = 0; ; ++__round)
! 	  {
! 	    if (__current_expected <= 1)
! 		return true;
! 	    size_t const __end_node = ((__current_expected + 1) >> 1),
! 			 __last_node = __end_node - 1;
! 	    for ( ; ; ++__current)
! 	      {
! 		if (__current == __end_node)
! 		  __current = 0;
! 		auto __expect = __old_phase;
! 		__atomic_phase_ref_t __phase(_M_state[__current]
! 						.__tickets[__round]);
! 		if (__current == __last_node && (__current_expected & 1))
! 		  {
! 		    if (__phase.compare_exchange_strong(__expect, __full_step,
! 						        memory_order_acq_rel))
! 		      break;     // I'm 1 in 1, go to next __round
! 		  }
! 		else if (__phase.compare_exchange_strong(__expect, __half_step,
! 						         memory_order_acq_rel))
! 		  {
! 		    return false; // I'm 1 in 2, done with arrival
! 		  }
! 		else if (__expect == __half_step)
! 		  {
! 		    if (__phase.compare_exchange_strong(__expect, __full_step,
! 						        memory_order_acq_rel))
! 		      break;    // I'm 2 in 2, go to next __round
! 		  }
! 	      }
! 	    __current_expected = __last_node + 1;
! 	    __current >>= 1;
! 	  }
!       }
  
      public:
        using arrival_token = __barrier_phase_t;
  
!       static constexpr ptrdiff_t
!       max() noexcept
!       { return __PTRDIFF_MAX__; }
! 
        __tree_barrier(ptrdiff_t __expected, _CompletionF __completion)
! 	  : _M_expected(__expected), _M_expected_adjustment(0),
! 	    _M_completion(move(__completion)),
! 	    _M_phase(static_cast<__barrier_phase_t>(0))
!       {
! 	size_t const __count = (_M_expected + 1) >> 1;
! 
! 	_M_state = std::make_unique<__state_t[]>(__count);
!       }
  
        [[nodiscard]] arrival_token
        arrive(ptrdiff_t __update)
        {
  	std::hash<std::thread::id> __hasher;
  	size_t __current = __hasher(std::this_thread::get_id());
  	__atomic_phase_ref_t __phase(_M_phase);
  	const auto __old_phase = __phase.load(memory_order_relaxed);
  	const auto __cur = static_cast<unsigned char>(__old_phase);
! 	for(; __update; --__update)
  	  {
! 	    if(_M_arrive(__old_phase, __current))
  	      {
! 		_M_completion();
  		_M_expected += _M_expected_adjustment.load(memory_order_relaxed);
  		_M_expected_adjustment.store(0, memory_order_relaxed);
  		auto __new_phase = static_cast<__barrier_phase_t>(__cur + 2);
--- 81,222 ----
  
    enum class __barrier_phase_t : unsigned char { };
  
!   struct __tree_barrier_base
!   {
!     static constexpr ptrdiff_t
!     max() noexcept
!     { return __PTRDIFF_MAX__ - 1; }
! 
!   protected:
!     using __atomic_phase_ref_t = std::__atomic_ref<__barrier_phase_t>;
!     using __atomic_phase_const_ref_t = std::__atomic_ref<const __barrier_phase_t>;
!     static constexpr auto __phase_alignment =
! 		    __atomic_phase_ref_t::required_alignment;
! 
!     using __tickets_t = std::array<__barrier_phase_t, 64>;
!     struct alignas(64) /* naturally-align the heap state */ __state_t
      {
!       alignas(__phase_alignment) __tickets_t __tickets;
!     };
  
!     ptrdiff_t _M_expected;
!     __atomic_base<__state_t*> _M_state{nullptr};
!     __atomic_base<ptrdiff_t> _M_expected_adjustment{0};
!     alignas(__phase_alignment) __barrier_phase_t  _M_phase{};
  
!     explicit constexpr
!     __tree_barrier_base(ptrdiff_t __expected)
!     : _M_expected(__expected)
!     {
!       __glibcxx_assert(__expected >= 0 && __expected <= max());
  
!       if (!std::is_constant_evaluated())
! 	_M_state.store(_M_alloc_state().release(), memory_order_release);
!     }
  
!     unique_ptr<__state_t[]>
!     _M_alloc_state()
!     {
!       size_t const __count = (_M_expected + 1) >> 1;
!       return std::make_unique<__state_t[]>(__count);
!     }
  
!     bool
!     _M_arrive(__barrier_phase_t __old_phase, size_t __current)
!     {
!       const auto __old_phase_val = static_cast<unsigned char>(__old_phase);
!       const auto __half_step =
! 			 static_cast<__barrier_phase_t>(__old_phase_val + 1);
!       const auto __full_step =
! 			 static_cast<__barrier_phase_t>(__old_phase_val + 2);
  
!       size_t __current_expected = _M_expected;
!       __current %= ((_M_expected + 1) >> 1);
! 
!       __state_t* const __state = _M_state.load(memory_order_relaxed);
! 
!       for (int __round = 0; ; ++__round)
! 	{
! 	  if (__current_expected <= 1)
! 	      return true;
! 	  size_t const __end_node = ((__current_expected + 1) >> 1),
! 		       __last_node = __end_node - 1;
! 	  for ( ; ; ++__current)
! 	    {
! 	      if (__current == __end_node)
! 		__current = 0;
! 	      auto __expect = __old_phase;
! 	      __atomic_phase_ref_t __phase(__state[__current]
! 					      .__tickets[__round]);
! 	      if (__current == __last_node && (__current_expected & 1))
! 		{
! 		  if (__phase.compare_exchange_strong(__expect, __full_step,
! 						      memory_order_acq_rel))
! 		    break;     // I'm 1 in 1, go to next __round
! 		}
! 	      else if (__phase.compare_exchange_strong(__expect, __half_step,
! 						       memory_order_acq_rel))
! 		{
! 		  return false; // I'm 1 in 2, done with arrival
! 		}
! 	      else if (__expect == __half_step)
! 		{
! 		  if (__phase.compare_exchange_strong(__expect, __full_step,
! 						      memory_order_acq_rel))
! 		    break;    // I'm 2 in 2, go to next __round
! 		}
! 	    }
! 	  __current_expected = __last_node + 1;
! 	  __current >>= 1;
! 	}
!     }
!   };
! 
!   template<typename _CompletionF>
!     class __tree_barrier : public __tree_barrier_base
!     {
!       [[no_unique_address]] _CompletionF _M_completion;
! 
!       // _GLIBCXX_RESOLVE_LIB_DEFECTS
!       // 3898. Possibly unintended preconditions for completion functions
!       void _M_invoke_completion() noexcept { _M_completion(); }
  
      public:
        using arrival_token = __barrier_phase_t;
  
!       constexpr
        __tree_barrier(ptrdiff_t __expected, _CompletionF __completion)
!       : __tree_barrier_base(__expected), _M_completion(std::move(__completion))
!       { }
  
        [[nodiscard]] arrival_token
        arrive(ptrdiff_t __update)
        {
+ 	__glibcxx_assert(__update > 0);
+ 	// FIXME: Check that update is less than or equal to the expected count
+ 	// for the current barrier phase.
+ 
  	std::hash<std::thread::id> __hasher;
  	size_t __current = __hasher(std::this_thread::get_id());
  	__atomic_phase_ref_t __phase(_M_phase);
  	const auto __old_phase = __phase.load(memory_order_relaxed);
  	const auto __cur = static_cast<unsigned char>(__old_phase);
! 
! 	if (__cur == 0 && !_M_state.load(memory_order_relaxed)) [[unlikely]]
  	  {
! 	    auto __p = _M_alloc_state();
! 	    __state_t* __val = nullptr;
! 	    if (_M_state.compare_exchange_strong(__val, __p.get(),
! 						 memory_order_seq_cst,
! 						 memory_order_acquire))
! 	      __p.release();
! 	  }
! 
! 	for (; __update; --__update)
! 	  {
! 	    if (_M_arrive(__old_phase, __current))
  	      {
! 		_M_invoke_completion();
  		_M_expected += _M_expected_adjustment.load(memory_order_relaxed);
  		_M_expected_adjustment.store(0, memory_order_relaxed);
  		auto __new_phase = static_cast<__barrier_phase_t>(__cur + 2);
*************** It looks different from literature pseud
*** 194,204 ****
        wait(arrival_token&& __old_phase) const
        {
  	__atomic_phase_const_ref_t __phase(_M_phase);
! 	auto const __test_fn = [=]
! 	  {
! 	    return __phase.load(memory_order_acquire) != __old_phase;
! 	  };
! 	std::__atomic_wait_address(&_M_phase, __test_fn);
        }
  
        void
--- 231,237 ----
        wait(arrival_token&& __old_phase) const
        {
  	__atomic_phase_const_ref_t __phase(_M_phase);
! 	__phase.wait(__old_phase, memory_order_acquire);
        }
  
        void
*************** It looks different from literature pseud
*** 212,217 ****
--- 245,252 ----
    template<typename _CompletionF = __empty_completion>
      class barrier
      {
+       static_assert(is_invocable_v<_CompletionF&>);
+ 
        // Note, we may introduce a "central" barrier algorithm at some point
        // for more space constrained targets
        using __algorithm_t = __tree_barrier<_CompletionF>;
*************** It looks different from literature pseud
*** 236,242 ****
        max() noexcept
        { return __algorithm_t::max(); }
  
!       explicit
        barrier(ptrdiff_t __count, _CompletionF __completion = _CompletionF())
        : _M_b(__count, std::move(__completion))
        { }
--- 271,277 ----
        max() noexcept
        { return __algorithm_t::max(); }
  
!       constexpr explicit
        barrier(ptrdiff_t __count, _CompletionF __completion = _CompletionF())
        : _M_b(__count, std::move(__completion))
        { }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/include/std/flat_map gcc-16-20250601/libstdc++-v3/include/std/flat_map
*** gcc-16-20250525/libstdc++-v3/include/std/flat_map	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/include/std/flat_map	Sun Jun  1 22:32:41 2025
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 873,879 ****
        [[nodiscard]]
        friend bool
        operator==(const _Derived& __x, const _Derived& __y)
!       { return std::equal(__x.begin(), __x.end(), __y.begin(), __y.end()); }
  
        template<typename _Up = value_type>
  	[[nodiscard]]
--- 873,882 ----
        [[nodiscard]]
        friend bool
        operator==(const _Derived& __x, const _Derived& __y)
!       {
! 	return __x._M_cont.keys == __y._M_cont.keys
! 	  && __x._M_cont.values == __y._M_cont.values;
!       }
  
        template<typename _Up = value_type>
  	[[nodiscard]]
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 895,901 ****
  	{
  	  auto __guard = _M_make_clear_guard();
  	  auto __zv = views::zip(_M_cont.keys, _M_cont.values);
! 	  auto __sr = ranges::remove_if(__zv, __pred);
  	  auto __erased = __sr.size();
  	  erase(end() - __erased, end());
  	  __guard._M_disable();
--- 898,907 ----
  	{
  	  auto __guard = _M_make_clear_guard();
  	  auto __zv = views::zip(_M_cont.keys, _M_cont.values);
! 	  auto __sr = ranges::remove_if(__zv, __pred,
! 					[](const auto& __e) {
! 					  return const_reference(__e);
! 					});
  	  auto __erased = __sr.size();
  	  erase(end() - __erased, end());
  	  __guard._M_disable();
diff -Nrcpad gcc-16-20250525/libstdc++-v3/include/std/functional gcc-16-20250601/libstdc++-v3/include/std/functional
*** gcc-16-20250525/libstdc++-v3/include/std/functional	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/include/std/functional	Sun Jun  1 22:32:41 2025
***************
*** 57,62 ****
--- 57,63 ----
  #define __glibcxx_want_bind_back
  #define __glibcxx_want_constexpr_functional
  #define __glibcxx_want_copyable_function
+ #define __glibcxx_want_function_ref
  #define __glibcxx_want_invoke
  #define __glibcxx_want_invoke_r
  #define __glibcxx_want_move_only_function
***************
*** 86,92 ****
  # include <bits/ranges_cmp.h> // std::identity, ranges::equal_to etc.
  # include <compare>
  #endif
! #if defined(__glibcxx_move_only_function) || defined(__glibcxx_copyable_function)
  # include <bits/funcwrap.h>
  #endif
  
--- 87,93 ----
  # include <bits/ranges_cmp.h> // std::identity, ranges::equal_to etc.
  # include <compare>
  #endif
! #if __glibcxx_move_only_function || __glibcxx_copyable_function || __glibcxx_function_ref
  # include <bits/funcwrap.h>
  #endif
  
diff -Nrcpad gcc-16-20250525/libstdc++-v3/include/std/latch gcc-16-20250601/libstdc++-v3/include/std/latch
*** gcc-16-20250525/libstdc++-v3/include/std/latch	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/include/std/latch	Sun Jun  1 22:32:41 2025
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 89,103 ****
      _GLIBCXX_ALWAYS_INLINE void
      wait() const noexcept
      {
!       auto const __pred = [this] { return this->try_wait(); };
!       std::__atomic_wait_address(&_M_counter, __pred);
      }
  
      _GLIBCXX_ALWAYS_INLINE void
      arrive_and_wait(ptrdiff_t __update = 1) noexcept
      {
!       count_down(__update);
!       wait();
      }
  
    private:
--- 89,121 ----
      _GLIBCXX_ALWAYS_INLINE void
      wait() const noexcept
      {
!       auto const __vfn = [this] {
! 	return __atomic_impl::load(&_M_counter, memory_order::acquire);
!       };
!       auto const __pred = [](__detail::__platform_wait_t __v) {
! 	return __v == 0;
!       };
!       std::__atomic_wait_address(&_M_counter, __pred, __vfn);
      }
  
      _GLIBCXX_ALWAYS_INLINE void
      arrive_and_wait(ptrdiff_t __update = 1) noexcept
      {
!       // The standard specifies this functions as count_down(update); wait();
!       // but we combine those two calls into one and avoid the wait() if we
!       // know the counter reached zero.
! 
!       __glibcxx_assert(__update >= 0 && __update <= max());
!       // Use acq_rel here because an omitted wait() would have used acquire:
!       auto const __old = __atomic_impl::fetch_sub(&_M_counter, __update,
! 						  memory_order::acq_rel);
!       if (std::cmp_equal(__old, __update))
! 	__atomic_impl::notify_all(&_M_counter);
!       else
! 	{
! 	  __glibcxx_assert(std::cmp_less(__update, __old));
! 	  wait();
! 	}
      }
  
    private:
diff -Nrcpad gcc-16-20250525/libstdc++-v3/include/std/mdspan gcc-16-20250601/libstdc++-v3/include/std/mdspan
*** gcc-16-20250525/libstdc++-v3/include/std/mdspan	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/include/std/mdspan	Sun Jun  1 22:32:41 2025
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 146,152 ****
  
        private:
  	using _S_storage = __array_traits<_IndexType, _S_rank_dynamic>::_Type;
! 	[[no_unique_address]] _S_storage _M_dynamic_extents;
        };
  
      template<typename _OIndexType, typename _SIndexType>
--- 146,152 ----
  
        private:
  	using _S_storage = __array_traits<_IndexType, _S_rank_dynamic>::_Type;
! 	[[no_unique_address]] _S_storage _M_dynamic_extents{};
        };
  
      template<typename _OIndexType, typename _SIndexType>
diff -Nrcpad gcc-16-20250525/libstdc++-v3/include/std/memory gcc-16-20250601/libstdc++-v3/include/std/memory
*** gcc-16-20250525/libstdc++-v3/include/std/memory	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/include/std/memory	Sun Jun  1 22:32:41 2025
***************
*** 97,102 ****
--- 97,106 ----
  #  include <bits/out_ptr.h>
  #endif
  
+ #if __cplusplus > 202302L
+ #  include <bits/indirect.h>
+ #endif
+ 
  #define __glibcxx_want_addressof_constexpr
  #define __glibcxx_want_allocator_traits_is_always_equal
  #define __glibcxx_want_assume_aligned
***************
*** 105,110 ****
--- 109,115 ----
  #define __glibcxx_want_constexpr_dynamic_alloc
  #define __glibcxx_want_constexpr_memory
  #define __glibcxx_want_enable_shared_from_this
+ #define __glibcxx_want_indirect
  #define __glibcxx_want_make_unique
  #define __glibcxx_want_out_ptr
  #define __glibcxx_want_parallel_algorithm
diff -Nrcpad gcc-16-20250525/libstdc++-v3/include/std/semaphore gcc-16-20250601/libstdc++-v3/include/std/semaphore
*** gcc-16-20250525/libstdc++-v3/include/std/semaphore	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/include/std/semaphore	Sun Jun  1 22:32:41 2025
***************
*** 35,63 ****
  
  #include <bits/requires_hosted.h> // concurrency
  
- #if __cplusplus > 201703L
- #include <bits/semaphore_base.h>
- 
  #define __glibcxx_want_semaphore
  #include <bits/version.h>
  
! #ifdef __cpp_lib_semaphore // C++ >= 20 && hosted && (atomic_wait || posix_sem)
  namespace std _GLIBCXX_VISIBILITY(default)
  {
  _GLIBCXX_BEGIN_NAMESPACE_VERSION
  
!   template<ptrdiff_t __least_max_value = __semaphore_impl::_S_max>
      class counting_semaphore
      {
        static_assert(__least_max_value >= 0);
-       static_assert(__least_max_value <= __semaphore_impl::_S_max);
  
!       __semaphore_impl _M_sem;
  
      public:
!       explicit counting_semaphore(ptrdiff_t __desired) noexcept
! 	: _M_sem(__desired)
!       { }
  
        ~counting_semaphore() = default;
  
--- 35,63 ----
  
  #include <bits/requires_hosted.h> // concurrency
  
  #define __glibcxx_want_semaphore
  #include <bits/version.h>
  
! #ifdef __cpp_lib_semaphore // C++ >= 20 && hosted && atomic_wait
! #include <bits/semaphore_base.h>
! 
  namespace std _GLIBCXX_VISIBILITY(default)
  {
  _GLIBCXX_BEGIN_NAMESPACE_VERSION
  
!   template<ptrdiff_t __least_max_value = __semaphore_base<true>::_S_max>
      class counting_semaphore
      {
        static_assert(__least_max_value >= 0);
  
!       using _Impl = __semaphore_impl<__least_max_value>;
!       _Impl _M_sem;
  
      public:
!       constexpr explicit
!       counting_semaphore(ptrdiff_t __desired) noexcept
!       : _M_sem(__desired)
!       { __glibcxx_assert(__desired >= 0 && __desired <= max()); }
  
        ~counting_semaphore() = default;
  
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 69,76 ****
        { return __least_max_value; }
  
        void
!       release(ptrdiff_t __update = 1) noexcept(noexcept(_M_sem._M_release(1)))
!       { _M_sem._M_release(__update); }
  
        void
        acquire() noexcept(noexcept(_M_sem._M_acquire()))
--- 69,79 ----
        { return __least_max_value; }
  
        void
!       release(ptrdiff_t __update = 1) noexcept
!       {
! 	[[maybe_unused]] ptrdiff_t __old = _M_sem._M_release(__update);
! 	__glibcxx_assert(__update >= 0 && __update <= max() - __old);
!       }
  
        void
        acquire() noexcept(noexcept(_M_sem._M_acquire()))
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 91,100 ****
  	{ return _M_sem._M_try_acquire_until(__atime); }
      };
  
    using binary_semaphore = std::counting_semaphore<1>;
  
  _GLIBCXX_END_NAMESPACE_VERSION
  } // namespace
- #endif // cpp_lib_atomic_wait || _GLIBCXX_HAVE_POSIX_SEMAPHORE
  #endif // __cpp_lib_semaphore
  #endif // _GLIBCXX_SEMAPHORE
--- 94,106 ----
  	{ return _M_sem._M_try_acquire_until(__atime); }
      };
  
+   /** @brief A binary semaphore
+    *
+    * @since C++20
+    */
    using binary_semaphore = std::counting_semaphore<1>;
  
  _GLIBCXX_END_NAMESPACE_VERSION
  } // namespace
  #endif // __cpp_lib_semaphore
  #endif // _GLIBCXX_SEMAPHORE
diff -Nrcpad gcc-16-20250525/libstdc++-v3/src/c++20/Makefile.am gcc-16-20250601/libstdc++-v3/src/c++20/Makefile.am
*** gcc-16-20250525/libstdc++-v3/src/c++20/Makefile.am	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/src/c++20/Makefile.am	Sun Jun  1 22:32:41 2025
*************** else
*** 36,42 ****
  inst_sources =
  endif
  
! sources = tzdb.cc format.cc
  
  vpath % $(top_srcdir)/src/c++20
  
--- 36,42 ----
  inst_sources =
  endif
  
! sources = tzdb.cc format.cc atomic.cc
  
  vpath % $(top_srcdir)/src/c++20
  
diff -Nrcpad gcc-16-20250525/libstdc++-v3/src/c++20/Makefile.in gcc-16-20250601/libstdc++-v3/src/c++20/Makefile.in
*** gcc-16-20250525/libstdc++-v3/src/c++20/Makefile.in	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/src/c++20/Makefile.in	Sun Jun  1 22:32:41 2025
*************** CONFIG_CLEAN_FILES =
*** 121,127 ****
  CONFIG_CLEAN_VPATH_FILES =
  LTLIBRARIES = $(noinst_LTLIBRARIES)
  libc__20convenience_la_LIBADD =
! am__objects_1 = tzdb.lo format.lo
  @ENABLE_EXTERN_TEMPLATE_TRUE@am__objects_2 = sstream-inst.lo
  @GLIBCXX_HOSTED_TRUE@am_libc__20convenience_la_OBJECTS =  \
  @GLIBCXX_HOSTED_TRUE@	$(am__objects_1) $(am__objects_2)
--- 121,127 ----
  CONFIG_CLEAN_VPATH_FILES =
  LTLIBRARIES = $(noinst_LTLIBRARIES)
  libc__20convenience_la_LIBADD =
! am__objects_1 = tzdb.lo format.lo atomic.lo
  @ENABLE_EXTERN_TEMPLATE_TRUE@am__objects_2 = sstream-inst.lo
  @GLIBCXX_HOSTED_TRUE@am_libc__20convenience_la_OBJECTS =  \
  @GLIBCXX_HOSTED_TRUE@	$(am__objects_1) $(am__objects_2)
*************** headers =
*** 432,438 ****
  @ENABLE_EXTERN_TEMPLATE_TRUE@inst_sources = \
  @ENABLE_EXTERN_TEMPLATE_TRUE@	sstream-inst.cc
  
! sources = tzdb.cc format.cc
  @GLIBCXX_HOSTED_FALSE@libc__20convenience_la_SOURCES = 
  @GLIBCXX_HOSTED_TRUE@libc__20convenience_la_SOURCES = $(sources)  $(inst_sources)
  
--- 432,438 ----
  @ENABLE_EXTERN_TEMPLATE_TRUE@inst_sources = \
  @ENABLE_EXTERN_TEMPLATE_TRUE@	sstream-inst.cc
  
! sources = tzdb.cc format.cc atomic.cc
  @GLIBCXX_HOSTED_FALSE@libc__20convenience_la_SOURCES = 
  @GLIBCXX_HOSTED_TRUE@libc__20convenience_la_SOURCES = $(sources)  $(inst_sources)
  
diff -Nrcpad gcc-16-20250525/libstdc++-v3/src/c++20/atomic.cc gcc-16-20250601/libstdc++-v3/src/c++20/atomic.cc
*** gcc-16-20250525/libstdc++-v3/src/c++20/atomic.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/src/c++20/atomic.cc	Sun Jun  1 22:32:41 2025
***************
*** 0 ****
--- 1,485 ----
+ // Definitions for <atomic> wait/notify -*- C++ -*-
+ 
+ // Copyright (C) 2020-2025 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 3, or (at your option)
+ // any later version.
+ 
+ // This library is distributed in the hope that it will be useful,
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ // GNU General Public License for more details.
+ 
+ // Under Section 7 of GPL version 3, you are granted additional
+ // permissions described in the GCC Runtime Library Exception, version
+ // 3.1, as published by the Free Software Foundation.
+ 
+ // You should have received a copy of the GNU General Public License and
+ // a copy of the GCC Runtime Library Exception along with this program;
+ // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+ // <http://www.gnu.org/licenses/>.
+ 
+ #include <bits/version.h>
+ 
+ #if __glibcxx_atomic_wait
+ #include <atomic>
+ #include <bits/atomic_timed_wait.h>
+ #include <bits/functional_hash.h>
+ #include <cstdint>
+ #include <bits/std_mutex.h>  // std::mutex, std::__condvar
+ 
+ #ifdef _GLIBCXX_HAVE_LINUX_FUTEX
+ # include <cerrno>
+ # include <climits>
+ # include <unistd.h>
+ # include <syscall.h>
+ # include <bits/functexcept.h>
+ # include <sys/time.h>
+ #endif
+ 
+ #ifdef _GLIBCXX_HAVE_PLATFORM_WAIT
+ # ifndef _GLIBCXX_HAVE_PLATFORM_TIMED_WAIT
+ // __waitable_state assumes that we consistently use the same implementation
+ // (i.e. futex vs mutex+condvar) for timed and untimed waiting.
+ #  error "This configuration is not currently supported"
+ # endif
+ #endif
+ 
+ #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
+ 
+ namespace std
+ {
+ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ namespace __detail
+ {
+ namespace
+ {
+ #ifdef _GLIBCXX_HAVE_LINUX_FUTEX
+   enum class __futex_wait_flags : int
+   {
+ #ifdef _GLIBCXX_HAVE_LINUX_FUTEX_PRIVATE
+     __private_flag = 128,
+ #else
+     __private_flag = 0,
+ #endif
+     __wait = 0,
+     __wake = 1,
+     __wait_bitset = 9,
+     __wake_bitset = 10,
+     __wait_private = __wait | __private_flag,
+     __wake_private = __wake | __private_flag,
+     __wait_bitset_private = __wait_bitset | __private_flag,
+     __wake_bitset_private = __wake_bitset | __private_flag,
+     __bitset_match_any = -1
+   };
+ 
+   void
+   __platform_wait(const int* __addr, int __val) noexcept
+   {
+     auto __e = syscall (SYS_futex, __addr,
+ 			static_cast<int>(__futex_wait_flags::__wait_private),
+ 			__val, nullptr);
+     if (!__e || errno == EAGAIN)
+       return;
+     if (errno != EINTR)
+       __throw_system_error(errno);
+   }
+ 
+   void
+   __platform_notify(const int* __addr, bool __all) noexcept
+   {
+     syscall (SYS_futex, __addr,
+ 	     static_cast<int>(__futex_wait_flags::__wake_private),
+ 	     __all ? INT_MAX : 1);
+   }
+ #endif
+ 
+   // The state used by atomic waiting and notifying functions.
+   struct __waitable_state
+   {
+     // Don't use std::hardware_destructive_interference_size here because we
+     // don't want the layout of library types to depend on compiler options.
+     static constexpr auto _S_align = 64;
+ 
+     // Count of threads blocked waiting on this state.
+     alignas(_S_align) __platform_wait_t _M_waiters = 0;
+ 
+ #ifndef _GLIBCXX_HAVE_PLATFORM_TIMED_WAIT
+     mutex _M_mtx;
+ 
+     // This type meets the Cpp17BasicLockable requirements.
+     void lock() { _M_mtx.lock(); }
+     void unlock() { _M_mtx.unlock(); }
+ #else
+     void lock() { }
+     void unlock() { }
+ #endif
+ 
+     // If we can't do a platform wait on the atomic variable itself,
+     // we use this member as a proxy for the atomic variable and we
+     // use this for waiting and notifying functions instead.
+     alignas(_S_align) __platform_wait_t _M_ver = 0;
+ 
+ #ifndef _GLIBCXX_HAVE_PLATFORM_TIMED_WAIT
+     __condvar _M_cv;
+ #endif
+ 
+     __waitable_state() = default;
+ 
+     void
+     _M_enter_wait() noexcept
+     { __atomic_fetch_add(&_M_waiters, 1, __ATOMIC_SEQ_CST); }
+ 
+     void
+     _M_leave_wait() noexcept
+     { __atomic_fetch_sub(&_M_waiters, 1, __ATOMIC_RELEASE); }
+ 
+     bool
+     _M_waiting() const noexcept
+     {
+       __platform_wait_t __res;
+       __atomic_load(&_M_waiters, &__res, __ATOMIC_SEQ_CST);
+       return __res != 0;
+     }
+ 
+     static __waitable_state&
+     _S_state_for(const void* __addr) noexcept
+     {
+       constexpr __UINTPTR_TYPE__ __ct = 16;
+       static __waitable_state __w[__ct];
+       auto __key = ((__UINTPTR_TYPE__)__addr >> 2) % __ct;
+       return __w[__key];
+     }
+   };
+ 
+   // Scope-based contention tracking.
+   struct scoped_wait
+   {
+     // pre: if track_contention is in flags, then args._M_wait_state != nullptr
+     explicit
+     scoped_wait(const __wait_args_base& args) : _M_state(nullptr)
+     {
+       if (args & __wait_flags::__track_contention)
+ 	{
+ 	  _M_state = static_cast<__waitable_state*>(args._M_wait_state);
+ 	  _M_state->_M_enter_wait();
+ 	}
+     }
+ 
+     ~scoped_wait()
+     {
+       if (_M_state)
+ 	_M_state->_M_leave_wait();
+     }
+ 
+     scoped_wait(scoped_wait&&) = delete;
+ 
+     __waitable_state* _M_state;
+   };
+ 
+   // Scoped lock type
+   struct waiter_lock
+   {
+     // pre: args._M_state != nullptr
+     explicit
+     waiter_lock(const __wait_args_base& args)
+     : _M_state(*static_cast<__waitable_state*>(args._M_wait_state)),
+       _M_track_contention(args & __wait_flags::__track_contention)
+     {
+       _M_state.lock();
+       if (_M_track_contention)
+ 	_M_state._M_enter_wait();
+     }
+ 
+     waiter_lock(waiter_lock&&) = delete;
+ 
+     ~waiter_lock()
+     {
+       if (_M_track_contention)
+ 	_M_state._M_leave_wait();
+       _M_state.unlock();
+     }
+ 
+     __waitable_state& _M_state;
+     bool _M_track_contention;
+   };
+ 
+   constexpr auto __atomic_spin_count_relax = 12;
+   constexpr auto __atomic_spin_count = 16;
+ 
+   // This function always returns _M_has_val == true and _M_val == *__addr.
+   // _M_timeout == (*__addr == __args._M_old).
+   __wait_result_type
+   __spin_impl(const __platform_wait_t* __addr, const __wait_args_base& __args)
+   {
+     __platform_wait_t __val{};
+     for (auto __i = 0; __i < __atomic_spin_count; ++__i)
+       {
+ 	__atomic_load(__addr, &__val, __args._M_order);
+ 	if (__val != __args._M_old)
+ 	  return { ._M_val = __val, ._M_has_val = true, ._M_timeout = false };
+ 	if (__i < __atomic_spin_count_relax)
+ 	  __thread_relax();
+ 	else
+ 	  __thread_yield();
+       }
+     return { ._M_val = __val, ._M_has_val = true, ._M_timeout = true };
+   }
+ 
+   inline __waitable_state*
+   set_wait_state(const void* addr, __wait_args_base& args)
+   {
+     if (args._M_wait_state == nullptr)
+       args._M_wait_state = &__waitable_state::_S_state_for(addr);
+     return static_cast<__waitable_state*>(args._M_wait_state);
+   }
+ 
+ } // namespace
+ 
+ // Called for a proxy wait
+ void
+ __wait_args::_M_load_proxy_wait_val(const void* addr)
+ {
+   // __glibcxx_assert( *this & __wait_flags::__proxy_wait );
+ 
+   // We always need a waitable state for proxy waits.
+   auto state = set_wait_state(addr, *this);
+ 
+   // Read the value of the _M_ver counter.
+   __atomic_load(&state->_M_ver, &_M_old, __ATOMIC_ACQUIRE);
+ }
+ 
+ __wait_result_type
+ __wait_impl(const void* __addr, __wait_args_base& __args)
+ {
+   auto __state = static_cast<__waitable_state*>(__args._M_wait_state);
+ 
+   const __platform_wait_t* __wait_addr;
+ 
+   if (__args & __wait_flags::__proxy_wait)
+     __wait_addr = &__state->_M_ver;
+   else
+     __wait_addr = static_cast<const __platform_wait_t*>(__addr);
+ 
+   if (__args & __wait_flags::__do_spin)
+     {
+       auto __res = __detail::__spin_impl(__wait_addr, __args);
+       if (!__res._M_timeout)
+ 	return __res;
+       if (__args & __wait_flags::__spin_only)
+ 	return __res;
+     }
+ 
+ #ifdef _GLIBCXX_HAVE_PLATFORM_WAIT
+   if (__args & __wait_flags::__track_contention)
+     set_wait_state(__addr, __args); // scoped_wait needs a __waitable_state
+   scoped_wait s(__args);
+   __platform_wait(__wait_addr, __args._M_old);
+   // We haven't loaded a new value so return false as first member:
+   return { ._M_val = __args._M_old, ._M_has_val = false, ._M_timeout = false };
+ #else
+   waiter_lock l(__args);
+   __platform_wait_t __val;
+   __atomic_load(__wait_addr, &__val, __args._M_order);
+   if (__val == __args._M_old)
+     {
+       __state->_M_cv.wait(__state->_M_mtx);
+       return { ._M_val = __val, ._M_has_val = false, ._M_timeout = false };
+     }
+   return { ._M_val = __val, ._M_has_val = true, ._M_timeout = false };
+ #endif
+ }
+ 
+ void
+ __notify_impl(const void* __addr, [[maybe_unused]] bool __all,
+ 	      const __wait_args_base& __args)
+ {
+   auto __state = static_cast<__waitable_state*>(__args._M_wait_state);
+   if (!__state)
+     __state = &__waitable_state::_S_state_for(__addr);
+ 
+   [[maybe_unused]] const __platform_wait_t* __wait_addr;
+ 
+   // Lock mutex so that proxied waiters cannot race with incrementing _M_ver
+   // and see the old value, then sleep after the increment and notify_all().
+   lock_guard __l{ *__state };
+ 
+   if (__args & __wait_flags::__proxy_wait)
+     {
+       // Waiting for *__addr is actually done on the proxy's _M_ver.
+       __wait_addr = &__state->_M_ver;
+ 
+       // Increment _M_ver so that waiting threads see something changed.
+       // This has to be atomic because the load in _M_load_proxy_wait_val
+       // is done without the mutex locked.
+       __atomic_fetch_add(&__state->_M_ver, 1, __ATOMIC_RELEASE);
+ 
+       // Because the proxy might be shared by several waiters waiting
+       // on different atomic variables, we need to wake them all so
+       // they can re-evaluate their conditions to see if they should
+       // stop waiting or should wait again.
+       __all = true;
+     }
+   else // Use the atomic variable's own address.
+     __wait_addr = static_cast<const __platform_wait_t*>(__addr);
+ 
+   if (__args & __wait_flags::__track_contention)
+     {
+       if (!__state->_M_waiting())
+ 	return;
+     }
+ 
+ #ifdef _GLIBCXX_HAVE_PLATFORM_WAIT
+   __platform_notify(__wait_addr, __all);
+ #else
+   __state->_M_cv.notify_all();
+ #endif
+ }
+ 
+ // Timed atomic waiting functions
+ 
+ namespace
+ {
+ #ifdef _GLIBCXX_HAVE_LINUX_FUTEX
+ // returns true if wait ended before timeout
+ bool
+ __platform_wait_until(const __platform_wait_t* __addr,
+ 		      __platform_wait_t __old,
+ 		      const __wait_clock_t::time_point& __atime) noexcept
+ {
+   auto __s = chrono::time_point_cast<chrono::seconds>(__atime);
+   auto __ns = chrono::duration_cast<chrono::nanoseconds>(__atime - __s);
+ 
+   struct timespec __rt =
+   {
+     static_cast<std::time_t>(__s.time_since_epoch().count()),
+     static_cast<long>(__ns.count())
+   };
+ 
+   if (syscall (SYS_futex, __addr,
+ 	       static_cast<int>(__futex_wait_flags::__wait_bitset_private),
+ 	       __old, &__rt, nullptr,
+ 	       static_cast<int>(__futex_wait_flags::__bitset_match_any)))
+     {
+       if (errno == ETIMEDOUT)
+ 	return false;
+       if (errno != EINTR && errno != EAGAIN)
+ 	__throw_system_error(errno);
+     }
+   return true;
+ }
+ #endif // HAVE_LINUX_FUTEX
+ 
+ #ifndef _GLIBCXX_HAVE_PLATFORM_TIMED_WAIT
+ bool
+ __cond_wait_until(__condvar& __cv, mutex& __mx,
+ 		  const __wait_clock_t::time_point& __atime)
+ {
+   auto __s = chrono::time_point_cast<chrono::seconds>(__atime);
+   auto __ns = chrono::duration_cast<chrono::nanoseconds>(__atime - __s);
+ 
+   __gthread_time_t __ts =
+   {
+     static_cast<std::time_t>(__s.time_since_epoch().count()),
+     static_cast<long>(__ns.count())
+   };
+ 
+ #ifdef _GLIBCXX_USE_PTHREAD_COND_CLOCKWAIT
+   if constexpr (is_same_v<chrono::steady_clock, __wait_clock_t>)
+     __cv.wait_until(__mx, CLOCK_MONOTONIC, __ts);
+   else
+ #endif
+     __cv.wait_until(__mx, __ts);
+   return __wait_clock_t::now() < __atime;
+ }
+ #endif // ! HAVE_PLATFORM_TIMED_WAIT
+ 
+ // Like __spin_impl, always returns _M_has_val == true.
+ __wait_result_type
+ __spin_until_impl(const __platform_wait_t* __addr,
+ 		  const __wait_args_base& __args,
+ 		  const __wait_clock_t::time_point& __deadline)
+ {
+   auto __t0 = __wait_clock_t::now();
+   using namespace literals::chrono_literals;
+ 
+   __platform_wait_t __val{};
+   auto __now = __wait_clock_t::now();
+   for (; __now < __deadline; __now = __wait_clock_t::now())
+     {
+       auto __elapsed = __now - __t0;
+ #ifndef _GLIBCXX_NO_SLEEP
+       if (__elapsed > 128ms)
+ 	this_thread::sleep_for(64ms);
+       else if (__elapsed > 64us)
+ 	this_thread::sleep_for(__elapsed / 2);
+       else
+ #endif
+       if (__elapsed > 4us)
+ 	__thread_yield();
+       else
+ 	{
+ 	  auto __res = __detail::__spin_impl(__addr, __args);
+ 	  if (!__res._M_timeout)
+ 	    return __res;
+ 	}
+ 
+       __atomic_load(__addr, &__val, __args._M_order);
+       if (__val != __args._M_old)
+ 	return { ._M_val = __val, ._M_has_val = true, ._M_timeout = false };
+     }
+   return { ._M_val = __val, ._M_has_val = true, ._M_timeout = true };
+ }
+ } // namespace
+ 
+ __wait_result_type
+ __wait_until_impl(const void* __addr, __wait_args_base& __args,
+ 		  const __wait_clock_t::duration& __time)
+ {
+   const __wait_clock_t::time_point __atime(__time);
+   auto __state = static_cast<__waitable_state*>(__args._M_wait_state);
+   const __platform_wait_t* __wait_addr;
+   if (__args & __wait_flags::__proxy_wait)
+     __wait_addr = &__state->_M_ver;
+   else
+     __wait_addr = static_cast<const __platform_wait_t*>(__addr);
+ 
+   if (__args & __wait_flags::__do_spin)
+     {
+       auto __res = __detail::__spin_until_impl(__wait_addr, __args, __atime);
+       if (!__res._M_timeout)
+ 	return __res;
+       if (__args & __wait_flags::__spin_only)
+ 	return __res;
+     }
+ 
+ #ifdef _GLIBCXX_HAVE_PLATFORM_TIMED_WAIT
+   if (__args & __wait_flags::__track_contention)
+     set_wait_state(__addr, __args);
+   scoped_wait s(__args);
+   if (__platform_wait_until(__wait_addr, __args._M_old, __atime))
+     return { ._M_val = __args._M_old, ._M_has_val = false, ._M_timeout = false };
+   else
+     return { ._M_val = __args._M_old, ._M_has_val = false, ._M_timeout = true };
+ #else
+   waiter_lock l(__args);
+   __platform_wait_t __val;
+   __atomic_load(__wait_addr, &__val, __args._M_order);
+   if (__val == __args._M_old)
+     {
+       if (__cond_wait_until(__state->_M_cv, __state->_M_mtx, __atime))
+ 	return { ._M_val = __val, ._M_has_val = false, ._M_timeout = false };
+       else
+ 	return { ._M_val = __val, ._M_has_val = false, ._M_timeout = true };
+     }
+   return { ._M_val = __val, ._M_has_val = true, ._M_timeout = false };
+ #endif
+ }
+ 
+ } // namespace __detail
+ _GLIBCXX_END_NAMESPACE_VERSION
+ } // namespace std
+ #endif
diff -Nrcpad gcc-16-20250525/libstdc++-v3/src/c++23/std.cc.in gcc-16-20250601/libstdc++-v3/src/c++23/std.cc.in
*** gcc-16-20250525/libstdc++-v3/src/c++23/std.cc.in	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/src/c++23/std.cc.in	Sun Jun  1 22:32:41 2025
*************** export namespace std
*** 1415,1420 ****
--- 1415,1423 ----
  #if __cpp_lib_copyable_function
    using std::copyable_function;
  #endif
+ #if __cpp_lib_function_ref
+   using std::function_ref;
+ #endif
    using std::multiplies;
    using std::negate;
    using std::not_equal_to;
*************** export namespace std
*** 3195,3200 ****
--- 3198,3207 ----
    using std::make_integer_sequence;
    using std::move;
    using std::move_if_noexcept;
+ #if __cpp_lib_function_ref
+   using std::nontype_t;
+   using std::nontype;
+ #endif
    using std::pair;
    using std::swap;
    using std::operator==;
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/17_intro/headers/c++1998/49745.cc gcc-16-20250601/libstdc++-v3/testsuite/17_intro/headers/c++1998/49745.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/17_intro/headers/c++1998/49745.cc	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/17_intro/headers/c++1998/49745.cc	Sun Jun  1 22:32:41 2025
***************
*** 131,135 ****
  #endif
  
  int truncate = 0;
- 
- // { dg-xfail-if "PR libstdc++/99995" { c++20 } }
--- 131,133 ----
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/17_intro/names.cc gcc-16-20250601/libstdc++-v3/testsuite/17_intro/names.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/17_intro/names.cc	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/17_intro/names.cc	Sun Jun  1 22:32:41 2025
***************
*** 248,253 ****
--- 248,257 ----
  #undef r
  #undef x
  #undef y
+ // <stdlib.h> defines drand48_data::a
+ #undef a
+ // <sys/localedef.h> defines _LC_weight_t::n
+ #undef n
  // <sys/poll.h> defines pollfd_ext::u on AIX 7.3
  #undef u
  // <sys/var.h> defines vario::v
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/20_util/function_ref/assign.cc gcc-16-20250601/libstdc++-v3/testsuite/20_util/function_ref/assign.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/20_util/function_ref/assign.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/20_util/function_ref/assign.cc	Sun Jun  1 22:32:42 2025
***************
*** 0 ****
--- 1,108 ----
+ // { dg-do compile { target c++26 } }
+ 
+ #include <functional>
+ 
+ #ifndef __cpp_lib_function_ref
+ # error "Feature-test macro for function_ref missing in <functional>"
+ #elif __cpp_lib_function_ref != 202306L
+ # error "Feature-test macro for function_ref has wrong value in <functional>"
+ #endif
+ 
+ using std::nontype;
+ using std::nontype_t;
+ using std::function_ref;
+ 
+ using std::is_nothrow_move_assignable_v;
+ using std::is_nothrow_copy_assignable_v;
+ using std::is_nothrow_assignable_v;
+ using std::is_assignable_v;
+ using std::is_nothrow_swappable_v;
+ using std::is_trivially_copyable_v;
+ 
+ static_assert( is_nothrow_move_assignable_v<function_ref<void()>> );
+ static_assert( is_nothrow_copy_assignable_v<function_ref<void()>> );
+ static_assert( is_nothrow_swappable_v<function_ref<void()>> );
+ 
+ static_assert( ! is_assignable_v<function_ref<void()>, std::nullptr_t> );
+ 
+ static_assert( is_nothrow_assignable_v<function_ref<void()>, void()> );
+ static_assert( is_nothrow_assignable_v<function_ref<void()>, void(&)()> );
+ static_assert( is_nothrow_assignable_v<function_ref<void()>, void(*)()> );
+ static_assert( is_nothrow_assignable_v<function_ref<void()>, int()> );
+ static_assert( is_nothrow_assignable_v<function_ref<void()>, int(&)()> );
+ static_assert( is_nothrow_assignable_v<function_ref<void()>, int(*)()> );
+ static_assert( ! is_nothrow_assignable_v<function_ref<void()>, void(int)> );
+ static_assert( is_nothrow_assignable_v<function_ref<void(int)>, void(int)> );
+ 
+ static_assert( is_nothrow_assignable_v<function_ref<void()>,
+ 				       void() noexcept> );
+ static_assert( is_nothrow_assignable_v<function_ref<void() noexcept>,
+ 					void() noexcept> );
+ static_assert( ! is_assignable_v<function_ref<void() noexcept>, void() > );
+ 
+ struct S
+ {
+   int x;
+   int f();
+ };
+ int funS(S);
+ 
+ static_assert( is_nothrow_assignable_v<function_ref<int(S)>,
+ 				       decltype(funS)> );
+ static_assert( is_nothrow_assignable_v<function_ref<int(S)>,
+ 				       decltype(&funS)> );
+ static_assert( ! is_assignable_v<function_ref<int(S)>, decltype(&S::x)> );
+ static_assert( ! is_assignable_v<function_ref<int(S)>, decltype(&S::f)> );
+ 
+ static_assert( is_nothrow_assignable_v<function_ref<int(S)>,
+ 				       nontype_t<funS>> );
+ static_assert( is_nothrow_assignable_v<function_ref<int(S)>,
+ 				       nontype_t<&funS>> );
+ static_assert( is_nothrow_assignable_v<function_ref<int(S)>,
+ 				       nontype_t<&S::x>> );
+ static_assert( is_nothrow_assignable_v<function_ref<int(S)>,
+ 				       nontype_t<&S::f>> );
+ struct Q
+ {
+   void operator()() const;
+ };
+ 
+ static_assert( ! is_assignable_v<function_ref<void()>, Q> );
+ static_assert( ! is_assignable_v<function_ref<void()>, Q&> );
+ static_assert( ! is_assignable_v<function_ref<void()>, const Q&> );
+ static_assert( ! is_assignable_v<function_ref<void() const>, Q> );
+ static_assert( ! is_assignable_v<function_ref<void() const>, Q&> );
+ static_assert( ! is_assignable_v<function_ref<void() const>, const Q&> );
+ 
+ static_assert( is_nothrow_assignable_v<function_ref<void()>,
+ 				       nontype_t<Q{}>> );
+ static_assert( is_nothrow_assignable_v<function_ref<void() const>,
+ 				       nontype_t<Q{}>> );
+ 
+ constexpr bool
+ test_constexpr()
+ {
+   function_ref<void(S)> fp(nontype<funS>);
+   fp = nontype<funS>;
+   fp = nontype<&funS>;
+   fp = nontype<&S::x>;
+   fp = nontype<&S::f>;
+ 
+   constexpr Q cq;
+   function_ref<void() const> fq(cq);
+   fq = nontype<cq>;
+   return true;
+ }
+ static_assert( test_constexpr() );
+ 
+ void func();
+ 
+ void
+ test_instantiation()
+ {
+   function_ref<void(S)> fp(funS);
+   fp = funS;
+   fp = &funS;
+ 
+   test_constexpr();
+ }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/20_util/function_ref/call.cc gcc-16-20250601/libstdc++-v3/testsuite/20_util/function_ref/call.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/20_util/function_ref/call.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/20_util/function_ref/call.cc	Sun Jun  1 22:32:42 2025
***************
*** 0 ****
--- 1,186 ----
+ // { dg-do run { target c++26 } }
+ 
+ #include <functional>
+ #include <utility>
+ #include <testsuite_hooks.h>
+ 
+ using std::nontype;
+ using std::function_ref;
+ 
+ using std::is_same_v;
+ using std::is_invocable_v;
+ using std::is_nothrow_invocable_v;
+ using std::invoke_result_t;
+ 
+ // Check return types
+ static_assert( is_same_v<void, invoke_result_t<function_ref<void()>>> );
+ static_assert( is_same_v<int, invoke_result_t<function_ref<int()>>> );
+ static_assert( is_same_v<int&, invoke_result_t<function_ref<int&()>>> );
+ 
+ // Const qualier applies to target object
+ static_assert( is_invocable_v< function_ref<void()> const > );
+ static_assert( is_invocable_v< function_ref<void()> const &> );
+ static_assert( is_invocable_v< function_ref<void() const> > );
+ static_assert( is_invocable_v< function_ref<void() const> &> );
+ static_assert( is_invocable_v< function_ref<void() const> const > );
+ static_assert( is_invocable_v< function_ref<void() const> const &> );
+ 
+ // With noexcept-specifier
+ static_assert( ! is_nothrow_invocable_v< function_ref<void()> > );
+ static_assert( ! is_nothrow_invocable_v< function_ref<void() noexcept(false)> > );
+ static_assert( is_nothrow_invocable_v< function_ref<void() noexcept> > );
+ 
+ void
+ test01()
+ {
+   struct F
+   {
+     int operator()() { return 0; }
+     int operator()() const { return 1; }
+   };
+ 
+   function_ref<int()> f0{F{}};
+   VERIFY( f0() == 0 );
+   VERIFY( std::move(f0)() == 0 );
+ 
+   function_ref<int()> f1{nontype<F{}>};
+   VERIFY( f1() == 1 );
+   VERIFY( std::move(f1)() == 1 );
+ 
+   function_ref<int() const> f2{F{}};
+   VERIFY( f2() == 1 );
+   VERIFY( std::as_const(f2)() == 1 );
+   VERIFY( std::move(f2)() == 1 );
+   VERIFY( std::move(std::as_const(f2))() == 1 );
+ 
+   function_ref<int() const> f3{nontype<F{}>};
+   VERIFY( f3() == 1 );
+   VERIFY( std::as_const(f3)() == 1 );
+   VERIFY( std::move(f3)() == 1 );
+   VERIFY( std::move(std::as_const(f3))() == 1 );
+ }
+ 
+ void
+ test02()
+ {
+   struct F
+   {
+     struct Arg {};
+     int operator()(Arg& arg) const { return 0; }
+     int operator()(const Arg& arg) const { return 1; }
+   };
+   F::Arg arg;
+ 
+   function_ref<int()> f0{std::nontype<F{}>, arg};
+   VERIFY( f0() == 0 );
+   VERIFY( std::move(f0)() == 0 );
+ 
+   function_ref<int() const> f1{std::nontype<F{}>, arg};
+   VERIFY( f1() == 1 );
+   VERIFY( std::as_const(f1)() == 1 );
+ }
+ 
+ void
+ test03()
+ {
+   struct F
+   {
+     struct Arg {};
+     int operator()(Arg* arg) const { return 0; }
+     int operator()(const Arg* arg) const { return 1; }
+   };
+   F::Arg arg;
+ 
+   function_ref<int()> f0{std::nontype<F{}>, &arg};
+   VERIFY( f0() == 0 );
+   VERIFY( std::move(f0)() == 0 );
+ 
+   function_ref<int() const> f1{std::nontype<F{}>, &arg};
+   VERIFY( f1() == 1 );
+   VERIFY( std::as_const(f1)() == 1 );
+ }
+ 
+ void
+ test04()
+ {
+   constexpr int (*fp)() = [] { return 0; };
+   function_ref<int()> f0{fp};
+   VERIFY( f0() == 0 );
+   VERIFY( std::move(f0)() == 0 );
+ 
+   function_ref<int()> f1{nontype<fp>};
+   VERIFY( f1() == 0 );
+   VERIFY( std::move(f1)() == 0 );
+ 
+   const function_ref<int() const> f2{fp};
+   VERIFY( f2() == 0 );
+   VERIFY( std::move(f2)() == 0 );
+ 
+   const function_ref<int() const> f3{nontype<fp>};
+   VERIFY( f2() == 0 );
+   VERIFY( std::move(f2)() == 0 );
+ }
+ 
+ using ftype = int(int);
+ int twice(int x) { return x * 2; }
+ int cube(int x) { return x * x * x; }
+ int callback_ptr(ftype* f, int x) { return f(x); }
+ int callback_ref(ftype& f, int x) { return f(x); }
+ 
+ void
+ test05()
+ {
+ 
+   function_ref<int(int)> r1(nontype<&callback_ptr>, &twice);
+   VERIFY( r1(2) == 4 );
+   function_ref<int(int)> r2(nontype<&callback_ptr>, cube);
+   VERIFY( r2(2) == 8 );
+ 
+   function_ref<int(int)> r3(nontype<&callback_ref>, twice);
+   VERIFY( r3(3) == 6 );
+   function_ref<int(int)> r4(nontype<&callback_ref>, cube);
+   VERIFY( r4(3) == 27 );
+ 
+   // Checks if distinction between reference and pointer
+   // is preserved.
+   struct F
+   {
+     static
+     int operator()(ftype* f, int x)
+     { return f(x) + 1000; }
+ 
+     static
+     int operator()(ftype& f, int x)
+     { return f(x) + 2000; }
+   };
+   function_ref<int(int)> r5(nontype<F{}>, &twice);
+   VERIFY( r5(2) == 1004 );
+   function_ref<int(int)> r6(nontype<F{}>, twice);
+   VERIFY( r6(2) == 2008 );
+   function_ref<int(int)> r7(nontype<F{}>, &cube);
+   VERIFY( r7(3) == 1006 );
+   function_ref<int(int)> r8(nontype<F{}>, cube);
+   VERIFY( r8(3) == 2027 );
+ }
+ 
+ struct Incomplete;
+ 
+ void
+ test_params()
+ {
+   auto f = [](auto&&) {};
+   // There is discussion if this is supported.
+   // std::function_ref<void(Incomplete)> f1(f);
+   std::function_ref<void(Incomplete&)> f2(f);
+   // See PR120259, this should be supported.
+   // std::function_ref<void(Incomplete&&)> f3(f);
+ }
+ 
+ int main()
+ {
+   test01();
+   test02();
+   test03();
+   test04();
+   test_params();
+ }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/20_util/function_ref/cons.cc gcc-16-20250601/libstdc++-v3/testsuite/20_util/function_ref/cons.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/20_util/function_ref/cons.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/20_util/function_ref/cons.cc	Sun Jun  1 22:32:42 2025
***************
*** 0 ****
--- 1,218 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-add-options no_pch }
+ 
+ #include <functional>
+ 
+ #ifndef __cpp_lib_function_ref
+ # error "Feature-test macro for function_ref missing in <functional>"
+ #elif __cpp_lib_function_ref != 202306L
+ # error "Feature-test macro for function_ref has wrong value in <functional>"
+ #endif
+ 
+ using std::nontype;
+ using std::nontype_t;
+ using std::function_ref;
+ 
+ using std::is_default_constructible_v;
+ using std::is_nothrow_copy_constructible_v;
+ using std::is_nothrow_move_constructible_v;
+ using std::is_nothrow_constructible_v;
+ using std::is_constructible_v;
+ using std::is_trivially_copyable_v;
+ 
+ static_assert( ! is_default_constructible_v<function_ref<void()>> );
+ static_assert( is_nothrow_move_constructible_v<function_ref<void()>> );
+ static_assert( is_nothrow_copy_constructible_v<function_ref<void()>> );
+ static_assert( is_trivially_copyable_v<function_ref<void()>> );
+ 
+ static_assert( ! is_constructible_v<function_ref<void()>, std::nullptr_t> );
+ 
+ static_assert( is_nothrow_constructible_v<function_ref<void()>, void()> );
+ static_assert( is_nothrow_constructible_v<function_ref<void()>, void(&)()> );
+ static_assert( is_nothrow_constructible_v<function_ref<void()>, void(*)()> );
+ static_assert( is_nothrow_constructible_v<function_ref<void()>, int()> );
+ static_assert( is_nothrow_constructible_v<function_ref<void()>, int(&)()> );
+ static_assert( is_nothrow_constructible_v<function_ref<void()>, int(*)()> );
+ static_assert( ! is_constructible_v<function_ref<void()>, void(int)> );
+ static_assert( is_nothrow_constructible_v<function_ref<void(int)>, void(int)> );
+ 
+ static_assert( is_nothrow_constructible_v<function_ref<void()>,
+ 					  void() noexcept> );
+ static_assert( is_nothrow_constructible_v<function_ref<void() noexcept>,
+ 					  void() noexcept> );
+ static_assert( ! is_constructible_v<function_ref<void() noexcept>,
+ 				    void() > );
+ 
+ struct S
+ {
+   int x;
+   int f();
+ };
+ int funS(S);
+ 
+ static_assert( is_nothrow_constructible_v<function_ref<int(S)>,
+ 					  decltype(funS)> );
+ static_assert( is_nothrow_constructible_v<function_ref<int(S)>,
+ 					  decltype(&funS)> );
+ static_assert( ! is_constructible_v<function_ref<int(S)>,
+ 				    decltype(&S::x)> );
+ static_assert( ! is_constructible_v<function_ref<int(S)>,
+ 				    decltype(&S::f)> );
+ 
+ static_assert( is_nothrow_constructible_v<function_ref<int(S)>,
+ 					  nontype_t<funS>> );
+ static_assert( is_nothrow_constructible_v<function_ref<int(S)>,
+ 					  nontype_t<&funS>> );
+ static_assert( is_nothrow_constructible_v<function_ref<int(S)>,
+ 					  nontype_t<&S::x>> );
+ static_assert( is_nothrow_constructible_v<function_ref<int(S)>,
+ 					  nontype_t<&S::f>> );
+ 
+ static_assert( is_nothrow_constructible_v<function_ref<int()>,
+ 					  nontype_t<funS>, S&> );
+ static_assert( is_nothrow_constructible_v<function_ref<int()>,
+ 					  nontype_t<&funS>, S&> );
+ static_assert( is_nothrow_constructible_v<function_ref<int()>,
+ 					  nontype_t<&S::x>, S&> );
+ static_assert( is_nothrow_constructible_v<function_ref<int()>,
+ 					  nontype_t<&S::f>, S&> );
+ 
+ static_assert( ! is_constructible_v<function_ref<int()>,
+ 				    nontype_t<funS>, S*> );
+ static_assert( ! is_constructible_v<function_ref<int()>,
+ 				    nontype_t<&funS>, S*> );
+ static_assert( is_nothrow_constructible_v<function_ref<int()>,
+ 					  nontype_t<&S::x>, S*> );
+ static_assert( is_nothrow_constructible_v<function_ref<int()>,
+ 					  nontype_t<&S::f>, S*> );
+ 
+ struct M
+ {
+   void operator()();
+ };
+ 
+ 
+ static_assert( is_nothrow_constructible_v<function_ref<void()>, M> );
+ static_assert( is_nothrow_constructible_v<function_ref<void()>, M&> );
+ static_assert( ! is_constructible_v<function_ref<void()>, const M&> );
+ static_assert( ! is_constructible_v<function_ref<void() const>, M> );
+ static_assert( ! is_constructible_v<function_ref<void() const>, const M&> );
+ static_assert( ! is_constructible_v<function_ref<void()>,
+ 				    nontype_t<M{}>> );
+ static_assert( ! is_constructible_v<function_ref<void() const>,
+ 				    nontype_t<M{}>> );
+ struct Q
+ {
+   void operator()(int) const;
+   void operator()(int*) const;
+ };
+ 
+ static_assert( is_nothrow_constructible_v<function_ref<void(int)>, Q> );
+ static_assert( is_nothrow_constructible_v<function_ref<void(int)>, Q&> );
+ static_assert( is_nothrow_constructible_v<function_ref<void(int)>, const Q&> );
+ static_assert( is_nothrow_constructible_v<function_ref<void(int) const>, Q> );
+ static_assert( is_nothrow_constructible_v<function_ref<void(int) const>, Q&> );
+ static_assert( is_nothrow_constructible_v<function_ref<void(int) const>, const Q&> );
+ 
+ static_assert( is_nothrow_constructible_v<function_ref<void(int)>,
+ 					  nontype_t<Q{}>> );
+ static_assert( is_nothrow_constructible_v<function_ref<void(int) const>,
+ 					  nontype_t<Q{}>> );
+ static_assert( is_nothrow_constructible_v<function_ref<void()>,
+ 					  nontype_t<Q{}>, int&> );
+ static_assert( is_nothrow_constructible_v<function_ref<void() const>,
+ 					  nontype_t<Q{}>, int&> );
+ static_assert( ! is_constructible_v<function_ref<void()>,
+ 				    nontype_t<Q{}>, int> );
+ static_assert( ! is_constructible_v<function_ref<void() const>,
+ 				    nontype_t<Q{}>, int> );
+ 
+ static_assert( is_nothrow_constructible_v<function_ref<void()>,
+ 					  nontype_t<Q{}>, int*> );
+ static_assert( ! is_constructible_v<function_ref<void() const>,
+ 				    nontype_t<Q{}>, int*> );
+ 
+ struct L
+ {
+   void operator()() &;
+ };
+ 
+ static_assert( is_nothrow_constructible_v<function_ref<void()>, L> );
+ static_assert( is_nothrow_constructible_v<function_ref<void()>, L&> );
+ static_assert( ! is_constructible_v<function_ref<void()>, const L&> );
+ static_assert( ! is_constructible_v<function_ref<void() const>, L> );
+ static_assert( ! is_constructible_v<function_ref<void() const>, const L&> );
+ static_assert( ! is_constructible_v<function_ref<void()>,
+ 				    nontype_t<L{}>> );
+ static_assert( ! is_constructible_v<function_ref<void() const>,
+ 				    nontype_t<L{}>> );
+ 
+ struct R
+ {
+   void operator()(float) const&&;
+ };
+ 
+ static_assert( ! is_constructible_v<function_ref<void(float)>, R> );
+ static_assert( ! is_constructible_v<function_ref<void(float)>, R&> );
+ static_assert( ! is_constructible_v<function_ref<void(float) const>, R> );
+ static_assert( ! is_constructible_v<function_ref<void(float) const>, R&> );
+ static_assert( ! is_constructible_v<function_ref<void(float) const>, const R&> );
+ 
+ static_assert( ! is_constructible_v<function_ref<void(float)>,
+ 						 nontype_t<R{}>> );
+ static_assert( ! is_constructible_v<function_ref<void(float) const>,
+ 						 nontype_t<R{}>> );
+ 
+ constexpr bool
+ test_constexpr()
+ {
+   function_ref<void(S)> fp1(nontype<funS>);
+   function_ref<void(S)> fp3(nontype<&funS>);
+   function_ref<void(S)> fp4(nontype<&S::x>);
+   function_ref<void(S)> fp5(nontype<&S::f>);
+ 
+   S s;
+   function_ref<void()> fp6(nontype<&funS>, s);
+   function_ref<void()> fp7(nontype<&S::x>, s);
+   function_ref<void()> fp8(nontype<&S::x>, &s);
+   function_ref<void()> fp9(nontype<&S::f>, s);
+   function_ref<void()> fp10(nontype<&S::f>, &s);
+ 
+   M m;
+   function_ref<void()> fm1(m);
+   function_ref<void()> fm2(std::move(m));
+ 
+   Q q;
+   constexpr Q cq;
+   function_ref<void(int)> fq1(q);
+   function_ref<void(int) const> fq2(q);
+   function_ref<void(int) const> fq3(std::move(q));
+ 
+   function_ref<void(int)> fcq1(cq);
+   function_ref<void(int) const> f(cq);
+   function_ref<void(int)> fcq3(nontype<cq>);
+   function_ref<void(int) const> fcq4(nontype<cq>);
+ 
+   int i = 0;
+   function_ref<void()> fcq5(nontype<cq>, i);
+   function_ref<void() const> fcq6(nontype<cq>, i);
+   function_ref<void()> fcq7(nontype<cq>, &i);
+ 
+   L l;
+   function_ref<void()> fl1(l);
+   function_ref<void()> fl2(std::move(l));
+ 
+   return true;
+ }
+ static_assert( test_constexpr() );
+ 
+ void func();
+ 
+ void
+ test_instantiation()
+ {
+   function_ref<void(S)> fp1(funS);
+   function_ref<void(S)> fp2(&funS);
+ 
+   test_constexpr();
+ }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/20_util/function_ref/cons_neg.cc gcc-16-20250601/libstdc++-v3/testsuite/20_util/function_ref/cons_neg.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/20_util/function_ref/cons_neg.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/20_util/function_ref/cons_neg.cc	Sun Jun  1 22:32:42 2025
***************
*** 0 ****
--- 1,30 ----
+ // { dg-do compile { target c++26 } }
+ 
+ #include <functional>
+ 
+ using std::nontype;
+ using std::function_ref;
+ 
+ struct S
+ {
+   int x;
+   void foo();
+ };
+ S s;
+ 
+ constexpr int(*fp)(S) = nullptr;
+ constexpr int S::*mdp = nullptr;
+ constexpr int (S::*mfp)() = nullptr;
+ 
+ function_ref<int(S)> fd1(nontype<fp>);  // { dg-error "from here" }
+ function_ref<int(S)> fd2(nontype<mdp>); // { dg-error "from here" }
+ function_ref<int(S)> fd3(nontype<mfp>); // { dg-error "from here" }
+ 
+ function_ref<int()> br4(nontype<fp>, s);  // { dg-error "from here" }
+ function_ref<int()> br5(nontype<mdp>, s); // { dg-error "from here" }
+ function_ref<int()> br6(nontype<mfp>, s); // { dg-error "from here" }
+ 
+ function_ref<int()> bp7(nontype<mdp>, &s); // { dg-error "from here" }
+ function_ref<int()> bp8(nontype<mfp>, &s); // { dg-error "from here" }
+ 
+ // { dg-prune-output "static assertion failed" }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/20_util/function_ref/conv.cc gcc-16-20250601/libstdc++-v3/testsuite/20_util/function_ref/conv.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/20_util/function_ref/conv.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/20_util/function_ref/conv.cc	Sun Jun  1 22:32:42 2025
***************
*** 0 ****
--- 1,259 ----
+ // { dg-do run { target c++26 } }
+ // { dg-require-effective-target hosted }
+ 
+ #include <functional>
+ #include <testsuite_hooks.h>
+ 
+ using std::function_ref;
+ 
+ static_assert( std::is_constructible_v<std::function_ref<void() const>,
+ 				       std::function_ref<void()>> );
+ 
+ // Non-trivial args, guarantess that type is not passed by copy
+ struct CountedArg
+ {
+   CountedArg() = default;
+   CountedArg(const CountedArg& f) noexcept : counter(f.counter) { ++counter; }
+   CountedArg& operator=(CountedArg&&) = delete;
+ 
+   int counter = 0;
+ };
+ CountedArg const c;
+ 
+ // The C++26 [func.wrap.general] p2 does not currently cover funciton_ref,
+ // so we make extra copies of arguments.
+ 
+ void
+ test01()
+ {
+   auto f = [](CountedArg const& arg) noexcept { return arg.counter; };
+   std::function_ref<int(CountedArg) const noexcept> r1(f);
+   std::move_only_function<int(CountedArg) const noexcept> m1(f);
+   std::copyable_function<int(CountedArg) const noexcept> c1(f);
+ 
+   // Complatible signatures
+   std::function_ref<int(CountedArg) const noexcept> r2m(m1);
+   VERIFY( r2m(c) == 2 );
+   std::function_ref<int(CountedArg) const noexcept> r2c(c1);
+   VERIFY( r2c(c) == 2 );
+ 
+   std::function_ref<int(CountedArg) const> r3r(r1);
+   VERIFY( r3r(c) == 2 );
+   std::function_ref<int(CountedArg) const> r3m(m1);
+   VERIFY( r3m(c) == 2 );
+   std::function_ref<int(CountedArg) const> r3c(c1);
+   VERIFY( r3c(c) == 2 );
+ 
+   std::function_ref<int(CountedArg)> r4r(r1);
+   VERIFY( r4r(c) == 2 );
+   std::function_ref<int(CountedArg)> r4m(m1);
+   VERIFY( r4m(c) == 2 );
+   std::function_ref<int(CountedArg)> r4c(c1);
+   VERIFY( r4c(c) == 2 );
+ 
+   // Incompatible signatures
+   std::function_ref<long(CountedArg) const noexcept> r5r(r1);
+   VERIFY( r5r(c) == 2 );
+   std::function_ref<long(CountedArg) const noexcept> r5m(m1);
+   VERIFY( r5r(c) == 2 );
+   std::function_ref<long(CountedArg) const noexcept> r5c(c1);
+   VERIFY( r5r(c) == 2 );
+ }
+ 
+ void
+ test02()
+ {
+   // Constructing move_only_function and copyable_function from function_ref,
+   // have not chance to restore manager, so we store function_ref inside.
+   auto f = [](CountedArg const& arg) noexcept { return arg.counter; };
+   std::function_ref<int(CountedArg) const noexcept> r1(f);
+ 
+   std::move_only_function<int(CountedArg) const noexcept> m1(r1);
+   VERIFY( m1(c) == 2 );
+ 
+   std::copyable_function<int(CountedArg) const noexcept> c1(r1);
+   VERIFY( c1(c) == 2 );
+ }
+ 
+ void
+ test03()
+ {
+   struct F
+   {
+     int operator()(CountedArg const& arg) noexcept
+     { return arg.counter; }
+ 
+     int operator()(CountedArg const& arg) const noexcept
+     { return arg.counter + 1000; }
+   };
+ 
+   F f;
+   std::function_ref<int(CountedArg) const> r1(f);
+   VERIFY( r1(c) == 1001 );
+ 
+   // Call const overload as std::function_ref<int(CountedArg) const>
+   // inside std::function_ref<int(CountedArg)> would do.
+   std::function_ref<int(CountedArg)> r2(r1);
+   VERIFY( r2(c) == 1002 );
+   std::move_only_function<int(CountedArg)> m2(r1);
+   VERIFY( m2(c) == 1002 );
+ 
+   // Call non-const overload as const-qualifed operator() for
+   // std::function_ref<int(CountedArg)> do.
+   std::function_ref<int(CountedArg)> r3(f);
+   VERIFY( r3(c) == 1 );
+   std::function_ref<int(CountedArg) const> r4(r3);
+   VERIFY( r4(c) == 2 );
+   std::move_only_function<int(CountedArg) const> m4(r3);
+   VERIFY( m4(c) == 2 );
+ }
+ 
+ void
+ test04()
+ {
+   auto f = [](CountedArg const& arg) noexcept { return arg.counter; };
+   std::function_ref<int(CountedArg)> w1(f);
+   // function_ref stores function_ref due incompatibile signatures
+   std::function_ref<int(CountedArg const&)> w2(std::move(w1));
+   // copy is made when passing to int(CountedArg)
+   VERIFY( w2(c) == 1 );
+   // wrapped 3 times
+   std::function_ref<int(CountedArg)> w3(w2);
+   VERIFY( w3(c) == 2 );
+   // wrapped 4 times
+   std::function_ref<int(CountedArg const&)> w4(w3);
+   VERIFY( w4(c) == 2 );
+   // wrapped 5 times
+   std::function_ref<int(CountedArg)> w5(w4);
+   VERIFY( w5(c) == 3 );
+ }
+ 
+ void
+ test05()
+ {
+   // No special interoperability with std::function
+   auto f = [](CountedArg const& arg) noexcept { return arg.counter; };
+   std::function<int(CountedArg)> f1(f);
+   std::function_ref<int(CountedArg) const> c1(std::move(f1));
+   VERIFY( c1(c) == 2 );
+ 
+   std::function_ref<int(CountedArg) const> c2(f);
+   std::function<int(CountedArg)> f2(c2);
+   VERIFY( f2(c) == 2 );
+ }
+ 
+ void
+ test06()
+ {
+   auto* func = +[]{ static int x; return &x; };
+   std::move_only_function<const void*() const> m1(func);
+   std::function_ref<const void*() const> rm1(m1);
+   VERIFY( m1() == rm1() );
+   std::copyable_function<const void*() const> c1(func);
+   std::function_ref<const void*() const> rc1(c1);
+   VERIFY( c1() == rc1() );
+ 
+   struct Trivial
+   {
+     void const* operator()() const
+     { return this; }
+   };
+   std::move_only_function<const void*() const> m2(Trivial{});
+   std::function_ref<const void*() const> rm2(m2);
+   VERIFY( m2() == rm2() );
+   std::copyable_function<const void*() const> c2(Trivial{});
+   std::function_ref<const void*() const> rc2(c2);
+   VERIFY( c2() == rc2() );
+ 
+   struct NonTrivial : Trivial
+   {
+     NonTrivial() {}
+     NonTrivial(NonTrivial&&) noexcept {}
+     NonTrivial(const NonTrivial&) {}
+   };
+   std::move_only_function<const void*() const> m3(NonTrivial{});
+   std::function_ref<const void*() const> rm3(m3);
+   VERIFY( m3() == rm3() );
+   std::copyable_function<const void*() const> c3(NonTrivial{});
+   std::function_ref<const void*() const> rc3(c3);
+   VERIFY( c3() == rc3() );
+ 
+   struct Large : Trivial
+   {
+     int tab[10];
+   };
+   std::move_only_function<const void*() const> m4(Large{});
+   std::function_ref<const void*() const> rm4(m4);
+   VERIFY( m4() == rm4() );
+   std::copyable_function<const void*() const> c4(Large{});
+   std::function_ref<const void*() const> rc4(c4);
+   VERIFY( c4() == rc4() );
+ }
+ 
+ void
+ test07()
+ {
+   int (*f1)() = [] { return 1; };
+   int (*f2)() = [] { return 2; };
+ 
+   std::function_ref<int() const> r1(f1);
+   std::move_only_function<int() const> m1(f1);
+   std::copyable_function<int() const> c1(f1);
+ 
+   std::function_ref<int() const> r2r(r1);
+   VERIFY( r2r() == 1 );
+   r1 = f2;
+   VERIFY( r2r() == 1 ); // same-siganture, copy constructor is used
+ 		
+   std::function_ref<int() const> r2m(m1);
+   VERIFY( r2m() == 1 );
+   m1 = f2;
+   VERIFY( r2m() == 2 );
+ 			
+   std::function_ref<int() const> r2c(c1);
+   VERIFY( r2c() == 1 );
+   c1 = f2;
+   VERIFY( r2c() == 2 );
+ 
+   std::function_ref<int()> r3r(r1);
+   VERIFY( r3r() == 2 );
+   r1 = f1;
+   VERIFY( r3r() == 1 ); // converting-constructor
+ 
+   std::function_ref<int()> r3m(m1);
+   VERIFY( r3m() == 2 );
+   m1 = f1;
+   VERIFY( r3m() == 1 );
+ 
+   std::function_ref<int()> r3c(c1);
+   VERIFY( r3c() == 2 );
+   c1 = f1;
+   VERIFY( r3c() == 1 );
+ 
+ }
+ 
+ constexpr bool
+ test08()
+ {
+   auto f = [](int x) noexcept { return x; };
+   std::function_ref<int(int) const noexcept> rf(f);
+ 
+   std::function_ref<int(int) const noexcept> rr1(rf);
+   std::function_ref<int(int)> rr2(rf);
+   std::function_ref<int(long)> rr3(rf);
+   return true;
+ };
+ 
+ 
+ int main()
+ {
+   test01();
+   test02();
+   test03();
+   test04();
+   test05();
+   test06();
+   test07();
+ 
+   static_assert( test08() );
+ }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/20_util/function_ref/deduction.cc gcc-16-20250601/libstdc++-v3/testsuite/20_util/function_ref/deduction.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/20_util/function_ref/deduction.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/20_util/function_ref/deduction.cc	Sun Jun  1 22:32:42 2025
***************
*** 0 ****
--- 1,103 ----
+ // { dg-do compile { target c++26 } }
+ 
+ #include <functional>
+ #include <type_traits>
+ 
+ using std::is_same_v;
+ using std::nontype;
+ using std::nontype_t;
+ using std::function_ref;
+ 
+ int i = 0;
+ 
+ void f0();
+ void f0n() noexcept;
+ 
+ static_assert( is_same_v<decltype(function_ref(f0)),
+ 			 function_ref<void()>> );
+ static_assert( is_same_v<decltype(function_ref(f0n)),
+ 			 function_ref<void() noexcept>> );
+ static_assert( is_same_v<decltype(function_ref(nontype<f0>)),
+ 			 function_ref<void()>> );
+ static_assert( is_same_v<decltype(function_ref(nontype<f0n>)),
+ 			 function_ref<void() noexcept>> );
+ 
+ void f1(int);
+ void f1n(int) noexcept;
+ 
+ static_assert( is_same_v<decltype(function_ref(f1)),
+ 			 function_ref<void(int)>> );
+ static_assert( is_same_v<decltype(function_ref(f1n)),
+ 			 function_ref<void(int) noexcept>> );
+ static_assert( is_same_v<decltype(function_ref(nontype<f1>)),
+ 			 function_ref<void(int)>> );
+ static_assert( is_same_v<decltype(function_ref(nontype<f1n>)),
+ 			 function_ref<void(int) noexcept>> );
+ static_assert( is_same_v<decltype(function_ref(nontype<f1>, i)),
+ 			 function_ref<void()>> );
+ static_assert( is_same_v<decltype(function_ref(nontype<f1n>, i)),
+ 			 function_ref<void() noexcept>> );
+ 
+ void f2(int*, int);
+ void f2n(int*, int) noexcept;
+ 
+ static_assert( is_same_v<decltype(function_ref(f2)),
+ 			 function_ref<void(int*, int)>> );
+ static_assert( is_same_v<decltype(function_ref(f2n)),
+ 			 function_ref<void(int*, int) noexcept>> );
+ static_assert( is_same_v<decltype(function_ref(nontype<f2>)),
+ 			 function_ref<void(int*, int)>> );
+ static_assert( is_same_v<decltype(function_ref(nontype<f2n>)),
+ 			 function_ref<void(int*, int) noexcept>> );
+ static_assert( is_same_v<decltype(function_ref(nontype<f2>, &i)),
+ 			 function_ref<void(int)>> );
+ static_assert( is_same_v<decltype(function_ref(nontype<f2n>, &i)),
+ 			 function_ref<void(int) noexcept>> );
+ 
+ struct S
+ {
+   int mem;
+   int f();
+   int fn() noexcept;
+ 
+   int fc(int) const;
+   int fcn(int) const noexcept;
+ 
+   int fl(int) &;
+   int fln(int) & noexcept;
+ 
+   int fcl(float) const&;
+   int fcln(float) const& noexcept;
+ };
+ S s{};
+ const S cs{};
+ 
+ static_assert( is_same_v<decltype(function_ref(nontype<&S::mem>, s)),
+ 			 function_ref<int&()>> );
+ static_assert( is_same_v<decltype(function_ref(nontype<&S::mem>, cs)),
+ 			 function_ref<const int&()>> );
+ static_assert( is_same_v<decltype(function_ref(nontype<&S::mem>, &s)),
+ 			 function_ref<int&()>> );
+ static_assert( is_same_v<decltype(function_ref(nontype<&S::mem>, &cs)),
+ 			 function_ref<const int&()>> );
+ 
+ static_assert( is_same_v<decltype(function_ref(nontype<&S::f>, s)),
+ 			 function_ref<int()>> );
+ static_assert( is_same_v<decltype(function_ref(nontype<&S::fn>, &s)),
+ 			 function_ref<int() noexcept>> );
+ 
+ static_assert( is_same_v<decltype(function_ref(nontype<&S::fc>, &s)),
+ 			 function_ref<int(int)>> );
+ static_assert( is_same_v<decltype(function_ref(nontype<&S::fcn>, s)),
+ 			 function_ref<int(int) noexcept>> );
+ 
+ static_assert( is_same_v<decltype(function_ref(nontype<&S::fl>, &s)),
+ 			 function_ref<int(int)>> );
+ static_assert( is_same_v<decltype(function_ref(nontype<&S::fln>, s)),
+ 			 function_ref<int(int) noexcept>> );
+ 
+ static_assert( is_same_v<decltype(function_ref(nontype<&S::fcl>, s)),
+ 			 function_ref<int(float)>> );
+ static_assert( is_same_v<decltype(function_ref(nontype<&S::fcln>, &s)),
+ 			 function_ref<int(float) noexcept>> );
+ 
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/20_util/function_ref/mutation.cc gcc-16-20250601/libstdc++-v3/testsuite/20_util/function_ref/mutation.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/20_util/function_ref/mutation.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/20_util/function_ref/mutation.cc	Sun Jun  1 22:32:42 2025
***************
*** 0 ****
--- 1,85 ----
+ // { dg-do run { target c++26 } }
+ 
+ #include <functional>
+ #include <testsuite_hooks.h>
+ 
+ using std::nontype;
+ using std::function_ref;
+ 
+ void
+ test01()
+ {
+   struct F {
+     int v;
+     int operator()() { return v; }
+   };
+   F f1{2}, f2{5};
+ 
+   function_ref<int()> r1(f1);
+   function_ref<long()> r2(f1);
+ 
+   VERIFY( r1() == 2 );
+   VERIFY( r2() == 2 );
+ 
+   f1.v = 10;
+ 
+   VERIFY( r1() == 10 );
+   VERIFY( r2() == 10 );
+ 
+   r1 = function_ref<int()>(f2);
+   r2 = function_ref<long()>(f2);
+ 
+   VERIFY( r1() == 5 );
+   VERIFY( r2() == 5 );
+ 
+   f2.v = 13;
+ 
+   VERIFY( r1() == 13 );
+   VERIFY( r2() == 13 );
+ 
+   r1 = function_ref<int()>(f1);
+   r2 = function_ref<long()>(f1);
+ 
+   f1.v = 20;
+   VERIFY( r1() == 20 );
+   VERIFY( r2() == 20 );
+ }
+ 
+ void
+ test02()
+ {
+   struct S 
+   {
+     int x;
+     int f() { return x; };
+   };
+   S s{10};
+ 
+   function_ref<int()> r1(nontype<&S::x>, s);
+   function_ref<long()> r2(nontype<&S::x>, &s);
+ 
+   VERIFY( r1() == 10 );
+   VERIFY( r2() == 10 );
+ 
+   s.x = 20;
+ 
+   VERIFY( r1() == 20 );
+   VERIFY( r2() == 20 );
+ 
+   r1 = function_ref<int()>(nontype<&S::f>, &s);
+   r2 = function_ref<long()>(nontype<&S::f>, s);
+ 
+   VERIFY( r1() == 20 );
+   VERIFY( r2() == 20 );
+ 
+   s.x = 30;
+ 
+   VERIFY( r1() == 30 );
+   VERIFY( r2() == 30 );
+ }
+ 
+ int main()
+ {
+   test01();
+   test02();
+ }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/22_locale/num_put/put/char/lwg4084.cc gcc-16-20250601/libstdc++-v3/testsuite/22_locale/num_put/put/char/lwg4084.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/22_locale/num_put/put/char/lwg4084.cc	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/22_locale/num_put/put/char/lwg4084.cc	Sun Jun  1 22:32:43 2025
*************** test_nan()
*** 20,26 ****
--- 20,30 ----
    out << ' ' << nan << ' ' << -nan;
    out << std::showpos;
    out << ' ' << nan << ' ' << -nan;
+ #ifdef _AIX // non-conforming
+   VERIFY( out.str() == " NaNQ -NaNQ NaNQ -NaNQ NaNQ -NaNQ +NaNQ -NaNQ" );
+ #else
    VERIFY( out.str() == " nan -nan NAN -NAN NAN -NAN +NAN -NAN" );
+ #endif
  }
  
  void
*************** test_inf()
*** 36,42 ****
--- 40,50 ----
    out << ' ' << inf << ' ' << -inf;
    out << std::showpos;
    out << ' ' << inf << ' ' << -inf;
+ #ifdef _AIX // non-conforming
+   VERIFY( out.str() == " INF -INF INF -INF INF -INF +INF -INF" );
+ #else
    VERIFY( out.str() == " inf -inf INF -INF INF -INF +INF -INF" );
+ #endif
  }
  
  int main()
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/23_containers/deque/capacity/shrink_to_fit.cc gcc-16-20250601/libstdc++-v3/testsuite/23_containers/deque/capacity/shrink_to_fit.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/23_containers/deque/capacity/shrink_to_fit.cc	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/23_containers/deque/capacity/shrink_to_fit.cc	Sun Jun  1 22:32:43 2025
***************
*** 1,6 ****
  // { dg-do run { target c++11 } }
  // { dg-require-effective-target std_allocator_new }
- // { dg-xfail-run-if "AIX operator new" { powerpc-ibm-aix* } }
  
  // 2010-01-08  Paolo Carlini  <paolo.carlini@oracle.com>
  
--- 1,5 ----
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/23_containers/flat_map/1.cc gcc-16-20250601/libstdc++-v3/testsuite/23_containers/flat_map/1.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/23_containers/flat_map/1.cc	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/23_containers/flat_map/1.cc	Sun Jun  1 22:32:43 2025
*************** void
*** 247,254 ****
  test07()
  {
    // PR libstdc++/119427 - std::erase_if(std::flat_foo) does not work
    std::flat_map<int, int> m = {std::pair{1, 2}, {3, 4}, {5, 6}};
!   auto n = std::erase_if(m, [](auto x) { auto [k,v] = x; return k == 1 || v == 6; });
    VERIFY( n == 2 );
    VERIFY( std::ranges::equal(m, (std::pair<int,int>[]){{3,4}}) );
  }
--- 247,255 ----
  test07()
  {
    // PR libstdc++/119427 - std::erase_if(std::flat_foo) does not work
+   // PR libstdc++/120465 - erase_if for flat_map calls predicate with incorrect type
    std::flat_map<int, int> m = {std::pair{1, 2}, {3, 4}, {5, 6}};
!   auto n = std::erase_if(m, [](auto x) { return x.first == 1 || x.second == 6; });
    VERIFY( n == 2 );
    VERIFY( std::ranges::equal(m, (std::pair<int,int>[]){{3,4}}) );
  }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/23_containers/flat_multimap/1.cc gcc-16-20250601/libstdc++-v3/testsuite/23_containers/flat_multimap/1.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/23_containers/flat_multimap/1.cc	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/23_containers/flat_multimap/1.cc	Sun Jun  1 22:32:43 2025
*************** void
*** 225,232 ****
  test07()
  {
    // PR libstdc++/119427 - std::erase_if(std::flat_foo) does not work
    std::flat_multimap<int, int> m = {std::pair{1, 2}, {3, 4}, {3, 3}, {5, 6}, {6, 6}};
!   auto n = std::erase_if(m, [](auto x) { auto [k,v] = x; return k == 1 || v == 6; });
    VERIFY( n == 3 );
    VERIFY( std::ranges::equal(m, (std::pair<int,int>[]){{3,4},{3,3}}) );
  }
--- 225,233 ----
  test07()
  {
    // PR libstdc++/119427 - std::erase_if(std::flat_foo) does not work
+   // PR libstdc++/120465 - erase_if for flat_map calls predicate with incorrect type
    std::flat_multimap<int, int> m = {std::pair{1, 2}, {3, 4}, {3, 3}, {5, 6}, {6, 6}};
!   auto n = std::erase_if(m, [](auto x) { return x.first == 1 || x.second == 6; });
    VERIFY( n == 3 );
    VERIFY( std::ranges::equal(m, (std::pair<int,int>[]){{3,4},{3,3}}) );
  }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_default.cc gcc-16-20250601/libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_default.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_default.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_default.cc	Sun Jun  1 22:32:43 2025
***************
*** 0 ****
--- 1,41 ----
+ // { dg-do run { target c++23 } }
+ #include <mdspan>
+ 
+ #include <cstdint>
+ #include <testsuite_hooks.h>
+ 
+ constexpr auto dyn = std::dynamic_extent;
+ 
+ template<typename Extents>
+   constexpr void
+   test_default_ctor()
+   {
+     Extents exts;
+     for(size_t i = 0; i < Extents::rank(); ++i)
+       if(exts.static_extent(i) == std::dynamic_extent)
+ 	VERIFY(exts.extent(i) == 0);
+       else
+ 	VERIFY(exts.extent(i) == Extents::static_extent(i));
+   }
+ 
+ constexpr bool
+ test_default_ctor_all()
+ {
+   test_default_ctor<std::extents<int, 1>>();
+   test_default_ctor<std::extents<int, dyn>>();
+   test_default_ctor<std::extents<int, 1, 2>>();
+   test_default_ctor<std::extents<int, dyn, 2>>();
+   test_default_ctor<std::extents<int, dyn, dyn>>();
+   test_default_ctor<std::extents<int, 1, 2, 3>>();
+   test_default_ctor<std::extents<int, dyn, 2, dyn>>();
+   test_default_ctor<std::extents<int, dyn, dyn, dyn>>();
+   return true;
+ }
+ 
+ int
+ main()
+ {
+   test_default_ctor_all();
+   static_assert(test_default_ctor_all());
+   return 0;
+ }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/23_containers/unordered_map/96088.cc gcc-16-20250601/libstdc++-v3/testsuite/23_containers/unordered_map/96088.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/23_containers/unordered_map/96088.cc	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/23_containers/unordered_map/96088.cc	Sun Jun  1 22:32:43 2025
***************
*** 1,6 ****
  // { dg-do run { target c++17 } }
  // { dg-require-effective-target std_allocator_new }
! // { dg-xfail-run-if "AIX operator new" { powerpc-ibm-aix* } }
  
  // Copyright (C) 2021-2025 Free Software Foundation, Inc.
  //
--- 1,6 ----
  // { dg-do run { target c++17 } }
  // { dg-require-effective-target std_allocator_new }
! // { dg-require-effective-target c++20 { target powerpc-ibm-aix* } }
  
  // Copyright (C) 2021-2025 Free Software Foundation, Inc.
  //
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/23_containers/unordered_multimap/96088.cc gcc-16-20250601/libstdc++-v3/testsuite/23_containers/unordered_multimap/96088.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/23_containers/unordered_multimap/96088.cc	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/23_containers/unordered_multimap/96088.cc	Sun Jun  1 22:32:43 2025
***************
*** 1,6 ****
  // { dg-do run { target c++17 } }
  // { dg-require-effective-target std_allocator_new }
! // { dg-xfail-run-if "AIX operator new" { powerpc-ibm-aix* } }
  
  // Copyright (C) 2021-2025 Free Software Foundation, Inc.
  //
--- 1,6 ----
  // { dg-do run { target c++17 } }
  // { dg-require-effective-target std_allocator_new }
! // { dg-require-effective-target c++20 { target powerpc-ibm-aix* } }
  
  // Copyright (C) 2021-2025 Free Software Foundation, Inc.
  //
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/23_containers/unordered_multiset/96088.cc gcc-16-20250601/libstdc++-v3/testsuite/23_containers/unordered_multiset/96088.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/23_containers/unordered_multiset/96088.cc	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/23_containers/unordered_multiset/96088.cc	Sun Jun  1 22:32:43 2025
***************
*** 1,6 ****
  // { dg-do run { target c++17 } }
  // { dg-require-effective-target std_allocator_new }
! // { dg-xfail-run-if "AIX operator new" { powerpc-ibm-aix* } }
  
  // Copyright (C) 2021-2025 Free Software Foundation, Inc.
  //
--- 1,6 ----
  // { dg-do run { target c++17 } }
  // { dg-require-effective-target std_allocator_new }
! // { dg-require-effective-target c++20 { target powerpc-ibm-aix* } }
  
  // Copyright (C) 2021-2025 Free Software Foundation, Inc.
  //
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/23_containers/unordered_set/96088.cc gcc-16-20250601/libstdc++-v3/testsuite/23_containers/unordered_set/96088.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/23_containers/unordered_set/96088.cc	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/23_containers/unordered_set/96088.cc	Sun Jun  1 22:32:43 2025
***************
*** 1,6 ****
  // { dg-do run { target c++17 } }
  // { dg-require-effective-target std_allocator_new }
! // { dg-xfail-run-if "AIX operator new" { powerpc-ibm-aix* } }
  
  // Copyright (C) 2021-2025 Free Software Foundation, Inc.
  //
--- 1,6 ----
  // { dg-do run { target c++17 } }
  // { dg-require-effective-target std_allocator_new }
! // { dg-require-effective-target c++20 { target powerpc-ibm-aix* } }
  
  // Copyright (C) 2021-2025 Free Software Foundation, Inc.
  //
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/24_iterators/operations/prev_neg.cc gcc-16-20250601/libstdc++-v3/testsuite/24_iterators/operations/prev_neg.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/24_iterators/operations/prev_neg.cc	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/24_iterators/operations/prev_neg.cc	Sun Jun  1 22:32:43 2025
*************** test02()
*** 38,42 ****
  {
    const Y array[1] = { };
    (void) std::prev(array + 1);
!   // { dg-error "forward_iterator" "" { target *-*-* } 241 }
  }
--- 38,42 ----
  {
    const Y array[1] = { };
    (void) std::prev(array + 1);
!   // { dg-error "forward_iterator" "" { target *-*-* } 242 }
  }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/26_numerics/headers/cmath/82644.cc gcc-16-20250601/libstdc++-v3/testsuite/26_numerics/headers/cmath/82644.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/26_numerics/headers/cmath/82644.cc	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/26_numerics/headers/cmath/82644.cc	Sun Jun  1 22:32:45 2025
***************
*** 15,22 ****
  // with this library; see the file COPYING3.  If not see
  // <http://www.gnu.org/licenses/>.
  
! // { dg-options "-D__STDCPP_WANT_MATH_SPEC_FUNCS__ -D__STRICT_ANSI__" }
  // { dg-do compile { target c++11 } }
  
  #define conf_hyperg 1
  #define conf_hypergf 2
--- 15,23 ----
  // with this library; see the file COPYING3.  If not see
  // <http://www.gnu.org/licenses/>.
  
! // { dg-options "-D__STDCPP_WANT_MATH_SPEC_FUNCS__" }
  // { dg-do compile { target c++11 } }
+ // // { dg-add-options strict_std }
  
  #define conf_hyperg 1
  #define conf_hypergf 2
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/abs128.cc gcc-16-20250601/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/abs128.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/abs128.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/abs128.cc	Sun Jun  1 22:32:45 2025
***************
*** 0 ****
--- 1,16 ----
+ // { dg-do compile }
+ // { dg-add-options strict_std }
+ 
+ #include <cstdlib>
+ 
+ template<typename T> T same_type(T, T) { return T(); }
+ 
+ #ifdef __SIZEOF_INT128__
+ __int128 i = 0;
+ __int128 j = same_type(std::abs(i), i);
+ #endif
+ 
+ #ifdef __SIZEOF_FLOAT128__
+ __float128 f = 0.0;
+ __float128 g = same_type(std::abs(f), f);
+ #endif
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/100334.cc gcc-16-20250601/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/100334.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/100334.cc	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/100334.cc	Sun Jun  1 22:32:47 2025
*************** int
*** 47,62 ****
  main()
  {
    // all atomic share the same waiter
- //  atomics_sharing_same_waiter<char> atomics;
    atomics_sharing_same_waiter<char> atomics;
    for (auto& atom : atomics.a)
    {
      atom->store(0);
    }
  
!   auto a = &std::__detail::__waiter_pool_base::_S_for(reinterpret_cast<char *>(atomics.a[0]));
!   auto b = &std::__detail::__waiter_pool_base::_S_for(reinterpret_cast<char *>(atomics.a[1]));
    VERIFY( a == b );
  
    auto fut0 = std::async(std::launch::async, [&] { atomics.a[0]->wait(0); });
    auto fut1 = std::async(std::launch::async, [&] { atomics.a[1]->wait(0); });
--- 47,63 ----
  main()
  {
    // all atomic share the same waiter
    atomics_sharing_same_waiter<char> atomics;
    for (auto& atom : atomics.a)
    {
      atom->store(0);
    }
  
! #if 0
!   auto a = &std::__detail::__waitable_state::_S_state_for((void*)(atomics.a[0]));
!   auto b = &std::__detail::__waitable_state::_S_state_for((void*)(atomics.a[1]));
    VERIFY( a == b );
+ #endif
  
    auto fut0 = std::async(std::launch::async, [&] { atomics.a[0]->wait(0); });
    auto fut1 = std::async(std::launch::async, [&] { atomics.a[1]->wait(0); });
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/29_atomics/atomic_integral/wait_notify.cc gcc-16-20250601/libstdc++-v3/testsuite/29_atomics/atomic_integral/wait_notify.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/29_atomics/atomic_integral/wait_notify.cc	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/29_atomics/atomic_integral/wait_notify.cc	Sun Jun  1 22:32:47 2025
*************** template<typename Tp>
*** 33,44 ****
      std::atomic<Tp> a{ Tp(1) };
      VERIFY( a.load() == Tp(1) );
      a.wait( Tp(0) );
      std::thread t([&]
        {
!         a.store(Tp(0));
!         a.notify_one();
        });
      a.wait(Tp(1));
      t.join();
    }
  
--- 33,48 ----
      std::atomic<Tp> a{ Tp(1) };
      VERIFY( a.load() == Tp(1) );
      a.wait( Tp(0) );
+     std::atomic<bool> b{false};
      std::thread t([&]
        {
! 	b.store(true, std::memory_order_relaxed);
! 	a.store(Tp(0));
! 	a.notify_one();
        });
      a.wait(Tp(1));
+     // Ensure we actually waited until a.store(0) happened:
+     VERIFY( b.load(std::memory_order_relaxed) );
      t.join();
    }
  
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/30_threads/barrier/cons.cc gcc-16-20250601/libstdc++-v3/testsuite/30_threads/barrier/cons.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/30_threads/barrier/cons.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/30_threads/barrier/cons.cc	Sun Jun  1 22:32:48 2025
***************
*** 0 ****
--- 1,6 ----
+ // { dg-do compile { target c++20 } }
+ 
+ #include <barrier>
+ 
+ // PR 118395 Constructor of std::barrier is not constexpr
+ constinit std::barrier<> b(std::barrier<>::max());
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/30_threads/barrier/lwg3898.cc gcc-16-20250601/libstdc++-v3/testsuite/30_threads/barrier/lwg3898.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/30_threads/barrier/lwg3898.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/30_threads/barrier/lwg3898.cc	Sun Jun  1 22:32:48 2025
***************
*** 0 ****
--- 1,45 ----
+ // { dg-do run { target c++20 } }
+ // { dg-require-effective-target gthreads }
+ 
+ #include <barrier>
+ #include <exception>
+ #include <cstdlib>
+ #if !_GLIBCXX_USE_C99_STDLIB && defined _GLIBCXX_HAVE_UNISTD_H
+ # include <unistd.h>
+ #endif
+ 
+ void handle_terminate()
+ {
+ #if _GLIBCXX_USE_C99_STDLIB
+   std::_Exit(0);
+ #elif defined _GLIBCXX_HAVE_UNISTD_H
+   _exit(0);
+ #else
+   std::exit(0);
+ #endif
+ }
+ 
+ struct F
+ {
+   void operator()()
+   {
+     std::set_terminate(handle_terminate);
+     throw 1;
+   }
+ };
+ 
+ void
+ test_lwg3898()
+ {
+   std::barrier<F> b(1, F{});
+   // This should call the terminate handler and exit with zero status:
+   b.arrive_and_wait();
+   // Should not reach here:
+   std::abort();
+ }
+ 
+ int
+ main()
+ {
+   test_lwg3898();
+ }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/30_threads/semaphore/100806.cc gcc-16-20250601/libstdc++-v3/testsuite/30_threads/semaphore/100806.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/30_threads/semaphore/100806.cc	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/30_threads/semaphore/100806.cc	Sun Jun  1 22:32:48 2025
***************
*** 12,18 ****
  #include <chrono>
  #include <vector>
  
! std::counting_semaphore<4> semaphore{6};
  
  std::mutex mtx;
  std::vector<std::string> results;
--- 12,18 ----
  #include <chrono>
  #include <vector>
  
! std::counting_semaphore<6> semaphore{6};
  
  std::mutex mtx;
  std::vector<std::string> results;
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/30_threads/semaphore/cons.cc gcc-16-20250601/libstdc++-v3/testsuite/30_threads/semaphore/cons.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/30_threads/semaphore/cons.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/30_threads/semaphore/cons.cc	Sun Jun  1 22:32:48 2025
***************
*** 0 ****
--- 1,7 ----
+ // { dg-do compile { target c++20 } }
+ 
+ #include <semaphore>
+ 
+ // PR 110854 Constructor of std::counting_semaphore is not constexpr
+ constinit std::binary_semaphore b(0);
+ constinit std::counting_semaphore<5> c(2);
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/30_threads/semaphore/platform_try_acquire_for.cc gcc-16-20250601/libstdc++-v3/testsuite/30_threads/semaphore/platform_try_acquire_for.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/30_threads/semaphore/platform_try_acquire_for.cc	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/30_threads/semaphore/platform_try_acquire_for.cc	Thu Jan  1 00:00:00 1970
***************
*** 1,9 ****
- // { dg-options "-D_GLIBCXX_USE_POSIX_SEMAPHORE" }
- // { dg-do run { target c++20 } }
- // { dg-additional-options "-pthread" { target pthread } }
- // { dg-require-gthreads "" }
- // { dg-add-options libatomic }
- 
- #include "try_acquire_for.cc"
- 
- // { dg-prune-output "ignoring _GLIBCXX_USE_POSIX_SEMAPHORE" }
--- 0 ----
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/30_threads/semaphore/try_acquire_posix.cc gcc-16-20250601/libstdc++-v3/testsuite/30_threads/semaphore/try_acquire_posix.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/30_threads/semaphore/try_acquire_posix.cc	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/30_threads/semaphore/try_acquire_posix.cc	Thu Jan  1 00:00:00 1970
***************
*** 1,153 ****
- // Copyright (C) 2020-2025 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library.  This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 3, or (at your option)
- // any later version.
- 
- // This library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- // GNU General Public License for more details.
- 
- // You should have received a copy of the GNU General Public License along
- // with this library; see the file COPYING3.  If not see
- // <http://www.gnu.org/licenses/>.
- 
- // { dg-do run { target c++20 } }
- // { dg-additional-options "-pthread" { target pthread } }
- // { dg-require-gthreads "" }
- // { dg-add-options libatomic }
- 
- #include <semaphore>
- #ifdef _GLIBCXX_HAVE_POSIX_SEMAPHORE
- #include <chrono>
- #include <thread>
- #include <atomic>
- #include <testsuite_hooks.h>
- 
- void test01()
- {
-   using namespace std::chrono_literals;
-   std::__platform_semaphore s(2);
-   s._M_acquire();
- 
-   auto const dur = 250ms;
-   {
-     auto const t0 = std::chrono::steady_clock::now();
-     VERIFY( s._M_try_acquire_for(dur) );
-     auto const diff = std::chrono::steady_clock::now() - t0;
-     VERIFY( diff < dur );
-   }
- 
-   {
-     auto const t0 = std::chrono::steady_clock::now();
-     VERIFY( !s._M_try_acquire_for(dur) );
-     auto const diff = std::chrono::steady_clock::now() - t0;
-     VERIFY( diff >= dur );
-   }
- }
- 
- void test02()
- {
-   using namespace std::chrono_literals;
-   std::__platform_semaphore s(1);
-   std::atomic<int> a(0), b(0);
-   std::thread t([&] {
-     a.wait(0);
-     auto const dur = 250ms;
-     VERIFY( !s._M_try_acquire_for(dur) );
-     b++;
-     b.notify_one();
- 
-     a.wait(1);
-     VERIFY( s._M_try_acquire_for(dur) );
-     b++;
-     b.notify_one();
-   });
-   t.detach();
- 
-   s._M_acquire();
-   a++;
-   a.notify_one();
-   b.wait(0);
-   s._M_release(1);
-   a++;
-   a.notify_one();
- 
-   b.wait(1);
- }
- 
- void test03()
- {
-   using namespace std::chrono_literals;
-   std::__platform_semaphore s(2);
-   s._M_acquire();
- 
-   auto const dur = 250ms;
-   {
-     auto const at = std::chrono::system_clock::now() + dur;
-     auto const t0 = std::chrono::steady_clock::now();
-     VERIFY( s._M_try_acquire_until(at) );
-     auto const diff = std::chrono::steady_clock::now() - t0;
-     VERIFY( diff < dur );
-   }
- 
-   {
-     auto const at = std::chrono::system_clock::now() + dur;
-     auto const t0 = std::chrono::steady_clock::now();
-     VERIFY( !s._M_try_acquire_until(at) );
-     auto const diff = std::chrono::steady_clock::now() - t0;
-     VERIFY( diff >= dur );
-   }
- }
- 
- void test04()
- {
-   using namespace std::chrono_literals;
-   std::__platform_semaphore s(1);
-   std::atomic<int> a(0), b(0);
-   std::thread t([&] {
-     a.wait(0);
-     auto const dur = 250ms;
-     {
-       auto const at = std::chrono::system_clock::now() + dur;
-       VERIFY( !s._M_try_acquire_until(at) );
- 
-       b++;
-       b.notify_one();
-     }
- 
-     a.wait(1);
-     {
-       auto const at = std::chrono::system_clock::now() + dur;
-       VERIFY( s._M_try_acquire_until(at) );
-     }
-     b++;
-     b.notify_one();
-   });
-   t.detach();
- 
-   s._M_acquire();
-   a++;
-   a.notify_one();
-   b.wait(0);
-   s._M_release(1);
-   a++;
-   a.notify_one();
- 
-   b.wait(1);
- }
- #endif
- 
- int main()
- {
- #ifdef _GLIBCXX_HAVE_POSIX_SEMAPHORE
-   test01();
-   test02();
-   test03();
-   test04();
- #endif
-   return 0;
- }
--- 0 ----
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/experimental/names.cc gcc-16-20250601/libstdc++-v3/testsuite/experimental/names.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/experimental/names.cc	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/experimental/names.cc	Sun Jun  1 22:32:48 2025
***************
*** 22,27 ****
--- 22,33 ----
  // naming variables, parameters etc. in the library.
  
  #include "../17_intro/names.cc"
+ 
+ #ifdef _AIX
+ // <netdb.h> declares endnetgrent_r with ptr parameter.
+ # undef ptr
+ #endif
+ 
  // Filesystem
  #if __has_include(<experimental/filesystem>)
  # include <experimental/filesystem>
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/std/format/debug.cc gcc-16-20250601/libstdc++-v3/testsuite/std/format/debug.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/std/format/debug.cc	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/std/format/debug.cc	Sun Jun  1 22:32:49 2025
***************
*** 1,6 ****
--- 1,7 ----
  // { dg-options "-fexec-charset=UTF-8 -fwide-exec-charset=UTF-32LE -DUNICODE_ENC" { target le } }
  // { dg-options "-fexec-charset=UTF-8 -fwide-exec-charset=UTF-32BE -DUNICODE_ENC" { target be } }
  // { dg-do run { target c++23 } }
+ // { dg-require-effective-target 4byte_wchar_t }
  // { dg-add-options no_pch }
  // { dg-timeout-factor 2 }
  
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/std/format/functions/format.cc gcc-16-20250601/libstdc++-v3/testsuite/std/format/functions/format.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/std/format/functions/format.cc	Sun May 25 22:32:17 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/std/format/functions/format.cc	Sun Jun  1 22:32:49 2025
***************
*** 1,6 ****
--- 1,7 ----
  // { dg-options "-fexec-charset=UTF-8" }
  // { dg-do run { target c++20 } }
  // { dg-add-options no_pch }
+ // { dg-additional-options "-DUNICODE" { target 4byte_wchar_t } }
  
  #include <format>
  
*************** test_bool()
*** 511,516 ****
--- 512,518 ----
  void
  test_unicode()
  {
+ #ifdef UNICODE
    // Similar to sC example in test_std_examples, but not from the standard.
    // Verify that the character "🤡" has estimated field width 2,
    // rather than estimated field width equal to strlen("🤡"), which would be 4,
*************** test_unicode()
*** 564,569 ****
--- 566,572 ----
      std::string sA = std::format("{:>5}", input[0]);
      VERIFY( sA == input[1] );
    }
+ #endif
  }
  
  int main()
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/std/memory/indirect/copy.cc gcc-16-20250601/libstdc++-v3/testsuite/std/memory/indirect/copy.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/std/memory/indirect/copy.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/std/memory/indirect/copy.cc	Sun Jun  1 22:32:49 2025
***************
*** 0 ****
--- 1,121 ----
+ // { dg-do run { target c++26 } }
+ 
+ #include <memory>
+ #include <scoped_allocator>
+ #include <utility>
+ #include <vector>
+ 
+ #include <testsuite_hooks.h>
+ #include <testsuite_allocator.h>
+ 
+ using __gnu_test::tracker_allocator;
+ using Counter = __gnu_test::tracker_allocator_counter;
+ using Vector = std::vector<int>;
+ using Indirect = std::indirect<Vector, tracker_allocator<Vector>>;
+ const Indirect src(std::in_place, {1, 2, 3});
+ 
+ constexpr void
+ test_ctor()
+ {
+   Counter::reset();
+   Indirect i1(src);
+   VERIFY( *i1 == *src );
+   VERIFY( &*i1 != &*src );
+   VERIFY( Counter::get_allocation_count() == sizeof(Vector) );
+   VERIFY( Counter::get_deallocation_count() == 0 );
+   VERIFY( Counter::get_construct_count() == 1 );
+   VERIFY( Counter::get_destruct_count() == 0 );
+ 
+   Counter::reset();
+   Indirect i2(std::allocator_arg, {}, src);
+   VERIFY( *i2 == *src );
+   VERIFY( &*i2 != &*src );
+   VERIFY( Counter::get_allocation_count() == sizeof(Vector) );
+   VERIFY( Counter::get_deallocation_count() == 0 );
+   VERIFY( Counter::get_construct_count() == 1 );
+   VERIFY( Counter::get_destruct_count() == 0 );
+ }
+ 
+ constexpr void
+ test_assign()
+ {
+   Indirect i1;
+   Counter::reset();
+ 
+   i1 = src;
+   VERIFY( *i1 == *src );
+   VERIFY( &*i1 != &*src );
+   VERIFY( Counter::get_allocation_count() == 0 );
+   VERIFY( Counter::get_deallocation_count() == 0 );
+   VERIFY( Counter::get_construct_count() == 0 );
+   VERIFY( Counter::get_destruct_count() == 0 );
+ 
+   auto(std::move(i1));
+   Counter::reset();
+ 
+   i1 = src;
+   VERIFY( *i1 == *src );
+   VERIFY( &*i1 != &*src );
+   VERIFY( Counter::get_allocation_count() == sizeof(Vector) );
+   VERIFY( Counter::get_deallocation_count() == 0 );
+   VERIFY( Counter::get_construct_count() == 1 );
+   VERIFY( Counter::get_destruct_count() == 0 );
+ }
+ 
+ constexpr void
+ test_valueless()
+ {
+   Indirect e;
+   auto(std::move(e));
+   VERIFY( e.valueless_after_move() );
+ 
+   Counter::reset();
+   Indirect i1(e);
+   VERIFY( i1.valueless_after_move() );
+   VERIFY( Counter::get_allocation_count() == 0 );
+   VERIFY( Counter::get_deallocation_count() == 0 );
+   VERIFY( Counter::get_construct_count() == 0 );
+   VERIFY( Counter::get_destruct_count() == 0 );
+ 
+   Indirect i2(std::allocator_arg, {}, e);
+   VERIFY( i2.valueless_after_move() );
+   VERIFY( Counter::get_allocation_count() == 0 );
+   VERIFY( Counter::get_deallocation_count() == 0 );
+   VERIFY( Counter::get_construct_count() == 0 );
+   VERIFY( Counter::get_destruct_count() == 0 );
+ 
+   Indirect i3(src);
+   Counter::reset();
+   i3 = e;
+   VERIFY( i3.valueless_after_move() );
+   VERIFY( Counter::get_allocation_count() == 0 );
+   VERIFY( Counter::get_deallocation_count() == sizeof(Vector) );
+   VERIFY( Counter::get_construct_count() == 0 );
+   VERIFY( Counter::get_destruct_count() == 1 );
+ 
+   Counter::reset();
+   i3 = e;
+   VERIFY( i3.valueless_after_move() );
+   VERIFY( Counter::get_allocation_count() == 0 );
+   VERIFY( Counter::get_deallocation_count() == 0 );
+   VERIFY( Counter::get_construct_count() == 0 );
+   VERIFY( Counter::get_destruct_count() == 0 );
+ }
+ 
+ constexpr void
+ test_all()
+ {
+   test_ctor();
+   test_assign();
+   test_valueless();
+ }
+ 
+ int main()
+ {
+   test_all();
+ 
+   static_assert([] {
+     test_all();
+     return true;
+   });
+ }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/std/memory/indirect/copy_alloc.cc gcc-16-20250601/libstdc++-v3/testsuite/std/memory/indirect/copy_alloc.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/std/memory/indirect/copy_alloc.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/std/memory/indirect/copy_alloc.cc	Sun Jun  1 22:32:49 2025
***************
*** 0 ****
--- 1,228 ----
+ // { dg-do run { target c++26 } }
+ 
+ #include <memory>
+ #include <scoped_allocator>
+ #include <utility>
+ #include <vector>
+ 
+ #include <testsuite_hooks.h>
+ #include <testsuite_allocator.h>
+ 
+ using __gnu_test::propagating_allocator;
+ using __gnu_test::tracker_allocator;
+ using Counter = __gnu_test::tracker_allocator_counter;
+ 
+ template<bool Propagate>
+ constexpr void
+ test_ctor()
+ {
+   using PropAlloc = propagating_allocator<int, Propagate>;
+   using Vector = std::vector<int, PropAlloc>;
+   using ScopedAlloc = std::scoped_allocator_adaptor<
+     propagating_allocator<Vector, Propagate, tracker_allocator<Vector>>,
+     PropAlloc>;
+   using Indirect = std::indirect<Vector, ScopedAlloc>;
+ 
+   const Indirect src(std::allocator_arg, ScopedAlloc{11, 22},
+ 		     std::in_place, {1, 2, 3});
+ 
+   Counter::reset();
+   Indirect i1(src);
+   VERIFY( *i1 == *src );
+   VERIFY( &*i1 != &*src );
+   if (Propagate)
+   {
+     VERIFY( i1->get_allocator().get_personality() == 22 );
+     VERIFY( i1.get_allocator().get_personality() == 11 );
+   }
+   else
+   {
+     VERIFY( i1->get_allocator().get_personality() == 0 );
+     VERIFY( i1.get_allocator().get_personality() == 0 );
+   }
+   VERIFY( Counter::get_allocation_count() == sizeof(Vector) );
+   VERIFY( Counter::get_deallocation_count() == 0 );
+   VERIFY( Counter::get_construct_count() == 1 );
+   VERIFY( Counter::get_destruct_count() == 0 );
+ 
+ 
+   Counter::reset();
+   Indirect i2(std::allocator_arg, ScopedAlloc{33, 44}, src);
+   VERIFY( *i2 == *src );
+   VERIFY( &*i2 != &*src );
+   VERIFY( i2->get_allocator().get_personality() == 44 );
+   VERIFY( i2.get_allocator().get_personality() == 33 );
+   VERIFY( Counter::get_allocation_count() == sizeof(Vector) );
+   VERIFY( Counter::get_deallocation_count() == 0 );
+   VERIFY( Counter::get_construct_count() == 1 );
+   VERIFY( Counter::get_destruct_count() == 0 );
+ }
+ 
+ template<bool Propagate>
+ constexpr void
+ test_assign()
+ {
+   using PropAlloc = propagating_allocator<int, Propagate>;
+   using Vector = std::vector<int, PropAlloc>;
+   using ScopedAlloc = std::scoped_allocator_adaptor<
+     propagating_allocator<Vector, Propagate, tracker_allocator<Vector>>,
+     PropAlloc>;
+   using Indirect = std::indirect<Vector, ScopedAlloc>;
+ 
+   const Indirect src(std::allocator_arg, ScopedAlloc{11, 22},
+ 		     std::in_place, {1, 2, 3});
+ 
+   Indirect i1(std::allocator_arg, ScopedAlloc{11, 22});
+   Counter::reset();
+ 
+   i1 = src;
+   VERIFY( *i1 == *src );
+   VERIFY( &*i1 != &*src );
+   VERIFY( i1->get_allocator().get_personality() == 22 );
+   VERIFY( i1.get_allocator().get_personality() == 11 );
+   VERIFY( Counter::get_allocation_count() == 0 );
+   VERIFY( Counter::get_deallocation_count() == 0 );
+   VERIFY( Counter::get_construct_count() == 0 );
+   VERIFY( Counter::get_destruct_count() == 0 );
+ 
+   Indirect i2(std::allocator_arg, ScopedAlloc{33, 44});
+   Counter::reset();
+ 
+   i2 = src;
+   VERIFY( *i2 == *src );
+   VERIFY( &*i2 != &*src );
+   if (Propagate)
+   {
+     VERIFY( i2->get_allocator().get_personality() == 22 );
+     VERIFY( i2.get_allocator().get_personality() == 11 );
+   }
+   else
+   {
+     VERIFY( i2->get_allocator().get_personality() == 44 );
+     VERIFY( i2.get_allocator().get_personality() == 33 );
+   }
+   VERIFY( Counter::get_allocation_count() == sizeof(Vector) );
+   VERIFY( Counter::get_deallocation_count() == sizeof(Vector) );
+   VERIFY( Counter::get_construct_count() == 1 );
+   VERIFY( Counter::get_destruct_count() == 1 );
+ 
+   Indirect i3(std::allocator_arg, ScopedAlloc{11, 22});
+   auto(std::move(i3));
+   Counter::reset();
+ 
+   i3 = src;
+   VERIFY( *i3 == *src );
+   VERIFY( &*i3 != &*src );
+   VERIFY( i3->get_allocator().get_personality() == 22 );
+   VERIFY( i3.get_allocator().get_personality() == 11 );
+   VERIFY( Counter::get_allocation_count() == sizeof(Vector) );
+   VERIFY( Counter::get_deallocation_count() == 0 );
+   VERIFY( Counter::get_construct_count() == 1 );
+   VERIFY( Counter::get_destruct_count() == 0 );
+ 
+   Indirect i4(std::allocator_arg, ScopedAlloc{33, 44});
+   auto(std::move(i4));
+   Counter::reset();
+ 
+   i4 = src;
+   VERIFY( *i4 == *src );
+   VERIFY( &*i4 != &*src );
+   if (Propagate)
+   {
+     VERIFY( i4->get_allocator().get_personality() == 22 );
+     VERIFY( i4.get_allocator().get_personality() == 11 );
+   }
+   else
+   {
+     VERIFY( i4->get_allocator().get_personality() == 44 );
+     VERIFY( i4.get_allocator().get_personality() == 33 );
+   }
+   VERIFY( Counter::get_allocation_count() == sizeof(Vector) );
+   VERIFY( Counter::get_deallocation_count() == 0 );
+   VERIFY( Counter::get_construct_count() == 1 );
+   VERIFY( Counter::get_destruct_count() == 0 );
+ }
+ 
+ template<bool Propagate>
+ constexpr void
+ test_valueless()
+ {
+   using PropAlloc = propagating_allocator<int, Propagate>;
+   using Vector = std::vector<int, PropAlloc>;
+   using ScopedAlloc = std::scoped_allocator_adaptor<
+     propagating_allocator<Vector, Propagate, tracker_allocator<Vector>>,
+     PropAlloc>;
+   using Indirect = std::indirect<Vector, ScopedAlloc>;
+ 
+   Indirect e(std::allocator_arg, ScopedAlloc{11, 22});
+   auto(std::move(e));
+   VERIFY( e.valueless_after_move() );
+ 
+   Counter::reset();
+   Indirect i1(e);
+   VERIFY( i1.valueless_after_move() );
+   if (Propagate)
+     VERIFY( i1.get_allocator().get_personality() == 11 );
+   else
+     VERIFY( i1.get_allocator().get_personality() == 0 );
+   VERIFY( Counter::get_allocation_count() == 0 );
+   VERIFY( Counter::get_deallocation_count() == 0 );
+   VERIFY( Counter::get_construct_count() == 0 );
+   VERIFY( Counter::get_destruct_count() == 0 );
+ 
+   Counter::reset();
+   Indirect i2(std::allocator_arg, ScopedAlloc{33, 44}, e);
+   VERIFY( i2.valueless_after_move() );
+   VERIFY( i2.get_allocator().get_personality() == 33 );
+   VERIFY( Counter::get_allocation_count() == 0 );
+   VERIFY( Counter::get_deallocation_count() == 0 );
+   VERIFY( Counter::get_construct_count() == 0 );
+   VERIFY( Counter::get_destruct_count() == 0 );
+ 
+   Indirect i3(std::allocator_arg, ScopedAlloc{33, 44});
+   Counter::reset();
+ 
+   i3 = e;
+   VERIFY( i3.valueless_after_move() );
+   if (Propagate)
+     VERIFY( i3.get_allocator().get_personality() == 11 );
+   else
+     VERIFY( i3.get_allocator().get_personality() == 33 );
+   VERIFY( Counter::get_allocation_count() ==  0 );
+   VERIFY( Counter::get_deallocation_count() == sizeof(Vector) );
+   VERIFY( Counter::get_construct_count() == 0 );
+   VERIFY( Counter::get_destruct_count() == 1 );
+ 
+   Counter::reset();
+   i2 = e;
+   VERIFY( i2.valueless_after_move() );
+   if (Propagate)
+     VERIFY( i2.get_allocator().get_personality() == 11 );
+   else
+     VERIFY( i2.get_allocator().get_personality() == 33 );
+   VERIFY( Counter::get_allocation_count() == 0 );
+   VERIFY( Counter::get_deallocation_count() == 0 );
+   VERIFY( Counter::get_construct_count() == 0 );
+   VERIFY( Counter::get_destruct_count() == 0 );
+ }
+ 
+ template<bool Propagate>
+ constexpr void
+ test_all()
+ {
+   test_ctor<Propagate>();
+   test_assign<Propagate>();
+   test_valueless<Propagate>();
+ }
+ 
+ int main()
+ {
+   test_all<true>();
+   test_all<false>();
+ 
+   static_assert([] {
+     test_all<true>();
+     test_all<false>();
+     return true;
+   });
+ }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/std/memory/indirect/ctor.cc gcc-16-20250601/libstdc++-v3/testsuite/std/memory/indirect/ctor.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/std/memory/indirect/ctor.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/std/memory/indirect/ctor.cc	Sun Jun  1 22:32:49 2025
***************
*** 0 ****
--- 1,204 ----
+ // { dg-do run { target c++26 } }
+ 
+ #include <memory>
+ #include <scoped_allocator>
+ #include <utility>
+ #include <vector>
+ 
+ #ifndef __cpp_lib_indirect
+ # error __cpp_lib_indirect feature test macro missing in <memory>
+ #elif __cpp_lib_indirect != 202502
+ # error __cpp_lib_indirect feature test macro has wrong value in <memory>
+ #endif
+ 
+ #include <testsuite_hooks.h>
+ #include <testsuite_allocator.h>
+ 
+ using __gnu_test::uneq_allocator;
+ using UneqAlloc = uneq_allocator<int>;
+ using ScopedAlloc = std::scoped_allocator_adaptor<
+   uneq_allocator<std::vector<int, UneqAlloc>>,
+   UneqAlloc>;
+ 
+ struct Obj
+ {
+   int i;
+   char c[2];
+ };
+ 
+ constexpr void
+ test_deduction_guides()
+ {
+   const Obj o{};
+   std::indirect i1(o);
+   static_assert(std::is_same_v<decltype(i1), std::indirect<Obj>>);
+ 
+   using Alloc = __gnu_test::SimpleAllocator<Obj>;
+   Alloc a;
+   std::indirect i2(std::allocator_arg, a, o);
+   static_assert(std::is_same_v<decltype(i2), std::indirect<Obj, Alloc>>);
+ }
+ 
+ constexpr void
+ test_default_ctor()
+ {
+   using __gnu_test::default_init_allocator;
+ 
+   std::indirect<Obj, default_init_allocator<Obj>> i1;
+   default_init_allocator<int> a{};
+ 
+   // The contained object and the allocator should be value-initialized.
+   VERIFY( i1->i == 0 );
+   VERIFY( i1->c[0] == 0 );
+   VERIFY( i1->c[1] == 0 );
+   VERIFY( i1.get_allocator() == a );
+ 
+   a.state = 5;
+   // Allocator-extended default constructor:
+   std::indirect<Obj, default_init_allocator<Obj>> i2(std::allocator_arg, a);
+   VERIFY( i2.get_allocator() == a );
+ 
+   // Object is constructed using allocator-aware constructor.
+   std::indirect<std::vector<int, UneqAlloc>, ScopedAlloc>
+     i3(std::allocator_arg, ScopedAlloc(11, 22));
+   VERIFY( i3->empty() );
+   VERIFY( i3->get_allocator().get_personality() == 22 );
+   VERIFY( i3.get_allocator().get_personality() == 11 );
+ }
+ 
+ constexpr void
+ test_forwarding_ctor()
+ {
+   Obj obj{1, {'2', '3'}};
+   auto verify = [](std::indirect<Obj> const& i)
+   {
+     VERIFY( i->i == 1 );
+     VERIFY( i->c[0] == '2' );
+     VERIFY( i->c[1] == '3' );
+   };
+ 
+   std::indirect<Obj> i1(std::as_const(obj));
+   verify(i1);
+   std::indirect<Obj> i2(std::move(std::as_const(obj)));
+   verify(i2);
+   std::indirect<Obj> i3(obj);
+   verify(i3);
+   std::indirect<Obj> i4(std::move(obj));
+   verify(i4);
+ 
+   std::indirect<Obj> i5({1, {'2', '3'}});
+   verify(i5);
+ 
+   // Aggregate parens init
+   std::indirect<Obj> i6(7);
+   VERIFY( i6->i == 7 );
+ 
+   std::vector<int, UneqAlloc> v{1, 2, 3, 4, 5};
+   // Object is constructed using allocator-aware constructor.
+   std::indirect<std::vector<int, UneqAlloc>, ScopedAlloc>
+     i7(std::allocator_arg, ScopedAlloc(11, 22), v);
+   VERIFY( i7->size() == 5  );
+   VERIFY( v.size() == 5 );
+   VERIFY( i7->get_allocator().get_personality() == 22 );
+   VERIFY( i7.get_allocator().get_personality() == 11 );
+ 
+   std::indirect<std::vector<int, UneqAlloc>, ScopedAlloc>
+     i8(std::allocator_arg, ScopedAlloc(11, 22), std::move(v));
+   VERIFY( i8->size() == 5  );
+   VERIFY( v.size() == 0 );
+   VERIFY( i8->get_allocator().get_personality() == 22 );
+   VERIFY( i8.get_allocator().get_personality() == 11 );
+ }
+ 
+ constexpr void
+ test_inplace_ctor()
+ {
+   std::indirect<Obj> i1(std::in_place);
+   VERIFY( i1->i == 0 );
+   VERIFY( i1->c[0] == 0 );
+   VERIFY( i1->c[1] == 0 );
+ 
+   std::indirect<Obj> i2(std::in_place, 10);
+   VERIFY( i2->i == 10 );
+   VERIFY( i2->c[0] == 0 );
+   VERIFY( i2->c[1] == 0 );
+ 
+   std::indirect<Obj, uneq_allocator<Obj>>
+     i3(std::allocator_arg, 42, std::in_place);
+   VERIFY( i3->i == 0 );
+   VERIFY( i3->c[0] == 0 );
+   VERIFY( i3->c[1] == 0 );
+   VERIFY( i3.get_allocator().get_personality() == 42 );
+ 
+   std::indirect<Obj,  uneq_allocator<Obj>>
+     i4(std::allocator_arg, 42, std::in_place, 10);
+   VERIFY( i4->i == 10 );
+   VERIFY( i4->c[0] == 0 );
+   VERIFY( i4->c[1] == 0 );
+   VERIFY( i4.get_allocator().get_personality() == 42 );
+ 
+   std::indirect<std::vector<int>> i5(std::in_place);
+   VERIFY( i5->size() == 0 );
+ 
+   std::indirect<std::vector<int>> i6(std::in_place, 5, 13);
+   VERIFY( i6->size() == 5 );
+   VERIFY( i6->at(0) == 13 );
+ 
+   std::indirect<std::vector<int>> i7(std::in_place, {1, 2, 3, 4});
+   VERIFY( i7->size() == 4 );
+   VERIFY( i7->at(2) == 3 );
+ 
+   std::indirect<std::vector<int, UneqAlloc>>
+     i8(std::in_place, UneqAlloc{42});
+   VERIFY( i8->size() == 0 );
+   VERIFY( i8->get_allocator().get_personality() == 42 );
+ 
+   std::indirect<std::vector<int, UneqAlloc>>
+     i9(std::in_place, 5, 13, UneqAlloc{42});
+   VERIFY( i9->size() == 5 );
+   VERIFY( i9->at(0) == 13 );
+   VERIFY( i9->get_allocator().get_personality() == 42 );
+ 
+   std::indirect<std::vector<int, UneqAlloc>>
+     i10(std::in_place, {1, 2, 3, 4}, UneqAlloc{42});
+   VERIFY( i10->size() == 4 );
+   VERIFY( i10->at(2) == 3 );
+   VERIFY( i10->get_allocator().get_personality() == 42 );
+ 
+   std::indirect<std::vector<int, UneqAlloc>, ScopedAlloc>
+     i14(std::allocator_arg, ScopedAlloc(11, 22),
+ 	std::in_place);
+   VERIFY( i14->size() == 0 );
+   VERIFY( i14->get_allocator().get_personality() == 22 );
+   VERIFY( i14.get_allocator().get_personality() == 11 );
+ 
+   std::indirect<std::vector<int, UneqAlloc>, ScopedAlloc>
+     i15(std::allocator_arg, ScopedAlloc(11, 22),
+ 	std::in_place, 5, 13);
+   VERIFY( i15->size() == 5 );
+   VERIFY( i15->at(0) == 13 );
+   VERIFY( i15->get_allocator().get_personality() == 22 );
+   VERIFY( i15.get_allocator().get_personality() == 11 );
+ 
+   std::indirect<std::vector<int, UneqAlloc>, ScopedAlloc>
+     i16(std::allocator_arg, ScopedAlloc(11, 22),
+ 	std::in_place, {1, 2, 3, 4});
+   VERIFY( i16->size() == 4 );
+   VERIFY( i16->at(2) == 3 );
+   VERIFY( i16->get_allocator().get_personality() == 22 );
+   VERIFY( i16.get_allocator().get_personality() == 11 );
+ }
+ 
+ int main()
+ {
+   test_default_ctor();
+   test_forwarding_ctor();
+   test_inplace_ctor();
+ 
+   static_assert([] {
+     test_default_ctor();
+     test_forwarding_ctor();
+     test_inplace_ctor();
+     return true;
+   });
+ }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/std/memory/indirect/incomplete.cc gcc-16-20250601/libstdc++-v3/testsuite/std/memory/indirect/incomplete.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/std/memory/indirect/incomplete.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/std/memory/indirect/incomplete.cc	Sun Jun  1 22:32:49 2025
***************
*** 0 ****
--- 1,38 ----
+ // { dg-do compile { target c++26 } }
+ 
+ #include <memory>
+ 
+ struct Incomplete;
+ bool operator==(const Incomplete&, const Incomplete&);
+ std::strong_ordering operator<=>(const Incomplete&, const Incomplete&);
+ 
+ template<>
+ struct std::hash<Incomplete>
+ {
+   static std::size_t operator()(const Incomplete& c);
+ };
+ 
+ std::indirect<Incomplete>*
+ test_move(std::indirect<Incomplete>& i1, std::indirect<Incomplete>& i2)
+ {
+   i2.swap(i2);
+   return new std::indirect<Incomplete>(std::move(i1));
+ }
+ 
+ void
+ test_relops(std::indirect<Incomplete> const& i1, Incomplete const& o)
+ {
+   void(i1 == i1);
+   void(i1 < i1);
+   void(i1 >= i1);
+ 
+   void(i1 != o);
+   void(i1 < o);
+ }
+ 
+ void
+ test_hash(std::indirect<Incomplete> const& i1)
+ {
+   std::hash<std::indirect<Incomplete>> h;
+   h(i1);
+ }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/std/memory/indirect/invalid_neg.cc gcc-16-20250601/libstdc++-v3/testsuite/std/memory/indirect/invalid_neg.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/std/memory/indirect/invalid_neg.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/std/memory/indirect/invalid_neg.cc	Sun Jun  1 22:32:49 2025
***************
*** 0 ****
--- 1,28 ----
+ // { dg-do compile { target c++26 } }
+ 
+ #include <memory>
+ 
+ // In every specialization indirect<T, Allocator>, if the type
+ // allocator_traits<Allocator>::value_type is not the same type as T,
+ // the program is ill-formed.
+ using T1 = std::indirect<int, std::allocator<long>>::value_type; // { dg-error "here" }
+ 
+ // A program that instantiates the definition of the template
+ // indirect<T, Allocator> with a type for the T parameter that is
+ // a non-object type, an array type, in_place_t,
+ // a specialization of in_place_type_t, or a cv-qualified type is ill-formed.
+ 
+ using T2 = std::indirect<int&>::value_type; // { dg-error "here" }
+ 
+ using T3 = std::indirect<int[1]>::value_type; // { dg-error "here" }
+ 
+ using T4 = std::indirect<std::in_place_t>::value_type; // { dg-error "here" }
+ 
+ using T5 = std::indirect<std::in_place_type_t<int>>::value_type; // { dg-error "here" }
+ 
+ using T6 = std::indirect<const int>::value_type; // { dg-error "here" }
+ 
+ using T7 = std::indirect<volatile int>::value_type; // { dg-error "here" }
+ 
+ // { dg-error "static assertion failed" "" { target *-*-* } 0 }
+ // { dg-prune-output "forming pointer to reference" }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/std/memory/indirect/move.cc gcc-16-20250601/libstdc++-v3/testsuite/std/memory/indirect/move.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/std/memory/indirect/move.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/std/memory/indirect/move.cc	Sun Jun  1 22:32:49 2025
***************
*** 0 ****
--- 1,144 ----
+ // { dg-do run { target c++26 } }
+ 
+ #include <memory>
+ #include <scoped_allocator>
+ #include <utility>
+ #include <vector>
+ #include <optional>
+ 
+ #include <testsuite_hooks.h>
+ #include <testsuite_allocator.h>
+ 
+ using __gnu_test::tracker_allocator;
+ using Counter = __gnu_test::tracker_allocator_counter;
+ using Vector = std::vector<int>;
+ using Indirect = std::indirect<Vector, tracker_allocator<Vector>>;
+ const Indirect val(std::in_place, {1, 2, 3});
+ 
+ constexpr void
+ verifyNoAllocations()
+ {
+   VERIFY( Counter::get_allocation_count() == 0 );
+   VERIFY( Counter::get_deallocation_count() == 0 );
+   VERIFY( Counter::get_construct_count() == 0 );
+   VERIFY( Counter::get_destruct_count() == 0 );
+ }
+ 
+ constexpr void
+ test_ctor()
+ {
+   std::optional<Indirect> src;
+   auto make = [&src] -> Indirect&& {
+     src.emplace(val);
+     Counter::reset();
+     return std::move(*src);
+   };
+ 
+   Indirect i1(make());
+   VERIFY( src->valueless_after_move() );
+   VERIFY( *i1 == *val );
+   verifyNoAllocations();
+ 
+   Indirect i2(std::allocator_arg, {}, make());
+   VERIFY( src->valueless_after_move() );
+   VERIFY( *i2 == *val );
+   verifyNoAllocations();
+ }
+ 
+ constexpr void
+ test_assign()
+ {
+   std::optional<Indirect> src;
+   auto make = [&src] -> Indirect&& {
+     src.emplace(val);
+     Counter::reset();
+     return std::move(*src);
+   };
+ 
+   Indirect i1;
+ 
+   i1 = make();
+   VERIFY( src->valueless_after_move() );
+   VERIFY( *i1 == *val );
+   VERIFY( Counter::get_allocation_count() == 0 );
+   VERIFY( Counter::get_deallocation_count() == sizeof(Vector) );
+   VERIFY( Counter::get_construct_count() == 0 );
+   VERIFY( Counter::get_destruct_count() == 1 );
+ 
+   auto(std::move(i1));
+   i1 = make();
+   VERIFY( *i1 == *val );
+   VERIFY( src->valueless_after_move() );
+   verifyNoAllocations();
+ }
+ 
+ constexpr void
+ test_swap()
+ {
+   const Indirect val1(std::in_place, {1, 2, 3});
+   const Indirect val2(std::in_place, {2, 4, 6});
+ 
+   Indirect i1(val1);
+   Indirect i2(val2);
+   Counter::reset();
+   i1.swap(i2);
+   VERIFY( *i2 == *val1 );
+   VERIFY( *i1 == *val2 );
+   verifyNoAllocations();
+ 
+   auto(std::move(i1));
+   
+   Counter::reset();
+   i1.swap(i2);
+   VERIFY( *i1 == *val1 );
+   VERIFY( i2.valueless_after_move() );
+   verifyNoAllocations();
+ }
+ 
+ constexpr void
+ test_valueless()
+ {
+   auto e = [] {
+     Indirect res;
+     auto(std::move(res));
+     Counter::reset();
+     return res;
+   };
+ 
+   Indirect i1(e());
+   VERIFY( i1.valueless_after_move() );
+   verifyNoAllocations();
+ 
+   Indirect i2(std::allocator_arg, {}, e());
+   VERIFY( i2.valueless_after_move() );
+   verifyNoAllocations();
+ 
+   Indirect i3(val);
+   i3 = e();
+   VERIFY( Counter::get_allocation_count() ==  0 );
+   VERIFY( Counter::get_deallocation_count() == sizeof(Vector) );
+   VERIFY( Counter::get_construct_count() == 0 );
+   VERIFY( Counter::get_destruct_count() == 1 );
+ 
+   i3 = e();
+   verifyNoAllocations();
+ }
+ 
+ constexpr void
+ test_all()
+ {
+   test_ctor();
+   test_assign();
+   test_swap();
+   test_valueless();
+ }
+ 
+ int main()
+ {
+   test_all();
+ 
+   static_assert([] {
+     test_all();
+     return true;
+   });
+ }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/std/memory/indirect/move_alloc.cc gcc-16-20250601/libstdc++-v3/testsuite/std/memory/indirect/move_alloc.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/std/memory/indirect/move_alloc.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/std/memory/indirect/move_alloc.cc	Sun Jun  1 22:32:49 2025
***************
*** 0 ****
--- 1,296 ----
+ // { dg-do run { target c++26 } }
+ 
+ #include <memory>
+ #include <scoped_allocator>
+ #include <utility>
+ #include <vector>
+ #include <optional>
+ 
+ #include <testsuite_hooks.h>
+ #include <testsuite_allocator.h>
+ 
+ using __gnu_test::propagating_allocator;
+ using __gnu_test::tracker_allocator;
+ using Counter = __gnu_test::tracker_allocator_counter;
+ 
+ constexpr void
+ verifyNoAllocations()
+ {
+   VERIFY( Counter::get_allocation_count() == 0 );
+   VERIFY( Counter::get_deallocation_count() == 0 );
+   VERIFY( Counter::get_construct_count() == 0 );
+   VERIFY( Counter::get_destruct_count() == 0 );
+ }
+ 
+ template<bool Propagate>
+ constexpr void
+ test_ctor()
+ {
+   using PropAlloc = propagating_allocator<int, Propagate>;
+   using Vector = std::vector<int, PropAlloc>;
+   using ScopedAlloc = std::scoped_allocator_adaptor<
+     propagating_allocator<Vector, Propagate, tracker_allocator<Vector>>,
+     PropAlloc>;
+   using Indirect = std::indirect<Vector, ScopedAlloc>;
+ 
+   const Indirect val(std::in_place, {1, 2, 3});
+   std::optional<Indirect> src;
+   auto make = [&val, &src] -> Indirect&& {
+     src.emplace(std::allocator_arg, ScopedAlloc{11, 22}, val);
+     Counter::reset();
+     return std::move(*src);
+   };
+ 
+   Indirect i1(make());
+   VERIFY( src->valueless_after_move() );
+   VERIFY( *i1 == *val );
+   VERIFY( i1->get_allocator().get_personality() == 22 );
+   VERIFY( i1.get_allocator().get_personality() == 11 );
+   verifyNoAllocations();
+ 
+   Indirect i2(std::allocator_arg, ScopedAlloc{11, 22}, make());
+   VERIFY( src->valueless_after_move() );
+   VERIFY( *i2 == *val );
+   VERIFY( i2->get_allocator().get_personality() == 22 );
+   VERIFY( i2.get_allocator().get_personality() == 11 );
+   verifyNoAllocations();
+ 
+   Indirect i3(std::allocator_arg, ScopedAlloc{33, 44}, make());
+   // We move-from contained object
+   VERIFY( !src->valueless_after_move() );
+   VERIFY( *i3 == *val );
+   VERIFY( i3->get_allocator().get_personality() == 44 );
+   VERIFY( i3.get_allocator().get_personality() == 33 );
+   VERIFY( Counter::get_allocation_count() == sizeof(Vector) );
+   VERIFY( Counter::get_deallocation_count() == 0 );
+   VERIFY( Counter::get_construct_count() == 1 );
+   VERIFY( Counter::get_destruct_count() == 0 );
+ }
+ 
+ template<bool Propagate>
+ constexpr void
+ test_assign()
+ {
+   using PropAlloc = propagating_allocator<int, Propagate>;
+   using Vector = std::vector<int, PropAlloc>;
+   using ScopedAlloc = std::scoped_allocator_adaptor<
+     propagating_allocator<Vector, Propagate, tracker_allocator<Vector>>,
+     PropAlloc>;
+   using Indirect = std::indirect<Vector, ScopedAlloc>;
+ 
+   const Indirect val(std::in_place, {1, 2, 3});
+   std::optional<Indirect> src;
+   auto make = [&val, &src] -> Indirect&& {
+     src.emplace(std::allocator_arg, ScopedAlloc{11, 22}, val);
+     Counter::reset();
+     return std::move(*src);
+   };
+ 
+   Indirect i1(std::allocator_arg, ScopedAlloc{11, 22});
+ 
+   i1 = make();
+   VERIFY( src->valueless_after_move() );
+   VERIFY( *i1 == *val );
+   VERIFY( i1->get_allocator().get_personality() == 22 );
+   VERIFY( i1.get_allocator().get_personality() == 11 );
+   VERIFY( Counter::get_allocation_count() == 0 );
+   VERIFY( Counter::get_deallocation_count() == sizeof(Vector) );
+   VERIFY( Counter::get_construct_count() == 0 );
+   VERIFY( Counter::get_destruct_count() == 1 );
+ 
+   Indirect i2(std::allocator_arg, ScopedAlloc{33, 44});
+ 
+   i2 = make();
+   VERIFY( *i2 == *val );
+   if (Propagate)
+   {
+     VERIFY( src->valueless_after_move() );
+     VERIFY( i2->get_allocator().get_personality() == 22 );
+     VERIFY( i2.get_allocator().get_personality() == 11 );
+     VERIFY( Counter::get_allocation_count() == 0 );
+     VERIFY( Counter::get_construct_count() == 0 );
+   }
+   else
+   {
+     // We allocate new holder and move-from contained object
+     VERIFY( !src->valueless_after_move() );
+     VERIFY( i2->get_allocator().get_personality() == 44 );
+     VERIFY( i2.get_allocator().get_personality() == 33 );
+     VERIFY( Counter::get_allocation_count() == sizeof(Vector) );
+     VERIFY( Counter::get_construct_count() == 1 );
+   }
+   VERIFY( Counter::get_deallocation_count() == sizeof(Vector) );
+   VERIFY( Counter::get_destruct_count() == 1 );
+ 
+   Indirect i3(std::allocator_arg, ScopedAlloc{11, 22});
+   auto(std::move(i3));
+ 
+   i3 = make();
+   VERIFY( *i3 == *val );
+   VERIFY( src->valueless_after_move() );
+   VERIFY( i3->get_allocator().get_personality() == 22 );
+   VERIFY( i3.get_allocator().get_personality() == 11 );
+   verifyNoAllocations();
+ 
+   Indirect i4(std::allocator_arg, ScopedAlloc{33, 44});
+   auto(std::move(i4));
+ 
+   i4 = make();
+   VERIFY( *i4 == *val );
+   if (Propagate)
+   {
+     VERIFY( src->valueless_after_move() );
+     VERIFY( i4->get_allocator().get_personality() == 22 );
+     VERIFY( i4.get_allocator().get_personality() == 11 );
+     VERIFY( Counter::get_allocation_count() == 0 );
+     VERIFY( Counter::get_construct_count() == 0 );
+   }
+   else
+   {
+     // We allocate new holder and move-from contained object
+     VERIFY( !src->valueless_after_move() );
+     VERIFY( i4->get_allocator().get_personality() == 44 );
+     VERIFY( i4.get_allocator().get_personality() == 33 );
+     VERIFY( Counter::get_allocation_count() == sizeof(Vector) );
+     VERIFY( Counter::get_construct_count() == 1 );
+   }
+   VERIFY( Counter::get_deallocation_count() == 0 );
+   VERIFY( Counter::get_destruct_count() == 0 );
+ }
+ 
+ template<bool Propagate>
+ constexpr void
+ test_swap()
+ {
+   using PropAlloc = propagating_allocator<int, Propagate>;
+   using Vector = std::vector<int, PropAlloc>;
+   using ScopedAlloc = std::scoped_allocator_adaptor<
+     propagating_allocator<Vector, Propagate, tracker_allocator<Vector>>,
+     PropAlloc>;
+   using Indirect = std::indirect<Vector, ScopedAlloc>;
+ 
+   const Indirect val1(std::in_place, {1, 2, 3});
+   const Indirect val2(std::in_place, {2, 4, 6});
+ 
+   Indirect i1(std::allocator_arg, ScopedAlloc{11, 22}, val1);
+   Indirect i2(std::allocator_arg, ScopedAlloc{11, 22}, val2);
+   Counter::reset();
+   i1.swap(i2);
+   VERIFY( *i2 == *val1 );
+   VERIFY( *i1 == *val2 );
+   verifyNoAllocations();
+ 
+   auto(std::move(i1));
+ 
+   Counter::reset();
+   i1.swap(i2);
+   VERIFY( *i1 == *val1 );
+   VERIFY( i2.valueless_after_move() );
+   verifyNoAllocations();
+ 
+   if (!Propagate)
+     return;
+ 
+   Indirect i3(std::allocator_arg, ScopedAlloc{33, 44}, val2);
+   Counter::reset();
+   i1.swap(i3);
+   VERIFY( *i1 == *val2 );
+   VERIFY( i1->get_allocator().get_personality() == 44 );
+   VERIFY( i1.get_allocator().get_personality() == 33 );
+   VERIFY( *i3 == *val1 );
+   VERIFY( i3->get_allocator().get_personality() == 22 );
+   VERIFY( i3.get_allocator().get_personality() == 11 );
+   verifyNoAllocations();
+ 
+   i1.swap(i2);
+   VERIFY( i1.valueless_after_move() );
+   VERIFY( i1.get_allocator().get_personality() == 11 );
+   VERIFY( *i2 == *val2 );
+   VERIFY( i2->get_allocator().get_personality() == 44 );
+   VERIFY( i2.get_allocator().get_personality() == 33 );
+   verifyNoAllocations();
+ }
+ 
+ template<bool Propagate>
+ constexpr void
+ test_valueless()
+ {
+   using PropAlloc = propagating_allocator<int, Propagate>;
+   using Vector = std::vector<int, PropAlloc>;
+   using ScopedAlloc = std::scoped_allocator_adaptor<
+     propagating_allocator<Vector, Propagate, tracker_allocator<Vector>>,
+     PropAlloc>;
+   using Indirect = std::indirect<Vector, ScopedAlloc>;
+ 
+   auto e = [] {
+     Indirect res(std::allocator_arg, ScopedAlloc{11, 22});
+     auto(std::move(res));
+     Counter::reset();
+     return res;
+   };
+ 
+   Indirect i1(e());
+   VERIFY( i1.valueless_after_move() );
+   VERIFY( i1.get_allocator().get_personality() == 11 );
+   verifyNoAllocations();
+ 
+   Indirect i2(std::allocator_arg, ScopedAlloc{33, 44}, e());
+   VERIFY( i2.valueless_after_move() );
+   VERIFY( i2.get_allocator().get_personality() == 33 );
+   verifyNoAllocations();
+ 
+   Indirect i3(std::allocator_arg, ScopedAlloc{33, 44});
+ 
+   i3 = e();
+   VERIFY( i3.valueless_after_move() );
+   if (Propagate)
+     VERIFY( i3.get_allocator().get_personality() == 11 );
+   else
+     VERIFY( i3.get_allocator().get_personality() == 33 );
+   VERIFY( Counter::get_allocation_count() ==  0 );
+   VERIFY( Counter::get_deallocation_count() == sizeof(Vector) );
+   VERIFY( Counter::get_construct_count() == 0 );
+   VERIFY( Counter::get_destruct_count() == 1 );
+ 
+   i2 = e();
+   VERIFY( i2.valueless_after_move() );
+   if (Propagate)
+     VERIFY( i2.get_allocator().get_personality() == 11 );
+   else
+     VERIFY( i2.get_allocator().get_personality() == 33 );
+   verifyNoAllocations();
+ 
+   i3.swap(i2);
+   VERIFY( i2.valueless_after_move() );
+   VERIFY( i1.valueless_after_move() );
+   verifyNoAllocations();
+ 
+   if (!Propagate)
+     return;
+ 
+   Indirect i4(std::allocator_arg, ScopedAlloc{33, 44}, e());
+   i4.swap(i1);
+   verifyNoAllocations();
+ }
+ 
+ template<bool Propagate>
+ constexpr void
+ test_all()
+ {
+   test_ctor<Propagate>();
+   test_assign<Propagate>();
+   test_swap<Propagate>();
+   test_valueless<Propagate>();
+ }
+ 
+ int main()
+ {
+   test_all<true>();
+   test_all<false>();
+ 
+   static_assert([] {
+     test_all<true>();
+     test_all<false>();
+     return true;
+   });
+ }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/std/memory/indirect/relops.cc gcc-16-20250601/libstdc++-v3/testsuite/std/memory/indirect/relops.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/std/memory/indirect/relops.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/std/memory/indirect/relops.cc	Sun Jun  1 22:32:49 2025
***************
*** 0 ****
--- 1,82 ----
+ // { dg-do run { target c++26 } }
+ 
+ #include <memory>
+ #include <testsuite_hooks.h>
+ 
+ struct Obj
+ {
+   int i;
+   constexpr auto operator<=>(const Obj&) const = default;
+ };
+ 
+ template<>
+ struct std::hash<Obj>
+ {
+   static size_t operator()(Obj const& obj)
+   { return std::hash<int>{}(obj.i);  }
+ };
+ 
+ constexpr void
+ test_relops()
+ {
+   std::indirect<Obj> i1;
+   VERIFY( i1 == i1 );
+   VERIFY( i1 <= i1 );
+   VERIFY( i1 >= i1 );
+ 
+   std::indirect<Obj> i2 = std::move(i1); // make i1 valueless
+   VERIFY( i1 == i1 );
+   VERIFY( i2 == i2 );
+   VERIFY( i2 != i1 );
+   VERIFY( i1 < i2 );
+   VERIFY( i2 >= i1 );
+ 
+   std::indirect<Obj> i3 = std::move(i2); // make i2 valueless
+   VERIFY( i2 == i1 );
+   VERIFY( i2 >= i1 );
+   VERIFY( i2 <= i1 );
+   VERIFY( i3 > i2 );
+ }
+ 
+ constexpr void
+ test_comp_with_t()
+ {
+   std::indirect<Obj> i1;
+   Obj o{2};
+   VERIFY( i1 != o );
+   VERIFY( i1 < o );
+ 
+   std::indirect<Obj> i2(Obj{2});
+   VERIFY( i2 == o );
+   VERIFY( i2 <= o );
+   VERIFY( o <= i2 );
+ 
+   std::indirect<Obj> i3 = std::move(i2); // make i2 valueless
+   VERIFY( i2 != o );
+   VERIFY( i2 < o );
+ }
+ 
+ void
+ test_hash()
+ {
+   Obj o{5};
+   std::indirect<Obj> i(o);
+   VERIFY( std::hash<std::indirect<Obj>>{}(i)
+ 	  == std::hash<Obj>{}(o) );
+ 
+   auto(std::move(i)); // make i valueless
+   (void)std::hash<std::indirect<Obj>>{}(i);
+ }
+ 
+ int main()
+ {
+   test_relops();
+   test_comp_with_t();
+   test_hash();
+ 
+   static_assert([] {
+     test_relops();
+     test_comp_with_t();
+     return true;
+   });
+ }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/std/time/format/empty_spec.cc gcc-16-20250601/libstdc++-v3/testsuite/std/time/format/empty_spec.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/std/time/format/empty_spec.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250601/libstdc++-v3/testsuite/std/time/format/empty_spec.cc	Sun Jun  1 22:32:49 2025
***************
*** 0 ****
--- 1,301 ----
+ // { dg-do run { target c++20 } }
+ // { dg-timeout-factor 2 }
+ 
+ #include <chrono>
+ #include <sstream>
+ #include <testsuite_hooks.h>
+ 
+ using namespace std::chrono;
+ 
+ #define WIDEN_(C, S) ::std::__format::_Widen<C>(S, L##S)
+ #define WIDEN(S) WIDEN_(_CharT, S)
+ 
+ template<typename _CharT>
+ void
+ test_padding()
+ {
+   std::basic_string<_CharT> res;
+ 
+   res = std::format(WIDEN("{:5}"), day(2));
+   VERIFY( res == WIDEN("02   ") );
+ 
+   res = std::format(WIDEN("{:>6}"), weekday(4));
+   VERIFY( res == WIDEN("   Thu") );
+ 
+   res = std::format(WIDEN("{:^7}"), month(3));
+   VERIFY( res == WIDEN("  Mar  ") );
+ 
+   res = std::format(WIDEN("{:-<4}"), day(30));
+   VERIFY( res == WIDEN("30--") );
+ 
+   res = std::format(WIDEN("{:+>30}"), weekday(9));
+   VERIFY( res == WIDEN("++++++9 is not a valid weekday") );
+ 
+   res = std::format(WIDEN("{:=^27}"), month(16));
+   VERIFY( res == WIDEN("==16 is not a valid month==") );
+ }
+ 
+ template<typename T, typename _CharT>
+ void verify(const T& t, const _CharT* str)
+ {
+   std::basic_string<_CharT> res;
+ 
+   res = std::format(WIDEN("{}"), t);
+   VERIFY( res == str );
+ 
+   std::basic_stringstream<_CharT> os;
+   os << t;
+   res = std::move(os).str();
+   VERIFY( res == str );
+ }
+ 
+ template<typename _CharT>
+ void
+ test_day()
+ {
+   verify( day(0),   WIDEN("00 is not a valid day") );
+   verify( day(1),   WIDEN("01") );
+   verify( day(10),  WIDEN("10") );
+   verify( day(32),  WIDEN("32 is not a valid day") );
+   verify( day(110), WIDEN("110 is not a valid day") );
+   verify( day(255), WIDEN("255 is not a valid day") );
+ }
+ 
+ template<typename _CharT>
+ void
+ test_month()
+ {
+   verify( month(0),   WIDEN("0 is not a valid month") );
+   verify( month(1),   WIDEN("Jan") );
+   verify( month(10),  WIDEN("Oct") );
+   verify( month(32),  WIDEN("32 is not a valid month") );
+   verify( month(110), WIDEN("110 is not a valid month") );
+   verify( month(100), WIDEN("100 is not a valid month") );
+   verify( month(110), WIDEN("110 is not a valid month") );
+   verify( month(255), WIDEN("255 is not a valid month") );
+ }
+ 
+ template<typename _CharT>
+ void
+ test_year()
+ {
+   verify( year(-32768), WIDEN("-32768 is not a valid year") );
+   verify( year(-32767), WIDEN("-32767") );
+   verify( year(-67),    WIDEN( "-0067") );
+   verify( year(-1),     WIDEN( "-0001") );
+   verify( year(0),      WIDEN(  "0000") );
+   verify( year(1),      WIDEN(  "0001") );
+   verify( year(123),    WIDEN(  "0123") );
+   verify( year(2025),   WIDEN(  "2025") );
+   verify( year(32767),  WIDEN( "32767") );
+ }
+ 
+ template<typename _CharT>
+ void
+ test_weekday()
+ {
+   verify( weekday(0),   WIDEN("Sun") );
+   verify( weekday(2),   WIDEN("Tue") );
+   verify( weekday(6),   WIDEN("Sat") );
+   verify( weekday(7),   WIDEN("Sun") );
+   verify( weekday(9),   WIDEN("9 is not a valid weekday") );
+   verify( weekday(32),  WIDEN("32 is not a valid weekday") );
+   verify( weekday(110), WIDEN("110 is not a valid weekday") );
+   verify( weekday(255), WIDEN("255 is not a valid weekday") );
+ }
+ 
+ template<typename _CharT>
+ void
+ test_weekday_indexed()
+ {
+   verify( weekday(0)[0],   WIDEN("Sun[0 is not a valid index]") );
+   verify( weekday(2)[1],   WIDEN("Tue[1]") );
+   verify( weekday(6)[5],   WIDEN("Sat[5]") );
+   verify( weekday(7)[6],   WIDEN("Sun[6 is not a valid index]") );
+   verify( weekday(7)[12],  WIDEN("Sun[12 is not a valid index]") );
+   verify( weekday(5)[117], WIDEN("Fri[117 is not a valid index]") );
+   verify( weekday(7)[255], WIDEN("Sun[255 is not a valid index]") );
+   verify( weekday(9)[1],   WIDEN("9 is not a valid weekday[1]") );
+   verify( weekday(32)[7],  WIDEN("32 is not a valid weekday[7 is not a valid index]") );
+ }
+ 
+ template<typename _CharT>
+ void
+ test_weekday_last()
+ {
+   verify( weekday(0)[last], WIDEN("Sun[last]") );
+   verify( weekday(9)[last], WIDEN("9 is not a valid weekday[last]") );
+ }
+ 
+ template<typename _CharT>
+ void
+ test_month_day()
+ {
+   verify( month(1)/30,  WIDEN("Jan/30") );
+   verify( month(3)/32,  WIDEN("Mar/32 is not a valid day") );
+   verify( month(13)/30, WIDEN("13 is not a valid month/30") );
+   verify( month(13)/32, WIDEN("13 is not a valid month/32 is not a valid day") );
+ }
+ 
+ template<typename _CharT>
+ void
+ test_month_day_last()
+ {
+   verify( month(1)/last, WIDEN("Jan/last") );
+   verify( month(14)/last, WIDEN("14 is not a valid month/last") );
+ }
+ 
+ template<typename _CharT>
+ void
+ test_month_weekday()
+ {
+   verify( month(1)/weekday(2)[1],
+ 	  WIDEN("Jan/Tue[1]") );
+   verify( month(3)/weekday(9)[2],
+ 	  WIDEN("Mar/9 is not a valid weekday[2]") );
+   verify( month(13)/weekday(1)[7],
+ 	  WIDEN("13 is not a valid month/Mon[7 is not a valid index]") );
+   verify( month(13)/weekday(10)[3],
+ 	  WIDEN("13 is not a valid month/10 is not a valid weekday[3]") );
+   verify( month(13)/weekday(130)[0],
+ 	  WIDEN("13 is not a valid month/130 is not a valid weekday[0 is not a valid index]") );
+ }
+ 
+ template<typename _CharT>
+ void
+ test_month_weekday_last()
+ {
+   verify( month(1)/weekday(2)[last],
+ 	  WIDEN("Jan/Tue[last]") );
+   verify( month(3)/weekday(9)[last],
+ 	  WIDEN("Mar/9 is not a valid weekday[last]") );
+   verify( month(13)/weekday(1)[last],
+ 	  WIDEN("13 is not a valid month/Mon[last]") );
+   verify( month(13)/weekday(10)[last],
+ 	  WIDEN("13 is not a valid month/10 is not a valid weekday[last]") );
+ }
+ 
+ template<typename _CharT>
+ void
+ test_year_month()
+ {
+   verify( year(2024)/month(1),
+ 	  WIDEN("2024/Jan") );
+   verify( year(2025)/month(14),
+ 	  WIDEN("2025/14 is not a valid month") );
+   verify( year(-32768)/month(2),
+ 	  WIDEN("-32768 is not a valid year/Feb") );
+   verify( year(-32768)/month(0),
+ 	  WIDEN("-32768 is not a valid year/0 is not a valid month") );
+ }
+ 
+ template<typename _CharT>
+ void
+ test_year_month_day()
+ {
+   verify( year(2024)/month(1)/30,
+ 	  WIDEN("2024-01-30") );
+   verify( year(-100)/month(14)/1,
+ 	  // Should be -0100-14-01
+ 	  WIDEN("-100-14-01 is not a valid date") );
+   verify( year(2025)/month(11)/100,
+ 	  // Should be 2025-11-100 ?
+ 	  WIDEN("2025-11-99 is not a valid date") );
+   verify( year(-32768)/month(2)/10,
+ 	  WIDEN("-32768-02-10 is not a valid date") );
+   verify( year(-32768)/month(212)/10,
+ 	  // Should be 32768-212-10?
+ 	  WIDEN("-32768-84-10 is not a valid date") );
+   verify( year(-32768)/month(2)/105,
+           // Should be 32768-02-99?
+ 	  WIDEN("-32768-02-99 is not a valid date") );
+   verify( year(-32768)/month(14)/55,
+ 	  WIDEN("-32768-14-55 is not a valid date") );
+ }
+ 
+ template<typename _CharT>
+ void
+ test_year_month_last()
+ {
+   verify( year(2024)/month(1)/last,
+ 	  WIDEN("2024/Jan/last") );
+   verify( year(2025)/month(14)/last,
+ 	  WIDEN("2025/14 is not a valid month/last") );
+   verify( year(-32768)/month(2)/last,
+ 	  WIDEN("-32768 is not a valid year/Feb/last") );
+   verify( year(-32768)/month(0)/last,
+ 	  WIDEN("-32768 is not a valid year/0 is not a valid month/last") );
+ }
+ 
+ template<typename _CharT>
+ void
+ test_year_month_weekday()
+ {
+   verify( year(2024)/month(1)/weekday(2)[1],
+ 	  WIDEN("2024/Jan/Tue[1]") );
+   verify( year(-1)/month(3)/weekday(9)[2],
+ 	  WIDEN("-0001/Mar/9 is not a valid weekday[2]") );
+   verify( year(-32768)/month(13)/weekday(1)[7],
+ 	  WIDEN("-32768 is not a valid year/13 is not a valid month/Mon[7 is not a valid index]") );
+   verify( year(-100)/month(13)/weekday(10)[3],
+ 	  WIDEN("-0100/13 is not a valid month/10 is not a valid weekday[3]") );
+   verify( year(-32768)/month(13)/weekday(130)[0],
+ 	  WIDEN("-32768 is not a valid year/13 is not a valid month/130 is not a valid weekday[0 is not a valid index]") );
+ }
+ 
+ template<typename _CharT>
+ void
+ test_year_month_weekday_last()
+ {
+   verify( year(2024)/month(1)/weekday(2)[last],
+ 	  WIDEN("2024/Jan/Tue[last]") );
+   verify( year(-1)/month(3)/weekday(9)[last],
+ 	  WIDEN("-0001/Mar/9 is not a valid weekday[last]") );
+   verify( year(-32768)/month(13)/weekday(1)[last],
+ 	  WIDEN("-32768 is not a valid year/13 is not a valid month/Mon[last]") );
+   verify( year(-100)/month(13)/weekday(10)[last],
+ 	  WIDEN("-0100/13 is not a valid month/10 is not a valid weekday[last]") );
+   verify( year(-32768)/month(13)/weekday(130)[last],
+ 	  WIDEN("-32768 is not a valid year/13 is not a valid month/130 is not a valid weekday[last]") );
+ }
+ 
+ template<typename CharT>
+ void
+ test_calendar()
+ {
+   test_day<CharT>();
+   test_month<CharT>();
+   test_year<CharT>();
+ 
+   test_weekday<CharT>();
+   test_weekday_indexed<CharT>();
+   test_weekday_last<CharT>();
+ 
+   test_month_day<CharT>();
+   test_month_day_last<CharT>();
+   test_month_weekday<CharT>();
+   test_month_weekday_last<CharT>();
+ 
+   test_year_month<CharT>();
+   test_year_month_day<CharT>();
+   test_year_month_last<CharT>();
+   test_year_month_weekday<CharT>();
+   test_year_month_weekday_last<CharT>();
+ }
+ 
+ template<typename CharT>
+ void
+ test_all()
+ {
+   test_padding<CharT>();
+   test_calendar<CharT>();
+ }
+ 
+ int main()
+ {
+   test_all<char>();
+ 
+ #ifdef _GLIBCXX_USE_WCHAR_T
+   test_all<wchar_t>();
+ #endif // _GLIBCXX_USE_WCHAR_T
+ }
diff -Nrcpad gcc-16-20250525/libstdc++-v3/testsuite/util/testsuite_abi.cc gcc-16-20250601/libstdc++-v3/testsuite/util/testsuite_abi.cc
*** gcc-16-20250525/libstdc++-v3/testsuite/util/testsuite_abi.cc	Sun May 25 22:32:18 2025
--- gcc-16-20250601/libstdc++-v3/testsuite/util/testsuite_abi.cc	Sun Jun  1 22:32:50 2025
*************** check_version(symbol& test, bool added)
*** 216,221 ****
--- 216,222 ----
        known_versions.push_back("GLIBCXX_3.4.32");
        known_versions.push_back("GLIBCXX_3.4.33");
        known_versions.push_back("GLIBCXX_3.4.34");
+       known_versions.push_back("GLIBCXX_3.4.35");
        known_versions.push_back("GLIBCXX_LDBL_3.4.31");
        known_versions.push_back("GLIBCXX_IEEE128_3.4.29");
        known_versions.push_back("GLIBCXX_IEEE128_3.4.30");
