diff -Nrcpad gcc-16-20250914/LAST_UPDATED gcc-16-20250921/LAST_UPDATED
*** gcc-16-20250914/LAST_UPDATED	Sun Sep 14 22:33:08 2025
--- gcc-16-20250921/LAST_UPDATED	Sun Sep 21 22:34:33 2025
***************
*** 1 ****
! Obtained from git: master revision 38666cbccff5114e2f23930fae180f03c385eb45
--- 1 ----
! Obtained from git: master revision c6781f5558bdb4f241a3597c528ed7020a5cfce7
diff -Nrcpad gcc-16-20250914/MD5SUMS gcc-16-20250921/MD5SUMS
*** gcc-16-20250914/MD5SUMS	Sun Sep 14 22:33:12 2025
--- gcc-16-20250921/MD5SUMS	Sun Sep 21 22:34:44 2025
***************
*** 1,5 ****
  # This file contains the MD5 checksums of the files in the
! # gcc-16-20250914.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-20250921.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
*************** d32239bcb673463ab874e80d47fae504  COPYIN
*** 25,31 ****
  fd4ecdf5d672efe2b0e409aca9cf9446  ChangeLog.jit
  09538b708302f1735f6fa05b622ecf5e  ChangeLog.tree-ssa
  24ab760126489e69436a43185dc3d202  INSTALL/README
! 6bd9bd24ddc9fafad37ce16cfcab4a02  LAST_UPDATED
  8e87c2f135d3885c0640f7f2229b11ae  MAINTAINERS
  95166ed050922b15d201d1fa647b5872  Makefile.def
  7dcc983bfbcda6838b504185562b60a3  Makefile.in
--- 25,31 ----
  fd4ecdf5d672efe2b0e409aca9cf9446  ChangeLog.jit
  09538b708302f1735f6fa05b622ecf5e  ChangeLog.tree-ssa
  24ab760126489e69436a43185dc3d202  INSTALL/README
! 6020c21afb470cd5d7e900a4ecd6f920  LAST_UPDATED
  8e87c2f135d3885c0640f7f2229b11ae  MAINTAINERS
  95166ed050922b15d201d1fa647b5872  Makefile.def
  7dcc983bfbcda6838b504185562b60a3  Makefile.in
*************** e2dc6b4fd62b77bff96b7951ef74f78f  config
*** 154,160 ****
  db74a73c3c9c3cc71edec37c2436e082  config/zstd.m4
  9d9c5508a65175be5f9e10721e55ebbc  configure
  82e46c5338f6449fa0a149b6adf12797  configure.ac
! 8e119660b4042b770bce3c9e77e49e56  contrib/ChangeLog
  5fc435c7928f858246df931ea3f3ece7  contrib/ChangeLog.jit
  7af8d2979bf1a7cfa88e30d05fa22be2  contrib/ChangeLog.tree-ssa
  13605e5ba7b533ecbe3a902b8ebe4079  contrib/analyze_brprob.py
--- 154,160 ----
  db74a73c3c9c3cc71edec37c2436e082  config/zstd.m4
  9d9c5508a65175be5f9e10721e55ebbc  configure
  82e46c5338f6449fa0a149b6adf12797  configure.ac
! fa1e1b9c86031312b1c4887dd2e11d2a  contrib/ChangeLog
  5fc435c7928f858246df931ea3f3ece7  contrib/ChangeLog.jit
  7af8d2979bf1a7cfa88e30d05fa22be2  contrib/ChangeLog.tree-ssa
  13605e5ba7b533ecbe3a902b8ebe4079  contrib/analyze_brprob.py
*************** bfd0156a35f146cd1fd12934ede7764f  contri
*** 356,362 ****
  8ec0eeb5656a711cd81ffedbb2b98f54  contrib/unicode/gen_wcwidth.py
  8b5fa928c1da8636733a0a76a2da5bc8  contrib/unicode/unicode-license.txt
  93fd39f4c6ff7bf4e5f9e035b65e6e1a  contrib/unicode/utf8-dump.py
! 13955dc4ee3f74718a3869155e474db6  contrib/uninclude
  e13ec08819ec612c7a7ed247d6b5adae  contrib/unused_functions.py
  d6d69185e109949b99399c890206a835  contrib/update-copyright.py
  e96e470317bafce43e11f5d3dc027f1c  contrib/vim-gcc-dev/README
--- 356,362 ----
  8ec0eeb5656a711cd81ffedbb2b98f54  contrib/unicode/gen_wcwidth.py
  8b5fa928c1da8636733a0a76a2da5bc8  contrib/unicode/unicode-license.txt
  93fd39f4c6ff7bf4e5f9e035b65e6e1a  contrib/unicode/utf8-dump.py
! 0ebeba0547f62774f2321fb89df47e5a  contrib/uninclude
  e13ec08819ec612c7a7ed247d6b5adae  contrib/unused_functions.py
  d6d69185e109949b99399c890206a835  contrib/update-copyright.py
  e96e470317bafce43e11f5d3dc027f1c  contrib/vim-gcc-dev/README
*************** a22e70b3f29292d0e628450f4bb11e62  fixinc
*** 516,522 ****
  a916467b91076e631dd8edb7424769c7  gcc/COPYING.LIB
  d32239bcb673463ab874e80d47fae504  gcc/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/COPYING3.LIB
! 8a1c37c28e73051e4f14e9de53f05c98  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
! 6eace8fce77a3f12966b8e85b6c115fa  gcc/ChangeLog
  51281e73aa07fb62394bd72f3c9299ba  gcc/ChangeLog-1997
  f77af8c9ac412064886b00c5506123b5  gcc/ChangeLog-1998
  00a2e4ead1b289bf69bca0196fed6f9f  gcc/ChangeLog-1999
*************** fb3fadb88e1d2b3b640cfaaa5ff11780  gcc/Ch
*** 553,559 ****
  3eb07e0b2e542409bf73d359f7f65609  gcc/ChangeLog.ptr
  e13638e26743ba41e6011b76cc00d9a9  gcc/ChangeLog.tree-ssa
  739ab47f6425bcea1d05e4fc0542de54  gcc/ChangeLog.tuples
! cbd0f9e406424a2f8cdc4139f3d79464  gcc/DATESTAMP
  deb513e591f23901188e22323bd3b1d4  gcc/DEV-PHASE
  eb92e1ff5e982ca07e173e0eb286d243  gcc/FSFChangeLog
  30e1e33411566388b3164558482dc5e6  gcc/FSFChangeLog.10
--- 553,559 ----
  3eb07e0b2e542409bf73d359f7f65609  gcc/ChangeLog.ptr
  e13638e26743ba41e6011b76cc00d9a9  gcc/ChangeLog.tree-ssa
  739ab47f6425bcea1d05e4fc0542de54  gcc/ChangeLog.tuples
! 04abbe46546e41340d59aadbffdc222f  gcc/DATESTAMP
  deb513e591f23901188e22323bd3b1d4  gcc/DEV-PHASE
  eb92e1ff5e982ca07e173e0eb286d243  gcc/FSFChangeLog
  30e1e33411566388b3164558482dc5e6  gcc/FSFChangeLog.10
*************** ec6799501b2eb2923d5de6a66169dbd2  gcc/ON
*** 565,571 ****
  23d99b5becf269aa690a91a6f95228b9  gcc/acinclude.m4
  18db4664d7e31002aac43ebcf20e075f  gcc/aclocal.m4
  16a499934b71eb6cf7c0d6899cd6006a  gcc/ada/.gitignore
! 98fb3d7cd7d2e7cb055f7f27c40d464e  gcc/ada/ChangeLog
  c2094c0d3135f9ac89917f162046ee04  gcc/ada/ChangeLog-2001
  fa410b57f5d814d5d3ac3b45f486cdcf  gcc/ada/ChangeLog-2002
  2dbefa7bdc8dc28ec746002028861278  gcc/ada/ChangeLog-2003
--- 565,571 ----
  23d99b5becf269aa690a91a6f95228b9  gcc/acinclude.m4
  18db4664d7e31002aac43ebcf20e075f  gcc/aclocal.m4
  16a499934b71eb6cf7c0d6899cd6006a  gcc/ada/.gitignore
! 11556c0472e23f0b8db39fc960ee0ef8  gcc/ada/ChangeLog
  c2094c0d3135f9ac89917f162046ee04  gcc/ada/ChangeLog-2001
  fa410b57f5d814d5d3ac3b45f486cdcf  gcc/ada/ChangeLog-2002
  2dbefa7bdc8dc28ec746002028861278  gcc/ada/ChangeLog-2003
*************** eea9961506181531b5f7f1a7f62fe428  gcc/ad
*** 594,600 ****
  2cf41efa2dee24b2dda73018b855edd3  gcc/ada/ChangeLog.tree-ssa
  1ddbf3755fbef2d964b15c7104b9937d  gcc/ada/Make-generated.in
  6c9c3b4249e781ed48c7ae55e8ef9999  gcc/ada/Makefile.in
! 51276efe7210705735bde242953c21a7  gcc/ada/Makefile.rtl
  38343dc270740eef23a38cd3c750dde1  gcc/ada/accessibility.adb
  fbd3226b85f1e1cc6eb250fa51de4be1  gcc/ada/accessibility.ads
  80867b66cbed2dba054564ea216b3c66  gcc/ada/ada_get_targ.adb
--- 594,600 ----
  2cf41efa2dee24b2dda73018b855edd3  gcc/ada/ChangeLog.tree-ssa
  1ddbf3755fbef2d964b15c7104b9937d  gcc/ada/Make-generated.in
  6c9c3b4249e781ed48c7ae55e8ef9999  gcc/ada/Makefile.in
! f4aae1230ec3af32ac53138e5ed6a1ff  gcc/ada/Makefile.rtl
  38343dc270740eef23a38cd3c750dde1  gcc/ada/accessibility.adb
  fbd3226b85f1e1cc6eb250fa51de4be1  gcc/ada/accessibility.ads
  80867b66cbed2dba054564ea216b3c66  gcc/ada/ada_get_targ.adb
*************** f8207765beac36c54d43698a11140afa  gcc/ad
*** 613,620 ****
  3150d7e2a4f0018bb92d065ed3aedcc0  gcc/ada/argv-lynxos178-raven-cert.c
  5470386a6301c0323b6ee66cf06c1e42  gcc/ada/argv.c
  f2493dd09ce42a8a76ba82606b9e20e3  gcc/ada/aspects.adb
! 5aadfd1c7c46b94fbae4ef5ea3f8c9fb  gcc/ada/aspects.ads
! dd61750c7da30497eea05e15d8c28e7b  gcc/ada/atree.adb
  e06413c30b21b3ef9529c9b89592cca6  gcc/ada/atree.ads
  1a5f952bcb9d3c3529147729f3c4ef61  gcc/ada/atree.h
  557d2d802d51833ba752f2b05e30c591  gcc/ada/aux-io.c
--- 613,620 ----
  3150d7e2a4f0018bb92d065ed3aedcc0  gcc/ada/argv-lynxos178-raven-cert.c
  5470386a6301c0323b6ee66cf06c1e42  gcc/ada/argv.c
  f2493dd09ce42a8a76ba82606b9e20e3  gcc/ada/aspects.adb
! 8c62ffc91a61d63a863ec2627bbc388a  gcc/ada/aspects.ads
! 6ac042bab0630fbc0b61560d012db735  gcc/ada/atree.adb
  e06413c30b21b3ef9529c9b89592cca6  gcc/ada/atree.ads
  1a5f952bcb9d3c3529147729f3c4ef61  gcc/ada/atree.h
  557d2d802d51833ba752f2b05e30c591  gcc/ada/aux-io.c
*************** aa738dcebdf52f114dc2973019727da6  gcc/ad
*** 628,634 ****
  fac33e7248d1861201371edab993043b  gcc/ada/binde.ads
  ab8fa14bb86df108472a13dcc1b9d70f  gcc/ada/binderr.adb
  35dbcfe21d4e6360eb7fc5efa66ee28f  gcc/ada/binderr.ads
! b68fad44bcff6c978c37627ba75c8d42  gcc/ada/bindgen.adb
  e426b04a4bf47b1a91e530ac81300e86  gcc/ada/bindgen.ads
  415056107aa9043be758c707431a6219  gcc/ada/bindo-augmentors.adb
  b64567719158122058df5a1877a7afe9  gcc/ada/bindo-augmentors.ads
--- 628,634 ----
  fac33e7248d1861201371edab993043b  gcc/ada/binde.ads
  ab8fa14bb86df108472a13dcc1b9d70f  gcc/ada/binderr.adb
  35dbcfe21d4e6360eb7fc5efa66ee28f  gcc/ada/binderr.ads
! de0dfd2e10758d4a9d824d4dff0b265f  gcc/ada/bindgen.adb
  e426b04a4bf47b1a91e530ac81300e86  gcc/ada/bindgen.ads
  415056107aa9043be758c707431a6219  gcc/ada/bindo-augmentors.adb
  b64567719158122058df5a1877a7afe9  gcc/ada/bindo-augmentors.ads
*************** e534e3e90407ece58cb74fbdc390f33d  gcc/ad
*** 652,661 ****
  7afaa9bd68b3caf3cf5ba8f63025bcfe  gcc/ada/bindusg.ads
  38226bd2cbf827e12aa65824c4925664  gcc/ada/butil.adb
  ae344bff4834b9e2ef3c07f6dd01b59b  gcc/ada/butil.ads
- 530290230985903c593cb9d92f5b47c8  gcc/ada/cal.c
  2acfb74c50c4563afcbe6a1bca3912a3  gcc/ada/casing.adb
  c576df64e1d6a2ac70b389cc10a835e6  gcc/ada/casing.ads
! b7fba43a3736cbff21d66ebddbb4f20a  gcc/ada/checks.adb
  f963647952269416533799c6a5117ea3  gcc/ada/checks.ads
  4c0942bba88f786dffff9a3575759026  gcc/ada/cio.c
  10b93c3ec680bbe04e70ea0e2fb09ac7  gcc/ada/clean.adb
--- 652,660 ----
  7afaa9bd68b3caf3cf5ba8f63025bcfe  gcc/ada/bindusg.ads
  38226bd2cbf827e12aa65824c4925664  gcc/ada/butil.adb
  ae344bff4834b9e2ef3c07f6dd01b59b  gcc/ada/butil.ads
  2acfb74c50c4563afcbe6a1bca3912a3  gcc/ada/casing.adb
  c576df64e1d6a2ac70b389cc10a835e6  gcc/ada/casing.ads
! e5125566eca3360d59cc5eb0c3984ce2  gcc/ada/checks.adb
  f963647952269416533799c6a5117ea3  gcc/ada/checks.ads
  4c0942bba88f786dffff9a3575759026  gcc/ada/cio.c
  10b93c3ec680bbe04e70ea0e2fb09ac7  gcc/ada/clean.adb
*************** f963647952269416533799c6a5117ea3  gcc/ad
*** 663,669 ****
  8c73593e7f221d2f965d45654a94a636  gcc/ada/comperr.adb
  b819ca6fd93695993d2656d2edc4cc8c  gcc/ada/comperr.ads
  7f9ac0dab1302fd2696f52755a30ca56  gcc/ada/config-lang.in
! 9a65410828be7a88078cee6c3eb744f5  gcc/ada/contracts.adb
  08509704a245c7fb15ecf43481261825  gcc/ada/contracts.ads
  09a5213fb46479fc00bc1e507f07c02d  gcc/ada/csets.adb
  c8fc2a7d00b9bdf2dfb05cf0fc1c945f  gcc/ada/csets.ads
--- 662,668 ----
  8c73593e7f221d2f965d45654a94a636  gcc/ada/comperr.adb
  b819ca6fd93695993d2656d2edc4cc8c  gcc/ada/comperr.ads
  7f9ac0dab1302fd2696f52755a30ca56  gcc/ada/config-lang.in
! c86fbf78ebbf4e22e6591e334888bd79  gcc/ada/contracts.adb
  08509704a245c7fb15ecf43481261825  gcc/ada/contracts.ads
  09a5213fb46479fc00bc1e507f07c02d  gcc/ada/csets.adb
  c8fc2a7d00b9bdf2dfb05cf0fc1c945f  gcc/ada/csets.ads
*************** a012e0cb5df366014b5a4988036a509a  gcc/ad
*** 680,686 ****
  7559c05099cde820bf8bebbceabccc04  gcc/ada/doc/gnat_rm.rst
  5bf95a83da0a709f6bdf91751e65e01f  gcc/ada/doc/gnat_rm/about_this_guide.rst
  95f36013115a0d2964f52a340712b135  gcc/ada/doc/gnat_rm/compatibility_and_porting_guide.rst
! a65b1c2f40e476c59c8d97102cc8e08c  gcc/ada/doc/gnat_rm/gnat_language_extensions.rst
  ae3d832d67eb0561de58deff709050db  gcc/ada/doc/gnat_rm/implementation_advice.rst
  4ef0af28325df2c1534cc73b9f4ed108  gcc/ada/doc/gnat_rm/implementation_defined_aspects.rst
  687e948eae92592a9bb4b738fd473d80  gcc/ada/doc/gnat_rm/implementation_defined_attributes.rst
--- 679,685 ----
  7559c05099cde820bf8bebbceabccc04  gcc/ada/doc/gnat_rm.rst
  5bf95a83da0a709f6bdf91751e65e01f  gcc/ada/doc/gnat_rm/about_this_guide.rst
  95f36013115a0d2964f52a340712b135  gcc/ada/doc/gnat_rm/compatibility_and_porting_guide.rst
! e720005d40bb3f5789a5c87a764fb82e  gcc/ada/doc/gnat_rm/gnat_language_extensions.rst
  ae3d832d67eb0561de58deff709050db  gcc/ada/doc/gnat_rm/implementation_advice.rst
  4ef0af28325df2c1534cc73b9f4ed108  gcc/ada/doc/gnat_rm/implementation_defined_aspects.rst
  687e948eae92592a9bb4b738fd473d80  gcc/ada/doc/gnat_rm/implementation_defined_attributes.rst
*************** cd313e8a12cdfb20b99eede7c5252f16  gcc/ad
*** 692,706 ****
  d3ffb5a905c9520d87b68e10029eb023  gcc/ada/doc/gnat_rm/intrinsic_subprograms.rst
  bb3c8ae8aaf1cbd06bc44135da97d801  gcc/ada/doc/gnat_rm/obsolescent_features.rst
  952177853de529b7a2f483f0d195d2b4  gcc/ada/doc/gnat_rm/representation_clauses_and_pragmas.rst
! 1fb33f7304c23a143fa3a6313055f70b  gcc/ada/doc/gnat_rm/security_hardening_features.rst
  2fcc4a1e79f8bad335a4fa544f39c374  gcc/ada/doc/gnat_rm/specialized_needs_annexes.rst
  31e0ba409ca563e1717444ab64e1e253  gcc/ada/doc/gnat_rm/standard_and_implementation_defined_restrictions.rst
  a8608ebf71444d2564728c8a41283e03  gcc/ada/doc/gnat_rm/standard_library_routines.rst
! 56f7744dd862728c63870212761faa26  gcc/ada/doc/gnat_rm/the_gnat_library.rst
  391d17bf855af400348685ff678c6a6a  gcc/ada/doc/gnat_rm/the_implementation_of_standard_i_o.rst
  ad0b18bc67f8911f5f0d9d2762f19f82  gcc/ada/doc/gnat_ugn.rst
  97271c06a675f62b05d2a744164c36e1  gcc/ada/doc/gnat_ugn/about_this_guide.rst
! e2eeb26a001a6279d55471a47eb60908  gcc/ada/doc/gnat_ugn/building_executable_programs_with_gnat.rst
  2bd1b4bce35f627e35f3316337a622f2  gcc/ada/doc/gnat_ugn/elaboration_order_handling_in_gnat.rst
  56a5718b224a18464cc8f770c1288a14  gcc/ada/doc/gnat_ugn/example_of_binder_output.rst
  6f289cabdb2ee5e2e1818f135c23020e  gcc/ada/doc/gnat_ugn/getting_started_with_gnat.rst
--- 691,705 ----
  d3ffb5a905c9520d87b68e10029eb023  gcc/ada/doc/gnat_rm/intrinsic_subprograms.rst
  bb3c8ae8aaf1cbd06bc44135da97d801  gcc/ada/doc/gnat_rm/obsolescent_features.rst
  952177853de529b7a2f483f0d195d2b4  gcc/ada/doc/gnat_rm/representation_clauses_and_pragmas.rst
! 1813c7ae4ff4245bfbeb8dcf9e475019  gcc/ada/doc/gnat_rm/security_hardening_features.rst
  2fcc4a1e79f8bad335a4fa544f39c374  gcc/ada/doc/gnat_rm/specialized_needs_annexes.rst
  31e0ba409ca563e1717444ab64e1e253  gcc/ada/doc/gnat_rm/standard_and_implementation_defined_restrictions.rst
  a8608ebf71444d2564728c8a41283e03  gcc/ada/doc/gnat_rm/standard_library_routines.rst
! acd9838ed6c44495a93b84c6e2585b57  gcc/ada/doc/gnat_rm/the_gnat_library.rst
  391d17bf855af400348685ff678c6a6a  gcc/ada/doc/gnat_rm/the_implementation_of_standard_i_o.rst
  ad0b18bc67f8911f5f0d9d2762f19f82  gcc/ada/doc/gnat_ugn.rst
  97271c06a675f62b05d2a744164c36e1  gcc/ada/doc/gnat_ugn/about_this_guide.rst
! 51260329363a6ef895294b22c5b252d4  gcc/ada/doc/gnat_ugn/building_executable_programs_with_gnat.rst
  2bd1b4bce35f627e35f3316337a622f2  gcc/ada/doc/gnat_ugn/elaboration_order_handling_in_gnat.rst
  56a5718b224a18464cc8f770c1288a14  gcc/ada/doc/gnat_ugn/example_of_binder_output.rst
  6f289cabdb2ee5e2e1818f135c23020e  gcc/ada/doc/gnat_ugn/getting_started_with_gnat.rst
*************** f1c71b64e1c84e240c7b5aea7331a32a  gcc/ad
*** 720,726 ****
  bf442e3478574e268c5c8caa98f59095  gcc/ada/einfo-utils.adb
  76b28b93a0162cb31366aec9f77d5717  gcc/ada/einfo-utils.ads
  4f882a8b5e78253d5838b1a83e4af5bb  gcc/ada/einfo.adb
! 771439734d0a2dd0575149de22bf639f  gcc/ada/einfo.ads
  9fb4fb23a55081d07dc554eeb3253f91  gcc/ada/elists.adb
  1d7f8772477453dee268f8697433a589  gcc/ada/elists.ads
  2d6cb36d45dda0bf32d01725709f0007  gcc/ada/elists.h
--- 719,725 ----
  bf442e3478574e268c5c8caa98f59095  gcc/ada/einfo-utils.adb
  76b28b93a0162cb31366aec9f77d5717  gcc/ada/einfo-utils.ads
  4f882a8b5e78253d5838b1a83e4af5bb  gcc/ada/einfo.adb
! c62890b0c038e37ff702feede30c7cea  gcc/ada/einfo.ads
  9fb4fb23a55081d07dc554eeb3253f91  gcc/ada/elists.adb
  1d7f8772477453dee268f8697433a589  gcc/ada/elists.ads
  2d6cb36d45dda0bf32d01725709f0007  gcc/ada/elists.h
*************** e51a9a19184b2a73f27bb944998177e6  gcc/ad
*** 745,755 ****
  8745064abd42114e7f2f12824abd58f8  gcc/ada/eval_fat.adb
  04c8399e5b8f5b974be325af4fc5793b  gcc/ada/eval_fat.ads
  5062429d8789169d01db0423985a5e99  gcc/ada/exit.c
! cf8fe4e5bcf592ace46c0384a04086cd  gcc/ada/exp_aggr.adb
  738bfb6669a1b696ef62dbecd858300a  gcc/ada/exp_aggr.ads
  f5cfbe3c80cc2c7ded2440a52b2b9cf0  gcc/ada/exp_atag.adb
  17872534d797a09463e33092ff3c4b9c  gcc/ada/exp_atag.ads
! 6ad3fc2b918c470a287a98513b937138  gcc/ada/exp_attr.adb
  16622dd90fd58bfbfa68224d0bfaf8b2  gcc/ada/exp_attr.ads
  4cb08de59df5f8d0a124038dcbb392f0  gcc/ada/exp_cg.adb
  b18d9873e8e43583acd0e69ba6635023  gcc/ada/exp_cg.ads
--- 744,754 ----
  8745064abd42114e7f2f12824abd58f8  gcc/ada/eval_fat.adb
  04c8399e5b8f5b974be325af4fc5793b  gcc/ada/eval_fat.ads
  5062429d8789169d01db0423985a5e99  gcc/ada/exit.c
! c22f123f2da404cf9434264f134ffca8  gcc/ada/exp_aggr.adb
  738bfb6669a1b696ef62dbecd858300a  gcc/ada/exp_aggr.ads
  f5cfbe3c80cc2c7ded2440a52b2b9cf0  gcc/ada/exp_atag.adb
  17872534d797a09463e33092ff3c4b9c  gcc/ada/exp_atag.ads
! 90941e4d6649d4debafab00b279def1d  gcc/ada/exp_attr.adb
  16622dd90fd58bfbfa68224d0bfaf8b2  gcc/ada/exp_attr.ads
  4cb08de59df5f8d0a124038dcbb392f0  gcc/ada/exp_cg.adb
  b18d9873e8e43583acd0e69ba6635023  gcc/ada/exp_cg.ads
*************** fce186389d317dec9c580f569a2a845a  gcc/ad
*** 762,774 ****
  c6728830f0888dc3385e474b5925c01f  gcc/ada/exp_ch13.ads
  d037443d1b61c02110e124f3c701b449  gcc/ada/exp_ch2.adb
  476e299ea88b583859604d0071046143  gcc/ada/exp_ch2.ads
! 91f6084f52d1f03a797c1205b67c475b  gcc/ada/exp_ch3.adb
! 53e0d855cd76aedff48a9e6266db49e8  gcc/ada/exp_ch3.ads
! d3dd50b6eb5a1e22c3948b1d4de14045  gcc/ada/exp_ch4.adb
  ef982b9647c35560ae7ff386e547bd16  gcc/ada/exp_ch4.ads
  a6101b8ff6b37d2b8018d7081f04151a  gcc/ada/exp_ch5.adb
  f0c7dc0ade3f9639e946e709a9288f31  gcc/ada/exp_ch5.ads
! 8ac910aacf65c2011d5ed9c92df01a3e  gcc/ada/exp_ch6.adb
  54a1ff576d38d91bbd44c24ee1a6a5ff  gcc/ada/exp_ch6.ads
  c57a021ec5e6cc614c6092d2b1d41b56  gcc/ada/exp_ch7.adb
  31ee5e50c565d4788d9b794acb5bfebb  gcc/ada/exp_ch7.ads
--- 761,773 ----
  c6728830f0888dc3385e474b5925c01f  gcc/ada/exp_ch13.ads
  d037443d1b61c02110e124f3c701b449  gcc/ada/exp_ch2.adb
  476e299ea88b583859604d0071046143  gcc/ada/exp_ch2.ads
! 3d62d5b3a382429d7d88e73a640999b7  gcc/ada/exp_ch3.adb
! d1b7c8ba53a4cc5868e87b17370562ce  gcc/ada/exp_ch3.ads
! 475f8a69e03954635fb817f229ff8699  gcc/ada/exp_ch4.adb
  ef982b9647c35560ae7ff386e547bd16  gcc/ada/exp_ch4.ads
  a6101b8ff6b37d2b8018d7081f04151a  gcc/ada/exp_ch5.adb
  f0c7dc0ade3f9639e946e709a9288f31  gcc/ada/exp_ch5.ads
! 22af16ce6d5e89b6427f51310b2d1f6f  gcc/ada/exp_ch6.adb
  54a1ff576d38d91bbd44c24ee1a6a5ff  gcc/ada/exp_ch6.ads
  c57a021ec5e6cc614c6092d2b1d41b56  gcc/ada/exp_ch7.adb
  31ee5e50c565d4788d9b794acb5bfebb  gcc/ada/exp_ch7.ads
*************** c48a8396237679c48ceef2c507661e1a  gcc/ad
*** 794,800 ****
  0e4de6363c3876604fc8fa97e180ddcf  gcc/ada/exp_pakd.ads
  b854c252a817c2248929d37e459d3e76  gcc/ada/exp_prag.adb
  b971e56ee00efc31bd07e4f49eb4e97e  gcc/ada/exp_prag.ads
! 6983963a291a366b979e48c5a8edaf02  gcc/ada/exp_put_image.adb
  c0f39ee1d515a13193e5726a49291c99  gcc/ada/exp_put_image.ads
  e224b65ac653dc73160c1665f825b557  gcc/ada/exp_sel.adb
  adda0da8d4f449351c0486c3277f39bd  gcc/ada/exp_sel.ads
--- 793,799 ----
  0e4de6363c3876604fc8fa97e180ddcf  gcc/ada/exp_pakd.ads
  b854c252a817c2248929d37e459d3e76  gcc/ada/exp_prag.adb
  b971e56ee00efc31bd07e4f49eb4e97e  gcc/ada/exp_prag.ads
! 8eb9145492d5ab5b0d7c2b5e36087feb  gcc/ada/exp_put_image.adb
  c0f39ee1d515a13193e5726a49291c99  gcc/ada/exp_put_image.ads
  e224b65ac653dc73160c1665f825b557  gcc/ada/exp_sel.adb
  adda0da8d4f449351c0486c3277f39bd  gcc/ada/exp_sel.ads
*************** adda0da8d4f449351c0486c3277f39bd  gcc/ad
*** 802,819 ****
  5eb50023abeda9a76f66518671ad1d05  gcc/ada/exp_smem.ads
  6089fb5771e4cd54334f73ef36cfe220  gcc/ada/exp_spark.adb
  0365865a8be979f0a1db6a61cadbe940  gcc/ada/exp_spark.ads
! c545b78124b9df301cdeef2979c79209  gcc/ada/exp_strm.adb
! 772292d8d5c1417fcb3279f7ac312e3a  gcc/ada/exp_strm.ads
  59000e9704cdc65241a4bceab3308eb3  gcc/ada/exp_tss.adb
  52a5741c37559d0398594d7baa1c99ac  gcc/ada/exp_tss.ads
  a55ae41c0e68be209828e4229c2bbae3  gcc/ada/exp_unst.adb
  d2f34876e61000e49299ef9b2569cbbf  gcc/ada/exp_unst.ads
! f607907bc5477bc0d63a0f652f28734d  gcc/ada/exp_util.adb
! f38c33811ff4495921f4fab803f1b045  gcc/ada/exp_util.ads
  46d0480b64db4c72cf1f08b18e3c33cf  gcc/ada/expander.adb
  53bb0eb5c4feebf8b5fbef639f5827bd  gcc/ada/expander.ads
  b38851c9b7a0167a71b96e69b7c86fb1  gcc/ada/expect.c
! ec920df5545ce1582319f1bfda3c5a19  gcc/ada/fe.h
  e0c5e28f92b1d5fad283ec608aceb807  gcc/ada/final.c
  43fdec6dde9d9997d9651da910b55df3  gcc/ada/fmap.adb
  fdb9382a8288a3a5b805910a0a3615e8  gcc/ada/fmap.ads
--- 801,818 ----
  5eb50023abeda9a76f66518671ad1d05  gcc/ada/exp_smem.ads
  6089fb5771e4cd54334f73ef36cfe220  gcc/ada/exp_spark.adb
  0365865a8be979f0a1db6a61cadbe940  gcc/ada/exp_spark.ads
! cd856c9dca28a3bb7cb71b6e61da98d8  gcc/ada/exp_strm.adb
! ee769a63f7ef20a179accef0a80ef873  gcc/ada/exp_strm.ads
  59000e9704cdc65241a4bceab3308eb3  gcc/ada/exp_tss.adb
  52a5741c37559d0398594d7baa1c99ac  gcc/ada/exp_tss.ads
  a55ae41c0e68be209828e4229c2bbae3  gcc/ada/exp_unst.adb
  d2f34876e61000e49299ef9b2569cbbf  gcc/ada/exp_unst.ads
! 2d1043da4611eb3502acb57f1373091f  gcc/ada/exp_util.adb
! 24baec8a8e8188bc72055a6a83ac20fb  gcc/ada/exp_util.ads
  46d0480b64db4c72cf1f08b18e3c33cf  gcc/ada/expander.adb
  53bb0eb5c4feebf8b5fbef639f5827bd  gcc/ada/expander.ads
  b38851c9b7a0167a71b96e69b7c86fb1  gcc/ada/expect.c
! df55beccdf002ea7f1c083561caee63c  gcc/ada/fe.h
  e0c5e28f92b1d5fad283ec608aceb807  gcc/ada/final.c
  43fdec6dde9d9997d9651da910b55df3  gcc/ada/fmap.adb
  fdb9382a8288a3a5b805910a0a3615e8  gcc/ada/fmap.ads
*************** fdb9382a8288a3a5b805910a0a3615e8  gcc/ad
*** 823,856 ****
  576d7463667fc4c859a05f9e19146427  gcc/ada/fname-uf.ads
  ec7cf235c00294fe67198b9bf264f3d9  gcc/ada/fname.adb
  5ef403dc7e6540ad58ec4ccec10de65c  gcc/ada/fname.ads
! f86a2443c94f9794c10aa3b130605810  gcc/ada/freeze.adb
  0cfb73b82bc6277eb801329c392229d2  gcc/ada/freeze.ads
! 78dfce82b053fc553450c7ce6ee486d2  gcc/ada/frontend.adb
  6f776be1d84e9d8c996b576c19a4349f  gcc/ada/frontend.ads
  5febf852ffe2ba81709e97acc0e9d3be  gcc/ada/gcc-interface/Make-lang.in
  c9363baf654f7376690ac9ea9b9c33d3  gcc/ada/gcc-interface/Makefile.in
  b02134e55a04db5c49a710da26b19be1  gcc/ada/gcc-interface/ada-builtin-types.def
  bc1175cb4ea0b9cb5f8751b3f0da7f74  gcc/ada/gcc-interface/ada-builtins.def
  9671d558ad879f15e73993538906ebda  gcc/ada/gcc-interface/ada-tree.def
! d65508e5b536f55deb4de2fdc2856370  gcc/ada/gcc-interface/ada-tree.h
  9225a8cf7f4c37e1ac2c83d2916a1bdf  gcc/ada/gcc-interface/ada.h
  910c4ca7f1543916fa6923fa18e926e0  gcc/ada/gcc-interface/config-lang.in
  27a97efc2691bb0e500931269e932bee  gcc/ada/gcc-interface/cuintp.cc
! 6c0477d8edd9e0bb2a21998b385bb41b  gcc/ada/gcc-interface/decl.cc
  fa1feb51010fc73b933487acbdcf85e8  gcc/ada/gcc-interface/gadaint.h
! 94972108c40b178c2d98932c5567a1ff  gcc/ada/gcc-interface/gigi.h
  8c3391ec25d2f8a3e26b0553d537d3e2  gcc/ada/gcc-interface/lang-specs.h
  43e609e56eeb0ff4e57be465cd17ddbc  gcc/ada/gcc-interface/lang.opt
  9b5bb16ec797188515b64efd5c00378a  gcc/ada/gcc-interface/lang.opt.urls
! 290c4679447ac74af6882b61677cb0ec  gcc/ada/gcc-interface/misc.cc
  a74b4504c5ad4ed4e963f0691c289b40  gcc/ada/gcc-interface/system.ads
  b350a6fd65cafe8bd47dc42192437310  gcc/ada/gcc-interface/targtyps.cc
! 02c305fed7c93280c51c13b79ab6b533  gcc/ada/gcc-interface/trans.cc
! 0159b329bd9dd42886ea4604f01490dd  gcc/ada/gcc-interface/utils.cc
! a7b042b07a181e3c69fbfc1de98030b8  gcc/ada/gcc-interface/utils2.cc
! 6cabdcfe5118ea48a58229c6acf04fb9  gcc/ada/gen_il-fields.ads
! 0dc2bcba4378b6839cffdf6478647736  gcc/ada/gen_il-gen-gen_entities.adb
! 0c3266d94a13670e5638216a39aedc06  gcc/ada/gen_il-gen-gen_nodes.adb
  fa07e4c6240b8cfff6d7d98112fee236  gcc/ada/gen_il-gen.adb
  c979a98c6b57608c79d578871fa0c58a  gcc/ada/gen_il-gen.ads
  46571b946dd81b69b575b6c3618032df  gcc/ada/gen_il-internals.adb
--- 822,855 ----
  576d7463667fc4c859a05f9e19146427  gcc/ada/fname-uf.ads
  ec7cf235c00294fe67198b9bf264f3d9  gcc/ada/fname.adb
  5ef403dc7e6540ad58ec4ccec10de65c  gcc/ada/fname.ads
! c79c1c9f404c173669ce13802612cf8f  gcc/ada/freeze.adb
  0cfb73b82bc6277eb801329c392229d2  gcc/ada/freeze.ads
! 5f9e0e6d3b96540c54ba9e0ca89941e4  gcc/ada/frontend.adb
  6f776be1d84e9d8c996b576c19a4349f  gcc/ada/frontend.ads
  5febf852ffe2ba81709e97acc0e9d3be  gcc/ada/gcc-interface/Make-lang.in
  c9363baf654f7376690ac9ea9b9c33d3  gcc/ada/gcc-interface/Makefile.in
  b02134e55a04db5c49a710da26b19be1  gcc/ada/gcc-interface/ada-builtin-types.def
  bc1175cb4ea0b9cb5f8751b3f0da7f74  gcc/ada/gcc-interface/ada-builtins.def
  9671d558ad879f15e73993538906ebda  gcc/ada/gcc-interface/ada-tree.def
! 5e95bb15b545a904984f3484a4f9274d  gcc/ada/gcc-interface/ada-tree.h
  9225a8cf7f4c37e1ac2c83d2916a1bdf  gcc/ada/gcc-interface/ada.h
  910c4ca7f1543916fa6923fa18e926e0  gcc/ada/gcc-interface/config-lang.in
  27a97efc2691bb0e500931269e932bee  gcc/ada/gcc-interface/cuintp.cc
! 7e71d1797872f9de4521e7d6c532ff13  gcc/ada/gcc-interface/decl.cc
  fa1feb51010fc73b933487acbdcf85e8  gcc/ada/gcc-interface/gadaint.h
! becebc263397cb3c5be3c7083cf21c55  gcc/ada/gcc-interface/gigi.h
  8c3391ec25d2f8a3e26b0553d537d3e2  gcc/ada/gcc-interface/lang-specs.h
  43e609e56eeb0ff4e57be465cd17ddbc  gcc/ada/gcc-interface/lang.opt
  9b5bb16ec797188515b64efd5c00378a  gcc/ada/gcc-interface/lang.opt.urls
! 64489370c0189502332c2aa078a86fdf  gcc/ada/gcc-interface/misc.cc
  a74b4504c5ad4ed4e963f0691c289b40  gcc/ada/gcc-interface/system.ads
  b350a6fd65cafe8bd47dc42192437310  gcc/ada/gcc-interface/targtyps.cc
! da0eec04fa84f1979f8529e306ef97e6  gcc/ada/gcc-interface/trans.cc
! d1b1a259037d2d36b6e9aab55df4f82d  gcc/ada/gcc-interface/utils.cc
! 0b638ee76fd250092e4f0077d2deb899  gcc/ada/gcc-interface/utils2.cc
! 7f457b4dfdc40122d286fdd928bdad0b  gcc/ada/gen_il-fields.ads
! 71efadf4579df758ff3d06f657397f1f  gcc/ada/gen_il-gen-gen_entities.adb
! 3d4e50ccf4f53a8711b946ad7fcb2f89  gcc/ada/gen_il-gen-gen_nodes.adb
  fa07e4c6240b8cfff6d7d98112fee236  gcc/ada/gen_il-gen.adb
  c979a98c6b57608c79d578871fa0c58a  gcc/ada/gen_il-gen.ads
  46571b946dd81b69b575b6c3618032df  gcc/ada/gen_il-internals.adb
*************** a1d2619ccca21c06754f3cdd326876e1  gcc/ad
*** 864,879 ****
  0930ee3acae3e581cd90b4ea71d36c46  gcc/ada/get_scos.ads
  c30d04e8e72b6ecb391a5f74ed43baa6  gcc/ada/get_targ.adb
  1033bc14018eca0ac6056a8955c8e228  gcc/ada/get_targ.ads
! 2609d4f401bdd3665c7aaed414ca79d1  gcc/ada/ghost.adb
! 5e2e8493c183a79bf1f225fdb7f60e0a  gcc/ada/ghost.ads
  6f5b1925a8a5b030703dd62acb3e37cc  gcc/ada/gnat-style.texi
  be98a1e6f04922fb22c79c4540070fe5  gcc/ada/gnat1drv.adb
  9ed317231a93f12d370f13f5070cdaab  gcc/ada/gnat1drv.ads
  917ea7311a30ec4c5cec3e610ca640c2  gcc/ada/gnat2.gpr
  49c5329fd360e2bf4e549bc7de93aab7  gcc/ada/gnat_cuda.adb
  de69fc271ce889490809004600fcac0f  gcc/ada/gnat_cuda.ads
! b1885e0c887f8df229c408fb567666a7  gcc/ada/gnat_rm.texi
! 29fa074d045ab737a99e1ad833ffbf8e  gcc/ada/gnat_ugn.texi
  957e02fdb4684d592d9172cea8dfb4cb  gcc/ada/gnatbind.adb
  fff8dfca966e9d6f779ce90e57344a0f  gcc/ada/gnatbind.ads
  aef32d71626b4170f80d299f2304d737  gcc/ada/gnatchop.adb
--- 863,878 ----
  0930ee3acae3e581cd90b4ea71d36c46  gcc/ada/get_scos.ads
  c30d04e8e72b6ecb391a5f74ed43baa6  gcc/ada/get_targ.adb
  1033bc14018eca0ac6056a8955c8e228  gcc/ada/get_targ.ads
! f6df19c1e5567e6604b916b752514d38  gcc/ada/ghost.adb
! 1109d7291e3ece3ae8cb7b668e16d9cd  gcc/ada/ghost.ads
  6f5b1925a8a5b030703dd62acb3e37cc  gcc/ada/gnat-style.texi
  be98a1e6f04922fb22c79c4540070fe5  gcc/ada/gnat1drv.adb
  9ed317231a93f12d370f13f5070cdaab  gcc/ada/gnat1drv.ads
  917ea7311a30ec4c5cec3e610ca640c2  gcc/ada/gnat2.gpr
  49c5329fd360e2bf4e549bc7de93aab7  gcc/ada/gnat_cuda.adb
  de69fc271ce889490809004600fcac0f  gcc/ada/gnat_cuda.ads
! e3ddb0ee022aa1a702b7eccdba675560  gcc/ada/gnat_rm.texi
! 2e97e932a7f0177640c9024388e2a1c4  gcc/ada/gnat_ugn.texi
  957e02fdb4684d592d9172cea8dfb4cb  gcc/ada/gnatbind.adb
  fff8dfca966e9d6f779ce90e57344a0f  gcc/ada/gnatbind.ads
  aef32d71626b4170f80d299f2304d737  gcc/ada/gnatchop.adb
*************** b06692d44846cc28fe529c1ea2f3ded6  gcc/ad
*** 900,906 ****
  56f06790ba3f6dfe539fa7f244e80e53  gcc/ada/gprep.ads
  c5800bf428d690955e4f8f9f3efd4017  gcc/ada/gsocket.h
  e4efe68d0e25214fe54b93342a51d8bd  gcc/ada/hostparm.ads
! b18590491ceee0c729cf111d19381239  gcc/ada/impunit.adb
  7407048c8e72f7cc4527e91ef1efd1c8  gcc/ada/impunit.ads
  14804d79740943cb179f803307da9e2d  gcc/ada/indepsw-aix.adb
  ee1cd4291748880452771b977bf8cb70  gcc/ada/indepsw-darwin.adb
--- 899,905 ----
  56f06790ba3f6dfe539fa7f244e80e53  gcc/ada/gprep.ads
  c5800bf428d690955e4f8f9f3efd4017  gcc/ada/gsocket.h
  e4efe68d0e25214fe54b93342a51d8bd  gcc/ada/hostparm.ads
! 798a342aab6d9251f0f5bc3a245473ca  gcc/ada/impunit.adb
  7407048c8e72f7cc4527e91ef1efd1c8  gcc/ada/impunit.ads
  14804d79740943cb179f803307da9e2d  gcc/ada/indepsw-aix.adb
  ee1cd4291748880452771b977bf8cb70  gcc/ada/indepsw-darwin.adb
*************** fae5c64806f921b2c67652d6b3a99421  gcc/ad
*** 917,923 ****
  93e400538975a4c66730d29f23e6e9a8  gcc/ada/json_utils.ads
  f06a26272057ce1be21c9d5c5b109939  gcc/ada/krunch.adb
  cb8b4ae7eda616665ff5623008560e83  gcc/ada/krunch.ads
! 97f98aab4c6d6cc80fcdc365034c9168  gcc/ada/layout.adb
  b4b99fcd90ad634233395f84a0a1a6eb  gcc/ada/layout.ads
  3f0bde567ad1e8961d92e121563b097d  gcc/ada/lib-list.adb
  17aaa002830c4185209c54931af90728  gcc/ada/lib-load.adb
--- 916,922 ----
  93e400538975a4c66730d29f23e6e9a8  gcc/ada/json_utils.ads
  f06a26272057ce1be21c9d5c5b109939  gcc/ada/krunch.adb
  cb8b4ae7eda616665ff5623008560e83  gcc/ada/krunch.ads
! 96abd296aa3e38d599c6e3945dbfbd35  gcc/ada/layout.adb
  b4b99fcd90ad634233395f84a0a1a6eb  gcc/ada/layout.ads
  3f0bde567ad1e8961d92e121563b097d  gcc/ada/lib-list.adb
  17aaa002830c4185209c54931af90728  gcc/ada/lib-load.adb
*************** d0dcad42c7f5527c0d09aa31191ce38e  gcc/ad
*** 947,953 ****
  f2529d7d954706cdf38dcf20a54542d7  gcc/ada/libgnarl/a-exetim__default.ads
  44b1424bb64f2bbef09199c17aef5a81  gcc/ada/libgnarl/a-exetim__mingw.adb
  3f2dbfd846f53bf0d8341f97fd861b11  gcc/ada/libgnarl/a-exetim__mingw.ads
! 8ca19f8965fe4788269ea0453ba41605  gcc/ada/libgnarl/a-exetim__posix.adb
  8a70e70c5d53efd2ae8de2a025db3217  gcc/ada/libgnarl/a-extiin.ads
  66ba8470ba07e36d23031779e1ebee31  gcc/ada/libgnarl/a-extiti.ads
  5be8214b69f1a8d9f25fa63bdeca1bd8  gcc/ada/libgnarl/a-interr.adb
--- 946,952 ----
  f2529d7d954706cdf38dcf20a54542d7  gcc/ada/libgnarl/a-exetim__default.ads
  44b1424bb64f2bbef09199c17aef5a81  gcc/ada/libgnarl/a-exetim__mingw.adb
  3f2dbfd846f53bf0d8341f97fd861b11  gcc/ada/libgnarl/a-exetim__mingw.ads
! 325c86b093d5b9bd6b535ecb2a25412b  gcc/ada/libgnarl/a-exetim__posix.adb
  8a70e70c5d53efd2ae8de2a025db3217  gcc/ada/libgnarl/a-extiin.ads
  66ba8470ba07e36d23031779e1ebee31  gcc/ada/libgnarl/a-extiti.ads
  5be8214b69f1a8d9f25fa63bdeca1bd8  gcc/ada/libgnarl/a-interr.adb
*************** fe5d44bcdcd16cb7254131c05dc8f7e1  gcc/ad
*** 1022,1075 ****
  e2bf398dfdddb692d0fa1eba019712b8  gcc/ada/libgnarl/s-intman__susv3.adb
  40c4cf2cc30dbdf094af276c8aa467b6  gcc/ada/libgnarl/s-intman__vxworks.adb
  3f1fb13bf3641685cdebf9e08b0c5a15  gcc/ada/libgnarl/s-intman__vxworks.ads
! cee21258ec217f5bc4c93b53338907fc  gcc/ada/libgnarl/s-linux.ads
! 6d314e92a3b56ca40a8a9e5b6239016f  gcc/ada/libgnarl/s-linux__alpha.ads
! c39376106ccbfa3ea3676b8eac43cd94  gcc/ada/libgnarl/s-linux__android-aarch64.ads
! cd6cd03fe74a24adc317fab9fd17fecf  gcc/ada/libgnarl/s-linux__android-arm.ads
! d22fe1a709ddc4cdc74f74d554f43900  gcc/ada/libgnarl/s-linux__hppa.ads
! 0bd8e0c79a206dbd8f6e3f9f8659dc22  gcc/ada/libgnarl/s-linux__loongarch.ads
! 4c7f49a2160e20a8f2c0f58b19aa6400  gcc/ada/libgnarl/s-linux__mips.ads
! 8d9e9ac6fa18a08ea69f59b5490cef5d  gcc/ada/libgnarl/s-linux__riscv.ads
! 0e84fd9b796f81b071ec2d24c7a6dfa2  gcc/ada/libgnarl/s-linux__sparc.ads
! 23594321753c7f59c7e57162d6efba47  gcc/ada/libgnarl/s-linux__x32.ads
  364ae12ee38d618d1fc6acff22c96b65  gcc/ada/libgnarl/s-mudido.adb
  d3d1bd17a6972764e499389c7f19f407  gcc/ada/libgnarl/s-mudido.ads
  31f7763dd12508f385bc86b8eec93ea3  gcc/ada/libgnarl/s-mudido__affinity.adb
! 3becd2c298bd7c470ccc7bf82838d5fb  gcc/ada/libgnarl/s-osinte__aix.adb
! 53bc92ac83a223844c31b801885045e7  gcc/ada/libgnarl/s-osinte__aix.ads
! 25bc7b4a9176142c5dac0efa7169582c  gcc/ada/libgnarl/s-osinte__android.adb
! fbb0dc8d9ba4e16bbbf721833fc3a1ba  gcc/ada/libgnarl/s-osinte__android.ads
! 9ab06dc131a653e8fa05a0850dde1c78  gcc/ada/libgnarl/s-osinte__cheribsd.ads
! b02df80b976018edcba09beb2acf70c8  gcc/ada/libgnarl/s-osinte__darwin.adb
! 3e2d7674ec46f394cb7b42b0a7c1b777  gcc/ada/libgnarl/s-osinte__darwin.ads
! 7e8a9abab76c014a99b1adc336046c0d  gcc/ada/libgnarl/s-osinte__dragonfly.adb
! ef3ac9294ccb6b56976902644abcb613  gcc/ada/libgnarl/s-osinte__dragonfly.ads
  d0adde9ec7603828a012fdaaadaad630  gcc/ada/libgnarl/s-osinte__dummy.ads
! 0cc8c8f1cced253be31fe712d0436fc2  gcc/ada/libgnarl/s-osinte__freebsd.adb
! bbdfb410b09f4c31e9a5294ff5e89652  gcc/ada/libgnarl/s-osinte__freebsd.ads
! 7fcf464fed12b261cda6a8ae8b930893  gcc/ada/libgnarl/s-osinte__gnu.adb
! 976ea88abc46b277b4e78a061b3408f2  gcc/ada/libgnarl/s-osinte__gnu.ads
! 6f513b2e61a890d10a4148fe02224442  gcc/ada/libgnarl/s-osinte__hpux.ads
! cd8f41a46e05396faff25ff6775ad1c4  gcc/ada/libgnarl/s-osinte__kfreebsd-gnu.ads
! 4b25d1026167e0e767e441aace4d5612  gcc/ada/libgnarl/s-osinte__linux.ads
! e084ee9e953258aab9bff358dd2ff17b  gcc/ada/libgnarl/s-osinte__lynxos178.adb
! 85abe305cc8852f629527536a8f2897b  gcc/ada/libgnarl/s-osinte__lynxos178e.ads
  97b5f8ffb8f4e099279499b8d8b99045  gcc/ada/libgnarl/s-osinte__mingw.ads
! d65c90a0924d038d91f11b0ae6482c26  gcc/ada/libgnarl/s-osinte__posix.adb
! fa52106df94a5e93578c34e6eb0563ba  gcc/ada/libgnarl/s-osinte__qnx.adb
! 23cdfb245a776851c0c5dd8bbc3e1119  gcc/ada/libgnarl/s-osinte__qnx.ads
! b6af399c7393b6ca3bdcc39db7007ca6  gcc/ada/libgnarl/s-osinte__rtems.adb
! cf413438984dffd7f40f63b4ca904d1e  gcc/ada/libgnarl/s-osinte__rtems.ads
! 52c671a642479c453e5008b6b04a1849  gcc/ada/libgnarl/s-osinte__solaris.adb
! 7802e7b0c0b6e0620b963fae44130d57  gcc/ada/libgnarl/s-osinte__solaris.ads
! cdfc3c84534ebb5e88089f9452c43178  gcc/ada/libgnarl/s-osinte__vxworks.adb
! a331b676d52b1df7647734de25dcb4f3  gcc/ada/libgnarl/s-osinte__vxworks.ads
! 7c9fc37de10c3ce31506deb8d0656582  gcc/ada/libgnarl/s-osinte__x32.adb
  837352c7f2da9fbf253e7640abc6473d  gcc/ada/libgnarl/s-proinf.adb
  d9322225886886bb45307ab213ae42e8  gcc/ada/libgnarl/s-proinf.ads
  4122ae8b3a539cc4a29f73174919e9e9  gcc/ada/libgnarl/s-putaim.adb
  3bd2db7a9f6861677714212e8d84797b  gcc/ada/libgnarl/s-putaim.ads
! c490e53799847d22dca76f3aa82718e7  gcc/ada/libgnarl/s-qnx.ads
  814bcd91d4b539d7bd20024c8c507881  gcc/ada/libgnarl/s-solita.adb
  4d820958426efff634a0d493ff53d34a  gcc/ada/libgnarl/s-solita.ads
  1cdf5498ce5d53d47910c453b7520e08  gcc/ada/libgnarl/s-stusta.adb
--- 1021,1071 ----
  e2bf398dfdddb692d0fa1eba019712b8  gcc/ada/libgnarl/s-intman__susv3.adb
  40c4cf2cc30dbdf094af276c8aa467b6  gcc/ada/libgnarl/s-intman__vxworks.adb
  3f1fb13bf3641685cdebf9e08b0c5a15  gcc/ada/libgnarl/s-intman__vxworks.ads
! f233f79a09d8cf878bfeaf15fdc81de8  gcc/ada/libgnarl/s-linux.ads
! 2a7f74fb336536b59c973752962ab0c0  gcc/ada/libgnarl/s-linux__alpha.ads
! 52d269f2ab8fb4f448cc94d9cf65d530  gcc/ada/libgnarl/s-linux__android-aarch64.ads
! a4a6a1cf04a7ba8d1abdaca12d0f79f8  gcc/ada/libgnarl/s-linux__android-arm.ads
! d14f7926f0ce09d2340955fab01a70dd  gcc/ada/libgnarl/s-linux__hppa.ads
! 21fce25f581dfbb37c892375b9dd6a33  gcc/ada/libgnarl/s-linux__loongarch.ads
! 30991e5fae6e031d3667dc0fc6306fc7  gcc/ada/libgnarl/s-linux__mips.ads
! 0ecca0f4f90694887306799b8efcb433  gcc/ada/libgnarl/s-linux__riscv.ads
! f80a759867f05736add5a71d86244061  gcc/ada/libgnarl/s-linux__sparc.ads
  364ae12ee38d618d1fc6acff22c96b65  gcc/ada/libgnarl/s-mudido.adb
  d3d1bd17a6972764e499389c7f19f407  gcc/ada/libgnarl/s-mudido.ads
  31f7763dd12508f385bc86b8eec93ea3  gcc/ada/libgnarl/s-mudido__affinity.adb
! a48395769b6ab8a78d5ade1e56f02718  gcc/ada/libgnarl/s-osinte__aix.adb
! 44c28c3732b86d34899fc11e8e3d26c8  gcc/ada/libgnarl/s-osinte__aix.ads
! eb5cd941ea4653a32880dfd1fe8705b9  gcc/ada/libgnarl/s-osinte__android.ads
! aefc96bdd1c0d0d58c355dc9e29158d8  gcc/ada/libgnarl/s-osinte__cheribsd.ads
! a62df5db13fcd77b0a03583272edabe4  gcc/ada/libgnarl/s-osinte__darwin.adb
! 7d32023112d7ad24e5dde88163fab374  gcc/ada/libgnarl/s-osinte__darwin.ads
! 0a7d4eed3d10447c797a03b5a11aa9c4  gcc/ada/libgnarl/s-osinte__dragonfly.adb
! 65617e981a661297ab9538df638e0b50  gcc/ada/libgnarl/s-osinte__dragonfly.ads
  d0adde9ec7603828a012fdaaadaad630  gcc/ada/libgnarl/s-osinte__dummy.ads
! 38f3afcb5cbaac6d9ae91f6087469472  gcc/ada/libgnarl/s-osinte__freebsd.adb
! 05c52b4d607e7186e3b8bc43e4d4ffe2  gcc/ada/libgnarl/s-osinte__freebsd.ads
! 00ff9609244ecca6940707cf9a62a124  gcc/ada/libgnarl/s-osinte__gnu.adb
! 309c7f716ada11511a9a24d0da2a807b  gcc/ada/libgnarl/s-osinte__gnu.ads
! 0a603564f05f3a970d71fe531dba8567  gcc/ada/libgnarl/s-osinte__hpux.ads
! 561a06e8e9c3e8c6a97bffac8aafcb9b  gcc/ada/libgnarl/s-osinte__kfreebsd-gnu.ads
! c8f3fbc8165ae38583ce8ac440de4138  gcc/ada/libgnarl/s-osinte__linux.ads
! 45b295509dd5215c5d0f86b72c63b2df  gcc/ada/libgnarl/s-osinte__lynxos178.adb
! 1ccf01a82e5565e40d52fe9a067aa4dd  gcc/ada/libgnarl/s-osinte__lynxos178e.ads
  97b5f8ffb8f4e099279499b8d8b99045  gcc/ada/libgnarl/s-osinte__mingw.ads
! db7c3f020d578faf82ae4b6ce57048f6  gcc/ada/libgnarl/s-osinte__posix.adb
! f196764f0d3c339c92080bb7a86f0d2d  gcc/ada/libgnarl/s-osinte__qnx.adb
! ceb72c3eb57ef99fe90b4609eb2bde94  gcc/ada/libgnarl/s-osinte__qnx.ads
! fca012e2101a14ae50f43e1c7c3f2b39  gcc/ada/libgnarl/s-osinte__rtems.adb
! cf8c66b4ae7e0ceb3f7c18131207360f  gcc/ada/libgnarl/s-osinte__rtems.ads
! d99ca8352955cb21d106a09cb78fc329  gcc/ada/libgnarl/s-osinte__solaris.adb
! 25a6b4905a5fcd785822697c9dc12345  gcc/ada/libgnarl/s-osinte__solaris.ads
! 5ad877855c5ea170f6bc351cf7169609  gcc/ada/libgnarl/s-osinte__vxworks.adb
! 377aececd0d8c430859c43c5fd666d56  gcc/ada/libgnarl/s-osinte__vxworks.ads
  837352c7f2da9fbf253e7640abc6473d  gcc/ada/libgnarl/s-proinf.adb
  d9322225886886bb45307ab213ae42e8  gcc/ada/libgnarl/s-proinf.ads
  4122ae8b3a539cc4a29f73174919e9e9  gcc/ada/libgnarl/s-putaim.adb
  3bd2db7a9f6861677714212e8d84797b  gcc/ada/libgnarl/s-putaim.ads
! de5e113bdba75d0ef1a26eb16f785be1  gcc/ada/libgnarl/s-qnx.ads
  814bcd91d4b539d7bd20024c8c507881  gcc/ada/libgnarl/s-solita.adb
  4d820958426efff634a0d493ff53d34a  gcc/ada/libgnarl/s-solita.ads
  1cdf5498ce5d53d47910c453b7520e08  gcc/ada/libgnarl/s-stusta.adb
*************** b11be01de6f079f6e83c844e9fdaf759  gcc/ad
*** 1091,1098 ****
  139d97e773970f5955d60a4af95755cb  gcc/ada/libgnarl/s-taprop__posix.adb
  4d54a3a29c5651e04fc461129e1eb163  gcc/ada/libgnarl/s-taprop__qnx.adb
  eba7cc72920c9e16506a4955d48cb118  gcc/ada/libgnarl/s-taprop__rtems.adb
! 104d07db999e099651f78090c1aba2aa  gcc/ada/libgnarl/s-taprop__solaris.adb
! b39ef266fae76cd2e0212f3614e5df15  gcc/ada/libgnarl/s-taprop__vxworks.adb
  54f9a84166acb856f39a340a63cbe93d  gcc/ada/libgnarl/s-tarest.adb
  f943e29ed85f640ca38027258124108b  gcc/ada/libgnarl/s-tarest.ads
  c084158198a46d6300e6a017e3230ba1  gcc/ada/libgnarl/s-tasdeb.adb
--- 1087,1094 ----
  139d97e773970f5955d60a4af95755cb  gcc/ada/libgnarl/s-taprop__posix.adb
  4d54a3a29c5651e04fc461129e1eb163  gcc/ada/libgnarl/s-taprop__qnx.adb
  eba7cc72920c9e16506a4955d48cb118  gcc/ada/libgnarl/s-taprop__rtems.adb
! e819a6c285d9c687a6d0f49862d0ec7a  gcc/ada/libgnarl/s-taprop__solaris.adb
! 2fdbab980ce8e36304f943e853487d36  gcc/ada/libgnarl/s-taprop__vxworks.adb
  54f9a84166acb856f39a340a63cbe93d  gcc/ada/libgnarl/s-tarest.adb
  f943e29ed85f640ca38027258124108b  gcc/ada/libgnarl/s-tarest.ads
  c084158198a46d6300e6a017e3230ba1  gcc/ada/libgnarl/s-tasdeb.adb
*************** aefd5d1e80de6e3dc89dc7112c4f51a3  gcc/ad
*** 1137,1143 ****
  ddc67f556f86c19ec24fd9af67430750  gcc/ada/libgnarl/s-tpobmu.ads
  34a021ea0618b151210bbf3c86eaa86a  gcc/ada/libgnarl/s-tpobop.adb
  5a8af191f2b87f46b05c86f91bbc0a84  gcc/ada/libgnarl/s-tpobop.ads
! b2484ffb0d51796e099f6b0ccb18fbd8  gcc/ada/libgnarl/s-tpopmo.adb
  32f7de82b985a0cc7a5444e9c725a42f  gcc/ada/libgnarl/s-tpopsp__posix-foreign.adb
  a76b1d1e198b27bddd79aa30ea83e1a6  gcc/ada/libgnarl/s-tpopsp__posix.adb
  bd4a3d0786d1779bbae6d1901ab24a31  gcc/ada/libgnarl/s-tpopsp__solaris.adb
--- 1133,1139 ----
  ddc67f556f86c19ec24fd9af67430750  gcc/ada/libgnarl/s-tpobmu.ads
  34a021ea0618b151210bbf3c86eaa86a  gcc/ada/libgnarl/s-tpobop.adb
  5a8af191f2b87f46b05c86f91bbc0a84  gcc/ada/libgnarl/s-tpobop.ads
! 3da0a0f1f28ef34a9d8354af7aa4453c  gcc/ada/libgnarl/s-tpopmo.adb
  32f7de82b985a0cc7a5444e9c725a42f  gcc/ada/libgnarl/s-tpopsp__posix-foreign.adb
  a76b1d1e198b27bddd79aa30ea83e1a6  gcc/ada/libgnarl/s-tpopsp__posix.adb
  bd4a3d0786d1779bbae6d1901ab24a31  gcc/ada/libgnarl/s-tpopsp__solaris.adb
*************** d4e52dfe8dafce8dcf674ea425f25bab  gcc/ad
*** 1556,1564 ****
  65f3f68c6718760b4c2b0beba2af9f82  gcc/ada/libgnat/a-swbwha.ads
  aaf273ef9a113dedcab8fb87b71b7365  gcc/ada/libgnat/a-swfwha.ads
  b1225c5e797715d872a1904de2969b06  gcc/ada/libgnat/a-swmwco.ads
! 1c2b10ac7cfd6574c8d0bcf6b1bf4d9e  gcc/ada/libgnat/a-swunau.adb
! 508efdf032c69757de15f3bba61db917  gcc/ada/libgnat/a-swunau.ads
! 34f5e6f05a771150916f0c321c550aef  gcc/ada/libgnat/a-swunau__shared.adb
  c8643f183f59a575eec9c71b527dd6ff  gcc/ada/libgnat/a-swuwha.adb
  45d76b5b911889e181b3717ab6c91651  gcc/ada/libgnat/a-swuwha.ads
  517418a3149d313f1114a2862d4829b1  gcc/ada/libgnat/a-swuwti.adb
--- 1552,1560 ----
  65f3f68c6718760b4c2b0beba2af9f82  gcc/ada/libgnat/a-swbwha.ads
  aaf273ef9a113dedcab8fb87b71b7365  gcc/ada/libgnat/a-swfwha.ads
  b1225c5e797715d872a1904de2969b06  gcc/ada/libgnat/a-swmwco.ads
! 029a3a2942428380a8b21c212304b241  gcc/ada/libgnat/a-swunau.adb
! d7a234bac98333aedd699d7af3e14428  gcc/ada/libgnat/a-swunau.ads
! a3bc354dbe6136053d3992f67ad2e708  gcc/ada/libgnat/a-swunau__shared.adb
  c8643f183f59a575eec9c71b527dd6ff  gcc/ada/libgnat/a-swuwha.adb
  45d76b5b911889e181b3717ab6c91651  gcc/ada/libgnat/a-swuwha.ads
  517418a3149d313f1114a2862d4829b1  gcc/ada/libgnat/a-swuwti.adb
*************** bedc62f409fb47a7b2e4b0b48fa7cbbf  gcc/ad
*** 1568,1576 ****
  18b9cf476495930cec4ac3eb881257db  gcc/ada/libgnat/a-szbzha.ads
  32bb3b01e46ff7648c862537bd77aa0d  gcc/ada/libgnat/a-szfzha.ads
  00f6abaab4c04fe31af76309b7ff4d00  gcc/ada/libgnat/a-szmzco.ads
! 7254491e0fc1437e4e21524144335307  gcc/ada/libgnat/a-szunau.adb
! c23a5ff46800d1274fa4d2955bc3e7f9  gcc/ada/libgnat/a-szunau.ads
! a77570cab286822205ee31647d625966  gcc/ada/libgnat/a-szunau__shared.adb
  830ddabbb826dcdf1a407125b08bb5b7  gcc/ada/libgnat/a-szuzha.adb
  01cf107c9e66d7e5284c9b7ce2e2ed7e  gcc/ada/libgnat/a-szuzha.ads
  45a8bb0c0e40f9ddf15a544105c9e438  gcc/ada/libgnat/a-szuzti.adb
--- 1564,1572 ----
  18b9cf476495930cec4ac3eb881257db  gcc/ada/libgnat/a-szbzha.ads
  32bb3b01e46ff7648c862537bd77aa0d  gcc/ada/libgnat/a-szfzha.ads
  00f6abaab4c04fe31af76309b7ff4d00  gcc/ada/libgnat/a-szmzco.ads
! 46291f5600fceb8e48df54df13467744  gcc/ada/libgnat/a-szunau.adb
! b1e0def7b8c46d5cfd0bdc759f9cf2d8  gcc/ada/libgnat/a-szunau.ads
! 4b11c3436c3ab2512b12e3774cca0ad3  gcc/ada/libgnat/a-szunau__shared.adb
  830ddabbb826dcdf1a407125b08bb5b7  gcc/ada/libgnat/a-szuzha.adb
  01cf107c9e66d7e5284c9b7ce2e2ed7e  gcc/ada/libgnat/a-szuzha.ads
  45a8bb0c0e40f9ddf15a544105c9e438  gcc/ada/libgnat/a-szuzti.adb
*************** ba42f57979e85f9332b1abfaaaa87acc  gcc/ad
*** 1763,1770 ****
  88c79d357cdbd1228d991c58d3abb14b  gcc/ada/libgnat/g-byorma.ads
  6b4c08a28de128992419116223b49748  gcc/ada/libgnat/g-bytswa.adb
  cfca851f558eff2691d8c4725422f34d  gcc/ada/libgnat/g-bytswa.ads
! dc802d699a838901af55fbf5d0043d59  gcc/ada/libgnat/g-calend.adb
! 54d472cb4a530e1a3d8f57c5a71eaf9c  gcc/ada/libgnat/g-calend.ads
  172cbdecdc80b79191b03d1e99bebb5b  gcc/ada/libgnat/g-casuti.adb
  1bf6a034e019c41d01d146693f15f4da  gcc/ada/libgnat/g-casuti.ads
  9004c8eb5f66587c112d85fdf8705767  gcc/ada/libgnat/g-catiio.adb
--- 1759,1767 ----
  88c79d357cdbd1228d991c58d3abb14b  gcc/ada/libgnat/g-byorma.ads
  6b4c08a28de128992419116223b49748  gcc/ada/libgnat/g-bytswa.adb
  cfca851f558eff2691d8c4725422f34d  gcc/ada/libgnat/g-bytswa.ads
! 0bafbc9be9218d6642653e099fdcc273  gcc/ada/libgnat/g-c_time.ads
! c83549e690036c47b39fa8b6528958ae  gcc/ada/libgnat/g-calend.adb
! d8e9fd4e81a614d9bd0fca76b8f2bb00  gcc/ada/libgnat/g-calend.ads
  172cbdecdc80b79191b03d1e99bebb5b  gcc/ada/libgnat/g-casuti.adb
  1bf6a034e019c41d01d146693f15f4da  gcc/ada/libgnat/g-casuti.ads
  9004c8eb5f66587c112d85fdf8705767  gcc/ada/libgnat/g-catiio.adb
*************** e1d19b45765179c36403496818173fe1  gcc/ad
*** 1892,1898 ****
  8eafdb255d0eafa3f943efc1feff0e4e  gcc/ada/libgnat/g-shshco.adb
  afddbc4dfe9848ead2602333a601e647  gcc/ada/libgnat/g-shshco.ads
  906d456a919e6eb5a8c2607d82654e13  gcc/ada/libgnat/g-soccon.ads
! 3a0e6d137f84283e44a4a57399769432  gcc/ada/libgnat/g-socket.adb
  909561e3fa95d50d91dbac02d467b891  gcc/ada/libgnat/g-socket.ads
  fa45db9b2f71318e55323cbb90bf74e8  gcc/ada/libgnat/g-socket__dummy.adb
  a1efda814643c7a15fe7c0b0aa7a1b9e  gcc/ada/libgnat/g-socket__dummy.ads
--- 1889,1895 ----
  8eafdb255d0eafa3f943efc1feff0e4e  gcc/ada/libgnat/g-shshco.adb
  afddbc4dfe9848ead2602333a601e647  gcc/ada/libgnat/g-shshco.ads
  906d456a919e6eb5a8c2607d82654e13  gcc/ada/libgnat/g-soccon.ads
! 35610d9efa460e61dcd409b51a521565  gcc/ada/libgnat/g-socket.adb
  909561e3fa95d50d91dbac02d467b891  gcc/ada/libgnat/g-socket.ads
  fa45db9b2f71318e55323cbb90bf74e8  gcc/ada/libgnat/g-socket__dummy.adb
  a1efda814643c7a15fe7c0b0aa7a1b9e  gcc/ada/libgnat/g-socket__dummy.ads
*************** a1efda814643c7a15fe7c0b0aa7a1b9e  gcc/ad
*** 1900,1912 ****
  07d9b0d3957e2096ce3d0bae7f8a04f8  gcc/ada/libgnat/g-socpol.ads
  b9a323ee603470e6c992581bec007714  gcc/ada/libgnat/g-socpol__dummy.adb
  519997a5538be8164f68ff4fe1cd4d83  gcc/ada/libgnat/g-socpol__dummy.ads
! 2623da46791bbfc4c68cd59aa2034685  gcc/ada/libgnat/g-socthi.adb
  ca56a9e356fdcaf2e815b0300289279c  gcc/ada/libgnat/g-socthi.ads
  58391c383180e91195ef4e60a8425d47  gcc/ada/libgnat/g-socthi__dummy.adb
  3d99a3c142319603c328d40e9ce79ce8  gcc/ada/libgnat/g-socthi__dummy.ads
  2eb0cf67f4dc9e598fa1852268b3eea9  gcc/ada/libgnat/g-socthi__mingw.adb
  fdf2cbb077991cc9652488836dd1c251  gcc/ada/libgnat/g-socthi__mingw.ads
! fbad5b9013788506b91f9641cfa5d1ae  gcc/ada/libgnat/g-socthi__vxworks.adb
  e4527726f29121c311ba8fc57b10cedd  gcc/ada/libgnat/g-socthi__vxworks.ads
  47b96b53fa9ec895d7c571d6312d65c7  gcc/ada/libgnat/g-soliop.ads
  d54dd3aa6d9f7933f653498345089287  gcc/ada/libgnat/g-soliop__lynxos.ads
--- 1897,1909 ----
  07d9b0d3957e2096ce3d0bae7f8a04f8  gcc/ada/libgnat/g-socpol.ads
  b9a323ee603470e6c992581bec007714  gcc/ada/libgnat/g-socpol__dummy.adb
  519997a5538be8164f68ff4fe1cd4d83  gcc/ada/libgnat/g-socpol__dummy.ads
! 680e239bfad981dca13223006cd0ddb3  gcc/ada/libgnat/g-socthi.adb
  ca56a9e356fdcaf2e815b0300289279c  gcc/ada/libgnat/g-socthi.ads
  58391c383180e91195ef4e60a8425d47  gcc/ada/libgnat/g-socthi__dummy.adb
  3d99a3c142319603c328d40e9ce79ce8  gcc/ada/libgnat/g-socthi__dummy.ads
  2eb0cf67f4dc9e598fa1852268b3eea9  gcc/ada/libgnat/g-socthi__mingw.adb
  fdf2cbb077991cc9652488836dd1c251  gcc/ada/libgnat/g-socthi__mingw.ads
! f8b69ae66582aff6fab449263deae3e8  gcc/ada/libgnat/g-socthi__vxworks.adb
  e4527726f29121c311ba8fc57b10cedd  gcc/ada/libgnat/g-socthi__vxworks.ads
  47b96b53fa9ec895d7c571d6312d65c7  gcc/ada/libgnat/g-soliop.ads
  d54dd3aa6d9f7933f653498345089287  gcc/ada/libgnat/g-soliop__lynxos.ads
*************** d54dd3aa6d9f7933f653498345089287  gcc/ad
*** 1917,1923 ****
  d720db3a6b77047c7a5077ec269a1b14  gcc/ada/libgnat/g-sopowa__mingw.adb
  f080ffcb2495ea02d5d25bb7b8abc45c  gcc/ada/libgnat/g-sopowa__posix.adb
  a6289dcae00fad8a7e9269df307f8ea5  gcc/ada/libgnat/g-sothco.adb
! 801b8f4dbfd1a9644ac56ea177e24160  gcc/ada/libgnat/g-sothco.ads
  20005a7d3997b72a4839668e0c5af28e  gcc/ada/libgnat/g-sothco__dummy.adb
  25d40ffe919efb7a44d96a56106f77dc  gcc/ada/libgnat/g-sothco__dummy.ads
  48a0e0031f1f69f2335c3c344083f99b  gcc/ada/libgnat/g-souinf.ads
--- 1914,1920 ----
  d720db3a6b77047c7a5077ec269a1b14  gcc/ada/libgnat/g-sopowa__mingw.adb
  f080ffcb2495ea02d5d25bb7b8abc45c  gcc/ada/libgnat/g-sopowa__posix.adb
  a6289dcae00fad8a7e9269df307f8ea5  gcc/ada/libgnat/g-sothco.adb
! a751bcd0f07565ebe30ee841f0ec4734  gcc/ada/libgnat/g-sothco.ads
  20005a7d3997b72a4839668e0c5af28e  gcc/ada/libgnat/g-sothco__dummy.adb
  25d40ffe919efb7a44d96a56106f77dc  gcc/ada/libgnat/g-sothco__dummy.ads
  48a0e0031f1f69f2335c3c344083f99b  gcc/ada/libgnat/g-souinf.ads
*************** fe450fa8c2ed2f08d78bf75d7e515a80  gcc/ad
*** 1929,1935 ****
  8234bc78ca9a1fd60eebf96d320de563  gcc/ada/libgnat/g-spipat.ads
  64d5408adc09b8b167ab5911da61a51e  gcc/ada/libgnat/g-spitbo.adb
  5b78d3e0c53f453293a756b0cae8ef3e  gcc/ada/libgnat/g-spitbo.ads
! bfcee213fdd8bc473a14e8184028dae6  gcc/ada/libgnat/g-spogwa.adb
  482a80d734412c8202578bf326ca28fe  gcc/ada/libgnat/g-spogwa.ads
  699e2875ee39f02987144018d157dfdd  gcc/ada/libgnat/g-sptabo.ads
  8f0f2285506a9f86482be15f952def96  gcc/ada/libgnat/g-sptain.ads
--- 1926,1932 ----
  8234bc78ca9a1fd60eebf96d320de563  gcc/ada/libgnat/g-spipat.ads
  64d5408adc09b8b167ab5911da61a51e  gcc/ada/libgnat/g-spitbo.adb
  5b78d3e0c53f453293a756b0cae8ef3e  gcc/ada/libgnat/g-spitbo.ads
! af1b27aa3ecb5c624467817b0319fe4c  gcc/ada/libgnat/g-spogwa.adb
  482a80d734412c8202578bf326ca28fe  gcc/ada/libgnat/g-spogwa.ads
  699e2875ee39f02987144018d157dfdd  gcc/ada/libgnat/g-sptabo.ads
  8f0f2285506a9f86482be15f952def96  gcc/ada/libgnat/g-sptain.ads
*************** be184ef55952417a9a6ca5805b930d86  gcc/ad
*** 2042,2047 ****
--- 2039,2046 ----
  bb60db53ffb027922331b531cc4aed35  gcc/ada/libgnat/s-boustr.adb
  212438d63e0a4af68cd8461378fb33d2  gcc/ada/libgnat/s-boustr.ads
  953cd0626f62a0861039c74bbe53b1c5  gcc/ada/libgnat/s-bytswa.ads
+ 4079f6f2f1c46ae4690daf5f0f0e0c35  gcc/ada/libgnat/s-c_time.adb
+ 163b2641754bcb61fcd68ee77d6ddd53  gcc/ada/libgnat/s-c_time.ads
  3b4bbce3aae12c46b7248d843697e9f2  gcc/ada/libgnat/s-carsi8.adb
  fdcbf949449428c44ba173ecb15d41cd  gcc/ada/libgnat/s-carsi8.ads
  e6b715f0c81125ac15062873814386c1  gcc/ada/libgnat/s-carun8.adb
*************** ddce157cf4ea63ecbb5ef0af78862e94  gcc/ad
*** 2282,2305 ****
  6e044dda0fdc55ee526d2b32cbef4cdc  gcc/ada/libgnat/s-multip.ads
  d32dab727eb88a9a9718e4c78e1496ec  gcc/ada/libgnat/s-objrea.adb
  e8bfda3d740dfbd8ccf4fc493d8457e1  gcc/ada/libgnat/s-objrea.ads
! fa0d4cc01f2a630943bfb0790f346d9f  gcc/ada/libgnat/s-optide.adb
! cebea250ccdaa20cc6766c78a8157d70  gcc/ada/libgnat/s-os_lib.adb
! 5618e5fb1aebae9bf2a7b4fb5e4fb337  gcc/ada/libgnat/s-os_lib.ads
  ee69d5c31f1534ccc0aa80ab59587249  gcc/ada/libgnat/s-oslock__dummy.ads
  0b6cb9ac13ab2e70186fe46147ac6343  gcc/ada/libgnat/s-oslock__mingw.ads
  de8b2eecb4d04b82ea732adf1d76550f  gcc/ada/libgnat/s-oslock__posix.ads
  a235a8d563210bf70966b318e3c827fc  gcc/ada/libgnat/s-oslock__solaris.ads
  8ba7aefa562463d26b65900f7c289b21  gcc/ada/libgnat/s-oslock__vxworks.ads
  fd5e74b3f07515e531cf3881fee5ebd6  gcc/ada/libgnat/s-osprim.ads
! c34b67b08d3cbf32d644196fda029dea  gcc/ada/libgnat/s-osprim__darwin.adb
  935f3f12650709d7934e19d58a50315e  gcc/ada/libgnat/s-osprim__lynxos.ads
  b7d52cb5fee6fdd2683093b26c4b769e  gcc/ada/libgnat/s-osprim__mingw.adb
! 8eceecc8a11571d23c5287b0fe410a74  gcc/ada/libgnat/s-osprim__posix.adb
! f3c631112f30b734b4f220fb5395f2c6  gcc/ada/libgnat/s-osprim__posix2008.adb
! e873556331ca8438fe71df04cf4f27ef  gcc/ada/libgnat/s-osprim__rtems.adb
! 27e9d0034a6d07de2f0bd8c9ad8a96b0  gcc/ada/libgnat/s-osprim__solaris.adb
! 76b7c78e43eb5d8afa8f9535955c3653  gcc/ada/libgnat/s-osprim__unix.adb
! 929cd38c9931c5a02704d9d00587f5ab  gcc/ada/libgnat/s-osprim__x32.adb
  e7cc005e6dbdd37a3b9e9dec310b6077  gcc/ada/libgnat/s-pack03.adb
  2673c28fd62a6d56bdfe3589619a1005  gcc/ada/libgnat/s-pack03.ads
  38eb466d40a15da72b774991993e43bf  gcc/ada/libgnat/s-pack05.adb
--- 2281,2302 ----
  6e044dda0fdc55ee526d2b32cbef4cdc  gcc/ada/libgnat/s-multip.ads
  d32dab727eb88a9a9718e4c78e1496ec  gcc/ada/libgnat/s-objrea.adb
  e8bfda3d740dfbd8ccf4fc493d8457e1  gcc/ada/libgnat/s-objrea.ads
! 3f36fe3a633aa0e35aa41061c2c53b70  gcc/ada/libgnat/s-optide.adb
! f101ff956cd444806428ff292e098eda  gcc/ada/libgnat/s-os_lib.adb
! c49d74e1d9a73e641efba363334321b2  gcc/ada/libgnat/s-os_lib.ads
  ee69d5c31f1534ccc0aa80ab59587249  gcc/ada/libgnat/s-oslock__dummy.ads
  0b6cb9ac13ab2e70186fe46147ac6343  gcc/ada/libgnat/s-oslock__mingw.ads
  de8b2eecb4d04b82ea732adf1d76550f  gcc/ada/libgnat/s-oslock__posix.ads
  a235a8d563210bf70966b318e3c827fc  gcc/ada/libgnat/s-oslock__solaris.ads
  8ba7aefa562463d26b65900f7c289b21  gcc/ada/libgnat/s-oslock__vxworks.ads
  fd5e74b3f07515e531cf3881fee5ebd6  gcc/ada/libgnat/s-osprim.ads
! daf4f4cd6e511cb49417b912ba8288cd  gcc/ada/libgnat/s-osprim__darwin.adb
  935f3f12650709d7934e19d58a50315e  gcc/ada/libgnat/s-osprim__lynxos.ads
  b7d52cb5fee6fdd2683093b26c4b769e  gcc/ada/libgnat/s-osprim__mingw.adb
! 2602a332ac295dad0994207e04efaa77  gcc/ada/libgnat/s-osprim__posix.adb
! 7e8a64640e12af1b48f46e7c97e457e3  gcc/ada/libgnat/s-osprim__posix2008.adb
! 27df759cf8285ef041f5f36ab2d3d41e  gcc/ada/libgnat/s-osprim__rtems.adb
! e194ac96123adeb89c0d6f8d32665f84  gcc/ada/libgnat/s-osprim__unix.adb
  e7cc005e6dbdd37a3b9e9dec310b6077  gcc/ada/libgnat/s-pack03.adb
  2673c28fd62a6d56bdfe3589619a1005  gcc/ada/libgnat/s-pack03.ads
  38eb466d40a15da72b774991993e43bf  gcc/ada/libgnat/s-pack05.adb
*************** a88fa999d5af9aa3e8c136505d50827a  gcc/ad
*** 2541,2554 ****
  937aeb0b9344d8306f3b33646af1d0c2  gcc/ada/libgnat/s-pack99.adb
  b25b14fa7fb6683639760cb2665e74c8  gcc/ada/libgnat/s-pack99.ads
  b15079c6c3986618e04371bc1fabd398  gcc/ada/libgnat/s-parame.adb
! bff4f85720c58ec8f6fc5594dc3de70a  gcc/ada/libgnat/s-parame.ads
  31b4a10c185366d3b2aaab807d0ae879  gcc/ada/libgnat/s-parame__aarch64-linux.adb
! b66d49460befc03a51abcbe09d3ad729  gcc/ada/libgnat/s-parame__hpux.ads
! d989a62f0bdeb2dc71bb93160ade93d3  gcc/ada/libgnat/s-parame__posix2008.ads
  43b0b4dd323144151048d63aa64c7d68  gcc/ada/libgnat/s-parame__qnx.adb
  906a6474493f5a4e840d575a3159653e  gcc/ada/libgnat/s-parame__rtems.adb
  4c4cdf83dc3363daecbdc44a85303442  gcc/ada/libgnat/s-parame__vxworks.adb
! 149159a2c6c7fe0a21f9efcd21ce7b6c  gcc/ada/libgnat/s-parame__vxworks.ads
  c73f84c7709f183a0e03a188c7b3524d  gcc/ada/libgnat/s-parint.adb
  0417f7d80315a2abca26ad03ec395a69  gcc/ada/libgnat/s-parint.ads
  9975fd3b2e089e1ff6931b2bb3cbe677  gcc/ada/libgnat/s-pehage.adb
--- 2538,2550 ----
  937aeb0b9344d8306f3b33646af1d0c2  gcc/ada/libgnat/s-pack99.adb
  b25b14fa7fb6683639760cb2665e74c8  gcc/ada/libgnat/s-pack99.ads
  b15079c6c3986618e04371bc1fabd398  gcc/ada/libgnat/s-parame.adb
! 9d4162bc02d5281484b6c96c5cd123bc  gcc/ada/libgnat/s-parame.ads
  31b4a10c185366d3b2aaab807d0ae879  gcc/ada/libgnat/s-parame__aarch64-linux.adb
! 3786bd66380d713c20270bce345bd3cb  gcc/ada/libgnat/s-parame__hpux.ads
  43b0b4dd323144151048d63aa64c7d68  gcc/ada/libgnat/s-parame__qnx.adb
  906a6474493f5a4e840d575a3159653e  gcc/ada/libgnat/s-parame__rtems.adb
  4c4cdf83dc3363daecbdc44a85303442  gcc/ada/libgnat/s-parame__vxworks.adb
! dadb9042b121fff861ff42013ae1896c  gcc/ada/libgnat/s-parame__vxworks.ads
  c73f84c7709f183a0e03a188c7b3524d  gcc/ada/libgnat/s-parint.adb
  0417f7d80315a2abca26ad03ec395a69  gcc/ada/libgnat/s-parint.ads
  9975fd3b2e089e1ff6931b2bb3cbe677  gcc/ada/libgnat/s-pehage.adb
*************** f787fc4fbde9aeca06c03c7d729c2fbf  gcc/ad
*** 2563,2570 ****
  611ce70c934716eac27121006897d4c0  gcc/ada/libgnat/s-powlfl.ads
  358b9ec846f94c5dea1d62f70b69c6d8  gcc/ada/libgnat/s-powllf.ads
  892bdf904a5c06dd0985fef405d6f249  gcc/ada/libgnat/s-purexc.ads
! fd1d5765d1530992068389be9ad75633  gcc/ada/libgnat/s-putima.adb
! 8d79796e20d8ed0d9431de996ed5ce50  gcc/ada/libgnat/s-putima.ads
  097342fdabe0b04f3ed2056878098d0b  gcc/ada/libgnat/s-rannum.adb
  a976e4a4be988927c750123edff633d3  gcc/ada/libgnat/s-rannum.ads
  8d3735f439d584afcd955aa6b9dbc188  gcc/ada/libgnat/s-ransee.adb
--- 2559,2566 ----
  611ce70c934716eac27121006897d4c0  gcc/ada/libgnat/s-powlfl.ads
  358b9ec846f94c5dea1d62f70b69c6d8  gcc/ada/libgnat/s-powllf.ads
  892bdf904a5c06dd0985fef405d6f249  gcc/ada/libgnat/s-purexc.ads
! 540c3d7ea41c10d06e96fd3cb0a230ef  gcc/ada/libgnat/s-putima.adb
! d54659f32c9f7e91f1b4cdca7b6f41a7  gcc/ada/libgnat/s-putima.ads
  097342fdabe0b04f3ed2056878098d0b  gcc/ada/libgnat/s-rannum.adb
  a976e4a4be988927c750123edff633d3  gcc/ada/libgnat/s-rannum.ads
  8d3735f439d584afcd955aa6b9dbc188  gcc/ada/libgnat/s-ransee.adb
*************** cd6c342cc127610beca7bb72cbcc907a  gcc/ad
*** 2812,2818 ****
  aef70af2835279de8e33b52eb8375d45  gcc/ada/nlists.ads
  276eb125c0df313227d9ecfb3f38866d  gcc/ada/nlists.h
  9ce5e0762672a4136ff3130c472711ce  gcc/ada/opt.adb
! 982acd5470318de033fd069a5769f1e0  gcc/ada/opt.ads
  fcbd079f712fd349c109f5ecd640096b  gcc/ada/osint-b.adb
  2604c4a51297a9867c69ce9985c3fb8b  gcc/ada/osint-b.ads
  4f31614f93bd69a85fe6c1f144e04b37  gcc/ada/osint-c.adb
--- 2808,2814 ----
  aef70af2835279de8e33b52eb8375d45  gcc/ada/nlists.ads
  276eb125c0df313227d9ecfb3f38866d  gcc/ada/nlists.h
  9ce5e0762672a4136ff3130c472711ce  gcc/ada/opt.adb
! 694e55e88cd30e918ce97a02720baab8  gcc/ada/opt.ads
  fcbd079f712fd349c109f5ecd640096b  gcc/ada/osint-b.adb
  2604c4a51297a9867c69ce9985c3fb8b  gcc/ada/osint-b.ads
  4f31614f93bd69a85fe6c1f144e04b37  gcc/ada/osint-c.adb
*************** f44734296ba1a1b67bc069f4b7d4cacf  gcc/ad
*** 2825,2842 ****
  267004c371c299ed0af09bdb2bf77111  gcc/ada/osint.ads
  b9fd1f536d8f1c867c911cbe2996ebeb  gcc/ada/output.adb
  57985da6ee6f2d437d610b1b9249f436  gcc/ada/output.ads
! 3f5b95b8fa96ad05275062ec5d9a000e  gcc/ada/par-ch10.adb
  90ae3c6fcf255101ea0bd2dfc118762f  gcc/ada/par-ch11.adb
! afd801107ba26f9e5063a6bb14ce6f15  gcc/ada/par-ch12.adb
  726417eeba8f4e1ae6310601195b55e4  gcc/ada/par-ch13.adb
  ed9e0f33947385dfddd6c98bc7c51a92  gcc/ada/par-ch2.adb
! e217a758d0c6281f98fe54a436d834a3  gcc/ada/par-ch3.adb
! bc9ca61ef7f5b2dd590c60a8e0bbec6b  gcc/ada/par-ch4.adb
! e80166837acac8e9697a90e447e06871  gcc/ada/par-ch5.adb
! fc92bd947be0bf674e13d13156f4d7d5  gcc/ada/par-ch6.adb
! 2b201234474be782ce30a79ebe674e81  gcc/ada/par-ch7.adb
! 349dda80fe39ecf9d2b818ec0e769d80  gcc/ada/par-ch8.adb
! 3d5733e116665c179c26e9939a59395e  gcc/ada/par-ch9.adb
  0f10c72440816216759b417e23acf069  gcc/ada/par-endh.adb
  6f12aeb2c6db21d91040dfb1bf2e74ce  gcc/ada/par-labl.adb
  43aa6209cff7b408262fff979f2f6699  gcc/ada/par-load.adb
--- 2821,2838 ----
  267004c371c299ed0af09bdb2bf77111  gcc/ada/osint.ads
  b9fd1f536d8f1c867c911cbe2996ebeb  gcc/ada/output.adb
  57985da6ee6f2d437d610b1b9249f436  gcc/ada/output.ads
! cf568cc3ccf1e3077d0124147b5eb011  gcc/ada/par-ch10.adb
  90ae3c6fcf255101ea0bd2dfc118762f  gcc/ada/par-ch11.adb
! 9e92e3caaf4f98cafb66351a63bd06ec  gcc/ada/par-ch12.adb
  726417eeba8f4e1ae6310601195b55e4  gcc/ada/par-ch13.adb
  ed9e0f33947385dfddd6c98bc7c51a92  gcc/ada/par-ch2.adb
! 20f2d1c603041e115215f1f16853c42c  gcc/ada/par-ch3.adb
! 0ae82bd79e93a3e76a816d3754dc814f  gcc/ada/par-ch4.adb
! 63a4bee77501bbe0cb76503f22893cbd  gcc/ada/par-ch5.adb
! f7eb7f9dffd732f17489bd09047572f9  gcc/ada/par-ch6.adb
! 156c49bfe462052c8f4cfb04419e91ee  gcc/ada/par-ch7.adb
! c1753ff5c32c0be63d9986ae33c03316  gcc/ada/par-ch8.adb
! 07d24cdeaf20bb48b3a9d4a2e11fd748  gcc/ada/par-ch9.adb
  0f10c72440816216759b417e23acf069  gcc/ada/par-endh.adb
  6f12aeb2c6db21d91040dfb1bf2e74ce  gcc/ada/par-labl.adb
  43aa6209cff7b408262fff979f2f6699  gcc/ada/par-load.adb
*************** edca7d5bed3893390e3732eb691f2817  gcc/ad
*** 2844,2850 ****
  ee1279472214ff7ca5b61685a2ada15f  gcc/ada/par-sync.adb
  47b402373c995a1c6df9226ae6e02ff2  gcc/ada/par-tchk.adb
  4604f1e5c60129438742f4320d848ce8  gcc/ada/par-util.adb
! 9fe0e08026ee8b61b2f1d91d83f03cee  gcc/ada/par.adb
  cc0b4ae85eb0edbcce886d13c925cbf3  gcc/ada/par.ads
  b0a53260cce47acbd0de8d046175c63f  gcc/ada/par_sco.adb
  2674a374e947c03703d34f6603994424  gcc/ada/par_sco.ads
--- 2840,2846 ----
  ee1279472214ff7ca5b61685a2ada15f  gcc/ada/par-sync.adb
  47b402373c995a1c6df9226ae6e02ff2  gcc/ada/par-tchk.adb
  4604f1e5c60129438742f4320d848ce8  gcc/ada/par-util.adb
! b320d7c9a2a8a1bfeb97bc4d96d18b65  gcc/ada/par.adb
  cc0b4ae85eb0edbcce886d13c925cbf3  gcc/ada/par.ads
  b0a53260cce47acbd0de8d046175c63f  gcc/ada/par_sco.adb
  2674a374e947c03703d34f6603994424  gcc/ada/par_sco.ads
*************** ea76af17f6ce0dc8c7773ac07aebba2d  gcc/ad
*** 2870,2878 ****
  32312ab752a2a0382c9276e387b389e1  gcc/ada/rtfinal.c
  01263778e97af0ecb135164f1bbfd6ad  gcc/ada/rtinit.c
  1e27242a4b1e6be20b3aee25a5d9b8d7  gcc/ada/rtsfind.adb
! 021f0664ba157ee8dd4a893d0ea1d039  gcc/ada/rtsfind.ads
  66e987f268458746a6afb190c151af7a  gcc/ada/runtime.h
! d69fc9536d6c6a2f3f2f5688e2ecd3e3  gcc/ada/s-oscons-tmplt.c
  6c6bc69518c778cd3f35ca2095dc1ce1  gcc/ada/s-pack.adb.tmpl
  769f019e3de5c30e3ae7534efbba17df  gcc/ada/s-pack.ads.tmpl
  f2b44210590da3ce7d60699034656b7f  gcc/ada/scans.adb
--- 2866,2874 ----
  32312ab752a2a0382c9276e387b389e1  gcc/ada/rtfinal.c
  01263778e97af0ecb135164f1bbfd6ad  gcc/ada/rtinit.c
  1e27242a4b1e6be20b3aee25a5d9b8d7  gcc/ada/rtsfind.adb
! c848cd1773f49a8a38c701a95c624aee  gcc/ada/rtsfind.ads
  66e987f268458746a6afb190c151af7a  gcc/ada/runtime.h
! 380052748c3cfb90df03390224caf458  gcc/ada/s-oscons-tmplt.c
  6c6bc69518c778cd3f35ca2095dc1ce1  gcc/ada/s-pack.adb.tmpl
  769f019e3de5c30e3ae7534efbba17df  gcc/ada/s-pack.ads.tmpl
  f2b44210590da3ce7d60699034656b7f  gcc/ada/scans.adb
*************** cbf1143b39dba16ccff2bad507662b80  gcc/ad
*** 2888,2897 ****
  1e9843bd9ac3288c126ec7d6727ea8e6  gcc/ada/sdefault.ads
  3bf01e026b494a442389a5d3541785b8  gcc/ada/seh_init.c
  a424011f3e6f5e5a1163e2a9e1324779  gcc/ada/sem.adb
! 852fbcc89a3ed10b6c00d4f9686d1405  gcc/ada/sem.ads
  486e7e3521da672c20bea967001436f9  gcc/ada/sem_aggr.adb
  d9e9e67a1e6554ab3bc7e11269dd3763  gcc/ada/sem_aggr.ads
! c5136d7eb780683d78e23736e7ccbab1  gcc/ada/sem_attr.adb
  2a239613f39312b54ea82d1e690a3ea2  gcc/ada/sem_attr.ads
  67c9535c9fd384cc23ba9aafbc93defb  gcc/ada/sem_aux.adb
  e15b069fa2ff472febda85c8b9cacb81  gcc/ada/sem_aux.ads
--- 2884,2893 ----
  1e9843bd9ac3288c126ec7d6727ea8e6  gcc/ada/sdefault.ads
  3bf01e026b494a442389a5d3541785b8  gcc/ada/seh_init.c
  a424011f3e6f5e5a1163e2a9e1324779  gcc/ada/sem.adb
! b1230ac9f3cae75bd98a0fc5e0fabdcf  gcc/ada/sem.ads
  486e7e3521da672c20bea967001436f9  gcc/ada/sem_aggr.adb
  d9e9e67a1e6554ab3bc7e11269dd3763  gcc/ada/sem_aggr.ads
! 48718cbb5930436a774dfd1a35fca974  gcc/ada/sem_attr.adb
  2a239613f39312b54ea82d1e690a3ea2  gcc/ada/sem_attr.ads
  67c9535c9fd384cc23ba9aafbc93defb  gcc/ada/sem_aux.adb
  e15b069fa2ff472febda85c8b9cacb81  gcc/ada/sem_aux.ads
*************** e15b069fa2ff472febda85c8b9cacb81  gcc/ad
*** 2899,2925 ****
  88daa5c9b6e135316b52695cae25a496  gcc/ada/sem_case.ads
  84667b3de209c0b04f82a349c6125ab0  gcc/ada/sem_cat.adb
  e364f4e3ae92066699cc93a8f7b828c1  gcc/ada/sem_cat.ads
! 8e9c5489f33b5200e527d742c2333d14  gcc/ada/sem_ch10.adb
  6e34ce648cfc10b24c12b68e0e59dcb8  gcc/ada/sem_ch10.ads
  5980a02146588bf0e31ced2382290670  gcc/ada/sem_ch11.adb
  1b6f89866a5d427002df059be3847d62  gcc/ada/sem_ch11.ads
! 5b3f0861d9b65b02827da7373a639cb8  gcc/ada/sem_ch12.adb
! b0a3315dce9de8e3bbbb3682c8b0e2ff  gcc/ada/sem_ch12.ads
! e0579ee7777ebf817485c31a4ba5b64b  gcc/ada/sem_ch13.adb
  42a7b1073e168e8be85f2203fbddd148  gcc/ada/sem_ch13.ads
  14326c522718c8cb8415b13a79c07972  gcc/ada/sem_ch2.adb
  2471d629be4739ff5135aa87a2ec9166  gcc/ada/sem_ch2.ads
! 532ca64246c2a8a473a98e126a2c9d89  gcc/ada/sem_ch3.adb
  76abe89b089728c6eaca6f7593348732  gcc/ada/sem_ch3.ads
! 904f36c9a9bf09c65759cab2728c22c7  gcc/ada/sem_ch4.adb
  adba03aae1f439b9e9db8cea05d8e03f  gcc/ada/sem_ch4.ads
  e8573b06cd7059d6bbde030175ab1a71  gcc/ada/sem_ch5.adb
  ec8d5a42c27c46e4969c16d6e18ed276  gcc/ada/sem_ch5.ads
! 33ee86ca2d196b23a9b64ad26ff8b6f0  gcc/ada/sem_ch6.adb
  165c2ff9990d74ba204881b7983566c7  gcc/ada/sem_ch6.ads
  3cdbde779c5450a7a707146b7e30ff64  gcc/ada/sem_ch7.adb
  24a1265e6a25756265643858abcf7ded  gcc/ada/sem_ch7.ads
! 7aca9207bf76039a345f39c73664adf9  gcc/ada/sem_ch8.adb
  f0b4e317e5d5515a6ec337bc5acf5fe0  gcc/ada/sem_ch8.ads
  546c616e1a0e3e76b6220644a605da51  gcc/ada/sem_ch9.adb
  7b283bd6453de444c7075a8c6f215dda  gcc/ada/sem_ch9.ads
--- 2895,2921 ----
  88daa5c9b6e135316b52695cae25a496  gcc/ada/sem_case.ads
  84667b3de209c0b04f82a349c6125ab0  gcc/ada/sem_cat.adb
  e364f4e3ae92066699cc93a8f7b828c1  gcc/ada/sem_cat.ads
! 8ea0c65f64aca33fec9707551c238717  gcc/ada/sem_ch10.adb
  6e34ce648cfc10b24c12b68e0e59dcb8  gcc/ada/sem_ch10.ads
  5980a02146588bf0e31ced2382290670  gcc/ada/sem_ch11.adb
  1b6f89866a5d427002df059be3847d62  gcc/ada/sem_ch11.ads
! 727519d2f6167e2da1688215100d2af1  gcc/ada/sem_ch12.adb
! f981520c42b732545be8bb5c8813ccfd  gcc/ada/sem_ch12.ads
! d6ef5724397901e11d6ea6485aa07816  gcc/ada/sem_ch13.adb
  42a7b1073e168e8be85f2203fbddd148  gcc/ada/sem_ch13.ads
  14326c522718c8cb8415b13a79c07972  gcc/ada/sem_ch2.adb
  2471d629be4739ff5135aa87a2ec9166  gcc/ada/sem_ch2.ads
! 872079454d8998749ee12a4970c9bdb7  gcc/ada/sem_ch3.adb
  76abe89b089728c6eaca6f7593348732  gcc/ada/sem_ch3.ads
! cc85f882d97d0ea2e48c8ad8055cccae  gcc/ada/sem_ch4.adb
  adba03aae1f439b9e9db8cea05d8e03f  gcc/ada/sem_ch4.ads
  e8573b06cd7059d6bbde030175ab1a71  gcc/ada/sem_ch5.adb
  ec8d5a42c27c46e4969c16d6e18ed276  gcc/ada/sem_ch5.ads
! 9c8edc8418e17cd1a5fbd65b77454574  gcc/ada/sem_ch6.adb
  165c2ff9990d74ba204881b7983566c7  gcc/ada/sem_ch6.ads
  3cdbde779c5450a7a707146b7e30ff64  gcc/ada/sem_ch7.adb
  24a1265e6a25756265643858abcf7ded  gcc/ada/sem_ch7.ads
! 3a04524f67dd69e53da10a9b9ff7745e  gcc/ada/sem_ch8.adb
  f0b4e317e5d5515a6ec337bc5acf5fe0  gcc/ada/sem_ch8.ads
  546c616e1a0e3e76b6220644a605da51  gcc/ada/sem_ch9.adb
  7b283bd6453de444c7075a8c6f215dda  gcc/ada/sem_ch9.ads
*************** e8e79e2a818321d7816e27eed8d17404  gcc/ad
*** 2939,2947 ****
  66ccba8e3b77fa8d6e0e13f6368d804a  gcc/ada/sem_intr.ads
  4a954a685009a9b0bcf72a8517dc3bdf  gcc/ada/sem_mech.adb
  bcb22deebc83b966e7be367087d9fd7b  gcc/ada/sem_mech.ads
! cc9cb70efc7ef87a77c16e998a227635  gcc/ada/sem_prag.adb
! e916d988a0949fb165369669d8c6f717  gcc/ada/sem_prag.ads
! 47026d1fb6c93fb9bcf16620d1254d17  gcc/ada/sem_res.adb
  bb01f11ceaa352a8b99f95fcbcfe97d9  gcc/ada/sem_res.ads
  28d33ede4288814374d1909847798c7d  gcc/ada/sem_scil.adb
  db6f5a37bd59fd83ff3286e71ab985fe  gcc/ada/sem_scil.ads
--- 2935,2943 ----
  66ccba8e3b77fa8d6e0e13f6368d804a  gcc/ada/sem_intr.ads
  4a954a685009a9b0bcf72a8517dc3bdf  gcc/ada/sem_mech.adb
  bcb22deebc83b966e7be367087d9fd7b  gcc/ada/sem_mech.ads
! 9ad12a70ea1d9ca65334c6fb7aaf6e96  gcc/ada/sem_prag.adb
! d16256f1e0a8b84763e3ccc0653e1c4b  gcc/ada/sem_prag.ads
! 4ec88812296adfa216b478a7141c3990  gcc/ada/sem_res.adb
  bb01f11ceaa352a8b99f95fcbcfe97d9  gcc/ada/sem_res.ads
  28d33ede4288814374d1909847798c7d  gcc/ada/sem_scil.adb
  db6f5a37bd59fd83ff3286e71ab985fe  gcc/ada/sem_scil.ads
*************** db6f5a37bd59fd83ff3286e71ab985fe  gcc/ad
*** 2949,2956 ****
  89d73c108bd8921f6d6cd84d98726ea5  gcc/ada/sem_smem.ads
  d0a2f5b2f65a874363f7fbe2b9a79f8b  gcc/ada/sem_type.adb
  dee50852181adfada17fb5b7423ed973  gcc/ada/sem_type.ads
! ab4fd133f8a112cf4a52a6bc6f81f2a1  gcc/ada/sem_util.adb
! 19871a69122b711ae62ff59c06686d44  gcc/ada/sem_util.ads
  9668d6a37fe84f41a81a7ffcb66d5ecc  gcc/ada/sem_warn.adb
  441e0f80657ef72324e40dd20cebfc82  gcc/ada/sem_warn.ads
  239ca67ac9aa430abfe5120a8d4302d9  gcc/ada/set_targ.adb
--- 2945,2952 ----
  89d73c108bd8921f6d6cd84d98726ea5  gcc/ada/sem_smem.ads
  d0a2f5b2f65a874363f7fbe2b9a79f8b  gcc/ada/sem_type.adb
  dee50852181adfada17fb5b7423ed973  gcc/ada/sem_type.ads
! ee5b2abe4ca79e23d619229662cf88f7  gcc/ada/sem_util.adb
! 4c258be138ab7760a8329aa8913fe358  gcc/ada/sem_util.ads
  9668d6a37fe84f41a81a7ffcb66d5ecc  gcc/ada/sem_warn.adb
  441e0f80657ef72324e40dd20cebfc82  gcc/ada/sem_warn.ads
  239ca67ac9aa430abfe5120a8d4302d9  gcc/ada/set_targ.adb
*************** f32c4d3d5df9ad9663b4978f7f8a2573  gcc/ad
*** 2970,2976 ****
  5508690394c02353c472f15fdd05b280  gcc/ada/sinfo-utils.adb
  df1aa3814d8c5281deb3b526c99368fc  gcc/ada/sinfo-utils.ads
  e6d5c3ccb5893bb3943fbdf529b298d6  gcc/ada/sinfo.adb
! 93e317a9f2268babe8fe1b169fd2441a  gcc/ada/sinfo.ads
  ebb37a07fb72782f86b0c141d3f6077c  gcc/ada/sinput-c.adb
  ec9033e4caebeb446063de16e18918f4  gcc/ada/sinput-c.ads
  2fec6a5fbe7c9e765ea70c82814b0fd3  gcc/ada/sinput-d.adb
--- 2966,2972 ----
  5508690394c02353c472f15fdd05b280  gcc/ada/sinfo-utils.adb
  df1aa3814d8c5281deb3b526c99368fc  gcc/ada/sinfo-utils.ads
  e6d5c3ccb5893bb3943fbdf529b298d6  gcc/ada/sinfo.adb
! e5139f344ba5d7c2e812dafda8f43a44  gcc/ada/sinfo.ads
  ebb37a07fb72782f86b0c141d3f6077c  gcc/ada/sinput-c.adb
  ec9033e4caebeb446063de16e18918f4  gcc/ada/sinput-c.ads
  2fec6a5fbe7c9e765ea70c82814b0fd3  gcc/ada/sinput-d.adb
*************** df3f6c6882fc8f715d4cc537af0f6442  gcc/ad
*** 3060,3066 ****
  a13250e9011949e791f210139f4c4323  gcc/align.h
  192d075c6984da6ef1e282fd63829079  gcc/alloc-pool.cc
  b2194a7136db5f26272ca6162d858997  gcc/alloc-pool.h
! 9fbc196c7ce62aa0dcccc0af5676688c  gcc/analyzer/ChangeLog
  51f6840360573e2c2c0b157723b94c0b  gcc/analyzer/access-diagram.cc
  58f352acafda673d24da4113c4f80b8d  gcc/analyzer/access-diagram.h
  9b9effe796cc5df0612c35031d57d8bb  gcc/analyzer/ana-state-to-diagnostic-state.cc
--- 3056,3062 ----
  a13250e9011949e791f210139f4c4323  gcc/align.h
  192d075c6984da6ef1e282fd63829079  gcc/alloc-pool.cc
  b2194a7136db5f26272ca6162d858997  gcc/alloc-pool.h
! 8cbfb82aa5b3e4277b991871cf3ae55a  gcc/analyzer/ChangeLog
  51f6840360573e2c2c0b157723b94c0b  gcc/analyzer/access-diagram.cc
  58f352acafda673d24da4113c4f80b8d  gcc/analyzer/access-diagram.h
  9b9effe796cc5df0612c35031d57d8bb  gcc/analyzer/ana-state-to-diagnostic-state.cc
*************** e8fdf8aae887a06668b928191ec6da7a  gcc/an
*** 3112,3118 ****
  7ee54f0568377ab1b37ccdc7bb949387  gcc/analyzer/inlining-iterator.h
  9289c540d66da127e56aa983ca018af6  gcc/analyzer/kf-analyzer.cc
  f939ceabcab4e031bd8a0960eaa768dc  gcc/analyzer/kf-lang-cp.cc
! f32274ec03562757a6e4486d10c7d720  gcc/analyzer/kf.cc
  87c0ace2795d7de6063a286af6c85d5b  gcc/analyzer/known-function-manager.cc
  03a32d089b911aa5389a2b9006795f83  gcc/analyzer/known-function-manager.h
  8e66d6b2b230cab65bd41073d71a2e77  gcc/analyzer/pending-diagnostic.cc
--- 3108,3114 ----
  7ee54f0568377ab1b37ccdc7bb949387  gcc/analyzer/inlining-iterator.h
  9289c540d66da127e56aa983ca018af6  gcc/analyzer/kf-analyzer.cc
  f939ceabcab4e031bd8a0960eaa768dc  gcc/analyzer/kf-lang-cp.cc
! a1af8ccbd67edb5d6c72354582903eb9  gcc/analyzer/kf.cc
  87c0ace2795d7de6063a286af6c85d5b  gcc/analyzer/known-function-manager.cc
  03a32d089b911aa5389a2b9006795f83  gcc/analyzer/known-function-manager.h
  8e66d6b2b230cab65bd41073d71a2e77  gcc/analyzer/pending-diagnostic.cc
*************** c77616ec7ed7ec81357de9544f955910  gcc/at
*** 3170,3176 ****
  6e6a84b213adacaae73a6cb01cc52027  gcc/attribs.h
  54fb3cb1cab63227c50a50819ea1a3c3  gcc/auto-inc-dec.cc
  c25bbcb70f43e3c72a329043adf2c6c2  gcc/auto-obstack.h
! f0e5638a5f27d0f41657e67c4144b747  gcc/auto-profile.cc
  750f46d563af89307c9b19bbb4a2dd18  gcc/auto-profile.h
  1fd4de40d068f0ae7857fb0c2e22e46e  gcc/avoid-store-forwarding.cc
  b187aaef50f37afeeee1f8239d5aa033  gcc/avoid-store-forwarding.h
--- 3166,3172 ----
  6e6a84b213adacaae73a6cb01cc52027  gcc/attribs.h
  54fb3cb1cab63227c50a50819ea1a3c3  gcc/auto-inc-dec.cc
  c25bbcb70f43e3c72a329043adf2c6c2  gcc/auto-obstack.h
! b31a3c960ab296b251634c7306c392e5  gcc/auto-profile.cc
  750f46d563af89307c9b19bbb4a2dd18  gcc/auto-profile.h
  1fd4de40d068f0ae7857fb0c2e22e46e  gcc/avoid-store-forwarding.cc
  b187aaef50f37afeeee1f8239d5aa033  gcc/avoid-store-forwarding.h
*************** a977ddda313933a15767f0f354618de3  gcc/c-
*** 3230,3236 ****
  ac5daa4f7d7788a3f68dde7fe7a25316  gcc/c-family/known-headers.h
  f09c431056b5138e7cfe8376e05de9a6  gcc/c-family/name-hint.h
  d71f74b5b48d9ec5e4e6463e7330121d  gcc/c-family/stub-objc.cc
! d6149183c6e37e66a8274ff022487ba4  gcc/c/ChangeLog
  b1fc09d2244c8e8a72b4df9bc9af30d7  gcc/c/Make-lang.in
  f1e5593aebd5cffb4b3cbffe6bd0860a  gcc/c/c-aux-info.cc
  178d24653bb20936d73bad078e70763c  gcc/c/c-convert.cc
--- 3226,3232 ----
  ac5daa4f7d7788a3f68dde7fe7a25316  gcc/c-family/known-headers.h
  f09c431056b5138e7cfe8376e05de9a6  gcc/c-family/name-hint.h
  d71f74b5b48d9ec5e4e6463e7330121d  gcc/c-family/stub-objc.cc
! 0b631e3e3abe2d63e0fd83ae893e08fd  gcc/c/ChangeLog
  b1fc09d2244c8e8a72b4df9bc9af30d7  gcc/c/Make-lang.in
  f1e5593aebd5cffb4b3cbffe6bd0860a  gcc/c/c-aux-info.cc
  178d24653bb20936d73bad078e70763c  gcc/c/c-convert.cc
*************** d9c0725d061adffdf400457d91be3aed  gcc/c/
*** 3241,3254 ****
  4be9de2ca25340adb8f350478db6a3d8  gcc/c/c-lang.h
  e0b7650de772103a6ae330552c1960bc  gcc/c/c-objc-common.cc
  757f583d06a3ec98336adbfc92b4e6a8  gcc/c/c-objc-common.h
! d1945edf86f67458bb923b9c7f24a1a4  gcc/c/c-parser.cc
  9c122bd6feb8ae4a94420c890e654801  gcc/c/c-parser.h
  9179f46b6a06c7d734278f5ce2c55883  gcc/c/c-tree.def
  e61cde6629f6e6274d475cc7fcb76210  gcc/c/c-tree.h
! f1893704a00f6264ea5a96740e08426a  gcc/c/c-typeck.cc
  cd371895d730dd64e947066b2e4378f8  gcc/c/config-lang.in
  1bd76a24d1322659f048abe2272a6f34  gcc/c/gccspec.cc
! c169f2d94910060e76c333db12b960b9  gcc/c/gimple-parser.cc
  84e0373f5db72260d34cf125d8587f06  gcc/c/gimple-parser.h
  137bed6e3e62068dc6a3292ae42a0a4e  gcc/caller-save.cc
  2b184651895163e884d870ab2434dd33  gcc/calls.cc
--- 3237,3250 ----
  4be9de2ca25340adb8f350478db6a3d8  gcc/c/c-lang.h
  e0b7650de772103a6ae330552c1960bc  gcc/c/c-objc-common.cc
  757f583d06a3ec98336adbfc92b4e6a8  gcc/c/c-objc-common.h
! 61216a7e2abee97e6045d125dea17652  gcc/c/c-parser.cc
  9c122bd6feb8ae4a94420c890e654801  gcc/c/c-parser.h
  9179f46b6a06c7d734278f5ce2c55883  gcc/c/c-tree.def
  e61cde6629f6e6274d475cc7fcb76210  gcc/c/c-tree.h
! 3ccbd67bcf958fb03d88fb60f0664e77  gcc/c/c-typeck.cc
  cd371895d730dd64e947066b2e4378f8  gcc/c/config-lang.in
  1bd76a24d1322659f048abe2272a6f34  gcc/c/gccspec.cc
! 1ed203cdf15f14eb7bfe0eaabf41f503  gcc/c/gimple-parser.cc
  84e0373f5db72260d34cf125d8587f06  gcc/c/gimple-parser.h
  137bed6e3e62068dc6a3292ae42a0a4e  gcc/caller-save.cc
  2b184651895163e884d870ab2434dd33  gcc/calls.cc
*************** bbad65845fcf9cdbc5137d96f92eacab  gcc/cf
*** 3275,3284 ****
  7c2358ab451ca13a153f64b7682d772a  gcc/cfgloopmanip.h
  86fd277253913430380bc5d51e4b395b  gcc/cfgrtl.cc
  132f0eb682ec622dc563cfc697da1fb8  gcc/cfgrtl.h
! e8aea35c3537127601ec95f65a09591c  gcc/cgraph.cc
! 6efd2066f705098914ba5a90b8214010  gcc/cgraph.h
  5fa2e94f261a8a6fc0d80b1c4b227d25  gcc/cgraphbuild.cc
! b87eab2b04054f0d3cd20768be99c655  gcc/cgraphclones.cc
  0f66c996f10f0bf02ea42e4e3088d9e7  gcc/cgraphunit.cc
  70fa61377ff65ad3f25778a40159f510  gcc/cif-code.def
  b78f31ef38addf5472c2ea4acecfdddc  gcc/cobol/ChangeLog
--- 3271,3280 ----
  7c2358ab451ca13a153f64b7682d772a  gcc/cfgloopmanip.h
  86fd277253913430380bc5d51e4b395b  gcc/cfgrtl.cc
  132f0eb682ec622dc563cfc697da1fb8  gcc/cfgrtl.h
! 9e297c72930ffff22f14939e3318bc48  gcc/cgraph.cc
! 9ef6759756353339978bc8b97942c871  gcc/cgraph.h
  5fa2e94f261a8a6fc0d80b1c4b227d25  gcc/cgraphbuild.cc
! c5b7ca04197fcc4e5da54fde8ad44c3f  gcc/cgraphclones.cc
  0f66c996f10f0bf02ea42e4e3088d9e7  gcc/cgraphunit.cc
  70fa61377ff65ad3f25778a40159f510  gcc/cif-code.def
  b78f31ef38addf5472c2ea4acecfdddc  gcc/cobol/ChangeLog
*************** f842f1b8595f3ac795ba92c2b07085e6  gcc/co
*** 3387,3393 ****
  03a53ecd36b397fbe0846ead66505e2d  gcc/common/config/pa/pa-common.cc
  1fbcfc1a92bb13e4405bc75767cf8a36  gcc/common/config/pdp11/pdp11-common.cc
  8af6b6302dcf18a445bb944adeda6388  gcc/common/config/pru/pru-common.cc
! f510f358b6b672c8f32cb67833da6364  gcc/common/config/riscv/riscv-common.cc
  8a5a4ee26b110f44497208d1b31e3503  gcc/common/config/riscv/riscv-ext-bitmask.def
  08537bef63b33fd56aeb2a292c9a207a  gcc/common/config/rs6000/rs6000-common.cc
  9ddaceac9f81b4798f64241b273f8e1c  gcc/common/config/rx/rx-common.cc
--- 3383,3389 ----
  03a53ecd36b397fbe0846ead66505e2d  gcc/common/config/pa/pa-common.cc
  1fbcfc1a92bb13e4405bc75767cf8a36  gcc/common/config/pdp11/pdp11-common.cc
  8af6b6302dcf18a445bb944adeda6388  gcc/common/config/pru/pru-common.cc
! ef075d12174a03d1df62e05ff60dc76d  gcc/common/config/riscv/riscv-common.cc
  8a5a4ee26b110f44497208d1b31e3503  gcc/common/config/riscv/riscv-ext-bitmask.def
  08537bef63b33fd56aeb2a292c9a207a  gcc/common/config/rs6000/rs6000-common.cc
  9ddaceac9f81b4798f64241b273f8e1c  gcc/common/config/rx/rx-common.cc
*************** b5a916bb9dd788754ac9e4ad7174ee74  gcc/co
*** 3402,3408 ****
  b209201703dd766f76ff5e16b99191e5  gcc/compare-elim.cc
  618780fbce0ce0cb6f9b86e079ce4e54  gcc/conditions.h
  1b4bc58c657bf910929d06d51bc8fa6c  gcc/config.build
! 9191ea8c22d78e845f8d0da530d4ee50  gcc/config.gcc
  053bb14b428d0f073932e88b9a29a8bd  gcc/config.host
  9f90e78b127d8b71b269593c1734d1ce  gcc/config.in
  8e697813dc96ca90f5d0f4c196efe2cc  gcc/config/README
--- 3398,3404 ----
  b209201703dd766f76ff5e16b99191e5  gcc/compare-elim.cc
  618780fbce0ce0cb6f9b86e079ce4e54  gcc/conditions.h
  1b4bc58c657bf910929d06d51bc8fa6c  gcc/config.build
! 8e79868122df56900d0000a650e3dd1a  gcc/config.gcc
  053bb14b428d0f073932e88b9a29a8bd  gcc/config.host
  9f90e78b127d8b71b269593c1734d1ce  gcc/config.in
  8e697813dc96ca90f5d0f4c196efe2cc  gcc/config/README
*************** ddbb7a934f8b8aa068e7b765c4375fbe  gcc/co
*** 3411,3417 ****
  25015a0315f13c9da9f02b76796af35c  gcc/config/aarch64/aarch64-builtin-pairs.def
  7bfe6f577e74d04fbaece4d908e4f3ea  gcc/config/aarch64/aarch64-builtins.cc
  482530e7572b40bc2ad01bdec0c1b97e  gcc/config/aarch64/aarch64-builtins.h
! d1e3bcda28d89d23e45fed74c629752a  gcc/config/aarch64/aarch64-c.cc
  133f61af7e288fe91ca31c659939c551  gcc/config/aarch64/aarch64-coff.h
  8b59e9f9bf194c999ccfdbaf58382401  gcc/config/aarch64/aarch64-cores.def
  85b8b0267c641b7fb638fffcb3016739  gcc/config/aarch64/aarch64-cost-tables.h
--- 3407,3413 ----
  25015a0315f13c9da9f02b76796af35c  gcc/config/aarch64/aarch64-builtin-pairs.def
  7bfe6f577e74d04fbaece4d908e4f3ea  gcc/config/aarch64/aarch64-builtins.cc
  482530e7572b40bc2ad01bdec0c1b97e  gcc/config/aarch64/aarch64-builtins.h
! 88514909ca8a45a6aacefcfde3ad410e  gcc/config/aarch64/aarch64-c.cc
  133f61af7e288fe91ca31c659939c551  gcc/config/aarch64/aarch64-coff.h
  8b59e9f9bf194c999ccfdbaf58382401  gcc/config/aarch64/aarch64-cores.def
  85b8b0267c641b7fb638fffcb3016739  gcc/config/aarch64/aarch64-cost-tables.h
*************** eb027b43f3e6788c44aa2d2b7e11943f  gcc/co
*** 3434,3440 ****
  3c95e830c849ee5787b2e1d5128a4bc6  gcc/config/aarch64/aarch64-modes.def
  64c80b1b7cd981b4fb4b76f7c36c9428  gcc/config/aarch64/aarch64-neon-sve-bridge-builtins.def
  f931bc8e97c2f1358ad3ad91e902d553  gcc/config/aarch64/aarch64-netbsd.h
! 601c97a8470cb68f7a1a09205fa06352  gcc/config/aarch64/aarch64-option-extensions.def
  eb901cf32e942a31db5999eda012dc00  gcc/config/aarch64/aarch64-opts.h
  a349e9ba39f96f10f6c9f5e13bb8b661  gcc/config/aarch64/aarch64-passes.def
  370531fbf21fa3201c387501beadfc19  gcc/config/aarch64/aarch64-protos.h
--- 3430,3436 ----
  3c95e830c849ee5787b2e1d5128a4bc6  gcc/config/aarch64/aarch64-modes.def
  64c80b1b7cd981b4fb4b76f7c36c9428  gcc/config/aarch64/aarch64-neon-sve-bridge-builtins.def
  f931bc8e97c2f1358ad3ad91e902d553  gcc/config/aarch64/aarch64-netbsd.h
! fd3b89b2d66ea57bd77a12740d2748d6  gcc/config/aarch64/aarch64-option-extensions.def
  eb901cf32e942a31db5999eda012dc00  gcc/config/aarch64/aarch64-opts.h
  a349e9ba39f96f10f6c9f5e13bb8b661  gcc/config/aarch64/aarch64-passes.def
  370531fbf21fa3201c387501beadfc19  gcc/config/aarch64/aarch64-protos.h
*************** a349e9ba39f96f10f6c9f5e13bb8b661  gcc/co
*** 3442,3464 ****
  8f28d55d0c7fc64387352822e99a37ff  gcc/config/aarch64/aarch64-simd-builtins.def
  33ce4a896b77324d9be6448637daf9ca  gcc/config/aarch64/aarch64-simd-pragma-builtins.def
  f54684432bab80c575e3c6e63969eb2e  gcc/config/aarch64/aarch64-simd.md
! 6cdad67417683a468b18516d900945e4  gcc/config/aarch64/aarch64-sme.md
  fa6672290fdf9366d9919defcb7e41d7  gcc/config/aarch64/aarch64-speculation.cc
  9311f63fb41454e9c423862057e8eb6b  gcc/config/aarch64/aarch64-sve-builtins-base.cc
  35bb69e0b38657d068d103a2da1b8a16  gcc/config/aarch64/aarch64-sve-builtins-base.def
  cdcf6636402c3c91eb0010325542b491  gcc/config/aarch64/aarch64-sve-builtins-base.h
  993ce6c82fa9fb849e689abc42a6b57d  gcc/config/aarch64/aarch64-sve-builtins-functions.h
! 089932b501cb5cd94383201ef2002478  gcc/config/aarch64/aarch64-sve-builtins-shapes.cc
! 88653955c7c15c0ac1d6f1bd1b827641  gcc/config/aarch64/aarch64-sve-builtins-shapes.h
! e055c97bc39ff21701576ecf45b3a7a0  gcc/config/aarch64/aarch64-sve-builtins-sme.cc
! d2df4505e1ba73f2a8f28738e16adf4f  gcc/config/aarch64/aarch64-sve-builtins-sme.def
! 020b06065c22c51e5b289ef55b54a5b5  gcc/config/aarch64/aarch64-sve-builtins-sme.h
  590c9c2e2c6855697cef84761c420b80  gcc/config/aarch64/aarch64-sve-builtins-sve2.cc
  5249e3dd61e8bd70c85a23c5711f3ca2  gcc/config/aarch64/aarch64-sve-builtins-sve2.def
  e2d80b89552da0c6b4cb6bede3b2e573  gcc/config/aarch64/aarch64-sve-builtins-sve2.h
! ddf6a04395c39345a0781804ad22f83f  gcc/config/aarch64/aarch64-sve-builtins.cc
  30d08305d5bc784af521254aea449949  gcc/config/aarch64/aarch64-sve-builtins.def
! 5ef25fd86c1c16a4a6fb3f74e12802b4  gcc/config/aarch64/aarch64-sve-builtins.h
  6b4c78e39d414797929d4ce3c07354b2  gcc/config/aarch64/aarch64-sve.md
  22e46b0f0125a4df3106ce29ae1e6be7  gcc/config/aarch64/aarch64-sve2.md
  85eca95263cb099f09b18daca655f091  gcc/config/aarch64/aarch64-sys-regs.def
--- 3438,3460 ----
  8f28d55d0c7fc64387352822e99a37ff  gcc/config/aarch64/aarch64-simd-builtins.def
  33ce4a896b77324d9be6448637daf9ca  gcc/config/aarch64/aarch64-simd-pragma-builtins.def
  f54684432bab80c575e3c6e63969eb2e  gcc/config/aarch64/aarch64-simd.md
! fec3caf088f2add6cefcfb20f6dcae7f  gcc/config/aarch64/aarch64-sme.md
  fa6672290fdf9366d9919defcb7e41d7  gcc/config/aarch64/aarch64-speculation.cc
  9311f63fb41454e9c423862057e8eb6b  gcc/config/aarch64/aarch64-sve-builtins-base.cc
  35bb69e0b38657d068d103a2da1b8a16  gcc/config/aarch64/aarch64-sve-builtins-base.def
  cdcf6636402c3c91eb0010325542b491  gcc/config/aarch64/aarch64-sve-builtins-base.h
  993ce6c82fa9fb849e689abc42a6b57d  gcc/config/aarch64/aarch64-sve-builtins-functions.h
! 1093118c843f37d5b0c03624e5cf96ab  gcc/config/aarch64/aarch64-sve-builtins-shapes.cc
! b253116c3233b03f9ffe694bbbc6efbe  gcc/config/aarch64/aarch64-sve-builtins-shapes.h
! f3e52f115b01c46c9eb8009d950b8d7f  gcc/config/aarch64/aarch64-sve-builtins-sme.cc
! 2c404dcd9f8edf147364f4503199c585  gcc/config/aarch64/aarch64-sve-builtins-sme.def
! 4929a2908dc0a3aaa4b8e51c84cee8c8  gcc/config/aarch64/aarch64-sve-builtins-sme.h
  590c9c2e2c6855697cef84761c420b80  gcc/config/aarch64/aarch64-sve-builtins-sve2.cc
  5249e3dd61e8bd70c85a23c5711f3ca2  gcc/config/aarch64/aarch64-sve-builtins-sve2.def
  e2d80b89552da0c6b4cb6bede3b2e573  gcc/config/aarch64/aarch64-sve-builtins-sve2.h
! 5efdf9c0eed50224410c2d6d9f07c4c3  gcc/config/aarch64/aarch64-sve-builtins.cc
  30d08305d5bc784af521254aea449949  gcc/config/aarch64/aarch64-sve-builtins.def
! 7fd6d8764884c5b95a20329cf9b10465  gcc/config/aarch64/aarch64-sve-builtins.h
  6b4c78e39d414797929d4ce3c07354b2  gcc/config/aarch64/aarch64-sve.md
  22e46b0f0125a4df3106ce29ae1e6be7  gcc/config/aarch64/aarch64-sve2.md
  85eca95263cb099f09b18daca655f091  gcc/config/aarch64/aarch64-sys-regs.def
*************** b301dc231a69a28202d2b7d79ea75f5d  gcc/co
*** 3466,3473 ****
  d10a350a80f8f12ee435c64d236e2767  gcc/config/aarch64/aarch64-tuning-flags.def
  a5cfcce7c9dd86a597161f8bde3497bc  gcc/config/aarch64/aarch64-vxworks.h
  f5392a2f3f5eb7a0e35fda438aa84c99  gcc/config/aarch64/aarch64.cc
! bbedb9dbb43d897f509e3d0c2debbfdb  gcc/config/aarch64/aarch64.h
! 15c31fdfaa00774701901cfd34888f9e  gcc/config/aarch64/aarch64.md
  ae13780a8296e9c52f9e9b8cd95dc312  gcc/config/aarch64/aarch64.opt
  21fd50b19307096b8be37549ae0f6f77  gcc/config/aarch64/aarch64.opt.urls
  7b468a20f0362cbe02c7699720a962fa  gcc/config/aarch64/arm_acle.h
--- 3462,3469 ----
  d10a350a80f8f12ee435c64d236e2767  gcc/config/aarch64/aarch64-tuning-flags.def
  a5cfcce7c9dd86a597161f8bde3497bc  gcc/config/aarch64/aarch64-vxworks.h
  f5392a2f3f5eb7a0e35fda438aa84c99  gcc/config/aarch64/aarch64.cc
! e88bf184a2d9e804f5493fe2a553b3df  gcc/config/aarch64/aarch64.h
! e5594dcb6e1edd8b514ab0d4f4de81aa  gcc/config/aarch64/aarch64.md
  ae13780a8296e9c52f9e9b8cd95dc312  gcc/config/aarch64/aarch64.opt
  21fd50b19307096b8be37549ae0f6f77  gcc/config/aarch64/aarch64.opt.urls
  7b468a20f0362cbe02c7699720a962fa  gcc/config/aarch64/arm_acle.h
*************** fc218940ab265ae323b54d5f007d0d98  gcc/co
*** 3748,3754 ****
  98f0885d00f05d443b653a409d430892  gcc/config/avr/avr-dimode.md
  9a2b84c46488af6472dd771432afe065  gcc/config/avr/avr-fixed.md
  a05a37166e94a56a2d7d2be632dbab55  gcc/config/avr/avr-log.cc
! 117bbef05f3fb7ba16a92cee51e0064c  gcc/config/avr/avr-mcus.def
  1db4fe94056a22e92de33b6d365176c6  gcc/config/avr/avr-modes.def
  d37f092206fc4c0379cee5e5fc01b654  gcc/config/avr/avr-passes-fuse-move.h
  627df811141f10a317b8ff56208c13b8  gcc/config/avr/avr-passes.cc
--- 3744,3750 ----
  98f0885d00f05d443b653a409d430892  gcc/config/avr/avr-dimode.md
  9a2b84c46488af6472dd771432afe065  gcc/config/avr/avr-fixed.md
  a05a37166e94a56a2d7d2be632dbab55  gcc/config/avr/avr-log.cc
! 16c38242d01a11655dde3f3dafd49a17  gcc/config/avr/avr-mcus.def
  1db4fe94056a22e92de33b6d365176c6  gcc/config/avr/avr-modes.def
  d37f092206fc4c0379cee5e5fc01b654  gcc/config/avr/avr-passes-fuse-move.h
  627df811141f10a317b8ff56208c13b8  gcc/config/avr/avr-passes.cc
*************** d3fb594d11281112ff8d8f304a000c4e  gcc/co
*** 4164,4170 ****
  a4a1a27264871bfba9de0f4fbdb4f3ac  gcc/config/i386/i386-c.cc
  54909bb70e074c14dcf4499a5baedc54  gcc/config/i386/i386-d.cc
  172dcd61afc5800b61ebb688838d9adc  gcc/config/i386/i386-d.h
! 7403712670fccbe903042e29efc1c75e  gcc/config/i386/i386-expand.cc
  c9c3969c00808c9b6809fbeab3e4a1d2  gcc/config/i386/i386-expand.h
  7c6ed0dee4ccb56d115ae98caeba7a81  gcc/config/i386/i386-features.cc
  1ee34fa5f2ae92fd7d48419d8fc529f8  gcc/config/i386/i386-features.h
--- 4160,4166 ----
  a4a1a27264871bfba9de0f4fbdb4f3ac  gcc/config/i386/i386-c.cc
  54909bb70e074c14dcf4499a5baedc54  gcc/config/i386/i386-d.cc
  172dcd61afc5800b61ebb688838d9adc  gcc/config/i386/i386-d.h
! 783951434d4582b0d666d74ee845fc5a  gcc/config/i386/i386-expand.cc
  c9c3969c00808c9b6809fbeab3e4a1d2  gcc/config/i386/i386-expand.h
  7c6ed0dee4ccb56d115ae98caeba7a81  gcc/config/i386/i386-features.cc
  1ee34fa5f2ae92fd7d48419d8fc529f8  gcc/config/i386/i386-features.h
*************** fc41e4ebf77dd1f54ddeec4e60428d5e  gcc/co
*** 4225,4231 ****
  1d9e8c2f64fa31f36bfe9ac83a296943  gcc/config/i386/pmmintrin.h
  62337355ef8c4334a0cc9c1db0cfc0da  gcc/config/i386/popcntintrin.h
  d17b84bc85c341e7f386b3b24b231070  gcc/config/i386/ppro.md
! 8a2e5c45db2bdf9f07190c20da5d6fca  gcc/config/i386/predicates.md
  e10e34eef814ce6c5e09777d378d36d3  gcc/config/i386/prfchiintrin.h
  eed7a3601ce61f497dcfc5655e5da7a6  gcc/config/i386/prfchwintrin.h
  bc11b09d2de8ba6b9ec2392f1cebdbd9  gcc/config/i386/raointintrin.h
--- 4221,4227 ----
  1d9e8c2f64fa31f36bfe9ac83a296943  gcc/config/i386/pmmintrin.h
  62337355ef8c4334a0cc9c1db0cfc0da  gcc/config/i386/popcntintrin.h
  d17b84bc85c341e7f386b3b24b231070  gcc/config/i386/ppro.md
! a70524fcad4f5387541c54cb33f48d62  gcc/config/i386/predicates.md
  e10e34eef814ce6c5e09777d378d36d3  gcc/config/i386/prfchiintrin.h
  eed7a3601ce61f497dcfc5655e5da7a6  gcc/config/i386/prfchwintrin.h
  bc11b09d2de8ba6b9ec2392f1cebdbd9  gcc/config/i386/raointintrin.h
*************** de4e89bc042c6bc7eb093bda5d33a266  gcc/co
*** 4243,4249 ****
  380f2e50c7d803059b0e7617da00460f  gcc/config/i386/sm4intrin.h
  a24296639492577352dd1309b136bc9a  gcc/config/i386/smmintrin.h
  f98c4d94bf04187a2905e9f4ce7d589b  gcc/config/i386/sol2.h
! ef87b68bec39fd0531b406d89182f84e  gcc/config/i386/sse.md
  7c6ff828c11c2892168a2e450559dcb6  gcc/config/i386/ssemath.h
  7ada9f54207701e1d29fd03ea990e163  gcc/config/i386/stringop.def
  9f75a2e9a9bf20db0bef264cabe77a29  gcc/config/i386/subst.md
--- 4239,4245 ----
  380f2e50c7d803059b0e7617da00460f  gcc/config/i386/sm4intrin.h
  a24296639492577352dd1309b136bc9a  gcc/config/i386/smmintrin.h
  f98c4d94bf04187a2905e9f4ce7d589b  gcc/config/i386/sol2.h
! aeeeab12e77cb97832d5f5616fd59630  gcc/config/i386/sse.md
  7c6ff828c11c2892168a2e450559dcb6  gcc/config/i386/ssemath.h
  7ada9f54207701e1d29fd03ea990e163  gcc/config/i386/stringop.def
  9f75a2e9a9bf20db0bef264cabe77a29  gcc/config/i386/subst.md
*************** b4cde95b709fc93c90bf4d6b3edc7fd0  gcc/co
*** 4296,4302 ****
  acfa3e6ce1f37bbad35e49e06b663ea9  gcc/config/i386/x86-tune-sched-bd.cc
  13fcb5234b2d8208c12932d96efef72b  gcc/config/i386/x86-tune-sched-core.cc
  386439c1f5e6c412caa51de1d9a2c2e0  gcc/config/i386/x86-tune-sched.cc
! b7906c77b82c0b58a894df12c4f056a9  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
--- 4292,4298 ----
  acfa3e6ce1f37bbad35e49e06b663ea9  gcc/config/i386/x86-tune-sched-bd.cc
  13fcb5234b2d8208c12932d96efef72b  gcc/config/i386/x86-tune-sched-core.cc
  386439c1f5e6c412caa51de1d9a2c2e0  gcc/config/i386/x86-tune-sched.cc
! 3939aca78b78bac721ccbc1e23e9119d  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
*************** a8cd9a4a3d712802475e91e0ec9a3274  gcc/co
*** 4416,4422 ****
  f539c2da7e8d7a3ef7c741bceee19eed  gcc/config/loongarch/loongarch-tune.h
  f6ade76d2b651009425a004e44a4cfdf  gcc/config/loongarch/loongarch.cc
  d4fcc746efc8475a01557c5c09179c9a  gcc/config/loongarch/loongarch.h
! 9fd9109f20f7dfce6de910d45b5dbc85  gcc/config/loongarch/loongarch.md
  7eb1817de89953d405ead07dfb2c5316  gcc/config/loongarch/loongarch.opt
  3e1c4af9b4ae813a611788681e7934f1  gcc/config/loongarch/loongarch.opt.urls
  a1ceaab52de5f1950f6c6b63c5a718ea  gcc/config/loongarch/lsx.md
--- 4412,4418 ----
  f539c2da7e8d7a3ef7c741bceee19eed  gcc/config/loongarch/loongarch-tune.h
  f6ade76d2b651009425a004e44a4cfdf  gcc/config/loongarch/loongarch.cc
  d4fcc746efc8475a01557c5c09179c9a  gcc/config/loongarch/loongarch.h
! ec46785efb7afdd2deb34ce71a037c59  gcc/config/loongarch/loongarch.md
  7eb1817de89953d405ead07dfb2c5316  gcc/config/loongarch/loongarch.opt
  3e1c4af9b4ae813a611788681e7934f1  gcc/config/loongarch/loongarch.opt.urls
  a1ceaab52de5f1950f6c6b63c5a718ea  gcc/config/loongarch/lsx.md
*************** cb26f6c0709fd9533aec72a07a36bf8b  gcc/co
*** 4517,4533 ****
  d2676839c4d7a7bcd706a386c029aea2  gcc/config/mcore/predicates.md
  8e427b88391a8cbadd500d5b5c18dd88  gcc/config/mcore/t-mcore
  899d399d572cb0f5b6983bf29e5f2dc1  gcc/config/microblaze/constraints.md
  cd06662d679aac52aa61b8507723384a  gcc/config/microblaze/linux.h
  9bc1818e3b430b758bafdf04bac27f5b  gcc/config/microblaze/microblaze-c.cc
! c1cdfa70252d5e45a9df69ddc7a1ddcb  gcc/config/microblaze/microblaze-protos.h
! 4c138f09ea3287125c33d2faf8f2ffa3  gcc/config/microblaze/microblaze.cc
  0a4fb603eb9a1c6e31bb8fa7e38b16d1  gcc/config/microblaze/microblaze.h
! b3a2d37f3594f70e239fba70728cc641  gcc/config/microblaze/microblaze.md
  3da1e85fbc11c0a5b746cb77b96a06f3  gcc/config/microblaze/microblaze.opt
  ab7ecb87ef3b7a388cab0e4d0d2eb0db  gcc/config/microblaze/microblaze.opt.urls
  0014185f2b662af11e97611027548662  gcc/config/microblaze/predicates.md
  6440a5281eac59ad82a11734d4e82b80  gcc/config/microblaze/rtems.h
! 17120f7b651cdd7f0ef24e2c1b93b29b  gcc/config/microblaze/sync.md
  df031372af9c825d21d2058d266247a0  gcc/config/microblaze/t-microblaze
  63ccba4e7f745d36609d7c129bac6288  gcc/config/microblaze/t-microblaze-linux
  a8b08640136e3e7712d2278eb84c21d9  gcc/config/microblaze/t-rtems
--- 4513,4530 ----
  d2676839c4d7a7bcd706a386c029aea2  gcc/config/mcore/predicates.md
  8e427b88391a8cbadd500d5b5c18dd88  gcc/config/mcore/t-mcore
  899d399d572cb0f5b6983bf29e5f2dc1  gcc/config/microblaze/constraints.md
+ 1ac49ffd4d6e30329a7a425da3ce8eaa  gcc/config/microblaze/iterators.md
  cd06662d679aac52aa61b8507723384a  gcc/config/microblaze/linux.h
  9bc1818e3b430b758bafdf04bac27f5b  gcc/config/microblaze/microblaze-c.cc
! 6e52b66a284ee7f7534fd34961907824  gcc/config/microblaze/microblaze-protos.h
! d895357dc905665b1a8b1d17ec40a25b  gcc/config/microblaze/microblaze.cc
  0a4fb603eb9a1c6e31bb8fa7e38b16d1  gcc/config/microblaze/microblaze.h
! 3af23e0040365b8a82498e8fd7e83bf5  gcc/config/microblaze/microblaze.md
  3da1e85fbc11c0a5b746cb77b96a06f3  gcc/config/microblaze/microblaze.opt
  ab7ecb87ef3b7a388cab0e4d0d2eb0db  gcc/config/microblaze/microblaze.opt.urls
  0014185f2b662af11e97611027548662  gcc/config/microblaze/predicates.md
  6440a5281eac59ad82a11734d4e82b80  gcc/config/microblaze/rtems.h
! 1750a4538fa32f377e18fb05173b0d21  gcc/config/microblaze/sync.md
  df031372af9c825d21d2058d266247a0  gcc/config/microblaze/t-microblaze
  63ccba4e7f745d36609d7c129bac6288  gcc/config/microblaze/t-microblaze-linux
  a8b08640136e3e7712d2278eb84c21d9  gcc/config/microblaze/t-rtems
*************** c02c28dcba5af34ad86e26f316044b17  gcc/co
*** 4882,4889 ****
  ccf120397e978f8cd4ed98cbe2c0d4f5  gcc/config/riscv/andes.def
  96a9b8701199ede652cadbcdeec423d7  gcc/config/riscv/andes.md
  7444da2915b734a807ab2b707fe0fe35  gcc/config/riscv/andes_vector.h
! a8fac3d48de6ff4ff0829ddd27890d3c  gcc/config/riscv/arch-canonicalize
! 98a5104b0eba6389462b44517cf2fd92  gcc/config/riscv/autovec-opt.md
  0a8d3bb5c92b40519d869bae882cf263  gcc/config/riscv/autovec.md
  137855953782419214b0244ad3c8766e  gcc/config/riscv/bitmanip.md
  3d4917c0a2efee97aaca242060652e02  gcc/config/riscv/constraints.md
--- 4879,4886 ----
  ccf120397e978f8cd4ed98cbe2c0d4f5  gcc/config/riscv/andes.def
  96a9b8701199ede652cadbcdeec423d7  gcc/config/riscv/andes.md
  7444da2915b734a807ab2b707fe0fe35  gcc/config/riscv/andes_vector.h
! 3d4ef2c5571dbf0e4bb86d09917f7c07  gcc/config/riscv/arch-canonicalize
! d69d6af590654553d70a6d215ce48fc9  gcc/config/riscv/autovec-opt.md
  0a8d3bb5c92b40519d869bae882cf263  gcc/config/riscv/autovec.md
  137855953782419214b0244ad3c8766e  gcc/config/riscv/bitmanip.md
  3d4917c0a2efee97aaca242060652e02  gcc/config/riscv/constraints.md
*************** fdf40414be0404faa2f689ccff02d68d  gcc/co
*** 4901,4907 ****
  b7e955ddfed9efbb0296ef639c095e2a  gcc/config/riscv/generic.md
  874056dd8e21170d484da69c56e10c2e  gcc/config/riscv/genrvv-type-indexer.cc
  473ed80ccf8dc1ff43e427a45cca3a1e  gcc/config/riscv/gnu.h
! 50341916f4701f933b08ae0270e1afc4  gcc/config/riscv/iterators.md
  85139511ec0cad0144207dc8efc0ed90  gcc/config/riscv/linux.h
  648db331f8cdbd06edc3e19c6dd794b3  gcc/config/riscv/mips-insn.md
  bffa0caedd7144aff55c80a16431d1a1  gcc/config/riscv/mips-p8700.md
--- 4898,4904 ----
  b7e955ddfed9efbb0296ef639c095e2a  gcc/config/riscv/generic.md
  874056dd8e21170d484da69c56e10c2e  gcc/config/riscv/genrvv-type-indexer.cc
  473ed80ccf8dc1ff43e427a45cca3a1e  gcc/config/riscv/gnu.h
! f48ee4711644d6ed4808f7bbd752a416  gcc/config/riscv/iterators.md
  85139511ec0cad0144207dc8efc0ed90  gcc/config/riscv/linux.h
  648db331f8cdbd06edc3e19c6dd794b3  gcc/config/riscv/mips-insn.md
  bffa0caedd7144aff55c80a16431d1a1  gcc/config/riscv/mips-p8700.md
*************** a3d3fa9142d4e2ed34ead146941c574a  gcc/co
*** 4911,4916 ****
--- 4908,4914 ----
  674baa66306b2b08e1b80995759f5381  gcc/config/riscv/pipeline-checker
  a822bb3caeba5677859211738b47e9a7  gcc/config/riscv/predicates.md
  fcde47e773f1cfb9f582a606e2890c72  gcc/config/riscv/riscv-avlprop.cc
+ 179d92544e7a65f0ccf206e876026744  gcc/config/riscv/riscv-bclr-lowest-set-bit.cc
  e54a2d33c6fb9bb0381889dad6fa71d8  gcc/config/riscv/riscv-builtins.cc
  019bb963b8ddc896e82e3ba7622236d2  gcc/config/riscv/riscv-c.cc
  3b7012a7d47b9aaf163e890d3e29013e  gcc/config/riscv/riscv-cmo.def
*************** e5ee9a298220a6317f6fd463f229fc22  gcc/co
*** 4923,4937 ****
  a8a293d3f8f01367abc68e7556a51898  gcc/config/riscv/riscv-ext-sifive.def
  85fb34f0d0de09dc83b4df6f525d78f9  gcc/config/riscv/riscv-ext-thead.def
  5551f756c3aae6dce60511f7f52efa5c  gcc/config/riscv/riscv-ext-ventana.def
! af32382cb388ca699443730dd6483d32  gcc/config/riscv/riscv-ext.def
  4181183566f53fe40ffcac4770a2e206  gcc/config/riscv/riscv-ext.opt
  8463b74f5d66e1a7f0d58a7ae087d8ad  gcc/config/riscv/riscv-ext.opt.urls
  1b0b6b632f747d9387ef25821e8673b4  gcc/config/riscv/riscv-feature-bits.h
  cf70b07b239c5bc3091fdab32e4d5d09  gcc/config/riscv/riscv-ftypes.def
  b1bc6d82a24b7b0e658a43956a37419c  gcc/config/riscv/riscv-modes.def
  9638ea683767d52ade2e23fff486b0a7  gcc/config/riscv/riscv-opts.h
! 2c59654f5f7fe2689efd370c0441b6bd  gcc/config/riscv/riscv-passes.def
! a74e7f8c5cb9995dff8a8d77c7bbd183  gcc/config/riscv/riscv-protos.h
  446f0f39c6f980e246ea56f1233e9271  gcc/config/riscv/riscv-scalar-crypto.def
  003d5626ce3adcac7ca55401c7dec2bc  gcc/config/riscv/riscv-selftests.cc
  da4e034d23a8f2754b1dfce0122f286e  gcc/config/riscv/riscv-shorten-memrefs.cc
--- 4921,4936 ----
  a8a293d3f8f01367abc68e7556a51898  gcc/config/riscv/riscv-ext-sifive.def
  85fb34f0d0de09dc83b4df6f525d78f9  gcc/config/riscv/riscv-ext-thead.def
  5551f756c3aae6dce60511f7f52efa5c  gcc/config/riscv/riscv-ext-ventana.def
! c9dc9c3c85e48c375f03e9c68511f6d8  gcc/config/riscv/riscv-ext.def
  4181183566f53fe40ffcac4770a2e206  gcc/config/riscv/riscv-ext.opt
  8463b74f5d66e1a7f0d58a7ae087d8ad  gcc/config/riscv/riscv-ext.opt.urls
  1b0b6b632f747d9387ef25821e8673b4  gcc/config/riscv/riscv-feature-bits.h
  cf70b07b239c5bc3091fdab32e4d5d09  gcc/config/riscv/riscv-ftypes.def
  b1bc6d82a24b7b0e658a43956a37419c  gcc/config/riscv/riscv-modes.def
  9638ea683767d52ade2e23fff486b0a7  gcc/config/riscv/riscv-opts.h
! c5393897179939c1b5af9631e66d78a8  gcc/config/riscv/riscv-passes.def
! 121d0828b2622389b84f15f8664c88d0  gcc/config/riscv/riscv-profiles.def
! 2f7efbb0d32d75e656452347472eeb02  gcc/config/riscv/riscv-protos.h
  446f0f39c6f980e246ea56f1233e9271  gcc/config/riscv/riscv-scalar-crypto.def
  003d5626ce3adcac7ca55401c7dec2bc  gcc/config/riscv/riscv-selftests.cc
  da4e034d23a8f2754b1dfce0122f286e  gcc/config/riscv/riscv-shorten-memrefs.cc
*************** da4e034d23a8f2754b1dfce0122f286e  gcc/co
*** 4939,4945 ****
  f565a42da3474d73faf1ea727e2d7dcb  gcc/config/riscv/riscv-string.cc
  3b52301e3425e6de33a2436af4de6bd8  gcc/config/riscv/riscv-subset.h
  4421697a26c0e7f7b9eac1623c99387c  gcc/config/riscv/riscv-target-attr.cc
! 38acc6849c6d6e9c822754093796177b  gcc/config/riscv/riscv-v.cc
  0d419e9df116fed7ce6e0ae15131417e  gcc/config/riscv/riscv-v.h
  c5f3161dedd668dfb126ffb191cfb236  gcc/config/riscv/riscv-vect-permconst.cc
  1d781df8fdb7dc0f6e332b3fe767ad85  gcc/config/riscv/riscv-vector-builtins-bases.cc
--- 4938,4944 ----
  f565a42da3474d73faf1ea727e2d7dcb  gcc/config/riscv/riscv-string.cc
  3b52301e3425e6de33a2436af4de6bd8  gcc/config/riscv/riscv-subset.h
  4421697a26c0e7f7b9eac1623c99387c  gcc/config/riscv/riscv-target-attr.cc
! 9f2abb48bd2f7c8491bf9617de5bde37  gcc/config/riscv/riscv-v.cc
  0d419e9df116fed7ce6e0ae15131417e  gcc/config/riscv/riscv-v.h
  c5f3161dedd668dfb126ffb191cfb236  gcc/config/riscv/riscv-vect-permconst.cc
  1d781df8fdb7dc0f6e332b3fe767ad85  gcc/config/riscv/riscv-vector-builtins-bases.cc
*************** dba94786c1a18e3f5fbcca2b5c0af496  gcc/co
*** 4951,4963 ****
  7a3a10292f2295839a8e05cc8ea6dc49  gcc/config/riscv/riscv-vector-builtins.cc
  9cbc8a65b5045746afeedeb7b0404c5c  gcc/config/riscv/riscv-vector-builtins.def
  08fa98f25292b0aaeb6566f437f6f30a  gcc/config/riscv/riscv-vector-builtins.h
! 68ce0161d927f393940028692de76ef3  gcc/config/riscv/riscv-vector-costs.cc
  2a441fb15ed4d774924fe163f29ccf7a  gcc/config/riscv/riscv-vector-costs.h
  f51037a9e437f8e9ce7215b2da5ad4e2  gcc/config/riscv/riscv-vector-switch.def
  5a1dc434073ed565843a91456f836a9a  gcc/config/riscv/riscv-vsetvl.cc
  d120ed6eb2847b636271b3a1ef82ecbf  gcc/config/riscv/riscv-vsetvl.def
  7082a18dbfc574d47bf71f4d50dd30f9  gcc/config/riscv/riscv-zicfilp.cc
! 5d2734ecde4b699dbe29f806fa3fc0bb  gcc/config/riscv/riscv.cc
  0766a701a8c90815575fae86f92cc4a6  gcc/config/riscv/riscv.h
  464164f3b242382443bb440b81635224  gcc/config/riscv/riscv.md
  fec1c87bba727131a45d4ec4a9ae5490  gcc/config/riscv/riscv.opt
--- 4950,4962 ----
  7a3a10292f2295839a8e05cc8ea6dc49  gcc/config/riscv/riscv-vector-builtins.cc
  9cbc8a65b5045746afeedeb7b0404c5c  gcc/config/riscv/riscv-vector-builtins.def
  08fa98f25292b0aaeb6566f437f6f30a  gcc/config/riscv/riscv-vector-builtins.h
! a8fdfe0455fce7cebbb65a7e70831d8a  gcc/config/riscv/riscv-vector-costs.cc
  2a441fb15ed4d774924fe163f29ccf7a  gcc/config/riscv/riscv-vector-costs.h
  f51037a9e437f8e9ce7215b2da5ad4e2  gcc/config/riscv/riscv-vector-switch.def
  5a1dc434073ed565843a91456f836a9a  gcc/config/riscv/riscv-vsetvl.cc
  d120ed6eb2847b636271b3a1ef82ecbf  gcc/config/riscv/riscv-vsetvl.def
  7082a18dbfc574d47bf71f4d50dd30f9  gcc/config/riscv/riscv-zicfilp.cc
! e9cb9ac87a1fc13739fb46b03fbc03d7  gcc/config/riscv/riscv.cc
  0766a701a8c90815575fae86f92cc4a6  gcc/config/riscv/riscv.h
  464164f3b242382443bb440b81635224  gcc/config/riscv/riscv.md
  fec1c87bba727131a45d4ec4a9ae5490  gcc/config/riscv/riscv.opt
*************** faca69fa18f3f779cd3ee4d6a53e6193  gcc/co
*** 4982,4988 ****
  1c27821991689abdaa7a908a0cc8dfa4  gcc/config/riscv/t-elf-multilib
  381cb38e167feed84dad697fce89cabd  gcc/config/riscv/t-linux
  1ed181a166b1d0e206c4a4e0024cce2a  gcc/config/riscv/t-linux-multilib
! 9aed248d54c931acb1e16f8db1edcd15  gcc/config/riscv/t-riscv
  fe202105dd9e81b9ce8fdcc11d52c294  gcc/config/riscv/t-rtems
  97a182737ed075d29be4ab1e848de420  gcc/config/riscv/t-withmultilib
  0478f4e79601d91fb8ad8f210b304a7b  gcc/config/riscv/t-withmultilib-generator
--- 4981,4987 ----
  1c27821991689abdaa7a908a0cc8dfa4  gcc/config/riscv/t-elf-multilib
  381cb38e167feed84dad697fce89cabd  gcc/config/riscv/t-linux
  1ed181a166b1d0e206c4a4e0024cce2a  gcc/config/riscv/t-linux-multilib
! 4775541dd5d3b254d12a2f76dfc4aa53  gcc/config/riscv/t-riscv
  fe202105dd9e81b9ce8fdcc11d52c294  gcc/config/riscv/t-rtems
  97a182737ed075d29be4ab1e848de420  gcc/config/riscv/t-withmultilib
  0478f4e79601d91fb8ad8f210b304a7b  gcc/config/riscv/t-withmultilib-generator
*************** fd8e9517de64ab23821ea1284ea6d7f6  gcc/co
*** 4994,5000 ****
  77cbfbc9ab58a5e1e4112e275f18b317  gcc/config/riscv/tt-ascalon-d8.md
  b5e46305db1116cc1758b504ea37fe74  gcc/config/riscv/vector-bfloat16.md
  88f7597398d0c8b8b87baba5fd207996  gcc/config/riscv/vector-crypto.md
! adcd359890ba21e0ab9c4ac4cf8251b8  gcc/config/riscv/vector-iterators.md
  aad921b86850f284e3d6fd15eb5feb17  gcc/config/riscv/vector.md
  18d213c106fe52eebc74017d5ff892ce  gcc/config/riscv/xiangshan.md
  0f64aaa114ab62a1a46f7ac422d6a129  gcc/config/riscv/zc.md
--- 4993,4999 ----
  77cbfbc9ab58a5e1e4112e275f18b317  gcc/config/riscv/tt-ascalon-d8.md
  b5e46305db1116cc1758b504ea37fe74  gcc/config/riscv/vector-bfloat16.md
  88f7597398d0c8b8b87baba5fd207996  gcc/config/riscv/vector-crypto.md
! 272e0e076fad4b77c195a95427b2a0d8  gcc/config/riscv/vector-iterators.md
  aad921b86850f284e3d6fd15eb5feb17  gcc/config/riscv/vector.md
  18d213c106fe52eebc74017d5ff892ce  gcc/config/riscv/xiangshan.md
  0f64aaa114ab62a1a46f7ac422d6a129  gcc/config/riscv/zc.md
*************** f11925c88524d2fd457bf77944da1302  gcc/co
*** 5167,5173 ****
  38e93eff3a2b573d1d802ebad267b109  gcc/config/rs6000/vec_types.h
  a5506e6d02e00eca6773ad6611fafec6  gcc/config/rs6000/vector.md
  92d84780bc97fec043576239dfbc4de4  gcc/config/rs6000/vsx.md
! 0c3e96369fe8015c822892859cac5451  gcc/config/rs6000/vxworks.h
  cd6fbfee7df45bb751e81a607bf1cb7d  gcc/config/rs6000/vxworksae.h
  ec49257e720fea1d0b85265da90de158  gcc/config/rs6000/vxworksmils.h
  44a93bbae0ad5aba424ba7b97cc6914d  gcc/config/rs6000/x-aix
--- 5166,5172 ----
  38e93eff3a2b573d1d802ebad267b109  gcc/config/rs6000/vec_types.h
  a5506e6d02e00eca6773ad6611fafec6  gcc/config/rs6000/vector.md
  92d84780bc97fec043576239dfbc4de4  gcc/config/rs6000/vsx.md
! 30d0d23b1554fccc113a2a8d74d0f6b7  gcc/config/rs6000/vxworks.h
  cd6fbfee7df45bb751e81a607bf1cb7d  gcc/config/rs6000/vxworksae.h
  ec49257e720fea1d0b85265da90de158  gcc/config/rs6000/vxworksmils.h
  44a93bbae0ad5aba424ba7b97cc6914d  gcc/config/rs6000/x-aix
*************** f3a2992c8e85b13e50b261e26924d83f  gcc/co
*** 5487,5499 ****
  87fc5c87547999f715031b4ff99fb67b  gcc/config/xtensa/xtensa-dynconfig.cc
  c7be35a23fd70ac184dd9072319304c7  gcc/config/xtensa/xtensa-opts.h
  e20fad8bff9c459aaef3ea80a54e1973  gcc/config/xtensa/xtensa-protos.h
! 92950369828e7e9323c0543cd126af05  gcc/config/xtensa/xtensa.cc
! d34c83a4daaaf6aa2e539c777ff21ec9  gcc/config/xtensa/xtensa.h
  1cde9c01b4d75d9d8e8eccd725a9e44f  gcc/config/xtensa/xtensa.md
  f0452ea712955ce21c9c149136850780  gcc/config/xtensa/xtensa.opt
  db57d7603312357e8c0cfb21c32353d1  gcc/config/xtensa/xtensa.opt.urls
! 5d95f96bc00d429cd8cd4979937f693e  gcc/configure
! 705965eab8da0ca5e96e940836622000  gcc/configure.ac
  ec3aa966ca3fe9c6f84d4378160541b6  gcc/context.cc
  d1bde52b8dee0c0c5506d7e320b1bb61  gcc/context.h
  a9c3cddee4e237141062720b72fe38cd  gcc/convert.cc
--- 5486,5498 ----
  87fc5c87547999f715031b4ff99fb67b  gcc/config/xtensa/xtensa-dynconfig.cc
  c7be35a23fd70ac184dd9072319304c7  gcc/config/xtensa/xtensa-opts.h
  e20fad8bff9c459aaef3ea80a54e1973  gcc/config/xtensa/xtensa-protos.h
! 29c66fbf074a0e617b2b2e6101d5fe6f  gcc/config/xtensa/xtensa.cc
! 1c1ce8236bb94fc6c2784ab209bff598  gcc/config/xtensa/xtensa.h
  1cde9c01b4d75d9d8e8eccd725a9e44f  gcc/config/xtensa/xtensa.md
  f0452ea712955ce21c9c149136850780  gcc/config/xtensa/xtensa.opt
  db57d7603312357e8c0cfb21c32353d1  gcc/config/xtensa/xtensa.opt.urls
! a131b476a448e7a93fb050eafcf9127b  gcc/configure
! b488223a1d9ac4b3b080de06f3d8a5f1  gcc/configure.ac
  ec3aa966ca3fe9c6f84d4378160541b6  gcc/context.cc
  d1bde52b8dee0c0c5506d7e320b1bb61  gcc/context.h
  a9c3cddee4e237141062720b72fe38cd  gcc/convert.cc
*************** fa062fdcbed6412a676fa477d87ba334  gcc/co
*** 5503,5509 ****
  5d31df44fc0a5b17beb74ce0ff38e214  gcc/coroutine-passes.cc
  02796caeaa2f14f72dc3c9c23cc97dfc  gcc/coverage.cc
  722fb5fda78e55c5af5da72cad78751f  gcc/coverage.h
! fc3692b7c9f824fd0b8b2e800a295994  gcc/cp/ChangeLog
  70c059f2b75a2fc1bb95a526b21b8cd7  gcc/cp/ChangeLog-1993
  7cbd106e10a0ba7c052bee3fe20671c2  gcc/cp/ChangeLog-1994
  3b1e3ed23ad4363f75e6fd2fbb583dee  gcc/cp/ChangeLog-1995
--- 5502,5508 ----
  5d31df44fc0a5b17beb74ce0ff38e214  gcc/coroutine-passes.cc
  02796caeaa2f14f72dc3c9c23cc97dfc  gcc/coverage.cc
  722fb5fda78e55c5af5da72cad78751f  gcc/coverage.h
! ad2c7f59db9f26be33cfc80ce70beaae  gcc/cp/ChangeLog
  70c059f2b75a2fc1bb95a526b21b8cd7  gcc/cp/ChangeLog-1993
  7cbd106e10a0ba7c052bee3fe20671c2  gcc/cp/ChangeLog-1994
  3b1e3ed23ad4363f75e6fd2fbb583dee  gcc/cp/ChangeLog-1995
*************** bcf7c5d02934e40f17edeb18d58c4d4d  gcc/cp
*** 5539,5550 ****
  c1c7801b9b0f379e702a4f6cb83972e7  gcc/cp/ChangeLog.ptr
  9aa3cd9f75c785de9f51446e3f295515  gcc/cp/ChangeLog.tree-ssa
  2315f072c416e98144559bbdb5312c21  gcc/cp/Make-lang.in
! 50a02755cc22e0a29cf866544e50ef28  gcc/cp/call.cc
  fce8de27014c109814b3f69be6a5d4f6  gcc/cp/cfns.gperf
  68fc21d4889b1c70ccf89747b98b1fb4  gcc/cp/cfns.h
  0414c494620e2ace88b96b92413b56d0  gcc/cp/class.cc
  ee3fb2cc9b9557d3895f527353160bd4  gcc/cp/config-lang.in
! 402d770bd9d5bfaaed8772abe0787b1b  gcc/cp/constexpr.cc
  d6cbf9f4441b7af5436e73a63106b11b  gcc/cp/constraint.cc
  b4452de3b42a36f42cdd92b905d201b6  gcc/cp/contracts.cc
  1e70d5eb4e7210b177ea2f5fa77983b8  gcc/cp/contracts.h
--- 5538,5549 ----
  c1c7801b9b0f379e702a4f6cb83972e7  gcc/cp/ChangeLog.ptr
  9aa3cd9f75c785de9f51446e3f295515  gcc/cp/ChangeLog.tree-ssa
  2315f072c416e98144559bbdb5312c21  gcc/cp/Make-lang.in
! e52d539d2165f7cb7850846d0bc87b86  gcc/cp/call.cc
  fce8de27014c109814b3f69be6a5d4f6  gcc/cp/cfns.gperf
  68fc21d4889b1c70ccf89747b98b1fb4  gcc/cp/cfns.h
  0414c494620e2ace88b96b92413b56d0  gcc/cp/class.cc
  ee3fb2cc9b9557d3895f527353160bd4  gcc/cp/config-lang.in
! 5ec243f8828ba1d004801071dcfd04be  gcc/cp/constexpr.cc
  d6cbf9f4441b7af5436e73a63106b11b  gcc/cp/constraint.cc
  b4452de3b42a36f42cdd92b905d201b6  gcc/cp/contracts.cc
  1e70d5eb4e7210b177ea2f5fa77983b8  gcc/cp/contracts.h
*************** c1cc5dac36866c611933c037cc1d6f2f  gcc/cp
*** 5573,5584 ****
  3b7c086cfb4ed89e6ae40a09ca796704  gcc/cp/friend.cc
  3d079dd21f8a1ab95fb2d1f96d799283  gcc/cp/g++spec.cc
  30b9ed40d39cf78b95792ef5dca2aebb  gcc/cp/gen-cxxapi-file.py
! c9c9e9532763a552999ab9955200dcbd  gcc/cp/init.cc
! e6309750e7888003d3c19108d433c340  gcc/cp/lambda.cc
  ac5d78393361c1bcb930119a896a14ca  gcc/cp/lang-specs.h
  b1fd7f71ea0372fd8228b79f373b9e51  gcc/cp/lex.cc
  aaf76a9b03fd0532d2904aef004fd66a  gcc/cp/logic.cc
! 2bc6c8244b905d3e4cc5ebceabcbfc36  gcc/cp/mangle.cc
  5efd09b0532a0b524e859d61c942156d  gcc/cp/mapper-client.cc
  6c77b1fab5f6d146677090285a202a50  gcc/cp/mapper-client.h
  44e22b51797f89c9da996523a6d97f1c  gcc/cp/mapper-resolver.cc
--- 5572,5583 ----
  3b7c086cfb4ed89e6ae40a09ca796704  gcc/cp/friend.cc
  3d079dd21f8a1ab95fb2d1f96d799283  gcc/cp/g++spec.cc
  30b9ed40d39cf78b95792ef5dca2aebb  gcc/cp/gen-cxxapi-file.py
! 3d6cb26f32533fe963daa0e473559f31  gcc/cp/init.cc
! a1706890eae20598ac1aeeb34cb89c59  gcc/cp/lambda.cc
  ac5d78393361c1bcb930119a896a14ca  gcc/cp/lang-specs.h
  b1fd7f71ea0372fd8228b79f373b9e51  gcc/cp/lex.cc
  aaf76a9b03fd0532d2904aef004fd66a  gcc/cp/logic.cc
! 457d345401c84ae9e21d86a6d1c5532e  gcc/cp/mangle.cc
  5efd09b0532a0b524e859d61c942156d  gcc/cp/mapper-client.cc
  6c77b1fab5f6d146677090285a202a50  gcc/cp/mapper-client.h
  44e22b51797f89c9da996523a6d97f1c  gcc/cp/mapper-resolver.cc
*************** e7fe06956aada61bcaae5168ad47a9c1  gcc/cp
*** 5590,5596 ****
  813c253a000ee20d8d6598f56edc400e  gcc/cp/optimize.cc
  4e247010b8aa821446c1f2f62b45424d  gcc/cp/parser.cc
  db6ae85b922989f89eda229cb29e4690  gcc/cp/parser.h
! a4548048a4343da13c9b87d9e96cb9c4  gcc/cp/pt.cc
  b606903e35fe6806362fe4eee7a89fef  gcc/cp/ptree.cc
  ee1ddf1e1b9554bb1a10109ce8c6dee5  gcc/cp/rtti.cc
  9c5477f737d2c390510c3fe72454f657  gcc/cp/search.cc
--- 5589,5595 ----
  813c253a000ee20d8d6598f56edc400e  gcc/cp/optimize.cc
  4e247010b8aa821446c1f2f62b45424d  gcc/cp/parser.cc
  db6ae85b922989f89eda229cb29e4690  gcc/cp/parser.h
! b4fdfedaf9ca61f866f9c458576a1dc8  gcc/cp/pt.cc
  b606903e35fe6806362fe4eee7a89fef  gcc/cp/ptree.cc
  ee1ddf1e1b9554bb1a10109ce8c6dee5  gcc/cp/rtti.cc
  9c5477f737d2c390510c3fe72454f657  gcc/cp/search.cc
*************** ec1e9c9456a8530e241079823e2fc126  gcc/cr
*** 5613,5620 ****
  4d2f6ca081e1447a5bc287da4f7f1f06  gcc/cselib.cc
  44a1aa31be5edacb5f5644352fbb669c  gcc/cselib.h
  1ded054093de910d9786c62bc4fe8cc6  gcc/cstamp-h.in
! 15aef1bfc1d9935a8df200d3827b59c6  gcc/ctfc.cc
! 3df123e84e7c118eb423425f2100e3b5  gcc/ctfc.h
  aec0cd5251de880945c96eb21e97eac9  gcc/ctfout.cc
  4cd58b042512684d230b9ebc87171263  gcc/d/ChangeLog
  94dbce564aba342900829d11192f8905  gcc/d/ChangeLog-2006
--- 5612,5619 ----
  4d2f6ca081e1447a5bc287da4f7f1f06  gcc/cselib.cc
  44a1aa31be5edacb5f5644352fbb669c  gcc/cselib.h
  1ded054093de910d9786c62bc4fe8cc6  gcc/cstamp-h.in
! 2bf1c74a1febc7e88b742b5f9f749d0c  gcc/ctfc.cc
! 4093d677699af429b243885de7e0bbfe  gcc/ctfc.h
  aec0cd5251de880945c96eb21e97eac9  gcc/ctfout.cc
  4cd58b042512684d230b9ebc87171263  gcc/d/ChangeLog
  94dbce564aba342900829d11192f8905  gcc/d/ChangeLog-2006
*************** db78b93a68a738fdb34ae6aa97fe35db  gcc/di
*** 5891,5907 ****
  51b5b20d6930ca3bac2a5915b6cc4985  gcc/diagnostic-global-context.cc
  ddb5e19e6f3ff8224aedd1a60eaad23e  gcc/diagnostic-highlight-colors.h
  03317dcb68edc20739a39d6cdd14723d  gcc/diagnostic.h
! 5b0e18f26cbf7cd3adf6f6e852bee3e2  gcc/diagnostics/buffering.cc
! 47de19fd41c4322b6be98c4f8c0d4617  gcc/diagnostics/buffering.h
  40fd6d86656b819f4c830d0d493b0d88  gcc/diagnostics/changes.cc
  ff66e6baa4830cf18c7b97e2eb383ac5  gcc/diagnostics/changes.h
! edcbcad65269c8bfebcac2def7bc9cc1  gcc/diagnostics/client-data-hooks.h
  c9250b15349fce5a608b769043f111e5  gcc/diagnostics/color.cc
  d29ddcb032cf35e525663d8b857fe46b  gcc/diagnostics/color.h
  3e3d9b398652afcc049d57d6ebcb4d1b  gcc/diagnostics/column-options.h
  feea31e8e6eec9c1403f01df95d221d4  gcc/diagnostics/context-options.h
! 166ee78865d627c8072eec20128e7fe1  gcc/diagnostics/context.cc
! cbbbe0789e52cde3cf1f28f5b04c6d4f  gcc/diagnostics/context.h
  3f0f4bd88c2110afde540ec51f32ce6b  gcc/diagnostics/counters.h
  6eb2e40f405d950a9e9f3c089680a899  gcc/diagnostics/diagnostic-info.h
  fd87cae7d2e8cfdbfe401ce78e684593  gcc/diagnostics/diagnostics-selftests.cc
--- 5890,5906 ----
  51b5b20d6930ca3bac2a5915b6cc4985  gcc/diagnostic-global-context.cc
  ddb5e19e6f3ff8224aedd1a60eaad23e  gcc/diagnostic-highlight-colors.h
  03317dcb68edc20739a39d6cdd14723d  gcc/diagnostic.h
! 2cd4aab54f6c12ad828413ff7618f06b  gcc/diagnostics/buffering.cc
! f20852cc0e48388252817a217fdece5d  gcc/diagnostics/buffering.h
  40fd6d86656b819f4c830d0d493b0d88  gcc/diagnostics/changes.cc
  ff66e6baa4830cf18c7b97e2eb383ac5  gcc/diagnostics/changes.h
! 16583830c095d0fcb1f76506394972bd  gcc/diagnostics/client-data-hooks.h
  c9250b15349fce5a608b769043f111e5  gcc/diagnostics/color.cc
  d29ddcb032cf35e525663d8b857fe46b  gcc/diagnostics/color.h
  3e3d9b398652afcc049d57d6ebcb4d1b  gcc/diagnostics/column-options.h
  feea31e8e6eec9c1403f01df95d221d4  gcc/diagnostics/context-options.h
! 77740a4009141b6a58b2b48aad3cd9eb  gcc/diagnostics/context.cc
! 3d657a4a23a157637d4867b6d5e18546  gcc/diagnostics/context.h
  3f0f4bd88c2110afde540ec51f32ce6b  gcc/diagnostics/counters.h
  6eb2e40f405d950a9e9f3c089680a899  gcc/diagnostics/diagnostic-info.h
  fd87cae7d2e8cfdbfe401ce78e684593  gcc/diagnostics/diagnostics-selftests.cc
*************** d60716b4d04276f95205c6f8d2140f90  gcc/di
*** 5914,5964 ****
  cff4c3f5d806ef5fa9ea2a9776fcc922  gcc/diagnostics/event-id.h
  9ba917dd5ceec0dd361cd811174136d3  gcc/diagnostics/file-cache.cc
  4e3d1fe87ad0979f552310facbc2e534  gcc/diagnostics/file-cache.h
! f57fc7f90744b5b7f5afad3c5d68a718  gcc/diagnostics/html-sink.cc
  4b8362b8dc9d0407e250775c344c387a  gcc/diagnostics/html-sink.h
  e5801529f87f5812381a450d52efaebf  gcc/diagnostics/kinds.def
  8c6a5304c40c7fa2b3f9a71b0144b010  gcc/diagnostics/kinds.h
! 9c9f1df85c4ab3a3e0b7d60a87966af2  gcc/diagnostics/lazy-paths.cc
  4ed6c990f3102512e3c60c6c5069dd21  gcc/diagnostics/lazy-paths.h
  6f69e590053bf3418aca58e6ff240d75  gcc/diagnostics/logging.cc
  81ed01992a2ef4d39eafb623f51b4abf  gcc/diagnostics/logging.h
! c131a194acbb9d5e4682e19f1a759181  gcc/diagnostics/logical-locations.h
! ed9e23a6a190e966a47730d652613dd2  gcc/diagnostics/macro-unwinding.cc
! 1a1b13e68ed47b8eb0342caa0caee17b  gcc/diagnostics/macro-unwinding.h
  f6d38b3a59fedd8d4664f2f9da2dc780  gcc/diagnostics/metadata.h
  625181add33d5bfe0e9fbec59bff16f5  gcc/diagnostics/option-classifier.cc
! 3df9c58d5592c4781758cda2f751adb8  gcc/diagnostics/option-classifier.h
  aa4ae9b850b3b556ebb4ac4ba4849e4b  gcc/diagnostics/option-id-manager.h
  ee46d9f24ee418300e1cb8af08ce0e7c  gcc/diagnostics/option-id.h
  cc65ae2ee101a218fd768c2fee83af6e  gcc/diagnostics/output-file.h
! 6ef0de99941e4efdc7102081e6a20e2d  gcc/diagnostics/output-spec.cc
  3eec925c74669a3ab2099a0428b64b64  gcc/diagnostics/output-spec.h
! cefbba8b03685fbfd838e1f457bb843a  gcc/diagnostics/paths-output.cc
! e60ad2d99ee160a6acce95a85c4f5884  gcc/diagnostics/paths.cc
  ab20f8a7e64efd9ea6670e6447014d6f  gcc/diagnostics/paths.h
! f87cf798c1632ef27096c13fa48a77aa  gcc/diagnostics/sarif-sink.cc
  2e5b6abdac74dd6e43e3985e6a54b648  gcc/diagnostics/sarif-sink.h
! ee068b3f8fd2d449eee5a70ef6dad518  gcc/diagnostics/selftest-context.cc
  0c9931582348dcf2e668dad28878e073  gcc/diagnostics/selftest-context.h
! 380b1d9e0cb480756d7490c2ff04e99b  gcc/diagnostics/selftest-logical-locations.cc
! 7073aeb2c7dc0e5c5ad6514f695f2317  gcc/diagnostics/selftest-logical-locations.h
! 112984df670b9db84c11f891b9d5b94b  gcc/diagnostics/selftest-paths.cc
  24e9e37ce7832be5c6807735b79cb487  gcc/diagnostics/selftest-paths.h
  7cdb74e1f66d5f344d0902bc7ca9c28d  gcc/diagnostics/selftest-source-printing.h
  642ae5ac3bdb29af1ce35f486bc47bfd  gcc/diagnostics/sink.h
  83cfb383914a3b5f56ce7cf9222d2389  gcc/diagnostics/source-printing-effects.h
! 32405413e6ea2511c6e8bd5f66689ac2  gcc/diagnostics/source-printing-options.h
! 7ef5bdd49854458958c5c1ca32a221e8  gcc/diagnostics/source-printing.cc
  c7ddef71ac29eb2a389042f195e3b325  gcc/diagnostics/state-graphs-to-dot.cc
  725af6438f327bd6aa23464c8fc3653a  gcc/diagnostics/state-graphs.cc
  fd0a458b50e99299115a0f8f2f59dd9d  gcc/diagnostics/state-graphs.h
! 4bfe541424ef1c4658f0a472e9623d34  gcc/diagnostics/text-sink.cc
  59de35a57a51077e80939e29ebfbc93a  gcc/diagnostics/text-sink.h
  b882c3ac372bd1a3c12cb702a5bdf197  gcc/diagnostics/url.h
  e2ff50cf5215e2299270f0da4d4d60d0  gcc/digraph.cc
  18e73120a6e21ceac1adce40777000cf  gcc/digraph.h
  896dfab99ef4a3f697fdf60723346e28  gcc/doc/analyzer.texi
! 7c6d6f8bba4a9890d950bdef623af96f  gcc/doc/avr-mmcu.texi
  628200aba31497f381052220465b8927  gcc/doc/bugreport.texi
  519dad6b92ca7405e11a87efd5ddd705  gcc/doc/cfg.texi
  5c6f1e0d6b6424f27020c9e5c08807d4  gcc/doc/collect2.texi
--- 5913,5963 ----
  cff4c3f5d806ef5fa9ea2a9776fcc922  gcc/diagnostics/event-id.h
  9ba917dd5ceec0dd361cd811174136d3  gcc/diagnostics/file-cache.cc
  4e3d1fe87ad0979f552310facbc2e534  gcc/diagnostics/file-cache.h
! 5d2d4494568d25dad970588a60d5a54d  gcc/diagnostics/html-sink.cc
  4b8362b8dc9d0407e250775c344c387a  gcc/diagnostics/html-sink.h
  e5801529f87f5812381a450d52efaebf  gcc/diagnostics/kinds.def
  8c6a5304c40c7fa2b3f9a71b0144b010  gcc/diagnostics/kinds.h
! c9bbf46b6dd83be0981b0fa62f2bee49  gcc/diagnostics/lazy-paths.cc
  4ed6c990f3102512e3c60c6c5069dd21  gcc/diagnostics/lazy-paths.h
  6f69e590053bf3418aca58e6ff240d75  gcc/diagnostics/logging.cc
  81ed01992a2ef4d39eafb623f51b4abf  gcc/diagnostics/logging.h
! 4d462bdb7065205d39205b5be1b9a1bf  gcc/diagnostics/logical-locations.h
! 8a023cc243e3fe14a86d78e5dbf5db72  gcc/diagnostics/macro-unwinding.cc
! 8ae5f8c83e0ad585ffcf4c5439a247d8  gcc/diagnostics/macro-unwinding.h
  f6d38b3a59fedd8d4664f2f9da2dc780  gcc/diagnostics/metadata.h
  625181add33d5bfe0e9fbec59bff16f5  gcc/diagnostics/option-classifier.cc
! f3b69e3c00a503b61ca298aef10ad690  gcc/diagnostics/option-classifier.h
  aa4ae9b850b3b556ebb4ac4ba4849e4b  gcc/diagnostics/option-id-manager.h
  ee46d9f24ee418300e1cb8af08ce0e7c  gcc/diagnostics/option-id.h
  cc65ae2ee101a218fd768c2fee83af6e  gcc/diagnostics/output-file.h
! b0ff42bf6006919b540d993e76ef7a74  gcc/diagnostics/output-spec.cc
  3eec925c74669a3ab2099a0428b64b64  gcc/diagnostics/output-spec.h
! f804348b86b5dda4ae2b27490ef6174a  gcc/diagnostics/paths-output.cc
! 51d4d6e54884c6e6761d5dc2cdffa683  gcc/diagnostics/paths.cc
  ab20f8a7e64efd9ea6670e6447014d6f  gcc/diagnostics/paths.h
! 9e239a9c60208578eecdff90f5249862  gcc/diagnostics/sarif-sink.cc
  2e5b6abdac74dd6e43e3985e6a54b648  gcc/diagnostics/sarif-sink.h
! 3e342054c83a59cc481a893e6d5bd6c5  gcc/diagnostics/selftest-context.cc
  0c9931582348dcf2e668dad28878e073  gcc/diagnostics/selftest-context.h
! adaecbd7febc2698db08b843ef816569  gcc/diagnostics/selftest-logical-locations.cc
! 22f2fc9cf78ca98f4a939a24cc666a06  gcc/diagnostics/selftest-logical-locations.h
! 147ff017bb0f9814549f0531412bd6c5  gcc/diagnostics/selftest-paths.cc
  24e9e37ce7832be5c6807735b79cb487  gcc/diagnostics/selftest-paths.h
  7cdb74e1f66d5f344d0902bc7ca9c28d  gcc/diagnostics/selftest-source-printing.h
  642ae5ac3bdb29af1ce35f486bc47bfd  gcc/diagnostics/sink.h
  83cfb383914a3b5f56ce7cf9222d2389  gcc/diagnostics/source-printing-effects.h
! 31a93cdcb18c5c2be551cc3d9f449735  gcc/diagnostics/source-printing-options.h
! 1e9da35769926d056bf6e20dd560077e  gcc/diagnostics/source-printing.cc
  c7ddef71ac29eb2a389042f195e3b325  gcc/diagnostics/state-graphs-to-dot.cc
  725af6438f327bd6aa23464c8fc3653a  gcc/diagnostics/state-graphs.cc
  fd0a458b50e99299115a0f8f2f59dd9d  gcc/diagnostics/state-graphs.h
! 25bc733b1ce5a6422c2113e73eb493be  gcc/diagnostics/text-sink.cc
  59de35a57a51077e80939e29ebfbc93a  gcc/diagnostics/text-sink.h
  b882c3ac372bd1a3c12cb702a5bdf197  gcc/diagnostics/url.h
  e2ff50cf5215e2299270f0da4d4d60d0  gcc/digraph.cc
  18e73120a6e21ceac1adce40777000cf  gcc/digraph.h
  896dfab99ef4a3f697fdf60723346e28  gcc/doc/analyzer.texi
! 73b84511fa3199b1850b9f63c2f0f50e  gcc/doc/avr-mmcu.texi
  628200aba31497f381052220465b8927  gcc/doc/bugreport.texi
  519dad6b92ca7405e11a87efd5ddd705  gcc/doc/cfg.texi
  5c6f1e0d6b6424f27020c9e5c08807d4  gcc/doc/collect2.texi
*************** a28615d9873d98f0d5f4ef8dd3e4c39d  gcc/do
*** 5983,5989 ****
  8700253b7c491bd8902f580c7dcff6dc  gcc/doc/gcov.texi
  1bea8e2d0aad7d4a7283b3a4e2628663  gcc/doc/generic.texi
  6dd13335166acce8e899b838ecbd04bd  gcc/doc/gimple.texi
! 43808f9404edf4ea28b68479f495fa31  gcc/doc/gm2.texi
  dc4ccd9843d88bc01c909438dabfd6ab  gcc/doc/gnu.texi
  e146722b4ab52551483390772327c93f  gcc/doc/gty.texi
  27e2895f33fff82c6e13b5b9e7b8df6b  gcc/doc/headerdirs.texi
--- 5982,5988 ----
  8700253b7c491bd8902f580c7dcff6dc  gcc/doc/gcov.texi
  1bea8e2d0aad7d4a7283b3a4e2628663  gcc/doc/generic.texi
  6dd13335166acce8e899b838ecbd04bd  gcc/doc/gimple.texi
! f72ad763b4e7eab410da44cc9f88c374  gcc/doc/gm2.texi
  dc4ccd9843d88bc01c909438dabfd6ab  gcc/doc/gnu.texi
  e146722b4ab52551483390772327c93f  gcc/doc/gty.texi
  27e2895f33fff82c6e13b5b9e7b8df6b  gcc/doc/headerdirs.texi
*************** ee4c7654f733cefcb73d4fd24f3e1b82  gcc/do
*** 5997,6003 ****
  e9b8122841fbfbbc30fee8ed6613c399  gcc/doc/include/texinfo.tex
  840715392034007a3ef3fdebf22e2781  gcc/doc/install.texi
  0f98706361e63fac2c35c2c4491eaac4  gcc/doc/install.texi2html
! 303fc10891d96b86d8a5e6aa2a1944cd  gcc/doc/invoke.texi
  47f1f55b3595acf670eb6193a0cbd933  gcc/doc/languages.texi
  8783f1b0b6c204d4417b00f3b772beea  gcc/doc/libgcc.texi
  ef4f00c423089323edef1d3cff31a4a2  gcc/doc/libgdiagnostics/Makefile
--- 5996,6002 ----
  e9b8122841fbfbbc30fee8ed6613c399  gcc/doc/include/texinfo.tex
  840715392034007a3ef3fdebf22e2781  gcc/doc/install.texi
  0f98706361e63fac2c35c2c4491eaac4  gcc/doc/install.texi2html
! ccf8240fd9837b0a9d7dd63034107c2e  gcc/doc/invoke.texi
  47f1f55b3595acf670eb6193a0cbd933  gcc/doc/languages.texi
  8783f1b0b6c204d4417b00f3b772beea  gcc/doc/libgcc.texi
  ef4f00c423089323edef1d3cff31a4a2  gcc/doc/libgdiagnostics/Makefile
*************** de4a03cd382601071e81e57cc6c2a7e1  gcc/ex
*** 6091,6097 ****
  b5fa845ff578d70e8ceae655d6affc51  gcc/explow.h
  a4ee0bae47797ce73f05daef7a07edd4  gcc/expmed.cc
  dee0d85cc89e81b4cc185f1c3102811e  gcc/expmed.h
! bdfe394a9600210c353eaa357782b08d  gcc/expr.cc
  dfa85539f017784504ec3d884e09901f  gcc/expr.h
  7117d2d0dde87eaf1ab2853b5bfd62e2  gcc/ext-dce.cc
  2ecf474a8f5380e5027c5b7a745cd736  gcc/fibonacci_heap.cc
--- 6090,6096 ----
  b5fa845ff578d70e8ceae655d6affc51  gcc/explow.h
  a4ee0bae47797ce73f05daef7a07edd4  gcc/expmed.cc
  dee0d85cc89e81b4cc185f1c3102811e  gcc/expmed.h
! 3a0759a3a107749941de50ee2b943e46  gcc/expr.cc
  dfa85539f017784504ec3d884e09901f  gcc/expr.h
  7117d2d0dde87eaf1ab2853b5bfd62e2  gcc/ext-dce.cc
  2ecf474a8f5380e5027c5b7a745cd736  gcc/fibonacci_heap.cc
*************** ada0afb884a142f8214291990679be13  gcc/fo
*** 6110,6116 ****
  ab65c11488de8f259592eef4bca9338b  gcc/fold-const.cc
  f23dec03425a07611492fa2c061cd7d2  gcc/fold-const.h
  cd4e6baf5d162fbd41160606055f8297  gcc/fold-mem-offsets.cc
! 23e49f17c6f243545ffd5ab81f3bb49b  gcc/fortran/ChangeLog
  083c53fadafdcf3be46713838a51e36c  gcc/fortran/ChangeLog-2002
  2a4ca18d211fb2603139354fd16398ed  gcc/fortran/ChangeLog-2003
  e7462609ebd0dd7c874e0fc00e2833aa  gcc/fortran/ChangeLog-2004
--- 6109,6115 ----
  ab65c11488de8f259592eef4bca9338b  gcc/fold-const.cc
  f23dec03425a07611492fa2c061cd7d2  gcc/fold-const.h
  cd4e6baf5d162fbd41160606055f8297  gcc/fold-mem-offsets.cc
! 1ddadadda95b445b23128b4cd5f593b9  gcc/fortran/ChangeLog
  083c53fadafdcf3be46713838a51e36c  gcc/fortran/ChangeLog-2002
  2a4ca18d211fb2603139354fd16398ed  gcc/fortran/ChangeLog-2003
  e7462609ebd0dd7c874e0fc00e2833aa  gcc/fortran/ChangeLog-2004
*************** aed3aedb6378a970055dff9e11eedc2d  gcc/fo
*** 6151,6182 ****
  b7e224f665bb5044ce35ed09435bd4fb  gcc/fortran/cpp.h
  a232f4d280ad08511e2718281b3d1ab6  gcc/fortran/data.cc
  d85e2f2fc3ee4721563bd47719063fb6  gcc/fortran/data.h
! a391fcfa5c30324b553f4c758f386200  gcc/fortran/decl.cc
  c33e2c4c7527bec8a125dd093dc59f2a  gcc/fortran/dependency.cc
  70111b1c7592e650c281b513c3cf2f47  gcc/fortran/dependency.h
  9f708de69558a334a8fec77d40a2a376  gcc/fortran/dump-parse-tree.cc
  0aa273bc8ec396d25bbd76d19dd7d226  gcc/fortran/error.cc
  b3beb0a8e06a71d205d3639a1bc35738  gcc/fortran/expr.cc
  4951d066b4086c9dc1486fd5e2dbe2c2  gcc/fortran/f95-lang.cc
! 7209bb6b200fb678d28513a056ab4455  gcc/fortran/frontend-passes.cc
  a39f360f255f1ef6dfd91ccefef63e05  gcc/fortran/gfc-diagnostic.def
  bd08c55098f00394b9922e6163c27b92  gcc/fortran/gfc-internals.texi
! 354706dbb34726aa05bf11d77fc0a3aa  gcc/fortran/gfortran.h
  d29bb6813221f46b4cde9df77292c412  gcc/fortran/gfortran.texi
  af66ab40a5434219772b76ad10035e45  gcc/fortran/gfortranspec.cc
  e4fe6ce0303cd182ebd328bdb0ae5743  gcc/fortran/interface.cc
  74d5cc035a8e6ee1fb5826c965c90532  gcc/fortran/intrinsic.cc
  47e0e62e0a6eaad27941f8e734cda2a2  gcc/fortran/intrinsic.h
  429eb49bcb0cb30dc19ef3aa3a032962  gcc/fortran/intrinsic.texi
! d9adb34dd5debb7dc5853dbd9c099b8e  gcc/fortran/invoke.texi
  4a91f323761835f16a1a9b3995485379  gcc/fortran/io.cc
  d2a28ef98f6f78d1608fb52204e013a5  gcc/fortran/ioparm.def
  4d2d654877c2408059ea42ec970d9e6b  gcc/fortran/iresolve.cc
  40087b4e405f3e0f17ebd4f0e9b63f48  gcc/fortran/iso-c-binding.def
  085e3672e4679e2b51b9f144b552caed  gcc/fortran/iso-fortran-env.def
  5c4523263ea0f1cd46baacba848e1fd5  gcc/fortran/lang-specs.h
! 2e69cb4e17cc2e89fd21228231798659  gcc/fortran/lang.opt
! 9c43410ca32214bfab9763966c01547a  gcc/fortran/lang.opt.urls
  33cf77e4943bfb687d3a0bd5fa94ec58  gcc/fortran/libgfortran.h
  9fb964ee8c0ef3d4ffb8f95aa2ad3203  gcc/fortran/match.cc
  047778859aa899389e3b7e65c1439faa  gcc/fortran/match.h
--- 6150,6181 ----
  b7e224f665bb5044ce35ed09435bd4fb  gcc/fortran/cpp.h
  a232f4d280ad08511e2718281b3d1ab6  gcc/fortran/data.cc
  d85e2f2fc3ee4721563bd47719063fb6  gcc/fortran/data.h
! 87782c227997fe3666ed9e9141493acd  gcc/fortran/decl.cc
  c33e2c4c7527bec8a125dd093dc59f2a  gcc/fortran/dependency.cc
  70111b1c7592e650c281b513c3cf2f47  gcc/fortran/dependency.h
  9f708de69558a334a8fec77d40a2a376  gcc/fortran/dump-parse-tree.cc
  0aa273bc8ec396d25bbd76d19dd7d226  gcc/fortran/error.cc
  b3beb0a8e06a71d205d3639a1bc35738  gcc/fortran/expr.cc
  4951d066b4086c9dc1486fd5e2dbe2c2  gcc/fortran/f95-lang.cc
! 7ff99bd8794c2d5f2533f516ec00306b  gcc/fortran/frontend-passes.cc
  a39f360f255f1ef6dfd91ccefef63e05  gcc/fortran/gfc-diagnostic.def
  bd08c55098f00394b9922e6163c27b92  gcc/fortran/gfc-internals.texi
! 980c99b15e20bd5ee317fceaa206705f  gcc/fortran/gfortran.h
  d29bb6813221f46b4cde9df77292c412  gcc/fortran/gfortran.texi
  af66ab40a5434219772b76ad10035e45  gcc/fortran/gfortranspec.cc
  e4fe6ce0303cd182ebd328bdb0ae5743  gcc/fortran/interface.cc
  74d5cc035a8e6ee1fb5826c965c90532  gcc/fortran/intrinsic.cc
  47e0e62e0a6eaad27941f8e734cda2a2  gcc/fortran/intrinsic.h
  429eb49bcb0cb30dc19ef3aa3a032962  gcc/fortran/intrinsic.texi
! 491e0576258d33e46ed87fe37a39cc55  gcc/fortran/invoke.texi
  4a91f323761835f16a1a9b3995485379  gcc/fortran/io.cc
  d2a28ef98f6f78d1608fb52204e013a5  gcc/fortran/ioparm.def
  4d2d654877c2408059ea42ec970d9e6b  gcc/fortran/iresolve.cc
  40087b4e405f3e0f17ebd4f0e9b63f48  gcc/fortran/iso-c-binding.def
  085e3672e4679e2b51b9f144b552caed  gcc/fortran/iso-fortran-env.def
  5c4523263ea0f1cd46baacba848e1fd5  gcc/fortran/lang-specs.h
! 1b21bc6997375de7ba798cd6fb5ed15a  gcc/fortran/lang.opt
! 3841d5e1069b067c75c1474e5eb9e7e9  gcc/fortran/lang.opt.urls
  33cf77e4943bfb687d3a0bd5fa94ec58  gcc/fortran/libgfortran.h
  9fb964ee8c0ef3d4ffb8f95aa2ad3203  gcc/fortran/match.cc
  047778859aa899389e3b7e65c1439faa  gcc/fortran/match.h
*************** d2a28ef98f6f78d1608fb52204e013a5  gcc/fo
*** 6185,6215 ****
  6e89e2e347d7f6e1576cbda0e958b5bd  gcc/fortran/misc.cc
  cc253aa18378a960466507b449eb64b6  gcc/fortran/module.cc
  8da1b859b4dc259b551a9531ad3eaa9f  gcc/fortran/openmp.cc
! 5b63ee69316bceb14ed8172adcfedf6b  gcc/fortran/options.cc
  44ee980cc04645c25872621b20fc36fa  gcc/fortran/parse.cc
  c1b40e866a8bbe611aa65278fe2508d3  gcc/fortran/parse.h
! 5a809896860a322ebc1f0e101b39e979  gcc/fortran/primary.cc
! 7d5d4ee37a4196afbef5cbe6de069ea2  gcc/fortran/resolve.cc
  8dc2391850ee95634781b6e296a096f6  gcc/fortran/scanner.cc
  3c39e0eef946c7f557ac375f23b9f3db  gcc/fortran/scanner.h
  71190056d6f36d3d43d4b6ed27f23032  gcc/fortran/simplify.cc
! 3255bc920c3609e58d8a01f6464313e8  gcc/fortran/st.cc
  7fc6fb7f159830fc0d98a9cd72e5cdf9  gcc/fortran/symbol.cc
  c9238712914e77b971fde08221a31bf7  gcc/fortran/target-memory.cc
  50451f5a575ab606948f8e72d8cc4721  gcc/fortran/target-memory.h
! f71b9f73bb493383cba909160da98ddd  gcc/fortran/trans-array.cc
  682d93b7e921d709d88b7e5219a69d53  gcc/fortran/trans-array.h
  dfe1e1950e068389ed73663e9a11ad88  gcc/fortran/trans-common.cc
  d555f911945a83db335013815934e941  gcc/fortran/trans-const.cc
  857805820c2a6ac77d2652c610d23de8  gcc/fortran/trans-const.h
! f79b89542b626c6f54fa944f3612dfd7  gcc/fortran/trans-decl.cc
! fa0e23cf32b2de51ec36efc52120c1df  gcc/fortran/trans-expr.cc
  75dbdc3d489814fc18082a069cd7c3ab  gcc/fortran/trans-intrinsic.cc
  4a091b0b546257101e406582ece724f7  gcc/fortran/trans-io.cc
  27df041e4caff610df844e7a22e291e3  gcc/fortran/trans-openmp.cc
  ef3436c60285865c7e4a611b65ebca7d  gcc/fortran/trans-stmt.cc
  9caf8a2f93e6cf5e2a567a3aa18f957c  gcc/fortran/trans-stmt.h
! 23c951c4924ba8a16582a8b9e5065a87  gcc/fortran/trans-types.cc
  422959ab20fd75df3766a03597227fd2  gcc/fortran/trans-types.h
  47d7a4f95fe5f62d3f8d58763509ad3d  gcc/fortran/trans.cc
  8a38c2ad1fcb6836d2f0f58ff2080f22  gcc/fortran/trans.h
--- 6184,6214 ----
  6e89e2e347d7f6e1576cbda0e958b5bd  gcc/fortran/misc.cc
  cc253aa18378a960466507b449eb64b6  gcc/fortran/module.cc
  8da1b859b4dc259b551a9531ad3eaa9f  gcc/fortran/openmp.cc
! 2ac54dd304f0494202ed99c637998d1d  gcc/fortran/options.cc
  44ee980cc04645c25872621b20fc36fa  gcc/fortran/parse.cc
  c1b40e866a8bbe611aa65278fe2508d3  gcc/fortran/parse.h
! 1195268dd6bafe6c8398be7d7f3903b3  gcc/fortran/primary.cc
! 759b86ece024d31144f0fc291f135f0d  gcc/fortran/resolve.cc
  8dc2391850ee95634781b6e296a096f6  gcc/fortran/scanner.cc
  3c39e0eef946c7f557ac375f23b9f3db  gcc/fortran/scanner.h
  71190056d6f36d3d43d4b6ed27f23032  gcc/fortran/simplify.cc
! ebfc538fb0470443c527273e8a50c2a1  gcc/fortran/st.cc
  7fc6fb7f159830fc0d98a9cd72e5cdf9  gcc/fortran/symbol.cc
  c9238712914e77b971fde08221a31bf7  gcc/fortran/target-memory.cc
  50451f5a575ab606948f8e72d8cc4721  gcc/fortran/target-memory.h
! 27fbaa6ecc9d498ac188da6586c2cb1b  gcc/fortran/trans-array.cc
  682d93b7e921d709d88b7e5219a69d53  gcc/fortran/trans-array.h
  dfe1e1950e068389ed73663e9a11ad88  gcc/fortran/trans-common.cc
  d555f911945a83db335013815934e941  gcc/fortran/trans-const.cc
  857805820c2a6ac77d2652c610d23de8  gcc/fortran/trans-const.h
! 75bc600054a869660190e6e454119734  gcc/fortran/trans-decl.cc
! f794cc4abf2da4754b43e56a62948d9a  gcc/fortran/trans-expr.cc
  75dbdc3d489814fc18082a069cd7c3ab  gcc/fortran/trans-intrinsic.cc
  4a091b0b546257101e406582ece724f7  gcc/fortran/trans-io.cc
  27df041e4caff610df844e7a22e291e3  gcc/fortran/trans-openmp.cc
  ef3436c60285865c7e4a611b65ebca7d  gcc/fortran/trans-stmt.cc
  9caf8a2f93e6cf5e2a567a3aa18f957c  gcc/fortran/trans-stmt.h
! 0b405184ad3e56a1925640ad482c036e  gcc/fortran/trans-types.cc
  422959ab20fd75df3766a03597227fd2  gcc/fortran/trans-types.h
  47d7a4f95fe5f62d3f8d58763509ad3d  gcc/fortran/trans.cc
  8a38c2ad1fcb6836d2f0f58ff2080f22  gcc/fortran/trans.h
*************** ed9c9a9b8efbcca1621cb38f6a7f739b  gcc/gi
*** 6371,6377 ****
  dfd0fd15cae5add54db799ed747559ef  gcc/gimple.h
  69057cf60d71bd04ced5e457138629e1  gcc/gimplify-me.cc
  84814cb09300f3db388dd0d22133ccb4  gcc/gimplify-me.h
! a1212b203cedafb0d909405d2e5ab550  gcc/gimplify.cc
  08a911f7f8b65840f9b57e0e76a2061c  gcc/gimplify.h
  ba3039c0ed9645080c52c0d4bc46096f  gcc/gimplify_reg_info.h
  7df17d7c2bcdff0a474d633a02195544  gcc/ginclude/float.h
--- 6370,6376 ----
  dfd0fd15cae5add54db799ed747559ef  gcc/gimple.h
  69057cf60d71bd04ced5e457138629e1  gcc/gimplify-me.cc
  84814cb09300f3db388dd0d22133ccb4  gcc/gimplify-me.h
! 44250f50044d525a4039d2899bccb0db  gcc/gimplify.cc
  08a911f7f8b65840f9b57e0e76a2061c  gcc/gimplify.h
  ba3039c0ed9645080c52c0d4bc46096f  gcc/gimplify_reg_info.h
  7df17d7c2bcdff0a474d633a02195544  gcc/ginclude/float.h
*************** f380ce65b15eedb6d55a9848beb1ec3b  gcc/in
*** 6502,6509 ****
  a82ca6f10995888441918acc568477fc  gcc/incpath.cc
  078efe9e89bf7fcd6a66cd085de2d676  gcc/incpath.h
  9d517f2c2919033bb8c4d62108dd6973  gcc/init-regs.cc
! ed81054ca33b28b1e20c8ccfb921eb10  gcc/input.cc
! 846f20b3f20d9b8d41c137612dbdd8dc  gcc/input.h
  0dc4e5a1c70a5b34153b06594dd3ae85  gcc/insn-addr.h
  eec072fb4c8277a3634cf4cdc0846598  gcc/insn-notes.def
  769443add1b7187045688cd8b1129647  gcc/int-vector-builder.h
--- 6501,6508 ----
  a82ca6f10995888441918acc568477fc  gcc/incpath.cc
  078efe9e89bf7fcd6a66cd085de2d676  gcc/incpath.h
  9d517f2c2919033bb8c4d62108dd6973  gcc/init-regs.cc
! 9783d3cd8dccab8f0649e24643a8c912  gcc/input.cc
! f875de05790ff6f9d4a538f3165a775b  gcc/input.h
  0dc4e5a1c70a5b34153b06594dd3ae85  gcc/insn-addr.h
  eec072fb4c8277a3634cf4cdc0846598  gcc/insn-notes.def
  769443add1b7187045688cd8b1129647  gcc/int-vector-builder.h
*************** eec072fb4c8277a3634cf4cdc0846598  gcc/in
*** 6513,6522 ****
  bcb802c64e78f80e8e46c799c7e449ad  gcc/intl.cc
  deb111e00b2b07aa631595045bce5003  gcc/intl.h
  47a65e558aff89879902e88b055c7b12  gcc/ipa-comdats.cc
! 68fc102e7d4955f7b57d1852ba057623  gcc/ipa-cp.cc
  b65413c6163d502dbe95a08ac40cb575  gcc/ipa-cp.h
! fa8e311233ba00f5613461330b7f36ea  gcc/ipa-devirt.cc
! 0d19d962769ce2edd1bcfb39cf14e9b2  gcc/ipa-fnsummary.cc
  fef6f27045737cc29ebf2dbbd22dda02  gcc/ipa-fnsummary.h
  a3882f8a9c03be47eb0deee0bd27e04d  gcc/ipa-free-lang-data.cc
  151286d02b3d36dcca2a63fe6ae51102  gcc/ipa-icf-gimple.cc
--- 6512,6521 ----
  bcb802c64e78f80e8e46c799c7e449ad  gcc/intl.cc
  deb111e00b2b07aa631595045bce5003  gcc/intl.h
  47a65e558aff89879902e88b055c7b12  gcc/ipa-comdats.cc
! 4e41bf538f5d853048a656f7d8d98e1b  gcc/ipa-cp.cc
  b65413c6163d502dbe95a08ac40cb575  gcc/ipa-cp.h
! 273f5e1e33117606bfaa57f2e2899b15  gcc/ipa-devirt.cc
! c0759314923df2564166a8b18ecf04c9  gcc/ipa-fnsummary.cc
  fef6f27045737cc29ebf2dbbd22dda02  gcc/ipa-fnsummary.h
  a3882f8a9c03be47eb0deee0bd27e04d  gcc/ipa-free-lang-data.cc
  151286d02b3d36dcca2a63fe6ae51102  gcc/ipa-icf-gimple.cc
*************** a3882f8a9c03be47eb0deee0bd27e04d  gcc/ip
*** 6524,6532 ****
  005f3683b94c9cf2ef95442dcaaa8771  gcc/ipa-icf.cc
  b2ecb607534e24bdc2bc2e02ba2199ca  gcc/ipa-icf.h
  afa2616e2d58a9137deaabc102d2d7c1  gcc/ipa-inline-analysis.cc
! e54b675ad60e4f46eb3ffffe84bf02ef  gcc/ipa-inline-transform.cc
! fa62e663ddc6e2e79719855e68de5a10  gcc/ipa-inline.cc
! 229bac80ef5400801cf4edfd97790ef8  gcc/ipa-inline.h
  19c0cbbd70e071bd63dbb0527d02423e  gcc/ipa-locality-cloning.cc
  e1e331896b86db8a2281657bbb21ac72  gcc/ipa-locality-cloning.h
  5146e44af36aa042f1e1098a4e796065  gcc/ipa-modref-tree.cc
--- 6523,6531 ----
  005f3683b94c9cf2ef95442dcaaa8771  gcc/ipa-icf.cc
  b2ecb607534e24bdc2bc2e02ba2199ca  gcc/ipa-icf.h
  afa2616e2d58a9137deaabc102d2d7c1  gcc/ipa-inline-analysis.cc
! a79036274de725418d7c352e3952e330  gcc/ipa-inline-transform.cc
! caa91df42c4fb576674e003d61929c7e  gcc/ipa-inline.cc
! a8bc23feef2d2f8a3d25702ece427f87  gcc/ipa-inline.h
  19c0cbbd70e071bd63dbb0527d02423e  gcc/ipa-locality-cloning.cc
  e1e331896b86db8a2281657bbb21ac72  gcc/ipa-locality-cloning.h
  5146e44af36aa042f1e1098a4e796065  gcc/ipa-modref-tree.cc
*************** d57cb77872c8989b131d3c2c14a685db  gcc/ir
*** 6561,6567 ****
  ed94ab1f6976f64c8d20b7b65da14438  gcc/ira-emit.cc
  43cca7ef68de29884afbceb8e3fa19bb  gcc/ira-int.h
  947f563def1cc07c1f6d1def7fbdf142  gcc/ira-lives.cc
! c199b1c0b9259e2411da29e6ad6f1ba5  gcc/ira.cc
  e02a7a08ca9acaac686d9cb897ac121b  gcc/ira.h
  101bad313081e351312c8d42e0b24b31  gcc/is-a.h
  4e832d29f0e621d177da3fa9c3e11b69  gcc/iterator-utils.h
--- 6560,6566 ----
  ed94ab1f6976f64c8d20b7b65da14438  gcc/ira-emit.cc
  43cca7ef68de29884afbceb8e3fa19bb  gcc/ira-int.h
  947f563def1cc07c1f6d1def7fbdf142  gcc/ira-lives.cc
! 971519df5c9d92b6892e0f4a1b6bc6a1  gcc/ira.cc
  e02a7a08ca9acaac686d9cb897ac121b  gcc/ira.h
  101bad313081e351312c8d42e0b24b31  gcc/is-a.h
  4e832d29f0e621d177da3fa9c3e11b69  gcc/iterator-utils.h
*************** bdf8ae675ae5000d854fe2874116b2f8  gcc/lc
*** 6668,6674 ****
  027270d0be504f25a7efb49e1e3179bb  gcc/libfuncs.h
  4e1a358f06cfcd4fd7934618b4e0269f  gcc/libgdiagnostics++.h
  a6416f2352ff08b056cfe7e686e72530  gcc/libgdiagnostics-private.h
! 795ddae14ab30f1af0f4d2dfd154367d  gcc/libgdiagnostics.cc
  9a7e8185546f10794b5df84097aab2d1  gcc/libgdiagnostics.h
  5782c76c63f9b197be394bad361b8824  gcc/libgdiagnostics.map
  c9172b932523f381ffa415f3e81f4517  gcc/libsarifreplay.cc
--- 6667,6673 ----
  027270d0be504f25a7efb49e1e3179bb  gcc/libfuncs.h
  4e1a358f06cfcd4fd7934618b4e0269f  gcc/libgdiagnostics++.h
  a6416f2352ff08b056cfe7e686e72530  gcc/libgdiagnostics-private.h
! df6ad90b823dccc3a5c9b6349504cdbe  gcc/libgdiagnostics.cc
  9a7e8185546f10794b5df84097aab2d1  gcc/libgdiagnostics.h
  5782c76c63f9b197be394bad361b8824  gcc/libgdiagnostics.map
  c9172b932523f381ffa415f3e81f4517  gcc/libsarifreplay.cc
*************** e44c0bf9cc0411d7bd57c6585eb6d0e4  gcc/lt
*** 6735,6743 ****
  b417a4bd52371186803e70c49d24764d  gcc/m2/COPYING.RUNTIME
  8f0e2cd40e05189ec81232da84bd6e1a  gcc/m2/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/m2/COPYING3.LIB
! a3d873f9c06aeff54adaead284c1ea4a  gcc/m2/ChangeLog
! 33352ea845a8d2399793299f3e58a218  gcc/m2/Make-lang.in
! 93fe99bf456561cd217f1c93d2ab7da7  gcc/m2/Make-maintainer.in
  6a74129fda00ca52ba9f953538250c45  gcc/m2/NEWS
  3e6a5f14d741382ac3cffb2b6c8d2ce8  gcc/m2/README
  5a6a545a6ba92d36f6f0fa68298c4d7d  gcc/m2/config-lang.in
--- 6734,6742 ----
  b417a4bd52371186803e70c49d24764d  gcc/m2/COPYING.RUNTIME
  8f0e2cd40e05189ec81232da84bd6e1a  gcc/m2/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/m2/COPYING3.LIB
! 3a5ac3ea31ec756db14e4f094a8a6c5d  gcc/m2/ChangeLog
! 1d2d898532b0cf3b1ff9cd13a86f1e39  gcc/m2/Make-lang.in
! e212443a3231afc28440b22d94debe50  gcc/m2/Make-maintainer.in
  6a74129fda00ca52ba9f953538250c45  gcc/m2/NEWS
  3e6a5f14d741382ac3cffb2b6c8d2ce8  gcc/m2/README
  5a6a545a6ba92d36f6f0fa68298c4d7d  gcc/m2/config-lang.in
*************** a3d873f9c06aeff54adaead284c1ea4a  gcc/m2
*** 6748,6763 ****
  a020b7778724f9773472fbcdc64655c8  gcc/m2/gm2-compiler/CLexBuf.mod
  3b18929eb617dd115d0bb031711cf434  gcc/m2/gm2-compiler/DynamicPath.def
  13da0e3bfbfc4188112578674de7c3de  gcc/m2/gm2-compiler/DynamicPath.mod
! c3a4ba7134ff2dc36867c352458ad71f  gcc/m2/gm2-compiler/FifoQueue.def
! 6535bd9d78c49e773720cb2167e19cfe  gcc/m2/gm2-compiler/FifoQueue.mod
  64ee122c86e7cb39e1153284889e897f  gcc/m2/gm2-compiler/Lists.def
  b7e8471a0cbebdd6e14d9f090a2f681b  gcc/m2/gm2-compiler/Lists.mod
! 10f4c25426ceaa9804ca951e73b86e8d  gcc/m2/gm2-compiler/M2ALU.def
! 54035683070a509c7d1ce3b706faa628  gcc/m2/gm2-compiler/M2ALU.mod
  15c2e59090e5a9c43f3ba333a4d5edc6  gcc/m2/gm2-compiler/M2AsmUtil.def
  157cc69bdf9669f8dea26fe0d28d99ce  gcc/m2/gm2-compiler/M2AsmUtil.mod
  5662d7b23634f353723a5b2b9ad61ae1  gcc/m2/gm2-compiler/M2Base.def
! 34739c14d3ee7cf7c08286a9a0022a49  gcc/m2/gm2-compiler/M2Base.mod
  9bbe74980b3d3b1426ae58bcef5e737e  gcc/m2/gm2-compiler/M2BasicBlock.def
  17bc7901a3742e1d4b5106653c300103  gcc/m2/gm2-compiler/M2BasicBlock.mod
  39400c03b888a32af5ecb92265fbd08c  gcc/m2/gm2-compiler/M2Batch.def
--- 6747,6762 ----
  a020b7778724f9773472fbcdc64655c8  gcc/m2/gm2-compiler/CLexBuf.mod
  3b18929eb617dd115d0bb031711cf434  gcc/m2/gm2-compiler/DynamicPath.def
  13da0e3bfbfc4188112578674de7c3de  gcc/m2/gm2-compiler/DynamicPath.mod
! b4e73ff163e583eb283a480fcbc759fc  gcc/m2/gm2-compiler/FifoQueue.def
! 0fdde2d8181765119b6dbb6521dc2b06  gcc/m2/gm2-compiler/FifoQueue.mod
  64ee122c86e7cb39e1153284889e897f  gcc/m2/gm2-compiler/Lists.def
  b7e8471a0cbebdd6e14d9f090a2f681b  gcc/m2/gm2-compiler/Lists.mod
! 01d6bbc3d6e795097ffb673b5fa56f9c  gcc/m2/gm2-compiler/M2ALU.def
! 8732f6313fccc4b2a3bd58148c6c0568  gcc/m2/gm2-compiler/M2ALU.mod
  15c2e59090e5a9c43f3ba333a4d5edc6  gcc/m2/gm2-compiler/M2AsmUtil.def
  157cc69bdf9669f8dea26fe0d28d99ce  gcc/m2/gm2-compiler/M2AsmUtil.mod
  5662d7b23634f353723a5b2b9ad61ae1  gcc/m2/gm2-compiler/M2Base.def
! 98462038a44c6b6102320cb4d290aa77  gcc/m2/gm2-compiler/M2Base.mod
  9bbe74980b3d3b1426ae58bcef5e737e  gcc/m2/gm2-compiler/M2BasicBlock.def
  17bc7901a3742e1d4b5106653c300103  gcc/m2/gm2-compiler/M2BasicBlock.mod
  39400c03b888a32af5ecb92265fbd08c  gcc/m2/gm2-compiler/M2Batch.def
*************** b7e8471a0cbebdd6e14d9f090a2f681b  gcc/m2
*** 6765,6779 ****
  dec6f2aff29cb5fe1427242c7c5e9bd7  gcc/m2/gm2-compiler/M2Bitset.def
  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
  01a6ecec3ac51d7fcc8112d095cfd2b2  gcc/m2/gm2-compiler/M2ColorString.mod
  28e32ddcae091f46980874f0523fa028  gcc/m2/gm2-compiler/M2Comp.def
! 12e002fd4ea56637ab5c5b7d10da694a  gcc/m2/gm2-compiler/M2Comp.mod
  fb9e43e1f35780216ba6b6e360c0e264  gcc/m2/gm2-compiler/M2Const.def
  d48c136acab402fd877d833ead85eb2c  gcc/m2/gm2-compiler/M2Const.mod
  feb013504143369554b5acc90feea3b6  gcc/m2/gm2-compiler/M2Debug.def
--- 6764,6778 ----
  dec6f2aff29cb5fe1427242c7c5e9bd7  gcc/m2/gm2-compiler/M2Bitset.def
  4fd8de25a94ebe3d7dc535d77d35bcf1  gcc/m2/gm2-compiler/M2Bitset.mod
  d4b939b5e1e8ebd5bbfd57a171da0768  gcc/m2/gm2-compiler/M2CaseList.def
! d909ebca1c78b11d3c55468686f7dcea  gcc/m2/gm2-compiler/M2CaseList.mod
  e77e63c641c7e1cd6a919ca2565d5a53  gcc/m2/gm2-compiler/M2Check.def
! 38e3aebb38a1c301731879541e5c837a  gcc/m2/gm2-compiler/M2Check.mod
  478260474362f8756893377722538db4  gcc/m2/gm2-compiler/M2Code.def
! fb61dc2b9faf55fe1da94c60b08cc78b  gcc/m2/gm2-compiler/M2Code.mod
  7ec6d0e1d8778b77940a35fb413cc951  gcc/m2/gm2-compiler/M2ColorString.def
  01a6ecec3ac51d7fcc8112d095cfd2b2  gcc/m2/gm2-compiler/M2ColorString.mod
  28e32ddcae091f46980874f0523fa028  gcc/m2/gm2-compiler/M2Comp.def
! fa402f91b06a7bc055c7ab91c503d47e  gcc/m2/gm2-compiler/M2Comp.mod
  fb9e43e1f35780216ba6b6e360c0e264  gcc/m2/gm2-compiler/M2Const.def
  d48c136acab402fd877d833ead85eb2c  gcc/m2/gm2-compiler/M2Const.mod
  feb013504143369554b5acc90feea3b6  gcc/m2/gm2-compiler/M2Debug.def
*************** f2f6ad340399124ac1dd7765e1b675a5  gcc/m2
*** 6792,6800 ****
  9ef5089ff86e26a81035ec039bdc6650  gcc/m2/gm2-compiler/M2FileName.def
  742f1dc44d1ac7917fcbaf8704bdb395  gcc/m2/gm2-compiler/M2FileName.mod
  b3c98d490dd50cdd4e4de316e0deca54  gcc/m2/gm2-compiler/M2GCCDeclare.def
! 5b42ae2b2bea2b053a252452ce4b57bd  gcc/m2/gm2-compiler/M2GCCDeclare.mod
  3d68446acff53fae7c5d6c425f0cf67e  gcc/m2/gm2-compiler/M2GenGCC.def
! 0d5478d65bbe420e4966264382c684e3  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
--- 6791,6799 ----
  9ef5089ff86e26a81035ec039bdc6650  gcc/m2/gm2-compiler/M2FileName.def
  742f1dc44d1ac7917fcbaf8704bdb395  gcc/m2/gm2-compiler/M2FileName.mod
  b3c98d490dd50cdd4e4de316e0deca54  gcc/m2/gm2-compiler/M2GCCDeclare.def
! e8046a3814c459524cf33280bc54d9c8  gcc/m2/gm2-compiler/M2GCCDeclare.mod
  3d68446acff53fae7c5d6c425f0cf67e  gcc/m2/gm2-compiler/M2GenGCC.def
! 441f4ce11c340f2dca0ccadf5181f118  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
*** 6803,6814 ****
  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
! d5fe10cebe9d9d283ec9fd8a1f255175  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
--- 6802,6813 ----
  0b2e870715b8c61c0f2f872a91124e0f  gcc/m2/gm2-compiler/M2Lex.mod
  a45ab5cf82c6f9afcaac634dd94f9e74  gcc/m2/gm2-compiler/M2LexBuf.def
  b112f4dc73573695c3456ad0128babea  gcc/m2/gm2-compiler/M2LexBuf.mod
! ebc348963369e8e9da5834ac81e9f37c  gcc/m2/gm2-compiler/M2MetaError.def
! 471f80d2806337bce560a0e5b591d018  gcc/m2/gm2-compiler/M2MetaError.mod
  30199ab614068ba2ade7649d91420d13  gcc/m2/gm2-compiler/M2Optimize.def
  6b138f381fa3bee219d0c362567bbcb0  gcc/m2/gm2-compiler/M2Optimize.mod
! e56f64013f646609999ce89ae8c3084d  gcc/m2/gm2-compiler/M2Options.def
! 94a07e3c70731156751f9204f8185b87  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
*** 6816,6832 ****
  5aae879fe93711ac462b3871f94cfdfb  gcc/m2/gm2-compiler/M2Printf.def
  2984233cca97a1078980faba9ae9c1c5  gcc/m2/gm2-compiler/M2Printf.mod
  1f3929030e3dde0bd645746be5c341d3  gcc/m2/gm2-compiler/M2Quads.def
! f4818e2ea724bb28639ec9b6d2b964af  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
! 03d8fa7713d124ca53935a813d945514  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
  571617df0c1f7e853f00799ca60d4cd0  gcc/m2/gm2-compiler/M2SSA.mod
  f3b3204e23ba358de564e393130544a1  gcc/m2/gm2-compiler/M2Scaffold.def
! efe5b17016dc6cf4b57d2bbfd813a4f8  gcc/m2/gm2-compiler/M2Scaffold.mod
  ddc0868c3d08b37d27f164abd55990e0  gcc/m2/gm2-compiler/M2Scope.def
  60c017ae360abf32dd56d5c5fde283ef  gcc/m2/gm2-compiler/M2Scope.mod
  836fdc04a6d95d458b60251caf74ce1a  gcc/m2/gm2-compiler/M2Search.def
--- 6815,6831 ----
  5aae879fe93711ac462b3871f94cfdfb  gcc/m2/gm2-compiler/M2Printf.def
  2984233cca97a1078980faba9ae9c1c5  gcc/m2/gm2-compiler/M2Printf.mod
  1f3929030e3dde0bd645746be5c341d3  gcc/m2/gm2-compiler/M2Quads.def
! 875f7300fe1576f3859b156859742197  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
! 160efd21dd026c6e09192e8d8c46e678  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
  571617df0c1f7e853f00799ca60d4cd0  gcc/m2/gm2-compiler/M2SSA.mod
  f3b3204e23ba358de564e393130544a1  gcc/m2/gm2-compiler/M2Scaffold.def
! 504aaee62e0731cc6d0039432d93ec49  gcc/m2/gm2-compiler/M2Scaffold.mod
  ddc0868c3d08b37d27f164abd55990e0  gcc/m2/gm2-compiler/M2Scope.def
  60c017ae360abf32dd56d5c5fde283ef  gcc/m2/gm2-compiler/M2Scope.mod
  836fdc04a6d95d458b60251caf74ce1a  gcc/m2/gm2-compiler/M2Search.def
*************** b5c25551d82c953920f3ac7590cf8f2f  gcc/m2
*** 6844,6855 ****
  5ba7d598cce0f234993c775fe9152a3d  gcc/m2/gm2-compiler/M2Swig.def
  096c079b7feb8e17ededaef3bc43ab8d  gcc/m2/gm2-compiler/M2Swig.mod
  e94ff16aed659065400b9e5347ec7d46  gcc/m2/gm2-compiler/M2SymInit.def
! ea4b4ae9d2ff9437228470ab8bdda761  gcc/m2/gm2-compiler/M2SymInit.mod
  57573d5d98a2ac1d761d648680e187e5  gcc/m2/gm2-compiler/M2System.def
! a492d30dcb9c55563fde8e6ddc9b0f23  gcc/m2/gm2-compiler/M2System.mod
  6e0ecd84cbf1155d00d35afd80fd104f  gcc/m2/gm2-compiler/M2Version.def
  e4896d3d06dc2ebb3daf2e17603d8f40  gcc/m2/gm2-compiler/NameKey.def
! f2fd854755d8977e38b8d1a87be9cb6e  gcc/m2/gm2-compiler/NameKey.mod
  074aa285886cb5e0d0116dcfd71ba9cf  gcc/m2/gm2-compiler/ObjectFiles.def
  37147b5f1f916db1e737376d3498d472  gcc/m2/gm2-compiler/ObjectFiles.mod
  e985f17d1fb35f0c8a1204f78240c6f3  gcc/m2/gm2-compiler/Output.def
--- 6843,6854 ----
  5ba7d598cce0f234993c775fe9152a3d  gcc/m2/gm2-compiler/M2Swig.def
  096c079b7feb8e17ededaef3bc43ab8d  gcc/m2/gm2-compiler/M2Swig.mod
  e94ff16aed659065400b9e5347ec7d46  gcc/m2/gm2-compiler/M2SymInit.def
! 533fcec339cc4edfcf96cbb7e26ee736  gcc/m2/gm2-compiler/M2SymInit.mod
  57573d5d98a2ac1d761d648680e187e5  gcc/m2/gm2-compiler/M2System.def
! 89a012432d8d0776ab23a15316a98c75  gcc/m2/gm2-compiler/M2System.mod
  6e0ecd84cbf1155d00d35afd80fd104f  gcc/m2/gm2-compiler/M2Version.def
  e4896d3d06dc2ebb3daf2e17603d8f40  gcc/m2/gm2-compiler/NameKey.def
! 2c7d8d2c376f68e4a297e6d68c34b573  gcc/m2/gm2-compiler/NameKey.mod
  074aa285886cb5e0d0116dcfd71ba9cf  gcc/m2/gm2-compiler/ObjectFiles.def
  37147b5f1f916db1e737376d3498d472  gcc/m2/gm2-compiler/ObjectFiles.mod
  e985f17d1fb35f0c8a1204f78240c6f3  gcc/m2/gm2-compiler/Output.def
*************** b347f8b97c2042773c008adffe4e54d9  gcc/m2
*** 6861,6872 ****
  602cc39ece2e20e647562bea41cf5716  gcc/m2/gm2-compiler/P1Build.bnf
  7f0d77f27044b69065c97e7e1f2f361b  gcc/m2/gm2-compiler/P1Build.def
  022dddb1d109a1c84112ee601cb7e4fb  gcc/m2/gm2-compiler/P1SymBuild.def
! a034245ef0e759dd251bf062c90dbfb4  gcc/m2/gm2-compiler/P1SymBuild.mod
  dfc36d5f0832b9dd188d6557ffef76d3  gcc/m2/gm2-compiler/P2Build.bnf
  5d3aa3c32f62966992c31b5bd6fe9bdb  gcc/m2/gm2-compiler/P2Build.def
  7d034c383eee29111871cfe944a77b96  gcc/m2/gm2-compiler/P2SymBuild.def
! 3285025d2e02a06a86ec2331253852e5  gcc/m2/gm2-compiler/P2SymBuild.mod
! 3fd9aa5301c284bb3b4ee2d6479b711b  gcc/m2/gm2-compiler/P3Build.bnf
  41f585d1e8e6fd1786dd36cb69cf3e82  gcc/m2/gm2-compiler/P3Build.def
  ad7a010b25f95dc012f12d3c97133a4b  gcc/m2/gm2-compiler/P3SymBuild.def
  565aff18ea212b1dd1543f9c271ad130  gcc/m2/gm2-compiler/P3SymBuild.mod
--- 6860,6871 ----
  602cc39ece2e20e647562bea41cf5716  gcc/m2/gm2-compiler/P1Build.bnf
  7f0d77f27044b69065c97e7e1f2f361b  gcc/m2/gm2-compiler/P1Build.def
  022dddb1d109a1c84112ee601cb7e4fb  gcc/m2/gm2-compiler/P1SymBuild.def
! 8a6a96a453036a590f7fd5c914348573  gcc/m2/gm2-compiler/P1SymBuild.mod
  dfc36d5f0832b9dd188d6557ffef76d3  gcc/m2/gm2-compiler/P2Build.bnf
  5d3aa3c32f62966992c31b5bd6fe9bdb  gcc/m2/gm2-compiler/P2Build.def
  7d034c383eee29111871cfe944a77b96  gcc/m2/gm2-compiler/P2SymBuild.def
! 04a2d71bb47728d6d5be1b94fd6e077d  gcc/m2/gm2-compiler/P2SymBuild.mod
! 39997dd917759eea08da83f06fbcc7bd  gcc/m2/gm2-compiler/P3Build.bnf
  41f585d1e8e6fd1786dd36cb69cf3e82  gcc/m2/gm2-compiler/P3Build.def
  ad7a010b25f95dc012f12d3c97133a4b  gcc/m2/gm2-compiler/P3SymBuild.def
  565aff18ea212b1dd1543f9c271ad130  gcc/m2/gm2-compiler/P3SymBuild.mod
*************** e00cf6ed8d0c099ab8f33394bfeb4dc3  gcc/m2
*** 6876,6892 ****
  7204921904868e8be413f561906f6f54  gcc/m2/gm2-compiler/PCSymBuild.mod
  08d1991abfb4f71b76010396a93251eb  gcc/m2/gm2-compiler/PHBuild.bnf
  08361e38dfa7f065be723afaa04d8986  gcc/m2/gm2-compiler/PHBuild.def
! b521bc37b844fd46fdfddcf3d2287f13  gcc/m2/gm2-compiler/PathName.def
! 42b1a8ddbcae6fe7dd1a0a999460907d  gcc/m2/gm2-compiler/PathName.mod
  db0fe572d275f12368c3037e218c3bd6  gcc/m2/gm2-compiler/README
  25e8be2bf0259c769f97264249be9eea  gcc/m2/gm2-compiler/Sets.def
  6a3f8623f341588f21b4af58e021ac04  gcc/m2/gm2-compiler/Sets.mod
  fabfc816f99fb184266e92ed4a85b7a4  gcc/m2/gm2-compiler/SymbolConversion.def
! 134ce3e4731c6306ad3c640bab2b256d  gcc/m2/gm2-compiler/SymbolConversion.mod
  7e7c5313b631435b03f974e72c20d104  gcc/m2/gm2-compiler/SymbolKey.def
  be245258e0123a45bbd9a47e859deb50  gcc/m2/gm2-compiler/SymbolKey.mod
! 74520973769eed309d975fde57dfd937  gcc/m2/gm2-compiler/SymbolTable.def
! 020a16ce4cfedb7743487867d50fff0b  gcc/m2/gm2-compiler/SymbolTable.mod
  4e5bbaec9cd1341e4e14b9951485e75b  gcc/m2/gm2-compiler/bnflex.def
  34956a3ca2f84a677fbf711642452563  gcc/m2/gm2-compiler/bnflex.mod
  3ba721399af75ed8db2b223d9947d26d  gcc/m2/gm2-compiler/cflex.def
--- 6875,6891 ----
  7204921904868e8be413f561906f6f54  gcc/m2/gm2-compiler/PCSymBuild.mod
  08d1991abfb4f71b76010396a93251eb  gcc/m2/gm2-compiler/PHBuild.bnf
  08361e38dfa7f065be723afaa04d8986  gcc/m2/gm2-compiler/PHBuild.def
! 82f1a9709e0dd5ebf7a0c1c23b8e95c9  gcc/m2/gm2-compiler/PathName.def
! c9d1c61a97c404c181f0a650b41c36aa  gcc/m2/gm2-compiler/PathName.mod
  db0fe572d275f12368c3037e218c3bd6  gcc/m2/gm2-compiler/README
  25e8be2bf0259c769f97264249be9eea  gcc/m2/gm2-compiler/Sets.def
  6a3f8623f341588f21b4af58e021ac04  gcc/m2/gm2-compiler/Sets.mod
  fabfc816f99fb184266e92ed4a85b7a4  gcc/m2/gm2-compiler/SymbolConversion.def
! eba1a056b41ce6fae1088f3d0bdd86d7  gcc/m2/gm2-compiler/SymbolConversion.mod
  7e7c5313b631435b03f974e72c20d104  gcc/m2/gm2-compiler/SymbolKey.def
  be245258e0123a45bbd9a47e859deb50  gcc/m2/gm2-compiler/SymbolKey.mod
! 3093cfac877731995344f1e96077c068  gcc/m2/gm2-compiler/SymbolTable.def
! 408566f43134d5b95c613217c8f55e8d  gcc/m2/gm2-compiler/SymbolTable.mod
  4e5bbaec9cd1341e4e14b9951485e75b  gcc/m2/gm2-compiler/bnflex.def
  34956a3ca2f84a677fbf711642452563  gcc/m2/gm2-compiler/bnflex.mod
  3ba721399af75ed8db2b223d9947d26d  gcc/m2/gm2-compiler/cflex.def
*************** b2e693809cf22c251676ff0c113ba9ce  gcc/m2
*** 6901,6914 ****
  96705d39e32fdbece43fa9709b8bd0fb  gcc/m2/gm2-gcc/dynamicstrings.h
  3d90da7ad1c376e087ba8db36a95c428  gcc/m2/gm2-gcc/gcc-consolidation.h
  b05bd43836e6e971c7709260655084d0  gcc/m2/gm2-gcc/gcctypes.def
! eccbf55f361081007d58ed797afb1a4f  gcc/m2/gm2-gcc/init.cc
  6c9d839118c580c09ddcbcf55281e7eb  gcc/m2/gm2-gcc/init.def
  583ccc19dfc146f1111089c52ee89f24  gcc/m2/gm2-gcc/init.h
  94b2b062626a7c105ae38e249e59847e  gcc/m2/gm2-gcc/m2assert.cc
  032d0a5d743cffc1b27457740d50d56f  gcc/m2/gm2-gcc/m2assert.h
! 9d106cc30391f5986f9a41de02e97525  gcc/m2/gm2-gcc/m2block.cc
! feb359721fb6257ba2bf35f3036eb912  gcc/m2/gm2-gcc/m2block.def
! 6546bdcb0f3fe4193c43f9aae400fe17  gcc/m2/gm2-gcc/m2block.h
  0abd581bbf48e46bf790eb67ffc47ad1  gcc/m2/gm2-gcc/m2builtins.cc
  e06b3bbf4040715ab6ee88cdd17886e4  gcc/m2/gm2-gcc/m2builtins.def
  a1d688331ef6553e581189d32227a73d  gcc/m2/gm2-gcc/m2builtins.h
--- 6900,6913 ----
  96705d39e32fdbece43fa9709b8bd0fb  gcc/m2/gm2-gcc/dynamicstrings.h
  3d90da7ad1c376e087ba8db36a95c428  gcc/m2/gm2-gcc/gcc-consolidation.h
  b05bd43836e6e971c7709260655084d0  gcc/m2/gm2-gcc/gcctypes.def
! 14db8d33a17f6465b40066fd26823896  gcc/m2/gm2-gcc/init.cc
  6c9d839118c580c09ddcbcf55281e7eb  gcc/m2/gm2-gcc/init.def
  583ccc19dfc146f1111089c52ee89f24  gcc/m2/gm2-gcc/init.h
  94b2b062626a7c105ae38e249e59847e  gcc/m2/gm2-gcc/m2assert.cc
  032d0a5d743cffc1b27457740d50d56f  gcc/m2/gm2-gcc/m2assert.h
! 7570c90b8f3cfe79f30dcff1b53499cc  gcc/m2/gm2-gcc/m2block.cc
! 7d481ef45bca5c1b1fa01d3e2f3a1f3a  gcc/m2/gm2-gcc/m2block.def
! dbb3db17fbbde8d2293f13ad12d21c67  gcc/m2/gm2-gcc/m2block.h
  0abd581bbf48e46bf790eb67ffc47ad1  gcc/m2/gm2-gcc/m2builtins.cc
  e06b3bbf4040715ab6ee88cdd17886e4  gcc/m2/gm2-gcc/m2builtins.def
  a1d688331ef6553e581189d32227a73d  gcc/m2/gm2-gcc/m2builtins.h
*************** ca132f6d8454bc4c690072b56a3d8eb8  gcc/m2
*** 6918,6935 ****
  796c2c893ce45917d2edf672f2dc8523  gcc/m2/gm2-gcc/m2configure.cc
  2feab10b78c0a7841eb842c0fbbfed1a  gcc/m2/gm2-gcc/m2configure.def
  c5ae2e41b6fbe3fcdcd53a5ebc3d7a9f  gcc/m2/gm2-gcc/m2configure.h
! a3dd26cf6a94adad64f1f803ea09e62b  gcc/m2/gm2-gcc/m2convert.cc
! 2a3286aa06ccfbf2dd96f48c6efdfae8  gcc/m2/gm2-gcc/m2convert.def
! 236aa0cb74c6bee7e69693f7ff219e7e  gcc/m2/gm2-gcc/m2convert.h
  80ba203b94d0ddd9c7c2b54a46bb5cd1  gcc/m2/gm2-gcc/m2decl.cc
  14f166819af5708bd04099ac2d6575aa  gcc/m2/gm2-gcc/m2decl.def
! be50dca26ad2e7d1d0ce66006ce715e0  gcc/m2/gm2-gcc/m2decl.h
  502aaa6727a66941d04fa4ebddc0701a  gcc/m2/gm2-gcc/m2except.cc
  fdd277779eb448b1f62c2f31d043a809  gcc/m2/gm2-gcc/m2except.def
  6548a13ae86ae8f48eac4044cec66f90  gcc/m2/gm2-gcc/m2except.h
! cb45da13a7101c6b9f63499a31c77142  gcc/m2/gm2-gcc/m2expr.cc
! d77ae5a027edcf4593595afe73be800b  gcc/m2/gm2-gcc/m2expr.def
! d3b9f0202b6a0cc04b90bd4efdd4471d  gcc/m2/gm2-gcc/m2expr.h
  3c3bbf0b28f81bc0a6bb40b29c511e8f  gcc/m2/gm2-gcc/m2langdump.h
  03afb6ebe067bff08fd4da75c78b5382  gcc/m2/gm2-gcc/m2linemap.cc
  bac8f292255c366257842d90edd29842  gcc/m2/gm2-gcc/m2linemap.def
--- 6917,6934 ----
  796c2c893ce45917d2edf672f2dc8523  gcc/m2/gm2-gcc/m2configure.cc
  2feab10b78c0a7841eb842c0fbbfed1a  gcc/m2/gm2-gcc/m2configure.def
  c5ae2e41b6fbe3fcdcd53a5ebc3d7a9f  gcc/m2/gm2-gcc/m2configure.h
! 0abc795e7e94d9cab08b5c399fc69929  gcc/m2/gm2-gcc/m2convert.cc
! 3488f64452181bf0582288fd9b49d2dc  gcc/m2/gm2-gcc/m2convert.def
! ffa3f369845d307adc2ca0e3d3c1528a  gcc/m2/gm2-gcc/m2convert.h
  80ba203b94d0ddd9c7c2b54a46bb5cd1  gcc/m2/gm2-gcc/m2decl.cc
  14f166819af5708bd04099ac2d6575aa  gcc/m2/gm2-gcc/m2decl.def
! 59c7be53a1f1d2cc5295ef554d6a1c1b  gcc/m2/gm2-gcc/m2decl.h
  502aaa6727a66941d04fa4ebddc0701a  gcc/m2/gm2-gcc/m2except.cc
  fdd277779eb448b1f62c2f31d043a809  gcc/m2/gm2-gcc/m2except.def
  6548a13ae86ae8f48eac4044cec66f90  gcc/m2/gm2-gcc/m2except.h
! 7ca91a44b007b686f2f26bada5603740  gcc/m2/gm2-gcc/m2expr.cc
! ed1e9ebd664d37a1a96a1d9eaeec862a  gcc/m2/gm2-gcc/m2expr.def
! 9235fee008649b280cfb5a3d65310718  gcc/m2/gm2-gcc/m2expr.h
  3c3bbf0b28f81bc0a6bb40b29c511e8f  gcc/m2/gm2-gcc/m2langdump.h
  03afb6ebe067bff08fd4da75c78b5382  gcc/m2/gm2-gcc/m2linemap.cc
  bac8f292255c366257842d90edd29842  gcc/m2/gm2-gcc/m2linemap.def
*************** fcea7fa814eb36ddef577d6be2c93e63  gcc/m2
*** 6937,6970 ****
  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
  4a9453d44aae46763c48dbf47f23fbaf  gcc/m2/gm2-gcc/m2range.h
  7cbbb73af9c93a479d4665a36639b5f4  gcc/m2/gm2-gcc/m2search.h
! 2c7c2a84e8f9548d9e0cb76c3db5bef9  gcc/m2/gm2-gcc/m2statement.cc
! 7b66ac97ca0b23e969cca6f19af0f520  gcc/m2/gm2-gcc/m2statement.def
! 60036052959e405e25c1d6a4a629dc78  gcc/m2/gm2-gcc/m2statement.h
  d60a887eea920dbaf1a072abd9674cad  gcc/m2/gm2-gcc/m2top.cc
  b58a24d63148afc393a9cfaf34739d5c  gcc/m2/gm2-gcc/m2top.def
  6a2f35c8d5bc2a38a779d7e9a221ed4a  gcc/m2/gm2-gcc/m2top.h
  5d626a891ceca8ad9d209e1e9fa59c28  gcc/m2/gm2-gcc/m2tree.cc
  1ae2c51d29fa8b3414a8e05ca27879c2  gcc/m2/gm2-gcc/m2tree.def
  fa235ac656c58414068acb39a450b98c  gcc/m2/gm2-gcc/m2tree.h
! 45e84cc4ad1206464eebf57d4e5e9b8f  gcc/m2/gm2-gcc/m2treelib.cc
! 916c4209d9f10f650ba7e6882a428d3a  gcc/m2/gm2-gcc/m2treelib.def
! 8784314930694945823670a2b4d7085d  gcc/m2/gm2-gcc/m2treelib.h
! bbeb8468025c6ed85f1eb7d99fd18660  gcc/m2/gm2-gcc/m2type.cc
! 651712327499570038a843c898f0f1c7  gcc/m2/gm2-gcc/m2type.def
! 7214f01ef0c4f2ea27236613dbb9349b  gcc/m2/gm2-gcc/m2type.h
  86657d918610ac339071aadeefa0b552  gcc/m2/gm2-gcc/rtegraph.cc
  65065f39d7a055627ba2d372c1e9cc07  gcc/m2/gm2-gcc/rtegraph.h
  b014a5a5babb9953d9f203bf4fd10046  gcc/m2/gm2-ici/M2Emit.mod
  d5db4a0704741e24958241fe74fd007c  gcc/m2/gm2-ici/README
  1a509083f6bbab06c5aa4fdf0bcdc613  gcc/m2/gm2-ici/m2linemap.c
  ef5415e8ad71dffb5daf39428970d577  gcc/m2/gm2-internals.texi
! b7dafe37eb90089645fb1cf9e35a6bbf  gcc/m2/gm2-lang.cc
  9584a98fba37e1f4209b1a26ca795ec0  gcc/m2/gm2-lang.h
  2b1d730bdeb600463475d3bb94f17f12  gcc/m2/gm2-libiberty/README
  2293cd11c3bafff5a1517363d39a0273  gcc/m2/gm2-libiberty/choosetemp.def
--- 6936,6969 ----
  5788cdee0acc63304e8a5005f050e8db  gcc/m2/gm2-gcc/m2misc.cc
  421b5a035afb6002ff2a6ea75f46fb8b  gcc/m2/gm2-gcc/m2misc.def
  d1b31285582b67ba97d01e8e43b1b2d6  gcc/m2/gm2-gcc/m2misc.h
! c08f3c4585fad3bff3a392742b9d33b6  gcc/m2/gm2-gcc/m2options.h
! f62749b9494c4c747dea1b04bfd12373  gcc/m2/gm2-gcc/m2pp.cc
  bb3433f39db6f3c3cfdf3511e76c67e0  gcc/m2/gm2-gcc/m2pp.def
  698b9ffff0556061b1385c89a3262733  gcc/m2/gm2-gcc/m2pp.h
  4a9453d44aae46763c48dbf47f23fbaf  gcc/m2/gm2-gcc/m2range.h
  7cbbb73af9c93a479d4665a36639b5f4  gcc/m2/gm2-gcc/m2search.h
! 65497a68f6bc5dc456271c6088631768  gcc/m2/gm2-gcc/m2statement.cc
! 41494d97516e4e88eeb05c3167d86581  gcc/m2/gm2-gcc/m2statement.def
! cc0b2a006a327db39ef1753f799bd453  gcc/m2/gm2-gcc/m2statement.h
  d60a887eea920dbaf1a072abd9674cad  gcc/m2/gm2-gcc/m2top.cc
  b58a24d63148afc393a9cfaf34739d5c  gcc/m2/gm2-gcc/m2top.def
  6a2f35c8d5bc2a38a779d7e9a221ed4a  gcc/m2/gm2-gcc/m2top.h
  5d626a891ceca8ad9d209e1e9fa59c28  gcc/m2/gm2-gcc/m2tree.cc
  1ae2c51d29fa8b3414a8e05ca27879c2  gcc/m2/gm2-gcc/m2tree.def
  fa235ac656c58414068acb39a450b98c  gcc/m2/gm2-gcc/m2tree.h
! 356f60dfdead075fe6cab5e5e2eac22c  gcc/m2/gm2-gcc/m2treelib.cc
! 17e90ff554936ce1aa95ca99d8fda68f  gcc/m2/gm2-gcc/m2treelib.def
! b4ba749f082e7d065b532edb288d7cf1  gcc/m2/gm2-gcc/m2treelib.h
! bc262cd3a4234442d001a2ad08bfa472  gcc/m2/gm2-gcc/m2type.cc
! ec7bc011340bdafcde9235882493b337  gcc/m2/gm2-gcc/m2type.def
! 0480b5e9ecf98df37a386a28b00e5e83  gcc/m2/gm2-gcc/m2type.h
  86657d918610ac339071aadeefa0b552  gcc/m2/gm2-gcc/rtegraph.cc
  65065f39d7a055627ba2d372c1e9cc07  gcc/m2/gm2-gcc/rtegraph.h
  b014a5a5babb9953d9f203bf4fd10046  gcc/m2/gm2-ici/M2Emit.mod
  d5db4a0704741e24958241fe74fd007c  gcc/m2/gm2-ici/README
  1a509083f6bbab06c5aa4fdf0bcdc613  gcc/m2/gm2-ici/m2linemap.c
  ef5415e8ad71dffb5daf39428970d577  gcc/m2/gm2-internals.texi
! 0c2391e7b28423811f96998273a425f9  gcc/m2/gm2-lang.cc
  9584a98fba37e1f4209b1a26ca795ec0  gcc/m2/gm2-lang.h
  2b1d730bdeb600463475d3bb94f17f12  gcc/m2/gm2-libiberty/README
  2293cd11c3bafff5a1517363d39a0273  gcc/m2/gm2-libiberty/choosetemp.def
*************** c0c8dd7d473a09a77344db839f53678e  gcc/m2
*** 6991,6998 ****
  1cd03001e9c637c2edb4d425c55585a9  gcc/m2/gm2-libs-coroutines/Executive.mod
  5aca4a7b0d66363223a7b1ec487a5edb  gcc/m2/gm2-libs-coroutines/KeyBoardLEDs.def
  90335f264a0daf055e1c3adf7688f27e  gcc/m2/gm2-libs-coroutines/README.texi
! 7dc332fc2439dd1a739a659391e8c02c  gcc/m2/gm2-libs-coroutines/SYSTEM.def
! 46fefff2e723c547af6a78f1864c491d  gcc/m2/gm2-libs-coroutines/SYSTEM.mod
  b25706de842413acdfe675be2e0627e4  gcc/m2/gm2-libs-coroutines/TimerHandler.def
  19c3d48c64d18c29b4aed096a30e6fb9  gcc/m2/gm2-libs-coroutines/TimerHandler.mod
  389f62af2918433359e5d632b9cfa7cb  gcc/m2/gm2-libs-iso/COROUTINES.def
--- 6990,6997 ----
  1cd03001e9c637c2edb4d425c55585a9  gcc/m2/gm2-libs-coroutines/Executive.mod
  5aca4a7b0d66363223a7b1ec487a5edb  gcc/m2/gm2-libs-coroutines/KeyBoardLEDs.def
  90335f264a0daf055e1c3adf7688f27e  gcc/m2/gm2-libs-coroutines/README.texi
! 62cbdfaa053086d395ae399960a8e7bf  gcc/m2/gm2-libs-coroutines/SYSTEM.def
! 69848b472e93a116f62c339b5c337d3e  gcc/m2/gm2-libs-coroutines/SYSTEM.mod
  b25706de842413acdfe675be2e0627e4  gcc/m2/gm2-libs-coroutines/TimerHandler.def
  19c3d48c64d18c29b4aed096a30e6fb9  gcc/m2/gm2-libs-coroutines/TimerHandler.mod
  389f62af2918433359e5d632b9cfa7cb  gcc/m2/gm2-libs-iso/COROUTINES.def
*************** d93a19cb9be26d9e390162cd1c65e6c0  gcc/m2
*** 7105,7112 ****
  ede8d6839e7701b3a97f79398c90a480  gcc/m2/gm2-libs-iso/STextIO.mod
  4806b44e4a85776e1d5015f2013974a3  gcc/m2/gm2-libs-iso/SWholeIO.def
  d77130cfcc51dcf9a5bb3f81378af542  gcc/m2/gm2-libs-iso/SWholeIO.mod
! f7403e44acd1f85bc5537c14efb61531  gcc/m2/gm2-libs-iso/SYSTEM.def
! a73cd434dee7ae7fc6fbcef01582faaa  gcc/m2/gm2-libs-iso/SYSTEM.mod
  cb047c38f5ef851681b19de3902ffebe  gcc/m2/gm2-libs-iso/Semaphores.def
  0d96e3c03b075c4173ab26f074d34329  gcc/m2/gm2-libs-iso/Semaphores.mod
  0123a3eb7dc065b38800f7157f415c27  gcc/m2/gm2-libs-iso/SeqFile.def
--- 7104,7111 ----
  ede8d6839e7701b3a97f79398c90a480  gcc/m2/gm2-libs-iso/STextIO.mod
  4806b44e4a85776e1d5015f2013974a3  gcc/m2/gm2-libs-iso/SWholeIO.def
  d77130cfcc51dcf9a5bb3f81378af542  gcc/m2/gm2-libs-iso/SWholeIO.mod
! cfb70636fc3cfd3998ac80b63a7cbfbf  gcc/m2/gm2-libs-iso/SYSTEM.def
! 609ed582e19f5e6ed10c4ff2ccb760f8  gcc/m2/gm2-libs-iso/SYSTEM.mod
  cb047c38f5ef851681b19de3902ffebe  gcc/m2/gm2-libs-iso/Semaphores.def
  0d96e3c03b075c4173ab26f074d34329  gcc/m2/gm2-libs-iso/Semaphores.mod
  0123a3eb7dc065b38800f7157f415c27  gcc/m2/gm2-libs-iso/SeqFile.def
*************** c7eadbee0c5ae61a47b11bbb7c04941d  gcc/m2
*** 7256,7265 ****
--- 7255,7268 ----
  2ea1fe7241596cbea1783a474b980ef5  gcc/m2/gm2-libs/LegacyReal.mod
  3d47773d0b2a2e842bc90ce1817ec304  gcc/m2/gm2-libs/M2Dependent.def
  3c65d10228392609f0596c9f655c18aa  gcc/m2/gm2-libs/M2Dependent.mod
+ 779f046fa6520d5c8538ca97de157fc4  gcc/m2/gm2-libs/M2Diagnostic.def
+ 379584cfb1ed57b4807ec72624c26df5  gcc/m2/gm2-libs/M2Diagnostic.mod
  503afc422ba450b5d8f2bdb4b84b9ada  gcc/m2/gm2-libs/M2EXCEPTION.def
  314fd76d36f9918545cd6932a994432f  gcc/m2/gm2-libs/M2EXCEPTION.mod
  8cd96743ee1f96df6f01c98df07854c3  gcc/m2/gm2-libs/M2RTS.def
  12f5ce990d5817b569dc48a1a3d2d37e  gcc/m2/gm2-libs/M2RTS.mod
+ d4af0ce660b5e42cf851208a294a1fcc  gcc/m2/gm2-libs/M2WIDESET.def
+ b8d50e77116af93b54febbe391cb3d2b  gcc/m2/gm2-libs/M2WIDESET.mod
  155b41f4ed2007e7f7eeb0df24463acf  gcc/m2/gm2-libs/MathLib0.def
  63e6da5131bf3d13607e44ee6bbc8d7f  gcc/m2/gm2-libs/MathLib0.mod
  1bbc3b5736417a1af5f0935364cf08dc  gcc/m2/gm2-libs/MemUtils.def
*************** f20062f975b85328d9e6b331594e25ef  gcc/m2
*** 7285,7292 ****
  333702071f6295fe11f5a10f9f46a356  gcc/m2/gm2-libs/SFIO.mod
  9222eb07c9f464434ed0f4b515cb19be  gcc/m2/gm2-libs/SMathLib0.def
  e17c6bf3bc3dafb2f4245566929a76c2  gcc/m2/gm2-libs/SMathLib0.mod
! 185045150fb7863ccda3dda3df51b72e  gcc/m2/gm2-libs/SYSTEM.def
! 7a8e4002bdc6fce55773724d3d989413  gcc/m2/gm2-libs/SYSTEM.mod
  f20650b19320893d5ef9860cc51d64f9  gcc/m2/gm2-libs/Scan.def
  48330a60372d20aff4b67c5b9ae732b5  gcc/m2/gm2-libs/Scan.mod
  9a211bc8a5255b102a6acf931a5df1f6  gcc/m2/gm2-libs/Selective.def
--- 7288,7295 ----
  333702071f6295fe11f5a10f9f46a356  gcc/m2/gm2-libs/SFIO.mod
  9222eb07c9f464434ed0f4b515cb19be  gcc/m2/gm2-libs/SMathLib0.def
  e17c6bf3bc3dafb2f4245566929a76c2  gcc/m2/gm2-libs/SMathLib0.mod
! a64443035f31136db809b6f592418b09  gcc/m2/gm2-libs/SYSTEM.def
! 2a9326c6d867d0cc691ac9e5b78acf3b  gcc/m2/gm2-libs/SYSTEM.mod
  f20650b19320893d5ef9860cc51d64f9  gcc/m2/gm2-libs/Scan.def
  48330a60372d20aff4b67c5b9ae732b5  gcc/m2/gm2-libs/Scan.mod
  9a211bc8a5255b102a6acf931a5df1f6  gcc/m2/gm2-libs/Selective.def
*************** f1d0448dddb0806234b4324974795511  gcc/m2
*** 7307,7314 ****
  cfb8769699afb47506e59253ad077e03  gcc/m2/gm2-libs/StringFileSysOp.def
  8885e0f3776e679ed8d88fbc864757ee  gcc/m2/gm2-libs/StringFileSysOp.mod
  3602d43cda7124c63c9282bf1c8e57ba  gcc/m2/gm2-libs/SysExceptions.def
! 324436308b22132f485cfe41190a5ffb  gcc/m2/gm2-libs/SysStorage.def
! bcf371a42b660b666ae976ce40ee34ff  gcc/m2/gm2-libs/SysStorage.mod
  7b3c4c714bad579ba1b51a215b54cfa0  gcc/m2/gm2-libs/TimeString.def
  8885f853332c8995cdf137651293c031  gcc/m2/gm2-libs/TimeString.mod
  37b7c2b1f7a27ea053fbd98131a55474  gcc/m2/gm2-libs/UnixArgs.def
--- 7310,7317 ----
  cfb8769699afb47506e59253ad077e03  gcc/m2/gm2-libs/StringFileSysOp.def
  8885e0f3776e679ed8d88fbc864757ee  gcc/m2/gm2-libs/StringFileSysOp.mod
  3602d43cda7124c63c9282bf1c8e57ba  gcc/m2/gm2-libs/SysExceptions.def
! f6bd4c81e6ab35456f8d21ddf56a07f7  gcc/m2/gm2-libs/SysStorage.def
! f6c2f1985a004c279724dc000ed79a35  gcc/m2/gm2-libs/SysStorage.mod
  7b3c4c714bad579ba1b51a215b54cfa0  gcc/m2/gm2-libs/TimeString.def
  8885f853332c8995cdf137651293c031  gcc/m2/gm2-libs/TimeString.mod
  37b7c2b1f7a27ea053fbd98131a55474  gcc/m2/gm2-libs/UnixArgs.def
*************** a1692c9bc067d2f97328c8558f5c7eb9  gcc/m2
*** 7336,7345 ****
  d41d8cd98f00b204e9800998ecf8427e  gcc/m2/images/gnupng
  d02bb7b852c2149c474702f929b72f2d  gcc/m2/init/README
  295651a10667b286ed55c3afdcb0e117  gcc/m2/init/mcinit
! 1926300919acbdbf55ed47c4997a459b  gcc/m2/init/ppginit
  0a585a032e28317a1dc67efc96504e1f  gcc/m2/lang-specs.h
! 891e5bbc3495a24fbe5645b1df57f735  gcc/m2/lang.opt
! b78b0219cda3cd36f38421786dc862e7  gcc/m2/lang.opt.urls
  36221d63a7a556b1dbbd7b2aa1ddd8fa  gcc/m2/m2-tree.def
  a93d546f180b351bb03d87a0bb03ef2f  gcc/m2/m2-tree.h
  2731299d727fa2c03f42276fc7e7c611  gcc/m2/m2.flex
--- 7339,7348 ----
  d41d8cd98f00b204e9800998ecf8427e  gcc/m2/images/gnupng
  d02bb7b852c2149c474702f929b72f2d  gcc/m2/init/README
  295651a10667b286ed55c3afdcb0e117  gcc/m2/init/mcinit
! 4f9ca67dfdb615548406065b7b773e3a  gcc/m2/init/ppginit
  0a585a032e28317a1dc67efc96504e1f  gcc/m2/lang-specs.h
! dcf5869197a10fda9b1ac85f1f98f881  gcc/m2/lang.opt
! 5707b1948d4ba0278b291a9d6a9b3228  gcc/m2/lang.opt.urls
  36221d63a7a556b1dbbd7b2aa1ddd8fa  gcc/m2/m2-tree.def
  a93d546f180b351bb03d87a0bb03ef2f  gcc/m2/m2-tree.h
  2731299d727fa2c03f42276fc7e7c611  gcc/m2/m2.flex
*************** a96f3a0976b710c6421697e1ba553869  gcc/m2
*** 7397,7402 ****
--- 7400,7407 ----
  2df8ca48729d075202f7f1332e7a0cf1  gcc/m2/mc-boot/GIndexing.h
  8bbe564693cbde25d0187f3bb6692221  gcc/m2/mc-boot/GM2Dependent.cc
  890eca42b5e6e05d345e9154dbdc0d7e  gcc/m2/mc-boot/GM2Dependent.h
+ 36ade1e3b1dfb445a9d04b3a86447cbf  gcc/m2/mc-boot/GM2Diagnostic.cc
+ a09ddba04d648387addaa414553c77c4  gcc/m2/mc-boot/GM2Diagnostic.h
  2c36041801539cd18aa25a20f3270ee6  gcc/m2/mc-boot/GM2EXCEPTION.cc
  c8c1f171186d8e862448780b2c03a858  gcc/m2/mc-boot/GM2EXCEPTION.h
  14556b7b4923159f273974be90e74eae  gcc/m2/mc-boot/GM2RTS.cc
*************** c059f1d31f724da54f6fc6c7ff944b6e  gcc/m2
*** 7600,7605 ****
--- 7605,7612 ----
  fbb13f2ac279bebe386406a7ebbafb69  gcc/m2/pge-boot/GLists.h
  0e695842adf21d3e0621eaa05654a6b0  gcc/m2/pge-boot/GM2Dependent.cc
  339bd203bb51260bd13c519f73926a5d  gcc/m2/pge-boot/GM2Dependent.h
+ d846a608f295082781f645a338a16322  gcc/m2/pge-boot/GM2Diagnostic.cc
+ a09ddba04d648387addaa414553c77c4  gcc/m2/pge-boot/GM2Diagnostic.h
  4f1a39d01d4b1bbb6b687f95b4b38640  gcc/m2/pge-boot/GM2EXCEPTION.cc
  6a254a34976c8e5d0daf1e556d6d82af  gcc/m2/pge-boot/GM2EXCEPTION.h
  f50ea4ecefa457813303d8034b317ebe  gcc/m2/pge-boot/GM2RTS.cc
*************** ce36f9ecae4871ea1857135a772dd02a  gcc/m2
*** 7623,7628 ****
--- 7630,7636 ----
  86062fb283d2d9c3968ad502bd6e106b  gcc/m2/pge-boot/GSYSTEM.h
  092f7718c3330133f781382e9c2b2ef4  gcc/m2/pge-boot/GScan.h
  0c8d6aa105970ed45c4f4bb7fa3c7cb6  gcc/m2/pge-boot/GSelective.cc
+ 3735699bb32353011caea008ebad9b00  gcc/m2/pge-boot/GSelective.h
  ee0c4194f7fc010987ae32fec7dfffde  gcc/m2/pge-boot/GStdIO.cc
  bda08699e9f6fb0bee9951454b376c84  gcc/m2/pge-boot/GStdIO.h
  117717d01eba9e88ec08a46df0e80a98  gcc/m2/pge-boot/GStorage.cc
*************** d753817814733e02838a51acf519e8b8  gcc/m2
*** 7633,7638 ****
--- 7641,7647 ----
  7166fe61cc6462ae6ce2a0302a9c6df7  gcc/m2/pge-boot/GStrIO.h
  e72114806cf57cf69a9b0d0070f0f09b  gcc/m2/pge-boot/GStrLib.cc
  3ec3c9caff49f22cdee701a26f182b97  gcc/m2/pge-boot/GStrLib.h
+ ac4a1a4792ccf45f30eabb2d2a780710  gcc/m2/pge-boot/GStringConvert.cc
  febf966e2780363e5a2bb2e7e3ffd056  gcc/m2/pge-boot/GStringConvert.h
  abb9fe18433f4b5ad5ced2c037f15f0f  gcc/m2/pge-boot/GSymbolKey.cc
  6f4fae48f624897bc8ab2b7ca122c418  gcc/m2/pge-boot/GSymbolKey.h
*************** a7f71bd9b880673b18abd6ab022331c1  gcc/m2
*** 7667,7673 ****
  902389cc4ad4ead857ab29bd1d973898  gcc/m2/pge-boot/Gwrapc.h
  32de17e5bdad997b43794d330fc5dae5  gcc/m2/pge-boot/README
  6556a4176b541bc229c47c196270f98d  gcc/m2/pge-boot/m2rts.h
! 8b33b15307e9ec5d5dc5f5ce40ae479b  gcc/m2/pge-boot/main.cc
  cfd0eda3744ba9d00f0c88d3762d7f06  gcc/m2/pge-boot/network.cc
  18840892def349c0982fbe40111d6a91  gcc/m2/plugin/README
  dd0625a7245e019bcefa8581aac88a27  gcc/m2/plugin/m2rte.cc
--- 7676,7682 ----
  902389cc4ad4ead857ab29bd1d973898  gcc/m2/pge-boot/Gwrapc.h
  32de17e5bdad997b43794d330fc5dae5  gcc/m2/pge-boot/README
  6556a4176b541bc229c47c196270f98d  gcc/m2/pge-boot/m2rts.h
! 6552ab047eb9d3a49e2ed9208645bde8  gcc/m2/pge-boot/main.cc
  cfd0eda3744ba9d00f0c88d3762d7f06  gcc/m2/pge-boot/network.cc
  18840892def349c0982fbe40111d6a91  gcc/m2/plugin/README
  dd0625a7245e019bcefa8581aac88a27  gcc/m2/plugin/m2rte.cc
*************** af715e0938ee1e3521e0d6aeb1546db9  gcc/m2
*** 7684,7697 ****
  edda010a61d6e29fa29a5ec2855d3c68  gcc/m2/tools-src/calcpath
  477b858262d906f76d6e8247f9bc01a9  gcc/m2/tools-src/checkmeta.py
  8181b673cf0b8b6ba6c61a342e9b1634  gcc/m2/tools-src/def2doc.py
! c68318dec81d9d0316a2b8481fea02b0  gcc/m2/tools-src/makeSystem
  d8c314554dde17baabdee11b802264b3  gcc/m2/tools-src/mklink.c
  ff4d04d0175889f5cc05d2c0c762fe57  gcc/m2/tools-src/tidydates.py
  f9608e9005487c369e6c38949ab36fa1  gcc/m2/version.c
  88e10618d6f39a411b34e2245b93307b  gcc/machmode.def
  550bdb35d0e034ca0050c574ba896d61  gcc/machmode.h
  486412acbbb6de10b080e31410a14f33  gcc/main.cc
! a161b307e52efe5b3b1bf0893389b736  gcc/match.pd
  63bf182c7c3a100e101b2129976be89b  gcc/mcf.cc
  795fbbc034a60f5af7e79dbe3bac65a0  gcc/mem-stats-traits.h
  295dcd7618653c13dcf063266752d06f  gcc/mem-stats.h
--- 7693,7706 ----
  edda010a61d6e29fa29a5ec2855d3c68  gcc/m2/tools-src/calcpath
  477b858262d906f76d6e8247f9bc01a9  gcc/m2/tools-src/checkmeta.py
  8181b673cf0b8b6ba6c61a342e9b1634  gcc/m2/tools-src/def2doc.py
! da37493f16a6de79f37af364ff23955f  gcc/m2/tools-src/makeSystem
  d8c314554dde17baabdee11b802264b3  gcc/m2/tools-src/mklink.c
  ff4d04d0175889f5cc05d2c0c762fe57  gcc/m2/tools-src/tidydates.py
  f9608e9005487c369e6c38949ab36fa1  gcc/m2/version.c
  88e10618d6f39a411b34e2245b93307b  gcc/machmode.def
  550bdb35d0e034ca0050c574ba896d61  gcc/machmode.h
  486412acbbb6de10b080e31410a14f33  gcc/main.cc
! e9a41c67e4ae6260d0e393d4f329ac98  gcc/match.pd
  63bf182c7c3a100e101b2129976be89b  gcc/mcf.cc
  795fbbc034a60f5af7e79dbe3bac65a0  gcc/mem-stats-traits.h
  295dcd7618653c13dcf063266752d06f  gcc/mem-stats.h
*************** c2186582925518f8871bcb0f066553f0  gcc/om
*** 7735,7743 ****
  bb29d43e983c44c073509e49c0c554db  gcc/omp-builtins.def
  084ac62e183b76a6936f7fbb0fd9482e  gcc/omp-expand.cc
  286190bcce78c62804516df6cd0d1684  gcc/omp-expand.h
! 9bd34ac7da102efa7529b0da01a4627e  gcc/omp-general.cc
  cb2a8c86939322e491658cba12c21c2f  gcc/omp-general.h
! 035f2acf7b5aa60b9db0b1a5f8993a9d  gcc/omp-low.cc
  73fb62acbdd74e28aff8cc147ee7fa11  gcc/omp-low.h
  bf774332919d8fc6ad76372ccefd0aa2  gcc/omp-oacc-kernels-decompose.cc
  51e7c46004876244d3f23ab786112c1a  gcc/omp-oacc-neuter-broadcast.cc
--- 7744,7752 ----
  bb29d43e983c44c073509e49c0c554db  gcc/omp-builtins.def
  084ac62e183b76a6936f7fbb0fd9482e  gcc/omp-expand.cc
  286190bcce78c62804516df6cd0d1684  gcc/omp-expand.h
! 3f32d99b1fca9c14c8a4a741125be1f0  gcc/omp-general.cc
  cb2a8c86939322e491658cba12c21c2f  gcc/omp-general.h
! e205d3298fff77e06b307fa9232647e7  gcc/omp-low.cc
  73fb62acbdd74e28aff8cc147ee7fa11  gcc/omp-low.h
  bf774332919d8fc6ad76372ccefd0aa2  gcc/omp-oacc-kernels-decompose.cc
  51e7c46004876244d3f23ab786112c1a  gcc/omp-oacc-neuter-broadcast.cc
*************** fccd951e3de91d49d3824e482c12e070  gcc/or
*** 7783,7789 ****
  673ce61076fa80e959fe72ae50291616  gcc/output.h
  c9e6163e1eaa8f82c57f03f76e86da75  gcc/pair-fusion.cc
  b2f692287d25760afcef126c010f7078  gcc/pair-fusion.h
! e292a0505627a3aad000d7932f50bcff  gcc/params.opt
  2cc794e23d80a8c9f057a7e402c65fb8  gcc/params.opt.urls
  818628b1b793b8f87f62d0c18fd1219a  gcc/pass_manager.h
  38b9f60b5fd192ab2d5c201b4aff3f29  gcc/passes.cc
--- 7792,7798 ----
  673ce61076fa80e959fe72ae50291616  gcc/output.h
  c9e6163e1eaa8f82c57f03f76e86da75  gcc/pair-fusion.cc
  b2f692287d25760afcef126c010f7078  gcc/pair-fusion.h
! a980acc6c0e992211a74f81526025c7e  gcc/params.opt
  2cc794e23d80a8c9f057a7e402c65fb8  gcc/params.opt.urls
  818628b1b793b8f87f62d0c18fd1219a  gcc/pass_manager.h
  38b9f60b5fd192ab2d5c201b4aff3f29  gcc/passes.cc
*************** b4f0c77852dde185d8745c16c0f82ac0  gcc/ru
*** 8430,8436 ****
  1157834f858df87f4cff12c780fe7030  gcc/sancov.cc
  f47b1babbf39168c2829bbc0997f6b9b  gcc/sanitizer.def
  1c4a31054492029cadf12999aee53d81  gcc/sanopt.cc
! 8aa1f45fafd5efda7a2a1b244fca6aaa  gcc/sarif-replay.cc
  a92419791c8e8d842c6ef029d4537463  gcc/sarif-spec-urls.def
  31050442ff986af301d1822bb48a2dc0  gcc/sbitmap.cc
  17496ea3285b5b8563702a8c44caa8bd  gcc/sbitmap.h
--- 8439,8445 ----
  1157834f858df87f4cff12c780fe7030  gcc/sancov.cc
  f47b1babbf39168c2829bbc0997f6b9b  gcc/sanitizer.def
  1c4a31054492029cadf12999aee53d81  gcc/sanopt.cc
! 78d2106a665ed01c45dd890d56e34254  gcc/sarif-replay.cc
  a92419791c8e8d842c6ef029d4537463  gcc/sarif-spec-urls.def
  31050442ff986af301d1822bb48a2dc0  gcc/sbitmap.cc
  17496ea3285b5b8563702a8c44caa8bd  gcc/sbitmap.h
*************** fdc04e5af7ee387dce07c6ba9a99eaa8  gcc/se
*** 8461,8467 ****
  50d9999185408bcae454174489317b68  gcc/signop.h
  97a13c24fa48c474198b5767f228fd93  gcc/simple-diagnostic-path.cc
  4daee3acc61f789d9c4c04a27a5bb351  gcc/simple-diagnostic-path.h
! 7de4628271d2c26afb48dc8f323dc60d  gcc/simplify-rtx.cc
  456e0937ae4b3a0f49fd44fb0d05eb52  gcc/sort.cc
  599fc125220850c86939202313a6f733  gcc/sparseset.cc
  430469e71b555502fe14de847bb52093  gcc/sparseset.h
--- 8470,8476 ----
  50d9999185408bcae454174489317b68  gcc/signop.h
  97a13c24fa48c474198b5767f228fd93  gcc/simple-diagnostic-path.cc
  4daee3acc61f789d9c4c04a27a5bb351  gcc/simple-diagnostic-path.h
! 5d38a321b4dcb7a1f5d91aa832eac333  gcc/simplify-rtx.cc
  456e0937ae4b3a0f49fd44fb0d05eb52  gcc/sort.cc
  599fc125220850c86939202313a6f733  gcc/sparseset.cc
  430469e71b555502fe14de847bb52093  gcc/sparseset.h
*************** b1497a03867668af210c32280876fdd7  gcc/sy
*** 8515,8521 ****
  36518341b4945aa5d165121235c9e14f  gcc/targhooks.cc
  f0958b8c3fce1fd760a502da6e954283  gcc/targhooks.h
  f39fcaa8197187283ccfed40107b426d  gcc/testsuite/.gitattributes
! 894401454de55ab436488bb19ee90d1a  gcc/testsuite/ChangeLog
  47e8e29b649ead73b8a1e4797da470ed  gcc/testsuite/ChangeLog-1993-2007
  35198a9e4fd31b935de8789faabf3351  gcc/testsuite/ChangeLog-2008
  0f19934540750356d1b91595cebfd9a8  gcc/testsuite/ChangeLog-2009
--- 8524,8530 ----
  36518341b4945aa5d165121235c9e14f  gcc/targhooks.cc
  f0958b8c3fce1fd760a502da6e954283  gcc/targhooks.h
  f39fcaa8197187283ccfed40107b426d  gcc/testsuite/.gitattributes
! 03fc1ff01fb8b882957f0be8c6db5258  gcc/testsuite/ChangeLog
  47e8e29b649ead73b8a1e4797da470ed  gcc/testsuite/ChangeLog-1993-2007
  35198a9e4fd31b935de8789faabf3351  gcc/testsuite/ChangeLog-2008
  0f19934540750356d1b91595cebfd9a8  gcc/testsuite/ChangeLog-2009
*************** a4e6ecf8eb5d90837d394182e0f66932  gcc/te
*** 21225,21237 ****
  193b3e5ec79d8a574b99f4e8d24f1371  gcc/testsuite/g++.dg/analyzer/pr96643.C
  81f94699d318a0dddde448db3be19c82  gcc/testsuite/g++.dg/analyzer/pr96723.C
  0e3d325deb7c52ea428d98b81934cc8f  gcc/testsuite/g++.dg/analyzer/pr96763.C
! 53b12a163fc148ccfa811ba18531ee17  gcc/testsuite/g++.dg/analyzer/pr97116.C
  fd2e08e4f10e3ceec481fed9289f968c  gcc/testsuite/g++.dg/analyzer/pr97489.C
  db2b7f6c1be40cc086aa678eb7d66cad  gcc/testsuite/g++.dg/analyzer/pr99064.C
  b693ff6f9735fca106feba8f26ea7569  gcc/testsuite/g++.dg/analyzer/state-diagram.C
  93a16b4e27481524ed286fec0ffd5b36  gcc/testsuite/g++.dg/analyzer/std-unexpected.C
! 987cfa86290bc36c48063e15a43ae459  gcc/testsuite/g++.dg/analyzer/unique_ptr-1.C
! 467b81263f3c9fb6ddf0a2fb9500917a  gcc/testsuite/g++.dg/analyzer/unique_ptr-2.C
  b355f66bf32fab6d4e4348cbfdd707d2  gcc/testsuite/g++.dg/analyzer/vfunc-1.C
  ae4362b6e0f5c4a5254b627bcef29e36  gcc/testsuite/g++.dg/analyzer/vfunc-2.C
  7af30611c97f31c197651cfc7de2bd24  gcc/testsuite/g++.dg/analyzer/vfunc-3.C
--- 21234,21246 ----
  193b3e5ec79d8a574b99f4e8d24f1371  gcc/testsuite/g++.dg/analyzer/pr96643.C
  81f94699d318a0dddde448db3be19c82  gcc/testsuite/g++.dg/analyzer/pr96723.C
  0e3d325deb7c52ea428d98b81934cc8f  gcc/testsuite/g++.dg/analyzer/pr96763.C
! 27831ce40552def22348f457a472d536  gcc/testsuite/g++.dg/analyzer/pr97116.C
  fd2e08e4f10e3ceec481fed9289f968c  gcc/testsuite/g++.dg/analyzer/pr97489.C
  db2b7f6c1be40cc086aa678eb7d66cad  gcc/testsuite/g++.dg/analyzer/pr99064.C
  b693ff6f9735fca106feba8f26ea7569  gcc/testsuite/g++.dg/analyzer/state-diagram.C
  93a16b4e27481524ed286fec0ffd5b36  gcc/testsuite/g++.dg/analyzer/std-unexpected.C
! 987cfa86290bc36c48063e15a43ae459  gcc/testsuite/g++.dg/analyzer/std-unique_ptr-1.C
! 467b81263f3c9fb6ddf0a2fb9500917a  gcc/testsuite/g++.dg/analyzer/std-unique_ptr-2.C
  b355f66bf32fab6d4e4348cbfdd707d2  gcc/testsuite/g++.dg/analyzer/vfunc-1.C
  ae4362b6e0f5c4a5254b627bcef29e36  gcc/testsuite/g++.dg/analyzer/vfunc-2.C
  7af30611c97f31c197651cfc7de2bd24  gcc/testsuite/g++.dg/analyzer/vfunc-3.C
*************** e44e5999e0fcf946fbaf4cc4247b99ae  gcc/te
*** 26873,26878 ****
--- 26882,26888 ----
  40f2c082ef41617a245e900009ecd2cf  gcc/testsuite/g++.dg/cpp23/static-operator-call5.C
  8b801aeeb85c01c051a33fa163907dc5  gcc/testsuite/g++.dg/cpp23/static-operator-call6.C
  72ea342064a8f8e14889eb8dd6c56d16  gcc/testsuite/g++.dg/cpp23/static-operator-call7.C
+ ee987e04d0a5b2d576fd49cbff4b9500  gcc/testsuite/g++.dg/cpp23/static-operator-call8.C
  36f6327df1a56ea4e9b05f09e62c676c  gcc/testsuite/g++.dg/cpp23/subscript1.C
  cc99147510a4c52615413a1c85c79b07  gcc/testsuite/g++.dg/cpp23/subscript10.C
  d685ca7f6c3f6496ec36569ed507b984  gcc/testsuite/g++.dg/cpp23/subscript11.C
*************** c3a9b6852b1f09d9ece1fdf2078d65c2  gcc/te
*** 26924,26929 ****
--- 26934,26941 ----
  8afcbabb4d5a71f6b965bf5cff4ebd59  gcc/testsuite/g++.dg/cpp26/constexpr-new3.C
  de9765a13f0dc8289ae4d66360d163f6  gcc/testsuite/g++.dg/cpp26/constexpr-new4.C
  4c3096115645eaf70a48e5be49b31002  gcc/testsuite/g++.dg/cpp26/constexpr-new5.C
+ 850d221b177aae68f687d87d71bdded1  gcc/testsuite/g++.dg/cpp26/constexpr-new6.C
+ d5defe962551642729cf537a32fc518b  gcc/testsuite/g++.dg/cpp26/constexpr-new6a.C
  354260f99fd60e96c277a56929f1d6e9  gcc/testsuite/g++.dg/cpp26/constexpr-virt-inherit1.C
  00668a798f242a6125673c04eb06a10e  gcc/testsuite/g++.dg/cpp26/constexpr-virt-inherit2.C
  9bbb24eae9cc5e4431f138520f489213  gcc/testsuite/g++.dg/cpp26/constexpr-virt-inherit3.C
*************** b48de652a269ba0411d9c971e6b06869  gcc/te
*** 27330,27335 ****
--- 27342,27348 ----
  966bf7435554a7a150aa0fb09697b04c  gcc/testsuite/g++.dg/cpp2a/concepts-placeholder11.C
  f57d40e8c8a062ab42228a604dc8b336  gcc/testsuite/g++.dg/cpp2a/concepts-placeholder12.C
  3d20f95d326918d497b3b309b9eda0d9  gcc/testsuite/g++.dg/cpp2a/concepts-placeholder13.C
+ 10165b900c5003d3691cd5cf5fae858b  gcc/testsuite/g++.dg/cpp2a/concepts-placeholder15.C
  9a1776b1d9b3c080e847b78507e8c1c6  gcc/testsuite/g++.dg/cpp2a/concepts-placeholder2.C
  d4ce4a5306e35eff2b78390b50d6c95b  gcc/testsuite/g++.dg/cpp2a/concepts-placeholder3.C
  e428d578c8a0c5a61ab85eddccb24071  gcc/testsuite/g++.dg/cpp2a/concepts-placeholder4.C
*************** bc9287a9c261c2c6a397e45407917a6d  gcc/te
*** 27627,27633 ****
  ae0f76ab894a07c21bf120374821b277  gcc/testsuite/g++.dg/cpp2a/constexpr-117504a.C
  6fb81533c7cb2d55e9a6e69ad7c13dd2  gcc/testsuite/g++.dg/cpp2a/constexpr-117775.C
  7185f762a196f2a6d81aa713399d33e1  gcc/testsuite/g++.dg/cpp2a/constexpr-86769.C
! 5e488850397c427d79cc8ca55254462f  gcc/testsuite/g++.dg/cpp2a/constexpr-98122.C
  d28d3e5520803aa70919b2a4b20e6386  gcc/testsuite/g++.dg/cpp2a/constexpr-99287.C
  2004a926e55a105d0f80db50528a9def  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor1.C
  cbf5d5a37bc2a85bde738f9433003a39  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor10.C
--- 27640,27646 ----
  ae0f76ab894a07c21bf120374821b277  gcc/testsuite/g++.dg/cpp2a/constexpr-117504a.C
  6fb81533c7cb2d55e9a6e69ad7c13dd2  gcc/testsuite/g++.dg/cpp2a/constexpr-117775.C
  7185f762a196f2a6d81aa713399d33e1  gcc/testsuite/g++.dg/cpp2a/constexpr-86769.C
! 09d800b77efc4efc11ef0609106774dc  gcc/testsuite/g++.dg/cpp2a/constexpr-98122.C
  d28d3e5520803aa70919b2a4b20e6386  gcc/testsuite/g++.dg/cpp2a/constexpr-99287.C
  2004a926e55a105d0f80db50528a9def  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor1.C
  cbf5d5a37bc2a85bde738f9433003a39  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor10.C
*************** a8cfc657234f5f421b289d2fa6196965  gcc/te
*** 30475,30480 ****
--- 30488,30494 ----
  ed2fe9b487c91fe33d6cccf142fa243c  gcc/testsuite/g++.dg/gomp/pr111274.C
  26a3372fea4c1feb18b0081e1b3f169f  gcc/testsuite/g++.dg/gomp/pr118876.C
  d03592521d487e264b0b5e3ef6f3dfb8  gcc/testsuite/g++.dg/gomp/pr119370.C
+ 996def323ebaae8304a543404625c64a  gcc/testsuite/g++.dg/gomp/pr121977.C
  539bba6df5330b7a6631eca5665a0899  gcc/testsuite/g++.dg/gomp/pr24849.C
  78ea34fd7a1a2767f61a703271e7070a  gcc/testsuite/g++.dg/gomp/pr25874.C
  93a85a09acfdf011a86ff95fc9184a94  gcc/testsuite/g++.dg/gomp/pr25996.C
*************** b8f980c062ec4b3f73dffbda8276ec70  gcc/te
*** 31088,31094 ****
  aa579892dca36d8b110a8b13f1664a4a  gcc/testsuite/g++.dg/init/pr20039.C
  769411a1c7958778a3d38ee85b470169  gcc/testsuite/g++.dg/init/pr25811-3.C
  677f7b38b3959f7edf25e66789e0a86a  gcc/testsuite/g++.dg/init/pr25811-4.C
! e37e39bdf9e1b0a5812d4dce3aa161b9  gcc/testsuite/g++.dg/init/pr25811.C
  85782d5ef8b1f167eda4d2f6167a8f03  gcc/testsuite/g++.dg/init/pr29043.C
  8ec941f80b1661f99f6cd682d5d469dc  gcc/testsuite/g++.dg/init/pr29571.C
  e6aa309a87de688020673480763c4211  gcc/testsuite/g++.dg/init/pr35878_1.C
--- 31102,31108 ----
  aa579892dca36d8b110a8b13f1664a4a  gcc/testsuite/g++.dg/init/pr20039.C
  769411a1c7958778a3d38ee85b470169  gcc/testsuite/g++.dg/init/pr25811-3.C
  677f7b38b3959f7edf25e66789e0a86a  gcc/testsuite/g++.dg/init/pr25811-4.C
! b16f434e40791ffa8cb8791c621a89dd  gcc/testsuite/g++.dg/init/pr25811.C
  85782d5ef8b1f167eda4d2f6167a8f03  gcc/testsuite/g++.dg/init/pr29043.C
  8ec941f80b1661f99f6cd682d5d469dc  gcc/testsuite/g++.dg/init/pr29571.C
  e6aa309a87de688020673480763c4211  gcc/testsuite/g++.dg/init/pr35878_1.C
*************** a3ef5649648039007c89bf5cb9fe814b  gcc/te
*** 31208,31214 ****
  6dcf4578bc9c92f114c8c61ef2660571  gcc/testsuite/g++.dg/ipa/devirt-17.C
  4b23a4e562c19810f0c55f0817916933  gcc/testsuite/g++.dg/ipa/devirt-18.C
  738b02e35a19328285cb21b4ce45b66f  gcc/testsuite/g++.dg/ipa/devirt-19.C
! 8752d9303ef31d1841ca9ff432ab2041  gcc/testsuite/g++.dg/ipa/devirt-2.C
  38cc93e595d53663e7624f3bf745ba39  gcc/testsuite/g++.dg/ipa/devirt-20.C
  67e019ff1f3d279e2c6b5f223b061ebc  gcc/testsuite/g++.dg/ipa/devirt-21.C
  ef2c20211e1e4ece4ec9e3d8ea3d585f  gcc/testsuite/g++.dg/ipa/devirt-22.C
--- 31222,31228 ----
  6dcf4578bc9c92f114c8c61ef2660571  gcc/testsuite/g++.dg/ipa/devirt-17.C
  4b23a4e562c19810f0c55f0817916933  gcc/testsuite/g++.dg/ipa/devirt-18.C
  738b02e35a19328285cb21b4ce45b66f  gcc/testsuite/g++.dg/ipa/devirt-19.C
! 50039ab7ea5e1a15882ae4b338ad0dcc  gcc/testsuite/g++.dg/ipa/devirt-2.C
  38cc93e595d53663e7624f3bf745ba39  gcc/testsuite/g++.dg/ipa/devirt-20.C
  67e019ff1f3d279e2c6b5f223b061ebc  gcc/testsuite/g++.dg/ipa/devirt-21.C
  ef2c20211e1e4ece4ec9e3d8ea3d585f  gcc/testsuite/g++.dg/ipa/devirt-22.C
*************** a2972db3912accc9638a8980355e47ed  gcc/te
*** 31234,31240 ****
  2878c81a10148de820784e19c1fe44f9  gcc/testsuite/g++.dg/ipa/devirt-4.C
  03e6ae8a2d5519bf23e14fa67d702d7e  gcc/testsuite/g++.dg/ipa/devirt-40.C
  d78ab57adfda4c091e90fca3cb9fff80  gcc/testsuite/g++.dg/ipa/devirt-41.C
! e915138ffa27270843cb0bce3000e00b  gcc/testsuite/g++.dg/ipa/devirt-42.C
  db476e68b1dec09bf7f43dcc225319f2  gcc/testsuite/g++.dg/ipa/devirt-43.C
  d6b86291c68660fa38d0d11d0821a8bd  gcc/testsuite/g++.dg/ipa/devirt-44.C
  ef9689abb991bd87caa70df090f683f6  gcc/testsuite/g++.dg/ipa/devirt-45.C
--- 31248,31254 ----
  2878c81a10148de820784e19c1fe44f9  gcc/testsuite/g++.dg/ipa/devirt-4.C
  03e6ae8a2d5519bf23e14fa67d702d7e  gcc/testsuite/g++.dg/ipa/devirt-40.C
  d78ab57adfda4c091e90fca3cb9fff80  gcc/testsuite/g++.dg/ipa/devirt-41.C
! 636ee6bf50d565883d9b35655ca7797e  gcc/testsuite/g++.dg/ipa/devirt-42.C
  db476e68b1dec09bf7f43dcc225319f2  gcc/testsuite/g++.dg/ipa/devirt-43.C
  d6b86291c68660fa38d0d11d0821a8bd  gcc/testsuite/g++.dg/ipa/devirt-44.C
  ef9689abb991bd87caa70df090f683f6  gcc/testsuite/g++.dg/ipa/devirt-45.C
*************** fd3170a6b712de5185af83d1df9fb44a  gcc/te
*** 31927,31933 ****
  18da6dd3f93c37878dfc6a5eaf4713d2  gcc/testsuite/g++.dg/lto/devirt-1_0.C
  f068a0a21819c4fcf03c47f1879ed773  gcc/testsuite/g++.dg/lto/devirt-22_0.C
  05966980a82349ba2c12b77f3c7baf2f  gcc/testsuite/g++.dg/lto/devirt-23_0.C
! 53a8cda3a89cdc358feed5c9c3e260ec  gcc/testsuite/g++.dg/lto/devirt-2_0.C
  8c8091def8f505d68972aadcc44857e7  gcc/testsuite/g++.dg/lto/devirt-30_0.C
  ca71ca973996440ab9695e2742050c65  gcc/testsuite/g++.dg/lto/devirt-34_0.C
  bfd98e8d03e6586d60097e11287306c0  gcc/testsuite/g++.dg/lto/devirt-3_0.C
--- 31941,31947 ----
  18da6dd3f93c37878dfc6a5eaf4713d2  gcc/testsuite/g++.dg/lto/devirt-1_0.C
  f068a0a21819c4fcf03c47f1879ed773  gcc/testsuite/g++.dg/lto/devirt-22_0.C
  05966980a82349ba2c12b77f3c7baf2f  gcc/testsuite/g++.dg/lto/devirt-23_0.C
! d4f45323ad37e08dc16a18ef67d4e3ef  gcc/testsuite/g++.dg/lto/devirt-2_0.C
  8c8091def8f505d68972aadcc44857e7  gcc/testsuite/g++.dg/lto/devirt-30_0.C
  ca71ca973996440ab9695e2742050c65  gcc/testsuite/g++.dg/lto/devirt-34_0.C
  bfd98e8d03e6586d60097e11287306c0  gcc/testsuite/g++.dg/lto/devirt-3_0.C
*************** f5855f61cbf9d400a44f276598a5db21  gcc/te
*** 33868,33873 ****
--- 33882,33888 ----
  004765f1bd46208118158a52b348e859  gcc/testsuite/g++.dg/opt/array2.C
  8ec7cd2bb0f2a747c58511cdba0677c9  gcc/testsuite/g++.dg/opt/asm1.C
  c9481d742a48253660d16743a6beecf9  gcc/testsuite/g++.dg/opt/asm2.C
+ 26841e6ff204f6a3aceb000496a86233  gcc/testsuite/g++.dg/opt/auto-init-sra-pr121894.C
  cd9d658bcc74632f8c5f64180e52c3e8  gcc/testsuite/g++.dg/opt/bitfield1.C
  2196be4aeda3f2fca55756098ae04451  gcc/testsuite/g++.dg/opt/bool1.C
  15dd66151b129bfdbe9cd873521b3467  gcc/testsuite/g++.dg/opt/builtins1.C
*************** d134ce6bbd6942500dee155278c6d0c1  gcc/te
*** 38938,38945 ****
  85946d6c4d80b74fc3bf7351777c73a0  gcc/testsuite/g++.dg/warn/Walways-true-3.C
  b40dbeaf2e568c93093f4ad87f6ac81c  gcc/testsuite/g++.dg/warn/Warray-bounds-10.C
  97555d7f68183f45a66353b91d1af8ef  gcc/testsuite/g++.dg/warn/Warray-bounds-11.C
! 2123f61403306ff8d528996d09bd5843  gcc/testsuite/g++.dg/warn/Warray-bounds-12.C
! 28b860c60ef771ec7e50f1e3d59c34d7  gcc/testsuite/g++.dg/warn/Warray-bounds-13.C
  751a532e4227b40e2fb6a1e86824d452  gcc/testsuite/g++.dg/warn/Warray-bounds-14.C
  572a6d7fa549dc456ad9ccafcd0de9c3  gcc/testsuite/g++.dg/warn/Warray-bounds-15.C
  a51e59121ac395643cb3896da790dc94  gcc/testsuite/g++.dg/warn/Warray-bounds-16.C
--- 38953,38960 ----
  85946d6c4d80b74fc3bf7351777c73a0  gcc/testsuite/g++.dg/warn/Walways-true-3.C
  b40dbeaf2e568c93093f4ad87f6ac81c  gcc/testsuite/g++.dg/warn/Warray-bounds-10.C
  97555d7f68183f45a66353b91d1af8ef  gcc/testsuite/g++.dg/warn/Warray-bounds-11.C
! df97049f247b3f44756561ceb24765cf  gcc/testsuite/g++.dg/warn/Warray-bounds-12.C
! a30534d573f1683bab0e67de9cddae18  gcc/testsuite/g++.dg/warn/Warray-bounds-13.C
  751a532e4227b40e2fb6a1e86824d452  gcc/testsuite/g++.dg/warn/Warray-bounds-14.C
  572a6d7fa549dc456ad9ccafcd0de9c3  gcc/testsuite/g++.dg/warn/Warray-bounds-15.C
  a51e59121ac395643cb3896da790dc94  gcc/testsuite/g++.dg/warn/Warray-bounds-16.C
*************** a51e59121ac395643cb3896da790dc94  gcc/te
*** 38947,38953 ****
  35573117acc546f03b1b924b513e72cd  gcc/testsuite/g++.dg/warn/Warray-bounds-18.C
  0186412c3f9a47b93aafb28f79f2d7c7  gcc/testsuite/g++.dg/warn/Warray-bounds-19.C
  798433d4099cd8d7572fde802e640896  gcc/testsuite/g++.dg/warn/Warray-bounds-2.C
! 3da4d5bfddf26b93a099c1b5754d50ea  gcc/testsuite/g++.dg/warn/Warray-bounds-20.C
  b524c7274934e8875fa2c0efd508fc92  gcc/testsuite/g++.dg/warn/Warray-bounds-21.C
  017ae9052a1c7ed7c39be76298ec9639  gcc/testsuite/g++.dg/warn/Warray-bounds-22.C
  d36f126068fa0852b0b29fa28089dbd3  gcc/testsuite/g++.dg/warn/Warray-bounds-23.C
--- 38962,38968 ----
  35573117acc546f03b1b924b513e72cd  gcc/testsuite/g++.dg/warn/Warray-bounds-18.C
  0186412c3f9a47b93aafb28f79f2d7c7  gcc/testsuite/g++.dg/warn/Warray-bounds-19.C
  798433d4099cd8d7572fde802e640896  gcc/testsuite/g++.dg/warn/Warray-bounds-2.C
! 51bae1da9c630f846e1186f25738a961  gcc/testsuite/g++.dg/warn/Warray-bounds-20.C
  b524c7274934e8875fa2c0efd508fc92  gcc/testsuite/g++.dg/warn/Warray-bounds-21.C
  017ae9052a1c7ed7c39be76298ec9639  gcc/testsuite/g++.dg/warn/Warray-bounds-22.C
  d36f126068fa0852b0b29fa28089dbd3  gcc/testsuite/g++.dg/warn/Warray-bounds-23.C
*************** a5706ac002500d657b5e8cd77cc6c62e  gcc/te
*** 39154,39160 ****
  1184b1df4ae243b5ab6917e0e3b219b6  gcc/testsuite/g++.dg/warn/Wmismatched-dealloc-2.C
  beb0dbeb6a47cd7fb34d04b431670905  gcc/testsuite/g++.dg/warn/Wmismatched-dealloc-3.C
  d183cd43f2c2caf1b71024ba3762ff44  gcc/testsuite/g++.dg/warn/Wmismatched-dealloc.C
! 74decc16b8ca63b12db874b7dde868cf  gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-2.C
  5c4cad449e21fe0fade92c9c0d19fb5f  gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-3.C
  da3dbc8526151b41f4a741a5d5e51eae  gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-4.C
  fef7a83173bbbc642fd475e4c5dbf6ea  gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-5.C
--- 39169,39175 ----
  1184b1df4ae243b5ab6917e0e3b219b6  gcc/testsuite/g++.dg/warn/Wmismatched-dealloc-2.C
  beb0dbeb6a47cd7fb34d04b431670905  gcc/testsuite/g++.dg/warn/Wmismatched-dealloc-3.C
  d183cd43f2c2caf1b71024ba3762ff44  gcc/testsuite/g++.dg/warn/Wmismatched-dealloc.C
! 42ee652001dccee4183620c0e4744fe5  gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-2.C
  5c4cad449e21fe0fade92c9c0d19fb5f  gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-3.C
  da3dbc8526151b41f4a741a5d5e51eae  gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-4.C
  fef7a83173bbbc642fd475e4c5dbf6ea  gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-5.C
*************** b3f9da722f5270cda4a26396283bbbe9  gcc/te
*** 43184,43189 ****
--- 43199,43205 ----
  3dce24cbf6e8a9d6b104a5174b42ccf6  gcc/testsuite/g++.target/aarch64/pr109661-2.C
  af15d8508e94dffd343c693011e63fd4  gcc/testsuite/g++.target/aarch64/pr109661-3.C
  9b78f2399b3493ce846b6fb03c77ee6c  gcc/testsuite/g++.target/aarch64/pr109661-4.C
+ 642fe82936cfa8f9a1ed358581691f4f  gcc/testsuite/g++.target/aarch64/pr113356.C
  c30fa1a8e837444d0a3e1e6be628b06d  gcc/testsuite/g++.target/aarch64/pr116074.C
  c8698b784efebd06777683e03d5bbfc7  gcc/testsuite/g++.target/aarch64/pr117048.C
  6bf6be8a46ca37d38164b2be2534e2c7  gcc/testsuite/g++.target/aarch64/pr119498.C
*************** e06e75338accc1d77eb96706931ab719  gcc/te
*** 49978,49983 ****
--- 49994,50000 ----
  b00d36d0215e29686de9f6563afb4e87  gcc/testsuite/gcc.dg/builtin-unreachable-5.c
  805cca243e4ddc4c6a264af39e4c36ab  gcc/testsuite/gcc.dg/builtin-unreachable-6.c
  55f574298f80b352e4b2c682678ec628  gcc/testsuite/gcc.dg/builtin-unreachable-6a.c
+ 846f74d213392bb0a4f2bcfba6104368  gcc/testsuite/gcc.dg/builtin-unreachable-7.c
  f009865cc5f42ab2ba4a4ed671729f1a  gcc/testsuite/gcc.dg/builtins-1.c
  de826bd2faea31ca3887af383ff62b8f  gcc/testsuite/gcc.dg/builtins-10.c
  960461c95930d3d3bd3e2a49ed939d49  gcc/testsuite/gcc.dg/builtins-11.c
*************** d176e423452b3b1dc2b591de90fb7b79  gcc/te
*** 50062,50067 ****
--- 50079,50085 ----
  fe3d87d9d937306c1cfb738ab291a1d0  gcc/testsuite/gcc.dg/c11-atomic-3.c
  92b6577d9ca27307e52b72fdc2e81cf8  gcc/testsuite/gcc.dg/c11-atomic-4.c
  5a7729ff2127958a8608ff174eed4821  gcc/testsuite/gcc.dg/c11-atomic-5.c
+ 07b663f93baedf729a289eeeee600bb7  gcc/testsuite/gcc.dg/c11-atomic-6.c
  37ee2eb758051ab7950639101c00d66e  gcc/testsuite/gcc.dg/c11-attr-syntax-1.c
  949aa9b8b20c27f20aef9e7521d77e35  gcc/testsuite/gcc.dg/c11-attr-syntax-2.c
  e3e7905df28d319258a82d3d6f793f44  gcc/testsuite/gcc.dg/c11-attr-syntax-3.c
*************** b0d1ce51d648932c87697a86eb202ce9  gcc/te
*** 50328,50333 ****
--- 50346,50352 ----
  b08395c5bb05824d4216a4910c4d5675  gcc/testsuite/gcc.dg/c23-imaginary-constants-7.c
  d8291c9e0816347133d2388bfe4181a2  gcc/testsuite/gcc.dg/c23-imaginary-constants-8.c
  28464a4aeb3c2ef3eed6abd09c9cd6fe  gcc/testsuite/gcc.dg/c23-imaginary-constants-9.c
+ 9148986047f0ec9feb86929b593fc835  gcc/testsuite/gcc.dg/c23-incomplete-1.c
  7111f8b5ea26f12db5228f72efdde79c  gcc/testsuite/gcc.dg/c23-labels-1.c
  ae562be53251d621831c177e0e8480cc  gcc/testsuite/gcc.dg/c23-labels-2.c
  5695ab5488ac5b615bee767303feecd8  gcc/testsuite/gcc.dg/c23-labels-3.c
*************** f2a4898d3ca2464c3600e2f890f8307c  gcc/te
*** 50453,50458 ****
--- 50472,50478 ----
  0ed09c36b7f29978fac9dcb2332979a9  gcc/testsuite/gcc.dg/c23-version-2.c
  61a95731fffe1417c8142841180bafdf  gcc/testsuite/gcc.dg/c2y-align-1.c
  a3e9b1a0ce807ace8388f49427e9ce2e  gcc/testsuite/gcc.dg/c2y-align-2.c
+ 851f930a2da512e8f6020dae62d44380  gcc/testsuite/gcc.dg/c2y-anon-init-1.c
  a69498f454527d6b2d0970e2c516bd48  gcc/testsuite/gcc.dg/c2y-array-negative-1.c
  6e0a8941af72f8d447e2231ec0d5c8ee  gcc/testsuite/gcc.dg/c2y-byte-alias-1.c
  bc33f75b7f1800ec5ea5cb736ab1b650  gcc/testsuite/gcc.dg/c2y-byte-alias-2.c
*************** e29dfebcc91efb4a6141cc6831d3fb23  gcc/te
*** 50489,50495 ****
--- 50509,50521 ----
  28796811a466a9b84dc89c824a73962a  gcc/testsuite/gcc.dg/c2y-imaginary-constants-8.c
  9116eeb1193a8e8b6e721056e96f1ba0  gcc/testsuite/gcc.dg/c2y-imaginary-constants-9.c
  017d911a779988d341ef2fe9cff89c28  gcc/testsuite/gcc.dg/c2y-incomplete-1.c
+ fac4d983506fe771aab24bcdf0cd6eb5  gcc/testsuite/gcc.dg/c2y-incomplete-2.c
+ 41c1686e328289238d317f92a564bf4c  gcc/testsuite/gcc.dg/c2y-incomplete-3.c
  8445ec4e0665a4141a7afa27a0e6c095  gcc/testsuite/gcc.dg/c2y-inline-1.c
+ 2b3f94dac416975326ac382d854e7d20  gcc/testsuite/gcc.dg/c2y-linkage-1.c
+ 95420752b61a34eafb01a473a5863268  gcc/testsuite/gcc.dg/c2y-linkage-2.c
+ 09ba37b2a96ac4e03a09f7acb2736946  gcc/testsuite/gcc.dg/c2y-linkage-3.c
+ 109ba18845bc4a1f0eeb0dccae1d5ad1  gcc/testsuite/gcc.dg/c2y-linkage-4.c
  f2024c93b6b3c3dea4d2faccbd83aa2e  gcc/testsuite/gcc.dg/c2y-named-loops-1.c
  46a3a94067e0f11e00c1bd23bc2786dd  gcc/testsuite/gcc.dg/c2y-named-loops-2.c
  34b7b4b191cc4cee19b53b5b78ec89c5  gcc/testsuite/gcc.dg/c2y-named-loops-4.c
*************** ae93aae7f7b6e46952f9aada1a846a03  gcc/te
*** 50504,50509 ****
--- 50530,50536 ----
  71956a9335d91df7ca0b75edbc0375a8  gcc/testsuite/gcc.dg/c2y-register-array-1.c
  1d8585ebd75d9d65e8c701ca2c704a84  gcc/testsuite/gcc.dg/c2y-register-array-2.c
  6e588677d43bb7ff98d01a88480060fc  gcc/testsuite/gcc.dg/c2y-register-array-3.c
+ 2b7359e19e88c655c7a556e8dd93dc49  gcc/testsuite/gcc.dg/c2y-static-assert-1.c
  01e04472b1c1f83f93ccb20602c5ddee  gcc/testsuite/gcc.dg/c2y-storage-class-1.c
  a12d7d6a5d3610300ee36a0d18f2abf3  gcc/testsuite/gcc.dg/c2y-struct-empty-1.c
  7b91caa232dcb33030877f5bf290f5da  gcc/testsuite/gcc.dg/c2y-switch-1.c
*************** f01a8a4d620c24644f7618e21e2f811b  gcc/te
*** 53024,53029 ****
--- 53051,53057 ----
  d075e1ed2b2fb5d21ab476c50aaaa7d4  gcc/testsuite/gcc.dg/gimplefe-error-13.c
  ab3f4797f7365b2acf6d2c39beef404f  gcc/testsuite/gcc.dg/gimplefe-error-14.c
  bc09becefd492db7bf633407020cd40e  gcc/testsuite/gcc.dg/gimplefe-error-15.c
+ 882a0515f9cf927baf5a0bc8a8100cda  gcc/testsuite/gcc.dg/gimplefe-error-16.c
  8732eebb459e2274a07edcd677b00f18  gcc/testsuite/gcc.dg/gimplefe-error-2.c
  ada325f0b72d6ab38e2125c5cbc606b4  gcc/testsuite/gcc.dg/gimplefe-error-3.c
  c633216963c8d3e5cf26c00e55663895  gcc/testsuite/gcc.dg/gimplefe-error-4.c
*************** d602fec0c129037ce49acd7cccfd6266  gcc/te
*** 56105,56110 ****
--- 56133,56140 ----
  942ef1841a793e5e296b868a6cfed912  gcc/testsuite/gcc.dg/pr121216.c
  f3420ae2cec7581a0ad483e1abb174f2  gcc/testsuite/gcc.dg/pr121217.c
  7032b52dc2dd1e6cab514293c2d0b276  gcc/testsuite/gcc.dg/pr121322.c
+ 5d7224a5e3a015d4a5682c4597843dae  gcc/testsuite/gcc.dg/pr121391-1.c
+ a900268f8486ddee095c80302941ad60  gcc/testsuite/gcc.dg/pr121391-2.c
  a0e82361440276cacba8161b406fa08c  gcc/testsuite/gcc.dg/pr121619.c
  4a0b062157a946d90ff3c34224ea0c66  gcc/testsuite/gcc.dg/pr121663.c
  596e137d1ef1fc5f142c61692ba512ae  gcc/testsuite/gcc.dg/pr121678.c
*************** f42b1c4e861e4207759994e34bbd715d  gcc/te
*** 59878,59883 ****
--- 59908,59914 ----
  0a7fe9f8201216f1c14d41d7e2b3175d  gcc/testsuite/gcc.dg/torture/pr121756.c
  457e3a0b9245c7c5a7794754dce78fe5  gcc/testsuite/gcc.dg/torture/pr121829.c
  949a4a95ad545289488a204b883b05d6  gcc/testsuite/gcc.dg/torture/pr121844.c
+ 864f636916f6866905d019b279576014  gcc/testsuite/gcc.dg/torture/pr121962-1.c
  ded4330fd1cd52783bd9b1761db038ef  gcc/testsuite/gcc.dg/torture/pr16104-1.c
  fc265ee05da2f29f0e92804661cd1f28  gcc/testsuite/gcc.dg/torture/pr17526.c
  01c583edb41b632b835aa892b9c1cb14  gcc/testsuite/gcc.dg/torture/pr17933-1.c
*************** b1dc948dbe2e4e262af2a3b5dbfad2e9  gcc/te
*** 60710,60716 ****
  e03db596324f51251c0ce2c64b12cad2  gcc/testsuite/gcc.dg/torture/pr84775.c
  338306ad9189df8561bc7d987508b89b  gcc/testsuite/gcc.dg/torture/pr84803.c
  f5f1c6e563476cf4c72a652712ad2748  gcc/testsuite/gcc.dg/torture/pr84811.c
! e3454ccd4d18e962e3552dc0521625f3  gcc/testsuite/gcc.dg/torture/pr84830.c
  6561bd91779cfb10bb91f9a474943592  gcc/testsuite/gcc.dg/torture/pr84929.c
  7f1150514530c325d4ab11a44bfef85e  gcc/testsuite/gcc.dg/torture/pr85168.c
  4a262d46aeb406a4774a474eee1d9e1b  gcc/testsuite/gcc.dg/torture/pr85244-1.c
--- 60741,60747 ----
  e03db596324f51251c0ce2c64b12cad2  gcc/testsuite/gcc.dg/torture/pr84775.c
  338306ad9189df8561bc7d987508b89b  gcc/testsuite/gcc.dg/torture/pr84803.c
  f5f1c6e563476cf4c72a652712ad2748  gcc/testsuite/gcc.dg/torture/pr84811.c
! a429ef2bfd3602d63f84e815a87d1143  gcc/testsuite/gcc.dg/torture/pr84830.c
  6561bd91779cfb10bb91f9a474943592  gcc/testsuite/gcc.dg/torture/pr84929.c
  7f1150514530c325d4ab11a44bfef85e  gcc/testsuite/gcc.dg/torture/pr85168.c
  4a262d46aeb406a4774a474eee1d9e1b  gcc/testsuite/gcc.dg/torture/pr85244-1.c
*************** a0f533cf1734bcf6ffb5fc5a84378862  gcc/te
*** 61513,61519 ****
--- 61544,61554 ----
  ba534422ad0a79e177e4df595590f346  gcc/testsuite/gcc.dg/tree-ssa/copy-headers-8.c
  bbd27c9626a85b85613edc25e673f5b8  gcc/testsuite/gcc.dg/tree-ssa/copy-headers-9.c
  8fbc9eee0416b3a104acac36b4f55468  gcc/testsuite/gcc.dg/tree-ssa/copy-headers.c
+ 0a5f29c17c4bea69de1397cf77148a9a  gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-1.c
  a7469adfbda853628ff89a7cbd24a157  gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-arg-1.c
+ 2f250f0e1e47e486ebffa648de678b82  gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-arg-2.c
+ 01b1b6fceaa12b65220a2003fe30396f  gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-memcpy-1.c
+ edf08219ede3b6ca737fe14a29546f0f  gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-memcpy-2.c
  26535898276be84d4c9b1dd5c518291c  gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-struct-1.c
  4e3f86968b3beec7e0f58cad74c609c4  gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-union-1.c
  e75105ea343803ddefbd84e37e7efb04  gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-zero-1.c
*************** d7800e6a28e5b70e0293c932b14894f8  gcc/te
*** 63333,63338 ****
--- 63368,63374 ----
  17d5e649f4ebd09ca062e6a51b4bb263  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-33.c
  887ebbb6fc9fa28141e943ea74380c78  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-34.c
  687638685378b722aa22c4ce7ad8dc2e  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-35.c
+ c66b7cafbeff222b06fe998e7922efb9  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-36.c
  39d8ac143c15d11301c705a380a6769b  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-4.c
  bd3ae093f96e1ef4c6e63e83f1c59945  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-5.c
  38403894c988bb66d103ea06dcfd401d  gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-6.c
*************** e64015aa3333e77e13b230e2bc2580b0  gcc/te
*** 68311,68317 ****
  0c0a969f9b4cb1d87cdf711ad64ee112  gcc/testsuite/gcc.target/aarch64/pr113114.c
  87355a60d36c24e61552591804e644e0  gcc/testsuite/gcc.target/aarch64/pr113196.c
  947e939e0de525b188c373b823895f21  gcc/testsuite/gcc.target/aarch64/pr113295-2.c
- 642fe82936cfa8f9a1ed358581691f4f  gcc/testsuite/gcc.target/aarch64/pr113356.C
  fe21fc167a8d34db237e8348c2a1fc85  gcc/testsuite/gcc.target/aarch64/pr113485.c
  f12479eade051fc653baa3b9e92457a8  gcc/testsuite/gcc.target/aarch64/pr113550.c
  5c93b32021bd32ca40c9fb5ec6a30f04  gcc/testsuite/gcc.target/aarch64/pr113552.c
--- 68347,68352 ----
*************** b1a43ba633267af53e035e52d824d83e  gcc/te
*** 68360,68366 ****
  c8f85510fcedfd5fda7fe58be4530841  gcc/testsuite/gcc.target/aarch64/pr65235_1.c
  5d760fe6744091dbc9b5e29939f63c7f  gcc/testsuite/gcc.target/aarch64/pr65491_1.c
  fe2dde4dc1496e201292c4be3d1995af  gcc/testsuite/gcc.target/aarch64/pr65624.c
! ad07a37b008bebe88d872d4c4dbf04ca  gcc/testsuite/gcc.target/aarch64/pr66462.c
  4ae80103de3fb651878fcd8edf496474  gcc/testsuite/gcc.target/aarch64/pr66776.c
  6184e08332c62fb090c99cfd6d2518c4  gcc/testsuite/gcc.target/aarch64/pr66912.c
  a134a225066dc537fbe378e60de12e5e  gcc/testsuite/gcc.target/aarch64/pr68102_1.c
--- 68395,68401 ----
  c8f85510fcedfd5fda7fe58be4530841  gcc/testsuite/gcc.target/aarch64/pr65235_1.c
  5d760fe6744091dbc9b5e29939f63c7f  gcc/testsuite/gcc.target/aarch64/pr65491_1.c
  fe2dde4dc1496e201292c4be3d1995af  gcc/testsuite/gcc.target/aarch64/pr65624.c
! f8126237cf26526ae89a038ad613c27b  gcc/testsuite/gcc.target/aarch64/pr66462.c
  4ae80103de3fb651878fcd8edf496474  gcc/testsuite/gcc.target/aarch64/pr66776.c
  6184e08332c62fb090c99cfd6d2518c4  gcc/testsuite/gcc.target/aarch64/pr66912.c
  a134a225066dc537fbe378e60de12e5e  gcc/testsuite/gcc.target/aarch64/pr68102_1.c
*************** d82e91485d24b0cf4d2e422ec8011966  gcc/te
*** 69924,69929 ****
--- 69959,69967 ----
  2a4121b5645664402b571daa21f66172  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/sudot_za32_s8_vg1x2.c
  41e685821a5fe75dbce4d2e681110882  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/sudot_za32_s8_vg1x4.c
  98cf869ad1fbee9b39a6b7f1280c3819  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/suvdot_lane_za32_s8_vg1x4.c
+ b74e78c5909672747659866c986dac52  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/svluti4_zt_1.c
+ 8a6cd380615f75bb6112bae2d65feecd  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/svwrite_lane_zt_1.c
+ b6d814e93a4000475e51da4472709330  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/svwrite_zt_1.c
  548e83ffcea63c963ba83c5ea81ed6ae  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/test_sme2_acle.h
  77448bea927d957f1775dca6bf314aca  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/unpk_s16_x2.c
  6ff10bfdd5d3166a1ab489104cca1a03  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/unpk_s16_x4.c
*************** e716ac2dd0b6a489e0a066923531fe33  gcc/te
*** 71161,71174 ****
  a7a4c48a2a400e927d1783f11ff5ae2f  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_lane_f16.c
  1c2f087197693ac0f8341bb2de2f9903  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_lane_f32.c
  9bf80dcb14d6ec0ad3830bc283fafefa  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_lane_f64.c
! 5819dc70d5a76c525b922277c0b959ee  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s16.c
! 6a2ee9b11969c4475629e14cfed49038  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s32.c
! a5cea13f4b457eccce848243008a2449  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s64.c
! 540ce03a5aa12db4294f15800b60e830  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s8.c
! 935cb2f781553ba0bbcf7db6a6443a26  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u16.c
! d22a6497edd09e3536df77b5f96e55dd  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u32.c
! 416804e673fcd9e4da8d4cbbe54e3099  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u64.c
! 90173ee0d5de2d7ce44b254c077c25f6  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u8.c
  13e5426577da8e8350426b98cdde0d0f  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mulh_s16.c
  887cde542b27dadbbd6e7abe7696d2cd  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mulh_s32.c
  78776c6e140b51a29713f2889bc58bca  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mulh_s64.c
--- 71199,71212 ----
  a7a4c48a2a400e927d1783f11ff5ae2f  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_lane_f16.c
  1c2f087197693ac0f8341bb2de2f9903  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_lane_f32.c
  9bf80dcb14d6ec0ad3830bc283fafefa  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_lane_f64.c
! 93bec38f83aa08ea078a190a36ce60b6  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s16.c
! 4f42232f407acd56314fee0d0ff008e5  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s32.c
! 729ad62f6cb28217b9d2f1501b162f8c  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s64.c
! 56c4878136209bdc3156de990353cecf  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s8.c
! 6def2e7ca37494f570e330b41d18842f  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u16.c
! 6993cbec8b136cc2cbabb54c90558144  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u32.c
! 465a374b40b8fec960f6f658afb9e57b  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u64.c
! 59e9a7a2c74e7a644223ce578131448e  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u8.c
  13e5426577da8e8350426b98cdde0d0f  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mulh_s16.c
  887cde542b27dadbbd6e7abe7696d2cd  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mulh_s32.c
  78776c6e140b51a29713f2889bc58bca  gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mulh_s64.c
*************** af84471fa52113a559843350049c942e  gcc/te
*** 72062,72067 ****
--- 72100,72108 ----
  d9823cbd34836a7cbb417173ee20f519  gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/svlast.c
  29cace40b91c5375f944f44e97bae2f5  gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/svlast128_run.c
  dd949f1aaa34adff76b9ec0730190812  gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/svlast256_run.c
+ 5c21aac2cfe747779475a733b928a41f  gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/svluti4_zt_1.c
+ 1bf14b35b9056b9096253a0801409170  gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/svwrite_lane_zt_1.c
+ c17d49fcbc1f462e0d829ea8c83666d7  gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/svwrite_zt_1.c
  415df05f3abc8db59c80ac9f28da4c36  gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/tbl_tuple_1.c
  6f84f9e2a4fb3cb8125a835db8703669  gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_bfloat16_1.c
  4b11535a21d8f9931c92d09236b5027d  gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_bfloat16_lane_1.c
*************** fc2eb8ac52faed5fba0a017b858d4ae4  gcc/te
*** 75182,75187 ****
--- 75223,75229 ----
  4036d83a59b4adcf9e8a4cf5a291d22e  gcc/testsuite/gcc.target/aarch64/torture/pr111677.c
  8ba6cf5317762b2b89350d4f652efa53  gcc/testsuite/gcc.target/aarch64/torture/pr116564.c
  626bb6bb64c1bbe8eb5e2b92bf925aeb  gcc/testsuite/gcc.target/aarch64/torture/pr120986-2.c
+ 74c4136750a799ab2228f52f47274a10  gcc/testsuite/gcc.target/aarch64/torture/pr121772.c
  5266ac107a73e3ee1d1f44e1cda7d9f2  gcc/testsuite/gcc.target/aarch64/torture/simd-abi-1.c
  9c3416db2fc04c3f91b03ecae15e943e  gcc/testsuite/gcc.target/aarch64/torture/simd-abi-10.c
  df55bfe2c1ce46074b19b4566cedeef4  gcc/testsuite/gcc.target/aarch64/torture/simd-abi-11.c
*************** e95ad2780e346935674e8e065a322d1d  gcc/te
*** 76179,76188 ****
  575ab2ac98e30ba3e1b351506a8afcb0  gcc/testsuite/gcc.target/arm/fmaxmin-2.c
  1f15e3fad418a20060c0b8a618fb5723  gcc/testsuite/gcc.target/arm/fmaxmin.c
  a1182e17a398d2114e6f9d6156618a24  gcc/testsuite/gcc.target/arm/fmaxmin.x
! acd3e91a7d28ee5546286c4936d86e11  gcc/testsuite/gcc.target/arm/fp16-aapcs-1.c
! 9e99c9ae7465a5459e190cb5d75fe5f7  gcc/testsuite/gcc.target/arm/fp16-aapcs-2.c
! 76aa061fcf894a1336f2f8d07bcd7524  gcc/testsuite/gcc.target/arm/fp16-aapcs-3.c
! 45400d3cc5277c10b804897e439d5ea8  gcc/testsuite/gcc.target/arm/fp16-aapcs-4.c
  f7e509420aab463592a3e5d54b6c6b8c  gcc/testsuite/gcc.target/arm/fp16-builtins-1.c
  237aa223257ca24bfddebcc43dd387a2  gcc/testsuite/gcc.target/arm/fp16-compile-alt-1.c
  85be9f1d24d495b2882fc58bb89a96d2  gcc/testsuite/gcc.target/arm/fp16-compile-alt-10.c
--- 76221,76227 ----
  575ab2ac98e30ba3e1b351506a8afcb0  gcc/testsuite/gcc.target/arm/fmaxmin-2.c
  1f15e3fad418a20060c0b8a618fb5723  gcc/testsuite/gcc.target/arm/fmaxmin.c
  a1182e17a398d2114e6f9d6156618a24  gcc/testsuite/gcc.target/arm/fmaxmin.x
! d8203dd017181ab133e278b2250a10d4  gcc/testsuite/gcc.target/arm/fp16-aapcs.c
  f7e509420aab463592a3e5d54b6c6b8c  gcc/testsuite/gcc.target/arm/fp16-builtins-1.c
  237aa223257ca24bfddebcc43dd387a2  gcc/testsuite/gcc.target/arm/fp16-compile-alt-1.c
  85be9f1d24d495b2882fc58bb89a96d2  gcc/testsuite/gcc.target/arm/fp16-compile-alt-10.c
*************** f2c09f0461fc411ac562588f78dbad13  gcc/te
*** 82272,82286 ****
  880140ded63d84cb98c028b6681de716  gcc/testsuite/gcc.target/i386/avx512bw-vpabsb-2.c
  b3fc0e2ed6ad4663554cfe6beb7c728c  gcc/testsuite/gcc.target/i386/avx512bw-vpabsw-1.c
  763b98e1b688bba4973179a8a0f0f792  gcc/testsuite/gcc.target/i386/avx512bw-vpabsw-2.c
! f5d4e33fe73fd19617089f23235ef6aa  gcc/testsuite/gcc.target/i386/avx512bw-vpackssdw-1.c
  c528acbf638ead7e00a72c7f6a8e2676  gcc/testsuite/gcc.target/i386/avx512bw-vpackssdw-2.c
  7774011f206efe680c3c0bc56566322d  gcc/testsuite/gcc.target/i386/avx512bw-vpackssdw-3.c
! 57add79bdc825ef2ec63e229833a0bd1  gcc/testsuite/gcc.target/i386/avx512bw-vpacksswb-1.c
  1fdf5436b492e9245f483d8368e3c711  gcc/testsuite/gcc.target/i386/avx512bw-vpacksswb-2.c
  2fdbbc63f2a17935b64972a5141ef964  gcc/testsuite/gcc.target/i386/avx512bw-vpacksswb-3.c
! d837708b1c7e483b262950e1ad83ec08  gcc/testsuite/gcc.target/i386/avx512bw-vpackusdw-1.c
  4846959fd9d170b8cdc5c5ad55f81af5  gcc/testsuite/gcc.target/i386/avx512bw-vpackusdw-2.c
! a603784067a3b8a533167ff3484c72fe  gcc/testsuite/gcc.target/i386/avx512bw-vpackuswb-1.c
  c3144a7e199274bc432a709f34f645b6  gcc/testsuite/gcc.target/i386/avx512bw-vpackuswb-2.c
  144cb54d1460e38389ba347123db3213  gcc/testsuite/gcc.target/i386/avx512bw-vpaddb-1.c
  e00573153b9a4ab0adf7f235ee2cefa0  gcc/testsuite/gcc.target/i386/avx512bw-vpaddb-2.c
--- 82311,82325 ----
  880140ded63d84cb98c028b6681de716  gcc/testsuite/gcc.target/i386/avx512bw-vpabsb-2.c
  b3fc0e2ed6ad4663554cfe6beb7c728c  gcc/testsuite/gcc.target/i386/avx512bw-vpabsw-1.c
  763b98e1b688bba4973179a8a0f0f792  gcc/testsuite/gcc.target/i386/avx512bw-vpabsw-2.c
! 44f9824ecd2ed301646ede8cbc83b56e  gcc/testsuite/gcc.target/i386/avx512bw-vpackssdw-1.c
  c528acbf638ead7e00a72c7f6a8e2676  gcc/testsuite/gcc.target/i386/avx512bw-vpackssdw-2.c
  7774011f206efe680c3c0bc56566322d  gcc/testsuite/gcc.target/i386/avx512bw-vpackssdw-3.c
! ce0a606339497cb50a29fcab05a9eabe  gcc/testsuite/gcc.target/i386/avx512bw-vpacksswb-1.c
  1fdf5436b492e9245f483d8368e3c711  gcc/testsuite/gcc.target/i386/avx512bw-vpacksswb-2.c
  2fdbbc63f2a17935b64972a5141ef964  gcc/testsuite/gcc.target/i386/avx512bw-vpacksswb-3.c
! cee4455004c2694aa4346aa19b754efa  gcc/testsuite/gcc.target/i386/avx512bw-vpackusdw-1.c
  4846959fd9d170b8cdc5c5ad55f81af5  gcc/testsuite/gcc.target/i386/avx512bw-vpackusdw-2.c
! 574f68ed1537e2484d7d24eed6f9a315  gcc/testsuite/gcc.target/i386/avx512bw-vpackuswb-1.c
  c3144a7e199274bc432a709f34f645b6  gcc/testsuite/gcc.target/i386/avx512bw-vpackuswb-2.c
  144cb54d1460e38389ba347123db3213  gcc/testsuite/gcc.target/i386/avx512bw-vpaddb-1.c
  e00573153b9a4ab0adf7f235ee2cefa0  gcc/testsuite/gcc.target/i386/avx512bw-vpaddb-2.c
*************** afd3e3f28e3108bd8551946815797996  gcc/te
*** 82374,82380 ****
  2c3c9b31bcb5c5ae49b479d9f30bc8c9  gcc/testsuite/gcc.target/i386/avx512bw-vpermi2w-2.c
  9ed96cb1f2027435f4a3d5c76d0be193  gcc/testsuite/gcc.target/i386/avx512bw-vpermt2w-1.c
  a0f56b7edc926ca30a5e2e7054790fc1  gcc/testsuite/gcc.target/i386/avx512bw-vpermt2w-2.c
! d53604b8716b6d81b7ea6b714e73ba14  gcc/testsuite/gcc.target/i386/avx512bw-vpermw-1.c
  f9b93ac6a209e1d15c715127c3a22db7  gcc/testsuite/gcc.target/i386/avx512bw-vpermw-2.c
  f40a7631c127fd2925fd3718c0eb98b6  gcc/testsuite/gcc.target/i386/avx512bw-vpextr-1.c
  574de53d7b28b596082bd03f153b7f3b  gcc/testsuite/gcc.target/i386/avx512bw-vpinsr-1.c
--- 82413,82419 ----
  2c3c9b31bcb5c5ae49b479d9f30bc8c9  gcc/testsuite/gcc.target/i386/avx512bw-vpermi2w-2.c
  9ed96cb1f2027435f4a3d5c76d0be193  gcc/testsuite/gcc.target/i386/avx512bw-vpermt2w-1.c
  a0f56b7edc926ca30a5e2e7054790fc1  gcc/testsuite/gcc.target/i386/avx512bw-vpermt2w-2.c
! 7cb80b795e0afc52aeebd2e80056f833  gcc/testsuite/gcc.target/i386/avx512bw-vpermw-1.c
  f9b93ac6a209e1d15c715127c3a22db7  gcc/testsuite/gcc.target/i386/avx512bw-vpermw-2.c
  f40a7631c127fd2925fd3718c0eb98b6  gcc/testsuite/gcc.target/i386/avx512bw-vpextr-1.c
  574de53d7b28b596082bd03f153b7f3b  gcc/testsuite/gcc.target/i386/avx512bw-vpinsr-1.c
*************** d89a3e7fea8841425db8f8334b6bf852  gcc/te
*** 82411,82421 ****
  8a56f5d9d1e0901d2961599ce258247b  gcc/testsuite/gcc.target/i386/avx512bw-vpmovsxbw-1.c
  ed602259785dd505ce43fedc83608fa2  gcc/testsuite/gcc.target/i386/avx512bw-vpmovsxbw-2.c
  8c716e1e77b74aecf16d86bbff7fb082  gcc/testsuite/gcc.target/i386/avx512bw-vpmovuswb-1.c
! 082edd4008d3b3a00b57e8d3ea996a89  gcc/testsuite/gcc.target/i386/avx512bw-vpmovuswb-2.c
  c0e8486201586986f95de6373b432fd4  gcc/testsuite/gcc.target/i386/avx512bw-vpmovw2m-1.c
  9504524787b82a0ccf486f89f4fe27e1  gcc/testsuite/gcc.target/i386/avx512bw-vpmovw2m-2.c
  7d06d207fbd0d03584e33f481722e2be  gcc/testsuite/gcc.target/i386/avx512bw-vpmovwb-1.c
! 7d6fcb3c926679157d1535ecb9ef00af  gcc/testsuite/gcc.target/i386/avx512bw-vpmovwb-2.c
  36fd23835105aebbfe3ccb58e069edda  gcc/testsuite/gcc.target/i386/avx512bw-vpmovzxbw-1.c
  6d3d5643ba38c610b31450cf8057ed44  gcc/testsuite/gcc.target/i386/avx512bw-vpmovzxbw-2.c
  e3957d749c8301db81228d71e2ed5352  gcc/testsuite/gcc.target/i386/avx512bw-vpmulhrsw-1.c
--- 82450,82460 ----
  8a56f5d9d1e0901d2961599ce258247b  gcc/testsuite/gcc.target/i386/avx512bw-vpmovsxbw-1.c
  ed602259785dd505ce43fedc83608fa2  gcc/testsuite/gcc.target/i386/avx512bw-vpmovsxbw-2.c
  8c716e1e77b74aecf16d86bbff7fb082  gcc/testsuite/gcc.target/i386/avx512bw-vpmovuswb-1.c
! ed032789779e27c0435b031047918860  gcc/testsuite/gcc.target/i386/avx512bw-vpmovuswb-2.c
  c0e8486201586986f95de6373b432fd4  gcc/testsuite/gcc.target/i386/avx512bw-vpmovw2m-1.c
  9504524787b82a0ccf486f89f4fe27e1  gcc/testsuite/gcc.target/i386/avx512bw-vpmovw2m-2.c
  7d06d207fbd0d03584e33f481722e2be  gcc/testsuite/gcc.target/i386/avx512bw-vpmovwb-1.c
! ba3077b35872eb082d61ddfcf74b8bfe  gcc/testsuite/gcc.target/i386/avx512bw-vpmovwb-2.c
  36fd23835105aebbfe3ccb58e069edda  gcc/testsuite/gcc.target/i386/avx512bw-vpmovzxbw-1.c
  6d3d5643ba38c610b31450cf8057ed44  gcc/testsuite/gcc.target/i386/avx512bw-vpmovzxbw-2.c
  e3957d749c8301db81228d71e2ed5352  gcc/testsuite/gcc.target/i386/avx512bw-vpmulhrsw-1.c
*************** eec6fff8d303fc85528c723caf8f5f06  gcc/te
*** 82423,82429 ****
  7845230a4ce4e6533cb4092b797b3249  gcc/testsuite/gcc.target/i386/avx512bw-vpmulhrsw-3.c
  d3197b5f7dc09e0e37b2cb02e134bef7  gcc/testsuite/gcc.target/i386/avx512bw-vpmulhuw-1.c
  42b1db5dfb2a76f532d624b284c225ea  gcc/testsuite/gcc.target/i386/avx512bw-vpmulhuw-2.c
! e8f3d6149ab039d72c059b5c9f18d8db  gcc/testsuite/gcc.target/i386/avx512bw-vpmulhw-1.c
  8a3e2d58cb4983d1fe8836cc919d941e  gcc/testsuite/gcc.target/i386/avx512bw-vpmulhw-2.c
  e01fa9196841d492825e7eb6b9e4c87a  gcc/testsuite/gcc.target/i386/avx512bw-vpmullw-1.c
  0d5a0a20d5556de7ae2f2ab1821a1383  gcc/testsuite/gcc.target/i386/avx512bw-vpmullw-2.c
--- 82462,82468 ----
  7845230a4ce4e6533cb4092b797b3249  gcc/testsuite/gcc.target/i386/avx512bw-vpmulhrsw-3.c
  d3197b5f7dc09e0e37b2cb02e134bef7  gcc/testsuite/gcc.target/i386/avx512bw-vpmulhuw-1.c
  42b1db5dfb2a76f532d624b284c225ea  gcc/testsuite/gcc.target/i386/avx512bw-vpmulhuw-2.c
! 1e8cce036261708b07b7fb9a825ca124  gcc/testsuite/gcc.target/i386/avx512bw-vpmulhw-1.c
  8a3e2d58cb4983d1fe8836cc919d941e  gcc/testsuite/gcc.target/i386/avx512bw-vpmulhw-2.c
  e01fa9196841d492825e7eb6b9e4c87a  gcc/testsuite/gcc.target/i386/avx512bw-vpmullw-1.c
  0d5a0a20d5556de7ae2f2ab1821a1383  gcc/testsuite/gcc.target/i386/avx512bw-vpmullw-2.c
*************** fd53867852deb53d0ca22ad2de8d7adf  gcc/te
*** 83108,83114 ****
  b5e4cd18a2247fe8c73f3ec6f8f9beb7  gcc/testsuite/gcc.target/i386/avx512f-vdivss-1.c
  37bc1f025f764010883a7d33e587a6a9  gcc/testsuite/gcc.target/i386/avx512f-vdivss-2.c
  3d1a356d368a114ff4f4f5ce2918a939  gcc/testsuite/gcc.target/i386/avx512f-vdivss-3.c
! 708c12de1370a83a2980fb98a399a5d1  gcc/testsuite/gcc.target/i386/avx512f-vec-init.c
  53ee450644f8170f381cf40eb5ef85fe  gcc/testsuite/gcc.target/i386/avx512f-vec-set-2.c
  0cac8e1e01a7b0e7c1e81c1fa3676acb  gcc/testsuite/gcc.target/i386/avx512f-vec-unpack.c
  44f99bcaccd5e7e590676abb96268078  gcc/testsuite/gcc.target/i386/avx512f-vect-fmaddsubXXXpd.c
--- 83147,83153 ----
  b5e4cd18a2247fe8c73f3ec6f8f9beb7  gcc/testsuite/gcc.target/i386/avx512f-vdivss-1.c
  37bc1f025f764010883a7d33e587a6a9  gcc/testsuite/gcc.target/i386/avx512f-vdivss-2.c
  3d1a356d368a114ff4f4f5ce2918a939  gcc/testsuite/gcc.target/i386/avx512f-vdivss-3.c
! 2fa289c2f52fbd5e857caf50b5af0cdd  gcc/testsuite/gcc.target/i386/avx512f-vec-init.c
  53ee450644f8170f381cf40eb5ef85fe  gcc/testsuite/gcc.target/i386/avx512f-vec-set-2.c
  0cac8e1e01a7b0e7c1e81c1fa3676acb  gcc/testsuite/gcc.target/i386/avx512f-vec-unpack.c
  44f99bcaccd5e7e590676abb96268078  gcc/testsuite/gcc.target/i386/avx512f-vect-fmaddsubXXXpd.c
*************** e0b4781ba3e58056c22bc6ed34bf9300  gcc/te
*** 83696,83702 ****
  c8546919944aa8e519a6d7c6609e35a2  gcc/testsuite/gcc.target/i386/avx512fp16-11b.c
  45998199c9d05373b91b703c489b1dab  gcc/testsuite/gcc.target/i386/avx512fp16-12a.c
  14758831e35f6207f1d8a401d5965ad7  gcc/testsuite/gcc.target/i386/avx512fp16-12b.c
! ad4f186a71739c69b4cd228c0b249bb1  gcc/testsuite/gcc.target/i386/avx512fp16-13.c
  c5c6d65e4830ae5dec75a681e4c32731  gcc/testsuite/gcc.target/i386/avx512fp16-14.c
  5105733c3744e643e48e7e479046d119  gcc/testsuite/gcc.target/i386/avx512fp16-1a.c
  e5318fffe1e2b5367902db745c03823d  gcc/testsuite/gcc.target/i386/avx512fp16-1b.c
--- 83735,83741 ----
  c8546919944aa8e519a6d7c6609e35a2  gcc/testsuite/gcc.target/i386/avx512fp16-11b.c
  45998199c9d05373b91b703c489b1dab  gcc/testsuite/gcc.target/i386/avx512fp16-12a.c
  14758831e35f6207f1d8a401d5965ad7  gcc/testsuite/gcc.target/i386/avx512fp16-12b.c
! 18609501378377c3957059d79b8d9cb7  gcc/testsuite/gcc.target/i386/avx512fp16-13.c
  c5c6d65e4830ae5dec75a681e4c32731  gcc/testsuite/gcc.target/i386/avx512fp16-14.c
  5105733c3744e643e48e7e479046d119  gcc/testsuite/gcc.target/i386/avx512fp16-1a.c
  e5318fffe1e2b5367902db745c03823d  gcc/testsuite/gcc.target/i386/avx512fp16-1b.c
*************** e79f5471eaed0e7487f965113398d268  gcc/te
*** 83728,83734 ****
  b9ed1e48c2076ab8bd9adfc96519f6d4  gcc/testsuite/gcc.target/i386/avx512fp16-builtin_shuffle-1.c
  262fe61d867c3bf99c20653180a2b0e0  gcc/testsuite/gcc.target/i386/avx512fp16-complex-constraints.c
  b087aa309dcb182d79cfcb79c9dd7901  gcc/testsuite/gcc.target/i386/avx512fp16-complex-fma.c
! ce3ec1a0fcc73a326217d28784f3c8c7  gcc/testsuite/gcc.target/i386/avx512fp16-conjugation-1.c
  62ba9a2c64517f9e64fd9cb6e220a7bc  gcc/testsuite/gcc.target/i386/avx512fp16-dest-false-dep-for-glc.c
  970bc47c225c13b0c28a2f329533ddb7  gcc/testsuite/gcc.target/i386/avx512fp16-floatvnhf.c
  ac477f1c32fad10fc7a0406189e98ac6  gcc/testsuite/gcc.target/i386/avx512fp16-fma-1.c
--- 83767,83773 ----
  b9ed1e48c2076ab8bd9adfc96519f6d4  gcc/testsuite/gcc.target/i386/avx512fp16-builtin_shuffle-1.c
  262fe61d867c3bf99c20653180a2b0e0  gcc/testsuite/gcc.target/i386/avx512fp16-complex-constraints.c
  b087aa309dcb182d79cfcb79c9dd7901  gcc/testsuite/gcc.target/i386/avx512fp16-complex-fma.c
! 907c613e36c0c6fe7fbadf4bffd07e4f  gcc/testsuite/gcc.target/i386/avx512fp16-conjugation-1.c
  62ba9a2c64517f9e64fd9cb6e220a7bc  gcc/testsuite/gcc.target/i386/avx512fp16-dest-false-dep-for-glc.c
  970bc47c225c13b0c28a2f329533ddb7  gcc/testsuite/gcc.target/i386/avx512fp16-floatvnhf.c
  ac477f1c32fad10fc7a0406189e98ac6  gcc/testsuite/gcc.target/i386/avx512fp16-fma-1.c
*************** a1f4b75339c19727d3758c22b23b84a4  gcc/te
*** 83958,83964 ****
  fcf70bfc3c79dd61e55358d5bad50223  gcc/testsuite/gcc.target/i386/avx512fp16-xorsign-1.c
  9124b923004bf790ed4da1d0c675d320  gcc/testsuite/gcc.target/i386/avx512fp16vl-builtin-sqrt-1.c
  5e4929aedf1814bce1f01dc3cbc59c66  gcc/testsuite/gcc.target/i386/avx512fp16vl-complex-broadcast-1.c
! 721e2158f90fceedbbfa158cc64130e5  gcc/testsuite/gcc.target/i386/avx512fp16vl-conjugation-1.c
  a64a7d13af53410d9026bedcc7a9d6fb  gcc/testsuite/gcc.target/i386/avx512fp16vl-dest-false-dep-for-glc.c
  0115aca004331ab70002aa4d49e6f20d  gcc/testsuite/gcc.target/i386/avx512fp16vl-fma-1.c
  d22f16d05588a4dd223b55a41aab4cbd  gcc/testsuite/gcc.target/i386/avx512fp16vl-fma-vectorize-1.c
--- 83997,84003 ----
  fcf70bfc3c79dd61e55358d5bad50223  gcc/testsuite/gcc.target/i386/avx512fp16-xorsign-1.c
  9124b923004bf790ed4da1d0c675d320  gcc/testsuite/gcc.target/i386/avx512fp16vl-builtin-sqrt-1.c
  5e4929aedf1814bce1f01dc3cbc59c66  gcc/testsuite/gcc.target/i386/avx512fp16vl-complex-broadcast-1.c
! a047d78dfdd4df74e0489ca1aa22d951  gcc/testsuite/gcc.target/i386/avx512fp16vl-conjugation-1.c
  a64a7d13af53410d9026bedcc7a9d6fb  gcc/testsuite/gcc.target/i386/avx512fp16vl-dest-false-dep-for-glc.c
  0115aca004331ab70002aa4d49e6f20d  gcc/testsuite/gcc.target/i386/avx512fp16vl-fma-1.c
  d22f16d05588a4dd223b55a41aab4cbd  gcc/testsuite/gcc.target/i386/avx512fp16vl-fma-vectorize-1.c
*************** ae1ccb7e2041f3482999d81701ee97ed  gcc/te
*** 84072,84078 ****
  44f5fa114a15245b56519092be1d7465  gcc/testsuite/gcc.target/i386/avx512ifma-vpmaddluq-1a.c
  5a753e738033b0a079fb2f710c5fd40a  gcc/testsuite/gcc.target/i386/avx512ifma-vpmaddluq-1b.c
  3b96fd792360e8ef04bfaf7109ce2873  gcc/testsuite/gcc.target/i386/avx512ifma-vpmaddluq-2.c
! 7a89da980943c10241c8fae92f56405f  gcc/testsuite/gcc.target/i386/avx512vbmi-vpermb-1.c
  cddb99c63e0e76bfa9a96f8ad9706542  gcc/testsuite/gcc.target/i386/avx512vbmi-vpermb-2.c
  22e777ee742eabb49ca9c4bf3f1ab383  gcc/testsuite/gcc.target/i386/avx512vbmi-vpermi2b-1.c
  c75f41a84b0ff9e1454ea517888cf42e  gcc/testsuite/gcc.target/i386/avx512vbmi-vpermi2b-2.c
--- 84111,84117 ----
  44f5fa114a15245b56519092be1d7465  gcc/testsuite/gcc.target/i386/avx512ifma-vpmaddluq-1a.c
  5a753e738033b0a079fb2f710c5fd40a  gcc/testsuite/gcc.target/i386/avx512ifma-vpmaddluq-1b.c
  3b96fd792360e8ef04bfaf7109ce2873  gcc/testsuite/gcc.target/i386/avx512ifma-vpmaddluq-2.c
! 1db5e42f29e831ea8506ba844a1a040c  gcc/testsuite/gcc.target/i386/avx512vbmi-vpermb-1.c
  cddb99c63e0e76bfa9a96f8ad9706542  gcc/testsuite/gcc.target/i386/avx512vbmi-vpermb-2.c
  22e777ee742eabb49ca9c4bf3f1ab383  gcc/testsuite/gcc.target/i386/avx512vbmi-vpermi2b-1.c
  c75f41a84b0ff9e1454ea517888cf42e  gcc/testsuite/gcc.target/i386/avx512vbmi-vpermi2b-2.c
*************** a73dcafcd0e78eb661d1280e63a1ff15  gcc/te
*** 84256,84262 ****
  6dd6969e7a61221a3a0de4cd582ead9f  gcc/testsuite/gcc.target/i386/avx512vl-vcvtdq2ps-2.c
  733fff5dc1727f74c9dcb9847d217591  gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2dq-1.c
  d7ea6edadf48104bfaaea869ee64c034  gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2dq-2.c
! 152d8645459a4e64ede54d73094fe629  gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2ps-1.c
  480cf88b17091acad80e8e0a94b8c9e5  gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2ps-2.c
  fee5bd9160a6da64b7f1104bb5a4fa02  gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2qq-2.c
  ddb0b188eff1e6242b903d8dcb3e195f  gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2udq-1.c
--- 84295,84301 ----
  6dd6969e7a61221a3a0de4cd582ead9f  gcc/testsuite/gcc.target/i386/avx512vl-vcvtdq2ps-2.c
  733fff5dc1727f74c9dcb9847d217591  gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2dq-1.c
  d7ea6edadf48104bfaaea869ee64c034  gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2dq-2.c
! 3adeae0f900719f04fad396b3c77a5b7  gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2ps-1.c
  480cf88b17091acad80e8e0a94b8c9e5  gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2ps-2.c
  fee5bd9160a6da64b7f1104bb5a4fa02  gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2qq-2.c
  ddb0b188eff1e6242b903d8dcb3e195f  gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2udq-1.c
*************** bbf5d335cde2813c4a5a8ad9af1fbb3b  gcc/te
*** 84352,84358 ****
  52f39be84b7c7706e1b15c6e2b4952b4  gcc/testsuite/gcc.target/i386/avx512vl-vgetmantpd-2.c
  405bb47c14cb768ccaf025b0f593c168  gcc/testsuite/gcc.target/i386/avx512vl-vgetmantps-1.c
  01c6359460f1b25ce41c065dc8cb796f  gcc/testsuite/gcc.target/i386/avx512vl-vgetmantps-2.c
! 001eae36b3b6503f930afc24369a6326  gcc/testsuite/gcc.target/i386/avx512vl-vinsert-1.c
  1b24059ae5c96b8e485bbebaab9fc500  gcc/testsuite/gcc.target/i386/avx512vl-vinsertf32x4-1.c
  f5cb77ce98010772ed858dca8bb5fcfd  gcc/testsuite/gcc.target/i386/avx512vl-vinsertf32x4-2.c
  46f449615ccf131bf6fb64fcfefcfb00  gcc/testsuite/gcc.target/i386/avx512vl-vinsertf64x2-2.c
--- 84391,84397 ----
  52f39be84b7c7706e1b15c6e2b4952b4  gcc/testsuite/gcc.target/i386/avx512vl-vgetmantpd-2.c
  405bb47c14cb768ccaf025b0f593c168  gcc/testsuite/gcc.target/i386/avx512vl-vgetmantps-1.c
  01c6359460f1b25ce41c065dc8cb796f  gcc/testsuite/gcc.target/i386/avx512vl-vgetmantps-2.c
! 679370333921f0bad97a3743646c2fae  gcc/testsuite/gcc.target/i386/avx512vl-vinsert-1.c
  1b24059ae5c96b8e485bbebaab9fc500  gcc/testsuite/gcc.target/i386/avx512vl-vinsertf32x4-1.c
  f5cb77ce98010772ed858dca8bb5fcfd  gcc/testsuite/gcc.target/i386/avx512vl-vinsertf32x4-2.c
  46f449615ccf131bf6fb64fcfefcfb00  gcc/testsuite/gcc.target/i386/avx512vl-vinsertf64x2-2.c
*************** a04eae0d97147748e91f0a1c3cb481dc  gcc/te
*** 84704,84710 ****
  cc32ad2101ced4775f9a0f47f076823a  gcc/testsuite/gcc.target/i386/avx512vl-vpmulhrsw-3.c
  6ba002033debb0c1f5514ae9eca66dab  gcc/testsuite/gcc.target/i386/avx512vl-vpmulhuw-2.c
  60a7c7484888c6ec4389292d159d350d  gcc/testsuite/gcc.target/i386/avx512vl-vpmulhw-2.c
! 7c0edc289b1d5d88b84ed9e028afd355  gcc/testsuite/gcc.target/i386/avx512vl-vpmulld-1.c
  77fc43d97c0670ba510f5924e220ea71  gcc/testsuite/gcc.target/i386/avx512vl-vpmulld-2.c
  f9ba97b50f2829719e34d93438697f3a  gcc/testsuite/gcc.target/i386/avx512vl-vpmullq-2.c
  cd9af6e1a34bccdfb097a343a87808ae  gcc/testsuite/gcc.target/i386/avx512vl-vpmullw-2.c
--- 84743,84749 ----
  cc32ad2101ced4775f9a0f47f076823a  gcc/testsuite/gcc.target/i386/avx512vl-vpmulhrsw-3.c
  6ba002033debb0c1f5514ae9eca66dab  gcc/testsuite/gcc.target/i386/avx512vl-vpmulhuw-2.c
  60a7c7484888c6ec4389292d159d350d  gcc/testsuite/gcc.target/i386/avx512vl-vpmulhw-2.c
! b5fa649d906633e217fe64bf27652ea5  gcc/testsuite/gcc.target/i386/avx512vl-vpmulld-1.c
  77fc43d97c0670ba510f5924e220ea71  gcc/testsuite/gcc.target/i386/avx512vl-vpmulld-2.c
  f9ba97b50f2829719e34d93438697f3a  gcc/testsuite/gcc.target/i386/avx512vl-vpmullq-2.c
  cd9af6e1a34bccdfb097a343a87808ae  gcc/testsuite/gcc.target/i386/avx512vl-vpmullw-2.c
*************** ac6c7bc2ee7675dc70020738c525bf7d  gcc/te
*** 84814,84820 ****
  906f8a75a3c99082cf26f790ea524e80  gcc/testsuite/gcc.target/i386/avx512vl-vpternlogq-1.c
  059629a7d865f0a7c9ee0875d5d00f0c  gcc/testsuite/gcc.target/i386/avx512vl-vpternlogq-2.c
  ade7f003c13ecf8ff0246939215f0e67  gcc/testsuite/gcc.target/i386/avx512vl-vptestmb-2.c
! 677d94288d058fd718c84cc202029a07  gcc/testsuite/gcc.target/i386/avx512vl-vptestmd-1.c
  140e2f20ab306c12156b6edade05988c  gcc/testsuite/gcc.target/i386/avx512vl-vptestmd-2.c
  62814a93b35b9d97e6ee2c27f619a1a8  gcc/testsuite/gcc.target/i386/avx512vl-vptestmq-1.c
  3f56fd981dda1b327f2d10429e3a16d5  gcc/testsuite/gcc.target/i386/avx512vl-vptestmq-2.c
--- 84853,84859 ----
  906f8a75a3c99082cf26f790ea524e80  gcc/testsuite/gcc.target/i386/avx512vl-vpternlogq-1.c
  059629a7d865f0a7c9ee0875d5d00f0c  gcc/testsuite/gcc.target/i386/avx512vl-vpternlogq-2.c
  ade7f003c13ecf8ff0246939215f0e67  gcc/testsuite/gcc.target/i386/avx512vl-vptestmb-2.c
! 477f7f21eb20df99e3ee8cbaf5696762  gcc/testsuite/gcc.target/i386/avx512vl-vptestmd-1.c
  140e2f20ab306c12156b6edade05988c  gcc/testsuite/gcc.target/i386/avx512vl-vptestmd-2.c
  62814a93b35b9d97e6ee2c27f619a1a8  gcc/testsuite/gcc.target/i386/avx512vl-vptestmq-1.c
  3f56fd981dda1b327f2d10429e3a16d5  gcc/testsuite/gcc.target/i386/avx512vl-vptestmq-2.c
*************** d8084141e791dfdf62ee3dc66173d458  gcc/te
*** 84921,84926 ****
--- 84960,84966 ----
  625af58a48cf30c77cdd2892f64c3d9c  gcc/testsuite/gcc.target/i386/avx512vpopcntdqvl-pr97770-1.c
  bd110cc98a6c83e36f31c6c68e28123c  gcc/testsuite/gcc.target/i386/avx512vpopcntdqvl-vpopcntd-1.c
  17d28bf7cef176269dc5873687b13c9f  gcc/testsuite/gcc.target/i386/avx512vpopcntdqvl-vpopcntq-1.c
+ 8ac2377d76855df8d689ea84214237dd  gcc/testsuite/gcc.target/i386/avx_vbroadcastf128.c
  5da8354c1b0f081b6c64be550d4b604e  gcc/testsuite/gcc.target/i386/avxfp-1.c
  96da42bfb9b55e417c89693514ae20a6  gcc/testsuite/gcc.target/i386/avxfp-2.c
  886ec1208d19dfac1038071807c2c23b  gcc/testsuite/gcc.target/i386/avxneconvert-1.c
*************** b581c7e9554c3e76b8ca8481c7c36168  gcc/te
*** 84947,84953 ****
  674019fac54e0c27947386666000a1c8  gcc/testsuite/gcc.target/i386/bitfield2.c
  f453ea0129a9fcdd06a9ec24524c1cb9  gcc/testsuite/gcc.target/i386/bitfield3.c
  9a4090444bb3ef253261728d33aa87e3  gcc/testsuite/gcc.target/i386/bittest.c
! 1efa0c8157f05bec88ec14bf171c17de  gcc/testsuite/gcc.target/i386/bitwise_mask_op-1.c
  6f59afd7fbef39ba5e5377903ca13bdf  gcc/testsuite/gcc.target/i386/bitwise_mask_op-2.c
  e1228efcdb6bf353fa7c28bd12b9b98c  gcc/testsuite/gcc.target/i386/bitwise_mask_op-3.c
  be2f67968aaa0963cbb0968b7acbd1d6  gcc/testsuite/gcc.target/i386/blendv-1.c
--- 84987,84993 ----
  674019fac54e0c27947386666000a1c8  gcc/testsuite/gcc.target/i386/bitfield2.c
  f453ea0129a9fcdd06a9ec24524c1cb9  gcc/testsuite/gcc.target/i386/bitfield3.c
  9a4090444bb3ef253261728d33aa87e3  gcc/testsuite/gcc.target/i386/bittest.c
! 173019f7dbfd3763f8cf21626bd4c4db  gcc/testsuite/gcc.target/i386/bitwise_mask_op-1.c
  6f59afd7fbef39ba5e5377903ca13bdf  gcc/testsuite/gcc.target/i386/bitwise_mask_op-2.c
  e1228efcdb6bf353fa7c28bd12b9b98c  gcc/testsuite/gcc.target/i386/bitwise_mask_op-3.c
  be2f67968aaa0963cbb0968b7acbd1d6  gcc/testsuite/gcc.target/i386/blendv-1.c
*************** a624ecc6ad55c00744cc7479a41b013e  gcc/te
*** 85202,85212 ****
  a041a47c0d060a13626e87e95e95dec3  gcc/testsuite/gcc.target/i386/cond_op_maxmin_w-2.c
  06f71debb8664e614ef07b38e8636e88  gcc/testsuite/gcc.target/i386/cond_op_shift_d-1.c
  7f1ceb4b292c3084e0d069f4b668a15e  gcc/testsuite/gcc.target/i386/cond_op_shift_d-2.c
! 6e7a73c89aeeeb44357cf86928793ef9  gcc/testsuite/gcc.target/i386/cond_op_shift_q-1.c
  4cd1930b02e6784fccbe626cb06c210a  gcc/testsuite/gcc.target/i386/cond_op_shift_q-2.c
! bfc87b8dbf2807918e6513dc6f484f57  gcc/testsuite/gcc.target/i386/cond_op_shift_ud-1.c
  5bb4dded7a8347833adbe0dfe971c29d  gcc/testsuite/gcc.target/i386/cond_op_shift_ud-2.c
! cd9ef7962ff5bf0b678c169a4ae85ea8  gcc/testsuite/gcc.target/i386/cond_op_shift_uq-1.c
  dab356ea11d5fa31aa2ad62b03eaba0e  gcc/testsuite/gcc.target/i386/cond_op_shift_uq-2.c
  4d9dea8d178b3ac2ddadb8211e6e9270  gcc/testsuite/gcc.target/i386/cond_op_shift_uw-1.c
  91bf73c2fd62790b28f15e1a555e949e  gcc/testsuite/gcc.target/i386/cond_op_shift_uw-2.c
--- 85242,85252 ----
  a041a47c0d060a13626e87e95e95dec3  gcc/testsuite/gcc.target/i386/cond_op_maxmin_w-2.c
  06f71debb8664e614ef07b38e8636e88  gcc/testsuite/gcc.target/i386/cond_op_shift_d-1.c
  7f1ceb4b292c3084e0d069f4b668a15e  gcc/testsuite/gcc.target/i386/cond_op_shift_d-2.c
! 62c6fbea8ec9b5847a563d3efd65bc3a  gcc/testsuite/gcc.target/i386/cond_op_shift_q-1.c
  4cd1930b02e6784fccbe626cb06c210a  gcc/testsuite/gcc.target/i386/cond_op_shift_q-2.c
! 9c92c2257c6a7aaa2fc27f3bf56b8e3c  gcc/testsuite/gcc.target/i386/cond_op_shift_ud-1.c
  5bb4dded7a8347833adbe0dfe971c29d  gcc/testsuite/gcc.target/i386/cond_op_shift_ud-2.c
! 2698ec07eb03e5495469e1b2a35eee17  gcc/testsuite/gcc.target/i386/cond_op_shift_uq-1.c
  dab356ea11d5fa31aa2ad62b03eaba0e  gcc/testsuite/gcc.target/i386/cond_op_shift_uq-2.c
  4d9dea8d178b3ac2ddadb8211e6e9270  gcc/testsuite/gcc.target/i386/cond_op_shift_uw-1.c
  91bf73c2fd62790b28f15e1a555e949e  gcc/testsuite/gcc.target/i386/cond_op_shift_uw-2.c
*************** cda0d89452347311cc45a79be2d8f0fc  gcc/te
*** 85740,85746 ****
  a2854f7fe83760cab7c18efaa883fa19  gcc/testsuite/gcc.target/i386/memcpy-pr120708-4.c
  cab1fad7719db80bf7a5c712c8e07f67  gcc/testsuite/gcc.target/i386/memcpy-pr120708-5.c
  59f59b38785765ee58f5364967ec6317  gcc/testsuite/gcc.target/i386/memcpy-pr120708-6.c
! 27b4fc4c0b0ecbd4614a4e9af86a6a18  gcc/testsuite/gcc.target/i386/memcpy-pr95886.c
  11e1d1767b79743e4e65a799f3369907  gcc/testsuite/gcc.target/i386/memcpy-strategy-1.c
  b82d9188c52a269893b5ac6b25f9e515  gcc/testsuite/gcc.target/i386/memcpy-strategy-10.c
  619cbc26dc85de4ded3f5a985d0a23a2  gcc/testsuite/gcc.target/i386/memcpy-strategy-11.c
--- 85780,85786 ----
  a2854f7fe83760cab7c18efaa883fa19  gcc/testsuite/gcc.target/i386/memcpy-pr120708-4.c
  cab1fad7719db80bf7a5c712c8e07f67  gcc/testsuite/gcc.target/i386/memcpy-pr120708-5.c
  59f59b38785765ee58f5364967ec6317  gcc/testsuite/gcc.target/i386/memcpy-pr120708-6.c
! ddb515e6955a2e895cb9e026084d6457  gcc/testsuite/gcc.target/i386/memcpy-pr95886.c
  11e1d1767b79743e4e65a799f3369907  gcc/testsuite/gcc.target/i386/memcpy-strategy-1.c
  b82d9188c52a269893b5ac6b25f9e515  gcc/testsuite/gcc.target/i386/memcpy-strategy-10.c
  619cbc26dc85de4ded3f5a985d0a23a2  gcc/testsuite/gcc.target/i386/memcpy-strategy-11.c
*************** e015c782d5b49dadd97d26626e42640b  gcc/te
*** 85961,85967 ****
  64335d6cecf643b8ef62a44976333099  gcc/testsuite/gcc.target/i386/part-vect-hf-convert-1.c
  0bbbaf7c87c9713f3422ad4f48fe1cb8  gcc/testsuite/gcc.target/i386/part-vect-popcount-1.c
  0768d0b749af0eb1fb571374da5d942d  gcc/testsuite/gcc.target/i386/part-vect-roundhf.c
! 519a7daf109eddf310406d5e83d8eaf1  gcc/testsuite/gcc.target/i386/part-vect-sqrtph-1.c
  31734708de70d5c51bac1f7ae186bbd4  gcc/testsuite/gcc.target/i386/part-vect-vec_cmpbf.c
  ddb983a4fc4f72a8d948b07ead39c6ff  gcc/testsuite/gcc.target/i386/part-vect-vec_cmphf.c
  b7b34404037d059764a956af000e887b  gcc/testsuite/gcc.target/i386/part-vect-vec_elem-1.c
--- 86001,86007 ----
  64335d6cecf643b8ef62a44976333099  gcc/testsuite/gcc.target/i386/part-vect-hf-convert-1.c
  0bbbaf7c87c9713f3422ad4f48fe1cb8  gcc/testsuite/gcc.target/i386/part-vect-popcount-1.c
  0768d0b749af0eb1fb571374da5d942d  gcc/testsuite/gcc.target/i386/part-vect-roundhf.c
! 3f352e077aa32a95ab59664c0de0c3a0  gcc/testsuite/gcc.target/i386/part-vect-sqrtph-1.c
  31734708de70d5c51bac1f7ae186bbd4  gcc/testsuite/gcc.target/i386/part-vect-vec_cmpbf.c
  ddb983a4fc4f72a8d948b07ead39c6ff  gcc/testsuite/gcc.target/i386/part-vect-vec_cmphf.c
  b7b34404037d059764a956af000e887b  gcc/testsuite/gcc.target/i386/part-vect-vec_elem-1.c
*************** cbaafd43310e10a7ba4ce687bafe06da  gcc/te
*** 85992,86002 ****
  89d909d7d758041e829631ac800bf196  gcc/testsuite/gcc.target/i386/pieces-memcpy-15.c
  437a6c001b5f504cb8a978424f9f229c  gcc/testsuite/gcc.target/i386/pieces-memcpy-16.c
  a0fc0b89838032f850b17823a354b986  gcc/testsuite/gcc.target/i386/pieces-memcpy-17.c
! ce99ca62859e3b5ee0e5695b59309237  gcc/testsuite/gcc.target/i386/pieces-memcpy-18.c
  b5f6fb3aaac27e15ae52d9111e60d98d  gcc/testsuite/gcc.target/i386/pieces-memcpy-19.c
  279c04d20615905ca5bf2f44eb5a231d  gcc/testsuite/gcc.target/i386/pieces-memcpy-2.c
  7e2d486487e1f536c226d8bc290fd8ad  gcc/testsuite/gcc.target/i386/pieces-memcpy-20.c
! 2f4b551b9d6addea576cff08a8831f3f  gcc/testsuite/gcc.target/i386/pieces-memcpy-21.c
  483ed3c0a5b3efe685343cb5dc87d54d  gcc/testsuite/gcc.target/i386/pieces-memcpy-22.c
  2820c9b91ec98c38843764eea07d4b75  gcc/testsuite/gcc.target/i386/pieces-memcpy-3.c
  698986063dd5ba005476ca849de14359  gcc/testsuite/gcc.target/i386/pieces-memcpy-4.c
--- 86032,86042 ----
  89d909d7d758041e829631ac800bf196  gcc/testsuite/gcc.target/i386/pieces-memcpy-15.c
  437a6c001b5f504cb8a978424f9f229c  gcc/testsuite/gcc.target/i386/pieces-memcpy-16.c
  a0fc0b89838032f850b17823a354b986  gcc/testsuite/gcc.target/i386/pieces-memcpy-17.c
! 7a34703054f1d16fc3e3de2cc1b87012  gcc/testsuite/gcc.target/i386/pieces-memcpy-18.c
  b5f6fb3aaac27e15ae52d9111e60d98d  gcc/testsuite/gcc.target/i386/pieces-memcpy-19.c
  279c04d20615905ca5bf2f44eb5a231d  gcc/testsuite/gcc.target/i386/pieces-memcpy-2.c
  7e2d486487e1f536c226d8bc290fd8ad  gcc/testsuite/gcc.target/i386/pieces-memcpy-20.c
! 9d90237b50551a44a67d354724502ebb  gcc/testsuite/gcc.target/i386/pieces-memcpy-21.c
  483ed3c0a5b3efe685343cb5dc87d54d  gcc/testsuite/gcc.target/i386/pieces-memcpy-22.c
  2820c9b91ec98c38843764eea07d4b75  gcc/testsuite/gcc.target/i386/pieces-memcpy-3.c
  698986063dd5ba005476ca849de14359  gcc/testsuite/gcc.target/i386/pieces-memcpy-4.c
*************** ab6fa2bfe98c867fab182d157d457706  gcc/te
*** 86045,86054 ****
  d98f40e3e5aa8e8b9f5499569f688965  gcc/testsuite/gcc.target/i386/pieces-memset-43.c
  2b47b7f82aeabc7a238642520819b3f0  gcc/testsuite/gcc.target/i386/pieces-memset-44.c
  86947bff2a1eb3faba119670600994db  gcc/testsuite/gcc.target/i386/pieces-memset-45.c
! f29f6d2af05e1f08f148f0eed162d860  gcc/testsuite/gcc.target/i386/pieces-memset-46.c
  8f0614f1d8cbc09d9e6e515b9c85586c  gcc/testsuite/gcc.target/i386/pieces-memset-47.c
  fab4224ceed336ed6902793909c0c6c2  gcc/testsuite/gcc.target/i386/pieces-memset-48.c
! b6a5763cac2b72e43f0900c7fbca0740  gcc/testsuite/gcc.target/i386/pieces-memset-49.c
  e59e962761850423b307c01f720c8e84  gcc/testsuite/gcc.target/i386/pieces-memset-5.c
  f6afe5571570af54d1d2e02c0e28d3f6  gcc/testsuite/gcc.target/i386/pieces-memset-50.c
  587ca57e48d1c64f4cb91b6203512c99  gcc/testsuite/gcc.target/i386/pieces-memset-51.c
--- 86085,86094 ----
  d98f40e3e5aa8e8b9f5499569f688965  gcc/testsuite/gcc.target/i386/pieces-memset-43.c
  2b47b7f82aeabc7a238642520819b3f0  gcc/testsuite/gcc.target/i386/pieces-memset-44.c
  86947bff2a1eb3faba119670600994db  gcc/testsuite/gcc.target/i386/pieces-memset-45.c
! 3647374ee718421444609e296cfa0ad2  gcc/testsuite/gcc.target/i386/pieces-memset-46.c
  8f0614f1d8cbc09d9e6e515b9c85586c  gcc/testsuite/gcc.target/i386/pieces-memset-47.c
  fab4224ceed336ed6902793909c0c6c2  gcc/testsuite/gcc.target/i386/pieces-memset-48.c
! 9f2ed79a200ad2a71bf00d1e582aae79  gcc/testsuite/gcc.target/i386/pieces-memset-49.c
  e59e962761850423b307c01f720c8e84  gcc/testsuite/gcc.target/i386/pieces-memset-5.c
  f6afe5571570af54d1d2e02c0e28d3f6  gcc/testsuite/gcc.target/i386/pieces-memset-50.c
  587ca57e48d1c64f4cb91b6203512c99  gcc/testsuite/gcc.target/i386/pieces-memset-51.c
*************** a13005b8d335d0bb4a94a393643b9675  gcc/te
*** 86473,86479 ****
  b6651f168ffe28ac771bed1805289bf6  gcc/testsuite/gcc.target/i386/pr107432-4.c
  7e4ae21847637b7e1e32167570c4ef0f  gcc/testsuite/gcc.target/i386/pr107432-5.c
  c2befdfba96acc91539cffea7d56a034  gcc/testsuite/gcc.target/i386/pr107432-6.c
! df5dc5946d5640eaf390e900d8538c90  gcc/testsuite/gcc.target/i386/pr107432-7.c
  7b5625e77c75cab9270770dbc5fee670  gcc/testsuite/gcc.target/i386/pr107432-8.c
  0995901a558b5b41785e414163e26c97  gcc/testsuite/gcc.target/i386/pr107432-9.c
  e2d688af45e4fff4045c47d283b9a3f3  gcc/testsuite/gcc.target/i386/pr107540.c
--- 86513,86519 ----
  b6651f168ffe28ac771bed1805289bf6  gcc/testsuite/gcc.target/i386/pr107432-4.c
  7e4ae21847637b7e1e32167570c4ef0f  gcc/testsuite/gcc.target/i386/pr107432-5.c
  c2befdfba96acc91539cffea7d56a034  gcc/testsuite/gcc.target/i386/pr107432-6.c
! a7eccdbbf3de4d0269b1c93130a1424a  gcc/testsuite/gcc.target/i386/pr107432-7.c
  7b5625e77c75cab9270770dbc5fee670  gcc/testsuite/gcc.target/i386/pr107432-8.c
  0995901a558b5b41785e414163e26c97  gcc/testsuite/gcc.target/i386/pr107432-9.c
  e2d688af45e4fff4045c47d283b9a3f3  gcc/testsuite/gcc.target/i386/pr107540.c
*************** e17710962215b2fb5e88ba71ef85c9a1  gcc/te
*** 86930,86935 ****
--- 86970,86985 ----
  f9eebd6cace65460975a88f37b9e15eb  gcc/testsuite/gcc.target/i386/pr121725-1b.c
  5f918da94624837422839151fb9030bf  gcc/testsuite/gcc.target/i386/pr121861-1a.c
  2f572062e15d70ca97f9876842049bc9  gcc/testsuite/gcc.target/i386/pr121861-1b.c
+ 0424be5958b1e4555f4bc906f8604a14  gcc/testsuite/gcc.target/i386/pr121934-1a.c
+ fb77d6d584e12d8b7ad993884cf05d65  gcc/testsuite/gcc.target/i386/pr121934-1b.c
+ fb7079c680caec2d7b9895e6acd32870  gcc/testsuite/gcc.target/i386/pr121934-2a.c
+ fb1cd84171e92c4f4f9c1c6354aa2c73  gcc/testsuite/gcc.target/i386/pr121934-2b.c
+ bfd29f032b9eb39df2f519ce5350db9a  gcc/testsuite/gcc.target/i386/pr121934-3a.c
+ 0cd9fa5082a6b75e02ac308b895e0d43  gcc/testsuite/gcc.target/i386/pr121934-3b.c
+ 179416d6c3102d7d079cd2e1f46ba340  gcc/testsuite/gcc.target/i386/pr121934-4a.c
+ dff684f08a4dc4184ca929f14d99767e  gcc/testsuite/gcc.target/i386/pr121934-4b.c
+ d2e0d6146b057e3b3cbcbdb57a656d82  gcc/testsuite/gcc.target/i386/pr121934-5a.c
+ 9049f7716994299e74114bae9313a56b  gcc/testsuite/gcc.target/i386/pr121934-5b.c
  f99f88a6e994ad6e55e065e41bc58f8f  gcc/testsuite/gcc.target/i386/pr12329.c
  8951a1fa31f2d45ef9eacfff6a733f77  gcc/testsuite/gcc.target/i386/pr13366.c
  9a752a4b3b77930d91d3c8b0c8897b90  gcc/testsuite/gcc.target/i386/pr13685.c
*************** bce12f30738edf2774ad07623978e78c  gcc/te
*** 88366,88372 ****
  96469657c46a5db9e093206d585159bb  gcc/testsuite/gcc.target/i386/pr88796.c
  7af4459509529efc78f8cbe44f73cabd  gcc/testsuite/gcc.target/i386/pr88809-2.c
  8497072c958cb5494396edf468b39239  gcc/testsuite/gcc.target/i386/pr88809.c
! 9d682528b30cb290cfb279d4345c67ed  gcc/testsuite/gcc.target/i386/pr88828-0.c
  1631afdc742b2d2a76424ee57448ca33  gcc/testsuite/gcc.target/i386/pr88828-1.c
  168b94889653fec10c76f9f092653a2e  gcc/testsuite/gcc.target/i386/pr88828-1a.c
  6a5173e40ac3a2d73ca7b06d5b823813  gcc/testsuite/gcc.target/i386/pr88828-1b.c
--- 88416,88422 ----
  96469657c46a5db9e093206d585159bb  gcc/testsuite/gcc.target/i386/pr88796.c
  7af4459509529efc78f8cbe44f73cabd  gcc/testsuite/gcc.target/i386/pr88809-2.c
  8497072c958cb5494396edf468b39239  gcc/testsuite/gcc.target/i386/pr88809.c
! f55e8b5a9a98d64953ede9b467fb6edf  gcc/testsuite/gcc.target/i386/pr88828-0.c
  1631afdc742b2d2a76424ee57448ca33  gcc/testsuite/gcc.target/i386/pr88828-1.c
  168b94889653fec10c76f9f092653a2e  gcc/testsuite/gcc.target/i386/pr88828-1a.c
  6a5173e40ac3a2d73ca7b06d5b823813  gcc/testsuite/gcc.target/i386/pr88828-1b.c
*************** f2246fb526840289cc94bd7e8b0c994a  gcc/te
*** 89871,89877 ****
  96ca3bdabd9bff8485a81bfe7ace5884  gcc/testsuite/gcc.target/i386/vect-epilogues-1.c
  17c2d170d498fc9c2649c0cb8d5bd3b9  gcc/testsuite/gcc.target/i386/vect-epilogues-2.c
  0cdc2fbe9ff36733bd7f8f345b352aa9  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
--- 89921,89927 ----
  96ca3bdabd9bff8485a81bfe7ace5884  gcc/testsuite/gcc.target/i386/vect-epilogues-1.c
  17c2d170d498fc9c2649c0cb8d5bd3b9  gcc/testsuite/gcc.target/i386/vect-epilogues-2.c
  0cdc2fbe9ff36733bd7f8f345b352aa9  gcc/testsuite/gcc.target/i386/vect-epilogues-3.c
! 96d83c1100ee48a3e94fc3aea99f8c6b  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
*************** dde2cba27bc4292492e4c0dd492a70e0  gcc/te
*** 90330,90335 ****
--- 90380,90386 ----
  359760e5160f4b52d2fa349806589a0d  gcc/testsuite/gcc.target/loongarch/pr121064.c
  acf1fac916847c2064b8d2bbb6535828  gcc/testsuite/gcc.target/loongarch/pr121542.c
  754f11f1533603a4d550b593afc0c673  gcc/testsuite/gcc.target/loongarch/pr121634.c
+ 1dd25b33f6fd8d4c4dc750865d86f404  gcc/testsuite/gcc.target/loongarch/pr121906.c
  1eac553341d725c6e59615b593aedb0d  gcc/testsuite/gcc.target/loongarch/pragma-push-pop.c
  3adba2a8ae6f671eb22ec8228777c1ac  gcc/testsuite/gcc.target/loongarch/prolog-opt.c
  1bfa30f99dc5f04f569fbff68640ab19  gcc/testsuite/gcc.target/loongarch/recip-divf.c
*************** de4aad186db1699e7a1c579eacca24f8  gcc/te
*** 94996,95001 ****
--- 95047,95053 ----
  317a36045c038af971baf417e032ee47  gcc/testsuite/gcc.target/riscv/attribute-zce-3.c
  0e193122ac4c7b12a1de8876dc48ff1e  gcc/testsuite/gcc.target/riscv/attribute-zce-4.c
  3df27341bf15cae561a9680429bae764  gcc/testsuite/gcc.target/riscv/bclr-for-simode-1.c
+ 40eb658c86c8f9d61968188b246610a2  gcc/testsuite/gcc.target/riscv/bclr-lowest-set-bit-1.c
  dafbb9f1e1691d3d70f62ae5201b1965  gcc/testsuite/gcc.target/riscv/bext-ext-2.c
  dfe458767e63b41b24c59059a8cfe507  gcc/testsuite/gcc.target/riscv/bext-ext.c
  c6a17fe16a8de24e823815f272f8e895  gcc/testsuite/gcc.target/riscv/bf16_arithmetic.c
*************** ceb3a68ee73bf0860222addabfa4e62b  gcc/te
*** 95787,95797 ****
--- 95839,95852 ----
  e70f44b248ae6fb211c33c6023159241  gcc/testsuite/gcc.target/riscv/pr120553-8.c
  d8e76b4cd45daa82499151eedc966298  gcc/testsuite/gcc.target/riscv/pr120659.c
  0cdcf97373ed486ded9f3c10ef04348d  gcc/testsuite/gcc.target/riscv/pr120714.c
+ 2694e9bd7c85c6f3d66e15d1bd81cd07  gcc/testsuite/gcc.target/riscv/pr120811.c
  6437d8ec53cc1530c20baacd9ca47eba  gcc/testsuite/gcc.target/riscv/pr121113.c
  25c459137bd9938c72fff727f3c7b5d4  gcc/testsuite/gcc.target/riscv/pr121160.c
  0b64699a31b25d6d22c6908dabe89a74  gcc/testsuite/gcc.target/riscv/pr121531.c
  052b9719ef24512ba3a9a1495eebcb2a  gcc/testsuite/gcc.target/riscv/pr121878.c
+ ea89beffad7d3445e7faf4e7b1b31944  gcc/testsuite/gcc.target/riscv/pr121983.c
  37a08389ba95284cc27832767dfc1430  gcc/testsuite/gcc.target/riscv/pr43644.c
+ db206807e7e87fc388e039471812c6e0  gcc/testsuite/gcc.target/riscv/pr58727.c
  10400130cc47973d43925669f3c795ed  gcc/testsuite/gcc.target/riscv/pr84660.c
  c2ac0b53d6af56f5ec5bded3d252dddc  gcc/testsuite/gcc.target/riscv/pr93202.c
  01c8227bf1b5efa52e434a407c33930d  gcc/testsuite/gcc.target/riscv/pr93304.c
*************** cf801f2e1c669d164d4ceb3cd657f647  gcc/te
*** 96628,96633 ****
--- 96683,96689 ----
  ed132fcfade8212b992e822b341be9eb  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr121742.c
  eda1f0d5c82c50988ede53858da3cabd  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr121780.c
  cbc44c5c7fa77e3f0d3efc55779bba4b  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr121781.c
+ 357366e34138686786040d7711285496  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr121910.c
  ee8bcba5f6876f2027f0f263f81465aa  gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/extract_last-1.c
  7ff884bfa2e6cf9bc4c6172466538515  gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/extract_last-10.c
  b2792e9264dcd6fa2e88f495d51677e6  gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/extract_last-11.c
*************** a8b69d6e4817f06059591ac07092f715  gcc/te
*** 97181,97186 ****
--- 97237,97245 ----
  0740ed4b0bccf8a95f3268d85feb4109  gcc/testsuite/gcc.target/riscv/rvv/autovec/scalable-1.c
  f00c659d5e0b9bcb12ef31391dd22cdc  gcc/testsuite/gcc.target/riscv/rvv/autovec/series-1.c
  d64c9f6fe7344abd3299437c1ef4dfb7  gcc/testsuite/gcc.target/riscv/rvv/autovec/series_run-1.c
+ 2ba53da72c8581d9539b778945f4cf48  gcc/testsuite/gcc.target/riscv/rvv/autovec/shuffle-slide-run.h
+ f8dab1a5e995006acd7b3ef2dc4f2bcd  gcc/testsuite/gcc.target/riscv/rvv/autovec/shuffle-slidedown-run.c
+ 1663e10813b7026e0300785ca2de3ca6  gcc/testsuite/gcc.target/riscv/rvv/autovec/shuffle-slideup-run.c
  8e40a987eb306df9e33adf3d96c885ad  gcc/testsuite/gcc.target/riscv/rvv/autovec/slp-interleave-1.c
  e361b814d6c1a2db0378e33bb0f45a2d  gcc/testsuite/gcc.target/riscv/rvv/autovec/slp-interleave-2.c
  3576af7e98c5aa20081a56bb4b37c74d  gcc/testsuite/gcc.target/riscv/rvv/autovec/slp-interleave-3.c
*************** c765369ff3aff0333c4a2ac3d0a39e25  gcc/te
*** 97666,97671 ****
--- 97725,97737 ----
  7e89f3a7d2465bd1017f2024f03337c2  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-interleave.c
  00c36fd5ca0136a6f17b4071dcb8af38  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slide-run.c
  1b4d0463f44d14c19f4d02259d509a9e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slide.c
+ 2761f3f732e71421249a98794cd7c82a  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slide.h
+ 427a7a5ff256a6261e7cac5bfc63bdd2  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-1.c
+ 7037d0b7f314378828748d3cb621f1d9  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-2.c
+ 00f4296852fbe301269b8e71153d1fe6  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-perm.h
+ 3186ba14e19af1727799431ff9da0f7a  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slideup-1.c
+ 0b8409a2b7e9ab3d60abedfd258159b1  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slideup-2.c
+ b36633c19b388332a46c2d831d64b9dd  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slideup-perm.h
  1da39a509d6843259bd55783b0519c84  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/trailing-1.c
  63dcd9ceec900f6d93d602a46219484d  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/trailing-2.c
  d872d21ec4d4f80b7cd59a9ff702bc0a  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/trailing_run-1.c
*************** dd58b7a375ca415fa00dec0460c50c24  gcc/te
*** 98224,98248 ****
  f8449da573246d363e4443b9f32f0f06  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i32.c
  4abdc71a4d78eff367f15f9be04fb7fc  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i64.c
  b231dddff3540c987b251cf413e96a0c  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i8.c
! 41195ae1a560497bc3bab8eced6511ef  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c
! 30f59920c22d2356fb6195c0cabbd378  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c
! 5247a96758e1c5aac4164c3ee01b2c6a  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c
  4bd4d8465912fd31ef999b199164b3c7  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c
  97a4318491ad584290f2b2bef781322e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i16.c
  935c9835493916f219759aed3d339ec9  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i32.c
  59608a9e1c34d3e1d054335c9a90bd97  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i64.c
  b1a59a3d1b37b0c7a1ff38505ab7a17b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i8.c
! 305184dc2e2411d2bd50b5bdfaa87ffb  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c
! e5e0dbd6b6a67b4f7674ea364d845cc4  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c
! 8eca88af7485a75ce3541968da456f91  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c
  d1b35f2120d5335127cbce417dff6c98  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c
  769f16086c2330f7eed8a44c27fa3c3b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i16.c
  e9accde0ee3be9cea5d61ed620a02fff  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i32.c
  3dcfb7e0adab0b03f0b2f2534ea342c1  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i64.c
  0f06236cd498b25686910d051c5a135a  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i8.c
! f638878ee5ba623c5ecf88ff15a6f26a  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c
! 87e2d9a141a0a69b6c7917406e3da31b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c
! be3fcd1fd8fa448be996abc5425a06b8  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c
  66f491f5982578d81d43f48cb849b7e6  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c
  ddbdedd0bcd1b2f07c63e57ea3edd7f9  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i16.c
  ecb91086db90af95d3f46740e36b1ce2  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i32.c
--- 98290,98314 ----
  f8449da573246d363e4443b9f32f0f06  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i32.c
  4abdc71a4d78eff367f15f9be04fb7fc  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i64.c
  b231dddff3540c987b251cf413e96a0c  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i8.c
! 9d446eb22cabc1dfb08bd794443cef0f  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c
! bd5e97369c57c448992d20df86526338  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c
! a150a331a26d65810feb5a0071535b80  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c
  4bd4d8465912fd31ef999b199164b3c7  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c
  97a4318491ad584290f2b2bef781322e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i16.c
  935c9835493916f219759aed3d339ec9  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i32.c
  59608a9e1c34d3e1d054335c9a90bd97  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i64.c
  b1a59a3d1b37b0c7a1ff38505ab7a17b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i8.c
! ef6aff55ed9b306e632e79ba81d75899  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c
! a5dcfc3d545c71ee926964e057119ea0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c
! a0077ac413c6469b39112de9f46b6986  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c
  d1b35f2120d5335127cbce417dff6c98  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c
  769f16086c2330f7eed8a44c27fa3c3b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i16.c
  e9accde0ee3be9cea5d61ed620a02fff  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i32.c
  3dcfb7e0adab0b03f0b2f2534ea342c1  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i64.c
  0f06236cd498b25686910d051c5a135a  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i8.c
! 0b65d8ecd16acf22aa0329ab173c100c  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c
! 0afc0ec234f3a6798918b1f90aedd985  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c
! 4b9f267a46b8335a2907d19b0e7e1426  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c
  66f491f5982578d81d43f48cb849b7e6  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c
  ddbdedd0bcd1b2f07c63e57ea3edd7f9  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i16.c
  ecb91086db90af95d3f46740e36b1ce2  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i32.c
*************** e0a029ed9e4f9f4ab4383ebb4a63f046  gcc/te
*** 98455,98460 ****
--- 98521,98529 ----
  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
+ cd9582a571be922d7f5168551101aad8  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vwaddu-run-1-u64.c
+ 7227b4aa0c31514a16902df6b7f2b746  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vwmulu-run-1-u64.c
+ ad1022e3817bd53fd617f6f5d70c099e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vwsubu-run-1-u64.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
*************** a0289a49fbec6d012c69ed3175a98cc5  gcc/te
*** 98463,98468 ****
--- 98532,98540 ----
  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
+ f4faf2a6d91b36571a745a89888413e9  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_widen.h
+ aaca46c6ec05d6c1076d11a30954b0d8  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_widen_data.h
+ 817a372ed3135f20efb96a1ef454973c  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_widen_vx_run.h
  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
*************** b3330bdc7e59d45053b22dc4e53f3689  gcc/te
*** 99881,99917 ****
  609e1d2aef82a23de55a584b6e847de3  gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vsetvlmax-9.c
  9c2f522a14fc0f4d937d128fb08e4647  gcc/testsuite/gcc.target/riscv/rvv/vsetvl/wredsum_vlmax.c
  0fcc9fd70a59d0ab221be846457ab2c8  gcc/testsuite/gcc.target/riscv/rvv/vtype-call-clobbered.c
  637442de843d549714e205454bb6b13f  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vd4dots.c
  77bc779cc75172943fb341dde833285a  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vd4dotsu.c
  38d6296b6898dbac79c1f114d1bab5ba  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vd4dotu.c
! eaa1674d3f2f945765ab614edd351881  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vfncvtbf16s.c
  b194770c847e87f66757cb8c74b1baf6  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vfpmadb.c
  2f063c9aae22303454f487dc35d7b467  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vfpmadt.c
! ca0e0650a1e68abc35ff65424e36e768  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vfwcvtsbf16.c
  dd71f303834fa0446524d39d7ada0ea5  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vln8.c
  b631782b5d066b02a62d6d9cccdb0b8d  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vd4dots.c
  4af974bf60f02ddec0ee98537d676cfb  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vd4dotsu.c
  614150574b344362fdb32a1d3d9531bf  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vd4dotu.c
! 89933a0f8682c08fd6f43f0d778b7107  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vfncvtbf16s.c
  f5653e679edfa59449a4333976d8d5ea  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vfpmadb.c
  f4c14078aa2189a9153f32e2d6802840  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vfpmadt.c
! 0941e4f2c7ac9b8b8fc82a0ea48243bc  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vfwcvtsbf16.c
  9767e600e3e3d3df22eef0b3ccc89572  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vln8.c
  1f18373dfc52f9f8770289f6ec3d851c  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vd4dots.c
  15776a6883539ff6060f00fcce5c2b5b  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vd4dotsu.c
  713b410e848f0bd24812ce83bf754b99  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vd4dotu.c
! 84409e7c180a2e9bb47f82d977a576cd  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vfncvtbf16s.c
  fdc22092b0a09327b1a3117277fd0560  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vfpmadb.c
  f0dd2e44836f9a55b93e0b678b2e077f  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vfpmadt.c
! 28ea0714cbfb57f229eab81073236d72  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vfwcvtsbf16.c
  50b866a484595cc300bae68ac03c37c8  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vln8.c
  fea40b0149ae4dde7dee336712697c30  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vd4dots.c
  39dfad2fff0efbe9346bfd08d35042bb  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vd4dotsu.c
  ea619bdb61ec500565c7b25f7382e4d8  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vd4dotu.c
! 5370ffafa1b25f38fb115113b1a63eb0  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vfncvtbf16s.c
  b0313aa063c6b89c749f0bf083cffb23  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vfpmadb.c
  ea8e770cd4669b67ce8cefc0057168d3  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vfpmadt.c
! 28ea0714cbfb57f229eab81073236d72  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vfwcvtsbf16.c
  c0de26fe3372b45983b9f17d17fb86ac  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vln8.c
  e0318f5cdc094037bd383d17cc611346  gcc/testsuite/gcc.target/riscv/rvv/xsfvector/sf_vc_f.c
  a3895b5dae542b6e77191b5fddf4e7f9  gcc/testsuite/gcc.target/riscv/rvv/xsfvector/sf_vc_i.c
--- 99953,99993 ----
  609e1d2aef82a23de55a584b6e847de3  gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vsetvlmax-9.c
  9c2f522a14fc0f4d937d128fb08e4647  gcc/testsuite/gcc.target/riscv/rvv/vsetvl/wredsum_vlmax.c
  0fcc9fd70a59d0ab221be846457ab2c8  gcc/testsuite/gcc.target/riscv/rvv/vtype-call-clobbered.c
+ df97e12b59ff507489560f2a99975e77  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/andes_vector.h
  637442de843d549714e205454bb6b13f  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vd4dots.c
  77bc779cc75172943fb341dde833285a  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vd4dotsu.c
  38d6296b6898dbac79c1f114d1bab5ba  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vd4dotu.c
! 5dceb8a9aa1f936aa2baf748d5aebf88  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vfncvtbf16s.c
  b194770c847e87f66757cb8c74b1baf6  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vfpmadb.c
  2f063c9aae22303454f487dc35d7b467  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vfpmadt.c
! 36ab0b968da95ed9f4ec5e579e1676d6  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vfwcvtsbf16.c
  dd71f303834fa0446524d39d7ada0ea5  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vln8.c
+ df97e12b59ff507489560f2a99975e77  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/andes_vector.h
  b631782b5d066b02a62d6d9cccdb0b8d  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vd4dots.c
  4af974bf60f02ddec0ee98537d676cfb  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vd4dotsu.c
  614150574b344362fdb32a1d3d9531bf  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vd4dotu.c
! 1adeb7ad34edc66798ab4bd2eeed63e0  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vfncvtbf16s.c
  f5653e679edfa59449a4333976d8d5ea  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vfpmadb.c
  f4c14078aa2189a9153f32e2d6802840  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vfpmadt.c
! 2d66523b5c922227f41b11e8a54c545d  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vfwcvtsbf16.c
  9767e600e3e3d3df22eef0b3ccc89572  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vln8.c
+ 9742f4da8c36074ded9f2ca5db07ecc5  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/andes_vector.h
  1f18373dfc52f9f8770289f6ec3d851c  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vd4dots.c
  15776a6883539ff6060f00fcce5c2b5b  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vd4dotsu.c
  713b410e848f0bd24812ce83bf754b99  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vd4dotu.c
! 08ce298da6faa6ec25e69b0ac1cc8c1e  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vfncvtbf16s.c
  fdc22092b0a09327b1a3117277fd0560  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vfpmadb.c
  f0dd2e44836f9a55b93e0b678b2e077f  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vfpmadt.c
! df976c287ae79d074bb903dd4f3909cf  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vfwcvtsbf16.c
  50b866a484595cc300bae68ac03c37c8  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vln8.c
+ 9742f4da8c36074ded9f2ca5db07ecc5  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/andes_vector.h
  fea40b0149ae4dde7dee336712697c30  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vd4dots.c
  39dfad2fff0efbe9346bfd08d35042bb  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vd4dotsu.c
  ea619bdb61ec500565c7b25f7382e4d8  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vd4dotu.c
! 409c0d5bcde19816cb43db4104167be0  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vfncvtbf16s.c
  b0313aa063c6b89c749f0bf083cffb23  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vfpmadb.c
  ea8e770cd4669b67ce8cefc0057168d3  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vfpmadt.c
! df976c287ae79d074bb903dd4f3909cf  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vfwcvtsbf16.c
  c0de26fe3372b45983b9f17d17fb86ac  gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vln8.c
  e0318f5cdc094037bd383d17cc611346  gcc/testsuite/gcc.target/riscv/rvv/xsfvector/sf_vc_f.c
  a3895b5dae542b6e77191b5fddf4e7f9  gcc/testsuite/gcc.target/riscv/rvv/xsfvector/sf_vc_i.c
*************** daf6c4e935d4c04b105ac15b59b3fbfe  gcc/te
*** 99927,99932 ****
--- 100003,100009 ----
  475692994c47c8cf347959c08fe0d865  gcc/testsuite/gcc.target/riscv/rvv/xsfvector/sf_vqmaccu_4x8x4.c
  f54b80eb5fffa420f5aabbbf8ddda08b  gcc/testsuite/gcc.target/riscv/rvv/xsfvector/sf_vqmaccus_2x8x2.c
  97fbf1d8057a6c24e22a238f1b85178f  gcc/testsuite/gcc.target/riscv/rvv/xsfvector/sf_vqmaccus_4x8x4.c
+ d5c19f8b7c4f58c65db3d708af55c80e  gcc/testsuite/gcc.target/riscv/rvv/xsfvector/sifive_vector.h
  fc54d12a0cef4c8da27d6f46343e89eb  gcc/testsuite/gcc.target/riscv/rvv/xtheadvector.c
  cbbf5673d8ca63042855a0cd377e13c2  gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/pr114194-rv32.c
  6826c6caa6acfa0940cda65196713c07  gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/pr114194-rv64.c
*************** af1bc36c42c7044e45de0c750db8acd5  gcc/te
*** 99937,99942 ****
--- 100014,100021 ----
  013ca4446da937590547bb850a947ecf  gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/pr120461.c
  e0096129e78eb7f5e7a4f3231097c187  gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/pr120642.c
  3b6f5cabe79dc861ffb53d3e1f5799fb  gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/prefix.c
+ f0eaf74e1355fb42d801d65c8e79d1c5  gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/riscv_th_vector.h
+ 979e78c5ed1d2ba91a46584480362b26  gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/riscv_vector.h
  2ab24ca52f156368073be4fd3c43c875  gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vlb-vsb.c
  d65b03ba20bf54651672609d9c9923cc  gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vlbu-vsb.c
  a8f53ad5180333afb72d569d125c3922  gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vlh-vsh.c
*************** a8f53ad5180333afb72d569d125c3922  gcc/te
*** 99945,99951 ****
  fe865d9009af7551d830f6d4e3008ebe  gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vlwu-vsw.c
  10c2fe61483d221e6648e72c6ff9f6a0  gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vsext.c
  23788d7500abf7340ab20ef598d9da5e  gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vzext.c
! 70e982aa652bc6c91cf9fa013d8ab358  gcc/testsuite/gcc.target/riscv/sat/sat_arith.h
  89d90b13c13c2658dcc8319771cd755f  gcc/testsuite/gcc.target/riscv/sat/sat_arith_data.h
  e52f03a6378cd78f7ea04149c2b8215a  gcc/testsuite/gcc.target/riscv/sat/sat_s_add-1-i16.c
  1de70dbaccb7e9fe73b8e90ec7430b4d  gcc/testsuite/gcc.target/riscv/sat/sat_s_add-1-i32.c
--- 100024,100030 ----
  fe865d9009af7551d830f6d4e3008ebe  gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vlwu-vsw.c
  10c2fe61483d221e6648e72c6ff9f6a0  gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vsext.c
  23788d7500abf7340ab20ef598d9da5e  gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vzext.c
! 7b1d35c3d1819ba4e149578cd177669d  gcc/testsuite/gcc.target/riscv/sat/sat_arith.h
  89d90b13c13c2658dcc8319771cd755f  gcc/testsuite/gcc.target/riscv/sat/sat_arith_data.h
  e52f03a6378cd78f7ea04149c2b8215a  gcc/testsuite/gcc.target/riscv/sat/sat_s_add-1-i16.c
  1de70dbaccb7e9fe73b8e90ec7430b4d  gcc/testsuite/gcc.target/riscv/sat/sat_s_add-1-i32.c
*************** f2a29f2daa827152046119e065d7e74c  gcc/te
*** 100340,100345 ****
--- 100419,100428 ----
  ae253cdb3b48e6898f25a6a884085caf  gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-5-u8-from-u32.c
  46f39225e1d986ce206163d2f348ac1e  gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-5-u8-from-u64.rv32.c
  cbe5fc9dc5bb96c2c91e2afdfa0a7c81  gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-5-u8-from-u64.rv64.c
+ 9247bd53000cbd57332fcfa13602fb82  gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-6-u16-from-u128.c
+ e0389e6eb531cc3123ab18dc40b9ce8c  gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-6-u32-from-u128.c
+ 8e58b1d36cce34fdbef559241201e4ce  gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-6-u64-from-u128.c
+ d1bf56463c7251298be6700786292ee2  gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-6-u8-from-u128.c
  bf3cc27ddc2ea3d61c508c988cc37520  gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-1-u16-from-u128.c
  e532a922f2b1c193ca39bdfa1e70bdba  gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-1-u16-from-u32.c
  b343a3fe775fb03e665506a088734673  gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-1-u16-from-u64.c
*************** c2ca006bc7edb3f2955e6195faa37d32  gcc/te
*** 100377,100382 ****
--- 100460,100469 ----
  535055b68ed73f2d7d5b863617b9c15f  gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-5-u8-from-u16.c
  59365e028b7d97757228ecf92633684b  gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-5-u8-from-u32.c
  ef26294b4e42f4cda3877129c397e6b6  gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-5-u8-from-u64.c
+ 5070cd9304c2ae1039e021a535b3fc46  gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-6-u16-from-u128.c
+ 1839efee75434bd5f24727cef120cd7e  gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-6-u32-from-u128.c
+ bb5ec1f458c12fce3953f4abdff7370e  gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-6-u64-from-u128.c
+ 5070cd9304c2ae1039e021a535b3fc46  gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-6-u8-from-u128.c
  fdd9d0d3a36236e0472d000f8833d982  gcc/testsuite/gcc.target/riscv/sat/sat_u_sub-1-u16.c
  e3e2bd9a544f75219a218a5520d41e4e  gcc/testsuite/gcc.target/riscv/sat/sat_u_sub-1-u32.c
  7239f33d03967abfe59724a5530c6c52  gcc/testsuite/gcc.target/riscv/sat/sat_u_sub-1-u64.c
*************** f6f7acec076cc9157b5ce994bcba39d6  gcc/te
*** 100592,100597 ****
--- 100679,100689 ----
  cc4f87453d2847bc665a5665b786ae22  gcc/testsuite/gcc.target/riscv/sat/scalar_sat_binary.h
  e03d7f17af0c829e258e1ce327464708  gcc/testsuite/gcc.target/riscv/sat/scalar_sat_binary_run_xxx.h
  af524e576dfdf2f1e85150fe3a170afe  gcc/testsuite/gcc.target/riscv/sat/scalar_sat_unary.h
+ 05145b7cd62c027dd216fbf4c9e98b18  gcc/testsuite/gcc.target/riscv/sat/widen-mul-0.c
+ 05fb656721ededa11fa864f9cfe3dbf2  gcc/testsuite/gcc.target/riscv/sat/widen-mul-1.c
+ 663395b5b66e507724ae0c81d37a3e0f  gcc/testsuite/gcc.target/riscv/sat/widen-mul-2.c
+ 95e41646c332613a9c77d61a8d41c8ff  gcc/testsuite/gcc.target/riscv/sat/widen-mul-3.c
+ af8f66bcecc0112ea97f9cce9bf9f4b9  gcc/testsuite/gcc.target/riscv/sat/widen-mul.h
  e21250cdea6ea09da525f0119c38ea38  gcc/testsuite/gcc.target/riscv/save-restore-1.c
  d9f3969fcf83beaed59186cbaaa465bf  gcc/testsuite/gcc.target/riscv/save-restore-2.c
  f77ea662d9f85837dacf2e485dc91143  gcc/testsuite/gcc.target/riscv/save-restore-3.c
*************** e235c279f7ce15f9087254bf97918762  gcc/te
*** 100602,100607 ****
--- 100694,100700 ----
  88dbe500ee71e24bf3a5827524daa6a6  gcc/testsuite/gcc.target/riscv/save-restore-8.c
  ca1e563124a7035c98d86fadbdd1371d  gcc/testsuite/gcc.target/riscv/save-restore-9.c
  7da6d66a53ccd636e543f8018347d057  gcc/testsuite/gcc.target/riscv/save-restore-cfi-2.c
+ 80b725c5d705cb9cae7f47b7ffb79417  gcc/testsuite/gcc.target/riscv/save-restore-cfi-3.c
  01eaf37800a68468ef47b20ff1881af4  gcc/testsuite/gcc.target/riscv/save-restore-cfi.c
  2a8ac42ddf2e78abef108bf169ba5c06  gcc/testsuite/gcc.target/riscv/scalar_bitmanip_intrinsic-32.c
  5d76e4c7052e08abbf4abfe2242a732d  gcc/testsuite/gcc.target/riscv/scalar_bitmanip_intrinsic-64-emulated.c
*************** f27f299747d9862a0ca9a3ab3770f1c4  gcc/te
*** 101057,101064 ****
  738e36dab36af196826c9b4e12d54d36  gcc/testsuite/gcc.target/s390/arch12/aghsghmgh-1.c
  0e764028020c3f12e214f3b6304e69fd  gcc/testsuite/gcc.target/s390/arch12/mul-1.c
  f41fae493f713bf85491d412efd9cebd  gcc/testsuite/gcc.target/s390/arch12/mul-2.c
! 82f4bf750374985a0b9a1498c0435b7d  gcc/testsuite/gcc.target/s390/arch13/bitops-1.c
! 648829618abc727ebde2ac7c570de43f  gcc/testsuite/gcc.target/s390/arch13/bitops-2.c
  0557336fa8ac86edd5c16a838c96cf5d  gcc/testsuite/gcc.target/s390/arch13/fp-signedint-convert-1.c
  4051b2b023eee6c684fd82362f2a4cdb  gcc/testsuite/gcc.target/s390/arch13/fp-unsignedint-convert-1.c
  c983687631a2e6c9dbb24e103ebd1364  gcc/testsuite/gcc.target/s390/arch13/popcount-1.c
--- 101150,101157 ----
  738e36dab36af196826c9b4e12d54d36  gcc/testsuite/gcc.target/s390/arch12/aghsghmgh-1.c
  0e764028020c3f12e214f3b6304e69fd  gcc/testsuite/gcc.target/s390/arch12/mul-1.c
  f41fae493f713bf85491d412efd9cebd  gcc/testsuite/gcc.target/s390/arch12/mul-2.c
! c0c4ac5a6c6d8183d286a65e11351313  gcc/testsuite/gcc.target/s390/arch13/bitops-1.c
! e06741a8741ba8ec94b2d802e4574d83  gcc/testsuite/gcc.target/s390/arch13/bitops-2.c
  0557336fa8ac86edd5c16a838c96cf5d  gcc/testsuite/gcc.target/s390/arch13/fp-signedint-convert-1.c
  4051b2b023eee6c684fd82362f2a4cdb  gcc/testsuite/gcc.target/s390/arch13/fp-unsignedint-convert-1.c
  c983687631a2e6c9dbb24e103ebd1364  gcc/testsuite/gcc.target/s390/arch13/popcount-1.c
*************** a4589217f85d225cee7d91649add59dc  gcc/te
*** 101213,101219 ****
  36d3b271e2f2eb0b15047430141e90bf  gcc/testsuite/gcc.target/s390/lxa-3.c
  25deeadef473f8167ac2f3aa560675e9  gcc/testsuite/gcc.target/s390/lxa-4.c
  29af65df49e303cbbe65fb9285be4736  gcc/testsuite/gcc.target/s390/md/andc-splitter-1.c
! ebd38103c33d9be1fe39714752582711  gcc/testsuite/gcc.target/s390/md/andc-splitter-2.c
  9cf080f05a65a6c75f29f573c2a8c74a  gcc/testsuite/gcc.target/s390/md/atomic_compare_exchange-1.c
  10c6b7fde71de9dd63f0385af3e8bf9a  gcc/testsuite/gcc.target/s390/md/atomic_compare_exchange-1.inc
  48899608a96c6cef698fb830e8be0679  gcc/testsuite/gcc.target/s390/md/atomic_exchange-1.c
--- 101306,101312 ----
  36d3b271e2f2eb0b15047430141e90bf  gcc/testsuite/gcc.target/s390/lxa-3.c
  25deeadef473f8167ac2f3aa560675e9  gcc/testsuite/gcc.target/s390/lxa-4.c
  29af65df49e303cbbe65fb9285be4736  gcc/testsuite/gcc.target/s390/md/andc-splitter-1.c
! 0f503fcf0cca864c9e45098ba6fd7616  gcc/testsuite/gcc.target/s390/md/andc-splitter-2.c
  9cf080f05a65a6c75f29f573c2a8c74a  gcc/testsuite/gcc.target/s390/md/atomic_compare_exchange-1.c
  10c6b7fde71de9dd63f0385af3e8bf9a  gcc/testsuite/gcc.target/s390/md/atomic_compare_exchange-1.inc
  48899608a96c6cef698fb830e8be0679  gcc/testsuite/gcc.target/s390/md/atomic_exchange-1.c
*************** c8ca7a67e0b9c502e7883c6187a3b1f3  gcc/te
*** 109577,109582 ****
--- 109670,109676 ----
  f69f56fb4872918c466c7554afc79da9  gcc/testsuite/gfortran.dg/deferred_character_36.f90
  0c1889dba05d51d0a09b189a6caa16c0  gcc/testsuite/gfortran.dg/deferred_character_37.f90
  51fc8b5f96812427754c555184ed2c63  gcc/testsuite/gfortran.dg/deferred_character_38.f90
+ e771f7628a938e44ac0c994b8c7b8a3e  gcc/testsuite/gfortran.dg/deferred_character_39.f90
  5eede6c791f6d272034f9b84850ac6af  gcc/testsuite/gfortran.dg/deferred_character_4.f90
  981b809300de368e8fac65be4b40099c  gcc/testsuite/gfortran.dg/deferred_character_5.f90
  b8df78111bec4d4d4b97da6a15228361  gcc/testsuite/gfortran.dg/deferred_character_6.f90
*************** f2ea8cac46240547e280d6a47be8828d  gcc/te
*** 112487,112492 ****
--- 112581,112587 ----
  368ecceacb36bc8031de56fda6503830  gcc/testsuite/gfortran.dg/matmul_argument_types.f90
  6a883e202e2a5a1a5860d1565dec8edf  gcc/testsuite/gfortran.dg/matmul_blas_1.f
  862897f6121e8bc995b9373ab8e7d097  gcc/testsuite/gfortran.dg/matmul_blas_2.f90
+ 05eae8cfcedc07a6dbeb1d289e51a49b  gcc/testsuite/gfortran.dg/matmul_blas_3.f90
  6ed82ab65a659c5528ba6467505d80bd  gcc/testsuite/gfortran.dg/matmul_bounds_1.f90
  558e4b3b400485cd87bcbf000d42d188  gcc/testsuite/gfortran.dg/matmul_bounds_10.f90
  4d7f2fcf253e75af46fd09c44b1cd2ee  gcc/testsuite/gfortran.dg/matmul_bounds_11.f90
*************** bbf73734b60d2500381f37fc07248411  gcc/te
*** 113043,113049 ****
  c3e0cca0e4efe9383bafc33823f99ab9  gcc/testsuite/gfortran.dg/pdt_14.f03
  5e6d6f4eb70dbb7b23751aa6e68d6fdd  gcc/testsuite/gfortran.dg/pdt_15.f03
  af2c862644ef563e9b11a9acd3d9f20f  gcc/testsuite/gfortran.dg/pdt_16.f03
! 4483aa08269048d225897572d0fe2d01  gcc/testsuite/gfortran.dg/pdt_17.f03
  be693b3847d0256fa77c5e6d96396c97  gcc/testsuite/gfortran.dg/pdt_18.f03
  1be387788d3dfc3e6ad6918a8d5f4291  gcc/testsuite/gfortran.dg/pdt_19.f03
  3d1ced13c0fde7696153e2188eee96b6  gcc/testsuite/gfortran.dg/pdt_2.f03
--- 113138,113144 ----
  c3e0cca0e4efe9383bafc33823f99ab9  gcc/testsuite/gfortran.dg/pdt_14.f03
  5e6d6f4eb70dbb7b23751aa6e68d6fdd  gcc/testsuite/gfortran.dg/pdt_15.f03
  af2c862644ef563e9b11a9acd3d9f20f  gcc/testsuite/gfortran.dg/pdt_16.f03
! f5e7364f447dbb0b3be07c8238f738cc  gcc/testsuite/gfortran.dg/pdt_17.f03
  be693b3847d0256fa77c5e6d96396c97  gcc/testsuite/gfortran.dg/pdt_18.f03
  1be387788d3dfc3e6ad6918a8d5f4291  gcc/testsuite/gfortran.dg/pdt_19.f03
  3d1ced13c0fde7696153e2188eee96b6  gcc/testsuite/gfortran.dg/pdt_2.f03
*************** b7850b870694f099600d54c31ecfcd07  gcc/te
*** 113057,113063 ****
  f01af67b109adaf1b93b0098bc7de134  gcc/testsuite/gfortran.dg/pdt_27.f03
  7efa911fe665f45456e6943844302ac0  gcc/testsuite/gfortran.dg/pdt_28.f03
  68b10a194ff6797eee8ecb042129b08f  gcc/testsuite/gfortran.dg/pdt_29.f03
! 390bc98fe61b2aef657010d4702c0cd8  gcc/testsuite/gfortran.dg/pdt_3.f03
  1f42496cb72089bef450a6df6a13c299  gcc/testsuite/gfortran.dg/pdt_30.f90
  d586eb557b29a67b9fa981d71d443c8b  gcc/testsuite/gfortran.dg/pdt_31.f03
  e5bda49b00d9e9f9b204003142ebb089  gcc/testsuite/gfortran.dg/pdt_32.f03
--- 113152,113158 ----
  f01af67b109adaf1b93b0098bc7de134  gcc/testsuite/gfortran.dg/pdt_27.f03
  7efa911fe665f45456e6943844302ac0  gcc/testsuite/gfortran.dg/pdt_28.f03
  68b10a194ff6797eee8ecb042129b08f  gcc/testsuite/gfortran.dg/pdt_29.f03
! ca0a7c2af4037446fafd071c64a60c9e  gcc/testsuite/gfortran.dg/pdt_3.f03
  1f42496cb72089bef450a6df6a13c299  gcc/testsuite/gfortran.dg/pdt_30.f90
  d586eb557b29a67b9fa981d71d443c8b  gcc/testsuite/gfortran.dg/pdt_31.f03
  e5bda49b00d9e9f9b204003142ebb089  gcc/testsuite/gfortran.dg/pdt_32.f03
*************** c8554a07d7f9f6deff3996dc8dd428e7  gcc/te
*** 113076,113081 ****
--- 113171,113179 ----
  26458fabdc3fb974b6ac96e29effd590  gcc/testsuite/gfortran.dg/pdt_43.f03
  c81eb638a36b687e5dc5d831b100a2ae  gcc/testsuite/gfortran.dg/pdt_44.f03
  21fba33fca53db94c9d9c501ea7a1a0d  gcc/testsuite/gfortran.dg/pdt_45.f03
+ 3d693f5ae134fee41983008264ef3bb0  gcc/testsuite/gfortran.dg/pdt_46.f03
+ 743c13d00cb00139a1f209ced4c4ee65  gcc/testsuite/gfortran.dg/pdt_47.f03
+ 653560ec66bbc42c537d8cc5c9b66aae  gcc/testsuite/gfortran.dg/pdt_48.f03
  65d2ad728417ad3174fc1ce2b51a458d  gcc/testsuite/gfortran.dg/pdt_6.f03
  d2c9dae0c6e2385c5712aba8e12a70ba  gcc/testsuite/gfortran.dg/pdt_7.f03
  e21f38a2db39f95405441b61c12cf1e6  gcc/testsuite/gfortran.dg/pdt_8.f03
*************** c96b810859f2e6ef4edf5ff7dc529f4a  gcc/te
*** 116441,116447 ****
  1c74513cb6b9e5a64bd9cee59f114c8b  gcc/testsuite/gm2/errors/fail/testaddress.mod
  b216126a15c2f1df24c97bd8f2ad35ba  gcc/testsuite/gm2/errors/fail/testarray.mod
  faa7a855b35a4e5dd95c265442dca3a7  gcc/testsuite/gm2/errors/fail/testbit.mod
! c7227e5aef2e04956b54c83a17a5089b  gcc/testsuite/gm2/errors/fail/testbit2.mod
  b2e683d47ba38167a78ab304d11a6bbc  gcc/testsuite/gm2/errors/fail/testcase.mod
  c89b442f99164e238eac6613a62777a0  gcc/testsuite/gm2/errors/fail/testcomment.mod
  172c3ea670754d2deacc87441eefc3a4  gcc/testsuite/gm2/errors/fail/testcomment2.mod
--- 116539,116545 ----
  1c74513cb6b9e5a64bd9cee59f114c8b  gcc/testsuite/gm2/errors/fail/testaddress.mod
  b216126a15c2f1df24c97bd8f2ad35ba  gcc/testsuite/gm2/errors/fail/testarray.mod
  faa7a855b35a4e5dd95c265442dca3a7  gcc/testsuite/gm2/errors/fail/testbit.mod
! 9227c94d3d2c0fde30acdaf42158df9c  gcc/testsuite/gm2/errors/fail/testbit2.mod
  b2e683d47ba38167a78ab304d11a6bbc  gcc/testsuite/gm2/errors/fail/testcase.mod
  c89b442f99164e238eac6613a62777a0  gcc/testsuite/gm2/errors/fail/testcomment.mod
  172c3ea670754d2deacc87441eefc3a4  gcc/testsuite/gm2/errors/fail/testcomment2.mod
*************** fe2cff5a6de73f88d5d36f1989be93d3  gcc/te
*** 116852,116857 ****
--- 116950,116956 ----
  d71a6ac0e0221fe50dc256107211dd31  gcc/testsuite/gm2/iso/run/pass/adraddress.mod
  68113bc0c0aa774be83e0af4a4e7ba12  gcc/testsuite/gm2/iso/run/pass/adrunbounded3.mod
  a0eb439d9f4cc681b21fe56bfdb9af1a  gcc/testsuite/gm2/iso/run/pass/array9.mod
+ 192fda650c17db8c61259fa4af204b6b  gcc/testsuite/gm2/iso/run/pass/assigncons.mod
  121d71fd48fd99bf056f3b7aea7e0e93  gcc/testsuite/gm2/iso/run/pass/baseimport.mod
  65d3849661c7903f9ca8189e50514102  gcc/testsuite/gm2/iso/run/pass/compsize.mod
  b608ff9e7423b8fdeb8fd6a83709a0fd  gcc/testsuite/gm2/iso/run/pass/concurrentstore.mod
*************** c83034aeb54185cebc6b47fc6f9aa445  gcc/te
*** 116864,116869 ****
--- 116963,116969 ----
  78e887b8f24e014b6e6b34f71b91915f  gcc/testsuite/gm2/iso/run/pass/constprocedure.mod
  ee63f51af90a190018b96e17aa2c2443  gcc/testsuite/gm2/iso/run/pass/constructor1.mod
  4196c0d5e4d26c006a27e937a231c7cb  gcc/testsuite/gm2/iso/run/pass/constructor2.mod
+ 42156cf6b2411cca376390d527631f65  gcc/testsuite/gm2/iso/run/pass/constructor3.mod
  7b2fcdc6261cbefe83d48f9a7e242eda  gcc/testsuite/gm2/iso/run/pass/conststrarray.mod
  4dfe8fae139497f03d3adba7f0cfd5ac  gcc/testsuite/gm2/iso/run/pass/constvec3.mod
  47411b6568e03dac16a9864783269f5a  gcc/testsuite/gm2/iso/run/pass/contimer.mod
*************** ed15b32cac5558baf070bf13e20fb6ab  gcc/te
*** 116901,116914 ****
  a392f2b779747b49f3bf8c1425b4f578  gcc/testsuite/gm2/iso/run/pass/proc.c
  ae1b3c93233365bbbcb2f5542962646a  gcc/testsuite/gm2/iso/run/pass/proc.mod
  63a34382ce27483885e44450151679a1  gcc/testsuite/gm2/iso/run/pass/proc2.mod
  0e331f85f9cbbd156ac97565d33fda86  gcc/testsuite/gm2/iso/run/pass/returnrecord.mod
  8fedf77113d653a5d34a508088470225  gcc/testsuite/gm2/iso/run/pass/shift.mod
  3f14a46336d423e5cb9de1c089eea96a  gcc/testsuite/gm2/iso/run/pass/shift2.mod
  e11beea7b7818fdfd024c43f20393bd9  gcc/testsuite/gm2/iso/run/pass/shift3.mod
! ac46225adaf10940cda4fe816a959fae  gcc/testsuite/gm2/iso/run/pass/shift4.mod
  a3a9bfe46b5a2ad99d516b933303594a  gcc/testsuite/gm2/iso/run/pass/shorttest.mod
  004775d760ff8827eb6ed1aecdd87275  gcc/testsuite/gm2/iso/run/pass/simple
  0fa8f6bac59d5b939cee67f911d96f9d  gcc/testsuite/gm2/iso/run/pass/simplelarge.mod
  9faeaea3c4d878cb86d98cb51b4ee431  gcc/testsuite/gm2/iso/run/pass/strcons.mod
  60a7bd468fc8261e7b7dc9630d14b2d9  gcc/testsuite/gm2/iso/run/pass/strcons2.mod
  04ed99500b2e87921a155bbca42a942e  gcc/testsuite/gm2/iso/run/pass/strcons3.mod
--- 117001,117018 ----
  a392f2b779747b49f3bf8c1425b4f578  gcc/testsuite/gm2/iso/run/pass/proc.c
  ae1b3c93233365bbbcb2f5542962646a  gcc/testsuite/gm2/iso/run/pass/proc.mod
  63a34382ce27483885e44450151679a1  gcc/testsuite/gm2/iso/run/pass/proc2.mod
+ f6b96df9f159dc0f5652d5f7f45aceb4  gcc/testsuite/gm2/iso/run/pass/proc_test.mod
  0e331f85f9cbbd156ac97565d33fda86  gcc/testsuite/gm2/iso/run/pass/returnrecord.mod
  8fedf77113d653a5d34a508088470225  gcc/testsuite/gm2/iso/run/pass/shift.mod
  3f14a46336d423e5cb9de1c089eea96a  gcc/testsuite/gm2/iso/run/pass/shift2.mod
  e11beea7b7818fdfd024c43f20393bd9  gcc/testsuite/gm2/iso/run/pass/shift3.mod
! 84c8cb2dc1f06e10eac3027fd1b3de0f  gcc/testsuite/gm2/iso/run/pass/shift4.mod
  a3a9bfe46b5a2ad99d516b933303594a  gcc/testsuite/gm2/iso/run/pass/shorttest.mod
  004775d760ff8827eb6ed1aecdd87275  gcc/testsuite/gm2/iso/run/pass/simple
  0fa8f6bac59d5b939cee67f911d96f9d  gcc/testsuite/gm2/iso/run/pass/simplelarge.mod
+ d50a73e868bd51ec1f09c0c5763043ff  gcc/testsuite/gm2/iso/run/pass/simplelarge2.mod
+ 306880b3ca08cc0d29b5adf1b2b8f04c  gcc/testsuite/gm2/iso/run/pass/simplelarge3.mod
+ 6b56b952358e439de3c077cab1da4ae6  gcc/testsuite/gm2/iso/run/pass/simplelarge4.mod
  9faeaea3c4d878cb86d98cb51b4ee431  gcc/testsuite/gm2/iso/run/pass/strcons.mod
  60a7bd468fc8261e7b7dc9630d14b2d9  gcc/testsuite/gm2/iso/run/pass/strcons2.mod
  04ed99500b2e87921a155bbca42a942e  gcc/testsuite/gm2/iso/run/pass/strcons3.mod
*************** a54ec8a7fb388143dcdf9bf6ba8a0358  gcc/te
*** 116921,116927 ****
  8b34e4874d9f5cb694efcb8924f36ea9  gcc/testsuite/gm2/iso/run/pass/testclock2.mod
  7bf6b9debcb93e4d790de77b832f7e02  gcc/testsuite/gm2/iso/run/pass/testgeneric.mod
  2099fa3a5b7dcee8b0ecac40aba33545  gcc/testsuite/gm2/iso/run/pass/testlarge.mod
! b0965c512d33d48ba22ab6ec0cbb43e1  gcc/testsuite/gm2/iso/run/pass/testsystem.mod
  55a2e1b2fa8f3546a13e3bc16789e644  gcc/testsuite/gm2/iso/run/pass/tinyconst.mod
  6b3c53dbe456b9b80f18c5392bcd61eb  gcc/testsuite/gm2/iso/run/pass/tinyconst2.mod
  26361435d9dff9b02335fdb966c2811a  gcc/testsuite/gm2/iso/run/pass/tinyconst3.mod
--- 117025,117031 ----
  8b34e4874d9f5cb694efcb8924f36ea9  gcc/testsuite/gm2/iso/run/pass/testclock2.mod
  7bf6b9debcb93e4d790de77b832f7e02  gcc/testsuite/gm2/iso/run/pass/testgeneric.mod
  2099fa3a5b7dcee8b0ecac40aba33545  gcc/testsuite/gm2/iso/run/pass/testlarge.mod
! 7b2aa03eef51583de3c83f4e2e72974e  gcc/testsuite/gm2/iso/run/pass/testsystem.mod
  55a2e1b2fa8f3546a13e3bc16789e644  gcc/testsuite/gm2/iso/run/pass/tinyconst.mod
  6b3c53dbe456b9b80f18c5392bcd61eb  gcc/testsuite/gm2/iso/run/pass/tinyconst2.mod
  26361435d9dff9b02335fdb966c2811a  gcc/testsuite/gm2/iso/run/pass/tinyconst3.mod
*************** e5d5befc7aececd211929f46bd11fdda  gcc/te
*** 117870,117875 ****
--- 117974,117986 ----
  15b6dac89ee25f9c41909c8cab7033a9  gcc/testsuite/gm2/pimlib/run/pass/testreal4.mod
  94dfcc8f117db06f4006eb96be4e84f8  gcc/testsuite/gm2/pimlib/run/pass/testwrite.mod
  1aa30b418b9ca42daba58742ea25f51f  gcc/testsuite/gm2/pimlib/run/pass/testwritechar.mod
+ 20fbf2aa758ea7dcbf39c0bf6fa647e2  gcc/testsuite/gm2/pimlib/wideset/run/pass/bitset.mod
+ df8a86ca3739571a64ea25c02b7760ef  gcc/testsuite/gm2/pimlib/wideset/run/pass/bitset2.mod
+ 7e4d9ffe9602639cb5228c229a944974  gcc/testsuite/gm2/pimlib/wideset/run/pass/colorset.mod
+ f04d8cff59769f6ce7fa4937576d2529  gcc/testsuite/gm2/pimlib/wideset/run/pass/colorset2.mod
+ 84f2c480ee9a2365ae65ae854e700aff  gcc/testsuite/gm2/pimlib/wideset/run/pass/colorset3.mod
+ f8a265d8d064329a48d8fb8a627463fe  gcc/testsuite/gm2/pimlib/wideset/run/pass/highbit.mod
+ 0e0dfb52c307c38cab7fcc3a2a14fa5a  gcc/testsuite/gm2/pimlib/wideset/run/pass/highbit2.mod
  d42665273dfdf6111268f44c425bef5a  gcc/testsuite/gm2/projects/README
  9a671ebc8f4bdad366a08a252439855c  gcc/testsuite/gm2/projects/iso/run/pass/halma/halma.mod
  08d5a7f3db0f9db283fd7cfc21db5f17  gcc/testsuite/gm2/projects/iso/run/pass/halma/projects-iso-run-pass-halma.exp
*************** aa3c4815956d171d0e938e2782804b9e  gcc/te
*** 118001,118007 ****
  d8c359eaf5bfe17b72acf803597e7ca2  gcc/testsuite/gm2/sets/run/pass/multisetrotate.mod
  0c802e181b74348e0d7f9fd0773e4780  gcc/testsuite/gm2/sets/run/pass/multisetrotate2.mod
  ab7e1398170dff65bd057db02e77b1c6  gcc/testsuite/gm2/sets/run/pass/multisetrotate3.mod
! b53fc3968aac8216081bd1c5453da5a4  gcc/testsuite/gm2/sets/run/pass/multisetrotate4.mod
  4995eaf88b79a9912ec4eba14e86819b  gcc/testsuite/gm2/sets/run/pass/multisetshift.mod
  a155fada107d87016bad68f7e11008a2  gcc/testsuite/gm2/sets/run/pass/multisetshift2.mod
  7ada01035fd7c7f1f579e0fa7723fc92  gcc/testsuite/gm2/sets/run/pass/multisimple.mod
--- 118112,118119 ----
  d8c359eaf5bfe17b72acf803597e7ca2  gcc/testsuite/gm2/sets/run/pass/multisetrotate.mod
  0c802e181b74348e0d7f9fd0773e4780  gcc/testsuite/gm2/sets/run/pass/multisetrotate2.mod
  ab7e1398170dff65bd057db02e77b1c6  gcc/testsuite/gm2/sets/run/pass/multisetrotate3.mod
! 101d9798a5d3e6febee7cc9824bcc7c4  gcc/testsuite/gm2/sets/run/pass/multisetrotate4.mod
! 9a415f2542875d5ad359273b4020dcb1  gcc/testsuite/gm2/sets/run/pass/multisetrotate5.mod
  4995eaf88b79a9912ec4eba14e86819b  gcc/testsuite/gm2/sets/run/pass/multisetshift.mod
  a155fada107d87016bad68f7e11008a2  gcc/testsuite/gm2/sets/run/pass/multisetshift2.mod
  7ada01035fd7c7f1f579e0fa7723fc92  gcc/testsuite/gm2/sets/run/pass/multisimple.mod
*************** e3b8b2f95a8138a3f33aec58db37144c  gcc/te
*** 118015,118020 ****
--- 118127,118134 ----
  716e8f0148242eec6b616365ef63f876  gcc/testsuite/gm2/sets/run/pass/setarith2.mod
  2e8b6ab5db57096743916a62daa1e64c  gcc/testsuite/gm2/sets/run/pass/setarith3.mod
  f6de503823ee276a69e70bc77f56435d  gcc/testsuite/gm2/sets/run/pass/setarith4.mod
+ 246e6f8d099bde6e926543b7940304fb  gcc/testsuite/gm2/sets/run/pass/setcard.mod
+ bfe5c298caf628e7a78fae5472f62888  gcc/testsuite/gm2/sets/run/pass/setincl.mod
  59a9282687d742828693ca1ab889fda1  gcc/testsuite/gm2/sets/run/pass/setrotate.mod
  6791c5b60c9acda2d0588a232e3e7252  gcc/testsuite/gm2/sets/run/pass/setrotate2.mod
  e230bc90482d44ff967e7deef741765c  gcc/testsuite/gm2/sets/run/pass/setrotate3.mod
*************** fef7514015c435a016141edea74b252b  gcc/te
*** 118029,118035 ****
  d93ffac451cd75883d648722d233fc4f  gcc/testsuite/gm2/sets/run/pass/simple5.mod
  594bd0e14f8f6503d309d3c360587994  gcc/testsuite/gm2/sets/run/pass/simple6.mod
  05150f7878189d0ba7f261bdc7948b19  gcc/testsuite/gm2/sets/run/pass/simple7.mod
! 91870351f2638b03a9fa87e56e67bf26  gcc/testsuite/gm2/sets/run/pass/simplepacked.mod
  a04f6df05c90c6ed54213199610ef67c  gcc/testsuite/gm2/switches/auto-init/fail/switches-auto-init-fail.exp
  d089057a33f33fb7304bbbda81e00fd7  gcc/testsuite/gm2/switches/auto-init/fail/uninitptr.mod
  f456a6791fc712e654ace802ea0ba82e  gcc/testsuite/gm2/switches/auto-init/fail/uninitptr2.mod
--- 118143,118149 ----
  d93ffac451cd75883d648722d233fc4f  gcc/testsuite/gm2/sets/run/pass/simple5.mod
  594bd0e14f8f6503d309d3c360587994  gcc/testsuite/gm2/sets/run/pass/simple6.mod
  05150f7878189d0ba7f261bdc7948b19  gcc/testsuite/gm2/sets/run/pass/simple7.mod
! 450fa2bba4638b29b938eb20d30fb855  gcc/testsuite/gm2/sets/run/pass/simplepacked.mod
  a04f6df05c90c6ed54213199610ef67c  gcc/testsuite/gm2/switches/auto-init/fail/switches-auto-init-fail.exp
  d089057a33f33fb7304bbbda81e00fd7  gcc/testsuite/gm2/switches/auto-init/fail/uninitptr.mod
  f456a6791fc712e654ace802ea0ba82e  gcc/testsuite/gm2/switches/auto-init/fail/uninitptr2.mod
*************** f427d0c6721f464c1dcbe2e8bea5fdfe  gcc/te
*** 123052,123058 ****
  6776dc14224e93d5b805dfe09d5ad6df  gcc/testsuite/lib/gm2-dg.exp
  3e2c68ae3bfef468faf9345ca7f69c78  gcc/testsuite/lib/gm2-simple.exp
  b31646238765c4f7c1464399fd05e5eb  gcc/testsuite/lib/gm2-torture.exp
! cde7364d679bf019115a37fca70a6f52  gcc/testsuite/lib/gm2.exp
  0678956ec8761ea452385bc244b33382  gcc/testsuite/lib/gnat-dg.exp
  30035dff80db0cbe777f5ec29ee77ebc  gcc/testsuite/lib/gnat.exp
  628b339f01ad2b5a5afbfe6c0220ad31  gcc/testsuite/lib/go-dg.exp
--- 123166,123172 ----
  6776dc14224e93d5b805dfe09d5ad6df  gcc/testsuite/lib/gm2-dg.exp
  3e2c68ae3bfef468faf9345ca7f69c78  gcc/testsuite/lib/gm2-simple.exp
  b31646238765c4f7c1464399fd05e5eb  gcc/testsuite/lib/gm2-torture.exp
! 7cdebf6cba574d6fd805c978ed4e5aaa  gcc/testsuite/lib/gm2.exp
  0678956ec8761ea452385bc244b33382  gcc/testsuite/lib/gnat-dg.exp
  30035dff80db0cbe777f5ec29ee77ebc  gcc/testsuite/lib/gnat.exp
  628b339f01ad2b5a5afbfe6c0220ad31  gcc/testsuite/lib/go-dg.exp
*************** c68f58f9b78cac0eac5ea8f58620014d  gcc/te
*** 123963,123979 ****
  727fbdef0d5c1f394af9e449351158cc  gcc/testsuite/objc.dg/shadow-2.m
  00a9d1763a3673adacb1898e1c61ef7f  gcc/testsuite/objc.dg/sizeof-1.m
  563627927440cc105f37f27a8d91f249  gcc/testsuite/objc.dg/special/load-category-1.h
! a3938d257215e3c079e79ea03a2043d9  gcc/testsuite/objc.dg/special/load-category-1.m
  c64683a48c4b54f91b2855f105ac3015  gcc/testsuite/objc.dg/special/load-category-1a.m
  a49252a001b806cbd83791f46c29c19c  gcc/testsuite/objc.dg/special/load-category-2.h
! ab13bce13fdb5a3de66f0f350804fc0d  gcc/testsuite/objc.dg/special/load-category-2.m
  c531fbd47d6cd6f34fd4a1161fe41d36  gcc/testsuite/objc.dg/special/load-category-2a.m
  b5566392b676a4381c9fba425af46d22  gcc/testsuite/objc.dg/special/load-category-3.h
! 531fa8066e9e519b7cc77fe0e99f2692  gcc/testsuite/objc.dg/special/load-category-3.m
  84e0d0ac9e785e6c7a2c3961f9fef351  gcc/testsuite/objc.dg/special/load-category-3a.m
! 8d91e4ec8e8115feaa6cd9f2f9495bc2  gcc/testsuite/objc.dg/special/special.exp
  a771ad2e4109d3b6d673ea6ae3dfaa4f  gcc/testsuite/objc.dg/special/unclaimed-category-1.h
! a3f5ac774c5045ab1807af23f8bafeb5  gcc/testsuite/objc.dg/special/unclaimed-category-1.m
  fd73b19f16303df474ad98a05e01cd6a  gcc/testsuite/objc.dg/special/unclaimed-category-1a.m
  44c850eb724ab694c1eea579910821bd  gcc/testsuite/objc.dg/static-1.m
  911d824641cc5460f0bb8428edcd155b  gcc/testsuite/objc.dg/stret-1.m
--- 124077,124093 ----
  727fbdef0d5c1f394af9e449351158cc  gcc/testsuite/objc.dg/shadow-2.m
  00a9d1763a3673adacb1898e1c61ef7f  gcc/testsuite/objc.dg/sizeof-1.m
  563627927440cc105f37f27a8d91f249  gcc/testsuite/objc.dg/special/load-category-1.h
! 48f1cf24dc9c16b0de5e3bc7a0504f0b  gcc/testsuite/objc.dg/special/load-category-1.m
  c64683a48c4b54f91b2855f105ac3015  gcc/testsuite/objc.dg/special/load-category-1a.m
  a49252a001b806cbd83791f46c29c19c  gcc/testsuite/objc.dg/special/load-category-2.h
! 04455d4b064cf08dbc22245543cff612  gcc/testsuite/objc.dg/special/load-category-2.m
  c531fbd47d6cd6f34fd4a1161fe41d36  gcc/testsuite/objc.dg/special/load-category-2a.m
  b5566392b676a4381c9fba425af46d22  gcc/testsuite/objc.dg/special/load-category-3.h
! 9e46017b83261bc00e3bea4bea10f873  gcc/testsuite/objc.dg/special/load-category-3.m
  84e0d0ac9e785e6c7a2c3961f9fef351  gcc/testsuite/objc.dg/special/load-category-3a.m
! 8b25334501b4499d0ba997a3e869e974  gcc/testsuite/objc.dg/special/special.exp
  a771ad2e4109d3b6d673ea6ae3dfaa4f  gcc/testsuite/objc.dg/special/unclaimed-category-1.h
! d2e9a2872b3c0ea672f55965613d9b66  gcc/testsuite/objc.dg/special/unclaimed-category-1.m
  fd73b19f16303df474ad98a05e01cd6a  gcc/testsuite/objc.dg/special/unclaimed-category-1a.m
  44c850eb724ab694c1eea579910821bd  gcc/testsuite/objc.dg/static-1.m
  911d824641cc5460f0bb8428edcd155b  gcc/testsuite/objc.dg/stret-1.m
*************** e046a9c4874579f81515c4b3d9106b63  gcc/tr
*** 125692,125705 ****
  7e063b1edd28723f3f432596c39cfbee  gcc/tree-hasher.h
  3326ca7ea2452d7368a6e78f0025d7f8  gcc/tree-if-conv.cc
  002c9568898504ca2025dcacf5151fd6  gcc/tree-if-conv.h
! 25f1988c73b1a2d6262ef7081ca2f2d4  gcc/tree-inline.cc
  326f91431bfd3c15d8ddd74699d666e6  gcc/tree-inline.h
  90ca59c0844cd326f35f9cae17ec174b  gcc/tree-into-ssa.cc
  ef1cb0fba517532ecda9f4e0dd5218f7  gcc/tree-into-ssa.h
  71aa2d4206ac8bd978b5efd19148dd74  gcc/tree-iterator.cc
  1a3fc26573e4e592efe69f41168a65fa  gcc/tree-iterator.h
! 4c932cc6b576a53aa0f5dd611b468413  gcc/tree-logical-location.cc
! c28ee18072affadaa4bdca56d51c3389  gcc/tree-logical-location.h
  809e077fea6aa1e38be693ae0a16dee1  gcc/tree-loop-distribution.cc
  87cc8ab545fc5cfef7174e99c72a407a  gcc/tree-nested.cc
  b9bad013f5186a6cf78fe8adbe457945  gcc/tree-nested.h
--- 125806,125819 ----
  7e063b1edd28723f3f432596c39cfbee  gcc/tree-hasher.h
  3326ca7ea2452d7368a6e78f0025d7f8  gcc/tree-if-conv.cc
  002c9568898504ca2025dcacf5151fd6  gcc/tree-if-conv.h
! 430fc05a2aa5a9fe29c31d8a315fb825  gcc/tree-inline.cc
  326f91431bfd3c15d8ddd74699d666e6  gcc/tree-inline.h
  90ca59c0844cd326f35f9cae17ec174b  gcc/tree-into-ssa.cc
  ef1cb0fba517532ecda9f4e0dd5218f7  gcc/tree-into-ssa.h
  71aa2d4206ac8bd978b5efd19148dd74  gcc/tree-iterator.cc
  1a3fc26573e4e592efe69f41168a65fa  gcc/tree-iterator.h
! 055a1e7bbc0174c71b40525b65ae660e  gcc/tree-logical-location.cc
! fba074361c117a968daf282ef88a2b6e  gcc/tree-logical-location.h
  809e077fea6aa1e38be693ae0a16dee1  gcc/tree-loop-distribution.cc
  87cc8ab545fc5cfef7174e99c72a407a  gcc/tree-nested.cc
  b9bad013f5186a6cf78fe8adbe457945  gcc/tree-nested.h
*************** fd4dd1219acc650a4f7855faa0097964  gcc/tr
*** 125720,125733 ****
  7c11aa147a6d02acce5170cb35aed445  gcc/tree-profile.cc
  b11826e48aec543cca8379767ccc052f  gcc/tree-scalar-evolution.cc
  dddd950fe463803c41bc0c7cddf0fe44  gcc/tree-scalar-evolution.h
! 0007bcec3b1a725fc688f0edc9a67b0b  gcc/tree-sra.cc
  c022e816e38c8f399e6a16163c56d6db  gcc/tree-sra.h
  3e42023ef3fe5187ffffddbbb5740208  gcc/tree-ssa-address.cc
  c724c8becbea9eec0f806e3335942c32  gcc/tree-ssa-address.h
  b8450f3f71eba56c45cfa47b8a520ef2  gcc/tree-ssa-alias-compare.h
  1e7d1b7025bec7ac1b3ef3e07d75b4ec  gcc/tree-ssa-alias.cc
  9d359861d05b5dfbc59cbf45c70feb0f  gcc/tree-ssa-alias.h
! fb9d556ca026c34590407a5623efda14  gcc/tree-ssa-ccp.cc
  0facf771754439bdf307ff1c5ae92cb5  gcc/tree-ssa-ccp.h
  56468d0bf8f8f4c754ea03008cc6c0eb  gcc/tree-ssa-coalesce.cc
  44217fe298d550aecd4800f65391c931  gcc/tree-ssa-coalesce.h
--- 125834,125847 ----
  7c11aa147a6d02acce5170cb35aed445  gcc/tree-profile.cc
  b11826e48aec543cca8379767ccc052f  gcc/tree-scalar-evolution.cc
  dddd950fe463803c41bc0c7cddf0fe44  gcc/tree-scalar-evolution.h
! b72513bb0f4b53e7bfa5353836a30feb  gcc/tree-sra.cc
  c022e816e38c8f399e6a16163c56d6db  gcc/tree-sra.h
  3e42023ef3fe5187ffffddbbb5740208  gcc/tree-ssa-address.cc
  c724c8becbea9eec0f806e3335942c32  gcc/tree-ssa-address.h
  b8450f3f71eba56c45cfa47b8a520ef2  gcc/tree-ssa-alias-compare.h
  1e7d1b7025bec7ac1b3ef3e07d75b4ec  gcc/tree-ssa-alias.cc
  9d359861d05b5dfbc59cbf45c70feb0f  gcc/tree-ssa-alias.h
! 71051582e10271aed20de0c0dd941c99  gcc/tree-ssa-ccp.cc
  0facf771754439bdf307ff1c5ae92cb5  gcc/tree-ssa-ccp.h
  56468d0bf8f8f4c754ea03008cc6c0eb  gcc/tree-ssa-coalesce.cc
  44217fe298d550aecd4800f65391c931  gcc/tree-ssa-coalesce.h
*************** adfc498b0c97a8123c02d418757df496  gcc/tr
*** 125738,125744 ****
  0046e212ff1b9f3f4d27d055aa299c47  gcc/tree-ssa-dom.h
  6ddd79e7a349847a539144d422bf5a49  gcc/tree-ssa-dse.cc
  a6d83be241a72da1740cf6c5b2ce7d52  gcc/tree-ssa-dse.h
! a7db71cf7458e03a902bb5446731c9bf  gcc/tree-ssa-forwprop.cc
  0915c4bbeb42abdda8799c2b27e5db12  gcc/tree-ssa-ifcombine.cc
  edab16a20512b0146482bb2120696d6a  gcc/tree-ssa-live.cc
  cf4bde43ab3b843eff45bac243d4116d  gcc/tree-ssa-live.h
--- 125852,125858 ----
  0046e212ff1b9f3f4d27d055aa299c47  gcc/tree-ssa-dom.h
  6ddd79e7a349847a539144d422bf5a49  gcc/tree-ssa-dse.cc
  a6d83be241a72da1740cf6c5b2ce7d52  gcc/tree-ssa-dse.h
! 9dd9941b261d30af272484037659f32e  gcc/tree-ssa-forwprop.cc
  0915c4bbeb42abdda8799c2b27e5db12  gcc/tree-ssa-ifcombine.cc
  edab16a20512b0146482bb2120696d6a  gcc/tree-ssa-live.cc
  cf4bde43ab3b843eff45bac243d4116d  gcc/tree-ssa-live.h
*************** fbcc93539b376489c1256eb8cf2d4800  gcc/tr
*** 125756,125773 ****
  57dcd3919dadb6f23e2bcefe55f7cd14  gcc/tree-ssa-loop-unswitch.cc
  2f97e7f187f4f4cce48b71489ef542a0  gcc/tree-ssa-loop.cc
  538146c17730f67ffcc58afdfcc93712  gcc/tree-ssa-loop.h
! b95e9f0aa9d4eb7a66303c94ffbdcbb5  gcc/tree-ssa-math-opts.cc
  c0b0549adb2c1140cf285901abb5a78c  gcc/tree-ssa-math-opts.h
  8ccf736dffb311078aa79c9036502189  gcc/tree-ssa-operands.cc
  da72a60de8a6f51a635ead26120d3cc7  gcc/tree-ssa-operands.h
  7932e23b35e7d0ecd4d4af27da96ad29  gcc/tree-ssa-phiopt.cc
  482f2356d81c3633ca476cd6628908b8  gcc/tree-ssa-phiprop.cc
! 376705b97b4d04600605aebe5b8150ab  gcc/tree-ssa-pre.cc
  bc94d7017980d97ff957feb308ae771c  gcc/tree-ssa-propagate.cc
  fc4f0e674e345822394ee5645ce22429  gcc/tree-ssa-propagate.h
  128e45b0a401ad495d13d7de1062bd6e  gcc/tree-ssa-reassoc.cc
  258492cd7ef04be49374ea1e670f3b5b  gcc/tree-ssa-reassoc.h
! 242117ff7b46c9e52725ced36017e23f  gcc/tree-ssa-sccvn.cc
  952cb2484413ce2cf094a52b596dc078  gcc/tree-ssa-sccvn.h
  a27c58eccc3d8929767feb76dc99399f  gcc/tree-ssa-scopedtables.cc
  aa25adbcb019dd38a66ce237df54ae1d  gcc/tree-ssa-scopedtables.h
--- 125870,125887 ----
  57dcd3919dadb6f23e2bcefe55f7cd14  gcc/tree-ssa-loop-unswitch.cc
  2f97e7f187f4f4cce48b71489ef542a0  gcc/tree-ssa-loop.cc
  538146c17730f67ffcc58afdfcc93712  gcc/tree-ssa-loop.h
! 7338d27cec6bb97f637438cf4345eda3  gcc/tree-ssa-math-opts.cc
  c0b0549adb2c1140cf285901abb5a78c  gcc/tree-ssa-math-opts.h
  8ccf736dffb311078aa79c9036502189  gcc/tree-ssa-operands.cc
  da72a60de8a6f51a635ead26120d3cc7  gcc/tree-ssa-operands.h
  7932e23b35e7d0ecd4d4af27da96ad29  gcc/tree-ssa-phiopt.cc
  482f2356d81c3633ca476cd6628908b8  gcc/tree-ssa-phiprop.cc
! 0b56ba415f4caef4c66dab3394a7f2d1  gcc/tree-ssa-pre.cc
  bc94d7017980d97ff957feb308ae771c  gcc/tree-ssa-propagate.cc
  fc4f0e674e345822394ee5645ce22429  gcc/tree-ssa-propagate.h
  128e45b0a401ad495d13d7de1062bd6e  gcc/tree-ssa-reassoc.cc
  258492cd7ef04be49374ea1e670f3b5b  gcc/tree-ssa-reassoc.h
! d0eb9de4eedf03bc98d9f63d2f4b4682  gcc/tree-ssa-sccvn.cc
  952cb2484413ce2cf094a52b596dc078  gcc/tree-ssa-sccvn.h
  a27c58eccc3d8929767feb76dc99399f  gcc/tree-ssa-scopedtables.cc
  aa25adbcb019dd38a66ce237df54ae1d  gcc/tree-ssa-scopedtables.h
*************** c98debbdc978c10e8934f3b4fb7e2504  gcc/tr
*** 125802,125819 ****
  2195dd84fccf985a9e012fb29c226e1c  gcc/tree-vect-data-refs.cc
  5d8bb0df796ceea958fd65c5aedb5bce  gcc/tree-vect-generic.cc
  f840a486e62fde7baf6f487e0c0912bb  gcc/tree-vect-loop-manip.cc
! b0a61a8437015d03a9c19780ad41d56e  gcc/tree-vect-loop.cc
  7ee8dcefd015e579a263a22081671ddb  gcc/tree-vect-patterns.cc
  f0e64752211e2caf975148f28e7b4caf  gcc/tree-vect-slp-patterns.cc
! 3c7e6c406b9062377928583d5e65143b  gcc/tree-vect-slp.cc
! 7099dae8bd9116194da5834f1376d753  gcc/tree-vect-stmts.cc
  c8efeee600d612c4bae8dda4bd45ee54  gcc/tree-vector-builder.cc
  258611ff1e83cc7680e8c9f033499665  gcc/tree-vector-builder.h
  317f74f101effd03e454446f484bb840  gcc/tree-vectorizer.cc
! 9154116b276403cba93c03872ba44f49  gcc/tree-vectorizer.h
  1bed475667cbd8dee00c3b7da964ca5b  gcc/tree-vrp.cc
  a19edad681d27130bd2a0d83768ac946  gcc/tree-vrp.h
! cf45c706bcbd4031970ce50abf182664  gcc/tree.cc
  2b3067f4ee14760d08fdfee4eb6b8a00  gcc/tree.def
  8928e1b061e537e34f6dccda9abc9c78  gcc/tree.h
  b642c83968cda285afc700da2fb276d5  gcc/treestruct.def
--- 125916,125933 ----
  2195dd84fccf985a9e012fb29c226e1c  gcc/tree-vect-data-refs.cc
  5d8bb0df796ceea958fd65c5aedb5bce  gcc/tree-vect-generic.cc
  f840a486e62fde7baf6f487e0c0912bb  gcc/tree-vect-loop-manip.cc
! 14395a99ace54a81840d19607f9d79a7  gcc/tree-vect-loop.cc
  7ee8dcefd015e579a263a22081671ddb  gcc/tree-vect-patterns.cc
  f0e64752211e2caf975148f28e7b4caf  gcc/tree-vect-slp-patterns.cc
! bdbb899ad6a9db173421fa2bd75d520c  gcc/tree-vect-slp.cc
! f9822faaca6647e08c430d57e311d7e9  gcc/tree-vect-stmts.cc
  c8efeee600d612c4bae8dda4bd45ee54  gcc/tree-vector-builder.cc
  258611ff1e83cc7680e8c9f033499665  gcc/tree-vector-builder.h
  317f74f101effd03e454446f484bb840  gcc/tree-vectorizer.cc
! 4a828e4ebe4daa8ffadaeeb2311baaea  gcc/tree-vectorizer.h
  1bed475667cbd8dee00c3b7da964ca5b  gcc/tree-vrp.cc
  a19edad681d27130bd2a0d83768ac946  gcc/tree-vrp.h
! 7d052ce623433f7f7d8b9e0bd53415cc  gcc/tree.cc
  2b3067f4ee14760d08fdfee4eb6b8a00  gcc/tree.def
  8928e1b061e537e34f6dccda9abc9c78  gcc/tree.h
  b642c83968cda285afc700da2fb276d5  gcc/treestruct.def
*************** cffdeae41b78da05839b193e90188f55  libcod
*** 126147,126153 ****
  6419dfc879387358e95288142e569914  libcody/packet.cc
  688ece05c8b9d378b3df186808162e76  libcody/resolver.cc
  b1f3850fc5ac62999d1e124aa6f76531  libcody/server.cc
! 41ce06f8b3ba8c422fc3832ce92afa04  libcpp/ChangeLog
  2bd831b17997584e38305782cebe6948  libcpp/ChangeLog.jit
  e80a909ca87015a009bee9588bb84a64  libcpp/Makefile.in
  b07c7863f0e7ad4e6a0915d66fc9e582  libcpp/aclocal.m4
--- 126261,126267 ----
  6419dfc879387358e95288142e569914  libcody/packet.cc
  688ece05c8b9d378b3df186808162e76  libcody/resolver.cc
  b1f3850fc5ac62999d1e124aa6f76531  libcody/server.cc
! 2b494e9cbe7e1bd7d738a00bea6daba2  libcpp/ChangeLog
  2bd831b17997584e38305782cebe6948  libcpp/ChangeLog.jit
  e80a909ca87015a009bee9588bb84a64  libcpp/Makefile.in
  b07c7863f0e7ad4e6a0915d66fc9e582  libcpp/aclocal.m4
*************** ce74c78c2cb27bcdeac8a9b0400712cd  libcpp
*** 126164,126177 ****
  c496c50691c37464e0aacc985cc3ab1e  libcpp/identifiers.cc
  afbc7662b6b89d8d2eda44c65840759f  libcpp/include/cpplib.h
  ac88522f7fec46badcd2623d11a4b61e  libcpp/include/label-text.h
! 7bab1640ddcf15772a1a51f0315a3099  libcpp/include/line-map.h
  4779aaa10e24fd2398a105e78bdd88a5  libcpp/include/mkdeps.h
  4425f3f8462ed9bfc4a7255738750310  libcpp/include/rich-location.h
  d516a30568fd33a5e69be4374f27812f  libcpp/include/symtab.h
  45bb530dc147453672601e59319ca355  libcpp/init.cc
  3e462ce9a600968eb061f2c013777a32  libcpp/internal.h
  ec163df1522f3c30aeaeffb9937faa9d  libcpp/lex.cc
! 4db7eb22b48b044d4c574217d110732b  libcpp/line-map.cc
  46a07100f95f5e354c7e25cd19d26884  libcpp/location-example.txt
  063ba025b33226a472d05def21a82339  libcpp/macro.cc
  b4c085899eca6fc0e5ddc81d15fc2e67  libcpp/makeucnid.cc
--- 126278,126291 ----
  c496c50691c37464e0aacc985cc3ab1e  libcpp/identifiers.cc
  afbc7662b6b89d8d2eda44c65840759f  libcpp/include/cpplib.h
  ac88522f7fec46badcd2623d11a4b61e  libcpp/include/label-text.h
! 6e9cd1cd5302cadeeee219ac9b519871  libcpp/include/line-map.h
  4779aaa10e24fd2398a105e78bdd88a5  libcpp/include/mkdeps.h
  4425f3f8462ed9bfc4a7255738750310  libcpp/include/rich-location.h
  d516a30568fd33a5e69be4374f27812f  libcpp/include/symtab.h
  45bb530dc147453672601e59319ca355  libcpp/init.cc
  3e462ce9a600968eb061f2c013777a32  libcpp/internal.h
  ec163df1522f3c30aeaeffb9937faa9d  libcpp/lex.cc
! 2e71ca8fb0f9a1be425b538ec8b24aae  libcpp/line-map.cc
  46a07100f95f5e354c7e25cd19d26884  libcpp/location-example.txt
  063ba025b33226a472d05def21a82339  libcpp/macro.cc
  b4c085899eca6fc0e5ddc81d15fc2e67  libcpp/makeucnid.cc
*************** a3eb5dee2788fe0a6c42502ba658eddd  libffi
*** 126671,126677 ****
  0f3c94e520870e194cf525de7ec404dc  libffi/testsuite/libffi.go/ffitest.h
  6cfb66c1c00023abb2c2276d85f16e77  libffi/testsuite/libffi.go/go.exp
  189dc193fd0e627a2d55b2e84871edc5  libffi/testsuite/libffi.go/static-chain.h
! 7c26ecd84e6f307b9bfc2feaa92aa331  libgcc/ChangeLog
  e63b544f83f9b69bd08ddb095b34235a  libgcc/Makefile.in
  3909078d285165298c78eb97ea152e90  libgcc/config.host
  46412830a2ee8a02503ccc921912c3cf  libgcc/config.in
--- 126785,126791 ----
  0f3c94e520870e194cf525de7ec404dc  libffi/testsuite/libffi.go/ffitest.h
  6cfb66c1c00023abb2c2276d85f16e77  libffi/testsuite/libffi.go/go.exp
  189dc193fd0e627a2d55b2e84871edc5  libffi/testsuite/libffi.go/static-chain.h
! b8aed87d5b85be9cbfa7e81728a6efcf  libgcc/ChangeLog
  e63b544f83f9b69bd08ddb095b34235a  libgcc/Makefile.in
  3909078d285165298c78eb97ea152e90  libgcc/config.host
  46412830a2ee8a02503ccc921912c3cf  libgcc/config.in
*************** b542071feaa6f1914ec810a91b9f0e4c  libgcc
*** 127723,127729 ****
  aa7e916de9b6c06f0f64c1dc074116f4  libgcc/config/riscv/muldi3.S
  b16ca56229fc2572843f9700f47307e9  libgcc/config/riscv/multi3.c
  8129505e5b81842361c33b61dbd3db67  libgcc/config/riscv/riscv-asm.h
! ffbe65548b4c14b8ba9460ab449bf0a9  libgcc/config/riscv/save-restore.S
  836194e6f01d55ef025a43716e7cf247  libgcc/config/riscv/sfp-machine.h
  faf23d25a3df3ab121abc7b9d6d7184f  libgcc/config/riscv/shadow-stack-unwind.h
  6a8be20744258bc3c31a34df112164ce  libgcc/config/riscv/t-crtstuff
--- 127837,127843 ----
  aa7e916de9b6c06f0f64c1dc074116f4  libgcc/config/riscv/muldi3.S
  b16ca56229fc2572843f9700f47307e9  libgcc/config/riscv/multi3.c
  8129505e5b81842361c33b61dbd3db67  libgcc/config/riscv/riscv-asm.h
! 0bbeb8e1de5878d4af2106814dfda049  libgcc/config/riscv/save-restore.S
  836194e6f01d55ef025a43716e7cf247  libgcc/config/riscv/sfp-machine.h
  faf23d25a3df3ab121abc7b9d6d7184f  libgcc/config/riscv/shadow-stack-unwind.h
  6a8be20744258bc3c31a34df112164ce  libgcc/config/riscv/t-crtstuff
*************** f63a06d746592d67d8c161bc2461a24e  libgfo
*** 129295,129301 ****
  e90afde1ec8653f66d433a7cc5e070a7  libgfortran/runtime/select_inc.c
  fa1f81a5ee204308c775545490d24fbd  libgfortran/runtime/stop.c
  08f6570c94f64b0aaf21fb2ec9aa10e9  libgfortran/runtime/string.c
! 8964d516ca77dffa5d218ff20a35f68e  libgm2/ChangeLog
  81dadb03add7a7278a98cd845177e76a  libgm2/Makefile.am
  38778826306c4efe1f6a33cb21cece23  libgm2/Makefile.in
  5655398e9c1e3027c587898dc4fce566  libgm2/acinclude.m4
--- 129409,129415 ----
  e90afde1ec8653f66d433a7cc5e070a7  libgfortran/runtime/select_inc.c
  fa1f81a5ee204308c775545490d24fbd  libgfortran/runtime/stop.c
  08f6570c94f64b0aaf21fb2ec9aa10e9  libgfortran/runtime/string.c
! 74695767bad36e095b2dc5a497a86c52  libgm2/ChangeLog
  81dadb03add7a7278a98cd845177e76a  libgm2/Makefile.am
  38778826306c4efe1f6a33cb21cece23  libgm2/Makefile.in
  5655398e9c1e3027c587898dc4fce566  libgm2/acinclude.m4
*************** ba2db7fd78510ae0ff3e50d0d57c1b8d  libgm2
*** 129323,129330 ****
  7f4aeaf0c74fa83422c651bcac4573ea  libgm2/libm2min/Makefile.in
  a9f05e5da997bab66d457b3be2773189  libgm2/libm2min/libc.c
  672db9b5f503b1b02773144313a13746  libgm2/libm2pim/CFileSysOp.cc
! f8df0461dbb353c3db40cf75cf623f56  libgm2/libm2pim/Makefile.am
! 06954b6e0bb1a5bd60026314ca71aa0d  libgm2/libm2pim/Makefile.in
  944531ee3e0d441b1c7209ac2c2355eb  libgm2/libm2pim/Selective.cc
  635915386732139700506c42de8b469d  libgm2/libm2pim/SysExceptions.cc
  04512543e0711f8f6f6e1fb2a995330e  libgm2/libm2pim/UnixArgs.cc
--- 129437,129444 ----
  7f4aeaf0c74fa83422c651bcac4573ea  libgm2/libm2min/Makefile.in
  a9f05e5da997bab66d457b3be2773189  libgm2/libm2min/libc.c
  672db9b5f503b1b02773144313a13746  libgm2/libm2pim/CFileSysOp.cc
! 2c2dfd30d20bfb2b232b7518576739a2  libgm2/libm2pim/Makefile.am
! 18f74b00a77f727a43e2b350dba6738e  libgm2/libm2pim/Makefile.in
  944531ee3e0d441b1c7209ac2c2355eb  libgm2/libm2pim/Selective.cc
  635915386732139700506c42de8b469d  libgm2/libm2pim/SysExceptions.cc
  04512543e0711f8f6f6e1fb2a995330e  libgm2/libm2pim/UnixArgs.cc
*************** a3a7e9ca6057da9ca42e03e41e1c73f7  libgo/
*** 134832,134838 ****
  dcdf1b680b15b372bdb64cc5107d51b6  libgo/testsuite/libgo-test-support.exp.in
  bf162aa572f7b96b25dbd2b027845d32  libgo/testsuite/libgo.testmain/testmain.exp
  cc9d2a0e34e31ba866a8caf9f46f48f3  libgomp/.gitattributes
! 79ac3e5576436b25cec48ea94c34a605  libgomp/ChangeLog
  0d55aa862aee66efdc5f8d62c94ff8fb  libgomp/ChangeLog.graphite
  883cfea6de23904b83d6bd58a729c866  libgomp/Makefile.am
  54c7bc8277669e3bf5f1a3db179ae206  libgomp/Makefile.in
--- 134946,134952 ----
  dcdf1b680b15b372bdb64cc5107d51b6  libgo/testsuite/libgo-test-support.exp.in
  bf162aa572f7b96b25dbd2b027845d32  libgo/testsuite/libgo.testmain/testmain.exp
  cc9d2a0e34e31ba866a8caf9f46f48f3  libgomp/.gitattributes
! abb36b32dec570864d827d16beb78b6b  libgomp/ChangeLog
  0d55aa862aee66efdc5f8d62c94ff8fb  libgomp/ChangeLog.graphite
  883cfea6de23904b83d6bd58a729c866  libgomp/Makefile.am
  54c7bc8277669e3bf5f1a3db179ae206  libgomp/Makefile.in
*************** d41d8cd98f00b204e9800998ecf8427e  libgom
*** 134866,134872 ****
  d41d8cd98f00b204e9800998ecf8427e  libgomp/config/accel/sem.c
  e4e15589f222c2aec21754e3e5a46b08  libgomp/config/accel/sem.h
  203c8c66029647420306a896dff09683  libgomp/config/accel/target-cxa-dso-dtor.c
! 79cd9b5789e0ce828dabd7fac2c70478  libgomp/config/accel/target-indirect.c
  967a256c3675ff0b33580d16d9c4d3fc  libgomp/config/accel/thread-stacksize.h
  917b1d0f3380a24511e6dcd14130b388  libgomp/config/bsd/proc.c
  e71034ea32200ef9be7aef2679314d11  libgomp/config/darwin/plugin-suffix.h
--- 134980,134986 ----
  d41d8cd98f00b204e9800998ecf8427e  libgomp/config/accel/sem.c
  e4e15589f222c2aec21754e3e5a46b08  libgomp/config/accel/sem.h
  203c8c66029647420306a896dff09683  libgomp/config/accel/target-cxa-dso-dtor.c
! 5a3592980a2431463d92244b5189a9a2  libgomp/config/accel/target-indirect.c
  967a256c3675ff0b33580d16d9c4d3fc  libgomp/config/accel/thread-stacksize.h
  917b1d0f3380a24511e6dcd14130b388  libgomp/config/bsd/proc.c
  e71034ea32200ef9be7aef2679314d11  libgomp/config/darwin/plugin-suffix.h
*************** e06b66d85f9af6d6604069e35fbf2a9a  libgom
*** 134882,134888 ****
  e4b6cb67b158f442665d13bb328b54d8  libgomp/config/gcn/simple-bar.h
  38765671d422423c3247797bb4f1d8a6  libgomp/config/gcn/target.c
  6f8b906d752f32dc41471244abcb677d  libgomp/config/gcn/task.c
! f3cb3f8d0f00e94aaa5ef1c69264a7c6  libgomp/config/gcn/team.c
  3717defca7199ec75546417cfbd533bd  libgomp/config/gcn/teams.c
  08f45643e2ed98e1720544184d88dd55  libgomp/config/gcn/time.c
  ce0a50bc726967d0319a49c79324bfb7  libgomp/config/hpux/plugin-suffix.h
--- 134996,135002 ----
  e4b6cb67b158f442665d13bb328b54d8  libgomp/config/gcn/simple-bar.h
  38765671d422423c3247797bb4f1d8a6  libgomp/config/gcn/target.c
  6f8b906d752f32dc41471244abcb677d  libgomp/config/gcn/task.c
! c3776c498c46e83053f937447aeb6007  libgomp/config/gcn/team.c
  3717defca7199ec75546417cfbd533bd  libgomp/config/gcn/teams.c
  08f45643e2ed98e1720544184d88dd55  libgomp/config/gcn/time.c
  ce0a50bc726967d0319a49c79324bfb7  libgomp/config/hpux/plugin-suffix.h
*************** d41d8cd98f00b204e9800998ecf8427e  libgom
*** 134928,134934 ****
  24405a02fbc20420cf05ae605fe2c6df  libgomp/config/nvptx/simple-bar.h
  d7b41fedfc02c566f5e61e46994a6b47  libgomp/config/nvptx/target.c
  29de44d64f2e9faa08f2a984d1011d1a  libgomp/config/nvptx/task.c
! 71272babe617e066fb1c768188513815  libgomp/config/nvptx/team.c
  07212d44ec2f60f09ee16aee782fe3e9  libgomp/config/nvptx/teams.c
  eb60875fc3bbaf9cf0d1870140fbca12  libgomp/config/nvptx/time.c
  06f9d1c99954bad831dc1c7d8bafab7e  libgomp/config/posix/bar.c
--- 135042,135048 ----
  24405a02fbc20420cf05ae605fe2c6df  libgomp/config/nvptx/simple-bar.h
  d7b41fedfc02c566f5e61e46994a6b47  libgomp/config/nvptx/target.c
  29de44d64f2e9faa08f2a984d1011d1a  libgomp/config/nvptx/task.c
! cc9d11f24e92d65a0a4b18e13de12e91  libgomp/config/nvptx/team.c
  07212d44ec2f60f09ee16aee782fe3e9  libgomp/config/nvptx/teams.c
  eb60875fc3bbaf9cf0d1870140fbca12  libgomp/config/nvptx/time.c
  06f9d1c99954bad831dc1c7d8bafab7e  libgomp/config/posix/bar.c
*************** f4c32f19e8df86d2ac9c3d4cc4e788f1  libgom
*** 134971,134981 ****
  c798aea0a594e97c71edb3bd8cb93579  libgomp/iter.c
  c3d837ee5481f078c8b7875c1c8306be  libgomp/iter_ull.c
  0214d07a09a5c6e422ca9541c3f6cba4  libgomp/libgomp-plugin.c
! fe834e77193cffc9757fa7871241a57b  libgomp/libgomp-plugin.h
  b5ba8a8b2b31f2f9bd9ac0760b81da9f  libgomp/libgomp.h
! 50f762df7ab8d23bd5473f223e32cf05  libgomp/libgomp.map
  8b2aa50aecad82171348a6918309afd6  libgomp/libgomp.spec.in
! c6dc43e85e38ed58615bcb417d638bdf  libgomp/libgomp.texi
  519d28879206bae759d85cd3bb7b493b  libgomp/libgomp_f.h.in
  fdadcc861565b686070908326f5e5914  libgomp/libgomp_g.h
  a5060d745455b036a62cc46de1fe0576  libgomp/lock.c
--- 135085,135095 ----
  c798aea0a594e97c71edb3bd8cb93579  libgomp/iter.c
  c3d837ee5481f078c8b7875c1c8306be  libgomp/iter_ull.c
  0214d07a09a5c6e422ca9541c3f6cba4  libgomp/libgomp-plugin.c
! ca30439efac08d7424bfe64b90c7f766  libgomp/libgomp-plugin.h
  b5ba8a8b2b31f2f9bd9ac0760b81da9f  libgomp/libgomp.h
! cd6a22eaa3c99a58084ad32602f087b4  libgomp/libgomp.map
  8b2aa50aecad82171348a6918309afd6  libgomp/libgomp.spec.in
! 641637e0c5530334ba0818fa4d6721dc  libgomp/libgomp.texi
  519d28879206bae759d85cd3bb7b493b  libgomp/libgomp_f.h.in
  fdadcc861565b686070908326f5e5914  libgomp/libgomp_g.h
  a5060d745455b036a62cc46de1fe0576  libgomp/lock.c
*************** a6450e2f5f7558ce92992048a3735241  libgom
*** 134995,135010 ****
  f4080aa598473de8d849993fbfcfc325  libgomp/omp.h.in
  e41ce4d9881cd8bf0280948cc5c90ae9  libgomp/omp_lib.f90.in
  b64dca060dc3e768889b5d0f6086e4d0  libgomp/omp_lib.h.in
! 4c345ac8d457324852e73fe101855d28  libgomp/openacc.f90
  0380c0cfc562bb08603d6ff4bb9c8311  libgomp/openacc.h
! ee7467fc60de907fbbc3632234d39a0a  libgomp/openacc_lib.h
  70196de117934b7f120ff364699b0142  libgomp/ordered.c
  5d03c6596f36bc8b6127cd047fb71b81  libgomp/parallel.c
  b62a5d146dc237f28322cddf18c8a8bc  libgomp/plugin/Makefrag.am
  5a5c5a37c066333fa237c308a243cda1  libgomp/plugin/configfrag.ac
  b8346079425832c85a1dfc7ac3ab0286  libgomp/plugin/cuda-lib.def
! 2dd9ec99d8ce250f267f3dbeaccf8e67  libgomp/plugin/plugin-gcn.c
! d32639035041c7d7777507609f118dc5  libgomp/plugin/plugin-nvptx.c
  0f2fc4f7d0850afd090ba2bb43681c8a  libgomp/priority_queue.c
  5c28f5f7bbc16dada259efc296bbe9f3  libgomp/priority_queue.h
  f1eee47026bb1c516cd1b3a9b9c1c5fa  libgomp/scope.c
--- 135109,135125 ----
  f4080aa598473de8d849993fbfcfc325  libgomp/omp.h.in
  e41ce4d9881cd8bf0280948cc5c90ae9  libgomp/omp_lib.f90.in
  b64dca060dc3e768889b5d0f6086e4d0  libgomp/omp_lib.h.in
! f24734d0f876e60f6edf6283233372be  libgomp/openacc.f90
  0380c0cfc562bb08603d6ff4bb9c8311  libgomp/openacc.h
! 61774236eebfdd613ffcc94220388876  libgomp/openacc_lib.h
  70196de117934b7f120ff364699b0142  libgomp/ordered.c
  5d03c6596f36bc8b6127cd047fb71b81  libgomp/parallel.c
  b62a5d146dc237f28322cddf18c8a8bc  libgomp/plugin/Makefrag.am
+ 00915d9ce3e412613822d106e8c71deb  libgomp/plugin/build-target-indirect-htab.h
  5a5c5a37c066333fa237c308a243cda1  libgomp/plugin/configfrag.ac
  b8346079425832c85a1dfc7ac3ab0286  libgomp/plugin/cuda-lib.def
! 5a465ff19c8799f9c46da7217d063e9d  libgomp/plugin/plugin-gcn.c
! a0f8747c7e03cadfd8bdc827e4783db2  libgomp/plugin/plugin-nvptx.c
  0f2fc4f7d0850afd090ba2bb43681c8a  libgomp/priority_queue.c
  5c28f5f7bbc16dada259efc296bbe9f3  libgomp/priority_queue.h
  f1eee47026bb1c516cd1b3a9b9c1c5fa  libgomp/scope.c
*************** e1fa8ce4f72dcee9fa7fa3c1656fbf01  libgom
*** 135499,135504 ****
--- 135614,135620 ----
  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
+ 87cbcc55746faa452b358c6cc4478de3  libgomp/testsuite/libgomp.c-c++-common/declare-variant-1.c
  12e3ee01b70343537315551db476c391  libgomp/testsuite/libgomp.c-c++-common/declare_target-1.c
  59c8656b7740501a704831756762d395  libgomp/testsuite/libgomp.c-c++-common/default-1.c
  a1a09ff547c6ff16fad80cd2261269ee  libgomp/testsuite/libgomp.c-c++-common/depend-1.c
*************** ae34a0a33c324e692b2da2ef2923edb3  libgom
*** 137545,137550 ****
--- 137661,137667 ----
  1e7d8ccfbe23d4e6f68bae40bce019fe  libgomp/testsuite/libgomp.oacc-fortran/pr84028.f90
  8175cec1f19b14dba021a884c3d90e52  libgomp/testsuite/libgomp.oacc-fortran/pr84955.f90
  23f7ae65627ecb7962557bae27fe0f81  libgomp/testsuite/libgomp.oacc-fortran/pr90030.f90
+ dcad51ef517f82a0e1efb6ee274b6304  libgomp/testsuite/libgomp.oacc-fortran/pr92970-1.f90
  ab1bef1451508c50b6d75e5790e61c2e  libgomp/testsuite/libgomp.oacc-fortran/pr94358-1.f90
  57178f0c49f9adc4befee9c7b93d77af  libgomp/testsuite/libgomp.oacc-fortran/pr96628-part1.f90
  0713d6f197e69942e0bf3ce291d92c25  libgomp/testsuite/libgomp.oacc-fortran/pr96628-part2.f90
*************** d680e7307fb59fe24f8431e179191f16  libssp
*** 139893,139899 ****
  534c3fb4a88e5c1f70db35c12b7742c3  libssp/vsnprintf-chk.c
  34daeb04a522ee796098df4446d6ce61  libssp/vsprintf-chk.c
  9e2de2e1f20ab0ffa2201164de02824f  libstdc++-v3/.editorconfig
! 5fe62beedba088af01c738352988560e  libstdc++-v3/ChangeLog
  7aa6c40440a44fcf5ec94c066160c2f8  libstdc++-v3/ChangeLog-1998
  7aff86600b6a1ed3fa87305075a92db0  libstdc++-v3/ChangeLog-1999
  a6f28e8fc9bb07696a9e068b439a3a87  libstdc++-v3/ChangeLog-2000
--- 140010,140016 ----
  534c3fb4a88e5c1f70db35c12b7742c3  libssp/vsnprintf-chk.c
  34daeb04a522ee796098df4446d6ce61  libssp/vsprintf-chk.c
  9e2de2e1f20ab0ffa2201164de02824f  libstdc++-v3/.editorconfig
! 26db29328f884d8957b47a3b8bbbcd53  libstdc++-v3/ChangeLog
  7aa6c40440a44fcf5ec94c066160c2f8  libstdc++-v3/ChangeLog-1998
  7aff86600b6a1ed3fa87305075a92db0  libstdc++-v3/ChangeLog-1999
  a6f28e8fc9bb07696a9e068b439a3a87  libstdc++-v3/ChangeLog-2000
*************** e3c307e48b9e12b0736fde183ffa8bd7  libstd
*** 140584,140590 ****
  5384dfbb9eb9731df3aca40e40d55350  libstdc++-v3/include/bits/char_traits.h
  195dabcb74f9b313c574745539925b0e  libstdc++-v3/include/bits/charconv.h
  8a303c55e1a9a90d751641a38581e2bc  libstdc++-v3/include/bits/chrono.h
! 42cd11a30ad4d11a2c974f2a8fb6d8c9  libstdc++-v3/include/bits/chrono_io.h
  2ff73cb405cb01626a751e0fa0f339f3  libstdc++-v3/include/bits/codecvt.h
  23fc42ee8644308c793f44d20f00420e  libstdc++-v3/include/bits/concept_check.h
  e999e0783a5ca2165919f352526501e9  libstdc++-v3/include/bits/cow_string.h
--- 140701,140707 ----
  5384dfbb9eb9731df3aca40e40d55350  libstdc++-v3/include/bits/char_traits.h
  195dabcb74f9b313c574745539925b0e  libstdc++-v3/include/bits/charconv.h
  8a303c55e1a9a90d751641a38581e2bc  libstdc++-v3/include/bits/chrono.h
! 137c7e3d07339b64c6a652fc79a69ba2  libstdc++-v3/include/bits/chrono_io.h
  2ff73cb405cb01626a751e0fa0f339f3  libstdc++-v3/include/bits/codecvt.h
  23fc42ee8644308c793f44d20f00420e  libstdc++-v3/include/bits/concept_check.h
  e999e0783a5ca2165919f352526501e9  libstdc++-v3/include/bits/cow_string.h
*************** a0ff2aff5e6b290f02129d8fd5066f94  libstd
*** 140646,140657 ****
  053e1de38aef43bbaf1a9a4af1e3ad2f  libstdc++-v3/include/bits/random.h
  924981b1c29c7c7b010418607af71d7b  libstdc++-v3/include/bits/random.tcc
  b0c29f09a819ac9aa11c3507409c11ef  libstdc++-v3/include/bits/range_access.h
! 6ee3b60b18052d3394ae974bf12e1a01  libstdc++-v3/include/bits/ranges_algo.h
  603de5fc22f9ccbe5726390148fc3a09  libstdc++-v3/include/bits/ranges_algobase.h
  b6d83aa40f63760f6b5a58810aabfae9  libstdc++-v3/include/bits/ranges_base.h
  586727039587b10b560a902b1c7008b1  libstdc++-v3/include/bits/ranges_cmp.h
  2eec8b6abbfa67c2a80da3caf7e0c2c3  libstdc++-v3/include/bits/ranges_uninitialized.h
! 72d086ca35b36e2f1076b431ee799f15  libstdc++-v3/include/bits/ranges_util.h
  222a1067e3c63fb19ed0996234a84884  libstdc++-v3/include/bits/refwrap.h
  5b95e35539d0071176396cd82a6072b7  libstdc++-v3/include/bits/regex.h
  b5ae25c0469c7fb23c0914fcebced654  libstdc++-v3/include/bits/regex.tcc
--- 140763,140774 ----
  053e1de38aef43bbaf1a9a4af1e3ad2f  libstdc++-v3/include/bits/random.h
  924981b1c29c7c7b010418607af71d7b  libstdc++-v3/include/bits/random.tcc
  b0c29f09a819ac9aa11c3507409c11ef  libstdc++-v3/include/bits/range_access.h
! 035d554aee03ff3b4aaec00ee2b7c36a  libstdc++-v3/include/bits/ranges_algo.h
  603de5fc22f9ccbe5726390148fc3a09  libstdc++-v3/include/bits/ranges_algobase.h
  b6d83aa40f63760f6b5a58810aabfae9  libstdc++-v3/include/bits/ranges_base.h
  586727039587b10b560a902b1c7008b1  libstdc++-v3/include/bits/ranges_cmp.h
  2eec8b6abbfa67c2a80da3caf7e0c2c3  libstdc++-v3/include/bits/ranges_uninitialized.h
! 1d1c887295c693bce1fe28dc004684af  libstdc++-v3/include/bits/ranges_util.h
  222a1067e3c63fb19ed0996234a84884  libstdc++-v3/include/bits/refwrap.h
  5b95e35539d0071176396cd82a6072b7  libstdc++-v3/include/bits/regex.h
  b5ae25c0469c7fb23c0914fcebced654  libstdc++-v3/include/bits/regex.tcc
*************** c422f42aab865e6ef70233d1d512473c  libstd
*** 140701,140707 ****
  c48928d63732da42056105c33cf860ff  libstdc++-v3/include/bits/stl_stack.h
  e77200e337d1f4695ed04b8f6fd9991d  libstdc++-v3/include/bits/stl_tempbuf.h
  eaceb582a18a6a7ee11227f1fc82b069  libstdc++-v3/include/bits/stl_tree.h
! e02ea7b4b3b3315d6b233b69e71a35e9  libstdc++-v3/include/bits/stl_uninitialized.h
  a289051282846bf52bb1917bcbbf3673  libstdc++-v3/include/bits/stl_vector.h
  c021eea8ffb782c5cae76e39deaa7369  libstdc++-v3/include/bits/stream_iterator.h
  69fecd7181ec71c850dba6e19cf9a58c  libstdc++-v3/include/bits/streambuf.tcc
--- 140818,140824 ----
  c48928d63732da42056105c33cf860ff  libstdc++-v3/include/bits/stl_stack.h
  e77200e337d1f4695ed04b8f6fd9991d  libstdc++-v3/include/bits/stl_tempbuf.h
  eaceb582a18a6a7ee11227f1fc82b069  libstdc++-v3/include/bits/stl_tree.h
! d8f0e6973adaf965ee91100bb764bb23  libstdc++-v3/include/bits/stl_uninitialized.h
  a289051282846bf52bb1917bcbbf3673  libstdc++-v3/include/bits/stl_vector.h
  c021eea8ffb782c5cae76e39deaa7369  libstdc++-v3/include/bits/stream_iterator.h
  69fecd7181ec71c850dba6e19cf9a58c  libstdc++-v3/include/bits/streambuf.tcc
*************** a229b5c8ad2904a3b3173239225596c4  libstd
*** 140725,140732 ****
  3ddbcccf58411251c2825ae41b697844  libstdc++-v3/include/bits/valarray_array.tcc
  a4c99020fc6d28e94d24a3f60a71b6ec  libstdc++-v3/include/bits/valarray_before.h
  6adf2ccea897e9d5fc8e7650eceac96f  libstdc++-v3/include/bits/vector.tcc
! 6762242aa129c2aa32818c24aca5c112  libstdc++-v3/include/bits/version.def
! 349d6d3166736ed75547d099814290c2  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
--- 140842,140849 ----
  3ddbcccf58411251c2825ae41b697844  libstdc++-v3/include/bits/valarray_array.tcc
  a4c99020fc6d28e94d24a3f60a71b6ec  libstdc++-v3/include/bits/valarray_before.h
  6adf2ccea897e9d5fc8e7650eceac96f  libstdc++-v3/include/bits/vector.tcc
! 64f544527293a6a61ee80d2ceacb3412  libstdc++-v3/include/bits/version.def
! a2cdf9d27e7f25d4593ffda2dfa1a2b0  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
*************** c7512fdd688111026ada39c2eff08f8e  libstd
*** 141293,141302 ****
  c2e511ae49957a9f02446e544d201582  libstdc++-v3/include/std/filesystem
  5aa136a1aaeb7658dee6ccdd5cb6e5c6  libstdc++-v3/include/std/flat_map
  8a5fa0a4bb554b2db8c2fed26a6993ca  libstdc++-v3/include/std/flat_set
! b2dc74693534809200270f0cc6e4aabe  libstdc++-v3/include/std/format
  fa4316749922813b44f2ee282452813b  libstdc++-v3/include/std/forward_list
  e790ae6877466aa86b47f36d201e8563  libstdc++-v3/include/std/fstream
! b44cfa75dc5fc6e60ae23f8648774afb  libstdc++-v3/include/std/functional
  d472ad4b1b5c12e2f731980802d15b50  libstdc++-v3/include/std/future
  d91bc94f2a9c1ff7f642d23c27ec66ae  libstdc++-v3/include/std/generator
  26d2e4ff32739cdce0f87c94a551c38c  libstdc++-v3/include/std/inplace_vector
--- 141410,141419 ----
  c2e511ae49957a9f02446e544d201582  libstdc++-v3/include/std/filesystem
  5aa136a1aaeb7658dee6ccdd5cb6e5c6  libstdc++-v3/include/std/flat_map
  8a5fa0a4bb554b2db8c2fed26a6993ca  libstdc++-v3/include/std/flat_set
! f6945a30cdeffcb1a87b819d64af8630  libstdc++-v3/include/std/format
  fa4316749922813b44f2ee282452813b  libstdc++-v3/include/std/forward_list
  e790ae6877466aa86b47f36d201e8563  libstdc++-v3/include/std/fstream
! 2e2a3e068304b1e949291e4e2e32c780  libstdc++-v3/include/std/functional
  d472ad4b1b5c12e2f731980802d15b50  libstdc++-v3/include/std/future
  d91bc94f2a9c1ff7f642d23c27ec66ae  libstdc++-v3/include/std/generator
  26d2e4ff32739cdce0f87c94a551c38c  libstdc++-v3/include/std/inplace_vector
*************** c9ef2791c2dc0d6c98a1a85c8f6aa473  libstd
*** 141312,141318 ****
  f4af31191dea172207576960ad71d42d  libstdc++-v3/include/std/locale
  8b76fc7da76f0579c2fd1f22821d03be  libstdc++-v3/include/std/map
  c7b78db2858d54519f476912fb458f9a  libstdc++-v3/include/std/mdspan
! 0dd24dd9b5275d8876e90702c09a88e6  libstdc++-v3/include/std/memory
  9e86c11ff29d60fddf403674e9182b36  libstdc++-v3/include/std/memory_resource
  96d4004072aee0df9b1cac29de7649c2  libstdc++-v3/include/std/mutex
  ef0d0725f5b70a4c1b5b62b84b2b63f7  libstdc++-v3/include/std/numbers
--- 141429,141435 ----
  f4af31191dea172207576960ad71d42d  libstdc++-v3/include/std/locale
  8b76fc7da76f0579c2fd1f22821d03be  libstdc++-v3/include/std/map
  c7b78db2858d54519f476912fb458f9a  libstdc++-v3/include/std/mdspan
! 9c15f6b44ef37f2af899836df04c1db0  libstdc++-v3/include/std/memory
  9e86c11ff29d60fddf403674e9182b36  libstdc++-v3/include/std/memory_resource
  96d4004072aee0df9b1cac29de7649c2  libstdc++-v3/include/std/mutex
  ef0d0725f5b70a4c1b5b62b84b2b63f7  libstdc++-v3/include/std/numbers
*************** b944796362aa39fc1cba3747d2247464  libstd
*** 141322,141328 ****
  8883599080e145869428c2dc9e59e2d3  libstdc++-v3/include/std/print
  edcf23ae5a0a665fe8b4c0b76d8bfca1  libstdc++-v3/include/std/queue
  01746ff9db8573f15b943b0c36cce6a8  libstdc++-v3/include/std/random
! 46665d114f172e651e961e0f2870488f  libstdc++-v3/include/std/ranges
  a28bf4bed6789b61535d4b05ff48ba76  libstdc++-v3/include/std/ratio
  400d95a1fd416911b5c47562d7a586cf  libstdc++-v3/include/std/regex
  1bad2aed72c4537e7f08d24c1bf7d375  libstdc++-v3/include/std/scoped_allocator
--- 141439,141445 ----
  8883599080e145869428c2dc9e59e2d3  libstdc++-v3/include/std/print
  edcf23ae5a0a665fe8b4c0b76d8bfca1  libstdc++-v3/include/std/queue
  01746ff9db8573f15b943b0c36cce6a8  libstdc++-v3/include/std/random
! b2c8adc712b229eb8f3ea4f887d6c1ad  libstdc++-v3/include/std/ranges
  a28bf4bed6789b61535d4b05ff48ba76  libstdc++-v3/include/std/ratio
  400d95a1fd416911b5c47562d7a586cf  libstdc++-v3/include/std/regex
  1bad2aed72c4537e7f08d24c1bf7d375  libstdc++-v3/include/std/scoped_allocator
*************** b9cf79d1edae688927d40109f321047a  libstd
*** 141345,141351 ****
  21988a8b4bf87b01fc566fe8659ab2cc  libstdc++-v3/include/std/system_error
  608edef7344e2e25c7b00170df6fa9e6  libstdc++-v3/include/std/text_encoding
  69cb1e47f224bd1b5ecfe3d36600ebfc  libstdc++-v3/include/std/thread
! 6ec655e7fd49c6ce8c2ddd38a3b6b9dc  libstdc++-v3/include/std/tuple
  5ea768fa6c707d59799120d2c8762c2a  libstdc++-v3/include/std/type_traits
  237682577d22ec3f9f5046abf0acd8e7  libstdc++-v3/include/std/typeindex
  520c52362f53e18f20838693cfd131bf  libstdc++-v3/include/std/unordered_map
--- 141462,141468 ----
  21988a8b4bf87b01fc566fe8659ab2cc  libstdc++-v3/include/std/system_error
  608edef7344e2e25c7b00170df6fa9e6  libstdc++-v3/include/std/text_encoding
  69cb1e47f224bd1b5ecfe3d36600ebfc  libstdc++-v3/include/std/thread
! 6a912165950b41a11eba8f84922e548d  libstdc++-v3/include/std/tuple
  5ea768fa6c707d59799120d2c8762c2a  libstdc++-v3/include/std/type_traits
  237682577d22ec3f9f5046abf0acd8e7  libstdc++-v3/include/std/typeindex
  520c52362f53e18f20838693cfd131bf  libstdc++-v3/include/std/unordered_map
*************** d85f3a53465585d54b96880e79456c79  libstd
*** 141659,141665 ****
  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
! af6929dcc1a2ab5d6974fbf06043509e  libstdc++-v3/src/c++23/std.cc.in
  ef2786c62e1aa27a5405d7bf70e5212c  libstdc++-v3/src/c++23/std.compat.cc.in
  757f1e829f27dedf5e8d7d83b358ad27  libstdc++-v3/src/c++26/Makefile.am
  3cdab153592c4a94c6607ed5cd536469  libstdc++-v3/src/c++26/Makefile.in
--- 141776,141782 ----
  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
! 29bfb50ecdc73815f55aac6e64f70cb4  libstdc++-v3/src/c++23/std.cc.in
  ef2786c62e1aa27a5405d7bf70e5212c  libstdc++-v3/src/c++23/std.compat.cc.in
  757f1e829f27dedf5e8d7d83b358ad27  libstdc++-v3/src/c++26/Makefile.am
  3cdab153592c4a94c6607ed5cd536469  libstdc++-v3/src/c++26/Makefile.in
*************** dc811926d3a0cc8410b37f38fd276e62  libstd
*** 142135,142141 ****
  7fdf3835a346e7ef9a3a8308d819b141  libstdc++-v3/testsuite/20_util/bind/cv_quals.cc
  3296aff77062491cdbb021ced8c9691a  libstdc++-v3/testsuite/20_util/bind/cv_quals_2.cc
  eb24581e6901c23d8bdbfca254833195  libstdc++-v3/testsuite/20_util/bind/cv_quals_3.cc
! 7108e4b81832823bce96a6c579a9a3c4  libstdc++-v3/testsuite/20_util/bind/dangling_ref.cc
  499a492e07678a83b4feca56bc7dec38  libstdc++-v3/testsuite/20_util/bind/is_placeholder_v.cc
  a8a56b45372ab9a92235b9c43274978f  libstdc++-v3/testsuite/20_util/bind/move.cc
  113518e192b41e33301c903e8048d393  libstdc++-v3/testsuite/20_util/bind/nested.cc
--- 142252,142258 ----
  7fdf3835a346e7ef9a3a8308d819b141  libstdc++-v3/testsuite/20_util/bind/cv_quals.cc
  3296aff77062491cdbb021ced8c9691a  libstdc++-v3/testsuite/20_util/bind/cv_quals_2.cc
  eb24581e6901c23d8bdbfca254833195  libstdc++-v3/testsuite/20_util/bind/cv_quals_3.cc
! 9e20c0553ba5c2a0e7032207ebaef1c2  libstdc++-v3/testsuite/20_util/bind/dangling_ref.cc
  499a492e07678a83b4feca56bc7dec38  libstdc++-v3/testsuite/20_util/bind/is_placeholder_v.cc
  a8a56b45372ab9a92235b9c43274978f  libstdc++-v3/testsuite/20_util/bind/move.cc
  113518e192b41e33301c903e8048d393  libstdc++-v3/testsuite/20_util/bind/nested.cc
*************** cf0e17bbd866d9cd26def3c1b550256c  libstd
*** 142376,142391 ****
  301115b4ac6059939af6a41b978b489a  libstdc++-v3/testsuite/20_util/function/target_no_rtti.cc
  934613f8f3ada29d61e506f84d74b218  libstdc++-v3/testsuite/20_util/function_objects/121782.cc
  8f5e17f706249e407588401c4f4da0c4  libstdc++-v3/testsuite/20_util/function_objects/83607.cc
! 2730a0bf441e209b7b0283acc7a1e230  libstdc++-v3/testsuite/20_util/function_objects/bind_back/1.cc
  a170197e1c15888e69e8f42454c4eb22  libstdc++-v3/testsuite/20_util/function_objects/bind_back/111327.cc
  2f63cd2255fde6cd4f014efb1ad34b27  libstdc++-v3/testsuite/20_util/function_objects/bind_back/116038.cc
! f2aceb62a85b385da954091149e35356  libstdc++-v3/testsuite/20_util/function_objects/bind_front/1.cc
  b7e1e25aa8f6fddecd578ce1c23b63e2  libstdc++-v3/testsuite/20_util/function_objects/bind_front/107784.cc
  8db3b98751c1e7c5aa70b7392e0f66ac  libstdc++-v3/testsuite/20_util/function_objects/bind_front/111327.cc
  586c9c5a05cff6578318e5d46789f1c9  libstdc++-v3/testsuite/20_util/function_objects/bind_front/116038.cc
  1a693160b90575d90d17b98c05d54334  libstdc++-v3/testsuite/20_util/function_objects/bind_front/2.cc
  ca6516aefe54fd40ebaa1dafa0a11255  libstdc++-v3/testsuite/20_util/function_objects/bind_front/97101.cc
  3cfdb7914d47020c2f60f9d7e8289c83  libstdc++-v3/testsuite/20_util/function_objects/bind_front/constexpr.cc
  24b9567e8fc21dd935610beedfbf85aa  libstdc++-v3/testsuite/20_util/function_objects/binders/1.cc
  6bab66b664cfd3bdfffcc4a40e8765c9  libstdc++-v3/testsuite/20_util/function_objects/binders/3113.cc
  9eada3d910abb2dab015aedf3bc0d541  libstdc++-v3/testsuite/20_util/function_objects/comparisons.cc
--- 142493,142512 ----
  301115b4ac6059939af6a41b978b489a  libstdc++-v3/testsuite/20_util/function/target_no_rtti.cc
  934613f8f3ada29d61e506f84d74b218  libstdc++-v3/testsuite/20_util/function_objects/121782.cc
  8f5e17f706249e407588401c4f4da0c4  libstdc++-v3/testsuite/20_util/function_objects/83607.cc
! bb5934b398d6cba561011cc412b7862b  libstdc++-v3/testsuite/20_util/function_objects/bind_back/1.cc
  a170197e1c15888e69e8f42454c4eb22  libstdc++-v3/testsuite/20_util/function_objects/bind_back/111327.cc
  2f63cd2255fde6cd4f014efb1ad34b27  libstdc++-v3/testsuite/20_util/function_objects/bind_back/116038.cc
! bdc579b4b0831d9096219b9607d91d1d  libstdc++-v3/testsuite/20_util/function_objects/bind_back/nttp.cc
! a41d567a9f64dcc981f9f9fab7c2aa14  libstdc++-v3/testsuite/20_util/function_objects/bind_back/nttp_neg.cc
! 3069d4262424e54c9e41d54964effde3  libstdc++-v3/testsuite/20_util/function_objects/bind_front/1.cc
  b7e1e25aa8f6fddecd578ce1c23b63e2  libstdc++-v3/testsuite/20_util/function_objects/bind_front/107784.cc
  8db3b98751c1e7c5aa70b7392e0f66ac  libstdc++-v3/testsuite/20_util/function_objects/bind_front/111327.cc
  586c9c5a05cff6578318e5d46789f1c9  libstdc++-v3/testsuite/20_util/function_objects/bind_front/116038.cc
  1a693160b90575d90d17b98c05d54334  libstdc++-v3/testsuite/20_util/function_objects/bind_front/2.cc
  ca6516aefe54fd40ebaa1dafa0a11255  libstdc++-v3/testsuite/20_util/function_objects/bind_front/97101.cc
  3cfdb7914d47020c2f60f9d7e8289c83  libstdc++-v3/testsuite/20_util/function_objects/bind_front/constexpr.cc
+ a2cabdd81f7ffaa735fea49d1b3a8b76  libstdc++-v3/testsuite/20_util/function_objects/bind_front/nttp.cc
+ 28e8e9561e8b06ee357778c9794a1e18  libstdc++-v3/testsuite/20_util/function_objects/bind_front/nttp_neg.cc
  24b9567e8fc21dd935610beedfbf85aa  libstdc++-v3/testsuite/20_util/function_objects/binders/1.cc
  6bab66b664cfd3bdfffcc4a40e8765c9  libstdc++-v3/testsuite/20_util/function_objects/binders/3113.cc
  9eada3d910abb2dab015aedf3bc0d541  libstdc++-v3/testsuite/20_util/function_objects/comparisons.cc
*************** ff6c4579fd9a68a2d44a0b8d16f91b70  libstd
*** 142416,142421 ****
--- 142537,142544 ----
  aa8d69634a029bc703f7e9108347b384  libstdc++-v3/testsuite/20_util/function_objects/not_fn/111327.cc
  09052f313029340fd1ab81b3fb208f6e  libstdc++-v3/testsuite/20_util/function_objects/not_fn/87538.cc
  09755c5f4b9f88cb66ad1af5db8c2de8  libstdc++-v3/testsuite/20_util/function_objects/not_fn/constexpr.cc
+ 6db33e0a9ff52622394d1e38c0461bb5  libstdc++-v3/testsuite/20_util/function_objects/not_fn/nttp.cc
+ 3410c0de8790ca4226e2476bce02a139  libstdc++-v3/testsuite/20_util/function_objects/not_fn/nttp_neg.cc
  91cfdce8c977003b54d30276c3da4de7  libstdc++-v3/testsuite/20_util/function_objects/range.cmp/equal_to.cc
  b1e66e2c7061c4da356d95b75e45b9f1  libstdc++-v3/testsuite/20_util/function_objects/range.cmp/greater.cc
  9e953a7e9438d39f962eb82c52623a4a  libstdc++-v3/testsuite/20_util/function_objects/range.cmp/greater_equal.cc
*************** c74a827c144ff0e444812aa72303f939  libstd
*** 142461,142467 ****
  d9263c70ce78dea057221091a1defbb4  libstdc++-v3/testsuite/20_util/headers/ctime/functions_std.cc
  c321382f19a792acb5701f0f9c65a376  libstdc++-v3/testsuite/20_util/headers/ctime/macros.cc
  1949a66ac63785b744802e205dd66249  libstdc++-v3/testsuite/20_util/headers/ctime/types_std.cc
! 5cd2bc24ab7286fc3de79184c1ebbce9  libstdc++-v3/testsuite/20_util/headers/functional/synopsis.cc
  8e22bcce2b7196ff33d088efc48ff1ec  libstdc++-v3/testsuite/20_util/headers/functional/types_std_c++0x.cc
  a69299709ad55c8e891216919470533c  libstdc++-v3/testsuite/20_util/headers/functional/using_namespace_std_placeholders.cc
  8b53fa85edafd52c50395631802734a2  libstdc++-v3/testsuite/20_util/headers/memory/114866.cc
--- 142584,142590 ----
  d9263c70ce78dea057221091a1defbb4  libstdc++-v3/testsuite/20_util/headers/ctime/functions_std.cc
  c321382f19a792acb5701f0f9c65a376  libstdc++-v3/testsuite/20_util/headers/ctime/macros.cc
  1949a66ac63785b744802e205dd66249  libstdc++-v3/testsuite/20_util/headers/ctime/types_std.cc
! 4457ea7c6398250735972f3712b221fd  libstdc++-v3/testsuite/20_util/headers/functional/synopsis.cc
  8e22bcce2b7196ff33d088efc48ff1ec  libstdc++-v3/testsuite/20_util/headers/functional/types_std_c++0x.cc
  a69299709ad55c8e891216919470533c  libstdc++-v3/testsuite/20_util/headers/functional/using_namespace_std_placeholders.cc
  8b53fa85edafd52c50395631802734a2  libstdc++-v3/testsuite/20_util/headers/memory/114866.cc
*************** bdfa105b922bad5336a8c6d4533fc51f  libstd
*** 143007,143013 ****
  ff0ccdc05468ddce08d4ada91d33b781  libstdc++-v3/testsuite/20_util/ratio/operations/ops1.cc
  57f67e63ff4fb275bd9b09db383ca4df  libstdc++-v3/testsuite/20_util/ratio/operations/ops2.cc
  30cad9ff52b866b92a63310ead4f5c6c  libstdc++-v3/testsuite/20_util/ratio/operations/ops3.cc
! ad80681b6b901b11613ce8bef15006b3  libstdc++-v3/testsuite/20_util/ratio/operations/ops_overflow_neg.cc
  2397ab3807a9eb62ad653d874d58d857  libstdc++-v3/testsuite/20_util/ratio/requirements/constexpr_data.cc
  69afdb8700e22b161a1f973e70aff227  libstdc++-v3/testsuite/20_util/ratio/requirements/ratio_equal_v.cc
  d8bbe2c17046f08594a91f5a8e216ba7  libstdc++-v3/testsuite/20_util/ratio/requirements/type_constraints.cc
--- 143130,143136 ----
  ff0ccdc05468ddce08d4ada91d33b781  libstdc++-v3/testsuite/20_util/ratio/operations/ops1.cc
  57f67e63ff4fb275bd9b09db383ca4df  libstdc++-v3/testsuite/20_util/ratio/operations/ops2.cc
  30cad9ff52b866b92a63310ead4f5c6c  libstdc++-v3/testsuite/20_util/ratio/operations/ops3.cc
! a0585b8c8242c82e134c9055fdfd1dc9  libstdc++-v3/testsuite/20_util/ratio/operations/ops_overflow_neg.cc
  2397ab3807a9eb62ad653d874d58d857  libstdc++-v3/testsuite/20_util/ratio/requirements/constexpr_data.cc
  69afdb8700e22b161a1f973e70aff227  libstdc++-v3/testsuite/20_util/ratio/requirements/ratio_equal_v.cc
  d8bbe2c17046f08594a91f5a8e216ba7  libstdc++-v3/testsuite/20_util/ratio/requirements/type_constraints.cc
*************** e2b40f273adc9c3cdf931a505b25a3e3  libstd
*** 143476,143482 ****
  7cc86eac7379c689c0ac47faf59dee7f  libstdc++-v3/testsuite/20_util/unique_ptr/hash/types.cc
  865ecdda52bcc46067ae1155b4fc802d  libstdc++-v3/testsuite/20_util/unique_ptr/io/lwg2948.cc
  bb40414adb587ca6cdd1ffd17960c9e2  libstdc++-v3/testsuite/20_util/unique_ptr/lwg2762.cc
! a5234a3d63fc5d686aba74601e09973e  libstdc++-v3/testsuite/20_util/unique_ptr/lwg4148.cc
  a87ada64946cd931cadfaa13b513a900  libstdc++-v3/testsuite/20_util/unique_ptr/modifiers/43183.cc
  1dba41a3d994169c6dc80f6e218ba745  libstdc++-v3/testsuite/20_util/unique_ptr/modifiers/48398.cc
  1522af3c74e321802d64a0867e5e7e82  libstdc++-v3/testsuite/20_util/unique_ptr/modifiers/93562.cc
--- 143599,143605 ----
  7cc86eac7379c689c0ac47faf59dee7f  libstdc++-v3/testsuite/20_util/unique_ptr/hash/types.cc
  865ecdda52bcc46067ae1155b4fc802d  libstdc++-v3/testsuite/20_util/unique_ptr/io/lwg2948.cc
  bb40414adb587ca6cdd1ffd17960c9e2  libstdc++-v3/testsuite/20_util/unique_ptr/lwg2762.cc
! 455915dfcf4dc6251c24ac413d3dfcde  libstdc++-v3/testsuite/20_util/unique_ptr/lwg4148.cc
  a87ada64946cd931cadfaa13b513a900  libstdc++-v3/testsuite/20_util/unique_ptr/modifiers/43183.cc
  1dba41a3d994169c6dc80f6e218ba745  libstdc++-v3/testsuite/20_util/unique_ptr/modifiers/48398.cc
  1522af3c74e321802d64a0867e5e7e82  libstdc++-v3/testsuite/20_util/unique_ptr/modifiers/93562.cc
*************** c1f319ba7f6ad7a6795bac75046271d0  libstd
*** 149231,149237 ****
  6afaee620f593086673491093e9e2c83  libstdc++-v3/testsuite/29_atomics/atomic/operators/56011.cc
  e4b6fcfd2a515534e7ba19934850347b  libstdc++-v3/testsuite/29_atomics/atomic/operators/integral_assignment.cc
  23d004ef8bc7604cf4a60c8c4af4adc1  libstdc++-v3/testsuite/29_atomics/atomic/operators/integral_conversion.cc
! b3d8282607956ee4826df350c5a70605  libstdc++-v3/testsuite/29_atomics/atomic/operators/pointer_partial_void.cc
  68b6db9b9df1ee4ad267757efbd252a7  libstdc++-v3/testsuite/29_atomics/atomic/requirements/base_classes.cc
  4770655eced43833b45a7bff9815589f  libstdc++-v3/testsuite/29_atomics/atomic/requirements/compare_exchange_lowering.cc
  638a3151b6917b31577257fe25faead9  libstdc++-v3/testsuite/29_atomics/atomic/requirements/explicit_instantiation/1.cc
--- 149354,149360 ----
  6afaee620f593086673491093e9e2c83  libstdc++-v3/testsuite/29_atomics/atomic/operators/56011.cc
  e4b6fcfd2a515534e7ba19934850347b  libstdc++-v3/testsuite/29_atomics/atomic/operators/integral_assignment.cc
  23d004ef8bc7604cf4a60c8c4af4adc1  libstdc++-v3/testsuite/29_atomics/atomic/operators/integral_conversion.cc
! b085cfae753eed6df7ceab06181bf1de  libstdc++-v3/testsuite/29_atomics/atomic/operators/pointer_partial_void.cc
  68b6db9b9df1ee4ad267757efbd252a7  libstdc++-v3/testsuite/29_atomics/atomic/requirements/base_classes.cc
  4770655eced43833b45a7bff9815589f  libstdc++-v3/testsuite/29_atomics/atomic/requirements/compare_exchange_lowering.cc
  638a3151b6917b31577257fe25faead9  libstdc++-v3/testsuite/29_atomics/atomic/requirements/explicit_instantiation/1.cc
*************** ad9034013bdd2437cca11f0ba1ddc77e  libstd
*** 149440,149446 ****
  541a642f684120cf15e3efab97dbb1c6  libstdc++-v3/testsuite/30_threads/packaged_task/cons/alloc_min.cc
  f928b71e8e3379df3dec12c6778d93f9  libstdc++-v3/testsuite/30_threads/packaged_task/cons/assign_neg.cc
  0333461d9839e0cd5897823f742b9d34  libstdc++-v3/testsuite/30_threads/packaged_task/cons/copy_neg.cc
! 2d4e943c88dcdea2d8e568419eee5f93  libstdc++-v3/testsuite/30_threads/packaged_task/cons/dangling_ref.cc
  e3cd3b55ab1655176e9eae1b0b5f762e  libstdc++-v3/testsuite/30_threads/packaged_task/cons/deduction.cc
  ba4413ab6f8707eecf7439c419b333f6  libstdc++-v3/testsuite/30_threads/packaged_task/cons/deduction_c++23.cc
  3ca08c1b4280612a421fce56478d7c9b  libstdc++-v3/testsuite/30_threads/packaged_task/cons/lwg4154_neg.cc
--- 149563,149569 ----
  541a642f684120cf15e3efab97dbb1c6  libstdc++-v3/testsuite/30_threads/packaged_task/cons/alloc_min.cc
  f928b71e8e3379df3dec12c6778d93f9  libstdc++-v3/testsuite/30_threads/packaged_task/cons/assign_neg.cc
  0333461d9839e0cd5897823f742b9d34  libstdc++-v3/testsuite/30_threads/packaged_task/cons/copy_neg.cc
! 8bf24aa4b59be2677f45827b6c833267  libstdc++-v3/testsuite/30_threads/packaged_task/cons/dangling_ref.cc
  e3cd3b55ab1655176e9eae1b0b5f762e  libstdc++-v3/testsuite/30_threads/packaged_task/cons/deduction.cc
  ba4413ab6f8707eecf7439c419b333f6  libstdc++-v3/testsuite/30_threads/packaged_task/cons/deduction_c++23.cc
  3ca08c1b4280612a421fce56478d7c9b  libstdc++-v3/testsuite/30_threads/packaged_task/cons/lwg4154_neg.cc
*************** bd53b7a3045c16d0fa75e9a8be586efe  libstd
*** 150954,150959 ****
--- 151077,151083 ----
  f8c9db32ebd1429bbaf2c1ead8562583  libstdc++-v3/testsuite/std/memory/polymorphic/invalid_neg.cc
  9730632888af8b3b61abea4eec29259d  libstdc++-v3/testsuite/std/memory/polymorphic/move.cc
  bcef9a9c26c1010ff275c4ccac1aa60f  libstdc++-v3/testsuite/std/memory/polymorphic/move_alloc.cc
+ 45c599ec07af3ccb18a0d8e3c2aea96f  libstdc++-v3/testsuite/std/memory/start_lifetime_as/start_lifetime_as.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
*************** c955965c3f553d2f22124d0ec851dc46  libstd
*** 150980,150986 ****
  23554ff7bbdc68842b9ba4c3ea00fa3d  libstdc++-v3/testsuite/std/ranges/adaptors/93978.cc
  dbe6f7435db569aaba924f0481d026a0  libstdc++-v3/testsuite/std/ranges/adaptors/95322.cc
  72968de065d8a0a9308fe2f187ffa2b7  libstdc++-v3/testsuite/std/ranges/adaptors/99433.cc
! 4ee1b0892ddf6ab45e039a6dd52e09dd  libstdc++-v3/testsuite/std/ranges/adaptors/adjacent/1.cc
  2af3437ec090989e51b23e262005c228  libstdc++-v3/testsuite/std/ranges/adaptors/adjacent_transform/1.cc
  dac51659b91550d54e99335145514b51  libstdc++-v3/testsuite/std/ranges/adaptors/all.cc
  72da4c7ac2546f0a5f6407897e1bd475  libstdc++-v3/testsuite/std/ranges/adaptors/as_const/1.cc
--- 151104,151110 ----
  23554ff7bbdc68842b9ba4c3ea00fa3d  libstdc++-v3/testsuite/std/ranges/adaptors/93978.cc
  dbe6f7435db569aaba924f0481d026a0  libstdc++-v3/testsuite/std/ranges/adaptors/95322.cc
  72968de065d8a0a9308fe2f187ffa2b7  libstdc++-v3/testsuite/std/ranges/adaptors/99433.cc
! b449af0622f9f74f9641842861f71b59  libstdc++-v3/testsuite/std/ranges/adaptors/adjacent/1.cc
  2af3437ec090989e51b23e262005c228  libstdc++-v3/testsuite/std/ranges/adaptors/adjacent_transform/1.cc
  dac51659b91550d54e99335145514b51  libstdc++-v3/testsuite/std/ranges/adaptors/all.cc
  72da4c7ac2546f0a5f6407897e1bd475  libstdc++-v3/testsuite/std/ranges/adaptors/as_const/1.cc
*************** e9ef3f2b572f799b265913487f27690b  libstd
*** 151070,151076 ****
  1cd9b515badcd164d6958b0fbbbb52cf  libstdc++-v3/testsuite/std/time/clock/file/overview.cc
  811bf06fb6123b7a4dc922fa36ba8a06  libstdc++-v3/testsuite/std/time/clock/gps/1.cc
  e9c8ba287435179e8670bb6951a6b4fa  libstdc++-v3/testsuite/std/time/clock/gps/io.cc
! 77e52cac2443b4c26b20b6bb1f917624  libstdc++-v3/testsuite/std/time/clock/local/io.cc
  13ae31163906c8eda2c2021c882bdc89  libstdc++-v3/testsuite/std/time/clock/system/io.cc
  b3cda48993495a5d2ff69f7f1ad2c695  libstdc++-v3/testsuite/std/time/clock/tai/1.cc
  a87e1152f6bc2804b93ce070a51eeb54  libstdc++-v3/testsuite/std/time/clock/tai/io.cc
--- 151194,151200 ----
  1cd9b515badcd164d6958b0fbbbb52cf  libstdc++-v3/testsuite/std/time/clock/file/overview.cc
  811bf06fb6123b7a4dc922fa36ba8a06  libstdc++-v3/testsuite/std/time/clock/gps/1.cc
  e9c8ba287435179e8670bb6951a6b4fa  libstdc++-v3/testsuite/std/time/clock/gps/io.cc
! 941a1907ab341b162b852bb6373f7705  libstdc++-v3/testsuite/std/time/clock/local/io.cc
  13ae31163906c8eda2c2021c882bdc89  libstdc++-v3/testsuite/std/time/clock/system/io.cc
  b3cda48993495a5d2ff69f7f1ad2c695  libstdc++-v3/testsuite/std/time/clock/tai/1.cc
  a87e1152f6bc2804b93ce070a51eeb54  libstdc++-v3/testsuite/std/time/clock/tai/io.cc
diff -Nrcpad gcc-16-20250914/contrib/ChangeLog gcc-16-20250921/contrib/ChangeLog
*** gcc-16-20250914/contrib/ChangeLog	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/contrib/ChangeLog	Sun Sep 21 22:32:34 2025
***************
*** 1,3 ****
--- 1,7 ----
+ 2025-09-17  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	* uninclude: Add `lib/gcc/<anything>/include`.
+ 
  2025-09-10  Christophe Lyon  <christophe.lyon@linaro.org>
  
  	* compare_tests: Improve non-unique tests report when testing
diff -Nrcpad gcc-16-20250914/contrib/uninclude gcc-16-20250921/contrib/uninclude
*** gcc-16-20250914/contrib/uninclude	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/contrib/uninclude	Sun Sep 21 22:32:34 2025
***************
*** 27,39 ****
  
  # Header files whose pathnames contain any of the following patterns
  # are considered as standard headers: usr/include, g++-include,
! # include/g++, include/c++/<version>, gcc-lib/<anything>/include.
  
  gawk ${EXCLUDEPATT+-vexclude="$EXCLUDEPATT"} \
       ${INCLUDEPATT+-vinclude="$INCLUDEPATT"} '
  BEGIN { 
    skipping = 0; 
!   cppline = "^# [0-9]+ \"[^\"]*/(usr/include|g\\+\\+-include|include/g\\+\\+|include/c\\+\\+/[^/]+|gcc-lib/[^\"]+/include|gcc/include)/([^\"]+)\"( [1-4])*$"
  }
  !skipping && $0 ~ cppline && 
  (exclude == "" || $3 !~ exclude) && (include == "" || $3 ~ include) {
--- 27,40 ----
  
  # Header files whose pathnames contain any of the following patterns
  # are considered as standard headers: usr/include, g++-include,
! # include/g++, include/c++/<version>, gcc-lib/<anything>/include,
! # lib/gcc/<anything>/include.
  
  gawk ${EXCLUDEPATT+-vexclude="$EXCLUDEPATT"} \
       ${INCLUDEPATT+-vinclude="$INCLUDEPATT"} '
  BEGIN { 
    skipping = 0; 
!   cppline = "^# [0-9]+ \"[^\"]*/(usr/include|g\\+\\+-include|include/g\\+\\+|include/c\\+\\+/[^/]+|gcc-lib/[^\"]+/include|lib/gcc/[^\"]+/include|gcc/include)/([^\"]+)\"( [1-4])*$"
  }
  !skipping && $0 ~ cppline && 
  (exclude == "" || $3 !~ exclude) && (include == "" || $3 ~ include) {
diff -Nrcpad gcc-16-20250914/gcc/ChangeLog gcc-16-20250921/gcc/ChangeLog
*** gcc-16-20250914/gcc/ChangeLog	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ChangeLog	Sun Sep 21 22:32:34 2025
***************
*** 1,3 ****
--- 1,520 ----
+ 2025-09-20  Jan Hubicka  <jh@suse.cz>
+ 
+ 	* doc/invoke.texi (--param max-devirt-targets) Document.
+ 	* ipa-devirt.cc (ipa_devirt): Implement muti-target
+ 	devirtualization.
+ 	* params.opt (max-devirt-targets): New parameter.
+ 
+ 2025-09-19  Alexandre Oliva  <oliva@adacore.com>
+ 
+ 	* ira.cc (setup_reg_equiv): Retain function invariant
+ 	equivalences.
+ 
+ 2025-09-19  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	* tree-ssa-forwprop.cc (optimize_aggr_zeroprop): Take gimple*
+ 	instead of iterator.
+ 	(optimize_agr_copyprop): Likewise.
+ 	(simplify_builtin_call): Update call to optimize_aggr_zeroprop.
+ 	(pass_forwprop::execute): Update calls to optimize_aggr_zeroprop
+ 	and optimize_agr_copyprop.
+ 
+ 2025-09-19  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	* tree-ssa-forwprop.cc (optimize_aggr_zeroprop_1): Change return type
+ 	to void.
+ 	(optimize_aggr_zeroprop): Likewise.
+ 	(optimize_agr_copyprop_1): Likewise.
+ 	(optimize_agr_copyprop_arg): Likewise.
+ 	(optimize_agr_copyprop): Likewise.
+ 	(simplify_builtin_call): Handle update of the return type
+ 	of optimize_aggr_zeroprop.
+ 	(pass_forwprop::execute): Likewise and optimize_agr_copyprop.
+ 
+ 2025-09-19  Michael Eager  <eager@eagercon.com>
+ 
+ 	PR target/118280
+ 	* config/microblaze/iterators.md: New.
+ 	* config/microblaze/microblaze-protos.h: Add
+ 	microblaze_subword_address.
+ 	* config/microblaze/microblaze.cc: Ditto.
+ 	* config/microblaze/microblaze.md: constants: Add UNSPECV_CAS_BOOL,
+ 	UNSPECV_CAS_MEM, UNSPECV_CAS_VAL, UNSPECV_ATOMIC_FETCH_OP
+ 	type: add atomic
+ 	* config/microblaze/sync.md: Add atomic_fetch_<atomic_optab>si
+ 	atomic_test_and_set
+ 
+ 2025-09-19  Jan Hubicka  <jh@suse.cz>
+ 
+ 	* ipa-fnsummary.cc (estimate_edge_devirt_benefit): Handle speculative
+ 	edges correctly.
+ 	(estimate_edge_size_and_time): Even when not collecting hints,
+ 	devirtualization affects function size.
+ 	(estimate_calls_size_and_time): Do not use tables when devirtualization
+ 	is possible.
+ 
+ 2025-09-19  Jan Hubicka  <jh@suse.cz>
+ 
+ 	* cgraph.cc (cgraph_edge::make_direct): Do not ICE when there are
+ 	multiple speculations to comptaible targets
+ 	(cgraph_edge::combined_sreal_frequency): New member function.
+ 	* cgraph.h (cgraph_edge::combined_sreal_frequency): Declare.
+ 	* ipa-cp.cc (devirtualization_time_bonus): Return sreal; consider
+ 	profile.
+ 	(estimate_local_effects): Likewise.
+ 
+ 2025-09-19  Gaius Mulley  <gaiusmod2@gmail.com>
+ 
+ 	PR modula2/121856
+ 	* doc/gm2.texi (Compiler options): New item -fwideset.
+ 
+ 2025-09-19  Jeff Law  <jlaw@ventanamicro.com>
+ 
+ 	PR target/121983
+ 	* config/riscv/riscv.cc (riscv_macro_fusion_pair_p): Make sure
+ 	object is a REG before asking for its REGNO.  Fix a trivial
+ 	whitespace nit.
+ 
+ 2025-09-19  Raphael Moreira Zinsly  <rzinsly@ventanamicro.com>
+ 
+ 	* config/riscv/riscv-v.cc
+ 	(shuffle_slide_patterns): Cover more permutations.
+ 
+ 2025-09-19  Jim Lin  <jim@andestech.com>
+ 
+ 	* config/riscv/riscv.cc (riscv_compute_frame_info): Remove the
+ 	dedicated calculation for RVE.
+ 
+ 2025-09-19  Jeff Law  <jlaw@ventanamicro.com>
+ 
+ 	* config.gcc (riscv*); Add riscv-bclr-lowest-set-bit.o to extra_objs.
+ 	* config/riscv/riscv-bclr-lowest-set-bit.cc: New file.
+ 	* config/riscv/riscv-passes.def: Add new pass after combine.
+ 	* config/riscv/riscv-protos.h (make_pass_bclr_lowest_set_bit): Add
+ 	prototype.
+ 	* config/riscv/t-riscv: Add rules to build riscv-bclr-lowest-set-bit.o.
+ 
+ 2025-09-19  Richard Biener  <rguenther@suse.de>
+ 
+ 	* tree-ssa-pre.cc (compute_antic_aux): Remove dead code.
+ 
+ 2025-09-19  Richard Biener  <rguenther@suse.de>
+ 
+ 	* tree-vectorizer.h (_stmt_vec_info::store_count): Remove.
+ 	(DR_GROUP_STORE_COUNT): Likewise.
+ 	* tree-vect-stmts.cc (vect_transform_stmt): Remove non-SLP
+ 	path.
+ 
+ 2025-09-19  Richard Biener  <rguenther@suse.de>
+ 
+ 	* tree-vectorizer.h (vect_get_num_copies): Remove unused
+ 	overload.  Remove defaulted vectype argument and always
+ 	use the vector type of the SLP node.
+ 	* tree-vect-loop.cc (vect_reduction_update_partial_vector_usage):
+ 	Adjust.
+ 	(vectorizable_lane_reducing): Likewise.
+ 	(vect_transform_reduction): Likewise.
+ 	(vectorizable_nonlinear_induction): Likewise.
+ 	* tree-vect-stmts.cc (check_load_store_for_partial_vectors):
+ 	Likewise.
+ 
+ 2025-09-19  Richard Biener  <rguenther@suse.de>
+ 
+ 	* tree-vectorizer.h (_slp_tree::vec_stmts_size): Remove.
+ 	(SLP_TREE_NUMBER_OF_VEC_STMTS): Likewise.
+ 	* tree-vect-loop.cc (vectorizable_reduction): Adjust.
+ 	(vect_transform_cycle_phi): Likewise.
+ 	(vect_transform_lc_phi): Likewise.
+ 	(vectorizable_recurr): Likewise.
+ 	(vectorizable_induction): Likewise.
+ 	(vectorizable_live_operation): Likewise.
+ 	* tree-vect-slp.cc (_slp_tree::_slp_tree): Do not set
+ 	SLP_TREE_NUMBER_OF_VEC_STMTS.
+ 	(vect_slp_analyze_node_operations_1): Likewise.
+ 	(vect_slp_analyze_node_operations): Likewise.
+ 	(vect_prologue_cost_for_slp): Adjust.
+ 	(vect_create_constant_vectors): Likewise.
+ 	(vect_get_slp_vect_def): Likewise.
+ 	(vect_transform_slp_perm_load_1): Likewise.
+ 	(vectorizable_slp_permutation_1): Likewise.
+ 	(vect_schedule_slp_node): Likewise.
+ 	(vectorize_slp_instance_root_stmt): Likewise.
+ 	* tree-vect-stmts.cc (vect_model_simple_cost): Likewise.
+ 	(vectorizable_bswap): Likewise.
+ 	(vectorizable_call): Likewise.
+ 	(vectorizable_conversion): Likewise.
+ 	(vectorizable_shift): Likewise.
+ 	(vectorizable_operation): Likewise.
+ 	(vectorizable_store): Likewise.
+ 	(vectorizable_load): Likewise.
+ 	(vectorizable_condition): Likewise.
+ 	(vectorizable_early_exit): Likewise.
+ 
+ 2025-09-18  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* diagnostics/client-data-hooks.h (client_data_hooks::dump): New.
+ 	* diagnostics/context.cc (context::dump): Dump
+ 	m_client_data_hooks.
+ 	(client_data_hooks::dump): New.
+ 	* diagnostics/logical-locations.h
+ 	(logical_locations::manager::dump): New.
+ 	* diagnostics/selftest-logical-locations.cc: Include
+ 	"diagnostics/dumping.h".
+ 	(test_manager::dump): New.
+ 	* diagnostics/selftest-logical-locations.h (test_manager::dump):
+ 	New decl.
+ 	* libgdiagnostics.cc: Include "diagnostics/dumping.h".
+ 	(impl_logical_location_manager::dump): New.
+ 	* tree-logical-location.cc: Include "diagnostics/dumping.h".
+ 	(tree_logical_location_manager::dump): New.
+ 	* tree-logical-location.h (tree_logical_location_manager::dump):
+ 	New decl.
+ 
+ 2025-09-18  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* diagnostics/paths-output.cc: Update for conversion of
+ 	location_aspect to enum class.
+ 	* diagnostics/source-printing.cc: Likewise.
+ 	* input.cc: Likewise.
+ 	* input.h: Likewise.
+ 
+ 2025-09-18  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* diagnostics/buffering.cc: Drop include of "diagnostic.h".
+ 	* diagnostics/buffering.h: Likewise.
+ 	* diagnostics/context.h (diagnostics::metadata): Add forward decl.
+ 	* diagnostics/html-sink.cc: Drop include of "diagnostic.h".
+ 	* diagnostics/lazy-paths.cc: Likewise.
+ 	* diagnostics/macro-unwinding.cc: Likewise.
+ 	* diagnostics/macro-unwinding.h (diagnostics:diagnostic_info): Add
+ 	forward decl.
+ 	* diagnostics/option-classifier.h: Include
+ 	"diagnostics/option-id.h" and "diagnostics/kinds.h".
+ 	(diagnostics:diagnostic_info): Add forward decl.
+ 	* diagnostics/output-spec.cc: Drop include of "diagnostic.h".
+ 	* diagnostics/paths-output.cc: Likewise.
+ 	* diagnostics/paths.cc: Likewise.
+ 	* diagnostics/sarif-sink.cc: Likewise.
+ 	* diagnostics/selftest-context.cc: Likewise.
+ 	* diagnostics/selftest-paths.cc: Likewise.
+ 	* diagnostics/source-printing-options.h: Include
+ 	"rich-location.h".
+ 	* diagnostics/text-sink.cc: Drop include of "diagnostic.h".
+ 
+ 2025-09-18  Qing Zhao  <qing.zhao@oracle.com>
+ 
+ 	PR tree-optimization/121894
+ 	* tree-sra.cc (scan_function): Set grp_assignment_write to 1 when
+ 	specially handle call to .DEFERRED_INIT.
+ 
+ 2025-09-18  Zhongyao Chen  <chenzhongyao.hit@gmail.com>
+ 
+ 	PR target/121910
+ 	* config/riscv/riscv-vector-costs.cc (compute_estimated_lmul):
+ 	Return RVV_M8 when estimated lmul is too large.
+ 
+ 2025-09-18  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/121977
+ 	* omp-low.cc (lower_omp_regimplify_operands_p): If maybe_lookup_decl
+ 	returns NULL, use maybe_lookup_decl_in_outer_ctx as fallback.
+ 
+ 2025-09-18  Karl Meakin  <karl.meakin@arm.com>
+ 
+ 	* config/aarch64/aarch64-sme.md (@aarch64_sme_write_zt<SVE_FULL:mode>): New insn.
+ 	(aarch64_sme_lut_zt): Likewise.
+ 	* config/aarch64/aarch64-sve-builtins-shapes.cc (parse_type): New type format "%T".
+ 	(struct luti_lane_zt_base): New function shape.
+ 	(SHAPE): Likewise.
+ 	(struct write_zt_def): Likewise.
+ 	(struct write_lane_zt_def): Likewise.
+ 	* config/aarch64/aarch64-sve-builtins-shapes.h: New function shape.
+ 	* config/aarch64/aarch64-sve-builtins-sme.cc (class svluti_zt_impl): New function expander.
+ 	(class svwrite_zt_impl): Likewise.
+ 	(class svwrite_lane_zt_impl): Likewise.
+ 	(FUNCTION): Likewise
+ 	* config/aarch64/aarch64-sve-builtins-sme.def (svwrite_zt): New function shape.
+ 	(svwrite_lane_zt): Likewise.
+ 	(svluti4_zt): Likewise.
+ 	* config/aarch64/aarch64-sve-builtins-sme.h: New function base.
+ 	* config/aarch64/aarch64-sve-builtins.h: Mention the arrays of function_group_info by name.
+ 
+ 2025-09-18  Karl Meakin  <karl.meakin@arm.com>
+ 
+ 	* config/aarch64/aarch64-c.cc (aarch64_update_cpp_builtins): Conditonally define
+ 	`__ARM_FEATURE_SME_LUTv2" macro.
+ 	* config/aarch64/aarch64-option-extensions.def (AARCH64_OPT_EXTENSION("sme-lutv2")): New
+ 	optional architecture extension.
+ 	* config/aarch64/aarch64.h (TARGET_SME_LUTv2): New macro.
+ 	* doc/invoke.texi: Document `+sme-lutv2` flag.
+ 
+ 2025-09-18  Pan Li  <pan2.li@intel.com>
+ 
+ 	* match.pd: Add pattern for SAT_MUL form 5.
+ 	* tree-ssa-math-opts.cc (math_opts_dom_walker::after_dom_children):
+ 	Try match pattern for IOR.
+ 
+ 2025-09-18  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* ipa-cp.cc (update_counts_for_self_gen_clones): Do not update
+ 	call frequency for local profiles.
+ 
+ 2025-09-18  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/87615
+ 	* tree-ssa-sccvn.cc (vn_nary_op_insert_into): When inserting
+ 	a new predicate or location into an existing predicate list
+ 	make sure to not exceed 8 locations.  Avoid copying things
+ 	when we later eventually throw them away.
+ 	(vn_nary_op_insert_pieces_predicated): Avoid expensive check
+ 	when not checking.
+ 	(dominated_by_p_w_unex): Apply the limit on a single successors
+ 	predecessor count consistently.
+ 
+ 2025-09-18  Tobias Burnus  <tburnus@baylibre.com>
+ 	    Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR middle-end/121922
+ 	* omp-general.cc (omp_dynamic_cond): Use 'unshare_expr' for
+ 	the user condition.
+ 
+ 2025-09-18  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/121720
+ 	* tree-ssa-pre.cc (bitmap_set_subtract_expressions): Add
+ 	flag to tell whether we should copy instead of prune the
+ 	value set.
+ 	(compute_antic_aux): Remove intersection of ANTIC_IN with
+ 	the old solution.  When subtracting TMP_GEN from
+ 	ANTIC_OUT do not prune the value set when MAX was involved
+ 	in the ANTIC_OUT computation.
+ 
+ 2025-09-18  hongtao.liu  <hongtao.liu@intel.com>
+ 
+ 	* config/i386/x86-tune.def (X86_TUNE_AVX512_MOVE_BY_PIECES):
+ 	Remove SPR/GNR/DMR.
+ 	(X86_TUNE_AVX512_STORE_BY_PIECES): Ditto.
+ 
+ 2025-09-17  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* sarif-replay.cc (set_defaults): Initialize
+ 	m_debug_physical_locations.
+ 
+ 2025-09-17  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/121962
+ 	* tree-ssa-forwprop.cc (same_for_assignment): New function.
+ 	(optimize_agr_copyprop_1): Use same_for_assignment to check for
+ 	nop copies.
+ 	(optimize_agr_copyprop): Likewise.
+ 
+ 2025-09-17  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	* tree-ssa-forwprop.cc (new_src_based_on_copy): An early out
+ 	if both are decls.
+ 
+ 2025-09-17  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	* tree-ssa-forwprop.cc (optimize_agr_copyprop_1): Split out
+ 	the case where `operand_equal_p (dest, src2)` is false into ...
+ 	(new_src_based_on_copy): This. New function.
+ 	(optimize_agr_copyprop_arg): Use new_src_based_on_copy
+ 	instead of operand_equal_p to find the new src.
+ 
+ 2025-09-17  Shreya Munnangi  <smunnangi1@ventanamicro.com>
+ 
+ 	PR tree-optimization/58727
+ 	* simplify-rtx.cc (simplify_context::simplify_binary_operation_1):
+ 	In (A & C1) | C2, if (C1|C2) results in a constant with a single bit
+ 	clear, then adjust C1 appropriately.
+ 
+ 2025-09-17  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	* tree-inline.cc (maybe_copy_this_notrap): New function.  Also copy
+ 	the TREE_THIS_NOTRAP flag for parameters when the argument is a full
+ 	object and the parameter's type is self-referential.
+ 	(remap_gimple_op_r): Call maybe_copy_this_notrap.
+ 	(copy_tree_body_r): Likewise.
+ 
+ 2025-09-17  Pan Li  <pan2.li@intel.com>
+ 
+ 	* config/riscv/autovec-opt.md (*widen_first_<any_extend:su>_vx_<mode>):
+ 	Add helper bridge pattern for vwaddu.vx combine.
+ 	(*widen_<any_widen_binop:optab>_<any_extend:su>_vx_<mode>): Add
+ 	new pattern to match vwaddu.vx combine.
+ 	* config/riscv/iterators.md: Add code attr to get extend CODE.
+ 	* config/riscv/vector-iterators.md: Add Dmode iterator for
+ 	widen.
+ 
+ 2025-09-16  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	* doc/invoke.texi (Wimplicit-fallthrough=): Document that also C23
+ 	provides a standard way to suppress the warning with [[fallthrough]];.
+ 
+ 2025-09-16  Takayuki 'January June' Suwa  <jjsuwa_sys3175@yahoo.co.jp>
+ 
+ 	* config/xtensa/xtensa.cc (#include):
+ 	Add "addresses.h".
+ 	* config/xtensa/xtensa.h (REGNO_OK_FOR_BASE_P):
+ 	Simplify to just a call to GP_REG_P().
+ 	(BASE_REG_P): Replace REGNO_OK_FOR_BASE_P() with the equivalent
+ 	call to regno_ok_for_base_p().
+ 
+ 2025-09-16  Wilco Dijkstra  <wilco.dijkstra@arm.com>
+ 
+ 	PR middle-end/66462
+ 	* config/aarch64/aarch64.md (isnan<mode>2): Add new expander.
+ 
+ 2025-09-16  Richard Biener  <rguenther@suse.de>
+ 
+ 	* tree-vect-stmts.cc (get_load_store_type): Get in a flag
+ 	whether a SLP_TREE_LOAD_PERMUTATION on the node can be
+ 	code generated and use it.  Fix the condition on using
+ 	strided gather/scatter to avoid dropping a meaningful
+ 	permutation.
+ 	(vectorizable_store): Adjust.
+ 	(vectorizable_load): Analyze the permutation early and
+ 	pass the result down to get_load_store_type.  Fix the
+ 	condition on when we are allowed to elide a load permutation.
+ 
+ 2025-09-16  Jennifer Schmitz  <jschmitz@nvidia.com>
+ 
+ 	PR target/121602
+ 	* config/aarch64/aarch64-sve-builtins.cc
+ 	(gimple_folder::fold_active_lanes_to): Add force_vector
+ 	statement.
+ 
+ 2025-09-16  Jiawei  <jiawei@iscas.ac.cn>
+ 
+ 	* config.gcc: Accept RISC-V profiles in `--with-arch`.
+ 	* config/riscv/arch-canonicalize: Add profile detection and
+ 	skip canonicalization for profiles.
+ 
+ 2025-09-16  Jiawei  <jiawei@iscas.ac.cn>
+ 
+ 	* common/config/riscv/riscv-common.cc (struct riscv_profiles): Add comments.
+ 	(RISCV_PROFILE): Removed.
+ 	* config/riscv/riscv-profiles.def: New file.
+ 
+ 2025-09-16  Dongyan Chen  <chendongyan@isrc.iscas.ac.cn>
+ 
+ 	* config/riscv/riscv-ext.def: Imply zicsr.
+ 
+ 2025-09-16  liuhongt  <hongtao.liu@intel.com>
+ 
+ 	* config/i386/predicates.md (avx_vbroadcast128_operand): New
+ 	predicate.
+ 	* config/i386/sse.md (*avx_vbroadcastf128_<mode>_perm): New
+ 	pre_reload splitter.
+ 
+ 2025-09-15  Alexandre Oliva  <oliva@adacore.com>
+ 
+ 	* config/rs6000/vxworks.h (TARGET_CMODEL, SET_CMODEL): Define.
+ 
+ 2025-09-15  Alexandre Oliva  <oliva@adacore.com>
+ 
+ 	* configure.ac: Adjust base register in linker test for large
+ 	TOC support.
+ 	* configure: Rebuild.
+ 
+ 2025-09-15  Pan Li  <pan2.li@intel.com>
+ 
+ 	* match.pd: Remove unnecessary cast of unsigned
+ 	SAT_MUL for widen-mul.
+ 
+ 2025-09-15  Pan Li  <pan2.li@intel.com>
+ 
+ 	* tree-ssa-math-opts.cc (build_and_insert_cast): Refine
+ 	the cast insert by check the rhs of val.
+ 
+ 2025-09-15  David Faust  <david.faust@oracle.com>
+ 
+ 	PR debug/121411
+ 	PR debug/121903
+ 	* ctfc.h (ctf_add_sou): Change size arg from size_t to uHWI.
+ 	* ctfc.cc (ctf_add_sou): Likewise.
+ 
+ 2025-09-15  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/121751
+ 	PR tree-optimization/121418
+ 	PR tree-optimization/121417
+ 	* tree-ssa-forwprop.cc (split_core_and_offset_size): New function.
+ 	(optimize_agr_copyprop_1): Allow for the same
+ 	address but different type accesses via a VCE.
+ 
+ 2025-09-15  Alex Coplan  <alex.coplan@arm.com>
+ 
+ 	PR tree-optimization/121772
+ 	* match.pd: Add type check to reduc(ctor) pattern.
+ 
+ 2025-09-15  Georg-Johann Lay  <avr@gjlay.de>
+ 
+ 	* config/avr/avr-mcus.def: Add avr32eb14, avr32eb20,
+ 	avr32eb28, avr32eb32.
+ 	* doc/avr-mmcu.texi: Rebuild.
+ 
+ 2025-09-15  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR target/121934
+ 	* config/i386/i386-expand.cc (ix86_expand_set_or_cpymem): If a
+ 	single instruction can store or move the whole block of memory,
+ 	use vector instruction and don't align destination.
+ 
+ 2025-09-15  Xi Ruoyao  <xry111@xry111.site>
+ 
+ 	PR target/121906
+ 	* config/loongarch/loongarch.md (*bstrins_<mode>_for_ior_mask):
+ 	Always create a new pseudo for the input register of the bstrins
+ 	instruction.
+ 
+ 2025-09-15  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR middle-end/121904
+ 	* tree.cc (get_range_pos_neg): Return 3 if arg doesn't have
+ 	scalar integral type.
+ 	* expr.cc (expand_expr_real_2) <CASE_CONVERT>: Only choose between
+ 	sign and zero extension based on costs for scalar integral inner
+ 	types.
+ 
+ 2025-09-15  Stefan Schulze Frielinghaus  <stefansf@gcc.gnu.org>
+ 
+ 	PR middle-end/121391
+ 	* gimplify.cc (gimplify_asm_expr): In case an asm operand is an
+ 	error node, bail out early.
+ 
+ 2025-09-14  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR lto/121935
+ 	* ipa-free-lang-data.cc (find_decls_types_r): Visit DECL_ARGUMENTS
+ 	chain manually.
+ 
+ 2025-09-14  Richard Biener  <rguenther@suse.de>
+ 
+ 	* tree-vectorizer.h (stmt_vec_info_type::permute_info_type): Add.
+ 	(vectorizable_slp_permutation): Declare.
+ 	* tree-vect-slp.cc (vectorizable_slp_permutation): Export.
+ 	(vect_slp_analyze_node_operations_1): Set permute_info_type
+ 	on permute nodes successfully analyzed.
+ 	(vect_schedule_slp_node): Dispatch to vect_transform_stmt
+ 	for all nodes.
+ 	* tree-vect-stmts.cc (vect_transform_stmt): Remove redundant
+ 	dump, handle permute_info_type.
+ 
+ 2025-09-14  Richard Biener  <rguenther@suse.de>
+ 
+ 	* tree-vect-stmts.cc (get_load_store_type): Use VMAT_STRIDED_SLP
+ 	for negative stride accesses when VMAT_CONTIGUOUS_REVERSE
+ 	isn't applicable.
+ 
+ 2025-09-14  Richard Biener  <rguenther@suse.de>
+ 
+ 	* tree-vectorizer.h (vect_load_store_data::n_perms): New.
+ 	* tree-vect-stmts.cc (vectorizable_load): Analyze
+ 	SLP_TREE_LOAD_PERMUTATION only once and remember n_perms.
+ 	Verify the transform-time n_perms against the value stored
+ 	during analysis.
+ 
  2025-09-13  Gerald Pfeifer  <gerald@pfeifer.com>
  
  	* target.def (dtors_from_cxa_atexit): Properly mark up
diff -Nrcpad gcc-16-20250914/gcc/DATESTAMP gcc-16-20250921/gcc/DATESTAMP
*** gcc-16-20250914/gcc/DATESTAMP	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/DATESTAMP	Sun Sep 21 22:32:34 2025
***************
*** 1 ****
! 20250914
--- 1 ----
! 20250921
diff -Nrcpad gcc-16-20250914/gcc/ada/ChangeLog gcc-16-20250921/gcc/ada/ChangeLog
*** gcc-16-20250914/gcc/ada/ChangeLog	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/ChangeLog	Sun Sep 21 22:32:34 2025
***************
*** 1,3 ****
--- 1,605 ----
+ 2025-09-19  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	* gcc-interface/gigi.h (create_var_decl): Add LINKONCE_FLAG boolean
+ 	parameter.
+ 	(create_subprog_decl): Likewise.
+ 	* gcc-interface/decl.cc (gnat_to_gnu_entity): Adjust calls to
+ 	create_var_decl and create_subprog_decl.
+ 	(elaborate_expression_1): Likewise.
+ 	* gcc-interface/trans.cc (gigi): Likewise.
+ 	(build_raise_check): Likewise.
+ 	(Subprogram_Body_to_gnu): Likewise.
+ 	(create_temporary): Likewise.
+ 	(Exception_Handler_to_gnu): Likewise.
+ 	(Compilation_Unit_to_gnu): Likewise.
+ 	(gnat_to_gnu): Likewise.
+ 	(use_alias_for_thunk_p): Return false for a one-only target.
+ 	* gcc-interface/utils.cc (maybe_pad_type): Adjust call to
+ 	create_var_decl.
+ 	(create_var_decl): Add LINKONCE_FLAG boolean parameter.
+ 	(create_subprog_decl): Likewise.
+ 
+ 2025-09-19  Marc Poulhiès  <poulhies@adacore.com>
+ 
+ 	* gcc-interface/ada-tree.h (TYPE_EXTENDED_POINTER_P): New.
+ 	(TYPE_IS_EXTENDED_POINTER_P): New.
+ 	(TYPE_EXTENDED_UNCONSTRAINED_ARRAY): New.
+ 	(SET_TYPE_EXTENDED_UNCONSTRAINED_ARRAY): New.
+ 	(TYPE_DUMMY_EXT_POINTER_TO): New.
+ 	(SET_TYPE_DUMMY_EXT_POINTER_TO): New.
+ 	* gcc-interface/decl.cc (get_extended_unconstrained_array): New.
+ 	(gnat_to_gnu_entity): Handle extended access type.
+ 	(get_unpadded_extended_type): New.
+ 	(gnat_to_gnu_component_type): Handle extended access type.
+ 	(build_template_type): New.
+ 	(gnat_to_gnu_field): Handle extended access type.
+ 	(validate_size): Likewise.
+ 	(set_rm_size): Likewise.
+ 	(copy_and_substitute_in_layout): Likewise.
+ 	(rm_size): Likewise.
+ 	* gcc-interface/gigi.h (get_unpadded_extended_type): New.
+ 	(build_template_type): New.
+ 	(build_dummy_unc_pointer_types_ext): New.
+ 	(finish_extended_pointer_type): New.
+ 	(build_unc_object_type_from_ptr): Rename first parameter.
+ 	* gcc-interface/misc.cc (gnat_print_type): Handle extended access type.
+ 	* gcc-interface/trans.cc (Identifier_to_gnu): Likewise.
+ 	(Attribute_to_gnu): Likewise.
+ 	(gnat_to_gnu): Likewise.
+ 	* gcc-interface/utils.cc (convert_to_fat_pointer): Assert if converting an
+ 	extended pointer.
+ 	(build_dummy_unc_pointer_types_ext): New.
+ 	(finish_extended_pointer_type): New.
+ 	(finish_record_type): Handle extended access type.
+ 	(build_unc_object_type_from_ptr): Likewise.
+ 	(convert_to_extended_pointer): New.
+ 	(convert): Handle extended access type.
+ 	(gnat_pushdecl): Likewise.
+ 	(maybe_pad_type): Likewise.
+ 	* gcc-interface/utils2.cc (build_unary_op): Likewise.
+ 	(build_binary_op): Likewise.
+ 	(build_allocator): Likewise.
+ 	(gnat_save_expr): Likewise.
+ 	(gnat_protect_expr): Likewise.
+ 	(gnat_stabilize_reference_1): Likewise.
+ 
+ 2025-09-19  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	* sem_ch4.adb (Analyze_Selected_Component): Bail out if the prefix
+ 	has Void_Type.
+ 
+ 2025-09-19  Piotr Trojanek  <trojanek@adacore.com>
+ 
+ 	* sem_ch4.adb (Analyze_User_Defined_Binary_Op): Remove declare block.
+ 
+ 2025-09-19  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	* doc/gnat_rm/gnat_language_extensions.rst (Structural Generic
+ 	Instantiation): New entry
+ 	* einfo.ads (Is_Link_Once): New flag defined in entities.
+ 	* sinfo.ads (Is_Structural): New flag defined in instantiations.
+ 	* gen_il-fields.ads (Opt_Field_Enum): Add Is_Link_Once and
+ 	Is_Structural.
+ 	* gen_il-gen-gen_entities.adb (Entity_Kind): Add Is_Link_Once
+ 	semantic flag.
+ 	* gen_il-gen-gen_nodes.adb (N_Generic_Instantiation): Move up
+ 	Parent_Spec field and add Is_Structural semantic flag.
+ 	* frontend.adb: Add with clause for Sem_Ch12.
+ 	(Frontend): After analysis is complete and bodies are instantiated,
+ 	call Sem_Ch12.Mark_Link_Once on the declarations of the main unit.
+ 	* par.adb (P_Qualified_Simple_Name): Delete.
+ 	(P_Qualified_Simple_Name_Resync): Likewise
+ 	(P_Exception_Name): New function declaration.
+ 	(P_Label_Name): Likewise.
+ 	(P_Loop_Name): Likewise.
+ 	(P_Generic_Unit_Name): Likewise.
+ 	(P_Library_Unit_Name): Likewise.
+ 	(P_Package_Name): Likewise.
+ 	(P_Parent_Unit_Name): Likewise.
+ 	(P_Subtype_Name): Likewise.
+ 	(P_Subtype_Name_Resync): Likewise.
+ 	* par-ch3.adb (P_Subtype_Mark_Resync): Replace call to
+ 	P_Qualified_Simple_Name_Resync by P_Subtype_Name_Resync.
+ 	(P_Identifier_Declarations): Replace call to
+ 	P_Qualified_Simple_Name_Resync by P_Exception_Name.
+ 	(P_Derived_Type_Def_Or_Private_Ext_Decl): Replace call to
+ 	P_Qualified_Simple_Name by P_Subtype_Name.
+ 	(P_Interface_Type_Definition): Replace calls to
+ 	P_Qualified_Simple_Name by P_Subtype_Name.
+ 	* par-ch4.adb (P_Reduction_Attribute_Reference): Move around and
+ 	change name of parameter.
+ 	(P_Name): Document new grammar rule and make a couple of tweaks.
+ 	(P_Exception_Name): New function.
+ 	(P_Label_Name): Likewise.
+ 	(P_Loop_Name): Likewise.
+ 	(P_Generic_Unit_Name): Likewise.
+ 	(P_Library_Unit_Name): Likewise.
+ 	(P_Package_Name): Likewise.
+ 	(P_Parent_Unit_Name): Likewise.
+ 	(P_Subtype_Name): Likewise.
+ 	(P_Subtype_Name_Resync): Likewise.
+ 	(P_Qualified_Simple_Name): Rename into...
+ 	(P_Simple_Name): ...this.
+ 	(P_Qualified_Simple_Name_Resync): Rename into...
+ 	(P_Simple_Name_Resync): ...this.  Accept left parenthesis and
+ 	dot as name extensions.
+ 	(P_Allocator): Replace call to P_Qualified_Simple_Name_Resync
+ 	by P_Subtype_Name_Resync.
+ 	* par-ch5.adb (P_Goto_Statement): Replace call to
+ 	P_Qualified_Simple_Name by P_Label_Name.
+ 	(Parse_Loop_Flow_Statement): Replace call to
+ 	P_Qualified_Simple_Name by P_Loop_Name.
+ 	* par-ch6.adb (P_Subprogram): Replace call to
+ 	P_Qualified_Simple_Name by P_Generic_Unit_Name.
+ 	* par-ch7.adb (P_Package): Replace calls to
+ 	P_Qualified_Simple_Name by P_Package_Name and P_Generic_Unit_Name.
+ 	* par-ch8.adb (P_Use_Package_Clause): Replace calls to
+ 	P_Qualified_Simple_Name by P_Package_Name.
+ 	* par-ch9.adb (P_Task): Replace call to
+ 	P_Qualified_Simple_Name by P_Subtype_Name.
+ 	(P_Protected): Likewise.
+ 	* par-ch10.adb (P_Context_Clause): Replace call to
+ 	P_Qualified_Simple_Name by P_Library_Unit_Name.
+ 	(P_Subunit): Replace call to P_Qualified_Simple_Name by
+ 	P_Parent_Unit_Name.
+ 	* par-ch12.adb (P_Generic): Replace call to
+ 	P_Qualified_Simple_Name by P_Generic_Unit_Name.
+ 	(P_Formal_Derived_Type_Definition): Replace call to
+ 	P_Qualified_Simple_Name by P_Subtype_Name.
+ 	(P_Formal_Package_Declaration): Replace call to
+ 	P_Qualified_Simple_Name by P_Generic_Unit_Name.
+ 	* sem_ch4.adb: Add with and use clauses for Sem_Ch12.
+ 	(Analyze_Call): Accept implicit instantiations with -gnatX0.
+ 	(Analyze_Indexed_Component_Form): Likewise.
+ 	* sem_ch8.adb (Analyze_Use_Package): Add guard before inserting
+ 	a with clause automatically when there is a use clause.
+ 	(Check_In_Previous_With_Clause): Retrieve original names.
+ 	(Check_Library_Unit_Renaming): Deal with structural instances.
+ 	(End_Use_Type): Minor tweak.
+ 	* sem_ch10.adb (Analyze_With_Clause): Remove useless test and
+ 	call Defining_Entity_Of_Instance.
+ 	* sem_ch12.ads (Build_Structural_Instantiation): New function.
+ 	(Mark_Link_Once): New procedure.
+ 	* sem_ch12.adb: Add with and use clauses for Exp_Dbug.
+ 	(Analyze_Associations): Add support for structural instantiations.
+ 	(Analyze_Package_Instantiation): Likewise.
+ 	(Analyze_Subprogram_Instantiation): Likewise.
+ 	(Analyze_Structural_Associations): New procedure.
+ 	(Need_Subprogram_Instance_Body): Return True for instantiation is
+ 	in the auxiliary declarations of the main unit.
+ 	(Build_Structural_Instantiation): New function.
+ 	(Mark_Link_Once): New procedure.
+ 	* sem_util.ads (Add_Local_Declaration): New procedure.
+ 	(Defining_Entity_Of_Instance): New function.
+ 	* sem_util.adb (Add_Local_Declaration): New procedure.
+ 	(Defining_Entity_Of_Instance): New function.
+ 	* gnat_rm.texi: Regenerate.
+ 	* gnat_ugn.texi: Regenerate.
+ 
+ 2025-09-19  Ronan Desplanques  <desplanques@adacore.com>
+ 
+ 	* aspects.ads: Fix comment.
+ 
+ 2025-09-19  Ronan Desplanques  <desplanques@adacore.com>
+ 
+ 	* aspects.ads: Remove comment.
+ 
+ 2025-09-19  Marc Poulhiès  <poulhies@adacore.com>
+ 
+ 	* libgnat/s-putima.ads (Ext_Access_Pointer): New.
+ 	(Put_Image_Extended_Access_Pointer): New.
+ 	* libgnat/s-putima.adb (Ext_Acc_Instance): New.
+ 	(Put_Image_Extended_Access_Pointer): New.
+ 	* rtsfind.ads (RE_Id, RE_Unit_Table): Set value for
+ 	RE_Put_Image_Extended_Access_Pointer.
+ 	* exp_put_image.adb (Build_Elementary_Put_Image_Call): Handle extended
+ 	access.
+ 
+ 2025-09-19  Marc Poulhiès  <poulhies@adacore.com>
+ 
+ 	* fe.h (Is_Extended_Access_Type): Add C bindings.
+ 	* sem_util.ads (Is_Extended_Access_Type): Add comment that any
+ 	change to the function must take care of the C binding.
+ 
+ 2025-09-19  Marc Poulhiès  <poulhies@adacore.com>
+ 
+ 	* layout.adb (Layout_Type): Adjust comment and code extended
+ 	accesses.
+ 
+ 2025-09-19  Ronan Desplanques  <desplanques@adacore.com>
+ 
+ 	* sem_ch3.adb (Add_Tag): Remove superfluous statements.
+ 
+ 2025-09-19  Steve Baird  <baird@adacore.com>
+ 
+ 	* exp_attr.adb (Interunit_Ref_OK): Treat a subunit like a body.
+ 	(Build_And_Insert_Type_Attr_Subp): When climbing up the
+ 	tree, go from an N_Subunit node to its stub (instead of to the
+ 	subunit's N_Compilation_Unit node).
+ 
+ 2025-09-19  Gary Dismukes  <dismukes@adacore.com>
+ 
+ 	* sem_attr.adb (Eval_Attribute): In the case of a VADS-specific
+ 	size attribute, only fold to the object size when the Esize field
+ 	is known.
+ 
+ 2025-09-16  Ronan Desplanques  <desplanques@adacore.com>
+ 
+ 	* exp_strm.ads (Get_Primitives): New function.
+ 	* exp_strm.adb (Get_Primitives): Likewise.
+ 	(Build_Elementary_Input_Call, Build_Elementary_Write_Call): use
+ 	Get_Primitives.
+ 	(Has_Stream_Standard_Rep): Add formal parameter and rename to...
+ 	(Is_Stream_Standard_Rep): New function.
+ 	* sem_ch13.adb (Analyze_Attribute_Definition_Clause): Fix error
+ 	emission.
+ 
+ 2025-09-16  Gary Dismukes  <dismukes@adacore.com>
+ 
+ 	Revert:
+ 	2025-09-15  Gary Dismukes  <dismukes@adacore.com>
+ 
+ 	* exp_ch6.ads (Make_Build_In_Place_Call_In_Allocator): Simplify comment.
+ 	* exp_ch6.adb (Make_Build_In_Place_Call_In_Allocator): Remove obsolete
+ 	comment about not being able to allocate fixed-size controlled results
+ 	on the caller side, and replace another obsolete comment with a simpler
+ 	comment. Call Build_Allocate_Deallocate_Proc when the function doesn't
+ 	need a BIPalloc formal to ensure that function results with controlled
+ 	parts allocated on the caller side will be chained for finalization.
+ 	(Make_Build_In_Place_Call_In_Object_Declaration): Call Needs_BIP_Collection
+ 	on the function's Entity_Id rather than the function call.
+ 	(Needs_BIP_Collection): If a BIP function doesn't need a BIPalloc formal
+ 	then it doesn't need a BIP collection either; return False in that case.
+ 	(Needs_BIP_Alloc_Form): Remove test of Needs_BIP_Collection.
+ 	* exp_ch7.adb (Expand_Cleanup_Actions): Move test of Uses_Sec_Stack
+ 	to be the first conjunct in setting of Needs_Sec_Stack_Mark, and put
+ 	the other tests in a disjunction subsidiary to that. Improve preceding
+ 	comment.
+ 
+ 2025-09-16  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	PR ada/114065
+ 	* libgnarl/s-osinte__darwin.adb: Add and reference clause
+ 	for Interfaces.C, remove clause for Interfaces.C.Extensions.
+ 
+ 2025-09-15  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	PR ada/114065
+ 	PR ada/121953
+ 	* Makefile.rtl (LIBGNAT_TARGET_PAIRS) [x32-linux]: Replace
+ 	libgnarl/s-osinte__x32.adb with libgnarl/s-osinte__posix.adb.
+ 	* libgnarl/s-osinte__x32.adb: Delete.
+ 
+ 2025-09-15  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	* gcc-interface/trans.cc (gnat_to_gnu)
+ 	<N_Object_Renaming_Declaration>: Deal with objects whose elaboration
+ 	is deferred.
+ 	(process_freeze_entity): Deal with renamed objects whose elaboration
+ 	is deferred.
+ 
+ 2025-09-15  Gary Dismukes  <dismukes@adacore.com>
+ 
+ 	* exp_ch6.ads (Make_Build_In_Place_Call_In_Allocator): Simplify comment.
+ 	* exp_ch6.adb (Make_Build_In_Place_Call_In_Allocator): Remove obsolete
+ 	comment about not being able to allocate fixed-size controlled results
+ 	on the caller side, and replace another obsolete comment with a simpler
+ 	comment. Call Build_Allocate_Deallocate_Proc when the function doesn't
+ 	need a BIPalloc formal to ensure that function results with controlled
+ 	parts allocated on the caller side will be chained for finalization.
+ 	(Make_Build_In_Place_Call_In_Object_Declaration): Call Needs_BIP_Collection
+ 	on the function's Entity_Id rather than the function call.
+ 	(Needs_BIP_Collection): If a BIP function doesn't need a BIPalloc formal
+ 	then it doesn't need a BIP collection either; return False in that case.
+ 	(Needs_BIP_Alloc_Form): Remove test of Needs_BIP_Collection.
+ 	* exp_ch7.adb (Expand_Cleanup_Actions): Move test of Uses_Sec_Stack
+ 	to be the first conjunct in setting of Needs_Sec_Stack_Mark, and put
+ 	the other tests in a disjunction subsidiary to that. Improve preceding
+ 	comment.
+ 
+ 2025-09-15  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	* checks.adb (Apply_Discriminant_Check): Remove undocumented test
+ 	on Is_Aliased_View applied to the left-hand side to skip the check
+ 	in the case where the subtypes are the same, and replace it with a
+ 	test that the subtypes are constrained.
+ 
+ 2025-09-15  Jose Ruiz  <ruiz@adacore.com>
+ 
+ 	* doc/gnat_rm/security_hardening_features.rst:
+ 	clarify that hardening options are not supported by the
+ 	LLVM back end.
+ 	* gnat_rm.texi: Regenerate.
+ 	* gnat_ugn.texi: Regenerate.
+ 
+ 2025-09-15  Viljar Indus  <indus@adacore.com>
+ 
+ 	* sem_prag.adb (Analyze_Pragma): Disable context checks for
+ 	the preanalysis of the expression for Loop_Invariant pragmas
+ 	as the ghost region for the pragma has not been set up yet.
+ 
+ 2025-09-15  Viljar Indus  <indus@adacore.com>
+ 
+ 	* sem_prag.adb (Get_Applicable_Policy): Match assertion levels
+ 	by name.
+ 
+ 2025-09-15  Steve Baird  <baird@adacore.com>
+ 
+ 	* freeze.adb (Freeze_Entity): In the case of an anonymous
+ 	access-to-subprogram type where Do_Freeze_Profile is True, freeze
+ 	the designated subprogram type.
+ 	(Should_Freeze_Type): Do not call Unit_Declaration_Node with
+ 	a parentless argument.
+ 	* sem_ch3.adb (Analyze_Object_Declaration): When calling
+ 	Freeze_Before, override the default value for Do_Freeze_Profile.
+ 	This is needed in some cases to prevent premature freezing in the
+ 	case of an object of an anonymous access-to-subprogram type.
+ 
+ 2025-09-15  Viljar Indus  <indus@adacore.com>
+ 
+ 	* sem_prag.adb (Analyze_Pragma): Add ghost level check to
+ 	Assertion_Policy.
+ 
+ 2025-09-15  Viljar Indus  <indus@adacore.com>
+ 
+ 	* ghost.adb (Check_Assignment_Policies): The level of the assignee
+ 	should depend on the level of the region.
+ 
+ 2025-09-15  Viljar Indus  <indus@adacore.com>
+ 
+ 	* ghost.adb (Is_Ok_Pragma): Remove calls to Check_Policies.
+ 
+ 2025-09-15  Viljar Indus  <indus@adacore.com>
+ 
+ 	* contracts.adb: Update SPARK RM reference numbers.
+ 	* freeze.adb: Likewise.
+ 	* ghost.adb: Likewise.
+ 	* ghost.ads: Likewise.
+ 	* sem_ch12.adb: Likewise.
+ 	* sem_ch3.adb: Likewise.
+ 	* sem_ch6.adb: Likewise.
+ 	* sem_prag.adb: Likwise.
+ 	* sem_res.adb: Likewise.
+ 
+ 2025-09-15  Viljar Indus  <indus@adacore.com>
+ 
+ 	* sem_prag.adb (Check_Inconsistent_Argument_Ghostliness):
+ 	new method for handling the ghost constency errors between
+ 	different arguments. Use this method in the processing for
+ 	pragmas Unused, Unrefefrenced, Unreferenced_Objects, Inline and
+ 	No_Return.
+ 	* sem_prag.ads (Suppressed_Ghost_Policy_Check_Pragma): add
+ 	missing entry for pragma Inline.
+ 
+ 2025-09-15  Viljar Indus  <indus@adacore.com>
+ 
+ 	* ghost.adb (Check_Assignee_Levels): Fix the condition and improve
+ 	error message handling.
+ 
+ 2025-09-15  Nicolas Boulenguez  <nicolas@debian.org>
+ 
+ 	PR ada/114065
+ 	* Makefile.rtl (GNATRTL_NONTASKING_OBJS): Add g-c_time$(objext) and
+ 	s-c_time$(objext).
+ 	(Aarch64/Android): Do not use s-osinte__android.adb.
+ 	(SPARC/Solaris): Do not use s-osprim__solaris.adb.
+ 	(x86/Solaris): Likewise.
+ 	(LynxOS178): Do not use s-parame__posix2008.ads.
+ 	(RTEMS): Likewise.
+ 	(x32/Linux): Likewise, as well as s-linux__x32.ads.  Replace
+ 	s-osprim__x32.adb with s-osprim__posix.adb.
+ 	(LIBGNAT_OBJS): Remove cal.o.
+ 	* cal.c: Delete.
+ 	* doc/gnat_rm/the_gnat_library.rst (GNAT.C_Time): New entry.
+ 	(GNAT.Calendar): Do not mention the obsolete conversion functions.
+ 	* impunit.adb (Non_Imp_File_Names_95): Add g-c_time.
+ 	* libgnarl/a-exetim__posix.adb: Add with clause for System.C_Time
+ 	(Clock): Use type and functions from System.C_Time.
+ 	* libgnarl/s-linux.ads: Remove with clause for System.Parameters.
+ 	Remove declarations of C time types.
+ 	* libgnarl/s-linux__alpha.ads: Likewise.
+ 	* libgnarl/s-linux__android-aarch64.ads: Likewise.
+ 	* libgnarl/s-linux__android-arm.ads: Likewise.
+ 	* libgnarl/s-linux__hppa.ads: Likewise.
+ 	* libgnarl/s-linux__loongarch.ads: Likewise.
+ 	* libgnarl/s-linux__mips.ads: Likewise.
+ 	* libgnarl/s-linux__riscv.ads: Likewise.
+ 	* libgnarl/s-linux__sparc.ads: Likewise.
+ 	* libgnarl/s-osinte__aix.ads: Likewise.
+ 	* libgnarl/s-osinte__android.ads: Likewise.
+ 	* libgnarl/s-osinte__cheribsd.ads: Likewise.
+ 	* libgnarl/s-osinte__darwin.ads: Likewise.
+ 	* libgnarl/s-osinte__dragonfly.ads: Likewise.
+ 	* libgnarl/s-osinte__freebsd.ads: Likewise.
+ 	* libgnarl/s-osinte__gnu.ads: Likewise.
+ 	* libgnarl/s-osinte__hpux.ads: Likewise.
+ 	* libgnarl/s-osinte__kfreebsd-gnu.ads: Likewise.
+ 	* libgnarl/s-osinte__linux.ads: Likewise.
+ 	* libgnarl/s-osinte__lynxos178e.ads: Likewise.
+ 	* libgnarl/s-osinte__qnx.ads: Likewise.
+ 	* libgnarl/s-osinte__rtems.ads: Likewise.
+ 	* libgnarl/s-osinte__solaris.ads: Likewise.
+ 	* libgnarl/s-osinte__vxworks.ads: Likewise.
+ 	* libgnarl/s-qnx.ads: Likewise.
+ 	* libgnarl/s-linux__x32.ads: Delete.
+ 	* libgnarl/s-osinte__darwin.adb (To_Duration): Remove.
+ 	(To_Timespec): Likewise.
+ 	* libgnarl/s-osinte__aix.adb: Likewise.
+ 	* libgnarl/s-osinte__dragonfly.adb: Likewise.
+ 	* libgnarl/s-osinte__freebsd.adb: Likewise.
+ 	* libgnarl/s-osinte__gnu.adb: Likewise.
+ 	* libgnarl/s-osinte__lynxos178.adb: Likewise.
+ 	* libgnarl/s-osinte__posix.adb: Likewise.
+ 	* libgnarl/s-osinte__qnx.adb: Likewise.
+ 	* libgnarl/s-osinte__rtems.adb: Likewise.
+ 	* libgnarl/s-osinte__solaris.adb: Likewise.
+ 	* libgnarl/s-osinte__vxworks.adb: Likewise.
+ 	* libgnarl/s-osinte__x32.adb: Likewise.
+ 	* libgnarl/s-taprop__solaris.adb: Add with clause for System.C_Time.
+ 	(Monotonic_Clock): Use type and functions from System.C_Time.
+ 	(RT_Resolution): Likewise.
+ 	(Timed_Sleep): Likewise.
+ 	(Timed_Delay): Likewise.
+ 	* libgnarl/s-taprop__vxworks.adb: Likewise.
+ 	* libgnarl/s-tpopmo.adb: Likewise.
+ 	* libgnarl/s-osinte__android.adb: Delete.
+ 	* libgnat/g-c_time.ads: New file.
+ 	* libgnat/g-calend.adb: Delegate to System.C_Time.
+ 	* libgnat/g-calend.ads: Likewise.
+ 	* libgnat/g-socket.adb: Likewise.
+ 	* libgnat/g-socthi.adb: Likewise.
+ 	* libgnat/g-socthi__vxworks.adb: Likewise.
+ 	* libgnat/g-sothco.ads: Likewise.
+ 	* libgnat/g-spogwa.adb: Likewise.
+ 	* libgnat/s-c_time.adb: New file.
+ 	* libgnat/s-c_time.ads: Likewise.
+ 	* libgnat/s-optide.adb: Import nanosleep here.
+ 	* libgnat/s-os_lib.ads (time_t): Remove.
+ 	(To_Ada): Adjust.
+ 	(To_C): Likewise.
+ 	* libgnat/s-os_lib.adb: Likewise.
+ 	* libgnat/s-osprim__darwin.adb: Delegate to System.C_Time.
+ 	* libgnat/s-osprim__posix.adb: Likewise.
+ 	* libgnat/s-osprim__posix2008.adb: Likewise.
+ 	* libgnat/s-osprim__rtems.adb: Likewise.
+ 	* libgnat/s-osprim__unix.adb: Likewise.
+ 	* libgnat/s-osprim__solaris.adb: Delete.
+ 	* libgnat/s-osprim__x32.adb: Likewise.
+ 	* libgnat/s-parame.ads (time_t_bits): Remove.
+ 	* libgnat/s-parame__hpux.ads: Likewise.
+ 	* libgnat/s-parame__vxworks.ads: Likewise.
+ 	* libgnat/s-parame__posix2008.ads: Delete.
+ 	* s-oscons-tmplt.c (SIZEOF_tv_nsec): New constant.
+ 	* gnat_rm.texi: Regenerate.
+ 
+ 2025-09-15  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	* exp_util.adb (Finalize_Address): In an untagged derivation, call
+ 	Root_Type on the full view of the base type if the partial view is
+ 	itself not a derived type.
+ 	(Is_Untagged_Derivation): Minor formatting tweak.
+ 
+ 2025-09-15  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	* exp_util.ads (Unqualified_Unconditional_Parent): New function.
+ 	* exp_util.adb (Unconditional_Parent): Do not look through qualified
+ 	expressions.
+ 	(Unqualified_Unconditional_Parent): New function identical to the
+ 	original Unconditional_Parent.
+ 	* exp_aggr.adb (Convert_To_Assignments): Replace Unconditional_Parent
+ 	with Unqualified_Unconditional_Parent.
+ 	(Expand_Array_Aggregate): Likewse.
+ 	* exp_ch4.adb (Expand_N_Case_Expression): Likewise.
+ 	(Expand_N_If_Expression): Likewise.
+ 	* exp_ch6.adb (Expand_Ctrl_Function_Call): Do not bypass an enclosing
+ 	qualified expression in the parent chain.
+ 
+ 2025-09-15  Ronan Desplanques  <desplanques@adacore.com>
+ 
+ 	* doc/gnat_rm/gnat_language_extensions.rst: Fix section of Finalizable.
+ 	* gnat_rm.texi: Regenerate.
+ 	* gnat_ugn.texi: Regenerate.
+ 
+ 2025-09-15  Viljar Indus  <indus@adacore.com>
+ 
+ 	* sem_ch6.adb (Analyze_Expression_Function): Disable ghost
+ 	checks during the early freeze.
+ 
+ 2025-09-15  Steve Baird  <baird@adacore.com>
+ 
+ 	* aspects.ads: Define Super aspect; allow Initialize aspect
+ 	specification on a subprogram body.
+ 	* exp_attr.adb (Expand_N_Attribute_Reference): Rewrite Make
+ 	attribute implementation.
+ 	* exp_ch3.adb (Initialization_Control): Delete Initialization_Mode
+ 	and Make_Mode_Literal (those declarations were moved to the spec).
+ 	(Build_Record_Init_Proc): For a constructor type, component
+ 	initialization (other than for the tag component, if any) must be
+ 	performed by calling the single-argument constructor procedure.
+ 	(Requires_Init_Proc): Return True for a constructor type.
+ 	* exp_ch3.ads (Make_Mode_Literal, Initialization_Mode): New, moved
+ 	from the body of this package.
+ 	* exp_ch6.adb (Expand_N_Subprogram_Body): Declare, implement, and
+ 	call a new local procedure, Prepend_Constructor_Procedure_Prologue
+ 	in order to generate component initialization for a constructor
+ 	procedure.
+ 	* sem_attr.adb (Analyze_Attribute): Improve the error message
+ 	generated for a 'Make attribute reference if GNAT extensions are
+ 	not all allowed.
+ 	* sem_ch13.adb (Analyze_One_Aspect): Improved implementation of
+ 	aspect specifications for Initialize, Constructor, and Super
+ 	aspects. For Super, there was no previous implementation.
+ 
+ 2025-09-15  Viljar Indus  <indus@adacore.com>
+ 
+ 	* atree.adb (Mark_New_Ghost_Node): Set Is_Implicit_Ghost for
+ 	all newly created nodes.
+ 	* gen_il-fields.ads (Is_Implicit_Ghost): New attribute.
+ 	* gen_il-gen-gen_entities.adb (Entity_Kind): Add Is_Implicit_Ghost
+ 	attribute.
+ 	* ghost.adb (Ghost_Policy_In_Effect): Implicit_Ghost_Entities inside
+ 	pragmas get the ghost mode from the region isntead of the global
+ 	ghost policy.
+ 	(Ghost_Assertion_Level_In_Effect): New function that returns the
+ 	applicable assertion level for the given entity in a similar manner
+ 	as Ghost_Policy_In_Effect.
+ 	(Install_Ghost_Region): Set Is_Inside_Statement_Or_Pragma attribute.
+ 	(Mark_And_Set_Ghost_Body): Update the logic for deriving the ghost
+ 	region.
+ 	(Set_Ghost_Mode): Ignored pragmas attached to checked ghost entities
+ 	now create an ignored ghost region. Pragmas attached to non-ghost
+ 	entities create the ghost region based on the policy applied to the
+ 	given pragma.
+ 	* opt.ads (Ghost_Config_Type): add new attribute
+ 	Is_Inside_Statement_Or_Pragama to track whether we should take the
+ 	active ghost mode from the ghost region for implicit ghost entities.
+ 	* sem_prag.adb (Analyze_Pragma): Mark entities that have an explicit
+ 	ghost pragma as non-implicit ghost.
+ 
+ 2025-09-15  Sebastian Poeplau  <poeplau@adacore.com>
+ 
+ 	* doc/gnat_ugn/building_executable_programs_with_gnat.rst:
+ 	Remove the note on light runtimes.
+ 
+ 2025-09-15  Sebastian Poeplau  <poeplau@adacore.com>
+ 
+ 	* doc/gnat_ugn/building_executable_programs_with_gnat.rst: Move
+ 	recommendation of Toolchain_Name up.
+ 	* gnat_ugn.texi: Regenerate.
+ 
+ 2025-09-15  Vadim Godunko  <godunko@adacore.com>
+ 
+ 	* bindgen.adb (Gen_Adafinal): Don't generate call of adafinal
+ 	when use of standard library suppressed.
+ 
+ 2025-09-15  Vadim Godunko  <godunko@adacore.com>
+ 
+ 	* bindgen.adb (Gen_Adafinal): Don't generate code when
+ 	use of standard library suppressed.
+ 
+ 2025-09-15  Vadim Godunko  <godunko@adacore.com>
+ 
+ 	* libgnat/a-swunau.ads (Set_Wide_String): New subprogram.
+ 	* libgnat/a-swunau.adb (Set_Wide_String): Likewise.
+ 	* libgnat/a-swunau__shared.adb (Set_Wide_String): Likewise.
+ 	* libgnat/a-szunau.ads (Set_Wide_Wide_String): Likewise.
+ 	* libgnat/a-szunau.adb (Set_Wide_Wide_String): Likewise.
+ 	* libgnat/a-szunau__shared.adb (Set_Wide_Wide_String): Likewise.
+ 
+ 2025-09-15  Viljar Indus  <indus@adacore.com>
+ 
+ 	* ghost.adb (Check_Ghost_Context): Avoid context checks when they
+ 	are globally disabled.
+ 	* sem.ads (Ghost_Context_Checks_Disabled): New flag to control
+ 	whether ghost context checks are activated or not.
+ 	* sem_prag.adb (Analyze_Pragma): Disable ghost context checks for
+ 	pragmas that determine their ghostliness based on one of its arguments.
+ 
+ 2025-09-15  Ronan Desplanques  <desplanques@adacore.com>
+ 
+ 	* sem_util.ads (Is_Ancestor_Package): Fix documentation comment.
+ 	* sem_util.adb (Is_Ancestor_Package): Rename local object.
+ 
  2025-09-11  Marc Poulhiès  <poulhies@adacore.com>
  
  	* libgnat/g-socket.adb (Listen_Socket): Change default value.
diff -Nrcpad gcc-16-20250914/gcc/ada/Makefile.rtl gcc-16-20250921/gcc/ada/Makefile.rtl
*** gcc-16-20250914/gcc/ada/Makefile.rtl	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/Makefile.rtl	Sun Sep 21 22:32:34 2025
*************** GNATRTL_NONTASKING_OBJS= \
*** 415,420 ****
--- 415,421 ----
    g-busorg$(objext) \
    g-byorma$(objext) \
    g-bytswa$(objext) \
+   g-c_time$(objext) \
    g-calend$(objext) \
    g-casuti$(objext) \
    g-catiio$(objext) \
*************** GNATRTL_NONTASKING_OBJS= \
*** 535,540 ****
--- 536,542 ----
    s-boarop$(objext) \
    s-boustr$(objext) \
    s-bytswa$(objext) \
+   s-c_time$(objext) \
    s-carsi8$(objext) \
    s-carun8$(objext) \
    s-casi16$(objext) \
*************** ifeq ($(strip $(filter-out arm% aarch64
*** 1418,1424 ****
    s-inmaop.adb<libgnarl/s-inmaop__posix.adb \
    s-intman.adb<libgnarl/s-intman__android.adb \
    s-osinte.ads<libgnarl/s-osinte__android.ads \
-   s-osinte.adb<libgnarl/s-osinte__android.adb \
    s-oslock.ads<libgnat/s-oslock__posix.ads \
    s-osprim.adb<libgnat/s-osprim__posix.adb \
    s-parame.adb<libgnat/s-parame__aarch64-linux.adb \
--- 1420,1425 ----
*************** ifeq ($(strip $(filter-out sparc% sun so
*** 1531,1537 ****
    s-osinte.adb<libgnarl/s-osinte__solaris.adb \
    s-osinte.ads<libgnarl/s-osinte__solaris.ads \
    s-oslock.ads<libgnat/s-oslock__solaris.ads \
!   s-osprim.adb<libgnat/s-osprim__solaris.adb \
    s-taprop.adb<libgnarl/s-taprop__solaris.adb \
    s-tasinf.adb<libgnarl/s-tasinf__solaris.adb \
    s-tasinf.ads<libgnarl/s-tasinf__solaris.ads \
--- 1532,1538 ----
    s-osinte.adb<libgnarl/s-osinte__solaris.adb \
    s-osinte.ads<libgnarl/s-osinte__solaris.ads \
    s-oslock.ads<libgnat/s-oslock__solaris.ads \
!   s-osprim.adb<libgnat/s-osprim__unix.adb \
    s-taprop.adb<libgnarl/s-taprop__solaris.adb \
    s-tasinf.adb<libgnarl/s-tasinf__solaris.adb \
    s-tasinf.ads<libgnarl/s-tasinf__solaris.ads \
*************** ifeq ($(strip $(filter-out %86 %x86_64 s
*** 1580,1586 ****
    s-osinte.adb<libgnarl/s-osinte__solaris.adb \
    s-osinte.ads<libgnarl/s-osinte__solaris.ads \
    s-oslock.ads<libgnat/s-oslock__solaris.ads \
!   s-osprim.adb<libgnat/s-osprim__solaris.adb \
    s-taprop.adb<libgnarl/s-taprop__solaris.adb \
    s-tasinf.adb<libgnarl/s-tasinf__solaris.adb \
    s-tasinf.ads<libgnarl/s-tasinf__solaris.ads \
--- 1581,1587 ----
    s-osinte.adb<libgnarl/s-osinte__solaris.adb \
    s-osinte.ads<libgnarl/s-osinte__solaris.ads \
    s-oslock.ads<libgnat/s-oslock__solaris.ads \
!   s-osprim.adb<libgnat/s-osprim__unix.adb \
    s-taprop.adb<libgnarl/s-taprop__solaris.adb \
    s-tasinf.adb<libgnarl/s-tasinf__solaris.adb \
    s-tasinf.ads<libgnarl/s-tasinf__solaris.ads \
*************** ifeq ($(strip $(filter-out lynxos178%,$(
*** 2146,2152 ****
  
    ifeq ($(strip $(filter-out lynxos178e,$(target_os))),)
      LIBGNAT_TARGET_PAIRS += \
-     s-parame.ads<libgnat/s-parame__posix2008.ads \
      s-osinte.ads<libgnarl/s-osinte__lynxos178e.ads \
      s-osprim.adb<libgnat/s-osprim__posix2008.adb \
      s-tracon.adb<hie/s-tracon__ppc-eabi.adb
--- 2147,2152 ----
*************** ifeq ($(strip $(filter-out rtems%,$(targ
*** 2173,2179 ****
    s-oslock.ads<libgnat/s-oslock__posix.ads \
    s-osprim.adb<libgnat/s-osprim__rtems.adb \
    s-parame.adb<libgnat/s-parame__rtems.adb \
-   s-parame.ads<libgnat/s-parame__posix2008.ads \
    s-taprop.adb<libgnarl/s-taprop__rtems.adb \
    s-taspri.ads<libgnarl/s-taspri__posix.ads \
    s-tpopsp.adb<libgnarl/s-tpopsp__tls.adb \
--- 2173,2178 ----
*************** ifeq ($(strip $(filter-out %x32 linux%,$
*** 2942,2954 ****
    a-synbar.ads<libgnarl/a-synbar__posix.ads \
    s-inmaop.adb<libgnarl/s-inmaop__posix.adb \
    s-intman.adb<libgnarl/s-intman__posix.adb \
-   s-linux.ads<libgnarl/s-linux__x32.ads \
    s-mudido.adb<libgnarl/s-mudido__affinity.adb \
    s-osinte.ads<libgnarl/s-osinte__linux.ads \
!   s-osinte.adb<libgnarl/s-osinte__x32.adb \
    s-oslock.ads<libgnat/s-oslock__posix.ads \
!   s-osprim.adb<libgnat/s-osprim__x32.adb \
!   s-parame.ads<libgnat/s-parame__posix2008.ads \
    s-taprop.adb<libgnarl/s-taprop__linux.adb \
    s-tasinf.ads<libgnarl/s-tasinf__linux.ads \
    s-tasinf.adb<libgnarl/s-tasinf__linux.adb \
--- 2941,2951 ----
    a-synbar.ads<libgnarl/a-synbar__posix.ads \
    s-inmaop.adb<libgnarl/s-inmaop__posix.adb \
    s-intman.adb<libgnarl/s-intman__posix.adb \
    s-mudido.adb<libgnarl/s-mudido__affinity.adb \
    s-osinte.ads<libgnarl/s-osinte__linux.ads \
!   s-osinte.adb<libgnarl/s-osinte__posix.adb \
    s-oslock.ads<libgnat/s-oslock__posix.ads \
!   s-osprim.adb<libgnat/s-osprim__posix.adb \
    s-taprop.adb<libgnarl/s-taprop__linux.adb \
    s-tasinf.ads<libgnarl/s-tasinf__linux.ads \
    s-tasinf.adb<libgnarl/s-tasinf__linux.adb \
*************** LIBGNAT_TARGET_PAIRS += \
*** 3195,3201 ****
  # library.  LIBGNAT_OBJS is the list of object files for libgnat.
  # thread.c is special as put into GNATRTL_TASKING_OBJS
  LIBGNAT_OBJS = adadecode.o adaint.o argv.o aux-io.o 			\
!   cal.o cio.o cstreams.o ctrl_c.o					\
    env.o errno.o exit.o expect.o final.o rtfinal.o rtinit.o		\
    init.o initialize.o locales.o mkdir.o					\
    raise.o seh_init.o socket.o sysdep.o					\
--- 3192,3198 ----
  # library.  LIBGNAT_OBJS is the list of object files for libgnat.
  # thread.c is special as put into GNATRTL_TASKING_OBJS
  LIBGNAT_OBJS = adadecode.o adaint.o argv.o aux-io.o 			\
!   cio.o cstreams.o ctrl_c.o						\
    env.o errno.o exit.o expect.o final.o rtfinal.o rtinit.o		\
    init.o initialize.o locales.o mkdir.o					\
    raise.o seh_init.o socket.o sysdep.o					\
diff -Nrcpad gcc-16-20250914/gcc/ada/aspects.ads gcc-16-20250921/gcc/ada/aspects.ads
*** gcc-16-20250914/gcc/ada/aspects.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/aspects.ads	Sun Sep 21 22:32:34 2025
*************** package Aspects is
*** 158,163 ****
--- 158,164 ----
        Aspect_Stream_Size,
        Aspect_String_Literal,
        Aspect_Subprogram_Variant,            -- GNAT
+       Aspect_Super,                         -- GNAT
        Aspect_Suppress,
        Aspect_Synchronization,
        Aspect_Test_Case,                     -- GNAT
*************** package Aspects is
*** 368,376 ****
        others                            => False);
  
     --  The following array indicates aspects that specify operational
!    --  characteristics, and thus are view-specific. Representation
!    --  aspects break privacy, as they are needed during expansion and
!    --  code generation.
     --  List is currently incomplete ???
  
     Operational_Aspect : constant array (Aspect_Id) of Boolean :=
--- 369,375 ----
        others                            => False);
  
     --  The following array indicates aspects that specify operational
!    --  characteristics, and thus can be specified on partial views.
     --  List is currently incomplete ???
  
     Operational_Aspect : constant array (Aspect_Id) of Boolean :=
*************** package Aspects is
*** 518,523 ****
--- 517,523 ----
        Aspect_Stream_Size                => Expression,
        Aspect_String_Literal             => Name,
        Aspect_Subprogram_Variant         => Expression,
+       Aspect_Super                      => Expression,
        Aspect_Suppress                   => Name,
        Aspect_Synchronization            => Name,
        Aspect_Test_Case                  => Expression,
*************** package Aspects is
*** 626,631 ****
--- 626,632 ----
        Aspect_Stream_Size                  => True,
        Aspect_String_Literal               => False,
        Aspect_Subprogram_Variant           => False,
+       Aspect_Super                        => False,
        Aspect_Suppress                     => False,
        Aspect_Synchronization              => False,
        Aspect_Test_Case                    => False,
*************** package Aspects is
*** 842,847 ****
--- 843,849 ----
        Aspect_Stream_Size                  => Name_Stream_Size,
        Aspect_String_Literal               => Name_String_Literal,
        Aspect_Subprogram_Variant           => Name_Subprogram_Variant,
+       Aspect_Super                        => Name_Super,
        Aspect_Suppress                     => Name_Suppress,
        Aspect_Suppress_Debug_Info          => Name_Suppress_Debug_Info,
        Aspect_Suppress_Initialization      => Name_Suppress_Initialization,
*************** package Aspects is
*** 1124,1129 ****
--- 1126,1132 ----
        Aspect_SPARK_Mode                   => Never_Delay,
        Aspect_Static                       => Never_Delay,
        Aspect_Subprogram_Variant           => Never_Delay,
+       Aspect_Super                        => Never_Delay,
        Aspect_Synchronization              => Never_Delay,
        Aspect_Test_Case                    => Never_Delay,
        Aspect_Unimplemented                => Never_Delay,
*************** package Aspects is
*** 1193,1202 ****
     --  Sem_Prag.
  
     Aspect_On_Body_Or_Stub_OK : constant array (Aspect_Id) of Boolean :=
!      (Aspect_Refined_Depends              => True,
        Aspect_Refined_Global               => True,
        Aspect_Refined_Post                 => True,
        Aspect_SPARK_Mode                   => True,
        Aspect_Warnings                     => True,
        others                              => False);
  
--- 1196,1207 ----
     --  Sem_Prag.
  
     Aspect_On_Body_Or_Stub_OK : constant array (Aspect_Id) of Boolean :=
!      (Aspect_Initialize                   => True,
!       Aspect_Refined_Depends              => True,
        Aspect_Refined_Global               => True,
        Aspect_Refined_Post                 => True,
        Aspect_SPARK_Mode                   => True,
+       Aspect_Super                        => True,
        Aspect_Warnings                     => True,
        others                              => False);
  
diff -Nrcpad gcc-16-20250914/gcc/ada/atree.adb gcc-16-20250921/gcc/ada/atree.adb
*** gcc-16-20250914/gcc/ada/atree.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/atree.adb	Sun Sep 21 22:32:34 2025
*************** package body Atree is
*** 1807,1812 ****
--- 1807,1813 ----
              Set_Is_Checked_Ghost_Entity (N);
              Set_Ghost_Assertion_Level
                (N, Ghost_Config.Ghost_Mode_Assertion_Level);
+             Set_Is_Implicit_Ghost (N);
           end if;
  
        elsif Ghost_Config.Ghost_Mode = Ignore then
*************** package body Atree is
*** 1814,1819 ****
--- 1815,1821 ----
              Set_Is_Ignored_Ghost_Entity (N);
              Set_Ghost_Assertion_Level
                (N, Ghost_Config.Ghost_Mode_Assertion_Level);
+             Set_Is_Implicit_Ghost (N);
           end if;
  
           Set_Is_Ignored_Ghost_Node (N);
diff -Nrcpad gcc-16-20250914/gcc/ada/bindgen.adb gcc-16-20250921/gcc/ada/bindgen.adb
*** gcc-16-20250914/gcc/ada/bindgen.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/bindgen.adb	Sun Sep 21 22:32:34 2025
*************** package body Bindgen is
*** 476,482 ****
        --  but False for mains in other languages.) We do not want to do this if
        --  we're binding a library.
  
!       if not Bind_For_Library and not CodePeer_Mode then
           WBI ("      procedure s_stalib_adafinal;");
           Set_String ("      pragma Import (Ada, s_stalib_adafinal, ");
           Set_String ("""system__standard_library__adafinal"");");
--- 476,485 ----
        --  but False for mains in other languages.) We do not want to do this if
        --  we're binding a library.
  
!       if not Bind_For_Library
!         and not CodePeer_Mode
!         and not Suppress_Standard_Library_On_Target
!       then
           WBI ("      procedure s_stalib_adafinal;");
           Set_String ("      pragma Import (Ada, s_stalib_adafinal, ");
           Set_String ("""system__standard_library__adafinal"");");
*************** package body Bindgen is
*** 490,496 ****
        WBI ("");
        WBI ("   begin");
  
!       if not CodePeer_Mode then
           WBI ("      if not Is_Elaborated then");
           WBI ("         return;");
           WBI ("      end if;");
--- 493,501 ----
        WBI ("");
        WBI ("   begin");
  
!       if not CodePeer_Mode
!         and not Suppress_Standard_Library_On_Target
!       then
           WBI ("      if not Is_Elaborated then");
           WBI ("         return;");
           WBI ("      end if;");
*************** package body Bindgen is
*** 503,509 ****
        --  on whether this is the main program or a library.
  
        if not CodePeer_Mode then
!          if not Bind_For_Library then
              WBI ("      s_stalib_adafinal;");
           elsif Lib_Final_Built then
              WBI ("      finalize_library;");
--- 508,516 ----
        --  on whether this is the main program or a library.
  
        if not CodePeer_Mode then
!          if not Bind_For_Library
!            and not Suppress_Standard_Library_On_Target
!          then
              WBI ("      s_stalib_adafinal;");
           elsif Lib_Final_Built then
              WBI ("      finalize_library;");
diff -Nrcpad gcc-16-20250914/gcc/ada/cal.c gcc-16-20250921/gcc/ada/cal.c
*** gcc-16-20250914/gcc/ada/cal.c	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/cal.c	Thu Jan  1 00:00:00 1970
***************
*** 1,74 ****
- /****************************************************************************
-  *                                                                          *
-  *                         GNAT COMPILER COMPONENTS                         *
-  *                                                                          *
-  *                                   C A L                                  *
-  *                                                                          *
-  *                          C Implementation File                           *
-  *                                                                          *
-  *          Copyright (C) 1992-2025, Free Software Foundation, Inc.         *
-  *                                                                          *
-  * GNAT is free software;  you can  redistribute it  and/or modify it under *
-  * terms of the  GNU General Public License as published  by the Free Soft- *
-  * ware  Foundation;  either version 3,  or (at your option) any later ver- *
-  * sion.  GNAT is distributed in the hope that it will be useful, but WITH- *
-  * OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY *
-  * or FITNESS FOR A PARTICULAR PURPOSE.                                     *
-  *                                                                          *
-  * As a special exception 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/>.                                          *
-  *                                                                          *
-  * GNAT was originally developed  by the GNAT team at  New York University. *
-  * Extensive contributions were provided by Ada Core Technologies Inc.      *
-  *                                                                          *
-  ****************************************************************************/
- 
- /*  This file contains routines marked with pragmas Import in package       */
- /*  GNAT.Calendar. It is used to do Duration to timeval conversion.         */
- /*  These are simple wrapper functions to abstract the fact that the C      */
- /*  struct timeval fields are not normalized (they are generally            */
- /*  defined as int or long values).                                         */
- 
- #if defined (__vxworks)
- #ifdef __RTP__
- #include <time.h>
- #include <version.h>
- #if (_WRS_VXWORKS_MAJOR == 7) || (_WRS_VXWORKS_MINOR != 0)
- #include <sys/time.h>
- #endif
- #else
- #include <sys/times.h>
- #endif
- #elif defined (__nucleus__)
- #include <time.h>
- #else
- #include <sys/time.h>
- #endif
- 
- #ifdef __MINGW32__
- #include "mingw32.h"
- #include <winsock.h>
- #endif
- 
- void
- __gnat_timeval_to_duration (struct timeval *t, long long *sec, long *usec)
- {
-   *sec  = (long long) t->tv_sec;
-   *usec = (long) t->tv_usec;
- }
- 
- void
- __gnat_duration_to_timeval (long long sec, long usec, struct timeval *t)
- {
-   /* here we are doing implicit conversion to the struct timeval
-      fields types. */
- 
-   t->tv_sec = sec;
-   t->tv_usec = usec;
- }
--- 0 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/checks.adb gcc-16-20250921/gcc/ada/checks.adb
*** gcc-16-20250914/gcc/ada/checks.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/checks.adb	Sun Sep 21 22:32:34 2025
*************** package body Checks is
*** 1585,1605 ****
           return;
        end if;
  
!       --  Suppress checks if the subtypes are the same. The check must be
!       --  preserved in an assignment to a formal, because the constraint is
!       --  given by the actual.
  
        if Nkind (Original_Node (N)) /= N_Allocator
          and then (No (Lhs)
                     or else not Is_Entity_Name (Lhs)
                     or else No (Param_Entity (Lhs)))
        then
!          if (Etype (N) = Typ
!               or else (Do_Access and then Designated_Type (Typ) = S_Typ))
!            and then (No (Lhs) or else not Is_Aliased_View (Lhs))
!          then
!             return;
!          end if;
  
        --  We can also eliminate checks on allocators with a subtype mark that
        --  coincides with the context type. The context type may be a subtype
--- 1585,1602 ----
           return;
        end if;
  
!       --  Suppress checks if the subtypes are the same and constrained. The
!       --  check must be preserved in an assignment to a formal, because the
!       --  constraint is given by the actual.
  
        if Nkind (Original_Node (N)) /= N_Allocator
+         and then (if Do_Access then Designated_Type (Typ) else Typ) = S_Typ
+         and then Is_Constrained (S_Typ)
          and then (No (Lhs)
                     or else not Is_Entity_Name (Lhs)
                     or else No (Param_Entity (Lhs)))
        then
!          return;
  
        --  We can also eliminate checks on allocators with a subtype mark that
        --  coincides with the context type. The context type may be a subtype
diff -Nrcpad gcc-16-20250914/gcc/ada/contracts.adb gcc-16-20250921/gcc/ada/contracts.adb
*** gcc-16-20250914/gcc/ada/contracts.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/contracts.adb	Sun Sep 21 22:32:34 2025
*************** package body Contracts is
*** 1131,1142 ****
        if Comes_From_Source (Obj_Id) and then Is_Ghost_Entity (Obj_Id) then
  
           --  A Ghost object cannot be of a type that yields a synchronized
!          --  object (SPARK RM 6.9(21)).
  
           if Yields_Synchronized_Object (Obj_Typ) then
              Error_Msg_N ("ghost object & cannot be synchronized", Obj_Id);
  
!          --  A Ghost object cannot be imported or exported (SPARK RM 6.9(7)).
           --  One exception to this is the object that represents the dispatch
           --  table of a Ghost tagged type, as the symbol needs to be exported.
  
--- 1131,1142 ----
        if Comes_From_Source (Obj_Id) and then Is_Ghost_Entity (Obj_Id) then
  
           --  A Ghost object cannot be of a type that yields a synchronized
!          --  object (SPARK RM 6.9(22)).
  
           if Yields_Synchronized_Object (Obj_Typ) then
              Error_Msg_N ("ghost object & cannot be synchronized", Obj_Id);
  
!          --  A Ghost object cannot be imported or exported (SPARK RM 6.9(9)).
           --  One exception to this is the object that represents the dispatch
           --  table of a Ghost tagged type, as the symbol needs to be exported.
  
diff -Nrcpad gcc-16-20250914/gcc/ada/doc/gnat_rm/gnat_language_extensions.rst gcc-16-20250921/gcc/ada/doc/gnat_rm/gnat_language_extensions.rst
*** gcc-16-20250914/gcc/ada/doc/gnat_rm/gnat_language_extensions.rst	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/doc/gnat_rm/gnat_language_extensions.rst	Sun Sep 21 22:32:34 2025
*************** Here is an example of this feature:
*** 605,610 ****
--- 605,741 ----
  It ensures that arithmetic operations of type ``Uns_64`` are carried
  out using 64 bits.
  
+ Generalized Finalization
+ ------------------------
+ 
+ The ``Finalizable`` aspect can be applied to any record type, tagged or not,
+ to specify that it provides the same level of control on the operations of
+ initialization, finalization, and assignment of objects as the controlled
+ types (see RM 7.6(2) for a high-level overview). The only restriction is
+ that the record type must be a root type, in other words not a derived type.
+ 
+ The aspect additionally makes it possible to specify relaxed semantics for
+ the finalization operations by means of the ``Relaxed_Finalization`` setting.
+ Here is the archetypal example:
+ 
+ .. code-block:: ada
+ 
+     type T is record
+       ...
+     end record
+       with Finalizable => (Initialize           => Initialize,
+                            Adjust               => Adjust,
+                            Finalize             => Finalize,
+                            Relaxed_Finalization => True);
+ 
+     procedure Adjust     (Obj : in out T);
+     procedure Finalize   (Obj : in out T);
+     procedure Initialize (Obj : in out T);
+ 
+ The three procedures have the same profile, with a single ``in out`` parameter,
+ and also have the same dynamic semantics as for controlled types:
+ 
+  - ``Initialize`` is called when an object of type ``T`` is declared without
+    initialization expression.
+ 
+  - ``Adjust`` is called after an object of type ``T`` is assigned a new value.
+ 
+  - ``Finalize`` is called when an object of type ``T`` goes out of scope (for
+    stack-allocated objects) or is deallocated (for heap-allocated objects).
+    It is also called when the value is replaced by an assignment.
+ 
+ However, when ``Relaxed_Finalization`` is either ``True`` or not explicitly
+ specified, the following differences are implemented relative to the semantics
+ of controlled types:
+ 
+ * The compiler has permission to perform no automatic finalization of
+   heap-allocated objects: ``Finalize`` is only called when such an object
+   is explicitly deallocated, or when the designated object is assigned a new
+   value. As a consequence, no runtime support is needed for performing
+   implicit deallocation. In particular, no per-object header data is needed
+   for heap-allocated objects.
+ 
+   Heap-allocated objects allocated through a nested access type will therefore
+   **not** be deallocated either. The result is simply that memory will be leaked
+   in this case.
+ 
+ * The ``Adjust`` and ``Finalize`` procedures are automatically considered as
+   having the :ref:`No_Raise_Aspect` specified for them. In particular, the
+   compiler has permission to enforce none of the guarantees specified by the
+   RM 7.6.1 (14/1) and subsequent subclauses.
+ 
+ Simple example of ref-counted type:
+ 
+ .. code-block:: ada
+ 
+    type T is record
+       Value     : Integer;
+       Ref_Count : Natural := 0;
+    end record;
+ 
+    procedure Inc_Ref (X : in out T);
+    procedure Dec_Ref (X : in out T);
+ 
+    type T_Access is access all T;
+ 
+    type T_Ref is record
+       Value : T_Access;
+    end record
+       with Finalizable => (Adjust   => Adjust,
+                            Finalize => Finalize);
+ 
+    procedure Adjust (Ref : in out T_Ref) is
+    begin
+       Inc_Ref (Ref.Value);
+    end Adjust;
+ 
+    procedure Finalize (Ref : in out T_Ref) is
+    begin
+       Def_Ref (Ref.Value);
+    end Finalize;
+ 
+ Simple file handle that ensures resources are properly released:
+ 
+ .. code-block:: ada
+ 
+    package P is
+       type File (<>) is limited private;
+ 
+       function Open (Path : String) return File;
+ 
+       procedure Close (F : in out File);
+ 
+    private
+       type File is limited record
+          Handle : ...;
+       end record
+          with Finalizable (Finalize => Close);
+    end P;
+ 
+ Finalizable tagged types
+ ^^^^^^^^^^^^^^^^^^^^^^^^
+ 
+ The aspect is inherited by derived types and the primitives may be overridden
+ by the derivation. The compiler-generated calls to these operations are then
+ dispatching whenever it makes sense, i.e. when the object in question is of a
+ class-wide type and the class includes at least one finalizable tagged type.
+ 
+ Composite types
+ ^^^^^^^^^^^^^^^
+ 
+ When a finalizable type is used as a component of a composite type, the latter
+ becomes finalizable as well. The three primitives are derived automatically
+ in order to call the primitives of their components. The dynamic semantics is
+ the same as for controlled components of composite types.
+ 
+ Interoperability with controlled types
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ 
+ Finalizable types are fully interoperable with controlled types, in particular
+ it is possible for a finalizable type to have a controlled component and vice
+ versa, but the stricter dynamic semantics, in other words that of controlled
+ types, is applied in this case.
+ 
  .. _Experimental_Language_Extensions:
  
  Experimental Language Extensions
*************** of the call is erroneous if the tag of t
*** 1518,1654 ****
  parameter exists (that is, before leaving the corresponding callable construct).
  This is analogous to the RM 6.4.1(18) rule about discriminated parameters.
  
- Generalized Finalization
- ------------------------
- 
- The ``Finalizable`` aspect can be applied to any record type, tagged or not,
- to specify that it provides the same level of control on the operations of
- initialization, finalization, and assignment of objects as the controlled
- types (see RM 7.6(2) for a high-level overview). The only restriction is
- that the record type must be a root type, in other words not a derived type.
- 
- The aspect additionally makes it possible to specify relaxed semantics for
- the finalization operations by means of the ``Relaxed_Finalization`` setting.
- Here is the archetypal example:
- 
- .. code-block:: ada
- 
-     type T is record
-       ...
-     end record
-       with Finalizable => (Initialize           => Initialize,
-                            Adjust               => Adjust,
-                            Finalize             => Finalize,
-                            Relaxed_Finalization => True);
- 
-     procedure Adjust     (Obj : in out T);
-     procedure Finalize   (Obj : in out T);
-     procedure Initialize (Obj : in out T);
- 
- The three procedures have the same profile, with a single ``in out`` parameter,
- and also have the same dynamic semantics as for controlled types:
- 
-  - ``Initialize`` is called when an object of type ``T`` is declared without
-    initialization expression.
- 
-  - ``Adjust`` is called after an object of type ``T`` is assigned a new value.
- 
-  - ``Finalize`` is called when an object of type ``T`` goes out of scope (for
-    stack-allocated objects) or is deallocated (for heap-allocated objects).
-    It is also called when the value is replaced by an assignment.
- 
- However, when ``Relaxed_Finalization`` is either ``True`` or not explicitly
- specified, the following differences are implemented relative to the semantics
- of controlled types:
- 
- * The compiler has permission to perform no automatic finalization of
-   heap-allocated objects: ``Finalize`` is only called when such an object
-   is explicitly deallocated, or when the designated object is assigned a new
-   value. As a consequence, no runtime support is needed for performing
-   implicit deallocation. In particular, no per-object header data is needed
-   for heap-allocated objects.
- 
-   Heap-allocated objects allocated through a nested access type will therefore
-   **not** be deallocated either. The result is simply that memory will be leaked
-   in this case.
- 
- * The ``Adjust`` and ``Finalize`` procedures are automatically considered as
-   having the :ref:`No_Raise_Aspect` specified for them. In particular, the
-   compiler has permission to enforce none of the guarantees specified by the
-   RM 7.6.1 (14/1) and subsequent subclauses.
- 
- Simple example of ref-counted type:
- 
- .. code-block:: ada
- 
-    type T is record
-       Value     : Integer;
-       Ref_Count : Natural := 0;
-    end record;
- 
-    procedure Inc_Ref (X : in out T);
-    procedure Dec_Ref (X : in out T);
- 
-    type T_Access is access all T;
- 
-    type T_Ref is record
-       Value : T_Access;
-    end record
-       with Finalizable => (Adjust   => Adjust,
-                            Finalize => Finalize);
- 
-    procedure Adjust (Ref : in out T_Ref) is
-    begin
-       Inc_Ref (Ref.Value);
-    end Adjust;
- 
-    procedure Finalize (Ref : in out T_Ref) is
-    begin
-       Def_Ref (Ref.Value);
-    end Finalize;
- 
- Simple file handle that ensures resources are properly released:
- 
- .. code-block:: ada
- 
-    package P is
-       type File (<>) is limited private;
- 
-       function Open (Path : String) return File;
- 
-       procedure Close (F : in out File);
- 
-    private
-       type File is limited record
-          Handle : ...;
-       end record
-          with Finalizable (Finalize => Close);
-    end P;
- 
- Finalizable tagged types
- ^^^^^^^^^^^^^^^^^^^^^^^^
- 
- The aspect is inherited by derived types and the primitives may be overridden
- by the derivation. The compiler-generated calls to these operations are then
- dispatching whenever it makes sense, i.e. when the object in question is of a
- class-wide type and the class includes at least one finalizable tagged type.
- 
- Composite types
- ^^^^^^^^^^^^^^^
- 
- When a finalizable type is used as a component of a composite type, the latter
- becomes finalizable as well. The three primitives are derived automatically
- in order to call the primitives of their components. The dynamic semantics is
- the same as for controlled components of composite types.
- 
- Interoperability with controlled types
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- 
- Finalizable types are fully interoperable with controlled types, in particular
- it is possible for a finalizable type to have a controlled component and vice
- versa, but the stricter dynamic semantics, in other words that of controlled
- types, is applied in this case.
- 
  .. _No_Raise_Aspect:
  
  No_Raise aspect
--- 1649,1654 ----
*************** be private to the enclosing package. Thi
*** 1884,1886 ****
--- 1884,2040 ----
  mentioned legality rule, to prevent breaking the privacy of the type when
  imposing that rule on outside types that derive from the private view of the
  type.
+ 
+ Structural Generic Instantiation
+ --------------------------------
+ 
+ The compiler implements a second kind of generic instantiation, called
+ "structural", alongside the traditional instantiation specified by the
+ language, which is defined as follows: the structural instantiation of
+ a generic unit on given actual parameters is the anonymous instantiation
+ of the generic unit on the actual parameters done in the outermost scope
+ where it would be legal to do an identical traditional instantiation.
+ 
+ There is at most one structural instantiation of a generic unit on given
+ actual parameters done in a partition.
+ 
+ Structural generic instances (the product of structural instantiation)
+ are implicitly created whenever a reference to them is made in a place
+ where a name is accepted by the language.
+ 
+ Syntax
+ ^^^^^^
+ 
+ .. code-block:: text
+ 
+    name ::= { set of productions specified in the RM }
+             | structural_generic_instance_name
+ 
+    structural_generic_instance_name ::= name generic_actual_part
+ 
+ Legality Rules
+ ^^^^^^^^^^^^^^
+ 
+ The ``name`` in a ``structural_generic_instance_name`` shall denote a generic
+ unit that is preelaborated. Note that, unlike in a traditional instantiation,
+ there are no square brackets around the ``generic_actual_part`` in the second
+ production, which means that it is mandatory and, therefore, that the generic
+ unit shall have at least one generic formal parameter.
+ 
+ The generic unit shall not take a generic formal object of mode ``in out``.
+ If the generic unit takes a generic formal object of mode ``in``, then the
+ corresponding generic actual parameter shall be a static expression.
+ 
+ A ``structural_generic_instance_name`` shall not be present in a library
+ unit if the structural instance is also a library unit and has a semantic
+ dependence on the former.
+ 
+ Static Semantics
+ ^^^^^^^^^^^^^^^^
+ 
+ A ``structural_generic_instance_name`` denotes the instance that is the
+ product of the structural instantiation of a generic unit on the specified
+ actual parameters. This instance is unique to a partition.
+ 
+ Example:
+ 
+ .. code-block:: ada
+ 
+    with Ada.Containers.Vectors;
+ 
+    procedure P is
+       V : Ada.Containers.Vectors(Positive,Integer).Vector;
+ 
+    begin
+       V.Append (1);
+       V.Append (0);
+       Ada.Containers.Vectors(Positive,Integer).Generic_Sorting("<").Sort (V);
+    end;
+ 
+ This procedure references two structural instantiations of two different generic
+ units: ``Ada.Containers.Vectors(Positive,Integer)`` is the structural instance
+ of the generic unit ``Ada.Containers.Vectors`` on ``Positive`` and ``Integer``
+ and ``Ada.Containers.Vectors(Positive,Integer).Generic_Sorting("<")`` is the
+ structural instance of the nested generic unit
+ ``Ada.Containers.Vectors(Positive,Integer).Generic_Sorting`` on ``"<"``.
+ 
+ Note that the following example is illegal:
+ 
+ .. code-block:: ada
+ 
+    with Ada.Containers.Vectors;
+ 
+    package Q is
+       type T is record
+          I : Integer;
+       end record;
+ 
+       V : Ada.Containers.Vectors(Positive,T).Vector;
+    end Q;
+ 
+ The reason is that ``Ada.Containers.Vectors``, ``Positive`` and ``Q.T`` being
+ library-level entities, the structural instance ``Ada.Containers.Vectors(Positive,T)`` is a library unit with a dependence
+ on ``Q`` and, therefore, cannot be referenced from within ``Q``. The simple
+ way out is to declare a traditional instantiation in this case:
+ 
+ .. code-block:: ada
+ 
+    with Ada.Containers.Vectors;
+ 
+    package Q is
+       type T is record
+          I : Integer;
+       end record;
+ 
+       package Vectors_Of_T is new Ada.Containers.Vectors(Positive,T);
+ 
+       V : Vectors_Of_T.Vector;
+    end Q;
+ 
+ But the following example is legal:
+ 
+ .. code-block:: ada
+ 
+    with Ada.Containers.Vectors;
+ 
+    procedure P is
+       type T is record
+          I : Integer;
+       end record;
+ 
+       V : Ada.Containers.Vectors(Positive,T).Vector;
+    end;
+ 
+ because the structural instance ``Ada.Containers.Vectors(Positive,T)`` is
+ not a library unit.
+ 
+ The first example can be rewritten in a less verbose manner:
+ 
+ .. code-block:: ada
+ 
+    with Ada.Containers.Vectors; use Ada.Containers.Vectors(Positive,Integer);
+ 
+    procedure P is
+       V : Vector;
+ 
+    begin
+       V.Append (1);
+       V.Append (0);
+       Generic_Sorting("<").Sort (V);
+    end;
+ 
+ Another example, which additionally uses the inference of dependent types:
+ 
+ .. code-block:: ada
+ 
+    with Ada.Unchecked_Deallocation;
+ 
+    procedure P is
+ 
+       type Integer_Access is access all Integer;
+ 
+       A : Integer_Access := new Integer'(1);
+ 
+    begin
+       Ada.Unchecked_Deallocation(Name => Integer_Access) (A);
+    end;
diff -Nrcpad gcc-16-20250914/gcc/ada/doc/gnat_rm/security_hardening_features.rst gcc-16-20250921/gcc/ada/doc/gnat_rm/security_hardening_features.rst
*** gcc-16-20250914/gcc/ada/doc/gnat_rm/security_hardening_features.rst	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/doc/gnat_rm/security_hardening_features.rst	Sun Sep 21 22:32:34 2025
*************** are provided by GNAT.
*** 10,15 ****
--- 10,17 ----
  The features in this chapter are currently experimental and subject to
  change.
  
+ These features are supported only by the GCC back end, not by LLVM.
+ 
  .. Register Scrubbing:
  
  Register Scrubbing
diff -Nrcpad gcc-16-20250914/gcc/ada/doc/gnat_rm/the_gnat_library.rst gcc-16-20250921/gcc/ada/doc/gnat_rm/the_gnat_library.rst
*** gcc-16-20250914/gcc/ada/doc/gnat_rm/the_gnat_library.rst	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/doc/gnat_rm/the_gnat_library.rst	Sun Sep 21 22:32:34 2025
*************** sequences for various UCS input formats.
*** 663,668 ****
--- 663,680 ----
  General routines for swapping the bytes in 2-, 4-, and 8-byte quantities.
  Machine-specific implementations are available in some cases.
  
+ .. _`GNAT.C_Time_(g-c_time.ads)`:
+ 
+ ``GNAT.C_Time`` (:file:`g-c_time.ads`)
+ ======================================
+ 
+ .. index:: GNAT.C_Time (g-c_time.ads)
+ 
+ .. index:: Time
+ 
+ Provides the time_t, timeval and timespec types corresponding to the C
+ types defined by the OS, as well as various conversion functions.
+ 
  .. _`GNAT.Calendar_(g-calend.ads)`:
  
  ``GNAT.Calendar`` (:file:`g-calend.ads`)
*************** Machine-specific implementations are ava
*** 674,681 ****
  
  Extends the facilities provided by ``Ada.Calendar`` to include handling
  of days of the week, an extended ``Split`` and ``Time_Of`` capability.
- Also provides conversion of ``Ada.Calendar.Time`` values to and from the
- C ``timeval`` format.
  
  .. _`GNAT.Calendar.Time_IO_(g-catiio.ads)`:
  
--- 686,691 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/doc/gnat_ugn/building_executable_programs_with_gnat.rst gcc-16-20250921/gcc/ada/doc/gnat_ugn/building_executable_programs_with_gnat.rst
*** gcc-16-20250914/gcc/ada/doc/gnat_ugn/building_executable_programs_with_gnat.rst	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/doc/gnat_ugn/building_executable_programs_with_gnat.rst	Sun Sep 21 22:32:34 2025
*************** We provide two options that you can use
*** 8116,8135 ****
  
  * ``gprbuild`` can detect and use GNAT LLVM when it is installed.
  
!   ``gprbuild`` uses the first applicable compiler on the executable
!   search path, including GNAT LLVM.  An easy way to build with GNAT
!   LLVM is to make it available on the operating system's search path
!   before any other Ada compiler (such as the GCC version of GNAT). To
!   avoid accidentally using a different compiler than the one you want
!   to use, we recommend generating an explicit toolchain configuration
!   file with ``gprconfig`` and using it with ``gprbuild``; see the
!   *GPRbuild and GPR Companion Tools User's Guide* for details. You
!   can determine from the first line of the :file:`.ali` file
!   which version of GNAT built that file because it contains either
!   :code:`GNAT` or :code:`GNAT-LLVM`.
! 
!   You can also explicitly select GNAT LLVM in your existing GPR project
!   file by adding :code:`for Toolchain_Name("Ada") use "GNAT_LLVM";`
  
  .. only:: PRO
  
--- 8116,8133 ----
  
  * ``gprbuild`` can detect and use GNAT LLVM when it is installed.
  
!   ``gprbuild`` uses the first applicable compiler on the executable search
!   path, including GNAT LLVM. An easy way to build with GNAT LLVM is to make
!   it available on the operating system's search path before any other Ada
!   compiler (such as the GCC version of GNAT). To avoid accidentally using a
!   different compiler than the one you want to use, we recommend explicitly
!   selecting GNAT LLVM in your existing GPR project file by adding
!   :code:`for Toolchain_Name ("Ada") use "GNAT_LLVM";`. You can also
!   generate an explicit toolchain configuration file with ``gprconfig`` and
!   use it with ``gprbuild``; see the *GPRbuild and GPR Companion Tools
!   User's Guide* for details. You can determine from the first line of the
!   :file:`.ali` file which version of GNAT built that file because it
!   contains either :code:`GNAT` or :code:`GNAT-LLVM`.
  
  .. only:: PRO
  
*************** GNAT.
*** 8145,8149 ****
  
  .. only:: PRO
  
!   It provides the same runtimes with the exception that light runtimes
!   are not currently included with the native compilers.
--- 8143,8146 ----
  
  .. only:: PRO
  
!   It provides the same runtimes.
diff -Nrcpad gcc-16-20250914/gcc/ada/einfo.ads gcc-16-20250921/gcc/ada/einfo.ads
*** gcc-16-20250914/gcc/ada/einfo.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/einfo.ads	Sun Sep 21 22:32:34 2025
*************** package Einfo is
*** 3024,3029 ****
--- 3024,3036 ----
  --       record is declared to be limited. Note that this flag is not set
  --       simply because some components of the record are limited.
  
+ --    Is_Link_Once
+ --       Defined in all entities. Set to indicate that an entity can be defined
+ --       in multiple compilation units without generating a linker error. The
+ --       compiler guarantees that the multiple definitions are equivalent and,
+ --       therefore, that the linker can freely pick one of them. If this flag
+ --       is set on an entity, then the Is_Public flag is also set on it.
+ 
  --    Is_Local_Anonymous_Access
  --       Defined in access types. Set for an anonymous access type to indicate
  --       that the type is created for a record component with an access
*************** package Einfo is
*** 4990,4995 ****
--- 4997,5003 ----
     --    Is_Known_Valid
     --    Is_Limited_Composite
     --    Is_Limited_Record
+    --    Is_Link_Once
     --    Is_Loop_Parameter
     --    Is_Obsolescent
     --    Is_Package_Body_Entity
diff -Nrcpad gcc-16-20250914/gcc/ada/exp_aggr.adb gcc-16-20250921/gcc/ada/exp_aggr.adb
*** gcc-16-20250914/gcc/ada/exp_aggr.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/exp_aggr.adb	Sun Sep 21 22:32:34 2025
*************** package body Exp_Aggr is
*** 4283,4289 ****
        --  Set the Expansion_Delayed flag in the cases where the transformation
        --  will be done top down from above.
  
!       Parent_Node := Unconditional_Parent (N);
  
        if
           --  Internal aggregates (transformed when expanding the parent),
--- 4283,4289 ----
        --  Set the Expansion_Delayed flag in the cases where the transformation
        --  will be done top down from above.
  
!       Parent_Node := Unqualified_Unconditional_Parent (N);
  
        if
           --  Internal aggregates (transformed when expanding the parent),
*************** package body Exp_Aggr is
*** 6254,6260 ****
        --  Set the Expansion_Delayed flag in the cases where the transformation
        --  will be done top down from above.
  
!       Parent_Node := Unconditional_Parent (N);
  
        if
           --  Internal aggregates (transformed when expanding the parent),
--- 6254,6260 ----
        --  Set the Expansion_Delayed flag in the cases where the transformation
        --  will be done top down from above.
  
!       Parent_Node := Unqualified_Unconditional_Parent (N);
  
        if
           --  Internal aggregates (transformed when expanding the parent),
diff -Nrcpad gcc-16-20250914/gcc/ada/exp_attr.adb gcc-16-20250921/gcc/ada/exp_attr.adb
*** gcc-16-20250914/gcc/ada/exp_attr.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/exp_attr.adb	Sun Sep 21 22:32:34 2025
***************
*** 24,30 ****
  ------------------------------------------------------------------------------
  
  with Accessibility;  use Accessibility;
- with Aspects;        use Aspects;
  with Atree;          use Atree;
  with Checks;         use Checks;
  with Debug;          use Debug;
--- 24,29 ----
*************** package body Exp_Attr is
*** 266,271 ****
--- 265,279 ----
     --  the implementation base type of this type (Typ). If found, return the
     --  pragma node, otherwise return Empty if no pragma is found.
  
+    function Interunit_Ref_OK
+      (Subp_Unit, Attr_Ref_Unit : Node_Id) return Boolean;
+    --  Returns True if it is ok to refer to a cached subprogram declared in
+    --  Subp_Unit from the point of an attribute reference occurring in
+    --  Attr_Ref_Unit. Both arguments are usually N_Compilation_Nodes,
+    --  although there are cases where Subp_Unit might be a type declared in
+    --  package Standard (in which case the In_Same_Extended_Unit call will
+    --  return False).
+ 
     function Is_Constrained_Packed_Array (Typ : Entity_Id) return Boolean;
     --  Utility for array attributes, returns true on packed constrained
     --  arrays, and on access to same.
*************** package body Exp_Attr is
*** 280,299 ****
     --  Returns True if Typ is a user-defined enumeration type, in the sense
     --  that its literals are declared in the source.
  
-    function Interunit_Ref_OK
-      (Subp_Unit, Attr_Ref_Unit : Node_Id) return Boolean is
-        (In_Same_Extended_Unit (Subp_Unit, Attr_Ref_Unit)
-          --  If subp declared in unit body, then we don't want to refer
-          --  to it from within unit spec so return False in that case.
-          and then not (not Is_Body (Unit (Attr_Ref_Unit))
-                        and Is_Body (Unit (Subp_Unit))));
-    --  Returns True if it is ok to refer to a cached subprogram declared in
-    --  Subp_Unit from the point of an attribute reference occurring in
-    --  Attr_Ref_Unit. Both arguments are usually N_Compilation_Nodes,
-    --  although there are cases where Subp_Unit might be a type declared in
-    --  package Standard (in which case the In_Same_Extended_Unit call will
-    --  return False).
- 
     package body Cached_Attribute_Ops is
  
        -------------------------------
--- 288,293 ----
*************** package body Exp_Attr is
*** 2021,2027 ****
  
                    pragma Assert (Present (Insertion_Point));
                 end if;
!                Ancestor := Parent (Ancestor);
              end loop;
  
              if Present (Insertion_Point) then
--- 2015,2026 ----
  
                    pragma Assert (Present (Insertion_Point));
                 end if;
! 
!                if Nkind (Ancestor) = N_Subunit then
!                   Ancestor := Corresponding_Stub (Ancestor);
!                else
!                   Ancestor := Parent (Ancestor);
!                end if;
              end loop;
  
              if Present (Insertion_Point) then
*************** package body Exp_Attr is
*** 5113,5422 ****
  
        when Attribute_Make =>
           declare
!             Params    : List_Id;
!             Param     : Node_Id;
!             Par       : Node_Id;
!             Construct : Entity_Id;
!             Obj       : Node_Id := Empty;
!             Make_Expr : Node_Id := N;
! 
!             Formal       : Entity_Id;
!             Replace_Expr : Node_Id;
!             Init_Param   : Node_Id;
!             Construct_Call : Node_Id;
!             Curr_Nam : Node_Id := Empty;
! 
!             function Replace_Formal_Ref
!               (N : Node_Id) return Traverse_Result;
! 
!             function Replace_Formal_Ref
!               (N : Node_Id) return Traverse_Result is
!             begin
!                if Is_Entity_Name (N)
!                  and then Chars (Formal) = Chars (N)
!                then
!                   Rewrite (N,
!                     New_Copy_Tree (Replace_Expr));
!                end if;
! 
!                return OK;
!             end Replace_Formal_Ref;
! 
!             procedure Search_And_Replace_Formal is new
!               Traverse_Proc (Replace_Formal_Ref);
! 
           begin
!             --  Remove side effects for constructor call
! 
!             Param := First (Expressions (N));
!             while Present (Param) loop
!                if Nkind (Param) = N_Parameter_Association then
!                   Remove_Side_Effects (Explicit_Actual_Parameter (Param),
!                                        Check_Side_Effects => False);
!                else
!                   Remove_Side_Effects (Param, Check_Side_Effects => False);
!                end if;
! 
!                Next (Param);
!             end loop;
! 
!             --  Construct the parameters list
! 
!             Params := New_Copy_List (Expressions (N));
!             if Is_Empty_List (Params) then
!                Params := New_List;
!             end if;
! 
!             --  Identify the enclosing parent for the non-copy cases
! 
!             Par := Parent (N);
!             if Nkind (Par) = N_Qualified_Expression then
!                Par       := Parent (Par);
!                Make_Expr := Par;
!             end if;
!             if Nkind (Par) = N_Allocator then
!                Par := Parent (Par);
!                Curr_Nam := Make_Explicit_Dereference
!                             (Loc, Prefix => Empty);
!                Obj := Curr_Nam;
              end if;
  
!             declare
!                Base_Obj : Node_Id := Empty;
!                Typ_Comp : Entity_Id;
!                Agg_Comp : Entity_Id;
!                Comp_Nam : Node_Id := Empty;
!             begin
!                while Nkind (Par) not in N_Object_Declaration
!                                       | N_Assignment_Statement
!                loop
!                   if Nkind (Par) = N_Aggregate then
!                      Typ_Comp := First_Entity (Etype (Par));
!                      Agg_Comp := First (Expressions (Par));
!                      loop
!                         if No (Agg_Comp) then
!                            return;
!                         end if;
! 
!                         if Agg_Comp = Make_Expr then
!                            Comp_Nam :=
!                              Make_Selected_Component (Loc,
!                                Prefix => Empty,
!                                Selector_Name =>
!                                  New_Occurrence_Of (Typ_Comp, Loc));
! 
!                            Make_Expr := Parent (Make_Expr);
!                            Par       := Parent (Par);
!                            exit;
!                         end if;
! 
!                         Next_Entity (Typ_Comp);
!                         Next (Agg_Comp);
!                      end loop;
!                   elsif Nkind (Par) = N_Component_Association then
!                      Comp_Nam :=
!                        Make_Selected_Component (Loc,
!                          Prefix => Empty,
!                          Selector_Name =>
!                            Make_Identifier (Loc,
!                              (Chars (First (Choices (Par))))));
! 
!                      Make_Expr := Parent (Parent (Make_Expr));
!                      Par       := Parent (Parent (Par));
!                   else
!                      declare
!                         Temp : constant Entity_Id :=
!                           Make_Temporary (Loc, 'T', N);
!                      begin
!                         Rewrite (N,
!                           Make_Expression_With_Actions (Loc,
!                             Actions => New_List (
!                               Make_Object_Declaration (Loc,
!                                 Defining_Identifier => Temp,
!                                 Object_Definition   =>
!                                   New_Occurrence_Of (Typ, Loc),
!                                 Expression          =>
!                                   New_Copy_Tree (N))),
!                             Expression => New_Occurrence_Of (Temp, Loc)));
!                         Analyze_And_Resolve (N);
!                         return;
!                      end;
!                   end if;
! 
!                   if No (Curr_Nam) then
!                      Curr_Nam := Comp_Nam;
!                      Obj      := Curr_Nam;
!                   elsif Has_Prefix (Curr_Nam) then
!                      Set_Prefix (Curr_Nam, Comp_Nam);
!                      Curr_Nam := Comp_Nam;
!                   end if;
!                end loop;
! 
!                Base_Obj := (case Nkind (Par) is
!                               when N_Assignment_Statement =>
!                                  New_Copy_Tree (Name (Par)),
!                               when N_Object_Declaration =>
!                                  New_Occurrence_Of
!                                    (Defining_Identifier (Par), Loc),
!                               when others => (raise Program_Error));
  
!                if Present (Curr_Nam) then
!                   Set_Prefix (Curr_Nam, Base_Obj);
!                else
!                   Obj := Base_Obj;
!                end if;
!             end;
  
!             Prepend_To (Params, Obj);
  
!             --  Find the constructor we are interested in by doing a
!             --  pseudo-pass to resolve the constructor call.
  
              declare
!                Dummy_Params : List_Id := New_Copy_List (Expressions (N));
!                Dummy_Self   : Node_Id;
!                Dummy_Block  : Node_Id;
!                Dummy_Call   : Node_Id;
!                Dummy_Id     : Entity_Id := Make_Temporary (Loc, 'D', N);
              begin
!                if Is_Empty_List (Dummy_Params) then
!                   Dummy_Params := New_List;
!                end if;
! 
!                Dummy_Self := Make_Object_Declaration (Loc,
!                                Defining_Identifier => Dummy_Id,
!                                Object_Definition   =>
!                                   New_Occurrence_Of (Typ, Loc));
!                Prepend_To (Dummy_Params, New_Occurrence_Of (Dummy_Id, Loc));
! 
!                Dummy_Call := Make_Procedure_Call_Statement (Loc,
!                                Parameter_Associations => Dummy_Params,
!                                Name                   =>
!                                  (if not Has_Prefix (Pref) then
!                                      Make_Identifier (Loc,
!                                        Chars (Constructor_Name (Typ)))
!                                   else
!                                      Make_Expanded_Name (Loc,
!                                        Chars =>
!                                          Chars (Constructor_Name (Typ)),
!                                        Prefix =>
!                                          New_Copy_Tree (Prefix (Pref)),
!                                        Selector_Name =>
!                                          Make_Identifier (Loc,
!                                           Chars (Constructor_Name (Typ))))));
!                Set_Is_Expanded_Constructor_Call (Dummy_Call, True);
! 
!                Dummy_Block := Make_Block_Statement (Loc,
!                                 Declarations => New_List (Dummy_Self),
!                                 Handled_Statement_Sequence =>
!                                   Make_Handled_Sequence_Of_Statements (Loc,
!                                     Statements => New_List (Dummy_Call)));
! 
!                Expander_Active := False;
! 
!                Insert_After_And_Analyze
!                  (Enclosing_Declaration_Or_Statement (Par), Dummy_Block);
! 
!                Expander_Active := True;
! 
!                --  Finally, we can get the constructor based on our pseudo-pass
! 
!                Construct := Entity (Name (Dummy_Call));
! 
!                --  Replace the Typ'Make attribute with an aggregate featuring
!                --  then relevant aggregate from the correct constructor's
!                --  Inializeaspect if it is present - otherwise, simply use a
!                --  box.
! 
!                if Has_Aspect (Construct, Aspect_Initialize) then
!                   Rewrite (N,
!                     New_Copy_Tree
!                       (Find_Value_Of_Aspect (Construct, Aspect_Initialize)));
! 
!                   Param  := Next (First (Params));
!                   Formal := Next_Entity (First_Entity (Construct));
!                   while Present (Param) loop
!                      if Nkind (Param) = N_Parameter_Association then
!                         Formal := Selector_Name (Param);
!                         Replace_Expr := Explicit_Actual_Parameter (Param);
!                      else
!                         Replace_Expr := Param;
!                      end if;
! 
!                      Init_Param := First (Component_Associations (N));
!                      while Present (Init_Param) loop
!                         Search_And_Replace_Formal (Expression (Init_Param));
! 
!                         Next (Init_Param);
!                      end loop;
! 
!                      if Nkind (Param) /= N_Parameter_Association then
!                         Next_Entity (Formal);
!                      end if;
!                      Next (Param);
!                   end loop;
! 
!                   Init_Param := First (Component_Associations (N));
!                   while Present (Init_Param) loop
!                      if Nkind (Expression (Init_Param)) = N_Attribute_Reference
!                        and then Attribute_Name
!                                   (Expression (Init_Param)) = Name_Make
!                      then
!                         Insert_After (Par,
!                           Make_Assignment_Statement (Loc,
!                             Name       =>
!                               Make_Selected_Component (Loc,
!                                 Prefix =>
!                                   New_Copy_Tree (First (Params)),
!                                 Selector_Name =>
!                                   Make_Identifier (Loc,
!                                     Chars (First (Choices (Init_Param))))),
!                             Expression =>
!                               New_Copy_Tree (Expression (Init_Param))));
! 
!                         Rewrite (Expression (Init_Param),
!                           Make_Aggregate (Loc,
!                             Expressions            => New_List,
!                             Component_Associations => New_List (
!                               Make_Component_Association (Loc,
!                                 Choices     =>
!                                   New_List (Make_Others_Choice (Loc)),
!                                 Expression  => Empty,
!                                 Box_Present => True))));
!                      end if;
! 
!                      Next (Init_Param);
!                   end loop;
!                else
!                   Rewrite (N,
!                     Make_Aggregate (Loc,
!                       Expressions            => New_List,
!                       Component_Associations => New_List (
!                         Make_Component_Association (Loc,
!                           Choices     => New_List (Make_Others_Choice (Loc)),
!                           Expression  => Empty,
!                           Box_Present => True))));
!                end if;
! 
!                --  Rewrite this block to be null and pretend it didn't happen
  
!                Rewrite (Dummy_Block, Make_Null_Statement (Loc));
              end;
  
!             Analyze_And_Resolve (N, Typ);
! 
!             --  Finally, insert the constructor call
  
!             Construct_Call :=
!               Make_Procedure_Call_Statement (Loc,
!                 Name                   =>
!                   New_Occurrence_Of (Construct, Loc),
!                 Parameter_Associations => Params);
  
!             Set_Is_Expanded_Constructor_Call (Construct_Call);
!             Insert_After (Par, Construct_Call);
           end;
  
        --------------
        -- Mantissa --
        --------------
--- 5112,5168 ----
  
        when Attribute_Make =>
           declare
!             Constructor_Params : List_Id := New_Copy_List (Expressions (N));
!             Constructor_Call   : Node_Id;
!             Constructor_EWA    : Node_Id;
!             Result_Decl        : Node_Id;
!             Result_Id          : constant Entity_Id :=
!               Make_Temporary (Loc, 'D', N);
           begin
!             if Is_Empty_List (Constructor_Params) then
!                Constructor_Params := New_List;
              end if;
  
!             Result_Decl := Make_Object_Declaration (Loc,
!                              Defining_Identifier => Result_Id,
!                              Object_Definition   =>
!                                New_Occurrence_Of (Typ, Loc));
  
!             --  Suppress default initialization for result object.
!             --  Default init (except for tag, if tagged) will instead be
!             --  performed in the constructor procedure.
  
!             Mutate_Ekind (Result_Id, E_Variable);
!             Set_Suppress_Initialization (Result_Id);
  
!             --  Build a prefixed-notation call
  
              declare
!                Proc_Name : constant Node_Id :=
!                  Make_Selected_Component (Loc,
!                    Prefix        => New_Occurrence_Of (Result_Id, Loc),
!                    Selector_Name => Make_Identifier (Loc,
!                                       Chars (Constructor_Name (Typ))));
              begin
!                Set_Is_Prefixed_Call (Proc_Name);
  
!                Constructor_Call := Make_Procedure_Call_Statement (Loc,
!                  Parameter_Associations => Constructor_Params,
!                  Name                   => Proc_Name);
              end;
  
!             Set_Is_Expanded_Constructor_Call (Constructor_Call, True);
  
!             Constructor_EWA :=
!               Make_Expression_With_Actions (Loc,
!                 Actions => New_List (Result_Decl, Constructor_Call),
!                 Expression => New_Occurrence_Of (Result_Id, Loc));
  
!             Rewrite (N, Constructor_EWA);
           end;
  
+          Analyze_And_Resolve (N, Typ);
+ 
        --------------
        -- Mantissa --
        --------------
*************** package body Exp_Attr is
*** 9854,9859 ****
--- 9600,9630 ----
        return Empty;
     end Get_Stream_Convert_Pragma;
  
+    ----------------------
+    -- Interunit_Ref_OK --
+    ----------------------
+ 
+    function Interunit_Ref_OK
+      (Subp_Unit, Attr_Ref_Unit : Node_Id) return Boolean is
+ 
+       function Unit_Is_Body_Or_Subunit (U : Node_Id) return Boolean is
+         (Is_Body (Unit (U)) or else Nkind (Unit (U)) = N_Subunit);
+    begin
+       if not In_Same_Extended_Unit (Subp_Unit, Attr_Ref_Unit) then
+          return False;
+ 
+       --  If subp declared in unit body, then we don't want to refer
+       --  to it from within unit spec so return False in that case.
+ 
+       elsif Unit_Is_Body_Or_Subunit (Subp_Unit)
+         and then not Unit_Is_Body_Or_Subunit (Attr_Ref_Unit)
+       then
+          return False;
+       end if;
+ 
+       return True;
+    end Interunit_Ref_OK;
+ 
     ---------------------------------
     -- Is_Constrained_Packed_Array --
     ---------------------------------
diff -Nrcpad gcc-16-20250914/gcc/ada/exp_ch3.adb gcc-16-20250921/gcc/ada/exp_ch3.adb
*** gcc-16-20250914/gcc/ada/exp_ch3.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/exp_ch3.adb	Sun Sep 21 22:32:34 2025
*************** with Sinfo.Nodes;    use Sinfo.Nodes;
*** 75,81 ****
  with Sinfo.Utils;    use Sinfo.Utils;
  with Stand;          use Stand;
  with Snames;         use Snames;
- with Tbuild;         use Tbuild;
  with Ttypes;         use Ttypes;
  with Validsw;        use Validsw;
  with Warnsw;         use Warnsw;
--- 75,80 ----
*************** package body Exp_Ch3 is
*** 211,242 ****
        --  component that requires late initialization; this includes
        --  components of ancestor types.
  
-       type Initialization_Mode is
-         (Full_Init, Full_Init_Except_Tag, Early_Init_Only, Late_Init_Only);
-       --  The initialization routine for a tagged type is passed in a
-       --  formal parameter of this type, indicating what initialization
-       --  is to be performed. This parameter defaults to Full_Init in all
-       --  cases except when the init proc of a type extension (let's call
-       --  that type T2) calls the init proc of its parent (let's call that
-       --  type T1). In that case, one of the other 3 values will
-       --  be passed in. In all three of those cases, the Tag component has
-       --  already been initialized before the call and is therefore not to be
-       --  modified. T2's init proc will either call T1's init proc
-       --  once (with Full_Init_Except_Tag as the parameter value) or twice
-       --  (first with Early_Init_Only, then later with Late_Init_Only),
-       --  depending on the result returned by Has_Late_Init_Component (T1).
-       --  In the latter case, the first call does not initialize any
-       --  components that require late initialization and the second call
-       --  then performs that deferred initialization.
-       --  Strictly speaking, the formal parameter subtype is actually Natural
-       --  but calls will only pass in values corresponding to literals
-       --  of this enumeration type.
- 
-       function Make_Mode_Literal
-         (Loc : Source_Ptr; Mode : Initialization_Mode) return Node_Id
-       is (Make_Integer_Literal (Loc, Initialization_Mode'Pos (Mode)));
-       --  Generate an integer literal for a given mode value.
- 
        function Tag_Init_Condition
          (Loc : Source_Ptr;
           Init_Control_Formal : Entity_Id) return Node_Id;
--- 210,215 ----
*************** package body Exp_Ch3 is
*** 2481,2494 ****
          and then Nkind (Id_Ref) = N_Selected_Component
          and then Chars (Selector_Name (Id_Ref)) = Name_uParent
        then
!          declare
!             use Initialization_Control;
!          begin
!             Append_To (Args,
!               (if Present (Init_Control_Actual)
!                then Init_Control_Actual
!                else Make_Mode_Literal (Loc, Full_Init_Except_Tag)));
!          end;
        elsif Present (Constructor_Ref) then
           Append_List_To (Args,
             New_Copy_List (Parameter_Associations (Constructor_Ref)));
--- 2454,2463 ----
          and then Nkind (Id_Ref) = N_Selected_Component
          and then Chars (Selector_Name (Id_Ref)) = Name_uParent
        then
!          Append_To (Args,
!            (if Present (Init_Control_Actual)
!             then Init_Control_Actual
!             else Make_Mode_Literal (Loc, Full_Init_Except_Tag)));
        elsif Present (Constructor_Ref) then
           Append_List_To (Args,
             New_Copy_List (Parameter_Associations (Constructor_Ref)));
*************** package body Exp_Ch3 is
*** 3216,3221 ****
--- 3185,3224 ----
           if Parent_Subtype_Renaming_Discrims then
              Append_List_To (Body_Stmts, Build_Init_Call_Thru (Parameters));
  
+          elsif Present (Constructor_Name (Rec_Type)) then
+             if Present (Default_Constructor (Rec_Type)) then
+                --  The 'Make attribute reference (with no arguments) will
+                --  generate a call to the one-parameter constructor procedure.
+ 
+                Append_To (Body_Stmts,
+                  Make_Assignment_Statement (Loc,
+                    Name       => New_Occurrence_Of
+                      (Defining_Identifier (First (Parameters)), Loc),
+                    Expression => Make_Attribute_Reference (Loc,
+                      Prefix         => New_Occurrence_Of (Rec_Type, Loc),
+                      Attribute_Name => Name_Make)));
+             else
+                --  No constructor procedure with an appropriate profile
+                --  is available, so raise Program_Error.
+                --
+                --  We could instead do nothing here, since the absence of a
+                --  one-parameter constructor procedure should trigger other
+                --  legality checks which should statically ensure that
+                --  the init proc we are constructing here will never be
+                --  called. So a bit of "belt and suspenders" here.
+                --  If this raise statement is ever executed, that probably
+                --  means that some compile-time legality check is not
+                --  implemented, and that the program should have instead
+                --  failed to compile.
+                --  Because this raise statement should never be executed, it
+                --  seems ok to pass in a dubious Reason parameter instead of
+                --  declaring a new RT_Exception_Code value.
+ 
+                Append_To (Body_Stmts,
+                           Make_Raise_Program_Error (Loc,
+                             Reason => PE_Explicit_Raise));
+             end if;
+ 
           elsif Nkind (Type_Definition (N)) = N_Record_Definition then
              Build_Discriminant_Assignments (Body_Stmts);
  
*************** package body Exp_Ch3 is
*** 3310,3316 ****
              end if;
           end if;
  
!          --  Add here the assignment to instantiate the Tag
  
           --  The assignment corresponds to the code:
  
--- 3313,3319 ----
              end if;
           end if;
  
!          --  Add here the assignment to initialize the Tag
  
           --  The assignment corresponds to the code:
  
*************** package body Exp_Ch3 is
*** 4170,4176 ****
           if Present (Parent_Id) then
              declare
                 Parent_Loc : constant Source_Ptr := Sloc (Parent (Parent_Id));
-                use Initialization_Control;
              begin
                 --  We are building the init proc for a type extension.
                 --  Call the parent type's init proc a second time, this
--- 4173,4178 ----
*************** package body Exp_Ch3 is
*** 4558,4563 ****
--- 4560,4567 ----
           --     since the call is generated, there had better be a routine
           --     at the other end of the call, even if it does nothing).
  
+          --  10. The type has a specified Constructor aspect.
+ 
           --  Note: the reason we exclude the CPP_Class case is because in this
           --  case the initialization is performed by the C++ constructors, and
           --  the IP is built by Set_CPP_Constructors.
*************** package body Exp_Ch3 is
*** 4573,4578 ****
--- 4577,4583 ----
             or else Is_Tagged_Type (Rec_Id)
             or else Is_Concurrent_Record_Type (Rec_Id)
             or else Has_Task (Rec_Id)
+            or else Present (Constructor_Name (Rec_Id))
           then
              return True;
           end if;
diff -Nrcpad gcc-16-20250914/gcc/ada/exp_ch3.ads gcc-16-20250921/gcc/ada/exp_ch3.ads
*** gcc-16-20250914/gcc/ada/exp_ch3.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/exp_ch3.ads	Sun Sep 21 22:32:34 2025
***************
*** 27,32 ****
--- 27,33 ----
  
  with Elists;  use Elists;
  with Exp_Tss; use Exp_Tss;
+ with Tbuild;  use Tbuild;
  with Types;   use Types;
  with Uintp;   use Uintp;
  
*************** package Exp_Ch3 is
*** 194,199 ****
--- 195,226 ----
     --  initialized; if Variable_Comps is True then tags components located at
     --  variable positions of Target are initialized.
  
+    type Initialization_Mode is
+      (Full_Init, Full_Init_Except_Tag, Early_Init_Only, Late_Init_Only);
+    --  The initialization routine for a tagged type is passed in a
+    --  formal parameter of this type, indicating what initialization
+    --  is to be performed. This parameter defaults to Full_Init in all
+    --  cases except when the init proc of a type extension (let's call
+    --  that type T2) calls the init proc of its parent (let's call that
+    --  type T1). In that case, one of the other 3 values will
+    --  be passed in. In all three of those cases, the Tag component has
+    --  already been initialized before the call and is therefore not to be
+    --  modified. T2's init proc will either call T1's init proc
+    --  once (with Full_Init_Except_Tag as the parameter value) or twice
+    --  (first with Early_Init_Only, then later with Late_Init_Only),
+    --  depending on the result returned by Has_Late_Init_Component (T1).
+    --  In the latter case, the first call does not initialize any
+    --  components that require late initialization and the second call
+    --  then performs that deferred initialization.
+    --  Strictly speaking, the formal parameter subtype is actually Natural
+    --  but calls will only pass in values corresponding to literals
+    --  of this enumeration type.
+ 
+    function Make_Mode_Literal
+      (Loc : Source_Ptr; Mode : Initialization_Mode) return Node_Id
+    is (Make_Integer_Literal (Loc, Initialization_Mode'Pos (Mode)));
+    --  Generate an integer literal for a given mode value.
+ 
     procedure Make_Controlling_Function_Wrappers
       (Tag_Typ   : Entity_Id;
        Decl_List : out List_Id;
diff -Nrcpad gcc-16-20250914/gcc/ada/exp_ch4.adb gcc-16-20250921/gcc/ada/exp_ch4.adb
*** gcc-16-20250914/gcc/ada/exp_ch4.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/exp_ch4.adb	Sun Sep 21 22:32:34 2025
*************** package body Exp_Ch4 is
*** 5198,5204 ****
  
        if not Expansion_Delayed (N) then
           declare
!             Uncond_Par : constant Node_Id := Unconditional_Parent (N);
           begin
              if Nkind (Uncond_Par) = N_Simple_Return_Statement
                or else Is_Optimizable_Declaration (Uncond_Par)
--- 5198,5205 ----
  
        if not Expansion_Delayed (N) then
           declare
!             Uncond_Par : constant Node_Id :=
!                            Unqualified_Unconditional_Parent (N);
           begin
              if Nkind (Uncond_Par) = N_Simple_Return_Statement
                or else Is_Optimizable_Declaration (Uncond_Par)
*************** package body Exp_Ch4 is
*** 5807,5813 ****
  
        if not Expansion_Delayed (N) then
           declare
!             Uncond_Par : constant Node_Id := Unconditional_Parent (N);
           begin
              if Nkind (Uncond_Par) = N_Simple_Return_Statement
                or else Is_Optimizable_Declaration (Uncond_Par)
--- 5808,5815 ----
  
        if not Expansion_Delayed (N) then
           declare
!             Uncond_Par : constant Node_Id :=
!                            Unqualified_Unconditional_Parent (N);
           begin
              if Nkind (Uncond_Par) = N_Simple_Return_Statement
                or else Is_Optimizable_Declaration (Uncond_Par)
diff -Nrcpad gcc-16-20250914/gcc/ada/exp_ch6.adb gcc-16-20250921/gcc/ada/exp_ch6.adb
*** gcc-16-20250914/gcc/ada/exp_ch6.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/exp_ch6.adb	Sun Sep 21 22:32:34 2025
*************** package body Exp_Ch6 is
*** 5793,5803 ****
     is
        Par        : constant Node_Id := Parent (N);
        Uncond_Par : constant Node_Id := Unconditional_Parent (N);
  
     begin
        --  Optimization: if the returned value is returned again, then no need
        --  to copy/readjust/finalize, we can just pass the value through (see
!       --  Expand_N_Simple_Return_Statement), and thus no attachment is needed.
        --  Note that simple return statements are distributed into conditional
        --  expressions, but we may be invoked before this distribution is done.
  
--- 5793,5806 ----
     is
        Par        : constant Node_Id := Parent (N);
        Uncond_Par : constant Node_Id := Unconditional_Parent (N);
+      --  Beware that a qualified expression around a function call cannot be
+      --  considered as transparent (like around an aggregate) because it may
+      --  cause a temporary to be created.
  
     begin
        --  Optimization: if the returned value is returned again, then no need
        --  to copy/readjust/finalize, we can just pass the value through (see
!       --  Expand_Simple_Function_Return), and thus no attachment is needed.
        --  Note that simple return statements are distributed into conditional
        --  expressions, but we may be invoked before this distribution is done.
  
*************** package body Exp_Ch6 is
*** 6244,6249 ****
--- 6247,6261 ----
        --  returns, since they get eliminated anyway later on. Spec_Id denotes
        --  the corresponding spec of the subprogram body.
  
+       procedure Prepend_Constructor_Procedure_Prologue
+         (Spec_Id : Entity_Id; Body_Id : Entity_Id; L : List_Id);
+ 
+       --  If N is the body of a constructor procedure (that is, a procedure
+       --  named in a Constructor aspect specification for the type of the
+       --  procedure's first parameter), then prepend and analyze the
+       --  associated initialization code for that parameter.
+       --  This has nothing to do with CPP constructors.
+ 
        ----------------
        -- Add_Return --
        ----------------
*************** package body Exp_Ch6 is
*** 6317,6322 ****
--- 6329,6628 ----
           end if;
        end Add_Return;
  
+       --------------------------------------------
+       -- Prepend_Constructor_Procedure_Prologue --
+       --------------------------------------------
+ 
+       procedure Prepend_Constructor_Procedure_Prologue
+         (Spec_Id : Entity_Id; Body_Id : Entity_Id; L : List_Id)
+       is
+ 
+          function First_Param_Type return Entity_Id is
+            (Implementation_Base_Type (Etype (First_Formal (Spec_Id))));
+ 
+          Is_Constructor_Procedure : constant Boolean :=
+            Nkind (Specification (N)) = N_Procedure_Specification
+              and then Present (First_Formal (Spec_Id))
+              and then Present (Constructor_Name (First_Param_Type))
+              and then Chars (Spec_Id) = Chars (Constructor_Name
+                                                  (First_Param_Type))
+              and then Ekind (First_Formal (Spec_Id)) = E_In_Out_Parameter
+              and then Scope (Spec_Id) = Scope (First_Param_Type);
+       begin
+          if not Is_Constructor_Procedure then
+             return; -- the usual case
+          end if;
+ 
+          --  Initialize the first parameter.
+          --  First_Param_Type is a record type (tagged or untagged) or
+          --  a type extension. If it is a type extension, then we begin by
+          --  calling the appropriate constructor procedure for the _parent
+          --  part. In the absence of a Super aspect specification, the
+          --  "appropriate" constructor is the one that takes only a single
+          --  parameter (the object being initialized). Additional actual
+          --  parameters for the constructor call may be provided via a
+          --  Super aspect specification, in which case a different
+          --  constructor procedure will be invoked.
+          --
+          --  For each remaining component we first check to see if it
+          --  is mentioned in the Initialize aspect specification (if any) for
+          --  Body_Id. If so, then evaluate the expression given for that
+          --  component in the aspect specification and assign it to the
+          --  given component of the first parameter. If not, and if an
+          --  explicit default initial value is provided for the given component
+          --  in the type declaration, then do the same thing with that
+          --  expression instead. Otherwise perform normal default
+          --  initialization for the component - invoke the init proc for the
+          --  component's type if one exists, and otherwise do nothing.
+ 
+          --  We do not perform tag initialization here. That is dealt with
+          --  elsewhere. The init proc for a tagged type is
+          --  passed an extra parameter indicating whether to perform
+          --  tag initialization.
+ 
+          --  In the case of a type (tagged or untagged) that is not
+          --  an extension, we could just generate a single assignment,
+          --  taking the RHS from the Initialize aspect value (which is an
+          --  N_Aggregate node). But that gets complicated in the case of
+          --  an extension, so we handle all cases one component at a time.
+ 
+          declare
+             Initialize_Aspect : constant Node_Id :=
+               Find_Aspect (Body_Id, Aspect_Initialize);
+ 
+             First_Initialize_Comp_Assoc : constant Node_Id :=
+               (if Present (Initialize_Aspect)
+                then First (Component_Associations
+                              (Expression (Initialize_Aspect)))
+                else Empty);
+ 
+             Component : Entity_Id := First_Entity (First_Param_Type);
+             Init_List : constant List_Id := New_List;
+ 
+             function Init_Expression_If_Any (Component : Entity_Id)
+               return Node_Id;
+             --  If the given component is mentioned in the Initialize
+             --  aspect for the constructor procedure, then return the
+             --  initial value expression specified there.
+             --  Otherwise, if the component declaration includes an
+             --  initial value expression, then return that expression.
+             --  Otherwise, return Empty.
+ 
+             function Make_Init_Proc_Call (Component      : Entity_Id;
+                                           Component_Name : Node_Id)
+               return Node_Id;
+             --  Builds and returns a call to the init proc for the type of
+             --  the component in order to initialize the given component.
+             --  The init proc must exist.
+ 
+             function Make_Parent_Constructor_Call (Parent_Type : Entity_Id)
+               return Node_Id;
+             --  Builds and returns a call to the appropriate constructor
+             --  procedure of the parent type.
+             --  This function is called only in the case of a
+             --  Constructor procedure for a type extension.
+ 
+             ----------------------------
+             -- Init_Expression_If_Any --
+             ----------------------------
+ 
+             function Init_Expression_If_Any (Component : Entity_Id)
+               return Node_Id
+             is
+                Initialize_Comp_Assoc : Node_Id := First_Initialize_Comp_Assoc;
+                Choice : Node_Id;
+ 
+                --  ??? Technically, this is quadratic (linear search called
+                --  a linear number of times). When/if we see performance
+                --  problems with hundreds of components mentioned in one
+                --  Initialize aspect specification, we can revisit this.
+             begin
+                while Present (Initialize_Comp_Assoc) loop
+                   Choice := First (Choices (Initialize_Comp_Assoc));
+ 
+                   while Present (Choice) loop
+                      if Nkind (Choice) = N_Identifier
+                        and then Chars (Choice) = Chars (Component)
+                      then
+                         return Expression (Initialize_Comp_Assoc);
+                      end if;
+                      Next (Choice);
+                   end loop;
+ 
+                   Next (Initialize_Comp_Assoc);
+                end loop;
+ 
+                if Present (Expression (Parent (Component))) then
+                   return Expression (Parent (Component));
+                end if;
+ 
+                return Empty;
+             end Init_Expression_If_Any;
+ 
+             -------------------------
+             -- Make_Init_Proc_Call --
+             -------------------------
+ 
+             function Make_Init_Proc_Call (Component      : Entity_Id;
+                                           Component_Name : Node_Id)
+               return Node_Id
+             is
+                Params    : constant List_Id := New_List (Component_Name);
+                Init_Proc : constant Entity_Id :=
+                  Base_Init_Proc (Etype (Component));
+             begin
+                if Is_Tagged_Type (Etype (Component)) then
+                   Append (Make_Mode_Literal (Loc, Full_Init), Params);
+                end if;
+ 
+                return Init_Proc_Call : constant Node_Id :=
+                  Make_Procedure_Call_Statement (Loc,
+                    Name => New_Occurrence_Of (Init_Proc, Loc),
+                    Parameter_Associations => Params)
+                do
+                   pragma Assert (Check_Number_Of_Actuals
+                                    (Subp_Call => Init_Proc_Call,
+                                     Subp_Id   => Init_Proc));
+                end return;
+             end Make_Init_Proc_Call;
+ 
+             ----------------------------------
+             -- Make_Parent_Constructor_Call --
+             ----------------------------------
+ 
+             function Make_Parent_Constructor_Call (Parent_Type : Entity_Id)
+               return Node_Id
+             is
+                Actual_Parameters : List_Id := No_List;
+                Super_Aspect      : constant Node_Id :=
+                  Find_Aspect (Body_Id, Aspect_Super);
+ 
+                --  Do not confuse the Super aspect with the Super attribute.
+                --  Both are referenced here, but they are not related as
+                --  closely as some aspect/attribute homonym pairs are.
+                --  The attribute takes an object as a prefix. The aspect
+                --  can be specified for the body of a constructor procedure.
+             begin
+                if Present (Super_Aspect) then
+                   declare
+                      Super_Expr : constant Node_Id :=
+                        Expression (Super_Aspect);
+                      Expr       : Node_Id;
+                   begin
+                      if Nkind (Super_Expr) /= N_Aggregate then
+                         Expr := New_Copy_Tree (Super_Expr);
+                         Set_Paren_Count (Expr, 0);
+                         Actual_Parameters := New_List (Expr);
+                      else
+                         --  Interpret this "aggregate" as a list of
+                         --  actual parameter expressions.
+ 
+                         Actual_Parameters := New_List;
+                         Expr := First (Expressions (Super_Expr));
+                         while Present (Expr) loop
+                            Append (New_Copy_Tree (Expr), Actual_Parameters);
+                            Next (Expr);
+                         end loop;
+                      end if;
+                   end;
+                end if;
+ 
+                --  Build a prefixed-notation call
+                declare
+                   Proc_Name : constant Node_Id :=
+                     Make_Selected_Component (Loc,
+                       Prefix        =>
+                         Make_Attribute_Reference (Loc,
+                           Prefix         => New_Occurrence_Of
+                                               (First_Formal (Spec_Id), Loc),
+                           Attribute_Name => Name_Super),
+                       Selector_Name =>
+                         Make_Identifier (Loc,
+                           Chars (Constructor_Name (Parent_Type))));
+                begin
+                   Set_Is_Prefixed_Call (Proc_Name);
+ 
+                   return Make_Procedure_Call_Statement (Loc,
+                            Name                   => Proc_Name,
+                            Parameter_Associations => Actual_Parameters);
+                end;
+             end Make_Parent_Constructor_Call;
+ 
+          begin
+             while Present (Component) loop
+                pragma Assert (Ekind (Component) = E_Component);
+ 
+                if Chars (Component) = Name_uTag then
+                   null;
+ 
+                elsif Chars (Component) = Name_uParent then
+                   --  ??? Here is where we should be looking for a
+                   --  Super aspect specification in order to call the
+                   --  right constructor with the right parameters
+                   --  (as opposed to unconditionally calling the
+                   --  single-parameter constructor).
+                   Append_To (Init_List, Make_Parent_Constructor_Call
+                                           (Parent_Type => Etype (Component)));
+ 
+                else
+                   declare
+                      Maybe_Init_Exp : constant Node_Id :=
+                        Init_Expression_If_Any (Component);
+ 
+                      function Make_Component_Name return Node_Id is
+                        (Make_Selected_Component (Loc,
+                           Prefix        =>
+                             New_Occurrence_Of (First_Formal (Spec_Id), Loc),
+                           Selector_Name =>
+                             Make_Identifier (Loc, Chars (Component))));
+                   begin
+                      --  Handle case where initial value for this component
+                      --  is specified either in an Initialize aspect
+                      --  specification or as part of the component declaration.
+ 
+                      if Present (Maybe_Init_Exp) then
+                         --  ??? Should reorganize things so that
+                         --  procedure Build_Assignment in exp_ch3.adb
+                         --  (which is currently declared inside of
+                         --  Build_Record_Init_Proc) can be called from here.
+                         --  That procedure handles some corner cases
+                         --  that are not properly handled here (e.g.,
+                         --  mapping current instance references to the
+                         --  appropriate formal parameter).
+ 
+                         if Is_Tagged_Type (Etype (Component)) then
+                            Append_To (Init_List,
+                              Make_Tag_Assignment_From_Type (Loc,
+                                Target => Make_Component_Name,
+                                Typ => Etype (Component)));
+                         end if;
+ 
+                         Append_To (Init_List,
+                           Make_Assignment_Statement (Loc,
+                             Name       => Make_Component_Name,
+                             Expression => New_Copy_Tree
+                                             (Maybe_Init_Exp,
+                                              New_Scope => Body_Id)));
+ 
+                      --  Handle case where component's type has an init proc
+                      elsif Has_Non_Null_Base_Init_Proc (Etype (Component)) then
+                         Append_To (Init_List,
+                                    Make_Init_Proc_Call (
+                                     Component      => Component,
+                                     Component_Name => Make_Component_Name));
+                      else
+                         pragma Assert (not Is_Tagged_Type (Etype (Component)));
+                      end if;
+                   end;
+                end if;
+ 
+                Next_Entity (Component);
+             end loop;
+ 
+             Insert_List_Before_And_Analyze (First (L), Init_List);
+          end;
+       end Prepend_Constructor_Procedure_Prologue;
+ 
        --  Local variables
  
        Except_H : Node_Id;
*************** package body Exp_Ch6 is
*** 6549,6554 ****
--- 6855,6866 ----
           Detect_Infinite_Recursion (N, Spec_Id);
        end if;
  
+       --  If the subprogram is a constructor procedure then prepend
+       --  and analyze initialization code.
+ 
+       Prepend_Constructor_Procedure_Prologue
+         (Spec_Id => Spec_Id, Body_Id => Body_Id, L => L);
+ 
        --  Set to encode entity names in package body before gigi is called
  
        Qualify_Entity_Names (N);
diff -Nrcpad gcc-16-20250914/gcc/ada/exp_put_image.adb gcc-16-20250921/gcc/ada/exp_put_image.adb
*** gcc-16-20250914/gcc/ada/exp_put_image.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/exp_put_image.adb	Sun Sep 21 22:32:34 2025
*************** package body Exp_Put_Image is
*** 363,368 ****
--- 363,371 ----
              Lib_RE := RE_Put_Image_Access_Prot_Subp;
           elsif Is_Access_Subprogram_Type (Base_Type (U_Type)) then
              Lib_RE := RE_Put_Image_Access_Subp;
+          elsif Is_Extended_Access_Type (Base_Type (U_Type)) then
+             pragma Assert (No (P_Size));
+             Lib_RE := RE_Put_Image_Extended_Access_Pointer;
           elsif P_Size = System_Address_Size then
              Lib_RE := RE_Put_Image_Thin_Pointer;
           else
diff -Nrcpad gcc-16-20250914/gcc/ada/exp_strm.adb gcc-16-20250921/gcc/ada/exp_strm.adb
*** gcc-16-20250914/gcc/ada/exp_strm.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/exp_strm.adb	Sun Sep 21 22:32:34 2025
*************** with Mutably_Tagged; use Mutably_Tagged;
*** 33,39 ****
  with Namet;          use Namet;
  with Nlists;         use Nlists;
  with Nmake;          use Nmake;
- with Rtsfind;        use Rtsfind;
  with Sem_Aux;        use Sem_Aux;
  with Sem_Util;       use Sem_Util;
  with Sinfo;          use Sinfo;
--- 33,38 ----
*************** with Snames;         use Snames;
*** 43,49 ****
  with Stand;          use Stand;
  with Tbuild;         use Tbuild;
  with Ttypes;         use Ttypes;
- with Uintp;          use Uintp;
  
  package body Exp_Strm is
  
--- 42,47 ----
*************** package body Exp_Strm is
*** 82,94 ****
     --  Decls and Stms are the declarations and statements for the body and
     --  The parameter Fnam is the name of the constructed function.
  
!    function Has_Stream_Standard_Rep (U_Type : Entity_Id) return Boolean;
!    --  This function is used to test the type U_Type, to determine if it has
!    --  a standard representation from a streaming point of view. Standard means
!    --  that it has a standard representation (e.g. no enumeration rep clause),
!    --  and the size of the root type is the same as the streaming size (which
!    --  is defined as value specified by a Stream_Size clause if present, or
!    --  the Esize of U_Type if not).
  
     function Make_Stream_Subprogram_Name
       (Loc : Source_Ptr;
--- 80,92 ----
     --  Decls and Stms are the declarations and statements for the body and
     --  The parameter Fnam is the name of the constructed function.
  
!    function Is_Stream_Standard_Rep
!      (U_Type : Entity_Id; S_Size : Uint) return Boolean;
!    --  This function is used to test the type U_Type, to determine whether it
!    --  would have a standard representation from a streaming point of view if
!    --  its Stream_Size attribute was set to S_Size. Standard means that it has
!    --  a standard representation (e.g. no enumeration rep clause), and the size
!    --  of the root type is the same as the stream size.
  
     function Make_Stream_Subprogram_Name
       (Loc : Source_Ptr;
*************** package body Exp_Strm is
*** 436,486 ****
        Build_Array_Read_Write_Procedure (Typ, Decl, Pnam, Name_Write);
     end Build_Array_Write_Procedure;
  
!    ---------------------------------
!    -- Build_Elementary_Input_Call --
!    ---------------------------------
! 
!    function Build_Elementary_Input_Call (N : Node_Id) return Node_Id is
!       Loc     : constant Source_Ptr := Sloc (N);
!       P_Type  : constant Entity_Id  := Entity (Prefix (N));
!       U_Type  : constant Entity_Id  := Underlying_Type (P_Type);
!       Rt_Type : constant Entity_Id  := Root_Type (U_Type);
!       FST     : constant Entity_Id  := First_Subtype (U_Type);
!       Strm    : constant Node_Id    := First (Expressions (N));
!       Targ    : constant Node_Id    := Next (Strm);
!       P_Size  : constant Uint       := Get_Stream_Size (FST);
!       Res     : Node_Id;
!       Lib_RE  : RE_Id;
! 
!    begin
!       --  Check first for Boolean and Character. These are enumeration types,
!       --  but we treat them specially, since they may require special handling
!       --  in the transfer protocol. However, this special handling only applies
!       --  if they have standard representation, otherwise they are treated like
!       --  any other enumeration type.
  
!       if Rt_Type = Standard_Boolean
!         and then Has_Stream_Standard_Rep (U_Type)
!       then
!          Lib_RE := RE_I_B;
  
!       elsif Rt_Type = Standard_Character
!         and then Has_Stream_Standard_Rep (U_Type)
!       then
!          Lib_RE := RE_I_C;
  
!       elsif Rt_Type = Standard_Wide_Character
!         and then Has_Stream_Standard_Rep (U_Type)
!       then
!          Lib_RE := RE_I_WC;
  
!       elsif Rt_Type = Standard_Wide_Wide_Character
!         and then Has_Stream_Standard_Rep (U_Type)
        then
!          Lib_RE := RE_I_WWC;
! 
!       --  Floating point types
! 
        elsif Is_Floating_Point_Type (U_Type) then
  
           --  Question: should we use P_Size or Rt_Type to distinguish between
--- 434,472 ----
        Build_Array_Read_Write_Procedure (Typ, Decl, Pnam, Name_Write);
     end Build_Array_Write_Procedure;
  
!    function Get_Primitives
!      (P_Type : Entity_Id; P_Size : Uint) return Primitive_Result
!    is
  
!       function Prims (Input, Write : RE_Id) return Primitive_Result;
!       function Prims (Input, Write : RE_Id) return Primitive_Result is
!       begin
!          return (Primitives, 0, Input, Write);
!       end Prims;
  
!       function PSizes (L : Sizes) return Primitive_Result;
!       function PSizes (L : Sizes) return Primitive_Result is
!       begin
!          return (Possible_Sizes, L'Length, L);
!       end PSizes;
  
!       U_Type  : constant Entity_Id := Underlying_Type (P_Type);
!       FST     : constant Entity_Id := First_Subtype (U_Type);
!       Rt_Type : constant Entity_Id := Root_Type (U_Type);
  
!       Rep_Is_Standard : constant Boolean :=
!         Known_RM_Size (U_Type)
!         and then Is_Stream_Standard_Rep (U_Type, P_Size);
!    begin
!       if Rt_Type = Standard_Boolean and then Rep_Is_Standard then
!          return Prims (RE_I_B, RE_W_B);
!       elsif Rt_Type = Standard_Character and then Rep_Is_Standard then
!          return Prims (RE_I_C, RE_W_C);
!       elsif Rt_Type = Standard_Wide_Character and then Rep_Is_Standard then
!          return Prims (RE_I_WC, RE_W_WC);
!       elsif Rt_Type = Standard_Wide_Wide_Character and then Rep_Is_Standard
        then
!          return Prims (RE_I_WWC, RE_W_WWC);
        elsif Is_Floating_Point_Type (U_Type) then
  
           --  Question: should we use P_Size or Rt_Type to distinguish between
*************** package body Exp_Strm is
*** 500,522 ****
           --  To deal with these two requirements we add the special checks
           --  on equal sizes and use the root type to distinguish.
  
!          if P_Size <= Standard_Short_Float_Size
             and then (Standard_Short_Float_Size /= Standard_Float_Size
                       or else Rt_Type = Standard_Short_Float)
           then
!             Lib_RE := RE_I_SF;
  
!          elsif P_Size <= Standard_Float_Size then
!             Lib_RE := RE_I_F;
  
!          elsif P_Size <= Standard_Long_Float_Size
             and then (Standard_Long_Float_Size /= Standard_Long_Long_Float_Size
!                        or else Rt_Type = Standard_Long_Float)
           then
!             Lib_RE := RE_I_LF;
  
           else
!             Lib_RE := RE_I_LLF;
           end if;
  
        --  Signed integer types. Also includes signed fixed-point types and
--- 486,515 ----
           --  To deal with these two requirements we add the special checks
           --  on equal sizes and use the root type to distinguish.
  
!          if P_Size = Standard_Short_Float_Size
             and then (Standard_Short_Float_Size /= Standard_Float_Size
                       or else Rt_Type = Standard_Short_Float)
           then
!             return Prims (RE_I_SF, RE_W_SF);
  
!          elsif P_Size = Standard_Float_Size then
!             return Prims (RE_I_F, RE_W_F);
  
!          elsif P_Size = Standard_Long_Float_Size
             and then (Standard_Long_Float_Size /= Standard_Long_Long_Float_Size
!                      or else Rt_Type = Standard_Long_Float)
           then
!             return Prims (RE_I_LF, RE_W_LF);
  
+          elsif P_Size = Standard_Long_Long_Float_Size then
+             return Prims (RE_I_LLF, RE_W_LLF);
           else
!             return
!               PSizes
!                 ((Standard_Short_Float_Size,
!                   Standard_Float_Size,
!                   Standard_Long_Float_Size,
!                   Standard_Long_Long_Float_Size));
           end if;
  
        --  Signed integer types. Also includes signed fixed-point types and
*************** package body Exp_Strm is
*** 548,582 ****
          --  The following set of tests gets repeated many times, we should
          --  have an abstraction defined ???
  
!         and then
!           (Is_Fixed_Point_Type (U_Type)
!              or else
!            Is_Enumeration_Type (U_Type)
!              or else
!            (Is_Signed_Integer_Type (U_Type)
!               and then not Has_Biased_Representation (FST)))
  
        then
!          if P_Size <= Standard_Short_Short_Integer_Size then
!             Lib_RE := RE_I_SSI;
  
!          elsif P_Size <= Standard_Short_Integer_Size then
!             Lib_RE := RE_I_SI;
  
           elsif P_Size = 24 then
!             Lib_RE := RE_I_I24;
  
!          elsif P_Size <= Standard_Integer_Size then
!             Lib_RE := RE_I_I;
  
!          elsif P_Size <= Standard_Long_Integer_Size then
!             Lib_RE := RE_I_LI;
  
!          elsif P_Size <= Standard_Long_Long_Integer_Size then
!             Lib_RE := RE_I_LLI;
  
           else
!             Lib_RE := RE_I_LLLI;
           end if;
  
        --  Unsigned integer types, also includes unsigned fixed-point types
--- 541,582 ----
          --  The following set of tests gets repeated many times, we should
          --  have an abstraction defined ???
  
!         and then (Is_Fixed_Point_Type (U_Type)
!                   or else Is_Enumeration_Type (U_Type)
!                   or else (Is_Signed_Integer_Type (U_Type)
!                            and then not Has_Biased_Representation (FST)))
  
        then
!          if P_Size = Standard_Short_Short_Integer_Size then
!             return Prims (RE_I_SSI, RE_W_SSI);
  
!          elsif P_Size = Standard_Short_Integer_Size then
!             return Prims (RE_I_SI, RE_W_SI);
  
           elsif P_Size = 24 then
!             return Prims (RE_I_I24, RE_W_I24);
  
!          elsif P_Size = Standard_Integer_Size then
!             return Prims (RE_I_I, RE_W_I);
  
!          elsif P_Size = Standard_Long_Integer_Size then
!             return Prims (RE_I_LI, RE_W_LI);
  
!          elsif P_Size = Standard_Long_Long_Integer_Size then
!             return Prims (RE_I_LLI, RE_W_LLI);
  
+          elsif P_Size = Standard_Long_Long_Long_Integer_Size then
+             return Prims (RE_I_LLLI, RE_W_LLLI);
           else
!             return
!               PSizes
!                 ((Standard_Short_Short_Integer_Size,
!                   Standard_Short_Integer_Size,
!                   24,
!                   Standard_Integer_Size,
!                   Standard_Long_Integer_Size,
!                   Standard_Long_Long_Integer_Size,
!                   Standard_Long_Long_Long_Integer_Size));
           end if;
  
        --  Unsigned integer types, also includes unsigned fixed-point types
*************** package body Exp_Strm is
*** 586,626 ****
        --  Also includes signed integer types that are unsigned in the sense
        --  that they do not include negative numbers. See above for details.
  
!       elsif Is_Modular_Integer_Type    (U_Type)
!         or else Is_Fixed_Point_Type    (U_Type)
!         or else Is_Enumeration_Type    (U_Type)
          or else Is_Signed_Integer_Type (U_Type)
        then
!          if P_Size <= Standard_Short_Short_Integer_Size then
!             Lib_RE := RE_I_SSU;
  
!          elsif P_Size <= Standard_Short_Integer_Size then
!             Lib_RE := RE_I_SU;
  
           elsif P_Size = 24 then
!             Lib_RE := RE_I_U24;
  
!          elsif P_Size <= Standard_Integer_Size then
!             Lib_RE := RE_I_U;
  
!          elsif P_Size <= Standard_Long_Integer_Size then
!             Lib_RE := RE_I_LU;
  
!          elsif P_Size <= Standard_Long_Long_Integer_Size then
!             Lib_RE := RE_I_LLU;
  
           else
!             Lib_RE := RE_I_LLLU;
           end if;
  
        else pragma Assert (Is_Access_Type (U_Type));
           if Present (P_Size) and then P_Size > System_Address_Size then
!             Lib_RE := RE_I_AD;
           else
!             Lib_RE := RE_I_AS;
           end if;
        end if;
  
        --  Call the function, and do an unchecked conversion of the result
        --  to the actual type of the prefix. If the target is a discriminant,
        --  and we are in the body of the default implementation of a 'Read
--- 586,659 ----
        --  Also includes signed integer types that are unsigned in the sense
        --  that they do not include negative numbers. See above for details.
  
!       elsif Is_Modular_Integer_Type (U_Type)
!         or else Is_Fixed_Point_Type (U_Type)
!         or else Is_Enumeration_Type (U_Type)
          or else Is_Signed_Integer_Type (U_Type)
        then
!          if P_Size = Standard_Short_Short_Integer_Size then
!             return Prims (RE_I_SSU, RE_W_SSU);
  
!          elsif P_Size = Standard_Short_Integer_Size then
!             return Prims (RE_I_SU, RE_W_SU);
  
           elsif P_Size = 24 then
!             return Prims (RE_I_U24, RE_W_U24);
  
!          elsif P_Size = Standard_Integer_Size then
!             return Prims (RE_I_U, RE_W_U);
  
!          elsif P_Size = Standard_Long_Integer_Size then
!             return Prims (RE_I_LU, RE_W_LU);
  
!          elsif P_Size = Standard_Long_Long_Integer_Size then
!             return Prims (RE_I_LLU, RE_W_LLU);
! 
!          elsif P_Size = Standard_Long_Long_Long_Integer_Size then
!             return Prims (RE_I_LLLU, RE_W_LLLU);
  
           else
!             return
!               PSizes
!                 ((Standard_Short_Short_Integer_Size,
!                   Standard_Short_Integer_Size,
!                   24,
!                   Standard_Integer_Size,
!                   Standard_Long_Integer_Size,
!                   Standard_Long_Long_Integer_Size,
!                   Standard_Long_Long_Long_Integer_Size));
           end if;
  
        else pragma Assert (Is_Access_Type (U_Type));
           if Present (P_Size) and then P_Size > System_Address_Size then
!             return Prims (RE_I_AD, RE_W_AD);
           else
!             return Prims (RE_I_AS, RE_W_AS);
           end if;
        end if;
+    end Get_Primitives;
  
+    ---------------------------------
+    -- Build_Elementary_Input_Call --
+    ---------------------------------
+ 
+    function Build_Elementary_Input_Call (N : Node_Id) return Node_Id is
+       Loc     : constant Source_Ptr := Sloc (N);
+       P_Type  : constant Entity_Id  := Entity (Prefix (N));
+       U_Type  : constant Entity_Id  := Underlying_Type (P_Type);
+       FST     : constant Entity_Id  := First_Subtype (U_Type);
+       Strm    : constant Node_Id    := First (Expressions (N));
+       Targ    : constant Node_Id    := Next (Strm);
+       P_Size  : constant Uint       := Get_Stream_Size (FST);
+       Res     : Node_Id;
+ 
+       Prims : constant Primitive_Result := Get_Primitives (P_Type, P_Size);
+ 
+       Lib_RE : constant RE_Id :=
+         (case Prims.S is
+            when Primitives => Prims.Input,
+            when others => raise Program_Error);
+    begin
        --  Call the function, and do an unchecked conversion of the result
        --  to the actual type of the prefix. If the target is a discriminant,
        --  and we are in the body of the default implementation of a 'Read
*************** package body Exp_Strm is
*** 679,869 ****
  
     function Build_Elementary_Write_Call (N : Node_Id) return Node_Id is
        Loc     : constant Source_Ptr := Sloc (N);
!       P_Type  : constant Entity_Id  := Entity (Prefix (N));
!       U_Type  : constant Entity_Id  := Underlying_Type (P_Type);
!       Rt_Type : constant Entity_Id  := Root_Type (U_Type);
!       FST     : constant Entity_Id  := First_Subtype (U_Type);
!       Strm    : constant Node_Id    := First (Expressions (N));
!       Item    : constant Node_Id    := Next (Strm);
!       P_Size  : Uint;
!       Lib_RE  : RE_Id;
        Libent  : Entity_Id;
  
!    begin
!       --  Compute the size of the stream element. This is either the size of
!       --  the first subtype or if given the size of the Stream_Size attribute.
! 
!       if Has_Stream_Size_Clause (FST) then
!          P_Size := Static_Integer (Expression (Stream_Size_Clause (FST)));
!       else
!          P_Size := Esize (FST);
!       end if;
! 
!       --  Find the routine to be called
! 
!       --  Check for First Boolean and Character. These are enumeration types,
!       --  but we treat them specially, since they may require special handling
!       --  in the transfer protocol. However, this special handling only applies
!       --  if they have standard representation, otherwise they are treated like
!       --  any other enumeration type.
! 
!       if Rt_Type = Standard_Boolean
!         and then Has_Stream_Standard_Rep (U_Type)
!       then
!          Lib_RE := RE_W_B;
! 
!       elsif Rt_Type = Standard_Character
!         and then Has_Stream_Standard_Rep (U_Type)
!       then
!          Lib_RE := RE_W_C;
! 
!       elsif Rt_Type = Standard_Wide_Character
!         and then Has_Stream_Standard_Rep (U_Type)
!       then
!          Lib_RE := RE_W_WC;
! 
!       elsif Rt_Type = Standard_Wide_Wide_Character
!         and then Has_Stream_Standard_Rep (U_Type)
!       then
!          Lib_RE := RE_W_WWC;
! 
!       --  Floating point types
! 
!       elsif Is_Floating_Point_Type (U_Type) then
! 
!          --  Question: should we use P_Size or Rt_Type to distinguish between
!          --  possible floating point types? If a non-standard size or a stream
!          --  size is specified, then we should certainly use the size. But if
!          --  we have two types the same (notably Short_Float_Size = Float_Size
!          --  which is close to universally true, and Long_Long_Float_Size =
!          --  Long_Float_Size, true on most targets except the x86), then we
!          --  would really rather use the root type, so that if people want to
!          --  fiddle with System.Stream_Attributes to get inter-target portable
!          --  streams, they get the size they expect. Consider in particular the
!          --  case of a stream written on an x86, with 96-bit Long_Long_Float
!          --  being read into a non-x86 target with 64 bit Long_Long_Float. A
!          --  special version of System.Stream_Attributes can deal with this
!          --  provided the proper type is always used.
! 
!          --  To deal with these two requirements we add the special checks
!          --  on equal sizes and use the root type to distinguish.
! 
!          if P_Size <= Standard_Short_Float_Size
!            and then (Standard_Short_Float_Size /= Standard_Float_Size
!                       or else Rt_Type = Standard_Short_Float)
!          then
!             Lib_RE := RE_W_SF;
! 
!          elsif P_Size <= Standard_Float_Size then
!             Lib_RE := RE_W_F;
! 
!          elsif P_Size <= Standard_Long_Float_Size
!            and then (Standard_Long_Float_Size /= Standard_Long_Long_Float_Size
!                       or else Rt_Type = Standard_Long_Float)
!          then
!             Lib_RE := RE_W_LF;
! 
!          else
!             Lib_RE := RE_W_LLF;
!          end if;
! 
!       --  Signed integer types. Also includes signed fixed-point types and
!       --  signed enumeration types share this circuitry.
! 
!       --  Note on signed integer types. We do not consider types as signed for
!       --  this purpose if they have no negative numbers, or if they have biased
!       --  representation. The reason is that the value in either case basically
!       --  represents an unsigned value.
! 
!       --  For example, consider:
! 
!       --     type W is range 0 .. 2**32 - 1;
!       --     for W'Size use 32;
! 
!       --  This is a signed type, but the representation is unsigned, and may
!       --  be outside the range of a 32-bit signed integer, so this must be
!       --  treated as 32-bit unsigned.
! 
!       --  Similarly, the representation is also unsigned if we have:
! 
!       --     type W is range -1 .. +254;
!       --     for W'Size use 8;
! 
!       --  forcing a biased and unsigned representation
! 
!       elsif not Is_Unsigned_Type (FST)
!         and then
!           (Is_Fixed_Point_Type (U_Type)
!              or else
!            Is_Enumeration_Type (U_Type)
!              or else
!            (Is_Signed_Integer_Type (U_Type)
!               and then not Has_Biased_Representation (FST)))
!       then
!          if P_Size <= Standard_Short_Short_Integer_Size then
!             Lib_RE := RE_W_SSI;
! 
!          elsif P_Size <= Standard_Short_Integer_Size then
!             Lib_RE := RE_W_SI;
! 
!          elsif P_Size = 24 then
!             Lib_RE := RE_W_I24;
! 
!          elsif P_Size <= Standard_Integer_Size then
!             Lib_RE := RE_W_I;
! 
!          elsif P_Size <= Standard_Long_Integer_Size then
!             Lib_RE := RE_W_LI;
! 
!          elsif P_Size <= Standard_Long_Long_Integer_Size then
!             Lib_RE := RE_W_LLI;
! 
!          else
!             Lib_RE := RE_W_LLLI;
!          end if;
! 
!       --  Unsigned integer types, also includes unsigned fixed-point types
!       --  and unsigned enumeration types (note we know they are unsigned
!       --  because we already tested for signed above).
! 
!       --  Also includes signed integer types that are unsigned in the sense
!       --  that they do not include negative numbers. See above for details.
! 
!       elsif Is_Modular_Integer_Type    (U_Type)
!         or else Is_Fixed_Point_Type    (U_Type)
!         or else Is_Enumeration_Type    (U_Type)
!         or else Is_Signed_Integer_Type (U_Type)
!       then
!          if P_Size <= Standard_Short_Short_Integer_Size then
!             Lib_RE := RE_W_SSU;
! 
!          elsif P_Size <= Standard_Short_Integer_Size then
!             Lib_RE := RE_W_SU;
! 
!          elsif P_Size = 24 then
!             Lib_RE := RE_W_U24;
! 
!          elsif P_Size <= Standard_Integer_Size then
!             Lib_RE := RE_W_U;
! 
!          elsif P_Size <= Standard_Long_Integer_Size then
!             Lib_RE := RE_W_LU;
! 
!          elsif P_Size <= Standard_Long_Long_Integer_Size then
!             Lib_RE := RE_W_LLU;
! 
!          else
!             Lib_RE := RE_W_LLLU;
!          end if;
! 
!       else pragma Assert (Is_Access_Type (U_Type));
  
!          if Present (P_Size) and then P_Size > System_Address_Size then
!             Lib_RE := RE_W_AD;
!          else
!             Lib_RE := RE_W_AS;
!          end if;
!       end if;
  
        --  Unchecked-convert parameter to the required type (i.e. the type of
        --  the corresponding parameter, and call the appropriate routine.
--- 712,733 ----
  
     function Build_Elementary_Write_Call (N : Node_Id) return Node_Id is
        Loc     : constant Source_Ptr := Sloc (N);
!       P_Type  : constant Entity_Id := Entity (Prefix (N));
!       U_Type  : constant Entity_Id := Underlying_Type (P_Type);
!       FST     : constant Entity_Id := First_Subtype (U_Type);
!       Strm    : constant Node_Id := First (Expressions (N));
!       Item    : constant Node_Id := Next (Strm);
!       P_Size  : constant Uint := Get_Stream_Size (FST);
        Libent  : Entity_Id;
  
!       Prims : constant Primitive_Result := Get_Primitives (P_Type, P_Size);
  
!       Lib_RE : constant RE_Id :=
!         (case Prims.S is
!            when Primitives => Prims.Write,
!            when others => raise Program_Error);
!    begin
!       pragma Assert (Prims.S = Primitives);
  
        --  Unchecked-convert parameter to the required type (i.e. the type of
        --  the corresponding parameter, and call the appropriate routine.
*************** package body Exp_Strm is
*** 871,882 ****
        Libent := RTE (Lib_RE);
  
        return
!         Make_Procedure_Call_Statement (Loc,
!           Name => New_Occurrence_Of (Libent, Loc),
!           Parameter_Associations => New_List (
!             Relocate_Node (Strm),
!             Unchecked_Convert_To (Etype (Next_Formal (First_Formal (Libent))),
!               Relocate_Node (Item))));
     end Build_Elementary_Write_Call;
  
     -----------------------------------------
--- 735,749 ----
        Libent := RTE (Lib_RE);
  
        return
!         Make_Procedure_Call_Statement
!           (Loc,
!            Name                   => New_Occurrence_Of (Libent, Loc),
!            Parameter_Associations =>
!              New_List
!                (Relocate_Node (Strm),
!                 Unchecked_Convert_To
!                   (Etype (Next_Formal (First_Formal (Libent))),
!                    Relocate_Node (Item))));
     end Build_Elementary_Write_Call;
  
     -----------------------------------------
*************** package body Exp_Strm is
*** 1766,1787 ****
     -- Has_Stream_Standard_Rep --
     -----------------------------
  
!    function Has_Stream_Standard_Rep (U_Type : Entity_Id) return Boolean is
!       Siz : Uint;
! 
     begin
        if Has_Non_Standard_Rep (U_Type) then
           return False;
        end if;
  
!       if Has_Stream_Size_Clause (U_Type) then
!          Siz := Static_Integer (Expression (Stream_Size_Clause (U_Type)));
!       else
!          Siz := Esize (First_Subtype (U_Type));
!       end if;
! 
!       return Siz = Esize (Root_Type (U_Type));
!    end Has_Stream_Standard_Rep;
  
     ---------------------------------
     -- Make_Stream_Subprogram_Name --
--- 1633,1647 ----
     -- Has_Stream_Standard_Rep --
     -----------------------------
  
!    function Is_Stream_Standard_Rep
!      (U_Type : Entity_Id; S_Size : Uint) return Boolean is
     begin
        if Has_Non_Standard_Rep (U_Type) then
           return False;
        end if;
  
!       return S_Size = Esize (Root_Type (U_Type));
!    end Is_Stream_Standard_Rep;
  
     ---------------------------------
     -- Make_Stream_Subprogram_Name --
*************** package body Exp_Strm is
*** 1827,1831 ****
           return Base_Type (E);
        end if;
     end Stream_Base_Type;
- 
  end Exp_Strm;
--- 1687,1690 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/exp_strm.ads gcc-16-20250921/gcc/ada/exp_strm.ads
*** gcc-16-20250914/gcc/ada/exp_strm.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/exp_strm.ads	Sun Sep 21 22:32:34 2025
***************
*** 26,32 ****
--- 26,34 ----
  --  Routines to build stream subprograms for composite types
  
  with Exp_Tss; use Exp_Tss;
+ with Rtsfind; use Rtsfind;
  with Types;   use Types;
+ with Uintp;          use Uintp;
  
  package Exp_Strm is
  
*************** package Exp_Strm is
*** 138,141 ****
--- 140,171 ----
     --  always null), and Pnam is the name of the constructed procedure.
     --  Used by Exp_Dist to generate stream-oriented attributes for RACWs.
  
+    type Status is (Primitives, Possible_Sizes);
+ 
+    type Sizes is array (Positive range <>) of Nat;
+ 
+    type Primitive_Result
+      (S   : Status;
+       Len : Natural)
+    is record
+       case S is
+          when Primitives =>
+             Input : RE_Id;
+             Write : RE_Id;
+ 
+          when Possible_Sizes =>
+             List : Sizes (1 .. Len);
+       end case;
+    end record;
+ 
+    --------------------
+    -- Get_Primitives --
+    --------------------
+ 
+    function Get_Primitives
+      (P_Type : Entity_Id; P_Size : Uint) return Primitive_Result;
+    --  If P_Type supports a stream size of P_Size, returns the corresponding
+    --  input and write primitives. Otherwise, returns a list of the stream
+    --  sizes P_Type supports, in nondecreasing order and with possible
+    --  duplicates.
  end Exp_Strm;
diff -Nrcpad gcc-16-20250914/gcc/ada/exp_util.adb gcc-16-20250921/gcc/ada/exp_util.adb
*** gcc-16-20250914/gcc/ada/exp_util.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/exp_util.adb	Sun Sep 21 22:32:34 2025
*************** package body Exp_Util is
*** 6206,6212 ****
              Utyp := Corresponding_Record_Type (Root_Type (Btyp));
  
           elsif Is_Implicit_Full_View (Utyp) then
!             Utyp := Underlying_Type (Root_Type (Btyp));
  
              if Is_Protected_Type (Utyp) then
                 Utyp := Corresponding_Record_Type (Utyp);
--- 6206,6216 ----
              Utyp := Corresponding_Record_Type (Root_Type (Btyp));
  
           elsif Is_Implicit_Full_View (Utyp) then
!             if Is_Derived_Type (Btyp) then
!                Utyp := Underlying_Type (Root_Type (Btyp));
!             else
!                Utyp := Underlying_Type (Root_Type (Full_View (Btyp)));
!             end if;
  
              if Is_Protected_Type (Utyp) then
                 Utyp := Corresponding_Record_Type (Utyp);
*************** package body Exp_Util is
*** 10033,10039 ****
     begin
        return (not Is_Tagged_Type (T) and then Is_Derived_Type (T))
                 or else
!                  (Is_Private_Type (T) and then Present (Full_View (T))
                     and then not Is_Tagged_Type (Full_View (T))
                     and then Is_Derived_Type (Full_View (T))
                     and then Etype (Full_View (T)) /= T);
--- 10037,10044 ----
     begin
        return (not Is_Tagged_Type (T) and then Is_Derived_Type (T))
                 or else
!                  (Is_Private_Type (T)
!                    and then Present (Full_View (T))
                     and then not Is_Tagged_Type (Full_View (T))
                     and then Is_Derived_Type (Full_View (T))
                     and then Etype (Full_View (T)) /= T);
*************** package body Exp_Util is
*** 14915,14920 ****
--- 14920,14956 ----
              when N_If_Expression =>
                 exit when Node = First (Expressions (Parent_Node));
  
+             when others =>
+                exit;
+          end case;
+ 
+          Node        := Parent_Node;
+          Parent_Node := Parent (Node);
+       end loop;
+ 
+       return Parent_Node;
+    end Unconditional_Parent;
+ 
+    --------------------------------------
+    -- Unqualified_Unconditional_Parent --
+    --------------------------------------
+ 
+    function Unqualified_Unconditional_Parent (N : Node_Id) return Node_Id is
+       Node        : Node_Id := N;
+       Parent_Node : Node_Id := Parent (Node);
+ 
+    begin
+       loop
+          case Nkind (Parent_Node) is
+             when N_Case_Expression_Alternative =>
+                null;
+ 
+             when N_Case_Expression =>
+                exit when Node = Expression (Parent_Node);
+ 
+             when N_If_Expression =>
+                exit when Node = First (Expressions (Parent_Node));
+ 
              when N_Qualified_Expression =>
                 null;
  
*************** package body Exp_Util is
*** 14927,14933 ****
        end loop;
  
        return Parent_Node;
!    end Unconditional_Parent;
  
     -------------------------------
     -- Update_Primitives_Mapping --
--- 14963,14969 ----
        end loop;
  
        return Parent_Node;
!    end Unqualified_Unconditional_Parent;
  
     -------------------------------
     -- Update_Primitives_Mapping --
diff -Nrcpad gcc-16-20250914/gcc/ada/exp_util.ads gcc-16-20250921/gcc/ada/exp_util.ads
*** gcc-16-20250914/gcc/ada/exp_util.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/exp_util.ads	Sun Sep 21 22:32:34 2025
*************** package Exp_Util is
*** 1344,1349 ****
--- 1344,1353 ----
  
     function Unconditional_Parent (N : Node_Id) return Node_Id;
     --  Return the first parent of arbitrary node N that is not a conditional
+    --  expression, one of whose dependent expressions is N, recursively.
+ 
+    function Unqualified_Unconditional_Parent (N : Node_Id) return Node_Id;
+    --  Return the first parent of arbitrary node N that is not a conditional
     --  expression, one of whose dependent expressions is N, and that is not
     --  a qualified expression, whose expression is N, recursively.
  
diff -Nrcpad gcc-16-20250914/gcc/ada/fe.h gcc-16-20250921/gcc/ada/fe.h
*** gcc-16-20250914/gcc/ada/fe.h	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/fe.h	Sun Sep 21 22:32:34 2025
*************** extern Boolean Is_Null_Range 		(Node_Id,
*** 315,320 ****
--- 315,321 ----
  #define First_Actual			sem_util__first_actual
  #define Has_Storage_Model_Type_Aspect	sem_util__storage_model_support__has_storage_model_type_aspect
  #define Has_Designated_Storage_Model_Aspect sem_util__storage_model_support__has_designated_storage_model_aspect
+ #define Is_Extended_Access_Type sem_util__is_extended_access_type
  #define Is_Expression_Function		sem_util__is_expression_function
  #define Is_Variable_Size_Record 	sem_util__is_variable_size_record
  #define Needs_Secondary_Stack		sem_util__needs_secondary_stack
*************** extern Entity_Id Defining_Entity		(Node_
*** 327,332 ****
--- 328,334 ----
  extern Node_Id First_Actual			(Node_Id);
  extern Boolean Has_Storage_Model_Type_Aspect	(Entity_Id);
  extern Boolean Has_Designated_Storage_Model_Aspect (Entity_Id);
+ extern Boolean Is_Extended_Access_Type	(Entity_Id);
  extern Boolean Is_Expression_Function		(Entity_Id);
  extern Boolean Is_Variable_Size_Record 		(Entity_Id);
  extern Boolean Needs_Secondary_Stack		(Entity_Id);
diff -Nrcpad gcc-16-20250914/gcc/ada/freeze.adb gcc-16-20250921/gcc/ada/freeze.adb
*** gcc-16-20250914/gcc/ada/freeze.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/freeze.adb	Sun Sep 21 22:32:34 2025
*************** package body Freeze is
*** 4245,4251 ****
           <<Skip_Packed>>
  
           --  A Ghost type cannot have a component of protected or task type
!          --  (SPARK RM 6.9(21)).
  
           if Is_Ghost_Entity (Arr) and then Is_Concurrent_Type (Ctyp) then
              Error_Msg_N
--- 4245,4251 ----
           <<Skip_Packed>>
  
           --  A Ghost type cannot have a component of protected or task type
!          --  (SPARK RM 6.9(22)).
  
           if Is_Ghost_Entity (Arr) and then Is_Concurrent_Type (Ctyp) then
              Error_Msg_N
*************** package body Freeze is
*** 6790,6795 ****
--- 6790,6816 ----
  
        Set_Is_Frozen (E);
  
+       --  Freeze profile of anonymous access-to-subprogram type
+ 
+       if Do_Freeze_Profile
+         and then Ekind (E) = E_Anonymous_Access_Subprogram_Type
+       then
+          declare
+             Skip_Because_In_Generic : constant Boolean :=
+               In_Generic_Scope (E) or else
+                 (Is_Itype (E)
+                   and then Nkind (Parent (Associated_Node_For_Itype (E)))
+                     = N_Generic_Subprogram_Declaration);
+          begin
+             if not Skip_Because_In_Generic then
+                if not Freeze_Profile (Designated_Type (E)) then
+                   goto Leave;
+                end if;
+                Freeze_Subprogram (Designated_Type (E));
+             end if;
+          end;
+       end if;
+ 
        --  Case of entity being frozen is other than a type
  
        if not Is_Type (E) then
*************** package body Freeze is
*** 11032,11038 ****
        E   : Entity_Id;
        N   : Node_Id) return Boolean
     is
!       Decl : constant Node_Id := Original_Node (Unit_Declaration_Node (E));
  
        function Is_Dispatching_Call_Or_Tagged_Result_Or_Aggregate
          (N : Node_Id) return Traverse_Result;
--- 11053,11062 ----
        E   : Entity_Id;
        N   : Node_Id) return Boolean
     is
!       Decl : constant Node_Id :=
!         (if Ekind (E) = E_Subprogram_Type and then No (Parent (E))
!           then Empty
!           else Original_Node (Unit_Declaration_Node (E)));
  
        function Is_Dispatching_Call_Or_Tagged_Result_Or_Aggregate
          (N : Node_Id) return Traverse_Result;
diff -Nrcpad gcc-16-20250914/gcc/ada/frontend.adb gcc-16-20250921/gcc/ada/frontend.adb
*** gcc-16-20250914/gcc/ada/frontend.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/frontend.adb	Sun Sep 21 22:32:34 2025
*************** with Scn;            use Scn;
*** 56,61 ****
--- 56,62 ----
  with Sem;            use Sem;
  with Sem_Aux;
  with Sem_Ch8;
+ with Sem_Ch12;
  with Sem_SCIL;
  with Sem_Elab;       use Sem_Elab;
  with Sem_Prag;       use Sem_Prag;
*************** begin
*** 432,437 ****
--- 433,450 ----
                    Analyze_Inlined_Bodies;
                 end if;
  
+                --  Mark the structural instances spawned by the main unit as
+                --  Link Once because other units may spawn them too.
+ 
+                Sem_Ch12.Mark_Link_Once
+                  (Declarations (Aux_Decls_Node (Cunit (Main_Unit))));
+ 
+                if Nkind (Unit (Cunit (Main_Unit))) = N_Package_Body then
+                   Sem_Ch12.Mark_Link_Once
+                     (Declarations
+                       (Aux_Decls_Node (Spec_Lib_Unit (Cunit (Main_Unit)))));
+                end if;
+ 
                 --  Remove entities from program that do not have any execution
                 --  time references.
  
diff -Nrcpad gcc-16-20250914/gcc/ada/gcc-interface/ada-tree.h gcc-16-20250921/gcc/ada/gcc-interface/ada-tree.h
*** gcc-16-20250914/gcc/ada/gcc-interface/ada-tree.h	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/gcc-interface/ada-tree.h	Sun Sep 21 22:32:34 2025
*************** do {							 \
*** 73,78 ****
--- 73,86 ----
  #define TYPE_IS_FAT_POINTER_P(NODE) \
    (TREE_CODE (NODE) == RECORD_TYPE && TYPE_FAT_POINTER_P (NODE))
  
+ /* For RECORD_TYPE, UNION_TYPE, and QUAL_UNION_TYPE, nonzero if this is a
+    record being used as an extended access (only true for RECORD_TYPE).  */
+ #define TYPE_EXTENDED_POINTER_P(NODE) \
+   TYPE_LANG_FLAG_7 (RECORD_OR_UNION_CHECK (NODE))
+ 
+ #define TYPE_IS_EXTENDED_POINTER_P(NODE) \
+   (TREE_CODE (NODE) == RECORD_TYPE && TYPE_EXTENDED_POINTER_P (NODE))
+ 
  /* For integral types and array types, nonzero if this is an implementation
     type for a bit-packed array type.  Such types should not be extended to a
     larger size or validated against a specified size.  */
*************** do {						   \
*** 384,389 ****
--- 392,416 ----
  #define SET_TYPE_SCALE_FACTOR(NODE, X) \
    SET_TYPE_LANG_SPECIFIC (INTEGER_TYPE_CHECK (NODE), X)
  
+ /* For an UNCONSTRAINED_ARRAY_TYPE, this is the twin UNCONSTRAINED_ARRAY_TYPE
+    built for extended access types.  */
+ #define TYPE_EXTENDED_UNCONSTRAINED_ARRAY(NODE) \
+   GET_TYPE_LANG_SPECIFIC (TREE_CHECK2 ((NODE), UNCONSTRAINED_ARRAY_TYPE, \
+ 				       ENUMERAL_TYPE))
+ #define SET_TYPE_EXTENDED_UNCONSTRAINED_ARRAY(NODE, X) \
+   SET_TYPE_LANG_SPECIFIC (TREE_CHECK2 ((NODE), UNCONSTRAINED_ARRAY_TYPE, \
+ 				       ENUMERAL_TYPE), X)
+ 
+ /* When the compiler only has a dummy type for an unconstrained array type, we
+    don't build a duplicate dummy only to store the record type for the extended
+    access. Instead, we store it in the original dummy type, using the same
+    lang_type field that will hold the tree for the duplicated array type built
+    later.  */
+ #define TYPE_DUMMY_EXT_POINTER_TO(NODE) \
+   GET_TYPE_LANG_SPECIFIC (TREE_CHECK ((NODE), ENUMERAL_TYPE))
+ #define SET_TYPE_DUMMY_EXT_POINTER_TO(NODE, X) \
+   SET_TYPE_LANG_SPECIFIC (TREE_CHECK ((NODE), ENUMERAL_TYPE), X)
+ 
  /* For types with TYPE_CAN_HAVE_DEBUG_TYPE_P, this is the type to use in
     debugging information.  */
  #define TYPE_DEBUG_TYPE(NODE) \
diff -Nrcpad gcc-16-20250914/gcc/ada/gcc-interface/decl.cc gcc-16-20250921/gcc/ada/gcc-interface/decl.cc
*** gcc-16-20250914/gcc/ada/gcc-interface/decl.cc	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/gcc-interface/decl.cc	Sun Sep 21 22:32:34 2025
*************** static tree gnat_to_gnu_component_type (
*** 201,206 ****
--- 201,207 ----
  static tree gnat_to_gnu_subprog_type (Entity_Id, bool, bool, tree *);
  static int adjust_packed (tree, tree, int);
  static tree gnat_to_gnu_field (Entity_Id, tree, int, bool, bool);
+ static tree get_extended_unconstrained_array (Entity_Id, tree);
  static enum inline_status_t inline_status_for_subprog (Entity_Id);
  static Entity_Id Gigi_Cloned_Subtype (Entity_Id);
  static tree gnu_ext_name_for_subprog (Entity_Id, tree);
*************** is_artificial (Entity_Id gnat_entity)
*** 279,284 ****
--- 280,292 ----
     initial value (in GCC tree form).  This is optional for a variable.  For
     a renamed entity, GNU_EXPR gives the object being renamed.
  
+    If GNAT_ENTITY is an array type and GNU_EXPR is NULL_TREE, a GCC tree for a
+    regular fat pointer will be generated.  However, if GNU_EXPR is not
+    NULL_TREE, it's an existing GCC tree for the fat pointer, and a GCC tree for
+    the extended pointer will be created instead.  The caller must clear the
+    association between GNAT_ENTITY and GNU_EXPR before calling
+    gnat_to_gnu_entity with a non-NULL GNU_EXPR and restore it after the call.
+ 
     DEFINITION is true if this call is intended for a definition.  This is used
     for separate compilation where it is necessary to know whether an external
     declaration or a definition must be created if the GCC equivalent was not
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 441,447 ****
       must be specified unless it was specified by the programmer.  Exceptions
       are for access-to-protected-subprogram types and all access subtypes, as
       another GNAT type is used to lay out the GCC type for them, as well as
!      access-to-subprogram types if front-end unnesting is enabled.  */
    gcc_assert (!is_type
  	      || Known_Esize (gnat_entity)
  	      || Has_Size_Clause (gnat_entity)
--- 449,456 ----
       must be specified unless it was specified by the programmer.  Exceptions
       are for access-to-protected-subprogram types and all access subtypes, as
       another GNAT type is used to lay out the GCC type for them, as well as
!      access-to-subprogram types if front-end unnesting is enabled, and also
!      extended access types.  */
    gcc_assert (!is_type
  	      || Known_Esize (gnat_entity)
  	      || Has_Size_Clause (gnat_entity)
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 454,459 ****
--- 463,469 ----
  			   || kind == E_Anonymous_Access_Subprogram_Type)
  			  && Unnest_Subprogram_Mode)
  		      || kind == E_Access_Subtype
+ 		      || Is_Extended_Access_Type (gnat_entity)
  		      || type_annotate_only)));
  
    /* The RM size must be specified for all discrete and fixed-point types.  */
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 638,644 ****
  	/* Build a CONST_DECL for debugging purposes exclusively.  */
  	gnu_decl
  	  = create_var_decl (gnu_entity_name, gnu_ext_name, gnu_type,
! 			     gnu_expr, true, Is_Public (gnat_entity),
  			     false, false, false, artificial_p,
  			     debug_info_p, NULL, gnat_entity);
        }
--- 648,656 ----
  	/* Build a CONST_DECL for debugging purposes exclusively.  */
  	gnu_decl
  	  = create_var_decl (gnu_entity_name, gnu_ext_name, gnu_type,
! 			     gnu_expr, true,
! 			     Is_Public (gnat_entity),
! 			     Is_Link_Once (gnat_entity),
  			     false, false, false, artificial_p,
  			     debug_info_p, NULL, gnat_entity);
        }
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 1186,1191 ****
--- 1198,1204 ----
  		    create_var_decl (gnu_entity_name, NULL_TREE,
  				     TREE_TYPE (gnu_expr), gnu_expr,
  				     const_flag, Is_Public (gnat_entity),
+ 				     Is_Link_Once (gnat_entity),
  				     imported_p, static_flag, volatile_flag,
  				     artificial_p, debug_info_p, attr_list,
  				     gnat_entity, false);
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 1254,1260 ****
  	   initialize it to NULL, unless the object is declared imported as
  	   per RM B.1(24).  */
  	if (definition
! 	    && (POINTER_TYPE_P (gnu_type) || TYPE_IS_FAT_POINTER_P (gnu_type))
  	    && !gnu_expr
  	    && !Is_Imported (gnat_entity))
  	  gnu_expr = null_pointer_node;
--- 1267,1275 ----
  	   initialize it to NULL, unless the object is declared imported as
  	   per RM B.1(24).  */
  	if (definition
! 	    && (POINTER_TYPE_P (gnu_type)
!                 || TYPE_IS_FAT_POINTER_P (gnu_type)
!                 || TYPE_IS_EXTENDED_POINTER_P (gnu_type))
  	    && !gnu_expr
  	    && !Is_Imported (gnat_entity))
  	  gnu_expr = null_pointer_node;
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 1506,1512 ****
  	    tree gnu_new_var
  	      = create_var_decl (create_concat_name (gnat_entity, "ALIGN"),
  				 NULL_TREE, gnu_new_type, NULL_TREE,
! 				 false, false, false, false, false,
  				 true, debug_info_p && definition, NULL,
  				 gnat_entity);
  
--- 1521,1527 ----
  	    tree gnu_new_var
  	      = create_var_decl (create_concat_name (gnat_entity, "ALIGN"),
  				 NULL_TREE, gnu_new_type, NULL_TREE,
! 				 false, false, false, false, false, false,
  				 true, debug_info_p && definition, NULL,
  				 gnat_entity);
  
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 1568,1575 ****
  		   = create_var_decl (concat_name (gnu_entity_name, "UNC"),
  				      NULL_TREE, gnu_type, gnu_expr,
  				      const_flag, Is_Public (gnat_entity),
! 				      imported_p || !definition, static_flag,
! 				      volatile_flag, true,
  				      debug_info_p && definition,
  				      NULL, gnat_entity);
  		gnu_expr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_unc_var);
--- 1583,1591 ----
  		   = create_var_decl (concat_name (gnu_entity_name, "UNC"),
  				      NULL_TREE, gnu_type, gnu_expr,
  				      const_flag, Is_Public (gnat_entity),
! 				      Is_Link_Once (gnat_entity),
! 				      imported_p || !definition,
! 				      static_flag, volatile_flag, true,
  				      debug_info_p && definition,
  				      NULL, gnat_entity);
  		gnu_expr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_unc_var);
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 1615,1622 ****
  	gnu_decl
  	  = create_var_decl (gnu_entity_name, gnu_ext_name, gnu_type,
  			     gnu_expr, const_flag, Is_Public (gnat_entity),
! 			     imported_p || !definition, static_flag,
! 			     volatile_flag, artificial_p,
  			     debug_info_p && definition, attr_list,
  			     gnat_entity);
  	DECL_BY_REF_P (gnu_decl) = used_by_ref;
--- 1631,1639 ----
  	gnu_decl
  	  = create_var_decl (gnu_entity_name, gnu_ext_name, gnu_type,
  			     gnu_expr, const_flag, Is_Public (gnat_entity),
! 			     Is_Link_Once (gnat_entity),
! 			     imported_p || !definition,
! 			     static_flag, volatile_flag, artificial_p,
  			     debug_info_p && definition, attr_list,
  			     gnat_entity);
  	DECL_BY_REF_P (gnu_decl) = used_by_ref;
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 1663,1668 ****
--- 1680,1686 ----
  	    tree gnu_corr_var
  	      = create_var_decl (gnu_entity_name, gnu_ext_name, gnu_type,
  				 gnu_expr, true, Is_Public (gnat_entity),
+ 				 Is_Link_Once (gnat_entity),
  				 !definition, static_flag, volatile_flag,
  				 artificial_p, debug_info_p && definition,
  				 attr_list, gnat_entity, false);
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 1768,1774 ****
  	      tree gnu_literal
  		= create_var_decl (get_entity_name (gnat_literal), NULL_TREE,
  				   gnu_type, gnu_value, true, false, false,
! 				   false, false, artificial_p, false,
  				   NULL, gnat_literal);
  	      save_gnu_tree (gnat_literal, gnu_literal, false);
  	      gnu_list
--- 1786,1792 ----
  	      tree gnu_literal
  		= create_var_decl (get_entity_name (gnat_literal), NULL_TREE,
  				   gnu_type, gnu_value, true, false, false,
! 				   false, false, false, artificial_p, false,
  				   NULL, gnat_literal);
  	      save_gnu_tree (gnat_literal, gnu_literal, false);
  	      gnu_list
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 2165,2185 ****
  	 have are pointers to that type.  In addition to the type node itself,
  	 4 other types associated with it are built in the process:
  
! 	   1. the array type (suffix XUA) containing the actual data,
  
! 	   2. the template type (suffix XUB) containing the bounds,
  
  	   3. the fat pointer type (suffix XUP) representing a pointer or a
  	      reference to the unconstrained array type:
  		XUP = struct { XUA *, XUB * }
  
! 	   4. the object record type (suffix XUT) containing bounds and data:
! 		XUT = struct { XUB, XUA }
  
  	 The bounds of the array type XUA (de)reference the XUB * field of a
  	 PLACEHOLDER_EXPR for the fat pointer type XUP, so the array type XUA
  	 is to be interpreted in the context of the fat pointer type XUB for
! 	 debug info purposes.  */
  
      case E_Array_Type:
        {
--- 2183,2210 ----
  	 have are pointers to that type.  In addition to the type node itself,
  	 4 other types associated with it are built in the process:
  
! 	   1. the array type (suffix XUA for fat pointer, XUAEA for extended
! 	      access) containing the actual data,
  
! 	   2. the template type (suffix XUB for fat pointer, XUBEA for extended
! 	      access) containing the bounds,
  
  	   3. the fat pointer type (suffix XUP) representing a pointer or a
  	      reference to the unconstrained array type:
  		XUP = struct { XUA *, XUB * }
  
! 	      or the extended access type (suffix XUPEA) representing a pointer
! 	      or a reference to the unconstrained array type:
! 		XUPEA = struct { XUAEA *, XUBEA }
! 
! 	   4. the object record type (suffix XUT for fat pointer, XUTEA for
! 	      extended access) containing bounds and data:
! 		XUT[EA] = struct { XUB[EA], XUA[EA] }
  
  	 The bounds of the array type XUA (de)reference the XUB * field of a
  	 PLACEHOLDER_EXPR for the fat pointer type XUP, so the array type XUA
  	 is to be interpreted in the context of the fat pointer type XUB for
! 	 debug info purposes.  Likewise for the extended access case.  */
  
      case E_Array_Type:
        {
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 2187,2200 ****
  	const Entity_Id PAT = Packed_Array_Impl_Type (gnat_entity);
  	const bool convention_fortran_p
  	  = (Convention (gnat_entity) == Convention_Fortran);
  	const int ndim = Number_Dimensions (gnat_entity);
  	tree gnu_fat_type, gnu_template_type, gnu_ptr_template;
! 	tree gnu_template_reference, gnu_template_fields;
  	tree *gnu_index_types = XALLOCAVEC (tree, ndim);
- 	tree *gnu_temp_fields = XALLOCAVEC (tree, ndim);
  	tree gnu_max_size = size_one_node;
  	tree comp_type, fld, tem, obj;
- 	Entity_Id gnat_index;
  	alias_set_type ptr_set = -1;
  	int index;
  
--- 2212,2224 ----
  	const Entity_Id PAT = Packed_Array_Impl_Type (gnat_entity);
  	const bool convention_fortran_p
  	  = (Convention (gnat_entity) == Convention_Fortran);
+ 	const bool extended_access_p = gnu_expr != NULL_TREE;
  	const int ndim = Number_Dimensions (gnat_entity);
  	tree gnu_fat_type, gnu_template_type, gnu_ptr_template;
! 	tree gnu_template_reference;
  	tree *gnu_index_types = XALLOCAVEC (tree, ndim);
  	tree gnu_max_size = size_one_node;
  	tree comp_type, fld, tem, obj;
  	alias_set_type ptr_set = -1;
  	int index;
  
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 2214,2220 ****
  	   better debugging information in DWARF by leveraging the support for
  	   incomplete declarations of "tagged" types in the DWARF back-end.  */
  	gnu_type = get_dummy_type (gnat_entity);
! 	if (gnu_type && TYPE_POINTER_TO (gnu_type))
  	  {
  	    gnu_fat_type = TYPE_MAIN_VARIANT (TYPE_POINTER_TO (gnu_type));
  	    TYPE_NAME (gnu_fat_type) = NULL_TREE;
--- 2238,2244 ----
  	   better debugging information in DWARF by leveraging the support for
  	   incomplete declarations of "tagged" types in the DWARF back-end.  */
  	gnu_type = get_dummy_type (gnat_entity);
! 	if (gnu_type && TYPE_POINTER_TO (gnu_type) && !extended_access_p)
  	  {
  	    gnu_fat_type = TYPE_MAIN_VARIANT (TYPE_POINTER_TO (gnu_type));
  	    TYPE_NAME (gnu_fat_type) = NULL_TREE;
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 2229,2238 ****
  	    DECL_CHAIN (TYPE_FIELDS (TYPE_POINTER_TO (gnu_type)))
  	      = copy_node (DECL_CHAIN (TYPE_FIELDS (gnu_fat_type)));
  	  }
  	else
  	  {
  	    gnu_fat_type = make_node (RECORD_TYPE);
! 	    gnu_template_type = make_node (RECORD_TYPE);
  	    gnu_ptr_template = build_pointer_type (gnu_template_type);
  	  }
  
--- 2253,2294 ----
  	    DECL_CHAIN (TYPE_FIELDS (TYPE_POINTER_TO (gnu_type)))
  	      = copy_node (DECL_CHAIN (TYPE_FIELDS (gnu_fat_type)));
  	  }
+ 
+         /* We complete an existing dummy for extended access, but we haven't
+            created a specific tree yet for the array type.  The extended access
+            type is stored directly in the original unconstrained array type,
+            where we will store the new array type later.  */
+         else if (gnu_type
+ 		 && TYPE_DUMMY_EXT_POINTER_TO (gnu_type)
+ 		 && extended_access_p)
+ 	  {
+ 	    gnu_ptr_template = NULL_TREE;
+ 	    tree gnu_ext_acc_type = TYPE_DUMMY_EXT_POINTER_TO (gnu_type);
+ 	    gnu_fat_type = TYPE_MAIN_VARIANT (gnu_ext_acc_type);
+ 	    TYPE_NAME (gnu_fat_type) = NULL_TREE;
+ 
+ 	    /* The dummy types has a XUBEA that was only used to get the size of
+ 	       the extended pointer. We now drop this type and use the XUB type
+ 	       from the regular fat pointer instead.  */
+ 	    gnu_template_type
+ 	      = TREE_TYPE (TREE_TYPE (DECL_CHAIN (TYPE_FIELDS (TREE_TYPE (gnu_expr)))));
+ 
+ 	    DECL_CHAIN (TYPE_FIELDS (gnu_fat_type))
+ 	      = create_field_decl (get_identifier ("BOUNDS"),
+ 				   gnu_template_type, gnu_fat_type,
+ 				   NULL_TREE, NULL_TREE, 0, 1);
+ 	  }
+ 
  	else
  	  {
  	    gnu_fat_type = make_node (RECORD_TYPE);
! 
! 	    if (extended_access_p)
! 	      gnu_template_type
! 		= TREE_TYPE (TREE_TYPE (DECL_CHAIN (TYPE_FIELDS (TREE_TYPE (gnu_expr)))));
! 	    else
! 	      gnu_template_type = make_node (RECORD_TYPE);
! 
  	    gnu_ptr_template = build_pointer_type (gnu_template_type);
  	  }
  
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 2264,2270 ****
  	   Var are also built later with the fields of the final type, the
  	   aliasing machinery may consider that the accesses are distinct
  	   if the FIELD_DECLs are distinct as objects.  */
! 	if (COMPLETE_TYPE_P (gnu_fat_type))
  	  {
  	    fld = TYPE_FIELDS (gnu_fat_type);
  	    if (TYPE_ALIAS_SET_KNOWN_P (TYPE_CANONICAL (TREE_TYPE (fld))))
--- 2320,2326 ----
  	   Var are also built later with the fields of the final type, the
  	   aliasing machinery may consider that the accesses are distinct
  	   if the FIELD_DECLs are distinct as objects.  */
! 	if (COMPLETE_TYPE_P (gnu_fat_type) && !extended_access_p)
  	  {
  	    fld = TYPE_FIELDS (gnu_fat_type);
  	    if (TYPE_ALIAS_SET_KNOWN_P (TYPE_CANONICAL (TREE_TYPE (fld))))
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 2275,2280 ****
--- 2331,2369 ----
  	    for (tree t = gnu_fat_type; t; t = TYPE_NEXT_VARIANT (t))
  	      SET_TYPE_UNCONSTRAINED_ARRAY (t, gnu_type);
  	  }
+ 
+ 	else if (COMPLETE_TYPE_P (gnu_fat_type) && extended_access_p)
+ 	  {
+ 	    fld = TYPE_FIELDS (gnu_fat_type);
+ 	    if (TYPE_ALIAS_SET_KNOWN_P (TYPE_CANONICAL (TREE_TYPE (fld))))
+ 	      ptr_set = TYPE_ALIAS_SET (TYPE_CANONICAL (TREE_TYPE (fld)));
+ 	    TREE_TYPE (fld) = ptr_type_node;
+ 	    /* For extended access, we leave the BOUNDS field alone.   */
+ 	    TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (gnu_fat_type)) = 0;
+ 	    for (tree t = gnu_fat_type; t; t = TYPE_NEXT_VARIANT (t))
+ 	      SET_TYPE_UNCONSTRAINED_ARRAY (t, gnu_type);
+ 	  }
+ 
+ 	else if (extended_access_p)
+ 	  {
+ 	    /* We make the fields addressable for the sake of compatibility
+ 	       with languages for which the regular fields are addressable.  */
+ 	    fld
+ 	      = create_field_decl (get_identifier ("P_ARRAY"),
+ 				   ptr_type_node, gnu_fat_type,
+ 				   NULL_TREE, NULL_TREE, 0, 1);
+ 	    /* At this step, gnu_template_type is an empty RECORD to be
+ 	       be populated later.  */
+ 	    DECL_CHAIN (fld)
+ 	      = create_field_decl (get_identifier ("BOUNDS"),
+ 				   gnu_template_type, gnu_fat_type,
+ 				   NULL_TREE, NULL_TREE, 0, 1);
+ 	    /* Too early to finish the record, but set the fields so that
+ 	       they are available through the type.  */
+ 	    TYPE_FIELDS (gnu_fat_type) = fld;
+ 	    SET_TYPE_UNCONSTRAINED_ARRAY (gnu_fat_type, gnu_type);
+ 	  }
+ 
  	else
  	  {
  	    /* We make the fields addressable for the sake of compatibility
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 2302,2436 ****
  	    : gnat_entity;
  	tree xup_name
  	  = gnat_encodings == DWARF_GNAT_ENCODINGS_ALL
! 	    ? create_concat_name (gnat_name, "XUP")
  	    : gnu_entity_name;
  	create_type_decl (xup_name, gnu_fat_type, true, debug_info_p,
  			  gnat_entity, false);
  
  	/* Build a reference to the template from a PLACEHOLDER_EXPR that
! 	   is the fat pointer.  This will be used to access the individual
! 	   fields once we build them.  */
! 	tem = build3 (COMPONENT_REF, gnu_ptr_template,
! 		      build0 (PLACEHOLDER_EXPR, gnu_fat_type),
! 		      DECL_CHAIN (fld), NULL_TREE);
! 	gnu_template_reference
! 	  = build_unary_op (INDIRECT_REF, gnu_template_type, tem);
! 	TREE_READONLY (gnu_template_reference) = 1;
! 	TREE_THIS_NOTRAP (gnu_template_reference) = 1;
! 
! 	/* Now create the GCC type for each index and add the fields for that
! 	   index to the template.  */
! 	for (index = (convention_fortran_p ? ndim - 1 : 0),
! 	     gnat_index = First_Index (gnat_entity);
! 	     IN_RANGE (index, 0, ndim - 1);
! 	     index += (convention_fortran_p ? - 1 : 1),
! 	     gnat_index = Next_Index (gnat_index))
  	  {
! 	    const Entity_Id gnat_index_type = Etype (gnat_index);
! 	    const bool is_flb
! 	      = Is_Fixed_Lower_Bound_Index_Subtype (gnat_index_type);
! 	    tree gnu_index_type = get_unpadded_type (gnat_index_type);
! 	    tree gnu_orig_min = TYPE_MIN_VALUE (gnu_index_type);
! 	    tree gnu_orig_max = TYPE_MAX_VALUE (gnu_index_type);
! 	    tree gnu_index_base_type = get_base_type (gnu_index_type);
! 	    tree gnu_lb_field, gnu_hb_field;
! 	    tree gnu_min, gnu_max, gnu_high;
! 	    char field_name[16];
! 
! 	    /* Update the maximum size of the array in elements.  */
! 	    if (gnu_max_size)
! 	      gnu_max_size
! 		= update_n_elem (gnu_max_size, gnu_orig_min, gnu_orig_max);
! 
! 	    /* Now build the self-referential bounds of the index type.  */
! 	    gnu_index_type = maybe_character_type (gnu_index_type);
! 	    gnu_index_base_type = maybe_character_type (gnu_index_base_type);
! 
! 	    /* Make the FIELD_DECLs for the low and high bounds of this
! 	       type and then make extractions of these fields from the
! 	       template.  */
! 	    sprintf (field_name, "LB%d", index);
! 	    gnu_lb_field = create_field_decl (get_identifier (field_name),
! 					      gnu_index_type,
! 					      gnu_template_type, NULL_TREE,
! 					      NULL_TREE, 0, 0);
! 	    /* Mark the field specifically for INSTANTIATE_LOAD_IN_EXPR.  */
! 	    DECL_DISCRIMINANT_NUMBER (gnu_lb_field) = integer_minus_one_node;
! 	    Sloc_to_locus (Sloc (gnat_entity),
! 			   &DECL_SOURCE_LOCATION (gnu_lb_field));
! 
! 	    field_name[0] = 'U';
! 	    gnu_hb_field = create_field_decl (get_identifier (field_name),
! 					      gnu_index_type,
! 					      gnu_template_type, NULL_TREE,
! 					      NULL_TREE, 0, 0);
! 	    /* Mark the field specifically for INSTANTIATE_LOAD_IN_EXPR.  */
! 	    DECL_DISCRIMINANT_NUMBER (gnu_hb_field) = integer_minus_one_node;
! 	    Sloc_to_locus (Sloc (gnat_entity),
! 			   &DECL_SOURCE_LOCATION (gnu_hb_field));
! 
! 	    gnu_temp_fields[index] = chainon (gnu_lb_field, gnu_hb_field);
! 
! 	    /* We can't use build_component_ref here since the template type
! 	       isn't complete yet.  */
! 	    if (!is_flb)
! 	      {
! 		gnu_orig_min = build3 (COMPONENT_REF, TREE_TYPE (gnu_lb_field),
! 				       gnu_template_reference, gnu_lb_field,
! 				       NULL_TREE);
! 		TREE_READONLY (gnu_orig_min) = 1;
! 	      }
! 
! 	    gnu_orig_max = build3 (COMPONENT_REF, TREE_TYPE (gnu_hb_field),
! 				   gnu_template_reference, gnu_hb_field,
! 				   NULL_TREE);
! 	    TREE_READONLY (gnu_orig_max) = 1;
! 
! 	    gnu_min = convert (sizetype, gnu_orig_min);
! 	    gnu_max = convert (sizetype, gnu_orig_max);
! 
! 	    /* Compute the size of this dimension.  See the E_Array_Subtype
! 	       case below for the rationale.  */
! 	    if (is_flb
! 		&& Nkind (gnat_index) == N_Subtype_Indication
! 	        && flb_cannot_be_superflat (gnat_index))
! 	      gnu_high = gnu_max;
  
! 	    else
! 	      gnu_high
! 		= build3 (COND_EXPR, sizetype,
! 			  build2 (GE_EXPR, boolean_type_node,
! 				  gnu_orig_max, gnu_orig_min),
! 			  gnu_max,
! 			  TREE_CODE (gnu_min) == INTEGER_CST
! 			  ? int_const_binop (MINUS_EXPR, gnu_min, size_one_node)
! 			  : size_binop (MINUS_EXPR, gnu_min, size_one_node));
  
! 	    /* Make a range type with the new range in the Ada base type.
! 	       Then make an index type with the size range in sizetype.  */
! 	    gnu_index_types[index]
! 	      = create_index_type (gnu_min, gnu_high,
! 				   create_range_type (gnu_index_base_type,
! 						      gnu_orig_min,
! 						      gnu_orig_max),
! 				   gnat_entity);
  
! 	    TYPE_NAME (gnu_index_types[index])
! 	      = create_concat_name (gnat_entity, field_name);
! 	  }
  
! 	/* Install all the fields into the template.  */
! 	TYPE_NAME (gnu_template_type)
! 	  = create_concat_name (gnat_entity, "XUB");
! 	TYPE_NAMELESS (gnu_template_type)
! 	  = gnat_encodings != DWARF_GNAT_ENCODINGS_ALL;
! 	gnu_template_fields = NULL_TREE;
! 	for (index = 0; index < ndim; index++)
! 	  gnu_template_fields
! 	    = chainon (gnu_template_fields, gnu_temp_fields[index]);
! 	finish_record_type (gnu_template_type, gnu_template_fields, 0,
! 			    debug_info_p);
! 	TYPE_CONTEXT (gnu_template_type) = gnu_fat_type;
  
  	/* If Component_Size is not already specified, annotate it with the
  	   size of the component.  */
--- 2391,2446 ----
  	    : gnat_entity;
  	tree xup_name
  	  = gnat_encodings == DWARF_GNAT_ENCODINGS_ALL
! 	    ? create_concat_name (gnat_name,
! 				  extended_access_p ? "XUPEA" : "XUP")
  	    : gnu_entity_name;
  	create_type_decl (xup_name, gnu_fat_type, true, debug_info_p,
  			  gnat_entity, false);
  
  	/* Build a reference to the template from a PLACEHOLDER_EXPR that
! 	   is the extended/fat pointer.  This will be used to access the
! 	   individual fields once we build them.  */
! 	if (extended_access_p)
  	  {
! 	    /* Extended pointers reference the template directly through the
! 	       BOUNDS field, which is the second field.  */
! 	    gnu_template_reference
! 	      = build3 (COMPONENT_REF, gnu_template_type,
! 			build0 (PLACEHOLDER_EXPR, gnu_fat_type),
! 			DECL_CHAIN (fld), NULL_TREE);
! 	    TREE_READONLY (gnu_template_reference) = 1;
! 	  }
! 	else
! 	  {
! 	    /* Fat pointers reference the template indirectly through the
! 	       P_BOUNDS field, which is the second field.  */
! 	    tem = build3 (COMPONENT_REF, gnu_ptr_template,
! 			  build0 (PLACEHOLDER_EXPR, gnu_fat_type),
! 			  DECL_CHAIN (fld), NULL_TREE);
! 	    gnu_template_reference
! 	      = build_unary_op (INDIRECT_REF, gnu_template_type, tem);
! 	    TREE_READONLY (gnu_template_reference) = 1;
! 	    TREE_THIS_NOTRAP (gnu_template_reference) = 1;
! 	  }
  
! 	if (!extended_access_p)
! 	  {
! 	    /* Build the template type.  */
! 	    TYPE_NAME (gnu_template_type)
! 	      = create_concat_name (gnat_entity, "XUB");
! 	  }
  
! 	build_template_type (gnat_entity, gnu_template_type,
! 			     gnu_template_reference, gnu_index_types,
! 			     gnu_max_size, debug_info_p);
  
!         if (!extended_access_p)
! 	  TYPE_CONTEXT (gnu_template_type) = gnu_fat_type;
  
! 	/* Now that the template type has been created, the record type for
! 	   extended access can be finished.  */
! 	if (extended_access_p)
! 	  finish_extended_pointer_type (gnu_fat_type, fld);
  
  	/* If Component_Size is not already specified, annotate it with the
  	   size of the component.  */
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 2510,2518 ****
  	  TYPE_ARRAY_MAX_SIZE (tem) = gnu_max_size;
  
  	/* See the above description for the rationale.  */
  	tree gnu_tmp_decl
! 	  = create_type_decl (create_concat_name (gnat_entity, "XUA"), tem,
! 			      true, debug_info_p, gnat_entity);
  	TYPE_CONTEXT (tem) = gnu_fat_type;
  	TYPE_CONTEXT (TYPE_POINTER_TO (tem)) = gnu_fat_type;
  
--- 2520,2530 ----
  	  TYPE_ARRAY_MAX_SIZE (tem) = gnu_max_size;
  
  	/* See the above description for the rationale.  */
+ 	tree xua_name
+ 	  = create_concat_name (gnat_entity,
+ 				extended_access_p ? "XUAEA" : "XUA");
  	tree gnu_tmp_decl
! 	  = create_type_decl (xua_name, tem, true, debug_info_p, gnat_entity);
  	TYPE_CONTEXT (tem) = gnu_fat_type;
  	TYPE_CONTEXT (TYPE_POINTER_TO (tem)) = gnu_fat_type;
  
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 2524,2530 ****
  	   If the GNAT encodings are used, give it a name.  */
  	tree xut_name
  	  = (gnat_encodings == DWARF_GNAT_ENCODINGS_ALL)
! 	    ? create_concat_name (gnat_name, "XUT")
  	    : gnu_entity_name;
  	obj = build_unc_object_type (gnu_template_type, tem, xut_name,
  				     artificial_p, debug_info_p);
--- 2536,2543 ----
  	   If the GNAT encodings are used, give it a name.  */
  	tree xut_name
  	  = (gnat_encodings == DWARF_GNAT_ENCODINGS_ALL)
! 	    ? create_concat_name (gnat_name,
! 				  extended_access_p ? "XUTEA" : "XUT")
  	    : gnu_entity_name;
  	obj = build_unc_object_type (gnu_template_type, tem, xut_name,
  				     artificial_p, debug_info_p);
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 2542,2548 ****
  
  	/* If this is a packed type implemented specially, then process the
  	   implementation type so it is elaborated in the proper scope.  */
! 	if (Present (PAT))
  	  {
  	    /* Save the XUA type as our equivalent temporarily for the call
  	       to gnat_to_gnu_type on the OAT below.  */
--- 2555,2561 ----
  
  	/* If this is a packed type implemented specially, then process the
  	   implementation type so it is elaborated in the proper scope.  */
! 	if (Present (PAT) && !extended_access_p)
  	  {
  	    /* Save the XUA type as our equivalent temporarily for the call
  	       to gnat_to_gnu_type on the OAT below.  */
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 3742,3748 ****
  		      = create_var_decl (create_concat_name (gnat_entity,
  							     "XVZ"),
  					 NULL_TREE, sizetype, gnu_size_unit,
! 					 true, false, false, false, false,
  					 true, true, NULL, gnat_entity, false);
  		}
  
--- 3755,3761 ----
  		      = create_var_decl (create_concat_name (gnat_entity,
  							     "XVZ"),
  					 NULL_TREE, sizetype, gnu_size_unit,
! 					 true, false, false, false, false, false,
  					 true, true, NULL, gnat_entity, false);
  		}
  
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 3951,3957 ****
  	  }
  
  	/* Access-to-unconstrained-array types need a special treatment.  */
! 	if (Is_Array_Type (gnat_desig_rep) && !Is_Constrained (gnat_desig_rep))
  	  {
  	    /* If the processing above got something that has a pointer, then
  	       we are done.  This could have happened either because the type
--- 3964,3972 ----
  	  }
  
  	/* Access-to-unconstrained-array types need a special treatment.  */
! 	if (Is_Array_Type (gnat_desig_rep)
! 	    && !Is_Constrained (gnat_desig_rep)
! 	    && !Is_Extended_Access_Type (gnat_entity))
  	  {
  	    /* If the processing above got something that has a pointer, then
  	       we are done.  This could have happened either because the type
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 3962,3967 ****
--- 3977,4002 ----
  	    gnu_type = TYPE_POINTER_TO (gnu_desig_type);
  	  }
  
+ 	else if (Is_Array_Type (gnat_desig_rep)
+ 		 && !Is_Constrained (gnat_desig_rep)
+ 		 && Is_Extended_Access_Type (gnat_entity))
+ 	  {
+ 	    if (TYPE_IS_DUMMY_P (gnu_desig_type))
+ 	      gnu_type
+ 		= build_dummy_unc_pointer_types_ext (gnat_desig_rep,
+ 						     gnu_desig_type);
+ 	    else
+ 	      {
+ 		tree gnu_extended_type
+ 		  = get_extended_unconstrained_array (gnat_desig_rep,
+ 						      gnu_desig_type);
+ 
+ 		/* We should not get a dummy type.  */
+ 		gnu_type = TYPE_POINTER_TO (gnu_extended_type);
+ 		gcc_assert (gnu_type);
+ 	      }
+ 	  }
+ 
  	/* If we haven't done it yet, build the pointer type the usual way.  */
  	else if (!gnu_type)
  	  {
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 4266,4273 ****
  	    gnu_decl
  	      = create_var_decl (gnu_entity_name, gnu_ext_name, gnu_type,
  				 gnu_address, false, Is_Public (gnat_entity),
! 				 extern_flag, false, false, artificial_p,
! 				 debug_info_p, NULL, gnat_entity);
  	    DECL_BY_REF_P (gnu_decl) = 1;
  	  }
  
--- 4301,4309 ----
  	    gnu_decl
  	      = create_var_decl (gnu_entity_name, gnu_ext_name, gnu_type,
  				 gnu_address, false, Is_Public (gnat_entity),
! 				 Is_Link_Once (gnat_entity), extern_flag,
! 				 false, false, artificial_p, debug_info_p,
! 				 NULL, gnat_entity);
  	    DECL_BY_REF_P (gnu_decl) = 1;
  	  }
  
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 4296,4301 ****
--- 4332,4338 ----
  		= create_subprog_decl (gnu_entity_name, gnu_ext_name,
  				       gnu_type, gnu_param_list, inline_status,
  				       Is_Public (gnat_entity) || imported_p,
+ 				       Is_Link_Once (gnat_entity),
  				       extern_flag, artificial_p, debug_info_p,
  				       definition && imported_p, attr_list,
  				       gnat_entity);
*************** gnat_to_gnu_entity (Entity_Id gnat_entit
*** 4560,4566 ****
  	      if (gnu_size)
  		size = gnu_size;
  	      else if (RECORD_OR_UNION_TYPE_P (gnu_type)
! 		       && !TYPE_FAT_POINTER_P (gnu_type))
  		size = rm_size (gnu_type);
  	      else
  	        size = TYPE_SIZE (gnu_type);
--- 4597,4604 ----
  	      if (gnu_size)
  		size = gnu_size;
  	      else if (RECORD_OR_UNION_TYPE_P (gnu_type)
! 		       && !TYPE_FAT_POINTER_P (gnu_type)
! 		       && !TYPE_EXTENDED_POINTER_P (gnu_type))
  		size = rm_size (gnu_type);
  	      else
  	        size = TYPE_SIZE (gnu_type);
*************** get_unpadded_type (Entity_Id gnat_entity
*** 5137,5142 ****
--- 5175,5196 ----
    return type;
  }
  
+ /* Similar, but GNAT_ENTITY is assumed to refer to a GNAT type.  Return
+    the extended version of the GCC type corresponding to that entity.  */
+ 
+ tree
+ get_unpadded_extended_type (Entity_Id gnat_entity)
+ {
+   tree type = gnat_to_gnu_type (gnat_entity);
+ 
+   tree extended_type = get_extended_unconstrained_array (gnat_entity, type);
+ 
+   if (TYPE_IS_PADDING_P (extended_type))
+     extended_type = TREE_TYPE (TYPE_FIELDS (extended_type));
+ 
+   return extended_type;
+ }
+ 
  /* Return whether the E_Subprogram_Type/E_Function/E_Procedure GNAT_ENTITY is
     a C++ imported method or equivalent.
  
*************** is_cplusplus_method (Entity_Id gnat_enti
*** 5244,5249 ****
--- 5298,5340 ----
    return false;
  }
  
+ /* Get the UNCONSTRAINED_ARRAY_TYPE tree used for extended access handling,
+    for the unconstrained array type GNAT_ENTITY.
+ 
+    GNU_TYPE is the UNCONSTRAINED_ARRAY_TYPE tree used for the regular
+    fat/thin pointers.  */
+ 
+ static tree
+ get_extended_unconstrained_array (Entity_Id gnat_entity, tree gnu_type)
+ {
+   gcc_assert (Is_Array_Type (gnat_entity)
+ 	      && TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE);
+ 
+   tree gnu_extended_type = TYPE_EXTENDED_UNCONSTRAINED_ARRAY (gnu_type);
+ 
+   /* Building the extended type is achieved by translating the array type
+      a second time using a special processing.  */
+   if (!gnu_extended_type)
+     {
+       /* To have gnat_to_gnu_entity trigger the special processing for extended
+ 	 access types, we pass GNU_TYPE as second parameter, we backup the
+ 	 existing association for GNAT_ENTITY and clear it before the call.  */
+       tree gnu_decl = get_gnu_tree (gnat_entity);
+       save_gnu_tree (gnat_entity, NULL_TREE, false);
+ 
+       gnu_extended_type
+ 	= TREE_TYPE (gnat_to_gnu_entity (gnat_entity, gnu_type, false));
+       gcc_assert (gnu_extended_type);
+       SET_TYPE_EXTENDED_UNCONSTRAINED_ARRAY (gnu_type, gnu_extended_type);
+ 
+       /* And finally, we restore the original association for GNAT_ENTITY.  */
+       save_gnu_tree (gnat_entity, NULL_TREE, false);
+       save_gnu_tree (gnat_entity, gnu_decl, false);
+     }
+ 
+   return gnu_extended_type;
+ }
+ 
  /* Return the inlining status of the GNAT subprogram SUBPROG.  */
  
  static enum inline_status_t
*************** gnat_to_gnu_component_type (Entity_Id gn
*** 5466,5471 ****
--- 5557,5563 ----
        && !Strict_Alignment (gnat_type)
        && RECORD_OR_UNION_TYPE_P (gnu_type)
        && !TYPE_FAT_POINTER_P (gnu_type)
+       && !TYPE_EXTENDED_POINTER_P (gnu_type)
        && tree_fits_uhwi_p (TYPE_SIZE (gnu_type)))
      {
        tree gnu_packable_type = make_packable_type (gnu_type, false, max_align);
*************** elaborate_entity (Entity_Id gnat_entity)
*** 7157,7162 ****
--- 7249,7403 ----
      }
  }
  
+ /* Build the template type GNU_TEMPLATE_TYPE for the array type GNAT_ENTITY.
+    GNU_TEMPLATE_REFERENCE is an expression to access the template value from
+    the pointer type.  If GNU_INDEX_TYPES is not null, it's an array where the
+    index types whose bounds are the values of the template are to be stored.
+    If GNU_MAX_SIZE is not NULL_TREE, it's a tree where the maximum size of
+    the array type is computed.  DEBUG_INFO_P is true if debug info needs to
+    be output for this type.  */
+ 
+ void
+ build_template_type (Entity_Id gnat_entity, tree gnu_template_type,
+ 		     tree gnu_template_reference,
+ 		     tree *gnu_index_types, tree &gnu_max_size,
+ 		     bool debug_info_p)
+ {
+   const bool convention_fortran_p
+     = (Convention (gnat_entity) == Convention_Fortran);
+   const int ndim = Number_Dimensions (gnat_entity);
+   tree *gnu_temp_fields = XALLOCAVEC (tree, ndim);
+   Entity_Id gnat_index;
+   int index;
+ 
+   tree template_fields = TYPE_FIELDS (gnu_template_type);
+   const bool template_exists_p = template_fields != NULL_TREE;
+ 
+   /* Now create the GCC type for each index and add the fields for that
+      index to the template.  */
+   for (index = (convention_fortran_p ? ndim - 1 : 0),
+        gnat_index = First_Index (gnat_entity);
+        IN_RANGE (index, 0, ndim - 1);
+        index += (convention_fortran_p ? - 1 : 1),
+        gnat_index = Next_Index (gnat_index))
+     {
+       const Entity_Id gnat_index_type = Etype (gnat_index);
+       const bool is_flb = Is_Fixed_Lower_Bound_Index_Subtype (gnat_index_type);
+       tree gnu_index_type = get_unpadded_type (gnat_index_type);
+       tree gnu_orig_min = TYPE_MIN_VALUE (gnu_index_type);
+       tree gnu_orig_max = TYPE_MAX_VALUE (gnu_index_type);
+       tree gnu_index_base_type = get_base_type (gnu_index_type);
+       tree gnu_lb_field, gnu_hb_field;
+       tree gnu_min, gnu_max, gnu_high;
+       char field_name[16];
+ 
+       /* Update the maximum size of the array in elements.  */
+       if (gnu_max_size)
+ 	gnu_max_size
+ 	  = update_n_elem (gnu_max_size, gnu_orig_min, gnu_orig_max);
+ 
+       /* Now build the self-referential bounds of the index type.  */
+       gnu_index_type = maybe_character_type (gnu_index_type);
+       gnu_index_base_type = maybe_character_type (gnu_index_base_type);
+ 
+       if (template_fields != NULL_TREE)
+ 	{
+ 	  gnu_lb_field = template_fields;
+ 	  template_fields = DECL_CHAIN (template_fields);
+ 	  gnu_hb_field = template_fields;
+ 	  template_fields = DECL_CHAIN (template_fields);
+ 	}
+       else
+ 	{
+ 	  /* Make the FIELD_DECLs for the low and high bounds of this
+ 	     type and then make extractions of these fields from the
+ 	     template.  */
+ 	  sprintf (field_name, "LB%d", index);
+ 	  gnu_lb_field = create_field_decl (get_identifier (field_name),
+ 					    gnu_index_type,
+ 					    gnu_template_type, NULL_TREE,
+ 					    NULL_TREE, 0, 0);
+ 	  /* Mark the field specifically for INSTANTIATE_LOAD_IN_EXPR.  */
+ 	  DECL_DISCRIMINANT_NUMBER (gnu_lb_field) = integer_minus_one_node;
+ 	  Sloc_to_locus (Sloc (gnat_entity), &DECL_SOURCE_LOCATION (gnu_lb_field));
+ 
+ 	  field_name[0] = 'U';
+ 	  gnu_hb_field = create_field_decl (get_identifier (field_name),
+ 					    gnu_index_type,
+ 					    gnu_template_type, NULL_TREE,
+ 					    NULL_TREE, 0, 0);
+ 	  /* Mark the field specifically for INSTANTIATE_LOAD_IN_EXPR.  */
+ 	  DECL_DISCRIMINANT_NUMBER (gnu_hb_field) = integer_minus_one_node;
+ 	  Sloc_to_locus (Sloc (gnat_entity), &DECL_SOURCE_LOCATION (gnu_hb_field));
+ 
+ 	  gnu_temp_fields[index] = chainon (gnu_lb_field, gnu_hb_field);
+ 	}
+ 
+       if (gnu_index_types)
+ 	{
+ 	  /* We can't use build_component_ref here since the template type
+ 	     isn't complete yet.  */
+ 	  if (!is_flb)
+ 	    {
+ 	      gnu_orig_min
+ 		= build3 (COMPONENT_REF, TREE_TYPE (gnu_lb_field),
+ 			  gnu_template_reference, gnu_lb_field,
+ 			  NULL_TREE);
+ 	      TREE_READONLY (gnu_orig_min) = 1;
+ 	    }
+ 
+ 	  gnu_orig_max = build3 (COMPONENT_REF, TREE_TYPE (gnu_hb_field),
+ 				 gnu_template_reference, gnu_hb_field,
+ 				 NULL_TREE);
+ 	  TREE_READONLY (gnu_orig_max) = 1;
+ 
+ 	  gnu_min = convert (sizetype, gnu_orig_min);
+ 	  gnu_max = convert (sizetype, gnu_orig_max);
+ 
+ 	  /* Compute the size of this dimension.  See the E_Array_Subtype
+ 	     case of gnat_to_gnu_entity for the rationale.  */
+ 	  if (is_flb
+ 	      && Nkind (gnat_index) == N_Subtype_Indication
+ 	      && flb_cannot_be_superflat (gnat_index))
+ 	    gnu_high = gnu_max;
+ 
+ 	  else
+ 	    gnu_high
+ 	      = build3 (COND_EXPR, sizetype,
+ 			build2 (GE_EXPR, boolean_type_node,
+ 				gnu_orig_max, gnu_orig_min),
+ 			gnu_max,
+ 			TREE_CODE (gnu_min) == INTEGER_CST
+ 			? int_const_binop (MINUS_EXPR, gnu_min, size_one_node)
+ 			: size_binop (MINUS_EXPR, gnu_min, size_one_node));
+ 
+ 	  /* Make a range type with the new range in the Ada base type.
+ 	     Then make an index type with the size range in sizetype.  */
+ 	  gnu_index_types[index]
+ 	    = create_index_type (gnu_min, gnu_high,
+ 				 create_range_type (gnu_index_base_type,
+ 						    gnu_orig_min,
+ 						    gnu_orig_max),
+ 				 gnat_entity);
+ 
+ 	  TYPE_NAME (gnu_index_types[index])
+ 	    = create_concat_name (gnat_entity, field_name);
+ 	}
+     }
+ 
+   if (!template_exists_p)
+     {
+       TYPE_NAMELESS (gnu_template_type)
+ 	= gnat_encodings != DWARF_GNAT_ENCODINGS_ALL;
+ 
+       tree gnu_template_fields = NULL_TREE;
+       for (index = 0; index < ndim; index++)
+ 	gnu_template_fields
+ 	  = chainon (gnu_template_fields, gnu_temp_fields[index]);
+       finish_record_type (gnu_template_type, gnu_template_fields, 0, debug_info_p);
+     }
+ }
+ 
  /* Prepend to ATTR_LIST an entry for an attribute with provided TYPE,
     NAME, ARGS and ERROR_POINT.  */
  
*************** static tree
*** 7324,7331 ****
  elaborate_expression_1 (tree gnu_expr, Entity_Id gnat_entity, const char *s,
  			bool definition, bool need_for_debug)
  {
!   const bool expr_public_p = Is_Public (gnat_entity);
!   const bool expr_global_p = expr_public_p || global_bindings_p ();
    bool expr_variable_p, use_variable;
  
    /* If GNU_EXPR contains a placeholder, just return it.  We rely on the fact
--- 7565,7571 ----
  elaborate_expression_1 (tree gnu_expr, Entity_Id gnat_entity, const char *s,
  			bool definition, bool need_for_debug)
  {
!   const bool expr_global_p = Is_Public (gnat_entity) || global_bindings_p ();
    bool expr_variable_p, use_variable;
  
    /* If GNU_EXPR contains a placeholder, just return it.  We rely on the fact
*************** elaborate_expression_1 (tree gnu_expr, E
*** 7375,7381 ****
    if (need_for_debug
        && gnat_encodings != DWARF_GNAT_ENCODINGS_ALL
        && (TREE_CONSTANT (gnu_expr)
! 	  || (!expr_public_p
  	      && DECL_P (gnu_expr)
  	      && !DECL_IGNORED_P (gnu_expr))))
      need_for_debug = false;
--- 7615,7621 ----
    if (need_for_debug
        && gnat_encodings != DWARF_GNAT_ENCODINGS_ALL
        && (TREE_CONSTANT (gnu_expr)
! 	  || (!Is_Public (gnat_entity)
  	      && DECL_P (gnu_expr)
  	      && !DECL_IGNORED_P (gnu_expr))))
      need_for_debug = false;
*************** elaborate_expression_1 (tree gnu_expr, E
*** 7394,7400 ****
        tree gnu_decl
  	= create_var_decl (create_concat_name (gnat_entity, s), NULL_TREE,
  			   TREE_TYPE (gnu_expr), gnu_expr, true,
! 			   expr_public_p, !definition && expr_global_p,
  			   expr_global_p, false, true,
  			   Needs_Debug_Info (gnat_entity),
  			   NULL, gnat_entity, false);
--- 7634,7641 ----
        tree gnu_decl
  	= create_var_decl (create_concat_name (gnat_entity, s), NULL_TREE,
  			   TREE_TYPE (gnu_expr), gnu_expr, true,
! 			   Is_Public (gnat_entity), Is_Link_Once (gnat_entity),
! 			   !definition && expr_global_p,
  			   expr_global_p, false, true,
  			   Needs_Debug_Info (gnat_entity),
  			   NULL, gnat_entity, false);
*************** gnat_to_gnu_field (Entity_Id gnat_field,
*** 7778,7783 ****
--- 8019,8025 ----
    if (!needs_strict_alignment
        && RECORD_OR_UNION_TYPE_P (gnu_field_type)
        && !TYPE_FAT_POINTER_P (gnu_field_type)
+       && !TYPE_EXTENDED_POINTER_P (gnu_field_type)
        && tree_fits_uhwi_p (TYPE_SIZE (gnu_field_type))
        && (packed == 1
  	  || is_bitfield
*************** gnat_to_gnu_field (Entity_Id gnat_field,
*** 7975,7980 ****
--- 8217,8223 ----
        if (!needs_strict_alignment
  	  && RECORD_OR_UNION_TYPE_P (gnu_field_type)
  	  && !TYPE_FAT_POINTER_P (gnu_field_type)
+ 	  && !TYPE_EXTENDED_POINTER_P (gnu_field_type)
  	  && TYPE_MODE (gnu_field_type) == BLKmode
  	  && is_bitfield)
  	gnu_field_type = make_packable_type (gnu_field_type, true, 1);
*************** validate_size (Uint uint_size, tree gnu_
*** 9701,9707 ****
  
    /* If this is an access type or a fat pointer, the minimum size is that given
       by the default pointer mode.  */
!   if (TREE_CODE (gnu_type) == POINTER_TYPE || TYPE_IS_FAT_POINTER_P (gnu_type))
      old_size = bitsize_int (GET_MODE_BITSIZE (ptr_mode));
  
    /* Issue an error either if the default size of the object isn't a constant
--- 9944,9952 ----
  
    /* If this is an access type or a fat pointer, the minimum size is that given
       by the default pointer mode.  */
!   if (TREE_CODE (gnu_type) == POINTER_TYPE
!       || TYPE_IS_FAT_POINTER_P (gnu_type)
!       || TYPE_IS_EXTENDED_POINTER_P (gnu_type))
      old_size = bitsize_int (GET_MODE_BITSIZE (ptr_mode));
  
    /* Issue an error either if the default size of the object isn't a constant
*************** set_rm_size (Uint uint_size, tree gnu_ty
*** 9817,9823 ****
  
    /* ...or the Ada size for record and union types.  */
    else if (RECORD_OR_UNION_TYPE_P (gnu_type)
! 	   && !TYPE_FAT_POINTER_P (gnu_type))
      SET_TYPE_ADA_SIZE (gnu_type, size);
  }
  
--- 10062,10069 ----
  
    /* ...or the Ada size for record and union types.  */
    else if (RECORD_OR_UNION_TYPE_P (gnu_type)
! 	   && !TYPE_FAT_POINTER_P (gnu_type)
! 	   && !TYPE_EXTENDED_POINTER_P (gnu_type))
      SET_TYPE_ADA_SIZE (gnu_type, size);
  }
  
*************** copy_and_substitute_in_layout (Entity_Id
*** 10621,10626 ****
--- 10867,10873 ----
  	    gnu_size = DECL_SIZE (gnu_old_field);
  	    if (RECORD_OR_UNION_TYPE_P (gnu_field_type)
  		&& !TYPE_FAT_POINTER_P (gnu_field_type)
+ 		&& !TYPE_EXTENDED_POINTER_P (gnu_field_type)
  		&& tree_fits_uhwi_p (TYPE_SIZE (gnu_field_type)))
  	      gnu_field_type = make_packable_type (gnu_field_type, true, 0);
  	  }
*************** rm_size (tree gnu_type)
*** 10993,10998 ****
--- 11240,11246 ----
    /* For record or union types, we store the size explicitly.  */
    if (RECORD_OR_UNION_TYPE_P (gnu_type)
        && !TYPE_FAT_POINTER_P (gnu_type)
+       && !TYPE_EXTENDED_POINTER_P (gnu_type)
        && TYPE_ADA_SIZE (gnu_type))
      return TYPE_ADA_SIZE (gnu_type);
  
diff -Nrcpad gcc-16-20250914/gcc/ada/gcc-interface/gigi.h gcc-16-20250921/gcc/ada/gcc-interface/gigi.h
*** gcc-16-20250914/gcc/ada/gcc-interface/gigi.h	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/gcc-interface/gigi.h	Sun Sep 21 22:32:34 2025
*************** extern tree gnat_to_gnu_field_decl (Enti
*** 49,54 ****
--- 49,62 ----
     the GCC type corresponding to that entity.  */
  extern tree gnat_to_gnu_type (Entity_Id gnat_entity);
  
+ /* Similar, but GNAT_ENTITY is assumed to refer to a GNAT type.  Return
+    the unpadded version of the GCC type corresponding to that entity.  */
+ extern tree get_unpadded_type (Entity_Id gnat_entity);
+ 
+ /* Similar, but GNAT_ENTITY is assumed to refer to a GNAT type.  Return
+    the extended version of the GCC type corresponding to that entity.  */
+ extern tree get_unpadded_extended_type (Entity_Id gnat_entity);
+ 
  /* Update the GCC tree previously built for the profiles involving GNU_TYPE,
     a dummy type which appears in profiles.  */
  extern void update_profiles_with (tree gnu_type);
*************** extern Entity_Id Gigi_Equivalent_Type (E
*** 107,114 ****
     be elaborated at the point of its definition, but do nothing else.  */
  extern void elaborate_entity (Entity_Id gnat_entity);
  
! /* Get the unpadded version of a GNAT type.  */
! extern tree get_unpadded_type (Entity_Id gnat_entity);
  
  /* Create a record type that contains a SIZE bytes long field of TYPE with a
      starting bit position so that it is aligned to ALIGN bits, and leaving at
--- 115,131 ----
     be elaborated at the point of its definition, but do nothing else.  */
  extern void elaborate_entity (Entity_Id gnat_entity);
  
! /* Build the template type GNU_TEMPLATE_TYPE for the array type GNAT_ENTITY.
!    GNU_TEMPLATE_REFERENCE is an expression to access the template value from
!    the pointer type.  If GNU_INDEX_TYPES is not null, it's an array where the
!    index types whose bounds are the values of the template are to be stored.
!    If GNU_MAX_SIZE is not NULL_TREE, it's a tree where the maximum size of
!    the array type is computed.  DEBUG_INFO_P is true if debug info needs to
!    be output for this type.  */
! extern void build_template_type (Entity_Id gnat_entity, tree gnu_template_type,
! 				 tree gnu_template_reference,
! 				 tree *gnu_index_types, tree &gnu_max_size,
! 				 bool debug_info_p);
  
  /* Create a record type that contains a SIZE bytes long field of TYPE with a
      starting bit position so that it is aligned to ALIGN bits, and leaving at
*************** extern tree get_dummy_type (Entity_Id gn
*** 578,583 ****
--- 595,605 ----
  extern void build_dummy_unc_pointer_types (Entity_Id gnat_desig_type,
  					   tree gnu_desig_type);
  
+ /* Build dummy extended access types whose designated type is specified by
+    GNAT_DESIG_TYPE/GNU_DESIG_TYPE and attach them to the latter.  */
+ extern tree build_dummy_unc_pointer_types_ext (Entity_Id gnat_desig_type,
+ 					       tree gnu_desig_type);
+ 
  /* Record TYPE as a builtin type for Ada.  NAME is the name of the type.
     ARTIFICIAL_P is true if the type was generated by the compiler.  */
  extern void record_builtin_type (const char *name, tree type,
*************** extern void finish_character_type (tree
*** 591,596 ****
--- 613,622 ----
  extern void finish_fat_pointer_type (tree record_type, tree field_list);
  
  /* Given a record type RECORD_TYPE and a list of FIELD_DECL nodes FIELD_LIST,
+    finish constructing the record type as an extended access type.  */
+ extern void finish_extended_pointer_type (tree record_type, tree field_list);
+ 
+ /* Given a record type RECORD_TYPE and a list of FIELD_DECL nodes FIELD_LIST,
     finish constructing the record or union type.  If REP_LEVEL is zero, this
     record has no representation clause and so will be entirely laid out here.
     If REP_LEVEL is one, this record has a representation clause and has been
*************** extern tree create_type_decl (tree name,
*** 653,658 ****
--- 679,687 ----
     definition to be made visible outside of the current compilation unit, for
     instance variable definitions in a package specification.
  
+    LINKONCE_FLAG is true if the entity can be defined in multiple compilation
+    units without generating a linker error.
+ 
     EXTERN_FLAG is true when processing an external variable declaration (as
     opposed to a definition: no storage is to be allocated for the variable).
  
*************** extern tree create_type_decl (tree name,
*** 670,677 ****
     GNAT_NODE is used for the position of the decl.  */
  extern tree create_var_decl (tree name, tree asm_name, tree type, tree init,
  			     bool const_flag, bool public_flag,
! 			     bool extern_flag, bool static_flag,
! 			     bool volatile_flag,
  			     bool artificial_p, bool debug_info_p,
  			     struct attrib *attr_list, Node_Id gnat_node,
  			     bool const_decl_allowed_p = true);
--- 699,706 ----
     GNAT_NODE is used for the position of the decl.  */
  extern tree create_var_decl (tree name, tree asm_name, tree type, tree init,
  			     bool const_flag, bool public_flag,
! 			     bool linkonce_flag, bool extern_flag,
! 			     bool static_flag, bool volatile_flag,
  			     bool artificial_p, bool debug_info_p,
  			     struct attrib *attr_list, Node_Id gnat_node,
  			     bool const_decl_allowed_p = true);
*************** extern tree create_label_decl (tree name
*** 704,709 ****
--- 733,741 ----
     PUBLIC_FLAG is true if this is for a reference to a public entity or for a
     definition to be made visible outside of the current compilation unit.
  
+    LINKONCE_FLAG is true if the entity can be defined in multiple compilation
+    units without generating a linker error.
+ 
     EXTERN_FLAG is true when processing an external subprogram declaration.
  
     ARTIFICIAL_P is true if the subprogram was generated by the compiler.
*************** extern tree create_label_decl (tree name
*** 718,727 ****
  extern tree create_subprog_decl (tree name, tree asm_name, tree type,
  				 tree param_decl_list,
  				 enum inline_status_t inline_status,
! 				 bool public_flag, bool extern_flag,
! 				 bool artificial_p, bool debug_info_p,
! 				 bool definition, struct attrib *attr_list,
! 				 Node_Id gnat_node);
  
  /* Given a subprogram declaration DECL, its assembler name and its type,
     finish constructing the subprogram declaration from ASM_NAME and TYPE.  */
--- 750,760 ----
  extern tree create_subprog_decl (tree name, tree asm_name, tree type,
  				 tree param_decl_list,
  				 enum inline_status_t inline_status,
! 				 bool public_flag, bool linkonce_flag,
! 				 bool extern_flag, bool artificial_p,
! 				 bool debug_info_p, bool definition,
! 				 struct attrib *attr_list = NULL,
! 				 Node_Id gnat_node = Empty);
  
  /* Given a subprogram declaration DECL, its assembler name and its type,
     finish constructing the subprogram declaration from ASM_NAME and TYPE.  */
*************** extern tree build_unc_object_type (tree
*** 761,771 ****
  				   tree name, bool artificial_p,
  				   bool debug_info_p);
  
! /* Same as build_unc_object_type, but taking a thin or fat pointer type
!    instead of the template type.  */
! extern tree build_unc_object_type_from_ptr (tree thin_fat_ptr_type,
! 					    tree object_type, tree name,
! 					    bool debug_info_p);
  
  /* Update anything previously pointing to OLD_TYPE to point to NEW_TYPE.  In
     the normal case this is just two adjustments, but we have more to do
--- 794,802 ----
  				   tree name, bool artificial_p,
  				   bool debug_info_p);
  
! /* Same, taking a pointer type instead of a template type.  */
! extern tree build_unc_object_type_from_ptr (tree ptr_type, tree object_type,
! 					    tree name, bool debug_info_p);
  
  /* Update anything previously pointing to OLD_TYPE to point to NEW_TYPE.  In
     the normal case this is just two adjustments, but we have more to do
diff -Nrcpad gcc-16-20250914/gcc/ada/gcc-interface/misc.cc gcc-16-20250921/gcc/ada/gcc-interface/misc.cc
*** gcc-16-20250914/gcc/ada/gcc-interface/misc.cc	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/gcc-interface/misc.cc	Sun Sep 21 22:32:34 2025
*************** gnat_print_type (FILE *file, tree node,
*** 531,537 ****
        break;
  
      case RECORD_TYPE:
!       if (TYPE_FAT_POINTER_P (node) || TYPE_CONTAINS_TEMPLATE_P (node))
  	print_node (file, "unconstrained array",
  		    TYPE_UNCONSTRAINED_ARRAY (node), indent + 4);
        else
--- 531,539 ----
        break;
  
      case RECORD_TYPE:
!       if (TYPE_EXTENDED_POINTER_P (node)
! 	  || TYPE_FAT_POINTER_P (node)
! 	  || TYPE_CONTAINS_TEMPLATE_P (node))
  	print_node (file, "unconstrained array",
  		    TYPE_UNCONSTRAINED_ARRAY (node), indent + 4);
        else
diff -Nrcpad gcc-16-20250914/gcc/ada/gcc-interface/trans.cc gcc-16-20250921/gcc/ada/gcc-interface/trans.cc
*** gcc-16-20250914/gcc/ada/gcc-interface/trans.cc	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/gcc-interface/trans.cc	Sun Sep 21 22:32:34 2025
*************** gigi (Node_Id gnat_root,
*** 427,440 ****
    gcc_assert (t == boolean_false_node);
    t = create_var_decl (get_entity_name (gnat_literal), NULL_TREE,
  		       boolean_type_node, t, true, false, false, false, false,
! 		       true, false, NULL, gnat_literal);
    save_gnu_tree (gnat_literal, t, false);
    gnat_literal = Next_Literal (gnat_literal);
    t = UI_To_gnu (Enumeration_Rep (gnat_literal), boolean_type_node);
    gcc_assert (t == boolean_true_node);
    t = create_var_decl (get_entity_name (gnat_literal), NULL_TREE,
  		       boolean_type_node, t, true, false, false, false, false,
! 		       true, false, NULL, gnat_literal);
    save_gnu_tree (gnat_literal, t, false);
  
    /* Declare the building blocks of function nodes.  */
--- 427,440 ----
    gcc_assert (t == boolean_false_node);
    t = create_var_decl (get_entity_name (gnat_literal), NULL_TREE,
  		       boolean_type_node, t, true, false, false, false, false,
! 		       false, true, false, NULL, gnat_literal);
    save_gnu_tree (gnat_literal, t, false);
    gnat_literal = Next_Literal (gnat_literal);
    t = UI_To_gnu (Enumeration_Rep (gnat_literal), boolean_type_node);
    gcc_assert (t == boolean_true_node);
    t = create_var_decl (get_entity_name (gnat_literal), NULL_TREE,
  		       boolean_type_node, t, true, false, false, false, false,
! 		       false, true, false, NULL, gnat_literal);
    save_gnu_tree (gnat_literal, t, false);
  
    /* Declare the building blocks of function nodes.  */
*************** gigi (Node_Id gnat_root,
*** 446,469 ****
      = create_subprog_decl (get_identifier ("__gnat_malloc"), NULL_TREE,
  			   build_function_type_list (ptr_type_node, sizetype,
  						     NULL_TREE),
! 			   NULL_TREE, is_default, true, true, true, false,
! 			   false, NULL, Empty);
    DECL_IS_MALLOC (malloc_decl) = 1;
  
    free_decl
      = create_subprog_decl (get_identifier ("__gnat_free"), NULL_TREE,
  			   build_function_type_list (void_type_node,
  						     ptr_type_node, NULL_TREE),
! 			   NULL_TREE, is_default, true, true, true, false,
! 			   false, NULL, Empty);
  
    realloc_decl
      = create_subprog_decl (get_identifier ("__gnat_realloc"), NULL_TREE,
  			   build_function_type_list (ptr_type_node,
  						     ptr_type_node, sizetype,
  						     NULL_TREE),
! 			   NULL_TREE, is_default, true, true, true, false,
! 			   false, NULL, Empty);
  
    /* This is used for 64-bit multiplication with overflow checking.  */
    tree int64_type = gnat_type_for_size (64, 0);
--- 446,469 ----
      = create_subprog_decl (get_identifier ("__gnat_malloc"), NULL_TREE,
  			   build_function_type_list (ptr_type_node, sizetype,
  						     NULL_TREE),
! 			   NULL_TREE, is_default, true, false, true, true,
! 			   false, false);
    DECL_IS_MALLOC (malloc_decl) = 1;
  
    free_decl
      = create_subprog_decl (get_identifier ("__gnat_free"), NULL_TREE,
  			   build_function_type_list (void_type_node,
  						     ptr_type_node, NULL_TREE),
! 			   NULL_TREE, is_default, true, false, true, true,
! 			   false, false);
  
    realloc_decl
      = create_subprog_decl (get_identifier ("__gnat_realloc"), NULL_TREE,
  			   build_function_type_list (ptr_type_node,
  						     ptr_type_node, sizetype,
  						     NULL_TREE),
! 			   NULL_TREE, is_default, true, false, true, true,
! 			   false, false);
  
    /* This is used for 64-bit multiplication with overflow checking.  */
    tree int64_type = gnat_type_for_size (64, 0);
*************** gigi (Node_Id gnat_root,
*** 471,478 ****
      = create_subprog_decl (get_identifier ("__gnat_mulv64"), NULL_TREE,
  			   build_function_type_list (int64_type, int64_type,
  						     int64_type, NULL_TREE),
! 			   NULL_TREE, is_default, true, true, true, false,
! 			   false, NULL, Empty);
    strub_make_callable (mulv64_decl);
  
    tree uint64_type = gnat_type_for_size (64, 1);
--- 471,478 ----
      = create_subprog_decl (get_identifier ("__gnat_mulv64"), NULL_TREE,
  			   build_function_type_list (int64_type, int64_type,
  						     int64_type, NULL_TREE),
! 			   NULL_TREE, is_default, true, false, true, true,
! 			   false, false);
    strub_make_callable (mulv64_decl);
  
    tree uint64_type = gnat_type_for_size (64, 1);
*************** gigi (Node_Id gnat_root,
*** 480,487 ****
      = create_subprog_decl (get_identifier ("__gnat_uns_mulv64"), NULL_TREE,
  			   build_function_type_list (uint64_type, uint64_type,
  						     uint64_type, NULL_TREE),
! 			   NULL_TREE, is_default, true, true, true, false,
! 			   false, NULL, Empty);
    strub_make_callable (uns_mulv64_decl);
  
    if (Enable_128bit_Types)
--- 480,487 ----
      = create_subprog_decl (get_identifier ("__gnat_uns_mulv64"), NULL_TREE,
  			   build_function_type_list (uint64_type, uint64_type,
  						     uint64_type, NULL_TREE),
! 			   NULL_TREE, is_default, true, false, true, true,
! 			   false, false);
    strub_make_callable (uns_mulv64_decl);
  
    if (Enable_128bit_Types)
*************** gigi (Node_Id gnat_root,
*** 493,500 ****
  							 int128_type,
  							 int128_type,
  							 NULL_TREE),
! 			       NULL_TREE, is_default, true, true, true, false,
! 			       false, NULL, Empty);
        strub_make_callable (mulv128_decl);
  
        tree uint128_type = gnat_type_for_size (128, 1);
--- 493,500 ----
  							 int128_type,
  							 int128_type,
  							 NULL_TREE),
! 			       NULL_TREE, is_default, true, false, true, true,
! 			       false, false);
        strub_make_callable (mulv128_decl);
  
        tree uint128_type = gnat_type_for_size (128, 1);
*************** gigi (Node_Id gnat_root,
*** 504,511 ****
  							 uint128_type,
  							 uint128_type,
  							 NULL_TREE),
! 			       NULL_TREE, is_default, true, true, true, false,
! 			       false, NULL, Empty);
        strub_make_callable (uns_mulv128_decl);
      }
  
--- 504,511 ----
  							 uint128_type,
  							 uint128_type,
  							 NULL_TREE),
! 			       NULL_TREE, is_default, true, false, true, true,
! 			       false, false);
        strub_make_callable (uns_mulv128_decl);
      }
  
*************** gigi (Node_Id gnat_root,
*** 526,532 ****
        (get_identifier ("__gnat_set_exception_parameter"), NULL_TREE,
         build_function_type_list (void_type_node, ptr_type_node, ptr_type_node,
  				 NULL_TREE),
!        NULL_TREE, is_default, true, true, true, false, false, NULL, Empty);
  
    /* Hooks to call when entering/leaving an exception handler.  */
    ftype = build_function_type_list (ptr_type_node,
--- 526,532 ----
        (get_identifier ("__gnat_set_exception_parameter"), NULL_TREE,
         build_function_type_list (void_type_node, ptr_type_node, ptr_type_node,
  				 NULL_TREE),
!        NULL_TREE, is_default, true, false, true, true, false, false);
  
    /* Hooks to call when entering/leaving an exception handler.  */
    ftype = build_function_type_list (ptr_type_node,
*************** gigi (Node_Id gnat_root,
*** 534,541 ****
    begin_handler_decl
      = create_subprog_decl (get_identifier ("__gnat_begin_handler_v1"),
  			   NULL_TREE, ftype, NULL_TREE,
! 			   is_default, true, true, true, false, false, NULL,
! 			   Empty);
    /* __gnat_begin_handler_v1 is not a dummy procedure, but we arrange
       for it not to throw.  */
    TREE_NOTHROW (begin_handler_decl) = 1;
--- 534,540 ----
    begin_handler_decl
      = create_subprog_decl (get_identifier ("__gnat_begin_handler_v1"),
  			   NULL_TREE, ftype, NULL_TREE,
! 			   is_default, true, false, true, true, false, false);
    /* __gnat_begin_handler_v1 is not a dummy procedure, but we arrange
       for it not to throw.  */
    TREE_NOTHROW (begin_handler_decl) = 1;
*************** gigi (Node_Id gnat_root,
*** 546,568 ****
    end_handler_decl
      = create_subprog_decl (get_identifier ("__gnat_end_handler_v1"), NULL_TREE,
  			   ftype, NULL_TREE,
! 			   is_default, true, true, true, false, false, NULL,
! 			   Empty);
  
    ftype = build_function_type_list (void_type_node, ptr_type_node, NULL_TREE);
    unhandled_except_decl
      = create_subprog_decl (get_identifier ("__gnat_unhandled_except_handler"),
  			   NULL_TREE, ftype, NULL_TREE,
! 			   is_default, true, true, true, false, false, NULL,
! 			   Empty);
  
    /* Indicate that it never returns.  */
    ftype = build_qualified_type (ftype, TYPE_QUAL_VOLATILE);
    reraise_zcx_decl
      = create_subprog_decl (get_identifier ("__gnat_reraise_zcx"), NULL_TREE,
  			   ftype, NULL_TREE,
! 			   is_default, true, true, true, false, false, NULL,
! 			   Empty);
    set_call_expr_flags (reraise_zcx_decl, ECF_NORETURN | ECF_XTHROW);
  
    /* Dummy objects to materialize "others" and "all others" in the exception
--- 545,564 ----
    end_handler_decl
      = create_subprog_decl (get_identifier ("__gnat_end_handler_v1"), NULL_TREE,
  			   ftype, NULL_TREE,
! 			   is_default, true, false, true, true, false, false);
  
    ftype = build_function_type_list (void_type_node, ptr_type_node, NULL_TREE);
    unhandled_except_decl
      = create_subprog_decl (get_identifier ("__gnat_unhandled_except_handler"),
  			   NULL_TREE, ftype, NULL_TREE,
! 			   is_default, true, false, true, true, false, false);
  
    /* Indicate that it never returns.  */
    ftype = build_qualified_type (ftype, TYPE_QUAL_VOLATILE);
    reraise_zcx_decl
      = create_subprog_decl (get_identifier ("__gnat_reraise_zcx"), NULL_TREE,
  			   ftype, NULL_TREE,
! 			   is_default, true, false, true, true, false, false);
    set_call_expr_flags (reraise_zcx_decl, ECF_NORETURN | ECF_XTHROW);
  
    /* Dummy objects to materialize "others" and "all others" in the exception
*************** gigi (Node_Id gnat_root,
*** 572,592 ****
      = create_var_decl (get_identifier ("OTHERS"),
  		       get_identifier ("__gnat_others_value"),
  		       char_type_node, NULL_TREE,
! 		       true, false, true, false, false, true, false,
  		       NULL, Empty);
  
    all_others_decl
      = create_var_decl (get_identifier ("ALL_OTHERS"),
  		       get_identifier ("__gnat_all_others_value"),
  		       char_type_node, NULL_TREE,
! 		       true, false, true, false, false, true, false,
  		       NULL, Empty);
  
    unhandled_others_decl
      = create_var_decl (get_identifier ("UNHANDLED_OTHERS"),
  		       get_identifier ("__gnat_unhandled_others_value"),
  		       char_type_node, NULL_TREE,
! 		       true, false, true, false, false, true, false,
  		       NULL, Empty);
  
    /* If in no exception handlers mode, all raise statements are redirected to
--- 568,588 ----
      = create_var_decl (get_identifier ("OTHERS"),
  		       get_identifier ("__gnat_others_value"),
  		       char_type_node, NULL_TREE,
! 		       true, false, false, true, false, false, true, false,
  		       NULL, Empty);
  
    all_others_decl
      = create_var_decl (get_identifier ("ALL_OTHERS"),
  		       get_identifier ("__gnat_all_others_value"),
  		       char_type_node, NULL_TREE,
! 		       true, false, false, true, false, false, true, false,
  		       NULL, Empty);
  
    unhandled_others_decl
      = create_var_decl (get_identifier ("UNHANDLED_OTHERS"),
  		       get_identifier ("__gnat_unhandled_others_value"),
  		       char_type_node, NULL_TREE,
! 		       true, false, false, true, false, false, true, false,
  		       NULL, Empty);
  
    /* If in no exception handlers mode, all raise statements are redirected to
*************** gigi (Node_Id gnat_root,
*** 601,608 ****
        tree decl
  	= create_subprog_decl
  	  (get_identifier ("__gnat_last_chance_handler"), NULL_TREE, ftype,
! 	   NULL_TREE, is_default, true, true, true, false, false, NULL,
! 	   Empty);
        for (i = 0; i < (int) ARRAY_SIZE (gnat_raise_decls); i++)
  	gnat_raise_decls[i] = decl;
      }
--- 597,603 ----
        tree decl
  	= create_subprog_decl
  	  (get_identifier ("__gnat_last_chance_handler"), NULL_TREE, ftype,
! 	   NULL_TREE, is_default, true, false, true, true, false, false);
        for (i = 0; i < (int) ARRAY_SIZE (gnat_raise_decls); i++)
  	gnat_raise_decls[i] = decl;
      }
*************** build_raise_check (int check, enum excep
*** 764,771 ****
    ftype = build_qualified_type (ftype, TYPE_QUAL_VOLATILE);
    result
      = create_subprog_decl (get_identifier (Name_Buffer), NULL_TREE, ftype,
! 			   NULL_TREE, is_default, true, true, true, false,
! 			   false, NULL, Empty);
    strub_make_callable (result);
    set_call_expr_flags (result, ECF_NORETURN | ECF_XTHROW);
  
--- 759,766 ----
    ftype = build_qualified_type (ftype, TYPE_QUAL_VOLATILE);
    result
      = create_subprog_decl (get_identifier (Name_Buffer), NULL_TREE, ftype,
! 			   NULL_TREE, is_default, true, false, true, true,
! 			   false, false);
    strub_make_callable (result);
    set_call_expr_flags (result, ECF_NORETURN | ECF_XTHROW);
  
*************** Identifier_to_gnu (Node_Id gnat_node, tr
*** 1250,1255 ****
--- 1245,1254 ----
       no order-of-elaboration issue here.  */
    if (Is_Subprogram (gnat_entity))
      gnu_result_type = NULL_TREE;
+   else if (Nkind (Original_Node (gnat_node)) == N_Explicit_Dereference
+ 	   && Is_Extended_Access_Type
+ 	      (Etype (Prefix (Original_Node (gnat_node)))))
+     gnu_result_type = get_unpadded_extended_type (gnat_result_type);
    else
      gnu_result_type = get_unpadded_type (gnat_result_type);
  
*************** Attribute_to_gnu (Node_Id gnat_node, tre
*** 2033,2039 ****
  	      tree gnu_ptr_type
  		= TREE_TYPE (gnat_to_gnu (Prefix (gnat_prefix)));
  
! 	      if (TYPE_IS_FAT_OR_THIN_POINTER_P (gnu_ptr_type))
  		gnu_type
  		  = build_unc_object_type_from_ptr (gnu_ptr_type,
  						    gnu_actual_obj_type,
--- 2032,2039 ----
  	      tree gnu_ptr_type
  		= TREE_TYPE (gnat_to_gnu (Prefix (gnat_prefix)));
  
! 	      if (TYPE_IS_FAT_OR_THIN_POINTER_P (gnu_ptr_type)
! 		  || TYPE_IS_EXTENDED_POINTER_P (gnu_ptr_type))
  		gnu_type
  		  = build_unc_object_type_from_ptr (gnu_ptr_type,
  						    gnu_actual_obj_type,
*************** Subprogram_Body_to_gnu (Node_Id gnat_nod
*** 4049,4055 ****
  	  gnu_return_var
  	    = create_var_decl (get_identifier ("RETVAL"), NULL_TREE,
  			       gnu_return_type, NULL_TREE,
! 			       false, false, false, false, false,
  			       true, false, NULL, gnat_subprog);
  	  TREE_VALUE (gnu_return_var_elmt) = gnu_return_var;
  	}
--- 4049,4055 ----
  	  gnu_return_var
  	    = create_var_decl (get_identifier ("RETVAL"), NULL_TREE,
  			       gnu_return_type, NULL_TREE,
! 			       false, false, false, false, false, false,
  			       true, false, NULL, gnat_subprog);
  	  TREE_VALUE (gnu_return_var_elmt) = gnu_return_var;
  	}
*************** create_temporary (const char *prefix, tr
*** 4585,4591 ****
    tree gnu_temp
      = create_var_decl (create_tmp_var_name (prefix), NULL_TREE,
  		      type, NULL_TREE,
! 		      false, false, false, false, false,
  		      true, false, NULL, Empty);
    return gnu_temp;
  }
--- 4585,4591 ----
    tree gnu_temp
      = create_var_decl (create_tmp_var_name (prefix), NULL_TREE,
  		      type, NULL_TREE,
! 		      false, false, false, false, false, false,
  		      true, false, NULL, Empty);
    return gnu_temp;
  }
*************** Exception_Handler_to_gnu (Node_Id gnat_n
*** 5868,5874 ****
    tree exc_ptr
      = create_var_decl (get_identifier ("EXPTR"), NULL_TREE,
  		       ptr_type_node, gnu_current_exc_ptr,
! 		       true, false, false, false, false, true, true,
  		       NULL, gnat_node);
  
    tree prev_gnu_incoming_exc_ptr = gnu_incoming_exc_ptr;
--- 5868,5874 ----
    tree exc_ptr
      = create_var_decl (get_identifier ("EXPTR"), NULL_TREE,
  		       ptr_type_node, gnu_current_exc_ptr,
! 		       true, false, false, false, false, false, true, true,
  		       NULL, gnat_node);
  
    tree prev_gnu_incoming_exc_ptr = gnu_incoming_exc_ptr;
*************** Exception_Handler_to_gnu (Node_Id gnat_n
*** 5883,5889 ****
  		       ptr_type_node,
  		       build_call_n_expr (begin_handler_decl, 1,
  					  exc_ptr),
! 		       true, false, false, false, false,
  		       true, true, NULL, gnat_node);
  
    /* Declare and initialize the choice parameter, if present.  */
--- 5883,5889 ----
  		       ptr_type_node,
  		       build_call_n_expr (begin_handler_decl, 1,
  					  exc_ptr),
! 		       true, false, false, false, false, false,
  		       true, true, NULL, gnat_node);
  
    /* Declare and initialize the choice parameter, if present.  */
*************** Exception_Handler_to_gnu (Node_Id gnat_n
*** 5933,5939 ****
  			   build_call_expr (builtin_decl_explicit
  					    (BUILT_IN_EH_POINTER),
  					    1, integer_zero_node),
! 			   true, false, false, false, false,
  			   true, true, NULL, gnat_node);
  
        /* CODE: __gnat_end_handler_v1 (EXPTR, EXCLN, EXPRP);  */
--- 5933,5939 ----
  			   build_call_expr (builtin_decl_explicit
  					    (BUILT_IN_EH_POINTER),
  					    1, integer_zero_node),
! 			   true, false, false, false, false, false,
  			   true, true, NULL, gnat_node);
  
        /* CODE: __gnat_end_handler_v1 (EXPTR, EXCLN, EXPRP);  */
*************** Compilation_Unit_to_gnu (Node_Id gnat_no
*** 5979,5985 ****
      = create_subprog_decl
        (create_concat_name (gnat_unit_entity, body_p ? "elabb" : "elabs"),
         NULL_TREE, void_ftype, NULL_TREE,
!        is_default, true, false, false, true, false, NULL, gnat_unit);
    struct elab_info *info;
  
    vec_safe_push (gnu_elab_proc_stack, gnu_elab_proc_decl);
--- 5979,5985 ----
      = create_subprog_decl
        (create_concat_name (gnat_unit_entity, body_p ? "elabb" : "elabs"),
         NULL_TREE, void_ftype, NULL_TREE,
!        is_default, true, false, false, false, true, false, NULL, gnat_unit);
    struct elab_info *info;
  
    vec_safe_push (gnu_elab_proc_stack, gnu_elab_proc_decl);
*************** gnat_to_gnu (Node_Id gnat_node)
*** 6893,6901 ****
  		&& (Is_Array_Type (Etype (gnat_temp))
  		    || Is_Record_Type (Etype (gnat_temp))
  		    || Is_Concurrent_Type (Etype (gnat_temp)))))
! 	gnat_to_gnu_entity (gnat_temp,
! 			    gnat_to_gnu (Renamed_Object (gnat_temp)),
! 			    true);
        break;
  
      case N_Exception_Renaming_Declaration:
--- 6893,6914 ----
  		&& (Is_Array_Type (Etype (gnat_temp))
  		    || Is_Record_Type (Etype (gnat_temp))
  		    || Is_Concurrent_Type (Etype (gnat_temp)))))
! 	{
! 	  gnu_expr = gnat_to_gnu (Renamed_Object (gnat_temp));
! 
! 	  /* The elaboration of object renamings present in the source code
! 	     never needs to be deferred.  But regular objects may be turned
! 	     into renamings during expansion and their elaboration may need
! 	     to be deferred, in which case we expect the renamed references
! 	     to have been stabilized, so we do not do it again here.  */
! 	  if (Present (Freeze_Node (gnat_temp)))
! 	    {
! 	      gcc_assert (!Comes_From_Source (gnat_node));
! 	      save_gnu_tree (gnat_node, gnu_expr, true);
! 	    }
! 	  else
! 	    gnat_to_gnu_entity (gnat_temp, gnu_expr, true);
! 	}
        break;
  
      case N_Exception_Renaming_Declaration:
*************** gnat_to_gnu (Node_Id gnat_node)
*** 6961,6967 ****
  
      case N_Explicit_Dereference:
        /* Make sure the designated type is complete before dereferencing.  */
!       gnu_result_type = get_unpadded_type (Etype (gnat_node));
        gnu_result = gnat_to_gnu (Prefix (gnat_node));
        gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result);
  
--- 6974,6985 ----
  
      case N_Explicit_Dereference:
        /* Make sure the designated type is complete before dereferencing.  */
!       if (Is_Extended_Access_Type (Etype (Prefix (gnat_node)))
! 	  && !Is_Constrained (Etype (gnat_node)))
!         gnu_result_type = get_unpadded_extended_type (Etype (gnat_node));
!       else
!         gnu_result_type = get_unpadded_type (Etype (gnat_node));
! 
        gnu_result = gnat_to_gnu (Prefix (gnat_node));
        gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result);
  
*************** gnat_to_gnu (Node_Id gnat_node)
*** 7194,7200 ****
  				 (Entity (Prefix (gnat_node)),
  				  attr == Attr_Elab_Body ? "elabb" : "elabs"),
  				 NULL_TREE, void_ftype, NULL_TREE, is_default,
! 				 true, true, true, true, false, NULL,
  				 gnat_node);
  
  	gnu_result = Attribute_to_gnu (gnat_node, &gnu_result_type, attr);
--- 7212,7218 ----
  				 (Entity (Prefix (gnat_node)),
  				  attr == Attr_Elab_Body ? "elabb" : "elabs"),
  				 NULL_TREE, void_ftype, NULL_TREE, is_default,
! 				 true, false, true, true, true, false, NULL,
  				 gnat_node);
  
  	gnu_result = Attribute_to_gnu (gnat_node, &gnu_result_type, attr);
*************** process_freeze_entity (Node_Id gnat_node
*** 9818,9827 ****
      }
    else
      {
        tree gnu_init
! 	= (Nkind (Declaration_Node (gnat_entity)) == N_Object_Declaration
! 	   && present_gnu_tree (Declaration_Node (gnat_entity)))
! 	  ? get_gnu_tree (Declaration_Node (gnat_entity)) : NULL_TREE;
  
        gnu_new = gnat_to_gnu_entity (gnat_entity, gnu_init, true);
      }
--- 9836,9850 ----
      }
    else
      {
+       /* For an object whose elaboration is deferred, the GCC tree of the
+ 	 declaration, if any, is the initialization expression.  */
+       const Node_Id gnat_decl = Declaration_Node (gnat_entity);
        tree gnu_init
! 	= (Nkind (gnat_decl) == N_Object_Declaration
! 	   || Nkind (gnat_decl) == N_Object_Renaming_Declaration)
! 	  && Present (Freeze_Node (gnat_entity))
! 	  && present_gnu_tree (gnat_decl)
! 	  ? get_gnu_tree (gnat_decl) : NULL_TREE;
  
        gnu_new = gnat_to_gnu_entity (gnat_entity, gnu_init, true);
      }
*************** static bool
*** 11304,11310 ****
  use_alias_for_thunk_p (tree target)
  {
    /* We cannot generate a local call in this case.  */
!   if (DECL_EXTERNAL (target))
      return false;
  
    /* The call is already local in this case.  */
--- 11327,11333 ----
  use_alias_for_thunk_p (tree target)
  {
    /* We cannot generate a local call in this case.  */
!   if (DECL_EXTERNAL (target) || DECL_ONE_ONLY (target))
      return false;
  
    /* The call is already local in this case.  */
diff -Nrcpad gcc-16-20250914/gcc/ada/gcc-interface/utils.cc gcc-16-20250921/gcc/ada/gcc-interface/utils.cc
*** gcc-16-20250914/gcc/ada/gcc-interface/utils.cc	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/gcc-interface/utils.cc	Sun Sep 21 22:32:34 2025
*************** static tree fold_bit_position (const_tre
*** 392,398 ****
  static tree compute_related_constant (tree, tree);
  static tree split_plus (tree, tree *);
  static tree float_type_for_precision (int, machine_mode);
- static tree convert_to_fat_pointer (tree, tree);
  static unsigned int scale_by_factor_of (tree, unsigned int);
  
  /* Linked list used as a queue to defer the initialization of the DECL_CONTEXT
--- 392,397 ----
*************** build_dummy_unc_pointer_types (Entity_Id
*** 616,621 ****
--- 615,673 ----
    TYPE_OBJECT_RECORD_TYPE (gnu_desig_type) = gnu_object_type;
  }
  
+ /* Build dummy extended access types whose designated type is specified by
+    GNAT_DESIG_TYPE/GNU_DESIG_TYPE and attach them to the latter.  */
+ 
+ tree
+ build_dummy_unc_pointer_types_ext (Entity_Id gnat_desig_type, tree gnu_desig_type)
+ {
+   tree gnu_template_type, gnu_array_type, gnu_ptr_array;
+   tree gnu_ext_acc_type = make_node (RECORD_TYPE);
+   tree fields, dummy = NULL_TREE;
+ 
+   gnu_template_type = make_node (RECORD_TYPE);
+   TYPE_NAME (gnu_template_type) = create_concat_name (gnat_desig_type, "XUBEA");
+   TYPE_DUMMY_P (gnu_template_type) = 1;
+ 
+   /* This will also set TYPE_POINTER_TO field for the template type, even if
+      we don't need it here. */
+   build_pointer_type (gnu_template_type);
+ 
+   /* The following call only builds the template record, but other dependent
+      types or other more complex expressions for bounds are NOT created.
+      This allows the size of an extended access to be computed, but it must be
+      completed later. */
+   build_template_type (gnat_desig_type, gnu_template_type, NULL_TREE, NULL,
+ 		       dummy, false);
+ 
+   TYPE_CONTEXT (gnu_template_type) = gnu_ext_acc_type;
+ 
+   gnu_array_type = make_node (ENUMERAL_TYPE);
+   TYPE_NAME (gnu_array_type) = create_concat_name (gnat_desig_type, "XUAEA");
+   TYPE_DUMMY_P (gnu_array_type) = 1;
+   gnu_ptr_array = build_pointer_type (gnu_array_type);
+ 
+   /* Build a stub DECL to trigger the special processing for fat pointer types
+      in gnat_pushdecl.  */
+   TYPE_NAME (gnu_ext_acc_type)
+     = create_type_stub_decl (create_concat_name (gnat_desig_type, "XUPEA"),
+ 			     gnu_ext_acc_type);
+   fields = create_field_decl (get_identifier ("P_ARRAY"), gnu_ptr_array,
+ 			      gnu_ext_acc_type, NULL_TREE, NULL_TREE, 0, 1);
+   DECL_CHAIN (fields)
+     = create_field_decl (get_identifier ("BOUNDS"), gnu_template_type,
+ 			 gnu_ext_acc_type, NULL_TREE, NULL_TREE, 0, 1);
+   finish_extended_pointer_type (gnu_ext_acc_type, fields);
+   SET_TYPE_UNCONSTRAINED_ARRAY (gnu_ext_acc_type, gnu_desig_type);
+ 
+   /* Suppress debug info until after the type is completed.  */
+   TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (gnu_ext_acc_type)) = 1;
+ 
+   SET_TYPE_DUMMY_EXT_POINTER_TO (gnu_desig_type, gnu_ext_acc_type);
+ 
+   return gnu_ext_acc_type;
+ }
+ 
  /* Return true if we are in the global binding level.  */
  
  bool
*************** gnat_pushdecl (tree decl, Node_Id gnat_n
*** 937,947 ****
      }
  
  /* Pointer types aren't named types in the C sense so we need to generate a
!    typedef in DWARF for them.  Also do that for fat pointer types because,
!    even though they are named types in the C sense, they are still the XUP
!    types created for the base array type at this point.  */
! #define TYPE_IS_POINTER_P(NODE) \
!   (TREE_CODE (NODE) == POINTER_TYPE || TYPE_IS_FAT_POINTER_P (NODE))
  
    /* For the declaration of a type, set its name either if it isn't already
       set or if the previous type name was not derived from a source name.
--- 989,1001 ----
      }
  
  /* Pointer types aren't named types in the C sense so we need to generate a
!    typedef in DWARF for them.  Also do that for fat and extended pointer types
!    because, even though they are named types in the C sense, they are still
!    the XUP[EA] types created for the base array type at this point.  */
! #define TYPE_IS_POINTER_P(NODE)                                                \
!   (TREE_CODE (NODE) == POINTER_TYPE                                            \
!    || TYPE_IS_FAT_POINTER_P (NODE)                                             \
!    || TYPE_IS_EXTENDED_POINTER_P (NODE))
  
    /* For the declaration of a type, set its name either if it isn't already
       set or if the previous type name was not derived from a source name.
*************** gnat_pushdecl (tree decl, Node_Id gnat_n
*** 973,980 ****
  	    DECL_ORIGINAL_TYPE (decl) = DECL_ORIGINAL_TYPE (TYPE_NAME (t));
  	  else
  	    DECL_ORIGINAL_TYPE (decl) = t;
! 	  /* Remark the canonical fat pointer type as artificial.  */
! 	  if (TYPE_IS_FAT_POINTER_P (t))
  	    TYPE_ARTIFICIAL (t) = 1;
  	  t = NULL_TREE;
  	}
--- 1027,1034 ----
  	    DECL_ORIGINAL_TYPE (decl) = DECL_ORIGINAL_TYPE (TYPE_NAME (t));
  	  else
  	    DECL_ORIGINAL_TYPE (decl) = t;
! 	  /* Remark the canonical fat or extended pointer type as artificial.  */
! 	  if (TYPE_IS_FAT_POINTER_P (t) || TYPE_IS_EXTENDED_POINTER_P (t))
  	    TYPE_ARTIFICIAL (t) = 1;
  	  t = NULL_TREE;
  	}
*************** maybe_pad_type (tree type, tree size, un
*** 1725,1730 ****
--- 1779,1785 ----
    if (align > 0
        && RECORD_OR_UNION_TYPE_P (type)
        && !TYPE_IS_FAT_POINTER_P (type)
+       && !TYPE_IS_EXTENDED_POINTER_P (type)
        && TYPE_MODE (type) == BLKmode
        && !TYPE_BY_REFERENCE_P (type)
        && TREE_CODE (orig_size) == INTEGER_CST
*************** maybe_pad_type (tree type, tree size, un
*** 1795,1801 ****
  	     is a compilation artifact.  */
  	  size_unit
  	    = create_var_decl (concat_name (name, "XVZ"), NULL_TREE, sizetype,
! 			      size_unit, true, global_bindings_p (),
  			      !definition && global_bindings_p (), false,
  			      false, true, true, NULL, gnat_entity, false);
  	  TYPE_SIZE_UNIT (record) = size_unit;
--- 1850,1856 ----
  	     is a compilation artifact.  */
  	  size_unit
  	    = create_var_decl (concat_name (name, "XVZ"), NULL_TREE, sizetype,
! 			      size_unit, true, global_bindings_p (), false,
  			      !definition && global_bindings_p (), false,
  			      false, true, true, NULL, gnat_entity, false);
  	  TYPE_SIZE_UNIT (record) = size_unit;
*************** finish_fat_pointer_type (tree record_typ
*** 2119,2124 ****
--- 2174,2198 ----
    TYPE_CONTAINS_PLACEHOLDER_INTERNAL (record_type) = 2;
  }
  
+ /* Given a record type RECORD_TYPE and a list of FIELD_DECL nodes FIELD_LIST,
+    finish constructing the record type as an extended access type.  */
+ 
+ void
+ finish_extended_pointer_type (tree record_type, tree field_list)
+ {
+   /* Show what it really is.  */
+   TYPE_EXTENDED_POINTER_P (record_type) = 1;
+ 
+   /* Do not emit debug info for it since the types of its fields may still be
+      incomplete at this point.  */
+   finish_record_type (record_type, field_list, 0, false);
+ 
+   /* Force type_contains_placeholder_p to return true on it.  Although the
+      PLACEHOLDER_EXPRs are referenced only indirectly, this isn't a pointer
+      type but the representation of the unconstrained array.  */
+   TYPE_CONTAINS_PLACEHOLDER_INTERNAL (record_type) = 2;
+ }
+ 
  /* Clear DECL_BIT_FIELD flag and associated markers on FIELD, which is a field
     of aggregate type TYPE.  */
  
*************** finish_record_type (tree record_type, tr
*** 2219,2224 ****
--- 2293,2299 ----
  
        if (RECORD_OR_UNION_TYPE_P (type)
  	  && !TYPE_FAT_POINTER_P (type)
+ 	  && !TYPE_EXTENDED_POINTER_P (type)
  	  && !TYPE_CONTAINS_TEMPLATE_P (type)
  	  && TYPE_ADA_SIZE (type))
  	this_ada_size = TYPE_ADA_SIZE (type);
*************** finish_record_type (tree record_type, tr
*** 2355,2360 ****
--- 2430,2436 ----
      {
        /* Now set any of the values we've just computed that apply.  */
        if (!TYPE_FAT_POINTER_P (record_type)
+ 	  && !TYPE_EXTENDED_POINTER_P (record_type)
  	  && !TYPE_CONTAINS_TEMPLATE_P (record_type))
  	SET_TYPE_ADA_SIZE (record_type, ada_size);
      }
*************** create_type_decl (tree name, tree type,
*** 2919,2924 ****
--- 2995,3003 ----
     definition to be made visible outside of the current compilation unit, for
     instance variable definitions in a package specification.
  
+    LINKONCE_FLAG is true if the entity can be defined in multiple compilation
+    units without generating a linker error.
+ 
     EXTERN_FLAG is true when processing an external variable declaration (as
     opposed to a definition: no storage is to be allocated for the variable).
  
*************** create_type_decl (tree name, tree type,
*** 2937,2946 ****
  
  tree
  create_var_decl (tree name, tree asm_name, tree type, tree init,
! 		 bool const_flag, bool public_flag, bool extern_flag,
! 		 bool static_flag, bool volatile_flag, bool artificial_p,
! 		 bool debug_info_p, struct attrib *attr_list,
! 		 Node_Id gnat_node, bool const_decl_allowed_p)
  {
    /* Whether the object has static storage duration, either explicitly or by
       virtue of being declared at the global level.  */
--- 3016,3026 ----
  
  tree
  create_var_decl (tree name, tree asm_name, tree type, tree init,
! 		 bool const_flag, bool public_flag, bool linkonce_flag,
! 		 bool extern_flag, bool static_flag, bool volatile_flag,
! 		 bool artificial_p, bool debug_info_p,
! 		 struct attrib *attr_list, Node_Id gnat_node,
! 		 bool const_decl_allowed_p)
  {
    /* Whether the object has static storage duration, either explicitly or by
       virtue of being declared at the global level.  */
*************** create_var_decl (tree name, tree asm_nam
*** 2971,2979 ****
       and may be used for scalars in general but not for aggregates.  */
    tree var_decl
      = build_decl (input_location,
! 		  (constant_p
! 		   && const_decl_allowed_p
! 		   && !AGGREGATE_TYPE_P (type) ? CONST_DECL : VAR_DECL),
  		  name, type);
  
    /* Detect constants created by the front-end to hold 'reference to function
--- 3051,3058 ----
       and may be used for scalars in general but not for aggregates.  */
    tree var_decl
      = build_decl (input_location,
! 		  constant_p && const_decl_allowed_p && !AGGREGATE_TYPE_P (type)
! 		  ? CONST_DECL : VAR_DECL,
  		  name, type);
  
    /* Detect constants created by the front-end to hold 'reference to function
*************** create_var_decl (tree name, tree asm_nam
*** 3055,3060 ****
--- 3134,3146 ----
  	     != null_pointer_node))
      DECL_IGNORED_P (var_decl) = 1;
  
+   /* Note that make_decl_one_only forces TREE_PUBLIC on the DECL.  */
+   if (linkonce_flag && VAR_P (var_decl))
+     {
+       gcc_checking_assert (TREE_PUBLIC (var_decl));
+       make_decl_one_only (var_decl, var_decl);
+     }
+ 
    /* ??? Some attributes cannot be applied to CONST_DECLs.  */
    if (VAR_P (var_decl))
      process_attributes (&var_decl, &attr_list, true, gnat_node);
*************** create_label_decl (tree name, Node_Id gn
*** 3591,3596 ****
--- 3677,3685 ----
     PUBLIC_FLAG is true if this is for a reference to a public entity or for a
     definition to be made visible outside of the current compilation unit.
  
+    LINKONCE_FLAG is true if the entity can be defined in multiple compilation
+    units without generating a linker error.
+ 
     EXTERN_FLAG is true when processing an external subprogram declaration.
  
     ARTIFICIAL_P is true if the subprogram was generated by the compiler.
*************** create_label_decl (tree name, Node_Id gn
*** 3606,3614 ****
  tree
  create_subprog_decl (tree name, tree asm_name, tree type, tree param_decl_list,
  		     enum inline_status_t inline_status, bool public_flag,
! 		     bool extern_flag, bool artificial_p, bool debug_info_p,
! 		     bool definition, struct attrib *attr_list,
! 		     Node_Id gnat_node)
  {
    tree subprog_decl = build_decl (input_location, FUNCTION_DECL, name, type);
    DECL_ARGUMENTS (subprog_decl) = param_decl_list;
--- 3695,3703 ----
  tree
  create_subprog_decl (tree name, tree asm_name, tree type, tree param_decl_list,
  		     enum inline_status_t inline_status, bool public_flag,
! 		     bool linkonce_flag, bool extern_flag, bool artificial_p,
! 		     bool debug_info_p, bool definition,
! 		     struct attrib *attr_list, Node_Id gnat_node)
  {
    tree subprog_decl = build_decl (input_location, FUNCTION_DECL, name, type);
    DECL_ARGUMENTS (subprog_decl) = param_decl_list;
*************** create_subprog_decl (tree name, tree asm
*** 3661,3666 ****
--- 3750,3762 ----
        gcc_unreachable ();
      }
  
+   /* Note that make_decl_one_only forces TREE_PUBLIC on the DECL.  */
+   if (linkonce_flag)
+     {
+       gcc_checking_assert (TREE_PUBLIC (subprog_decl));
+       make_decl_one_only (subprog_decl, subprog_decl);
+     }
+ 
    process_attributes (&subprog_decl, &attr_list, true, gnat_node);
  
    /* Once everything is processed, finish the subprogram declaration.  */
*************** build_unc_object_type (tree template_typ
*** 4483,4502 ****
    return type;
  }
  
! /* Same, taking a thin or fat pointer type instead of a template type. */
  
  tree
! build_unc_object_type_from_ptr (tree thin_fat_ptr_type, tree object_type,
! 				tree name, bool debug_info_p)
  {
    tree template_type;
  
!   gcc_assert (TYPE_IS_FAT_OR_THIN_POINTER_P (thin_fat_ptr_type));
! 
!   template_type
!     = (TYPE_IS_FAT_POINTER_P (thin_fat_ptr_type)
!        ? TREE_TYPE (TREE_TYPE (DECL_CHAIN (TYPE_FIELDS (thin_fat_ptr_type))))
!        : TREE_TYPE (TYPE_FIELDS (TREE_TYPE (thin_fat_ptr_type))));
  
    return
      build_unc_object_type (template_type, object_type, name, true,
--- 4579,4601 ----
    return type;
  }
  
! /* Same, taking a pointer type instead of a template type.  */
  
  tree
! build_unc_object_type_from_ptr (tree ptr_type, tree object_type, tree name,
! 				bool debug_info_p)
  {
    tree template_type;
  
!   if (TYPE_IS_EXTENDED_POINTER_P (ptr_type))
!     template_type = TREE_TYPE (DECL_CHAIN (TYPE_FIELDS (ptr_type)));
!   else if (TYPE_IS_FAT_POINTER_P (ptr_type))
!     template_type
!       = TREE_TYPE (TREE_TYPE (DECL_CHAIN (TYPE_FIELDS (ptr_type))));
!   else if (TYPE_IS_THIN_POINTER_P (ptr_type))
!     template_type = TREE_TYPE (TYPE_FIELDS (TREE_TYPE (ptr_type)));
!   else
!     gcc_unreachable ();
  
    return
      build_unc_object_type (template_type, object_type, name, true,
*************** convert_to_fat_pointer (tree type, tree
*** 4652,4657 ****
--- 4751,4759 ----
    vec<constructor_elt, va_gc> *v;
    vec_alloc (v, 2);
  
+   /* We don't allow conversion from extended to fat pointers.  */
+   gcc_assert (!TYPE_IS_EXTENDED_POINTER_P (etype));
+ 
    /* If EXPR is null, make a fat pointer that contains a null pointer to the
       array (compare_fat_pointers ensures that this is the full discriminant)
       and a valid pointer to the bounds.  This latter property is necessary
*************** convert_to_fat_pointer (tree type, tree
*** 4743,4748 ****
--- 4845,4945 ----
    return gnat_build_constructor (type, v);
  }
  
+ /* Convert EXPR, a pointer to a constrained array, into a pointer to an
+    unconstrained one using an extended access.  This involves making or
+    finding a template. */
+ 
+ static tree
+ convert_to_extended_pointer (tree type, tree expr)
+ {
+   tree template_type = TREE_TYPE (DECL_CHAIN (TYPE_FIELDS (type)));
+   tree p_array_type = TREE_TYPE (TYPE_FIELDS (type));
+   tree etype = TREE_TYPE (expr);
+   tree template_val;
+   vec<constructor_elt, va_gc> *v;
+   vec_alloc (v, 2);
+ 
+   /* If EXPR is null, make a fat pointer that contains a null pointer to the
+      array (compare_fat_pointers ensures that this is the full discriminant)
+      and a valid pointer to the bounds.  This latter property is necessary
+      since the compiler can hoist the load of the bounds done through it.  */
+   if (integer_zerop (expr))
+     {
+       tree template_type = TREE_TYPE (DECL_CHAIN (TYPE_FIELDS (type)));
+       tree null_bounds, t;
+ 
+       null_bounds = build_constructor (template_type, NULL);
+       TREE_CONSTANT (null_bounds) = TREE_STATIC (null_bounds) = 1;
+ 
+       CONSTRUCTOR_APPEND_ELT (v, TYPE_FIELDS (type),
+ 			      fold_convert (p_array_type, null_pointer_node));
+       CONSTRUCTOR_APPEND_ELT (v, DECL_CHAIN (TYPE_FIELDS (type)) , null_bounds);
+       t = build_constructor (type, v);
+       /* Do not set TREE_CONSTANT so as to force T to static memory.  */
+       TREE_CONSTANT (t) = 0;
+       TREE_STATIC (t) = 1;
+ 
+       return t;
+     }
+ 
+   /* If EXPR is a thin pointer, make template and data from the record.  */
+   if (TYPE_IS_THIN_POINTER_P (etype))
+     {
+       tree field = TYPE_FIELDS (TREE_TYPE (etype));
+ 
+       expr = gnat_protect_expr (expr);
+ 
+       /* If we have a TYPE_UNCONSTRAINED_ARRAY attached to the RECORD_TYPE,
+ 	 the thin pointer value has been shifted so we shift it back to get
+ 	 the template address.  */
+       if (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (etype)))
+ 	{
+ 	  tree template_addr
+ 	    = fold_convert (TREE_TYPE (DECL_CHAIN (TYPE_FIELDS (type))), expr);
+ 	  template_val = build_unary_op (INDIRECT_REF, NULL_TREE, template_addr);
+ 	}
+ 
+       /* Otherwise we explicitly take the address of the fields.  */
+       else
+ 	{
+ 	  expr = build_unary_op (INDIRECT_REF, NULL_TREE, expr);
+ 
+ 	  template_val = build_component_ref (expr, field, true);
+ 
+ 	  expr = build_unary_op (ADDR_EXPR, NULL_TREE,
+ 				 build_component_ref (expr, DECL_CHAIN (field),
+ 						      false));
+ 	}
+     }
+ 
+   else if (TYPE_IS_FAT_POINTER_P (etype))
+     template_val
+       = build_unary_op (INDIRECT_REF, NULL_TREE,
+ 			build_component_ref (expr,
+ 					     DECL_CHAIN (TYPE_FIELDS (etype)),
+ 					     false));
+ 
+   /* Otherwise, build the constructor for the template.  */
+   else
+     template_val = build_template (template_type, TREE_TYPE (etype), expr);
+ 
+   /* The final result is a constructor for the extended pointer.
+ 
+      If EXPR is an argument of a foreign convention subprogram, the type it
+      points to is directly the component type.  In this case, the expression
+      type may not match the corresponding FIELD_DECL type at this point, so we
+      call "convert" here to fix that up if necessary.  This type consistency is
+      required, for instance because it ensures that possible later folding of
+      COMPONENT_REFs against this constructor always yields something of the
+      same type as the initial reference.
+ 
+      Note that the call to "build_template" above is still fine because it
+      will only refer to the provided TEMPLATE_TYPE in this case.  */
+   CONSTRUCTOR_APPEND_ELT (v, TYPE_FIELDS (type), convert (p_array_type, expr));
+   CONSTRUCTOR_APPEND_ELT (v, DECL_CHAIN (TYPE_FIELDS (type)), template_val);
+   return gnat_build_constructor (type, v);
+ }
+ 
  /* Create an expression whose value is that of EXPR,
     converted to type TYPE.  The TREE_TYPE of the value
     is always TYPE.  This function implements all reasonable
*************** convert (tree type, tree expr)
*** 5122,5127 ****
--- 5319,5326 ----
    /* Check for converting to a pointer to an unconstrained array.  */
    if (TYPE_IS_FAT_POINTER_P (type) && !TYPE_IS_FAT_POINTER_P (etype))
      return convert_to_fat_pointer (type, expr);
+   if (TYPE_IS_EXTENDED_POINTER_P (type) && !TYPE_IS_EXTENDED_POINTER_P (etype))
+     return convert_to_extended_pointer (type, expr);
  
    /* If we are converting between two aggregate or vector types that are mere
       variants, just make a VIEW_CONVERT_EXPR.  Likewise when we are converting
*************** convert (tree type, tree expr)
*** 5264,5270 ****
  
        /* If converting fat pointer to normal or thin pointer, get the pointer
  	 to the array and then convert it.  */
!       if (TYPE_IS_FAT_POINTER_P (etype))
  	expr = build_component_ref (expr, TYPE_FIELDS (etype), false);
  
        return fold (convert_to_pointer (type, expr));
--- 5463,5469 ----
  
        /* If converting fat pointer to normal or thin pointer, get the pointer
  	 to the array and then convert it.  */
!       if (TYPE_IS_FAT_POINTER_P (etype) || TYPE_IS_EXTENDED_POINTER_P (etype))
  	expr = build_component_ref (expr, TYPE_FIELDS (etype), false);
  
        return fold (convert_to_pointer (type, expr));
*************** convert (tree type, tree expr)
*** 5328,5347 ****
  	}
  
        /* If EXPR is a constrained array, take its address, convert it to a
! 	 fat pointer, and then dereference it.  Likewise if EXPR is a
! 	 record containing both a template and a constrained array.
! 	 Note that a record representing a justified modular type
! 	 always represents a packed constrained array.  */
        if (ecode == ARRAY_TYPE
  	  || (ecode == INTEGER_TYPE && TYPE_HAS_ACTUAL_BOUNDS_P (etype))
  	  || (ecode == RECORD_TYPE && TYPE_CONTAINS_TEMPLATE_P (etype))
  	  || (ecode == RECORD_TYPE && TYPE_JUSTIFIED_MODULAR_P (etype)))
! 	return
! 	  build_unary_op
! 	    (INDIRECT_REF, NULL_TREE,
! 	     convert_to_fat_pointer (TREE_TYPE (type),
! 				     build_unary_op (ADDR_EXPR,
! 						     NULL_TREE, expr)));
  
        /* Do something very similar for converting one unconstrained
  	 array to another.  */
--- 5527,5556 ----
  	}
  
        /* If EXPR is a constrained array, take its address, convert it to a
! 	 fat or extended pointer, and then dereference it.  Likewise if
! 	 EXPR is a record containing both a template and a constrained
! 	 array.  Note that a record representing a justified modular type
! 	 always represents a packed constrained array. */
        if (ecode == ARRAY_TYPE
  	  || (ecode == INTEGER_TYPE && TYPE_HAS_ACTUAL_BOUNDS_P (etype))
  	  || (ecode == RECORD_TYPE && TYPE_CONTAINS_TEMPLATE_P (etype))
  	  || (ecode == RECORD_TYPE && TYPE_JUSTIFIED_MODULAR_P (etype)))
! 	{
! 	  if (TYPE_IS_EXTENDED_POINTER_P (TREE_TYPE (type)))
! 	    return
! 	      build_unary_op
! 	      (INDIRECT_REF, NULL_TREE,
! 	       convert_to_extended_pointer (TREE_TYPE (type),
! 					    build_unary_op (ADDR_EXPR,
! 							    NULL_TREE, expr)));
! 	  else
! 	    return
! 	      build_unary_op
! 	      (INDIRECT_REF, NULL_TREE,
! 	       convert_to_fat_pointer (TREE_TYPE (type),
! 				       build_unary_op (ADDR_EXPR,
! 						       NULL_TREE, expr)));
! 	}
  
        /* Do something very similar for converting one unconstrained
  	 array to another.  */
diff -Nrcpad gcc-16-20250914/gcc/ada/gcc-interface/utils2.cc gcc-16-20250921/gcc/ada/gcc-interface/utils2.cc
*** gcc-16-20250914/gcc/ada/gcc-interface/utils2.cc	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/gcc-interface/utils2.cc	Sun Sep 21 22:32:34 2025
*************** build_binary_op (enum tree_code op_code,
*** 1294,1299 ****
--- 1294,1307 ----
  	      best_type = left_base_type;
  	    }
  
+ 	  else if (TYPE_IS_EXTENDED_POINTER_P (left_base_type)
+ 	           && TYPE_IS_EXTENDED_POINTER_P (right_base_type))
+ 	    {
+ 	      gcc_assert (TYPE_MAIN_VARIANT (left_base_type)
+ 	                  == TYPE_MAIN_VARIANT (right_base_type));
+ 	      best_type = left_base_type;
+ 	    }
+ 
  	  else if (POINTER_TYPE_P (left_base_type)
  		   && POINTER_TYPE_P (right_base_type))
  	    {
*************** build_unary_op (enum tree_code op_code,
*** 1735,1741 ****
  
  	/* If we want to refer to an unconstrained array, use the appropriate
  	   expression.  But this will never survive down to the back-end.  */
! 	if (TYPE_IS_FAT_POINTER_P (type))
  	  {
  	    result = build1 (UNCONSTRAINED_ARRAY_REF,
  			     TYPE_UNCONSTRAINED_ARRAY (type), operand);
--- 1743,1749 ----
  
  	/* If we want to refer to an unconstrained array, use the appropriate
  	   expression.  But this will never survive down to the back-end.  */
! 	if (TYPE_IS_FAT_POINTER_P (type) || TYPE_IS_EXTENDED_POINTER_P (type))
  	  {
  	    result = build1 (UNCONSTRAINED_ARRAY_REF,
  			     TYPE_UNCONSTRAINED_ARRAY (type), operand);
*************** build_unary_op (enum tree_code op_code,
*** 1754,1760 ****
  	    TREE_READONLY (result) = TYPE_READONLY (TREE_TYPE (type));
  	  }
  
! 	if (!TYPE_IS_FAT_POINTER_P (type) && TYPE_VOLATILE (TREE_TYPE (type)))
  	  {
  	    TREE_SIDE_EFFECTS (result) = 1;
  	    if (INDIRECT_REF_P (result))
--- 1762,1770 ----
  	    TREE_READONLY (result) = TYPE_READONLY (TREE_TYPE (type));
  	  }
  
! 	if (!TYPE_IS_FAT_POINTER_P (type)
! 	    && !TYPE_IS_EXTENDED_POINTER_P (type)
! 	    && TYPE_VOLATILE (TREE_TYPE (type)))
  	  {
  	    TREE_SIDE_EFFECTS (result) = 1;
  	    if (INDIRECT_REF_P (result))
*************** build_allocator (tree type, tree init, t
*** 2607,2613 ****
    /* If RESULT_TYPE is a fat or thin pointer, set SIZE to be the sum of the
       sizes of the object and its template.  Allocate the whole thing and
       fill in the parts that are known.  */
!   else if (TYPE_IS_FAT_OR_THIN_POINTER_P (result_type))
      {
        tree storage_type
  	= build_unc_object_type_from_ptr (result_type, type,
--- 2617,2624 ----
    /* If RESULT_TYPE is a fat or thin pointer, set SIZE to be the sum of the
       sizes of the object and its template.  Allocate the whole thing and
       fill in the parts that are known.  */
!   else if (TYPE_IS_FAT_OR_THIN_POINTER_P (result_type)
! 	   || TYPE_IS_EXTENDED_POINTER_P (result_type))
      {
        tree storage_type
  	= build_unc_object_type_from_ptr (result_type, type,
*************** gnat_save_expr (tree exp)
*** 3053,3059 ****
       This may be more efficient, but will also allow us to more easily find
       the match for the PLACEHOLDER_EXPR.  */
    if (code == COMPONENT_REF
!       && TYPE_IS_FAT_POINTER_P (TREE_TYPE (TREE_OPERAND (exp, 0))))
      return build3 (code, type, gnat_save_expr (TREE_OPERAND (exp, 0)),
  		   TREE_OPERAND (exp, 1), NULL_TREE);
  
--- 3064,3071 ----
       This may be more efficient, but will also allow us to more easily find
       the match for the PLACEHOLDER_EXPR.  */
    if (code == COMPONENT_REF
!       && (TYPE_IS_FAT_POINTER_P (TREE_TYPE (TREE_OPERAND (exp, 0)))
! 	  || TYPE_IS_EXTENDED_POINTER_P (TREE_TYPE (TREE_OPERAND (exp, 0)))))
      return build3 (code, type, gnat_save_expr (TREE_OPERAND (exp, 0)),
  		   TREE_OPERAND (exp, 1), NULL_TREE);
  
*************** gnat_protect_expr (tree exp)
*** 3122,3128 ****
       This may be more efficient, but will also allow us to more easily find
       the match for the PLACEHOLDER_EXPR.  */
    if (code == COMPONENT_REF
!       && TYPE_IS_FAT_POINTER_P (TREE_TYPE (TREE_OPERAND (exp, 0))))
      return build3 (code, type, gnat_protect_expr (TREE_OPERAND (exp, 0)),
  		   TREE_OPERAND (exp, 1), NULL_TREE);
  
--- 3134,3141 ----
       This may be more efficient, but will also allow us to more easily find
       the match for the PLACEHOLDER_EXPR.  */
    if (code == COMPONENT_REF
!       && (TYPE_IS_FAT_POINTER_P (TREE_TYPE (TREE_OPERAND (exp, 0)))
! 	  || TYPE_IS_EXTENDED_POINTER_P (TREE_TYPE (TREE_OPERAND (exp, 0)))))
      return build3 (code, type, gnat_protect_expr (TREE_OPERAND (exp, 0)),
  		   TREE_OPERAND (exp, 1), NULL_TREE);
  
*************** gnat_protect_expr (tree exp)
*** 3130,3135 ****
--- 3143,3149 ----
       for a CALL_EXPR as large objects are returned via invisible reference
       in most ABIs so the temporary will directly be filled by the callee.  */
    if (TYPE_IS_FAT_POINTER_P (type)
+       || TYPE_IS_EXTENDED_POINTER_P (type)
        || !AGGREGATE_TYPE_P (type)
        || code == CALL_EXPR)
      return save_expr (exp);
*************** gnat_stabilize_reference_1 (tree e, void
*** 3166,3172 ****
  	 fat pointer.  This may be more efficient, but will also allow
  	 us to more easily find the match for the PLACEHOLDER_EXPR.  */
        if (code == COMPONENT_REF
! 	  && TYPE_IS_FAT_POINTER_P (TREE_TYPE (TREE_OPERAND (e, 0))))
  	result
  	  = build3 (code, type,
  		    gnat_stabilize_reference_1 (TREE_OPERAND (e, 0), data),
--- 3180,3187 ----
  	 fat pointer.  This may be more efficient, but will also allow
  	 us to more easily find the match for the PLACEHOLDER_EXPR.  */
        if (code == COMPONENT_REF
! 	  && (TYPE_IS_FAT_POINTER_P (TREE_TYPE (TREE_OPERAND (e, 0)))
! 	      || TYPE_IS_EXTENDED_POINTER_P (TREE_TYPE (TREE_OPERAND (e, 0)))))
  	result
  	  = build3 (code, type,
  		    gnat_stabilize_reference_1 (TREE_OPERAND (e, 0), data),
diff -Nrcpad gcc-16-20250914/gcc/ada/gen_il-fields.ads gcc-16-20250921/gcc/ada/gen_il-fields.ads
*** gcc-16-20250914/gcc/ada/gen_il-fields.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/gen_il-fields.ads	Sun Sep 21 22:32:34 2025
*************** package Gen_IL.Fields is
*** 282,287 ****
--- 282,288 ----
        Is_SPARK_Mode_On_Node,
        Is_Static_Coextension,
        Is_Static_Expression,
+       Is_Structural,
        Is_Subprogram_Descriptor,
        Is_Task_Allocation_Block,
        Is_Task_Body_Procedure,
*************** package Gen_IL.Fields is
*** 743,748 ****
--- 744,750 ----
        Is_Immediately_Visible,
        Is_Implementation_Defined,
        Is_Implicit_Full_View,
+       Is_Implicit_Ghost,
        Is_Imported,
        Is_Independent,
        Is_Initial_Condition_Procedure,
*************** package Gen_IL.Fields is
*** 762,767 ****
--- 764,770 ----
        Is_Limited_Composite,
        Is_Limited_Interface,
        Is_Limited_Record,
+       Is_Link_Once,
        Is_Local_Anonymous_Access,
        Is_Loop_Parameter,
        Is_Machine_Code_Subprogram,
diff -Nrcpad gcc-16-20250914/gcc/ada/gen_il-gen-gen_entities.adb gcc-16-20250921/gcc/ada/gen_il-gen-gen_entities.adb
*** gcc-16-20250914/gcc/ada/gen_il-gen-gen_entities.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/gen_il-gen-gen_entities.adb	Sun Sep 21 22:32:34 2025
*************** begin -- Gen_IL.Gen.Gen_Entities
*** 159,164 ****
--- 159,165 ----
          Sm (Is_Ignored_Ghost_Entity, Flag),
          Sm (Is_Immediately_Visible, Flag),
          Sm (Is_Implementation_Defined, Flag),
+         Sm (Is_Implicit_Ghost, Flag),
          Sm (Is_Imported, Flag),
          Sm (Is_Independent, Flag),
          Sm (Is_Inlined, Flag),
*************** begin -- Gen_IL.Gen.Gen_Entities
*** 174,179 ****
--- 175,181 ----
          Sm (Is_Limited_Composite, Flag),
          Sm (Is_Limited_Interface, Flag),
          Sm (Is_Limited_Record, Flag),
+         Sm (Is_Link_Once, Flag),
          Sm (Is_Loop_Parameter, Flag),
          Sm (Is_Obsolescent, Flag),
          Sm (Is_Package_Body_Entity, Flag),
diff -Nrcpad gcc-16-20250914/gcc/ada/gen_il-gen-gen_nodes.adb gcc-16-20250921/gcc/ada/gen_il-gen-gen_nodes.adb
*** gcc-16-20250914/gcc/ada/gen_il-gen-gen_nodes.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/gen_il-gen-gen_nodes.adb	Sun Sep 21 22:32:34 2025
*************** begin -- Gen_IL.Gen.Gen_Nodes
*** 687,699 ****
         (Sy (Defining_Unit_Name, Node_Id),
          Sy (Name, Node_Id, Default_Empty),
          Sy (Generic_Associations, List_Id, Default_No_List),
          Sm (Instance_Spec, Node_Id),
          Sm (Is_Declaration_Level_Node, Flag),
          Sm (Is_Elaboration_Checks_OK_Node, Flag),
          Sm (Is_Elaboration_Warnings_OK_Node, Flag),
          Sm (Is_Known_Guaranteed_ABE, Flag),
          Sm (Is_SPARK_Mode_On_Node, Flag),
!         Sm (Parent_Spec, Node_Id)));
  
     Ab (N_Subprogram_Instantiation, N_Generic_Instantiation,
         (Sy (Must_Override, Flag),
--- 687,700 ----
         (Sy (Defining_Unit_Name, Node_Id),
          Sy (Name, Node_Id, Default_Empty),
          Sy (Generic_Associations, List_Id, Default_No_List),
+         Sm (Parent_Spec, Node_Id),
          Sm (Instance_Spec, Node_Id),
          Sm (Is_Declaration_Level_Node, Flag),
          Sm (Is_Elaboration_Checks_OK_Node, Flag),
          Sm (Is_Elaboration_Warnings_OK_Node, Flag),
          Sm (Is_Known_Guaranteed_ABE, Flag),
          Sm (Is_SPARK_Mode_On_Node, Flag),
!         Sm (Is_Structural, Flag)));
  
     Ab (N_Subprogram_Instantiation, N_Generic_Instantiation,
         (Sy (Must_Override, Flag),
diff -Nrcpad gcc-16-20250914/gcc/ada/ghost.adb gcc-16-20250921/gcc/ada/ghost.adb
*** gcc-16-20250914/gcc/ada/ghost.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/ghost.adb	Sun Sep 21 22:32:34 2025
*************** package body Ghost is
*** 94,108 ****
     --  Returns the Assertion_Level entity if the node has a Ghost aspect and
     --  the Ghost aspect is using an Assertion_Level.
  
     function Ghost_Policy_In_Effect (Id : Entity_Id) return Name_Id;
!    --  Returns the first Assertion Policy in place for either Ghost or the
!    --  Assertion_Level associated with Ghost aspect on the the declaration node
!    --  Decl.
  
     procedure Install_Ghost_Region
!      (Mode  : Name_Id;
!       N     : Node_Id;
!       Level : Entity_Id);
     pragma Inline (Install_Ghost_Region);
     --  Install a Ghost region comprised of mode Mode and ignored region start
     --  node N and Level as the Assertion_Level that was associated with it.
--- 94,123 ----
     --  Returns the Assertion_Level entity if the node has a Ghost aspect and
     --  the Ghost aspect is using an Assertion_Level.
  
+    function Ghost_Assertion_Level_In_Effect (Id : Entity_Id) return Entity_Id;
+    --  Returns the ghost level applicable for the given entity Id in a similar
+    --  manner as Ghost_Policy_In_Effect.
+ 
     function Ghost_Policy_In_Effect (Id : Entity_Id) return Name_Id;
!    --  Returns the ghost policy applicable for the given entity Id.
!    --
!    --  SPARK RM 6.9 (3):
!    --
!    --  An object declaration which occurs inside an expression in a ghost
!    --  declaration, statement, assertion pragma or specification aspect
!    --  declaration is a ghost declaration.
!    --
!    --  If this declaration does not have the Ghost aspect specified, the
!    --  assertion policy applicable to this declaration comes from the policy
!    --  applicable to the enclosing declaration, statement, assertion pragma
!    --  or specification aspect.
!    --
!    --  Otherwise, the assertion policy applicable to an object declaration
!    --  comes either from its assertion level if any, or from the ghost
!    --  policy at the point of declaration.
  
     procedure Install_Ghost_Region
!      (Mode : Name_Id; N : Node_Id; Level : Entity_Id);
     pragma Inline (Install_Ghost_Region);
     --  Install a Ghost region comprised of mode Mode and ignored region start
     --  node N and Level as the Assertion_Level that was associated with it.
*************** package body Ghost is
*** 211,217 ****
        Policy := Ghost_Policy_In_Effect (Prev_Id);
  
        --  The Ghost policy in effect at the point of declaration and at the
!       --  point of completion must match (SPARK RM 6.9(16)).
  
        if Is_Checked_Ghost_Entity (Prev_Id)
          and then Policy = Name_Ignore
--- 226,232 ----
        Policy := Ghost_Policy_In_Effect (Prev_Id);
  
        --  The Ghost policy in effect at the point of declaration and at the
!       --  point of completion must match (SPARK RM 6.9(19)).
  
        if Is_Checked_Ghost_Entity (Prev_Id)
          and then Policy = Name_Ignore
*************** package body Ghost is
*** 245,251 ****
  
        function Is_OK_Ghost_Context (Context : Node_Id) return Boolean;
        --  Determine whether node Context denotes a Ghost-friendly context where
!       --  a Ghost entity can safely reside (SPARK RM 6.9(10)).
  
        function In_Aspect_Or_Pragma_Predicate (N : Node_Id) return Boolean;
        --  Return True iff N is enclosed in an aspect or pragma Predicate
--- 260,266 ----
  
        function Is_OK_Ghost_Context (Context : Node_Id) return Boolean;
        --  Determine whether node Context denotes a Ghost-friendly context where
!       --  a Ghost entity can safely reside (SPARK RM 6.9(13)).
  
        function In_Aspect_Or_Pragma_Predicate (N : Node_Id) return Boolean;
        --  Return True iff N is enclosed in an aspect or pragma Predicate
*************** package body Ghost is
*** 263,271 ****
           --
           --    * Be subject to pragma Ghost
  
!          function Is_OK_Pragma (Prag : Node_Id; Id : Entity_Id) return Boolean;
!          --  Determine whether node Prag is a suitable context for a reference
!          --  to a Ghost entity Id. To qualify as such, Prag must either
           --
           --    * Be an assertion expression pragma
           --
--- 278,286 ----
           --
           --    * Be subject to pragma Ghost
  
!          function Is_OK_Pragma (Prag : Node_Id) return Boolean;
!          --  Determine whether node Prag is a suitable context for a ghost
!          --  reference. To qualify as such, Prag must either
           --
           --    * Be an assertion expression pragma
           --
*************** package body Ghost is
*** 409,453 ****
           -- Is_OK_Pragma --
           ------------------
  
!          function Is_OK_Pragma (Prag : Node_Id; Id : Entity_Id) return Boolean
           is
-             procedure Check_Policies;
-             --  Verify that the Ghost policy in effect at the point of the
-             --  declaration of Ghost entity Id (if present) is the same as
-             --  the assertion policy for the pragma. Emit an error if this
-             --  is not the case.
- 
-             --------------------
-             -- Check_Policies --
-             --------------------
- 
-             procedure Check_Policies is
-             begin
-                --  If the Ghost policy in effect at the point of the
-                --  declaration of Ghost entity Id is Ignore, then the assertion
-                --  policy of the pragma must be Ignore (SPARK RM 6.9(20)).
- 
-                if Present (Id)
-                  and then not Is_Checked_Ghost_Entity (Id)
-                  and then not Is_Ignored (Prag)
-                then
-                   Error_Msg_N (Ghost_Policy_Error_Msg, Ghost_Ref);
-                   Error_Msg_NE
-                     ("\ghost entity & has policy `Ignore`",
-                      Ghost_Ref, Ghost_Id);
-                   Error_Msg_N
-                     ("\assertion expression has policy `Check`",
-                      Ghost_Ref);
-                end if;
-             end Check_Policies;
- 
-             --  Local variables
- 
              Prag_Id  : Pragma_Id;
              Prag_Nam : Name_Id;
  
-          --  Start of processing for Is_OK_Pragma
- 
           begin
              if Nkind (Prag) /= N_Pragma then
                 return False;
--- 424,434 ----
           -- Is_OK_Pragma --
           ------------------
  
!          function Is_OK_Pragma (Prag : Node_Id) return Boolean
           is
              Prag_Id  : Pragma_Id;
              Prag_Nam : Name_Id;
  
           begin
              if Nkind (Prag) /= N_Pragma then
                 return False;
*************** package body Ghost is
*** 471,498 ****
                 return True;
  
              --  An assertion expression pragma is Ghost when it contains a
!             --  reference to a Ghost entity (SPARK RM 6.9(10)), except for
!             --  predicate pragmas (SPARK RM 6.9(11)).
  
              elsif Is_Valid_Assertion_Kind (Prag_Nam)
                and then Assertion_Expression_Pragma (Prag_Id)
                and then Prag_Id /= Pragma_Predicate
              then
-                --  Ensure that the assertion policy and the Ghost policy are
-                --  compatible (SPARK RM 6.9(20)).
- 
-                Check_Policies;
                 return True;
  
              --  A pragma that applies to a Ghost construct or specifies an
!             --  aspect of a Ghost entity is a Ghost pragma (SPARK RM 6.9(3))
  
              elsif Is_Ghost_Pragma (Prag) then
                 return True;
  
              --  Several pragmas that may apply to a non-Ghost entity are
              --  treated as Ghost when they contain a reference to a Ghost
!             --  entity (SPARK RM 6.9(11)).
  
              elsif Prag_Nam
                    in Name_Global
--- 452,475 ----
                 return True;
  
              --  An assertion expression pragma is Ghost when it contains a
!             --  reference to a Ghost entity (SPARK RM 6.9(13)), except for
!             --  predicate pragmas (SPARK RM 6.9(14)).
  
              elsif Is_Valid_Assertion_Kind (Prag_Nam)
                and then Assertion_Expression_Pragma (Prag_Id)
                and then Prag_Id /= Pragma_Predicate
              then
                 return True;
  
              --  A pragma that applies to a Ghost construct or specifies an
!             --  aspect of a Ghost entity is a Ghost pragma (SPARK RM 6.9(4))
  
              elsif Is_Ghost_Pragma (Prag) then
                 return True;
  
              --  Several pragmas that may apply to a non-Ghost entity are
              --  treated as Ghost when they contain a reference to a Ghost
!             --  entity (SPARK RM 6.9(18)).
  
              elsif Prag_Nam
                    in Name_Global
*************** package body Ghost is
*** 546,567 ****
                 --  within an assignment statement whose target is a ghost
                 --  variable that is assertion-level-dependent on E.
  
!                if not Is_Assertion_Level_Dependent (Id_Level, Assignee_Level)
                 then
-                   Error_Msg_Sloc := Sloc (Ghost_Ref);
- 
                    Error_Msg_N (Assertion_Level_Error_Msg, Ghost_Ref);
                    Error_Msg_Name_1 := Chars (Id_Level);
!                   Error_Msg_NE ("\& has assertion level %", Ghost_Ref, Id);
                    Error_Msg_Name_1 := Chars (Assignee_Level);
                    Error_Msg_Node_2 := Assignee;
!                   Error_Msg_NE
!                     ("\& is modifying & with %", Ghost_Ref, Id);
!                   Error_Msg_Name_1 := Chars (Assignee_Level);
                    Error_Msg_NE
                      ("\assertion level of & should depend on %",
                       Ghost_Ref,
!                      Id);
                 end if;
              end Check_Assignment_Levels;
  
--- 523,541 ----
                 --  within an assignment statement whose target is a ghost
                 --  variable that is assertion-level-dependent on E.
  
!                if not Is_Assertion_Level_Dependent (Assignee_Level, Id_Level)
                 then
                    Error_Msg_N (Assertion_Level_Error_Msg, Ghost_Ref);
                    Error_Msg_Name_1 := Chars (Id_Level);
!                   Error_Msg_N ("\& has assertion level %", Ghost_Ref);
                    Error_Msg_Name_1 := Chars (Assignee_Level);
                    Error_Msg_Node_2 := Assignee;
!                   Error_Msg_NE ("\& is modifying & with %", Ghost_Ref, Id);
!                   Error_Msg_Name_1 := Chars (Id_Level);
                    Error_Msg_NE
                      ("\assertion level of & should depend on %",
                       Ghost_Ref,
!                      Assignee);
                 end if;
              end Check_Assignment_Levels;
  
*************** package body Ghost is
*** 716,726 ****
                    return True;
  
                 --  A reference to a Ghost entity can appear within an aspect
!                --  specification (SPARK RM 6.9(10)). The precise checking will
                 --  occur when analyzing the corresponding pragma. We make an
                 --  exception for predicate aspects other than Ghost_Predicate
                 --  that only allow referencing a Ghost entity when the
!                --  corresponding type declaration is Ghost (SPARK RM 6.9(11)).
  
                 elsif Nkind (Par) = N_Aspect_Specification
                   and then
--- 690,700 ----
                    return True;
  
                 --  A reference to a Ghost entity can appear within an aspect
!                --  specification (SPARK RM 6.9(13)). The precise checking will
                 --  occur when analyzing the corresponding pragma. We make an
                 --  exception for predicate aspects other than Ghost_Predicate
                 --  that only allow referencing a Ghost entity when the
!                --  corresponding type declaration is Ghost (SPARK RM 6.9(14)).
  
                 elsif Nkind (Par) = N_Aspect_Specification
                   and then
*************** package body Ghost is
*** 731,737 ****
                    return True;
  
                 --  A Ghost type may be referenced in a use or use_type clause
!                --  (SPARK RM 6.9(10)).
  
                 elsif Present (Parent (Par))
                   and then Nkind (Parent (Par)) in N_Use_Package_Clause
--- 705,711 ----
                    return True;
  
                 --  A Ghost type may be referenced in a use or use_type clause
!                --  (SPARK RM 6.9(13)).
  
                 elsif Present (Parent (Par))
                   and then Nkind (Parent (Par)) in N_Use_Package_Clause
*************** package body Ghost is
*** 769,775 ****
                 elsif Is_OK_Declaration (Par) then
                    return True;
  
!                elsif Is_OK_Pragma (Par, Ghost_Id) then
                    return True;
  
                 elsif Is_OK_Statement (Par, Ghost_Id, Prev) then
--- 743,749 ----
                 elsif Is_OK_Declaration (Par) then
                    return True;
  
!                elsif Is_OK_Pragma (Par) then
                    return True;
  
                 elsif Is_OK_Statement (Par, Ghost_Id, Prev) then
*************** package body Ghost is
*** 851,857 ****
           end if;
  
           --  The Ghost policy in effect a the point of declaration and at the
!          --  point of use must match (SPARK RM 6.9(15)).
  
           if Is_Checked_Ghost_Entity (Id)
             and then Applic_Policy = Ignore
--- 825,831 ----
           end if;
  
           --  The Ghost policy in effect a the point of declaration and at the
!          --  point of use must match (SPARK RM 6.9(18)).
  
           if Is_Checked_Ghost_Entity (Id)
             and then Applic_Policy = Ignore
*************** package body Ghost is
*** 870,876 ****
           --  assertion-level-dependent on E except in the following cases the
           --  specified aspect is either Global, Depends, Refined_Global,
           --  Refined_Depends, Initializes, Refined_State, or Iterable (SPARK RM
!          --  6.9(15)).
  
           if No (Ghost_Region)
             or else (Nkind (Ghost_Region) = N_Pragma
--- 844,850 ----
           --  assertion-level-dependent on E except in the following cases the
           --  specified aspect is either Global, Depends, Refined_Global,
           --  Refined_Depends, Initializes, Refined_State, or Iterable (SPARK RM
!          --  6.9(14)).
  
           if No (Ghost_Region)
             or else (Nkind (Ghost_Region) = N_Pragma
*************** package body Ghost is
*** 932,937 ****
--- 906,915 ----
     --  Start of processing for Check_Ghost_Context
  
     begin
+       if Ghost_Context_Checks_Disabled then
+          return;
+       end if;
+ 
        --  Class-wide pre/postconditions of ignored pragmas are preanalyzed
        --  to report errors on wrong conditions; however, ignored pragmas may
        --  also have references to ghost entities and we must disable checking
*************** package body Ghost is
*** 949,955 ****
        end if;
  
        --  If the Ghost entity appears in a non-Ghost context and affects
!       --  its behavior or value (SPARK RM 6.9(10,11)).
  
        if not Is_OK_Ghost_Context (Ghost_Ref) then
           Error_Msg_N ("ghost entity cannot appear in this context", Ghost_Ref);
--- 927,933 ----
        end if;
  
        --  If the Ghost entity appears in a non-Ghost context and affects
!       --  its behavior or value (SPARK RM 6.9(13,14)).
  
        if not Is_OK_Ghost_Context (Ghost_Ref) then
           Error_Msg_N ("ghost entity cannot appear in this context", Ghost_Ref);
*************** package body Ghost is
*** 1194,1200 ****
        Deriv_Typ := Find_Dispatching_Type (Subp);
  
        --  A Ghost primitive of a non-Ghost type extension cannot override an
!       --  inherited non-Ghost primitive (SPARK RM 6.9(8)).
  
        if Is_Ghost_Entity (Subp)
           and then Present (Deriv_Typ)
--- 1172,1178 ----
        Deriv_Typ := Find_Dispatching_Type (Subp);
  
        --  A Ghost primitive of a non-Ghost type extension cannot override an
!       --  inherited non-Ghost primitive (SPARK RM 6.9(10)).
  
        if Is_Ghost_Entity (Subp)
           and then Present (Deriv_Typ)
*************** package body Ghost is
*** 1212,1218 ****
        end if;
  
        --  A non-Ghost primitive of a type extension cannot override an
!       --  inherited Ghost primitive (SPARK RM 6.9(8)).
  
        if Is_Ghost_Entity (Over_Subp)
          and then not Is_Ghost_Entity (Subp)
--- 1190,1196 ----
        end if;
  
        --  A non-Ghost primitive of a type extension cannot override an
!       --  inherited Ghost primitive (SPARK RM 6.9(10)).
  
        if Is_Ghost_Entity (Over_Subp)
          and then not Is_Ghost_Entity (Subp)
*************** package body Ghost is
*** 1233,1239 ****
           --  When a tagged type is either non-Ghost or checked Ghost and
           --  one of its primitives overrides an inherited operation, the
           --  overridden operation of the ancestor type must be ignored Ghost
!          --  if the primitive is ignored Ghost (SPARK RM 6.9(19)).
  
           if Is_Ignored_Ghost_Entity (Subp) then
  
--- 1211,1217 ----
           --  When a tagged type is either non-Ghost or checked Ghost and
           --  one of its primitives overrides an inherited operation, the
           --  overridden operation of the ancestor type must be ignored Ghost
!          --  if the primitive is ignored Ghost (SPARK RM 6.9(21)).
  
           if Is_Ignored_Ghost_Entity (Subp) then
  
*************** package body Ghost is
*** 1272,1278 ****
           --  When a tagged type is either non-Ghost or checked Ghost and
           --  one of its primitives overrides an inherited operation, the
           --  the primitive of the tagged type must be ignored Ghost if the
!          --  overridden operation is ignored Ghost (SPARK RM 6.9(19)).
  
           elsif Is_Ignored_Ghost_Entity (Over_Subp) then
  
--- 1250,1256 ----
           --  When a tagged type is either non-Ghost or checked Ghost and
           --  one of its primitives overrides an inherited operation, the
           --  the primitive of the tagged type must be ignored Ghost if the
!          --  overridden operation is ignored Ghost (SPARK RM 6.9(21)).
  
           elsif Is_Ignored_Ghost_Entity (Over_Subp) then
  
*************** package body Ghost is
*** 1325,1331 ****
        end if;
  
        --  The Ghost policy in effect at the point of declaration of a primitive
!       --  operation and a tagged type must match (SPARK RM 6.9(20)).
  
        if Is_Checked_Ghost_Entity (Prim)
          and then Is_Ignored_Ghost_Entity (Typ)
--- 1303,1309 ----
        end if;
  
        --  The Ghost policy in effect at the point of declaration of a primitive
!       --  operation and a tagged type must match (SPARK RM 6.9(21)).
  
        if Is_Checked_Ghost_Entity (Prim)
          and then Is_Ignored_Ghost_Entity (Typ)
*************** package body Ghost is
*** 1391,1397 ****
        end if;
  
        --  The Ghost policy in effect at the point of an ignored abstract state
!       --  cannot be check (SPARK RM 6.9(19)).
  
        if Is_Ignored_Ghost_Entity (State_Id)
          and then Is_Checked_Ghost_Entity (Constit_Id)
--- 1369,1375 ----
        end if;
  
        --  The Ghost policy in effect at the point of an ignored abstract state
!       --  cannot be check (SPARK RM 6.9(20)).
  
        if Is_Ignored_Ghost_Entity (State_Id)
          and then Is_Checked_Ghost_Entity (Constit_Id)
*************** package body Ghost is
*** 1450,1463 ****
              Conc_Typ := Typ;
           end if;
  
!          --  A Ghost type cannot be concurrent (SPARK RM 6.9(21)). Verify this
           --  legality rule first to give a finer-grained diagnostic.
  
           if Present (Conc_Typ) then
              Error_Msg_N ("ghost type & cannot be concurrent", Conc_Typ);
           end if;
  
!          --  A Ghost type cannot be effectively volatile (SPARK RM 6.9(7))
  
           if Is_Effectively_Volatile (Full_Typ) then
              Error_Msg_N ("ghost type & cannot be volatile", Full_Typ);
--- 1428,1441 ----
              Conc_Typ := Typ;
           end if;
  
!          --  A Ghost type cannot be concurrent (SPARK RM 6.9(22)). Verify this
           --  legality rule first to give a finer-grained diagnostic.
  
           if Present (Conc_Typ) then
              Error_Msg_N ("ghost type & cannot be concurrent", Conc_Typ);
           end if;
  
!          --  A Ghost type cannot be effectively volatile (SPARK RM 6.9(9))
  
           if Is_Effectively_Volatile (Full_Typ) then
              Error_Msg_N ("ghost type & cannot be volatile", Full_Typ);
*************** package body Ghost is
*** 1557,1562 ****
--- 1535,1556 ----
        return Empty;
     end Get_Ghost_Assertion_Level;
  
+    -------------------------------------
+    -- Ghost_Assertion_Level_In_Effect --
+    -------------------------------------
+ 
+    function Ghost_Assertion_Level_In_Effect (Id : Entity_Id) return Entity_Id
+    is
+    begin
+       if Ghost_Config.Is_Inside_Statement_Or_Pragma
+         and then Is_Implicit_Ghost (Id)
+       then
+          return Ghost_Config.Ghost_Mode_Assertion_Level;
+       else
+          return Ghost_Assertion_Level (Id);
+       end if;
+    end Ghost_Assertion_Level_In_Effect;
+ 
     ----------------------------
     -- Ghost_Policy_In_Effect --
     ----------------------------
*************** package body Ghost is
*** 1566,1572 ****
        Level_Nam : constant Name_Id :=
          (if No (Level) then No_Name else Chars (Level));
     begin
!       return Policy_In_Effect (Name_Ghost, Level_Nam);
     end Ghost_Policy_In_Effect;
  
     --------------------------------
--- 1560,1581 ----
        Level_Nam : constant Name_Id :=
          (if No (Level) then No_Name else Chars (Level));
     begin
!       if Ghost_Config.Is_Inside_Statement_Or_Pragma
!         and then Is_Implicit_Ghost (Id)
!       then
!          case Ghost_Config.Ghost_Mode is
!             when Check =>
!                return Name_Check;
! 
!             when Ignore =>
!                return Name_Ignore;
! 
!             when None =>
!                return No_Name;
!          end case;
!       else
!          return Policy_In_Effect (Name_Ghost, Level_Nam);
!       end if;
     end Ghost_Policy_In_Effect;
  
     --------------------------------
*************** package body Ghost is
*** 1638,1649 ****
        Ghost_Config.Current_Region := N;
        Ghost_Config.Ghost_Mode := Mode;
        Ghost_Config.Ghost_Mode_Assertion_Level := Level;
     end Install_Ghost_Region;
  
     procedure Install_Ghost_Region
!      (Mode  : Name_Id;
!       N     : Node_Id;
!       Level : Entity_Id) is
     begin
        Install_Ghost_Region (Name_To_Ghost_Mode (Mode), N, Level);
     end Install_Ghost_Region;
--- 1647,1664 ----
        Ghost_Config.Current_Region := N;
        Ghost_Config.Ghost_Mode := Mode;
        Ghost_Config.Ghost_Mode_Assertion_Level := Level;
+ 
+       if Nkind (Ghost_Config.Current_Region)
+          in N_Statement_Other_Than_Procedure_Call
+           | N_Procedure_Call_Statement
+           | N_Pragma
+       then
+          Ghost_Config.Is_Inside_Statement_Or_Pragma := True;
+       end if;
     end Install_Ghost_Region;
  
     procedure Install_Ghost_Region
!      (Mode : Name_Id; N : Node_Id; Level : Entity_Id) is
     begin
        Install_Ghost_Region (Name_To_Ghost_Mode (Mode), N, Level);
     end Install_Ghost_Region;
*************** package body Ghost is
*** 1653,1666 ****
     -------------------------
  
     function Is_Assertion_Level_Dependent
!      (Self : Entity_Id; Other : Entity_Id) return Boolean
!    is
     begin
        return
!          Self = Standard_Level_Default
!          or else Other = Standard_Level_Default
!          or else Is_Same_Or_Depends_On_Level (Self, Other)
!          or else Is_Same_Or_Depends_On_Level (Self, Standard_Level_Static);
     end Is_Assertion_Level_Dependent;
  
     -------------------------
--- 1668,1680 ----
     -------------------------
  
     function Is_Assertion_Level_Dependent
!      (Self : Entity_Id; Other : Entity_Id) return Boolean is
     begin
        return
!         Self = Standard_Level_Default
!         or else Other = Standard_Level_Default
!         or else Is_Same_Or_Depends_On_Level (Self, Other)
!         or else Is_Same_Or_Depends_On_Level (Self, Standard_Level_Static);
     end Is_Assertion_Level_Dependent;
  
     -------------------------
*************** package body Ghost is
*** 1899,1910 ****
                ("\& is modified in a region with `Ignore`", N, Assignee);
           end if;
  
           if Present (Region_Level)
             and then not Is_Assertion_Level_Dependent
!                           (Region_Level, Assignee_Level)
           then
-             Error_Msg_Sloc := Sloc (N);
- 
              Error_Msg_N (Assertion_Level_Error_Msg, N);
              Error_Msg_Name_1 := Chars (Assignee_Level);
              Error_Msg_NE ("\& has assertion level %", N, Assignee);
--- 1913,1926 ----
                ("\& is modified in a region with `Ignore`", N, Assignee);
           end if;
  
+          --  If an assignment to a part of a ghost variable occurs in a ghost
+          --  entity, then the variable should be assertion-level-dependent on
+          --  this entity (SPARK RM 6.9(18)).
+ 
           if Present (Region_Level)
             and then not Is_Assertion_Level_Dependent
!                           (Assignee_Level, Region_Level)
           then
              Error_Msg_N (Assertion_Level_Error_Msg, N);
              Error_Msg_Name_1 := Chars (Assignee_Level);
              Error_Msg_NE ("\& has assertion level %", N, Assignee);
*************** package body Ghost is
*** 1973,1982 ****
     -- Mark_And_Set_Ghost_Body --
     -----------------------------
  
!    procedure Mark_And_Set_Ghost_Body
!      (N       : Node_Id;
!       Spec_Id : Entity_Id)
!    is
        Body_Id : constant Entity_Id := Defining_Entity (N);
        Level   : Entity_Id := Empty;
        Policy  : Name_Id := No_Name;
--- 1989,1995 ----
     -- Mark_And_Set_Ghost_Body --
     -----------------------------
  
!    procedure Mark_And_Set_Ghost_Body (N : Node_Id; Spec_Id : Entity_Id) is
        Body_Id : constant Entity_Id := Defining_Entity (N);
        Level   : Entity_Id := Empty;
        Policy  : Name_Id := No_Name;
*************** package body Ghost is
*** 1987,1996 ****
        if Is_Subject_To_Ghost (N) then
           if Present (Spec_Id) then
              Policy := Ghost_Policy_In_Effect (Spec_Id);
!             Level  := Ghost_Assertion_Level (Spec_Id);
           else
              Policy := Ghost_Policy_In_Effect (Body_Id);
!             Level  := Ghost_Assertion_Level (Body_Id);
           end if;
  
        --  A body declared within a Ghost region is automatically Ghost
--- 2000,2009 ----
        if Is_Subject_To_Ghost (N) then
           if Present (Spec_Id) then
              Policy := Ghost_Policy_In_Effect (Spec_Id);
!             Level := Ghost_Assertion_Level_In_Effect (Spec_Id);
           else
              Policy := Ghost_Policy_In_Effect (Body_Id);
!             Level := Ghost_Assertion_Level_In_Effect (Body_Id);
           end if;
  
        --  A body declared within a Ghost region is automatically Ghost
*************** package body Ghost is
*** 1998,2008 ****
  
        elsif Ghost_Config.Ghost_Mode = Check then
           Policy := Name_Check;
!          Level  := Ghost_Config.Ghost_Mode_Assertion_Level;
  
        elsif Ghost_Config.Ghost_Mode = Ignore then
           Policy := Name_Ignore;
!          Level  := Ghost_Config.Ghost_Mode_Assertion_Level;
  
        --  Inherit the "ghostness" of the previous declaration when the body
        --  acts as a completion.
--- 2011,2021 ----
  
        elsif Ghost_Config.Ghost_Mode = Check then
           Policy := Name_Check;
!          Level := Ghost_Config.Ghost_Mode_Assertion_Level;
  
        elsif Ghost_Config.Ghost_Mode = Ignore then
           Policy := Name_Ignore;
!          Level := Ghost_Config.Ghost_Mode_Assertion_Level;
  
        --  Inherit the "ghostness" of the previous declaration when the body
        --  acts as a completion.
*************** package body Ghost is
*** 2019,2033 ****
        end if;
  
        --  The Ghost policy in effect at the point of declaration and at the
!       --  point of completion must match (SPARK RM 6.9(16)).
! 
!       Check_Ghost_Completion
!         (Prev_Id  => Spec_Id,
!          Compl_Id => Body_Id);
  
!       if Present (Level) then
!          Set_Ghost_Assertion_Level (Body_Id, Level);
!       end if;
  
        --  Mark the body as its formals as Ghost
  
--- 2032,2040 ----
        end if;
  
        --  The Ghost policy in effect at the point of declaration and at the
!       --  point of completion must match (SPARK RM 6.9(18)).
  
!       Check_Ghost_Completion (Prev_Id => Spec_Id, Compl_Id => Body_Id);
  
        --  Mark the body as its formals as Ghost
  
*************** package body Ghost is
*** 2075,2081 ****
        end if;
  
        --  The Ghost policy in effect at the point of declaration and at the
!       --  point of completion must match (SPARK RM 6.9(16)).
  
        Check_Ghost_Completion
          (Prev_Id  => Prev_Id,
--- 2082,2088 ----
        end if;
  
        --  The Ghost policy in effect at the point of declaration and at the
!       --  point of completion must match (SPARK RM 6.9(18)).
  
        Check_Ghost_Completion
          (Prev_Id  => Prev_Id,
*************** package body Ghost is
*** 2437,2452 ****
        end if;
     end Mark_Ghost_Pragma;
  
!    procedure Mark_Ghost_Pragma
!      (N    : Node_Id;
!       Mode : Ghost_Mode_Type)
!    is
     begin
        if Mode = Check then
!          Set_Is_Checked_Ghost_Pragma (N);
  
        else
!          Set_Is_Ignored_Ghost_Pragma (N);
           Set_Is_Ignored_Ghost_Node (N);
           Record_Ignored_Ghost_Node (N);
        end if;
--- 2444,2458 ----
        end if;
     end Mark_Ghost_Pragma;
  
!    procedure Mark_Ghost_Pragma (N : Node_Id; Mode : Ghost_Mode_Type) is
     begin
        if Mode = Check then
!          Set_Is_Checked_Ghost_Pragma (N, True);
!          Set_Is_Ignored_Ghost_Pragma (N, False);
  
        else
!          Set_Is_Checked_Ghost_Pragma (N, False);
!          Set_Is_Ignored_Ghost_Pragma (N, True);
           Set_Is_Ignored_Ghost_Node (N);
           Record_Ignored_Ghost_Node (N);
        end if;
*************** package body Ghost is
*** 2456,2465 ****
     -- Mark_Ghost_Renaming --
     -------------------------
  
!    procedure Mark_Ghost_Renaming
!      (N  : Node_Id;
!       Id : Entity_Id)
!    is
        Policy : Name_Id := No_Name;
        Level  : constant Entity_Id := Ghost_Assertion_Level (Id);
     begin
--- 2462,2468 ----
     -- Mark_Ghost_Renaming --
     -------------------------
  
!    procedure Mark_Ghost_Renaming (N : Node_Id; Id : Entity_Id) is
        Policy : Name_Id := No_Name;
        Level  : constant Entity_Id := Ghost_Assertion_Level (Id);
     begin
*************** package body Ghost is
*** 2657,2668 ****
  
        elsif Nkind (N) = N_Pragma then
           Level := Pragma_Ghost_Assertion_Level (N);
           if Is_Checked_Ghost_Pragma (N) then
!             Install_Ghost_Region (Check, N, Level);
           elsif Is_Ignored_Ghost_Pragma (N) then
              Install_Ghost_Region (Ignore, N, Level);
           else
!             Install_Ghost_Region (None, N, Level);
           end if;
  
        --  The Ghost mode of a procedure call depends on the Ghost mode of the
--- 2660,2685 ----
  
        elsif Nkind (N) = N_Pragma then
           Level := Pragma_Ghost_Assertion_Level (N);
+ 
           if Is_Checked_Ghost_Pragma (N) then
! 
!             --  Still install an ignored ghost region if the pragma is attached
!             --  to a checked ghost entity, but the pragma itself is explicitly
!             --  ignored.
! 
!             if Is_Ignored (N) then
!                Install_Ghost_Region (Ignore, N, Level);
!             else
!                Install_Ghost_Region (Check, N, Level);
!             end if;
           elsif Is_Ignored_Ghost_Pragma (N) then
              Install_Ghost_Region (Ignore, N, Level);
           else
!             if Is_Checked (N) then
!                Install_Ghost_Region (Check, N, Level);
!             else
!                Install_Ghost_Region (None, N, Level);
!             end if;
           end if;
  
        --  The Ghost mode of a procedure call depends on the Ghost mode of the
diff -Nrcpad gcc-16-20250914/gcc/ada/ghost.ads gcc-16-20250921/gcc/ada/ghost.ads
*** gcc-16-20250914/gcc/ada/ghost.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/ghost.ads	Sun Sep 21 22:32:34 2025
*************** package Ghost is
*** 59,65 ****
       (Actual : Node_Id;
        Formal : Entity_Id);
     --  Check that if Actual contains references to ghost entities, generic
!    --  formal parameter Formal is ghost (SPARK RM 6.9(10)).
  
     procedure Check_Ghost_Formal_Procedure_Or_Package
       (N          : Node_Id;
--- 59,65 ----
       (Actual : Node_Id;
        Formal : Entity_Id);
     --  Check that if Actual contains references to ghost entities, generic
!    --  formal parameter Formal is ghost (SPARK RM 6.9(13)).
  
     procedure Check_Ghost_Formal_Procedure_Or_Package
       (N          : Node_Id;
*************** package Ghost is
*** 68,74 ****
        Is_Default : Boolean := False);
     --  Verify that if generic formal procedure (resp. package) Formal is ghost,
     --  then Actual is not Empty and also a ghost procedure (resp. package)
!    --  (SPARK RM 6.9(13-14)). The error if any is located on N. If
     --  Is_Default is False, N and Actual represent the actual parameter in an
     --  instantiation. Otherwise, they represent the default subprogram of a
     --  formal subprogram declaration.
--- 68,74 ----
        Is_Default : Boolean := False);
     --  Verify that if generic formal procedure (resp. package) Formal is ghost,
     --  then Actual is not Empty and also a ghost procedure (resp. package)
!    --  (SPARK RM 6.9(16-17)). The error if any is located on N. If
     --  Is_Default is False, N and Actual represent the actual parameter in an
     --  instantiation. Otherwise, they represent the default subprogram of a
     --  formal subprogram declaration.
*************** package Ghost is
*** 79,85 ****
        Is_Default : Boolean := False);
     --  Verify that if Formal (either an IN OUT generic formal parameter, or an
     --  IN generic formal parameter of access-to-variable type) is ghost, then
!    --  Actual is a ghost object (SPARK RM 6.9(13-14)). Is_Default is True when
     --  Actual is the default expression of the formal object declaration.
  
     procedure Check_Ghost_Overriding
--- 79,85 ----
        Is_Default : Boolean := False);
     --  Verify that if Formal (either an IN OUT generic formal parameter, or an
     --  IN generic formal parameter of access-to-variable type) is ghost, then
!    --  Actual is a ghost object (SPARK RM 6.9(16-17)). Is_Default is True when
     --  Actual is the default expression of the formal object declaration.
  
     procedure Check_Ghost_Overriding
*************** package Ghost is
*** 126,132 ****
        (Self : Entity_Id; Other : Entity_Id) return Boolean;
     --  Check that assertion level Self is assertion-level-dependent with Other.
     --
!    --  According to SPARK RM 6.9(5) this means that
     --  * Either Self or Other has the default assertion level.
     --  * Self either is or depends on Other
     --  * Self either is or depends on Static
--- 126,132 ----
        (Self : Entity_Id; Other : Entity_Id) return Boolean;
     --  Check that assertion level Self is assertion-level-dependent with Other.
     --
!    --  According to SPARK RM 6.9(6) this means that
     --  * Either Self or Other has the default assertion level.
     --  * Self either is or depends on Other
     --  * Self either is or depends on Static
*************** package Ghost is
*** 262,268 ****
  
     procedure Remove_Ignored_Ghost_Code;
     --  Remove all code marked as ignored Ghost from the trees of all qualifying
!    --  units (SPARK RM 6.9(4)).
     --
     --  WARNING: this is a separate front end pass, care should be taken to keep
     --  it optimized.
--- 262,268 ----
  
     procedure Remove_Ignored_Ghost_Code;
     --  Remove all code marked as ignored Ghost from the trees of all qualifying
!    --  units (SPARK RM 6.9(5)).
     --
     --  WARNING: this is a separate front end pass, care should be taken to keep
     --  it optimized.
diff -Nrcpad gcc-16-20250914/gcc/ada/gnat_rm.texi gcc-16-20250921/gcc/ada/gnat_rm.texi
*** gcc-16-20250914/gcc/ada/gnat_rm.texi	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/gnat_rm.texi	Sun Sep 21 22:32:34 2025
***************
*** 19,25 ****
  
  @copying
  @quotation
! GNAT Reference Manual , Sep 05, 2025
  
  AdaCore
  
--- 19,25 ----
  
  @copying
  @quotation
! GNAT Reference Manual , Sep 19, 2025
  
  AdaCore
  
*************** The GNAT Library
*** 755,760 ****
--- 755,761 ----
  * GNAT.Bubble_Sort_G (g-busorg.ads): GNAT Bubble_Sort_G g-busorg ads. 
  * GNAT.Byte_Order_Mark (g-byorma.ads): GNAT Byte_Order_Mark g-byorma ads. 
  * GNAT.Byte_Swapping (g-bytswa.ads): GNAT Byte_Swapping g-bytswa ads. 
+ * GNAT.C_Time (g-c_time.ads): GNAT C_Time g-c_time ads. 
  * GNAT.Calendar (g-calend.ads): GNAT Calendar g-calend ads. 
  * GNAT.Calendar.Time_IO (g-catiio.ads): GNAT Calendar Time_IO g-catiio ads. 
  * GNAT.CRC32 (g-crc32.ads): GNAT CRC32 g-crc32 ads. 
*************** Curated Extensions
*** 909,914 ****
--- 910,916 ----
  * Static aspect on intrinsic functions:: 
  * First Controlling Parameter:: 
  * Unsigned_Base_Range aspect:: 
+ * Generalized Finalization:: 
  
  Deep delta Aggregates
  
*************** Deep delta Aggregates
*** 917,922 ****
--- 919,930 ----
  * Dynamic Semantics:: 
  * Examples:: 
  
+ Generalized Finalization
+ 
+ * Finalizable tagged types:: 
+ * Composite types:: 
+ * Interoperability with controlled types:: 
+ 
  Experimental Language Extensions
  
  * Conditional when constructs:: 
*************** Experimental Language Extensions
*** 926,938 ****
  * Simpler Accessibility Model:: 
  * Case pattern matching:: 
  * Mutably Tagged Types with Size’Class Aspect:: 
- * Generalized Finalization:: 
  * No_Raise aspect:: 
  * Inference of Dependent Types in Generic Instantiations:: 
  * External_Initialization Aspect:: 
  * Finally construct:: 
  * Continue statement:: 
  * Destructors:: 
  
  Storage Model
  
--- 934,946 ----
  * Simpler Accessibility Model:: 
  * Case pattern matching:: 
  * Mutably Tagged Types with Size’Class Aspect:: 
  * No_Raise aspect:: 
  * Inference of Dependent Types in Generic Instantiations:: 
  * External_Initialization Aspect:: 
  * Finally construct:: 
  * Continue statement:: 
  * Destructors:: 
+ * Structural Generic Instantiation:: 
  
  Storage Model
  
*************** Simpler Accessibility Model
*** 946,963 ****
  * Subprogram parameters:: 
  * Function results:: 
  
- Generalized Finalization
- 
- * Finalizable tagged types:: 
- * Composite types:: 
- * Interoperability with controlled types:: 
- 
  Finally construct
  
  * Syntax: Syntax<2>. 
  * Legality Rules: Legality Rules<2>. 
  * Dynamic Semantics: Dynamic Semantics<2>. 
  
  Security Hardening Features
  
  * Register Scrubbing:: 
--- 954,971 ----
  * Subprogram parameters:: 
  * Function results:: 
  
  Finally construct
  
  * Syntax: Syntax<2>. 
  * Legality Rules: Legality Rules<2>. 
  * Dynamic Semantics: Dynamic Semantics<2>. 
  
+ Structural Generic Instantiation
+ 
+ * Syntax: Syntax<3>. 
+ * Legality Rules: Legality Rules<3>. 
+ * Static Semantics:: 
+ 
  Security Hardening Features
  
  * Register Scrubbing:: 
*************** of GNAT, and will generate a warning mes
*** 23522,23527 ****
--- 23530,23536 ----
  * GNAT.Bubble_Sort_G (g-busorg.ads): GNAT Bubble_Sort_G g-busorg ads. 
  * GNAT.Byte_Order_Mark (g-byorma.ads): GNAT Byte_Order_Mark g-byorma ads. 
  * GNAT.Byte_Swapping (g-bytswa.ads): GNAT Byte_Swapping g-bytswa ads. 
+ * GNAT.C_Time (g-c_time.ads): GNAT C_Time g-c_time ads. 
  * GNAT.Calendar (g-calend.ads): GNAT Calendar g-calend ads. 
  * GNAT.Calendar.Time_IO (g-catiio.ads): GNAT Calendar Time_IO g-catiio ads. 
  * GNAT.CRC32 (g-crc32.ads): GNAT CRC32 g-crc32 ads. 
*************** see whether it is one of the standard by
*** 24261,24267 ****
  the encoding of the string. The routine includes detection of special XML
  sequences for various UCS input formats.
  
! @node GNAT Byte_Swapping g-bytswa ads,GNAT Calendar g-calend ads,GNAT Byte_Order_Mark g-byorma ads,The GNAT Library
  @anchor{gnat_rm/the_gnat_library gnat-byte-swapping-g-bytswa-ads}@anchor{34a}@anchor{gnat_rm/the_gnat_library id45}@anchor{34b}
  @section @code{GNAT.Byte_Swapping} (@code{g-bytswa.ads})
  
--- 24270,24276 ----
  the encoding of the string. The routine includes detection of special XML
  sequences for various UCS input formats.
  
! @node GNAT Byte_Swapping g-bytswa ads,GNAT C_Time g-c_time ads,GNAT Byte_Order_Mark g-byorma ads,The GNAT Library
  @anchor{gnat_rm/the_gnat_library gnat-byte-swapping-g-bytswa-ads}@anchor{34a}@anchor{gnat_rm/the_gnat_library id45}@anchor{34b}
  @section @code{GNAT.Byte_Swapping} (@code{g-bytswa.ads})
  
*************** sequences for various UCS input formats.
*** 24275,24282 ****
  General routines for swapping the bytes in 2-, 4-, and 8-byte quantities.
  Machine-specific implementations are available in some cases.
  
! @node GNAT Calendar g-calend ads,GNAT Calendar Time_IO g-catiio ads,GNAT Byte_Swapping g-bytswa ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-calendar-g-calend-ads}@anchor{34c}@anchor{gnat_rm/the_gnat_library id46}@anchor{34d}
  @section @code{GNAT.Calendar} (@code{g-calend.ads})
  
  
--- 24284,24303 ----
  General routines for swapping the bytes in 2-, 4-, and 8-byte quantities.
  Machine-specific implementations are available in some cases.
  
! @node GNAT C_Time g-c_time ads,GNAT Calendar g-calend ads,GNAT Byte_Swapping g-bytswa ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-c-time-g-c-time-ads}@anchor{34c}@anchor{gnat_rm/the_gnat_library id46}@anchor{34d}
! @section @code{GNAT.C_Time} (@code{g-c_time.ads})
! 
! 
! @geindex GNAT.C_Time (g-c_time.ads)
! 
! @geindex Time
! 
! Provides the time_t, timeval and timespec types corresponding to the C
! types defined by the OS, as well as various conversion functions.
! 
! @node GNAT Calendar g-calend ads,GNAT Calendar Time_IO g-catiio ads,GNAT C_Time g-c_time ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-calendar-g-calend-ads}@anchor{34e}@anchor{gnat_rm/the_gnat_library id47}@anchor{34f}
  @section @code{GNAT.Calendar} (@code{g-calend.ads})
  
  
*************** Machine-specific implementations are ava
*** 24286,24296 ****
  
  Extends the facilities provided by @code{Ada.Calendar} to include handling
  of days of the week, an extended @code{Split} and @code{Time_Of} capability.
- Also provides conversion of @code{Ada.Calendar.Time} values to and from the
- C @code{timeval} format.
  
  @node GNAT Calendar Time_IO g-catiio ads,GNAT CRC32 g-crc32 ads,GNAT Calendar g-calend ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-calendar-time-io-g-catiio-ads}@anchor{34e}@anchor{gnat_rm/the_gnat_library id47}@anchor{34f}
  @section @code{GNAT.Calendar.Time_IO} (@code{g-catiio.ads})
  
  
--- 24307,24315 ----
  
  Extends the facilities provided by @code{Ada.Calendar} to include handling
  of days of the week, an extended @code{Split} and @code{Time_Of} capability.
  
  @node GNAT Calendar Time_IO g-catiio ads,GNAT CRC32 g-crc32 ads,GNAT Calendar g-calend ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-calendar-time-io-g-catiio-ads}@anchor{350}@anchor{gnat_rm/the_gnat_library id48}@anchor{351}
  @section @code{GNAT.Calendar.Time_IO} (@code{g-catiio.ads})
  
  
*************** C @code{timeval} format.
*** 24301,24307 ****
  @geindex GNAT.Calendar.Time_IO (g-catiio.ads)
  
  @node GNAT CRC32 g-crc32 ads,GNAT Case_Util g-casuti ads,GNAT Calendar Time_IO g-catiio ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-crc32-g-crc32-ads}@anchor{350}@anchor{gnat_rm/the_gnat_library id48}@anchor{351}
  @section @code{GNAT.CRC32} (@code{g-crc32.ads})
  
  
--- 24320,24326 ----
  @geindex GNAT.Calendar.Time_IO (g-catiio.ads)
  
  @node GNAT CRC32 g-crc32 ads,GNAT Case_Util g-casuti ads,GNAT Calendar Time_IO g-catiio ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-crc32-g-crc32-ads}@anchor{352}@anchor{gnat_rm/the_gnat_library id49}@anchor{353}
  @section @code{GNAT.CRC32} (@code{g-crc32.ads})
  
  
*************** of this algorithm see
*** 24318,24324 ****
  Aug. 1988.  Sarwate, D.V.
  
  @node GNAT Case_Util g-casuti ads,GNAT CGI g-cgi ads,GNAT CRC32 g-crc32 ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-case-util-g-casuti-ads}@anchor{352}@anchor{gnat_rm/the_gnat_library id49}@anchor{353}
  @section @code{GNAT.Case_Util} (@code{g-casuti.ads})
  
  
--- 24337,24343 ----
  Aug. 1988.  Sarwate, D.V.
  
  @node GNAT Case_Util g-casuti ads,GNAT CGI g-cgi ads,GNAT CRC32 g-crc32 ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-case-util-g-casuti-ads}@anchor{354}@anchor{gnat_rm/the_gnat_library id50}@anchor{355}
  @section @code{GNAT.Case_Util} (@code{g-casuti.ads})
  
  
*************** without the overhead of the full casing
*** 24333,24339 ****
  in @code{Ada.Characters.Handling}.
  
  @node GNAT CGI g-cgi ads,GNAT CGI Cookie g-cgicoo ads,GNAT Case_Util g-casuti ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-cgi-g-cgi-ads}@anchor{354}@anchor{gnat_rm/the_gnat_library id50}@anchor{355}
  @section @code{GNAT.CGI} (@code{g-cgi.ads})
  
  
--- 24352,24358 ----
  in @code{Ada.Characters.Handling}.
  
  @node GNAT CGI g-cgi ads,GNAT CGI Cookie g-cgicoo ads,GNAT Case_Util g-casuti ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-cgi-g-cgi-ads}@anchor{356}@anchor{gnat_rm/the_gnat_library id51}@anchor{357}
  @section @code{GNAT.CGI} (@code{g-cgi.ads})
  
  
*************** builds a table whose index is the key an
*** 24348,24354 ****
  with this table.
  
  @node GNAT CGI Cookie g-cgicoo ads,GNAT CGI Debug g-cgideb ads,GNAT CGI g-cgi ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-cgi-cookie-g-cgicoo-ads}@anchor{356}@anchor{gnat_rm/the_gnat_library id51}@anchor{357}
  @section @code{GNAT.CGI.Cookie} (@code{g-cgicoo.ads})
  
  
--- 24367,24373 ----
  with this table.
  
  @node GNAT CGI Cookie g-cgicoo ads,GNAT CGI Debug g-cgideb ads,GNAT CGI g-cgi ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-cgi-cookie-g-cgicoo-ads}@anchor{358}@anchor{gnat_rm/the_gnat_library id52}@anchor{359}
  @section @code{GNAT.CGI.Cookie} (@code{g-cgicoo.ads})
  
  
*************** Common Gateway Interface (CGI).  It expo
*** 24363,24369 ****
  cookies (piece of information kept in the Web client software).
  
  @node GNAT CGI Debug g-cgideb ads,GNAT Command_Line g-comlin ads,GNAT CGI Cookie g-cgicoo ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-cgi-debug-g-cgideb-ads}@anchor{358}@anchor{gnat_rm/the_gnat_library id52}@anchor{359}
  @section @code{GNAT.CGI.Debug} (@code{g-cgideb.ads})
  
  
--- 24382,24388 ----
  cookies (piece of information kept in the Web client software).
  
  @node GNAT CGI Debug g-cgideb ads,GNAT Command_Line g-comlin ads,GNAT CGI Cookie g-cgicoo ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-cgi-debug-g-cgideb-ads}@anchor{35a}@anchor{gnat_rm/the_gnat_library id53}@anchor{35b}
  @section @code{GNAT.CGI.Debug} (@code{g-cgideb.ads})
  
  
*************** This is a package to help debugging CGI
*** 24375,24381 ****
  programs written in Ada.
  
  @node GNAT Command_Line g-comlin ads,GNAT Compiler_Version g-comver ads,GNAT CGI Debug g-cgideb ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-command-line-g-comlin-ads}@anchor{35a}@anchor{gnat_rm/the_gnat_library id53}@anchor{35b}
  @section @code{GNAT.Command_Line} (@code{g-comlin.ads})
  
  
--- 24394,24400 ----
  programs written in Ada.
  
  @node GNAT Command_Line g-comlin ads,GNAT Compiler_Version g-comver ads,GNAT CGI Debug g-cgideb ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-command-line-g-comlin-ads}@anchor{35c}@anchor{gnat_rm/the_gnat_library id54}@anchor{35d}
  @section @code{GNAT.Command_Line} (@code{g-comlin.ads})
  
  
*************** including the ability to scan for named
*** 24388,24394 ****
  and expand file names using wildcard notations.
  
  @node GNAT Compiler_Version g-comver ads,GNAT Ctrl_C g-ctrl_c ads,GNAT Command_Line g-comlin ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-compiler-version-g-comver-ads}@anchor{35c}@anchor{gnat_rm/the_gnat_library id54}@anchor{35d}
  @section @code{GNAT.Compiler_Version} (@code{g-comver.ads})
  
  
--- 24407,24413 ----
  and expand file names using wildcard notations.
  
  @node GNAT Compiler_Version g-comver ads,GNAT Ctrl_C g-ctrl_c ads,GNAT Command_Line g-comlin ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-compiler-version-g-comver-ads}@anchor{35e}@anchor{gnat_rm/the_gnat_library id55}@anchor{35f}
  @section @code{GNAT.Compiler_Version} (@code{g-comver.ads})
  
  
*************** of the compiler if a consistent tool set
*** 24406,24412 ****
  of a partition).
  
  @node GNAT Ctrl_C g-ctrl_c ads,GNAT Current_Exception g-curexc ads,GNAT Compiler_Version g-comver ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-ctrl-c-g-ctrl-c-ads}@anchor{35e}@anchor{gnat_rm/the_gnat_library id55}@anchor{35f}
  @section @code{GNAT.Ctrl_C} (@code{g-ctrl_c.ads})
  
  
--- 24425,24431 ----
  of a partition).
  
  @node GNAT Ctrl_C g-ctrl_c ads,GNAT Current_Exception g-curexc ads,GNAT Compiler_Version g-comver ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-ctrl-c-g-ctrl-c-ads}@anchor{360}@anchor{gnat_rm/the_gnat_library id56}@anchor{361}
  @section @code{GNAT.Ctrl_C} (@code{g-ctrl_c.ads})
  
  
*************** of a partition).
*** 24417,24423 ****
  Provides a simple interface to handle Ctrl-C keyboard events.
  
  @node GNAT Current_Exception g-curexc ads,GNAT Debug_Pools g-debpoo ads,GNAT Ctrl_C g-ctrl_c ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-current-exception-g-curexc-ads}@anchor{360}@anchor{gnat_rm/the_gnat_library id56}@anchor{361}
  @section @code{GNAT.Current_Exception} (@code{g-curexc.ads})
  
  
--- 24436,24442 ----
  Provides a simple interface to handle Ctrl-C keyboard events.
  
  @node GNAT Current_Exception g-curexc ads,GNAT Debug_Pools g-debpoo ads,GNAT Ctrl_C g-ctrl_c ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-current-exception-g-curexc-ads}@anchor{362}@anchor{gnat_rm/the_gnat_library id57}@anchor{363}
  @section @code{GNAT.Current_Exception} (@code{g-curexc.ads})
  
  
*************** This is particularly useful in simulatin
*** 24434,24440 ****
  obtaining information about exceptions provided by Ada 83 compilers.
  
  @node GNAT Debug_Pools g-debpoo ads,GNAT Debug_Utilities g-debuti ads,GNAT Current_Exception g-curexc ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-debug-pools-g-debpoo-ads}@anchor{362}@anchor{gnat_rm/the_gnat_library id57}@anchor{363}
  @section @code{GNAT.Debug_Pools} (@code{g-debpoo.ads})
  
  
--- 24453,24459 ----
  obtaining information about exceptions provided by Ada 83 compilers.
  
  @node GNAT Debug_Pools g-debpoo ads,GNAT Debug_Utilities g-debuti ads,GNAT Current_Exception g-curexc ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-debug-pools-g-debpoo-ads}@anchor{364}@anchor{gnat_rm/the_gnat_library id58}@anchor{365}
  @section @code{GNAT.Debug_Pools} (@code{g-debpoo.ads})
  
  
*************** problems.
*** 24451,24457 ****
  See @code{The GNAT Debug_Pool Facility} section in the @cite{GNAT User’s Guide}.
  
  @node GNAT Debug_Utilities g-debuti ads,GNAT Decode_String g-decstr ads,GNAT Debug_Pools g-debpoo ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-debug-utilities-g-debuti-ads}@anchor{364}@anchor{gnat_rm/the_gnat_library id58}@anchor{365}
  @section @code{GNAT.Debug_Utilities} (@code{g-debuti.ads})
  
  
--- 24470,24476 ----
  See @code{The GNAT Debug_Pool Facility} section in the @cite{GNAT User’s Guide}.
  
  @node GNAT Debug_Utilities g-debuti ads,GNAT Decode_String g-decstr ads,GNAT Debug_Pools g-debpoo ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-debug-utilities-g-debuti-ads}@anchor{366}@anchor{gnat_rm/the_gnat_library id59}@anchor{367}
  @section @code{GNAT.Debug_Utilities} (@code{g-debuti.ads})
  
  
*************** to and from string images of address val
*** 24464,24470 ****
  for hexadecimal literals.
  
  @node GNAT Decode_String g-decstr ads,GNAT Decode_UTF8_String g-deutst ads,GNAT Debug_Utilities g-debuti ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-decode-string-g-decstr-ads}@anchor{366}@anchor{gnat_rm/the_gnat_library id59}@anchor{367}
  @section @code{GNAT.Decode_String} (@code{g-decstr.ads})
  
  
--- 24483,24489 ----
  for hexadecimal literals.
  
  @node GNAT Decode_String g-decstr ads,GNAT Decode_UTF8_String g-deutst ads,GNAT Debug_Utilities g-debuti ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-decode-string-g-decstr-ads}@anchor{368}@anchor{gnat_rm/the_gnat_library id60}@anchor{369}
  @section @code{GNAT.Decode_String} (@code{g-decstr.ads})
  
  
*************** Useful in conjunction with Unicode chara
*** 24488,24494 ****
  preinstantiation for UTF-8. See next entry.
  
  @node GNAT Decode_UTF8_String g-deutst ads,GNAT Directory_Operations g-dirope ads,GNAT Decode_String g-decstr ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-decode-utf8-string-g-deutst-ads}@anchor{368}@anchor{gnat_rm/the_gnat_library id60}@anchor{369}
  @section @code{GNAT.Decode_UTF8_String} (@code{g-deutst.ads})
  
  
--- 24507,24513 ----
  preinstantiation for UTF-8. See next entry.
  
  @node GNAT Decode_UTF8_String g-deutst ads,GNAT Directory_Operations g-dirope ads,GNAT Decode_String g-decstr ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-decode-utf8-string-g-deutst-ads}@anchor{36a}@anchor{gnat_rm/the_gnat_library id61}@anchor{36b}
  @section @code{GNAT.Decode_UTF8_String} (@code{g-deutst.ads})
  
  
*************** preinstantiation for UTF-8. See next ent
*** 24509,24515 ****
  A preinstantiation of GNAT.Decode_Strings for UTF-8 encoding.
  
  @node GNAT Directory_Operations g-dirope ads,GNAT Directory_Operations Iteration g-diopit ads,GNAT Decode_UTF8_String g-deutst ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-directory-operations-g-dirope-ads}@anchor{36a}@anchor{gnat_rm/the_gnat_library id61}@anchor{36b}
  @section @code{GNAT.Directory_Operations} (@code{g-dirope.ads})
  
  
--- 24528,24534 ----
  A preinstantiation of GNAT.Decode_Strings for UTF-8 encoding.
  
  @node GNAT Directory_Operations g-dirope ads,GNAT Directory_Operations Iteration g-diopit ads,GNAT Decode_UTF8_String g-deutst ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-directory-operations-g-dirope-ads}@anchor{36c}@anchor{gnat_rm/the_gnat_library id62}@anchor{36d}
  @section @code{GNAT.Directory_Operations} (@code{g-dirope.ads})
  
  
*************** the current directory, making new direct
*** 24522,24528 ****
  directory.
  
  @node GNAT Directory_Operations Iteration g-diopit ads,GNAT Dynamic_HTables g-dynhta ads,GNAT Directory_Operations g-dirope ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-directory-operations-iteration-g-diopit-ads}@anchor{36c}@anchor{gnat_rm/the_gnat_library id62}@anchor{36d}
  @section @code{GNAT.Directory_Operations.Iteration} (@code{g-diopit.ads})
  
  
--- 24541,24547 ----
  directory.
  
  @node GNAT Directory_Operations Iteration g-diopit ads,GNAT Dynamic_HTables g-dynhta ads,GNAT Directory_Operations g-dirope ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-directory-operations-iteration-g-diopit-ads}@anchor{36e}@anchor{gnat_rm/the_gnat_library id63}@anchor{36f}
  @section @code{GNAT.Directory_Operations.Iteration} (@code{g-diopit.ads})
  
  
*************** A child unit of GNAT.Directory_Operation
*** 24534,24540 ****
  for iterating through directories.
  
  @node GNAT Dynamic_HTables g-dynhta ads,GNAT Dynamic_Tables g-dyntab ads,GNAT Directory_Operations Iteration g-diopit ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-dynamic-htables-g-dynhta-ads}@anchor{36e}@anchor{gnat_rm/the_gnat_library id63}@anchor{36f}
  @section @code{GNAT.Dynamic_HTables} (@code{g-dynhta.ads})
  
  
--- 24553,24559 ----
  for iterating through directories.
  
  @node GNAT Dynamic_HTables g-dynhta ads,GNAT Dynamic_Tables g-dyntab ads,GNAT Directory_Operations Iteration g-diopit ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-dynamic-htables-g-dynhta-ads}@anchor{370}@anchor{gnat_rm/the_gnat_library id64}@anchor{371}
  @section @code{GNAT.Dynamic_HTables} (@code{g-dynhta.ads})
  
  
*************** dynamic instances of the hash table, whi
*** 24552,24558 ****
  @code{GNAT.HTable} creates a single instance of the hash table.
  
  @node GNAT Dynamic_Tables g-dyntab ads,GNAT Encode_String g-encstr ads,GNAT Dynamic_HTables g-dynhta ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-dynamic-tables-g-dyntab-ads}@anchor{370}@anchor{gnat_rm/the_gnat_library id64}@anchor{371}
  @section @code{GNAT.Dynamic_Tables} (@code{g-dyntab.ads})
  
  
--- 24571,24577 ----
  @code{GNAT.HTable} creates a single instance of the hash table.
  
  @node GNAT Dynamic_Tables g-dyntab ads,GNAT Encode_String g-encstr ads,GNAT Dynamic_HTables g-dynhta ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-dynamic-tables-g-dyntab-ads}@anchor{372}@anchor{gnat_rm/the_gnat_library id65}@anchor{373}
  @section @code{GNAT.Dynamic_Tables} (@code{g-dyntab.ads})
  
  
*************** dynamic instances of the table, while an
*** 24572,24578 ****
  @code{GNAT.Table} creates a single instance of the table type.
  
  @node GNAT Encode_String g-encstr ads,GNAT Encode_UTF8_String g-enutst ads,GNAT Dynamic_Tables g-dyntab ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-encode-string-g-encstr-ads}@anchor{372}@anchor{gnat_rm/the_gnat_library id65}@anchor{373}
  @section @code{GNAT.Encode_String} (@code{g-encstr.ads})
  
  
--- 24591,24597 ----
  @code{GNAT.Table} creates a single instance of the table type.
  
  @node GNAT Encode_String g-encstr ads,GNAT Encode_UTF8_String g-enutst ads,GNAT Dynamic_Tables g-dyntab ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-encode-string-g-encstr-ads}@anchor{374}@anchor{gnat_rm/the_gnat_library id66}@anchor{375}
  @section @code{GNAT.Encode_String} (@code{g-encstr.ads})
  
  
*************** encoding method. Useful in conjunction w
*** 24594,24600 ****
  Note there is a preinstantiation for UTF-8. See next entry.
  
  @node GNAT Encode_UTF8_String g-enutst ads,GNAT Exception_Actions g-excact ads,GNAT Encode_String g-encstr ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-encode-utf8-string-g-enutst-ads}@anchor{374}@anchor{gnat_rm/the_gnat_library id66}@anchor{375}
  @section @code{GNAT.Encode_UTF8_String} (@code{g-enutst.ads})
  
  
--- 24613,24619 ----
  Note there is a preinstantiation for UTF-8. See next entry.
  
  @node GNAT Encode_UTF8_String g-enutst ads,GNAT Exception_Actions g-excact ads,GNAT Encode_String g-encstr ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-encode-utf8-string-g-enutst-ads}@anchor{376}@anchor{gnat_rm/the_gnat_library id67}@anchor{377}
  @section @code{GNAT.Encode_UTF8_String} (@code{g-enutst.ads})
  
  
*************** Note there is a preinstantiation for UTF
*** 24615,24621 ****
  A preinstantiation of GNAT.Encode_Strings for UTF-8 encoding.
  
  @node GNAT Exception_Actions g-excact ads,GNAT Exception_Traces g-exctra ads,GNAT Encode_UTF8_String g-enutst ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-exception-actions-g-excact-ads}@anchor{376}@anchor{gnat_rm/the_gnat_library id67}@anchor{377}
  @section @code{GNAT.Exception_Actions} (@code{g-excact.ads})
  
  
--- 24634,24640 ----
  A preinstantiation of GNAT.Encode_Strings for UTF-8 encoding.
  
  @node GNAT Exception_Actions g-excact ads,GNAT Exception_Traces g-exctra ads,GNAT Encode_UTF8_String g-enutst ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-exception-actions-g-excact-ads}@anchor{378}@anchor{gnat_rm/the_gnat_library id68}@anchor{379}
  @section @code{GNAT.Exception_Actions} (@code{g-excact.ads})
  
  
*************** for specific exceptions, or when any exc
*** 24628,24634 ****
  can be used for instance to force a core dump to ease debugging.
  
  @node GNAT Exception_Traces g-exctra ads,GNAT Exceptions g-except ads,GNAT Exception_Actions g-excact ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-exception-traces-g-exctra-ads}@anchor{378}@anchor{gnat_rm/the_gnat_library id68}@anchor{379}
  @section @code{GNAT.Exception_Traces} (@code{g-exctra.ads})
  
  
--- 24647,24653 ----
  can be used for instance to force a core dump to ease debugging.
  
  @node GNAT Exception_Traces g-exctra ads,GNAT Exceptions g-except ads,GNAT Exception_Actions g-excact ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-exception-traces-g-exctra-ads}@anchor{37a}@anchor{gnat_rm/the_gnat_library id69}@anchor{37b}
  @section @code{GNAT.Exception_Traces} (@code{g-exctra.ads})
  
  
*************** Provides an interface allowing to contro
*** 24642,24648 ****
  occurrences.
  
  @node GNAT Exceptions g-except ads,GNAT Expect g-expect ads,GNAT Exception_Traces g-exctra ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-exceptions-g-except-ads}@anchor{37a}@anchor{gnat_rm/the_gnat_library id69}@anchor{37b}
  @section @code{GNAT.Exceptions} (@code{g-except.ads})
  
  
--- 24661,24667 ----
  occurrences.
  
  @node GNAT Exceptions g-except ads,GNAT Expect g-expect ads,GNAT Exception_Traces g-exctra ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-exceptions-g-except-ads}@anchor{37c}@anchor{gnat_rm/the_gnat_library id70}@anchor{37d}
  @section @code{GNAT.Exceptions} (@code{g-except.ads})
  
  
*************** predefined exceptions, and for example a
*** 24663,24669 ****
  @code{Constraint_Error} with a message from a pure subprogram.
  
  @node GNAT Expect g-expect ads,GNAT Expect TTY g-exptty ads,GNAT Exceptions g-except ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-expect-g-expect-ads}@anchor{37c}@anchor{gnat_rm/the_gnat_library id70}@anchor{37d}
  @section @code{GNAT.Expect} (@code{g-expect.ads})
  
  
--- 24682,24688 ----
  @code{Constraint_Error} with a message from a pure subprogram.
  
  @node GNAT Expect g-expect ads,GNAT Expect TTY g-exptty ads,GNAT Exceptions g-except ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-expect-g-expect-ads}@anchor{37e}@anchor{gnat_rm/the_gnat_library id71}@anchor{37f}
  @section @code{GNAT.Expect} (@code{g-expect.ads})
  
  
*************** It is not implemented for cross ports, a
*** 24679,24685 ****
  implemented for VxWorks or LynxOS.
  
  @node GNAT Expect TTY g-exptty ads,GNAT Float_Control g-flocon ads,GNAT Expect g-expect ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-expect-tty-g-exptty-ads}@anchor{37e}@anchor{gnat_rm/the_gnat_library id71}@anchor{37f}
  @section @code{GNAT.Expect.TTY} (@code{g-exptty.ads})
  
  
--- 24698,24704 ----
  implemented for VxWorks or LynxOS.
  
  @node GNAT Expect TTY g-exptty ads,GNAT Float_Control g-flocon ads,GNAT Expect g-expect ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-expect-tty-g-exptty-ads}@anchor{380}@anchor{gnat_rm/the_gnat_library id72}@anchor{381}
  @section @code{GNAT.Expect.TTY} (@code{g-exptty.ads})
  
  
*************** ports. It is not implemented for cross p
*** 24691,24697 ****
  in particular is not implemented for VxWorks or LynxOS.
  
  @node GNAT Float_Control g-flocon ads,GNAT Formatted_String g-forstr ads,GNAT Expect TTY g-exptty ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-float-control-g-flocon-ads}@anchor{380}@anchor{gnat_rm/the_gnat_library id72}@anchor{381}
  @section @code{GNAT.Float_Control} (@code{g-flocon.ads})
  
  
--- 24710,24716 ----
  in particular is not implemented for VxWorks or LynxOS.
  
  @node GNAT Float_Control g-flocon ads,GNAT Formatted_String g-forstr ads,GNAT Expect TTY g-exptty ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-float-control-g-flocon-ads}@anchor{382}@anchor{gnat_rm/the_gnat_library id73}@anchor{383}
  @section @code{GNAT.Float_Control} (@code{g-flocon.ads})
  
  
*************** library calls may cause this mode to be
*** 24705,24711 ****
  in this package can be used to reestablish the required mode.
  
  @node GNAT Formatted_String g-forstr ads,GNAT Generic_Fast_Math_Functions g-gfmafu ads,GNAT Float_Control g-flocon ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-formatted-string-g-forstr-ads}@anchor{382}@anchor{gnat_rm/the_gnat_library id73}@anchor{383}
  @section @code{GNAT.Formatted_String} (@code{g-forstr.ads})
  
  
--- 24724,24730 ----
  in this package can be used to reestablish the required mode.
  
  @node GNAT Formatted_String g-forstr ads,GNAT Generic_Fast_Math_Functions g-gfmafu ads,GNAT Float_Control g-flocon ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-formatted-string-g-forstr-ads}@anchor{384}@anchor{gnat_rm/the_gnat_library id74}@anchor{385}
  @section @code{GNAT.Formatted_String} (@code{g-forstr.ads})
  
  
*************** derived from Integer, Float or enumerati
*** 24720,24726 ****
  formatted string.
  
  @node GNAT Generic_Fast_Math_Functions g-gfmafu ads,GNAT Heap_Sort g-heasor ads,GNAT Formatted_String g-forstr ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-generic-fast-math-functions-g-gfmafu-ads}@anchor{384}@anchor{gnat_rm/the_gnat_library id74}@anchor{385}
  @section @code{GNAT.Generic_Fast_Math_Functions} (@code{g-gfmafu.ads})
  
  
--- 24739,24745 ----
  formatted string.
  
  @node GNAT Generic_Fast_Math_Functions g-gfmafu ads,GNAT Heap_Sort g-heasor ads,GNAT Formatted_String g-forstr ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-generic-fast-math-functions-g-gfmafu-ads}@anchor{386}@anchor{gnat_rm/the_gnat_library id75}@anchor{387}
  @section @code{GNAT.Generic_Fast_Math_Functions} (@code{g-gfmafu.ads})
  
  
*************** have a vector implementation that can be
*** 24738,24744 ****
  compiler when auto-vectorization is enabled.
  
  @node GNAT Heap_Sort g-heasor ads,GNAT Heap_Sort_A g-hesora ads,GNAT Generic_Fast_Math_Functions g-gfmafu ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-heap-sort-g-heasor-ads}@anchor{386}@anchor{gnat_rm/the_gnat_library id75}@anchor{387}
  @section @code{GNAT.Heap_Sort} (@code{g-heasor.ads})
  
  
--- 24757,24763 ----
  compiler when auto-vectorization is enabled.
  
  @node GNAT Heap_Sort g-heasor ads,GNAT Heap_Sort_A g-hesora ads,GNAT Generic_Fast_Math_Functions g-gfmafu ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-heap-sort-g-heasor-ads}@anchor{388}@anchor{gnat_rm/the_gnat_library id76}@anchor{389}
  @section @code{GNAT.Heap_Sort} (@code{g-heasor.ads})
  
  
*************** access-to-procedure values.  The algorit
*** 24752,24758 ****
  that performs approximately N*log(N) comparisons in the worst case.
  
  @node GNAT Heap_Sort_A g-hesora ads,GNAT Heap_Sort_G g-hesorg ads,GNAT Heap_Sort g-heasor ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-heap-sort-a-g-hesora-ads}@anchor{388}@anchor{gnat_rm/the_gnat_library id76}@anchor{389}
  @section @code{GNAT.Heap_Sort_A} (@code{g-hesora.ads})
  
  
--- 24771,24777 ----
  that performs approximately N*log(N) comparisons in the worst case.
  
  @node GNAT Heap_Sort_A g-hesora ads,GNAT Heap_Sort_G g-hesorg ads,GNAT Heap_Sort g-heasor ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-heap-sort-a-g-hesora-ads}@anchor{38a}@anchor{gnat_rm/the_gnat_library id77}@anchor{38b}
  @section @code{GNAT.Heap_Sort_A} (@code{g-hesora.ads})
  
  
*************** This differs from @code{GNAT.Heap_Sort}
*** 24768,24774 ****
  interface, but may be slightly more efficient.
  
  @node GNAT Heap_Sort_G g-hesorg ads,GNAT HTable g-htable ads,GNAT Heap_Sort_A g-hesora ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-heap-sort-g-g-hesorg-ads}@anchor{38a}@anchor{gnat_rm/the_gnat_library id77}@anchor{38b}
  @section @code{GNAT.Heap_Sort_G} (@code{g-hesorg.ads})
  
  
--- 24787,24793 ----
  interface, but may be slightly more efficient.
  
  @node GNAT Heap_Sort_G g-hesorg ads,GNAT HTable g-htable ads,GNAT Heap_Sort_A g-hesora ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-heap-sort-g-g-hesorg-ads}@anchor{38c}@anchor{gnat_rm/the_gnat_library id78}@anchor{38d}
  @section @code{GNAT.Heap_Sort_G} (@code{g-hesorg.ads})
  
  
*************** if the procedures can be inlined, at the
*** 24782,24788 ****
  multiple instantiations.
  
  @node GNAT HTable g-htable ads,GNAT IO g-io ads,GNAT Heap_Sort_G g-hesorg ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-htable-g-htable-ads}@anchor{38c}@anchor{gnat_rm/the_gnat_library id78}@anchor{38d}
  @section @code{GNAT.HTable} (@code{g-htable.ads})
  
  
--- 24801,24807 ----
  multiple instantiations.
  
  @node GNAT HTable g-htable ads,GNAT IO g-io ads,GNAT Heap_Sort_G g-hesorg ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-htable-g-htable-ads}@anchor{38e}@anchor{gnat_rm/the_gnat_library id79}@anchor{38f}
  @section @code{GNAT.HTable} (@code{g-htable.ads})
  
  
*************** data.  Provides two approaches, one a si
*** 24795,24801 ****
  allowing arbitrary dynamic hash tables.
  
  @node GNAT IO g-io ads,GNAT IO_Aux g-io_aux ads,GNAT HTable g-htable ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-io-g-io-ads}@anchor{38e}@anchor{gnat_rm/the_gnat_library id79}@anchor{38f}
  @section @code{GNAT.IO} (@code{g-io.ads})
  
  
--- 24814,24820 ----
  allowing arbitrary dynamic hash tables.
  
  @node GNAT IO g-io ads,GNAT IO_Aux g-io_aux ads,GNAT HTable g-htable ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-io-g-io-ads}@anchor{390}@anchor{gnat_rm/the_gnat_library id80}@anchor{391}
  @section @code{GNAT.IO} (@code{g-io.ads})
  
  
*************** Standard_Input, and writing characters,
*** 24811,24817 ****
  Standard_Output or Standard_Error.
  
  @node GNAT IO_Aux g-io_aux ads,GNAT Lock_Files g-locfil ads,GNAT IO g-io ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-io-aux-g-io-aux-ads}@anchor{390}@anchor{gnat_rm/the_gnat_library id80}@anchor{391}
  @section @code{GNAT.IO_Aux} (@code{g-io_aux.ads})
  
  
--- 24830,24836 ----
  Standard_Output or Standard_Error.
  
  @node GNAT IO_Aux g-io_aux ads,GNAT Lock_Files g-locfil ads,GNAT IO g-io ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-io-aux-g-io-aux-ads}@anchor{392}@anchor{gnat_rm/the_gnat_library id81}@anchor{393}
  @section @code{GNAT.IO_Aux} (@code{g-io_aux.ads})
  
  
*************** Provides some auxiliary functions for us
*** 24825,24831 ****
  for whether a file exists, and functions for reading a line of text.
  
  @node GNAT Lock_Files g-locfil ads,GNAT MBBS_Discrete_Random g-mbdira ads,GNAT IO_Aux g-io_aux ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-lock-files-g-locfil-ads}@anchor{392}@anchor{gnat_rm/the_gnat_library id81}@anchor{393}
  @section @code{GNAT.Lock_Files} (@code{g-locfil.ads})
  
  
--- 24844,24850 ----
  for whether a file exists, and functions for reading a line of text.
  
  @node GNAT Lock_Files g-locfil ads,GNAT MBBS_Discrete_Random g-mbdira ads,GNAT IO_Aux g-io_aux ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-lock-files-g-locfil-ads}@anchor{394}@anchor{gnat_rm/the_gnat_library id82}@anchor{395}
  @section @code{GNAT.Lock_Files} (@code{g-locfil.ads})
  
  
*************** Provides a general interface for using f
*** 24839,24845 ****
  providing program level synchronization.
  
  @node GNAT MBBS_Discrete_Random g-mbdira ads,GNAT MBBS_Float_Random g-mbflra ads,GNAT Lock_Files g-locfil ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-mbbs-discrete-random-g-mbdira-ads}@anchor{394}@anchor{gnat_rm/the_gnat_library id82}@anchor{395}
  @section @code{GNAT.MBBS_Discrete_Random} (@code{g-mbdira.ads})
  
  
--- 24858,24864 ----
  providing program level synchronization.
  
  @node GNAT MBBS_Discrete_Random g-mbdira ads,GNAT MBBS_Float_Random g-mbflra ads,GNAT Lock_Files g-locfil ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-mbbs-discrete-random-g-mbdira-ads}@anchor{396}@anchor{gnat_rm/the_gnat_library id83}@anchor{397}
  @section @code{GNAT.MBBS_Discrete_Random} (@code{g-mbdira.ads})
  
  
*************** The original implementation of @code{Ada
*** 24851,24857 ****
  a modified version of the Blum-Blum-Shub generator.
  
  @node GNAT MBBS_Float_Random g-mbflra ads,GNAT MD5 g-md5 ads,GNAT MBBS_Discrete_Random g-mbdira ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-mbbs-float-random-g-mbflra-ads}@anchor{396}@anchor{gnat_rm/the_gnat_library id83}@anchor{397}
  @section @code{GNAT.MBBS_Float_Random} (@code{g-mbflra.ads})
  
  
--- 24870,24876 ----
  a modified version of the Blum-Blum-Shub generator.
  
  @node GNAT MBBS_Float_Random g-mbflra ads,GNAT MD5 g-md5 ads,GNAT MBBS_Discrete_Random g-mbdira ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-mbbs-float-random-g-mbflra-ads}@anchor{398}@anchor{gnat_rm/the_gnat_library id84}@anchor{399}
  @section @code{GNAT.MBBS_Float_Random} (@code{g-mbflra.ads})
  
  
*************** The original implementation of @code{Ada
*** 24863,24869 ****
  a modified version of the Blum-Blum-Shub generator.
  
  @node GNAT MD5 g-md5 ads,GNAT Memory_Dump g-memdum ads,GNAT MBBS_Float_Random g-mbflra ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-md5-g-md5-ads}@anchor{398}@anchor{gnat_rm/the_gnat_library id84}@anchor{399}
  @section @code{GNAT.MD5} (@code{g-md5.ads})
  
  
--- 24882,24888 ----
  a modified version of the Blum-Blum-Shub generator.
  
  @node GNAT MD5 g-md5 ads,GNAT Memory_Dump g-memdum ads,GNAT MBBS_Float_Random g-mbflra ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-md5-g-md5-ads}@anchor{39a}@anchor{gnat_rm/the_gnat_library id85}@anchor{39b}
  @section @code{GNAT.MD5} (@code{g-md5.ads})
  
  
*************** the HMAC-MD5 message authentication func
*** 24876,24882 ****
  FIPS PUB 198.
  
  @node GNAT Memory_Dump g-memdum ads,GNAT Most_Recent_Exception g-moreex ads,GNAT MD5 g-md5 ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-memory-dump-g-memdum-ads}@anchor{39a}@anchor{gnat_rm/the_gnat_library id85}@anchor{39b}
  @section @code{GNAT.Memory_Dump} (@code{g-memdum.ads})
  
  
--- 24895,24901 ----
  FIPS PUB 198.
  
  @node GNAT Memory_Dump g-memdum ads,GNAT Most_Recent_Exception g-moreex ads,GNAT MD5 g-md5 ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-memory-dump-g-memdum-ads}@anchor{39c}@anchor{gnat_rm/the_gnat_library id86}@anchor{39d}
  @section @code{GNAT.Memory_Dump} (@code{g-memdum.ads})
  
  
*************** standard output or standard error files.
*** 24889,24895 ****
  output.
  
  @node GNAT Most_Recent_Exception g-moreex ads,GNAT OS_Lib g-os_lib ads,GNAT Memory_Dump g-memdum ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-most-recent-exception-g-moreex-ads}@anchor{39c}@anchor{gnat_rm/the_gnat_library id86}@anchor{39d}
  @section @code{GNAT.Most_Recent_Exception} (@code{g-moreex.ads})
  
  
--- 24908,24914 ----
  output.
  
  @node GNAT Most_Recent_Exception g-moreex ads,GNAT OS_Lib g-os_lib ads,GNAT Memory_Dump g-memdum ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-most-recent-exception-g-moreex-ads}@anchor{39e}@anchor{gnat_rm/the_gnat_library id87}@anchor{39f}
  @section @code{GNAT.Most_Recent_Exception} (@code{g-moreex.ads})
  
  
*************** various logging purposes, including dupl
*** 24903,24909 ****
  Ada 83 implementation dependent extensions.
  
  @node GNAT OS_Lib g-os_lib ads,GNAT Perfect_Hash_Generators g-pehage ads,GNAT Most_Recent_Exception g-moreex ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-os-lib-g-os-lib-ads}@anchor{39e}@anchor{gnat_rm/the_gnat_library id87}@anchor{39f}
  @section @code{GNAT.OS_Lib} (@code{g-os_lib.ads})
  
  
--- 24922,24928 ----
  Ada 83 implementation dependent extensions.
  
  @node GNAT OS_Lib g-os_lib ads,GNAT Perfect_Hash_Generators g-pehage ads,GNAT Most_Recent_Exception g-moreex ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-os-lib-g-os-lib-ads}@anchor{3a0}@anchor{gnat_rm/the_gnat_library id88}@anchor{3a1}
  @section @code{GNAT.OS_Lib} (@code{g-os_lib.ads})
  
  
*************** including a portable spawn procedure, an
*** 24919,24925 ****
  and error return codes.
  
  @node GNAT Perfect_Hash_Generators g-pehage ads,GNAT Random_Numbers g-rannum ads,GNAT OS_Lib g-os_lib ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-perfect-hash-generators-g-pehage-ads}@anchor{3a0}@anchor{gnat_rm/the_gnat_library id88}@anchor{3a1}
  @section @code{GNAT.Perfect_Hash_Generators} (@code{g-pehage.ads})
  
  
--- 24938,24944 ----
  and error return codes.
  
  @node GNAT Perfect_Hash_Generators g-pehage ads,GNAT Random_Numbers g-rannum ads,GNAT OS_Lib g-os_lib ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-perfect-hash-generators-g-pehage-ads}@anchor{3a2}@anchor{gnat_rm/the_gnat_library id89}@anchor{3a3}
  @section @code{GNAT.Perfect_Hash_Generators} (@code{g-pehage.ads})
  
  
*************** hashcode are in the same order. These ha
*** 24937,24943 ****
  convenient for use with realtime applications.
  
  @node GNAT Random_Numbers g-rannum ads,GNAT Regexp g-regexp ads,GNAT Perfect_Hash_Generators g-pehage ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-random-numbers-g-rannum-ads}@anchor{3a2}@anchor{gnat_rm/the_gnat_library id89}@anchor{3a3}
  @section @code{GNAT.Random_Numbers} (@code{g-rannum.ads})
  
  
--- 24956,24962 ----
  convenient for use with realtime applications.
  
  @node GNAT Random_Numbers g-rannum ads,GNAT Regexp g-regexp ads,GNAT Perfect_Hash_Generators g-pehage ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-random-numbers-g-rannum-ads}@anchor{3a4}@anchor{gnat_rm/the_gnat_library id90}@anchor{3a5}
  @section @code{GNAT.Random_Numbers} (@code{g-rannum.ads})
  
  
*************** however NOT suitable for situations requ
*** 24951,24957 ****
  randomness.
  
  @node GNAT Regexp g-regexp ads,GNAT Registry g-regist ads,GNAT Random_Numbers g-rannum ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-regexp-g-regexp-ads}@anchor{279}@anchor{gnat_rm/the_gnat_library id90}@anchor{3a4}
  @section @code{GNAT.Regexp} (@code{g-regexp.ads})
  
  
--- 24970,24976 ----
  randomness.
  
  @node GNAT Regexp g-regexp ads,GNAT Registry g-regist ads,GNAT Random_Numbers g-rannum ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-regexp-g-regexp-ads}@anchor{279}@anchor{gnat_rm/the_gnat_library id91}@anchor{3a6}
  @section @code{GNAT.Regexp} (@code{g-regexp.ads})
  
  
*************** simplest of the three pattern matching p
*** 24967,24973 ****
  suitable for ‘file globbing’ applications.
  
  @node GNAT Registry g-regist ads,GNAT Regpat g-regpat ads,GNAT Regexp g-regexp ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-registry-g-regist-ads}@anchor{3a5}@anchor{gnat_rm/the_gnat_library id91}@anchor{3a6}
  @section @code{GNAT.Registry} (@code{g-regist.ads})
  
  
--- 24986,24992 ----
  suitable for ‘file globbing’ applications.
  
  @node GNAT Registry g-regist ads,GNAT Regpat g-regpat ads,GNAT Regexp g-regexp ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-registry-g-regist-ads}@anchor{3a7}@anchor{gnat_rm/the_gnat_library id92}@anchor{3a8}
  @section @code{GNAT.Registry} (@code{g-regist.ads})
  
  
*************** registry API, but at a lower level of ab
*** 24981,24987 ****
  package provided with the Win32Ada binding
  
  @node GNAT Regpat g-regpat ads,GNAT Rewrite_Data g-rewdat ads,GNAT Registry g-regist ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-regpat-g-regpat-ads}@anchor{3a7}@anchor{gnat_rm/the_gnat_library id92}@anchor{3a8}
  @section @code{GNAT.Regpat} (@code{g-regpat.ads})
  
  
--- 25000,25006 ----
  package provided with the Win32Ada binding
  
  @node GNAT Regpat g-regpat ads,GNAT Rewrite_Data g-rewdat ads,GNAT Registry g-regist ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-regpat-g-regpat-ads}@anchor{3a9}@anchor{gnat_rm/the_gnat_library id93}@anchor{3aa}
  @section @code{GNAT.Regpat} (@code{g-regpat.ads})
  
  
*************** from the original V7 style regular expre
*** 24996,25002 ****
  Henry Spencer (and binary compatible with this C library).
  
  @node GNAT Rewrite_Data g-rewdat ads,GNAT Secondary_Stack_Info g-sestin ads,GNAT Regpat g-regpat ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-rewrite-data-g-rewdat-ads}@anchor{3a9}@anchor{gnat_rm/the_gnat_library id93}@anchor{3aa}
  @section @code{GNAT.Rewrite_Data} (@code{g-rewdat.ads})
  
  
--- 25015,25021 ----
  Henry Spencer (and binary compatible with this C library).
  
  @node GNAT Rewrite_Data g-rewdat ads,GNAT Secondary_Stack_Info g-sestin ads,GNAT Regpat g-regpat ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-rewrite-data-g-rewdat-ads}@anchor{3ab}@anchor{gnat_rm/the_gnat_library id94}@anchor{3ac}
  @section @code{GNAT.Rewrite_Data} (@code{g-rewdat.ads})
  
  
*************** full content to be processed is not load
*** 25010,25016 ****
  this interface usable for large files or socket streams.
  
  @node GNAT Secondary_Stack_Info g-sestin ads,GNAT Semaphores g-semaph ads,GNAT Rewrite_Data g-rewdat ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-secondary-stack-info-g-sestin-ads}@anchor{3ab}@anchor{gnat_rm/the_gnat_library id94}@anchor{3ac}
  @section @code{GNAT.Secondary_Stack_Info} (@code{g-sestin.ads})
  
  
--- 25029,25035 ----
  this interface usable for large files or socket streams.
  
  @node GNAT Secondary_Stack_Info g-sestin ads,GNAT Semaphores g-semaph ads,GNAT Rewrite_Data g-rewdat ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-secondary-stack-info-g-sestin-ads}@anchor{3ad}@anchor{gnat_rm/the_gnat_library id95}@anchor{3ae}
  @section @code{GNAT.Secondary_Stack_Info} (@code{g-sestin.ads})
  
  
*************** Provides the capability to query the hig
*** 25022,25028 ****
  secondary stack.
  
  @node GNAT Semaphores g-semaph ads,GNAT Serial_Communications g-sercom ads,GNAT Secondary_Stack_Info g-sestin ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-semaphores-g-semaph-ads}@anchor{3ad}@anchor{gnat_rm/the_gnat_library id95}@anchor{3ae}
  @section @code{GNAT.Semaphores} (@code{g-semaph.ads})
  
  
--- 25041,25047 ----
  secondary stack.
  
  @node GNAT Semaphores g-semaph ads,GNAT Serial_Communications g-sercom ads,GNAT Secondary_Stack_Info g-sestin ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-semaphores-g-semaph-ads}@anchor{3af}@anchor{gnat_rm/the_gnat_library id96}@anchor{3b0}
  @section @code{GNAT.Semaphores} (@code{g-semaph.ads})
  
  
*************** secondary stack.
*** 25033,25039 ****
  Provides classic counting and binary semaphores using protected types.
  
  @node GNAT Serial_Communications g-sercom ads,GNAT SHA1 g-sha1 ads,GNAT Semaphores g-semaph ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-serial-communications-g-sercom-ads}@anchor{3af}@anchor{gnat_rm/the_gnat_library id96}@anchor{3b0}
  @section @code{GNAT.Serial_Communications} (@code{g-sercom.ads})
  
  
--- 25052,25058 ----
  Provides classic counting and binary semaphores using protected types.
  
  @node GNAT Serial_Communications g-sercom ads,GNAT SHA1 g-sha1 ads,GNAT Semaphores g-semaph ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-serial-communications-g-sercom-ads}@anchor{3b1}@anchor{gnat_rm/the_gnat_library id97}@anchor{3b2}
  @section @code{GNAT.Serial_Communications} (@code{g-sercom.ads})
  
  
*************** Provides a simple interface to send and
*** 25045,25051 ****
  port. This is only supported on GNU/Linux and Windows.
  
  @node GNAT SHA1 g-sha1 ads,GNAT SHA224 g-sha224 ads,GNAT Serial_Communications g-sercom ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-sha1-g-sha1-ads}@anchor{3b1}@anchor{gnat_rm/the_gnat_library id97}@anchor{3b2}
  @section @code{GNAT.SHA1} (@code{g-sha1.ads})
  
  
--- 25064,25070 ----
  port. This is only supported on GNU/Linux and Windows.
  
  @node GNAT SHA1 g-sha1 ads,GNAT SHA224 g-sha224 ads,GNAT Serial_Communications g-sercom ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-sha1-g-sha1-ads}@anchor{3b3}@anchor{gnat_rm/the_gnat_library id98}@anchor{3b4}
  @section @code{GNAT.SHA1} (@code{g-sha1.ads})
  
  
*************** and RFC 3174, and the HMAC-SHA1 message
*** 25058,25064 ****
  in RFC 2104 and FIPS PUB 198.
  
  @node GNAT SHA224 g-sha224 ads,GNAT SHA256 g-sha256 ads,GNAT SHA1 g-sha1 ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-sha224-g-sha224-ads}@anchor{3b3}@anchor{gnat_rm/the_gnat_library id98}@anchor{3b4}
  @section @code{GNAT.SHA224} (@code{g-sha224.ads})
  
  
--- 25077,25083 ----
  in RFC 2104 and FIPS PUB 198.
  
  @node GNAT SHA224 g-sha224 ads,GNAT SHA256 g-sha256 ads,GNAT SHA1 g-sha1 ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-sha224-g-sha224-ads}@anchor{3b5}@anchor{gnat_rm/the_gnat_library id99}@anchor{3b6}
  @section @code{GNAT.SHA224} (@code{g-sha224.ads})
  
  
*************** and the HMAC-SHA224 message authenticati
*** 25071,25077 ****
  in RFC 2104 and FIPS PUB 198.
  
  @node GNAT SHA256 g-sha256 ads,GNAT SHA384 g-sha384 ads,GNAT SHA224 g-sha224 ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-sha256-g-sha256-ads}@anchor{3b5}@anchor{gnat_rm/the_gnat_library id99}@anchor{3b6}
  @section @code{GNAT.SHA256} (@code{g-sha256.ads})
  
  
--- 25090,25096 ----
  in RFC 2104 and FIPS PUB 198.
  
  @node GNAT SHA256 g-sha256 ads,GNAT SHA384 g-sha384 ads,GNAT SHA224 g-sha224 ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-sha256-g-sha256-ads}@anchor{3b7}@anchor{gnat_rm/the_gnat_library id100}@anchor{3b8}
  @section @code{GNAT.SHA256} (@code{g-sha256.ads})
  
  
*************** and the HMAC-SHA256 message authenticati
*** 25084,25090 ****
  in RFC 2104 and FIPS PUB 198.
  
  @node GNAT SHA384 g-sha384 ads,GNAT SHA512 g-sha512 ads,GNAT SHA256 g-sha256 ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-sha384-g-sha384-ads}@anchor{3b7}@anchor{gnat_rm/the_gnat_library id100}@anchor{3b8}
  @section @code{GNAT.SHA384} (@code{g-sha384.ads})
  
  
--- 25103,25109 ----
  in RFC 2104 and FIPS PUB 198.
  
  @node GNAT SHA384 g-sha384 ads,GNAT SHA512 g-sha512 ads,GNAT SHA256 g-sha256 ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-sha384-g-sha384-ads}@anchor{3b9}@anchor{gnat_rm/the_gnat_library id101}@anchor{3ba}
  @section @code{GNAT.SHA384} (@code{g-sha384.ads})
  
  
*************** and the HMAC-SHA384 message authenticati
*** 25097,25103 ****
  in RFC 2104 and FIPS PUB 198.
  
  @node GNAT SHA512 g-sha512 ads,GNAT Signals g-signal ads,GNAT SHA384 g-sha384 ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-sha512-g-sha512-ads}@anchor{3b9}@anchor{gnat_rm/the_gnat_library id101}@anchor{3ba}
  @section @code{GNAT.SHA512} (@code{g-sha512.ads})
  
  
--- 25116,25122 ----
  in RFC 2104 and FIPS PUB 198.
  
  @node GNAT SHA512 g-sha512 ads,GNAT Signals g-signal ads,GNAT SHA384 g-sha384 ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-sha512-g-sha512-ads}@anchor{3bb}@anchor{gnat_rm/the_gnat_library id102}@anchor{3bc}
  @section @code{GNAT.SHA512} (@code{g-sha512.ads})
  
  
*************** and the HMAC-SHA512 message authenticati
*** 25110,25116 ****
  in RFC 2104 and FIPS PUB 198.
  
  @node GNAT Signals g-signal ads,GNAT Sockets g-socket ads,GNAT SHA512 g-sha512 ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-signals-g-signal-ads}@anchor{3bb}@anchor{gnat_rm/the_gnat_library id102}@anchor{3bc}
  @section @code{GNAT.Signals} (@code{g-signal.ads})
  
  
--- 25129,25135 ----
  in RFC 2104 and FIPS PUB 198.
  
  @node GNAT Signals g-signal ads,GNAT Sockets g-socket ads,GNAT SHA512 g-sha512 ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-signals-g-signal-ads}@anchor{3bd}@anchor{gnat_rm/the_gnat_library id103}@anchor{3be}
  @section @code{GNAT.Signals} (@code{g-signal.ads})
  
  
*************** Provides the ability to manipulate the b
*** 25122,25128 ****
  targets.
  
  @node GNAT Sockets g-socket ads,GNAT Source_Info g-souinf ads,GNAT Signals g-signal ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-sockets-g-socket-ads}@anchor{3bd}@anchor{gnat_rm/the_gnat_library id103}@anchor{3be}
  @section @code{GNAT.Sockets} (@code{g-socket.ads})
  
  
--- 25141,25147 ----
  targets.
  
  @node GNAT Sockets g-socket ads,GNAT Source_Info g-souinf ads,GNAT Signals g-signal ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-sockets-g-socket-ads}@anchor{3bf}@anchor{gnat_rm/the_gnat_library id104}@anchor{3c0}
  @section @code{GNAT.Sockets} (@code{g-socket.ads})
  
  
*************** on all native GNAT ports and on VxWorks
*** 25137,25143 ****
  the LynxOS cross port.
  
  @node GNAT Source_Info g-souinf ads,GNAT Spelling_Checker g-speche ads,GNAT Sockets g-socket ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-source-info-g-souinf-ads}@anchor{3bf}@anchor{gnat_rm/the_gnat_library id104}@anchor{3c0}
  @section @code{GNAT.Source_Info} (@code{g-souinf.ads})
  
  
--- 25156,25162 ----
  the LynxOS cross port.
  
  @node GNAT Source_Info g-souinf ads,GNAT Spelling_Checker g-speche ads,GNAT Sockets g-socket ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-source-info-g-souinf-ads}@anchor{3c1}@anchor{gnat_rm/the_gnat_library id105}@anchor{3c2}
  @section @code{GNAT.Source_Info} (@code{g-souinf.ads})
  
  
*************** subprograms yielding the date and time o
*** 25151,25157 ****
  C macros @code{__DATE__} and @code{__TIME__})
  
  @node GNAT Spelling_Checker g-speche ads,GNAT Spelling_Checker_Generic g-spchge ads,GNAT Source_Info g-souinf ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-spelling-checker-g-speche-ads}@anchor{3c1}@anchor{gnat_rm/the_gnat_library id105}@anchor{3c2}
  @section @code{GNAT.Spelling_Checker} (@code{g-speche.ads})
  
  
--- 25170,25176 ----
  C macros @code{__DATE__} and @code{__TIME__})
  
  @node GNAT Spelling_Checker g-speche ads,GNAT Spelling_Checker_Generic g-spchge ads,GNAT Source_Info g-souinf ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-spelling-checker-g-speche-ads}@anchor{3c3}@anchor{gnat_rm/the_gnat_library id106}@anchor{3c4}
  @section @code{GNAT.Spelling_Checker} (@code{g-speche.ads})
  
  
*************** Provides a function for determining whet
*** 25163,25169 ****
  near misspelling of another string.
  
  @node GNAT Spelling_Checker_Generic g-spchge ads,GNAT Spitbol Patterns g-spipat ads,GNAT Spelling_Checker g-speche ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-spelling-checker-generic-g-spchge-ads}@anchor{3c3}@anchor{gnat_rm/the_gnat_library id106}@anchor{3c4}
  @section @code{GNAT.Spelling_Checker_Generic} (@code{g-spchge.ads})
  
  
--- 25182,25188 ----
  near misspelling of another string.
  
  @node GNAT Spelling_Checker_Generic g-spchge ads,GNAT Spitbol Patterns g-spipat ads,GNAT Spelling_Checker g-speche ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-spelling-checker-generic-g-spchge-ads}@anchor{3c5}@anchor{gnat_rm/the_gnat_library id107}@anchor{3c6}
  @section @code{GNAT.Spelling_Checker_Generic} (@code{g-spchge.ads})
  
  
*************** determining whether one string is a plau
*** 25176,25182 ****
  string.
  
  @node GNAT Spitbol Patterns g-spipat ads,GNAT Spitbol g-spitbo ads,GNAT Spelling_Checker_Generic g-spchge ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-spitbol-patterns-g-spipat-ads}@anchor{3c5}@anchor{gnat_rm/the_gnat_library id107}@anchor{3c6}
  @section @code{GNAT.Spitbol.Patterns} (@code{g-spipat.ads})
  
  
--- 25195,25201 ----
  string.
  
  @node GNAT Spitbol Patterns g-spipat ads,GNAT Spitbol g-spitbo ads,GNAT Spelling_Checker_Generic g-spchge ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-spitbol-patterns-g-spipat-ads}@anchor{3c7}@anchor{gnat_rm/the_gnat_library id108}@anchor{3c8}
  @section @code{GNAT.Spitbol.Patterns} (@code{g-spipat.ads})
  
  
*************** the SNOBOL4 dynamic pattern construction
*** 25192,25198 ****
  efficient algorithm developed by Robert Dewar for the SPITBOL system.
  
  @node GNAT Spitbol g-spitbo ads,GNAT Spitbol Table_Boolean g-sptabo ads,GNAT Spitbol Patterns g-spipat ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-spitbol-g-spitbo-ads}@anchor{3c7}@anchor{gnat_rm/the_gnat_library id108}@anchor{3c8}
  @section @code{GNAT.Spitbol} (@code{g-spitbo.ads})
  
  
--- 25211,25217 ----
  efficient algorithm developed by Robert Dewar for the SPITBOL system.
  
  @node GNAT Spitbol g-spitbo ads,GNAT Spitbol Table_Boolean g-sptabo ads,GNAT Spitbol Patterns g-spipat ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-spitbol-g-spitbo-ads}@anchor{3c9}@anchor{gnat_rm/the_gnat_library id109}@anchor{3ca}
  @section @code{GNAT.Spitbol} (@code{g-spitbo.ads})
  
  
*************** useful for constructing arbitrary mappin
*** 25207,25213 ****
  the SNOBOL4 TABLE function.
  
  @node GNAT Spitbol Table_Boolean g-sptabo ads,GNAT Spitbol Table_Integer g-sptain ads,GNAT Spitbol g-spitbo ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-spitbol-table-boolean-g-sptabo-ads}@anchor{3c9}@anchor{gnat_rm/the_gnat_library id109}@anchor{3ca}
  @section @code{GNAT.Spitbol.Table_Boolean} (@code{g-sptabo.ads})
  
  
--- 25226,25232 ----
  the SNOBOL4 TABLE function.
  
  @node GNAT Spitbol Table_Boolean g-sptabo ads,GNAT Spitbol Table_Integer g-sptain ads,GNAT Spitbol g-spitbo ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-spitbol-table-boolean-g-sptabo-ads}@anchor{3cb}@anchor{gnat_rm/the_gnat_library id110}@anchor{3cc}
  @section @code{GNAT.Spitbol.Table_Boolean} (@code{g-sptabo.ads})
  
  
*************** for type @code{Standard.Boolean}, giving
*** 25222,25228 ****
  string values.
  
  @node GNAT Spitbol Table_Integer g-sptain ads,GNAT Spitbol Table_VString g-sptavs ads,GNAT Spitbol Table_Boolean g-sptabo ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-spitbol-table-integer-g-sptain-ads}@anchor{3cb}@anchor{gnat_rm/the_gnat_library id110}@anchor{3cc}
  @section @code{GNAT.Spitbol.Table_Integer} (@code{g-sptain.ads})
  
  
--- 25241,25247 ----
  string values.
  
  @node GNAT Spitbol Table_Integer g-sptain ads,GNAT Spitbol Table_VString g-sptavs ads,GNAT Spitbol Table_Boolean g-sptabo ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-spitbol-table-integer-g-sptain-ads}@anchor{3cd}@anchor{gnat_rm/the_gnat_library id111}@anchor{3ce}
  @section @code{GNAT.Spitbol.Table_Integer} (@code{g-sptain.ads})
  
  
*************** for type @code{Standard.Integer}, giving
*** 25239,25245 ****
  from string to integer values.
  
  @node GNAT Spitbol Table_VString g-sptavs ads,GNAT SSE g-sse ads,GNAT Spitbol Table_Integer g-sptain ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-spitbol-table-vstring-g-sptavs-ads}@anchor{3cd}@anchor{gnat_rm/the_gnat_library id111}@anchor{3ce}
  @section @code{GNAT.Spitbol.Table_VString} (@code{g-sptavs.ads})
  
  
--- 25258,25264 ----
  from string to integer values.
  
  @node GNAT Spitbol Table_VString g-sptavs ads,GNAT SSE g-sse ads,GNAT Spitbol Table_Integer g-sptain ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-spitbol-table-vstring-g-sptavs-ads}@anchor{3cf}@anchor{gnat_rm/the_gnat_library id112}@anchor{3d0}
  @section @code{GNAT.Spitbol.Table_VString} (@code{g-sptavs.ads})
  
  
*************** a variable length string type, giving an
*** 25256,25262 ****
  maps from strings to strings.
  
  @node GNAT SSE g-sse ads,GNAT SSE Vector_Types g-ssvety ads,GNAT Spitbol Table_VString g-sptavs ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-sse-g-sse-ads}@anchor{3cf}@anchor{gnat_rm/the_gnat_library id112}@anchor{3d0}
  @section @code{GNAT.SSE} (@code{g-sse.ads})
  
  
--- 25275,25281 ----
  maps from strings to strings.
  
  @node GNAT SSE g-sse ads,GNAT SSE Vector_Types g-ssvety ads,GNAT Spitbol Table_VString g-sptavs ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-sse-g-sse-ads}@anchor{3d1}@anchor{gnat_rm/the_gnat_library id113}@anchor{3d2}
  @section @code{GNAT.SSE} (@code{g-sse.ads})
  
  
*************** targets.  It exposes vector component ty
*** 25268,25274 ****
  introduction to the binding contents and use.
  
  @node GNAT SSE Vector_Types g-ssvety ads,GNAT String_Hash g-strhas ads,GNAT SSE g-sse ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-sse-vector-types-g-ssvety-ads}@anchor{3d1}@anchor{gnat_rm/the_gnat_library id113}@anchor{3d2}
  @section @code{GNAT.SSE.Vector_Types} (@code{g-ssvety.ads})
  
  
--- 25287,25293 ----
  introduction to the binding contents and use.
  
  @node GNAT SSE Vector_Types g-ssvety ads,GNAT String_Hash g-strhas ads,GNAT SSE g-sse ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-sse-vector-types-g-ssvety-ads}@anchor{3d3}@anchor{gnat_rm/the_gnat_library id114}@anchor{3d4}
  @section @code{GNAT.SSE.Vector_Types} (@code{g-ssvety.ads})
  
  
*************** introduction to the binding contents and
*** 25277,25283 ****
  SSE vector types for use with SSE related intrinsics.
  
  @node GNAT String_Hash g-strhas ads,GNAT Strings g-string ads,GNAT SSE Vector_Types g-ssvety ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-string-hash-g-strhas-ads}@anchor{3d3}@anchor{gnat_rm/the_gnat_library id114}@anchor{3d4}
  @section @code{GNAT.String_Hash} (@code{g-strhas.ads})
  
  
--- 25296,25302 ----
  SSE vector types for use with SSE related intrinsics.
  
  @node GNAT String_Hash g-strhas ads,GNAT Strings g-string ads,GNAT SSE Vector_Types g-ssvety ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-string-hash-g-strhas-ads}@anchor{3d5}@anchor{gnat_rm/the_gnat_library id115}@anchor{3d6}
  @section @code{GNAT.String_Hash} (@code{g-strhas.ads})
  
  
*************** Provides a generic hash function working
*** 25289,25295 ****
  type and the hash result type are parameters.
  
  @node GNAT Strings g-string ads,GNAT String_Split g-strspl ads,GNAT String_Hash g-strhas ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-strings-g-string-ads}@anchor{3d5}@anchor{gnat_rm/the_gnat_library id115}@anchor{3d6}
  @section @code{GNAT.Strings} (@code{g-string.ads})
  
  
--- 25308,25314 ----
  type and the hash result type are parameters.
  
  @node GNAT Strings g-string ads,GNAT String_Split g-strspl ads,GNAT String_Hash g-strhas ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-strings-g-string-ads}@anchor{3d7}@anchor{gnat_rm/the_gnat_library id116}@anchor{3d8}
  @section @code{GNAT.Strings} (@code{g-string.ads})
  
  
*************** Common String access types and related s
*** 25299,25305 ****
  defines a string access and an array of string access types.
  
  @node GNAT String_Split g-strspl ads,GNAT Table g-table ads,GNAT Strings g-string ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-string-split-g-strspl-ads}@anchor{3d7}@anchor{gnat_rm/the_gnat_library id116}@anchor{3d8}
  @section @code{GNAT.String_Split} (@code{g-strspl.ads})
  
  
--- 25318,25324 ----
  defines a string access and an array of string access types.
  
  @node GNAT String_Split g-strspl ads,GNAT Table g-table ads,GNAT Strings g-string ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-string-split-g-strspl-ads}@anchor{3d9}@anchor{gnat_rm/the_gnat_library id117}@anchor{3da}
  @section @code{GNAT.String_Split} (@code{g-strspl.ads})
  
  
*************** to the resulting slices. This package is
*** 25313,25319 ****
  @code{GNAT.Array_Split}.
  
  @node GNAT Table g-table ads,GNAT Task_Lock g-tasloc ads,GNAT String_Split g-strspl ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-table-g-table-ads}@anchor{3d9}@anchor{gnat_rm/the_gnat_library id117}@anchor{3da}
  @section @code{GNAT.Table} (@code{g-table.ads})
  
  
--- 25332,25338 ----
  @code{GNAT.Array_Split}.
  
  @node GNAT Table g-table ads,GNAT Task_Lock g-tasloc ads,GNAT String_Split g-strspl ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-table-g-table-ads}@anchor{3db}@anchor{gnat_rm/the_gnat_library id118}@anchor{3dc}
  @section @code{GNAT.Table} (@code{g-table.ads})
  
  
*************** while an instantiation of @code{GNAT.Dyn
*** 25333,25339 ****
  used to define dynamic instances of the table.
  
  @node GNAT Task_Lock g-tasloc ads,GNAT Time_Stamp g-timsta ads,GNAT Table g-table ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-task-lock-g-tasloc-ads}@anchor{3db}@anchor{gnat_rm/the_gnat_library id118}@anchor{3dc}
  @section @code{GNAT.Task_Lock} (@code{g-tasloc.ads})
  
  
--- 25352,25358 ----
  used to define dynamic instances of the table.
  
  @node GNAT Task_Lock g-tasloc ads,GNAT Time_Stamp g-timsta ads,GNAT Table g-table ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-task-lock-g-tasloc-ads}@anchor{3dd}@anchor{gnat_rm/the_gnat_library id119}@anchor{3de}
  @section @code{GNAT.Task_Lock} (@code{g-tasloc.ads})
  
  
*************** single global task lock.  Appropriate fo
*** 25350,25356 ****
  between tasks is very rarely expected.
  
  @node GNAT Time_Stamp g-timsta ads,GNAT Threads g-thread ads,GNAT Task_Lock g-tasloc ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-time-stamp-g-timsta-ads}@anchor{3dd}@anchor{gnat_rm/the_gnat_library id119}@anchor{3de}
  @section @code{GNAT.Time_Stamp} (@code{g-timsta.ads})
  
  
--- 25369,25375 ----
  between tasks is very rarely expected.
  
  @node GNAT Time_Stamp g-timsta ads,GNAT Threads g-thread ads,GNAT Task_Lock g-tasloc ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-time-stamp-g-timsta-ads}@anchor{3df}@anchor{gnat_rm/the_gnat_library id120}@anchor{3e0}
  @section @code{GNAT.Time_Stamp} (@code{g-timsta.ads})
  
  
*************** represents the current date and time in
*** 25365,25371 ****
  routine with minimal code and there are no dependencies on any other unit.
  
  @node GNAT Threads g-thread ads,GNAT Traceback g-traceb ads,GNAT Time_Stamp g-timsta ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-threads-g-thread-ads}@anchor{3df}@anchor{gnat_rm/the_gnat_library id120}@anchor{3e0}
  @section @code{GNAT.Threads} (@code{g-thread.ads})
  
  
--- 25384,25390 ----
  routine with minimal code and there are no dependencies on any other unit.
  
  @node GNAT Threads g-thread ads,GNAT Traceback g-traceb ads,GNAT Time_Stamp g-timsta ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-threads-g-thread-ads}@anchor{3e1}@anchor{gnat_rm/the_gnat_library id121}@anchor{3e2}
  @section @code{GNAT.Threads} (@code{g-thread.ads})
  
  
*************** further details if your program has thre
*** 25382,25388 ****
  environment which then accesses Ada code.
  
  @node GNAT Traceback g-traceb ads,GNAT Traceback Symbolic g-trasym ads,GNAT Threads g-thread ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-traceback-g-traceb-ads}@anchor{3e1}@anchor{gnat_rm/the_gnat_library id121}@anchor{3e2}
  @section @code{GNAT.Traceback} (@code{g-traceb.ads})
  
  
--- 25401,25407 ----
  environment which then accesses Ada code.
  
  @node GNAT Traceback g-traceb ads,GNAT Traceback Symbolic g-trasym ads,GNAT Threads g-thread ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-traceback-g-traceb-ads}@anchor{3e3}@anchor{gnat_rm/the_gnat_library id122}@anchor{3e4}
  @section @code{GNAT.Traceback} (@code{g-traceb.ads})
  
  
*************** Provides a facility for obtaining non-sy
*** 25394,25400 ****
  in various debugging situations.
  
  @node GNAT Traceback Symbolic g-trasym ads,GNAT UTF_32 g-utf_32 ads,GNAT Traceback g-traceb ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-traceback-symbolic-g-trasym-ads}@anchor{3e3}@anchor{gnat_rm/the_gnat_library id122}@anchor{3e4}
  @section @code{GNAT.Traceback.Symbolic} (@code{g-trasym.ads})
  
  
--- 25413,25419 ----
  in various debugging situations.
  
  @node GNAT Traceback Symbolic g-trasym ads,GNAT UTF_32 g-utf_32 ads,GNAT Traceback g-traceb ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-traceback-symbolic-g-trasym-ads}@anchor{3e5}@anchor{gnat_rm/the_gnat_library id123}@anchor{3e6}
  @section @code{GNAT.Traceback.Symbolic} (@code{g-trasym.ads})
  
  
*************** in various debugging situations.
*** 25403,25409 ****
  @geindex Trace back facilities
  
  @node GNAT UTF_32 g-utf_32 ads,GNAT UTF_32_Spelling_Checker g-u3spch ads,GNAT Traceback Symbolic g-trasym ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-utf-32-g-utf-32-ads}@anchor{3e5}@anchor{gnat_rm/the_gnat_library id123}@anchor{3e6}
  @section @code{GNAT.UTF_32} (@code{g-utf_32.ads})
  
  
--- 25422,25428 ----
  @geindex Trace back facilities
  
  @node GNAT UTF_32 g-utf_32 ads,GNAT UTF_32_Spelling_Checker g-u3spch ads,GNAT Traceback Symbolic g-trasym ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-utf-32-g-utf-32-ads}@anchor{3e7}@anchor{gnat_rm/the_gnat_library id124}@anchor{3e8}
  @section @code{GNAT.UTF_32} (@code{g-utf_32.ads})
  
  
*************** lower case to upper case fold routine co
*** 25422,25428 ****
  the Ada 2005 rules for identifier equivalence.
  
  @node GNAT UTF_32_Spelling_Checker g-u3spch ads,GNAT Wide_Spelling_Checker g-wispch ads,GNAT UTF_32 g-utf_32 ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-utf-32-spelling-checker-g-u3spch-ads}@anchor{3e7}@anchor{gnat_rm/the_gnat_library id124}@anchor{3e8}
  @section @code{GNAT.UTF_32_Spelling_Checker} (@code{g-u3spch.ads})
  
  
--- 25441,25447 ----
  the Ada 2005 rules for identifier equivalence.
  
  @node GNAT UTF_32_Spelling_Checker g-u3spch ads,GNAT Wide_Spelling_Checker g-wispch ads,GNAT UTF_32 g-utf_32 ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-utf-32-spelling-checker-g-u3spch-ads}@anchor{3e9}@anchor{gnat_rm/the_gnat_library id125}@anchor{3ea}
  @section @code{GNAT.UTF_32_Spelling_Checker} (@code{g-u3spch.ads})
  
  
*************** near misspelling of another wide wide st
*** 25435,25441 ****
  using the UTF_32_String type defined in System.Wch_Cnv.
  
  @node GNAT Wide_Spelling_Checker g-wispch ads,GNAT Wide_String_Split g-wistsp ads,GNAT UTF_32_Spelling_Checker g-u3spch ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-wide-spelling-checker-g-wispch-ads}@anchor{3e9}@anchor{gnat_rm/the_gnat_library id125}@anchor{3ea}
  @section @code{GNAT.Wide_Spelling_Checker} (@code{g-wispch.ads})
  
  
--- 25454,25460 ----
  using the UTF_32_String type defined in System.Wch_Cnv.
  
  @node GNAT Wide_Spelling_Checker g-wispch ads,GNAT Wide_String_Split g-wistsp ads,GNAT UTF_32_Spelling_Checker g-u3spch ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-wide-spelling-checker-g-wispch-ads}@anchor{3eb}@anchor{gnat_rm/the_gnat_library id126}@anchor{3ec}
  @section @code{GNAT.Wide_Spelling_Checker} (@code{g-wispch.ads})
  
  
*************** Provides a function for determining whet
*** 25447,25453 ****
  near misspelling of another wide string.
  
  @node GNAT Wide_String_Split g-wistsp ads,GNAT Wide_Wide_Spelling_Checker g-zspche ads,GNAT Wide_Spelling_Checker g-wispch ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-wide-string-split-g-wistsp-ads}@anchor{3eb}@anchor{gnat_rm/the_gnat_library id126}@anchor{3ec}
  @section @code{GNAT.Wide_String_Split} (@code{g-wistsp.ads})
  
  
--- 25466,25472 ----
  near misspelling of another wide string.
  
  @node GNAT Wide_String_Split g-wistsp ads,GNAT Wide_Wide_Spelling_Checker g-zspche ads,GNAT Wide_Spelling_Checker g-wispch ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-wide-string-split-g-wistsp-ads}@anchor{3ed}@anchor{gnat_rm/the_gnat_library id127}@anchor{3ee}
  @section @code{GNAT.Wide_String_Split} (@code{g-wistsp.ads})
  
  
*************** to the resulting slices. This package is
*** 25461,25467 ****
  @code{GNAT.Array_Split}.
  
  @node GNAT Wide_Wide_Spelling_Checker g-zspche ads,GNAT Wide_Wide_String_Split g-zistsp ads,GNAT Wide_String_Split g-wistsp ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-wide-wide-spelling-checker-g-zspche-ads}@anchor{3ed}@anchor{gnat_rm/the_gnat_library id127}@anchor{3ee}
  @section @code{GNAT.Wide_Wide_Spelling_Checker} (@code{g-zspche.ads})
  
  
--- 25480,25486 ----
  @code{GNAT.Array_Split}.
  
  @node GNAT Wide_Wide_Spelling_Checker g-zspche ads,GNAT Wide_Wide_String_Split g-zistsp ads,GNAT Wide_String_Split g-wistsp ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-wide-wide-spelling-checker-g-zspche-ads}@anchor{3ef}@anchor{gnat_rm/the_gnat_library id128}@anchor{3f0}
  @section @code{GNAT.Wide_Wide_Spelling_Checker} (@code{g-zspche.ads})
  
  
*************** Provides a function for determining whet
*** 25473,25479 ****
  near misspelling of another wide wide string.
  
  @node GNAT Wide_Wide_String_Split g-zistsp ads,Interfaces C Extensions i-cexten ads,GNAT Wide_Wide_Spelling_Checker g-zspche ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-wide-wide-string-split-g-zistsp-ads}@anchor{3ef}@anchor{gnat_rm/the_gnat_library id128}@anchor{3f0}
  @section @code{GNAT.Wide_Wide_String_Split} (@code{g-zistsp.ads})
  
  
--- 25492,25498 ----
  near misspelling of another wide wide string.
  
  @node GNAT Wide_Wide_String_Split g-zistsp ads,Interfaces C Extensions i-cexten ads,GNAT Wide_Wide_Spelling_Checker g-zspche ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library gnat-wide-wide-string-split-g-zistsp-ads}@anchor{3f1}@anchor{gnat_rm/the_gnat_library id129}@anchor{3f2}
  @section @code{GNAT.Wide_Wide_String_Split} (@code{g-zistsp.ads})
  
  
*************** to the resulting slices. This package is
*** 25487,25493 ****
  @code{GNAT.Array_Split}.
  
  @node Interfaces C Extensions i-cexten ads,Interfaces C Streams i-cstrea ads,GNAT Wide_Wide_String_Split g-zistsp ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id129}@anchor{3f1}@anchor{gnat_rm/the_gnat_library interfaces-c-extensions-i-cexten-ads}@anchor{3f2}
  @section @code{Interfaces.C.Extensions} (@code{i-cexten.ads})
  
  
--- 25506,25512 ----
  @code{GNAT.Array_Split}.
  
  @node Interfaces C Extensions i-cexten ads,Interfaces C Streams i-cstrea ads,GNAT Wide_Wide_String_Split g-zistsp ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id130}@anchor{3f3}@anchor{gnat_rm/the_gnat_library interfaces-c-extensions-i-cexten-ads}@anchor{3f4}
  @section @code{Interfaces.C.Extensions} (@code{i-cexten.ads})
  
  
*************** for use with either manually or automati
*** 25498,25504 ****
  to C libraries.
  
  @node Interfaces C Streams i-cstrea ads,Interfaces Packed_Decimal i-pacdec ads,Interfaces C Extensions i-cexten ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id130}@anchor{3f3}@anchor{gnat_rm/the_gnat_library interfaces-c-streams-i-cstrea-ads}@anchor{3f4}
  @section @code{Interfaces.C.Streams} (@code{i-cstrea.ads})
  
  
--- 25517,25523 ----
  to C libraries.
  
  @node Interfaces C Streams i-cstrea ads,Interfaces Packed_Decimal i-pacdec ads,Interfaces C Extensions i-cexten ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id131}@anchor{3f5}@anchor{gnat_rm/the_gnat_library interfaces-c-streams-i-cstrea-ads}@anchor{3f6}
  @section @code{Interfaces.C.Streams} (@code{i-cstrea.ads})
  
  
*************** This package is a binding for the most c
*** 25511,25517 ****
  on C streams.
  
  @node Interfaces Packed_Decimal i-pacdec ads,Interfaces VxWorks i-vxwork ads,Interfaces C Streams i-cstrea ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id131}@anchor{3f5}@anchor{gnat_rm/the_gnat_library interfaces-packed-decimal-i-pacdec-ads}@anchor{3f6}
  @section @code{Interfaces.Packed_Decimal} (@code{i-pacdec.ads})
  
  
--- 25530,25536 ----
  on C streams.
  
  @node Interfaces Packed_Decimal i-pacdec ads,Interfaces VxWorks i-vxwork ads,Interfaces C Streams i-cstrea ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id132}@anchor{3f7}@anchor{gnat_rm/the_gnat_library interfaces-packed-decimal-i-pacdec-ads}@anchor{3f8}
  @section @code{Interfaces.Packed_Decimal} (@code{i-pacdec.ads})
  
  
*************** from a packed decimal format compatible
*** 25526,25532 ****
  mainframes.
  
  @node Interfaces VxWorks i-vxwork ads,Interfaces VxWorks IO i-vxwoio ads,Interfaces Packed_Decimal i-pacdec ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id132}@anchor{3f7}@anchor{gnat_rm/the_gnat_library interfaces-vxworks-i-vxwork-ads}@anchor{3f8}
  @section @code{Interfaces.VxWorks} (@code{i-vxwork.ads})
  
  
--- 25545,25551 ----
  mainframes.
  
  @node Interfaces VxWorks i-vxwork ads,Interfaces VxWorks IO i-vxwoio ads,Interfaces Packed_Decimal i-pacdec ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id133}@anchor{3f9}@anchor{gnat_rm/the_gnat_library interfaces-vxworks-i-vxwork-ads}@anchor{3fa}
  @section @code{Interfaces.VxWorks} (@code{i-vxwork.ads})
  
  
*************** mainframes.
*** 25540,25546 ****
  This package provides a limited binding to the VxWorks API.
  
  @node Interfaces VxWorks IO i-vxwoio ads,System Address_Image s-addima ads,Interfaces VxWorks i-vxwork ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id133}@anchor{3f9}@anchor{gnat_rm/the_gnat_library interfaces-vxworks-io-i-vxwoio-ads}@anchor{3fa}
  @section @code{Interfaces.VxWorks.IO} (@code{i-vxwoio.ads})
  
  
--- 25559,25565 ----
  This package provides a limited binding to the VxWorks API.
  
  @node Interfaces VxWorks IO i-vxwoio ads,System Address_Image s-addima ads,Interfaces VxWorks i-vxwork ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id134}@anchor{3fb}@anchor{gnat_rm/the_gnat_library interfaces-vxworks-io-i-vxwoio-ads}@anchor{3fc}
  @section @code{Interfaces.VxWorks.IO} (@code{i-vxwoio.ads})
  
  
*************** function codes. A particular use of this
*** 25563,25569 ****
  to enable the use of Get_Immediate under VxWorks.
  
  @node System Address_Image s-addima ads,System Assertions s-assert ads,Interfaces VxWorks IO i-vxwoio ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id134}@anchor{3fb}@anchor{gnat_rm/the_gnat_library system-address-image-s-addima-ads}@anchor{3fc}
  @section @code{System.Address_Image} (@code{s-addima.ads})
  
  
--- 25582,25588 ----
  to enable the use of Get_Immediate under VxWorks.
  
  @node System Address_Image s-addima ads,System Assertions s-assert ads,Interfaces VxWorks IO i-vxwoio ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id135}@anchor{3fd}@anchor{gnat_rm/the_gnat_library system-address-image-s-addima-ads}@anchor{3fe}
  @section @code{System.Address_Image} (@code{s-addima.ads})
  
  
*************** function that gives an (implementation d
*** 25579,25585 ****
  string which identifies an address.
  
  @node System Assertions s-assert ads,System Atomic_Counters s-atocou ads,System Address_Image s-addima ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id135}@anchor{3fd}@anchor{gnat_rm/the_gnat_library system-assertions-s-assert-ads}@anchor{3fe}
  @section @code{System.Assertions} (@code{s-assert.ads})
  
  
--- 25598,25604 ----
  string which identifies an address.
  
  @node System Assertions s-assert ads,System Atomic_Counters s-atocou ads,System Address_Image s-addima ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id136}@anchor{3ff}@anchor{gnat_rm/the_gnat_library system-assertions-s-assert-ads}@anchor{400}
  @section @code{System.Assertions} (@code{s-assert.ads})
  
  
*************** by an run-time assertion failure, as wel
*** 25595,25601 ****
  is used internally to raise this assertion.
  
  @node System Atomic_Counters s-atocou ads,System Memory s-memory ads,System Assertions s-assert ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id136}@anchor{3ff}@anchor{gnat_rm/the_gnat_library system-atomic-counters-s-atocou-ads}@anchor{400}
  @section @code{System.Atomic_Counters} (@code{s-atocou.ads})
  
  
--- 25614,25620 ----
  is used internally to raise this assertion.
  
  @node System Atomic_Counters s-atocou ads,System Memory s-memory ads,System Assertions s-assert ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id137}@anchor{401}@anchor{gnat_rm/the_gnat_library system-atomic-counters-s-atocou-ads}@anchor{402}
  @section @code{System.Atomic_Counters} (@code{s-atocou.ads})
  
  
*************** on most targets, including all Alpha, AA
*** 25609,25615 ****
  x86, and x86_64 platforms.
  
  @node System Memory s-memory ads,System Multiprocessors s-multip ads,System Atomic_Counters s-atocou ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id137}@anchor{401}@anchor{gnat_rm/the_gnat_library system-memory-s-memory-ads}@anchor{402}
  @section @code{System.Memory} (@code{s-memory.ads})
  
  
--- 25628,25634 ----
  x86, and x86_64 platforms.
  
  @node System Memory s-memory ads,System Multiprocessors s-multip ads,System Atomic_Counters s-atocou ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id138}@anchor{403}@anchor{gnat_rm/the_gnat_library system-memory-s-memory-ads}@anchor{404}
  @section @code{System.Memory} (@code{s-memory.ads})
  
  
*************** calls to this unit may be made for low l
*** 25627,25633 ****
  example see the body of @code{GNAT.Tables}).
  
  @node System Multiprocessors s-multip ads,System Multiprocessors Dispatching_Domains s-mudido ads,System Memory s-memory ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id138}@anchor{403}@anchor{gnat_rm/the_gnat_library system-multiprocessors-s-multip-ads}@anchor{404}
  @section @code{System.Multiprocessors} (@code{s-multip.ads})
  
  
--- 25646,25652 ----
  example see the body of @code{GNAT.Tables}).
  
  @node System Multiprocessors s-multip ads,System Multiprocessors Dispatching_Domains s-mudido ads,System Memory s-memory ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id139}@anchor{405}@anchor{gnat_rm/the_gnat_library system-multiprocessors-s-multip-ads}@anchor{406}
  @section @code{System.Multiprocessors} (@code{s-multip.ads})
  
  
*************** in GNAT we also make it available in Ada
*** 25640,25646 ****
  technically an implementation-defined addition).
  
  @node System Multiprocessors Dispatching_Domains s-mudido ads,System Partition_Interface s-parint ads,System Multiprocessors s-multip ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id139}@anchor{405}@anchor{gnat_rm/the_gnat_library system-multiprocessors-dispatching-domains-s-mudido-ads}@anchor{406}
  @section @code{System.Multiprocessors.Dispatching_Domains} (@code{s-mudido.ads})
  
  
--- 25659,25665 ----
  technically an implementation-defined addition).
  
  @node System Multiprocessors Dispatching_Domains s-mudido ads,System Partition_Interface s-parint ads,System Multiprocessors s-multip ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id140}@anchor{407}@anchor{gnat_rm/the_gnat_library system-multiprocessors-dispatching-domains-s-mudido-ads}@anchor{408}
  @section @code{System.Multiprocessors.Dispatching_Domains} (@code{s-mudido.ads})
  
  
*************** in GNAT we also make it available in Ada
*** 25653,25659 ****
  technically an implementation-defined addition).
  
  @node System Partition_Interface s-parint ads,System Pool_Global s-pooglo ads,System Multiprocessors Dispatching_Domains s-mudido ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id140}@anchor{407}@anchor{gnat_rm/the_gnat_library system-partition-interface-s-parint-ads}@anchor{408}
  @section @code{System.Partition_Interface} (@code{s-parint.ads})
  
  
--- 25672,25678 ----
  technically an implementation-defined addition).
  
  @node System Partition_Interface s-parint ads,System Pool_Global s-pooglo ads,System Multiprocessors Dispatching_Domains s-mudido ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id141}@anchor{409}@anchor{gnat_rm/the_gnat_library system-partition-interface-s-parint-ads}@anchor{40a}
  @section @code{System.Partition_Interface} (@code{s-parint.ads})
  
  
*************** is used primarily in a distribution cont
*** 25666,25672 ****
  with @code{PolyORB}.
  
  @node System Pool_Global s-pooglo ads,System Pool_Local s-pooloc ads,System Partition_Interface s-parint ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id141}@anchor{409}@anchor{gnat_rm/the_gnat_library system-pool-global-s-pooglo-ads}@anchor{40a}
  @section @code{System.Pool_Global} (@code{s-pooglo.ads})
  
  
--- 25685,25691 ----
  with @code{PolyORB}.
  
  @node System Pool_Global s-pooglo ads,System Pool_Local s-pooloc ads,System Partition_Interface s-parint ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id142}@anchor{40b}@anchor{gnat_rm/the_gnat_library system-pool-global-s-pooglo-ads}@anchor{40c}
  @section @code{System.Pool_Global} (@code{s-pooglo.ads})
  
  
*************** declared. It uses malloc/free to allocat
*** 25683,25689 ****
  do any automatic reclamation.
  
  @node System Pool_Local s-pooloc ads,System Restrictions s-restri ads,System Pool_Global s-pooglo ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id142}@anchor{40b}@anchor{gnat_rm/the_gnat_library system-pool-local-s-pooloc-ads}@anchor{40c}
  @section @code{System.Pool_Local} (@code{s-pooloc.ads})
  
  
--- 25702,25708 ----
  do any automatic reclamation.
  
  @node System Pool_Local s-pooloc ads,System Restrictions s-restri ads,System Pool_Global s-pooglo ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id143}@anchor{40d}@anchor{gnat_rm/the_gnat_library system-pool-local-s-pooloc-ads}@anchor{40e}
  @section @code{System.Pool_Local} (@code{s-pooloc.ads})
  
  
*************** a list of allocated blocks, so that all
*** 25700,25706 ****
  be freed automatically when the pool is finalized.
  
  @node System Restrictions s-restri ads,System Rident s-rident ads,System Pool_Local s-pooloc ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id143}@anchor{40d}@anchor{gnat_rm/the_gnat_library system-restrictions-s-restri-ads}@anchor{40e}
  @section @code{System.Restrictions} (@code{s-restri.ads})
  
  
--- 25719,25725 ----
  be freed automatically when the pool is finalized.
  
  @node System Restrictions s-restri ads,System Rident s-rident ads,System Pool_Local s-pooloc ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id144}@anchor{40f}@anchor{gnat_rm/the_gnat_library system-restrictions-s-restri-ads}@anchor{410}
  @section @code{System.Restrictions} (@code{s-restri.ads})
  
  
*************** compiler determined information on which
*** 25716,25722 ****
  are violated by one or more packages in the partition.
  
  @node System Rident s-rident ads,System Strings Stream_Ops s-ststop ads,System Restrictions s-restri ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id144}@anchor{40f}@anchor{gnat_rm/the_gnat_library system-rident-s-rident-ads}@anchor{410}
  @section @code{System.Rident} (@code{s-rident.ads})
  
  
--- 25735,25741 ----
  are violated by one or more packages in the partition.
  
  @node System Rident s-rident ads,System Strings Stream_Ops s-ststop ads,System Restrictions s-restri ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id145}@anchor{411}@anchor{gnat_rm/the_gnat_library system-rident-s-rident-ads}@anchor{412}
  @section @code{System.Rident} (@code{s-rident.ads})
  
  
*************** since the necessary instantiation is inc
*** 25732,25738 ****
  package System.Restrictions.
  
  @node System Strings Stream_Ops s-ststop ads,System Unsigned_Types s-unstyp ads,System Rident s-rident ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id145}@anchor{411}@anchor{gnat_rm/the_gnat_library system-strings-stream-ops-s-ststop-ads}@anchor{412}
  @section @code{System.Strings.Stream_Ops} (@code{s-ststop.ads})
  
  
--- 25751,25757 ----
  package System.Restrictions.
  
  @node System Strings Stream_Ops s-ststop ads,System Unsigned_Types s-unstyp ads,System Rident s-rident ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id146}@anchor{413}@anchor{gnat_rm/the_gnat_library system-strings-stream-ops-s-ststop-ads}@anchor{414}
  @section @code{System.Strings.Stream_Ops} (@code{s-ststop.ads})
  
  
*************** stream attributes are applied to string
*** 25748,25754 ****
  package can be used directly by application programs.
  
  @node System Unsigned_Types s-unstyp ads,System Wch_Cnv s-wchcnv ads,System Strings Stream_Ops s-ststop ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id146}@anchor{413}@anchor{gnat_rm/the_gnat_library system-unsigned-types-s-unstyp-ads}@anchor{414}
  @section @code{System.Unsigned_Types} (@code{s-unstyp.ads})
  
  
--- 25767,25773 ----
  package can be used directly by application programs.
  
  @node System Unsigned_Types s-unstyp ads,System Wch_Cnv s-wchcnv ads,System Strings Stream_Ops s-ststop ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id147}@anchor{415}@anchor{gnat_rm/the_gnat_library system-unsigned-types-s-unstyp-ads}@anchor{416}
  @section @code{System.Unsigned_Types} (@code{s-unstyp.ads})
  
  
*************** also contains some related definitions f
*** 25761,25767 ****
  used by the compiler in connection with packed array types.
  
  @node System Wch_Cnv s-wchcnv ads,System Wch_Con s-wchcon ads,System Unsigned_Types s-unstyp ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id147}@anchor{415}@anchor{gnat_rm/the_gnat_library system-wch-cnv-s-wchcnv-ads}@anchor{416}
  @section @code{System.Wch_Cnv} (@code{s-wchcnv.ads})
  
  
--- 25780,25786 ----
  used by the compiler in connection with packed array types.
  
  @node System Wch_Cnv s-wchcnv ads,System Wch_Con s-wchcon ads,System Unsigned_Types s-unstyp ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id148}@anchor{417}@anchor{gnat_rm/the_gnat_library system-wch-cnv-s-wchcnv-ads}@anchor{418}
  @section @code{System.Wch_Cnv} (@code{s-wchcnv.ads})
  
  
*************** encoding method.  It uses definitions in
*** 25782,25788 ****
  package @code{System.Wch_Con}.
  
  @node System Wch_Con s-wchcon ads,,System Wch_Cnv s-wchcnv ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id148}@anchor{417}@anchor{gnat_rm/the_gnat_library system-wch-con-s-wchcon-ads}@anchor{418}
  @section @code{System.Wch_Con} (@code{s-wchcon.ads})
  
  
--- 25801,25807 ----
  package @code{System.Wch_Con}.
  
  @node System Wch_Con s-wchcon ads,,System Wch_Cnv s-wchcnv ads,The GNAT Library
! @anchor{gnat_rm/the_gnat_library id149}@anchor{419}@anchor{gnat_rm/the_gnat_library system-wch-con-s-wchcon-ads}@anchor{41a}
  @section @code{System.Wch_Con} (@code{s-wchcon.ads})
  
  
*************** in ordinary strings.  These definitions
*** 25794,25800 ****
  the package @code{System.Wch_Cnv}.
  
  @node Interfacing to Other Languages,Specialized Needs Annexes,The GNAT Library,Top
! @anchor{gnat_rm/interfacing_to_other_languages doc}@anchor{419}@anchor{gnat_rm/interfacing_to_other_languages id1}@anchor{41a}@anchor{gnat_rm/interfacing_to_other_languages interfacing-to-other-languages}@anchor{11}
  @chapter Interfacing to Other Languages
  
  
--- 25813,25819 ----
  the package @code{System.Wch_Cnv}.
  
  @node Interfacing to Other Languages,Specialized Needs Annexes,The GNAT Library,Top
! @anchor{gnat_rm/interfacing_to_other_languages doc}@anchor{41b}@anchor{gnat_rm/interfacing_to_other_languages id1}@anchor{41c}@anchor{gnat_rm/interfacing_to_other_languages interfacing-to-other-languages}@anchor{11}
  @chapter Interfacing to Other Languages
  
  
*************** provided.
*** 25812,25818 ****
  @end menu
  
  @node Interfacing to C,Interfacing to C++,,Interfacing to Other Languages
! @anchor{gnat_rm/interfacing_to_other_languages id2}@anchor{41b}@anchor{gnat_rm/interfacing_to_other_languages interfacing-to-c}@anchor{41c}
  @section Interfacing to C
  
  
--- 25831,25837 ----
  @end menu
  
  @node Interfacing to C,Interfacing to C++,,Interfacing to Other Languages
! @anchor{gnat_rm/interfacing_to_other_languages id2}@anchor{41d}@anchor{gnat_rm/interfacing_to_other_languages interfacing-to-c}@anchor{41e}
  @section Interfacing to C
  
  
*************** of the length corresponding to the @code
*** 25952,25958 ****
  @end itemize
  
  @node Interfacing to C++,Interfacing to COBOL,Interfacing to C,Interfacing to Other Languages
! @anchor{gnat_rm/interfacing_to_other_languages id3}@anchor{49}@anchor{gnat_rm/interfacing_to_other_languages id4}@anchor{41d}
  @section Interfacing to C++
  
  
--- 25971,25977 ----
  @end itemize
  
  @node Interfacing to C++,Interfacing to COBOL,Interfacing to C,Interfacing to Other Languages
! @anchor{gnat_rm/interfacing_to_other_languages id3}@anchor{49}@anchor{gnat_rm/interfacing_to_other_languages id4}@anchor{41f}
  @section Interfacing to C++
  
  
*************** builds an opaque @code{Type_Info_Ptr} to
*** 26169,26175 ****
  object at a given @code{System.Address}.
  
  @node Interfacing to COBOL,Interfacing to Fortran,Interfacing to C++,Interfacing to Other Languages
! @anchor{gnat_rm/interfacing_to_other_languages id5}@anchor{41e}@anchor{gnat_rm/interfacing_to_other_languages interfacing-to-cobol}@anchor{41f}
  @section Interfacing to COBOL
  
  
--- 26188,26194 ----
  object at a given @code{System.Address}.
  
  @node Interfacing to COBOL,Interfacing to Fortran,Interfacing to C++,Interfacing to Other Languages
! @anchor{gnat_rm/interfacing_to_other_languages id5}@anchor{420}@anchor{gnat_rm/interfacing_to_other_languages interfacing-to-cobol}@anchor{421}
  @section Interfacing to COBOL
  
  
*************** Interfacing to COBOL is achieved as desc
*** 26177,26183 ****
  the Ada Reference Manual.
  
  @node Interfacing to Fortran,Interfacing to non-GNAT Ada code,Interfacing to COBOL,Interfacing to Other Languages
! @anchor{gnat_rm/interfacing_to_other_languages id6}@anchor{420}@anchor{gnat_rm/interfacing_to_other_languages interfacing-to-fortran}@anchor{421}
  @section Interfacing to Fortran
  
  
--- 26196,26202 ----
  the Ada Reference Manual.
  
  @node Interfacing to Fortran,Interfacing to non-GNAT Ada code,Interfacing to COBOL,Interfacing to Other Languages
! @anchor{gnat_rm/interfacing_to_other_languages id6}@anchor{422}@anchor{gnat_rm/interfacing_to_other_languages interfacing-to-fortran}@anchor{423}
  @section Interfacing to Fortran
  
  
*************** multi-dimensional array causes the array
*** 26187,26193 ****
  order as required for convenient interface to Fortran.
  
  @node Interfacing to non-GNAT Ada code,,Interfacing to Fortran,Interfacing to Other Languages
! @anchor{gnat_rm/interfacing_to_other_languages id7}@anchor{422}@anchor{gnat_rm/interfacing_to_other_languages interfacing-to-non-gnat-ada-code}@anchor{423}
  @section Interfacing to non-GNAT Ada code
  
  
--- 26206,26212 ----
  order as required for convenient interface to Fortran.
  
  @node Interfacing to non-GNAT Ada code,,Interfacing to Fortran,Interfacing to Other Languages
! @anchor{gnat_rm/interfacing_to_other_languages id7}@anchor{424}@anchor{gnat_rm/interfacing_to_other_languages interfacing-to-non-gnat-ada-code}@anchor{425}
  @section Interfacing to non-GNAT Ada code
  
  
*************** values or simple record types without va
*** 26211,26217 ****
  types with fixed bounds.
  
  @node Specialized Needs Annexes,Implementation of Specific Ada Features,Interfacing to Other Languages,Top
! @anchor{gnat_rm/specialized_needs_annexes doc}@anchor{424}@anchor{gnat_rm/specialized_needs_annexes id1}@anchor{425}@anchor{gnat_rm/specialized_needs_annexes specialized-needs-annexes}@anchor{12}
  @chapter Specialized Needs Annexes
  
  
--- 26230,26236 ----
  types with fixed bounds.
  
  @node Specialized Needs Annexes,Implementation of Specific Ada Features,Interfacing to Other Languages,Top
! @anchor{gnat_rm/specialized_needs_annexes doc}@anchor{426}@anchor{gnat_rm/specialized_needs_annexes id1}@anchor{427}@anchor{gnat_rm/specialized_needs_annexes specialized-needs-annexes}@anchor{12}
  @chapter Specialized Needs Annexes
  
  
*************** in Ada 2005) is fully implemented.
*** 26249,26255 ****
  @end table
  
  @node Implementation of Specific Ada Features,Implementation of Ada 2022 Features,Specialized Needs Annexes,Top
! @anchor{gnat_rm/implementation_of_specific_ada_features doc}@anchor{426}@anchor{gnat_rm/implementation_of_specific_ada_features id1}@anchor{427}@anchor{gnat_rm/implementation_of_specific_ada_features implementation-of-specific-ada-features}@anchor{13}
  @chapter Implementation of Specific Ada Features
  
  
--- 26268,26274 ----
  @end table
  
  @node Implementation of Specific Ada Features,Implementation of Ada 2022 Features,Specialized Needs Annexes,Top
! @anchor{gnat_rm/implementation_of_specific_ada_features doc}@anchor{428}@anchor{gnat_rm/implementation_of_specific_ada_features id1}@anchor{429}@anchor{gnat_rm/implementation_of_specific_ada_features implementation-of-specific-ada-features}@anchor{13}
  @chapter Implementation of Specific Ada Features
  
  
*************** facilities.
*** 26268,26274 ****
  @end menu
  
  @node Machine Code Insertions,GNAT Implementation of Tasking,,Implementation of Specific Ada Features
! @anchor{gnat_rm/implementation_of_specific_ada_features id2}@anchor{428}@anchor{gnat_rm/implementation_of_specific_ada_features machine-code-insertions}@anchor{181}
  @section Machine Code Insertions
  
  
--- 26287,26293 ----
  @end menu
  
  @node Machine Code Insertions,GNAT Implementation of Tasking,,Implementation of Specific Ada Features
! @anchor{gnat_rm/implementation_of_specific_ada_features id2}@anchor{42a}@anchor{gnat_rm/implementation_of_specific_ada_features machine-code-insertions}@anchor{181}
  @section Machine Code Insertions
  
  
*************** according to normal visibility rules. In
*** 26436,26442 ****
  qualification is required.
  
  @node GNAT Implementation of Tasking,GNAT Implementation of Shared Passive Packages,Machine Code Insertions,Implementation of Specific Ada Features
! @anchor{gnat_rm/implementation_of_specific_ada_features gnat-implementation-of-tasking}@anchor{429}@anchor{gnat_rm/implementation_of_specific_ada_features id3}@anchor{42a}
  @section GNAT Implementation of Tasking
  
  
--- 26455,26461 ----
  qualification is required.
  
  @node GNAT Implementation of Tasking,GNAT Implementation of Shared Passive Packages,Machine Code Insertions,Implementation of Specific Ada Features
! @anchor{gnat_rm/implementation_of_specific_ada_features gnat-implementation-of-tasking}@anchor{42b}@anchor{gnat_rm/implementation_of_specific_ada_features id3}@anchor{42c}
  @section GNAT Implementation of Tasking
  
  
*************** to compliance with the Real-Time Systems
*** 26452,26458 ****
  @end menu
  
  @node Mapping Ada Tasks onto the Underlying Kernel Threads,Ensuring Compliance with the Real-Time Annex,,GNAT Implementation of Tasking
! @anchor{gnat_rm/implementation_of_specific_ada_features id4}@anchor{42b}@anchor{gnat_rm/implementation_of_specific_ada_features mapping-ada-tasks-onto-the-underlying-kernel-threads}@anchor{42c}
  @subsection Mapping Ada Tasks onto the Underlying Kernel Threads
  
  
--- 26471,26477 ----
  @end menu
  
  @node Mapping Ada Tasks onto the Underlying Kernel Threads,Ensuring Compliance with the Real-Time Annex,,GNAT Implementation of Tasking
! @anchor{gnat_rm/implementation_of_specific_ada_features id4}@anchor{42d}@anchor{gnat_rm/implementation_of_specific_ada_features mapping-ada-tasks-onto-the-underlying-kernel-threads}@anchor{42e}
  @subsection Mapping Ada Tasks onto the Underlying Kernel Threads
  
  
*************** support this functionality when the pare
*** 26521,26527 ****
  @geindex Forking a new process
  
  @node Ensuring Compliance with the Real-Time Annex,Support for Locking Policies,Mapping Ada Tasks onto the Underlying Kernel Threads,GNAT Implementation of Tasking
! @anchor{gnat_rm/implementation_of_specific_ada_features ensuring-compliance-with-the-real-time-annex}@anchor{42d}@anchor{gnat_rm/implementation_of_specific_ada_features id5}@anchor{42e}
  @subsection Ensuring Compliance with the Real-Time Annex
  
  
--- 26540,26546 ----
  @geindex Forking a new process
  
  @node Ensuring Compliance with the Real-Time Annex,Support for Locking Policies,Mapping Ada Tasks onto the Underlying Kernel Threads,GNAT Implementation of Tasking
! @anchor{gnat_rm/implementation_of_specific_ada_features ensuring-compliance-with-the-real-time-annex}@anchor{42f}@anchor{gnat_rm/implementation_of_specific_ada_features id5}@anchor{430}
  @subsection Ensuring Compliance with the Real-Time Annex
  
  
*************** placed at the end.
*** 26572,26578 ****
  @c Support_for_Locking_Policies
  
  @node Support for Locking Policies,,Ensuring Compliance with the Real-Time Annex,GNAT Implementation of Tasking
! @anchor{gnat_rm/implementation_of_specific_ada_features support-for-locking-policies}@anchor{42f}
  @subsection Support for Locking Policies
  
  
--- 26591,26597 ----
  @c Support_for_Locking_Policies
  
  @node Support for Locking Policies,,Ensuring Compliance with the Real-Time Annex,GNAT Implementation of Tasking
! @anchor{gnat_rm/implementation_of_specific_ada_features support-for-locking-policies}@anchor{431}
  @subsection Support for Locking Policies
  
  
*************** then ceiling locking is used.
*** 26606,26612 ****
  Otherwise, the @code{Ceiling_Locking} policy is ignored.
  
  @node GNAT Implementation of Shared Passive Packages,Code Generation for Array Aggregates,GNAT Implementation of Tasking,Implementation of Specific Ada Features
! @anchor{gnat_rm/implementation_of_specific_ada_features gnat-implementation-of-shared-passive-packages}@anchor{430}@anchor{gnat_rm/implementation_of_specific_ada_features id6}@anchor{431}
  @section GNAT Implementation of Shared Passive Packages
  
  
--- 26625,26631 ----
  Otherwise, the @code{Ceiling_Locking} policy is ignored.
  
  @node GNAT Implementation of Shared Passive Packages,Code Generation for Array Aggregates,GNAT Implementation of Tasking,Implementation of Specific Ada Features
! @anchor{gnat_rm/implementation_of_specific_ada_features gnat-implementation-of-shared-passive-packages}@anchor{432}@anchor{gnat_rm/implementation_of_specific_ada_features id6}@anchor{433}
  @section GNAT Implementation of Shared Passive Packages
  
  
*************** This is used to provide the required loc
*** 26704,26710 ****
  semantics for proper protected object synchronization.
  
  @node Code Generation for Array Aggregates,The Size of Discriminated Records with Default Discriminants,GNAT Implementation of Shared Passive Packages,Implementation of Specific Ada Features
! @anchor{gnat_rm/implementation_of_specific_ada_features code-generation-for-array-aggregates}@anchor{432}@anchor{gnat_rm/implementation_of_specific_ada_features id7}@anchor{433}
  @section Code Generation for Array Aggregates
  
  
--- 26723,26729 ----
  semantics for proper protected object synchronization.
  
  @node Code Generation for Array Aggregates,The Size of Discriminated Records with Default Discriminants,GNAT Implementation of Shared Passive Packages,Implementation of Specific Ada Features
! @anchor{gnat_rm/implementation_of_specific_ada_features code-generation-for-array-aggregates}@anchor{434}@anchor{gnat_rm/implementation_of_specific_ada_features id7}@anchor{435}
  @section Code Generation for Array Aggregates
  
  
*************** component values and static subtypes als
*** 26735,26741 ****
  @end menu
  
  @node Static constant aggregates with static bounds,Constant aggregates with unconstrained nominal types,,Code Generation for Array Aggregates
! @anchor{gnat_rm/implementation_of_specific_ada_features id8}@anchor{434}@anchor{gnat_rm/implementation_of_specific_ada_features static-constant-aggregates-with-static-bounds}@anchor{435}
  @subsection Static constant aggregates with static bounds
  
  
--- 26754,26760 ----
  @end menu
  
  @node Static constant aggregates with static bounds,Constant aggregates with unconstrained nominal types,,Code Generation for Array Aggregates
! @anchor{gnat_rm/implementation_of_specific_ada_features id8}@anchor{436}@anchor{gnat_rm/implementation_of_specific_ada_features static-constant-aggregates-with-static-bounds}@anchor{437}
  @subsection Static constant aggregates with static bounds
  
  
*************** Zero2: constant two_dim := (others => (o
*** 26782,26788 ****
  @end example
  
  @node Constant aggregates with unconstrained nominal types,Aggregates with static bounds,Static constant aggregates with static bounds,Code Generation for Array Aggregates
! @anchor{gnat_rm/implementation_of_specific_ada_features constant-aggregates-with-unconstrained-nominal-types}@anchor{436}@anchor{gnat_rm/implementation_of_specific_ada_features id9}@anchor{437}
  @subsection Constant aggregates with unconstrained nominal types
  
  
--- 26801,26807 ----
  @end example
  
  @node Constant aggregates with unconstrained nominal types,Aggregates with static bounds,Static constant aggregates with static bounds,Code Generation for Array Aggregates
! @anchor{gnat_rm/implementation_of_specific_ada_features constant-aggregates-with-unconstrained-nominal-types}@anchor{438}@anchor{gnat_rm/implementation_of_specific_ada_features id9}@anchor{439}
  @subsection Constant aggregates with unconstrained nominal types
  
  
*************** Cr_Unc : constant One_Unc := (12,24,36);
*** 26797,26803 ****
  @end example
  
  @node Aggregates with static bounds,Aggregates with nonstatic bounds,Constant aggregates with unconstrained nominal types,Code Generation for Array Aggregates
! @anchor{gnat_rm/implementation_of_specific_ada_features aggregates-with-static-bounds}@anchor{438}@anchor{gnat_rm/implementation_of_specific_ada_features id10}@anchor{439}
  @subsection Aggregates with static bounds
  
  
--- 26816,26822 ----
  @end example
  
  @node Aggregates with static bounds,Aggregates with nonstatic bounds,Constant aggregates with unconstrained nominal types,Code Generation for Array Aggregates
! @anchor{gnat_rm/implementation_of_specific_ada_features aggregates-with-static-bounds}@anchor{43a}@anchor{gnat_rm/implementation_of_specific_ada_features id10}@anchor{43b}
  @subsection Aggregates with static bounds
  
  
*************** end loop;
*** 26825,26831 ****
  @end example
  
  @node Aggregates with nonstatic bounds,Aggregates in assignment statements,Aggregates with static bounds,Code Generation for Array Aggregates
! @anchor{gnat_rm/implementation_of_specific_ada_features aggregates-with-nonstatic-bounds}@anchor{43a}@anchor{gnat_rm/implementation_of_specific_ada_features id11}@anchor{43b}
  @subsection Aggregates with nonstatic bounds
  
  
--- 26844,26850 ----
  @end example
  
  @node Aggregates with nonstatic bounds,Aggregates in assignment statements,Aggregates with static bounds,Code Generation for Array Aggregates
! @anchor{gnat_rm/implementation_of_specific_ada_features aggregates-with-nonstatic-bounds}@anchor{43c}@anchor{gnat_rm/implementation_of_specific_ada_features id11}@anchor{43d}
  @subsection Aggregates with nonstatic bounds
  
  
*************** have to be applied to sub-arrays individ
*** 26836,26842 ****
  compatible subtypes.
  
  @node Aggregates in assignment statements,,Aggregates with nonstatic bounds,Code Generation for Array Aggregates
! @anchor{gnat_rm/implementation_of_specific_ada_features aggregates-in-assignment-statements}@anchor{43c}@anchor{gnat_rm/implementation_of_specific_ada_features id12}@anchor{43d}
  @subsection Aggregates in assignment statements
  
  
--- 26855,26861 ----
  compatible subtypes.
  
  @node Aggregates in assignment statements,,Aggregates with nonstatic bounds,Code Generation for Array Aggregates
! @anchor{gnat_rm/implementation_of_specific_ada_features aggregates-in-assignment-statements}@anchor{43e}@anchor{gnat_rm/implementation_of_specific_ada_features id12}@anchor{43f}
  @subsection Aggregates in assignment statements
  
  
*************** a temporary (created either by the front
*** 26878,26884 ****
  that temporary will be copied onto the target.
  
  @node The Size of Discriminated Records with Default Discriminants,Image Values For Nonscalar Types,Code Generation for Array Aggregates,Implementation of Specific Ada Features
! @anchor{gnat_rm/implementation_of_specific_ada_features id13}@anchor{43e}@anchor{gnat_rm/implementation_of_specific_ada_features the-size-of-discriminated-records-with-default-discriminants}@anchor{43f}
  @section The Size of Discriminated Records with Default Discriminants
  
  
--- 26897,26903 ----
  that temporary will be copied onto the target.
  
  @node The Size of Discriminated Records with Default Discriminants,Image Values For Nonscalar Types,Code Generation for Array Aggregates,Implementation of Specific Ada Features
! @anchor{gnat_rm/implementation_of_specific_ada_features id13}@anchor{440}@anchor{gnat_rm/implementation_of_specific_ada_features the-size-of-discriminated-records-with-default-discriminants}@anchor{441}
  @section The Size of Discriminated Records with Default Discriminants
  
  
*************** say) must be consistent, so it is impera
*** 26958,26964 ****
  remain invariant.
  
  @node Image Values For Nonscalar Types,Strict Conformance to the Ada Reference Manual,The Size of Discriminated Records with Default Discriminants,Implementation of Specific Ada Features
! @anchor{gnat_rm/implementation_of_specific_ada_features id14}@anchor{440}@anchor{gnat_rm/implementation_of_specific_ada_features image-values-for-nonscalar-types}@anchor{441}
  @section Image Values For Nonscalar Types
  
  
--- 26977,26983 ----
  remain invariant.
  
  @node Image Values For Nonscalar Types,Strict Conformance to the Ada Reference Manual,The Size of Discriminated Records with Default Discriminants,Implementation of Specific Ada Features
! @anchor{gnat_rm/implementation_of_specific_ada_features id14}@anchor{442}@anchor{gnat_rm/implementation_of_specific_ada_features image-values-for-nonscalar-types}@anchor{443}
  @section Image Values For Nonscalar Types
  
  
*************** control of image text is required for so
*** 26978,26984 ****
  explicitly specified.
  
  @node Strict Conformance to the Ada Reference Manual,,Image Values For Nonscalar Types,Implementation of Specific Ada Features
! @anchor{gnat_rm/implementation_of_specific_ada_features id15}@anchor{442}@anchor{gnat_rm/implementation_of_specific_ada_features strict-conformance-to-the-ada-reference-manual}@anchor{443}
  @section Strict Conformance to the Ada Reference Manual
  
  
--- 26997,27003 ----
  explicitly specified.
  
  @node Strict Conformance to the Ada Reference Manual,,Image Values For Nonscalar Types,Implementation of Specific Ada Features
! @anchor{gnat_rm/implementation_of_specific_ada_features id15}@anchor{444}@anchor{gnat_rm/implementation_of_specific_ada_features strict-conformance-to-the-ada-reference-manual}@anchor{445}
  @section Strict Conformance to the Ada Reference Manual
  
  
*************** behavior (although at the cost of a sign
*** 27005,27011 ****
  infinite and NaN values are properly generated.
  
  @node Implementation of Ada 2022 Features,GNAT language extensions,Implementation of Specific Ada Features,Top
! @anchor{gnat_rm/implementation_of_ada_2022_features doc}@anchor{444}@anchor{gnat_rm/implementation_of_ada_2022_features id1}@anchor{445}@anchor{gnat_rm/implementation_of_ada_2022_features implementation-of-ada-2022-features}@anchor{14}
  @chapter Implementation of Ada 2022 Features
  
  
--- 27024,27030 ----
  infinite and NaN values are properly generated.
  
  @node Implementation of Ada 2022 Features,GNAT language extensions,Implementation of Specific Ada Features,Top
! @anchor{gnat_rm/implementation_of_ada_2022_features doc}@anchor{446}@anchor{gnat_rm/implementation_of_ada_2022_features id1}@anchor{447}@anchor{gnat_rm/implementation_of_ada_2022_features implementation-of-ada-2022-features}@anchor{14}
  @chapter Implementation of Ada 2022 Features
  
  
*************** RM references: 3.02.04 (31/5) 4.06 (51.1
*** 30424,30430 ****
  @end itemize
  
  @node GNAT language extensions,Security Hardening Features,Implementation of Ada 2022 Features,Top
! @anchor{gnat_rm/gnat_language_extensions doc}@anchor{446}@anchor{gnat_rm/gnat_language_extensions gnat-language-extensions}@anchor{447}@anchor{gnat_rm/gnat_language_extensions id1}@anchor{448}
  @chapter GNAT language extensions
  
  
--- 30443,30449 ----
  @end itemize
  
  @node GNAT language extensions,Security Hardening Features,Implementation of Ada 2022 Features,Top
! @anchor{gnat_rm/gnat_language_extensions doc}@anchor{448}@anchor{gnat_rm/gnat_language_extensions gnat-language-extensions}@anchor{449}@anchor{gnat_rm/gnat_language_extensions id1}@anchor{44a}
  @chapter GNAT language extensions
  
  
*************** These features might be removed or heavi
*** 30456,30462 ****
  @end menu
  
  @node How to activate the extended GNAT Ada superset,Curated Extensions,,GNAT language extensions
! @anchor{gnat_rm/gnat_language_extensions how-to-activate-the-extended-gnat-ada-superset}@anchor{449}
  @section How to activate the extended GNAT Ada superset
  
  
--- 30475,30481 ----
  @end menu
  
  @node How to activate the extended GNAT Ada superset,Curated Extensions,,GNAT language extensions
! @anchor{gnat_rm/gnat_language_extensions how-to-activate-the-extended-gnat-ada-superset}@anchor{44b}
  @section How to activate the extended GNAT Ada superset
  
  
*************** for use in playground experiments.
*** 30497,30503 ****
  @end cartouche
  
  @node Curated Extensions,Experimental Language Extensions,How to activate the extended GNAT Ada superset,GNAT language extensions
! @anchor{gnat_rm/gnat_language_extensions curated-extensions}@anchor{44a}@anchor{gnat_rm/gnat_language_extensions curated-language-extensions}@anchor{6a}
  @section Curated Extensions
  
  
--- 30516,30522 ----
  @end cartouche
  
  @node Curated Extensions,Experimental Language Extensions,How to activate the extended GNAT Ada superset,GNAT language extensions
! @anchor{gnat_rm/gnat_language_extensions curated-extensions}@anchor{44c}@anchor{gnat_rm/gnat_language_extensions curated-language-extensions}@anchor{6a}
  @section Curated Extensions
  
  
*************** Features activated via @code{-gnatX} or
*** 30515,30525 ****
  * Static aspect on intrinsic functions:: 
  * First Controlling Parameter:: 
  * Unsigned_Base_Range aspect:: 
  
  @end menu
  
  @node Local Declarations Without Block,Deep delta Aggregates,,Curated Extensions
! @anchor{gnat_rm/gnat_language_extensions local-declarations-without-block}@anchor{44b}
  @subsection Local Declarations Without Block
  
  
--- 30534,30545 ----
  * Static aspect on intrinsic functions:: 
  * First Controlling Parameter:: 
  * Unsigned_Base_Range aspect:: 
+ * Generalized Finalization:: 
  
  @end menu
  
  @node Local Declarations Without Block,Deep delta Aggregates,,Curated Extensions
! @anchor{gnat_rm/gnat_language_extensions local-declarations-without-block}@anchor{44d}
  @subsection Local Declarations Without Block
  
  
*************** And as such the second `@w{`}A`@w{`} dec
*** 30612,30618 ****
  @end cartouche
  
  @node Deep delta Aggregates,Fixed lower bounds for array types and subtypes,Local Declarations Without Block,Curated Extensions
! @anchor{gnat_rm/gnat_language_extensions deep-delta-aggregates}@anchor{44c}
  @subsection Deep delta Aggregates
  
  
--- 30632,30638 ----
  @end cartouche
  
  @node Deep delta Aggregates,Fixed lower bounds for array types and subtypes,Local Declarations Without Block,Curated Extensions
! @anchor{gnat_rm/gnat_language_extensions deep-delta-aggregates}@anchor{44e}
  @subsection Deep delta Aggregates
  
  
*************** The syntax of delta aggregates in the ex
*** 30634,30640 ****
  @end menu
  
  @node Syntax,Legality Rules,,Deep delta Aggregates
! @anchor{gnat_rm/gnat_language_extensions syntax}@anchor{44d}
  @subsubsection Syntax
  
  
--- 30654,30660 ----
  @end menu
  
  @node Syntax,Legality Rules,,Deep delta Aggregates
! @anchor{gnat_rm/gnat_language_extensions syntax}@anchor{44f}
  @subsubsection Syntax
  
  
*************** array_subcomponent_choice ::=
*** 30680,30686 ****
  @end example
  
  @node Legality Rules,Dynamic Semantics,Syntax,Deep delta Aggregates
! @anchor{gnat_rm/gnat_language_extensions legality-rules}@anchor{44e}
  @subsubsection Legality Rules
  
  
--- 30700,30706 ----
  @end example
  
  @node Legality Rules,Dynamic Semantics,Syntax,Deep delta Aggregates
! @anchor{gnat_rm/gnat_language_extensions legality-rules}@anchor{450}
  @subsubsection Legality Rules
  
  
*************** the object denoted by the base_expressio
*** 30717,30723 ****
  @end enumerate
  
  @node Dynamic Semantics,Examples,Legality Rules,Deep delta Aggregates
! @anchor{gnat_rm/gnat_language_extensions dynamic-semantics}@anchor{44f}
  @subsubsection Dynamic Semantics
  
  
--- 30737,30743 ----
  @end enumerate
  
  @node Dynamic Semantics,Examples,Legality Rules,Deep delta Aggregates
! @anchor{gnat_rm/gnat_language_extensions dynamic-semantics}@anchor{451}
  @subsubsection Dynamic Semantics
  
  
*************** and assigned to the corresponding subcom
*** 30774,30780 ****
  @end itemize
  
  @node Examples,,Dynamic Semantics,Deep delta Aggregates
! @anchor{gnat_rm/gnat_language_extensions examples}@anchor{450}
  @subsubsection Examples
  
  
--- 30794,30800 ----
  @end itemize
  
  @node Examples,,Dynamic Semantics,Deep delta Aggregates
! @anchor{gnat_rm/gnat_language_extensions examples}@anchor{452}
  @subsubsection Examples
  
  
*************** end;
*** 30802,30808 ****
  @end example
  
  @node Fixed lower bounds for array types and subtypes,Prefixed-view notation for calls to primitive subprograms of untagged types,Deep delta Aggregates,Curated Extensions
! @anchor{gnat_rm/gnat_language_extensions fixed-lower-bounds-for-array-types-and-subtypes}@anchor{451}
  @subsection Fixed lower bounds for array types and subtypes
  
  
--- 30822,30828 ----
  @end example
  
  @node Fixed lower bounds for array types and subtypes,Prefixed-view notation for calls to primitive subprograms of untagged types,Deep delta Aggregates,Curated Extensions
! @anchor{gnat_rm/gnat_language_extensions fixed-lower-bounds-for-array-types-and-subtypes}@anchor{453}
  @subsection Fixed lower bounds for array types and subtypes
  
  
*************** lower bound of unconstrained array forma
*** 30853,30859 ****
  ranges with static fixed lower bounds.
  
  @node Prefixed-view notation for calls to primitive subprograms of untagged types,Expression defaults for generic formal functions,Fixed lower bounds for array types and subtypes,Curated Extensions
! @anchor{gnat_rm/gnat_language_extensions prefixed-view-notation-for-calls-to-primitive-subprograms-of-untagged-types}@anchor{452}
  @subsection Prefixed-view notation for calls to primitive subprograms of untagged types
  
  
--- 30873,30879 ----
  ranges with static fixed lower bounds.
  
  @node Prefixed-view notation for calls to primitive subprograms of untagged types,Expression defaults for generic formal functions,Fixed lower bounds for array types and subtypes,Curated Extensions
! @anchor{gnat_rm/gnat_language_extensions prefixed-view-notation-for-calls-to-primitive-subprograms-of-untagged-types}@anchor{454}
  @subsection Prefixed-view notation for calls to primitive subprograms of untagged types
  
  
*************** pragma Assert (V.Nth_Element(1) = 42);
*** 30903,30909 ****
  @end example
  
  @node Expression defaults for generic formal functions,String interpolation,Prefixed-view notation for calls to primitive subprograms of untagged types,Curated Extensions
! @anchor{gnat_rm/gnat_language_extensions expression-defaults-for-generic-formal-functions}@anchor{453}
  @subsection Expression defaults for generic formal functions
  
  
--- 30923,30929 ----
  @end example
  
  @node Expression defaults for generic formal functions,String interpolation,Prefixed-view notation for calls to primitive subprograms of untagged types,Curated Extensions
! @anchor{gnat_rm/gnat_language_extensions expression-defaults-for-generic-formal-functions}@anchor{455}
  @subsection Expression defaults for generic formal functions
  
  
*************** If the default is used (i.e. there is no
*** 30934,30940 ****
  then calls to Copy in the instance will simply return Item.
  
  @node String interpolation,Constrained attribute for generic objects,Expression defaults for generic formal functions,Curated Extensions
! @anchor{gnat_rm/gnat_language_extensions string-interpolation}@anchor{454}
  @subsection String interpolation
  
  
--- 30954,30960 ----
  then calls to Copy in the instance will simply return Item.
  
  @node String interpolation,Constrained attribute for generic objects,Expression defaults for generic formal functions,Curated Extensions
! @anchor{gnat_rm/gnat_language_extensions string-interpolation}@anchor{456}
  @subsection String interpolation
  
  
*************** a double quote is " and an open brace is
*** 31101,31107 ****
  @end example
  
  @node Constrained attribute for generic objects,Static aspect on intrinsic functions,String interpolation,Curated Extensions
! @anchor{gnat_rm/gnat_language_extensions constrained-attribute-for-generic-objects}@anchor{455}
  @subsection Constrained attribute for generic objects
  
  
--- 31121,31127 ----
  @end example
  
  @node Constrained attribute for generic objects,Static aspect on intrinsic functions,String interpolation,Curated Extensions
! @anchor{gnat_rm/gnat_language_extensions constrained-attribute-for-generic-objects}@anchor{457}
  @subsection Constrained attribute for generic objects
  
  
*************** The @code{Constrained} attribute is perm
*** 31109,31115 ****
  result indicates whether the corresponding actual is constrained.
  
  @node Static aspect on intrinsic functions,First Controlling Parameter,Constrained attribute for generic objects,Curated Extensions
! @anchor{gnat_rm/gnat_language_extensions static-aspect-on-intrinsic-functions}@anchor{456}
  @subsection @code{Static} aspect on intrinsic functions
  
  
--- 31129,31135 ----
  result indicates whether the corresponding actual is constrained.
  
  @node Static aspect on intrinsic functions,First Controlling Parameter,Constrained attribute for generic objects,Curated Extensions
! @anchor{gnat_rm/gnat_language_extensions static-aspect-on-intrinsic-functions}@anchor{458}
  @subsection @code{Static} aspect on intrinsic functions
  
  
*************** and the compiler will evaluate some of t
*** 31118,31124 ****
  particular the @code{Shift_Left} and @code{Shift_Right} intrinsics.
  
  @node First Controlling Parameter,Unsigned_Base_Range aspect,Static aspect on intrinsic functions,Curated Extensions
! @anchor{gnat_rm/gnat_language_extensions first-controlling-parameter}@anchor{457}
  @subsection First Controlling Parameter
  
  
--- 31138,31144 ----
  particular the @code{Shift_Left} and @code{Shift_Right} intrinsics.
  
  @node First Controlling Parameter,Unsigned_Base_Range aspect,Static aspect on intrinsic functions,Curated Extensions
! @anchor{gnat_rm/gnat_language_extensions first-controlling-parameter}@anchor{459}
  @subsection First Controlling Parameter
  
  
*************** overriding a primitive or creating new o
*** 31217,31224 ****
  The result of a function is never a controlling result.
  @end itemize
  
! @node Unsigned_Base_Range aspect,,First Controlling Parameter,Curated Extensions
! @anchor{gnat_rm/gnat_language_extensions unsigned-base-range-aspect}@anchor{458}
  @subsection @code{Unsigned_Base_Range} aspect
  
  
--- 31237,31244 ----
  The result of a function is never a controlling result.
  @end itemize
  
! @node Unsigned_Base_Range aspect,Generalized Finalization,First Controlling Parameter,Curated Extensions
! @anchor{gnat_rm/gnat_language_extensions unsigned-base-range-aspect}@anchor{45a}
  @subsection @code{Unsigned_Base_Range} aspect
  
  
*************** type Uns_64 is range 0 .. 2 ** 64 - 1
*** 31243,31250 ****
  It ensures that arithmetic operations of type @code{Uns_64} are carried
  out using 64 bits.
  
  @node Experimental Language Extensions,,Curated Extensions,GNAT language extensions
! @anchor{gnat_rm/gnat_language_extensions experimental-language-extensions}@anchor{6b}@anchor{gnat_rm/gnat_language_extensions id2}@anchor{459}
  @section Experimental Language Extensions
  
  
--- 31263,31432 ----
  It ensures that arithmetic operations of type @code{Uns_64} are carried
  out using 64 bits.
  
+ @node Generalized Finalization,,Unsigned_Base_Range aspect,Curated Extensions
+ @anchor{gnat_rm/gnat_language_extensions generalized-finalization}@anchor{45b}
+ @subsection Generalized Finalization
+ 
+ 
+ The @code{Finalizable} aspect can be applied to any record type, tagged or not,
+ to specify that it provides the same level of control on the operations of
+ initialization, finalization, and assignment of objects as the controlled
+ types (see RM 7.6(2) for a high-level overview). The only restriction is
+ that the record type must be a root type, in other words not a derived type.
+ 
+ The aspect additionally makes it possible to specify relaxed semantics for
+ the finalization operations by means of the @code{Relaxed_Finalization} setting.
+ Here is the archetypal example:
+ 
+ @example
+ type T is record
+   ...
+ end record
+   with Finalizable => (Initialize           => Initialize,
+                        Adjust               => Adjust,
+                        Finalize             => Finalize,
+                        Relaxed_Finalization => True);
+ 
+ procedure Adjust     (Obj : in out T);
+ procedure Finalize   (Obj : in out T);
+ procedure Initialize (Obj : in out T);
+ @end example
+ 
+ The three procedures have the same profile, with a single @code{in out} parameter,
+ and also have the same dynamic semantics as for controlled types:
+ 
+ @quotation
+ 
+ 
+ @itemize -
+ 
+ @item 
+ @code{Initialize} is called when an object of type @code{T} is declared without
+ initialization expression.
+ 
+ @item 
+ @code{Adjust} is called after an object of type @code{T} is assigned a new value.
+ 
+ @item 
+ @code{Finalize} is called when an object of type @code{T} goes out of scope (for
+ stack-allocated objects) or is deallocated (for heap-allocated objects).
+ It is also called when the value is replaced by an assignment.
+ @end itemize
+ @end quotation
+ 
+ However, when @code{Relaxed_Finalization} is either @code{True} or not explicitly
+ specified, the following differences are implemented relative to the semantics
+ of controlled types:
+ 
+ 
+ @itemize *
+ 
+ @item 
+ The compiler has permission to perform no automatic finalization of
+ heap-allocated objects: @code{Finalize} is only called when such an object
+ is explicitly deallocated, or when the designated object is assigned a new
+ value. As a consequence, no runtime support is needed for performing
+ implicit deallocation. In particular, no per-object header data is needed
+ for heap-allocated objects.
+ 
+ Heap-allocated objects allocated through a nested access type will therefore
+ `not' be deallocated either. The result is simply that memory will be leaked
+ in this case.
+ 
+ @item 
+ The @code{Adjust} and @code{Finalize} procedures are automatically considered as
+ having the @ref{45c,,No_Raise aspect} specified for them. In particular, the
+ compiler has permission to enforce none of the guarantees specified by the
+ RM 7.6.1 (14/1) and subsequent subclauses.
+ @end itemize
+ 
+ Simple example of ref-counted type:
+ 
+ @example
+ type T is record
+    Value     : Integer;
+    Ref_Count : Natural := 0;
+ end record;
+ 
+ procedure Inc_Ref (X : in out T);
+ procedure Dec_Ref (X : in out T);
+ 
+ type T_Access is access all T;
+ 
+ type T_Ref is record
+    Value : T_Access;
+ end record
+    with Finalizable => (Adjust   => Adjust,
+                         Finalize => Finalize);
+ 
+ procedure Adjust (Ref : in out T_Ref) is
+ begin
+    Inc_Ref (Ref.Value);
+ end Adjust;
+ 
+ procedure Finalize (Ref : in out T_Ref) is
+ begin
+    Def_Ref (Ref.Value);
+ end Finalize;
+ @end example
+ 
+ Simple file handle that ensures resources are properly released:
+ 
+ @example
+ package P is
+    type File (<>) is limited private;
+ 
+    function Open (Path : String) return File;
+ 
+    procedure Close (F : in out File);
+ 
+ private
+    type File is limited record
+       Handle : ...;
+    end record
+       with Finalizable (Finalize => Close);
+ end P;
+ @end example
+ 
+ @menu
+ * Finalizable tagged types:: 
+ * Composite types:: 
+ * Interoperability with controlled types:: 
+ 
+ @end menu
+ 
+ @node Finalizable tagged types,Composite types,,Generalized Finalization
+ @anchor{gnat_rm/gnat_language_extensions finalizable-tagged-types}@anchor{45d}
+ @subsubsection Finalizable tagged types
+ 
+ 
+ The aspect is inherited by derived types and the primitives may be overridden
+ by the derivation. The compiler-generated calls to these operations are then
+ dispatching whenever it makes sense, i.e. when the object in question is of a
+ class-wide type and the class includes at least one finalizable tagged type.
+ 
+ @node Composite types,Interoperability with controlled types,Finalizable tagged types,Generalized Finalization
+ @anchor{gnat_rm/gnat_language_extensions composite-types}@anchor{45e}
+ @subsubsection Composite types
+ 
+ 
+ When a finalizable type is used as a component of a composite type, the latter
+ becomes finalizable as well. The three primitives are derived automatically
+ in order to call the primitives of their components. The dynamic semantics is
+ the same as for controlled components of composite types.
+ 
+ @node Interoperability with controlled types,,Composite types,Generalized Finalization
+ @anchor{gnat_rm/gnat_language_extensions interoperability-with-controlled-types}@anchor{45f}
+ @subsubsection Interoperability with controlled types
+ 
+ 
+ Finalizable types are fully interoperable with controlled types, in particular
+ it is possible for a finalizable type to have a controlled component and vice
+ versa, but the stricter dynamic semantics, in other words that of controlled
+ types, is applied in this case.
+ 
  @node Experimental Language Extensions,,Curated Extensions,GNAT language extensions
! @anchor{gnat_rm/gnat_language_extensions experimental-language-extensions}@anchor{6b}@anchor{gnat_rm/gnat_language_extensions id2}@anchor{460}
  @section Experimental Language Extensions
  
  
*************** Features activated via @code{-gnatX0} or
*** 31259,31276 ****
  * Simpler Accessibility Model:: 
  * Case pattern matching:: 
  * Mutably Tagged Types with Size’Class Aspect:: 
- * Generalized Finalization:: 
  * No_Raise aspect:: 
  * Inference of Dependent Types in Generic Instantiations:: 
  * External_Initialization Aspect:: 
  * Finally construct:: 
  * Continue statement:: 
  * Destructors:: 
  
  @end menu
  
  @node Conditional when constructs,Implicit With,,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions conditional-when-constructs}@anchor{45a}
  @subsection Conditional when constructs
  
  
--- 31441,31458 ----
  * Simpler Accessibility Model:: 
  * Case pattern matching:: 
  * Mutably Tagged Types with Size’Class Aspect:: 
  * No_Raise aspect:: 
  * Inference of Dependent Types in Generic Instantiations:: 
  * External_Initialization Aspect:: 
  * Finally construct:: 
  * Continue statement:: 
  * Destructors:: 
+ * Structural Generic Instantiation:: 
  
  @end menu
  
  @node Conditional when constructs,Implicit With,,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions conditional-when-constructs}@anchor{461}
  @subsection Conditional when constructs
  
  
*************** end;
*** 31339,31345 ****
  @end example
  
  @node Implicit With,Storage Model,Conditional when constructs,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions implicit-with}@anchor{45b}
  @subsection Implicit With
  
  
--- 31521,31527 ----
  @end example
  
  @node Implicit With,Storage Model,Conditional when constructs,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions implicit-with}@anchor{462}
  @subsection Implicit With
  
  
*************** end;
*** 31356,31362 ****
  @end example
  
  @node Storage Model,Attribute Super,Implicit With,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions storage-model}@anchor{45c}
  @subsection Storage Model
  
  
--- 31538,31544 ----
  @end example
  
  @node Storage Model,Attribute Super,Implicit With,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions storage-model}@anchor{463}
  @subsection Storage Model
  
  
*************** memory models, in particular to support
*** 31373,31379 ****
  @end menu
  
  @node Aspect Storage_Model_Type,Aspect Designated_Storage_Model,,Storage Model
! @anchor{gnat_rm/gnat_language_extensions aspect-storage-model-type}@anchor{45d}
  @subsubsection Aspect Storage_Model_Type
  
  
--- 31555,31561 ----
  @end menu
  
  @node Aspect Storage_Model_Type,Aspect Designated_Storage_Model,,Storage Model
! @anchor{gnat_rm/gnat_language_extensions aspect-storage-model-type}@anchor{464}
  @subsubsection Aspect Storage_Model_Type
  
  
*************** end CUDA_Memory;
*** 31507,31513 ****
  @end example
  
  @node Aspect Designated_Storage_Model,Legacy Storage Pools,Aspect Storage_Model_Type,Storage Model
! @anchor{gnat_rm/gnat_language_extensions aspect-designated-storage-model}@anchor{45e}
  @subsubsection Aspect Designated_Storage_Model
  
  
--- 31689,31695 ----
  @end example
  
  @node Aspect Designated_Storage_Model,Legacy Storage Pools,Aspect Storage_Model_Type,Storage Model
! @anchor{gnat_rm/gnat_language_extensions aspect-designated-storage-model}@anchor{465}
  @subsubsection Aspect Designated_Storage_Model
  
  
*************** begin
*** 31585,31591 ****
  @end example
  
  @node Legacy Storage Pools,,Aspect Designated_Storage_Model,Storage Model
! @anchor{gnat_rm/gnat_language_extensions legacy-storage-pools}@anchor{45f}
  @subsubsection Legacy Storage Pools
  
  
--- 31767,31773 ----
  @end example
  
  @node Legacy Storage Pools,,Aspect Designated_Storage_Model,Storage Model
! @anchor{gnat_rm/gnat_language_extensions legacy-storage-pools}@anchor{466}
  @subsubsection Legacy Storage Pools
  
  
*************** type Acc is access Integer_Array with St
*** 31636,31642 ****
  can still be accepted as a shortcut for the new syntax.
  
  @node Attribute Super,Simpler Accessibility Model,Storage Model,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions attribute-super}@anchor{460}
  @subsection Attribute Super
  
  
--- 31818,31824 ----
  can still be accepted as a shortcut for the new syntax.
  
  @node Attribute Super,Simpler Accessibility Model,Storage Model,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions attribute-super}@anchor{467}
  @subsection Attribute Super
  
  
*************** end;
*** 31671,31677 ****
  @end example
  
  @node Simpler Accessibility Model,Case pattern matching,Attribute Super,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions simpler-accessibility-model}@anchor{461}
  @subsection Simpler Accessibility Model
  
  
--- 31853,31859 ----
  @end example
  
  @node Simpler Accessibility Model,Case pattern matching,Attribute Super,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions simpler-accessibility-model}@anchor{468}
  @subsection Simpler Accessibility Model
  
  
*************** All of the refined rules are compatible
*** 31702,31708 ****
  @end menu
  
  @node Stand-alone objects,Subprogram parameters,,Simpler Accessibility Model
! @anchor{gnat_rm/gnat_language_extensions stand-alone-objects}@anchor{462}
  @subsubsection Stand-alone objects
  
  
--- 31884,31890 ----
  @end menu
  
  @node Stand-alone objects,Subprogram parameters,,Simpler Accessibility Model
! @anchor{gnat_rm/gnat_language_extensions stand-alone-objects}@anchor{469}
  @subsubsection Stand-alone objects
  
  
*************** of the RM 4.6 rule “The accessibility
*** 31750,31756 ****
  statically deeper than that of the target type …”.
  
  @node Subprogram parameters,Function results,Stand-alone objects,Simpler Accessibility Model
! @anchor{gnat_rm/gnat_language_extensions subprogram-parameters}@anchor{463}
  @subsubsection Subprogram parameters
  
  
--- 31932,31938 ----
  statically deeper than that of the target type …”.
  
  @node Subprogram parameters,Function results,Stand-alone objects,Simpler Accessibility Model
! @anchor{gnat_rm/gnat_language_extensions subprogram-parameters}@anchor{46a}
  @subsubsection Subprogram parameters
  
  
*************** end;
*** 31843,31849 ****
  @end example
  
  @node Function results,,Subprogram parameters,Simpler Accessibility Model
! @anchor{gnat_rm/gnat_language_extensions function-results}@anchor{464}
  @subsubsection Function results
  
  
--- 32025,32031 ----
  @end example
  
  @node Function results,,Subprogram parameters,Simpler Accessibility Model
! @anchor{gnat_rm/gnat_language_extensions function-results}@anchor{46b}
  @subsubsection Function results
  
  
*************** end;
*** 31971,31977 ****
  @end example
  
  @node Case pattern matching,Mutably Tagged Types with Size’Class Aspect,Simpler Accessibility Model,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions case-pattern-matching}@anchor{465}
  @subsection Case pattern matching
  
  
--- 32153,32159 ----
  @end example
  
  @node Case pattern matching,Mutably Tagged Types with Size’Class Aspect,Simpler Accessibility Model,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions case-pattern-matching}@anchor{46c}
  @subsection Case pattern matching
  
  
*************** compile-time capacity limits in some ann
*** 32100,32107 ****
  message generated in such cases is usually “Capacity exceeded in compiling
  case statement with composite selector type”.
  
! @node Mutably Tagged Types with Size’Class Aspect,Generalized Finalization,Case pattern matching,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions mutably-tagged-types-with-size-class-aspect}@anchor{466}
  @subsection Mutably Tagged Types with Size’Class Aspect
  
  
--- 32282,32289 ----
  message generated in such cases is usually “Capacity exceeded in compiling
  case statement with composite selector type”.
  
! @node Mutably Tagged Types with Size’Class Aspect,No_Raise aspect,Case pattern matching,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions mutably-tagged-types-with-size-class-aspect}@anchor{46d}
  @subsection Mutably Tagged Types with Size’Class Aspect
  
  
*************** of the call is erroneous if the tag of t
*** 32271,32440 ****
  parameter exists (that is, before leaving the corresponding callable construct).
  This is analogous to the RM 6.4.1(18) rule about discriminated parameters.
  
! @node Generalized Finalization,No_Raise aspect,Mutably Tagged Types with Size’Class Aspect,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions generalized-finalization}@anchor{467}
! @subsection Generalized Finalization
! 
! 
! The @code{Finalizable} aspect can be applied to any record type, tagged or not,
! to specify that it provides the same level of control on the operations of
! initialization, finalization, and assignment of objects as the controlled
! types (see RM 7.6(2) for a high-level overview). The only restriction is
! that the record type must be a root type, in other words not a derived type.
! 
! The aspect additionally makes it possible to specify relaxed semantics for
! the finalization operations by means of the @code{Relaxed_Finalization} setting.
! Here is the archetypal example:
! 
! @example
! type T is record
!   ...
! end record
!   with Finalizable => (Initialize           => Initialize,
!                        Adjust               => Adjust,
!                        Finalize             => Finalize,
!                        Relaxed_Finalization => True);
! 
! procedure Adjust     (Obj : in out T);
! procedure Finalize   (Obj : in out T);
! procedure Initialize (Obj : in out T);
! @end example
! 
! The three procedures have the same profile, with a single @code{in out} parameter,
! and also have the same dynamic semantics as for controlled types:
! 
! @quotation
! 
! 
! @itemize -
! 
! @item 
! @code{Initialize} is called when an object of type @code{T} is declared without
! initialization expression.
! 
! @item 
! @code{Adjust} is called after an object of type @code{T} is assigned a new value.
! 
! @item 
! @code{Finalize} is called when an object of type @code{T} goes out of scope (for
! stack-allocated objects) or is deallocated (for heap-allocated objects).
! It is also called when the value is replaced by an assignment.
! @end itemize
! @end quotation
! 
! However, when @code{Relaxed_Finalization} is either @code{True} or not explicitly
! specified, the following differences are implemented relative to the semantics
! of controlled types:
! 
! 
! @itemize *
! 
! @item 
! The compiler has permission to perform no automatic finalization of
! heap-allocated objects: @code{Finalize} is only called when such an object
! is explicitly deallocated, or when the designated object is assigned a new
! value. As a consequence, no runtime support is needed for performing
! implicit deallocation. In particular, no per-object header data is needed
! for heap-allocated objects.
! 
! Heap-allocated objects allocated through a nested access type will therefore
! `not' be deallocated either. The result is simply that memory will be leaked
! in this case.
! 
! @item 
! The @code{Adjust} and @code{Finalize} procedures are automatically considered as
! having the @ref{468,,No_Raise aspect} specified for them. In particular, the
! compiler has permission to enforce none of the guarantees specified by the
! RM 7.6.1 (14/1) and subsequent subclauses.
! @end itemize
! 
! Simple example of ref-counted type:
! 
! @example
! type T is record
!    Value     : Integer;
!    Ref_Count : Natural := 0;
! end record;
! 
! procedure Inc_Ref (X : in out T);
! procedure Dec_Ref (X : in out T);
! 
! type T_Access is access all T;
! 
! type T_Ref is record
!    Value : T_Access;
! end record
!    with Finalizable => (Adjust   => Adjust,
!                         Finalize => Finalize);
! 
! procedure Adjust (Ref : in out T_Ref) is
! begin
!    Inc_Ref (Ref.Value);
! end Adjust;
! 
! procedure Finalize (Ref : in out T_Ref) is
! begin
!    Def_Ref (Ref.Value);
! end Finalize;
! @end example
! 
! Simple file handle that ensures resources are properly released:
! 
! @example
! package P is
!    type File (<>) is limited private;
! 
!    function Open (Path : String) return File;
! 
!    procedure Close (F : in out File);
! 
! private
!    type File is limited record
!       Handle : ...;
!    end record
!       with Finalizable (Finalize => Close);
! end P;
! @end example
! 
! @menu
! * Finalizable tagged types:: 
! * Composite types:: 
! * Interoperability with controlled types:: 
! 
! @end menu
! 
! @node Finalizable tagged types,Composite types,,Generalized Finalization
! @anchor{gnat_rm/gnat_language_extensions finalizable-tagged-types}@anchor{469}
! @subsubsection Finalizable tagged types
! 
! 
! The aspect is inherited by derived types and the primitives may be overridden
! by the derivation. The compiler-generated calls to these operations are then
! dispatching whenever it makes sense, i.e. when the object in question is of a
! class-wide type and the class includes at least one finalizable tagged type.
! 
! @node Composite types,Interoperability with controlled types,Finalizable tagged types,Generalized Finalization
! @anchor{gnat_rm/gnat_language_extensions composite-types}@anchor{46a}
! @subsubsection Composite types
! 
! 
! When a finalizable type is used as a component of a composite type, the latter
! becomes finalizable as well. The three primitives are derived automatically
! in order to call the primitives of their components. The dynamic semantics is
! the same as for controlled components of composite types.
! 
! @node Interoperability with controlled types,,Composite types,Generalized Finalization
! @anchor{gnat_rm/gnat_language_extensions interoperability-with-controlled-types}@anchor{46b}
! @subsubsection Interoperability with controlled types
! 
! 
! Finalizable types are fully interoperable with controlled types, in particular
! it is possible for a finalizable type to have a controlled component and vice
! versa, but the stricter dynamic semantics, in other words that of controlled
! types, is applied in this case.
! 
! @node No_Raise aspect,Inference of Dependent Types in Generic Instantiations,Generalized Finalization,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions id3}@anchor{46c}@anchor{gnat_rm/gnat_language_extensions no-raise-aspect}@anchor{468}
  @subsection No_Raise aspect
  
  
--- 32453,32460 ----
  parameter exists (that is, before leaving the corresponding callable construct).
  This is analogous to the RM 6.4.1(18) rule about discriminated parameters.
  
! @node No_Raise aspect,Inference of Dependent Types in Generic Instantiations,Mutably Tagged Types with Size’Class Aspect,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions id3}@anchor{46e}@anchor{gnat_rm/gnat_language_extensions no-raise-aspect}@anchor{45c}
  @subsection No_Raise aspect
  
  
*************** be raised during the execution of the su
*** 32444,32450 ****
  this execution and @code{Program_Error} is propagated to the caller.
  
  @node Inference of Dependent Types in Generic Instantiations,External_Initialization Aspect,No_Raise aspect,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions inference-of-dependent-types-in-generic-instantiations}@anchor{46d}
  @subsection Inference of Dependent Types in Generic Instantiations
  
  
--- 32464,32470 ----
  this execution and @code{Program_Error} is propagated to the caller.
  
  @node Inference of Dependent Types in Generic Instantiations,External_Initialization Aspect,No_Raise aspect,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions inference-of-dependent-types-in-generic-instantiations}@anchor{46f}
  @subsection Inference of Dependent Types in Generic Instantiations
  
  
*************** package Int_Array_Operations is new Arra
*** 32521,32527 ****
  @end example
  
  @node External_Initialization Aspect,Finally construct,Inference of Dependent Types in Generic Instantiations,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions external-initialization-aspect}@anchor{46e}
  @subsection External_Initialization Aspect
  
  
--- 32541,32547 ----
  @end example
  
  @node External_Initialization Aspect,Finally construct,Inference of Dependent Types in Generic Instantiations,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions external-initialization-aspect}@anchor{470}
  @subsection External_Initialization Aspect
  
  
*************** The maximum size of loaded files is limi
*** 32562,32568 ****
  @end cartouche
  
  @node Finally construct,Continue statement,External_Initialization Aspect,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions finally-construct}@anchor{46f}
  @subsection Finally construct
  
  
--- 32582,32588 ----
  @end cartouche
  
  @node Finally construct,Continue statement,External_Initialization Aspect,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions finally-construct}@anchor{471}
  @subsection Finally construct
  
  
*************** This feature is similar to the one with
*** 32579,32585 ****
  @end menu
  
  @node Syntax<2>,Legality Rules<2>,,Finally construct
! @anchor{gnat_rm/gnat_language_extensions id4}@anchor{470}
  @subsubsection Syntax
  
  
--- 32599,32605 ----
  @end menu
  
  @node Syntax<2>,Legality Rules<2>,,Finally construct
! @anchor{gnat_rm/gnat_language_extensions id4}@anchor{472}
  @subsubsection Syntax
  
  
*************** handled_sequence_of_statements ::=
*** 32594,32600 ****
  @end example
  
  @node Legality Rules<2>,Dynamic Semantics<2>,Syntax<2>,Finally construct
! @anchor{gnat_rm/gnat_language_extensions id5}@anchor{471}
  @subsubsection Legality Rules
  
  
--- 32614,32620 ----
  @end example
  
  @node Legality Rules<2>,Dynamic Semantics<2>,Syntax<2>,Finally construct
! @anchor{gnat_rm/gnat_language_extensions id5}@anchor{473}
  @subsubsection Legality Rules
  
  
*************** to be transferred outside the finally pa
*** 32604,32610 ****
  Goto & exit where the target is outside of the finally’s @code{sequence_of_statements} are forbidden
  
  @node Dynamic Semantics<2>,,Legality Rules<2>,Finally construct
! @anchor{gnat_rm/gnat_language_extensions id6}@anchor{472}
  @subsubsection Dynamic Semantics
  
  
--- 32624,32630 ----
  Goto & exit where the target is outside of the finally’s @code{sequence_of_statements} are forbidden
  
  @node Dynamic Semantics<2>,,Legality Rules<2>,Finally construct
! @anchor{gnat_rm/gnat_language_extensions id6}@anchor{474}
  @subsubsection Dynamic Semantics
  
  
*************** execution, that is the finally block mus
*** 32619,32625 ****
  aborted, or if the control is transferred out of the block.
  
  @node Continue statement,Destructors,Finally construct,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions continue-statement}@anchor{473}
  @subsection Continue statement
  
  
--- 32639,32645 ----
  aborted, or if the control is transferred out of the block.
  
  @node Continue statement,Destructors,Finally construct,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions continue-statement}@anchor{475}
  @subsection Continue statement
  
  
*************** statement in the sequence of statements
*** 32636,32643 ****
  Note that @code{continue} is a keyword but it is not a reserved word. This is a
  configuration that does not exist in standard Ada.
  
! @node Destructors,,Continue statement,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions destructors}@anchor{474}
  @subsection Destructors
  
  
--- 32656,32663 ----
  Note that @code{continue} is a keyword but it is not a reserved word. This is a
  configuration that does not exist in standard Ada.
  
! @node Destructors,Structural Generic Instantiation,Continue statement,Experimental Language Extensions
! @anchor{gnat_rm/gnat_language_extensions destructors}@anchor{476}
  @subsection Destructors
  
  
*************** mentioned legality rule, to prevent brea
*** 32706,32713 ****
  imposing that rule on outside types that derive from the private view of the
  type.
  
  @node Security Hardening Features,Obsolescent Features,GNAT language extensions,Top
! @anchor{gnat_rm/security_hardening_features doc}@anchor{475}@anchor{gnat_rm/security_hardening_features id1}@anchor{476}@anchor{gnat_rm/security_hardening_features security-hardening-features}@anchor{15}
  @chapter Security Hardening Features
  
  
--- 32726,32902 ----
  imposing that rule on outside types that derive from the private view of the
  type.
  
+ @node Structural Generic Instantiation,,Destructors,Experimental Language Extensions
+ @anchor{gnat_rm/gnat_language_extensions structural-generic-instantiation}@anchor{477}
+ @subsection Structural Generic Instantiation
+ 
+ 
+ The compiler implements a second kind of generic instantiation, called
+ “structural”, alongside the traditional instantiation specified by the
+ language, which is defined as follows: the structural instantiation of
+ a generic unit on given actual parameters is the anonymous instantiation
+ of the generic unit on the actual parameters done in the outermost scope
+ where it would be legal to do an identical traditional instantiation.
+ 
+ There is at most one structural instantiation of a generic unit on given
+ actual parameters done in a partition.
+ 
+ Structural generic instances (the product of structural instantiation)
+ are implicitly created whenever a reference to them is made in a place
+ where a name is accepted by the language.
+ 
+ @menu
+ * Syntax: Syntax<3>. 
+ * Legality Rules: Legality Rules<3>. 
+ * Static Semantics:: 
+ 
+ @end menu
+ 
+ @node Syntax<3>,Legality Rules<3>,,Structural Generic Instantiation
+ @anchor{gnat_rm/gnat_language_extensions id7}@anchor{478}
+ @subsubsection Syntax
+ 
+ 
+ @example
+ name ::= @{ set of productions specified in the RM @}
+          | structural_generic_instance_name
+ 
+ structural_generic_instance_name ::= name generic_actual_part
+ @end example
+ 
+ @node Legality Rules<3>,Static Semantics,Syntax<3>,Structural Generic Instantiation
+ @anchor{gnat_rm/gnat_language_extensions id8}@anchor{479}
+ @subsubsection Legality Rules
+ 
+ 
+ The @code{name} in a @code{structural_generic_instance_name} shall denote a generic
+ unit that is preelaborated. Note that, unlike in a traditional instantiation,
+ there are no square brackets around the @code{generic_actual_part} in the second
+ production, which means that it is mandatory and, therefore, that the generic
+ unit shall have at least one generic formal parameter.
+ 
+ The generic unit shall not take a generic formal object of mode @code{in out}.
+ If the generic unit takes a generic formal object of mode @code{in}, then the
+ corresponding generic actual parameter shall be a static expression.
+ 
+ A @code{structural_generic_instance_name} shall not be present in a library
+ unit if the structural instance is also a library unit and has a semantic
+ dependence on the former.
+ 
+ @node Static Semantics,,Legality Rules<3>,Structural Generic Instantiation
+ @anchor{gnat_rm/gnat_language_extensions static-semantics}@anchor{47a}
+ @subsubsection Static Semantics
+ 
+ 
+ A @code{structural_generic_instance_name} denotes the instance that is the
+ product of the structural instantiation of a generic unit on the specified
+ actual parameters. This instance is unique to a partition.
+ 
+ Example:
+ 
+ @example
+ with Ada.Containers.Vectors;
+ 
+ procedure P is
+    V : Ada.Containers.Vectors(Positive,Integer).Vector;
+ 
+ begin
+    V.Append (1);
+    V.Append (0);
+    Ada.Containers.Vectors(Positive,Integer).Generic_Sorting("<").Sort (V);
+ end;
+ @end example
+ 
+ This procedure references two structural instantiations of two different generic
+ units: @code{Ada.Containers.Vectors(Positive,Integer)} is the structural instance
+ of the generic unit @code{Ada.Containers.Vectors} on @code{Positive} and @code{Integer}
+ and @code{Ada.Containers.Vectors(Positive,Integer).Generic_Sorting("<")} is the
+ structural instance of the nested generic unit
+ @code{Ada.Containers.Vectors(Positive,Integer).Generic_Sorting} on @code{"<"}.
+ 
+ Note that the following example is illegal:
+ 
+ @example
+ with Ada.Containers.Vectors;
+ 
+ package Q is
+    type T is record
+       I : Integer;
+    end record;
+ 
+    V : Ada.Containers.Vectors(Positive,T).Vector;
+ end Q;
+ @end example
+ 
+ The reason is that @code{Ada.Containers.Vectors}, @code{Positive} and @code{Q.T} being
+ library-level entities, the structural instance @code{Ada.Containers.Vectors(Positive,T)} is a library unit with a dependence
+ on @code{Q} and, therefore, cannot be referenced from within @code{Q}. The simple
+ way out is to declare a traditional instantiation in this case:
+ 
+ @example
+ with Ada.Containers.Vectors;
+ 
+ package Q is
+    type T is record
+       I : Integer;
+    end record;
+ 
+    package Vectors_Of_T is new Ada.Containers.Vectors(Positive,T);
+ 
+    V : Vectors_Of_T.Vector;
+ end Q;
+ @end example
+ 
+ But the following example is legal:
+ 
+ @example
+ with Ada.Containers.Vectors;
+ 
+ procedure P is
+    type T is record
+       I : Integer;
+    end record;
+ 
+    V : Ada.Containers.Vectors(Positive,T).Vector;
+ end;
+ @end example
+ 
+ because the structural instance @code{Ada.Containers.Vectors(Positive,T)} is
+ not a library unit.
+ 
+ The first example can be rewritten in a less verbose manner:
+ 
+ @example
+ with Ada.Containers.Vectors; use Ada.Containers.Vectors(Positive,Integer);
+ 
+ procedure P is
+    V : Vector;
+ 
+ begin
+    V.Append (1);
+    V.Append (0);
+    Generic_Sorting("<").Sort (V);
+ end;
+ @end example
+ 
+ Another example, which additionally uses the inference of dependent types:
+ 
+ @example
+ with Ada.Unchecked_Deallocation;
+ 
+ procedure P is
+ 
+    type Integer_Access is access all Integer;
+ 
+    A : Integer_Access := new Integer'(1);
+ 
+ begin
+    Ada.Unchecked_Deallocation(Name => Integer_Access) (A);
+ end;
+ @end example
+ 
  @node Security Hardening Features,Obsolescent Features,GNAT language extensions,Top
! @anchor{gnat_rm/security_hardening_features doc}@anchor{47b}@anchor{gnat_rm/security_hardening_features id1}@anchor{47c}@anchor{gnat_rm/security_hardening_features security-hardening-features}@anchor{15}
  @chapter Security Hardening Features
  
  
*************** are provided by GNAT.
*** 32717,32722 ****
--- 32906,32913 ----
  The features in this chapter are currently experimental and subject to
  change.
  
+ These features are supported only by the GCC back end, not by LLVM.
+ 
  @c Register Scrubbing:
  
  @menu
*************** change.
*** 32729,32735 ****
  @end menu
  
  @node Register Scrubbing,Stack Scrubbing,,Security Hardening Features
! @anchor{gnat_rm/security_hardening_features register-scrubbing}@anchor{477}
  @section Register Scrubbing
  
  
--- 32920,32926 ----
  @end menu
  
  @node Register Scrubbing,Stack Scrubbing,,Security Hardening Features
! @anchor{gnat_rm/security_hardening_features register-scrubbing}@anchor{47d}
  @section Register Scrubbing
  
  
*************** programming languages, see @cite{Using t
*** 32765,32771 ****
  @c Stack Scrubbing:
  
  @node Stack Scrubbing,Hardened Conditionals,Register Scrubbing,Security Hardening Features
! @anchor{gnat_rm/security_hardening_features stack-scrubbing}@anchor{478}
  @section Stack Scrubbing
  
  
--- 32956,32962 ----
  @c Stack Scrubbing:
  
  @node Stack Scrubbing,Hardened Conditionals,Register Scrubbing,Security Hardening Features
! @anchor{gnat_rm/security_hardening_features stack-scrubbing}@anchor{47e}
  @section Stack Scrubbing
  
  
*************** Bar_Callable_Ptr.
*** 32909,32915 ****
  @c Hardened Conditionals:
  
  @node Hardened Conditionals,Hardened Booleans,Stack Scrubbing,Security Hardening Features
! @anchor{gnat_rm/security_hardening_features hardened-conditionals}@anchor{479}
  @section Hardened Conditionals
  
  
--- 33100,33106 ----
  @c Hardened Conditionals:
  
  @node Hardened Conditionals,Hardened Booleans,Stack Scrubbing,Security Hardening Features
! @anchor{gnat_rm/security_hardening_features hardened-conditionals}@anchor{47f}
  @section Hardened Conditionals
  
  
*************** be used with other programming languages
*** 32999,33005 ****
  @c Hardened Booleans:
  
  @node Hardened Booleans,Control Flow Redundancy,Hardened Conditionals,Security Hardening Features
! @anchor{gnat_rm/security_hardening_features hardened-booleans}@anchor{47a}
  @section Hardened Booleans
  
  
--- 33190,33196 ----
  @c Hardened Booleans:
  
  @node Hardened Booleans,Control Flow Redundancy,Hardened Conditionals,Security Hardening Features
! @anchor{gnat_rm/security_hardening_features hardened-booleans}@anchor{480}
  @section Hardened Booleans
  
  
*************** and more details on that attribute, see
*** 33060,33066 ****
  @c Control Flow Redundancy:
  
  @node Control Flow Redundancy,,Hardened Booleans,Security Hardening Features
! @anchor{gnat_rm/security_hardening_features control-flow-redundancy}@anchor{47b}
  @section Control Flow Redundancy
  
  
--- 33251,33257 ----
  @c Control Flow Redundancy:
  
  @node Control Flow Redundancy,,Hardened Booleans,Security Hardening Features
! @anchor{gnat_rm/security_hardening_features control-flow-redundancy}@anchor{481}
  @section Control Flow Redundancy
  
  
*************** see @cite{Using the GNU Compiler Collect
*** 33228,33234 ****
  can be used with other programming languages supported by GCC.
  
  @node Obsolescent Features,Compatibility and Porting Guide,Security Hardening Features,Top
! @anchor{gnat_rm/obsolescent_features doc}@anchor{47c}@anchor{gnat_rm/obsolescent_features id1}@anchor{47d}@anchor{gnat_rm/obsolescent_features obsolescent-features}@anchor{16}
  @chapter Obsolescent Features
  
  
--- 33419,33425 ----
  can be used with other programming languages supported by GCC.
  
  @node Obsolescent Features,Compatibility and Porting Guide,Security Hardening Features,Top
! @anchor{gnat_rm/obsolescent_features doc}@anchor{482}@anchor{gnat_rm/obsolescent_features id1}@anchor{483}@anchor{gnat_rm/obsolescent_features obsolescent-features}@anchor{16}
  @chapter Obsolescent Features
  
  
*************** compatibility purposes.
*** 33247,33253 ****
  @end menu
  
  @node pragma No_Run_Time,pragma Ravenscar,,Obsolescent Features
! @anchor{gnat_rm/obsolescent_features id2}@anchor{47e}@anchor{gnat_rm/obsolescent_features pragma-no-run-time}@anchor{47f}
  @section pragma No_Run_Time
  
  
--- 33438,33444 ----
  @end menu
  
  @node pragma No_Run_Time,pragma Ravenscar,,Obsolescent Features
! @anchor{gnat_rm/obsolescent_features id2}@anchor{484}@anchor{gnat_rm/obsolescent_features pragma-no-run-time}@anchor{485}
  @section pragma No_Run_Time
  
  
*************** preferred usage is to use an appropriate
*** 33260,33266 ****
  includes just those features that are to be made accessible.
  
  @node pragma Ravenscar,pragma Restricted_Run_Time,pragma No_Run_Time,Obsolescent Features
! @anchor{gnat_rm/obsolescent_features id3}@anchor{480}@anchor{gnat_rm/obsolescent_features pragma-ravenscar}@anchor{481}
  @section pragma Ravenscar
  
  
--- 33451,33457 ----
  includes just those features that are to be made accessible.
  
  @node pragma Ravenscar,pragma Restricted_Run_Time,pragma No_Run_Time,Obsolescent Features
! @anchor{gnat_rm/obsolescent_features id3}@anchor{486}@anchor{gnat_rm/obsolescent_features pragma-ravenscar}@anchor{487}
  @section pragma Ravenscar
  
  
*************** The pragma @code{Ravenscar} has exactly
*** 33269,33275 ****
  is part of the new Ada 2005 standard.
  
  @node pragma Restricted_Run_Time,pragma Task_Info,pragma Ravenscar,Obsolescent Features
! @anchor{gnat_rm/obsolescent_features id4}@anchor{482}@anchor{gnat_rm/obsolescent_features pragma-restricted-run-time}@anchor{483}
  @section pragma Restricted_Run_Time
  
  
--- 33460,33466 ----
  is part of the new Ada 2005 standard.
  
  @node pragma Restricted_Run_Time,pragma Task_Info,pragma Ravenscar,Obsolescent Features
! @anchor{gnat_rm/obsolescent_features id4}@anchor{488}@anchor{gnat_rm/obsolescent_features pragma-restricted-run-time}@anchor{489}
  @section pragma Restricted_Run_Time
  
  
*************** preferred since the Ada 2005 pragma @cod
*** 33279,33285 ****
  this kind of implementation dependent addition.
  
  @node pragma Task_Info,package System Task_Info s-tasinf ads,pragma Restricted_Run_Time,Obsolescent Features
! @anchor{gnat_rm/obsolescent_features id5}@anchor{484}@anchor{gnat_rm/obsolescent_features pragma-task-info}@anchor{485}
  @section pragma Task_Info
  
  
--- 33470,33476 ----
  this kind of implementation dependent addition.
  
  @node pragma Task_Info,package System Task_Info s-tasinf ads,pragma Restricted_Run_Time,Obsolescent Features
! @anchor{gnat_rm/obsolescent_features id5}@anchor{48a}@anchor{gnat_rm/obsolescent_features pragma-task-info}@anchor{48b}
  @section pragma Task_Info
  
  
*************** in the spec of package System.Task_Info
*** 33305,33311 ****
  library.
  
  @node package System Task_Info s-tasinf ads,,pragma Task_Info,Obsolescent Features
! @anchor{gnat_rm/obsolescent_features package-system-task-info}@anchor{486}@anchor{gnat_rm/obsolescent_features package-system-task-info-s-tasinf-ads}@anchor{487}
  @section package System.Task_Info (@code{s-tasinf.ads})
  
  
--- 33496,33502 ----
  library.
  
  @node package System Task_Info s-tasinf ads,,pragma Task_Info,Obsolescent Features
! @anchor{gnat_rm/obsolescent_features package-system-task-info}@anchor{48c}@anchor{gnat_rm/obsolescent_features package-system-task-info-s-tasinf-ads}@anchor{48d}
  @section package System.Task_Info (@code{s-tasinf.ads})
  
  
*************** to support the @code{Task_Info} pragma.
*** 33315,33321 ****
  standard replacement for GNAT’s @code{Task_Info} functionality.
  
  @node Compatibility and Porting Guide,GNU Free Documentation License,Obsolescent Features,Top
! @anchor{gnat_rm/compatibility_and_porting_guide doc}@anchor{488}@anchor{gnat_rm/compatibility_and_porting_guide compatibility-and-porting-guide}@anchor{17}@anchor{gnat_rm/compatibility_and_porting_guide id1}@anchor{489}
  @chapter Compatibility and Porting Guide
  
  
--- 33506,33512 ----
  standard replacement for GNAT’s @code{Task_Info} functionality.
  
  @node Compatibility and Porting Guide,GNU Free Documentation License,Obsolescent Features,Top
! @anchor{gnat_rm/compatibility_and_porting_guide doc}@anchor{48e}@anchor{gnat_rm/compatibility_and_porting_guide compatibility-and-porting-guide}@anchor{17}@anchor{gnat_rm/compatibility_and_porting_guide id1}@anchor{48f}
  @chapter Compatibility and Porting Guide
  
  
*************** applications developed in other Ada envi
*** 33337,33343 ****
  @end menu
  
  @node Writing Portable Fixed-Point Declarations,Compatibility with Ada 83,,Compatibility and Porting Guide
! @anchor{gnat_rm/compatibility_and_porting_guide id2}@anchor{48a}@anchor{gnat_rm/compatibility_and_porting_guide writing-portable-fixed-point-declarations}@anchor{48b}
  @section Writing Portable Fixed-Point Declarations
  
  
--- 33528,33534 ----
  @end menu
  
  @node Writing Portable Fixed-Point Declarations,Compatibility with Ada 83,,Compatibility and Porting Guide
! @anchor{gnat_rm/compatibility_and_porting_guide id2}@anchor{490}@anchor{gnat_rm/compatibility_and_porting_guide writing-portable-fixed-point-declarations}@anchor{491}
  @section Writing Portable Fixed-Point Declarations
  
  
*************** If you follow this scheme you will be gu
*** 33459,33465 ****
  types will be portable.
  
  @node Compatibility with Ada 83,Compatibility between Ada 95 and Ada 2005,Writing Portable Fixed-Point Declarations,Compatibility and Porting Guide
! @anchor{gnat_rm/compatibility_and_porting_guide compatibility-with-ada-83}@anchor{48c}@anchor{gnat_rm/compatibility_and_porting_guide id3}@anchor{48d}
  @section Compatibility with Ada 83
  
  
--- 33650,33656 ----
  types will be portable.
  
  @node Compatibility with Ada 83,Compatibility between Ada 95 and Ada 2005,Writing Portable Fixed-Point Declarations,Compatibility and Porting Guide
! @anchor{gnat_rm/compatibility_and_porting_guide compatibility-with-ada-83}@anchor{492}@anchor{gnat_rm/compatibility_and_porting_guide id3}@anchor{493}
  @section Compatibility with Ada 83
  
  
*************** following subsections treat the most lik
*** 33487,33493 ****
  @end menu
  
  @node Legal Ada 83 programs that are illegal in Ada 95,More deterministic semantics,,Compatibility with Ada 83
! @anchor{gnat_rm/compatibility_and_porting_guide id4}@anchor{48e}@anchor{gnat_rm/compatibility_and_porting_guide legal-ada-83-programs-that-are-illegal-in-ada-95}@anchor{48f}
  @subsection Legal Ada 83 programs that are illegal in Ada 95
  
  
--- 33678,33684 ----
  @end menu
  
  @node Legal Ada 83 programs that are illegal in Ada 95,More deterministic semantics,,Compatibility with Ada 83
! @anchor{gnat_rm/compatibility_and_porting_guide id4}@anchor{494}@anchor{gnat_rm/compatibility_and_porting_guide legal-ada-83-programs-that-are-illegal-in-ada-95}@anchor{495}
  @subsection Legal Ada 83 programs that are illegal in Ada 95
  
  
*************** the fix is usually simply to add the @co
*** 33587,33593 ****
  @end itemize
  
  @node More deterministic semantics,Changed semantics,Legal Ada 83 programs that are illegal in Ada 95,Compatibility with Ada 83
! @anchor{gnat_rm/compatibility_and_porting_guide id5}@anchor{490}@anchor{gnat_rm/compatibility_and_porting_guide more-deterministic-semantics}@anchor{491}
  @subsection More deterministic semantics
  
  
--- 33778,33784 ----
  @end itemize
  
  @node More deterministic semantics,Changed semantics,Legal Ada 83 programs that are illegal in Ada 95,Compatibility with Ada 83
! @anchor{gnat_rm/compatibility_and_porting_guide id5}@anchor{496}@anchor{gnat_rm/compatibility_and_porting_guide more-deterministic-semantics}@anchor{497}
  @subsection More deterministic semantics
  
  
*************** which open select branches are executed.
*** 33615,33621 ****
  @end itemize
  
  @node Changed semantics,Other language compatibility issues,More deterministic semantics,Compatibility with Ada 83
! @anchor{gnat_rm/compatibility_and_porting_guide changed-semantics}@anchor{492}@anchor{gnat_rm/compatibility_and_porting_guide id6}@anchor{493}
  @subsection Changed semantics
  
  
--- 33806,33812 ----
  @end itemize
  
  @node Changed semantics,Other language compatibility issues,More deterministic semantics,Compatibility with Ada 83
! @anchor{gnat_rm/compatibility_and_porting_guide changed-semantics}@anchor{498}@anchor{gnat_rm/compatibility_and_porting_guide id6}@anchor{499}
  @subsection Changed semantics
  
  
*************** covers only the restricted range.
*** 33657,33663 ****
  @end itemize
  
  @node Other language compatibility issues,,Changed semantics,Compatibility with Ada 83
! @anchor{gnat_rm/compatibility_and_porting_guide id7}@anchor{494}@anchor{gnat_rm/compatibility_and_porting_guide other-language-compatibility-issues}@anchor{495}
  @subsection Other language compatibility issues
  
  
--- 33848,33854 ----
  @end itemize
  
  @node Other language compatibility issues,,Changed semantics,Compatibility with Ada 83
! @anchor{gnat_rm/compatibility_and_porting_guide id7}@anchor{49a}@anchor{gnat_rm/compatibility_and_porting_guide other-language-compatibility-issues}@anchor{49b}
  @subsection Other language compatibility issues
  
  
*************** include @code{pragma Interface} and the
*** 33690,33696 ****
  @end itemize
  
  @node Compatibility between Ada 95 and Ada 2005,Implementation-dependent characteristics,Compatibility with Ada 83,Compatibility and Porting Guide
! @anchor{gnat_rm/compatibility_and_porting_guide compatibility-between-ada-95-and-ada-2005}@anchor{496}@anchor{gnat_rm/compatibility_and_porting_guide id8}@anchor{497}
  @section Compatibility between Ada 95 and Ada 2005
  
  
--- 33881,33887 ----
  @end itemize
  
  @node Compatibility between Ada 95 and Ada 2005,Implementation-dependent characteristics,Compatibility with Ada 83,Compatibility and Porting Guide
! @anchor{gnat_rm/compatibility_and_porting_guide compatibility-between-ada-95-and-ada-2005}@anchor{49c}@anchor{gnat_rm/compatibility_and_porting_guide id8}@anchor{49d}
  @section Compatibility between Ada 95 and Ada 2005
  
  
*************** can declare a function returning a value
*** 33762,33768 ****
  @end itemize
  
  @node Implementation-dependent characteristics,Compatibility with Other Ada Systems,Compatibility between Ada 95 and Ada 2005,Compatibility and Porting Guide
! @anchor{gnat_rm/compatibility_and_porting_guide id9}@anchor{498}@anchor{gnat_rm/compatibility_and_porting_guide implementation-dependent-characteristics}@anchor{499}
  @section Implementation-dependent characteristics
  
  
--- 33953,33959 ----
  @end itemize
  
  @node Implementation-dependent characteristics,Compatibility with Other Ada Systems,Compatibility between Ada 95 and Ada 2005,Compatibility and Porting Guide
! @anchor{gnat_rm/compatibility_and_porting_guide id9}@anchor{49e}@anchor{gnat_rm/compatibility_and_porting_guide implementation-dependent-characteristics}@anchor{49f}
  @section Implementation-dependent characteristics
  
  
*************** transition from certain Ada 83 compilers
*** 33785,33791 ****
  @end menu
  
  @node Implementation-defined pragmas,Implementation-defined attributes,,Implementation-dependent characteristics
! @anchor{gnat_rm/compatibility_and_porting_guide id10}@anchor{49a}@anchor{gnat_rm/compatibility_and_porting_guide implementation-defined-pragmas}@anchor{49b}
  @subsection Implementation-defined pragmas
  
  
--- 33976,33982 ----
  @end menu
  
  @node Implementation-defined pragmas,Implementation-defined attributes,,Implementation-dependent characteristics
! @anchor{gnat_rm/compatibility_and_porting_guide id10}@anchor{4a0}@anchor{gnat_rm/compatibility_and_porting_guide implementation-defined-pragmas}@anchor{4a1}
  @subsection Implementation-defined pragmas
  
  
*************** avoiding compiler rejection of units tha
*** 33807,33813 ****
  relevant in a GNAT context and hence are not otherwise implemented.
  
  @node Implementation-defined attributes,Libraries,Implementation-defined pragmas,Implementation-dependent characteristics
! @anchor{gnat_rm/compatibility_and_porting_guide id11}@anchor{49c}@anchor{gnat_rm/compatibility_and_porting_guide implementation-defined-attributes}@anchor{49d}
  @subsection Implementation-defined attributes
  
  
--- 33998,34004 ----
  relevant in a GNAT context and hence are not otherwise implemented.
  
  @node Implementation-defined attributes,Libraries,Implementation-defined pragmas,Implementation-dependent characteristics
! @anchor{gnat_rm/compatibility_and_porting_guide id11}@anchor{4a2}@anchor{gnat_rm/compatibility_and_porting_guide implementation-defined-attributes}@anchor{4a3}
  @subsection Implementation-defined attributes
  
  
*************** Ada 83, GNAT supplies the attributes @co
*** 33821,33827 ****
  @code{Type_Class}.
  
  @node Libraries,Elaboration order,Implementation-defined attributes,Implementation-dependent characteristics
! @anchor{gnat_rm/compatibility_and_porting_guide id12}@anchor{49e}@anchor{gnat_rm/compatibility_and_porting_guide libraries}@anchor{49f}
  @subsection Libraries
  
  
--- 34012,34018 ----
  @code{Type_Class}.
  
  @node Libraries,Elaboration order,Implementation-defined attributes,Implementation-dependent characteristics
! @anchor{gnat_rm/compatibility_and_porting_guide id12}@anchor{4a4}@anchor{gnat_rm/compatibility_and_porting_guide libraries}@anchor{4a5}
  @subsection Libraries
  
  
*************** be preferable to retrofit the applicatio
*** 33850,33856 ****
  @end itemize
  
  @node Elaboration order,Target-specific aspects,Libraries,Implementation-dependent characteristics
! @anchor{gnat_rm/compatibility_and_porting_guide elaboration-order}@anchor{4a0}@anchor{gnat_rm/compatibility_and_porting_guide id13}@anchor{4a1}
  @subsection Elaboration order
  
  
--- 34041,34047 ----
  @end itemize
  
  @node Elaboration order,Target-specific aspects,Libraries,Implementation-dependent characteristics
! @anchor{gnat_rm/compatibility_and_porting_guide elaboration-order}@anchor{4a6}@anchor{gnat_rm/compatibility_and_porting_guide id13}@anchor{4a7}
  @subsection Elaboration order
  
  
*************** pragmas either globally (as an effect of
*** 33886,33892 ****
  @end itemize
  
  @node Target-specific aspects,,Elaboration order,Implementation-dependent characteristics
! @anchor{gnat_rm/compatibility_and_porting_guide id14}@anchor{4a2}@anchor{gnat_rm/compatibility_and_porting_guide target-specific-aspects}@anchor{4a3}
  @subsection Target-specific aspects
  
  
--- 34077,34083 ----
  @end itemize
  
  @node Target-specific aspects,,Elaboration order,Implementation-dependent characteristics
! @anchor{gnat_rm/compatibility_and_porting_guide id14}@anchor{4a8}@anchor{gnat_rm/compatibility_and_porting_guide target-specific-aspects}@anchor{4a9}
  @subsection Target-specific aspects
  
  
*************** on the robustness of the original design
*** 33899,33908 ****
  Ada 2005, Ada 2012, and Ada 2022) are sometimes
  incompatible with typical Ada 83 compiler practices regarding implicit
  packing, the meaning of the Size attribute, and the size of access values.
! GNAT’s approach to these issues is described in @ref{4a4,,Representation Clauses}.
  
  @node Compatibility with Other Ada Systems,Representation Clauses,Implementation-dependent characteristics,Compatibility and Porting Guide
! @anchor{gnat_rm/compatibility_and_porting_guide compatibility-with-other-ada-systems}@anchor{4a5}@anchor{gnat_rm/compatibility_and_porting_guide id15}@anchor{4a6}
  @section Compatibility with Other Ada Systems
  
  
--- 34090,34099 ----
  Ada 2005, Ada 2012, and Ada 2022) are sometimes
  incompatible with typical Ada 83 compiler practices regarding implicit
  packing, the meaning of the Size attribute, and the size of access values.
! GNAT’s approach to these issues is described in @ref{4aa,,Representation Clauses}.
  
  @node Compatibility with Other Ada Systems,Representation Clauses,Implementation-dependent characteristics,Compatibility and Porting Guide
! @anchor{gnat_rm/compatibility_and_porting_guide compatibility-with-other-ada-systems}@anchor{4ab}@anchor{gnat_rm/compatibility_and_porting_guide id15}@anchor{4ac}
  @section Compatibility with Other Ada Systems
  
  
*************** far beyond this minimal set, as describe
*** 33945,33951 ****
  @end itemize
  
  @node Representation Clauses,Compatibility with HP Ada 83,Compatibility with Other Ada Systems,Compatibility and Porting Guide
! @anchor{gnat_rm/compatibility_and_porting_guide id16}@anchor{4a7}@anchor{gnat_rm/compatibility_and_porting_guide representation-clauses}@anchor{4a4}
  @section Representation Clauses
  
  
--- 34136,34142 ----
  @end itemize
  
  @node Representation Clauses,Compatibility with HP Ada 83,Compatibility with Other Ada Systems,Compatibility and Porting Guide
! @anchor{gnat_rm/compatibility_and_porting_guide id16}@anchor{4ad}@anchor{gnat_rm/compatibility_and_porting_guide representation-clauses}@anchor{4aa}
  @section Representation Clauses
  
  
*************** with thin pointers.
*** 34038,34044 ****
  @end itemize
  
  @node Compatibility with HP Ada 83,,Representation Clauses,Compatibility and Porting Guide
! @anchor{gnat_rm/compatibility_and_porting_guide compatibility-with-hp-ada-83}@anchor{4a8}@anchor{gnat_rm/compatibility_and_porting_guide id17}@anchor{4a9}
  @section Compatibility with HP Ada 83
  
  
--- 34229,34235 ----
  @end itemize
  
  @node Compatibility with HP Ada 83,,Representation Clauses,Compatibility and Porting Guide
! @anchor{gnat_rm/compatibility_and_porting_guide compatibility-with-hp-ada-83}@anchor{4ae}@anchor{gnat_rm/compatibility_and_porting_guide id17}@anchor{4af}
  @section Compatibility with HP Ada 83
  
  
*************** extension of package System.
*** 34068,34074 ****
  @end itemize
  
  @node GNU Free Documentation License,Index,Compatibility and Porting Guide,Top
! @anchor{share/gnu_free_documentation_license doc}@anchor{4aa}@anchor{share/gnu_free_documentation_license gnu-fdl}@anchor{1}@anchor{share/gnu_free_documentation_license gnu-free-documentation-license}@anchor{4ab}
  @chapter GNU Free Documentation License
  
  
--- 34259,34265 ----
  @end itemize
  
  @node GNU Free Documentation License,Index,Compatibility and Porting Guide,Top
! @anchor{share/gnu_free_documentation_license doc}@anchor{4b0}@anchor{share/gnu_free_documentation_license gnu-fdl}@anchor{1}@anchor{share/gnu_free_documentation_license gnu-free-documentation-license}@anchor{4b1}
  @chapter GNU Free Documentation License
  
  
diff -Nrcpad gcc-16-20250914/gcc/ada/gnat_ugn.texi gcc-16-20250921/gcc/ada/gnat_ugn.texi
*** gcc-16-20250914/gcc/ada/gnat_ugn.texi	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/gnat_ugn.texi	Sun Sep 21 22:32:34 2025
***************
*** 19,25 ****
  
  @copying
  @quotation
! GNAT User's Guide for Native Platforms , Sep 05, 2025
  
  AdaCore
  
--- 19,25 ----
  
  @copying
  @quotation
! GNAT User's Guide for Native Platforms , Sep 19, 2025
  
  AdaCore
  
*************** version of GNAT.
*** 17653,17672 ****
  @item 
  @code{gprbuild} can detect and use GNAT LLVM when it is installed.
  
! @code{gprbuild} uses the first applicable compiler on the executable
! search path, including GNAT LLVM.  An easy way to build with GNAT
! LLVM is to make it available on the operating system’s search path
! before any other Ada compiler (such as the GCC version of GNAT). To
! avoid accidentally using a different compiler than the one you want
! to use, we recommend generating an explicit toolchain configuration
! file with @code{gprconfig} and using it with @code{gprbuild}; see the
! `GPRbuild and GPR Companion Tools User’s Guide' for details. You
! can determine from the first line of the @code{.ali} file
! which version of GNAT built that file because it contains either
! @code{GNAT} or @code{GNAT-LLVM}.
! 
! You can also explicitly select GNAT LLVM in your existing GPR project
! file by adding @code{for Toolchain_Name("Ada") use "GNAT_LLVM";}
  @end itemize
  
  
--- 17653,17670 ----
  @item 
  @code{gprbuild} can detect and use GNAT LLVM when it is installed.
  
! @code{gprbuild} uses the first applicable compiler on the executable search
! path, including GNAT LLVM. An easy way to build with GNAT LLVM is to make
! it available on the operating system’s search path before any other Ada
! compiler (such as the GCC version of GNAT). To avoid accidentally using a
! different compiler than the one you want to use, we recommend explicitly
! selecting GNAT LLVM in your existing GPR project file by adding
! @code{for Toolchain_Name ("Ada") use "GNAT_LLVM";}. You can also
! generate an explicit toolchain configuration file with @code{gprconfig} and
! use it with @code{gprbuild}; see the `GPRbuild and GPR Companion Tools
! User’s Guide' for details. You can determine from the first line of the
! @code{.ali} file which version of GNAT built that file because it
! contains either @code{GNAT} or @code{GNAT-LLVM}.
  @end itemize
  
  
diff -Nrcpad gcc-16-20250914/gcc/ada/impunit.adb gcc-16-20250921/gcc/ada/impunit.adb
*** gcc-16-20250914/gcc/ada/impunit.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/impunit.adb	Sun Sep 21 22:32:34 2025
*************** package body Impunit is
*** 250,255 ****
--- 250,256 ----
      ("g-busorg", F),  -- GNAT.Bubble_Sort_G
      ("g-byorma", F),  -- GNAT.Byte_Order_Mark
      ("g-bytswa", F),  -- GNAT.Byte_Swapping
+     ("g-c_time", F),  -- GNAT.C_Time
      ("g-calend", F),  -- GNAT.Calendar
      ("g-catiio", F),  -- GNAT.Calendar.Time_IO
      ("g-casuti", F),  -- GNAT.Case_Util
diff -Nrcpad gcc-16-20250914/gcc/ada/layout.adb gcc-16-20250921/gcc/ada/layout.adb
*** gcc-16-20250914/gcc/ada/layout.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/layout.adb	Sun Sep 21 22:32:34 2025
*************** package body Layout is
*** 248,260 ****
        end if;
  
        --  For access types, set size/alignment. This is system address size,
!       --  except for fat pointers (unconstrained array access types), where the
!       --  size is two times the address size, to accommodate the two pointers
!       --  that are required for a fat pointer (data and template). Note that
!       --  E_Access_Protected_Subprogram_Type is not an access type for this
!       --  purpose since it is not a pointer but is equivalent to a record. For
!       --  access subtypes, copy the size from the base type since Gigi
!       --  represents them the same way.
  
        if Is_Access_Type (E) then
           Desig_Type := Underlying_Type (Designated_Type (E));
--- 248,268 ----
        end if;
  
        --  For access types, set size/alignment. This is system address size,
!       --  except for unconstrained array access types:
!       --
!       --   - fat pointers where the size is two times the address size, to
!       --     accommodate the two pointers that are required for a fat pointer
!       --     (data and template).
!       --
!       --   - extended access where the size is the size of an address (data
!       --     pointer) plus the size of the template. The template size can't be
!       --     computed yet (will be done in the code generator), leave it empty
!       --     for now.
!       --
!       --  Note that E_Access_Protected_Subprogram_Type is not an access type
!       --  for this purpose since it is not a pointer but is equivalent to a
!       --  record. For access subtypes, copy the size from the base type since
!       --  the code generator represents them the same way.
  
        if Is_Access_Type (E) then
           Desig_Type := Underlying_Type (Designated_Type (E));
*************** package body Layout is
*** 301,307 ****
  
             and then not Debug_Flag_6
           then
!             Init_Size (E, 2 * System_Address_Size);
  
              --  Check for bad convention set
  
--- 309,317 ----
  
             and then not Debug_Flag_6
           then
!             if not Is_Extended_Access_Type (E) then
!                Init_Size (E, 2 * System_Address_Size);
!             end if;
  
              --  Check for bad convention set
  
*************** package body Layout is
*** 326,332 ****
                                               N_Unconstrained_Array_Definition
             and then not Debug_Flag_6
           then
!             Init_Size (E, 2 * System_Address_Size);
  
           --  If unnesting subprograms, subprogram access types contain the
           --  address of both the subprogram and an activation record. But if we
--- 336,344 ----
                                               N_Unconstrained_Array_Definition
             and then not Debug_Flag_6
           then
!             if not Is_Extended_Access_Type (E) then
!                Init_Size (E, 2 * System_Address_Size);
!             end if;
  
           --  If unnesting subprograms, subprogram access types contain the
           --  address of both the subprogram and an activation record. But if we
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/a-exetim__posix.adb gcc-16-20250921/gcc/ada/libgnarl/a-exetim__posix.adb
*** gcc-16-20250914/gcc/ada/libgnarl/a-exetim__posix.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/a-exetim__posix.adb	Sun Sep 21 22:32:35 2025
***************
*** 34,41 ****
  with Ada.Task_Identification;  use Ada.Task_Identification;
  with Ada.Unchecked_Conversion;
  
! with System.Tasking;
  with System.OS_Interface; use System.OS_Interface;
  with System.Task_Primitives.Operations; use System.Task_Primitives.Operations;
  
  with Interfaces.C; use Interfaces.C;
--- 34,42 ----
  with Ada.Task_Identification;  use Ada.Task_Identification;
  with Ada.Unchecked_Conversion;
  
! with System.C_Time;
  with System.OS_Interface; use System.OS_Interface;
+ with System.Tasking;
  with System.Task_Primitives.Operations; use System.Task_Primitives.Operations;
  
  with Interfaces.C; use Interfaces.C;
*************** package body Ada.Execution_Time is
*** 98,104 ****
       (T : Ada.Task_Identification.Task_Id :=
          Ada.Task_Identification.Current_Task) return CPU_Time
     is
!       TS       : aliased timespec;
        Clock_Id : aliased Interfaces.C.int;
        Result   : Interfaces.C.int;
  
--- 99,105 ----
       (T : Ada.Task_Identification.Task_Id :=
          Ada.Task_Identification.Current_Task) return CPU_Time
     is
!       TS       : aliased System.C_Time.timespec;
        Clock_Id : aliased Interfaces.C.int;
        Result   : Interfaces.C.int;
  
*************** package body Ada.Execution_Time is
*** 112,118 ****
  
        function clock_gettime
          (clock_id : Interfaces.C.int;
!          tp       : access timespec)
           return Interfaces.C.int;
        pragma Import (C, clock_gettime, "clock_gettime");
        --  Function from the POSIX.1b Realtime Extensions library
--- 113,119 ----
  
        function clock_gettime
          (clock_id : Interfaces.C.int;
!          tp       : access System.C_Time.timespec)
           return Interfaces.C.int;
        pragma Import (C, clock_gettime, "clock_gettime");
        --  Function from the POSIX.1b Realtime Extensions library
*************** package body Ada.Execution_Time is
*** 139,145 ****
          (clock_id => Clock_Id, tp => TS'Unchecked_Access);
        pragma Assert (Result = 0);
  
!       return To_CPU_Time (To_Duration (TS));
     end Clock;
  
     --------------------------
--- 140,146 ----
          (clock_id => Clock_Id, tp => TS'Unchecked_Access);
        pragma Assert (Result = 0);
  
!       return To_CPU_Time (System.C_Time.To_Duration (TS));
     end Clock;
  
     --------------------------
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-linux.ads gcc-16-20250921/gcc/ada/libgnarl/s-linux.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-linux.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-linux.ads	Sun Sep 21 22:32:35 2025
***************
*** 36,42 ****
  --  Preelaborate. This package is designed to be a bottom-level (leaf) package
  
  with Interfaces.C;
- with System.Parameters;
  
  package System.Linux is
     pragma Preelaborate;
--- 36,41 ----
*************** package System.Linux is
*** 45,68 ****
     -- Time --
     ----------
  
-    subtype long        is Interfaces.C.long;
-    subtype suseconds_t is Interfaces.C.long;
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-         .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
     subtype clockid_t   is Interfaces.C.int;
  
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
-    type timeval is record
-       tv_sec  : time_t;
-       tv_usec : suseconds_t;
-    end record;
-    pragma Convention (C, timeval);
- 
     -----------
     -- Errno --
     -----------
--- 44,51 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-linux__alpha.ads gcc-16-20250921/gcc/ada/libgnarl/s-linux__alpha.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-linux__alpha.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-linux__alpha.ads	Sun Sep 21 22:32:35 2025
***************
*** 36,42 ****
  --  Preelaborate. This package is designed to be a bottom-level (leaf) package.
  
  with Interfaces.C;
- with System.Parameters;
  
  package System.Linux is
     pragma Preelaborate;
--- 36,41 ----
*************** package System.Linux is
*** 45,68 ****
     -- Time --
     ----------
  
-    subtype long        is Interfaces.C.long;
-    subtype suseconds_t is Interfaces.C.long;
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
     subtype clockid_t   is Interfaces.C.int;
  
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
-    type timeval is record
-       tv_sec  : time_t;
-       tv_usec : suseconds_t;
-    end record;
-    pragma Convention (C, timeval);
- 
     -----------
     -- Errno --
     -----------
--- 44,51 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-linux__android-aarch64.ads gcc-16-20250921/gcc/ada/libgnarl/s-linux__android-aarch64.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-linux__android-aarch64.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-linux__android-aarch64.ads	Sun Sep 21 22:32:35 2025
***************
*** 36,42 ****
  --  Preelaborate. This package is designed to be a bottom-level (leaf) package
  
  with Interfaces.C;
- with System.Parameters;
  
  package System.Linux is
     pragma Preelaborate;
--- 36,41 ----
*************** package System.Linux is
*** 45,68 ****
     -- Time --
     ----------
  
-    subtype long        is Interfaces.C.long;
-    subtype suseconds_t is Interfaces.C.long;
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
     subtype clockid_t   is Interfaces.C.int;
  
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
-    type timeval is record
-       tv_sec  : time_t;
-       tv_usec : suseconds_t;
-    end record;
-    pragma Convention (C, timeval);
- 
     -----------
     -- Errno --
     -----------
--- 44,51 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-linux__android-arm.ads gcc-16-20250921/gcc/ada/libgnarl/s-linux__android-arm.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-linux__android-arm.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-linux__android-arm.ads	Sun Sep 21 22:32:35 2025
***************
*** 36,42 ****
  --  Preelaborate. This package is designed to be a bottom-level (leaf) package
  
  with Interfaces.C;
- with System.Parameters;
  
  package System.Linux is
     pragma Preelaborate;
--- 36,41 ----
*************** package System.Linux is
*** 45,68 ****
     -- Time --
     ----------
  
-    subtype long        is Interfaces.C.long;
-    subtype suseconds_t is Interfaces.C.long;
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
     subtype clockid_t   is Interfaces.C.int;
  
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
-    type timeval is record
-       tv_sec  : time_t;
-       tv_usec : suseconds_t;
-    end record;
-    pragma Convention (C, timeval);
- 
     -----------
     -- Errno --
     -----------
--- 44,51 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-linux__hppa.ads gcc-16-20250921/gcc/ada/libgnarl/s-linux__hppa.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-linux__hppa.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-linux__hppa.ads	Sun Sep 21 22:32:35 2025
***************
*** 36,42 ****
  --  Preelaborate. This package is designed to be a bottom-level (leaf) package.
  
  with Interfaces.C;
- with System.Parameters;
  
  package System.Linux is
     pragma Preelaborate;
--- 36,41 ----
*************** package System.Linux is
*** 45,68 ****
     -- Time --
     ----------
  
-    subtype long        is Interfaces.C.long;
-    subtype suseconds_t is Interfaces.C.long;
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
     subtype clockid_t   is Interfaces.C.int;
  
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
-    type timeval is record
-       tv_sec  : time_t;
-       tv_usec : suseconds_t;
-    end record;
-    pragma Convention (C, timeval);
- 
     -----------
     -- Errno --
     -----------
--- 44,51 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-linux__loongarch.ads gcc-16-20250921/gcc/ada/libgnarl/s-linux__loongarch.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-linux__loongarch.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-linux__loongarch.ads	Sun Sep 21 22:32:35 2025
***************
*** 35,41 ****
  --  Preelaborate. This package is designed to be a bottom-level (leaf) package
  
  with Interfaces.C;
- with System.Parameters;
  
  package System.Linux is
     pragma Preelaborate;
--- 35,40 ----
*************** package System.Linux is
*** 44,68 ****
     -- Time --
     ----------
  
-    subtype int         is Interfaces.C.int;
-    subtype long        is Interfaces.C.long;
-    subtype suseconds_t is Interfaces.C.long;
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
     subtype clockid_t   is Interfaces.C.int;
  
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
-    type timeval is record
-       tv_sec  : time_t;
-       tv_usec : suseconds_t;
-    end record;
-    pragma Convention (C, timeval);
- 
     -----------
     -- Errno --
     -----------
--- 43,50 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-linux__mips.ads gcc-16-20250921/gcc/ada/libgnarl/s-linux__mips.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-linux__mips.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-linux__mips.ads	Sun Sep 21 22:32:35 2025
***************
*** 35,41 ****
  --  Preelaborate. This package is designed to be a bottom-level (leaf) package
  
  with Interfaces.C;
- with System.Parameters;
  
  package System.Linux is
     pragma Preelaborate;
--- 35,40 ----
*************** package System.Linux is
*** 44,68 ****
     -- Time --
     ----------
  
-    subtype int         is Interfaces.C.int;
-    subtype long        is Interfaces.C.long;
-    subtype suseconds_t is Interfaces.C.long;
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
     subtype clockid_t   is Interfaces.C.int;
  
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
-    type timeval is record
-       tv_sec  : time_t;
-       tv_usec : suseconds_t;
-    end record;
-    pragma Convention (C, timeval);
- 
     -----------
     -- Errno --
     -----------
--- 43,50 ----
*************** package System.Linux is
*** 125,132 ****
  
     --  struct_sigaction offsets
  
!    sa_handler_pos : constant := int'Size / 8;
!    sa_mask_pos    : constant := int'Size / 8 +
                                  Standard'Address_Size / 8;
     sa_flags_pos   : constant := 0;
  
--- 107,114 ----
  
     --  struct_sigaction offsets
  
!    sa_handler_pos : constant := Interfaces.C.int'Size / 8;
!    sa_mask_pos    : constant := Interfaces.C.int'Size / 8 +
                                  Standard'Address_Size / 8;
     sa_flags_pos   : constant := 0;
  
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-linux__riscv.ads gcc-16-20250921/gcc/ada/libgnarl/s-linux__riscv.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-linux__riscv.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-linux__riscv.ads	Sun Sep 21 22:32:35 2025
***************
*** 35,41 ****
  --  Preelaborate. This package is designed to be a bottom-level (leaf) package
  
  with Interfaces.C;
- with System.Parameters;
  
  package System.Linux is
     pragma Preelaborate;
--- 35,40 ----
*************** package System.Linux is
*** 44,68 ****
     -- Time --
     ----------
  
-    subtype int         is Interfaces.C.int;
-    subtype long        is Interfaces.C.long;
-    subtype suseconds_t is Interfaces.C.long;
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
     subtype clockid_t   is Interfaces.C.int;
  
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
-    type timeval is record
-       tv_sec  : time_t;
-       tv_usec : suseconds_t;
-    end record;
-    pragma Convention (C, timeval);
- 
     -----------
     -- Errno --
     -----------
--- 43,50 ----
*************** package System.Linux is
*** 125,132 ****
     --  struct_sigaction offsets
  
     sa_handler_pos : constant := 0;
!    sa_mask_pos    : constant := long'Size / 8;
!    sa_flags_pos   : constant := long'Size / 8 + 128;
  
     SA_SIGINFO  : constant := 16#04#;
     SA_ONSTACK  : constant := 16#08000000#;
--- 107,114 ----
     --  struct_sigaction offsets
  
     sa_handler_pos : constant := 0;
!    sa_mask_pos    : constant := Interfaces.C.long'Size / 8;
!    sa_flags_pos   : constant := Interfaces.C.long'Size / 8 + 128;
  
     SA_SIGINFO  : constant := 16#04#;
     SA_ONSTACK  : constant := 16#08000000#;
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-linux__sparc.ads gcc-16-20250921/gcc/ada/libgnarl/s-linux__sparc.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-linux__sparc.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-linux__sparc.ads	Sun Sep 21 22:32:35 2025
***************
*** 36,42 ****
  --  Preelaborate. This package is designed to be a bottom-level (leaf) package
  
  with Interfaces.C;
- with System.Parameters;
  
  package System.Linux is
     pragma Preelaborate;
--- 36,41 ----
*************** package System.Linux is
*** 45,68 ****
     -- Time --
     ----------
  
-    subtype long        is Interfaces.C.long;
-    subtype suseconds_t is Interfaces.C.long;
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
     subtype clockid_t   is Interfaces.C.int;
  
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
-    type timeval is record
-       tv_sec  : time_t;
-       tv_usec : suseconds_t;
-    end record;
-    pragma Convention (C, timeval);
- 
     -----------
     -- Errno --
     -----------
--- 44,51 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-linux__x32.ads gcc-16-20250921/gcc/ada/libgnarl/s-linux__x32.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-linux__x32.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-linux__x32.ads	Thu Jan  1 00:00:00 1970
***************
*** 1,133 ****
- ------------------------------------------------------------------------------
- --                                                                          --
- --                GNU ADA RUN-TIME LIBRARY (GNARL) COMPONENTS               --
- --                                                                          --
- --                          S Y S T E M .  L I N U X                        --
- --                                                                          --
- --                                  S p e c                                 --
- --                                                                          --
- --          Copyright (C) 2013-2025, Free Software Foundation, Inc.         --
- --
- --                                                                          --
- -- GNARL is free software; you can  redistribute it  and/or modify it under --
- -- terms of the  GNU General Public License as published  by the Free Soft- --
- -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
- -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
- -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
- -- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
- --                                                                          --
- -- As a special exception 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/>.                                          --
- --                                                                          --
- --                                                                          --
- ------------------------------------------------------------------------------
- 
- --  This is the x32 version of this package
- 
- --  This package encapsulates cpu specific differences between implementations
- --  of GNU/Linux, in order to share s-osinte-linux.ads.
- 
- --  PLEASE DO NOT add any with-clauses to this package or remove the pragma
- --  Preelaborate. This package is designed to be a bottom-level (leaf) package
- 
- with Interfaces.C;
- 
- with System.Parameters;
- 
- package System.Linux is
-    pragma Preelaborate;
- 
-    ----------
-    -- Time --
-    ----------
- 
-    subtype suseconds_t is Long_Long_Integer;
-    --  Note that suseconds_t is 64 bits.
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
-    subtype clockid_t   is Interfaces.C.int;
- 
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : Long_Long_Integer;
-       --  Note that tv_nsec is 64 bits.
-    end record;
-    pragma Convention (C, timespec);
- 
-    type timeval is record
-       tv_sec  : time_t;
-       tv_usec : suseconds_t;
-    end record;
-    pragma Convention (C, timeval);
- 
-    -----------
-    -- Errno --
-    -----------
- 
-    EAGAIN    : constant := 11;
-    EINTR     : constant := 4;
-    EINVAL    : constant := 22;
-    ENOMEM    : constant := 12;
-    EPERM     : constant := 1;
-    ETIMEDOUT : constant := 110;
- 
-    -------------
-    -- Signals --
-    -------------
- 
-    SIGHUP     : constant := 1; --  hangup
-    SIGINT     : constant := 2; --  interrupt (rubout)
-    SIGQUIT    : constant := 3; --  quit (ASCD FS)
-    SIGILL     : constant := 4; --  illegal instruction (not reset)
-    SIGTRAP    : constant := 5; --  trace trap (not reset)
-    SIGIOT     : constant := 6; --  IOT instruction
-    SIGABRT    : constant := 6; --  used by abort, replace SIGIOT in the future
-    SIGFPE     : constant := 8; --  floating point exception
-    SIGKILL    : constant := 9; --  kill (cannot be caught or ignored)
-    SIGBUS     : constant := 7; --  bus error
-    SIGUSR1    : constant := 10; --  user defined signal 1
-    SIGSEGV    : constant := 11; --  segmentation violation
-    SIGUSR2    : constant := 12; --  user defined signal 2
-    SIGPIPE    : constant := 13; --  write on a pipe with no one to read it
-    SIGALRM    : constant := 14; --  alarm clock
-    SIGTERM    : constant := 15; --  software termination signal from kill
-    SIGSTKFLT  : constant := 16; --  coprocessor stack fault (Linux)
-    SIGCLD     : constant := 17; --  alias for SIGCHLD
-    SIGCHLD    : constant := 17; --  child status change
-    SIGSTOP    : constant := 19; --  stop (cannot be caught or ignored)
-    SIGTSTP    : constant := 20; --  user stop requested from tty
-    SIGCONT    : constant := 18; --  stopped process has been continued
-    SIGTTIN    : constant := 21; --  background tty read attempted
-    SIGTTOU    : constant := 22; --  background tty write attempted
-    SIGURG     : constant := 23; --  urgent condition on IO channel
-    SIGXCPU    : constant := 24; --  CPU time limit exceeded
-    SIGXFSZ    : constant := 25; --  filesize limit exceeded
-    SIGVTALRM  : constant := 26; --  virtual timer expired
-    SIGPROF    : constant := 27; --  profiling timer expired
-    SIGWINCH   : constant := 28; --  window size change
-    SIGPOLL    : constant := 29; --  pollable event occurred
-    SIGIO      : constant := 29; --  I/O now possible (4.2 BSD)
-    SIGLOST    : constant := 29; --  File lock lost
-    SIGPWR     : constant := 30; --  power-fail restart
-    SIGSYS     : constant := 31; --  bad system call
-    SIGUNUSED  : constant := 31; --  unused signal (mapped to SIGSYS)
-    SIG32      : constant := 32; --  glibc internal signal
-    SIG33      : constant := 33; --  glibc internal signal
-    SIG34      : constant := 34; --  glibc internal signal
- 
-    --  struct_sigaction offsets
- 
-    sa_handler_pos : constant := 0;
-    sa_mask_pos    : constant := Standard'Address_Size / 8;
-    sa_flags_pos   : constant := 128 + sa_mask_pos;
- 
-    SA_SIGINFO  : constant := 16#04#;
-    SA_ONSTACK  : constant := 16#08000000#;
- 
- end System.Linux;
--- 0 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__aix.adb gcc-16-20250921/gcc/ada/libgnarl/s-osinte__aix.adb
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__aix.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__aix.adb	Sun Sep 21 22:32:35 2025
*************** package body System.OS_Interface is
*** 35,49 ****
  
     use Interfaces.C;
  
-    -----------------
-    -- To_Duration --
-    -----------------
- 
-    function To_Duration (TS : timespec) return Duration is
-    begin
-       return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9;
-    end To_Duration;
- 
     ------------------------
     -- To_Target_Priority --
     ------------------------
--- 35,40 ----
*************** package body System.OS_Interface is
*** 73,101 ****
     end To_Target_Priority;
  
     -----------------
-    -- To_Timespec --
-    -----------------
- 
-    function To_Timespec (D : Duration) return timespec is
-       S : time_t;
-       F : Duration;
- 
-    begin
-       S := time_t (Long_Long_Integer (D));
-       F := D - Duration (S);
- 
-       --  If F is negative due to a round-up, adjust for positive F value
- 
-       if F < 0.0 then
-          S := S - 1;
-          F := F + 1.0;
-       end if;
- 
-       return timespec'(tv_sec => S,
-                        tv_nsec => long (Long_Long_Integer (F * 10#1#E9)));
-    end To_Timespec;
- 
-    -----------------
     -- sched_yield --
     -----------------
  
--- 64,69 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__aix.ads gcc-16-20250921/gcc/ada/libgnarl/s-osinte__aix.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__aix.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__aix.ads	Sun Sep 21 22:32:35 2025
*************** with Ada.Unchecked_Conversion;
*** 43,50 ****
  with Interfaces.C;
  with Interfaces.C.Extensions;
  
  with System.OS_Locks;
- with System.Parameters;
  
  package System.OS_Interface is
     pragma Preelaborate;
--- 43,50 ----
  with Interfaces.C;
  with Interfaces.C.Extensions;
  
+ with System.C_Time;
  with System.OS_Locks;
  
  package System.OS_Interface is
     pragma Preelaborate;
*************** package System.OS_Interface is
*** 200,225 ****
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported
  
-    type timespec is private;
- 
     type clockid_t is new long_long;
  
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access timespec) return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
-    function To_Duration (TS : timespec) return Duration;
-    pragma Inline (To_Duration);
- 
-    function To_Timespec (D : Duration) return timespec;
-    pragma Inline (To_Timespec);
- 
     type struct_timezone is record
        tz_minuteswest : int;
        tz_dsttime     : int;
--- 200,217 ----
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported
  
     type clockid_t is new long_long;
  
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access C_Time.timespec) return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access C_Time.timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
     type struct_timezone is record
        tz_minuteswest : int;
        tz_dsttime     : int;
*************** package System.OS_Interface is
*** 420,426 ****
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
--- 412,418 ----
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access C_Time.timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
*************** private
*** 543,557 ****
  
     type pid_t is new int;
  
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
- 
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
     type pthread_attr_t is new System.Address;
     pragma Convention (C, pthread_attr_t);
     --  typedef struct __pt_attr        *pthread_attr_t;
--- 535,540 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__android.adb gcc-16-20250921/gcc/ada/libgnarl/s-osinte__android.adb
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__android.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__android.adb	Thu Jan  1 00:00:00 1970
***************
*** 1,74 ****
- ------------------------------------------------------------------------------
- --                                                                          --
- --                 GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS                 --
- --                                                                          --
- --                   S Y S T E M . O S _ I N T E R F A C E                  --
- --                                                                          --
- --                                   B o d y                                --
- --                                                                          --
- --                     Copyright (C) 1995-2025, AdaCore                     --
- --                                                                          --
- -- GNAT is free software;  you can  redistribute it  and/or modify it under --
- -- terms of the  GNU General Public License as published  by the Free Soft- --
- -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
- -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
- -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
- -- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
- --                                                                          --
- -- As a special exception 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/>.                                          --
- --                                                                          --
- -- GNARL was developed by the GNARL team at Florida State University.       --
- -- Extensive contributions were provided by Ada Core Technologies, Inc.     --
- --                                                                          --
- ------------------------------------------------------------------------------
- 
- --  This is an Android version of this package.
- 
- --  This package encapsulates all direct interfaces to OS services
- --  that are needed by children of System.
- 
- with Interfaces.C;            use Interfaces.C;
- 
- package body System.OS_Interface is
- 
-    -----------------
-    -- To_Duration --
-    -----------------
- 
-    function To_Duration (TS : timespec) return Duration is
-    begin
-       return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9;
-    end To_Duration;
- 
-    -----------------
-    -- To_Timespec --
-    -----------------
- 
-    function To_Timespec (D : Duration) return timespec is
-       S : time_t;
-       F : Duration;
- 
-    begin
-       S := time_t (Long_Long_Integer (D));
-       F := D - Duration (S);
- 
-       --  If F has negative value due to a round-up, adjust for positive F
-       --  value.
- 
-       if F < 0.0 then
-          S := S - 1;
-          F := F + 1.0;
-       end if;
- 
-       return timespec'(tv_sec => S,
-                        tv_nsec => long (Long_Long_Integer (F * 10#1#E9)));
-    end To_Timespec;
- 
- end System.OS_Interface;
--- 0 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__android.ads gcc-16-20250921/gcc/ada/libgnarl/s-osinte__android.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__android.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__android.ads	Sun Sep 21 22:32:35 2025
*************** with Ada.Unchecked_Conversion;
*** 42,51 ****
  
  with Interfaces.C;
  
  with System.Linux;
  with System.OS_Constants;
  with System.OS_Locks;
- with System.Parameters;
  
  package System.OS_Interface is
     pragma Preelaborate;
--- 42,51 ----
  
  with Interfaces.C;
  
+ with System.C_Time;
  with System.Linux;
  with System.OS_Constants;
  with System.OS_Locks;
  
  package System.OS_Interface is
     pragma Preelaborate;
*************** package System.OS_Interface is
*** 213,237 ****
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported
  
-    type timespec is private;
- 
     type clockid_t is new int;
  
     function clock_gettime
!      (clock_id : clockid_t; tp : access timespec) return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
-    function To_Duration (TS : timespec) return Duration;
-    pragma Inline (To_Duration);
- 
-    function To_Timespec (D : Duration) return timespec;
-    pragma Inline (To_Timespec);
- 
     function sysconf (name : int) return long;
     pragma Import (C, sysconf);
  
--- 213,229 ----
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported
  
     type clockid_t is new int;
  
     function clock_gettime
!      (clock_id : clockid_t; tp : access C_Time.timespec) return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access C_Time.timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
     function sysconf (name : int) return long;
     pragma Import (C, sysconf);
  
*************** package System.OS_Interface is
*** 463,469 ****
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
--- 455,461 ----
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access C_Time.timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
*************** private
*** 630,644 ****
  
     type pid_t is new int;
  
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
- 
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
     type unsigned_long_long_t is mod 2 ** 64;
     --  Local type only used to get the alignment of this type below
  
--- 622,627 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__cheribsd.ads gcc-16-20250921/gcc/ada/libgnarl/s-osinte__cheribsd.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__cheribsd.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__cheribsd.ads	Sun Sep 21 22:32:35 2025
*************** with Ada.Unchecked_Conversion;
*** 44,51 ****
  with Interfaces;
  with Interfaces.C;
  
  with System.OS_Locks;
- with System.Parameters;
  
  package System.OS_Interface is
     pragma Preelaborate;
--- 44,51 ----
  with Interfaces;
  with Interfaces.C;
  
+ with System.C_Time;
  with System.OS_Locks;
  
  package System.OS_Interface is
     pragma Preelaborate;
*************** package System.OS_Interface is
*** 232,261 ****
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported (i.e SCHED_RR is supported)
  
!    type timespec is private;
! 
!    function nanosleep (rqtp, rmtp : access timespec) return int;
     pragma Import (C, nanosleep, "nanosleep");
  
     type clockid_t is new int;
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access timespec)
        return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
-    function To_Duration (TS : timespec) return Duration;
-    pragma Inline (To_Duration);
- 
-    function To_Timespec (D : Duration) return timespec;
-    pragma Inline (To_Timespec);
- 
     type struct_timezone is record
        tz_minuteswest : int;
        tz_dsttime     : int;
--- 232,253 ----
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported (i.e SCHED_RR is supported)
  
!    function nanosleep (rqtp, rmtp : access C_Time.timespec) return int;
     pragma Import (C, nanosleep, "nanosleep");
  
     type clockid_t is new int;
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access C_Time.timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access C_Time.timespec)
        return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     type struct_timezone is record
        tz_minuteswest : int;
        tz_dsttime     : int;
*************** package System.OS_Interface is
*** 463,469 ****
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
--- 455,461 ----
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access C_Time.timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
*************** private
*** 664,678 ****
  
     Self_PID : constant pid_t := 0;
  
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
- 
-    type timespec is record
-       ts_sec  : time_t;
-       ts_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
     type pthread_t           is new System.Address;
     type pthread_attr_t      is new System.Address;
     type pthread_mutexattr_t is new System.Address;
--- 656,661 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__darwin.adb gcc-16-20250921/gcc/ada/libgnarl/s-osinte__darwin.adb
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__darwin.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__darwin.adb	Sun Sep 21 22:32:35 2025
***************
*** 31,49 ****
  
  --  This is a Darwin Threads version of this package
  
! with Interfaces.C.Extensions;
  
  package body System.OS_Interface is
-    use Interfaces.C;
- 
-    -----------------
-    -- To_Duration --
-    -----------------
- 
-    function To_Duration (TS : timespec) return Duration is
-    begin
-       return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9;
-    end To_Duration;
  
     ------------------------
     -- To_Target_Priority --
--- 31,39 ----
  
  --  This is a Darwin Threads version of this package
  
! with Interfaces.C; use Interfaces.C;
  
  package body System.OS_Interface is
  
     ------------------------
     -- To_Target_Priority --
*************** package body System.OS_Interface is
*** 56,92 ****
        return Interfaces.C.int (Prio);
     end To_Target_Priority;
  
-    -----------------
-    -- To_Timespec --
-    -----------------
- 
-    function To_Timespec (D : Duration) return timespec is
-       S : time_t;
-       F : Duration;
- 
-    begin
-       S := time_t (Long_Long_Integer (D));
-       F := D - Duration (S);
- 
-       --  If F has negative value due to a round-up, adjust for positive F
-       --  value.
- 
-       if F < 0.0 then
-          S := S - 1;
-          F := F + 1.0;
-       end if;
- 
-       return timespec'(tv_sec => S,
-         tv_nsec => long (Long_Long_Integer (F * 10#1#E9)));
-    end To_Timespec;
- 
     -------------------
     -- clock_gettime --
     -------------------
  
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access timespec) return int
     is
        pragma Unreferenced (clock_id);
  
--- 46,58 ----
        return Interfaces.C.int (Prio);
     end To_Target_Priority;
  
     -------------------
     -- clock_gettime --
     -------------------
  
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access C_Time.timespec) return int
     is
        pragma Unreferenced (clock_id);
  
*************** package body System.OS_Interface is
*** 94,126 ****
  
        use Interfaces;
  
!       type timeval is array (1 .. 3) of C.long;
!       --  The timeval array is sized to contain long_long sec and long usec.
!       --  If long_long'Size = long'Size then it will be overly large but that
!       --  won't effect the implementation since it's not accessed directly.
! 
!       procedure timeval_to_duration
!         (T    : not null access timeval;
!          sec  : not null access C.Extensions.long_long;
!          usec : not null access C.long);
!       pragma Import (C, timeval_to_duration, "__gnat_timeval_to_duration");
! 
!       Micro  : constant := 10**6;
!       sec    : aliased C.Extensions.long_long;
!       usec   : aliased C.long;
!       TV     : aliased timeval;
        Result : int;
  
        function gettimeofday
!         (Tv : access timeval;
           Tz : System.Address := System.Null_Address) return int;
        pragma Import (C, gettimeofday, "gettimeofday");
  
     begin
        Result := gettimeofday (TV'Access, System.Null_Address);
        pragma Assert (Result = 0);
!       timeval_to_duration (TV'Access, sec'Access, usec'Access);
!       tp.all := To_Timespec (Duration (sec) + Duration (usec) / Micro);
        return Result;
     end clock_gettime;
  
--- 60,77 ----
  
        use Interfaces;
  
!       TV     : aliased C_Time.timeval;
        Result : int;
  
        function gettimeofday
!         (Tv : access C_Time.timeval;
           Tz : System.Address := System.Null_Address) return int;
        pragma Import (C, gettimeofday, "gettimeofday");
  
     begin
        Result := gettimeofday (TV'Access, System.Null_Address);
        pragma Assert (Result = 0);
!       tp.all := C_Time.To_Timespec (TV);
        return Result;
     end clock_gettime;
  
*************** package body System.OS_Interface is
*** 130,142 ****
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access timespec) return int
     is
        pragma Unreferenced (clock_id);
  
        --  Darwin Threads don't have clock_getres.
  
-       Nano   : constant := 10**9;
        nsec   : int := 0;
        Result : int := -1;
  
--- 81,92 ----
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access C_Time.timespec) return int
     is
        pragma Unreferenced (clock_id);
  
        --  Darwin Threads don't have clock_getres.
  
        nsec   : int := 0;
        Result : int := -1;
  
*************** package body System.OS_Interface is
*** 145,151 ****
  
     begin
        nsec := clock_get_res;
!       res.all := To_Timespec (Duration (0.0) + Duration (nsec) / Nano);
  
        if nsec > 0 then
           Result := 0;
--- 95,101 ----
  
     begin
        nsec := clock_get_res;
!       res.all := C_Time.Nanoseconds_To_Timespec (nsec);
  
        if nsec > 0 then
           Result := 0;
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__darwin.ads gcc-16-20250921/gcc/ada/libgnarl/s-osinte__darwin.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__darwin.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__darwin.ads	Sun Sep 21 22:32:35 2025
***************
*** 40,48 ****
  
  with Interfaces.C;
  
  with System.OS_Constants;
  with System.OS_Locks;
- with System.Parameters;
  
  package System.OS_Interface is
     pragma Preelaborate;
--- 40,48 ----
  
  with Interfaces.C;
  
+ with System.C_Time;
  with System.OS_Constants;
  with System.OS_Locks;
  
  package System.OS_Interface is
     pragma Preelaborate;
*************** package System.OS_Interface is
*** 184,206 ****
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported
  
-    type timespec is private;
- 
     type clockid_t is new int;
  
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access timespec) return int;
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access timespec) return int;
! 
!    function To_Duration (TS : timespec) return Duration;
!    pragma Inline (To_Duration);
! 
!    function To_Timespec (D : Duration) return timespec;
!    pragma Inline (To_Timespec);
  
     -------------------------
     -- Priority Scheduling --
--- 184,198 ----
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported
  
     type clockid_t is new int;
  
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access C_Time.timespec) return int;
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access C_Time.timespec) return int;
  
     -------------------------
     -- Priority Scheduling --
*************** package System.OS_Interface is
*** 397,403 ****
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
--- 389,395 ----
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access C_Time.timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
*************** private
*** 517,531 ****
  
     type pid_t is new int32_t;
  
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
- 
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
     --
     --  Darwin specific signal implementation
     --
--- 509,514 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__dragonfly.adb gcc-16-20250921/gcc/ada/libgnarl/s-osinte__dragonfly.adb
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__dragonfly.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__dragonfly.adb	Sun Sep 21 22:32:35 2025
*************** package body System.OS_Interface is
*** 69,83 ****
        null;
     end pthread_init;
  
-    -----------------
-    -- To_Duration --
-    -----------------
- 
-    function To_Duration (TS : timespec) return Duration is
-    begin
-       return Duration (TS.ts_sec) + Duration (TS.ts_nsec) / 10#1#E9;
-    end To_Duration;
- 
     ------------------------
     -- To_Target_Priority --
     ------------------------
--- 69,74 ----
*************** package body System.OS_Interface is
*** 89,116 ****
        return Interfaces.C.int (Prio);
     end To_Target_Priority;
  
-    -----------------
-    -- To_Timespec --
-    -----------------
- 
-    function To_Timespec (D : Duration) return timespec is
-       S : time_t;
-       F : Duration;
- 
-    begin
-       S := time_t (Long_Long_Integer (D));
-       F := D - Duration (S);
- 
-       --  If F has negative value due to a round-up, adjust for positive F
-       --  value.
- 
-       if F < 0.0 then
-          S := S - 1;
-          F := F + 1.0;
-       end if;
- 
-       return timespec'(ts_sec => S,
-                        ts_nsec => long (Long_Long_Integer (F * 10#1#E9)));
-    end To_Timespec;
- 
  end System.OS_Interface;
--- 80,83 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__dragonfly.ads gcc-16-20250921/gcc/ada/libgnarl/s-osinte__dragonfly.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__dragonfly.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__dragonfly.ads	Sun Sep 21 22:32:35 2025
*************** with Ada.Unchecked_Conversion;
*** 43,50 ****
  
  with Interfaces.C;
  
  with System.OS_Locks;
- with System.Parameters;
  
  package System.OS_Interface is
     pragma Preelaborate;
--- 43,50 ----
  
  with Interfaces.C;
  
+ with System.C_Time;
  with System.OS_Locks;
  
  package System.OS_Interface is
     pragma Preelaborate;
*************** package System.OS_Interface is
*** 198,227 ****
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported (i.e SCHED_RR is supported)
  
!    type timespec is private;
! 
!    function nanosleep (rqtp, rmtp : access timespec)  return int;
     pragma Import (C, nanosleep, "nanosleep");
  
     type clockid_t is new unsigned_long;
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access timespec)
        return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
-    function To_Duration (TS : timespec) return Duration;
-    pragma Inline (To_Duration);
- 
-    function To_Timespec (D : Duration) return timespec;
-    pragma Inline (To_Timespec);
- 
     type struct_timezone is record
        tz_minuteswest : int;
        tz_dsttime     : int;
--- 198,219 ----
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported (i.e SCHED_RR is supported)
  
!    function nanosleep (rqtp, rmtp : access C_Time.timespec)  return int;
     pragma Import (C, nanosleep, "nanosleep");
  
     type clockid_t is new unsigned_long;
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access C_Time.timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access C_Time.timespec)
        return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     type struct_timezone is record
        tz_minuteswest : int;
        tz_dsttime     : int;
*************** package System.OS_Interface is
*** 432,438 ****
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     Relative_Timed_Wait : constant Boolean := False;
--- 424,430 ----
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access C_Time.timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     Relative_Timed_Wait : constant Boolean := False;
*************** private
*** 636,650 ****
  
     type pid_t is new int;
  
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
- 
-    type timespec is record
-       ts_sec  : time_t;
-       ts_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
     type pthread_t           is new System.Address;
     type pthread_attr_t      is new System.Address;
     type pthread_mutexattr_t is new System.Address;
--- 628,633 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__freebsd.adb gcc-16-20250921/gcc/ada/libgnarl/s-osinte__freebsd.adb
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__freebsd.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__freebsd.adb	Sun Sep 21 22:32:35 2025
*************** package body System.OS_Interface is
*** 69,83 ****
        null;
     end pthread_init;
  
-    -----------------
-    -- To_Duration --
-    -----------------
- 
-    function To_Duration (TS : timespec) return Duration is
-    begin
-       return Duration (TS.ts_sec) + Duration (TS.ts_nsec) / 10#1#E9;
-    end To_Duration;
- 
     ------------------------
     -- To_Target_Priority --
     ------------------------
--- 69,74 ----
*************** package body System.OS_Interface is
*** 89,115 ****
        return Interfaces.C.int (Prio);
     end To_Target_Priority;
  
-    -----------------
-    -- To_Timespec --
-    -----------------
- 
-    function To_Timespec (D : Duration) return timespec is
-       S : time_t;
-       F : Duration;
- 
-    begin
-       S := time_t (Long_Long_Integer (D));
-       F := D - Duration (S);
- 
-       --  If F has negative value due to a round-up, adjust for positive F
- 
-       if F < 0.0 then
-          S := S - 1;
-          F := F + 1.0;
-       end if;
- 
-       return timespec'(ts_sec => S,
-                        ts_nsec => long (Long_Long_Integer (F * 10#1#E9)));
-    end To_Timespec;
- 
  end System.OS_Interface;
--- 80,83 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__freebsd.ads gcc-16-20250921/gcc/ada/libgnarl/s-osinte__freebsd.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__freebsd.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__freebsd.ads	Sun Sep 21 22:32:35 2025
*************** with Ada.Unchecked_Conversion;
*** 43,50 ****
  
  with Interfaces.C;
  
  with System.OS_Locks;
- with System.Parameters;
  
  package System.OS_Interface is
     pragma Preelaborate;
--- 43,50 ----
  
  with Interfaces.C;
  
+ with System.C_Time;
  with System.OS_Locks;
  
  package System.OS_Interface is
     pragma Preelaborate;
*************** package System.OS_Interface is
*** 198,227 ****
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported (i.e SCHED_RR is supported)
  
!    type timespec is private;
! 
!    function nanosleep (rqtp, rmtp : access timespec) return int;
     pragma Import (C, nanosleep, "nanosleep");
  
     type clockid_t is new int;
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access timespec)
        return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
-    function To_Duration (TS : timespec) return Duration;
-    pragma Inline (To_Duration);
- 
-    function To_Timespec (D : Duration) return timespec;
-    pragma Inline (To_Timespec);
- 
     type struct_timezone is record
        tz_minuteswest : int;
        tz_dsttime     : int;
--- 198,219 ----
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported (i.e SCHED_RR is supported)
  
!    function nanosleep (rqtp, rmtp : access C_Time.timespec) return int;
     pragma Import (C, nanosleep, "nanosleep");
  
     type clockid_t is new int;
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access C_Time.timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access C_Time.timespec)
        return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     type struct_timezone is record
        tz_minuteswest : int;
        tz_dsttime     : int;
*************** package System.OS_Interface is
*** 431,437 ****
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
--- 423,429 ----
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access C_Time.timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
*************** private
*** 633,647 ****
     type pid_t is new int;
     Self_PID : constant pid_t := 0;
  
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
- 
-    type timespec is record
-       ts_sec  : time_t;
-       ts_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
     type pthread_t           is new System.Address;
     type pthread_attr_t      is new System.Address;
     type pthread_mutexattr_t is new System.Address;
--- 625,630 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__gnu.adb gcc-16-20250921/gcc/ada/libgnarl/s-osinte__gnu.adb
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__gnu.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__gnu.adb	Sun Sep 21 22:32:35 2025
*************** package body System.OS_Interface is
*** 93,107 ****
        return 0;
     end pthread_setschedparam;
  
-    -----------------
-    -- To_Duration --
-    -----------------
- 
-    function To_Duration (TS : timespec) return Duration is
-    begin
-       return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9;
-    end To_Duration;
- 
     ------------------------
     -- To_Target_Priority --
     ------------------------
--- 93,98 ----
*************** package body System.OS_Interface is
*** 113,140 ****
        return Interfaces.C.int (Prio);
     end To_Target_Priority;
  
-    -----------------
-    -- To_Timespec --
-    -----------------
- 
-    function To_Timespec (D : Duration) return timespec is
-       S : time_t;
-       F : Duration;
- 
-    begin
-       S := time_t (Long_Long_Integer (D));
-       F := D - Duration (S);
- 
-       --  If F has negative value due to a round-up, adjust for positive F
-       --  value.
- 
-       if F < 0.0 then
-          S := S - 1;
-          F := F + 1.0;
-       end if;
- 
-       return timespec'(tv_sec => S,
-                        tv_nsec => long (Long_Long_Integer (F * 10#1#E9)));
-    end To_Timespec;
- 
  end System.OS_Interface;
--- 104,107 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__gnu.ads gcc-16-20250921/gcc/ada/libgnarl/s-osinte__gnu.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__gnu.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__gnu.ads	Sun Sep 21 22:32:35 2025
*************** with Ada.Unchecked_Conversion;
*** 42,49 ****
  
  with Interfaces.C;
  
  with System.OS_Locks;
- with System.Parameters;
  
  package System.OS_Interface is
     pragma Preelaborate;
--- 42,49 ----
  
  with Interfaces.C;
  
+ with System.C_Time;
  with System.OS_Locks;
  
  package System.OS_Interface is
     pragma Preelaborate;
*************** package System.OS_Interface is
*** 210,218 ****
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported (i.e SCHED_RR is supported)
  
!    type timespec is private;
! 
!    function nanosleep (rqtp, rmtp : access timespec) return int;
     pragma Import (C, nanosleep, "nanosleep");
  
     type clockid_t is new int;
--- 210,216 ----
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported (i.e SCHED_RR is supported)
  
!    function nanosleep (rqtp, rmtp : access C_Time.timespec) return int;
     pragma Import (C, nanosleep, "nanosleep");
  
     type clockid_t is new int;
*************** package System.OS_Interface is
*** 221,241 ****
     --  From: /usr/include/time.h
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access timespec)
        return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
-    function To_Duration (TS : timespec) return Duration;
-    pragma Inline (To_Duration);
- 
-    function To_Timespec (D : Duration) return timespec;
-    pragma Inline (To_Timespec);
- 
     --  From: /usr/include/unistd.h
     function sysconf (name : int) return long;
     pragma Import (C, sysconf);
--- 219,233 ----
     --  From: /usr/include/time.h
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access C_Time.timespec)
        return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access C_Time.timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
     --  From: /usr/include/unistd.h
     function sysconf (name : int) return long;
     pragma Import (C, sysconf);
*************** package System.OS_Interface is
*** 487,493 ****
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     Relative_Timed_Wait : constant Boolean := False;
--- 479,485 ----
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access C_Time.timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     Relative_Timed_Wait : constant Boolean := False;
*************** private
*** 656,670 ****
  
     type pid_t is new int;
  
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
- 
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
     --  From: /usr/include/pthread/pthreadtypes.h:
     --  typedef struct __pthread_attr pthread_attr_t;
     --  /usr/include/i386-gnu/bits/thread-attr.h: struct __pthread_attr...
--- 648,653 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__hpux.ads gcc-16-20250921/gcc/ada/libgnarl/s-osinte__hpux.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__hpux.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__hpux.ads	Sun Sep 21 22:32:35 2025
*************** with Ada.Unchecked_Conversion;
*** 42,49 ****
  
  with Interfaces.C;
  
  with System.OS_Locks;
- with System.Parameters;
  
  package System.OS_Interface is
     pragma Preelaborate;
--- 42,49 ----
  
  with Interfaces.C;
  
+ with System.C_Time;
  with System.OS_Locks;
  
  package System.OS_Interface is
     pragma Preelaborate;
*************** package System.OS_Interface is
*** 181,206 ****
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported
  
-    type timespec is private;
- 
     type clockid_t is new int;
  
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access timespec) return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
-    function To_Duration (TS : timespec) return Duration;
-    pragma Inline (To_Duration);
- 
-    function To_Timespec (D : Duration) return timespec;
-    pragma Inline (To_Timespec);
- 
     type struct_timezone is record
        tz_minuteswest : int;
        tz_dsttime     : int;
--- 181,198 ----
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported
  
     type clockid_t is new int;
  
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access C_Time.timespec) return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access C_Time.timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
     type struct_timezone is record
        tz_minuteswest : int;
        tz_dsttime     : int;
*************** package System.OS_Interface is
*** 400,406 ****
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
--- 392,398 ----
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access C_Time.timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
*************** private
*** 517,531 ****
  
     type pid_t is new int;
  
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
- 
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
     type pthread_attr_t is new int;
     type pthread_condattr_t is new int;
     type pthread_mutexattr_t is new int;
--- 509,514 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__kfreebsd-gnu.ads gcc-16-20250921/gcc/ada/libgnarl/s-osinte__kfreebsd-gnu.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__kfreebsd-gnu.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__kfreebsd-gnu.ads	Sun Sep 21 22:32:35 2025
*************** with Ada.Unchecked_Conversion;
*** 42,49 ****
  
  with Interfaces.C;
  
  with System.OS_Locks;
- with System.Parameters;
  
  package System.OS_Interface is
     pragma Preelaborate;
--- 42,49 ----
  
  with Interfaces.C;
  
+ with System.C_Time;
  with System.OS_Locks;
  
  package System.OS_Interface is
     pragma Preelaborate;
*************** package System.OS_Interface is
*** 205,213 ****
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported (i.e SCHED_RR is supported)
  
!    type timespec is private;
! 
!    function nanosleep (rqtp, rmtp : access timespec) return int;
     pragma Import (C, nanosleep, "nanosleep");
  
     type clockid_t is new int;
--- 205,211 ----
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported (i.e SCHED_RR is supported)
  
!    function nanosleep (rqtp, rmtp : access C_Time.timespec) return int;
     pragma Import (C, nanosleep, "nanosleep");
  
     type clockid_t is new int;
*************** package System.OS_Interface is
*** 215,235 ****
  
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access timespec)
        return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
-    function To_Duration (TS : timespec) return Duration;
-    pragma Inline (To_Duration);
- 
-    function To_Timespec (D : Duration) return timespec;
-    pragma Inline (To_Timespec);
- 
     function sysconf (name : int) return long;
     pragma Import (C, sysconf);
  
--- 213,227 ----
  
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access C_Time.timespec)
        return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access C_Time.timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
     function sysconf (name : int) return long;
     pragma Import (C, sysconf);
  
*************** package System.OS_Interface is
*** 430,436 ****
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
--- 422,428 ----
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access C_Time.timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
*************** private
*** 602,616 ****
  
     type pid_t is new int;
  
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
- 
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
     type pthread_attr_t is record
        detachstate   : int;
        schedpolicy   : int;
--- 594,599 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__linux.ads gcc-16-20250921/gcc/ada/libgnarl/s-osinte__linux.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__linux.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__linux.ads	Sun Sep 21 22:32:35 2025
*************** with Ada.Unchecked_Conversion;
*** 42,47 ****
--- 42,48 ----
  
  with Interfaces.C;
  
+ with System.C_Time;
  with System.Linux;
  with System.OS_Constants;
  with System.OS_Locks;
*************** package System.OS_Interface is
*** 54,61 ****
  
     pragma Linker_Options ("-lpthread");
  
-    use type System.Linux.time_t;
- 
     subtype int            is Interfaces.C.int;
     subtype char           is Interfaces.C.char;
     subtype short          is Interfaces.C.short;
--- 55,60 ----
*************** package System.OS_Interface is
*** 229,254 ****
     -- Time --
     ----------
  
-    subtype time_t    is System.Linux.time_t;
-    subtype timespec  is System.Linux.timespec;
-    subtype timeval   is System.Linux.timeval;
     subtype clockid_t is System.Linux.clockid_t;
  
     function clock_gettime
!      (clock_id : clockid_t; tp : access timespec) return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
-    function To_Duration (TS : timespec) return Duration;
-    pragma Inline (To_Duration);
- 
-    function To_Timespec (D : Duration) return timespec;
-    pragma Inline (To_Timespec);
- 
     function sysconf (name : int) return long;
     pragma Import (C, sysconf);
  
--- 228,244 ----
     -- Time --
     ----------
  
     subtype clockid_t is System.Linux.clockid_t;
  
     function clock_gettime
!      (clock_id : clockid_t; tp : access C_Time.timespec) return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access C_Time.timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
     function sysconf (name : int) return long;
     pragma Import (C, sysconf);
  
*************** package System.OS_Interface is
*** 457,463 ****
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
--- 447,453 ----
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access C_Time.timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__lynxos178.adb gcc-16-20250921/gcc/ada/libgnarl/s-osinte__lynxos178.adb
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__lynxos178.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__lynxos178.adb	Sun Sep 21 22:32:35 2025
*************** package body System.OS_Interface is
*** 85,99 ****
        return int (sysconf (SC_PAGESIZE));
     end Get_Page_Size;
  
-    -----------------
-    -- To_Duration --
-    -----------------
- 
-    function To_Duration (TS : timespec) return Duration is
-    begin
-       return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9;
-    end To_Duration;
- 
     ------------------------
     -- To_Target_Priority --
     ------------------------
--- 85,90 ----
*************** package body System.OS_Interface is
*** 105,133 ****
        return Interfaces.C.int (Prio);
     end To_Target_Priority;
  
-    -----------------
-    -- To_Timespec --
-    -----------------
- 
-    function To_Timespec (D : Duration) return timespec is
-       S : time_t;
-       F : Duration;
- 
-    begin
-       S := time_t (Long_Long_Integer (D));
-       F := D - Duration (S);
- 
-       --  If F is negative due to a round-up, adjust for positive F value
- 
-       if F < 0.0 then
-          S := S - 1;
-          F := F + 1.0;
-       end if;
- 
-       return timespec'(tv_sec => S,
-                        tv_nsec => long (Long_Long_Integer (F * 10#1#E9)));
-    end To_Timespec;
- 
     -------------
     -- sigwait --
     -------------
--- 96,101 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__lynxos178e.ads gcc-16-20250921/gcc/ada/libgnarl/s-osinte__lynxos178e.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__lynxos178e.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__lynxos178e.ads	Sun Sep 21 22:32:35 2025
*************** with Ada.Unchecked_Conversion;
*** 42,50 ****
  
  with Interfaces.C;
  
  with System.Multiprocessors;
  with System.OS_Locks;
- with System.Parameters;
  
  package System.OS_Interface is
     pragma Preelaborate;
--- 42,50 ----
  
  with Interfaces.C;
  
+ with System.C_Time;
  with System.Multiprocessors;
  with System.OS_Locks;
  
  package System.OS_Interface is
     pragma Preelaborate;
*************** package System.OS_Interface is
*** 193,218 ****
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported
  
-    type timespec is private;
- 
     type clockid_t is new int;
  
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access timespec) return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
-    function To_Duration (TS : timespec) return Duration;
-    pragma Inline (To_Duration);
- 
-    function To_Timespec (D : Duration) return timespec;
-    pragma Inline (To_Timespec);
- 
     type struct_timezone is record
        tz_minuteswest : int;
        tz_dsttime     : int;
--- 193,210 ----
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported
  
     type clockid_t is new int;
  
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access C_Time.timespec) return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access C_Time.timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
     type struct_timezone is record
        tz_minuteswest : int;
        tz_dsttime     : int;
*************** package System.OS_Interface is
*** 220,227 ****
     pragma Convention (C, struct_timezone);
     type struct_timezone_ptr is access all struct_timezone;
  
-    type struct_timeval is private;
- 
     -------------------------
     -- Priority Scheduling --
     -------------------------
--- 212,217 ----
*************** package System.OS_Interface is
*** 415,421 ****
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
--- 405,411 ----
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access C_Time.timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
*************** private
*** 541,563 ****
  
     type pid_t is new long;
  
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
- 
-    type suseconds_t is new int;
- 
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
-    type struct_timeval is record
-       tv_sec  : time_t;
-       tv_usec : suseconds_t;
-    end record;
-    pragma Convention (C, struct_timeval);
- 
     type st_attr is record
        stksize      : int;
        prio         : int;
--- 531,536 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__posix.adb gcc-16-20250921/gcc/ada/libgnarl/s-osinte__posix.adb
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__posix.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__posix.adb	Sun Sep 21 22:32:35 2025
***************
*** 36,41 ****
--- 36,42 ----
  --  that are needed by children of System.
  
  with Interfaces.C; use Interfaces.C;
+ 
  package body System.OS_Interface is
  
     --------------------
*************** package body System.OS_Interface is
*** 58,72 ****
        null;
     end pthread_init;
  
-    -----------------
-    -- To_Duration --
-    -----------------
- 
-    function To_Duration (TS : timespec) return Duration is
-    begin
-       return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9;
-    end To_Duration;
- 
     ------------------------
     -- To_Target_Priority --
     ------------------------
--- 59,64 ----
*************** package body System.OS_Interface is
*** 78,105 ****
        return Interfaces.C.int (Prio);
     end To_Target_Priority;
  
-    -----------------
-    -- To_Timespec --
-    -----------------
- 
-    function To_Timespec (D : Duration) return timespec is
-       S : time_t;
-       F : Duration;
- 
-    begin
-       S := time_t (Long_Long_Integer (D));
-       F := D - Duration (S);
- 
-       --  If F has negative value due to a round-up, adjust for positive F
-       --  value.
- 
-       if F < 0.0 then
-          S := S - 1;
-          F := F + 1.0;
-       end if;
- 
-       return timespec'(tv_sec => S,
-                        tv_nsec => long (Long_Long_Integer (F * 10#1#E9)));
-    end To_Timespec;
- 
  end System.OS_Interface;
--- 70,73 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__qnx.adb gcc-16-20250921/gcc/ada/libgnarl/s-osinte__qnx.adb
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__qnx.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__qnx.adb	Sun Sep 21 22:32:35 2025
***************
*** 36,41 ****
--- 36,42 ----
  --  that are needed by children of System.
  
  with Interfaces.C; use Interfaces.C;
+ 
  package body System.OS_Interface is
  
     -----------------
*************** package body System.OS_Interface is
*** 70,84 ****
        null;
     end pthread_init;
  
-    -----------------
-    -- To_Duration --
-    -----------------
- 
-    function To_Duration (TS : timespec) return Duration is
-    begin
-       return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9;
-    end To_Duration;
- 
     ------------------------
     -- To_Target_Priority --
     ------------------------
--- 71,76 ----
*************** package body System.OS_Interface is
*** 90,117 ****
        return Interfaces.C.int (Prio);
     end To_Target_Priority;
  
-    -----------------
-    -- To_Timespec --
-    -----------------
- 
-    function To_Timespec (D : Duration) return timespec is
-       S : time_t;
-       F : Duration;
- 
-    begin
-       S := time_t (Long_Long_Integer (D));
-       F := D - Duration (S);
- 
-       --  If F has negative value due to a round-up, adjust for positive F
-       --  value.
- 
-       if F < 0.0 then
-          S := S - 1;
-          F := F + 1.0;
-       end if;
- 
-       return timespec'(tv_sec => S,
-                        tv_nsec => long (Long_Long_Integer (F * 10#1#E9)));
-    end To_Timespec;
- 
  end System.OS_Interface;
--- 82,85 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__qnx.ads gcc-16-20250921/gcc/ada/libgnarl/s-osinte__qnx.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__qnx.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__qnx.ads	Sun Sep 21 22:32:35 2025
*************** with Ada.Unchecked_Conversion;
*** 41,49 ****
  
  with Interfaces.C;
  
  with System.OS_Constants;
  with System.OS_Locks;
- with System.Parameters;
  
  package System.OS_Interface is
     pragma Preelaborate;
--- 41,49 ----
  
  with Interfaces.C;
  
+ with System.C_Time;
  with System.OS_Constants;
  with System.OS_Locks;
  
  package System.OS_Interface is
     pragma Preelaborate;
*************** package System.OS_Interface is
*** 213,237 ****
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported
  
-    type timespec is private;
- 
     type clockid_t is new int;
  
     function clock_gettime
!      (clock_id : clockid_t; tp : access timespec) return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
-    function To_Duration (TS : timespec) return Duration;
-    pragma Inline (To_Duration);
- 
-    function To_Timespec (D : Duration) return timespec;
-    pragma Inline (To_Timespec);
- 
     -------------------------
     -- Priority Scheduling --
     -------------------------
--- 213,229 ----
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported
  
     type clockid_t is new int;
  
     function clock_gettime
!      (clock_id : clockid_t; tp : access C_Time.timespec) return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access C_Time.timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
     -------------------------
     -- Priority Scheduling --
     -------------------------
*************** package System.OS_Interface is
*** 418,424 ****
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
--- 410,416 ----
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access C_Time.timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
*************** private
*** 572,586 ****
  
     type pid_t is new int;
  
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
- 
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
     type unsigned_long_long_t is mod 2 ** 64;
     --  Local type only used to get the alignment of this type below
  
--- 564,569 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__rtems.adb gcc-16-20250921/gcc/ada/libgnarl/s-osinte__rtems.adb
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__rtems.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__rtems.adb	Sun Sep 21 22:32:35 2025
*************** package body System.OS_Interface is
*** 92,106 ****
       return int
       with Import, External_Name => "rtems_semaphore_release", Convention => C;
  
-    -----------------
-    -- To_Duration --
-    -----------------
- 
-    function To_Duration (TS : timespec) return Duration is
-    begin
-       return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9;
-    end To_Duration;
- 
     ------------------------
     -- To_Target_Priority --
     ------------------------
--- 92,97 ----
*************** package body System.OS_Interface is
*** 112,138 ****
        return Interfaces.C.int (Prio);
     end To_Target_Priority;
  
-    -----------------
-    -- To_Timespec --
-    -----------------
- 
-    function To_Timespec (D : Duration) return timespec is
-       S : time_t;
-       F : Duration;
-    begin
-       S := time_t (Long_Long_Integer (D));
-       F := D - Duration (S);
- 
-       --  If F has negative value due to round-up, adjust for positive F value
- 
-       if F < 0.0 then
-          S := S - 1;
-          F := F + 1.0;
-       end if;
-       return timespec'(tv_sec => S,
-                        tv_nsec => long (Long_Long_Integer (F * 10#1#E9)));
-    end To_Timespec;
- 
     -----------------------------
     -- Binary_Semaphore_Create --
     -----------------------------
--- 103,108 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__rtems.ads gcc-16-20250921/gcc/ada/libgnarl/s-osinte__rtems.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__rtems.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__rtems.ads	Sun Sep 21 22:32:35 2025
***************
*** 52,60 ****
  
  with Interfaces.C;
  
  with System.OS_Constants;
  with System.OS_Locks;
- with System.Parameters;
  
  package System.OS_Interface is
     pragma Preelaborate;
--- 52,60 ----
  
  with Interfaces.C;
  
+ with System.C_Time;
  with System.OS_Constants;
  with System.OS_Locks;
  
  package System.OS_Interface is
     pragma Preelaborate;
*************** package System.OS_Interface is
*** 181,188 ****
     Time_Slice_Supported : constant Boolean := True;
     --  Indicates whether time slicing is supported (i.e SCHED_RR is supported)
  
-    type timespec is private;
- 
     type clockid_t is new int;
  
     CLOCK_REALTIME  : constant clockid_t;
--- 181,186 ----
*************** package System.OS_Interface is
*** 190,209 ****
  
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access timespec) return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
-    function To_Duration (TS : timespec) return Duration;
-    pragma Inline (To_Duration);
- 
-    function To_Timespec (D : Duration) return timespec;
-    pragma Inline (To_Timespec);
- 
     -------------------------
     -- Priority Scheduling --
     -------------------------
--- 188,201 ----
  
     function clock_gettime
       (clock_id : clockid_t;
!       tp       : access C_Time.timespec) return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
       (clock_id : clockid_t;
!       res      : access C_Time.timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
     -------------------------
     -- Priority Scheduling --
     -------------------------
*************** package System.OS_Interface is
*** 428,434 ****
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
--- 420,426 ----
     function pthread_cond_timedwait
       (cond    : access pthread_cond_t;
        mutex   : access pthread_mutex_t;
!       abstime : access C_Time.timespec) return int;
     pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
  
     --------------------------
*************** package System.OS_Interface is
*** 454,461 ****
     type struct_sched_param is record
        sched_priority      : int;
        ss_low_priority     : int;
!       ss_replenish_period : timespec;
!       ss_initial_budget   : timespec;
        sched_ss_max_repl   : int;
     end record;
     pragma Convention (C, struct_sched_param);
--- 446,453 ----
     type struct_sched_param is record
        sched_priority      : int;
        ss_low_priority     : int;
!       ss_replenish_period : C_Time.timespec;
!       ss_initial_budget   : C_Time.timespec;
        sched_ss_max_repl   : int;
     end record;
     pragma Convention (C, struct_sched_param);
*************** private
*** 591,605 ****
  
     type pid_t is new int;
  
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
- 
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
     CLOCK_REALTIME :  constant clockid_t := System.OS_Constants.CLOCK_REALTIME;
     CLOCK_MONOTONIC : constant clockid_t := System.OS_Constants.CLOCK_MONOTONIC;
  
--- 583,588 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__solaris.adb gcc-16-20250921/gcc/ada/libgnarl/s-osinte__solaris.adb
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__solaris.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__solaris.adb	Sun Sep 21 22:32:35 2025
***************
*** 35,76 ****
  --  This package encapsulates all direct interfaces to OS services
  --  that are needed by children of System.
  
- with Interfaces.C; use Interfaces.C;
- 
  package body System.OS_Interface is
  
-    -----------------
-    -- To_Duration --
-    -----------------
- 
-    function To_Duration (TS : timespec) return Duration is
-    begin
-       return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9;
-    end To_Duration;
- 
-    -----------------
-    -- To_Timespec --
-    -----------------
- 
-    function To_Timespec (D : Duration) return timespec is
-       S : time_t;
-       F : Duration;
- 
-    begin
-       S := time_t (Long_Long_Integer (D));
-       F := D - Duration (S);
- 
-       --  If F has negative value due to a round-up, adjust for positive F
- 
-       if F < 0.0 then
-          S := S - 1;
-          F := F + 1.0;
-       end if;
- 
-       return timespec'(tv_sec  => S,
-                        tv_nsec => long (Long_Long_Integer (F * 10#1#E9)));
-    end To_Timespec;
- 
     ------------------
     -- pthread_init --
     ------------------
--- 35,42 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__solaris.ads gcc-16-20250921/gcc/ada/libgnarl/s-osinte__solaris.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__solaris.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__solaris.ads	Sun Sep 21 22:32:35 2025
*************** with Ada.Unchecked_Conversion;
*** 42,49 ****
  
  with Interfaces.C;
  
  with System.OS_Locks;
- with System.Parameters;
  
  package System.OS_Interface is
     pragma Preelaborate;
--- 42,49 ----
  
  with Interfaces.C;
  
+ with System.C_Time;
  with System.OS_Locks;
  
  package System.OS_Interface is
     pragma Preelaborate;
*************** package System.OS_Interface is
*** 241,264 ****
     -- Time --
     ----------
  
-    type timespec is private;
- 
     type clockid_t is new int;
  
     function clock_gettime
!      (clock_id : clockid_t; tp : access timespec) return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
!      (clock_id : clockid_t; res : access timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
-    function To_Duration (TS : timespec) return Duration;
-    pragma Inline (To_Duration);
- 
-    function To_Timespec (D : Duration) return timespec;
-    pragma Inline (To_Timespec);
- 
     function sysconf (name : int) return long;
     pragma Import (C, sysconf);
  
--- 241,256 ----
     -- Time --
     ----------
  
     type clockid_t is new int;
  
     function clock_gettime
!      (clock_id : clockid_t; tp : access C_Time.timespec) return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
!      (clock_id : clockid_t; res : access C_Time.timespec) return int;
     pragma Import (C, clock_getres, "clock_getres");
  
     function sysconf (name : int) return long;
     pragma Import (C, sysconf);
  
*************** package System.OS_Interface is
*** 347,353 ****
     function cond_timedwait
       (cond    : access cond_t;
        mutex   : access mutex_t;
!       abstime : access timespec) return int;
     pragma Import (C, cond_timedwait, "cond_timedwait");
  
     function cond_signal (cond : access cond_t) return int;
--- 339,345 ----
     function cond_timedwait
       (cond    : access cond_t;
        mutex   : access mutex_t;
!       abstime : access C_Time.timespec) return int;
     pragma Import (C, cond_timedwait, "cond_timedwait");
  
     function cond_signal (cond : access cond_t) return int;
*************** private
*** 526,540 ****
  
     type pid_t is new long;
  
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
- 
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
     type array_type_9 is array (0 .. 3) of unsigned_char;
     type record_type_3 is record
        flag  : array_type_9;
--- 518,523 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__vxworks.adb gcc-16-20250921/gcc/ada/libgnarl/s-osinte__vxworks.adb
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__vxworks.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__vxworks.adb	Sun Sep 21 22:32:35 2025
*************** package body System.OS_Interface is
*** 41,78 ****
     Low_Priority : constant := 255;
     --  VxWorks native (default) lowest scheduling priority
  
-    -----------------
-    -- To_Duration --
-    -----------------
- 
-    function To_Duration (TS : timespec) return Duration is
-    begin
-       return Duration (TS.ts_sec) + Duration (TS.ts_nsec) / 10#1#E9;
-    end To_Duration;
- 
-    -----------------
-    -- To_Timespec --
-    -----------------
- 
-    function To_Timespec (D : Duration) return timespec is
-       S : time_t;
-       F : Duration;
- 
-    begin
-       S := time_t (Long_Long_Integer (D));
-       F := D - Duration (S);
- 
-       --  If F is negative due to a round-up, adjust for positive F value
- 
-       if F < 0.0 then
-          S := S - 1;
-          F := F + 1.0;
-       end if;
- 
-       return timespec'(ts_sec  => S,
-                        ts_nsec => long (Long_Long_Integer (F * 10#1#E9)));
-    end To_Timespec;
- 
     -------------------------
     -- To_VxWorks_Priority --
     -------------------------
--- 41,46 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__vxworks.ads gcc-16-20250921/gcc/ada/libgnarl/s-osinte__vxworks.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__vxworks.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__vxworks.ads	Sun Sep 21 22:32:35 2025
***************
*** 40,49 ****
  
  with Interfaces.C;
  
  with System.VxWorks;
  with System.VxWorks.Ext;
  with System.Multiprocessors;
- with System.Parameters;
  
  package System.OS_Interface is
     pragma Preelaborate;
--- 40,49 ----
  
  with Interfaces.C;
  
+ with System.C_Time;
  with System.VxWorks;
  with System.VxWorks.Ext;
  with System.Multiprocessors;
  
  package System.OS_Interface is
     pragma Preelaborate;
*************** package System.OS_Interface is
*** 244,280 ****
     -- Time --
     ----------
  
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
-    --  Time_t here used to be unsigned to match the VxWorks header declaration.
-    --  The header declaration has changed in newer releases and is now signed
-    --  for applications.
- 
-    type timespec is record
-       ts_sec  : time_t;
-       ts_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
     type clockid_t is new int;
  
-    function To_Duration (TS : timespec) return Duration;
-    pragma Inline (To_Duration);
- 
-    function To_Timespec (D : Duration) return timespec;
-    pragma Inline (To_Timespec);
-    --  Convert a Duration value to a timespec value. Note that in VxWorks,
-    --  timespec is always non-negative (since time_t is defined above as
-    --  unsigned long). This means that there is a potential problem if a
-    --  negative argument is passed for D. However, in actual usage, the
-    --  value of the input argument D is always non-negative, so no problem
-    --  arises in practice.
- 
     function To_Clock_Ticks (D : Duration) return int;
     --  Convert a duration value (in seconds) into clock ticks
  
     function clock_gettime
!      (clock_id : clockid_t; tp : access timespec) return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     ----------------------
--- 244,256 ----
     -- Time --
     ----------
  
     type clockid_t is new int;
  
     function To_Clock_Ticks (D : Duration) return int;
     --  Convert a duration value (in seconds) into clock ticks
  
     function clock_gettime
!      (clock_id : clockid_t; tp : access C_Time.timespec) return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     ----------------------
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-osinte__x32.adb gcc-16-20250921/gcc/ada/libgnarl/s-osinte__x32.adb
*** gcc-16-20250914/gcc/ada/libgnarl/s-osinte__x32.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-osinte__x32.adb	Thu Jan  1 00:00:00 1970
***************
*** 1,106 ****
- ------------------------------------------------------------------------------
- --                                                                          --
- --                 GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS                 --
- --                                                                          --
- --                   S Y S T E M . O S _ I N T E R F A C E                  --
- --                                                                          --
- --                                   B o d y                                --
- --                                                                          --
- --             Copyright (C) 1991-2017, Florida State University            --
- --                     Copyright (C) 1995-2025, AdaCore                     --
- --                                                                          --
- -- GNAT is free software;  you can  redistribute it  and/or modify it under --
- -- terms of the  GNU General Public License as published  by the Free Soft- --
- -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
- -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
- -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
- -- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
- --                                                                          --
- -- As a special exception 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/>.                                          --
- --                                                                          --
- -- GNARL was developed by the GNARL team at Florida State University.       --
- -- Extensive contributions were provided by Ada Core Technologies, Inc.     --
- --                                                                          --
- ------------------------------------------------------------------------------
- 
- --  This version is for Linux/x32
- 
- --  This package encapsulates all direct interfaces to OS services
- --  that are needed by children of System.
- 
- with Interfaces.C; use Interfaces.C;
- 
- package body System.OS_Interface is
- 
-    --------------------
-    -- Get_Stack_Base --
-    --------------------
- 
-    function Get_Stack_Base (thread : pthread_t) return Address is
-       pragma Warnings (Off, thread);
- 
-    begin
-       return Null_Address;
-    end Get_Stack_Base;
- 
-    ------------------
-    -- pthread_init --
-    ------------------
- 
-    procedure pthread_init is
-    begin
-       null;
-    end pthread_init;
- 
-    -----------------
-    -- To_Duration --
-    -----------------
- 
-    function To_Duration (TS : timespec) return Duration is
-    begin
-       return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9;
-    end To_Duration;
- 
-    ------------------------
-    -- To_Target_Priority --
-    ------------------------
- 
-    function To_Target_Priority
-      (Prio : System.Any_Priority) return Interfaces.C.int
-    is
-    begin
-       return Interfaces.C.int (Prio);
-    end To_Target_Priority;
- 
-    -----------------
-    -- To_Timespec --
-    -----------------
- 
-    function To_Timespec (D : Duration) return timespec is
-       S : time_t;
-       F : Duration;
- 
-    begin
-       S := time_t (Long_Long_Integer (D));
-       F := D - Duration (S);
- 
-       --  If F has negative value due to a round-up, adjust for positive F
-       --  value.
- 
-       if F < 0.0 then
-          S := S - 1;
-          F := F + 1.0;
-       end if;
- 
-       return timespec'(tv_sec => S,
-                        tv_nsec => Long_Long_Integer (F * 10#1#E9));
-    end To_Timespec;
- 
- end System.OS_Interface;
--- 0 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-qnx.ads gcc-16-20250921/gcc/ada/libgnarl/s-qnx.ads
*** gcc-16-20250914/gcc/ada/libgnarl/s-qnx.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-qnx.ads	Sun Sep 21 22:32:35 2025
***************
*** 37,44 ****
  
  with Interfaces.C;
  
- with System.Parameters;
- 
  package System.QNX is
     pragma Preelaborate;
  
--- 37,42 ----
*************** package System.QNX is
*** 46,69 ****
     -- Time --
     ----------
  
-    subtype long        is Interfaces.C.long;
-    subtype suseconds_t is Interfaces.C.long;
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
     subtype clockid_t   is Interfaces.C.int;
  
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : long;
-    end record;
-    pragma Convention (C, timespec);
- 
-    type timeval is record
-       tv_sec  : time_t;
-       tv_usec : suseconds_t;
-    end record;
-    pragma Convention (C, timeval);
- 
     -----------
     -- Errno --
     -----------
--- 44,51 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-taprop__solaris.adb gcc-16-20250921/gcc/ada/libgnarl/s-taprop__solaris.adb
*** gcc-16-20250914/gcc/ada/libgnarl/s-taprop__solaris.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-taprop__solaris.adb	Sun Sep 21 22:32:35 2025
***************
*** 36,41 ****
--- 36,42 ----
  
  with Interfaces.C;
  
+ with System.C_Time;
  with System.Interrupt_Management;
  with System.Multiprocessors;
  with System.OS_Constants;
*************** package body System.Task_Primitives.Oper
*** 762,773 ****
     ---------------------
  
     function Monotonic_Clock return Duration is
!       TS     : aliased timespec;
        Result : Interfaces.C.int;
     begin
        Result := clock_gettime (OSC.CLOCK_RT_Ada, TS'Unchecked_Access);
        pragma Assert (Result = 0);
!       return To_Duration (TS);
     end Monotonic_Clock;
  
     -------------------
--- 763,774 ----
     ---------------------
  
     function Monotonic_Clock return Duration is
!       TS     : aliased C_Time.timespec;
        Result : Interfaces.C.int;
     begin
        Result := clock_gettime (OSC.CLOCK_RT_Ada, TS'Unchecked_Access);
        pragma Assert (Result = 0);
!       return C_Time.To_Duration (TS);
     end Monotonic_Clock;
  
     -------------------
*************** package body System.Task_Primitives.Oper
*** 775,787 ****
     -------------------
  
     function RT_Resolution return Duration is
!       TS     : aliased timespec;
        Result : Interfaces.C.int;
     begin
        Result := clock_getres (OSC.CLOCK_REALTIME, TS'Unchecked_Access);
        pragma Assert (Result = 0);
  
!       return To_Duration (TS);
     end RT_Resolution;
  
     -----------
--- 776,788 ----
     -------------------
  
     function RT_Resolution return Duration is
!       TS     : aliased C_Time.timespec;
        Result : Interfaces.C.int;
     begin
        Result := clock_getres (OSC.CLOCK_REALTIME, TS'Unchecked_Access);
        pragma Assert (Result = 0);
  
!       return C_Time.To_Duration (TS);
     end RT_Resolution;
  
     -----------
*************** package body System.Task_Primitives.Oper
*** 1175,1181 ****
        Base_Time  : constant Duration := Monotonic_Clock;
        Check_Time : Duration := Base_Time;
        Abs_Time   : Duration;
!       Request    : aliased timespec;
        Result     : Interfaces.C.int;
  
     begin
--- 1176,1182 ----
        Base_Time  : constant Duration := Monotonic_Clock;
        Check_Time : Duration := Base_Time;
        Abs_Time   : Duration;
!       Request    : aliased C_Time.timespec;
        Result     : Interfaces.C.int;
  
     begin
*************** package body System.Task_Primitives.Oper
*** 1189,1195 ****
           else Duration'Min (Check_Time + Max_Sensible_Delay, Time));
  
        if Abs_Time > Check_Time then
!          Request := To_Timespec (Abs_Time);
           loop
              exit when Self_ID.Pending_ATC_Level < Self_ID.ATC_Nesting_Level;
  
--- 1190,1196 ----
           else Duration'Min (Check_Time + Max_Sensible_Delay, Time));
  
        if Abs_Time > Check_Time then
!          Request := C_Time.To_Timespec (Abs_Time);
           loop
              exit when Self_ID.Pending_ATC_Level < Self_ID.ATC_Nesting_Level;
  
*************** package body System.Task_Primitives.Oper
*** 1230,1236 ****
        Base_Time  : constant Duration := Monotonic_Clock;
        Check_Time : Duration := Base_Time;
        Abs_Time   : Duration;
!       Request    : aliased timespec;
        Result     : Interfaces.C.int;
        Yielded    : Boolean := False;
  
--- 1231,1237 ----
        Base_Time  : constant Duration := Monotonic_Clock;
        Check_Time : Duration := Base_Time;
        Abs_Time   : Duration;
!       Request    : aliased C_Time.timespec;
        Result     : Interfaces.C.int;
        Yielded    : Boolean := False;
  
*************** package body System.Task_Primitives.Oper
*** 1243,1249 ****
           else Duration'Min (Check_Time + Max_Sensible_Delay, Time));
  
        if Abs_Time > Check_Time then
!          Request := To_Timespec (Abs_Time);
           Self_ID.Common.State := Delay_Sleep;
  
           pragma Assert (Check_Sleep (Delay_Sleep));
--- 1244,1250 ----
           else Duration'Min (Check_Time + Max_Sensible_Delay, Time));
  
        if Abs_Time > Check_Time then
!          Request := C_Time.To_Timespec (Abs_Time);
           Self_ID.Common.State := Delay_Sleep;
  
           pragma Assert (Check_Sleep (Delay_Sleep));
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-taprop__vxworks.adb gcc-16-20250921/gcc/ada/libgnarl/s-taprop__vxworks.adb
*** gcc-16-20250914/gcc/ada/libgnarl/s-taprop__vxworks.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-taprop__vxworks.adb	Sun Sep 21 22:32:35 2025
*************** with Ada.Unchecked_Conversion;
*** 38,43 ****
--- 38,44 ----
  
  with Interfaces.C;
  
+ with System.C_Time;
  with System.Float_Control;
  with System.Interrupt_Management;
  with System.Multiprocessors;
*************** package body System.Task_Primitives.Oper
*** 681,692 ****
     ---------------------
  
     function Monotonic_Clock return Duration is
!       TS     : aliased timespec;
        Result : int;
     begin
        Result := clock_gettime (OSC.CLOCK_RT_Ada, TS'Unchecked_Access);
        pragma Assert (Result = 0);
!       return To_Duration (TS);
     end Monotonic_Clock;
  
     -------------------
--- 682,693 ----
     ---------------------
  
     function Monotonic_Clock return Duration is
!       TS     : aliased C_Time.timespec;
        Result : int;
     begin
        Result := clock_gettime (OSC.CLOCK_RT_Ada, TS'Unchecked_Access);
        pragma Assert (Result = 0);
!       return C_Time.To_Duration (TS);
     end Monotonic_Clock;
  
     -------------------
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnarl/s-tpopmo.adb gcc-16-20250921/gcc/ada/libgnarl/s-tpopmo.adb
*** gcc-16-20250914/gcc/ada/libgnarl/s-tpopmo.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnarl/s-tpopmo.adb	Sun Sep 21 22:32:35 2025
***************
*** 31,36 ****
--- 31,38 ----
  
  --  This is the Monotonic version of this package for Posix and Linux targets.
  
+ with System.C_Time;
+ 
  separate (System.Task_Primitives.Operations)
  package body Monotonic is
  
*************** package body Monotonic is
*** 54,67 ****
     ---------------------
  
     function Monotonic_Clock return Duration is
!       TS     : aliased timespec;
        Result : Interfaces.C.int;
     begin
        Result := clock_gettime
          (clock_id => OSC.CLOCK_RT_Ada, tp => TS'Unchecked_Access);
        pragma Assert (Result = 0);
  
!       return To_Duration (TS);
     end Monotonic_Clock;
  
     -------------------
--- 56,69 ----
     ---------------------
  
     function Monotonic_Clock return Duration is
!       TS     : aliased C_Time.timespec;
        Result : Interfaces.C.int;
     begin
        Result := clock_gettime
          (clock_id => OSC.CLOCK_RT_Ada, tp => TS'Unchecked_Access);
        pragma Assert (Result = 0);
  
!       return C_Time.To_Duration (TS);
     end Monotonic_Clock;
  
     -------------------
*************** package body Monotonic is
*** 69,82 ****
     -------------------
  
     function RT_Resolution return Duration is
!       TS     : aliased timespec;
        Result : Interfaces.C.int;
  
     begin
        Result := clock_getres (OSC.CLOCK_REALTIME, TS'Unchecked_Access);
        pragma Assert (Result = 0);
  
!       return To_Duration (TS);
     end RT_Resolution;
  
     ----------------------
--- 71,84 ----
     -------------------
  
     function RT_Resolution return Duration is
!       TS     : aliased C_Time.timespec;
        Result : Interfaces.C.int;
  
     begin
        Result := clock_getres (OSC.CLOCK_REALTIME, TS'Unchecked_Access);
        pragma Assert (Result = 0);
  
!       return C_Time.To_Duration (TS);
     end RT_Resolution;
  
     ----------------------
*************** package body Monotonic is
*** 150,156 ****
        Abs_Time   : Duration;
        P_Abs_Time : Duration;
  
!       Request    : aliased timespec;
        Result     : Interfaces.C.int;
        Exit_Outer : Boolean := False;
  
--- 152,158 ----
        Abs_Time   : Duration;
        P_Abs_Time : Duration;
  
!       Request    : aliased C_Time.timespec;
        Result     : Interfaces.C.int;
        Exit_Outer : Boolean := False;
  
*************** package body Monotonic is
*** 184,190 ****
              end if;
              pragma Warnings (On);
  
!             Request := To_Timespec (P_Abs_Time);
  
              Inner : loop
                 exit Outer
--- 186,192 ----
              end if;
              pragma Warnings (On);
  
!             Request := C_Time.To_Timespec (P_Abs_Time);
  
              Inner : loop
                 exit Outer
*************** package body Monotonic is
*** 236,242 ****
        Check_Time : Duration;
        Abs_Time   : Duration;
        P_Abs_Time : Duration;
!       Request    : aliased timespec;
  
        Result     : Interfaces.C.int;
        Exit_Outer : Boolean := False;
--- 238,244 ----
        Check_Time : Duration;
        Abs_Time   : Duration;
        P_Abs_Time : Duration;
!       Request    : aliased C_Time.timespec;
  
        Result     : Interfaces.C.int;
        Exit_Outer : Boolean := False;
*************** package body Monotonic is
*** 271,277 ****
              end if;
              pragma Warnings (On);
  
!             Request := To_Timespec (P_Abs_Time);
  
              Inner : loop
                 exit Outer
--- 273,279 ----
              end if;
              pragma Warnings (On);
  
!             Request := C_Time.To_Timespec (P_Abs_Time);
  
              Inner : loop
                 exit Outer
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/a-swunau.adb gcc-16-20250921/gcc/ada/libgnat/a-swunau.adb
*** gcc-16-20250914/gcc/ada/libgnat/a-swunau.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnat/a-swunau.adb	Sun Sep 21 22:32:35 2025
*************** package body Ada.Strings.Wide_Unbounded.
*** 62,65 ****
--- 62,78 ----
        UP.Last := UP.Reference'Length;
     end Set_Wide_String;
  
+    procedure Set_Wide_String
+      (U      : out Unbounded_Wide_String;
+       Length : Positive;
+       Set    : not null access procedure (S : out Wide_String))
+    is
+       Old : Wide_String_Access := U.Reference;
+    begin
+       U.Last := Length;
+       U.Reference := new Wide_String (1 .. Length);
+       Set (U.Reference.all);
+       Free (Old);
+    end Set_Wide_String;
+ 
  end Ada.Strings.Wide_Unbounded.Aux;
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/a-swunau.ads gcc-16-20250921/gcc/ada/libgnat/a-swunau.ads
*** gcc-16-20250914/gcc/ada/libgnat/a-swunau.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnat/a-swunau.ads	Sun Sep 21 22:32:35 2025
*************** package Ada.Strings.Wide_Unbounded.Aux i
*** 73,76 ****
--- 73,84 ----
     --  than string. The lower bound of the string value is required to be one,
     --  and this requirement is not checked.
  
+    procedure Set_Wide_String
+      (U      : out Unbounded_Wide_String;
+       Length : Positive;
+       Set    : not null access procedure (S : out Wide_String));
+    pragma Inline (Set_Wide_String);
+    --  Create an unbounded string U with the given Length, using Set to fill
+    --  the contents of U.
+ 
  end Ada.Strings.Wide_Unbounded.Aux;
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/a-swunau__shared.adb gcc-16-20250921/gcc/ada/libgnat/a-swunau__shared.adb
*** gcc-16-20250914/gcc/ada/libgnat/a-swunau__shared.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnat/a-swunau__shared.adb	Sun Sep 21 22:32:35 2025
*************** package body Ada.Strings.Wide_Unbounded.
*** 62,65 ****
--- 62,91 ----
        Free (X);
     end Set_Wide_String;
  
+    procedure Set_Wide_String
+      (U      : out Unbounded_Wide_String;
+       Length : Positive;
+       Set    : not null access procedure (S : out Wide_String))
+    is
+       TR : constant Shared_Wide_String_Access := U.Reference;
+       DR : Shared_Wide_String_Access;
+    begin
+       --  Try to reuse existing shared string
+ 
+       if Can_Be_Reused (TR, Length) then
+          Reference (TR);
+          DR := TR;
+ 
+       --  Otherwise allocate new shared string
+ 
+       else
+          DR := Allocate (Length);
+          U.Reference := DR;
+       end if;
+ 
+       Set (DR.Data (1 .. Length));
+       DR.Last := Length;
+       Unreference (TR);
+    end Set_Wide_String;
+ 
  end Ada.Strings.Wide_Unbounded.Aux;
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/a-szunau.adb gcc-16-20250921/gcc/ada/libgnat/a-szunau.adb
*** gcc-16-20250914/gcc/ada/libgnat/a-szunau.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnat/a-szunau.adb	Sun Sep 21 22:32:35 2025
*************** package body Ada.Strings.Wide_Wide_Unbou
*** 62,65 ****
--- 62,78 ----
        UP.Last := UP.Reference'Length;
     end Set_Wide_Wide_String;
  
+    procedure Set_Wide_Wide_String
+      (U      : out Unbounded_Wide_Wide_String;
+       Length : Positive;
+       Set    : not null access procedure (S : out Wide_Wide_String))
+    is
+       Old : Wide_Wide_String_Access := U.Reference;
+    begin
+       U.Last := Length;
+       U.Reference := new Wide_Wide_String (1 .. Length);
+       Set (U.Reference.all);
+       Free (Old);
+    end Set_Wide_Wide_String;
+ 
  end Ada.Strings.Wide_Wide_Unbounded.Aux;
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/a-szunau.ads gcc-16-20250921/gcc/ada/libgnat/a-szunau.ads
*** gcc-16-20250914/gcc/ada/libgnat/a-szunau.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnat/a-szunau.ads	Sun Sep 21 22:32:35 2025
*************** package Ada.Strings.Wide_Wide_Unbounded.
*** 75,78 ****
--- 75,86 ----
     --  than string. The lower bound of the string value is required to be one,
     --  and this requirement is not checked.
  
+    procedure Set_Wide_Wide_String
+      (U      : out Unbounded_Wide_Wide_String;
+       Length : Positive;
+       Set    : not null access procedure (S : out Wide_Wide_String));
+    pragma Inline (Set_Wide_Wide_String);
+    --  Create an unbounded string U with the given Length, using Set to fill
+    --  the contents of U.
+ 
  end Ada.Strings.Wide_Wide_Unbounded.Aux;
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/a-szunau__shared.adb gcc-16-20250921/gcc/ada/libgnat/a-szunau__shared.adb
*** gcc-16-20250914/gcc/ada/libgnat/a-szunau__shared.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnat/a-szunau__shared.adb	Sun Sep 21 22:32:35 2025
*************** package body Ada.Strings.Wide_Wide_Unbou
*** 62,65 ****
--- 62,91 ----
        Free (X);
     end Set_Wide_Wide_String;
  
+    procedure Set_Wide_Wide_String
+      (U      : out Unbounded_Wide_Wide_String;
+       Length : Positive;
+       Set    : not null access procedure (S : out Wide_Wide_String))
+    is
+       TR : constant Shared_Wide_Wide_String_Access := U.Reference;
+       DR : Shared_Wide_Wide_String_Access;
+    begin
+       --  Try to reuse existing shared string
+ 
+       if Can_Be_Reused (TR, Length) then
+          Reference (TR);
+          DR := TR;
+ 
+       --  Otherwise allocate new shared string
+ 
+       else
+          DR := Allocate (Length);
+          U.Reference := DR;
+       end if;
+ 
+       Set (DR.Data (1 .. Length));
+       DR.Last := Length;
+       Unreference (TR);
+    end Set_Wide_Wide_String;
+ 
  end Ada.Strings.Wide_Wide_Unbounded.Aux;
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/g-c_time.ads gcc-16-20250921/gcc/ada/libgnat/g-c_time.ads
*** gcc-16-20250914/gcc/ada/libgnat/g-c_time.ads	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/ada/libgnat/g-c_time.ads	Sun Sep 21 22:32:35 2025
***************
*** 0 ****
--- 1,38 ----
+ ------------------------------------------------------------------------------
+ --                                                                          --
+ --                         GNAT RUN-TIME COMPONENTS                         --
+ --                                                                          --
+ --                           G N A T . C _ T I M E                          --
+ --                                                                          --
+ --                                 S p e c                                  --
+ --                                                                          --
+ --                       Copyright (C) 2025, AdaCore                        --
+ --                                                                          --
+ -- GNAT is free software;  you can  redistribute it  and/or modify it under --
+ -- terms of the  GNU General Public License as published  by the Free Soft- --
+ -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
+ -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
+ -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
+ -- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
+ --                                                                          --
+ -- As a special exception 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/>.                                          --
+ --                                                                          --
+ -- GNAT was originally developed  by the GNAT team at  New York University. --
+ -- Extensive contributions were provided by Ada Core Technologies Inc.      --
+ --                                                                          --
+ ------------------------------------------------------------------------------
+ 
+ --  This package provides the time_t, timeval and timespec types corresponding
+ --  to the C types defined by the OS, as well as various conversion functions.
+ 
+ --  See file s-c_time.ads for full documentation of the interface
+ 
+ with System.C_Time;
+ package GNAT.C_Time renames System.C_Time;
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/g-calend.adb gcc-16-20250921/gcc/ada/libgnat/g-calend.adb
*** gcc-16-20250914/gcc/ada/libgnat/g-calend.adb	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnat/g-calend.adb	Sun Sep 21 22:32:35 2025
***************
*** 29,39 ****
  --                                                                          --
  ------------------------------------------------------------------------------
  
- with Interfaces.C.Extensions;
- 
  package body GNAT.Calendar is
     use Ada.Calendar;
-    use Interfaces;
  
     -----------------
     -- Day_In_Year --
--- 29,36 ----
*************** package body GNAT.Calendar is
*** 333,357 ****
     -----------------
  
     function To_Duration (T : not null access timeval) return Duration is
- 
-       procedure timeval_to_duration
-         (T    : not null access timeval;
-          sec  : not null access C.Extensions.long_long;
-          usec : not null access C.long);
-       pragma Import (C, timeval_to_duration, "__gnat_timeval_to_duration");
- 
-       Micro : constant := 10**6;
-       sec   : aliased C.Extensions.long_long;
-       usec  : aliased C.long;
- 
-       pragma Unsuppress (Overflow_Check);
- 
     begin
!       timeval_to_duration (T, sec'Access, usec'Access);
!       pragma Annotate (CodePeer, Modified, sec);
!       pragma Annotate (CodePeer, Modified, usec);
! 
!       return Duration (sec) + Duration (usec) / Micro;
     end To_Duration;
  
     ----------------
--- 330,337 ----
     -----------------
  
     function To_Duration (T : not null access timeval) return Duration is
     begin
!       return System.C_Time.To_Duration (T.all);
     end To_Duration;
  
     ----------------
*************** package body GNAT.Calendar is
*** 359,403 ****
     ----------------
  
     function To_Timeval (D : Duration) return timeval is
- 
-       procedure duration_to_timeval
-         (Sec  : C.Extensions.long_long;
-          Usec : C.long;
-          T : not null access timeval);
-       pragma Import (C, duration_to_timeval, "__gnat_duration_to_timeval");
- 
-       Micro  : constant := 10**6;
-       Result : aliased timeval;
-       sec    : C.Extensions.long_long;
-       usec   : C.long;
- 
-       pragma Unsuppress (Overflow_Check);
- 
     begin
!       if D = 0.0 then
!          sec  := 0;
!          usec := 0;
! 
!       elsif D < 0.0 then
!          sec := C.Extensions.long_long (D + 0.5);
!          if D = Duration (sec) then
!             usec := 0;
!          else
!             usec := C.long ((D - Duration (sec)) * Micro + 0.5);
!          end if;
! 
!       else
!          sec := C.Extensions.long_long (D - 0.5);
!          if D = Duration (sec) then
!             usec := 0;
!          else
!             usec := C.long ((D - Duration (sec)) * Micro - 0.5);
!          end if;
!       end if;
! 
!       duration_to_timeval (sec, usec, Result'Access);
! 
!       return Result;
     end To_Timeval;
  
     ------------------
--- 339,346 ----
     ----------------
  
     function To_Timeval (D : Duration) return timeval is
     begin
!       return System.C_Time.To_Timeval (D);
     end To_Timeval;
  
     ------------------
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/g-calend.ads gcc-16-20250921/gcc/ada/libgnat/g-calend.ads
*** gcc-16-20250914/gcc/ada/libgnat/g-calend.ads	Sun Sep 14 22:32:07 2025
--- gcc-16-20250921/gcc/ada/libgnat/g-calend.ads	Sun Sep 21 22:32:35 2025
***************
*** 40,46 ****
  --  Day_Of_Week, Day_In_Year and Week_In_Year.
  
  with Ada.Calendar.Formatting;
! with Interfaces.C;
  
  package GNAT.Calendar is
  
--- 40,47 ----
  --  Day_Of_Week, Day_In_Year and Week_In_Year.
  
  with Ada.Calendar.Formatting;
! 
! with System.C_Time;
  
  package GNAT.Calendar is
  
*************** package GNAT.Calendar is
*** 126,132 ****
     --  locale (equivalent to Clock). Due to this simplified behavior, the
     --  implementation does not require expensive system calls on targets such
     --  as Windows.
!    --  WARNING: Split_At_Locale is no longer aware of historic events and may
     --  produce inaccurate results over DST changes which occurred in the past.
  
     function Week_In_Year (Date : Ada.Calendar.Time) return Week_In_Year_Number;
--- 127,133 ----
     --  locale (equivalent to Clock). Due to this simplified behavior, the
     --  implementation does not require expensive system calls on targets such
     --  as Windows.
!    --  WARNING: Time_At_Locale is no longer aware of historic events and may
     --  produce inaccurate results over DST changes which occurred in the past.
  
     function Week_In_Year (Date : Ada.Calendar.Time) return Week_In_Year_Number;
*************** package GNAT.Calendar is
*** 145,168 ****
     --  Return the week number as defined in ISO 8601 along with the year in
     --  which the week occurs.
  
!    --  C timeval conversion
! 
!    --  C timeval represent a duration (used in Select for example). This
!    --  structure is composed of a number of seconds and a number of micro
!    --  seconds. The timeval structure is not exposed here because its
!    --  definition is target dependent. Interface to C programs is done via a
!    --  pointer to timeval structure.
! 
!    type timeval is private;
  
     function To_Duration (T : not null access timeval) return Duration;
     function To_Timeval  (D : Duration) return timeval;
  
  private
-    --  This is a dummy declaration that should be the largest possible timeval
-    --  structure of all supported targets.
- 
-    type timeval is array (1 .. 3) of Interfaces.C.long;
  
     function Julian_Day
       (Year  : Ada.Calendar.Year_Number;
--- 146,163 ----
     --  Return the week number as defined in ISO 8601 along with the year in
     --  which the week occurs.
  
!    subtype timeval is System.C_Time.timeval;
!    pragma Obsolescent (timeval, "use type from GNAT.C_Time instead");
  
     function To_Duration (T : not null access timeval) return Duration;
+    pragma Inline (To_Duration);
+    pragma Obsolescent (To_Duration, "use function from GNAT.C_Time instead");
+ 
     function To_Timeval  (D : Duration) return timeval;
+    pragma Inline (To_Timeval);
+    pragma Obsolescent (To_Timeval, "use function from GNAT.C_Time instead");
  
  private
  
     function Julian_Day
       (Year  : Ada.Calendar.Year_Number;
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/g-socket.adb gcc-16-20250921/gcc/ada/libgnat/g-socket.adb
*** gcc-16-20250914/gcc/ada/libgnat/g-socket.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/g-socket.adb	Sun Sep 21 22:32:35 2025
*************** with GNAT.Sockets.Poll;
*** 47,52 ****
--- 47,53 ----
  with System;               use System;
  with System.Communication; use System.Communication;
  with System.CRTL;          use System.CRTL;
+ with System.C_Time;
  with System.Task_Lock;
  
  package body GNAT.Sockets is
*************** package body GNAT.Sockets is
*** 179,191 ****
     function Value (S : System.Address) return String;
     --  Same as Interfaces.C.Strings.Value but taking a System.Address
  
-    function To_Timeval (Val : Timeval_Duration) return Timeval;
-    --  Separate Val in seconds and microseconds
- 
-    function To_Duration (Val : Timeval) return Timeval_Duration;
-    --  Reconstruct a Duration value from a Timeval record (seconds and
-    --  microseconds).
- 
     function Dedot (Value : String) return String
     is (if Value /= "" and then Value (Value'Last) = '.'
         then Value (Value'First .. Value'Last - 1)
--- 180,185 ----
*************** package body GNAT.Sockets is
*** 528,534 ****
        Res  : C.int;
        Last : C.int;
        RSig : Socket_Type := No_Socket;
!       TVal : aliased Timeval;
        TPtr : Timeval_Access;
  
     begin
--- 522,528 ----
        Res  : C.int;
        Last : C.int;
        RSig : Socket_Type := No_Socket;
!       TVal : aliased System.C_Time.timeval;
        TPtr : Timeval_Access;
  
     begin
*************** package body GNAT.Sockets is
*** 543,549 ****
        if Timeout = Forever then
           TPtr := null;
        else
!          TVal := To_Timeval (Timeout);
           TPtr := TVal'Unchecked_Access;
        end if;
  
--- 537,543 ----
        if Timeout = Forever then
           TPtr := null;
        else
!          TVal := System.C_Time.To_Timeval (Timeout);
           TPtr := TVal'Unchecked_Access;
        end if;
  
*************** package body GNAT.Sockets is
*** 1423,1429 ****
        U4  : aliased C.unsigned;
        V1  : aliased C.unsigned_char;
        VS  : aliased C.char_array (1 .. NS); -- for devices name
!       VT  : aliased Timeval;
        Len : aliased C.int;
        Add : System.Address;
        Res : C.int;
--- 1417,1423 ----
        U4  : aliased C.unsigned;
        V1  : aliased C.unsigned_char;
        VS  : aliased C.char_array (1 .. NS); -- for devices name
!       VT  : aliased System.C_Time.timeval;
        Len : aliased C.int;
        Add : System.Address;
        Res : C.int;
*************** package body GNAT.Sockets is
*** 1596,1603 ****
                    Opt.Timeout := Duration (U4) / 1000;
                 end if;
  
              else
!                Opt.Timeout := To_Duration (VT);
              end if;
  
           when Bind_To_Device =>
--- 1590,1599 ----
                    Opt.Timeout := Duration (U4) / 1000;
                 end if;
  
+             elsif System.C_Time.In_Timeval_Duration (VT) then
+                Opt.Timeout := System.C_Time.To_Duration (VT);
              else
!                Opt.Timeout := Forever;
              end if;
  
           when Bind_To_Device =>
*************** package body GNAT.Sockets is
*** 2633,2639 ****
                (1 .. (if Option.Name = Bind_To_Device
                       then C.size_t (ASU.Length (Option.Device) + 1)
                       else 0));
!       VT  : aliased Timeval;
        Len : C.int;
        Add : System.Address := Null_Address;
        Res : C.int;
--- 2629,2635 ----
                (1 .. (if Option.Name = Bind_To_Device
                       then C.size_t (ASU.Length (Option.Device) + 1)
                       else 0));
!       VT  : aliased System.C_Time.timeval;
        Len : C.int;
        Add : System.Address := Null_Address;
        Res : C.int;
*************** package body GNAT.Sockets is
*** 2767,2773 ****
                 end if;
  
              else
!                VT  := To_Timeval (Option.Timeout);
                 Len := VT'Size / 8;
                 Add := VT'Address;
              end if;
--- 2763,2769 ----
                 end if;
  
              else
!                VT  := System.C_Time.To_Timeval (Option.Timeout);
                 Len := VT'Size / 8;
                 Add := VT'Address;
              end if;
*************** package body GNAT.Sockets is
*** 2865,2897 ****
        return Integer (Socket);
     end To_C;
  
-    -----------------
-    -- To_Duration --
-    -----------------
- 
-    function To_Duration (Val : Timeval) return Timeval_Duration is
-       Max_D : constant Long_Long_Integer := Long_Long_Integer (Forever - 0.5);
-       Tv_sec_64 : constant Boolean := SOSC.SIZEOF_tv_sec = 8;
-       --  Need to separate this condition into the constant declaration to
-       --  avoid GNAT warning about "always true" or "always false".
-    begin
-       if Tv_sec_64 then
-          --  Check for possible Duration overflow when Tv_Sec field is 64 bit
-          --  integer.
- 
-          if Val.Tv_Sec > time_t (Max_D)
-              or else
-            (Val.Tv_Sec = time_t (Max_D)
-               and then
-             Val.Tv_Usec > suseconds_t ((Forever - Duration (Max_D)) * 1E6))
-          then
-             return Forever;
-          end if;
-       end if;
- 
-       return Duration (Val.Tv_Sec) + Duration (Val.Tv_Usec) * 1.0E-6;
-    end To_Duration;
- 
     -------------------
     -- To_Host_Entry --
     -------------------
--- 2861,2866 ----
*************** package body GNAT.Sockets is
*** 3041,3075 ****
        return HN.Name (1 .. HN.Length);
     end To_String;
  
-    ----------------
-    -- To_Timeval --
-    ----------------
- 
-    function To_Timeval (Val : Timeval_Duration) return Timeval is
-       S  : time_t;
-       uS : suseconds_t;
- 
-    begin
-       --  If zero, set result as zero (otherwise it gets rounded down to -1)
- 
-       if Val = 0.0 then
-          S  := 0;
-          uS := 0;
- 
-       --  Normal case where we do round down
- 
-       else
-          S := time_t (Val - 0.5);
-          if Val = Timeval_Duration (S) then
-             uS := 0;
-          else
-             uS := suseconds_t ((Val - Timeval_Duration (S)) * 1_000_000 - 0.5);
-          end if;
-       end if;
- 
-       return (S, uS);
-    end To_Timeval;
- 
     -----------
     -- Value --
     -----------
--- 3010,3015 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/g-socthi.adb gcc-16-20250921/gcc/ada/libgnat/g-socthi.adb
*** gcc-16-20250914/gcc/ada/libgnat/g-socthi.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/g-socthi.adb	Sun Sep 21 22:32:35 2025
*************** with GNAT.Task_Lock;
*** 40,45 ****
--- 40,47 ----
  
  with Interfaces.C; use Interfaces.C;
  
+ with System.C_Time;
+ 
  package body GNAT.Sockets.Thin is
  
     Non_Blocking_Sockets : aliased Fd_Set;
*************** package body GNAT.Sockets.Thin is
*** 215,221 ****
        declare -- unreachable if Thread_Blocking_IO is statically True
           pragma Warnings (On, "unreachable code");
           WSet : aliased Fd_Set;
!          Now  : aliased Timeval;
  
        begin
           Reset_Socket_Set (WSet'Access);
--- 217,223 ----
        declare -- unreachable if Thread_Blocking_IO is statically True
           pragma Warnings (On, "unreachable code");
           WSet : aliased Fd_Set;
!          Now  : aliased System.C_Time.timeval;
  
        begin
           Reset_Socket_Set (WSet'Access);
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/g-socthi__vxworks.adb gcc-16-20250921/gcc/ada/libgnat/g-socthi__vxworks.adb
*** gcc-16-20250914/gcc/ada/libgnat/g-socthi__vxworks.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/g-socthi__vxworks.adb	Sun Sep 21 22:32:35 2025
*************** with GNAT.Task_Lock;
*** 40,45 ****
--- 40,47 ----
  
  with Interfaces.C; use Interfaces.C;
  
+ with System.C_Time;
+ 
  package body GNAT.Sockets.Thin is
  
     Non_Blocking_Sockets : aliased Fd_Set;
*************** package body GNAT.Sockets.Thin is
*** 194,200 ****
        declare -- unreachable if Thread_Blocking_IO is statically True
           pragma Warnings (On, "unreachable code");
           WSet : aliased Fd_Set;
!          Now  : aliased Timeval;
        begin
           Reset_Socket_Set (WSet'Access);
           loop
--- 196,202 ----
        declare -- unreachable if Thread_Blocking_IO is statically True
           pragma Warnings (On, "unreachable code");
           WSet : aliased Fd_Set;
!          Now  : aliased System.C_Time.timeval;
        begin
           Reset_Socket_Set (WSet'Access);
           loop
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/g-sothco.ads gcc-16-20250921/gcc/ada/libgnat/g-sothco.ads
*** gcc-16-20250914/gcc/ada/libgnat/g-sothco.ads	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/g-sothco.ads	Sun Sep 21 22:32:35 2025
***************
*** 33,40 ****
  --  This package should not be directly with'ed by an applications program.
  
  with Ada.Unchecked_Conversion;
  with Interfaces.C.Strings;
! with System.Parameters;
  
  package GNAT.Sockets.Thin_Common is
  
--- 33,42 ----
  --  This package should not be directly with'ed by an applications program.
  
  with Ada.Unchecked_Conversion;
+ 
  with Interfaces.C.Strings;
! 
! with System.C_Time;
  
  package GNAT.Sockets.Thin_Common is
  
*************** package GNAT.Sockets.Thin_Common is
*** 44,74 ****
     Success : constant C.int :=  0;
     Failure : constant C.int := -1;
  
!    type time_t is
!      range -2 ** (System.Parameters.time_t_bits - 1)
!         .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
!    for time_t'Size use System.Parameters.time_t_bits;
!    pragma Convention (C, time_t);
  
!    type suseconds_t is
!      range -2 ** (8 * SOSC.SIZEOF_tv_usec - 1)
!          .. 2 ** (8 * SOSC.SIZEOF_tv_usec - 1) - 1;
!    for suseconds_t'Size use 8 * SOSC.SIZEOF_tv_usec;
!    pragma Convention (C, suseconds_t);
  
!    type Timeval is record
!       Tv_Sec  : time_t;
!       Tv_Usec : suseconds_t;
!    end record;
!    pragma Convention (C, Timeval);
  
!    type Timeval_Access is access all Timeval;
     pragma Convention (C, Timeval_Access);
  
     type socklen_t is mod 2 ** (8 * SOSC.SIZEOF_socklen_t);
     for socklen_t'Size use (8 * SOSC.SIZEOF_socklen_t);
  
!    Immediat : constant Timeval := (0, 0);
  
     -------------------------------------------
     -- Mapping tables to low level constants --
--- 46,68 ----
     Success : constant C.int :=  0;
     Failure : constant C.int := -1;
  
!    subtype time_t is System.C_Time.time_t;
!    pragma Obsolescent (time_t, "use type from GNAT.C_Time instead");
  
!    subtype suseconds_t is System.C_Time.usec_t;
!    pragma Obsolescent (suseconds_t, "use type from GNAT.C_Time instead");
  
!    subtype timeval is System.C_Time.timeval;
!    pragma Obsolescent (timeval, "use type from GNAT.C_Time instead");
  
!    type Timeval_Access is access all System.C_Time.timeval;
     pragma Convention (C, Timeval_Access);
  
     type socklen_t is mod 2 ** (8 * SOSC.SIZEOF_socklen_t);
     for socklen_t'Size use (8 * SOSC.SIZEOF_socklen_t);
  
!    Immediat : constant System.C_Time.timeval
!      := System.C_Time.Milliseconds_To_Timeval (0);
  
     -------------------------------------------
     -- Mapping tables to low level constants --
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/g-spogwa.adb gcc-16-20250921/gcc/ada/libgnat/g-spogwa.adb
*** gcc-16-20250914/gcc/ada/libgnat/g-spogwa.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/g-spogwa.adb	Sun Sep 21 22:32:35 2025
***************
*** 29,35 ****
  --                                                                          --
  ------------------------------------------------------------------------------
  
! with GNAT.Sockets.Thin_Common;
  
  procedure GNAT.Sockets.Poll.G_Wait
    (Fds : in out Set; Timeout : Interfaces.C.int; Result : out Integer)
--- 29,35 ----
  --                                                                          --
  ------------------------------------------------------------------------------
  
! with System.C_Time;
  
  procedure GNAT.Sockets.Poll.G_Wait
    (Fds : in out Set; Timeout : Interfaces.C.int; Result : out Integer)
*************** is
*** 41,51 ****
        readfds   : access FD_Set_Type;
        writefds  : access FD_Set_Type;
        exceptfds : access FD_Set_Type;
!       timeout   : access Thin_Common.Timeval) return Integer
       with Import => True, Convention => Stdcall, External_Name => "select";
  
!    Timeout_V : aliased Thin_Common.Timeval;
!    Timeout_A : access Thin_Common.Timeval;
  
     Rfds      : aliased FD_Set_Type;
     Rcount    : Natural := 0;
--- 41,51 ----
        readfds   : access FD_Set_Type;
        writefds  : access FD_Set_Type;
        exceptfds : access FD_Set_Type;
!       timeout   : access System.C_Time.timeval) return Integer
       with Import => True, Convention => Stdcall, External_Name => "select";
  
!    Timeout_V : aliased System.C_Time.timeval;
!    Timeout_A : access System.C_Time.timeval;
  
     Rfds      : aliased FD_Set_Type;
     Rcount    : Natural := 0;
*************** begin
*** 63,70 ****
  
     if Timeout >= 0 then
        Timeout_A := Timeout_V'Access;
!       Timeout_V.Tv_Sec  := Thin_Common.time_t  (Timeout / 1000);
!       Timeout_V.Tv_Usec := Thin_Common.suseconds_t (Timeout rem 1000 * 1000);
     end if;
  
     Reset_Socket_Set (Rfds);
--- 63,69 ----
  
     if Timeout >= 0 then
        Timeout_A := Timeout_V'Access;
!       Timeout_V := System.C_Time.Milliseconds_To_Timeval (Timeout);
     end if;
  
     Reset_Socket_Set (Rfds);
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/s-c_time.adb gcc-16-20250921/gcc/ada/libgnat/s-c_time.adb
*** gcc-16-20250914/gcc/ada/libgnat/s-c_time.adb	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/ada/libgnat/s-c_time.adb	Sun Sep 21 22:32:35 2025
***************
*** 0 ****
--- 1,203 ----
+ ------------------------------------------------------------------------------
+ --                                                                          --
+ --                         GNAT RUN-TIME COMPONENTS                         --
+ --                                                                          --
+ --                         S Y S T E M . C _ T I M E                        --
+ --                                                                          --
+ --                                  B o d y                                 --
+ --                                                                          --
+ --             Copyright (C) 2025, Free Software Foundation, Inc.           --
+ --                                                                          --
+ -- GNAT is free software; you can  redistribute it  and/or modify it under --
+ -- terms of the  GNU General Public License as published  by the Free Soft- --
+ -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
+ -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
+ -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
+ -- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
+ --                                                                          --
+ -- As a special exception 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/>.                                          --
+ --                                                                          --
+ -- GNAT was originally developed  by the GNAT team at  New York University. --
+ -- Extensive contributions were provided by Ada Core Technologies, Inc.     --
+ --                                                                          --
+ ------------------------------------------------------------------------------
+ 
+ package body System.C_Time is
+ 
+    --  Two Duration representations are described in targparm.ads:
+    --   Size      Small       Last = (2**(Size - 1) - 1) * Small
+    --    32    0.02                   42_949_672.94
+    --    64    0.000_000_001       9_223_372_036.854_775_807
+ 
+    Recip : constant := (if Duration'Size = 32 then 50 else 1_000_000_000);
+    --  The reciprocal of the Small used to write "* Small" as "/ Recip"
+ 
+    Milli : constant := 1_000;
+    Micro : constant := 1_000_000;
+    Nano  : constant := 1_000_000_000;
+    --  The standard divisors
+ 
+    pragma Unsuppress (Overflow_Check);
+    --  Overflow may occur during the various conversions
+ 
+    -------------------------
+    -- In_Timeval_Duration --
+    -------------------------
+ 
+    --  Immediate : constant Duration := 0.0;
+ 
+    --  Forever   : constant Duration :=
+    --    Duration'Min (Duration'Last, 1.0 * OS_Constants.MAX_tv_sec);
+ 
+    --  subtype Timeval_Duration is Duration range Immediate .. Forever;
+ 
+    function In_Timeval_Duration (T : timeval) return Boolean is
+       Max_Dur  : constant := 2**(Duration'Size - 1) - 1;
+       Max_Sec  : constant := Max_Dur / Recip;
+       Max_Usec : constant := (Max_Dur mod Recip) * Micro / Recip;
+ 
+       --  When Duration'Size = 64 and time_t'Size = 32, the compiler
+       --  complains that Max_Sec does not fit in time_t, hence cannot
+       --  be compared with T.tv_sec.
+       Safe_Max_Sec : constant :=
+         (if Max_Sec > time_t'Last then time_t'Last else Max_Sec);
+       Safe_Max_Usec : constant :=
+         (if Max_Sec > time_t'Last then usec_t'Last else Max_Usec);
+ 
+    begin
+       pragma Warnings (Off, "condition is always");
+       return T.tv_sec >= 0
+         and then (T.tv_sec > 0 or else T.tv_usec >= 0)
+         and then T.tv_sec <= Safe_Max_Sec
+         and then (T.tv_sec < Safe_Max_Sec or else T.tv_usec <= Safe_Max_Usec)
+         and then T.tv_sec <= OS_Constants.MAX_tv_sec
+         and then (T.tv_sec < OS_Constants.MAX_tv_sec or else T.tv_usec = 0);
+       pragma Warnings (On, "condition is always");
+    end In_Timeval_Duration;
+ 
+    -----------------------------
+    -- Milliseconds_To_Timeval --
+    -----------------------------
+ 
+    function Milliseconds_To_Timeval (M : Interfaces.C.int) return timeval is
+       use Interfaces.C;
+       Q : constant int := M  /  Milli;
+       R : constant int := M rem Milli;
+ 
+    begin
+       return (tv_sec => time_t (Q), tv_usec => usec_t (R) * (Micro / Milli));
+    end Milliseconds_To_Timeval;
+ 
+    -----------------------------
+    -- Nanoseconds_To_Timespec --
+    -----------------------------
+ 
+    function Nanoseconds_To_Timespec (N : Interfaces.C.int) return timespec is
+       use Interfaces.C;
+       Q : constant int := N  /  Nano;
+       R : constant int := N rem Nano;
+ 
+    begin
+       return (tv_sec => time_t (Q), tv_nsec => nsec_t (R));
+    end Nanoseconds_To_Timespec;
+ 
+    -----------------
+    -- To_Duration --
+    -----------------
+ 
+    --  Duration (tv_usec) is OK even when Duration'Size = 32, see above
+ 
+    function To_Duration (T : timeval) return Duration is
+    begin
+       return Duration (T.tv_sec) + Duration (T.tv_usec) / Micro;
+    end To_Duration;
+ 
+    --  Duration (tv_nsec) overflows when Duration'Size = 32, see above.
+    --  Scale down nanoseconds by the value of the Small in nanoseconds.
+ 
+    function To_Duration (T : timespec) return Duration is
+       S : constant := Nano / Recip;
+ 
+    begin
+       return Duration (T.tv_sec) + Duration (T.tv_nsec / S) / (Nano / S);
+    end To_Duration;
+ 
+    -----------------
+    -- To_Timespec --
+    -----------------
+ 
+    function To_Timespec (T : timeval) return timespec is
+    begin
+       return (tv_sec => T.tv_sec, tv_nsec => nsec_t (T.tv_usec) * Milli);
+    end To_Timespec;
+ 
+    function To_Timespec (D : Duration) return timespec is
+       tv_sec  : time_t;
+       tv_nsec : nsec_t;
+ 
+    begin
+       if D = 0.0 then
+          tv_sec  := 0;
+          tv_nsec := 0;
+ 
+       elsif D < 0.0 then
+          tv_sec := time_t (D + 0.5);
+          if D = Duration (tv_sec) then
+             tv_nsec := 0;
+          else
+             tv_nsec := nsec_t ((D - Duration (tv_sec)) * Nano + 0.5);
+          end if;
+ 
+       else
+          tv_sec := time_t (D - 0.5);
+          if D = Duration (tv_sec) then
+             tv_nsec := 0;
+          else
+             tv_nsec := nsec_t ((D - Duration (tv_sec)) * Nano - 0.5);
+          end if;
+       end if;
+ 
+       return (tv_sec, tv_nsec);
+    end To_Timespec;
+ 
+    -----------------
+    -- To_Timeval --
+    -----------------
+ 
+    function To_Timeval (D : Duration) return timeval is
+       tv_sec  : time_t;
+       tv_usec : usec_t;
+ 
+    begin
+       if D = 0.0 then
+          tv_sec  := 0;
+          tv_usec := 0;
+ 
+       elsif D < 0.0 then
+          tv_sec := time_t (D + 0.5);
+          if D = Duration (tv_sec) then
+             tv_usec := 0;
+          else
+             tv_usec := usec_t ((D - Duration (tv_sec)) * Micro + 0.5);
+          end if;
+ 
+       else
+          tv_sec := time_t (D - 0.5);
+          if D = Duration (tv_sec) then
+             tv_usec := 0;
+          else
+             tv_usec := usec_t ((D - Duration (tv_sec)) * Micro - 0.5);
+          end if;
+       end if;
+ 
+       return (tv_sec, tv_usec);
+    end To_Timeval;
+ 
+ end System.C_Time;
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/s-c_time.ads gcc-16-20250921/gcc/ada/libgnat/s-c_time.ads
*** gcc-16-20250914/gcc/ada/libgnat/s-c_time.ads	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/ada/libgnat/s-c_time.ads	Sun Sep 21 22:32:35 2025
***************
*** 0 ****
--- 1,93 ----
+ ------------------------------------------------------------------------------
+ --                                                                          --
+ --                         GNAT RUN-TIME COMPONENTS                         --
+ --                                                                          --
+ --                         S Y S T E M . C _ T I M E                        --
+ --                                                                          --
+ --                                  S p e c                                 --
+ --                                                                          --
+ --             Copyright (C) 2025, Free Software Foundation, Inc.           --
+ --                                                                          --
+ -- GNAT is free software; you can  redistribute it  and/or modify it under --
+ -- terms of the  GNU General Public License as published  by the Free Soft- --
+ -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
+ -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
+ -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
+ -- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
+ --                                                                          --
+ -- As a special exception 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/>.                                          --
+ --                                                                          --
+ -- GNAT was originally developed  by the GNAT team at  New York University. --
+ -- Extensive contributions were provided by Ada Core Technologies, Inc.     --
+ --                                                                          --
+ ------------------------------------------------------------------------------
+ 
+ --  This package provides the time_t, timeval and timespec types corresponding
+ --  to the C types defined by the OS, as well as various conversion functions.
+ 
+ with Interfaces.C;
+ 
+ with System.OS_Constants;
+ 
+ package System.C_Time
+   with Pure
+ is
+    --  These two C structs represent durations with different accuracies and
+    --  maximal values.
+ 
+    type time_t is range -2 ** (OS_Constants.SIZEOF_tv_sec * 8 - 1) ..
+                          2 ** (OS_Constants.SIZEOF_tv_sec * 8 - 1) - 1
+      with Convention => C, Size => OS_Constants.SIZEOF_tv_sec * 8;
+ 
+    type usec_t is range -2 ** (OS_Constants.SIZEOF_tv_usec * 8 - 1) ..
+                          2 ** (OS_Constants.SIZEOF_tv_usec * 8 - 1) - 1
+      with Convention => C, Size => OS_Constants.SIZEOF_tv_usec * 8;
+    --  Larger than the suseconds_t C type on ARM 32 bits with GNU libc
+    --  when __TIME_BITS=64.
+ 
+    type timeval is record
+       tv_sec  : time_t;  --  seconds
+       tv_usec : usec_t;  --  microseconds
+    end record
+      with Convention => C;
+ 
+    type nsec_t is range -2 ** (OS_Constants.SIZEOF_tv_nsec * 8 - 1) ..
+                          2 ** (OS_Constants.SIZEOF_tv_nsec * 8 - 1) - 1
+      with Convention => C, Size => OS_Constants.SIZEOF_tv_nsec * 8;
+    --  Larger than the signed long int C type on x32.
+ 
+    type timespec is record
+       tv_sec  : time_t;  --  seconds
+       tv_nsec : nsec_t;  --  nanoseconds
+    end record
+      with Convention => C;
+ 
+    --  All conversion functions truncate the result if it is inexact
+ 
+    function To_Duration (T : timespec) return Duration with Inline;
+    function To_Duration (T : timeval)  return Duration with Inline;
+ 
+    function To_Timespec (D : Duration) return timespec with Inline;
+    function To_Timeval  (D : Duration) return timeval  with Inline;
+ 
+    function In_Timeval_Duration (T : timeval) return Boolean with Inline;
+    --  g-socket.adb if not Windows target
+ 
+    function Milliseconds_To_Timeval (M : Interfaces.C.int) return timeval
+      with Inline;
+    --  g-sothco.ads
+    --  g-spogwa.adb
+ 
+    function Nanoseconds_To_Timespec (N : Interfaces.C.int) return timespec
+      with Inline;
+    function To_Timespec (T : timeval) return timespec with Inline;
+    --  s-osinte__darwin.adb
+ 
+ end System.C_Time;
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/s-optide.adb gcc-16-20250921/gcc/ada/libgnat/s-optide.adb
*** gcc-16-20250914/gcc/ada/libgnat/s-optide.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/s-optide.adb	Sun Sep 21 22:32:35 2025
*************** procedure Timed_Delay
*** 36,43 ****
    (Time : Duration;
     Mode : Integer)
  is
!    Request    : aliased timespec;
!    Remaind    : aliased timespec;
     Rel_Time   : Duration;
     Abs_Time   : Duration;
     Base_Time  : constant Duration := Clock;
--- 36,48 ----
    (Time : Duration;
     Mode : Integer)
  is
! 
!    function nanosleep (rqtp, rmtp : not null access C_Time.timespec)
!                        return Integer;
!    pragma Import (C, nanosleep, "nanosleep");
! 
!    Request    : aliased C_Time.timespec;
!    Remaind    : aliased C_Time.timespec;
     Rel_Time   : Duration;
     Abs_Time   : Duration;
     Base_Time  : constant Duration := Clock;
*************** begin
*** 71,77 ****
           end if;
           pragma Warnings (On);
  
!          Request := To_Timespec (Time_Chunk);
           Result := nanosleep (Request'Access, Remaind'Access);
  
           Check_Time := Clock;
--- 76,82 ----
           end if;
           pragma Warnings (On);
  
!          Request := C_Time.To_Timespec (Time_Chunk);
           Result := nanosleep (Request'Access, Remaind'Access);
  
           Check_Time := Clock;
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/s-os_lib.adb gcc-16-20250921/gcc/ada/libgnat/s-os_lib.adb
*** gcc-16-20250914/gcc/ada/libgnat/s-os_lib.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/s-os_lib.adb	Sun Sep 21 22:32:35 2025
*************** package body System.OS_Lib is
*** 2985,2991 ****
     -- To_Ada --
     ------------
  
!    function To_Ada (Time : time_t) return OS_Time is
     begin
        return OS_Time (Time);
     end To_Ada;
--- 2985,2991 ----
     -- To_Ada --
     ------------
  
!    function To_Ada (Time : Long_Long_Integer) return OS_Time is
     begin
        return OS_Time (Time);
     end To_Ada;
*************** package body System.OS_Lib is
*** 3023,3031 ****
     -- To_C --
     ----------
  
!    function To_C (Time : OS_Time) return time_t is
     begin
!       return time_t (Time);
     end To_C;
  
     ------------------
--- 3023,3031 ----
     -- To_C --
     ----------
  
!    function To_C (Time : OS_Time) return Long_Long_Integer is
     begin
!       return Long_Long_Integer (Time);
     end To_C;
  
     ------------------
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/s-os_lib.ads gcc-16-20250921/gcc/ada/libgnat/s-os_lib.ads
*** gcc-16-20250914/gcc/ada/libgnat/s-os_lib.ads	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/s-os_lib.ads	Sun Sep 21 22:32:35 2025
*************** package System.OS_Lib is
*** 115,120 ****
--- 115,126 ----
     --  these have Intrinsic convention, so for example it is not permissible
     --  to create accesses to any of these functions.
  
+    function To_Ada (Time : Long_Long_Integer) return OS_Time;
+    --  Convert Long_Long_Integer to OS_Time
+ 
+    function To_C (Time : OS_Time) return Long_Long_Integer;
+    --  Convert OS_Time to Long_Long_Integer
+ 
     subtype Year_Type   is Integer range 1900 .. 2099;
     subtype Month_Type  is Integer range    1 ..   12;
     subtype Day_Type    is Integer range    1 ..   31;
*************** package System.OS_Lib is
*** 161,187 ****
     --  component parts to be interpreted in the local time zone, and returns
     --  an OS_Time. Returns Invalid_Time if the creation fails.
  
-    ------------------
-    -- Time_t Stuff --
-    ------------------
- 
-    --  Note: Do not use time_t in the compiler and host-based tools; instead
-    --  use OS_Time.
- 
-    subtype time_t is Long_Long_Integer;
-    --  C time_t can be either long or long long, so we choose the Ada
-    --  equivalent of the latter because eventually that will be the
-    --  type used out of necessity. This may affect some user code on 32-bit
-    --  targets that have not yet migrated to the Posix 2008 standard,
-    --  particularly pre version 5 32-bit Linux. Do not change this
-    --  declaration without coordinating it with conversions in Ada.Calendar.
- 
-    function To_C (Time : OS_Time) return time_t;
-    --  Convert OS_Time to C time_t type
- 
-    function To_Ada (Time : time_t) return OS_Time;
-    --  Convert C time_t type to OS_Time
- 
     ----------------
     -- File Stuff --
     ----------------
--- 167,172 ----
*************** private
*** 1126,1133 ****
     pragma Import (Intrinsic, ">");
     pragma Import (Intrinsic, "<=");
     pragma Import (Intrinsic, ">=");
-    pragma Inline (To_C);
     pragma Inline (To_Ada);
  
     type Process_Id is new Integer;
     Invalid_Pid : constant Process_Id := -1;
--- 1111,1118 ----
     pragma Import (Intrinsic, ">");
     pragma Import (Intrinsic, "<=");
     pragma Import (Intrinsic, ">=");
     pragma Inline (To_Ada);
+    pragma Inline (To_C);
  
     type Process_Id is new Integer;
     Invalid_Pid : constant Process_Id := -1;
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/s-osprim__darwin.adb gcc-16-20250921/gcc/ada/libgnat/s-osprim__darwin.adb
*** gcc-16-20250914/gcc/ada/libgnat/s-osprim__darwin.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/s-osprim__darwin.adb	Sun Sep 21 22:32:35 2025
***************
*** 29,37 ****
  --                                                                          --
  ------------------------------------------------------------------------------
  
! --  This version is for darwin
  
- with System.Parameters;
  package body System.OS_Primitives is
  
     --  ??? These definitions are duplicated from System.OS_Interface
--- 29,38 ----
  --                                                                          --
  ------------------------------------------------------------------------------
  
! --  This version is for Darwin
! 
! with System.C_Time;
  
  package body System.OS_Primitives is
  
     --  ??? These definitions are duplicated from System.OS_Interface
*************** package body System.OS_Primitives is
*** 46,72 ****
     pragma Convention (C, struct_timezone);
     type struct_timezone_ptr is access all struct_timezone;
  
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
- 
-    type struct_timeval is record
-       tv_sec       : time_t;
-       tv_usec      : Integer;
-    end record;
-    pragma Convention (C, struct_timeval);
- 
     function gettimeofday
!      (tv : not null access struct_timeval;
        tz : struct_timezone_ptr) return Integer;
     pragma Import (C, gettimeofday, "gettimeofday");
  
!    type timespec is record
!       tv_sec  : time_t;
!       tv_nsec : Long_Integer;
!    end record;
!    pragma Convention (C, timespec);
! 
!    function nanosleep (rqtp, rmtp : not null access timespec) return Integer;
     pragma Import (C, nanosleep, "nanosleep");
  
     -----------
--- 47,59 ----
     pragma Convention (C, struct_timezone);
     type struct_timezone_ptr is access all struct_timezone;
  
     function gettimeofday
!      (tv : not null access C_Time.timeval;
        tz : struct_timezone_ptr) return Integer;
     pragma Import (C, gettimeofday, "gettimeofday");
  
!    function nanosleep (rqtp, rmtp : not null access C_Time.timespec)
!                       return Integer;
     pragma Import (C, nanosleep, "nanosleep");
  
     -----------
*************** package body System.OS_Primitives is
*** 74,80 ****
     -----------
  
     function Clock return Duration is
!       TV     : aliased struct_timeval;
  
        Result : Integer;
        pragma Unreferenced (Result);
--- 61,67 ----
     -----------
  
     function Clock return Duration is
!       TV     : aliased C_Time.timeval;
  
        Result : Integer;
        pragma Unreferenced (Result);
*************** package body System.OS_Primitives is
*** 89,125 ****
        --  value is never checked.
  
        Result := gettimeofday (TV'Access, null);
!       return Duration (TV.tv_sec) + Duration (TV.tv_usec) / 10#1#E6;
     end Clock;
  
     -----------------
-    -- To_Timespec --
-    -----------------
- 
-    function To_Timespec (D : Duration) return timespec;
- 
-    function To_Timespec (D : Duration) return timespec is
-       S : time_t;
-       F : Duration;
- 
-    begin
-       S := time_t (Long_Long_Integer (D));
-       F := D - Duration (S);
- 
-       --  If F has negative value due to a round-up, adjust for positive F
-       --  value.
- 
-       if F < 0.0 then
-          S := S - 1;
-          F := F + 1.0;
-       end if;
- 
-       return
-         timespec'(tv_sec  => S,
-                   tv_nsec => Long_Integer (Long_Long_Integer (F * 10#1#E9)));
-    end To_Timespec;
- 
-    -----------------
     -- Timed_Delay --
     -----------------
  
--- 76,85 ----
        --  value is never checked.
  
        Result := gettimeofday (TV'Access, null);
!       return C_Time.To_Duration (TV);
     end Clock;
  
     -----------------
     -- Timed_Delay --
     -----------------
  
*************** package body System.OS_Primitives is
*** 127,134 ****
       (Time : Duration;
        Mode : Integer)
     is
!       Request    : aliased timespec;
!       Remaind    : aliased timespec;
        Rel_Time   : Duration;
        Abs_Time   : Duration;
        Base_Time  : constant Duration := Clock;
--- 87,94 ----
       (Time : Duration;
        Mode : Integer)
     is
!       Request    : aliased C_Time.timespec;
!       Remaind    : aliased C_Time.timespec;
        Rel_Time   : Duration;
        Abs_Time   : Duration;
        Base_Time  : constant Duration := Clock;
*************** package body System.OS_Primitives is
*** 148,154 ****
  
        if Rel_Time > 0.0 then
           loop
!             Request := To_Timespec (Rel_Time);
              Result := nanosleep (Request'Access, Remaind'Access);
              Check_Time := Clock;
  
--- 108,114 ----
  
        if Rel_Time > 0.0 then
           loop
!             Request := C_Time.To_Timespec (Rel_Time);
              Result := nanosleep (Request'Access, Remaind'Access);
              Check_Time := Clock;
  
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/s-osprim__posix.adb gcc-16-20250921/gcc/ada/libgnat/s-osprim__posix.adb
*** gcc-16-20250914/gcc/ada/libgnat/s-osprim__posix.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/s-osprim__posix.adb	Sun Sep 21 22:32:35 2025
***************
*** 30,55 ****
  ------------------------------------------------------------------------------
  
  --  This version is for POSIX-like operating systems
- with System.Parameters;
- 
- package body System.OS_Primitives is
- 
-    --  ??? These definitions are duplicated from System.OS_Interface
-    --  because we don't want to depend on any package. Consider removing
-    --  these declarations in System.OS_Interface and move these ones in
-    --  the spec.
- 
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
  
!    type timespec is record
!       tv_sec  : time_t;
!       tv_nsec : Long_Integer;
!    end record;
!    pragma Convention (C, timespec);
  
!    function nanosleep (rqtp, rmtp : not null access timespec) return Integer;
!    pragma Import (C, nanosleep, "nanosleep");
  
     -----------
     -- Clock --
--- 30,39 ----
  ------------------------------------------------------------------------------
  
  --  This version is for POSIX-like operating systems
  
! with System.C_Time;
  
! package body System.OS_Primitives is
  
     -----------
     -- Clock --
*************** package body System.OS_Primitives is
*** 57,83 ****
  
     function Clock return Duration is
  
!       type timeval is array (1 .. 3) of Long_Integer;
!       --  The timeval array is sized to contain Long_Long_Integer sec and
!       --  Long_Integer usec. If Long_Long_Integer'Size = Long_Integer'Size then
!       --  it will be overly large but that will not effect the implementation
!       --  since it is not accessed directly.
! 
!       procedure timeval_to_duration
!         (T    : not null access timeval;
!          sec  : not null access Long_Long_Integer;
!          usec : not null access Long_Integer);
!       pragma Import (C, timeval_to_duration, "__gnat_timeval_to_duration");
! 
!       Micro  : constant := 10**6;
!       sec    : aliased Long_Long_Integer;
!       usec   : aliased Long_Integer;
!       TV     : aliased timeval;
        Result : Integer;
        pragma Unreferenced (Result);
  
        function gettimeofday
!         (Tv : access timeval;
           Tz : System.Address := System.Null_Address) return Integer;
        pragma Import (C, gettimeofday, "gettimeofday");
  
--- 41,52 ----
  
     function Clock return Duration is
  
!       TV     : aliased C_Time.timeval;
        Result : Integer;
        pragma Unreferenced (Result);
  
        function gettimeofday
!         (Tv : access C_Time.timeval;
           Tz : System.Address := System.Null_Address) return Integer;
        pragma Import (C, gettimeofday, "gettimeofday");
  
*************** package body System.OS_Primitives is
*** 91,128 ****
        --  value is never checked.
  
        Result := gettimeofday (TV'Access, System.Null_Address);
!       timeval_to_duration (TV'Access, sec'Access, usec'Access);
!       return Duration (sec) + Duration (usec) / Micro;
     end Clock;
  
     -----------------
-    -- To_Timespec --
-    -----------------
- 
-    function To_Timespec (D : Duration) return timespec;
- 
-    function To_Timespec (D : Duration) return timespec is
-       S : time_t;
-       F : Duration;
- 
-    begin
-       S := time_t (Long_Long_Integer (D));
-       F := D - Duration (S);
- 
-       --  If F has negative value due to a round-up, adjust for positive F
-       --  value.
- 
-       if F < 0.0 then
-          S := S - 1;
-          F := F + 1.0;
-       end if;
- 
-       return
-         timespec'(tv_sec  => S,
-                   tv_nsec => Long_Integer (Long_Long_Integer (F * 10#1#E9)));
-    end To_Timespec;
- 
-    -----------------
     -- Timed_Delay --
     -----------------
  
--- 60,69 ----
        --  value is never checked.
  
        Result := gettimeofday (TV'Access, System.Null_Address);
!       return C_Time.To_Duration (TV);
     end Clock;
  
     -----------------
     -- Timed_Delay --
     -----------------
  
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/s-osprim__posix2008.adb gcc-16-20250921/gcc/ada/libgnat/s-osprim__posix2008.adb
*** gcc-16-20250914/gcc/ada/libgnat/s-osprim__posix2008.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/s-osprim__posix2008.adb	Sun Sep 21 22:32:35 2025
***************
*** 32,65 ****
  --  This version is for POSIX.1-2008-like operating systems
  
  with System.CRTL;
  with System.OS_Constants;
! with System.Parameters;
  package body System.OS_Primitives is
  
     subtype int is System.CRTL.int;
  
-    --  ??? These definitions are duplicated from System.OS_Interface because
-    --  we don't want to depend on any package. Consider removing these
-    --  declarations in System.OS_Interface and move these ones to the spec.
- 
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
- 
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : Long_Integer;
-    end record;
-    pragma Convention (C, timespec);
- 
-    function nanosleep (rqtp, rmtp : not null access timespec) return Integer;
-    pragma Import (C, nanosleep, "nanosleep");
- 
     -----------
     -- Clock --
     -----------
  
     function Clock return Duration is
!       TS     : aliased timespec;
        Result : int;
  
        type clockid_t is new int;
--- 32,50 ----
  --  This version is for POSIX.1-2008-like operating systems
  
  with System.CRTL;
+ with System.C_Time;
  with System.OS_Constants;
! 
  package body System.OS_Primitives is
  
     subtype int is System.CRTL.int;
  
     -----------
     -- Clock --
     -----------
  
     function Clock return Duration is
!       TS     : aliased C_Time.timespec;
        Result : int;
  
        type clockid_t is new int;
*************** package body System.OS_Primitives is
*** 68,110 ****
  
        function clock_gettime
          (clock_id : clockid_t;
!          tp       : access timespec) return int;
        pragma Import (C, clock_gettime, "clock_gettime");
  
     begin
        Result := clock_gettime (CLOCK_REALTIME, TS'Unchecked_Access);
        pragma Assert (Result = 0);
!       return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9;
     end Clock;
  
     -----------------
-    -- To_Timespec --
-    -----------------
- 
-    function To_Timespec (D : Duration) return timespec;
- 
-    function To_Timespec (D : Duration) return timespec is
-       S : time_t;
-       F : Duration;
- 
-    begin
-       S := time_t (Long_Long_Integer (D));
-       F := D - Duration (S);
- 
-       --  If F has negative value due to a round-up, adjust for positive F
-       --  value.
- 
-       if F < 0.0 then
-          S := S - 1;
-          F := F + 1.0;
-       end if;
- 
-       return
-         timespec'(tv_sec  => S,
-                   tv_nsec => Long_Integer (Long_Long_Integer (F * 10#1#E9)));
-    end To_Timespec;
- 
-    -----------------
     -- Timed_Delay --
     -----------------
  
--- 53,68 ----
  
        function clock_gettime
          (clock_id : clockid_t;
!          tp       : access C_Time.timespec) return int;
        pragma Import (C, clock_gettime, "clock_gettime");
  
     begin
        Result := clock_gettime (CLOCK_REALTIME, TS'Unchecked_Access);
        pragma Assert (Result = 0);
!       return C_Time.To_Duration (TS);
     end Clock;
  
     -----------------
     -- Timed_Delay --
     -----------------
  
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/s-osprim__rtems.adb gcc-16-20250921/gcc/ada/libgnat/s-osprim__rtems.adb
*** gcc-16-20250914/gcc/ada/libgnat/s-osprim__rtems.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/s-osprim__rtems.adb	Sun Sep 21 22:32:35 2025
***************
*** 31,37 ****
  
  --  This version is for POSIX-like operating systems
  
! with System.Parameters;
  package body System.OS_Primitives is
  
     --  ??? These definitions are duplicated from System.OS_Interface
--- 31,38 ----
  
  --  This version is for POSIX-like operating systems
  
! with System.C_Time;
! 
  package body System.OS_Primitives is
  
     --  ??? These definitions are duplicated from System.OS_Interface
*************** package body System.OS_Primitives is
*** 39,54 ****
     --  these declarations in System.OS_Interface and move these ones in
     --  the spec.
  
!    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
!       .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
! 
!    type timespec is record
!       tv_sec  : time_t;
!       tv_nsec : Long_Integer;
!    end record;
!    pragma Convention (C, timespec);
! 
!    function nanosleep (rqtp, rmtp : not null access timespec) return Integer;
     pragma Import (C, nanosleep, "nanosleep");
  
     -----------
--- 40,47 ----
     --  these declarations in System.OS_Interface and move these ones in
     --  the spec.
  
!    function nanosleep (rqtp, rmtp : not null access C_Time.timespec)
!                       return Integer;
     pragma Import (C, nanosleep, "nanosleep");
  
     -----------
*************** package body System.OS_Primitives is
*** 56,83 ****
     -----------
  
     function Clock return Duration is
! 
!       type timeval is record
!          tv_sec  : time_t;
!          tv_usec : Long_Integer;
!       end record;
!       pragma Convention (C, timeval);
! 
!       procedure timeval_to_duration
!         (T    : not null access timeval;
!          sec  : not null access Long_Long_Integer;
!          usec : not null access Long_Integer);
!       pragma Import (C, timeval_to_duration, "__gnat_timeval_to_duration");
! 
!       Micro  : constant := 10**6;
!       sec    : aliased Long_Long_Integer;
!       usec   : aliased Long_Integer;
!       TV     : aliased timeval;
        Result : Integer;
        pragma Unreferenced (Result);
  
        function gettimeofday
!         (Tv : access timeval;
           Tz : System.Address := System.Null_Address) return Integer;
        pragma Import (C, gettimeofday, "gettimeofday");
  
--- 49,60 ----
     -----------
  
     function Clock return Duration is
!       TV     : aliased C_Time.timeval;
        Result : Integer;
        pragma Unreferenced (Result);
  
        function gettimeofday
!         (Tv : access C_Time.timeval;
           Tz : System.Address := System.Null_Address) return Integer;
        pragma Import (C, gettimeofday, "gettimeofday");
  
*************** package body System.OS_Primitives is
*** 91,128 ****
        --  value is never checked.
  
        Result := gettimeofday (TV'Access, System.Null_Address);
!       timeval_to_duration (TV'Access, sec'Access, usec'Access);
!       return Duration (sec) + Duration (usec) / Micro;
     end Clock;
  
     -----------------
-    -- To_Timespec --
-    -----------------
- 
-    function To_Timespec (D : Duration) return timespec;
- 
-    function To_Timespec (D : Duration) return timespec is
-       S : time_t;
-       F : Duration;
- 
-    begin
-       S := time_t (Long_Long_Integer (D));
-       F := D - Duration (S);
- 
-       --  If F has negative value due to a round-up, adjust for positive F
-       --  value.
- 
-       if F < 0.0 then
-          S := S - 1;
-          F := F + 1.0;
-       end if;
- 
-       return
-         timespec'(tv_sec  => S,
-                   tv_nsec => Long_Integer (Long_Long_Integer (F * 10#1#E9)));
-    end To_Timespec;
- 
-    -----------------
     -- Timed_Delay --
     -----------------
  
--- 68,77 ----
        --  value is never checked.
  
        Result := gettimeofday (TV'Access, System.Null_Address);
!       return C_Time.To_Duration (TV);
     end Clock;
  
     -----------------
     -- Timed_Delay --
     -----------------
  
*************** package body System.OS_Primitives is
*** 130,137 ****
       (Time : Duration;
        Mode : Integer)
     is
!       Request    : aliased timespec;
!       Remaind    : aliased timespec;
        Rel_Time   : Duration;
        Abs_Time   : Duration;
        Base_Time  : constant Duration := Clock;
--- 79,86 ----
       (Time : Duration;
        Mode : Integer)
     is
!       Request    : aliased C_Time.timespec;
!       Remaind    : aliased C_Time.timespec;
        Rel_Time   : Duration;
        Abs_Time   : Duration;
        Base_Time  : constant Duration := Clock;
*************** package body System.OS_Primitives is
*** 151,157 ****
  
        if Rel_Time > 0.0 then
           loop
!             Request := To_Timespec (Rel_Time);
              Result := nanosleep (Request'Access, Remaind'Access);
              Check_Time := Clock;
  
--- 100,106 ----
  
        if Rel_Time > 0.0 then
           loop
!             Request := C_Time.To_Timespec (Rel_Time);
              Result := nanosleep (Request'Access, Remaind'Access);
              Check_Time := Clock;
  
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/s-osprim__solaris.adb gcc-16-20250921/gcc/ada/libgnat/s-osprim__solaris.adb
*** gcc-16-20250914/gcc/ada/libgnat/s-osprim__solaris.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/s-osprim__solaris.adb	Thu Jan  1 00:00:00 1970
***************
*** 1,126 ****
- ------------------------------------------------------------------------------
- --                                                                          --
- --                 GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS                 --
- --                                                                          --
- --                  S Y S T E M . O S _ P R I M I T I V E S                 --
- --                                                                          --
- --                                  B o d y                                 --
- --                                                                          --
- --          Copyright (C) 1998-2025, Free Software Foundation, Inc.         --
- --                                                                          --
- -- GNARL is free software; you can  redistribute it  and/or modify it under --
- -- terms of the  GNU General Public License as published  by the Free Soft- --
- -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
- -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
- -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
- -- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
- --                                                                          --
- -- As a special exception 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/>.                                          --
- --                                                                          --
- -- GNARL was developed by the GNARL team at Florida State University.       --
- -- Extensive contributions were provided by Ada Core Technologies, Inc.     --
- --                                                                          --
- ------------------------------------------------------------------------------
- 
- --  This version uses gettimeofday and select
- --  This file is suitable for Solaris (32 and 64 bits).
- 
- package body System.OS_Primitives is
- 
-    --  ??? These definitions are duplicated from System.OS_Interface
-    --  because we don't want to depend on any package. Consider removing
-    --  these declarations in System.OS_Interface and move these ones in
-    --  the spec.
- 
-    type struct_timeval is record
-       tv_sec  : Long_Integer;
-       tv_usec : Long_Integer;
-    end record;
-    pragma Convention (C, struct_timeval);
- 
-    procedure gettimeofday
-      (tv : not null access struct_timeval;
-       tz : Address := Null_Address);
-    pragma Import (C, gettimeofday, "gettimeofday");
- 
-    procedure C_select
-      (n         : Integer := 0;
-       readfds,
-       writefds,
-       exceptfds : Address := Null_Address;
-       timeout   : not null access struct_timeval);
-    pragma Import (C, C_select, "select");
- 
-    -----------
-    -- Clock --
-    -----------
- 
-    function Clock return Duration is
-       TV : aliased struct_timeval;
- 
-    begin
-       gettimeofday (TV'Access);
-       return Duration (TV.tv_sec) + Duration (TV.tv_usec) / 10#1#E6;
-    end Clock;
- 
-    -----------------
-    -- Timed_Delay --
-    -----------------
- 
-    procedure Timed_Delay
-      (Time : Duration;
-       Mode : Integer)
-    is
-       Rel_Time   : Duration;
-       Abs_Time   : Duration;
-       Base_Time  : constant Duration := Clock;
-       Check_Time : Duration := Base_Time;
-       timeval    : aliased struct_timeval;
- 
-    begin
-       if Mode = Relative then
-          Rel_Time := Time;
-          Abs_Time := Time + Check_Time;
-       else
-          Rel_Time := Time - Check_Time;
-          Abs_Time := Time;
-       end if;
- 
-       if Rel_Time > 0.0 then
-          loop
-             timeval.tv_sec := Long_Integer (Rel_Time);
- 
-             if Duration (timeval.tv_sec) > Rel_Time then
-                timeval.tv_sec := timeval.tv_sec - 1;
-             end if;
- 
-             timeval.tv_usec :=
-               Long_Integer ((Rel_Time - Duration (timeval.tv_sec)) * 10#1#E6);
- 
-             C_select (timeout => timeval'Unchecked_Access);
-             Check_Time := Clock;
- 
-             exit when Abs_Time <= Check_Time or else Check_Time < Base_Time;
- 
-             Rel_Time := Abs_Time - Check_Time;
-          end loop;
-       end if;
-    end Timed_Delay;
- 
-    ----------------
-    -- Initialize --
-    ----------------
- 
-    procedure Initialize is
-    begin
-       null;
-    end Initialize;
- 
- end System.OS_Primitives;
--- 0 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/s-osprim__unix.adb gcc-16-20250921/gcc/ada/libgnat/s-osprim__unix.adb
*** gcc-16-20250914/gcc/ada/libgnat/s-osprim__unix.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/s-osprim__unix.adb	Sun Sep 21 22:32:35 2025
***************
*** 30,36 ****
  ------------------------------------------------------------------------------
  
  --  This version uses gettimeofday and select
! --  This file is suitable for OpenNT, Dec Unix and SCO UnixWare.
  
  package body System.OS_Primitives is
  
--- 30,38 ----
  ------------------------------------------------------------------------------
  
  --  This version uses gettimeofday and select
! --  This file is suitable for Dec Unix, SCO UnixWare and Sun Solaris.
! 
! with System.C_Time;
  
  package body System.OS_Primitives is
  
*************** package body System.OS_Primitives is
*** 39,52 ****
     --  these declarations in System.OS_Interface and move these ones in
     --  the spec.
  
-    type struct_timeval is record
-       tv_sec  : Integer;
-       tv_usec : Integer;
-    end record;
-    pragma Convention (C, struct_timeval);
- 
     procedure gettimeofday
!      (tv : not null access struct_timeval;
        tz : Address := Null_Address);
     pragma Import (C, gettimeofday, "gettimeofday");
  
--- 41,48 ----
     --  these declarations in System.OS_Interface and move these ones in
     --  the spec.
  
     procedure gettimeofday
!      (tv : not null access C_Time.timeval;
        tz : Address := Null_Address);
     pragma Import (C, gettimeofday, "gettimeofday");
  
*************** package body System.OS_Primitives is
*** 55,61 ****
        readfds,
        writefds,
        exceptfds : Address := Null_Address;
!       timeout   : not null access struct_timeval);
     pragma Import (C, C_select, "select");
  
     -----------
--- 51,57 ----
        readfds,
        writefds,
        exceptfds : Address := Null_Address;
!       timeout   : not null access C_Time.timeval);
     pragma Import (C, C_select, "select");
  
     -----------
*************** package body System.OS_Primitives is
*** 63,73 ****
     -----------
  
     function Clock return Duration is
!       TV : aliased struct_timeval;
  
     begin
        gettimeofday (TV'Access);
!       return Duration (TV.tv_sec) + Duration (TV.tv_usec) / 10#1#E6;
     end Clock;
  
     -----------------
--- 59,69 ----
     -----------
  
     function Clock return Duration is
!       TV : aliased C_Time.timeval;
  
     begin
        gettimeofday (TV'Access);
!       return C_Time.To_Duration (TV);
     end Clock;
  
     -----------------
*************** package body System.OS_Primitives is
*** 82,88 ****
        Abs_Time   : Duration;
        Base_Time  : constant Duration := Clock;
        Check_Time : Duration := Base_Time;
!       timeval    : aliased struct_timeval;
  
     begin
        if Mode = Relative then
--- 78,84 ----
        Abs_Time   : Duration;
        Base_Time  : constant Duration := Clock;
        Check_Time : Duration := Base_Time;
!       timeval    : aliased C_Time.timeval;
  
     begin
        if Mode = Relative then
*************** package body System.OS_Primitives is
*** 95,108 ****
  
        if Rel_Time > 0.0 then
           loop
!             timeval.tv_sec := Integer (Rel_Time);
! 
!             if Duration (timeval.tv_sec) > Rel_Time then
!                timeval.tv_sec := timeval.tv_sec - 1;
!             end if;
! 
!             timeval.tv_usec :=
!               Integer ((Rel_Time - Duration (timeval.tv_sec)) * 10#1#E6);
  
              C_select (timeout => timeval'Unchecked_Access);
              Check_Time := Clock;
--- 91,97 ----
  
        if Rel_Time > 0.0 then
           loop
!             timeval := C_Time.To_Timeval (Rel_Time);
  
              C_select (timeout => timeval'Unchecked_Access);
              Check_Time := Clock;
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/s-osprim__x32.adb gcc-16-20250921/gcc/ada/libgnat/s-osprim__x32.adb
*** gcc-16-20250914/gcc/ada/libgnat/s-osprim__x32.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/s-osprim__x32.adb	Thu Jan  1 00:00:00 1970
***************
*** 1,170 ****
- ------------------------------------------------------------------------------
- --                                                                          --
- --                 GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS                 --
- --                                                                          --
- --                  S Y S T E M . O S _ P R I M I T I V E S                 --
- --                                                                          --
- --                                  B o d y                                 --
- --                                                                          --
- --             Copyright (C) 2013-2025, Free Software Foundation, Inc.      --
- --                                                                          --
- -- GNARL is free software; you can  redistribute it  and/or modify it under --
- -- terms of the  GNU General Public License as published  by the Free Soft- --
- -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
- -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
- -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
- -- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
- --                                                                          --
- -- As a special exception 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/>.                                          --
- --                                                                          --
- -- GNARL was developed by the GNARL team at Florida State University.       --
- -- Extensive contributions were provided by Ada Core Technologies, Inc.     --
- --                                                                          --
- ------------------------------------------------------------------------------
- 
- --  This version is for Linux/x32
- 
- with System.Parameters;
- 
- package body System.OS_Primitives is
- 
-    --  ??? These definitions are duplicated from System.OS_Interface
-    --  because we don't want to depend on any package. Consider removing
-    --  these declarations in System.OS_Interface and move these ones in
-    --  the spec.
- 
-    type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
-      .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
- 
-    type timespec is record
-       tv_sec  : time_t;
-       tv_nsec : Long_Long_Integer;
-    end record;
-    pragma Convention (C, timespec);
- 
-    function nanosleep (rqtp, rmtp : not null access timespec) return Integer;
-    pragma Import (C, nanosleep, "nanosleep");
- 
-    -----------
-    -- Clock --
-    -----------
- 
-    function Clock return Duration is
-       type timeval is array (1 .. 2) of Long_Long_Integer;
- 
-       procedure timeval_to_duration
-         (T    : not null access timeval;
-          sec  : not null access Long_Integer;
-          usec : not null access Long_Integer);
-       pragma Import (C, timeval_to_duration, "__gnat_timeval_to_duration");
- 
-       Micro  : constant := 10**6;
-       sec    : aliased Long_Integer;
-       usec   : aliased Long_Integer;
-       TV     : aliased timeval;
-       Result : Integer;
-       pragma Unreferenced (Result);
- 
-       function gettimeofday
-         (Tv : access timeval;
-          Tz : System.Address := System.Null_Address) return Integer;
-       pragma Import (C, gettimeofday, "gettimeofday");
- 
-    begin
-       --  The return codes for gettimeofday are as follows (from man pages):
-       --    EPERM  settimeofday is called by someone other than the superuser
-       --    EINVAL Timezone (or something else) is invalid
-       --    EFAULT One of tv or tz pointed outside accessible address space
- 
-       --  None of these codes signal a potential clock skew, hence the return
-       --  value is never checked.
- 
-       Result := gettimeofday (TV'Access, System.Null_Address);
-       timeval_to_duration (TV'Access, sec'Access, usec'Access);
-       return Duration (sec) + Duration (usec) / Micro;
-    end Clock;
- 
-    -----------------
-    -- To_Timespec --
-    -----------------
- 
-    function To_Timespec (D : Duration) return timespec;
- 
-    function To_Timespec (D : Duration) return timespec is
-       S : time_t;
-       F : Duration;
- 
-    begin
-       S := time_t (Long_Long_Integer (D));
-       F := D - Duration (S);
- 
-       --  If F has negative value due to a round-up, adjust for positive F
-       --  value.
- 
-       if F < 0.0 then
-          S := S - 1;
-          F := F + 1.0;
-       end if;
- 
-       return
-         timespec'(tv_sec  => S,
-                   tv_nsec => Long_Long_Integer (F * 10#1#E9));
-    end To_Timespec;
- 
-    -----------------
-    -- Timed_Delay --
-    -----------------
- 
-    procedure Timed_Delay
-      (Time : Duration;
-       Mode : Integer)
-    is
-       Request    : aliased timespec;
-       Remaind    : aliased timespec;
-       Rel_Time   : Duration;
-       Abs_Time   : Duration;
-       Base_Time  : constant Duration := Clock;
-       Check_Time : Duration := Base_Time;
- 
-       Result : Integer;
-       pragma Unreferenced (Result);
- 
-    begin
-       if Mode = Relative then
-          Rel_Time := Time;
-          Abs_Time := Time + Check_Time;
-       else
-          Rel_Time := Time - Check_Time;
-          Abs_Time := Time;
-       end if;
- 
-       if Rel_Time > 0.0 then
-          loop
-             Request := To_Timespec (Rel_Time);
-             Result := nanosleep (Request'Access, Remaind'Access);
-             Check_Time := Clock;
- 
-             exit when Abs_Time <= Check_Time or else Check_Time < Base_Time;
- 
-             Rel_Time := Abs_Time - Check_Time;
-          end loop;
-       end if;
-    end Timed_Delay;
- 
-    ----------------
-    -- Initialize --
-    ----------------
- 
-    procedure Initialize is
-    begin
-       null;
-    end Initialize;
- 
- end System.OS_Primitives;
--- 0 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/s-parame.ads gcc-16-20250921/gcc/ada/libgnat/s-parame.ads
*** gcc-16-20250914/gcc/ada/libgnat/s-parame.ads	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/s-parame.ads	Sun Sep 21 22:32:35 2025
*************** package System.Parameters is
*** 97,109 ****
     --  Indicates if secondary stacks can grow and shrink at run-time. If False,
     --  the size of a secondary stack is fixed at the point of its creation.
  
-    ------------------------------------
-    -- Characteristics of time_t type --
-    ------------------------------------
- 
-    time_t_bits : constant := Long_Integer'Size;
-    --  Number of bits in type time_t
- 
     ----------------------------------------------
     -- Characteristics of types in Interfaces.C --
     ----------------------------------------------
--- 97,102 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/s-parame__hpux.ads gcc-16-20250921/gcc/ada/libgnat/s-parame__hpux.ads
*** gcc-16-20250914/gcc/ada/libgnat/s-parame__hpux.ads	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/s-parame__hpux.ads	Sun Sep 21 22:32:35 2025
*************** package System.Parameters is
*** 96,108 ****
     --  Indicates if secondary stacks can grow and shrink at run-time. If False,
     --  the size of a secondary stack is fixed at the point of its creation.
  
-    ------------------------------------
-    -- Characteristics of time_t type --
-    ------------------------------------
- 
-    time_t_bits : constant := Long_Integer'Size;
-    --  Number of bits in type time_t
- 
     ----------------------------------------------
     -- Characteristics of Types in Interfaces.C --
     ----------------------------------------------
--- 96,101 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/s-parame__posix2008.ads gcc-16-20250921/gcc/ada/libgnat/s-parame__posix2008.ads
*** gcc-16-20250914/gcc/ada/libgnat/s-parame__posix2008.ads	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/s-parame__posix2008.ads	Thu Jan  1 00:00:00 1970
***************
*** 1,189 ****
- ------------------------------------------------------------------------------
- --                                                                          --
- --                         GNAT COMPILER COMPONENTS                         --
- --                                                                          --
- --                    S Y S T E M . P A R A M E T E R S                     --
- --                                                                          --
- --                                 S p e c                                  --
- --                                                                          --
- --          Copyright (C) 1992-2025, Free Software Foundation, Inc.         --
- --                                                                          --
- -- GNAT is free software;  you can  redistribute it  and/or modify it under --
- -- terms of the  GNU General Public License as published  by the Free Soft- --
- -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
- -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
- -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
- -- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
- --                                                                          --
- -- As a special exception 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/>.                                          --
- --                                                                          --
- -- GNAT was originally developed  by the GNAT team at  New York University. --
- -- Extensive contributions were provided by Ada Core Technologies Inc.      --
- --                                                                          --
- ------------------------------------------------------------------------------
- 
- --  This is the Posix 2008 version for 64 bit time_t.
- 
- --  This package defines some system dependent parameters for GNAT. These
- --  are values that are referenced by the runtime library and are therefore
- --  relevant to the target machine.
- 
- --  The parameters whose value is defined in the spec are not generally
- --  expected to be changed. If they are changed, it will be necessary to
- --  recompile the run-time library.
- 
- --  The parameters which are defined by functions can be changed by modifying
- --  the body of System.Parameters in file s-parame.adb. A change to this body
- --  requires only rebinding and relinking of the application.
- 
- --  Note: do not introduce any pragma Inline statements into this unit, since
- --  otherwise the relinking and rebinding capability would be deactivated.
- 
- package System.Parameters is
-    pragma Pure;
- 
-    ---------------------------------------
-    -- Task And Stack Allocation Control --
-    ---------------------------------------
- 
-    type Size_Type is range -Memory_Size / 2 .. Memory_Size / 2 - 1;
-    --  Type used to provide task stack sizes to the runtime. Sized to permit
-    --  stack sizes of up to half the total addressable memory space. This may
-    --  seem excessively large (even for 32-bit systems), however there are many
-    --  instances of users requiring large stack sizes (for example string
-    --  processing).
- 
-    Unspecified_Size : constant Size_Type := Size_Type'First;
-    --  Value used to indicate that no size type is set
- 
-    function Default_Stack_Size return Size_Type;
-    --  Default task stack size used if none is specified
- 
-    function Minimum_Stack_Size return Size_Type;
-    --  Minimum task stack size permitted
- 
-    function Adjust_Storage_Size (Size : Size_Type) return Size_Type;
-    --  Given the storage size stored in the TCB, return the Storage_Size
-    --  value required by the RM for the Storage_Size attribute. The
-    --  required adjustment is as follows:
-    --
-    --    when Size = Unspecified_Size, return Default_Stack_Size
-    --    when Size < Minimum_Stack_Size, return Minimum_Stack_Size
-    --    otherwise return given Size
- 
-    Default_Env_Stack_Size : constant Size_Type := 8_192_000;
-    --  Assumed size of the environment task, if no other information is
-    --  available. This value is used when stack checking is enabled and
-    --  no GNAT_STACK_LIMIT environment variable is set.
- 
-    Stack_Grows_Down  : constant Boolean := True;
-    --  This constant indicates whether the stack grows up (False) or
-    --  down (True) in memory as functions are called. It is used for
-    --  proper implementation of the stack overflow check.
- 
-    Runtime_Default_Sec_Stack_Size : constant Size_Type := 10 * 1024;
-    --  The run-time chosen default size for secondary stacks that may be
-    --  overridden by the user with the use of binder -D switch.
- 
-    Sec_Stack_Dynamic : constant Boolean := True;
-    --  Indicates if secondary stacks can grow and shrink at run-time. If False,
-    --  the size of a secondary stack is fixed at the point of its creation.
- 
-    ------------------------------------
-    -- Characteristics of time_t type --
-    ------------------------------------
- 
-    time_t_bits : constant := Long_Long_Integer'Size;
-    --  Number of bits in type time_t. Use for targets that are Posix 2008
-    --  compliant (fixes the year 2038 time_t overflow).
- 
-    ----------------------------------------------
-    -- Characteristics of types in Interfaces.C --
-    ----------------------------------------------
- 
-    long_bits : constant := Long_Integer'Size;
-    --  Number of bits in type long and unsigned_long. The normal convention
-    --  is that this is the same as type Long_Integer, but this may not be true
-    --  of all targets.
- 
-    ptr_bits  : constant := Standard'Address_Size;
-    subtype C_Address is System.Address;
-    --  Number of bits in Interfaces.C pointers, normally a standard address
- 
-    C_Malloc_Linkname : constant String := "__gnat_malloc";
-    --  Name of runtime function used to allocate such a pointer
- 
-    ----------------------------------------------
-    -- Behavior of Pragma Finalize_Storage_Only --
-    ----------------------------------------------
- 
-    --  Garbage_Collected is a Boolean constant whose value indicates the
-    --  effect of the pragma Finalize_Storage_Entry on a controlled type.
- 
-    --    Garbage_Collected = False
- 
-    --      The system releases all storage on program termination only,
-    --      but not other garbage collection occurs, so finalization calls
-    --      are omitted only for outer level objects can be omitted if
-    --      pragma Finalize_Storage_Only is used.
- 
-    --    Garbage_Collected = True
- 
-    --      The system provides full garbage collection, so it is never
-    --      necessary to release storage for controlled objects for which
-    --      a pragma Finalize_Storage_Only is used.
- 
-    Garbage_Collected : constant Boolean := False;
-    --  The storage mode for this system (release on program exit)
- 
-    ---------------------
-    -- Tasking Profile --
-    ---------------------
- 
-    --  In the following sections, constant parameters are defined to
-    --  allow some optimizations and fine tuning within the tasking run time
-    --  based on restrictions on the tasking features.
- 
-    -------------------
-    -- Task Abortion --
-    -------------------
- 
-    No_Abort : constant Boolean := False;
-    --  This constant indicates whether abort statements and asynchronous
-    --  transfer of control (ATC) are disallowed. If set to True, it is
-    --  assumed that neither construct is used, and the run time does not
-    --  need to defer/undefer abort and check for pending actions at
-    --  completion points. A value of True for No_Abort corresponds to:
-    --  pragma Restrictions (No_Abort_Statements);
-    --  pragma Restrictions (Max_Asynchronous_Select_Nesting => 0);
- 
-    ---------------------
-    -- Task Attributes --
-    ---------------------
- 
-    Max_Attribute_Count : constant := 32;
-    --  Number of task attributes stored in the task control block
- 
-    -----------------------
-    -- Task Image Length --
-    -----------------------
- 
-    Max_Task_Image_Length : constant := 256;
-    --  This constant specifies the maximum length of a task's image
- 
-    ------------------------------
-    -- Exception Message Length --
-    ------------------------------
- 
-    Default_Exception_Msg_Max_Length : constant := 200;
-    --  This constant specifies the default number of characters to allow
-    --  in an exception message (200 is minimum required by RM 11.4.1(18)).
- 
- end System.Parameters;
--- 0 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/s-parame__vxworks.ads gcc-16-20250921/gcc/ada/libgnat/s-parame__vxworks.ads
*** gcc-16-20250914/gcc/ada/libgnat/s-parame__vxworks.ads	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/s-parame__vxworks.ads	Sun Sep 21 22:32:35 2025
*************** package System.Parameters is
*** 98,118 ****
     --  Indicates if secondary stacks can grow and shrink at run-time. If False,
     --  the size of a secondary stack is fixed at the point of its creation.
  
-    ------------------------------------
-    -- Characteristics of time_t type --
-    ------------------------------------
- 
-    --  IMPORTANT NOTE:
-    --  Select the appropriate time_t_bits for the VSB in use, then rebuild
-    --  the runtime using instructions in adainclude/libada.gpr.
- 
-    --  time_t_bits : constant := Long_Integer'Size;
-    --  Number of bits in type time_t for SR0650 and before and SR0660 with
-    --  non-default configuration.
- 
-    time_t_bits : constant := Long_Long_Integer'Size;
-    --  Number of bits in type time_t for SR0660 with default configuration.
- 
     ----------------------------------------------
     -- Characteristics of types in Interfaces.C --
     ----------------------------------------------
--- 98,103 ----
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/s-putima.adb gcc-16-20250921/gcc/ada/libgnat/s-putima.adb
*** gcc-16-20250914/gcc/ada/libgnat/s-putima.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/s-putima.adb	Sun Sep 21 22:32:35 2025
*************** package body System.Put_Images is
*** 159,164 ****
--- 159,174 ----
        Fat_Instance (S, X, "access");
     end Put_Image_Fat_Pointer;
  
+    procedure Ext_Acc_Instance is new
+      Put_Image_Pointer (Byte_String, Ext_Access_Pointer);
+ 
+    procedure Put_Image_Extended_Access_Pointer
+      (S : in out Sink'Class; X : Ext_Access_Pointer)
+    is
+    begin
+       Ext_Acc_Instance (S, X, "extended access");
+    end Put_Image_Extended_Access_Pointer;
+ 
     procedure Put_Image_Access_Subp (S : in out Sink'Class; X : Thin_Pointer) is
     begin
        Thin_Instance (S, X, "access subprogram");
diff -Nrcpad gcc-16-20250914/gcc/ada/libgnat/s-putima.ads gcc-16-20250921/gcc/ada/libgnat/s-putima.ads
*** gcc-16-20250914/gcc/ada/libgnat/s-putima.ads	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/libgnat/s-putima.ads	Sun Sep 21 22:32:35 2025
*************** package System.Put_Images with Pure is
*** 72,81 ****
     type Byte_String is array (Positive range <>) of Byte with Alignment => 1;
     type Thin_Pointer is access all Byte with Storage_Size => 0;
     type Fat_Pointer is access all Byte_String with Storage_Size => 0;
     procedure Put_Image_Thin_Pointer (S : in out Sink'Class; X : Thin_Pointer);
     procedure Put_Image_Fat_Pointer (S : in out Sink'Class; X : Fat_Pointer);
!    --  Print "null", or the address of the designated object as an unsigned
!    --  hexadecimal integer.
  
     procedure Put_Image_Access_Subp (S : in out Sink'Class; X : Thin_Pointer);
     --  For access-to-subprogram types
--- 72,91 ----
     type Byte_String is array (Positive range <>) of Byte with Alignment => 1;
     type Thin_Pointer is access all Byte with Storage_Size => 0;
     type Fat_Pointer is access all Byte_String with Storage_Size => 0;
+    type Ext_Access_Pointer is access all Byte_String with Storage_Size => 0;
+ 
     procedure Put_Image_Thin_Pointer (S : in out Sink'Class; X : Thin_Pointer);
+    --  Print "(access)" followed by "null", or the address of the designated
+    --  object as an unsigned hexadecimal integer.
+ 
     procedure Put_Image_Fat_Pointer (S : in out Sink'Class; X : Fat_Pointer);
!    --  Print "(access)" followed by "null", or the address of the designated
!    --  object as an unsigned hexadecimal integer.
! 
!    procedure Put_Image_Extended_Access_Pointer
!      (S : in out Sink'Class; X : Ext_Access_Pointer);
!    --  Print "(extended access)" followed by "null", or the address of the
!    --  designated object as an unsigned hexadecimal integer.
  
     procedure Put_Image_Access_Subp (S : in out Sink'Class; X : Thin_Pointer);
     --  For access-to-subprogram types
diff -Nrcpad gcc-16-20250914/gcc/ada/opt.ads gcc-16-20250921/gcc/ada/opt.ads
*** gcc-16-20250914/gcc/ada/opt.ads	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/opt.ads	Sun Sep 21 22:32:35 2025
*************** package Opt is
*** 767,772 ****
--- 767,778 ----
  
        Current_Region : Node_Id := Empty;
        --  Latest ghost region
+ 
+       Is_Inside_Statement_Or_Pragma : Boolean := False;
+       --  A flag to tag whether we are currently in a region that originated
+       --  from a Statement or a pragma. Inside those regions the ghost policy
+       --  in effect for implicitly defined entities is not the policy for Ghost
+       --  but instead the policy for the region (SPARK RM 6.9 (3)).
     end record;
  
     Ghost_Config : Ghost_Config_Type;
diff -Nrcpad gcc-16-20250914/gcc/ada/par-ch10.adb gcc-16-20250921/gcc/ada/par-ch10.adb
*** gcc-16-20250914/gcc/ada/par-ch10.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/par-ch10.adb	Sun Sep 21 22:32:35 2025
*************** package body Ch10 is
*** 925,931 ****
                    --  then the compilation of the child unit itself is the
                    --  place where such an "error" should be caught.
  
!                   Set_Name (With_Node, P_Qualified_Simple_Name);
                    if Name (With_Node) = Error then
                       Remove (With_Node);
                    end if;
--- 925,931 ----
                    --  then the compilation of the child unit itself is the
                    --  place where such an "error" should be caught.
  
!                   Set_Name (With_Node, P_Library_Unit_Name);
                    if Name (With_Node) = Error then
                       Remove (With_Node);
                    end if;
*************** package body Ch10 is
*** 1038,1044 ****
        Scan; -- past SEPARATE;
  
        U_Left_Paren;
!       Set_Name (Subunit_Node, P_Qualified_Simple_Name);
        U_Right_Paren;
  
        Ignore (Tok_Semicolon);
--- 1038,1044 ----
        Scan; -- past SEPARATE;
  
        U_Left_Paren;
!       Set_Name (Subunit_Node, P_Parent_Unit_Name);
        U_Right_Paren;
  
        Ignore (Tok_Semicolon);
diff -Nrcpad gcc-16-20250914/gcc/ada/par-ch12.adb gcc-16-20250921/gcc/ada/par-ch12.adb
*** gcc-16-20250914/gcc/ada/par-ch12.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/par-ch12.adb	Sun Sep 21 22:32:35 2025
*************** package body Ch12 is
*** 124,129 ****
--- 124,131 ----
              Check_Misspelling_Of (Tok_Renames);
  
              if Token = Tok_Renames then
+                Scan; -- past RENAMES
+ 
                 if Ren_Token = Tok_Package then
                    Decl_Node := New_Node
                      (N_Generic_Package_Renaming_Declaration, Gen_Sloc);
*************** package body Ch12 is
*** 137,146 ****
                      (N_Generic_Function_Renaming_Declaration, Gen_Sloc);
                 end if;
  
-                Scan; -- past RENAMES
                 Set_Defining_Unit_Name (Decl_Node, Def_Unit);
!                Set_Name (Decl_Node, P_Name);
! 
                 P_Aspect_Specifications (Decl_Node, Semicolon => False);
                 TF_Semicolon;
                 return Decl_Node;
--- 139,146 ----
                      (N_Generic_Function_Renaming_Declaration, Gen_Sloc);
                 end if;
  
                 Set_Defining_Unit_Name (Decl_Node, Def_Unit);
!                Set_Name (Decl_Node, P_Generic_Unit_Name);
                 P_Aspect_Specifications (Decl_Node, Semicolon => False);
                 TF_Semicolon;
                 return Decl_Node;
*************** package body Ch12 is
*** 944,950 ****
           Set_Interface_List (Def_Node, New_List);
  
           loop
!             Append (P_Qualified_Simple_Name, Interface_List (Def_Node));
              exit when Token /= Tok_And;
              Scan; -- past AND
           end loop;
--- 944,950 ----
           Set_Interface_List (Def_Node, New_List);
  
           loop
!             Append (P_Subtype_Name, Interface_List (Def_Node));
              exit when Token /= Tok_And;
              Scan; -- past AND
           end loop;
*************** package body Ch12 is
*** 1285,1291 ****
        Set_Defining_Identifier (Def_Node, P_Defining_Identifier (C_Is));
        T_Is;
        T_New;
!       Set_Name (Def_Node, P_Qualified_Simple_Name);
  
        if Token = Tok_Left_Paren then
           Save_Scan_State (Scan_State); -- at the left paren
--- 1285,1291 ----
        Set_Defining_Identifier (Def_Node, P_Defining_Identifier (C_Is));
        T_Is;
        T_New;
!       Set_Name (Def_Node, P_Generic_Unit_Name);
  
        if Token = Tok_Left_Paren then
           Save_Scan_State (Scan_State); -- at the left paren
diff -Nrcpad gcc-16-20250914/gcc/ada/par-ch3.adb gcc-16-20250921/gcc/ada/par-ch3.adb
*** gcc-16-20250914/gcc/ada/par-ch3.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/par-ch3.adb	Sun Sep 21 22:32:35 2025
*************** package body Ch3 is
*** 1092,1098 ****
           return Error;
  
        else
!          Type_Node := P_Qualified_Simple_Name_Resync;
  
           --  Check for a subtype mark attribute. The only valid possibilities
           --  are 'CLASS and 'BASE. Anything else is a definite error. We may
--- 1092,1098 ----
           return Error;
  
        else
!          Type_Node := P_Subtype_Name_Resync;
  
           --  Check for a subtype mark attribute. The only valid possibilities
           --  are 'CLASS and 'BASE. Anything else is a definite error. We may
*************** package body Ch3 is
*** 1704,1710 ****
                 No_List;
                 Decl_Node :=
                   New_Node (N_Exception_Renaming_Declaration, Ident_Sloc);
!                Set_Name (Decl_Node, P_Qualified_Simple_Name_Resync);
                 No_Constraint;
              else
                 Decl_Node := New_Node (N_Exception_Declaration, Prev_Token_Ptr);
--- 1704,1710 ----
                 No_List;
                 Decl_Node :=
                   New_Node (N_Exception_Renaming_Declaration, Ident_Sloc);
!                Set_Name (Decl_Node, P_Exception_Name);
                 No_Constraint;
              else
                 Decl_Node := New_Node (N_Exception_Declaration, Prev_Token_Ptr);
*************** package body Ch3 is
*** 2054,2060 ****
           Set_Interface_List (Typedef_Node, New_List);
  
           loop
!             Append (P_Qualified_Simple_Name, Interface_List (Typedef_Node));
              exit when Token /= Tok_And;
              Scan; -- past AND
           end loop;
--- 2054,2060 ----
           Set_Interface_List (Typedef_Node, New_List);
  
           loop
!             Append (P_Subtype_Name, Interface_List (Typedef_Node));
              exit when Token /= Tok_And;
              Scan; -- past AND
           end loop;
*************** package body Ch3 is
*** 4177,4183 ****
  
           Set_Abstract_Present   (Typedef_Node);
           Set_Interface_Present  (Typedef_Node);
!          Set_Subtype_Indication (Typedef_Node, P_Qualified_Simple_Name);
  
           Set_Record_Extension_Part (Typedef_Node,
             New_Node (N_Record_Definition, Token_Ptr));
--- 4177,4183 ----
  
           Set_Abstract_Present   (Typedef_Node);
           Set_Interface_Present  (Typedef_Node);
!          Set_Subtype_Indication (Typedef_Node, P_Subtype_Name);
  
           Set_Record_Extension_Part (Typedef_Node,
             New_Node (N_Record_Definition, Token_Ptr));
*************** package body Ch3 is
*** 4188,4195 ****
              Scan; -- past AND
  
              loop
!                Append (P_Qualified_Simple_Name,
!                        Interface_List (Typedef_Node));
                 exit when Token /= Tok_And;
                 Scan; -- past AND
              end loop;
--- 4188,4194 ----
              Scan; -- past AND
  
              loop
!                Append (P_Subtype_Name, Interface_List (Typedef_Node));
                 exit when Token /= Tok_And;
                 Scan; -- past AND
              end loop;
diff -Nrcpad gcc-16-20250914/gcc/ada/par-ch4.adb gcc-16-20250921/gcc/ada/par-ch4.adb
*** gcc-16-20250914/gcc/ada/par-ch4.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/par-ch4.adb	Sun Sep 21 22:32:35 2025
*************** package body Ch4 is
*** 82,89 ****
     function P_Relation                              return Node_Id;
     function P_Term                                  return Node_Id;
     function P_Declare_Expression                    return Node_Id;
-    function P_Reduction_Attribute_Reference (S : Node_Id)
-       return Node_Id;
  
     function P_Binary_Adding_Operator                return Node_Kind;
     function P_Logical_Operator                      return Node_Kind;
--- 82,87 ----
*************** package body Ch4 is
*** 91,96 ****
--- 89,97 ----
     function P_Relational_Operator                   return Node_Kind;
     function P_Unary_Adding_Operator                 return Node_Kind;
  
+    function P_Simple_Name        (Instance_OK : Boolean) return Node_Id;
+    function P_Simple_Name_Resync (Instance_OK : Boolean) return Node_Id;
+ 
     procedure Bad_Range_Attribute (Loc : Source_Ptr);
     --  Called to place complaint about bad range attribute at the given
     --  source location. Terminates by raising Error_Resync.
*************** package body Ch4 is
*** 108,113 ****
--- 109,118 ----
     --  prefix. The current token is known to be an apostrophe and the
     --  following token is known to be RANGE.
  
+    function P_Reduction_Attribute_Reference (Pref : Node_Id) return Node_Id;
+    --  Scan a reduction attribute reference. The caller has scanned out the
+    --  prefix. The current token is known to be an identifier.
+ 
     function P_Case_Expression return Node_Id;
     --  Scans out a case expression. Called with Token pointing to the CASE
     --  keyword, and returns pointing to the terminating right parent,
*************** package body Ch4 is
*** 152,160 ****
     --  NAME ::=
     --    DIRECT_NAME        | EXPLICIT_DEREFERENCE
     --  | INDEXED_COMPONENT  | SLICE
!    --  | SELECTED_COMPONENT | ATTRIBUTE
     --  | TYPE_CONVERSION    | FUNCTION_CALL
     --  | CHARACTER_LITERAL  | TARGET_NAME
  
     --  DIRECT_NAME ::= IDENTIFIER | OPERATOR_SYMBOL
  
--- 157,166 ----
     --  NAME ::=
     --    DIRECT_NAME        | EXPLICIT_DEREFERENCE
     --  | INDEXED_COMPONENT  | SLICE
!    --  | SELECTED_COMPONENT | ATTRIBUTE_REFERENCE
     --  | TYPE_CONVERSION    | FUNCTION_CALL
     --  | CHARACTER_LITERAL  | TARGET_NAME
+    --  | STRUCTURAL_GENERIC_INSTANCE_NAME
  
     --  DIRECT_NAME ::= IDENTIFIER | OPERATOR_SYMBOL
  
*************** package body Ch4 is
*** 192,197 ****
--- 198,205 ----
  
     --  TARGET_NAME ::= @   (AI12-0125-3: abbreviation for LHS)
  
+    --  STRUCTURAL_GENERIC_INSTANCE_NAME ::= NAME GENERIC_ACTUAL_PART
+ 
     --  Note: syntactically a procedure call looks just like a function call,
     --  so this routine is in practice used to scan out procedure calls as well.
  
*************** package body Ch4 is
*** 683,688 ****
--- 691,697 ----
  
        --      If there is at least one occurrence of identifier => (but
        --      none of the other cases apply), then we have a call.
+       --      This case is handled by LP_State_Call.
  
        --  Test for Id => case
  
*************** package body Ch4 is
*** 902,909 ****
        --  have seen at least one named parameter already.
  
        Error_Msg_SC
!          ("positional parameter association " &
!            "not allowed after named one");
  
        Error_Loc := Token_Ptr;
  
--- 911,917 ----
        --  have seen at least one named parameter already.
  
        Error_Msg_SC
!         ("positional parameter association not allowed after named one");
  
        Error_Loc := Token_Ptr;
  
*************** package body Ch4 is
*** 929,1007 ****
  
     end P_Name;
  
     --  This function parses a restricted form of Names which are either
!    --  designators, or designators preceded by a sequence of prefixes
!    --  that are direct names.
  
     --  Error recovery: cannot raise Error_Resync
  
!    function P_Qualified_Simple_Name return Node_Id is
     begin
!       return P_Qualified_Simple_Name_Resync;
     exception
        when Error_Resync =>
           return Error;
!    end P_Qualified_Simple_Name;
  
!    --  This procedure differs from P_Qualified_Simple_Name only in that it
!    --  raises Error_Resync if any error is encountered. It only returns after
!    --  scanning a valid qualified simple name.
  
     --  Error recovery: can raise Error_Resync
  
!    function P_Qualified_Simple_Name_Resync return Node_Id is
!       Designator_Node : Node_Id;
!       Prefix_Node     : Node_Id;
!       Selector_Node   : Node_Id;
!       Dot_Sloc        : Source_Ptr := No_Location;
  
     begin
!       --  Prefix_Node is set to the gathered prefix so far, Empty means that
!       --  no prefix has been scanned. This allows us to build up the result
!       --  in the required right recursive manner.
  
!       Prefix_Node := Empty;
  
!       --  Loop through prefixes
  
!       loop
!          Designator_Node := Token_Node;
  
!          if Token not in Token_Class_Desig then
!             Discard_Junk_Node (P_Identifier); -- to issue the error message
!             raise Error_Resync;
  
!          else
!             Scan; -- past designator
!             exit when Token /= Tok_Dot;
!          end if;
  
!          --  Here at a dot, with token just before it in Designator_Node
  
-          if No (Prefix_Node) then
-             Prefix_Node := Designator_Node;
           else
!             Selector_Node := New_Node (N_Selected_Component, Dot_Sloc);
!             Set_Prefix (Selector_Node, Prefix_Node);
!             Set_Selector_Name (Selector_Node, Designator_Node);
!             Prefix_Node := Selector_Node;
           end if;
  
!          Dot_Sloc := Token_Ptr;
!          Scan; -- past dot
!       end loop;
  
!       --  Fall out of the loop having just scanned an identifier
  
-       if No (Prefix_Node) then
-          return Designator_Node;
        else
!          Selector_Node := New_Node (N_Selected_Component, Dot_Sloc);
!          Set_Prefix (Selector_Node, Prefix_Node);
!          Set_Selector_Name (Selector_Node, Designator_Node);
!          return Selector_Node;
        end if;
!    end P_Qualified_Simple_Name_Resync;
  
     ----------------------
     -- 4.1  Direct_Name --
--- 937,1226 ----
  
     end P_Name;
  
+    --  These functions parse a restricted form of Names which are either
+    --  designators or structural generic instance names, and are preceded,
+    --  or not, by a sequence of prefixes that are either direct names or
+    --  structural generic instance names.
+ 
+    --  Error recovery: can raise Error_Resync
+ 
+    function P_Exception_Name return Node_Id is
+    begin
+       return P_Simple_Name_Resync (Instance_OK => False);
+    end P_Exception_Name;
+ 
+    function P_Label_Name return Node_Id is
+    begin
+       return P_Simple_Name_Resync (Instance_OK => False);
+    end P_Label_Name;
+ 
+    function P_Loop_Name return Node_Id is
+    begin
+       return P_Simple_Name_Resync (Instance_OK => False);
+    end P_Loop_Name;
+ 
+    function P_Subtype_Name_Resync return Node_Id is
+    begin
+       return P_Simple_Name_Resync (Instance_OK => False);
+    end P_Subtype_Name_Resync;
+ 
+    --  Error recovery: cannot raise Error_Resync
+ 
+    function P_Generic_Unit_Name return Node_Id is
+    begin
+       return P_Simple_Name (Instance_OK => False);
+    end P_Generic_Unit_Name;
+ 
+    function P_Library_Unit_Name return Node_Id is
+    begin
+       return P_Simple_Name (Instance_OK => False);
+    end P_Library_Unit_Name;
+ 
+    function P_Package_Name return Node_Id is
+    begin
+       return P_Simple_Name (Instance_OK => True);
+    end P_Package_Name;
+ 
+    function P_Parent_Unit_Name return Node_Id is
+    begin
+       return P_Simple_Name (Instance_OK => False);
+    end P_Parent_Unit_Name;
+ 
+    function P_Subtype_Name return Node_Id is
+    begin
+       return P_Simple_Name (Instance_OK => False);
+    end P_Subtype_Name;
+ 
     --  This function parses a restricted form of Names which are either
!    --  designators or structural generic instance names, and are preceded,
!    --  or not, by a sequence of prefixes that are either direct names or
!    --  structural generic instance names.
! 
!    --  If Instance_OK is False, the simple name cannot be a structural
!    --  generic instance name, preceded or not by prefixes (Instance_OK
!    --  has no effects on the accepted prefixes, if any).
  
     --  Error recovery: cannot raise Error_Resync
  
!    function P_Simple_Name (Instance_OK : Boolean) return Node_Id is
     begin
!       return P_Simple_Name_Resync (Instance_OK);
     exception
        when Error_Resync =>
           return Error;
!    end P_Simple_Name;
  
!    --  This procedure differs from P_Simple_Name only in that it raises
!    --  Error_Resync if any error is encountered. It only returns after
!    --  scanning a valid simple name.
  
     --  Error recovery: can raise Error_Resync
  
!    function P_Simple_Name_Resync (Instance_OK : Boolean) return Node_Id is
!       Arg_Node      : Node_Id;
!       Ident_Node    : Node_Id;
!       Name_Node     : Node_Id;
!       Prefix_Node   : Node_Id;
!       Scan_State_Id : Saved_Scan_State;
!       Scan_State_LP : Saved_Scan_State;
! 
!       Arg_List  : List_Id := No_List; -- kill junk warning
  
     begin
!       --  Case of not a designator
  
!       if Token not in Token_Class_Desig then
!          Discard_Junk_Node (P_Identifier); -- to issue the error message
!          raise Error_Resync;
!       end if;
  
!       Name_Node := Token_Node;
  
!       Scan; -- past designator
  
!       --  Loop scanning past name extensions. A label is used for control
!       --  transfer for this loop for ease of interfacing with the finite state
!       --  machine in the parenthesis scanning circuit, and also to allow for
!       --  passing in control to the appropriate point from the above code.
  
!       <<Scan_Name_Extension>>
  
!       case Token is
!          when Tok_Left_Paren =>
!             Save_Scan_State (Scan_State_LP); -- at left paren
!             Scan; -- past left paren
!             Arg_List := New_List;
!             goto Scan_Name_Extension_Left_Paren;
! 
!          when Tok_Dot =>
!             Scan; -- past dot
!             goto Scan_Name_Extension_Dot;
! 
!          when others =>
!             return Name_Node;
!       end case;
! 
!       --  Case of name extended by dot (selection), dot is already skipped
!       --  and the scan state at the point of the dot is saved in Scan_State.
! 
!       <<Scan_Name_Extension_Dot>>
! 
!       if Token in Token_Class_Desig then
!          Prefix_Node := Name_Node;
!          Name_Node := New_Node (N_Selected_Component, Prev_Token_Ptr);
!          Set_Prefix (Name_Node, Prefix_Node);
!          Set_Selector_Name (Name_Node, Token_Node);
!          Scan; -- past selector
!          goto Scan_Name_Extension;
! 
!       --  Here if nothing legal after the dot
! 
!       else
!          Discard_Junk_Node (P_Identifier); -- to issue the error message
!          raise Error_Resync;
!       end if;
! 
!       --  Here for left parenthesis extending name (left paren skipped)
! 
!       <<Scan_Name_Extension_Left_Paren>>
! 
!       --  We now have to scan through a list of items, terminated by a
!       --  right parenthesis. The scan is handled by a finite state
!       --  machine. The possibilities are:
! 
!       --   (expression, expression, ..)
! 
!       --      This is interpreted as an indexed component, i.e. as a
!       --      case of a name which can be extended in the normal manner.
!       --      This case is handled by LP_State_Expr.
! 
!       --      Note: if and case expressions (without an extra level of
!       --      parentheses) are permitted in this context).
! 
!       --   (..., identifier => expression , ...)
! 
!       --      If there is at least one occurrence of identifier => (but
!       --      none of the other cases apply), then we have a call.
!       --      This case is handled by LP_State_Call.
! 
!       --  Test for Id => case
! 
!       if Token in Tok_Identifier | Tok_Operator_Symbol | Tok_Others then
!          Save_Scan_State (Scan_State_Id); -- at Id
!          Scan; -- past Id
! 
!          --  Test for => (allow := as an error substitute)
! 
!          if Token in Tok_Arrow | Tok_Colon_Equal then
!             Restore_Scan_State (Scan_State_Id); -- to Id
!             goto LP_State_Call;
  
           else
!             Restore_Scan_State (Scan_State_Id); -- to Id
           end if;
+       end if;
  
!       --  Here we have an expression after all
  
!       <<LP_State_Expr>>
! 
!       if Token in Tok_Box | Tok_Right_Paren then
!          goto LP_State_Rewind;
!       end if;
! 
!       Append (P_Expression_Or_Range_Attribute_If_OK, Arg_List);
! 
!       if Token = Tok_Comma then
!          Scan; -- past comma
!          goto Scan_Name_Extension_Left_Paren;
! 
!       elsif Token = Tok_Right_Paren then
!          Scan; -- past right paren
! 
!          if not Instance_OK and then Token /= Tok_Dot then
!             goto LP_State_Rewind;
!          end if;
! 
!          Prefix_Node := Name_Node;
!          Name_Node := New_Node (N_Indexed_Component, Sloc (Prefix_Node));
!          Set_Prefix (Name_Node, Prefix_Node);
!          Set_Expressions (Name_Node, Arg_List);
!          goto Scan_Name_Extension;
  
        else
!          goto LP_State_Rewind;
        end if;
! 
!       --  LP_State_Call corresponds to the situation in which at least one
!       --  instance of Id => Expression has been encountered, so we know that
!       --  we do not have a name, but rather a call. We enter it with the
!       --  scan pointer pointing to the next argument to scan, and Arg_List
!       --  containing the list of arguments scanned so far.
! 
!       <<LP_State_Call>>
! 
!       --  Test for case of Id => Expression (named parameter)
! 
!       if Token in Tok_Identifier | Tok_Operator_Symbol | Tok_Others then
!          Save_Scan_State (Scan_State_Id); -- at Id
!          Ident_Node := Token_Node;
!          Scan; -- past Id
! 
!          --  Deal with => (allow := as incorrect substitute)
! 
!          if Token in Tok_Arrow | Tok_Colon_Equal then
!             Arg_Node := New_Node (N_Parameter_Association, Prev_Token_Ptr);
!             T_Arrow;
!             if Token in Tok_Box then
!                goto LP_State_Rewind;
!             end if;
!             Set_Selector_Name (Arg_Node, Ident_Node);
!             Set_Explicit_Actual_Parameter (Arg_Node, P_Expression);
!             Append (Arg_Node, Arg_List);
! 
!             --  If a comma follows, go back and scan next entry
! 
!             if Comma_Present then
!                goto LP_State_Call;
! 
!             --  Otherwise we have the end of a call
! 
!             else
!                T_Right_Paren; -- past right paren
! 
!                if not Instance_OK and then Token /= Tok_Dot then
!                   goto LP_State_Rewind;
!                end if;
! 
!                Prefix_Node := Name_Node;
!                Name_Node := New_Node (N_Function_Call, Sloc (Prefix_Node));
!                Set_Name (Name_Node, Prefix_Node);
!                Set_Parameter_Associations (Name_Node, Arg_List);
!                goto Scan_Name_Extension;
!             end if;
! 
!          --  Filter out tokens that may appear in constraints
! 
!          elsif Token in Tok_Vertical_Bar then
!             goto LP_State_Rewind;
! 
!          --  Not named parameter: Id started an expression after all
! 
!          else
!             Restore_Scan_State (Scan_State_Id); -- to Id
!          end if;
!       end if;
! 
!       --  Here if entry did not start with Id => which means that it
!       --  is a positional parameter, which is not allowed, since we
!       --  have seen at least one named parameter already.
! 
!       goto LP_State_Expr;
! 
!       <<LP_State_Rewind>>
!       Restore_Scan_State (Scan_State_LP);
!       return Name_Node;
!    end P_Simple_Name_Resync;
  
     ----------------------
     -- 4.1  Direct_Name --
*************** package body Ch4 is
*** 1117,1123 ****
     -- P_Reduction_Attribute_Reference --
     -------------------------------------
  
!    function P_Reduction_Attribute_Reference (S : Node_Id)
        return Node_Id
     is
        Attr_Node  : Node_Id;
--- 1336,1342 ----
     -- P_Reduction_Attribute_Reference --
     -------------------------------------
  
!    function P_Reduction_Attribute_Reference (Pref : Node_Id)
        return Node_Id
     is
        Attr_Node  : Node_Id;
*************** package body Ch4 is
*** 1132,1138 ****
           Error_Msg ("Reduce attribute expected", Prev_Token_Ptr);
        end if;
  
!       Set_Prefix (Attr_Node, S);
        Set_Expressions (Attr_Node, New_List);
        T_Left_Paren;
        Append (P_Name, Expressions (Attr_Node));
--- 1351,1357 ----
           Error_Msg ("Reduce attribute expected", Prev_Token_Ptr);
        end if;
  
!       Set_Prefix (Attr_Node, Pref);
        Set_Expressions (Attr_Node, New_List);
        T_Left_Paren;
        Append (P_Name, Expressions (Attr_Node));
*************** package body Ch4 is
*** 3399,3405 ****
          and then Token = Tok_Identifier
        then
           Save_Scan_State (Scan_State);
!          Type_Node := P_Qualified_Simple_Name_Resync;
           if Token = Tok_Apostrophe then
              Scan;
              if Token_Name = Name_Make then
--- 3618,3624 ----
          and then Token = Tok_Identifier
        then
           Save_Scan_State (Scan_State);
!          Type_Node := P_Subtype_Name_Resync;
           if Token = Tok_Apostrophe then
              Scan;
              if Token_Name = Name_Make then
diff -Nrcpad gcc-16-20250914/gcc/ada/par-ch5.adb gcc-16-20250921/gcc/ada/par-ch5.adb
*** gcc-16-20250914/gcc/ada/par-ch5.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/par-ch5.adb	Sun Sep 21 22:32:35 2025
*************** package body Ch5 is
*** 2042,2048 ****
     begin
        Goto_Node := New_Node (N_Goto_Statement, Token_Ptr);
        Scan; -- past GOTO (or TO)
!       Set_Name (Goto_Node, P_Qualified_Simple_Name_Resync);
        Append_Elmt (Goto_Node, Goto_List);
  
        if Token = Tok_When then
--- 2042,2048 ----
     begin
        Goto_Node := New_Node (N_Goto_Statement, Token_Ptr);
        Scan; -- past GOTO (or TO)
!       Set_Name (Goto_Node, P_Label_Name);
        Append_Elmt (Goto_Node, Goto_List);
  
        if Token = Tok_When then
*************** package body Ch5 is
*** 2393,2399 ****
        Scan; -- past EXIT or CONTINUE
  
        if Token = Tok_Identifier then
!          Set_Name (N, P_Qualified_Simple_Name);
        elsif Style_Check and then Nkind (N) = N_Exit_Statement then
           --  This statement has no name, so check that
           --  the innermost loop is unnamed too.
--- 2393,2399 ----
        Scan; -- past EXIT or CONTINUE
  
        if Token = Tok_Identifier then
!          Set_Name (N, P_Loop_Name);
        elsif Style_Check and then Nkind (N) = N_Exit_Statement then
           --  This statement has no name, so check that
           --  the innermost loop is unnamed too.
diff -Nrcpad gcc-16-20250914/gcc/ada/par-ch6.adb gcc-16-20250921/gcc/ada/par-ch6.adb
*** gcc-16-20250914/gcc/ada/par-ch6.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/par-ch6.adb	Sun Sep 21 22:32:35 2025
*************** package body Ch6 is
*** 366,373 ****
                 Inst_Node := New_Node (N_Procedure_Instantiation, Fproc_Sloc);
              end if;
  
-             Set_Name (Inst_Node, P_Qualified_Simple_Name);
              Set_Defining_Unit_Name (Inst_Node, Name_Node);
              Set_Generic_Associations (Inst_Node, P_Generic_Actual_Part_Opt);
              P_Aspect_Specifications (Inst_Node, Semicolon => True);
              Pop_Scope_Stack; -- Don't need scope stack entry in this case
--- 366,373 ----
                 Inst_Node := New_Node (N_Procedure_Instantiation, Fproc_Sloc);
              end if;
  
              Set_Defining_Unit_Name (Inst_Node, Name_Node);
+             Set_Name (Inst_Node, P_Generic_Unit_Name);
              Set_Generic_Associations (Inst_Node, P_Generic_Actual_Part_Opt);
              P_Aspect_Specifications (Inst_Node, Semicolon => True);
              Pop_Scope_Stack; -- Don't need scope stack entry in this case
diff -Nrcpad gcc-16-20250914/gcc/ada/par-ch7.adb gcc-16-20250921/gcc/ada/par-ch7.adb
*** gcc-16-20250914/gcc/ada/par-ch7.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/par-ch7.adb	Sun Sep 21 22:32:35 2025
*************** package body Ch7 is
*** 187,193 ****
              Package_Node :=
                New_Node (N_Package_Renaming_Declaration, Package_Sloc);
              Set_Defining_Unit_Name (Package_Node, Name_Node);
!             Set_Name (Package_Node, P_Qualified_Simple_Name);
  
              No_Constraint;
              P_Aspect_Specifications (Package_Node, Semicolon => False);
--- 187,193 ----
              Package_Node :=
                New_Node (N_Package_Renaming_Declaration, Package_Sloc);
              Set_Defining_Unit_Name (Package_Node, Name_Node);
!             Set_Name (Package_Node, P_Package_Name);
  
              No_Constraint;
              P_Aspect_Specifications (Package_Node, Semicolon => False);
*************** package body Ch7 is
*** 224,230 ****
                 Package_Node :=
                   New_Node (N_Package_Instantiation, Package_Sloc);
                 Set_Defining_Unit_Name (Package_Node, Name_Node);
!                Set_Name (Package_Node, P_Qualified_Simple_Name);
                 Set_Generic_Associations
                   (Package_Node, P_Generic_Actual_Part_Opt);
  
--- 224,230 ----
                 Package_Node :=
                   New_Node (N_Package_Instantiation, Package_Sloc);
                 Set_Defining_Unit_Name (Package_Node, Name_Node);
!                Set_Name (Package_Node, P_Generic_Unit_Name);
                 Set_Generic_Associations
                   (Package_Node, P_Generic_Actual_Part_Opt);
  
diff -Nrcpad gcc-16-20250914/gcc/ada/par-ch8.adb gcc-16-20250921/gcc/ada/par-ch8.adb
*** gcc-16-20250914/gcc/ada/par-ch8.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/par-ch8.adb	Sun Sep 21 22:32:35 2025
*************** package body Ch8 is
*** 128,134 ****
  
        loop
           Use_Node := New_Node (N_Use_Package_Clause, Use_Sloc);
!          Set_Name (Use_Node, P_Qualified_Simple_Name);
  
           --  Locally chain each name's use-package node
  
--- 128,134 ----
  
        loop
           Use_Node := New_Node (N_Use_Package_Clause, Use_Sloc);
!          Set_Name (Use_Node, P_Package_Name);
  
           --  Locally chain each name's use-package node
  
diff -Nrcpad gcc-16-20250914/gcc/ada/par-ch9.adb gcc-16-20250921/gcc/ada/par-ch9.adb
*** gcc-16-20250914/gcc/ada/par-ch9.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/par-ch9.adb	Sun Sep 21 22:32:35 2025
*************** package body Ch9 is
*** 221,227 ****
                 Set_Interface_List (Task_Node, New_List);
  
                 loop
!                   Append (P_Qualified_Simple_Name, Interface_List (Task_Node));
                    exit when Token /= Tok_And;
                    Scan; --  past AND
                 end loop;
--- 221,227 ----
                 Set_Interface_List (Task_Node, New_List);
  
                 loop
!                   Append (P_Subtype_Name, Interface_List (Task_Node));
                    exit when Token /= Tok_And;
                    Scan; --  past AND
                 end loop;
*************** package body Ch9 is
*** 557,564 ****
              Set_Interface_List (Protected_Node, New_List);
  
              loop
!                Append (P_Qualified_Simple_Name,
!                  Interface_List (Protected_Node));
  
                 exit when Token /= Tok_And;
                 Scan; --  past AND
--- 557,563 ----
              Set_Interface_List (Protected_Node, New_List);
  
              loop
!                Append (P_Subtype_Name, Interface_List (Protected_Node));
  
                 exit when Token /= Tok_And;
                 Scan; --  past AND
diff -Nrcpad gcc-16-20250914/gcc/ada/par.adb gcc-16-20250921/gcc/ada/par.adb
*** gcc-16-20250914/gcc/ada/par.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/par.adb	Sun Sep 21 22:32:35 2025
*************** function Par (Configuration_Pragmas : Bo
*** 829,836 ****
        function P_Expression                           return Node_Id;
        function P_Expression_Or_Range_Attribute        return Node_Id;
        function P_Name                                 return Node_Id;
!       function P_Qualified_Simple_Name                return Node_Id;
!       function P_Qualified_Simple_Name_Resync         return Node_Id;
        function P_Simple_Expression                    return Node_Id;
        function P_Simple_Expression_Or_Range_Attribute return Node_Id;
  
--- 829,843 ----
        function P_Expression                           return Node_Id;
        function P_Expression_Or_Range_Attribute        return Node_Id;
        function P_Name                                 return Node_Id;
!       function P_Exception_Name                       return Node_Id;
!       function P_Label_Name                           return Node_Id;
!       function P_Loop_Name                            return Node_Id;
!       function P_Generic_Unit_Name                    return Node_Id;
!       function P_Library_Unit_Name                    return Node_Id;
!       function P_Package_Name                         return Node_Id;
!       function P_Parent_Unit_Name                     return Node_Id;
!       function P_Subtype_Name                         return Node_Id;
!       function P_Subtype_Name_Resync                  return Node_Id;
        function P_Simple_Expression                    return Node_Id;
        function P_Simple_Expression_Or_Range_Attribute return Node_Id;
  
diff -Nrcpad gcc-16-20250914/gcc/ada/rtsfind.ads gcc-16-20250921/gcc/ada/rtsfind.ads
*** gcc-16-20250914/gcc/ada/rtsfind.ads	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/rtsfind.ads	Sun Sep 21 22:32:35 2025
*************** package Rtsfind is
*** 1660,1665 ****
--- 1660,1666 ----
       RE_Put_Image_Long_Long_Long_Unsigned, -- System.Put_Images
       RE_Put_Image_Thin_Pointer,          -- System.Put_Images
       RE_Put_Image_Fat_Pointer,           -- System.Put_Images
+      RE_Put_Image_Extended_Access_Pointer, -- System.Put_Images
       RE_Put_Image_Access_Subp,           -- System.Put_Images
       RE_Put_Image_Access_Prot_Subp,      -- System.Put_Images
       RE_Put_Image_String,                -- System.Put_Images
*************** package Rtsfind is
*** 3441,3446 ****
--- 3442,3448 ----
       RE_Put_Image_Long_Long_Long_Unsigned => System_Put_Images,
       RE_Put_Image_Thin_Pointer           => System_Put_Images,
       RE_Put_Image_Fat_Pointer            => System_Put_Images,
+      RE_Put_Image_Extended_Access_Pointer => System_Put_Images,
       RE_Put_Image_Access_Subp            => System_Put_Images,
       RE_Put_Image_Access_Prot_Subp       => System_Put_Images,
       RE_Put_Image_String                 => System_Put_Images,
diff -Nrcpad gcc-16-20250914/gcc/ada/s-oscons-tmplt.c gcc-16-20250921/gcc/ada/s-oscons-tmplt.c
*** gcc-16-20250914/gcc/ada/s-oscons-tmplt.c	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/s-oscons-tmplt.c	Sun Sep 21 22:32:35 2025
*************** CND(SIZEOF_tv_usec, "tv_usec")
*** 1764,1769 ****
--- 1764,1780 ----
  #endif
  CNS(MAX_tv_sec, "")
  }
+ 
+ {
+   struct timespec ts;
+ /*
+    --  Sizes (in bytes) of the components of struct timespec.
+    --  The tv_sec field is the same as in struct timeval.
+ */
+ #define SIZEOF_tv_nsec (sizeof (ts.tv_nsec))
+ CND(SIZEOF_tv_nsec, "tv_nsec");
+ }
+ 
  /*
  
     --  Sizes of various data types
diff -Nrcpad gcc-16-20250914/gcc/ada/sem.ads gcc-16-20250921/gcc/ada/sem.ads
*** gcc-16-20250914/gcc/ada/sem.ads	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/sem.ads	Sun Sep 21 22:32:35 2025
*************** package Sem is
*** 307,312 ****
--- 307,324 ----
     --  case. We could perhaps do a more accurate job and retain some of the
     --  warnings, but it is quite a tricky job.
  
+    Ghost_Context_Checks_Disabled : Boolean := False;
+    --  This flag controls whether ghost context related checks are enabled or
+    --  disabled. Typically they are enabled however they need to be disabled in
+    --  instances where the ghost region context has not been set.
+    --
+    --  Typically this is done for pragmas where the ghostliness of the pragma
+    --  is determined by an entity specified as one of the arguments. In these
+    --  cases we need to analyze that argument before the pragma itself to
+    --  determine the ghostliness of the pragma. However at that point we have
+    --  not set the ghost region for the pragma in order to determine the ghost
+    --  context of the argument.
+ 
     -----------------------------------
     -- Handling of Check Suppression --
     -----------------------------------
diff -Nrcpad gcc-16-20250914/gcc/ada/sem_attr.adb gcc-16-20250921/gcc/ada/sem_attr.adb
*** gcc-16-20250914/gcc/ada/sem_attr.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/sem_attr.adb	Sun Sep 21 22:32:35 2025
*************** package body Sem_Attr is
*** 5179,5188 ****
        when Attribute_Make => declare
           Expr : Entity_Id;
        begin
-          --  Should this be assert? Parsing should fail if it hits 'Make
-          --  and all extensions aren't enabled ???
- 
           if not All_Extensions_Allowed then
              return;
           end if;
  
--- 5179,5186 ----
        when Attribute_Make => declare
           Expr : Entity_Id;
        begin
           if not All_Extensions_Allowed then
+             Error_Msg_GNAT_Extension ("Make attribute", Loc);
              return;
           end if;
  
*************** package body Sem_Attr is
*** 10495,10504 ****
                          Fold_Uint (N, Expr_Value (Expression (S)), Static);
  
                       --  If no size is specified, then we simply use the object
!                      --  size in the VADS_Size case (e.g. Natural'Size is equal
!                      --  to Integer'Size, not one less).
  
!                      else
                          Fold_Uint (N, Esize (P_TypeA), Static);
                       end if;
                    end;
--- 10493,10502 ----
                          Fold_Uint (N, Expr_Value (Expression (S)), Static);
  
                       --  If no size is specified, then we simply use the object
!                      --  size (when known) in the VADS_Size case (for example,
!                      --  Natural'Size is equal to Integer'Size, not one less).
  
!                      elsif Known_Esize (P_TypeA) then
                          Fold_Uint (N, Esize (P_TypeA), Static);
                       end if;
                    end;
diff -Nrcpad gcc-16-20250914/gcc/ada/sem_ch10.adb gcc-16-20250921/gcc/ada/sem_ch10.adb
*** gcc-16-20250914/gcc/ada/sem_ch10.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/sem_ch10.adb	Sun Sep 21 22:32:35 2025
*************** package body Sem_Ch10 is
*** 3169,3181 ****
  
        elsif Unit_Kind = N_Package_Instantiation
          and then Nkind (U) = N_Package_Instantiation
-         and then Present (Instance_Spec (U))
        then
           --  If the instance has not been rewritten as a package declaration,
           --  then it appeared already in a previous with clause. Retrieve
           --  the entity from the previous instance.
  
!          E_Name := Defining_Entity (Specification (Instance_Spec (U)));
  
        elsif Unit_Kind in N_Subprogram_Instantiation then
  
--- 3169,3180 ----
  
        elsif Unit_Kind = N_Package_Instantiation
          and then Nkind (U) = N_Package_Instantiation
        then
           --  If the instance has not been rewritten as a package declaration,
           --  then it appeared already in a previous with clause. Retrieve
           --  the entity from the previous instance.
  
!          E_Name := Defining_Entity_Of_Instance (U);
  
        elsif Unit_Kind in N_Subprogram_Instantiation then
  
*************** package body Sem_Ch10 is
*** 3186,3194 ****
           --  been rewritten as the declaration of the wrapper itself.
  
           if Nkind (U) in N_Subprogram_Instantiation then
!             E_Name :=
!               Related_Instance
!                 (Defining_Entity (Specification (Instance_Spec (U))));
           else
              E_Name := Related_Instance (Defining_Entity (U));
           end if;
--- 3185,3191 ----
           --  been rewritten as the declaration of the wrapper itself.
  
           if Nkind (U) in N_Subprogram_Instantiation then
!             E_Name := Defining_Entity_Of_Instance (U);
           else
              E_Name := Related_Instance (Defining_Entity (U));
           end if;
diff -Nrcpad gcc-16-20250914/gcc/ada/sem_ch12.adb gcc-16-20250921/gcc/ada/sem_ch12.adb
*** gcc-16-20250914/gcc/ada/sem_ch12.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/sem_ch12.adb	Sun Sep 21 22:32:35 2025
*************** with Einfo.Utils;    use Einfo.Utils;
*** 33,38 ****
--- 33,39 ----
  with Elists;         use Elists;
  with Errout;         use Errout;
  with Expander;       use Expander;
+ with Exp_Dbug;       use Exp_Dbug;
  with Fname;          use Fname;
  with Fname.UF;       use Fname.UF;
  with Freeze;         use Freeze;
*************** package body Sem_Ch12 is
*** 1290,1295 ****
--- 1291,1301 ----
     --  onto Default_Actuals, and actuals that require freezing are
     --  appended onto Actuals_To_Freeze.
  
+    procedure Analyze_Structural_Associations
+      (N     : Node_Id;
+       Match : Associations.Match_Rec);
+    --  Analyze associations for structural instantiation N
+ 
     procedure Check_Fixed_Point_Warning
       (Match     : Associations.Match_Rec;
        Renamings : List_Id);
*************** package body Sem_Ch12 is
*** 2365,2370 ****
--- 2371,2386 ----
        Match : constant Match_Rec := Match_Assocs (N, Formals, F_Copy);
  
     begin
+       if Nkind (N) in N_Generic_Instantiation and then Is_Structural (N) then
+          Analyze_Structural_Associations (N, Match);
+ 
+          --  Bail out if the instantiation has been turned into something else
+ 
+          if Nkind (N) not in N_Generic_Instantiation then
+             return Result_Renamings;
+          end if;
+       end if;
+ 
        for Index in Match.Assocs'Range loop
           declare
              Assoc : Assoc_Rec renames Match.Assocs (Index);
*************** package body Sem_Ch12 is
*** 2946,2952 ****
        end case;
  
        --  Check for correct use of Ghost entities in generic
!       --  instantiations (SPARK RM 6.9(10)).
  
        Check_Ghost_Context_In_Generic_Association
          (Actual => Match,
--- 2962,2968 ----
        end case;
  
        --  Check for correct use of Ghost entities in generic
!       --  instantiations (SPARK RM 6.9(13)).
  
        Check_Ghost_Context_In_Generic_Association
          (Actual => Match,
*************** package body Sem_Ch12 is
*** 4099,4105 ****
           end if;
  
           --  The default for a ghost generic formal procedure should be a ghost
!          --  procedure (SPARK RM 6.9(13)).
  
           if Ekind (Nam) = E_Procedure then
              declare
--- 4115,4121 ----
           end if;
  
           --  The default for a ghost generic formal procedure should be a ghost
!          --  procedure (SPARK RM 6.9(16)).
  
           if Ekind (Nam) = E_Procedure then
              declare
*************** package body Sem_Ch12 is
*** 4848,4853 ****
--- 4864,4876 ----
  
        function Needs_Body_Instantiated (Gen_Unit : Entity_Id) return Boolean is
        begin
+          --  If the instantiation is in the auxiliary declarations of the main
+          --  unit, then the body is needed, even if the main unit is generic.
+ 
+          if Parent (N) = Aux_Decls_Node (Cunit (Main_Unit)) then
+             return True;
+          end if;
+ 
           --  No need to instantiate bodies in generic units
  
           if Is_Generic_Unit (Cunit_Entity (Main_Unit)) then
*************** package body Sem_Ch12 is
*** 5134,5139 ****
--- 5157,5173 ----
                Formals => Generic_Formal_Declarations (Act_Tree),
                F_Copy  => Generic_Formal_Declarations (Gen_Decl));
  
+          --  Bail out if the instantiation has been turned into something else
+ 
+          if Nkind (N) /= N_Package_Instantiation then
+             if Parent_Installed then
+                Remove_Parent;
+             end if;
+ 
+             Restore_Env;
+             goto Leave;
+          end if;
+ 
           Vis_Prims_List := Check_Hidden_Primitives (Renamings);
  
           --  Set minimal decoration on the original entity
*************** package body Sem_Ch12 is
*** 5141,5146 ****
--- 5175,5192 ----
           Mutate_Ekind (Defining_Entity (N), E_Package);
           Set_Scope (Defining_Entity (N), Current_Scope);
  
+          --  From now on only Act_Decl_Id matters. If was copied from the
+          --  original entity earlier but, if the instance is structural,
+          --  the latter has been changed, so adjust it accordingly.
+ 
+          if Chars (Defining_Entity (N)) /= Chars (Act_Decl_Id) then
+             pragma Assert (Is_Structural (N));
+             Set_Incomplete_Actuals
+               (Defining_Entity (N), Incomplete_Actuals (Act_Decl_Id));
+             Act_Decl_Id := New_Copy (Defining_Entity (N));
+             Set_Is_Not_Self_Hidden (Act_Decl_Id);
+          end if;
+ 
           Set_Instance_Env (Gen_Unit, Act_Decl_Id);
           Set_Is_Generic_Instance (Act_Decl_Id);
           Generate_Definition (Act_Decl_Id);
*************** package body Sem_Ch12 is
*** 6011,6016 ****
--- 6057,6510 ----
        Analyze_Subprogram_Instantiation (N, E_Procedure);
     end Analyze_Procedure_Instantiation;
  
+    -------------------------------------
+    -- Analyze_Structural_Associations --
+    -------------------------------------
+ 
+    procedure Analyze_Structural_Associations
+      (N     : Node_Id;
+       Match : Associations.Match_Rec)
+    is
+       use Associations;
+ 
+       Loc : constant Source_Ptr := Sloc (N);
+       --  The source location of the instantiation
+ 
+       type Accessibility_Depth is record
+          Global : Uint;
+          Local  : Uint;
+       end record;
+       --  The accessibility depth of an entity is the depth of the outermost
+       --  scope from which the entity can be accessed at run time. It's zero
+       --  for library-level entities since they can be accessed from Standard.
+ 
+       --  However it can be accessed at run time only after being elaborated;
+       --  for a library-level entity, this means that it can be accessed from
+       --  Standard only after its enclosing library unit is elaborated, which
+       --  means that it can be accessed from all the other library units (that
+       --  have a dependence on this enclosing library unit) as if it was itself
+       --  declared in Standard, but not from this enclosing library unit.
+ 
+       --  Global contains the accessibility depth as computed from outside the
+       --  library or program unit where the entity is declared.
+ 
+       --  Local contains the accessibility depth as computed from the current
+       --  scope, which may be different from Global if the scope is within the
+       --  library or program unit where the entity is declared.
+ 
+       procedure Append_Entity_Name (B : in out Bounded_String; E : Entity_Id);
+       --  Append E's name to B
+ 
+       procedure Append_Expression (B : in out Bounded_String; N : Node_Id);
+       --  Append an encoding of N, a compile-time known expression, to B
+ 
+       function Get_Actual_Subtype (N : Node_Id) return Entity_Id;
+       --  Return the actual subtype of the formal object declared by N, which
+       --  is an N_Formal_Object_Declaration. It's the declared subtype of the
+       --  formal object if it is not a generic type, otherwise it's the actual
+       --  corresponding to this generic type in the instantiation.
+ 
+       function Get_Entity_Depth (E : Entity_Id) return Accessibility_Depth;
+       --  Return the accessibility depth of E
+ 
+       procedure Structural_Instantiation_Error (N : Node_Id);
+       --  Output an error for the specified structural instantiation
+ 
+       function Max (L, R : Accessibility_Depth) return Accessibility_Depth is
+         (Global => UI_Max (L.Global, R.Global),
+          Local  => UI_Max (L.Local,  R.Local));
+       --  Return a pair made up of the maximum value of each component
+ 
+       function OK_For_Structural_Instantiation (E : Entity_Id) return Boolean;
+       --  Return True if the generic unit E is OK for structural instantiation
+       --  and False if it is not, giving an error in the latter case.
+ 
+       procedure Rewrite_As_Renaming (N : Node_Id; E : Entity_Id);
+       --  Rewrite N as a renaming of E
+ 
+       ------------------------
+       -- Append_Entity_Name --
+       ------------------------
+ 
+       procedure Append_Entity_Name (B : in out Bounded_String; E : Entity_Id)
+       is
+       begin
+          if Operating_Mode = Generate_Code then
+             Get_External_Name (E);
+             Append (B, Global_Name_Buffer);
+          else
+             Append (B, 'E');
+             Append (B, Nat (E));
+          end if;
+       end Append_Entity_Name;
+ 
+       -----------------------
+       -- Append_Expression --
+       -----------------------
+ 
+       procedure Append_Expression (B : in out Bounded_String; N : Node_Id) is
+          Typ : constant Entity_Id := Etype (N);
+ 
+       begin
+          if Is_Integer_Type (Typ) then
+             Append (B, 'I');
+             Append (B, UI_Image (Expr_Value (N)));
+ 
+          elsif Is_Real_Type (Typ) then
+             declare
+                Val : constant Ureal := Expr_Value_R (N);
+             begin
+                Append (B, 'R');
+                Append (B, UI_Image (Norm_Num (Val)));
+                Append (B, '_');
+                Append (B, UI_Image (Norm_Den (Val)));
+             end;
+ 
+          elsif Is_Enumeration_Type (Typ) then
+             Append (B, 'E');
+             Append_Entity_Name (B, Expr_Value_E (N));
+ 
+          elsif Is_String_Type (Typ) then
+             Append (B, 'S');
+             Append (B, Strval (Expr_Value_S (N)));
+ 
+          else
+             raise Program_Error;
+          end if;
+       end Append_Expression;
+ 
+       ------------------------
+       -- Get_Actual_Subtype --
+       ------------------------
+ 
+       function Get_Actual_Subtype (N : Node_Id) return Entity_Id is
+          Subt : constant Entity_Id := Entity (Subtype_Mark (N));
+ 
+       begin
+          if not Is_Generic_Type (Subt) then
+             return Subt;
+          end if;
+ 
+          for Index in Match.Assocs'Range loop
+             declare
+                Assoc : Assoc_Rec renames Match.Assocs (Index);
+ 
+             begin
+                if Assoc.Actual.Kind = Name_Exp
+                  and then Nkind (Assoc.An_Formal) = N_Formal_Type_Declaration
+                  and then Defining_Identifier (Assoc.An_Formal) = Subt
+                then
+                   return Entity (Assoc.Actual.Name_Exp);
+                end if;
+             end;
+          end loop;
+ 
+          return Empty;
+       end Get_Actual_Subtype;
+ 
+       ----------------------
+       -- Get_Entity_Depth --
+       ----------------------
+ 
+       function Get_Entity_Depth (E : Entity_Id) return Accessibility_Depth is
+          Global : constant Uint := Scope_Depth (Enclosing_Dynamic_Scope (E));
+          CS     : constant Entity_Id := Current_Scope;
+ 
+          S : Entity_Id := Scope (E);
+ 
+       begin
+          --  Generic formal types are treated as local entities
+ 
+          if Is_Generic_Type (E) then
+             return (Global => Scope_Depth (S), Local => Scope_Depth (S));
+          end if;
+ 
+          --  Compute the accessibility depth from the current scope
+ 
+          while Scope_Depth (S) > Global
+            and then (not Scope_Within_Or_Same (CS, S)
+                       or else
+                         (Ekind (S) = E_Package
+                           and then Is_Generic_Instance (S)
+                           and then Alias (Related_Instance (S)) = CS))
+          loop
+             S := Scope (S);
+          end loop;
+ 
+          return (Global => Global, Local => Scope_Depth (S));
+       end Get_Entity_Depth;
+ 
+       ------------------------------------
+       -- Structural_Instantiation_Error --
+       ------------------------------------
+ 
+       procedure Structural_Instantiation_Error (N : Node_Id) is
+       begin
+          Error_Msg_N ("generic unit cannot be instantiated structurally", N);
+       end Structural_Instantiation_Error;
+ 
+       -------------------------------------
+       -- OK_For_Structural_Instantiation --
+       -------------------------------------
+ 
+       function OK_For_Structural_Instantiation (E : Entity_Id) return Boolean
+       is
+          Formals : constant List_Id :=
+                      Generic_Formal_Declarations (Unit_Declaration_Node (E));
+          Unit_Entity : constant Entity_Id :=
+                          Cunit_Entity (Get_Source_Unit (E));
+ 
+          Formal : Node_Id;
+ 
+       begin
+          --  Check that the generic unit is preelaborated
+ 
+          if Ekind (Unit_Entity) in E_Package | E_Generic_Package
+            and then not Is_Preelaborated (Unit_Entity)
+            and then not Is_Pure (Unit_Entity)
+          then
+             Structural_Instantiation_Error (N);
+             Error_Msg_NE
+               ("\generic unit& is not preelaborated", N, Unit_Entity);
+             return False;
+          end if;
+ 
+          --  Check that there is no generic formal object of mode In Out
+ 
+          Formal := First (Formals);
+          while Present (Formal) loop
+             if Nkind (Formal) = N_Formal_Object_Declaration
+               and then Out_Present (Formal)
+             then
+                Structural_Instantiation_Error (N);
+                Error_Msg_NE
+                  ("\in out formal parameter& not allowed", N,
+                   Defining_Identifier (Formal));
+                return False;
+             end if;
+ 
+             Next (Formal);
+          end loop;
+ 
+          return True;
+       end OK_For_Structural_Instantiation;
+ 
+       -------------------------
+       -- Rewrite_As_Renaming --
+       -------------------------
+ 
+       procedure Rewrite_As_Renaming (N : Node_Id; E : Entity_Id) is
+       begin
+          case Nkind (N) is
+             when N_Function_Instantiation =>
+                Rewrite (N,
+                  Make_Subprogram_Renaming_Declaration (Loc,
+                    Specification =>
+                      Make_Function_Specification (Loc,
+                        Defining_Unit_Name       => Defining_Unit_Name (N),
+                        Parameter_Specifications =>
+                          New_Copy_List
+                            (Parameter_Specifications
+                              (Subprogram_Specification (E))),
+                        Result_Definition        =>
+                          New_Occurrence_Of (Etype (E), Loc)),
+                    Name          => New_Occurrence_Of (E, Loc)));
+ 
+             when N_Procedure_Instantiation =>
+                Rewrite (N,
+                  Make_Subprogram_Renaming_Declaration (Loc,
+                    Specification =>
+                      Make_Procedure_Specification (Loc,
+                        Defining_Unit_Name       => Defining_Unit_Name (N),
+                        Parameter_Specifications =>
+                          New_Copy_List
+                            (Parameter_Specifications
+                              (Subprogram_Specification (E)))),
+                    Name          => New_Occurrence_Of (E, Loc)));
+ 
+             when N_Package_Instantiation =>
+                Rewrite (N,
+                  Make_Package_Renaming_Declaration (Loc,
+                    Defining_Unit_Name => Defining_Unit_Name (N),
+                    Name               => New_Occurrence_Of (E, Loc)));
+ 
+             when others =>
+                raise Program_Error;
+          end case;
+       end Rewrite_As_Renaming;
+ 
+       --  Local variables
+ 
+       Buf   : Bounded_String;
+       Depth : Accessibility_Depth;
+       Ent   : Entity_Id;
+       Nam   : Name_Id;
+       R     : Node_Id;
+       Scop  : Entity_Id;
+ 
+    --  Start of processing for Analyze_Structural_Associations
+ 
+    begin
+       if not OK_For_Structural_Instantiation (Match.Gen_Unit) then
+          return;
+       end if;
+ 
+       --  Compute the name and the scope depth of the structural instance
+ 
+       Append_Entity_Name (Buf, Match.Gen_Unit);
+       Append (Buf, "SI");
+       Depth := Get_Entity_Depth (Match.Gen_Unit);
+ 
+       for Index in Match.Assocs'Range loop
+          declare
+             Assoc : Assoc_Rec renames Match.Assocs (Index);
+ 
+          begin
+             Append (Buf, '_');
+ 
+             case Assoc.Actual.Kind is
+                when Name_Exp
+                   | Exp_Func_Default
+                =>
+                   if Nkind (Assoc.An_Formal) = N_Formal_Object_Declaration then
+                      --  Resolve the expression to compute whether it is static
+ 
+                      Resolve
+                        (Assoc.Actual.Name_Exp,
+                         Get_Actual_Subtype (Assoc.An_Formal));
+ 
+                      if Is_OK_Static_Expression (Assoc.Actual.Name_Exp) then
+                         --  We need the value of the expression to encode it
+ 
+                         pragma Assert
+                           (Compile_Time_Known_Value (Assoc.Actual.Name_Exp));
+ 
+                         Append_Expression (Buf, Assoc.Actual.Name_Exp);
+ 
+                      else
+                         Structural_Instantiation_Error (N);
+                         Error_Msg_N
+                           ("\expression is not static", Assoc.Actual.Name_Exp);
+                      end if;
+ 
+                   elsif Nkind (Assoc.Actual.Name_Exp) = N_Operator_Symbol then
+                      Append (Buf, Chars (Assoc.Actual.Name_Exp));
+ 
+                   else pragma Assert (Is_Entity_Name (Assoc.Actual.Name_Exp));
+                      Ent := Entity (Assoc.Actual.Name_Exp);
+ 
+                      --  If this is a type that is a renaming of another one,
+                      --  as is the case for actuals in instances, retain the
+                      --  latter. Beware of Natural and Positive, see Cstand.
+ 
+                      if Is_Type (Ent)
+                        and then Nkind (Parent (Ent)) = N_Subtype_Declaration
+                        and then
+                          Is_Entity_Name (Subtype_Indication (Parent (Ent)))
+                        and then not Comes_From_Source (Parent (Ent))
+                        and then Scope (Ent) /= Standard_Standard
+                      then
+                         Ent := Entity (Subtype_Indication (Parent (Ent)));
+                      end if;
+ 
+                      --  ??? Need to implement handling of explicit renaming
+ 
+                      Append_Entity_Name (Buf, Ent);
+                      Depth := Max (Depth, Get_Entity_Depth (Ent));
+                   end if;
+ 
+                when Box_Subp_Default =>
+                   Append (Buf, 'F');
+ 
+                when Null_Default =>
+                   Append (Buf, 'N');
+ 
+                when others =>
+                   Structural_Instantiation_Error (N);
+             end case;
+          end;
+       end loop;
+ 
+       Nam := Name_Find (Buf);
+       Ent := Get_Name_Entity_Id (Nam);
+ 
+       --  If the structural instance has already been created, then rewrite
+       --  this occurrence as a renaming of it.
+ 
+       if Present (Ent) then
+          Rewrite_As_Renaming (N, Ent);
+          Analyze (N);
+ 
+       --  Otherwise, create it in the outermost possible scope
+ 
+       else
+          --  Depth.Global is the accessibility depth of the structural instance
+          --  which is defined to be the depth of the outermost scope where the
+          --  instantiation is possible. If the depth cannot be reached from the
+          --  current scope, then the structural instance cannot be accessed out
+          --  of it and we would need to create a local instance instead.
+ 
+          if Depth.Local > Depth.Global then
+             Structural_Instantiation_Error (N);
+             Error_Msg_N ("\local entity used in the instantiation", N);
+             return;
+          end if;
+ 
+          Scop := Current_Scope;
+ 
+          --  If the current scope is too nested, analyze the instantiation
+          --  relocated in the outermost possible scope, which will invoke
+          --  us recursively with a matching scope depth this time.
+ 
+          if Scope_Depth (Scop) > Depth.Global then
+             while Scope_Depth (Scop) > Depth.Global loop
+                Scop := Scope (Scop);
+             end loop;
+ 
+             R := Relocate_Node (N);
+ 
+             --  If the scope is Standard, the instantiation is done outside the
+             --  current compilation unit and, therefore, needs a clean context.
+ 
+             if Scop = Standard_Standard then
+                declare
+                   S_Expander_Active  : constant Boolean := Expander_Active;
+                   S_Full_Analysis    : constant Boolean := Full_Analysis;
+                   S_In_Spec_Expr     : constant Boolean := In_Spec_Expression;
+                   S_Inside_A_Generic : constant Boolean := Inside_A_Generic;
+ 
+                begin
+                   Expander_Active := (Operating_Mode = Opt.Generate_Code);
+                   Full_Analysis := True;
+                   In_Spec_Expression := False;
+                   Inside_A_Generic := False;
+ 
+                   Add_Local_Declaration (R, N, Scop => Scop);
+ 
+                   Expander_Active := S_Expander_Active;
+                   Full_Analysis := S_Full_Analysis;
+                   In_Spec_Expression := S_In_Spec_Expr;
+                   Inside_A_Generic := S_Inside_A_Generic;
+                end;
+ 
+             else
+                Add_Local_Declaration (R, N, Scop => Scop);
+             end if;
+ 
+             Ent := Defining_Entity_Of_Instance (R);
+             Rewrite_As_Renaming (N, Ent);
+             Analyze (N);
+ 
+          --  Otherwise we are in the right scope and only need to set the
+          --  name of the instance.
+ 
+          else
+             Ent := Make_Defining_Identifier (Loc, Chars => Nam);
+             Set_Defining_Unit_Name (N, Ent);
+          end if;
+       end if;
+    end Analyze_Structural_Associations;
+ 
     -----------------------------------
     -- Need_Subprogram_Instance_Body --
     -----------------------------------
*************** package body Sem_Ch12 is
*** 6056,6064 ****
  
        if (Is_In_Main_Unit (N) or else Is_Inlined_Or_Child_Of_Inlined (Subp))
  
!         --  No need to instantiate bodies in generic units
  
!         and then not Is_Generic_Unit (Cunit_Entity (Main_Unit))
  
          --  Must be generating code or analyzing code in GNATprove mode
  
--- 6550,6561 ----
  
        if (Is_In_Main_Unit (N) or else Is_Inlined_Or_Child_Of_Inlined (Subp))
  
!         --  No need to instantiate bodies in generic units, except when the
!         --  instantiation is in the auxiliary declarations of the main unit;
!         --  in this case the body is needed, even if the main unit is generic.
  
!         and then (not Is_Generic_Unit (Cunit_Entity (Main_Unit))
!                    or else Parent (N) = Aux_Decls_Node (Cunit (Main_Unit)))
  
          --  Must be generating code or analyzing code in GNATprove mode
  
*************** package body Sem_Ch12 is
*** 6482,6487 ****
--- 6979,6995 ----
                Formals => Generic_Formal_Declarations (Act_Tree),
                F_Copy  => Generic_Formal_Declarations (Gen_Decl));
  
+          --  Bail out if the instantiation has been turned into something else
+ 
+          if Nkind (N) not in N_Subprogram_Instantiation then
+             if Parent_Installed then
+                Remove_Parent;
+             end if;
+ 
+             Restore_Env;
+             goto Leave;
+          end if;
+ 
           Vis_Prims_List := Check_Hidden_Primitives (Renamings);
  
           --  The subprogram itself cannot contain a nested instance, so the
*************** package body Sem_Ch12 is
*** 6828,6833 ****
--- 7336,7404 ----
        end if;
     end Get_Associated_Node;
  
+    ------------------------------------
+    -- Build_Structural_Instantiation --
+    ------------------------------------
+ 
+    function Build_Structural_Instantiation
+      (N        : Node_Id;
+       Gen_Unit : Entity_Id;
+       Actuals  : List_Id) return Entity_Id
+    is
+       Loc     : constant Source_Ptr := Sloc (N);
+       Inst_Id : constant Entity_Id  := Make_Temporary (Loc, 'P');
+ 
+       Inst : Node_Id;
+ 
+    begin
+       case Ekind (Gen_Unit) is
+          when E_Generic_Function =>
+             Inst :=
+               Make_Function_Instantiation (Loc,
+                 Defining_Unit_Name   => Inst_Id,
+                 Name                 => New_Occurrence_Of (Gen_Unit, Loc),
+                 Generic_Associations => Actuals);
+ 
+          when E_Generic_Package =>
+             Inst :=
+               Make_Package_Instantiation (Loc,
+                 Defining_Unit_Name   => Inst_Id,
+                 Name                 => New_Occurrence_Of (Gen_Unit, Loc),
+                 Generic_Associations => Actuals);
+ 
+          when E_Generic_Procedure =>
+             Inst :=
+               Make_Procedure_Instantiation (Loc,
+                 Defining_Unit_Name   => Inst_Id,
+                 Name                 => New_Occurrence_Of (Gen_Unit, Loc),
+                 Generic_Associations => Actuals);
+ 
+          when others =>
+             raise Program_Error;
+       end case;
+ 
+       Set_Is_Internal (Inst_Id);
+       Set_Is_Structural (Inst);
+ 
+       --  The instantiation must be added to a declarative part for technical
+       --  reasons pertaining to freezing (see the Freeze_Package_Instance and
+       --  Freeze_Subprogram_Instance procedures).
+ 
+       Add_Local_Declaration (Inst, N, Scop => Empty);
+       if Error_Posted (Inst) then
+          return Empty;
+       end if;
+ 
+       --  If the structural instance had already been created, this occurrence
+       --  has been turned into a renaming of it.
+ 
+       if Nkind (Inst) in N_Renaming_Declaration then
+          return Defining_Entity (Inst);
+       else
+          return Defining_Entity_Of_Instance (Inst);
+       end if;
+    end Build_Structural_Instantiation;
+ 
     -----------------------------------
     -- Build_Subprogram_Decl_Wrapper --
     -----------------------------------
*************** package body Sem_Ch12 is
*** 11704,11710 ****
           Formal_Pack := Defining_Unit_Name (Specification (Analyzed_Formal));
  
           --  The actual for a ghost generic formal package should be a ghost
!          --  package (SPARK RM 6.9(14)).
  
           Check_Ghost_Formal_Procedure_Or_Package
             (N      => Actual,
--- 12275,12281 ----
           Formal_Pack := Defining_Unit_Name (Specification (Analyzed_Formal));
  
           --  The actual for a ghost generic formal package should be a ghost
!          --  package (SPARK RM 6.9(16)).
  
           Check_Ghost_Formal_Procedure_Or_Package
             (N      => Actual,
*************** package body Sem_Ch12 is
*** 12023,12029 ****
           end if;
  
           --  The actual for a ghost generic formal procedure should be a ghost
!          --  procedure (SPARK RM 6.9(14)).
  
           if Present (Act_E)
             and then Ekind (Act_E) = E_Procedure
--- 12594,12600 ----
           end if;
  
           --  The actual for a ghost generic formal procedure should be a ghost
!          --  procedure (SPARK RM 6.9(16)).
  
           if Present (Act_E)
             and then Ekind (Act_E) = E_Procedure
*************** package body Sem_Ch12 is
*** 12530,12536 ****
           end if;
  
           --  The actual for a ghost generic formal IN OUT parameter should be a
!          --  ghost object (SPARK RM 6.9(14)).
  
           Check_Ghost_Formal_Variable
             (Actual => Actual,
--- 13101,13107 ----
           end if;
  
           --  The actual for a ghost generic formal IN OUT parameter should be a
!          --  ghost object (SPARK RM 6.9(16)).
  
           Check_Ghost_Formal_Variable
             (Actual => Actual,
*************** package body Sem_Ch12 is
*** 15912,15917 ****
--- 16483,16546 ----
        end loop;
     end Map_Formal_Package_Entities;
  
+    --------------------
+    -- Mark_Link_Once --
+    --------------------
+ 
+    procedure Mark_Link_Once (Decls : List_Id) is
+       procedure Mark_Link_Once (Ent : Entity_Id);
+ 
+       --------------------
+       -- Mark_Link_Once --
+       --------------------
+ 
+       procedure Mark_Link_Once (Ent : Entity_Id) is
+       begin
+          if Is_Public (Ent) then
+             Set_Is_Link_Once (Ent);
+          end if;
+ 
+          if Ekind (Ent) in E_Package | E_Package_Body
+            and then No (Renamed_Entity (Ent))
+          then
+             declare
+                Pack_Ent : Entity_Id;
+ 
+             begin
+                Pack_Ent := First_Entity (Ent);
+                while Present (Pack_Ent) loop
+                   Mark_Link_Once (Pack_Ent);
+ 
+                   Next_Entity (Pack_Ent);
+                end loop;
+             end;
+          end if;
+       end Mark_Link_Once;
+ 
+       Decl : Node_Id;
+       Spec : Node_Id;
+ 
+    begin
+       Decl := First (Decls);
+       while Present (Decl) loop
+          if Nkind (Decl) in N_Generic_Instantiation
+            and then Is_Structural (Decl)
+          then
+             Spec := Instance_Spec (Decl);
+ 
+             Mark_Link_Once (Defining_Entity (Specification (Spec)));
+ 
+             if Nkind (Decl) = N_Package_Instantiation
+               and then Present (Corresponding_Body (Spec))
+             then
+                Mark_Link_Once (Corresponding_Body (Spec));
+             end if;
+          end if;
+ 
+          Next (Decl);
+       end loop;
+    end Mark_Link_Once;
+ 
     -----------------------
     -- Move_Freeze_Nodes --
     -----------------------
diff -Nrcpad gcc-16-20250914/gcc/ada/sem_ch12.ads gcc-16-20250921/gcc/ada/sem_ch12.ads
*** gcc-16-20250914/gcc/ada/sem_ch12.ads	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/sem_ch12.ads	Sun Sep 21 22:32:35 2025
*************** package Sem_Ch12 is
*** 44,49 ****
--- 44,57 ----
     --  Must be invoked just at the end of the end of the processing of a
     --  generic spec or body.
  
+    function Build_Structural_Instantiation
+      (N        : Node_Id;
+       Gen_Unit : Entity_Id;
+       Actuals  : List_Id) return Entity_Id;
+    --  Build a structural instantiation of Gen_Unit on Actuals at N and return
+    --  its defining entity, after either having inserted it at the appropriate
+    --  place in the tree or turned it into a renaming of a previous instance.
+ 
     procedure Check_Generic_Child_Unit
       (Gen_Id           : Node_Id;
        Parent_Installed : in out Boolean);
*************** package Sem_Ch12 is
*** 114,119 ****
--- 122,130 ----
     --  Return true if E is a package created for an abbreviated instantiation
     --  to check conformance between formal package and corresponding actual.
  
+    procedure Mark_Link_Once (Decls : List_Id);
+    --  Mark all the structural instances present in Decls as Link Once
+ 
     function Need_Subprogram_Instance_Body
       (N    : Node_Id;
        Subp : Entity_Id) return Boolean;
diff -Nrcpad gcc-16-20250914/gcc/ada/sem_ch13.adb gcc-16-20250921/gcc/ada/sem_ch13.adb
*** gcc-16-20250914/gcc/ada/sem_ch13.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/sem_ch13.adb	Sun Sep 21 22:32:35 2025
*************** with Errid;            use Errid;
*** 37,42 ****
--- 37,43 ----
  with Errout;           use Errout;
  with Exp_Ch3;          use Exp_Ch3;
  with Exp_Disp;         use Exp_Disp;
+ with Exp_Strm;         use Exp_Strm;
  with Exp_Tss;          use Exp_Tss;
  with Exp_Util;         use Exp_Util;
  with Expander;         use Expander;
*************** package body Sem_Ch13 is
*** 4464,4474 ****
                    --  Error checking
  
                    if not All_Extensions_Allowed then
                       goto Continue;
                    end if;
  
!                   if Ekind (E) /= E_Procedure then
!                      Error_Msg_N ("Initialize must apply to a constructor", N);
                    end if;
  
                    if Present (Expressions (Expression (Aspect))) then
--- 4465,4480 ----
                    --  Error checking
  
                    if not All_Extensions_Allowed then
+                      Error_Msg_Name_1 := Nam;
+                      Error_Msg_GNAT_Extension ("aspect %", Loc);
                       goto Continue;
                    end if;
  
!                   if Ekind (E) /= E_Subprogram_Body
!                     or else Nkind (Parent (E)) /= N_Procedure_Specification
!                   then
!                      Error_Msg_N
!                        ("Initialize must apply to a constructor body", N);
                    end if;
  
                    if Present (Expressions (Expression (Aspect))) then
*************** package body Sem_Ch13 is
*** 4507,4517 ****
                       Next_Entity (Type_Comp);
                    end loop;
  
-                   --  Push the scope and formals for analysis
- 
-                   Push_Scope (E);
-                   Install_Formals (Defining_Unit_Name (Specification (N)));
- 
                    --  Analyze the components
  
                    Aspect_Comp :=
--- 4513,4518 ----
*************** package body Sem_Ch13 is
*** 4530,4539 ****
                    Dummy_Aggr := New_Copy_Tree (Expression (Aspect));
                    Resolve_Aggregate (Dummy_Aggr, Typ);
                    Expander_Active := True;
- 
-                   --  Return the scope
- 
-                   End_Scope;
                 end Initialize;
  
                 --  Initializes
--- 4531,4536 ----
*************** package body Sem_Ch13 is
*** 5031,5036 ****
--- 5028,5039 ----
                    goto Continue;
  
                 when Aspect_Constructor =>
+                   if not All_Extensions_Allowed then
+                      Error_Msg_Name_1 := Nam;
+                      Error_Msg_GNAT_Extension ("aspect %", Loc);
+                      goto Continue;
+                   end if;
+ 
                    Set_Constructor_Name (E, Expr);
                    Set_Needs_Construction (E);
  
*************** package body Sem_Ch13 is
*** 5295,5300 ****
--- 5298,5377 ----
                 --  generated yet because the evaluation of the boolean needs
                 --  to be delayed till the freeze point.
  
+                --  Super
+ 
+                when Aspect_Super => Super :
+                declare
+                   Analyze_Parameter_Expressions : constant Boolean := True;
+                   --  ???
+                   --  We can analyze actual parameter expressions here (with
+                   --  no context, like the operand of a type conversion),
+                   --  or leave them unanalyzed for now and catch problems
+                   --  when we analyze the generated constructor call
+                   --  (where overload resolution may provide context that
+                   --  resolves some ambiguities).
+                   --  For now, we analyze them here to avoid depending
+                   --  on legality checking performed during expansion.
+                   --  To reverse this decision, set this flag to False.
+ 
+                begin
+                   --  Error checking
+ 
+                   if not All_Extensions_Allowed then
+                      Error_Msg_Name_1 := Nam;
+                      Error_Msg_GNAT_Extension ("aspect %", Loc);
+                      goto Continue;
+                   end if;
+ 
+                   if Ekind (E) /= E_Subprogram_Body
+                     or else Nkind (Parent (E)) /= N_Procedure_Specification
+                   then
+                      Error_Msg_N ("Super must apply to a constructor body", N);
+                   end if;
+ 
+                   --  handle missing parameter list (an error case)
+ 
+                   if No (Expr) then
+                      Error_Msg_N ("constructor parameters required", N);
+ 
+                   --  Handle parameter list of length more than one
+                   --  (such a list is parsed as an aggregate).
+ 
+                   elsif Nkind (Expr) = N_Aggregate then
+                      if Present (Component_Associations (Expr))
+                        or else No (Expressions (Expr))
+                      then
+                         Error_Msg_N
+                           ("malformed constructor parameter list", N);
+ 
+                      elsif Analyze_Parameter_Expressions then
+                         declare
+                            Param_Expr : Node_Id := First (Expressions (Expr));
+                         begin
+                            while Present (Param_Expr) loop
+                               Analyze (Param_Expr);
+                               Next (Param_Expr);
+                            end loop;
+ 
+                            Set_Analyzed (Expr);
+                            --  Someday Vast may complain that this so-called
+                            --  aggregate has no Etype. For now, we mark it
+                            --  as analyzed and hope that nobody trips over it.
+                         end;
+                      end if;
+ 
+                   --  handle parameter list of length one
+ 
+                   elsif Paren_Count (Expr) = 0 then
+                      Error_Msg_N
+                        ("parentheses missing for constructor parameter list ",
+                         N);
+ 
+                   elsif Analyze_Parameter_Expressions then
+                      Analyze (Expr);
+                   end if;
+                end Super;
+ 
                 when Boolean_Aspects
                    | Library_Unit_Aspects
                 =>
*************** package body Sem_Ch13 is
*** 5690,5696 ****
                          Set_Declarations (N, New_List);
                       end if;
  
!                      Prepend (Aitem, Declarations (N));
  
                    elsif Nkind (N) = N_Generic_Package_Declaration then
                       if No (Visible_Declarations (Specification (N))) then
--- 5767,5775 ----
                          Set_Declarations (N, New_List);
                       end if;
  
!                      if Present (Aitem) then
!                         Prepend (Aitem, Declarations (N));
!                      end if;
  
                    elsif Nkind (N) = N_Generic_Package_Declaration then
                       if No (Visible_Declarations (Specification (N))) then
*************** package body Sem_Ch13 is
*** 5761,5767 ****
  
                 --  The pragma is added before source declarations
  
!                Prepend_To (Declarations (N), Aitem);
  
              --  When delay is not required and the context is not a compilation
              --  unit, we simply insert the pragma/attribute definition clause
--- 5840,5848 ----
  
                 --  The pragma is added before source declarations
  
!                if Present (Aitem) then
!                   Prepend_To (Declarations (N), Aitem);
!                end if;
  
              --  When delay is not required and the context is not a compilation
              --  unit, we simply insert the pragma/attribute definition clause
*************** package body Sem_Ch13 is
*** 8286,8317 ****
  
              if Duplicate_Clause then
                 null;
! 
              elsif Is_Elementary_Type (U_Ent) then
!                --  Size will be empty if we already detected an error
!                --  (e.g. Expr is of the wrong type); we might as well
!                --  give the useful hint below even in that case.
  
!                if No (Size) or else
!                  (Size /= System_Storage_Unit
!                   and then Size /= System_Storage_Unit * 2
!                   and then Size /= System_Storage_Unit * 3
!                   and then Size /= System_Storage_Unit * 4
!                   and then Size /= System_Storage_Unit * 8)
!                then
!                   Error_Msg_N
!                     ("stream size for elementary type must be 8, 16, 24, " &
!                      "32 or 64", N);
  
!                elsif Known_RM_Size (U_Ent) and then RM_Size (U_Ent) > Size then
!                   Error_Msg_Uint_1 := RM_Size (U_Ent);
!                   Error_Msg_N
!                     ("stream size for elementary type must be 8, 16, 24, " &
!                      "32 or 64 and at least ^", N);
!                end if;
  
!                Set_Has_Stream_Size_Clause (U_Ent);
  
              else
                 Error_Msg_N ("Stream_Size cannot be given for &", Nam);
              end if;
--- 8367,8425 ----
  
              if Duplicate_Clause then
                 null;
!             elsif No (Size) then
!                Error_Msg_N ("invalid argument for Stream_Size aspect", Nam);
              elsif Is_Elementary_Type (U_Ent) then
!                Set_Has_Stream_Size_Clause (U_Ent);
  
!                declare
!                   Minimum_Size : constant Uint :=
!                     (if Known_RM_Size (U_Ent)
!                      then RM_Size (U_Ent)
!                      else Uint_0);
  
!                   Size_Or_Zero : constant Uint :=
!                     (if Size < Minimum_Size then Uint_0 else Size);
!                   --  If the requested size is smaller than the RM size of the
!                   --  type, we pass zero to Get_Primitives. That will always
!                   --  give us the list of supported sizes we need to report an
!                   --  error.
  
!                   P : constant Primitive_Result :=
!                     Get_Primitives (U_Ent, Size_Or_Zero);
! 
!                   Error_Text : Bounded_String;
! 
!                   In_First_Iteration : Boolean := True;
!                   Previous_Value : Nat := 0;
!                begin
!                   case P.S is
!                      when Possible_Sizes =>
!                         Error_Msg_N ("unsupported stream size", N);
! 
!                         Append
!                           (Error_Text,
!                            "\supported stream sizes for this type: ");
!                         for Sz of P.List loop
!                            if Minimum_Size <= Sz and then Sz /= Previous_Value
!                            then
!                               if In_First_Iteration then
!                                  In_First_Iteration := False;
!                               else
!                                  Append (Error_Text, ", ");
!                               end if;
! 
!                               Append (Error_Text, Sz);
! 
!                               Previous_Value := Sz;
!                            end if;
!                         end loop;
!                         Error_Msg_N (To_String (Error_Text), N);
  
+                      when others =>
+                         null;
+                   end case;
+                end;
              else
                 Error_Msg_N ("Stream_Size cannot be given for &", Nam);
              end if;
*************** package body Sem_Ch13 is
*** 11629,11635 ****
        --  Case of stream attributes and Put_Image, just have to compare
        --  entities. However, the expression is just a possibly-overloaded
        --  name, so we need to verify that one of these interpretations is
!       --  the one available at at the freeze point.
  
        elsif A_Id in Aspect_Constructor
                    | Aspect_Destructor
--- 11737,11743 ----
        --  Case of stream attributes and Put_Image, just have to compare
        --  entities. However, the expression is just a possibly-overloaded
        --  name, so we need to verify that one of these interpretations is
!       --  the one available at the freeze point.
  
        elsif A_Id in Aspect_Constructor
                    | Aspect_Destructor
*************** package body Sem_Ch13 is
*** 12221,12226 ****
--- 12329,12335 ----
              | Aspect_Relaxed_Initialization
              | Aspect_SPARK_Mode
              | Aspect_Subprogram_Variant
+             | Aspect_Super
              | Aspect_Suppress
              | Aspect_Test_Case
              | Aspect_Unimplemented
diff -Nrcpad gcc-16-20250914/gcc/ada/sem_ch3.adb gcc-16-20250921/gcc/ada/sem_ch3.adb
*** gcc-16-20250914/gcc/ada/sem_ch3.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/sem_ch3.adb	Sun Sep 21 22:32:35 2025
*************** package body Sem_Ch3 is
*** 1542,1548 ****
           Analyze_Component_Declaration (Decl);
  
           Set_Analyzed (Decl);
-          Mutate_Ekind            (Tag, E_Component);
           Set_Is_Tag              (Tag);
           Set_Is_Aliased          (Tag);
           Set_Is_Independent      (Tag);
--- 1542,1547 ----
*************** package body Sem_Ch3 is
*** 1583,1589 ****
              Analyze_Component_Declaration (Decl);
  
              Set_Analyzed (Decl);
-             Mutate_Ekind            (Offset, E_Component);
              Set_Is_Aliased          (Offset);
              Set_Is_Independent      (Offset);
              Set_Related_Type        (Offset, Iface);
--- 1582,1587 ----
*************** package body Sem_Ch3 is
*** 4632,4638 ****
              Set_Has_Delayed_Freeze (T);
  
           elsif not Preanalysis_Active then
!             Freeze_Before (N, T);
           end if;
        end if;
  
--- 4630,4639 ----
              Set_Has_Delayed_Freeze (T);
  
           elsif not Preanalysis_Active then
!             --  Do_Freeze_Profile matters in the case of an object
!             --  of an anonymous access-to-subprogram type.
! 
!             Freeze_Before (N, T, Do_Freeze_Profile => False);
           end if;
        end if;
  
*************** package body Sem_Ch3 is
*** 10217,10223 ****
                 end if;
  
                 --  A type extension is automatically Ghost when one of its
!                --  progenitors is Ghost (SPARK RM 6.9(9)). This property is
                 --  also inherited when the parent type is Ghost, but this is
                 --  done in Build_Derived_Type as the mechanism also handles
                 --  untagged derivations.
--- 10218,10224 ----
                 end if;
  
                 --  A type extension is automatically Ghost when one of its
!                --  progenitors is Ghost (SPARK RM 6.9(10)). This property is
                 --  also inherited when the parent type is Ghost, but this is
                 --  done in Build_Derived_Type as the mechanism also handles
                 --  untagged derivations.
*************** package body Sem_Ch3 is
*** 10541,10547 ****
        end if;
  
        --  A derived type becomes Ghost when its parent type is also Ghost
!       --  (SPARK RM 6.9(9)). Note that the Ghost-related attributes are not
        --  directly inherited because the Ghost policy in effect may differ.
  
        if Is_Ghost_Entity (Parent_Type) then
--- 10542,10548 ----
        end if;
  
        --  A derived type becomes Ghost when its parent type is also Ghost
!       --  (SPARK RM 6.9(10)). Note that the Ghost-related attributes are not
        --  directly inherited because the Ghost policy in effect may differ.
  
        if Is_Ghost_Entity (Parent_Type) then
diff -Nrcpad gcc-16-20250914/gcc/ada/sem_ch4.adb gcc-16-20250921/gcc/ada/sem_ch4.adb
*** gcc-16-20250914/gcc/ada/sem_ch4.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/sem_ch4.adb	Sun Sep 21 22:32:35 2025
*************** with Sem_Cat;        use Sem_Cat;
*** 54,59 ****
--- 54,60 ----
  with Sem_Ch3;        use Sem_Ch3;
  with Sem_Ch6;        use Sem_Ch6;
  with Sem_Ch8;        use Sem_Ch8;
+ with Sem_Ch12;       use Sem_Ch12;
  with Sem_Dim;        use Sem_Dim;
  with Sem_Disp;       use Sem_Disp;
  with Sem_Dist;       use Sem_Dist;
*************** package body Sem_Ch4 is
*** 1263,1268 ****
--- 1264,1318 ----
                       No_Interpretation;
                    end if;
  
+                --  Or this may be a reference to a structural instantiation
+                --  with named associations if GNAT extensions are allowed.
+ 
+                elsif (Is_Generic_Subprogram (Nam_Ent)
+                        or else Ekind (Nam_Ent) = E_Generic_Package)
+                  and then All_Extensions_Allowed
+                  and then not Is_Empty_List (Parameter_Associations (N))
+                then
+                   declare
+                      Act      : Node_Id;
+                      Act_List : List_Id;
+                      Assoc    : Node_Id;
+                      Inst_Id  : Entity_Id;
+ 
+                   begin
+                      Act_List := New_List;
+                      Assoc := First (Parameter_Associations (N));
+                      while Present (Assoc) loop
+                         if Nkind (Assoc) = N_Parameter_Association then
+                            Act :=
+                              Make_Generic_Association (Sloc (Assoc),
+                                Selector_Name                     =>
+                                  Relocate_Node (Selector_Name (Assoc)),
+                                Explicit_Generic_Actual_Parameter =>
+                                  Relocate_Node
+                                    (Explicit_Actual_Parameter (Assoc)));
+                         else
+                            Act :=
+                              Make_Generic_Association (Sloc (Assoc),
+                                Explicit_Generic_Actual_Parameter =>
+                                  Relocate_Node (Assoc));
+                         end if;
+ 
+                         Append_To (Act_List, Act);
+                         Next (Assoc);
+                      end loop;
+ 
+                      Inst_Id :=
+                        Build_Structural_Instantiation (N, Nam_Ent, Act_List);
+                      if Present (Inst_Id) then
+                         Rewrite (N, New_Occurrence_Of (Inst_Id, Loc));
+                      else
+                         Rewrite (N,
+                           Make_Raise_Program_Error (Loc,
+                             Reason => PE_Explicit_Raise));
+                      end if;
+                      Analyze (N);
+                   end;
+ 
                 else
                    No_Interpretation;
                 end if;
*************** package body Sem_Ch4 is
*** 2734,2739 ****
--- 2784,2793 ----
        --  If the prefix of an indexed component is overloaded, the proper
        --  interpretation is selected by the index types and the context.
  
+       procedure Process_Generic_Instantiation;
+       --  The prefix in indexed component form is a generic unit. This
+       --  routine processes it and builds the implicit instantiation.
+ 
        ---------------------------
        -- Process_Function_Call --
        ---------------------------
*************** package body Sem_Ch4 is
*** 3046,3051 ****
--- 3100,3136 ----
           end if;
        end Process_Overloaded_Indexed_Component;
  
+       -----------------------------------
+       -- Process_Generic_Instantiation --
+       -----------------------------------
+ 
+       procedure Process_Generic_Instantiation is
+          Act_List : List_Id;
+          Expr     : Node_Id;
+          Inst_Id  : Entity_Id;
+ 
+       begin
+          Act_List := New_List;
+          Expr := First (Expressions (N));
+          while Present (Expr) loop
+             Append_To (Act_List,
+               Make_Generic_Association (Sloc (Expr),
+                 Explicit_Generic_Actual_Parameter =>
+                   Relocate_Node (Expr)));
+             Next (Expr);
+          end loop;
+ 
+          Inst_Id := Build_Structural_Instantiation (N, U_N, Act_List);
+          if Present (Inst_Id) then
+             Rewrite (N, New_Occurrence_Of (Inst_Id, Sloc (N)));
+          else
+             Rewrite (N,
+               Make_Raise_Program_Error (Sloc (N),
+                 Reason => PE_Explicit_Raise));
+          end if;
+          Analyze (N);
+       end Process_Generic_Instantiation;
+ 
     --  Start of processing for Analyze_Indexed_Component_Form
  
     begin
*************** package body Sem_Ch4 is
*** 3119,3127 ****
  
              --  A common beginner's (or C++ templates fan) error
  
!             Error_Msg_N ("generic subprogram cannot be called", N);
!             Set_Etype (N, Any_Type);
!             return;
  
           else
              Process_Indexed_Component_Or_Slice;
--- 3204,3224 ----
  
              --  A common beginner's (or C++ templates fan) error
  
!             if All_Extensions_Allowed
!               and then not Is_Empty_List (Expressions (N))
!             then
!                Process_Generic_Instantiation;
!             else
!                Error_Msg_N ("generic subprogram cannot be called", N);
!                Set_Etype (N, Any_Type);
!                return;
!             end if;
! 
!          elsif Ekind (U_N) = E_Generic_Package
!            and then All_Extensions_Allowed
!            and then not Is_Empty_List (Expressions (N))
!          then
!             Process_Generic_Instantiation;
  
           else
              Process_Indexed_Component_Or_Slice;
*************** package body Sem_Ch4 is
*** 5352,5357 ****
--- 5449,5458 ----
  
        else
           Prefix_Type := Etype (Pref);
+          if Prefix_Type = Standard_Void_Type then
+             pragma Assert (Serious_Errors_Detected > 0);
+             return;
+          end if;
        end if;
  
        if Is_Access_Type (Prefix_Type) then
*************** package body Sem_Ch4 is
*** 6526,6578 ****
  
     procedure Analyze_User_Defined_Binary_Op
       (N     : Node_Id;
!       Op_Id : Entity_Id) is
     begin
!       declare
!          F1 : constant Entity_Id := First_Formal (Op_Id);
!          F2 : constant Entity_Id := Next_Formal (F1);
! 
!       begin
!          --  Verify that Op_Id is a visible binary function. Note that since
!          --  we know Op_Id is overloaded, potentially use visible means use
!          --  visible for sure (RM 9.4(11)). Be prepared for previous errors.
  
!          if Ekind (Op_Id) = E_Function
!            and then Present (F2)
!            and then (Is_Immediately_Visible (Op_Id)
!                       or else Is_Potentially_Use_Visible (Op_Id))
!            and then (Has_Compatible_Type (Left_Opnd (N), Etype (F1))
!                       or else Etype (F1) = Any_Type)
!            and then (Has_Compatible_Type (Right_Opnd (N), Etype (F2))
!                       or else Etype (F2) = Any_Type)
!          then
!             Add_One_Interp (N, Op_Id, Base_Type (Etype (Op_Id)));
  
!             --  If the operands are overloaded, indicate that the current
!             --  type is a viable candidate. This is redundant in most cases,
!             --  but for equality and comparison operators where the context
!             --  does not impose a type on the operands, setting the proper
!             --  type is necessary to avoid subsequent ambiguities during
!             --  resolution, when both user-defined and predefined operators
!             --  may be candidates.
  
!             if Is_Overloaded (Left_Opnd (N)) then
!                Set_Etype (Left_Opnd (N), Etype (F1));
!             end if;
  
!             if Is_Overloaded (Right_Opnd (N)) then
!                Set_Etype (Right_Opnd (N), Etype (F2));
!             end if;
  
!             if Debug_Flag_E then
!                Write_Str ("user defined operator ");
!                Write_Name (Chars (Op_Id));
!                Write_Str (" on node ");
!                Write_Int (Int (N));
!                Write_Eol;
!             end if;
           end if;
!       end;
     end Analyze_User_Defined_Binary_Op;
  
     -----------------------------------
--- 6627,6676 ----
  
     procedure Analyze_User_Defined_Binary_Op
       (N     : Node_Id;
!       Op_Id : Entity_Id)
!    is
!       F1 : constant Entity_Id := First_Formal (Op_Id);
!       F2 : constant Entity_Id := Next_Formal (F1);
     begin
!       --  Verify that Op_Id is a visible binary function. Note that since
!       --  we know Op_Id is overloaded, potentially use visible means use
!       --  visible for sure (RM 9.4(11)). Be prepared for previous errors.
  
!       if Ekind (Op_Id) = E_Function
!         and then Present (F2)
!         and then (Is_Immediately_Visible (Op_Id)
!                    or else Is_Potentially_Use_Visible (Op_Id))
!         and then (Has_Compatible_Type (Left_Opnd (N), Etype (F1))
!                    or else Etype (F1) = Any_Type)
!         and then (Has_Compatible_Type (Right_Opnd (N), Etype (F2))
!                    or else Etype (F2) = Any_Type)
!       then
!          Add_One_Interp (N, Op_Id, Base_Type (Etype (Op_Id)));
  
!          --  If the operands are overloaded, indicate that the current
!          --  type is a viable candidate. This is redundant in most cases,
!          --  but for equality and comparison operators where the context
!          --  does not impose a type on the operands, setting the proper
!          --  type is necessary to avoid subsequent ambiguities during
!          --  resolution, when both user-defined and predefined operators
!          --  may be candidates.
  
!          if Is_Overloaded (Left_Opnd (N)) then
!             Set_Etype (Left_Opnd (N), Etype (F1));
!          end if;
  
!          if Is_Overloaded (Right_Opnd (N)) then
!             Set_Etype (Right_Opnd (N), Etype (F2));
!          end if;
  
!          if Debug_Flag_E then
!             Write_Str ("user defined operator ");
!             Write_Name (Chars (Op_Id));
!             Write_Str (" on node ");
!             Write_Int (Int (N));
!             Write_Eol;
           end if;
!       end if;
     end Analyze_User_Defined_Binary_Op;
  
     -----------------------------------
diff -Nrcpad gcc-16-20250914/gcc/ada/sem_ch6.adb gcc-16-20250921/gcc/ada/sem_ch6.adb
*** gcc-16-20250914/gcc/ada/sem_ch6.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/sem_ch6.adb	Sun Sep 21 22:32:35 2025
*************** package body Sem_Ch6 is
*** 436,446 ****
--- 436,455 ----
  
              Set_Parent (New_Body, Parent (N));
  
+             --  Disable Ghost checks for this early analysis on the expression.
+             --  We have not analyzed the new body of the expression function
+             --  yet so the ghost region is not set up properly for the ghost
+             --  context checks yet. Avoid the checks for now as the expression
+             --  will be re-analyzed when the expression function is replaced
+             --  with the function body.
+ 
+             Ghost_Context_Checks_Disabled := True;
              Freeze_Expr_Types
                (Def_Id => Def_Id,
                 Typ    => Typ,
                 Expr   => Expr,
                 N      => N);
+             Ghost_Context_Checks_Disabled := False;
           end if;
  
           --  For navigation purposes, indicate that the function is a body
*************** package body Sem_Ch6 is
*** 11830,11836 ****
                    Check_Private_Overriding (B_Typ);
                    --  The Ghost policy in effect at the point of declaration
                    --  or a tagged type and a primitive operation must match
!                   --  (SPARK RM 6.9(18)).
  
                    Check_Ghost_Primitive (S, B_Typ);
                 end if;
--- 11839,11845 ----
                    Check_Private_Overriding (B_Typ);
                    --  The Ghost policy in effect at the point of declaration
                    --  or a tagged type and a primitive operation must match
!                   --  (SPARK RM 6.9(21)).
  
                    Check_Ghost_Primitive (S, B_Typ);
                 end if;
*************** package body Sem_Ch6 is
*** 11871,11877 ****
  
                    --  The Ghost policy in effect at the point of declaration
                    --  of a tagged type and a primitive operation must match
!                   --  (SPARK RM 6.9(18)).
  
                    Check_Ghost_Primitive (S, B_Typ);
                 end if;
--- 11880,11886 ----
  
                    --  The Ghost policy in effect at the point of declaration
                    --  of a tagged type and a primitive operation must match
!                   --  (SPARK RM 6.9(21)).
  
                    Check_Ghost_Primitive (S, B_Typ);
                 end if;
*************** package body Sem_Ch6 is
*** 11904,11910 ****
  
                 --  The Ghost policy in effect at the point of declaration of a
                 --  tagged type and a primitive operation must match
!                --  (SPARK RM 6.9(18)).
  
                 Check_Ghost_Primitive (S, B_Typ);
              end if;
--- 11913,11919 ----
  
                 --  The Ghost policy in effect at the point of declaration of a
                 --  tagged type and a primitive operation must match
!                --  (SPARK RM 6.9(21)).
  
                 Check_Ghost_Primitive (S, B_Typ);
              end if;
*************** package body Sem_Ch6 is
*** 12375,12381 ****
  
              --  The Ghost policy in effect at the point of declaration of a
              --  parent subprogram and an overriding subprogram must match
!             --  (SPARK RM 6.9(19)).
  
              Check_Ghost_Overriding (S, Overridden_Subp);
           end if;
--- 12384,12390 ----
  
              --  The Ghost policy in effect at the point of declaration of a
              --  parent subprogram and an overriding subprogram must match
!             --  (SPARK RM 6.9(21)).
  
              Check_Ghost_Overriding (S, Overridden_Subp);
           end if;
*************** package body Sem_Ch6 is
*** 12538,12544 ****
  
                       --  The Ghost policy in effect at the point of declaration
                       --  of a parent subprogram and an overriding subprogram
!                      --  must match (SPARK RM 6.9(19)).
  
                       Check_Ghost_Overriding (E, S);
                    end if;
--- 12547,12553 ----
  
                       --  The Ghost policy in effect at the point of declaration
                       --  of a parent subprogram and an overriding subprogram
!                      --  must match (SPARK RM 6.9(21)).
  
                       Check_Ghost_Overriding (E, S);
                    end if;
*************** package body Sem_Ch6 is
*** 12742,12748 ****
  
                    --  The Ghost policy in effect at the point of declaration
                    --  of a parent subprogram and an overriding subprogram
!                   --  must match (SPARK RM 6.9(19)).
  
                    Check_Ghost_Overriding (S, E);
  
--- 12751,12757 ----
  
                    --  The Ghost policy in effect at the point of declaration
                    --  of a parent subprogram and an overriding subprogram
!                   --  must match (SPARK RM 6.9(21)).
  
                    Check_Ghost_Overriding (S, E);
  
*************** package body Sem_Ch6 is
*** 12908,12914 ****
  
           --  The Ghost policy in effect at the point of declaration of a parent
           --  subprogram and an overriding subprogram must match
!          --  (SPARK RM 6.9(19)).
  
           Check_Ghost_Overriding (S, Overridden_Subp);
  
--- 12917,12923 ----
  
           --  The Ghost policy in effect at the point of declaration of a parent
           --  subprogram and an overriding subprogram must match
!          --  (SPARK RM 6.9(21)).
  
           Check_Ghost_Overriding (S, Overridden_Subp);
  
diff -Nrcpad gcc-16-20250914/gcc/ada/sem_ch8.adb gcc-16-20250921/gcc/ada/sem_ch8.adb
*** gcc-16-20250914/gcc/ada/sem_ch8.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/sem_ch8.adb	Sun Sep 21 22:32:35 2025
*************** package body Sem_Ch8 is
*** 4340,4346 ****
           --  by inserting an extra with clause since redundant clauses don't
           --  really matter.
  
!          if All_Extensions_Allowed and then Is_In_Context_Clause (Clause) then
              declare
                 Unum        : Unit_Number_Type;
                 With_Clause : constant Node_Id :=
--- 4340,4351 ----
           --  by inserting an extra with clause since redundant clauses don't
           --  really matter.
  
!          if All_Extensions_Allowed
!            and then Is_In_Context_Clause (Clause)
!            and then Nkind (Pack) in N_Expanded_Name
!                                   | N_Identifier
!                                   | N_Selected_Component
!          then
              declare
                 Unum        : Unit_Number_Type;
                 With_Clause : constant Node_Id :=
*************** package body Sem_Ch8 is
*** 4531,4536 ****
--- 4536,4545 ----
  
        Id := Subtype_Mark (N);
        Find_Type (Id);
+       if not Is_Entity_Name (Id) then
+          pragma Assert (Serious_Errors_Detected > 0);
+          return;
+       end if;
        E := Base_Type (Entity (Id));
  
        --  There are many cases where a use_type_clause may be reanalyzed due to
*************** package body Sem_Ch8 is
*** 5031,5040 ****
     -----------------------------------
  
     procedure Check_In_Previous_With_Clause (N, Nam : Node_Id) is
!       Pack : constant Entity_Id := Entity (Original_Node (Nam));
        Item : Node_Id;
        Par  : Node_Id;
  
     begin
        Item := First (Context_Items (Parent (N)));
        while Present (Item) and then Item /= N loop
--- 5040,5076 ----
     -----------------------------------
  
     procedure Check_In_Previous_With_Clause (N, Nam : Node_Id) is
! 
!       function Get_Name (N : Node_Id) return Node_Id;
!       --  Return the name of a package that may be present in a clause
! 
!       --------------
!       -- Get_Name --
!       --------------
! 
!       function Get_Name (N : Node_Id) return Node_Id is
!       begin
!          case Nkind (N) is
!             when N_Indexed_Component =>
!                return Prefix (N);
! 
!             when N_Function_Call =>
!                return Name (N);
! 
!             when others =>
!                return N;
!          end case;
!       end Get_Name;
! 
!       --  Local variables
! 
!       Pack : constant Entity_Id := Entity (Get_Name (Original_Node (Nam)));
! 
        Item : Node_Id;
        Par  : Node_Id;
  
+    --  Start of processing for Check_In_Previous_With_Clause
+ 
     begin
        Item := First (Context_Items (Parent (N)));
        while Present (Item) and then Item /= N loop
*************** package body Sem_Ch8 is
*** 5045,5051 ****
             and then Nkind (Name (Item)) /= N_Selected_Component
             and then Entity (Name (Item)) = Pack
           then
!             Par := Nam;
  
              --  Find root library unit in with_clause
  
--- 5081,5087 ----
             and then Nkind (Name (Item)) /= N_Selected_Component
             and then Entity (Name (Item)) = Pack
           then
!             Par := Get_Name (Original_Node (Nam));
  
              --  Find root library unit in with_clause
  
*************** package body Sem_Ch8 is
*** 5053,5059 ****
                 Par := Prefix (Par);
              end loop;
  
!             if Is_Child_Unit (Entity (Original_Node (Par))) then
                 Error_Msg_NE ("& is not directly visible", Par, Entity (Par));
              else
                 return;
--- 5089,5095 ----
                 Par := Prefix (Par);
              end loop;
  
!             if Is_Child_Unit (Entity (Par)) then
                 Error_Msg_NE ("& is not directly visible", Par, Entity (Par));
              else
                 return;
*************** package body Sem_Ch8 is
*** 5085,5090 ****
--- 5121,5134 ----
        if Nkind (Parent (N)) /= N_Compilation_Unit then
           return;
  
+       --  Structural instances can always be renamed
+ 
+       elsif Is_Generic_Instance (Old_E)
+         and then Present (Get_Unit_Instantiation_Node (Old_E))
+         and then Is_Structural (Get_Unit_Instantiation_Node (Old_E))
+       then
+          return;
+ 
        --  Check for library unit. Note that we used to check for the scope
        --  being Standard here, but that was wrong for Standard itself.
  
*************** package body Sem_Ch8 is
*** 5467,5476 ****
           end if;
        end if;
  
!       if Is_Empty_Elmt_List (Used_Operations (N)) then
!          return;
! 
!       else
           Elmt := First_Elmt (Used_Operations (N));
           while Present (Elmt) loop
              Set_Is_Potentially_Use_Visible (Node (Elmt), False);
--- 5511,5517 ----
           end if;
        end if;
  
!       if Present (Used_Operations (N)) then
           Elmt := First_Elmt (Used_Operations (N));
           while Present (Elmt) loop
              Set_Is_Potentially_Use_Visible (Node (Elmt), False);
diff -Nrcpad gcc-16-20250914/gcc/ada/sem_prag.adb gcc-16-20250921/gcc/ada/sem_prag.adb
*** gcc-16-20250914/gcc/ada/sem_prag.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/sem_prag.adb	Sun Sep 21 22:32:35 2025
*************** package body Sem_Prag is
*** 5054,5059 ****
--- 5054,5069 ----
        --  Common checks for pragmas that appear within a main program
        --  (Priority, Main_Storage, Time_Slice, Relative_Deadline, CPU).
  
+       procedure Check_Inconsistent_Argument_Ghostliness
+         (Arg1               : Entity_Id;
+          Arg2               : Entity_Id;
+          Ghost_Error_Posted : in out Boolean);
+       --  Reports an error and sets Ghost_Error_Posted when:
+       --  * One argument is ghost and the other is not ghost
+       --  * One argument is checked ghost and the other is ignored ghost
+       --
+       --  Checks are avoided when Ghost_Error_Posted is already set.
+ 
        procedure Check_Interrupt_Or_Attach_Handler;
        --  Common processing for first argument of pragma Interrupt_Handler or
        --  pragma Attach_Handler.
*************** package body Sem_Prag is
*** 6033,6041 ****
           --  Flag set when an error concerning the illegal mix of Ghost and
           --  non-Ghost variables is emitted.
  
!          Ghost_Id : Entity_Id := Empty;
!          --  The entity of the first Ghost variable encountered while
!          --  processing the arguments of the pragma.
  
        begin
           GNAT_Pragma;
--- 6043,6052 ----
           --  Flag set when an error concerning the illegal mix of Ghost and
           --  non-Ghost variables is emitted.
  
!          First_Arg_Id : Entity_Id := Empty;
!          --  The entity of the first variable encountered while processing the
!          --  arguments of the pragma. This is used as a reference for assessing
!          --  the ghostliness of other arguments.
  
        begin
           GNAT_Pragma;
*************** package body Sem_Prag is
*** 6073,6113 ****
                       Set_Has_Pragma_Unused (Arg_Id);
                    end if;
  
!                   --  A pragma that applies to a Ghost entity becomes Ghost for
!                   --  the purposes of legality checks and removal of ignored
!                   --  Ghost code.
! 
!                   Mark_Ghost_Pragma (N, Arg_Id);
! 
!                   --  Capture the entity of the first Ghost variable being
                    --  processed for error detection purposes.
  
!                   if Is_Ghost_Entity (Arg_Id) then
!                      if No (Ghost_Id) then
!                         Ghost_Id := Arg_Id;
!                      end if;
! 
!                   --  Otherwise the variable is non-Ghost. It is illegal to mix
!                   --  references to Ghost and non-Ghost entities
!                   --  (SPARK RM 6.9).
! 
!                   elsif Present (Ghost_Id)
!                     and then not Ghost_Error_Posted
!                   then
!                      Ghost_Error_Posted := True;
! 
!                      Error_Msg_Name_1 := Pname;
!                      Error_Msg_N
!                        ("pragma % cannot mention ghost and non-ghost "
!                         & "variables", N);
  
!                      Error_Msg_Sloc := Sloc (Ghost_Id);
!                      Error_Msg_NE ("\& # declared as ghost", N, Ghost_Id);
  
!                      Error_Msg_Sloc := Sloc (Arg_Id);
!                      Error_Msg_NE ("\& # declared as non-ghost", N, Arg_Id);
                    end if;
  
                 --  Warn if already flagged as Unused or Unmodified
  
                 elsif Has_Pragma_Unmodified (Arg_Id) then
--- 6084,6105 ----
                       Set_Has_Pragma_Unused (Arg_Id);
                    end if;
  
!                   --  Capture the entity of the first variable being
                    --  processed for error detection purposes.
  
!                   if No (First_Arg_Id) then
!                      First_Arg_Id := Arg_Id;
  
!                      --  A pragma that applies to a Ghost entity becomes Ghost
!                      --  for the purposes of legality checks and removal of
!                      --  ignored Ghost code.
  
!                      Mark_Ghost_Pragma (N, Arg_Id);
                    end if;
  
+                   Check_Inconsistent_Argument_Ghostliness
+                     (First_Arg_Id, Arg_Id, Ghost_Error_Posted);
+ 
                 --  Warn if already flagged as Unused or Unmodified
  
                 elsif Has_Pragma_Unmodified (Arg_Id) then
*************** package body Sem_Prag is
*** 6149,6157 ****
           --  Flag set when an error concerning the illegal mix of Ghost and
           --  non-Ghost names is emitted.
  
!          Ghost_Id : Entity_Id := Empty;
!          --  The entity of the first Ghost name encountered while processing
!          --  the arguments of the pragma.
  
        begin
           GNAT_Pragma;
--- 6141,6150 ----
           --  Flag set when an error concerning the illegal mix of Ghost and
           --  non-Ghost names is emitted.
  
!          First_Arg_Id : Entity_Id := Empty;
!          --  The entity of the first variable encountered while processing the
!          --  arguments of the pragma. This is used as a reference for assessing
!          --  the ghostliness of other arguments.
  
        begin
           GNAT_Pragma;
*************** package body Sem_Prag is
*** 6214,6219 ****
--- 6207,6225 ----
                 if Is_Entity_Name (Arg_Expr) then
                    Arg_Id := Entity (Arg_Expr);
  
+                   --  Capture the entity of the first variable being
+                   --  processed for error detection purposes.
+ 
+                   if No (First_Arg_Id) then
+                      First_Arg_Id := Arg_Id;
+ 
+                      --  A pragma that applies to a Ghost entity becomes Ghost
+                      --  for the purposes of legality checks and removal of
+                      --  ignored Ghost code.
+ 
+                      Mark_Ghost_Pragma (N, Arg_Id);
+                   end if;
+ 
                    --  Warn if already flagged as Unused or Unreferenced and
                    --  skip processing the argument.
  
*************** package body Sem_Prag is
*** 6253,6288 ****
  
                       Mark_Ghost_Pragma (N, Arg_Id);
  
!                      --  Capture the entity of the first Ghost name being
!                      --  processed for error detection purposes.
! 
!                      if Is_Ghost_Entity (Arg_Id) then
!                         if No (Ghost_Id) then
!                            Ghost_Id := Arg_Id;
!                         end if;
! 
!                      --  Otherwise the name is non-Ghost. It is illegal to mix
!                      --  references to Ghost and non-Ghost entities
!                      --  (SPARK RM 6.9).
! 
!                      elsif Present (Ghost_Id)
!                        and then not Ghost_Error_Posted
!                      then
!                         Ghost_Error_Posted := True;
! 
!                         Error_Msg_Name_1 := Pname;
!                         Error_Msg_N
!                           ("pragma % cannot mention ghost and non-ghost "
!                            & "names", N);
! 
!                         Error_Msg_Sloc := Sloc (Ghost_Id);
!                         Error_Msg_NE
!                           ("\& # declared as ghost", N, Ghost_Id);
! 
!                         Error_Msg_Sloc := Sloc (Arg_Id);
!                         Error_Msg_NE
!                           ("\& # declared as non-ghost", N, Arg_Id);
!                      end if;
                    end if;
                 end if;
  
--- 6259,6266 ----
  
                       Mark_Ghost_Pragma (N, Arg_Id);
  
!                      Check_Inconsistent_Argument_Ghostliness
!                        (First_Arg_Id, Arg_Id, Ghost_Error_Posted);
                    end if;
                 end if;
  
*************** package body Sem_Prag is
*** 6439,6445 ****
--- 6417,6430 ----
              end if;
           end if;
  
+          --  We are going to check the entity that determines the ghost
+          --  region of that pragma. We need to disable the checks for ghost
+          --  context since the ghost region can only be set after analyzing
+          --  this entity.
+ 
+          Ghost_Context_Checks_Disabled := True;
           Analyze (Argx);
+          Ghost_Context_Checks_Disabled := False;
  
           if Nkind (Argx) not in N_Direct_Name
             and then (Nkind (Argx) /= N_Attribute_Reference
*************** package body Sem_Prag is
*** 7005,7010 ****
--- 6990,7080 ----
           end if;
        end Check_In_Main_Program;
  
+       ---------------------------------------------
+       -- Check_Inconsistent_Argument_Ghostliness --
+       ---------------------------------------------
+ 
+       procedure Check_Inconsistent_Argument_Ghostliness
+         (Arg1               : Entity_Id;
+          Arg2               : Entity_Id;
+          Ghost_Error_Posted : in out Boolean)
+       is
+ 
+          procedure Report_Ghost_Argument_Mismatch
+             (Ghost_Arg : Entity_Id; Non_Ghost_Arg : Entity_Id);
+          --  Constructs an error message when both a ghost and a non-ghost
+          --  argument are used in the same pragma.
+ 
+          procedure Report_Ghost_Policy_Mismatch
+             (Checked_Arg : Entity_Id; Ignored_Arg : Entity_Id);
+          --  Constructs an error message when both a checked ghost and an
+          --  ignored ghost argument are used in the same pragma.
+ 
+          ------------------------------------
+          -- Report_Ghost_Argument_Mismatch --
+          ------------------------------------
+ 
+          procedure Report_Ghost_Argument_Mismatch
+             (Ghost_Arg : Entity_Id; Non_Ghost_Arg : Entity_Id) is
+ 
+          begin
+             Error_Msg_Name_1 := Pname;
+             Error_Msg_N
+                ("pragma % cannot mention ghost and non-ghost " & "variables",
+                N);
+ 
+             Error_Msg_Sloc := Sloc (Ghost_Arg);
+             Error_Msg_NE ("\& # declared as ghost", N, Ghost_Arg);
+ 
+             Error_Msg_Sloc := Sloc (Non_Ghost_Arg);
+             Error_Msg_NE ("\& # declared as non-ghost", N, Non_Ghost_Arg);
+          end Report_Ghost_Argument_Mismatch;
+ 
+          ----------------------------------
+          -- Report_Ghost_Policy_Mismatch --
+          ----------------------------------
+ 
+          procedure Report_Ghost_Policy_Mismatch
+             (Checked_Arg : Entity_Id; Ignored_Arg : Entity_Id) is
+ 
+          begin
+             Error_Msg_Name_1 := Pname;
+             Error_Msg_N
+                ("pragma % cannot mention checked ghost and ignored ghost "
+                & "variables",
+                N);
+ 
+             Error_Msg_Sloc := Sloc (Checked_Arg);
+             Error_Msg_NE
+                ("\& # declared with a checked policy", N, Checked_Arg);
+ 
+             Error_Msg_Sloc := Sloc (Ignored_Arg);
+             Error_Msg_NE
+                ("\& # declared with an ignored policy", N, Ignored_Arg);
+          end Report_Ghost_Policy_Mismatch;
+       begin
+          if Ghost_Error_Posted then
+             null;
+          elsif Is_Ghost_Entity (Arg1) and then not Is_Ghost_Entity (Arg2) then
+             Report_Ghost_Argument_Mismatch (Arg1, Arg2);
+             Ghost_Error_Posted := True;
+          elsif not Is_Ghost_Entity (Arg1) and then Is_Ghost_Entity (Arg2)
+          then
+             Report_Ghost_Argument_Mismatch (Arg2, Arg1);
+             Ghost_Error_Posted := True;
+          elsif Is_Checked_Ghost_Entity (Arg1)
+             and then Is_Ignored_Ghost_Entity (Arg2)
+          then
+             Report_Ghost_Policy_Mismatch (Arg1, Arg2);
+             Ghost_Error_Posted := True;
+          elsif Is_Ignored_Ghost_Entity (Arg1)
+             and then Is_Checked_Ghost_Entity (Arg2)
+          then
+             Report_Ghost_Policy_Mismatch (Arg2, Arg1);
+             Ghost_Error_Posted := True;
+          end if;
+       end Check_Inconsistent_Argument_Ghostliness;
+ 
        ---------------------------------------
        -- Check_Interrupt_Or_Attach_Handler --
        ---------------------------------------
*************** package body Sem_Prag is
*** 9221,9228 ****
--- 9291,9305 ----
           Check_Optional_Identifier (Arg2, Name_Entity);
           Check_Arg_Is_Local_Name (Arg2);
  
+          --  We are going to check the entity that determines the ghost
+          --  region of that pragma. We need to disable the checks for ghost
+          --  context since the ghost region can only be set after analyzing
+          --  this entity.
+ 
+          Ghost_Context_Checks_Disabled := True;
           Id := Get_Pragma_Arg (Arg2);
           Analyze (Id);
+          Ghost_Context_Checks_Disabled := False;
  
           if not Is_Entity_Name (Id) then
              Error_Pragma_Arg ("entity name required", Arg2);
*************** package body Sem_Prag is
*** 10674,10682 ****
           --  Flag set when an error concerning the illegal mix of Ghost and
           --  non-Ghost subprograms is emitted.
  
!          Ghost_Id : Entity_Id := Empty;
!          --  The entity of the first Ghost subprogram encountered while
!          --  processing the arguments of the pragma.
  
           procedure Check_Inline_Always_Placement (Spec_Id : Entity_Id);
           --  Verify the placement of pragma Inline_Always with respect to the
--- 10751,10760 ----
           --  Flag set when an error concerning the illegal mix of Ghost and
           --  non-Ghost subprograms is emitted.
  
!          First_Arg_Id : Entity_Id := Empty;
!          --  The entity of the first variable encountered while processing the
!          --  arguments of the pragma. This is used as a reference for assessing
!          --  the ghostliness of other arguments.
  
           procedure Check_Inline_Always_Placement (Spec_Id : Entity_Id);
           --  Verify the placement of pragma Inline_Always with respect to the
*************** package body Sem_Prag is
*** 11164,11199 ****
                    end if;
              end case;
  
!             --  A pragma that applies to a Ghost entity becomes Ghost for the
!             --  purposes of legality checks and removal of ignored Ghost code.
! 
!             Mark_Ghost_Pragma (N, Subp);
! 
!             --  Capture the entity of the first Ghost subprogram being
              --  processed for error detection purposes.
  
!             if Is_Ghost_Entity (Subp) then
!                if No (Ghost_Id) then
!                   Ghost_Id := Subp;
!                end if;
! 
!             --  Otherwise the subprogram is non-Ghost. It is illegal to mix
!             --  references to Ghost and non-Ghost entities (SPARK RM 6.9).
! 
!             elsif Present (Ghost_Id) and then not Ghost_Error_Posted then
!                Ghost_Error_Posted := True;
! 
!                Error_Msg_Name_1 := Pname;
!                Error_Msg_N
!                  ("pragma % cannot mention ghost and non-ghost subprograms",
!                   N);
  
!                Error_Msg_Sloc := Sloc (Ghost_Id);
!                Error_Msg_NE ("\& # declared as ghost", N, Ghost_Id);
  
!                Error_Msg_Sloc := Sloc (Subp);
!                Error_Msg_NE ("\& # declared as non-ghost", N, Subp);
              end if;
           end Set_Inline_Flags;
  
        --  Start of processing for Process_Inline
--- 11242,11262 ----
                    end if;
              end case;
  
!             --  Capture the entity of the first variable being
              --  processed for error detection purposes.
  
!             if No (First_Arg_Id) then
!                First_Arg_Id := Subp;
  
!                --  A pragma that applies to a Ghost entity becomes Ghost
!                --  for the purposes of legality checks and removal of
!                --  ignored Ghost code.
  
!                Mark_Ghost_Pragma (N, Subp);
              end if;
+ 
+             Check_Inconsistent_Argument_Ghostliness
+               (First_Arg_Id, Subp, Ghost_Error_Posted);
           end Set_Inline_Flags;
  
        --  Start of processing for Process_Inline
*************** package body Sem_Prag is
*** 12022,12028 ****
--- 12085,12099 ----
  
              Check_Optional_Identifier (Arg2, Name_On);
              E_Id := Get_Pragma_Arg (Arg2);
+ 
+             --  We are going to check the entity that determines the ghost
+             --  region of that pragma. We need to disable the checks for ghost
+             --  context since the ghost region can only be set after analyzing
+             --  this entity.
+ 
+             Ghost_Context_Checks_Disabled := True;
              Analyze (E_Id);
+             Ghost_Context_Checks_Disabled := False;
  
              if not Is_Entity_Name (E_Id) then
                 Error_Pragma_Arg
*************** package body Sem_Prag is
*** 13216,13222 ****
                 procedure Check_Ghost_Synchronous is
                 begin
                    --  A synchronized abstract state cannot be Ghost and vice
!                   --  versa (SPARK RM 6.9(21)).
  
                    if Ghost_Seen and Synchronous_Seen then
                       SPARK_Msg_N ("synchronized state cannot be ghost", State);
--- 13287,13293 ----
                 procedure Check_Ghost_Synchronous is
                 begin
                    --  A synchronized abstract state cannot be Ghost and vice
!                   --  versa (SPARK RM 6.9(22)).
  
                    if Ghost_Seen and Synchronous_Seen then
                       SPARK_Msg_N ("synchronized state cannot be ghost", State);
*************** package body Sem_Prag is
*** 14384,14392 ****
--- 14455,14469 ----
  
                 --  Perform preanalysis to deal with embedded Loop_Entry
                 --  attributes.
+                --
+                --  But ignore the ghost context checks for now. The expression
+                --  will be reanalyzed with the correct ghost region once the
+                --  pragma has been converted to pragma check.
  
+                Ghost_Context_Checks_Disabled := True;
                 Preanalyze_And_Resolve_Assert_Expression
                    (Arg_Check, Any_Boolean);
+                Ghost_Context_Checks_Disabled := False;
              end if;
  
              --  Implement Assert[_And_Cut]/Assume/Loop_Invariant by generating
*************** package body Sem_Prag is
*** 14774,14779 ****
--- 14851,14872 ----
                             ("invalid assertion kind for pragma%",
                             Arg);
                       end if;
+ 
+                      --  An Assertion_Policy pragma specifying an
+                      --  Assertion_Level policy shall not occur within a ghost
+                      --  subprogram or package associated to an assertion level
+                      --  which depends on this level (SPARK RM 6.9(19)).
+ 
+                      if Ghost_Config.Ghost_Mode > None
+                        and then Is_Same_Or_Depends_On_Level
+                                   (Ghost_Config.Ghost_Mode_Assertion_Level,
+                                    Level)
+                      then
+                         Error_Msg_Name_2 := Chars (Level);
+                         Error_Pragma
+                           ("pragma % cannot appear within ghost subprogram or "
+                            & "package that depends on %");
+                      end if;
                    end if;
  
                    Check_Arg_Is_One_Of (Arg, Policy_Names);
*************** package body Sem_Prag is
*** 14783,14789 ****
                    if Kind = Name_Ghost then
  
                       --  The Ghost policy must be either Check or Ignore
!                      --  (SPARK RM 6.9(6)).
  
                       if Chars (Policy) not in Name_Check | Name_Ignore then
                          Error_Pragma_Arg
--- 14876,14882 ----
                    if Kind = Name_Ghost then
  
                       --  The Ghost policy must be either Check or Ignore
!                      --  (SPARK RM 6.9(8)).
  
                       if Chars (Policy) not in Name_Check | Name_Ignore then
                          Error_Pragma_Arg
*************** package body Sem_Prag is
*** 14793,14799 ****
  
                       --  Pragma Assertion_Policy specifying a Ghost policy
                       --  cannot occur within a Ghost subprogram or package
!                      --  (SPARK RM 6.9(16)).
  
                       if Ghost_Config.Ghost_Mode > None then
                          Error_Pragma
--- 14886,14892 ----
  
                       --  Pragma Assertion_Policy specifying a Ghost policy
                       --  cannot occur within a Ghost subprogram or package
!                      --  (SPARK RM 6.9(19)).
  
                       if Ghost_Config.Ghost_Mode > None then
                          Error_Pragma
*************** package body Sem_Prag is
*** 15041,15046 ****
--- 15134,15140 ----
              Check_Ada_83_Warning;
              Check_No_Identifiers;
              Check_Arg_Count (1);
+ 
              Check_Arg_Is_Local_Name (Arg1);
  
              if Debug_Flag_U then
*************** package body Sem_Prag is
*** 15048,15055 ****
--- 15142,15157 ----
              end if;
  
              C_Ent := Cunit_Entity (Current_Sem_Unit);
+ 
+             --  We are going to check the entity that determines the ghost
+             --  region of that pragma. We need to disable the checks for ghost
+             --  context since the ghost region can only be set after analyzing
+             --  this entity.
+ 
+             Ghost_Context_Checks_Disabled := True;
              Analyze (Get_Pragma_Arg (Arg1));
              Nm := Entity (Get_Pragma_Arg (Arg1));
+             Ghost_Context_Checks_Disabled := False;
  
              --  A pragma that applies to a Ghost entity becomes Ghost for the
              --  purposes of legality checks and removal of ignored Ghost code.
*************** package body Sem_Prag is
*** 19158,19164 ****
                    end if;
  
                 --  Task unit declared without a definition cannot be subject to
!                --  pragma Ghost (SPARK RM 6.9(21)).
  
                 elsif Nkind (Stmt) in
                         N_Single_Task_Declaration | N_Task_Type_Declaration
--- 19260,19266 ----
                    end if;
  
                 --  Task unit declared without a definition cannot be subject to
!                --  pragma Ghost (SPARK RM 6.9(22)).
  
                 elsif Nkind (Stmt) in
                         N_Single_Task_Declaration | N_Task_Type_Declaration
*************** package body Sem_Prag is
*** 19254,19260 ****
              end if;
  
              --  Protected and task types cannot be subject to pragma Ghost
!             --  (SPARK RM 6.9(21)).
  
              if Nkind (Context) in N_Protected_Body | N_Protected_Definition
              then
--- 19356,19362 ----
              end if;
  
              --  Protected and task types cannot be subject to pragma Ghost
!             --  (SPARK RM 6.9(22)).
  
              if Nkind (Context) in N_Protected_Body | N_Protected_Definition
              then
*************** package body Sem_Prag is
*** 19312,19318 ****
  
                    --  The full declaration of a deferred constant cannot be
                    --  subject to pragma Ghost unless the deferred declaration
!                   --  is also Ghost (SPARK RM 6.9(9)).
  
                    if Ekind (Prev_Id) = E_Constant then
                       Error_Msg_Name_1 := Pname;
--- 19414,19420 ----
  
                    --  The full declaration of a deferred constant cannot be
                    --  subject to pragma Ghost unless the deferred declaration
!                   --  is also Ghost (SPARK RM 6.9(11)).
  
                    if Ekind (Prev_Id) = E_Constant then
                       Error_Msg_Name_1 := Pname;
*************** package body Sem_Prag is
*** 19330,19336 ****
  
                    --  The full declaration of a type cannot be subject to
                    --  pragma Ghost unless the partial view is also Ghost
!                   --  (SPARK RM 6.9(9)).
  
                    else
                       Error_Msg_NE (Fix_Error
--- 19432,19438 ----
  
                    --  The full declaration of a type cannot be subject to
                    --  pragma Ghost unless the partial view is also Ghost
!                   --  (SPARK RM 6.9(11)).
  
                    else
                       Error_Msg_NE (Fix_Error
*************** package body Sem_Prag is
*** 19341,19347 ****
                 end if;
  
              --  A synchronized object cannot be subject to pragma Ghost
!             --  (SPARK RM 6.9(21)).
  
              elsif Ekind (Id) = E_Variable then
                 if Is_Protected_Type (Etype (Id)) then
--- 19443,19449 ----
                 end if;
  
              --  A synchronized object cannot be subject to pragma Ghost
!             --  (SPARK RM 6.9(22)).
  
              elsif Ekind (Id) = E_Variable then
                 if Is_Protected_Type (Etype (Id)) then
*************** package body Sem_Prag is
*** 19371,19377 ****
                       Is_Ghost := False;
  
                       --  "Ghostness" cannot be turned off once enabled within a
!                      --  region (SPARK RM 6.9(6)).
  
                       if Ghost_Config.Ghost_Mode > None  then
                          Error_Pragma
--- 19473,19479 ----
                       Is_Ghost := False;
  
                       --  "Ghostness" cannot be turned off once enabled within a
!                      --  region (SPARK RM 6.9(8)).
  
                       if Ghost_Config.Ghost_Mode > None  then
                          Error_Pragma
*************** package body Sem_Prag is
*** 19397,19402 ****
--- 19499,19505 ----
              --  pragma Ghost (False).
  
              if Is_Ghost then
+                Set_Is_Implicit_Ghost (Id, False);
                 Set_Is_Ghost_Entity (Id);
              end if;
           end Ghost;
*************** package body Sem_Prag is
*** 22345,22353 ****
              --  Flag set when an error concerning the illegal mix of Ghost and
              --  non-Ghost subprograms is emitted.
  
!             Ghost_Id : Entity_Id := Empty;
!             --  The entity of the first Ghost procedure encountered while
!             --  processing the arguments of the pragma.
  
           begin
              Ada_2005_Pragma;
--- 22448,22457 ----
              --  Flag set when an error concerning the illegal mix of Ghost and
              --  non-Ghost subprograms is emitted.
  
!             First_Arg_Id : Entity_Id := Empty;
!             --  The entity of the first variable encountered while processing
!             --  the arguments of the pragma. This is used as a reference for
!             --  assessing the ghostliness of other arguments.
  
           begin
              Ada_2005_Pragma;
*************** package body Sem_Prag is
*** 22359,22365 ****
--- 22463,22477 ----
              while Present (Arg) loop
                 Check_Arg_Is_Local_Name (Arg);
                 Id := Get_Pragma_Arg (Arg);
+ 
+                --  We are going to check the entity that determines the ghost
+                --  region of that pragma. We need to disable the checks for
+                --  ghost context since the ghost region can only be set after
+                --  analyzing this entity.
+ 
+                Ghost_Context_Checks_Disabled := True;
                 Analyze (Id);
+                Ghost_Context_Checks_Disabled := False;
  
                 if not Is_Entity_Name (Id) then
                    Error_Pragma_Arg ("entity name required", Arg);
*************** package body Sem_Prag is
*** 22436,22477 ****
                             Set_No_Return (E);
                          end if;
  
!                         --  A pragma that applies to a Ghost entity becomes
!                         --  Ghost for the purposes of legality checks and
!                         --  removal of ignored Ghost code.
! 
!                         Mark_Ghost_Pragma (N, E);
! 
!                         --  Capture the entity of the first Ghost procedure
!                         --  being processed for error detection purposes.
! 
!                         if Is_Ghost_Entity (E) then
!                            if No (Ghost_Id) then
!                               Ghost_Id := E;
!                            end if;
! 
!                         --  Otherwise the subprogram is non-Ghost. It is
!                         --  illegal to mix references to Ghost and non-Ghost
!                         --  entities (SPARK RM 6.9).
! 
!                         elsif Present (Ghost_Id)
!                           and then not Ghost_Error_Posted
!                         then
!                            Ghost_Error_Posted := True;
  
!                            Error_Msg_Name_1 := Pname;
!                            Error_Msg_N
!                              ("pragma % cannot mention ghost and non-ghost "
!                               & "procedures", N);
  
!                            Error_Msg_Sloc := Sloc (Ghost_Id);
!                            Error_Msg_NE
!                              ("\& # declared as ghost", N, Ghost_Id);
  
!                            Error_Msg_Sloc := Sloc (E);
!                            Error_Msg_NE ("\& # declared as non-ghost", N, E);
                          end if;
  
                          --  Set flag on any alias as well
  
                          if Is_Overloadable (E)
--- 22548,22569 ----
                             Set_No_Return (E);
                          end if;
  
!                         --  Capture the entity of the first variable being
!                         --  processed for error detection purposes.
  
!                         if No (First_Arg_Id) then
!                            First_Arg_Id := E;
  
!                            --  A pragma that applies to a Ghost entity becomes
!                            --  Ghost for the purposes of legality checks and
!                            --  removal of ignored Ghost code.
  
!                            Mark_Ghost_Pragma (N, E);
                          end if;
  
+                         Check_Inconsistent_Argument_Ghostliness
+                           (First_Arg_Id, E, Ghost_Error_Posted);
+ 
                          --  Set flag on any alias as well
  
                          if Is_Overloadable (E)
*************** package body Sem_Prag is
*** 27945,27953 ****
              --  Flag set when an error concerning the illegal mix of Ghost and
              --  non-Ghost types is emitted.
  
!             Ghost_Id : Entity_Id := Empty;
!             --  The entity of the first Ghost type encountered while processing
!             --  the arguments of the pragma.
  
           begin
              GNAT_Pragma;
--- 28037,28046 ----
              --  Flag set when an error concerning the illegal mix of Ghost and
              --  non-Ghost types is emitted.
  
!             First_Arg_Id : Entity_Id := Empty;
!             --  The entity of the first variable encountered while processing
!             --  the arguments of the pragma. This is used as a reference for
!             --  assessing the ghostliness of other arguments.
  
           begin
              GNAT_Pragma;
*************** package body Sem_Prag is
*** 27962,28004 ****
                 if Is_Entity_Name (Arg_Expr) then
                    Arg_Id := Entity (Arg_Expr);
  
!                   if Is_Type (Arg_Id) then
!                      Set_Has_Pragma_Unreferenced_Objects (Arg_Id);
  
                       --  A pragma that applies to a Ghost entity becomes Ghost
                       --  for the purposes of legality checks and removal of
                       --  ignored Ghost code.
  
                       Mark_Ghost_Pragma (N, Arg_Id);
  
!                      --  Capture the entity of the first Ghost type being
!                      --  processed for error detection purposes.
! 
!                      if Is_Ghost_Entity (Arg_Id) then
!                         if No (Ghost_Id) then
!                            Ghost_Id := Arg_Id;
!                         end if;
! 
!                      --  Otherwise the type is non-Ghost. It is illegal to mix
!                      --  references to Ghost and non-Ghost entities
!                      --  (SPARK RM 6.9).
! 
!                      elsif Present (Ghost_Id)
!                        and then not Ghost_Error_Posted
!                      then
!                         Ghost_Error_Posted := True;
! 
!                         Error_Msg_Name_1 := Pname;
!                         Error_Msg_N
!                           ("pragma % cannot mention ghost and non-ghost types",
!                            N);
  
!                         Error_Msg_Sloc := Sloc (Ghost_Id);
!                         Error_Msg_NE ("\& # declared as ghost", N, Ghost_Id);
  
-                         Error_Msg_Sloc := Sloc (Arg_Id);
-                         Error_Msg_NE ("\& # declared as non-ghost", N, Arg_Id);
-                      end if;
                    else
                       Error_Pragma_Arg
                         ("argument for pragma% must be type or subtype", Arg);
--- 28055,28079 ----
                 if Is_Entity_Name (Arg_Expr) then
                    Arg_Id := Entity (Arg_Expr);
  
!                   --  Capture the entity of the first Ghost type being
!                   --  processed for error detection purposes.
! 
!                   if No (First_Arg_Id) then
!                      First_Arg_Id := Arg_Id;
  
                       --  A pragma that applies to a Ghost entity becomes Ghost
                       --  for the purposes of legality checks and removal of
                       --  ignored Ghost code.
  
                       Mark_Ghost_Pragma (N, Arg_Id);
+                   end if;
  
!                   if Is_Type (Arg_Id) then
!                      Set_Has_Pragma_Unreferenced_Objects (Arg_Id);
  
!                      Check_Inconsistent_Argument_Ghostliness
!                        (First_Arg_Id, Arg_Id, Ghost_Error_Posted);
  
                    else
                       Error_Pragma_Arg
                         ("argument for pragma% must be type or subtype", Arg);
*************** package body Sem_Prag is
*** 34148,34154 ****
             or else P_Nam = Name_Assertion
             or else (P_Nam = Name_Statement_Assertions
                      and then Is_Statement_Assertion (Nam))
!            or else (Present (Level) and then Entity (P_Arg) = Level)
           then
              return Chars (Get_Pragma_Arg (Last (Assocs)));
           end if;
--- 34223,34229 ----
             or else P_Nam = Name_Assertion
             or else (P_Nam = Name_Statement_Assertions
                      and then Is_Statement_Assertion (Nam))
!            or else (Present (Level) and then P_Nam = Chars (Level))
           then
              return Chars (Get_Pragma_Arg (Last (Assocs)));
           end if;
diff -Nrcpad gcc-16-20250914/gcc/ada/sem_prag.ads gcc-16-20250921/gcc/ada/sem_prag.ads
*** gcc-16-20250914/gcc/ada/sem_prag.ads	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/sem_prag.ads	Sun Sep 21 22:32:35 2025
*************** package Sem_Prag is
*** 283,288 ****
--- 283,289 ----
          Pragma_Favor_Top_Level              => True,
          Pragma_Import                       => True,
          Pragma_Independent_Components       => True,
+         Pragma_Inline                       => True,
          Pragma_Interface                    => True,
          Pragma_No_Return                    => True,
          Pragma_Obsolescent                  => True,
diff -Nrcpad gcc-16-20250914/gcc/ada/sem_res.adb gcc-16-20250921/gcc/ada/sem_res.adb
*** gcc-16-20250914/gcc/ada/sem_res.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/sem_res.adb	Sun Sep 21 22:32:35 2025
*************** package body Sem_Res is
*** 5273,5279 ****
              end if;
  
              --  The actual parameter of a Ghost subprogram whose formal is of
!             --  mode IN OUT or OUT must be a Ghost variable (SPARK RM 6.9(12)).
  
              if Comes_From_Source (Nam)
                and then Is_Ghost_Entity (Nam)
--- 5273,5279 ----
              end if;
  
              --  The actual parameter of a Ghost subprogram whose formal is of
!             --  mode IN OUT or OUT must be a Ghost variable (SPARK RM 6.9(15)).
  
              if Comes_From_Source (Nam)
                and then Is_Ghost_Entity (Nam)
diff -Nrcpad gcc-16-20250914/gcc/ada/sem_util.adb gcc-16-20250921/gcc/ada/sem_util.adb
*** gcc-16-20250914/gcc/ada/sem_util.adb	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/sem_util.adb	Sun Sep 21 22:32:35 2025
*************** package body Sem_Util is
*** 347,352 ****
--- 347,479 ----
        Analyze (Decl);
     end Add_Global_Declaration;
  
+    ---------------------------
+    -- Add_Local_Declaration --
+    ---------------------------
+ 
+    procedure Add_Local_Declaration
+      (Decl : Node_Id;
+       N    : Node_Id;
+       Scop : Entity_Id)
+    is
+       function Find_Associated_Scope (N : Node_Id) return Scope_Kind_Id;
+       --  Return the scope associated with the declarative part of N
+ 
+       ---------------------------
+       -- Find_Associated_Scope --
+       ---------------------------
+ 
+       function Find_Associated_Scope (N : Node_Id) return Scope_Kind_Id is
+       begin
+          case Nkind (N) is
+             when N_Block_Statement =>
+                return Entity (Identifier (N));
+ 
+             when N_Compilation_Unit
+                | N_Compilation_Unit_Aux
+             =>
+                return Standard_Standard;
+ 
+             when N_Package_Specification
+                | N_Protected_Definition
+                | N_Task_Definition
+             =>
+                return Defining_Entity (Parent (N));
+ 
+             when N_Entry_Body
+                | N_Package_Body
+                | N_Protected_Body
+                | N_Task_Body
+             =>
+                return Corresponding_Spec (N);
+ 
+             when N_Subprogram_Body =>
+                if Acts_As_Spec (N) then
+                   return Defining_Entity (N);
+                else
+                   return Corresponding_Spec (N);
+                end if;
+ 
+             when others =>
+                raise Program_Error;
+          end case;
+       end Find_Associated_Scope;
+ 
+       --  Local variables
+ 
+       Nod : Node_Id;
+       Par : Node_Id;
+ 
+    --  Start of processing for Add_Local_Declaration
+ 
+    begin
+       Nod := N;
+       Par := Parent (Nod);
+ 
+       --  Look for the innermost enclosing construct with a declarative part
+ 
+       while Nkind (Par) not in N_Block_Statement
+                              | N_Compilation_Unit
+                              | N_Compilation_Unit_Aux
+                              | N_Entry_Body
+                              | N_Package_Body
+                              | N_Package_Specification
+                              | N_Protected_Body
+                              | N_Protected_Definition
+                              | N_Subprogram_Body
+                              | N_Task_Body
+                              | N_Task_Definition
+          or else (Present (Scop) and Find_Associated_Scope (Par) /= Scop)
+       loop
+          Nod := Par;
+          Par := Parent (Nod);
+       end loop;
+ 
+       --  Compilation units do not directly have a declarative part
+ 
+       if Nkind (Par) = N_Compilation_Unit then
+          Par := Aux_Decls_Node (Par);
+       end if;
+ 
+       --  Insert Decl before N or at the end of the declarative part
+ 
+       case Nkind (Par) is
+          when N_Block_Statement
+             | N_Compilation_Unit_Aux
+             | N_Entry_Body
+             | N_Package_Body
+             | N_Protected_Body
+             | N_Subprogram_Body
+             | N_Task_Body
+          =>
+             if Is_List_Member (Nod)
+               and then List_Containing (Nod) = Declarations (Par)
+             then
+                Insert_Before (Nod, Decl);
+ 
+             else
+                if No (Declarations (Par)) then
+                   Set_Declarations (Par, New_List);
+                end if;
+ 
+                Append_To (Declarations (Par), Decl);
+             end if;
+ 
+          when N_Package_Specification
+             | N_Protected_Definition
+             | N_Task_Definition
+          =>
+             Insert_Before (Nod, Decl);
+ 
+          when others =>
+             raise Program_Error;
+       end case;
+ 
+       Push_Scope (Find_Associated_Scope (Par));
+       Analyze (Decl);
+       Pop_Scope;
+    end Add_Local_Declaration;
+ 
     --------------------------------
     -- Address_Integer_Convert_OK --
     --------------------------------
*************** package body Sem_Util is
*** 6743,6748 ****
--- 6870,6897 ----
        end if;
     end Defining_Entity;
  
+    ---------------------------------
+    -- Defining_Entity_Of_Instance --
+    ---------------------------------
+ 
+    function Defining_Entity_Of_Instance (N : Node_Id) return Entity_Id is
+       pragma Assert (Nkind (N) in N_Generic_Instantiation);
+       Spec : constant Node_Id := Instance_Spec (N);
+ 
+    begin
+       --  Fall back to Defining_Entity in case of previous errors
+ 
+       if No (Spec) then
+          return Defining_Entity (N);
+       end if;
+ 
+       if Nkind (N) = N_Package_Instantiation then
+          return Defining_Entity (Specification (Spec));
+       else
+          return Related_Instance (Defining_Entity (Specification (Spec)));
+       end if;
+    end Defining_Entity_Of_Instance;
+ 
     ------------------------------
     -- Defining_Entity_Or_Empty --
     ------------------------------
*************** package body Sem_Util is
*** 15991,16004 ****
       (E1 : Entity_Id;
        E2 : Entity_Id) return Boolean
     is
!       Par : Entity_Id := E2;
     begin
!       while Present (Par) and then Par /= Standard_Standard loop
!          if Par = E1 then
              return True;
           end if;
  
!          Par := Scope (Par);
        end loop;
  
        return False;
--- 16140,16153 ----
       (E1 : Entity_Id;
        E2 : Entity_Id) return Boolean
     is
!       Cursor : Entity_Id := E2;
     begin
!       while Present (Cursor) and then Cursor /= Standard_Standard loop
!          if Cursor = E1 then
              return True;
           end if;
  
!          Cursor := Scope (Cursor);
        end loop;
  
        return False;
diff -Nrcpad gcc-16-20250914/gcc/ada/sem_util.ads gcc-16-20250921/gcc/ada/sem_util.ads
*** gcc-16-20250914/gcc/ada/sem_util.ads	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/sem_util.ads	Sun Sep 21 22:32:35 2025
*************** package Sem_Util is
*** 62,67 ****
--- 62,76 ----
     --  for the current unit. The declared entity is added to current scope,
     --  so the caller should push a new scope as required before the call.
  
+    procedure Add_Local_Declaration
+      (Decl : Node_Id;
+       N    : Node_Id;
+       Scop : Entity_Id);
+    --  This procedure adds a declaration Decl to the innermost declarative
+    --  part that covers N, whose associated scope is Scop if Scop is present,
+    --  and before N if N is in this declarative part. The declared entity is
+    --  added to the scope associated with the declarative part.
+ 
     function Add_Suffix (E : Entity_Id; Suffix : Character) return Name_Id;
     --  Returns the name of E adding Suffix
  
*************** package Sem_Util is
*** 687,692 ****
--- 696,706 ----
     --  This is equivalent to Defining_Entity but it returns Empty for nodes
     --  without an entity instead of raising Program_Error.
  
+    function Defining_Entity_Of_Instance (N : Node_Id) return Entity_Id;
+    --  Given an N_Generic_Instantiation node, returns the defining entity of
+    --  the instance, that is to say the entity that is declared at N (which
+    --  is not the same as Defining_Entity (N), see Sem_Ch12).
+ 
     function Denotes_Discriminant
       (N                : Node_Id;
        Check_Concurrent : Boolean := False) return Boolean;
*************** package Sem_Util is
*** 1506,1511 ****
--- 1520,1527 ----
     --  for which the Extended_Access aspect has been specified, either
     --  explicitly or by inheritance.
  
+    --  WARNING: There is a matching C declaration of this subprogram in fe.h
+ 
     function Is_Function_With_Side_Effects (Subp : Entity_Id) return Boolean;
     --  Return True if Subp is a function with side effects, ie. it has a
     --  (direct or inherited) pragma Side_Effects with static value True.
*************** package Sem_Util is
*** 1849,1855 ****
     function Is_Ancestor_Package
       (E1 : Entity_Id;
        E2 : Entity_Id) return Boolean;
!    --  True if package E1 is an ancestor of E2 other than E2 itself
  
     function Is_Atomic_Object (N : Node_Id) return Boolean;
     --  Determine whether arbitrary node N denotes a reference to an atomic
--- 1865,1871 ----
     function Is_Ancestor_Package
       (E1 : Entity_Id;
        E2 : Entity_Id) return Boolean;
!    --  True if package E1 is an ancestor of E2
  
     function Is_Atomic_Object (N : Node_Id) return Boolean;
     --  Determine whether arbitrary node N denotes a reference to an atomic
diff -Nrcpad gcc-16-20250914/gcc/ada/sinfo.ads gcc-16-20250921/gcc/ada/sinfo.ads
*** gcc-16-20250914/gcc/ada/sinfo.ads	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ada/sinfo.ads	Sun Sep 21 22:32:35 2025
*************** package Sinfo is
*** 1878,1883 ****
--- 1878,1889 ----
     --    Indicates that an expression is a static expression according to the
     --    rules in RM-4.9. See Sem_Eval for details.
  
+    --  Is_Structural
+    --    Present in N_Generic_Instantiation nodes. Set if the instantiation is
+    --    structural, that is to say, is the unique anonymous instantiation of
+    --    the generic unit on the actual parameters done in the outermost scope
+    --    where it would be legal to declare an identical named instantiation.
+ 
     --  Is_Subprogram_Descriptor
     --    Present in N_Object_Declaration, and set only for the object
     --    declaration generated for a subprogram descriptor in fast exception
*************** package Sinfo is
*** 7119,7124 ****
--- 7125,7131 ----
        --  Is_Elaboration_Warnings_OK_Node
        --  Is_Declaration_Level_Node
        --  Is_Known_Guaranteed_ABE
+       --  Is_Structural
  
        --  N_Procedure_Instantiation
        --  Sloc points to PROCEDURE
*************** package Sinfo is
*** 7135,7140 ****
--- 7142,7148 ----
        --  Must_Override set if overriding indicator present
        --  Must_Not_Override set if not_overriding indicator present
        --  Is_Known_Guaranteed_ABE
+       --  Is_Structural
  
        --  N_Function_Instantiation
        --  Sloc points to FUNCTION
*************** package Sinfo is
*** 7151,7156 ****
--- 7159,7165 ----
        --  Must_Override set if overriding indicator present
        --  Must_Not_Override set if not_overriding indicator present
        --  Is_Known_Guaranteed_ABE
+       --  Is_Structural
  
        --  Note: overriding indicator is an Ada 2005 feature
  
diff -Nrcpad gcc-16-20250914/gcc/analyzer/ChangeLog gcc-16-20250921/gcc/analyzer/ChangeLog
*** gcc-16-20250914/gcc/analyzer/ChangeLog	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/analyzer/ChangeLog	Sun Sep 21 22:32:36 2025
***************
*** 1,3 ****
--- 1,7 ----
+ 2025-09-15  Alexandre Oliva  <oliva@adacore.com>
+ 
+ 	* kf.cc (register_known_functions): Add __get_errno_ptr.
+ 
  2025-08-29  David Malcolm  <dmalcolm@redhat.com>
  
  	* pending-diagnostic.cc: Include "diagnostics/logging.h".
diff -Nrcpad gcc-16-20250914/gcc/analyzer/kf.cc gcc-16-20250921/gcc/analyzer/kf.cc
*** gcc-16-20250914/gcc/analyzer/kf.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/analyzer/kf.cc	Sun Sep 21 22:32:36 2025
*************** register_known_functions (known_function
*** 2373,2378 ****
--- 2373,2379 ----
      kfm.add ("___errno", std::make_unique<kf_errno_location> ());
      kfm.add ("__error", std::make_unique<kf_errno_location> ());
      kfm.add ("__errno", std::make_unique<kf_errno_location> ());
+     kfm.add ("__get_errno_ptr", std::make_unique<kf_errno_location> ());
    }
  
    /* Language-specific support functions.  */
diff -Nrcpad gcc-16-20250914/gcc/auto-profile.cc gcc-16-20250921/gcc/auto-profile.cc
*** gcc-16-20250914/gcc/auto-profile.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/auto-profile.cc	Sun Sep 21 22:32:36 2025
*************** autofdo_source_profile::read ()
*** 2627,2633 ****
       bigger than sum_max eventually.  */
    if (afdo_profile_info->sum_max)
      afdo_count_scale
!       = MAX (((gcov_type)1 << (profile_count::n_bits / 2))
  	     / afdo_profile_info->sum_max, 1);
    afdo_profile_info->cutoff *= afdo_count_scale;
    afdo_hot_bb_threshod
--- 2627,2633 ----
       bigger than sum_max eventually.  */
    if (afdo_profile_info->sum_max)
      afdo_count_scale
!       = MAX (((gcov_type)1 << (profile_count::n_bits - 10))
  	     / afdo_profile_info->sum_max, 1);
    afdo_profile_info->cutoff *= afdo_count_scale;
    afdo_hot_bb_threshod
diff -Nrcpad gcc-16-20250914/gcc/c/ChangeLog gcc-16-20250921/gcc/c/ChangeLog
*** gcc-16-20250914/gcc/c/ChangeLog	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/c/ChangeLog	Sun Sep 21 22:32:36 2025
***************
*** 1,3 ****
--- 1,23 ----
+ 2025-09-20  Joseph Myers  <josmyers@redhat.com>
+ 
+ 	* c-typeck.cc (really_atomic_lvalue): Return false for incomplete
+ 	types.
+ 	(convert_lvalue_to_rvalue): Call require_complete_type for
+ 	qualified void for C2y.
+ 
+ 2025-09-17  Richard Biener  <rguenther@suse.de>
+ 
+ 	* gimple-parser.cc (c_parser_parse_gimple_body): Initialize
+ 	SSA operands for each stmt.
+ 	(c_parser_gimple_compound_statement): Append stmts without
+ 	updating SSA operands.
+ 
+ 2025-09-16  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR c/121421
+ 	* c-parser.cc (c_parser_declaration_or_fndef): Error out for gimple
+ 	and rtl functions as nested functions.
+ 
  2025-09-13  Joseph Myers  <josmyers@redhat.com>
  
  	* c-typeck.cc (c_mark_addressable): New parameter
diff -Nrcpad gcc-16-20250914/gcc/c/c-parser.cc gcc-16-20250921/gcc/c/c-parser.cc
*** gcc-16-20250914/gcc/c/c-parser.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/c/c-parser.cc	Sun Sep 21 22:32:36 2025
*************** c_parser_declaration_or_fndef (c_parser
*** 3222,3228 ****
        else
  	fnbody = c_parser_compound_statement (parser, &endloc);
        tree fndecl = current_function_decl;
!       if (nested)
  	{
  	  tree decl = current_function_decl;
  	  /* Mark nested functions as needing static-chain initially.
--- 3222,3228 ----
        else
  	fnbody = c_parser_compound_statement (parser, &endloc);
        tree fndecl = current_function_decl;
!       if (nested && specs->declspec_il == cdil_none)
  	{
  	  tree decl = current_function_decl;
  	  /* Mark nested functions as needing static-chain initially.
*************** c_parser_declaration_or_fndef (c_parser
*** 3235,3240 ****
--- 3235,3249 ----
  	  c_pop_function_context ();
  	  add_stmt (build_stmt (DECL_SOURCE_LOCATION (decl), DECL_EXPR, decl));
  	}
+       else if (nested)
+ 	{
+ 	  if (specs->declspec_il == cdil_rtl)
+ 	    error ("%<__RTL%> function cannot be a nested function");
+ 	  else
+ 	    error ("%<__GIMPLE%> function cannot be a nested function");
+ 	  finish_function (endloc);
+ 	  c_pop_function_context ();
+ 	}
        else
  	{
  	  if (fnbody)
diff -Nrcpad gcc-16-20250914/gcc/c/c-typeck.cc gcc-16-20250921/gcc/c/c-typeck.cc
*** gcc-16-20250914/gcc/c/c-typeck.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/c/c-typeck.cc	Sun Sep 21 22:32:36 2025
*************** really_atomic_lvalue (tree expr)
*** 2512,2517 ****
--- 2512,2519 ----
      return false;
    if (!TYPE_ATOMIC (TREE_TYPE (expr)))
      return false;
+   if (!COMPLETE_TYPE_P (TREE_TYPE (expr)))
+     return false;
    if (!lvalue_p (expr))
      return false;
  
*************** convert_lvalue_to_rvalue (location_t loc
*** 2607,2613 ****
  
    if (convert_p)
      exp = default_function_array_conversion (loc, exp);
!   if (!VOID_TYPE_P (TREE_TYPE (exp.value)))
      exp.value = require_complete_type (loc, exp.value);
    if (for_init || !RECORD_OR_UNION_TYPE_P (TREE_TYPE (exp.value)))
      {
--- 2609,2617 ----
  
    if (convert_p)
      exp = default_function_array_conversion (loc, exp);
!   if (!VOID_TYPE_P (TREE_TYPE (exp.value))
!       || (flag_isoc2y
! 	  && TYPE_QUALS (TREE_TYPE (exp.value)) != TYPE_UNQUALIFIED))
      exp.value = require_complete_type (loc, exp.value);
    if (for_init || !RECORD_OR_UNION_TYPE_P (TREE_TYPE (exp.value)))
      {
diff -Nrcpad gcc-16-20250914/gcc/c/gimple-parser.cc gcc-16-20250921/gcc/c/gimple-parser.cc
*** gcc-16-20250914/gcc/c/gimple-parser.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/c/gimple-parser.cc	Sun Sep 21 22:32:36 2025
*************** c_parser_parse_gimple_body (c_parser *cp
*** 356,383 ****
  	 update stmts.  */
        if (cdil == cdil_gimple_ssa)
  	{
! 	  /* Create PHI nodes, they are parsed into __PHI internal calls.  */
  	  FOR_EACH_BB_FN (bb, cfun)
! 	    for (gimple_stmt_iterator gsi = gsi_start_bb (bb);
! 		 !gsi_end_p (gsi);)
! 	      {
! 		gimple *stmt = gsi_stmt (gsi);
! 		if (!gimple_call_internal_p (stmt, IFN_PHI))
! 		  break;
  
! 		gphi *phi = create_phi_node (gimple_call_lhs (stmt), bb);
! 		for (unsigned i = 0; i < gimple_call_num_args (stmt); i += 2)
! 		  {
! 		    int srcidx = TREE_INT_CST_LOW (gimple_call_arg (stmt, i));
! 		    edge e = find_edge (BASIC_BLOCK_FOR_FN (cfun, srcidx), bb);
! 		    if (!e)
! 		      c_parser_error (parser, "edge not found");
! 		    else
! 		      add_phi_arg (phi, gimple_call_arg (stmt, i + 1), e,
! 				   UNKNOWN_LOCATION);
! 		  }
! 		gsi_remove (&gsi, true);
! 	      }
  	  /* Fill SSA name gaps, putting them on the freelist and diagnose
  	     SSA names without definition.  */
  	  for (unsigned i = 1; i < num_ssa_names; ++i)
--- 356,388 ----
  	 update stmts.  */
        if (cdil == cdil_gimple_ssa)
  	{
! 	  /* Create PHI nodes, they are parsed into __PHI internal calls
! 	     and update SSA operands.  */
  	  FOR_EACH_BB_FN (bb, cfun)
! 	    {
! 	      gimple_stmt_iterator gsi;
! 	      for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
! 		{
! 		  gimple *stmt = gsi_stmt (gsi);
! 		  if (!gimple_call_internal_p (stmt, IFN_PHI))
! 		    break;
  
! 		  gphi *phi = create_phi_node (gimple_call_lhs (stmt), bb);
! 		  for (unsigned i = 0; i < gimple_call_num_args (stmt); i += 2)
! 		    {
! 		      int srcidx = TREE_INT_CST_LOW (gimple_call_arg (stmt, i));
! 		      edge e = find_edge (BASIC_BLOCK_FOR_FN (cfun, srcidx), bb);
! 		      if (!e)
! 			c_parser_error (parser, "edge not found");
! 		      else
! 			add_phi_arg (phi, gimple_call_arg (stmt, i + 1), e,
! 				     UNKNOWN_LOCATION);
! 		    }
! 		  gsi_remove (&gsi, true);
! 		}
! 	      for (; !gsi_end_p (gsi); gsi_next (&gsi))
! 		update_stmt (gsi_stmt (gsi));
! 	    }
  	  /* Fill SSA name gaps, putting them on the freelist and diagnose
  	     SSA names without definition.  */
  	  for (unsigned i = 1; i < num_ssa_names; ++i)
*************** c_parser_gimple_compound_statement (gimp
*** 639,645 ****
  		    {
  		      gimple_stmt_iterator gsi
  			= gsi_start_bb (parser.current_bb);
! 		      gsi_insert_seq_after (&gsi, *seq, GSI_CONTINUE_LINKING);
  		    }
  		  *seq = NULL;
  		}
--- 644,651 ----
  		    {
  		      gimple_stmt_iterator gsi
  			= gsi_start_bb (parser.current_bb);
! 		      gsi_insert_seq_after_without_update (&gsi, *seq,
! 							   GSI_CONTINUE_LINKING);
  		    }
  		  *seq = NULL;
  		}
*************** expr_stmt:
*** 735,741 ****
        else
  	{
  	  gimple_stmt_iterator gsi = gsi_start_bb (parser.current_bb);
! 	  gsi_insert_seq_after (&gsi, *seq, GSI_CONTINUE_LINKING);
  	}
        *seq = NULL;
      }
--- 741,748 ----
        else
  	{
  	  gimple_stmt_iterator gsi = gsi_start_bb (parser.current_bb);
! 	  gsi_insert_seq_after_without_update (&gsi, *seq,
! 					       GSI_CONTINUE_LINKING);
  	}
        *seq = NULL;
      }
diff -Nrcpad gcc-16-20250914/gcc/cgraph.cc gcc-16-20250921/gcc/cgraph.cc
*** gcc-16-20250914/gcc/cgraph.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/cgraph.cc	Sun Sep 21 22:32:36 2025
*************** cgraph_edge::make_direct (cgraph_edge *e
*** 1466,1478 ****
  	  /* Compare ref not direct->callee.  Direct edge is possibly
  	     inlined or redirected.  */
  	  if (!direct->speculative_call_target_ref ()
! 	       ->referred->semantically_equivalent_p (callee))
  	    edge = direct->resolve_speculation (direct, NULL);
  	  else
! 	    {
! 	      gcc_checking_assert (!found);
! 	      found = direct;
! 	    }
  	}
  
        /* On successful speculation just remove the indirect edge and
--- 1466,1476 ----
  	  /* Compare ref not direct->callee.  Direct edge is possibly
  	     inlined or redirected.  */
  	  if (!direct->speculative_call_target_ref ()
! 	       ->referred->semantically_equivalent_p (callee)
! 	      || found)
  	    edge = direct->resolve_speculation (direct, NULL);
  	  else
! 	    found = direct;
  	}
  
        /* On successful speculation just remove the indirect edge and
*************** cgraph_edge::maybe_hot_p (sreal scale)
*** 3159,3167 ****
  
    /* If reliable IPA count is available, just use it.  */
    profile_count c = count.ipa ();
!   if (c.reliable_p ())
      return maybe_hot_count_p (NULL, c * scale);
  
    /* See if we can determine hotness using caller frequency.  */
    if (caller->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED
        || (callee
--- 3157,3173 ----
  
    /* If reliable IPA count is available, just use it.  */
    profile_count c = count.ipa ();
!   if (c.reliable_p ()
!       || (c.quality () == AFDO && c.nonzero_p ()))
      return maybe_hot_count_p (NULL, c * scale);
  
+   /* In auto-FDO, count 0 may lead to hot code in case the
+      call is simply not called often enough to receive some samples.  */
+   if ((c.quality () == AFDO
+        || count.quality () == GUESSED_GLOBAL0_ADJUSTED)
+       && callee && callee->count.quality () == AFDO)
+     return maybe_hot_count_p (NULL, c.force_nonzero () * scale);
+ 
    /* See if we can determine hotness using caller frequency.  */
    if (caller->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED
        || (callee
*************** cgraph_edge::sreal_frequency ()
*** 4422,4427 ****
--- 4428,4452 ----
  			       : caller->count);
  }
  
+ /* Expected frequency of executions within the function.
+    If edge is speculative, sum all its indirect targets.  */
+ 
+ sreal
+ cgraph_edge::combined_sreal_frequency ()
+ {
+   if (!speculative)
+     return sreal_frequency ();
+   cgraph_edge *e = this;
+   if (e->callee)
+     e = e->speculative_call_indirect_edge ();
+   sreal sum = e->sreal_frequency ();
+   for (e = e->first_speculative_call_target ();
+        e;
+        e = e->next_speculative_call_target ())
+     sum += e->sreal_frequency ();
+   return sum;
+ }
+ 
  
  /* During LTO stream in this can be used to check whether call can possibly
     be internal to the current translation unit.  */
diff -Nrcpad gcc-16-20250914/gcc/cgraph.h gcc-16-20250921/gcc/cgraph.h
*** gcc-16-20250914/gcc/cgraph.h	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/cgraph.h	Sun Sep 21 22:32:36 2025
*************** public:
*** 1991,1996 ****
--- 1991,2000 ----
  
    /* Expected frequency of executions within the function.  */
    sreal sreal_frequency ();
+ 
+   /* Expected frequency of executions within the function.
+      If edge is speculative, sum all its indirect targets.  */
+   sreal combined_sreal_frequency ();
  private:
    /* Unique id of the edge.  */
    int m_uid;
diff -Nrcpad gcc-16-20250914/gcc/cgraphclones.cc gcc-16-20250921/gcc/cgraphclones.cc
*** gcc-16-20250914/gcc/cgraphclones.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/cgraphclones.cc	Sun Sep 21 22:32:36 2025
*************** cgraph_node::create_version_clone (tree
*** 990,995 ****
--- 990,996 ----
  	  version.  */
         e->redirect_callee (new_version);
       }
+    new_version->calls_comdat_local = new_version->check_calls_comdat_local_p ();
  
     dump_callgraph_transformation (this, new_version, suffix);
  
diff -Nrcpad gcc-16-20250914/gcc/common/config/riscv/riscv-common.cc gcc-16-20250921/gcc/common/config/riscv/riscv-common.cc
*** gcc-16-20250914/gcc/common/config/riscv/riscv-common.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/common/config/riscv/riscv-common.cc	Sun Sep 21 22:32:36 2025
*************** struct riscv_ext_version
*** 262,328 ****
    int minor_version;
  };
  
! struct riscv_profiles
! {
    const char *profile_name;
    const char *profile_string;
  };
  
- /* This table records the mapping form RISC-V Profiles into march string.  */
  static const riscv_profiles riscv_profiles_table[] =
  {
!   /* RVI20U only contains the base extension 'i' as mandatory extension.  */
!   {"rvi20u64", "rv64i"},
!   {"rvi20u32", "rv32i"},
! 
!   /* RVA20U contains the 'i,m,a,f,d,c,zicsr,zicntr,ziccif,ziccrse,ziccamoa,
!      zicclsm,za128rs' as mandatory extensions.  */
!   {"rva20u64", "rv64imafdc_zicsr_zicntr_ziccif_ziccrse_ziccamoa"
!    "_zicclsm_za128rs"},
! 
!   /* RVA22U contains the 'i,m,a,f,d,c,zicsr,zihintpause,zba,zbb,zbs,zicntr,
!      zihpm,ziccif,ziccrse,ziccamoa, zicclsm,zic64b,za64rs,zicbom,zicbop,zicboz,
!      zfhmin,zkt' as mandatory extensions.  */
!   {"rva22u64", "rv64imafdc_zicsr_zicntr_ziccif_ziccrse_ziccamoa"
!    "_zicclsm_zic64b_za64rs_zihintpause_zba_zbb_zbs_zicbom_zicbop"
!    "_zicboz_zfhmin_zkt"},
! 
!   /* RVA23 contains all mandatory base ISA for RVA22U64 and the new extension
!      'v,zihintntl,zvfhmin,zvbb,zvkt,zicond,zimop,zcmop,zfa,zawrs' as mandatory
!      extensions.  */
!   {"rva23u64", "rv64imafdcbv_zicsr_zicntr_zihpm_ziccif_ziccrse_ziccamoa"
!    "_zicclsm_zic64b_za64rs_zihintpause_zba_zbb_zbs_zicbom_zicbop"
!    "_zicboz_zfhmin_zkt_zvfhmin_zvbb_zvkt_zihintntl_zicond_zimop_zcmop_zcb"
!    "_zfa_zawrs_supm"},
! 
!   /* RVA23S contains all mandatory base ISA for RVA23U64 and the privileged
!      extensions as mandatory extensions.  */
!   {"rva23s64", "rv64imafdcbv_zicsr_zicntr_zihpm_ziccif_ziccrse_ziccamoa"
!    "_zicclsm_zic64b_za64rs_zihintpause_zba_zbb_zbs_zicbom_zicbop"
!    "_zicboz_zfhmin_zkt_zvfhmin_zvbb_zvkt_zihintntl_zicond_zimop_zcmop_zcb"
!    "_zfa_zawrs_svbare_svade_ssccptr_sstvecd_sstvala_sscounterenw_svpbmt"
!    "_svinval_svnapot_sstc_sscofpmf_ssnpm_ssu64xl_sha_supm"
!   },
! 
!   /* RVB23 contains all mandatory base ISA for RVA22U64 and the new extension
!      'zihintntl,zicond,zimop,zcmop,zfa,zawrs' as mandatory
!      extensions.  */
!   {"rvb23u64", "rv64imafdcb_zicsr_zicntr_zihpm_ziccif_ziccrse_ziccamoa"
!    "_zicclsm_zic64b_za64rs_zihintpause_zba_zbb_zbs_zicbom_zicbop"
!    "_zicboz_zfhmin_zkt_zihintntl_zicond_zimop_zcmop_zcb"
!    "_zfa_zawrs"},
! 
!   /* RVB23S contains all mandatory base ISA for RVB23U64 and the privileged
!      extensions as mandatory extensions.  */
!   {"rvb23s64", "rv64imafdcb_zicsr_zicntr_zihpm_ziccif_ziccrse_ziccamoa"
!    "_zicclsm_zic64b_za64rs_zihintpause_zba_zbb_zbs_zicbom_zicbop"
!    "_zicboz_zfhmin_zkt_zvfhmin_zvbb_zvkt_zihintntl_zicond_zimop_zcmop_zcb"
!    "_zfa_zawrs_svbare_svade_ssccptr_sstvecd_sstvala_sscounterenw_svpbmt"
!    "_svinval_svnapot_sstc_sscofpmf_ssu64xl_supm"
!   },
! 
!   /* Terminate the list.  */
!   {NULL, NULL}
  };
  
  static const riscv_cpu_info riscv_cpu_tables[] =
--- 262,282 ----
    int minor_version;
  };
  
! /* Information about one Profile we know about.  */
! struct riscv_profiles {
!   /* This Profile's name.  */
    const char *profile_name;
+ 
+   /* This Profile's arch canonical string.  */
    const char *profile_string;
  };
  
  static const riscv_profiles riscv_profiles_table[] =
  {
! #define RISCV_PROFILE(PROFILE_NAME, ARCH) \
!     {PROFILE_NAME, ARCH},
! #include "../../../config/riscv/riscv-profiles.def"
!     {NULL, NULL}
  };
  
  static const riscv_cpu_info riscv_cpu_tables[] =
diff -Nrcpad gcc-16-20250914/gcc/config/aarch64/aarch64-c.cc gcc-16-20250921/gcc/config/aarch64/aarch64-c.cc
*** gcc-16-20250914/gcc/config/aarch64/aarch64-c.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/aarch64/aarch64-c.cc	Sun Sep 21 22:32:36 2025
*************** aarch64_update_cpp_builtins (cpp_reader
*** 269,274 ****
--- 269,275 ----
  			"__ARM_FEATURE_SVE_BF16", pfile);
  
    aarch64_def_or_undef (TARGET_LUT, "__ARM_FEATURE_LUT", pfile);
+   aarch64_def_or_undef (TARGET_SME_LUTv2, "__ARM_FEATURE_SME_LUTv2", pfile);
  
    aarch64_def_or_undef (TARGET_FP8, "__ARM_FEATURE_FP8", pfile);
  
diff -Nrcpad gcc-16-20250914/gcc/config/aarch64/aarch64-option-extensions.def gcc-16-20250921/gcc/config/aarch64/aarch64-option-extensions.def
*** gcc-16-20250914/gcc/config/aarch64/aarch64-option-extensions.def	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/aarch64/aarch64-option-extensions.def	Sun Sep 21 22:32:36 2025
*************** AARCH64_OPT_EXTENSION("ssve-fp8dot2", SS
*** 277,282 ****
--- 277,284 ----
  
  AARCH64_OPT_EXTENSION("lut", LUT, (SIMD), (), (), "lut")
  
+ AARCH64_OPT_EXTENSION ("sme-lutv2", SME_LUTv2, (SME2), (), (), "sme-lutv2")
+ 
  AARCH64_OPT_EXTENSION("cpa", CPA, (), (), (), "")
  
  #undef AARCH64_OPT_FMV_EXTENSION
diff -Nrcpad gcc-16-20250914/gcc/config/aarch64/aarch64-sme.md gcc-16-20250921/gcc/config/aarch64/aarch64-sme.md
*** gcc-16-20250914/gcc/config/aarch64/aarch64-sme.md	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/aarch64/aarch64-sme.md	Sun Sep 21 22:32:36 2025
***************
*** 1040,1045 ****
--- 1040,1063 ----
    "mova\tza.d[%w0, %1, vgx<vector_count>], %2"
  )
  
+ ;; MOVT (vector to table)
+ ;; Variants are also available for:
+ ;; [_s8], [_u16], [_s16], [_u32], [_s32], [_u64], [_s64]
+ ;; [_bf16], [_f16], [_f32], [_f64]
+ ;; void svwrite_zt[_u8](uint64_t zt0, svuint8_t zt)
+ ;;      __arm_streaming __arm_out ("zt0");
+ ;; void svwrite_lane_zt[_u8](uint64_t zt0, svuint8_t zt, uint64_t idx)
+ ;;      __arm_streaming __arm_out ("zt0");
+ (define_insn "@aarch64_sme_write_zt<SVE_FULL:mode>"
+   [(set (reg:V8DI ZT0_REGNUM)
+ 	(unspec_volatile:V8DI
+ 	  [(match_operand:SVE_FULL 0 "register_operand" "w")
+ 	   (match_operand:DI       1 "const_int_operand")]
+ 	  UNSPEC_SME_WRITE))]
+   "TARGET_SME_LUTv2"
+   "movt\tzt0 [%1, mul vl], %0"
+ )
+ 
  ;; -------------------------------------------------------------------------
  ;; ---- Zeroing
  ;; -------------------------------------------------------------------------
***************
*** 2165,2170 ****
--- 2183,2189 ----
  
  (define_c_enum "unspec" [
    UNSPEC_SME_LUTI
+   UNSPEC_SME_LUTI_ZT
  ])
  
  (define_insn "@aarch64_sme_lut<LUTI_BITS><mode>"
***************
*** 2193,2195 ****
--- 2212,2229 ----
     && !(<LUTI_BITS> == 4 && <vector_count> == 4 && <elem_bits> == 8)"
    "luti<LUTI_BITS>\t%0, zt0, %1[%2]"
  )
+ 
+ ;; LUTI4 (four registers, 8-bit)
+ ;; Variants are also available for: _u8
+ ;; svint8x4_t svluti4_zt_s8_x4 (uint64_t zt0, svuint8x2_t zn)
+ ;;	      __arm_streaming __arm_in ("zt0");  */
+ (define_insn "aarch64_sme_lut_zt"
+   [(set (match_operand:VNx64QI 0 "aligned_register_operand" "=Uw4")
+ 	(unspec:VNx64QI
+ 	  [(reg:V8DI ZT0_REGNUM)
+ 	   (reg:DI SME_STATE_REGNUM)
+ 	   (match_operand:VNx32QI 1 "register_operand" "w")]
+ 	  UNSPEC_SME_LUTI_ZT))]
+   "TARGET_SME_LUTv2"
+   "luti4\t%0, zt0, {%Z1 - %T1}"
+ )
diff -Nrcpad gcc-16-20250914/gcc/config/aarch64/aarch64-sve-builtins-shapes.cc gcc-16-20250921/gcc/config/aarch64/aarch64-sve-builtins-shapes.cc
*** gcc-16-20250914/gcc/config/aarch64/aarch64-sve-builtins-shapes.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/aarch64/aarch64-sve-builtins-shapes.cc	Sun Sep 21 22:32:36 2025
*************** parse_element_type (const function_insta
*** 182,187 ****
--- 182,188 ----
     e<name> - an enum with the given name
     s<elt>  - a scalar type with the given element suffix
     t<elt>  - a vector or tuple type with given element suffix [*1]
+    T<elt>  - a vector or tuple type with given element suffix [*2]
     v<elt>  - a vector with the given element suffix
     D<elt>  - a 64 bit neon vector
     Q<elt>  - a 128 bit neon vector
*************** parse_element_type (const function_insta
*** 189,195 ****
     where <elt> has the format described above parse_element_type
  
     [*1] the vectors_per_tuple function indicates whether the type should
!         be a tuple, and if so, how many vectors it should contain.  */
  static tree
  parse_type (const function_instance &instance, const char *&format)
  {
--- 190,198 ----
     where <elt> has the format described above parse_element_type
  
     [*1] the vectors_per_tuple function indicates whether the type should
! 	be a tuple, and if so, how many vectors it should contain.
!    [*2] same as for [*1], but the tuple contains half as many vectors.
! */
  static tree
  parse_type (const function_instance &instance, const char *&format)
  {
*************** parse_type (const function_instance &ins
*** 261,266 ****
--- 264,276 ----
        unsigned int num_vectors = instance.vectors_per_tuple ();
        return acle_vector_types[num_vectors - 1][vector_type];
      }
+   if (ch == 'T')
+     {
+       type_suffix_index suffix = parse_element_type (instance, format);
+       vector_type_index vector_type = type_suffixes[suffix].vector_type;
+       unsigned int num_vectors = instance.vectors_per_tuple () / 2;
+       return acle_vector_types[num_vectors - 1][vector_type];
+     }
  
    if (ch == 'v')
      {
*************** struct luti_lane_zt_base : public nonove
*** 973,978 ****
--- 983,1006 ----
    }
  };
  
+ /* LUTI4 (four registers, 8-bit)
+    Variants are also available for: _u8
+    svint8x4_t svluti4_zt_s8_x4 (uint64_t zt0, svuint8x2_t zn)
+ 	      __arm_streaming __arm_in ("zt0");  */
+ template <unsigned int BITS> struct luti_zt_base : public nonoverloaded_base
+ {
+   void build (function_builder &b,
+ 	      const function_group_info &group) const override
+   {
+     build_all (b, "t0,su64,Tu0", group, MODE_none);
+   }
+ 
+   bool check (function_checker &c) const override
+   {
+     return c.require_immediate_range (0, 0, 0);
+   }
+ };
+ 
  /* sv<t0>_t svfoo[_t0](sv<t0>_t, sv<t0:quarter>_t,
  		       sv<t0:quarter>_t)  (for integer t0)
     sv<t0>_t svmmla[_t0](sv<t0>_t, sv<t0>_t, sv<t0>_t)  (for floating-point t0)
*************** SHAPE (luti2_lane_zt)
*** 3207,3212 ****
--- 3235,3243 ----
  using luti4_lane_zt_def = luti_lane_zt_base<4>;
  SHAPE (luti4_lane_zt)
  
+ using luti4_zt_def = luti_zt_base<4>;
+ SHAPE (luti4_zt)
+ 
  /* svbool_t svfoo(enum svpattern).  */
  struct pattern_pred_def : public nonoverloaded_base
  {
*************** struct write_za_slice_def : public overl
*** 5269,5272 ****
--- 5300,5374 ----
  };
  SHAPE (write_za_slice)
  
+ /* MOVT (vector to table)
+    Variants are also available for:
+    [_s8], [_u16], [_s16], [_u32], [_s32], [_u64], [_s64]
+    [_bf16], [_f16], [_f32], [_f64]
+    void svwrite_zt[_u8] (uint64_t zt0, svuint8_t zt, uint64_t idx)
+ 	__arm_streaming __arm_out ("zt0");  */
+ struct write_zt_def : public overloaded_base<0>
+ {
+   void build (function_builder &b,
+ 	      const function_group_info &group) const override
+   {
+     b.add_overloaded_functions (group, MODE_none);
+     build_all (b, "_,su64,v0", group, MODE_none);
+   }
+ 
+   tree resolve (function_resolver &r) const override
+   {
+     sve_type type;
+ 
+     if (!r.check_num_arguments (2)
+ 	|| !r.require_scalar_type (0, "uint64_t")
+ 	|| !r.require_integer_immediate (0)
+ 	|| !(type = r.infer_vector_type (1)))
+       return error_mark_node;
+ 
+     return r.resolve_to (r.mode_suffix_id, type);
+   }
+ 
+   bool check (function_checker &c) const override
+   {
+     return c.require_immediate_range (0, 0, 0);
+   }
+ };
+ SHAPE (write_zt);
+ 
+ /* MOVT (vector to table)
+    Variants are also available for:
+    [_s8], [_u16], [_s16], [_u32], [_s32], [_u64], [_s64]
+    [_bf16], [_f16], [_f32], [_f64]
+    void svwrite_lane_zt[_u8] (uint64_t zt0, svuint8_t zt, uint64_t idx)
+ 	__arm_streaming __arm_out ("zt0");  */
+ struct write_lane_zt_def : public overloaded_base<0>
+ {
+   void build (function_builder &b,
+ 	      const function_group_info &group) const override
+   {
+     b.add_overloaded_functions (group, MODE_none);
+     build_all (b, "_,su64,v0,su64", group, MODE_none);
+   }
+ 
+   tree resolve (function_resolver &r) const override
+   {
+     sve_type type;
+ 
+     if (!r.check_num_arguments (3)
+ 	|| !r.require_scalar_type (0, "uint64_t")
+ 	|| !r.require_integer_immediate (0)
+ 	|| !(type = r.infer_vector_type (1))
+ 	|| !r.require_scalar_type (2, "uint64_t"))
+       return error_mark_node;
+ 
+     return r.resolve_to (r.mode_suffix_id, type);
+   }
+ 
+   bool check (function_checker &c) const override
+   {
+     return c.require_immediate_range (0, 0, 0)
+ 	   && c.require_immediate_range (2, 0, 3);
+   }
+ };
+ SHAPE (write_lane_zt);
  }
diff -Nrcpad gcc-16-20250914/gcc/config/aarch64/aarch64-sve-builtins-shapes.h gcc-16-20250921/gcc/config/aarch64/aarch64-sve-builtins-shapes.h
*** gcc-16-20250914/gcc/config/aarch64/aarch64-sve-builtins-shapes.h	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/aarch64/aarch64-sve-builtins-shapes.h	Sun Sep 21 22:32:36 2025
*************** namespace aarch64_sve
*** 168,173 ****
--- 168,174 ----
      extern const function_shape *const luti4;
      extern const function_shape *const luti2_lane_zt;
      extern const function_shape *const luti4_lane_zt;
+     extern const function_shape *const luti4_zt;
      extern const function_shape *const mmla;
      extern const function_shape *const pattern_pred;
      extern const function_shape *const pmov_from_vector;
*************** namespace aarch64_sve
*** 260,265 ****
--- 261,268 ----
      extern const function_shape *const write_za;
      extern const function_shape *const write_za_m;
      extern const function_shape *const write_za_slice;
+     extern const function_shape *const write_zt;
+     extern const function_shape *const write_lane_zt;
    }
  }
  
diff -Nrcpad gcc-16-20250914/gcc/config/aarch64/aarch64-sve-builtins-sme.cc gcc-16-20250921/gcc/config/aarch64/aarch64-sve-builtins-sme.cc
*** gcc-16-20250914/gcc/config/aarch64/aarch64-sve-builtins-sme.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/aarch64/aarch64-sve-builtins-sme.cc	Sun Sep 21 22:32:36 2025
*************** public:
*** 352,357 ****
--- 352,381 ----
    unsigned int m_bits;
  };
  
+ /* LUTI4 (four registers, 8-bit)
+    Variants are also available for: _u8
+    svint8x4_t svluti4_zt_s8_x4 (uint64_t zt0, svuint8x2_t zn)
+ 	      __arm_streaming __arm_in ("zt0");  */
+ class svluti_zt_impl : public read_zt0<function_base>
+ {
+ public:
+   CONSTEXPR svluti_zt_impl (unsigned int bits) : m_bits (bits) {}
+ 
+   unsigned int call_properties (const function_instance &) const override
+   {
+     return CP_READ_ZT0;
+   }
+ 
+   rtx expand (function_expander &e) const override
+   {
+     // Remove `zt0` argument, since it is ignored.
+     e.args.ordered_remove (0);
+     return e.use_exact_insn (CODE_FOR_aarch64_sme_lut_zt);
+   }
+ 
+   unsigned int m_bits;
+ };
+ 
  template<insn_code (*CODE) (machine_mode)>
  class svread_za_slice_base : public function_base
  {
*************** public:
*** 467,472 ****
--- 491,541 ----
    }
  };
  
+ /* MOVT (vector to table)
+    Variants are also available for:
+    [_s8], [_u16], [_s16], [_u32], [_s32], [_u64], [_s64]
+    [_bf16], [_f16], [_f32], [_f64]
+    void svwrite_lane_zt[_u8] (uint64_t zt0, svuint8_t zt, uint64_t idx)
+ 	__arm_streaming __arm_out ("zt0");  */
+ class svwrite_lane_zt_impl : public function_base
+ {
+ public:
+   unsigned int call_properties (const function_instance &) const override
+   {
+     return CP_WRITE_ZT0;
+   }
+ 
+   rtx expand (function_expander &e) const override
+   {
+     // Remove `zt0` argument, since it is ignored.
+     e.args.ordered_remove (0);
+     auto mode = e.args[0]->mode;
+     return e.use_exact_insn (code_for_aarch64_sme_write_zt (mode));
+   }
+ };
+ 
+ /* MOVT (vector to table)
+    Variants are also available for:
+    [_s8], [_u16], [_s16], [_u32], [_s32], [_u64], [_s64]
+    [_bf16], [_f16], [_f32], [_f64]
+    void svwrite_zt[_u8] (uint64_t zt0, svuint8_t zt)
+ 	__arm_streaming __arm_out ("zt0");  */
+ class svwrite_zt_impl : public function_base
+ {
+ public:
+   unsigned int call_properties (const function_instance &) const override
+   {
+     return CP_WRITE_ZT0;
+   }
+ 
+   rtx expand (function_expander &e) const override
+   {
+     // svwrite_zt (zt0, zt) == svwrite_lane_zt (zt0, zt, 0)
+     e.args.safe_push (const0_rtx);
+     return svwrite_lane_zt_impl ().expand (e);
+   }
+ };
+ 
  using svwrite_za_tile_impl = add_call_properties<read_write_za_base,
  						 CP_READ_ZA | CP_WRITE_ZA>;
  
*************** FUNCTION (svldr_za, svldr_za_impl, )
*** 569,574 ****
--- 638,644 ----
  FUNCTION (svldr_zt, svldr_zt_impl, )
  FUNCTION (svluti2_lane_zt, svluti_lane_zt_impl, (2))
  FUNCTION (svluti4_lane_zt, svluti_lane_zt_impl, (4))
+ FUNCTION (svluti4_zt, svluti_zt_impl, (4))
  FUNCTION (svmla_za, sme_2mode_function, (UNSPEC_SME_SMLA, UNSPEC_SME_UMLA,
  					 UNSPEC_SME_FMLA))
  FUNCTION (svmla_lane_za, sme_2mode_lane_function, (UNSPEC_SME_SMLA,
*************** FUNCTION (svvdot_lane_za, sme_2mode_lane
*** 616,621 ****
--- 686,693 ----
  FUNCTION (svwrite_za, svwrite_za_impl,)
  FUNCTION (svwrite_hor_za, svwrite_za_tile_impl, (UNSPEC_SME_WRITE_HOR))
  FUNCTION (svwrite_ver_za, svwrite_za_tile_impl, (UNSPEC_SME_WRITE_VER))
+ FUNCTION (svwrite_zt,      svwrite_zt_impl,)
+ FUNCTION (svwrite_lane_zt, svwrite_lane_zt_impl,)
  FUNCTION (svzero_mask_za, svzero_mask_za_impl, )
  FUNCTION (svzero_za, svzero_za_impl, )
  FUNCTION (svzero_zt, svzero_zt_impl, )
diff -Nrcpad gcc-16-20250914/gcc/config/aarch64/aarch64-sve-builtins-sme.def gcc-16-20250921/gcc/config/aarch64/aarch64-sve-builtins-sme.def
*** gcc-16-20250914/gcc/config/aarch64/aarch64-sve-builtins-sme.def	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/aarch64/aarch64-sve-builtins-sme.def	Sun Sep 21 22:32:36 2025
*************** DEF_SME_ZA_FUNCTION_GS (svzero, inherent
*** 253,258 ****
--- 253,264 ----
  DEF_SME_ZA_FUNCTION_GS (svzero, inherent_za_slice, d_za, vg4, none)
  #undef REQUIRED_EXTENSIONS
  
+ #define REQUIRED_EXTENSIONS streaming_only (AARCH64_FL_SME_LUTv2)
+ DEF_SME_FUNCTION_GS (svwrite_zt,      write_zt,      all_data,  none, none)
+ DEF_SME_FUNCTION_GS (svwrite_lane_zt, write_lane_zt, all_data,  none, none)
+ DEF_SME_FUNCTION_GS (svluti4_zt,      luti4_zt,      b_integer, x4,   none)
+ #undef REQUIRED_EXTENSIONS
+ 
  #undef DEF_SME_ZA_FUNCTION
  #undef DEF_SME_ZA_FUNCTION_GS
  #undef DEF_SME_FUNCTION
diff -Nrcpad gcc-16-20250914/gcc/config/aarch64/aarch64-sve-builtins-sme.h gcc-16-20250921/gcc/config/aarch64/aarch64-sve-builtins-sme.h
*** gcc-16-20250914/gcc/config/aarch64/aarch64-sve-builtins-sme.h	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/aarch64/aarch64-sve-builtins-sme.h	Sun Sep 21 22:32:36 2025
*************** namespace aarch64_sve
*** 44,49 ****
--- 44,50 ----
      extern const function_base *const svldr_zt;
      extern const function_base *const svluti2_lane_zt;
      extern const function_base *const svluti4_lane_zt;
+     extern const function_base *const svluti4_zt;
      extern const function_base *const svmla_za;
      extern const function_base *const svmla_lane_za;
      extern const function_base *const svmls_za;
*************** namespace aarch64_sve
*** 75,80 ****
--- 76,83 ----
      extern const function_base *const svwrite_za;
      extern const function_base *const svwrite_hor_za;
      extern const function_base *const svwrite_ver_za;
+     extern const function_base *const svwrite_zt;
+     extern const function_base *const svwrite_lane_zt;
      extern const function_base *const svundef_za;
      extern const function_base *const svvdot_lane_za;
      extern const function_base *const svzero_mask_za;
diff -Nrcpad gcc-16-20250914/gcc/config/aarch64/aarch64-sve-builtins.cc gcc-16-20250921/gcc/config/aarch64/aarch64-sve-builtins.cc
*** gcc-16-20250914/gcc/config/aarch64/aarch64-sve-builtins.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/aarch64/aarch64-sve-builtins.cc	Sun Sep 21 22:32:36 2025
*************** gimple_folder::fold_active_lanes_to (tre
*** 3802,3807 ****
--- 3802,3808 ----
  
    gimple_seq stmts = NULL;
    tree pred = convert_pred (stmts, vector_type (0), 0);
+   x = force_vector (stmts, TREE_TYPE (lhs), x);
    gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
    return gimple_build_assign (lhs, VEC_COND_EXPR, pred, x, vec_inactive);
  }
diff -Nrcpad gcc-16-20250914/gcc/config/aarch64/aarch64-sve-builtins.h gcc-16-20250921/gcc/config/aarch64/aarch64-sve-builtins.h
*** gcc-16-20250914/gcc/config/aarch64/aarch64-sve-builtins.h	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/aarch64/aarch64-sve-builtins.h	Sun Sep 21 22:32:36 2025
***************
*** 57,65 ****
     function_shape describes how that instruction has been presented at
     the language level.
  
!    The static list of functions uses function_group to describe a group
!    of related functions.  The function_builder class is responsible for
!    expanding this static description into a list of individual functions
     and registering the associated built-in functions.  function_instance
     describes one of these individual functions in terms of the properties
     described above.
--- 57,66 ----
     function_shape describes how that instruction has been presented at
     the language level.
  
!    The static arrays of function_group_info (function_groups,
!    neon_sve_function_groups, sme_function_groups) use function_group to describe
!    a group of related functions.  The function_builder class is responsible for
!    expanding these static description into a list of individual functions
     and registering the associated built-in functions.  function_instance
     describes one of these individual functions in terms of the properties
     described above.
diff -Nrcpad gcc-16-20250914/gcc/config/aarch64/aarch64.h gcc-16-20250921/gcc/config/aarch64/aarch64.h
*** gcc-16-20250914/gcc/config/aarch64/aarch64.h	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/aarch64/aarch64.h	Sun Sep 21 22:32:36 2025
*************** constexpr auto AARCH64_FL_DEFAULT_ISA_MO
*** 477,485 ****
     enabled through +faminmax.  */
  #define TARGET_FAMINMAX AARCH64_HAVE_ISA (FAMINMAX)
  
! /* Lookup table (LUTI) extension instructions are enabled through +lut.  */
  #define TARGET_LUT AARCH64_HAVE_ISA (LUT)
  
  /* Prefer different predicate registers for the output of a predicated
     operation over re-using an existing input predicate.  */
  #define TARGET_SVE_PRED_CLOBBER (TARGET_SVE \
--- 477,490 ----
     enabled through +faminmax.  */
  #define TARGET_FAMINMAX AARCH64_HAVE_ISA (FAMINMAX)
  
! /* Lookup table (LUTI) extension instructions with 2-bit and 4-bit indices are
!    enabled through +lut.  */
  #define TARGET_LUT AARCH64_HAVE_ISA (LUT)
  
+ /* Lookup table (LUTI) extension instructions with 4-bit indices and 8-bit
+    elements are enabled through +sme-lutv2.  */
+ #define TARGET_SME_LUTv2 AARCH64_HAVE_ISA (SME_LUTv2)
+ 
  /* Prefer different predicate registers for the output of a predicated
     operation over re-using an existing input predicate.  */
  #define TARGET_SVE_PRED_CLOBBER (TARGET_SVE \
diff -Nrcpad gcc-16-20250914/gcc/config/aarch64/aarch64.md gcc-16-20250921/gcc/config/aarch64/aarch64.md
*** gcc-16-20250914/gcc/config/aarch64/aarch64.md	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/aarch64/aarch64.md	Sun Sep 21 22:32:36 2025
***************
*** 7722,7727 ****
--- 7722,7743 ----
  }
  )
  
+ (define_expand "isnan<mode>2"
+  [(match_operand:SI 0 "register_operand")
+   (match_operand:GPF 1 "register_operand")]
+  "TARGET_FLOAT && flag_signaling_nans"
+ {
+   rtx op = force_lowpart_subreg (<V_INT_EQUIV>mode, operands[1], <MODE>mode);
+   rtx tmp = gen_reg_rtx (<V_INT_EQUIV>mode);
+   emit_move_insn (tmp, GEN_INT (HOST_WIDE_INT_M1U << (<mantissa_bits> + 1)));
+   rtx cc_reg = gen_rtx_REG (CC_SWPmode, CC_REGNUM);
+   emit_insn (gen_cmp_swp_lsl_reg<v_int_equiv> (op, GEN_INT (1), tmp));
+   rtx cmp = gen_rtx_fmt_ee (GTU, SImode, cc_reg, const0_rtx);
+   emit_insn (gen_aarch64_cstoresi (operands[0], cmp, cc_reg));
+   DONE;
+ }
+ )
+ 
  ;; -------------------------------------------------------------------
  ;; Reload support
  ;; -------------------------------------------------------------------
diff -Nrcpad gcc-16-20250914/gcc/config/avr/avr-mcus.def gcc-16-20250921/gcc/config/avr/avr-mcus.def
*** gcc-16-20250914/gcc/config/avr/avr-mcus.def	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/avr/avr-mcus.def	Sun Sep 21 22:32:36 2025
*************** AVR_MCU ("avr16eb14",        ARCH_AVRXME
*** 411,416 ****
--- 411,420 ----
  AVR_MCU ("avr16eb20",        ARCH_AVRXMEGA3, AVR_CVT,                 "__AVR_AVR16EB20__",   0x7800, 0x0, 0x4000, 0x8000)
  AVR_MCU ("avr16eb28",        ARCH_AVRXMEGA3, AVR_CVT,                 "__AVR_AVR16EB28__",   0x7800, 0x0, 0x4000, 0x8000)
  AVR_MCU ("avr16eb32",        ARCH_AVRXMEGA3, AVR_CVT,                 "__AVR_AVR16EB32__",   0x7800, 0x0, 0x4000, 0x8000)
+ AVR_MCU ("avr32eb14",        ARCH_AVRXMEGA3, AVR_CVT,                 "__AVR_AVR32EB14__",   0x7400, 0x0, 0x8000, 0x8000)
+ AVR_MCU ("avr32eb20",        ARCH_AVRXMEGA3, AVR_CVT,                 "__AVR_AVR32EB20__",   0x7400, 0x0, 0x8000, 0x8000)
+ AVR_MCU ("avr32eb28",        ARCH_AVRXMEGA3, AVR_CVT,                 "__AVR_AVR32EB28__",   0x7400, 0x0, 0x8000, 0x8000)
+ AVR_MCU ("avr32eb32",        ARCH_AVRXMEGA3, AVR_CVT,                 "__AVR_AVR32EB32__",   0x7400, 0x0, 0x8000, 0x8000)
  AVR_MCU ("avr16ea28",        ARCH_AVRXMEGA3, AVR_CVT,                 "__AVR_AVR16EA28__",   0x7800, 0x0, 0x4000, 0x8000)
  AVR_MCU ("avr16ea32",        ARCH_AVRXMEGA3, AVR_CVT,                 "__AVR_AVR16EA32__",   0x7800, 0x0, 0x4000, 0x8000)
  AVR_MCU ("avr16ea48",        ARCH_AVRXMEGA3, AVR_CVT,                 "__AVR_AVR16EA48__",   0x7800, 0x0, 0x4000, 0x8000)
diff -Nrcpad gcc-16-20250914/gcc/config/i386/i386-expand.cc gcc-16-20250921/gcc/config/i386/i386-expand.cc
*** gcc-16-20250914/gcc/config/i386/i386-expand.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/i386/i386-expand.cc	Sun Sep 21 22:32:36 2025
*************** ix86_expand_set_or_cpymem (rtx dst, rtx
*** 9552,9560 ****
    if (!issetmem)
      srcreg = ix86_copy_addr_to_reg (XEXP (src, 0));
  
    unroll_factor = 1;
    move_mode = word_mode;
-   int nunits;
    switch (alg)
      {
      case libcall:
--- 9552,9571 ----
    if (!issetmem)
      srcreg = ix86_copy_addr_to_reg (XEXP (src, 0));
  
+   bool aligned_dstmem = false;
+   unsigned int nunits = issetmem ? STORE_MAX_PIECES : MOVE_MAX;
+   bool single_insn_p = count && count <= nunits;
+   if (single_insn_p)
+     {
+       /* If it can be done with a single instruction, use vector
+ 	 instruction and don't align destination.  */
+       alg = vector_loop;
+       noalign = true;
+       dynamic_check = -1;
+     }
+ 
    unroll_factor = 1;
    move_mode = word_mode;
    switch (alg)
      {
      case libcall:
*************** ix86_expand_set_or_cpymem (rtx dst, rtx
*** 9576,9582 ****
        need_zero_guard = true;
        unroll_factor = 4;
        /* Get the vector mode to move STORE_MAX_PIECES/MOVE_MAX bytes.  */
-       nunits = issetmem ? STORE_MAX_PIECES : MOVE_MAX;
        nunits /= GET_MODE_SIZE (word_mode);
        if (nunits > 1)
  	{
--- 9587,9592 ----
*************** ix86_expand_set_or_cpymem (rtx dst, rtx
*** 9629,9656 ****
      }
    gcc_assert (desired_align >= 1 && align >= 1);
  
!   /* Misaligned move sequences handle both prologue and epilogue at once.
!      Default code generation results in a smaller code for large alignments
!      and also avoids redundant job when sizes are known precisely.  */
!   misaligned_prologue_used
!     = (TARGET_MISALIGNED_MOVE_STRING_PRO_EPILOGUES
!        && MAX (desired_align, epilogue_size_needed) <= 32
!        && desired_align <= epilogue_size_needed
!        && ((desired_align > align && !align_bytes)
! 	   || (!count && epilogue_size_needed > 1)));
  
!   /* Destination is aligned after the misaligned prologue.  */
!   bool aligned_dstmem = misaligned_prologue_used;
  
!   if (noalign && !misaligned_prologue_used)
!     {
!       /* Also use misaligned prologue if alignment isn't needed and
! 	 destination isn't aligned.   Since alignment isn't needed,
! 	 the destination after prologue won't be aligned.  */
!       aligned_dstmem = (GET_MODE_ALIGNMENT (move_mode)
! 			<= MEM_ALIGN (dst));
!       if (!aligned_dstmem)
! 	misaligned_prologue_used = true;
      }
  
    /* Do the cheap promotion to allow better CSE across the
--- 9639,9670 ----
      }
    gcc_assert (desired_align >= 1 && align >= 1);
  
!   if (!single_insn_p)
!     {
!       /* Misaligned move sequences handle both prologue and epilogue
! 	 at once.  Default code generation results in a smaller code
! 	 for large alignments and also avoids redundant job when sizes
! 	 are known precisely.  */
!       misaligned_prologue_used
! 	= (TARGET_MISALIGNED_MOVE_STRING_PRO_EPILOGUES
! 	   && MAX (desired_align, epilogue_size_needed) <= 32
! 	   && desired_align <= epilogue_size_needed
! 	   && ((desired_align > align && !align_bytes)
! 	       || (!count && epilogue_size_needed > 1)));
  
!       /* Destination is aligned after the misaligned prologue.  */
!       aligned_dstmem = misaligned_prologue_used;
  
!       if (noalign && !misaligned_prologue_used)
! 	{
! 	  /* Also use misaligned prologue if alignment isn't needed and
! 	     destination isn't aligned.   Since alignment isn't needed,
! 	     the destination after prologue won't be aligned.  */
! 	  aligned_dstmem = (GET_MODE_ALIGNMENT (move_mode)
! 			    <= MEM_ALIGN (dst));
! 	  if (!aligned_dstmem)
! 	    misaligned_prologue_used = true;
! 	}
      }
  
    /* Do the cheap promotion to allow better CSE across the
diff -Nrcpad gcc-16-20250914/gcc/config/i386/predicates.md gcc-16-20250921/gcc/config/i386/predicates.md
*** gcc-16-20250914/gcc/config/i386/predicates.md	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/i386/predicates.md	Sun Sep 21 22:32:36 2025
***************
*** 2077,2082 ****
--- 2077,2101 ----
    return true;
  })
  
+ ;; Return true if OP is a parallel for a vbroadcastf128 permute.
+ (define_predicate "avx_vbroadcast128_operand"
+   (and (match_code "parallel")
+        (match_code "const_int" "a"))
+ {
+   int i, nelt = XVECLEN (op, 0);
+   int half = nelt / 2;
+ 
+   for (i = 0; i < nelt; ++i)
+     {
+       int index = INTVAL (XVECEXP (op, 0, i));
+       if ((i < half && index != i)
+ 	  || (i >= half && index != (i - half)))
+ 	return false;
+     }
+ 
+   return true;
+ })
+ 
  ;; Return true if OP is a parallel for a palignr permute.
  (define_predicate "palignr_operand"
    (and (match_code "parallel")
diff -Nrcpad gcc-16-20250914/gcc/config/i386/sse.md gcc-16-20250921/gcc/config/i386/sse.md
*** gcc-16-20250914/gcc/config/i386/sse.md	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/i386/sse.md	Sun Sep 21 22:32:36 2025
***************
*** 28148,28153 ****
--- 28148,28168 ----
     (set_attr "prefix" "vex,vex,vex,evex,evex,evex,evex")
     (set_attr "mode" "<sseinsnmode>")])
  
+ 
+ (define_insn_and_split "*avx_vbroadcastf128_<mode>_perm"
+   [(set (match_operand:V_256 0 "register_operand")
+ 	(vec_select:V_256
+ 	  (vec_concat:V_256
+ 	    (match_operand:<ssehalfvecmode> 1 "memory_operand")
+ 	    (match_operand:<ssehalfvecmode> 2 "general_operand"))
+ 	  (match_parallel 3 "avx_vbroadcast128_operand"
+ 	    [(match_operand 4 "const_int_operand")])))]
+   "TARGET_AVX && ix86_pre_reload_split ()"
+   "#"
+   "&& 1"
+   [(set (match_dup 0)
+ 	(vec_concat: V_256 (match_dup 1) (match_dup 1)))])
+ 
  ;; For broadcast[i|f]32x2.  Yes there is no v4sf version, only v4si.
  (define_mode_iterator VI4F_BRCST32x2
    [V16SI (V8SI "TARGET_AVX512VL") (V4SI "TARGET_AVX512VL")
diff -Nrcpad gcc-16-20250914/gcc/config/i386/x86-tune.def gcc-16-20250921/gcc/config/i386/x86-tune.def
*** gcc-16-20250914/gcc/config/i386/x86-tune.def	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/i386/x86-tune.def	Sun Sep 21 22:32:36 2025
*************** DEF_TUNE (X86_TUNE_AVX256_AVOID_VEC_PERM
*** 612,617 ****
--- 612,619 ----
  /* X86_TUNE_AVX256_SPLIT_REGS: if true, AVX512 ops are split into two AVX256 ops.  */
  DEF_TUNE (X86_TUNE_AVX512_SPLIT_REGS, "avx512_split_regs", m_ZNVER4)
  
+ /* It's better to align MOVE_MAX with prefer_vector_width to reduce
+    risk of STLF stalls(small store followed by big load.)  */
  /* X86_TUNE_AVX256_MOVE_BY_PIECES: Optimize move_by_pieces with 256-bit
     AVX instructions.  */
  DEF_TUNE (X86_TUNE_AVX256_MOVE_BY_PIECES, "avx256_move_by_pieces",
*************** DEF_TUNE (X86_TUNE_AVX256_STORE_BY_PIECE
*** 625,638 ****
  /* X86_TUNE_AVX512_MOVE_BY_PIECES: Optimize move_by_pieces with 512-bit
     AVX instructions.  */
  DEF_TUNE (X86_TUNE_AVX512_MOVE_BY_PIECES, "avx512_move_by_pieces",
! 	  m_SAPPHIRERAPIDS | m_GRANITERAPIDS | m_GRANITERAPIDS_D
! 	  | m_DIAMONDRAPIDS | m_ZNVER4 | m_ZNVER5)
  
  /* X86_TUNE_AVX512_STORE_BY_PIECES: Optimize store_by_pieces with 512-bit
     AVX instructions.  */
  DEF_TUNE (X86_TUNE_AVX512_STORE_BY_PIECES, "avx512_store_by_pieces",
! 	  m_SAPPHIRERAPIDS | m_GRANITERAPIDS | m_GRANITERAPIDS_D
! 	  | m_DIAMONDRAPIDS | m_ZNVER4 | m_ZNVER5)
  
  /* X86_TUNE_AVX512_TWO_EPILOGUES: Use two vector epilogues for 512-bit
     vectorized loops.  */
--- 627,638 ----
  /* X86_TUNE_AVX512_MOVE_BY_PIECES: Optimize move_by_pieces with 512-bit
     AVX instructions.  */
  DEF_TUNE (X86_TUNE_AVX512_MOVE_BY_PIECES, "avx512_move_by_pieces",
! 	   m_ZNVER4 | m_ZNVER5)
  
  /* X86_TUNE_AVX512_STORE_BY_PIECES: Optimize store_by_pieces with 512-bit
     AVX instructions.  */
  DEF_TUNE (X86_TUNE_AVX512_STORE_BY_PIECES, "avx512_store_by_pieces",
! 	  m_ZNVER4 | m_ZNVER5)
  
  /* X86_TUNE_AVX512_TWO_EPILOGUES: Use two vector epilogues for 512-bit
     vectorized loops.  */
diff -Nrcpad gcc-16-20250914/gcc/config/loongarch/loongarch.md gcc-16-20250921/gcc/config/loongarch/loongarch.md
*** gcc-16-20250914/gcc/config/loongarch/loongarch.md	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/loongarch/loongarch.md	Sun Sep 21 22:32:36 2025
***************
*** 1619,1631 ****
      operands[2] = GEN_INT (len);
      operands[4] = GEN_INT (lo);
  
!     if (lo)
!       {
! 	rtx tmp = gen_reg_rtx (<MODE>mode);
! 	emit_move_insn (tmp, gen_rtx_ASHIFTRT(<MODE>mode, operands[3],
! 					      GEN_INT (lo)));
! 	operands[3] = tmp;
!       }
    })
  
  ;; We always avoid the shift operation in bstrins_<mode>_for_ior_mask
--- 1619,1631 ----
      operands[2] = GEN_INT (len);
      operands[4] = GEN_INT (lo);
  
!     /* Use a new pseudo register even if lo == 0 or we'll wreck havoc
!        when operands[0] is same as operands[3].  See PR 121906.  */
!     rtx tmp = gen_reg_rtx (<MODE>mode);
!     rtx val = lo ? gen_rtx_ASHIFTRT (<MODE>mode, operands[3], GEN_INT (lo))
! 		 : operands[3];
!     emit_move_insn (tmp, val);
!     operands[3] = tmp;
    })
  
  ;; We always avoid the shift operation in bstrins_<mode>_for_ior_mask
diff -Nrcpad gcc-16-20250914/gcc/config/microblaze/iterators.md gcc-16-20250921/gcc/config/microblaze/iterators.md
*** gcc-16-20250914/gcc/config/microblaze/iterators.md	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/config/microblaze/iterators.md	Sun Sep 21 22:32:36 2025
***************
*** 0 ****
--- 1,25 ----
+ ;; Iterator definitions for GCC MicroBlaze machine description files.
+ ;; Copyright (C) 2012-2024 Free Software Foundation, Inc.
+ ;;
+ ;; This file is part of GCC.
+ ;;
+ ;; GCC is free software; you can redistribute it and/or modify
+ ;; it under the terms of the GNU General Public License as published by
+ ;; the Free Software Foundation; either version 3, or (at your option)
+ ;; any later version.
+ ;;
+ ;; GCC is distributed in the hope that it will be useful,
+ ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ ;; GNU General Public License for more details.
+ ;;
+ ;; You should have received a copy of the GNU General Public License
+ ;; along with GCC; see the file COPYING3.  If not see
+ ;; <http://www.gnu.org/licenses/>.
+ 
+ ; atomics code iterator
+ (define_code_iterator any_atomic [plus ior xor and])
+ 
+ ; atomics code attribute
+ (define_code_attr atomic_optab
+   [(plus "add") (ior "or") (xor "xor") (and "and")])
diff -Nrcpad gcc-16-20250914/gcc/config/microblaze/microblaze-protos.h gcc-16-20250921/gcc/config/microblaze/microblaze-protos.h
*** gcc-16-20250914/gcc/config/microblaze/microblaze-protos.h	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/microblaze/microblaze-protos.h	Sun Sep 21 22:32:36 2025
*************** extern int symbol_mentioned_p (rtx);
*** 62,67 ****
--- 62,68 ----
  extern int label_mentioned_p (rtx);
  extern bool microblaze_cannot_force_const_mem (machine_mode, rtx);
  extern void microblaze_eh_return (rtx op0);
+ extern void microblaze_subword_address (rtx, rtx *, rtx *);
  #endif  /* RTX_CODE */
  
  /* Declare functions in microblaze-c.cc.  */
diff -Nrcpad gcc-16-20250914/gcc/config/microblaze/microblaze.cc gcc-16-20250921/gcc/config/microblaze/microblaze.cc
*** gcc-16-20250914/gcc/config/microblaze/microblaze.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/microblaze/microblaze.cc	Sun Sep 21 22:32:36 2025
*************** microblaze_expand_block_move (rtx dest,
*** 1299,1304 ****
--- 1299,1332 ----
    return false;
  }
  
+ /* Compute memory address *aligned_mem and corresponding shift value (*shift)
+    from a QImode memory reference MEM */
+ void
+ microblaze_subword_address (rtx mem, rtx *aligned_mem, rtx *shift)
+ {
+   /* Align the memory address to a word.  */
+   rtx addr = force_reg (Pmode, XEXP (mem, 0));
+ 
+   rtx addr_mask = gen_int_mode (-4, Pmode);
+ 
+   rtx aligned_addr = gen_reg_rtx (Pmode);
+ 
+   emit_move_insn (aligned_addr,  gen_rtx_AND (Pmode, addr, addr_mask));
+ 
+   *aligned_mem = change_address (mem, SImode, aligned_addr);
+ 
+   /* Calculate the shift amount.  */
+   emit_move_insn (*shift, gen_rtx_AND (SImode, addr, gen_int_mode (3, SImode)));
+ 
+   if (TARGET_LITTLE_ENDIAN == 0) {
+     emit_move_insn (*shift,
+ 		    gen_rtx_MINUS (SImode, gen_int_mode (3, SImode), *shift));
+   }
+ 
+   emit_move_insn (*shift, gen_rtx_ASHIFT (SImode, *shift,
+ 					  gen_int_mode (3, SImode)));
+ }
+ 
  static bool
  microblaze_rtx_costs (rtx x, machine_mode mode, int outer_code ATTRIBUTE_UNUSED,
  		      int opno ATTRIBUTE_UNUSED, int *total,
diff -Nrcpad gcc-16-20250914/gcc/config/microblaze/microblaze.md gcc-16-20250921/gcc/config/microblaze/microblaze.md
*** gcc-16-20250914/gcc/config/microblaze/microblaze.md	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/microblaze/microblaze.md	Sun Sep 21 22:32:36 2025
***************
*** 21,26 ****
--- 21,27 ----
  
  (include "constraints.md")
  (include "predicates.md")
+ (include "iterators.md")
  
  ;;----------------------------------------------------
  ;; Constants
***************
*** 43,48 ****
--- 44,53 ----
    (UNSPEC_TLS           106)    ;; jump table
    (UNSPEC_SET_TEXT      107)    ;; set text start
    (UNSPEC_TEXT          108)    ;; data text relative
+   (UNSPECV_CAS_BOOL     201)    ;; compare and swap (bool)
+   (UNSPECV_CAS_VAL      202)    ;; compare and swap (val)
+   (UNSPECV_CAS_MEM      203)    ;; compare and swap (mem)
+   (UNSPECV_ATOMIC_FETCH_OP     204)    ;; atomic fetch op
  ])
  
  (define_c_enum "unspec" [
***************
*** 79,85 ****
  ;; bshift 	Shift operations
  
  (define_attr "type"
!   "unknown,branch,jump,call,load,store,move,arith,darith,imul,idiv,icmp,multi,nop,no_delay_arith,no_delay_load,no_delay_store,no_delay_imul,no_delay_move,bshift,fadd,frsub,fmul,fdiv,fcmp,fsl,fsqrt,fcvt,trap"
    (const_string "unknown"))
  
  ;; Main data type used by the insn
--- 84,90 ----
  ;; bshift 	Shift operations
  
  (define_attr "type"
!   "unknown,branch,jump,call,load,store,move,arith,darith,imul,idiv,icmp,multi,nop,no_delay_arith,no_delay_load,no_delay_store,no_delay_imul,no_delay_move,bshift,fadd,frsub,fmul,fdiv,fcmp,fsl,fsqrt,fcvt,trap,atomic"
    (const_string "unknown"))
  
  ;; Main data type used by the insn
diff -Nrcpad gcc-16-20250914/gcc/config/microblaze/sync.md gcc-16-20250921/gcc/config/microblaze/sync.md
*** gcc-16-20250914/gcc/config/microblaze/sync.md	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/microblaze/sync.md	Sun Sep 21 22:32:36 2025
***************
*** 18,43 ****
  ;; <http://www.gnu.org/licenses/>.
  
  (define_insn "atomic_compare_and_swapsi"
!   [(match_operand:SI 0 "register_operand" "=&d")	;; bool output
!    (match_operand:SI 1 "register_operand" "=&d")	;; val output
!    (match_operand:SI 2 "nonimmediate_operand" "+Q")	;; memory
!    (match_operand:SI 3 "register_operand" "d")		;; expected value
!    (match_operand:SI 4 "register_operand" "d")		;; desired value
!    (match_operand:SI 5 "const_int_operand" "")		;; is_weak
!    (match_operand:SI 6 "const_int_operand" "")		;; mod_s
!    (match_operand:SI 7 "const_int_operand" "")		;; mod_f
     (clobber (match_scratch:SI 8 "=&d"))]
    ""
    {
!     output_asm_insn ("addc \tr0,r0,r0", operands);
!     output_asm_insn ("lwx  \t%1,%y2,r0", operands);
!     output_asm_insn ("addic\t%8,r0,0", operands);
!     output_asm_insn ("bnei \t%8,.-8", operands);
!     output_asm_insn ("cmp  \t%0,%1,%3", operands);
!     output_asm_insn ("bnei \t%0,.+16", operands);
!     output_asm_insn ("swx  \t%4,%y2,r0", operands);
!     output_asm_insn ("addic\t%8,r0,0", operands);
!     output_asm_insn ("bnei \t%8,.-28", operands);
!     return "";
    }
  )
--- 18,114 ----
  ;; <http://www.gnu.org/licenses/>.
  
  (define_insn "atomic_compare_and_swapsi"
!   [(set (match_operand:SI 0 "register_operand" "=&d")		;; bool output
!         (unspec_volatile:SI
!           [(match_operand:SI 2 "nonimmediate_operand" "+Q")	;; memory
!            (match_operand:SI 3 "register_operand" "d")		;; expected value
!            (match_operand:SI 4 "register_operand" "d")]		;; desired value
!           UNSPECV_CAS_BOOL))
!    (set (match_operand:SI 1 "register_operand" "=&d")		;; val output
!         (unspec_volatile:SI [(const_int 0)] UNSPECV_CAS_VAL))
!    (set (match_dup 2)
!         (unspec_volatile:SI [(const_int 0)] UNSPECV_CAS_MEM))
!    (match_operand:SI 5 "const_int_operand" "")			;; is_weak
!    (match_operand:SI 6 "const_int_operand" "")			;; mod_s
!    (match_operand:SI 7 "const_int_operand" "")			;; mod_f
     (clobber (match_scratch:SI 8 "=&d"))]
    ""
    {
!     return "add  \t%0,r0,r0\n\t"
!       "lwx  \t%1,%y2,r0\n\t"
!       "addic\t%8,r0,0\n\t"
!       "bnei \t%8,.-8\n\t"
!       "cmp  \t%8,%1,%3\n\t"
!       "bnei \t%8,.+20\n\t"
!       "swx  \t%4,%y2,r0\n\t"
!       "addic\t%8,r0,0\n\t"
!       "bnei \t%8,.-28\n\t"
!       "addi \t%0,r0,1";
    }
+   [(set_attr "type"	"atomic")
+   (set_attr "mode"	"SI")
+   (set_attr "length"	"40")]
  )
+ 
+ ;;
+ ;;
+ ;;
+ ;;
+ (define_insn "atomic_fetch_<atomic_optab>si"
+   [(set (match_operand:SI 0 "register_operand" "=&d")
+ 	(match_operand:SI 1 "memory_operand" "+Q"))
+    (set (match_dup 1)
+ 	(unspec_volatile:SI
+ 	  [(any_atomic:SI (match_dup 1)
+ 		   (match_operand:SI 2 "register_operand" "d"))
+ 	   (match_operand:SI 3 "const_int_operand")] ;; model
+ 	 UNSPECV_ATOMIC_FETCH_OP))
+    (clobber (match_scratch:SI 4 "=&d"))]	  ;; tmp_1
+   ""
+   {
+     return
+       "lwx  \t%0,%y1,r0\n\t"
+       "addic\t%4,r0,0\n\t"
+       "bnei \t%4,.-8\n\t"
+       "<atomic_optab>\t%4,%0,%2\n\t"
+       "swx  \t%4,%y1,r0\n\t"
+       "addic\t%4,r0,0\n\t"
+       "bnei \t%4,.-24";
+   }
+   [(set_attr "type"	"atomic")
+   (set_attr "mode"	"SI")
+   (set_attr "length"	"28")])
+ 
+ ;;
+ ;; MicroBlaze only supports lx/sx instructions for word mode only
+ ;;
+ ;; Use shift|mask magic to implement atomic_test_and_set using lwx/swx
+ ;;
+ (define_expand "atomic_test_and_set"
+   [(match_operand:QI 0 "register_operand" "")    ;; bool output
+    (match_operand:QI 1 "memory_operand" "m")    ;; memory
+    (match_operand:SI 2 "const_int_operand" "")]  ;; model
+   ""
+ {
+   rtx old = gen_reg_rtx (SImode);
+   rtx mem = operands[1];
+   rtx model = operands[2];
+   rtx set = gen_reg_rtx (SImode);
+   rtx aligned_mem = gen_reg_rtx (SImode);
+   rtx shift = gen_reg_rtx (SImode);
+ 
+   microblaze_subword_address (mem, &aligned_mem, &shift);
+ 
+   emit_move_insn (set, GEN_INT (1));
+   rtx shifted_set = gen_reg_rtx (SImode);
+ 
+   emit_move_insn (shifted_set, gen_rtx_ASHIFT (SImode, set, shift));
+ 
+   emit_insn (gen_atomic_fetch_orsi (old, aligned_mem, shifted_set, model));
+ 
+   emit_move_insn (old, gen_rtx_ASHIFTRT (SImode, old, shift));
+ 
+   emit_move_insn (operands[0], gen_lowpart (QImode, old));
+ 
+   DONE;
+ })
diff -Nrcpad gcc-16-20250914/gcc/config/riscv/arch-canonicalize gcc-16-20250921/gcc/config/riscv/arch-canonicalize
*** gcc-16-20250914/gcc/config/riscv/arch-canonicalize	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/riscv/arch-canonicalize	Sun Sep 21 22:32:37 2025
*************** def get_all_extensions():
*** 341,346 ****
--- 341,364 ----
  #
  IMPLIED_EXT = parse_def_files()
  
+ def load_profiles():
+     profiles = set()
+     def_path = os.path.join(os.path.dirname(__file__), "riscv-profiles.def")
+     with open(def_path) as f:
+         for line in f:
+             line = line.strip()
+             if line.startswith("RISCV_PROFILE"):
+                 # Format: RISCV_PROFILE("rva20u64", "rv64imafd...")
+                 parts = line.split('"')
+                 if len(parts) >= 2:
+                     profiles.add(parts[1])   # Compare PROFILE_NAME
+     return profiles
+ 
+ SUPPORTED_PROFILES = load_profiles()
+ 
+ def is_profile_arch(arch):
+     return arch in SUPPORTED_PROFILES
+ 
  def arch_canonicalize(arch, isa_spec):
    # TODO: Support extension version.
    is_isa_spec_2p2 = isa_spec == '2.2'
*************** if __name__ == "__main__":
*** 608,614 ****
      sys.exit(run_unit_tests())
    elif args.arch_strs:
      for arch in args.arch_strs:
!       print (arch_canonicalize(arch, args.misa_spec))
    else:
      parser.print_help()
      sys.exit(1)
--- 626,635 ----
      sys.exit(run_unit_tests())
    elif args.arch_strs:
      for arch in args.arch_strs:
!       if is_profile_arch(arch):
!           print(arch)
!       else:
!           print(arch_canonicalize(arch, args.misa_spec))
    else:
      parser.print_help()
      sys.exit(1)
diff -Nrcpad gcc-16-20250914/gcc/config/riscv/autovec-opt.md gcc-16-20250921/gcc/config/riscv/autovec-opt.md
*** gcc-16-20250914/gcc/config/riscv/autovec-opt.md	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/riscv/autovec-opt.md	Sun Sep 21 22:32:37 2025
***************
*** 1868,1873 ****
--- 1868,1915 ----
    }
    [(set_attr "type" "vimuladd")])
  
+ (define_insn_and_split "*widen_first_<any_extend:su>_vx_<mode>"
+  [(set (match_operand:VWEXTI_D     0 "register_operand")
+        (vec_duplicate:VWEXTI_D
+ 	 (any_extend:<VEL>
+ 	   (match_operand:<VSUBEL> 1 "register_operand"))))]
+   "TARGET_VECTOR && TARGET_64BIT && can_create_pseudo_p ()"
+   "#"
+   "&& 1"
+   [(const_int 0)]
+   {
+     rtx extend_scalar = gen_reg_rtx (<VEL>mode);
+     emit_insn (gen_<any_extend:extend_name><vsubel><vel>2 (extend_scalar,
+ 							   operands[1]));
+ 
+     insn_code icode = code_for_pred_broadcast (<MODE>mode);
+     rtx vec_dup_ops[] = {operands[0], extend_scalar};
+     riscv_vector::emit_vlmax_insn (icode, riscv_vector::UNARY_OP, vec_dup_ops);
+ 
+     DONE;
+   })
+ 
+ (define_insn_and_split "*widen_<any_widen_binop:optab>_<any_extend:su>_vx_<mode>"
+  [(set (match_operand:VWEXTI_D             0 "register_operand")
+        (any_widen_binop:VWEXTI_D
+ 	 (any_extend:VWEXTI_D
+ 	   (match_operand:<V_DOUBLE_TRUNC> 1 "register_operand"))
+ 	 (vec_duplicate:VWEXTI_D
+ 	   (any_extend:<VEL>
+ 	     (match_operand:<VSUBEL>       2 "register_operand")))))]
+   "TARGET_VECTOR && TARGET_64BIT && can_create_pseudo_p ()"
+   "#"
+   "&& 1"
+   [(const_int 0)]
+   {
+     insn_code icode = code_for_pred_dual_widen_scalar (<any_widen_binop:CODE>,
+ 						       <any_extend:CODE>,
+ 						       <MODE>mode);
+     riscv_vector::emit_vlmax_insn (icode, riscv_vector::BINARY_OP, operands);
+ 
+     DONE;
+   }
+   [(set_attr "type" "viwalu")])
  
  ;; =============================================================================
  ;; Combine vec_duplicate + op.vv to op.vf
diff -Nrcpad gcc-16-20250914/gcc/config/riscv/iterators.md gcc-16-20250921/gcc/config/riscv/iterators.md
*** gcc-16-20250914/gcc/config/riscv/iterators.md	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/riscv/iterators.md	Sun Sep 21 22:32:37 2025
***************
*** 207,212 ****
--- 207,215 ----
  ;; This code iterator allows signed and unsigned widening multiplications
  ;; to use the same template.
  (define_code_iterator any_extend [sign_extend zero_extend])
+ (define_code_attr extend_name [
+   (sign_extend "extend") (zero_extend "zero_extend")
+ ])
  
  ;; These code iterators allow unsigned and signed extraction to be generated
  ;; from the same template.
diff -Nrcpad gcc-16-20250914/gcc/config/riscv/riscv-bclr-lowest-set-bit.cc gcc-16-20250921/gcc/config/riscv/riscv-bclr-lowest-set-bit.cc
*** gcc-16-20250914/gcc/config/riscv/riscv-bclr-lowest-set-bit.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/config/riscv/riscv-bclr-lowest-set-bit.cc	Sun Sep 21 22:32:37 2025
***************
*** 0 ****
--- 1,306 ----
+ /* Convert clear lowest bit set idiom into a more efficient
+    bclr sequence when possible.
+ 
+    Copyright (C) 2018-2025 Free Software Foundation, Inc.
+ 
+ This file is part of GCC.
+ 
+ GCC is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+ 
+ GCC is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ 
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3.  If not see
+ <http://www.gnu.org/licenses/>.  */
+ 
+ #define IN_TARGET_CODE 1
+ 
+ #include "config.h"
+ #include "system.h"
+ #include "coretypes.h"
+ #include "tm.h"
+ #include "rtl.h"
+ #include "backend.h"
+ #include "df.h"
+ #include "tree-pass.h"
+ 
+ /* x & (x - 1) clears the lowest set bit in x.  If we have a ctz (x) nearby,
+    then we can use a bclr with the bit position defined by the output of
+    the ctz.  */
+ 
+ namespace {
+ 
+ const pass_data pass_data_bclr_lowest_set_bit =
+ {
+   RTL_PASS, /* type */
+   "bclr_lowest_set_bit", /* name */
+   OPTGROUP_NONE, /* optinfo_flags */
+   TV_NONE, /* tv_id */
+   0, /* properties_required */
+   0, /* properties_provided */
+   0, /* properties_destroyed */
+   0, /* todo_flags_start */
+   0, /* todo_flags_finish */
+ };
+ 
+ class pass_bclr_lowest_set_bit : public rtl_opt_pass
+ {
+ public:
+   pass_bclr_lowest_set_bit (gcc::context *ctxt)
+     : rtl_opt_pass (pass_data_bclr_lowest_set_bit, ctxt)
+   {}
+ 
+   /* opt_pass methods: */
+   virtual bool gate (function *)
+     {
+       /* This uses ctz and bclr, so we need ZBB and ZBS
+ 	 instructions.  */
+       return TARGET_ZBB && TARGET_ZBS && optimize > 0;
+     }
+   virtual unsigned int execute (function *);
+ 
+ private:
+ }; // class pass_bclr_lowest_set_bit
+ 
+ /* Look at real insns before START to see if any of them compute ctz (src).
+    If so, return the insn that is a ctz, otherwise return NULL.  Look no
+    further than LIMIT real statements and do not leave this basic block.  */
+ 
+ rtx_insn *
+ find_prior_ctz (rtx_insn *start, rtx src, int limit)
+ {
+   rtx_insn *prev = start;
+   while (prev && limit > 0)
+     {
+       prev = prev_nonnote_nondebug_insn_bb (prev);
+       limit--;
+ 
+       if (prev)
+ 	{
+ 	  rtx set = single_set (prev);
+ 	  if (!set)
+ 	    continue;
+ 
+ 	  /* A ctz of a SI object on rv64 will have an
+ 	     SUBREG argument.  */
+ 	  if (GET_CODE (SET_SRC (set)) == CTZ
+ 	      && (XEXP (SET_SRC (set), 0) == src
+ 		  || (SUBREG_P (XEXP (SET_SRC (set), 0))
+ 		      && SUBREG_REG (XEXP (SET_SRC (set), 0)) == src)))
+ 	    {
+ 	      /* We've found a CTZ, make sure neither the input nor
+ 		 the output change between the CTZ and START.  */
+ 	      if (reg_set_between_p (src, prev, start)
+ 		  || reg_set_between_p (SET_DEST (set), prev, start))
+ 		return NULL;
+ 
+ 	      /* Everything looks good.  */
+ 	      return prev;
+ 	    }
+ 	}
+     }
+   return NULL;
+ }
+ 
+ /* Look at real insns after START to see if any of them compute ctz (src).
+    If so, return the insn that is a ctz, otherwise return NULL.  Look no
+    further than LIMIT real statements and do not leave this basic block.  */
+ 
+ rtx_insn *
+ find_later_ctz (rtx_insn *start, rtx src, int limit)
+ {
+   rtx_insn *next = start;
+   while (next && limit > 0)
+     {
+       next = next_nonnote_nondebug_insn_bb (next);
+       limit--;
+ 
+       if (next)
+ 	{
+ 	  rtx set = single_set (next);
+ 	  if (!set)
+ 	    continue;
+ 
+ 	  /* A ctz of a SI object on rv64 will have an
+ 	     SUBREG argument.  */
+ 	  if (GET_CODE (SET_SRC (set)) == CTZ
+ 	      && (XEXP (SET_SRC (set), 0) == src
+ 		  || (SUBREG_P (XEXP (SET_SRC (set), 0))
+ 		      && SUBREG_REG (XEXP (SET_SRC (set), 0)) == src)))
+ 	    {
+ 	      /* We've found a CTZ.  The CTZ is going to be moved, so
+ 		 we need to verify its input doesn't change between
+ 		 START and NEXT.  We also have to verify that its
+ 		 destination is unused between those points.  */
+ 	      if (reg_set_between_p (XEXP (SET_SRC (set), 0), start, next)
+ 		  || reg_used_between_p (SET_DEST (set), start, next))
+ 		return NULL;
+ 
+ 	      return next;
+ 	    }
+ 	}
+     }
+   return NULL;
+ }
+ 
+ /* So the basic idea here is to find x & (x - 1) idioms which clear the
+    lowest set bit.  If there is a nearby ctz (x), then we can profitably
+    use a ctz+bclr sequence instead, essentially replacing the addi+and
+    with bclr.  This should often be more efficient and save space.
+ 
+    We don't do this in gimple because the cost model would reject as the
+    optimized for appear more expensive from its costing model.
+ 
+    Combine won't work as there's no data dependency between the
+    ctz and the x & (x - 1) idiom.
+ 
+    Peepholing doesn't work consistently because we're constantly
+    inserting unrelated instructions between the two components of
+    the x & (x - 1) idiom.  We'd have to match the ctz in various
+    positions as well as deal with random insns the scheduler puts
+    in the middle of the key instrutions.
+ 
+    So, this mini pass to optimize this scenario.  */
+ 
+ unsigned int
+ pass_bclr_lowest_set_bit::execute (function *fn)
+ {
+   basic_block bb;
+ 
+   /* Scan all the blocks, once.  */
+   FOR_ALL_BB_FN (bb, fn)
+     {
+       rtx_insn *insn;
+       /* Scan all the insns once.  */
+       FOR_BB_INSNS (bb, insn)
+ 	{
+ 	  /* Ignore as much as we can.  */
+ 	  if (!NONDEBUG_INSN_P (insn)
+ 	      || JUMP_P (insn)
+ 	      || CALL_P (insn))
+ 	    continue;
+ 
+ 	  rtx dec_set = single_set (insn);
+ 	  if (!dec_set)
+ 	    continue;
+ 
+ 	  rtx dec_src = SET_SRC (dec_set);
+ 	  rtx dec_dest = SET_DEST (dec_set);
+ 
+ 	  /* For a 32 bit object on rv64, the decrement will
+ 	     be wrapped by a SIGN_EXTEND.  Strip it.  */
+ 	  if (GET_CODE (dec_src) == SIGN_EXTEND)
+ 	    dec_src = XEXP (dec_src, 0);
+ 
+ 	  /* Verify it's res = x - 1, if not proceed to the next insn.  */
+ 	  if (!dec_set
+ 	      || !REG_P (dec_dest)
+ 	      || GET_CODE (dec_src) != PLUS
+ 	      || (XEXP (dec_src, 1) != CONSTM1_RTX (GET_MODE (dec_src))))
+ 	    continue;
+ 
+ 	  /* Get the value being decremented.  Note it might be
+ 	     wrapped by a SUBREG which we strip.  */
+ 	  dec_src = XEXP (dec_src, 0);
+ 	  if (SUBREG_P (dec_src))
+ 	    dec_src = SUBREG_REG (dec_src);
+ 
+ 	  /* So we've found dest = src - 1;  Now look at the next
+ 	     real insn and see if it's dest2 = (dest & src).  */
+ 	  rtx_insn *next = next_nonnote_nondebug_insn_bb (insn);
+ 	  if (!next)
+ 	    continue;
+ 
+ 	  rtx and_set = single_set (next);
+ 
+ 	  if (!and_set)
+ 	    continue;
+ 
+ 	  rtx and_src = SET_SRC (and_set);
+ 	  rtx and_dest = SET_DEST (and_set);
+ 	  if (!and_set
+ 	      || !REG_P (and_dest)
+ 	      || GET_CODE (and_src) != AND)
+ 	    continue;
+ 
+ 	  rtx and_op0 = XEXP (and_src, 0);
+ 	  rtx and_op1 = XEXP (and_src, 1);
+ 
+ 	  if (dec_dest != and_op0 && dec_dest != and_op1)
+ 	    continue;
+ 
+ 	  if (dec_src != and_op0 && dec_src != and_op1)
+ 	    continue;
+ 
+ 	  /* We've found x & (x - 1).  Now look for a suitable ctz nearby.  */
+ 
+ 	  rtx_insn *prior_ctz = find_prior_ctz (insn, dec_src, 10);
+ 	  if (prior_ctz)
+ 	    {
+ 	      rtx prior_ctz_output = SET_DEST (single_set (prior_ctz));
+ 
+ 	      /* Create a pattern for the variable bit clear idiom.  */
+ 	      rtx pat = gen_rtx_ROTATE (GET_MODE (dec_dest),
+ 				        GEN_INT (-2),
+ 					gen_lowpart (QImode, prior_ctz_output));
+ 	      pat = gen_rtx_AND (GET_MODE (dec_dest), pat, dec_src);
+ 
+ 	      /* Slam that pattern in as the SET_SRC of the original AND.  */
+ 	      SET_SRC (and_set) = pat;
+ 	      INSN_CODE (next) = -1;
+ 	      df_insn_rescan (next);
+ 
+ 	      /* Start next loop iteration.  */
+ 	      continue;
+ 	    }
+ 
+ 	  /* Typically in cases where we can optimize, we'll find a REG->REG
+ 	     copy into DEC_SRC immediately before INSN.  Look for it.  */
+ 	  rtx_insn *prev = prev_nonnote_nondebug_insn_bb (insn);
+ 	  rtx copy = NULL_RTX;
+ 	  if (prev
+ 	      && (copy = single_set (prev)) != NULL_RTX
+ 	      && SET_SRC (copy) == dec_src)
+ 	    dec_src = SET_DEST (copy);
+ 
+ 	  /* We didn't find a CTZ before INSN.  So look after NEXT.
+ 	     This case is more complex as we have to move insns around.  */
+ 	  rtx_insn *later_ctz = find_later_ctz (next, dec_src, 10);
+ 	  if (later_ctz)
+ 	    {
+ 	      /* Remove the CTZ from the stream and reemit it immediately
+ 		 after NEXT.  XXX FIXME.  Need to prove this is safe.  */
+ 	      df_insn_delete (later_ctz);
+ 	      remove_insn (later_ctz);
+ 	      SET_PREV_INSN (later_ctz) = NULL;
+ 	      SET_NEXT_INSN (later_ctz) = NULL;
+ 	      df_insn_rescan (emit_insn_after (PATTERN (later_ctz), next));
+ 
+ 	      /* Now construct the bclr insn and add it to the stream.  */
+ 	      rtx later_ctz_output = SET_DEST (single_set (later_ctz));
+ 	      rtx pat = gen_rtx_ROTATE (GET_MODE (dec_dest),
+ 				        GEN_INT (-2),
+ 					gen_lowpart (QImode, later_ctz_output));
+ 	      pat = gen_rtx_AND (GET_MODE (dec_dest), pat, dec_src);
+ 	      pat = gen_rtx_SET (and_dest, pat);
+ 	      df_insn_rescan (emit_insn_after (pat, NEXT_INSN (next)));
+ 	    }
+ 	}
+     }
+ 
+   return 0;
+ }
+ 
+ } // anon namespace
+ 
+ rtl_opt_pass *
+ make_pass_bclr_lowest_set_bit (gcc::context *ctxt)
+ {
+   return new pass_bclr_lowest_set_bit (ctxt);
+ }
diff -Nrcpad gcc-16-20250914/gcc/config/riscv/riscv-ext.def gcc-16-20250921/gcc/config/riscv/riscv-ext.def
*** gcc-16-20250914/gcc/config/riscv/riscv-ext.def	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/riscv/riscv-ext.def	Sun Sep 21 22:32:37 2025
*************** DEFINE_RISCV_EXT(
*** 1564,1570 ****
    /* FULL_NAME */ "sdtrig extension",
    /* DESC */ "",
    /* URL */ ,
!   /* DEP_EXTS */ ({}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ sd,
    /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
--- 1564,1570 ----
    /* FULL_NAME */ "sdtrig extension",
    /* DESC */ "",
    /* URL */ ,
!   /* DEP_EXTS */ ({"zicsr"}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ sd,
    /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
*************** DEFINE_RISCV_EXT(
*** 1941,1947 ****
    /* FULL_NAME */ "ssstrict extension",
    /* DESC */ "",
    /* URL */ ,
!   /* DEP_EXTS */ ({}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ ss,
    /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
--- 1941,1947 ----
    /* FULL_NAME */ "ssstrict extension",
    /* DESC */ "",
    /* URL */ ,
!   /* DEP_EXTS */ ({"zicsr"}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ ss,
    /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
diff -Nrcpad gcc-16-20250914/gcc/config/riscv/riscv-passes.def gcc-16-20250921/gcc/config/riscv/riscv-passes.def
*** gcc-16-20250914/gcc/config/riscv/riscv-passes.def	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/riscv/riscv-passes.def	Sun Sep 21 22:32:37 2025
***************
*** 17,22 ****
--- 17,23 ----
     along with GCC; see the file COPYING3.  If not see
     <http://www.gnu.org/licenses/>.  */
  
+ INSERT_PASS_AFTER (pass_combine, 1, pass_bclr_lowest_set_bit);
  INSERT_PASS_AFTER (pass_rtl_store_motion, 1, pass_shorten_memrefs);
  INSERT_PASS_AFTER (pass_split_all_insns, 1, pass_avlprop);
  INSERT_PASS_BEFORE (pass_fast_rtl_dce, 1, pass_vsetvl);
diff -Nrcpad gcc-16-20250914/gcc/config/riscv/riscv-profiles.def gcc-16-20250921/gcc/config/riscv/riscv-profiles.def
*** gcc-16-20250914/gcc/config/riscv/riscv-profiles.def	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/config/riscv/riscv-profiles.def	Sun Sep 21 22:32:37 2025
***************
*** 0 ****
--- 1,82 ----
+ /* List of supported core and tune info for RISC-V.
+    Copyright (C) 2025 Free Software Foundation, Inc.
+ 
+    This file is part of GCC.
+ 
+    GCC is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3, or (at your option)
+    any later version.
+ 
+    GCC is distributed in the hope that it will be useful, but
+    WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    General Public License for more details.
+ 
+    You should have received a copy of the GNU General Public License
+    along with GCC; see the file COPYING3.  If not see
+    <http://www.gnu.org/licenses/>.  */
+ 
+ /* This is a list of RISC-V Profiles defination.
+ 
+    Before using #include to read this file, define a macro:
+ 
+       RISCV_PROFILE(PROFILE_NAME, ARCH)
+ 
+    The PROFILE_NAME is the name of the profile, represented as a string.
+    The ARCH is the default arch of the core, represented as a string.  */
+ 
+ #ifndef RISCV_PROFILE
+ #define RISCV_PROFILE(PROFILE_NAME, ARCH)
+ #endif
+ 
+ /* RVI20U only contains the base extension 'i' as mandatory extension.  */
+ RISCV_PROFILE("rvi20u64",      "rv64i")
+ RISCV_PROFILE("rvi20u32",      "rv32i")
+ 
+ /* RVA20U contains the 'i,m,a,f,d,c,zicsr,zicntr,ziccif,ziccrse,ziccamoa,
+    zicclsm,za128rs' as mandatory extensions.  */
+ RISCV_PROFILE("rva20u64",     "rv64imafdc_zicsr_zicntr_ziccif_ziccrse_ziccamoa"
+ 			     "_zicclsm_za128rs")
+ 
+ /* RVA22U contains the 'i,m,a,f,d,c,zicsr,zihintpause,zba,zbb,zbs,zicntr,
+    zihpm,ziccif,ziccrse,ziccamoa, zicclsm,zic64b,za64rs,zicbom,zicbop,zicboz,
+    zfhmin,zkt' as mandatory extensions.  */
+ RISCV_PROFILE("rva22u64",     "rv64imafdc_zicsr_zicntr_ziccif_ziccrse_ziccamoa"
+ 			     "_zicclsm_zic64b_za64rs_zihintpause_zba_zbb_zbs_zicbom_zicbop"
+ 			     "_zicboz_zfhmin_zkt")
+ 
+ /* RVA23 contains all mandatory base ISA for RVA22U64 and the new extension
+    'v,zihintntl,zvfhmin,zvbb,zvkt,zicond,zimop,zcmop,zfa,zawrs' as mandatory
+    extensions.  */
+ RISCV_PROFILE("rva23u64",     "rv64imafdcbv_zicsr_zicntr_zihpm_ziccif_ziccrse"
+ 			     "_ziccamoa_zicclsm_zic64b_za64rs_zihintpause_zba_zbb_zbs"
+ 				 "_zicbom_zicbop_zicboz_zfhmin_zkt_zvfhmin_zvbb_zvkt_zihintntl"
+ 				 "_zicond_zimop_zcmop_zcb_zfa_zawrs_supm")
+ 
+ /* RVA23S contains all mandatory base ISA for RVA23U64 and the privileged
+    extensions as mandatory extensions.  */
+ RISCV_PROFILE("rva23s64",     "rv64imafdcbv_zicsr_zicntr_zihpm_ziccif_ziccrse"
+ 			     "_ziccamoa_zicclsm_zic64b_za64rs_zihintpause_zba_zbb_zbs"
+ 				 "_zicbom_zicbop_zicboz_zfhmin_zkt_zvfhmin_zvbb_zvkt_zihintntl"
+ 				 "_zicond_zimop_zcmop_zcb_zfa_zawrs_svbare_svade_ssccptr"
+ 				 "_sstvecd_sstvala_sscounterenw_svpbmt_svinval_svnapot_sstc"
+ 				 "_sscofpmf_ssnpm_ssu64xl_sha_supm")
+ 
+ /* RVB23 contains all mandatory base ISA for RVA22U64 and the new extension
+    'zihintntl,zicond,zimop,zcmop,zfa,zawrs' as mandatory extensions.  */
+ RISCV_PROFILE("rvb23u64",     "rv64imafdcb_zicsr_zicntr_zihpm_ziccif_ziccrse"
+ 			     "_ziccamoa_zicclsm_zic64b_za64rs_zihintpause_zba_zbb_zbs"
+ 				 "_zicbom_zicbop_zicboz_zfhmin_zkt_zihintntl_zicond_zimop"
+ 				 "_zcmop_zcb")
+ 
+ /* RVB23S contains all mandatory base ISA for RVB23U64 and the privileged
+    extensions as mandatory extensions.  */
+ RISCV_PROFILE("rvb23s64",     "rv64imafdcb_zicsr_zicntr_zihpm_ziccif_ziccrse"
+ 			     "_ziccamoa_zicclsm_zic64b_za64rs_zihintpause_zba_zbb_zbs"
+ 				 "_zicbom_zicbop_zicboz_zfhmin_zkt_zvfhmin_zvbb_zvkt"
+ 				 "_zihintntl_zicond_zimop_zcmop_zcb_zfa_zawrs_svbare_svade"
+ 				 "_ssccptr_sstvecd_sstvala_sscounterenw_svpbmt_svinval_svnapot"
+ 				 "_sstc_sscofpmf_ssu64xl_supm")
+ 
+ #undef RISCV_PROFILE
diff -Nrcpad gcc-16-20250914/gcc/config/riscv/riscv-protos.h gcc-16-20250921/gcc/config/riscv/riscv-protos.h
*** gcc-16-20250914/gcc/config/riscv/riscv-protos.h	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/riscv/riscv-protos.h	Sun Sep 21 22:32:37 2025
*************** rtl_opt_pass * make_pass_avlprop (gcc::c
*** 207,212 ****
--- 207,213 ----
  rtl_opt_pass * make_pass_vsetvl (gcc::context *ctxt);
  rtl_opt_pass * make_pass_insert_landing_pad (gcc::context *ctxt);
  rtl_opt_pass * make_pass_vector_permconst (gcc::context *ctxt);
+ rtl_opt_pass * make_pass_bclr_lowest_set_bit (gcc::context *ctxt);
  
  
  /* Routines implemented in riscv-string.c.  */
diff -Nrcpad gcc-16-20250914/gcc/config/riscv/riscv-v.cc gcc-16-20250921/gcc/config/riscv/riscv-v.cc
*** gcc-16-20250914/gcc/config/riscv/riscv-v.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/riscv/riscv-v.cc	Sun Sep 21 22:32:37 2025
*************** shuffle_compress_patterns (struct expand
*** 3742,3749 ****
    return true;
  }
  
! /* Recognize patterns like [4 5 6 7 12 13 14 15] where either the lower
!    or the higher parts of both vectors are combined into one.  */
  
  static bool
  shuffle_slide_patterns (struct expand_vec_perm_d *d)
--- 3742,3749 ----
    return true;
  }
  
! /* Recognize patterns like [4 5 6 7 12 13 14 15] where a consecutive part of a
!    vector is combined into another.  */
  
  static bool
  shuffle_slide_patterns (struct expand_vec_perm_d *d)
*************** shuffle_slide_patterns (struct expand_ve
*** 3755,3760 ****
--- 3755,3761 ----
      return false;
  
    int vlen = vec_len.to_constant ();
+   int len = 0;
    if (vlen < 4)
      return false;
  
*************** shuffle_slide_patterns (struct expand_ve
*** 3763,3770 ****
  
    /* For a slideup OP0 can stay, for a slidedown OP1 can.
       The former requires that the first element of the permutation
!      is the first element of OP0, the latter that the last permutation
!      element is the last element of OP1.  */
    bool slideup = false;
    bool slidedown = false;
  
--- 3764,3770 ----
  
    /* For a slideup OP0 can stay, for a slidedown OP1 can.
       The former requires that the first element of the permutation
!      is the first element of OP0.  */
    bool slideup = false;
    bool slidedown = false;
  
*************** shuffle_slide_patterns (struct expand_ve
*** 3776,3788 ****
    if (known_eq (d->perm[vlen - 1], 2 * vlen - 1))
      slidedown = true;
  
-   if (slideup && slidedown)
-     return false;
- 
    if (!slideup && !slidedown)
      return false;
  
!   /* Check for a monotonic sequence with one pivot.  */
    int pivot = -1;
    for (int i = 0; i < vlen; i++)
      {
--- 3776,3785 ----
    if (known_eq (d->perm[vlen - 1], 2 * vlen - 1))
      slidedown = true;
  
    if (!slideup && !slidedown)
      return false;
  
!   /* Check for a monotonic sequence with one or two pivots.  */
    int pivot = -1;
    for (int i = 0; i < vlen; i++)
      {
*************** shuffle_slide_patterns (struct expand_ve
*** 3790,3810 ****
  	pivot = i;
        if (i > 0 && i != pivot
  	  && maybe_ne (d->perm[i], d->perm[i - 1] + 1))
! 	return false;
      }
  
    if (pivot == -1)
      return false;
  
    /* For a slideup OP1's part (to be slid up) must be a low part,
       i.e. starting with its first element.  */
    if (slideup && maybe_ne (d->perm[pivot], vlen))
        return false;
  
!   /* For a slidedown OP0's part (to be slid down) must be a high part,
!      i.e. ending with its last element.  */
!   if (slidedown && maybe_ne (d->perm[pivot - 1], vlen - 1))
!     return false;
  
    /* Success!  */
    if (d->testing_p)
--- 3787,3823 ----
  	pivot = i;
        if (i > 0 && i != pivot
  	  && maybe_ne (d->perm[i], d->perm[i - 1] + 1))
! 	{
! 	  if (pivot == -1 || len != 0)
! 	    return false;
! 	  /* A second pivot would indicate the vector length.  */
! 	  len = i;
! 	}
      }
  
    if (pivot == -1)
      return false;
  
+   /* In case we have both the permutation starting at OP0's first element and
+      ending at OP1's last element we may have a slidedown from the
+      beginning.  */
+   if (slideup && slidedown)
+     {
+       /* The first pivot must be OP1's element in the PIVOT position.  */
+       if (maybe_ne (d->perm[pivot], vlen + pivot))
+ 	return false;
+ 
+       slideup = false;
+     }
+ 
    /* For a slideup OP1's part (to be slid up) must be a low part,
       i.e. starting with its first element.  */
    if (slideup && maybe_ne (d->perm[pivot], vlen))
        return false;
  
!   /* The second pivot in a slideup must be following OP0's position.  */
!   if (slideup && len && maybe_ne (d->perm[len], len))
!       return false;
  
    /* Success!  */
    if (d->testing_p)
*************** shuffle_slide_patterns (struct expand_ve
*** 3813,3834 ****
    /* PIVOT is the start of the lower/higher part of OP1 or OP2.
       For a slideup it indicates how many elements of OP1 to
       skip/slide over.  For a slidedown it indicates how long
!      OP1's high part is, while VLEN - PIVOT is the amount to slide.  */
!   int slide_cnt = slideup ? pivot : vlen - pivot;
    insn_code icode;
    if (slideup)
      {
-       /* No need for a vector length because we slide up until the
- 	 end of OP1 anyway.  */
        rtx ops[] = {d->target, d->op0, d->op1, gen_int_mode (slide_cnt, Pmode)};
        icode = code_for_pred_slide (UNSPEC_VSLIDEUP, vmode);
!       emit_vlmax_insn (icode, SLIDEUP_OP_MERGE, ops);
      }
    else
      {
!       /* Here we need a length because we slide to the beginning of OP1
! 	 leaving the remaining elements undisturbed.  */
!       int len = pivot;
        rtx ops[] = {d->target, d->op1, d->op0,
  		   gen_int_mode (slide_cnt, Pmode)};
        icode = code_for_pred_slide (UNSPEC_VSLIDEDOWN, vmode);
--- 3826,3848 ----
    /* PIVOT is the start of the lower/higher part of OP1 or OP2.
       For a slideup it indicates how many elements of OP1 to
       skip/slide over.  For a slidedown it indicates how long
!      OP1's high part is, while the first element is the amount to slide.  */
    insn_code icode;
+   int slide_cnt = slideup ? pivot : d->perm[0].to_constant();
    if (slideup)
      {
        rtx ops[] = {d->target, d->op0, d->op1, gen_int_mode (slide_cnt, Pmode)};
        icode = code_for_pred_slide (UNSPEC_VSLIDEUP, vmode);
!       /* If we didn't set a vector length we slide up until the end of OP1.  */
!       if (len)
! 	emit_nonvlmax_insn (icode, BINARY_OP_TUMA, ops,
! 			    gen_int_mode (len, Pmode));
!       else
! 	emit_vlmax_insn (icode, SLIDEUP_OP_MERGE, ops);
      }
    else
      {
!       len = pivot;
        rtx ops[] = {d->target, d->op1, d->op0,
  		   gen_int_mode (slide_cnt, Pmode)};
        icode = code_for_pred_slide (UNSPEC_VSLIDEDOWN, vmode);
diff -Nrcpad gcc-16-20250914/gcc/config/riscv/riscv-vector-costs.cc gcc-16-20250921/gcc/config/riscv/riscv-vector-costs.cc
*** gcc-16-20250914/gcc/config/riscv/riscv-vector-costs.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/riscv/riscv-vector-costs.cc	Sun Sep 21 22:32:37 2025
*************** compute_estimated_lmul (loop_vec_info lo
*** 632,638 ****
        int estimated_lmul = estimated_vf * GET_MODE_BITSIZE (mode).to_constant ()
  			   / TARGET_MIN_VLEN;
        if (estimated_lmul > RVV_M8)
! 	return regno_alignment;
        else
  	return estimated_lmul;
      }
--- 632,638 ----
        int estimated_lmul = estimated_vf * GET_MODE_BITSIZE (mode).to_constant ()
  			   / TARGET_MIN_VLEN;
        if (estimated_lmul > RVV_M8)
! 	return RVV_M8;
        else
  	return estimated_lmul;
      }
diff -Nrcpad gcc-16-20250914/gcc/config/riscv/riscv.cc gcc-16-20250921/gcc/config/riscv/riscv.cc
*** gcc-16-20250914/gcc/config/riscv/riscv.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/riscv/riscv.cc	Sun Sep 21 22:32:37 2025
*************** riscv_compute_frame_info (void)
*** 8109,8122 ****
        /* Only use save/restore routines if they don't alter the stack size.  */
        if (riscv_stack_align (num_save_restore * UNITS_PER_WORD) == x_save_size
            && !riscv_avoid_save_libcall ())
! 	{
! 	  /* Libcall saves/restores 3 registers at once, so we need to
! 	     allocate 12 bytes for callee-saved register.  */
! 	  if (TARGET_RVE)
! 	    x_save_size = 3 * UNITS_PER_WORD;
! 
! 	  frame->save_libcall_adjustment = x_save_size;
! 	}
  
        if (!riscv_avoid_multi_push (frame))
  	{
--- 8109,8115 ----
        /* Only use save/restore routines if they don't alter the stack size.  */
        if (riscv_stack_align (num_save_restore * UNITS_PER_WORD) == x_save_size
            && !riscv_avoid_save_libcall ())
!         frame->save_libcall_adjustment = x_save_size;
  
        if (!riscv_avoid_multi_push (frame))
  	{
*************** riscv_macro_fusion_pair_p (rtx_insn *pre
*** 10376,10381 ****
--- 10369,10375 ----
  	  && GET_CODE (SET_SRC (curr_set)) == LSHIFTRT
  	  && REG_P (SET_DEST (prev_set))
  	  && REG_P (SET_DEST (curr_set))
+ 	  && REG_P (XEXP (SET_SRC (curr_set), 0))
  	  && REGNO (XEXP (SET_SRC (curr_set), 0)) == curr_dest_regno
  	  && CONST_INT_P (XEXP (SET_SRC (prev_set), 1))
  	  && CONST_INT_P (XEXP (SET_SRC (curr_set), 1))
*************** riscv_macro_fusion_pair_p (rtx_insn *pre
*** 10404,10409 ****
--- 10398,10404 ----
  	  && GET_CODE (SET_SRC (curr_set)) == LSHIFTRT
  	  && REG_P (SET_DEST (prev_set))
  	  && REG_P (SET_DEST (curr_set))
+ 	  && REG_P (XEXP (SET_SRC (curr_set), 0))
  	  && REGNO (XEXP (SET_SRC (curr_set), 0)) == curr_dest_regno
  	  && CONST_INT_P (XEXP (SET_SRC (prev_set), 1))
  	  && CONST_INT_P (XEXP (SET_SRC (curr_set), 1))
*************** riscv_macro_fusion_pair_p (rtx_insn *pre
*** 10428,10433 ****
--- 10423,10429 ----
        if (MEM_P (SET_SRC (curr_set))
  	  && SCALAR_INT_MODE_P (GET_MODE (SET_DEST (curr_set)))
  	  && REG_P (XEXP (SET_SRC (curr_set), 0))
+ 	  && REG_P (XEXP (SET_SRC (curr_set), 0))
  	  && REGNO (XEXP (SET_SRC (curr_set), 0)) == prev_dest_regno
  	  && GET_CODE (SET_SRC (prev_set)) == PLUS
  	  && REG_P (XEXP (SET_SRC (prev_set), 0))
*************** riscv_macro_fusion_pair_p (rtx_insn *pre
*** 10488,10493 ****
--- 10484,10490 ----
        if (MEM_P (SET_SRC (curr_set))
  	  && SCALAR_INT_MODE_P (GET_MODE (SET_DEST (curr_set)))
  	  && GET_CODE (XEXP (SET_SRC (curr_set), 0)) == PLUS
+ 	  && REG_P (XEXP (XEXP (SET_SRC (curr_set), 0), 0))
  	  && REGNO (XEXP (XEXP (SET_SRC (curr_set), 0), 0)) == prev_dest_regno)
  	{
  	  if (riscv_set_is_add (prev_set))
*************** riscv_macro_fusion_pair_p (rtx_insn *pre
*** 10546,10553 ****
  	  && MEM_P (XEXP (SET_SRC (curr_set), 0))
  	  && SCALAR_INT_MODE_P (GET_MODE (SET_DEST (curr_set)))
  	  && GET_CODE (XEXP (XEXP (SET_SRC (curr_set), 0), 0)) == PLUS
! 	  && REG_P (XEXP (XEXP (XEXP (SET_SRC (curr_set), 0), 0),0))
! 	  && (REGNO (XEXP (XEXP (XEXP (SET_SRC (curr_set), 0), 0),0))
  	      == prev_dest_regno))
  	{
  	  if (riscv_set_is_adduw (prev_set))
--- 10543,10550 ----
  	  && MEM_P (XEXP (SET_SRC (curr_set), 0))
  	  && SCALAR_INT_MODE_P (GET_MODE (SET_DEST (curr_set)))
  	  && GET_CODE (XEXP (XEXP (SET_SRC (curr_set), 0), 0)) == PLUS
! 	  && REG_P (XEXP (XEXP (XEXP (SET_SRC (curr_set), 0), 0), 0))
! 	  && (REGNO (XEXP (XEXP (XEXP (SET_SRC (curr_set), 0), 0), 0))
  	      == prev_dest_regno))
  	{
  	  if (riscv_set_is_adduw (prev_set))
*************** riscv_macro_fusion_pair_p (rtx_insn *pre
*** 10679,10684 ****
--- 10676,10682 ----
  	  && MEM_P (SET_SRC (curr_set))
  	  && SCALAR_INT_MODE_P (GET_MODE (SET_DEST (curr_set)))
  	  && GET_CODE (XEXP (SET_SRC (curr_set), 0)) == PLUS
+ 	  && REG_P (XEXP (XEXP (SET_SRC (curr_set), 0), 0))
  	  && REGNO (XEXP (XEXP (SET_SRC (curr_set), 0), 0)) == prev_dest_regno)
  	{
  	  if (dump_file)
*************** riscv_macro_fusion_pair_p (rtx_insn *pre
*** 10690,10695 ****
--- 10688,10694 ----
  	  && MEM_P (SET_SRC (curr_set))
  	  && SCALAR_INT_MODE_P (GET_MODE (SET_DEST (curr_set)))
  	  && GET_CODE (XEXP (SET_SRC (curr_set), 0)) == LO_SUM
+ 	  && REG_P (XEXP (XEXP (SET_SRC (curr_set), 0), 0))
  	  && REGNO (XEXP (XEXP (SET_SRC (curr_set), 0), 0)) == prev_dest_regno)
  	{
  	  if (dump_file)
*************** riscv_macro_fusion_pair_p (rtx_insn *pre
*** 10703,10708 ****
--- 10702,10708 ----
  	  && MEM_P (XEXP (SET_SRC (curr_set), 0))
  	  && SCALAR_INT_MODE_P (GET_MODE (SET_DEST (curr_set)))
  	  && (GET_CODE (XEXP (XEXP (SET_SRC (curr_set), 0), 0)) == LO_SUM
+ 	      && REG_P (XEXP (XEXP (XEXP (SET_SRC (curr_set), 0), 0), 0))
  	      && (REGNO (XEXP (XEXP (XEXP (SET_SRC (curr_set), 0), 0), 0))
  		  == prev_dest_regno)))
  	{
diff -Nrcpad gcc-16-20250914/gcc/config/riscv/t-riscv gcc-16-20250921/gcc/config/riscv/t-riscv
*** gcc-16-20250914/gcc/config/riscv/t-riscv	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/riscv/t-riscv	Sun Sep 21 22:32:37 2025
*************** riscv-d.o: $(srcdir)/config/riscv/riscv-
*** 131,136 ****
--- 131,141 ----
  	$(COMPILE) $<
  	$(POSTCOMPILE)
  
+ riscv-bclr-lowest-set-bit.o: $(srcdir)/config/riscv/riscv-bclr-lowest-set-bit.cc \
+   $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TARGET_H)
+ 	$(COMPILE) $<
+ 	$(POSTCOMPILE)
+ 
  riscv-shorten-memrefs.o: $(srcdir)/config/riscv/riscv-shorten-memrefs.cc \
    $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TARGET_H)
  	$(COMPILE) $<
diff -Nrcpad gcc-16-20250914/gcc/config/riscv/vector-iterators.md gcc-16-20250921/gcc/config/riscv/vector-iterators.md
*** gcc-16-20250914/gcc/config/riscv/vector-iterators.md	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/riscv/vector-iterators.md	Sun Sep 21 22:32:37 2025
***************
*** 943,948 ****
--- 943,964 ----
    (RVVMF2SF "TARGET_VECTOR_ELEN_FP_32 && TARGET_VECTOR_ELEN_64")
  ])
  
+ (define_mode_iterator VWEXTI_D [
+   (RVVM8DI "TARGET_VECTOR_ELEN_64") (RVVM4DI "TARGET_VECTOR_ELEN_64")
+   (RVVM2DI "TARGET_VECTOR_ELEN_64") (RVVM1DI "TARGET_VECTOR_ELEN_64")
+ 
+   (V1DI "riscv_vector::vls_mode_valid_p (V1DImode) && TARGET_VECTOR_ELEN_64")
+   (V2DI "riscv_vector::vls_mode_valid_p (V2DImode) && TARGET_VECTOR_ELEN_64")
+   (V4DI "riscv_vector::vls_mode_valid_p (V4DImode) && TARGET_VECTOR_ELEN_64")
+   (V8DI "riscv_vector::vls_mode_valid_p (V8DImode) && TARGET_VECTOR_ELEN_64 && TARGET_MIN_VLEN >= 64")
+   (V16DI "riscv_vector::vls_mode_valid_p (V16DImode) && TARGET_VECTOR_ELEN_64 && TARGET_MIN_VLEN >= 128")
+   (V32DI "riscv_vector::vls_mode_valid_p (V32DImode) && TARGET_VECTOR_ELEN_64 && TARGET_MIN_VLEN >= 256")
+   (V64DI "riscv_vector::vls_mode_valid_p (V64DImode) && TARGET_VECTOR_ELEN_64 && TARGET_MIN_VLEN >= 512")
+   (V128DI "riscv_vector::vls_mode_valid_p (V128DImode) && TARGET_VECTOR_ELEN_64 && TARGET_MIN_VLEN >= 1024")
+   (V256DI "riscv_vector::vls_mode_valid_p (V256DImode) && TARGET_VECTOR_ELEN_64 && TARGET_MIN_VLEN >= 2048")
+   (V512DI "riscv_vector::vls_mode_valid_p (V512DImode) && TARGET_VECTOR_ELEN_64 && TARGET_MIN_VLEN >= 4096")
+ ])
+ 
  (define_mode_iterator VWEXTI [
    RVVM8HI RVVM4HI RVVM2HI RVVM1HI RVVMF2HI (RVVMF4HI "TARGET_VECTOR_ELEN_64")
  
diff -Nrcpad gcc-16-20250914/gcc/config/rs6000/vxworks.h gcc-16-20250921/gcc/config/rs6000/vxworks.h
*** gcc-16-20250914/gcc/config/rs6000/vxworks.h	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/rs6000/vxworks.h	Sun Sep 21 22:32:37 2025
*************** along with GCC; see the file COPYING3.
*** 267,272 ****
--- 267,277 ----
  #undef DOT_SYMBOLS
  #define DOT_SYMBOLS 0
  
+ /* Allow code model to be selected.  */
+ #undef TARGET_CMODEL
+ #define TARGET_CMODEL rs6000_current_cmodel
+ #define SET_CMODEL(opt) rs6000_current_cmodel = opt
+ 
  /* For link specs, we leverage the linux configuration bits through
     LINK_OS_EXTRA_SPEC32/64 and need to cancel the default %(link_os)
     expansion in VXWORKS_LINK_SPEC.  */
diff -Nrcpad gcc-16-20250914/gcc/config/xtensa/xtensa.cc gcc-16-20250921/gcc/config/xtensa/xtensa.cc
*** gcc-16-20250914/gcc/config/xtensa/xtensa.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/xtensa/xtensa.cc	Sun Sep 21 22:32:37 2025
*************** along with GCC; see the file COPYING3.
*** 41,46 ****
--- 41,47 ----
  #include "diagnostic-core.h"
  #include "cfgrtl.h"
  #include "output.h"
+ #include "addresses.h"
  #include "fold-const.h"
  #include "stor-layout.h"
  #include "calls.h"
diff -Nrcpad gcc-16-20250914/gcc/config/xtensa/xtensa.h gcc-16-20250921/gcc/config/xtensa/xtensa.h
*** gcc-16-20250914/gcc/config/xtensa/xtensa.h	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config/xtensa/xtensa.h	Sun Sep 21 22:32:37 2025
*************** typedef struct xtensa_args
*** 583,597 ****
     for use as a base or index register in operand addresses.  */
  
  #define REGNO_OK_FOR_INDEX_P(NUM) 0
! #define REGNO_OK_FOR_BASE_P(NUM) \
!   (GP_REG_P (NUM) || GP_REG_P ((unsigned) reg_renumber[NUM]))
  
  /* C expressions that are nonzero if X (assumed to be a `reg' RTX) is
     valid for use as a base or index register.  */
  
  #define BASE_REG_P(X, STRICT)						\
    ((!(STRICT) && ! HARD_REGISTER_P (X))					\
!    || REGNO_OK_FOR_BASE_P (REGNO (X)))
  
  /* Maximum number of registers that can appear in a valid memory address.  */
  #define MAX_REGS_PER_ADDRESS 1
--- 583,597 ----
     for use as a base or index register in operand addresses.  */
  
  #define REGNO_OK_FOR_INDEX_P(NUM) 0
! #define REGNO_OK_FOR_BASE_P(NUM) GP_REG_P (NUM)
  
  /* C expressions that are nonzero if X (assumed to be a `reg' RTX) is
     valid for use as a base or index register.  */
  
  #define BASE_REG_P(X, STRICT)						\
    ((!(STRICT) && ! HARD_REGISTER_P (X))					\
!    || regno_ok_for_base_p (REGNO (X), VOIDmode, ADDR_SPACE_GENERIC,	\
! 			   UNKNOWN, UNKNOWN))
  
  /* Maximum number of registers that can appear in a valid memory address.  */
  #define MAX_REGS_PER_ADDRESS 1
diff -Nrcpad gcc-16-20250914/gcc/config.gcc gcc-16-20250921/gcc/config.gcc
*** gcc-16-20250914/gcc/config.gcc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/config.gcc	Sun Sep 21 22:32:36 2025
*************** riscv*)
*** 550,556 ****
  	extra_objs="riscv-builtins.o riscv-c.o riscv-sr.o riscv-shorten-memrefs.o riscv-selftests.o riscv-string.o"
  	extra_objs="${extra_objs} riscv-v.o riscv-vsetvl.o riscv-vector-costs.o riscv-avlprop.o riscv-vect-permconst.o"
  	extra_objs="${extra_objs} riscv-vector-builtins.o riscv-vector-builtins-shapes.o riscv-vector-builtins-bases.o sifive-vector-builtins-bases.o andes-vector-builtins-bases.o"
! 	extra_objs="${extra_objs} thead.o riscv-target-attr.o riscv-zicfilp.o"
  	d_target_objs="riscv-d.o"
  	extra_headers="riscv_vector.h riscv_crypto.h riscv_bitmanip.h riscv_th_vector.h sifive_vector.h andes_vector.h"
  	target_gtfiles="$target_gtfiles \$(srcdir)/config/riscv/riscv-vector-builtins.cc"
--- 550,556 ----
  	extra_objs="riscv-builtins.o riscv-c.o riscv-sr.o riscv-shorten-memrefs.o riscv-selftests.o riscv-string.o"
  	extra_objs="${extra_objs} riscv-v.o riscv-vsetvl.o riscv-vector-costs.o riscv-avlprop.o riscv-vect-permconst.o"
  	extra_objs="${extra_objs} riscv-vector-builtins.o riscv-vector-builtins-shapes.o riscv-vector-builtins-bases.o sifive-vector-builtins-bases.o andes-vector-builtins-bases.o"
! 	extra_objs="${extra_objs} thead.o riscv-target-attr.o riscv-zicfilp.o riscv-bclr-lowest-set-bit.o"
  	d_target_objs="riscv-d.o"
  	extra_headers="riscv_vector.h riscv_crypto.h riscv_bitmanip.h riscv_th_vector.h sifive_vector.h andes_vector.h"
  	target_gtfiles="$target_gtfiles \$(srcdir)/config/riscv/riscv-vector-builtins.cc"
*************** case "${target}" in
*** 4775,4781 ****
  
  		# Infer arch from --with-arch, --target, and --with-abi.
  		case "${with_arch}" in
! 		rv32e* | rv32i* | rv32g* | rv64e* | rv64i* | rv64g*)
  			# OK.
  			;;
  		"")
--- 4775,4782 ----
  
  		# Infer arch from --with-arch, --target, and --with-abi.
  		case "${with_arch}" in
! 		rv32e* | rv32i* | rv32g* | rv64e* | rv64i* | rv64g* \
! 		| rvi20* | rva20* | rva22* | rva23* | rvb23*)
  			# OK.
  			;;
  		"")
*************** case "${target}" in
*** 4789,4795 ****
  			esac
  			;;
  		*)
! 			echo "--with-arch=${with_arch} is not supported.  The argument must begin with rv32e, rv32i, rv32g, rv64e, rv64i, or rv64g." 1>&2
  			exit 1
  			;;
  		esac
--- 4790,4796 ----
  			esac
  			;;
  		*)
! 			echo "--with-arch=${with_arch} is not supported.  The argument must begin with rv32e, rv32i, rv32g, rv64e, rv64i, rv64g, or a profile." 1>&2
  			exit 1
  			;;
  		esac
*************** case "${target}" in
*** 4827,4835 ****
  		ilp32,rv32* | ilp32e,rv32e* \
  		| ilp32f,rv32*f* | ilp32f,rv32g* \
  		| ilp32d,rv32*d* | ilp32d,rv32g* \
  		| lp64,rv64* | lp64e,rv64e* \
  		| lp64f,rv64*f* | lp64f,rv64g* \
! 		| lp64d,rv64*d* | lp64d,rv64g*)
  			;;
  		*)
  			echo "--with-abi=${with_abi} is not supported for ISA ${with_arch}" 1>&2
--- 4828,4842 ----
  		ilp32,rv32* | ilp32e,rv32e* \
  		| ilp32f,rv32*f* | ilp32f,rv32g* \
  		| ilp32d,rv32*d* | ilp32d,rv32g* \
+ 		| ilp32,rvi20u32* | ilp32f,rvi20u32* \
+ 		| ilp32d,rvi20u32* \
  		| lp64,rv64* | lp64e,rv64e* \
  		| lp64f,rv64*f* | lp64f,rv64g* \
! 		| lp64d,rv64*d* | lp64d,rv64g* \
! 		| lp64,rvi20u64* | lp64f,rvi20u64* \
! 		| lp64d,rva20u64* | lp64d,rva22u64* \
! 		| lp64d,rva23u64* | lp64d,rva23s64* \
! 		| lp64d,rvb23u64* | lp64d,rvb23s64)
  			;;
  		*)
  			echo "--with-abi=${with_abi} is not supported for ISA ${with_arch}" 1>&2
diff -Nrcpad gcc-16-20250914/gcc/configure gcc-16-20250921/gcc/configure
*** gcc-16-20250914/gcc/configure	Sun Sep 14 22:33:05 2025
--- gcc-16-20250921/gcc/configure	Sun Sep 21 22:34:24 2025
*************** ie0:	.space 8
*** 33209,33215 ****
  	.global _start
  	.text
  _start:
! 	addis 9,13,ie0@got@tprel@ha
  	ld 9,ie0@got@tprel@l(9)
  EOF
        if $gcc_cv_as -a64 -o conftest.o conftest.s > /dev/null 2>&1 \
--- 33209,33215 ----
  	.global _start
  	.text
  _start:
! 	addis 9,2,ie0@got@tprel@ha
  	ld 9,ie0@got@tprel@l(9)
  EOF
        if $gcc_cv_as -a64 -o conftest.o conftest.s > /dev/null 2>&1 \
diff -Nrcpad gcc-16-20250914/gcc/configure.ac gcc-16-20250921/gcc/configure.ac
*** gcc-16-20250914/gcc/configure.ac	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/configure.ac	Sun Sep 21 22:32:37 2025
*************** ie0:	.space 8
*** 6789,6795 ****
  	.global _start
  	.text
  _start:
! 	addis 9,13,ie0@got@tprel@ha
  	ld 9,ie0@got@tprel@l(9)
  EOF
        if $gcc_cv_as -a64 -o conftest.o conftest.s > /dev/null 2>&1 \
--- 6789,6795 ----
  	.global _start
  	.text
  _start:
! 	addis 9,2,ie0@got@tprel@ha
  	ld 9,ie0@got@tprel@l(9)
  EOF
        if $gcc_cv_as -a64 -o conftest.o conftest.s > /dev/null 2>&1 \
diff -Nrcpad gcc-16-20250914/gcc/cp/ChangeLog gcc-16-20250921/gcc/cp/ChangeLog
*** gcc-16-20250914/gcc/cp/ChangeLog	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/cp/ChangeLog	Sun Sep 21 22:32:37 2025
***************
*** 1,3 ****
--- 1,64 ----
+ 2025-09-20  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR c++/121981
+ 	* pt.cc (any_template_parm_r) <case TEMPLATE_TYPE_PARM>:
+ 	Don't walk TREE_TYPE.
+ 
+ 2025-09-20  Eczbek  <eczbek.void@gmail.com>
+ 
+ 	PR c++/119048
+ 	* lambda.cc (compare_lambda_sig): Only skip first parameter for
+ 	object members.
+ 
+ 2025-09-18  Jason Merrill  <jason@redhat.com>
+ 
+ 	* constexpr.cc (cxx_eval_component_reference): Clarify diagnostic.
+ 
+ 2025-09-18  Jason Merrill  <jason@redhat.com>
+ 
+ 	* init.cc (build_new_1): Clobber classes.
+ 
+ 2025-09-18  Jason Merrill  <jason@redhat.com>
+ 
+ 	* constexpr.cc (get_or_insert_ctor_field): -2 means don't insert.
+ 	(cxx_eval_component_reference): Handle finding void_node.
+ 	(cxx_eval_store_expression): Don't represent initial clobber
+ 	unless we need to activate a union member.
+ 	(cxx_eval_statement_list): Don't ask for a void prvalue.
+ 	(cxx_eval_loop_expr): The expr is discarded-value.
+ 	(cxx_eval_constant_expression): A loose clobber is non-constant.
+ 	Handle getting void_node instead of a real result.
+ 	(potential_constant_expression_1): A local temp is
+ 	potentially-constant.
+ 	* init.cc (build_new_1): Don't clobber empty types or
+ 	in a template.
+ 	(build_vec_init): Fix clobber handling.
+ 
+ 2025-09-18  Jason Merrill  <jason@redhat.com>
+ 
+ 	* init.cc (build_new_1): Append alloc_node to checking COND_EXPR.
+ 
+ 2025-09-17  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR c++/121966
+ 	* call.cc (print_z_candidate): Consolidate instances of
+ 	auto_diagnostic_nesting_level into one, above the "inherited here"
+ 	message so that any such message is nested within the note,
+ 	and any messages emitted due to the switch on rejection_reason are
+ 	similarly nested within the note.
+ 
+ 2025-09-17  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR c++/121966
+ 	* call.cc (print_z_candidates): Copy the filtering logic on viable
+ 	candidates from the printing loop to the counting loop, so that
+ 	num_candidates matches the number of iterations of the latter
+ 	loop.
+ 
+ 2025-09-15  Matthias Kretz  <m.kretz@gsi.de>
+ 
+ 	* mangle.cc (write_real_cst): Replace 8 spaces with Tab.
+ 
  2025-09-12  Patrick Palka  <ppalka@redhat.com>
  
  	PR c++/121795
diff -Nrcpad gcc-16-20250914/gcc/cp/call.cc gcc-16-20250921/gcc/cp/call.cc
*** gcc-16-20250914/gcc/cp/call.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/cp/call.cc	Sun Sep 21 22:32:37 2025
*************** print_z_candidate (location_t loc, const
*** 4104,4118 ****
      inform (cloc, "%s%#qD (rewritten)", msg, fn);
    else
      inform (cloc, "%s%#qD", msg, fn);
    if (fn != candidate->fn)
      {
        cloc = location_of (candidate->fn);
        inform (cloc, "inherited here");
      }
    /* Give the user some information about why this candidate failed.  */
    if (candidate->reason != NULL)
      {
-       auto_diagnostic_nesting_level sentinel;
        struct rejection_reason *r = candidate->reason;
  
        switch (r->code)
--- 4104,4121 ----
      inform (cloc, "%s%#qD (rewritten)", msg, fn);
    else
      inform (cloc, "%s%#qD", msg, fn);
+ 
+   auto_diagnostic_nesting_level sentinel;
+ 
    if (fn != candidate->fn)
      {
        cloc = location_of (candidate->fn);
        inform (cloc, "inherited here");
      }
+ 
    /* Give the user some information about why this candidate failed.  */
    if (candidate->reason != NULL)
      {
        struct rejection_reason *r = candidate->reason;
  
        switch (r->code)
*************** print_z_candidate (location_t loc, const
*** 4172,4181 ****
  		  "class type is invalid");
  	  break;
  	case rr_constraint_failure:
! 	  {
! 	    auto_diagnostic_nesting_level sentinel;
! 	    diagnose_constraints (cloc, fn, NULL_TREE);
! 	  }
  	  break;
  	case rr_inherited_ctor:
  	  inform (cloc, "an inherited constructor is not a candidate for "
--- 4175,4181 ----
  		  "class type is invalid");
  	  break;
  	case rr_constraint_failure:
! 	  diagnose_constraints (cloc, fn, NULL_TREE);
  	  break;
  	case rr_inherited_ctor:
  	  inform (cloc, "an inherited constructor is not a candidate for "
*************** print_z_candidates (location_t loc, stru
*** 4255,4261 ****
  
    int num_candidates = 0;
    for (auto iter = candidates; iter; iter = iter->next)
!     ++num_candidates;
  
    inform_n (loc,
  	    num_candidates, "there is %i candidate", "there are %i candidates",
--- 4255,4265 ----
  
    int num_candidates = 0;
    for (auto iter = candidates; iter; iter = iter->next)
!     {
!       if (only_viable_p.is_true () && iter->viable != 1)
! 	break;
!       ++num_candidates;
!     }
  
    inform_n (loc,
  	    num_candidates, "there is %i candidate", "there are %i candidates",
diff -Nrcpad gcc-16-20250914/gcc/cp/constexpr.cc gcc-16-20250921/gcc/cp/constexpr.cc
*** gcc-16-20250914/gcc/cp/constexpr.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/cp/constexpr.cc	Sun Sep 21 22:32:37 2025
*************** find_array_ctor_elt (tree ary, tree dind
*** 5293,5299 ****
     matching constructor_elt exists, then add one to CTOR.
  
     As an optimization, if POS_HINT is non-negative then it is used as a guess
!    for the (integer) index of the matching constructor_elt within CTOR.  */
  
  static constructor_elt *
  get_or_insert_ctor_field (tree ctor, tree index, int pos_hint = -1)
--- 5293,5301 ----
     matching constructor_elt exists, then add one to CTOR.
  
     As an optimization, if POS_HINT is non-negative then it is used as a guess
!    for the (integer) index of the matching constructor_elt within CTOR.
! 
!    If POS_HINT is -2, it means do not insert.  */
  
  static constructor_elt *
  get_or_insert_ctor_field (tree ctor, tree index, int pos_hint = -1)
*************** get_or_insert_ctor_field (tree ctor, tre
*** 5303,5311 ****
--- 5305,5315 ----
        && CONSTRUCTOR_ELT (ctor, pos_hint)->index == index)
      return CONSTRUCTOR_ELT (ctor, pos_hint);
  
+   bool insertp = (pos_hint != -2);
    tree type = TREE_TYPE (ctor);
    if (TREE_CODE (type) == VECTOR_TYPE && index == NULL_TREE)
      {
+       gcc_assert (insertp);
        CONSTRUCTOR_APPEND_ELT (CONSTRUCTOR_ELTS (ctor), index, NULL_TREE);
        return &CONSTRUCTOR_ELTS (ctor)->last();
      }
*************** get_or_insert_ctor_field (tree ctor, tre
*** 5323,5335 ****
  	      tree lo = TREE_OPERAND (index, 0);
  	      gcc_assert (array_index_cmp (elts->last().index, lo) < 0);
  	    }
  	  CONSTRUCTOR_APPEND_ELT (elts, index, NULL_TREE);
  	  return &elts->last();
  	}
  
!       HOST_WIDE_INT i = find_array_ctor_elt (ctor, index, /*insert*/true);
!       gcc_assert (i >= 0);
        constructor_elt *cep = CONSTRUCTOR_ELT (ctor, i);
        gcc_assert (cep->index == NULL_TREE
  		  || TREE_CODE (cep->index) != RANGE_EXPR);
        return cep;
--- 5327,5352 ----
  	      tree lo = TREE_OPERAND (index, 0);
  	      gcc_assert (array_index_cmp (elts->last().index, lo) < 0);
  	    }
+ 	  gcc_assert (insertp);
  	  CONSTRUCTOR_APPEND_ELT (elts, index, NULL_TREE);
  	  return &elts->last();
  	}
  
!       HOST_WIDE_INT i = find_array_ctor_elt (ctor, index, insertp);
!       if (i < 0)
! 	{
! 	  gcc_assert (!insertp);
! 	  return nullptr;
! 	}
        constructor_elt *cep = CONSTRUCTOR_ELT (ctor, i);
+       if (!insertp && cep->index && TREE_CODE (cep->index) == RANGE_EXPR)
+ 	{
+ 	  /* Split a range even if we aren't inserting new entries.  */
+ 	  gcc_assert (!insertp);
+ 	  i = find_array_ctor_elt (ctor, index, /*insert*/true);
+ 	  gcc_assert (i >= 0);
+ 	  cep = CONSTRUCTOR_ELT (ctor, i);
+ 	}
        gcc_assert (cep->index == NULL_TREE
  		  || TREE_CODE (cep->index) != RANGE_EXPR);
        return cep;
*************** get_or_insert_ctor_field (tree ctor, tre
*** 5384,5389 ****
--- 5401,5409 ----
  	 entry at the end.  */
  
      insert:
+       if (!insertp)
+ 	return nullptr;
+ 
        {
  	constructor_elt ce = { index, NULL_TREE };
  
*************** cxx_eval_component_reference (const cons
*** 5745,5750 ****
--- 5765,5772 ----
        if (pmf ? DECL_NAME (field) == DECL_NAME (part)
  	  : field == part)
  	{
+ 	  if (value == void_node)
+ 	    goto uninit;
  	  if (value)
  	    {
  	      STRIP_ANY_LOCATION_WRAPPER (value);
*************** cxx_eval_component_reference (const cons
*** 5766,5772 ****
  	      if (cep->value == NULL_TREE)
  		error ("accessing uninitialized member %qD", part);
  	      else
! 		error ("accessing %qD member instead of initialized %qD member "
  		       "in constant expression", part, cep->index);
  	    }
  	  *non_constant_p = true;
--- 5788,5794 ----
  	      if (cep->value == NULL_TREE)
  		error ("accessing uninitialized member %qD", part);
  	      else
! 		error ("accessing %qD member instead of active %qD member "
  		       "in constant expression", part, cep->index);
  	    }
  	  *non_constant_p = true;
*************** cxx_eval_component_reference (const cons
*** 5796,5801 ****
--- 5818,5824 ----
  
    if (CONSTRUCTOR_NO_CLEARING (whole))
      {
+     uninit:
        /* 'whole' is part of the aggregate initializer we're currently
  	 building; if there's no initializer for this member yet, that's an
  	 error.  */
*************** cxx_eval_store_expression (const constex
*** 7510,7515 ****
--- 7533,7540 ----
    /* If we're modifying a const object, save it.  */
    tree const_object_being_modified = NULL_TREE;
    bool mutable_p = false;
+   /* If we see a union, we can't ignore clobbers.  */
+   int seen_union = 0;
    for (tree probe = target; object == NULL_TREE; )
      {
        switch (TREE_CODE (probe))
*************** cxx_eval_store_expression (const constex
*** 7552,7557 ****
--- 7577,7584 ----
  	    vec_safe_push (refs, elt);
  	    vec_safe_push (refs, TREE_TYPE (probe));
  	    probe = ob;
+ 	    if (TREE_CODE (TREE_TYPE (ob)) == UNION_TYPE)
+ 	      ++seen_union;
  	  }
  	  break;
  
*************** cxx_eval_store_expression (const constex
*** 7652,7666 ****
      }
  
    /* Handle explicit end-of-lifetime.  */
!   if (TREE_CLOBBER_P (init)
!       && CLOBBER_KIND (init) >= CLOBBER_OBJECT_END)
      {
!       if (refs->is_empty ())
  	{
  	  ctx->global->destroy_value (object);
  	  return void_node;
  	}
  
        /* Ending the lifetime of a const object is OK.  */
        const_object_being_modified = NULL_TREE;
      }
--- 7679,7697 ----
      }
  
    /* Handle explicit end-of-lifetime.  */
!   if (TREE_CLOBBER_P (init))
      {
!       if (CLOBBER_KIND (init) >= CLOBBER_OBJECT_END
! 	  && refs->is_empty ())
  	{
  	  ctx->global->destroy_value (object);
  	  return void_node;
  	}
  
+       if (!seen_union && !*valp
+ 	  && CLOBBER_KIND (init) < CLOBBER_OBJECT_END)
+ 	return void_node;
+ 
        /* Ending the lifetime of a const object is OK.  */
        const_object_being_modified = NULL_TREE;
      }
*************** cxx_eval_store_expression (const constex
*** 7853,7864 ****
        ctors.safe_push (valp);
        vec_safe_push (indexes, index);
  
        constructor_elt *cep
! 	= get_or_insert_ctor_field (*valp, index);
        index_pos_hints.safe_push (cep - CONSTRUCTOR_ELTS (*valp)->begin());
  
        if (code == UNION_TYPE)
! 	activated_union_member_p = true;
  
        valp = &cep->value;
        type = reftype;
--- 7884,7905 ----
        ctors.safe_push (valp);
        vec_safe_push (indexes, index);
  
+       /* Avoid adding an _elt for a clobber when the whole CONSTRUCTOR is
+ 	 uninitialized.  */
+       int pos = (!seen_union && TREE_CLOBBER_P (init)
+ 		 && CONSTRUCTOR_NO_CLEARING (*valp)
+ 		 && CLOBBER_KIND (init) < CLOBBER_OBJECT_END) ? -2 : -1;
        constructor_elt *cep
! 	= get_or_insert_ctor_field (*valp, index, pos);
!       if (cep == nullptr)
! 	return void_node;
        index_pos_hints.safe_push (cep - CONSTRUCTOR_ELTS (*valp)->begin());
  
        if (code == UNION_TYPE)
! 	{
! 	  activated_union_member_p = true;
! 	  --seen_union;
! 	}
  
        valp = &cep->value;
        type = reftype;
*************** cxx_eval_statement_list (const constexpr
*** 8279,8285 ****
  
        value_cat lval = vc_discard;
        /* The result of a statement-expression is not wrapped in EXPR_STMT.  */
!       if (tsi_one_before_end_p (i) && TREE_CODE (stmt) != EXPR_STMT)
  	lval = vc_prvalue;
  
        r = cxx_eval_constant_expression (ctx, stmt, lval,
--- 8320,8327 ----
  
        value_cat lval = vc_discard;
        /* The result of a statement-expression is not wrapped in EXPR_STMT.  */
!       if (tsi_one_before_end_p (i)
! 	  && !VOID_TYPE_P (TREE_TYPE (stmt)))
  	lval = vc_prvalue;
  
        r = cxx_eval_constant_expression (ctx, stmt, lval,
*************** cxx_eval_loop_expr (const constexpr_ctx
*** 8383,8389 ****
  	    *jump_target = NULL_TREE;
  
  	  if (expr)
! 	    cxx_eval_constant_expression (ctx, expr, vc_prvalue,
  					  non_constant_p, overflow_p,
  					  jump_target);
  	  cleanup_cond ();
--- 8425,8431 ----
  	    *jump_target = NULL_TREE;
  
  	  if (expr)
! 	    cxx_eval_constant_expression (ctx, expr, vc_discard,
  					  non_constant_p, overflow_p,
  					  jump_target);
  	  cleanup_cond ();
*************** cxx_eval_constant_expression (const cons
*** 9664,9669 ****
--- 9706,9719 ----
  	  if (TREE_CONSTANT (t))
  	    return t;
  	}
+       if (TREE_CLOBBER_P (t))
+ 	{
+ 	  /* Assignment from a clobber is handled in cxx_eval_store_expression;
+ 	     a clobber by itself isn't a constant-expression.  */
+ 	  gcc_assert (ctx->quiet);
+ 	  *non_constant_p = true;
+ 	  break;
+ 	}
        r = cxx_eval_bare_aggregate (ctx, t, lval,
  				   non_constant_p, overflow_p, jump_target);
        break;
*************** cxx_eval_constant_expression (const cons
*** 10226,10231 ****
--- 10276,10294 ----
    if (r == error_mark_node)
      *non_constant_p = true;
  
+   if (r == void_node && lval != vc_discard && !*jump_target
+       && !VOID_TYPE_P (TREE_TYPE (t)))
+     {
+       /* For diagnostic quality we should have handled this sooner, where we
+ 	 can be more specific about the out-of-lifetime object.  But here we
+ 	 can still be correct.  */
+       gcc_checking_assert (false);
+       if (!ctx->quiet)
+ 	error_at (EXPR_LOCATION (t),
+ 		  "%qE accesses an object outside its lifetime", t);
+       *non_constant_p = true;
+     }
+ 
    if (*non_constant_p)
      return t;
    else
*************** potential_constant_expression_1 (tree t,
*** 11632,11637 ****
--- 11695,11701 ----
  	  && (now || !var_in_maybe_constexpr_fn (t))
  	  && !type_dependent_expression_p (t)
  	  && !decl_maybe_constant_var_p (t)
+ 	  && !is_local_temp (t)
  	  && (strict
  	      || !CP_TYPE_CONST_NON_VOLATILE_P (TREE_TYPE (t))
  	      || (DECL_INITIAL (t)
diff -Nrcpad gcc-16-20250914/gcc/cp/init.cc gcc-16-20250921/gcc/cp/init.cc
*** gcc-16-20250914/gcc/cp/init.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/cp/init.cc	Sun Sep 21 22:32:37 2025
*************** build_new_1 (vec<tree, va_gc> **placemen
*** 3563,3571 ****
       in start_preparsed_function.  This is most important for activating an
       array in a union (c++/121068), but should also help the optimizers.  */
    const bool do_clobber
!     = (std_placement && !*init && flag_lifetime_dse > 1
!        && (!CLASS_TYPE_P (elt_type)
! 	   || type_has_non_user_provided_default_constructor (elt_type)));
  
    /* In the simple case, we can stop now.  */
    pointer_type = build_pointer_type (type);
--- 3563,3572 ----
       in start_preparsed_function.  This is most important for activating an
       array in a union (c++/121068), but should also help the optimizers.  */
    const bool do_clobber
!     = (std_placement && flag_lifetime_dse > 1
!        && !processing_template_decl
!        && !is_empty_type (elt_type)
!        && (!*init || CLASS_TYPE_P (elt_type)));
  
    /* In the simple case, we can stop now.  */
    pointer_type = build_pointer_type (type);
*************** build_new_1 (vec<tree, va_gc> **placemen
*** 3930,3935 ****
--- 3931,3941 ----
  					   complain);
  	  rval = build_conditional_expr (input_location, ifexp, rval,
  					 alloc_node, complain);
+ 	  /* If there's no offset between data_addr and alloc_node, append it
+ 	     to help -Wmismatched-new-delete at -O0.  */
+ 	  if (!cookie_size)
+ 	    rval = build2 (COMPOUND_EXPR, TREE_TYPE (alloc_node),
+ 			   rval, alloc_node);
  	}
  
        /* Perform the allocation before anything else, so that ALLOC_NODE
*************** build_vec_init (tree base, tree maxindex
*** 4918,4924 ****
  	}
  
        /* Any elements without explicit initializers get T{}.  */
!       empty_list = true;
      }
    else if (init && TREE_CODE (init) == STRING_CST)
      {
--- 4924,4931 ----
  	}
  
        /* Any elements without explicit initializers get T{}.  */
!       if (!TREE_CLOBBER_P (init))
! 	empty_list = true;
      }
    else if (init && TREE_CODE (init) == STRING_CST)
      {
*************** build_vec_init (tree base, tree maxindex
*** 5057,5063 ****
  	}
        else if (TREE_CODE (type) == ARRAY_TYPE)
  	{
! 	  if (init && !BRACE_ENCLOSED_INITIALIZER_P (init))
  	    {
  	      if ((complain & tf_error))
  		error_at (loc, "array must be initialized "
--- 5064,5071 ----
  	}
        else if (TREE_CODE (type) == ARRAY_TYPE)
  	{
! 	  if (init && !BRACE_ENCLOSED_INITIALIZER_P (init)
! 	      && !TREE_CLOBBER_P (init))
  	    {
  	      if ((complain & tf_error))
  		error_at (loc, "array must be initialized "
diff -Nrcpad gcc-16-20250914/gcc/cp/lambda.cc gcc-16-20250921/gcc/cp/lambda.cc
*** gcc-16-20250914/gcc/cp/lambda.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/cp/lambda.cc	Sun Sep 21 22:32:37 2025
*************** compare_lambda_sig (tree fn_a, tree fn_b
*** 1742,1749 ****
        || fn_b == error_mark_node)
      return false;
  
!   for (tree args_a = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (fn_a))),
! 	 args_b = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (fn_b)));
         args_a || args_b;
         args_a = TREE_CHAIN (args_a), args_b = TREE_CHAIN (args_b))
      {
--- 1742,1749 ----
        || fn_b == error_mark_node)
      return false;
  
!   for (tree args_a = FUNCTION_FIRST_USER_PARMTYPE (fn_a),
! 	 args_b = FUNCTION_FIRST_USER_PARMTYPE (fn_b);
         args_a || args_b;
         args_a = TREE_CHAIN (args_a), args_b = TREE_CHAIN (args_b))
      {
diff -Nrcpad gcc-16-20250914/gcc/cp/mangle.cc gcc-16-20250921/gcc/cp/mangle.cc
*** gcc-16-20250914/gcc/cp/mangle.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/cp/mangle.cc	Sun Sep 21 22:32:37 2025
*************** write_real_cst (const tree value)
*** 2185,2191 ****
    if (words == 0)
      {
        /* _Float16 and std::bfloat16_t are the only supported types smaller than
!          32 bits.  */
        gcc_assert (bits == 16);
        sprintf (buffer, "%04lx", (unsigned long) target_real[0]);
        write_chars (buffer, 4);
--- 2185,2191 ----
    if (words == 0)
      {
        /* _Float16 and std::bfloat16_t are the only supported types smaller than
! 	 32 bits.  */
        gcc_assert (bits == 16);
        sprintf (buffer, "%04lx", (unsigned long) target_real[0]);
        write_chars (buffer, 4);
diff -Nrcpad gcc-16-20250914/gcc/cp/pt.cc gcc-16-20250921/gcc/cp/pt.cc
*** gcc-16-20250914/gcc/cp/pt.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/cp/pt.cc	Sun Sep 21 22:32:37 2025
*************** any_template_parm_r (tree t, void *data)
*** 11125,11131 ****
        break;
  
      case TEMPLATE_PARM_INDEX:
!       WALK_SUBTREE (TREE_TYPE (t));
        break;
  
      case TEMPLATE_DECL:
--- 11125,11134 ----
        break;
  
      case TEMPLATE_PARM_INDEX:
!       /* No need to consider template parameters within the type of an NTTP:
! 	 substitution into an NTTP is done directly with the corresponding
! 	 template argument, and its type only comes into play earlier during
! 	 coercion.  */
        break;
  
      case TEMPLATE_DECL:
diff -Nrcpad gcc-16-20250914/gcc/ctfc.cc gcc-16-20250921/gcc/ctfc.cc
*** gcc-16-20250914/gcc/ctfc.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ctfc.cc	Sun Sep 21 22:32:37 2025
*************** ctf_add_function (ctf_container_ref ctfc
*** 798,804 ****
  
  ctf_dtdef_ref
  ctf_add_sou (ctf_container_ref ctfc, uint32_t flag, const char * name,
! 	     uint32_t kind, size_t size, dw_die_ref die)
  {
    ctf_dtdef_ref dtd;
  
--- 798,804 ----
  
  ctf_dtdef_ref
  ctf_add_sou (ctf_container_ref ctfc, uint32_t flag, const char * name,
! 	     uint32_t kind, unsigned HOST_WIDE_INT size, dw_die_ref die)
  {
    ctf_dtdef_ref dtd;
  
diff -Nrcpad gcc-16-20250914/gcc/ctfc.h gcc-16-20250921/gcc/ctfc.h
*** gcc-16-20250914/gcc/ctfc.h	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/ctfc.h	Sun Sep 21 22:32:37 2025
*************** extern ctf_dtdef_ref ctf_add_function (c
*** 439,445 ****
  				       const char *, const ctf_funcinfo_t *,
  				       dw_die_ref, bool, int);
  extern ctf_dtdef_ref ctf_add_sou (ctf_container_ref, uint32_t, const char *,
! 				  uint32_t, size_t, dw_die_ref);
  
  extern int ctf_add_enumerator (ctf_container_ref, ctf_dtdef_ref, const char *,
  			       HOST_WIDE_INT, dw_die_ref);
--- 439,445 ----
  				       const char *, const ctf_funcinfo_t *,
  				       dw_die_ref, bool, int);
  extern ctf_dtdef_ref ctf_add_sou (ctf_container_ref, uint32_t, const char *,
! 				  uint32_t, unsigned HOST_WIDE_INT, dw_die_ref);
  
  extern int ctf_add_enumerator (ctf_container_ref, ctf_dtdef_ref, const char *,
  			       HOST_WIDE_INT, dw_die_ref);
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/buffering.cc gcc-16-20250921/gcc/diagnostics/buffering.cc
*** gcc-16-20250914/gcc/diagnostics/buffering.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/buffering.cc	Sun Sep 21 22:32:37 2025
*************** along with GCC; see the file COPYING3.
*** 21,27 ****
  #include "config.h"
  #include "system.h"
  #include "coretypes.h"
- #include "diagnostic.h"
  #include "diagnostics/buffering.h"
  #include "diagnostics/sink.h"
  #include "diagnostics/dumping.h"
--- 21,26 ----
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/buffering.h gcc-16-20250921/gcc/diagnostics/buffering.h
*** gcc-16-20250914/gcc/diagnostics/buffering.h	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/buffering.h	Sun Sep 21 22:32:37 2025
*************** along with GCC; see the file COPYING3.
*** 21,27 ****
  #ifndef GCC_DIAGNOSTICS_BUFFERING_H
  #define GCC_DIAGNOSTICS_BUFFERING_H
  
! #include "diagnostic.h"
  
  namespace diagnostics {
  
--- 21,27 ----
  #ifndef GCC_DIAGNOSTICS_BUFFERING_H
  #define GCC_DIAGNOSTICS_BUFFERING_H
  
! #include "diagnostics/counters.h"
  
  namespace diagnostics {
  
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/client-data-hooks.h gcc-16-20250921/gcc/diagnostics/client-data-hooks.h
*** gcc-16-20250914/gcc/diagnostics/client-data-hooks.h	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/client-data-hooks.h	Sun Sep 21 22:32:37 2025
*************** class client_data_hooks
*** 36,41 ****
--- 36,44 ----
   public:
    virtual ~client_data_hooks () {}
  
+   void dump (FILE *out, int indent) const;
+   void DEBUG_FUNCTION dump () const { dump (stderr, 0); }
+ 
    /* Get version info for this client, or NULL.  */
    virtual const client_version_info *get_any_version_info () const = 0;
  
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/context.cc gcc-16-20250921/gcc/diagnostics/context.cc
*** gcc-16-20250914/gcc/diagnostics/context.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/context.cc	Sun Sep 21 22:32:37 2025
*************** context::dump (FILE *outfile, int indent
*** 455,460 ****
--- 455,465 ----
      m_file_cache->dump (outfile, indent + 4);
    else
      dumping::emit_none (outfile, indent + 4);
+   dumping::emit_heading (outfile, indent + 2, "client data hooks");
+   if (m_client_data_hooks)
+     m_client_data_hooks->dump (outfile, indent + 4);
+   else
+     dumping::emit_none (outfile, indent + 4);
  }
  
  /* Return true if sufficiently severe diagnostics have been seen that
*************** context::initialize_fixits_change_set ()
*** 654,659 ****
--- 659,676 ----
    m_fixits_change_set = new changes::change_set (*m_file_cache);
  }
  
+ // class client_data_hooks
+ 
+ void
+ client_data_hooks::dump (FILE *outfile, int indent) const
+ {
+   dumping::emit_heading (outfile, indent, "logical location manager");
+   if (auto mgr = get_logical_location_manager ())
+     mgr->dump (outfile, indent + 2);
+   else
+     dumping::emit_none (outfile, indent + 2);
+ }
+ 
  } // namespace diagnostics
  
  /* Initialize DIAGNOSTIC, where the message MSG has already been
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/context.h gcc-16-20250921/gcc/diagnostics/context.h
*** gcc-16-20250914/gcc/diagnostics/context.h	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/context.h	Sun Sep 21 22:32:37 2025
*************** namespace diagnostics {
*** 47,52 ****
--- 47,53 ----
    class diagram;
    class sink;
      class text_sink;
+   class metadata;
  
    class source_effect_info;
  
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/html-sink.cc gcc-16-20250921/gcc/diagnostics/html-sink.cc
*** gcc-16-20250914/gcc/diagnostics/html-sink.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/html-sink.cc	Sun Sep 21 22:32:37 2025
*************** along with GCC; see the file COPYING3.
*** 24,30 ****
  #define INCLUDE_VECTOR
  #include "system.h"
  #include "coretypes.h"
- #include "diagnostic.h"
  #include "diagnostics/metadata.h"
  #include "diagnostics/sink.h"
  #include "diagnostics/html-sink.h"
--- 24,29 ----
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/lazy-paths.cc gcc-16-20250921/gcc/diagnostics/lazy-paths.cc
*** gcc-16-20250914/gcc/diagnostics/lazy-paths.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/lazy-paths.cc	Sun Sep 21 22:32:37 2025
*************** along with GCC; see the file COPYING3.
*** 23,29 ****
  #define INCLUDE_VECTOR
  #include "system.h"
  #include "coretypes.h"
- #include "diagnostic.h"
  #include "diagnostics/lazy-paths.h"
  #include "selftest.h"
  #include "diagnostics/selftest-context.h"
--- 23,28 ----
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/logical-locations.h gcc-16-20250921/gcc/diagnostics/logical-locations.h
*** gcc-16-20250914/gcc/diagnostics/logical-locations.h	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/logical-locations.h	Sun Sep 21 22:32:37 2025
*************** class manager
*** 148,153 ****
--- 148,156 ----
  public:
    virtual ~manager () {}
  
+   virtual void dump (FILE *out, int indent) const = 0;
+   void DEBUG_FUNCTION dump () const { dump (stderr, 0); }
+ 
    /* vfuncs for interpreting keys.  */
  
    /* Get a string (or NULL) for K suitable for use by the SARIF logicalLocation
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/macro-unwinding.cc gcc-16-20250921/gcc/diagnostics/macro-unwinding.cc
*** gcc-16-20250914/gcc/diagnostics/macro-unwinding.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/macro-unwinding.cc	Sun Sep 21 22:32:37 2025
*************** along with GCC; see the file COPYING3.
*** 21,27 ****
  #include "system.h"
  #include "coretypes.h"
  #include "tree.h"
- #include "diagnostic.h"
  #include "diagnostics/macro-unwinding.h"
  #include "diagnostics/text-sink.h"
  #include "intl.h"
--- 21,26 ----
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/macro-unwinding.h gcc-16-20250921/gcc/diagnostics/macro-unwinding.h
*** gcc-16-20250914/gcc/diagnostics/macro-unwinding.h	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/macro-unwinding.h	Sun Sep 21 22:32:37 2025
*************** along with GCC; see the file COPYING3.
*** 22,27 ****
--- 22,29 ----
  
  namespace diagnostics {
  
+ struct diagnostic_info;
+ 
  extern void virt_loc_aware_text_finalizer (text_sink &,
  					   const diagnostic_info *);
  
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/option-classifier.h gcc-16-20250921/gcc/diagnostics/option-classifier.h
*** gcc-16-20250914/gcc/diagnostics/option-classifier.h	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/option-classifier.h	Sun Sep 21 22:32:37 2025
*************** along with GCC; see the file COPYING3.
*** 20,29 ****
--- 20,33 ----
  #ifndef GCC_DIAGNOSTICS_OPTION_CLASSIFIER_H
  #define GCC_DIAGNOSTICS_OPTION_CLASSIFIER_H
  
+ #include "diagnostics/option-id.h"
+ #include "diagnostics/kinds.h"
+ 
  namespace diagnostics {
  
  /*  Forward declarations.  */
  class context;
+ struct diagnostic_info;
  
  /* A stack of sets of classifications: each entry in the stack is
     a mapping from option index to diagnostic severity that can be changed
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/output-spec.cc gcc-16-20250921/gcc/diagnostics/output-spec.cc
*** gcc-16-20250914/gcc/diagnostics/output-spec.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/output-spec.cc	Sun Sep 21 22:32:37 2025
*************** along with GCC; see the file COPYING3.
*** 31,37 ****
  #include "coretypes.h"
  #include "version.h"
  #include "intl.h"
- #include "diagnostic.h"
  #include "diagnostics/color.h"
  #include "diagnostics/sink.h"
  #include "diagnostics/html-sink.h"
--- 31,36 ----
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/paths-output.cc gcc-16-20250921/gcc/diagnostics/paths-output.cc
*** gcc-16-20250914/gcc/diagnostics/paths-output.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/paths-output.cc	Sun Sep 21 22:32:37 2025
*************** along with GCC; see the file COPYING3.
*** 25,31 ****
  #define INCLUDE_VECTOR
  #include "system.h"
  #include "coretypes.h"
- #include "diagnostic.h"
  #include "diagnostics/macro-unwinding.h"
  #include "intl.h"
  #include "diagnostics/paths.h"
--- 25,30 ----
*************** struct event_range
*** 456,462 ****
  	  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)
--- 455,461 ----
  	  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)
*************** struct event_range
*** 515,521 ****
        {
  	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);
  
--- 514,521 ----
        {
  	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);
  
*************** struct event_range
*** 557,563 ****
         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 event *prev_event = nullptr;
--- 557,563 ----
         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 event *prev_event = nullptr;
*************** struct event_range
*** 608,614 ****
        {
  	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))
  	  {
  	    diagnostics::location_print_policy loc_policy (text_output);
--- 608,614 ----
        {
  	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))
  	  {
  	    diagnostics::location_print_policy loc_policy (text_output);
*************** struct event_range
*** 666,672 ****
        {
  	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))
  	  {
  	    diagnostics::location_print_policy loc_policy (dc);
--- 666,672 ----
        {
  	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))
  	  {
  	    diagnostics::location_print_policy loc_policy (dc);
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/paths.cc gcc-16-20250921/gcc/diagnostics/paths.cc
*** gcc-16-20250914/gcc/diagnostics/paths.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/paths.cc	Sun Sep 21 22:32:37 2025
*************** along with GCC; see the file COPYING3.
*** 25,31 ****
  #define INCLUDE_VECTOR
  #include "system.h"
  #include "coretypes.h"
- #include "diagnostic.h"
  #include "diagnostics/paths.h"
  #include "diagnostics/state-graphs.h"
  
--- 25,30 ----
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/sarif-sink.cc gcc-16-20250921/gcc/diagnostics/sarif-sink.cc
*** gcc-16-20250914/gcc/diagnostics/sarif-sink.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/sarif-sink.cc	Sun Sep 21 22:32:37 2025
*************** along with GCC; see the file COPYING3.
*** 26,32 ****
  #define INCLUDE_VECTOR
  #include "system.h"
  #include "coretypes.h"
- #include "diagnostic.h"
  #include "diagnostics/metadata.h"
  #include "diagnostics/digraphs.h"
  #include "diagnostics/state-graphs.h"
--- 26,31 ----
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/selftest-context.cc gcc-16-20250921/gcc/diagnostics/selftest-context.cc
*** gcc-16-20250914/gcc/diagnostics/selftest-context.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/selftest-context.cc	Sun Sep 21 22:32:37 2025
*************** along with GCC; see the file COPYING3.
*** 20,26 ****
  #include "config.h"
  #include "system.h"
  #include "coretypes.h"
- #include "diagnostic.h"
  #include "diagnostics/sink.h"
  #include "selftest.h"
  #include "diagnostics/selftest-context.h"
--- 20,25 ----
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/selftest-logical-locations.cc gcc-16-20250921/gcc/diagnostics/selftest-logical-locations.cc
*** gcc-16-20250914/gcc/diagnostics/selftest-logical-locations.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/selftest-logical-locations.cc	Sun Sep 21 22:32:37 2025
*************** along with GCC; see the file COPYING3.
*** 23,28 ****
--- 23,29 ----
  #include "coretypes.h"
  #include "selftest.h"
  #include "diagnostics/selftest-logical-locations.h"
+ #include "diagnostics/dumping.h"
  
  #if CHECKING_P
  
*************** test_manager::~test_manager ()
*** 38,43 ****
--- 39,50 ----
      delete iter.second;
  }
  
+ void
+ test_manager::dump (FILE *outfile, int indent) const
+ {
+   dumping::emit_heading (outfile, indent, "test_manager");
+ }
+ 
  const char *
  test_manager::get_short_name (key k) const
  {
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/selftest-logical-locations.h gcc-16-20250921/gcc/diagnostics/selftest-logical-locations.h
*** gcc-16-20250914/gcc/diagnostics/selftest-logical-locations.h	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/selftest-logical-locations.h	Sun Sep 21 22:32:37 2025
*************** class test_manager : public manager
*** 39,44 ****
--- 39,46 ----
  public:
    ~test_manager ();
  
+   void dump (FILE *out, int indent) const final override;
+ 
    const char *get_short_name (key) const final override;
    const char *get_name_with_scope (key) const final override;
    const char *get_internal_name (key) const final override;
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/selftest-paths.cc gcc-16-20250921/gcc/diagnostics/selftest-paths.cc
*** gcc-16-20250914/gcc/diagnostics/selftest-paths.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/selftest-paths.cc	Sun Sep 21 22:32:37 2025
*************** along with GCC; see the file COPYING3.
*** 24,30 ****
  #include "system.h"
  #include "coretypes.h"
  #include "version.h"
- #include "diagnostic.h"
  #include "diagnostics/selftest-paths.h"
  
  #if CHECKING_P
--- 24,29 ----
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/source-printing-options.h gcc-16-20250921/gcc/diagnostics/source-printing-options.h
*** gcc-16-20250914/gcc/diagnostics/source-printing-options.h	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/source-printing-options.h	Sun Sep 21 22:32:37 2025
*************** along with GCC; see the file COPYING3.
*** 20,25 ****
--- 20,27 ----
  #ifndef GCC_DIAGNOSTICS_SOURCE_PRINTING_OPTIONS_H
  #define GCC_DIAGNOSTICS_SOURCE_PRINTING_OPTIONS_H
  
+ #include "rich-location.h"
+ 
  namespace diagnostics {
  
  /* A bundle of options relating to printing the user's source code
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/source-printing.cc gcc-16-20250921/gcc/diagnostics/source-printing.cc
*** gcc-16-20250914/gcc/diagnostics/source-printing.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/source-printing.cc	Sun Sep 21 22:32:37 2025
*************** class exploc_with_display_col : public e
*** 213,219 ****
        {
  	/* m_display_col is now the final column of the byte.
  	   If escaping has happened, we may want the first column instead.  */
! 	if (aspect != LOCATION_ASPECT_FINISH)
  	  {
  	    expanded_location prev_exploc (exploc);
  	    prev_exploc.column--;
--- 213,219 ----
        {
  	/* m_display_col is now the final column of the byte.
  	   If escaping has happened, we may want the first column instead.  */
! 	if (aspect != location_aspect::finish)
  	  {
  	    expanded_location prev_exploc (exploc);
  	    prev_exploc.column--;
*************** make_range (diagnostics::file_cache &fc,
*** 1260,1273 ****
      = {"", end_line, end_col, nullptr, false};
    return layout_range (exploc_with_display_col (fc,
  						start_exploc, def_policy (),
! 						LOCATION_ASPECT_START),
  		       exploc_with_display_col (fc,
  						finish_exploc, def_policy (),
! 						LOCATION_ASPECT_FINISH),
  		       SHOW_RANGE_WITHOUT_CARET,
  		       exploc_with_display_col (fc,
  						start_exploc, def_policy (),
! 						LOCATION_ASPECT_CARET),
  		       0, nullptr);
  }
  
--- 1260,1273 ----
      = {"", end_line, end_col, nullptr, false};
    return layout_range (exploc_with_display_col (fc,
  						start_exploc, def_policy (),
! 						location_aspect::start),
  		       exploc_with_display_col (fc,
  						finish_exploc, def_policy (),
! 						location_aspect::finish),
  		       SHOW_RANGE_WITHOUT_CARET,
  		       exploc_with_display_col (fc,
  						start_exploc, def_policy (),
! 						location_aspect::caret),
  		       0, nullptr);
  }
  
*************** layout::layout (const diagnostics::sourc
*** 1758,1764 ****
    m_primary_loc (richloc.get_range (0)->m_loc),
    m_exploc (m_file_cache,
  	    richloc.get_expanded_location (0), m_char_policy,
! 	    LOCATION_ASPECT_CARET),
    m_layout_ranges (richloc.get_num_locations ()),
    m_fixit_hints (richloc.get_num_fixit_hints ()),
    m_line_spans (1 + richloc.get_num_locations ()),
--- 1758,1764 ----
    m_primary_loc (richloc.get_range (0)->m_loc),
    m_exploc (m_file_cache,
  	    richloc.get_expanded_location (0), m_char_policy,
! 	    location_aspect::caret),
    m_layout_ranges (richloc.get_num_locations ()),
    m_fixit_hints (richloc.get_num_fixit_hints ()),
    m_line_spans (1 + richloc.get_num_locations ()),
*************** layout::maybe_add_location_range (const
*** 1819,1831 ****
    /* Expand the various locations.  */
    expanded_location start
      = linemap_client_expand_location_to_spelling_point
!     (m_line_table, src_range.m_start, LOCATION_ASPECT_START);
    expanded_location finish
      = linemap_client_expand_location_to_spelling_point
!     (m_line_table, src_range.m_finish, LOCATION_ASPECT_FINISH);
    expanded_location caret
      = linemap_client_expand_location_to_spelling_point
!     (m_line_table, loc_range->m_loc, LOCATION_ASPECT_CARET);
  
    /* If any part of the range isn't in the same file as the primary
       location of this diagnostic, ignore the range.  */
--- 1819,1831 ----
    /* Expand the various locations.  */
    expanded_location start
      = linemap_client_expand_location_to_spelling_point
!     (m_line_table, src_range.m_start, location_aspect::start);
    expanded_location finish
      = linemap_client_expand_location_to_spelling_point
!     (m_line_table, src_range.m_finish, location_aspect::finish);
    expanded_location caret
      = linemap_client_expand_location_to_spelling_point
!     (m_line_table, loc_range->m_loc, location_aspect::caret);
  
    /* If any part of the range isn't in the same file as the primary
       location of this diagnostic, ignore the range.  */
*************** layout::maybe_add_location_range (const
*** 1858,1871 ****
       but it may require further sanitization.  */
    layout_range ri (exploc_with_display_col (m_file_cache,
  					    start, m_char_policy,
! 					    LOCATION_ASPECT_START),
  		   exploc_with_display_col (m_file_cache,
  					    finish, m_char_policy,
! 					    LOCATION_ASPECT_FINISH),
  		   range_display_kind,
  		   exploc_with_display_col (m_file_cache,
  					    caret, m_char_policy,
! 					    LOCATION_ASPECT_CARET),
  		   original_idx, loc_range->m_label);
  
    /* If we have a range that finishes before it starts (perhaps
--- 1858,1871 ----
       but it may require further sanitization.  */
    layout_range ri (exploc_with_display_col (m_file_cache,
  					    start, m_char_policy,
! 					    location_aspect::start),
  		   exploc_with_display_col (m_file_cache,
  					    finish, m_char_policy,
! 					    location_aspect::finish),
  		   range_display_kind,
  		   exploc_with_display_col (m_file_cache,
  					    caret, m_char_policy,
! 					    location_aspect::caret),
  		   original_idx, loc_range->m_label);
  
    /* If we have a range that finishes before it starts (perhaps
diff -Nrcpad gcc-16-20250914/gcc/diagnostics/text-sink.cc gcc-16-20250921/gcc/diagnostics/text-sink.cc
*** gcc-16-20250914/gcc/diagnostics/text-sink.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/diagnostics/text-sink.cc	Sun Sep 21 22:32:37 2025
*************** along with GCC; see the file COPYING3.
*** 24,30 ****
  #include "coretypes.h"
  #include "version.h"
  #include "intl.h"
- #include "diagnostic.h"
  #include "diagnostics/color.h"
  #include "diagnostics/url.h"
  #include "diagnostics/metadata.h"
--- 24,29 ----
diff -Nrcpad gcc-16-20250914/gcc/doc/avr-mmcu.texi gcc-16-20250921/gcc/doc/avr-mmcu.texi
*** gcc-16-20250914/gcc/doc/avr-mmcu.texi	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/doc/avr-mmcu.texi	Sun Sep 21 22:32:37 2025
***************
*** 54,60 ****
  
  @item @anchor{avrxmega3}avrxmega3
  ``XMEGA'' devices with up to 64@tie{}KiB of combined program memory and RAM, and with program memory visible in the RAM address space.
! @*@var{mcu}@tie{}= @code{attiny202}, @code{attiny204}, @code{attiny212}, @code{attiny214}, @code{attiny402}, @code{attiny404}, @code{attiny406}, @code{attiny412}, @code{attiny414}, @code{attiny416}, @code{attiny416auto}, @code{attiny417}, @code{attiny424}, @code{attiny426}, @code{attiny427}, @code{attiny804}, @code{attiny806}, @code{attiny807}, @code{attiny814}, @code{attiny816}, @code{attiny817}, @code{attiny824}, @code{attiny826}, @code{attiny827}, @code{attiny1604}, @code{attiny1606}, @code{attiny1607}, @code{attiny1614}, @code{attiny1616}, @code{attiny1617}, @code{attiny1624}, @code{attiny1626}, @code{attiny1627}, @code{attiny3214}, @code{attiny3216}, @code{attiny3217}, @code{attiny3224}, @code{attiny3226}, @code{attiny3227}, @code{atmega808}, @code{atmega809}, @code{atmega1608}, @code{atmega1609}, @code{atmega3208}, @code{atmega3209}, @code{atmega4808}, @code{atmega4809}, @code{avr16dd14}, @code{avr16dd20}, @code{avr16dd28}, @code{avr16dd32}, @code{avr16du14}, @code{avr16du20}, @code{avr16du28}, @code{avr16du32}, @code{avr16ea28}, @code{avr16ea32}, @code{avr16ea48}, @code{avr16eb14}, @code{avr16eb20}, @code{avr16eb28}, @code{avr16eb32}, @code{avr32da28}, @code{avr32da28s}, @code{avr32da32}, @code{avr32da32s}, @code{avr32da48}, @code{avr32da48s}, @code{avr32db28}, @code{avr32db32}, @code{avr32db48}, @code{avr32dd14}, @code{avr32dd20}, @code{avr32dd28}, @code{avr32dd32}, @code{avr32du14}, @code{avr32du20}, @code{avr32du28}, @code{avr32du32}, @code{avr32ea28}, @code{avr32ea32}, @code{avr32ea48}, @code{avr32sd20}, @code{avr32sd28}, @code{avr32sd32}.
  
  @item @anchor{avrxmega4}avrxmega4
  ``XMEGA'' devices with more than 64@tie{}KiB and up to 128@tie{}KiB of program memory.
--- 54,60 ----
  
  @item @anchor{avrxmega3}avrxmega3
  ``XMEGA'' devices with up to 64@tie{}KiB of combined program memory and RAM, and with program memory visible in the RAM address space.
! @*@var{mcu}@tie{}= @code{attiny202}, @code{attiny204}, @code{attiny212}, @code{attiny214}, @code{attiny402}, @code{attiny404}, @code{attiny406}, @code{attiny412}, @code{attiny414}, @code{attiny416}, @code{attiny416auto}, @code{attiny417}, @code{attiny424}, @code{attiny426}, @code{attiny427}, @code{attiny804}, @code{attiny806}, @code{attiny807}, @code{attiny814}, @code{attiny816}, @code{attiny817}, @code{attiny824}, @code{attiny826}, @code{attiny827}, @code{attiny1604}, @code{attiny1606}, @code{attiny1607}, @code{attiny1614}, @code{attiny1616}, @code{attiny1617}, @code{attiny1624}, @code{attiny1626}, @code{attiny1627}, @code{attiny3214}, @code{attiny3216}, @code{attiny3217}, @code{attiny3224}, @code{attiny3226}, @code{attiny3227}, @code{atmega808}, @code{atmega809}, @code{atmega1608}, @code{atmega1609}, @code{atmega3208}, @code{atmega3209}, @code{atmega4808}, @code{atmega4809}, @code{avr16dd14}, @code{avr16dd20}, @code{avr16dd28}, @code{avr16dd32}, @code{avr16du14}, @code{avr16du20}, @code{avr16du28}, @code{avr16du32}, @code{avr16ea28}, @code{avr16ea32}, @code{avr16ea48}, @code{avr16eb14}, @code{avr16eb20}, @code{avr16eb28}, @code{avr16eb32}, @code{avr32da28}, @code{avr32da28s}, @code{avr32da32}, @code{avr32da32s}, @code{avr32da48}, @code{avr32da48s}, @code{avr32db28}, @code{avr32db32}, @code{avr32db48}, @code{avr32dd14}, @code{avr32dd20}, @code{avr32dd28}, @code{avr32dd32}, @code{avr32du14}, @code{avr32du20}, @code{avr32du28}, @code{avr32du32}, @code{avr32ea28}, @code{avr32ea32}, @code{avr32ea48}, @code{avr32eb14}, @code{avr32eb20}, @code{avr32eb28}, @code{avr32eb32}, @code{avr32sd20}, @code{avr32sd28}, @code{avr32sd32}.
  
  @item @anchor{avrxmega4}avrxmega4
  ``XMEGA'' devices with more than 64@tie{}KiB and up to 128@tie{}KiB of program memory.
diff -Nrcpad gcc-16-20250914/gcc/doc/gm2.texi gcc-16-20250921/gcc/doc/gm2.texi
*** gcc-16-20250914/gcc/doc/gm2.texi	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/doc/gm2.texi	Sun Sep 21 22:32:37 2025
*************** The option @samp{-Wall} will turn on thi
*** 723,728 ****
--- 723,734 ----
  @samp{-Wuninit-variable-checking=known}.
  The @samp{-Wuninit-variable-checking=all} will increase compile time.
  
+ @item -fwideset
+ turn on access to the runtime support library module @samp{M2WIDESET}.
+ By default this option is on.
+ Wideset provision can be disabled by @samp{-fno-wideset}
+ and no reference will be made to the run time @samp{M2WIDESET} library.
+ 
  @c the following warning options are complete but need to be
  @c regression tested against all other front ends
  @c to ensure the options do not conflict.
diff -Nrcpad gcc-16-20250914/gcc/doc/invoke.texi gcc-16-20250921/gcc/doc/invoke.texi
*** gcc-16-20250914/gcc/doc/invoke.texi	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/doc/invoke.texi	Sun Sep 21 22:32:37 2025
*************** switch (cond)
*** 7410,7416 ****
  @end group
  @end smallexample
  
! C++17 provides a standard way to suppress the @option{-Wimplicit-fallthrough}
  warning using @code{[[fallthrough]];} instead of the GNU attribute.  In C++11
  or C++14 users can use @code{[[gnu::fallthrough]];}, which is a GNU extension.
  Instead of these attributes, it is also possible to add a fallthrough comment
--- 7410,7416 ----
  @end group
  @end smallexample
  
! C++17 and C23 provide a standard way to suppress the @option{-Wimplicit-fallthrough}
  warning using @code{[[fallthrough]];} instead of the GNU attribute.  In C++11
  or C++14 users can use @code{[[gnu::fallthrough]];}, which is a GNU extension.
  Instead of these attributes, it is also possible to add a fallthrough comment
*************** aggressive optimization, increasing the
*** 16312,16317 ****
--- 16312,16321 ----
  should be removed when the delay slot code is rewritten to maintain the
  control-flow graph.
  
+ @item max-devirt-targets
+ This limits number of function a virtual call may be speculatively
+ devirtualized to using static analysis (without profile feedback).
+ 
  @item max-gcse-memory
  The approximate maximum amount of memory in @code{kB} that can be allocated in
  order to perform the global common subexpression elimination
*************** extension in streaming mode.
*** 22728,22733 ****
--- 22732,22739 ----
  Enable the Floating Point Absolute Maximum/Minimum extension.
  @item lut
  Enable the Lookup Table extension.
+ @item sme-lutv2
+ Enable the SME Lookup Table v2 (LUTv2) extension.
  @item cpa
  Enable the Checked Pointer Arithmetic instructions.
  @item sve-b16b16
diff -Nrcpad gcc-16-20250914/gcc/expr.cc gcc-16-20250921/gcc/expr.cc
*** gcc-16-20250914/gcc/expr.cc	Sun Sep 14 22:32:08 2025
--- gcc-16-20250921/gcc/expr.cc	Sun Sep 21 22:32:37 2025
*************** expand_expr_real_2 (const_sepops ops, rt
*** 9960,9965 ****
--- 9960,9966 ----
        else if (SCALAR_INT_MODE_P (GET_MODE (op0))
  	       && optimize >= 2
  	       && SCALAR_INT_MODE_P (mode)
+ 	       && INTEGRAL_TYPE_P (TREE_TYPE (treeop0))
  	       && (GET_MODE_SIZE (as_a <scalar_int_mode> (mode))
  		   > GET_MODE_SIZE (as_a <scalar_int_mode> (GET_MODE (op0))))
  	       && get_range_pos_neg (treeop0,
diff -Nrcpad gcc-16-20250914/gcc/fortran/ChangeLog gcc-16-20250921/gcc/fortran/ChangeLog
*** gcc-16-20250914/gcc/fortran/ChangeLog	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/fortran/ChangeLog	Sun Sep 21 22:32:37 2025
***************
*** 1,3 ****
--- 1,75 ----
+ 2025-09-20  Paul Thomas  <pault@gcc.gnu.org>
+ 
+ 	PR fortran/83746
+ 	* trans-decl.cc (gfc_trans_deferred_vars): If a procedure with
+ 	an non-allocatable, non-pointer explicit PDT result has no
+ 	default initializer, the parameterized components should be
+ 	allocated.
+ 
+ 2025-09-19  Paul Thomas  <pault@gcc.gnu.org>
+ 
+ 	PR fortran/83746
+ 	* trans-array.cc (structure_alloc_comps): Add the pre and post
+ 	blocks to 'fnblock' for all the evaluations of parameterized
+ 	expressions in PDT component allocatation.
+ 
+ 2025-09-18  Paul Thomas  <pault@gcc.gnu.org>
+ 
+ 	PR fortran/114815
+ 	* decl.cc (gfc_get_pdt_instance): Copy the contents of 'tb' and
+ 	not the pointer.
+ 	* primary.cc (gfc_match_rvalue): If there is only one actual
+ 	argument list, use if for the type spec parameter values. If
+ 	this fails try the default type specification values and use
+ 	the actual arguments for the component values.
+ 	* resolve.cc (build_init_assign): Don't initialize implicit PDT
+ 	function results.
+ 
+ 2025-09-17  Thomas Koenig  <tkoenig@gcc.gnu.org>
+ 
+ 	* frontend-passes.cc (optimize_namespace): Handle
+ 	flag_external_blas64.
+ 	(call_external_blas): If flag_external_blas is set, use
+ 	gfc_integer_4_kind as the argument kind, gfc_integer_8_kind otherwise.
+ 	* gfortran.h (gfc_integer_8_kind): Define.
+ 	* invoke.texi: Document -fexternal-blas64.
+ 	* lang.opt: Add -fexternal-blas64.
+ 	* lang.opt.urls: Regenerated.
+ 	* options.cc (gfc_post_options): -fexternal-blas is incompatible
+ 	with -fexternal-blas64.
+ 
+ 2025-09-15  Paul Thomas  <pault@gcc.gnu.org>
+ 
+ 	PR fortran/83763
+ 	* trans-decl.cc (gfc_trans_deferred_vars): Ensure that the
+ 	parameterized components of PDTs that do not have allocatable
+ 	components are deallocated on leaving scope.
+ 	* trans-expr.cc (gfc_trans_assignment_1): Do a dependency check
+ 	on PDT assignments. If there is a dependency between lhs and
+ 	rhs, deallocate the lhs parameterized components after the rhs
+ 	has been evaluated.
+ 
+ 2025-09-14  Yuao Ma  <c8ef@outlook.com>
+ 
+ 	* dump-parse-tree.cc (show_expr): Add support for EXPR_CONDITIONAL.
+ 	* expr.cc (gfc_get_conditional_expr): Add cond-expr constructor.
+ 	(gfc_copy_expr, free_expr0, gfc_is_constant_expr,
+ 	simplify_conditional, gfc_simplify_expr, gfc_check_init_expr,
+ 	check_restricted, gfc_traverse_expr): Add support for EXPR_CONDITIONAL.
+ 	* frontend-passes.cc (gfc_expr_walker): Ditto.
+ 	* gfortran.h (enum expr_t): Add EXPR_CONDITIONAL.
+ 	(gfc_get_operator_expr): Format fix.
+ 	(gfc_get_conditional_expr): New decl.
+ 	* matchexp.cc
+ 	(match_conditional, match_primary): Parsing for EXPR_CONDITIONAL.
+ 	* module.cc (mio_expr): Add support for EXPR_CONDITIONAL.
+ 	* resolve.cc (resolve_conditional, gfc_resolve_expr): Ditto.
+ 	* trans-array.cc (gfc_walk_conditional_expr, gfc_walk_subexpr): Ditto.
+ 	* trans-expr.cc
+ 	(gfc_conv_conditional_expr): Codegen for EXPR_CONDITIONAL.
+ 	(gfc_apply_interface_mapping_to_expr, gfc_conv_expr,
+ 	gfc_conv_expr_reference): Add support for EXPR_CONDITIONAL.
+ 
  2025-09-11  Harald Anlauf  <anlauf@gmx.de>
  
  	PR fortran/121616
diff -Nrcpad gcc-16-20250914/gcc/fortran/decl.cc gcc-16-20250921/gcc/fortran/decl.cc
*** gcc-16-20250914/gcc/fortran/decl.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/fortran/decl.cc	Sun Sep 21 22:32:37 2025
*************** gfc_get_pdt_instance (gfc_actual_arglist
*** 4092,4098 ****
        if (c1->tb)
  	{
  	  c2->tb = gfc_get_tbp ();
! 	  c2->tb = c1->tb;
  	}
  
        /* The order of declaration of the type_specs might not be the
--- 4092,4098 ----
        if (c1->tb)
  	{
  	  c2->tb = gfc_get_tbp ();
! 	  *c2->tb = *c1->tb;
  	}
  
        /* The order of declaration of the type_specs might not be the
diff -Nrcpad gcc-16-20250914/gcc/fortran/frontend-passes.cc gcc-16-20250921/gcc/fortran/frontend-passes.cc
*** gcc-16-20250914/gcc/fortran/frontend-passes.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/fortran/frontend-passes.cc	Sun Sep 21 22:32:37 2025
*************** optimize_namespace (gfc_namespace *ns)
*** 1481,1487 ****
        gfc_code_walker (&ns->code, convert_elseif, dummy_expr_callback, NULL);
        gfc_code_walker (&ns->code, cfe_code, cfe_expr_0, NULL);
        gfc_code_walker (&ns->code, optimize_code, optimize_expr, NULL);
!       if (flag_inline_matmul_limit != 0 || flag_external_blas)
  	{
  	  bool found;
  	  do
--- 1481,1488 ----
        gfc_code_walker (&ns->code, convert_elseif, dummy_expr_callback, NULL);
        gfc_code_walker (&ns->code, cfe_code, cfe_expr_0, NULL);
        gfc_code_walker (&ns->code, optimize_code, optimize_expr, NULL);
!       if (flag_inline_matmul_limit != 0 || flag_external_blas
! 	  || flag_external_blas64)
  	{
  	  bool found;
  	  do
*************** optimize_namespace (gfc_namespace *ns)
*** 1496,1502 ****
  			   NULL);
  	}
  
!       if (flag_external_blas)
  	gfc_code_walker (&ns->code, call_external_blas, dummy_expr_callback,
  			 NULL);
  
--- 1497,1503 ----
  			   NULL);
  	}
  
!       if (flag_external_blas || flag_external_blas64)
  	gfc_code_walker (&ns->code, call_external_blas, dummy_expr_callback,
  			 NULL);
  
*************** call_external_blas (gfc_code **c, int *w
*** 4644,4649 ****
--- 4645,4651 ----
    enum matrix_case m_case;
    bool realloc_c;
    gfc_code **next_code_point;
+   int arg_kind;
  
    /* Many of the tests for inline matmul also apply here.  */
  
*************** call_external_blas (gfc_code **c, int *w
*** 4929,4941 ****
  				       transb, 1);
    actual->next = next;
  
    c1 = get_array_inq_function (GFC_ISYM_SIZE, gfc_copy_expr (a->expr), 1,
! 			       gfc_integer_4_kind);
    c2 = get_array_inq_function (GFC_ISYM_SIZE, gfc_copy_expr (b->expr), 2,
! 			       gfc_integer_4_kind);
! 
    b1 = get_array_inq_function (GFC_ISYM_SIZE, gfc_copy_expr (b->expr), 1,
! 			       gfc_integer_4_kind);
  
    /* Argument M. */
    actual = next;
--- 4931,4950 ----
  				       transb, 1);
    actual->next = next;
  
+   if (flag_external_blas)
+     arg_kind = gfc_integer_4_kind;
+   else
+     {
+       gcc_assert (flag_external_blas64);
+       arg_kind = gfc_integer_8_kind;
+     }
+ 
    c1 = get_array_inq_function (GFC_ISYM_SIZE, gfc_copy_expr (a->expr), 1,
! 			       arg_kind);
    c2 = get_array_inq_function (GFC_ISYM_SIZE, gfc_copy_expr (b->expr), 2,
! 			       arg_kind);
    b1 = get_array_inq_function (GFC_ISYM_SIZE, gfc_copy_expr (b->expr), 1,
! 			       arg_kind);
  
    /* Argument M. */
    actual = next;
*************** call_external_blas (gfc_code **c, int *w
*** 4975,4981 ****
    actual = next;
    next = gfc_get_actual_arglist ();
    next->expr = get_array_inq_function (GFC_ISYM_SIZE, gfc_copy_expr (matrix_a),
! 				       1, gfc_integer_4_kind);
    actual->next = next;
  
    /* Argument B.  */
--- 4984,4990 ----
    actual = next;
    next = gfc_get_actual_arglist ();
    next->expr = get_array_inq_function (GFC_ISYM_SIZE, gfc_copy_expr (matrix_a),
! 				       1, arg_kind);
    actual->next = next;
  
    /* Argument B.  */
*************** call_external_blas (gfc_code **c, int *w
*** 4988,4994 ****
    actual = next;
    next = gfc_get_actual_arglist ();
    next->expr = get_array_inq_function (GFC_ISYM_SIZE, gfc_copy_expr (matrix_b),
! 				       1, gfc_integer_4_kind);
    actual->next = next;
  
    /* Argument BETA - set to zero.  */
--- 4997,5003 ----
    actual = next;
    next = gfc_get_actual_arglist ();
    next->expr = get_array_inq_function (GFC_ISYM_SIZE, gfc_copy_expr (matrix_b),
! 				       1, arg_kind);
    actual->next = next;
  
    /* Argument BETA - set to zero.  */
*************** call_external_blas (gfc_code **c, int *w
*** 5012,5018 ****
    actual = next;
    next = gfc_get_actual_arglist ();
    next->expr = get_array_inq_function (GFC_ISYM_SIZE, gfc_copy_expr (expr1),
! 				       1, gfc_integer_4_kind);
    actual->next = next;
  
    return 0;
--- 5021,5027 ----
    actual = next;
    next = gfc_get_actual_arglist ();
    next->expr = get_array_inq_function (GFC_ISYM_SIZE, gfc_copy_expr (expr1),
! 				       1, arg_kind);
    actual->next = next;
  
    return 0;
diff -Nrcpad gcc-16-20250914/gcc/fortran/gfortran.h gcc-16-20250921/gcc/fortran/gfortran.h
*** gcc-16-20250914/gcc/fortran/gfortran.h	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/fortran/gfortran.h	Sun Sep 21 22:32:37 2025
*************** extern int gfc_character_storage_size;
*** 3672,3677 ****
--- 3672,3679 ----
  #define gfc_integer_4_kind 4
  #define gfc_real_4_kind 4
  
+ #define gfc_integer_8_kind 8
+ 
  /* symbol.cc */
  void gfc_clear_new_implicit (void);
  bool gfc_add_new_implicit_range (int, int);
diff -Nrcpad gcc-16-20250914/gcc/fortran/invoke.texi gcc-16-20250921/gcc/fortran/invoke.texi
*** gcc-16-20250914/gcc/fortran/invoke.texi	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/fortran/invoke.texi	Sun Sep 21 22:32:37 2025
*************** and warnings}.
*** 189,195 ****
  -fbounds-check -ftail-call-workaround -ftail-call-workaround=@var{n}
  -fcheck-array-temporaries
  -fcheck=<all|array-temps|bits|bounds|do|mem|pointer|recursion>
! -fcoarray=<none|single|lib> -fexternal-blas -ff2c
  -ffrontend-loop-interchange -ffrontend-optimize
  -finit-character=@var{n} -finit-integer=@var{n} -finit-local-zero
  -finit-derived -finit-logical=<true|false>
--- 189,195 ----
  -fbounds-check -ftail-call-workaround -ftail-call-workaround=@var{n}
  -fcheck-array-temporaries
  -fcheck=<all|array-temps|bits|bounds|do|mem|pointer|recursion>
! -fcoarray=<none|single|lib> -fexternal-blas -fexternal-blas64 -ff2c
  -ffrontend-loop-interchange -ffrontend-optimize
  -finit-character=@var{n} -finit-integer=@var{n} -finit-local-zero
  -finit-derived -finit-logical=<true|false>
*************** for some matrix operations like @code{MA
*** 2014,2026 ****
  algorithms, if the size of the matrices involved is larger than a given
  limit (see @option{-fblas-matmul-limit}).  This may be profitable if an
  optimized vendor BLAS library is available.  The BLAS library has
! to be specified at link time.
  
  @opindex fblas-matmul-limit
  @item -fblas-matmul-limit=@var{n}
! Only significant when @option{-fexternal-blas} is in effect.
! Matrix multiplication of matrices with size larger than (or equal to) @var{n}
! is performed by calls to BLAS functions, while others are
  handled by @command{gfortran} internal algorithms. If the matrices
  involved are not square, the size comparison is performed using the
  geometric mean of the dimensions of the argument and result matrices.
--- 2014,2040 ----
  algorithms, if the size of the matrices involved is larger than a given
  limit (see @option{-fblas-matmul-limit}).  This may be profitable if an
  optimized vendor BLAS library is available.  The BLAS library has
! to be specified at link time.  This option specifies a BLAS library
! with integer arguments of default kind (32 bits). It cannot be used
! together with @option{-fexternal-blas64}.
! 
! @opindex fexternal-blas64
! @item -fexternal-blas64
! makes @command{gfortran} generate calls to BLAS functions
! for some matrix operations like @code{MATMUL}, instead of using our own
! algorithms, if the size of the matrices involved is larger than a given
! limit (see @option{-fblas-matmul-limit}).  This may be profitable if an
! optimized vendor BLAS library is available.  The BLAS library has
! to be specified at link time.  This option specifies a BLAS library
! with integer arguments of @code{KIND=8} (64 bits). It cannot be used
! together with @option{-fexternal-blas}, and requires a 64-bit system.
! This option also requires @option{-ffrontend-optimize}.
  
  @opindex fblas-matmul-limit
  @item -fblas-matmul-limit=@var{n}
! Only significant when @option{-fexternal-blas} or @option{-fexternal-blas64}
! are in effect. Matrix multiplication of matrices with size larger than or equal
! to @var{n} is performed by calls to BLAS functions, while others are
  handled by @command{gfortran} internal algorithms. If the matrices
  involved are not square, the size comparison is performed using the
  geometric mean of the dimensions of the argument and result matrices.
diff -Nrcpad gcc-16-20250914/gcc/fortran/lang.opt gcc-16-20250921/gcc/fortran/lang.opt
*** gcc-16-20250914/gcc/fortran/lang.opt	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/fortran/lang.opt	Sun Sep 21 22:32:37 2025
*************** fexternal-blas
*** 566,571 ****
--- 566,575 ----
  Fortran Var(flag_external_blas)
  Specify that an external BLAS library should be used for matmul calls on large-size arrays.
  
+ fexternal-blas64
+ Fortran Var(flag_external_blas64)
+ Use an external BLAS library with 64-bit indexing for matmul on large-size arrays.
+ 
  ff2c
  Fortran Var(flag_f2c)
  Use f2c calling convention.
diff -Nrcpad gcc-16-20250914/gcc/fortran/lang.opt.urls gcc-16-20250921/gcc/fortran/lang.opt.urls
*** gcc-16-20250914/gcc/fortran/lang.opt.urls	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/fortran/lang.opt.urls	Sun Sep 21 22:32:37 2025
*************** LangUrlSuffix_Fortran(gfortran/Developer
*** 295,300 ****
--- 295,303 ----
  fexternal-blas
  LangUrlSuffix_Fortran(gfortran/Code-Gen-Options.html#index-fexternal-blas)
  
+ fexternal-blas64
+ LangUrlSuffix_Fortran(gfortran/Code-Gen-Options.html#index-fexternal-blas64)
+ 
  ff2c
  LangUrlSuffix_Fortran(gfortran/Code-Gen-Options.html#index-ff2c)
  
diff -Nrcpad gcc-16-20250914/gcc/fortran/options.cc gcc-16-20250921/gcc/fortran/options.cc
*** gcc-16-20250914/gcc/fortran/options.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/fortran/options.cc	Sun Sep 21 22:32:37 2025
*************** gfc_post_options (const char **pfilename
*** 504,515 ****
  	flag_inline_matmul_limit = 30;
      }
  
!   /* Optimization implies front end optimization, unless the user
       specified it directly.  */
  
    if (flag_frontend_optimize == -1)
      flag_frontend_optimize = optimize && !optimize_debug;
  
    /* Same for front end loop interchange.  */
  
    if (flag_frontend_loop_interchange == -1)
--- 504,523 ----
  	flag_inline_matmul_limit = 30;
      }
  
!   /* We can only have a 32-bit or a 64-bit version of BLAS, not both.  */
! 
!   if (flag_external_blas && flag_external_blas64)
!     gfc_fatal_error ("32- and 64-bit version of BLAS cannot both be specified");
! 
!   /* Optimizationx implies front end optimization, unless the user
       specified it directly.  */
  
    if (flag_frontend_optimize == -1)
      flag_frontend_optimize = optimize && !optimize_debug;
  
+   if (flag_external_blas64 && !flag_frontend_optimize)
+     gfc_fatal_error ("-ffrontend-optimize required for -fexternal-blas64");
+ 
    /* Same for front end loop interchange.  */
  
    if (flag_frontend_loop_interchange == -1)
diff -Nrcpad gcc-16-20250914/gcc/fortran/primary.cc gcc-16-20250921/gcc/fortran/primary.cc
*** gcc-16-20250914/gcc/fortran/primary.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/fortran/primary.cc	Sun Sep 21 22:32:37 2025
*************** gfc_match_rvalue (gfc_expr **result)
*** 4059,4065 ****
  
        /* Check to see if this is a PDT constructor.  The format of these
  	 constructors is rather unusual:
! 		name (type_params)(component_values)
  	 where, component_values excludes the type_params. With the present
  	 gfortran representation this is rather awkward because the two are not
  	 distinguished, other than by their attributes.  */
--- 4059,4065 ----
  
        /* Check to see if this is a PDT constructor.  The format of these
  	 constructors is rather unusual:
! 		name [(type_params)](component_values)
  	 where, component_values excludes the type_params. With the present
  	 gfortran representation this is rather awkward because the two are not
  	 distinguished, other than by their attributes.  */
*************** gfc_match_rvalue (gfc_expr **result)
*** 4074,4080 ****
--- 4074,4088 ----
  	  gfc_find_sym_tree (gfc_dt_upper_string (name), NULL, 1, &pdt_st);
  	  if (pdt_st && pdt_st->n.sym && pdt_st->n.sym->attr.pdt_template)
  	    {
+ 	      bool type_spec_list = false;
  	      pdt_sym = pdt_st->n.sym;
+ 	      gfc_gobble_whitespace ();
+ 	      /* Look for a second actual arglist. If present, try the first
+ 		 for the type parameters. Otherwise, or if there is no match,
+ 		 depend on default values by setting the type parameters to
+ 		 NULL.  */
+ 	      if (gfc_peek_ascii_char() == '(')
+ 		type_spec_list = true;
  
  	      /* Generate this instance using the type parameters from the
  		 first argument list and return the parameter list in
*************** gfc_match_rvalue (gfc_expr **result)
*** 4082,4096 ****
  	      m = gfc_get_pdt_instance (actual_arglist, &pdt_sym, &ctr_arglist);
  	      if (m != MATCH_YES)
  		{
! 		  m = MATCH_ERROR;
! 		  break;
  		}
! 	      /* Now match the component_values.  */
! 	      m = gfc_match_actual_arglist (0, &actual_arglist);
! 	      if (m != MATCH_YES)
  		{
! 		  m = MATCH_ERROR;
! 		  break;
  		}
  
  	      /* Make sure that the component names are in place so that this
--- 4090,4116 ----
  	      m = gfc_get_pdt_instance (actual_arglist, &pdt_sym, &ctr_arglist);
  	      if (m != MATCH_YES)
  		{
! 		  if (ctr_arglist)
! 		    gfc_free_actual_arglist (ctr_arglist);
! 		  /* See if all the type parameters have default values.  */
! 		  m = gfc_get_pdt_instance (NULL, &pdt_sym, &ctr_arglist);
! 		  if (m != MATCH_YES)
! 		    {
! 		      m = MATCH_NO;
! 		      break;
! 		    }
  		}
! 
! 	      /* Now match the component_values if the type parameters were
! 		 present.  */
! 	      if (type_spec_list)
  		{
! 		  m = gfc_match_actual_arglist (0, &actual_arglist);
! 		  if (m != MATCH_YES)
! 		    {
! 		      m = MATCH_ERROR;
! 		      break;
! 		    }
  		}
  
  	      /* Make sure that the component names are in place so that this
*************** gfc_match_rvalue (gfc_expr **result)
*** 4104,4116 ****
  		  tmp = tmp->next;
  		}
  
! 	      gfc_get_ha_sym_tree (gfc_dt_lower_string (pdt_sym->name) ,
! 				   &symtree);
! 	      symtree->n.sym = pdt_sym;
! 	      symtree->n.sym->ts.u.derived = pdt_sym;
! 	      symtree->n.sym->ts.type = BT_DERIVED;
  
! 	      /* Do the appending.  */
  	      for (tmp = ctr_arglist; tmp && tmp->next;)
  		tmp = tmp->next;
  	      tmp->next = actual_arglist;
--- 4124,4141 ----
  		  tmp = tmp->next;
  		}
  
! 	      gfc_find_sym_tree (gfc_dt_lower_string (pdt_sym->name),
! 				 NULL, 1, &symtree);
! 	      if (!symtree)
! 		{
! 		  gfc_get_ha_sym_tree (gfc_dt_lower_string (pdt_sym->name) ,
! 				       &symtree);
! 		  symtree->n.sym = pdt_sym;
! 		  symtree->n.sym->ts.u.derived = pdt_sym;
! 		  symtree->n.sym->ts.type = BT_DERIVED;
! 		}
  
! 	      /* Append the type_params and the component_values.  */
  	      for (tmp = ctr_arglist; tmp && tmp->next;)
  		tmp = tmp->next;
  	      tmp->next = actual_arglist;
diff -Nrcpad gcc-16-20250914/gcc/fortran/resolve.cc gcc-16-20250921/gcc/fortran/resolve.cc
*** gcc-16-20250914/gcc/fortran/resolve.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/fortran/resolve.cc	Sun Sep 21 22:32:37 2025
*************** build_init_assign (gfc_symbol *sym, gfc_
*** 14613,14618 ****
--- 14613,14625 ----
    gfc_code *init_st;
    gfc_namespace *ns = sym->ns;
  
+   if (sym->attr.function && sym->result == sym
+       && sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.pdt_type)
+     {
+       gfc_free_expr (init);
+       return;
+     }
+ 
    /* Search for the function namespace if this is a contained
       function without an explicit result.  */
    if (sym->attr.function && sym == sym->result
diff -Nrcpad gcc-16-20250914/gcc/fortran/st.cc gcc-16-20250921/gcc/fortran/st.cc
*** gcc-16-20250914/gcc/fortran/st.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/fortran/st.cc	Sun Sep 21 22:32:37 2025
*************** gfc_free_statement (gfc_code *p)
*** 86,91 ****
--- 86,95 ----
      gfc_free_expr (p->expr1);
    if (p->expr2)
      gfc_free_expr (p->expr2);
+   if (p->expr3)
+     gfc_free_expr (p->expr3);
+   if (p->expr4)
+     gfc_free_expr (p->expr4);
  
    switch (p->op)
      {
diff -Nrcpad gcc-16-20250914/gcc/fortran/trans-array.cc gcc-16-20250921/gcc/fortran/trans-array.cc
*** gcc-16-20250914/gcc/fortran/trans-array.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/fortran/trans-array.cc	Sun Sep 21 22:32:37 2025
*************** gfc_conv_expr_descriptor (gfc_se *se, gf
*** 8912,8917 ****
--- 8912,8930 ----
  					  gfc_rank_cst[dim], stride);
  	}
  
+       /* For deferred-length character we need to take the dynamic length
+ 	 into account for the dataptr offset.  */
+       if (expr->ts.type == BT_CHARACTER
+ 	  && expr->ts.deferred
+ 	  && expr->ts.u.cl->backend_decl
+ 	  && VAR_P (expr->ts.u.cl->backend_decl))
+ 	{
+ 	  tree base_type = TREE_TYPE (base);
+ 	  base = fold_build2_loc (input_location, MULT_EXPR, base_type, base,
+ 				  fold_convert (base_type,
+ 						expr->ts.u.cl->backend_decl));
+ 	}
+ 
        for (n = loop.dimen; n < loop.dimen + codim; n++)
  	{
  	  from = loop.from[n];
*************** structure_alloc_comps (gfc_symbol * der_
*** 10903,10909 ****
--- 10916,10924 ----
  	      if (c_expr)
  		{
  		  gfc_conv_expr_type (&tse, c_expr, TREE_TYPE (comp));
+ 		  gfc_add_block_to_block (&fnblock, &tse.pre);
  		  gfc_add_modify (&fnblock, comp, tse.expr);
+ 		  gfc_add_block_to_block (&fnblock, &tse.post);
  		}
  	    }
  	  else if (c->initializer && !c->attr.pdt_string && !c->attr.pdt_array
*************** structure_alloc_comps (gfc_symbol * der_
*** 10914,10920 ****
--- 10929,10937 ----
  	      gfc_expr *c_expr;
  	      c_expr = c->initializer;
  	      gfc_conv_expr_type (&tse, c_expr, TREE_TYPE (comp));
+ 	      gfc_add_block_to_block (&fnblock, &tse.pre);
  	      gfc_add_modify (&fnblock, comp, tse.expr);
+ 	      gfc_add_block_to_block (&fnblock, &tse.post);
  	    }
  
  	  if (c->attr.pdt_string)
*************** structure_alloc_comps (gfc_symbol * der_
*** 10934,10940 ****
--- 10951,10959 ----
  		  strlen = fold_build3_loc (input_location, COMPONENT_REF,
  					    TREE_TYPE (strlen),
  					    decl, strlen, NULL_TREE);
+ 		  gfc_add_block_to_block (&fnblock, &tse.pre);
  		  gfc_add_modify (&fnblock, strlen, tse.expr);
+ 		  gfc_add_block_to_block (&fnblock, &tse.post);
  		  c->ts.u.cl->backend_decl = strlen;
  		}
  	      gfc_free_expr (e);
*************** structure_alloc_comps (gfc_symbol * der_
*** 10981,10997 ****
--- 11000,11020 ----
  		  gfc_conv_expr_type (&tse, e, gfc_array_index_type);
  		  gfc_free_expr (e);
  		  lower = tse.expr;
+ 		  gfc_add_block_to_block (&fnblock, &tse.pre);
  		  gfc_conv_descriptor_lbound_set (&fnblock, comp,
  						  gfc_rank_cst[i],
  						  lower);
+ 		  gfc_add_block_to_block (&fnblock, &tse.post);
  		  e = gfc_copy_expr (c->as->upper[i]);
  		  gfc_insert_parameter_exprs (e, pdt_param_list);
  		  gfc_conv_expr_type (&tse, e, gfc_array_index_type);
  		  gfc_free_expr (e);
  		  upper = tse.expr;
+ 		  gfc_add_block_to_block (&fnblock, &tse.pre);
  		  gfc_conv_descriptor_ubound_set (&fnblock, comp,
  						  gfc_rank_cst[i],
  						  upper);
+ 		  gfc_add_block_to_block (&fnblock, &tse.post);
  		  gfc_conv_descriptor_stride_set (&fnblock, comp,
  						  gfc_rank_cst[i],
  						  size);
diff -Nrcpad gcc-16-20250914/gcc/fortran/trans-decl.cc gcc-16-20250921/gcc/fortran/trans-decl.cc
*** gcc-16-20250914/gcc/fortran/trans-decl.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/fortran/trans-decl.cc	Sun Sep 21 22:32:37 2025
*************** gfc_trans_deferred_vars (gfc_symbol * pr
*** 4831,4836 ****
--- 4831,4853 ----
  	}
      }
  
+   sym = (proc_sym->attr.function
+ 	 && proc_sym != proc_sym->result) ? proc_sym->result : NULL;
+ 
+   if (sym && !sym->attr.allocatable && !sym->attr.pointer
+       && sym->ts.type == BT_DERIVED
+       && sym->ts.u.derived
+       && !gfc_has_default_initializer (sym->ts.u.derived)
+       && sym->ts.u.derived->attr.pdt_type)
+     {
+       gfc_init_block (&tmpblock);
+       tmp = gfc_allocate_pdt_comp (sym->ts.u.derived,
+ 				   sym->backend_decl,
+ 				   sym->as ? sym->as->rank : 0,
+ 				   sym->param_list);
+       gfc_add_expr_to_block (&tmpblock, tmp);
+       gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock), NULL);
+     }
  
    /* Initialize the INTENT(OUT) derived type dummy arguments.  This
       should be done here so that the offsets and lbounds of arrays
*************** gfc_trans_deferred_vars (gfc_symbol * pr
*** 4908,4928 ****
  	{
  	  is_pdt_type = true;
  	  gfc_init_block (&tmpblock);
! 	  if (!(sym->attr.dummy
! 		|| sym->attr.pointer
! 		|| sym->attr.allocatable))
  	    {
! 	      tmp = gfc_allocate_pdt_comp (sym->ts.u.derived,
! 					   sym->backend_decl,
! 					   sym->as ? sym->as->rank : 0,
! 					   sym->param_list);
! 	      gfc_add_expr_to_block (&tmpblock, tmp);
! 	      if (!sym->attr.result)
  		tmp = gfc_deallocate_pdt_comp (sym->ts.u.derived,
  					       sym->backend_decl,
  					       sym->as ? sym->as->rank : 0);
  	      else
  		tmp = NULL_TREE;
  	      gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock), tmp);
  	    }
  	  else if (sym->attr.dummy)
--- 4925,4948 ----
  	{
  	  is_pdt_type = true;
  	  gfc_init_block (&tmpblock);
! 	  if (!sym->attr.dummy && !sym->attr.pointer)
  	    {
! 	      if (!sym->attr.allocatable)
! 		{
! 		  tmp = gfc_allocate_pdt_comp (sym->ts.u.derived,
! 					       sym->backend_decl,
! 					       sym->as ? sym->as->rank : 0,
! 					       sym->param_list);
! 		  gfc_add_expr_to_block (&tmpblock, tmp);
! 		}
! 
! 	      if (!sym->attr.result && !sym->ts.u.derived->attr.alloc_comp)
  		tmp = gfc_deallocate_pdt_comp (sym->ts.u.derived,
  					       sym->backend_decl,
  					       sym->as ? sym->as->rank : 0);
  	      else
  		tmp = NULL_TREE;
+ 
  	      gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock), tmp);
  	    }
  	  else if (sym->attr.dummy)
diff -Nrcpad gcc-16-20250914/gcc/fortran/trans-expr.cc gcc-16-20250921/gcc/fortran/trans-expr.cc
*** gcc-16-20250914/gcc/fortran/trans-expr.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/fortran/trans-expr.cc	Sun Sep 21 22:32:37 2025
*************** gfc_trans_assignment_1 (gfc_expr * expr1
*** 13213,13238 ****
  	}
  
        /* Deallocate the lhs parameterized components if required.  */
!       if (dealloc && expr2->expr_type == EXPR_FUNCTION
! 	  && !expr1->symtree->n.sym->attr.associate_var)
  	{
! 	  if (expr1->ts.type == BT_DERIVED
! 	      && expr1->ts.u.derived
! 	      && expr1->ts.u.derived->attr.pdt_type)
  	    {
! 	      tmp = gfc_deallocate_pdt_comp (expr1->ts.u.derived, lse.expr,
! 					     expr1->rank);
! 	      gfc_add_expr_to_block (&lse.pre, tmp);
  	    }
! 	  else if (expr1->ts.type == BT_CLASS
! 		   && CLASS_DATA (expr1)->ts.u.derived
! 		   && CLASS_DATA (expr1)->ts.u.derived->attr.pdt_type)
  	    {
! 	      tmp = gfc_class_data_get (lse.expr);
  	      tmp = gfc_deallocate_pdt_comp (CLASS_DATA (expr1)->ts.u.derived,
  					     tmp, expr1->rank);
- 	      gfc_add_expr_to_block (&lse.pre, tmp);
  	    }
  	}
      }
  
--- 13213,13251 ----
  	}
  
        /* Deallocate the lhs parameterized components if required.  */
!       if (dealloc
! 	  && !expr1->symtree->n.sym->attr.associate_var
! 	  && ((expr1->ts.type == BT_DERIVED
! 	       && expr1->ts.u.derived
! 	       && expr1->ts.u.derived->attr.pdt_type)
! 	      || (expr1->ts.type == BT_CLASS
! 		   && CLASS_DATA (expr1)->ts.u.derived
! 		   && CLASS_DATA (expr1)->ts.u.derived->attr.pdt_type)))
  	{
! 	  bool pdt_dep = gfc_check_dependency (expr1, expr2, true);
! 
! 	  tmp = lse.expr;
! 	  if (pdt_dep)
  	    {
! 	      /* Create a temporary for deallocation after assignment.  */
! 	      tmp = gfc_create_var (TREE_TYPE (lse.expr), "pdt_tmp");
! 	      gfc_add_modify (&lse.pre, tmp, lse.expr);
  	    }
! 
! 	  if (expr1->ts.type == BT_DERIVED)
! 	    tmp = gfc_deallocate_pdt_comp (expr1->ts.u.derived, tmp,
! 					   expr1->rank);
! 	  else if (expr1->ts.type == BT_CLASS)
  	    {
! 	      tmp = gfc_class_data_get (tmp);
  	      tmp = gfc_deallocate_pdt_comp (CLASS_DATA (expr1)->ts.u.derived,
  					     tmp, expr1->rank);
  	    }
+ 
+ 	  if (tmp && pdt_dep)
+ 	    gfc_add_expr_to_block (&rse.post, tmp);
+ 	  else if (tmp)
+ 	    gfc_add_expr_to_block (&lse.pre, tmp);
  	}
      }
  
diff -Nrcpad gcc-16-20250914/gcc/fortran/trans-types.cc gcc-16-20250921/gcc/fortran/trans-types.cc
*** gcc-16-20250914/gcc/fortran/trans-types.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/fortran/trans-types.cc	Sun Sep 21 22:32:37 2025
*************** gfc_init_kinds (void)
*** 800,805 ****
--- 800,808 ----
  
    gfc_index_integer_kind = get_int_kind_from_name (PTRDIFF_TYPE);
  
+   if (flag_external_blas64 && gfc_index_integer_kind != gfc_integer_8_kind)
+     gfc_fatal_error ("-fexternal-blas64 requires a 64-bit system");
+ 
    /* Pick a kind the same size as the C "int" type.  */
    gfc_c_int_kind = INT_TYPE_SIZE / 8;
  
diff -Nrcpad gcc-16-20250914/gcc/gimplify.cc gcc-16-20250921/gcc/gimplify.cc
*** gcc-16-20250914/gcc/gimplify.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/gimplify.cc	Sun Sep 21 22:32:38 2025
*************** gimplify_asm_expr (tree *expr_p, gimple_
*** 7930,7935 ****
--- 7930,7937 ----
        bool ok;
        size_t constraint_len;
  
+       if (error_operand_p (TREE_VALUE (link)))
+ 	return GS_ERROR;
        link_next = TREE_CHAIN (link);
  
        oconstraints[i]
*************** gimplify_asm_expr (tree *expr_p, gimple_
*** 7951,7960 ****
        /* If we can't make copies, we can only accept memory.
  	 Similarly for VLAs.  */
        tree outtype = TREE_TYPE (TREE_VALUE (link));
!       if (outtype != error_mark_node
! 	  && (TREE_ADDRESSABLE (outtype)
! 	      || !COMPLETE_TYPE_P (outtype)
! 	      || !tree_fits_poly_uint64_p (TYPE_SIZE_UNIT (outtype))))
  	{
  	  if (allows_mem)
  	    allows_reg = 0;
--- 7953,7961 ----
        /* If we can't make copies, we can only accept memory.
  	 Similarly for VLAs.  */
        tree outtype = TREE_TYPE (TREE_VALUE (link));
!       if (TREE_ADDRESSABLE (outtype)
! 	  || !COMPLETE_TYPE_P (outtype)
! 	  || !tree_fits_poly_uint64_p (TYPE_SIZE_UNIT (outtype)))
  	{
  	  if (allows_mem)
  	    allows_reg = 0;
*************** gimplify_asm_expr (tree *expr_p, gimple_
*** 8155,8160 ****
--- 8156,8163 ----
    int input_num = 0;
    for (link = ASM_INPUTS (expr); link; ++input_num, ++i, link = link_next)
      {
+       if (error_operand_p (TREE_VALUE (link)))
+ 	return GS_ERROR;
        link_next = TREE_CHAIN (link);
        constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
        reg_info.operand = TREE_VALUE (link);
*************** gimplify_asm_expr (tree *expr_p, gimple_
*** 8169,8178 ****
  
        /* If we can't make copies, we can only accept memory.  */
        tree intype = TREE_TYPE (TREE_VALUE (link));
!       if (intype != error_mark_node
! 	  && (TREE_ADDRESSABLE (intype)
! 	      || !COMPLETE_TYPE_P (intype)
! 	      || !tree_fits_poly_uint64_p (TYPE_SIZE_UNIT (intype))))
  	{
  	  if (allows_mem)
  	    allows_reg = 0;
--- 8172,8180 ----
  
        /* If we can't make copies, we can only accept memory.  */
        tree intype = TREE_TYPE (TREE_VALUE (link));
!       if (TREE_ADDRESSABLE (intype)
! 	  || !COMPLETE_TYPE_P (intype)
! 	  || !tree_fits_poly_uint64_p (TYPE_SIZE_UNIT (intype)))
  	{
  	  if (allows_mem)
  	    allows_reg = 0;
diff -Nrcpad gcc-16-20250914/gcc/input.cc gcc-16-20250921/gcc/input.cc
*** gcc-16-20250914/gcc/input.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/input.cc	Sun Sep 21 22:32:38 2025
*************** expand_location_1 (const line_maps *set,
*** 112,127 ****
  	default:
  	  gcc_unreachable ();
  	  /* Fall through.  */
! 	case LOCATION_ASPECT_CARET:
  	  break;
! 	case LOCATION_ASPECT_START:
  	  {
  	    location_t start = get_start (loc);
  	    if (start != loc)
  	      return expand_location_1 (set, start, expansion_point_p, aspect);
  	  }
  	  break;
! 	case LOCATION_ASPECT_FINISH:
  	  {
  	    location_t finish = get_finish (loc);
  	    if (finish != loc)
--- 112,127 ----
  	default:
  	  gcc_unreachable ();
  	  /* Fall through.  */
! 	case location_aspect::caret:
  	  break;
! 	case location_aspect::start:
  	  {
  	    location_t start = get_start (loc);
  	    if (start != loc)
  	      return expand_location_1 (set, start, expansion_point_p, aspect);
  	  }
  	  break;
! 	case location_aspect::finish:
  	  {
  	    location_t finish = get_finish (loc);
  	    if (finish != loc)
*************** get_source_text_between (diagnostics::fi
*** 148,156 ****
  			 location_t start, location_t end)
  {
    expanded_location expstart
!     = expand_location_to_spelling_point (start, LOCATION_ASPECT_START);
    expanded_location expend
!     = expand_location_to_spelling_point (end, LOCATION_ASPECT_FINISH);
  
    /* If the locations are in different files or the end comes before the
       start, give up and return nothing.  */
--- 148,156 ----
  			 location_t start, location_t end)
  {
    expanded_location expstart
!     = expand_location_to_spelling_point (start, location_aspect::start);
    expanded_location expend
!     = expand_location_to_spelling_point (end, location_aspect::finish);
  
    /* If the locations are in different files or the end comes before the
       start, give up and return nothing.  */
*************** expanded_location
*** 258,264 ****
  expand_location (location_t loc)
  {
    return expand_location_1 (line_table, loc, /*expansion_point_p=*/true,
! 			    LOCATION_ASPECT_CARET);
  }
  
  /* Expand the source location LOC into a human readable location.  If
--- 258,264 ----
  expand_location (location_t loc)
  {
    return expand_location_1 (line_table, loc, /*expansion_point_p=*/true,
! 			    location_aspect::caret);
  }
  
  /* Expand the source location LOC into a human readable location.  If
*************** get_substring_ranges_for_loc (cpp_reader
*** 911,920 ****
  
        expanded_location start
  	= expand_location_to_spelling_point (src_range.m_start,
! 					     LOCATION_ASPECT_START);
        expanded_location finish
  	= expand_location_to_spelling_point (src_range.m_finish,
! 					     LOCATION_ASPECT_FINISH);
        if (start.file != finish.file)
  	return "range endpoints are in different files";
        if (start.line != finish.line)
--- 911,920 ----
  
        expanded_location start
  	= expand_location_to_spelling_point (src_range.m_start,
! 					     location_aspect::start);
        expanded_location finish
  	= expand_location_to_spelling_point (src_range.m_finish,
! 					     location_aspect::finish);
        if (start.file != finish.file)
  	return "range endpoints are in different files";
        if (start.line != finish.line)
diff -Nrcpad gcc-16-20250914/gcc/input.h gcc-16-20250921/gcc/input.h
*** gcc-16-20250914/gcc/input.h	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/input.h	Sun Sep 21 22:32:38 2025
*************** get_source_text_between (diagnostics::fi
*** 79,85 ****
  extern expanded_location
  expand_location_to_spelling_point (location_t,
  				   enum location_aspect aspect
! 				     = LOCATION_ASPECT_CARET);
  extern location_t expansion_point_location_if_in_system_header (location_t);
  extern location_t expansion_point_location (location_t);
  
--- 79,85 ----
  extern expanded_location
  expand_location_to_spelling_point (location_t,
  				   enum location_aspect aspect
! 				     = location_aspect::caret);
  extern location_t expansion_point_location_if_in_system_header (location_t);
  extern location_t expansion_point_location (location_t);
  
diff -Nrcpad gcc-16-20250914/gcc/ipa-cp.cc gcc-16-20250921/gcc/ipa-cp.cc
*** gcc-16-20250914/gcc/ipa-cp.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/ipa-cp.cc	Sun Sep 21 22:32:38 2025
*************** ipa_get_indirect_edge_target (struct cgr
*** 3289,3302 ****
  }
  
  /* Calculate devirtualization time bonus for NODE, assuming we know information
!    about arguments stored in AVALS.  */
  
! static int
  devirtualization_time_bonus (struct cgraph_node *node,
  			     ipa_auto_call_arg_values *avals)
  {
    struct cgraph_edge *ie;
!   int res = 0;
  
    for (ie = node->indirect_calls; ie; ie = ie->next_callee)
      {
--- 3289,3305 ----
  }
  
  /* Calculate devirtualization time bonus for NODE, assuming we know information
!    about arguments stored in AVALS.
  
!    FIXME: This function will also consider devirtualization of calls that are
!    known to be dead in the clone.  */
! 
! static sreal
  devirtualization_time_bonus (struct cgraph_node *node,
  			     ipa_auto_call_arg_values *avals)
  {
    struct cgraph_edge *ie;
!   sreal res = 0;
  
    for (ie = node->indirect_calls; ie; ie = ie->next_callee)
      {
*************** devirtualization_time_bonus (struct cgra
*** 3314,3320 ****
  	continue;
  
        /* Only bare minimum benefit for clearly un-inlineable targets.  */
!       res += 1;
        callee = cgraph_node::get (target);
        if (!callee || !callee->definition)
  	continue;
--- 3317,3323 ----
  	continue;
  
        /* Only bare minimum benefit for clearly un-inlineable targets.  */
!       int savings = 1;
        callee = cgraph_node::get (target);
        if (!callee || !callee->definition)
  	continue;
*************** devirtualization_time_bonus (struct cgra
*** 3331,3342 ****
        int max_inline_insns_auto
  	= opt_for_fn (callee->decl, param_max_inline_insns_auto);
        if (size <= max_inline_insns_auto / 4)
! 	res += 31 / ((int)speculative + 1);
        else if (size <= max_inline_insns_auto / 2)
! 	res += 15 / ((int)speculative + 1);
        else if (size <= max_inline_insns_auto
  	       || DECL_DECLARED_INLINE_P (callee->decl))
! 	res += 7 / ((int)speculative + 1);
      }
  
    return res;
--- 3334,3346 ----
        int max_inline_insns_auto
  	= opt_for_fn (callee->decl, param_max_inline_insns_auto);
        if (size <= max_inline_insns_auto / 4)
! 	savings += 31 / ((int)speculative + 1);
        else if (size <= max_inline_insns_auto / 2)
! 	savings += 15 / ((int)speculative + 1);
        else if (size <= max_inline_insns_auto
  	       || DECL_DECLARED_INLINE_P (callee->decl))
! 	savings += 7 / ((int)speculative + 1);
!       res = res + ie->combined_sreal_frequency () * (sreal) savings;
      }
  
    return res;
*************** estimate_local_effects (struct cgraph_no
*** 3624,3631 ****
    ipa_auto_call_arg_values avals;
    always_const = gather_context_independent_values (info, &avals, true,
  						    &removable_params_cost);
!   int devirt_bonus = devirtualization_time_bonus (node, &avals);
!   if (always_const || devirt_bonus
        || (removable_params_cost && clone_for_param_removal_p (node)))
      {
        struct caller_statistics stats;
--- 3628,3635 ----
    ipa_auto_call_arg_values avals;
    always_const = gather_context_independent_values (info, &avals, true,
  						    &removable_params_cost);
!   sreal devirt_bonus = devirtualization_time_bonus (node, &avals);
!   if (always_const || devirt_bonus > 0
        || (removable_params_cost && clone_for_param_removal_p (node)))
      {
        struct caller_statistics stats;
*************** update_counts_for_self_gen_clones (cgrap
*** 4697,4703 ****
  	  if (den > 0)
  	    for (cgraph_edge *e = cs; e; e = get_next_cgraph_edge_clone (e))
  	      if (e->callee->ultimate_alias_target () == orig_node
! 		  && processed_edges.contains (e))
  		e->count /= den;
  	}
      }
--- 4701,4714 ----
  	  if (den > 0)
  	    for (cgraph_edge *e = cs; e; e = get_next_cgraph_edge_clone (e))
  	      if (e->callee->ultimate_alias_target () == orig_node
! 		  && processed_edges.contains (e)
! 		  /* If count is not IPA, this adjustment makes verifier
! 		     unhappy, since we expect bb->count to match e->count.
! 		     We may add a flag to mark edge conts that has been
! 		     modified by IPA code, but so far it does not seem
! 		     to be worth the effort.  With local counts the profile
! 		     will not propagate at IPA level.  */
! 		  && e->count.ipa_p ())
  		e->count /= den;
  	}
      }
diff -Nrcpad gcc-16-20250914/gcc/ipa-devirt.cc gcc-16-20250921/gcc/ipa-devirt.cc
*** gcc-16-20250914/gcc/ipa-devirt.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/ipa-devirt.cc	Sun Sep 21 22:32:38 2025
*************** ipa_devirt (void)
*** 3694,3700 ****
        for (e = n->indirect_calls; e; e = e->next_callee)
  	if (e->indirect_info->polymorphic)
  	  {
- 	    struct cgraph_node *likely_target = NULL;
  	    void *cache_token;
  	    bool final;
  
--- 3694,3699 ----
*************** ipa_devirt (void)
*** 3765,3784 ****
  		nmultiple++;
  		continue;
  	      }
  	    for (i = 0; i < targets.length (); i++)
  	      if (likely_target_p (targets[i]))
  		{
! 		  if (likely_target)
  		    {
! 		      likely_target = NULL;
  		      if (dump_file)
! 			fprintf (dump_file, "More than one likely target\n\n");
  		      nmultiple++;
  		      break;
  		    }
! 		  likely_target = targets[i];
  		}
! 	    if (!likely_target)
  	      {
  		bad_call_targets.add (cache_token);
  	        continue;
--- 3764,3785 ----
  		nmultiple++;
  		continue;
  	      }
+ 	    auto_vec <cgraph_node *, 20> likely_targets;
  	    for (i = 0; i < targets.length (); i++)
  	      if (likely_target_p (targets[i]))
  		{
! 		  if ((int)likely_targets.length () >= param_max_devirt_targets)
  		    {
! 		      likely_targets.truncate (0);
  		      if (dump_file)
! 			fprintf (dump_file, "More than %i likely targets\n\n",
! 				 param_max_devirt_targets);
  		      nmultiple++;
  		      break;
  		    }
! 		  likely_targets.safe_push (targets[i]);
  		}
! 	    if (!likely_targets.length ())
  	      {
  		bad_call_targets.add (cache_token);
  	        continue;
*************** ipa_devirt (void)
*** 3787,3793 ****
   	       with the speculation.  */
  	    if (e->speculative)
  	      {
! 		bool found = e->speculative_call_for_target (likely_target);
  		if (found)
  		  {
  		    fprintf (dump_file, "We agree with speculation\n\n");
--- 3788,3800 ----
   	       with the speculation.  */
  	    if (e->speculative)
  	      {
! 		bool found = false;
! 		for (cgraph_node * likely_target: likely_targets)
! 		  if (e->speculative_call_for_target (likely_target))
! 		    {
! 		      found = true;
! 		      break;
! 		    }
  		if (found)
  		  {
  		    fprintf (dump_file, "We agree with speculation\n\n");
*************** ipa_devirt (void)
*** 3800,3862 ****
  		  }
  		continue;
  	      }
! 	    if (!likely_target->definition)
! 	      {
! 		if (dump_file)
! 		  fprintf (dump_file, "Target is not a definition\n\n");
! 		nnotdefined++;
! 		continue;
! 	      }
! 	    /* Do not introduce new references to external symbols.  While we
! 	       can handle these just well, it is common for programs to
! 	       incorrectly with headers defining methods they are linked
! 	       with.  */
! 	    if (DECL_EXTERNAL (likely_target->decl))
! 	      {
! 		if (dump_file)
! 		  fprintf (dump_file, "Target is external\n\n");
! 		nexternal++;
! 		continue;
! 	      }
! 	    /* Don't use an implicitly-declared destructor (c++/58678).  */
! 	    struct cgraph_node *non_thunk_target
! 	      = likely_target->function_symbol ();
! 	    if (DECL_ARTIFICIAL (non_thunk_target->decl))
! 	      {
! 		if (dump_file)
! 		  fprintf (dump_file, "Target is artificial\n\n");
! 		nartificial++;
! 		continue;
! 	      }
! 	    if (likely_target->get_availability () <= AVAIL_INTERPOSABLE
! 		&& likely_target->can_be_discarded_p ())
! 	      {
! 		if (dump_file)
! 		  fprintf (dump_file, "Target is overwritable\n\n");
! 		noverwritable++;
! 		continue;
! 	      }
! 	    else if (dbg_cnt (devirt))
  	      {
! 		if (dump_enabled_p ())
!                   {
!                     dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, e->call_stmt,
! 				     "speculatively devirtualizing call "
! 				     "in %s to %s\n",
! 				     n->dump_name (),
! 				     likely_target->dump_name ());
!                   }
! 		if (!likely_target->can_be_discarded_p ())
  		  {
! 		    cgraph_node *alias;
! 		    alias = dyn_cast<cgraph_node *> (likely_target->noninterposable_alias ());
! 		    if (alias)
! 		      likely_target = alias;
  		  }
! 		nconverted++;
! 		update = true;
! 		e->make_speculative
! 		  (likely_target, e->count.apply_scale (8, 10));
  	      }
  	  }
        if (update)
--- 3807,3885 ----
  		  }
  		continue;
  	      }
! 	    bool first = true;
! 	    unsigned speculative_id = 0;
! 	    for (cgraph_node * likely_target: likely_targets)
  	      {
! 		if (!likely_target->definition)
  		  {
! 		    if (dump_file)
! 		      fprintf (dump_file, "Target is not a definition\n\n");
! 		    nnotdefined++;
! 		    continue;
  		  }
! 		/* Do not introduce new references to external symbols.  While we
! 		   can handle these just well, it is common for programs to
! 		   incorrectly with headers defining methods they are linked
! 		   with.  */
! 		if (DECL_EXTERNAL (likely_target->decl))
! 		  {
! 		    if (dump_file)
! 		      fprintf (dump_file, "Target is external\n\n");
! 		    nexternal++;
! 		    continue;
! 		  }
! 		/* Don't use an implicitly-declared destructor (c++/58678).  */
! 		struct cgraph_node *non_thunk_target
! 		  = likely_target->function_symbol ();
! 		if (DECL_ARTIFICIAL (non_thunk_target->decl))
! 		  {
! 		    if (dump_file)
! 		      fprintf (dump_file, "Target is artificial\n\n");
! 		    nartificial++;
! 		    continue;
! 		  }
! 		if (likely_target->get_availability () <= AVAIL_INTERPOSABLE
! 		    && likely_target->can_be_discarded_p ())
! 		  {
! 		    if (dump_file)
! 		      fprintf (dump_file, "Target is overwritable\n\n");
! 		    noverwritable++;
! 		    continue;
! 		  }
! 		else if (dbg_cnt (devirt))
! 		  {
! 		    if (dump_enabled_p ())
! 		      {
! 			dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, e->call_stmt,
! 					 "speculatively devirtualizing call "
! 					 "in %s to %s\n",
! 					 n->dump_name (),
! 					 likely_target->dump_name ());
! 		      }
! 		    if (!likely_target->can_be_discarded_p ())
! 		      {
! 			cgraph_node *alias;
! 			alias = dyn_cast<cgraph_node *> (likely_target->noninterposable_alias ());
! 			if (alias)
! 			  likely_target = alias;
! 		      }
! 		    if (first)
! 		      nconverted++;
! 		    first = false;
! 		    update = true;
! 		    e->make_speculative
! 		      (likely_target,
! 		       e->count.apply_scale (8, 10 * likely_targets.length ()),
! 		       speculative_id++);
! 		  }
! 	      }
! 	    if (speculative_id > 1 && dump_enabled_p ())
! 	      {
! 		dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, e->call_stmt,
! 				 "devirtualized call in %s to %i targets\n",
! 				 n->dump_name (),
! 				 speculative_id);
  	      }
  	  }
        if (update)
diff -Nrcpad gcc-16-20250914/gcc/ipa-fnsummary.cc gcc-16-20250921/gcc/ipa-fnsummary.cc
*** gcc-16-20250914/gcc/ipa-fnsummary.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/ipa-fnsummary.cc	Sun Sep 21 22:32:38 2025
*************** estimate_edge_devirt_benefit (struct cgr
*** 3543,3555 ****
    if (!opt_for_fn (ie->caller->decl, flag_indirect_inlining))
      return false;
  
!   target = ipa_get_indirect_edge_target (ie, avals, &speculative);
    if (!target || speculative)
      return false;
  
!   /* Account for difference in cost between indirect and direct calls.  */
!   *size -= (eni_size_weights.indirect_call_cost - eni_size_weights.call_cost);
!   *time -= (eni_time_weights.indirect_call_cost - eni_time_weights.call_cost);
    gcc_checking_assert (*time >= 0);
    gcc_checking_assert (*size >= 0);
  
--- 3543,3568 ----
    if (!opt_for_fn (ie->caller->decl, flag_indirect_inlining))
      return false;
  
!   target = ipa_get_indirect_edge_target
!     (ie->callee ? ie->speculative_call_indirect_edge () : ie,
!      avals, &speculative);
    if (!target || speculative)
      return false;
  
!   /* If this is speculative call, turn its cost into 0; we will account
!      the call when processing the indirect call.  */
!   if (ie->callee)
!     {
!       gcc_checking_assert (ie->speculative && *size > 0);
!       *size = 0;
!       *time = 0;
!     }
!   else
!     {
!       /* Account for difference in cost between indirect and direct calls.  */
!       *size -= (eni_size_weights.indirect_call_cost - eni_size_weights.call_cost);
!       *time -= (eni_time_weights.indirect_call_cost - eni_time_weights.call_cost);
!     }
    gcc_checking_assert (*time >= 0);
    gcc_checking_assert (*size >= 0);
  
*************** estimate_edge_size_and_time (struct cgra
*** 3581,3589 ****
    int call_time = es->call_stmt_time;
    int cur_size;
  
!   if (!e->callee && hints && e->maybe_hot_p ()
        && estimate_edge_devirt_benefit (e, &call_size, &call_time, avals))
!     *hints |= INLINE_HINT_indirect_call;
    cur_size = call_size * ipa_fn_summary::size_scale;
    *size += cur_size;
    if (min_size)
--- 3594,3605 ----
    int call_time = es->call_stmt_time;
    int cur_size;
  
!   if ((!e->callee || e->speculative)
        && estimate_edge_devirt_benefit (e, &call_size, &call_time, avals))
!     {
!       if (hints && e->maybe_hot_p ())
! 	*hints |= INLINE_HINT_indirect_call;
!     }
    cur_size = call_size * ipa_fn_summary::size_scale;
    *size += cur_size;
    if (min_size)
*************** estimate_calls_size_and_time (struct cgr
*** 3712,3723 ****
      use_table = false;
    /* Do not calculate summaries for simple wrappers; it is waste
       of memory.  */
!   else if (node->callees && node->indirect_calls
             && node->callees->inline_failed && !node->callees->next_callee)
      use_table = false;
    /* If there is an indirect edge that may be optimized, we need
       to go the slow way.  */
!   else if (avals && hints
  	   && (avals->m_known_vals.length ()
  	       || avals->m_known_contexts.length ()
  	       || avals->m_known_aggs.length ()))
--- 3728,3739 ----
      use_table = false;
    /* Do not calculate summaries for simple wrappers; it is waste
       of memory.  */
!   else if (node->callees && !node->indirect_calls
             && node->callees->inline_failed && !node->callees->next_callee)
      use_table = false;
    /* If there is an indirect edge that may be optimized, we need
       to go the slow way.  */
!   else if (avals
  	   && (avals->m_known_vals.length ()
  	       || avals->m_known_contexts.length ()
  	       || avals->m_known_aggs.length ()))
diff -Nrcpad gcc-16-20250914/gcc/ipa-inline-transform.cc gcc-16-20250921/gcc/ipa-inline-transform.cc
*** gcc-16-20250914/gcc/ipa-inline-transform.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/ipa-inline-transform.cc	Sun Sep 21 22:32:38 2025
*************** master_clone_with_noninline_clones_p (st
*** 142,153 ****
     DUPLICATE is used for bookkeeping on whether we are actually creating new
     clones or re-using node originally representing out-of-line function call.
     By default the offline copy is removed, when it appears dead after inlining.
!    UPDATE_ORIGINAL prevents this transformation.
     If OVERALL_SIZE is non-NULL, the size is updated to reflect the
     transformation.  */
  
  void
  clone_inlined_nodes (struct cgraph_edge *e, bool duplicate,
  		     bool update_original, int *overall_size)
  {
    struct cgraph_node *inlining_into;
--- 142,155 ----
     DUPLICATE is used for bookkeeping on whether we are actually creating new
     clones or re-using node originally representing out-of-line function call.
     By default the offline copy is removed, when it appears dead after inlining.
!    KEEP_OFFLINE_COPY prevents this transformation.
!    If UPDATE_ORIGINAL is set, clones profile is subtracted from the offline version.
     If OVERALL_SIZE is non-NULL, the size is updated to reflect the
     transformation.  */
  
  void
  clone_inlined_nodes (struct cgraph_edge *e, bool duplicate,
+ 		     bool keep_offline_copy,
  		     bool update_original, int *overall_size)
  {
    struct cgraph_node *inlining_into;
*************** clone_inlined_nodes (struct cgraph_edge
*** 167,173 ****
        if (!e->callee->callers->next_caller
  	  /* Recursive inlining never wants the master clone to
  	     be overwritten.  */
! 	  && update_original
  	  && can_remove_node_now_p (e->callee, e)
  	  /* We cannot overwrite a master clone with non-inline clones
  	     until after these clones are materialized.  */
--- 169,175 ----
        if (!e->callee->callers->next_caller
  	  /* Recursive inlining never wants the master clone to
  	     be overwritten.  */
! 	  && !keep_offline_copy
  	  && can_remove_node_now_p (e->callee, e)
  	  /* We cannot overwrite a master clone with non-inline clones
  	     until after these clones are materialized.  */
*************** clone_inlined_nodes (struct cgraph_edge
*** 228,234 ****
      {
        next = e->next_callee;
        if (!e->inline_failed)
!         clone_inlined_nodes (e, duplicate, update_original, overall_size);
      }
  }
  
--- 230,237 ----
      {
        next = e->next_callee;
        if (!e->inline_failed)
!         clone_inlined_nodes (e, duplicate, keep_offline_copy,
! 			     update_original, overall_size);
      }
  }
  
*************** mark_all_inlined_calls_cdtor (cgraph_nod
*** 306,312 ****
  
  
  /* Mark edge E as inlined and update callgraph accordingly.  UPDATE_ORIGINAL
!    specify whether profile of original function should be updated.  If any new
     indirect edges are discovered in the process, add them to NEW_EDGES, unless
     it is NULL. If UPDATE_OVERALL_SUMMARY is false, do not bother to recompute overall
     size of caller after inlining. Caller is required to eventually do it via
--- 309,316 ----
  
  
  /* Mark edge E as inlined and update callgraph accordingly.  UPDATE_ORIGINAL
!    specify whether profile of original function should be updated and whether
!    offline copy should be removed if unnecesary.  If any new
     indirect edges are discovered in the process, add them to NEW_EDGES, unless
     it is NULL. If UPDATE_OVERALL_SUMMARY is false, do not bother to recompute overall
     size of caller after inlining. Caller is required to eventually do it via
*************** inline_call (struct cgraph_edge *e, bool
*** 328,333 ****
--- 332,338 ----
    bool comdat_local = e->callee->comdat_local_p ();
    struct cgraph_node *callee = e->callee->ultimate_alias_target ();
    bool new_edges_found = false;
+   bool keep_offline_copy = !update_original;
  
    int estimated_growth = 0;
    if (! update_overall_summary)
*************** inline_call (struct cgraph_edge *e, bool
*** 379,384 ****
--- 384,412 ----
  	  fprintf (dump_file, "\n");
  	}
      }
+   /* Do sanity checking of the profile and in case of inconsistencies do not
+      update profile of original.  This reduces the chances that inlining
+      turns callee cold while in reality it is still hot.  */
+   if (!(callee->count.ipa ().force_nonzero () == callee->count.ipa ()))
+     {
+       if (dump_file)
+ 	fprintf (dump_file, "Callee count is 0; not updating callee profile\n");
+       update_original = false;
+     }
+   else if (e->count.ipa ().quality () == AFDO
+ 	   && !(e->count.ipa ().force_nonzero () == e->count.ipa ()))
+     {
+       if (dump_file)
+ 	fprintf (dump_file, "Edge count is AFDO 0; not updating callee profile\n");
+       update_original = false;
+     }
+   if (e->count.ipa () > callee->count.ipa ().apply_scale (9, 8))
+     {
+       if (dump_file)
+ 	fprintf (dump_file, "Calee count is too small (profile is inconsistent);"
+ 		 " not updating callee profile\n");
+       update_original = false;
+     }
    if (to->thunk)
      {
        struct cgraph_node *target = to->callees->callee;
*************** inline_call (struct cgraph_edge *e, bool
*** 530,536 ****
  	}
      }
  
!   clone_inlined_nodes (e, true, update_original, overall_size);
  
    gcc_assert (curr->callee->inlined_to == to);
  
--- 558,565 ----
  	}
      }
  
!   clone_inlined_nodes (e, true, keep_offline_copy,
! 		       update_original, overall_size);
  
    gcc_assert (curr->callee->inlined_to == to);
  
diff -Nrcpad gcc-16-20250914/gcc/ipa-inline.cc gcc-16-20250921/gcc/ipa-inline.cc
*** gcc-16-20250914/gcc/ipa-inline.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/ipa-inline.cc	Sun Sep 21 22:32:38 2025
*************** recursive_inlining (struct cgraph_edge *
*** 1860,1866 ****
  	    false, vNULL, true, NULL, NULL, NULL);
  	  for (e = master_clone->callees; e; e = e->next_callee)
  	    if (!e->inline_failed)
! 	      clone_inlined_nodes (e, true, false, NULL);
  	  curr->redirect_callee (master_clone);
  	  if (edge_growth_cache != NULL)
  	    edge_growth_cache->remove (curr);
--- 1860,1866 ----
  	    false, vNULL, true, NULL, NULL, NULL);
  	  for (e = master_clone->callees; e; e = e->next_callee)
  	    if (!e->inline_failed)
! 	      clone_inlined_nodes (e, true, true, false, NULL);
  	  curr->redirect_callee (master_clone);
  	  if (edge_growth_cache != NULL)
  	    edge_growth_cache->remove (curr);
diff -Nrcpad gcc-16-20250914/gcc/ipa-inline.h gcc-16-20250921/gcc/ipa-inline.h
*** gcc-16-20250914/gcc/ipa-inline.h	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/ipa-inline.h	Sun Sep 21 22:32:38 2025
*************** bool inline_account_function_p (struct c
*** 61,67 ****
  bool inline_call (struct cgraph_edge *, bool, vec<cgraph_edge *> *, int *, bool,
  		  bool *callee_removed = NULL);
  unsigned int inline_transform (struct cgraph_node *);
! void clone_inlined_nodes (struct cgraph_edge *e, bool, bool, int *);
  
  extern int ncalls_inlined;
  extern int nfunctions_inlined;
--- 61,67 ----
  bool inline_call (struct cgraph_edge *, bool, vec<cgraph_edge *> *, int *, bool,
  		  bool *callee_removed = NULL);
  unsigned int inline_transform (struct cgraph_node *);
! void clone_inlined_nodes (struct cgraph_edge *e, bool, bool, bool, int *);
  
  extern int ncalls_inlined;
  extern int nfunctions_inlined;
diff -Nrcpad gcc-16-20250914/gcc/ira.cc gcc-16-20250921/gcc/ira.cc
*** gcc-16-20250914/gcc/ira.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/ira.cc	Sun Sep 21 22:32:38 2025
*************** setup_reg_equiv (void)
*** 4233,4244 ****
  			    && REGNO (SET_SRC (set)) == (unsigned int) i);
  		x = SET_DEST (set);
  	      }
! 	    if (! function_invariant_p (x)
  		|| ! flag_pic
  		/* A function invariant is often CONSTANT_P but may
  		   include a register.  We promise to only pass
  		   CONSTANT_P objects to LEGITIMATE_PIC_OPERAND_P.  */
! 		|| (CONSTANT_P (x) && LEGITIMATE_PIC_OPERAND_P (x)))
  	      {
  		/* It can happen that a REG_EQUIV note contains a MEM
  		   that is not a legitimate memory operand.  As later
--- 4233,4246 ----
  			    && REGNO (SET_SRC (set)) == (unsigned int) i);
  		x = SET_DEST (set);
  	      }
! 	    /* If PIC is enabled and the equiv is not a LEGITIMATE_PIC_OPERAND,
! 	       we can't use it.  */
! 	    if (! CONSTANT_P (x)
  		|| ! flag_pic
  		/* A function invariant is often CONSTANT_P but may
  		   include a register.  We promise to only pass
  		   CONSTANT_P objects to LEGITIMATE_PIC_OPERAND_P.  */
! 		|| LEGITIMATE_PIC_OPERAND_P (x))
  	      {
  		/* It can happen that a REG_EQUIV note contains a MEM
  		   that is not a legitimate memory operand.  As later
diff -Nrcpad gcc-16-20250914/gcc/libgdiagnostics.cc gcc-16-20250921/gcc/libgdiagnostics.cc
*** gcc-16-20250914/gcc/libgdiagnostics.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/libgdiagnostics.cc	Sun Sep 21 22:32:38 2025
*************** along with GCC; see the file COPYING3.
*** 37,42 ****
--- 37,43 ----
  #include "diagnostics/digraphs.h"
  #include "diagnostics/state-graphs.h"
  #include "diagnostics/logical-locations.h"
+ #include "diagnostics/dumping.h"
  #include "diagnostics/changes.h"
  #include "libgdiagnostics.h"
  #include "libgdiagnostics-private.h"
*************** public:
*** 478,483 ****
--- 479,490 ----
      return key::from_ptr (ptr);
    }
  
+   void dump (FILE *outfile, int indent) const final override
+   {
+     diagnostics::dumping::emit_heading
+       (outfile, indent, "impl_logical_location_manager");
+   }
+ 
    const char *get_short_name (key k) const final override
    {
      if (auto loc = ptr_from_key (k))
diff -Nrcpad gcc-16-20250914/gcc/m2/ChangeLog gcc-16-20250921/gcc/m2/ChangeLog
*** gcc-16-20250914/gcc/m2/ChangeLog	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/ChangeLog	Sun Sep 21 22:32:38 2025
***************
*** 1,3 ****
--- 1,356 ----
+ 2025-09-20  Gaius Mulley  <gaiusmod2@gmail.com>
+ 
+ 	PR modula2/122009
+ 	* gm2-compiler/M2GenGCC.mod (FromM2WIDESETImport): Assign
+ 	sym to NulSym.
+ 	(CodeMakeAdr): Remove fourth parameter to BuildLogicalOrAddress.
+ 	(FoldMakeAdr): Ditto.
+ 	* gm2-compiler/M2Quads.mod (BuildAssignmentBoolean): Remove
+ 	unused parameter checkTypes.
+ 	(doBuildAssignment): Remove checkTypes parameter when calling
+ 	BuildAssignmentBoolean.
+ 	* gm2-gcc/m2expr.def (BuildLogicalOrAddress): Remove
+ 	needconvert parameter.
+ 	* gm2-gcc/m2statement.def (IfExprJump): Change label type
+ 	to CharStar.
+ 	* gm2-gcc/m2type.cc (m2type_BuildEnumerator): Remove const.
+ 	* gm2-gcc/m2type.h (m2type_BuildEnumerator): Ditto.
+ 
+ 2025-09-19  Gaius Mulley  <gaiusmod2@gmail.com>
+ 
+ 	PR modula2/121856
+ 	* Make-lang.in (GM2-LIBS-BOOT-DEFS): Add M2Diagnostic.def.
+ 	Add Selective.def.
+ 	(GM2-LIBS-BOOT-MODS): Add M2Diagnostic.mod.
+ 	(GM2-LIBS-BOOT-C): Add Selective.c.
+ 	(GM2-LIBS-DEFS): Add Selective.def.
+ 	(GM2-LIBS-MODS): Add M2Diagnostic.mod.
+ 	(MC-LIB-MODS): Add M2Diagnostic.mod.
+ 	(m2/gm2-libs-boot/Selective.o): New rule.
+ 	(BUILD-PGE-O): Add m2/pge-boot/GM2Diagnostic.o.
+ 	Add m2/pge-boot/GM2Diagnostic.o.
+ 	Add m2/pge-boot/GStringConvert.o.
+ 	Add m2/pge-boot/Gdtoa.o.
+ 	Add m2/pge-boot/Gldtoa.o.
+ 	* Make-maintainer.in (PPG-LIB-DEFS): Add M2Diagnostic.def.
+ 	Add StringConvert.def.
+ 	(PPG-LIB-MODS): Add M2Diagnostic.mod.
+ 	Add StringConvert.mod.
+ 	(PGE-DEF): Add M2Diagnostic.def.
+ 	(PGE-DEPS): Add GM2Diagnostic.cc.
+ 	Add GM2Diagnostic.h.
+ 	* gm2-compiler/FifoQueue.def (PutSetIntoFifoQueue): New
+ 	procedure.
+ 	(GetSetFromFifoQueue): New procedure function.
+ 	* gm2-compiler/FifoQueue.mod (PutSetIntoFifoQueue): New
+ 	procedure.
+ 	(GetSetFromFifoQueue): New procedure function.
+ 	* gm2-compiler/M2ALU.def (KillValue): New procedure.
+ 	(PushSetTree): Rename parameter t to value.
+ 	(ConstructSetConstant): Rewrite comment.
+ 	* gm2-compiler/M2ALU.mod: Rewrite to use the new set type
+ 	and introduce memory diagnostics.
+ 	* gm2-compiler/M2Base.mod (InitBaseProcedures): Lookup M2WIDESET.
+ 	* gm2-compiler/M2CaseList.mod (CheckCaseBoundsResolved): Change
+ 	format specifier to allow the preceeding indefinite article to
+ 	have a n concatenated providing the following string substitute
+ 	begins with a vowel.
+ 	(checkTypes): Ditto.
+ 	* gm2-compiler/M2Check.mod (checkGenericUnboundedTyped): New
+ 	procedure function.
+ 	* gm2-compiler/M2Code.mod (OptimizationAnalysis): Replace with ...
+ 	(ResourceAnalysis): ... this.
+ 	* gm2-compiler/M2Comp.mod (PopulateResource): New procedure.
+ 	(compile): Call PopulateResource.
+ 	Call M2Diagnostic.Generate.
+ 	* gm2-compiler/M2GCCDeclare.mod: Rewrite for new set type.
+ 	* gm2-compiler/M2GenGCC.mod: Rewrite implementation for
+ 	becomes, incl, excl, and, or, not, xor for the new set type.
+ 	* gm2-compiler/M2MetaError.def: Extend comment documenting
+ 	the v format specifier.
+ 	* gm2-compiler/M2MetaError.mod (errorBlock): New field vowel.
+ 	(initErrorBlock): Initialize field vowel.
+ 	Reformat comments.
+ 	(pop): Call checkVowel.
+ 	(checkVowel): New procedure.
+ 	(isVowel): New procedure function.
+ 	(symDesc): Remove indefinite article.
+ 	(op): Set vowel field in case clause.
+ 	* gm2-compiler/M2Options.def (OptimizeSets): New global.
+ 	(TimeReport): Ditto.
+ 	(MemReport): Ditto.
+ 	(SetMemReport): New procedure.
+ 	(SetTimeReport): Ditto.
+ 	(SetWideset): Ditto.
+ 	(GetWideset): New procedure function.
+ 	* gm2-compiler/M2Options.mod (SetOptimizing): Assign
+ 	OptimizeSets depending upon the optimization level.
+ 	(SetMemReport): New procedure.
+ 	(SetTimeReport): Ditto.
+ 	(SetWideset): Ditto.
+ 	(GetWideset): New procedure function.
+ 	(OptimizeSets): Initialize to FALSE.
+ 	(TimeReport): Ditto.
+ 	(MemReport): Ditto.
+ 	* gm2-compiler/M2Quads.mod (M2Diagnostic): Import.
+ 	(QuadsMemDiag): New global variable.
+ 	(NewQuad): Bump QuadsMemDiag whenever a quad is allocated.
+ 	(BuildAssignmentBoolean): New procedure.
+ 	(doBuildAssignment): Ditto.
+ 	Add v to the format specifier.
+ 	(CheckCompatibleWithBecomes): Add v to the format specifier.
+ 	(CheckProcTypeAndProcedure): Ditto.
+ 	(BuildAddAdrFunction): Ditto.
+ 	(BuildSubAdrFunction): Ditto.
+ 	(BuildDifAdrFunction): Ditto.
+ 	(BuildDesignatorArrayStaticDynamic): Ditto.
+ 	(BuildDesignatorPointer): Ditto.
+ 	(CheckVariableOrConstantOrProcedure): Ditto.
+ 	(Init): Initialize QuadsMemDiag.
+ 	* gm2-compiler/M2Range.mod (CodeTypeAssign): Add v to the
+ 	format specifier.
+ 	* gm2-compiler/M2Scaffold.mod (DeclareScaffoldFunctions):
+ 	Generate more precise warning note.
+ 	* gm2-compiler/M2SymInit.mod (PrintSymInit): Add record
+ 	field warning.
+ 	* gm2-compiler/M2System.mod
+ 	(IsPseudoSystemFunctionConstExpression): Add TBitSize.
+ 	* gm2-compiler/NameKey.mod: Add MemDiagnostic code
+ 	commented out.
+ 	* gm2-compiler/P1SymBuild.mod (StartBuildProcedure):
+ 	Add v format specifier.
+ 	* gm2-compiler/P2SymBuild.mod (BuildFieldRecord): Ditto.
+ 	* gm2-compiler/P3Build.bnf (SetType): Reformat.
+ 	* gm2-compiler/PathName.def (Copyright): Added.
+ 	* gm2-compiler/PathName.mod: Remove blank line.
+ 	* gm2-compiler/SymbolConversion.mod (gdbhook): New procedure.
+ 	(BreakWhenSymBooked): Ditto.
+ 	(CheckBook): Ditto.
+ 	(Init): Rewrite.
+ 	* gm2-compiler/SymbolTable.def (GetSetArray): New procedure.
+ 	(PutSetArray): Ditto.
+ 	(MakeSetArray): New procedure function.
+ 	(PutSetInWord): New procedure.
+ 	(GetSetInWord): New procedure function.
+ 	(IsConstVar): Ditto.
+ 	* gm2-compiler/SymbolTable.mod (SymSet): SetInWord new field.
+ 	SetArray new field.
+ 	Align new field.
+ 	(SymMemDiag): New global variable.
+ 	(Init): Initialize SymMemDiag.
+ 	(IsConstVar): New procedure function.
+ 	(IsVariableSSA): Replace InternalError with Return FALSE.
+ 	(GetNthParamOrdered): Reimplement.
+ 	(GetNthParamAnyClosest): Ditto.
+ 	(GetOuterModuleScope): Ditto.
+ 	(MakeSet): Ditto.
+ 	(PutSetArray): New procedure.
+ 	(GetSetArray): New procedure function.
+ 	(MakeSetArray): Ditto.
+ 	(PutSetInWord): New procedure.
+ 	(GetSetInWord): New procedure function.
+ 	* gm2-gcc/init.cc (_M2_M2Diagnostic_init): Define
+ 	prototype.
+ 	(init_FrontEndInit):Call _M2_M2Diagnostic_init.
+ 	* gm2-gcc/m2block.cc (m2block_GetTotalConstants): New function.
+ 	(m2block_GetGlobalTypes): Ditto.
+ 	* gm2-gcc/m2block.def (GetTotalConstants): New procedure function.
+ 	(GetGlobalTypes): New procedure function.
+ 	* gm2-gcc/m2block.h (m2block_GetTotalConstants): New function
+ 	prototype.
+ 	(m2block_GetGlobalTypes): Ditto.
+ 	* gm2-gcc/m2convert.cc (converting_ISO_generic): Reimplement.
+ 	(m2convert_ToPIMByte): New function.
+ 	* gm2-gcc/m2convert.def (ToLoc): New procedure function.
+ 	(ToPIMByte): Ditto.
+ 	* gm2-gcc/m2convert.h (m2convert_ToPIMByte): Ditto.
+ 	* gm2-gcc/m2decl.h (m2decl_RememberVariables): Ditto.
+ 	* gm2-gcc/m2expr.cc (m2expr_BuildLogicalShift): Reimplement.
+ 	(m2expr_BuildLRotate): Ditto.
+ 	(m2expr_BuildLRLn): Ditto.
+ 	(m2expr_BuildLRRn): Ditto.
+ 	(m2expr_BuildLogicalRotate): Ditto.
+ 	(buildUnboundedArrayOf): Ditto.
+ 	(BuildIfBitInSetLower): New function.
+ 	(m2expr_BuildBinarySetDo): Reimplement.
+ 	(m2expr_BuildIfInSet): Ditto.
+ 	(m2expr_BuildIfNotInSet): New function.
+ 	(m2expr_Build4LogicalOr): Reimplement.
+ 	(m2expr_BuildSetNegate): Ditto.
+ 	(m2expr_BuildLogicalOrAddress): Ditto.
+ 	(m2expr_BuildLogicalOr): Ditto.
+ 	(m2expr_BuildLogicalAnd): Ditto.
+ 	(m2expr_BuildSymmetricDifference): Ditto.
+ 	(m2expr_BuildLogicalDifference): Ditto.
+ 	(boolean_enum_to_unsigned): Ditto.
+ 	(m2expr_BuildIsSuperset): Ditto.
+ 	(m2expr_BuildIsNotSuperset): Ditto.
+ 	(m2expr_BuildIsSubset): Ditto.
+ 	(m2expr_BuildIfBitInSetJump): Ditto.
+ 	(m2expr_BuildIfNotConstInVar): Ditto.
+ 	(m2expr_BuildIfVarInVar): Ditto.
+ 	(m2expr_BuildIfNotVarInVar): Remove.
+ 	(m2expr_BuildIfConstInVar): Remove.
+ 	(m2expr_BuildForeachWordInSetDoIfExpr): Ditto.
+ 	(m2expr_BuildBinaryForeachWordDo): Ditto.
+ 	(m2expr_BuildIfInRangeGoto): Reimplement.
+ 	(m2expr_BuildIfNotInRangeGoto): Ditto.
+ 	(m2expr_SetAndNarrow): Ditto.
+ 	(m2expr_GetBitsetZero): New function.
+ 	(m2expr_GetRValue): Ditto.
+ 	* gm2-gcc/m2expr.def (GetBitsetZero): New function.
+ 	(BuildSetNegate): Ditto.
+ 	(BuildLogicalOr): Reimplement.
+ 	(BuildLogicalAnd): Ditto.
+ 	(BuildSymmetricDifference): Ditto.
+ 	(BuildLogicalDifference): Ditto.
+ 	(BuildIfInSet): New procedure function.
+ 	(BuildIfNotInSet): Ditto.
+ 	(BuildEqualTo): Reimplement.
+ 	(BuildNotEqualTo): Ditto.
+ 	(BuildBinaryForeachWordDo): Remove.
+ 	(BuildBinarySetDo): Ditto.
+ 	(GetRValue): New procedure function.
+ 	* gm2-gcc/m2expr.h (m2expr_BuildBinaryForeachWordDo): Remove.
+ 	(m2expr_BuildForeachWordInSetDoIfExpr): Ditto.
+ 	(m2expr_BuildIfNotVarInVar): Ditto.
+ 	(m2expr_BuildIfVarInVar): Ditto.
+ 	(m2expr_BuildIfNotConstInVar): Ditto.
+ 	(m2expr_BuildIfConstInVar): Ditto.
+ 	(m2expr_BuildLogicalDifference): Reimplement.
+ 	(m2expr_BuildSymmetricDifference): Ditto.
+ 	(m2expr_BuildLogicalAnd): Ditto.
+ 	(m2expr_BuildLogicalOr): Ditto.
+ 	(m2expr_BuildLogicalOrAddress): Ditto.
+ 	(m2expr_BuildSetNegate): Ditto.
+ 	(m2expr_GetBitsetZero): New function.
+ 	(m2expr_GetRValue): Ditto.
+ 	(m2expr_BuildIfInSet): Ditto.
+ 	(m2expr_BuildIfNotInSet): Ditto.
+ 	* gm2-gcc/m2options.h (M2Options_SetTimeReport): New function.
+ 	(M2Options_SetMemReport): Ditto.
+ 	(M2Options_SetWideset): Ditto.
+ 	(M2Options_GetWideset): Ditto.
+ 	* gm2-gcc/m2pp.cc (m2pp_shiftrotate_expr): New function.
+ 	(m2pp_simple_expression): Ditto.
+ 	* gm2-gcc/m2statement.cc (m2statement_BuildStartFunctionCode):
+ 	Tidyup comments.
+ 	(m2statement_BuildEndFunctionCode): Ditto.
+ 	(m2statement_BuildPushFunctionContext): Ditto.
+ 	(copy_array): Ditto.
+ 	(CopyByField_Lower): Ditto.
+ 	(m2statement_BuildGoto): Ditto.
+ 	(m2statement_DeclareLabel): Ditto.
+ 	(m2statement_BuildParam): Ditto.
+ 	(nCount): Ditto.
+ 	(m2statement_BuildProcedureCallTree): Ditto.
+ 	(m2statement_BuildBuiltinCallTree): Ditto.
+ 	(m2statement_BuildFunctValue): Ditto.
+ 	(m2statement_BuildCall2): Ditto.
+ 	(m2statement_BuildCall3): Ditto.
+ 	(m2statement_BuildFunctionCallTree): Ditto.
+ 	(m2statement_SetLastFunction): Ditto.
+ 	(m2statement_SetParamList): Ditto.
+ 	(m2statement_GetLastFunction): Ditto.
+ 	(m2statement_GetParamList): Ditto.
+ 	(m2statement_GetCurrentFunction): Ditto.
+ 	(m2statement_GetParamTree): Ditto.
+ 	(m2statement_BuildTryFinally): Ditto.
+ 	(m2statement_BuildCleanUp): Ditto.
+ 	(m2statement_BuildUnaryForeachWordDo): Remove.
+ 	(m2statement_BuildExcludeVarConst): Ditto.
+ 	(m2statement_BuildExcludeVarVar): Ditto.
+ 	(m2statement_BuildIncludeVarConst): Ditto.
+ 	(m2statement_BuildIncludeVarVar): Ditto.
+ 	(m2statement_DoJump): Remove.
+ 	(m2statement_IfExprJump): New function.
+ 	(m2statement_IfBitInSetJump): Ditto.
+ 	* gm2-gcc/m2statement.def (DoJump): Remove.
+ 	(IfExprJump): New procedure function.
+ 	(BuildUnaryForeachWordDo): Remove.
+ 	(IfBitInSetJump): New procedure function.
+ 	* gm2-gcc/m2statement.h (m2statement_BuildForeachWordDo): Remove.
+ 	(m2statement_DoJump): Ditto.
+ 	(m2statement_IfExprJump): New function.
+ 	(m2statement_IfBitInSetJump): Ditto.
+ 	* gm2-gcc/m2treelib.cc (m2treelib_do_jump_if_bit): Reimplement.
+ 	(nCount): Replace with ...
+ 	(m2treelib_nCount): ... this.
+ 	(m2treelib_DoCall): Reimplement.
+ 	(m2treelib_get_rvalue): Remove.
+ 	* gm2-gcc/m2treelib.def (get_rvalue): Remove.
+ 	(nCount): New procedure function.
+ 	* gm2-gcc/m2treelib.h (m2treelib_get_rvalue): Remove.
+ 	(m2treelib_nCount): New function.
+ 	* gm2-gcc/m2type.cc (constructor_elements): Change type to vec.
+ 	(m2type_BuildEndArrayType): Reformat.
+ 	(build_m2_type_node_by_array): Ditto.
+ 	(m2type_GetBooleanEnumList): New procedure function.
+ 	(m2type_BuildEnumerator): Add const to char *.
+ 	(m2type_BuildSetConstructorElement): Reimplement.
+ 	(m2type_BuildEndSetConstructor): Ditto.
+ 	(build_record_constructor): New function.
+ 	(m2type_BuildEndRecordConstructor): Reimplement.
+ 	(m2type_BuildRecordConstructorElement): Ditto.
+ 	(m2type_BuildStartArrayConstructor): Reimplement.
+ 	(m2type_BuildEndArrayConstructor): Remove blank lines.
+ 	* gm2-gcc/m2type.def (BuildSetConstructorElement): Reimplement.
+ 	(BuildEndArrayType): Reformat.
+ 	(GetBooleanEnumList): New function.
+ 	* gm2-gcc/m2type.h (m2type_BuildEnumerator): Add const to char *.
+ 	(m2type_BuildSetConstructorElement): Reimplement.
+ 	(m2type_GetBooleanEnumList): New procedure function.
+ 	* gm2-lang.cc (OPT_fmem_report): New option.
+ 	(OPT_ftime_report): Ditto.
+ 	(OPT_fwideset): Ditto.
+ 	* gm2-libs-coroutines/SYSTEM.def (ShiftVal): Remove.
+ 	(ShiftLeft): Ditto.
+ 	(ShiftRight): Ditto.
+ 	(RotateVal): Ditto.
+ 	(RotateLeft): Ditto.
+ 	(RotateRight): Ditto.
+ 	* gm2-libs-coroutines/SYSTEM.mod: Reimplement.
+ 	* gm2-libs-iso/SYSTEM.def (ShiftVal): Remove.
+ 	(ShiftLeft): Ditto.
+ 	(ShiftRight): Ditto.
+ 	(RotateVal): Ditto.
+ 	(RotateLeft): Ditto.
+ 	(RotateRight): Ditto.
+ 	* gm2-libs-iso/SYSTEM.mod: Reimplement.
+ 	* gm2-libs/SYSTEM.def (ShiftVal): Remove.
+ 	(ShiftLeft): Ditto.
+ 	(ShiftRight): Ditto.
+ 	(RotateVal): Ditto.
+ 	(RotateLeft): Ditto.
+ 	(RotateRight): Ditto.
+ 	* gm2-libs/SYSTEM.mod: Reimplement.
+ 	* gm2-libs/SysStorage.def (DEALLOCATE): Improve comment.
+ 	* gm2-libs/SysStorage.mod: Improve comment.
+ 	* init/ppginit (M2Diagnostic): Add.
+ 	(StringConvert): Add.
+ 	* lang.opt (fmem-report): Add access to c.opt.
+ 	(ftime-report): Ditto.
+ 	(fwideset): New option.
+ 	* pge-boot/main.cc (_M2_M2Diagnostic_init): New function.
+ 	(_M2_M2Diagnostic_fini): Ditto.
+ 	(_M2_StringConvert_init): Ditto.
+ 	(_M2_StringConvert_fini): Ditto.
+ 	(main): Call _M2_M2Diagnostic_init.
+ 	Call _M2_StringConvert_init.
+ 	Call _M2_M2Diagnostic_fini.
+ 	Call _M2_StringConvert_fini.
+ 	* tools-src/makeSystem: Add -gdb option.
+ 	* gm2-libs/M2Diagnostic.def: New file.
+ 	* gm2-libs/M2Diagnostic.mod: New file.
+ 	* gm2-libs/M2WIDESET.def: New file.
+ 	* gm2-libs/M2WIDESET.mod: New file.
+ 	* mc-boot/GM2Diagnostic.cc: New file.
+ 	* mc-boot/GM2Diagnostic.h: New file.
+ 	* pge-boot/GM2Diagnostic.cc: New file.
+ 	* pge-boot/GM2Diagnostic.h: New file.
+ 	* pge-boot/GSelective.h: New file.
+ 	* pge-boot/GStringConvert.cc: New file.
+ 
  2025-08-29  Gaius Mulley  <gaiusmod2@gmail.com>
  
  	PR modula2/121709
diff -Nrcpad gcc-16-20250914/gcc/m2/Make-lang.in gcc-16-20250921/gcc/m2/Make-lang.in
*** gcc-16-20250914/gcc/m2/Make-lang.in	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/Make-lang.in	Sun Sep 21 22:32:38 2025
*************** GM2-LIBS-BOOT-DEFS = \
*** 681,686 ****
--- 681,687 ----
     IO.def \
     Indexing.def \
     M2Dependent.def \
+    M2Diagnostic.def \
     M2EXCEPTION.def \
     M2RTS.def \
     NumberIO.def \
*************** GM2-LIBS-BOOT-DEFS = \
*** 690,695 ****
--- 691,697 ----
     SEnvironment.def \
     SFIO.def \
     SYSTEM.def \
+    Selective.def \
     Scan.def \
     StdIO.def \
     Storage.def \
*************** GM2-LIBS-BOOT-MODS = \
*** 726,731 ****
--- 728,734 ----
     IO.mod \
     Indexing.mod \
     M2Dependent.mod \
+    M2Diagnostic.mod \
     M2EXCEPTION.mod \
     M2RTS.mod \
     NumberIO.mod \
*************** GM2-LIBS-BOOT-MODS = \
*** 747,752 ****
--- 750,756 ----
  # found in gm2-libs-ch.
  
  GM2-LIBS-BOOT-C = \
+    Selective.c \
     StdIO.c \
     SysExceptions.c \
     choosetemp.c \
*************** GM2-LIBS-DEFS = \
*** 954,959 ****
--- 958,964 ----
     LMathLib0.def \
     LegacyReal.def \
     M2Dependent.def \
+    M2Diagnostic.def \
     M2EXCEPTION.def \
     M2RTS.def \
     MathLib0.def \
*************** GM2-LIBS-DEFS = \
*** 968,973 ****
--- 973,979 ----
     SMathLib0.def \
     SYSTEM.def \
     Scan.def \
+    Selective.def \
     StdIO.def \
     Storage.def \
     StrCase.def \
*************** GM2-LIBS-MODS = \
*** 1006,1011 ****
--- 1012,1018 ----
     LMathLib0.mod \
     LegacyReal.mod \
     M2Dependent.mod \
+    M2Diagnostic.mod \
     M2EXCEPTION.mod \
     M2RTS.mod \
     MathLib0.mod \
*************** MC-LIB-DEFS = \
*** 1246,1251 ****
--- 1253,1259 ----
     FpuIO.def \
     IO.def \
     M2Dependent.def \
+    M2Diagnostic.def \
     M2EXCEPTION.def \
     M2RTS.def \
     MemUtils.def \
*************** MC-LIB-MODS = \
*** 1293,1298 ****
--- 1301,1307 ----
     FpuIO.mod \
     IO.mod \
     M2Dependent.mod \
+    M2Diagnostic.mod \
     M2EXCEPTION.mod \
     M2RTS.mod \
     MemUtils.mod \
*************** m2/gm2-libs-boot/SysStorage.o: $(srcdir)
*** 1558,1563 ****
--- 1567,1578 ----
            m2/gm2-libs-boot/SysStorage.c -o m2/gm2-libs-boot/SysStorage.o
  	$(POSTCOMPILE)
  
+ m2/gm2-libs-boot/Selective.o: $(srcdir)/m2/gm2-libs-ch/Selective.c \
+                                   m2/gm2-libs-boot/$(SRC_PREFIX)Selective.h m2/gm2-libs/gm2-libs-host.h
+ 	-test -d $(@D)/$(DEPDIR) || $(mkinstalldirs) $(@D)/$(DEPDIR)
+ 	$(CXX) $(CM2DEP) -c $(CFLAGS) $(GM2_PICFLAGS) -Im2/gm2-libs -I$(srcdir)/m2 -Im2 -I. -Im2/gm2-libs-boot $(INCLUDES) $< -o $@
+ 	$(POSTCOMPILE)
+ 
  m2/gm2-compiler-boot/M2GCCDeclare.o: $(srcdir)/m2/gm2-compiler/M2GCCDeclare.mod $(MCDEPS) $(BUILD-BOOT-H)
  	-test -d $(@D)/$(DEPDIR) || $(mkinstalldirs) $(@D)/$(DEPDIR)
  	$(MC) $(MC_EXTENDED_OPAQUE) -o=m2/gm2-compiler-boot/M2GCCDeclare.c $<
*************** BUILD-PGE-O = \
*** 1873,1878 ****
--- 1888,1894 ----
     m2/pge-boot/GIO.o \
     m2/pge-boot/GLists.o \
     m2/pge-boot/GM2Dependent.o \
+    m2/pge-boot/GM2Diagnostic.o \
     m2/pge-boot/GM2EXCEPTION.o \
     m2/pge-boot/GM2RTS.o \
     m2/pge-boot/GNameKey.o \
*************** BUILD-PGE-O = \
*** 1882,1890 ****
--- 1898,1908 ----
     m2/pge-boot/GPushBackInput.o \
     m2/pge-boot/GRTExceptions.o \
     m2/pge-boot/GSFIO.o \
+    m2/pge-boot/GSelective.o \
     m2/pge-boot/GStdIO.o \
     m2/pge-boot/GStorage.o \
     m2/pge-boot/GStrCase.o \
+    m2/pge-boot/GStringConvert.o \
     m2/pge-boot/GStrIO.o \
     m2/pge-boot/GStrLib.o \
     m2/pge-boot/GSymbolKey.o \
*************** BUILD-PGE-O = \
*** 1896,1901 ****
--- 1914,1921 ----
     m2/pge-boot/Gtermios.o \
     m2/pge-boot/GSysExceptions.o \
     m2/pge-boot/Gabort.o \
+    m2/pge-boot/Gdtoa.o \
+    m2/pge-boot/Gldtoa.o \
     m2/pge-boot/Gmcrts.o \
     m2/pge-boot/main.o
  
diff -Nrcpad gcc-16-20250914/gcc/m2/Make-maintainer.in gcc-16-20250921/gcc/m2/Make-maintainer.in
*** gcc-16-20250914/gcc/m2/Make-maintainer.in	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/Make-maintainer.in	Sun Sep 21 22:32:38 2025
*************** PPG-DEFS         = SymbolKey.def   NameK
*** 41,50 ****
  PPG-LIB-DEFS     = Args.def Assertion.def ASCII.def Debug.def \
                     DynamicStrings.def FIO.def Indexing.def IO.def \
                     NumberIO.def PushBackInput.def \
!                    M2Dependent.def \
                     M2EXCEPTION.def M2RTS.def \
                     RTExceptions.def \
                     StdIO.def SFIO.def StrIO.def StrLib.def \
                     Storage.def StrCase.def SysStorage.def
  
  # Core library implementation modules used by ppg found in the gm2-libs directory.
--- 41,51 ----
  PPG-LIB-DEFS     = Args.def Assertion.def ASCII.def Debug.def \
                     DynamicStrings.def FIO.def Indexing.def IO.def \
                     NumberIO.def PushBackInput.def \
!                    M2Dependent.def M2Diagnostic.def \
                     M2EXCEPTION.def M2RTS.def \
                     RTExceptions.def \
                     StdIO.def SFIO.def StrIO.def StrLib.def \
+                    StringConvert.def \
                     Storage.def StrCase.def SysStorage.def
  
  # Core library implementation modules used by ppg found in the gm2-libs directory.
*************** PPG-LIB-MODS     = ASCII.mod \
*** 58,63 ****
--- 59,65 ----
                     IO.mod \
                     Indexing.mod \
                     M2Dependent.mod \
+                    M2Diagnostic.mod \
                     M2EXCEPTION.mod \
                     M2RTS.mod \
                     NumberIO.mod \
*************** PPG-LIB-MODS     = ASCII.mod \
*** 69,74 ****
--- 71,77 ----
                     StrCase.mod \
                     StrIO.mod \
                     StrLib.mod \
+                    StringConvert.mod \
                     SysStorage.mod
  
  # Program module ppg.mod from which pge.mod is created.  ppg.mod is
*************** PGE-DEF = ASCII.def \
*** 96,101 ****
--- 99,105 ----
     FpuIO.def \
     IO.def \
     M2Dependent.def \
+    M2Diagnostic.def \
     M2EXCEPTION.def \
     M2RTS.def \
     MemUtils.def \
*************** PGE-DEPS = Gabort.cc \
*** 169,174 ****
--- 173,180 ----
     GLists.h \
     GM2Dependent.cc \
     GM2Dependent.h \
+    GM2Diagnostic.cc \
+    GM2Diagnostic.h \
     GM2EXCEPTION.cc \
     GM2EXCEPTION.h \
     GM2RTS.cc \
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/FifoQueue.def gcc-16-20250921/gcc/m2/gm2-compiler/FifoQueue.def
*** gcc-16-20250914/gcc/m2/gm2-compiler/FifoQueue.def	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/FifoQueue.def	Sun Sep 21 22:32:38 2025
*************** DEFINITION MODULE FifoQueue ;
*** 25,39 ****
     Author     : Gaius Mulley
     Title      : FifoQueue
     Date       : Tue Dec 12 16:23:22 GMT 1989
!    Description: FifoQueue provides a mechanism to and from which CARDINAL
!                 numbers can be stored and retrieved from a FIFO queue.
!    Last update: Tue Dec 12 16:24:24 GMT 1989
  *)
  
! EXPORT QUALIFIED PutEnumerationIntoFifoQueue, GetEnumerationFromFifoQueue,
!                  PutSubrangeIntoFifoQueue, GetSubrangeFromFifoQueue,
!                  PutConstIntoFifoQueue, GetConstFromFifoQueue,
!                  PutConstructorIntoFifoQueue, GetConstructorFromFifoQueue ;
  
  
  (*
--- 25,49 ----
     Author     : Gaius Mulley
     Title      : FifoQueue
     Date       : Tue Dec 12 16:23:22 GMT 1989
!    Description: FifoQueue provides a fifo mechanism to allow symbols to be
!                 stored and retrieved between passes in the same order.
  *)
  
! 
! (*
!    PutSetIntoFifoQueue - places a set symbol
!                          into a fifo queue.
! *)
! 
! PROCEDURE PutSetIntoFifoQueue (c: CARDINAL) ;
! 
! 
! (*
!    GetSetFromFifoQueue - retrieves a set symbol
!                          from a fifo queue.
! *)
! 
! PROCEDURE GetSetFromFifoQueue (VAR c: CARDINAL) ;
  
  
  (*
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/FifoQueue.mod gcc-16-20250921/gcc/m2/gm2-compiler/FifoQueue.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/FifoQueue.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/FifoQueue.mod	Sun Sep 21 22:32:38 2025
*************** TYPE
*** 31,36 ****
--- 31,37 ----
  
  VAR
     const,
+    set,
     subrange,
     enumeration,
     constructor: Fifo ;
*************** END GetConstFromFifoQueue ;
*** 150,155 ****
--- 151,178 ----
  
  
  (*
+    PutSetIntoFifoQueue - places a set symbol
+                          into a fifo queue.
+ *)
+ 
+ PROCEDURE PutSetIntoFifoQueue (c: CARDINAL) ;
+ BEGIN
+    PutInto (set, c)
+ END PutSetIntoFifoQueue ;
+ 
+ 
+ (*
+    GetSetFromFifoQueue - retrieves a set symbol
+                          from a fifo queue.
+ *)
+ 
+ PROCEDURE GetSetFromFifoQueue (VAR c: CARDINAL) ;
+ BEGIN
+    GetFrom (set, c)
+ END GetSetFromFifoQueue ;
+ 
+ 
+ (*
     Init - initialize the fifo queue.
  *)
  
*************** END Init ;
*** 164,169 ****
--- 187,193 ----
  
  BEGIN
     Init(const) ;
+    Init(set) ;
     Init(enumeration) ;
     Init(subrange) ;
     Init(constructor)
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/M2ALU.def gcc-16-20250921/gcc/m2/gm2-compiler/M2ALU.def
*** gcc-16-20250914/gcc/m2/gm2-compiler/M2ALU.def	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/M2ALU.def	Sun Sep 21 22:32:38 2025
*************** FROM NameKey IMPORT Name ;
*** 35,86 ****
  FROM M2GCCDeclare IMPORT WalkAction, IsAction ;
  FROM gcctypes IMPORT tree ;
  
- EXPORT QUALIFIED PtrToValue,
-                  InitValue,
-                  IsValueTypeNone,
-                  IsValueTypeInteger,
-                  IsValueTypeReal,
-                  IsValueTypeComplex,
-                  IsValueTypeSet,
-                  IsValueTypeConstructor,
-                  IsValueTypeArray,
-                  IsValueTypeRecord,
-                  PopInto, PushFrom,
-                  PushIntegerTree, PopIntegerTree,
-                  PushSetTree, PopSetTree,
-                  PushRealTree, PopRealTree,
-                  PushComplexTree, PopComplexTree,
-                  PopConstructorTree,
-                  PopChar,
-                  PushCard,
-                  PushInt,
-                  PushChar,
-                  PushString,
-                  PushTypeOfTree,
-                  CoerseLongRealToCard,
-                  ConvertRealToInt,
-                  ConvertToInt,
-                  ConvertToType,
-                  GetSetValueType,
-                  IsSolved, IsValueConst,
-                  PutConstructorSolved, EvaluateValue, TryEvaluateValue,
- 
-                  IsNulSet, IsGenericNulSet, PushNulSet, AddBitRange, AddBit, SubBit,
-       	       	 SetOr, SetAnd, SetIn,
-                  SetDifference, SetSymmetricDifference,
-                  SetNegate, SetShift, SetRotate,
- 
-                  Addn, Multn, Sub,
-                  DivFloor, ModFloor, DivTrunc, ModTrunc,
-                  Equ, NotEqu, Less, Gre, LessEqu, GreEqu,
-                  GetValue, GetRange,  ConstructSetConstant, BuildRange,
-                  IsConstructorDependants, WalkConstructorDependants,
-                  AddField, AddElements,
- 
-                  PushEmptyConstructor, PushEmptyArray, PushEmptyRecord,
-                  ChangeToConstructor,
- 
-                  IsValueAndTreeKnown, CheckOrResetOverflow ;
  
  TYPE
     PtrToValue ;
--- 35,40 ----
*************** PROCEDURE InitValue () : PtrToValue ;
*** 94,99 ****
--- 48,60 ----
  
  
  (*
+    KillValue - deconstructor for value.  value is set to NIL upon return.
+ *)
+ 
+ PROCEDURE KillValue (VAR value: PtrToValue) ;
+ 
+ 
+ (*
     IsValueTypeNone - returns TRUE if the value on the top stack has no value.
  *)
  
*************** PROCEDURE PopComplexTree () : tree ;
*** 208,215 ****
                   type (sym). Bit 0 maps onto MIN(sym).
  *)
  
! PROCEDURE PushSetTree (tokenno: CARDINAL;
!                        t: tree; sym: CARDINAL) ;
  
  
  (*
--- 169,175 ----
                   type (sym). Bit 0 maps onto MIN(sym).
  *)
  
! PROCEDURE PushSetTree (tokenno: CARDINAL; value: tree; sym: CARDINAL) ;
  
  
  (*
*************** PROCEDURE GetRange (v: PtrToValue; n: CA
*** 828,835 ****
  
  
  (*
!    ConstructSetConstant - builds a struct of integers which represents the
!                           set const, sym.
  *)
  
  PROCEDURE ConstructSetConstant (tokenno: CARDINAL; v: PtrToValue) : tree ;
--- 788,795 ----
  
  
  (*
!    ConstructSetConstant - builds an array of BYTE which represents the
!                           set const symbol.
  *)
  
  PROCEDURE ConstructSetConstant (tokenno: CARDINAL; v: PtrToValue) : tree ;
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/M2ALU.mod gcc-16-20250921/gcc/m2/gm2-compiler/M2ALU.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/M2ALU.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/M2ALU.mod	Sun Sep 21 22:32:38 2025
*************** FROM M2MetaError IMPORT MetaError0, Meta
*** 52,58 ****
  
  FROM SymbolTable IMPORT NulSym, IsEnumeration, IsSubrange, IsValueSolved, PushValue,
                          ForeachFieldEnumerationDo, MakeTemporary, PutVar, PopValue, GetType,
!                         MakeConstLit, GetArraySubscript,
                          IsSet, SkipType, IsRecord, IsArray, IsConst, IsConstructor,
                          IsConstString, SkipTypeAndSubrange, GetDeclaredMod,
                          GetSubrange, GetSymName, GetNth, GetString, GetStringLength,
--- 52,58 ----
  
  FROM SymbolTable IMPORT NulSym, IsEnumeration, IsSubrange, IsValueSolved, PushValue,
                          ForeachFieldEnumerationDo, MakeTemporary, PutVar, PopValue, GetType,
!                         MakeConstLit, GetArraySubscript, GetSetInWord,
                          IsSet, SkipType, IsRecord, IsArray, IsConst, IsConstructor,
                          IsConstString, SkipTypeAndSubrange, GetDeclaredMod,
                          GetSubrange, GetSymName, GetNth, GetString, GetStringLength,
*************** FROM m2expr IMPORT BuildAdd, BuildSub, B
*** 70,76 ****
                     GetWordOne, GetCardinalZero, TreeOverflow, RemoveOverflow,
                     GetCstInteger ;
  
! FROM m2decl IMPORT GetBitsPerBitset, BuildIntegerConstant, BuildConstLiteralNumber ;
  FROM m2misc IMPORT DebugTree ;
  
  FROM m2type IMPORT RealToTree, Constructor, GetIntegerType, GetLongRealType,
--- 70,76 ----
                     GetWordOne, GetCardinalZero, TreeOverflow, RemoveOverflow,
                     GetCstInteger ;
  
! FROM m2decl IMPORT GetBitsPerUnit, GetBitsPerBitset, BuildIntegerConstant, BuildConstLiteralNumber ;
  FROM m2misc IMPORT DebugTree ;
  
  FROM m2type IMPORT RealToTree, Constructor, GetIntegerType, GetLongRealType,
*************** FROM m2type IMPORT RealToTree, Construct
*** 80,91 ****
                     BuildArrayConstructorElement, BuildStartArrayConstructor, BuildEndArrayConstructor,
                     GetM2CharType ;
  
! FROM m2convert IMPORT ConvertConstantAndCheck, ToWord, ToInteger, ToCardinal, ToBitset ;
  FROM m2block IMPORT RememberConstant ;
  
  FROM m2expr IMPORT GetPointerZero, GetIntegerZero, GetIntegerOne,
                     CompareTrees, FoldAndStrip, AreRealOrComplexConstantsEqual, AreConstantsEqual ;
  
  
  TYPE
     cellType   = (none, integer, real, complex, set, constructor, array, record) ;
--- 80,96 ----
                     BuildArrayConstructorElement, BuildStartArrayConstructor, BuildEndArrayConstructor,
                     GetM2CharType ;
  
! FROM m2convert IMPORT ConvertConstantAndCheck, ToWord, ToInteger, ToCardinal,
!                       ToBitset, ToLoc, ToPIMByte, BuildConvert ;
! 
  FROM m2block IMPORT RememberConstant ;
  
  FROM m2expr IMPORT GetPointerZero, GetIntegerZero, GetIntegerOne,
                     CompareTrees, FoldAndStrip, AreRealOrComplexConstantsEqual, AreConstantsEqual ;
  
+ FROM M2Diagnostic IMPORT Diagnostic, InitMemDiagnostic, MemIncr, MemSet ;
+ 
+ 
  
  TYPE
     cellType   = (none, integer, real, complex, set, constructor, array, record) ;
*************** VAR
*** 150,155 ****
--- 155,163 ----
     EnumerationField: CARDINAL ;
     CurrentTokenNo  : CARDINAL ;
     (* WatchedValue    : PtrToValue ;  *)
+    StackMemDiag    : Diagnostic ;   (* Contains memory related statistics *)
+    RangeMemDiag    : Diagnostic ;   (* Contains memory related statistics *)
+ 
  
  
  (*
*************** VAR
*** 162,168 ****
  BEGIN
     IF FreeList=NIL
     THEN
!       NEW (v)
     ELSE
        v := FreeList ;
        FreeList := FreeList^.next
--- 170,178 ----
  BEGIN
     IF FreeList=NIL
     THEN
!       NEW (v) ;
!       MemIncr (StackMemDiag, 1, 1) ;
!       MemIncr (StackMemDiag, 2, SIZE (v^))
     ELSE
        v := FreeList ;
        FreeList := FreeList^.next
*************** BEGIN
*** 203,209 ****
        IF v=NIL
        THEN
           InternalError ('out of memory error')
!       END
     ELSE
        v := RangeFreeList ;
        RangeFreeList := RangeFreeList^.next
--- 213,221 ----
        IF v=NIL
        THEN
           InternalError ('out of memory error')
!       END ;
!       MemIncr (RangeMemDiag, 1, 1) ;
!       MemIncr (RangeMemDiag, 2, SIZE (v^))
     ELSE
        v := RangeFreeList ;
        RangeFreeList := RangeFreeList^.next
*************** END InitValue ;
*** 491,496 ****
--- 503,519 ----
  
  
  (*
+    KillValue - deconstructor for value.  value is set to NIL upon return.
+ *)
+ 
+ PROCEDURE KillValue (VAR value: PtrToValue) ;
+ BEGIN
+    Dispose (value) ;
+    value := NIL
+ END KillValue ;
+ 
+ 
+ (*
     IsValueTypeNone - returns TRUE if the value on the top stack has no value.
  *)
  
*************** END PopComplexTree ;
*** 818,866 ****
  
  (*
     PushSetTree - pushes a gcc tree onto the ALU stack.
!                  The tree, t, is expected to contain a
!                  word value. It is converted into a set
!                  type (sym). Bit 0 maps onto MIN(sym).
  *)
  
  PROCEDURE PushSetTree (tokenno: CARDINAL;
!                        t: tree; sym: CARDINAL) ;
  VAR
!    v: PtrToValue ;
!    c,
!    i: INTEGER ;
!    r: listOfRange ;
!    l: location_t ;
  BEGIN
!    l := TokenToLocation(tokenno) ;
!    r := NIL ;
     i := 0 ;
!    WHILE (i<GetBitsPerBitset()) AND
!          (CompareTrees(GetIntegerZero(l), t)#0) DO
!       IF CompareTrees(GetIntegerOne(l),
!                       BuildLogicalAnd(l, t, GetIntegerOne(l), FALSE))=0
        THEN
!          PushCard(i) ;
!          c := Val(tokenno, SkipType(sym), PopIntegerTree()) ;
!          DeclareConstant(tokenno, c) ;
!          r := AddRange(r, c, c)
        END ;
!       t := BuildLSR(l, t, GetIntegerOne(l), FALSE) ;
!       INC(i)
     END ;
!    SortElements(tokenno, r) ;
!    CombineElements(tokenno, r) ;
!    v := New() ;
!    WITH v^ DO
!       location        := l ;
        type            := set ;
        constructorType := sym ;
        areAllConstants := FALSE ;
        solved          := FALSE ;
!       setValue        := r
     END ;
!    Eval(tokenno, v) ;
!    Push(v)
  END PushSetTree ;
  
  
--- 841,888 ----
  
  (*
     PushSetTree - pushes a gcc tree onto the ALU stack.
!                  The tree value is expected to contain a
!                  word sized or less value.  It is converted into a set
!                  type (sym). Bit 0 maps onto MIN (sym).
  *)
  
  PROCEDURE PushSetTree (tokenno: CARDINAL;
!                        value: tree; sym: CARDINAL) ;
  VAR
!    newVal: PtrToValue ;
!    c, i  : INTEGER ;
!    range : listOfRange ;
!    loc   : location_t ;
  BEGIN
!    loc := TokenToLocation (tokenno) ;
!    range := NIL ;
     i := 0 ;
!    WHILE (i < GetBitsPerBitset ()) AND
!          (CompareTrees (GetIntegerZero (loc), value) # 0) DO
!       IF CompareTrees (GetIntegerOne (loc),
!                        BuildLogicalAnd (loc, value, GetIntegerOne (loc))) = 0
        THEN
!          PushCard (i) ;
!          c := Val (tokenno, SkipType (sym), PopIntegerTree ()) ;
!          DeclareConstant (tokenno, c) ;
!          range := AddRange (range, c, c)
        END ;
!       value := BuildLSR (loc, value, GetIntegerOne (loc), FALSE) ;
!       INC (i)
     END ;
!    SortElements (tokenno, range) ;
!    CombineElements (tokenno, range) ;
!    newVal := New () ;
!    WITH newVal^ DO
!       location        := loc ;
        type            := set ;
        constructorType := sym ;
        areAllConstants := FALSE ;
        solved          := FALSE ;
!       setValue        := range
     END ;
!    Eval (tokenno, newVal) ;
!    Push (newVal)
  END PushSetTree ;
  
  
*************** BEGIN
*** 1393,1399 ****
  END ConvertToType ;
  
  
- 
  (*
     IsSolved - returns true if the memory cell indicated by v
                has a known value.
--- 1415,1420 ----
*************** END GetRange ;
*** 4397,4503 ****
  
  
  (*
!    BuildStructBitset - v is the PtrToValue.
                         low and high are the limits of the subrange.
  *)
  
! PROCEDURE BuildStructBitset (tokenno: CARDINAL; v: PtrToValue; low, high: tree) : tree ;
  VAR
!    BitsInSet : tree ;
!    bpw       : CARDINAL ;
!    cons      : Constructor ;
  BEGIN
!    PushIntegerTree(low) ;
     ConvertToInt ;
!    low := PopIntegerTree() ;
!    PushIntegerTree(high) ;
     ConvertToInt ;
!    high := PopIntegerTree() ;
!    bpw  := GetBitsPerBitset() ;
  
!    PushIntegerTree(high) ;
!    PushIntegerTree(low) ;
     Sub ;
!    PushCard(1) ;
     Addn ;
!    BitsInSet := PopIntegerTree() ;
  
!    cons := BuildStartSetConstructor(Mod2Gcc(v^.constructorType)) ;
  
!    PushIntegerTree(BitsInSet) ;
!    PushCard(0) ;
!    WHILE Gre(tokenno) DO
!       PushIntegerTree(BitsInSet) ;
!       PushCard(bpw-1) ;
!       IF GreEqu(tokenno)
        THEN
!          PushIntegerTree(low) ;
!          PushCard(bpw-1) ;
           Addn ;
! 
!          BuildSetConstructorElement(cons, BuildBitset(tokenno, v, low, PopIntegerTree())) ;
! 
!          PushIntegerTree(low) ;
!          PushCard(bpw) ;
           Addn ;
!          low := PopIntegerTree() ;
!          PushIntegerTree(BitsInSet) ;
!          PushCard(bpw) ;
           Sub ;
!          BitsInSet := PopIntegerTree()
        ELSE
!          (* printf2('range is %a..%a\n', GetSymName(low), GetSymName(high)) ; *)
! 
!          BuildSetConstructorElement(cons, BuildBitset(tokenno, v, low, high)) ;
! 
!          PushCard(0) ;
!          BitsInSet := PopIntegerTree()
        END ;
!       PushIntegerTree(BitsInSet) ;
!       PushCard(0)
     END ;
!    RETURN( BuildEndSetConstructor(cons) )
! END BuildStructBitset ;
! 
! 
! (*
!    ConstructLargeOrSmallSet - generates a constant representing the set value of the symbol, sym.
!                               We manufacture the constant by using a initialization
!                               structure of cardinals.
! 
!                               { (cardinal), (cardinal) etc }
! *)
! 
! PROCEDURE ConstructLargeOrSmallSet (tokenno: CARDINAL; v: PtrToValue; low, high: CARDINAL) : tree ;
! BEGIN
!    PushValue(high) ;
!    ConvertToInt ;
!    PushValue(low) ;
!    ConvertToInt ;
!    Sub ;
!    PushCard(GetBitsPerBitset()) ;
!    IF Less(tokenno)
!    THEN
!       (* small set *)
!       RETURN( BuildBitset(tokenno, v, Mod2Gcc(low), Mod2Gcc(high)) )
!    ELSE
!       (* large set *)
!       RETURN( BuildStructBitset(tokenno, v, Mod2Gcc(low), Mod2Gcc(high)) )
!    END
! END ConstructLargeOrSmallSet ;
  
  
  (*
!    ConstructSetConstant - builds a struct of integers which represents the
!                           set const as defined by, v.
  *)
  
  PROCEDURE ConstructSetConstant (tokenno: CARDINAL; v: PtrToValue) : tree ;
  VAR
     n1, n2   : Name ;
!    gccsym   : tree ;
!    baseType,
!    high, low: CARDINAL ;
  BEGIN
     WITH v^ DO
        IF constructorType=NulSym
--- 4418,4523 ----
  
  
  (*
!    ConstructLargeOrSmallSet - generates a constant representing the set value of the symbol, sym.
!                               We manufacture the constant by using a initialization
!                               structure of cardinals.
! 
!                               { (cardinal), (cardinal) etc }
! *)
! 
! PROCEDURE ConstructLargeOrSmallSet (tokenno: CARDINAL; v: PtrToValue; low, high: CARDINAL) : tree ;
! VAR
!    settype: CARDINAL ;
! BEGIN
!    Assert (v^.constructorType # NulSym) ;
!    settype := SkipType (v^.constructorType) ;
!    Assert (IsSet (settype)) ;
!    IF GetSetInWord (settype)
!    THEN
!       (* Narrow set.  *)
!       RETURN BuildConvert (TokenToLocation (tokenno),
!                            Mod2Gcc (settype),
!                            BuildBitset (tokenno, v, Mod2Gcc (low), Mod2Gcc (high)),
!                            FALSE)
!    ELSE
!       (* Wide set.  *)
!       RETURN BuildArrayByteset (tokenno, v, Mod2Gcc (low), Mod2Gcc (high))
!    END
! END ConstructLargeOrSmallSet ;
! 
! 
! (*
!    BuildArrayByteset - v is the PtrToValue.
                         low and high are the limits of the subrange.
  *)
  
! PROCEDURE BuildArrayByteset (tokenno: CARDINAL; v: PtrToValue; low, high: tree) : tree ;
  VAR
!    location   : location_t ;
!    BitsInSet  : tree ;
!    BitsPerByte: CARDINAL ;
!    cons       : Constructor ;
  BEGIN
!    location := TokenToLocation (tokenno) ;
!    PushIntegerTree (low) ;
     ConvertToInt ;
!    low := PopIntegerTree () ;
!    PushIntegerTree (high) ;
     ConvertToInt ;
!    high := PopIntegerTree () ;
!    BitsPerByte := GetBitsPerUnit () ;
  
!    PushIntegerTree (high) ;
!    PushIntegerTree (low) ;
     Sub ;
!    PushCard (1) ;
     Addn ;
!    BitsInSet := PopIntegerTree () ;
  
!    cons := BuildStartSetConstructor (Mod2Gcc (v^.constructorType)) ;
  
!    PushIntegerTree (BitsInSet) ;
!    PushCard (0) ;
!    WHILE Gre (tokenno) DO
!       PushIntegerTree (BitsInSet) ;
!       PushCard (BitsPerByte - 1) ;
!       IF GreEqu (tokenno)
        THEN
!          PushIntegerTree (low) ;
!          PushCard (BitsPerByte - 1) ;
           Addn ;
!          BuildSetConstructorElement (location,
!                                      cons, BuildByte (tokenno, v, low, PopIntegerTree ())) ;
!          PushIntegerTree (low) ;
!          PushCard (BitsPerByte) ;
           Addn ;
!          low := PopIntegerTree () ;
!          PushIntegerTree (BitsInSet) ;
!          PushCard (BitsPerByte) ;
           Sub ;
!          BitsInSet := PopIntegerTree ()
        ELSE
!          BuildSetConstructorElement (location,
!                                      cons, BuildByte (tokenno, v, low, high)) ;
!          PushCard (0) ;
!          BitsInSet := PopIntegerTree ()
        END ;
!       PushIntegerTree (BitsInSet) ;
!       PushCard (0)
     END ;
!    RETURN BuildEndSetConstructor (cons)
! END BuildArrayByteset ;
  
  
  (*
!    ConstructSetConstant - builds an array of bytes which represents the
!                           set const as defined by v.
  *)
  
  PROCEDURE ConstructSetConstant (tokenno: CARDINAL; v: PtrToValue) : tree ;
  VAR
     n1, n2   : Name ;
!    baseType: CARDINAL ;
  BEGIN
     WITH v^ DO
        IF constructorType=NulSym
*************** BEGIN
*** 4511,4524 ****
              n2 := GetSymName(baseType) ;
              printf2('ConstructSetConstant of type %a and baseType %a\n', n1, n2)
           END ;
!          IF IsSubrange(baseType)
!          THEN
!             GetSubrange(baseType, high, low) ;
!             gccsym := ConstructLargeOrSmallSet(tokenno, v, low, high)
!          ELSE
!             gccsym := ConstructLargeOrSmallSet(tokenno, v, GetTypeMin(baseType), GetTypeMax(baseType))
!          END ;
!          RETURN( gccsym )
        END
     END
  END ConstructSetConstant ;
--- 4531,4537 ----
              n2 := GetSymName(baseType) ;
              printf2('ConstructSetConstant of type %a and baseType %a\n', n1, n2)
           END ;
!          RETURN ConstructLargeOrSmallSet (tokenno, v, GetTypeMin (baseType), GetTypeMax (baseType))
        END
     END
  END ConstructSetConstant ;
*************** BEGIN
*** 5074,5080 ****
        THEN
           t := BuildLSL(location, GetWordOne(location), ToWord(location, i), FALSE)
        ELSE
!          t := BuildLogicalOr(location, t, BuildLSL(location, GetWordOne(location), ToWord(location, i), FALSE), FALSE)
        END ;
        PushIntegerTree(i) ;
        PushIntegerTree(GetIntegerOne(location)) ;
--- 5087,5093 ----
        THEN
           t := BuildLSL(location, GetWordOne(location), ToWord(location, i), FALSE)
        ELSE
!          t := BuildLogicalOr (location, t, BuildLSL(location, GetWordOne(location), ToWord(location, i), FALSE))
        END ;
        PushIntegerTree(i) ;
        PushIntegerTree(GetIntegerOne(location)) ;
*************** BEGIN
*** 5083,5089 ****
        PushIntegerTree(i) ;
        PushIntegerTree(e2) ;
     UNTIL Gre(tokenno) ;
!    RETURN( t )
  END BuildRange ;
  
  
--- 5096,5102 ----
        PushIntegerTree(i) ;
        PushIntegerTree(e2) ;
     UNTIL Gre(tokenno) ;
!    RETURN t
  END BuildRange ;
  
  
*************** BEGIN
*** 5115,5121 ****
        THEN
           tl := ToCardinal(location, SubTree(MaxTree(tokenno, tl, low), low)) ;
           th := ToCardinal(location, SubTree(MinTree(tokenno, th, high), low)) ;
!          t := BuildLogicalOr(location, t, BuildRange(tokenno, tl, th), FALSE)
        END ;
        INC(n)
     END ;
--- 5128,5134 ----
        THEN
           tl := ToCardinal(location, SubTree(MaxTree(tokenno, tl, low), low)) ;
           th := ToCardinal(location, SubTree(MinTree(tokenno, th, high), low)) ;
!          t := BuildLogicalOr(location, t, BuildRange(tokenno, tl, th))
        END ;
        INC(n)
     END ;
*************** END BuildBitset ;
*** 5124,5129 ****
--- 5137,5178 ----
  
  
  (*
+    BuildByte - given a set v construct the bitmask for its
+                constant value which lie in the range low..high.
+ *)
+ 
+ PROCEDURE BuildByte (tokenno: CARDINAL;
+                      v: PtrToValue; low, high: tree) : tree ;
+ VAR
+    tl, th,
+    t       : tree ;
+    n       : CARDINAL ;
+    r1, r2  : CARDINAL ;
+    location: location_t ;
+ BEGIN
+    location := TokenToLocation (tokenno) ;
+    low := ToInteger (location, low) ;
+    high := ToInteger (location, high) ;
+    n := 1 ;
+    t := GetCardinalZero (location) ;
+    WHILE GetRange (v, n, r1, r2) DO
+       PushValue (r1) ;
+       tl := ToInteger (location, PopIntegerTree ()) ;
+       PushValue (r2) ;
+       th := ToInteger (location, PopIntegerTree ()) ;
+       IF IsIntersectionTree (tokenno, tl, th, low, high)
+       THEN
+          tl := ToCardinal (location, SubTree (MaxTree (tokenno, tl, low), low)) ;
+          th := ToCardinal (location, SubTree (MinTree (tokenno, th, high), low)) ;
+          t := BuildLogicalOr (location, t, BuildRange (tokenno, tl, th))
+       END ;
+       INC(n)
+    END ;
+    RETURN ToPIMByte (location, t)
+ END BuildByte ;
+ 
+ 
+ (*
     IsValueAndTreeKnown - returns TRUE if the value is known and the gcc tree
                           is defined.
  
*************** BEGIN
*** 5309,5315 ****
     TopOfStack      := NIL ;
     RangeFreeList   := NIL ;
     FieldFreeList   := NIL ;
!    ElementFreeList := NIL
  END Init ;
  
  
--- 5358,5372 ----
     TopOfStack      := NIL ;
     RangeFreeList   := NIL ;
     FieldFreeList   := NIL ;
!    ElementFreeList := NIL ;
!    StackMemDiag
!       := InitMemDiagnostic
!             ('M2ALU:Stack',
!             '{0N} total symbols {1d} consuming {2M} ram {0M} ({2P})') ;
!    RangeMemDiag
!       := InitMemDiagnostic
!             ('M2ALU:Range',
!             '{0N} total symbols {1d} consuming {2M} ram {0M} ({2P})')
  END Init ;
  
  
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/M2Base.mod gcc-16-20250921/gcc/m2/gm2-compiler/M2Base.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/M2Base.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/M2Base.mod	Sun Sep 21 22:32:38 2025
*************** FROM M2Options IMPORT NilChecking,
*** 96,102 ****
                        IndexChecking, RangeChecking,
                        ReturnChecking, CaseElseChecking, Exceptions,
  		      WholeValueChecking,
!                       DebugBuiltins,
                        Iso, Pim, Pim2, Pim3 ;
  
  FROM m2type IMPORT GetIntegerType,
--- 96,102 ----
                        IndexChecking, RangeChecking,
                        ReturnChecking, CaseElseChecking, Exceptions,
  		      WholeValueChecking,
!                       DebugBuiltins, GetWideset,
                        Iso, Pim, Pim2, Pim3 ;
  
  FROM m2type IMPORT GetIntegerType,
*************** VAR
*** 150,155 ****
--- 150,156 ----
     Comp,
     Expr,
     Ass        : CompatibilityArray ;
+    m2wideset,
     Ord,
     OrdS, OrdL,
     Float,
*************** BEGIN
*** 222,228 ****
     InitSystem ;
  
     MakeBitset ;  (* We do this after SYSTEM has been created as BITSET
!                     is dependant upon WORD.  *)
  
     InitBaseConstants ;
     InitBaseFunctions ;
--- 223,229 ----
     InitSystem ;
  
     MakeBitset ;  (* We do this after SYSTEM has been created as BITSET
!                     is dependant upon WORD and BOOLEAN.  *)
  
     InitBaseConstants ;
     InitBaseFunctions ;
*************** BEGIN
*** 635,640 ****
--- 636,649 ----
                  (* PIM-2 Modula-2                             *)
     END ;
  
+    IF GetWideset ()
+    THEN
+       (* Ensure that M2WIDESET is available if needed by M2GenGCC.mod.
+          By default -fwideset is TRUE however the user may override using
+          -fno-wideset.  *)
+       m2wideset := MakeDefinitionSource (BuiltinTokenNo, MakeKey('M2WIDESET'))
+    END ;
+ 
     (*
        The procedure HALT is a real procedure which
        is defined in M2RTS. However to remain compatible
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/M2CaseList.mod gcc-16-20250921/gcc/m2/gm2-compiler/M2CaseList.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/M2CaseList.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/M2CaseList.mod	Sun Sep 21 22:32:38 2025
*************** BEGIN
*** 326,334 ****
                 ELSE
                    IF r^.high=NulSym
                    THEN
!                      MetaError1('the CASE statement variant must be defined by a constant {%1Da:is a {%1d}}', r^.low)
                    ELSE
!                      MetaError1('the CASE statement variant low value in a range must be defined by a constant {%1Da:is a {%1d}}',
                                  r^.low)
                    END
                 END
--- 326,334 ----
                 ELSE
                    IF r^.high=NulSym
                    THEN
!                      MetaError1('the CASE statement variant must be defined by a constant {%1Da:is a {%1dv}}', r^.low)
                    ELSE
!                      MetaError1('the CASE statement variant low value in a range must be defined by a constant {%1Da:is a {%1dv}}',
                                  r^.low)
                    END
                 END
*************** BEGIN
*** 343,349 ****
                       RETURN( FALSE )
                    END
                 ELSE
!                   MetaError1('the CASE statement variant high value in a range must be defined by a constant {%1Da:is a {%1d}}',
                               r^.high)
                 END
              END ;
--- 343,349 ----
                       RETURN( FALSE )
                    END
                 ELSE
!                   MetaError1('the CASE statement variant high value in a range must be defined by a constant {%1Da:is a {%1dv}}',
                               r^.high)
                 END
              END ;
*************** BEGIN
*** 1306,1312 ****
        consttype := GetType (constant) ;
        IF NOT IsExpressionCompatible (consttype, type)
        THEN
!          MetaError2 ('the case statement variant tag {%1ad} must be type compatible with the constant {%2Da:is a {%2d}}',
                       type, constant) ;
           RETURN FALSE
        END
--- 1306,1312 ----
        consttype := GetType (constant) ;
        IF NOT IsExpressionCompatible (consttype, type)
        THEN
!          MetaError2 ('the case statement variant tag {%1ad} must be type compatible with the constant {%2Da:is a {%2dv}}',
                       type, constant) ;
           RETURN FALSE
        END
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/M2Check.mod gcc-16-20250921/gcc/m2/gm2-compiler/M2Check.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/M2Check.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/M2Check.mod	Sun Sep 21 22:32:38 2025
*************** IMPLEMENTATION MODULE M2Check ;
*** 34,39 ****
--- 34,40 ----
  
  FROM M2System IMPORT IsSystemType, IsGenericSystemType, IsSameSize, IsComplexN ;
  FROM M2Base IMPORT IsParameterCompatible, IsAssignmentCompatible, IsExpressionCompatible, IsComparisonCompatible, IsBaseType, IsMathType, ZType, CType, RType, IsComplexType, Char ;
+ FROM M2Bitset IMPORT Bitset ;
  FROM Indexing IMPORT Index, InitIndex, GetIndice, PutIndice, KillIndex, HighIndice, LowIndice, IncludeIndiceIntoIndex, ForeachIndiceInIndexDo ;
  FROM M2Error IMPORT Error, InternalError, NewError, ErrorString, ChainError ;
  
*************** END checkUnbounded ;
*** 456,462 ****
  
  
  (*
!    checkArrayTypeEquivalence - check array and unbounded array type equivalence.
  *)
  
  PROCEDURE checkArrayTypeEquivalence (result: status; tinfo: tInfo;
--- 457,479 ----
  
  
  (*
!    checkGenericUnboundedTyped - return TRUE if we have a match for
!                                 an unbounded generic type and a typed object
!                                 which is not a Z, R or C type.
! *)
! 
! PROCEDURE checkGenericUnboundedTyped (unbounded, typed: CARDINAL) : BOOLEAN ;
! BEGIN
!    RETURN (IsUnbounded (unbounded) AND
!            IsGenericSystemType (GetDType (unbounded)) AND
!            ((NOT IsZRCType (typed)) OR
!             IsTyped (typed) AND (NOT IsZRCType (GetDType (typed)))))
! END checkGenericUnboundedTyped ;
! 
! 
! (*
!    checkArrayTypeEquivalence - check array and unbounded array type
!                                equivalence.
  *)
  
  PROCEDURE checkArrayTypeEquivalence (result: status; tinfo: tInfo;
*************** BEGIN
*** 476,481 ****
--- 493,504 ----
        THEN
           result := checkSubrange (result, tinfo, getSType (lSub), getSType (rSub))
        END
+    ELSIF checkGenericUnboundedTyped (left, right) OR
+          checkGenericUnboundedTyped (right, left)
+    THEN
+       (* ARRAY OF BYTE (or WORD or LOC etc will be compatible with any typed
+          non ZRC type.  *)
+       RETURN true
     ELSIF IsUnbounded (left) AND (IsArray (right) OR IsUnbounded (right))
     THEN
        IF IsGenericSystemType (getSType (left)) OR IsGenericSystemType (getSType (right))
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/M2Code.mod gcc-16-20250921/gcc/m2/gm2-compiler/M2Code.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/M2Code.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/M2Code.mod	Sun Sep 21 22:32:38 2025
*************** FROM M2SSA IMPORT DiscoverSSA ;
*** 78,83 ****
--- 78,85 ----
  FROM m2pp IMPORT CreateDumpGimple, CloseDumpGimple ;
  FROM DynamicStrings IMPORT String, KillString ;
  
+ IMPORT M2Diagnostic ;
+ 
  
  CONST
     MaxOptimTimes   = 10 ;   (* upper limit of no of times we run through all optimization *)
*************** END Percent ;
*** 119,128 ****
  
  
  (*
!    OptimizationAnalysis - displays some simple front end optimization statistics.
  *)
  
! PROCEDURE OptimizationAnalysis ;
  VAR
     value: CARDINAL ;
  BEGIN
--- 121,130 ----
  
  
  (*
!    ResourceAnalysis - displays resource analysis relating to the front end.
  *)
  
! PROCEDURE ResourceAnalysis ;
  VAR
     value: CARDINAL ;
  BEGIN
*************** BEGIN
*** 146,152 ****
        FlushBuffer (StdOut)
     END ;
     DumpQuadruples ('after all front end optimization\n')
! END OptimizationAnalysis ;
  
  
  (*
--- 148,154 ----
        FlushBuffer (StdOut)
     END ;
     DumpQuadruples ('after all front end optimization\n')
! END ResourceAnalysis ;
  
  
  (*
*************** BEGIN
*** 293,299 ****
     qprintf0 ('        gcc trees given to the gcc backend\n') ;
     EndGlobalContext ;
  
!    OptimizationAnalysis
  END Code ;
  
  
--- 295,301 ----
     qprintf0 ('        gcc trees given to the gcc backend\n') ;
     EndGlobalContext ;
  
!    ResourceAnalysis
  END Code ;
  
  
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/M2Comp.mod gcc-16-20250921/gcc/m2/gm2-compiler/M2Comp.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/M2Comp.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/M2Comp.mod	Sun Sep 21 22:32:38 2025
*************** FROM P0SymBuild IMPORT P0Init, P1Init ;
*** 48,53 ****
--- 48,54 ----
  FROM M2Debug IMPORT Assert ;
  
  IMPORT m2flex ;
+ IMPORT m2block ;
  IMPORT P0SyntaxCheck ;
  IMPORT P1Build ;
  IMPORT P2Build ;
*************** IMPORT P3Build ;
*** 56,61 ****
--- 57,63 ----
  IMPORT PHBuild ;
  IMPORT PCSymBuild ;
  IMPORT DynamicStrings ;
+ IMPORT M2Diagnostic ;
  
  FROM M2Batch IMPORT GetSource, GetModuleNo, GetDefinitionModuleFile, GetModuleFile,
                      AssociateModule, AssociateDefinition, MakeImplementationSource,
*************** FROM SymbolTable IMPORT GetSymName, IsDe
*** 70,75 ****
--- 72,78 ----
                          GetImportStatementList ;
  
  FROM M2Search IMPORT FindSourceDefFile ;
+ FROM M2Diagnostic IMPORT Diagnostic, InitMemDiagnostic, MemIncr, MemSet ;
  
  FROM FIO IMPORT File, StdErr, StdOut, Close, EOF, IsNoError, WriteLine,
                  WriteChar, FlushOutErr ;
*************** FROM M2Printf IMPORT fprintf0, fprintf1
*** 80,87 ****
  FROM M2Quiet IMPORT qprintf0, qprintf1, qprintf2 ;
  
  FROM M2Options IMPORT Verbose, GetM2Prefix, GetM, GetMM, GetDepTarget, GetMF, GetMP,
!                       GetObj, PPonly, Statistics, Quiet, WholeProgram, GetMD, GetMMD,
!                       ExtendedOpaque, GenModuleList ;
  
  FROM PathName IMPORT DumpPathName ;
  FROM Lists IMPORT List, NoOfItemsInList, GetItemFromList ;
--- 83,90 ----
  FROM M2Quiet IMPORT qprintf0, qprintf1, qprintf2 ;
  
  FROM M2Options IMPORT Verbose, GetM2Prefix, GetM, GetMM, GetDepTarget, GetMF, GetMP,
!                       GetObj, PPonly, Quiet, WholeProgram, GetMD, GetMMD,
!                       ExtendedOpaque, GenModuleList, TimeReport, MemReport ;
  
  FROM PathName IMPORT DumpPathName ;
  FROM Lists IMPORT List, NoOfItemsInList, GetItemFromList ;
*************** FROM DynamicStrings IMPORT String, InitS
*** 92,97 ****
--- 95,101 ----
                             InitStringChar, RIndex, Slice, Equal, RemoveWhitePrefix ;
  
  
+ 
  CONST
     Debugging = FALSE ;
  
*************** END Compile ;
*** 281,295 ****
  
  PROCEDURE compile (filename: ADDRESS) ;
  VAR
!    f: String ;
  BEGIN
     f := InitStringCharStar (filename) ;
     Compile (f) ;
!    f := KillString (f)
  END compile ;
  
  
  (*
     ExamineHeader - examines up until the ';', '[' or eof and determines if the source file
                     is a program, implementation/definition module.
  *)
--- 285,328 ----
  
  PROCEDURE compile (filename: ADDRESS) ;
  VAR
!    f, s: String ;
  BEGIN
+    M2Diagnostic.Configure (TimeReport, MemReport) ;
     f := InitStringCharStar (filename) ;
     Compile (f) ;
!    f := KillString (f) ;
!    PopulateResource ;
!    IF TimeReport OR MemReport
!    THEN
!       s := WriteS (StdOut, M2Diagnostic.Generate (FALSE)) ;
!       FlushOutErr ;
!       s := KillString (s)
!    END
  END compile ;
  
  
  (*
+    PopulateResource -
+ *)
+ 
+ PROCEDURE PopulateResource ;
+ VAR
+    StatsMemDiag: Diagnostic ;
+ BEGIN
+    IF MemReport
+    THEN
+       StatsMemDiag
+          := InitMemDiagnostic
+             ('M2Comp:statistics',
+             'total source lines {1d} total constants {2d} total types {3d}') ;
+       MemSet (StatsMemDiag, 1, m2flex.GetTotalLines ()) ;
+       MemSet (StatsMemDiag, 2, m2block.GetTotalConstants ()) ;
+       MemSet (StatsMemDiag, 3, m2block.GetGlobalTypes ())
+    END
+ END PopulateResource ;
+ 
+ 
+ (*
     ExamineHeader - examines up until the ';', '[' or eof and determines if the source file
                     is a program, implementation/definition module.
  *)
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/M2GCCDeclare.mod gcc-16-20250921/gcc/m2/gm2-compiler/M2GCCDeclare.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/M2GCCDeclare.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/M2GCCDeclare.mod	Sun Sep 21 22:32:38 2025
*************** FROM M2Options IMPORT GenerateDebugging,
*** 43,48 ****
--- 43,49 ----
                        ScaffoldStatic, GetRuntimeModuleOverride ;
  
  FROM M2AsmUtil IMPORT GetFullSymName, GetFullScopeAsmName ;
+ FROM FormatStrings IMPORT Sprintf1 ;
  
  FROM M2Batch IMPORT MakeDefinitionSource ;
  FROM NameKey IMPORT Name, MakeKey, NulName, KeyToCharStar, makekey ;
*************** FROM M2LexBuf IMPORT TokenToLineNo, Find
*** 52,57 ****
--- 53,59 ----
  FROM M2MetaError IMPORT MetaError1, MetaError2, MetaError3 ;
  FROM M2Error IMPORT FlushErrors, InternalError ;
  FROM M2LangDump IMPORT GetDumpFile ;
+ FROM M2Diagnostic IMPORT Diagnostic, InitTimeDiagnostic, EnterDiagnostic, ExitDiagnostic ;
  
  FROM M2Printf IMPORT printf0, printf1, printf2, printf3,
                       fprintf0, fprintf1, fprintf2, fprintf3 ;
*************** FROM SymbolTable IMPORT NulSym,
*** 84,89 ****
--- 86,92 ----
        	       	     	GetSubrange, PutSubrange, GetArraySubscript,
        	       	     	NoOfParamAny, GetNthParamAny,
                          PushValue, PopValue, PopSize,
+                         IsProcedureAnyNoReturn,
                          IsTemporary, IsUnbounded, IsPartialUnbounded,
                          IsEnumeration, IsVar,
        	       	     	IsSubrange, IsPointer, IsRecord, IsArray,
*************** FROM SymbolTable IMPORT NulSym,
*** 121,130 ****
                          GetAlignment, IsDeclaredPacked, PutDeclaredPacked,
                          GetDefaultRecordFieldAlignment, IsDeclaredPackedResolved,
                          GetPackedEquivalent,
                          GetParameterShadowVar,
                          GetUnboundedRecordType,
                          GetModuleCtors, GetProcedureProcType,
!                         MakeSubrange, MakeConstVar, MakeConstLit,
                          PutConst,
  			ForeachOAFamily, GetOAFamily,
                          IsModuleWithinProcedure, IsVariableSSA,
--- 124,134 ----
                          GetAlignment, IsDeclaredPacked, PutDeclaredPacked,
                          GetDefaultRecordFieldAlignment, IsDeclaredPackedResolved,
                          GetPackedEquivalent,
+                         GetSetArray, PutSetInWord,
                          GetParameterShadowVar,
                          GetUnboundedRecordType,
                          GetModuleCtors, GetProcedureProcType,
!                         MakeSubrange, MakeConstVar, MakeConstLit, MakeSetArray, PutSetArray,
                          PutConst,
  			ForeachOAFamily, GetOAFamily,
                          IsModuleWithinProcedure, IsVariableSSA,
*************** FROM m2type IMPORT MarkFunctionReference
*** 194,200 ****
                     BuildSetType, BuildEndVarient, BuildEndArrayType, InitFunctionTypeParameters,
                     BuildProcTypeParameterDeclaration, DeclareKnownType,
                     ValueOutOfTypeRange, ExceedsTypeRange,
!                    GetMaxFrom, GetMinFrom ;
  
  FROM m2convert IMPORT BuildConvert ;
  
--- 198,204 ----
                     BuildSetType, BuildEndVarient, BuildEndArrayType, InitFunctionTypeParameters,
                     BuildProcTypeParameterDeclaration, DeclareKnownType,
                     ValueOutOfTypeRange, ExceedsTypeRange,
!                    GetMaxFrom, GetMinFrom, GetBooleanEnumList ;
  
  FROM m2convert IMPORT BuildConvert ;
  
*************** VAR
*** 260,265 ****
--- 264,271 ----
     action              : IsAction ;
     ConstantResolved,
     enumDeps            : BOOLEAN ;
+    tempset             : CARDINAL ; (* Count of the number of set     *)
+                                     (* arrays created.                *)
  
  
  (* *************************************************** *)
*************** END GetEnumList ;
*** 666,672 ****
  
  PROCEDURE PutEnumList (sym: CARDINAL; enumlist: tree) ;
  BEGIN
!    PutIndice(EnumerationIndex, sym, enumlist)
  END PutEnumList ;
  
  
--- 672,678 ----
  
  PROCEDURE PutEnumList (sym: CARDINAL; enumlist: tree) ;
  BEGIN
!    PutIndice (EnumerationIndex, sym, enumlist)
  END PutEnumList ;
  
  
*************** END DoStartDeclaration ;
*** 729,745 ****
  
  PROCEDURE ArrayComponentsDeclared (sym: CARDINAL) : BOOLEAN ;
  VAR
!    Subscript      : CARDINAL ;
     Type, High, Low: CARDINAL ;
  BEGIN
!    Subscript := GetArraySubscript(sym) ;
!    Assert(IsSubscript(Subscript)) ;
!    Type := GetDType(Subscript) ;
!    Low := GetTypeMin(Type) ;
!    High := GetTypeMax(Type) ;
!    RETURN( IsFullyDeclared(Type) AND
!            IsFullyDeclared(Low) AND
!            IsFullyDeclared(High) )
  END ArrayComponentsDeclared ;
  
  
--- 735,751 ----
  
  PROCEDURE ArrayComponentsDeclared (sym: CARDINAL) : BOOLEAN ;
  VAR
!    Subscript      ,
     Type, High, Low: CARDINAL ;
  BEGIN
!    Subscript := GetArraySubscript (sym) ;
!    Assert (IsSubscript (Subscript)) ;
!    Type := GetDType (Subscript) ;
!    Low := GetTypeMin (Type) ;
!    High := GetTypeMax (Type) ;
!    RETURN( IsFullyDeclared (Type) AND
!            IsFullyDeclared (Low) AND
!            IsFullyDeclared (High) )
  END ArrayComponentsDeclared ;
  
  
*************** END CanDeclareRecord ;
*** 815,825 ****
  
  PROCEDURE FinishDeclareRecord (sym: CARDINAL) ;
  BEGIN
!    DeclareTypeConstFully(sym) ;
!    WatchRemoveList(sym, heldbyalignment) ;
!    WatchRemoveList(sym, finishedalignment) ;
!    WatchRemoveList(sym, todolist) ;
!    WatchIncludeList(sym, fullydeclared)
  END FinishDeclareRecord ;
  
  
--- 821,831 ----
  
  PROCEDURE FinishDeclareRecord (sym: CARDINAL) ;
  BEGIN
!    DeclareTypeConstFully (sym) ;
!    WatchRemoveList (sym, heldbyalignment) ;
!    WatchRemoveList (sym, finishedalignment) ;
!    WatchRemoveList (sym, todolist) ;
!    WatchIncludeList (sym, fullydeclared)
  END FinishDeclareRecord ;
  
  
*************** END CanDeclareArrayAsNil ;
*** 912,919 ****
  *)
  
  PROCEDURE DeclareArrayAsNil (sym: CARDINAL) ;
  BEGIN
!    PreAddModGcc(sym, BuildStartArrayType(BuildIndex(GetDeclaredMod(sym), sym), NIL, GetDType(sym))) ;
     WatchIncludeList(sym, niltypedarrays)
  END DeclareArrayAsNil ;
  
--- 918,931 ----
  *)
  
  PROCEDURE DeclareArrayAsNil (sym: CARDINAL) ;
+ VAR
+    tokenno    : CARDINAL ;
+    typeOfArray: CARDINAL ;
  BEGIN
!    typeOfArray := GetDType(sym) ;
!    tokenno := GetDeclaredMod (sym) ;
!    PreAddModGcc(sym, BuildStartArrayType (BuildIndex (tokenno, sym, FALSE),
!                                           NIL, typeOfArray)) ;
     WatchIncludeList(sym, niltypedarrays)
  END DeclareArrayAsNil ;
  
*************** BEGIN
*** 1040,1048 ****
     ELSIF IsArray(sym)
     THEN
        RETURN( IsArrayDependants(sym, q) )
!    ELSIF IsProcType(sym)
     THEN
!       RETURN( IsProcTypeDependants(sym, q) )
     ELSIF IsUnbounded(sym)
     THEN
        RETURN( IsUnboundedDependants(sym, q) )
--- 1052,1060 ----
     ELSIF IsArray(sym)
     THEN
        RETURN( IsArrayDependants(sym, q) )
!    ELSIF IsProcType (sym)
     THEN
!       RETURN( IsProcTypeDependants (sym, q) )
     ELSIF IsUnbounded(sym)
     THEN
        RETURN( IsUnboundedDependants(sym, q) )
*************** END IsFullyDeclared ;
*** 1100,1106 ****
  
  PROCEDURE AllDependantsFullyDeclared (sym: CARDINAL) : BOOLEAN ;
  BEGIN
!    RETURN( IsTypeQ(sym, IsFullyDeclared) )
  END AllDependantsFullyDeclared ;
  
  
--- 1112,1118 ----
  
  PROCEDURE AllDependantsFullyDeclared (sym: CARDINAL) : BOOLEAN ;
  BEGIN
!    RETURN( IsTypeQ (sym, IsFullyDeclared) )
  END AllDependantsFullyDeclared ;
  
  
*************** END AllDependantsFullyDeclared ;
*** 1111,1117 ****
  
  PROCEDURE NotAllDependantsFullyDeclared (sym: CARDINAL) : BOOLEAN ;
  BEGIN
!    RETURN( NOT IsTypeQ(sym, IsFullyDeclared) )
  END NotAllDependantsFullyDeclared ;
  
  
--- 1123,1129 ----
  
  PROCEDURE NotAllDependantsFullyDeclared (sym: CARDINAL) : BOOLEAN ;
  BEGIN
!    RETURN( NOT IsTypeQ (sym, IsFullyDeclared) )
  END NotAllDependantsFullyDeclared ;
  
  
*************** END IsPartiallyDeclared ;
*** 1132,1138 ****
  
  PROCEDURE AllDependantsPartiallyDeclared (sym: CARDINAL) : BOOLEAN ;
  BEGIN
!    RETURN( IsTypeQ(sym, IsPartiallyDeclared) )
  END AllDependantsPartiallyDeclared ;
  
  
--- 1144,1150 ----
  
  PROCEDURE AllDependantsPartiallyDeclared (sym: CARDINAL) : BOOLEAN ;
  BEGIN
!    RETURN( IsTypeQ (sym, IsPartiallyDeclared) )
  END AllDependantsPartiallyDeclared ;
  
  
*************** END AllDependantsPartiallyDeclared ;
*** 1143,1149 ****
  
  PROCEDURE NotAllDependantsPartiallyDeclared (sym: CARDINAL) : BOOLEAN ;
  BEGIN
!    RETURN( NOT IsTypeQ(sym, IsPartiallyDeclared) )
  END NotAllDependantsPartiallyDeclared ;
  
  
--- 1155,1161 ----
  
  PROCEDURE NotAllDependantsPartiallyDeclared (sym: CARDINAL) : BOOLEAN ;
  BEGIN
!    RETURN( NOT IsTypeQ (sym, IsPartiallyDeclared) )
  END NotAllDependantsPartiallyDeclared ;
  
  
*************** END IsPartiallyOrFullyDeclared ;
*** 1165,1171 ****
  
  PROCEDURE AllDependantsPartiallyOrFullyDeclared (sym: CARDINAL) : BOOLEAN ;
  BEGIN
!    RETURN( IsTypeQ(sym, IsPartiallyOrFullyDeclared) )
  END AllDependantsPartiallyOrFullyDeclared ;
  
  
--- 1177,1183 ----
  
  PROCEDURE AllDependantsPartiallyOrFullyDeclared (sym: CARDINAL) : BOOLEAN ;
  BEGIN
!    RETURN( IsTypeQ (sym, IsPartiallyOrFullyDeclared) )
  END AllDependantsPartiallyOrFullyDeclared ;
  
  
*************** END TypeConstDependantsFullyDeclared ;
*** 1208,1215 ****
  
  PROCEDURE CanBeDeclaredViaPartialDependants (sym: CARDINAL) : BOOLEAN ;
  BEGIN
!    RETURN( (IsPointer(sym) OR IsProcType(sym)) AND
!            AllDependantsPartiallyOrFullyDeclared(sym) )
  END CanBeDeclaredViaPartialDependants ;
  
  
--- 1220,1227 ----
  
  PROCEDURE CanBeDeclaredViaPartialDependants (sym: CARDINAL) : BOOLEAN ;
  BEGIN
!    RETURN( (IsPointer (sym) OR IsProcType (sym)) AND
!            AllDependantsPartiallyOrFullyDeclared (sym) )
  END CanBeDeclaredViaPartialDependants ;
  
  
*************** BEGIN
*** 1262,1268 ****
           WatchIncludeList(sym, fullydeclared) ;
           WatchRemoveList(sym, partiallydeclared) ;
           WatchRemoveList(sym, todolist)
!       ELSE
           t := TypeConstFullyDeclared(sym) ;
           IF t#NIL
           THEN
--- 1274,1281 ----
           WatchIncludeList(sym, fullydeclared) ;
           WatchRemoveList(sym, partiallydeclared) ;
           WatchRemoveList(sym, todolist)
!       ELSIF NOT IsFullyDeclared (sym)
!       THEN
           t := TypeConstFullyDeclared(sym) ;
           IF t#NIL
           THEN
*************** END DeclareTypeFromPartial ;
*** 1301,1306 ****
--- 1314,1418 ----
  
  
  (*
+    CanCreateSetArray - return true if we need to create a set array.
+                        All sets will have a set array created even
+                        if it is not required.
+ *)
+ 
+ PROCEDURE CanCreateSetArray (sym: CARDINAL) : BOOLEAN ;
+ VAR
+    setarray: CARDINAL ;
+ BEGIN
+    IF IsSet (sym) AND CanCreateSet (sym)
+    THEN
+       setarray := GetSetArray (sym) ;
+       IF setarray = NulSym
+       THEN
+          RETURN TRUE
+       ELSE
+          (* Set array already exists, this can occur if the set is a base type
+             (bitset for example).
+              So we just move the symbol to the correct state.  *)
+          WatchRemoveList (sym, todolist) ;
+          WatchIncludeList (sym, finishedsetarray) ;
+          (* WatchIncludeList (setarray, todolist)  *)
+       END
+    END ;
+    RETURN FALSE
+ END CanCreateSetArray ;
+ 
+ 
+ (*
+    CreateSetArray - declare the set array for a set type.
+ *)
+ 
+ PROCEDURE CreateSetArray (set: CARDINAL) ;
+ VAR
+    type, array,
+    high, low  : CARDINAL ;
+ BEGIN
+    type := GetSType (set) ;
+    low  := GetTypeMin (type) ;
+    high := GetTypeMax (type) ;
+    DeclareConstant (GetDeclaredMod (set), high) ;
+    DeclareConstant (GetDeclaredMod (set), low) ;
+    array := DeclareSetArray (set, low, high) ;
+    PutSetArray (set, array) ;
+    WatchRemoveList (set, todolist) ;
+    WatchIncludeList (set, finishedsetarray) ;
+    (* WatchIncludeList (array, todolist)  *)
+ END CreateSetArray ;
+ 
+ 
+ (*
+    CanCreateSet - returns TRUE if the set can be created.
+                   All dependents of sym have been declared to GCC.
+ *)
+ 
+ PROCEDURE CanCreateSet (set: CARDINAL) : BOOLEAN ;
+ VAR
+    type, low, high: CARDINAL ;
+ BEGIN
+    type := GetSType (set) ;
+    IF NOT GccKnowsAbout (type)
+    THEN
+       RETURN FALSE
+    END ;
+    low  := GetTypeMin (type) ;
+    high := GetTypeMax (type) ;
+    IF NOT GccKnowsAbout (low)
+    THEN
+       RETURN FALSE
+    END ;
+    IF NOT GccKnowsAbout (high)
+    THEN
+       RETURN FALSE
+    END ;
+    RETURN TRUE
+ END CanCreateSet ;
+ 
+ 
+ (*
+    CreateSet -
+ *)
+ 
+ PROCEDURE CreateSet (set: CARDINAL) ;
+ VAR
+    gccset: tree ;
+ BEGIN
+    gccset := DeclareSet (set) ;
+    IF gccset = NIL
+    THEN
+       InternalError ('expecting to be able to create a gcc type')
+    ELSE
+       AddModGcc (set, gccset) ;
+       WatchIncludeList (set, fullydeclared) ;
+       WatchRemoveList (set, finishedsetarray)
+    END
+ END CreateSet ;
+ 
+ 
+ (*
     CanBeDeclaredPartiallyViaPartialDependants - returns TRUE if, sym,
                                                  can be partially declared via
                                                  another partially declared type.
*************** END DeclareTypeFromPartial ;
*** 1308,1314 ****
  
  PROCEDURE CanBeDeclaredPartiallyViaPartialDependants (sym: CARDINAL) : BOOLEAN ;
  BEGIN
!    RETURN( IsType(sym) AND AllDependantsPartiallyDeclared(sym) )
  END CanBeDeclaredPartiallyViaPartialDependants ;
  
  
--- 1420,1426 ----
  
  PROCEDURE CanBeDeclaredPartiallyViaPartialDependants (sym: CARDINAL) : BOOLEAN ;
  BEGIN
!    RETURN( IsType (sym) AND AllDependantsPartiallyDeclared (sym) )
  END CanBeDeclaredPartiallyViaPartialDependants ;
  
  
*************** TYPE
*** 1339,1345 ****
     Rule = (norule, partialtype, arraynil, pointernilarray, arraypartial,
             pointerfully, recordkind, recordfully, typeconstfully,
             pointerfrompartial, typefrompartial, partialfrompartial,
!            partialtofully, circulartodo, circularpartial, circularniltyped) ;
  
  VAR
     bodyp          : WalkAction ;
--- 1451,1458 ----
     Rule = (norule, partialtype, arraynil, pointernilarray, arraypartial,
             pointerfully, recordkind, recordfully, typeconstfully,
             pointerfrompartial, typefrompartial, partialfrompartial,
!            partialtofully, circulartodo, circularpartial, circularniltyped,
!            setarraynul, setfully) ;
  
  VAR
     bodyp          : WalkAction ;
*************** BEGIN
*** 1361,1382 ****
     THEN
        CASE bodyr OF
  
!       norule            :  printf0('norule') |
!       partialtype       :  printf0('partialtype') |
!       arraynil          :  printf0('arraynil') |
!       pointernilarray   :  printf0('pointernilarray') |
!       arraypartial      :  printf0('arraypartial') |
!       pointerfully      :  printf0('pointerfully') |
!       recordkind        :  printf0('recordkind') |
!       recordfully       :  printf0('recordfully') |
!       typeconstfully    :  printf0('typeconstfully') |
!       pointerfrompartial:  printf0('pointerfrompartial') |
!       typefrompartial   :  printf0('typefrompartial') |
!       partialfrompartial:  printf0('partialfrompartial') |
!       partialtofully    :  printf0('partialtofully') |
!       circulartodo      :  printf0('circulartodo') |
!       circularpartial   :  printf0('circularpartial') |
!       circularniltyped  :  printf0('circularniltyped')
  
        ELSE
           InternalError ('unknown rule')
--- 1474,1497 ----
     THEN
        CASE bodyr OF
  
!       norule            :  printf0 ('norule') |
!       partialtype       :  printf0 ('partialtype') |
!       arraynil          :  printf0 ('arraynil') |
!       pointernilarray   :  printf0 ('pointernilarray') |
!       arraypartial      :  printf0 ('arraypartial') |
!       pointerfully      :  printf0 ('pointerfully') |
!       recordkind        :  printf0 ('recordkind') |
!       recordfully       :  printf0 ('recordfully') |
!       typeconstfully    :  printf0 ('typeconstfully') |
!       pointerfrompartial:  printf0 ('pointerfrompartial') |
!       typefrompartial   :  printf0 ('typefrompartial') |
!       partialfrompartial:  printf0 ('partialfrompartial') |
!       partialtofully    :  printf0 ('partialtofully') |
!       circulartodo      :  printf0 ('circulartodo') |
!       circularpartial   :  printf0 ('circularpartial') |
!       circularniltyped  :  printf0 ('circularniltyped') |
!       setarraynul       :  printf0 ('setarraynul') |
!       setfully          :  printf0 ('setfully')
  
        ELSE
           InternalError ('unknown rule')
*************** VAR
*** 1450,1455 ****
--- 1565,1571 ----
     finished: BOOLEAN ;
     copy    : Group ;
  BEGIN
+    EnterDiagnostic (DeclaredOutstandingTypesDiag) ;
     copy := NIL ;
     finished := FALSE ;
     REPEAT
*************** BEGIN
*** 1469,1474 ****
--- 1585,1604 ----
        THEN
           (* continue looping *)
        ELSIF ForeachTryDeclare (todolist,
+                                setarraynul,
+                                CanCreateSetArray,
+                                CreateSetArray)
+       THEN
+          (* Populates the finishedsetarray list with each set seen.  *)
+          (* Continue looping.  *)
+       ELSIF ForeachTryDeclare (finishedsetarray,
+                                setfully,
+                                CanCreateSet,
+                                CreateSet)
+       THEN
+          (* Populates the fullydeclared list with each set.  *)
+          (* Continue looping.  *)
+       ELSIF ForeachTryDeclare (todolist,
                                 arraynil,
                                 CanDeclareArrayAsNil,
                                 DeclareArrayAsNil)
*************** BEGIN
*** 1553,1558 ****
--- 1683,1689 ----
        THEN
        END
     END ;
+    ExitDiagnostic (DeclaredOutstandingTypesDiag) ;
     RETURN NoOfElementsInSet (GlobalGroup^.ToDoList) = 0
  END DeclaredOutstandingTypes ;
  
*************** END DeclaredOutstandingTypes ;
*** 1565,1582 ****
  
  PROCEDURE CompleteDeclarationOf (sym: CARDINAL) : tree ;
  BEGIN
!    IF IsArray(sym)
     THEN
!       RETURN( DeclareArray(sym) )
!    ELSIF IsProcType(sym)
     THEN
!       RETURN( DeclareProcType(sym) )
!    ELSIF IsRecordField(sym)
     THEN
!       RETURN( DeclareRecordField(sym) )
!    ELSIF IsPointer(sym)
     THEN
!       RETURN( DeclarePointer(sym) )
     ELSE
        RETURN( NIL )
     END
--- 1696,1713 ----
  
  PROCEDURE CompleteDeclarationOf (sym: CARDINAL) : tree ;
  BEGIN
!    IF IsArray (sym)
     THEN
!       RETURN( DeclareArray (sym) )
!    ELSIF IsProcType (sym)
     THEN
!       RETURN( DeclareProcType (sym) )
!    ELSIF IsRecordField (sym)
     THEN
!       RETURN( DeclareRecordField (sym) )
!    ELSIF IsPointer (sym)
     THEN
!       RETURN( DeclarePointer (sym) )
     ELSE
        RETURN( NIL )
     END
*************** VAR
*** 1593,1618 ****
     t       : tree ;
     location: location_t ;
  BEGIN
!    IF GetSType(sym)=NulSym
     THEN
!       MetaError1('base type {%1Ua} not understood', sym) ;
        InternalError ('base type should have been declared')
     ELSE
!       IF GetSymName(sym)=NulName
        THEN
!          RETURN( tree(Mod2Gcc(GetSType(sym))) )
        ELSE
!          location := TokenToLocation(GetDeclaredMod(sym)) ;
!          IF GccKnowsAbout(sym)
           THEN
!             t := Mod2Gcc(sym)
           ELSE
!             (* not partially declared therefore start it *)
!             t := BuildStartType(location,
!                                 KeyToCharStar(GetFullSymName(sym)), Mod2Gcc(GetSType(sym)))
           END ;
!          t := BuildEndType(location, t) ;  (* now finish it *)
!          RETURN( t )
        END
     END
  END DeclareType ;
--- 1724,1750 ----
     t       : tree ;
     location: location_t ;
  BEGIN
!    IF GetSType (sym) = NulSym
     THEN
!       MetaError1 ('base type {%1Ua} not understood', sym) ;
        InternalError ('base type should have been declared')
     ELSE
!       IF GetSymName (sym) = NulName
        THEN
!          RETURN( tree (Mod2Gcc (GetSType (sym))) )
        ELSE
!          location := TokenToLocation (GetDeclaredMod (sym)) ;
!          IF GccKnowsAbout (sym)
           THEN
!             t := Mod2Gcc (sym)
           ELSE
!             (* Not partially declared therefore start it.  *)
!             t := BuildStartType (location,
!                                  KeyToCharStar (GetFullSymName (sym)),
!                                  Mod2Gcc (GetSType (sym)))
           END ;
!          t := BuildEndType (location, t) ;  (* Now finish it.  *)
!          RETURN t
        END
     END
  END DeclareType ;
*************** BEGIN
*** 2183,2191 ****
     ELSIF IsArray(sym)
     THEN
        WalkArrayDependants(sym, p)
!    ELSIF IsProcType(sym)
     THEN
!       WalkProcTypeDependants(sym, p)
     ELSIF IsUnbounded(sym)
     THEN
        WalkUnboundedDependants(sym, p)
--- 2315,2323 ----
     ELSIF IsArray(sym)
     THEN
        WalkArrayDependants(sym, p)
!    ELSIF IsProcType (sym)
     THEN
!       WalkProcTypeDependants (sym, p)
     ELSIF IsUnbounded(sym)
     THEN
        WalkUnboundedDependants(sym, p)
*************** END TraverseDependantsInner ;
*** 2235,2245 ****
  
  PROCEDURE TraverseDependants (sym: WORD) ;
  BEGIN
!    IF VisitedList=NIL
     THEN
!       VisitedList := InitSet(1) ;
!       TraverseDependantsInner(sym) ;
!       VisitedList := KillSet(VisitedList)
     ELSE
        InternalError ('recursive call to TraverseDependants caught')
     END
--- 2367,2377 ----
  
  PROCEDURE TraverseDependants (sym: WORD) ;
  BEGIN
!    IF VisitedList = NIL
     THEN
!       VisitedList := InitSet (1) ;
!       TraverseDependantsInner (sym) ;
!       VisitedList := KillSet (VisitedList)
     ELSE
        InternalError ('recursive call to TraverseDependants caught')
     END
*************** END TraverseDependants ;
*** 2247,2253 ****
  
  
  (*
!    WalkTypeInfo - walks type, sym, and its dependants.
  *)
  
  PROCEDURE WalkTypeInfo (sym: WORD) ;
--- 2379,2398 ----
  
  
  (*
!    WalkUnbounded -
! *)
! 
! PROCEDURE WalkUnbounded (sym: WORD) ;
! BEGIN
!    Assert (IsUnbounded (sym)) ;
!    TraverseDependants (sym) ;
!    WalkTypeInfo (GetUnboundedRecordType (sym)) ;
!    WalkTypeInfo (GetSType (sym))
! END WalkUnbounded ;
! 
! 
! (*
!    WalkTypeInfo - walks type sym and its dependants.
  *)
  
  PROCEDURE WalkTypeInfo (sym: WORD) ;
*************** BEGIN
*** 2255,2270 ****
     IF IsVarient(sym)
     THEN
        InternalError ('why have we reached here?')
!    ELSIF IsVar(sym)
     THEN
!       WalkTypeInfo(GetSType(sym)) ;
!       IF GetVarBackEndType(sym)#NulSym
        THEN
!          WalkTypeInfo(GetVarBackEndType(sym))
        END
!    ELSIF IsAModula2Type(sym)
     THEN
!       TraverseDependants(sym)
     END
  END WalkTypeInfo ;
  
--- 2400,2424 ----
     IF IsVarient(sym)
     THEN
        InternalError ('why have we reached here?')
!    ELSIF IsVar (sym)
     THEN
!       WalkTypeInfo (GetSType (sym)) ;
!       IF GetVarBackEndType (sym) # NulSym
        THEN
!          WalkTypeInfo (GetVarBackEndType (sym))
        END
!    ELSIF IsUnbounded (sym)
     THEN
!       WalkUnbounded (sym)
!    ELSIF IsAModula2Type (sym)
!    THEN
!       TraverseDependants (sym)
!    ELSIF IsProcedure (sym)
!    THEN
!       WalkProcedureDependants (sym, WalkTypeInfo)
!    ELSIF IsProcType (sym)
!    THEN
!       WalkProcTypeDependants (sym, WalkTypeInfo)
     END
  END WalkTypeInfo ;
  
*************** END WalkUnboundedProcedureParameters ;
*** 2341,2347 ****
  
  PROCEDURE WalkTypesInProcedure (sym: WORD) ;
  BEGIN
!    ForeachLocalSymDo(sym, TraverseDependants)
  END WalkTypesInProcedure ;
  
  
--- 2495,2501 ----
  
  PROCEDURE WalkTypesInProcedure (sym: WORD) ;
  BEGIN
!    ForeachLocalSymDo (sym, TraverseDependants)
  END WalkTypesInProcedure ;
  
  
*************** BEGIN
*** 2358,2366 ****
        n := GetSymName(sym) ;
        printf1('Declaring types in MODULE %a\n', n)
     END ;
!    ForeachLocalSymDo(sym, WalkTypeInfo) ;
!    ForeachLocalSymDo(sym, WalkUnboundedProcedureParameters) ;
!    ForeachInnerModuleDo(sym, WalkTypesInModule)
  END WalkTypesInModule ;
  
  
--- 2512,2520 ----
        n := GetSymName(sym) ;
        printf1('Declaring types in MODULE %a\n', n)
     END ;
!    ForeachLocalSymDo (sym, WalkTypeInfo) ;
!    ForeachLocalSymDo (sym, WalkUnboundedProcedureParameters) ;
!    ForeachInnerModuleDo (sym, WalkTypesInModule)
  END WalkTypesInModule ;
  
  
*************** VAR
*** 2375,2386 ****
     final: BOOLEAN ;
  BEGIN
     final := TRUE ;
!    IF NOT q(GetSType(sym))
     THEN
        final := FALSE
     END ;
!    align := GetAlignment(sym) ;
!    IF (align#NulSym) AND (NOT q(align))
     THEN
        final := FALSE
     END ;
--- 2529,2540 ----
     final: BOOLEAN ;
  BEGIN
     final := TRUE ;
!    IF NOT q (GetSType (sym))
     THEN
        final := FALSE
     END ;
!    align := GetAlignment (sym) ;
!    IF (align # NulSym) AND (NOT q (align))
     THEN
        final := FALSE
     END ;
*************** END IsExternalToWholeProgram ;
*** 2494,2500 ****
     DeclareProcedureToGccWholeProgram -
  *)
  
! PROCEDURE DeclareProcedureToGccWholeProgram (Sym: CARDINAL) ;
  VAR
     returnType,
     GccParam  : tree ;
--- 2648,2654 ----
     DeclareProcedureToGccWholeProgram -
  *)
  
! PROCEDURE DeclareProcedureToGccWholeProgram (ProcedureSym: CARDINAL) ;
  VAR
     returnType,
     GccParam  : tree ;
*************** VAR
*** 2505,2523 ****
     begin, end,
     location  : location_t ;
  BEGIN
!    IF (NOT GccKnowsAbout(Sym)) AND (NOT IsPseudoProcFunc(Sym))
     THEN
!       BuildStartFunctionDeclaration(UsesVarArgs(Sym)) ;
!       p := NoOfParamAny (Sym) ;
        i := p ;
        WHILE i>0 DO
           (* note we dont use GetNthParamAny as we want the parameter that is seen by the procedure block
              remember that this is treated exactly the same as a variable, just its position on
              the activation record is special (ie a parameter)
           *)
!          Variable := GetNth(Sym, i) ;
!          location := TokenToLocation(GetDeclaredMod(Variable)) ;
!          IF IsUnboundedParamAny (Sym, i)
           THEN
              GccParam := BuildParameterDeclaration(location,
                                                    KeyToCharStar(GetSymName(Variable)),
--- 2659,2678 ----
     begin, end,
     location  : location_t ;
  BEGIN
!    Assert (IsProcedure (ProcedureSym)) ;
!    IF (NOT GccKnowsAbout(ProcedureSym)) AND (NOT IsPseudoProcFunc(ProcedureSym))
     THEN
!       BuildStartFunctionDeclaration(UsesVarArgs(ProcedureSym)) ;
!       p := NoOfParamAny (ProcedureSym) ;
        i := p ;
        WHILE i>0 DO
           (* note we dont use GetNthParamAny as we want the parameter that is seen by the procedure block
              remember that this is treated exactly the same as a variable, just its position on
              the activation record is special (ie a parameter)
           *)
!          Variable := GetNth (ProcedureSym, i) ;
!          location := TokenToLocation (GetDeclaredMod (Variable)) ;
!          IF IsUnboundedParamAny (ProcedureSym, i)
           THEN
              GccParam := BuildParameterDeclaration(location,
                                                    KeyToCharStar(GetSymName(Variable)),
*************** BEGIN
*** 2527,2560 ****
              GccParam := BuildParameterDeclaration(location,
                                                    KeyToCharStar(GetSymName(Variable)),
                                                    Mod2Gcc(GetLType(Variable)),
!                                                   IsVarParamAny (Sym, i))
           END ;
           PreAddModGcc(Variable, GccParam) ;
           WatchRemoveList(Variable, todolist) ;
           WatchIncludeList(Variable, fullydeclared) ;
           DEC(i)
        END ;
!       GetProcedureBeginEnd(Sym, b, e) ;
        begin := TokenToLocation(b) ;
        end := TokenToLocation(e) ;
!       scope := GetScope(Sym) ;
        PushBinding(scope) ;
!       IF GetSType(Sym)=NulSym
        THEN
           returnType := NIL
        ELSE
!          returnType := Mod2Gcc(GetSType(Sym))
        END ;
!       PreAddModGcc(Sym, BuildEndFunctionDeclaration(begin, end,
!                                                     KeyToCharStar(GetFullSymName(Sym)),
!                                                     returnType,
!                                                     IsExternalToWholeProgram(Sym),
!                                                     IsProcedureGccNested(Sym),
!                                                     IsExported(GetModuleWhereDeclared(Sym), Sym),
!                                                     IsProcedureAnyNoReturn(Sym))) ;
        PopBinding(scope) ;
!       WatchRemoveList(Sym, todolist) ;
!       WatchIncludeList(Sym, fullydeclared)
     END
  END DeclareProcedureToGccWholeProgram ;
  
--- 2682,2715 ----
              GccParam := BuildParameterDeclaration(location,
                                                    KeyToCharStar(GetSymName(Variable)),
                                                    Mod2Gcc(GetLType(Variable)),
!                                                   IsVarParamAny (ProcedureSym, i))
           END ;
           PreAddModGcc(Variable, GccParam) ;
           WatchRemoveList(Variable, todolist) ;
           WatchIncludeList(Variable, fullydeclared) ;
           DEC(i)
        END ;
!       GetProcedureBeginEnd(ProcedureSym, b, e) ;
        begin := TokenToLocation(b) ;
        end := TokenToLocation(e) ;
!       scope := GetScope(ProcedureSym) ;
        PushBinding(scope) ;
!       IF GetSType(ProcedureSym)=NulSym
        THEN
           returnType := NIL
        ELSE
!          returnType := Mod2Gcc(GetSType(ProcedureSym))
        END ;
!       PreAddModGcc(ProcedureSym, BuildEndFunctionDeclaration(begin, end,
!                                                              KeyToCharStar(GetFullSymName(ProcedureSym)),
!                                                              returnType,
!                                                              IsExternalToWholeProgram(ProcedureSym),
!                                                              IsProcedureGccNested(ProcedureSym),
!                                                              IsExported(GetModuleWhereDeclared(ProcedureSym), ProcedureSym),
!                                                              IsProcedureAnyNoReturn(ProcedureSym))) ;
        PopBinding(scope) ;
!       WatchRemoveList(ProcedureSym, todolist) ;
!       WatchIncludeList(ProcedureSym, fullydeclared)
     END
  END DeclareProcedureToGccWholeProgram ;
  
*************** END DeclareProcedureToGccWholeProgram ;
*** 2563,2569 ****
     DeclareProcedureToGccSeparateProgram -
  *)
  
! PROCEDURE DeclareProcedureToGccSeparateProgram (Sym: CARDINAL) ;
  VAR
     returnType,
     GccParam  : tree ;
--- 2718,2724 ----
     DeclareProcedureToGccSeparateProgram -
  *)
  
! PROCEDURE DeclareProcedureToGccSeparateProgram (ProcedureSym: CARDINAL) ;
  VAR
     returnType,
     GccParam  : tree ;
*************** VAR
*** 2575,2638 ****
     location  : location_t ;
     tok       : CARDINAL ;
  BEGIN
!    tok := GetDeclaredMod(Sym) ;
!    IF (NOT GccKnowsAbout(Sym)) AND (NOT IsPseudoProcFunc(Sym)) AND
!       (IsEffectivelyImported(GetMainModule(), Sym) OR
!        (GetModuleWhereDeclared (Sym) = GetMainModule()) OR
!        IsNeededAtRunTime (tok, Sym) OR
!        IsImported (GetBaseModule (), Sym) OR
!        IsExported(GetModuleWhereDeclared (Sym), Sym) OR
!        IsExtern (Sym))
     THEN
!       BuildStartFunctionDeclaration(UsesVarArgs(Sym)) ;
!       p := NoOfParamAny (Sym) ;
        i := p ;
!       WHILE i>0 DO
           (* Note we dont use GetNthParamAny as we want the parameter that is seen by
              the procedure block remember that this is treated exactly the same as
              a variable, just its position on the activation record is special (ie
              a parameter).  *)
!          Variable := GetNth(Sym, i) ;
!          location := TokenToLocation(GetDeclaredMod(Variable)) ;
!          IF IsUnboundedParamAny (Sym, i)
           THEN
!             GccParam := BuildParameterDeclaration(location,
!                                                   KeyToCharStar(GetSymName(Variable)),
!                                                   Mod2Gcc(GetLType(Variable)),
!                                                   FALSE)
           ELSE
!             GccParam := BuildParameterDeclaration(location,
!                                                   KeyToCharStar(GetSymName(Variable)),
!                                                   Mod2Gcc(GetLType(Variable)),
!                                                   IsVarParamAny (Sym, i))
           END ;
!          PreAddModGcc(Variable, GccParam) ;
!          WatchRemoveList(Variable, todolist) ;
!          WatchIncludeList(Variable, fullydeclared) ;
!          DEC(i)
        END ;
!       GetProcedureBeginEnd(Sym, b, e) ;
!       begin := TokenToLocation(b) ;
!       end := TokenToLocation(e) ;
!       scope := GetScope(Sym) ;
!       PushBinding(scope) ;
!       IF GetSType(Sym)=NulSym
        THEN
           returnType := NIL
        ELSE
!          returnType := Mod2Gcc(GetSType(Sym))
        END ;
!       PreAddModGcc (Sym, BuildEndFunctionDeclaration (begin, end,
!                                                       KeyToCharStar (GetFullSymName (Sym)),
!                                                       returnType,
!                                                       IsExternal (Sym),  (* Extern relative to the main module.  *)
!                                                       IsProcedureGccNested (Sym),
!                                                       (* Exported from the module where it was declared.  *)
!                                                       IsExported (GetModuleWhereDeclared (Sym), Sym) OR IsExtern (Sym),
!                                                       IsProcedureAnyNoReturn(Sym))) ;
!       PopBinding(scope) ;
!       WatchRemoveList(Sym, todolist) ;
!       WatchIncludeList(Sym, fullydeclared)
     END
  END DeclareProcedureToGccSeparateProgram ;
  
--- 2730,2805 ----
     location  : location_t ;
     tok       : CARDINAL ;
  BEGIN
!    Assert (IsProcedure (ProcedureSym)) ;
!    tok := GetDeclaredMod (ProcedureSym) ;
!    IF (NOT GccKnowsAbout (ProcedureSym)) AND (NOT IsPseudoProcFunc (ProcedureSym)) AND
!       (IsEffectivelyImported (GetMainModule (), ProcedureSym) OR
!        (GetModuleWhereDeclared (ProcedureSym) = GetMainModule ()) OR
!        IsNeededAtRunTime (tok, ProcedureSym) OR
!        IsImported (GetBaseModule (), ProcedureSym) OR
!        IsExported(GetModuleWhereDeclared (ProcedureSym), ProcedureSym) OR
!        IsExtern (ProcedureSym))
     THEN
!       BuildStartFunctionDeclaration (UsesVarArgs (ProcedureSym)) ;
!       p := NoOfParamAny (ProcedureSym) ;
        i := p ;
!       WHILE i > 0 DO
           (* Note we dont use GetNthParamAny as we want the parameter that is seen by
              the procedure block remember that this is treated exactly the same as
              a variable, just its position on the activation record is special (ie
              a parameter).  *)
!          Variable := GetNth (ProcedureSym, i) ;
!          location := TokenToLocation (GetDeclaredMod (Variable)) ;
!          IF GetSType (Variable) = NulSym
           THEN
!             MetaError1 ('internal error: the type of parameter {%1Ead} is nulsym', Variable) ;
!             FlushErrors
!          END ;
!          IF Mod2Gcc (GetSType (Variable)) = NIL
!          THEN
!             MetaError2 ('internal error: the type of parameter {%1Ead} in procedure {%2ad} has not been declared to GCC', Variable, ProcedureSym) ;
!             FlushErrors ;
!             Assert (AllDependantsFullyDeclared (ProcedureSym))
!          END ;
!          IF IsUnboundedParamAny (ProcedureSym, i)
!          THEN
!             GccParam := BuildParameterDeclaration (location,
!                                                    KeyToCharStar (GetSymName (Variable)),
!                                                    Mod2Gcc (GetLType (Variable)),
!                                                    FALSE)
           ELSE
!             GccParam := BuildParameterDeclaration (location,
!                                                    KeyToCharStar (GetSymName (Variable)),
!                                                    Mod2Gcc (GetLType (Variable)),
!                                                    IsVarParamAny (ProcedureSym, i))
           END ;
!          PreAddModGcc (Variable, GccParam) ;
!          WatchRemoveList (Variable, todolist) ;
!          WatchIncludeList (Variable, fullydeclared) ;
!          DEC (i)
        END ;
!       GetProcedureBeginEnd (ProcedureSym, b, e) ;
!       begin := TokenToLocation (b) ;
!       end := TokenToLocation (e) ;
!       scope := GetScope (ProcedureSym) ;
!       PushBinding (scope) ;
!       IF GetSType (ProcedureSym) = NulSym
        THEN
           returnType := NIL
        ELSE
!          returnType := Mod2Gcc (GetSType (ProcedureSym))
        END ;
!       PreAddModGcc (ProcedureSym, BuildEndFunctionDeclaration (begin, end,
!                                                                KeyToCharStar (GetFullSymName (ProcedureSym)),
!                                                                returnType,
!                                                                IsExternal (ProcedureSym),  (* Extern relative to the main module.  *)
!                                                                IsProcedureGccNested (ProcedureSym),
!                                                                (* Exported from the module where it was declared.  *)
!                                                                IsExported (GetModuleWhereDeclared (ProcedureSym), ProcedureSym) OR IsExtern (ProcedureSym),
!                                                                IsProcedureAnyNoReturn (ProcedureSym))) ;
!       PopBinding (scope) ;
!       WatchRemoveList (ProcedureSym, todolist) ;
!       WatchIncludeList (ProcedureSym, fullydeclared)
     END
  END DeclareProcedureToGccSeparateProgram ;
  
*************** BEGIN
*** 2741,2746 ****
--- 2908,2914 ----
     THEN
        DisplayQuadRange (scope, start, end)
     END ;
+    EnterDiagnostic (DeclareTypesConstantsProceduresInRangeDiag) ;
     loop := 0 ;
     copy := NIL ;
     sb := InitScopeBlock (scope) ;
*************** BEGIN
*** 2772,2778 ****
     KillGroup (copy) ;
     bb := InitBasicBlocks (sb) ;
     KillBasicBlocks (bb) ;
!    KillScopeBlock (sb)
  END DeclareTypesConstantsProceduresInRange ;
  
  
--- 2940,2947 ----
     KillGroup (copy) ;
     bb := InitBasicBlocks (sb) ;
     KillBasicBlocks (bb) ;
!    KillScopeBlock (sb) ;
!    ExitDiagnostic (DeclareTypesConstantsProceduresInRangeDiag)
  END DeclareTypesConstantsProceduresInRange ;
  
  
*************** BEGIN
*** 2839,2844 ****
--- 3008,3014 ----
     THEN
        printf0 ("declaring types constants in: ") ; PrintTerse (scope)
     END ;
+    EnterDiagnostic (DeclareTypesConstantsProceduresDiag) ;
     copy := NIL ;
     sb := InitScopeBlock (scope) ;
     PushBinding (scope) ;
*************** BEGIN
*** 2848,2854 ****
     UNTIL EqualGroup (copy, GlobalGroup) ;
     KillGroup (copy) ;
     PopBinding (scope) ;
!    KillScopeBlock (sb)
  END DeclareTypesConstantsProcedures ;
  
  
--- 3018,3025 ----
     UNTIL EqualGroup (copy, GlobalGroup) ;
     KillGroup (copy) ;
     PopBinding (scope) ;
!    KillScopeBlock (sb) ;
!    ExitDiagnostic (DeclareTypesConstantsProceduresDiag)
  END DeclareTypesConstantsProcedures ;
  
  
*************** END DeclareModuleInit ;
*** 2902,2917 ****
  
  PROCEDURE StartDeclareProcedureScope (scope: CARDINAL) ;
  BEGIN
!    WalkTypesInProcedure(scope) ;
!    DeclareProcedure(scope) ;
!    ForeachInnerModuleDo(scope, WalkTypesInModule) ;
     DeclareTypesConstantsProcedures (scope) ;
!    ForeachInnerModuleDo(scope, DeclareTypesConstantsProcedures) ;
!    DeclareLocalVariables(scope) ;
!    ForeachInnerModuleDo(scope, DeclareModuleVariables) ;
!    AssertAllTypesDeclared(scope) ;
!    ForeachProcedureDo(scope, DeclareProcedure) ;
!    ForeachInnerModuleDo(scope, StartDeclareScope)
  END StartDeclareProcedureScope ;
  
  
--- 3073,3088 ----
  
  PROCEDURE StartDeclareProcedureScope (scope: CARDINAL) ;
  BEGIN
!    WalkTypesInProcedure (scope) ;
!    DeclareProcedure (scope) ;
!    ForeachInnerModuleDo (scope, WalkTypesInModule) ;
     DeclareTypesConstantsProcedures (scope) ;
!    ForeachInnerModuleDo (scope, DeclareTypesConstantsProcedures) ;
!    DeclareLocalVariables (scope) ;
!    ForeachInnerModuleDo (scope, DeclareModuleVariables) ;
!    AssertAllTypesDeclared (scope) ;
!    ForeachProcedureDo (scope, DeclareProcedure) ;
!    ForeachInnerModuleDo (scope, StartDeclareScope)
  END StartDeclareProcedureScope ;
  
  
*************** END PreAddModGcc ;
*** 3122,3141 ****
  PROCEDURE DeclareDefaultType (sym: CARDINAL; name: ARRAY OF CHAR; gcctype: tree) ;
  VAR
     t        : tree ;
     high, low: CARDINAL ;
     location : location_t ;
  BEGIN
!    (* DeclareDefaultType will declare a new identifier as a type of, gcctype, if it has not already been
!       declared by gccgm2.c *)
     location := BuiltinsLocation () ;
     t := GetDefaultType(location, KeyToCharStar(MakeKey(name)), gcctype) ;
!    AddModGcc(sym, t) ;
!    IncludeElementIntoSet(GlobalGroup^.FullyDeclared, sym) ;
!    WalkAssociatedUnbounded(sym, TraverseDependants) ;
!    (*
!       this is very simplistic and assumes that the caller only uses Subranges, Sets and GCC types.
!       We need to declare any constants with the types so that AllDependantsFullyDeclared works.
!    *)
     IF IsSubrange(sym)
     THEN
        GetSubrange(sym, high, low) ;
--- 3293,3312 ----
  PROCEDURE DeclareDefaultType (sym: CARDINAL; name: ARRAY OF CHAR; gcctype: tree) ;
  VAR
     t        : tree ;
+    array,
     high, low: CARDINAL ;
     location : location_t ;
  BEGIN
!    (* DeclareDefaultType will declare a new identifier as a type of gcctype
!       if it has not already been declared.  *)
     location := BuiltinsLocation () ;
     t := GetDefaultType(location, KeyToCharStar(MakeKey(name)), gcctype) ;
!    AddModGcc (sym, t) ;
!    IncludeElementIntoSet (GlobalGroup^.FullyDeclared, sym) ;
!    WalkAssociatedUnbounded (sym, TraverseDependants) ;
!    (* This is very simplistic and assumes that the caller only uses Subranges,
!       Sets and GCC types.  We need to declare any constants with the types so
!       that AllDependantsFullyDeclared works.  *)
     IF IsSubrange(sym)
     THEN
        GetSubrange(sym, high, low) ;
*************** BEGIN
*** 3147,3163 ****
        THEN
           IF NOT GccKnowsAbout(GetSType(sym))
           THEN
!             (* only true for internal types of course *)
              InternalError ('subrange type within the set type must be declared before the set type')
           END ;
           GetSubrange(GetSType(sym), high, low) ;
           DeclareConstant(GetDeclaredMod(sym), high) ;
!          DeclareConstant(GetDeclaredMod(sym), low)
        ELSIF IsEnumeration(GetSType(sym))
        THEN
           IF NOT GccKnowsAbout(GetSType(sym))
           THEN
!             (* only true for internal types of course *)
              InternalError ('enumeration type within the set type must be declared before the set type')
           END
        END
--- 3318,3337 ----
        THEN
           IF NOT GccKnowsAbout(GetSType(sym))
           THEN
!             (* Only true for internal types of course.  *)
              InternalError ('subrange type within the set type must be declared before the set type')
           END ;
           GetSubrange(GetSType(sym), high, low) ;
           DeclareConstant(GetDeclaredMod(sym), high) ;
!          DeclareConstant(GetDeclaredMod(sym), low) ;
!          array := DeclareSetArray (sym, low, high) ;
!          (* IncludeElementIntoSet (FullyDeclared, array) ; *)
!          PutSetArray (sym, array)
        ELSIF IsEnumeration(GetSType(sym))
        THEN
           IF NOT GccKnowsAbout(GetSType(sym))
           THEN
!             (* Only true for internal types of course.  *)
              InternalError ('enumeration type within the set type must be declared before the set type')
           END
        END
*************** BEGIN
*** 3473,3479 ****
                We do not add an extra pointer if this is the case.
        *)
        varType := SkipType (GetVarBackEndType (var)) ;
!       IF varType=NulSym
        THEN
           (* We have not explicity told back end the type, so build it.  *)
           varType := GetSType (var) ;
--- 3647,3653 ----
                We do not add an extra pointer if this is the case.
        *)
        varType := SkipType (GetVarBackEndType (var)) ;
!       IF varType = NulSym
        THEN
           (* We have not explicity told back end the type, so build it.  *)
           varType := GetSType (var) ;
*************** BEGIN
*** 3590,3596 ****
        INC (n) ;
        Variable := GetNth (ModSym, n)
     END ;
!    ForeachInnerModuleDo(ModSym, DeclareGlobalVariablesWholeProgram)
  END DeclareGlobalVariablesWholeProgram ;
  
  
--- 3764,3770 ----
        INC (n) ;
        Variable := GetNth (ModSym, n)
     END ;
!    ForeachInnerModuleDo (ModSym, DeclareGlobalVariablesWholeProgram)
  END DeclareGlobalVariablesWholeProgram ;
  
  
*************** PROCEDURE PrintAlignment (sym: CARDINAL)
*** 4002,4008 ****
  VAR
     align: CARDINAL ;
  BEGIN
!    IF IsRecord(sym) OR IsType(sym) OR IsRecordField(sym) OR IsPointer(sym) OR IsArray(sym)
     THEN
        align := GetAlignment(sym) ;
        IF align#NulSym
--- 4176,4183 ----
  VAR
     align: CARDINAL ;
  BEGIN
!    IF IsRecord(sym) OR IsType(sym) OR IsRecordField(sym) OR
!       IsPointer(sym) OR IsArray(sym)
     THEN
        align := GetAlignment(sym) ;
        IF align#NulSym
*************** BEGIN
*** 4164,4170 ****
     PrintDeclared (sym) ;
     fprintf0 (GetDumpFile (), '\n') ;
     FOR kind := MIN (ProcedureKind) TO MAX (ProcedureKind) DO
!       fprintf0 (GetDumpFile (), 'parameters ') ;
        PrintKind (kind) ;
        IF GetProcedureParametersDefined (sym, kind)
        THEN
--- 4339,4345 ----
     PrintDeclared (sym) ;
     fprintf0 (GetDumpFile (), '\n') ;
     FOR kind := MIN (ProcedureKind) TO MAX (ProcedureKind) DO
!       fprintf0 (GetDumpFile (), ' parameters ') ;
        PrintKind (kind) ;
        IF GetProcedureParametersDefined (sym, kind)
        THEN
*************** END PrintString ;
*** 4272,4277 ****
--- 4447,4465 ----
  
  
  (*
+    PrintKnown -
+ *)
+ 
+ PROCEDURE PrintKnown (sym: CARDINAL) ;
+ BEGIN
+    IF GccKnowsAbout (sym)
+    THEN
+       printf0 ("[gcc]")
+    END
+ END PrintKnown ;
+ 
+ 
+ (*
     PrintVerboseFromList - prints the, i, th element in the list, l.
  *)
  
*************** VAR
*** 4870,4878 ****
  BEGIN
     location := TokenToLocation(GetDeclaredMod(sym)) ;
     Assert(IsSet(sym)) ;
!    type := GetDType(sym) ;
!    low := GetTypeMin(type) ;
!    high := GetTypeMax(type) ;
     highLimit := BuildSub(location, Mod2Gcc(high), Mod2Gcc(low), FALSE) ;
     (* --fixme-- we need to check that low <= WORDLENGTH.  *)
     highLimit := BuildLSL(location, GetIntegerOne(location), highLimit, FALSE) ;
--- 5058,5066 ----
  BEGIN
     location := TokenToLocation(GetDeclaredMod(sym)) ;
     Assert(IsSet(sym)) ;
!    type := GetDType(sym) ;   (* Was GetSType.  *)
!    low := GetTypeMin (type) ;
!    high := GetTypeMax (type) ;
     highLimit := BuildSub(location, Mod2Gcc(high), Mod2Gcc(low), FALSE) ;
     (* --fixme-- we need to check that low <= WORDLENGTH.  *)
     highLimit := BuildLSL(location, GetIntegerOne(location), highLimit, FALSE) ;
*************** BEGIN
*** 4918,4924 ****
     location := TokenToLocation(GetDeclaredMod(sym)) ;
     gccenum := BuildStartEnumeration(location, KeyToCharStar(GetFullSymName(sym)), TRUE) ;
     ForeachLocalSymDo(sym, DeclarePackedFieldEnumeration) ;
!    enumlist := GetEnumList(equiv) ;
     gccenum := BuildEndEnumeration(location, gccenum, enumlist) ;
     AddModGcc(equiv, gccenum)
  END DeclarePackedEnumeration ;
--- 5106,5112 ----
     location := TokenToLocation(GetDeclaredMod(sym)) ;
     gccenum := BuildStartEnumeration(location, KeyToCharStar(GetFullSymName(sym)), TRUE) ;
     ForeachLocalSymDo(sym, DeclarePackedFieldEnumeration) ;
!    enumlist := GetEnumList (equiv) ;
     gccenum := BuildEndEnumeration(location, gccenum, enumlist) ;
     AddModGcc(equiv, gccenum)
  END DeclarePackedEnumeration ;
*************** END DeclareUnbounded ;
*** 5247,5257 ****
     BuildIndex -
  *)
  
! PROCEDURE BuildIndex (tokenno: CARDINAL; array: CARDINAL) : tree ;
  VAR
     Subscript: CARDINAL ;
     Type,
     High, Low: CARDINAL ;
     n,
     low, high: tree ;
     location : location_t ;
--- 5435,5446 ----
     BuildIndex -
  *)
  
! PROCEDURE BuildIndex (tokenno: CARDINAL; array: CARDINAL; isset: BOOLEAN) : tree ;
  VAR
     Subscript: CARDINAL ;
     Type,
     High, Low: CARDINAL ;
+    indexType,
     n,
     low, high: tree ;
     location : location_t ;
*************** BEGIN
*** 5272,5289 ****
        n := BuildConvert (location, GetIntegerType (), BuildSub (location, high, low, FALSE), FALSE) ;
        IF TreeOverflow(n) OR ValueOutOfTypeRange (GetIntegerType (), n)
        THEN
!          MetaError3('implementation restriction, array is too large {%1EDM}, the range {%2ad}..{%3ad} exceeds the integer range',
!                     array, Low, High) ;
!          RETURN BuildArrayIndexType (GetIntegerZero (location), GetIntegerZero (location))
        ELSE
           PutArrayLarge (array) ;
! 	 RETURN BuildArrayIndexType (GetIntegerZero (location), n)
        END
     ELSE
        low := BuildConvert (location, GetIntegerType (), low, FALSE) ;
        high := BuildConvert (location, GetIntegerType (), high, FALSE) ;
!       RETURN BuildArrayIndexType (low, high)
!    END
  END BuildIndex ;
  
  
--- 5461,5485 ----
        n := BuildConvert (location, GetIntegerType (), BuildSub (location, high, low, FALSE), FALSE) ;
        IF TreeOverflow(n) OR ValueOutOfTypeRange (GetIntegerType (), n)
        THEN
!          IF isset
!          THEN
!             MetaError3('implementation restriction, set is too large {%1EDM}, the range {%2ad}..{%3ad} exceeds the integer range',
!                        array, Low, High)
!          ELSE
!             MetaError3('implementation restriction, array is too large {%1EDM}, the range {%2ad}..{%3ad} exceeds the integer range',
!                        array, Low, High)
!          END ;
!          indexType := BuildArrayIndexType (GetIntegerZero (location), GetIntegerZero (location))
        ELSE
           PutArrayLarge (array) ;
! 	 indexType := BuildArrayIndexType (GetIntegerZero (location), n)
        END
     ELSE
        low := BuildConvert (location, GetIntegerType (), low, FALSE) ;
        high := BuildConvert (location, GetIntegerType (), high, FALSE) ;
!       indexType := BuildArrayIndexType (low, high)
!    END ;
!    RETURN indexType
  END BuildIndex ;
  
  
*************** BEGIN
*** 5307,5330 ****
     location := TokenToLocation(tokenno) ;
  
     Subscript := GetArraySubscript(Sym) ;
!    typeOfArray := GetDType(Sym) ;
     GccArray := Mod2Gcc(typeOfArray) ;
!    GccIndex := BuildIndex(tokenno, Sym) ;
  
!    IF GccKnowsAbout(Sym)
     THEN
!       ArrayType := Mod2Gcc(Sym)
     ELSE
!       ArrayType := BuildStartArrayType(GccIndex, GccArray, typeOfArray) ;
!       PreAddModGcc(Sym, ArrayType)
     END ;
  
!    PreAddModGcc(Subscript, GccArray) ;       (* we save the type of this array as the subscript *)
!    PushIntegerTree(BuildSize(location, GccArray, FALSE)) ;  (* and the size of this array so far *)
!    PopSize(Subscript) ;
  
!    GccArray := BuildEndArrayType(ArrayType, GccArray, GccIndex, typeOfArray) ;
!    Assert(GccArray=ArrayType) ;
  
     RETURN( GccArray )
  END DeclareArray ;
--- 5503,5526 ----
     location := TokenToLocation(tokenno) ;
  
     Subscript := GetArraySubscript(Sym) ;
!    typeOfArray := GetDType (Sym) ;
     GccArray := Mod2Gcc(typeOfArray) ;
!    GccIndex := BuildIndex (tokenno, Sym, FALSE) ;
  
!    IF GccKnowsAbout (Sym)
     THEN
!       ArrayType := Mod2Gcc (Sym)
     ELSE
!       ArrayType := BuildStartArrayType (GccIndex, GccArray, typeOfArray) ;
!       PreAddModGcc (Sym, ArrayType)
     END ;
  
!    PreAddModGcc (Subscript, GccArray) ;       (* we save the type of this array as the subscript *)
!    PushIntegerTree (BuildSize (location, GccArray, FALSE)) ;  (* and the size of this array so far *)
!    PopSize (Subscript) ;
  
!    GccArray := BuildEndArrayType (ArrayType, GccArray, GccIndex, typeOfArray) ;
!    Assert (GccArray = ArrayType) ;
  
     RETURN( GccArray )
  END DeclareArray ;
*************** PROCEDURE GetTypeMin (type: CARDINAL) :
*** 5408,5420 ****
  VAR
     min, max: CARDINAL ;
  BEGIN
!    IF IsSubrange(type)
     THEN
!       GetSubrange(type, max, min) ;
        RETURN( min )
     ELSIF IsSet(type)
     THEN
!       RETURN( GetTypeMin(GetSType(type)) )
     ELSIF IsEnumeration(type)
     THEN
        MinEnumerationField := NulSym ;
--- 5604,5616 ----
  VAR
     min, max: CARDINAL ;
  BEGIN
!    IF IsSubrange (type)
     THEN
!       GetSubrange (type, max, min) ;
        RETURN( min )
     ELSIF IsSet(type)
     THEN
!       RETURN( GetTypeMin (GetSType (type)) )
     ELSIF IsEnumeration(type)
     THEN
        MinEnumerationField := NulSym ;
*************** BEGIN
*** 5423,5440 ****
        RETURN( MinEnumerationField )
     ELSIF IsBaseType(type)
     THEN
!       GetBaseTypeMinMax(type, min, max) ;
        RETURN( min )
!    ELSIF IsSystemType(type)
     THEN
!       GetSystemTypeMinMax(type, min, max) ;
        RETURN( min )
!    ELSIF GetSType(type)=NulSym
     THEN
!       MetaError1('unable to obtain the MIN value for type {%1as}', type) ;
        RETURN NulSym
     ELSE
!       RETURN( GetTypeMin(GetSType(type)) )
     END
  END GetTypeMin ;
  
--- 5619,5636 ----
        RETURN( MinEnumerationField )
     ELSIF IsBaseType(type)
     THEN
!       GetBaseTypeMinMax (type, min, max) ;
        RETURN( min )
!    ELSIF IsSystemType (type)
     THEN
!       GetSystemTypeMinMax (type, min, max) ;
        RETURN( min )
!    ELSIF GetSType (type) = NulSym
     THEN
!       MetaError1 ('unable to obtain the MIN value for type {%1as}', type) ;
        RETURN NulSym
     ELSE
!       RETURN( GetTypeMin (GetSType (type)) )
     END
  END GetTypeMin ;
  
*************** PROCEDURE GetTypeMax (type: CARDINAL) :
*** 5447,5479 ****
  VAR
     min, max: CARDINAL ;
  BEGIN
!    IF IsSubrange(type)
     THEN
!       GetSubrange(type, max, min) ;
        RETURN( max )
!    ELSIF IsSet(type)
     THEN
!       RETURN( GetTypeMax(GetSType(type)) )
!    ELSIF IsEnumeration(type)
     THEN
        MinEnumerationField := NulSym ;
        MaxEnumerationField := NulSym ;
        ForeachLocalSymDo (type, FindMinMaxEnum) ;
        RETURN( MaxEnumerationField )
!    ELSIF IsBaseType(type)
     THEN
!       GetBaseTypeMinMax(type, min, max) ;
        RETURN( max )
!    ELSIF IsSystemType(type)
     THEN
!       GetSystemTypeMinMax(type, min, max) ;
        RETURN( max )
!    ELSIF GetSType(type)=NulSym
     THEN
!       MetaError1('unable to obtain the MAX value for type {%1as}', type) ;
        RETURN NulSym
     ELSE
!       RETURN( GetTypeMax(GetSType(type)) )
     END
  END GetTypeMax ;
  
--- 5643,5675 ----
  VAR
     min, max: CARDINAL ;
  BEGIN
!    IF IsSubrange (type)
     THEN
!       GetSubrange (type, max, min) ;
        RETURN( max )
!    ELSIF IsSet (type)
     THEN
!       RETURN( GetTypeMax (GetSType (type)) )
!    ELSIF IsEnumeration (type)
     THEN
        MinEnumerationField := NulSym ;
        MaxEnumerationField := NulSym ;
        ForeachLocalSymDo (type, FindMinMaxEnum) ;
        RETURN( MaxEnumerationField )
!    ELSIF IsBaseType (type)
     THEN
!       GetBaseTypeMinMax (type, min, max) ;
        RETURN( max )
!    ELSIF IsSystemType (type)
     THEN
!       GetSystemTypeMinMax (type, min, max) ;
        RETURN( max )
!    ELSIF GetSType (type) = NulSym
     THEN
!       MetaError1 ('unable to obtain the MAX value for type {%1as}', type) ;
        RETURN NulSym
     ELSE
!       RETURN( GetTypeMax (GetSType (type)) )
     END
  END GetTypeMax ;
  
*************** END PushNoOfBits ;
*** 5495,5595 ****
  
  
  (*
!    DeclareLargeSet - n is the name of the set.
!                      type is the subrange type (or simple type)
!                      low and high are the limits of the subrange.
! *)
! 
! PROCEDURE DeclareLargeSet (n: Name; type: CARDINAL; low, high: CARDINAL) : tree ;
! VAR
!    lowtree,
!    hightree,
!    BitsInSet,
!    RecordType,
!    GccField,
!    FieldList : tree ;
!    bpw       : CARDINAL ;
!    location  : location_t ;
! BEGIN
!    location   := TokenToLocation(GetDeclaredMod(type)) ;
!    bpw        := GetBitsPerBitset() ;
!    PushValue(low) ;
!    lowtree    := PopIntegerTree() ;
!    PushValue(high) ;
!    hightree   := PopIntegerTree() ;
!    FieldList  := tree(NIL) ;
!    RecordType := BuildStartRecord(location, KeyToCharStar(n)) ;  (* no problem with recursive types here *)
!    PushNoOfBits(type, low, high) ;
!    PushCard(1) ;
!    Addn ;
!    BitsInSet := PopIntegerTree() ;
!    PushIntegerTree(BitsInSet) ;
!    PushCard(0) ;
!    WHILE Gre(GetDeclaredMod(type)) DO
!       PushIntegerTree(BitsInSet) ;
!       PushCard(bpw-1) ;
!       IF GreEqu(GetDeclaredMod(type))
!       THEN
!          PushIntegerTree(lowtree) ;
!          PushCard(bpw-1) ;
!          Addn ;
!          GccField := BuildFieldRecord(location, NIL, BuildSetType(location, NIL, Mod2Gcc(type), lowtree, PopIntegerTree(), FALSE)) ;
!          PushIntegerTree(lowtree) ;
!          PushCard(bpw) ;
!          Addn ;
!          lowtree := PopIntegerTree() ;
!          PushIntegerTree(BitsInSet) ;
!          PushCard(bpw) ;
!          Sub ;
!          BitsInSet := PopIntegerTree()
!       ELSE
!          (* printf2('range is %a..%a\n', GetSymName(low), GetSymName(high)) ; *)
!          GccField := BuildFieldRecord(location, NIL, BuildSetType(location, NIL, Mod2Gcc(type), lowtree, hightree, FALSE)) ;
!          PushCard(0) ;
!          BitsInSet := PopIntegerTree()
!       END ;
!       FieldList := ChainOn(FieldList, GccField) ;
!       PushIntegerTree(BitsInSet) ;
!       PushCard(0)
!    END ;
!    RETURN( BuildEndRecord(location, RecordType, FieldList, FALSE) )
! END DeclareLargeSet ;
! 
! 
! (*
!    DeclareLargeOrSmallSet - works out whether the set will exceed TSIZE(WORD). If it does
!                             we manufacture a set using:
  
!                             settype = RECORD
!                                          w1: SET OF [...]
!                                          w2: SET OF [...]
!                                       END
  
!                             We do this as GCC and GDB (stabs) only knows about WORD sized sets.
!                             If the set will fit into a WORD then we call gccgm2 directly.
  *)
  
! PROCEDURE DeclareLargeOrSmallSet (sym: CARDINAL;
!                                   n: Name; type: CARDINAL; low, high: CARDINAL) : tree ;
  VAR
     location: location_t ;
-    packed  : BOOLEAN ;
  BEGIN
!    PushNoOfBits(type, low, high) ;
!    PushCard(GetBitsPerBitset()) ;
!    packed := IsSetPacked (sym) ;
!    IF Less(GetDeclaredMod(type))
     THEN
!       location := TokenToLocation(GetDeclaredMod(sym)) ;
!       (* small set *)
!       (* PutSetSmall(sym) ; *)
!       RETURN BuildSetType (location, KeyToCharStar(n),
!                            Mod2Gcc(type), Mod2Gcc(low), Mod2Gcc(high), packed)
     ELSE
!       (* PutSetLarge(sym) ; *)
!       RETURN DeclareLargeSet (n, type, low, high)   (* --fixme-- finish packed here as well.  *)
     END
! END DeclareLargeOrSmallSet ;
  
  
  (*
--- 5691,5723 ----
  
  
  (*
!    DeclareSetArrayOrBitSet - works out whether the set will exceed SIZE (BITSET).
!                              If it does we manufacture a set using:
  
!                              settype = ARRAY [0..totalBits DIV SIZE (BITSET)] OF BITSET ;
  
!                              When GCC supports dwarf5 set types this code should be revised.
!                              If the set will fit into a WORD then we call gccgm2 directly.
  *)
  
! PROCEDURE DeclareSetArrayOrBitSet (sym: CARDINAL;
!                                    n: Name; type: CARDINAL; low, high: CARDINAL) : tree ;
  VAR
     location: location_t ;
  BEGIN
!    PushNoOfBits (type, low, high) ;
!    PushCard (GetBitsPerBitset()) ;
!    location := TokenToLocation (GetDeclaredMod (sym)) ;
!    IF Less (GetDeclaredMod (type))
     THEN
!       PutSetInWord (sym, TRUE) ;
!       RETURN BuildSetType (location, KeyToCharStar (n),
!                            Mod2Gcc (type), Mod2Gcc (low), Mod2Gcc (high), TRUE)
     ELSE
!       PutSetInWord (sym, FALSE) ;
!       RETURN DeclareArray (GetSetArray (sym))
     END
! END DeclareSetArrayOrBitSet ;
  
  
  (*
*************** VAR
*** 5602,5616 ****
     type,
     high, low: CARDINAL ;
  BEGIN
!    type := GetDType(sym) ;
!    IF IsSubrange(type)
     THEN
!       GetSubrange(type, high, low) ;
!       gccsym := DeclareLargeOrSmallSet(sym, GetFullSymName(sym), GetSType(type), low, high)
     ELSE
!       gccsym := DeclareLargeOrSmallSet(sym, GetFullSymName(sym), type, GetTypeMin(type), GetTypeMax(type))
     END ;
!    RETURN( gccsym )
  END DeclareSet ;
  
  
--- 5730,5746 ----
     type,
     high, low: CARDINAL ;
  BEGIN
!    type := GetSType (sym) ;
!    IF IsSubrange (type)
     THEN
!       GetSubrange (type, high, low) ;
!       gccsym := DeclareSetArrayOrBitSet (sym, GetFullSymName (sym),
!                                          GetSType (type), low, high)
     ELSE
!       gccsym := DeclareSetArrayOrBitSet (sym, GetFullSymName (sym),
!                                          type, GetTypeMin (type), GetTypeMax (type))
     END ;
!    RETURN gccsym
  END DeclareSet ;
  
  
*************** BEGIN
*** 5696,5714 ****
        t := DeclareVarient(sym)
     ELSIF IsPointer(sym)
     THEN
!       t := CheckAlignment(DeclarePointer(sym), sym)
     ELSIF IsUnbounded(sym)
     THEN
        t := DeclareUnbounded(sym)
     ELSIF IsArray(sym)
     THEN
!       t := CheckAlignment(DeclareArray(sym), sym)
     ELSIF IsProcType(sym)
     THEN
        t := DeclareProcType(sym)
     ELSIF IsSet(sym)
     THEN
!       t := DeclareSet(sym)
     ELSIF IsConst(sym)
     THEN
        IF IsConstructor(sym)
--- 5826,5844 ----
        t := DeclareVarient(sym)
     ELSIF IsPointer(sym)
     THEN
!       t := CheckAlignment (DeclarePointer (sym), sym)
     ELSIF IsUnbounded(sym)
     THEN
        t := DeclareUnbounded(sym)
     ELSIF IsArray(sym)
     THEN
!       t := CheckAlignment (DeclareArray (sym), sym)
     ELSIF IsProcType(sym)
     THEN
        t := DeclareProcType(sym)
     ELSIF IsSet(sym)
     THEN
!       t := CheckAlignment (DeclareSet (sym), sym)
     ELSIF IsConst(sym)
     THEN
        IF IsConstructor(sym)
*************** PROCEDURE WalkPointerDependants (sym: CA
*** 5981,5991 ****
  VAR
     align: CARDINAL ;
  BEGIN
!    p(GetSType(sym)) ;
!    align := GetAlignment(sym) ;
!    IF align#NulSym
     THEN
!       p(align)
     END
  END WalkPointerDependants ;
  
--- 6111,6127 ----
  VAR
     align: CARDINAL ;
  BEGIN
!    IF GetSType (sym) = NulSym
     THEN
!       MetaError1 ('pointer type {%1Ua} is unresolved', sym) ;
!       InternalError ('pointer type should have been declared')
!    ELSE
!       p (GetSType (sym)) ;
!       align := GetAlignment (sym) ;
!       IF align # NulSym
!       THEN
!          p (align)
!       END
     END
  END WalkPointerDependants ;
  
*************** END WalkVarientFieldDependants ;
*** 6321,6327 ****
  PROCEDURE IsArrayDependants (sym: CARDINAL; q: IsAction) : BOOLEAN ;
  VAR
     result   : BOOLEAN ;
!    align    : CARDINAL ;
     subscript: CARDINAL ;
     high, low: CARDINAL ;
     type     : CARDINAL ;
--- 6457,6463 ----
  PROCEDURE IsArrayDependants (sym: CARDINAL; q: IsAction) : BOOLEAN ;
  VAR
     result   : BOOLEAN ;
!    align,
     subscript: CARDINAL ;
     high, low: CARDINAL ;
     type     : CARDINAL ;
*************** BEGIN
*** 6329,6335 ****
     result := TRUE ;
     Assert(IsArray(sym)) ;
     type := GetSType(sym) ;
- 
     IF NOT q(type)
     THEN
        result := FALSE
--- 6465,6470 ----
*************** BEGIN
*** 6339,6349 ****
     THEN
        Assert(IsSubscript(subscript)) ;
        type := GetSType(subscript) ;
!       IF NOT q(type)
        THEN
           result := FALSE
        END ;
!       type := SkipType(type) ;
        (* the array might be declared as ARRAY type OF foo *)
        low  := GetTypeMin(type) ;
        high := GetTypeMax(type) ;
--- 6474,6484 ----
     THEN
        Assert(IsSubscript(subscript)) ;
        type := GetSType(subscript) ;
!       IF NOT q (type)
        THEN
           result := FALSE
        END ;
!       type := SkipType (type) ;
        (* the array might be declared as ARRAY type OF foo *)
        low  := GetTypeMin(type) ;
        high := GetTypeMax(type) ;
*************** BEGIN
*** 6355,6362 ****
        THEN
           result := FALSE
        END ;
!       align := GetAlignment(sym) ;
!       IF (align#NulSym) AND (NOT q(align))
        THEN
           result := FALSE
        END
--- 6490,6497 ----
        THEN
           result := FALSE
        END ;
!       align := GetAlignment (sym) ;
!       IF (align#NulSym) AND (NOT q (align))
        THEN
           result := FALSE
        END
*************** END IsArrayDependants ;
*** 6371,6377 ****
  
  PROCEDURE WalkArrayDependants (sym: CARDINAL; p: WalkAction) ;
  VAR
!    align    : CARDINAL ;
     subscript: CARDINAL ;
     high, low: CARDINAL ;
     type     : CARDINAL ;
--- 6506,6512 ----
  
  PROCEDURE WalkArrayDependants (sym: CARDINAL; p: WalkAction) ;
  VAR
!    align,
     subscript: CARDINAL ;
     high, low: CARDINAL ;
     type     : CARDINAL ;
*************** BEGIN
*** 6385,6433 ****
        Assert(IsSubscript(subscript)) ;
        type := GetSType(subscript) ;
        p(type) ;
        type := SkipType(type) ;
        (* the array might be declared as ARRAY type OF foo *)
        low  := GetTypeMin(type) ;
        high := GetTypeMax(type) ;
        p(low) ;
!       p(high) ;
!       align := GetAlignment (sym) ;
!       IF align#NulSym
!       THEN
!          p(align)
!       END
     END
  END WalkArrayDependants ;
  
  
  (*
     IsSetDependants - returns TRUE if the symbol, sym,
                       q(dependants) all return TRUE.
  *)
  
  PROCEDURE IsSetDependants (sym: CARDINAL; q: IsAction) : BOOLEAN ;
  VAR
!    result         : BOOLEAN ;
!    type, low, high: CARDINAL ;
  BEGIN
     result := TRUE ;
!    Assert(IsSet(sym)) ;
  
!    type := GetDType(sym) ;
!    IF NOT q(type)
     THEN
        result := FALSE
     END ;
!    low  := GetTypeMin(type) ;
!    high := GetTypeMax(type) ;
!    IF NOT q(low)
     THEN
        result := FALSE
     END ;
!    IF NOT q(high)
     THEN
        result := FALSE
     END ;
     RETURN( result )
  END IsSetDependants ;
  
--- 6520,6614 ----
        Assert(IsSubscript(subscript)) ;
        type := GetSType(subscript) ;
        p(type) ;
+       align := GetAlignment (sym) ;
+       IF align#NulSym
+       THEN
+          p(align)
+       END ;
        type := SkipType(type) ;
        (* the array might be declared as ARRAY type OF foo *)
        low  := GetTypeMin(type) ;
        high := GetTypeMax(type) ;
        p(low) ;
!       p(high)
     END
  END WalkArrayDependants ;
  
  
  (*
+    DeclareSetArray -
+ *)
+ 
+ PROCEDURE DeclareSetArray (sym, low, high: CARDINAL) : CARDINAL ;
+ VAR
+    tok     : CARDINAL ;
+    subrange,
+    highbyte: CARDINAL ;
+    bytes   : tree ;
+    name    : Name ;
+ BEGIN
+    tok := GetDeclaredMod (sym) ;
+    PushValue (high) ;
+    ConvertToInt ;
+    PushValue (low) ;
+    ConvertToInt ;
+    Sub ;
+    PushCard (8) ;
+    DivTrunc ;
+    bytes := PopIntegerTree () ;
+    subrange := MakeSubrange (tok, NulName) ;
+    INC (tempset) ;
+    name := makekey (string (Sprintf1 (Mark (InitString('_Tset%d')), tempset))) ;
+    highbyte := MakeConstVar (tok, name) ;
+    PutConst (highbyte, Cardinal) ;
+    AddModGcc (highbyte, bytes) ;
+    PushValue (high) ;
+    ConvertToInt ;
+    PushValue (low) ;
+    ConvertToInt ;
+    Sub ;
+    PushCard (GetBitsPerBitset ()) ;
+    PutSetInWord (sym, Less (tok)) ;
+    DeclareConstFully (highbyte) ;
+    PutSubrange (subrange,
+                 MakeConstLit (tok, MakeKey ('0'), Cardinal), highbyte, Cardinal) ;
+    RETURN MakeSetArray (tok, subrange)
+ END DeclareSetArray ;
+ 
+ 
+ (*
     IsSetDependants - returns TRUE if the symbol, sym,
                       q(dependants) all return TRUE.
  *)
  
  PROCEDURE IsSetDependants (sym: CARDINAL; q: IsAction) : BOOLEAN ;
  VAR
!    result                : BOOLEAN ;
!    type, low, high, array: CARDINAL ;
  BEGIN
     result := TRUE ;
!    Assert (IsSet (sym)) ;
  
!    type := GetDType (sym) ;
!    IF NOT q (type)
     THEN
        result := FALSE
     END ;
!    low  := GetTypeMin (type) ;
!    high := GetTypeMax (type) ;
!    IF NOT q (low)
     THEN
        result := FALSE
     END ;
!    IF NOT q (high)
     THEN
        result := FALSE
     END ;
+    array := GetSetArray (sym) ;
+    IF array = NulSym
+    THEN
+       result := FALSE ;
+    END ;
     RETURN( result )
  END IsSetDependants ;
  
*************** END IsSetDependants ;
*** 6438,6444 ****
  
  PROCEDURE WalkSetDependants (sym: CARDINAL; p: WalkAction) ;
  VAR
!    type, low, high: CARDINAL ;
  BEGIN
     Assert(IsSet(sym)) ;
  
--- 6619,6625 ----
  
  PROCEDURE WalkSetDependants (sym: CARDINAL; p: WalkAction) ;
  VAR
!    type, low, high, array: CARDINAL ;
  BEGIN
     Assert(IsSet(sym)) ;
  
*************** BEGIN
*** 6447,6453 ****
     low  := GetTypeMin(type) ;
     p(low) ;
     high := GetTypeMax(type) ;
!    p(high)
  END WalkSetDependants ;
  
  
--- 6628,6639 ----
     low  := GetTypeMin(type) ;
     p(low) ;
     high := GetTypeMax(type) ;
!    p(high) ;
!    array := GetSetArray (sym) ;
!    IF array # NulSym
!    THEN
!       p (array)
!    END
  END WalkSetDependants ;
  
  
*************** VAR
*** 6524,6542 ****
     result    : BOOLEAN ;
  BEGIN
     result := TRUE ;
!    Assert(IsProcedure(sym)) ;
     i := 1 ;
!    ReturnType := GetSType(sym) ;
!    WHILE GetNth(sym, i)#NulSym DO
!       son := GetNth(sym, i) ;
!       type := GetSType(son) ;
!       IF NOT q(type)
        THEN
           result := FALSE
        END ;
!       INC(i)
     END ;
!    IF (ReturnType=NulSym) OR q(ReturnType)
     THEN
        RETURN( result )
     ELSE
--- 6710,6728 ----
     result    : BOOLEAN ;
  BEGIN
     result := TRUE ;
!    Assert (IsProcedure (sym)) ;
     i := 1 ;
!    ReturnType := GetSType (sym) ;
!    WHILE GetNth (sym, i) # NulSym DO
!       son := GetNth (sym, i) ;
!       type := GetSType (son) ;
!       IF NOT q (type)
        THEN
           result := FALSE
        END ;
!       INC (i)
     END ;
!    IF (ReturnType = NulSym) OR q (ReturnType)
     THEN
        RETURN( result )
     ELSE
*************** VAR
*** 6555,6579 ****
     type,
     ReturnType: CARDINAL ;
  BEGIN
!    Assert(IsProcedure(sym)) ;
     i := 1 ;
!    ReturnType := GetSType(sym) ;
!    WHILE GetNth(sym, i)#NulSym DO
!       son := GetNth(sym, i) ;
!       type := GetSType(son) ;
!       p(type) ;
!       INC(i)
     END ;
!    IF ReturnType#NulSym
     THEN
!       p(ReturnType)
     END
  END WalkProcedureDependants ;
  
  
  (*
     IsUnboundedDependants - returns TRUE if the symbol, sym,
!                            q(dependants) all return TRUE.
  *)
  
  PROCEDURE IsUnboundedDependants (sym: CARDINAL; q: IsAction) : BOOLEAN ;
--- 6741,6765 ----
     type,
     ReturnType: CARDINAL ;
  BEGIN
!    Assert (IsProcedure (sym)) ;
     i := 1 ;
!    ReturnType := GetSType (sym) ;
!    WHILE GetNth (sym, i) # NulSym DO
!       son := GetNth (sym, i) ;
!       type := GetSType (son) ;
!       p (type) ;
!       INC (i)
     END ;
!    IF ReturnType # NulSym
     THEN
!       p (ReturnType)
     END
  END WalkProcedureDependants ;
  
  
  (*
     IsUnboundedDependants - returns TRUE if the symbol, sym,
!                            q (dependants) all return TRUE.
  *)
  
  PROCEDURE IsUnboundedDependants (sym: CARDINAL; q: IsAction) : BOOLEAN ;
*************** VAR
*** 6581,6595 ****
     result: BOOLEAN ;
  BEGIN
     result := TRUE ;
!    IF NOT q(GetUnboundedRecordType(sym))
     THEN
        result := FALSE
     END ;
!    IF NOT q(Cardinal)
     THEN
        result := FALSE
     END ;
!    IF NOT q(GetSType(sym))
     THEN
        result := FALSE
     END ;
--- 6767,6781 ----
     result: BOOLEAN ;
  BEGIN
     result := TRUE ;
!    IF NOT q (GetUnboundedRecordType (sym))
     THEN
        result := FALSE
     END ;
!    IF NOT q (Cardinal)
     THEN
        result := FALSE
     END ;
!    IF NOT q (GetSType (sym))
     THEN
        result := FALSE
     END ;
*************** END IsUnboundedDependants ;
*** 6603,6611 ****
  
  PROCEDURE WalkUnboundedDependants (sym: CARDINAL; p: WalkAction) ;
  BEGIN
!    p(GetUnboundedRecordType(sym)) ;
!    p(Cardinal) ;
!    p(GetSType(sym))
  END WalkUnboundedDependants ;
  
  
--- 6789,6797 ----
  
  PROCEDURE WalkUnboundedDependants (sym: CARDINAL; p: WalkAction) ;
  BEGIN
!    p (GetUnboundedRecordType (sym)) ;
!    p (Cardinal) ;
!    p (GetSType (sym))
  END WalkUnboundedDependants ;
  
  
*************** VAR
*** 6644,6658 ****
     align: CARDINAL ;
     type : CARDINAL ;
  BEGIN
!    type := GetSType(sym) ;
!    IF type#NulSym
     THEN
!       p(type)
     END ;
!    align := GetAlignment(sym) ;
!    IF align#NulSym
     THEN
!       p(align)
     END
  END WalkTypeDependants ;
  
--- 6830,6844 ----
     align: CARDINAL ;
     type : CARDINAL ;
  BEGIN
!    type := GetSType (sym) ;
!    IF type # NulSym
     THEN
!       p (type)
     END ;
!    align := GetAlignment (sym) ;
!    IF align # NulSym
     THEN
!       p (align)
     END
  END WalkTypeDependants ;
  
*************** END WalkTypeDependants ;
*** 6664,6672 ****
  
  PROCEDURE PoisonSymbols (sym: CARDINAL) ;
  BEGIN
!    IF IsProcedure(sym)
     THEN
!       ForeachLocalSymDo(sym, Poison)
     END
  END PoisonSymbols ;
  
--- 6850,6858 ----
  
  PROCEDURE PoisonSymbols (sym: CARDINAL) ;
  BEGIN
!    IF IsProcedure (sym)
     THEN
!       ForeachLocalSymDo (sym, Poison)
     END
  END PoisonSymbols ;
  
*************** END PoisonSymbols ;
*** 6677,6683 ****
  
  PROCEDURE ConstantKnownAndUsed (sym: CARDINAL; t: tree) ;
  BEGIN
!    DeclareConstantFromTree(sym, RememberConstant(t))
  END ConstantKnownAndUsed ;
  
  
--- 6863,6869 ----
  
  PROCEDURE ConstantKnownAndUsed (sym: CARDINAL; t: tree) ;
  BEGIN
!    DeclareConstantFromTree (sym, RememberConstant (t))
  END ConstantKnownAndUsed ;
  
  
*************** BEGIN
*** 6692,6705 ****
  END InitDeclarations ;
  
  
  BEGIN
     FreeGroup := NIL ;
     GlobalGroup := InitGroup () ;
     ErrorDepList := InitSet (1) ;
!    ChainedList := InitSet(1) ;
!    WatchList := InitSet(1) ;
     VisitedList := NIL ;
!    EnumerationIndex := InitIndex(1) ;
     HaveInitDefaultTypes := FALSE ;
!    recursionCaught := FALSE
  END M2GCCDeclare.
--- 6878,6908 ----
  END InitDeclarations ;
  
  
+ VAR
+    DeclaredOutstandingTypesDiag,
+    DeclareTypesConstantsProceduresDiag,
+    DeclareTypesConstantsProceduresInRangeDiag: Diagnostic ;
  BEGIN
+    DeclaredOutstandingTypesDiag
+       := InitTimeDiagnostic
+             ('M2GCCDeclare:DeclaredOutstandingTypes',
+             '{1N} called {1C} times consuming {1T} ({1P})') ;
+    DeclareTypesConstantsProceduresInRangeDiag
+       := InitTimeDiagnostic
+             ('M2GCCDeclare:DeclareTypesConstantsProceduresInRangeDiag',
+             '{1N} called {1C} times consuming {1T} ({1P})') ;
+    DeclareTypesConstantsProceduresDiag
+    := InitTimeDiagnostic
+             ('M2GCCDeclare:DeclareTypesConstantsProceduresDiag',
+             '{1N} called {1C} times consuming {1T} ({1P})') ;
     FreeGroup := NIL ;
     GlobalGroup := InitGroup () ;
+    ChainedList := InitSet (1) ;
     ErrorDepList := InitSet (1) ;
!    WatchList := InitSet (1) ;
     VisitedList := NIL ;
!    EnumerationIndex := InitIndex (1) ;
     HaveInitDefaultTypes := FALSE ;
!    recursionCaught := FALSE ;
!    tempset := 0
  END M2GCCDeclare.
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/M2GenGCC.mod gcc-16-20250921/gcc/m2/gm2-compiler/M2GenGCC.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/M2GenGCC.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/M2GenGCC.mod	Sun Sep 21 22:32:38 2025
*************** FROM SymbolTable IMPORT PushSize, PopSiz
*** 35,40 ****
--- 35,43 ----
                          GetLowestType,
                          GetLocalSym, GetVarWritten,
                          GetVarient, GetVarBackEndType, GetModuleCtors,
+                         GetSetInWord, GetDType,
+                         GetNthParamAnyClosest,
+                         GetMainModule, IsUnknown,
                          NoOfVariables,
                          NoOfParamAny, GetParent, GetDimension, IsAModula2Type,
                          IsModule, IsDefImp, IsType, IsModuleWithinProcedure,
*************** FROM SymbolTable IMPORT PushSize, PopSiz
*** 74,89 ****
                          GetProcedureBuiltin,
                          GetPriority, GetNeedSavePriority,
                          PutConstStringKnown,
                          PutConst, PutConstSet, PutConstructor,
  			GetSType, GetTypeMode,
                          HasVarParameters, CopyConstString,
                          GetVarDeclFullTok,
                          NulSym ;
  
! FROM M2Batch IMPORT MakeDefinitionSource ;
  
  FROM M2LexBuf IMPORT FindFileNameFromToken, TokenToLineNo, TokenToLocation,
!                      MakeVirtualTok, UnknownTokenNo, BuiltinTokenNo ;
  
  FROM M2Code IMPORT CodeBlock ;
  FROM M2Debug IMPORT Assert ;
--- 77,96 ----
                          GetProcedureBuiltin,
                          GetPriority, GetNeedSavePriority,
                          PutConstStringKnown,
+                         GetSetArray,
                          PutConst, PutConstSet, PutConstructor,
  			GetSType, GetTypeMode,
                          HasVarParameters, CopyConstString,
                          GetVarDeclFullTok,
                          NulSym ;
  
! FROM m2tree IMPORT debug_tree, skip_const_decl ;
! FROM gcctypes IMPORT location_t, tree ;
! 
! FROM M2Batch IMPORT MakeDefinitionSource, LookupModule ;
  
  FROM M2LexBuf IMPORT FindFileNameFromToken, TokenToLineNo, TokenToLocation,
!                      MakeVirtualTok, MakeVirtual2Tok, UnknownTokenNo, BuiltinTokenNo ;
  
  FROM M2Code IMPORT CodeBlock ;
  FROM M2Debug IMPORT Assert ;
*************** FROM M2MetaError IMPORT MetaErrorT0, Met
*** 96,102 ****
  FROM M2Options IMPORT UnboundedByReference, PedanticCast,
                        VerboseUnbounded, Iso, Pim, DebugBuiltins, WholeProgram,
                        StrictTypeChecking, AutoInit, cflag, ScaffoldMain,
!                       ScaffoldDynamic, ScaffoldStatic, GetDebugTraceQuad ;
  
  FROM M2Printf IMPORT printf0, printf1, printf2, printf4 ;
  FROM M2Quiet IMPORT qprintf0 ;
--- 103,110 ----
  FROM M2Options IMPORT UnboundedByReference, PedanticCast,
                        VerboseUnbounded, Iso, Pim, DebugBuiltins, WholeProgram,
                        StrictTypeChecking, AutoInit, cflag, ScaffoldMain,
!                       ScaffoldDynamic, ScaffoldStatic, GetDebugTraceQuad,
!                       OptimizeSets, GetWideset ;
  
  FROM M2Printf IMPORT printf0, printf1, printf2, printf4 ;
  FROM M2Quiet IMPORT qprintf0 ;
*************** FROM Lists IMPORT List, InitList, KillLi
*** 131,136 ****
--- 139,145 ----
                    NoOfItemsInList, GetItemFromList ;
  
  FROM M2ALU IMPORT PtrToValue,
+                   KillValue, PopInto,
                    IsValueTypeReal, IsValueTypeSet,
                    IsValueTypeConstructor, IsValueTypeArray,
                    IsValueTypeRecord, IsValueTypeComplex,
*************** FROM M2GCCDeclare IMPORT WalkAction,
*** 154,160 ****
                           PromoteToString, PromoteToCString, DeclareLocalVariable,
                           CompletelyResolved,
                           PoisonSymbols, GetTypeMin, GetTypeMax,
!                          IsProcedureGccNested, DeclareParameters,
                           ConstantKnownAndUsed, PrintSym ;
  
  FROM M2Range IMPORT CodeRangeCheck, FoldRangeCheck, CodeErrorCheck, GetMinMax ;
--- 163,169 ----
                           PromoteToString, PromoteToCString, DeclareLocalVariable,
                           CompletelyResolved,
                           PoisonSymbols, GetTypeMin, GetTypeMax,
!                          IsProcedureGccNested, DeclareParameters, DeclareProcedure,
                           ConstantKnownAndUsed, PrintSym ;
  
  FROM M2Range IMPORT CodeRangeCheck, FoldRangeCheck, CodeErrorCheck, GetMinMax ;
*************** FROM m2builtins IMPORT BuiltInAlloca,
*** 164,173 ****
                         GetBuiltinConst, GetBuiltinTypeInfo,
                         BuiltinExists, BuildBuiltinTree ;
  
! FROM m2expr IMPORT GetIntegerZero, GetIntegerOne,
                     GetCardinalOne,
                     GetPointerZero,
                     GetCardinalZero,
                     GetSizeOfInBits,
                     TreeOverflow,
                     FoldAndStrip,
--- 173,183 ----
                         GetBuiltinConst, GetBuiltinTypeInfo,
                         BuiltinExists, BuildBuiltinTree ;
  
! FROM m2expr IMPORT GetIntegerZero, GetIntegerOne, GetWordOne,
                     GetCardinalOne,
                     GetPointerZero,
                     GetCardinalZero,
+                    GetBitsetZero,
                     GetSizeOfInBits,
                     TreeOverflow,
                     FoldAndStrip,
*************** FROM m2expr IMPORT GetIntegerZero, GetIn
*** 175,180 ****
--- 185,191 ----
                     StringLength,
                     AreConstantsEqual,
                     GetCstInteger,
+                    GetRValue,
                     BuildForeachWordInSetDoIfExpr,
                     BuildIfConstInVar,
                     BuildIfVarInVar,
*************** FROM m2expr IMPORT GetIntegerZero, GetIn
*** 182,191 ****
                     BuildIfNotVarInVar,
                     BuildBinCheckProcedure, BuildUnaryCheckProcedure,
                     BuildBinProcedure, BuildUnaryProcedure,
!                    BuildSetProcedure, BuildUnarySetFunction,
  		   BuildAddCheck, BuildSubCheck, BuildMultCheck, BuildDivTruncCheck,
                     BuildDivM2Check, BuildModM2Check,
!                    BuildAdd, BuildSub, BuildMult, BuildLSL,
  		   BuildDivCeil, BuildModCeil,
                     BuildDivTrunc, BuildModTrunc, BuildDivFloor, BuildModFloor,
  		   BuildDivM2, BuildModM2,
--- 193,202 ----
                     BuildIfNotVarInVar,
                     BuildBinCheckProcedure, BuildUnaryCheckProcedure,
                     BuildBinProcedure, BuildUnaryProcedure,
!                    BuildSetProcedure,
  		   BuildAddCheck, BuildSubCheck, BuildMultCheck, BuildDivTruncCheck,
                     BuildDivM2Check, BuildModM2Check,
!                    BuildAdd, BuildSub, BuildMult, BuildLSL, BuildMask,
  		   BuildDivCeil, BuildModCeil,
                     BuildDivTrunc, BuildModTrunc, BuildDivFloor, BuildModFloor,
  		   BuildDivM2, BuildModM2,
*************** FROM m2expr IMPORT GetIntegerZero, GetIn
*** 202,211 ****
                     BuildEqualTo, BuildNotEqualTo,
                     BuildIsSuperset, BuildIsNotSuperset,
                     BuildIsSubset, BuildIsNotSubset,
                     BuildIndirect, BuildArray,
                     BuildTrunc, BuildCoerce,
-                    BuildBinaryForeachWordDo,
-                    BuildBinarySetDo,
                     BuildSetNegate,
                     BuildComponentRef,
                     BuildCap, BuildAbs, BuildIm, BuildRe, BuildCmplx,
--- 213,221 ----
                     BuildEqualTo, BuildNotEqualTo,
                     BuildIsSuperset, BuildIsNotSuperset,
                     BuildIsSubset, BuildIsNotSubset,
+                    BuildIfInSet, BuildIfNotInSet,
                     BuildIndirect, BuildArray,
                     BuildTrunc, BuildCoerce,
                     BuildSetNegate,
                     BuildComponentRef,
                     BuildCap, BuildAbs, BuildIm, BuildRe, BuildCmplx,
*************** FROM gcctypes IMPORT location_t, tree ;
*** 218,227 ****
  FROM m2decl IMPORT BuildStringConstant, BuildCStringConstant,
                     DeclareKnownConstant, GetBitsPerBitset,
                     BuildIntegerConstant,
!                    BuildModuleCtor, DeclareModuleCtor ;
  
  FROM m2statement IMPORT BuildAsm, BuildProcedureCallTree, BuildParam, BuildFunctValue,
!                         DoJump, BuildUnaryForeachWordDo, BuildGoto, BuildCall2, BuildCall3,
                          BuildStart, BuildEnd, BuildCallInner, BuildStartFunctionCode,
                          BuildEndFunctionCode,
                          BuildAssignmentTree, DeclareLabel,
--- 228,239 ----
  FROM m2decl IMPORT BuildStringConstant, BuildCStringConstant,
                     DeclareKnownConstant, GetBitsPerBitset,
                     BuildIntegerConstant,
!                    BuildModuleCtor, DeclareModuleCtor,
!                    DeclareKnownVariable ;
  
  FROM m2statement IMPORT BuildAsm, BuildProcedureCallTree, BuildParam, BuildFunctValue,
!                         IfBitInSetJump, IfExprJump,
!                         BuildGoto, BuildCall2, BuildCall3,
                          BuildStart, BuildEnd, BuildCallInner, BuildStartFunctionCode,
                          BuildEndFunctionCode,
                          BuildAssignmentTree, DeclareLabel,
*************** FROM m2statement IMPORT BuildAsm, BuildP
*** 240,245 ****
--- 252,258 ----
  
  FROM m2type IMPORT ChainOnParamValue, GetPointerType, GetIntegerType, AddStatement,
                     GetCardinalType, GetWordType, GetM2ZType, GetM2RType, GetM2CType,
+                    GetBooleanFalse,
                     BuildCharConstant, AddStringToTreeList, BuildArrayStringConstructor,
                     GetArrayNoOfElements, GetTreeType, IsGccStrictTypeEquivalent ;
  
*************** FROM m2block IMPORT RememberConstant, pu
*** 250,256 ****
  
  FROM m2misc IMPORT DebugTree ;
  
! FROM m2convert IMPORT BuildConvert, ConvertConstantAndCheck, ToCardinal, ConvertString ;
  
  FROM m2except IMPORT BuildThrow, BuildTryBegin, BuildTryEnd,
                       BuildCatchBegin, BuildCatchEnd ;
--- 263,270 ----
  
  FROM m2misc IMPORT DebugTree ;
  
! FROM m2convert IMPORT BuildConvert, ConvertConstantAndCheck, ToCardinal,
!                       ToBitset, ToWord, ConvertString ;
  
  FROM m2except IMPORT BuildThrow, BuildTryBegin, BuildTryEnd,
                       BuildCatchBegin, BuildCatchEnd ;
*************** CONST
*** 278,296 ****
     CascadedDebugging = FALSE ;
  
  TYPE
!    DoProcedure      = PROCEDURE (CARDINAL) ;
!    DoUnaryProcedure = PROCEDURE (CARDINAL) ;
  
  VAR
     Memset, Memcpy           : CARDINAL ;
     CurrentQuadToken         : CARDINAL ;
     UnboundedLabelNo         : CARDINAL ;
!    LastLine                 : CARDINAL ;(* The Last Line number emitted with the  *)
!                                         (* generated code.                        *)
     LastOperator             : QuadOperator ; (* The last operator processed.      *)
!    ScopeStack               : StackOfWord ; (* keeps track of the current scope       *)
!                                             (* under translation.                     *)
!    NoChange                 : BOOLEAN ;     (* has any constant been resolved?        *)
  
  
  (*
--- 292,315 ----
     CascadedDebugging = FALSE ;
  
  TYPE
!    UnaryProcedure = PROCEDURE (CARDINAL) ;
!    ProcedureCardinal = PROCEDURE (CARDINAL) ;
!    BinaryFunction = PROCEDURE (location_t, tree, tree) : tree ;
!    UnaryFunction = PROCEDURE (location_t, tree) : tree ;
  
  VAR
     Memset, Memcpy           : CARDINAL ;
     CurrentQuadToken         : CARDINAL ;
     UnboundedLabelNo         : CARDINAL ;
!    LastLine                 : CARDINAL ;    (* The Last Line number emitted with  *)
!                                             (* the generated code.                *)
     LastOperator             : QuadOperator ; (* The last operator processed.      *)
!    ScopeStack               : StackOfWord ; (* keeps track of the current scope   *)
!                                             (* under translation.                 *)
!    NoChange                 : BOOLEAN ;     (* has any constant been resolved?    *)
!    SetTemporaryNo           : CARDINAL ;    (* A unique number for creating set   *)
!                                             (* oarecord parameter names.          *)
!    BreakQuad                : CARDINAL ;    (* Allows interactive debugging.      *)
  
  
  (*
*************** VAR
*** 613,618 ****
--- 632,638 ----
  BEGIN
     InitBuiltinSyms (BuiltinTokenNo) ;
     GetQuad(q, op, op1, op2, op3) ;
+    CheckBreak (q) ;
     IF op=StatementNoteOp
     THEN
        FoldStatementNote (op3)  (* Will change CurrentQuadToken using op3.  *)
*************** BEGIN
*** 663,674 ****
     DivFloorOp         : CodeDivFloor (q, op2, op3) |
     ModFloorOp         : CodeModFloor (q, op2, op3) |
     GotoOp             : CodeGoto (op3) |
!    InclOp             : CodeIncl (op1, op3) |
!    ExclOp             : CodeExcl (op1, op3) |
!    NegateOp           : CodeNegateChecked (q, op1, op3) |
     LastForIteratorOp  : CodeLastForIterator (q) |
!    LogicalShiftOp     : CodeSetShift (q, op1, op2, op3) |
!    LogicalRotateOp    : CodeSetRotate (q, op1, op2, op3) |
     LogicalOrOp        : CodeSetOr (q) |
     LogicalAndOp       : CodeSetAnd (q) |
     LogicalXorOp       : CodeSetSymmetricDifference (q) |
--- 683,694 ----
     DivFloorOp         : CodeDivFloor (q, op2, op3) |
     ModFloorOp         : CodeModFloor (q, op2, op3) |
     GotoOp             : CodeGoto (op3) |
!    InclOp             : CodeIncl (q) |
!    ExclOp             : CodeExcl (q) |
!    NegateOp           : CodeNegateChecked (q) |
     LastForIteratorOp  : CodeLastForIterator (q) |
!    LogicalShiftOp     : CodeSetShift (q) |
!    LogicalRotateOp    : CodeSetRotate (q) |
     LogicalOrOp        : CodeSetOr (q) |
     LogicalAndOp       : CodeSetAnd (q) |
     LogicalXorOp       : CodeSetSymmetricDifference (q) |
*************** BEGIN
*** 923,929 ****
                 END
              ELSE
                 MetaErrorT1 (tok,
!                             'a constraint to the GNU ASM statement must be a constant string and not a {%1Ed}',
                              str)
              END
           END ;
--- 943,949 ----
                 END
              ELSE
                 MetaErrorT1 (tok,
!                             'a constraint to the GNU ASM statement must be a constant string and not a {%1Edv}',
                              str)
              END
           END ;
*************** BEGIN
*** 966,972 ****
                 END
              ELSE
                 MetaErrorT1 (tok,
!                             'a constraint to the GNU ASM statement must be a constant string and not a {%1Ed}',
                              str)
              END
           END ;
--- 986,992 ----
                 END
              ELSE
                 MetaErrorT1 (tok,
!                             'a constraint to the GNU ASM statement must be a constant string and not a {%1Edv}',
                              str)
              END
           END ;
*************** END PopScope ;
*** 1115,1120 ****
--- 1135,1154 ----
  
  
  (*
+    GetActiveScope -
+ *)
+ 
+ PROCEDURE GetActiveScope () : CARDINAL ;
+ BEGIN
+    IF IsEmptyWord (ScopeStack)
+    THEN
+       InternalError ('not expecting scope stack to be empty')
+    END ;
+    RETURN PeepWord (ScopeStack, 1)
+ END GetActiveScope ;
+ 
+ 
+ (*
     GetCurrentScopeDescription - returns a description of the current scope.
  *)
  
*************** BEGIN
*** 1671,1679 ****
          goto tLabel
       fi
     *)
!    DoJump(location, BuildGreaterThan(location, ta, td), NIL, string(fLabel)) ;
!    DoJump(location, BuildLessThan(location, tb, tc), NIL, string(fLabel)) ;
!    BuildGoto(location, string(tLabel)) ;
     IF CascadedDebugging
     THEN
        printf1('label used %s\n', tLabel) ;
--- 1705,1713 ----
          goto tLabel
       fi
     *)
!    IfExprJump (location, BuildGreaterThan (location, ta, td), string (fLabel)) ;
!    IfExprJump (location, BuildLessThan (location, tb, tc), string (fLabel)) ;
!    BuildGoto (location, string (tLabel)) ;
     IF CascadedDebugging
     THEN
        printf1('label used %s\n', tLabel) ;
*************** BEGIN
*** 1752,1766 ****
           END ;
           DeclareLabel(location, string(fLabel)) ;
           INC(j)
!       END ;
! (*
!       nLabel := CreateLabelProcedureN(proc, "fin", UnboundedLabelNo, n+1) ;
!       IF CascadedDebugging
!       THEN
!          printf1('label declared %s\n', nLabel)
!       END ;
!       DeclareLabel(location, string(nLabel))
! *)
     END
  END BuildCascadedIfThenElsif ;
  
--- 1786,1792 ----
           END ;
           DeclareLabel(location, string(fLabel)) ;
           INC(j)
!       END
     END
  END BuildCascadedIfThenElsif ;
  
*************** BEGIN
*** 2429,2435 ****
                 tmp := BuildLSL (location, tmp, bits, FALSE)
              END ;
              bits := BuildAdd (location, bits, GetSizeOfInBits (Mod2Gcc (type)), FALSE) ;
!             val := BuildLogicalOrAddress (location, val, tmp, FALSE)
           END
        END ;
        SubQuad (n) ;
--- 2455,2461 ----
                 tmp := BuildLSL (location, tmp, bits, FALSE)
              END ;
              bits := BuildAdd (location, bits, GetSizeOfInBits (Mod2Gcc (type)), FALSE) ;
!             val := BuildLogicalOrAddress (location, val, tmp)
           END
        END ;
        SubQuad (n) ;
*************** BEGIN
*** 2522,2528 ****
                    tmp := BuildLSL (location, tmp, bits, FALSE)
                 END ;
  	       bits := BuildAdd (location, bits, GetSizeOfInBits (Mod2Gcc (type)), FALSE) ;
!                val := BuildLogicalOrAddress (location, val, tmp, FALSE)
              END
           END ;
           SubQuad (n) ;
--- 2548,2554 ----
                    tmp := BuildLSL (location, tmp, bits, FALSE)
                 END ;
  	       bits := BuildAdd (location, bits, GetSizeOfInBits (Mod2Gcc (type)), FALSE) ;
!                val := BuildLogicalOrAddress (location, val, tmp)
              END
           END ;
           SubQuad (n) ;
*************** END FoldMakeAdr ;
*** 2548,2554 ****
               procedure, op2.  The number of the parameter is op1.
  *)
  
! PROCEDURE doParam (quad: CARDINAL; paramtok: CARDINAL; op1, op2, op3: CARDINAL) ;
  VAR
     location: location_t ;
  BEGIN
--- 2574,2580 ----
               procedure, op2.  The number of the parameter is op1.
  *)
  
! PROCEDURE doParam (paramtok: CARDINAL; quad: CARDINAL; op1, op2, op3: CARDINAL) ;
  VAR
     location: location_t ;
  BEGIN
*************** BEGIN
*** 2706,2712 ****
                        parameter, procedure)
        ELSIF compatible
        THEN
!          doParam (quad, parampos, nth, procedure, parameter)
        END
     END
  END CodeParam ;
--- 2732,2738 ----
                        parameter, procedure)
        ELSIF compatible
        THEN
!          doParam (parampos, quad, nth, procedure, parameter)
        END
     END
  END CodeParam ;
*************** BEGIN
*** 2884,2900 ****
  END CodeAddr ;
  
  
- PROCEDURE stop ; BEGIN END stop ;
- 
- PROCEDURE CheckStop (q: CARDINAL) ;
- BEGIN
-    IF q=3827
-    THEN
-       stop
-    END
- END CheckStop ;
- 
- 
  (*
  ------------------------------------------------------------------------------
     := Operator
--- 2910,2915 ----
*************** PROCEDURE FoldBecomes (p: WalkAction; bb
*** 2906,2911 ****
--- 2921,2927 ----
  BEGIN
     IF DeclaredOperandsBecomes (p, quad)
     THEN
+       CheckBreak (quad) ;
        IF (NOT IsConditionalBooleanQuad (quad)) OR IsBasicBlockFirst (bb)
        THEN
           IF TypeCheckBecomes (p, quad)
*************** END checkBecomes ;
*** 3484,3492 ****
  
  PROCEDURE checkDeclare (sym: CARDINAL) ;
  BEGIN
!    IF IsTemporary (sym) AND IsVariableSSA (sym) AND (NOT GccKnowsAbout (sym))
     THEN
!       DeclareLocalVariable (sym)
     END
  END checkDeclare ;
  
--- 3500,3514 ----
  
  PROCEDURE checkDeclare (sym: CARDINAL) ;
  BEGIN
!    IF (sym # NulSym) AND (NOT GccKnowsAbout (sym))
     THEN
!       IF IsTemporary (sym) AND IsVariableSSA (sym)
!       THEN
!          DeclareLocalVariable (sym)
!       ELSIF IsProcedure (sym)
!       THEN
!          DeclareProcedure (sym)
!       END
     END
  END checkDeclare ;
  
*************** END CodeBecomes ;
*** 3603,3608 ****
--- 3625,3641 ----
  
  
  (*
+    getrvalue -
+ *)
+ 
+ PROCEDURE getrvalue (location: location_t;
+                      expr, type: CARDINAL; islvalue: BOOLEAN) : tree ;
+ BEGIN
+    RETURN GetRValue (location, Mod2Gcc (expr), Mod2Gcc (type), islvalue)
+ END getrvalue ;
+ 
+ 
+ (*
     LValueToGenericPtr - returns a Tree representing symbol, sym.
                          It coerces a lvalue into an internal pointer type
  *)
*************** BEGIN
*** 3989,3995 ****
     IF (righttype = NulSym) OR (NOT IsSet (SkipType (righttype)))
     THEN
        MetaErrorT1 (rightpos,
!                    'an {%kIN} expression is expecting {%1Etad} to be a {%kSET} type',
                     right) ;
        NoChange := FALSE ;
        SubQuad (quad) ;
--- 4022,4028 ----
     IF (righttype = NulSym) OR (NOT IsSet (SkipType (righttype)))
     THEN
        MetaErrorT1 (rightpos,
!                    'the right hand side of an {%kIN} expression is expecting {%1Ead} to be a {%kSET} type and not a {%1Etadv}',
                     right) ;
        NoChange := FALSE ;
        SubQuad (quad) ;
*************** END CheckElementSetTypes ;
*** 4000,4072 ****
  
  
  (*
!    CodeBinarySet - encode a binary set arithmetic operation.
                     Set operands may be longer than a word.
  *)
  
! PROCEDURE CodeBinarySet (binop: BuildBinProcedure; doOp: DoProcedure;
                           quad: CARDINAL) ;
  VAR
-    location        : location_t ;
-    constExpr,
-    overflowChecking: BOOLEAN ;
     op              : QuadOperator ;
!    virttoken,
!    virtexpr,
!    des,
!    left,
!    right,
     despos,
     leftpos,
!    rightpos,
!    operatorpos     : CARDINAL ;
  BEGIN
!    GetQuadOtok (quad, operatorpos, op, des, left, right,
!                 overflowChecking, constExpr,
!                 despos, leftpos, rightpos) ;
! 
     (* Firstly ensure that constant literals are declared.  *)
     DeclareConstant (rightpos, right) ;
     DeclareConstant (leftpos, left) ;
     DeclareConstructor (rightpos, quad, right) ;
     DeclareConstructor (leftpos, quad, left) ;
! 
!    virttoken := MakeVirtualTok (operatorpos, despos, rightpos) ;
!    location := TokenToLocation (virttoken) ;
!    IF CheckBinaryExpressionTypes (quad, NoWalkProcedure)
     THEN
!       IF IsConst (des)
        THEN
!          virtexpr := MakeVirtualTok (operatorpos, leftpos, rightpos) ;
!          IF IsValueSolved (left) AND IsValueSolved (right)
!          THEN
!             Assert (MixTypes (FindType (right), FindType (left), virtexpr) # NulSym) ;
!             PutConst (des, FindType (right)) ;
!             PushValue (left) ;
!             PushValue (right) ;
!             doOp (virttoken) ;
!             PopValue (des) ;
!             PutConstSet (des)
!          ELSE
!             MetaErrorT0 (virtexpr, '{%E}constant expression cannot be evaluated')
!          END
        ELSE
!          checkDeclare (des) ;
!          BuildBinaryForeachWordDo (location,
!                                    Mod2Gcc (SkipType (GetType (des))),
!                                    Mod2Gcc (des), Mod2Gcc (left), Mod2Gcc (right), binop,
!                                    GetMode (des) = LeftValue,
!                                    GetMode (left) = LeftValue,
!                                    GetMode (right) = LeftValue,
!                                    IsConst (des),
!                                    IsConst (left),
!                                    IsConst (right))
        END
     END
  END CodeBinarySet ;
  
  
  (*
     CheckUnaryOperand - checks to see whether operand is using a generic type.
  *)
  
--- 4033,4292 ----
  
  
  (*
!    CodeBinarySet - encode a binary set AND arithmetic operation.
                     Set operands may be longer than a word.
  *)
  
! PROCEDURE CodeBinarySet (constp: ProcedureCardinal;
!                          binfunc: BinaryFunction;
!                          wideprocname: Name;
                           quad: CARDINAL) ;
  VAR
     op              : QuadOperator ;
!    operatorpos,
!    combinedpos,
     despos,
     leftpos,
!    rightpos        : CARDINAL ;
!    des, left, right: CARDINAL ;
!    overflowChecking,
!    typeChecking,
!    constExpr       : BOOLEAN ;
!    location        : location_t ;
!    settype         : CARDINAL ;
  BEGIN
!    GetQuadOTypetok (quad, operatorpos, op,
!                     des, left, right,
!                     overflowChecking, typeChecking, constExpr,
!                     despos, leftpos, rightpos) ;
     (* Firstly ensure that constant literals are declared.  *)
     DeclareConstant (rightpos, right) ;
     DeclareConstant (leftpos, left) ;
     DeclareConstructor (rightpos, quad, right) ;
     DeclareConstructor (leftpos, quad, left) ;
!    IF IsConst (des)
     THEN
!       combinedpos := MakeVirtual2Tok (leftpos, rightpos) ;
!       IF IsValueSolved (left) AND IsValueSolved (right)
        THEN
!          Assert (MixTypes (FindType (left), FindType (right), combinedpos) # NulSym) ;
!          PutConst (des, FindType (right)) ;
!          PushValue (left) ;
!          PushValue (right) ;
!          constp (combinedpos) ;
!          PopValue (des) ;
!          PutConstSet (des)
        ELSE
!          MetaErrorT0 (combinedpos, '{%E}constant expression cannot be evaluated')
!       END
!    ELSE
!       checkDeclare (des) ;
!       settype := GetLType (des) ;
!       Assert (IsSet (settype)) ;
!       combinedpos := MakeVirtualTok (despos, leftpos, rightpos) ;
!       IF GetSetInWord (settype)
!       THEN
!          location := TokenToLocation (combinedpos) ;
!          SetNarrowBinary (location, binfunc, settype, des, left, right)
!       ELSE
!          SetWideBinary (combinedpos, wideprocname, settype, des, left, right)
        END
     END
  END CodeBinarySet ;
  
  
  (*
+    MakeTemporarySetName - returns a Name using the template _Tset%d.
+ *)
+ 
+ PROCEDURE MakeTemporarySetName () : Name ;
+ VAR
+    name: Name ;
+    s   : String ;
+ BEGIN
+    INC (SetTemporaryNo) ;
+    s := Sprintf1 (Mark (InitString ('_Tset%d')), SetTemporaryNo) ;
+    name := makekey (string (s)) ;
+    s := KillString (s) ;
+    RETURN name
+ END MakeTemporarySetName ;
+ 
+ 
+ (*
+    SetWideBinary -
+ *)
+ 
+ PROCEDURE SetWideBinary (tokenno: CARDINAL;
+                          wideprocname: Name;
+                          settype, des, left, right: CARDINAL) ;
+ BEGIN
+    IF OptimizeSets
+    THEN
+       IF wideprocname = MakeKey ('And')
+       THEN
+          SetWideBinaryBuiltin (tokenno, BuildLogicalAnd, des, left, right) ;
+          RETURN
+       ELSIF wideprocname = MakeKey ('Or')
+       THEN
+          SetWideBinaryBuiltin (tokenno, BuildLogicalOr, des, left, right) ;
+          RETURN
+       END
+    END ;
+    SetWideBinaryLibrary (tokenno, wideprocname, settype, des, left, right)
+ END SetWideBinary ;
+ 
+ 
+ (*
+    SetWideBinaryLibrary - call wideprocname (des, left, right) passing des, left, right
+                           as an array of byte.
+ *)
+ 
+ PROCEDURE SetWideBinaryLibrary (tokenno: CARDINAL;
+                                 wideprocname: Name;
+                                 settype, des, left, right: CARDINAL) ;
+ VAR
+    location : location_t ;
+    procedure,
+    param1,
+    param2,
+    param3   : CARDINAL ;
+    highbit,
+    array1,
+    array2,
+    array3,
+    call     : tree ;
+ BEGIN
+    procedure := FromM2WIDESETImport (tokenno, wideprocname) ;
+    checkDeclare (procedure) ;
+    location := TokenToLocation (tokenno) ;
+    param1 := GetNthParamAnyClosest (procedure, 1, GetMainModule ()) ;
+    param2 := GetNthParamAnyClosest (procedure, 2, GetMainModule ()) ;
+    param3 := GetNthParamAnyClosest (procedure, 3, GetMainModule ()) ;
+    array1 := CreateSetArrayParam (location, tokenno, des, param1) ;
+    array2 := CreateSetArrayParam (location, tokenno, left, param2) ;
+    array3 := CreateSetArrayParam (location, tokenno, right, param3) ;
+    highbit := ToCardinal (location, CalcHighSetBit (location, settype)) ;
+    BuildParam (location, highbit) ;  (* Parameter 4.  *)
+    BuildParam (location, array3) ;   (* Parameter 3.  *)
+    BuildParam (location, array2) ;   (* Parameter 2.  *)
+    BuildParam (location, array1) ;   (* Parameter 1.  *)
+    call := BuildProcedureCallTree (location, Mod2Gcc (procedure), NIL) ;
+    SetLastFunction (NIL) ;
+    AddStatement (location, call)
+ END SetWideBinaryLibrary ;
+ 
+ 
+ (*
+    SetWideBinaryBuiltin - build an builtin wideset NOT operation.
+ *)
+ 
+ PROCEDURE SetWideBinaryBuiltin (tokenno: CARDINAL;
+                                 binfunc: BinaryFunction;
+                                 des, left, right: CARDINAL) ;
+ VAR
+    location : location_t ;
+    byte,
+    lhs, rhs,
+    dest,
+    index,
+    high     : tree ;
+ BEGIN
+    location := TokenToLocation (tokenno) ;
+    high := ResolveHigh (tokenno, 1, des) ;
+    index := GetIntegerZero (location) ;
+    byte := Mod2Gcc (Byte) ;
+    REPEAT
+       rhs := BuildArray (location, byte,
+                          getrvalue (location, right, GetType (right),
+                                     GetMode (right) = LeftValue),
+                          index, GetIntegerZero (location)) ;
+       lhs := BuildArray (location, byte,
+                          getrvalue (location, left, GetType (left),
+                                     GetMode (left) = LeftValue),
+                          index, GetIntegerZero (location)) ;
+       rhs := binfunc (location, lhs, rhs) ;
+       rhs := BuildConvert (location, byte, rhs, FALSE) ;
+       dest := BuildArray (location, byte,
+                           getrvalue (location, des, GetType (des),
+                                      GetMode (des) = LeftValue),
+                           index, GetIntegerZero (location)) ;
+       BuildAssignmentStatement (location, dest, rhs) ;
+       PushIntegerTree (index) ;
+       PushCard (1) ;
+       Addn ;
+       index := PopIntegerTree ()
+    UNTIL CompareTrees (index, high) > 0
+ END SetWideBinaryBuiltin ;
+ 
+ 
+ (*
+    SetNarrowBinary - create tree consisting of:
+                      result := binfunc (left, right)
+                      result, left and right can be lvalues.
+ *)
+ 
+ PROCEDURE SetNarrowBinary (location: location_t; binfunc: BinaryFunction;
+                            settype, result, left, right: CARDINAL) ;
+ VAR
+    isResultL,
+    isLeftL,
+    isRightL : BOOLEAN ;
+ BEGIN
+    isResultL := GetMode (result) = LeftValue ;
+    isLeftL := GetMode (left) = LeftValue ;
+    isRightL := GetMode (right) = LeftValue ;
+    BuildAssignmentStatement (location,
+                              getrvalue (location, result, settype, isResultL),
+                              binfunc (location,
+                                       getrvalue (location, left, settype, isLeftL),
+                                       getrvalue (location, right, settype, isRightL)))
+ END SetNarrowBinary ;
+ 
+ 
+ (*
+    CreateSetArrayParam - return a gcc tree containing value contained in an unbounded
+                          array parameter.
+ *)
+ 
+ PROCEDURE CreateSetArrayParam (location: location_t; tokenno: CARDINAL;
+                                value, param: CARDINAL) : tree ;
+ VAR
+    dataAddress,
+    designator,
+    oarecord   : tree ;
+    unbounded,
+    HighField,
+    scope      : CARDINAL ;
+ BEGIN
+    unbounded := GetType (param) ;
+    Assert (IsUnbounded (unbounded)) ;
+    scope := GetActiveScope () ;
+    (* Declare oarecord which has a pointer and high field.  This will be passed as
+       a parameter into the runtime set procedure and appear as an ARRAY OF BYTE.  *)
+    oarecord := DeclareKnownVariable (location, KeyToCharStar (MakeTemporarySetName ()),
+                                      Mod2Gcc (unbounded),
+                                      FALSE, FALSE, TRUE, IsProcedure (scope),
+                                      Mod2Gcc (scope), NIL) ;
+    (* Designator is oarecord.address.  *)
+    designator := BuildComponentRef (location, oarecord,
+                                     Mod2Gcc (GetUnboundedAddressOffset (unbounded))) ;
+    IF GetMode (value) = LeftValue
+    THEN
+       (* Already pointing to the data.  *)
+       dataAddress := Mod2Gcc (value)
+    ELSE
+       dataAddress := BuildAddr (location, Mod2Gcc (value), FALSE)
+    END ;
+    BuildAssignmentStatement (location, designator, dataAddress) ;
+    HighField := GetUnboundedHighOffset (unbounded, 1) ;
+    designator := BuildComponentRef (location, oarecord, Mod2Gcc (HighField)) ;
+    BuildAssignmentStatement (location, designator,
+                              ResolveHigh (tokenno, 1, value)) ;
+    RETURN oarecord
+ END CreateSetArrayParam ;
+ 
+ 
+ (*
     CheckUnaryOperand - checks to see whether operand is using a generic type.
  *)
  
*************** PROCEDURE FoldMult (tokenno: CARDINAL; p
*** 4367,4373 ****
  BEGIN
     IF BinaryOperands (quad, op2, op3)
     THEN
!       FoldBinary(tokenno, p, BuildMult, quad, op1, op2, op3)
     END
  END FoldMult ;
  
--- 4587,4593 ----
  BEGIN
     IF BinaryOperands (quad, op2, op3)
     THEN
!       FoldBinary (tokenno, p, BuildMult, quad, op1, op2, op3)
     END
  END FoldMult ;
  
*************** END CodeModM2Check ;
*** 4478,4488 ****
  
  PROCEDURE BinaryOperandRealFamily (op: CARDINAL) : BOOLEAN ;
  VAR
!    t: CARDINAL ;
  BEGIN
!    t := SkipType(GetType(op)) ;
!    RETURN( IsComplexType(t) OR IsComplexN(t) OR
!            IsRealType(t) OR IsRealN(t) )
  END BinaryOperandRealFamily ;
  
  
--- 4698,4708 ----
  
  PROCEDURE BinaryOperandRealFamily (op: CARDINAL) : BOOLEAN ;
  VAR
!    type: CARDINAL ;
  BEGIN
!    type := GetDType (op) ;
!    RETURN( IsComplexType (type) OR IsComplexN (type) OR
!            IsRealType (type) OR IsRealN (type) )
  END BinaryOperandRealFamily ;
  
  
*************** PROCEDURE FoldModTrunc (tokenno: CARDINA
*** 4596,4602 ****
  BEGIN
     IF BinaryOperands (quad, op2, op3)
     THEN
!       FoldBinary(tokenno, p, BuildModTrunc, quad, op1, op2, op3)
     END
  END FoldModTrunc ;
  
--- 4816,4822 ----
  BEGIN
     IF BinaryOperands (quad, op2, op3)
     THEN
!       FoldBinary (tokenno, p, BuildModTrunc, quad, op1, op2, op3)
     END
  END FoldModTrunc ;
  
*************** PROCEDURE FoldTBitsize  (tokenno: CARDIN
*** 4802,4816 ****
  VAR
     location: location_t ;
  BEGIN
!    location := TokenToLocation(tokenno) ;
!    TryDeclareType (type) ;
!    type := GetDType (type) ;
!    IF CompletelyResolved (type)
     THEN
!       AddModGcc (res, BuildSystemTBitSize (location, Mod2Gcc (type))) ;
!       p (res) ;
!       NoChange := FALSE ;
!       SubQuad (quad)
     END
  END FoldTBitsize ;
  
--- 5022,5048 ----
  VAR
     location: location_t ;
  BEGIN
!    location := TokenToLocation (tokenno) ;
!    IF IsType (type) OR IsVar (type) OR IsConst (type)
     THEN
!       IF GetDType (type) = NulSym
!       THEN
!          MetaErrorT1 (tokenno, 'unknown type in TBITSIZE parameter {%1Ead}', type) ;
!          NoChange := FALSE ;
!          SubQuad (quad)
!       END ;
!       type := GetDType (type)
!    END ;
!    IF type # NulSym
!    THEN
!       TryDeclareType (type) ;
!       IF CompletelyResolved (type)
!       THEN
!          AddModGcc (res, BuildSystemTBitSize (location, Mod2Gcc (type))) ;
!          p (res) ;
!          NoChange := FALSE ;
!          SubQuad (quad)
!       END
     END
  END FoldTBitsize ;
  
*************** END CodeRestorePriority ;
*** 5130,5170 ****
     FoldBinarySet - attempts to fold set arithmetic it removes the quad if successful.
  *)
  
! PROCEDURE FoldBinarySet (tokenno: CARDINAL; p: WalkAction; op: DoProcedure;
                           quad: CARDINAL; op1, op2, op3: CARDINAL) ;
  VAR
     location: location_t ;
  BEGIN
     (* firstly try and ensure that constants are declared *)
!    TryDeclareConstant(tokenno, op2) ;
!    TryDeclareConstant(tokenno, op3) ;
!    location := TokenToLocation(tokenno) ;
  
!    IF GccKnowsAbout(op2) AND GccKnowsAbout(op3)
     THEN
        IF CheckBinaryExpressionTypes (quad, p)
        THEN
!          IF IsConst(op2) AND IsConstSet(op2) AND
!             IsConst(op3) AND IsConstSet(op3) AND
!             IsConst(op1)
           THEN
!             IF IsValueSolved(op2) AND IsValueSolved(op3)
              THEN
!                Assert(MixTypes(FindType(op3), FindType(op2), tokenno)#NulSym) ;
!                PutConst(op1, MixTypes(FindType(op3), FindType(op2), tokenno)) ;
!                PushValue(op2) ;
!                PushValue(op3) ;
!                op(tokenno) ;
!                PopValue(op1) ;
!                PushValue(op1) ;
!                PutConstSet(op1) ;
!                AddModGcc(op1,
!                          DeclareKnownConstant(location,
!                                               Mod2Gcc(GetType(op3)),
!                                               PopSetTree(tokenno))) ;
!                p(op1) ;
                 NoChange := FALSE ;
!                SubQuad(quad)
              END
           END
        END
--- 5362,5402 ----
     FoldBinarySet - attempts to fold set arithmetic it removes the quad if successful.
  *)
  
! PROCEDURE FoldBinarySet (tokenno: CARDINAL; p: WalkAction; op: ProcedureCardinal;
                           quad: CARDINAL; op1, op2, op3: CARDINAL) ;
  VAR
     location: location_t ;
  BEGIN
     (* firstly try and ensure that constants are declared *)
!    TryDeclareConstant (tokenno, op2) ;
!    TryDeclareConstant (tokenno, op3) ;
!    location := TokenToLocation (tokenno) ;
  
!    IF GccKnowsAbout (op2) AND GccKnowsAbout (op3)
     THEN
        IF CheckBinaryExpressionTypes (quad, p)
        THEN
!          IF IsConst (op2) AND IsConstSet (op2) AND
!             IsConst (op3) AND IsConstSet (op3) AND
!             IsConst (op1)
           THEN
!             IF IsValueSolved (op2) AND IsValueSolved (op3)
              THEN
!                Assert (MixTypes (FindType (op3), FindType (op2), tokenno) # NulSym) ;
!                PutConst (op1, MixTypes (FindType (op3), FindType (op2), tokenno)) ;
!                PushValue (op2) ;
!                PushValue (op3) ;
!                op (tokenno) ;
!                PopValue (op1) ;
!                PushValue (op1) ;
!                PutConstSet (op1) ;
!                AddModGcc (op1,
!                           DeclareKnownConstant (location,
! 						Mod2Gcc (GetType (op3)),
! 						PopSetTree (tokenno))) ;
!                p (op1) ;
                 NoChange := FALSE ;
!                SubQuad (quad)
              END
           END
        END
*************** END FoldSetOr ;
*** 5189,5195 ****
  
  PROCEDURE CodeSetOr (quad: CARDINAL) ;
  BEGIN
!    CodeBinarySet (BuildLogicalOr, SetOr, quad)
  END CodeSetOr ;
  
  
--- 5421,5427 ----
  
  PROCEDURE CodeSetOr (quad: CARDINAL) ;
  BEGIN
!    CodeBinarySet (SetOr, BuildLogicalOr, MakeKey ("Or"), quad)
  END CodeSetOr ;
  
  
*************** END CodeSetOr ;
*** 5200,5206 ****
  PROCEDURE FoldSetAnd (tokenno: CARDINAL; p: WalkAction;
                        quad: CARDINAL; op1, op2, op3: CARDINAL) ;
  BEGIN
!    FoldBinarySet(tokenno, p, SetAnd, quad, op1, op2, op3)
  END FoldSetAnd ;
  
  
--- 5432,5438 ----
  PROCEDURE FoldSetAnd (tokenno: CARDINAL; p: WalkAction;
                        quad: CARDINAL; op1, op2, op3: CARDINAL) ;
  BEGIN
!    FoldBinarySet (tokenno, p, SetAnd, quad, op1, op2, op3)
  END FoldSetAnd ;
  
  
*************** END FoldSetAnd ;
*** 5210,5294 ****
  
  PROCEDURE CodeSetAnd (quad: CARDINAL) ;
  BEGIN
!    CodeBinarySet (BuildLogicalAnd, SetAnd, quad)
  END CodeSetAnd ;
  
  
  (*
!    CodeBinarySetShift - encode a binary set arithmetic operation.
!                         The set maybe larger than a machine word
!                         and the value of one word may effect the
!                         values of another - ie shift and rotate.
!                         Set sizes of a word or less are evaluated
!                         with binop, whereas multiword sets are
!                         evaluated by M2RTS.
  *)
  
! PROCEDURE CodeBinarySetShift (binop: BuildSetProcedure;
!                               doOp : DoProcedure;
!                               var, left, right: Name;
!                               quad: CARDINAL;
!                               op1, op2, op3: CARDINAL) ;
  VAR
!    nBits,
!    unbounded,
!    leftproc,
!    rightproc,
!    varproc  : tree ;
     location : location_t ;
  BEGIN
!    (* firstly ensure that constant literals are declared *)
!    DeclareConstant(CurrentQuadToken, op3) ;
!    DeclareConstant(CurrentQuadToken, op2) ;
!    DeclareConstructor(CurrentQuadToken, quad, op3) ;
!    DeclareConstructor(CurrentQuadToken, quad, op2) ;
!    location := TokenToLocation(CurrentQuadToken) ;
  
!    IF IsConst(op1)
     THEN
!       IF IsValueSolved(op2) AND IsValueSolved(op3)
        THEN
!          Assert(MixTypes(FindType(op3),
!                          FindType(op2), CurrentQuadToken)#NulSym) ;
!          PutConst(op1, FindType(op3)) ;
!          PushValue(op2) ;
!          PushValue(op3) ;
!          doOp(CurrentQuadToken) ;
!          PopValue(op1) ;
!          PutConstSet(op1)
        ELSE
!          MetaErrorT0 (CurrentQuadToken, '{%E}constant expression cannot be evaluated')
        END
     ELSE
!       varproc := Mod2Gcc(FromModuleGetSym(CurrentQuadToken, var, System)) ;
!       leftproc := Mod2Gcc(FromModuleGetSym(CurrentQuadToken, left, System)) ;
!       rightproc := Mod2Gcc(FromModuleGetSym(CurrentQuadToken, right, System)) ;
!       unbounded := Mod2Gcc(GetType(GetNthParamAny (FromModuleGetSym(CurrentQuadToken,
!                                                                 var, System), 1))) ;
!       PushValue(GetTypeMax(SkipType(GetType(op1)))) ;
!       PushIntegerTree(BuildConvert(location, GetM2ZType(), PopIntegerTree(), FALSE)) ;
! 
!       PushValue(GetTypeMin(SkipType(GetType(op1)))) ;
!       PushIntegerTree(BuildConvert(location, GetM2ZType(), PopIntegerTree(), FALSE)) ;
!       Sub ;
!       PushCard(1) ;
!       PushIntegerTree(BuildConvert(location, GetM2ZType(), PopIntegerTree(), FALSE)) ;
!       Addn ;
!       nBits := PopIntegerTree() ;
!       BuildBinarySetDo(location,
!                        Mod2Gcc(SkipType(GetType(op1))),
!                        Mod2Gcc(op1),
!                        Mod2Gcc(op2),
!                        Mod2Gcc(op3),
!                        binop,
!                        GetMode(op1)=LeftValue,
!                        GetMode(op2)=LeftValue,
!                        GetMode(op3)=LeftValue,
!                        nBits,
!                        unbounded,
!                        varproc, leftproc, rightproc)
     END
! END CodeBinarySetShift ;
  
  
  (*
--- 5442,5616 ----
  
  PROCEDURE CodeSetAnd (quad: CARDINAL) ;
  BEGIN
!    CodeBinarySet (SetAnd, BuildLogicalAnd, MakeKey ("And"), quad)
  END CodeSetAnd ;
  
  
  (*
!    CalcHighSetBit - calculate the most significant bit used in a set starting from bit zero.
  *)
  
! PROCEDURE CalcHighSetBit (location: location_t; settype: CARDINAL) : tree ;
! BEGIN
!    PushValue (GetTypeMax (SkipType (GetType (settype)))) ;
!    PushIntegerTree (BuildConvert (location, GetM2ZType (), PopIntegerTree (), FALSE)) ;
!    PushValue (GetTypeMin (SkipType (GetType (settype)))) ;
!    PushIntegerTree (BuildConvert (location, GetM2ZType (), PopIntegerTree (), FALSE)) ;
!    Sub ;
!    RETURN PopIntegerTree ()
! END CalcHighSetBit ;
! 
! 
! (*
!    CalcBitsInSet - returns the number of minimum number of bits used to represent a set.
! *)
! 
! PROCEDURE CalcBitsInSet (location: location_t; settype: CARDINAL) : tree ;
! BEGIN
!    PushIntegerTree (BuildConvert (location, GetM2ZType (),
!                                   CalcHighSetBit (location, settype), FALSE)) ;
!    PushCard (1) ;
!    PushIntegerTree (BuildConvert (location, GetM2ZType (), PopIntegerTree (), FALSE)) ;
!    Addn ;
!    RETURN PopIntegerTree ()
! END CalcBitsInSet ;
! 
! 
! (*
!    SetWideSetShiftRotate - generate a call:
!                            M2WIDESET.name (dest, src, HIGHBIT (settype), count).
! *)
! 
! PROCEDURE SetWideSetShiftRotate (tokenno: CARDINAL; name: Name;
!                                  settype, dest, src, count: CARDINAL) ;
  VAR
!    procedure,
!    param1,
!    param2   : CARDINAL ;
!    array1,
!    array2,
!    call,
!    highbit  : tree ;
     location : location_t ;
  BEGIN
!    procedure := FromM2WIDESETImport (tokenno, name) ;
!    location := TokenToLocation (tokenno) ;
!    param1 := GetNthParamAnyClosest (procedure, 1, GetMainModule ()) ;
!    param2 := GetNthParamAnyClosest (procedure, 2, GetMainModule ()) ;
!    array1 := CreateSetArrayParam (location, tokenno, dest, param1) ;
!    array2 := CreateSetArrayParam (location, tokenno, src, param2) ;
!    highbit := CalcHighSetBit (location, settype) ;
!    BuildParam (location, ToCardinal (location, Mod2Gcc (count))) ;  (* Parameter 4.  *)
!    BuildParam (location, ToCardinal (location, highbit)) ;  (* Parameter 3.  *)
!    BuildParam (location, array2) ;  (* Parameter 2.  *)
!    BuildParam (location, array1) ;  (* Parameter 1.  *)
!    call := BuildProcedureCallTree (location, Mod2Gcc (procedure), NIL) ;
!    SetLastFunction (NIL) ;
!    AddStatement (location, call)
! END SetWideSetShiftRotate ;
  
! 
! (*
!    CodeNarrowSetShift -
! *)
! 
! PROCEDURE CodeNarrowSetShift (tokenno: CARDINAL; settype: CARDINAL;
!                               dest, src, count: CARDINAL) ;
! VAR
!    location: location_t ;
!    nbits   : tree ;
! BEGIN
!    location := TokenToLocation (tokenno) ;
!    nbits := CalcBitsInSet (location, settype) ;
!    BuildLogicalShift (location, Mod2Gcc (dest), Mod2Gcc (src), Mod2Gcc (count), nbits, FALSE)
! END CodeNarrowSetShift ;
! 
! 
! (*
!    CodeNarrowSetRotate -
! *)
! 
! PROCEDURE CodeNarrowSetRotate (tokenno: CARDINAL; settype: CARDINAL;
!                                dest, src, count: CARDINAL) ;
! VAR
!    location: location_t ;
!    nbits   : tree ;
! BEGIN
!    location := TokenToLocation (tokenno) ;
!    nbits := CalcBitsInSet (location, settype) ;
!    BuildLogicalRotate (location, Mod2Gcc (dest), Mod2Gcc (src), Mod2Gcc (count), nbits, FALSE)
! END CodeNarrowSetRotate ;
! 
! 
! (*
!    CodeBinarySetShiftRotate - encode a binary set arithmetic operation.
! *)
! 
! PROCEDURE CodeBinarySetShiftRotate (quad: CARDINAL; isshift: BOOLEAN) ;
! VAR
!    op              : QuadOperator ;
!    combined,
!    lastpos, destpos,
!    srcpos, countpos: CARDINAL ;
!    dest, src, count: CARDINAL ;
!    overflowChecking,
!    constExpr       : BOOLEAN ;
!    settype         : CARDINAL ;
! BEGIN
!    GetQuadOtok (quad, lastpos, op, dest, src, count,
!                 overflowChecking, constExpr,
!                 destpos, srcpos, countpos) ;
! 
!    (* Firstly ensure that constant literals are declared.  *)
!    DeclareConstant (countpos, count) ;
!    DeclareConstant (srcpos, src) ;
!    DeclareConstructor (countpos, quad, count) ;
!    DeclareConstructor (srcpos, quad, src) ;
! 
!    IF IsConst (dest)
     THEN
!       combined := MakeVirtual2Tok (srcpos, countpos) ;
!       IF IsValueSolved (src) AND IsValueSolved (count)
        THEN
!          Assert (MixTypes (FindType (count),
!                            FindType (src), combined) # NulSym) ;
!          PutConst (dest, FindType (count)) ;
!          PushValue (src) ;
!          PushValue (count) ;
!          IF isshift
!          THEN
!             SetShift (combined)
!          ELSE
!             SetRotate (combined)
!          END ;
!          PopValue (dest) ;
!          PutConstSet (dest)
        ELSE
!          MetaErrorT0 (combined, '{%E}constant expression cannot be evaluated')
        END
     ELSE
!       combined := MakeVirtualTok (destpos, srcpos, countpos) ;
!       settype := GetDType (dest) ;
!       Assert (IsSet (settype)) ;
!       (* Check for narrow and wide sets and call M2WIDESET if appropriate.  *)
!       IF GetSetInWord (settype)
!       THEN
!          IF isshift
!          THEN
!             CodeNarrowSetShift (combined, settype, dest, src, count)
!          ELSE
!             CodeNarrowSetRotate (combined, settype, dest, src, count)
!          END
!       ELSE
!          IF isshift
!          THEN
!             SetWideSetShiftRotate (combined, MakeKey ('Shift'), settype, dest, src, count)
!          ELSE
!             SetWideSetShiftRotate (combined, MakeKey ('Rotate'), settype, dest, src, count)
!          END
!       END
     END
! END CodeBinarySetShiftRotate ;
  
  
  (*
*************** END CodeBinarySetShift ;
*** 5296,5304 ****
  *)
  
  PROCEDURE FoldSetShift (tokenno: CARDINAL; p: WalkAction;
!                         quad: CARDINAL; op1, op2, op3: CARDINAL) ;
  BEGIN
!    FoldBinarySet(tokenno, p, SetShift, quad, op1, op2, op3)
  END FoldSetShift ;
  
  
--- 5618,5626 ----
  *)
  
  PROCEDURE FoldSetShift (tokenno: CARDINAL; p: WalkAction;
!                         quad: CARDINAL; Dest, Src, ShiftCount: CARDINAL) ;
  BEGIN
!    FoldBinarySet (tokenno, p, SetShift, quad, Dest, Src, ShiftCount)
  END FoldSetShift ;
  
  
*************** END FoldSetShift ;
*** 5306,5319 ****
     CodeSetShift - encode set arithmetic shift.
  *)
  
! PROCEDURE CodeSetShift (quad: CARDINAL; op1, op2, op3: CARDINAL) ;
  BEGIN
!    CodeBinarySetShift (BuildLogicalShift,
!                        SetShift,
!                        MakeKey('ShiftVal'),
!                        MakeKey('ShiftLeft'),
!                        MakeKey('ShiftRight'),
!                        quad, op1, op2, op3)
  END CodeSetShift ;
  
  
--- 5628,5636 ----
     CodeSetShift - encode set arithmetic shift.
  *)
  
! PROCEDURE CodeSetShift (quad: CARDINAL) ;
  BEGIN
!    CodeBinarySetShiftRotate (quad, TRUE)
  END CodeSetShift ;
  
  
*************** END CodeSetShift ;
*** 5322,5330 ****
  *)
  
  PROCEDURE FoldSetRotate (tokenno: CARDINAL; p: WalkAction;
!                         quad: CARDINAL; op1, op2, op3: CARDINAL) ;
  BEGIN
!    FoldBinarySet(tokenno, p, SetRotate, quad, op1, op2, op3)
  END FoldSetRotate ;
  
  
--- 5639,5647 ----
  *)
  
  PROCEDURE FoldSetRotate (tokenno: CARDINAL; p: WalkAction;
!                          quad: CARDINAL; Dest, Src, RotateCount: CARDINAL) ;
  BEGIN
!    FoldBinarySet (tokenno, p, SetRotate, quad, Dest, Src, RotateCount)
  END FoldSetRotate ;
  
  
*************** END FoldSetRotate ;
*** 5332,5345 ****
     CodeSetRotate - encode set arithmetic rotate.
  *)
  
! PROCEDURE CodeSetRotate (quad: CARDINAL; op1, op2, op3: CARDINAL) ;
  BEGIN
!    CodeBinarySetShift (BuildLogicalRotate,
!                        SetRotate,
!                        MakeKey ('RotateVal'),
!                        MakeKey ('RotateLeft'),
!                        MakeKey ('RotateRight'),
!                        quad, op1, op2, op3)
  END CodeSetRotate ;
  
  
--- 5649,5657 ----
     CodeSetRotate - encode set arithmetic rotate.
  *)
  
! PROCEDURE CodeSetRotate (quad: CARDINAL) ;
  BEGIN
!    CodeBinarySetShiftRotate (quad, FALSE)
  END CodeSetRotate ;
  
  
*************** END FoldSetLogicalDifference ;
*** 5362,5368 ****
  
  PROCEDURE CodeSetLogicalDifference (quad: CARDINAL) ;
  BEGIN
!    CodeBinarySet (BuildLogicalDifference, SetDifference, quad)
  END CodeSetLogicalDifference ;
  
  
--- 5674,5681 ----
  
  PROCEDURE CodeSetLogicalDifference (quad: CARDINAL) ;
  BEGIN
!    CodeBinarySet (SetAnd, BuildLogicalDifference,
!                   MakeKey ("LogicalDifference"), quad)
  END CodeSetLogicalDifference ;
  
  
*************** END FoldSymmetricDifference ;
*** 5379,5389 ****
  
  (*
     CodeSetSymmetricDifference - code set difference.
  *)
  
  PROCEDURE CodeSetSymmetricDifference (quad: CARDINAL) ;
  BEGIN
!    CodeBinarySet (BuildSymmetricDifference, SetSymmetricDifference, quad)
  END CodeSetSymmetricDifference ;
  
  
--- 5692,5704 ----
  
  (*
     CodeSetSymmetricDifference - code set difference.
+                                 A logical xor expression.
  *)
  
  PROCEDURE CodeSetSymmetricDifference (quad: CARDINAL) ;
  BEGIN
!    CodeBinarySet (SetSymmetricDifference, BuildSymmetricDifference,
!                   MakeKey ("SymmetricDifference"), quad)
  END CodeSetSymmetricDifference ;
  
  
*************** END CodeSetSymmetricDifference ;
*** 5392,5406 ****
                    Set operands may be longer than a word.
  *)
  
! PROCEDURE CodeUnarySet (unop: BuildUnarySetFunction; constop: DoUnaryProcedure;
                          quad: CARDINAL; result, expr: CARDINAL) ;
  VAR
     location: location_t ;
  BEGIN
!    (* firstly ensure that constant literals are declared *)
!    DeclareConstant (CurrentQuadToken, expr) ;
!    DeclareConstructor (CurrentQuadToken, quad, expr) ;
!    location := TokenToLocation (CurrentQuadToken) ;
  
     IF IsConst (result)
     THEN
--- 5707,5725 ----
                    Set operands may be longer than a word.
  *)
  
! PROCEDURE CodeUnarySet (constop: ProcedureCardinal;
!                         unfunc: UnaryFunction;
!                         tokenno: CARDINAL;
!                         wideprocname: Name;
                          quad: CARDINAL; result, expr: CARDINAL) ;
  VAR
     location: location_t ;
+    settype : CARDINAL ;
  BEGIN
!    (* Firstly ensure that constant literals are declared.  *)
!    DeclareConstant (tokenno, expr) ;
!    DeclareConstructor (tokenno, quad, expr) ;
!    location := TokenToLocation (tokenno) ;
  
     IF IsConst (result)
     THEN
*************** BEGIN
*** 5409,5437 ****
           Assert (FindType (expr) # NulSym) ;
           PutConst (result, FindType (expr)) ;
           PushValue (expr) ;
!          constop (CurrentQuadToken) ;
           PopValue (result) ;
           PushValue (result) ;
           PutConstSet (result) ;
           ConstantKnownAndUsed (result,
!                                DeclareKnownConstant(location,
!                                                     Mod2Gcc (GetType (expr)),
!                                                     PopSetTree (CurrentQuadToken)))
        ELSE
!          MetaErrorT0 (CurrentQuadToken,
                        '{%E}constant expression cannot be evaluated')
        END
     ELSE
        checkDeclare (result) ;
!       BuildUnaryForeachWordDo (location,
!                                Mod2Gcc (GetType (result)), Mod2Gcc (result), Mod2Gcc (expr), unop,
!                                GetMode(result) = LeftValue, GetMode(expr) = LeftValue,
!                                IsConst (result), IsConst (expr))
     END
  END CodeUnarySet ;
  
  
  (*
     FoldIncl - check whether we can fold the InclOp.
                result := result + (1 << expr)
  *)
--- 5728,5890 ----
           Assert (FindType (expr) # NulSym) ;
           PutConst (result, FindType (expr)) ;
           PushValue (expr) ;
!          constop (tokenno) ;
           PopValue (result) ;
           PushValue (result) ;
           PutConstSet (result) ;
           ConstantKnownAndUsed (result,
!                                DeclareKnownConstant (location,
!                                                      Mod2Gcc (GetType (expr)),
!                                                      PopSetTree (tokenno)))
        ELSE
!          MetaErrorT0 (tokenno,
                        '{%E}constant expression cannot be evaluated')
        END
     ELSE
        checkDeclare (result) ;
!       settype := GetLType (result) ;
!       Assert (IsSet (settype)) ;
!       IF GetSetInWord (settype)
!       THEN
!          SetNarrowUnary (location, unfunc, settype, result, expr)
!       ELSE
!          SetWideUnary (tokenno, wideprocname, settype, result, expr)
!       END
     END
  END CodeUnarySet ;
  
  
  (*
+    FromM2WIDESETImport - returns M2WIDESET.name.
+ *)
+ 
+ PROCEDURE FromM2WIDESETImport (tokenno: CARDINAL; name: Name) : CARDINAL ;
+ VAR
+    sym, module: CARDINAL ;
+ BEGIN
+    sym := NulSym ;
+    IF GetWideset ()
+    THEN
+       module := MakeDefinitionSource (tokenno, MakeKey ("M2WIDESET")) ;
+       sym := FromModuleGetSym (tokenno, name, module) ;
+       IF IsUnknown (sym)
+       THEN
+          MetaErrorT2 (tokenno, 'procedure function {%1Aad} is not available from {%2ad}',
+                       sym, module)
+       END
+    ELSE
+       MetaErrorT0 (tokenno, '{%0A}wideset is not available due to -fno-wideset')
+    END ;
+    RETURN sym
+ END FromM2WIDESETImport ;
+ 
+ 
+ (*
+    SetWideUnaryLibrary - call wideprocname (result, expr) passing result and expr
+                          as an array of byte.
+ *)
+ 
+ PROCEDURE SetWideUnaryLibrary (tokenno: CARDINAL;
+                                wideprocname: Name;
+                                settype, result, expr: CARDINAL) ;
+ VAR
+    location : location_t ;
+    procedure,
+    param1,
+    param2   : CARDINAL ;
+    highbit,
+    array1,
+    array2,
+    call     : tree ;
+ BEGIN
+    procedure := FromM2WIDESETImport (tokenno, wideprocname) ;
+    checkDeclare (procedure) ;
+    location := TokenToLocation (tokenno) ;
+    highbit := ToCardinal (location, CalcBitsInSet (location, settype)) ;
+    param1 := GetNthParamAnyClosest (procedure, 1, GetMainModule ()) ;
+    param2 := GetNthParamAnyClosest (procedure, 2, GetMainModule ()) ;
+    array1 := CreateSetArrayParam (location, tokenno, result, param1) ;
+    array2 := CreateSetArrayParam (location, tokenno, expr, param2) ;
+    BuildParam (location, highbit) ;   (* 3rd Parameter.  *)
+    BuildParam (location, array2) ;    (* 2nd Parameter.  *)
+    BuildParam (location, array1) ;    (* 1st Parameter.  *)
+    call := BuildProcedureCallTree (location, Mod2Gcc (procedure), NIL) ;
+    SetLastFunction (NIL) ;
+    AddStatement (location, call)
+ END SetWideUnaryLibrary ;
+ 
+ 
+ (*
+    SetWideUnaryBuiltinNot - build an builtin wideset NOT operation.
+ *)
+ 
+ PROCEDURE SetWideUnaryBuiltinNot (tokenno: CARDINAL; result, expr: CARDINAL) ;
+ VAR
+    location : location_t ;
+    byte,
+    lhs, rhs,
+    index,
+    high     : tree ;
+ BEGIN
+    location := TokenToLocation (tokenno) ;
+    high := ResolveHigh (tokenno, 1, result) ;
+    index := GetIntegerZero (location) ;
+    byte := Mod2Gcc (Byte) ;
+    REPEAT
+       rhs := BuildArray (location, byte, Mod2Gcc (expr),
+                          index, GetIntegerZero (location)) ;
+       rhs := BuildSetNegate (location, rhs) ;
+       rhs := BuildConvert (location, byte, rhs, FALSE) ;
+       lhs := BuildArray (location, byte, Mod2Gcc (result),
+                          index, GetIntegerZero (location)) ;
+       BuildAssignmentStatement (location, lhs, rhs) ;
+       PushIntegerTree (index) ;
+       PushCard (1) ;
+       Addn ;
+       index := PopIntegerTree ()
+    UNTIL CompareTrees (index, high) > 0
+ END SetWideUnaryBuiltinNot ;
+ 
+ 
+ (*
+    SetWideUnary - either call the library wideprocname or the builtin
+                   version depending upon the optimization setting.
+ *)
+ 
+ PROCEDURE SetWideUnary (tokenno: CARDINAL;
+                         wideprocname: Name;
+                         settype, result, expr: CARDINAL) ;
+ BEGIN
+    IF OptimizeSets AND (wideprocname = MakeKey ('Not'))
+    THEN
+       SetWideUnaryBuiltinNot (tokenno, result, expr)
+    ELSE
+       SetWideUnaryLibrary (tokenno, wideprocname, settype, result, expr)
+    END
+ END SetWideUnary ;
+ 
+ 
+ (*
+    SetNarrowUnary - create tree consisting of:
+                     result := unfunc (expr)
+                     result and expr can be lvalues.
+ *)
+ 
+ PROCEDURE SetNarrowUnary (location: location_t; unfunc: UnaryFunction;
+                           settype, result, expr: CARDINAL) ;
+ VAR
+    isResultL,
+    isExprL   : BOOLEAN ;
+ BEGIN
+    isResultL := GetMode (result) = LeftValue ;
+    isExprL := GetMode (expr) = LeftValue ;
+    BuildAssignmentStatement (location, getrvalue (location, result, settype, isResultL),
+                              unfunc (location,
+                                      getrvalue (location, expr, settype, isExprL)))
+ END SetNarrowUnary ;
+ 
+ 
+ (*
     FoldIncl - check whether we can fold the InclOp.
                result := result + (1 << expr)
  *)
*************** BEGIN
*** 5448,5454 ****
           (* fine, we can take advantage of this and fold constants *)
           PushValue (result) ;
           AddBit (tokenno, expr) ;
!          AddModGcc (result, PopSetTree(tokenno)) ;
           p (result) ;
           NoChange := FALSE ;
           SubQuad (quad)
--- 5901,5907 ----
           (* fine, we can take advantage of this and fold constants *)
           PushValue (result) ;
           AddBit (tokenno, expr) ;
!          AddModGcc (result, PopSetTree (tokenno)) ;
           p (result) ;
           NoChange := FALSE ;
           SubQuad (quad)
*************** PROCEDURE FoldIfEqu (tokenno: CARDINAL;
*** 5661,5668 ****
                       left, right, destQuad: CARDINAL) ;
  BEGIN
     (* Firstly ensure that constant literals are declared.  *)
!    TryDeclareConstant(tokenno, left) ;
!    TryDeclareConstant(tokenno, right) ;
     IF IsConst (left) AND IsConst (right)
     THEN
        IF IsValueSolved (left) AND IsValueSolved (right)
--- 6114,6121 ----
                       left, right, destQuad: CARDINAL) ;
  BEGIN
     (* Firstly ensure that constant literals are declared.  *)
!    TryDeclareConstant (tokenno, left) ;
!    TryDeclareConstant (tokenno, right) ;
     IF IsConst (left) AND IsConst (right)
     THEN
        IF IsValueSolved (left) AND IsValueSolved (right)
*************** PROCEDURE FoldIfNotEqu (tokenno: CARDINA
*** 5693,5700 ****
                          left, right, destQuad: CARDINAL) ;
  BEGIN
     (* Firstly ensure that constant literals are declared.  *)
!    TryDeclareConstant(tokenno, left) ;
!    TryDeclareConstant(tokenno, right) ;
     IF IsConst (left) AND IsConst (right)
     THEN
        IF IsValueSolved (left) AND IsValueSolved (right)
--- 6146,6153 ----
                          left, right, destQuad: CARDINAL) ;
  BEGIN
     (* Firstly ensure that constant literals are declared.  *)
!    TryDeclareConstant (tokenno, left) ;
!    TryDeclareConstant (tokenno, right) ;
     IF IsConst (left) AND IsConst (right)
     THEN
        IF IsValueSolved (left) AND IsValueSolved (right)
*************** PROCEDURE GetSetLimits (set: CARDINAL; V
*** 5723,5815 ****
  VAR
     type: CARDINAL ;
  BEGIN
!    type := GetType(set) ;
!    IF IsSubrange(type)
     THEN
!       GetSubrange(type, high, low) ;
     ELSE
!       low := GetTypeMin(type) ;
!       high := GetTypeMax(type)
     END
  END GetSetLimits ;
  
  
  (*
!    GetFieldNo - returns the field number in the, set, which contains, element.
  *)
  
! PROCEDURE GetFieldNo (tokenno: CARDINAL; element: CARDINAL; set: CARDINAL; VAR offset: tree) : INTEGER ;
  VAR
!    low, high, bpw, c: CARDINAL ;
!    location         : location_t ;
  BEGIN
!    location := TokenToLocation(tokenno) ;
!    bpw := GetBitsPerBitset() ;
!    GetSetLimits(set, low, high) ;
  
-    (* check element is legal *)
  
!    PushValue(element) ;
!    PushValue(low) ;
!    IF Less(tokenno)
     THEN
!       (* out of range *)
!       RETURN( -1 )
     ELSE
!       PushValue(element) ;
!       PushValue(high) ;
!       IF Gre(tokenno)
        THEN
!          RETURN( -1 )
        END
!    END ;
  
-    (* all legal *)
  
!    PushValue(low) ;
!    offset := PopIntegerTree() ;
!    c := 0 ;
!    PushValue(element) ;
!    PushValue(low) ;
!    PushIntegerTree(ToCardinal(location, PopIntegerTree())) ;
!    PushCard(bpw) ;
!    PushIntegerTree(ToCardinal(location, PopIntegerTree())) ;
!    Addn ;
!    WHILE GreEqu(tokenno) DO
!       INC(c) ;   (* move onto next field *)
!       PushValue(element) ;
!       PushIntegerTree(ToCardinal(location, PopIntegerTree())) ;
!       PushCard((c+1)*bpw) ;
!       PushValue(low) ;
!       PushIntegerTree(ToCardinal(location, PopIntegerTree())) ;
!       Addn ;
!       PushIntegerTree(offset) ;
!       PushIntegerTree(ToCardinal(location, PopIntegerTree())) ;
!       PushCard(bpw) ;
!       PushIntegerTree(ToCardinal(location, PopIntegerTree())) ;
!       Addn ;
!       offset := PopIntegerTree()
!    END ;
!    RETURN( VAL(INTEGER, c) )
! END GetFieldNo ;
  
  
  (*
     CodeIncl - encode an InclOp:
!               result := result + (1 << expr)
  *)
  
! PROCEDURE CodeIncl (result, expr: CARDINAL) ;
  VAR
!    low,
!    high    : CARDINAL ;
!    offset  : tree ;
!    fieldno : INTEGER ;
!    location: location_t ;
  BEGIN
!    (* firstly ensure that constant literals are declared *)
!    DeclareConstant (CurrentQuadToken, expr) ;
!    location := TokenToLocation (CurrentQuadToken) ;
  
     IF IsConst (result)
     THEN
--- 6176,6431 ----
  VAR
     type: CARDINAL ;
  BEGIN
!    type := GetType (set) ;
!    IF IsSubrange (type)
     THEN
!       GetSubrange (type, high, low) ;
     ELSE
!       low := GetTypeMin (type) ;
!       high := GetTypeMax (type)
     END
  END GetSetLimits ;
  
  
  (*
!    IsElementInRange - returns TRUE if expr references a bit in setvar
!                       which is in the range [low..high].  If expr is a
!                       variable it returns TRUE.  FALSE is returned if we
!                       know expr to be out of bounds.
  *)
  
! PROCEDURE IsElementInRange (tokenno: CARDINAL; settype, setvar, expr: CARDINAL) : BOOLEAN ;
  VAR
!    low,
!    high: CARDINAL ;
  BEGIN
!    IF IsConst (expr)
!    THEN
!       GetSetLimits (settype, low, high) ;
!       PushValue (expr) ;
!       PushValue (high) ;
!       IF Gre (tokenno)
!       THEN
!          MetaErrorT1 (tokenno, 'bit exceeds the range of set {%1Eatd}', setvar) ;
!          RETURN FALSE
!       END ;
!       PushValue (expr) ;
!       PushValue (low) ;
!       IF Less (tokenno)
!       THEN
!          MetaErrorT1 (tokenno, 'bit underflows the range of set {%1Eatd}', setvar) ;
!          RETURN FALSE
!       END
!    END ;
!    RETURN TRUE
! END IsElementInRange ;
  
  
! (*
!    SetElementToBit -
! *)
! 
! PROCEDURE SetElementToBit (location: location_t; settype, expr: CARDINAL) : tree ;
! VAR
!    lowelement, highelement: CARDINAL ;
!    low                    : tree ;
! BEGIN
!    GetSetLimits (settype, lowelement, highelement) ;
!    PushValue (lowelement) ;
!    low := PopIntegerTree () ;
!    RETURN BuildSub (location, ToCardinal (location, Mod2Gcc (expr)),
!                     ToCardinal (location, low), FALSE)
! END SetElementToBit ;
! 
! 
! (*
!    CodeNarrowIncl - result |= (1 << expr).
! *)
! 
! PROCEDURE CodeNarrowIncl (location: location_t; settype, result, expr: CARDINAL) ;
! VAR
!    bit     : tree ;
!    isLvalue: BOOLEAN ;
! BEGIN
!    bit := SetElementToBit (location, settype, expr) ;
!    isLvalue := GetMode (result) = LeftValue ;
!    BuildAssignmentStatement (location, getrvalue (location, result, settype, isLvalue),
!                              ToBitset (location, BuildLogicalOr (location,
!                                                                  getrvalue (location, result, settype, isLvalue),
!                                                                  BuildLSL (location, GetWordOne (location),
!                                                                            bit, FALSE))))
! END CodeNarrowIncl ;
! 
! 
! (*
!    CodeNarrowExcl - result &= (~ (1 << expr)).
! *)
! 
! PROCEDURE CodeNarrowExcl (location: location_t; settype, result, expr: CARDINAL) ;
! VAR
!    bit, mask: tree ;
!    isLvalue : BOOLEAN ;
! BEGIN
!    bit := SetElementToBit (location, settype, expr) ;
!    mask := BuildSetNegate (location,
!                            BuildLSL (location, GetWordOne (location),
!                                      ToWord (location, bit), FALSE)) ;
!    isLvalue := GetMode (result) = LeftValue ;
!    BuildAssignmentStatement (location, getrvalue (location, result, settype, isLvalue),
!                              ToBitset (location, BuildLogicalAnd (location,
!                                                                   getrvalue (location, result, settype, isLvalue),
!                                                                   mask)))
! END CodeNarrowExcl ;
! 
! 
! (*
!    SetWideUnaryBuiltinIncl -
! *)
! 
! PROCEDURE SetWideUnaryBuiltinIncl (location: location_t; dest, bitno: tree) ;
! BEGIN
!    BuildAssignmentStatement (location, dest,
!                              BuildConvert (location, Mod2Gcc (Byte),
!                                            BuildLogicalOr (location,
!                                                            dest,
!                                                            BuildLSL (location, GetWordOne (location),
!                                                                      bitno, FALSE)),
!                                            FALSE))
! END SetWideUnaryBuiltinIncl ;
! 
! 
! (*
!    SetWideUnaryBuiltinExcl -
! *)
! 
! PROCEDURE SetWideUnaryBuiltinExcl (location: location_t; dest, bitno: tree) ;
! VAR
!    mask: tree ;
! BEGIN
!    mask := BuildSetNegate (location,
!                            BuildLSL (location, GetWordOne (location),
!                                      ToWord (location, bitno), FALSE)) ;
!    BuildAssignmentStatement (location, dest,
!                              BuildConvert (location, Mod2Gcc (Byte),
!                                            BuildLogicalAnd (location, dest, mask),
!                                            FALSE))
! END SetWideUnaryBuiltinExcl ;
! 
! 
! (*
!    SetWideUnaryBuiltinIncl -
! *)
! 
! PROCEDURE SetWideUnaryBuiltinInclExcl (tokenno: CARDINAL;
!                                        settype, des, expr: CARDINAL;
!                                        incl: BOOLEAN) ;
! VAR
!    bitsperbyte,
!    byteno,
!    bitno,
!    dest,
!    bit     : tree ;
!    location: location_t ;
! BEGIN
!    location := TokenToLocation (tokenno) ;
!    bit := ToCardinal (location, SetElementToBit (location, settype, expr)) ;
!    bitsperbyte := ToCardinal (location, GetSizeOfInBits (Mod2Gcc (Byte))) ;
!    byteno := BuildDivFloor (location, bit, bitsperbyte, FALSE) ;
!    bitno := BuildModFloor (location, bit, bitsperbyte, FALSE) ;
!    dest := BuildArray (location, Mod2Gcc (Byte),
!                        getrvalue (location, des, GetType (des),
!                                   GetMode (des) = LeftValue),
!                        byteno, GetIntegerZero (location)) ;
!    IF incl
     THEN
!       SetWideUnaryBuiltinIncl (location, dest, bitno)
     ELSE
!       SetWideUnaryBuiltinExcl (location, dest, bitno)
!    END
! END SetWideUnaryBuiltinInclExcl ;
! 
! 
! (*
!    SetWideInclExcl - generates M2WIDESET.procedurename (result, expr).
! *)
! 
! PROCEDURE SetWideInclExcl (tokenno: CARDINAL; settype, result, expr: CARDINAL;
!                            procedurename: Name) ;
! BEGIN
!    IF OptimizeSets
!    THEN
!       IF procedurename = MakeKey ('Incl')
        THEN
!          SetWideUnaryBuiltinInclExcl (tokenno, settype, result, expr, TRUE)
!       ELSIF procedurename = MakeKey ('Excl')
!       THEN
!          SetWideUnaryBuiltinInclExcl (tokenno, settype, result, expr, FALSE)
!       ELSE
!          InternalError ('expecting Incl or Excl procedure')
        END
!    ELSE
!       SetWideInclExclLibrary (tokenno, settype, result, expr, procedurename)
!    END
! END SetWideInclExcl ;
  
  
! (*
!    SetWideInclExclLibrary -
! *)
! 
! PROCEDURE SetWideInclExclLibrary (tokenno: CARDINAL; settype, result, expr: CARDINAL;
!                                   procedurename: Name) ;
! VAR
!    location : location_t ;
!    procedure,
!    setparam : CARDINAL ;
!    highbit,
!    bit,
!    setarray,
!    call     : tree ;
! BEGIN
!    procedure := FromM2WIDESETImport (tokenno, procedurename) ;
!    location := TokenToLocation (tokenno) ;
!    bit := SetElementToBit (location, settype, expr) ;
!    highbit := ToCardinal (location, CalcBitsInSet (location, settype)) ;
!    setparam := GetNthParamAnyClosest (procedure, 1, GetMainModule ()) ;
!    setarray := CreateSetArrayParam (location, tokenno, result, setparam) ;
!    BuildParam (location, highbit) ;                      (* 3rd Parameter.  *)
!    BuildParam (location, ToCardinal (location, bit)) ;   (* 2nd Parameter.  *)
!    BuildParam (location, setarray) ;                     (* 1st Parameter.  *)
!    call := BuildProcedureCallTree (location, Mod2Gcc (procedure), NIL) ;
!    SetLastFunction (NIL) ;
!    AddStatement (location, call)
! END SetWideInclExclLibrary ;
  
  
  (*
     CodeIncl - encode an InclOp:
!               result |= (1 << expr).
  *)
  
! PROCEDURE CodeIncl (quad: CARDINAL) ;
  VAR
!    overflow,
!    constExpr   : BOOLEAN ;
!    op          : QuadOperator ;
!    tokenno     : CARDINAL;
!    result, expr: CARDINAL;
!    settype     : CARDINAL ;
!    nooperand   : CARDINAL ;
!    nopos       : CARDINAL ;
!    location    : location_t ;
  BEGIN
!    GetQuadOtok (quad, tokenno, op,
!                 result, nooperand, expr,
!                 overflow, constExpr,
!                 nopos, nopos, nopos) ;
!    (* Firstly ensure that constant literals are declared *)
!    DeclareConstant (tokenno, expr) ;
!    location := TokenToLocation (tokenno) ;
!    checkDeclare (result) ;
!    settype := GetLType (result) ;
!    Assert (IsSet (settype)) ;
  
     IF IsConst (result)
     THEN
*************** BEGIN
*** 5820,5846 ****
           InternalError ('should not get to here (why are we generating <incl const, var> ?)')
        END
     ELSE
!       IF IsConst (expr)
        THEN
!          fieldno := GetFieldNo (CurrentQuadToken, expr, GetType (result), offset) ;
!          IF fieldno >= 0
           THEN
!             PushValue (expr) ;
!             PushIntegerTree (offset) ;
!             Sub ;
!             BuildIncludeVarConst (location,
!                                   Mod2Gcc (GetType (result)),
!                                   Mod2Gcc (result),
!                                   PopIntegerTree (),
!                                   GetMode (result) = LeftValue, fieldno)
           ELSE
!             MetaErrorT1 (CurrentQuadToken, 'bit exceeded the range of set {%1Eatd}', result)
           END
-       ELSE
-          GetSetLimits (GetType (result), low, high) ;
-          BuildIncludeVarVar (location,
-                              Mod2Gcc (GetType(result)),
-                              Mod2Gcc (result), Mod2Gcc(expr), GetMode(result) = LeftValue, Mod2Gcc (low))
        END
     END
  END CodeIncl ;
--- 6436,6449 ----
           InternalError ('should not get to here (why are we generating <incl const, var> ?)')
        END
     ELSE
!       IF IsElementInRange (tokenno, settype, result, expr)
        THEN
!          IF GetSetInWord (settype)
           THEN
!             CodeNarrowIncl (location, settype, result, expr)
           ELSE
!             SetWideInclExcl (tokenno, settype, result, expr, MakeKey ("Incl"))
           END
        END
     END
  END CodeIncl ;
*************** END CodeIncl ;
*** 5848,5860 ****
  
  (*
     FoldExcl - check whether we can fold the InclOp.
!               op1 := op1 - (1 << op3)
  *)
  
  PROCEDURE FoldExcl (tokenno: CARDINAL; p: WalkAction;
                      quad: CARDINAL; result, expr: CARDINAL) ;
  BEGIN
!    (* firstly ensure that constant literals are declared *)
     TryDeclareConstant (tokenno, expr) ;
     IF IsConst (result) AND IsConst (expr)
     THEN
--- 6451,6463 ----
  
  (*
     FoldExcl - check whether we can fold the InclOp.
!               result &= ~ (1 << expr).
  *)
  
  PROCEDURE FoldExcl (tokenno: CARDINAL; p: WalkAction;
                      quad: CARDINAL; result, expr: CARDINAL) ;
  BEGIN
!    (* Firstly ensure that constant literals are declared *)
     TryDeclareConstant (tokenno, expr) ;
     IF IsConst (result) AND IsConst (expr)
     THEN
*************** END FoldExcl ;
*** 5873,5917 ****
  
  (*
     CodeExcl - encode an ExclOp:
!               result := result - (1 << expr)
  *)
  
! PROCEDURE CodeExcl (result, expr: CARDINAL) ;
  VAR
!    low,
!    high    : CARDINAL ;
!    offset  : tree ;
!    fieldno : INTEGER ;
!    location: location_t ;
  BEGIN
!    (* firstly ensure that constant literals are declared *)
!    DeclareConstant (CurrentQuadToken, expr) ;
!    location := TokenToLocation(CurrentQuadToken) ;
  
     IF IsConst (result)
     THEN
-       InternalError ('should not get to here (if we do we should consider calling FoldInclOp)')
-    ELSE
        IF IsConst (expr)
        THEN
!          fieldno := GetFieldNo (CurrentQuadToken, expr, GetType (result), offset) ;
!          IF fieldno >= 0
           THEN
!             PushValue (expr) ;
!             PushIntegerTree (offset) ;
!             Sub ;
!             BuildExcludeVarConst (location,
!                                   Mod2Gcc (GetType (result)),
!                                   Mod2Gcc (result), PopIntegerTree (),
!                                   GetMode (result)=LeftValue, fieldno)
           ELSE
!             MetaErrorT1 (CurrentQuadToken, 'bit exceeded the range of set {%1Eatd}', result)
           END
-       ELSE
-          GetSetLimits (GetType (result), low, high) ;
-          BuildExcludeVarVar (location,
-                              Mod2Gcc (GetType(result)),
-                              Mod2Gcc (result), Mod2Gcc(expr), GetMode(result) = LeftValue, Mod2Gcc (low))
        END
     END
  END CodeExcl ;
--- 6476,6524 ----
  
  (*
     CodeExcl - encode an ExclOp:
!               result &= (~ (1 << expr)).
  *)
  
! PROCEDURE CodeExcl (quad: CARDINAL) ;
  VAR
!    overflow,
!    constExpr   : BOOLEAN ;
!    op          : QuadOperator ;
!    tokenno     : CARDINAL;
!    result, expr: CARDINAL;
!    settype     : CARDINAL ;
!    nooperand   : CARDINAL ;
!    nopos       : CARDINAL ;
!    location    : location_t ;
  BEGIN
!    GetQuadOtok (quad, tokenno, op,
!                 result, nooperand, expr,
!                 overflow, constExpr,
!                 nopos, nopos, nopos) ;
!    (* Firstly ensure that constant literals are declared *)
!    DeclareConstant (tokenno, expr) ;
!    location := TokenToLocation (tokenno) ;
!    checkDeclare (result) ;
!    settype := GetLType (result) ;
!    Assert (IsSet (settype)) ;
  
     IF IsConst (result)
     THEN
        IF IsConst (expr)
        THEN
!          InternalError ('this quadruple should have been removed by FoldExcl')
!       ELSE
!          InternalError ('should not get to here (why are we generating <excl const, var> ?)')
!       END
!    ELSE
!       IF IsElementInRange (tokenno, settype, result, expr)
!       THEN
!          IF GetSetInWord (settype)
           THEN
!             CodeNarrowExcl (location, settype, result, expr)
           ELSE
!             SetWideInclExcl (tokenno, settype, result, expr, MakeKey ("Excl"))
           END
        END
     END
  END CodeExcl ;
*************** END FoldUnary ;
*** 5978,5984 ****
     FoldUnarySet - check whether we can fold the doOp operation.
  *)
  
! PROCEDURE FoldUnarySet (tokenno: CARDINAL; p: WalkAction; doOp: DoUnaryProcedure;
                          quad: CARDINAL; result, expr: CARDINAL) ;
  VAR
     location: location_t ;
--- 6585,6591 ----
     FoldUnarySet - check whether we can fold the doOp operation.
  *)
  
! PROCEDURE FoldUnarySet (tokenno: CARDINAL; p: WalkAction; doOp: ProcedureCardinal;
                          quad: CARDINAL; result, expr: CARDINAL) ;
  VAR
     location: location_t ;
*************** END FoldNegate ;
*** 6120,6137 ****
                         is required.
  *)
  
! PROCEDURE CodeNegateChecked (quad: CARDINAL; op1, op3: CARDINAL) ;
  BEGIN
!    IF IsConstSet (op3) OR IsSet (GetType (op3))
     THEN
!       CodeUnarySet (BuildSetNegate, SetNegate, quad, op1, op3)
!    ELSIF UnaryOperand (quad, op3)
     THEN
        IF MustCheckOverflow (quad)
        THEN
!          CodeUnaryCheck (BuildNegateCheck, NIL, quad, op1, op3)
        ELSE
!          CodeUnary (BuildNegate, NIL, quad, op1, op3)
        END
     END
  END CodeNegateChecked ;
--- 6727,6758 ----
                         is required.
  *)
  
! PROCEDURE CodeNegateChecked (quad: CARDINAL) ;
! VAR
!    operatorpos,
!    resultpos,
!    nopos, exprpos,
!    result, noop,
!    expr            : CARDINAL ;
!    typeChecking,
!    constExpr,
!    overflowChecking: BOOLEAN ;
!    op              : QuadOperator ;
  BEGIN
!    GetQuadOTypetok (quad, operatorpos, op,
!                     result, noop, expr,
!                     overflowChecking, typeChecking, constExpr,
!                     resultpos, nopos, exprpos) ;
!    IF IsConstSet (expr) OR IsSet (GetType (expr))
     THEN
!       CodeUnarySet (SetNegate, BuildSetNegate, operatorpos, MakeKey ('Not'), quad, result, expr)
!    ELSIF UnaryOperand (quad, expr)
     THEN
        IF MustCheckOverflow (quad)
        THEN
!          CodeUnaryCheck (BuildNegateCheck, NIL, quad, result, expr)
        ELSE
!          CodeUnary (BuildNegate, NIL, quad, result, expr)
        END
     END
  END CodeNegateChecked ;
*************** END BuildHighFromArray ;
*** 6346,6351 ****
--- 6967,6985 ----
  
  
  (*
+    BuildHighFromSetArray -
+ *)
+ 
+ PROCEDURE BuildHighFromSetArray (tokenno: CARDINAL; settype: CARDINAL) : tree ;
+ VAR
+    location: location_t ;
+ BEGIN
+    location := TokenToLocation (tokenno) ;
+    RETURN BuildHighFromStaticArray (location, GetSetArray (settype))
+ END BuildHighFromSetArray ;
+ 
+ 
+ (*
     BuildHighFromStaticArray -
  *)
  
*************** VAR
*** 6414,6439 ****
     Type    : CARDINAL ;
     location: location_t ;
  BEGIN
!    Type := SkipType(GetType(operand)) ;
!    location := TokenToLocation(tokenno) ;
  
     IF (Type=Char) AND (dim=1)
     THEN
!       RETURN( BuildHighFromChar(operand) )
     ELSIF IsConstString(operand) AND (dim=1)
     THEN
!       RETURN( BuildHighFromString(operand) )
     ELSIF IsArray(Type)
     THEN
!       RETURN( BuildHighFromArray(tokenno, dim, operand) )
!    ELSIF IsUnbounded(Type)
     THEN
!       RETURN( GetHighFromUnbounded(location, dim, operand) )
     ELSE
        MetaErrorT1 (tokenno,
                     'base procedure HIGH expects a variable of type array or a constant string or CHAR as its parameter, rather than {%1Etad}',
                     operand) ;
!       RETURN( GetIntegerZero(location) )
     END
  END ResolveHigh ;
  
--- 7048,7076 ----
     Type    : CARDINAL ;
     location: location_t ;
  BEGIN
!    Type := SkipType (GetType (operand)) ;
!    location := TokenToLocation (tokenno) ;
  
     IF (Type=Char) AND (dim=1)
     THEN
!       RETURN( BuildHighFromChar (operand) )
     ELSIF IsConstString(operand) AND (dim=1)
     THEN
!       RETURN( BuildHighFromString (operand) )
     ELSIF IsArray(Type)
     THEN
!       RETURN( BuildHighFromArray (tokenno, dim, operand) )
!    ELSIF IsSet (Type)
     THEN
!       RETURN( BuildHighFromSetArray (tokenno, Type) )
!    ELSIF IsUnbounded (Type)
!    THEN
!       RETURN( GetHighFromUnbounded (location, dim, operand) )
     ELSE
        MetaErrorT1 (tokenno,
                     'base procedure HIGH expects a variable of type array or a constant string or CHAR as its parameter, rather than {%1Etad}',
                     operand) ;
!       RETURN( GetIntegerZero (location) )
     END
  END ResolveHigh ;
  
*************** VAR
*** 6500,6510 ****
  BEGIN
     location := TokenToLocation (CurrentQuadToken) ;
  
!    (* firstly ensure that any constant literal is declared *)
     DeclareConstant (CurrentQuadToken, array) ;
     IF IsConst (result)
     THEN
!       (* still have a constant which was not resolved, pass it to gcc *)
        ConstantKnownAndUsed (result,
                              DeclareKnownConstant(location,
                                                   GetM2ZType (),
--- 7137,7147 ----
  BEGIN
     location := TokenToLocation (CurrentQuadToken) ;
  
!    (* Firstly ensure that any constant literal is declared.  *)
     DeclareConstant (CurrentQuadToken, array) ;
     IF IsConst (result)
     THEN
!       (* Still have a constant which was not resolved, pass it to gcc.  *)
        ConstantKnownAndUsed (result,
                              DeclareKnownConstant(location,
                                                   GetM2ZType (),
*************** END CodeHigh ;
*** 6522,6528 ****
  
  (*
     CodeUnbounded - codes the creation of an unbounded parameter variable.
!                    places the address of op3 into *op1
  *)
  
  PROCEDURE CodeUnbounded (result, array: CARDINAL) ;
--- 7159,7165 ----
  
  (*
     CodeUnbounded - codes the creation of an unbounded parameter variable.
!                    result = &array.  array can be an lvalue or rvalue.
  *)
  
  PROCEDURE CodeUnbounded (result, array: CARDINAL) ;
*************** BEGIN
*** 6535,6557 ****
     DeclareConstant (CurrentQuadToken, array) ;
     IF IsConstString (array) OR (IsConst (array) AND (GetSType (array) = Char))
     THEN
!       BuildAssignmentStatement (location, Mod2Gcc (result), BuildAddr (location, PromoteToString (CurrentQuadToken, array), FALSE))
     ELSIF IsConstructor (array)
     THEN
!       BuildAssignmentStatement (location, Mod2Gcc (result), BuildAddr (location, Mod2Gcc (array), TRUE))
     ELSIF IsUnbounded (GetType (array))
     THEN
        IF GetMode(array) = LeftValue
        THEN
           Addr := BuildConvert (location, Mod2Gcc (GetType (result)), Mod2Gcc (array), FALSE)
        ELSE
           Addr := BuildComponentRef (location, Mod2Gcc (array), Mod2Gcc (GetUnboundedAddressOffset (GetType (array))))
        END ;
        BuildAssignmentStatement (location, Mod2Gcc (result), Addr)
!    ELSIF GetMode(array) = RightValue
     THEN
!       BuildAssignmentStatement (location, Mod2Gcc (result), BuildAddr (location, Mod2Gcc (array), FALSE))
     ELSE
        BuildAssignmentStatement (location, Mod2Gcc (result), Mod2Gcc (array))
     END
  END CodeUnbounded ;
--- 7172,7202 ----
     DeclareConstant (CurrentQuadToken, array) ;
     IF IsConstString (array) OR (IsConst (array) AND (GetSType (array) = Char))
     THEN
!       BuildAssignmentStatement (location, Mod2Gcc (result),
!                                 BuildAddr (location, PromoteToString (CurrentQuadToken, array), FALSE))
     ELSIF IsConstructor (array)
     THEN
!       BuildAssignmentStatement (location, Mod2Gcc (result),
!                                 BuildAddr (location, Mod2Gcc (array), TRUE))
     ELSIF IsUnbounded (GetType (array))
     THEN
        IF GetMode(array) = LeftValue
        THEN
+          (* We already have the address of the array, convert it to type of result.  *)
           Addr := BuildConvert (location, Mod2Gcc (GetType (result)), Mod2Gcc (array), FALSE)
        ELSE
+          (* Access the address field from the unbounded record.  *)
           Addr := BuildComponentRef (location, Mod2Gcc (array), Mod2Gcc (GetUnboundedAddressOffset (GetType (array))))
        END ;
+       (* Store address in result.  *)
        BuildAssignmentStatement (location, Mod2Gcc (result), Addr)
!    ELSIF GetMode (array) = RightValue
     THEN
!       (* Static array, get the address and store into result.  *)
!       BuildAssignmentStatement (location, Mod2Gcc (result),
!                                 BuildAddr (location, Mod2Gcc (array), FALSE))
     ELSE
+       (* Static array which is a left value, just copy the address into result.  *)
        BuildAssignmentStatement (location, Mod2Gcc (result), Mod2Gcc (array))
     END
  END CodeUnbounded ;
*************** VAR
*** 6866,6874 ****
     tl, tr  : tree ;
     location: location_t ;
  BEGIN
!    CheckStop(quad) ;
! 
!    (* firstly ensure that constant literals are declared *)
     DeclareConstant(CurrentQuadToken, rhs) ;
     DeclareConstructor(CurrentQuadToken, quad, rhs) ;
     location := TokenToLocation(CurrentQuadToken) ;
--- 7511,7517 ----
     tl, tr  : tree ;
     location: location_t ;
  BEGIN
!    (* Firstly ensure that constant literals are declared.  *)
     DeclareConstant(CurrentQuadToken, rhs) ;
     DeclareConstructor(CurrentQuadToken, quad, rhs) ;
     location := TokenToLocation(CurrentQuadToken) ;
*************** BEGIN
*** 6876,6895 ****
     tl := LValueToGenericPtr(location, type) ;
     IF IsProcedure(rhs)
     THEN
!       tr := BuildAddr(location, Mod2Gcc(rhs), FALSE)
     ELSE
        tr := LValueToGenericPtr(location, rhs) ;
        tr := ConvertRHS(tr, type, rhs)
     END ;
     IF IsConst(lhs)
     THEN
!       (* fine, we can take advantage of this and fold constant *)
        PutConst(lhs, type) ;
        tl := Mod2Gcc(SkipType(type)) ;
        ConstantKnownAndUsed (lhs,
                              BuildConvert (location, tl, Mod2Gcc (rhs), TRUE))
     ELSE
!       BuildAssignmentStatement (location, Mod2Gcc (lhs), BuildConvert (location, tl, tr, TRUE)) ;
     END
  END CodeConvert ;
  
--- 7519,7538 ----
     tl := LValueToGenericPtr(location, type) ;
     IF IsProcedure(rhs)
     THEN
!       tr := BuildAddr (location, Mod2Gcc (rhs), FALSE)
     ELSE
        tr := LValueToGenericPtr(location, rhs) ;
        tr := ConvertRHS(tr, type, rhs)
     END ;
     IF IsConst(lhs)
     THEN
!       (* Fine, we can take advantage of this and fold constant.  *)
        PutConst(lhs, type) ;
        tl := Mod2Gcc(SkipType(type)) ;
        ConstantKnownAndUsed (lhs,
                              BuildConvert (location, tl, Mod2Gcc (rhs), TRUE))
     ELSE
!       BuildAssignmentStatement (location, Mod2Gcc (lhs), BuildConvert (location, tl, tr, TRUE))
     END
  END CodeConvert ;
  
*************** END CreateLabelProcedureN ;
*** 7115,7121 ****
  
  PROCEDURE CreateLabelName (q: CARDINAL) : String ;
  BEGIN
!    (* prefixed by . to ensure that no Modula-2 identifiers clash *)
     RETURN( Sprintf1(Mark(InitString('.L%d')), q) )
  END CreateLabelName ;
  
--- 7758,7764 ----
  
  PROCEDURE CreateLabelName (q: CARDINAL) : String ;
  BEGIN
!    (* Prefixed by . to ensure that no Modula-2 identifiers clash *)
     RETURN( Sprintf1(Mark(InitString('.L%d')), q) )
  END CreateLabelName ;
  
*************** VAR
*** 7142,7204 ****
     location: location_t ;
  BEGIN
     location := TokenToLocation(CurrentQuadToken) ;
! 
!    (* we do not create labels for procedure entries *)
!    IF (op#ProcedureScopeOp) AND (op#NewLocalVarOp) AND IsReferenced(quad)
     THEN
!       DeclareLabel(location, string(CreateLabelName(quad)))
     END
  END CheckReferenced ;
  
  
  (*
!    CodeIfSetLess -
  *)
  
! PROCEDURE CodeIfSetLess (quad: CARDINAL; op1, op2, op3: CARDINAL) ;
  VAR
!    settype   : CARDINAL ;
!    falselabel: ADDRESS ;
!    location  : location_t ;
  BEGIN
!    location := TokenToLocation(CurrentQuadToken) ;
! 
!    IF IsConst(op1) AND IsConst(op2)
     THEN
        InternalError ('this should have been folded in the calling procedure')
!    ELSIF IsConst(op1)
     THEN
!       settype := SkipType(GetType(op2))
     ELSE
!       settype := SkipType(GetType(op1))
     END ;
!    IF CompareTrees(FindSize(CurrentQuadToken, settype), FindSize(CurrentQuadToken, Word)) <= 0
     THEN
!       (* word size sets *)
!       DoJump(location,
!              BuildIsNotSuperset(location,
!                                 BuildConvert(location, GetWordType(), Mod2Gcc(op1), FALSE),
!                                 BuildConvert(location, GetWordType(), Mod2Gcc(op2), FALSE)),
!              NIL, string(CreateLabelName(op3)))
     ELSE
!       falselabel := string(Sprintf1(Mark(InitString('.Lset%dcomp')), quad)) ;
  
-       BuildForeachWordInSetDoIfExpr(location,
-                                     Mod2Gcc(settype),
-                                     Mod2Gcc(op1), Mod2Gcc(op2),
-                                     GetMode(op1)=LeftValue,
-                                     GetMode(op2)=LeftValue,
-                                     IsConst(op1), IsConst(op2),
-                                     BuildIsSuperset,
-                                     falselabel) ;
  
!       BuildGoto(location, string(CreateLabelName(op3))) ;
!       DeclareLabel(location, falselabel)
!    END
  END CodeIfSetLess ;
  
  
  (*
     PerformCodeIfLess - codes the quadruple if op1 < op2 then goto op3
  *)
  
--- 7785,7881 ----
     location: location_t ;
  BEGIN
     location := TokenToLocation(CurrentQuadToken) ;
!    (* We do not create labels for procedure entries.  *)
!    IF (op # ProcedureScopeOp) AND (op # NewLocalVarOp) AND IsReferenced (quad)
     THEN
!       DeclareLabel (location, string (CreateLabelName (quad)))
     END
  END CheckReferenced ;
  
  
  (*
!    CodeIfSetCondition - code IF left cond right then destquad for set types.
  *)
  
! PROCEDURE CodeIfSetCondition (tokenno: CARDINAL;
!                               left, right, destquad: CARDINAL;
!                               cond: BinaryFunction; procedurename: Name) ;
  VAR
!    settype : CARDINAL ;
!    location: location_t ;
!    expr    : tree ;
  BEGIN
!    location := TokenToLocation (tokenno) ;
!    IF IsConst (left) AND IsConst (right)
     THEN
        InternalError ('this should have been folded in the calling procedure')
!    ELSIF IsConst(left)
     THEN
!       settype := SkipType (GetType (right))
     ELSE
!       settype := SkipType (GetType (left))
     END ;
!    IF GetSetInWord (settype)
     THEN
!       (* WORD size sets.  *)
!       expr := cond (location,
!                     BuildConvert (location, GetWordType (),
!                                   Mod2Gcc (left), FALSE),
!                     BuildConvert (location, GetWordType (),
!                                   Mod2Gcc (right), FALSE))
     ELSE
!       expr := CallSetWideBoolFunction (location, tokenno,
!                                        procedurename, settype, left, right)
!    END ;
!    IfExprJump (location, expr, string (CreateLabelName (destquad)))
! END CodeIfSetCondition ;
  
  
! (*
!    CodeIfSetLess - code IF left < right then destquad for set types.
! *)
! 
! PROCEDURE CodeIfSetLess (tokenno: CARDINAL; left, right, destquad: CARDINAL) ;
! BEGIN
!    CodeIfSetCondition (tokenno, left, right, destquad,
!                        BuildIsSubset, MakeKey ("Less"))
  END CodeIfSetLess ;
  
  
  (*
+    CodeIfSetLessEqu - code IF left <= right then destquad for set types.
+ *)
+ 
+ PROCEDURE CodeIfSetLessEqu (tokenno: CARDINAL; left, right, destquad: CARDINAL) ;
+ BEGIN
+    CodeIfSetCondition (tokenno, left, right, destquad,
+                        BuildIsSubset, MakeKey ("LessEqu"))
+ END CodeIfSetLessEqu ;
+ 
+ 
+ (*
+    CodeIfSetGre - code IF left > right then destquad for set types.
+ *)
+ 
+ PROCEDURE CodeIfSetGre (tokenno: CARDINAL; left, right, destquad: CARDINAL) ;
+ BEGIN
+    CodeIfSetCondition (tokenno, left, right, destquad,
+                        BuildIsNotSubset, MakeKey ("Gre"))
+ END CodeIfSetGre ;
+ 
+ 
+ (*
+    CodeIfSetGreEqu - code IF left >= right then destquad for set types.
+ *)
+ 
+ PROCEDURE CodeIfSetGreEqu (tokenno: CARDINAL; left, right, destquad: CARDINAL) ;
+ BEGIN
+    CodeIfSetCondition (tokenno, left, right, destquad,
+                        BuildIsNotSubset, MakeKey ("GreEqu"))
+ END CodeIfSetGreEqu ;
+ 
+ 
+ (*
     PerformCodeIfLess - codes the quadruple if op1 < op2 then goto op3
  *)
  
*************** BEGIN
*** 7230,7236 ****
     ELSIF IsConstSet(left) OR (IsVar(left) AND IsSet(SkipType(GetType(left)))) OR
           IsConstSet(right) OR (IsVar(right) AND IsSet(SkipType(GetType(right))))
     THEN
!       CodeIfSetLess(quad, left, right, dest)
     ELSE
        IF IsComposite(GetType(left)) OR IsComposite(GetType(right))
        THEN
--- 7907,7913 ----
     ELSIF IsConstSet(left) OR (IsVar(left) AND IsSet(SkipType(GetType(left)))) OR
           IsConstSet(right) OR (IsVar(right) AND IsSet(SkipType(GetType(right))))
     THEN
!       CodeIfSetLess (combined, left, right, dest)
     ELSE
        IF IsComposite(GetType(left)) OR IsComposite(GetType(right))
        THEN
*************** BEGIN
*** 7245,7252 ****
                                                      SkipType (GetType (right)),
                                                      combined),
                                  left, right) ;
!          DoJump (location,
!                  BuildLessThan (location, tl, tr), NIL, string (CreateLabelName (dest)))
        END
     END
  END PerformCodeIfLess ;
--- 7922,7929 ----
                                                      SkipType (GetType (right)),
                                                      combined),
                                  left, right) ;
!          IfExprJump (location,
!                      BuildLessThan(location, tl, tr), string(CreateLabelName (dest)))
        END
     END
  END PerformCodeIfLess ;
*************** END CodeIfLess ;
*** 7266,7315 ****
  
  
  (*
!    CodeIfSetGre -
  *)
  
! PROCEDURE CodeIfSetGre (quad: CARDINAL; op1, op2, op3: CARDINAL) ;
  VAR
!    settype   : CARDINAL ;
!    falselabel: ADDRESS ;
!    location  : location_t ;
  BEGIN
!    location := TokenToLocation(CurrentQuadToken) ;
  
!    IF IsConst(op1) AND IsConst(op2)
     THEN
!       InternalError ('this should have been folded in the calling procedure')
!    ELSIF IsConst(op1)
     THEN
!       settype := SkipType(GetType(op2))
     ELSE
!       settype := SkipType(GetType(op1))
     END ;
!    IF CompareTrees(FindSize(CurrentQuadToken, settype), FindSize(CurrentQuadToken, Word)) <= 0
     THEN
!       (* word size sets *)
!       DoJump(location,
!              BuildIsNotSubset(location,
!                               BuildConvert(location, GetWordType(), Mod2Gcc(op1), FALSE),
!                               BuildConvert(location, GetWordType(), Mod2Gcc(op2), FALSE)),
!              NIL, string(CreateLabelName(op3)))
     ELSE
!       falselabel := string(Sprintf1(Mark(InitString('.Lset%dcomp')), quad)) ;
  
-       BuildForeachWordInSetDoIfExpr(location,
-                                     Mod2Gcc(settype),
-                                     Mod2Gcc(op1), Mod2Gcc(op2),
-                                     GetMode(op1)=LeftValue,
-                                     GetMode(op2)=LeftValue,
-                                     IsConst(op1), IsConst(op2),
-                                     BuildIsSubset,
-                                     falselabel) ;
  
!       BuildGoto(location, string(CreateLabelName(op3))) ;
!       DeclareLabel(location, falselabel)
!    END
! END CodeIfSetGre ;
  
  
  (*
--- 7943,8093 ----
  
  
  (*
!    CodeIfSetEquNarrow -
  *)
  
! PROCEDURE CodeIfSetEquNarrow (location: location_t; invertCondition: BOOLEAN;
!                               settype: CARDINAL; left, right: tree;
!                               destQuad: CARDINAL) ;
  VAR
!    condition,
!    mask     : tree ;
  BEGIN
!    (* The set type fits inside a word, so mask off any unused bits.  *)
!    mask := BuildMask (location, CalcBitsInSet (location, settype), FALSE) ;
!    left := BuildLogicalAnd (location, left, mask) ;
!    right := BuildLogicalAnd (location, right, mask) ;
!    IF invertCondition
!    THEN
!       condition := BuildNotEqualTo (location, left, right)
!    ELSE
!       condition := BuildEqualTo (location, left, right)
!    END ;
!    IfExprJump (location, condition,
!                string (CreateLabelName (destQuad)))
! END CodeIfSetEquNarrow ;
  
! 
! (*
!    CallSetWideBoolFunction - return a tree containing a call to
!                              M2WIDESET.widefuncname (left, right, HIGHBIT (settype)).
! *)
! 
! PROCEDURE CallSetWideBoolFunction (location: location_t; tokenno: CARDINAL;
!                                    widefuncname: Name;
!                                    settype, left, right: CARDINAL) : tree ;
! VAR
!    function,
!    param1,
!    param2  : CARDINAL ;
!    highbit,
!    array1,
!    array2,
!    call    : tree ;
! BEGIN
!    function := FromM2WIDESETImport (tokenno, widefuncname) ;
!    checkDeclare (function) ;
!    location := TokenToLocation (tokenno) ;
!    param1 := GetNthParamAnyClosest (function, 1, GetMainModule ()) ;
!    param2 := GetNthParamAnyClosest (function, 2, GetMainModule ()) ;
!    array1 := CreateSetArrayParam (location, tokenno, left, param1) ;
!    array2 := CreateSetArrayParam (location, tokenno, right, param2) ;
!    highbit := ToCardinal (location, CalcHighSetBit (location, settype)) ;
!    BuildParam (location, highbit) ;  (* Parameter 3.  *)
!    BuildParam (location, array2) ;   (* Parameter 2.  *)
!    BuildParam (location, array1) ;   (* Parameter 1.  *)
!    call := BuildProcedureCallTree (location, Mod2Gcc (function),
!                                    Mod2Gcc (GetType (function))) ;
!    SetLastFunction (NIL) ;
!    RETURN call
! END CallSetWideBoolFunction ;
! 
! 
! (*
!    CodeIfSetEquWide - creates a statement tree:
!                       if left = right then goto destQuad.  The boolean
!                       invertCondition will check left # right.
! *)
! 
! PROCEDURE CodeIfSetEquWide (location: location_t; tokenno: CARDINAL;
!                             invertCondition: BOOLEAN;
!                             settype, left, right: CARDINAL; destQuad: CARDINAL) ;
! VAR
!    call, expr, label: tree ;
! BEGIN
!    call := CallSetWideBoolFunction (location, tokenno, MakeKey ("Equal"),
!                                     settype, left, right) ;
!    label := CreateLabelName (destQuad) ;
!    IF invertCondition
     THEN
!       expr := BuildEqualTo (location, call, GetBooleanFalse ())
!    ELSE
!       expr := BuildNotEqualTo (location, call, GetBooleanFalse ())
!    END ;
!    IfExprJump (location, expr, string (label))
! END CodeIfSetEquWide ;
! 
! 
! (*
!    CodeIfSetEquLower code a comparison between left and right and if true
!    jump to destQuad.  The invertCondition allows for the inverse test.
!    Note that if op1 and op2 are not both constants as this will have been
!    evaluated in CodeIfNotEqu.
! *)
! 
! PROCEDURE CodeIfSetEquLower (tokenno: CARDINAL; invertCondition: BOOLEAN;
!                              left, right, destQuad: CARDINAL) ;
! VAR
!    settype : CARDINAL ;
!    location: location_t ;
! BEGIN
!    location := TokenToLocation (tokenno) ;
!    IF IsConst (left) AND IsConst (right)
     THEN
!       InternalError ('this should have been folded by CodeIfEqu or CodeIfNotEqu')
!    ELSIF IsConst (left)
!    THEN
!       settype := GetLType (right)
     ELSE
!       settype := GetLType (left)
     END ;
!    IF GetLType (left) # GetLType (right)
     THEN
!       (* This test used to occur after the GetSetInWord (settype) condition.  *)
!       MetaErrorT2 (tokenno,
!                    'set comparison is only allowed between the same set type, the set types used by {%1Eatd} and {%2atd} are different',
!                    left, right)
!    END ;
!    IF GetSetInWord (settype)
!    THEN
!       (* Allow sets to be compared against { } for bitset.  *)
!       CodeIfSetEquNarrow (location, invertCondition, settype,
!                           Mod2Gcc (left), Mod2Gcc (right), destQuad)
     ELSE
!       CodeIfSetEquWide (location, tokenno, invertCondition, settype,
!                         left, right, destQuad)
!    END
! END CodeIfSetEquLower ;
  
  
! (*
!    CodeIfSetNotEqu - codes if op1 # op2 then goto op3
! *)
! 
! PROCEDURE CodeIfSetNotEqu (tokenno: CARDINAL; left, right, destQuad: CARDINAL) ;
! BEGIN
!    CodeIfSetEquLower (tokenno, TRUE, left, right, destQuad)
! END CodeIfSetNotEqu ;
! 
! 
! (*
!    CodeIfSetEqu - codes if op1 = op2 then goto op3
! *)
! 
! PROCEDURE CodeIfSetEqu (tokenno: CARDINAL; left, right, destQuad: CARDINAL) ;
! BEGIN
!    CodeIfSetEquLower (tokenno, FALSE, left, right, destQuad)
! END CodeIfSetEqu ;
  
  
  (*
*************** END CodeIfSetGre ;
*** 7318,7324 ****
  
  PROCEDURE PerformCodeIfGre (quad: CARDINAL) ;
  VAR
!    tl, tr  : tree ;
     location                   : location_t ;
     left, right, dest, combined,
     leftpos, rightpos, destpos : CARDINAL ;
--- 8096,8102 ----
  
  PROCEDURE PerformCodeIfGre (quad: CARDINAL) ;
  VAR
!    tl, tr, condition          : tree ;
     location                   : location_t ;
     left, right, dest, combined,
     leftpos, rightpos, destpos : CARDINAL ;
*************** BEGIN
*** 7342,7363 ****
     ELSIF IsConstSet(left) OR (IsVar(left) AND IsSet(SkipType(GetType(left)))) OR
           IsConstSet(right) OR (IsVar(right) AND IsSet(SkipType(GetType(right))))
     THEN
!       CodeIfSetGre(quad, left, right, dest)
     ELSE
!       IF IsComposite(GetType(left)) OR IsComposite(GetType(right))
        THEN
           MetaErrorT2 (combined,
                        'comparison tests between composite types not allowed {%1Eatd} and {%2atd}',
                        left, right)
        ELSE
!          ConvertBinaryOperands(location,
!                                tl, tr,
!                                ComparisonMixTypes (left, right,
!                                                    SkipType (GetType (left)),
!                                                    SkipType (GetType (right)),
!                                                    combined),
!                                left, right) ;
!          DoJump(location, BuildGreaterThan(location, tl, tr), NIL, string(CreateLabelName(dest)))
        END
     END
  END PerformCodeIfGre ;
--- 8120,8142 ----
     ELSIF IsConstSet(left) OR (IsVar(left) AND IsSet(SkipType(GetType(left)))) OR
           IsConstSet(right) OR (IsVar(right) AND IsSet(SkipType(GetType(right))))
     THEN
!       CodeIfSetGre (combined, left, right, dest)
     ELSE
!       IF IsComposite (GetType (left)) OR IsComposite (GetType (right))
        THEN
           MetaErrorT2 (combined,
                        'comparison tests between composite types not allowed {%1Eatd} and {%2atd}',
                        left, right)
        ELSE
!          ConvertBinaryOperands (location,
!                                 tl, tr,
!                                 ComparisonMixTypes (left, right,
!                                                     SkipType (GetType (left)),
!                                                     SkipType (GetType (right)),
!                                                     combined),
!                                 left, right) ;
!          condition := BuildGreaterThan (location, tl, tr) ;
!          IfExprJump (location, condition, string (CreateLabelName (dest)))
        END
     END
  END PerformCodeIfGre ;
*************** END CodeIfGre ;
*** 7377,7435 ****
  
  
  (*
-    CodeIfSetLessEqu -
- *)
- 
- PROCEDURE CodeIfSetLessEqu (quad: CARDINAL; op1, op2, op3: CARDINAL) ;
- VAR
-    settype   : CARDINAL ;
-    falselabel: ADDRESS ;
-    location  : location_t ;
- BEGIN
-    location := TokenToLocation(CurrentQuadToken) ;
- 
-    IF IsConst(op1) AND IsConst(op2)
-    THEN
-       InternalError ('this should have been folded in the calling procedure')
-    ELSIF IsConst(op1)
-    THEN
-       settype := SkipType(GetType(op2))
-    ELSE
-       settype := SkipType(GetType(op1))
-    END ;
-    IF CompareTrees(FindSize(CurrentQuadToken, settype), FindSize(CurrentQuadToken, Word)) <= 0
-    THEN
-       (* word size sets *)
-       DoJump(location,
-              BuildIsSubset(location,
-                            BuildConvert(location, GetWordType(), Mod2Gcc(op1), FALSE),
-                            BuildConvert(location, GetWordType(), Mod2Gcc(op2), FALSE)),
-              NIL, string(CreateLabelName(op3)))
-    ELSE
-       falselabel := string(Sprintf1(Mark(InitString('.Lset%dcomp')), quad)) ;
- 
-       BuildForeachWordInSetDoIfExpr(location,
-                                     Mod2Gcc(settype),
-                                     Mod2Gcc(op1), Mod2Gcc(op2),
-                                     GetMode(op1)=LeftValue,
-                                     GetMode(op2)=LeftValue,
-                                     IsConst(op1), IsConst(op2),
-                                     BuildIsNotSubset,
-                                     falselabel) ;
- 
-       BuildGoto(location, string(CreateLabelName(op3))) ;
-       DeclareLabel(location, falselabel)
-    END
- END CodeIfSetLessEqu ;
- 
- 
- (*
     PerformCodeIfLessEqu - codes the quadruple if op1 <= op2 then goto op3
  *)
  
  PROCEDURE PerformCodeIfLessEqu (quad: CARDINAL) ;
  VAR
!    tl, tr  : tree ;
     location                   : location_t ;
     left, right, dest, combined,
     leftpos, rightpos, destpos : CARDINAL ;
--- 8156,8167 ----
  
  
  (*
     PerformCodeIfLessEqu - codes the quadruple if op1 <= op2 then goto op3
  *)
  
  PROCEDURE PerformCodeIfLessEqu (quad: CARDINAL) ;
  VAR
!    tl, tr, condition          : tree ;
     location                   : location_t ;
     left, right, dest, combined,
     leftpos, rightpos, destpos : CARDINAL ;
*************** BEGIN
*** 7454,7460 ****
     ELSIF IsConstSet (left) OR (IsVar (left) AND IsSet (SkipType (GetType (left)))) OR
           IsConstSet (right) OR (IsVar (right) AND IsSet (SkipType (GetType (right))))
     THEN
!       CodeIfSetLessEqu (quad, left, right, dest)
     ELSE
        IF IsComposite (GetType (left)) OR IsComposite (GetType (right))
        THEN
--- 8186,8192 ----
     ELSIF IsConstSet (left) OR (IsVar (left) AND IsSet (SkipType (GetType (left)))) OR
           IsConstSet (right) OR (IsVar (right) AND IsSet (SkipType (GetType (right))))
     THEN
!       CodeIfSetLessEqu (combined, left, right, dest)
     ELSE
        IF IsComposite (GetType (left)) OR IsComposite (GetType (right))
        THEN
*************** BEGIN
*** 7469,7476 ****
                                                      SkipType (GetType (right)),
                                                      combined),
                                  left, right) ;
!          DoJump (location, BuildLessThanOrEqual (location, tl, tr),
!                  NIL, string (CreateLabelName (dest)))
        END
     END
  END PerformCodeIfLessEqu ;
--- 8201,8208 ----
                                                      SkipType (GetType (right)),
                                                      combined),
                                  left, right) ;
!          condition := BuildLessThanOrEqual (location, tl, tr) ;
!          IfExprJump (location, condition, string (CreateLabelName (dest)))
        END
     END
  END PerformCodeIfLessEqu ;
*************** END CodeIfLessEqu ;
*** 7490,7548 ****
  
  
  (*
-    CodeIfSetGreEqu -
- *)
- 
- PROCEDURE CodeIfSetGreEqu (quad: CARDINAL; op1, op2, op3: CARDINAL) ;
- VAR
-    settype   : CARDINAL ;
-    falselabel: ADDRESS ;
-    location: location_t ;
- BEGIN
-    location := TokenToLocation(CurrentQuadToken) ;
- 
-    IF IsConst(op1) AND IsConst(op2)
-    THEN
-       InternalError ('this should have been folded in the calling procedure')
-    ELSIF IsConst(op1)
-    THEN
-       settype := SkipType(GetType(op2))
-    ELSE
-       settype := SkipType(GetType(op1))
-    END ;
-    IF CompareTrees(FindSize(CurrentQuadToken, settype), FindSize(CurrentQuadToken, Word)) <= 0
-    THEN
-       (* word size sets *)
-       DoJump(location,
-              BuildIsSuperset(location,
-                              BuildConvert(location, GetWordType(), Mod2Gcc(op1), FALSE),
-                              BuildConvert(location, GetWordType(), Mod2Gcc(op2), FALSE)),
-              NIL, string(CreateLabelName(op3)))
-    ELSE
-       falselabel := string(Sprintf1(Mark(InitString('.Lset%dcomp')), quad)) ;
- 
-       BuildForeachWordInSetDoIfExpr(location,
-                                     Mod2Gcc(settype),
-                                     Mod2Gcc(op1), Mod2Gcc(op2),
-                                     GetMode(op1)=LeftValue,
-                                     GetMode(op2)=LeftValue,
-                                     IsConst(op1), IsConst(op2),
-                                     BuildIsNotSuperset,
-                                     falselabel) ;
- 
-       BuildGoto(location, string(CreateLabelName(op3))) ;
-       DeclareLabel(location, falselabel)
-    END
- END CodeIfSetGreEqu ;
- 
- 
- (*
     PerformCodeIfGreEqu - codes the quadruple if op1 >= op2 then goto op3
  *)
  
  PROCEDURE PerformCodeIfGreEqu (quad: CARDINAL) ;
  VAR
!    tl, tr: tree ;
     location                   : location_t ;
     left, right, dest, combined,
     leftpos, rightpos, destpos : CARDINAL ;
--- 8222,8233 ----
  
  
  (*
     PerformCodeIfGreEqu - codes the quadruple if op1 >= op2 then goto op3
  *)
  
  PROCEDURE PerformCodeIfGreEqu (quad: CARDINAL) ;
  VAR
!    tl, tr, condition          : tree ;
     location                   : location_t ;
     left, right, dest, combined,
     leftpos, rightpos, destpos : CARDINAL ;
*************** BEGIN
*** 7567,7573 ****
     ELSIF IsConstSet(left) OR (IsVar(left) AND IsSet(SkipType(GetType(left)))) OR
           IsConstSet(right) OR (IsVar(right) AND IsSet(SkipType(GetType(right))))
     THEN
!       CodeIfSetGreEqu(quad, left, right, dest)
     ELSE
        IF IsComposite(GetType(left)) OR IsComposite(GetType(right))
        THEN
--- 8252,8258 ----
     ELSIF IsConstSet(left) OR (IsVar(left) AND IsSet(SkipType(GetType(left)))) OR
           IsConstSet(right) OR (IsVar(right) AND IsSet(SkipType(GetType(right))))
     THEN
!       CodeIfSetGreEqu (combined, left, right, dest)
     ELSE
        IF IsComposite(GetType(left)) OR IsComposite(GetType(right))
        THEN
*************** BEGIN
*** 7582,7588 ****
                                                     SkipType (GetType (right)),
                                                     combined),
                                 left, right) ;
!          DoJump(location, BuildGreaterThanOrEqual(location, tl, tr), NIL, string(CreateLabelName(dest)))
        END
     END
  END PerformCodeIfGreEqu ;
--- 8267,8274 ----
                                                     SkipType (GetType (right)),
                                                     combined),
                                 left, right) ;
!          condition := BuildGreaterThanOrEqual(location, tl, tr) ;
!          IfExprJump (location, condition, string (CreateLabelName (dest)))
        END
     END
  END PerformCodeIfGreEqu ;
*************** END CodeIfGreEqu ;
*** 7602,7712 ****
  
  
  (*
-    CodeIfSetEqu - codes if op1 = op2 then goto op3
-                   Note that if op1 and op2 are not both constants
-                   since this will have been evaluated in CodeIfEqu.
- *)
- 
- PROCEDURE CodeIfSetEqu (quad: CARDINAL; op1, op2, op3: CARDINAL) ;
- VAR
-    settype   : CARDINAL ;
-    falselabel: ADDRESS ;
-    location  : location_t ;
- BEGIN
-    location := TokenToLocation(CurrentQuadToken) ;
- 
-    IF IsConst(op1) AND IsConst(op2)
-    THEN
-       InternalError ('this should have been folded in the calling procedure')
-    ELSIF IsConst(op1)
-    THEN
-       settype := SkipType(GetType(op2))
-    ELSE
-       settype := SkipType(GetType(op1))
-    END ;
-    IF CompareTrees(FindSize(CurrentQuadToken, settype), FindSize(CurrentQuadToken, Word)) <= 0
-    THEN
-       (* word size sets *)
-       DoJump(location,
-              BuildEqualTo(location,
-                           BuildConvert(location, GetWordType(), Mod2Gcc(op1), FALSE),
-                           BuildConvert(location, GetWordType(), Mod2Gcc(op2), FALSE)),
-              NIL, string(CreateLabelName(op3)))
-    ELSIF GetSType(op1)=GetSType(op2)
-    THEN
-       falselabel := string(Sprintf1(Mark(InitString('.Lset%dcomp')), quad)) ;
- 
-       BuildForeachWordInSetDoIfExpr(location,
-                                     Mod2Gcc(settype),
-                                     Mod2Gcc(op1), Mod2Gcc(op2),
-                                     GetMode(op1)=LeftValue,
-                                     GetMode(op2)=LeftValue,
-                                     IsConst(op1), IsConst(op2),
-                                     BuildNotEqualTo,
-                                     falselabel) ;
- 
-       BuildGoto(location, string(CreateLabelName(op3))) ;
-       DeclareLabel(location, falselabel)
-    ELSE
-       MetaErrorT2 (CurrentQuadToken,
-                    'set comparison is only allowed between the same set type, the set types used by {%1Eatd} and {%2atd} are different',
-                    op1, op2)
-    END
- END CodeIfSetEqu ;
- 
- 
- (*
-    CodeIfSetNotEqu - codes if op1 # op2 then goto op3
-                      Note that if op1 and op2 are not both constants
-                      since this will have been evaluated in CodeIfNotEqu.
- *)
- 
- PROCEDURE CodeIfSetNotEqu (left, right, destQuad: CARDINAL) ;
- VAR
-    settype  : CARDINAL ;
-    truelabel: ADDRESS ;
-    location  : location_t ;
- BEGIN
-    location := TokenToLocation(CurrentQuadToken) ;
- 
-    IF IsConst (left) AND IsConst (right)
-    THEN
-       InternalError ('this should have been folded in the calling procedure')
-    ELSIF IsConst (left)
-    THEN
-       settype := SkipType (GetType (right))
-    ELSE
-       settype := SkipType (GetType (left))
-    END ;
-    IF CompareTrees (FindSize (CurrentQuadToken, settype), FindSize (CurrentQuadToken, Word)) <= 0
-    THEN
-       (* word size sets *)
-       DoJump (location,
-               BuildNotEqualTo(location,
-                               BuildConvert (location, GetWordType (), Mod2Gcc (left), FALSE),
-                               BuildConvert (location, GetWordType (), Mod2Gcc (right), FALSE)),
-               NIL, string (CreateLabelName (destQuad)))
-    ELSIF GetSType (left) = GetSType (right)
-    THEN
-       truelabel := string (CreateLabelName (destQuad)) ;
- 
-       BuildForeachWordInSetDoIfExpr (location,
-                                      Mod2Gcc (settype),
-                                      Mod2Gcc (left), Mod2Gcc (right),
-                                      GetMode (left) = LeftValue,
-                                      GetMode (right) = LeftValue,
-                                      IsConst (left), IsConst (right),
-                                      BuildNotEqualTo,
-                                      truelabel)
-    ELSE
-       MetaErrorT2 (CurrentQuadToken,
-                    'set comparison is only allowed between the same set type, the set types used by {%1Eatd} and {%2atd} are different',
-                    left, right)
-    END
- END CodeIfSetNotEqu ;
- 
- 
- (*
     ComparisonMixTypes -
  *)
  
--- 8288,8293 ----
*************** END ComparisonMixTypes ;
*** 7730,7736 ****
  
  PROCEDURE PerformCodeIfEqu (quad: CARDINAL) ;
  VAR
!    tl, tr                     : tree ;
     location                   : location_t ;
     left, right, dest, combined,
     leftpos, rightpos, destpos : CARDINAL ;
--- 8311,8317 ----
  
  PROCEDURE PerformCodeIfEqu (quad: CARDINAL) ;
  VAR
!    tl, tr, condition          : tree ;
     location                   : location_t ;
     left, right, dest, combined,
     leftpos, rightpos, destpos : CARDINAL ;
*************** BEGIN
*** 7770,7777 ****
                                                      SkipType (GetType (right)),
                                                      combined),
                                 left, right) ;
!          DoJump (location, BuildEqualTo (location, tl, tr), NIL,
!                  string (CreateLabelName (dest)))
        END
     END
  END PerformCodeIfEqu ;
--- 8351,8358 ----
                                                      SkipType (GetType (right)),
                                                      combined),
                                 left, right) ;
!          condition := BuildEqualTo (location, tl, tr) ;
!          IfExprJump (location, condition, string (CreateLabelName (dest)))
        END
     END
  END PerformCodeIfEqu ;
*************** END PerformCodeIfEqu ;
*** 7783,7789 ****
  
  PROCEDURE PerformCodeIfNotEqu (quad: CARDINAL) ;
  VAR
!    tl, tr                     : tree ;
     location                   : location_t ;
     left, right, dest, combined,
     leftpos, rightpos, destpos : CARDINAL ;
--- 8364,8370 ----
  
  PROCEDURE PerformCodeIfNotEqu (quad: CARDINAL) ;
  VAR
!    tl, tr, condition          : tree ;
     location                   : location_t ;
     left, right, dest, combined,
     leftpos, rightpos, destpos : CARDINAL ;
*************** BEGIN
*** 7809,7815 ****
     ELSIF IsConstSet (left) OR (IsVar (left) AND IsSet (SkipType (GetType (left)))) OR
           IsConstSet (right) OR (IsVar (right) AND IsSet (SkipType (GetType (right))))
     THEN
!       CodeIfSetNotEqu (left, right, dest)
     ELSE
        IF IsComposite (GetType (left)) OR IsComposite (GetType (right))
        THEN
--- 8390,8396 ----
     ELSIF IsConstSet (left) OR (IsVar (left) AND IsSet (SkipType (GetType (left)))) OR
           IsConstSet (right) OR (IsVar (right) AND IsSet (SkipType (GetType (right))))
     THEN
!       CodeIfSetNotEqu (combined, left, right, dest)
     ELSE
        IF IsComposite (GetType (left)) OR IsComposite (GetType (right))
        THEN
*************** BEGIN
*** 7824,7831 ****
                                                      SkipType (GetType (right)),
                                                      combined),
                                  left, right) ;
!          DoJump (location, BuildNotEqualTo (location, tl, tr), NIL,
!                  string (CreateLabelName (dest)))
        END
     END
  END PerformCodeIfNotEqu ;
--- 8405,8412 ----
                                                      SkipType (GetType (right)),
                                                      combined),
                                  left, right) ;
!          condition := BuildNotEqualTo (location, tl, tr) ;
!          IfExprJump (location, condition, string (CreateLabelName (dest)))
        END
     END
  END PerformCodeIfNotEqu ;
*************** END BuildIfVarInConstValue ;
*** 7938,8144 ****
     BuildIfNotVarInConstValue - if not (var in constsetvalue) then goto trueexit
  *)
  
! PROCEDURE BuildIfNotVarInConstValue (quad: CARDINAL; constsetvalue: PtrToValue; var, trueexit: CARDINAL) ;
  VAR
!    vt, lt, ht  : tree ;
     type,
!    low, high, n: CARDINAL ;
     falselabel,
!    truelabel   : String ;
!    location    : location_t ;
  BEGIN
!    location := TokenToLocation(CurrentQuadToken) ;
! 
!    truelabel := string(CreateLabelName(trueexit)) ;
     n := 1 ;
!    WHILE GetRange(constsetvalue, n, low, high) DO
!       INC(n)
     END ;
     IF n=2
     THEN
!       (* actually only one set range, so we invert it *)
!       type := MixTypes3(low, high, var, CurrentQuadToken) ;
!       ConvertBinaryOperands(location, vt, lt, type, var, low) ;
!       ConvertBinaryOperands(location, ht, lt, type, high, low) ;
!       BuildIfNotInRangeGoto(location, vt, lt, ht, truelabel)
     ELSE
        n := 1 ;
!       falselabel := string(Sprintf1(Mark(InitString('.Lset%d')), quad)) ;
!       WHILE GetRange(constsetvalue, n, low, high) DO
!          type := MixTypes3(low, high, var, CurrentQuadToken) ;
!          ConvertBinaryOperands(location, vt, lt, type, var, low) ;
!          ConvertBinaryOperands(location, ht, lt, type, high, low) ;
!          BuildIfInRangeGoto(location, vt, lt, ht, falselabel) ;
!          INC(n)
        END ;
!       BuildGoto(location, truelabel) ;
!       DeclareLabel(location, falselabel)
     END
  END BuildIfNotVarInConstValue ;
  
  
  (*
!    PerformCodeIfIn - code the quadruple: if op1 in op2 then goto op3
  *)
  
! PROCEDURE PerformCodeIfIn (quad: CARDINAL) ;
  VAR
!    low,
!    high    : CARDINAL ;
!    lowtree,
!    hightree,
!    offset  : tree ;
!    fieldno : INTEGER ;
!    location                   : location_t ;
!    left, right, dest, combined,
!    leftpos, rightpos, destpos : CARDINAL ;
!    constExpr, overflow        : BOOLEAN ;
!    op                         : QuadOperator ;
  BEGIN
!    (* Ensure that any remaining undeclared constant literal is declared.  *)
!    GetQuadOtok (quad, combined, op,
!                 left, right, dest,
!                 constExpr, overflow,
!                 leftpos, rightpos, destpos) ;
!    location := TokenToLocation (combined) ;
!    IF IsConst(left) AND IsConst(right)
!    THEN
!       InternalError ('should not get to here (if we do we should consider calling FoldIfIn)')
!    ELSIF CheckElementSetTypes (quad)
     THEN
!       IF IsConst(left)
!       THEN
!          fieldno := GetFieldNo(combined, left, GetType(right), offset) ;
!          IF fieldno>=0
!          THEN
!             PushValue(left) ;
!             PushIntegerTree(offset) ;
!             ConvertToType(GetType(left)) ;
!             Sub ;
!             BuildIfConstInVar(location,
!                               Mod2Gcc(SkipType(GetType(right))),
!                               Mod2Gcc(right), PopIntegerTree(),
!                               GetMode(right)=LeftValue, fieldno,
!                               string(CreateLabelName(dest)))
!          ELSE
!             MetaErrorT1 (combined, 'bit exceeded the range of set {%1Eatd}', left)
!          END
!       ELSIF IsConst(right)
!       THEN
!          (* builds a cascaded list of if statements *)
!          PushValue(right) ;
!          BuildIfVarInConstValue(location, combined, GetValue(combined), left, dest)
!       ELSE
!          GetSetLimits(SkipType(GetType(right)), low, high) ;
  
-          PushValue(low) ;
-          lowtree := PopIntegerTree() ;
-          PushValue(high) ;
-          hightree := PopIntegerTree() ;
  
!          BuildIfVarInVar(location,
!                          Mod2Gcc(SkipType(GetType(right))),
!                          Mod2Gcc(right), Mod2Gcc(left),
!                          GetMode(right)=LeftValue,
!                          lowtree, hightree,
!                          string(CreateLabelName(dest)))
!       END
!    END
! END PerformCodeIfIn ;
  
  
  (*
!    PerformCodeIfNotIn - code the quadruple: if not (op1 in op2) then goto op3
  *)
  
! PROCEDURE PerformCodeIfNotIn (quad: CARDINAL) ;
  VAR
!    low,
!    high    : CARDINAL ;
!    lowtree,
!    hightree,
!    offset  : tree ;
!    fieldno : INTEGER ;
!    location                   : location_t ;
!    left, right, dest, combined,
!    leftpos, rightpos, destpos : CARDINAL ;
!    constExpr, overflow        : BOOLEAN ;
!    op                         : QuadOperator ;
  BEGIN
!    (* Ensure that any remaining undeclared constant literal is declared.  *)
!    GetQuadOtok (quad, combined, op,
!                 left, right, dest,
!                 overflow, constExpr,
!                 leftpos, rightpos, destpos) ;
!    location := TokenToLocation (combined) ;
!    IF IsConst(left) AND IsConst(right)
     THEN
        InternalError ('should not get to here (if we do we should consider calling FoldIfIn)')
     ELSIF CheckElementSetTypes (quad)
     THEN
!       IF IsConst(left)
        THEN
!          fieldno := GetFieldNo(combined, left, SkipType(GetType(right)), offset) ;
!          IF fieldno>=0
           THEN
!             PushValue(left) ;
!             PushIntegerTree(offset) ;
!             ConvertToType(GetType(left)) ;
!             Sub ;
!             BuildIfNotConstInVar(location,
!                                  Mod2Gcc(SkipType(GetType(right))),
!                                  Mod2Gcc(right), PopIntegerTree(),
!                                  GetMode(right)=LeftValue, fieldno,
!                                  string(CreateLabelName(dest)))
           ELSE
!             MetaErrorT1 (combined, 'bit exceeded the range of set {%1Eatd}', right)
           END
-       ELSIF IsConst(right)
-       THEN
-          (* builds a cascaded list of if statements *)
-          PushValue(right) ;
-          BuildIfNotVarInConstValue(quad, GetValue(combined), left, dest)
        ELSE
!          GetSetLimits(SkipType(GetType(right)), low, high) ;
! 
!          PushValue(low) ;
!          lowtree := PopIntegerTree() ;
!          PushValue(high) ;
!          hightree := PopIntegerTree() ;
! 
!          BuildIfNotVarInVar(location,
!                             Mod2Gcc(SkipType(GetType(right))),
!                             Mod2Gcc(right), Mod2Gcc(left),
!                             GetMode(right)=LeftValue,
!                             lowtree, hightree,
!                             string(CreateLabelName(dest)))
        END
     END
! END PerformCodeIfNotIn ;
  
  
  (*
!    CodeIfIn - code the quadruple: if op1 in op2 then goto op3
  *)
  
  PROCEDURE CodeIfIn (quad: CARDINAL) ;
  BEGIN
     IF IsValidExpressionRelOp (quad, TRUE)
     THEN
!       PerformCodeIfIn (quad)
     END
  END CodeIfIn ;
  
  
  (*
!    CodeIfNotIn - code the quadruple: if not (op1 in op2) then goto op3
  *)
  
  PROCEDURE CodeIfNotIn (quad: CARDINAL) ;
  BEGIN
     IF IsValidExpressionRelOp (quad, TRUE)
     THEN
!       PerformCodeIfNotIn (quad)
     END
  END CodeIfNotIn ;
  
--- 8519,8723 ----
     BuildIfNotVarInConstValue - if not (var in constsetvalue) then goto trueexit
  *)
  
! PROCEDURE BuildIfNotVarInConstValue (location: location_t; tokenno: CARDINAL;
!                                      quad: CARDINAL;
!                                      constsetvalue: PtrToValue;
!                                      var, trueexit: CARDINAL) ;
  VAR
!    vt, lt, ht   : tree ;
     type,
!    low, high, n : CARDINAL ;
     falselabel,
!    truelabel    : String ;
  BEGIN
!    truelabel := string (CreateLabelName (trueexit)) ;
     n := 1 ;
!    WHILE GetRange (constsetvalue, n, low, high) DO
!       INC (n)
     END ;
     IF n=2
     THEN
!       (* Only one set range, so we invert it *)
!       type := MixTypes3 (low, high, var, tokenno) ;
!       ConvertBinaryOperands (location, vt, lt, type, var, low) ;
!       ConvertBinaryOperands (location, ht, lt, type, high, low) ;
!       BuildIfNotInRangeGoto (location, vt, lt, ht, truelabel)
     ELSE
        n := 1 ;
!       falselabel := string (Sprintf1 (Mark (InitString ('.Lset%d')), quad)) ;
!       WHILE GetRange (constsetvalue, n, low, high) DO
!          type := MixTypes3 (low, high, var, tokenno) ;
!          ConvertBinaryOperands (location, vt, lt, type, var, low) ;
!          ConvertBinaryOperands (location, ht, lt, type, high, low) ;
!          BuildIfInRangeGoto (location, vt, lt, ht, falselabel) ;
!          INC (n)
        END ;
!       BuildGoto (location, truelabel) ;
!       DeclareLabel (location, falselabel)
     END
  END BuildIfNotVarInConstValue ;
  
  
  (*
!     SetWideIfIn - if M2WIDESET.In (set, element) then goto branch end.
  *)
  
! PROCEDURE SetWideIfIn (location: location_t; tokenno: CARDINAL;
!                        invertCondition: BOOLEAN;
!                        settype, element, set: CARDINAL; branch: CARDINAL) ;
  VAR
!    label    : String ;
!    bit, call,
!    expr,
!    setarray : tree ;
!    setparam,
!    procedure: CARDINAL ;
  BEGIN
!    procedure := FromM2WIDESETImport (tokenno, MakeKey ("In")) ;
!    setparam := GetNthParamAnyClosest (procedure, 1, GetMainModule ()) ;
!    setarray := CreateSetArrayParam (location, tokenno, set, setparam) ;
!    bit := SetElementToBit (location, settype, element) ;
!    BuildParam (location, ToCardinal (location, bit)) ;
!    BuildParam (location, setarray) ;
!    call := BuildProcedureCallTree (location,
!                                    Mod2Gcc (procedure),
!                                    Mod2Gcc (GetType (procedure))) ;
!    SetLastFunction (NIL) ;
!    label := CreateLabelName (branch) ;
!    IF invertCondition
     THEN
!       expr := BuildEqualTo (location, call, GetBooleanFalse ())
!    ELSE
!       expr := BuildNotEqualTo (location, call, GetBooleanFalse ())
!    END ;
!    IfExprJump (location, expr, string (label))
! END SetWideIfIn ;
  
  
! (*
!    CodeNarrowIfIn -
! *)
! 
! PROCEDURE CodeNarrowIfIn (location: location_t;
!                           settype: CARDINAL; invertCondition: BOOLEAN;
!                           element, set: CARDINAL; branch: CARDINAL) ;
! VAR
!    label, cond,
!    bit, mask, bitset: tree ;
! BEGIN
!    bit := ToBitset (location, SetElementToBit (location, settype, element)) ;
!    mask := BuildMask (location, CalcBitsInSet (location, settype), FALSE) ;
!    (* Mask off only the bits we need.  *)
!    bitset := ToBitset (location, BuildLogicalAnd (location, Mod2Gcc (set), mask)) ;
!    IF invertCondition
!    THEN
!       cond := BuildIfNotInSet (location, bitset, bit)
!    ELSE
!       cond := BuildIfInSet (location, bitset, bit)
!    END ;
!    label := CreateLabelName (branch) ;
!    IfExprJump (location, cond, string (label))
! END CodeNarrowIfIn ;
  
  
  (*
!    CodeIfInLower - code the quadruple: if element in set then goto branch.
!                    The invertCondition can be set to TRUE to handle CodeIfNotIn.
  *)
  
! PROCEDURE CodeIfInLower (tokenno: CARDINAL; quad: CARDINAL;
!                          invertCondition: BOOLEAN;
!                          element, set, branch: CARDINAL) ;
  VAR
!    settype      : CARDINAL ;
!    location     : location_t ;
!    constsetvalue: PtrToValue ;
  BEGIN
!    location := TokenToLocation (tokenno) ;
!    (* Firstly ensure that any constant literal is declared.  *)
!    DeclareConstant (tokenno, set) ;
!    DeclareConstant (tokenno, element) ;
!    DeclareConstructor (tokenno, quad, set) ;
!    DeclareConstructor (tokenno, quad, element) ;
!    checkDeclare (set) ;
!    checkDeclare (element) ;
!    settype := GetLType (set) ;
! 
!    IF IsConst (element) AND IsConst (set)
     THEN
        InternalError ('should not get to here (if we do we should consider calling FoldIfIn)')
     ELSIF CheckElementSetTypes (quad)
     THEN
!       IF IsConst (set)
        THEN
!          PushValue (set) ;
!          constsetvalue := GetValue (tokenno) ;
!          IF invertCondition
           THEN
!             (* Builds a cascaded list of if statements.  *)
!             BuildIfNotVarInConstValue (location, tokenno, quad, constsetvalue, element, branch)
           ELSE
!             (* Builds a very different cascaded list of if statements.  *)
!             BuildIfVarInConstValue (location, tokenno, constsetvalue, element, branch)
           END
        ELSE
!          Assert (IsVar (set)) ;
!          IF IsElementInRange (tokenno, settype, set, element)
!          THEN
!             (* Check for narrow and wide sets and call M2WIDESET if appropriate.  *)
!             IF GetSetInWord (settype)
!             THEN
!                CodeNarrowIfIn (location, settype, invertCondition, element, set, branch)
!             ELSE
!                SetWideIfIn (location, tokenno, invertCondition, settype, element, set, branch)
!             END
!          END
        END
     END
! END CodeIfInLower ;
  
  
  (*
!    PerformCodeIfIn -
! *)
! 
! PROCEDURE PerformCodeIfIn (quad: CARDINAL; invert: BOOLEAN) ;
! VAR
!    op                            : QuadOperator ;
!    element, set, branch, combined,
!    elementpos, setpos, destpos   : CARDINAL ;
!    constExpr, overflow           : BOOLEAN ;
! BEGIN
!    GetQuadOtok (quad, combined, op,
!                 element, set, branch,
!                 overflow, constExpr,
!                 elementpos, setpos, destpos) ;
!    CodeIfInLower (combined, quad, invert, element, set, branch)
! END PerformCodeIfIn ;
! 
! 
! (*
!    CodeIfIn - code the quadruple: if element in set then goto branch.
  *)
  
  PROCEDURE CodeIfIn (quad: CARDINAL) ;
  BEGIN
     IF IsValidExpressionRelOp (quad, TRUE)
     THEN
!       PerformCodeIfIn (quad, FALSE)
     END
  END CodeIfIn ;
  
  
  (*
!    CodeIfNotIn - code the quadruple: if not (element in set) then goto branch.
  *)
  
  PROCEDURE CodeIfNotIn (quad: CARDINAL) ;
  BEGIN
     IF IsValidExpressionRelOp (quad, TRUE)
     THEN
!       PerformCodeIfIn (quad, TRUE)
     END
  END CodeIfNotIn ;
  
*************** BEGIN
*** 8293,8302 ****
--- 8872,8937 ----
  END InitBuiltinSyms ;
  
  
+ (*
+    gdbhook - a debugger convenience hook.
+ *)
+ 
+ PROCEDURE gdbhook ;
+ END gdbhook ;
+ 
+ 
+ (*
+    BreakWhenQuadTranslated - to be called interactively by gdb.
+ *)
+ 
+ PROCEDURE BreakWhenQuadTranslated (quad: CARDINAL) ;
+ BEGIN
+    BreakQuad := quad
+ END BreakWhenQuadTranslated ;
+ 
+ 
+ (*
+    CheckBreak - if quad = BreakQuad then call gdbhook.
+ *)
+ 
+ PROCEDURE CheckBreak (quad: CARDINAL) ;
+ BEGIN
+    IF quad = BreakQuad
+    THEN
+       gdbhook
+    END
+ END CheckBreak ;
+ 
+ 
+ (*
+    Init -
+ *)
+ 
+ PROCEDURE Init ;
  BEGIN
+    (* You might want to add the option -fm2-debug-trace=quad to cc1gm2 if
+       contenplating interactively debugging cc1gm2 using the scheme below.  *)
+    BreakWhenQuadTranslated (0) ;  (* Disable the interactive quad watch.  *)
+    (* To examine when a quad is about to be converted into a gimple tree
+       run cc1gm2 from gdb and set a break point on gdbhook.
+       (gdb) break gdbhook
+       (gdb) run
+       Now below interactively call BreakWhenQuadTranslated with the quad
+       under investigation.  *)
+    gdbhook ;
+    (* Now is the time to interactively call gdb, for example:
+       (gdb) print BreakWhenQuadTranslated (1234)
+       (gdb) cont
+       and you will arrive at gdbhook when this quad is about to be translated.  *)
     Memset := NulSym ;
     Memcpy := NulSym ;
     UnboundedLabelNo := 0 ;
     CurrentQuadToken := 0 ;
+    SetTemporaryNo := 0 ;
     ScopeStack := InitStackWord ()
+ END Init ;
+ 
+ 
+ BEGIN
+    Init
  END M2GenGCC.
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/M2MetaError.def gcc-16-20250921/gcc/m2/gm2-compiler/M2MetaError.def
*** gcc-16-20250914/gcc/m2/gm2-compiler/M2MetaError.def	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/M2MetaError.def	Sun Sep 21 22:32:38 2025
*************** FROM NameKey IMPORT Name ;
*** 43,49 ****
      {%1Td}    get the type of the first symbol and describe it.
      {%1Sd}    skip the type pseudonyms of the first symbol and describe it.
      {%1ua}    force no quotes after substituting the text.
! 
      {%1D}     sets the error message to where symbol 1 was declared.
                The declaration will choose the definition module, then
                implementation (or program) module.
--- 43,50 ----
      {%1Td}    get the type of the first symbol and describe it.
      {%1Sd}    skip the type pseudonyms of the first symbol and describe it.
      {%1ua}    force no quotes after substituting the text.
!     {%1av}    check name for starting with a vowel and if so append n to the
!               previous word.
      {%1D}     sets the error message to where symbol 1 was declared.
                The declaration will choose the definition module, then
                implementation (or program) module.
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/M2MetaError.mod gcc-16-20250921/gcc/m2/gm2-compiler/M2MetaError.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/M2MetaError.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/M2MetaError.mod	Sun Sep 21 22:32:38 2025
*************** FROM Indexing IMPORT Index, InitIndex, K
*** 44,50 ****
  
  FROM DynamicStrings IMPORT String, InitString, InitStringCharStar,
                             ConCat, ConCatChar, Mark, string, KillString,
!                            Dup, char, Length, Mult, EqualArray, Equal ;
  
  FROM SymbolTable IMPORT NulSym,
                          IsDefImp, IsModule, IsInnerModule,
--- 44,51 ----
  
  FROM DynamicStrings IMPORT String, InitString, InitStringCharStar,
                             ConCat, ConCatChar, Mark, string, KillString,
!                            Dup, char, Length, Mult, EqualArray, Equal,
!                            RemoveWhitePostfix ;
  
  FROM SymbolTable IMPORT NulSym,
                          IsDefImp, IsModule, IsInnerModule,
*************** TYPE
*** 88,93 ****
--- 89,95 ----
                     highplus1 : CARDINAL ;
                     len,
                     ini       : INTEGER ;
+                    vowel,
                     glyph,
                     chain,
                     root,
*************** BEGIN
*** 507,519 ****
     WITH eb DO
        useError   := TRUE ;
        e          := NIL ;
!       type       := error ;  (* default to the error color.  *)
        out        := InitString ('') ;
        in         := input ;
        highplus1  := HIGH (sym) + 1 ;
        len        := Length (input) ;
        ini        := 0 ;
!       glyph      := FALSE ;  (* nothing to output yet.  *)
        quotes     := TRUE ;
        positive   := TRUE ;
        root       := FALSE ;
--- 509,522 ----
     WITH eb DO
        useError   := TRUE ;
        e          := NIL ;
!       type       := error ;  (* Default to the error color.  *)
        out        := InitString ('') ;
        in         := input ;
        highplus1  := HIGH (sym) + 1 ;
        len        := Length (input) ;
        ini        := 0 ;
!       glyph      := FALSE ;  (* Nothing to output yet.  *)
!       vowel      := FALSE ;  (* Check for a vowel when outputing string?  *)
        quotes     := TRUE ;
        positive   := TRUE ;
        root       := FALSE ;
*************** END push ;
*** 542,548 ****
  
  
  (*
!    pop - copies contents of oldblock into newblock.  It only copies the error
           handle if the toblock.e is NIL.
  *)
  
--- 545,551 ----
  
  
  (*
!    pop - copies contents of fromblock into toblock.  It only copies the error
           handle if the toblock.e is NIL.
  *)
  
*************** PROCEDURE pop (VAR toblock, fromblock: e
*** 550,555 ****
--- 553,559 ----
  VAR
     c: colorType ;
  BEGIN
+    checkVowel (toblock, fromblock) ;
     IF empty (fromblock)
     THEN
        toblock.stackPtr := fromblock.stackPtr ;
*************** END killErrorBlock ;
*** 708,714 ****
                         )
                   =:
  
!    op := {'a'|'q'|'t'|'d'|'n'|'s'|'B'|'D'|'F'|'G'|'H'|'M'|'U'|'E'|'V'|'W'|'A'} then =:
  
     then := [ ':' ebnf ] =:
  *)
--- 712,718 ----
                         )
                   =:
  
!    op := {'a'|'q'|'t'|'d'|'n'|'s'|'v'|'B'|'D'|'F'|'G'|'H'|'M'|'U'|'E'|'V'|'W'|'A'} then =:
  
     then := [ ':' ebnf ] =:
  *)
*************** END empty ;
*** 973,978 ****
--- 977,1014 ----
  
  
  (*
+    checkVowel - checks to see if the from block word starts with
+                 a vowel and if so adds an n to the to block output.
+ *)
+ 
+ PROCEDURE checkVowel (VAR to: errorBlock; from: errorBlock) ;
+ BEGIN
+    IF from.vowel AND (NOT empty (from))
+    THEN
+       IF isVowel (char (from.out, 0))
+       THEN
+          IF Length (to.out) > 0
+          THEN
+             to.out := RemoveWhitePostfix (Mark (to.out)) ;
+             to.out := ConCat (to.out, Mark (InitString ('n '))) ;
+             from.vowel := FALSE
+          END
+       END
+    END
+ END checkVowel ;
+ 
+ 
+ (*
+    isVowel - returns TRUE if ch is a, e, i, o or u.
+ *)
+ 
+ PROCEDURE isVowel (ch: CHAR) : BOOLEAN ;
+ BEGIN
+    RETURN (ch = 'a') OR (ch = 'e') OR (ch = 'i') OR (ch = 'o') OR (ch = 'u')
+ END isVowel ;
+ 
+ 
+ (*
     clear - remove the output string.
  *)
  
*************** BEGIN
*** 1624,1630 ****
        RETURN InitString('set')
     ELSIF IsUnknown(sym)
     THEN
!       RETURN InitString('an unknown')
     ELSIF IsSubrange(sym)
     THEN
        RETURN InitString('subrange')
--- 1660,1666 ----
        RETURN InitString('set')
     ELSIF IsUnknown(sym)
     THEN
!       RETURN InitString('unknown')
     ELSIF IsSubrange(sym)
     THEN
        RETURN InitString('subrange')
*************** END copySym ;
*** 1676,1682 ****
  
  
  (*
!    op := {'!'|'a'|'c'|'d'|'k'|'n'|'p'|'q'|'s'|'t'|'u'|
            'A'|'B'|'C'|'D'|'E'|'F'|'G'|'H'|'K'|'M'|'N'|
            'O'|'P'|'Q'|'R'|'S'|'T'|'U'|'V'|'W'|'X'|'Y'|'Z'} then =:
  *)
--- 1712,1718 ----
  
  
  (*
!    op := {'!'|'a'|'c'|'d'|'k'|'n'|'p'|'q'|'s'|'t'|'u'|'v'|
            'A'|'B'|'C'|'D'|'E'|'F'|'G'|'H'|'K'|'M'|'N'|
            'O'|'P'|'Q'|'R'|'S'|'T'|'U'|'V'|'W'|'X'|'Y'|'Z'} then =:
  *)
*************** BEGIN
*** 1705,1710 ****
--- 1741,1747 ----
        's':  doSkipType (eb, sym, bol) |
        't':  doType (eb, sym, bol) |
        'u':  eb.quotes := FALSE |
+       'v':  eb.vowel := TRUE |
        'A':  eb.type := aborta ;
              seenAbort := TRUE |
        'B':  declaredType (eb, sym, bol) |
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/M2Options.def gcc-16-20250921/gcc/m2/gm2-compiler/M2Options.def
*** gcc-16-20250914/gcc/m2/gm2-compiler/M2Options.def	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/M2Options.def	Sun Sep 21 22:32:38 2025
*************** VAR
*** 55,63 ****
     StyleChecking,                (* -Wstudents checks for common student errs*)
     UnboundedByReference,         (* -funbounded-by-reference                 *)
     VerboseUnbounded,             (* -Wverbose-unbounded                      *)
!    OptimizeUncalledProcedures,   (* -Ouncalled removes uncalled procedures   *)
!    OptimizeBasicBlock,           (* -Obb create basic blocks and optimize.   *)
!    OptimizeCommonSubExpressions, (* -Ocse optimize common subexpressions     *)
     WholeProgram,                 (* -fwhole-program optimization.            *)
     NilChecking,                  (* -fnil makes compiler test for pointer    *)
                                   (* NIL.                                     *)
--- 55,64 ----
     StyleChecking,                (* -Wstudents checks for common student errs*)
     UnboundedByReference,         (* -funbounded-by-reference                 *)
     VerboseUnbounded,             (* -Wverbose-unbounded                      *)
!    OptimizeUncalledProcedures,   (* Removes uncalled procedures?             *)
!    OptimizeBasicBlock,           (* Create basic blocks and optimize?        *)
!    OptimizeCommonSubExpressions, (* Optimize common subexpressions?          *)
!    OptimizeSets,                 (* TRUE if -On when n>0.  False for -Os.    *)
     WholeProgram,                 (* -fwhole-program optimization.            *)
     NilChecking,                  (* -fnil makes compiler test for pointer    *)
                                   (* NIL.                                     *)
*************** VAR
*** 115,120 ****
--- 116,122 ----
     SharedFlag,                   (* -fshared indicating this module needs    *)
                                   (* the shared library version of the        *)
                                   (* scaffold.                                *)
+    TimeReport, MemReport,        (* -ftime-report and -fmem-report values.   *)
     ForcedLocation,
     GenerateStatementNote,
     Optimizing,
*************** PROCEDURE GetFileOffsetBits () : CARDINA
*** 1166,1171 ****
--- 1168,1201 ----
  
  
  (*
+    SetMemReport - set MemReport to value.
+ *)
+ 
+ PROCEDURE SetMemReport (value: BOOLEAN) ;
+ 
+ 
+ (*
+    SetTimeReport - set TimeReport to value.
+ *)
+ 
+ PROCEDURE SetTimeReport (value: BOOLEAN) ;
+ 
+ 
+ (*
+    SetWideset - set the Wideset flag to value.
+ *)
+ 
+ PROCEDURE SetWideset (value: BOOLEAN) ;
+ 
+ 
+ (*
+    GetWideset - return the Wideset flag value.
+ *)
+ 
+ PROCEDURE GetWideset () : BOOLEAN ;
+ 
+ 
+ (*
     FinaliseOptions - once all options have been parsed we set any inferred
                       values.
  *)
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/M2Options.mod gcc-16-20250921/gcc/m2/gm2-compiler/M2Options.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/M2Options.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/M2Options.mod	Sun Sep 21 22:32:38 2025
*************** VAR
*** 85,90 ****
--- 85,91 ----
     DumpDecl,         (* -fm2-dump=decl.  *)
     DumpGimple,       (* -fm2-dump=gimple.  *)
     DumpQuad,         (* -fq, -fm2-dump=quad dump quadruples.  *)
+    WidesetFlag,      (* -fwideset.  *)
     MFlag,
     MMFlag,
     MPFlag,
*************** BEGIN
*** 1326,1337 ****
        Optimizing := TRUE ;
        OptimizeBasicBlock := TRUE ;
        OptimizeUncalledProcedures := TRUE ;
!       OptimizeCommonSubExpressions := TRUE
     ELSE
        Optimizing := FALSE ;
        OptimizeBasicBlock := FALSE ;
        OptimizeUncalledProcedures := FALSE ;
!       OptimizeCommonSubExpressions := FALSE
     END
  END SetOptimizing ;
  
--- 1327,1340 ----
        Optimizing := TRUE ;
        OptimizeBasicBlock := TRUE ;
        OptimizeUncalledProcedures := TRUE ;
!       OptimizeCommonSubExpressions := TRUE ;
!       OptimizeSets := TRUE
     ELSE
        Optimizing := FALSE ;
        OptimizeBasicBlock := FALSE ;
        OptimizeUncalledProcedures := FALSE ;
!       OptimizeCommonSubExpressions := FALSE ;
!       OptimizeSets := FALSE
     END
  END SetOptimizing ;
  
*************** BEGIN
*** 2074,2079 ****
--- 2077,2122 ----
  END GetFileOffsetBits ;
  
  
+ (*
+    SetMemReport - set MemReport to value.
+ *)
+ 
+ PROCEDURE SetMemReport (value: BOOLEAN) ;
+ BEGIN
+    MemReport := value
+ END SetMemReport ;
+ 
+ 
+ (*
+    SetTimeReport - set TimeReport to value.
+ *)
+ 
+ PROCEDURE SetTimeReport (value: BOOLEAN) ;
+ BEGIN
+    TimeReport := value
+ END SetTimeReport ;
+ 
+ 
+ (*
+    SetWideset - set the Wideset flag to value.
+ *)
+ 
+ PROCEDURE SetWideset (value: BOOLEAN) ;
+ BEGIN
+    WidesetFlag := value
+ END SetWideset ;
+ 
+ 
+ (*
+    GetWideset - return the Wideset flag value.
+ *)
+ 
+ PROCEDURE GetWideset () : BOOLEAN ;
+ BEGIN
+    RETURN WidesetFlag
+ END GetWideset ;
+ 
+ 
  BEGIN
     cflag                             := FALSE ;  (* -c.  *)
     RuntimeModuleOverride             := InitString (DefaultRuntimeModuleOverride) ;
*************** BEGIN
*** 2099,2104 ****
--- 2142,2148 ----
     OptimizeBasicBlock                := FALSE ;
     OptimizeUncalledProcedures        := FALSE ;
     OptimizeCommonSubExpressions      := FALSE ;
+    OptimizeSets                      := FALSE ;
     NilChecking                       := FALSE ;
     WholeDivChecking                  := FALSE ;
     WholeValueChecking                := FALSE ;
*************** BEGIN
*** 2168,2173 ****
--- 2212,2220 ----
     DumpGimple                        := FALSE ;
     M2Dump                            := NIL ;
     M2DumpFilter                      := NIL ;
+    TimeReport                        := FALSE ;
+    MemReport                         := FALSE ;
     EnableForward                     := TRUE ;
     OffTBits                          := 0 ;  (* Default to CSSIZE_T.  *)
+    WidesetFlag                       := TRUE ;
  END M2Options.
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/M2Quads.mod gcc-16-20250921/gcc/m2/gm2-compiler/M2Quads.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/M2Quads.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/M2Quads.mod	Sun Sep 21 22:32:38 2025
*************** FROM SymbolTable IMPORT ModeOfAddr, GetM
*** 57,62 ****
--- 57,64 ----
                          MakeConstString, MakeConstant, MakeConstVar,
                          MakeConstStringM2nul, MakeConstStringCnul,
                          Make2Tuple, IsTuple,
+                         MakeSubrange, PutSubrange,
+                         PutSetArray, MakeSetArray,
                          RequestSym, MakePointer, PutPointer,
                          SkipType,
  			GetDType, GetSType, GetLType,
*************** FROM SymbolTable IMPORT ModeOfAddr, GetM
*** 109,114 ****
--- 111,117 ----
                          IsFieldEnumeration,
                          IsVar, IsProcType, IsType, IsSubrange, IsExported,
                          IsConst, IsConstString, IsModule, IsDefImp,
+                         IsConstVar,
                          IsArray, IsUnbounded, IsProcedureNested,
                          IsParameterUnbounded,
                          IsPartialUnbounded, IsProcedureBuiltin,
*************** FROM M2Batch IMPORT MakeDefinitionSource
*** 150,156 ****
  FROM M2GCCDeclare IMPORT PutToBeSolvedByQuads ;
  
  FROM FifoQueue IMPORT GetConstFromFifoQueue,
!                       PutConstructorIntoFifoQueue, GetConstructorFromFifoQueue ;
  
  FROM M2Comp IMPORT CompilingImplementationModule,
                     CompilingProgramModule ;
--- 153,160 ----
  FROM M2GCCDeclare IMPORT PutToBeSolvedByQuads ;
  
  FROM FifoQueue IMPORT GetConstFromFifoQueue,
!                       PutConstructorIntoFifoQueue, GetConstructorFromFifoQueue,
!                       GetSetFromFifoQueue ;
  
  FROM M2Comp IMPORT CompilingImplementationModule,
                     CompilingProgramModule ;
*************** FROM M2CaseList IMPORT PushCase, PopCase
*** 280,285 ****
--- 284,291 ----
  FROM PCSymBuild IMPORT SkipConst ;
  FROM m2builtins IMPORT GetBuiltinTypeInfoType ;
  FROM M2LangDump IMPORT IsDumpRequired ;
+ FROM SymbolConversion IMPORT GccKnowsAbout ;
+ FROM M2Diagnostic IMPORT Diagnostic, InitMemDiagnostic, MemIncr, MemSet ;
  
  IMPORT M2Error, FIO, SFIO, DynamicStrings, StdIO ;
  
*************** VAR
*** 399,404 ****
--- 405,411 ----
                                        (* in order.                               *)
     NoOfQuads            : CARDINAL ;  (* Number of used quadruples.              *)
     Head                 : CARDINAL ;  (* Head of the list of quadruples.         *)
+    QuadMemDiag          : Diagnostic ;  (* Contains memory related statistics.   *)
     BreakQuad            : CARDINAL ;  (* Stop when BreakQuad is created.         *)
  
  
*************** BEGIN
*** 2063,2069 ****
        ELSE
           INC (NoOfQuads) ;
           PutIndice (QuadArray, QuadNo, f) ;
!          f^.NoOfTimesReferenced := 0
        END
     END ;
     WITH f^ DO
--- 2070,2078 ----
        ELSE
           INC (NoOfQuads) ;
           PutIndice (QuadArray, QuadNo, f) ;
!          f^.NoOfTimesReferenced := 0 ;
!          MemSet (QuadMemDiag, 1, NoOfQuads) ;
!          MemIncr (QuadMemDiag, 2, SIZE (f^))
        END
     END ;
     WITH f^ DO
*************** BEGIN
*** 3404,3410 ****
     IF IsPseudoBaseProcedure (expr) OR IsPseudoBaseFunction (expr)
     THEN
        MetaErrorT1 (exprtok,
!                   'an assignment cannot assign a {%1d} {%1a}', expr)
     END
  END CheckCompatibleWithBecomes ;
  
--- 3413,3419 ----
     IF IsPseudoBaseProcedure (expr) OR IsPseudoBaseFunction (expr)
     THEN
        MetaErrorT1 (exprtok,
!                   'an assignment cannot assign a {%1dv} {%1a}', expr)
     END
  END CheckCompatibleWithBecomes ;
  
*************** END BuildAssignConstant ;
*** 3812,3836 ****
  
  
  (*
!    doBuildAssignment - subsiduary procedure of BuildAssignment.
!                        It builds the assignment and optionally
!                        checks the types are compatible.
  *)
  
! PROCEDURE doBuildAssignment (becomesTokNo: CARDINAL; checkTypes, checkOverflow: BOOLEAN) ;
! VAR
!    r, w,
!    t, f,
!    Array,
!    Des, Exp      : CARDINAL ;
!    combinedtok,
!    destok, exptok: CARDINAL ;
  BEGIN
-    DisplayStack ;
-    IF IsBoolean (1)
-    THEN
-       PopBool (t, f) ;
-       PopTtok (Des, destok) ;
        PutVarConditional (Des, TRUE) ;  (* Des will contain the result of a boolean relop.  *)
        (* Conditional Boolean Assignment.  *)
        BackPatch (t, NextQuad) ;
--- 3821,3844 ----
  
  
  (*
!    BuildAssignmentBoolean - build the quadruples for a boolean variable or constant
!                             which will be assigned to the result of a boolean expression.
!                             For example:
! 
!                             foo := a = b ;
!                             foo := a IN b ;
! 
!                             The boolean result is contained in the control flow
!                             the true value will emerge from the quad path t.
!                             The false value will emerge from the quad path f.
!                             This procedure terminates both paths by backpatching
!                             and assigns TRUE or FALSE to the variable/constant.
!                             A variable maybe an L value so it will require dereferencing.
  *)
  
! PROCEDURE BuildAssignmentBoolean (becomesTokNo: CARDINAL; checkOverflow: BOOLEAN;
!                                   t, f: CARDINAL; Des: CARDINAL; destok: CARDINAL) ;
  BEGIN
        PutVarConditional (Des, TRUE) ;  (* Des will contain the result of a boolean relop.  *)
        (* Conditional Boolean Assignment.  *)
        BackPatch (t, NextQuad) ;
*************** BEGIN
*** 3852,3857 ****
--- 3860,3895 ----
        ELSE
           GenQuadO (becomesTokNo, BecomesOp, Des, NulSym, False, checkOverflow)
        END
+ END BuildAssignmentBoolean ;
+ 
+ 
+ (*
+    doBuildAssignment - subsiduary procedure of BuildAssignment.
+                        It builds the assignment and optionally
+                        checks the types are compatible.
+ *)
+ 
+ PROCEDURE doBuildAssignment (becomesTokNo: CARDINAL; checkTypes, checkOverflow: BOOLEAN) ;
+ VAR
+    r, w,
+    t, f,
+    Array,
+    Des, Exp      : CARDINAL ;
+    combinedtok,
+    destok, exptok: CARDINAL ;
+ BEGIN
+    DisplayStack ;
+    IF IsBoolean (1)
+    THEN
+       PopBool (t, f) ;
+       PopTtok (Des, destok) ;
+       IF IsVar (Des) OR IsConstVar (Des)
+       THEN
+          BuildAssignmentBoolean (becomesTokNo, checkOverflow,
+                                  t, f, Des, destok)
+       ELSE
+          MetaErrorT1 (destok, 'expecting the designator {%1Ead} to be a constant or a variable and not a {%1dv}', Des)
+       END
     ELSE
        PopTrwtok (Exp, r, exptok) ;
        MarkAsRead (r) ;
*************** BEGIN
*** 5795,5802 ****
           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 ()),
--- 5833,5840 ----
           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 {%2dv}', ProcType, GetNth (ProcType, i), i) ;
!             MetaError3 ('parameter {%3n} in {%1dD} causes a mismatch it was declared as a {%2dv}', call, GetNth (call, i), i)
              END ;
              BuildRange (InitTypesParameterCheck (tokno, CheckedProcedure, i,
                                                   GetNthParamAnyClosest (CheckedProcedure, i, GetCurrentModule ()),
*************** BEGIN
*** 7863,7871 ****
           (* Error issue message and fake return stack.  *)
           IF Iso
           THEN
!             MetaErrorT0 (functok, 'the only functions permissible in a constant expression are: {%kCAP}, {%kCHR}, {%kCMPLX}, {%kFLOAT}, {%kHIGH}, {%kIM}, {%kLENGTH}, {%kMAX}, {%kMIN}, {%kODD}, {%kORD}, {%kRE}, {%kSIZE}, {%kTSIZE}, {%kTRUNC}, {%kVAL} and gcc builtins')
           ELSE
!             MetaErrorT0 (functok, 'the only functions permissible in a constant expression are: {%kCAP}, {%kCHR}, {%kFLOAT}, {%kHIGH}, {%kMAX}, {%kMIN}, {%kODD}, {%kORD}, {%kSIZE}, {%kTSIZE}, {%kTRUNC}, {%kVAL} and gcc builtins')
           END ;
  	 IF NoOfParam > 0
  	 THEN
--- 7901,7909 ----
           (* Error issue message and fake return stack.  *)
           IF Iso
           THEN
!             MetaErrorT0 (functok, 'the only functions permissible in a constant expression are: {%kCAP}, {%kCHR}, {%kCMPLX}, {%kFLOAT}, {%kHIGH}, {%kIM}, {%kLENGTH}, {%kMAX}, {%kMIN}, {%kODD}, {%kORD}, {%kRE}, {%kSIZE}, {%kTSIZE}, {%kTBITSIZE}, {%kTRUNC}, {%kVAL} and gcc builtins')
           ELSE
!             MetaErrorT0 (functok, 'the only functions permissible in a constant expression are: {%kCAP}, {%kCHR}, {%kFLOAT}, {%kHIGH}, {%kMAX}, {%kMIN}, {%kODD}, {%kORD}, {%kSIZE}, {%kTSIZE}, {%kTRUNC}, {%kTBITSIZE}, {%kVAL} and gcc builtins')
           END ;
  	 IF NoOfParam > 0
  	 THEN
*************** BEGIN
*** 8212,8218 ****
              PushTFtok (ReturnVar, Address, combinedtok)
           ELSE
              MetaErrorT1 (functok,
!                          'the first parameter to ADDADR {%1Ea} must be a variable of type ADDRESS or a {%EkPOINTER}, rather than a {%1Etsd}',
                           VarSym) ;
              PushTFtok (MakeConstLit (combinedtok, MakeKey('0'), Address), Address, combinedtok)
           END
--- 8250,8256 ----
              PushTFtok (ReturnVar, Address, combinedtok)
           ELSE
              MetaErrorT1 (functok,
!                          'the first parameter to ADDADR {%1Ea} must be a variable of type ADDRESS or a {%EkPOINTER}, rather than a {%1Etsdv}',
                           VarSym) ;
              PushTFtok (MakeConstLit (combinedtok, MakeKey('0'), Address), Address, combinedtok)
           END
*************** BEGIN
*** 8295,8301 ****
              PushTFtok (ReturnVar, Address, combinedtok)
           ELSE
              MetaErrorT1 (functok,
!                          'the first parameter to {%EkSUBADR} {%1Ea} must be a variable of type ADDRESS or a {%EkPOINTER}, rather than a {%1Etsd}',
                           VarSym) ;
              PushTFtok (MakeConstLit (vartok, MakeKey('0'), Address), Address, vartok)
           END
--- 8333,8339 ----
              PushTFtok (ReturnVar, Address, combinedtok)
           ELSE
              MetaErrorT1 (functok,
!                          'the first parameter to {%EkSUBADR} {%1Ea} must be a variable of type ADDRESS or a {%EkPOINTER}, rather than a {%1Etsdv}',
                           VarSym) ;
              PushTFtok (MakeConstLit (vartok, MakeKey('0'), Address), Address, vartok)
           END
*************** BEGIN
*** 8394,8406 ****
                 PushT (2) ;          (* Two parameters *)
                 BuildConvertFunction (Convert, ConstExpr)
              ELSE
!                MetaError1 ('the second parameter to {%EkDIFADR} {%1Ea} must be a variable of type ADDRESS or a {%EkPOINTER}, rather than a {%1Etsd}',
                             OperandSym) ;
                 PushTFtok (MakeConstLit (combinedtok, MakeKey ('0'), Integer), Integer, combinedtok)
              END
           ELSE
              MetaErrorT1 (vartok,
!                          'the first parameter to {%EkDIFADR} {%1Ea} must be a variable of type ADDRESS or a {%EkPOINTER}, rather than a {%1Etsd}',
                           VarSym) ;
              PushTFtok (MakeConstLit (combinedtok, MakeKey ('0'), Integer), Integer, combinedtok)
           END
--- 8432,8444 ----
                 PushT (2) ;          (* Two parameters *)
                 BuildConvertFunction (Convert, ConstExpr)
              ELSE
!                MetaError1 ('the second parameter to {%EkDIFADR} {%1Ea} must be a variable of type ADDRESS or a {%EkPOINTER}, rather than a {%1Etsdv}',
                             OperandSym) ;
                 PushTFtok (MakeConstLit (combinedtok, MakeKey ('0'), Integer), Integer, combinedtok)
              END
           ELSE
              MetaErrorT1 (vartok,
!                          'the first parameter to {%EkDIFADR} {%1Ea} must be a variable of type ADDRESS or a {%EkPOINTER}, rather than a {%1Etsdv}',
                           VarSym) ;
              PushTFtok (MakeConstLit (combinedtok, MakeKey ('0'), Integer), Integer, combinedtok)
           END
*************** BEGIN
*** 8615,8621 ****
     IF ConstExpr AND IsVar (Var)
     THEN
        MetaErrorT2 (optok,
!                    'the procedure function {%1Ea} is being called from within a constant expression and therefore the parameter {%2a} must be a constant, seen a {%2da}',
                     Func, Var) ;
        RETURN TRUE
     ELSE
--- 8653,8659 ----
     IF ConstExpr AND IsVar (Var)
     THEN
        MetaErrorT2 (optok,
!                    'the procedure function {%1Ea} is being called from within a constant expression and therefore the parameter {%2a} must be a constant, seen a {%2dav}',
                     Func, Var) ;
        RETURN TRUE
     ELSE
*************** BEGIN
*** 9352,9358 ****
        PopTtok (varSet, vartok) ;
        PopT (procSym) ;
        combinedtok := MakeVirtualTok (functok, functok, exptok) ;
!       IF (GetSType (varSet) # NulSym) AND IsSet (GetDType (varSet))
        THEN
           derefExp := DereferenceLValue (exptok, Exp) ;
           BuildRange (InitShiftCheck (varSet, derefExp)) ;
--- 9390,9397 ----
        PopTtok (varSet, vartok) ;
        PopT (procSym) ;
        combinedtok := MakeVirtualTok (functok, functok, exptok) ;
!       IF (GetSType (varSet) # NulSym)
!          AND (IsSet (GetDType (varSet)) OR IsGenericSystemType (GetDType (varSet)))
        THEN
           derefExp := DereferenceLValue (exptok, Exp) ;
           BuildRange (InitShiftCheck (varSet, derefExp)) ;
*************** BEGIN
*** 9427,9433 ****
        MarkAsRead (r) ;
        PopTtok (varSet, vartok) ;
        PopT (procSym) ;
!       IF (GetSType (varSet) # NulSym) AND IsSet (GetDType (varSet))
        THEN
           combinedtok := MakeVirtualTok (functok, functok, exptok) ;
           derefExp := DereferenceLValue (exptok, Exp) ;
--- 9466,9473 ----
        MarkAsRead (r) ;
        PopTtok (varSet, vartok) ;
        PopT (procSym) ;
!       IF (GetSType (varSet) # NulSym)
!          AND (IsSet (GetDType (varSet)) OR IsGenericSystemType (GetDType (varSet)))
        THEN
           combinedtok := MakeVirtualTok (functok, functok, exptok) ;
           derefExp := DereferenceLValue (exptok, Exp) ;
*************** BEGIN
*** 11609,11615 ****
        BuildStaticArray
     ELSE
        MetaErrorT1 (arrayTok,
!                    'can only index static or dynamic arrays, {%1Ead} is not an array but a {%tad}',
                     Sym) ;
        BuildDesignatorError ('bad array access')
     END
--- 11649,11655 ----
        BuildStaticArray
     ELSE
        MetaErrorT1 (arrayTok,
!                    'can only index static or dynamic arrays, {%1Ead} is not an array but a {%tadv}',
                     Sym) ;
        BuildDesignatorError ('bad array access')
     END
*************** BEGIN
*** 11971,11977 ****
           MarkAsRead (rw) ;
           BuildDesignatorPointerError (Type1, rw, combinedtok, 'bad opaque pointer dereference')
        ELSE
!          MetaError2 ('{%1Ead} is not a pointer type but a {%2d}', Sym1, Type1) ;
           MarkAsRead (rw) ;
           BuildDesignatorPointerError (Type1, rw, combinedtok, 'bad pointer dereference')
        END
--- 12011,12017 ----
           MarkAsRead (rw) ;
           BuildDesignatorPointerError (Type1, rw, combinedtok, 'bad opaque pointer dereference')
        ELSE
!          MetaError2 ('{%1Ead} is not a pointer type but a {%2dv}', Sym1, Type1) ;
           MarkAsRead (rw) ;
           BuildDesignatorPointerError (Type1, rw, combinedtok, 'bad pointer dereference')
        END
*************** BEGIN
*** 13065,13071 ****
              WarnStringAt (s, OldPos) ;
              s := InitString ('combined') ;
              WarnStringAt (s, OperatorPos) ;
!             (* MetaErrorT1 (GetDeclaredMod (t), 'in binary with a {%1a}', t) *)
           END ;
           GenQuadOtok (OperatorPos, MakeOp (NewOp), value, left, right, checkOverflow,
                        OperatorPos, leftpos, rightpos)
--- 13105,13111 ----
              WarnStringAt (s, OldPos) ;
              s := InitString ('combined') ;
              WarnStringAt (s, OperatorPos) ;
!             (* MetaErrorT1 (GetDeclaredMod (t), 'in binary with a {%1av}', t) *)
           END ;
           GenQuadOtok (OperatorPos, MakeOp (NewOp), value, left, right, checkOverflow,
                        OperatorPos, leftpos, rightpos)
*************** BEGIN
*** 13384,13395 ****
     THEN
        MetaErrorsT1 (tokpos,
                      '{%1Ead} expected a variable, procedure, constant or expression',
!                     'and it was declared as a {%1Dd}', sym) ;
     ELSIF (type#NulSym) AND IsArray(type)
     THEN
        MetaErrorsT1 (tokpos,
                      '{%1EU} not expecting an array variable as an operand for either comparison or binary operation',
!                     'it was declared as a {%1Dd}', sym)
     ELSIF IsConstString (sym) AND IsConstStringKnown (sym) AND (GetStringLength (tokpos, sym) > 1)
     THEN
        MetaErrorT1 (tokpos,
--- 13424,13435 ----
     THEN
        MetaErrorsT1 (tokpos,
                      '{%1Ead} expected a variable, procedure, constant or expression',
!                     'and it was declared as a {%1Ddv}', sym) ;
     ELSIF (type#NulSym) AND IsArray(type)
     THEN
        MetaErrorsT1 (tokpos,
                      '{%1EU} not expecting an array variable as an operand for either comparison or binary operation',
!                     'it was declared as a {%1Ddv}', sym)
     ELSIF IsConstString (sym) AND IsConstStringKnown (sym) AND (GetStringLength (tokpos, sym) > 1)
     THEN
        MetaErrorT1 (tokpos,
*************** END ds ;
*** 14014,14022 ****
--- 14054,14065 ----
  
  PROCEDURE DisplayQuad (QuadNo: CARDINAL) ;
  BEGIN
+    IF QuadNo # 0
+    THEN
     DSdbEnter ;
     fprintf1 (GetDumpFile (), '%4d  ', QuadNo) ; WriteQuad(QuadNo) ; fprintf0 (GetDumpFile (), '\n') ;
     DSdbExit
+    END
  END DisplayQuad ;
  
  
*************** BEGIN
*** 14337,14343 ****
        THEN
           fprintf0 (GetDumpFile (), '[') ; WriteMode (GetMode (Sym)) ; fprintf0 (GetDumpFile (), ']')
        END ;
!       fprintf1 (GetDumpFile (), '(%d)', Sym)
     END
  END WriteOperand ;
  
--- 14380,14390 ----
        THEN
           fprintf0 (GetDumpFile (), '[') ; WriteMode (GetMode (Sym)) ; fprintf0 (GetDumpFile (), ']')
        END ;
!       fprintf1 (GetDumpFile (), '(%d)', Sym) ;
!       IF GccKnowsAbout (Sym)
!       THEN
!          fprintf0 (GetDumpFile (), '[gcc]')
!       END
     END
  END WriteOperand ;
  
*************** BEGIN
*** 16173,16178 ****
--- 16220,16229 ----
     InitList(VarientFields) ;
     VarientFieldNo := 0 ;
     NoOfQuads := 0 ;
+    QuadMemDiag
+       := InitMemDiagnostic
+             ('M2Quad:Quadruples',
+             '{0N} total quadruples {1d} consuming {2M} ram {0M} ({2P})')
  END Init ;
  
  
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/M2Range.mod gcc-16-20250921/gcc/m2/gm2-compiler/M2Range.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/M2Range.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/M2Range.mod	Sun Sep 21 22:32:38 2025
*************** BEGIN
*** 1978,1984 ****
        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)
--- 1978,1984 ----
        IF NOT reportedError (r)
        THEN
           MetaErrorT2 (tokenNo,
!                       'assignment designator {%1Ea} {%1ta:of type {%1ta}} {%1d:is a {%1dv}} and expression {%2a} {%2tad:of type {%2tad}} are incompatible',
                        des, expr)
        END ;
        setReported (r)
*************** BEGIN
*** 2047,2053 ****
           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 ;
--- 2047,2053 ----
           ELSE
              MetaErrorT2 (tokenNo,
                           'assignment designator {%1Ea} {%1ta:of type {%1ta}}' +
!                          ' {%1d:is a {%1dv}} and expression {%2a}' +
                           ' {%2tad:of type {%2tad}} are incompatible',
                           des, expr)
           END ;
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/M2Scaffold.mod gcc-16-20250921/gcc/m2/gm2-compiler/M2Scaffold.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/M2Scaffold.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/M2Scaffold.mod	Sun Sep 21 22:32:38 2025
*************** BEGIN
*** 580,586 ****
     ELSIF ScaffoldDynamic AND (NOT cflag)
     THEN
        MetaErrorT0 (tokenno,
!                    '{%O}dynamic linking enabled but no module ctor list has been created, hint use -fuse-list=filename or -fgen-module-list=-')
     END ;
  
     initFunction := MakeProcedure (tokenno, MakeKey ("_M2_init")) ;
--- 580,586 ----
     ELSIF ScaffoldDynamic AND (NOT cflag)
     THEN
        MetaErrorT0 (tokenno,
!                    '{%O}dynamic module registration enabled but no module ctor list has been created, hint use -fuse-list=filename or -fgen-module-list=-')
     END ;
  
     initFunction := MakeProcedure (tokenno, MakeKey ("_M2_init")) ;
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/M2SymInit.mod gcc-16-20250921/gcc/m2/gm2-compiler/M2SymInit.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/M2SymInit.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/M2SymInit.mod	Sun Sep 21 22:32:38 2025
*************** BEGIN
*** 155,165 ****
     printf (" initialized\n") ;
     IF (desc^.type # NulSym) AND IsRecord (desc^.type)
     THEN
!       i := 1 ;
!       n := Indexing.HighIndice (desc^.rec.fieldDesc) ;
!       WHILE i <= n DO
!          PrintSymInit (Indexing.GetIndice (desc^.rec.fieldDesc, i)) ;
!          INC (i)
        END
     END
  END PrintSymInit ;
--- 155,170 ----
     printf (" initialized\n") ;
     IF (desc^.type # NulSym) AND IsRecord (desc^.type)
     THEN
!       IF desc^.rec.fieldDesc = NIL
!       THEN
!          printf (" record field descriptor has not been initialized yet\n") ;
!       ELSE
!          i := 1 ;
!          n := Indexing.HighIndice (desc^.rec.fieldDesc) ;
!          WHILE i <= n DO
!             PrintSymInit (Indexing.GetIndice (desc^.rec.fieldDesc, i)) ;
!             INC (i)
!          END
        END
     END
  END PrintSymInit ;
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/M2System.mod gcc-16-20250921/gcc/m2/gm2-compiler/M2System.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/M2System.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/M2System.mod	Sun Sep 21 22:32:38 2025
*************** END IsPseudoSystemFunction ;
*** 509,516 ****
  PROCEDURE IsPseudoSystemFunctionConstExpression (sym: CARDINAL) : BOOLEAN ;
  BEGIN
     RETURN(
!           (sym=Size) OR (sym=TSize) OR (sym=Rotate) OR (sym=Shift) OR
!           (Iso AND ((sym=Cast) OR (sym=MakeAdr)))
           )
  END IsPseudoSystemFunctionConstExpression ;
  
--- 509,516 ----
  PROCEDURE IsPseudoSystemFunctionConstExpression (sym: CARDINAL) : BOOLEAN ;
  BEGIN
     RETURN(
!           (sym=Size) OR (sym=TSize) OR (sym=TBitSize) OR (sym=Rotate) OR (sym=Shift) OR
!           (Iso AND ((sym=Cast) OR (sym=MakeAdr) OR (sym=TBitSize)))
           )
  END IsPseudoSystemFunctionConstExpression ;
  
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/NameKey.mod gcc-16-20250921/gcc/m2/gm2-compiler/NameKey.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/NameKey.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/NameKey.mod	Sun Sep 21 22:32:38 2025
*************** FROM NumberIO IMPORT WriteCard ;
*** 31,36 ****
--- 31,37 ----
  FROM StrLib IMPORT StrLen ;
  FROM libc IMPORT strlen ;
  FROM ASCII IMPORT nul ;
+ (* FROM M2Diagnostic IMPORT Diagnostic, InitMemDiagnostic, MemIncr, MemDecr, MemSet ; *)
  
  
  TYPE
*************** VAR
*** 50,55 ****
--- 51,60 ----
     BinaryTree: NameNode ;
     KeyIndex  : Index ;
     LastIndice: CARDINAL ;
+ (*
+    NameKeyTreeMemDiag,
+    NameKeyWordMemDiag: Diagnostic ;
+ *)
  
  
  (*
*************** BEGIN
*** 144,154 ****
        IF result=less
        THEN
           NEW(child) ;
!          father^.Left := child
        ELSIF result=greater
        THEN
           NEW(child) ;
!          father^.Right := child
        END ;
        WITH child^ DO
           Right := NIL ;
--- 149,167 ----
        IF result=less
        THEN
           NEW(child) ;
!          father^.Left := child ;
!          (*
!          MemIncr (NameKeyTreeMemDiag, 1, 1) ;
!          MemIncr (NameKeyTreeMemDiag, 2, SIZE (child^))
!          *)
        ELSIF result=greater
        THEN
           NEW(child) ;
!          father^.Right := child ;
!          (*
!          MemIncr (NameKeyTreeMemDiag, 1, 1) ;
!          MemIncr (NameKeyTreeMemDiag, 2, SIZE (child^))
!          *)
        END ;
        WITH child^ DO
           Right := NIL ;
*************** BEGIN
*** 161,167 ****
        k := LastIndice
     ELSE
        DEALLOCATE(n, higha+1) ;
!       k := child^.Key
     END ;
     RETURN( k )
  END DoMakeKey ;
--- 174,184 ----
        k := LastIndice
     ELSE
        DEALLOCATE(n, higha+1) ;
!       k := child^.Key ;
!       (*
!       MemDecr (NameKeyWordMemDiag, 1, 1) ;
!       MemDecr (NameKeyWordMemDiag, 2, higha + 1)
!       *)
     END ;
     RETURN( k )
  END DoMakeKey ;
*************** VAR
*** 182,190 ****
  BEGIN
     higha := StrLen(a) ;
     ALLOCATE(p, higha+1) ;
     IF p=NIL
     THEN
!       HALT      (* out of memory error *)
     ELSE
        n := p ;
        i := 0 ;
--- 199,211 ----
  BEGIN
     higha := StrLen(a) ;
     ALLOCATE(p, higha+1) ;
+    (*
+    MemIncr (NameKeyWordMemDiag, 1, 1) ;
+    MemIncr (NameKeyWordMemDiag, 2, higha + 1) ;
+    *)
     IF p=NIL
     THEN
!       HALT  (* Out of memory error.  *)
     ELSE
        n := p ;
        i := 0 ;
*************** BEGIN
*** 194,200 ****
           INC(p)
        END ;
        p^ := nul ;
- 
        RETURN( DoMakeKey(n, higha) )
     END
  END MakeKey ;
--- 215,220 ----
*************** BEGIN
*** 223,229 ****
        ALLOCATE(p, higha+1) ;
        IF p=NIL
        THEN
!          HALT      (* out of memory error *)
        ELSE
           n  := p ;
           pa := a ;
--- 243,249 ----
        ALLOCATE(p, higha+1) ;
        IF p=NIL
        THEN
!          HALT  (* Out of memory error.  *)
        ELSE
           n  := p ;
           pa := a ;
*************** END CharKey ;
*** 413,420 ****
  
  
  BEGIN
     LastIndice := 0 ;
     KeyIndex := InitIndex(1) ;
     NEW(BinaryTree) ;
!    BinaryTree^.Left := NIL
  END NameKey.
--- 433,450 ----
  
  
  BEGIN
+ (*
+    NameKeyWordMemDiag
+       := InitMemDiagnostic
+             ('NameKey:Words',
+             '{0N} total words {1d} consuming {2M} ({2P})') ;
+    NameKeyTreeMemDiag
+       := InitMemDiagnostic
+             ('NameKey:Tree',
+             '{0N} total tree nodes {1d} consuming {2M} ({2P})') ;
+ *)
     LastIndice := 0 ;
     KeyIndex := InitIndex(1) ;
     NEW(BinaryTree) ;
!    BinaryTree^.Left := NIL ;
  END NameKey.
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/P1SymBuild.mod gcc-16-20250921/gcc/m2/gm2-compiler/P1SymBuild.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/P1SymBuild.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/P1SymBuild.mod	Sun Sep 21 22:32:38 2025
*************** BEGIN
*** 914,920 ****
           EndBuildForward.  *)
        PutDeclared (tokno, ProcSym)
     ELSE
!       MetaError1 ('expecting a procedure name and symbol {%1Ea} has been declared as a {%1d}', ProcSym) ;
        PushT (ProcSym) ;
        RETURN
     END ;
--- 914,920 ----
           EndBuildForward.  *)
        PutDeclared (tokno, ProcSym)
     ELSE
!       MetaError1 ('expecting a procedure name and symbol {%1Ea} has been declared as a {%1dv}', ProcSym) ;
        PushT (ProcSym) ;
        RETURN
     END ;
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/P2SymBuild.mod gcc-16-20250921/gcc/m2/gm2-compiler/P2SymBuild.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/P2SymBuild.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/P2SymBuild.mod	Sun Sep 21 22:32:38 2025
*************** BEGIN
*** 2589,2595 ****
           Field := PutFieldRecord(Record, OperandT(NoOfPragmas*2+NoOfFields+3-i), Type, Varient) ;
           HandleRecordFieldPragmas(Record, Field, NoOfPragmas)
        ELSE
!          MetaErrors2('record field {%1ad} has already been declared inside a {%2Dd} {%2a}',
                       'attempting to declare a duplicate record field', fsym, Parent)
        END ;
        (* adjust the location of declaration to the one on the stack (rather than GetTokenNo).  *)
--- 2589,2595 ----
           Field := PutFieldRecord(Record, OperandT(NoOfPragmas*2+NoOfFields+3-i), Type, Varient) ;
           HandleRecordFieldPragmas(Record, Field, NoOfPragmas)
        ELSE
!          MetaErrors2('record field {%1ad} has already been declared inside a {%2Ddv} {%2a}',
                       'attempting to declare a duplicate record field', fsym, Parent)
        END ;
        (* adjust the location of declaration to the one on the stack (rather than GetTokenNo).  *)
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/P3Build.bnf gcc-16-20250921/gcc/m2/gm2-compiler/P3Build.bnf
*** gcc-16-20250914/gcc/m2/gm2-compiler/P3Build.bnf	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/P3Build.bnf	Sun Sep 21 22:32:38 2025
*************** SilentExpList := SilentConstExpression {
*** 1041,1047 ****
  
  -- end of the Silent constant rules
  
! SetType := ( "SET" | "PACKEDSET" ) "OF" SimpleType =:
  
  PointerType := "POINTER" "TO"
                                Type
--- 1041,1048 ----
  
  -- end of the Silent constant rules
  
! SetType := ( "SET" | "PACKEDSET" ) "OF" SimpleType
!          =:
  
  PointerType := "POINTER" "TO"
                                Type
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/PathName.def gcc-16-20250921/gcc/m2/gm2-compiler/PathName.def
*** gcc-16-20250914/gcc/m2/gm2-compiler/PathName.def	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/PathName.def	Sun Sep 21 22:32:38 2025
***************
*** 1,13 ****
! DEFINITION MODULE PathName ;
  
! (*
!     Title      : PathName
!     Author     : Gaius Mulley
!     System     : GNU Modula-2
!     Date       : Wed Feb  8 09:59:46 2023
!     Revision   : $Version$
!     Description: maintains a dictionary of named paths.
! *)
  
  FROM DynamicStrings IMPORT String ;
  FROM DynamicPath IMPORT PathList ;
--- 1,25 ----
! (* PathName.def maintains a dictionary of named paths.
  
! Copyright (C) 2001-2023 Free Software Foundation, Inc.
! Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
! 
! This file is part of GNU Modula-2.
! 
! GNU Modula-2 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.
! 
! GNU Modula-2 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 GNU Modula-2; see the file COPYING3.  If not see
! <http://www.gnu.org/licenses/>.  *)
! 
! DEFINITION MODULE PathName ;
  
  FROM DynamicStrings IMPORT String ;
  FROM DynamicPath IMPORT PathList ;
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/PathName.mod gcc-16-20250921/gcc/m2/gm2-compiler/PathName.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/PathName.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/PathName.mod	Sun Sep 21 22:32:38 2025
***************
*** 1,5 ****
  (* M2PathName.mod maintain a dictionary of named paths.
- 
  Copyright (C) 2023-2025 Free Software Foundation, Inc.
  Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
  
--- 1,4 ----
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/SymbolConversion.mod gcc-16-20250921/gcc/m2/gm2-compiler/SymbolConversion.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/SymbolConversion.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/SymbolConversion.mod	Sun Sep 21 22:32:38 2025
*************** FROM SYSTEM IMPORT ADDRESS ;
*** 39,45 ****
  
  CONST
     USEPOISON = TRUE ;
!    GGCPOISON = 0A5A5A5A5H ;   (* poisoned memory contains this code *)
  
  TYPE
     PtrToCardinal = POINTER TO CARDINAL ;
--- 39,45 ----
  
  CONST
     USEPOISON = TRUE ;
!    GGCPOISON = 0A5A5A5A5H ;   (* Poisoned memory contains this code.  *)
  
  TYPE
     PtrToCardinal = POINTER TO CARDINAL ;
*************** TYPE
*** 47,52 ****
--- 47,84 ----
  VAR
     mod2gcc       : Index ;
     PoisonedSymbol: ADDRESS ;
+    BookSym       : CARDINAL ;     (* Allows interactive debugging.    *)
+ 
+ 
+ (*
+    gdbhook - a debugger convenience hook.
+ *)
+ 
+ PROCEDURE gdbhook ;
+ END gdbhook ;
+ 
+ 
+ (*
+    BreakWhenSymBooked - to be called interactively by gdb.
+ *)
+ 
+ PROCEDURE BreakWhenSymBooked (sym: CARDINAL) ;
+ BEGIN
+    BookSym := sym
+ END BreakWhenSymBooked ;
+ 
+ 
+ (*
+    CheckBook - if sym = BookSym then call gdbhook.
+ *)
+ 
+ PROCEDURE CheckBook (sym: CARDINAL) ;
+ BEGIN
+    IF sym = BookSym
+    THEN
+       gdbhook
+    END
+ END CheckBook ;
  
  
  (*
*************** VAR
*** 117,122 ****
--- 149,155 ----
     old: tree ;
     t  : PtrToCardinal ;
  BEGIN
+    CheckBook (sym) ;
     IF gcc=GetErrorNode()
     THEN
        InternalError ('error node generated during symbol conversion')
*************** END Poison ;
*** 258,263 ****
--- 291,308 ----
  
  PROCEDURE Init ;
  BEGIN
+    BreakWhenSymBooked (NulSym) ;  (* Disable the intereactive sym watch.  *)
+    (* To examine when a symbol is double booked run cc1gm2 from gdb
+       and set a break point on gdbhook.
+       (gdb) break gdbhook
+       (gdb) run
+       Now below interactively call BreakWhenSymBooked with the symbol
+       under investigation.  *)
+    gdbhook ;
+    (* Now is the time to interactively call gdb, for example:
+       (gdb) print BreakWhenSymBooked (1234)
+       (gdb) cont
+       and you will arrive at gdbhook when this symbol is booked.  *)
     mod2gcc := InitIndexTuned (1, 1024*1024 DIV 16, 16) ;
     ALLOCATE (PoisonedSymbol, 1)
  END Init ;
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/SymbolTable.def gcc-16-20250921/gcc/m2/gm2-compiler/SymbolTable.def
*** gcc-16-20250914/gcc/m2/gm2-compiler/SymbolTable.def	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/SymbolTable.def	Sun Sep 21 22:32:38 2025
*************** PROCEDURE MakeSet (tok: CARDINAL; SetNam
*** 581,586 ****
--- 581,621 ----
  
  
  (*
+    GetSetArray - return the set array for a large set.
+ *)
+ 
+ PROCEDURE GetSetArray (sym: CARDINAL) : CARDINAL ;
+ 
+ 
+ (*
+    PutSetArray - places array into the setarray field.
+ *)
+ 
+ PROCEDURE PutSetArray (Sym: CARDINAL; array: CARDINAL) ;
+ 
+ 
+ (*
+    MakeSetArray - create an ARRAY simpletype OF BOOLEAN.
+ *)
+ 
+ PROCEDURE MakeSetArray (token: CARDINAL; subrangetype: CARDINAL) : CARDINAL ;
+ 
+ 
+ (*
+    PutSetInWord - set the SetInWord boolean to value.
+ *)
+ 
+ PROCEDURE PutSetInWord (sym: CARDINAL; value: BOOLEAN) ;
+ 
+ 
+ (*
+    GetSetInWord - return SetInWord.
+ *)
+ 
+ PROCEDURE GetSetInWord (sym: CARDINAL) : BOOLEAN ;
+ 
+ 
+ (*
     MakeArray - makes an Array symbol with name ArrayName.
  *)
  
*************** PROCEDURE GetNthParamAnyClosest (sym: CA
*** 3496,3499 ****
--- 3531,3550 ----
                                   currentmodule: CARDINAL) : CARDINAL ;
  
  
+ (*
+    IsConstVar - returns TRUE if sym is a const var.  This is a
+                 constant which might be assigned to TRUE or FALSE
+                 depending upon the result of the quad stack control flow.
+                 Typically used in CONST foo = (a AND b) or similar.
+                 This symbol will only be assigned once with a value, but
+                 will appear more than once as a designator to an assignment
+                 in the quad table.  However as the quad table is reduced
+                 only one assignment will remain.  If after reducing quads
+                 two or more assignments remain, then there is an error
+                 as sym should not have been declared a constant.
+ *)
+ 
+ PROCEDURE IsConstVar (sym: CARDINAL) : BOOLEAN ;
+ 
+ 
  END SymbolTable.
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-compiler/SymbolTable.mod gcc-16-20250921/gcc/m2/gm2-compiler/SymbolTable.mod
*** gcc-16-20250914/gcc/m2/gm2-compiler/SymbolTable.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-compiler/SymbolTable.mod	Sun Sep 21 22:32:38 2025
*************** FROM SymbolKey IMPORT NulKey, SymbolTree
*** 80,88 ****
                        NoOfNodes ;
  
  FROM M2Base IMPORT MixTypes, MixTypesDecl, InitBase, Char, Integer, LongReal,
!                    Cardinal, LongInt, LongCard, ZType, RType ;
  
! FROM M2System IMPORT Address ;
  FROM m2expr IMPORT OverflowZType ;
  FROM gcctypes IMPORT tree ;
  FROM m2linemap IMPORT BuiltinsLocation ;
--- 80,88 ----
                        NoOfNodes ;
  
  FROM M2Base IMPORT MixTypes, MixTypesDecl, InitBase, Char, Integer, LongReal,
!                    Cardinal, LongInt, LongCard, Boolean, ZType, RType ;
  
! FROM M2System IMPORT Address, Byte ;
  FROM m2expr IMPORT OverflowZType ;
  FROM gcctypes IMPORT tree ;
  FROM m2linemap IMPORT BuiltinsLocation ;
*************** FROM M2Comp IMPORT CompilingDefinitionMo
*** 94,99 ****
--- 94,100 ----
  
  FROM FormatStrings IMPORT HandleEscape ;
  FROM M2Scaffold IMPORT DeclareArgEnvParams ;
+ FROM M2Diagnostic IMPORT Diagnostic, InitMemDiagnostic, MemIncr, MemSet ;
  
  FROM M2SymInit IMPORT InitDesc, InitSymInit, GetInitialized, ConfigSymInit,
                        SetInitialized, SetFieldInitialized, GetFieldInitialized,
*************** CONST
*** 107,112 ****
--- 108,114 ----
     DebugUnknownToken    =  FALSE ;   (* If enabled it will generate a warning every
                                          time a symbol is created with an unknown
                                          location.  *)
+    BreakNew             = 97 ;       (* -1 disables the break.  *)
  
     (*
        The Unbounded is a pseudo type used within the compiler
*************** TYPE
*** 653,658 ****
--- 655,663 ----
        	       	     	      	       	      (* (subrange or enumeration).  *)
                  packedInfo: PackedInfo ;      (* the equivalent packed type  *)
                  ispacked : BOOLEAN ;
+                 SetInWord: BOOLEAN ;          (* Is the set stored in a word? *)
+                 SetArray : CARDINAL ;         (* Array used for large sets.  *)
+                 Align    : CARDINAL ;         (* The alignment of this type  *)
                  Size     : PtrToValue ;       (* Runtime size of symbol.     *)
                  oafamily : CARDINAL ;         (* The oafamily for this sym   *)
                  Scope    : CARDINAL ;         (* Scope of declaration.       *)
*************** VAR
*** 933,938 ****
--- 938,944 ----
                                        (* errors.                            *)
     ConstLitArray     : Indexing.Index ;
     BreakSym          : CARDINAL ;     (* Allows interactive debugging.      *)
+    SymMemDiag        : Diagnostic ;   (* Contains memory related statistics *)
  
  
  (*
*************** BEGIN
*** 1080,1086 ****
     END ;
     PutIndice(Symbols, sym, pSym) ;
     CheckBreak (sym) ;
!    INC(FreeSymbol)
  END NewSym ;
  
  
--- 1086,1094 ----
     END ;
     PutIndice(Symbols, sym, pSym) ;
     CheckBreak (sym) ;
!    INC (FreeSymbol) ;
!    MemSet (SymMemDiag, 1, FreeSymbol-1) ;
!    MemIncr (SymMemDiag, 2, SIZE (pSym^))
  END NewSym ;
  
  
*************** PROCEDURE Init ;
*** 1683,1688 ****
--- 1691,1700 ----
  VAR
     pCall: PtrToCallFrame ;
  BEGIN
+    SymMemDiag
+       := InitMemDiagnostic
+             ('SymbolTable:Symbols',
+             '{0N} total symbols {1d} consuming {2M} ram {0M} ({2P})') ;
     BreakWhenSymCreated (NulSym) ;  (* Disable the intereactive sym watch.  *)
     (* To examine the symbol table when a symbol is created run cc1gm2 from gdb
        and set a break point on gdbhook.
*************** END MakeConstVar ;
*** 5404,5409 ****
--- 5416,5443 ----
  
  
  (*
+    IsConstVar - returns TRUE if sym is a const var.  This is a
+                 constant which might be assigned to TRUE or FALSE
+                 depending upon the result of the quad stack control flow.
+                 Typically used in CONST foo = (a AND b) or similar.
+                 This symbol will only be assigned once with a value, but
+                 will appear more than once as a designator to an assignment
+                 in the quad table.  However as the quad table is reduced
+                 only one assignment will remain.  If after reducing quads
+                 two or more assignments remain, then there is an error
+                 as sym should not have been declared a constant.
+ *)
+ 
+ PROCEDURE IsConstVar (sym: CARDINAL) : BOOLEAN ;
+ VAR
+    pSym: PtrToSymbol ;
+ BEGIN
+    pSym := GetPsym (sym) ;
+    RETURN( pSym^.SymbolType=ConstVarSym )
+ END IsConstVar ;
+ 
+ 
+ (*
     InitConstString - initialize the constant string.
  *)
  
*************** BEGIN
*** 5827,5833 ****
        VarSym:  RETURN Var.IsSSA
  
        ELSE
!          InternalError ('expecting a variable symbol')
        END
     END
  END IsVariableSSA ;
--- 5861,5867 ----
        VarSym:  RETURN Var.IsSSA
  
        ELSE
!          RETURN FALSE
        END
     END
  END IsVariableSSA ;
*************** BEGIN
*** 6391,6398 ****
              Size := InitValue() ;   (* Size of array.                      *)
              Offset := InitValue() ; (* Offset of array.                    *)
              Type := NulSym ;        (* The Array Type. ARRAY OF Type.      *)
  	    Large := FALSE ;        (* is this array large?                *)
-             Align := NulSym ;       (* The alignment of this type.         *)
              oafamily := oaf ;       (* The unbounded for this array        *)
              Scope := GetCurrentScope() ;        (* Which scope created it  *)
              InitWhereDeclaredTok(tok, At)   (* Declared here               *)
--- 6425,6432 ----
              Size := InitValue() ;   (* Size of array.                      *)
              Offset := InitValue() ; (* Offset of array.                    *)
              Type := NulSym ;        (* The Array Type. ARRAY OF Type.      *)
+             Align := NulSym ;       (* Alignment of this type.     *)
  	    Large := FALSE ;        (* is this array large?                *)
              oafamily := oaf ;       (* The unbounded for this array        *)
              Scope := GetCurrentScope() ;        (* Which scope created it  *)
              InitWhereDeclaredTok(tok, At)   (* Declared here               *)
*************** END GetNthParamChoice ;
*** 6992,7010 ****
  
  PROCEDURE GetNthParamOrdered (sym: CARDINAL; ParamNo: CARDINAL;
                                a, b, c: ProcedureKind) : CARDINAL ;
- VAR
-    param: CARDINAL ;
  BEGIN
!    param := GetNthParamChoice (sym, ParamNo, a) ;
!    IF param = NulSym
     THEN
!       param := GetNthParamChoice (sym, ParamNo, b) ;
!       IF param = NulSym
        THEN
!          param := GetNthParamChoice (sym, ParamNo, c)
        END
-    END ;
-    RETURN param
  END GetNthParamOrdered ;
  
  
--- 7026,7044 ----
  
  PROCEDURE GetNthParamOrdered (sym: CARDINAL; ParamNo: CARDINAL;
                                a, b, c: ProcedureKind) : CARDINAL ;
  BEGIN
!    IF GetProcedureParametersDefined (sym, a)
     THEN
!       RETURN GetNthParamChoice (sym, ParamNo, a)
!    ELSIF GetProcedureParametersDefined (sym, b)
!    THEN
!       RETURN GetNthParamChoice (sym, ParamNo, b)
!    ELSIF GetProcedureParametersDefined (sym, c)
        THEN
!       RETURN GetNthParamChoice (sym, ParamNo, c)
!    ELSE
!       RETURN NulSym
        END
  END GetNthParamOrdered ;
  
  
*************** END GetNthParamOrdered ;
*** 7023,7028 ****
--- 7057,7066 ----
  PROCEDURE GetNthParamAnyClosest (sym: CARDINAL; ParamNo: CARDINAL;
                                   currentmodule: CARDINAL) : CARDINAL ;
  BEGIN
+    IF IsUnknown (sym)
+    THEN
+       InternalError (__FILE__ + ":" + __FUNCTION__ + ":not expecting an unknown symbol")
+    END ;
     IF GetOuterModuleScope (currentmodule) = GetOuterModuleScope (sym)
     THEN
        (* Same module.  *)
*************** END GetNthParamAnyClosest ;
*** 7042,7052 ****
  
  PROCEDURE GetOuterModuleScope (sym: CARDINAL) : CARDINAL ;
  BEGIN
!    WHILE NOT (IsDefImp (sym) OR
!               (IsModule (sym) AND (GetScope (sym) = NulSym))) DO
!       sym := GetScope (sym)
!    END ;
     RETURN sym
  END GetOuterModuleScope ;
  
  
--- 7080,7101 ----
  
  PROCEDURE GetOuterModuleScope (sym: CARDINAL) : CARDINAL ;
  BEGIN
!    REPEAT
!       IF IsDefImp (sym)
!       THEN
!          (* Definition/implementation module.  *)
     RETURN sym
+       ELSIF IsModule (sym)
+       THEN
+          IF GetScope (sym) = NulSym
+          THEN
+             (* Outer module.  *)
+             RETURN sym
+          END
+       END ;
+       sym := GetScope (sym)
+    UNTIL sym = NulSym ;
+    InternalError ('not expecting to reach an outer scope')
  END GetOuterModuleScope ;
  
  
*************** BEGIN
*** 11857,11866 ****
        CASE SymbolType OF
  
        ErrorSym      : n := 0 |
- (*
-       ArraySym      ,
-       UnboundedSym  : n := 1 |   (* Standard language limitation *)
- *)
        EnumerationSym: n := pSym^.Enumeration.NoOfElements |
        InterfaceSym  : n := HighIndice(Interface.Parameters)
  
--- 11906,11911 ----
*************** BEGIN
*** 11995,12000 ****
--- 12040,12049 ----
              InitPacked(packedInfo) ;        (* not packed and no      *)
                                              (* equivalent (yet).      *)
              ispacked := FALSE ;        (* Not yet known to be packed. *)
+             SetInWord := TRUE ;        (* Can the set be stored in a  *)
+                                        (* single word?                *)
+             SetArray := NulSym ;       (* Set used for large sets.    *)
+             Align := NulSym ;
              oafamily := oaf ;          (* The unbounded sym for this  *)
              Scope := GetCurrentScope() ;    (* Which scope created it *)
              InitWhereDeclaredTok(tok, At)   (* Declared here          *)
*************** END PutSet ;
*** 12032,12037 ****
--- 12081,12126 ----
  
  
  (*
+    PutSetArray - places array into the setarray field.
+ *)
+ 
+ PROCEDURE PutSetArray (Sym: CARDINAL; array: CARDINAL) ;
+ VAR
+    pSym: PtrToSymbol ;
+ BEGIN
+    pSym := GetPsym(Sym) ;
+    WITH pSym^ DO
+       CASE SymbolType OF
+ 
+       ErrorSym: |
+       SetSym: WITH Set DO
+                  SetArray := array
+               END
+       ELSE
+          InternalError ('expecting a Set symbol')
+       END
+    END
+ END PutSetArray ;
+ 
+ 
+ (*
+    MakeSetArray - create an ARRAY simpletype OF BOOLEAN.
+ *)
+ 
+ PROCEDURE MakeSetArray (token: CARDINAL; subrangetype: CARDINAL) : CARDINAL ;
+ VAR
+    array, subscript: CARDINAL ;
+ BEGIN
+    array := MakeArray (token, NulSym) ;
+    PutArray (array, Byte) ;
+    subscript := MakeSubscript () ;
+    PutSubscript (subscript, subrangetype) ;
+    PutArraySubscript (array, subscript) ;
+    RETURN array
+ END MakeSetArray ;
+ 
+ 
+ (*
     IsSet - returns TRUE if Sym is a set symbol.
  *)
  
*************** END IsSetPacked ;
*** 12060,12065 ****
--- 12149,12225 ----
  
  
  (*
+    GetSetArray - return the set array for a large set.
+ *)
+ 
+ PROCEDURE GetSetArray (sym: CARDINAL) : CARDINAL ;
+ VAR
+    pSym: PtrToSymbol ;
+ BEGIN
+    AssertInRange (sym) ;
+    pSym := GetPsym (sym) ;
+    WITH pSym^ DO
+       CASE SymbolType OF
+ 
+       SetSym: RETURN Set.SetArray
+ 
+       ELSE
+          RETURN NulSym
+       END
+    END
+ END GetSetArray ;
+ 
+ 
+ (*
+    PutSetInWord - set the SetInWord boolean to value.
+ *)
+ 
+ PROCEDURE PutSetInWord (sym: CARDINAL; value: BOOLEAN) ;
+ VAR
+    pSym: PtrToSymbol ;
+ BEGIN
+    AssertInRange (sym) ;
+    pSym := GetPsym (sym) ;
+    WITH pSym^ DO
+       CASE SymbolType OF
+ 
+       SetSym: Set.SetInWord := value ;
+               IF value
+               THEN
+                  Set.Align := MakeConstant (GetDeclaredMod (sym), 0) ;
+                  Set.ispacked := TRUE
+               END
+ 
+       ELSE
+          InternalError ('expecting a set symbol')
+       END
+    END
+ END PutSetInWord ;
+ 
+ 
+ (*
+    GetSetInWord - return SetInWord.
+ *)
+ 
+ PROCEDURE GetSetInWord (sym: CARDINAL) : BOOLEAN ;
+ VAR
+    pSym: PtrToSymbol ;
+ BEGIN
+    AssertInRange (sym) ;
+    pSym := GetPsym (sym) ;
+    WITH pSym^ DO
+       CASE SymbolType OF
+ 
+       SetSym: RETURN Set.SetInWord
+ 
+       ELSE
+          InternalError ('expecting a Set symbol')
+       END
+    END
+ END GetSetInWord ;
+ 
+ 
+ (*
     ForeachParameterDo -
  *)
  
*************** BEGIN
*** 12742,12750 ****
           type := SkipType(GetType(subscript)) ;
           IF IsAModula2Type(type)
           THEN
!             (* ok all is good *)
           ELSE
!             MetaError2('the array {%1Dad} must be declared with a simpletype in the [..] component rather than a {%2d}',
                         sym, type)
           END
        END
--- 12902,12910 ----
           type := SkipType(GetType(subscript)) ;
           IF IsAModula2Type(type)
           THEN
!             (* Ok all is good.  *)
           ELSE
!             MetaError2('the array {%1Dad} must be declared with a simpletype in the [..] component rather than a {%2dv}',
                         sym, type)
           END
        END
*************** BEGIN
*** 15166,15174 ****
        RecordSym     :  Record.Align := align |
        RecordFieldSym:  RecordField.Align := align |
        TypeSym       :  Type.Align := align |
-       ArraySym      :  Array.Align := align |
        PointerSym    :  Pointer.Align := align |
!       SubrangeSym   :  Subrange.Align := align
  
        ELSE
           InternalError ('expecting record, field, pointer, type, subrange or an array symbol')
--- 15326,15335 ----
        RecordSym     :  Record.Align := align |
        RecordFieldSym:  RecordField.Align := align |
        TypeSym       :  Type.Align := align |
        PointerSym    :  Pointer.Align := align |
!       SubrangeSym   :  Subrange.Align := align |
!       SetSym        :  Set.Align := align |
!       ArraySym      :  Array.Align := align
  
        ELSE
           InternalError ('expecting record, field, pointer, type, subrange or an array symbol')
*************** BEGIN
*** 15193,15203 ****
        RecordSym      :  RETURN( Record.Align ) |
        RecordFieldSym :  RETURN( RecordField.Align ) |
        TypeSym        :  RETURN( Type.Align ) |
-       ArraySym       :  RETURN( Array.Align ) |
        PointerSym     :  RETURN( Pointer.Align ) |
        VarientFieldSym:  RETURN( GetAlignment(VarientField.Parent) ) |
        VarientSym     :  RETURN( GetAlignment(Varient.Parent) ) |
!       SubrangeSym    :  RETURN( Subrange.Align )
  
        ELSE
           InternalError ('expecting record, field, pointer, type, subrange or an array symbol')
--- 15354,15365 ----
        RecordSym      :  RETURN( Record.Align ) |
        RecordFieldSym :  RETURN( RecordField.Align ) |
        TypeSym        :  RETURN( Type.Align ) |
        PointerSym     :  RETURN( Pointer.Align ) |
        VarientFieldSym:  RETURN( GetAlignment(VarientField.Parent) ) |
        VarientSym     :  RETURN( GetAlignment(Varient.Parent) ) |
!       SubrangeSym    :  RETURN( Subrange.Align ) |
!       SetSym         :  RETURN( Set.Align ) |
!       ArraySym       :  RETURN( Array.Align )
  
        ELSE
           InternalError ('expecting record, field, pointer, type, subrange or an array symbol')
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/init.cc gcc-16-20250921/gcc/m2/gm2-gcc/init.cc
*** gcc-16-20250914/gcc/m2/gm2-gcc/init.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/init.cc	Sun Sep 21 22:32:38 2025
*************** EXTERN void _M2_M2SSA_init (int argc, ch
*** 107,112 ****
--- 107,113 ----
  EXTERN void _M2_M2SymInit_init (int argc, char *argv[], char *envp[]);
  EXTERN void _M2_M2StateCheck_init (int argc, char *argv[], char *envp[]);
  EXTERN void _M2_P3Build_init (int argc, char *argv[], char *envp[]);
+ EXTERN void _M2_M2Diagnostic_init (int argc, char *argv[], char *envp[]);
  EXTERN void exit (int);
  EXTERN void M2Comp_compile (const char *filename);
  EXTERN void RTExceptions_DefaultErrorCatch (void);
*************** init_FrontEndInit (void)
*** 126,131 ****
--- 127,133 ----
    _M2_M2Dependent_init (0, NULL, NULL);
    _M2_M2RTS_init (0, NULL, NULL);
    _M2_SysExceptions_init (0, NULL, NULL);
+   _M2_M2Diagnostic_init (0, NULL, NULL);
    _M2_DynamicStrings_init (0, NULL, NULL);
    _M2_Assertion_init (0, NULL, NULL);
    _M2_FormatStrings_init (0, NULL, NULL);
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2block.cc gcc-16-20250921/gcc/m2/gm2-gcc/m2block.cc
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2block.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2block.cc	Sun Sep 21 22:32:38 2025
*************** typedef struct stmt_tree_s *stmt_tree_t;
*** 115,120 ****
--- 115,136 ----
  static location_t pending_location;
  static int pending_statement = false;
  
+ /* GetTotalConstants returns the number of global constants.  */
+ 
+ int
+ m2block_GetTotalConstants (void)
+ {
+   return m2treelib_nCount (global_binding_level->constants);
+ }
+ 
+ /* GetGlobalTypes returns the number of global types.  */
+ 
+ int
+ m2block_GetGlobalTypes (void)
+ {
+   return m2treelib_nCount (global_binding_level->types);
+ }
+ 
  /* assert_global_names asserts that the global_binding_level->names
     can be chained.  */
  
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2block.def gcc-16-20250921/gcc/m2/gm2-gcc/m2block.def
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2block.def	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2block.def	Sun Sep 21 22:32:38 2025
*************** PROCEDURE addStmtNote (location: locatio
*** 220,223 ****
--- 220,237 ----
  PROCEDURE removeStmtNote ;
  
  
+ (*
+    GetTotalConstants - returns the number of global constants.
+ *)
+ 
+ PROCEDURE GetTotalConstants () : CARDINAL ;
+ 
+ 
+ (*
+    GetGlobalTypes - returns the number of global types.
+ *)
+ 
+ PROCEDURE GetGlobalTypes () : CARDINAL ;
+ 
+ 
  END m2block.
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2block.h gcc-16-20250921/gcc/m2/gm2-gcc/m2block.h
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2block.h	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2block.h	Sun Sep 21 22:32:38 2025
*************** EXTERN void m2block_includeDecl (tree);
*** 72,77 ****
--- 72,79 ----
  EXTERN tree m2block_add_stmt (location_t location, tree t);
  EXTERN void m2block_addStmtNote (location_t location);
  EXTERN void m2block_removeStmtNote (void);
+ EXTERN int m2block_GetTotalConstants (void);
+ EXTERN int m2block_GetGlobalTypes (void);
  
  EXTERN void m2block_init (void);
  
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2convert.cc gcc-16-20250921/gcc/m2/gm2-gcc/m2convert.cc
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2convert.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2convert.cc	Sun Sep 21 22:32:38 2025
*************** same_size_types (location_t location, tr
*** 344,349 ****
--- 344,360 ----
    return m2expr_CompareTrees (n1, n2) == 0;
  }
  
+ /* converting_ISO_generic attempts to convert value to type and returns true
+    if successful.  This is a helper function to BuildConvert which will try
+    each generic data type in turn.
+ 
+    generic_type will be set to any of ISO BYTE, PIM BYTE WORD, etc.
+    If type == generic_type then specific conversion procedures
+    are applied.  A constant will be converted via const_to_ISO_type
+    whereas non constants are converted by *(type *) &value.
+ 
+    Remember that in ISO M2 BYTE is an ARRAY [0..0] OF LOC.  */
+ 
  static int
  converting_ISO_generic (location_t location, tree type, tree value,
                          tree generic_type, tree *result)
*************** converting_ISO_generic (location_t locat
*** 354,364 ****
      /* We let the caller deal with this.  */
      return false;
  
!   if ((TREE_CODE (value) == INTEGER_CST) && (type == generic_type))
      {
        *result = const_to_ISO_type (location, value, generic_type);
        return true;
      }
  
    if (same_size_types (location, type, value_type))
      {
--- 365,381 ----
      /* We let the caller deal with this.  */
      return false;
  
!   if (TREE_CODE (value) == INTEGER_CST)
!     {
!       if (type == generic_type)
      {
        *result = const_to_ISO_type (location, value, generic_type);
        return true;
      }
+       /* We must not attempt to convert a constant by taking its
+ 	 address below, so we bail out here.  */
+       return false;
+     }
  
    if (same_size_types (location, type, value_type))
      {
*************** converting_ISO_generic (location_t locat
*** 382,389 ****
    return false;
  }
  
! /* convert_char_to_array - convert a single char, value, into an
!    type.  The type will be array [..] of char.  The array type
     returned will have nuls appended to pad the single char to the
     correct array length.  */
  
--- 399,406 ----
    return false;
  }
  
! /* convert_char_to_array convert a single char value into a type.
!    The type will be array [..] of char.  The array type
     returned will have nuls appended to pad the single char to the
     correct array length.  */
  
*************** m2convert_ToLoc (location_t location, tr
*** 638,643 ****
--- 655,669 ----
                                   false);
  }
  
+ /* ToPIMByte - convert an expression expr to a PIM BYTE.  */
+ 
+ tree
+ m2convert_ToPIMByte (location_t location, tree expr)
+ {
+   return m2convert_BuildConvert (location, m2type_GetByteType (), expr,
+                                  false);
+ }
+ 
  /* GenericToType - converts, expr, into, type, providing that expr is
     a generic system type (byte, word etc).  Otherwise expr is
     returned unaltered.  */
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2convert.def gcc-16-20250921/gcc/m2/gm2-gcc/m2convert.def
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2convert.def	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2convert.def	Sun Sep 21 22:32:38 2025
*************** PROCEDURE ToBitset (location: location_t
*** 54,59 ****
--- 54,73 ----
  
  
  (*
+    ToLoc - convert an expression, expr, to a LOC.
+ *)
+ 
+ PROCEDURE ToLoc (location: location_t; expr: tree) : tree ;
+ 
+ 
+ (*
+    ToPIMByte - convert an expression expr to a PIM BYTE.
+ *)
+ 
+ PROCEDURE ToPIMByte (location: location_t; expr: tree) : tree ;
+ 
+ 
+ (*
     ConvertToPtr - convert an expression to a void *.
  *)
  
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2convert.h gcc-16-20250921/gcc/m2/gm2-gcc/m2convert.h
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2convert.h	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2convert.h	Sun Sep 21 22:32:38 2025
*************** EXTERN tree m2convert_ToInteger (locatio
*** 47,52 ****
--- 47,54 ----
  EXTERN tree m2convert_ToWord (location_t location, tree expr);
  EXTERN tree m2convert_ToBitset (location_t location, tree expr);
  EXTERN tree m2convert_ToLoc (location_t location, tree expr);
+ EXTERN tree m2convert_ToPIMByte (location_t location, tree expr);
+ 
  EXTERN tree m2convert_GenericToType (location_t location, tree type,
                                       tree expr);
  
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2decl.h gcc-16-20250921/gcc/m2/gm2-gcc/m2decl.h
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2decl.h	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2decl.h	Sun Sep 21 22:32:38 2025
*************** EXTERN tree m2decl_BuildConstLiteralNumb
*** 51,57 ****
  					    const char *str,
                                              unsigned int base,
  					    bool issueError);
- EXTERN void m2decl_RememberVariables (tree l);
  
  EXTERN tree m2decl_BuildEndFunctionDeclaration (
      location_t location_begin, location_t location_end, const char *name,
--- 51,56 ----
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2expr.cc gcc-16-20250921/gcc/m2/gm2-gcc/m2expr.cc
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2expr.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2expr.cc	Sun Sep 21 22:32:38 2025
*************** m2expr_BuildLogicalShift (location_t loc
*** 598,604 ****
                                             m2convert_ToInteger (location, op3),
                                             m2expr_GetIntegerZero (location));
  
!       m2statement_DoJump (location, is_less, NULL, labelElseName);
        op2 = m2convert_ToWord (location, op2);
        op3 = m2convert_ToWord (location, op3);
        res = m2expr_BuildLSL (location, op2, op3, needconvert);
--- 598,604 ----
                                             m2convert_ToInteger (location, op3),
                                             m2expr_GetIntegerZero (location));
  
!       m2statement_IfExprJump (location, is_less, labelElseName);
        op2 = m2convert_ToWord (location, op2);
        op3 = m2convert_ToWord (location, op3);
        res = m2expr_BuildLSL (location, op2, op3, needconvert);
*************** m2expr_BuildLRotate (location_t location
*** 673,679 ****
  
    op1 = m2expr_FoldAndStrip (op1);
    nBits = m2expr_FoldAndStrip (nBits);
!   nBits = m2convert_BuildConvert (location, TREE_TYPE (op1), nBits, needconvert);  
    t = m2expr_build_binary_op (location, LROTATE_EXPR, op1, nBits, needconvert);
    return m2expr_FoldAndStrip (t);
  }
--- 673,679 ----
  
    op1 = m2expr_FoldAndStrip (op1);
    nBits = m2expr_FoldAndStrip (nBits);
!   nBits = m2convert_BuildConvert (location, TREE_TYPE (op1), nBits, needconvert);
    t = m2expr_build_binary_op (location, LROTATE_EXPR, op1, nBits, needconvert);
    return m2expr_FoldAndStrip (t);
  }
*************** m2expr_BuildLRLn (location_t location, t
*** 724,738 ****
  
        /* Make absolutely sure there are no high order bits lying around.  */
  
!       op1 = m2expr_BuildLogicalAnd (location, op1, mask, needconvert);
        left = m2expr_BuildLSL (location, op1, op2min, needconvert);
!       left = m2expr_BuildLogicalAnd (location, left, mask, needconvert);
        right = m2expr_BuildLSR (
            location, op1,
            m2expr_BuildSub (location, m2convert_ToCardinal (location, nBits),
                             op2min, needconvert),
            needconvert);
!       return m2expr_BuildLogicalOr (location, left, right, needconvert);
      }
  }
  
--- 724,738 ----
  
        /* Make absolutely sure there are no high order bits lying around.  */
  
!       op1 = m2expr_BuildLogicalAnd (location, op1, mask);
        left = m2expr_BuildLSL (location, op1, op2min, needconvert);
!       left = m2expr_BuildLogicalAnd (location, left, mask);
        right = m2expr_BuildLSR (
            location, op1,
            m2expr_BuildSub (location, m2convert_ToCardinal (location, nBits),
                             op2min, needconvert),
            needconvert);
!       return m2expr_BuildLogicalOr (location, left, right);
      }
  }
  
*************** m2expr_BuildLRRn (location_t location, t
*** 765,779 ****
  
        /* Make absolutely sure there are no high order bits lying around.  */
  
!       op1 = m2expr_BuildLogicalAnd (location, op1, mask, needconvert);
        right = m2expr_BuildLSR (location, op1, op2min, needconvert);
        left = m2expr_BuildLSL (
            location, op1,
            m2expr_BuildSub (location, m2convert_ToCardinal (location, nBits),
                             op2min, needconvert),
            needconvert);
!       left = m2expr_BuildLogicalAnd (location, left, mask, needconvert);
!       return m2expr_BuildLogicalOr (location, left, right, needconvert);
      }
  }
  
--- 765,779 ----
  
        /* Make absolutely sure there are no high order bits lying around.  */
  
!       op1 = m2expr_BuildLogicalAnd (location, op1, mask);
        right = m2expr_BuildLSR (location, op1, op2min, needconvert);
        left = m2expr_BuildLSL (
            location, op1,
            m2expr_BuildSub (location, m2convert_ToCardinal (location, nBits),
                             op2min, needconvert),
            needconvert);
!       left = m2expr_BuildLogicalAnd (location, left, mask);
!       return m2expr_BuildLogicalOr (location, left, right);
      }
  }
  
*************** m2expr_BuildLogicalRotate (location_t lo
*** 807,813 ****
        tree is_less = m2expr_BuildLessThan (location, rotateCount,
                                             m2expr_GetIntegerZero (location));
  
!       m2statement_DoJump (location, is_less, NULL, labelElseName);
        res = m2expr_BuildLRLn (location, op2, rotateCount, nBits, needconvert);
        m2statement_BuildAssignmentTree (location, op1, res);
        m2statement_BuildGoto (location, labelEndName);
--- 807,813 ----
        tree is_less = m2expr_BuildLessThan (location, rotateCount,
                                             m2expr_GetIntegerZero (location));
  
!       m2statement_IfExprJump (location, is_less, labelElseName);
        res = m2expr_BuildLRLn (location, op2, rotateCount, nBits, needconvert);
        m2statement_BuildAssignmentTree (location, op1, res);
        m2statement_BuildGoto (location, labelEndName);
*************** m2expr_BuildLogicalRotate (location_t lo
*** 819,957 ****
      }
  }
  
! /* buildUnboundedArrayOf construct an unbounded struct and returns
!    the gcc tree.  The two fields of the structure are initialized to
!    contentsPtr and high.  */
  
  static tree
! buildUnboundedArrayOf (tree unbounded, tree contentsPtr, tree high)
  {
!   tree fields = TYPE_FIELDS (unbounded);
!   tree field_list = NULL_TREE;
!   tree constructor;
! 
!   field_list = tree_cons (fields, contentsPtr, field_list);
!   fields = TREE_CHAIN (fields);
! 
!   field_list = tree_cons (fields, high, field_list);
! 
!   constructor = build_constructor_from_list (unbounded, nreverse (field_list));
!   TREE_CONSTANT (constructor) = 0;
!   TREE_STATIC (constructor) = 0;
! 
!   return constructor;
  }
  
! /* BuildBinarySetDo if the size of the set is <= TSIZE(WORD) then op1
!    := binop(op2, op3) else call m2rtsprocedure(op1, op2, op3).  */
  
! void
! m2expr_BuildBinarySetDo (location_t location, tree settype, tree op1, tree op2,
!                          tree op3, void (*binop) (location_t, tree, tree, tree,
!                                                   tree, bool),
!                          bool is_op1lvalue, bool is_op2lvalue, bool is_op3lvalue,
!                          tree nBits, tree unbounded, tree varproc,
!                          tree leftproc, tree rightproc)
  {
-   tree size = m2expr_GetSizeOf (location, settype);
-   bool is_const = false;
-   bool is_left = false;
- 
    m2assert_AssertLocation (location);
  
!   ASSERT_BOOL (is_op1lvalue);
!   ASSERT_BOOL (is_op2lvalue);
!   ASSERT_BOOL (is_op3lvalue);
! 
!   if (m2expr_CompareTrees (
!           size, m2decl_BuildIntegerConstant (SET_WORD_SIZE / BITS_PER_UNIT))
!       <= 0)
!     /* Small set size <= TSIZE(WORD).  */
!     (*binop) (location,
!               m2treelib_get_rvalue (location, op1, settype, is_op1lvalue),
!               m2treelib_get_rvalue (location, op2, settype, is_op2lvalue),
!               m2treelib_get_rvalue (location, op3, settype, is_op3lvalue),
!               nBits, false);
!   else
!     {
!       tree result;
!       tree high = m2expr_BuildSub (
!           location,
!           m2convert_ToCardinal (
!               location,
!               m2expr_BuildDivTrunc (
!                   location, size,
!                   m2expr_GetSizeOf (location, m2type_GetBitsetType ()),
!                   false)),
!           m2expr_GetCardinalOne (location), false);
! 
!       /* If op3 is constant then make op3 positive and remember which
!       direction we are shifting.  */
! 
!       op3 = m2tree_skip_const_decl (op3);
!       if (TREE_CODE (op3) == INTEGER_CST)
!         {
!           is_const = true;
!           if (tree_int_cst_sgn (op3) < 0)
!             op3 = m2expr_BuildNegate (location, op3, false);
!           else
!             is_left = true;
!           op3 = m2convert_BuildConvert (location, m2type_GetM2CardinalType (),
!                                         op3, false);
!         }
! 
!       /* These parameters must match the prototypes of the procedures:
! 	 ShiftLeft, ShiftRight, ShiftVal, RotateLeft, RotateRight, RotateVal
! 	 inside gm2-iso/SYSTEM.mod.  */
! 
!       /* Remember we must build the parameters in reverse.  */
! 
!       /* Parameter 4 amount.  */
!       m2statement_BuildParam (
!           location,
!           m2convert_BuildConvert (
!               location, m2type_GetM2IntegerType (),
!               m2treelib_get_rvalue (location, op3,
!                                     m2tree_skip_type_decl (TREE_TYPE (op3)),
!                                     is_op3lvalue),
!               false));
! 
!       /* Parameter 3 nBits.  */
!       m2statement_BuildParam (
!           location,
!           m2convert_BuildConvert (location, m2type_GetM2CardinalType (),
!                                   m2expr_FoldAndStrip (nBits), false));
  
!       /* Parameter 2 destination set.  */
!       m2statement_BuildParam (
!           location,
!           buildUnboundedArrayOf (
!               unbounded,
!               m2treelib_get_set_address (location, op1, is_op1lvalue), high));
  
!       /* Parameter 1 source set.  */
!       m2statement_BuildParam (
!           location,
!           buildUnboundedArrayOf (
!               unbounded,
!               m2treelib_get_set_address (location, op2, is_op2lvalue), high));
  
!       /* Now call the appropriate procedure inside SYSTEM.mod.  */
!       if (is_const)
!         if (is_left)
!           result = m2statement_BuildProcedureCallTree (location, leftproc,
!                                                        NULL_TREE);
!         else
!           result = m2statement_BuildProcedureCallTree (location, rightproc,
!                                                        NULL_TREE);
!       else
!         result = m2statement_BuildProcedureCallTree (location, varproc,
!                                                      NULL_TREE);
!       add_stmt (location, result);
!     }
  }
  
! /* Print a warning if a constant expression had overflow in folding.
     Invoke this function on every expression that the language requires
     to be a constant expression.  */
  
--- 819,861 ----
      }
  }
  
! /* BuildIfBitInSetLower returns tree ((set >> bit) & 1).  It converts set and bit to
!    type word prior to the bit test.  */
  
  static tree
! BuildIfBitInSetLower (location_t location, enum tree_code code, tree set, tree bit)
  {
!   set = m2convert_ToWord (location, set);
!   bit = m2convert_ToWord (location, bit);
!   set = m2expr_BuildLSR (location, set, bit, false);
!   return m2expr_build_binary_op (location, code,
! 				 m2expr_build_binary_op (location,
! 							 BIT_AND_EXPR, set,
! 							 m2expr_GetWordOne (location), false),
! 				 m2expr_GetWordZero (location), FALSE);
  }
  
! /* BuildIfInSet returns tree (bit IN set).  */
  
! tree
! m2expr_BuildIfInSet (location_t location, tree set, tree bit)
  {
    m2assert_AssertLocation (location);
  
!   return BuildIfBitInSetLower (location, NE_EXPR, set, bit);
! }
  
! /* BuildIfInSet returns tree (NOT (bit IN set)).  */
  
! tree
! m2expr_BuildIfNotInSet (location_t location, tree set, tree bit)
! {
!   m2assert_AssertLocation (location);
  
!   return BuildIfBitInSetLower (location, EQ_EXPR, set, bit);
  }
  
! /* Print a warning if a constant expression caused overflow in folding.
     Invoke this function on every expression that the language requires
     to be a constant expression.  */
  
*************** m2expr_Build4LogicalOr (location_t locat
*** 1463,1473 ****
                          tree op4)
  {
    tree t1 = m2expr_FoldAndStrip (
!       m2expr_BuildLogicalOr (location, op1, op2, false));
    tree t2
!       = m2expr_FoldAndStrip (m2expr_BuildLogicalOr (location, t1, op3, false));
    return m2expr_FoldAndStrip (
!       m2expr_BuildLogicalOr (location, t2, op4, false));
  }
  
  /* checkWholeMultOverflow - check to see whether i * j will overflow
--- 1367,1377 ----
                          tree op4)
  {
    tree t1 = m2expr_FoldAndStrip (
!       m2expr_BuildLogicalOr (location, op1, op2));
    tree t2
!       = m2expr_FoldAndStrip (m2expr_BuildLogicalOr (location, t1, op3));
    return m2expr_FoldAndStrip (
!       m2expr_BuildLogicalOr (location, t2, op4));
  }
  
  /* checkWholeMultOverflow - check to see whether i * j will overflow
*************** m2expr_BuildNegate (location_t location,
*** 2697,2711 ****
  /* BuildSetNegate build a set negate expression and returns the tree.  */
  
  tree
! m2expr_BuildSetNegate (location_t location, tree op1, bool needconvert)
  {
    m2assert_AssertLocation (location);
  
    return m2expr_build_binary_op (
        location, BIT_XOR_EXPR,
        m2convert_BuildConvert (location, m2type_GetWordType (),
!                               m2expr_FoldAndStrip (op1), false),
!       set_full_complement, needconvert);
  }
  
  /* BuildMult build a multiplication tree.  */
--- 2601,2615 ----
  /* BuildSetNegate build a set negate expression and returns the tree.  */
  
  tree
! m2expr_BuildSetNegate (location_t location, tree value)
  {
    m2assert_AssertLocation (location);
  
    return m2expr_build_binary_op (
        location, BIT_XOR_EXPR,
        m2convert_BuildConvert (location, m2type_GetWordType (),
!                               m2expr_FoldAndStrip (value), false),
!       set_full_complement, false);
  }
  
  /* BuildMult build a multiplication tree.  */
*************** m2expr_BuildOffset (location_t location,
*** 2984,3056 ****
  /* BuildLogicalOrAddress build a logical or expressions and return the tree. */
  
  tree
! m2expr_BuildLogicalOrAddress (location_t location, tree op1, tree op2,
!                               bool needconvert)
  {
    m2assert_AssertLocation (location);
!   return m2expr_build_binary_op (location, BIT_IOR_EXPR, op1, op2,
!                                  needconvert);
  }
  
  /* BuildLogicalOr build a logical or expressions and return the tree.  */
  
  tree
! m2expr_BuildLogicalOr (location_t location, tree op1, tree op2,
!                        bool needconvert)
  {
    m2assert_AssertLocation (location);
    return m2expr_build_binary_op (
        location, BIT_IOR_EXPR,
        m2convert_BuildConvert (location, m2type_GetWordType (), op1, false),
        m2convert_BuildConvert (location, m2type_GetWordType (), op2, false),
!       needconvert);
  }
  
  /* BuildLogicalAnd build a logical and expression and return the tree.  */
  
  tree
! m2expr_BuildLogicalAnd (location_t location, tree op1, tree op2,
!                         bool needconvert)
  {
    m2assert_AssertLocation (location);
    return m2expr_build_binary_op (
        location, BIT_AND_EXPR,
        m2convert_BuildConvert (location, m2type_GetWordType (), op1, false),
        m2convert_BuildConvert (location, m2type_GetWordType (), op2, false),
!       needconvert);
  }
  
  /* BuildSymmetricalDifference build a logical xor expression and return the
!  * tree.  */
  
  tree
! m2expr_BuildSymmetricDifference (location_t location, tree op1, tree op2,
!                                  bool needconvert)
  {
    m2assert_AssertLocation (location);
    return m2expr_build_binary_op (
        location, BIT_XOR_EXPR,
!       m2convert_BuildConvert (location, m2type_GetWordType (), op1, false),
!       m2convert_BuildConvert (location, m2type_GetWordType (), op2, false),
!       needconvert);
  }
  
! /* BuildLogicalDifference build a logical difference expression and
! return the tree.  (op1 and (not op2)).  */
  
  tree
! m2expr_BuildLogicalDifference (location_t location, tree op1, tree op2,
!                                bool needconvert)
  {
    m2assert_AssertLocation (location);
    return m2expr_build_binary_op (
        location, BIT_AND_EXPR,
!       m2convert_BuildConvert (location, m2type_GetWordType (), op1, false),
!       m2expr_BuildSetNegate (location, op2, needconvert), needconvert);
  }
  
  /* base_type returns the base type of an ordinal subrange, or the
! type itself if it is not a subrange.  */
  
  static tree
  base_type (tree type)
--- 2888,2954 ----
  /* BuildLogicalOrAddress build a logical or expressions and return the tree. */
  
  tree
! m2expr_BuildLogicalOrAddress (location_t location, tree op1, tree op2)
  {
    m2assert_AssertLocation (location);
!   return m2expr_build_binary_op (location, BIT_IOR_EXPR, op1, op2, false);
  }
  
  /* BuildLogicalOr build a logical or expressions and return the tree.  */
  
  tree
! m2expr_BuildLogicalOr (location_t location, tree op1, tree op2)
  {
    m2assert_AssertLocation (location);
    return m2expr_build_binary_op (
        location, BIT_IOR_EXPR,
        m2convert_BuildConvert (location, m2type_GetWordType (), op1, false),
        m2convert_BuildConvert (location, m2type_GetWordType (), op2, false),
!       false);
  }
  
  /* BuildLogicalAnd build a logical and expression and return the tree.  */
  
  tree
! m2expr_BuildLogicalAnd (location_t location, tree op1, tree op2)
  {
    m2assert_AssertLocation (location);
    return m2expr_build_binary_op (
        location, BIT_AND_EXPR,
        m2convert_BuildConvert (location, m2type_GetWordType (), op1, false),
        m2convert_BuildConvert (location, m2type_GetWordType (), op2, false),
!       false);
  }
  
  /* BuildSymmetricalDifference build a logical xor expression and return the
!    tree.  */
  
  tree
! m2expr_BuildSymmetricDifference (location_t location, tree left, tree right)
  {
    m2assert_AssertLocation (location);
    return m2expr_build_binary_op (
        location, BIT_XOR_EXPR,
!       m2convert_BuildConvert (location, m2type_GetWordType (), left, false),
!       m2convert_BuildConvert (location, m2type_GetWordType (), right, false),
!       false);
  }
  
! /* BuildLogicalDifference build a logical difference expression tree.
!    Return (left and (not right)).  */
  
  tree
! m2expr_BuildLogicalDifference (location_t location, tree left, tree right)
  {
    m2assert_AssertLocation (location);
    return m2expr_build_binary_op (
        location, BIT_AND_EXPR,
!       m2convert_BuildConvert (location, m2type_GetWordType (), left, false),
!       m2expr_BuildSetNegate (location, right), false);
  }
  
  /* base_type returns the base type of an ordinal subrange, or the
!    type itself if it is not a subrange.  */
  
  static tree
  base_type (tree type)
*************** base_type (tree type)
*** 3064,3083 ****
    return TYPE_MAIN_VARIANT (type);
  }
  
! /* boolean_enum_to_unsigned convert a BOOLEAN_TYPE, t, or
     ENUMERAL_TYPE to an unsigned type.  */
  
  static tree
! boolean_enum_to_unsigned (location_t location, tree t)
  {
!   tree type = TREE_TYPE (t);
  
    if (TREE_CODE (base_type (type)) == BOOLEAN_TYPE)
!     return m2convert_BuildConvert (location, unsigned_type_node, t, false);
    else if (TREE_CODE (base_type (type)) == ENUMERAL_TYPE)
!     return m2convert_BuildConvert (location, unsigned_type_node, t, false);
    else
!     return t;
  }
  
  /* check_for_comparison check to see if, op, is of type, badType.  If
--- 2962,2981 ----
    return TYPE_MAIN_VARIANT (type);
  }
  
! /* boolean_enum_to_unsigned convert a BOOLEAN_TYPE value or
     ENUMERAL_TYPE to an unsigned type.  */
  
  static tree
! boolean_enum_to_unsigned (location_t location, tree value)
  {
!   tree type = TREE_TYPE (value);
  
    if (TREE_CODE (base_type (type)) == BOOLEAN_TYPE)
!     return m2convert_BuildConvert (location, unsigned_type_node, value, false);
    else if (TREE_CODE (base_type (type)) == ENUMERAL_TYPE)
!     return m2convert_BuildConvert (location, unsigned_type_node, value, false);
    else
!     return value;
  }
  
  /* check_for_comparison check to see if, op, is of type, badType.  If
*************** m2expr_BuildIsSuperset (location_t locat
*** 3190,3196 ****
  {
    m2assert_AssertLocation (location);
    return m2expr_BuildEqualTo (
!       location, op2, m2expr_BuildLogicalAnd (location, op1, op2, false));
  }
  
  /* BuildIsNotSuperset return a tree which computes: op1 & op2 != op2.  */
--- 3088,3094 ----
  {
    m2assert_AssertLocation (location);
    return m2expr_BuildEqualTo (
!       location, op2, m2expr_BuildLogicalAnd (location, op1, op2));
  }
  
  /* BuildIsNotSuperset return a tree which computes: op1 & op2 != op2.  */
*************** m2expr_BuildIsNotSuperset (location_t lo
*** 3200,3206 ****
  {
    m2assert_AssertLocation (location);
    return m2expr_BuildNotEqualTo (
!       location, op2, m2expr_BuildLogicalAnd (location, op1, op2, false));
  }
  
  /* BuildIsSubset return a tree which computes:  op1 & op2 == op1.  */
--- 3098,3104 ----
  {
    m2assert_AssertLocation (location);
    return m2expr_BuildNotEqualTo (
!       location, op2, m2expr_BuildLogicalAnd (location, op1, op2));
  }
  
  /* BuildIsSubset return a tree which computes:  op1 & op2 == op1.  */
*************** m2expr_BuildIsSubset (location_t locatio
*** 3210,3216 ****
  {
    m2assert_AssertLocation (location);
    return m2expr_BuildEqualTo (
!       location, op1, m2expr_BuildLogicalAnd (location, op1, op2, false));
  }
  
  /* BuildIsNotSubset return a tree which computes: op1 & op2 != op1.  */
--- 3108,3114 ----
  {
    m2assert_AssertLocation (location);
    return m2expr_BuildEqualTo (
!       location, op1, m2expr_BuildLogicalAnd (location, op1, op2));
  }
  
  /* BuildIsNotSubset return a tree which computes: op1 & op2 != op1.  */
*************** m2expr_BuildIsNotSubset (location_t loca
*** 3220,3443 ****
  {
    m2assert_AssertLocation (location);
    return m2expr_BuildNotEqualTo (
!       location, op1, m2expr_BuildLogicalAnd (location, op1, op2, false));
! }
! 
! /* BuildIfConstInVar generates: if constel in varset then goto label.  */
! 
! void
! m2expr_BuildIfConstInVar (location_t location, tree type, tree varset,
!                           tree constel, bool is_lvalue, int fieldno,
!                           char *label)
! {
!   tree size = m2expr_GetSizeOf (location, type);
!   m2assert_AssertLocation (location);
! 
!   ASSERT_BOOL (is_lvalue);
!   if (m2expr_CompareTrees (
!           size, m2decl_BuildIntegerConstant (SET_WORD_SIZE / BITS_PER_UNIT))
!       <= 0)
!     /* Small set size <= TSIZE(WORD).  */
!     m2treelib_do_jump_if_bit (
!         location, NE_EXPR,
!         m2treelib_get_rvalue (location, varset, type, is_lvalue), constel,
!         label);
!   else
!     {
!       tree fieldlist = TYPE_FIELDS (type);
!       tree field;
! 
!       for (field = fieldlist; (field != NULL) && (fieldno > 0);
!            field = TREE_CHAIN (field))
!         fieldno--;
! 
!       m2treelib_do_jump_if_bit (
!           location, NE_EXPR,
!           m2treelib_get_set_field_rhs (location, varset, field), constel,
!           label);
!     }
! }
! 
! /* BuildIfConstInVar generates: if not (constel in varset) then goto label.  */
! 
! void
! m2expr_BuildIfNotConstInVar (location_t location, tree type, tree varset,
!                              tree constel, bool is_lvalue, int fieldno,
!                              char *label)
! {
!   tree size = m2expr_GetSizeOf (location, type);
! 
!   m2assert_AssertLocation (location);
! 
!   ASSERT_BOOL (is_lvalue);
!   if (m2expr_CompareTrees (
!           size, m2decl_BuildIntegerConstant (SET_WORD_SIZE / BITS_PER_UNIT))
!       <= 0)
!     /* Small set size <= TSIZE(WORD).  */
!     m2treelib_do_jump_if_bit (
!         location, EQ_EXPR,
!         m2treelib_get_rvalue (location, varset, type, is_lvalue), constel,
!         label);
!   else
!     {
!       tree fieldlist = TYPE_FIELDS (type);
!       tree field;
! 
!       for (field = fieldlist; (field != NULL) && (fieldno > 0);
!            field = TREE_CHAIN (field))
!         fieldno--;
! 
!       m2treelib_do_jump_if_bit (
!           location, EQ_EXPR,
!           m2treelib_get_set_field_rhs (location, varset, field), constel,
!           label);
!     }
! }
! 
! /* BuildIfVarInVar generates: if varel in varset then goto label.  */
! 
! void
! m2expr_BuildIfVarInVar (location_t location, tree type, tree varset,
!                         tree varel, bool is_lvalue, tree low,
!                         tree high ATTRIBUTE_UNUSED, char *label)
! {
!   tree size = m2expr_GetSizeOf (location, type);
!   /* Calculate the index from the first bit, ie bit 0 represents low value.  */
!   tree index = m2expr_BuildSub (
!       location, m2convert_BuildConvert (location, m2type_GetIntegerType (),
!                                         varel, false),
!       m2convert_BuildConvert (location, m2type_GetIntegerType (), low, false),
!       false);
! 
!   m2assert_AssertLocation (location);
! 
!   if (m2expr_CompareTrees (
!           size, m2decl_BuildIntegerConstant (SET_WORD_SIZE / BITS_PER_UNIT))
!       <= 0)
!     /* Small set size <= TSIZE(WORD).  */
!     m2treelib_do_jump_if_bit (
!         location, NE_EXPR,
!         m2treelib_get_rvalue (location, varset, type, is_lvalue), index,
!         label);
!   else
!     {
!       tree p1 = m2treelib_get_set_address (location, varset, is_lvalue);
!       /* Which word do we need to fetch?  */
!       tree word_index = m2expr_FoldAndStrip (m2expr_BuildDivTrunc (
!           location, index, m2decl_BuildIntegerConstant (SET_WORD_SIZE),
!           false));
!       /* Calculate the bit in this word.  */
!       tree offset_into_word = m2expr_FoldAndStrip (m2expr_BuildModTrunc (
!           location, index, m2decl_BuildIntegerConstant (SET_WORD_SIZE),
!           false));
!       tree p2 = m2expr_FoldAndStrip (m2expr_BuildMult (
!           location, word_index,
!           m2decl_BuildIntegerConstant (SET_WORD_SIZE / BITS_PER_UNIT), false));
! 
!       /* Calculate the address of the word we are interested in.  */
!       p1 = m2expr_BuildAddAddress (location,
!                                    m2convert_convertToPtr (location, p1), p2);
! 
!       /* Fetch the word, extract the bit and test for != 0.  */
!       m2treelib_do_jump_if_bit (
!           location, NE_EXPR,
!           m2expr_BuildIndirect (location, p1, m2type_GetBitsetType ()),
!           offset_into_word, label);
!     }
  }
  
! /* BuildIfNotVarInVar generates: if not (varel in varset) then goto label.  */
  
  void
! m2expr_BuildIfNotVarInVar (location_t location, tree type, tree varset,
!                            tree varel, bool is_lvalue, tree low,
!                            tree high ATTRIBUTE_UNUSED, char *label)
  {
!   tree size = m2expr_GetSizeOf (location, type);
!   /* Calculate the index from the first bit, ie bit 0 represents low value.  */
!   tree index = m2expr_BuildSub (
!       location, m2convert_BuildConvert (location, m2type_GetIntegerType (),
!                                         m2expr_FoldAndStrip (varel), false),
!       m2convert_BuildConvert (location, m2type_GetIntegerType (),
!                               m2expr_FoldAndStrip (low), false),
!       false);
! 
!   index = m2expr_FoldAndStrip (index);
!   m2assert_AssertLocation (location);
! 
!   if (m2expr_CompareTrees (
!           size, m2decl_BuildIntegerConstant (SET_WORD_SIZE / BITS_PER_UNIT))
!       <= 0)
!     /* Small set size <= TSIZE(WORD).  */
!     m2treelib_do_jump_if_bit (
!         location, EQ_EXPR,
!         m2treelib_get_rvalue (location, varset, type, is_lvalue), index,
!         label);
    else
!     {
!       tree p1 = m2treelib_get_set_address (location, varset, is_lvalue);
!       /* Calculate the index from the first bit.  */
! 
!       /* Which word do we need to fetch?  */
!       tree word_index = m2expr_FoldAndStrip (m2expr_BuildDivTrunc (
!           location, index, m2decl_BuildIntegerConstant (SET_WORD_SIZE),
!           false));
!       /* Calculate the bit in this word.  */
!       tree offset_into_word = m2expr_FoldAndStrip (m2expr_BuildModTrunc (
!           location, index, m2decl_BuildIntegerConstant (SET_WORD_SIZE),
!           false));
!       tree p2 = m2expr_FoldAndStrip (m2expr_BuildMult (
!           location, word_index,
!           m2decl_BuildIntegerConstant (SET_WORD_SIZE / BITS_PER_UNIT), false));
! 
!       /* Calculate the address of the word we are interested in.  */
!       p1 = m2expr_BuildAddAddress (location, p1, p2);
! 
!       /* Fetch the word, extract the bit and test for == 0.  */
!       m2treelib_do_jump_if_bit (
!           location, EQ_EXPR,
!           m2expr_BuildIndirect (location, p1, m2type_GetBitsetType ()),
!           offset_into_word, label);
!     }
! }
! 
! /* BuildForeachWordInSetDoIfExpr foreach word in set, type, compute
!    the expression, expr, and if true goto label.  */
! 
! void
! m2expr_BuildForeachWordInSetDoIfExpr (location_t location, tree type, tree op1,
!                                       tree op2, bool is_op1lvalue,
!                                       bool is_op2lvalue, bool is_op1const,
!                                       bool is_op2const,
!                                       tree (*expr) (location_t, tree, tree),
!                                       char *label)
! {
!   tree p1 = m2treelib_get_set_address_if_var (location, op1, is_op1lvalue,
!                                               is_op1const);
!   tree p2 = m2treelib_get_set_address_if_var (location, op2, is_op2lvalue,
!                                               is_op2const);
!   unsigned int fieldNo = 0;
!   tree field1 = m2treelib_get_field_no (type, op1, is_op1const, fieldNo);
!   tree field2 = m2treelib_get_field_no (type, op2, is_op2const, fieldNo);
! 
!   m2assert_AssertLocation (location);
!   ASSERT_CONDITION (TREE_CODE (TREE_TYPE (op1)) == RECORD_TYPE);
!   ASSERT_CONDITION (TREE_CODE (TREE_TYPE (op2)) == RECORD_TYPE);
! 
!   while (field1 != NULL && field2 != NULL)
!     {
!       m2statement_DoJump (
!           location,
!           (*expr) (location,
!                    m2treelib_get_set_value (location, p1, field1, is_op1const,
!                                             is_op1lvalue, op1, fieldNo),
!                    m2treelib_get_set_value (location, p2, field2, is_op2const,
!                                             is_op2lvalue, op2, fieldNo)),
!           NULL, label);
!       fieldNo++;
!       field1 = m2treelib_get_field_no (type, op1, is_op1const, fieldNo);
!       field2 = m2treelib_get_field_no (type, op2, is_op2const, fieldNo);
!     }
  }
  
  /* BuildIfInRangeGoto returns a tree containing if var is in the
--- 3118,3139 ----
  {
    m2assert_AssertLocation (location);
    return m2expr_BuildNotEqualTo (
!       location, op1, m2expr_BuildLogicalAnd (location, op1, op2));
  }
  
! /* BuildIfBitInSetJump build and add a statement tree containing:
!    if (bit in setvalue) goto label.  If invertCondition is true then
!    the tree created will take the form:
!    if not (bit in setvalue) goto label.  */
  
  void
! m2expr_BuildIfBitInSetJump (location_t location, bool invertCondition,
! 			    tree setvalue, tree bit, char *label)
  {
!   if (invertCondition)
!     m2treelib_do_jump_if_bit (location, NE_EXPR, setvalue, bit, label);
    else
!     m2treelib_do_jump_if_bit (location, EQ_EXPR, setvalue, bit, label);
  }
  
  /* BuildIfInRangeGoto returns a tree containing if var is in the
*************** m2expr_BuildIfInRangeGoto (location_t lo
*** 3450,3465 ****
    m2assert_AssertLocation (location);
  
    if (m2expr_CompareTrees (low, high) == 0)
!     m2statement_DoJump (location, m2expr_BuildEqualTo (location, var, low),
!                         NULL, label);
    else
!     m2statement_DoJump (
          location,
          m2expr_build_binary_op (
              location, TRUTH_ANDIF_EXPR,
              m2expr_BuildGreaterThanOrEqual (location, var, low),
              m2expr_BuildLessThanOrEqual (location, var, high), false),
!         NULL, label);
  }
  
  /* BuildIfNotInRangeGoto returns a tree containing if var is not in
--- 3146,3161 ----
    m2assert_AssertLocation (location);
  
    if (m2expr_CompareTrees (low, high) == 0)
!     m2statement_IfExprJump (location, m2expr_BuildEqualTo (location, var, low),
! 			    label);
    else
!     m2statement_IfExprJump (
          location,
          m2expr_build_binary_op (
              location, TRUTH_ANDIF_EXPR,
              m2expr_BuildGreaterThanOrEqual (location, var, low),
              m2expr_BuildLessThanOrEqual (location, var, high), false),
!         label);
  }
  
  /* BuildIfNotInRangeGoto returns a tree containing if var is not in
*************** m2expr_BuildIfNotInRangeGoto (location_t
*** 3472,3486 ****
    m2assert_AssertLocation (location);
  
    if (m2expr_CompareTrees (low, high) == 0)
!     m2statement_DoJump (location, m2expr_BuildNotEqualTo (location, var, low),
!                         NULL, label);
    else
!     m2statement_DoJump (
          location, m2expr_build_binary_op (
                        location, TRUTH_ORIF_EXPR,
                        m2expr_BuildLessThan (location, var, low),
                        m2expr_BuildGreaterThan (location, var, high), false),
!         NULL, label);
  }
  
  /* BuildArray - returns a tree which accesses array[index] given,
--- 3168,3182 ----
    m2assert_AssertLocation (location);
  
    if (m2expr_CompareTrees (low, high) == 0)
!     m2statement_IfExprJump (location, m2expr_BuildNotEqualTo (location, var, low),
! 			    label);
    else
!     m2statement_IfExprJump (
          location, m2expr_build_binary_op (
                        location, TRUTH_ORIF_EXPR,
                        m2expr_BuildLessThan (location, var, low),
                        m2expr_BuildGreaterThan (location, var, high), false),
!         label);
  }
  
  /* BuildArray - returns a tree which accesses array[index] given,
*************** m2expr_BuildCmplx (location_t location,
*** 3829,3903 ****
      return build2 (COMPLEX_EXPR, type, real, imag);
  }
  
- /* BuildBinaryForeachWordDo implements the large set operators.  Each
-    word of the set can be calculated by binop.  This function runs along
-    each word of the large set invoking the binop.  */
- 
  void
! m2expr_BuildBinaryForeachWordDo (location_t location, tree type, tree op1,
!                                  tree op2, tree op3,
!                                  tree (*binop) (location_t, tree, tree, bool),
!                                  bool is_op1lvalue, bool is_op2lvalue,
!                                  bool is_op3lvalue, bool is_op1const,
!                                  bool is_op2const, bool is_op3const)
  {
!   tree size = m2expr_GetSizeOf (location, type);
! 
!   m2assert_AssertLocation (location);
! 
!   ASSERT_BOOL (is_op1lvalue);
!   ASSERT_BOOL (is_op2lvalue);
!   ASSERT_BOOL (is_op3lvalue);
!   ASSERT_BOOL (is_op1const);
!   ASSERT_BOOL (is_op2const);
!   ASSERT_BOOL (is_op3const);
!   if (m2expr_CompareTrees (
!           size, m2decl_BuildIntegerConstant (SET_WORD_SIZE / BITS_PER_UNIT))
!       <= 0)
!     /* Small set size <= TSIZE(WORD).  */
!     m2statement_BuildAssignmentTree (
!         location, m2treelib_get_rvalue (location, op1, type, is_op1lvalue),
!         (*binop) (
!             location, m2treelib_get_rvalue (location, op2, type, is_op2lvalue),
!             m2treelib_get_rvalue (location, op3, type, is_op3lvalue), false));
!   else
!     {
!       /* Large set size > TSIZE(WORD).  */
! 
!       tree p2 = m2treelib_get_set_address_if_var (location, op2, is_op2lvalue,
!                                                   is_op2const);
!       tree p3 = m2treelib_get_set_address_if_var (location, op3, is_op3lvalue,
!                                                   is_op3const);
!       unsigned int fieldNo = 0;
!       tree field1 = m2treelib_get_field_no (type, op1, is_op1const, fieldNo);
!       tree field2 = m2treelib_get_field_no (type, op2, is_op2const, fieldNo);
!       tree field3 = m2treelib_get_field_no (type, op3, is_op3const, fieldNo);
! 
!       if (is_op1const)
! 	m2linemap_internal_error_at (
!             location,
!             "not expecting operand1 to be a constant set");
! 
!       while (field1 != NULL && field2 != NULL && field3 != NULL)
!         {
!           m2statement_BuildAssignmentTree (
!               location, m2treelib_get_set_field_des (location, op1, field1),
!               (*binop) (
!                   location,
!                   m2treelib_get_set_value (location, p2, field2, is_op2const,
!                                            is_op2lvalue, op2, fieldNo),
!                   m2treelib_get_set_value (location, p3, field3, is_op3const,
!                                            is_op3lvalue, op3, fieldNo),
!                   false));
!           fieldNo++;
!           field1 = m2treelib_get_field_no (type, op1, is_op1const, fieldNo);
!           field2 = m2treelib_get_field_no (type, op2, is_op2const, fieldNo);
!           field3 = m2treelib_get_field_no (type, op3, is_op3const, fieldNo);
!         }
!     }
  }
  
- 
  /* OverflowZType returns true if the ZTYPE str will exceed the
     internal representation.  This routine is much faster (at
     least 2 orders of magnitude faster) than the char at a time overflow
--- 3525,3542 ----
      return build2 (COMPLEX_EXPR, type, real, imag);
  }
  
  void
! m2expr_SetAndNarrow (location_t location, tree settype,
! 		     tree op1, tree op2, tree op3,
! 		     bool is_op1lvalue, bool is_op2lvalue, bool is_op3lvalue)
  {
!   m2statement_BuildAssignmentTree (
!      location, m2expr_GetRValue (location, op1, settype, is_op1lvalue),
!      m2expr_BuildLogicalAnd (
!             location, m2expr_GetRValue (location, op2, settype, is_op2lvalue),
!             m2expr_GetRValue (location, op3, settype, is_op3lvalue)));
  }
  
  /* OverflowZType returns true if the ZTYPE str will exceed the
     internal representation.  This routine is much faster (at
     least 2 orders of magnitude faster) than the char at a time overflow
*************** m2expr_GetPointerOne (location_t locatio
*** 4205,4210 ****
--- 3844,3855 ----
    return m2convert_convertToPtr (location, integer_one_node);
  }
  
+ tree
+ m2expr_GetBitsetZero (location_t location)
+ {
+   return m2convert_ToBitset (location, integer_zero_node);
+ }
+ 
  /* build_set_full_complement return a word size value with all bits
  set to one.  */
  
*************** build_set_full_complement (location_t lo
*** 4224,4235 ****
                location, m2expr_GetWordOne (location),
                m2convert_BuildConvert (location, m2type_GetWordType (),
                                        m2decl_BuildIntegerConstant (i), false),
!               false),
!           false);
      }
    return value;
  }
  
  
  /* GetCstInteger return the integer value of the cst tree.  */
  
--- 3869,3891 ----
                location, m2expr_GetWordOne (location),
                m2convert_BuildConvert (location, m2type_GetWordType (),
                                        m2decl_BuildIntegerConstant (i), false),
!               false));
      }
    return value;
  }
  
+ /* GetRValue returns the rvalue of expr.  The type is the object
+    type to be copied upon indirection.  */
+ 
+ tree
+ m2expr_GetRValue (location_t location, tree expr, tree type, bool islvalue)
+ {
+   if (islvalue)
+     return m2expr_BuildIndirect (location, expr, type);
+   else
+     return expr;
+ }
+ 
  
  /* GetCstInteger return the integer value of the cst tree.  */
  
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2expr.def gcc-16-20250921/gcc/m2/gm2-gcc/m2expr.def
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2expr.def	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2expr.def	Sun Sep 21 22:32:38 2025
*************** You should have received a copy of the G
*** 19,25 ****
  along with GNU Modula-2; see the file COPYING3.  If not see
  <http://www.gnu.org/licenses/>.  *)
  
! DEFINITION MODULE FOR "C" m2expr  ;
  
  FROM gcctypes IMPORT location_t, tree ;
  FROM CDataTypes IMPORT CharStar, ConstCharStar ;
--- 19,25 ----
  along with GNU Modula-2; see the file COPYING3.  If not see
  <http://www.gnu.org/licenses/>.  *)
  
! DEFINITION MODULE m2expr  ;
  
  FROM gcctypes IMPORT location_t, tree ;
  FROM CDataTypes IMPORT CharStar, ConstCharStar ;
*************** PROCEDURE GetCardinalOne (location: loca
*** 92,97 ****
--- 92,100 ----
  PROCEDURE GetCardinalZero (location: location_t) : tree ;
  
  
+ PROCEDURE GetBitsetZero (location: location_t) : tree ;
+ 
+ 
  PROCEDURE GetSizeOfInBits (type: tree) : tree ;
  
  
*************** PROCEDURE BuildNegateCheck (location: lo
*** 365,371 ****
      BuildSetNegate - builds a set negate expression and returns the tree.
  *)
  
! PROCEDURE BuildSetNegate (location: location_t; op1: tree; needconvert: BOOLEAN) : tree ;
  
  
  (*
--- 368,374 ----
      BuildSetNegate - builds a set negate expression and returns the tree.
  *)
  
! PROCEDURE BuildSetNegate (location: location_t; op1: tree) : tree ;
  
  
  (*
*************** PROCEDURE BuildOffset (location: locatio
*** 414,447 ****
      BuildLogicalOrAddress - build a logical or expressions and return the tree.
  *)
  
! PROCEDURE BuildLogicalOrAddress (location: location_t; op1: tree; op2: tree; needconvert: BOOLEAN) : tree ;
  
  
  (*
      BuildLogicalOr - build a logical or expressions and return the tree.
  *)
  
! PROCEDURE BuildLogicalOr (location: location_t; op1: tree; op2: tree; needconvert: BOOLEAN) : tree ;
  
  
  (*
      BuildLogicalAnd - build a logical and expression and return the tree.
  *)
  
! PROCEDURE BuildLogicalAnd (location: location_t; op1: tree; op2: tree; needconvert: BOOLEAN) : tree ;
! 
  
  
! PROCEDURE BuildSymmetricDifference (location: location_t; op1: tree; op2: tree; needconvert: BOOLEAN) : tree ;
  
  
  (*
!     BuildLogicalDifference - build a logical difference expression and
!                              return the tree.
!                              (op1 and (not op2))
  *)
  
! PROCEDURE BuildLogicalDifference (location: location_t; op1: tree; op2: tree; needconvert: BOOLEAN) : tree ;
  
  
  (*
--- 417,455 ----
      BuildLogicalOrAddress - build a logical or expressions and return the tree.
  *)
  
! PROCEDURE BuildLogicalOrAddress (location: location_t; op1: tree; op2: tree) : tree ;
  
  
  (*
      BuildLogicalOr - build a logical or expressions and return the tree.
  *)
  
! PROCEDURE BuildLogicalOr (location: location_t; op1: tree; op2: tree) : tree ;
  
  
  (*
      BuildLogicalAnd - build a logical and expression and return the tree.
  *)
  
! PROCEDURE BuildLogicalAnd (location: location_t; op1: tree; op2: tree) : tree ;
  
  
! PROCEDURE BuildSymmetricDifference (location: location_t; op1: tree; op2: tree) : tree ;
  
  
  (*
!    BuildLogicalDifference - build a logical difference expression tree.
!                             Return (left and (not right)).
  *)
  
! PROCEDURE BuildLogicalDifference (location: location_t;
!                                   left, right: tree) : tree ;
! 
! 
! PROCEDURE BuildIfInSet (location: location_t; set, bit: tree) : tree ;
! 
! 
! PROCEDURE BuildIfNotInSet (location: location_t; set, bit: tree) : tree ;
  
  
  (*
*************** PROCEDURE BuildGreaterThanOrEqual (locat
*** 473,486 ****
  
  
  (*
!     BuildEqualTo - return a tree which computes =
  *)
  
! PROCEDURE BuildEqualTo (location: location_t; op1: tree; op2: tree) : tree ;
  
  
  
! PROCEDURE BuildNotEqualTo (location: location_t; op1: tree; op2: tree) : tree ;
  
  
  (*
--- 481,497 ----
  
  
  (*
!     BuildEqualTo - return a tree which computes (left = right).
  *)
  
! PROCEDURE BuildEqualTo (location: location_t; left, right: tree) : tree ;
  
  
+ (*
+     BuildNotEqualTo - return a tree which computes (left # right).
+ *)
  
! PROCEDURE BuildNotEqualTo (location: location_t; left, right: tree) : tree ;
  
  
  (*
*************** PROCEDURE BuildCmplx (location: location
*** 676,712 ****
  
  
  (*
-     BuildBinaryForeachWordDo - provides the large set operators. Each word
-                                (or less) of the set can be calculated by binop.
-                                This procedure runs along each word of the
-                                large set invoking the binop.
- *)
- 
- PROCEDURE BuildBinaryForeachWordDo (location: location_t;
-                                     type, op1, op2, op3: tree;
-                                     binop: BuildBinProcedure;
-                                     is_op1lvalue,
-                                     is_op2lvalue,
-                                     is_op3lvalue,
-                                     is_op1_const,
-                                     is_op2_const,
-                                     is_op3_const: BOOLEAN) ;
- 
- (*
-    BuildBinarySetDo - if the size of the set is <= TSIZE(WORD) then
-                          op1 := binop(op2, op3)
-                       else
-                          call m2rtsprocedure(op1, op2, op3)
- *)
- 
- PROCEDURE BuildBinarySetDo (location: location_t;
-                             settype, op1, op2, op3: tree;
-                             binop: BuildSetProcedure;
-                             is_op1lvalue, is_op2lvalue, is_op3lvalue: BOOLEAN;
-                             nBits, unbounded: tree;
-                             varproc, leftproc, rightproc: tree) ;
- 
- (*
     ConstantExpressionWarning - issue a warning if the constant has overflowed.
  *)
  
--- 687,692 ----
*************** PROCEDURE OverflowZType (location: locat
*** 744,749 ****
--- 724,737 ----
  
  PROCEDURE BuildCondIfExpression (condition, type, left, right: tree) : tree ;
  
+ (*
+    GetRValue - returns the rvalue of expr.  The type is the object
+                type to be copied upon indirection.
+ *)
+ 
+ PROCEDURE GetRValue (location: location_t; expr, type: tree;
+                      islvalue: BOOLEAN) : tree ;
+ 
  
  (*
     BuildSystemTBitSize - return the minimum number of bits to represent type.
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2expr.h gcc-16-20250921/gcc/m2/gm2-gcc/m2expr.h
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2expr.h	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2expr.h	Sun Sep 21 22:32:38 2025
*************** EXTERN char m2expr_CSTIntToChar (tree t)
*** 40,50 ****
  EXTERN char *m2expr_CSTIntToString (tree t);
  EXTERN bool m2expr_StrToWideInt (location_t location, const char *str, unsigned int base,
  				 widest_int &wval, bool issueError);
- EXTERN void m2expr_BuildBinaryForeachWordDo (
-     location_t location, tree type, tree op1, tree op2, tree op3,
-     tree (*binop) (location_t, tree, tree, bool), bool is_op1lvalue,
-     bool is_op2lvalue, bool is_op3lvalue, bool is_op1const, bool is_op2const,
-     bool is_op3const);
  EXTERN tree m2expr_BuildCmplx (location_t location, tree type, tree real,
                                 tree imag);
  EXTERN tree m2expr_BuildIm (tree op1);
--- 40,45 ----
*************** EXTERN void m2expr_BuildIfNotInRangeGoto
*** 65,89 ****
                                            tree low, tree high, char *label);
  EXTERN void m2expr_BuildIfInRangeGoto (location_t location, tree var, tree low,
                                         tree high, char *label);
- EXTERN void m2expr_BuildForeachWordInSetDoIfExpr (
-     location_t location, tree type, tree op1, tree op2, bool is_op1lvalue,
-     bool is_op2lvalue, bool is_op1const, bool is_op2const,
-     tree (*expr) (location_t, tree, tree), char *label);
- EXTERN void m2expr_BuildIfNotVarInVar (location_t location, tree type,
-                                        tree varset, tree varel, bool is_lvalue,
-                                        tree low, tree high ATTRIBUTE_UNUSED,
-                                        char *label);
- EXTERN void m2expr_BuildIfVarInVar (location_t location, tree type,
-                                     tree varset, tree varel, bool is_lvalue,
-                                     tree low, tree high ATTRIBUTE_UNUSED,
-                                     char *label);
- EXTERN void m2expr_BuildIfNotConstInVar (location_t location, tree type,
-                                          tree varset, tree constel,
-                                          bool is_lvalue, int fieldno,
-                                          char *label);
- EXTERN void m2expr_BuildIfConstInVar (location_t location, tree type,
-                                       tree varset, tree constel, bool is_lvalue,
-                                       int fieldno, char *label);
  EXTERN tree m2expr_BuildIsNotSubset (location_t location, tree op1, tree op2);
  EXTERN tree m2expr_BuildIsSubset (location_t location, tree op1, tree op2);
  EXTERN tree m2expr_BuildIsNotSuperset (location_t location, tree op1,
--- 60,65 ----
*************** EXTERN tree m2expr_BuildLessThanOrEqual
*** 97,112 ****
                                           tree op2);
  EXTERN tree m2expr_BuildGreaterThan (location_t location, tree op1, tree op2);
  EXTERN tree m2expr_BuildLessThan (location_t location, tree op1, tree op2);
! EXTERN tree m2expr_BuildLogicalDifference (location_t location, tree op1,
!                                            tree op2, bool needconvert);
! EXTERN tree m2expr_BuildSymmetricDifference (location_t location, tree op1,
!                                              tree op2, bool needconvert);
! EXTERN tree m2expr_BuildLogicalAnd (location_t location, tree op1, tree op2,
!                                     bool needconvert);
! EXTERN tree m2expr_BuildLogicalOr (location_t location, tree op1, tree op2,
!                                    bool needconvert);
! EXTERN tree m2expr_BuildLogicalOrAddress (location_t location, tree op1,
!                                           tree op2, bool needconvert);
  EXTERN tree m2expr_BuildOffset (location_t location, tree record, tree field,
                                  bool needconvert ATTRIBUTE_UNUSED);
  EXTERN tree m2expr_BuildOffset1 (location_t location, tree field,
--- 73,83 ----
                                           tree op2);
  EXTERN tree m2expr_BuildGreaterThan (location_t location, tree op1, tree op2);
  EXTERN tree m2expr_BuildLessThan (location_t location, tree op1, tree op2);
! EXTERN tree m2expr_BuildLogicalDifference (location_t location, tree op1, tree op2);
! EXTERN tree m2expr_BuildSymmetricDifference (location_t location, tree op1, tree op2);
! EXTERN tree m2expr_BuildLogicalAnd (location_t location, tree op1, tree op2);
! EXTERN tree m2expr_BuildLogicalOr (location_t location, tree op1, tree op2);
! EXTERN tree m2expr_BuildLogicalOrAddress (location_t location, tree op1, tree op2);
  EXTERN tree m2expr_BuildOffset (location_t location, tree record, tree field,
                                  bool needconvert ATTRIBUTE_UNUSED);
  EXTERN tree m2expr_BuildOffset1 (location_t location, tree field,
*************** EXTERN tree m2expr_BuildAddr (location_t
*** 115,122 ****
  EXTERN tree m2expr_BuildSize (location_t location, tree op1,
                                bool needconvert ATTRIBUTE_UNUSED);
  EXTERN tree m2expr_BuildTBitSize (location_t location, tree type);
! EXTERN tree m2expr_BuildSetNegate (location_t location, tree op1,
!                                    bool needconvert);
  EXTERN tree m2expr_BuildNegate (location_t location, tree op1,
                                  bool needconvert);
  EXTERN tree m2expr_BuildNegateCheck (location_t location, tree arg,
--- 86,92 ----
  EXTERN tree m2expr_BuildSize (location_t location, tree op1,
                                bool needconvert ATTRIBUTE_UNUSED);
  EXTERN tree m2expr_BuildTBitSize (location_t location, tree type);
! EXTERN tree m2expr_BuildSetNegate (location_t location, tree value);
  EXTERN tree m2expr_BuildNegate (location_t location, tree op1,
                                  bool needconvert);
  EXTERN tree m2expr_BuildNegateCheck (location_t location, tree arg,
*************** EXTERN tree m2expr_GetWordZero (location
*** 224,229 ****
--- 194,200 ----
  EXTERN tree m2expr_GetWordOne (location_t location);
  EXTERN tree m2expr_GetPointerZero (location_t location);
  EXTERN tree m2expr_GetPointerOne (location_t location);
+ EXTERN tree m2expr_GetBitsetZero (location_t location);
  
  EXTERN int m2expr_CompareTrees (tree e1, tree e2);
  EXTERN tree m2expr_build_unary_op (location_t location ATTRIBUTE_UNUSED,
*************** EXTERN tree m2expr_calcNbits (location_t
*** 246,251 ****
--- 217,226 ----
  EXTERN bool m2expr_OverflowZType (location_t location, const char *str,
  				  unsigned int base, bool issueError);
  EXTERN tree m2expr_BuildSystemTBitSize (location_t location, tree type);
+ EXTERN tree m2expr_GetRValue (location_t location, tree expr, tree type, bool islvalue);
+ EXTERN tree m2expr_BuildIfInSet (location_t location, tree set, tree bit);
+ EXTERN tree m2expr_BuildIfNotInSet (location_t location, tree set, tree bit);
+ 
  EXTERN void m2expr_init (location_t location);
  
  #undef EXTERN
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2options.h gcc-16-20250921/gcc/m2/gm2-gcc/m2options.h
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2options.h	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2options.h	Sun Sep 21 22:32:38 2025
*************** EXTERN char *M2Options_GetM2DumpFilter (
*** 168,173 ****
--- 168,177 ----
  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_SetTimeReport (bool value);
+ EXTERN void M2Options_SetMemReport (bool value);
+ EXTERN void M2Options_SetWideset (bool value);
+ EXTERN bool M2Options_GetWideset (void);
  EXTERN void M2Options_SetStrictTypeAssignment (bool value);
  EXTERN void M2Options_SetStrictTypeReason (bool value);
  
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2pp.cc gcc-16-20250921/gcc/m2/gm2-gcc/m2pp.cc
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2pp.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2pp.cc	Sun Sep 21 22:32:38 2025
*************** m2pp_binary_function (pretty *s, tree t,
*** 1961,1966 ****
--- 1961,1982 ----
    m2pp_print (s, ")");
  }
  
+ static void
+ m2pp_shiftrotate_expr (pretty *s, tree t, const char *op)
+ {
+   tree left = TREE_OPERAND (t, 0);
+   tree right = TREE_OPERAND (t, 1);
+   m2pp_print (s, "(");
+   m2pp_expression (s, left);
+   m2pp_print (s, ")");
+   m2pp_needspace (s);
+   m2pp_print (s, op);
+   m2pp_needspace (s);
+   m2pp_print (s, "(");
+   m2pp_expression (s, right);
+   m2pp_print (s, ")");
+ }
+ 
  /* m2pp_simple_expression handle GCC expression tree.  */
  
  static void
*************** m2pp_simple_expression (pretty *s, tree
*** 2117,2122 ****
--- 2133,2144 ----
      case TRUTH_ORIF_EXPR:
        m2pp_truth_expr (s, t, "OR");
        break;
+     case LSHIFT_EXPR:
+       m2pp_shiftrotate_expr (s, t, "<<");
+       break;
+     case RSHIFT_EXPR:
+       m2pp_shiftrotate_expr (s, t, ">>");
+       break;
      case LROTATE_EXPR:
        m2pp_binary_function (s, t, "LROTATE");
        break;
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2statement.cc gcc-16-20250921/gcc/m2/gm2-gcc/m2statement.cc
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2statement.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2statement.cc	Sun Sep 21 22:32:38 2025
*************** static GTY (()) tree param_list = NULL_T
*** 44,50 ****
  static GTY (()) tree last_function = NULL_TREE;
  
  
! /* BuildStartFunctionCode - generate function entry code.  */
  
  void
  m2statement_BuildStartFunctionCode (location_t location, tree fndecl,
--- 44,50 ----
  static GTY (()) tree last_function = NULL_TREE;
  
  
! /* BuildStartFunctionCode generate function entry code.  */
  
  void
  m2statement_BuildStartFunctionCode (location_t location, tree fndecl,
*************** m2statement_BuildStartFunctionCode (loca
*** 86,92 ****
    DECL_DECLARED_INLINE_P (fndecl) = 0; /* isinline;  */
  }
  
! /* BuildEndFunctionCode - generates the function epilogue.  */
  
  void
  m2statement_BuildEndFunctionCode (location_t location, tree fndecl, bool nested)
--- 86,92 ----
    DECL_DECLARED_INLINE_P (fndecl) = 0; /* isinline;  */
  }
  
! /* BuildEndFunctionCode generates the function epilogue.  */
  
  void
  m2statement_BuildEndFunctionCode (location_t location, tree fndecl, bool nested)
*************** m2statement_BuildEndFunctionCode (locati
*** 123,129 ****
    current_function_decl = NULL;
  }
  
! /* BuildPushFunctionContext - pushes the current function context.
     Maps onto push_function_context in ../function.cc.  */
  
  void
--- 123,129 ----
    current_function_decl = NULL;
  }
  
! /* BuildPushFunctionContext pushes the current function context.
     Maps onto push_function_context in ../function.cc.  */
  
  void
*************** m2statement_BuildPushFunctionContext (vo
*** 132,138 ****
    push_function_context ();
  }
  
! /* BuildPopFunctionContext - pops the current function context.  Maps
     onto pop_function_context in ../function.cc.  */
  
  void
--- 132,138 ----
    push_function_context ();
  }
  
! /* BuildPopFunctionContext pops the current function context.  Maps
     onto pop_function_context in ../function.cc.  */
  
  void
*************** copy_array (location_t location, tree le
*** 194,200 ****
        idx = m2convert_BuildConvert (location, index_type, idx, false);
        tree array_ref = build4_loc (location, ARRAY_REF, elt_type, left,
  				   idx, low_indice, NULL_TREE);
!       m2statement_CopyByField (location, array_ref, value);      
      }
  }
  
--- 194,200 ----
        idx = m2convert_BuildConvert (location, index_type, idx, false);
        tree array_ref = build4_loc (location, ARRAY_REF, elt_type, left,
  				   idx, low_indice, NULL_TREE);
!       m2statement_CopyByField (location, array_ref, value);
      }
  }
  
*************** CopyByField_Lower (location_t location,
*** 253,259 ****
    else if (right_code == STRING_CST)
      copy_strncpy (location, left, right);
    else
!     m2statement_BuildAssignmentStatement (location, left, right);    
  }
  
  /* CopyByField recursively checks each field to ensure GCC
--- 253,259 ----
    else if (right_code == STRING_CST)
      copy_strncpy (location, left, right);
    else
!     m2statement_BuildAssignmentStatement (location, left, right);
  }
  
  /* CopyByField recursively checks each field to ensure GCC
*************** m2statement_BuildGoto (location_t locati
*** 321,327 ****
    add_stmt (location, build1 (GOTO_EXPR, void_type_node, label));
  }
  
! /* DeclareLabel - create a label, name.  */
  
  void
  m2statement_DeclareLabel (location_t location, char *name)
--- 321,327 ----
    add_stmt (location, build1 (GOTO_EXPR, void_type_node, label));
  }
  
! /* DeclareLabel create a label, name.  */
  
  void
  m2statement_DeclareLabel (location_t location, char *name)
*************** m2statement_DeclareLabel (location_t loc
*** 332,338 ****
    add_stmt (location, build1 (LABEL_EXPR, void_type_node, label));
  }
  
! /* BuildParam - build a list of parameters, ready for a subsequent
     procedure call.  */
  
  void
--- 332,338 ----
    add_stmt (location, build1 (LABEL_EXPR, void_type_node, label));
  }
  
! /* BuildParam build a list of parameters, ready for a subsequent
     procedure call.  */
  
  void
*************** m2statement_BuildParam (location_t locat
*** 347,353 ****
    param_list = chainon (build_tree_list (NULL_TREE, param), param_list);
  }
  
! /* nCount - return the number of chained tree nodes in list, t.  */
  
  static int
  nCount (tree t)
--- 347,353 ----
    param_list = chainon (build_tree_list (NULL_TREE, param), param_list);
  }
  
! /* nCount return the number of chained tree nodes in list, t.  */
  
  static int
  nCount (tree t)
*************** nCount (tree t)
*** 362,368 ****
    return i;
  }
  
! /* BuildProcedureCallTree - creates a procedure call from a procedure
     and parameter list and the return type, rettype.  */
  
  tree
--- 362,368 ----
    return i;
  }
  
! /* BuildProcedureCallTree creates a procedure call from a procedure
     and parameter list and the return type, rettype.  */
  
  tree
*************** m2statement_BuildProcedureCallTree (loca
*** 419,425 ****
      }
  }
  
! /* BuildIndirectProcedureCallTree - creates a procedure call from a
     procedure and parameter list and the return type, rettype.  */
  
  tree
--- 419,425 ----
      }
  }
  
! /* BuildIndirectProcedureCallTree creates a procedure call from a
     procedure and parameter list and the return type, rettype.  */
  
  tree
*************** m2statement_BuildBuiltinCallTree (tree f
*** 486,493 ****
  }
  
  
! /* BuildFunctValue - generates code for value :=
!    last_function(foobar); */
  
  tree
  m2statement_BuildFunctValue (location_t location, tree value)
--- 486,493 ----
  }
  
  
! /* BuildFunctValue generates code for
!    value := last_function (foobar).  */
  
  tree
  m2statement_BuildFunctValue (location_t location, tree value)
*************** m2statement_BuildFunctValue (location_t
*** 505,514 ****
    TREE_USED (value) = true;
    last_function = NULL_TREE;
    return assign;
-   // return m2statement_BuildAssignmentTree (location, value, assign);
  }
  
! /* BuildCall2 - builds a tree representing: function (arg1, arg2).  */
  
  tree
  m2statement_BuildCall2 (location_t location, tree function, tree rettype,
--- 505,513 ----
    TREE_USED (value) = true;
    last_function = NULL_TREE;
    return assign;
  }
  
! /* BuildCall2 builds a tree representing: function (arg1, arg2).  */
  
  tree
  m2statement_BuildCall2 (location_t location, tree function, tree rettype,
*************** m2statement_BuildCall2 (location_t locat
*** 522,529 ****
    return m2statement_BuildProcedureCallTree (location, function, rettype);
  }
  
! /* BuildCall3 - builds a tree representing: function (arg1, arg2,
!    arg3).  */
  
  tree
  m2statement_BuildCall3 (location_t location, tree function, tree rettype,
--- 521,527 ----
    return m2statement_BuildProcedureCallTree (location, function, rettype);
  }
  
! /* BuildCall3 builds a tree representing: function (arg1, arg2, arg3).  */
  
  tree
  m2statement_BuildCall3 (location_t location, tree function, tree rettype,
*************** m2statement_BuildCall3 (location_t locat
*** 538,544 ****
    return m2statement_BuildProcedureCallTree (location, function, rettype);
  }
  
! /* BuildFunctionCallTree - creates a procedure function call from
     a procedure and parameter list and the return type, rettype.
     No tree is returned as the tree is held in the last_function global
     variable.  It is expected the BuildFunctValue is to be called after
--- 536,542 ----
    return m2statement_BuildProcedureCallTree (location, function, rettype);
  }
  
! /* BuildFunctionCallTree creates a procedure function call from
     a procedure and parameter list and the return type, rettype.
     No tree is returned as the tree is held in the last_function global
     variable.  It is expected the BuildFunctValue is to be called after
*************** m2statement_BuildFunctionCallTree (locat
*** 551,557 ****
    m2statement_BuildProcedureCallTree (location, procedure, rettype);
  }
  
! /* SetLastFunction - assigns last_function to, t.  */
  
  void
  m2statement_SetLastFunction (tree t)
--- 549,555 ----
    m2statement_BuildProcedureCallTree (location, procedure, rettype);
  }
  
! /* SetLastFunction assigns last_function to, t.  */
  
  void
  m2statement_SetLastFunction (tree t)
*************** m2statement_SetLastFunction (tree t)
*** 559,565 ****
    last_function = t;
  }
  
! /* SetParamList - assigns param_list to, t.  */
  
  void
  m2statement_SetParamList (tree t)
--- 557,563 ----
    last_function = t;
  }
  
! /* SetParamList assigns param_list to, t.  */
  
  void
  m2statement_SetParamList (tree t)
*************** m2statement_SetParamList (tree t)
*** 567,573 ****
    param_list = t;
  }
  
! /* GetLastFunction - returns, last_function.  */
  
  tree
  m2statement_GetLastFunction (void)
--- 565,571 ----
    param_list = t;
  }
  
! /* GetLastFunction returns, last_function.  */
  
  tree
  m2statement_GetLastFunction (void)
*************** m2statement_GetLastFunction (void)
*** 575,581 ****
    return last_function;
  }
  
! /* GetParamList - returns, param_list.  */
  
  tree
  m2statement_GetParamList (void)
--- 573,579 ----
    return last_function;
  }
  
! /* GetParamList returns, param_list.  */
  
  tree
  m2statement_GetParamList (void)
*************** m2statement_GetParamList (void)
*** 583,589 ****
    return param_list;
  }
  
! /* GetCurrentFunction - returns the current_function.  */
  
  tree
  m2statement_GetCurrentFunction (void)
--- 581,587 ----
    return param_list;
  }
  
! /* GetCurrentFunction returns the current_function.  */
  
  tree
  m2statement_GetCurrentFunction (void)
*************** m2statement_GetCurrentFunction (void)
*** 591,597 ****
    return current_function_decl;
  }
  
! /* GetParamTree - return parameter, i.  */
  
  tree
  m2statement_GetParamTree (tree call, unsigned int i)
--- 589,595 ----
    return current_function_decl;
  }
  
! /* GetParamTree return parameter, i.  */
  
  tree
  m2statement_GetParamTree (tree call, unsigned int i)
*************** m2statement_GetParamTree (tree call, uns
*** 599,605 ****
    return CALL_EXPR_ARG (call, i);
  }
  
! /* BuildTryFinally - returns a TRY_FINALL_EXPR with the call and
     cleanups attached.  */
  
  tree
--- 597,603 ----
    return CALL_EXPR_ARG (call, i);
  }
  
! /* BuildTryFinally returns a TRY_FINALL_EXPR with the call and
     cleanups attached.  */
  
  tree
*************** m2statement_BuildTryFinally (location_t
*** 608,614 ****
    return build_stmt (location, TRY_FINALLY_EXPR, call, cleanups);
  }
  
! /* BuildCleanUp - return a CLEANUP_POINT_EXPR which will clobber,
     param.  */
  
  tree
--- 606,612 ----
    return build_stmt (location, TRY_FINALLY_EXPR, call, cleanups);
  }
  
! /* BuildCleanUp return a CLEANUP_POINT_EXPR which will clobber,
     param.  */
  
  tree
*************** m2statement_BuildCleanUp (tree param)
*** 619,625 ****
    return build2 (MODIFY_EXPR, TREE_TYPE (param), param, clobber);
  }
  
! /* BuildAsm - generates an inline assembler instruction.  */
  
  void
  m2statement_BuildAsm (location_t location, tree instr, bool isVolatile,
--- 617,623 ----
    return build2 (MODIFY_EXPR, TREE_TYPE (param), param, clobber);
  }
  
! /* BuildAsm generates an inline assembler instruction.  */
  
  void
  m2statement_BuildAsm (location_t location, tree instr, bool isVolatile,
*************** m2statement_BuildAsm (location_t locatio
*** 640,937 ****
    add_stmt (location, args);
  }
  
! /* BuildUnaryForeachWordDo - provides the large set operators.  Each
!    word (or less) of the set can be calculated by unop.  This
!    procedure runs along each word of the large set invoking the unop.  */
! 
! void
! m2statement_BuildUnaryForeachWordDo (location_t location, tree type, tree op1,
!                                      tree op2,
!                                      tree (*unop) (location_t, tree, bool),
!                                      bool is_op1lvalue, bool is_op2lvalue,
!                                      bool is_op1const, bool is_op2const)
! {
!   tree size = m2expr_GetSizeOf (location, type);
! 
!   m2assert_AssertLocation (location);
!   ASSERT_BOOL (is_op1lvalue);
!   ASSERT_BOOL (is_op2lvalue);
!   ASSERT_BOOL (is_op1const);
!   ASSERT_BOOL (is_op2const);
!   if (m2expr_CompareTrees (
!           size, m2decl_BuildIntegerConstant (SET_WORD_SIZE / BITS_PER_UNIT))
!       <= 0)
!     /* Small set size <= TSIZE(WORD).  */
!     m2statement_BuildAssignmentTree (
!         location, m2treelib_get_rvalue (location, op1, type, is_op1lvalue),
!         (*unop) (location,
!                  m2treelib_get_rvalue (location, op2, type, is_op2lvalue),
!                  false));
!   else
!     {
!       /* Large set size > TSIZE(WORD).  */
!       unsigned int fieldNo = 0;
!       tree field1 = m2treelib_get_field_no (type, op1, is_op1const, fieldNo);
!       tree field2 = m2treelib_get_field_no (type, op2, is_op2const, fieldNo);
! 
!       if (is_op1const)
!         error ("internal error: not expecting operand1 to be a constant set");
! 
!       while (field1 != NULL && field2 != NULL)
!         {
!           m2statement_BuildAssignmentTree (
!               location, m2treelib_get_set_field_des (location, op1, field1),
!               (*unop) (location,
!                        m2treelib_get_set_field_rhs (location, op2, field2),
!                        false));
!           fieldNo++;
!           field1 = m2treelib_get_field_no (type, op1, is_op1const, fieldNo);
!           field2 = m2treelib_get_field_no (type, op2, is_op2const, fieldNo);
!         }
!     }
! }
! 
! /* BuildExcludeVarConst - builds the EXCL(op1, 1<<op2) operation for
!    a small sets.  Large sets call this routine to exclude the bit in
!    the particular word.  op2 is a constant.  */
! 
! void
! m2statement_BuildExcludeVarConst (location_t location, tree type, tree op1,
!                                   tree op2, bool is_lvalue, int fieldno)
! {
!   tree size = m2expr_GetSizeOf (location, type);
! 
!   m2assert_AssertLocation (location);
!   ASSERT_BOOL (is_lvalue);
!   if (m2expr_CompareTrees (
!           size, m2decl_BuildIntegerConstant (SET_WORD_SIZE / BITS_PER_UNIT))
!       <= 0)
!     {
!       /* Small set size <= TSIZE(WORD).  */
!       m2statement_BuildAssignmentTree (
!           location, m2treelib_get_rvalue (location, op1, type, is_lvalue),
!           m2expr_BuildLogicalAnd (
!               location, m2treelib_get_rvalue (location, op1, type, is_lvalue),
!               m2expr_BuildSetNegate (
!                   location,
!                   m2expr_BuildLSL (location, m2expr_GetWordOne (location), op2,
!                                    false),
!                   false),
!               false));
!     }
!   else
!     {
!       tree fieldlist = TYPE_FIELDS (type);
!       tree field;
! 
!       for (field = fieldlist; (field != NULL) && (fieldno > 0);
!            field = TREE_CHAIN (field))
!         fieldno--;
! 
!       m2statement_BuildAssignmentTree (
!           location, m2treelib_get_set_field_des (location, op1, field),
!           m2expr_BuildLogicalAnd (
!               location, m2treelib_get_set_field_rhs (location, op1, field),
!               m2expr_BuildSetNegate (
!                   location,
!                   m2expr_BuildLSL (location, m2expr_GetWordOne (location), op2,
!                                    false),
!                   false),
!               false));
!     }
! }
! 
! /* BuildExcludeVarVar - builds the EXCL(varset, 1<<varel) operation
!    for a small and large sets.  varel is a variable.  */
! 
! void
! m2statement_BuildExcludeVarVar (location_t location, tree type, tree varset,
!                                 tree varel, bool is_lvalue, tree low)
! {
!   tree size = m2expr_GetSizeOf (location, type);
! 
!   m2assert_AssertLocation (location);
!   ASSERT_BOOL (is_lvalue);
!   /* Calculate the index from the first bit, ie bit 0 represents low value.  */
!   tree index
!       = m2expr_BuildSub (location, m2convert_ToInteger (location, varel),
!                          m2convert_ToInteger (location, low), false);
! 
!   if (m2expr_CompareTrees (
!           size, m2decl_BuildIntegerConstant (SET_WORD_SIZE / BITS_PER_UNIT))
!       <= 0)
!     /* Small set size <= TSIZE(WORD).  */
!     m2statement_BuildAssignmentTree (
!         location, m2treelib_get_rvalue (location, varset, type, is_lvalue),
!         m2expr_BuildLogicalAnd (
!             location, m2treelib_get_rvalue (location, varset, type, is_lvalue),
!             m2expr_BuildSetNegate (
!                 location,
!                 m2expr_BuildLSL (location, m2expr_GetWordOne (location),
!                                  m2convert_ToWord (location, index), false),
!                 false),
!             false));
!   else
!     {
!       tree p1 = m2treelib_get_set_address (location, varset, is_lvalue);
!       /* Calculate the index from the first bit.  */
! 
!       /* Which word do we need to fetch?  */
!       tree word_index = m2expr_BuildDivTrunc (
!           location, index, m2decl_BuildIntegerConstant (SET_WORD_SIZE), false);
!       /* Calculate the bit in this word.  */
!       tree offset_into_word = m2expr_BuildModTrunc (
!           location, index, m2decl_BuildIntegerConstant (SET_WORD_SIZE), false);
! 
!       tree v1;
! 
!       /* Calculate the address of the word we are interested in.  */
!       p1 = m2expr_BuildAddAddress (
!           location, m2convert_convertToPtr (location, p1),
!           m2expr_BuildMult (
!               location, word_index,
!               m2decl_BuildIntegerConstant (SET_WORD_SIZE / BITS_PER_UNIT),
!               false));
! 
!       v1 = m2expr_BuildLogicalAnd (
!           location,
!           m2expr_BuildIndirect (location, p1, m2type_GetBitsetType ()),
!           m2expr_BuildSetNegate (
!               location,
!               m2expr_BuildLSL (location, m2expr_GetWordOne (location),
!                                m2convert_ToWord (location, offset_into_word),
!                                false),
!               false),
!           false);
! 
!       /* Set bit offset_into_word within the word pointer at by p1.  */
!       m2statement_BuildAssignmentTree (
!           location,
!           m2expr_BuildIndirect (location, p1, m2type_GetBitsetType ()),
!           m2convert_ToBitset (location, v1));
!     }
! }
! 
! /* BuildIncludeVarConst - builds the INCL(op1, 1<<op2) operation for
!    a small sets.  Large sets call this routine to include the bit in
!    the particular word.  op2 is a constant.  */
! 
! void
! m2statement_BuildIncludeVarConst (location_t location, tree type, tree op1,
!                                   tree op2, bool is_lvalue, int fieldno)
! {
!   tree size = m2expr_GetSizeOf (location, type);
! 
!   m2assert_AssertLocation (location);
!   ASSERT_BOOL (is_lvalue);
!   if (m2expr_CompareTrees (
!           size, m2decl_BuildIntegerConstant (SET_WORD_SIZE / BITS_PER_UNIT))
!       <= 0)
!     {
!       /* Small set size <= TSIZE(WORD).  */
!       m2statement_BuildAssignmentTree (
!           location, m2treelib_get_rvalue (location, op1, type, is_lvalue),
!           m2expr_BuildLogicalOr (
!               location, m2treelib_get_rvalue (location, op1, type, is_lvalue),
!               m2expr_BuildLSL (location, m2expr_GetWordOne (location),
!                                m2convert_ToWord (location, op2), false),
!               false));
!     }
!   else
!     {
!       tree fieldlist = TYPE_FIELDS (type);
!       tree field;
! 
!       for (field = fieldlist; (field != NULL) && (fieldno > 0);
!            field = TREE_CHAIN (field))
!         fieldno--;
! 
!       m2statement_BuildAssignmentTree (
!           location,
!           /* Would like to use: m2expr_BuildComponentRef (location, p, field)
!              but strangely we have to take the address of the field and
!              dereference it to satify the gimplifier.  See
!              testsuite/gm2/pim/pass/timeio?.mod for testcases.  */
!           m2treelib_get_set_field_des (location, op1, field),
!           m2expr_BuildLogicalOr (
!               location, m2treelib_get_set_field_rhs (location, op1, field),
!               m2expr_BuildLSL (location, m2expr_GetWordOne (location),
!                                m2convert_ToWord (location, op2), false),
!               false));
!     }
! }
! 
! /* BuildIncludeVarVar - builds the INCL(varset, 1<<varel) operation
!    for a small and large sets.  op2 is a variable.  */
! 
! void
! m2statement_BuildIncludeVarVar (location_t location, tree type, tree varset,
!                                 tree varel, bool is_lvalue, tree low)
! {
!   tree size = m2expr_GetSizeOf (location, type);
! 
!   m2assert_AssertLocation (location);
!   ASSERT_BOOL (is_lvalue);
!   /* Calculate the index from the first bit, ie bit 0 represents low value.  */
!   tree index
!       = m2expr_BuildSub (location, m2convert_ToInteger (location, varel),
!                          m2convert_ToInteger (location, low), false);
!   tree indexw = m2convert_ToWord (location, index);
! 
!   if (m2expr_CompareTrees (
!           size, m2decl_BuildIntegerConstant (SET_WORD_SIZE / BITS_PER_UNIT))
!       <= 0)
!     /* Small set size <= TSIZE(WORD).  */
!     m2statement_BuildAssignmentTree (
!         location, m2treelib_get_rvalue (location, varset, type, is_lvalue),
!         m2convert_ToBitset (
!             location,
!             m2expr_BuildLogicalOr (
!                 location,
!                 m2treelib_get_rvalue (location, varset, type, is_lvalue),
!                 m2expr_BuildLSL (location, m2expr_GetWordOne (location),
!                                  indexw, false),
!                 false)));
!   else
!     {
!       tree p1 = m2treelib_get_set_address (location, varset, is_lvalue);
!       /* Which word do we need to fetch?  */
!       tree word_index = m2expr_BuildDivTrunc (
!           location, index, m2decl_BuildIntegerConstant (SET_WORD_SIZE), false);
!       /* Calculate the bit in this word.  */
!       tree offset_into_word = m2convert_BuildConvert (
!           location, m2type_GetWordType (),
!           m2expr_BuildModTrunc (location, index,
!                                 m2decl_BuildIntegerConstant (SET_WORD_SIZE),
!                                 false),
!           false);
!       tree v1;
! 
!       /* Calculate the address of the word we are interested in.  */
!       p1 = m2expr_BuildAddAddress (
!           location, m2convert_convertToPtr (location, p1),
!           m2expr_BuildMult (
!               location, word_index,
!               m2decl_BuildIntegerConstant (SET_WORD_SIZE / BITS_PER_UNIT),
!               false));
!       v1 = m2expr_BuildLogicalOr (
!           location,
!           m2expr_BuildIndirect (location, p1, m2type_GetBitsetType ()),
!           m2convert_ToBitset (location,
!                               m2expr_BuildLSL (location,
!                                                m2expr_GetWordOne (location),
!                                                offset_into_word, false)),
!           false);
! 
!       /* Set bit offset_into_word within the word pointer at by p1.  */
!       m2statement_BuildAssignmentTree (
!           location,
!           m2expr_BuildIndirect (location, p1, m2type_GetBitsetType ()),
!           m2convert_ToBitset (location, v1));
!     }
! }
! 
! /* BuildStart - creates a module initialization function.  We make
     this function public if it is not an inner module.  The linker
     will create a call list for all linked modules which determines
     the initialization sequence for all modules.  */
--- 638,644 ----
    add_stmt (location, args);
  }
  
! /* BuildStart creates a module initialization function.  We make
     this function public if it is not an inner module.  The linker
     will create a call list for all linked modules which determines
     the initialization sequence for all modules.  */
*************** m2statement_BuildStart (location_t locat
*** 967,973 ****
    return fndecl;
  }
  
! /* BuildEnd - complete the initialization function for this module.  */
  
  void
  m2statement_BuildEnd (location_t location, tree fndecl, bool nested)
--- 674,680 ----
    return fndecl;
  }
  
! /* BuildEnd complete the initialization function for this module.  */
  
  void
  m2statement_BuildEnd (location_t location, tree fndecl, bool nested)
*************** m2statement_BuildEnd (location_t locatio
*** 977,983 ****
    set_cfun (NULL);
  }
  
! /* BuildCallInner - call the inner module function.  It has no
     parameters and no return value.  */
  
  void
--- 684,690 ----
    set_cfun (NULL);
  }
  
! /* BuildCallInner call the inner module function.  It has no
     parameters and no return value.  */
  
  void
*************** m2statement_BuildCallInner (location_t l
*** 990,996 ****
  }
  
  
! /* BuildIfThenDoEnd - returns a tree which will only execute
     statement, s, if, condition, is true.  */
  
  tree
--- 697,703 ----
  }
  
  
! /* BuildIfThenDoEnd returns a tree which will only execute
     statement, s, if, condition, is true.  */
  
  tree
*************** m2statement_BuildIfThenDoEnd (tree condi
*** 1003,1009 ****
                          alloc_stmt_list ());
  }
  
! /* BuildIfThenElseEnd - returns a tree which will execute then_block
     or else_block depending upon, condition.  */
  
  tree
--- 710,716 ----
                          alloc_stmt_list ());
  }
  
! /* BuildIfThenElseEnd returns a tree which will execute then_block
     or else_block depending upon, condition.  */
  
  tree
*************** m2statement_BuildIfThenElseEnd (tree con
*** 1017,1024 ****
                          else_block);
  }
  
! /* BuildReturnValueCode - generates the code associated with: RETURN(
!    value ) */
  
  void
  m2statement_BuildReturnValueCode (location_t location, tree fndecl, tree value)
--- 724,731 ----
                          else_block);
  }
  
! /* BuildReturnValueCode generates the code associated with:
!    RETURN ( value ).  */
  
  void
  m2statement_BuildReturnValueCode (location_t location, tree fndecl, tree value)
*************** m2statement_BuildReturnValueCode (locati
*** 1037,1077 ****
    add_stmt (location, ret_stmt);
  }
  
! /* DoJump - jump to the appropriate label depending whether result of
!    the expression is true or false.  */
  
  void
! m2statement_DoJump (location_t location, tree exp, char *falselabel,
!                     char *truelabel)
  {
!   tree c = NULL_TREE;
  
    m2assert_AssertLocation (location);
    if (TREE_CODE (TREE_TYPE (exp)) != BOOLEAN_TYPE)
      exp = convert_loc (location, m2type_GetBooleanType (), exp);
  
!   if ((falselabel != NULL) && (truelabel == NULL))
!     {
!       m2block_push_statement_list (m2block_begin_statement_list ());
  
-       m2statement_BuildGoto (location, falselabel);
-       c = build3 (COND_EXPR, void_type_node, exp,
-                   m2block_pop_statement_list (),
-                   alloc_stmt_list ());
-     }
-   else if ((falselabel == NULL) && (truelabel != NULL))
-     {
-       m2block_push_statement_list (m2block_begin_statement_list ());
  
!       m2statement_BuildGoto (location, truelabel);
!       c = build3 (COND_EXPR, void_type_node, exp,
!                   m2block_pop_statement_list (),
!                   alloc_stmt_list ());
!     }
!   else
!     error_at (location, "expecting one and only one label to be declared");
!   if (c != NULL_TREE)
!     add_stmt (location, c);
  }
  
  #include "gt-m2-m2statement.h"
--- 744,788 ----
    add_stmt (location, ret_stmt);
  }
  
! /* IfExprJump if expr then jump to the label.  */
  
  void
! m2statement_IfExprJump (location_t location, tree exp, char *label)
  {
!   tree if_jump;
  
    m2assert_AssertLocation (location);
    if (TREE_CODE (TREE_TYPE (exp)) != BOOLEAN_TYPE)
      exp = convert_loc (location, m2type_GetBooleanType (), exp);
  
!   m2block_push_statement_list (m2block_begin_statement_list ());
!   m2statement_BuildGoto (location, label);
!   if_jump = build3 (COND_EXPR, void_type_node, exp,
! 		    m2block_pop_statement_list (),
! 		    alloc_stmt_list ());
!   add_stmt (location, if_jump);
! }
  
  
! /* IfBitInSetJump if bit in set jump to label.  */
! 
! void
! m2statement_IfBitInSetJump (location_t location, bool invertCondition,
! 			    tree setvalue, tree bit, char *label)
! {
!   tree condition;
! 
!   condition = m2expr_BuildNotEqualTo (location,
! 				      m2expr_BuildLogicalAnd (location,
! 							      m2expr_BuildLSL (location,
! 									       m2expr_GetWordOne (location),
! 									       bit, false),
! 							      setvalue),
! 				      m2expr_GetWordZero (location)) ;
!   if (invertCondition)
!     condition = m2expr_BuildEqualTo (location, condition,
! 				     m2type_GetBooleanFalse ());
!   m2statement_IfExprJump (location, condition, label);
  }
  
  #include "gt-m2-m2statement.h"
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2statement.def gcc-16-20250921/gcc/m2/gm2-gcc/m2statement.def
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2statement.def	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2statement.def	Sun Sep 21 22:32:38 2025
*************** DEFINITION MODULE FOR "C" m2statement ;
*** 24,37 ****
  FROM gcctypes IMPORT location_t, tree ;
  FROM CDataTypes IMPORT CharStar ;
  FROM m2expr IMPORT BuildUnarySetFunction ;
  
  
  (*
!    DoJump - jump to the appropriate label depending whether
!             result of the expression is TRUE or FALSE.
  *)
  
! PROCEDURE DoJump (location: location_t; exp: tree; falselabel, truelabel: CharStar) ;
  
  
  (*
--- 24,37 ----
  FROM gcctypes IMPORT location_t, tree ;
  FROM CDataTypes IMPORT CharStar ;
  FROM m2expr IMPORT BuildUnarySetFunction ;
+ FROM SYSTEM IMPORT ADDRESS ;
  
  
  (*
!    IfExprJump - if expr then jump to the label.
  *)
  
! PROCEDURE IfExprJump (location: location_t; exp: tree; label: CharStar) ;
  
  
  (*
*************** PROCEDURE BuildAsm (location: location_t
*** 222,240 ****
  
  
  (*
-     BuildUnaryForeachWordDo - provides the large set operators.
-                               Each word (or less) of the set can be
-                               calculated by unop.
-                               This procedure iterates over each word
-                               of the large set invoking the unop.
- *)
- 
- PROCEDURE BuildUnaryForeachWordDo (location: location_t; type: tree; op1: tree; op2: tree;
-                                    unop: BuildUnarySetFunction;
-                                    is_op1lvalue, is_op2lvalue, is_op1const, is_op2const: BOOLEAN) ;
- 
- 
- (*
      BuildExcludeVarConst - builds the EXCL(op1, 1<<op2) operation for a small sets. Large
                             sets call this routine to exclude the bit in the particular word.
                             op2 is a constant.
--- 222,227 ----
*************** PROCEDURE BuildBuiltinCallTree (func: tr
*** 326,329 ****
--- 313,324 ----
  PROCEDURE CopyByField (location: location_t; des, expr: tree) ;
  
  
+ (*
+    IfBitInSetJump - if bit in set jump to label.
+ *)
+ 
+ PROCEDURE IfBitInSetJump (location: location_t; invertCondition: BOOLEAN;
+                           setvalue, bit: tree; label: ADDRESS) ;
+ 
+ 
  END m2statement.
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2statement.h gcc-16-20250921/gcc/m2/gm2-gcc/m2statement.h
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2statement.h	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2statement.h	Sun Sep 21 22:32:38 2025
*************** EXTERN void m2statement_BuildExcludeVarV
*** 52,61 ****
  EXTERN void m2statement_BuildExcludeVarConst (location_t location, tree type,
                                                tree op1, tree op2,
                                                bool is_lvalue, int fieldno);
- EXTERN void m2statement_BuildUnaryForeachWordDo (
-     location_t location, tree type, tree op1, tree op2,
-     tree (*unop) (location_t, tree, bool), bool is_op1lvalue, bool is_op2lvalue,
-     bool is_op1const, bool is_op2const);
  EXTERN void m2statement_BuildAsm (location_t location, tree instr,
                                    bool isVolatile, bool isSimple, tree inputs,
                                    tree outputs, tree trash, tree labels);
--- 52,57 ----
*************** EXTERN void m2statement_BuildEndFunction
*** 88,95 ****
  EXTERN void m2statement_BuildStartFunctionCode (location_t location,
                                                  tree fndecl, bool isexported,
                                                  bool isinline);
! EXTERN void m2statement_DoJump (location_t location, tree exp,
!                                 char *falselabel, char *truelabel);
  EXTERN tree m2statement_BuildCall2 (location_t location, tree function,
                                      tree rettype, tree arg1, tree arg2);
  EXTERN tree m2statement_BuildCall3 (location_t location, tree function,
--- 84,90 ----
  EXTERN void m2statement_BuildStartFunctionCode (location_t location,
                                                  tree fndecl, bool isexported,
                                                  bool isinline);
! EXTERN void m2statement_IfExprJump (location_t location, tree exp, char *label);
  EXTERN tree m2statement_BuildCall2 (location_t location, tree function,
                                      tree rettype, tree arg1, tree arg2);
  EXTERN tree m2statement_BuildCall3 (location_t location, tree function,
*************** EXTERN tree m2statement_BuildBuiltinCall
*** 108,113 ****
--- 103,110 ----
  EXTERN tree m2statement_BuildTryFinally (location_t location, tree call,
                                           tree cleanups);
  EXTERN tree m2statement_BuildCleanUp (tree param);
+ EXTERN void m2statement_IfBitInSetJump (location_t location, bool invertCondition,
+ 					tree setvalue, tree bit, char *label);
  EXTERN void m2statement_CopyByField (location_t location, tree des, tree expr);
  
  #undef EXTERN
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2treelib.cc gcc-16-20250921/gcc/m2/gm2-gcc/m2treelib.cc
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2treelib.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2treelib.cc	Sun Sep 21 22:32:38 2025
*************** m2treelib_do_jump_if_bit (location_t loc
*** 45,51 ****
  {
    word = m2convert_ToWord (location, word);
    bit = m2convert_ToWord (location, bit);
!   m2statement_DoJump (
        location,
        m2expr_build_binary_op (
            location, code,
--- 45,51 ----
  {
    word = m2convert_ToWord (location, word);
    bit = m2convert_ToWord (location, bit);
!   m2statement_IfExprJump (
        location,
        m2expr_build_binary_op (
            location, code,
*************** m2treelib_do_jump_if_bit (location_t loc
*** 55,61 ****
                                 FALSE),
                FALSE),
            m2expr_GetWordZero (location), FALSE),
!       NULL, label);
  }
  
  /* build_modify_expr - taken from c-typeck.cc and heavily pruned.
--- 55,61 ----
                                 FALSE),
                FALSE),
            m2expr_GetWordZero (location), FALSE),
!       label);
  }
  
  /* build_modify_expr - taken from c-typeck.cc and heavily pruned.
*************** m2treelib_build_modify_expr (location_t
*** 147,154 ****
  
  /* nCount - return the number of trees chained on, t.  */
  
! static int
! nCount (tree t)
  {
    int i = 0;
  
--- 147,154 ----
  
  /* nCount - return the number of trees chained on, t.  */
  
! int
! m2treelib_nCount (tree t)
  {
    int i = 0;
  
*************** tree
*** 167,173 ****
  m2treelib_DoCall (location_t location, tree rettype, tree funcptr,
                    tree param_list)
  {
!   int n = nCount (param_list);
    tree *argarray = XALLOCAVEC (tree, n);
    tree l = param_list;
    int i;
--- 167,173 ----
  m2treelib_DoCall (location_t location, tree rettype, tree funcptr,
                    tree param_list)
  {
!   int n = m2treelib_nCount (param_list);
    tree *argarray = XALLOCAVEC (tree, n);
    tree l = param_list;
    int i;
*************** m2treelib_DoCall3 (location_t location,
*** 229,246 ****
    return build_call_array_loc (location, rettype, funcptr, 3, argarray);
  }
  
- /* get_rvalue - returns the rvalue of t.  The, type, is the object
-    type to be copied upon indirection.  */
- 
- tree
- m2treelib_get_rvalue (location_t location, tree t, tree type, bool is_lvalue)
- {
-   if (is_lvalue)
-     return m2expr_BuildIndirect (location, t, type);
-   else
-     return t;
- }
- 
  /* get_field_no - returns the field no for, op.  The, op, is either a
     constructor or a variable of type record.  If, op, is a
     constructor (a set constant in GNU Modula-2) then this function is
--- 229,234 ----
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2treelib.def gcc-16-20250921/gcc/m2/gm2-gcc/m2treelib.def
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2treelib.def	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2treelib.def	Sun Sep 21 22:32:38 2025
*************** PROCEDURE get_field_no (type: tree; op:
*** 79,92 ****
  
  
  (*
-     get_rvalue - returns the rvalue of t. The, type, is the object type to be
-                  copied upon indirection.
- *)
- 
- PROCEDURE get_rvalue (location: location_t; t: tree; type: tree; is_lvalue: BOOLEAN) : tree ;
- 
- 
- (*
      DoCall - build a call tree arranging the parameter list as a vector.
  *)
  
--- 79,84 ----
*************** PROCEDURE build_modify_expr (location: l
*** 105,108 ****
--- 97,107 ----
  PROCEDURE do_jump_if_bit (location: location_t; code: tree_code; word: tree; bit: tree; label: ADDRESS) ;
  
  
+ (*
+    nCount - return the number of trees chained.
+ *)
+ 
+ PROCEDURE nCount (t: tree) : INTEGER ;
+ 
+ 
  END m2treelib.
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2treelib.h gcc-16-20250921/gcc/m2/gm2-gcc/m2treelib.h
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2treelib.h	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2treelib.h	Sun Sep 21 22:32:38 2025
*************** EXTERN tree m2treelib_DoCall2 (location_
*** 41,48 ****
                                 tree arg0, tree arg1);
  EXTERN tree m2treelib_DoCall3 (location_t location, tree rettype, tree funcptr,
                                 tree arg0, tree arg1, tree arg2);
- EXTERN tree m2treelib_get_rvalue (location_t location, tree t, tree type,
-                                   bool is_lvalue);
  EXTERN tree m2treelib_get_field_no (tree type, tree op, bool is_const,
                                      unsigned int fieldNo);
  EXTERN tree m2treelib_get_set_value (location_t location, tree p, tree field,
--- 41,46 ----
*************** EXTERN tree m2treelib_get_set_field_des
*** 61,66 ****
--- 59,65 ----
  
  EXTERN tree add_stmt (location_t location, tree t);
  EXTERN tree build_stmt (location_t loc, enum tree_code code, ...);
+ EXTERN int m2treelib_nCount (tree t);
  
  #undef EXTERN
  #endif /* m2treelib_h.  */
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2type.cc gcc-16-20250921/gcc/m2/gm2-gcc/m2type.cc
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2type.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2type.cc	Sun Sep 21 22:32:38 2025
*************** struct GTY (()) struct_constructor
*** 50,61 ****
    /* Constructor_fields, the list of fields belonging to
       constructor_type.  Used by SET and RECORD constructors.  */
    tree GTY ((skip (""))) constructor_fields;
!   /* Constructor_element_list, the list of constants used by SET and
!      RECORD constructors.  */
!   tree GTY ((skip (""))) constructor_element_list;
!   /* Constructor_elements, used by an ARRAY initializer all elements
!      are held in reverse order.  */
    vec<constructor_elt, va_gc> *constructor_elements;
    /* Level, the next level down in the constructor stack.  */
    struct struct_constructor *level;
  };
--- 50,60 ----
    /* Constructor_fields, the list of fields belonging to
       constructor_type.  Used by SET and RECORD constructors.  */
    tree GTY ((skip (""))) constructor_fields;
!   /* Constructor_elements, used by an ARRAY, RECORD and SET initializer
!      all elements are held in reverse order.  */
    vec<constructor_elt, va_gc> *constructor_elements;
+   /* The next byte_index to be used when adding set bytes to an array.  */
+   int byte_index;
    /* Level, the next level down in the constructor stack.  */
    struct struct_constructor *level;
  };
*************** m2type_BuildEndArrayType (tree arraytype
*** 243,250 ****
      return gm2_finish_build_array_type (arraytype, ptr_type_node, indextype,
                                          type);
    else
!     return gm2_finish_build_array_type (
!         arraytype, m2tree_skip_type_decl (elementtype), indextype, type);
  }
  
  /* gm2_build_array_type returns a type which is an array indexed by
--- 242,250 ----
      return gm2_finish_build_array_type (arraytype, ptr_type_node, indextype,
                                          type);
    else
!     return gm2_finish_build_array_type (arraytype,
!        m2tree_skip_type_decl (elementtype),
!        indextype, type);
  }
  
  /* gm2_build_array_type returns a type which is an array indexed by
*************** static tree
*** 330,336 ****
  build_m2_type_node_by_array (tree arrayType, tree low, tree high, int fetype)
  {
    return gm2_build_array_type (arrayType,
!                                m2type_BuildArrayIndexType (low, high), fetype);
  }
  
  /* build_m2_word16_type_node build an ISO 16 bit word as an ARRAY
--- 330,337 ----
  build_m2_type_node_by_array (tree arrayType, tree low, tree high, int fetype)
  {
    return gm2_build_array_type (arrayType,
!                                m2type_BuildArrayIndexType (low, high),
! 			       fetype);
  }
  
  /* build_m2_word16_type_node build an ISO 16 bit word as an ARRAY
*************** m2type_GetBooleanType (void)
*** 893,898 ****
--- 894,910 ----
  #endif /* !USE_BOOLEAN  */
  }
  
+ /* GetBooleanEnumList return a list containing boolean fields true and false.  */
+ 
+ tree
+ m2type_GetBooleanEnumList (location_t location)
+ {
+   tree list = NULL;
+   m2type_BuildEnumerator (location, "TRUE", m2type_GetBooleanTrue (), &list);
+   m2type_BuildEnumerator (location, "FALSE", m2type_GetBooleanTrue (), &list);
+   return list;
+ }
+ 
  /* GetCardinalAddressType returns the internal data type for
     computing binary arithmetic upon the ADDRESS datatype.  */
  
*************** m2type_GetDefaultType (location_t locati
*** 1892,1898 ****
  }
  
  /* IsGccRealType return true if type is a GCC realtype.  */
!   
  static
  bool
  IsGccRealType (tree type)
--- 1904,1910 ----
  }
  
  /* IsGccRealType return true if type is a GCC realtype.  */
! 
  static
  bool
  IsGccRealType (tree type)
*************** m2type_GetMinFrom (location_t location,
*** 1935,1941 ****
    return TYPE_MIN_VALUE (m2tree_skip_type_decl (type));
  }
  
! static      
  tree
  do_max_real (tree type)
  {
--- 1947,1953 ----
    return TYPE_MIN_VALUE (m2tree_skip_type_decl (type));
  }
  
! static
  tree
  do_max_real (tree type)
  {
*************** pop_constructor (struct struct_construct
*** 2274,2281 ****
    top_constructor = top_constructor->level;
  }
  
! /* BuildStartSetConstructor starts to create a set constant.
!    Remember that type is really a record type.  */
  
  void *
  m2type_BuildStartSetConstructor (tree type)
--- 2286,2293 ----
    top_constructor = top_constructor->level;
  }
  
! /* BuildStartSetConstructor starts to create a wide set constant.
!    A wide set type will be implemented as an array type (array [0..max] OF BYTE).  */
  
  void *
  m2type_BuildStartSetConstructor (tree type)
*************** m2type_BuildStartSetConstructor (tree ty
*** 2285,2320 ****
    type = m2tree_skip_type_decl (type);
    layout_type (type);
    p->constructor_type = type;
!   p->constructor_fields = TYPE_FIELDS (type);
!   p->constructor_element_list = NULL_TREE;
    vec_alloc (p->constructor_elements, 1);
    return (void *)p;
  }
  
! /* BuildSetConstructorElement adds, value, to the
!    constructor_element_list.  */
  
  void
! m2type_BuildSetConstructorElement (void *p, tree value)
  {
    struct struct_constructor *c = (struct struct_constructor *)p;
  
!   if (value == NULL_TREE)
!     {
!       internal_error ("set type cannot be initialized with a %qs",
! 		      "NULL_TREE");
!       return;
!     }
! 
!   if (c->constructor_fields == NULL)
      {
!       internal_error ("set type does not take another integer value");
        return;
      }
  
!   c->constructor_element_list
!       = tree_cons (c->constructor_fields, value, c->constructor_element_list);
!   c->constructor_fields = TREE_CHAIN (c->constructor_fields);
  }
  
  /* BuildEndSetConstructor finishes building a set constant.  */
--- 2297,2328 ----
    type = m2tree_skip_type_decl (type);
    layout_type (type);
    p->constructor_type = type;
!   p->constructor_fields = TREE_TYPE (type);
!   p->byte_index = 0;
    vec_alloc (p->constructor_elements, 1);
    return (void *)p;
  }
  
! /* BuildSetConstructorElement adds value to the constructor_elements.  */
  
  void
! m2type_BuildSetConstructorElement (location_t location, void *p, tree value)
  {
    struct struct_constructor *c = (struct struct_constructor *)p;
+   constructor_elt celt;
  
!   if (c->constructor_fields == NULL_TREE)
      {
!       internal_error ("set type must be initialized");
        return;
      }
  
!   value = m2convert_BuildConvert (location, c->constructor_fields,
! 				  value, FALSE);
!   celt.index = m2decl_BuildIntegerConstant (c->byte_index);
!   celt.value = value;
!   c->byte_index++;
!   vec_safe_push (c->constructor_elements, celt);
  }
  
  /* BuildEndSetConstructor finishes building a set constant.  */
*************** m2type_BuildSetConstructorElement (void
*** 2322,2345 ****
  tree
  m2type_BuildEndSetConstructor (void *p)
  {
-   tree constructor;
-   tree link;
    struct struct_constructor *c = (struct struct_constructor *)p;
  
!   for (link = c->constructor_element_list; link; link = TREE_CHAIN (link))
!     {
!       tree field = TREE_PURPOSE (link);
!       DECL_SIZE (field) = bitsize_int (SET_WORD_SIZE);
!       DECL_BIT_FIELD (field) = 1;
!     }
! 
!   constructor = build_constructor_from_list (
!       c->constructor_type, nreverse (c->constructor_element_list));
!   TREE_CONSTANT (constructor) = 1;
!   TREE_STATIC (constructor) = 1;
! 
    pop_constructor (c);
- 
    return constructor;
  }
  
--- 2330,2342 ----
  tree
  m2type_BuildEndSetConstructor (void *p)
  {
    struct struct_constructor *c = (struct struct_constructor *)p;
+   tree constructor =
+     build_constructor (c->constructor_type, c->constructor_elements);
  
!   TREE_CONSTANT (constructor) = true;
!   TREE_STATIC (constructor) = true;
    pop_constructor (c);
    return constructor;
  }
  
*************** m2type_BuildStartRecordConstructor (tree
*** 2355,2365 ****
    layout_type (type);
    p->constructor_type = type;
    p->constructor_fields = TYPE_FIELDS (type);
-   p->constructor_element_list = NULL_TREE;
    vec_alloc (p->constructor_elements, 1);
    return (void *)p;
  }
  
  /* BuildEndRecordConstructor returns a tree containing the record
     compound literal.  */
  
--- 2352,2381 ----
    layout_type (type);
    p->constructor_type = type;
    p->constructor_fields = TYPE_FIELDS (type);
    vec_alloc (p->constructor_elements, 1);
    return (void *)p;
  }
  
+ /* build_record_constructor build and return a record constructor of type
+    record_type from the ordered values in vals.  */
+ 
+ static
+ tree
+ build_record_constructor (tree record_type, vec<constructor_elt, va_gc> *vals)
+ {
+   tree field_init;
+   unsigned int i;
+   vec<constructor_elt, va_gc> *v = NULL;
+   tree field_type = first_field (record_type);
+   FOR_EACH_CONSTRUCTOR_VALUE (vals, i, field_init)
+     {
+       CONSTRUCTOR_APPEND_ELT (v, field_type, field_init);
+       field_type = DECL_CHAIN (field_type);
+     }
+   return build_constructor (record_type, v);
+ }
+ 
+ 
  /* BuildEndRecordConstructor returns a tree containing the record
     compound literal.  */
  
*************** tree
*** 2367,2389 ****
  m2type_BuildEndRecordConstructor (void *p)
  {
    struct struct_constructor *c = (struct struct_constructor *)p;
!   tree constructor = build_constructor_from_list (
!       c->constructor_type, nreverse (c->constructor_element_list));
!   TREE_CONSTANT (constructor) = 1;
!   TREE_STATIC (constructor) = 1;
! 
    pop_constructor (c);
- 
    return constructor;
  }
  
  /* BuildRecordConstructorElement adds, value, to the
!    constructor_element_list.  */
  
  void
  m2type_BuildRecordConstructorElement (void *p, tree value)
  {
!   m2type_BuildSetConstructorElement (p, value);
  }
  
  /* BuildStartArrayConstructor initializes an array compound
--- 2383,2414 ----
  m2type_BuildEndRecordConstructor (void *p)
  {
    struct struct_constructor *c = (struct struct_constructor *)p;
!   tree constructor = build_record_constructor (c->constructor_type,
! 					       c->constructor_elements);
!   TREE_CONSTANT (constructor) = true;
!   TREE_STATIC (constructor) = true;
    pop_constructor (c);
    return constructor;
  }
  
  /* BuildRecordConstructorElement adds, value, to the
!    constructor_elements.  */
  
  void
  m2type_BuildRecordConstructorElement (void *p, tree value)
  {
!   struct struct_constructor *c = (struct struct_constructor *)p;
!   constructor_elt celt;
! 
!   if (c->constructor_fields == NULL_TREE)
!     {
!       internal_error ("record type must be initialized");
!       return;
!     }
!   celt.index = m2decl_BuildIntegerConstant (c->byte_index);
!   celt.value = value;
!   c->byte_index++;
!   vec_safe_push (c->constructor_elements, celt);
  }
  
  /* BuildStartArrayConstructor initializes an array compound
*************** m2type_BuildStartArrayConstructor (tree
*** 2398,2404 ****
    layout_type (type);
    p->constructor_type = type;
    p->constructor_fields = TREE_TYPE (type);
-   p->constructor_element_list = NULL_TREE;
    vec_alloc (p->constructor_elements, 1);
    return (void *)p;
  }
--- 2423,2428 ----
*************** m2type_BuildEndArrayConstructor (void *p
*** 2416,2429 ****
        = build_constructor (c->constructor_type, c->constructor_elements);
    TREE_CONSTANT (constructor) = true;
    TREE_STATIC (constructor) = true;
- 
    pop_constructor (c);
- 
    return constructor;
  }
  
  /* BuildArrayConstructorElement adds, value, to the
!    constructor_element_list.  */
  
  void
  m2type_BuildArrayConstructorElement (void *p, tree value, tree indice)
--- 2440,2451 ----
        = build_constructor (c->constructor_type, c->constructor_elements);
    TREE_CONSTANT (constructor) = true;
    TREE_STATIC (constructor) = true;
    pop_constructor (c);
    return constructor;
  }
  
  /* BuildArrayConstructorElement adds, value, to the
!    constructor_elements.  */
  
  void
  m2type_BuildArrayConstructorElement (void *p, tree value, tree indice)
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2type.def gcc-16-20250921/gcc/m2/gm2-gcc/m2type.def
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2type.def	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2type.def	Sun Sep 21 22:32:38 2025
*************** PROCEDURE BuildEndSetConstructor (p: Con
*** 136,142 ****
      BuildSetConstructorElement - adds, value, to the constructor_element_list.
  *)
  
! PROCEDURE BuildSetConstructorElement (p: Constructor; value: tree) ;
  
  
  (*
--- 136,142 ----
      BuildSetConstructorElement - adds, value, to the constructor_element_list.
  *)
  
! PROCEDURE BuildSetConstructorElement (location: location_t; p: Constructor; value: tree) ;
  
  
  (*
*************** PROCEDURE BuildArrayStringConstructor (l
*** 796,802 ****
  
  
  (*
!     RealToTree - convert a real number into a Tree.
  *)
  
  PROCEDURE RealToTree (name: CharStar) : tree ;
--- 796,802 ----
  
  
  (*
!     RealToTree - convert a real number into a tree.
  *)
  
  PROCEDURE RealToTree (name: CharStar) : tree ;
*************** PROCEDURE GetArrayNoOfElements (location
*** 962,968 ****
                         and which has ElementType elements.
  *)
  
! PROCEDURE BuildEndArrayType (arraytype: tree; elementtype: tree; indextype: tree; type: INTEGER) : tree ;
  
  
  (*
--- 962,969 ----
                         and which has ElementType elements.
  *)
  
! PROCEDURE BuildEndArrayType (arraytype: tree; elementtype: tree;
!                              indextype: tree; type: INTEGER) : tree ;
  
  
  (*
*************** PROCEDURE SameRealType (a, b: tree) : BO
*** 1004,1007 ****
--- 1005,1015 ----
  PROCEDURE IsGccStrictTypeEquivalent (left, right: tree) : BOOLEAN ;
  
  
+ (*
+    GetBooleanEnumList - return a list containing boolean fields true and false.
+ *)
+ 
+ PROCEDURE GetBooleanEnumList (location: location_t) : tree ;
+ 
+ 
  END m2type.
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-gcc/m2type.h gcc-16-20250921/gcc/m2/gm2-gcc/m2type.h
*** gcc-16-20250914/gcc/m2/gm2-gcc/m2type.h	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-gcc/m2type.h	Sun Sep 21 22:32:38 2025
*************** EXTERN tree m2type_BuildConstPointerType
*** 190,196 ****
  EXTERN tree m2type_BuildSetType (location_t location, char *name, tree type,
                                   tree lowval, tree highval, bool ispacked);
  EXTERN void *m2type_BuildStartSetConstructor (tree type);
! EXTERN void m2type_BuildSetConstructorElement (void *p, tree value);
  EXTERN tree m2type_BuildEndSetConstructor (void *p);
  EXTERN void *m2type_BuildStartRecordConstructor (tree type);
  EXTERN tree m2type_BuildEndRecordConstructor (void *p);
--- 190,196 ----
  EXTERN tree m2type_BuildSetType (location_t location, char *name, tree type,
                                   tree lowval, tree highval, bool ispacked);
  EXTERN void *m2type_BuildStartSetConstructor (tree type);
! EXTERN void m2type_BuildSetConstructorElement (location_t location, void *p, tree value);
  EXTERN tree m2type_BuildEndSetConstructor (void *p);
  EXTERN void *m2type_BuildStartRecordConstructor (tree type);
  EXTERN tree m2type_BuildEndRecordConstructor (void *p);
*************** EXTERN bool m2type_IsAddress (tree type)
*** 214,219 ****
--- 214,220 ----
  EXTERN tree m2type_GetCardinalAddressType (void);
  EXTERN bool m2type_SameRealType (tree a, tree b);
  EXTERN bool m2type_IsGccStrictTypeEquivalent (tree left, tree right);
+ EXTERN tree m2type_GetBooleanEnumList (location_t location);
  
  #undef EXTERN
  #endif /* m2type_h  */
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-lang.cc gcc-16-20250921/gcc/m2/gm2-lang.cc
*** gcc-16-20250914/gcc/m2/gm2-lang.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-lang.cc	Sun Sep 21 22:32:38 2025
*************** gm2_langhook_handle_option (
*** 692,697 ****
--- 692,703 ----
      case OPT_fgen_module_list_:
        M2Options_SetGenModuleList (value, arg);
        return 1;
+     case OPT_fmem_report:
+       M2Options_SetMemReport (value);
+       return 1;
+     case OPT_ftime_report:
+       M2Options_SetTimeReport (value);
+       return 1;
      case OPT_fnil:
        M2Options_SetNilCheck (value);
        return 1;
*************** gm2_langhook_handle_option (
*** 915,920 ****
--- 921,931 ----
      case OPT_fm2_whole_program:
        M2Options_SetWholeProgram (value);
        return 1;
+       break;
+     case OPT_fwideset:
+       M2Options_SetWideset (value);
+       return 1;
+       break;
  #ifdef OPT_mabi_ibmlongdouble
      case OPT_mabi_ibmlongdouble:
        M2Options_SetIBMLongDouble (value);
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-libs/M2Diagnostic.def gcc-16-20250921/gcc/m2/gm2-libs/M2Diagnostic.def
*** gcc-16-20250914/gcc/m2/gm2-libs/M2Diagnostic.def	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/m2/gm2-libs/M2Diagnostic.def	Sun Sep 21 22:32:38 2025
***************
*** 0 ****
--- 1,182 ----
+ (* M2Diagnotic provides memory and time diagnosics to the user.
+ 
+ Copyright (C) 2024 Free Software Foundation, Inc.
+ Contributed by Gaius Mulley <gaiusmod2@gmail.com>.
+ 
+ This file is part of GNU Modula-2.
+ 
+ GNU Modula-2 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.
+ 
+ GNU Modula-2 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 GNU Modula-2; see the file COPYING3.  If not see
+ <http://www.gnu.org/licenses/>.  *)
+ 
+ DEFINITION MODULE M2Diagnostic ;  (*!m2iso+gm2*)
+ 
+ (*
+     Title      : M2Diagnotic
+     Author     : Gaius Mulley
+     System     : GNU Modula-2
+     Date       : Thu Jan  4 10:38:53 2024
+     Revision   : $Version$
+     Description: provides memory and time diagnosics to the user.
+ *)
+ 
+ FROM DynamicStrings IMPORT String ;
+ 
+ TYPE
+    Diagnostic ;
+    DiagProc = PROCEDURE (Diagnostic) ;
+ 
+ 
+ (*
+    InitTimeDiagnostic - create and return a time diagnostic.
+                         The format string can be free form and may
+                         contain {1T}, {1C} or {1P}.
+                         {1T} will contain the time and
+                         {1C} the count of the number of times the
+                         code enters the time diagnostic code region.
+                         {1P} generates the time as a percentage.
+                         {0T} is the total time for the application.
+                         {{ is rendered as a single {.
+ *)
+ 
+ PROCEDURE InitTimeDiagnostic (name, format: ARRAY OF CHAR) : Diagnostic ;
+ 
+ 
+ (*
+    EnterDiagnostic - attribute all execution time from now to TimeDiag.
+ *)
+ 
+ PROCEDURE EnterDiagnostic (TimeDiag: Diagnostic) ;
+ 
+ 
+ (*
+    ExitDiagnostic - stop attributing execution time to TimeDiag.
+ *)
+ 
+ PROCEDURE ExitDiagnostic (TimeDiag: Diagnostic) ;
+ 
+ 
+ (*
+    InitMemDiagnostic - create and return a memory diagnostic.
+                        The format string can be free form and may
+                        contain {1M} {1d} {1x} {1P}.
+                        {1M} is replaced by the value of the first parameter
+                        with memory size units.
+                        {1d} unsigned decimal.  {1x} unsigned hexadecimal.
+                        {0M} is the global allocation (Storage.mod:ALLOCATE).
+                        {1P} is the percentage of param 1 relative
+                        to global memory.
+ *)
+ 
+ PROCEDURE InitMemDiagnostic (name, format: ARRAY OF CHAR) : Diagnostic ;
+ 
+ 
+ (*
+    MemIncr - allow the appropriate parameter to be incremented.
+              All parameters are initially set to zero and are stored
+              as LONGCARD.
+ *)
+ 
+ PROCEDURE MemIncr (MemDiag: Diagnostic; paramno: CARDINAL; incr: CARDINAL) ;
+ 
+ 
+ (*
+    MemDecr - allow the appropriate parameter to be decremented.
+              All parameters are initially set to zero and are stored
+              as LONGCARD.
+ *)
+ 
+ PROCEDURE MemDecr (MemDiag: Diagnostic; paramno: CARDINAL; decr: CARDINAL) ;
+ 
+ 
+ (*
+    MemSet - allow the appropriate parameter to be set to value.
+             All parameters are initially set to zero.
+ *)
+ 
+ PROCEDURE MemSet (MemDiag: Diagnostic; paramno: CARDINAL; value: CARDINAL) ;
+ 
+ 
+ (*
+    TotalHeapIncr - increments the total heap used.
+ *)
+ 
+ PROCEDURE TotalHeapIncr (incr: CARDINAL) ;
+ 
+ 
+ (*
+    TotalHeapDecr - decrements the total heap used.
+ *)
+ 
+ PROCEDURE TotalHeapDecr (incr: CARDINAL) ;
+ 
+ 
+ (*
+    SetEnable - set the enable flag in Diag to value.
+ *)
+ 
+ PROCEDURE SetEnable (Diag: Diagnostic; value: BOOLEAN) ;
+ 
+ 
+ (*
+    Lookup - returns the Diagnostic containing name or NIL
+             if it does not exist.
+ *)
+ 
+ PROCEDURE Lookup (name: ARRAY OF CHAR) : Diagnostic ;
+ 
+ 
+ (*
+    GetName - returns the name of Diag.
+ *)
+ 
+ PROCEDURE GetName (Diag: Diagnostic) : String ;
+ 
+ 
+ (*
+    ForeachDiagDo - for diag in global diag list do
+                       dp (diag);
+                    end
+ *)
+ 
+ PROCEDURE ForeachDiagDo (dp: DiagProc) ;
+ 
+ 
+ (*
+    SetDefaultConfig - force the Diag enable flag to the
+                       time or mem global default.
+ *)
+ 
+ PROCEDURE SetDefaultConfig (Diag: Diagnostic) ;
+ 
+ 
+ (*
+    Configure - will turn on or off all the memory or time
+                instrumentation diagnostics and set the defaults
+                time and mem values.
+ *)
+ 
+ PROCEDURE Configure (time, mem: BOOLEAN) ;
+ 
+ 
+ (*
+    Generate - return a string containing the output from
+               all the diagnostics enabled.  If hierarchical is TRUE
+               then the output is displayed in a hierarchical format
+               using the name and ':' separators to signify grouping.
+ *)
+ 
+ PROCEDURE Generate (hierarchical: BOOLEAN) : String ;
+ 
+ 
+ END M2Diagnostic.
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-libs/M2Diagnostic.mod gcc-16-20250921/gcc/m2/gm2-libs/M2Diagnostic.mod
*** gcc-16-20250914/gcc/m2/gm2-libs/M2Diagnostic.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/m2/gm2-libs/M2Diagnostic.mod	Sun Sep 21 22:32:38 2025
***************
*** 0 ****
--- 1,1049 ----
+ (* M2Diagnotic provides memory and time diagnosics to the user.
+ 
+ Copyright (C) 2024 Free Software Foundation, Inc.
+ Contributed by Gaius Mulley <gaiusmod2@gmail.com>.
+ 
+ This file is part of GNU Modula-2.
+ 
+ GNU Modula-2 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.
+ 
+ GNU Modula-2 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 GNU Modula-2; see the file COPYING3.  If not see
+ <http://www.gnu.org/licenses/>.  *)
+ 
+ IMPLEMENTATION MODULE M2Diagnostic ;  (*!m2iso+gm2*)
+ 
+ FROM ASCII IMPORT nl ;
+ FROM Selective IMPORT Timeval, GetTimeOfDay, InitTime, GetTime, SetTime ;
+ FROM StringConvert IMPORT LongCardinalToString, ctos ;
+ FROM Storage IMPORT ALLOCATE ;
+ FROM Indexing IMPORT Index ;
+ 
+ FROM DynamicStrings IMPORT InitString, ConCat, KillString, ConCatChar,
+                            Equal, Mark, Length, char, RIndex ;
+ 
+ IMPORT DynamicStrings, Indexing ;
+ 
+ 
+ CONST
+    EnableDiagnostics = TRUE ;    (* If set to FALSE then it will ensure
+                                     this module has minimal impact upon
+                                     the rest of the application.   *)
+    DefaultTimeEnableValue = FALSE ;  (* Should the diagnostics be
+                                         enabled by default.  *)
+    DefaultMemEnableValue = FALSE ;  (* Should the diagnostics be
+                                        enabled by default.  *)
+ 
+    MaxParam = 4 ;   (* The maximum number of parameters for a mem
+                        diag.  *)
+    MICROSEC = 1000 * 1000 ;   (* The number of microseconds in a second.  *)
+ 
+ TYPE
+    Diagnostic = POINTER TO RECORD
+                               name, format: String ;
+                               enable      : BOOLEAN ;
+                               next        : Diagnostic ;
+                               CASE type: DiagType OF
+ 
+                               timediag: tdiag: timeDiag |
+                               memdiag : mdiag: memDiag
+ 
+                               END
+                             END ;
+ 
+    DiagType = (timediag, memdiag) ;
+ 
+    timeDiag = RECORD
+                  count: CARDINAL ;
+                  total,
+                  enter,
+                  exit : Timeval ;
+               END ;
+ 
+    memDiag = RECORD
+                 param: ARRAY [1..MaxParam] OF LONGCARD ;
+              END ;
+ 
+ VAR
+    Output            : String ;
+    TotalHeap         : LONGCARD ;
+    Head              : Diagnostic ;
+    EnableHierarchical,
+    DefaultTimeEnable,
+    DefaultMemEnable  : BOOLEAN ;
+    StartTime,
+    TotalTime         : Timeval ;
+ 
+ 
+ (*
+    Assert - halt if b is false.
+ *)
+ 
+ PROCEDURE Assert (b: BOOLEAN) ;
+ BEGIN
+    IF NOT b
+    THEN
+       HALT
+    END
+ END Assert ;
+ 
+ 
+ (*
+    Error - generate a error simple message with indicating the
+            format specifier ch is incorrect.
+ *)
+ 
+ PROCEDURE Error (msg: ARRAY OF CHAR; ch: CHAR) ;
+ BEGIN
+    HALT
+ END Error ;
+ 
+ 
+ (*
+    InitTimeDiagnostic - create and return a time diagnostic.
+                         The format string can be free form and may
+                         contain {1T}, {1C} or {1P}.
+                         {1T} will contain the time and
+                         {1C} the count of the number of times the
+                         code enters the time diagnostic code region.
+                         {1P} generates the time as a percentage.
+                         {0T} is the total time for the application.
+                         {{ is rendered as a single {.
+ *)
+ 
+ PROCEDURE InitTimeDiagnostic (name, format: ARRAY OF CHAR) : Diagnostic ;
+ VAR
+    d: Diagnostic ;
+ BEGIN
+    IF EnableDiagnostics
+    THEN
+       NEW (d) ;
+       d^.name := InitString (name) ;
+       d^.format := InitString (format) ;
+       WITH d^ DO
+          enable := DefaultTimeEnable ;
+          next := Head ;
+          type := timediag ;
+          CASE type OF
+ 
+          timediag: tdiag.count := 0 ;
+                    tdiag.total := InitTime (0, 0) ;
+                    tdiag.enter := InitTime (0, 0) ;
+                    tdiag.exit  := InitTime (0, 0)
+ 
+          ELSE
+             HALT
+          END
+       END ;
+       Head := d ;
+       RETURN d
+    ELSE
+       RETURN NIL
+    END
+ END InitTimeDiagnostic ;
+ 
+ 
+ (*
+    EnterDiagnostic - attribute all execution time from now to TimeDiag.
+ *)
+ 
+ PROCEDURE EnterDiagnostic (TimeDiag: Diagnostic) ;
+ BEGIN
+    IF EnableDiagnostics AND (TimeDiag # NIL)
+    THEN
+       Assert (TimeDiag^.type = timediag) ;
+       Assert (GetTimeOfDay (TimeDiag^.tdiag.enter) = 0) ;
+       INC (TimeDiag^.tdiag.count)
+    END
+ END EnterDiagnostic ;
+ 
+ 
+ (*
+    ExitDiagnostic - stop attributing execution time to TimeDiag.
+ *)
+ 
+ PROCEDURE ExitDiagnostic (TimeDiag: Diagnostic) ;
+ BEGIN
+    IF EnableDiagnostics AND (TimeDiag # NIL)
+    THEN
+       Assert (TimeDiag^.tdiag.enter # NIL) ;
+       Assert (TimeDiag^.tdiag.exit # NIL) ;
+       Assert (TimeDiag^.tdiag.total # NIL) ;
+       Assert (TimeDiag^.type = timediag) ;
+       Assert (GetTimeOfDay (TimeDiag^.tdiag.exit) = 0) ;
+       Accumulate (TimeDiag^.tdiag.total, TimeDiag^.tdiag.enter, TimeDiag^.tdiag.exit)
+    END
+ END ExitDiagnostic ;
+ 
+ 
+ (*
+    Accumulate - total := total + exit - enter
+ *)
+ 
+ PROCEDURE Accumulate (total, enter, exit: Timeval) ;
+ BEGIN
+    IncTime (total, exit) ;
+    DecTime (total, enter)
+ END Accumulate ;
+ 
+ 
+ (*
+    IncTime - left := left + right.
+ *)
+ 
+ PROCEDURE IncTime (left, right: Timeval) ;
+ VAR
+    lsec, lusec,
+    rsec, rusec: CARDINAL ;
+ BEGIN
+    GetTime (left, lsec, lusec) ;
+    GetTime (right, rsec, rusec) ;
+    IF lusec + rusec < MICROSEC
+    THEN
+       (* No carry  *)
+       INC (lusec, rusec) ;
+       INC (lsec, rsec)
+    ELSE
+       INC (lusec, rusec) ;
+       DEC (lusec, MICROSEC) ;
+       INC (lsec, rsec + 1)
+    END ;
+    SetTime (left, lsec, lusec)
+ END IncTime ;
+ 
+ 
+ (*
+    DecTime - left := left - right.
+ *)
+ 
+ PROCEDURE DecTime (left, right: Timeval) ;
+ VAR
+    lsec, lusec,
+    rsec, rusec: CARDINAL ;
+ BEGIN
+    GetTime (left, lsec, lusec) ;
+    GetTime (right, rsec, rusec) ;
+    IF lusec >= rusec
+    THEN
+       (* No borrow.  *)
+       DEC (lusec, rusec) ;
+       IF lsec >= rsec
+       THEN
+          DEC (lsec, rsec)
+       ELSE
+          lsec := 0
+       END
+    ELSE
+       IF lsec > 0
+       THEN
+          INC (lusec, MICROSEC) ;
+          DEC (lusec, rusec) ;
+          DEC (lsec) ;
+          IF lsec >= rsec
+          THEN
+             DEC (lsec, rsec)
+          ELSE
+             lsec := 0
+          END
+       ELSE
+          lsec := 0 ;
+          lusec := 0
+       END
+    END ;
+    SetTime (left, lsec, lusec)
+ END DecTime ;
+ 
+ 
+ (*
+    InitMemDiagnostic - create and return a memory diagnostic.
+                        The format string can be free form and may
+                        contain {1M} {1d} {1x} {1P}.
+                        {1M} is replaced by the value of the first parameter
+                        with memory size units.
+                        {1d} unsigned decimal.  {1x} unsigned hexadecimal.
+                        {0M} is the global allocation (Storage.mod:ALLOCATE).
+                        {1P} is the percentage of param 1 relative
+                        to global memory.
+ *)
+ 
+ PROCEDURE InitMemDiagnostic (name, format: ARRAY OF CHAR) : Diagnostic ;
+ VAR
+    i: CARDINAL ;
+    d: Diagnostic ;
+ BEGIN
+    IF EnableDiagnostics
+    THEN
+       NEW (d) ;
+       d^.name := InitString (name) ;
+       d^.format := InitString (format) ;
+       WITH d^ DO
+          enable := DefaultMemEnable ;
+          next := Head ;
+          type := memdiag ;
+          CASE type OF
+ 
+          memdiag: FOR i := 1 TO MaxParam DO
+                      mdiag.param[i] := 0
+                   END
+ 
+          ELSE
+             HALT
+          END
+       END ;
+       Head := d ;
+       RETURN d
+    ELSE
+       RETURN NIL
+    END
+ END InitMemDiagnostic ;
+ 
+ 
+ (*
+    CheckParam -
+ *)
+ 
+ PROCEDURE CheckParam (paramno: CARDINAL) ;
+ BEGIN
+    IF (paramno < 1) OR (paramno > MaxParam)
+    THEN
+       HALT
+    END
+ END CheckParam ;
+ 
+ 
+ (*
+    MemIncr - allow the appropriate parameter to be incremented.
+              All parameters are initially set to zero and are stored
+              as LONGCARD.
+ *)
+ 
+ PROCEDURE MemIncr (MemDiag: Diagnostic; paramno: CARDINAL; incr: CARDINAL) ;
+ BEGIN
+    IF EnableDiagnostics AND (MemDiag # NIL)
+    THEN
+       CheckParam (paramno) ;
+       CASE MemDiag^.type OF
+ 
+       memdiag:  INC (MemDiag^.mdiag.param[paramno], VAL (LONGCARD, incr))
+ 
+       ELSE
+          HALT
+       END
+    END
+ END MemIncr ;
+ 
+ 
+ (*
+    MemDecr - allow the appropriate parameter to be decremented.
+              All parameters are initially set to zero and are stored
+              as LONGCARD.
+ *)
+ 
+ PROCEDURE MemDecr (MemDiag: Diagnostic; paramno: CARDINAL; decr: CARDINAL) ;
+ BEGIN
+    IF EnableDiagnostics AND (MemDiag # NIL)
+    THEN
+       CheckParam (paramno) ;
+       CASE MemDiag^.type OF
+ 
+       memdiag:  DEC (MemDiag^.mdiag.param[paramno], VAL (LONGCARD, decr))
+ 
+       ELSE
+          HALT
+       END
+    END
+ END MemDecr ;
+ 
+ 
+ (*
+    MemSet - allow the appropriate parameter to be set to value.
+             All parameters are initially set to zero.
+ *)
+ 
+ PROCEDURE MemSet (MemDiag: Diagnostic; paramno: CARDINAL; value: CARDINAL) ;
+ BEGIN
+    IF EnableDiagnostics AND (MemDiag # NIL)
+    THEN
+       CheckParam (paramno) ;
+       CASE MemDiag^.type OF
+ 
+       memdiag:  MemDiag^.mdiag.param[paramno] := VAL (LONGCARD, value)
+ 
+       ELSE
+          HALT
+       END
+    END
+ END MemSet ;
+ 
+ 
+ (*
+    TotalHeapIncr - increments the total heap used.
+ *)
+ 
+ PROCEDURE TotalHeapIncr (incr: CARDINAL) ;
+ BEGIN
+    IF EnableDiagnostics
+    THEN
+       TotalHeap := TotalHeap + VAL (LONGCARD, incr)
+    END
+ END TotalHeapIncr ;
+ 
+ 
+ (*
+    TotalHeapDecr - decrements the total heap used.
+ *)
+ 
+ PROCEDURE TotalHeapDecr (incr: CARDINAL) ;
+ BEGIN
+    IF EnableDiagnostics
+    THEN
+       TotalHeap := TotalHeap - VAL (LONGCARD, incr)
+    END
+ END TotalHeapDecr ;
+ 
+ 
+ (*
+    SetEnable - set the enable flag in Diag to value.
+ *)
+ 
+ PROCEDURE SetEnable (Diag: Diagnostic; value: BOOLEAN) ;
+ BEGIN
+    IF EnableDiagnostics AND (Diag # NIL)
+    THEN
+       Diag^.enable := value
+    END
+ END SetEnable ;
+ 
+ 
+ (*
+    Lookup - returns the Diagnostic containing name or NIL
+             if it does not exist.
+ *)
+ 
+ PROCEDURE Lookup (name: ARRAY OF CHAR) : Diagnostic ;
+ VAR
+    ptr: Diagnostic ;
+    s  : String ;
+ BEGIN
+    IF EnableDiagnostics
+    THEN
+       s := InitString (name) ;
+       ptr := Head ;
+       WHILE ptr # NIL DO
+          IF Equal (ptr^.name, s)
+          THEN
+             s := KillString (s) ;
+             RETURN ptr
+          END ;
+          ptr := ptr^.next
+       END ;
+       s := KillString (s) ;
+       RETURN NIL
+    ELSE
+       RETURN NIL
+    END
+ END Lookup ;
+ 
+ 
+ (*
+    ForeachDiagDo - for diag in global diag list do
+                       dp (diag);
+                    end
+ *)
+ 
+ PROCEDURE ForeachDiagDo (dp: DiagProc) ;
+ VAR
+    ptr: Diagnostic ;
+ BEGIN
+    ptr := Head ;
+    WHILE ptr # NIL DO
+       dp (ptr) ;
+       ptr := ptr^.next
+    END
+ END ForeachDiagDo ;
+ 
+ 
+ (*
+    SetDefaultConfig - force the Diag enable flag to the
+                       time or mem global default.
+ *)
+ 
+ PROCEDURE SetDefaultConfig (Diag: Diagnostic) ;
+ BEGIN
+    IF Diag^.type = timediag
+    THEN
+       Diag^.enable := DefaultTimeEnable
+    ELSE
+       Diag^.enable := DefaultMemEnable
+    END
+ END SetDefaultConfig ;
+ 
+ 
+ (*
+    Configure - will turn on or off all the memory or time
+                instrumentation diagnostics and set the defaults
+                time and mem values.
+ *)
+ 
+ PROCEDURE Configure (time, mem: BOOLEAN) ;
+ BEGIN
+    IF EnableDiagnostics
+    THEN
+       DefaultTimeEnable := time ;
+       DefaultMemEnable := mem ;
+       ForeachDiagDo (SetDefaultConfig)
+    END
+ END Configure ;
+ 
+ 
+ (*
+    CreateStartTime -
+ *)
+ 
+ PROCEDURE CreateStartTime ;
+ BEGIN
+    IF EnableDiagnostics
+    THEN
+       IF StartTime = NIL
+       THEN
+          StartTime := InitTime (0, 0) ;
+          IF GetTimeOfDay (StartTime) = 0
+          THEN
+          END
+       END ;
+       IF TotalTime = NIL
+       THEN
+          TotalTime := InitTime (0, 0)
+       END
+    ELSE
+       StartTime := NIL ;
+       TotalTime := NIL
+    END
+ END CreateStartTime ;
+ 
+ 
+ (*
+    UpdateTotalTime -
+ *)
+ 
+ PROCEDURE UpdateTotalTime ;
+ BEGIN
+    IF GetTimeOfDay (TotalTime) = 0
+    THEN
+    END ;
+    DecTime (TotalTime, StartTime)
+ END UpdateTotalTime ;
+ 
+ 
+ (*
+    GetTimeParam - a paramno of 0 will return the total time so far
+                   whereas a paramno > 0 will return the time associated
+                   with Diag.
+ *)
+ 
+ PROCEDURE GetTimeParam (Diag: Diagnostic; paramno: CARDINAL) : Timeval ;
+ VAR
+    sec, usec: CARDINAL ;
+ BEGIN
+    IF paramno = 0
+    THEN
+       UpdateTotalTime ;
+       RETURN TotalTime
+    ELSE
+       RETURN Diag^.tdiag.total
+    END
+ END GetTimeParam ;
+ 
+ 
+ (*
+    GetMemParam - return the mem paramno from within Diag.  A paramno of 0
+                  will return the total heap.
+ *)
+ 
+ PROCEDURE GetMemParam (Diag: Diagnostic; paramno: CARDINAL) : LONGCARD ;
+ BEGIN
+    IF paramno = 0
+    THEN
+       RETURN TotalHeap
+    ELSE
+       RETURN Diag^.mdiag.param[paramno]
+    END
+ END GetMemParam ;
+ 
+ 
+ (*
+    CreateDecimalMem - converts c to a decimal string.
+ *)
+ 
+ PROCEDURE CreateDecimalMem (c: LONGCARD) : String ;
+ BEGIN
+    RETURN LongCardinalToString (c, 0, ' ', 10, TRUE)
+ END CreateDecimalMem ;
+ 
+ 
+ (*
+    CreateHexadecimalMem - converts c to a hexadecimal string.
+ *)
+ 
+ PROCEDURE CreateHexadecimalMem (c: LONGCARD) : String ;
+ BEGIN
+    RETURN ConCat (InitString ('0x'),
+                   Mark (LongCardinalToString (c, 0, ' ', 16, TRUE)))
+ END CreateHexadecimalMem ;
+ 
+ 
+ (*
+    CreateDecimalTime - return timeval as a decimal seconds.usecs string.
+ *)
+ 
+ PROCEDURE CreateDecimalTime (timeval: Timeval) : String ;
+ VAR
+    sec, usec: CARDINAL ;
+ BEGIN
+    GetTime (timeval, sec, usec) ;
+    RETURN ConCat (ConCat (LongCardinalToString (sec, 0, ' ', 10, TRUE),
+                           Mark (InitString ('.'))),
+                   LongCardinalToString (usec, 6, '0', 10, TRUE))
+ END CreateDecimalTime ;
+ 
+ 
+ (*
+    CreateHexadecimalTime - return timeval as a hexadecimal seconds.usecs string.
+ *)
+ 
+ PROCEDURE CreateHexadecimalTime (timeval: Timeval) : String ;
+ VAR
+    sec, usec: CARDINAL ;
+ BEGIN
+    GetTime (timeval, sec, usec) ;
+    RETURN ConCat (ConCat (LongCardinalToString (sec, 0, ' ', 16, TRUE),
+                           Mark (InitString ('.'))),
+                   LongCardinalToString (usec, 5, '0', 16, TRUE))
+ END CreateHexadecimalTime ;
+ 
+ 
+ (*
+    Decimal - convert paramno in Diag to a string.
+ *)
+ 
+ PROCEDURE Decimal (Diag: Diagnostic; paramno: CARDINAL) : String ;
+ BEGIN
+    CASE Diag^.type OF
+ 
+    memdiag :  RETURN CreateDecimalMem (GetMemParam (Diag, paramno)) |
+    timediag:  RETURN CreateDecimalTime (GetTimeParam (Diag, paramno))
+ 
+    END ;
+    RETURN NIL
+ END Decimal ;
+ 
+ 
+ (*
+    Hexadecimal - convert paramno in Diag to a hex string.
+ *)
+ 
+ PROCEDURE Hexadecimal (Diag: Diagnostic; paramno: CARDINAL) : String ;
+ BEGIN
+    CASE Diag^.type OF
+ 
+    memdiag :  RETURN CreateHexadecimalMem (GetMemParam (Diag, paramno)) |
+    timediag:  RETURN CreateHexadecimalTime (GetTimeParam (Diag, paramno))
+ 
+    END ;
+    RETURN NIL
+ END Hexadecimal ;
+ 
+ 
+ (*
+    Count - return the count field for a time diag or return the decimal
+            value for a paramno in a mem diag.
+ *)
+ 
+ PROCEDURE Count (Diag: Diagnostic; paramno: CARDINAL) : String ;
+ BEGIN
+    CASE Diag^.type OF
+ 
+    memdiag :  RETURN CreateDecimalMem (GetMemParam (Diag, paramno)) |
+    timediag:  RETURN ctos (Diag^.tdiag.count, 0, ' ')
+ 
+    END ;
+    RETURN NIL
+ END Count ;
+ 
+ 
+ (*
+    Microsec - convert timeval into microseconds and return the value as
+               a longcard.
+ *)
+ 
+ PROCEDURE Microsec (timeval: Timeval) : LONGCARD ;
+ VAR
+    sec, usec: CARDINAL ;
+    microsec : LONGCARD ;
+ BEGIN
+    GetTime (timeval, sec, usec) ;
+    microsec := VAL (LONGCARD, sec) * MICROSEC + VAL (LONGCARD, usec) ;
+    RETURN microsec
+ END Microsec ;
+ 
+ 
+ (*
+    CreateTimePercent - return timeval as a percentage of the TotalTime.
+ *)
+ 
+ PROCEDURE CreateTimePercent (timeval: Timeval) : String ;
+ VAR
+    total, param: LONGCARD ;
+ BEGIN
+    IF timeval = TotalTime
+    THEN
+       param := 100
+    ELSE
+       UpdateTotalTime ;
+       param := Microsec (timeval) * 100 ;
+       total := Microsec (TotalTime) ;
+       IF total = 0
+       THEN
+          param := 0
+       ELSE
+          param := param DIV total
+       END
+    END ;
+    RETURN ConCatChar (ctos (VAL (CARDINAL, param), 3, ' '), '%')
+ END CreateTimePercent ;
+ 
+ 
+ (*
+    CreateMemPercent - return memval as a percentage of TotalHeap.
+ *)
+ 
+ PROCEDURE CreateMemPercent (memval: LONGCARD) : String ;
+ VAR
+    param: LONGCARD ;
+ BEGIN
+    IF memval = TotalHeap
+    THEN
+       param := 100
+    ELSE
+       param := memval * 100 ;
+       IF TotalHeap = 0
+       THEN
+          param := 0
+       ELSE
+          param := param DIV TotalHeap
+       END
+    END ;
+    RETURN ConCatChar (ctos (VAL (CARDINAL, param), 3, ' '), '%')
+ END CreateMemPercent ;
+ 
+ 
+ (*
+    DescribePercent - call the appropriate mem or time percentage procedure.
+ *)
+ 
+ PROCEDURE DescribePercent (Diag: Diagnostic; paramno: CARDINAL) : String ;
+ BEGIN
+    CASE Diag^.type OF
+ 
+    memdiag :  RETURN CreateMemPercent (GetMemParam (Diag, paramno)) |
+    timediag:  RETURN CreateTimePercent (GetTimeParam (Diag, paramno))
+ 
+    END ;
+    RETURN NIL
+ END DescribePercent ;
+ 
+ 
+ (*
+    DescribeMemory - return the memory diagnostic
+ *)
+ 
+ PROCEDURE DescribeMemory (Diag: Diagnostic; paramno: CARDINAL) : String ;
+ CONST
+    kilo = 1024 ;
+    mega = kilo * kilo ;
+    giga = mega * kilo ;
+ VAR
+    param: LONGCARD ;
+    s    : String ;
+ BEGIN
+    param := GetMemParam (Diag, paramno) ;
+    IF param < kilo
+    THEN
+       s := ConCat (LongCardinalToString (param, 0, ' ', 10, FALSE),
+                    Mark (InitString (' Bytes')))
+    ELSIF param < mega
+    THEN
+       param := param DIV kilo ;
+       s := ConCat (LongCardinalToString (param, 0, ' ', 10, FALSE),
+                    Mark (InitString ('KB')))
+    ELSIF param < giga
+    THEN
+       param := param DIV mega ;
+       s := ConCat (LongCardinalToString (param, 0, ' ', 10, FALSE),
+                    Mark (InitString ('MB')))
+    ELSE
+       param := param DIV giga ;
+       s := ConCat (LongCardinalToString (param, 0, ' ', 10, FALSE),
+                    Mark (InitString ('GB')))
+    END ;
+    RETURN s
+ END DescribeMemory ;
+ 
+ 
+ (*
+    DescribeTime - returns the time diagnostic in seconds.
+ *)
+ 
+ PROCEDURE DescribeTime (Diag: Diagnostic; paramno: CARDINAL) : String ;
+ VAR
+    sec, usec: CARDINAL ;
+ BEGIN
+    CASE Diag^.type OF
+ 
+    memdiag :  HALT |
+    timediag:  GetTime (GetTimeParam (Diag, paramno), sec, usec) ;
+               RETURN ConCat (ConCat (LongCardinalToString (sec, 0, ' ', 10, TRUE),
+                                      Mark (InitString ('.'))),
+                              ConCat (LongCardinalToString (usec, 6, '0', 10, TRUE),
+                                      Mark (InitString (' sec'))))
+ 
+    END ;
+    RETURN NIL
+ END DescribeTime ;
+ 
+ 
+ (*
+    ParamSpec - ebnf:
+ 
+                ( '{' | '0' | '1' | '2' | '3' | '4' )
+                ( 'd' | 'x' | 'C' | 'H' | 'T' | 'M' | 'N' | 'P' )
+                '}'
+ *)
+ 
+ PROCEDURE ParamSpec (Diag: Diagnostic; i: CARDINAL) : CARDINAL ;
+ VAR
+    paramno,
+    length : CARDINAL ;
+    ch     : CHAR ;
+ BEGIN
+    length := Length (Diag^.format) ;
+    paramno := 0 ;
+    IF i < length
+    THEN
+       ch := char (Diag^.format, i) ;
+       CASE ch OF
+ 
+       '{':  Output := ConCatChar (Output, '{') ;
+             RETURN i + 1 |
+       '0':  paramno := 0 |
+       '1':  paramno := 1 |
+       '2':  paramno := 2 |
+       '3':  paramno := 3 |
+       '4':  paramno := 4
+ 
+       ELSE
+          Error ('unexpected character: ', ch)
+       END ;
+       INC (i) ;
+       IF i < length
+       THEN
+          ch := char (Diag^.format, i) ;
+          CASE ch OF
+ 
+          'd':  Output := ConCat (Output, Decimal (Diag, paramno)) |
+          'x':  Output := ConCat (Output, Hexadecimal (Diag, paramno)) |
+          'C':  Output := ConCat (Output, Count (Diag, paramno)) |
+          'H':  Output := ConCat (Output, HierarchicalName (Diag, i)) |
+          'M':  Output := ConCat (Output, DescribeMemory (Diag, paramno)) |
+          'N':  Output := ConCat (Output, Diag^.name) |
+          'P':  Output := ConCat (Output, DescribePercent (Diag, paramno)) |
+          'T':  Output := ConCat (Output, DescribeTime (Diag, paramno))
+ 
+          ELSE
+             Error ('unexpected character: ', ch)
+          END ;
+          INC (i) ;
+          IF i < length
+          THEN
+             ch := char (Diag^.format, i) ;
+             IF ch # '}'
+             THEN
+                Error ('expected } character, seen ', ch)
+             END
+          END
+       END
+    END ;
+    RETURN i + 1
+ END ParamSpec ;
+ 
+ 
+ (*
+    HierarchicalName - if the hierarchical formatting of output
+                       has been enabled use the last component
+                       of the name separated by ':' else
+                       output full name.
+ *)
+ 
+ PROCEDURE HierarchicalName (Diag: Diagnostic; pos: CARDINAL) : String ;
+ VAR
+    i, j: INTEGER ;
+ BEGIN
+    IF EnableHierarchical
+    THEN
+       i := DynamicStrings.Index (Diag^.name, '}', pos) ;
+       IF i > 0
+       THEN
+          j := i - 1 ;
+          i := RIndex (Diag^.name, ':', j) ;
+          IF (i >= 0) AND (i < j)
+          THEN
+             RETURN DynamicStrings.Slice (Diag^.name, i, j)
+          END
+       END
+    END ;
+    RETURN Diag^.name
+ END HierarchicalName ;
+ 
+ 
+ (*
+    FormatDiag - ebnf:
+ 
+                 { ( '{' ParamSpec ) | any }
+ *)
+ 
+ PROCEDURE FormatDiag (Diag: Diagnostic) ;
+ VAR
+    i, length: CARDINAL ;
+    ch       : CHAR ;
+ BEGIN
+    i := 0 ;
+    length := Length (Diag^.format) ;
+    WHILE i < length DO
+       ch := char (Diag^.format, i) ;
+       IF ch = '{'
+       THEN
+          INC (i) ;
+          i := ParamSpec (Diag, i)
+       ELSE
+          Output := ConCatChar (Output, ch) ;
+          INC (i)
+       END
+    END ;
+    Output := ConCatChar (Output, nl)
+ END FormatDiag ;
+ 
+ 
+ (*
+    GetName - returns the name of Diag.
+ *)
+ 
+ PROCEDURE GetName (Diag: Diagnostic) : String ;
+ BEGIN
+    IF EnableDiagnostics AND (Diag # NIL)
+    THEN
+       RETURN Diag^.name
+    ELSE
+       RETURN NIL
+    END
+ END GetName ;
+ 
+ 
+ (*
+    Match -
+ *)
+ 
+ PROCEDURE Match (stem, name: String) : BOOLEAN ;
+ BEGIN
+    RETURN TRUE
+ END Match ;
+ 
+ 
+ (*
+    HierarchicalDiag - iterate over every diagnostic using a depth first search
+                       for each component of the diagnostic name.
+ *)
+ 
+ PROCEDURE HierarchicalDiag (stem: String; visited: Index) : String ;
+ VAR
+    diag: Diagnostic ;
+ BEGIN
+    diag := Head ;
+    WHILE diag # NIL DO
+       IF NOT Indexing.IsIndiceInIndex (visited, diag)
+       THEN
+          IF Match (stem, diag^.name)
+          THEN
+             Indexing.IncludeIndiceIntoIndex (visited, diag)
+          END
+       END ;
+       diag := diag^.next
+    END ;
+    RETURN Output
+ END HierarchicalDiag ;
+ 
+ 
+ (*
+    GenerateRaw - return the output string after calling FormatDiag on
+                  every diagnostic rule.
+ *)
+ 
+ PROCEDURE GenerateRaw () : String ;
+ BEGIN
+    ForeachDiagDo (FormatDiag) ;
+    RETURN Output
+ END GenerateRaw ;
+ 
+ 
+ (*
+    GenerateHierarchical -
+ *)
+ 
+ PROCEDURE GenerateHierarchical () : String ;
+ BEGIN
+    RETURN HierarchicalDiag (InitString (''), Indexing.InitIndex (1))
+ END GenerateHierarchical ;
+ 
+ 
+ (*
+    Generate - return a string containing the output from
+               all the diagnostics enabled.
+ *)
+ 
+ PROCEDURE Generate (hierarchical: BOOLEAN) : String ;
+ BEGIN
+    EnableHierarchical := hierarchical ;
+    IF EnableDiagnostics
+    THEN
+       Output := KillString (Output) ;
+       Output := InitString ('') ;
+       IF hierarchical
+       THEN
+          RETURN GenerateHierarchical ()
+       ELSE
+          RETURN GenerateRaw ()
+       END
+    ELSE
+       RETURN NIL
+    END
+ END Generate ;
+ 
+ 
+ BEGIN
+    TotalHeap := 0 ;
+    StartTime := NIL ;
+    TotalTime := NIL ;
+    CreateStartTime ;
+    Head := NIL ;
+    Output := NIL ;
+    EnableHierarchical := FALSE ;
+    DefaultTimeEnable := DefaultTimeEnableValue ;
+    DefaultMemEnable := DefaultMemEnableValue ;
+ END M2Diagnostic.
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-libs/M2WIDESET.def gcc-16-20250921/gcc/m2/gm2-libs/M2WIDESET.def
*** gcc-16-20250914/gcc/m2/gm2-libs/M2WIDESET.def	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/m2/gm2-libs/M2WIDESET.def	Sun Sep 21 22:32:38 2025
***************
*** 0 ****
--- 1,210 ----
+ (* M2WIDESET.def runtime support procedures for wide sets.
+ 
+ Copyright (C) 2025 Free Software Foundation, Inc.
+ Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
+ 
+ This file is part of GNU Modula-2.
+ 
+ GNU Modula-2 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.
+ 
+ GNU Modula-2 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/>.  *)
+ 
+ DEFINITION MODULE M2WIDESET ;
+ 
+ (*
+     Title      : M2WIDESET
+     Author     : Gaius Mulley
+     System     : GNU Modula-2
+     Date       : Thu Nov 16 19:57:31 2023
+     Description: provides runtime capability for wide sets.
+ *)
+ 
+ FROM SYSTEM IMPORT BYTE ;
+ 
+ 
+ (*
+    Or - dest = left | right
+         implement OR for a wide set type.
+ *)
+ 
+ PROCEDURE Or (VAR dest: ARRAY OF BYTE; left, right: ARRAY OF BYTE;
+               highbit: CARDINAL) ;
+ 
+ 
+ (*
+    And - dest = left & right
+          implement AND for a wide set type.
+ *)
+ 
+ PROCEDURE And (VAR dest: ARRAY OF BYTE; left, right: ARRAY OF BYTE;
+                highbit: CARDINAL) ;
+ 
+ 
+ (*
+    Not - dest = ~ operand
+          implement AND for a wide set type.
+ *)
+ 
+ PROCEDURE Not (VAR dest: ARRAY OF BYTE; expr: ARRAY OF BYTE;
+                highbit: CARDINAL) ;
+ 
+ 
+ (*
+    Incl - dest |= bit
+           implement INCL for a wide set type.
+ *)
+ 
+ PROCEDURE Incl (VAR dest: ARRAY OF BYTE; bit: CARDINAL) ;
+ 
+ 
+ (*
+    Excl - dest &= (~ bit)
+           implement EXCL for a wide set type.
+ *)
+ 
+ PROCEDURE Excl (VAR dest: ARRAY OF BYTE; bit: CARDINAL) ;
+ 
+ 
+ (*
+    In - return bit IN expr.
+ *)
+ 
+ PROCEDURE In (VAR expr: ARRAY OF BYTE; bit: CARDINAL) : BOOLEAN ;
+ 
+ 
+ (*
+    Equal - return left = right.
+ *)
+ 
+ PROCEDURE Equal (VAR left, right: ARRAY OF BYTE; highbit: CARDINAL) : BOOLEAN ;
+ 
+ 
+ (*
+    Clear - dest = {}.
+ *)
+ 
+ PROCEDURE Clear (VAR dest: ARRAY OF BYTE; highbit: CARDINAL) ;
+ 
+ 
+ (*
+    Shift - dest := SHIFT (src, ShiftCount).  This is a logical shift
+            all the new bit values will be zero.
+ *)
+ 
+ PROCEDURE Shift (VAR dest: ARRAY OF BYTE; src: ARRAY OF BYTE;
+                  highbit: CARDINAL; ShiftCount: INTEGER) ;
+ 
+ 
+ (*
+    ArithShift - dest := ArithShift (dest, ShiftCount, carry).  This is an
+                 arithmetic shift all the new bit values will
+                 be set to carry.
+ *)
+ 
+ PROCEDURE ArithShift (VAR dest: ARRAY OF BYTE;
+                       highbit: CARDINAL; ShiftCount: INTEGER;
+                       carry: BOOLEAN) ;
+ 
+ 
+ (*
+    Rotate - is a runtime procedure whose job is to implement
+             the ROTATE procedure of ISO SYSTEM.
+ *)
+ 
+ PROCEDURE Rotate (VAR dest: ARRAY OF BYTE; src: ARRAY OF BYTE;
+                   highbit: CARDINAL; RotateCount: INTEGER) ;
+ 
+ (*
+    Less - performs the set comparison for a wide set.
+           Less returns ProperSubset (left, right, highbit).
+ *)
+ 
+ PROCEDURE Less (VAR left, right: ARRAY OF BYTE;
+                 highbit: CARDINAL) : BOOLEAN ;
+ 
+ 
+ (*
+    LessEqu - performs the set comparison for a wide set.
+              LessEqu returns Equal (left, right, highbit) OR
+                              ProperSubset (left, right, highbit).
+ *)
+ 
+ PROCEDURE LessEqu (VAR left, right: ARRAY OF BYTE;
+                    highbit: CARDINAL) : BOOLEAN ;
+ 
+ 
+ (*
+    Gre - performs the set comparison for a wide set.
+          Gre returns the result of
+          ProperSuperet (left, right, highbit).
+ *)
+ 
+ PROCEDURE Gre (VAR left, right: ARRAY OF BYTE;
+                highbit: CARDINAL) : BOOLEAN ;
+ 
+ 
+ (*
+    GreEqu - performs the set comparison for a wide set.
+             GreEqu returns Equal (left, right, highbit) OR
+                            ProperSuperet (left, right, highbit).
+ *)
+ 
+ PROCEDURE GreEqu (VAR left, right: ARRAY OF BYTE;
+                   highbit: CARDINAL) : BOOLEAN ;
+ 
+ (*
+    ProperSubset - return TRUE if left is a proper subset of right.
+                   If true the left set will have at least one element
+                   less than set right.
+ *)
+ 
+ PROCEDURE ProperSubset (VAR left, right: ARRAY OF BYTE;
+                         highbit: CARDINAL) : BOOLEAN ;
+ 
+ 
+ (*
+    ProperSuperset - return TRUE if left is a proper superset of right.
+                     If true the left set will have at least one element
+                     more than set right.
+ *)
+ 
+ PROCEDURE ProperSuperset (VAR left, right: ARRAY OF BYTE;
+                           highbit: CARDINAL) : BOOLEAN ;
+ 
+ 
+ (*
+    LogicalDifference - build a logical difference expression tree.
+                        dest := left and (not right).
+ *)
+ 
+ PROCEDURE LogicalDifference (VAR dest: ARRAY OF BYTE;
+                              left, right: ARRAY OF BYTE;
+                              highbit: CARDINAL) ;
+ 
+ 
+ (*
+    SymmetricDifference - build a logical difference expression tree.
+                          dest := left xor right.
+ *)
+ 
+ PROCEDURE SymmetricDifference (VAR dest: ARRAY OF BYTE;
+                                left, right: ARRAY OF BYTE;
+                                highbit: CARDINAL) ;
+ 
+ 
+ END M2WIDESET.
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-libs/M2WIDESET.mod gcc-16-20250921/gcc/m2/gm2-libs/M2WIDESET.mod
*** gcc-16-20250914/gcc/m2/gm2-libs/M2WIDESET.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/m2/gm2-libs/M2WIDESET.mod	Sun Sep 21 22:32:38 2025
***************
*** 0 ****
--- 1,1259 ----
+ (* M2WIDESET.mod runtime support procedures for wide sets.
+ 
+ Copyright (C) 2023 Free Software Foundation, Inc.
+ Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
+ 
+ This file is part of GNU Modula-2.
+ 
+ GNU Modula-2 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.
+ 
+ GNU Modula-2 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/>.  *)
+ 
+ IMPLEMENTATION MODULE M2WIDESET ;
+ 
+ FROM SYSTEM IMPORT TBITSIZE, ADDRESS, ADR, SHIFT ;
+ FROM Builtins IMPORT memcpy, memset ;
+ FROM libc IMPORT printf ;
+ 
+ TYPE
+    BYTESET = PACKEDSET OF [0..7] ;
+    PtrToByteset = POINTER TO BYTESET ;
+    PtrToBitset = POINTER TO BITSET ;
+ 
+ 
+ CONST
+    EnableOptimizeBitset = TRUE ;
+    EnableDebugging      = FALSE ;
+ 
+ 
+ (*
+    BitsPerByteset = TSIZE (BYTESET) * 8 ;
+ *)
+ 
+ 
+ (*
+    DumpSet -
+ *)
+ 
+ PROCEDURE DumpSet (set: ARRAY OF BYTE; highbit: CARDINAL) ;
+ VAR
+    count,
+    i, high: CARDINAL ;
+    last   : BYTE ;
+ BEGIN
+    high := HIGH (set) ;
+    printf ("set highbit = %d, high indice = %d\n", highbit, high) ;
+    printf ("{ ") ;
+    last := set[0] ;
+    i := 1 ;
+    count := 1 ;
+    printf (" 0: 0x%02x", VAL (CARDINAL, last)) ;
+    WHILE i <= high DO
+       IF last = set[i]
+       THEN
+          INC (count)
+       ELSE
+          IF count > 1
+          THEN
+             printf (" x %d, %d: 0x%02x", count, i, VAL (CARDINAL, set[i]))
+          ELSE
+             IF i > 0
+             THEN
+                printf (",")
+             END ;
+             printf (" %d: 0x%02x", i, VAL (CARDINAL, set[i]))
+          END ;
+          last := set[i] ;
+          count := 1
+       END ;
+       INC (i)
+    END ;
+    IF count > 1
+    THEN
+       printf (" x %d ", count)
+    END ;
+    printf (" }\n")
+ END DumpSet ;
+ 
+ 
+ (*
+    Or - dest = left | right
+         implement OR for a wide set type.
+ *)
+ 
+ PROCEDURE Or (VAR dest: ARRAY OF BYTE; left, right: ARRAY OF BYTE;
+               highbit: CARDINAL) ;
+ VAR
+    i,
+    bit,
+    high,
+    lastbit: CARDINAL ;
+    byteset: BYTESET ;
+ BEGIN
+    IF EnableDebugging
+    THEN
+       printf ("left\n");
+       DumpSet (left, highbit) ;
+       printf ("right\n");
+       DumpSet (right, highbit)
+    END ;
+    high := HIGH (dest) ;
+    i := 0 ;
+    WHILE i < high DO
+       IF EnableDebugging
+       THEN
+          printf ("%02x or %02x", left[i], right[i])
+       END ;
+       dest[i] := BYTESET (left[i]) + BYTESET (right[i]) ;
+       IF EnableDebugging
+       THEN
+          printf (" -> %02x\n", dest[i])
+       END ;
+       INC (i)
+    END ;
+    IF i = high
+    THEN
+       lastbit := highbit MOD TBITSIZE (BYTE) ;
+       IF lastbit = 0
+       THEN
+          dest[i] := BYTESET (left[i]) + BYTESET (right[i])
+       ELSE
+          byteset := dest[i] ;
+          FOR bit := 0 TO lastbit DO
+             IF (bit IN BYTESET (left[i])) OR (bit IN BYTESET (right[i]))
+             THEN
+                INCL (byteset, bit)
+             ELSE
+                EXCL (byteset, bit)
+             END
+          END ;
+          dest[i] := byteset
+       END
+    ELSE
+       HALT
+    END
+ END Or ;
+ 
+ 
+ (*
+    And - dest = left & right
+          implement AND for a wide set type.
+ *)
+ 
+ PROCEDURE And (VAR dest: ARRAY OF BYTE; left, right: ARRAY OF BYTE;
+                highbit: CARDINAL) ;
+ VAR
+    i,
+    bit,
+    high,
+    lastbit: CARDINAL ;
+    byteset: BYTESET ;
+ BEGIN
+    high := HIGH (dest) ;
+    i := 0 ;
+    WHILE i < high DO
+       dest[i] := BYTESET (left[i]) * BYTESET (right[i]) ;
+       INC (i)
+    END ;
+    IF i = high
+    THEN
+       lastbit := highbit MOD TBITSIZE (BYTE) ;
+       IF lastbit = 0
+       THEN
+          dest[i] := BYTESET (left[i]) * BYTESET (right[i])
+       ELSE
+          byteset := dest[i] ;
+          FOR bit := 0 TO lastbit DO
+             IF (bit IN BYTESET (left[i])) AND (bit IN BYTESET (right[i]))
+             THEN
+                INCL (byteset, bit)
+             ELSE
+                EXCL (byteset, bit)
+             END
+          END ;
+          dest[i] := byteset
+       END
+    ELSE
+       HALT
+    END
+ END And ;
+ 
+ 
+ (*
+    Not - dest = ~ expr
+          implement NOT for a wide set type.
+ *)
+ 
+ PROCEDURE Not (VAR dest: ARRAY OF BYTE; expr: ARRAY OF BYTE;
+                highbit: CARDINAL) ;
+ VAR
+    i,
+    bit,
+    high,
+    lastbit: CARDINAL ;
+    byteset: BYTESET ;
+ BEGIN
+    high := HIGH (dest) ;
+    i := 0 ;
+    WHILE i < high DO
+       dest[i] := - BYTESET (expr[i]) ;
+       INC (i)
+    END ;
+    IF i = high
+    THEN
+       lastbit := highbit MOD TBITSIZE (BYTE) ;
+       IF lastbit = 0
+       THEN
+          dest[i] := - BYTESET (expr[i])
+       ELSE
+          byteset := dest[i] ;
+          FOR bit := 0 TO lastbit DO
+             IF bit IN BYTESET (expr[i])
+             THEN
+                EXCL (byteset, bit)
+             ELSE
+                INCL (byteset, bit)
+             END
+          END ;
+          dest[i] := byteset
+       END
+    ELSE
+       HALT
+    END
+ END Not ;
+ 
+ 
+ (*
+    Incl - dest |= bit
+           implement INCL for a wide set type.
+ *)
+ 
+ PROCEDURE Incl (VAR dest: ARRAY OF BYTE; bit: CARDINAL) ;
+ VAR
+    byteset: BYTESET ;
+    byteno,
+    bitno,
+    high   : CARDINAL ;
+ BEGIN
+    high := HIGH (dest) ;
+    byteno := bit DIV TBITSIZE (BYTE) ;
+    bitno := bit MOD TBITSIZE (BYTE) ;
+    IF byteno <= high
+    THEN
+       byteset := BYTESET (dest[byteno]) ;
+       INCL (byteset, bitno) ;
+       dest[byteno] := byteset
+    ELSE
+       HALT
+    END
+ END Incl ;
+ 
+ 
+ (*
+    Excl - dest &= (~ bit)
+           implement EXCL for a wide set type.
+ *)
+ 
+ PROCEDURE Excl (VAR dest: ARRAY OF BYTE; bit: CARDINAL) ;
+ VAR
+    byteset: BYTESET ;
+    byteno,
+    bitno,
+    high   : CARDINAL ;
+ BEGIN
+    high := HIGH (dest) ;
+    byteno := bit DIV TBITSIZE (BYTE) ;
+    bitno := bit MOD TBITSIZE (BYTE) ;
+    IF byteno <= high
+    THEN
+       byteset := BYTESET (dest[byteno]) ;
+       EXCL (byteset, bitno) ;
+       dest[byteno] := byteset
+    ELSE
+       HALT
+    END
+ END Excl ;
+ 
+ 
+ (*
+    In - return bit IN expr.
+ *)
+ 
+ PROCEDURE In (VAR expr: ARRAY OF BYTE; bit: CARDINAL) : BOOLEAN ;
+ VAR
+    byteno,
+    bitno,
+    high  : CARDINAL ;
+ BEGIN
+    high := HIGH (expr) ;
+    byteno := bit DIV TBITSIZE (BYTE) ;
+    bitno := bit MOD TBITSIZE (BYTE) ;
+    IF byteno <= high
+    THEN
+       RETURN bitno IN BYTESET (expr[byteno])
+    ELSE
+       HALT
+    END
+ END In ;
+ 
+ 
+ (*
+    Empty - return TRUE if expr = {}.
+ *)
+ 
+ PROCEDURE Empty (expr: ARRAY OF BYTE; highbit: CARDINAL) : BOOLEAN ;
+ VAR
+    i,
+    bit,
+    high,
+    lastbit: CARDINAL ;
+ BEGIN
+    high := HIGH (expr) ;
+    i := 0 ;
+    WHILE i < high DO
+       IF expr[i] # BYTE (0)
+       THEN
+          RETURN FALSE
+       END ;
+       INC (i)
+    END ;
+    IF i = high
+    THEN
+       lastbit := highbit MOD TBITSIZE (BYTE) ;
+       IF lastbit = 0
+       THEN
+          RETURN expr[i] = BYTE (0)
+       ELSE
+          FOR bit := 0 TO lastbit DO
+             IF bit IN BYTESET (expr[i])
+             THEN
+                RETURN FALSE
+             END
+          END
+       END
+    ELSE
+       HALT
+    END ;
+    RETURN TRUE
+ END Empty ;
+ 
+ 
+ (*
+    Clear - set dest := {}.
+ *)
+ 
+ PROCEDURE Clear (VAR dest: ARRAY OF BYTE; highbit: CARDINAL) ;
+ VAR
+    i,
+    bit,
+    high,
+    lastbit: CARDINAL ;
+    byteset: BYTESET ;
+ BEGIN
+    high := HIGH (dest) ;
+    IF EnableOptimizeBitset
+    THEN
+       IF memset (ADR (dest), 0, high) = NIL
+       THEN
+       END ;
+       i := high
+    ELSE
+       i := 0 ;
+       WHILE i < high DO
+          dest[i] := BYTE (0) ;
+          INC (i)
+       END
+    END ;
+    IF i = high
+    THEN
+       lastbit := highbit MOD TBITSIZE (BYTE) ;
+       IF lastbit = 0
+       THEN
+          dest[i] := BYTE (0)
+       ELSE
+          byteset := dest[i] ;
+          FOR bit := 0 TO lastbit DO
+             EXCL (byteset, bit)
+          END ;
+          dest[i] := byteset
+       END
+    ELSE
+       HALT
+    END
+ END Clear ;
+ 
+ 
+ (*
+    Equal - return left = right.
+ *)
+ 
+ PROCEDURE Equal (VAR left, right: ARRAY OF BYTE; highbit: CARDINAL) : BOOLEAN ;
+ VAR
+    i,
+    bit,
+    high,
+    lastbit   : CARDINAL ;
+    rptr, lptr: PtrToByteset ;
+    lb, rb    : BOOLEAN ;
+ BEGIN
+    IF EnableDebugging
+    THEN
+       printf ("Equal left : ");
+       DumpSet (left, highbit) ;
+       printf ("      right: ");
+       DumpSet (right, highbit) ;
+    END ;
+ 
+    high := HIGH (left) ;
+    IF high = HIGH (right)
+    THEN
+       i := 0 ;
+       WHILE i < high DO
+          IF left[i] # right[i]
+          THEN
+             RETURN FALSE
+          END ;
+          INC (i)
+       END ;
+       IF i = high
+       THEN
+          lastbit := highbit MOD TBITSIZE (BYTE) ;
+          IF lastbit = 7
+          THEN
+             (* All bits 0..7 inclusive can be tested.  *)
+             RETURN left[i] = right[i]
+          END ;
+          rptr := ADR (right[i]) ;
+          lptr := ADR (left[i]) ;
+          (* Only check the bits in the set which are used in the last byte.  *)
+          FOR bit := 0 TO lastbit DO
+             (*
+             IF (bit IN rptr^) # (bit IN lptr^)
+             THEN
+                RETURN FALSE
+             END
+             *)
+             lb := bit IN lptr^ ;    (* Replace with the above - when the bug is fixed.  *)
+             rb := bit IN rptr^ ;
+             IF lb # rb
+             THEN
+                RETURN FALSE
+             END
+          END
+       END
+    ELSE
+       HALT
+    END ;
+    RETURN TRUE
+ END Equal ;
+ 
+ 
+ (*
+    ShiftLeft - performs the shift left for a multi word set.
+ *)
+ 
+ PROCEDURE ShiftLeft (VAR dest: ARRAY OF BYTE; src: ARRAY OF BYTE;
+                      highbit: CARDINAL;
+                      ShiftCount: CARDINAL) ;
+ VAR
+    byteshift,
+    bitshift : CARDINAL ;
+ BEGIN
+    byteshift := ShiftCount DIV TBITSIZE (BYTESET) ;
+    bitshift := ShiftCount MOD TBITSIZE (BYTESET) ;
+    ShiftLeftByteBit (dest, src, highbit, byteshift, bitshift)
+ END ShiftLeft ;
+ 
+ 
+ (*
+    ShiftLeftByteBit - shifts src left by byteshift and bitshift.  It
+                       moves the bottom bitshift bits from lo into the
+                       first byte.
+ *)
+ 
+ PROCEDURE ShiftLeftByteBit (VAR dest: ARRAY OF BYTE; src: ARRAY OF BYTE;
+                             highbit: CARDINAL;
+                             byteshift, bitshift: CARDINAL) ;
+ VAR
+    top, bot, mid : BYTESET ;
+    i, h, from, to: CARDINAL ;
+ BEGIN
+    (* Copy the bytes into dest at the mostly correct position
+       (modulo byte position).  *)
+    to := 0 ;
+    from := 0 ;
+    WHILE to < byteshift DO
+       dest[to] := BYTE (0) ;
+       INC (to)
+    END ;
+    WHILE to <= HIGH (dest) DO
+       dest[to] := src[from] ;
+       INC (to) ;
+       INC (from)
+    END ;
+    (* And adjust by bit shifting.  *)
+    IF bitshift > 0
+    THEN
+       bot := BYTE (0) ;
+       h := HIGH (dest) ;
+       i := 0 ;
+       WHILE i < h DO
+          mid := dest[i] ;
+          (* Shift right by TBITSIZE (BYTE) - bitshift.  *)
+          top := SHIFT (mid, - INTEGER ((TBITSIZE (BYTE) - bitshift))) ;  (* Right must be negative.  *)
+          mid := SHIFT (mid, bitshift) ;   (* Shift left.  *)
+          dest[i] := mid + bot ;
+          bot := top ;
+          INC (i)
+       END ;
+       mid := dest[h] ;
+       mid := SHIFT (mid, bitshift) ;   (* Shift left.  *)
+       dest[h] := mid + bot
+    END
+ END ShiftLeftByteBit ;
+ 
+ 
+ (*
+    ShiftRight - performs the shift rightt for a multi word set.
+ *)
+ 
+ PROCEDURE ShiftRight (VAR dest: ARRAY OF BYTE; src: ARRAY OF BYTE;
+                      highbit: CARDINAL;
+                      ShiftCount: CARDINAL) ;
+ VAR
+    byteshift,
+    bitshift : CARDINAL ;
+ BEGIN
+    IF EnableDebugging
+    THEN
+       printf ("highbit = %d, ShiftCount = %d\n",
+               highbit, ShiftCount)
+    END ;
+    byteshift := ShiftCount DIV TBITSIZE (BYTESET) ;
+    bitshift := ShiftCount MOD TBITSIZE (BYTESET) ;
+    IF EnableDebugging
+    THEN
+       printf ("SIZE (byteset) = %d, TBITSIZE (byteset) = %d\n",
+               SIZE (BYTESET), TBITSIZE (BYTESET));
+       printf ("  byteshift = %d, bitshift = %d\n",
+               byteshift, bitshift)
+    END ;
+    ShiftRightByteBit (dest, src, highbit, byteshift, bitshift)
+ END ShiftRight ;
+ 
+ 
+ (*
+    ShiftRightByteBit - shifts src left by byteshift and bitshift.  It
+                       moves the bottom bitshift bits from lo into the
+                       first byte.
+ *)
+ 
+ PROCEDURE ShiftRightByteBit (VAR dest: ARRAY OF BYTE; src: ARRAY OF BYTE;
+                              highbit: CARDINAL;
+                              byteshift, bitshift: CARDINAL) ;
+ VAR
+    top, bot, mid : BYTESET ;
+    i, h, to, from: CARDINAL ;
+ BEGIN
+    (* Copy the bytes.  *)
+    to := 0 ;
+    from := byteshift ;
+    IF EnableDebugging
+    THEN
+       printf ("HIGH (dest) = %d\n", HIGH (dest))
+    END ;
+    IF byteshift <= HIGH (dest)
+    THEN
+       h := HIGH (dest) - byteshift ;
+       WHILE to <= h DO
+          dest[to] := src[from] ;
+          INC (to) ;
+          INC (from)
+       END
+    END ;
+    WHILE to <= HIGH (dest) DO
+       dest[to] := BYTE (0) ;
+       INC (to)
+    END ;
+    (* And bit shift the remainder.  *)
+    IF EnableDebugging
+    THEN
+       printf ("bitshift = %d\n", bitshift)
+    END ;
+    IF bitshift > 0
+    THEN
+       top := BYTE (0) ;
+       i := HIGH (dest) ;
+       WHILE i > 0 DO
+          mid := dest[i] ;
+          bot := SHIFT (mid, TBITSIZE (BYTE) - bitshift) ;   (* Shift left.  *)
+          mid := SHIFT (mid, - INTEGER (bitshift)) ;  (* Shift right by bitshift.  *)
+          dest[i] := top + mid ;
+          top := bot ;
+          DEC (i)
+       END ;
+       mid := dest[0] ;
+       mid := SHIFT (mid, - INTEGER (bitshift)) ;  (* Shift right by bitshift.  *)
+       dest[0] := top + mid
+    END
+ END ShiftRightByteBit ;
+ 
+ 
+ (*
+    Shift - dest := SHIFT (src, ShiftCount).
+ *)
+ 
+ PROCEDURE Shift (VAR dest: ARRAY OF BYTE; src: ARRAY OF BYTE;
+                  highbit: CARDINAL; ShiftCount: INTEGER) ;
+ BEGIN
+    IF ShiftCount > 0
+    THEN
+       IF EnableDebugging
+       THEN
+          printf ("Shift Left: ") ;
+          DumpSet (src, highbit)
+       END ;
+       ShiftCount := ShiftCount MOD VAL (INTEGER, (highbit + 1)) ;
+       ShiftLeft (dest, src, highbit, ShiftCount) ;
+       IF EnableDebugging
+       THEN
+          printf ("  Result of shift Left: ") ;
+          DumpSet (dest, highbit)
+       END
+    ELSIF ShiftCount < 0
+    THEN
+       IF EnableDebugging
+       THEN
+          printf ("Shift Right: ") ;
+          DumpSet (src, highbit)
+       END ;
+       ShiftCount := (-ShiftCount) MOD VAL (INTEGER, (highbit + 1)) ;
+       ShiftRight (dest, src, highbit, ShiftCount) ;
+       IF EnableDebugging
+       THEN
+          printf ("  Result of shift right: ") ;
+          DumpSet (dest, highbit)
+       END
+    ELSE
+       IF memcpy (ADR (dest), ADR (src), (HIGH (dest) + 1) * SIZE (BYTE)) = NIL
+       THEN
+       END
+    END
+ END Shift ;
+ 
+ 
+ (*
+    ArithShift - dest := ArithShift (dest, ShiftCount, carry).  This is an
+                 arithmetic shift all the new bit values will
+                 be set to carry.
+ *)
+ 
+ PROCEDURE ArithShiftLeft (VAR dest: ARRAY OF BYTE;
+                           highbit: CARDINAL; ShiftCount: CARDINAL;
+                           carry: BOOLEAN) ;
+ BEGIN
+    WHILE ShiftCount > 0 DO
+       ArithShiftLeftBit (dest, highbit, carry) ;
+       DEC (ShiftCount)
+    END
+ END ArithShiftLeft ;
+ 
+ 
+ (*
+    ArithShiftLeftBit - shift set left by one bit.  Carry will appear at
+                        bit position 0.  Any unused bits on the high byte
+                        are unaffected.
+ *)
+ 
+ PROCEDURE ArithShiftLeftBit (VAR dest: ARRAY OF BYTE; highbit: CARDINAL;
+                              carry: BOOLEAN) ;
+ CONST
+    MSB = TBITSIZE (BYTE) - 1 ;
+ VAR
+    topbit,
+    i,
+    high  : CARDINAL ;
+    next  : BOOLEAN ;
+    mask,
+    unused,
+    set   : BYTESET ;
+ BEGIN
+    IF EnableDebugging
+    THEN
+       printf ("ArithShiftLeft enter\n");
+       DumpSet (dest, highbit)
+    END ;
+ 
+    high := HIGH (dest) ;
+    (* We ripple through the bytes 0..high-1, propagating local carry between
+       bytes.  *)
+    i := 0 ;
+    WHILE i < high DO
+       set := dest[i] ;
+       next := MSB IN set ;
+       set := SHIFT (set, 1) ;  (* Shift left.  *)
+       IF carry
+       THEN
+          INCL (set, 0)   (* Set bit 0.  *)
+       END ;
+       dest[i] := set ;
+       carry := next ;
+       IF EnableDebugging
+       THEN
+          printf ("ArithShiftLeft shifted byte dest[%d]\n", i);
+          DumpSet (dest, highbit)
+       END ;
+       INC (i)
+    END ;
+    (* Last byte special case as there may be some unused bits which must be
+       preserved.  *)
+    set := dest[high] ;
+    unused := BYTESET {} ;  (* Will contain all top unused bits of dest[high].  *)
+    mask := - BYTESET {} ;
+    topbit := (highbit+1) MOD TBITSIZE (BYTE) ;
+    WHILE topbit # 0 DO
+       EXCL (mask, topbit) ;
+       IF topbit IN set
+       THEN
+          EXCL (set, topbit) ;
+          INCL (unused, topbit)
+       END ;
+       topbit := (topbit+1) MOD TBITSIZE (BYTE)
+    END ;
+    set := SHIFT (set, 1) ;  (* Left shift.  *)
+    IF carry
+    THEN
+       INCL (set, 0)   (* Set bit 0.  *)
+    END ;
+    set := set * mask ;  (* Remove all unused bits.  *)
+    set := set + unused ;  (* Restore original unused bits.  *)
+    dest[high] := set ;
+    IF EnableDebugging
+    THEN
+       printf ("ArithShiftLeft shifted byte dest[%d]\n", high);
+       DumpSet (dest, highbit)
+    END
+ END ArithShiftLeftBit ;
+ 
+ 
+ (*
+    ArithShiftRight - dest := ArithShiftRight (dest, ShiftCount, carry).
+                      This is an arithmetic shift all the new bit values
+                      will be set to carry.
+ *)
+ 
+ PROCEDURE ArithShiftRight (VAR dest: ARRAY OF BYTE;
+                            highbit: CARDINAL; ShiftCount: CARDINAL;
+                            carry: BOOLEAN) ;
+ BEGIN
+    WHILE ShiftCount > 0 DO
+       ArithShiftRightBit (dest, highbit, carry) ;
+       DEC (ShiftCount)
+    END
+ END ArithShiftRight ;
+ 
+ 
+ (*
+    ArithShiftRightBit - shift set right by one bit and place carry in the
+                         top most bit.
+ *)
+ 
+ PROCEDURE ArithShiftRightBit (VAR dest: ARRAY OF BYTE; highbit: CARDINAL;
+                               carry: BOOLEAN) ;
+ CONST
+    MSB = TBITSIZE (BYTE) - 1 ;
+ VAR
+    topbit,
+    i,
+    high  : CARDINAL ;
+    prev,
+    next  : BOOLEAN ;
+    mask,
+    unused,
+    set   : BYTESET ;
+ BEGIN
+    high := HIGH (dest) ;
+    (* Clear any unused bits in the highest byte, but save them into unused.  *)
+    set := dest[high] ;
+    unused := BYTESET {} ;
+    topbit := (highbit+1) MOD TBITSIZE (BYTE) ;
+    mask := - BYTESET {} ;
+    WHILE topbit # 0 DO
+       EXCL (mask, topbit) ;
+       IF topbit IN set
+       THEN
+          EXCL (set, topbit) ;
+          INCL (unused, topbit)
+       END ;
+       topbit := (topbit+1) MOD TBITSIZE (BYTE)
+    END ;
+    (* Start at the top and work down to byte 0.  *)
+    set := set * mask ;  (* Ignore unused bits.  *)
+    next := 0 IN set ;   (* Next carry.  *)
+    set := SHIFT (set, -1) ;   (* Shift right by 1 bit.  *)
+    IF carry
+    THEN
+       INCL (set, highbit MOD TBITSIZE (BYTE))
+    END ;
+    dest[high] := set + unused ;  (* First byte is a special case as we
+                                     have to preserve the unused bits.  *)
+    (* Now we ripple through the remaining bytes, propagating local
+       carry between bytes.  *)
+    i := high ;
+    WHILE i > 0 DO
+       prev := next ;
+       DEC (i) ;
+       set := dest[i] ;
+       next := 0 IN set ;
+       set := SHIFT (set, -1) ;
+       IF prev
+       THEN
+          INCL (set, MSB)
+       END ;
+       dest[i] := set
+    END
+ END ArithShiftRightBit ;
+ 
+ 
+ (*
+    ArithShift - dest := ArithShift (dest, ShiftCount, carry).  This is an
+                 arithmetic shift all the new bit values will
+                 be set to carry.
+ *)
+ 
+ PROCEDURE ArithShift (VAR dest: ARRAY OF BYTE;
+                       highbit: CARDINAL; ShiftCount: INTEGER;
+                       carry: BOOLEAN) ;
+ BEGIN
+    IF EnableDebugging
+    THEN
+       printf ("Arith enter\n");
+       DumpSet (dest, highbit)
+    END ;
+    IF ShiftCount > 0
+    THEN
+       ShiftCount := ShiftCount MOD VAL (INTEGER, (highbit + 1)) ;
+       ArithShiftLeft (dest, highbit, ShiftCount, carry)
+    ELSIF ShiftCount < 0
+    THEN
+       ShiftCount := (-ShiftCount) MOD VAL (INTEGER, (highbit + 1)) ;
+       ArithShiftRight (dest, highbit, ShiftCount, carry)
+    END ;
+    IF EnableDebugging
+    THEN
+       printf ("Arith exit\n");
+       DumpSet (dest, highbit)
+    END
+ END ArithShift ;
+ 
+ 
+ (*
+    Rotate - is a runtime procedure whose job is to implement
+             the ROTATE procedure of ISO SYSTEM.
+ *)
+ 
+ PROCEDURE Rotate (VAR dest: ARRAY OF BYTE; src: ARRAY OF BYTE;
+                   highbit: CARDINAL; RotateCount: INTEGER) ;
+ BEGIN
+    IF EnableDebugging
+    THEN
+       printf ("Rotate enter\n");
+       DumpSet (src, highbit)
+    END ;
+    IF RotateCount > 0
+    THEN
+       RotateCount := RotateCount MOD VAL (INTEGER, highbit + 1)
+    ELSIF RotateCount < 0
+    THEN
+       RotateCount := -VAL (INTEGER, VAL (CARDINAL, -RotateCount) MOD (highbit + 1))
+    END ;
+    IF RotateCount > 0
+    THEN
+       RotateLeft (dest, src, highbit, RotateCount)
+    ELSIF RotateCount < 0
+    THEN
+       RotateRight (dest, src, highbit, -RotateCount)
+    ELSE
+       (* No rotate required, but we must copy source to dest.  *)
+       IF memcpy (ADR (dest), ADR (src), (HIGH (dest) + 1) * SIZE (BYTE)) = NIL
+       THEN
+       END
+    END ;
+    IF EnableDebugging
+    THEN
+       printf ("Rotate exit\n");
+       DumpSet (dest, highbit)
+    END
+ END Rotate ;
+ 
+ 
+ (*
+    RotateLeft - performs the rotate left for a multi word set.
+ *)
+ 
+ PROCEDURE RotateLeft (VAR dest: ARRAY OF BYTE; src: ARRAY OF BYTE;
+                       highbit: CARDINAL; RotateCount: CARDINAL) ;
+ VAR
+    bit,  carry : BOOLEAN ;
+    count,
+    high,
+    highplus1,
+    highbitplus1,
+    from, to    : CARDINAL ;
+ BEGIN
+    IF EnableDebugging
+    THEN
+       printf ("RotateLeft enter\n");
+       DumpSet (src, highbit)
+    END ;
+ 
+    (* Copy the contents rotating on byte granularity, then
+       arithmetically shift the remaining number of bits.  *)
+    high := HIGH (dest) ;
+    from := 0 ;
+    highplus1 := high + 1 ;
+    highbitplus1 := highbit + 1 ;
+    to := RotateCount DIV TBITSIZE (BYTE) ;  (* Byte level granularity.  *)
+    REPEAT
+       dest[to] := src[from] ;
+       IF EnableDebugging
+       THEN
+          printf ("RotateLeft after partial byte movement: dest[%d] := src[%d]\n",
+                  to, from);
+          DumpSet (dest, highbit)
+       END ;
+       from := (from + 1) MOD highplus1 ;
+       to := (to + 1) MOD highplus1 ;
+    UNTIL from = 0 ;
+ 
+    IF EnableDebugging
+    THEN
+       printf ("RotateLeft after byte placement\n");
+       DumpSet (dest, highbit)
+    END ;
+ 
+    (* Now ArithShiftLeft the remainder number of bits.  *)
+    count := RotateCount MOD (TBITSIZE (BYTE)) ;
+    WHILE count > 0 DO
+       (* Get last bit.  *)
+       bit := (highbit MOD TBITSIZE (BYTE)) IN BYTESET (dest[high]) ;
+       (* Shift everything left wards and the last bit goes to bit
+          position 0.  *)
+       ArithShiftLeft (dest, highbit, 1, bit) ;
+       DEC (count)
+    END ;
+    IF EnableDebugging
+    THEN
+       printf ("RotateLeft after bit shifting final placement\n");
+       DumpSet (dest, highbit)
+    END
+ END RotateLeft ;
+ 
+ 
+ (*
+    RotateRight - performs the rotate right for a multi word set.
+ *)
+ 
+ PROCEDURE RotateRight (VAR dest: ARRAY OF BYTE; src: ARRAY OF BYTE;
+                        highbit: CARDINAL; RotateCount: CARDINAL) ;
+ BEGIN
+    RotateLeft (dest, src, highbit, (highbit + 1) - RotateCount)
+ END RotateRight ;
+ 
+ 
+ (*
+    Less - performs the set comparison for a wide set.
+           Less returns ProperSubset (left, right, highbit).
+ *)
+ 
+ PROCEDURE Less (VAR left, right: ARRAY OF BYTE;
+                 highbit: CARDINAL) : BOOLEAN ;
+ 
+ BEGIN
+    RETURN ProperSubset (left, right, highbit)
+ END Less ;
+ 
+ 
+ (*
+    LessEqu - performs the set comparison for a wide set.
+              LessEqu returns Equal (left, right, highbit) OR
+                              ProperSubset (left, right, highbit).
+ *)
+ 
+ PROCEDURE LessEqu (VAR left, right: ARRAY OF BYTE;
+                    highbit: CARDINAL) : BOOLEAN ;
+ BEGIN
+    RETURN Equal (left, right, highbit) OR
+           ProperSubset (left, right, highbit)
+ END LessEqu ;
+ 
+ 
+ (*
+    Gre - performs the set comparison for a wide set.
+          Gre returns the result of
+          ProperSuperet (left, right, highbit).
+ *)
+ 
+ PROCEDURE Gre (VAR left, right: ARRAY OF BYTE;
+                highbit: CARDINAL) : BOOLEAN ;
+ BEGIN
+    RETURN ProperSuperset (left, right, highbit)
+ END Gre ;
+ 
+ 
+ (*
+    GreEqu - performs the set comparison for a wide set.
+             GreEqu returns Equal (left, right, highbit) OR
+                            ProperSuperet (left, right, highbit).
+ *)
+ 
+ PROCEDURE GreEqu (VAR left, right: ARRAY OF BYTE;
+                   highbit: CARDINAL) : BOOLEAN ;
+ BEGIN
+    RETURN Equal (left, right, highbit) OR
+           ProperSuperset (left, right, highbit)
+ END GreEqu ;
+ 
+ 
+ (*
+    ProperSubset - return TRUE if left is a proper subset of right.
+                   If true the left set will have at least one element
+                   less than set right.
+ *)
+ 
+ PROCEDURE ProperSubset (VAR left, right: ARRAY OF BYTE;
+                         highbit: CARDINAL) : BOOLEAN ;
+ VAR
+    diffbits,
+    diffright,
+    diffleft : BYTESET ;
+    rightmore: BOOLEAN ;
+    i,
+    bit,
+    high,
+    lastbit: CARDINAL ;
+    lptr,
+    rptr   : PtrToByteset ;
+ BEGIN
+    high := HIGH (left) ;
+    lptr := ADR (left) ;
+    rptr := ADR (right) ;
+    i := 0 ;
+    rightmore := FALSE ;
+    WHILE i < high DO
+       diffbits :=  lptr^ / rptr^ ;  (* / in M2 is xor.  *)
+       diffright := diffbits * rptr^ ;  (* * in M2 is and.  *)
+       IF diffright # BYTESET {}
+       THEN
+          rightmore := TRUE
+       END ;
+       diffleft := diffbits * lptr^ ;
+       IF diffleft # BYTESET {}
+       THEN
+          (* Not a subset, so we early return.  *)
+          RETURN FALSE
+       END ;
+       INC (rptr) ;
+       INC (lptr) ;
+       INC (i)
+    END ;
+    lastbit := highbit MOD TBITSIZE (BYTE) ;
+    IF lastbit > 0
+    THEN
+       FOR bit := 0 TO lastbit DO
+          IF (NOT (bit IN lptr^)) AND (bit IN rptr^)
+          THEN
+             rightmore := TRUE
+          ELSIF (bit IN lptr^) AND (NOT (bit IN rptr^))
+          THEN
+             (* Not a subset, so we early return.  *)
+             RETURN FALSE
+          END
+       END
+    END ;
+    RETURN rightmore
+ END ProperSubset ;
+ 
+ 
+ (*
+    ProperSuperset - return TRUE if left is a proper superset of right.
+                     If true the left set will have at least one element
+                     more than set right.
+ *)
+ 
+ PROCEDURE ProperSuperset (VAR left, right: ARRAY OF BYTE;
+                           highbit: CARDINAL) : BOOLEAN ;
+ VAR
+    diffbits,
+    diffleft,
+    diffright: BYTESET ;
+    leftmore : BOOLEAN ;
+    i,
+    bit,
+    high,
+    lastbit  : CARDINAL ;
+    lptr,
+    rptr     : PtrToByteset ;
+ BEGIN
+    high := HIGH (left) ;
+    lptr := ADR (left) ;
+    rptr := ADR (right) ;
+    i := 0 ;
+    leftmore := FALSE ;
+    WHILE i < high DO
+       diffbits :=  lptr^ / rptr^ ;  (* / in M2 is xor.  *)
+       diffleft := diffbits * lptr^ ;  (* * in M2 is and.  *)
+       IF diffleft # BYTESET {}
+       THEN
+          leftmore := TRUE
+       END ;
+       diffright := diffbits * rptr^ ;
+       IF diffright # BYTESET {}
+       THEN
+          (* Not a superset, so we early return.  *)
+          RETURN FALSE
+       END ;
+       INC (rptr) ;
+       INC (lptr) ;
+       INC (i)
+    END ;
+    lastbit := highbit MOD TBITSIZE (BYTE) ;
+    IF lastbit > 0
+    THEN
+       FOR bit := 0 TO lastbit DO
+          IF (bit IN lptr^) AND (NOT (bit IN rptr^))
+          THEN
+             leftmore := TRUE
+          ELSIF (NOT (bit IN lptr^)) AND (bit IN rptr^)
+          THEN
+             (* Not a superset, so we early return.  *)
+             RETURN FALSE
+          END
+       END
+    END ;
+    RETURN leftmore
+ END ProperSuperset ;
+ 
+ 
+ (*
+    LogicalDifference - build a logical difference expression tree.
+                        dest := left and (not right).
+ *)
+ 
+ PROCEDURE LogicalDifference (VAR dest: ARRAY OF BYTE;
+                              left, right: ARRAY OF BYTE;
+                              highbit: CARDINAL) ;
+ BEGIN
+    Not (right, right, highbit) ;
+    And (dest, left, right, highbit)
+ END LogicalDifference ;
+ 
+ 
+ (*
+    SymmetricDifference - build a logical difference expression tree.
+                          dest := left xor right.
+ *)
+ 
+ PROCEDURE SymmetricDifference (VAR dest: ARRAY OF BYTE;
+                                left, right: ARRAY OF BYTE;
+                                highbit: CARDINAL) ;
+ VAR
+    i,
+    bit,
+    high,
+    lastbit: CARDINAL ;
+    byteset: BYTESET ;
+ BEGIN
+    high := HIGH (dest) ;
+    i := 0 ;
+    WHILE i < high DO
+       dest[i] := BYTESET (left[i]) / BYTESET (right[i]) ;
+       INC (i)
+    END ;
+    IF i = high
+    THEN
+       lastbit := highbit MOD TBITSIZE (BYTE) ;
+       IF lastbit = 0
+       THEN
+          dest[i] := BYTESET (left[i]) / BYTESET (right[i])
+       ELSE
+          byteset := dest[i] ;
+          FOR bit := 0 TO lastbit DO
+             IF (bit IN BYTESET (left[i])) = (bit IN BYTESET (right[i]))
+             THEN
+                EXCL (byteset, bit)
+             ELSE
+                INCL (byteset, bit)
+             END
+          END ;
+          dest[i] := byteset
+       END
+    ELSE
+       HALT
+    END
+ END SymmetricDifference ;
+ 
+ 
+ (*
+    AssignBits - copy bits [0..highbit] from src to dest.
+ *)
+ 
+ PROCEDURE AssignBits (VAR dest: BYTESET; src: BYTESET; highbit: CARDINAL) ;
+ VAR
+    bit,
+    lastbit: CARDINAL ;
+ BEGIN
+    (* Last byte.  *)
+    lastbit := highbit MOD TBITSIZE (BYTE) ;
+    IF lastbit = 0
+    THEN
+       (* Copy all bits.  *)
+       dest := src
+    ELSE
+       (* Copy only required bits.  *)
+       FOR bit := 0 TO lastbit DO
+          IF bit IN src
+          THEN
+             INCL (dest, bit)
+          ELSE
+             EXCL (dest, bit)
+          END
+       END
+    END
+ END AssignBits ;
+ 
+ 
+ (*
+    Assign -
+ *)
+ 
+ PROCEDURE Assign (VAR dest: ARRAY OF BYTE; src: ARRAY OF BYTE; highbit: CARDINAL) ;
+ VAR
+    i, high: CARDINAL ;
+ BEGIN
+    high := HIGH (dest) ;
+    i := 0 ;
+    WHILE i < high DO
+       dest[i] := src[i] ;
+       INC (i)
+    END ;
+    AssignBits (dest[i], src[i], highbit)
+ END Assign ;
+ 
+ 
+ END M2WIDESET.
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-libs/SYSTEM.def gcc-16-20250921/gcc/m2/gm2-libs/SYSTEM.def
*** gcc-16-20250914/gcc/m2/gm2-libs/SYSTEM.def	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-libs/SYSTEM.def	Sun Sep 21 22:32:38 2025
*************** PROCEDURE TBITSIZE (<type>) : CARDINAL ;
*** 111,197 ****
    *)
  *)
  
- (* The following procedures are invoked by GNU Modula-2 to
-    shift non word sized set types. They are not strictly part
-    of the core PIM Modula-2, however they are used
-    to implement the SHIFT procedure defined above,
-    which are in turn used by the Logitech compatible libraries.
- 
-    Users will access these procedures by using the procedure
-    SHIFT above and GNU Modula-2 will map SHIFT onto one of
-    the following procedures.
- *)
- 
- (*
-    ShiftVal - is a runtime procedure whose job is to implement
-               the SHIFT procedure of ISO SYSTEM. GNU Modula-2 will
-               inline a SHIFT of a single WORD sized set and will only
-               call this routine for larger sets.
- *)
- 
- PROCEDURE ShiftVal (VAR s, d: ARRAY OF BITSET;
-                     SetSizeInBits: CARDINAL;
-                     ShiftCount: INTEGER) ;
- 
- 
- (*
-    ShiftLeft - performs the shift left for a multi word set.
-                This procedure might be called by the back end of
-                GNU Modula-2 depending whether amount is known at
-                compile time.
- *)
- 
- PROCEDURE ShiftLeft (VAR s, d: ARRAY OF BITSET;
-                      SetSizeInBits: CARDINAL;
-                      ShiftCount: CARDINAL) ;
- 
- (*
-    ShiftRight - performs the shift left for a multi word set.
-                 This procedure might be called by the back end of
-                 GNU Modula-2 depending whether amount is known at
-                 compile time.
- *)
- 
- PROCEDURE ShiftRight (VAR s, d: ARRAY OF BITSET;
-                       SetSizeInBits: CARDINAL;
-                       ShiftCount: CARDINAL) ;
- 
- 
- (*
-    RotateVal - is a runtime procedure whose job is to implement
-                the ROTATE procedure of ISO SYSTEM. GNU Modula-2 will
-                inline a ROTATE of a single WORD (or less)
-                sized set and will only call this routine for larger
-                sets.
- *)
- 
- PROCEDURE RotateVal (VAR s, d: ARRAY OF BITSET;
-                      SetSizeInBits: CARDINAL;
-                      RotateCount: INTEGER) ;
- 
- 
- (*
-    RotateLeft - performs the rotate left for a multi word set.
-                 This procedure might be called by the back end of
-                 GNU Modula-2 depending whether amount is known at
-                 compile time.
- *)
- 
- PROCEDURE RotateLeft (VAR s, d: ARRAY OF BITSET;
-                       SetSizeInBits: CARDINAL;
-                       RotateCount: CARDINAL) ;
- 
- 
- (*
-    RotateRight - performs the rotate right for a multi word set.
-                  This procedure might be called by the back end of
-                  GNU Modula-2 depending whether amount is known at
-                  compile time.
- *)
- 
- PROCEDURE RotateRight (VAR s, d: ARRAY OF BITSET;
-                        SetSizeInBits: CARDINAL;
-                        RotateCount: CARDINAL) ;
- 
- 
  END SYSTEM.
--- 111,114 ----
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-libs/SYSTEM.mod gcc-16-20250921/gcc/m2/gm2-libs/SYSTEM.mod
*** gcc-16-20250914/gcc/m2/gm2-libs/SYSTEM.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-libs/SYSTEM.mod	Sun Sep 21 22:32:38 2025
*************** see the files COPYING3 and COPYING.RUNTI
*** 26,273 ****
  
  IMPLEMENTATION MODULE SYSTEM ;
  
- FROM libc IMPORT memcpy, memset ;
- 
- CONST
-    BitsPerBitset = MAX(BITSET)+1 ;
- 
- 
- (*
-    Max - returns the maximum of a and b.
- *)
- 
- PROCEDURE Max (a, b: CARDINAL) : CARDINAL ;
- BEGIN
-    IF a>b
-    THEN
-       RETURN( a )
-    ELSE
-       RETURN( b )
-    END
- END Max ;
- 
- 
- (*
-    Min - returns the minimum of a and b.
- *)
- 
- PROCEDURE Min (a, b: CARDINAL) : CARDINAL ;
- BEGIN
-    IF a<b
-    THEN
-       RETURN( a )
-    ELSE
-       RETURN( b )
-    END
- END Min ;
- 
- 
- (*
-    ShiftVal - is a runtime procedure whose job is to implement
-               the SHIFT procedure of ISO SYSTEM. GNU Modula-2 will
-               inline a SHIFT of a single WORD sized set and will only
-               call this routine for larger sets.
- *)
- 
- PROCEDURE ShiftVal (VAR s, d: ARRAY OF BITSET;
-                     SetSizeInBits: CARDINAL;
-                     ShiftCount: INTEGER) ;
- VAR
-    a: ADDRESS ;
- BEGIN
-    IF ShiftCount>0
-    THEN
-       ShiftCount := ShiftCount MOD VAL(INTEGER, SetSizeInBits) ;
-       ShiftLeft(s, d, SetSizeInBits, ShiftCount)
-    ELSIF ShiftCount<0
-    THEN
-       ShiftCount := (-ShiftCount) MOD VAL(INTEGER, SetSizeInBits) ;
-       ShiftRight(s, d, SetSizeInBits, ShiftCount)
-    ELSE
-       a := memcpy(ADR(d), ADR(s), (HIGH(d)+1)*SIZE(BITSET))
-    END
- END ShiftVal ;
- 
- 
- (*
-    ShiftLeft - performs the shift left for a multi word set.
-                This procedure might be called by the back end of
-                GNU Modula-2 depending whether amount is known at compile
-                time.
- *)
- 
- PROCEDURE ShiftLeft (VAR s, d: ARRAY OF BITSET;
-                      SetSizeInBits: CARDINAL;
-                      ShiftCount: CARDINAL) ;
- VAR
-    lo, hi : BITSET ;
-    i, j, h: CARDINAL ;
-    a      : ADDRESS ;
- BEGIN
-    h := HIGH(s)+1 ;
-    IF ShiftCount MOD BitsPerBitset=0
-    THEN
-       i := ShiftCount DIV BitsPerBitset ;
-       a := ADR(d[i]) ;
-       a := memcpy(a, ADR(s), (h-i)*SIZE(BITSET)) ;
-       a := memset(ADR(d), 0, i*SIZE(BITSET))
-    ELSE
-       i := h ;
-       WHILE i>0 DO
-          DEC(i) ;
-          lo := SHIFT(s[i], ShiftCount MOD BitsPerBitset) ;
-          hi := SHIFT(s[i], -(BitsPerBitset - (ShiftCount MOD BitsPerBitset))) ;
-          d[i] := BITSET{} ;
-          j := i + ShiftCount DIV BitsPerBitset ;
-          IF j<h
-          THEN
-             d[j] := d[j] + lo ;
-             INC(j) ;
-             IF j<h
-             THEN
-                d[j] := d[j] + hi
-             END
-          END
-       END
-    END
- END ShiftLeft ;
- 
- 
- (*
-    ShiftRight - performs the shift left for a multi word set.
-                 This procedure might be called by the back end of
-                 GNU Modula-2 depending whether amount is known at compile
-                 time.
- *)
- 
- PROCEDURE ShiftRight (VAR s, d: ARRAY OF BITSET;
-                       SetSizeInBits: CARDINAL;
-                       ShiftCount: CARDINAL) ;
- VAR
-    lo, hi : BITSET ;
-    j, i, h: INTEGER ;
-    a      : ADDRESS ;
- BEGIN
-    h := HIGH (s) + 1 ;
-    IF ShiftCount MOD BitsPerBitset = 0
-    THEN
-       i := ShiftCount DIV BitsPerBitset ;
-       a := ADR (s[i]) ;
-       j := h-i ;
-       a := memcpy (ADR (d), a, j * VAL (INTEGER, SIZE (BITSET))) ;
-       a := ADR (d[j]) ;
-       a := memset (a, 0, i * VAL (INTEGER, SIZE (BITSET)))
-    ELSE
-       i := 0 ;
-       WHILE i<h DO
-          lo := SHIFT(s[i], BitsPerBitset - (ShiftCount MOD BitsPerBitset)) ;
-          hi := SHIFT(s[i], -(ShiftCount MOD BitsPerBitset)) ;
-          d[i] := BITSET{} ;
-          j := i - VAL (INTEGER, ShiftCount DIV BitsPerBitset) ;
-          IF j>=0
-          THEN
-             d[j] := d[j] + hi ;
-             DEC(j) ;
-             IF j>=0
-             THEN
-                d[j] := d[j] + lo
-             END
-          END ;
-          INC(i)
-       END
-    END
- END ShiftRight ;
- 
- 
- (*
-    RotateVal - is a runtime procedure whose job is to implement
-                the ROTATE procedure of ISO SYSTEM. GNU Modula-2 will
-                inline a ROTATE of a single WORD (or less)
-                sized set and will only call this routine for larger sets.
- *)
- 
- PROCEDURE RotateVal (VAR s, d: ARRAY OF BITSET;
-                      SetSizeInBits: CARDINAL;
-                      RotateCount: INTEGER) ;
- VAR
-    a: ADDRESS ;
- BEGIN
-    IF RotateCount>0
-    THEN
-       RotateCount := RotateCount MOD VAL(INTEGER, SetSizeInBits)
-    ELSIF RotateCount<0
-    THEN
-       RotateCount := -VAL(INTEGER, VAL(CARDINAL, -RotateCount) MOD SetSizeInBits)
-    END ;
-    IF RotateCount>0
-    THEN
-       RotateLeft(s, d, SetSizeInBits, RotateCount)
-    ELSIF RotateCount<0
-    THEN
-       RotateRight(s, d, SetSizeInBits, -RotateCount)
-    ELSE
-       (* no rotate required, but we must copy source to dest.  *)
-       a := memcpy(ADR(d), ADR(s), (HIGH(d)+1)*SIZE(BITSET))
-    END
- END RotateVal ;
- 
- 
- (*
-    RotateLeft - performs the rotate left for a multi word set.
-                 This procedure might be called by the back end of
-                 GNU Modula-2 depending whether amount is known at compile
-                 time.
- *)
- 
- PROCEDURE RotateLeft (VAR s, d: ARRAY OF BITSET;
-                       SetSizeInBits: CARDINAL;
-                       RotateCount: CARDINAL) ;
- VAR
-    lo, hi : BITSET ;
-    b, i, j, h: CARDINAL ;
- BEGIN
-    h := HIGH(s) ;
-    (* firstly we set d := {} *)
-    i := 0 ;
-    WHILE i<=h DO
-       d[i] := BITSET{} ;
-       INC(i)
-    END ;
-    i := h+1 ;
-    RotateCount := RotateCount MOD SetSizeInBits ;
-    b := SetSizeInBits MOD BitsPerBitset ;
-    IF b=0
-    THEN
-       b := BitsPerBitset
-    END ;
-    WHILE i>0 DO
-       DEC(i) ;
-       lo := SHIFT(s[i], RotateCount MOD BitsPerBitset) ;
-       hi := SHIFT(s[i], -(b - (RotateCount MOD BitsPerBitset))) ;
-       j := ((i*BitsPerBitset + RotateCount) MOD
-             SetSizeInBits) DIV BitsPerBitset ;
-       d[j] := d[j] + lo ;
-       j := (((i+1)*BitsPerBitset + RotateCount) MOD
-             SetSizeInBits) DIV BitsPerBitset ;
-       d[j] := d[j] + hi ;
-       b := BitsPerBitset
-    END
- END RotateLeft ;
- 
- 
- (*
-    RotateRight - performs the rotate right for a multi word set.
-                  This procedure might be called by the back end of
-                  GNU Modula-2 depending whether amount is known at compile
-                  time.
- *)
- 
- PROCEDURE RotateRight (VAR s, d: ARRAY OF BITSET;
-                        SetSizeInBits: CARDINAL;
-                        RotateCount: CARDINAL) ;
- BEGIN
-    RotateLeft(s, d, SetSizeInBits, SetSizeInBits-RotateCount)
- END RotateRight ;
- 
- 
  END SYSTEM.
--- 26,29 ----
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-libs/SysStorage.def gcc-16-20250921/gcc/m2/gm2-libs/SysStorage.def
*** gcc-16-20250914/gcc/m2/gm2-libs/SysStorage.def	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-libs/SysStorage.def	Sun Sep 21 22:32:38 2025
*************** DEFINITION MODULE SysStorage ;
*** 28,34 ****
  
  (*  Provides dynamic allocation for the system components.
      This allows the application to use the traditional Storage module
!     which can be handled differently.  *)
  
  FROM SYSTEM IMPORT ADDRESS ;
  EXPORT QUALIFIED ALLOCATE, DEALLOCATE, REALLOCATE, Available, Init ;
--- 28,36 ----
  
  (*  Provides dynamic allocation for the system components.
      This allows the application to use the traditional Storage module
!     which can be handled differently.
!     ALLOCATE and DEALLOCATE will call M2Diagnostic to adjust the
!     global tracking of the application heap.  *)
  
  FROM SYSTEM IMPORT ADDRESS ;
  EXPORT QUALIFIED ALLOCATE, DEALLOCATE, REALLOCATE, Available, Init ;
*************** PROCEDURE DEALLOCATE (VAR a: ADDRESS ; s
*** 56,61 ****
--- 58,68 ----
                  is called, or alternatively it should have already
                  been initialized by ALLOCATE. The allocated storage
                  is resized accordingly.
+                 Note that this procedure does not adjust the
+                 M2Diagnostic.TotalHeap it is expected that the caller
+                 must track the reallocation differences and call
+                 M2Diagnostic.TotalHeapIncr or M2Diagnostic.TotalHeapDecr
+                 as appropriate.
  *)
  
  PROCEDURE REALLOCATE (VAR a: ADDRESS; size: CARDINAL) ;
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-libs/SysStorage.mod gcc-16-20250921/gcc/m2/gm2-libs/SysStorage.mod
*** gcc-16-20250914/gcc/m2/gm2-libs/SysStorage.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-libs/SysStorage.mod	Sun Sep 21 22:32:38 2025
*************** FROM libc IMPORT malloc, free, realloc,
*** 30,35 ****
--- 30,37 ----
  FROM Debug IMPORT Halt ;
  FROM SYSTEM IMPORT ADR ;
  
+ IMPORT M2Diagnostic ;
+ 
  
  CONST
     enableDeallocation =  TRUE ;
*************** BEGIN
*** 55,61 ****
        printf ("<DEBUG-CALL> %d SysStorage.ALLOCATE (0x%x, %d bytes)\n", callno, a, size) ;
        printf ("<MEM-ALLOC> %ld %d\n", a, size);
        INC (callno)
!    END
  END ALLOCATE ;
  
  
--- 57,64 ----
        printf ("<DEBUG-CALL> %d SysStorage.ALLOCATE (0x%x, %d bytes)\n", callno, a, size) ;
        printf ("<MEM-ALLOC> %ld %d\n", a, size);
        INC (callno)
!    END ;
!    M2Diagnostic.TotalHeapIncr (size)
  END ALLOCATE ;
  
  
*************** BEGIN
*** 87,92 ****
--- 90,96 ----
        END ;
        free (a)
     END ;
+    M2Diagnostic.TotalHeapDecr (size) ;
     a := NIL
  END DEALLOCATE ;
  
*************** END DEALLOCATE ;
*** 97,102 ****
--- 101,111 ----
                  is called, or alternatively it should have already
                  been initialized by ALLOCATE. The allocated storage
                  is resized accordingly.
+                 Note that this procedure does not adjust the
+                 M2Diagnostic.TotalHeap it is expected that the caller
+                 must track the reallocation differences and call
+                 M2Diagnostic.TotalHeapIncr or M2Diagnostic.TotalHeapDecr
+                 as appropriate.
  *)
  
  PROCEDURE REALLOCATE (VAR a: ADDRESS; size: CARDINAL) ;
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-libs-coroutines/SYSTEM.def gcc-16-20250921/gcc/m2/gm2-libs-coroutines/SYSTEM.def
*** gcc-16-20250914/gcc/m2/gm2-libs-coroutines/SYSTEM.def	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-libs-coroutines/SYSTEM.def	Sun Sep 21 22:32:38 2025
*************** EXPORT QUALIFIED (* the following are bu
*** 41,50 ****
                   (* The rest are implemented in SYSTEM.mod.  *)
                   PROCESS, TRANSFER, NEWPROCESS, IOTRANSFER,
                   LISTEN,
!                  ListenLoop, TurnInterrupts,
!                  (* Internal GM2 compiler functions.  *)
!                  ShiftVal, ShiftLeft, ShiftRight,
!                  RotateVal, RotateLeft, RotateRight ;
  
  
  TYPE
--- 41,47 ----
                   (* The rest are implemented in SYSTEM.mod.  *)
                   PROCESS, TRANSFER, NEWPROCESS, IOTRANSFER,
                   LISTEN,
!                  ListenLoop, TurnInterrupts ;
  
  
  TYPE
*************** PROCEDURE TBITSIZE (<type>) : CARDINAL ;
*** 192,278 ****
    *)
  *)
  
- (* The following procedures are invoked by GNU Modula-2 to
-    shift non word sized set types.  They are not strictly part
-    of the core PIM Modula-2, however they are used
-    to implement the SHIFT procedure defined above,
-    which are in turn used by the Logitech compatible libraries.
- 
-    Users will access these procedures by using the procedure
-    SHIFT above and GNU Modula-2 will map SHIFT onto one of
-    the following procedures.
- *)
- 
- (*
-    ShiftVal - is a runtime procedure whose job is to implement
-               the SHIFT procedure of ISO SYSTEM. GNU Modula-2 will
-               inline a SHIFT of a single WORD sized set and will
-               only call this routine for larger sets.
- *)
- 
- PROCEDURE ShiftVal (VAR s, d: ARRAY OF BITSET;
-                     SetSizeInBits: CARDINAL;
-                     ShiftCount: INTEGER) ;
- 
- 
- (*
-    ShiftLeft - performs the shift left for a multi word set.
-                This procedure might be called by the back end of
-                GNU Modula-2 depending whether amount is known at
-                compile time.
- *)
- 
- PROCEDURE ShiftLeft (VAR s, d: ARRAY OF BITSET;
-                      SetSizeInBits: CARDINAL;
-                      ShiftCount: CARDINAL) ;
- 
- (*
-    ShiftRight - performs the shift left for a multi word set.
-                 This procedure might be called by the back end of
-                 GNU Modula-2 depending whether amount is known at
-                 compile time.
- *)
- 
- PROCEDURE ShiftRight (VAR s, d: ARRAY OF BITSET;
-                      SetSizeInBits: CARDINAL;
-                      ShiftCount: CARDINAL) ;
- 
- 
- (*
-    RotateVal - is a runtime procedure whose job is to implement
-                the ROTATE procedure of ISO SYSTEM.  GNU Modula-2 will
-                inline a ROTATE of a single WORD (or less)
-                sized set and will only call this routine for
-                larger sets.
- *)
- 
- PROCEDURE RotateVal (VAR s, d: ARRAY OF BITSET;
-                      SetSizeInBits: CARDINAL;
-                      RotateCount: INTEGER) ;
- 
- 
- (*
-    RotateLeft - performs the rotate left for a multi word set.
-                 This procedure might be called by the back end of
-                 GNU Modula-2 depending whether amount is known
-                 at compile time.
- *)
- 
- PROCEDURE RotateLeft (VAR s, d: ARRAY OF BITSET;
-                       SetSizeInBits: CARDINAL;
-                       RotateCount: CARDINAL) ;
- 
- 
- (*
-    RotateRight - performs the rotate right for a multi word set.
-                  This procedure might be called by the back end of
-                  GNU Modula-2 depending whether amount is known at
-                  compile time.
- *)
- 
- PROCEDURE RotateRight (VAR s, d: ARRAY OF BITSET;
-                        SetSizeInBits: CARDINAL;
-                        RotateCount: CARDINAL) ;
- 
- 
  END SYSTEM.
--- 189,192 ----
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-libs-coroutines/SYSTEM.mod gcc-16-20250921/gcc/m2/gm2-libs-coroutines/SYSTEM.mod
*** gcc-16-20250914/gcc/m2/gm2-libs-coroutines/SYSTEM.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-libs-coroutines/SYSTEM.mod	Sun Sep 21 22:32:38 2025
*************** see the files COPYING3 and COPYING.RUNTI
*** 27,35 ****
  IMPLEMENTATION MODULE SYSTEM ;
  
  FROM RTco IMPORT init, initThread, transfer, currentThread, turnInterrupts ;
! 
! FROM RTint IMPORT Listen, AttachVector,
!                   IncludeVector, ExcludeVector ;
  
  IMPORT RTint ;
  
--- 27,33 ----
  IMPLEMENTATION MODULE SYSTEM ;
  
  FROM RTco IMPORT init, initThread, transfer, currentThread, turnInterrupts ;
! FROM RTint IMPORT Listen, AttachVector, IncludeVector, ExcludeVector ;
  
  IMPORT RTint ;
  
*************** VAR
*** 60,67 ****
  *)
  
  PROCEDURE TRANSFER (VAR p1: PROCESS; p2: PROCESS) ;
- VAR
-    r: INTEGER ;
  BEGIN
     localMain (p1) ;
     IF p1.context=p2.context
--- 58,63 ----
*************** END NEWPROCESS ;
*** 104,117 ****
  
  PROCEDURE IOTRANSFER (VAR First, Second: PROCESS; InterruptNo: CARDINAL) ;
  VAR
!    p: IOTransferState ;
!    l: POINTER TO IOTransferState ;
  BEGIN
     localMain (First) ;
!    WITH p DO
        ptrToFirst  := ADR (First) ;
        ptrToSecond := ADR (Second) ;
!       next        := AttachVector (InterruptNo, ADR (p))
     END ;
     IncludeVector (InterruptNo) ;
     TRANSFER (First, Second)
--- 100,112 ----
  
  PROCEDURE IOTRANSFER (VAR First, Second: PROCESS; InterruptNo: CARDINAL) ;
  VAR
!    iots: IOTransferState ;
  BEGIN
     localMain (First) ;
!    WITH iots DO
        ptrToFirst  := ADR (First) ;
        ptrToSecond := ADR (Second) ;
!       next        := AttachVector (InterruptNo, ADR (iots))
     END ;
     IncludeVector (InterruptNo) ;
     TRANSFER (First, Second)
*************** END IOTRANSFER ;
*** 124,141 ****
  
  PROCEDURE IOTransferHandler (InterruptNo: CARDINAL;
                               Priority: CARDINAL ;
!                              l: PtrToIOTransferState) ;
  VAR
     old: PtrToIOTransferState ;
  BEGIN
!    IF l=NIL
     THEN
        Halt ('no processes attached to this interrupt vector which is associated with IOTRANSFER',
              __FILE__, __FUNCTION__, __LINE__)
     ELSE
!       WITH l^ DO
           old := AttachVector (InterruptNo, next) ;
!          IF old#l
           THEN
              Halt ('inconsistancy of return result',
                    __FILE__, __FUNCTION__, __LINE__)
--- 119,136 ----
  
  PROCEDURE IOTransferHandler (InterruptNo: CARDINAL;
                               Priority: CARDINAL ;
!                              piots: PtrToIOTransferState) ;
  VAR
     old: PtrToIOTransferState ;
  BEGIN
!    IF piots = NIL
     THEN
        Halt ('no processes attached to this interrupt vector which is associated with IOTRANSFER',
              __FILE__, __FUNCTION__, __LINE__)
     ELSE
!       WITH piots^ DO
           old := AttachVector (InterruptNo, next) ;
!          IF old # piots
           THEN
              Halt ('inconsistancy of return result',
                    __FILE__, __FUNCTION__, __LINE__)
*************** BEGIN
*** 250,485 ****
  END localMain ;
  
  
- (*
-    Max - returns the maximum of a and b.
- *)
- 
- PROCEDURE Max (a, b: CARDINAL) : CARDINAL ;
- BEGIN
-    IF a > b
-    THEN
-       RETURN a
-    ELSE
-       RETURN b
-    END
- END Max ;
- 
- 
- (*
-    Min - returns the minimum of a and b.
- *)
- 
- PROCEDURE Min (a, b: CARDINAL) : CARDINAL ;
- BEGIN
-    IF a < b
-    THEN
-       RETURN a
-    ELSE
-       RETURN b
-    END
- END Min ;
- 
- 
- (*
-    ShiftVal - is a runtime procedure whose job is to implement
-               the SHIFT procedure of ISO SYSTEM. GNU Modula-2 will
-               inline a SHIFT of a single WORD sized set and will only
-               call this routine for larger sets.
- *)
- 
- PROCEDURE ShiftVal (VAR s, d: ARRAY OF BITSET;
-                     SetSizeInBits: CARDINAL;
-                     ShiftCount: INTEGER) ;
- VAR
-    a: ADDRESS ;
- BEGIN
-    IF ShiftCount>0
-    THEN
-       ShiftCount := ShiftCount MOD VAL(INTEGER, SetSizeInBits) ;
-       ShiftLeft (s, d, SetSizeInBits, ShiftCount)
-    ELSIF ShiftCount<0
-    THEN
-       ShiftCount := (-ShiftCount) MOD VAL(INTEGER, SetSizeInBits) ;
-       ShiftRight (s, d, SetSizeInBits, ShiftCount)
-    ELSE
-       a := memcpy (ADR (d), ADR (s), (HIGH (d) + 1) * SIZE (BITSET))
-    END
- END ShiftVal ;
- 
- 
- (*
-    ShiftLeft - performs the shift left for a multi word set.
-                This procedure might be called by the back end of
-                GNU Modula-2 depending whether amount is known at compile
-                time.
- *)
- 
- PROCEDURE ShiftLeft (VAR s, d: ARRAY OF BITSET;
-                      SetSizeInBits: CARDINAL;
-                      ShiftCount: CARDINAL) ;
- VAR
-    lo, hi : BITSET ;
-    i, j, h: CARDINAL ;
-    a      : ADDRESS ;
- BEGIN
-    h := HIGH(s)+1 ;
-    IF ShiftCount MOD BitsPerBitset=0
-    THEN
-       i := ShiftCount DIV BitsPerBitset ;
-       a := ADR (d[i]) ;
-       a := memcpy (a, ADR (s), (h-i) * SIZE (BITSET)) ;
-       a := memset (ADR (d), 0, i * SIZE (BITSET))
-    ELSE
-       i := h ;
-       WHILE i>0 DO
-          DEC (i) ;
-          lo := SHIFT (s[i], ShiftCount MOD BitsPerBitset) ;
-          hi := SHIFT (s[i], -(BitsPerBitset - (ShiftCount MOD BitsPerBitset))) ;
-          d[i] := BITSET{} ;
-          j := i + ShiftCount DIV BitsPerBitset ;
-          IF j<h
-          THEN
-             d[j] := d[j] + lo ;
-             INC(j) ;
-             IF j<h
-             THEN
-                d[j] := d[j] + hi
-             END
-          END
-       END
-    END
- END ShiftLeft ;
- 
- 
- (*
-    ShiftRight - performs the shift left for a multi word set.
-                 This procedure might be called by the back end of
-                 GNU Modula-2 depending whether amount is known at compile
-                 time.
- *)
- 
- PROCEDURE ShiftRight (VAR s, d: ARRAY OF BITSET;
-                       SetSizeInBits: CARDINAL;
-                       ShiftCount: CARDINAL) ;
- VAR
-    lo, hi : BITSET ;
-    j, i, h: INTEGER ;
-    a      : ADDRESS ;
- BEGIN
-    h := HIGH (s) + 1 ;
-    IF ShiftCount MOD BitsPerBitset=0
-    THEN
-       i := ShiftCount DIV BitsPerBitset ;
-       a := ADR (s[i]) ;
-       j := h-i ;
-       a := memcpy (ADR (d), a, j * VAL (INTEGER, SIZE(BITSET))) ;
-       a := ADR (d[j]) ;
-       a := memset (a, 0, i * VAL (INTEGER, SIZE(BITSET)))
-    ELSE
-       i := 0 ;
-       WHILE i<h DO
-          lo := SHIFT(s[i], BitsPerBitset - (ShiftCount MOD BitsPerBitset)) ;
-          hi := SHIFT(s[i], -(ShiftCount MOD BitsPerBitset)) ;
-          d[i] := BITSET{} ;
-          j := i - VAL(INTEGER, ShiftCount DIV BitsPerBitset) ;
-          IF j>=0
-          THEN
-             d[j] := d[j] + hi ;
-             DEC(j) ;
-             IF j>=0
-             THEN
-                d[j] := d[j] + lo
-             END
-          END ;
-          INC(i)
-       END
-    END
- END ShiftRight ;
- 
- 
- (*
-    RotateVal - is a runtime procedure whose job is to implement
-                the ROTATE procedure of ISO SYSTEM. GNU Modula-2 will
-                inline a ROTATE of a single WORD (or less)
-                sized set and will only call this routine for larger sets.
- *)
- 
- PROCEDURE RotateVal (VAR s, d: ARRAY OF BITSET;
-                      SetSizeInBits: CARDINAL;
-                      RotateCount: INTEGER) ;
- VAR
-    a: ADDRESS ;
- BEGIN
-    IF RotateCount>0
-    THEN
-       RotateLeft(s, d, SetSizeInBits, RotateCount)
-    ELSIF RotateCount<0
-    THEN
-       RotateRight(s, d, SetSizeInBits, -RotateCount)
-    ELSE
-       a := memcpy(ADR(d), ADR(s), (HIGH(d)+1)*SIZE(BITSET))
-    END
- END RotateVal ;
- 
- 
- (*
-    RotateLeft - performs the rotate left for a multi word set.
-                 This procedure might be called by the back end of
-                 GNU Modula-2 depending whether amount is known at compile
-                 time.
- *)
- 
- PROCEDURE RotateLeft (VAR s, d: ARRAY OF BITSET;
-                       SetSizeInBits: CARDINAL;
-                       RotateCount: CARDINAL) ;
- VAR
-    lo, hi : BITSET ;
-    b, i, j, h: CARDINAL ;
- BEGIN
-    h := HIGH(s) ;
-    (* firstly we set d := {} *)
-    i := 0 ;
-    WHILE i<=h DO
-       d[i] := BITSET{} ;
-       INC(i)
-    END ;
-    i := h+1 ;
-    RotateCount := RotateCount MOD SetSizeInBits ;
-    b := SetSizeInBits MOD BitsPerBitset ;
-    IF b=0
-    THEN
-       b := BitsPerBitset
-    END ;
-    WHILE i>0 DO
-       DEC(i) ;
-       lo := SHIFT(s[i], RotateCount MOD BitsPerBitset) ;
-       hi := SHIFT(s[i], -(b - (RotateCount MOD BitsPerBitset))) ;
-       j := ((i*BitsPerBitset + RotateCount) MOD
-             SetSizeInBits) DIV BitsPerBitset ;
-       d[j] := d[j] + lo ;
-       j := (((i+1)*BitsPerBitset + RotateCount) MOD
-             SetSizeInBits) DIV BitsPerBitset ;
-       d[j] := d[j] + hi ;
-       b := BitsPerBitset
-    END
- END RotateLeft ;
- 
- 
- (*
-    RotateRight - performs the rotate right for a multi word set.
-                  This procedure might be called by the back end of
-                  GNU Modula-2 depending whether amount is known at compile
-                  time.
- *)
- 
- PROCEDURE RotateRight (VAR s, d: ARRAY OF BITSET;
-                        SetSizeInBits: CARDINAL;
-                        RotateCount: CARDINAL) ;
- BEGIN
-    RotateLeft(s, d, SetSizeInBits, SetSizeInBits-RotateCount)
- END RotateRight ;
- 
- 
  BEGIN
     initGTh := FALSE ;
     initMain := FALSE
--- 245,250 ----
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-libs-iso/SYSTEM.def gcc-16-20250921/gcc/m2/gm2-libs-iso/SYSTEM.def
*** gcc-16-20250914/gcc/m2/gm2-libs-iso/SYSTEM.def	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-libs-iso/SYSTEM.def	Sun Sep 21 22:32:38 2025
*************** EXPORT QUALIFIED BITSPERLOC, LOCSPERWORD
*** 20,29 ****
                   LOC, BYTE, WORD, ADDRESS, CSIZE_T, CSSIZE_T, COFF_T, (* @SYSTEM_DATATYPES@  *)
                   ADDADR, SUBADR, DIFADR, MAKEADR, ADR, ROTATE,
                   SHIFT, CAST, TSIZE,
- 
                   (* Internal GM2 compiler functions *)
-                  ShiftVal, ShiftLeft, ShiftRight,
-                  RotateVal, RotateLeft, RotateRight,
                   THROW, TBITSIZE ;
  
  CONST
--- 20,26 ----
*************** PROCEDURE TBITSIZE (<type>) : CARDINAL ;
*** 155,235 ****
    *)
  *)
  
- 
- (* The following procedures are invoked by GNU Modula-2 to
-    shift non word set types. They are not part of ISO Modula-2
-    but are used to implement the SHIFT procedure defined above. *)
- 
- (*
-    ShiftVal - is a runtime procedure whose job is to implement
-               the SHIFT procedure of ISO SYSTEM. GNU Modula-2 will
-               inline a SHIFT of a single WORD sized set and will only
-               call this routine for larger sets.
- *)
- 
- PROCEDURE ShiftVal (VAR s, d: ARRAY OF BITSET;
-                     SetSizeInBits: CARDINAL;
-                     ShiftCount: INTEGER) ;
- 
- 
- (*
-    ShiftLeft - performs the shift left for a multi word set.
-                This procedure might be called by the back end of
-                GNU Modula-2 depending whether amount is known at
-                compile time.
- *)
- 
- PROCEDURE ShiftLeft (VAR s, d: ARRAY OF BITSET;
-                      SetSizeInBits: CARDINAL;
-                      ShiftCount: CARDINAL) ;
- 
- (*
-    ShiftRight - performs the shift left for a multi word set.
-                 This procedure might be called by the back end of
-                 GNU Modula-2 depending whether amount is known at
-                 compile time.
- *)
- 
- PROCEDURE ShiftRight (VAR s, d: ARRAY OF BITSET;
-                      SetSizeInBits: CARDINAL;
-                      ShiftCount: CARDINAL) ;
- 
- 
- (*
-    RotateVal - is a runtime procedure whose job is to implement
-                the ROTATE procedure of ISO SYSTEM. GNU Modula-2 will
-                inline a ROTATE of a single WORD (or less)
-                sized set and will only call this routine for larger
-                sets.
- *)
- 
- PROCEDURE RotateVal (VAR s, d: ARRAY OF BITSET;
-                      SetSizeInBits: CARDINAL;
-                      RotateCount: INTEGER) ;
- 
- 
- (*
-    RotateLeft - performs the rotate left for a multi word set.
-                 This procedure might be called by the back end of
-                 GNU Modula-2 depending whether amount is known at
-                 compile time.
- *)
- 
- PROCEDURE RotateLeft (VAR s, d: ARRAY OF BITSET;
-                       SetSizeInBits: CARDINAL;
-                       RotateCount: CARDINAL) ;
- 
- 
- (*
-    RotateRight - performs the rotate right for a multi word set.
-                  This procedure might be called by the back end of
-                  GNU Modula-2 depending whether amount is known at
-                  compile time.
- *)
- 
- PROCEDURE RotateRight (VAR s, d: ARRAY OF BITSET;
-                        SetSizeInBits: CARDINAL;
-                        RotateCount: CARDINAL) ;
- 
- 
  END SYSTEM.
--- 152,155 ----
diff -Nrcpad gcc-16-20250914/gcc/m2/gm2-libs-iso/SYSTEM.mod gcc-16-20250921/gcc/m2/gm2-libs-iso/SYSTEM.mod
*** gcc-16-20250914/gcc/m2/gm2-libs-iso/SYSTEM.mod	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/gm2-libs-iso/SYSTEM.mod	Sun Sep 21 22:32:38 2025
*************** see the files COPYING3 and COPYING.RUNTI
*** 26,273 ****
  
  IMPLEMENTATION MODULE SYSTEM ;
  
- FROM libc IMPORT memcpy, memset ;
- 
- CONST
-    BitsPerBitset = MAX(BITSET)+1 ;
- 
- 
- (*
-    Max - returns the maximum of a and b.
- *)
- 
- PROCEDURE Max (a, b: CARDINAL) : CARDINAL ;
- BEGIN
-    IF a>b
-    THEN
-       RETURN a
-    ELSE
-       RETURN b
-    END
- END Max ;
- 
- 
- (*
-    Min - returns the minimum of a and b.
- *)
- 
- PROCEDURE Min (a, b: CARDINAL) : CARDINAL ;
- BEGIN
-    IF a<b
-    THEN
-       RETURN a
-    ELSE
-       RETURN b
-    END
- END Min ;
- 
- 
- (*
-    ShiftVal - is a runtime procedure whose job is to implement
-               the SHIFT procedure of ISO SYSTEM. GNU Modula-2 will
-               inline a SHIFT of a single WORD sized set and will only
-               call this routine for larger sets.
- *)
- 
- PROCEDURE ShiftVal (VAR s, d: ARRAY OF BITSET;
-                     SetSizeInBits: CARDINAL;
-                     ShiftCount: INTEGER) ;
- VAR
-    a: ADDRESS ;
- BEGIN
-    IF ShiftCount>0
-    THEN
-       ShiftCount := ShiftCount MOD VAL(INTEGER, SetSizeInBits) ;
-       ShiftLeft(s, d, SetSizeInBits, ShiftCount)
-    ELSIF ShiftCount<0
-    THEN
-       ShiftCount := (-ShiftCount) MOD VAL(INTEGER, SetSizeInBits) ;
-       ShiftRight(s, d, SetSizeInBits, ShiftCount)
-    ELSE
-       a := memcpy(ADR(d), ADR(s), (HIGH(d)+1)*SIZE(BITSET))
-    END
- END ShiftVal ;
- 
- 
- (*
-    ShiftLeft - performs the shift left for a multi word set.
-                This procedure might be called by the back end of
-                GNU Modula-2 depending whether amount is known at compile
-                time.
- *)
- 
- PROCEDURE ShiftLeft (VAR s, d: ARRAY OF BITSET;
-                      SetSizeInBits: CARDINAL;
-                      ShiftCount: CARDINAL) ;
- VAR
-    lo, hi : BITSET ;
-    i, j, h: CARDINAL ;
-    a      : ADDRESS ;
- BEGIN
-    h := HIGH(s)+1 ;
-    IF ShiftCount MOD BitsPerBitset=0
-    THEN
-       i := ShiftCount DIV BitsPerBitset ;
-       a := ADR(d[i]) ;
-       a := memcpy(a, ADR(s), (h-i)*SIZE(BITSET)) ;
-       a := memset(ADR(d), 0, i*SIZE(BITSET))
-    ELSE
-       i := h ;
-       WHILE i>0 DO
-          DEC(i) ;
-          lo := SHIFT(s[i], ShiftCount MOD BitsPerBitset) ;
-          hi := SHIFT(s[i], -(BitsPerBitset - (ShiftCount MOD BitsPerBitset))) ;
-          d[i] := BITSET{} ;
-          j := i + ShiftCount DIV BitsPerBitset ;
-          IF j<h
-          THEN
-             d[j] := d[j] + lo ;
-             INC(j) ;
-             IF j<h
-             THEN
-                d[j] := d[j] + hi
-             END
-          END
-       END
-    END
- END ShiftLeft ;
- 
- 
- (*
-    ShiftRight - performs the shift left for a multi word set.
-                 This procedure might be called by the back end of
-                 GNU Modula-2 depending whether amount is known at compile
-                 time.
- *)
- 
- PROCEDURE ShiftRight (VAR s, d: ARRAY OF BITSET;
-                       SetSizeInBits: CARDINAL;
-                       ShiftCount: CARDINAL) ;
- VAR
-    lo, hi : BITSET ;
-    j, i, h: INTEGER ;
-    a      : ADDRESS ;
- BEGIN
-    h := HIGH(s)+1 ;
-    IF ShiftCount MOD BitsPerBitset=0
-    THEN
-       i := ShiftCount DIV BitsPerBitset ;
-       a := ADR(s[i]) ;
-       j := h-i ;
-       a := memcpy(ADR(d), a, j * VAL (INTEGER, SIZE (BITSET))) ;
-       a := ADR(d[j]) ;
-       a := memset(a, 0, i * VAL (INTEGER, SIZE (BITSET)))
-    ELSE
-       i := 0 ;
-       WHILE i<h DO
-          lo := SHIFT(s[i], BitsPerBitset - (ShiftCount MOD BitsPerBitset)) ;
-          hi := SHIFT(s[i], -(ShiftCount MOD BitsPerBitset)) ;
-          d[i] := BITSET{} ;
-          j := i - VAL(INTEGER, ShiftCount DIV BitsPerBitset) ;
-          IF j>=0
-          THEN
-             d[j] := d[j] + hi ;
-             DEC(j) ;
-             IF j>=0
-             THEN
-                d[j] := d[j] + lo
-             END
-          END ;
-          INC(i)
-       END
-    END
- END ShiftRight ;
- 
- 
- (*
-    RotateVal - is a runtime procedure whose job is to implement
-                the ROTATE procedure of ISO SYSTEM. GNU Modula-2 will
-                inline a ROTATE of a single WORD (or less)
-                sized set and will only call this routine for larger sets.
- *)
- 
- PROCEDURE RotateVal (VAR s, d: ARRAY OF BITSET;
-                      SetSizeInBits: CARDINAL;
-                      RotateCount: INTEGER) ;
- VAR
-    a: ADDRESS ;
- BEGIN
-    IF RotateCount>0
-    THEN
-       RotateCount := RotateCount MOD VAL(INTEGER, SetSizeInBits)
-    ELSIF RotateCount<0
-    THEN
-       RotateCount := -VAL(INTEGER, VAL(CARDINAL, -RotateCount) MOD SetSizeInBits)
-    END ;
-    IF RotateCount>0
-    THEN
-       RotateLeft(s, d, SetSizeInBits, RotateCount)
-    ELSIF RotateCount<0
-    THEN
-       RotateRight(s, d, SetSizeInBits, -RotateCount)
-    ELSE
-       (* no rotate required, but we must copy source to dest.  *)
-       a := memcpy(ADR(d), ADR(s), (HIGH(d)+1)*SIZE(BITSET))
-    END
- END RotateVal ;
- 
- 
- (*
-    RotateLeft - performs the rotate left for a multi word set.
-                 This procedure might be called by the back end of
-                 GNU Modula-2 depending whether amount is known at compile
-                 time.
- *)
- 
- PROCEDURE RotateLeft (VAR s, d: ARRAY OF BITSET;
-                       SetSizeInBits: CARDINAL;
-                       RotateCount: CARDINAL) ;
- VAR
-    lo, hi : BITSET ;
-    b, i, j, h: CARDINAL ;
- BEGIN
-    h := HIGH(s) ;
-    (* firstly we set d := {} *)
-    i := 0 ;
-    WHILE i<=h DO
-       d[i] := BITSET{} ;
-       INC(i)
-    END ;
-    i := h+1 ;
-    RotateCount := RotateCount MOD SetSizeInBits ;
-    b := SetSizeInBits MOD BitsPerBitset ;
-    IF b=0
-    THEN
-       b := BitsPerBitset
-    END ;
-    WHILE i>0 DO
-       DEC(i) ;
-       lo := SHIFT(s[i], RotateCount MOD BitsPerBitset) ;
-       hi := SHIFT(s[i], -(b - (RotateCount MOD BitsPerBitset))) ;
-       j := ((i*BitsPerBitset + RotateCount) MOD
-             SetSizeInBits) DIV BitsPerBitset ;
-       d[j] := d[j] + lo ;
-       j := (((i+1)*BitsPerBitset + RotateCount) MOD
-             SetSizeInBits) DIV BitsPerBitset ;
-       d[j] := d[j] + hi ;
-       b := BitsPerBitset
-    END
- END RotateLeft ;
- 
- 
- (*
-    RotateRight - performs the rotate right for a multi word set.
-                  This procedure might be called by the back end of
-                  GNU Modula-2 depending whether amount is known at compile
-                  time.
- *)
- 
- PROCEDURE RotateRight (VAR s, d: ARRAY OF BITSET;
-                        SetSizeInBits: CARDINAL;
-                        RotateCount: CARDINAL) ;
- BEGIN
-    RotateLeft(s, d, SetSizeInBits, SetSizeInBits-RotateCount)
- END RotateRight ;
- 
- 
  END SYSTEM.
--- 26,29 ----
diff -Nrcpad gcc-16-20250914/gcc/m2/init/ppginit gcc-16-20250921/gcc/m2/init/ppginit
*** gcc-16-20250914/gcc/m2/init/ppginit	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/init/ppginit	Sun Sep 21 22:32:38 2025
*************** RTExceptions
*** 25,30 ****
--- 25,31 ----
  M2EXCEPTION
  M2RTS
  SysExceptions
+ M2Diagnostic
  StrLib
  errno
  termios
*************** UnixArgs
*** 45,50 ****
--- 46,52 ----
  FIO
  SFIO
  StrCase
+ StringConvert
  bnflex
  Lists
  Args
diff -Nrcpad gcc-16-20250914/gcc/m2/lang.opt gcc-16-20250921/gcc/m2/lang.opt
*** gcc-16-20250914/gcc/m2/lang.opt	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/lang.opt	Sun Sep 21 22:32:38 2025
*************** fm2-whole-program
*** 206,211 ****
--- 206,215 ----
  Modula-2
  compile all implementation modules and program module at once
  
+ fmem-report
+ Modula-2
+ ; Documented in c.opt
+ 
  fmod=
  Modula-2 Joined
  recognize the specified suffix as implementation and module filenames
*************** fswig
*** 290,295 ****
--- 294,303 ----
  Modula-2
  create a swig interface file for the module
  
+ ftime-report
+ Modula-2
+ ; Documented in c.opt
+ 
  funbounded-by-reference
  Modula-2
  optimize non var unbounded parameters by passing it by reference, providing it is not written to within the callee procedure.
*************** fversion
*** 302,307 ****
--- 310,319 ----
  Modula-2
  ; Documented in common.opt
  
+ fwideset
+ Modula-2
+ link against the module M2WIDESET to perform the wideset operator, the negative version of this option will generate a warning if this module is required
+ 
  fwholediv
  Modula-2
  turns on all division and modulus by zero checking for ordinal values
diff -Nrcpad gcc-16-20250914/gcc/m2/lang.opt.urls gcc-16-20250921/gcc/m2/lang.opt.urls
*** gcc-16-20250914/gcc/m2/lang.opt.urls	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/lang.opt.urls	Sun Sep 21 22:32:38 2025
***************
*** 1,5 ****
--- 1,11 ----
  ; Autogenerated by regenerate-opt-urls.py from gcc/m2/lang.opt and generated HTML
  
+ fmem-report
+ UrlSuffix(gcc/Developer-Options.html#index-fmem-report)
+ 
+ ftime-report
+ UrlSuffix(gcc/Developer-Options.html#index-ftime-report)
+ 
  fversion
  LangUrlSuffix_D(gdc/Runtime-Options.html#index-fversion)
  
diff -Nrcpad gcc-16-20250914/gcc/m2/mc-boot/GM2Diagnostic.cc gcc-16-20250921/gcc/m2/mc-boot/GM2Diagnostic.cc
*** gcc-16-20250914/gcc/m2/mc-boot/GM2Diagnostic.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/m2/mc-boot/GM2Diagnostic.cc	Sun Sep 21 22:32:38 2025
***************
*** 0 ****
--- 1,1484 ----
+ /* do not edit automatically generated by mc from M2Diagnostic.  */
+ /* M2Diagnotic provides memory and time diagnosics to the user.
+ 
+ Copyright (C) 2024 Free Software Foundation, Inc.
+ Contributed by Gaius Mulley <gaiusmod2@gmail.com>.
+ 
+ This file is part of GNU Modula-2.
+ 
+ GNU Modula-2 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.
+ 
+ GNU Modula-2 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 GNU Modula-2; see the file COPYING3.  If not see
+ <http://www.gnu.org/licenses/>.  */
+ 
+ #include "config.h"
+ #include "system.h"
+ #include <stdbool.h>
+ #   if !defined (PROC_D)
+ #      define PROC_D
+        typedef void (*PROC_t) (void);
+        typedef struct { PROC_t proc; } PROC;
+ #   endif
+ 
+ #   if !defined (TRUE)
+ #      define TRUE (1==1)
+ #   endif
+ 
+ #   if !defined (FALSE)
+ #      define FALSE (1==0)
+ #   endif
+ 
+ #   include "GStorage.h"
+ #   include "Gmcrts.h"
+ #if defined(__cplusplus)
+ #   undef NULL
+ #   define NULL 0
+ #endif
+ #define _M2Diagnostic_H
+ #define _M2Diagnostic_C
+ 
+ #   include "GASCII.h"
+ #   include "GSelective.h"
+ #   include "GStringConvert.h"
+ #   include "GStorage.h"
+ #   include "GDynamicStrings.h"
+ #   include "GM2RTS.h"
+ 
+ typedef struct M2Diagnostic_DiagProc_p M2Diagnostic_DiagProc;
+ 
+ #   define EnableDiagnostics true
+ #   define DefaultTimeEnableValue false
+ #   define DefaultMemEnableValue false
+ #   define MaxParam 4
+ #   define MICROSEC 100000
+ typedef struct M2Diagnostic_timeDiag_r M2Diagnostic_timeDiag;
+ 
+ typedef struct M2Diagnostic_memDiag_r M2Diagnostic_memDiag;
+ 
+ typedef struct M2Diagnostic__T1_r M2Diagnostic__T1;
+ 
+ typedef struct M2Diagnostic__T2_a M2Diagnostic__T2;
+ 
+ typedef enum {M2Diagnostic_timediag, M2Diagnostic_memdiag} M2Diagnostic_DiagType;
+ 
+ #   define kilo 1024
+ #   define mega (kilo*kilo)
+ #   define giga (mega*kilo)
+ typedef M2Diagnostic__T1 *M2Diagnostic_Diagnostic;
+ 
+ typedef void (*M2Diagnostic_DiagProc_t) (M2Diagnostic_Diagnostic);
+ struct M2Diagnostic_DiagProc_p { M2Diagnostic_DiagProc_t proc; };
+ 
+ struct M2Diagnostic_timeDiag_r {
+                                  unsigned int count;
+                                  Selective_Timeval total;
+                                  Selective_Timeval enter;
+                                  Selective_Timeval exit_;
+                                };
+ 
+ struct M2Diagnostic__T2_a { long unsigned int array[MaxParam-1+1]; };
+ struct M2Diagnostic_memDiag_r {
+                                 M2Diagnostic__T2 param;
+                               };
+ 
+ struct M2Diagnostic__T1_r {
+                             DynamicStrings_String name;
+                             DynamicStrings_String format;
+                             bool enable;
+                             M2Diagnostic_Diagnostic next;
+                             M2Diagnostic_DiagType type;  /* case tag */
+                             union {
+                                     M2Diagnostic_timeDiag tdiag;
+                                     M2Diagnostic_memDiag mdiag;
+                                   };
+                           };
+ 
+ static DynamicStrings_String Output;
+ static long unsigned int TotalHeap;
+ static M2Diagnostic_Diagnostic Head;
+ static bool DefaultTimeEnable;
+ static bool DefaultMemEnable;
+ static Selective_Timeval StartTime;
+ static Selective_Timeval TotalTime;
+ 
+ /*
+    InitTimeDiagnostic - create and return a time diagnostic.
+                         The format string can be free form and may
+                         contain {1T}, {1C} or {1P}.
+                         {1T} will contain the time and
+                         {1C} the count of the number of times the
+                         code enters the time diagnostic code region.
+                         {1P} generates the time as a percentage.
+                         {0T} is the total time for the application.
+                         {{ is rendered as a single {.
+ */
+ 
+ extern "C" M2Diagnostic_Diagnostic M2Diagnostic_InitTimeDiagnostic (const char *name_, unsigned int _name_high, const char *format_, unsigned int _format_high);
+ 
+ /*
+    EnterDiagnostic - attribute all execution time from now to TimeDiag.
+ */
+ 
+ extern "C" void M2Diagnostic_EnterDiagnostic (M2Diagnostic_Diagnostic TimeDiag);
+ 
+ /*
+    ExitDiagnostic - stop attributing execution time to TimeDiag.
+ */
+ 
+ extern "C" void M2Diagnostic_ExitDiagnostic (M2Diagnostic_Diagnostic TimeDiag);
+ 
+ /*
+    InitMemDiagnostic - create and return a memory diagnostic.
+                        The format string can be free form and may
+                        contain {1M} {1d} {1x} {1P}.
+                        {1M} is replaced by the value of the first parameter
+                        with memory size units.
+                        {1d} unsigned decimal.  {1x} unsigned hexadecimal.
+                        {0M} is the global allocation (Storage.mod:ALLOCATE).
+                        {1P} is the percentage of param 1 relative
+                        to global memory.
+ */
+ 
+ extern "C" M2Diagnostic_Diagnostic M2Diagnostic_InitMemDiagnostic (const char *name_, unsigned int _name_high, const char *format_, unsigned int _format_high);
+ 
+ /*
+    MemIncr - allow the appropriate parameter to be incremented.
+              All parameters are initially set to zero and are stored
+              as LONGCARD.
+ */
+ 
+ extern "C" void M2Diagnostic_MemIncr (M2Diagnostic_Diagnostic MemDiag, unsigned int paramno, unsigned int incr);
+ 
+ /*
+    MemDecr - allow the appropriate parameter to be decremented.
+              All parameters are initially set to zero and are stored
+              as LONGCARD.
+ */
+ 
+ extern "C" void M2Diagnostic_MemDecr (M2Diagnostic_Diagnostic MemDiag, unsigned int paramno, unsigned int decr);
+ 
+ /*
+    MemSet - allow the appropriate parameter to be set to value.
+             All parameters are initially set to zero.
+ */
+ 
+ extern "C" void M2Diagnostic_MemSet (M2Diagnostic_Diagnostic MemDiag, unsigned int paramno, unsigned int value);
+ 
+ /*
+    TotalHeapIncr - increments the total heap used.
+ */
+ 
+ extern "C" void M2Diagnostic_TotalHeapIncr (unsigned int incr);
+ 
+ /*
+    TotalHeapDecr - decrements the total heap used.
+ */
+ 
+ extern "C" void M2Diagnostic_TotalHeapDecr (unsigned int incr);
+ 
+ /*
+    SetEnable - set the enable flag in Diag to value.
+ */
+ 
+ extern "C" void M2Diagnostic_SetEnable (M2Diagnostic_Diagnostic Diag, bool value);
+ 
+ /*
+    Lookup - returns the Diagnostic containing name or NIL
+             if it does not exist.
+ */
+ 
+ extern "C" M2Diagnostic_Diagnostic M2Diagnostic_Lookup (const char *name_, unsigned int _name_high);
+ 
+ /*
+    GetName - returns the name of Diag.
+ */
+ 
+ extern "C" DynamicStrings_String M2Diagnostic_GetName (M2Diagnostic_Diagnostic Diag);
+ 
+ /*
+    ForeachDiagDo - for diag in global diag list do
+                       dp (diag);
+                    end
+ */
+ 
+ extern "C" void M2Diagnostic_ForeachDiagDo (M2Diagnostic_DiagProc dp);
+ 
+ /*
+    SetDefaultConfig - force the Diag enable flag to the
+                       time or mem global default.
+ */
+ 
+ extern "C" void M2Diagnostic_SetDefaultConfig (M2Diagnostic_Diagnostic Diag);
+ 
+ /*
+    Configure - will turn on or off all the memory or time
+                instrumentation diagnostics and set the defaults
+                time and mem values.
+ */
+ 
+ extern "C" void M2Diagnostic_Configure (bool time_, bool mem);
+ 
+ /*
+    Generate - return a string containing the output from
+               all the diagnostics enabled.
+ */
+ 
+ extern "C" DynamicStrings_String M2Diagnostic_Generate (void);
+ 
+ /*
+    Assert - halt if b is false.
+ */
+ 
+ static void Assert (bool b);
+ 
+ /*
+    Error - generate a error simple message with indicating the
+            format specifier ch is incorrect.
+ */
+ 
+ static void Error (const char *msg_, unsigned int _msg_high, char ch);
+ 
+ /*
+    Accumulate - total := total + exit - enter
+ */
+ 
+ static void Accumulate (Selective_Timeval total, Selective_Timeval enter, Selective_Timeval exit_);
+ 
+ /*
+    IncTime - left := left + right.
+ */
+ 
+ static void IncTime (Selective_Timeval left, Selective_Timeval right);
+ 
+ /*
+    DecTime - left := left - right.
+ */
+ 
+ static void DecTime (Selective_Timeval left, Selective_Timeval right);
+ 
+ /*
+    CheckParam -
+ */
+ 
+ static void CheckParam (unsigned int paramno);
+ 
+ /*
+    CreateStartTime -
+ */
+ 
+ static void CreateStartTime (void);
+ 
+ /*
+    UpdateTotalTime -
+ */
+ 
+ static void UpdateTotalTime (void);
+ 
+ /*
+    GetTimeParam - a paramno of 0 will return the total time so far
+                   whereas a paramno > 0 will return the time associated
+                   with Diag.
+ */
+ 
+ static Selective_Timeval GetTimeParam (M2Diagnostic_Diagnostic Diag, unsigned int paramno);
+ 
+ /*
+    GetMemParam - return the mem paramno from within Diag.  A paramno of 0
+                  will return the total heap.
+ */
+ 
+ static long unsigned int GetMemParam (M2Diagnostic_Diagnostic Diag, unsigned int paramno);
+ 
+ /*
+    CreateDecimalMem - converts c to a decimal string.
+ */
+ 
+ static DynamicStrings_String CreateDecimalMem (long unsigned int c);
+ 
+ /*
+    CreateHexadecimalMem - converts c to a hexadecimal string.
+ */
+ 
+ static DynamicStrings_String CreateHexadecimalMem (long unsigned int c);
+ 
+ /*
+    CreateDecimalTime - return timeval as a decimal seconds.usecs string.
+ */
+ 
+ static DynamicStrings_String CreateDecimalTime (Selective_Timeval timeval);
+ 
+ /*
+    CreateHexadecimalTime - return timeval as a hexadecimal seconds.usecs string.
+ */
+ 
+ static DynamicStrings_String CreateHexadecimalTime (Selective_Timeval timeval);
+ 
+ /*
+    Decimal - convert paramno in Diag to a string.
+ */
+ 
+ static DynamicStrings_String Decimal (M2Diagnostic_Diagnostic Diag, unsigned int paramno);
+ 
+ /*
+    Hexadecimal - convert paramno in Diag to a hex string.
+ */
+ 
+ static DynamicStrings_String Hexadecimal (M2Diagnostic_Diagnostic Diag, unsigned int paramno);
+ 
+ /*
+    Count - return the count field for a time diag or return the decimal
+            value for a paramno in a mem diag.
+ */
+ 
+ static DynamicStrings_String Count (M2Diagnostic_Diagnostic Diag, unsigned int paramno);
+ 
+ /*
+    Microsec - convert timeval into microseconds and return the value as
+               a longcard.
+ */
+ 
+ static long unsigned int Microsec (Selective_Timeval timeval);
+ 
+ /*
+    CreateTimePercent - return timeval as a percentage of the TotalTime.
+ */
+ 
+ static DynamicStrings_String CreateTimePercent (Selective_Timeval timeval);
+ 
+ /*
+    CreateMemPercent - return memval as a percentage of TotalHeap.
+ */
+ 
+ static DynamicStrings_String CreateMemPercent (long unsigned int memval);
+ 
+ /*
+    DescribePercent - call the appropriate mem or time percentage procedure.
+ */
+ 
+ static DynamicStrings_String DescribePercent (M2Diagnostic_Diagnostic Diag, unsigned int paramno);
+ 
+ /*
+    DescribeMemory - return the memory diagnostic
+ */
+ 
+ static DynamicStrings_String DescribeMemory (M2Diagnostic_Diagnostic Diag, unsigned int paramno);
+ 
+ /*
+    DescribeTime - returns the time diagnostic in seconds.
+ */
+ 
+ static DynamicStrings_String DescribeTime (M2Diagnostic_Diagnostic Diag, unsigned int paramno);
+ 
+ /*
+    ParamSpec - ebnf:
+ 
+                ( '{' | '0' | '1' | '2' | '3' | '4' )
+                ( 'd' | 'x' | 'C' | 'T' | 'M' | 'N' | 'P' )
+                '}'
+ */
+ 
+ static unsigned int ParamSpec (M2Diagnostic_Diagnostic Diag, unsigned int i);
+ 
+ /*
+    FormatDiag - ebnf:
+ 
+                 { ( '{' ParamSpec ) | any }
+ */
+ 
+ static void FormatDiag (M2Diagnostic_Diagnostic Diag);
+ 
+ 
+ /*
+    Assert - halt if b is false.
+ */
+ 
+ static void Assert (bool b)
+ {
+   if (! b)
+     {
+       M2RTS_HALT (-1);
+       __builtin_unreachable ();
+     }
+ }
+ 
+ 
+ /*
+    Error - generate a error simple message with indicating the
+            format specifier ch is incorrect.
+ */
+ 
+ static void Error (const char *msg_, unsigned int _msg_high, char ch)
+ {
+   char msg[_msg_high+1];
+ 
+   /* make a local copy of each unbounded array.  */
+   memcpy (msg, msg_, _msg_high+1);
+ 
+   M2RTS_HALT (-1);
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    Accumulate - total := total + exit - enter
+ */
+ 
+ static void Accumulate (Selective_Timeval total, Selective_Timeval enter, Selective_Timeval exit_)
+ {
+   IncTime (total, exit_);
+   DecTime (total, enter);
+ }
+ 
+ 
+ /*
+    IncTime - left := left + right.
+ */
+ 
+ static void IncTime (Selective_Timeval left, Selective_Timeval right)
+ {
+   unsigned int lsec;
+   unsigned int lusec;
+   unsigned int rsec;
+   unsigned int rusec;
+ 
+   Selective_GetTime (left, &lsec, &lusec);
+   Selective_GetTime (right, &rsec, &rusec);
+   if ((lusec+rusec) < MICROSEC)
+     {
+       /* No carry  */
+       lusec += rusec;
+       lsec += rsec;
+     }
+   else
+     {
+       lusec += rusec;
+       lusec -= MICROSEC;
+       lsec += rsec+1;
+     }
+   Selective_SetTime (left, lsec, lusec);
+ }
+ 
+ 
+ /*
+    DecTime - left := left - right.
+ */
+ 
+ static void DecTime (Selective_Timeval left, Selective_Timeval right)
+ {
+   unsigned int lsec;
+   unsigned int lusec;
+   unsigned int rsec;
+   unsigned int rusec;
+ 
+   Selective_GetTime (left, &lsec, &lusec);
+   Selective_GetTime (right, &rsec, &rusec);
+   if (lusec >= rusec)
+     {
+       /* No borrow.  */
+       lusec -= rusec;
+       if (lsec >= rsec)
+         {
+           lsec -= rsec;
+         }
+       else
+         {
+           lsec = 0;
+         }
+     }
+   else
+     {
+       if (lsec > 0)
+         {
+           lusec += MICROSEC;
+           lusec -= rusec;
+           lsec -= 1;
+           if (lsec >= rsec)
+             {
+               lsec -= rsec;
+             }
+           else
+             {
+               lsec = 0;
+             }
+         }
+       else
+         {
+           lsec = 0;
+           lusec = 0;
+         }
+     }
+   Selective_SetTime (left, lsec, lusec);
+ }
+ 
+ 
+ /*
+    CheckParam -
+ */
+ 
+ static void CheckParam (unsigned int paramno)
+ {
+   if ((paramno < 1) || (paramno > MaxParam))
+     {
+       M2RTS_HALT (-1);
+       __builtin_unreachable ();
+     }
+ }
+ 
+ 
+ /*
+    CreateStartTime -
+ */
+ 
+ static void CreateStartTime (void)
+ {
+   if (EnableDiagnostics)
+     {
+       /* avoid dangling else.  */
+       if (StartTime == NULL)
+         {
+           StartTime = Selective_InitTime (0, 0);
+           if ((Selective_GetTimeOfDay (StartTime)) == 0)
+             {}  /* empty.  */
+         }
+       if (TotalTime == NULL)
+         {
+           TotalTime = Selective_InitTime (0, 0);
+         }
+     }
+   else
+     {
+       StartTime = NULL;
+       TotalTime = NULL;
+     }
+ }
+ 
+ 
+ /*
+    UpdateTotalTime -
+ */
+ 
+ static void UpdateTotalTime (void)
+ {
+   if ((Selective_GetTimeOfDay (TotalTime)) == 0)
+     {}  /* empty.  */
+   DecTime (TotalTime, StartTime);
+ }
+ 
+ 
+ /*
+    GetTimeParam - a paramno of 0 will return the total time so far
+                   whereas a paramno > 0 will return the time associated
+                   with Diag.
+ */
+ 
+ static Selective_Timeval GetTimeParam (M2Diagnostic_Diagnostic Diag, unsigned int paramno)
+ {
+   unsigned int sec;
+   unsigned int usec;
+ 
+   if (paramno == 0)
+     {
+       UpdateTotalTime ();
+       return TotalTime;
+     }
+   else
+     {
+       return Diag->tdiag.total;
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    GetMemParam - return the mem paramno from within Diag.  A paramno of 0
+                  will return the total heap.
+ */
+ 
+ static long unsigned int GetMemParam (M2Diagnostic_Diagnostic Diag, unsigned int paramno)
+ {
+   if (paramno == 0)
+     {
+       return TotalHeap;
+     }
+   else
+     {
+       return Diag->mdiag.param.array[paramno-1];
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    CreateDecimalMem - converts c to a decimal string.
+ */
+ 
+ static DynamicStrings_String CreateDecimalMem (long unsigned int c)
+ {
+   return StringConvert_LongCardinalToString (c, 0, ' ', 10, true);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    CreateHexadecimalMem - converts c to a hexadecimal string.
+ */
+ 
+ static DynamicStrings_String CreateHexadecimalMem (long unsigned int c)
+ {
+   return DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "0x", 2), DynamicStrings_Mark (StringConvert_LongCardinalToString (c, 0, ' ', 16, true)));
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    CreateDecimalTime - return timeval as a decimal seconds.usecs string.
+ */
+ 
+ static DynamicStrings_String CreateDecimalTime (Selective_Timeval timeval)
+ {
+   unsigned int sec;
+   unsigned int usec;
+ 
+   Selective_GetTime (timeval, &sec, &usec);
+   return DynamicStrings_ConCat (DynamicStrings_ConCat (StringConvert_LongCardinalToString (static_cast<long unsigned int> (sec), 0, ' ', 10, true), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ".", 1))), StringConvert_LongCardinalToString (static_cast<long unsigned int> (usec), 6, '0', 10, true));
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    CreateHexadecimalTime - return timeval as a hexadecimal seconds.usecs string.
+ */
+ 
+ static DynamicStrings_String CreateHexadecimalTime (Selective_Timeval timeval)
+ {
+   unsigned int sec;
+   unsigned int usec;
+ 
+   Selective_GetTime (timeval, &sec, &usec);
+   return DynamicStrings_ConCat (DynamicStrings_ConCat (StringConvert_LongCardinalToString (static_cast<long unsigned int> (sec), 0, ' ', 16, true), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ".", 1))), StringConvert_LongCardinalToString (static_cast<long unsigned int> (usec), 5, '0', 16, true));
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    Decimal - convert paramno in Diag to a string.
+ */
+ 
+ static DynamicStrings_String Decimal (M2Diagnostic_Diagnostic Diag, unsigned int paramno)
+ {
+   switch (Diag->type)
+     {
+       case M2Diagnostic_memdiag:
+         return CreateDecimalMem (GetMemParam (Diag, paramno));
+         break;
+ 
+       case M2Diagnostic_timediag:
+         return CreateDecimalTime (GetTimeParam (Diag, paramno));
+         break;
+ 
+ 
+       default:
+         CaseException ("../../gcc/m2/gm2-libs/M2Diagnostic.def", 20, 1);
+         __builtin_unreachable ();
+     }
+   return static_cast<DynamicStrings_String> (NULL);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    Hexadecimal - convert paramno in Diag to a hex string.
+ */
+ 
+ static DynamicStrings_String Hexadecimal (M2Diagnostic_Diagnostic Diag, unsigned int paramno)
+ {
+   switch (Diag->type)
+     {
+       case M2Diagnostic_memdiag:
+         return CreateHexadecimalMem (GetMemParam (Diag, paramno));
+         break;
+ 
+       case M2Diagnostic_timediag:
+         return CreateHexadecimalTime (GetTimeParam (Diag, paramno));
+         break;
+ 
+ 
+       default:
+         CaseException ("../../gcc/m2/gm2-libs/M2Diagnostic.def", 20, 1);
+         __builtin_unreachable ();
+     }
+   return static_cast<DynamicStrings_String> (NULL);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    Count - return the count field for a time diag or return the decimal
+            value for a paramno in a mem diag.
+ */
+ 
+ static DynamicStrings_String Count (M2Diagnostic_Diagnostic Diag, unsigned int paramno)
+ {
+   switch (Diag->type)
+     {
+       case M2Diagnostic_memdiag:
+         return CreateDecimalMem (GetMemParam (Diag, paramno));
+         break;
+ 
+       case M2Diagnostic_timediag:
+         return StringConvert_ctos (Diag->tdiag.count, 0, ' ');
+         break;
+ 
+ 
+       default:
+         CaseException ("../../gcc/m2/gm2-libs/M2Diagnostic.def", 20, 1);
+         __builtin_unreachable ();
+     }
+   return static_cast<DynamicStrings_String> (NULL);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    Microsec - convert timeval into microseconds and return the value as
+               a longcard.
+ */
+ 
+ static long unsigned int Microsec (Selective_Timeval timeval)
+ {
+   unsigned int sec;
+   unsigned int usec;
+   long unsigned int microsec;
+ 
+   Selective_GetTime (timeval, &sec, &usec);
+   microsec = (((long unsigned int ) (sec))*MICROSEC)+((long unsigned int ) (usec));
+   return microsec;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    CreateTimePercent - return timeval as a percentage of the TotalTime.
+ */
+ 
+ static DynamicStrings_String CreateTimePercent (Selective_Timeval timeval)
+ {
+   long unsigned int total;
+   long unsigned int param;
+ 
+   if (timeval == TotalTime)
+     {
+       param = 100;
+     }
+   else
+     {
+       UpdateTotalTime ();
+       param = (Microsec (timeval))*100;
+       total = Microsec (TotalTime);
+       if (total == 0)
+         {
+           param = 0;
+         }
+       else
+         {
+           param = param / total;
+         }
+     }
+   return DynamicStrings_ConCatChar (StringConvert_ctos ((unsigned int ) (param), 3, ' '), '%');
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    CreateMemPercent - return memval as a percentage of TotalHeap.
+ */
+ 
+ static DynamicStrings_String CreateMemPercent (long unsigned int memval)
+ {
+   long unsigned int param;
+ 
+   if (memval == TotalHeap)
+     {
+       param = 100;
+     }
+   else
+     {
+       param = memval*100;
+       if (TotalHeap == 0)
+         {
+           param = 0;
+         }
+       else
+         {
+           param = param / TotalHeap;
+         }
+     }
+   return DynamicStrings_ConCatChar (StringConvert_ctos ((unsigned int ) (param), 3, ' '), '%');
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    DescribePercent - call the appropriate mem or time percentage procedure.
+ */
+ 
+ static DynamicStrings_String DescribePercent (M2Diagnostic_Diagnostic Diag, unsigned int paramno)
+ {
+   switch (Diag->type)
+     {
+       case M2Diagnostic_memdiag:
+         return CreateMemPercent (GetMemParam (Diag, paramno));
+         break;
+ 
+       case M2Diagnostic_timediag:
+         return CreateTimePercent (GetTimeParam (Diag, paramno));
+         break;
+ 
+ 
+       default:
+         CaseException ("../../gcc/m2/gm2-libs/M2Diagnostic.def", 20, 1);
+         __builtin_unreachable ();
+     }
+   return static_cast<DynamicStrings_String> (NULL);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    DescribeMemory - return the memory diagnostic
+ */
+ 
+ static DynamicStrings_String DescribeMemory (M2Diagnostic_Diagnostic Diag, unsigned int paramno)
+ {
+   long unsigned int param;
+   DynamicStrings_String s;
+ 
+   param = GetMemParam (Diag, paramno);
+   if (param < kilo)
+     {
+       s = DynamicStrings_ConCat (StringConvert_LongCardinalToString (param, 0, ' ', 10, false), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) " Bytes", 6)));
+     }
+   else if (param < mega)
+     {
+       /* avoid dangling else.  */
+       param = param / kilo;
+       s = DynamicStrings_ConCat (StringConvert_LongCardinalToString (param, 0, ' ', 10, false), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "KB", 2)));
+     }
+   else
+     {
+       /* avoid dangling else.  */
+       param = param / mega;
+       s = DynamicStrings_ConCat (StringConvert_LongCardinalToString (param, 0, ' ', 10, false), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "MB", 2)));
+     }
+   return s;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    DescribeTime - returns the time diagnostic in seconds.
+ */
+ 
+ static DynamicStrings_String DescribeTime (M2Diagnostic_Diagnostic Diag, unsigned int paramno)
+ {
+   unsigned int sec;
+   unsigned int usec;
+ 
+   switch (Diag->type)
+     {
+       case M2Diagnostic_memdiag:
+         M2RTS_HALT (-1);
+         __builtin_unreachable ();
+         break;
+ 
+       case M2Diagnostic_timediag:
+         Selective_GetTime (GetTimeParam (Diag, paramno), &sec, &usec);
+         return DynamicStrings_ConCat (DynamicStrings_ConCat (StringConvert_LongCardinalToString (static_cast<long unsigned int> (sec), 0, ' ', 10, true), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ".", 1))), DynamicStrings_ConCat (StringConvert_LongCardinalToString (static_cast<long unsigned int> (usec), 6, '0', 10, true), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) " sec", 4))));
+         break;
+ 
+ 
+       default:
+         CaseException ("../../gcc/m2/gm2-libs/M2Diagnostic.def", 20, 1);
+         __builtin_unreachable ();
+     }
+   return static_cast<DynamicStrings_String> (NULL);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    ParamSpec - ebnf:
+ 
+                ( '{' | '0' | '1' | '2' | '3' | '4' )
+                ( 'd' | 'x' | 'C' | 'T' | 'M' | 'N' | 'P' )
+                '}'
+ */
+ 
+ static unsigned int ParamSpec (M2Diagnostic_Diagnostic Diag, unsigned int i)
+ {
+   unsigned int paramno;
+   unsigned int length;
+   char ch;
+ 
+   length = DynamicStrings_Length (Diag->format);
+   paramno = 0;
+   if (i < length)
+     {
+       ch = DynamicStrings_char (Diag->format, static_cast<int> (i));
+       switch (ch)
+         {
+           case '{':
+             Output = DynamicStrings_ConCatChar (Output, '{');
+             return i+1;
+             break;
+ 
+           case '0':
+             paramno = 0;
+             break;
+ 
+           case '1':
+             paramno = 1;
+             break;
+ 
+           case '2':
+             paramno = 2;
+             break;
+ 
+           case '3':
+             paramno = 3;
+             break;
+ 
+           case '4':
+             paramno = 4;
+             break;
+ 
+ 
+           default:
+             Error ((const char *) "unexpected character: ", 22, ch);
+             break;
+         }
+       i += 1;
+       if (i < length)
+         {
+           ch = DynamicStrings_char (Diag->format, static_cast<int> (i));
+           switch (ch)
+             {
+               case 'd':
+                 Output = DynamicStrings_ConCat (Output, Decimal (Diag, paramno));
+                 break;
+ 
+               case 'x':
+                 Output = DynamicStrings_ConCat (Output, Hexadecimal (Diag, paramno));
+                 break;
+ 
+               case 'C':
+                 Output = DynamicStrings_ConCat (Output, Count (Diag, paramno));
+                 break;
+ 
+               case 'M':
+                 Output = DynamicStrings_ConCat (Output, DescribeMemory (Diag, paramno));
+                 break;
+ 
+               case 'N':
+                 Output = DynamicStrings_ConCat (Output, Diag->name);
+                 break;
+ 
+               case 'P':
+                 Output = DynamicStrings_ConCat (Output, DescribePercent (Diag, paramno));
+                 break;
+ 
+               case 'T':
+                 Output = DynamicStrings_ConCat (Output, DescribeTime (Diag, paramno));
+                 break;
+ 
+ 
+               default:
+                 Error ((const char *) "unexpected character: ", 22, ch);
+                 break;
+             }
+           i += 1;
+           if (i < length)
+             {
+               ch = DynamicStrings_char (Diag->format, static_cast<int> (i));
+               if (ch != '}')
+                 {
+                   Error ((const char *) "expected } character, seen ", 27, ch);
+                 }
+             }
+         }
+     }
+   return i+1;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    FormatDiag - ebnf:
+ 
+                 { ( '{' ParamSpec ) | any }
+ */
+ 
+ static void FormatDiag (M2Diagnostic_Diagnostic Diag)
+ {
+   unsigned int i;
+   unsigned int length;
+   char ch;
+ 
+   i = 0;
+   length = DynamicStrings_Length (Diag->format);
+   while (i < length)
+     {
+       ch = DynamicStrings_char (Diag->format, static_cast<int> (i));
+       if (ch == '{')
+         {
+           i += 1;
+           i = ParamSpec (Diag, i);
+         }
+       else
+         {
+           Output = DynamicStrings_ConCatChar (Output, ch);
+           i += 1;
+         }
+     }
+   Output = DynamicStrings_ConCatChar (Output, ASCII_nl);
+ }
+ 
+ 
+ /*
+    InitTimeDiagnostic - create and return a time diagnostic.
+                         The format string can be free form and may
+                         contain {1T}, {1C} or {1P}.
+                         {1T} will contain the time and
+                         {1C} the count of the number of times the
+                         code enters the time diagnostic code region.
+                         {1P} generates the time as a percentage.
+                         {0T} is the total time for the application.
+                         {{ is rendered as a single {.
+ */
+ 
+ extern "C" M2Diagnostic_Diagnostic M2Diagnostic_InitTimeDiagnostic (const char *name_, unsigned int _name_high, const char *format_, unsigned int _format_high)
+ {
+   M2Diagnostic_Diagnostic d;
+   char name[_name_high+1];
+   char format[_format_high+1];
+ 
+   /* make a local copy of each unbounded array.  */
+   memcpy (name, name_, _name_high+1);
+   memcpy (format, format_, _format_high+1);
+ 
+   if (EnableDiagnostics)
+     {
+       Storage_ALLOCATE ((void **) &d, sizeof (M2Diagnostic__T1));
+       d->name = DynamicStrings_InitString ((const char *) name, _name_high);
+       d->format = DynamicStrings_InitString ((const char *) format, _format_high);
+       d->enable = DefaultTimeEnable;
+       d->next = Head;
+       d->type = M2Diagnostic_timediag;
+       switch (d->type)
+         {
+           case M2Diagnostic_timediag:
+             d->tdiag.count = 0;
+             d->tdiag.total = Selective_InitTime (0, 0);
+             d->tdiag.enter = Selective_InitTime (0, 0);
+             d->tdiag.exit_ = Selective_InitTime (0, 0);
+             break;
+ 
+ 
+           default:
+             M2RTS_HALT (-1);
+             __builtin_unreachable ();
+             break;
+         }
+       Head = d;
+       return d;
+     }
+   else
+     {
+       return NULL;
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    EnterDiagnostic - attribute all execution time from now to TimeDiag.
+ */
+ 
+ extern "C" void M2Diagnostic_EnterDiagnostic (M2Diagnostic_Diagnostic TimeDiag)
+ {
+   if (EnableDiagnostics && (TimeDiag != NULL))
+     {
+       Assert (TimeDiag->type == M2Diagnostic_timediag);
+       Assert ((Selective_GetTimeOfDay (TimeDiag->tdiag.enter)) == 0);
+       TimeDiag->tdiag.count += 1;
+     }
+ }
+ 
+ 
+ /*
+    ExitDiagnostic - stop attributing execution time to TimeDiag.
+ */
+ 
+ extern "C" void M2Diagnostic_ExitDiagnostic (M2Diagnostic_Diagnostic TimeDiag)
+ {
+   if (EnableDiagnostics && (TimeDiag != NULL))
+     {
+       Assert (TimeDiag->type == M2Diagnostic_timediag);
+       Assert ((Selective_GetTimeOfDay (TimeDiag->tdiag.exit_)) == 0);
+       Accumulate (TimeDiag->tdiag.total, TimeDiag->tdiag.enter, TimeDiag->tdiag.exit_);
+     }
+ }
+ 
+ 
+ /*
+    InitMemDiagnostic - create and return a memory diagnostic.
+                        The format string can be free form and may
+                        contain {1M} {1d} {1x} {1P}.
+                        {1M} is replaced by the value of the first parameter
+                        with memory size units.
+                        {1d} unsigned decimal.  {1x} unsigned hexadecimal.
+                        {0M} is the global allocation (Storage.mod:ALLOCATE).
+                        {1P} is the percentage of param 1 relative
+                        to global memory.
+ */
+ 
+ extern "C" M2Diagnostic_Diagnostic M2Diagnostic_InitMemDiagnostic (const char *name_, unsigned int _name_high, const char *format_, unsigned int _format_high)
+ {
+   unsigned int i;
+   M2Diagnostic_Diagnostic d;
+   char name[_name_high+1];
+   char format[_format_high+1];
+ 
+   /* make a local copy of each unbounded array.  */
+   memcpy (name, name_, _name_high+1);
+   memcpy (format, format_, _format_high+1);
+ 
+   if (EnableDiagnostics)
+     {
+       Storage_ALLOCATE ((void **) &d, sizeof (M2Diagnostic__T1));
+       d->name = DynamicStrings_InitString ((const char *) name, _name_high);
+       d->format = DynamicStrings_InitString ((const char *) format, _format_high);
+       d->enable = DefaultMemEnable;
+       d->next = Head;
+       d->type = M2Diagnostic_memdiag;
+       switch (d->type)
+         {
+           case M2Diagnostic_memdiag:
+             for (i=1; i<=MaxParam; i++)
+               {
+                 d->mdiag.param.array[i-1] = 0;
+               }
+             break;
+ 
+ 
+           default:
+             M2RTS_HALT (-1);
+             __builtin_unreachable ();
+             break;
+         }
+       Head = d;
+       return d;
+     }
+   else
+     {
+       return NULL;
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    MemIncr - allow the appropriate parameter to be incremented.
+              All parameters are initially set to zero and are stored
+              as LONGCARD.
+ */
+ 
+ extern "C" void M2Diagnostic_MemIncr (M2Diagnostic_Diagnostic MemDiag, unsigned int paramno, unsigned int incr)
+ {
+   if (EnableDiagnostics && (MemDiag != NULL))
+     {
+       CheckParam (paramno);
+       switch (MemDiag->type)
+         {
+           case M2Diagnostic_memdiag:
+             MemDiag->mdiag.param.array[paramno-1] += (long unsigned int ) (incr);
+             break;
+ 
+ 
+           default:
+             M2RTS_HALT (-1);
+             __builtin_unreachable ();
+             break;
+         }
+     }
+ }
+ 
+ 
+ /*
+    MemDecr - allow the appropriate parameter to be decremented.
+              All parameters are initially set to zero and are stored
+              as LONGCARD.
+ */
+ 
+ extern "C" void M2Diagnostic_MemDecr (M2Diagnostic_Diagnostic MemDiag, unsigned int paramno, unsigned int decr)
+ {
+   if (EnableDiagnostics && (MemDiag != NULL))
+     {
+       CheckParam (paramno);
+       switch (MemDiag->type)
+         {
+           case M2Diagnostic_memdiag:
+             MemDiag->mdiag.param.array[paramno-1] -= (long unsigned int ) (decr);
+             break;
+ 
+ 
+           default:
+             M2RTS_HALT (-1);
+             __builtin_unreachable ();
+             break;
+         }
+     }
+ }
+ 
+ 
+ /*
+    MemSet - allow the appropriate parameter to be set to value.
+             All parameters are initially set to zero.
+ */
+ 
+ extern "C" void M2Diagnostic_MemSet (M2Diagnostic_Diagnostic MemDiag, unsigned int paramno, unsigned int value)
+ {
+   if (EnableDiagnostics && (MemDiag != NULL))
+     {
+       CheckParam (paramno);
+       switch (MemDiag->type)
+         {
+           case M2Diagnostic_memdiag:
+             MemDiag->mdiag.param.array[paramno-1] = (long unsigned int ) (value);
+             break;
+ 
+ 
+           default:
+             M2RTS_HALT (-1);
+             __builtin_unreachable ();
+             break;
+         }
+     }
+ }
+ 
+ 
+ /*
+    TotalHeapIncr - increments the total heap used.
+ */
+ 
+ extern "C" void M2Diagnostic_TotalHeapIncr (unsigned int incr)
+ {
+   if (EnableDiagnostics)
+     {
+       TotalHeap = TotalHeap+((long unsigned int ) (incr));
+     }
+ }
+ 
+ 
+ /*
+    TotalHeapDecr - decrements the total heap used.
+ */
+ 
+ extern "C" void M2Diagnostic_TotalHeapDecr (unsigned int incr)
+ {
+   if (EnableDiagnostics)
+     {
+       TotalHeap = TotalHeap-((long unsigned int ) (incr));
+     }
+ }
+ 
+ 
+ /*
+    SetEnable - set the enable flag in Diag to value.
+ */
+ 
+ extern "C" void M2Diagnostic_SetEnable (M2Diagnostic_Diagnostic Diag, bool value)
+ {
+   if (EnableDiagnostics && (Diag != NULL))
+     {
+       Diag->enable = value;
+     }
+ }
+ 
+ 
+ /*
+    Lookup - returns the Diagnostic containing name or NIL
+             if it does not exist.
+ */
+ 
+ extern "C" M2Diagnostic_Diagnostic M2Diagnostic_Lookup (const char *name_, unsigned int _name_high)
+ {
+   M2Diagnostic_Diagnostic ptr;
+   DynamicStrings_String s;
+   char name[_name_high+1];
+ 
+   /* make a local copy of each unbounded array.  */
+   memcpy (name, name_, _name_high+1);
+ 
+   if (EnableDiagnostics)
+     {
+       s = DynamicStrings_InitString ((const char *) name, _name_high);
+       ptr = Head;
+       while (ptr != NULL)
+         {
+           if (DynamicStrings_Equal (ptr->name, s))
+             {
+               s = DynamicStrings_KillString (s);
+               return ptr;
+             }
+           ptr = ptr->next;
+         }
+       s = DynamicStrings_KillString (s);
+       return NULL;
+     }
+   else
+     {
+       return NULL;
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    GetName - returns the name of Diag.
+ */
+ 
+ extern "C" DynamicStrings_String M2Diagnostic_GetName (M2Diagnostic_Diagnostic Diag)
+ {
+   if (EnableDiagnostics && (Diag != NULL))
+     {
+       return Diag->name;
+     }
+   else
+     {
+       return static_cast<DynamicStrings_String> (NULL);
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    ForeachDiagDo - for diag in global diag list do
+                       dp (diag);
+                    end
+ */
+ 
+ extern "C" void M2Diagnostic_ForeachDiagDo (M2Diagnostic_DiagProc dp)
+ {
+   M2Diagnostic_Diagnostic ptr;
+ 
+   ptr = Head;
+   while (ptr != NULL)
+     {
+       (*dp.proc) (ptr);
+       ptr = ptr->next;
+     }
+ }
+ 
+ 
+ /*
+    SetDefaultConfig - force the Diag enable flag to the
+                       time or mem global default.
+ */
+ 
+ extern "C" void M2Diagnostic_SetDefaultConfig (M2Diagnostic_Diagnostic Diag)
+ {
+   if (Diag->type == M2Diagnostic_timediag)
+     {
+       Diag->enable = DefaultTimeEnable;
+     }
+   else
+     {
+       Diag->enable = DefaultMemEnable;
+     }
+ }
+ 
+ 
+ /*
+    Configure - will turn on or off all the memory or time
+                instrumentation diagnostics and set the defaults
+                time and mem values.
+ */
+ 
+ extern "C" void M2Diagnostic_Configure (bool time_, bool mem)
+ {
+   if (EnableDiagnostics)
+     {
+       DefaultTimeEnable = time_;
+       DefaultMemEnable = mem;
+       M2Diagnostic_ForeachDiagDo ((M2Diagnostic_DiagProc) {(M2Diagnostic_DiagProc_t) M2Diagnostic_SetDefaultConfig});
+     }
+ }
+ 
+ 
+ /*
+    Generate - return a string containing the output from
+               all the diagnostics enabled.
+ */
+ 
+ extern "C" DynamicStrings_String M2Diagnostic_Generate (void)
+ {
+   if (EnableDiagnostics)
+     {
+       Output = DynamicStrings_KillString (Output);
+       Output = DynamicStrings_InitString ((const char *) "", 0);
+       M2Diagnostic_ForeachDiagDo ((M2Diagnostic_DiagProc) {(M2Diagnostic_DiagProc_t) FormatDiag});
+       return Output;
+     }
+   else
+     {
+       return static_cast<DynamicStrings_String> (NULL);
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ extern "C" void _M2_M2Diagnostic_init (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[])
+ {
+   TotalHeap = 0;
+   StartTime = NULL;
+   TotalTime = NULL;
+   CreateStartTime ();
+   Head = NULL;
+   Output = static_cast<DynamicStrings_String> (NULL);
+   DefaultTimeEnable = DefaultTimeEnableValue;
+   DefaultMemEnable = DefaultMemEnableValue;
+ }
+ 
+ extern "C" void _M2_M2Diagnostic_fini (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[])
+ {
+ }
diff -Nrcpad gcc-16-20250914/gcc/m2/mc-boot/GM2Diagnostic.h gcc-16-20250921/gcc/m2/mc-boot/GM2Diagnostic.h
*** gcc-16-20250914/gcc/m2/mc-boot/GM2Diagnostic.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/m2/mc-boot/GM2Diagnostic.h	Sun Sep 21 22:32:38 2025
***************
*** 0 ****
--- 1,186 ----
+ /* do not edit automatically generated by mc from M2Diagnostic.  */
+ /* M2Diagnotic provides memory and time diagnosics to the user.
+ 
+ Copyright (C) 2024 Free Software Foundation, Inc.
+ Contributed by Gaius Mulley <gaiusmod2@gmail.com>.
+ 
+ This file is part of GNU Modula-2.
+ 
+ GNU Modula-2 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.
+ 
+ GNU Modula-2 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 GNU Modula-2; see the file COPYING3.  If not see
+ <http://www.gnu.org/licenses/>.  */
+ 
+ 
+ #if !defined (_M2Diagnostic_H)
+ #   define _M2Diagnostic_H
+ 
+ #include "config.h"
+ #include "system.h"
+ #   ifdef __cplusplus
+ extern "C" {
+ #   endif
+ #include <stdbool.h>
+ #   if !defined (PROC_D)
+ #      define PROC_D
+        typedef void (*PROC_t) (void);
+        typedef struct { PROC_t proc; } PROC;
+ #   endif
+ 
+ #   include "GDynamicStrings.h"
+ 
+ #   if defined (_M2Diagnostic_C)
+ #      define EXTERN
+ #   else
+ #      define EXTERN extern
+ #   endif
+ 
+ #if !defined (M2Diagnostic_Diagnostic_D)
+ #  define M2Diagnostic_Diagnostic_D
+    typedef void *M2Diagnostic_Diagnostic;
+ #endif
+ 
+ typedef struct M2Diagnostic_DiagProc_p M2Diagnostic_DiagProc;
+ 
+ typedef void (*M2Diagnostic_DiagProc_t) (M2Diagnostic_Diagnostic);
+ struct M2Diagnostic_DiagProc_p { M2Diagnostic_DiagProc_t proc; };
+ 
+ 
+ /*
+    InitTimeDiagnostic - create and return a time diagnostic.
+                         The format string can be free form and may
+                         contain {1T}, {1C} or {1P}.
+                         {1T} will contain the time and
+                         {1C} the count of the number of times the
+                         code enters the time diagnostic code region.
+                         {1P} generates the time as a percentage.
+                         {0T} is the total time for the application.
+                         {{ is rendered as a single {.
+ */
+ 
+ EXTERN M2Diagnostic_Diagnostic M2Diagnostic_InitTimeDiagnostic (const char *name_, unsigned int _name_high, const char *format_, unsigned int _format_high);
+ 
+ /*
+    EnterDiagnostic - attribute all execution time from now to TimeDiag.
+ */
+ 
+ EXTERN void M2Diagnostic_EnterDiagnostic (M2Diagnostic_Diagnostic TimeDiag);
+ 
+ /*
+    ExitDiagnostic - stop attributing execution time to TimeDiag.
+ */
+ 
+ EXTERN void M2Diagnostic_ExitDiagnostic (M2Diagnostic_Diagnostic TimeDiag);
+ 
+ /*
+    InitMemDiagnostic - create and return a memory diagnostic.
+                        The format string can be free form and may
+                        contain {1M} {1d} {1x} {1P}.
+                        {1M} is replaced by the value of the first parameter
+                        with memory size units.
+                        {1d} unsigned decimal.  {1x} unsigned hexadecimal.
+                        {0M} is the global allocation (Storage.mod:ALLOCATE).
+                        {1P} is the percentage of param 1 relative
+                        to global memory.
+ */
+ 
+ EXTERN M2Diagnostic_Diagnostic M2Diagnostic_InitMemDiagnostic (const char *name_, unsigned int _name_high, const char *format_, unsigned int _format_high);
+ 
+ /*
+    MemIncr - allow the appropriate parameter to be incremented.
+              All parameters are initially set to zero and are stored
+              as LONGCARD.
+ */
+ 
+ EXTERN void M2Diagnostic_MemIncr (M2Diagnostic_Diagnostic MemDiag, unsigned int paramno, unsigned int incr);
+ 
+ /*
+    MemDecr - allow the appropriate parameter to be decremented.
+              All parameters are initially set to zero and are stored
+              as LONGCARD.
+ */
+ 
+ EXTERN void M2Diagnostic_MemDecr (M2Diagnostic_Diagnostic MemDiag, unsigned int paramno, unsigned int decr);
+ 
+ /*
+    MemSet - allow the appropriate parameter to be set to value.
+             All parameters are initially set to zero.
+ */
+ 
+ EXTERN void M2Diagnostic_MemSet (M2Diagnostic_Diagnostic MemDiag, unsigned int paramno, unsigned int value);
+ 
+ /*
+    TotalHeapIncr - increments the total heap used.
+ */
+ 
+ EXTERN void M2Diagnostic_TotalHeapIncr (unsigned int incr);
+ 
+ /*
+    TotalHeapDecr - decrements the total heap used.
+ */
+ 
+ EXTERN void M2Diagnostic_TotalHeapDecr (unsigned int incr);
+ 
+ /*
+    SetEnable - set the enable flag in Diag to value.
+ */
+ 
+ EXTERN void M2Diagnostic_SetEnable (M2Diagnostic_Diagnostic Diag, bool value);
+ 
+ /*
+    Lookup - returns the Diagnostic containing name or NIL
+             if it does not exist.
+ */
+ 
+ EXTERN M2Diagnostic_Diagnostic M2Diagnostic_Lookup (const char *name_, unsigned int _name_high);
+ 
+ /*
+    GetName - returns the name of Diag.
+ */
+ 
+ EXTERN DynamicStrings_String M2Diagnostic_GetName (M2Diagnostic_Diagnostic Diag);
+ 
+ /*
+    ForeachDiagDo - for diag in global diag list do
+                       dp (diag);
+                    end
+ */
+ 
+ EXTERN void M2Diagnostic_ForeachDiagDo (M2Diagnostic_DiagProc dp);
+ 
+ /*
+    SetDefaultConfig - force the Diag enable flag to the
+                       time or mem global default.
+ */
+ 
+ EXTERN void M2Diagnostic_SetDefaultConfig (M2Diagnostic_Diagnostic Diag);
+ 
+ /*
+    Configure - will turn on or off all the memory or time
+                instrumentation diagnostics and set the defaults
+                time and mem values.
+ */
+ 
+ EXTERN void M2Diagnostic_Configure (bool time_, bool mem);
+ 
+ /*
+    Generate - return a string containing the output from
+               all the diagnostics enabled.
+ */
+ 
+ EXTERN DynamicStrings_String M2Diagnostic_Generate (void);
+ #   ifdef __cplusplus
+ }
+ #   endif
+ 
+ #   undef EXTERN
+ #endif
diff -Nrcpad gcc-16-20250914/gcc/m2/pge-boot/GM2Diagnostic.cc gcc-16-20250921/gcc/m2/pge-boot/GM2Diagnostic.cc
*** gcc-16-20250914/gcc/m2/pge-boot/GM2Diagnostic.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/m2/pge-boot/GM2Diagnostic.cc	Sun Sep 21 22:32:38 2025
***************
*** 0 ****
--- 1,1485 ----
+ /* do not edit automatically generated by mc from M2Diagnostic.  */
+ /* M2Diagnotic provides memory and time diagnosics to the user.
+ 
+ Copyright (C) 2024 Free Software Foundation, Inc.
+ Contributed by Gaius Mulley <gaiusmod2@gmail.com>.
+ 
+ This file is part of GNU Modula-2.
+ 
+ GNU Modula-2 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.
+ 
+ GNU Modula-2 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 GNU Modula-2; see the file COPYING3.  If not see
+ <http://www.gnu.org/licenses/>.  */
+ 
+ #include <stdbool.h>
+ #   if !defined (PROC_D)
+ #      define PROC_D
+        typedef void (*PROC_t) (void);
+        typedef struct { PROC_t proc; } PROC;
+ #   endif
+ 
+ #   if !defined (TRUE)
+ #      define TRUE (1==1)
+ #   endif
+ 
+ #   if !defined (FALSE)
+ #      define FALSE (1==0)
+ #   endif
+ 
+ #include <stddef.h>
+ #include <string.h>
+ #include <limits.h>
+ #   include "GStorage.h"
+ #   include "Gmcrts.h"
+ #if defined(__cplusplus)
+ #   undef NULL
+ #   define NULL 0
+ #endif
+ #define _M2Diagnostic_H
+ #define _M2Diagnostic_C
+ 
+ #   include "GASCII.h"
+ #   include "GSelective.h"
+ #   include "GStringConvert.h"
+ #   include "GStorage.h"
+ #   include "GDynamicStrings.h"
+ #   include "GM2RTS.h"
+ 
+ typedef struct M2Diagnostic_DiagProc_p M2Diagnostic_DiagProc;
+ 
+ #   define EnableDiagnostics true
+ #   define DefaultTimeEnableValue false
+ #   define DefaultMemEnableValue false
+ #   define MaxParam 4
+ #   define MICROSEC 100000
+ typedef struct M2Diagnostic_timeDiag_r M2Diagnostic_timeDiag;
+ 
+ typedef struct M2Diagnostic_memDiag_r M2Diagnostic_memDiag;
+ 
+ typedef struct M2Diagnostic__T1_r M2Diagnostic__T1;
+ 
+ typedef struct M2Diagnostic__T2_a M2Diagnostic__T2;
+ 
+ typedef enum {M2Diagnostic_timediag, M2Diagnostic_memdiag} M2Diagnostic_DiagType;
+ 
+ #   define kilo 1024
+ #   define mega (kilo*kilo)
+ #   define giga (mega*kilo)
+ typedef M2Diagnostic__T1 *M2Diagnostic_Diagnostic;
+ 
+ typedef void (*M2Diagnostic_DiagProc_t) (M2Diagnostic_Diagnostic);
+ struct M2Diagnostic_DiagProc_p { M2Diagnostic_DiagProc_t proc; };
+ 
+ struct M2Diagnostic_timeDiag_r {
+                                  unsigned int count;
+                                  Selective_Timeval total;
+                                  Selective_Timeval enter;
+                                  Selective_Timeval exit_;
+                                };
+ 
+ struct M2Diagnostic__T2_a { long unsigned int array[MaxParam-1+1]; };
+ struct M2Diagnostic_memDiag_r {
+                                 M2Diagnostic__T2 param;
+                               };
+ 
+ struct M2Diagnostic__T1_r {
+                             DynamicStrings_String name;
+                             DynamicStrings_String format;
+                             bool enable;
+                             M2Diagnostic_Diagnostic next;
+                             M2Diagnostic_DiagType type;  /* case tag */
+                             union {
+                                     M2Diagnostic_timeDiag tdiag;
+                                     M2Diagnostic_memDiag mdiag;
+                                   };
+                           };
+ 
+ static DynamicStrings_String Output;
+ static long unsigned int TotalHeap;
+ static M2Diagnostic_Diagnostic Head;
+ static bool DefaultTimeEnable;
+ static bool DefaultMemEnable;
+ static Selective_Timeval StartTime;
+ static Selective_Timeval TotalTime;
+ 
+ /*
+    InitTimeDiagnostic - create and return a time diagnostic.
+                         The format string can be free form and may
+                         contain {1T}, {1C} or {1P}.
+                         {1T} will contain the time and
+                         {1C} the count of the number of times the
+                         code enters the time diagnostic code region.
+                         {1P} generates the time as a percentage.
+                         {0T} is the total time for the application.
+                         {{ is rendered as a single {.
+ */
+ 
+ extern "C" M2Diagnostic_Diagnostic M2Diagnostic_InitTimeDiagnostic (const char *name_, unsigned int _name_high, const char *format_, unsigned int _format_high);
+ 
+ /*
+    EnterDiagnostic - attribute all execution time from now to TimeDiag.
+ */
+ 
+ extern "C" void M2Diagnostic_EnterDiagnostic (M2Diagnostic_Diagnostic TimeDiag);
+ 
+ /*
+    ExitDiagnostic - stop attributing execution time to TimeDiag.
+ */
+ 
+ extern "C" void M2Diagnostic_ExitDiagnostic (M2Diagnostic_Diagnostic TimeDiag);
+ 
+ /*
+    InitMemDiagnostic - create and return a memory diagnostic.
+                        The format string can be free form and may
+                        contain {1M} {1d} {1x} {1P}.
+                        {1M} is replaced by the value of the first parameter
+                        with memory size units.
+                        {1d} unsigned decimal.  {1x} unsigned hexadecimal.
+                        {0M} is the global allocation (Storage.mod:ALLOCATE).
+                        {1P} is the percentage of param 1 relative
+                        to global memory.
+ */
+ 
+ extern "C" M2Diagnostic_Diagnostic M2Diagnostic_InitMemDiagnostic (const char *name_, unsigned int _name_high, const char *format_, unsigned int _format_high);
+ 
+ /*
+    MemIncr - allow the appropriate parameter to be incremented.
+              All parameters are initially set to zero and are stored
+              as LONGCARD.
+ */
+ 
+ extern "C" void M2Diagnostic_MemIncr (M2Diagnostic_Diagnostic MemDiag, unsigned int paramno, unsigned int incr);
+ 
+ /*
+    MemDecr - allow the appropriate parameter to be decremented.
+              All parameters are initially set to zero and are stored
+              as LONGCARD.
+ */
+ 
+ extern "C" void M2Diagnostic_MemDecr (M2Diagnostic_Diagnostic MemDiag, unsigned int paramno, unsigned int decr);
+ 
+ /*
+    MemSet - allow the appropriate parameter to be set to value.
+             All parameters are initially set to zero.
+ */
+ 
+ extern "C" void M2Diagnostic_MemSet (M2Diagnostic_Diagnostic MemDiag, unsigned int paramno, unsigned int value);
+ 
+ /*
+    TotalHeapIncr - increments the total heap used.
+ */
+ 
+ extern "C" void M2Diagnostic_TotalHeapIncr (unsigned int incr);
+ 
+ /*
+    TotalHeapDecr - decrements the total heap used.
+ */
+ 
+ extern "C" void M2Diagnostic_TotalHeapDecr (unsigned int incr);
+ 
+ /*
+    SetEnable - set the enable flag in Diag to value.
+ */
+ 
+ extern "C" void M2Diagnostic_SetEnable (M2Diagnostic_Diagnostic Diag, bool value);
+ 
+ /*
+    Lookup - returns the Diagnostic containing name or NIL
+             if it does not exist.
+ */
+ 
+ extern "C" M2Diagnostic_Diagnostic M2Diagnostic_Lookup (const char *name_, unsigned int _name_high);
+ 
+ /*
+    GetName - returns the name of Diag.
+ */
+ 
+ extern "C" DynamicStrings_String M2Diagnostic_GetName (M2Diagnostic_Diagnostic Diag);
+ 
+ /*
+    ForeachDiagDo - for diag in global diag list do
+                       dp (diag);
+                    end
+ */
+ 
+ extern "C" void M2Diagnostic_ForeachDiagDo (M2Diagnostic_DiagProc dp);
+ 
+ /*
+    SetDefaultConfig - force the Diag enable flag to the
+                       time or mem global default.
+ */
+ 
+ extern "C" void M2Diagnostic_SetDefaultConfig (M2Diagnostic_Diagnostic Diag);
+ 
+ /*
+    Configure - will turn on or off all the memory or time
+                instrumentation diagnostics and set the defaults
+                time and mem values.
+ */
+ 
+ extern "C" void M2Diagnostic_Configure (bool time_, bool mem);
+ 
+ /*
+    Generate - return a string containing the output from
+               all the diagnostics enabled.
+ */
+ 
+ extern "C" DynamicStrings_String M2Diagnostic_Generate (void);
+ 
+ /*
+    Assert - halt if b is false.
+ */
+ 
+ static void Assert (bool b);
+ 
+ /*
+    Error - generate a error simple message with indicating the
+            format specifier ch is incorrect.
+ */
+ 
+ static void Error (const char *msg_, unsigned int _msg_high, char ch);
+ 
+ /*
+    Accumulate - total := total + exit - enter
+ */
+ 
+ static void Accumulate (Selective_Timeval total, Selective_Timeval enter, Selective_Timeval exit_);
+ 
+ /*
+    IncTime - left := left + right.
+ */
+ 
+ static void IncTime (Selective_Timeval left, Selective_Timeval right);
+ 
+ /*
+    DecTime - left := left - right.
+ */
+ 
+ static void DecTime (Selective_Timeval left, Selective_Timeval right);
+ 
+ /*
+    CheckParam -
+ */
+ 
+ static void CheckParam (unsigned int paramno);
+ 
+ /*
+    CreateStartTime -
+ */
+ 
+ static void CreateStartTime (void);
+ 
+ /*
+    UpdateTotalTime -
+ */
+ 
+ static void UpdateTotalTime (void);
+ 
+ /*
+    GetTimeParam - a paramno of 0 will return the total time so far
+                   whereas a paramno > 0 will return the time associated
+                   with Diag.
+ */
+ 
+ static Selective_Timeval GetTimeParam (M2Diagnostic_Diagnostic Diag, unsigned int paramno);
+ 
+ /*
+    GetMemParam - return the mem paramno from within Diag.  A paramno of 0
+                  will return the total heap.
+ */
+ 
+ static long unsigned int GetMemParam (M2Diagnostic_Diagnostic Diag, unsigned int paramno);
+ 
+ /*
+    CreateDecimalMem - converts c to a decimal string.
+ */
+ 
+ static DynamicStrings_String CreateDecimalMem (long unsigned int c);
+ 
+ /*
+    CreateHexadecimalMem - converts c to a hexadecimal string.
+ */
+ 
+ static DynamicStrings_String CreateHexadecimalMem (long unsigned int c);
+ 
+ /*
+    CreateDecimalTime - return timeval as a decimal seconds.usecs string.
+ */
+ 
+ static DynamicStrings_String CreateDecimalTime (Selective_Timeval timeval);
+ 
+ /*
+    CreateHexadecimalTime - return timeval as a hexadecimal seconds.usecs string.
+ */
+ 
+ static DynamicStrings_String CreateHexadecimalTime (Selective_Timeval timeval);
+ 
+ /*
+    Decimal - convert paramno in Diag to a string.
+ */
+ 
+ static DynamicStrings_String Decimal (M2Diagnostic_Diagnostic Diag, unsigned int paramno);
+ 
+ /*
+    Hexadecimal - convert paramno in Diag to a hex string.
+ */
+ 
+ static DynamicStrings_String Hexadecimal (M2Diagnostic_Diagnostic Diag, unsigned int paramno);
+ 
+ /*
+    Count - return the count field for a time diag or return the decimal
+            value for a paramno in a mem diag.
+ */
+ 
+ static DynamicStrings_String Count (M2Diagnostic_Diagnostic Diag, unsigned int paramno);
+ 
+ /*
+    Microsec - convert timeval into microseconds and return the value as
+               a longcard.
+ */
+ 
+ static long unsigned int Microsec (Selective_Timeval timeval);
+ 
+ /*
+    CreateTimePercent - return timeval as a percentage of the TotalTime.
+ */
+ 
+ static DynamicStrings_String CreateTimePercent (Selective_Timeval timeval);
+ 
+ /*
+    CreateMemPercent - return memval as a percentage of TotalHeap.
+ */
+ 
+ static DynamicStrings_String CreateMemPercent (long unsigned int memval);
+ 
+ /*
+    DescribePercent - call the appropriate mem or time percentage procedure.
+ */
+ 
+ static DynamicStrings_String DescribePercent (M2Diagnostic_Diagnostic Diag, unsigned int paramno);
+ 
+ /*
+    DescribeMemory - return the memory diagnostic
+ */
+ 
+ static DynamicStrings_String DescribeMemory (M2Diagnostic_Diagnostic Diag, unsigned int paramno);
+ 
+ /*
+    DescribeTime - returns the time diagnostic in seconds.
+ */
+ 
+ static DynamicStrings_String DescribeTime (M2Diagnostic_Diagnostic Diag, unsigned int paramno);
+ 
+ /*
+    ParamSpec - ebnf:
+ 
+                ( '{' | '0' | '1' | '2' | '3' | '4' )
+                ( 'd' | 'x' | 'C' | 'T' | 'M' | 'N' | 'P' )
+                '}'
+ */
+ 
+ static unsigned int ParamSpec (M2Diagnostic_Diagnostic Diag, unsigned int i);
+ 
+ /*
+    FormatDiag - ebnf:
+ 
+                 { ( '{' ParamSpec ) | any }
+ */
+ 
+ static void FormatDiag (M2Diagnostic_Diagnostic Diag);
+ 
+ 
+ /*
+    Assert - halt if b is false.
+ */
+ 
+ static void Assert (bool b)
+ {
+   if (! b)
+     {
+       M2RTS_HALT (-1);
+       __builtin_unreachable ();
+     }
+ }
+ 
+ 
+ /*
+    Error - generate a error simple message with indicating the
+            format specifier ch is incorrect.
+ */
+ 
+ static void Error (const char *msg_, unsigned int _msg_high, char ch)
+ {
+   char msg[_msg_high+1];
+ 
+   /* make a local copy of each unbounded array.  */
+   memcpy (msg, msg_, _msg_high+1);
+ 
+   M2RTS_HALT (-1);
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    Accumulate - total := total + exit - enter
+ */
+ 
+ static void Accumulate (Selective_Timeval total, Selective_Timeval enter, Selective_Timeval exit_)
+ {
+   IncTime (total, exit_);
+   DecTime (total, enter);
+ }
+ 
+ 
+ /*
+    IncTime - left := left + right.
+ */
+ 
+ static void IncTime (Selective_Timeval left, Selective_Timeval right)
+ {
+   unsigned int lsec;
+   unsigned int lusec;
+   unsigned int rsec;
+   unsigned int rusec;
+ 
+   Selective_GetTime (left, &lsec, &lusec);
+   Selective_GetTime (right, &rsec, &rusec);
+   if ((lusec+rusec) < MICROSEC)
+     {
+       /* No carry  */
+       lusec += rusec;
+       lsec += rsec;
+     }
+   else
+     {
+       lusec += rusec;
+       lusec -= MICROSEC;
+       lsec += rsec+1;
+     }
+   Selective_SetTime (left, lsec, lusec);
+ }
+ 
+ 
+ /*
+    DecTime - left := left - right.
+ */
+ 
+ static void DecTime (Selective_Timeval left, Selective_Timeval right)
+ {
+   unsigned int lsec;
+   unsigned int lusec;
+   unsigned int rsec;
+   unsigned int rusec;
+ 
+   Selective_GetTime (left, &lsec, &lusec);
+   Selective_GetTime (right, &rsec, &rusec);
+   if (lusec >= rusec)
+     {
+       /* No borrow.  */
+       lusec -= rusec;
+       if (lsec >= rsec)
+         {
+           lsec -= rsec;
+         }
+       else
+         {
+           lsec = 0;
+         }
+     }
+   else
+     {
+       if (lsec > 0)
+         {
+           lusec += MICROSEC;
+           lusec -= rusec;
+           lsec -= 1;
+           if (lsec >= rsec)
+             {
+               lsec -= rsec;
+             }
+           else
+             {
+               lsec = 0;
+             }
+         }
+       else
+         {
+           lsec = 0;
+           lusec = 0;
+         }
+     }
+   Selective_SetTime (left, lsec, lusec);
+ }
+ 
+ 
+ /*
+    CheckParam -
+ */
+ 
+ static void CheckParam (unsigned int paramno)
+ {
+   if ((paramno < 1) || (paramno > MaxParam))
+     {
+       M2RTS_HALT (-1);
+       __builtin_unreachable ();
+     }
+ }
+ 
+ 
+ /*
+    CreateStartTime -
+ */
+ 
+ static void CreateStartTime (void)
+ {
+   if (EnableDiagnostics)
+     {
+       /* avoid dangling else.  */
+       if (StartTime == NULL)
+         {
+           StartTime = Selective_InitTime (0, 0);
+           if ((Selective_GetTimeOfDay (StartTime)) == 0)
+             {}  /* empty.  */
+         }
+       if (TotalTime == NULL)
+         {
+           TotalTime = Selective_InitTime (0, 0);
+         }
+     }
+   else
+     {
+       StartTime = NULL;
+       TotalTime = NULL;
+     }
+ }
+ 
+ 
+ /*
+    UpdateTotalTime -
+ */
+ 
+ static void UpdateTotalTime (void)
+ {
+   if ((Selective_GetTimeOfDay (TotalTime)) == 0)
+     {}  /* empty.  */
+   DecTime (TotalTime, StartTime);
+ }
+ 
+ 
+ /*
+    GetTimeParam - a paramno of 0 will return the total time so far
+                   whereas a paramno > 0 will return the time associated
+                   with Diag.
+ */
+ 
+ static Selective_Timeval GetTimeParam (M2Diagnostic_Diagnostic Diag, unsigned int paramno)
+ {
+   unsigned int sec;
+   unsigned int usec;
+ 
+   if (paramno == 0)
+     {
+       UpdateTotalTime ();
+       return TotalTime;
+     }
+   else
+     {
+       return Diag->tdiag.total;
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    GetMemParam - return the mem paramno from within Diag.  A paramno of 0
+                  will return the total heap.
+ */
+ 
+ static long unsigned int GetMemParam (M2Diagnostic_Diagnostic Diag, unsigned int paramno)
+ {
+   if (paramno == 0)
+     {
+       return TotalHeap;
+     }
+   else
+     {
+       return Diag->mdiag.param.array[paramno-1];
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    CreateDecimalMem - converts c to a decimal string.
+ */
+ 
+ static DynamicStrings_String CreateDecimalMem (long unsigned int c)
+ {
+   return StringConvert_LongCardinalToString (c, 0, ' ', 10, true);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    CreateHexadecimalMem - converts c to a hexadecimal string.
+ */
+ 
+ static DynamicStrings_String CreateHexadecimalMem (long unsigned int c)
+ {
+   return DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "0x", 2), DynamicStrings_Mark (StringConvert_LongCardinalToString (c, 0, ' ', 16, true)));
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    CreateDecimalTime - return timeval as a decimal seconds.usecs string.
+ */
+ 
+ static DynamicStrings_String CreateDecimalTime (Selective_Timeval timeval)
+ {
+   unsigned int sec;
+   unsigned int usec;
+ 
+   Selective_GetTime (timeval, &sec, &usec);
+   return DynamicStrings_ConCat (DynamicStrings_ConCat (StringConvert_LongCardinalToString (static_cast<long unsigned int> (sec), 0, ' ', 10, true), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ".", 1))), StringConvert_LongCardinalToString (static_cast<long unsigned int> (usec), 6, '0', 10, true));
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    CreateHexadecimalTime - return timeval as a hexadecimal seconds.usecs string.
+ */
+ 
+ static DynamicStrings_String CreateHexadecimalTime (Selective_Timeval timeval)
+ {
+   unsigned int sec;
+   unsigned int usec;
+ 
+   Selective_GetTime (timeval, &sec, &usec);
+   return DynamicStrings_ConCat (DynamicStrings_ConCat (StringConvert_LongCardinalToString (static_cast<long unsigned int> (sec), 0, ' ', 16, true), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ".", 1))), StringConvert_LongCardinalToString (static_cast<long unsigned int> (usec), 5, '0', 16, true));
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    Decimal - convert paramno in Diag to a string.
+ */
+ 
+ static DynamicStrings_String Decimal (M2Diagnostic_Diagnostic Diag, unsigned int paramno)
+ {
+   switch (Diag->type)
+     {
+       case M2Diagnostic_memdiag:
+         return CreateDecimalMem (GetMemParam (Diag, paramno));
+         break;
+ 
+       case M2Diagnostic_timediag:
+         return CreateDecimalTime (GetTimeParam (Diag, paramno));
+         break;
+ 
+ 
+       default:
+         CaseException ("../../gcc/m2/gm2-libs/M2Diagnostic.def", 20, 1);
+         __builtin_unreachable ();
+     }
+   return static_cast<DynamicStrings_String> (NULL);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    Hexadecimal - convert paramno in Diag to a hex string.
+ */
+ 
+ static DynamicStrings_String Hexadecimal (M2Diagnostic_Diagnostic Diag, unsigned int paramno)
+ {
+   switch (Diag->type)
+     {
+       case M2Diagnostic_memdiag:
+         return CreateHexadecimalMem (GetMemParam (Diag, paramno));
+         break;
+ 
+       case M2Diagnostic_timediag:
+         return CreateHexadecimalTime (GetTimeParam (Diag, paramno));
+         break;
+ 
+ 
+       default:
+         CaseException ("../../gcc/m2/gm2-libs/M2Diagnostic.def", 20, 1);
+         __builtin_unreachable ();
+     }
+   return static_cast<DynamicStrings_String> (NULL);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    Count - return the count field for a time diag or return the decimal
+            value for a paramno in a mem diag.
+ */
+ 
+ static DynamicStrings_String Count (M2Diagnostic_Diagnostic Diag, unsigned int paramno)
+ {
+   switch (Diag->type)
+     {
+       case M2Diagnostic_memdiag:
+         return CreateDecimalMem (GetMemParam (Diag, paramno));
+         break;
+ 
+       case M2Diagnostic_timediag:
+         return StringConvert_ctos (Diag->tdiag.count, 0, ' ');
+         break;
+ 
+ 
+       default:
+         CaseException ("../../gcc/m2/gm2-libs/M2Diagnostic.def", 20, 1);
+         __builtin_unreachable ();
+     }
+   return static_cast<DynamicStrings_String> (NULL);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    Microsec - convert timeval into microseconds and return the value as
+               a longcard.
+ */
+ 
+ static long unsigned int Microsec (Selective_Timeval timeval)
+ {
+   unsigned int sec;
+   unsigned int usec;
+   long unsigned int microsec;
+ 
+   Selective_GetTime (timeval, &sec, &usec);
+   microsec = (((long unsigned int ) (sec))*MICROSEC)+((long unsigned int ) (usec));
+   return microsec;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    CreateTimePercent - return timeval as a percentage of the TotalTime.
+ */
+ 
+ static DynamicStrings_String CreateTimePercent (Selective_Timeval timeval)
+ {
+   long unsigned int total;
+   long unsigned int param;
+ 
+   if (timeval == TotalTime)
+     {
+       param = 100;
+     }
+   else
+     {
+       UpdateTotalTime ();
+       param = (Microsec (timeval))*100;
+       total = Microsec (TotalTime);
+       if (total == 0)
+         {
+           param = 0;
+         }
+       else
+         {
+           param = param / total;
+         }
+     }
+   return DynamicStrings_ConCatChar (StringConvert_ctos ((unsigned int ) (param), 3, ' '), '%');
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    CreateMemPercent - return memval as a percentage of TotalHeap.
+ */
+ 
+ static DynamicStrings_String CreateMemPercent (long unsigned int memval)
+ {
+   long unsigned int param;
+ 
+   if (memval == TotalHeap)
+     {
+       param = 100;
+     }
+   else
+     {
+       param = memval*100;
+       if (TotalHeap == 0)
+         {
+           param = 0;
+         }
+       else
+         {
+           param = param / TotalHeap;
+         }
+     }
+   return DynamicStrings_ConCatChar (StringConvert_ctos ((unsigned int ) (param), 3, ' '), '%');
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    DescribePercent - call the appropriate mem or time percentage procedure.
+ */
+ 
+ static DynamicStrings_String DescribePercent (M2Diagnostic_Diagnostic Diag, unsigned int paramno)
+ {
+   switch (Diag->type)
+     {
+       case M2Diagnostic_memdiag:
+         return CreateMemPercent (GetMemParam (Diag, paramno));
+         break;
+ 
+       case M2Diagnostic_timediag:
+         return CreateTimePercent (GetTimeParam (Diag, paramno));
+         break;
+ 
+ 
+       default:
+         CaseException ("../../gcc/m2/gm2-libs/M2Diagnostic.def", 20, 1);
+         __builtin_unreachable ();
+     }
+   return static_cast<DynamicStrings_String> (NULL);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    DescribeMemory - return the memory diagnostic
+ */
+ 
+ static DynamicStrings_String DescribeMemory (M2Diagnostic_Diagnostic Diag, unsigned int paramno)
+ {
+   long unsigned int param;
+   DynamicStrings_String s;
+ 
+   param = GetMemParam (Diag, paramno);
+   if (param < kilo)
+     {
+       s = DynamicStrings_ConCat (StringConvert_LongCardinalToString (param, 0, ' ', 10, false), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) " Bytes", 6)));
+     }
+   else if (param < mega)
+     {
+       /* avoid dangling else.  */
+       param = param / kilo;
+       s = DynamicStrings_ConCat (StringConvert_LongCardinalToString (param, 0, ' ', 10, false), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "KB", 2)));
+     }
+   else
+     {
+       /* avoid dangling else.  */
+       param = param / mega;
+       s = DynamicStrings_ConCat (StringConvert_LongCardinalToString (param, 0, ' ', 10, false), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "MB", 2)));
+     }
+   return s;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    DescribeTime - returns the time diagnostic in seconds.
+ */
+ 
+ static DynamicStrings_String DescribeTime (M2Diagnostic_Diagnostic Diag, unsigned int paramno)
+ {
+   unsigned int sec;
+   unsigned int usec;
+ 
+   switch (Diag->type)
+     {
+       case M2Diagnostic_memdiag:
+         M2RTS_HALT (-1);
+         __builtin_unreachable ();
+         break;
+ 
+       case M2Diagnostic_timediag:
+         Selective_GetTime (GetTimeParam (Diag, paramno), &sec, &usec);
+         return DynamicStrings_ConCat (DynamicStrings_ConCat (StringConvert_LongCardinalToString (static_cast<long unsigned int> (sec), 0, ' ', 10, true), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ".", 1))), DynamicStrings_ConCat (StringConvert_LongCardinalToString (static_cast<long unsigned int> (usec), 6, '0', 10, true), DynamicStrings_Mark (DynamicStrings_InitString ((const char *) " sec", 4))));
+         break;
+ 
+ 
+       default:
+         CaseException ("../../gcc/m2/gm2-libs/M2Diagnostic.def", 20, 1);
+         __builtin_unreachable ();
+     }
+   return static_cast<DynamicStrings_String> (NULL);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    ParamSpec - ebnf:
+ 
+                ( '{' | '0' | '1' | '2' | '3' | '4' )
+                ( 'd' | 'x' | 'C' | 'T' | 'M' | 'N' | 'P' )
+                '}'
+ */
+ 
+ static unsigned int ParamSpec (M2Diagnostic_Diagnostic Diag, unsigned int i)
+ {
+   unsigned int paramno;
+   unsigned int length;
+   char ch;
+ 
+   length = DynamicStrings_Length (Diag->format);
+   paramno = 0;
+   if (i < length)
+     {
+       ch = DynamicStrings_char (Diag->format, static_cast<int> (i));
+       switch (ch)
+         {
+           case '{':
+             Output = DynamicStrings_ConCatChar (Output, '{');
+             return i+1;
+             break;
+ 
+           case '0':
+             paramno = 0;
+             break;
+ 
+           case '1':
+             paramno = 1;
+             break;
+ 
+           case '2':
+             paramno = 2;
+             break;
+ 
+           case '3':
+             paramno = 3;
+             break;
+ 
+           case '4':
+             paramno = 4;
+             break;
+ 
+ 
+           default:
+             Error ((const char *) "unexpected character: ", 22, ch);
+             break;
+         }
+       i += 1;
+       if (i < length)
+         {
+           ch = DynamicStrings_char (Diag->format, static_cast<int> (i));
+           switch (ch)
+             {
+               case 'd':
+                 Output = DynamicStrings_ConCat (Output, Decimal (Diag, paramno));
+                 break;
+ 
+               case 'x':
+                 Output = DynamicStrings_ConCat (Output, Hexadecimal (Diag, paramno));
+                 break;
+ 
+               case 'C':
+                 Output = DynamicStrings_ConCat (Output, Count (Diag, paramno));
+                 break;
+ 
+               case 'M':
+                 Output = DynamicStrings_ConCat (Output, DescribeMemory (Diag, paramno));
+                 break;
+ 
+               case 'N':
+                 Output = DynamicStrings_ConCat (Output, Diag->name);
+                 break;
+ 
+               case 'P':
+                 Output = DynamicStrings_ConCat (Output, DescribePercent (Diag, paramno));
+                 break;
+ 
+               case 'T':
+                 Output = DynamicStrings_ConCat (Output, DescribeTime (Diag, paramno));
+                 break;
+ 
+ 
+               default:
+                 Error ((const char *) "unexpected character: ", 22, ch);
+                 break;
+             }
+           i += 1;
+           if (i < length)
+             {
+               ch = DynamicStrings_char (Diag->format, static_cast<int> (i));
+               if (ch != '}')
+                 {
+                   Error ((const char *) "expected } character, seen ", 27, ch);
+                 }
+             }
+         }
+     }
+   return i+1;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    FormatDiag - ebnf:
+ 
+                 { ( '{' ParamSpec ) | any }
+ */
+ 
+ static void FormatDiag (M2Diagnostic_Diagnostic Diag)
+ {
+   unsigned int i;
+   unsigned int length;
+   char ch;
+ 
+   i = 0;
+   length = DynamicStrings_Length (Diag->format);
+   while (i < length)
+     {
+       ch = DynamicStrings_char (Diag->format, static_cast<int> (i));
+       if (ch == '{')
+         {
+           i += 1;
+           i = ParamSpec (Diag, i);
+         }
+       else
+         {
+           Output = DynamicStrings_ConCatChar (Output, ch);
+           i += 1;
+         }
+     }
+   Output = DynamicStrings_ConCatChar (Output, ASCII_nl);
+ }
+ 
+ 
+ /*
+    InitTimeDiagnostic - create and return a time diagnostic.
+                         The format string can be free form and may
+                         contain {1T}, {1C} or {1P}.
+                         {1T} will contain the time and
+                         {1C} the count of the number of times the
+                         code enters the time diagnostic code region.
+                         {1P} generates the time as a percentage.
+                         {0T} is the total time for the application.
+                         {{ is rendered as a single {.
+ */
+ 
+ extern "C" M2Diagnostic_Diagnostic M2Diagnostic_InitTimeDiagnostic (const char *name_, unsigned int _name_high, const char *format_, unsigned int _format_high)
+ {
+   M2Diagnostic_Diagnostic d;
+   char name[_name_high+1];
+   char format[_format_high+1];
+ 
+   /* make a local copy of each unbounded array.  */
+   memcpy (name, name_, _name_high+1);
+   memcpy (format, format_, _format_high+1);
+ 
+   if (EnableDiagnostics)
+     {
+       Storage_ALLOCATE ((void **) &d, sizeof (M2Diagnostic__T1));
+       d->name = DynamicStrings_InitString ((const char *) name, _name_high);
+       d->format = DynamicStrings_InitString ((const char *) format, _format_high);
+       d->enable = DefaultTimeEnable;
+       d->next = Head;
+       d->type = M2Diagnostic_timediag;
+       switch (d->type)
+         {
+           case M2Diagnostic_timediag:
+             d->tdiag.count = 0;
+             d->tdiag.total = Selective_InitTime (0, 0);
+             d->tdiag.enter = Selective_InitTime (0, 0);
+             d->tdiag.exit_ = Selective_InitTime (0, 0);
+             break;
+ 
+ 
+           default:
+             M2RTS_HALT (-1);
+             __builtin_unreachable ();
+             break;
+         }
+       Head = d;
+       return d;
+     }
+   else
+     {
+       return NULL;
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    EnterDiagnostic - attribute all execution time from now to TimeDiag.
+ */
+ 
+ extern "C" void M2Diagnostic_EnterDiagnostic (M2Diagnostic_Diagnostic TimeDiag)
+ {
+   if (EnableDiagnostics && (TimeDiag != NULL))
+     {
+       Assert (TimeDiag->type == M2Diagnostic_timediag);
+       Assert ((Selective_GetTimeOfDay (TimeDiag->tdiag.enter)) == 0);
+       TimeDiag->tdiag.count += 1;
+     }
+ }
+ 
+ 
+ /*
+    ExitDiagnostic - stop attributing execution time to TimeDiag.
+ */
+ 
+ extern "C" void M2Diagnostic_ExitDiagnostic (M2Diagnostic_Diagnostic TimeDiag)
+ {
+   if (EnableDiagnostics && (TimeDiag != NULL))
+     {
+       Assert (TimeDiag->type == M2Diagnostic_timediag);
+       Assert ((Selective_GetTimeOfDay (TimeDiag->tdiag.exit_)) == 0);
+       Accumulate (TimeDiag->tdiag.total, TimeDiag->tdiag.enter, TimeDiag->tdiag.exit_);
+     }
+ }
+ 
+ 
+ /*
+    InitMemDiagnostic - create and return a memory diagnostic.
+                        The format string can be free form and may
+                        contain {1M} {1d} {1x} {1P}.
+                        {1M} is replaced by the value of the first parameter
+                        with memory size units.
+                        {1d} unsigned decimal.  {1x} unsigned hexadecimal.
+                        {0M} is the global allocation (Storage.mod:ALLOCATE).
+                        {1P} is the percentage of param 1 relative
+                        to global memory.
+ */
+ 
+ extern "C" M2Diagnostic_Diagnostic M2Diagnostic_InitMemDiagnostic (const char *name_, unsigned int _name_high, const char *format_, unsigned int _format_high)
+ {
+   unsigned int i;
+   M2Diagnostic_Diagnostic d;
+   char name[_name_high+1];
+   char format[_format_high+1];
+ 
+   /* make a local copy of each unbounded array.  */
+   memcpy (name, name_, _name_high+1);
+   memcpy (format, format_, _format_high+1);
+ 
+   if (EnableDiagnostics)
+     {
+       Storage_ALLOCATE ((void **) &d, sizeof (M2Diagnostic__T1));
+       d->name = DynamicStrings_InitString ((const char *) name, _name_high);
+       d->format = DynamicStrings_InitString ((const char *) format, _format_high);
+       d->enable = DefaultMemEnable;
+       d->next = Head;
+       d->type = M2Diagnostic_memdiag;
+       switch (d->type)
+         {
+           case M2Diagnostic_memdiag:
+             for (i=1; i<=MaxParam; i++)
+               {
+                 d->mdiag.param.array[i-1] = 0;
+               }
+             break;
+ 
+ 
+           default:
+             M2RTS_HALT (-1);
+             __builtin_unreachable ();
+             break;
+         }
+       Head = d;
+       return d;
+     }
+   else
+     {
+       return NULL;
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    MemIncr - allow the appropriate parameter to be incremented.
+              All parameters are initially set to zero and are stored
+              as LONGCARD.
+ */
+ 
+ extern "C" void M2Diagnostic_MemIncr (M2Diagnostic_Diagnostic MemDiag, unsigned int paramno, unsigned int incr)
+ {
+   if (EnableDiagnostics && (MemDiag != NULL))
+     {
+       CheckParam (paramno);
+       switch (MemDiag->type)
+         {
+           case M2Diagnostic_memdiag:
+             MemDiag->mdiag.param.array[paramno-1] += (long unsigned int ) (incr);
+             break;
+ 
+ 
+           default:
+             M2RTS_HALT (-1);
+             __builtin_unreachable ();
+             break;
+         }
+     }
+ }
+ 
+ 
+ /*
+    MemDecr - allow the appropriate parameter to be decremented.
+              All parameters are initially set to zero and are stored
+              as LONGCARD.
+ */
+ 
+ extern "C" void M2Diagnostic_MemDecr (M2Diagnostic_Diagnostic MemDiag, unsigned int paramno, unsigned int decr)
+ {
+   if (EnableDiagnostics && (MemDiag != NULL))
+     {
+       CheckParam (paramno);
+       switch (MemDiag->type)
+         {
+           case M2Diagnostic_memdiag:
+             MemDiag->mdiag.param.array[paramno-1] -= (long unsigned int ) (decr);
+             break;
+ 
+ 
+           default:
+             M2RTS_HALT (-1);
+             __builtin_unreachable ();
+             break;
+         }
+     }
+ }
+ 
+ 
+ /*
+    MemSet - allow the appropriate parameter to be set to value.
+             All parameters are initially set to zero.
+ */
+ 
+ extern "C" void M2Diagnostic_MemSet (M2Diagnostic_Diagnostic MemDiag, unsigned int paramno, unsigned int value)
+ {
+   if (EnableDiagnostics && (MemDiag != NULL))
+     {
+       CheckParam (paramno);
+       switch (MemDiag->type)
+         {
+           case M2Diagnostic_memdiag:
+             MemDiag->mdiag.param.array[paramno-1] = (long unsigned int ) (value);
+             break;
+ 
+ 
+           default:
+             M2RTS_HALT (-1);
+             __builtin_unreachable ();
+             break;
+         }
+     }
+ }
+ 
+ 
+ /*
+    TotalHeapIncr - increments the total heap used.
+ */
+ 
+ extern "C" void M2Diagnostic_TotalHeapIncr (unsigned int incr)
+ {
+   if (EnableDiagnostics)
+     {
+       TotalHeap = TotalHeap+((long unsigned int ) (incr));
+     }
+ }
+ 
+ 
+ /*
+    TotalHeapDecr - decrements the total heap used.
+ */
+ 
+ extern "C" void M2Diagnostic_TotalHeapDecr (unsigned int incr)
+ {
+   if (EnableDiagnostics)
+     {
+       TotalHeap = TotalHeap-((long unsigned int ) (incr));
+     }
+ }
+ 
+ 
+ /*
+    SetEnable - set the enable flag in Diag to value.
+ */
+ 
+ extern "C" void M2Diagnostic_SetEnable (M2Diagnostic_Diagnostic Diag, bool value)
+ {
+   if (EnableDiagnostics && (Diag != NULL))
+     {
+       Diag->enable = value;
+     }
+ }
+ 
+ 
+ /*
+    Lookup - returns the Diagnostic containing name or NIL
+             if it does not exist.
+ */
+ 
+ extern "C" M2Diagnostic_Diagnostic M2Diagnostic_Lookup (const char *name_, unsigned int _name_high)
+ {
+   M2Diagnostic_Diagnostic ptr;
+   DynamicStrings_String s;
+   char name[_name_high+1];
+ 
+   /* make a local copy of each unbounded array.  */
+   memcpy (name, name_, _name_high+1);
+ 
+   if (EnableDiagnostics)
+     {
+       s = DynamicStrings_InitString ((const char *) name, _name_high);
+       ptr = Head;
+       while (ptr != NULL)
+         {
+           if (DynamicStrings_Equal (ptr->name, s))
+             {
+               s = DynamicStrings_KillString (s);
+               return ptr;
+             }
+           ptr = ptr->next;
+         }
+       s = DynamicStrings_KillString (s);
+       return NULL;
+     }
+   else
+     {
+       return NULL;
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    GetName - returns the name of Diag.
+ */
+ 
+ extern "C" DynamicStrings_String M2Diagnostic_GetName (M2Diagnostic_Diagnostic Diag)
+ {
+   if (EnableDiagnostics && (Diag != NULL))
+     {
+       return Diag->name;
+     }
+   else
+     {
+       return static_cast<DynamicStrings_String> (NULL);
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    ForeachDiagDo - for diag in global diag list do
+                       dp (diag);
+                    end
+ */
+ 
+ extern "C" void M2Diagnostic_ForeachDiagDo (M2Diagnostic_DiagProc dp)
+ {
+   M2Diagnostic_Diagnostic ptr;
+ 
+   ptr = Head;
+   while (ptr != NULL)
+     {
+       (*dp.proc) (ptr);
+       ptr = ptr->next;
+     }
+ }
+ 
+ 
+ /*
+    SetDefaultConfig - force the Diag enable flag to the
+                       time or mem global default.
+ */
+ 
+ extern "C" void M2Diagnostic_SetDefaultConfig (M2Diagnostic_Diagnostic Diag)
+ {
+   if (Diag->type == M2Diagnostic_timediag)
+     {
+       Diag->enable = DefaultTimeEnable;
+     }
+   else
+     {
+       Diag->enable = DefaultMemEnable;
+     }
+ }
+ 
+ 
+ /*
+    Configure - will turn on or off all the memory or time
+                instrumentation diagnostics and set the defaults
+                time and mem values.
+ */
+ 
+ extern "C" void M2Diagnostic_Configure (bool time_, bool mem)
+ {
+   if (EnableDiagnostics)
+     {
+       DefaultTimeEnable = time_;
+       DefaultMemEnable = mem;
+       M2Diagnostic_ForeachDiagDo ((M2Diagnostic_DiagProc) {(M2Diagnostic_DiagProc_t) M2Diagnostic_SetDefaultConfig});
+     }
+ }
+ 
+ 
+ /*
+    Generate - return a string containing the output from
+               all the diagnostics enabled.
+ */
+ 
+ extern "C" DynamicStrings_String M2Diagnostic_Generate (void)
+ {
+   if (EnableDiagnostics)
+     {
+       Output = DynamicStrings_KillString (Output);
+       Output = DynamicStrings_InitString ((const char *) "", 0);
+       M2Diagnostic_ForeachDiagDo ((M2Diagnostic_DiagProc) {(M2Diagnostic_DiagProc_t) FormatDiag});
+       return Output;
+     }
+   else
+     {
+       return static_cast<DynamicStrings_String> (NULL);
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ extern "C" void _M2_M2Diagnostic_init (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[])
+ {
+   TotalHeap = 0;
+   StartTime = NULL;
+   TotalTime = NULL;
+   CreateStartTime ();
+   Head = NULL;
+   Output = static_cast<DynamicStrings_String> (NULL);
+   DefaultTimeEnable = DefaultTimeEnableValue;
+   DefaultMemEnable = DefaultMemEnableValue;
+ }
+ 
+ extern "C" void _M2_M2Diagnostic_fini (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[])
+ {
+ }
diff -Nrcpad gcc-16-20250914/gcc/m2/pge-boot/GM2Diagnostic.h gcc-16-20250921/gcc/m2/pge-boot/GM2Diagnostic.h
*** gcc-16-20250914/gcc/m2/pge-boot/GM2Diagnostic.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/m2/pge-boot/GM2Diagnostic.h	Sun Sep 21 22:32:38 2025
***************
*** 0 ****
--- 1,186 ----
+ /* do not edit automatically generated by mc from M2Diagnostic.  */
+ /* M2Diagnotic provides memory and time diagnosics to the user.
+ 
+ Copyright (C) 2024 Free Software Foundation, Inc.
+ Contributed by Gaius Mulley <gaiusmod2@gmail.com>.
+ 
+ This file is part of GNU Modula-2.
+ 
+ GNU Modula-2 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.
+ 
+ GNU Modula-2 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 GNU Modula-2; see the file COPYING3.  If not see
+ <http://www.gnu.org/licenses/>.  */
+ 
+ 
+ #if !defined (_M2Diagnostic_H)
+ #   define _M2Diagnostic_H
+ 
+ #include "config.h"
+ #include "system.h"
+ #   ifdef __cplusplus
+ extern "C" {
+ #   endif
+ #include <stdbool.h>
+ #   if !defined (PROC_D)
+ #      define PROC_D
+        typedef void (*PROC_t) (void);
+        typedef struct { PROC_t proc; } PROC;
+ #   endif
+ 
+ #   include "GDynamicStrings.h"
+ 
+ #   if defined (_M2Diagnostic_C)
+ #      define EXTERN
+ #   else
+ #      define EXTERN extern
+ #   endif
+ 
+ #if !defined (M2Diagnostic_Diagnostic_D)
+ #  define M2Diagnostic_Diagnostic_D
+    typedef void *M2Diagnostic_Diagnostic;
+ #endif
+ 
+ typedef struct M2Diagnostic_DiagProc_p M2Diagnostic_DiagProc;
+ 
+ typedef void (*M2Diagnostic_DiagProc_t) (M2Diagnostic_Diagnostic);
+ struct M2Diagnostic_DiagProc_p { M2Diagnostic_DiagProc_t proc; };
+ 
+ 
+ /*
+    InitTimeDiagnostic - create and return a time diagnostic.
+                         The format string can be free form and may
+                         contain {1T}, {1C} or {1P}.
+                         {1T} will contain the time and
+                         {1C} the count of the number of times the
+                         code enters the time diagnostic code region.
+                         {1P} generates the time as a percentage.
+                         {0T} is the total time for the application.
+                         {{ is rendered as a single {.
+ */
+ 
+ EXTERN M2Diagnostic_Diagnostic M2Diagnostic_InitTimeDiagnostic (const char *name_, unsigned int _name_high, const char *format_, unsigned int _format_high);
+ 
+ /*
+    EnterDiagnostic - attribute all execution time from now to TimeDiag.
+ */
+ 
+ EXTERN void M2Diagnostic_EnterDiagnostic (M2Diagnostic_Diagnostic TimeDiag);
+ 
+ /*
+    ExitDiagnostic - stop attributing execution time to TimeDiag.
+ */
+ 
+ EXTERN void M2Diagnostic_ExitDiagnostic (M2Diagnostic_Diagnostic TimeDiag);
+ 
+ /*
+    InitMemDiagnostic - create and return a memory diagnostic.
+                        The format string can be free form and may
+                        contain {1M} {1d} {1x} {1P}.
+                        {1M} is replaced by the value of the first parameter
+                        with memory size units.
+                        {1d} unsigned decimal.  {1x} unsigned hexadecimal.
+                        {0M} is the global allocation (Storage.mod:ALLOCATE).
+                        {1P} is the percentage of param 1 relative
+                        to global memory.
+ */
+ 
+ EXTERN M2Diagnostic_Diagnostic M2Diagnostic_InitMemDiagnostic (const char *name_, unsigned int _name_high, const char *format_, unsigned int _format_high);
+ 
+ /*
+    MemIncr - allow the appropriate parameter to be incremented.
+              All parameters are initially set to zero and are stored
+              as LONGCARD.
+ */
+ 
+ EXTERN void M2Diagnostic_MemIncr (M2Diagnostic_Diagnostic MemDiag, unsigned int paramno, unsigned int incr);
+ 
+ /*
+    MemDecr - allow the appropriate parameter to be decremented.
+              All parameters are initially set to zero and are stored
+              as LONGCARD.
+ */
+ 
+ EXTERN void M2Diagnostic_MemDecr (M2Diagnostic_Diagnostic MemDiag, unsigned int paramno, unsigned int decr);
+ 
+ /*
+    MemSet - allow the appropriate parameter to be set to value.
+             All parameters are initially set to zero.
+ */
+ 
+ EXTERN void M2Diagnostic_MemSet (M2Diagnostic_Diagnostic MemDiag, unsigned int paramno, unsigned int value);
+ 
+ /*
+    TotalHeapIncr - increments the total heap used.
+ */
+ 
+ EXTERN void M2Diagnostic_TotalHeapIncr (unsigned int incr);
+ 
+ /*
+    TotalHeapDecr - decrements the total heap used.
+ */
+ 
+ EXTERN void M2Diagnostic_TotalHeapDecr (unsigned int incr);
+ 
+ /*
+    SetEnable - set the enable flag in Diag to value.
+ */
+ 
+ EXTERN void M2Diagnostic_SetEnable (M2Diagnostic_Diagnostic Diag, bool value);
+ 
+ /*
+    Lookup - returns the Diagnostic containing name or NIL
+             if it does not exist.
+ */
+ 
+ EXTERN M2Diagnostic_Diagnostic M2Diagnostic_Lookup (const char *name_, unsigned int _name_high);
+ 
+ /*
+    GetName - returns the name of Diag.
+ */
+ 
+ EXTERN DynamicStrings_String M2Diagnostic_GetName (M2Diagnostic_Diagnostic Diag);
+ 
+ /*
+    ForeachDiagDo - for diag in global diag list do
+                       dp (diag);
+                    end
+ */
+ 
+ EXTERN void M2Diagnostic_ForeachDiagDo (M2Diagnostic_DiagProc dp);
+ 
+ /*
+    SetDefaultConfig - force the Diag enable flag to the
+                       time or mem global default.
+ */
+ 
+ EXTERN void M2Diagnostic_SetDefaultConfig (M2Diagnostic_Diagnostic Diag);
+ 
+ /*
+    Configure - will turn on or off all the memory or time
+                instrumentation diagnostics and set the defaults
+                time and mem values.
+ */
+ 
+ EXTERN void M2Diagnostic_Configure (bool time_, bool mem);
+ 
+ /*
+    Generate - return a string containing the output from
+               all the diagnostics enabled.
+ */
+ 
+ EXTERN DynamicStrings_String M2Diagnostic_Generate (void);
+ #   ifdef __cplusplus
+ }
+ #   endif
+ 
+ #   undef EXTERN
+ #endif
diff -Nrcpad gcc-16-20250914/gcc/m2/pge-boot/GSelective.h gcc-16-20250921/gcc/m2/pge-boot/GSelective.h
*** gcc-16-20250914/gcc/m2/pge-boot/GSelective.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/m2/pge-boot/GSelective.h	Sun Sep 21 22:32:38 2025
***************
*** 0 ****
--- 1,83 ----
+ /* do not edit automatically generated by mc from Selective.  */
+ /* Selective.def provides Modula-2 with access to the select(2) primitive.
+ 
+ Copyright (C) 2001-2024 Free Software Foundation, Inc.
+ Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
+ 
+ This file is part of GNU Modula-2.
+ 
+ GNU Modula-2 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.
+ 
+ GNU Modula-2 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/>.  */
+ 
+ 
+ #if !defined (_Selective_H)
+ #   define _Selective_H
+ 
+ #include "config.h"
+ #include "system.h"
+ #   ifdef __cplusplus
+ extern "C" {
+ #   endif
+ #include <stdbool.h>
+ #   if !defined (PROC_D)
+ #      define PROC_D
+        typedef void (*PROC_t) (void);
+        typedef struct { PROC_t proc; } PROC;
+ #   endif
+ 
+ #   include "GSYSTEM.h"
+ 
+ #   if defined (_Selective_C)
+ #      define EXTERN
+ #   else
+ #      define EXTERN extern
+ #   endif
+ 
+ typedef void *Selective_SetOfFd;
+ 
+ typedef void *Selective_Timeval;
+ 
+ EXTERN int Selective_Select (unsigned int nooffds, Selective_SetOfFd readfds, Selective_SetOfFd writefds, Selective_SetOfFd exceptfds, Selective_Timeval timeout);
+ EXTERN Selective_Timeval Selective_InitTime (unsigned int sec, unsigned int usec);
+ EXTERN Selective_Timeval Selective_KillTime (Selective_Timeval t);
+ EXTERN void Selective_GetTime (Selective_Timeval t, unsigned int *sec, unsigned int *usec);
+ EXTERN void Selective_SetTime (Selective_Timeval t, unsigned int sec, unsigned int usec);
+ EXTERN Selective_SetOfFd Selective_InitSet (void);
+ EXTERN Selective_SetOfFd Selective_KillSet (Selective_SetOfFd s);
+ EXTERN void Selective_FdZero (Selective_SetOfFd s);
+ EXTERN void Selective_FdSet (int fd, Selective_SetOfFd s);
+ EXTERN void Selective_FdClr (int fd, Selective_SetOfFd s);
+ EXTERN bool Selective_FdIsSet (int fd, Selective_SetOfFd s);
+ EXTERN int Selective_MaxFdsPlusOne (int a, int b);
+ EXTERN void Selective_WriteCharRaw (int fd, char ch);
+ EXTERN char Selective_ReadCharRaw (int fd);
+ 
+ /*
+    GetTimeOfDay - fills in a record, Timeval, filled in with the
+                   current system time in seconds and microseconds.
+                   It returns zero (see man 3p gettimeofday)
+ */
+ 
+ EXTERN int Selective_GetTimeOfDay (Selective_Timeval tv);
+ #   ifdef __cplusplus
+ }
+ #   endif
+ 
+ #   undef EXTERN
+ #endif
diff -Nrcpad gcc-16-20250914/gcc/m2/pge-boot/GStringConvert.cc gcc-16-20250921/gcc/m2/pge-boot/GStringConvert.cc
*** gcc-16-20250914/gcc/m2/pge-boot/GStringConvert.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/m2/pge-boot/GStringConvert.cc	Sun Sep 21 22:32:38 2025
***************
*** 0 ****
--- 1,2006 ----
+ /* do not edit automatically generated by mc from StringConvert.  */
+ /* StringConvert.mod provides functions to convert numbers to and from strings.
+ 
+ Copyright (C) 2001-2023 Free Software Foundation, Inc.
+ Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
+ 
+ This file is part of GNU Modula-2.
+ 
+ GNU Modula-2 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.
+ 
+ GNU Modula-2 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 <stdbool.h>
+ #   if !defined (PROC_D)
+ #      define PROC_D
+        typedef void (*PROC_t) (void);
+        typedef struct { PROC_t proc; } PROC;
+ #   endif
+ 
+ #   if !defined (TRUE)
+ #      define TRUE (1==1)
+ #   endif
+ 
+ #   if !defined (FALSE)
+ #      define FALSE (1==0)
+ #   endif
+ 
+ #include <stddef.h>
+ #include <string.h>
+ #include <limits.h>
+ #include <stdlib.h>
+ #if defined(__cplusplus)
+ #   undef NULL
+ #   define NULL 0
+ #endif
+ #define _StringConvert_H
+ #define _StringConvert_C
+ 
+ #   include "GSYSTEM.h"
+ #   include "Glibc.h"
+ #   include "Glibm.h"
+ #   include "GM2RTS.h"
+ #   include "GDynamicStrings.h"
+ #   include "Gldtoa.h"
+ #   include "Gdtoa.h"
+ 
+ 
+ /*
+    IntegerToString - converts INTEGER, i, into a String. The field with can be specified
+                      if non zero. Leading characters are defined by padding and this
+                      function will prepend a + if sign is set to TRUE.
+                      The base allows the caller to generate binary, octal, decimal, hexidecimal
+                      numbers. The value of lower is only used when hexidecimal numbers are
+                      generated and if TRUE then digits abcdef are used, and if FALSE then ABCDEF
+                      are used.
+ */
+ 
+ extern "C" DynamicStrings_String StringConvert_IntegerToString (int i, unsigned int width, char padding, bool sign, unsigned int base, bool lower);
+ 
+ /*
+    CardinalToString - converts CARDINAL, c, into a String. The field with can be specified
+                       if non zero. Leading characters are defined by padding.
+                       The base allows the caller to generate binary, octal, decimal, hexidecimal
+                       numbers. The value of lower is only used when hexidecimal numbers are
+                       generated and if TRUE then digits abcdef are used, and if FALSE then ABCDEF
+                       are used.
+ */
+ 
+ extern "C" DynamicStrings_String StringConvert_CardinalToString (unsigned int c, unsigned int width, char padding, unsigned int base, bool lower);
+ 
+ /*
+    StringToInteger - converts a string, s, of, base, into an INTEGER.
+                      Leading white space is ignored. It stops converting
+                      when either the string is exhausted or if an illegal
+                      numeral is found.
+                      The parameter found is set TRUE if a number was found.
+ */
+ 
+ extern "C" int StringConvert_StringToInteger (DynamicStrings_String s, unsigned int base, bool *found);
+ 
+ /*
+    StringToCardinal - converts a string, s, of, base, into a CARDINAL.
+                       Leading white space is ignored. It stops converting
+                       when either the string is exhausted or if an illegal
+                       numeral is found.
+                       The parameter found is set TRUE if a number was found.
+ */
+ 
+ extern "C" unsigned int StringConvert_StringToCardinal (DynamicStrings_String s, unsigned int base, bool *found);
+ 
+ /*
+    LongIntegerToString - converts LONGINT, i, into a String. The field with
+                          can be specified if non zero. Leading characters
+                          are defined by padding and this function will
+                          prepend a + if sign is set to TRUE.
+                          The base allows the caller to generate binary,
+                          octal, decimal, hexidecimal numbers.
+                          The value of lower is only used when hexidecimal
+                          numbers are generated and if TRUE then digits
+                          abcdef are used, and if FALSE then ABCDEF are used.
+ */
+ 
+ extern "C" DynamicStrings_String StringConvert_LongIntegerToString (long int i, unsigned int width, char padding, bool sign, unsigned int base, bool lower);
+ 
+ /*
+    StringToLongInteger - converts a string, s, of, base, into an LONGINT.
+                          Leading white space is ignored. It stops converting
+                          when either the string is exhausted or if an illegal
+                          numeral is found.
+                          The parameter found is set TRUE if a number was found.
+ */
+ 
+ extern "C" long int StringConvert_StringToLongInteger (DynamicStrings_String s, unsigned int base, bool *found);
+ 
+ /*
+    LongCardinalToString - converts LONGCARD, c, into a String. The field
+                           width can be specified if non zero. Leading
+                           characters are defined by padding.
+                           The base allows the caller to generate binary,
+                           octal, decimal, hexidecimal numbers.
+                           The value of lower is only used when hexidecimal
+                           numbers are generated and if TRUE then digits
+                           abcdef are used, and if FALSE then ABCDEF are used.
+ */
+ 
+ extern "C" DynamicStrings_String StringConvert_LongCardinalToString (long unsigned int c, unsigned int width, char padding, unsigned int base, bool lower);
+ 
+ /*
+    StringToLongCardinal - converts a string, s, of, base, into a LONGCARD.
+                           Leading white space is ignored. It stops converting
+                           when either the string is exhausted or if an illegal
+                           numeral is found.
+                           The parameter found is set TRUE if a number was found.
+ */
+ 
+ extern "C" long unsigned int StringConvert_StringToLongCardinal (DynamicStrings_String s, unsigned int base, bool *found);
+ 
+ /*
+    ShortCardinalToString - converts SHORTCARD, c, into a String. The field
+                           width can be specified if non zero. Leading
+                           characters are defined by padding.
+                           The base allows the caller to generate binary,
+                           octal, decimal, hexidecimal numbers.
+                           The value of lower is only used when hexidecimal
+                           numbers are generated and if TRUE then digits
+                           abcdef are used, and if FALSE then ABCDEF are used.
+ */
+ 
+ extern "C" DynamicStrings_String StringConvert_ShortCardinalToString (short unsigned int c, unsigned int width, char padding, unsigned int base, bool lower);
+ 
+ /*
+    StringToShortCardinal - converts a string, s, of, base, into a SHORTCARD.
+                            Leading white space is ignored. It stops converting
+                            when either the string is exhausted or if an illegal
+                            numeral is found.
+                            The parameter found is set TRUE if a number was found.
+ */
+ 
+ extern "C" short unsigned int StringConvert_StringToShortCardinal (DynamicStrings_String s, unsigned int base, bool *found);
+ 
+ /*
+    stoi - decimal string to INTEGER
+ */
+ 
+ extern "C" int StringConvert_stoi (DynamicStrings_String s);
+ 
+ /*
+    itos - integer to decimal string.
+ */
+ 
+ extern "C" DynamicStrings_String StringConvert_itos (int i, unsigned int width, char padding, bool sign);
+ 
+ /*
+    ctos - cardinal to decimal string.
+ */
+ 
+ extern "C" DynamicStrings_String StringConvert_ctos (unsigned int c, unsigned int width, char padding);
+ 
+ /*
+    stoc - decimal string to CARDINAL
+ */
+ 
+ extern "C" unsigned int StringConvert_stoc (DynamicStrings_String s);
+ 
+ /*
+    hstoi - hexidecimal string to INTEGER
+ */
+ 
+ extern "C" int StringConvert_hstoi (DynamicStrings_String s);
+ 
+ /*
+    ostoi - octal string to INTEGER
+ */
+ 
+ extern "C" int StringConvert_ostoi (DynamicStrings_String s);
+ 
+ /*
+    bstoi - binary string to INTEGER
+ */
+ 
+ extern "C" int StringConvert_bstoi (DynamicStrings_String s);
+ 
+ /*
+    hstoc - hexidecimal string to CARDINAL
+ */
+ 
+ extern "C" unsigned int StringConvert_hstoc (DynamicStrings_String s);
+ 
+ /*
+    ostoc - octal string to CARDINAL
+ */
+ 
+ extern "C" unsigned int StringConvert_ostoc (DynamicStrings_String s);
+ 
+ /*
+    bstoc - binary string to CARDINAL
+ */
+ 
+ extern "C" unsigned int StringConvert_bstoc (DynamicStrings_String s);
+ 
+ /*
+    StringToLongreal - returns a LONGREAL and sets found to TRUE if a legal number is seen.
+ */
+ 
+ extern "C" long double StringConvert_StringToLongreal (DynamicStrings_String s, bool *found);
+ 
+ /*
+    LongrealToString - converts a LONGREAL number, Real, which has,
+                       TotalWidth, and FractionWidth into a string.
+                       It uses decimal notation.
+ 
+                       So for example:
+ 
+                       LongrealToString(1.0, 4, 2)  -> '1.00'
+                       LongrealToString(12.3, 5, 2) -> '12.30'
+                       LongrealToString(12.3, 6, 2) -> ' 12.30'
+                       LongrealToString(12.3, 6, 3) -> '12.300'
+ 
+                       if total width is too small then the fraction
+                       becomes truncated.
+ 
+                       LongrealToString(12.3, 5, 3) -> '12.30'
+ 
+                       Positive numbers do not have a '+' prepended.
+                       Negative numbers will have a '-' prepended and
+                       the TotalWidth will need to be large enough
+                       to contain the sign, whole number, '.' and
+                       fractional components.
+ */
+ 
+ extern "C" DynamicStrings_String StringConvert_LongrealToString (long double x, unsigned int TotalWidth, unsigned int FractionWidth);
+ 
+ /*
+    stor - returns a REAL given a string.
+ */
+ 
+ extern "C" double StringConvert_stor (DynamicStrings_String s);
+ 
+ /*
+    stolr - returns a LONGREAL given a string.
+ */
+ 
+ extern "C" long double StringConvert_stolr (DynamicStrings_String s);
+ 
+ /*
+    ToSigFig - returns a floating point or base 10 integer
+               string which is accurate to, n, significant
+               figures.  It will return a new String
+               and, s, will be destroyed.
+ 
+ 
+               So:  12.345
+ 
+               rounded to the following significant figures yields
+ 
+               5      12.345
+               4      12.34
+               3      12.3
+               2      12
+               1      10
+ */
+ 
+ extern "C" DynamicStrings_String StringConvert_ToSigFig (DynamicStrings_String s, unsigned int n);
+ 
+ /*
+    ToDecimalPlaces - returns a floating point or base 10 integer
+                      string which is accurate to, n, decimal
+                      places.  It will return a new String
+                      and, s, will be destroyed.
+                      Decimal places yields, n, digits after
+                      the .
+ 
+                      So:  12.345
+ 
+                      rounded to the following decimal places yields
+ 
+                      5      12.34500
+                      4      12.3450
+                      3      12.345
+                      2      12.34
+                      1      12.3
+ */
+ 
+ extern "C" DynamicStrings_String StringConvert_ToDecimalPlaces (DynamicStrings_String s, unsigned int n);
+ 
+ /*
+    Assert - implement a simple assert.
+ */
+ 
+ static void Assert (bool b, const char *file_, unsigned int _file_high, unsigned int line, const char *func_, unsigned int _func_high);
+ 
+ /*
+    Max -
+ */
+ 
+ static unsigned int Max (unsigned int a, unsigned int b);
+ 
+ /*
+    Min -
+ */
+ 
+ static unsigned int Min (unsigned int a, unsigned int b);
+ 
+ /*
+    LongMin - returns the smallest LONGCARD
+ */
+ 
+ static long unsigned int LongMin (long unsigned int a, long unsigned int b);
+ 
+ /*
+    IsDigit - returns TRUE if, ch, lies between '0'..'9'.
+ */
+ 
+ static bool IsDigit (char ch);
+ 
+ /*
+    IsDecimalDigitValid - returns the TRUE if, ch, is a base legal decimal digit.
+                          If legal then the value is appended numerically onto, c.
+ */
+ 
+ static bool IsDecimalDigitValid (char ch, unsigned int base, unsigned int *c);
+ 
+ /*
+    IsHexidecimalDigitValid - returns the TRUE if, ch, is a base legal hexidecimal digit.
+                              If legal then the value is appended numerically onto, c.
+ */
+ 
+ static bool IsHexidecimalDigitValid (char ch, unsigned int base, unsigned int *c);
+ 
+ /*
+    IsDecimalDigitValidLong - returns the TRUE if, ch, is a base legal decimal digit.
+                              If legal then the value is appended numerically onto, c.
+ */
+ 
+ static bool IsDecimalDigitValidLong (char ch, unsigned int base, long unsigned int *c);
+ 
+ /*
+    IsHexidecimalDigitValidLong - returns the TRUE if, ch, is a base legal hexidecimal digit.
+                                  If legal then the value is appended numerically onto, c.
+ */
+ 
+ static bool IsHexidecimalDigitValidLong (char ch, unsigned int base, long unsigned int *c);
+ 
+ /*
+    IsDecimalDigitValidShort - returns the TRUE if, ch, is a base legal decimal digit.
+                               If legal then the value is appended numerically onto, c.
+ */
+ 
+ static bool IsDecimalDigitValidShort (char ch, unsigned int base, short unsigned int *c);
+ 
+ /*
+    IsHexidecimalDigitValidShort - returns the TRUE if, ch, is a base legal hexidecimal digit.
+                                   If legal then the value is appended numerically onto, c.
+ */
+ 
+ static bool IsHexidecimalDigitValidShort (char ch, unsigned int base, short unsigned int *c);
+ 
+ /*
+    ToThePower10 - returns a LONGREAL containing the value of v * 10^power.
+ */
+ 
+ static long double ToThePower10 (long double v, int power);
+ 
+ /*
+    DetermineSafeTruncation - we wish to use TRUNC when converting REAL/LONGREAL
+                              into a string for the non fractional component.
+                              However we need a simple method to
+                              determine the maximum safe truncation value.
+ */
+ 
+ static unsigned int DetermineSafeTruncation (void);
+ 
+ /*
+    rtos -
+ */
+ 
+ static DynamicStrings_String rtos (double r, unsigned int TotalWidth, unsigned int FractionWidth);
+ 
+ /*
+    lrtos -
+ */
+ 
+ static DynamicStrings_String lrtos (long double r, unsigned int TotalWidth, unsigned int FractionWidth);
+ 
+ /*
+    doDecimalPlaces - returns a string which is accurate to
+                      n decimal places.  It returns a new String
+                      and, s, will be destroyed.
+ */
+ 
+ static DynamicStrings_String doDecimalPlaces (DynamicStrings_String s, unsigned int n);
+ 
+ /*
+    doSigFig - returns a string which is accurate to
+               n decimal places.  It returns a new String
+               and, s, will be destroyed.
+ */
+ 
+ static DynamicStrings_String doSigFig (DynamicStrings_String s, unsigned int n);
+ 
+ /*
+    carryOne - add a carry at position, i.
+ */
+ 
+ static DynamicStrings_String carryOne (DynamicStrings_String s, unsigned int i);
+ 
+ 
+ /*
+    Assert - implement a simple assert.
+ */
+ 
+ static void Assert (bool b, const char *file_, unsigned int _file_high, unsigned int line, const char *func_, unsigned int _func_high)
+ {
+   char file[_file_high+1];
+   char func[_func_high+1];
+ 
+   /* make a local copy of each unbounded array.  */
+   memcpy (file, file_, _file_high+1);
+   memcpy (func, func_, _func_high+1);
+ 
+   if (! b)
+     {
+       M2RTS_ErrorMessage ((const char *) "assert failed", 13, (const char *) file, _file_high, line, (const char *) func, _func_high);
+     }
+ }
+ 
+ 
+ /*
+    Max -
+ */
+ 
+ static unsigned int Max (unsigned int a, unsigned int b)
+ {
+   if (a > b)
+     {
+       return a;
+     }
+   else
+     {
+       return b;
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    Min -
+ */
+ 
+ static unsigned int Min (unsigned int a, unsigned int b)
+ {
+   if (a < b)
+     {
+       return a;
+     }
+   else
+     {
+       return b;
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    LongMin - returns the smallest LONGCARD
+ */
+ 
+ static long unsigned int LongMin (long unsigned int a, long unsigned int b)
+ {
+   if (a < b)
+     {
+       return a;
+     }
+   else
+     {
+       return b;
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    IsDigit - returns TRUE if, ch, lies between '0'..'9'.
+ */
+ 
+ static bool IsDigit (char ch)
+ {
+   return (ch >= '0') && (ch <= '9');
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    IsDecimalDigitValid - returns the TRUE if, ch, is a base legal decimal digit.
+                          If legal then the value is appended numerically onto, c.
+ */
+ 
+ static bool IsDecimalDigitValid (char ch, unsigned int base, unsigned int *c)
+ {
+   if ((IsDigit (ch)) && (( ((unsigned int) (ch))- ((unsigned int) ('0'))) < base))
+     {
+       (*c) = ((*c)*base)+( ((unsigned int) (ch))- ((unsigned int) ('0')));
+       return true;
+     }
+   else
+     {
+       return false;
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    IsHexidecimalDigitValid - returns the TRUE if, ch, is a base legal hexidecimal digit.
+                              If legal then the value is appended numerically onto, c.
+ */
+ 
+ static bool IsHexidecimalDigitValid (char ch, unsigned int base, unsigned int *c)
+ {
+   if (((ch >= 'a') && (ch <= 'f')) && ((( ((unsigned int) (ch))- ((unsigned int) ('a')))+10) < base))
+     {
+       (*c) = ((*c)*base)+(( ((unsigned int) (ch))- ((unsigned int) ('a')))+10);
+       return true;
+     }
+   else if (((ch >= 'A') && (ch <= 'F')) && ((( ((unsigned int) (ch))- ((unsigned int) ('F')))+10) < base))
+     {
+       /* avoid dangling else.  */
+       (*c) = ((*c)*base)+(( ((unsigned int) (ch))- ((unsigned int) ('A')))+10);
+       return true;
+     }
+   else
+     {
+       /* avoid dangling else.  */
+       return false;
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    IsDecimalDigitValidLong - returns the TRUE if, ch, is a base legal decimal digit.
+                              If legal then the value is appended numerically onto, c.
+ */
+ 
+ static bool IsDecimalDigitValidLong (char ch, unsigned int base, long unsigned int *c)
+ {
+   if ((IsDigit (ch)) && (( ((unsigned int) (ch))- ((unsigned int) ('0'))) < base))
+     {
+       (*c) = (*c)*((long unsigned int ) (base+( ((unsigned int) (ch))- ((unsigned int) ('0')))));
+       return true;
+     }
+   else
+     {
+       return false;
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    IsHexidecimalDigitValidLong - returns the TRUE if, ch, is a base legal hexidecimal digit.
+                                  If legal then the value is appended numerically onto, c.
+ */
+ 
+ static bool IsHexidecimalDigitValidLong (char ch, unsigned int base, long unsigned int *c)
+ {
+   if (((ch >= 'a') && (ch <= 'f')) && ((( ((unsigned int) (ch))- ((unsigned int) ('a')))+10) < base))
+     {
+       (*c) = (*c)*((long unsigned int ) (base+(( ((unsigned int) (ch))- ((unsigned int) ('a')))+10)));
+       return true;
+     }
+   else if (((ch >= 'A') && (ch <= 'F')) && ((( ((unsigned int) (ch))- ((unsigned int) ('F')))+10) < base))
+     {
+       /* avoid dangling else.  */
+       (*c) = (*c)*((long unsigned int ) (base+(( ((unsigned int) (ch))- ((unsigned int) ('A')))+10)));
+       return true;
+     }
+   else
+     {
+       /* avoid dangling else.  */
+       return false;
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    IsDecimalDigitValidShort - returns the TRUE if, ch, is a base legal decimal digit.
+                               If legal then the value is appended numerically onto, c.
+ */
+ 
+ static bool IsDecimalDigitValidShort (char ch, unsigned int base, short unsigned int *c)
+ {
+   if ((IsDigit (ch)) && (( ((unsigned int) (ch))- ((unsigned int) ('0'))) < base))
+     {
+       (*c) = (*c)*((short unsigned int ) (base+( ((unsigned int) (ch))- ((unsigned int) ('0')))));
+       return true;
+     }
+   else
+     {
+       return false;
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    IsHexidecimalDigitValidShort - returns the TRUE if, ch, is a base legal hexidecimal digit.
+                                   If legal then the value is appended numerically onto, c.
+ */
+ 
+ static bool IsHexidecimalDigitValidShort (char ch, unsigned int base, short unsigned int *c)
+ {
+   if (((ch >= 'a') && (ch <= 'f')) && ((( ((unsigned int) (ch))- ((unsigned int) ('a')))+10) < base))
+     {
+       (*c) = (*c)*((short unsigned int ) (base+(( ((unsigned int) (ch))- ((unsigned int) ('a')))+10)));
+       return true;
+     }
+   else if (((ch >= 'A') && (ch <= 'F')) && ((( ((unsigned int) (ch))- ((unsigned int) ('F')))+10) < base))
+     {
+       /* avoid dangling else.  */
+       (*c) = (*c)*((short unsigned int ) (base+(( ((unsigned int) (ch))- ((unsigned int) ('A')))+10)));
+       return true;
+     }
+   else
+     {
+       /* avoid dangling else.  */
+       return false;
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    ToThePower10 - returns a LONGREAL containing the value of v * 10^power.
+ */
+ 
+ static long double ToThePower10 (long double v, int power)
+ {
+   int i;
+ 
+   i = 0;
+   if (power > 0)
+     {
+       while (i < power)
+         {
+           v = v*10.0;
+           i += 1;
+         }
+     }
+   else
+     {
+       while (i > power)
+         {
+           v = v/10.0;
+           i -= 1;
+         }
+     }
+   return v;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    DetermineSafeTruncation - we wish to use TRUNC when converting REAL/LONGREAL
+                              into a string for the non fractional component.
+                              However we need a simple method to
+                              determine the maximum safe truncation value.
+ */
+ 
+ static unsigned int DetermineSafeTruncation (void)
+ {
+   double MaxPowerOfTen;
+   unsigned int LogPower;
+ 
+   MaxPowerOfTen = static_cast<double> (1.0);
+   LogPower = 0;
+   while ((MaxPowerOfTen*10.0) < ((double) ((INT_MAX) / 10)))
+     {
+       MaxPowerOfTen = MaxPowerOfTen*10.0;
+       LogPower += 1;
+     }
+   return LogPower;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    rtos -
+ */
+ 
+ static DynamicStrings_String rtos (double r, unsigned int TotalWidth, unsigned int FractionWidth)
+ {
+   M2RTS_HALT (-1);
+   __builtin_unreachable ();
+   return static_cast<DynamicStrings_String> (NULL);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    lrtos -
+ */
+ 
+ static DynamicStrings_String lrtos (long double r, unsigned int TotalWidth, unsigned int FractionWidth)
+ {
+   M2RTS_HALT (-1);
+   __builtin_unreachable ();
+   return static_cast<DynamicStrings_String> (NULL);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    doDecimalPlaces - returns a string which is accurate to
+                      n decimal places.  It returns a new String
+                      and, s, will be destroyed.
+ */
+ 
+ static DynamicStrings_String doDecimalPlaces (DynamicStrings_String s, unsigned int n)
+ {
+   int i;
+   int l;
+   int point;
+   DynamicStrings_String t;
+   DynamicStrings_String tenths;
+   DynamicStrings_String hundreths;
+ 
+   l = DynamicStrings_Length (s);
+   i = 0;
+   /* remove '.'  */
+   point = DynamicStrings_Index (s, '.', 0);
+   if (point == 0)
+     {
+       s = DynamicStrings_Slice (DynamicStrings_Mark (s), 1, 0);
+     }
+   else if (point < l)
+     {
+       /* avoid dangling else.  */
+       s = DynamicStrings_ConCat (DynamicStrings_Slice (DynamicStrings_Mark (s), 0, point), DynamicStrings_Mark (DynamicStrings_Slice (DynamicStrings_Mark (s), point+1, 0)));
+     }
+   else
+     {
+       /* avoid dangling else.  */
+       s = DynamicStrings_Slice (DynamicStrings_Mark (s), 0, point);
+     }
+   l = DynamicStrings_Length (s);
+   i = 0;
+   if (l > 0)
+     {
+       /* skip over leading zeros  */
+       while ((i < l) && ((DynamicStrings_char (s, i)) == '0'))
+         {
+           i += 1;
+         }
+       /* was the string full of zeros?  */
+       if ((i == l) && ((DynamicStrings_char (s, i-1)) == '0'))
+         {
+           s = DynamicStrings_KillString (s);
+           s = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "0.", 2), DynamicStrings_Mark (DynamicStrings_Mult (DynamicStrings_Mark (DynamicStrings_InitStringChar ('0')), n)));
+           return s;
+         }
+     }
+   /* insert leading zero  */
+   s = DynamicStrings_ConCat (DynamicStrings_InitStringChar ('0'), DynamicStrings_Mark (s));
+   point += 1;  /* and move point position to correct place  */
+   l = DynamicStrings_Length (s);  /* update new length  */
+   i = point;  /* update new length  */
+   while ((n > 1) && (i < l))
+     {
+       n -= 1;
+       i += 1;
+     }
+   if ((i+3) <= l)
+     {
+       t = DynamicStrings_Dup (s);
+       hundreths = DynamicStrings_Slice (DynamicStrings_Mark (s), i+1, i+3);
+       s = t;
+       if ((StringConvert_stoc (hundreths)) >= 50)
+         {
+           s = carryOne (DynamicStrings_Mark (s), static_cast<unsigned int> (i));
+         }
+       hundreths = DynamicStrings_KillString (hundreths);
+     }
+   else if ((i+2) <= l)
+     {
+       /* avoid dangling else.  */
+       t = DynamicStrings_Dup (s);
+       tenths = DynamicStrings_Slice (DynamicStrings_Mark (s), i+1, i+2);
+       s = t;
+       if ((StringConvert_stoc (tenths)) >= 5)
+         {
+           s = carryOne (DynamicStrings_Mark (s), static_cast<unsigned int> (i));
+         }
+       tenths = DynamicStrings_KillString (tenths);
+     }
+   /* check whether we need to remove the leading zero  */
+   if ((DynamicStrings_char (s, 0)) == '0')
+     {
+       s = DynamicStrings_Slice (DynamicStrings_Mark (s), 1, 0);
+       l -= 1;
+       point -= 1;
+     }
+   if (i < l)
+     {
+       s = DynamicStrings_Slice (DynamicStrings_Mark (s), 0, i);
+       l = DynamicStrings_Length (s);
+       if (l < point)
+         {
+           s = DynamicStrings_ConCat (s, DynamicStrings_Mult (DynamicStrings_Mark (DynamicStrings_InitStringChar ('0')), static_cast<unsigned int> (point-l)));
+         }
+     }
+   /* re-insert the point  */
+   if (point >= 0)
+     {
+       /* avoid gcc warning by using compound statement even if not strictly necessary.  */
+       if (point == 0)
+         {
+           s = DynamicStrings_ConCat (DynamicStrings_InitStringChar ('.'), DynamicStrings_Mark (s));
+         }
+       else
+         {
+           s = DynamicStrings_ConCat (DynamicStrings_ConCatChar (DynamicStrings_Slice (DynamicStrings_Mark (s), 0, point), '.'), DynamicStrings_Mark (DynamicStrings_Slice (DynamicStrings_Mark (s), point, 0)));
+         }
+     }
+   return s;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    doSigFig - returns a string which is accurate to
+               n decimal places.  It returns a new String
+               and, s, will be destroyed.
+ */
+ 
+ static DynamicStrings_String doSigFig (DynamicStrings_String s, unsigned int n)
+ {
+   int i;
+   int l;
+   int z;
+   int point;
+   DynamicStrings_String t;
+   DynamicStrings_String tenths;
+   DynamicStrings_String hundreths;
+ 
+   l = DynamicStrings_Length (s);
+   i = 0;
+   /* remove '.'  */
+   point = DynamicStrings_Index (s, '.', 0);
+   if (point >= 0)
+     {
+       if (point == 0)
+         {
+           s = DynamicStrings_Slice (DynamicStrings_Mark (s), 1, 0);
+         }
+       else if (point < l)
+         {
+           /* avoid dangling else.  */
+           s = DynamicStrings_ConCat (DynamicStrings_Slice (DynamicStrings_Mark (s), 0, point), DynamicStrings_Mark (DynamicStrings_Slice (DynamicStrings_Mark (s), point+1, 0)));
+         }
+       else
+         {
+           /* avoid dangling else.  */
+           s = DynamicStrings_Slice (DynamicStrings_Mark (s), 0, point);
+         }
+     }
+   else
+     {
+       s = DynamicStrings_Dup (DynamicStrings_Mark (s));
+     }
+   l = DynamicStrings_Length (s);
+   i = 0;
+   if (l > 0)
+     {
+       /* skip over leading zeros  */
+       while ((i < l) && ((DynamicStrings_char (s, i)) == '0'))
+         {
+           i += 1;
+         }
+       /* was the string full of zeros?  */
+       if ((i == l) && ((DynamicStrings_char (s, i-1)) == '0'))
+         {
+           /* truncate string  */
+           s = DynamicStrings_Slice (DynamicStrings_Mark (s), 0, static_cast<int> (n));
+           i = n;
+         }
+     }
+   /* add a leading zero in case we need to overflow the carry  */
+   z = i;  /* remember where we inserted zero  */
+   if (z == 0)  /* remember where we inserted zero  */
+     {
+       s = DynamicStrings_ConCat (DynamicStrings_InitStringChar ('0'), DynamicStrings_Mark (s));
+     }
+   else
+     {
+       s = DynamicStrings_ConCat (DynamicStrings_ConCatChar (DynamicStrings_Slice (DynamicStrings_Mark (s), 0, i), '0'), DynamicStrings_Mark (DynamicStrings_Slice (DynamicStrings_Mark (s), i, 0)));
+     }
+   n += 1;  /* and increase the number of sig figs needed  */
+   l = DynamicStrings_Length (s);  /* and increase the number of sig figs needed  */
+   while ((n > 1) && (i < l))
+     {
+       n -= 1;
+       i += 1;
+     }
+   if ((i+3) <= l)
+     {
+       t = DynamicStrings_Dup (s);
+       hundreths = DynamicStrings_Slice (DynamicStrings_Mark (s), i+1, i+3);
+       s = t;
+       if ((StringConvert_stoc (hundreths)) >= 50)
+         {
+           s = carryOne (DynamicStrings_Mark (s), static_cast<unsigned int> (i));
+         }
+       hundreths = DynamicStrings_KillString (hundreths);
+     }
+   else if ((i+2) <= l)
+     {
+       /* avoid dangling else.  */
+       t = DynamicStrings_Dup (s);
+       tenths = DynamicStrings_Slice (DynamicStrings_Mark (s), i+1, i+2);
+       s = t;
+       if ((StringConvert_stoc (tenths)) >= 5)
+         {
+           s = carryOne (DynamicStrings_Mark (s), static_cast<unsigned int> (i));
+         }
+       tenths = DynamicStrings_KillString (tenths);
+     }
+   /* check whether we need to remove the leading zero  */
+   if ((DynamicStrings_char (s, z)) == '0')
+     {
+       if (z == 0)
+         {
+           s = DynamicStrings_Slice (DynamicStrings_Mark (s), z+1, 0);
+         }
+       else
+         {
+           s = DynamicStrings_ConCat (DynamicStrings_Slice (DynamicStrings_Mark (s), 0, z), DynamicStrings_Mark (DynamicStrings_Slice (DynamicStrings_Mark (s), z+1, 0)));
+         }
+       l = DynamicStrings_Length (s);
+     }
+   else
+     {
+       point += 1;
+     }
+   if (i < l)
+     {
+       s = DynamicStrings_Slice (DynamicStrings_Mark (s), 0, i);
+       l = DynamicStrings_Length (s);
+       if (l < point)
+         {
+           s = DynamicStrings_ConCat (s, DynamicStrings_Mult (DynamicStrings_Mark (DynamicStrings_InitStringChar ('0')), static_cast<unsigned int> (point-l)));
+         }
+     }
+   /* re-insert the point  */
+   if (point >= 0)
+     {
+       /* avoid gcc warning by using compound statement even if not strictly necessary.  */
+       if (point == 0)
+         {
+           s = DynamicStrings_ConCat (DynamicStrings_InitStringChar ('.'), DynamicStrings_Mark (s));
+         }
+       else
+         {
+           s = DynamicStrings_ConCat (DynamicStrings_ConCatChar (DynamicStrings_Slice (DynamicStrings_Mark (s), 0, point), '.'), DynamicStrings_Mark (DynamicStrings_Slice (DynamicStrings_Mark (s), point, 0)));
+         }
+     }
+   return s;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    carryOne - add a carry at position, i.
+ */
+ 
+ static DynamicStrings_String carryOne (DynamicStrings_String s, unsigned int i)
+ {
+   if (i >= 0)
+     {
+       if (IsDigit (DynamicStrings_char (s, static_cast<int> (i))))
+         {
+           /* avoid gcc warning by using compound statement even if not strictly necessary.  */
+           if ((DynamicStrings_char (s, static_cast<int> (i))) == '9')
+             {
+               if (i == 0)
+                 {
+                   s = DynamicStrings_ConCat (DynamicStrings_InitStringChar ('1'), DynamicStrings_Mark (s));
+                   return s;
+                 }
+               else
+                 {
+                   s = DynamicStrings_ConCat (DynamicStrings_ConCatChar (DynamicStrings_Slice (DynamicStrings_Mark (s), 0, static_cast<int> (i)), '0'), DynamicStrings_Mark (DynamicStrings_Slice (DynamicStrings_Mark (s), static_cast<int> (i+1), 0)));
+                   return carryOne (s, i-1);
+                 }
+             }
+           else
+             {
+               if (i == 0)
+                 {
+                   s = DynamicStrings_ConCat (DynamicStrings_InitStringChar ( ((char) ( ((unsigned int) (DynamicStrings_char (s, static_cast<int> (i))))+1))), DynamicStrings_Mark (DynamicStrings_Slice (DynamicStrings_Mark (s), static_cast<int> (i+1), 0)));
+                 }
+               else
+                 {
+                   s = DynamicStrings_ConCat (DynamicStrings_ConCatChar (DynamicStrings_Slice (DynamicStrings_Mark (s), 0, static_cast<int> (i)), ((char) ( ((unsigned int) (DynamicStrings_char (s, static_cast<int> (i))))+1))), DynamicStrings_Mark (DynamicStrings_Slice (DynamicStrings_Mark (s), static_cast<int> (i+1), 0)));
+                 }
+             }
+         }
+     }
+   return s;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    IntegerToString - converts INTEGER, i, into a String. The field with can be specified
+                      if non zero. Leading characters are defined by padding and this
+                      function will prepend a + if sign is set to TRUE.
+                      The base allows the caller to generate binary, octal, decimal, hexidecimal
+                      numbers. The value of lower is only used when hexidecimal numbers are
+                      generated and if TRUE then digits abcdef are used, and if FALSE then ABCDEF
+                      are used.
+ */
+ 
+ extern "C" DynamicStrings_String StringConvert_IntegerToString (int i, unsigned int width, char padding, bool sign, unsigned int base, bool lower)
+ {
+   DynamicStrings_String s;
+   unsigned int c;
+ 
+   if (i < 0)
+     {
+       if (i == (INT_MIN))
+         {
+           /* remember that -15 MOD 4 = 1 in Modula-2  */
+           c = ((unsigned int ) (abs (i+1)))+1;
+           if (width > 0)
+             {
+               return DynamicStrings_ConCat (StringConvert_IntegerToString (-((int ) (c / base)), width-1, padding, sign, base, lower), DynamicStrings_Mark (StringConvert_IntegerToString (static_cast<int> (c % base), 0, ' ', false, base, lower)));
+             }
+           else
+             {
+               return DynamicStrings_ConCat (StringConvert_IntegerToString (-((int ) (c / base)), 0, padding, sign, base, lower), DynamicStrings_Mark (StringConvert_IntegerToString (static_cast<int> (c % base), 0, ' ', false, base, lower)));
+             }
+         }
+       else
+         {
+           s = DynamicStrings_InitString ((const char *) "-", 1);
+         }
+       i = -i;
+     }
+   else
+     {
+       if (sign)
+         {
+           s = DynamicStrings_InitString ((const char *) "+", 1);
+         }
+       else
+         {
+           s = DynamicStrings_InitString ((const char *) "", 0);
+         }
+     }
+   if (i > (((int ) (base))-1))
+     {
+       s = DynamicStrings_ConCat (DynamicStrings_ConCat (s, DynamicStrings_Mark (StringConvert_IntegerToString (static_cast<int> (((unsigned int ) (i)) / base), 0, ' ', false, base, lower))), DynamicStrings_Mark (StringConvert_IntegerToString (static_cast<int> (((unsigned int ) (i)) % base), 0, ' ', false, base, lower)));
+     }
+   else
+     {
+       if (i <= 9)
+         {
+           s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_InitStringChar ( ((char) (((unsigned int ) (i))+ ((unsigned int) ('0')))))));
+         }
+       else
+         {
+           if (lower)
+             {
+               s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_InitStringChar ( ((char) ((((unsigned int ) (i))+ ((unsigned int) ('a')))-10)))));
+             }
+           else
+             {
+               s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_InitStringChar ( ((char) ((((unsigned int ) (i))+ ((unsigned int) ('A')))-10)))));
+             }
+         }
+     }
+   if (width > (DynamicStrings_Length (s)))
+     {
+       return DynamicStrings_ConCat (DynamicStrings_Mult (DynamicStrings_Mark (DynamicStrings_InitStringChar (padding)), width-(DynamicStrings_Length (s))), DynamicStrings_Mark (s));
+     }
+   return s;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    CardinalToString - converts CARDINAL, c, into a String. The field with can be specified
+                       if non zero. Leading characters are defined by padding.
+                       The base allows the caller to generate binary, octal, decimal, hexidecimal
+                       numbers. The value of lower is only used when hexidecimal numbers are
+                       generated and if TRUE then digits abcdef are used, and if FALSE then ABCDEF
+                       are used.
+ */
+ 
+ extern "C" DynamicStrings_String StringConvert_CardinalToString (unsigned int c, unsigned int width, char padding, unsigned int base, bool lower)
+ {
+   DynamicStrings_String s;
+ 
+   s = DynamicStrings_InitString ((const char *) "", 0);
+   if (c > (base-1))
+     {
+       s = DynamicStrings_ConCat (DynamicStrings_ConCat (s, DynamicStrings_Mark (StringConvert_CardinalToString (c / base, 0, ' ', base, lower))), DynamicStrings_Mark (StringConvert_CardinalToString (c % base, 0, ' ', base, lower)));
+     }
+   else
+     {
+       if (c <= 9)
+         {
+           s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_InitStringChar ( ((char) (c+ ((unsigned int) ('0')))))));
+         }
+       else
+         {
+           if (lower)
+             {
+               s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_InitStringChar ( ((char) ((c+ ((unsigned int) ('a')))-10)))));
+             }
+           else
+             {
+               s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_InitStringChar ( ((char) ((c+ ((unsigned int) ('A')))-10)))));
+             }
+         }
+     }
+   if (width > (DynamicStrings_Length (s)))
+     {
+       return DynamicStrings_ConCat (DynamicStrings_Mult (DynamicStrings_Mark (DynamicStrings_InitStringChar (padding)), width-(DynamicStrings_Length (s))), s);
+     }
+   return s;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    StringToInteger - converts a string, s, of, base, into an INTEGER.
+                      Leading white space is ignored. It stops converting
+                      when either the string is exhausted or if an illegal
+                      numeral is found.
+                      The parameter found is set TRUE if a number was found.
+ */
+ 
+ extern "C" int StringConvert_StringToInteger (DynamicStrings_String s, unsigned int base, bool *found)
+ {
+   unsigned int n;
+   unsigned int l;
+   unsigned int c;
+   bool negative;
+ 
+   s = DynamicStrings_RemoveWhitePrefix (s);  /* returns a new string, s  */
+   l = DynamicStrings_Length (s);  /* returns a new string, s  */
+   c = 0;
+   n = 0;
+   negative = false;
+   if (n < l)
+     {
+       /* parse leading + and -  */
+       while (((DynamicStrings_char (s, static_cast<int> (n))) == '-') || ((DynamicStrings_char (s, static_cast<int> (n))) == '+'))
+         {
+           if ((DynamicStrings_char (s, static_cast<int> (n))) == '-')
+             {
+               negative = ! negative;
+             }
+           n += 1;
+         }
+       while ((n < l) && ((IsDecimalDigitValid (DynamicStrings_char (s, static_cast<int> (n)), base, &c)) || (IsHexidecimalDigitValid (DynamicStrings_char (s, static_cast<int> (n)), base, &c))))
+         {
+           (*found) = true;
+           n += 1;
+         }
+     }
+   s = DynamicStrings_KillString (s);
+   if (negative)
+     {
+       return -((int ) (Min (((unsigned int ) (INT_MAX))+1, c)));
+     }
+   else
+     {
+       return (int ) (Min (static_cast<unsigned int> (INT_MAX), c));
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    StringToCardinal - converts a string, s, of, base, into a CARDINAL.
+                       Leading white space is ignored. It stops converting
+                       when either the string is exhausted or if an illegal
+                       numeral is found.
+                       The parameter found is set TRUE if a number was found.
+ */
+ 
+ extern "C" unsigned int StringConvert_StringToCardinal (DynamicStrings_String s, unsigned int base, bool *found)
+ {
+   unsigned int n;
+   unsigned int l;
+   unsigned int c;
+ 
+   s = DynamicStrings_RemoveWhitePrefix (s);  /* returns a new string, s  */
+   l = DynamicStrings_Length (s);  /* returns a new string, s  */
+   c = 0;
+   n = 0;
+   if (n < l)
+     {
+       /* parse leading +  */
+       while ((DynamicStrings_char (s, static_cast<int> (n))) == '+')
+         {
+           n += 1;
+         }
+       while ((n < l) && ((IsDecimalDigitValid (DynamicStrings_char (s, static_cast<int> (n)), base, &c)) || (IsHexidecimalDigitValid (DynamicStrings_char (s, static_cast<int> (n)), base, &c))))
+         {
+           (*found) = true;
+           n += 1;
+         }
+     }
+   s = DynamicStrings_KillString (s);
+   return c;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    LongIntegerToString - converts LONGINT, i, into a String. The field with
+                          can be specified if non zero. Leading characters
+                          are defined by padding and this function will
+                          prepend a + if sign is set to TRUE.
+                          The base allows the caller to generate binary,
+                          octal, decimal, hexidecimal numbers.
+                          The value of lower is only used when hexidecimal
+                          numbers are generated and if TRUE then digits
+                          abcdef are used, and if FALSE then ABCDEF are used.
+ */
+ 
+ extern "C" DynamicStrings_String StringConvert_LongIntegerToString (long int i, unsigned int width, char padding, bool sign, unsigned int base, bool lower)
+ {
+   DynamicStrings_String s;
+   long unsigned int c;
+ 
+   if (i < 0)
+     {
+       if (i == (LONG_MIN))
+         {
+           /* remember that -15 MOD 4 is 1 in Modula-2, and although ABS(MIN(LONGINT)+1)
+             is very likely MAX(LONGINT), it is safer not to assume this is the case  */
+           c = ((long unsigned int ) (labs (i+1)))+1;
+           if (width > 0)
+             {
+               return DynamicStrings_ConCat (StringConvert_LongIntegerToString (-((long int ) (c / ((long unsigned int ) (base)))), width-1, padding, sign, base, lower), DynamicStrings_Mark (StringConvert_LongIntegerToString (static_cast<long int> (c % ((long unsigned int ) (base))), 0, ' ', false, base, lower)));
+             }
+           else
+             {
+               return DynamicStrings_ConCat (StringConvert_LongIntegerToString (-((long int ) (c / ((long unsigned int ) (base)))), 0, padding, sign, base, lower), DynamicStrings_Mark (StringConvert_LongIntegerToString (static_cast<long int> (c % ((long unsigned int ) (base))), 0, ' ', false, base, lower)));
+             }
+         }
+       else
+         {
+           s = DynamicStrings_InitString ((const char *) "-", 1);
+         }
+       i = -i;
+     }
+   else
+     {
+       if (sign)
+         {
+           s = DynamicStrings_InitString ((const char *) "+", 1);
+         }
+       else
+         {
+           s = DynamicStrings_InitString ((const char *) "", 0);
+         }
+     }
+   if (i > ((long int ) (base-1)))
+     {
+       s = DynamicStrings_ConCat (DynamicStrings_ConCat (s, DynamicStrings_Mark (StringConvert_LongIntegerToString (i / ((long int ) (base)), 0, ' ', false, base, lower))), DynamicStrings_Mark (StringConvert_LongIntegerToString (i % ((long int ) (base)), 0, ' ', false, base, lower)));
+     }
+   else
+     {
+       if (i <= 9)
+         {
+           s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_InitStringChar ( ((char) (((unsigned int ) (i))+ ((unsigned int) ('0')))))));
+         }
+       else
+         {
+           if (lower)
+             {
+               s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_InitStringChar ( ((char) ((((unsigned int ) (i))+ ((unsigned int) ('a')))-10)))));
+             }
+           else
+             {
+               s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_InitStringChar ( ((char) ((((unsigned int ) (i))+ ((unsigned int) ('A')))-10)))));
+             }
+         }
+     }
+   if (width > (DynamicStrings_Length (s)))
+     {
+       return DynamicStrings_ConCat (DynamicStrings_Mult (DynamicStrings_Mark (DynamicStrings_InitStringChar (padding)), width-(DynamicStrings_Length (s))), s);
+     }
+   return s;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    StringToLongInteger - converts a string, s, of, base, into an LONGINT.
+                          Leading white space is ignored. It stops converting
+                          when either the string is exhausted or if an illegal
+                          numeral is found.
+                          The parameter found is set TRUE if a number was found.
+ */
+ 
+ extern "C" long int StringConvert_StringToLongInteger (DynamicStrings_String s, unsigned int base, bool *found)
+ {
+   unsigned int n;
+   unsigned int l;
+   long unsigned int c;
+   bool negative;
+ 
+   s = DynamicStrings_RemoveWhitePrefix (s);  /* returns a new string, s  */
+   l = DynamicStrings_Length (s);  /* returns a new string, s  */
+   c = 0;
+   n = 0;
+   negative = false;
+   if (n < l)
+     {
+       /* parse leading + and -  */
+       while (((DynamicStrings_char (s, static_cast<int> (n))) == '-') || ((DynamicStrings_char (s, static_cast<int> (n))) == '+'))
+         {
+           if ((DynamicStrings_char (s, static_cast<int> (n))) == '-')
+             {
+               negative = ! negative;
+             }
+           n += 1;
+         }
+       while ((n < l) && ((IsDecimalDigitValidLong (DynamicStrings_char (s, static_cast<int> (n)), base, &c)) || (IsHexidecimalDigitValidLong (DynamicStrings_char (s, static_cast<int> (n)), base, &c))))
+         {
+           (*found) = true;
+           n += 1;
+         }
+     }
+   s = DynamicStrings_KillString (s);
+   if (negative)
+     {
+       return -((long int ) (LongMin (((long unsigned int ) (LONG_MAX))+1, c)));
+     }
+   else
+     {
+       return (long int ) (LongMin (static_cast<long unsigned int> (LONG_MAX), c));
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    LongCardinalToString - converts LONGCARD, c, into a String. The field
+                           width can be specified if non zero. Leading
+                           characters are defined by padding.
+                           The base allows the caller to generate binary,
+                           octal, decimal, hexidecimal numbers.
+                           The value of lower is only used when hexidecimal
+                           numbers are generated and if TRUE then digits
+                           abcdef are used, and if FALSE then ABCDEF are used.
+ */
+ 
+ extern "C" DynamicStrings_String StringConvert_LongCardinalToString (long unsigned int c, unsigned int width, char padding, unsigned int base, bool lower)
+ {
+   DynamicStrings_String s;
+ 
+   s = DynamicStrings_InitString ((const char *) "", 0);
+   if (c > ((long unsigned int ) (base-1)))
+     {
+       s = DynamicStrings_ConCat (DynamicStrings_ConCat (s, StringConvert_LongCardinalToString (c / ((long unsigned int ) (base)), 0, ' ', base, lower)), StringConvert_LongCardinalToString (c % ((long unsigned int ) (base)), 0, ' ', base, lower));
+     }
+   else
+     {
+       if (c <= 9)
+         {
+           s = DynamicStrings_ConCat (s, DynamicStrings_InitStringChar ( ((char) (((unsigned int ) (c))+ ((unsigned int) ('0'))))));
+         }
+       else
+         {
+           if (lower)
+             {
+               s = DynamicStrings_ConCat (s, DynamicStrings_InitStringChar ( ((char) ((((unsigned int ) (c))+ ((unsigned int) ('a')))-10))));
+             }
+           else
+             {
+               s = DynamicStrings_ConCat (s, DynamicStrings_InitStringChar ( ((char) ((((unsigned int ) (c))+ ((unsigned int) ('A')))-10))));
+             }
+         }
+     }
+   if (width > (DynamicStrings_Length (s)))
+     {
+       return DynamicStrings_ConCat (DynamicStrings_Mult (DynamicStrings_Mark (DynamicStrings_InitStringChar (padding)), width-(DynamicStrings_Length (s))), s);
+     }
+   return s;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    StringToLongCardinal - converts a string, s, of, base, into a LONGCARD.
+                           Leading white space is ignored. It stops converting
+                           when either the string is exhausted or if an illegal
+                           numeral is found.
+                           The parameter found is set TRUE if a number was found.
+ */
+ 
+ extern "C" long unsigned int StringConvert_StringToLongCardinal (DynamicStrings_String s, unsigned int base, bool *found)
+ {
+   unsigned int n;
+   unsigned int l;
+   long unsigned int c;
+ 
+   s = DynamicStrings_RemoveWhitePrefix (s);  /* returns a new string, s  */
+   l = DynamicStrings_Length (s);  /* returns a new string, s  */
+   c = 0;
+   n = 0;
+   if (n < l)
+     {
+       /* parse leading +  */
+       while ((DynamicStrings_char (s, static_cast<int> (n))) == '+')
+         {
+           n += 1;
+         }
+       while ((n < l) && ((IsDecimalDigitValidLong (DynamicStrings_char (s, static_cast<int> (n)), base, &c)) || (IsHexidecimalDigitValidLong (DynamicStrings_char (s, static_cast<int> (n)), base, &c))))
+         {
+           (*found) = true;
+           n += 1;
+         }
+     }
+   s = DynamicStrings_KillString (s);
+   return c;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    ShortCardinalToString - converts SHORTCARD, c, into a String. The field
+                           width can be specified if non zero. Leading
+                           characters are defined by padding.
+                           The base allows the caller to generate binary,
+                           octal, decimal, hexidecimal numbers.
+                           The value of lower is only used when hexidecimal
+                           numbers are generated and if TRUE then digits
+                           abcdef are used, and if FALSE then ABCDEF are used.
+ */
+ 
+ extern "C" DynamicStrings_String StringConvert_ShortCardinalToString (short unsigned int c, unsigned int width, char padding, unsigned int base, bool lower)
+ {
+   DynamicStrings_String s;
+ 
+   s = DynamicStrings_InitString ((const char *) "", 0);
+   if (((unsigned int ) (c)) > (base-1))
+     {
+       s = DynamicStrings_ConCat (DynamicStrings_ConCat (s, StringConvert_ShortCardinalToString (c / ((short unsigned int ) (base)), 0, ' ', base, lower)), StringConvert_ShortCardinalToString (c % ((short unsigned int ) (base)), 0, ' ', base, lower));
+     }
+   else
+     {
+       if (c <= 9)
+         {
+           s = DynamicStrings_ConCat (s, DynamicStrings_InitStringChar ( ((char) (((unsigned int ) (c))+ ((unsigned int) ('0'))))));
+         }
+       else
+         {
+           if (lower)
+             {
+               s = DynamicStrings_ConCat (s, DynamicStrings_InitStringChar ( ((char) ((((unsigned int ) (c))+ ((unsigned int) ('a')))-10))));
+             }
+           else
+             {
+               s = DynamicStrings_ConCat (s, DynamicStrings_InitStringChar ( ((char) ((((unsigned int ) (c))+ ((unsigned int) ('A')))-10))));
+             }
+         }
+     }
+   if (width > (DynamicStrings_Length (s)))
+     {
+       return DynamicStrings_ConCat (DynamicStrings_Mult (DynamicStrings_Mark (DynamicStrings_InitStringChar (padding)), width-(DynamicStrings_Length (s))), s);
+     }
+   return s;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    StringToShortCardinal - converts a string, s, of, base, into a SHORTCARD.
+                            Leading white space is ignored. It stops converting
+                            when either the string is exhausted or if an illegal
+                            numeral is found.
+                            The parameter found is set TRUE if a number was found.
+ */
+ 
+ extern "C" short unsigned int StringConvert_StringToShortCardinal (DynamicStrings_String s, unsigned int base, bool *found)
+ {
+   unsigned int n;
+   unsigned int l;
+   short unsigned int c;
+ 
+   s = DynamicStrings_RemoveWhitePrefix (s);  /* returns a new string, s  */
+   l = DynamicStrings_Length (s);  /* returns a new string, s  */
+   c = 0;
+   n = 0;
+   if (n < l)
+     {
+       /* parse leading +  */
+       while ((DynamicStrings_char (s, static_cast<int> (n))) == '+')
+         {
+           n += 1;
+         }
+       while ((n < l) && ((IsDecimalDigitValidShort (DynamicStrings_char (s, static_cast<int> (n)), base, &c)) || (IsHexidecimalDigitValidShort (DynamicStrings_char (s, static_cast<int> (n)), base, &c))))
+         {
+           (*found) = true;
+           n += 1;
+         }
+     }
+   s = DynamicStrings_KillString (s);
+   return c;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    stoi - decimal string to INTEGER
+ */
+ 
+ extern "C" int StringConvert_stoi (DynamicStrings_String s)
+ {
+   bool found;
+ 
+   return StringConvert_StringToInteger (s, 10, &found);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    itos - integer to decimal string.
+ */
+ 
+ extern "C" DynamicStrings_String StringConvert_itos (int i, unsigned int width, char padding, bool sign)
+ {
+   return StringConvert_IntegerToString (i, width, padding, sign, 10, false);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    ctos - cardinal to decimal string.
+ */
+ 
+ extern "C" DynamicStrings_String StringConvert_ctos (unsigned int c, unsigned int width, char padding)
+ {
+   return StringConvert_CardinalToString (c, width, padding, 10, false);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    stoc - decimal string to CARDINAL
+ */
+ 
+ extern "C" unsigned int StringConvert_stoc (DynamicStrings_String s)
+ {
+   bool found;
+ 
+   return StringConvert_StringToCardinal (s, 10, &found);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    hstoi - hexidecimal string to INTEGER
+ */
+ 
+ extern "C" int StringConvert_hstoi (DynamicStrings_String s)
+ {
+   bool found;
+ 
+   return StringConvert_StringToInteger (s, 16, &found);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    ostoi - octal string to INTEGER
+ */
+ 
+ extern "C" int StringConvert_ostoi (DynamicStrings_String s)
+ {
+   bool found;
+ 
+   return StringConvert_StringToInteger (s, 8, &found);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    bstoi - binary string to INTEGER
+ */
+ 
+ extern "C" int StringConvert_bstoi (DynamicStrings_String s)
+ {
+   bool found;
+ 
+   return StringConvert_StringToInteger (s, 2, &found);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    hstoc - hexidecimal string to CARDINAL
+ */
+ 
+ extern "C" unsigned int StringConvert_hstoc (DynamicStrings_String s)
+ {
+   bool found;
+ 
+   return StringConvert_StringToCardinal (s, 16, &found);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    ostoc - octal string to CARDINAL
+ */
+ 
+ extern "C" unsigned int StringConvert_ostoc (DynamicStrings_String s)
+ {
+   bool found;
+ 
+   return StringConvert_StringToCardinal (s, 8, &found);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    bstoc - binary string to CARDINAL
+ */
+ 
+ extern "C" unsigned int StringConvert_bstoc (DynamicStrings_String s)
+ {
+   bool found;
+ 
+   return StringConvert_StringToCardinal (s, 2, &found);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    StringToLongreal - returns a LONGREAL and sets found to TRUE if a legal number is seen.
+ */
+ 
+ extern "C" long double StringConvert_StringToLongreal (DynamicStrings_String s, bool *found)
+ {
+   bool error;
+   long double value;
+ 
+   s = DynamicStrings_RemoveWhitePrefix (s);  /* new string is created  */
+   value = ldtoa_strtold (DynamicStrings_string (s), &error);  /* new string is created  */
+   s = DynamicStrings_KillString (s);
+   (*found) = ! error;
+   return value;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    LongrealToString - converts a LONGREAL number, Real, which has,
+                       TotalWidth, and FractionWidth into a string.
+                       It uses decimal notation.
+ 
+                       So for example:
+ 
+                       LongrealToString(1.0, 4, 2)  -> '1.00'
+                       LongrealToString(12.3, 5, 2) -> '12.30'
+                       LongrealToString(12.3, 6, 2) -> ' 12.30'
+                       LongrealToString(12.3, 6, 3) -> '12.300'
+ 
+                       if total width is too small then the fraction
+                       becomes truncated.
+ 
+                       LongrealToString(12.3, 5, 3) -> '12.30'
+ 
+                       Positive numbers do not have a '+' prepended.
+                       Negative numbers will have a '-' prepended and
+                       the TotalWidth will need to be large enough
+                       to contain the sign, whole number, '.' and
+                       fractional components.
+ */
+ 
+ extern "C" DynamicStrings_String StringConvert_LongrealToString (long double x, unsigned int TotalWidth, unsigned int FractionWidth)
+ {
+   bool maxprecision;
+   DynamicStrings_String s;
+   void * r;
+   int point;
+   bool sign;
+   int l;
+ 
+   if (TotalWidth == 0)
+     {
+       maxprecision = true;
+       r = ldtoa_ldtoa (x, ldtoa_decimaldigits, 100, &point, &sign);
+     }
+   else
+     {
+       r = ldtoa_ldtoa (x, ldtoa_decimaldigits, 100, &point, &sign);
+     }
+   s = DynamicStrings_InitStringCharStar (r);
+   libc_free (r);
+   l = DynamicStrings_Length (s);
+   if (point > l)
+     {
+       /* avoid dangling else.  */
+       s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_Mult (DynamicStrings_Mark (DynamicStrings_InitStringChar ('0')), static_cast<unsigned int> (point-l))));
+       s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ".0", 2)));
+       if (! maxprecision && (FractionWidth > 0))
+         {
+           FractionWidth -= 1;
+           if (((int ) (FractionWidth)) > (point-l))
+             {
+               s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_Mult (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "0", 1)), FractionWidth)));
+             }
+         }
+     }
+   else if (point < 0)
+     {
+       /* avoid dangling else.  */
+       s = DynamicStrings_ConCat (DynamicStrings_Mult (DynamicStrings_Mark (DynamicStrings_InitStringChar ('0')), static_cast<unsigned int> (-point)), DynamicStrings_Mark (s));
+       l = DynamicStrings_Length (s);
+       s = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "0.", 2), DynamicStrings_Mark (s));
+       if (! maxprecision && (l < ((int ) (FractionWidth))))
+         {
+           s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_Mult (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "0", 1)), static_cast<unsigned int> (((int ) (FractionWidth))-l))));
+         }
+     }
+   else
+     {
+       /* avoid dangling else.  */
+       if (point == 0)
+         {
+           s = DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "0.", 2), DynamicStrings_Mark (DynamicStrings_Slice (DynamicStrings_Mark (s), point, 0)));
+         }
+       else
+         {
+           s = DynamicStrings_ConCat (DynamicStrings_ConCatChar (DynamicStrings_Slice (DynamicStrings_Mark (s), 0, point), '.'), DynamicStrings_Mark (DynamicStrings_Slice (DynamicStrings_Mark (s), point, 0)));
+         }
+       if (! maxprecision && ((l-point) < ((int ) (FractionWidth))))
+         {
+           s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_Mult (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "0", 1)), static_cast<unsigned int> (((int ) (FractionWidth))-(l-point)))));
+         }
+     }
+   if ((DynamicStrings_Length (s)) > TotalWidth)
+     {
+       /* avoid gcc warning by using compound statement even if not strictly necessary.  */
+       if (TotalWidth > 0)
+         {
+           if (sign)
+             {
+               s = DynamicStrings_Slice (DynamicStrings_Mark (StringConvert_ToDecimalPlaces (s, FractionWidth)), 0, static_cast<int> (TotalWidth-1));
+               s = DynamicStrings_ConCat (DynamicStrings_InitStringChar ('-'), DynamicStrings_Mark (s));
+               sign = false;
+             }
+           else
+             {
+               /* minus 1 because all results will include a '.'  */
+               s = DynamicStrings_Slice (DynamicStrings_Mark (StringConvert_ToDecimalPlaces (s, FractionWidth)), 0, static_cast<int> (TotalWidth));
+             }
+         }
+       else
+         {
+           if (sign)
+             {
+               s = StringConvert_ToDecimalPlaces (s, FractionWidth);
+               s = DynamicStrings_ConCat (DynamicStrings_InitStringChar ('-'), DynamicStrings_Mark (s));
+               sign = false;
+             }
+           else
+             {
+               /* minus 1 because all results will include a '.'  */
+               s = StringConvert_ToDecimalPlaces (s, FractionWidth);
+             }
+         }
+     }
+   if ((DynamicStrings_Length (s)) < TotalWidth)
+     {
+       s = DynamicStrings_ConCat (DynamicStrings_Mult (DynamicStrings_Mark (DynamicStrings_InitStringChar (' ')), TotalWidth-(DynamicStrings_Length (s))), DynamicStrings_Mark (s));
+     }
+   return s;
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    stor - returns a REAL given a string.
+ */
+ 
+ extern "C" double StringConvert_stor (DynamicStrings_String s)
+ {
+   bool found;
+ 
+   return (double ) (StringConvert_StringToLongreal (s, &found));
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    stolr - returns a LONGREAL given a string.
+ */
+ 
+ extern "C" long double StringConvert_stolr (DynamicStrings_String s)
+ {
+   bool found;
+ 
+   return StringConvert_StringToLongreal (s, &found);
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    ToSigFig - returns a floating point or base 10 integer
+               string which is accurate to, n, significant
+               figures.  It will return a new String
+               and, s, will be destroyed.
+ 
+ 
+               So:  12.345
+ 
+               rounded to the following significant figures yields
+ 
+               5      12.345
+               4      12.34
+               3      12.3
+               2      12
+               1      10
+ */
+ 
+ extern "C" DynamicStrings_String StringConvert_ToSigFig (DynamicStrings_String s, unsigned int n)
+ {
+   int point;
+   unsigned int poTen;
+ 
+   Assert ((IsDigit (DynamicStrings_char (s, 0))) || ((DynamicStrings_char (s, 0)) == '.'), (const char *) "../../gcc/m2/gm2-libs/StringConvert.mod", 39, 1220, (const char *) "ToSigFig", 8);
+   point = DynamicStrings_Index (s, '.', 0);
+   if (point < 0)
+     {
+       poTen = DynamicStrings_Length (s);
+     }
+   else
+     {
+       poTen = point;
+     }
+   s = doSigFig (s, n);
+   /* if the last character is '.' remove it  */
+   if (((DynamicStrings_Length (s)) > 0) && ((DynamicStrings_char (s, -1)) == '.'))
+     {
+       return DynamicStrings_Slice (DynamicStrings_Mark (s), 0, -1);
+     }
+   else
+     {
+       if (poTen > (DynamicStrings_Length (s)))
+         {
+           s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_Mult (DynamicStrings_Mark (DynamicStrings_InitStringChar ('0')), poTen-(DynamicStrings_Length (s)))));
+         }
+       return s;
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ 
+ /*
+    ToDecimalPlaces - returns a floating point or base 10 integer
+                      string which is accurate to, n, decimal
+                      places.  It will return a new String
+                      and, s, will be destroyed.
+                      Decimal places yields, n, digits after
+                      the .
+ 
+                      So:  12.345
+ 
+                      rounded to the following decimal places yields
+ 
+                      5      12.34500
+                      4      12.3450
+                      3      12.345
+                      2      12.34
+                      1      12.3
+ */
+ 
+ extern "C" DynamicStrings_String StringConvert_ToDecimalPlaces (DynamicStrings_String s, unsigned int n)
+ {
+   int point;
+ 
+   Assert ((IsDigit (DynamicStrings_char (s, 0))) || ((DynamicStrings_char (s, 0)) == '.'), (const char *) "../../gcc/m2/gm2-libs/StringConvert.mod", 39, 1069, (const char *) "ToDecimalPlaces", 15);
+   point = DynamicStrings_Index (s, '.', 0);
+   if (point < 0)
+     {
+       /* avoid gcc warning by using compound statement even if not strictly necessary.  */
+       if (n > 0)
+         {
+           return DynamicStrings_ConCat (DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_InitStringChar ('.'))), DynamicStrings_Mult (DynamicStrings_Mark (DynamicStrings_InitStringChar ('0')), n));
+         }
+       else
+         {
+           return s;
+         }
+     }
+   s = doDecimalPlaces (s, n);
+   /* if the last character is '.' remove it  */
+   if (((DynamicStrings_Length (s)) > 0) && ((DynamicStrings_char (s, -1)) == '.'))
+     {
+       return DynamicStrings_Slice (DynamicStrings_Mark (s), 0, -1);
+     }
+   else
+     {
+       return s;
+     }
+   /* static analysis guarentees a RETURN statement will be used before here.  */
+   __builtin_unreachable ();
+ }
+ 
+ extern "C" void _M2_StringConvert_init (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[])
+ {
+ }
+ 
+ extern "C" void _M2_StringConvert_fini (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[])
+ {
+ }
diff -Nrcpad gcc-16-20250914/gcc/m2/pge-boot/main.cc gcc-16-20250921/gcc/m2/pge-boot/main.cc
*** gcc-16-20250914/gcc/m2/pge-boot/main.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/pge-boot/main.cc	Sun Sep 21 22:32:38 2025
*************** extern "C" void _M2_M2RTS_init (int argc
*** 6,11 ****
--- 6,13 ----
  extern "C" void _M2_M2RTS_fini (int argc, char *argv[], char *envp[]);
  extern "C" void _M2_SysExceptions_init (int argc, char *argv[], char *envp[]);
  extern "C" void _M2_SysExceptions_fini (int argc, char *argv[], char *envp[]);
+ extern "C" void _M2_M2Diagnostic_init (int argc, char *argv[], char *envp[]);
+ extern "C" void _M2_M2Diagnostic_fini (int argc, char *argv[], char *envp[]);
  extern "C" void _M2_StrLib_init (int argc, char *argv[], char *envp[]);
  extern "C" void _M2_StrLib_fini (int argc, char *argv[], char *envp[]);
  extern "C" void _M2_errno_init (int argc, char *argv[], char *envp[]);
*************** extern "C" void _M2_SFIO_init (int argc,
*** 46,51 ****
--- 48,55 ----
  extern "C" void _M2_SFIO_fini (int argc, char *argv[], char *envp[]);
  extern "C" void _M2_StrCase_init (int argc, char *argv[], char *envp[]);
  extern "C" void _M2_StrCase_fini (int argc, char *argv[], char *envp[]);
+ extern "C" void _M2_StringConvert_init (int argc, char *argv[], char *envp[]);
+ extern "C" void _M2_StringConvert_fini (int argc, char *argv[], char *envp[]);
  extern "C" void _M2_bnflex_init (int argc, char *argv[], char *envp[]);
  extern "C" void _M2_bnflex_fini (int argc, char *argv[], char *envp[]);
  extern "C" void _M2_Lists_init (int argc, char *argv[], char *envp[]);
*************** int main(int argc, char *argv[], char *e
*** 65,70 ****
--- 69,75 ----
     _M2_M2EXCEPTION_init (argc, argv, envp);
     _M2_M2RTS_init (argc, argv, envp);
     _M2_SysExceptions_init (argc, argv, envp);
+    _M2_M2Diagnostic_init (argc, argv, envp);
     _M2_StrLib_init (argc, argv, envp);
     _M2_errno_init (argc, argv, envp);
     _M2_termios_init (argc, argv, envp);
*************** int main(int argc, char *argv[], char *e
*** 85,90 ****
--- 90,96 ----
     _M2_FIO_init (argc, argv, envp);
     _M2_SFIO_init (argc, argv, envp);
     _M2_StrCase_init (argc, argv, envp);
+    _M2_StringConvert_init (argc, argv, envp);
     _M2_bnflex_init (argc, argv, envp);
     _M2_Lists_init (argc, argv, envp);
     _M2_Args_init (argc, argv, envp);
*************** int main(int argc, char *argv[], char *e
*** 95,100 ****
--- 101,107 ----
     _M2_Args_fini (argc, argv, envp);
     _M2_Lists_fini (argc, argv, envp);
     _M2_bnflex_fini (argc, argv, envp);
+    _M2_StringConvert_fini (argc, argv, envp);
     _M2_StrCase_fini (argc, argv, envp);
     _M2_SFIO_fini (argc, argv, envp);
     _M2_FIO_fini (argc, argv, envp);
*************** int main(int argc, char *argv[], char *e
*** 115,120 ****
--- 122,128 ----
     _M2_termios_fini (argc, argv, envp);
     _M2_errno_fini (argc, argv, envp);
     _M2_StrLib_fini (argc, argv, envp);
+    _M2_M2Diagnostic_fini (argc, argv, envp);
     _M2_SysExceptions_fini (argc, argv, envp);
     _M2_M2RTS_fini (argc, argv, envp);
     _M2_M2EXCEPTION_fini (argc, argv, envp);
diff -Nrcpad gcc-16-20250914/gcc/m2/tools-src/makeSystem gcc-16-20250921/gcc/m2/tools-src/makeSystem
*** gcc-16-20250914/gcc/m2/tools-src/makeSystem	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/m2/tools-src/makeSystem	Sun Sep 21 22:32:38 2025
***************
*** 23,29 ****
  
  
  Usage () {
!    echo "Usage: makesystem dialectflag SYSTEM.def SYSTEM.mod { librarypath } compiler"
  }
  
  if [ $# -lt 6 ] ; then
--- 23,29 ----
  
  
  Usage () {
!    echo "Usage: makesystem [-gdb] dialectflag SYSTEM.def SYSTEM.mod { librarypath } compiler"
  }
  
  if [ $# -lt 6 ] ; then
*************** if [ $# -lt 6 ] ; then
*** 31,36 ****
--- 31,42 ----
     exit 1
  fi
  
+ if [ "$1" = "-gdb" ] ; then
+     DEBUG=$1
+     shift
+ else
+     DEBUG=""
+ fi
  DIALECT=$1
  SYSTEMDEF=$2
  SYSTEMMOD=$3
*************** displayEnd () {
*** 101,106 ****
--- 107,120 ----
  MINIMAL="-fno-scaffold-main -fno-scaffold-dynamic -fno-scaffold-static -fno-m2-plugin"
  
  rm -f ${OUTPUTFILE}
+ 
+ if [ "$DEBUG" != "" ] ; then
+     echo "entering gdb to debug cc1gm2 when using -fdump-system-exports"
+     ${COMPILER} ${DIALECT} ${LIBRARY} ${MINIMAL} \
+ 		-c -fdump-system-exports ${SYSTEMMOD} -wrapper gdb,--args
+     exit $?
+ fi
+ 
  ${COMPILER} ${DIALECT} ${LIBRARY} ${MINIMAL} \
  	    -S -fdump-system-exports ${SYSTEMMOD} -o /dev/null 2>&1 > /dev/null
  res=$?
diff -Nrcpad gcc-16-20250914/gcc/match.pd gcc-16-20250921/gcc/match.pd
*** gcc-16-20250914/gcc/match.pd	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/match.pd	Sun Sep 21 22:32:38 2025
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 3630,3637 ****
  	  return (T)x;
        }
        while WT is uint128_t, T is uint8_t, uint16_t, uint32_t or uint64_t.  */
!    (convert (min (widen_mult:c@3 (convert@4 (convert @0))
! 				 (convert@5 (convert @1)))
  		   INTEGER_CST@2))
     (if (types_match (type, @0, @1))
      (with
--- 3630,3637 ----
  	  return (T)x;
        }
        while WT is uint128_t, T is uint8_t, uint16_t, uint32_t or uint64_t.  */
!    (convert (min (widen_mult:c@3 (convert@4 @0)
! 				 (convert@5 @1))
  		   INTEGER_CST@2))
     (if (types_match (type, @0, @1))
      (with
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 3695,3700 ****
--- 3695,3725 ----
        bool c2_is_type_precision_p = c2 == prec;
       }
       (if (widen_prec > prec && c2_is_type_precision_p && c4_is_max_p)))))
+   (match (unsigned_integer_sat_mul @0 @1)
+    /* SAT_U_MUL (X, Y) = {
+ 	WT x = (WT)a * (WT)b;
+ 	NT hi = x >> (sizeof(NT) * 8);
+ 	NT lo = (NT)x;
+ 	return lo | -!!hi;
+       } while WT is uint128_t, T is uint8_t, uint16_t, uint32_t or uint64_t.  */
+    (convert1?
+     (bit_ior (convert? (negate (convert (ne (convert (rshift @3 INTEGER_CST@2))
+ 					    integer_zerop))))
+ 	     (convert (widen_mult:c@3 (convert@4 @0)
+ 				      (convert@5 @1)))))
+    (if (types_match (type, @0, @1))
+     (with
+      {
+       unsigned widen_prec = TYPE_PRECISION (TREE_TYPE (@3));
+       unsigned cvt4_prec = TYPE_PRECISION (TREE_TYPE (@4));
+       unsigned cvt5_prec = TYPE_PRECISION (TREE_TYPE (@5));
+       bool widen_mult_p = cvt4_prec == cvt5_prec && widen_prec == cvt5_prec * 2;
+ 
+       unsigned c2 = tree_to_uhwi (@2);
+       unsigned prec = TYPE_PRECISION (type);
+       bool c2_is_type_precision_p = c2 == prec;
+      }
+      (if (widen_mult_p && c2_is_type_precision_p)))))
  )
  
  /* The boundary condition for case 10: IMM = 1:
*************** and,
*** 11085,11090 ****
--- 11110,11116 ----
  			 ? gimple_assign_rhs1 (SSA_NAME_DEF_STMT (@0)) : @0);
  	    tree elt = ctor_single_nonzero_element (ctor); }
        (if (elt
+ 	   && types_match (type, TREE_TYPE (elt))
  	   && !HONOR_SNANS (type)
  	   && !HONOR_SIGNED_ZEROS (type))
  	{ elt; }))))
diff -Nrcpad gcc-16-20250914/gcc/omp-general.cc gcc-16-20250921/gcc/omp-general.cc
*** gcc-16-20250914/gcc/omp-general.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/omp-general.cc	Sun Sep 21 22:32:38 2025
*************** omp_dynamic_cond (tree ctx, tree superco
*** 2733,2739 ****
  
        /* The user condition is not dynamic if it is constant.  */
        if (!tree_fits_shwi_p (expr))
! 	user_cond = expr;
      }
  
    /* Build the "target_device" part of the dynamic selector.  In the
--- 2733,2739 ----
  
        /* The user condition is not dynamic if it is constant.  */
        if (!tree_fits_shwi_p (expr))
! 	user_cond = unshare_expr (expr);
      }
  
    /* Build the "target_device" part of the dynamic selector.  In the
diff -Nrcpad gcc-16-20250914/gcc/omp-low.cc gcc-16-20250921/gcc/omp-low.cc
*** gcc-16-20250914/gcc/omp-low.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/omp-low.cc	Sun Sep 21 22:32:38 2025
*************** lower_omp_regimplify_operands_p (tree *t
*** 14780,14785 ****
--- 14780,14787 ----
        lower_omp_regimplify_operands_data *ldata
  	= (lower_omp_regimplify_operands_data *) wi->info;
        tree o = maybe_lookup_decl (t, ldata->ctx);
+       if (o == NULL_TREE)
+ 	o = maybe_lookup_decl_in_outer_ctx (t, ldata->ctx);
        if (o != t)
  	{
  	  ldata->decls->safe_push (DECL_VALUE_EXPR (*tp));
diff -Nrcpad gcc-16-20250914/gcc/params.opt gcc-16-20250921/gcc/params.opt
*** gcc-16-20250914/gcc/params.opt	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/params.opt	Sun Sep 21 22:32:38 2025
*************** The maximum number of instructions to co
*** 548,553 ****
--- 548,557 ----
  Common Joined UInteger Var(param_max_dse_active_local_stores) Init(5000) Param Optimization
  Maximum number of active local stores in RTL dead store elimination.
  
+ -param=max-devirt-targets=
+ Common Joined UInteger Var(param_max_devirt_targets) Init(3) Param Optimization
+ Maximum number of targets to devirutalize.
+ 
  -param=max-early-inliner-iterations=
  Common Joined UInteger Var(param_early_inliner_max_iterations) Init(1) Param Optimization
  The maximum number of nested indirect inlining performed by early inliner.
diff -Nrcpad gcc-16-20250914/gcc/sarif-replay.cc gcc-16-20250921/gcc/sarif-replay.cc
*** gcc-16-20250914/gcc/sarif-replay.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/sarif-replay.cc	Sun Sep 21 22:32:39 2025
*************** set_defaults (replay_options &replay_opt
*** 37,42 ****
--- 37,43 ----
    replay_opts.m_echo_file = false;
    replay_opts.m_json_comments = false;
    replay_opts.m_verbose = false;
+   replay_opts.m_debug_physical_locations = false;
    replay_opts.m_diagnostics_colorize = DIAGNOSTIC_COLORIZE_IF_TTY;
  }
  
diff -Nrcpad gcc-16-20250914/gcc/simplify-rtx.cc gcc-16-20250921/gcc/simplify-rtx.cc
*** gcc-16-20250914/gcc/simplify-rtx.cc	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/simplify-rtx.cc	Sun Sep 21 22:32:39 2025
*************** simplify_context::simplify_binary_operat
*** 3699,3704 ****
--- 3699,3717 ----
  	  /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2.  */
  	  if (((c1|c2) & mask) == mask)
  	    return simplify_gen_binary (IOR, mode, XEXP (op0, 0), op1);
+ 
+ 	  /* If (C1|C2) has a single bit clear, then adjust C1 so that
+ 	     when split it'll match a single bit clear style insn.
+ 
+ 	     This could have been done with a target dependent splitter, but
+ 	     then every target with single bit manipulation insns would need
+ 	     to implement such splitters.  */
+ 	  if (exact_log2 (~(c1 | c2)) >= 0)
+ 	    {
+ 	      rtx temp = gen_rtx_AND (mode, XEXP (op0, 0), GEN_INT (c1 | c2));
+ 	      temp = gen_rtx_IOR (mode, temp, trueop1);
+ 	      return temp;
+ 	    }
  	}
  
        /* Convert (A & B) | A to A.  */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/ChangeLog gcc-16-20250921/gcc/testsuite/ChangeLog
*** gcc-16-20250914/gcc/testsuite/ChangeLog	Sun Sep 14 22:32:09 2025
--- gcc-16-20250921/gcc/testsuite/ChangeLog	Sun Sep 21 22:32:39 2025
***************
*** 1,3 ****
--- 1,463 ----
+ 2025-09-20  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR c++/121981
+ 	* g++.dg/cpp2a/concepts-placeholder15.C: New test.
+ 
+ 2025-09-20  Eczbek  <eczbek.void@gmail.com>
+ 
+ 	PR c++/119048
+ 	* g++.dg/cpp23/static-operator-call8.C: New test.
+ 
+ 2025-09-20  Jan Hubicka  <jh@suse.cz>
+ 
+ 	* g++.dg/ipa/devirt-2.C: Update template.
+ 	* g++.dg/ipa/devirt-42.C: Update template.
+ 	* g++.dg/lto/devirt-2_0.C: Update template.
+ 
+ 2025-09-20  Joseph Myers  <josmyers@redhat.com>
+ 
+ 	* gcc.dg/c11-atomic-6.c, gcc.dg/c23-incomplete-1.c,
+ 	gcc.dg/c2y-incomplete-3.c: New tests.
+ 
+ 2025-09-19  Paul Thomas  <pault@gcc.gnu.org>
+ 
+ 	PR fortran/83746
+ 	* gfortran.dg/pdt_48.f03: New test.
+ 
+ 2025-09-19  Gaius Mulley  <gaiusmod2@gmail.com>
+ 
+ 	* gm2/errors/fail/testbit2.mod: Rewrite.
+ 	* gm2/iso/run/pass/shift4.mod: Rewrite adding more internal
+ 	tests.
+ 	* gm2/iso/run/pass/testsystem.mod (FindFirstElement): Add
+ 	bounds check.
+ 	* gm2/sets/run/pass/multisetrotate4.mod: Add more runtime
+ 	error messages.
+ 	* gm2/sets/run/pass/simplepacked.mod (testpset): Correct
+ 	setname.
+ 	* lib/gm2.exp (gm2_init_minx): Add -fno-wideset.
+ 	* gm2/iso/run/pass/assigncons.mod: New test.
+ 	* gm2/iso/run/pass/constructor3.mod: New test.
+ 	* gm2/iso/run/pass/proc_test.mod: New test.
+ 	* gm2/iso/run/pass/simplelarge2.mod: New test.
+ 	* gm2/iso/run/pass/simplelarge3.mod: New test.
+ 	* gm2/iso/run/pass/simplelarge4.mod: New test.
+ 	* gm2/pimlib/wideset/run/pass/bitset.mod: New test.
+ 	* gm2/pimlib/wideset/run/pass/bitset2.mod: New test.
+ 	* gm2/pimlib/wideset/run/pass/colorset.mod: New test.
+ 	* gm2/pimlib/wideset/run/pass/colorset2.mod: New test.
+ 	* gm2/pimlib/wideset/run/pass/colorset3.mod: New test.
+ 	* gm2/pimlib/wideset/run/pass/highbit.mod: New test.
+ 	* gm2/pimlib/wideset/run/pass/highbit2.mod: New test.
+ 	* gm2/sets/run/pass/multisetrotate5.mod: New test.
+ 	* gm2/sets/run/pass/setcard.mod: New test.
+ 	* gm2/sets/run/pass/setincl.mod: New test.
+ 
+ 2025-09-19  Jeff Law  <jlaw@ventanamicro.com>
+ 
+ 	PR target/121983
+ 	* gcc.target/riscv/pr121983.c: New test.
+ 
+ 2025-09-19  Raphael Moreira Zinsly  <rzinsly@ventanamicro.com>
+ 
+ 	* gcc.target/riscv/rvv/autovec/shuffle-slide-run.h:
+ 	New test.
+ 	* gcc.target/riscv/rvv/autovec/shuffle-slidedown-run.c:
+ 	Likewise.
+ 	* gcc.target/riscv/rvv/autovec/shuffle-slideup-run.c:
+ 	Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slide.h:
+ 	Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-1.c:
+ 	Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-2.c:
+ 	Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-perm.h:
+ 	Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slideup-1.c:
+ 	Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slideup-2.c:
+ 	Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slideup-perm.h:
+ 	Likewise.
+ 
+ 2025-09-19  Jim Lin  <jim@andestech.com>
+ 
+ 	* gcc.target/riscv/save-restore-cfi-3.c: New test.
+ 	* gcc.target/riscv/pr120811.c: New file.
+ 
+ 2025-09-19  Jeff Law  <jlaw@ventanamicro.com>
+ 
+ 	* gcc.target/riscv/bclr-lowest-set-bit-1.c: New test.
+ 
+ 2025-09-18  Joseph Myers  <josmyers@redhat.com>
+ 
+ 	* gcc.dg/c2y-anon-init-1.c, gcc.dg/c2y-incomplete-2.c:
+ 	gcc.dg/c2y-linkage-1.c, gcc.dg/c2y-linkage-2.c,
+ 	gcc.dg/c2y-linkage-3.c, gcc.dg/c2y-linkage-4.c,
+ 	gcc.dg/c2y-static-assert-1.c: New tests.
+ 	* gcc.dg/c2y-linkage-1.c: New file.
+ 	* gcc.dg/c2y-linkage-2.c: New file.
+ 	* gcc.dg/c2y-linkage-3.c: New file.
+ 	* gcc.dg/c2y-linkage-4.c: New file.
+ 	* gcc.dg/c2y-static-assert-1.c: New file.
+ 
+ 2025-09-18  Jason Merrill  <jason@redhat.com>
+ 
+ 	* g++.dg/cpp2a/constexpr-98122.C: Adjust diagnostic.
+ 	* g++.dg/cpp26/constexpr-new6a.C: New test.
+ 
+ 2025-09-18  Jason Merrill  <jason@redhat.com>
+ 
+ 	* g++.dg/analyzer/pr97116.C: Adjust diagnostic.
+ 	* g++.dg/warn/Warray-bounds-20.C: Likewise.
+ 
+ 2025-09-18  Jason Merrill  <jason@redhat.com>
+ 
+ 	* g++.dg/init/pr25811.C: Tweak diagnostic.
+ 	* g++.dg/warn/Warray-bounds-12.C: Likewise.
+ 	* g++.dg/warn/Warray-bounds-13.C: Likewise.
+ 	* g++.dg/cpp26/constexpr-new6.C: New test.
+ 
+ 2025-09-18  Jason Merrill  <jason@redhat.com>
+ 
+ 	* g++.dg/warn/Wmismatched-new-delete-2.C: Remove xfail.
+ 
+ 2025-09-18  Qing Zhao  <qing.zhao@oracle.com>
+ 
+ 	PR tree-optimization/121894
+ 	* g++.dg/opt/auto-init-sra-pr121894.C: New test.
+ 
+ 2025-09-18  Paul Thomas  <pault@gcc.gnu.org>
+ 
+ 	PR fortran/114815
+ 	* gfortran.dg/pdt_3.f03: Add missing deallocation of 'matrix'.
+ 	* gfortran.dg/pdt_17.f03: Change dg-error text.
+ 	* gfortran.dg/pdt_47.f03: New test.
+ 
+ 2025-09-18  Zhongyao Chen  <chenzhongyao.hit@gmail.com>
+ 
+ 	PR target/121910
+ 	* gcc.target/riscv/rvv/autovec/pr121910.c: New file.
+ 
+ 2025-09-18  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/121977
+ 	* g++.dg/gomp/pr121977.C: New test.
+ 
+ 2025-09-18  Karl Meakin  <karl.meakin@arm.com>
+ 
+ 	* gcc.target/aarch64/sme2/acle-asm/svluti4_zt_1.c: New test.
+ 	* gcc.target/aarch64/sme2/acle-asm/svwrite_lane_zt_1.c: New test.
+ 	* gcc.target/aarch64/sme2/acle-asm/svwrite_zt_1.c: New test.
+ 	* gcc.target/aarch64/sve/acle/general-c/svluti4_zt_1.c: New test.
+ 	* gcc.target/aarch64/sve/acle/general-c/svwrite_lane_zt_1.c: New test.
+ 	* gcc.target/aarch64/sve/acle/general-c/svwrite_zt_1.c: New test.
+ 
+ 2025-09-18  Pan Li  <pan2.li@intel.com>
+ 
+ 	* gcc.target/riscv/sat/sat_arith.h: Add test helper macros.
+ 	* gcc.target/riscv/sat/sat_u_mul-6-u16-from-u128.c: New test.
+ 	* gcc.target/riscv/sat/sat_u_mul-6-u32-from-u128.c: New test.
+ 	* gcc.target/riscv/sat/sat_u_mul-6-u64-from-u128.c: New test.
+ 	* gcc.target/riscv/sat/sat_u_mul-6-u8-from-u128.c: New test.
+ 	* gcc.target/riscv/sat/sat_u_mul-run-6-u16-from-u128.c: New test.
+ 	* gcc.target/riscv/sat/sat_u_mul-run-6-u32-from-u128.c: New test.
+ 	* gcc.target/riscv/sat/sat_u_mul-run-6-u64-from-u128.c: New test.
+ 	* gcc.target/riscv/sat/sat_u_mul-run-6-u8-from-u128.c: New test.
+ 
+ 2025-09-18  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/121720
+ 	* gcc.dg/tree-ssa/ssa-pre-36.c: New testcase.
+ 
+ 2025-09-18  hongtao.liu  <hongtao.liu@intel.com>
+ 
+ 	* gcc.target/i386/pieces-memcpy-18.c: Use -mtune=znver5
+ 	instead of -mtune=sapphirerapids.
+ 	* gcc.target/i386/pieces-memcpy-21.c: Ditto.
+ 	* gcc.target/i386/pieces-memset-46.c: Ditto.
+ 	* gcc.target/i386/pieces-memset-49.c: Ditto.
+ 
+ 2025-09-17  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* g++.dg/analyzer/unique_ptr-1.C: Rename to...
+ 	* g++.dg/analyzer/std-unique_ptr-1.C: ...this.
+ 	* g++.dg/analyzer/unique_ptr-2.C: Rename to...
+ 	* g++.dg/analyzer/std-unique_ptr-2.C: ...this.
+ 
+ 2025-09-17  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/121962
+ 	* gcc.dg/torture/pr121962-1.c: New test.
+ 
+ 2025-09-17  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	* gcc.dg/tree-ssa/copy-prop-aggregate-arg-2.c: New test.
+ 
+ 2025-09-17  Thomas Koenig  <tkoenig@gcc.gnu.org>
+ 
+ 	* gfortran.dg/matmul_blas_3.f90: New test.
+ 
+ 2025-09-17  Shreya Munnangi  <smunnangi1@ventanamicro.com>
+ 
+ 	PR tree-optimization/58727
+ 	* gcc.target/riscv/pr58727.c: New test.
+ 
+ 2025-09-17  Richard Biener  <rguenther@suse.de>
+ 
+ 	* gcc.dg/torture/pr84830.c: Turn into GIMPLE unit test for PRE.
+ 
+ 2025-09-17  Stefan Schulze Frielinghaus  <stefansf@gcc.gnu.org>
+ 
+ 	* gcc.target/s390/arch13/bitops-1.c: Do not return a 32bit value
+ 	but write it to memory.
+ 	* gcc.target/s390/arch13/bitops-2.c: Ditto.
+ 	* gcc.target/s390/md/andc-splitter-2.c: Adjust scan assembler
+ 	directive because sign extends are folded, now.
+ 
+ 2025-09-17  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	* objc.dg/special/load-category-1.m: Add second source.
+ 	* objc.dg/special/load-category-2.m: Likewise.
+ 	* objc.dg/special/load-category-3.m: Likewise.
+ 	* objc.dg/special/unclaimed-category-1.m: Likewise.
+ 	* objc.dg/special/special.exp: Rewrite to make use of generic
+ 	testsuite facilities.
+ 
+ 2025-09-17  Torbjörn SVENSSON  <torbjorn.svensson@foss.st.com>
+ 
+ 	* gcc.target/arm/fp16-aapcs.c: New test.
+ 	* gcc.target/arm/fp16-aapcs-1.c: Removed.
+ 	* gcc.target/arm/fp16-aapcs-2.c: Likewise.
+ 	* gcc.target/arm/fp16-aapcs-3.c: Likewise.
+ 	* gcc.target/arm/fp16-aapcs-4.c: Likewise.
+ 
+ 2025-09-17  Pan Li  <pan2.li@intel.com>
+ 
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c: Add asm check
+ 	for vwmulu.vx.
+ 	* 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-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-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_widen.h: Add test helper
+ 	macros.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_widen_data.h: Add test
+ 	data for vwmulu.vx run test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_vwmulu-run-1-u64.c: New test.
+ 
+ 2025-09-17  Pan Li  <pan2.li@intel.com>
+ 
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c: Add asm check
+ 	for vwsubu.vx.
+ 	* 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-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-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_widen.h: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_widen_data.h: Add test
+ 	data for run test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_vwsubu-run-1-u64.c: New test.
+ 
+ 2025-09-17  Pan Li  <pan2.li@intel.com>
+ 
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c: Add asm check
+ 	for vwaddu.vx.
+ 	* 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-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-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_vwaddu-run-1-u64.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_widen.h: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_widen_data.h: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_widen_vx_run.h: New test.
+ 
+ 2025-09-17  Haochen Jiang  <haochen.jiang@intel.com>
+ 
+ 	* gcc.target/i386/avx512bw-vpmovuswb-2.c: Correct res_ref2
+ 	array size.
+ 	* gcc.target/i386/avx512bw-vpmovwb-2.c: Ditto.
+ 
+ 2025-09-17  Haochen Jiang  <haochen.jiang@intel.com>
+ 
+ 	* gcc.target/i386/vect-epilogues-4.c: Fix for epilogue
+ 	vect tree dump.
+ 
+ 2025-09-16  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR c/121421
+ 	* gcc.dg/gimplefe-error-16.c: New test.
+ 
+ 2025-09-16  Wilco Dijkstra  <wilco.dijkstra@arm.com>
+ 
+ 	PR middle-end/66462
+ 	* gcc.target/aarch64/pr66462.c: Update test.
+ 
+ 2025-09-16  Jennifer Schmitz  <jschmitz@nvidia.com>
+ 
+ 	PR target/121602
+ 	* gcc.target/aarch64/sve/acle/asm/mul_s16.c: New test.
+ 	* gcc.target/aarch64/sve/acle/asm/mul_s32.c: Likewise.
+ 	* gcc.target/aarch64/sve/acle/asm/mul_s64.c: Likewise.
+ 	* gcc.target/aarch64/sve/acle/asm/mul_s8.c: Likewise.
+ 	* gcc.target/aarch64/sve/acle/asm/mul_u16.c: Likewise.
+ 	* gcc.target/aarch64/sve/acle/asm/mul_u32.c: Likewise.
+ 	* gcc.target/aarch64/sve/acle/asm/mul_u64.c: Likewise.
+ 	* gcc.target/aarch64/sve/acle/asm/mul_u8.c: Likewise.
+ 
+ 2025-09-16  Haochen Jiang  <haochen.jiang@intel.com>
+ 
+ 	* gcc.target/i386/avx512bw-vpackssdw-1.c:
+ 	Fix xmm/ymm mask tests.
+ 	* gcc.target/i386/avx512bw-vpacksswb-1.c: Ditto.
+ 	* gcc.target/i386/avx512bw-vpackusdw-1.c: Ditto.
+ 	* gcc.target/i386/avx512bw-vpackuswb-1.c: Ditto.
+ 	* gcc.target/i386/avx512bw-vpermw-1.c: Test xmm.
+ 	* gcc.target/i386/avx512bw-vpmulhw-1.c:
+ 	Fix xmm/ymm mask tests.
+ 	* gcc.target/i386/avx512f-vec-init.c: Remove duplicate test.
+ 	* gcc.target/i386/avx512fp16-13.c: Fix test for aligned load.
+ 	* gcc.target/i386/avx512fp16-conjugation-1.c: Revise the test
+ 	to test more precisely on masks.
+ 	* gcc.target/i386/avx512fp16vl-conjugation-1.c: Ditto.
+ 	* gcc.target/i386/avx512vbmi-vpermb-1.c: Test xmm.
+ 	* gcc.target/i386/avx512vl-vcvtpd2ps-1.c: Fix scan asm.
+ 	* gcc.target/i386/avx512vl-vinsert-1.c: Fix typo.
+ 	* gcc.target/i386/avx512vl-vpmulld-1.c:
+ 	Fix xmm/ymm mask tests.
+ 	* gcc.target/i386/avx512vl-vptestmd-1.c: Ditto.
+ 	* gcc.target/i386/bitwise_mask_op-1.c: Fix typo.
+ 	* gcc.target/i386/cond_op_shift_q-1.c: Test both vpsra{,v}
+ 	and vpsll{,v}.
+ 	* gcc.target/i386/cond_op_shift_ud-1.c: Ditto.
+ 	* gcc.target/i386/cond_op_shift_uq-1.c: Ditto.
+ 	* gcc.target/i386/memcpy-pr95886.c: Fix the wrong const int.
+ 	* gcc.target/i386/part-vect-sqrtph-1.c: Remove duplicate test.
+ 	* gcc.target/i386/pr107432-7.c: Test vpmov{s,z}xbw instead of
+ 	vpmov{s,z}xbd.
+ 	* gcc.target/i386/pr88828-0.c: Fix pblendw scan asm.
+ 
+ 2025-09-16  liuhongt  <hongtao.liu@intel.com>
+ 
+ 	* gcc.target/i386/avx_vbroadcastf128.c: New test.
+ 
+ 2025-09-15  Clément Chigot  <chigot@adacore.com>
+ 
+ 	* gcc.target/aarch64/pr113356.C: Move to ...
+ 	* g++.target/aarch64/pr113356.C: ... here.
+ 
+ 2025-09-15  Pan Li  <pan2.li@intel.com>
+ 
+ 	* gcc.target/riscv/sat/widen-mul-0.c: New test.
+ 	* gcc.target/riscv/sat/widen-mul-1.c: New test.
+ 	* gcc.target/riscv/sat/widen-mul-2.c: New test.
+ 	* gcc.target/riscv/sat/widen-mul-3.c: New test.
+ 	* gcc.target/riscv/sat/widen-mul.h: New test.
+ 
+ 2025-09-15  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/121751
+ 	PR tree-optimization/121418
+ 	PR tree-optimization/121417
+ 	* gcc.dg/tree-ssa/copy-prop-aggregate-1.c: New test.
+ 	* gcc.dg/tree-ssa/copy-prop-aggregate-memcpy-1.c: New test.
+ 	* gcc.dg/tree-ssa/copy-prop-aggregate-memcpy-2.c: New test.
+ 
+ 2025-09-15  Alex Coplan  <alex.coplan@arm.com>
+ 
+ 	PR tree-optimization/121772
+ 	* gcc.target/aarch64/torture/pr121772.c: New test.
+ 
+ 2025-09-15  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR target/121934
+ 	* gcc.target/i386/pr121934-1a.c: New test.
+ 	* gcc.target/i386/pr121934-1b.c: Likewise.
+ 	* gcc.target/i386/pr121934-2a.c: Likewise.
+ 	* gcc.target/i386/pr121934-2b.c: Likewise.
+ 	* gcc.target/i386/pr121934-3a.c: Likewise.
+ 	* gcc.target/i386/pr121934-3b.c: Likewise.
+ 	* gcc.target/i386/pr121934-4a.c: Likewise.
+ 	* gcc.target/i386/pr121934-4b.c: Likewise.
+ 	* gcc.target/i386/pr121934-5a.c: Likewise.
+ 	* gcc.target/i386/pr121934-5b.c: Likewise.
+ 
+ 2025-09-15  Xi Ruoyao  <xry111@xry111.site>
+ 
+ 	PR target/121906
+ 	* gcc.target/loongarch/pr121906.c: New test.
+ 
+ 2025-09-15  Kito Cheng  <kito.cheng@sifive.com>
+ 
+ 	* gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/andes_vector.h: New file.
+ 	* gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vfncvtbf16s.c
+ 	(#include): Use local andes_vector.h instead of system header.
+ 	* gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vfwcvtsbf16.c
+ 	(#include): Likewise.
+ 	* gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/andes_vector.h: New file.
+ 	* gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vfncvtbf16s.c
+ 	(#include): Use local andes_vector.h instead of system header.
+ 	* gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vfwcvtsbf16.c
+ 	(#include): Likewise.
+ 	* gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/andes_vector.h: New file.
+ 	* gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vfncvtbf16s.c
+ 	(#include): Use local andes_vector.h instead of system header.
+ 	* gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vfwcvtsbf16.c
+ 	(#include): Likewise.
+ 	* gcc.target/riscv/rvv/xandesvector/policy/overloaded/andes_vector.h: New file.
+ 	* gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vfncvtbf16s.c
+ 	(#include): Use local andes_vector.h instead of system header.
+ 	* gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vfwcvtsbf16.c
+ 	(#include): Likewise.
+ 	* gcc.target/riscv/rvv/xsfvector/sifive_vector.h: New file.
+ 	* gcc.target/riscv/rvv/xtheadvector/riscv_th_vector.h: New file.
+ 	* gcc.target/riscv/rvv/xtheadvector/riscv_vector.h: New file.
+ 
+ 2025-09-15  Stefan Schulze Frielinghaus  <stefansf@gcc.gnu.org>
+ 
+ 	* gcc.dg/pr121391-1.c: New test.
+ 	* gcc.dg/pr121391-2.c: New test.
+ 
+ 2025-09-15  Paul Thomas  <pault@gcc.gnu.org>
+ 
+ 	PR fortran/83763
+ 	* gfortran.dg/pdt_46.f03: New test.
+ 
+ 2025-09-14  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR lto/121935
+ 	* g++.dg/lto/pr121935_0.C: New testcase.
+ 
+ 2025-09-14  Yuao Ma  <c8ef@outlook.com>
+ 
+ 	* gfortran.dg/conditional_1.f90: New test.
+ 	* gfortran.dg/conditional_2.f90: New test.
+ 	* gfortran.dg/conditional_3.f90: New test.
+ 	* gfortran.dg/conditional_4.f90: New test.
+ 	* gfortran.dg/conditional_5.f90: New test.
+ 	* gfortran.dg/conditional_6.f90: New test.
+ 	* gfortran.dg/conditional_7.f90: New test.
+ 	* gfortran.dg/conditional_8.f90: New test.
+ 	* gfortran.dg/conditional_9.f90: New test.
+ 
+ 2025-09-14  Richard Biener  <rguenther@suse.de>
+ 
+ 	* gcc.dg/vect/vect-reduc-chain-2.c: Adjust.
+ 	* gcc.dg/vect/vect-reduc-chain-3.c: Likewise.
+ 
  2025-09-13  Dimitar Dimitrov  <dimitar@dinux.eu>
  
  	* gcc.dg/asm-hard-reg-error-1.c: Enable test for PRU, and define
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.dg/analyzer/pr97116.C gcc-16-20250921/gcc/testsuite/g++.dg/analyzer/pr97116.C
*** gcc-16-20250914/gcc/testsuite/g++.dg/analyzer/pr97116.C	Sun Sep 14 22:32:10 2025
--- gcc-16-20250921/gcc/testsuite/g++.dg/analyzer/pr97116.C	Sun Sep 21 22:32:41 2025
***************
*** 3,9 ****
  
  struct foo
  {
!   foo (int i) : m_i (i) {} // { dg-message "argument 'this' of 'foo::foo\\(int\\)' must be non-null" "note" }
  
    int get () const { return m_i; } // { dg-message "argument 'this' of '\[^\n\]*' must be non-null" "note" }
    
--- 3,9 ----
  
  struct foo
  {
!   foo (int i) : m_i (i) {}
  
    int get () const { return m_i; } // { dg-message "argument 'this' of '\[^\n\]*' must be non-null" "note" }
    
*************** struct foo
*** 15,22 ****
  
  void test_1 (void)
  {
!   foo *p = new(NULL) foo (42); // { dg-warning "non-null expected" "warning" }
!   // { dg-message "argument 'this'( \\(\[^\n\]*\\))? NULL where non-null expected" "final event" { target *-*-* } .-1 }
  }
  
  int test_2 (void)
--- 15,21 ----
  
  void test_1 (void)
  {
!   foo *p = new(NULL) foo (42); // { dg-warning "dereference of NULL" "warning" }
  }
  
  int test_2 (void)
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.dg/analyzer/std-unique_ptr-1.C gcc-16-20250921/gcc/testsuite/g++.dg/analyzer/std-unique_ptr-1.C
*** gcc-16-20250914/gcc/testsuite/g++.dg/analyzer/std-unique_ptr-1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/g++.dg/analyzer/std-unique_ptr-1.C	Sun Sep 21 22:32:41 2025
***************
*** 0 ****
--- 1,13 ----
+ // Verify that we complain about trivial uses of NULL unique_ptr.
+ 
+ // { dg-do compile { target c++11 } }
+ 
+ #include <memory>
+ 
+ struct A {int x; int y;};
+ 
+ int main() {
+   std::unique_ptr<A> a;
+   a->x = 12; // { dg-warning "dereference of NULL" }
+   return 0;
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.dg/analyzer/std-unique_ptr-2.C gcc-16-20250921/gcc/testsuite/g++.dg/analyzer/std-unique_ptr-2.C
*** gcc-16-20250914/gcc/testsuite/g++.dg/analyzer/std-unique_ptr-2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/g++.dg/analyzer/std-unique_ptr-2.C	Sun Sep 21 22:32:41 2025
***************
*** 0 ****
--- 1,17 ----
+ // { dg-do compile { target c++11 } }
+ // { dg-additional-options "-Wno-analyzer-too-complex" } */
+ 
+ #include <memory>
+ 
+ struct A {int x; int y;};
+ 
+ extern std::unique_ptr<A> make_ptr ();
+ 
+ int test (int flag) {
+   std::unique_ptr<A> a;
+   if (flag)
+     a = make_ptr ();
+   a->x = 12; // { dg-warning "dereference of NULL" "" { xfail *-*-*} }
+   // TODO: this is failing due to "too complex" warnings
+   return 0;
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.dg/analyzer/unique_ptr-1.C gcc-16-20250921/gcc/testsuite/g++.dg/analyzer/unique_ptr-1.C
*** gcc-16-20250914/gcc/testsuite/g++.dg/analyzer/unique_ptr-1.C	Sun Sep 14 22:32:10 2025
--- gcc-16-20250921/gcc/testsuite/g++.dg/analyzer/unique_ptr-1.C	Thu Jan  1 00:00:00 1970
***************
*** 1,13 ****
- // Verify that we complain about trivial uses of NULL unique_ptr.
- 
- // { dg-do compile { target c++11 } }
- 
- #include <memory>
- 
- struct A {int x; int y;};
- 
- int main() {
-   std::unique_ptr<A> a;
-   a->x = 12; // { dg-warning "dereference of NULL" }
-   return 0;
- }
--- 0 ----
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.dg/analyzer/unique_ptr-2.C gcc-16-20250921/gcc/testsuite/g++.dg/analyzer/unique_ptr-2.C
*** gcc-16-20250914/gcc/testsuite/g++.dg/analyzer/unique_ptr-2.C	Sun Sep 14 22:32:10 2025
--- gcc-16-20250921/gcc/testsuite/g++.dg/analyzer/unique_ptr-2.C	Thu Jan  1 00:00:00 1970
***************
*** 1,17 ****
- // { dg-do compile { target c++11 } }
- // { dg-additional-options "-Wno-analyzer-too-complex" } */
- 
- #include <memory>
- 
- struct A {int x; int y;};
- 
- extern std::unique_ptr<A> make_ptr ();
- 
- int test (int flag) {
-   std::unique_ptr<A> a;
-   if (flag)
-     a = make_ptr ();
-   a->x = 12; // { dg-warning "dereference of NULL" "" { xfail *-*-*} }
-   // TODO: this is failing due to "too complex" warnings
-   return 0;
- }
--- 0 ----
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.dg/cpp23/static-operator-call8.C gcc-16-20250921/gcc/testsuite/g++.dg/cpp23/static-operator-call8.C
*** gcc-16-20250914/gcc/testsuite/g++.dg/cpp23/static-operator-call8.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/g++.dg/cpp23/static-operator-call8.C	Sun Sep 21 22:32:42 2025
***************
*** 0 ****
--- 1,6 ----
+ // PR c++/119048
+ // { dg-do compile { target c++23 } }
+ 
+ int main() {
+ 	[] {}, [](...) static {};
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.dg/cpp26/constexpr-new6.C gcc-16-20250921/gcc/testsuite/g++.dg/cpp26/constexpr-new6.C
*** gcc-16-20250914/gcc/testsuite/g++.dg/cpp26/constexpr-new6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/g++.dg/cpp26/constexpr-new6.C	Sun Sep 21 22:32:42 2025
***************
*** 0 ****
--- 1,17 ----
+ // { dg-do compile { target c++26 } }
+ 
+ #include <new>
+ 
+ union U { double d; int i; };
+ 
+ constexpr int f()
+ {
+   U u;
+   new (&u.i) int;
+   return u.i;			// { dg-error "uninitialized" }
+ }
+ 
+ int main ()
+ {
+   constexpr int i = f();	// { dg-message "" }
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.dg/cpp26/constexpr-new6a.C gcc-16-20250921/gcc/testsuite/g++.dg/cpp26/constexpr-new6a.C
*** gcc-16-20250914/gcc/testsuite/g++.dg/cpp26/constexpr-new6a.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/g++.dg/cpp26/constexpr-new6a.C	Sun Sep 21 22:32:42 2025
***************
*** 0 ****
--- 1,17 ----
+ // { dg-do compile { target c++26 } }
+ 
+ #include <new>
+ 
+ union U { double d; int i; };
+ 
+ constexpr int f()
+ {
+   U u;
+   new (&u.i) int;
+   return u.d;			// { dg-error "active" }
+ }
+ 
+ int main ()
+ {
+   constexpr int i = f();	// { dg-message "" }
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.dg/cpp2a/concepts-placeholder15.C gcc-16-20250921/gcc/testsuite/g++.dg/cpp2a/concepts-placeholder15.C
*** gcc-16-20250914/gcc/testsuite/g++.dg/cpp2a/concepts-placeholder15.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/g++.dg/cpp2a/concepts-placeholder15.C	Sun Sep 21 22:32:42 2025
***************
*** 0 ****
--- 1,17 ----
+ // PR c++/121981
+ // { dg-do compile { target c++20 } }
+ 
+ template<auto V>
+ concept C = requires { V; };
+ 
+ template<class T, auto V>
+ concept D = C<V>;
+ 
+ template<auto V, D<V> auto W>
+ struct A { };
+ 
+ template<auto V, D<V> T>
+ struct B { };
+ 
+ A<0, 1> a;
+ B<0, int> b;
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.dg/cpp2a/constexpr-98122.C gcc-16-20250921/gcc/testsuite/g++.dg/cpp2a/constexpr-98122.C
*** gcc-16-20250914/gcc/testsuite/g++.dg/cpp2a/constexpr-98122.C	Sun Sep 14 22:32:11 2025
--- gcc-16-20250921/gcc/testsuite/g++.dg/cpp2a/constexpr-98122.C	Sun Sep 21 22:32:42 2025
*************** bar ()
*** 9,15 ****
  {
    V f { .b = 42 };
    constexpr auto m = &V::a;
!   return (f.*m) == 42;  // { dg-error "accessing 'V::a' member instead of initialized 'V::b' member in constant expression" }
  }
  
  constexpr bool
--- 9,15 ----
  {
    V f { .b = 42 };
    constexpr auto m = &V::a;
!   return (f.*m) == 42;  // { dg-error "accessing 'V::a' member instead of active 'V::b' member in constant expression" }
  }
  
  constexpr bool
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.dg/gomp/pr121977.C gcc-16-20250921/gcc/testsuite/g++.dg/gomp/pr121977.C
*** gcc-16-20250914/gcc/testsuite/g++.dg/gomp/pr121977.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/g++.dg/gomp/pr121977.C	Sun Sep 21 22:32:42 2025
***************
*** 0 ****
--- 1,17 ----
+ // PR c++/121977
+ // { dg-do compile }
+ // { dg-additional-options "-ftrivial-auto-var-init=zero" }
+ 
+ struct T { T () {}; virtual ~T () {}; int t; };
+ struct S : virtual public T { int a; void foo (); };
+ 
+ void
+ S::foo ()
+ {
+ #pragma omp parallel
+   {
+     #pragma omp taskloop firstprivate (a, t) lastprivate (t)
+     for (int i = 0; i < a; i++)
+       t++;
+   }
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.dg/init/pr25811.C gcc-16-20250921/gcc/testsuite/g++.dg/init/pr25811.C
*** gcc-16-20250914/gcc/testsuite/g++.dg/init/pr25811.C	Sun Sep 14 22:32:11 2025
--- gcc-16-20250921/gcc/testsuite/g++.dg/init/pr25811.C	Sun Sep 21 22:32:42 2025
*************** void f11 ()
*** 187,193 ****
  
  void f12 ()
  {
!   new A3[1]; // { dg-error "deleted|uninitialized reference member" }
  }
  
  void f13 ()
--- 187,193 ----
  
  void f12 ()
  {
!   new A3[1]; // { dg-error "deleted|uninitialized reference" }
  }
  
  void f13 ()
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.dg/ipa/devirt-2.C gcc-16-20250921/gcc/testsuite/g++.dg/ipa/devirt-2.C
*** gcc-16-20250914/gcc/testsuite/g++.dg/ipa/devirt-2.C	Sun Sep 14 22:32:11 2025
--- gcc-16-20250921/gcc/testsuite/g++.dg/ipa/devirt-2.C	Sun Sep 21 22:32:42 2025
***************
*** 1,7 ****
  /* Verify that simple virtual calls using this pointer are converted
     to direct calls by ipa-cp.  */
  /* { dg-do run } */
! /* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp"  } */
  
  extern "C" void abort (void);
  
--- 1,7 ----
  /* Verify that simple virtual calls using this pointer are converted
     to direct calls by ipa-cp.  */
  /* { dg-do run } */
! /* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp --param max-devirt-targets=1"  } */
  
  extern "C" void abort (void);
  
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.dg/ipa/devirt-42.C gcc-16-20250921/gcc/testsuite/g++.dg/ipa/devirt-42.C
*** gcc-16-20250914/gcc/testsuite/g++.dg/ipa/devirt-42.C	Sun Sep 14 22:32:11 2025
--- gcc-16-20250921/gcc/testsuite/g++.dg/ipa/devirt-42.C	Sun Sep 21 22:32:42 2025
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-O3 -fno-ipa-cp -fdump-ipa-inline-details -fno-early-inlining -fdump-tree-optimized" } */
  struct A {
    virtual int foo () {return 1;}
    int bar () {return foo();}
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-O3 -fno-ipa-cp -fdump-ipa-inline-details -fno-early-inlining -fdump-tree-optimized --param max-devirt-targets=1" } */
  struct A {
    virtual int foo () {return 1;}
    int bar () {return foo();}
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.dg/lto/devirt-2_0.C gcc-16-20250921/gcc/testsuite/g++.dg/lto/devirt-2_0.C
*** gcc-16-20250914/gcc/testsuite/g++.dg/lto/devirt-2_0.C	Sun Sep 14 22:32:11 2025
--- gcc-16-20250921/gcc/testsuite/g++.dg/lto/devirt-2_0.C	Sun Sep 21 22:32:42 2025
***************
*** 1,4 ****
  /* { dg-lto-do run } */
! /* { dg-lto-options { "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -flto" } } */
  #include "../ipa/devirt-2.C"
  /* { dg-final { scan-wpa-ipa-dump "Discovered a virtual call to a known target.*foo"  "cp"  } } */
--- 1,4 ----
  /* { dg-lto-do run } */
! /* { dg-lto-options { "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -flto --param max-devirt-targets=1" } } */
  #include "../ipa/devirt-2.C"
  /* { dg-final { scan-wpa-ipa-dump "Discovered a virtual call to a known target.*foo"  "cp"  } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.dg/opt/auto-init-sra-pr121894.C gcc-16-20250921/gcc/testsuite/g++.dg/opt/auto-init-sra-pr121894.C
*** gcc-16-20250914/gcc/testsuite/g++.dg/opt/auto-init-sra-pr121894.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/g++.dg/opt/auto-init-sra-pr121894.C	Sun Sep 21 22:32:43 2025
***************
*** 0 ****
--- 1,22 ----
+ /* Verify that SRA total scalarization will not be confused by padding
+    and also not confused by auto initialization.  */
+ /* { dg-do compile } */
+ /* { dg-options "-O1 -fdump-tree-esra -ftrivial-auto-var-init=pattern" } */
+ 
+ struct S { int a, b, c, d; };
+ void bar (int, int, int, int);
+ 
+ void
+ foo ()
+ {
+   S s;
+   s.a = 1;
+   s.c = 2;
+   s.d = 3;
+   s.a++;
+   s.c++;
+   s.d++;
+   bar (s.a, s.b, s.c, s.d);
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "DEFERRED_INIT" 4 "esra" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.dg/warn/Warray-bounds-12.C gcc-16-20250921/gcc/testsuite/g++.dg/warn/Warray-bounds-12.C
*** gcc-16-20250914/gcc/testsuite/g++.dg/warn/Warray-bounds-12.C	Sun Sep 14 22:32:12 2025
--- gcc-16-20250921/gcc/testsuite/g++.dg/warn/Warray-bounds-12.C	Sun Sep 21 22:32:44 2025
*************** void sink (void*);
*** 19,25 ****
  
  void warn_new ()
  {
!   T (int32_t, 0, 0);          // { dg-warning "array subscript 0 is outside array bounds of 'int32_t \\\[0]'" }
                                // { dg-message "object of size \\d allocated by '\[^\n\r]*operator new\[^\n\r]*'" "note" { target *-*-* } .-1 }
    T (int32_t, 1, 0);          // { dg-warning "array subscript 'int32_t {aka (long )?int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[1]'" }
    T (int32_t, 2, 0);         //  { dg-warning "array subscript 'int32_t {aka (long )?int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[2]'" }
--- 19,25 ----
  
  void warn_new ()
  {
!   T (int32_t, 0, 0);          // { dg-warning "array subscript 0 is outside array bounds" }
                                // { dg-message "object of size \\d allocated by '\[^\n\r]*operator new\[^\n\r]*'" "note" { target *-*-* } .-1 }
    T (int32_t, 1, 0);          // { dg-warning "array subscript 'int32_t {aka (long )?int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[1]'" }
    T (int32_t, 2, 0);         //  { dg-warning "array subscript 'int32_t {aka (long )?int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[2]'" }
*************** void warn_array_new ()
*** 45,51 ****
  #undef NEW
  #define NEW(n)  new char [n]
  
!   T (int32_t, 0, 0);          // { dg-warning "array subscript 0 is outside array bounds of 'int32_t \\\[0]'" }
                                // { dg-message "object of size \\d allocated by '\[^\n\r]*operator new\[^\n\r]*'" "note" { target *-*-* } .-1 }
    T (int32_t, 1, 0);          // { dg-warning "array subscript 'int32_t {aka (long )?int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[1]'" }
    T (int32_t, 2, 0);         //  { dg-warning "array subscript 'int32_t {aka (long )?int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[2]'" }
--- 45,51 ----
  #undef NEW
  #define NEW(n)  new char [n]
  
!   T (int32_t, 0, 0);          // { dg-warning "array subscript 0 is outside array bounds" }
                                // { dg-message "object of size \\d allocated by '\[^\n\r]*operator new\[^\n\r]*'" "note" { target *-*-* } .-1 }
    T (int32_t, 1, 0);          // { dg-warning "array subscript 'int32_t {aka (long )?int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[1]'" }
    T (int32_t, 2, 0);         //  { dg-warning "array subscript 'int32_t {aka (long )?int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[2]'" }
*************** void warn_array_new ()
*** 53,59 ****
  
    T (int32_t, 4, 0);
  
!   T (int32_t, 0, 1);          // { dg-warning "array subscript 1 is outside array bounds of 'int32_t \\\[0]'" }
    T (int32_t, 1, 1);          // { dg-warning "array subscript 1 is outside array bounds " }
    T (int32_t, 2, 1);          // { dg-warning "array subscript 1 is outside array bounds " }
    T (int32_t, 3, 1);          // { dg-warning "array subscript 1 is outside array bounds " }
--- 53,59 ----
  
    T (int32_t, 4, 0);
  
!   T (int32_t, 0, 1);          // { dg-warning "array subscript 1 is outside array bounds" }
    T (int32_t, 1, 1);          // { dg-warning "array subscript 1 is outside array bounds " }
    T (int32_t, 2, 1);          // { dg-warning "array subscript 1 is outside array bounds " }
    T (int32_t, 3, 1);          // { dg-warning "array subscript 1 is outside array bounds " }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.dg/warn/Warray-bounds-13.C gcc-16-20250921/gcc/testsuite/g++.dg/warn/Warray-bounds-13.C
*** gcc-16-20250914/gcc/testsuite/g++.dg/warn/Warray-bounds-13.C	Sun Sep 14 22:32:12 2025
--- gcc-16-20250921/gcc/testsuite/g++.dg/warn/Warray-bounds-13.C	Sun Sep 21 22:32:44 2025
*************** void warn_nothrow_array_new ()
*** 66,72 ****
  #undef NEW
  #define NEW(n)  new (std::nothrow) char [n]
  
!   T (int32_t, 0, 0);          // { dg-warning "array subscript 0 is outside array bounds of 'int32_t \\\[0]'" }
                                // { dg-message "object of size \\d allocated by '\[^\n\r]*operator new\[^\n\r]*'" "note" { target *-*-* } .-1 }
    T (int32_t, 1, 0);          // { dg-warning "array subscript 'int32_t {aka (long )?int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[1]'" }
    T (int32_t, 2, 0);         //  { dg-warning "array subscript 'int32_t {aka (long )?int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[2]'" }
--- 66,72 ----
  #undef NEW
  #define NEW(n)  new (std::nothrow) char [n]
  
!   T (int32_t, 0, 0);          // { dg-warning "array subscript 0 is outside array bounds" }
                                // { dg-message "object of size \\d allocated by '\[^\n\r]*operator new\[^\n\r]*'" "note" { target *-*-* } .-1 }
    T (int32_t, 1, 0);          // { dg-warning "array subscript 'int32_t {aka (long )?int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[1]'" }
    T (int32_t, 2, 0);         //  { dg-warning "array subscript 'int32_t {aka (long )?int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[2]'" }
*************** void warn_nothrow_array_new ()
*** 74,80 ****
  
    T (int32_t, 4, 0);
  
!   T (int32_t, 0, 1);          // { dg-warning "array subscript 1 is outside array bounds of 'int32_t \\\[0]'" }
    T (int32_t, 1, 1);          // { dg-warning "array subscript 1 is outside array bounds " }
    T (int32_t, 2, 1);          // { dg-warning "array subscript 1 is outside array bounds " }
    T (int32_t, 3, 1);          // { dg-warning "array subscript 1 is outside array bounds " }
--- 74,80 ----
  
    T (int32_t, 4, 0);
  
!   T (int32_t, 0, 1);          // { dg-warning "array subscript 1 is outside array bounds " }
    T (int32_t, 1, 1);          // { dg-warning "array subscript 1 is outside array bounds " }
    T (int32_t, 2, 1);          // { dg-warning "array subscript 1 is outside array bounds " }
    T (int32_t, 3, 1);          // { dg-warning "array subscript 1 is outside array bounds " }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.dg/warn/Warray-bounds-20.C gcc-16-20250921/gcc/testsuite/g++.dg/warn/Warray-bounds-20.C
*** gcc-16-20250914/gcc/testsuite/g++.dg/warn/Warray-bounds-20.C	Sun Sep 14 22:32:12 2025
--- gcc-16-20250921/gcc/testsuite/g++.dg/warn/Warray-bounds-20.C	Sun Sep 21 22:32:44 2025
*************** void warn_derived_ctor_access_new_decl (
*** 39,45 ****
                                // { dg-message "at offset 1 into object 'a' of size 20" "LP64 note" { target ilp32} .-1 }
    char *p = a;
    ++p;
!   D1 *q = new (p) D1;
    sink (q);
  }
  
--- 39,45 ----
                                // { dg-message "at offset 1 into object 'a' of size 20" "LP64 note" { target ilp32} .-1 }
    char *p = a;
    ++p;
!   D1 *q = new (p) D1;		// { dg-warning "-Warray-bounds" }
    sink (q);
  }
  
*************** void warn_derived_ctor_access_new_alloc
*** 47,53 ****
  {
    char *p = (char*)operator new (sizeof (D1));    // { dg-message "at offset 1 into object of size \\d+ allocated by '\[^\n\r]*operator new\[^\n\r]*'" "note" }
    ++p;
!   D1 *q = new (p) D1;
    sink (q);
  }
  
--- 47,53 ----
  {
    char *p = (char*)operator new (sizeof (D1));    // { dg-message "at offset 1 into object of size \\d+ allocated by '\[^\n\r]*operator new\[^\n\r]*'" "note" }
    ++p;
!   D1 *q = new (p) D1;		// { dg-warning "-Warray-bounds" }
    sink (q);
  }
  
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-2.C gcc-16-20250921/gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-2.C
*** gcc-16-20250914/gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-2.C	Sun Sep 14 22:32:12 2025
--- gcc-16-20250921/gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-2.C	Sun Sep 21 22:32:44 2025
*************** void warn_x1_array_mismatch ()
*** 140,148 ****
      delete p;                 // { dg-warning "'static void X1::operator delete\\(void\\*\\)' called on pointer returned from a mismatched allocation function" }
    }
    {
-     // The following requires optimization (see warn_x1_array_mismatch()).
      X1 *p = new (std::nothrow) X1[3];
!     delete p;                 // { dg-warning "'static void X1::operator delete\\(void\\*\\)' called on pointer returned from a mismatched allocation function" "pr?????" { xfail *-*-* } }
    }
  }
  
--- 140,147 ----
      delete p;                 // { dg-warning "'static void X1::operator delete\\(void\\*\\)' called on pointer returned from a mismatched allocation function" }
    }
    {
      X1 *p = new (std::nothrow) X1[3];
!     delete p;                 // { dg-warning "'static void X1::operator delete\\(void\\*\\)' called on pointer returned from a mismatched allocation function" }
    }
  }
  
diff -Nrcpad gcc-16-20250914/gcc/testsuite/g++.target/aarch64/pr113356.C gcc-16-20250921/gcc/testsuite/g++.target/aarch64/pr113356.C
*** gcc-16-20250914/gcc/testsuite/g++.target/aarch64/pr113356.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/g++.target/aarch64/pr113356.C	Sun Sep 21 22:32:44 2025
***************
*** 0 ****
--- 1,8 ----
+ // { dg-do compile }
+ // { dg-options "-Os -fnon-call-exceptions -mearly-ldp-fusion -fno-lifetime-dse -fno-forward-propagate" }
+ struct Class1 {
+   virtual ~Class1() {}
+   unsigned Field1;
+ };
+ struct Class4 : virtual Class1 {};
+ int main() { Class4 var1; }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/builtin-unreachable-7.c gcc-16-20250921/gcc/testsuite/gcc.dg/builtin-unreachable-7.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/builtin-unreachable-7.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.dg/builtin-unreachable-7.c	Sun Sep 21 22:32:45 2025
***************
*** 0 ****
--- 1,24 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -fdump-tree-fab1 -fno-tree-dominator-opts -fno-tree-vrp" } */
+ /* { dg-require-effective-target label_values } */
+ 
+ void foo (int b, int c)
+ {
+   __label__ lab;
+   __label__ lab2;
+   static void *x[2] = {&&lab, &&lab2};
+   if (b == c)
+     {
+ lab:
+       __builtin_unreachable ();
+     }
+ lab2:
+   goto *x[c!=0];
+ }
+ 
+ /* Fab should still able to remove the conditional but leave the bb there. */
+ 
+ /* { dg-final { scan-tree-dump-times "lab:" 1 "fab1" } } */
+ /* { dg-final { scan-tree-dump-times "__builtin_unreachable" 1 "fab1" } } */
+ /* { dg-final { scan-tree-dump-not "if " "fab1" } } */
+ 
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/c11-atomic-6.c gcc-16-20250921/gcc/testsuite/gcc.dg/c11-atomic-6.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/c11-atomic-6.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.dg/c11-atomic-6.c	Sun Sep 21 22:32:45 2025
***************
*** 0 ****
--- 1,13 ----
+ /* Test ICE accessing _Atomic void object.  */
+ /* { dg-do compile } */
+ /* { dg-options "-std=c11" } */
+ 
+ extern _Atomic void x;
+ 
+ void
+ f (void)
+ {
+   /* This has undefined behavior (lvalue conversion on an incomplete type) but
+      should not produce an ICE.  */
+   x;
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/c23-incomplete-1.c gcc-16-20250921/gcc/testsuite/gcc.dg/c23-incomplete-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/c23-incomplete-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.dg/c23-incomplete-1.c	Sun Sep 21 22:32:45 2025
***************
*** 0 ****
--- 1,36 ----
+ /* Test C2y constraint against lvalue conversion of lvalues with incomplete
+    type: not applied in C23 mode.  Although it is not clear that these
+    constructs are valid in C23, we allow certain cases of qualified void
+    there.  */
+ /* { dg-do compile } */
+ /* { dg-options "-std=c23 -pedantic-errors" } */
+ 
+ struct s;
+ union u;
+ 
+ extern struct s vs, *ps;
+ extern _Atomic struct s vas, *pas;
+ extern union u vu, *pu;
+ extern _Atomic union u vau, *pau;
+ 
+ extern const void cv, *pcv;
+ extern _Atomic void av, *pav;
+ 
+ void
+ f ()
+ {
+   vs; /* { dg-error "incomplete type" } */
+   *ps; /* { dg-error "invalid use of undefined type" } */
+   vas; /* { dg-error "incomplete type" } */
+   *pas; /* { dg-error "invalid use of undefined type" } */
+   vu; /* { dg-error "incomplete type" } */
+   *pu; /* { dg-error "invalid use of undefined type" } */
+   vau; /* { dg-error "incomplete type" } */
+   *pau; /* { dg-error "invalid use of undefined type" } */
+   cv;
+   *pcv;
+   /* { dg-warning "dereferencing" "dereferencing" { target *-*-* } .-1 } */
+   av;
+   *pav;
+   /* { dg-warning "dereferencing" "dereferencing" { target *-*-* } .-1 } */
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/c2y-anon-init-1.c gcc-16-20250921/gcc/testsuite/gcc.dg/c2y-anon-init-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/c2y-anon-init-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.dg/c2y-anon-init-1.c	Sun Sep 21 22:32:45 2025
***************
*** 0 ****
--- 1,23 ----
+ /* Test initialization of anonymous structures and unions (clarified in C2y by
+    N3451).  */
+ /* { dg-do run } */
+ /* { dg-options "-std=c2y -pedantic-errors" } */
+ 
+ struct s { struct { int a, b; }; union { int c; }; } x = { 1, 2, 3 };
+ union u { struct { int x, y; }; };
+ 
+ struct s a = { 1, 2, 3 };
+ union u b = { 4, 5 };
+ 
+ extern void abort ();
+ extern void exit (int);
+ 
+ int
+ main ()
+ {
+   if (a.a != 1 || a.b != 2 || a.c != 3)
+     abort ();
+   if (b.x != 4 || b.y != 5)
+     abort ();
+   exit (0);
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/c2y-incomplete-2.c gcc-16-20250921/gcc/testsuite/gcc.dg/c2y-incomplete-2.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/c2y-incomplete-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.dg/c2y-incomplete-2.c	Sun Sep 21 22:32:45 2025
***************
*** 0 ****
--- 1,24 ----
+ /* Test member access to incomplete structures and unions (explicit constraint
+    violation in C2y).  */
+ /* { dg-do compile } */
+ /* { dg-options "-std=c2y -pedantic-errors" } */
+ 
+ struct s1;
+ extern struct s1 vs1;
+ struct s1 { int a; int b : sizeof (vs1.a); }; /* { dg-error "invalid use of undefined type" } */
+ /* { dg-error "width not an integer constant" "constant" { target *-*-* } .-1 } */
+ 
+ union u1;
+ extern union u1 vu1;
+ union u1 { int a; int b : sizeof (vu1.a); }; /* { dg-error "invalid use of undefined type" } */
+ /* { dg-error "width not an integer constant" "constant" { target *-*-* } .-1 } */
+ 
+ struct s2;
+ extern struct s2 *ps2;
+ struct s2 { int a; int b : sizeof (ps2->a); }; /* { dg-error "invalid use of undefined type" } */
+ /* { dg-error "width not an integer constant" "constant" { target *-*-* } .-1 } */
+ 
+ union u2;
+ extern union u2 *pu2;
+ union u2 { int a; int b : sizeof (pu2->a); }; /* { dg-error "invalid use of undefined type" } */
+ /* { dg-error "width not an integer constant" "constant" { target *-*-* } .-1 } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/c2y-incomplete-3.c gcc-16-20250921/gcc/testsuite/gcc.dg/c2y-incomplete-3.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/c2y-incomplete-3.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.dg/c2y-incomplete-3.c	Sun Sep 21 22:32:45 2025
***************
*** 0 ****
--- 1,34 ----
+ /* Test C2y constraint against lvalue conversion of lvalues with incomplete
+    type.  */
+ /* { dg-do compile } */
+ /* { dg-options "-std=c2y -pedantic-errors" } */
+ 
+ struct s;
+ union u;
+ 
+ extern struct s vs, *ps;
+ extern _Atomic struct s vas, *pas;
+ extern union u vu, *pu;
+ extern _Atomic union u vau, *pau;
+ 
+ extern const void cv, *pcv;
+ extern _Atomic void av, *pav;
+ 
+ void
+ f ()
+ {
+   vs; /* { dg-error "incomplete type" } */
+   *ps; /* { dg-error "invalid use of undefined type" } */
+   vas; /* { dg-error "incomplete type" } */
+   *pas; /* { dg-error "invalid use of undefined type" } */
+   vu; /* { dg-error "incomplete type" } */
+   *pu; /* { dg-error "invalid use of undefined type" } */
+   vau; /* { dg-error "incomplete type" } */
+   *pau; /* { dg-error "invalid use of undefined type" } */
+   cv; /* { dg-error "incomplete type" } */
+   *pcv; /* { dg-error "invalid use of void expression" } */
+   /* { dg-warning "dereferencing" "dereferencing" { target *-*-* } .-1 } */
+   av; /* { dg-error "incomplete type" } */
+   *pav; /* { dg-error "invalid use of void expression" } */
+   /* { dg-warning "dereferencing" "dereferencing" { target *-*-* } .-1 } */
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/c2y-linkage-1.c gcc-16-20250921/gcc/testsuite/gcc.dg/c2y-linkage-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/c2y-linkage-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.dg/c2y-linkage-1.c	Sun Sep 21 22:32:45 2025
***************
*** 0 ****
--- 1,15 ----
+ /* Test mixing internal and external linker for the same identifier (a
+    constraint violation in C2y).  */
+ /* { dg-do compile } */
+ /* { dg-options "-std=c2y -pedantic-errors" } */
+ 
+ static int x;
+ 
+ void
+ f ()
+ {
+   long x;
+   {
+     extern int x; /* { dg-error "variable previously declared 'static' redeclared 'extern'" } */
+   }
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/c2y-linkage-2.c gcc-16-20250921/gcc/testsuite/gcc.dg/c2y-linkage-2.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/c2y-linkage-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.dg/c2y-linkage-2.c	Sun Sep 21 22:32:45 2025
***************
*** 0 ****
--- 1,12 ----
+ /* Test mixing internal and external linker for the same identifier (a
+    constraint violation in C2y).  */
+ /* { dg-do compile } */
+ /* { dg-options "-std=c2y -pedantic-errors" } */
+ 
+ void
+ f ()
+ {
+   extern int x; /* { dg-message "previous declaration" } */
+ }
+ 
+ static int x; /* { dg-error "static declaration of 'x' follows non-static declaration" } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/c2y-linkage-3.c gcc-16-20250921/gcc/testsuite/gcc.dg/c2y-linkage-3.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/c2y-linkage-3.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.dg/c2y-linkage-3.c	Sun Sep 21 22:32:45 2025
***************
*** 0 ****
--- 1,15 ----
+ /* Test mixing internal and external linker for the same identifier (a
+    constraint violation in C2y).  */
+ /* { dg-do compile } */
+ /* { dg-options "-std=c2y -pedantic-errors" } */
+ 
+ static int x ();
+ 
+ void
+ f ()
+ {
+   long x;
+   {
+     extern int x (); /* { dg-error "function previously declared 'static' redeclared 'extern'" } */
+   }
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/c2y-linkage-4.c gcc-16-20250921/gcc/testsuite/gcc.dg/c2y-linkage-4.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/c2y-linkage-4.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.dg/c2y-linkage-4.c	Sun Sep 21 22:32:45 2025
***************
*** 0 ****
--- 1,12 ----
+ /* Test mixing internal and external linker for the same identifier (a
+    constraint violation in C2y).  */
+ /* { dg-do compile } */
+ /* { dg-options "-std=c2y -pedantic-errors" } */
+ 
+ void
+ f ()
+ {
+   extern int x (); /* { dg-message "previous declaration" } */
+ }
+ 
+ static int x (); /* { dg-error "static declaration of 'x' follows non-static declaration" } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/c2y-static-assert-1.c gcc-16-20250921/gcc/testsuite/gcc.dg/c2y-static-assert-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/c2y-static-assert-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.dg/c2y-static-assert-1.c	Sun Sep 21 22:32:45 2025
***************
*** 0 ****
--- 1,20 ----
+ /* Test C2y static assertions with expressions that are not integer constant
+    expressions (taken from c11-static-assert-3.c; in C2y these are constraint
+    violations, whereas in C11 we diagnose them but they are undefined behavior
+    because the requirement to be an integer constant expression is in Semantics
+    not Constraints).  */
+ /* { dg-do compile } */
+ /* { dg-options "-std=c2y -pedantic-errors" } */
+ 
+ _Static_assert (__INT_MAX__ * 2, "overflow"); /* { dg-warning "integer overflow in expression" } */
+ /* { dg-error "overflow in constant expression" "error" { target *-*-* } .-1 } */
+ 
+ _Static_assert ((void *)(__SIZE_TYPE__)16, "non-integer"); /* { dg-error "not an integer" } */
+ 
+ _Static_assert (1.0, "non-integer"); /* { dg-error "not an integer" } */
+ 
+ _Static_assert ((int)(1.0 + 1.0), "non-constant-expression"); /* { dg-error "not an integer constant expression" } */
+ 
+ int i;
+ 
+ _Static_assert (i, "non-constant"); /* { dg-error "not constant" } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/gimplefe-error-16.c gcc-16-20250921/gcc/testsuite/gcc.dg/gimplefe-error-16.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/gimplefe-error-16.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.dg/gimplefe-error-16.c	Sun Sep 21 22:32:45 2025
***************
*** 0 ****
--- 1,10 ----
+ /* { dg-do compile } */
+ /* { dg-options "-fgimple" } */
+ /* PR c/121421 */
+ /* Gimple functions cannot be nested functions. */
+ 
+ 
+ void main(void)
+ {
+     void __GIMPLE b(){} /* { dg-error "cannot be a nested" } */
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/pr121391-1.c gcc-16-20250921/gcc/testsuite/gcc.dg/pr121391-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/pr121391-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.dg/pr121391-1.c	Sun Sep 21 22:33:00 2025
***************
*** 0 ****
--- 1,9 ----
+ /* { dg-do compile { target aarch64*-*-* arm*-*-* powerpc*-*-* s390*-*-* x86_64-*-* } } */
+ 
+ /* For the non existing variable we are faced with an error mark node during
+    gimplify_asm_expr().  */
+ 
+ void test (void)
+ {
+   __asm__ __volatile__ ("" : "={2}" (non_existing_var)); /* { dg-error {'non_existing_var' undeclared} } */
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/pr121391-2.c gcc-16-20250921/gcc/testsuite/gcc.dg/pr121391-2.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/pr121391-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.dg/pr121391-2.c	Sun Sep 21 22:33:00 2025
***************
*** 0 ****
--- 1,9 ----
+ /* { dg-do compile { target aarch64*-*-* arm*-*-* powerpc*-*-* s390*-*-* x86_64-*-* } } */
+ 
+ /* For the non existing variable we are faced with an error mark node during
+    gimplify_asm_expr().  */
+ 
+ void test (void)
+ {
+   __asm__ __volatile__ ("" :: "{2}" (non_existing_var)); /* { dg-error {'non_existing_var' undeclared} } */
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/torture/pr121962-1.c gcc-16-20250921/gcc/testsuite/gcc.dg/torture/pr121962-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/torture/pr121962-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.dg/torture/pr121962-1.c	Sun Sep 21 22:33:01 2025
***************
*** 0 ****
--- 1,21 ----
+ /* PR tree-optimization/121962 */
+ struct s1
+ {
+   int t;
+ };
+ 
+ struct s2
+ {
+   struct s1 t;
+ };
+ 
+ struct s1 p;
+ 
+ void f(struct s2 a)
+ {
+   struct s1 *b = &a.t;
+   /* this is a nop load/store and should be ignored
+      by copy propagation for aggregates.  */
+   a.t = *b;
+   p = *b;
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/torture/pr84830.c gcc-16-20250921/gcc/testsuite/gcc.dg/torture/pr84830.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/torture/pr84830.c	Sun Sep 14 22:32:16 2025
--- gcc-16-20250921/gcc/testsuite/gcc.dg/torture/pr84830.c	Sun Sep 21 22:33:02 2025
***************
*** 1,46 ****
  /* { dg-do compile } */
! /* { dg-additional-options "-fno-tree-ch -fno-tree-vrp" } */
  
  int x0;
  
! void
  br (int yp, int oo)
  {
!   int *qi = &yp;
  
!   if (oo == 0)
!     {
! g8:
!       if (x0 != 0)
! 	x0 = yp;
!       else if (oo != 0)
! 	x0 = yp;
  
!       if (x0 == 0)
! 	{
! 	  *qi = 0;
! 	  x0 = *qi;
! 	}
  
!       if (x0 != 0)
! 	{
! 	  ++oo;
! 	  goto g8;
! 	}
  
!       if (yp == oo)
! 	yp += !!oo;
!     }
    else
!     {
!       x0 = 1;
!       while (x0 < 2)
! 	{
! 	  qi = &oo;
! 	  ++oo;
! 	  x0 = 1;
! 	}
!     }
  
!   goto g8;
  }
--- 1,140 ----
  /* { dg-do compile } */
! /* { dg-additional-options "-fgimple" } */
  
  int x0;
  
! void __GIMPLE (ssa,startwith("pre"))
  br (int yp, int oo)
  {
!   int oo_lsm_17;
!   int x0_lsm_16;
!   _Bool x0_lsm_15;
!   int x0_lsm_14;
!   int * qi;
!   int _1;
!   int _2;
!   int _3;
!   int _4;
!   int _5;
!   int _6;
!   int _8;
!   int _9;
!   int _10;
!   int _11;
!   _Bool _12;
!   int _13;
!   int _14;
!   int _15;
!   int _16;
!   int _17;
  
!   __BB(2):
!   _1 = oo;
!   if (_1 == 0)
!     goto __BB13;
!   else
!     goto __BB11;
  
!   __BB(3):
!   x0_lsm_14_44 = __PHI (__BB10: x0_lsm_14_50, __BB14: x0_lsm_14_25, __BB9: x0_lsm_14_50);
!   goto __BB4;
  
!   __BB(4):
!   x0_lsm_14_39 = __PHI (__BB3: x0_lsm_14_44, __BB13: x0_lsm_14_38);
!   _2 = x0_lsm_14_39;
!   if (_2 != 0)
!     goto __BB5;
!   else
!     goto __BB6;
  
!   __BB(5):
!   _3 = yp;
!   x0_lsm_14_7 = _3;
!   x0_lsm_15_47 = _Literal (_Bool) 1;
!   goto __BB8;
! 
!   __BB(6):
!   _4 = oo;
!   if (_4 != 0)
!     goto __BB7;
    else
!     goto __BB9;
  
!   __BB(7):
!   _5 = yp;
!   x0_lsm_14_48 = _5;
!   x0_lsm_15_49 = _Literal (_Bool) 1;
!   goto __BB8;
! 
!   __BB(8):
!   x0_lsm_14_25 = __PHI (__BB5: x0_lsm_14_7, __BB7: x0_lsm_14_48);
!   _6 = x0_lsm_14_25;
!   if (_6 == 0)
!     goto __BB9;
!   else
!     goto __BB14;
! 
!   __BB(9):
!   __MEM <int> (qi_36) = 0;
!   x0_lsm_14_50 = 0;
!   x0_lsm_15_51 = _Literal (_Bool) 1;
!   _10 = yp;
!   _11 = oo;
!   if (_10 == _11)
!     goto __BB10;
!   else
!     goto __BB3;
! 
!   __BB(10):
!   _12 = _11 != 0;
!   _13 = (int) _12;
!   _14 = _10 + _13;
!   yp = _14;
!   if (_14 == 0)
!     goto __BB17;
!   else
!     goto __BB3;
! 
!   __BB(11):
!   x0 = 1;
!   oo_lsm_17_24 = oo;
!   x0_lsm_16_19 = x0;
!   goto __BB12;
! 
!   __BB(12):
!   oo_lsm_17_41 = __PHI (__BB11: oo_lsm_17_24, __BB15: oo_lsm_17_43);
!   _15 = oo_lsm_17_41;
!   _16 = _15 + 1;
!   oo_lsm_17_43 = _16;
!   x0_lsm_16_42 = 1;
!   _17 = x0_lsm_16_42;
!   if (_17 <= 1)
!     goto __BB15;
!   else
!     goto __BB16;
! 
!   __BB(15):
!   goto __BB12;
! 
!   __BB(16):
!   x0_lsm_16_52 = __PHI (__BB12: x0_lsm_16_42);
!   oo_lsm_17_53 = __PHI (__BB12: oo_lsm_17_43);
!   x0 = x0_lsm_16_52;
!   oo = oo_lsm_17_53;
!   goto __BB13;
! 
!   __BB(13):
!   qi_36 = __PHI (__BB2: &yp, __BB16: &oo);
!   x0_lsm_14_38 = x0;
!   x0_lsm_15_23 = _Literal (_Bool) 0;
!   goto __BB4;
! 
!   __BB(14):
!   _8 = oo;
!   _9 = _8 + 1;
!   oo = _9;
!   goto __BB3;
! 
!   __BB(17):
!   return;
  }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-1.c gcc-16-20250921/gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-1.c	Sun Sep 21 22:33:02 2025
***************
*** 0 ****
--- 1,33 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O1 -fdump-tree-forwprop1-details -fdump-tree-optimized" } */
+ /* PR tree-optimization/121751 */
+ 
+ 
+ struct s1
+ {
+   int t[1024];
+ };
+ 
+ struct s2 {
+   struct s1 t;
+ };
+ 
+ struct s3
+ {
+   struct s2 t;
+ };
+ 
+ void g(struct s3*);
+ 
+ void f(struct s1 s)
+ {
+   struct s2 removeme;
+   removeme.t = s;
+   struct s3 t1;
+   t1.t = removeme;
+   g(&t1);
+ }
+ 
+ 
+ /* { dg-final { scan-tree-dump-times "after previous" 1 "forwprop1" } } */
+ /* { dg-final { scan-tree-dump-not "removeme " "optimized" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-arg-2.c gcc-16-20250921/gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-arg-2.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-arg-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-arg-2.c	Sun Sep 21 22:33:02 2025
***************
*** 0 ****
--- 1,33 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O1 -fdump-tree-forwprop1-details -fdump-tree-optimized" } */
+ 
+ 
+ struct s1
+ {
+   int t[1024];
+ };
+ 
+ struct s2 {
+   struct s1 t;
+ };
+ 
+ struct s3
+ {
+   struct s2 t;
+ };
+ 
+ void g(struct s3);
+ 
+ void f(struct s1 s)
+ {
+   struct s2 removeme;
+   removeme.t = s;
+   struct s3 removeme2;
+   removeme2.t = removeme;
+   g(removeme2);
+ }
+ 
+ 
+ /* { dg-final { scan-tree-dump-times "after previous" 2 "forwprop1" } } */
+ /* { dg-final { scan-tree-dump-not "removeme " "optimized" } } */
+ /* { dg-final { scan-tree-dump-not "removeme2 " "optimized" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-memcpy-1.c gcc-16-20250921/gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-memcpy-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-memcpy-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-memcpy-1.c	Sun Sep 21 22:33:02 2025
***************
*** 0 ****
--- 1,18 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O1 -fdump-tree-forwprop1-details -fdump-tree-optimized" } */
+ /* PR tree-optimization/121418 */
+ 
+ struct s1
+ {
+   unsigned char t[1024];
+ };
+ 
+ struct s1 f(struct s1 a)
+ {
+   struct s1 removeme1 = a;
+   __builtin_memcpy (&removeme1, &a, sizeof(struct s1));
+   return removeme1;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "after previous" 1 "forwprop1" } } */
+ /* { dg-final { scan-tree-dump-not "removeme1 " "optimized" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-memcpy-2.c gcc-16-20250921/gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-memcpy-2.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-memcpy-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.dg/tree-ssa/copy-prop-aggregate-memcpy-2.c	Sun Sep 21 22:33:02 2025
***************
*** 0 ****
--- 1,20 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O1 -fdump-tree-forwprop1-details -fdump-tree-optimized" } */
+ /* PR tree-optimization/121417 */
+ 
+ struct s1
+ {
+   unsigned char t[1024];
+ };
+ 
+ struct s1 f(struct s1 a)
+ {
+   struct s1 removeme1 = a;
+   struct s1 removeme2;
+   __builtin_memcpy (&removeme2, &removeme1, sizeof(struct s1));
+   return removeme2;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "after previous" 2 "forwprop1" } } */
+ /* { dg-final { scan-tree-dump-not "removeme1 " "optimized" } } */
+ /* { dg-final { scan-tree-dump-not "removeme2 " "optimized" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-36.c gcc-16-20250921/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-36.c
*** gcc-16-20250914/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-36.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-36.c	Sun Sep 21 22:33:02 2025
***************
*** 0 ****
--- 1,24 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -fdump-tree-pre-stats" } */
+ 
+ static unsigned long *
+ min_element(unsigned long* array, unsigned long size)
+ {
+     unsigned long* min = &array[0];
+ 
+     for (unsigned long i = 1; i < size; ++i)
+         if (array[i] < *min)
+             min = &array[i];
+     
+     return min;
+ }
+ 
+ unsigned long
+ min(unsigned long* array, unsigned long size)
+ {
+     return *min_element(array, size);
+ }
+ 
+ /* We want to hoist the *min dereference before the loop.  */
+ /* { dg-final { scan-tree-dump "HOIST inserted: 1" "pre" } } */
+ /* { dg-final { scan-tree-dump-times "= \\\*" 2 "pre" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/pr113356.C gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/pr113356.C
*** gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/pr113356.C	Sun Sep 14 22:32:28 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/pr113356.C	Thu Jan  1 00:00:00 1970
***************
*** 1,8 ****
- // { dg-do compile }
- // { dg-options "-Os -fnon-call-exceptions -mearly-ldp-fusion -fno-lifetime-dse -fno-forward-propagate" }
- struct Class1 {
-   virtual ~Class1() {}
-   unsigned Field1;
- };
- struct Class4 : virtual Class1 {};
- int main() { Class4 var1; }
--- 0 ----
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/pr66462.c gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/pr66462.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/pr66462.c	Sun Sep 14 22:32:28 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/pr66462.c	Sun Sep 21 22:33:03 2025
*************** static void t_fin (double x, bool res)
*** 44,49 ****
--- 44,70 ----
      __builtin_abort ();
  }
  
+ static void t_nanf (float x, bool res)
+ {
+   if (__builtin_isnan (x) != res)
+     __builtin_abort ();
+   if (__builtin_isnan (-x) != res)
+     __builtin_abort ();
+   if (fetestexcept (FE_INVALID))
+     __builtin_abort ();
+ }
+ 
+ static void t_nan (double x, bool res)
+ {
+   if (__builtin_isnan (x) != res)
+     __builtin_abort ();
+   if (__builtin_isnan (-x) != res)
+     __builtin_abort ();
+   if (fetestexcept (FE_INVALID))
+     __builtin_abort ();
+ }
+ 
+ 
  int
  main ()
  {
*************** main ()
*** 73,77 ****
--- 94,110 ----
    t_fin (__builtin_nans (""), 0);
    t_fin (__builtin_nan (""), 0);
  
+   t_nanf (0.0f, 0);
+   t_nanf (1.0f, 0);
+   t_nanf (__builtin_inff (), 0);
+   t_nanf (__builtin_nansf (""), 1);
+   t_nanf (__builtin_nanf (""), 1);
+ 
+   t_nan (0.0, 0);
+   t_nan (1.0, 0);
+   t_nan (__builtin_inf (), 0);
+   t_nan (__builtin_nans (""), 1);
+   t_nan (__builtin_nan (""), 1);
+ 
    return 0;
  }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/svluti4_zt_1.c gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/svluti4_zt_1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/svluti4_zt_1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/svluti4_zt_1.c	Sun Sep 21 22:33:04 2025
***************
*** 0 ****
--- 1,30 ----
+ /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } }  */
+ 
+ /* LUTI4 (four registers, 8-bit)
+    Variants are also available for: _u8
+    svint8x4_t svluti4_zt_s8_x4 (uint64_t zt0, svuint8x2_t zn)
+ 	      __arm_streaming __arm_in ("zt0");  */
+ 
+ #pragma GCC target "+sve2,+sme-lutv2"
+ #define SHARED_ZT0
+ #include "test_sme2_acle.h"
+ 
+ /*
+ ** luti4_zt_u8_x4:
+ ** luti4	{z0.b - z3.b}, zt0, {z0 - z1}
+ ** ret
+ */
+ PROTO (luti4_zt_u8_x4, svuint8x4_t, (svuint8x2_t z0))
+ {
+   return svluti4_zt_u8_x4 (0, z0);
+ }
+ 
+ /*
+ ** luti4_zt_s8_x4:
+ ** luti4	{z0.b - z3.b}, zt0, {z0 - z1}
+ ** ret
+ */
+ PROTO (luti4_zt_s8_x4, svint8x4_t, (svuint8x2_t z0))
+ {
+   return svluti4_zt_s8_x4 (0, z0);
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/svwrite_lane_zt_1.c gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/svwrite_lane_zt_1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/svwrite_lane_zt_1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/svwrite_lane_zt_1.c	Sun Sep 21 22:33:04 2025
***************
*** 0 ****
--- 1,204 ----
+ /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } }  */
+ 
+ /* MOVT (vector to table)
+    Variants are also available for:
+    [_s8], [_u16], [_s16], [_u32], [_s32], [_u64], [_s64]
+    [_bf16], [_f16], [_f32], [_f64]
+    void svwrite_lane_zt[_u8] (uint64_t zt0, svuint8_t zt, uint64_t idx)
+ 	__arm_streaming __arm_out ("zt0");  */
+ 
+ #pragma GCC target "+sve2,+sme-lutv2"
+ #define SHARED_ZT0
+ #include "test_sme2_acle.h"
+ 
+ /*
+ ** write_lane_zt_u8:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** movt	zt0 \[1, mul vl\], z0
+ ** movt	zt0 \[2, mul vl\], z0
+ ** movt	zt0 \[3, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_lane_zt_u8, void, (svuint8_t z0))
+ {
+   svwrite_lane_zt_u8 (0, z0, 0);
+   svwrite_lane_zt_u8 (0, z0, 1);
+   svwrite_lane_zt_u8 (0, z0, 2);
+   svwrite_lane_zt_u8 (0, z0, 3);
+ }
+ 
+ /*
+ ** write_lane_zt_s8:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** movt	zt0 \[1, mul vl\], z0
+ ** movt	zt0 \[2, mul vl\], z0
+ ** movt	zt0 \[3, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_lane_zt_s8, void, (svint8_t z0))
+ {
+   svwrite_lane_zt_s8 (0, z0, 0);
+   svwrite_lane_zt_s8 (0, z0, 1);
+   svwrite_lane_zt_s8 (0, z0, 2);
+   svwrite_lane_zt_s8 (0, z0, 3);
+ }
+ 
+ /*
+ ** write_lane_zt_u16:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** movt	zt0 \[1, mul vl\], z0
+ ** movt	zt0 \[2, mul vl\], z0
+ ** movt	zt0 \[3, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_lane_zt_u16, void, (svuint16_t z0))
+ {
+   svwrite_lane_zt_u16 (0, z0, 0);
+   svwrite_lane_zt_u16 (0, z0, 1);
+   svwrite_lane_zt_u16 (0, z0, 2);
+   svwrite_lane_zt_u16 (0, z0, 3);
+ }
+ 
+ /*
+ ** write_lane_zt_s16:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** movt	zt0 \[1, mul vl\], z0
+ ** movt	zt0 \[2, mul vl\], z0
+ ** movt	zt0 \[3, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_lane_zt_s16, void, (svint16_t z0))
+ {
+   svwrite_lane_zt_s16 (0, z0, 0);
+   svwrite_lane_zt_s16 (0, z0, 1);
+   svwrite_lane_zt_s16 (0, z0, 2);
+   svwrite_lane_zt_s16 (0, z0, 3);
+ }
+ 
+ /*
+ ** write_lane_zt_u32:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** movt	zt0 \[1, mul vl\], z0
+ ** movt	zt0 \[2, mul vl\], z0
+ ** movt	zt0 \[3, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_lane_zt_u32, void, (svuint32_t z0))
+ {
+   svwrite_lane_zt_u32 (0, z0, 0);
+   svwrite_lane_zt_u32 (0, z0, 1);
+   svwrite_lane_zt_u32 (0, z0, 2);
+   svwrite_lane_zt_u32 (0, z0, 3);
+ }
+ 
+ /*
+ ** write_lane_zt_s32:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** movt	zt0 \[1, mul vl\], z0
+ ** movt	zt0 \[2, mul vl\], z0
+ ** movt	zt0 \[3, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_lane_zt_s32, void, (svint32_t z0))
+ {
+   svwrite_lane_zt_s32 (0, z0, 0);
+   svwrite_lane_zt_s32 (0, z0, 1);
+   svwrite_lane_zt_s32 (0, z0, 2);
+   svwrite_lane_zt_s32 (0, z0, 3);
+ }
+ 
+ /*
+ ** write_lane_zt_u64:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** movt	zt0 \[1, mul vl\], z0
+ ** movt	zt0 \[2, mul vl\], z0
+ ** movt	zt0 \[3, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_lane_zt_u64, void, (svuint64_t z0))
+ {
+   svwrite_lane_zt_u64 (0, z0, 0);
+   svwrite_lane_zt_u64 (0, z0, 1);
+   svwrite_lane_zt_u64 (0, z0, 2);
+   svwrite_lane_zt_u64 (0, z0, 3);
+ }
+ 
+ /*
+ ** write_lane_zt_s64:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** movt	zt0 \[1, mul vl\], z0
+ ** movt	zt0 \[2, mul vl\], z0
+ ** movt	zt0 \[3, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_lane_zt_s64, void, (svint64_t z0))
+ {
+   svwrite_lane_zt_s64 (0, z0, 0);
+   svwrite_lane_zt_s64 (0, z0, 1);
+   svwrite_lane_zt_s64 (0, z0, 2);
+   svwrite_lane_zt_s64 (0, z0, 3);
+ }
+ 
+ /*
+ ** write_lane_zt_bf16:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** movt	zt0 \[1, mul vl\], z0
+ ** movt	zt0 \[2, mul vl\], z0
+ ** movt	zt0 \[3, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_lane_zt_bf16, void, (svbfloat16_t z0))
+ {
+   svwrite_lane_zt_bf16 (0, z0, 0);
+   svwrite_lane_zt_bf16 (0, z0, 1);
+   svwrite_lane_zt_bf16 (0, z0, 2);
+   svwrite_lane_zt_bf16 (0, z0, 3);
+ }
+ 
+ /*
+ ** write_lane_zt_f16:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** movt	zt0 \[1, mul vl\], z0
+ ** movt	zt0 \[2, mul vl\], z0
+ ** movt	zt0 \[3, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_lane_zt_f16, void, (svfloat16_t z0))
+ {
+   svwrite_lane_zt_f16 (0, z0, 0);
+   svwrite_lane_zt_f16 (0, z0, 1);
+   svwrite_lane_zt_f16 (0, z0, 2);
+   svwrite_lane_zt_f16 (0, z0, 3);
+ }
+ 
+ /*
+ ** write_lane_zt_f32:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** movt	zt0 \[1, mul vl\], z0
+ ** movt	zt0 \[2, mul vl\], z0
+ ** movt	zt0 \[3, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_lane_zt_f32, void, (svfloat32_t z0))
+ {
+   svwrite_lane_zt_f32 (0, z0, 0);
+   svwrite_lane_zt_f32 (0, z0, 1);
+   svwrite_lane_zt_f32 (0, z0, 2);
+   svwrite_lane_zt_f32 (0, z0, 3);
+ }
+ 
+ /*
+ ** write_lane_zt_f64:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** movt	zt0 \[1, mul vl\], z0
+ ** movt	zt0 \[2, mul vl\], z0
+ ** movt	zt0 \[3, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_lane_zt_f64, void, (svfloat64_t z0))
+ {
+   svwrite_lane_zt_f64 (0, z0, 0);
+   svwrite_lane_zt_f64 (0, z0, 1);
+   svwrite_lane_zt_f64 (0, z0, 2);
+   svwrite_lane_zt_f64 (0, z0, 3);
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/svwrite_zt_1.c gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/svwrite_zt_1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/svwrite_zt_1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/svwrite_zt_1.c	Sun Sep 21 22:33:04 2025
***************
*** 0 ****
--- 1,96 ----
+ /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } }  */
+ 
+ /* MOVT (vector to table)
+    Variants are also available for:
+    [_s8], [_u16], [_s16], [_u32], [_s32], [_u64], [_s64]
+    [_bf16], [_f16], [_f32], [_f64]
+    void svwrite_zt[_u8] (uint64_t zt0, svuint8_t zt, uint64_t idx)
+ 	__arm_streaming __arm_out ("zt0");  */
+ 
+ #pragma GCC target "+sve2,+sme-lutv2"
+ #define SHARED_ZT0
+ #include "test_sme2_acle.h"
+ 
+ /*
+ ** write_zt_u8:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_zt_u8, void, (svuint8_t z0)) { svwrite_zt_u8 (0, z0); }
+ 
+ /*
+ ** write_zt_s8:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_zt_s8, void, (svint8_t z0)) { svwrite_zt_s8 (0, z0); }
+ 
+ /*
+ ** write_zt_u16:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_zt_u16, void, (svuint16_t z0)) { svwrite_zt_u16 (0, z0); }
+ 
+ /*
+ ** write_zt_s16:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_zt_s16, void, (svint16_t z0)) { svwrite_zt_s16 (0, z0); }
+ 
+ /*
+ ** write_zt_u32:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_zt_u32, void, (svuint32_t z0)) { svwrite_zt_u32 (0, z0); }
+ 
+ /*
+ ** write_zt_s32:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_zt_s32, void, (svint32_t z0)) { svwrite_zt_s32 (0, z0); }
+ 
+ /*
+ ** write_zt_u64:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_zt_u64, void, (svuint64_t z0)) { svwrite_zt_u64 (0, z0); }
+ 
+ /*
+ ** write_zt_s64:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_zt_s64, void, (svint64_t z0)) { svwrite_zt_s64 (0, z0); }
+ 
+ /*
+ ** write_zt_bf16:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_zt_bf16, void, (svbfloat16_t z0)) { svwrite_zt_bf16 (0, z0); }
+ 
+ /*
+ ** write_zt_f16:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_zt_f16, void, (svfloat16_t z0)) { svwrite_zt_f16 (0, z0); }
+ 
+ /*
+ ** write_zt_f32:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_zt_f32, void, (svfloat32_t z0)) { svwrite_zt_f32 (0, z0); }
+ 
+ /*
+ ** write_zt_f64:
+ ** movt	zt0 \[0, mul vl\], z0
+ ** ret
+ */
+ PROTO (write_zt_f64, void, (svfloat64_t z0)) { svwrite_zt_f64 (0, z0); }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s16.c gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s16.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s16.c	Sun Sep 14 22:32:28 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s16.c	Sun Sep 21 22:33:04 2025
*************** TEST_UNIFORM_Z (mul_1op1_s16_z_tied2, sv
*** 332,337 ****
--- 332,347 ----
  		z0 = svmul_z (p0, svdup_s16 (1), z0))
  
  /*
+ ** mul_1op1n_s16_z:
+ **	movprfx	z0\.h, p0/z, z0\.h
+ **	mov	z0\.h, p0/m, w0
+ **	ret
+ */
+ TEST_UNIFORM_ZX (mul_1op1n_s16_z, svint16_t, int16_t,
+ 	z0 = svmul_n_s16_z (p0, svdup_s16 (1), x0),
+ 	z0 = svmul_z (p0, svdup_s16 (1), x0))
+ 
+ /*
  ** mul_3_s16_z_tied1:
  **	mov	(z[0-9]+\.h), #3
  **	movprfx	z0\.h, p0/z, z0\.h
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s32.c gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s32.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s32.c	Sun Sep 14 22:32:28 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s32.c	Sun Sep 21 22:33:04 2025
*************** TEST_UNIFORM_Z (mul_1op1_s32_z_tied2, sv
*** 342,347 ****
--- 342,357 ----
  		z0 = svmul_z (p0, svdup_s32 (1), z0))
  
  /*
+ ** mul_1op1n_s32_z:
+ **	movprfx	z0\.s, p0/z, z0\.s
+ **	mov	z0\.s, p0/m, w0
+ **	ret
+ */
+ TEST_UNIFORM_ZX (mul_1op1n_s32_z, svint32_t, int32_t,
+ 	z0 = svmul_n_s32_z (p0, svdup_s32 (1), x0),
+ 	z0 = svmul_z (p0, svdup_s32 (1), x0))
+ 
+ /*
  ** mul_3_s32_z_tied1:
  **	mov	(z[0-9]+\.s), #3
  **	movprfx	z0\.s, p0/z, z0\.s
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s64.c gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s64.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s64.c	Sun Sep 14 22:32:28 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s64.c	Sun Sep 21 22:33:04 2025
*************** TEST_UNIFORM_Z (mul_1op1_s64_z_tied2, sv
*** 341,346 ****
--- 341,356 ----
  		z0 = svmul_z (p0, svdup_s64 (1), z0))
  
  /*
+ ** mul_1op1n_s64_z:
+ **	movprfx	z0\.d, p0/z, z0\.d
+ **	mov	z0\.d, p0/m, x0
+ **	ret
+ */
+ TEST_UNIFORM_ZX (mul_1op1n_s64_z, svint64_t, int64_t,
+ 	z0 = svmul_n_s64_z (p0, svdup_s64 (1), x0),
+ 	z0 = svmul_z (p0, svdup_s64 (1), x0))
+ 
+ /*
  ** mul_2_s64_z_tied1:
  **	movprfx	z0.d, p0/z, z0.d
  **	lsl	z0.d, p0/m, z0.d, #1
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s8.c gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s8.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s8.c	Sun Sep 14 22:32:28 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_s8.c	Sun Sep 21 22:33:04 2025
*************** TEST_UNIFORM_Z (mul_1op1_s8_z_tied2, svi
*** 332,337 ****
--- 332,347 ----
  		z0 = svmul_z (p0, svdup_s8 (1), z0))
  
  /*
+ ** mul_1op1n_s8_z:
+ **	movprfx	z0\.b, p0/z, z0\.b
+ **	mov	z0\.b, p0/m, w0
+ **	ret
+ */
+ TEST_UNIFORM_ZX (mul_1op1n_s8_z, svint8_t, int8_t,
+ 	z0 = svmul_n_s8_z (p0, svdup_s8 (1), x0),
+ 	z0 = svmul_z (p0, svdup_s8 (1), x0))
+ 
+ /*
  ** mul_3_s8_z_tied1:
  **	mov	(z[0-9]+\.b), #3
  **	movprfx	z0\.b, p0/z, z0\.b
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u16.c gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u16.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u16.c	Sun Sep 14 22:32:28 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u16.c	Sun Sep 21 22:33:04 2025
*************** TEST_UNIFORM_Z (mul_1op1_u16_z_tied2, sv
*** 313,318 ****
--- 313,328 ----
  		z0 = svmul_z (p0, svdup_u16 (1), z0))
  
  /*
+ ** mul_1op1n_u16_z:
+ **	movprfx	z0\.h, p0/z, z0\.h
+ **	mov	z0\.h, p0/m, w0
+ **	ret
+ */
+ TEST_UNIFORM_ZX (mul_1op1n_u16_z, svuint16_t, uint16_t,
+ 	z0 = svmul_n_u16_z (p0, svdup_u16 (1), x0),
+ 	z0 = svmul_z (p0, svdup_u16 (1), x0))
+ 
+ /*
  ** mul_3_u16_z_tied1:
  **	mov	(z[0-9]+\.h), #3
  **	movprfx	z0\.h, p0/z, z0\.h
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u32.c gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u32.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u32.c	Sun Sep 14 22:32:28 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u32.c	Sun Sep 21 22:33:04 2025
*************** TEST_UNIFORM_Z (mul_1op1_u32_z_tied2, sv
*** 313,318 ****
--- 313,328 ----
  		z0 = svmul_z (p0, svdup_u32 (1), z0))
  
  /*
+ ** mul_1op1n_u32_z:
+ **	movprfx	z0\.s, p0/z, z0\.s
+ **	mov	z0\.s, p0/m, w0
+ **	ret
+ */
+ TEST_UNIFORM_ZX (mul_1op1n_u32_z, svuint32_t, uint32_t,
+ 	z0 = svmul_n_u32_z (p0, svdup_u32 (1), x0),
+ 	z0 = svmul_z (p0, svdup_u32 (1), x0))
+ 
+ /*
  ** mul_3_u32_z_tied1:
  **	mov	(z[0-9]+\.s), #3
  **	movprfx	z0\.s, p0/z, z0\.s
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u64.c gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u64.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u64.c	Sun Sep 14 22:32:28 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u64.c	Sun Sep 21 22:33:04 2025
*************** TEST_UNIFORM_Z (mul_1op1_u64_z_tied2, sv
*** 334,339 ****
--- 334,349 ----
  		z0 = svmul_z (p0, svdup_u64 (1), z0))
  
  /*
+ ** mul_1op1n_u64_z:
+ **	movprfx	z0\.d, p0/z, z0\.d
+ **	mov	z0\.d, p0/m, x0
+ **	ret
+ */
+ TEST_UNIFORM_ZX (mul_1op1n_u64_z, svuint64_t, uint64_t,
+ 	z0 = svmul_n_u64_z (p0, svdup_u64 (1), x0),
+ 	z0 = svmul_z (p0, svdup_u64 (1), x0))
+ 
+ /*
  ** mul_2_u64_z_tied1:
  **	movprfx	z0.d, p0/z, z0.d
  **	lsl	z0.d, p0/m, z0.d, #1
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u8.c gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u8.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u8.c	Sun Sep 14 22:32:28 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/mul_u8.c	Sun Sep 21 22:33:04 2025
*************** TEST_UNIFORM_Z (mul_1op1_u8_z_tied2, svu
*** 313,318 ****
--- 313,328 ----
  		z0 = svmul_z (p0, svdup_u8 (1), z0))
  
  /*
+ ** mul_1op1n_u8_z:
+ **	movprfx	z0\.b, p0/z, z0\.b
+ **	mov	z0\.b, p0/m, w0
+ **	ret
+ */
+ TEST_UNIFORM_ZX (mul_1op1n_u8_z, svuint8_t, uint8_t,
+ 	z0 = svmul_n_u8_z (p0, svdup_u8 (1), x0),
+ 	z0 = svmul_z (p0, svdup_u8 (1), x0))
+ 
+ /*
  ** mul_3_u8_z_tied1:
  **	mov	(z[0-9]+\.b), #3
  **	movprfx	z0\.b, p0/z, z0\.b
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/svluti4_zt_1.c gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/svluti4_zt_1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/svluti4_zt_1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/svluti4_zt_1.c	Sun Sep 21 22:33:04 2025
***************
*** 0 ****
--- 1,86 ----
+ /* { dg-options "-std=c23" }  */
+ /* { dg-do compile }  */
+ 
+ #pragma GCC target "+sve2,+sme-lutv2"
+ static_assert (__ARM_FEATURE_SME_LUTv2 == 1);
+ #include <arm_sme.h>
+ 
+ /* LUTI4 (four registers, 8-bit)
+    Variants are also available for: _u8
+    svint8x4_t svluti4_zt_s8_x4 (uint64_t zt0, svuint8x2_t zn)
+ 	      __arm_streaming __arm_in ("zt0");  */
+ 
+ void
+ test_svluti4_zt_ok (svuint8x2_t zn_u8) __arm_streaming __arm_in ("zt0")
+ {
+   svluti4_zt_s8_x4 (0, zn_u8);
+   svluti4_zt_u8_x4 (0, zn_u8);
+ }
+ 
+ void
+ test_svluti4_zt_not_streaming (svuint8x2_t zn_u8)
+ {
+   svluti4_zt_s8_x4 (0, zn_u8); /* { dg-error {ACLE function 'svluti4_zt_s8_x4' can only be called when SME streaming mode is enabled} }  */
+   svluti4_zt_u8_x4 (0, zn_u8); /* { dg-error {ACLE function 'svluti4_zt_u8_x4' can only be called when SME streaming mode is enabled} }  */
+ }
+ 
+ void
+ test_svluti4_zt_streaming_compatible (svuint8x2_t zn_u8) __arm_streaming_compatible
+ {
+   svluti4_zt_s8_x4 (0, zn_u8); /* { dg-error {ACLE function 'svluti4_zt_s8_x4' can only be called when SME streaming mode is enabled} }  */
+   svluti4_zt_u8_x4 (0, zn_u8); /* { dg-error {ACLE function 'svluti4_zt_u8_x4' can only be called when SME streaming mode is enabled} }  */
+ }
+ 
+ void
+ test_svluti4_zt_arg_count_mismatch (svuint8x2_t zn_u8) __arm_streaming __arm_in ("zt0")
+ {
+   svluti4_zt_s8_x4 (); /* { dg-error {too few arguments to function 'svluti4_zt_s8_x4'; expected 2, have 0} }  */
+   svluti4_zt_u8_x4 (); /* { dg-error {too few arguments to function 'svluti4_zt_u8_x4'; expected 2, have 0} }  */
+ 
+   svluti4_zt_s8_x4 (0); /* { dg-error {too few arguments to function 'svluti4_zt_s8_x4'; expected 2, have 1} }  */
+   svluti4_zt_u8_x4 (0); /* { dg-error {too few arguments to function 'svluti4_zt_u8_x4'; expected 2, have 1} }  */
+ 
+   svluti4_zt_s8_x4 (0, zn_u8, 0); /* { dg-error {too many arguments to function 'svluti4_zt_s8_x4'; expected 2, have 3} }  */
+   svluti4_zt_u8_x4 (0, zn_u8, 0); /* { dg-error {too many arguments to function 'svluti4_zt_u8_x4'; expected 2, have 3} }  */
+ }
+ 
+ void
+ test_svluti4_zt_arg_type_mismatch (svuint8x2_t zn_u8) __arm_streaming __arm_in ("zt0")
+ {
+   struct Foo { uint64_t val; } foo = {0};
+   svluti4_zt_s8_x4 (foo, zn_u8); /* { dg-error {incompatible type for argument 1 of 'svluti4_zt_s8_x4'} }  */
+   svluti4_zt_u8_x4 (foo, zn_u8); /* { dg-error {incompatible type for argument 1 of 'svluti4_zt_u8_x4'} }  */
+ }
+ 
+ void
+ test_svluti4_zt_ret_type_mismatch (svuint8x2_t zn_u8) __arm_streaming __arm_in ("zt0")
+ {
+   int x0 = svluti4_zt_s8_x4 (0, zn_u8); /* { dg-error {incompatible types when initializing type 'int' using type 'svint8x4_t'} }   */
+   int x1 = svluti4_zt_u8_x4 (0, zn_u8); /* { dg-error {incompatible types when initializing type 'int' using type 'svuint8x4_t'} }  */
+ }
+ 
+ void
+ test_svluti4_zt_zt0_not_immediate (uint64_t zt0, svuint8x2_t zn_u8) __arm_streaming __arm_in ("zt0")
+ {
+   svluti4_zt_s8_x4 (zt0, zn_u8); /* { dg-error {argument 1 of 'svluti4_zt_s8_x4' must be an integer constant expression} }  */
+   svluti4_zt_u8_x4 (zt0, zn_u8); /* { dg-error {argument 1 of 'svluti4_zt_u8_x4' must be an integer constant expression} }  */
+ }
+ 
+ void
+ test_svluti4_zt_zt0_not_in_range (uint64_t zt0, svuint8x2_t zn_u8)__arm_streaming __arm_in ("zt0")
+ {
+   svluti4_zt_s8_x4 (1, zn_u8); /* { dg-error {passing 1 to argument 1 of 'svluti4_zt_s8_x4', which expects the value 0} }  */
+   svluti4_zt_u8_x4 (1, zn_u8); /* { dg-error {passing 1 to argument 1 of 'svluti4_zt_u8_x4', which expects the value 0} }  */
+ 
+   svluti4_zt_s8_x4 (-1, zn_u8); /* { dg-error {passing -1 to argument 1 of 'svluti4_zt_s8_x4', which expects the value 0} }  */
+   svluti4_zt_u8_x4 (-1, zn_u8); /* { dg-error {passing -1 to argument 1 of 'svluti4_zt_u8_x4', which expects the value 0} }  */
+ }
+ 
+ #pragma GCC reset_options
+ #pragma GCC target("+sve2,+sme2")
+ void
+ test_svluti4_zt_feature_not_enabled (svuint8x2_t zn_u8)__arm_streaming __arm_in ("zt0")
+ {
+   // GCC only complains for the first such instance, so only one test here.
+   svluti4_zt_s8_x4 (0, zn_u8); /* { dg-error {ACLE function 'svluti4_zt_s8_x4' requires ISA extension 'sme-lutv2'} } */
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/svwrite_lane_zt_1.c gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/svwrite_lane_zt_1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/svwrite_lane_zt_1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/svwrite_lane_zt_1.c	Sun Sep 21 22:33:04 2025
***************
*** 0 ****
--- 1,406 ----
+ /* { dg-options "-std=c23" }  */
+ /* { dg-do compile }  */
+ 
+ /* MOVT (vector to table)
+    Variants are also available for:
+    [_s8], [_u16], [_s16], [_u32], [_s32], [_u64], [_s64]
+    [_bf16], [_f16], [_f32], [_f64]
+    void svwrite_lane_zt[_u8] (uint64_t zt0, svuint8_t zt, uint64_t idx)
+ 	__arm_streaming __arm_out ("zt0");  */
+ 
+ #pragma GCC target "+sve2,+sme-lutv2"
+ static_assert (__ARM_FEATURE_SME_LUTv2 == 1);
+ #include <arm_sme.h>
+ 
+ void
+ test_svwrite_lane_zt_explicit_ok (
+   svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+   svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+   svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+   svfloat64_t zt_f64) __arm_streaming __arm_inout ("zt0")
+ {
+   svwrite_lane_zt_u8 (0, zt_u8, 0);
+   svwrite_lane_zt_s8 (0, zt_s8, 0);
+   svwrite_lane_zt_u16 (0, zt_u16, 0);
+   svwrite_lane_zt_s16 (0, zt_s16, 0);
+   svwrite_lane_zt_u32 (0, zt_u32, 0);
+   svwrite_lane_zt_s32 (0, zt_s32, 0);
+   svwrite_lane_zt_u64 (0, zt_u64, 0);
+   svwrite_lane_zt_s64 (0, zt_s64, 0);
+   svwrite_lane_zt_bf16 (0, zt_bf16, 0);
+   svwrite_lane_zt_f16 (0, zt_f16, 0);
+   svwrite_lane_zt_f32 (0, zt_f32, 0);
+   svwrite_lane_zt_f64 (0, zt_f64, 0);
+ }
+ 
+ void
+ test_svwrite_lane_zt_inferred_ok (
+   svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+   svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+   svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+   svfloat64_t zt_f64) __arm_streaming __arm_inout ("zt0")
+ {
+   svwrite_lane_zt (0, zt_u8, 0);
+   svwrite_lane_zt (0, zt_s8, 0);
+   svwrite_lane_zt (0, zt_u16, 0);
+   svwrite_lane_zt (0, zt_s16, 0);
+   svwrite_lane_zt (0, zt_u32, 0);
+   svwrite_lane_zt (0, zt_s32, 0);
+   svwrite_lane_zt (0, zt_u64, 0);
+   svwrite_lane_zt (0, zt_s64, 0);
+   svwrite_lane_zt (0, zt_bf16, 0);
+   svwrite_lane_zt (0, zt_f16, 0);
+   svwrite_lane_zt (0, zt_f32, 0);
+   svwrite_lane_zt (0, zt_f64, 0);
+ }
+ 
+ void
+ test_svwrite_lane_zt_explicit_error_not_streaming (
+   svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+   svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+   svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+   svfloat64_t zt_f64)
+ {
+   svwrite_lane_zt_u8 (0, zt_u8, 0);     /* { dg-error {ACLE function 'svwrite_lane_zt_u8' can only be called when SME streaming mode is enabled} }    */
+   svwrite_lane_zt_s8 (0, zt_s8, 0);     /* { dg-error {ACLE function 'svwrite_lane_zt_s8' can only be called when SME streaming mode is enabled} }    */
+   svwrite_lane_zt_u16 (0, zt_u16, 0);   /* { dg-error {ACLE function 'svwrite_lane_zt_u16' can only be called when SME streaming mode is enabled} }   */
+   svwrite_lane_zt_s16 (0, zt_s16, 0);   /* { dg-error {ACLE function 'svwrite_lane_zt_s16' can only be called when SME streaming mode is enabled} }   */
+   svwrite_lane_zt_u32 (0, zt_u32, 0);   /* { dg-error {ACLE function 'svwrite_lane_zt_u32' can only be called when SME streaming mode is enabled} }   */
+   svwrite_lane_zt_s32 (0, zt_s32, 0);   /* { dg-error {ACLE function 'svwrite_lane_zt_s32' can only be called when SME streaming mode is enabled} }   */
+   svwrite_lane_zt_u64 (0, zt_u64, 0);   /* { dg-error {ACLE function 'svwrite_lane_zt_u64' can only be called when SME streaming mode is enabled} }   */
+   svwrite_lane_zt_s64 (0, zt_s64, 0);   /* { dg-error {ACLE function 'svwrite_lane_zt_s64' can only be called when SME streaming mode is enabled} }   */
+   svwrite_lane_zt_bf16 (0, zt_bf16, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_bf16' can only be called when SME streaming mode is enabled} }  */
+   svwrite_lane_zt_f16 (0, zt_f16, 0);   /* { dg-error {ACLE function 'svwrite_lane_zt_f16' can only be called when SME streaming mode is enabled} }   */
+   svwrite_lane_zt_f32 (0, zt_f32, 0);   /* { dg-error {ACLE function 'svwrite_lane_zt_f32' can only be called when SME streaming mode is enabled} }   */
+   svwrite_lane_zt_f64 (0, zt_f64, 0);   /* { dg-error {ACLE function 'svwrite_lane_zt_f64' can only be called when SME streaming mode is enabled} }   */
+ }
+ 
+ void
+ test_svwrite_lane_zt_inferred_error_not_streaming (
+   svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+   svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+   svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+   svfloat64_t zt_f64)
+ {
+   svwrite_lane_zt (0, zt_u8, 0);   /* { dg-error {ACLE function 'svwrite_lane_zt_u8' can only be called when SME streaming mode is enabled} }    */
+   svwrite_lane_zt (0, zt_s8, 0);   /* { dg-error {ACLE function 'svwrite_lane_zt_s8' can only be called when SME streaming mode is enabled} }    */
+   svwrite_lane_zt (0, zt_u16, 0);  /* { dg-error {ACLE function 'svwrite_lane_zt_u16' can only be called when SME streaming mode is enabled} }   */
+   svwrite_lane_zt (0, zt_s16, 0);  /* { dg-error {ACLE function 'svwrite_lane_zt_s16' can only be called when SME streaming mode is enabled} }   */
+   svwrite_lane_zt (0, zt_u32, 0);  /* { dg-error {ACLE function 'svwrite_lane_zt_u32' can only be called when SME streaming mode is enabled} }   */
+   svwrite_lane_zt (0, zt_s32, 0);  /* { dg-error {ACLE function 'svwrite_lane_zt_s32' can only be called when SME streaming mode is enabled} }   */
+   svwrite_lane_zt (0, zt_u64, 0);  /* { dg-error {ACLE function 'svwrite_lane_zt_u64' can only be called when SME streaming mode is enabled} }   */
+   svwrite_lane_zt (0, zt_s64, 0);  /* { dg-error {ACLE function 'svwrite_lane_zt_s64' can only be called when SME streaming mode is enabled} }   */
+   svwrite_lane_zt (0, zt_bf16, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_bf16' can only be called when SME streaming mode is enabled} }  */
+   svwrite_lane_zt (0, zt_f16, 0);  /* { dg-error {ACLE function 'svwrite_lane_zt_f16' can only be called when SME streaming mode is enabled} }   */
+   svwrite_lane_zt (0, zt_f32, 0);  /* { dg-error {ACLE function 'svwrite_lane_zt_f32' can only be called when SME streaming mode is enabled} }   */
+   svwrite_lane_zt (0, zt_f64, 0);  /* { dg-error {ACLE function 'svwrite_lane_zt_f64' can only be called when SME streaming mode is enabled} }   */
+ }
+ 
+ void
+ test_svwrite_lane_zt_explicit_error_arg_count_mismatch (
+   svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+   svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+   svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+   svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+ {
+   svwrite_lane_zt_u8 ();   /* { dg-error {too few arguments to function 'svwrite_lane_zt_u8'; expected 3, have 0} }    */
+   svwrite_lane_zt_s8 ();   /* { dg-error {too few arguments to function 'svwrite_lane_zt_s8'; expected 3, have 0} }    */
+   svwrite_lane_zt_u16 ();  /* { dg-error {too few arguments to function 'svwrite_lane_zt_u16'; expected 3, have 0} }   */
+   svwrite_lane_zt_s16 ();  /* { dg-error {too few arguments to function 'svwrite_lane_zt_s16'; expected 3, have 0} }   */
+   svwrite_lane_zt_u32 ();  /* { dg-error {too few arguments to function 'svwrite_lane_zt_u32'; expected 3, have 0} }   */
+   svwrite_lane_zt_s32 ();  /* { dg-error {too few arguments to function 'svwrite_lane_zt_s32'; expected 3, have 0} }   */
+   svwrite_lane_zt_u64 ();  /* { dg-error {too few arguments to function 'svwrite_lane_zt_u64'; expected 3, have 0} }   */
+   svwrite_lane_zt_s64 ();  /* { dg-error {too few arguments to function 'svwrite_lane_zt_s64'; expected 3, have 0} }   */
+   svwrite_lane_zt_bf16 (); /* { dg-error {too few arguments to function 'svwrite_lane_zt_bf16'; expected 3, have 0} }  */
+   svwrite_lane_zt_f16 ();  /* { dg-error {too few arguments to function 'svwrite_lane_zt_f16'; expected 3, have 0} }   */
+   svwrite_lane_zt_f32 ();  /* { dg-error {too few arguments to function 'svwrite_lane_zt_f32'; expected 3, have 0} }   */
+   svwrite_lane_zt_f64 ();  /* { dg-error {too few arguments to function 'svwrite_lane_zt_f64'; expected 3, have 0} }   */
+ 
+   svwrite_lane_zt_u8 (0);   /* { dg-error {too few arguments to function 'svwrite_lane_zt_u8'; expected 3, have 1} }    */
+   svwrite_lane_zt_s8 (0);   /* { dg-error {too few arguments to function 'svwrite_lane_zt_s8'; expected 3, have 1} }    */
+   svwrite_lane_zt_u16 (0);  /* { dg-error {too few arguments to function 'svwrite_lane_zt_u16'; expected 3, have 1} }   */
+   svwrite_lane_zt_s16 (0);  /* { dg-error {too few arguments to function 'svwrite_lane_zt_s16'; expected 3, have 1} }   */
+   svwrite_lane_zt_u32 (0);  /* { dg-error {too few arguments to function 'svwrite_lane_zt_u32'; expected 3, have 1} }   */
+   svwrite_lane_zt_s32 (0);  /* { dg-error {too few arguments to function 'svwrite_lane_zt_s32'; expected 3, have 1} }   */
+   svwrite_lane_zt_u64 (0);  /* { dg-error {too few arguments to function 'svwrite_lane_zt_u64'; expected 3, have 1} }   */
+   svwrite_lane_zt_s64 (0);  /* { dg-error {too few arguments to function 'svwrite_lane_zt_s64'; expected 3, have 1} }   */
+   svwrite_lane_zt_bf16 (0); /* { dg-error {too few arguments to function 'svwrite_lane_zt_bf16'; expected 3, have 1} }  */
+   svwrite_lane_zt_f16 (0);  /* { dg-error {too few arguments to function 'svwrite_lane_zt_f16'; expected 3, have 1} }   */
+   svwrite_lane_zt_f32 (0);  /* { dg-error {too few arguments to function 'svwrite_lane_zt_f32'; expected 3, have 1} }   */
+   svwrite_lane_zt_f64 (0);  /* { dg-error {too few arguments to function 'svwrite_lane_zt_f64'; expected 3, have 1} }   */
+ 
+   svwrite_lane_zt_u8 (0, zt_u8);     /* { dg-error {too few arguments to function 'svwrite_lane_zt_u8'; expected 3, have 2} }    */
+   svwrite_lane_zt_s8 (0, zt_s8);     /* { dg-error {too few arguments to function 'svwrite_lane_zt_s8'; expected 3, have 2} }    */
+   svwrite_lane_zt_u16 (0, zt_u16);   /* { dg-error {too few arguments to function 'svwrite_lane_zt_u16'; expected 3, have 2} }   */
+   svwrite_lane_zt_s16 (0, zt_s16);   /* { dg-error {too few arguments to function 'svwrite_lane_zt_s16'; expected 3, have 2} }   */
+   svwrite_lane_zt_u32 (0, zt_u32);   /* { dg-error {too few arguments to function 'svwrite_lane_zt_u32'; expected 3, have 2} }   */
+   svwrite_lane_zt_s32 (0, zt_s32);   /* { dg-error {too few arguments to function 'svwrite_lane_zt_s32'; expected 3, have 2} }   */
+   svwrite_lane_zt_u64 (0, zt_u64);   /* { dg-error {too few arguments to function 'svwrite_lane_zt_u64'; expected 3, have 2} }   */
+   svwrite_lane_zt_s64 (0, zt_s64);   /* { dg-error {too few arguments to function 'svwrite_lane_zt_s64'; expected 3, have 2} }   */
+   svwrite_lane_zt_bf16 (0, zt_bf16); /* { dg-error {too few arguments to function 'svwrite_lane_zt_bf16'; expected 3, have 2} }  */
+   svwrite_lane_zt_f16 (0, zt_f16);   /* { dg-error {too few arguments to function 'svwrite_lane_zt_f16'; expected 3, have 2} }   */
+   svwrite_lane_zt_f32 (0, zt_f32);   /* { dg-error {too few arguments to function 'svwrite_lane_zt_f32'; expected 3, have 2} }   */
+   svwrite_lane_zt_f64 (0, zt_f64);   /* { dg-error {too few arguments to function 'svwrite_lane_zt_f64'; expected 3, have 2} }   */
+ 
+   svwrite_lane_zt_u8 (0, zt_u8, 0, 0);     /* { dg-error {too many arguments to function 'svwrite_lane_zt_u8'; expected 3, have 4} }    */
+   svwrite_lane_zt_s8 (0, zt_s8, 0, 0);     /* { dg-error {too many arguments to function 'svwrite_lane_zt_s8'; expected 3, have 4} }    */
+   svwrite_lane_zt_u16 (0, zt_u16, 0, 0);   /* { dg-error {too many arguments to function 'svwrite_lane_zt_u16'; expected 3, have 4} }   */
+   svwrite_lane_zt_s16 (0, zt_s16, 0, 0);   /* { dg-error {too many arguments to function 'svwrite_lane_zt_s16'; expected 3, have 4} }   */
+   svwrite_lane_zt_u32 (0, zt_u32, 0, 0);   /* { dg-error {too many arguments to function 'svwrite_lane_zt_u32'; expected 3, have 4} }   */
+   svwrite_lane_zt_s32 (0, zt_s32, 0, 0);   /* { dg-error {too many arguments to function 'svwrite_lane_zt_s32'; expected 3, have 4} }   */
+   svwrite_lane_zt_u64 (0, zt_u64, 0, 0);   /* { dg-error {too many arguments to function 'svwrite_lane_zt_u64'; expected 3, have 4} }   */
+   svwrite_lane_zt_s64 (0, zt_s64, 0, 0);   /* { dg-error {too many arguments to function 'svwrite_lane_zt_s64'; expected 3, have 4} }   */
+   svwrite_lane_zt_bf16 (0, zt_bf16, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt_bf16'; expected 3, have 4} }  */
+   svwrite_lane_zt_f16 (0, zt_f16, 0, 0);   /* { dg-error {too many arguments to function 'svwrite_lane_zt_f16'; expected 3, have 4} }   */
+   svwrite_lane_zt_f32 (0, zt_f32, 0, 0);   /* { dg-error {too many arguments to function 'svwrite_lane_zt_f32'; expected 3, have 4} }   */
+   svwrite_lane_zt_f64 (0, zt_f64, 0, 0);   /* { dg-error {too many arguments to function 'svwrite_lane_zt_f64'; expected 3, have 4} }   */
+ }
+ 
+ void
+ test_svwrite_lane_zt_implicit_error_arg_count_mismatch (
+   svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+   svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+   svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+   svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+ {
+   svwrite_lane_zt ();           /* { dg-error {too few arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0);          /* { dg-error {too few arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_u8);   /* { dg-error {too few arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_s8);   /* { dg-error {too few arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_u16);	/* { dg-error {too few arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_s16);	/* { dg-error {too few arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_u32);	/* { dg-error {too few arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_s32);	/* { dg-error {too few arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_u64);	/* { dg-error {too few arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_s64);	/* { dg-error {too few arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_bf16); /* { dg-error {too few arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_f16);	/* { dg-error {too few arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_f32);	/* { dg-error {too few arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_f64);	/* { dg-error {too few arguments to function 'svwrite_lane_zt'} }  */
+ 
+   svwrite_lane_zt (0, zt_u8, 0, 0);   /* { dg-error {too many arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_s8, 0, 0);   /* { dg-error {too many arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_u16, 0, 0);  /* { dg-error {too many arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_s16, 0, 0);  /* { dg-error {too many arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_u32, 0, 0);  /* { dg-error {too many arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_s32, 0, 0);  /* { dg-error {too many arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_u64, 0, 0);  /* { dg-error {too many arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_s64, 0, 0);  /* { dg-error {too many arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_bf16, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_f16, 0, 0);  /* { dg-error {too many arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_f32, 0, 0);  /* { dg-error {too many arguments to function 'svwrite_lane_zt'} }  */
+   svwrite_lane_zt (0, zt_f64, 0, 0);  /* { dg-error {too many arguments to function 'svwrite_lane_zt'} }  */
+ }
+ 
+ void
+ test_svwrite_lane_zt_explicit_error_arg_type_mismatch (
+   svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+   svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+   svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+   svfloat64_t zt_f64, svuint8x2_t zt_u8x2, svint8x2_t zt_s8x2,
+   svuint16x2_t zt_u16x2, svint16x2_t zt_s16x2, svuint32x2_t zt_u32x2,
+   svint32x2_t zt_s32x2, svuint64x2_t zt_u64x2, svint64x2_t zt_s64x2,
+   svbfloat16x2_t zt_bf16x2, svfloat16x2_t zt_f16x2, svfloat32x2_t zt_f32x2,
+   svfloat64x2_t zt_f64x2) __arm_streaming __arm_out ("zt0")
+ {
+   struct Foo { uint64_t val; } foo = {0};
+   svwrite_lane_zt_u8 (foo, zt_u8, 0);     /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_u8'} }    */
+   svwrite_lane_zt_s8 (foo, zt_s8, 0);     /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_s8'} }    */
+   svwrite_lane_zt_u16 (foo, zt_u16, 0);   /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_u16'} }   */
+   svwrite_lane_zt_s16 (foo, zt_s16, 0);   /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_s16'} }   */
+   svwrite_lane_zt_u32 (foo, zt_u32, 0);   /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_u32'} }   */
+   svwrite_lane_zt_s32 (foo, zt_s32, 0);   /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_s32'} }   */
+   svwrite_lane_zt_u64 (foo, zt_u64, 0);   /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_u64'} }   */
+   svwrite_lane_zt_s64 (foo, zt_s64, 0);   /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_s64'} }   */
+   svwrite_lane_zt_bf16 (foo, zt_bf16, 0); /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_bf16'} }  */
+   svwrite_lane_zt_f16 (foo, zt_f16, 0);   /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_f16'} }   */
+   svwrite_lane_zt_f32 (foo, zt_f32, 0);   /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_f32'} }   */
+   svwrite_lane_zt_f64 (foo, zt_f64, 0);   /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_f64'} }   */
+ 
+   svwrite_lane_zt_u8 (0, zt_s8, 0);    /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_u8'} }    */
+   svwrite_lane_zt_s8 (0, zt_u8, 0);    /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_s8'} }    */
+   svwrite_lane_zt_u16 (0, zt_s16, 0);  /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_u16'} }   */
+   svwrite_lane_zt_s16 (0, zt_u16, 0);  /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_s16'} }   */
+   svwrite_lane_zt_u32 (0, zt_s32, 0);  /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_u32'} }   */
+   svwrite_lane_zt_s32 (0, zt_u32, 0);  /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_s32'} }   */
+   svwrite_lane_zt_u64 (0, zt_s64, 0);  /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_u64'} }   */
+   svwrite_lane_zt_s64 (0, zt_u64, 0);  /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_s64'} }   */
+   svwrite_lane_zt_bf16 (0, zt_f16, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_bf16'} }  */
+   svwrite_lane_zt_f16 (0, zt_bf16, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_f16'} }   */
+   svwrite_lane_zt_f32 (0, zt_f64, 0);  /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_f32'} }   */
+   svwrite_lane_zt_f64 (0, zt_f32, 0);  /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_f64'} }   */
+ 
+   svwrite_lane_zt_u8 (0, zt_u8x2, 0);     /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_u8'} }    */
+   svwrite_lane_zt_s8 (0, zt_s8x2, 0);     /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_s8'} }    */
+   svwrite_lane_zt_u16 (0, zt_u16x2, 0);   /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_u16'} }   */
+   svwrite_lane_zt_s16 (0, zt_s16x2, 0);   /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_s16'} }   */
+   svwrite_lane_zt_u32 (0, zt_u32x2, 0);   /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_u32'} }   */
+   svwrite_lane_zt_s32 (0, zt_s32x2, 0);   /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_s32'} }   */
+   svwrite_lane_zt_u64 (0, zt_u64x2, 0);   /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_u64'} }   */
+   svwrite_lane_zt_s64 (0, zt_s64x2, 0);   /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_s64'} }   */
+   svwrite_lane_zt_bf16 (0, zt_bf16x2, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_bf16'} }  */
+   svwrite_lane_zt_f16 (0, zt_f16x2, 0);   /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_f16'} }   */
+   svwrite_lane_zt_f32 (0, zt_f32x2, 0);   /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_f32'} }   */
+   svwrite_lane_zt_f64 (0, zt_f64x2, 0);   /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_f64'} }   */
+ 
+   svwrite_lane_zt_u8 (0, zt_u8, foo);     /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_u8'} }    */
+   svwrite_lane_zt_s8 (0, zt_s8, foo);     /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_s8'} }    */
+   svwrite_lane_zt_u16 (0, zt_u16, foo);   /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_u16'} }   */
+   svwrite_lane_zt_s16 (0, zt_s16, foo);   /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_s16'} }   */
+   svwrite_lane_zt_u32 (0, zt_u32, foo);   /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_u32'} }   */
+   svwrite_lane_zt_s32 (0, zt_s32, foo);   /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_s32'} }   */
+   svwrite_lane_zt_u64 (0, zt_u64, foo);   /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_u64'} }   */
+   svwrite_lane_zt_s64 (0, zt_s64, foo);   /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_s64'} }   */
+   svwrite_lane_zt_bf16 (0, zt_bf16, foo); /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_bf16'} }  */
+   svwrite_lane_zt_f16 (0, zt_f16, foo);   /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_f16'} }   */
+   svwrite_lane_zt_f32 (0, zt_f32, foo);   /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_f32'} }   */
+   svwrite_lane_zt_f64 (0, zt_f64, foo);   /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_f64'} }   */
+ }
+ 
+ void
+ test_svwrite_zt_inferred_error_arg_type_mismatch (
+   svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+   svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+   svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+   svfloat64_t zt_f64, svuint8x2_t zt_u8x2) __arm_streaming __arm_out ("zt0")
+ {
+   struct Foo { uint64_t val; } foo = {0};
+   svwrite_lane_zt (foo, zt_u8, 0);  /* { dg-error {passing 'struct Foo' to argument 1 of 'svwrite_lane_zt', which expects 'uint64_t'} }  */
+   svwrite_lane_zt (0, zt_u8x2, 0);  /* { dg-error {passing 'svuint8x2_t' to argument 2 of 'svwrite_lane_zt', which expects a single SVE vector rather than a tuple} }  */
+   svwrite_lane_zt (0, zt_u8, foo);  /* { dg-error {passing 'struct Foo' to argument 3 of 'svwrite_lane_zt', which expects 'uint64_t'} }  */
+ }
+ 
+ void
+ test_svwrite_lane_zt_explicit_error_zt0_not_immediate (
+   uint64_t zt0, svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16,
+   svint16_t zt_s16, svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64,
+   svint64_t zt_s64, svbfloat16_t zt_bf16, svfloat16_t zt_f16,
+   svfloat32_t zt_f32, svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+ {
+   svwrite_lane_zt_u8 (zt0, zt_u8, 0);     /* { dg-error {argument 1 of 'svwrite_lane_zt_u8' must be an integer constant expression} }    */
+   svwrite_lane_zt_s8 (zt0, zt_s8, 0);     /* { dg-error {argument 1 of 'svwrite_lane_zt_s8' must be an integer constant expression} }    */
+   svwrite_lane_zt_u16 (zt0, zt_u16, 0);   /* { dg-error {argument 1 of 'svwrite_lane_zt_u16' must be an integer constant expression} }   */
+   svwrite_lane_zt_s16 (zt0, zt_s16, 0);   /* { dg-error {argument 1 of 'svwrite_lane_zt_s16' must be an integer constant expression} }   */
+   svwrite_lane_zt_u32 (zt0, zt_u32, 0);   /* { dg-error {argument 1 of 'svwrite_lane_zt_u32' must be an integer constant expression} }   */
+   svwrite_lane_zt_s32 (zt0, zt_s32, 0);   /* { dg-error {argument 1 of 'svwrite_lane_zt_s32' must be an integer constant expression} }   */
+   svwrite_lane_zt_u64 (zt0, zt_u64, 0);   /* { dg-error {argument 1 of 'svwrite_lane_zt_u64' must be an integer constant expression} }   */
+   svwrite_lane_zt_s64 (zt0, zt_s64, 0);   /* { dg-error {argument 1 of 'svwrite_lane_zt_s64' must be an integer constant expression} }   */
+   svwrite_lane_zt_bf16 (zt0, zt_bf16, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt_bf16' must be an integer constant expression} }  */
+   svwrite_lane_zt_f16 (zt0, zt_f16, 0);   /* { dg-error {argument 1 of 'svwrite_lane_zt_f16' must be an integer constant expression} }   */
+   svwrite_lane_zt_f32 (zt0, zt_f32, 0);   /* { dg-error {argument 1 of 'svwrite_lane_zt_f32' must be an integer constant expression} }   */
+   svwrite_lane_zt_f64 (zt0, zt_f64, 0);   /* { dg-error {argument 1 of 'svwrite_lane_zt_f64' must be an integer constant expression} }   */
+ }
+ 
+ void
+ test_svwrite_lane_zt_inferred_error_zt0_not_immediate (
+   uint64_t zt0, svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16,
+   svint16_t zt_s16, svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64,
+   svint64_t zt_s64, svbfloat16_t zt_bf16, svfloat16_t zt_f16,
+   svfloat32_t zt_f32, svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+ {
+   svwrite_lane_zt (zt0, zt_u8, 0);   /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (zt0, zt_s8, 0);   /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (zt0, zt_u16, 0);  /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (zt0, zt_s16, 0);  /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (zt0, zt_u32, 0);  /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (zt0, zt_s32, 0);  /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (zt0, zt_u64, 0);  /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (zt0, zt_s64, 0);  /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (zt0, zt_bf16, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (zt0, zt_f16, 0);  /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (zt0, zt_f32, 0);  /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (zt0, zt_f64, 0);  /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+ }
+ 
+ void
+ test_svwrite_lane_zt_explicit_error_idx_not_immediate (
+   uint64_t idx, svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16,
+   svint16_t zt_s16, svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64,
+   svint64_t zt_s64, svbfloat16_t zt_bf16, svfloat16_t zt_f16,
+   svfloat32_t zt_f32, svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+ {
+   svwrite_lane_zt_u8 (0, zt_u8, idx);      /* { dg-error {argument 3 of 'svwrite_lane_zt_u8' must be an integer constant expression} }    */
+   svwrite_lane_zt_s8 (0, zt_s8, idx);      /* { dg-error {argument 3 of 'svwrite_lane_zt_s8' must be an integer constant expression} }    */
+   svwrite_lane_zt_u16 (0, zt_u16, idx);    /* { dg-error {argument 3 of 'svwrite_lane_zt_u16' must be an integer constant expression} }   */
+   svwrite_lane_zt_s16 (0, zt_s16, idx);    /* { dg-error {argument 3 of 'svwrite_lane_zt_s16' must be an integer constant expression} }   */
+   svwrite_lane_zt_u32 (0, zt_u32, idx);    /* { dg-error {argument 3 of 'svwrite_lane_zt_u32' must be an integer constant expression} }   */
+   svwrite_lane_zt_s32 (0, zt_s32, idx);    /* { dg-error {argument 3 of 'svwrite_lane_zt_s32' must be an integer constant expression} }   */
+   svwrite_lane_zt_u64 (0, zt_u64, idx);    /* { dg-error {argument 3 of 'svwrite_lane_zt_u64' must be an integer constant expression} }   */
+   svwrite_lane_zt_s64 (0, zt_s64, idx);    /* { dg-error {argument 3 of 'svwrite_lane_zt_s64' must be an integer constant expression} }   */
+   svwrite_lane_zt_bf16 (0, zt_bf16, idx);  /* { dg-error {argument 3 of 'svwrite_lane_zt_bf16' must be an integer constant expression} }  */
+   svwrite_lane_zt_f16 (0, zt_f16, idx);    /* { dg-error {argument 3 of 'svwrite_lane_zt_f16' must be an integer constant expression} }   */
+   svwrite_lane_zt_f32 (0, zt_f32, idx);    /* { dg-error {argument 3 of 'svwrite_lane_zt_f32' must be an integer constant expression} }   */
+   svwrite_lane_zt_f64 (0, zt_f64, idx);    /* { dg-error {argument 3 of 'svwrite_lane_zt_f64' must be an integer constant expression} }   */
+ }
+ 
+ void
+ test_svwrite_lane_zt_inferred_error_idx_not_immediate (
+   uint64_t idx, svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16,
+   svint16_t zt_s16, svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64,
+   svint64_t zt_s64, svbfloat16_t zt_bf16, svfloat16_t zt_f16,
+   svfloat32_t zt_f32, svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+ {
+   svwrite_lane_zt (0, zt_u8, idx);   /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (0, zt_s8, idx);   /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (0, zt_u16, idx);  /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (0, zt_s16, idx);  /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (0, zt_u32, idx);  /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (0, zt_s32, idx);  /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (0, zt_u64, idx);  /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (0, zt_s64, idx);  /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (0, zt_bf16, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (0, zt_f16, idx);  /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (0, zt_f32, idx);  /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+   svwrite_lane_zt (0, zt_f64, idx);  /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} }  */
+ }
+ 
+ void
+ test_svwrite_lane_zt_explicit_error_idx_not_in_range (
+   uint64_t idx, svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16,
+   svint16_t zt_s16, svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64,
+   svint64_t zt_s64, svbfloat16_t zt_bf16, svfloat16_t zt_f16,
+   svfloat32_t zt_f32, svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+ {
+   svwrite_lane_zt_u8 (0, zt_u8, 4);     /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_u8', which expects a value in the range \[0, 3\]} }    */
+   svwrite_lane_zt_s8 (0, zt_s8, 4);     /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_s8', which expects a value in the range \[0, 3\]} }    */
+   svwrite_lane_zt_u16 (0, zt_u16, 4);   /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_u16', which expects a value in the range \[0, 3\]} }   */
+   svwrite_lane_zt_s16 (0, zt_s16, 4);   /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_s16', which expects a value in the range \[0, 3\]} }   */
+   svwrite_lane_zt_u32 (0, zt_u32, 4);   /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_u32', which expects a value in the range \[0, 3\]} }   */
+   svwrite_lane_zt_s32 (0, zt_s32, 4);   /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_s32', which expects a value in the range \[0, 3\]} }   */
+   svwrite_lane_zt_u64 (0, zt_u64, 4);   /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_u64', which expects a value in the range \[0, 3\]} }   */
+   svwrite_lane_zt_s64 (0, zt_s64, 4);   /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_s64', which expects a value in the range \[0, 3\]} }   */
+   svwrite_lane_zt_bf16 (0, zt_bf16, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_bf16', which expects a value in the range \[0, 3\]} }  */
+   svwrite_lane_zt_f16 (0, zt_f16, 4);   /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_f16', which expects a value in the range \[0, 3\]} }   */
+   svwrite_lane_zt_f32 (0, zt_f32, 4);   /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_f32', which expects a value in the range \[0, 3\]} }   */
+   svwrite_lane_zt_f64 (0, zt_f64, 4);   /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_f64', which expects a value in the range \[0, 3\]} }   */
+ }
+ 
+ void
+ test_svwrite_lane_zt_inferred_error_idx_not_in_range (
+   uint64_t idx, svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16,
+   svint16_t zt_s16, svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64,
+   svint64_t zt_s64, svbfloat16_t zt_bf16, svfloat16_t zt_f16,
+   svfloat32_t zt_f32, svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+ {
+   svwrite_lane_zt (0, zt_u8, 4);   /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} }  */
+   svwrite_lane_zt (0, zt_s8, 4);   /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} }  */
+   svwrite_lane_zt (0, zt_u16, 4);  /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} }  */
+   svwrite_lane_zt (0, zt_s16, 4);  /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} }  */
+   svwrite_lane_zt (0, zt_u32, 4);  /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} }  */
+   svwrite_lane_zt (0, zt_s32, 4);  /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} }  */
+   svwrite_lane_zt (0, zt_u64, 4);  /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} }  */
+   svwrite_lane_zt (0, zt_s64, 4);  /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} }  */
+   svwrite_lane_zt (0, zt_bf16, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} }  */
+   svwrite_lane_zt (0, zt_f16, 4);  /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} }  */
+   svwrite_lane_zt (0, zt_f32, 4);  /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} }  */
+   svwrite_lane_zt (0, zt_f64, 4);  /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} }  */
+ }
+ 
+ #pragma GCC reset_options
+ #pragma GCC target("+sve2,+sme2")
+ void
+ test_svwrite_lane_zt_feature_not_enabled (svuint8_t zt_u8) __arm_streaming __arm_out ("zt0")
+ {
+   // GCC only complains for the first such instance, so only one test here.
+   svwrite_lane_zt (0, zt_u8, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_u8' requires ISA extension 'sme-lutv2'} } */
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/svwrite_zt_1.c gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/svwrite_zt_1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/svwrite_zt_1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/svwrite_zt_1.c	Sun Sep 21 22:33:04 2025
***************
*** 0 ****
--- 1,351 ----
+ /* { dg-options "-std=c23" }  */
+ /* { dg-do compile }  */
+ 
+ /* MOVT (vector to table)
+    Variants are also available for:
+    [_s8], [_u16], [_s16], [_u32], [_s32], [_u64], [_s64]
+    [_bf16], [_f16], [_f32], [_f64]
+    void svwrite_zt[_u8] (uint64_t zt0, svuint8_t zt, uint64_t idx)
+ 	__arm_streaming __arm_out ("zt0");  */
+ 
+ #pragma GCC target "+sve2,+sme-lutv2"
+ static_assert (__ARM_FEATURE_SME_LUTv2 == 1);
+ #include <arm_sme.h>
+ 
+ void
+ test_svwrite_zt_explicit_ok (
+   svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+   svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+   svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+   svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+ {
+   svwrite_zt_u8 (0, zt_u8);
+   svwrite_zt_s8 (0, zt_s8);
+   svwrite_zt_u16 (0, zt_u16);
+   svwrite_zt_s16 (0, zt_s16);
+   svwrite_zt_u32 (0, zt_u32);
+   svwrite_zt_s32 (0, zt_s32);
+   svwrite_zt_u64 (0, zt_u64);
+   svwrite_zt_s64 (0, zt_s64);
+   svwrite_zt_bf16 (0, zt_bf16);
+   svwrite_zt_f16 (0, zt_f16);
+   svwrite_zt_f32 (0, zt_f32);
+   svwrite_zt_f64 (0, zt_f64);
+ }
+ 
+ void
+ test_svwrite_zt_inferred_ok (
+   svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+   svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+   svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+   svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+ {
+   svwrite_zt (0, zt_u8);
+   svwrite_zt (0, zt_s8);
+   svwrite_zt (0, zt_u16);
+   svwrite_zt (0, zt_s16);
+   svwrite_zt (0, zt_u32);
+   svwrite_zt (0, zt_s32);
+   svwrite_zt (0, zt_u64);
+   svwrite_zt (0, zt_s64);
+   svwrite_zt (0, zt_bf16);
+   svwrite_zt (0, zt_f16);
+   svwrite_zt (0, zt_f32);
+   svwrite_zt (0, zt_f64);
+ }
+ 
+ void
+ test_svwrite_zt_explicit_error_not_streaming (
+   svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+   svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+   svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+   svfloat64_t zt_f64)
+ {
+   svwrite_zt_u8 (0, zt_u8);     /* { dg-error {ACLE function 'svwrite_zt_u8' can only be called when SME streaming mode is enabled} }    */
+   svwrite_zt_s8 (0, zt_s8);     /* { dg-error {ACLE function 'svwrite_zt_s8' can only be called when SME streaming mode is enabled} }    */
+   svwrite_zt_u16 (0, zt_u16);   /* { dg-error {ACLE function 'svwrite_zt_u16' can only be called when SME streaming mode is enabled} }   */
+   svwrite_zt_s16 (0, zt_s16);   /* { dg-error {ACLE function 'svwrite_zt_s16' can only be called when SME streaming mode is enabled} }   */
+   svwrite_zt_u32 (0, zt_u32);   /* { dg-error {ACLE function 'svwrite_zt_u32' can only be called when SME streaming mode is enabled} }   */
+   svwrite_zt_s32 (0, zt_s32);   /* { dg-error {ACLE function 'svwrite_zt_s32' can only be called when SME streaming mode is enabled} }   */
+   svwrite_zt_u64 (0, zt_u64);   /* { dg-error {ACLE function 'svwrite_zt_u64' can only be called when SME streaming mode is enabled} }   */
+   svwrite_zt_s64 (0, zt_s64);   /* { dg-error {ACLE function 'svwrite_zt_s64' can only be called when SME streaming mode is enabled} }   */
+   svwrite_zt_bf16 (0, zt_bf16); /* { dg-error {ACLE function 'svwrite_zt_bf16' can only be called when SME streaming mode is enabled} }  */
+   svwrite_zt_f16 (0, zt_f16);   /* { dg-error {ACLE function 'svwrite_zt_f16' can only be called when SME streaming mode is enabled} }   */
+   svwrite_zt_f32 (0, zt_f32);   /* { dg-error {ACLE function 'svwrite_zt_f32' can only be called when SME streaming mode is enabled} }   */
+   svwrite_zt_f64 (0, zt_f64);   /* { dg-error {ACLE function 'svwrite_zt_f64' can only be called when SME streaming mode is enabled} }   */
+ }
+ 
+ void
+ test_svwrite_zt_inferred_error_not_streaming (
+   svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+   svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+   svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+   svfloat64_t zt_f64)
+ {
+   svwrite_zt (0, zt_u8);   /* { dg-error {ACLE function 'svwrite_zt_u8' can only be called when SME streaming mode is enabled} }    */
+   svwrite_zt (0, zt_s8);   /* { dg-error {ACLE function 'svwrite_zt_s8' can only be called when SME streaming mode is enabled} }    */
+   svwrite_zt (0, zt_u16);  /* { dg-error {ACLE function 'svwrite_zt_u16' can only be called when SME streaming mode is enabled} }   */
+   svwrite_zt (0, zt_s16);  /* { dg-error {ACLE function 'svwrite_zt_s16' can only be called when SME streaming mode is enabled} }   */
+   svwrite_zt (0, zt_u32);  /* { dg-error {ACLE function 'svwrite_zt_u32' can only be called when SME streaming mode is enabled} }   */
+   svwrite_zt (0, zt_s32);  /* { dg-error {ACLE function 'svwrite_zt_s32' can only be called when SME streaming mode is enabled} }   */
+   svwrite_zt (0, zt_u64);  /* { dg-error {ACLE function 'svwrite_zt_u64' can only be called when SME streaming mode is enabled} }   */
+   svwrite_zt (0, zt_s64);  /* { dg-error {ACLE function 'svwrite_zt_s64' can only be called when SME streaming mode is enabled} }   */
+   svwrite_zt (0, zt_bf16); /* { dg-error {ACLE function 'svwrite_zt_bf16' can only be called when SME streaming mode is enabled} }  */
+   svwrite_zt (0, zt_f16);  /* { dg-error {ACLE function 'svwrite_zt_f16' can only be called when SME streaming mode is enabled} }   */
+   svwrite_zt (0, zt_f32);  /* { dg-error {ACLE function 'svwrite_zt_f32' can only be called when SME streaming mode is enabled} }   */
+   svwrite_zt (0, zt_f64);  /* { dg-error {ACLE function 'svwrite_zt_f64' can only be called when SME streaming mode is enabled} }   */
+ }
+ 
+ void
+ test_svwrite_zt_explicit_error_arg_count_mismatch (
+   svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+   svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+   svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+   svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+ {
+   svwrite_zt_u8 ();   /* { dg-error {too few arguments to function 'svwrite_zt_u8'; expected 2, have 0} }    */
+   svwrite_zt_s8 ();   /* { dg-error {too few arguments to function 'svwrite_zt_s8'; expected 2, have 0} }    */
+   svwrite_zt_u16 ();  /* { dg-error {too few arguments to function 'svwrite_zt_u16'; expected 2, have 0} }   */
+   svwrite_zt_s16 ();  /* { dg-error {too few arguments to function 'svwrite_zt_s16'; expected 2, have 0} }   */
+   svwrite_zt_u32 ();  /* { dg-error {too few arguments to function 'svwrite_zt_u32'; expected 2, have 0} }   */
+   svwrite_zt_s32 ();  /* { dg-error {too few arguments to function 'svwrite_zt_s32'; expected 2, have 0} }   */
+   svwrite_zt_u64 ();  /* { dg-error {too few arguments to function 'svwrite_zt_u64'; expected 2, have 0} }   */
+   svwrite_zt_s64 ();  /* { dg-error {too few arguments to function 'svwrite_zt_s64'; expected 2, have 0} }   */
+   svwrite_zt_bf16 (); /* { dg-error {too few arguments to function 'svwrite_zt_bf16'; expected 2, have 0} }  */
+   svwrite_zt_f16 ();  /* { dg-error {too few arguments to function 'svwrite_zt_f16'; expected 2, have 0} }   */
+   svwrite_zt_f32 ();  /* { dg-error {too few arguments to function 'svwrite_zt_f32'; expected 2, have 0} }   */
+   svwrite_zt_f64 ();  /* { dg-error {too few arguments to function 'svwrite_zt_f64'; expected 2, have 0} }   */
+ 
+   svwrite_zt_u8 (0);   /* { dg-error {too few arguments to function 'svwrite_zt_u8'; expected 2, have 1} }    */
+   svwrite_zt_s8 (0);   /* { dg-error {too few arguments to function 'svwrite_zt_s8'; expected 2, have 1} }    */
+   svwrite_zt_u16 (0);  /* { dg-error {too few arguments to function 'svwrite_zt_u16'; expected 2, have 1} }   */
+   svwrite_zt_s16 (0);  /* { dg-error {too few arguments to function 'svwrite_zt_s16'; expected 2, have 1} }   */
+   svwrite_zt_u32 (0);  /* { dg-error {too few arguments to function 'svwrite_zt_u32'; expected 2, have 1} }   */
+   svwrite_zt_s32 (0);  /* { dg-error {too few arguments to function 'svwrite_zt_s32'; expected 2, have 1} }   */
+   svwrite_zt_u64 (0);  /* { dg-error {too few arguments to function 'svwrite_zt_u64'; expected 2, have 1} }   */
+   svwrite_zt_s64 (0);  /* { dg-error {too few arguments to function 'svwrite_zt_s64'; expected 2, have 1} }   */
+   svwrite_zt_bf16 (0); /* { dg-error {too few arguments to function 'svwrite_zt_bf16'; expected 2, have 1} }  */
+   svwrite_zt_f16 (0);  /* { dg-error {too few arguments to function 'svwrite_zt_f16'; expected 2, have 1} }   */
+   svwrite_zt_f32 (0);  /* { dg-error {too few arguments to function 'svwrite_zt_f32'; expected 2, have 1} }   */
+   svwrite_zt_f64 (0);  /* { dg-error {too few arguments to function 'svwrite_zt_f64'; expected 2, have 1} }   */
+ 
+   svwrite_zt_u8 (0, zt_u8, 0);     /* { dg-error {too many arguments to function 'svwrite_zt_u8'; expected 2, have 3} }    */
+   svwrite_zt_s8 (0, zt_s8, 0);     /* { dg-error {too many arguments to function 'svwrite_zt_s8'; expected 2, have 3} }    */
+   svwrite_zt_u16 (0, zt_u16, 0);   /* { dg-error {too many arguments to function 'svwrite_zt_u16'; expected 2, have 3} }   */
+   svwrite_zt_s16 (0, zt_s16, 0);   /* { dg-error {too many arguments to function 'svwrite_zt_s16'; expected 2, have 3} }   */
+   svwrite_zt_u32 (0, zt_u32, 0);   /* { dg-error {too many arguments to function 'svwrite_zt_u32'; expected 2, have 3} }   */
+   svwrite_zt_s32 (0, zt_s32, 0);   /* { dg-error {too many arguments to function 'svwrite_zt_s32'; expected 2, have 3} }   */
+   svwrite_zt_u64 (0, zt_u64, 0);   /* { dg-error {too many arguments to function 'svwrite_zt_u64'; expected 2, have 3} }   */
+   svwrite_zt_s64 (0, zt_s64, 0);   /* { dg-error {too many arguments to function 'svwrite_zt_s64'; expected 2, have 3} }   */
+   svwrite_zt_bf16 (0, zt_bf16, 0); /* { dg-error {too many arguments to function 'svwrite_zt_bf16'; expected 2, have 3} }  */
+   svwrite_zt_f16 (0, zt_f16, 0);   /* { dg-error {too many arguments to function 'svwrite_zt_f16'; expected 2, have 3} }   */
+   svwrite_zt_f32 (0, zt_f32, 0);   /* { dg-error {too many arguments to function 'svwrite_zt_f32'; expected 2, have 3} }   */
+   svwrite_zt_f64 (0, zt_f64, 0);   /* { dg-error {too many arguments to function 'svwrite_zt_f64'; expected 2, have 3} }   */
+ }
+ 
+ void
+ test_svwrite_zt_inferred_error_arg_count_mismatch (
+   svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+   svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+   svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+   svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+ {
+   svwrite_zt ();  /* { dg-error {too few arguments to function 'svwrite_zt'} }  */
+   svwrite_zt (0); /* { dg-error {too few arguments to function 'svwrite_zt'} }  */
+ 
+   svwrite_zt (0, zt_u8, 0);   /* { dg-error {too many arguments to function 'svwrite_zt'} }  */
+   svwrite_zt (0, zt_s8, 0);   /* { dg-error {too many arguments to function 'svwrite_zt'} }  */
+   svwrite_zt (0, zt_u16, 0);  /* { dg-error {too many arguments to function 'svwrite_zt'} }  */
+   svwrite_zt (0, zt_s16, 0);  /* { dg-error {too many arguments to function 'svwrite_zt'} }  */
+   svwrite_zt (0, zt_u32, 0);  /* { dg-error {too many arguments to function 'svwrite_zt'} }  */
+   svwrite_zt (0, zt_s32, 0);  /* { dg-error {too many arguments to function 'svwrite_zt'} }  */
+   svwrite_zt (0, zt_u64, 0);  /* { dg-error {too many arguments to function 'svwrite_zt'} }  */
+   svwrite_zt (0, zt_s64, 0);  /* { dg-error {too many arguments to function 'svwrite_zt'} }  */
+   svwrite_zt (0, zt_bf16, 0); /* { dg-error {too many arguments to function 'svwrite_zt'} }  */
+   svwrite_zt (0, zt_f16, 0);  /* { dg-error {too many arguments to function 'svwrite_zt'} }  */
+   svwrite_zt (0, zt_f32, 0);  /* { dg-error {too many arguments to function 'svwrite_zt'} }  */
+   svwrite_zt (0, zt_f64, 0);  /* { dg-error {too many arguments to function 'svwrite_zt'} }  */
+ }
+ 
+ void
+ test_svwrite_zt_explicit_error_arg_type_mismatch (
+   svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+   svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+   svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+   svfloat64_t zt_f64, svuint8x2_t zt_u8x2, svint8x2_t zt_s8x2,
+   svuint16x2_t zt_u16x2, svint16x2_t zt_s16x2, svuint32x2_t zt_u32x2,
+   svint32x2_t zt_s32x2, svuint64x2_t zt_u64x2, svint64x2_t zt_s64x2,
+   svbfloat16x2_t zt_bf16x2, svfloat16x2_t zt_f16x2, svfloat32x2_t zt_f32x2,
+   svfloat64x2_t zt_f64x2) __arm_streaming __arm_out ("zt0")
+ {
+   struct Foo { uint64_t val; } foo = {0};
+   svwrite_zt_u8 (foo, zt_u8);     /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_u8'} }    */
+   svwrite_zt_s8 (foo, zt_s8);     /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_s8'} }    */
+   svwrite_zt_u16 (foo, zt_u16);   /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_u16'} }   */
+   svwrite_zt_s16 (foo, zt_s16);   /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_s16'} }   */
+   svwrite_zt_u32 (foo, zt_u32);   /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_u32'} }   */
+   svwrite_zt_s32 (foo, zt_s32);   /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_s32'} }   */
+   svwrite_zt_u64 (foo, zt_u64);   /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_u64'} }   */
+   svwrite_zt_s64 (foo, zt_s64);   /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_s64'} }   */
+   svwrite_zt_bf16 (foo, zt_bf16); /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_bf16'} }  */
+   svwrite_zt_f16 (foo, zt_f16);   /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_f16'} }   */
+   svwrite_zt_f32 (foo, zt_f32);   /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_f32'} }   */
+   svwrite_zt_f64 (foo, zt_f64);   /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_f64'} }   */
+ 
+   svwrite_zt_u8 (0, zt_s8);    /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_u8'} }    */
+   svwrite_zt_s8 (0, zt_u8);    /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_s8'} }    */
+   svwrite_zt_u16 (0, zt_s16);  /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_u16'} }   */
+   svwrite_zt_s16 (0, zt_u16);  /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_s16'} }   */
+   svwrite_zt_u32 (0, zt_s32);  /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_u32'} }   */
+   svwrite_zt_s32 (0, zt_u32);  /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_s32'} }   */
+   svwrite_zt_u64 (0, zt_s64);  /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_u64'} }   */
+   svwrite_zt_s64 (0, zt_u64);  /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_s64'} }   */
+   svwrite_zt_bf16 (0, zt_f16); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_bf16'} }  */
+   svwrite_zt_f16 (0, zt_bf16); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_f16'} }   */
+   svwrite_zt_f32 (0, zt_f64);  /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_f32'} }   */
+   svwrite_zt_f64 (0, zt_f32);  /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_f64'} }   */
+ 
+   svwrite_zt_u8 (0, zt_u8x2);     /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_u8'} }    */
+   svwrite_zt_s8 (0, zt_s8x2);     /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_s8'} }    */
+   svwrite_zt_u16 (0, zt_u16x2);   /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_u16'} }   */
+   svwrite_zt_s16 (0, zt_s16x2);   /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_s16'} }   */
+   svwrite_zt_u32 (0, zt_u32x2);   /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_u32'} }   */
+   svwrite_zt_s32 (0, zt_s32x2);   /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_s32'} }   */
+   svwrite_zt_u64 (0, zt_u64x2);   /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_u64'} }   */
+   svwrite_zt_s64 (0, zt_s64x2);   /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_s64'} }   */
+   svwrite_zt_bf16 (0, zt_bf16x2); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_bf16'} }  */
+   svwrite_zt_f16 (0, zt_f16x2);   /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_f16'} }   */
+   svwrite_zt_f32 (0, zt_f32x2);   /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_f32'} }   */
+   svwrite_zt_f64 (0, zt_f64x2);   /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_f64'} }   */
+ }
+ 
+ void
+ test_svwrite_zt_inferred_error_arg_type_mismatch (
+   svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+   svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+   svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+   svfloat64_t zt_f64, svuint8x2_t zt_u8x2) __arm_streaming __arm_out ("zt0")
+ {
+   struct Foo { uint64_t val; } foo = {0};
+   svwrite_zt (foo, zt_u8); /* { dg-error {passing 'struct Foo' to argument 1 of 'svwrite_zt', which expects 'uint64_t'} } */
+   svwrite_zt (0, zt_u8x2); /* { dg-error {passing 'svuint8x2_t' to argument 2 of 'svwrite_zt', which expects a single SVE vector rather than a tuple} } */
+ }
+ 
+ void
+ test_svwrite_zt_explicit_error_zt0_not_immediate (
+   uint64_t zt0, svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16,
+   svint16_t zt_s16, svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64,
+   svint64_t zt_s64, svbfloat16_t zt_bf16, svfloat16_t zt_f16,
+   svfloat32_t zt_f32, svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+ {
+   svwrite_zt_u8 (zt0, zt_u8);     /* { dg-error {argument 1 of 'svwrite_zt_u8' must be an integer constant expression} }    */
+   svwrite_zt_s8 (zt0, zt_s8);     /* { dg-error {argument 1 of 'svwrite_zt_s8' must be an integer constant expression} }    */
+   svwrite_zt_u16 (zt0, zt_u16);   /* { dg-error {argument 1 of 'svwrite_zt_u16' must be an integer constant expression} }   */
+   svwrite_zt_s16 (zt0, zt_s16);   /* { dg-error {argument 1 of 'svwrite_zt_s16' must be an integer constant expression} }   */
+   svwrite_zt_u32 (zt0, zt_u32);   /* { dg-error {argument 1 of 'svwrite_zt_u32' must be an integer constant expression} }   */
+   svwrite_zt_s32 (zt0, zt_s32);   /* { dg-error {argument 1 of 'svwrite_zt_s32' must be an integer constant expression} }   */
+   svwrite_zt_u64 (zt0, zt_u64);   /* { dg-error {argument 1 of 'svwrite_zt_u64' must be an integer constant expression} }   */
+   svwrite_zt_s64 (zt0, zt_s64);   /* { dg-error {argument 1 of 'svwrite_zt_s64' must be an integer constant expression} }   */
+   svwrite_zt_bf16 (zt0, zt_bf16); /* { dg-error {argument 1 of 'svwrite_zt_bf16' must be an integer constant expression} }  */
+   svwrite_zt_f16 (zt0, zt_f16);   /* { dg-error {argument 1 of 'svwrite_zt_f16' must be an integer constant expression} }   */
+   svwrite_zt_f32 (zt0, zt_f32);   /* { dg-error {argument 1 of 'svwrite_zt_f32' must be an integer constant expression} }   */
+   svwrite_zt_f64 (zt0, zt_f64);   /* { dg-error {argument 1 of 'svwrite_zt_f64' must be an integer constant expression} }   */
+ }
+ 
+ void
+ test_svwrite_zt_inferred_error_zt0_not_immediate (
+   uint64_t zt0, svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16,
+   svint16_t zt_s16, svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64,
+   svint64_t zt_s64, svbfloat16_t zt_bf16, svfloat16_t zt_f16,
+   svfloat32_t zt_f32, svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+ {
+   svwrite_zt (zt0, zt_u8);   /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} }  */
+   svwrite_zt (zt0, zt_s8);   /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} }  */
+   svwrite_zt (zt0, zt_u16);  /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} }  */
+   svwrite_zt (zt0, zt_s16);  /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} }  */
+   svwrite_zt (zt0, zt_u32);  /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} }  */
+   svwrite_zt (zt0, zt_s32);  /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} }  */
+   svwrite_zt (zt0, zt_u64);  /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} }  */
+   svwrite_zt (zt0, zt_s64);  /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} }  */
+   svwrite_zt (zt0, zt_bf16); /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} }  */
+   svwrite_zt (zt0, zt_f16);  /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} }  */
+   svwrite_zt (zt0, zt_f32);  /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} }  */
+   svwrite_zt (zt0, zt_f64);  /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} }  */
+ }
+ 
+ void
+ test_svwrite_zt_explicit_error_zt0_not_in_range (
+   uint64_t zt0, svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16,
+   svint16_t zt_s16, svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64,
+   svint64_t zt_s64, svbfloat16_t zt_bf16, svfloat16_t zt_f16,
+   svfloat32_t zt_f32, svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+ {
+   svwrite_zt_u8 (1, zt_u8);      /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_u8', which expects the value 0} }    */
+   svwrite_zt_s8 (1, zt_s8);      /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_s8', which expects the value 0} }    */
+   svwrite_zt_u16 (1, zt_u16);    /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_u16', which expects the value 0} }   */
+   svwrite_zt_s16 (1, zt_s16);    /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_s16', which expects the value 0} }   */
+   svwrite_zt_u32 (1, zt_u32);    /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_u32', which expects the value 0} }   */
+   svwrite_zt_s32 (1, zt_s32);    /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_s32', which expects the value 0} }   */
+   svwrite_zt_u64 (1, zt_u64);    /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_u64', which expects the value 0} }   */
+   svwrite_zt_s64 (1, zt_s64);    /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_s64', which expects the value 0} }   */
+   svwrite_zt_bf16 (1, zt_bf16);  /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_bf16', which expects the value 0} }  */
+   svwrite_zt_f16 (1, zt_f16);    /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_f16', which expects the value 0} }   */
+   svwrite_zt_f32 (1, zt_f32);    /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_f32', which expects the value 0} }   */
+   svwrite_zt_f64 (1, zt_f64);    /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_f64', which expects the value 0} }   */
+ 
+   svwrite_zt_u8 (-1, zt_u8);      /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_u8', which expects the value 0} }    */
+   svwrite_zt_s8 (-1, zt_s8);      /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_s8', which expects the value 0} }    */
+   svwrite_zt_u16 (-1, zt_u16);    /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_u16', which expects the value 0} }   */
+   svwrite_zt_s16 (-1, zt_s16);    /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_s16', which expects the value 0} }   */
+   svwrite_zt_u32 (-1, zt_u32);    /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_u32', which expects the value 0} }   */
+   svwrite_zt_s32 (-1, zt_s32);    /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_s32', which expects the value 0} }   */
+   svwrite_zt_u64 (-1, zt_u64);    /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_u64', which expects the value 0} }   */
+   svwrite_zt_s64 (-1, zt_s64);    /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_s64', which expects the value 0} }   */
+   svwrite_zt_bf16 (-1, zt_bf16);  /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_bf16', which expects the value 0} }  */
+   svwrite_zt_f16 (-1, zt_f16);    /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_f16', which expects the value 0} }   */
+   svwrite_zt_f32 (-1, zt_f32);    /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_f32', which expects the value 0} }   */
+   svwrite_zt_f64 (-1, zt_f64);    /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_f64', which expects the value 0} }   */
+ }
+ 
+ void
+ test_svwrite_zt_inferred_error_zt0_not_in_range (
+   uint64_t zt0, svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16,
+   svint16_t zt_s16, svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64,
+   svint64_t zt_s64, svbfloat16_t zt_bf16, svfloat16_t zt_f16,
+   svfloat32_t zt_f32, svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+ {
+   svwrite_zt (1, zt_u8);   /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (1, zt_s8);   /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (1, zt_u16);  /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (1, zt_s16);  /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (1, zt_u32);  /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (1, zt_s32);  /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (1, zt_u64);  /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (1, zt_s64);  /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (1, zt_bf16); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (1, zt_f16);  /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (1, zt_f32);  /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (1, zt_f64);  /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+ 
+   svwrite_zt (-1, zt_u8);   /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (-1, zt_s8);   /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (-1, zt_u16);  /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (-1, zt_s16);  /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (-1, zt_u32);  /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (-1, zt_s32);  /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (-1, zt_u64);  /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (-1, zt_s64);  /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (-1, zt_bf16); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (-1, zt_f16);  /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (-1, zt_f32);  /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+   svwrite_zt (-1, zt_f64);  /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} }  */
+ }
+ 
+ #pragma GCC reset_options
+ #pragma GCC target("+sve2,+sme2")
+ void
+ test_svwrite_zt_feature_not_enabled (svuint8_t zt_u8) __arm_streaming __arm_out ("zt0")
+ {
+   // GCC only complains for the first such instance, so only one test here.
+   svwrite_zt_u8 (0, zt_u8); /* { dg-error {ACLE function 'svwrite_zt_u8' requires ISA extension 'sme-lutv2'} } */
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/torture/pr121772.c gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/torture/pr121772.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/aarch64/torture/pr121772.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/aarch64/torture/pr121772.c	Sun Sep 21 22:33:06 2025
***************
*** 0 ****
--- 1,5 ----
+ /* { dg-do compile } */
+ #include <arm_neon.h>
+ int16_t f(int16x4_t b) {
+   return vaddvq_s16(vcombine_s16(b, vdup_n_s16 (0)));
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/arm/fp16-aapcs-1.c gcc-16-20250921/gcc/testsuite/gcc.target/arm/fp16-aapcs-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/arm/fp16-aapcs-1.c	Sun Sep 14 22:32:29 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/arm/fp16-aapcs-1.c	Thu Jan  1 00:00:00 1970
***************
*** 1,65 ****
- /* { dg-do compile }  */
- /* { dg-require-effective-target arm_hard_vfp_ok }  */
- /* { dg-require-effective-target arm_fp16_ok } */
- /* { dg-options "-O2" }  */
- /* { dg-add-options arm_fp16_ieee } */
- /* { dg-final { check-function-bodies "**" "" "" } } */
- 
- /* Test __fp16 arguments and return value in registers (hard-float).  */
- 
- void
- swap (__fp16, __fp16);
- 
- /*
- ** F:
- ** ...
- ** (
- 
- Below block is for non-armv8.1
- ** (
- **	vmov\.f32	(s[3-9]|s1[0-5]), s0
- ** ...
- **	vmov\.f32	s0, s1
- ** ...
- **	vmov\.f32	s1, \1
- ** |
- **	vmov\.f32	(s[3-9]|s1[0-5]), s1
- ** ...
- **	vmov\.f32	s1, s0
- ** ...
- **	vmov\.f32	s0, \2
- ** )
- **	vstr\.32	s2, \[sp, #4\]	@ int
- **	bl	swap
- **	vldr\.32	s2, \[sp, #4\]	@ int
- **	vmov\.f32	s0, s2
- 
- ** |
- 
- Below block is for armv8.1
- ** (
- **	vmov	(s[3-9]|s1[0-5]), s0	@ __fp16
- ** ...
- **	vmov	s0, s1	@ __fp16
- ** ...
- **	vmov	s1, \3	@ __fp16
- ** |
- **	vmov	(s[3-9]|s1[0-5]), s1	@ __fp16
- ** ...
- **	vmov	s1, s0	@ __fp16
- ** ...
- **	vmov	s0, \4	@ __fp16
- ** )
- **	vstr\.32	s2, \[sp, #4\]	@ int
- **	bl	swap
- **	vldr\.16	s0, \[sp, #4\]
- 
- ** )
- ** ...
- */
- __fp16
- F (__fp16 a, __fp16 b, __fp16 c)
- {
-   swap (b, a);
-   return c;
- }
--- 0 ----
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/arm/fp16-aapcs-2.c gcc-16-20250921/gcc/testsuite/gcc.target/arm/fp16-aapcs-2.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/arm/fp16-aapcs-2.c	Sun Sep 14 22:32:29 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/arm/fp16-aapcs-2.c	Thu Jan  1 00:00:00 1970
***************
*** 1,44 ****
- /* { dg-do compile }  */
- /* { dg-require-effective-target arm_fp16_ok } */
- /* { dg-options "-mfloat-abi=softfp -O2 -mno-long-calls" }  */
- /* { dg-add-options arm_fp16_ieee } */
- /* { dg-skip-if "incompatible float-abi" { arm*-*-* } { "-mfloat-abi=hard" } } */
- /* { dg-final { check-function-bodies "**" "" "" } } */
- 
- /* Test __fp16 arguments and return value in registers (softfp).  */
- 
- void
- swap (__fp16, __fp16);
- 
- /*
- ** F:
- ** ...
- ** (
- **	mov	r3, r0	@ __fp16
- ** ...
- **	mov	r0, r1	@ __fp16
- ** ...
- **	mov	r1, r3	@ __fp16
- ** |
- **	mov	r3, r1	@ __fp16
- ** ...
- **	mov	r1, r0	@ __fp16
- ** ...
- **	mov	r0, r3	@ __fp16
- ** )
- ** ...
- */
- /*
- ** F: { target arm_little_endian }
- ** ...
- **	str	r2, \[sp, #4\]
- **	bl	swap
- **	ldrh	r0, \[sp, #4\]	@ __fp16
- ** ...
- */
- __fp16
- F (__fp16 a, __fp16 b, __fp16 c)
- {
-   swap (b, a);
-   return c;
- }
--- 0 ----
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/arm/fp16-aapcs-3.c gcc-16-20250921/gcc/testsuite/gcc.target/arm/fp16-aapcs-3.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/arm/fp16-aapcs-3.c	Sun Sep 14 22:32:29 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/arm/fp16-aapcs-3.c	Thu Jan  1 00:00:00 1970
***************
*** 1,65 ****
- /* { dg-do compile }  */
- /* { dg-require-effective-target arm_hard_vfp_ok }  */
- /* { dg-require-effective-target arm_fp16_alternative_ok } */
- /* { dg-options "-O2" }  */
- /* { dg-add-options arm_fp16_alternative } */
- /* { dg-final { check-function-bodies "**" "" "" } } */
- 
- /* Test __fp16 arguments and return value in registers (hard-float).  */
- 
- void
- swap (__fp16, __fp16);
- 
- /*
- ** F:
- ** ...
- ** (
- 
- Below block is for non-armv8.1
- ** (
- **	vmov\.f32	(s[3-9]|s1[0-5]), s0
- ** ...
- **	vmov\.f32	s0, s1
- ** ...
- **	vmov\.f32	s1, \1
- ** |
- **	vmov\.f32	(s[3-9]|s1[0-5]), s1
- ** ...
- **	vmov\.f32	s1, s0
- ** ...
- **	vmov\.f32	s0, \2
- ** )
- **	vstr\.32	s2, \[sp, #4\]	@ int
- **	bl	swap
- **	vldr\.32	s2, \[sp, #4\]	@ int
- **	vmov\.f32	s0, s2
- 
- ** |
- 
- Below block is for armv8.1
- ** (
- **	vmov	(s[3-9]|s1[0-5]), s0
- ** ...
- **	vmov	s0, s1
- ** ...
- **	vmov	s1, \3
- ** |
- **	vmov	(s[3-9]|s1[0-5]), s1
- ** ...
- **	vmov	s1, s0
- ** ...
- **	vmov	s0, \4
- ** )
- **	vstr\.32	s2, \[sp, #4\]	@ int
- **	bl	swap
- **	vldr\.16	s0, \[sp, #4\]
- 
- ** )
- ** ...
- */
- __fp16
- F (__fp16 a, __fp16 b, __fp16 c)
- {
-   swap (b, a);
-   return c;
- }
--- 0 ----
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/arm/fp16-aapcs-4.c gcc-16-20250921/gcc/testsuite/gcc.target/arm/fp16-aapcs-4.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/arm/fp16-aapcs-4.c	Sun Sep 14 22:32:29 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/arm/fp16-aapcs-4.c	Thu Jan  1 00:00:00 1970
***************
*** 1,44 ****
- /* { dg-do compile }  */
- /* { dg-require-effective-target arm_fp16_alternative_ok } */
- /* { dg-options "-mfloat-abi=softfp -O2" }  */
- /* { dg-add-options arm_fp16_alternative } */
- /* { dg-skip-if "incompatible float-abi" { arm*-*-* } { "-mfloat-abi=hard" } } */
- /* { dg-final { check-function-bodies "**" "" "" } } */
- 
- /* Test __fp16 arguments and return value in registers (softfp).  */
- 
- void
- swap (__fp16, __fp16);
- 
- /*
- ** F:
- ** ...
- ** (
- **	mov	r3, r0	@ __fp16
- ** ...
- **	mov	r0, r1	@ __fp16
- ** ...
- **	mov	r1, r3	@ __fp16
- ** |
- **	mov	r3, r1	@ __fp16
- ** ...
- **	mov	r1, r0	@ __fp16
- ** ...
- **	mov	r0, r3	@ __fp16
- ** )
- ** ...
- */
- /*
- ** F: { target arm_little_endian }
- ** ...
- **	str	r2, \[sp, #4\]
- **	bl	swap
- **	ldrh	r0, \[sp, #4\]	@ __fp16
- ** ...
- */
- __fp16
- F (__fp16 a, __fp16 b, __fp16 c)
- {
-   swap (b, a);
-   return c;
- }
--- 0 ----
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/arm/fp16-aapcs.c gcc-16-20250921/gcc/testsuite/gcc.target/arm/fp16-aapcs.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/arm/fp16-aapcs.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/arm/fp16-aapcs.c	Sun Sep 21 22:33:06 2025
***************
*** 0 ****
--- 1,24 ----
+ /* { dg-do compile }  */
+ /* { dg-require-effective-target arm_fp16_alternative_ok } */
+ /* { dg-options "-O2" }  */
+ /* { dg-add-options arm_fp16_alternative } */
+ /* { dg-final { check-function-bodies "**" "" "" } } */
+ 
+ /* Test __fp16 arguments and return value in registers.  */
+ 
+ __fp16 f();
+ void g(__fp16);
+ void h();
+ 
+ /*
+ ** test:
+ ** ...
+ **	bl	f
+ **	bl	g
+ ** ...
+ */
+ int test()
+ {
+     g(f());
+     h();
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512bw-vpackssdw-1.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512bw-vpackssdw-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512bw-vpackssdw-1.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512bw-vpackssdw-1.c	Sun Sep 21 22:33:09 2025
***************
*** 4,11 ****
  /* { dg-final { scan-assembler-times "vpackssdw\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpackssdw\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpackssdw\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpackssdw\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpackssdw\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpackssdw\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  
  
--- 4,11 ----
  /* { dg-final { scan-assembler-times "vpackssdw\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpackssdw\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpackssdw\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpackssdw\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpackssdw\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpackssdw\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  
  
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512bw-vpacksswb-1.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512bw-vpacksswb-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512bw-vpacksswb-1.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512bw-vpacksswb-1.c	Sun Sep 21 22:33:09 2025
***************
*** 4,11 ****
  /* { dg-final { scan-assembler-times "vpacksswb\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpacksswb\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpacksswb\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpacksswb\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpacksswb\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpacksswb\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  
  
--- 4,11 ----
  /* { dg-final { scan-assembler-times "vpacksswb\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpacksswb\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpacksswb\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpacksswb\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpacksswb\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpacksswb\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  
  
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512bw-vpackusdw-1.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512bw-vpackusdw-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512bw-vpackusdw-1.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512bw-vpackusdw-1.c	Sun Sep 21 22:33:09 2025
***************
*** 4,11 ****
  /* { dg-final { scan-assembler-times "vpackusdw\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpackusdw\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpackusdw\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpackusdw\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpackusdw\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpackusdw\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  
  
--- 4,11 ----
  /* { dg-final { scan-assembler-times "vpackusdw\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpackusdw\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpackusdw\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpackusdw\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpackusdw\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpackusdw\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  
  
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512bw-vpackuswb-1.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512bw-vpackuswb-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512bw-vpackuswb-1.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512bw-vpackuswb-1.c	Sun Sep 21 22:33:09 2025
***************
*** 4,11 ****
  /* { dg-final { scan-assembler-times "vpackuswb\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpackuswb\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpackuswb\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpackuswb\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpackuswb\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpackuswb\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  
  
--- 4,11 ----
  /* { dg-final { scan-assembler-times "vpackuswb\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpackuswb\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpackuswb\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpackuswb\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpackuswb\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpackuswb\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  
  
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512bw-vpermw-1.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512bw-vpermw-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512bw-vpermw-1.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512bw-vpermw-1.c	Sun Sep 21 22:33:09 2025
***************
*** 6,14 ****
  /* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)"  1 } } */
  /* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)"  1 } } */
! /* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
  
  #include <immintrin.h>
  
--- 6,14 ----
  /* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)"  1 } } */
  /* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)"  1 } } */
! /* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpermw\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
  
  #include <immintrin.h>
  
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512bw-vpmovuswb-2.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512bw-vpmovuswb-2.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512bw-vpmovuswb-2.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512bw-vpmovuswb-2.c	Sun Sep 21 22:33:09 2025
*************** TEST (void)
*** 27,33 ****
    UNION_TYPE (AVX512F_LEN, i_w) src;
    MASK_TYPE mask = MASK_VALUE;
    unsigned char res_ref[32];
!   unsigned char res_ref2[SIZE];
  
    for (i = 0; i < SIZE; i++)
      {
--- 27,33 ----
    UNION_TYPE (AVX512F_LEN, i_w) src;
    MASK_TYPE mask = MASK_VALUE;
    unsigned char res_ref[32];
!   unsigned char res_ref2[SIZE_HALF];
  
    for (i = 0; i < SIZE; i++)
      {
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512bw-vpmovwb-2.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512bw-vpmovwb-2.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512bw-vpmovwb-2.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512bw-vpmovwb-2.c	Sun Sep 21 22:33:09 2025
*************** TEST (void)
*** 28,34 ****
    UNION_TYPE (AVX512F_LEN, i_w) src;
    MASK_TYPE mask = MASK_VALUE;
    char res_ref[32];
!   char res_ref2[SIZE];
  
    sign = -1;
    for (i = 0; i < SIZE; i++)
--- 28,34 ----
    UNION_TYPE (AVX512F_LEN, i_w) src;
    MASK_TYPE mask = MASK_VALUE;
    char res_ref[32];
!   char res_ref2[SIZE_HALF];
  
    sign = -1;
    for (i = 0; i < SIZE; i++)
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhw-1.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhw-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhw-1.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512bw-vpmulhw-1.c	Sun Sep 21 22:33:09 2025
***************
*** 3,12 ****
  /* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\[^\n\]*%zmm\[0-9\]+\[^\n\]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)"  1 } } */
  /* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\[^\n\]*%zmm\[0-9\]+\[^\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\[^\n\]*%zmm\[0-9\]+\[^\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
- /* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\[^\n\]*%xmm\[0-9\]+\[^\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
- /* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\[^\n\]*%xmm\[0-9\]+\[^\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
- /* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\[^\n\]*%ymm\[0-9\]+\[^\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\[^\n\]*%ymm\[0-9\]+\[^\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  
  #include <immintrin.h>
  
--- 3,12 ----
  /* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\[^\n\]*%zmm\[0-9\]+\[^\n\]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)"  1 } } */
  /* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\[^\n\]*%zmm\[0-9\]+\[^\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\[^\n\]*%zmm\[0-9\]+\[^\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\[^\n\]*%ymm\[0-9\]+\[^\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
+ /* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\[^\n\]*%ymm\[0-9\]+\[^\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
+ /* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\[^\n\]*%xmm\[0-9\]+\[^\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
+ /* { dg-final { scan-assembler-times "vpmulhw\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\[^\n\]*%xmm\[0-9\]+\[^\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
  
  #include <immintrin.h>
  
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512f-vec-init.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512f-vec-init.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512f-vec-init.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512f-vec-init.c	Sun Sep 21 22:33:12 2025
***************
*** 4,10 ****
  /* { dg-final { scan-assembler-times "vpbroadcastd\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpbroadcastd\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpbroadcastq\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
- /* { dg-final { scan-assembler-times "vpbroadcastq\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpbroadcastq\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpbroadcastb\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)"  2 } } */
  /* { dg-final { scan-assembler-times "vpbroadcastb\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)"  1 } } */
--- 4,9 ----
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512fp16-13.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512fp16-13.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512fp16-13.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512fp16-13.c	Sun Sep 21 22:33:12 2025
*************** load512_ph (void const *p)
*** 36,42 ****
    return _mm512_load_ph (p);
  }
  
! /* { dg-final { scan-assembler-times "vmovdqa64\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\[^\n\]*\\)" 1 } } */
  
  __m256h
  __attribute__ ((noinline, noclone))
--- 36,42 ----
    return _mm512_load_ph (p);
  }
  
! /* { dg-final { scan-assembler-times "vmovdqa64\[ \\t\]*\[^,\]*,\[^\{\n\]*%zmm\[0-9\]" 1 } } */
  
  __m256h
  __attribute__ ((noinline, noclone))
*************** load256_ph (void const *p)
*** 45,51 ****
    return _mm256_load_ph (p);
  }
  
! /* { dg-final { scan-assembler-times "vmovdqa\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\[^\n\]*\\)" 1 } } */
  
  __m128h
  __attribute__ ((noinline, noclone))
--- 45,51 ----
    return _mm256_load_ph (p);
  }
  
! /* { dg-final { scan-assembler-times "vmovdqa\[ \\t\]*\[^,\]*,\[^\{\n\]*%ymm\[0-9\]" 1 } } */
  
  __m128h
  __attribute__ ((noinline, noclone))
*************** load_ph (void const *p)
*** 53,59 ****
  {
    return _mm_load_ph (p);
  }
! /* { dg-final { scan-assembler-times "vmovdqa\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\[^\n\]*\\)" 1 } } */
  
  __m512h
  __attribute__ ((noinline, noclone))
--- 53,60 ----
  {
    return _mm_load_ph (p);
  }
! 
! /* { dg-final { scan-assembler-times "vmovdqa\[ \\t\]*\[^,\]*,\[^\{\n\]*%xmm\[0-9\]" 1 } } */
  
  __m512h
  __attribute__ ((noinline, noclone))
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512fp16-conjugation-1.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512fp16-conjugation-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512fp16-conjugation-1.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512fp16-conjugation-1.c	Sun Sep 21 22:33:12 2025
***************
*** 1,5 ****
--- 1,9 ----
  /* { dg-do compile } */
  /* { dg-options "-O2 -mavx512fp16" } */
+ /* { dg-final { scan-assembler-times "vpxord\[^\n\]*%zmm\[0-9\]+" 3 } } */
+ /* { dg-final { scan-assembler-times "kmovw\[^\n\]*%k\[1-9\]+" 2 } } */
+ /* { dg-final { scan-assembler-times "vmovaps\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
+ /* { dg-final { scan-assembler-times "vmovaps\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
  
  #include <immintrin.h>
  __m512h
*************** test_mm512_conj_pch (__m512h __A)
*** 9,16 ****
    return _mm512_conj_pch (__A);
  }
  
- /* { dg-final { scan-assembler-times "vpxord\[^\n\]*%zmm\[0-9\]+" 3 } } */
- 
  __m512h
  __attribute__ ((noinline, noclone))
  test_mm512_mask_conj_pch (__m512h __W, __mmask16 __U, __m512h __A)
--- 13,18 ----
*************** test_mm512_mask_conj_pch (__m512h __W, _
*** 18,27 ****
    return _mm512_mask_conj_pch (__W, __U, __A);
  }
  
- /* { dg-final { scan-assembler-times "vpxord\[^\n\]*%zmm\[0-9\]+" 3 } } */
- /* { dg-final { scan-assembler-times "kmovw\[^\n\]*%k\[1-9\]+" 2 } } */
- /* { dg-final { scan-assembler-times "vmovaps\[^\n]" 2 } } */
- 
  __m512h
  __attribute__ ((noinline, noclone))
  test_mm512_maskz_conj_pch (__mmask16 __U, __m512h __A)
--- 20,25 ----
*************** test_mm512_maskz_conj_pch (__mmask16 __U
*** 29,34 ****
     return _mm512_maskz_conj_pch (__U, __A);
  }
  
- /* { dg-final { scan-assembler-times "vpxord\[^\n\]*%zmm\[0-9\]+" 3 } } */
- /* { dg-final { scan-assembler-times "kmovw\[^\n\]*%k\[1-9\]+" 2 } } */
- /* { dg-final { scan-assembler-times "vmovaps\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
--- 27,29 ----
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512fp16vl-conjugation-1.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512fp16vl-conjugation-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512fp16vl-conjugation-1.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512fp16vl-conjugation-1.c	Sun Sep 21 22:33:13 2025
***************
*** 1,5 ****
--- 1,11 ----
  /* { dg-do compile } */
  /* { dg-options "-O2 -mavx512fp16 -mavx512vl -mavx512dq" } */
+ /* { dg-final { scan-assembler-times "vpxor\[^\n\]*%ymm\[0-9\]+" 3 } } */
+ /* { dg-final { scan-assembler-times "vmovaps\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
+ /* { dg-final { scan-assembler-times "vmovaps\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
+ /* { dg-final { scan-assembler-times "vpxor\[^\n\]*%xmm\[0-9\]+" 3  } } */
+ /* { dg-final { scan-assembler-times "vmovaps\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
+ /* { dg-final { scan-assembler-times "vmovaps\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
  
  #include <immintrin.h>
  __m256h
*************** test_mm256_conj_pch (__m256h __A)
*** 9,16 ****
    return _mm256_conj_pch (__A);
  }
  
- /* { dg-final { scan-assembler-times "vpxor\[^\n\]*%ymm\[0-9\]+" 3 } } */
- 
  __m128h
  __attribute__ ((noinline, noclone))
  test_mm_conj_pch (__m128h __A)
--- 15,20 ----
*************** test_mm_conj_pch (__m128h __A)
*** 18,25 ****
    return _mm_conj_pch (__A);
  }
  
- /* { dg-final { scan-assembler-times "vpxor\[^\n\]*%xmm\[0-9\]+" 3  } } */
- 
  __m256h
  __attribute__ ((noinline, noclone))
  test_mm256_mask_conj_pch (__m256h __W, __mmask8 __U, __m256h __A)
--- 22,27 ----
*************** test_mm256_mask_conj_pch (__m256h __W, _
*** 27,34 ****
    return _mm256_mask_conj_pch (__W, __U, __A);
  }
  
- /* { dg-final { scan-assembler-times "vmovaps\[^\n\]*%ymm\[0-9\]+" 2 } } */
- 
  __m128h
  __attribute__ ((noinline, noclone))
  test_mm_mask_conj_pch (__m128h __W, __mmask8 __U, __m128h __A)
--- 29,34 ----
*************** test_mm_mask_conj_pch (__m128h __W, __mm
*** 36,55 ****
    return _mm_mask_conj_pch (__W, __U, __A);
  }
  
- /* { dg-final { scan-assembler-times "vmovaps\[^\n\]*%xmm\[0-9\]+" 2 } } */
- 
  __m256h
  __attribute__ ((noinline, noclone))
  test_mm256_maskz_conj_pch (__mmask8 __U, __m256h __A)
  {
     return _mm256_maskz_conj_pch (__U, __A);
  }
- /* { dg-final { scan-assembler-times "vmovaps\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
  
  __m128h
  __attribute__ ((noinline, noclone))
  test_mm_maskz_conj_pch (__mmask8 __U, __m128h __A) {
     return _mm_maskz_conj_pch (__U, __A);
  }
- 
- /* { dg-final { scan-assembler-times "vmovaps\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
--- 36,50 ----
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512vbmi-vpermb-1.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512vbmi-vpermb-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512vbmi-vpermb-1.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512vbmi-vpermb-1.c	Sun Sep 21 22:33:13 2025
***************
*** 6,14 ****
  /* { dg-final { scan-assembler-times "vpermb\[ \\t\]+\[^\n\]*%ymm\[0-9\]+\[^\{\]" 3 } } */
  /* { dg-final { scan-assembler-times "vpermb\[ \\t\]+\[^\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}\[^\{\]" 1 } } */
  /* { dg-final { scan-assembler-times "vpermb\[ \\t\]+\[^\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}\{z\}" 1 } } */
! /* { dg-final { scan-assembler-times "vpermb\[ \\t\]+\[^\n\]*%zmm\[0-9\]+\[^\{\]" 3 } } */
! /* { dg-final { scan-assembler-times "vpermb\[ \\t\]+\[^\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}\[^\{\]" 1 } } */
! /* { dg-final { scan-assembler-times "vpermb\[ \\t\]+\[^\n\]*%zmm\[0-9\]+\{%k\[1-7\]\}\{z\}" 1 } } */
  
  #include <immintrin.h>
  
--- 6,14 ----
  /* { dg-final { scan-assembler-times "vpermb\[ \\t\]+\[^\n\]*%ymm\[0-9\]+\[^\{\]" 3 } } */
  /* { dg-final { scan-assembler-times "vpermb\[ \\t\]+\[^\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}\[^\{\]" 1 } } */
  /* { dg-final { scan-assembler-times "vpermb\[ \\t\]+\[^\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}\{z\}" 1 } } */
! /* { dg-final { scan-assembler-times "vpermb\[ \\t\]+\[^\n\]*%xmm\[0-9\]+\[^\{\]" 3 } } */
! /* { dg-final { scan-assembler-times "vpermb\[ \\t\]+\[^\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}\[^\{\]" 1 } } */
! /* { dg-final { scan-assembler-times "vpermb\[ \\t\]+\[^\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}\{z\}" 1 } } */
  
  #include <immintrin.h>
  
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2ps-1.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2ps-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2ps-1.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512vl-vcvtpd2ps-1.c	Sun Sep 21 22:33:13 2025
***************
*** 1,9 ****
  /* { dg-do compile } */
  /* { dg-options "-O2 -mavx512vl" } */
! /* { dg-final { scan-assembler-times "vcvtpd2psy\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vcvtpd2psy\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vcvtpd2psx\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vcvtpd2psx\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  
  #include <immintrin.h>
  
--- 1,9 ----
  /* { dg-do compile } */
  /* { dg-options "-O2 -mavx512vl" } */
! /* { dg-final { scan-assembler-times "vcvtpd2psy\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\[^\n\r]*%xmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vcvtpd2psy\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\[^\n\r]*%xmm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vcvtpd2psx\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\[^\n\r]*%xmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vcvtpd2psx\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\[^\n\r]*%xmm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
  
  #include <immintrin.h>
  
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512vl-vinsert-1.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512vl-vinsert-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512vl-vinsert-1.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512vl-vinsert-1.c	Sun Sep 21 22:33:13 2025
*************** f8 (V4 x, double y)
*** 95,98 ****
  /* { dg-final { scan-assembler-not "vinserti64x2" } } */
  /* { dg-final { scan-assembler-not "vinsertf64x2" } } */
  /* { dg-final { scan-assembler-not "vextracti64x2" } } */
! /* { dg-final { scan-assembler-not "vextracti64x2" } } */
--- 95,98 ----
  /* { dg-final { scan-assembler-not "vinserti64x2" } } */
  /* { dg-final { scan-assembler-not "vinsertf64x2" } } */
  /* { dg-final { scan-assembler-not "vextracti64x2" } } */
! /* { dg-final { scan-assembler-not "vextractf64x2" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512vl-vpmulld-1.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512vl-vpmulld-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512vl-vpmulld-1.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512vl-vpmulld-1.c	Sun Sep 21 22:33:13 2025
***************
*** 1,8 ****
  /* { dg-do compile } */
  /* { dg-options "-mavx512vl -O2" } */
  /* { dg-final { scan-assembler-times "vpmulld\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpmulld\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpmulld\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpmulld\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  
  #include <immintrin.h>
--- 1,8 ----
  /* { dg-do compile } */
  /* { dg-options "-mavx512vl -O2" } */
  /* { dg-final { scan-assembler-times "vpmulld\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpmulld\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vpmulld\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vpmulld\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\{%k\[1-7\]\}{z}(?:\n|\[ \\t\]+#)" 1 } } */
  
  #include <immintrin.h>
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512vl-vptestmd-1.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512vl-vptestmd-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx512vl-vptestmd-1.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx512vl-vptestmd-1.c	Sun Sep 21 22:33:13 2025
***************
*** 1,8 ****
  /* { dg-do compile } */
  /* { dg-options "-mavx512vl -O2" } */
  /* { dg-final { scan-assembler-times "vptestmd\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\[^\n\]*%k\[0-7\](?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vptestmd\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\[^\n\]*%k\[0-7\](?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vptestmd\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\[^\n\]*%k\[0-7\]\{%*k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vptestmd\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\[^\n\]*%k\[0-7\]\{%*k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  
  #include <immintrin.h>
--- 1,8 ----
  /* { dg-do compile } */
  /* { dg-options "-mavx512vl -O2" } */
  /* { dg-final { scan-assembler-times "vptestmd\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\[^\n\]*%k\[0-7\](?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vptestmd\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\[^\n\]*%k\[0-7\]\{%*k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vptestmd\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\[^\n\]*%k\[0-7\](?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vptestmd\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\[^\n\]*%k\[0-7\]\{%*k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  
  #include <immintrin.h>
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx_vbroadcastf128.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx_vbroadcastf128.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/avx_vbroadcastf128.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/avx_vbroadcastf128.c	Sun Sep 21 22:33:13 2025
***************
*** 0 ****
--- 1,17 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=x86-64-v3 -O3" } */
+ /* { dg-final { scan-assembler-not "vpermpd"} } */
+ /* { dg-final { scan-assembler {(?n)vbroadcastf(?:128|64x2)} } } */
+ 
+ void
+ foo (double* __restrict a, double*  b, double* c, int n)
+ {
+   for (int i = 0; i != n; i+=4)
+     {
+       a[i] += b[i] * c[i];
+       a[i+1] += b[i+1] * c[i+1];
+       a[i+2] += b[i] * c[i+2];
+       a[i+3] += b[i+1] * c[i+3];
+     }
+ 
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/bitwise_mask_op-1.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/bitwise_mask_op-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/bitwise_mask_op-1.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/bitwise_mask_op-1.c	Sun Sep 21 22:33:13 2025
*************** foo_xorb (__m512i a, __m512i b, __m512i
*** 77,83 ****
    return _mm512_mask_add_epi64 (c, m1 ^ m2, a, d);
  }
  
! /* { dg-final { scan-assembler-times "korw" "2" } }  */
  
  __m512i
  foo_andq (__m512i a, __m512i b, __m512i c, __m512i d)
--- 77,83 ----
    return _mm512_mask_add_epi64 (c, m1 ^ m2, a, d);
  }
  
! /* { dg-final { scan-assembler-times "kxorw" "2" } }  */
  
  __m512i
  foo_andq (__m512i a, __m512i b, __m512i c, __m512i d)
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/cond_op_shift_q-1.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/cond_op_shift_q-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/cond_op_shift_q-1.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/cond_op_shift_q-1.c	Sun Sep 21 22:33:13 2025
***************
*** 2,9 ****
  /* { dg-options "-O2 -march=skylake-avx512 -fdump-tree-optimized -DTYPE=int64" } */
  /* { dg-final { scan-tree-dump-times ".COND_SHR" 2 "optimized" } } */
  /* { dg-final { scan-tree-dump-times ".COND_SHL" 2 "optimized" } } */
! /* { dg-final { scan-assembler-times "vpsravq"  1 } } */
! /* { dg-final { scan-assembler-times "vpsllvq"  1 } } */
  /* { dg-final { scan-assembler-times "vpsravq"  1 } } */
  /* { dg-final { scan-assembler-times "vpsllvq"  1 } } */
  
--- 2,9 ----
  /* { dg-options "-O2 -march=skylake-avx512 -fdump-tree-optimized -DTYPE=int64" } */
  /* { dg-final { scan-tree-dump-times ".COND_SHR" 2 "optimized" } } */
  /* { dg-final { scan-tree-dump-times ".COND_SHL" 2 "optimized" } } */
! /* { dg-final { scan-assembler-times "vpsraq"  1 } } */
! /* { dg-final { scan-assembler-times "vpsllq"  1 } } */
  /* { dg-final { scan-assembler-times "vpsravq"  1 } } */
  /* { dg-final { scan-assembler-times "vpsllvq"  1 } } */
  
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/cond_op_shift_ud-1.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/cond_op_shift_ud-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/cond_op_shift_ud-1.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/cond_op_shift_ud-1.c	Sun Sep 21 22:33:13 2025
***************
*** 2,9 ****
  /* { dg-options "-O2 -march=skylake-avx512 -fdump-tree-optimized -DTYPE=uint32" } */
  /* { dg-final { scan-tree-dump-times ".COND_SHR" 2 "optimized" } } */
  /* { dg-final { scan-tree-dump-times ".COND_SHL" 2 "optimized" } } */
! /* { dg-final { scan-assembler-times "vpsrlvd"  1 } } */
! /* { dg-final { scan-assembler-times "vpsllvd"  1 } } */
  /* { dg-final { scan-assembler-times "vpsrlvd"  1 } } */
  /* { dg-final { scan-assembler-times "vpsllvd"  1 } } */
  
--- 2,9 ----
  /* { dg-options "-O2 -march=skylake-avx512 -fdump-tree-optimized -DTYPE=uint32" } */
  /* { dg-final { scan-tree-dump-times ".COND_SHR" 2 "optimized" } } */
  /* { dg-final { scan-tree-dump-times ".COND_SHL" 2 "optimized" } } */
! /* { dg-final { scan-assembler-times "vpsrld"  1 } } */
! /* { dg-final { scan-assembler-times "vpslld"  1 } } */
  /* { dg-final { scan-assembler-times "vpsrlvd"  1 } } */
  /* { dg-final { scan-assembler-times "vpsllvd"  1 } } */
  
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/cond_op_shift_uq-1.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/cond_op_shift_uq-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/cond_op_shift_uq-1.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/cond_op_shift_uq-1.c	Sun Sep 21 22:33:13 2025
***************
*** 4,10 ****
  /* { dg-final { scan-tree-dump-times ".COND_SHL" 2 "optimized" } } */
  /* { dg-final { scan-assembler-times "vpsrlq"  1 } } */
  /* { dg-final { scan-assembler-times "vpsllq"  1 } } */
! /* { dg-final { scan-assembler-times "vpsrlq"  1 } } */
! /* { dg-final { scan-assembler-times "vpsllq"  1 } } */
  
  #include "cond_op_shift_d-1.c"
--- 4,10 ----
  /* { dg-final { scan-tree-dump-times ".COND_SHL" 2 "optimized" } } */
  /* { dg-final { scan-assembler-times "vpsrlq"  1 } } */
  /* { dg-final { scan-assembler-times "vpsllq"  1 } } */
! /* { dg-final { scan-assembler-times "vpsrlvq"  1 } } */
! /* { dg-final { scan-assembler-times "vpsllvq"  1 } } */
  
  #include "cond_op_shift_d-1.c"
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/memcpy-pr95886.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/memcpy-pr95886.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/memcpy-pr95886.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/memcpy-pr95886.c	Sun Sep 21 22:33:13 2025
*************** void cpy_123406789 (void *d)
*** 74,80 ****
    __builtin_memcpy (d, a1234067890, 9);
  }
  
! /* { dg-final { scan-rtl-dump-times "const_int 578437695685198337" 1 "expand"} } */
  
  
  const char a1234507890[10] = { 1, 2, 3, 4, 5, 0, 7, 8, 9 };
--- 74,80 ----
    __builtin_memcpy (d, a1234067890, 9);
  }
  
! /* { dg-final { scan-rtl-dump-times "const_int 578437674277470721" 1 "expand"} } */
  
  
  const char a1234507890[10] = { 1, 2, 3, 4, 5, 0, 7, 8, 9 };
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/part-vect-sqrtph-1.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/part-vect-sqrtph-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/part-vect-sqrtph-1.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/part-vect-sqrtph-1.c	Sun Sep 21 22:33:13 2025
***************
*** 1,7 ****
  /* { dg-do compile } */
  /* { dg-options "-mavx512fp16 -mavx512vl -Ofast" } */
  /* { dg-final { scan-assembler-times {(?n)vsqrtph[ \t].*%xmm[0-9]} 2 { target { ! ia32 } } } } */
- /* { dg-final { scan-assembler-times {(?n)vsqrtph[ \t].*%xmm[0-9]} 2 { target { ! ia32 } } } } */
  
  void
  foo16_sqrt (_Float16* a, _Float16* __restrict c)
--- 1,6 ----
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/pieces-memcpy-18.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/pieces-memcpy-18.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/pieces-memcpy-18.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/pieces-memcpy-18.c	Sun Sep 21 22:33:13 2025
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-O2 -march=sapphirerapids" } */
  
  extern char *dst, *src;
  
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-O2 -march=znver5" } */
  
  extern char *dst, *src;
  
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/pieces-memcpy-21.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/pieces-memcpy-21.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/pieces-memcpy-21.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/pieces-memcpy-21.c	Sun Sep 21 22:33:13 2025
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-O2 -mtune=sapphirerapids -march=x86-64 -mavx2" } */
  
  extern char *dst, *src;
  
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-O2 -mtune=znver5 -march=x86-64 -mavx2" } */
  
  extern char *dst, *src;
  
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/pieces-memset-46.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/pieces-memset-46.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/pieces-memset-46.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/pieces-memset-46.c	Sun Sep 21 22:33:13 2025
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-O2 -march=sapphirerapids" } */
  
  extern char *dst;
  
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-O2 -march=znver5" } */
  
  extern char *dst;
  
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/pieces-memset-49.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/pieces-memset-49.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/pieces-memset-49.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/pieces-memset-49.c	Sun Sep 21 22:33:13 2025
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-O2 -mtune=sapphirerapids -march=x86-64 -mavx2" } */
  
  extern char *dst;
  
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-O2 -mtune=znver5 -march=x86-64 -mavx2" } */
  
  extern char *dst;
  
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr107432-7.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr107432-7.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr107432-7.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr107432-7.c	Sun Sep 21 22:33:13 2025
***************
*** 10,19 ****
  /* { dg-final { scan-assembler-times "vpmovsxbd" 7 { target { ! ia32 } } } } */
  /* { dg-final { scan-assembler-times "vpmovzxbd" 5 { target { ia32 } } } } */
  /* { dg-final { scan-assembler-times "vpmovzxbd" 7 { target { ! ia32 } } } } */
! /* { dg-final { scan-assembler-times "vpmovsxbd" 5 { target { ia32 } } } } */
! /* { dg-final { scan-assembler-times "vpmovsxbd" 7 { target { ! ia32 } } } } */
! /* { dg-final { scan-assembler-times "vpmovzxbd" 5 { target { ia32 } } } } */
! /* { dg-final { scan-assembler-times "vpmovzxbd" 7 { target { ! ia32 } } } } */
  
  #include <x86intrin.h>
  
--- 10,19 ----
  /* { dg-final { scan-assembler-times "vpmovsxbd" 7 { target { ! ia32 } } } } */
  /* { dg-final { scan-assembler-times "vpmovzxbd" 5 { target { ia32 } } } } */
  /* { dg-final { scan-assembler-times "vpmovzxbd" 7 { target { ! ia32 } } } } */
! /* { dg-final { scan-assembler-times "vpmovsxbw" 4 { target { ia32 } } } } */
! /* { dg-final { scan-assembler-times "vpmovsxbw" 5 { target { ! ia32 } } } } */
! /* { dg-final { scan-assembler-times "vpmovzxbw" 4 { target { ia32 } } } } */
! /* { dg-final { scan-assembler-times "vpmovzxbw" 5 { target { ! ia32 } } } } */
  
  #include <x86intrin.h>
  
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr121934-1a.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr121934-1a.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr121934-1a.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr121934-1a.c	Sun Sep 21 22:33:13 2025
***************
*** 0 ****
--- 1,22 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -fno-tree-dominator-opts -fno-tree-vrp -fno-tree-ccp -fno-tree-forwprop -fno-tree-pre -fno-tree-fre" } */
+ 
+ extern int f();
+ int a, b, c, d[3];
+ void g() {
+   int h;
+   if (f()) {
+     if (b)
+     i:
+       c > 0;
+     a = 0;
+     for (h = 0; h < 3; h++) {
+       if (a != 1)
+         __builtin_printf("0\n");
+       d[h] = -1;
+     }
+     goto i;
+   }
+ }
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr121934-1b.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr121934-1b.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr121934-1b.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr121934-1b.c	Sun Sep 21 22:33:13 2025
***************
*** 0 ****
--- 1,7 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -fno-tree-dominator-opts -fno-tree-vrp -fno-tree-ccp -fno-tree-forwprop -fno-tree-pre -fno-tree-fre -mmemset-strategy=rep_byte:8192:align,libcall:-1:noalign" } */
+ 
+ #include "pr121934-1a.c"
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
+ /* { dg-final { scan-assembler-not "movb\[ \\t\]+\\\$-1" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr121934-2a.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr121934-2a.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr121934-2a.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr121934-2a.c	Sun Sep 21 22:33:13 2025
***************
*** 0 ****
--- 1,23 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -fno-tree-dominator-opts -fno-tree-vrp -fno-tree-ccp -fno-tree-forwprop -fno-tree-pre -fno-tree-fre" } */
+ 
+ extern int f();
+ int a, b, c;
+ long long int d[3];
+ void g() {
+   int h;
+   if (f()) {
+     if (b)
+     i:
+       c > 0;
+     a = 0;
+     for (h = 0; h < 3; h++) {
+       if (a != 1)
+         __builtin_printf("0\n");
+       d[h] = (long long int) -1;
+     }
+     goto i;
+   }
+ }
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr121934-2b.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr121934-2b.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr121934-2b.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr121934-2b.c	Sun Sep 21 22:33:13 2025
***************
*** 0 ****
--- 1,7 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -fno-tree-dominator-opts -fno-tree-vrp -fno-tree-ccp -fno-tree-forwprop -fno-tree-pre -fno-tree-fre -mmemset-strategy=rep_byte:8192:align,libcall:-1:noalign" } */
+ 
+ #include "pr121934-2a.c"
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
+ /* { dg-final { scan-assembler-not "movb\[ \\t\]+\\\$-1" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr121934-3a.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr121934-3a.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr121934-3a.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr121934-3a.c	Sun Sep 21 22:33:13 2025
***************
*** 0 ****
--- 1,23 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -fno-tree-dominator-opts -fno-tree-vrp -fno-tree-ccp -fno-tree-forwprop -fno-tree-pre -fno-tree-fre -msse2" } */
+ 
+ extern int f();
+ int a, b, c;
+ _BitInt(128) d[3];
+ void g() {
+   int h;
+   if (f()) {
+     if (b)
+     i:
+       c > 0;
+     a = 0;
+     for (h = 0; h < 3; h++) {
+       if (a != 1)
+         __builtin_printf("0\n");
+       d[h] = (_BitInt(128)) -1;
+     }
+     goto i;
+   }
+ }
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr121934-3b.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr121934-3b.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr121934-3b.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr121934-3b.c	Sun Sep 21 22:33:13 2025
***************
*** 0 ****
--- 1,7 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -fno-tree-dominator-opts -fno-tree-vrp -fno-tree-ccp -fno-tree-forwprop -fno-tree-pre -fno-tree-fre -msse2 -mmemset-strategy=rep_byte:8192:align,libcall:-1:noalign" } */
+ 
+ #include "pr121934-3a.c"
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
+ /* { dg-final { scan-assembler-not "movb\[ \\t\]+\\\$-1" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr121934-4a.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr121934-4a.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr121934-4a.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr121934-4a.c	Sun Sep 21 22:33:13 2025
***************
*** 0 ****
--- 1,23 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -fno-tree-dominator-opts -fno-tree-vrp -fno-tree-ccp -fno-tree-forwprop -fno-tree-pre -fno-tree-fre -mno-avx512f -mavx -mprefer-vector-width=256" } */
+ 
+ extern int f();
+ int a, b, c;
+ _BitInt(256) d[3];
+ void g() {
+   int h;
+   if (f()) {
+     if (b)
+     i:
+       c > 0;
+     a = 0;
+     for (h = 0; h < 3; h++) {
+       if (a != 1)
+         __builtin_printf("0\n");
+       d[h] = (_BitInt(256)) -1;
+     }
+     goto i;
+   }
+ }
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr121934-4b.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr121934-4b.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr121934-4b.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr121934-4b.c	Sun Sep 21 22:33:13 2025
***************
*** 0 ****
--- 1,7 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -fno-tree-dominator-opts -fno-tree-vrp -fno-tree-ccp -fno-tree-forwprop -fno-tree-pre -fno-tree-fre -mno-avx512f -mavx -mprefer-vector-width=256 -mmemset-strategy=rep_byte:8192:align,libcall:-1:noalign" } */
+ 
+ #include "pr121934-4a.c"
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
+ /* { dg-final { scan-assembler-not "movb\[ \\t\]+\\\$-1" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr121934-5a.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr121934-5a.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr121934-5a.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr121934-5a.c	Sun Sep 21 22:33:13 2025
***************
*** 0 ****
--- 1,23 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -fno-tree-dominator-opts -fno-tree-vrp -fno-tree-ccp -fno-tree-forwprop -fno-tree-pre -fno-tree-fre -mavx512f -mprefer-vector-width=512" } */
+ 
+ extern int f();
+ int a, b, c;
+ _BitInt(512) d[3];
+ void g() {
+   int h;
+   if (f()) {
+     if (b)
+     i:
+       c > 0;
+     a = 0;
+     for (h = 0; h < 3; h++) {
+       if (a != 1)
+         __builtin_printf("0\n");
+       d[h] = (_BitInt(512)) -1;
+     }
+     goto i;
+   }
+ }
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr121934-5b.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr121934-5b.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr121934-5b.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr121934-5b.c	Sun Sep 21 22:33:13 2025
***************
*** 0 ****
--- 1,7 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -fno-tree-dominator-opts -fno-tree-vrp -fno-tree-ccp -fno-tree-forwprop -fno-tree-pre -fno-tree-fre -mavx512f -mprefer-vector-width=512 -mmemset-strategy=rep_byte:8192:align,libcall:-1:noalign" } */
+ 
+ #include "pr121934-5a.c"
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
+ /* { dg-final { scan-assembler-not "movb\[ \\t\]+\\\$-1" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr88828-0.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr88828-0.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/pr88828-0.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/pr88828-0.c	Sun Sep 21 22:33:13 2025
*************** v4si foo (v4si x)
*** 9,23 ****
    return (v4si){ x[0], 1, x[2], 3 };
  }
  
- /* { dg-final { scan-assembler "pblendw" } } */
- 
  v4si bar (v4sf x)
  {
    return (v4si){ 1, x[1], x[2], 3 };
  }
  
  /* { dg-final { scan-assembler "cvttps2dq" } } */
! /* { dg-final { scan-assembler "pblendw" } } */
  
  v4si baz (v4si x)
  {
--- 9,21 ----
    return (v4si){ x[0], 1, x[2], 3 };
  }
  
  v4si bar (v4sf x)
  {
    return (v4si){ 1, x[1], x[2], 3 };
  }
  
  /* { dg-final { scan-assembler "cvttps2dq" } } */
! /* { dg-final { scan-assembler-times "pblendw" 2 } } */
  
  v4si baz (v4si x)
  {
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/i386/vect-epilogues-4.c gcc-16-20250921/gcc/testsuite/gcc.target/i386/vect-epilogues-4.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/i386/vect-epilogues-4.c	Sun Sep 14 22:32:30 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/i386/vect-epilogues-4.c	Sun Sep 21 22:33:14 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-20250914/gcc/testsuite/gcc.target/loongarch/pr121906.c gcc-16-20250921/gcc/testsuite/gcc.target/loongarch/pr121906.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/loongarch/pr121906.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/loongarch/pr121906.c	Sun Sep 21 22:33:14 2025
***************
*** 0 ****
--- 1,31 ----
+ /* PR target/121906 */
+ /* { dg-do run } */
+ /* { dg-options "-O2 -mno-lsx" } */
+ 
+ typedef unsigned short u16;
+ typedef unsigned long u64;
+ typedef u16 v4hi __attribute__ ((vector_size (8)));
+ typedef u16 v8hi __attribute__ ((vector_size (16)));
+ 
+ u64 d;
+ int e, i;
+ u16 x;
+ 
+ int
+ main ()
+ {
+   v4hi n = { 1 };
+   u64 *o = &d;
+ p:
+   asm goto ("" : : : : q);
+   n[3] = (-(v8hi){ 0, 0, 0, 0, x })[7];
+   for (; e >= 0; e--)
+     {
+       *o = n[0];
+       if (i)
+         goto p;
+     q:
+     }
+   if (d != 1)
+     __builtin_trap ();
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/bclr-lowest-set-bit-1.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/bclr-lowest-set-bit-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/bclr-lowest-set-bit-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/bclr-lowest-set-bit-1.c	Sun Sep 21 22:33:16 2025
***************
*** 0 ****
--- 1,128 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcb -mabi=lp64d" { target { rv64} } } */
+ /* { dg-options "-march=rv32gcb -mabi=ilp32" { target { rv32} } } */
+ /* { dg-skip-if "" { *-*-* } { "-O0" "-Og" } } */
+ 
+ int foo1_res1;
+ int foo1_res2;
+ void foo1(unsigned int x)
+ {
+   unsigned int tz = __builtin_ctz (x);
+   unsigned int t = x - 1UL;
+   foo1_res1 = t & x;
+   foo1_res2 = tz;
+ }
+ 
+ int foo2_res1;
+ int foo2_res2;
+ void foo2(unsigned int x)
+ {
+   unsigned int t = x - 1UL;
+   unsigned int tz = __builtin_ctz (x);
+   foo2_res1 = t & x;
+   foo2_res2 = tz;
+ }
+ 
+ int foo3_res1;
+ int foo3_res2;
+ void foo3(unsigned int x)
+ {
+   unsigned int t = x - 1UL;
+   foo3_res1 = t & x;
+   unsigned int tz = __builtin_ctz (x);
+   foo3_res2 = tz;
+ }
+ 
+ unsigned int foo4_res1;
+ unsigned int foo4_res2;
+ void foo4(unsigned int x)
+ {
+   unsigned int tz = __builtin_ctz (x);
+   unsigned int t = x - 1UL;
+   foo4_res1 = t & x;
+   foo4_res2 = tz;
+ }
+ 
+ unsigned int foo5_res1;
+ unsigned int foo5_res2;
+ void foo5(unsigned int x)
+ {
+   unsigned int t = x - 1UL;
+   unsigned int tz = __builtin_ctz (x);
+   foo5_res1 = t & x;
+   foo5_res2 = tz;
+ }
+ 
+ unsigned int foo6_res1;
+ unsigned int foo6_res2;
+ void foo6(unsigned int x)
+ {
+   unsigned int t = x - 1UL;
+   foo6_res1 = t & x;
+   unsigned int tz = __builtin_ctzl (x);
+   foo6_res2 = tz;
+ }
+ 
+ long foo7_res1;
+ long foo7_res2;
+ void foo7(unsigned long x)
+ {
+   unsigned long tz = __builtin_ctzl (x);
+   unsigned long t = x - 1UL;
+   foo7_res1 = t & x;
+   foo7_res2 = tz;
+ }
+ 
+ long foo8_res1;
+ long foo8_res2;
+ void foo8(unsigned long x)
+ {
+   unsigned long t = x - 1UL;
+   unsigned long tz = __builtin_ctzl (x);
+   foo8_res1 = t & x;
+   foo8_res2 = tz;
+ }
+ 
+ long foo9_res1;
+ long foo9_res2;
+ void foo9(unsigned long x)
+ {
+   unsigned long t = x - 1UL;
+   foo9_res1 = t & x;
+   unsigned long tz = __builtin_ctzl (x);
+   foo9_res2 = tz;
+ }
+ 
+ unsigned long foo10_res1;
+ unsigned long foo10_res2;
+ void foo10(unsigned long x)
+ {
+   unsigned long tz = __builtin_ctzl (x);
+   unsigned long t = x - 1UL;
+   foo10_res1 = t & x;
+   foo10_res2 = tz;
+ }
+ 
+ unsigned long foo11_res1;
+ unsigned long foo11_res2;
+ void foo11(unsigned long x)
+ {
+   unsigned long t = x - 1UL;
+   unsigned long tz = __builtin_ctzl (x);
+   foo11_res1 = t & x;
+   foo11_res2 = tz;
+ }
+ 
+ unsigned long foo12_res1;
+ unsigned long foo12_res2;
+ void foo12(unsigned long x)
+ {
+   unsigned long t = x - 1UL;
+   foo12_res1 = t & x;
+   unsigned long tz = __builtin_ctzl (x);
+   foo12_res2 = tz;
+ }
+ 
+ /* { dg-final { scan-assembler-not "\\sand\\s" } } */
+ /* { dg-final { scan-assembler-times "\\sbclr\\s" 12 } } */
+ 
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/pr120811.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/pr120811.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/pr120811.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/pr120811.c	Sun Sep 21 22:33:17 2025
***************
*** 0 ****
--- 1,42 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=rv64gc -mabi=lp64d -fdump-rtl-reload -fdump-rtl-late_combine2" { target { rv64 } } } */
+ /* { dg-options "-O2 -march=rv32gc -mabi=ilp32d -fdump-rtl-reload -fdump-rtl-late_combine2" { target { rv32 } } } */
+ /* { dg-skip-if "" { *-*-* } "-fomit-frame-pointer" } */
+ 
+ double *a, *b, *ab, *ac, *ad, *ae, *af, *c, *i, *k, *l;
+ int n(int *, int, int, int), d, ag, aj;
+ long ai, e;
+ double f, g, h, o, p;
+ int m;
+ void q() {
+   long am = n(&d, 0, 1, 0);
+   for (;;)
+     for (int j = ag; j; ++j) {
+       int ao = 0;
+       for (; ao < aj; ao++) {
+         long ap = ao + j;
+         double ar = ad[ap] = ae[ap], az;
+         switch (m)
+         case 4: {
+           o = (&l[ap])[2] - (&l[ap])[3] * ((char *)ap)[am] + (&l[ap])[e] +
+               (&l[ap])[am];
+           p = (&l[ap])[ai - 1] + (&ap)[ai] * (&l[ap])[am * ai] +
+               (&l[ap])[ai * 3];
+           az = (&b[ap])[1] +
+                (&b[ap])[3] * i[ap] * (&ap)[203] * ((char *)&i[ap])[ai] -
+                (&i[ap])[ai * 3];
+           g = (&i[ap])[e] + (&i[ap])[ai];
+           h = (&ab[ap])[am] * (&ab[ap])[2] - ((char *)ap)[ai] +
+               (&ab[ap])[ai] * (&ap)[0] * (&af[ap])[am] * (&af[ap])[e] +
+               (&ap)[2] + (&af[ap])[e * am] + (&af[ap])[am * 3];
+         }
+           ar = az * f * k[ap];
+         c[ap] = ar;
+         a[ap] = ac[ap];
+       }
+     }
+ }
+ /* { dg-final { scan-rtl-dump-not "const_sum_of_two_s12" "reload" } } */
+ /* { dg-final { scan-rtl-dump-not "const_sum_of_two_s12" "late_combine2" } } */
+ /* { dg-final { scan-assembler "addi.*sp,2047\n\tl\[dw\]\t.*,1\(.*\).*" } } */
+ 
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/pr121983.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/pr121983.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/pr121983.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/pr121983.c	Sun Sep 21 22:33:17 2025
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do compile } */
+ /* { dg-options "-mcpu=xiangshan-nanhu" } */
+ 
+ struct {
+   int a;
+   short s;
+   unsigned x : 18;
+   unsigned y : 14;
+ } bf;
+ 
+ void
+ foo()
+ {
+   bf.s ^= bf.y / __builtin_stdc_rotate_left(bf.x, 5);
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/pr58727.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/pr58727.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/pr58727.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/pr58727.c	Sun Sep 21 22:33:17 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcb -mabi=lp64d" { target { rv64} } } */
+ /* { dg-options "-march=rv32gcb -mabi=ilp32" { target { rv32} } } */
+ /* { dg-skip-if "" { *-*-* } { "-O0" "-Og" } } */
+ 
+ enum masks { CLEAR = 0x400000, SET = 0x02 };
+ unsigned clear_set(unsigned a) { return (a & ~CLEAR) | SET; }
+ unsigned set_clear(unsigned a) { return (a | SET) & ~CLEAR; }
+ unsigned clear(unsigned a) { return a & ~CLEAR; }
+ unsigned set(unsigned a) { return a | SET; }
+ __attribute__((flatten)) unsigned clear_set_inline(unsigned a) { return set(clear(a)); }
+ __attribute__((flatten)) unsigned set_clear_inline(unsigned a) { return clear(set(a)); }
+ 
+ /* { dg-final { scan-assembler-not "\\sand\\s" } } */
+ /* { dg-final { scan-assembler-not "\\sandi\\s" } } */
+ 
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr121910.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr121910.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr121910.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr121910.c	Sun Sep 21 22:33:17 2025
***************
*** 0 ****
--- 1,34 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -ftree-vectorize -mabi=lp64d -march=rv64gcv -mrvv-max-lmul=dynamic -fdump-tree-vect-all" } */
+ /* { dg-skip-if "" { *-*-* } { "-O0" "-O1" "-O2" "-Os" "-Og" "-Oz" } } */
+ 
+ #include <stdint-gcc.h>
+ 
+ /* full chroma mc (ie until 1/8 pixel)*/
+ void mc_chroma(uint8_t* dst, int i_dst_stride, uint8_t* src, int i_src_stride,
+                int mvx, int mvy, int i_width, int i_height) {
+     uint8_t* srcp;
+ 
+     int d8x = mvx & 0x07;
+     int d8y = mvy & 0x07;
+     int cA = (8 - d8x) * (8 - d8y);
+     int cB = d8x * (8 - d8y);
+     int cC = (8 - d8x) * d8y;
+     int cD = d8x * d8y;
+ 
+     src += (mvy >> 3) * i_src_stride + (mvx >> 3);
+     srcp = &src[i_src_stride];
+ 
+     for (int y = 0; y < i_height; y++) {
+         for (int x = 0; x < i_width; x++)
+             dst[x] = (cA * src[x] + cB * src[x + 1] + cC * srcp[x] +
+                       cD * srcp[x + 1] + 32) >>
+                      6;
+         dst += i_dst_stride;
+         src = srcp;
+         srcp += i_src_stride;
+     }
+ }
+ 
+ /* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */
+ /* { dg-final { scan-tree-dump "Choosing vector mode RVVM1QI" "vect" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/shuffle-slide-run.h gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/shuffle-slide-run.h
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/shuffle-slide-run.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/shuffle-slide-run.h	Sun Sep 21 22:33:17 2025
***************
*** 0 ****
--- 1,106 ----
+ #define comp(a, b, n)                                                          \
+   for (unsigned i = 0; i < n; ++i)                                             \
+     if ((a)[i] != (b)[i])                                                      \
+       __builtin_abort ();
+ 
+ #define CHECK4(TYPE, NUNITS, A, B, C)                                          \
+   __attribute__ ((noipa)) void check4_##A##_##B##_##C##_##TYPE ()               \
+   {                                                                            \
+     TYPE v0_##TYPE = (TYPE){SERIES_##NUNITS (0, NUNITS)};                     \
+     TYPE v1_##TYPE = (TYPE){SERIES_##NUNITS (NUNITS, NUNITS)};                \
+     TYPE ref_##TYPE = (TYPE){MASK4_##NUNITS (0, NUNITS, A, B, C)};             \
+     TYPE res_##TYPE;                                                          \
+     permute4_##A##_##B##_##C##_##TYPE (v0_##TYPE, v1_##TYPE, &res_##TYPE);   \
+     comp (res_##TYPE, ref_##TYPE, NUNITS);                                   \
+   }
+ 
+ #define CHECK8(TYPE, NUNITS, A, B, C)                                          \
+   __attribute__ ((noipa)) void check8_##A##_##B##_##C##_##TYPE ()               \
+   {                                                                            \
+     TYPE v0_##TYPE = (TYPE){SERIES_##NUNITS (0, NUNITS)};                     \
+     TYPE v1_##TYPE = (TYPE){SERIES_##NUNITS (NUNITS, NUNITS)};                \
+     TYPE ref_##TYPE = (TYPE){MASK8_##NUNITS (0, NUNITS, A, B, C)};             \
+     TYPE res_##TYPE;                                                          \
+     permute8_##A##_##B##_##C##_##TYPE (v0_##TYPE, v1_##TYPE, &res_##TYPE);   \
+     comp (res_##TYPE, ref_##TYPE, NUNITS);                                   \
+   }
+ 
+ #define CHECK8(TYPE, NUNITS, A, B, C)                                          \
+   __attribute__ ((noipa)) void check8_##A##_##B##_##C##_##TYPE ()               \
+   {                                                                            \
+     TYPE v0_##TYPE = (TYPE){SERIES_##NUNITS (0, NUNITS)};                     \
+     TYPE v1_##TYPE = (TYPE){SERIES_##NUNITS (NUNITS, NUNITS)};                \
+     TYPE ref_##TYPE = (TYPE){MASK8_##NUNITS (0, NUNITS, A, B, C)};             \
+     TYPE res_##TYPE;                                                          \
+     permute8_##A##_##B##_##C##_##TYPE (v0_##TYPE, v1_##TYPE, &res_##TYPE);   \
+     comp (res_##TYPE, ref_##TYPE, NUNITS);                                   \
+   }
+ 
+ #define CHECK16(TYPE, NUNITS, A, B, C)                                          \
+   __attribute__ ((noipa)) void check16_##A##_##B##_##C##_##TYPE ()               \
+   {                                                                            \
+     TYPE v0_##TYPE = (TYPE){SERIES_##NUNITS (0, NUNITS)};                     \
+     TYPE v1_##TYPE = (TYPE){SERIES_##NUNITS (NUNITS, NUNITS)};                \
+     TYPE ref_##TYPE = (TYPE){MASK16_##NUNITS (0, NUNITS, A, B, C)};             \
+     TYPE res_##TYPE;                                                          \
+     permute16_##A##_##B##_##C##_##TYPE (v0_##TYPE, v1_##TYPE, &res_##TYPE);   \
+     comp (res_##TYPE, ref_##TYPE, NUNITS);                                   \
+   }
+ 
+ #define CHECK32(TYPE, NUNITS, A, B, C)                                          \
+   __attribute__ ((noipa)) void check32_##A##_##B##_##C##_##TYPE ()               \
+   {                                                                            \
+     TYPE v0_##TYPE = (TYPE){SERIES_##NUNITS (0, NUNITS)};                     \
+     TYPE v1_##TYPE = (TYPE){SERIES_##NUNITS (NUNITS, NUNITS)};                \
+     TYPE ref_##TYPE = (TYPE){MASK32_##NUNITS (0, NUNITS, A, B, C)};             \
+     TYPE res_##TYPE;                                                          \
+     permute32_##A##_##B##_##C##_##TYPE (v0_##TYPE, v1_##TYPE, &res_##TYPE);   \
+     comp (res_##TYPE, ref_##TYPE, NUNITS);                                   \
+   }
+ 
+ #define CHECK64(TYPE, NUNITS, A, B, C)                                          \
+   __attribute__ ((noipa)) void check64_##A##_##B##_##C##_##TYPE ()               \
+   {                                                                            \
+     TYPE v0_##TYPE = (TYPE){SERIES_##NUNITS (0, NUNITS)};                     \
+     TYPE v1_##TYPE = (TYPE){SERIES_##NUNITS (NUNITS, NUNITS)};                \
+     TYPE ref_##TYPE = (TYPE){MASK64_##NUNITS (0, NUNITS, A, B, C)};             \
+     TYPE res_##TYPE;                                                          \
+     permute64_##A##_##B##_##C##_##TYPE (v0_##TYPE, v1_##TYPE, &res_##TYPE);   \
+     comp (res_##TYPE, ref_##TYPE, NUNITS);                                   \
+   }
+ 
+ #define CHECK128(TYPE, NUNITS, A, B, C)                                          \
+   __attribute__ ((noipa)) void check128_##A##_##B##_##C##_##TYPE ()               \
+   {                                                                            \
+     TYPE v0_##TYPE = (TYPE){SERIES_##NUNITS (0, NUNITS)};                     \
+     TYPE v1_##TYPE = (TYPE){SERIES_##NUNITS (NUNITS, NUNITS)};                \
+     TYPE ref_##TYPE = (TYPE){MASK128_##NUNITS (0, NUNITS, A, B, C)};             \
+     TYPE res_##TYPE;                                                          \
+     permute128_##A##_##B##_##C##_##TYPE (v0_##TYPE, v1_##TYPE, &res_##TYPE);   \
+     comp (res_##TYPE, ref_##TYPE, NUNITS);                                   \
+   }
+ 
+ DO_ALL_TEST4(CHECK4)
+ DO_ALL_TEST8(CHECK8)
+ DO_ALL_TEST16(CHECK16)
+ DO_ALL_TEST32(CHECK32)
+ DO_ALL_TEST64(CHECK64)
+ DO_ALL_TEST128(CHECK128)
+ 
+ #define CALL_CHECK4(TYPE, NUNITS, A, B, C) check4_##A##_##B##_##C##_##TYPE ();
+ #define CALL_CHECK8(TYPE, NUNITS, A, B, C) check8_##A##_##B##_##C##_##TYPE ();
+ #define CALL_CHECK16(TYPE, NUNITS, A, B, C) check16_##A##_##B##_##C##_##TYPE ();
+ #define CALL_CHECK32(TYPE, NUNITS, A, B, C) check32_##A##_##B##_##C##_##TYPE ();
+ #define CALL_CHECK64(TYPE, NUNITS, A, B, C) check64_##A##_##B##_##C##_##TYPE ();
+ #define CALL_CHECK128(TYPE, NUNITS, A, B, C) check128_##A##_##B##_##C##_##TYPE ();
+ 
+ int
+ main ()
+ {
+   DO_ALL_TEST4(CALL_CHECK4)
+   DO_ALL_TEST8(CALL_CHECK8)
+   DO_ALL_TEST16(CALL_CHECK16)
+   DO_ALL_TEST32(CALL_CHECK32)
+   DO_ALL_TEST64(CALL_CHECK64)
+   DO_ALL_TEST128(CALL_CHECK128)
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/shuffle-slidedown-run.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/shuffle-slidedown-run.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/shuffle-slidedown-run.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/shuffle-slidedown-run.c	Sun Sep 21 22:33:17 2025
***************
*** 0 ****
--- 1,7 ----
+ /* { dg-do run } */
+ /* { dg-require-effective-target riscv_v_ok } */
+ /* { dg-add-options riscv_v } */
+ /* { dg-additional-options "-O3 -std=gnu99 -mrvv-max-lmul=m8 -Wno-overflow" } */
+ 
+ #include "vls-vlmax/shuffle-slidedown-1.c"
+ #include "shuffle-slide-run.h"
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/shuffle-slideup-run.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/shuffle-slideup-run.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/shuffle-slideup-run.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/shuffle-slideup-run.c	Sun Sep 21 22:33:17 2025
***************
*** 0 ****
--- 1,7 ----
+ /* { dg-do run } */
+ /* { dg-require-effective-target riscv_v_ok } */
+ /* { dg-add-options riscv_v } */
+ /* { dg-additional-options "-O3 -std=gnu99 -mrvv-max-lmul=m8 -Wno-overflow" } */
+ 
+ #include "vls-vlmax/shuffle-slideup-1.c"
+ #include "shuffle-slide-run.h"
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slide.h gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slide.h
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slide.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slide.h	Sun Sep 21 22:33:18 2025
***************
*** 0 ****
--- 1,240 ----
+ #include "perm.h"
+ 
+ #define SERIES_1(x, y) (x)
+ #define SERIES_2(x, y) (x), (x + 1)
+ #define SERIES_3(x, y) SERIES_1 (x, y), SERIES_2 (x + 1, y)
+ #define SERIES_4(x, y) SERIES_2 (x, y), SERIES_2 (x + 2, y)
+ #define SERIES_5(x, y) SERIES_2 (x, y), SERIES_3 (x + 2, y)
+ #define SERIES_6(x, y) SERIES_3 (x, y), SERIES_3 (x + 3, y)
+ #define SERIES_7(x, y) SERIES_3 (x, y), SERIES_4 (x + 3, y)
+ #define SERIES_8(x, y) SERIES_4 (x, y), SERIES_4 (x + 4, y)
+ #define SERIES_9(x, y) SERIES_4 (x, y), SERIES_5 (x + 4, y)
+ #define SERIES_10(x, y) SERIES_5 (x, y), SERIES_5 (x + 5, y)
+ #define SERIES_11(x, y) SERIES_5 (x, y), SERIES_6 (x + 5, y)
+ #define SERIES_12(x, y) SERIES_6 (x, y), SERIES_6 (x + 6, y)
+ #define SERIES_13(x, y) SERIES_6 (x, y), SERIES_7 (x + 6, y)
+ #define SERIES_14(x, y) SERIES_7 (x, y), SERIES_7 (x + 7, y)
+ #define SERIES_15(x, y) SERIES_7 (x, y), SERIES_8 (x + 7, y)
+ #define SERIES_16(x, y) SERIES_8 (x, y), SERIES_8 (x + 8, y)
+ #define SERIES_17(x, y) SERIES_8 (x, y), SERIES_9 (x + 8, y)
+ #define SERIES_18(x, y) SERIES_9 (x, y), SERIES_9 (x + 9, y)
+ #define SERIES_19(x, y) SERIES_9 (x, y), SERIES_10 (x + 9, y)
+ #define SERIES_20(x, y) SERIES_10 (x, y), SERIES_10 (x + 10, y)
+ #define SERIES_21(x, y) SERIES_10 (x, y), SERIES_11 (x + 10, y)
+ #define SERIES_22(x, y) SERIES_11 (x, y), SERIES_11 (x + 11, y)
+ #define SERIES_23(x, y) SERIES_11 (x, y), SERIES_12 (x + 11, y)
+ #define SERIES_24(x, y) SERIES_12 (x, y), SERIES_12 (x + 12, y)
+ #define SERIES_25(x, y) SERIES_12 (x, y), SERIES_13 (x + 12, y)
+ #define SERIES_26(x, y) SERIES_13 (x, y), SERIES_13 (x + 13, y)
+ #define SERIES_27(x, y) SERIES_13 (x, y), SERIES_14 (x + 13, y)
+ #define SERIES_28(x, y) SERIES_14 (x, y), SERIES_14 (x + 14, y)
+ #define SERIES_29(x, y) SERIES_14 (x, y), SERIES_15 (x + 14, y)
+ #define SERIES_30(x, y) SERIES_15 (x, y), SERIES_15 (x + 15, y)
+ #define SERIES_31(x, y) SERIES_15 (x, y), SERIES_16 (x + 15, y)
+ #define SERIES_32(x, y) SERIES_16 (x, y), SERIES_16 (x + 16, y)
+ #define SERIES_33(x, y) SERIES_16 (x, y), SERIES_17 (x + 16, y)
+ #define SERIES_34(x, y) SERIES_17 (x, y), SERIES_17 (x + 17, y)
+ #define SERIES_35(x, y) SERIES_17 (x, y), SERIES_18 (x + 17, y)
+ #define SERIES_36(x, y) SERIES_18 (x, y), SERIES_18 (x + 18, y)
+ #define SERIES_37(x, y) SERIES_18 (x, y), SERIES_19 (x + 18, y)
+ #define SERIES_38(x, y) SERIES_19 (x, y), SERIES_19 (x + 19, y)
+ #define SERIES_39(x, y) SERIES_19 (x, y), SERIES_20 (x + 19, y)
+ #define SERIES_40(x, y) SERIES_20 (x, y), SERIES_20 (x + 20, y)
+ #define SERIES_41(x, y) SERIES_20 (x, y), SERIES_21 (x + 20, y)
+ #define SERIES_42(x, y) SERIES_21 (x, y), SERIES_21 (x + 21, y)
+ #define SERIES_43(x, y) SERIES_21 (x, y), SERIES_22 (x + 21, y)
+ #define SERIES_44(x, y) SERIES_22 (x, y), SERIES_22 (x + 22, y)
+ #define SERIES_45(x, y) SERIES_22 (x, y), SERIES_23 (x + 22, y)
+ #define SERIES_46(x, y) SERIES_23 (x, y), SERIES_23 (x + 23, y)
+ #define SERIES_47(x, y) SERIES_23 (x, y), SERIES_24 (x + 23, y)
+ #define SERIES_48(x, y) SERIES_24 (x, y), SERIES_24 (x + 24, y)
+ #define SERIES_49(x, y) SERIES_24 (x, y), SERIES_25 (x + 24, y)
+ #define SERIES_50(x, y) SERIES_25 (x, y), SERIES_25 (x + 25, y)
+ #define SERIES_51(x, y) SERIES_25 (x, y), SERIES_26 (x + 25, y)
+ #define SERIES_52(x, y) SERIES_26 (x, y), SERIES_26 (x + 26, y)
+ #define SERIES_53(x, y) SERIES_26 (x, y), SERIES_27 (x + 26, y)
+ #define SERIES_54(x, y) SERIES_27 (x, y), SERIES_27 (x + 27, y)
+ #define SERIES_55(x, y) SERIES_27 (x, y), SERIES_28 (x + 27, y)
+ #define SERIES_56(x, y) SERIES_28 (x, y), SERIES_28 (x + 28, y)
+ #define SERIES_57(x, y) SERIES_28 (x, y), SERIES_29 (x + 28, y)
+ #define SERIES_58(x, y) SERIES_29 (x, y), SERIES_29 (x + 29, y)
+ #define SERIES_59(x, y) SERIES_29 (x, y), SERIES_30 (x + 29, y)
+ #define SERIES_60(x, y) SERIES_30 (x, y), SERIES_30 (x + 30, y)
+ #define SERIES_61(x, y) SERIES_30 (x, y), SERIES_31 (x + 30, y)
+ #define SERIES_62(x, y) SERIES_31 (x, y), SERIES_31 (x + 31, y)
+ #define SERIES_63(x, y) SERIES_31 (x, y), SERIES_32 (x + 31, y)
+ #define SERIES_64(x, y) SERIES_32 (x, y), SERIES_32 (x + 32, y)
+ #define SERIES_65(x, y) SERIES_32 (x, y), SERIES_33 (x + 32, y)
+ #define SERIES_66(x, y) SERIES_33 (x, y), SERIES_33 (x + 33, y)
+ #define SERIES_67(x, y) SERIES_33 (x, y), SERIES_34 (x + 33, y)
+ #define SERIES_68(x, y) SERIES_34 (x, y), SERIES_34 (x + 34, y)
+ #define SERIES_69(x, y) SERIES_34 (x, y), SERIES_35 (x + 34, y)
+ #define SERIES_70(x, y) SERIES_35 (x, y), SERIES_35 (x + 35, y)
+ #define SERIES_71(x, y) SERIES_35 (x, y), SERIES_36 (x + 35, y)
+ #define SERIES_72(x, y) SERIES_36 (x, y), SERIES_36 (x + 36, y)
+ #define SERIES_73(x, y) SERIES_36 (x, y), SERIES_37 (x + 36, y)
+ #define SERIES_74(x, y) SERIES_37 (x, y), SERIES_37 (x + 37, y)
+ #define SERIES_75(x, y) SERIES_37 (x, y), SERIES_38 (x + 37, y)
+ #define SERIES_76(x, y) SERIES_38 (x, y), SERIES_38 (x + 38, y)
+ #define SERIES_77(x, y) SERIES_38 (x, y), SERIES_39 (x + 38, y)
+ #define SERIES_78(x, y) SERIES_39 (x, y), SERIES_39 (x + 39, y)
+ #define SERIES_79(x, y) SERIES_39 (x, y), SERIES_40 (x + 39, y)
+ #define SERIES_80(x, y) SERIES_40 (x, y), SERIES_40 (x + 40, y)
+ #define SERIES_81(x, y) SERIES_40 (x, y), SERIES_41 (x + 40, y)
+ #define SERIES_82(x, y) SERIES_41 (x, y), SERIES_41 (x + 41, y)
+ #define SERIES_83(x, y) SERIES_41 (x, y), SERIES_42 (x + 41, y)
+ #define SERIES_84(x, y) SERIES_42 (x, y), SERIES_42 (x + 42, y)
+ #define SERIES_85(x, y) SERIES_42 (x, y), SERIES_43 (x + 42, y)
+ #define SERIES_86(x, y) SERIES_43 (x, y), SERIES_43 (x + 43, y)
+ #define SERIES_87(x, y) SERIES_43 (x, y), SERIES_44 (x + 43, y)
+ #define SERIES_88(x, y) SERIES_44 (x, y), SERIES_44 (x + 44, y)
+ #define SERIES_89(x, y) SERIES_44 (x, y), SERIES_45 (x + 44, y)
+ #define SERIES_90(x, y) SERIES_45 (x, y), SERIES_45 (x + 45, y)
+ #define SERIES_91(x, y) SERIES_45 (x, y), SERIES_46 (x + 45, y)
+ #define SERIES_92(x, y) SERIES_46 (x, y), SERIES_46 (x + 46, y)
+ #define SERIES_93(x, y) SERIES_46 (x, y), SERIES_47 (x + 46, y)
+ #define SERIES_94(x, y) SERIES_47 (x, y), SERIES_47 (x + 47, y)
+ #define SERIES_95(x, y) SERIES_47 (x, y), SERIES_48 (x + 47, y)
+ #define SERIES_96(x, y) SERIES_48 (x, y), SERIES_48 (x + 48, y)
+ #define SERIES_97(x, y) SERIES_48 (x, y), SERIES_49 (x + 48, y)
+ #define SERIES_98(x, y) SERIES_49 (x, y), SERIES_49 (x + 49, y)
+ #define SERIES_99(x, y) SERIES_49 (x, y), SERIES_50 (x + 49, y)
+ #define SERIES_100(x, y) SERIES_50 (x, y), SERIES_50 (x + 50, y)
+ #define SERIES_101(x, y) SERIES_50 (x, y), SERIES_51 (x + 50, y)
+ #define SERIES_102(x, y) SERIES_51 (x, y), SERIES_51 (x + 51, y)
+ #define SERIES_103(x, y) SERIES_51 (x, y), SERIES_52 (x + 51, y)
+ #define SERIES_104(x, y) SERIES_52 (x, y), SERIES_52 (x + 52, y)
+ #define SERIES_105(x, y) SERIES_52 (x, y), SERIES_53 (x + 52, y)
+ #define SERIES_106(x, y) SERIES_53 (x, y), SERIES_53 (x + 53, y)
+ #define SERIES_107(x, y) SERIES_53 (x, y), SERIES_54 (x + 53, y)
+ #define SERIES_108(x, y) SERIES_54 (x, y), SERIES_54 (x + 54, y)
+ #define SERIES_109(x, y) SERIES_54 (x, y), SERIES_55 (x + 54, y)
+ #define SERIES_110(x, y) SERIES_55 (x, y), SERIES_55 (x + 55, y)
+ #define SERIES_111(x, y) SERIES_55 (x, y), SERIES_56 (x + 55, y)
+ #define SERIES_112(x, y) SERIES_56 (x, y), SERIES_56 (x + 56, y)
+ #define SERIES_113(x, y) SERIES_56 (x, y), SERIES_57 (x + 56, y)
+ #define SERIES_114(x, y) SERIES_57 (x, y), SERIES_57 (x + 57, y)
+ #define SERIES_115(x, y) SERIES_57 (x, y), SERIES_58 (x + 57, y)
+ #define SERIES_116(x, y) SERIES_58 (x, y), SERIES_58 (x + 58, y)
+ #define SERIES_117(x, y) SERIES_58 (x, y), SERIES_59 (x + 58, y)
+ #define SERIES_118(x, y) SERIES_59 (x, y), SERIES_59 (x + 59, y)
+ #define SERIES_119(x, y) SERIES_59 (x, y), SERIES_60 (x + 59, y)
+ #define SERIES_120(x, y) SERIES_60 (x, y), SERIES_60 (x + 60, y)
+ #define SERIES_121(x, y) SERIES_60 (x, y), SERIES_61 (x + 60, y)
+ #define SERIES_122(x, y) SERIES_61 (x, y), SERIES_61 (x + 61, y)
+ #define SERIES_123(x, y) SERIES_61 (x, y), SERIES_62 (x + 61, y)
+ #define SERIES_124(x, y) SERIES_62 (x, y), SERIES_62 (x + 62, y)
+ #define SERIES_125(x, y) SERIES_62 (x, y), SERIES_63 (x + 62, y)
+ #define SERIES_126(x, y) SERIES_63 (x, y), SERIES_63 (x + 63, y)
+ #define SERIES_127(x, y) SERIES_63 (x, y), SERIES_64 (x + 63, y)
+ #define SERIES_128(x, y) SERIES_64 (x, y), SERIES_64 (x + 64, y)
+ #define SERIES_129(x, y) SERIES_64 (x, y), SERIES_65 (x + 64, y)
+ #define SERIES_128(x, y) SERIES_64 (x, y), SERIES_64 (x + 64, y)
+ 
+ #define PERMUTE4(TYPE, NUNITS, A, B, C)                                        \
+   __attribute__ ((noipa)) void permute4_##A##_##B##_##C##_##TYPE               \
+ 								(TYPE values1, \
+ 								 TYPE values2, \
+ 								 TYPE *out)    \
+   {                                                                            \
+     TYPE v = __builtin_shufflevector (values1, values2,                        \
+ 				      MASK4_##NUNITS (0, NUNITS, A, B, C));    \
+     *(TYPE *) out = v;                                                         \
+   }
+ 
+ #define PERMUTE8(TYPE, NUNITS, A, B, C)                                        \
+   __attribute__ ((noipa)) void permute8_##A##_##B##_##C##_##TYPE               \
+ 								(TYPE values1, \
+ 								 TYPE values2, \
+ 								 TYPE *out)    \
+   {                                                                            \
+     TYPE v = __builtin_shufflevector (values1, values2,                        \
+ 				      MASK8_##NUNITS (0, NUNITS, A, B, C));    \
+     *(TYPE *) out = v;                                                         \
+   }
+ 
+ #define PERMUTE16(TYPE, NUNITS, A, B, C)                                       \
+   __attribute__ ((noipa)) void permute16_##A##_##B##_##C##_##TYPE              \
+ 								(TYPE values1, \
+ 								 TYPE values2, \
+ 								 TYPE *out)    \
+   {                                                                            \
+     TYPE v = __builtin_shufflevector (values1, values2,                        \
+ 				      MASK16_##NUNITS (0, NUNITS, A, B, C));   \
+     *(TYPE *) out = v;                                                         \
+   }
+ 
+ #define PERMUTE32(TYPE, NUNITS, A, B, C)                                       \
+   __attribute__ ((noipa)) void permute32_##A##_##B##_##C##_##TYPE              \
+ 								(TYPE values1, \
+ 								 TYPE values2, \
+ 								 TYPE *out)    \
+   {                                                                            \
+     TYPE v = __builtin_shufflevector (values1, values2,                        \
+ 				      MASK32_##NUNITS (0, NUNITS, A, B, C));   \
+     *(TYPE *) out = v;                                                         \
+   }
+ 
+ #define PERMUTE64(TYPE, NUNITS, A, B, C)                                       \
+   __attribute__ ((noipa)) void permute64_##A##_##B##_##C##_##TYPE              \
+ 								(TYPE values1, \
+ 								 TYPE values2, \
+ 								 TYPE *out)    \
+   {                                                                            \
+     TYPE v = __builtin_shufflevector (values1, values2,                        \
+ 				      MASK64_##NUNITS (0, NUNITS, A, B, C));   \
+     *(TYPE *) out = v;                                                         \
+   }
+ 
+ #define PERMUTE128(TYPE, NUNITS, A, B, C)                                      \
+   __attribute__ ((noipa)) void permute128_##A##_##B##_##C##_##TYPE             \
+ 								(TYPE values1, \
+ 								 TYPE values2, \
+ 								 TYPE *out)    \
+   {                                                                            \
+     TYPE v = __builtin_shufflevector (values1, values2,                        \
+ 				      MASK128_##NUNITS (0, NUNITS, A, B, C));  \
+     *(TYPE *) out = v;                                                         \
+   }
+ 
+ #define TEST_128(FUNC, T) 							\
+   T (vnx128qi, 128, FUNC)
+ 
+ #define TEST_64(FUNC, T) 							\
+   T (vnx64qi, 64, FUNC)                                                         \
+   T (vnx64hi, 64, FUNC)                                                         \
+   TEST_128(FUNC, T)
+ 
+ #define TEST_32(FUNC, T)							\
+   T (vnx32hi, 32, FUNC)                                                         \
+   T (vnx32si, 32, FUNC)                                                         \
+   T (vnx32sf, 32, FUNC)                                                         \
+   T (vnx32qi, 32, FUNC)                                                         \
+   TEST_64(FUNC, T)
+ 
+ #define TEST_16(FUNC, T)							\
+   T (vnx16qi, 16, FUNC)                                                         \
+   T (vnx16hi, 16, FUNC)                                                         \
+   T (vnx16si, 16, FUNC)                                                         \
+   T (vnx16di, 16, FUNC)                                                         \
+   T (vnx16sf, 16, FUNC)                                                         \
+   T (vnx16df, 16, FUNC) 							\
+   TEST_32(FUNC, T)
+ 
+ #define TEST_8(FUNC, T)							        \
+   T (vnx8qi, 8, FUNC)                                                           \
+   T (vnx8hi, 8, FUNC)                                                           \
+   T (vnx8si, 8, FUNC)                                                           \
+   T (vnx8di, 8, FUNC)                                                           \
+   T (vnx8sf, 8, FUNC)                                                           \
+   T (vnx8df, 8, FUNC)                                                           \
+   TEST_16(FUNC, T)
+ 
+ #define TEST_4(FUNC, T)                                                         \
+   T (vnx4qi, 4, FUNC)                                                           \
+   T (vnx4hi, 4, FUNC)                                                           \
+   T (vnx4si, 4, FUNC)                                                           \
+   T (vnx4di, 4, FUNC)                                                           \
+   T (vnx4sf, 4, FUNC)                                                           \
+   T (vnx4df, 4, FUNC)                                                           \
+   TEST_8(FUNC, T)
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-1.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-1.c	Sun Sep 21 22:33:18 2025
***************
*** 0 ****
--- 1,41 ----
+ /* { dg-do compile { target { ! riscv_abi_e } } } */
+ /* { dg-options "-O3 -march=rv64gcv -mrvv-max-lmul=m8 -Wno-overflow" { target { rv64 } } } */
+ /* { dg-options "-O3 -march=rv32gcv -mrvv-max-lmul=m8 -Wno-overflow" { target { rv32 } } } */
+ 
+ #define MASK(X, Y, A, B, C) SERIES_##A (X + C, Y), SERIES_##B (X + Y + A, Y)
+ 
+ #define MASK4_4(X, Y, A, B, C) MASK(X, Y, A, B, C)
+ #define MASK4_8(X, Y, A, B, C) MASK4_4(X, Y, A, B, C), SERIES_4 (X + Y + 4, Y)
+ #define MASK4_16(X, Y, A, B, C) MASK4_8(X, Y, A, B, C), SERIES_8 (X + Y + 8, Y) 
+ #define MASK4_32(X, Y, A, B, C) MASK4_16(X, Y, A, B, C), SERIES_16 (X + Y + 16, Y) 
+ #define MASK4_64(X, Y, A, B, C) MASK4_32(X, Y, A, B, C), SERIES_32 (X + Y + 32, Y) 
+ #define MASK4_128(X, Y, A, B, C) MASK4_64(X, Y, A, B, C), SERIES_64 (X + Y + 64, Y) 
+ 
+ #define MASK8_8(X, Y, A, B, C) MASK(X, Y, A, B, C)
+ #define MASK8_16(X, Y, A, B, C) MASK8_8(X, Y, A, B, C), SERIES_8 (X + Y + 8, Y) 
+ #define MASK8_32(X, Y, A, B, C) MASK8_16(X, Y, A, B, C), SERIES_16 (X + Y + 16, Y) 
+ #define MASK8_64(X, Y, A, B, C) MASK8_32(X, Y, A, B, C), SERIES_32 (X + Y + 32, Y) 
+ #define MASK8_128(X, Y, A, B, C) MASK8_64(X, Y, A, B, C), SERIES_64 (X + Y + 64, Y) 
+ 
+ #define MASK16_16(X, Y, A, B, C) MASK(X, Y, A, B, C)
+ #define MASK16_32(X, Y, A, B, C) MASK16_16(X, Y, A, B, C), SERIES_16 (X + Y + 16, Y) 
+ #define MASK16_64(X, Y, A, B, C) MASK16_32(X, Y, A, B, C), SERIES_32 (X + Y + 32, Y) 
+ #define MASK16_128(X, Y, A, B, C) MASK16_64(X, Y, A, B, C), SERIES_64 (X + Y + 64, Y) 
+ 
+ #define MASK32_32(X, Y, A, B, C) MASK(X, Y, A, B, C)
+ #define MASK32_64(X, Y, A, B, C) MASK32_32(X, Y, A, B, C), SERIES_32 (X + Y + 32, Y) 
+ #define MASK32_128(X, Y, A, B, C) MASK32_64(X, Y, A, B, C), SERIES_64 (X + Y + 64, Y) 
+ 
+ #define MASK64_64(X, Y, A, B, C) MASK(X, Y, A, B, C)
+ #define MASK64_128(X, Y, A, B, C) MASK64_64(X, Y, A, B, C), SERIES_64 (X + Y + 64, Y) 
+ 
+ #define MASK128_128(X, Y, A, B, C) MASK(X, Y, A, B, C)
+ 
+ #include "shuffle-slidedown-perm.h"
+ 
+ /* All cases are covered by shuffle_slide_patterns but shuffle_merge_patterns is
+    called first, that's why we see some vmerge here.  */
+ /* { dg-final { scan-assembler-times "vslidedown" 477 } } */
+ /* { dg-final { scan-assembler-times "vmerge" 164 } } */
+ /* { dg-final { scan-assembler-not "vslideup" } } */
+ /* { dg-final { scan-assembler-not "vrgather" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-2.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-2.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-2.c	Sun Sep 21 22:33:18 2025
***************
*** 0 ****
--- 1,41 ----
+ /* { dg-do compile { target { ! riscv_abi_e } } } */
+ /* { dg-options "-O3 -march=rv64gcv -mrvv-max-lmul=m8 -Wno-overflow" { target { rv64 } } } */
+ /* { dg-options "-O3 -march=rv32gcv -mrvv-max-lmul=m8 -Wno-overflow" { target { rv32 } } } */
+ 
+ #define MASK(X, Y, A, B, C) SERIES_##A (X + Y + C, Y), SERIES_##B (X + A, Y)
+ 
+ #define MASK4_4(X, Y, A, B, C) MASK(X, Y, A, B, C)
+ #define MASK4_8(X, Y, A, B, C) MASK4_4(X, Y, A, B, C), SERIES_4 (X  + 4, Y)
+ #define MASK4_16(X, Y, A, B, C) MASK4_8(X, Y, A, B, C), SERIES_8 (X  + 8, Y) 
+ #define MASK4_32(X, Y, A, B, C) MASK4_16(X, Y, A, B, C), SERIES_16 (X + 16, Y) 
+ #define MASK4_64(X, Y, A, B, C) MASK4_32(X, Y, A, B, C), SERIES_32 (X + 32, Y) 
+ #define MASK4_128(X, Y, A, B, C) MASK4_64(X, Y, A, B, C), SERIES_64 (X + 64, Y) 
+ 
+ #define MASK8_8(X, Y, A, B, C) MASK(X, Y, A, B, C)
+ #define MASK8_16(X, Y, A, B, C) MASK8_8(X, Y, A, B, C), SERIES_8 (X + 8, Y) 
+ #define MASK8_32(X, Y, A, B, C) MASK8_16(X, Y, A, B, C), SERIES_16 (X + 16, Y) 
+ #define MASK8_64(X, Y, A, B, C) MASK8_32(X, Y, A, B, C), SERIES_32 (X  + 32, Y) 
+ #define MASK8_128(X, Y, A, B, C) MASK8_64(X, Y, A, B, C), SERIES_64 (X + 64, Y) 
+ 
+ #define MASK16_16(X, Y, A, B, C) MASK(X, Y, A, B, C)
+ #define MASK16_32(X, Y, A, B, C) MASK16_16(X, Y, A, B, C), SERIES_16 (X + 16, Y) 
+ #define MASK16_64(X, Y, A, B, C) MASK16_32(X, Y, A, B, C), SERIES_32 (X + 32, Y) 
+ #define MASK16_128(X, Y, A, B, C) MASK16_64(X, Y, A, B, C), SERIES_64 (X + 64, Y) 
+ 
+ #define MASK32_32(X, Y, A, B, C) MASK(X, Y, A, B, C)
+ #define MASK32_64(X, Y, A, B, C) MASK32_32(X, Y, A, B, C), SERIES_32 (X + 32, Y) 
+ #define MASK32_128(X, Y, A, B, C) MASK32_64(X, Y, A, B, C), SERIES_64 (X + 64, Y) 
+ 
+ #define MASK64_64(X, Y, A, B, C) MASK(X, Y, A, B, C)
+ #define MASK64_128(X, Y, A, B, C) MASK64_64(X, Y, A, B, C), SERIES_64 (X + 64, Y) 
+ 
+ #define MASK128_128(X, Y, A, B, C) MASK(X, Y, A, B, C)
+ 
+ #include "shuffle-slidedown-perm.h"
+ 
+ /* All cases are covered by shuffle_slide_patterns but shuffle_merge_patterns is
+    called first, that's why we see some vmerge here.  */
+ /* { dg-final { scan-assembler-times "vslidedown" 477 } } */
+ /* { dg-final { scan-assembler-times "vmerge" 164 } } */
+ /* { dg-final { scan-assembler-not "vslideup" } } */
+ /* { dg-final { scan-assembler-not "vrgather" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-perm.h gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-perm.h
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-perm.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slidedown-perm.h	Sun Sep 21 22:33:18 2025
***************
*** 0 ****
--- 1,107 ----
+ #include "shuffle-slide.h"
+ 
+ /* All permutations with 4 and 8 elements.  */
+ #define PERM4_1(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 1, 3, 0)
+ #define PERM4_2(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 1, 3, 1)
+ #define PERM4_3(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 1, 3, 2)
+ #define PERM4_4(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 2, 2, 0)
+ #define PERM4_5(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 2, 2, 1)
+ #define PERM4_6(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 3, 1, 0)
+ #define PERM8_1(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 1, 7, 3)
+ #define PERM8_2(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 1, 7, 4)
+ #define PERM8_3(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 1, 7, 5)
+ #define PERM8_4(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 1, 7, 6)
+ #define PERM8_5(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 2, 6, 2)
+ #define PERM8_6(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 2, 6, 3)
+ #define PERM8_7(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 2, 6, 4)
+ #define PERM8_8(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 2, 6, 5)
+ #define PERM8_9(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 3, 5, 1)
+ #define PERM8_10(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 3, 5, 2)
+ #define PERM8_11(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 3, 5, 3)
+ #define PERM8_12(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 3, 5, 4)
+ #define PERM8_13(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 4, 4, 0)
+ #define PERM8_14(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 4, 4, 1)
+ #define PERM8_15(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 4, 4, 2)
+ #define PERM8_16(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 4, 4, 3)
+ #define PERM8_17(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 5, 3, 0)
+ #define PERM8_18(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 5, 3, 1)
+ #define PERM8_19(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 5, 3, 2)
+ #define PERM8_20(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 6, 2, 0)
+ #define PERM8_21(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 6, 2, 1)
+ #define PERM8_22(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 7, 1, 0)
+ 
+ /* We don't test all possible permutations with higher number of elements to avoid
+    timing out.  */
+ #define PERM16_1(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 4, 12, 6)
+ #define PERM16_2(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 7, 9, 4)
+ #define PERM16_3(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 14, 2, 0)
+ #define PERM32_1(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 2, 30, 17)
+ #define PERM32_2(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 3, 29, 20)
+ #define PERM32_3(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 13, 19, 18)
+ #define PERM64_1(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 1, 63, 31)
+ #define PERM64_2(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 25, 39, 14)
+ #define PERM64_3(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 59, 5, 3)
+ #define PERM128_1(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 4, 124, 73)
+ #define PERM128_2(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 10, 118, 117)
+ #define PERM128_3(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 22, 106, 50)
+ #define PERM128_4(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 35, 93, 42)
+ 
+ #define DO_ALL_TEST4(FUNC)      \
+   TEST_4 (FUNC, PERM4_1)        \
+   TEST_4 (FUNC, PERM4_2)        \
+   TEST_4 (FUNC, PERM4_3)        \
+   TEST_4 (FUNC, PERM4_4)        \
+   TEST_4 (FUNC, PERM4_5)        \
+   TEST_4 (FUNC, PERM4_6)
+ 
+ #define DO_ALL_TEST8(FUNC)      \
+   TEST_8 (FUNC, PERM8_1)        \
+   TEST_8 (FUNC, PERM8_2)        \
+   TEST_8 (FUNC, PERM8_3)        \
+   TEST_8 (FUNC, PERM8_4)        \
+   TEST_8 (FUNC, PERM8_5)        \
+   TEST_8 (FUNC, PERM8_6)        \
+   TEST_8 (FUNC, PERM8_7)        \
+   TEST_8 (FUNC, PERM8_8)        \
+   TEST_8 (FUNC, PERM8_9)        \
+   TEST_8 (FUNC, PERM8_10)        \
+   TEST_8 (FUNC, PERM8_11)        \
+   TEST_8 (FUNC, PERM8_12)        \
+   TEST_8 (FUNC, PERM8_13)        \
+   TEST_8 (FUNC, PERM8_14)        \
+   TEST_8 (FUNC, PERM8_15)        \
+   TEST_8 (FUNC, PERM8_16)        \
+   TEST_8 (FUNC, PERM8_17)        \
+   TEST_8 (FUNC, PERM8_18)        \
+   TEST_8 (FUNC, PERM8_19)        \
+   TEST_8 (FUNC, PERM8_20)        \
+   TEST_8 (FUNC, PERM8_21)        \
+   TEST_8 (FUNC, PERM8_22)
+ 
+ #define DO_ALL_TEST16(FUNC)       \
+   TEST_16 (FUNC, PERM16_1)        \
+   TEST_16 (FUNC, PERM16_2)        \
+   TEST_16 (FUNC, PERM16_3)
+ 
+ #define DO_ALL_TEST32(FUNC)       \
+   TEST_32 (FUNC, PERM32_1)        \
+   TEST_32 (FUNC, PERM32_2)        \
+   TEST_32 (FUNC, PERM32_3)
+ 
+ #define DO_ALL_TEST64(FUNC)       \
+   TEST_64 (FUNC, PERM64_1)        \
+   TEST_64 (FUNC, PERM64_2)        \
+   TEST_64 (FUNC, PERM64_3)
+ 
+ #define DO_ALL_TEST128(FUNC)        \
+   TEST_128 (FUNC, PERM128_1)        \
+   TEST_128 (FUNC, PERM128_2)        \
+   TEST_128 (FUNC, PERM128_3)        \
+   TEST_128 (FUNC, PERM128_4)
+ 
+ DO_ALL_TEST4(PERMUTE4)
+ DO_ALL_TEST8(PERMUTE8)
+ DO_ALL_TEST16(PERMUTE16)
+ DO_ALL_TEST32(PERMUTE32)
+ DO_ALL_TEST64(PERMUTE64)
+ DO_ALL_TEST128(PERMUTE128)
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slideup-1.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slideup-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slideup-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slideup-1.c	Sun Sep 21 22:33:18 2025
***************
*** 0 ****
--- 1,37 ----
+ /* { dg-do compile { target { ! riscv_abi_e } } } */
+ /* { dg-options "-O3 -march=rv64gcv -mrvv-max-lmul=m8 -Wno-overflow" { target { rv64 } } } */
+ /* { dg-options "-O3 -march=rv32gcv -mrvv-max-lmul=m8 -Wno-overflow" { target { rv32 } } } */
+ 
+ #define MASK4_4(X, Y, A, B, C) SERIES_##A (X, Y), SERIES_##B (X + Y,  Y), SERIES_##C (X + 4 - C, Y)
+ #define MASK4_8(X, Y, A, B, C) MASK4_4(X, Y, A, B, C), SERIES_4 (X + 4, Y)
+ #define MASK4_16(X, Y, A, B, C) MASK4_8(X, Y, A, B, C), SERIES_8 (X + 8, Y) 
+ #define MASK4_32(X, Y, A, B, C) MASK4_16(X, Y, A, B, C), SERIES_16 (X + 16, Y) 
+ #define MASK4_64(X, Y, A, B, C) MASK4_32(X, Y, A, B, C), SERIES_32 (X + 32, Y) 
+ #define MASK4_128(X, Y, A, B, C) MASK4_64(X, Y, A, B, C), SERIES_64 (X + 64, Y) 
+ 
+ #define MASK8_8(X, Y, A, B, C) SERIES_##A (X, Y), SERIES_##B (X + Y,  Y), SERIES_##C (X + 8 - C, Y)
+ #define MASK8_16(X, Y, A, B, C) MASK8_8(X, Y, A, B, C), SERIES_8 (X + 8, Y) 
+ #define MASK8_32(X, Y, A, B, C) MASK8_16(X, Y, A, B, C), SERIES_16 (X + 16, Y) 
+ #define MASK8_64(X, Y, A, B, C) MASK8_32(X, Y, A, B, C), SERIES_32 (X + 32, Y) 
+ #define MASK8_128(X, Y, A, B, C) MASK8_64(X, Y, A, B, C), SERIES_64 (X + 64, Y) 
+ 
+ #define MASK16_16(X, Y, A, B, C) SERIES_##A (X, Y), SERIES_##B (X + Y,  Y), SERIES_##C (X + 16 - C, Y)
+ #define MASK16_32(X, Y, A, B, C) MASK16_16(X, Y, A, B, C), SERIES_16 (X + 16, Y) 
+ #define MASK16_64(X, Y, A, B, C) MASK16_32(X, Y, A, B, C), SERIES_32 (X + 32, Y) 
+ #define MASK16_128(X, Y, A, B, C) MASK16_64(X, Y, A, B, C), SERIES_64 (X + 64, Y) 
+ 
+ #define MASK32_32(X, Y, A, B, C) SERIES_##A (X, Y), SERIES_##B (X + Y,  Y), SERIES_##C (X + 32 - C, Y)
+ #define MASK32_64(X, Y, A, B, C) MASK32_32(X, Y, A, B, C), SERIES_32 (X + 32, Y) 
+ #define MASK32_128(X, Y, A, B, C) MASK32_64(X, Y, A, B, C), SERIES_64 (X + 64, Y) 
+ 
+ #define MASK64_64(X, Y, A, B, C) SERIES_##A (X, Y), SERIES_##B (X + Y,  Y), SERIES_##C (X + 64 - C, Y)
+ #define MASK64_128(X, Y, A, B, C) MASK64_64(X, Y, A, B, C), SERIES_64 (X + 64, Y) 
+ 
+ #define MASK128_128(X, Y, A, B, C) SERIES_##A (X, Y), SERIES_##B (X + Y,  Y), SERIES_##C (X + 128 - C, Y)
+ 
+ #include "shuffle-slideup-perm.h"
+ 
+ /* { dg-final { scan-assembler-times "vslideup" 490 } } */
+ /* { dg-final { scan-assembler-not "vslidedown" } } */
+ /* { dg-final { scan-assembler-not "vrgather" } } */
+ /* { dg-final { scan-assembler-not "vmerge" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slideup-2.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slideup-2.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slideup-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slideup-2.c	Sun Sep 21 22:33:18 2025
***************
*** 0 ****
--- 1,37 ----
+ /* { dg-do compile { target { ! riscv_abi_e } } } */
+ /* { dg-options "-O3 -march=rv64gcv -mrvv-max-lmul=m8 -Wno-overflow" { target { rv64 } } } */
+ /* { dg-options "-O3 -march=rv32gcv -mrvv-max-lmul=m8 -Wno-overflow" { target { rv32 } } } */
+ 
+ #define MASK4_4(X, Y, A, B, C) SERIES_##A (X + Y, Y), SERIES_##B (X,  Y), SERIES_##C (X + Y + 4 - C, Y)
+ #define MASK4_8(X, Y, A, B, C) MASK4_4(X, Y, A, B, C), SERIES_4 (X + Y + 4, Y)
+ #define MASK4_16(X, Y, A, B, C) MASK4_8(X, Y, A, B, C), SERIES_8 (X + Y + 8, Y) 
+ #define MASK4_32(X, Y, A, B, C) MASK4_16(X, Y, A, B, C), SERIES_16 (X + Y + 16, Y) 
+ #define MASK4_64(X, Y, A, B, C) MASK4_32(X, Y, A, B, C), SERIES_32 (X + Y + 32, Y) 
+ #define MASK4_128(X, Y, A, B, C) MASK4_64(X, Y, A, B, C), SERIES_64 (X + Y + 64, Y) 
+ 
+ #define MASK8_8(X, Y, A, B, C) SERIES_##A (X + Y, Y), SERIES_##B (X,  Y), SERIES_##C (X + Y + 8 - C, Y)
+ #define MASK8_16(X, Y, A, B, C) MASK8_8(X, Y, A, B, C), SERIES_8 (X + Y + 8, Y) 
+ #define MASK8_32(X, Y, A, B, C) MASK8_16(X, Y, A, B, C), SERIES_16 (X + Y + 16, Y) 
+ #define MASK8_64(X, Y, A, B, C) MASK8_32(X, Y, A, B, C), SERIES_32 (X + Y + 32, Y) 
+ #define MASK8_128(X, Y, A, B, C) MASK8_64(X, Y, A, B, C), SERIES_64 (X + Y + 64, Y) 
+ 
+ #define MASK16_16(X, Y, A, B, C) SERIES_##A (X + Y, Y), SERIES_##B (X,  Y), SERIES_##C (X + Y + 16 - C, Y)
+ #define MASK16_32(X, Y, A, B, C) MASK16_16(X, Y, A, B, C), SERIES_16 (X + Y + 16, Y) 
+ #define MASK16_64(X, Y, A, B, C) MASK16_32(X, Y, A, B, C), SERIES_32 (X + Y + 32, Y) 
+ #define MASK16_128(X, Y, A, B, C) MASK16_64(X, Y, A, B, C), SERIES_64 (X + Y + 64, Y) 
+ 
+ #define MASK32_32(X, Y, A, B, C) SERIES_##A (X + Y, Y), SERIES_##B (X,  Y), SERIES_##C (X + Y + 32 - C, Y)
+ #define MASK32_64(X, Y, A, B, C) MASK32_32(X, Y, A, B, C), SERIES_32 (X + Y + 32, Y) 
+ #define MASK32_128(X, Y, A, B, C) MASK32_64(X, Y, A, B, C), SERIES_64 (X + Y + 64, Y) 
+ 
+ #define MASK64_64(X, Y, A, B, C) SERIES_##A (X + Y, Y), SERIES_##B (X,  Y), SERIES_##C (X + Y + 64 - C, Y)
+ #define MASK64_128(X, Y, A, B, C) MASK64_64(X, Y, A, B, C), SERIES_64 (X + Y + 64, Y) 
+ 
+ #define MASK128_128(X, Y, A, B, C) SERIES_##A (X + Y, Y), SERIES_##B (X,  Y), SERIES_##C (X + Y + 128 - C, Y)
+ 
+ #include "shuffle-slideup-perm.h"
+ 
+ /* { dg-final { scan-assembler-times "vslideup" 490 } } */
+ /* { dg-final { scan-assembler-not "vslidedown" } } */
+ /* { dg-final { scan-assembler-not "vrgather" } } */
+ /* { dg-final { scan-assembler-not "vmerge" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slideup-perm.h gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slideup-perm.h
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slideup-perm.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/shuffle-slideup-perm.h	Sun Sep 21 22:33:18 2025
***************
*** 0 ****
--- 1,93 ----
+ #include "shuffle-slide.h"
+ 
+ /* All permutations with 4 and 8 elements.  */
+ #define PERM4_1(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 1, 1, 2)
+ #define PERM4_2(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 1, 2, 1)
+ #define PERM4_3(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 2, 1, 1)
+ #define PERM8_1(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 1, 3, 4)
+ #define PERM8_2(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 1, 4, 3)
+ #define PERM8_3(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 1, 5, 2)
+ #define PERM8_4(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 1, 6, 1)
+ #define PERM8_5(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 2, 2, 4)
+ #define PERM8_6(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 2, 3, 3)
+ #define PERM8_7(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 2, 4, 2)
+ #define PERM8_8(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 2, 5, 1)
+ #define PERM8_9(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 3, 1, 4)
+ #define PERM8_10(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 3, 2, 3)
+ #define PERM8_11(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 3, 3, 2)
+ #define PERM8_12(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 3, 4, 1)
+ #define PERM8_13(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 4, 1, 3)
+ #define PERM8_14(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 4, 2, 2)
+ #define PERM8_15(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 4, 3, 1)
+ #define PERM8_16(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 5, 1, 2)
+ #define PERM8_17(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 5, 2, 1)
+ #define PERM8_18(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 6, 1, 1)
+ 
+ /* We don't test all possible permutations with higher number of elements to avoid
+    timing out.  */
+ #define PERM16_1(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 1, 13, 2)
+ #define PERM16_2(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 4, 9, 3)
+ #define PERM16_3(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 11, 4, 1)
+ #define PERM32_1(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 4, 27, 1)
+ #define PERM32_2(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 6, 19, 7)
+ #define PERM32_3(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 20, 4, 8)
+ #define PERM64_1(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 2, 37, 25)
+ #define PERM64_2(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 6, 29, 29)
+ #define PERM64_3(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 34, 10, 20)
+ #define PERM128_1(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 2, 68, 58)
+ #define PERM128_2(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 32, 45, 51)
+ #define PERM128_3(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 60, 63, 5)
+ #define PERM128_4(TYPE, NUNITS, FUNC) FUNC(TYPE, NUNITS, 81, 7, 40)
+ 
+ #define DO_ALL_TEST4(FUNC)  \
+   TEST_4 (FUNC, PERM4_1)    \
+   TEST_4 (FUNC, PERM4_2)    \
+   TEST_4 (FUNC, PERM4_3)
+ 
+ #define DO_ALL_TEST8(FUNC)      \
+   TEST_8 (FUNC, PERM8_1)        \
+   TEST_8 (FUNC, PERM8_2)        \
+   TEST_8 (FUNC, PERM8_3)        \
+   TEST_8 (FUNC, PERM8_4)        \
+   TEST_8 (FUNC, PERM8_5)        \
+   TEST_8 (FUNC, PERM8_6)        \
+   TEST_8 (FUNC, PERM8_7)        \
+   TEST_8 (FUNC, PERM8_8)        \
+   TEST_8 (FUNC, PERM8_9)        \
+   TEST_8 (FUNC, PERM8_10)        \
+   TEST_8 (FUNC, PERM8_11)        \
+   TEST_8 (FUNC, PERM8_12)        \
+   TEST_8 (FUNC, PERM8_13)        \
+   TEST_8 (FUNC, PERM8_14)        \
+   TEST_8 (FUNC, PERM8_15)        \
+   TEST_8 (FUNC, PERM8_16)        \
+   TEST_8 (FUNC, PERM8_17)        \
+   TEST_8 (FUNC, PERM8_18)
+ 
+ #define DO_ALL_TEST16(FUNC)      \
+   TEST_16 (FUNC, PERM16_1)        \
+   TEST_16 (FUNC, PERM16_2)        \
+   TEST_16 (FUNC, PERM16_3)
+ 
+ #define DO_ALL_TEST32(FUNC)       \
+   TEST_32 (FUNC, PERM32_1)        \
+   TEST_32 (FUNC, PERM32_2)        \
+   TEST_32 (FUNC, PERM32_3)
+ 
+ #define DO_ALL_TEST64(FUNC)       \
+   TEST_64 (FUNC, PERM64_1)        \
+   TEST_64 (FUNC, PERM64_2)        \
+   TEST_64 (FUNC, PERM64_3)
+ 
+ #define DO_ALL_TEST128(FUNC)        \
+   TEST_128 (FUNC, PERM128_1)        \
+   TEST_128 (FUNC, PERM128_2)        \
+   TEST_128 (FUNC, PERM128_3)        \
+   TEST_128 (FUNC, PERM128_4)
+ 
+ DO_ALL_TEST4(PERMUTE4)
+ DO_ALL_TEST8(PERMUTE8)
+ DO_ALL_TEST16(PERMUTE16)
+ DO_ALL_TEST32(PERMUTE32)
+ DO_ALL_TEST64(PERMUTE64)
+ DO_ALL_TEST128(PERMUTE128)
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c	Sun Sep 21 22:33:18 2025
***************
*** 3,13 ****
--- 3,16 ----
  
  #include "vx_binary.h"
  #include "vx_ternary.h"
+ #include "vx_widen.h"
  
  #define T uint16_t
+ #define NT uint8_t
  
  TEST_BINARY_VX_UNSIGNED_0(T)
  TEST_TERNARY_VX_UNSIGNED_0(T)
+ TEST_WIDEN_BINARY_VX_UNSIGNED(T, NT)
  
  /* { dg-final { scan-assembler-times {vadd.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vsub.vx} 1 } } */
*************** TEST_TERNARY_VX_UNSIGNED_0(T)
*** 26,28 ****
--- 29,34 ----
  /* { dg-final { scan-assembler-times {vnmsac.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vmadd.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vnmsub.vx} 1 } } */
+ /* { dg-final { scan-assembler-not {vwaddu.vx} } } */
+ /* { dg-final { scan-assembler-not {vwsubu.vx} } } */
+ /* { dg-final { scan-assembler-not {vwmulu.vx} } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c	Sun Sep 21 22:33:18 2025
***************
*** 3,13 ****
--- 3,16 ----
  
  #include "vx_binary.h"
  #include "vx_ternary.h"
+ #include "vx_widen.h"
  
  #define T uint32_t
+ #define NT uint16_t
  
  TEST_BINARY_VX_UNSIGNED_0(T)
  TEST_TERNARY_VX_UNSIGNED_0(T)
+ TEST_WIDEN_BINARY_VX_UNSIGNED(T, NT)
  
  /* { dg-final { scan-assembler-times {vadd.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vsub.vx} 1 } } */
*************** TEST_TERNARY_VX_UNSIGNED_0(T)
*** 26,28 ****
--- 29,34 ----
  /* { dg-final { scan-assembler-times {vnmsac.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vmadd.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vnmsub.vx} 1 } } */
+ /* { dg-final { scan-assembler-not {vwaddu.vx} } } */
+ /* { dg-final { scan-assembler-not {vwsubu.vx} } } */
+ /* { dg-final { scan-assembler-not {vwmulu.vx} } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c	Sun Sep 21 22:33:18 2025
***************
*** 3,13 ****
--- 3,16 ----
  
  #include "vx_binary.h"
  #include "vx_ternary.h"
+ #include "vx_widen.h"
  
  #define T uint64_t
+ #define NT uint32_t
  
  TEST_BINARY_VX_UNSIGNED_0(T)
  TEST_TERNARY_VX_UNSIGNED_0(T)
+ TEST_WIDEN_BINARY_VX_UNSIGNED(T, NT)
  
  /* { dg-final { scan-assembler-times {vadd.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vsub.vx} 1 } } */
*************** TEST_TERNARY_VX_UNSIGNED_0(T)
*** 29,31 ****
--- 32,37 ----
  /* { dg-final { scan-assembler-times {vnmsac.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vmadd.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vnmsub.vx} 1 } } */
+ /* { dg-final { scan-assembler-times {vwaddu.vx} 1 } } */
+ /* { dg-final { scan-assembler-times {vwsubu.vx} 1 } } */
+ /* { dg-final { scan-assembler-times {vwmulu.vx} 1 } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c	Sun Sep 21 22:33:18 2025
***************
*** 3,13 ****
--- 3,16 ----
  
  #include "vx_binary.h"
  #include "vx_ternary.h"
+ #include "vx_widen.h"
  
  #define T uint16_t
+ #define NT uint8_t
  
  TEST_BINARY_VX_UNSIGNED_0(T)
  TEST_TERNARY_VX_UNSIGNED_0(T)
+ TEST_WIDEN_BINARY_VX_UNSIGNED(T, NT)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
*************** TEST_TERNARY_VX_UNSIGNED_0(T)
*** 26,28 ****
--- 29,34 ----
  /* { dg-final { scan-assembler-not {vnmsac.vx} } } */
  /* { dg-final { scan-assembler-not {vmadd.vx} } } */
  /* { dg-final { scan-assembler-not {vnmsub.vx} } } */
+ /* { dg-final { scan-assembler-not {vwaddu.vx} } } */
+ /* { dg-final { scan-assembler-not {vwsubu.vx} } } */
+ /* { dg-final { scan-assembler-not {vwmulu.vx} } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c	Sun Sep 21 22:33:18 2025
***************
*** 3,13 ****
--- 3,16 ----
  
  #include "vx_binary.h"
  #include "vx_ternary.h"
+ #include "vx_widen.h"
  
  #define T uint32_t
+ #define NT uint16_t
  
  TEST_BINARY_VX_UNSIGNED_0(T)
  TEST_TERNARY_VX_UNSIGNED_0(T)
+ TEST_WIDEN_BINARY_VX_UNSIGNED(T, NT)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
*************** TEST_TERNARY_VX_UNSIGNED_0(T)
*** 26,28 ****
--- 29,34 ----
  /* { dg-final { scan-assembler-not {vnmsac.vx} } } */
  /* { dg-final { scan-assembler-not {vmadd.vx} } } */
  /* { dg-final { scan-assembler-not {vnmsub.vx} } } */
+ /* { dg-final { scan-assembler-not {vwaddu.vx} } } */
+ /* { dg-final { scan-assembler-not {vwsubu.vx} } } */
+ /* { dg-final { scan-assembler-not {vwmulu.vx} } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c	Sun Sep 21 22:33:18 2025
***************
*** 3,13 ****
--- 3,16 ----
  
  #include "vx_binary.h"
  #include "vx_ternary.h"
+ #include "vx_widen.h"
  
  #define T uint64_t
+ #define NT uint32_t
  
  TEST_BINARY_VX_UNSIGNED_0(T)
  TEST_TERNARY_VX_UNSIGNED_0(T)
+ TEST_WIDEN_BINARY_VX_UNSIGNED(T, NT)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
*************** TEST_TERNARY_VX_UNSIGNED_0(T)
*** 26,28 ****
--- 29,34 ----
  /* { dg-final { scan-assembler-not {vnmsac.vx} } } */
  /* { dg-final { scan-assembler-not {vmadd.vx} } } */
  /* { dg-final { scan-assembler-not {vnmsub.vx} } } */
+ /* { dg-final { scan-assembler-not {vwaddu.vx} } } */
+ /* { dg-final { scan-assembler-not {vwsubu.vx} } } */
+ /* { dg-final { scan-assembler-not {vwmulu.vx} } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c	Sun Sep 21 22:33:18 2025
***************
*** 3,13 ****
--- 3,16 ----
  
  #include "vx_binary.h"
  #include "vx_ternary.h"
+ #include "vx_widen.h"
  
  #define T uint16_t
+ #define NT uint8_t
  
  TEST_BINARY_VX_UNSIGNED_0(T)
  TEST_TERNARY_VX_UNSIGNED_0(T)
+ TEST_WIDEN_BINARY_VX_UNSIGNED(T, NT)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
*************** TEST_TERNARY_VX_UNSIGNED_0(T)
*** 26,28 ****
--- 29,34 ----
  /* { dg-final { scan-assembler-not {vnmsac.vx} } } */
  /* { dg-final { scan-assembler-not {vmadd.vx} } } */
  /* { dg-final { scan-assembler-not {vnmsub.vx} } } */
+ /* { dg-final { scan-assembler-not {vwaddu.vx} } } */
+ /* { dg-final { scan-assembler-not {vwsubu.vx} } } */
+ /* { dg-final { scan-assembler-not {vwmulu.vx} } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c	Sun Sep 21 22:33:18 2025
***************
*** 3,13 ****
--- 3,16 ----
  
  #include "vx_binary.h"
  #include "vx_ternary.h"
+ #include "vx_widen.h"
  
  #define T uint32_t
+ #define NT uint32_t
  
  TEST_BINARY_VX_UNSIGNED_0(T)
  TEST_TERNARY_VX_UNSIGNED_0(T)
+ TEST_WIDEN_BINARY_VX_UNSIGNED(T, NT)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
*************** TEST_TERNARY_VX_UNSIGNED_0(T)
*** 26,28 ****
--- 29,34 ----
  /* { dg-final { scan-assembler-not {vnmsac.vx} } } */
  /* { dg-final { scan-assembler-not {vmadd.vx} } } */
  /* { dg-final { scan-assembler-not {vnmsub.vx} } } */
+ /* { dg-final { scan-assembler-not {vwaddu.vx} } } */
+ /* { dg-final { scan-assembler-not {vwsubu.vx} } } */
+ /* { dg-final { scan-assembler-not {vwmulu.vx} } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c	Sun Sep 21 22:33:18 2025
***************
*** 3,13 ****
--- 3,16 ----
  
  #include "vx_binary.h"
  #include "vx_ternary.h"
+ #include "vx_widen.h"
  
  #define T uint64_t
+ #define NT uint32_t
  
  TEST_BINARY_VX_UNSIGNED_0(T)
  TEST_TERNARY_VX_UNSIGNED_0(T)
+ TEST_WIDEN_BINARY_VX_UNSIGNED(T, NT)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
*************** TEST_TERNARY_VX_UNSIGNED_0(T)
*** 26,28 ****
--- 29,34 ----
  /* { dg-final { scan-assembler-not {vnmsac.vx} } } */
  /* { dg-final { scan-assembler-not {vmadd.vx} } } */
  /* { dg-final { scan-assembler-not {vnmsub.vx} } } */
+ /* { dg-final { scan-assembler-not {vwaddu.vx} } } */
+ /* { dg-final { scan-assembler-not {vwsubu.vx} } } */
+ /* { dg-final { scan-assembler-not {vwmulu.vx} } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vwaddu-run-1-u64.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vwaddu-run-1-u64.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vwaddu-run-1-u64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vwaddu-run-1-u64.c	Sun Sep 21 22:33:18 2025
***************
*** 0 ****
--- 1,18 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */
+ 
+ #include "vx_widen.h"
+ #include "vx_widen_data.h"
+ 
+ #define WT        uint64_t
+ #define NT        uint32_t
+ #define NAME      add
+ #define TEST_DATA DEF_BINARY_WIDEN_STRUCT_0_VAR_WRAP(WT, NT, NAME)
+ #define DATA_TYPE DEF_BINARY_WIDEN_STRUCT_0_TYPE_WRAP(WT, NT, NAME)
+ 
+ DEF_VX_WIDEN_BINARY_CASE_0_WRAP(WT, NT, +, NAME)
+ 
+ #define TEST_RUN(WT, NT, NAME, vd, vs2, rs1, N) \
+   RUN_VX_WIDEN_BINARY_CASE_0_WRAP(WT, NT, NAME, vd, vs2, rs1, N)
+ 
+ #include "vx_widen_vx_run.h"
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vwmulu-run-1-u64.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vwmulu-run-1-u64.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vwmulu-run-1-u64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vwmulu-run-1-u64.c	Sun Sep 21 22:33:18 2025
***************
*** 0 ****
--- 1,18 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */
+ 
+ #include "vx_widen.h"
+ #include "vx_widen_data.h"
+ 
+ #define WT        uint64_t
+ #define NT        uint32_t
+ #define NAME      mul
+ #define TEST_DATA DEF_BINARY_WIDEN_STRUCT_0_VAR_WRAP(WT, NT, NAME)
+ #define DATA_TYPE DEF_BINARY_WIDEN_STRUCT_0_TYPE_WRAP(WT, NT, NAME)
+ 
+ DEF_VX_WIDEN_BINARY_CASE_0_WRAP(WT, NT, *, NAME)
+ 
+ #define TEST_RUN(WT, NT, NAME, vd, vs2, rs1, N) \
+   RUN_VX_WIDEN_BINARY_CASE_0_WRAP(WT, NT, NAME, vd, vs2, rs1, N)
+ 
+ #include "vx_widen_vx_run.h"
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vwsubu-run-1-u64.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vwsubu-run-1-u64.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vwsubu-run-1-u64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vwsubu-run-1-u64.c	Sun Sep 21 22:33:18 2025
***************
*** 0 ****
--- 1,18 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */
+ 
+ #include "vx_widen.h"
+ #include "vx_widen_data.h"
+ 
+ #define WT        uint64_t
+ #define NT        uint32_t
+ #define NAME      sub
+ #define TEST_DATA DEF_BINARY_WIDEN_STRUCT_0_VAR_WRAP(WT, NT, NAME)
+ #define DATA_TYPE DEF_BINARY_WIDEN_STRUCT_0_TYPE_WRAP(WT, NT, NAME)
+ 
+ DEF_VX_WIDEN_BINARY_CASE_0_WRAP(WT, NT, -, NAME)
+ 
+ #define TEST_RUN(WT, NT, NAME, vd, vs2, rs1, N) \
+   RUN_VX_WIDEN_BINARY_CASE_0_WRAP(WT, NT, NAME, vd, vs2, rs1, N)
+ 
+ #include "vx_widen_vx_run.h"
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_widen.h gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_widen.h
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_widen.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_widen.h	Sun Sep 21 22:33:18 2025
***************
*** 0 ****
--- 1,36 ----
+ #ifndef HAVE_DEFINED_VX_VF_BINARY_WIDEN_H
+ #define HAVE_DEFINED_VX_VF_BINARY_WIDEN_H
+ 
+ #include <stdint.h>
+ 
+ #undef HAS_INT128
+ 
+ #if __riscv_xlen == 64
+ #define HAS_INT128
+ typedef unsigned __int128 uint128_t;
+ typedef signed __int128 int128_t;
+ #endif
+ 
+ #define DEF_VX_WIDEN_BINARY_CASE_0(WT, NT, OP, NAME)                    \
+ void                                                                    \
+ test_vx_widen_binary_##NAME##_##WT##_##NT##_case_0 (WT * restrict vd,   \
+ 						    NT * restrict vs2,  \
+ 						    NT rs1, unsigned n) \
+ {                                                                       \
+   for (unsigned i = 0; i < n; i++)                                      \
+     vd[i] = (WT)vs2[i] OP (WT)rs1;                                      \
+ }
+ 
+ #define DEF_VX_WIDEN_BINARY_CASE_0_WRAP(WT, NT, OP, NAME) \
+   DEF_VX_WIDEN_BINARY_CASE_0(WT, NT, OP, NAME)
+ #define RUN_VX_WIDEN_BINARY_CASE_0(WT, NT, NAME, vd, vs2, rs1, n) \
+   test_vx_widen_binary_##NAME##_##WT##_##NT##_case_0(vd, vs2, rs1, n)
+ #define RUN_VX_WIDEN_BINARY_CASE_0_WRAP(WT, NT, NAME, vd, vs2, rs1, n) \
+   RUN_VX_WIDEN_BINARY_CASE_0(WT, NT, NAME, vd, vs2, rs1, n)
+ 
+ #define TEST_WIDEN_BINARY_VX_UNSIGNED(WT, NT)     \
+   DEF_VX_WIDEN_BINARY_CASE_0_WRAP(WT, NT, +, add) \
+   DEF_VX_WIDEN_BINARY_CASE_0_WRAP(WT, NT, -, sub) \
+   DEF_VX_WIDEN_BINARY_CASE_0_WRAP(WT, NT, *, mul) \
+ 
+ #endif
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_widen_data.h gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_widen_data.h
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_widen_data.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_widen_data.h	Sun Sep 21 22:33:18 2025
***************
*** 0 ****
--- 1,159 ----
+ #ifndef HAVE_DEFINED_VX_WIDEN_DATA_H
+ #define HAVE_DEFINED_VX_WIDEN_DATA_H
+ 
+ #define N 16
+ 
+ #define DEF_BINARY_WIDEN_STRUCT_0_NAME(WT, NT, NAME) \
+   binary_widen_##WT##_##NT##_##NAME##_s
+ #define DEF_BINARY_WIDEN_STRUCT_0_NAME_WRAP(WT, NT, NAME) \
+   DEF_BINARY_WIDEN_STRUCT_0_NAME(WT, NT, NAME)
+ 
+ #define DEF_BINARY_WIDEN_STRUCT_0_TYPE(WT, NT, NAME) \
+   struct DEF_BINARY_WIDEN_STRUCT_0_NAME_WRAP(WT, NT, NAME)
+ #define DEF_BINARY_WIDEN_STRUCT_0_TYPE_WRAP(WT, NT, NAME) \
+   DEF_BINARY_WIDEN_STRUCT_0_TYPE(WT, NT, NAME)
+ 
+ #define DEF_BINARY_WIDEN_STRUCT_0_VAR(WT, NT, NAME) \
+   binary_widen_##WT##_##NT##_##NAME##_data
+ #define DEF_BINARY_WIDEN_STRUCT_0_VAR_WRAP(WT, NT, NAME) \
+   DEF_BINARY_WIDEN_STRUCT_0_VAR(WT, NT, NAME)
+ 
+ #define DEF_BINARY_WIDEN_STRUCT_0_DECL(WT, NT, NAME) \
+   DEF_BINARY_WIDEN_STRUCT_0_TYPE_WRAP(WT, NT, NAME)  \
+   DEF_BINARY_WIDEN_STRUCT_0_VAR_WRAP(WT, NT, NAME)
+ #define DEF_BINARY_WIDEN_STRUCT_0_DECL_WRAP(WT, NT, NAME) \
+   DEF_BINARY_WIDEN_STRUCT_0_DECL(WT, NT, NAME)
+ 
+ #define DEF_BINARY_WIDEN_STRUCT_0(WT, NT, NAME)            \
+   DEF_BINARY_WIDEN_STRUCT_0_TYPE_WRAP(WT, NT, NAME)        \
+     {                                                      \
+       NT vs2[N];                                           \
+       NT rs1;                                              \
+       WT expect[N];                                        \
+       WT vd[N];                                            \
+     };
+ #define DEF_BINARY_WIDEN_STRUCT_0_WRAP(WT, NT, NAME)       \
+   DEF_BINARY_WIDEN_STRUCT_0(WT, NT, NAME)
+ 
+ DEF_BINARY_WIDEN_STRUCT_0_WRAP(uint64_t, uint32_t, add)
+ DEF_BINARY_WIDEN_STRUCT_0_WRAP(uint64_t, uint32_t, sub)
+ DEF_BINARY_WIDEN_STRUCT_0_WRAP(uint64_t, uint32_t, mul)
+ 
+ DEF_BINARY_WIDEN_STRUCT_0_DECL_WRAP(uint64_t, uint32_t, add)[] = {
+   {
+     /* vs2 */
+     {
+                1,          1,          1,          1,
+                0,          0,          0,          0,
+       2147483647, 2147483647, 2147483647, 2147483647,
+       2147483648, 2147483648, 2147483648, 2147483648,
+     },
+     /* rs1 */
+     2147483647,
+     /* expect */
+     {
+       2147483648, 2147483648, 2147483648, 2147483648,
+       2147483647, 2147483647, 2147483647, 2147483647,
+       4294967294, 4294967294, 4294967294, 4294967294,
+       4294967295, 4294967295, 4294967295, 4294967295,
+     },
+   },
+   {
+     /* vs2 */
+     {
+                1,          1,          1,          1,
+                0,          0,          0,          0,
+       4294967295, 4294967295, 4294967295, 4294967295,
+       4294967294, 4294967294, 4294967294, 4294967294,
+     },
+     /* rs1 */
+     4294967295,
+     /* expect */
+     {
+       4294967296ull, 4294967296ull, 4294967296ull, 4294967296ull,
+       4294967295ull, 4294967295ull, 4294967295ull, 4294967295ull,
+       8589934590ull, 8589934590ull, 8589934590ull, 8589934590ull,
+       8589934589ull, 8589934589ull, 8589934589ull, 8589934589ull,
+     },
+   },
+ };
+ 
+ DEF_BINARY_WIDEN_STRUCT_0_DECL_WRAP(uint64_t, uint32_t, sub)[] = {
+   {
+     /* vs2 */
+     {
+       2147483648, 2147483648, 2147483648, 2147483648,
+       2147483647, 2147483647, 2147483647, 2147483647,
+       4294967294, 4294967294, 4294967294, 4294967294,
+       4294967295, 4294967295, 4294967295, 4294967295,
+     },
+     /* rs1 */
+     2147483647,
+     /* expect */
+     {
+                1,          1,          1,          1,
+                0,          0,          0,          0,
+       2147483647, 2147483647, 2147483647, 2147483647,
+       2147483648, 2147483648, 2147483648, 2147483648,
+     },
+   },
+   {
+     /* vs2 */
+     {
+       4294967295ull, 4294967295ull, 4294967295ull, 4294967295ull,
+       4294967294ull, 4294967294ull, 4294967294ull, 4294967294ull,
+                   1,             1,             1,             1,
+                   0,             0,             0,             0,
+     },
+     /* rs1 */
+     4294967295,
+     /* expect */
+     {
+                            0,                       0,                       0,                       0,
+      18446744073709551615ull, 18446744073709551615ull, 18446744073709551615ull, 18446744073709551615ull,
+      18446744069414584322ull, 18446744069414584322ull, 18446744069414584322ull, 18446744069414584322ull, 
+      18446744069414584321ull, 18446744069414584321ull, 18446744069414584321ull, 18446744069414584321ull, 
+     },
+   },
+ };
+ 
+ DEF_BINARY_WIDEN_STRUCT_0_DECL_WRAP(uint64_t, uint32_t, mul)[] = {
+   {
+     /* vs2 */
+     {
+       1, 1, 1, 1,
+       0, 0, 0, 0,
+       2, 2, 2, 2,
+       9, 9, 9, 9,
+     },
+     /* rs1 */
+     2147483647,
+     /* expect */
+     {
+           2147483647,     2147483647,     2147483647,     2147483647,
+                    0,              0,              0,              0,
+           4294967294,     4294967294,     4294967294,     4294967294,
+       19327352823ull, 19327352823ull, 19327352823ull, 19327352823ull,
+     },
+   },
+   {
+     /* vs2 */
+     {
+                   1,             1,             1,             1,
+                   0,             0,             0,             0,
+       4294967295ull, 4294967295ull, 4294967295ull, 4294967295ull,
+       4294967294ull, 4294967294ull, 4294967294ull, 4294967294ull,
+     },
+     /* rs1 */
+     4294967295,
+     /* expect */
+     {
+                 4294967295ull,           4294967295ull,           4294967295ull,           4294967295ull,
+                             0,                       0,                       0,                       0,
+       18446744065119617025ull, 18446744065119617025ull, 18446744065119617025ull, 18446744065119617025ull,
+       18446744060824649730ull, 18446744060824649730ull, 18446744060824649730ull, 18446744060824649730ull,
+     },
+   },
+ };
+ 
+ #endif
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_widen_vx_run.h gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_widen_vx_run.h
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_widen_vx_run.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_widen_vx_run.h	Sun Sep 21 22:33:18 2025
***************
*** 0 ****
--- 1,27 ----
+ #ifndef HAVE_DEFINED_VX_WIDEN_RUN_H
+ #define HAVE_DEFINED_VX_WIDEN_RUN_H
+ 
+ int
+ main ()
+ {
+   unsigned i, k;
+ 
+   for (i = 0; i < sizeof (TEST_DATA) / sizeof (TEST_DATA[0]); i++)
+     {
+       DATA_TYPE *data = &TEST_DATA[i];
+       NT *vs2 = data->vs2;
+       NT rs1 = data->rs1;
+       WT *expect = data->expect;
+       WT *vd = data->vd;
+ 
+       TEST_RUN (WT, NT, NAME, vd, vs2, rs1, N);
+ 
+       for (k = 0; k < N; k++)
+ 	if (vd[k] != expect[k])
+ 	  __builtin_abort ();
+     }
+ 
+   return 0;
+ }
+ 
+ #endif
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/andes_vector.h gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/andes_vector.h
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/andes_vector.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/andes_vector.h	Sun Sep 21 22:33:18 2025
***************
*** 0 ****
--- 1,11 ----
+ /* Wrapper of andes_vector.h, prevent andes_vector.h including stdint.h from
+    C library, that might cause problem on testing RV32 related testcase when
+    we disable multilib.  */
+ #ifndef _ANDES_VECTOR_WRAP_H
+ 
+ #define _GCC_WRAP_STDINT_H
+ #include "stdint-gcc.h"
+ #include_next <andes_vector.h>
+ #define _ANDES_VECTOR_WRAP_H
+ 
+ #endif
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vfncvtbf16s.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vfncvtbf16s.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vfncvtbf16s.c	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vfncvtbf16s.c	Sun Sep 21 22:33:18 2025
***************
*** 2,8 ****
  /* { dg-options "-march=rv32gv_xandesvbfhcvt -mabi=ilp32 -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv32 } } } */
  /* { dg-options "-march=rv64gv_xandesvbfhcvt -mabi=lp64d -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv64 } } } */
  
! #include <andes_vector.h>
  
  vbfloat16mf4_t test_nds_vfncvt_bf16_s_bf16mf4(vfloat32mf2_t vs2, size_t vl) {
      return __riscv_nds_vfncvt_bf16_s_bf16mf4(vs2, vl);
--- 2,8 ----
  /* { dg-options "-march=rv32gv_xandesvbfhcvt -mabi=ilp32 -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv32 } } } */
  /* { dg-options "-march=rv64gv_xandesvbfhcvt -mabi=lp64d -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv64 } } } */
  
! #include "andes_vector.h"
  
  vbfloat16mf4_t test_nds_vfncvt_bf16_s_bf16mf4(vfloat32mf2_t vs2, size_t vl) {
      return __riscv_nds_vfncvt_bf16_s_bf16mf4(vs2, vl);
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vfwcvtsbf16.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vfwcvtsbf16.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vfwcvtsbf16.c	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/non-overloaded/nds_vfwcvtsbf16.c	Sun Sep 21 22:33:18 2025
***************
*** 2,8 ****
  /* { dg-options "-march=rv32gv_xandesvbfhcvt -mabi=ilp32 -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv32 } } } */
  /* { dg-options "-march=rv64gv_xandesvbfhcvt -mabi=lp64d -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv64 } } } */
  
! #include <andes_vector.h>
  
  vfloat32mf2_t test_nds_vfwcvt_s_bf16_f32mf2(vbfloat16mf4_t vs2, size_t vl) {
      return __riscv_nds_vfwcvt_s_bf16_f32mf2(vs2, vl);
--- 2,8 ----
  /* { dg-options "-march=rv32gv_xandesvbfhcvt -mabi=ilp32 -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv32 } } } */
  /* { dg-options "-march=rv64gv_xandesvbfhcvt -mabi=lp64d -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv64 } } } */
  
! #include "andes_vector.h"
  
  vfloat32mf2_t test_nds_vfwcvt_s_bf16_f32mf2(vbfloat16mf4_t vs2, size_t vl) {
      return __riscv_nds_vfwcvt_s_bf16_f32mf2(vs2, vl);
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/andes_vector.h gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/andes_vector.h
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/andes_vector.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/andes_vector.h	Sun Sep 21 22:33:18 2025
***************
*** 0 ****
--- 1,11 ----
+ /* Wrapper of andes_vector.h, prevent andes_vector.h including stdint.h from
+    C library, that might cause problem on testing RV32 related testcase when
+    we disable multilib.  */
+ #ifndef _ANDES_VECTOR_WRAP_H
+ 
+ #define _GCC_WRAP_STDINT_H
+ #include "stdint-gcc.h"
+ #include_next <andes_vector.h>
+ #define _ANDES_VECTOR_WRAP_H
+ 
+ #endif
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vfncvtbf16s.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vfncvtbf16s.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vfncvtbf16s.c	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vfncvtbf16s.c	Sun Sep 21 22:33:18 2025
***************
*** 2,8 ****
  /* { dg-options "-march=rv32gv_xandesvbfhcvt -mabi=ilp32 -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv32 } } } */
  /* { dg-options "-march=rv64gv_xandesvbfhcvt -mabi=lp64d -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv64 } } } */
  
! #include <andes_vector.h>
  
  vbfloat16mf4_t test_nds_vfncvt_bf16_s_bf16mf4(vfloat32mf2_t vs2, size_t vl) {
      return __riscv_nds_vfncvt_bf16(vs2, vl);
--- 2,8 ----
  /* { dg-options "-march=rv32gv_xandesvbfhcvt -mabi=ilp32 -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv32 } } } */
  /* { dg-options "-march=rv64gv_xandesvbfhcvt -mabi=lp64d -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv64 } } } */
  
! #include "andes_vector.h"
  
  vbfloat16mf4_t test_nds_vfncvt_bf16_s_bf16mf4(vfloat32mf2_t vs2, size_t vl) {
      return __riscv_nds_vfncvt_bf16(vs2, vl);
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vfwcvtsbf16.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vfwcvtsbf16.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vfwcvtsbf16.c	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/non-policy/overloaded/nds_vfwcvtsbf16.c	Sun Sep 21 22:33:18 2025
***************
*** 2,8 ****
  /* { dg-options "-march=rv32gv_xandesvbfhcvt -mabi=ilp32 -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv32 } } } */
  /* { dg-options "-march=rv64gv_xandesvbfhcvt -mabi=lp64d -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv64 } } } */
  
! #include <andes_vector.h>
  
  vfloat32mf2_t test_nds_vfwcvt_s_bf16_f32mf2(vbfloat16mf4_t vs2, size_t vl) {
      return __riscv_nds_vfwcvt_s(vs2, vl);
--- 2,8 ----
  /* { dg-options "-march=rv32gv_xandesvbfhcvt -mabi=ilp32 -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv32 } } } */
  /* { dg-options "-march=rv64gv_xandesvbfhcvt -mabi=lp64d -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv64 } } } */
  
! #include "andes_vector.h"
  
  vfloat32mf2_t test_nds_vfwcvt_s_bf16_f32mf2(vbfloat16mf4_t vs2, size_t vl) {
      return __riscv_nds_vfwcvt_s(vs2, vl);
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/andes_vector.h gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/andes_vector.h
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/andes_vector.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/andes_vector.h	Sun Sep 21 22:33:18 2025
***************
*** 0 ****
--- 1,11 ----
+ /* Wrapper of riscv_vector.h, prevent riscv_vector.h including stdint.h from
+    C library, that might cause problem on testing RV32 related testcase when
+    we disable multilib.  */
+ #ifndef _ANDES_VECTOR_WRAP_H
+ 
+ #define _GCC_WRAP_STDINT_H
+ #include "stdint-gcc.h"
+ #include_next <andes_vector.h>
+ #define _ANDES_VECTOR_WRAP_H
+ 
+ #endif
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vfncvtbf16s.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vfncvtbf16s.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vfncvtbf16s.c	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vfncvtbf16s.c	Sun Sep 21 22:33:18 2025
***************
*** 2,8 ****
  /* { dg-options "-march=rv32gv_xandesvbfhcvt -mabi=ilp32 -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv32 } } } */
  /* { dg-options "-march=rv64gv_xandesvbfhcvt -mabi=lp64d -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv64 } } } */
  
! #include <andes_vector.h>
  
  vbfloat16mf4_t test_nds_vfncvt_bf16_s_bf16mf4_tu(vbfloat16mf4_t vd, vfloat32mf2_t vs2, size_t vl) {
      return __riscv_nds_vfncvt_bf16_s_bf16mf4_tu(vd, vs2, vl);
--- 2,8 ----
  /* { dg-options "-march=rv32gv_xandesvbfhcvt -mabi=ilp32 -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv32 } } } */
  /* { dg-options "-march=rv64gv_xandesvbfhcvt -mabi=lp64d -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv64 } } } */
  
! #include "andes_vector.h"
  
  vbfloat16mf4_t test_nds_vfncvt_bf16_s_bf16mf4_tu(vbfloat16mf4_t vd, vfloat32mf2_t vs2, size_t vl) {
      return __riscv_nds_vfncvt_bf16_s_bf16mf4_tu(vd, vs2, vl);
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vfwcvtsbf16.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vfwcvtsbf16.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vfwcvtsbf16.c	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/non-overloaded/nds_vfwcvtsbf16.c	Sun Sep 21 22:33:18 2025
***************
*** 2,8 ****
  /* { dg-options "-march=rv32gv_xandesvbfhcvt -mabi=ilp32 -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv32 } } } */
  /* { dg-options "-march=rv64gv_xandesvbfhcvt -mabi=lp64d -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv64 } } } */
  
! #include <andes_vector.h>
  
  vfloat32mf2_t test_nds_vfwcvt_s_bf16_f32mf2_tu(vfloat32mf2_t vd, vbfloat16mf4_t vs2, size_t vl) {
      return __riscv_nds_vfwcvt_s_tu(vd, vs2, vl);
--- 2,8 ----
  /* { dg-options "-march=rv32gv_xandesvbfhcvt -mabi=ilp32 -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv32 } } } */
  /* { dg-options "-march=rv64gv_xandesvbfhcvt -mabi=lp64d -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv64 } } } */
  
! #include "andes_vector.h"
  
  vfloat32mf2_t test_nds_vfwcvt_s_bf16_f32mf2_tu(vfloat32mf2_t vd, vbfloat16mf4_t vs2, size_t vl) {
      return __riscv_nds_vfwcvt_s_tu(vd, vs2, vl);
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/andes_vector.h gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/andes_vector.h
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/andes_vector.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/andes_vector.h	Sun Sep 21 22:33:18 2025
***************
*** 0 ****
--- 1,11 ----
+ /* Wrapper of riscv_vector.h, prevent riscv_vector.h including stdint.h from
+    C library, that might cause problem on testing RV32 related testcase when
+    we disable multilib.  */
+ #ifndef _ANDES_VECTOR_WRAP_H
+ 
+ #define _GCC_WRAP_STDINT_H
+ #include "stdint-gcc.h"
+ #include_next <andes_vector.h>
+ #define _ANDES_VECTOR_WRAP_H
+ 
+ #endif
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vfncvtbf16s.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vfncvtbf16s.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vfncvtbf16s.c	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vfncvtbf16s.c	Sun Sep 21 22:33:18 2025
***************
*** 2,8 ****
  /* { dg-options "-march=rv32gv_xandesvbfhcvt -mabi=ilp32 -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv32 } } } */
  /* { dg-options "-march=rv64gv_xandesvbfhcvt -mabi=lp64d -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv64 } } } */
  
! #include <andes_vector.h>
  
  vbfloat16mf4_t test_nds_vfncvt_bf16_s_bf16mf4_tu(vbfloat16mf4_t vd, vfloat32mf2_t vs2, size_t vl) {
      return __riscv_nds_vfncvt_bf16_tu(vd, vs2, vl);
--- 2,8 ----
  /* { dg-options "-march=rv32gv_xandesvbfhcvt -mabi=ilp32 -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv32 } } } */
  /* { dg-options "-march=rv64gv_xandesvbfhcvt -mabi=lp64d -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv64 } } } */
  
! #include "andes_vector.h"
  
  vbfloat16mf4_t test_nds_vfncvt_bf16_s_bf16mf4_tu(vbfloat16mf4_t vd, vfloat32mf2_t vs2, size_t vl) {
      return __riscv_nds_vfncvt_bf16_tu(vd, vs2, vl);
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vfwcvtsbf16.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vfwcvtsbf16.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vfwcvtsbf16.c	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xandesvector/policy/overloaded/nds_vfwcvtsbf16.c	Sun Sep 21 22:33:18 2025
***************
*** 2,8 ****
  /* { dg-options "-march=rv32gv_xandesvbfhcvt -mabi=ilp32 -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv32 } } } */
  /* { dg-options "-march=rv64gv_xandesvbfhcvt -mabi=lp64d -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv64 } } } */
  
! #include <andes_vector.h>
  
  vfloat32mf2_t test_nds_vfwcvt_s_bf16_f32mf2_tu(vfloat32mf2_t vd, vbfloat16mf4_t vs2, size_t vl) {
      return __riscv_nds_vfwcvt_s_tu(vd, vs2, vl);
--- 2,8 ----
  /* { dg-options "-march=rv32gv_xandesvbfhcvt -mabi=ilp32 -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv32 } } } */
  /* { dg-options "-march=rv64gv_xandesvbfhcvt -mabi=lp64d -O3 -fno-schedule-insns -fno-schedule-insns2" { target { rv64 } } } */
  
! #include "andes_vector.h"
  
  vfloat32mf2_t test_nds_vfwcvt_s_bf16_f32mf2_tu(vfloat32mf2_t vd, vbfloat16mf4_t vs2, size_t vl) {
      return __riscv_nds_vfwcvt_s_tu(vd, vs2, vl);
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xsfvector/sifive_vector.h gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xsfvector/sifive_vector.h
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xsfvector/sifive_vector.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xsfvector/sifive_vector.h	Sun Sep 21 22:33:18 2025
***************
*** 0 ****
--- 1,11 ----
+ /* Wrapper of sifive_vector.h, prevent sifive_vector.h including stdint.h from
+    C library, that might cause problem on testing RV32 related testcase when
+    we disable multilib.  */
+ #ifndef _SIFIVE_VECTOR_WRAP_H
+ 
+ #define _GCC_WRAP_STDINT_H
+ #include "stdint-gcc.h"
+ #include_next <riscv_vector.h>
+ #define _SIFIVE_VECTOR_WRAP_H
+ 
+ #endif
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/riscv_th_vector.h gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/riscv_th_vector.h
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/riscv_th_vector.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/riscv_th_vector.h	Sun Sep 21 22:33:18 2025
***************
*** 0 ****
--- 1,11 ----
+ /* Wrapper of riscv_th_vector.h, prevent riscv_th_vector.h including stdint.h from
+    C library, that might cause problem on testing RV32 related testcase when
+    we disable multilib.  */
+ #ifndef _RISCV_TH_VECTOR_WRAP_H
+ 
+ #define _GCC_WRAP_STDINT_H
+ #include "stdint-gcc.h"
+ #include_next <riscv_th_vector.h>
+ #define _RISCV_TH_VECTOR_WRAP_H
+ 
+ #endif
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/riscv_vector.h gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/riscv_vector.h
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/riscv_vector.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/riscv_vector.h	Sun Sep 21 22:33:18 2025
***************
*** 0 ****
--- 1,11 ----
+ /* Wrapper of riscv_vector.h, prevent riscv_vector.h including stdint.h from
+    C library, that might cause problem on testing RV32 related testcase when
+    we disable multilib.  */
+ #ifndef _RISCV_VECTOR_WRAP_H
+ 
+ #define _GCC_WRAP_STDINT_H
+ #include "stdint-gcc.h"
+ #include_next <riscv_vector.h>
+ #define _RISCV_VECTOR_WRAP_H
+ 
+ #endif
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/sat_arith.h gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/sat_arith.h
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/sat_arith.h	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/sat_arith.h	Sun Sep 21 22:33:18 2025
*************** sat_u_mul_##NT##_from_##WT##_fmt_4 (NT a
*** 741,744 ****
--- 741,759 ----
    sat_u_mul_##NT##_from_##WT##_fmt_4 (a, b)
  #define RUN_SAT_U_MUL_FMT_4_WRAP(NT, WT, a, b) RUN_SAT_U_MUL_FMT_4(NT, WT, a, b)
  
+ #define DEF_SAT_U_MUL_FMT_5(NT, WT)             \
+ NT __attribute__((noinline))                    \
+ sat_u_mul_##NT##_from_##WT##_fmt_5 (NT a, NT b) \
+ {                                               \
+   WT x = (WT)a * (WT)b;                         \
+   NT hi = x >> (sizeof(NT) * 8);                \
+   NT lo = (NT)x;                                \
+   return lo | -!!hi;                            \
+ }
+ 
+ #define DEF_SAT_U_MUL_FMT_5_WRAP(NT, WT) DEF_SAT_U_MUL_FMT_5(NT, WT)
+ #define RUN_SAT_U_MUL_FMT_5(NT, WT, a, b) \
+   sat_u_mul_##NT##_from_##WT##_fmt_5 (a, b)
+ #define RUN_SAT_U_MUL_FMT_5_WRAP(NT, WT, a, b) RUN_SAT_U_MUL_FMT_5(NT, WT, a, b)
+ 
  #endif
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-6-u16-from-u128.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-6-u16-from-u128.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-6-u16-from-u128.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-6-u16-from-u128.c	Sun Sep 21 22:33:19 2025
***************
*** 0 ****
--- 1,11 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized" } */
+ 
+ #include "sat_arith.h"
+ 
+ #define NT uint16_t
+ #define WT uint128_t
+ 
+ DEF_SAT_U_MUL_FMT_5_WRAP(NT, WT)
+ 
+ /* { dg-final { scan-tree-dump-times ".SAT_MUL" 1 "optimized" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-6-u32-from-u128.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-6-u32-from-u128.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-6-u32-from-u128.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-6-u32-from-u128.c	Sun Sep 21 22:33:19 2025
***************
*** 0 ****
--- 1,11 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized" } */
+ 
+ #include "sat_arith.h"
+ 
+ #define NT uint32_t
+ #define WT uint128_t
+ 
+ DEF_SAT_U_MUL_FMT_5_WRAP(NT, WT)
+ 
+ /* { dg-final { scan-tree-dump-times ".SAT_MUL" 1 "optimized" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-6-u64-from-u128.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-6-u64-from-u128.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-6-u64-from-u128.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-6-u64-from-u128.c	Sun Sep 21 22:33:19 2025
***************
*** 0 ****
--- 1,11 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized" } */
+ 
+ #include "sat_arith.h"
+ 
+ #define NT uint64_t
+ #define WT uint128_t
+ 
+ DEF_SAT_U_MUL_FMT_5_WRAP(NT, WT)
+ 
+ /* { dg-final { scan-tree-dump-times ".SAT_MUL" 1 "optimized" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-6-u8-from-u128.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-6-u8-from-u128.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-6-u8-from-u128.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-6-u8-from-u128.c	Sun Sep 21 22:33:19 2025
***************
*** 0 ****
--- 1,11 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized" } */
+ 
+ #include "sat_arith.h"
+ 
+ #define NT uint8_t
+ #define WT uint128_t
+ 
+ DEF_SAT_U_MUL_FMT_5_WRAP(NT, WT)
+ 
+ /* { dg-final { scan-tree-dump-times ".SAT_MUL" 1 "optimized" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-6-u16-from-u128.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-6-u16-from-u128.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-6-u16-from-u128.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-6-u16-from-u128.c	Sun Sep 21 22:33:19 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { rv64 } } } */
+ /* { dg-additional-options "-std=c99" } */
+ 
+ #include "sat_arith.h"
+ #include "sat_arith_data.h"
+ 
+ #define NT               uint8_t
+ #define WT               uint128_t
+ #define NAME             usmul
+ #define DATA             TEST_BINARY_DATA_WRAP(NT, NAME)
+ #define T                TEST_BINARY_STRUCT_DECL_WRAP(NT, NAME)
+ #define RUN_BINARY(x, y) RUN_SAT_U_MUL_FMT_5_WRAP(NT, WT, x, y)
+ 
+ DEF_SAT_U_MUL_FMT_5_WRAP(NT, WT)
+ 
+ #include "scalar_sat_binary_run_xxx.h"
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-6-u32-from-u128.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-6-u32-from-u128.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-6-u32-from-u128.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-6-u32-from-u128.c	Sun Sep 21 22:33:19 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { rv64 } } } */
+ /* { dg-additional-options "-std=c99" } */
+ 
+ #include "sat_arith.h"
+ #include "sat_arith_data.h"
+ 
+ #define NT               uint32_t
+ #define WT               uint128_t
+ #define NAME             usmul
+ #define DATA             TEST_BINARY_DATA_WRAP(NT, NAME)
+ #define T                TEST_BINARY_STRUCT_DECL_WRAP(NT, NAME)
+ #define RUN_BINARY(x, y) RUN_SAT_U_MUL_FMT_5_WRAP(NT, WT, x, y)
+ 
+ DEF_SAT_U_MUL_FMT_5_WRAP(NT, WT)
+ 
+ #include "scalar_sat_binary_run_xxx.h"
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-6-u64-from-u128.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-6-u64-from-u128.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-6-u64-from-u128.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-6-u64-from-u128.c	Sun Sep 21 22:33:19 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { rv64 } } } */
+ /* { dg-additional-options "-std=c99" } */
+ 
+ #include "sat_arith.h"
+ #include "sat_arith_data.h"
+ 
+ #define NT               uint64_t
+ #define WT               uint128_t
+ #define NAME             usmul
+ #define DATA             TEST_BINARY_DATA_WRAP(NT, NAME)
+ #define T                TEST_BINARY_STRUCT_DECL_WRAP(NT, NAME)
+ #define RUN_BINARY(x, y) RUN_SAT_U_MUL_FMT_5_WRAP(NT, WT, x, y)
+ 
+ DEF_SAT_U_MUL_FMT_5_WRAP(NT, WT)
+ 
+ #include "scalar_sat_binary_run_xxx.h"
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-6-u8-from-u128.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-6-u8-from-u128.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-6-u8-from-u128.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/sat_u_mul-run-6-u8-from-u128.c	Sun Sep 21 22:33:19 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { rv64 } } } */
+ /* { dg-additional-options "-std=c99" } */
+ 
+ #include "sat_arith.h"
+ #include "sat_arith_data.h"
+ 
+ #define NT               uint8_t
+ #define WT               uint128_t
+ #define NAME             usmul
+ #define DATA             TEST_BINARY_DATA_WRAP(NT, NAME)
+ #define T                TEST_BINARY_STRUCT_DECL_WRAP(NT, NAME)
+ #define RUN_BINARY(x, y) RUN_SAT_U_MUL_FMT_5_WRAP(NT, WT, x, y)
+ 
+ DEF_SAT_U_MUL_FMT_5_WRAP(NT, WT)
+ 
+ #include "scalar_sat_binary_run_xxx.h"
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/widen-mul-0.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/widen-mul-0.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/widen-mul-0.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/widen-mul-0.c	Sun Sep 21 22:33:19 2025
***************
*** 0 ****
--- 1,8 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized" } */
+ 
+ #include "widen-mul.h"
+ 
+ SAT_U_MUL_FMT_5(uint8_t, uint128_t)
+ 
+ /* { dg-final { scan-tree-dump-not " = (__int128 unsigned) " "optimized" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/widen-mul-1.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/widen-mul-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/widen-mul-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/widen-mul-1.c	Sun Sep 21 22:33:19 2025
***************
*** 0 ****
--- 1,8 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized" } */
+ 
+ #include "widen-mul.h"
+ 
+ SAT_U_MUL_FMT_5(uint16_t, uint128_t)
+ 
+ /* { dg-final { scan-tree-dump-not " = (__int128 unsigned) " "optimized" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/widen-mul-2.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/widen-mul-2.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/widen-mul-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/widen-mul-2.c	Sun Sep 21 22:33:19 2025
***************
*** 0 ****
--- 1,8 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized" } */
+ 
+ #include "widen-mul.h"
+ 
+ SAT_U_MUL_FMT_5(uint32_t, uint128_t)
+ 
+ /* { dg-final { scan-tree-dump-not " = (__int128 unsigned) " "optimized" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/widen-mul-3.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/widen-mul-3.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/widen-mul-3.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/widen-mul-3.c	Sun Sep 21 22:33:19 2025
***************
*** 0 ****
--- 1,8 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized" } */
+ 
+ #include "widen-mul.h"
+ 
+ SAT_U_MUL_FMT_5(uint64_t, uint128_t)
+ 
+ /* { dg-final { scan-tree-dump-not " = (__int128 unsigned) " "optimized" } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/widen-mul.h gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/widen-mul.h
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/sat/widen-mul.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/sat/widen-mul.h	Sun Sep 21 22:33:19 2025
***************
*** 0 ****
--- 1,15 ----
+ #include <stdint.h>
+ 
+ #if __riscv_xlen == 64
+ typedef unsigned __int128 uint128_t;
+ #endif
+ 
+ #define SAT_U_MUL_FMT_5(NT, WT)                 \
+ NT __attribute__((noinline))                    \
+ sat_u_mul_##NT##_from_##WT##_fmt_5 (NT a, NT b) \
+ {                                               \
+   WT x = (WT)a * (WT)b;                         \
+   NT hi = x >> (sizeof(NT) * 8);                \
+   NT lo = (NT)x;                                \
+   return lo | -!!hi;                            \
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/riscv/save-restore-cfi-3.c gcc-16-20250921/gcc/testsuite/gcc.target/riscv/save-restore-cfi-3.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/riscv/save-restore-cfi-3.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gcc.target/riscv/save-restore-cfi-3.c	Sun Sep 21 22:33:19 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do compile } */
+ /* { dg-options "-g -Os -march=rv32e -mabi=ilp32e -msave-restore" } */
+ /* { dg-skip-if "" { *-*-* } {"-O2" "-O1" "-O0" "-Og" "-O3" "-Oz" "-flto"} } */
+ /* { dg-final { scan-assembler-times {\.cfi_offset 8, -8} 1} } */
+ /* { dg-final { scan-assembler-times {\.cfi_offset 1, -4} 1} } */
+ /* { dg-final { scan-assembler-times {\.cfi_def_cfa_offset 8} 1} } */
+ /* { dg-final { scan-assembler-times {\.cfi_restore 8} 1} } */
+ /* { dg-final { scan-assembler-times {\.cfi_restore 1} 1} } */
+ /* { dg-final { scan-assembler-times {\.cfi_def_cfa_offset 0} 1} } */
+ 
+ int my_getint();
+ 
+ int foo(int x)
+ {
+   return x + my_getint();
+ }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/s390/arch13/bitops-1.c gcc-16-20250921/gcc/testsuite/gcc.target/s390/arch13/bitops-1.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/s390/arch13/bitops-1.c	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/s390/arch13/bitops-1.c	Sun Sep 21 22:33:19 2025
***************
*** 2,11 ****
  
  /* and with complement */
  
! int
  ncrk (int a, int b)
  {
!   return a & ~b;
  }
  
  /* { dg-final { scan-assembler-times "\tncrk\t" 1 } } */
--- 2,13 ----
  
  /* and with complement */
  
! int i32;
! 
! void
  ncrk (int a, int b)
  {
!   i32 = a & ~b;
  }
  
  /* { dg-final { scan-assembler-times "\tncrk\t" 1 } } */
*************** ncgrk (long long a, long long b)
*** 20,29 ****
  
  /* or with complement */
  
! int
  ocrk (int a, int b)
  {
!   return a | ~b;
  }
  
  /* { dg-final { scan-assembler-times "\tocrk\t" 1 } } */
--- 22,31 ----
  
  /* or with complement */
  
! void
  ocrk (int a, int b)
  {
!   i32 = a | ~b;
  }
  
  /* { dg-final { scan-assembler-times "\tocrk\t" 1 } } */
*************** ocgrk (long long a, long long b)
*** 38,47 ****
  
  /* nand */
  
! int
  nnrk (int a, int b)
  {
!   return ~(a & b);
  }
  
  /* { dg-final { scan-assembler-times "\tnnrk\t" 1 } } */
--- 40,49 ----
  
  /* nand */
  
! void
  nnrk (int a, int b)
  {
!   i32 = ~(a & b);
  }
  
  /* { dg-final { scan-assembler-times "\tnnrk\t" 1 } } */
*************** nngrk (long long a, long long b)
*** 56,65 ****
  
  /* nor */
  
! int
  nork (int a, int b)
  {
!   return ~(a | b);
  }
  
  /* { dg-final { scan-assembler-times "\tnork\t" 1 } } */
--- 58,67 ----
  
  /* nor */
  
! void
  nork (int a, int b)
  {
!   i32 = ~(a | b);
  }
  
  /* { dg-final { scan-assembler-times "\tnork\t" 1 } } */
*************** nogrk (long long a, long long b)
*** 74,83 ****
  
  /* nxor */
  
! int
  nxrk (int a, int b)
  {
!   return ~(a ^ b);
  }
  
  /* { dg-final { scan-assembler-times "\tnxrk\t" 1 } } */
--- 76,85 ----
  
  /* nxor */
  
! void
  nxrk (int a, int b)
  {
!   i32 = ~(a ^ b);
  }
  
  /* { dg-final { scan-assembler-times "\tnxrk\t" 1 } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/s390/arch13/bitops-2.c gcc-16-20250921/gcc/testsuite/gcc.target/s390/arch13/bitops-2.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/s390/arch13/bitops-2.c	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/s390/arch13/bitops-2.c	Sun Sep 21 22:33:19 2025
***************
*** 4,9 ****
--- 4,11 ----
  
  /* and with complement */
  
+ int i32;
+ 
  int
  ncrk (int a, int b)
  {
*************** nngrk (long long a, long long b)
*** 58,67 ****
  
  /* nor */
  
! int
  nork (int a, int b)
  {
!   return ~(a | b);
  }
  
  /* { dg-final { scan-assembler-times "\tnork\t" 1 } } */
--- 60,69 ----
  
  /* nor */
  
! void
  nork (int a, int b)
  {
!   i32 = ~(a | b);
  }
  
  /* { dg-final { scan-assembler-times "\tnork\t" 1 } } */
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gcc.target/s390/md/andc-splitter-2.c gcc-16-20250921/gcc/testsuite/gcc.target/s390/md/andc-splitter-2.c
*** gcc-16-20250914/gcc/testsuite/gcc.target/s390/md/andc-splitter-2.c	Sun Sep 14 22:32:31 2025
--- gcc-16-20250921/gcc/testsuite/gcc.target/s390/md/andc-splitter-2.c	Sun Sep 21 22:33:19 2025
*************** unsigned int andc_pp(unsigned int *a, un
*** 37,44 ****
  /* { dg-final { scan-assembler ":36:.\* \{\\*andsi3_\(esa\|zarch\)\}" } } */
  /* { dg-final { scan-assembler ":36:.\* \{\\*xorsi3\}" } } */
  
! /* { dg-final { scan-assembler-times "\tnr\?k\?\t" 4 } } */
! /* { dg-final { scan-assembler-times "\txr\?k\?\t" 4 } } */
  
  int
  main (void)
--- 37,44 ----
  /* { dg-final { scan-assembler ":36:.\* \{\\*andsi3_\(esa\|zarch\)\}" } } */
  /* { dg-final { scan-assembler ":36:.\* \{\\*xorsi3\}" } } */
  
! /* { dg-final { scan-assembler-times "\tng\?r\?k\?\t" 4 } } */
! /* { dg-final { scan-assembler-times "\txg\?r\?k\?\t" 4 } } */
  
  int
  main (void)
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gfortran.dg/deferred_character_39.f90 gcc-16-20250921/gcc/testsuite/gfortran.dg/deferred_character_39.f90
*** gcc-16-20250914/gcc/testsuite/gfortran.dg/deferred_character_39.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gfortran.dg/deferred_character_39.f90	Sun Sep 21 22:33:22 2025
***************
*** 0 ****
--- 1,239 ----
+ ! { dg-do run }
+ ! PR fortran/108581 - issues with rank-2 deferred-length character arrays
+ 
+ program p
+   call pr108581
+   call test2
+ end
+ 
+ ! Derived from original testcase
+ subroutine pr108581
+   integer, parameter :: xmin = 0, xmax = 0
+   integer, parameter :: ymin = 0, ymax = 1
+   integer, parameter :: l = 2
+   integer            :: x, y
+   character(8)       :: line1, line2, line3
+   character(*),   parameter :: expect(ymin:ymax) = ['A.','B*']
+   character(len=:), pointer :: a(:,:) => NULL()
+ 
+   allocate (character(len=l) :: a(xmin:xmax, ymin:ymax))
+   a(xmin:xmax, ymin) = expect(ymin)
+   a(xmin:xmax, ymax) = expect(ymax)
+ 
+   do y = ymin, ymax
+      write(line1,'(4A)') (a(x, y), x = xmin, xmax)
+      write(line2,'(4A)')  a(xmin:xmax, y)
+      write(line3,'(4A)')  a(    :    , y)
+      if (line1 /= expect(y) .or. &
+          line2 /= expect(y) .or. &
+          line3 /= expect(y)      ) then
+         write(*,*) (a(x, y), x = xmin, xmax)
+         write(*,*)  a(xmin:xmax, y)
+         write(*,*)  a(    :    , y)
+         stop 1 + y
+      end if
+   enddo
+   call chk (a)
+   deallocate (a)
+ contains
+   subroutine chk (z)
+     character(len=:), pointer :: z(:,:)
+     integer :: y
+     do y = lbound(z,2), ubound (z,2)
+        write(line2,'(4A)')  z(xmin:xmax, y)
+        write(line3,'(4A)')  z(    :    , y)
+        if (line2 /= expect(y) .or. &
+            line3 /= expect(y)      ) then
+           write(*,*) z(xmin:xmax, y)
+           write(*,*) z(    :    , y)
+           stop 5 + y
+        end if
+     enddo
+   end subroutine chk
+ end
+ 
+ ! Exercise character kinds, strides, ...
+ subroutine test2
+   implicit none
+   integer, parameter :: l = 3
+   integer            :: i
+ 
+   character(len=l,kind=1), parameter :: str1(*) = &
+        [   "123",   "456",   "789",   "0AB" ]
+   character(len=l,kind=4), parameter :: str4(*) = &
+        [ 4_"123", 4_"456", 4_"789", 4_"0AB" ]
+ 
+   character(len=l,kind=1), parameter :: str2(*,*) = &
+        reshape ([(str1(i),str1(5-i),i=1,4)], shape=[2,4])
+   character(len=l,kind=4), parameter :: str5(*,*) = &
+        reshape ([(str4(i),str4(5-i),i=1,4)], shape=[2,4])
+ 
+   character(len=l,kind=1), pointer :: a(:,:) => NULL(), e(:,:) => NULL()
+   character(len=:,kind=1), pointer :: b(:,:) => NULL(), f(:,:) => NULL()
+   character(len=l,kind=4), pointer :: c(:,:) => NULL(), g(:,:) => NULL()
+   character(len=:,kind=4), pointer :: d(:,:) => NULL(), h(:,:) => NULL()
+ 
+   character(len=16) :: s0, s1, s2, s3, s4
+ 
+   ! Simple case: shape=[1,4]
+   allocate (a, source = reshape (str1,[1,size(str1)]))
+   allocate (b, source = reshape (str1,[1,size(str1)]))
+   allocate (c, source = reshape (str4,[1,size(str4)]))
+ ! allocate (d, source=c)        ! ICE, tracked as pr121939
+   d => c
+   ! Positive non-unit stride
+   s0 = concat (str1(1::2))
+   write(s1,'(4A)') a(1,1::2)
+   write(s2,'(4A)') b(1,1::2)
+   write(s3,'(4A)') c(1,1::2)
+   write(s4,'(4A)') d(1,1::2)
+ ! print *, s0, s1, s2, s3, s4
+   if (s1 /= s0) stop 11
+   if (s2 /= s0) stop 12
+   if (s3 /= s0) stop 13
+   if (s4 /= s0) stop 14
+   s0 = concat (str1(2::2))
+   write(s1,'(4A)') a(1,2::2)
+   write(s2,'(4A)') b(1,2::2)
+   write(s3,'(4A)') c(1,2::2)
+   write(s4,'(4A)') d(1,2::2)
+ ! print *, s0, s1, s2, s3, s4
+   if (s1 /= s0) stop 15
+   if (s2 /= s0) stop 16
+   if (s3 /= s0) stop 17
+   if (s4 /= s0) stop 18
+ 
+   ! Negative non-unit stride
+   s0 = concat (str1(3:1:-2))
+   write(s1,'(4A)') a(1,3:1:-2)
+   write(s2,'(4A)') b(1,3:1:-2)
+   write(s3,'(4A)') c(1,3:1:-2)
+   write(s4,'(4A)') d(1,3:1:-2)
+ ! print *, s0, s1, s2, s3, s4
+   if (s1 /= s0) stop 21
+   if (s2 /= s0) stop 22
+   if (s3 /= s0) stop 23
+   if (s4 /= s0) stop 24
+   s0 = concat (str1(4:1:-2))
+   write(s1,'(4A)') a(1,4:1:-2)
+   write(s2,'(4A)') b(1,4:1:-2)
+   write(s3,'(4A)') c(1,4:1:-2)
+   write(s4,'(4A)') d(1,4:1:-2)
+ ! print *, s0, s1, s2, s3, s4
+   if (s1 /= s0) stop 25
+   if (s2 /= s0) stop 26
+   if (s3 /= s0) stop 27
+   if (s4 /= s0) stop 28
+   deallocate (a,b,c)
+ 
+   ! More complex cases with shape=[2,4]
+   allocate (e, source = reshape (str2,[2,size(str2,2)]))
+   allocate (f, source = reshape (str2,[2,size(str2,2)]))
+   allocate (g, source = reshape (str5,[2,size(str5,2)]))
+   h => g
+   s0 = concat (str2(1,3:1:-2))
+   write(s1,'(4A)') e(1,3:1:-2)
+   write(s2,'(4A)') f(1,3:1:-2)
+   write(s3,'(4A)') g(1,3:1:-2)
+   write(s4,'(4A)') h(1,3:1:-2)
+ ! print *, s0, s1, s2, s3, s4
+   if (s1 /= s0) stop 31
+   if (s2 /= s0) stop 32
+   if (s3 /= s0) stop 33
+   if (s4 /= s0) stop 34
+   s0 = concat (str2(1,4:1:-2))
+   write(s1,'(4A)') e(1,4:1:-2)
+   write(s2,'(4A)') f(1,4:1:-2)
+   write(s3,'(4A)') g(1,4:1:-2)
+   write(s4,'(4A)') h(1,4:1:-2)
+ ! print *, s0, s1, s2, s3, s4
+   if (s1 /= s0) stop 35
+   if (s2 /= s0) stop 36
+   if (s3 /= s0) stop 37
+   if (s4 /= s0) stop 38
+ 
+   s0 = concat (str2(2,3:1:-2))
+   write(s1,'(4A)') e(2,3:1:-2)
+   write(s2,'(4A)') f(2,3:1:-2)
+   write(s3,'(4A)') g(2,3:1:-2)
+   write(s4,'(4A)') h(2,3:1:-2)
+ ! print *, s0, s1, s2, s3, s4
+   if (s1 /= s0) stop 41
+   if (s2 /= s0) stop 42
+   if (s3 /= s0) stop 43
+   if (s4 /= s0) stop 44
+   s0 = concat (str2(2,4:1:-2))
+   write(s1,'(4A)') e(2,4:1:-2)
+   write(s2,'(4A)') f(2,4:1:-2)
+   write(s3,'(4A)') g(2,4:1:-2)
+   write(s4,'(4A)') h(2,4:1:-2)
+ ! print *, s0, s1, s2, s3, s4
+   if (s1 /= s0) stop 45
+   if (s2 /= s0) stop 46
+   if (s3 /= s0) stop 47
+   if (s4 /= s0) stop 48
+ 
+   ! Check pointer association with negative stride
+   a => e(2:1:-1,4:1:-1)
+   b => f(2:1:-1,4:1:-1)
+   c => g(2:1:-1,4:1:-1)
+   d => h(2:1:-1,4:1:-1)
+ 
+   s0 = concat (str2(2,4:1:-2))
+   write(s1,'(4A)') a(1,1::2)
+   write(s2,'(4A)') b(1,1::2)
+   write(s3,'(4A)') c(1,1::2)
+   write(s4,'(4A)') d(1,1::2)
+ ! print *, s0, s1, s2, s3, s4
+   if (s1 /= s0) stop 51
+   if (s2 /= s0) stop 52
+   if (s3 /= s0) stop 53
+   if (s4 /= s0) stop 54
+   s0 = concat (str2(2,3:1:-2))
+   write(s1,'(4A)') a(1,2::2)
+   write(s2,'(4A)') b(1,2::2)
+   write(s3,'(4A)') c(1,2::2)
+   write(s4,'(4A)') d(1,2::2)
+ ! print *, s0, s1, s2, s3, s4
+   if (s1 /= s0) stop 55
+   if (s2 /= s0) stop 56
+   if (s3 /= s0) stop 57
+   if (s4 /= s0) stop 58
+ 
+   s0 = concat (str2(1,4:1:-2))
+   write(s1,'(4A)') a(2,1::2)
+   write(s2,'(4A)') b(2,1::2)
+   write(s3,'(4A)') c(2,1::2)
+   write(s4,'(4A)') d(2,1::2)
+ ! print *, s0, s1, s2, s3, s4
+   if (s1 /= s0) stop 61
+   if (s2 /= s0) stop 62
+   if (s3 /= s0) stop 63
+   if (s4 /= s0) stop 64
+   s0 = concat (str2(1,3:1:-2))
+   write(s1,'(4A)') a(2,2::2)
+   write(s2,'(4A)') b(2,2::2)
+   write(s3,'(4A)') c(2,2::2)
+   write(s4,'(4A)') d(2,2::2)
+ ! print *, s0, s1, s2, s3, s4
+   if (s1 /= s0) stop 65
+   if (s2 /= s0) stop 66
+   if (s3 /= s0) stop 67
+   if (s4 /= s0) stop 68
+   deallocate (e,f,g)
+ 
+ contains
+ 
+   ! Helper function to concatenate string array to scalar string
+   function concat (s)
+     character(len=:), allocatable :: concat
+     character(len=*), intent(in)  :: s(:)
+     integer :: i, l, n
+     n = size (s)
+     l = len  (s)
+     allocate (character(len=l*n) :: concat)
+     do i = 1, n
+        concat(1+(i-1)*l:i*l) = s(i)
+     end do
+   end function concat
+ end
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gfortran.dg/matmul_blas_3.f90 gcc-16-20250921/gcc/testsuite/gfortran.dg/matmul_blas_3.f90
*** gcc-16-20250914/gcc/testsuite/gfortran.dg/matmul_blas_3.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gfortran.dg/matmul_blas_3.f90	Sun Sep 21 22:33:24 2025
***************
*** 0 ****
--- 1,13 ----
+ ! { dg-do compile }
+ ! { dg-options "-ffrontend-optimize -fexternal-blas64 -fdump-tree-original" }
+ ! { dg-require-effective-target lp64 }
+ ! PR 121161 - option for 64-bit BLAS for MATMUL.
+ ! Check this by making sure there is no KIND=4 integer.
+ subroutine foo(a,b,c,n)
+   implicit none
+   integer(kind=8) :: n
+   real, dimension(n,n) :: a, b, c
+   c = matmul(a,b)
+ end subroutine foo
+ ! { dg-final { scan-tree-dump-not "integer\\(kind=4\\)" "original" } }
+ ! { dg-final { scan-tree-dump-times "sgemm" 1 "original" } }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gfortran.dg/pdt_17.f03 gcc-16-20250921/gcc/testsuite/gfortran.dg/pdt_17.f03
*** gcc-16-20250914/gcc/testsuite/gfortran.dg/pdt_17.f03	Sun Sep 14 22:32:32 2025
--- gcc-16-20250921/gcc/testsuite/gfortran.dg/pdt_17.f03	Sun Sep 21 22:33:24 2025
***************
*** 6,11 ****
  !
  program p
     type t(a)                   ! { dg-error "does not have a component" }
!       integer(kind=t()) :: x   ! { dg-error "used before it is defined" }
     end type
  end
--- 6,11 ----
  !
  program p
     type t(a)                   ! { dg-error "does not have a component" }
!       integer(kind=t()) :: x   ! { dg-error "Expected initialization expression" }
     end type
  end
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gfortran.dg/pdt_3.f03 gcc-16-20250921/gcc/testsuite/gfortran.dg/pdt_3.f03
*** gcc-16-20250914/gcc/testsuite/gfortran.dg/pdt_3.f03	Sun Sep 14 22:32:32 2025
--- gcc-16-20250921/gcc/testsuite/gfortran.dg/pdt_3.f03	Sun Sep 21 22:33:24 2025
*************** end module
*** 76,79 ****
--- 76,80 ----
    end select
  
    deallocate (cz)
+   deallocate (matrix)
  end
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gfortran.dg/pdt_46.f03 gcc-16-20250921/gcc/testsuite/gfortran.dg/pdt_46.f03
*** gcc-16-20250914/gcc/testsuite/gfortran.dg/pdt_46.f03	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gfortran.dg/pdt_46.f03	Sun Sep 21 22:33:24 2025
***************
*** 0 ****
--- 1,62 ----
+ ! { dg-do run }
+ ! { dg-options "-fdump-tree-original" }
+ !
+ ! Test the fix for PR83763 in which a dependency was not handled correctly, which
+ ! resulted in a runtime segfault.
+ !
+ ! Contributed by Berke Durak  <berke.durak@gmail.com>
+ !
+ module bar
+   implicit none
+ 
+   type :: foo(n)
+      integer, len :: n = 10
+      real :: vec(n)
+   end type foo
+ 
+ contains
+ 
+   function baz(a) result(b)
+     type(foo(n = *)), intent(in) :: a
+     type(foo(n = a%n)) :: b
+ 
+     b%vec = a%vec * 10
+   end function baz
+ 
+ end module bar
+ 
+ program test
+   use bar
+   implicit none
+   call main1   ! Original report
+   call main2   ! Check for memory loss with allocatable 'x' and 'y'.
+ 
+ contains
+ 
+   subroutine main1
+     type(foo(5)) :: x, y
+     integer :: a(5) = [1,2,3,4,5]
+ 
+     x = foo(5)(a)
+     x = baz (x)            ! Segmentation fault because dependency not handled.
+     if (any (x%vec /= 10 * a)) stop 1
+     y = x
+     x = baz (y)            ! No dependecy and so this worked.
+     if (any (x%vec /= 100 * a)) stop 2
+   end subroutine main1
+ 
+   subroutine main2
+     type(foo(5)), allocatable :: x, y
+     integer :: a(5) = [1,2,3,4,5]
+ 
+     x = foo(5)(a)
+     x = baz (x)            ! Segmentation fault because dependency not handled.
+     if (any (x%vec /= 10 * a)) stop 3
+     y = x
+     x = baz (y)            ! No dependecy and so this worked.
+     if (any (x%vec /= 100 * a)) stop 4
+   end subroutine main2
+ 
+ end program test
+ ! { dg-final { scan-tree-dump-times "__builtin_free" 16 "original" } }
+ ! { dg-final { scan-tree-dump-times "__builtin_malloc" 12 "original" } }
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gfortran.dg/pdt_47.f03 gcc-16-20250921/gcc/testsuite/gfortran.dg/pdt_47.f03
*** gcc-16-20250914/gcc/testsuite/gfortran.dg/pdt_47.f03	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gfortran.dg/pdt_47.f03	Sun Sep 21 22:33:24 2025
***************
*** 0 ****
--- 1,50 ----
+ ! { dg-do run }
+ !
+ ! Test the fix for PR121948, in which the PDT constructor expressions without
+ ! the type specification list, ie. relying on default values, failed. The fix
+ ! also required that the incorrect initialization of functions with implicit
+ ! function result be eliminated.
+ !
+ ! Contributed by Damian Rouson  <damian@archaeologic.codes>
+ !
+   implicit none
+ 
+   integer, parameter :: dp = kind(1d0)
+   real, parameter :: ap = 42.0
+   real(dp), parameter :: ap_d = 42.0d0
+ 
+   type operands_t(k)
+     integer, kind :: k = kind(1.)
+     real(k) :: actual, expected 
+   end type
+ 
+   type(operands_t) :: x
+   type(operands_t(dp)) :: y
+ 
+   x = operands (ap, 10 * ap)
+   if (abs (x%actual - ap) >1e-5) stop 1
+   if (abs (x%expected - 10 * ap) > 1e-5) stop 2
+ 
+ 
+   y = operands_dp (ap_d, 10d0 * ap_d)
+   if (abs (y%actual - ap_d) > 1d-10) stop 3
+   if (abs (y%expected - 10d0 * ap_d) > 1d-10) stop 4
+   if (kind (y%actual) /= dp) stop 5
+   if (kind (y%expected) /= dp) stop 6
+ 
+ contains
+ 
+   function operands(actual, expected)                    ! Use the default 'k'
+     real actual, expected
+     type(operands_t) :: operands
+     operands = operands_t(actual, expected)
+   end function
+ 
+ 
+   function operands_dp(actual, expected)                 ! Override the default
+     real(dp) actual, expected
+     type(operands_t(dp)) :: operands_dp
+     operands_dp = operands_t(dp)(actual, expected) 
+   end function
+ 
+ end
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gfortran.dg/pdt_48.f03 gcc-16-20250921/gcc/testsuite/gfortran.dg/pdt_48.f03
*** gcc-16-20250914/gcc/testsuite/gfortran.dg/pdt_48.f03	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gfortran.dg/pdt_48.f03	Sun Sep 21 22:33:24 2025
***************
*** 0 ****
--- 1,49 ----
+ ! { dg-do run }
+ !
+ ! Test the fix for P83746, which failed as in the comment below.
+ !
+ ! Contributed by Berke Durak  <berke.durak@gmail.com>
+ !
+ module pdt_m
+   implicit none
+   type :: vec(k)
+      integer, len :: k
+      integer :: foo(k)
+   end type vec
+ contains
+   elemental function diy_max(a,b) result(c)
+     integer, intent(in) :: a,b
+     integer :: c
+     c=max(a,b)
+   end function diy_max
+                 
+   function add(a,b) result(c)
+     type(vec(k=*)), intent(in) :: a,b
+     type(vec(k=max(a%k,b%k))) :: c      ! Fails
+     !type(vec(k=diy_max(a%k,b%k))) :: c ! Worked with diy_max
+     !type(vec(k=a%k+b%k)) :: c          ! Worked with +
+     
+     c%foo(1:a%k)=a%foo
+     c%foo(1:b%k)=c%foo(1:b%k)+b%foo
+ 
+     if (c%k /= 5) stop 1 
+   end function add
+ end module pdt_m
+ 
+ program test_pdt
+   use pdt_m
+   implicit none
+   type(vec(k=2)) :: u
+   type(vec(k=5)) :: v,w
+ 
+   if (w%k /= 5) stop 2
+   if (size(w%foo) /= 5) stop 3
+ 
+   u%foo=[1,2]
+   v%foo=[10,20,30,40,50]
+   w=add(u,v)
+ 
+   if (w%k /= 5) stop 4
+   if (size(w%foo) /= 5) stop 5
+   if (any (w%foo /= [11,22,30,40,50])) stop 6
+ end program test_pdt
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/errors/fail/testbit2.mod gcc-16-20250921/gcc/testsuite/gm2/errors/fail/testbit2.mod
*** gcc-16-20250914/gcc/testsuite/gm2/errors/fail/testbit2.mod	Sun Sep 14 22:32:32 2025
--- gcc-16-20250921/gcc/testsuite/gm2/errors/fail/testbit2.mod	Sun Sep 21 22:33:26 2025
*************** MODULE testbit2 ;
*** 19,29 ****
  
  FROM StrIO IMPORT WriteString, WriteLn ;
  
  VAR
!    c   : CARDINAL ;
     a, b: BITSET ;
  BEGIN
!    IF b IN b
     THEN
        WriteString('hmm') ; WriteLn
     END
--- 19,32 ----
  
  FROM StrIO IMPORT WriteString, WriteLn ;
  
+ TYPE
+    index = CARDINAL ;
+ 
  VAR
!    c   : index ;
     a, b: BITSET ;
  BEGIN
!    IF c IN c
     THEN
        WriteString('hmm') ; WriteLn
     END
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/iso/run/pass/assigncons.mod gcc-16-20250921/gcc/testsuite/gm2/iso/run/pass/assigncons.mod
*** gcc-16-20250914/gcc/testsuite/gm2/iso/run/pass/assigncons.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gm2/iso/run/pass/assigncons.mod	Sun Sep 21 22:33:26 2025
***************
*** 0 ****
--- 1,23 ----
+ MODULE assigncons ;
+ 
+ 
+ TYPE
+    rec = RECORD
+             x, y: CARDINAL ;
+          END ;
+ 
+ CONST
+    z = rec {1, 2} ;
+ 
+ 
+ PROCEDURE Init ;
+ VAR
+    r: rec ;
+ BEGIN
+    r := z
+ END Init ;
+ 
+ 
+ BEGIN
+    Init
+ END assigncons.
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/iso/run/pass/constructor3.mod gcc-16-20250921/gcc/testsuite/gm2/iso/run/pass/constructor3.mod
*** gcc-16-20250914/gcc/testsuite/gm2/iso/run/pass/constructor3.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gm2/iso/run/pass/constructor3.mod	Sun Sep 21 22:33:26 2025
***************
*** 0 ****
--- 1,42 ----
+ (* Copyright (C) 2008 Free Software Foundation, Inc. *)
+ (* This file is part of GNU Modula-2.
+ 
+ GNU Modula-2 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 2, or (at your option) any later
+ version.
+ 
+ GNU Modula-2 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 gm2; see the file COPYING.  If not, write to the Free Software
+ Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *)
+ 
+ MODULE constructor3 ;
+ 
+ FROM libc IMPORT exit ;
+ 
+ 
+ VAR
+    f: position ;
+ 
+ TYPE
+    position = RECORD
+                  x1, y1, x2, y2: CARDINAL ;
+               END ;
+ 
+ CONST
+    first = position{1,2,3,4} ;
+ 
+ BEGIN
+    f := first ;
+    IF (f.x1=1) AND (f.y1=2) AND (f.x2=3) AND (f.y2=4)
+    THEN
+       (* all ok *)
+    ELSE
+       exit(1)
+    END
+ END constructor3.
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/iso/run/pass/proc_test.mod gcc-16-20250921/gcc/testsuite/gm2/iso/run/pass/proc_test.mod
*** gcc-16-20250914/gcc/testsuite/gm2/iso/run/pass/proc_test.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gm2/iso/run/pass/proc_test.mod	Sun Sep 21 22:33:26 2025
***************
*** 0 ****
--- 1,10 ----
+ MODULE proc_test;
+ 
+     PROCEDURE Calc () : CARDINAL;
+     BEGIN
+         RETURN 2;
+     END Calc;
+ 
+ BEGIN
+ 
+ END proc_test.
\ No newline at end of file
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/iso/run/pass/shift4.mod gcc-16-20250921/gcc/testsuite/gm2/iso/run/pass/shift4.mod
*** gcc-16-20250914/gcc/testsuite/gm2/iso/run/pass/shift4.mod	Sun Sep 14 22:32:32 2025
--- gcc-16-20250921/gcc/testsuite/gm2/iso/run/pass/shift4.mod	Sun Sep 21 22:33:26 2025
*************** Foundation, 51 Franklin Street, Fifth Fl
*** 18,24 ****
  MODULE shift4 ;
  
  FROM libc IMPORT exit, printf ;
! FROM SYSTEM IMPORT SHIFT, BITSPERLOC ;
  
  TYPE
     large = SET OF [0..1023] ;
--- 18,56 ----
  MODULE shift4 ;
  
  FROM libc IMPORT exit, printf ;
! FROM SYSTEM IMPORT SHIFT, BITSPERLOC, TBITSIZE, BYTE ;
! 
! 
! CONST
!    EarlyFail = TRUE ;
!    Verbose = FALSE ;
! 
! 
! (*
!    assert -
! *)
! 
! PROCEDURE assert (condition: BOOLEAN) ;
! BEGIN
!    IF NOT condition
!    THEN
!       printf ("assert failed\n");
!       exit (1)
!    END
! END assert ;
! 
! 
! (*
!    SanityCheck -
! *)
! 
! PROCEDURE SanityCheck ;
! BEGIN
!    assert (MIN (large) = 0) ;
!    assert (MAX (large) = 1023) ;
!    assert (TBITSIZE (BYTE) = 8) ;
! END SanityCheck ;
! 
  
  TYPE
     large = SET OF [0..1023] ;
*************** VAR
*** 27,63 ****
     i   : INTEGER ;
     b, c: large ;
  BEGIN
     r := 0 ;
     b := large{1, 2, 3, 1022} ;
!    b := SHIFT(b, 1) ;
     IF b#large{2, 3, 4, 1023}
     THEN
        exit(1)
     END ;
     b := large{1, 2, 3, 1023} ;
!    b := SHIFT(b, -1) ;
     IF b#large{0, 1, 2, 1022}
     THEN
        exit(2)
     END ;
     b := large{1+SIZE(BITSET)*BITSPERLOC} ;
     b := SHIFT(b, -1) ;
     IF b#large{SIZE(BITSET)*BITSPERLOC}
     THEN
        exit(3)
     END ;
     b := SHIFT(b, -1) ;
     IF b#large{SIZE(BITSET)*BITSPERLOC-1}
     THEN
        exit(4)
     END ;
     FOR i := 0 TO MAX(large) DO
        b := large{0} ;
        b := SHIFT(b, i) ;
        c := large{i} ;
!       IF b#c
        THEN
!          printf("failed shift left in loop on iteration %d\n", i) ;
           r := 5
        END
     END ;
--- 59,165 ----
     i   : INTEGER ;
     b, c: large ;
  BEGIN
+    SanityCheck ;
     r := 0 ;
     b := large{1, 2, 3, 1022} ;
!    IF b # large{1, 2, 3, 1022}
!    THEN
!       printf ("failed to assign a large set with a constant set\n");
!       exit (1)
!    END ;
!    b := SHIFT(b, 1) ;  (* Shift left by 1 bit.  *)
     IF b#large{2, 3, 4, 1023}
     THEN
+       printf ("failed (exit 1) as b#large{2, 3, 4, 1023}\n");
        exit(1)
     END ;
     b := large{1, 2, 3, 1023} ;
!    b := SHIFT(b, -1) ;    (* Shift right by 1 bit.  *)
     IF b#large{0, 1, 2, 1022}
     THEN
+       printf ("failed (exit 2) as b#large{1, 2, 3, 1022}\n");
        exit(2)
     END ;
     b := large{1+SIZE(BITSET)*BITSPERLOC} ;
     b := SHIFT(b, -1) ;
     IF b#large{SIZE(BITSET)*BITSPERLOC}
     THEN
+       printf ("failed (exit 3)\n");
        exit(3)
     END ;
     b := SHIFT(b, -1) ;
     IF b#large{SIZE(BITSET)*BITSPERLOC-1}
     THEN
+       printf ("failed (exit 4)\n");
        exit(4)
     END ;
+ 
+    printf ("test left shift on byte boundaries\n");
+    FOR i := 0 TO MAX(large) BY 8 DO
+       b := large{0} ;
+       b := SHIFT(b, i) ;
+       c := large{i} ;
+       IF b # c
+       THEN
+          printf("failed shift left in loop on iteration %d, failed to shift bit 0 left by %i bits\n", i, i) ;
+          IF EarlyFail
+          THEN
+             exit (5)
+          END ;
+          r := 5
+       END
+    END ;
+    IF r = 0
+    THEN
+       printf ("test left shift on byte boundaries passed\n")
+    ELSE
+       printf ("test left shift on byte boundaries failed\n")
+    END ;
+ 
+    printf ("test right shift on byte boundaries\n");
+    FOR i := 0 TO MAX(large) BY 8 DO
+       b := large{i} ;
+       b := SHIFT(b, -i) ;
+       c := large{0} ;
+       IF b = c
+       THEN
+          IF Verbose
+          THEN
+             printf ("success shifted large set right by %d bits\n", i)
+          END
+       ELSE
+          printf("failed shift right in loop on iteration %d\n", i) ;
+          IF EarlyFail
+          THEN
+             exit (6)
+          END ;
+          r := 6
+       END
+    END ;
+    IF r = 0
+    THEN
+       printf ("test right shift on byte boundaries passed\n")
+    ELSE
+       printf ("test right shift on byte boundaries failed\n")
+    END ;
+ 
+    printf ("test shift on each bit\n");
     FOR i := 0 TO MAX(large) DO
        b := large{0} ;
        b := SHIFT(b, i) ;
        c := large{i} ;
!       IF b = c
        THEN
!          IF Verbose
!          THEN
!             printf ("success shifted large set left by %d bits\n", i)
!          END
!       ELSE
!          printf("failed shift left in loop on iteration %d, failed to shift bit 0 left by %i bits\n", i, i) ;
!          IF EarlyFail
!          THEN
!             exit (5)
!          END ;
           r := 5
        END
     END ;
*************** BEGIN
*** 65,73 ****
        b := large{i} ;
        b := SHIFT(b, -i) ;
        c := large{0} ;
!       IF b#c
        THEN
           printf("failed shift right in loop on iteration %d\n", i) ;
           r := 6
        END
     END ;
--- 167,184 ----
        b := large{i} ;
        b := SHIFT(b, -i) ;
        c := large{0} ;
!       IF b = c
        THEN
+          IF Verbose
+          THEN
+             printf ("success shifted large set right by %d bits\n", i)
+          END
+       ELSE
           printf("failed shift right in loop on iteration %d\n", i) ;
+          IF EarlyFail
+          THEN
+             exit (6)
+          END ;
           r := 6
        END
     END ;
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/iso/run/pass/simplelarge2.mod gcc-16-20250921/gcc/testsuite/gm2/iso/run/pass/simplelarge2.mod
*** gcc-16-20250914/gcc/testsuite/gm2/iso/run/pass/simplelarge2.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gm2/iso/run/pass/simplelarge2.mod	Sun Sep 21 22:33:26 2025
***************
*** 0 ****
--- 1,99 ----
+ (* Copyright (C) 2014 Free Software Foundation, Inc. *)
+ (* This file is part of GNU Modula-2.
+ 
+ GNU Modula-2 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 2, or (at your option) any later
+ version.
+ 
+ GNU Modula-2 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 gm2; see the file COPYING.  If not, write to the Free Software
+ Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *)
+ 
+ MODULE simplelarge2 ;
+ 
+ FROM STextIO IMPORT WriteString, WriteLn, WriteChar, ReadToken, SkipLine ;
+ FROM SWholeIO IMPORT WriteCard, WriteInt ;
+ FROM WholeStr IMPORT StrToCard, ConvResults ;
+ FROM SYSTEM IMPORT CARDINAL8 ;
+ FROM libc IMPORT printf ;
+ 
+ CONST
+    BoardX         =              16 ;
+    BoardY         =              16 ;
+    BoardSize      = BoardX * BoardY ;
+ 
+ TYPE
+    Squares = [0..BoardSize-1] ;
+    SoS     = SET OF Squares ;
+    Colour  = (Blue, Red, Green, White) ;
+ 
+ VAR
+    homeBase: ARRAY [MIN(Colour)..MAX(Colour)] OF SoS ;
+ 
+ 
+ PROCEDURE dumpSet (c: Colour) ;
+ VAR
+    n: CARDINAL ;
+ BEGIN
+    printf ("inside dumpSet (%d)\n", ORD(c)) ;
+    printf ("      :  0 2 4 6 8 a c e \n") ;
+    FOR n := MIN(Squares) TO MAX(Squares) DO
+       IF n MOD 16 = 0
+       THEN
+          printf ("\nrow %2d:  ", n DIV 16)
+       END ;
+       IF n IN homeBase[c]
+       THEN
+          printf ("1")
+       ELSE
+          printf ("0")
+       END
+    END ;
+    printf ("\n")
+ END dumpSet ;
+ 
+ 
+ (*
+    assert -
+ *)
+ 
+ PROCEDURE assert (b: BOOLEAN) ;
+ BEGIN
+    IF NOT b
+    THEN
+       WriteString('assert failed') ; WriteLn ;
+       HALT
+    END
+ END assert ;
+ 
+ 
+ BEGIN
+    homeBase[Blue] := SoS {0, 1, 2, 3,
+                           16, 17, 18, 19,
+                           32, 33, 34,
+                           48, 49} ;
+ 
+    dumpSet(Blue) ;
+ 
+    assert (0 IN homeBase[Blue]) ;
+    assert (1 IN homeBase[Blue]) ;
+    assert (2 IN homeBase[Blue]) ;
+    assert (3 IN homeBase[Blue]) ;
+ 
+    homeBase[Blue] := homeBase[Blue] + SoS {4, 20, 35, 50, 65, 64} ;
+    dumpSet(Blue) ;
+ 
+    assert (0 IN homeBase[Blue]) ;
+    assert (1 IN homeBase[Blue]) ;
+    assert (2 IN homeBase[Blue]) ;
+    assert (3 IN homeBase[Blue]) ;
+    assert (4 IN homeBase[Blue]) ;
+    assert (NOT (5 IN homeBase[Blue])) ;
+    assert (NOT (6 IN homeBase[Blue])) ;
+ END simplelarge2.
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/iso/run/pass/simplelarge3.mod gcc-16-20250921/gcc/testsuite/gm2/iso/run/pass/simplelarge3.mod
*** gcc-16-20250914/gcc/testsuite/gm2/iso/run/pass/simplelarge3.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gm2/iso/run/pass/simplelarge3.mod	Sun Sep 21 22:33:26 2025
***************
*** 0 ****
--- 1,88 ----
+ (* Copyright (C) 2014 Free Software Foundation, Inc. *)
+ (* This file is part of GNU Modula-2.
+ 
+ GNU Modula-2 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 2, or (at your option) any later
+ version.
+ 
+ GNU Modula-2 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 gm2; see the file COPYING.  If not, write to the Free Software
+ Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *)
+ 
+ MODULE simplelarge3 ;
+ 
+ FROM STextIO IMPORT WriteString, WriteLn, WriteChar, ReadToken, SkipLine ;
+ FROM SWholeIO IMPORT WriteCard, WriteInt ;
+ FROM WholeStr IMPORT StrToCard, ConvResults ;
+ FROM SYSTEM IMPORT CARDINAL8 ;
+ FROM libc IMPORT printf ;
+ 
+ CONST
+    BoardX         =              16 ;
+    BoardY         =              16 ;
+    BoardSize      = BoardX * BoardY ;
+ 
+ TYPE
+    Squares = [0..BoardSize-1] ;
+    SoS     = SET OF Squares ;
+    Colour  = (Blue, Red, Green, White) ;
+ 
+ VAR
+    homeBase: ARRAY [MIN(Colour)..MAX(Colour)] OF SoS ;
+ 
+ 
+ PROCEDURE dumpSet (c: Colour) ;
+ VAR
+    n: CARDINAL ;
+ BEGIN
+    printf ("inside dumpSet (%d)\n", ORD(c)) ;
+    printf ("      :  0 2 4 6 8 a c e \n") ;
+    FOR n := MIN(Squares) TO MAX(Squares) DO
+       IF n MOD 16 = 0
+       THEN
+          printf ("\nrow %2d:  ", n DIV 16)
+       END ;
+       IF n IN homeBase[c]
+       THEN
+          printf ("1")
+       ELSE
+          printf ("0")
+       END
+    END ;
+    printf ("\n")
+ END dumpSet ;
+ 
+ 
+ (*
+    assert -
+ *)
+ 
+ PROCEDURE assert (b: BOOLEAN) ;
+ BEGIN
+    IF NOT b
+    THEN
+       WriteString('assert failed') ; WriteLn ;
+       HALT
+    END
+ END assert ;
+ 
+ 
+ BEGIN
+    homeBase[Blue] := SoS {0, 1, 2, 3,
+                           16, 17, 18, 19,
+                           32, 33, 34,
+                           48, 49} ;
+ 
+    dumpSet(Blue) ;
+ 
+    homeBase[Blue] := homeBase[Blue] + SoS {4, 20, 35, 50, 65, 64} ;
+    dumpSet(Blue) ;
+ 
+    assert (0 IN homeBase[Blue])
+ END simplelarge3.
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/iso/run/pass/simplelarge4.mod gcc-16-20250921/gcc/testsuite/gm2/iso/run/pass/simplelarge4.mod
*** gcc-16-20250914/gcc/testsuite/gm2/iso/run/pass/simplelarge4.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gm2/iso/run/pass/simplelarge4.mod	Sun Sep 21 22:33:26 2025
***************
*** 0 ****
--- 1,88 ----
+ (* Copyright (C) 2014 Free Software Foundation, Inc. *)
+ (* This file is part of GNU Modula-2.
+ 
+ GNU Modula-2 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 2, or (at your option) any later
+ version.
+ 
+ GNU Modula-2 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 gm2; see the file COPYING.  If not, write to the Free Software
+ Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *)
+ 
+ MODULE simplelarge4 ;
+ 
+ FROM STextIO IMPORT WriteString, WriteLn, WriteChar, ReadToken, SkipLine ;
+ FROM SWholeIO IMPORT WriteCard, WriteInt ;
+ FROM WholeStr IMPORT StrToCard, ConvResults ;
+ FROM SYSTEM IMPORT CARDINAL8 ;
+ FROM libc IMPORT printf ;
+ 
+ CONST
+    BoardX         =              16 ;
+    BoardY         =              16 ;
+    BoardSize      = BoardX * BoardY ;
+ 
+ TYPE
+    Squares = [0..BoardSize-1] ;
+    SoS     = SET OF Squares ;
+    Colour  = (Blue, Red, Green, White) ;
+ 
+ VAR
+    homeBase: SoS ;
+ 
+ 
+ PROCEDURE dumpSet (c: Colour) ;
+ VAR
+    n: CARDINAL ;
+ BEGIN
+    printf ("inside dumpSet (%d)\n", ORD(c)) ;
+    printf ("      :  0 2 4 6 8 a c e \n") ;
+    FOR n := MIN(Squares) TO MAX(Squares) DO
+       IF n MOD 16 = 0
+       THEN
+          printf ("\nrow %2d:  ", n DIV 16)
+       END ;
+       IF n IN homeBase
+       THEN
+          printf ("1")
+       ELSE
+          printf ("0")
+       END
+    END ;
+    printf ("\n")
+ END dumpSet ;
+ 
+ 
+ (*
+    assert -
+ *)
+ 
+ PROCEDURE assert (b: BOOLEAN) ;
+ BEGIN
+    IF NOT b
+    THEN
+       WriteString('assert failed') ; WriteLn ;
+       HALT
+    END
+ END assert ;
+ 
+ 
+ BEGIN
+    homeBase := SoS {0, 1, 2, 3,
+                     16, 17, 18, 19,
+                     32, 33, 34,
+                     48, 49} ;
+ 
+    dumpSet(Blue) ;
+ 
+    homeBase := homeBase + SoS {4, 20, 35, 50, 65, 64} ;
+    dumpSet(Blue) ;
+ 
+    assert (0 IN homeBase)
+ END simplelarge4.
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/iso/run/pass/testsystem.mod gcc-16-20250921/gcc/testsuite/gm2/iso/run/pass/testsystem.mod
*** gcc-16-20250914/gcc/testsuite/gm2/iso/run/pass/testsystem.mod	Sun Sep 14 22:32:32 2025
--- gcc-16-20250921/gcc/testsuite/gm2/iso/run/pass/testsystem.mod	Sun Sep 21 22:33:26 2025
*************** FROM FIO IMPORT Close, StdOut ;
*** 29,35 ****
  
  PROCEDURE FindFirstElement (start: CARDINAL; s: LargeSet) : CARDINAL ;
  BEGIN
!    WHILE NOT (start IN s) DO
        INC(start)
     END ;
     RETURN( start )
--- 29,35 ----
  
  PROCEDURE FindFirstElement (start: CARDINAL; s: LargeSet) : CARDINAL ;
  BEGIN
!    WHILE (start < 1024) AND (NOT (start IN s)) DO
        INC(start)
     END ;
     RETURN( start )
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/pimlib/wideset/run/pass/bitset.mod gcc-16-20250921/gcc/testsuite/gm2/pimlib/wideset/run/pass/bitset.mod
*** gcc-16-20250914/gcc/testsuite/gm2/pimlib/wideset/run/pass/bitset.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gm2/pimlib/wideset/run/pass/bitset.mod	Sun Sep 21 22:33:27 2025
***************
*** 0 ****
--- 1,46 ----
+ MODULE bitset ;
+ 
+ FROM libc IMPORT printf, exit ;
+ FROM M2WIDESET IMPORT Equal, Clear ;
+ 
+ TYPE
+    set = BITSET ;
+ 
+ CONST
+    HighBit = MAX (set) ;
+ 
+ 
+ (*
+    Assert -
+ *)
+ 
+ PROCEDURE Assert (bool: BOOLEAN; line: CARDINAL) ;
+ BEGIN
+    IF NOT bool
+    THEN
+       printf ("%s:%d:assert failed\n", __FILE__, line);
+       exit (1)
+    END
+ END Assert ;
+ 
+ 
+ (*
+    init -
+ *)
+ 
+ PROCEDURE init ;
+ VAR
+    left, right: set ;
+ BEGIN
+    left := set {} ;
+    right := set {1} ;
+    Assert (NOT Equal (left, right, HighBit), __LINE__) ;
+    Clear (right, HighBit) ;
+    Assert (Equal (left, right, HighBit), __LINE__) ;
+    printf ("All tests pass in %s\n", __FILE__)
+ END init ;
+ 
+ 
+ BEGIN
+    init
+ END bitset.
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/pimlib/wideset/run/pass/bitset2.mod gcc-16-20250921/gcc/testsuite/gm2/pimlib/wideset/run/pass/bitset2.mod
*** gcc-16-20250914/gcc/testsuite/gm2/pimlib/wideset/run/pass/bitset2.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gm2/pimlib/wideset/run/pass/bitset2.mod	Sun Sep 21 22:33:27 2025
***************
*** 0 ****
--- 1,43 ----
+ MODULE bitset ;
+ 
+ FROM libc IMPORT printf, exit ;
+ FROM M2WIDESET IMPORT Equal, Clear ;
+ 
+ CONST
+    HighBit = MAX (BITSET) ;
+ 
+ 
+ (*
+    Assert -
+ *)
+ 
+ PROCEDURE Assert (bool: BOOLEAN; line: CARDINAL) ;
+ BEGIN
+    IF NOT bool
+    THEN
+       printf ("%s:%d:assert failed\n", __FILE__, line);
+       exit (1)
+    END
+ END Assert ;
+ 
+ 
+ (*
+    init -
+ *)
+ 
+ PROCEDURE init ;
+ VAR
+    left, right: BITSET ;
+ BEGIN
+    left := BITSET {} ;
+    right := BITSET {1} ;
+    Assert (NOT Equal (left, right, HighBit), __LINE__) ;
+    Clear (right, HighBit) ;
+    Assert (Equal (left, right, HighBit), __LINE__) ;
+    printf ("All tests pass in %s\n", __FILE__)
+ END init ;
+ 
+ 
+ BEGIN
+    init
+ END bitset.
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/pimlib/wideset/run/pass/colorset.mod gcc-16-20250921/gcc/testsuite/gm2/pimlib/wideset/run/pass/colorset.mod
*** gcc-16-20250914/gcc/testsuite/gm2/pimlib/wideset/run/pass/colorset.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gm2/pimlib/wideset/run/pass/colorset.mod	Sun Sep 21 22:33:27 2025
***************
*** 0 ****
--- 1,47 ----
+ MODULE colorset ;
+ 
+ FROM libc IMPORT printf, exit ;
+ FROM M2WIDESET IMPORT Equal, Clear ;
+ 
+ TYPE
+    color = SET OF (red, green, blue) ;
+    set = color ;
+ 
+ CONST
+    HighBit = MAX (set) ;
+ 
+ 
+ (*
+    Assert -
+ *)
+ 
+ PROCEDURE Assert (bool: BOOLEAN; line: CARDINAL) ;
+ BEGIN
+    IF NOT bool
+    THEN
+       printf ("%s:%d:assert failed\n", __FILE__, line);
+       exit (1)
+    END
+ END Assert ;
+ 
+ 
+ (*
+    init -
+ *)
+ 
+ PROCEDURE init ;
+ VAR
+    left, right: set ;
+ BEGIN
+    left := set {} ;
+    right := set {green} ;
+    Assert (NOT Equal (left, right, HighBit), __LINE__) ;
+    Clear (right, HighBit) ;
+    Assert (Equal (left, right, HighBit), __LINE__) ;
+    printf ("All tests pass in %s\n", __FILE__)
+ END init ;
+ 
+ 
+ BEGIN
+    init
+ END colorset.
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/pimlib/wideset/run/pass/colorset2.mod gcc-16-20250921/gcc/testsuite/gm2/pimlib/wideset/run/pass/colorset2.mod
*** gcc-16-20250914/gcc/testsuite/gm2/pimlib/wideset/run/pass/colorset2.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gm2/pimlib/wideset/run/pass/colorset2.mod	Sun Sep 21 22:33:27 2025
***************
*** 0 ****
--- 1,72 ----
+ MODULE colorset2 ;
+ 
+ FROM libc IMPORT printf, exit ;
+ FROM M2WIDESET IMPORT Equal, Clear, Shift, Rotate ;
+ 
+ TYPE
+    color = SET OF (red, green, blue) ;
+    set = color ;
+ 
+ CONST
+    HighBit = MAX (set) ;
+ 
+ 
+ (*
+    Assert -
+ *)
+ 
+ PROCEDURE Assert (bool: BOOLEAN; line: CARDINAL) ;
+ BEGIN
+    IF NOT bool
+    THEN
+       printf ("%s:%d:assert failed\n", __FILE__, line);
+       exit (1)
+    END
+ END Assert ;
+ 
+ 
+ (*
+    init -
+ *)
+ 
+ PROCEDURE init ;
+ VAR
+    left, right: set ;
+ BEGIN
+    left := set {} ;
+    right := set {green} ;
+    Assert (NOT Equal (left, right, HighBit), __LINE__) ;
+    Clear (right, HighBit) ;
+    Assert (Equal (left, right, HighBit), __LINE__) ;
+ 
+    left := set {red} ;
+    right := set {green} ;
+    Assert (NOT Equal (left, right, HighBit), __LINE__) ;
+    Shift (right, right, MAX (set), -1) ;
+    Assert (Equal (left, right, HighBit), __LINE__) ;
+    left := set {red} ;
+    right := set {green} ;
+    Shift (left, left, MAX (set), 1) ;
+    Assert (Equal (left, right, HighBit), __LINE__) ;
+ 
+    left := set {red} ;
+    right := set {green} ;
+    Rotate (left, left, MAX (set), 1) ;
+    Assert (Equal (left, right, HighBit), __LINE__) ;
+ 
+    left := set {green} ;
+    right := set {red} ;
+    Rotate (left, left, MAX (set), -1) ;
+    Assert (Equal (left, right, HighBit), __LINE__) ;
+ 
+    left := set {red} ;
+    right := set {blue} ;
+    Rotate (left, left, MAX (set), -1) ;
+    Assert (Equal (left, right, HighBit), __LINE__) ;
+    printf ("All tests pass in %s\n", __FILE__)
+ END init ;
+ 
+ 
+ BEGIN
+    init
+ END colorset2.
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/pimlib/wideset/run/pass/colorset3.mod gcc-16-20250921/gcc/testsuite/gm2/pimlib/wideset/run/pass/colorset3.mod
*** gcc-16-20250914/gcc/testsuite/gm2/pimlib/wideset/run/pass/colorset3.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gm2/pimlib/wideset/run/pass/colorset3.mod	Sun Sep 21 22:33:27 2025
***************
*** 0 ****
--- 1,46 ----
+ MODULE colorset3 ;
+ 
+ FROM libc IMPORT printf, exit ;
+ FROM M2WIDESET IMPORT Equal, Clear, Shift, Rotate ;
+ 
+ TYPE
+    color = SET OF (red, green, blue) ;
+    set = color ;
+ 
+ CONST
+    HighBit = MAX (set) ;
+ 
+ 
+ (*
+    Assert -
+ *)
+ 
+ PROCEDURE Assert (bool: BOOLEAN; line: CARDINAL) ;
+ BEGIN
+    IF NOT bool
+    THEN
+       printf ("%s:%d:assert failed\n", __FILE__, line);
+       exit (1)
+    END
+ END Assert ;
+ 
+ 
+ (*
+    init -
+ *)
+ 
+ PROCEDURE init ;
+ VAR
+    left, right: set ;
+ BEGIN
+    left := set {green} ;
+    right := set {red} ;
+    Rotate (left, left, MAX (set), -1) ;
+    Assert (Equal (left, right, HighBit), __LINE__) ;
+    printf ("All tests pass in %s\n", __FILE__)
+ END init ;
+ 
+ 
+ BEGIN
+    init
+ END colorset3.
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/pimlib/wideset/run/pass/highbit.mod gcc-16-20250921/gcc/testsuite/gm2/pimlib/wideset/run/pass/highbit.mod
*** gcc-16-20250914/gcc/testsuite/gm2/pimlib/wideset/run/pass/highbit.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gm2/pimlib/wideset/run/pass/highbit.mod	Sun Sep 21 22:33:27 2025
***************
*** 0 ****
--- 1,13 ----
+ MODULE highbit ;
+ 
+ FROM libc IMPORT printf ;
+ 
+ TYPE
+    set = BITSET ;
+ 
+ CONST
+    HighBit = MAX (set) ;
+ 
+ BEGIN
+    printf ("the MAX (set) = %d\n", HighBit)
+ END highbit.
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/pimlib/wideset/run/pass/highbit2.mod gcc-16-20250921/gcc/testsuite/gm2/pimlib/wideset/run/pass/highbit2.mod
*** gcc-16-20250914/gcc/testsuite/gm2/pimlib/wideset/run/pass/highbit2.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gm2/pimlib/wideset/run/pass/highbit2.mod	Sun Sep 21 22:33:27 2025
***************
*** 0 ****
--- 1,13 ----
+ MODULE highbit2 ;
+ 
+ FROM libc IMPORT printf ;
+ 
+ TYPE
+    set = BITSET ;
+ 
+ CONST
+    HighBit = MAX (BITSET) ;
+ 
+ BEGIN
+    printf ("the MAX (BITSET) = %d\n", HighBit)
+ END highbit2.
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/sets/run/pass/multisetrotate4.mod gcc-16-20250921/gcc/testsuite/gm2/sets/run/pass/multisetrotate4.mod
*** gcc-16-20250914/gcc/testsuite/gm2/sets/run/pass/multisetrotate4.mod	Sun Sep 14 22:32:32 2025
--- gcc-16-20250921/gcc/testsuite/gm2/sets/run/pass/multisetrotate4.mod	Sun Sep 21 22:33:27 2025
*************** Foundation, 51 Franklin Street, Fifth Fl
*** 18,24 ****
  MODULE multisetrotate4 ;
  
  FROM libc IMPORT printf, exit ;
! FROM SYSTEM IMPORT ROTATE, WORD, BITSPERLOC ;
  
  TYPE
     multi = SET OF [0..SIZE (WORD) * 2 * BITSPERLOC-1] ;
--- 18,24 ----
  MODULE multisetrotate4 ;
  
  FROM libc IMPORT printf, exit ;
! FROM SYSTEM IMPORT ROTATE, WORD, BITSPERLOC, TBITSIZE ;
  
  TYPE
     multi = SET OF [0..SIZE (WORD) * 2 * BITSPERLOC-1] ;
*************** VAR
*** 29,40 ****
--- 29,49 ----
  BEGIN
     set := multi {1} ;
     bits := SIZE (multi) * BITSPERLOC ;
+    IF bits # TBITSIZE (set)
+    THEN
+       printf ("test code is invalid, set must match TBITSIZE\n");
+       exit (3)
+    END ;
     IF ROTATE (set, bits-1) # multi {0}
     THEN
+       printf ("rotate %d on a set type of %d bits failed\n",
+               bits-1, bits) ;
        exit (1)
     END ;
     IF ROTATE (set, -(bits - 1)) # multi {2}
     THEN
+       printf ("rotate %d on a set type of %d bits failed\n",
+               - (bits-1), bits) ;
        exit (2)
     END ;
     exit (0)
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/sets/run/pass/multisetrotate5.mod gcc-16-20250921/gcc/testsuite/gm2/sets/run/pass/multisetrotate5.mod
*** gcc-16-20250914/gcc/testsuite/gm2/sets/run/pass/multisetrotate5.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gm2/sets/run/pass/multisetrotate5.mod	Sun Sep 21 22:33:27 2025
***************
*** 0 ****
--- 1,70 ----
+ (* Copyright (C) 2025 Free Software Foundation, Inc. *)
+ (* This file is part of GNU Modula-2.
+ 
+ GNU Modula-2 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 2, or (at your option) any later
+ version.
+ 
+ GNU Modula-2 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 gm2; see the file COPYING.  If not, write to the Free Software
+ Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *)
+ 
+ MODULE multisetrotate5 ;
+ 
+ FROM libc IMPORT printf, exit ;
+ FROM SYSTEM IMPORT ROTATE, WORD, BITSPERLOC ;
+ 
+ TYPE
+    multi = SET OF [0..SIZE (WORD) * 2 * BITSPERLOC-1] ;
+ 
+ 
+ (*
+    dump -
+ *)
+ 
+ PROCEDURE dump (s: multi) ;
+ VAR
+    bits, i: CARDINAL ;
+ BEGIN
+    bits := SIZE (multi) * BITSPERLOC -1;
+    FOR i := 0 TO bits DO
+       printf (" %2d", i)
+    END ;
+    printf ("\n") ;
+    FOR i := 0 TO bits DO
+       IF i IN s
+       THEN
+          printf ("  X")
+       ELSE
+          printf ("   ")
+       END
+    END ;
+    printf ("\n")
+ END dump ;
+ 
+ 
+ VAR
+    set : multi ;
+    bits: INTEGER ;
+ BEGIN
+    dump (multi {1}) ;
+    dump (multi {2}) ;
+    set := multi {2} ;
+    dump (set) ;
+    set := multi {1} ;
+    dump (set) ;
+    IF ROTATE (set, 1) = multi {2}
+    THEN
+       exit (0)
+    END ;
+    set := multi {2} ;
+    set := ROTATE (set, 1) ;
+    dump (set) ;
+    exit (1)
+ END multisetrotate5.
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/sets/run/pass/setcard.mod gcc-16-20250921/gcc/testsuite/gm2/sets/run/pass/setcard.mod
*** gcc-16-20250914/gcc/testsuite/gm2/sets/run/pass/setcard.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gm2/sets/run/pass/setcard.mod	Sun Sep 21 22:33:27 2025
***************
*** 0 ****
--- 1,18 ----
+ MODULE setcard ;
+ 
+ FROM libc IMPORT exit ;
+ 
+ TYPE
+    large = SET OF CARDINAL ;
+ VAR
+    set: large ;
+ BEGIN
+    set := large {} ;
+    INCL (set, 2) ;
+    IF 2 IN set
+    THEN
+       exit (0)
+    ELSE
+       exit (1)
+    END
+ END setcard.
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/sets/run/pass/setincl.mod gcc-16-20250921/gcc/testsuite/gm2/sets/run/pass/setincl.mod
*** gcc-16-20250914/gcc/testsuite/gm2/sets/run/pass/setincl.mod	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/gcc/testsuite/gm2/sets/run/pass/setincl.mod	Sun Sep 21 22:33:27 2025
***************
*** 0 ****
--- 1,51 ----
+ (* Copyright (C) 2024 Free Software Foundation, Inc. *)
+ (* This file is part of GNU Modula-2.
+ 
+ GNU Modula-2 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 2, or (at your option) any later
+ version.
+ 
+ GNU Modula-2 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 gm2; see the file COPYING.  If not, write to the Free Software
+ Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *)
+ 
+ MODULE setincl ;
+ 
+ FROM libc IMPORT printf, exit ;
+ FROM SYSTEM IMPORT ROTATE ;
+ 
+ 
+ PROCEDURE incl (VAR set: BITSET; bit: CARDINAL) ;
+ BEGIN
+    INCL (set, bit)
+ END incl ;
+ 
+ 
+ PROCEDURE excl (VAR set: BITSET; bit: CARDINAL) ;
+ BEGIN
+    EXCL (set, bit)
+ END excl ;
+ 
+ 
+ VAR
+    set: BITSET ;
+ BEGIN
+    set := BITSET {} ;
+    incl (set, 1) ;
+    IF set # BITSET {1}
+    THEN
+       exit (1)
+    END ;
+    excl (set, 1) ;
+    IF set # BITSET {}
+    THEN
+       exit (2)
+    END ;
+    exit (0)
+ END setincl.
diff -Nrcpad gcc-16-20250914/gcc/testsuite/gm2/sets/run/pass/simplepacked.mod gcc-16-20250921/gcc/testsuite/gm2/sets/run/pass/simplepacked.mod
*** gcc-16-20250914/gcc/testsuite/gm2/sets/run/pass/simplepacked.mod	Sun Sep 14 22:32:32 2025
--- gcc-16-20250921/gcc/testsuite/gm2/sets/run/pass/simplepacked.mod	Sun Sep 21 22:33:27 2025
*************** BEGIN
*** 57,63 ****
     assert (ROTATE (psettype {1}, 1) = ROTATE (psettype {1}, 1), __LINE__, "comparision between constant rotated packed sets") ;
     assert (ROTATE (psettype {1}, 1) # ROTATE (psettype {2}, 1), __LINE__, "comparision between constant rotated packed sets") ;
     assert (ROTATE (a, 1) = psettype {2}, __LINE__, "comparision between rotated variable and constant packed sets") ;
!    assert (ROTATE (a, -1) = settype {0}, __LINE__, "comparision between rotated variable and constant packed sets") ;         
  END testpset ;
  
  
--- 57,63 ----
     assert (ROTATE (psettype {1}, 1) = ROTATE (psettype {1}, 1), __LINE__, "comparision between constant rotated packed sets") ;
     assert (ROTATE (psettype {1}, 1) # ROTATE (psettype {2}, 1), __LINE__, "comparision between constant rotated packed sets") ;
     assert (ROTATE (a, 1) = psettype {2}, __LINE__, "comparision between rotated variable and constant packed sets") ;
!    assert (ROTATE (a, -1) = psettype {0}, __LINE__, "comparision between rotated variable and constant packed sets") ;
  END testpset ;
  
  
diff -Nrcpad gcc-16-20250914/gcc/testsuite/lib/gm2.exp gcc-16-20250921/gcc/testsuite/lib/gm2.exp
*** gcc-16-20250914/gcc/testsuite/lib/gm2.exp	Sun Sep 14 22:32:33 2025
--- gcc-16-20250921/gcc/testsuite/lib/gm2.exp	Sun Sep 21 22:33:29 2025
*************** proc gm2_init_minx { dialect paths args
*** 633,638 ****
--- 633,639 ----
      gm2_link_lib "m2min"
      lappend args -fno-exceptions
      lappend args -fno-libs=-
+     lappend args -fno-wideset
      gm2_init {*}${theIpath} {*}${dialect} {*}${theLpath} {*}${args}
  }
  
diff -Nrcpad gcc-16-20250914/gcc/testsuite/objc.dg/special/load-category-1.m gcc-16-20250921/gcc/testsuite/objc.dg/special/load-category-1.m
*** gcc-16-20250914/gcc/testsuite/objc.dg/special/load-category-1.m	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/gcc/testsuite/objc.dg/special/load-category-1.m	Sun Sep 21 22:33:30 2025
***************
*** 1,7 ****
  /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, December 2010.  */
  /* { dg-do run } */
  /* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
! /* { dg-additional-options "-Wno-objc-root-class" } */
  
  #include <stdlib.h>
  #include <objc/objc.h>
--- 1,7 ----
  /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, December 2010.  */
  /* { dg-do run } */
  /* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
! /* { dg-additional-sources "load-category-1a.m" } */
  
  #include <stdlib.h>
  #include <objc/objc.h>
diff -Nrcpad gcc-16-20250914/gcc/testsuite/objc.dg/special/load-category-2.m gcc-16-20250921/gcc/testsuite/objc.dg/special/load-category-2.m
*** gcc-16-20250914/gcc/testsuite/objc.dg/special/load-category-2.m	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/gcc/testsuite/objc.dg/special/load-category-2.m	Sun Sep 21 22:33:30 2025
***************
*** 1,7 ****
  /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, December 2010.  */
  /* { dg-do run } */
  /* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
! /* { dg-additional-options "-Wno-objc-root-class" } */
  
  #include <stdio.h>
  #include <stdlib.h>
--- 1,7 ----
  /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, December 2010.  */
  /* { dg-do run } */
  /* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
! /* { dg-additional-sources "load-category-2a.m" } */
  
  #include <stdio.h>
  #include <stdlib.h>
diff -Nrcpad gcc-16-20250914/gcc/testsuite/objc.dg/special/load-category-3.m gcc-16-20250921/gcc/testsuite/objc.dg/special/load-category-3.m
*** gcc-16-20250914/gcc/testsuite/objc.dg/special/load-category-3.m	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/gcc/testsuite/objc.dg/special/load-category-3.m	Sun Sep 21 22:33:30 2025
***************
*** 1,7 ****
  /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, December 2010.  */
  /* { dg-do run } */
  /* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
! /* { dg-additional-options "-Wno-objc-root-class" } */
  
  /* This test is identical to load-category-2, but the classes and
     categories are created in inverted order in the modules, to test
--- 1,7 ----
  /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, December 2010.  */
  /* { dg-do run } */
  /* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
! /* { dg-additional-sources "load-category-3a.m" } */
  
  /* This test is identical to load-category-2, but the classes and
     categories are created in inverted order in the modules, to test
diff -Nrcpad gcc-16-20250914/gcc/testsuite/objc.dg/special/special.exp gcc-16-20250921/gcc/testsuite/objc.dg/special/special.exp
*** gcc-16-20250914/gcc/testsuite/objc.dg/special/special.exp	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/gcc/testsuite/objc.dg/special/special.exp	Sun Sep 21 22:33:30 2025
***************
*** 1,16 ****
! # GCC Objective-C testsuite that uses the `dg.exp' driver.
! #   Copyright (C) 1997-2025 Free Software Foundation, Inc.
  
! # This program 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 of the License, or
! # (at your option) any later version.
  # 
! # This program 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/>.
--- 1,19 ----
! # All these testcases compile and link two Objective-C modules..
  
! # Copyright (C) 2025 Free Software Foundation, Inc.
  # 
! # This file is part of GCC.
! #
! # GCC is free software; you can redistribute it and/or modify
! # it under the terms of the GNU General Public License as published by
! # the Free Software Foundation; either version 3, or (at your option)
! # any later version.
! #
! # GCC is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
! #
  # You should have received a copy of the GNU General Public License
  # along with GCC; see the file COPYING3.  If not see
  # <http://www.gnu.org/licenses/>.
*************** if ![info exists DEFAULT_CFLAGS] then {
*** 24,153 ****
      set DEFAULT_CFLAGS ""
  }
  
  # Initialize `dg'.
  dg-init
  
! # TODO: All these testcases compile and link two Objective-C modules.
! # Remove code duplication and factor the common code out.
! 
! #
! # unclaimed-category-1 test
! #
! # This test is special because we must compile two different modules,
! # unclaimed-category-1a.m and unclaimed-category-1.m, then link
! # together, then run the resulting executable.
! # for all systems we point to the libobjc includes and use the -fgnu-runtime
! set add_flags "additional_flags=-I${srcdir}/../../libobjc"
! lappend add_flags "additional_flags=-fgnu-runtime"
! lappend add_flags "additional_flags=-Wno-objc-root-class"
! set lines [objc_target_compile "$srcdir/$subdir/unclaimed-category-1a.m" "unclaimed-category-1a.o" object $add_flags ]
! if ![string match "" $lines] then {
!     fail "unclaimed-category-1a.o"
! } else {
!     dg-runtest "$srcdir/$subdir/unclaimed-category-1.m" "unclaimed-category-1a.o" "-I${srcdir}/../../libobjc -fgnu-runtime"
!     file delete unclaimed-category-1a.o
! }
! 
! if [istarget "*-*-darwin*" ] {
! set add_flags ""
! lappend add_flags "additional_flags=-fnext-runtime"
! lappend add_flags "additional_flags=-Wno-objc-root-class"
! set lines [objc_target_compile "$srcdir/$subdir/unclaimed-category-1a.m" "unclaimed-category-1a.o" object $add_flags ]
! if ![string match "" $lines] then {
!     fail "unclaimed-category-1a.o"
! } else {
!     dg-runtest "$srcdir/$subdir/unclaimed-category-1.m" "unclaimed-category-1a.o" "-fnext-runtime"
!     file delete unclaimed-category-1a.o
! }
! }
! 
! #
! # load-category-1 test
! #
! # This test is similar to the one above.  We compile load-category-1.m
! # and load-category-1a.m, link them together, and execute the result.
! set add_flags "additional_flags=-I${srcdir}/../../libobjc"
! lappend add_flags "additional_flags=-fgnu-runtime"
! lappend add_flags "additional_flags=-Wno-objc-root-class"
! set lines [objc_target_compile "$srcdir/$subdir/load-category-1a.m" "load-category-1a.o" object $add_flags ]
! if ![string match "" $lines] then {
!     fail "load-category-1a.o"
! } else {
!     dg-runtest "$srcdir/$subdir/load-category-1.m" "load-category-1a.o" "-I${srcdir}/../../libobjc -fgnu-runtime"
!     file delete load-category-1a.o
! }
! 
! if [istarget "*-*-darwin*" ] {
! set add_flags ""
! lappend add_flags "additional_flags=-fnext-runtime"
! lappend add_flags "additional_flags=-Wno-objc-root-class"
! set lines [objc_target_compile "$srcdir/$subdir/load-category-1a.m" "load-category-1a.o" object $add_flags ]
! if ![string match "" $lines] then {
!     fail "load-category-1a.o"
! } else {
!     dg-runtest "$srcdir/$subdir/load-category-1.m" "load-category-1a.o" "-fnext-runtime"
!     file delete load-category-1a.o
! }
! }
! 
! #
! # load-category-2 test
! #
! # This test is similar to the one above.  We compile load-category-2.m
! # and load-category-2a.m, link them together, and execute the result.
! set add_flags "additional_flags=-I${srcdir}/../../libobjc"
! lappend add_flags "additional_flags=-fgnu-runtime"
! lappend add_flags "additional_flags=-Wno-objc-root-class"
! set lines [objc_target_compile "$srcdir/$subdir/load-category-2a.m" "load-category-2a.o" object $add_flags ]
! if ![string match "" $lines] then {
!     fail "load-category-2a.o"
! } else {
!     dg-runtest "$srcdir/$subdir/load-category-2.m" "load-category-2a.o" "-I${srcdir}/../../libobjc -fgnu-runtime"
!     file delete load-category-2a.o
! }
! 
! if [istarget "*-*-darwin*" ] {
! set add_flags ""
! lappend add_flags "additional_flags=-fnext-runtime"
! lappend add_flags "additional_flags=-Wno-objc-root-class"
! set lines [objc_target_compile "$srcdir/$subdir/load-category-2a.m" "load-category-2a.o" object $add_flags ]
! if ![string match "" $lines] then {
!     fail "load-category-2a.o"
! } else {
!     dg-runtest "$srcdir/$subdir/load-category-2.m" "load-category-2a.o" "-fnext-runtime"
!     file delete load-category-2a.o
! }
  }
  
! #
! # load-category-3 test
! #
! # This test is similar to the one above.  We compile load-category-3.m
! # and load-category-3a.m, link them together, and execute the result.
! set add_flags "additional_flags=-I${srcdir}/../../libobjc"
! lappend add_flags "additional_flags=-fgnu-runtime"
! lappend add_flags "additional_flags=-Wno-objc-root-class"
! set lines [objc_target_compile "$srcdir/$subdir/load-category-3a.m" "load-category-3a.o" object $add_flags ]
! if ![string match "" $lines] then {
!     fail "load-category-3a.o"
! } else {
!     dg-runtest "$srcdir/$subdir/load-category-3.m" "load-category-3a.o" "-I${srcdir}/../../libobjc -fgnu-runtime"
!     file delete load-category-3a.o
! }
  
  if [istarget "*-*-darwin*" ] {
! set add_flags ""
! lappend add_flags "additional_flags=-fnext-runtime"
! lappend add_flags "additional_flags=-Wno-objc-root-class"
! set lines [objc_target_compile "$srcdir/$subdir/load-category-3a.m" "load-category-3a.o" object $add_flags ]
! if ![string match "" $lines] then {
!     fail "load-category-3a.o"
! } else {
!     dg-runtest "$srcdir/$subdir/load-category-3.m" "load-category-3a.o" "-fnext-runtime"
!     file delete load-category-3a.o
! }
  }
  
  # All done.
  dg-finish
- 
--- 27,56 ----
      set DEFAULT_CFLAGS ""
  }
  
+ set extra_flags "$DEFAULT_CFLAGS -Wno-objc-root-class"
+ 
  # Initialize `dg'.
  dg-init
  
! # Gather a list of all objective-c sources.
! set all_srcs [lsort [glob -nocomplain $srcdir/$subdir/*.m]]
! # Remove the ones ending in a.m
! set tests ""
! set pat "a\.m"
! foreach t $all_srcs {
!   if { [string match *$pat $t] } {
!     continue
!   }
!   lappend tests $t
  }
  
! # Main loop.
! dg-runtest $tests "-fgnu-runtime" $extra_flags
  
+ # darwin targets can also run code with the NeXT runtime.
  if [istarget "*-*-darwin*" ] {
!   dg-runtest $tests "-fnext-runtime" $extra_flags
  }
  
  # All done.
  dg-finish
diff -Nrcpad gcc-16-20250914/gcc/testsuite/objc.dg/special/unclaimed-category-1.m gcc-16-20250921/gcc/testsuite/objc.dg/special/unclaimed-category-1.m
*** gcc-16-20250914/gcc/testsuite/objc.dg/special/unclaimed-category-1.m	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/gcc/testsuite/objc.dg/special/unclaimed-category-1.m	Sun Sep 21 22:33:30 2025
***************
*** 1,7 ****
  /* Contributed by Nicola Pero - Fri Dec 14 08:36:00 GMT 2001 */
  /* { dg-do run } */
  /* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
! /* { dg-additional-options "-Wno-objc-root-class" } */
  
  #include <objc/objc.h>
  #include "../../objc-obj-c++-shared/runtime.h"
--- 1,7 ----
  /* Contributed by Nicola Pero - Fri Dec 14 08:36:00 GMT 2001 */
  /* { dg-do run } */
  /* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
! /* { dg-additional-sources "unclaimed-category-1a.m" } */
  
  #include <objc/objc.h>
  #include "../../objc-obj-c++-shared/runtime.h"
diff -Nrcpad gcc-16-20250914/gcc/tree-inline.cc gcc-16-20250921/gcc/tree-inline.cc
*** gcc-16-20250914/gcc/tree-inline.cc	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/gcc/tree-inline.cc	Sun Sep 21 22:33:31 2025
*************** is_parm (tree decl)
*** 986,991 ****
--- 986,1015 ----
    return (TREE_CODE (decl) == PARM_DECL);
  }
  
+ /* Copy the TREE_THIS_NOTRAP flag from OLD to T if it is appropriate to do so.
+    T and OLD must be both either INDIRECT_REF or MEM_REF.  */
+ 
+ static void
+ maybe_copy_this_notrap (copy_body_data *id, tree t, tree old)
+ {
+   gcc_assert (TREE_CODE (t) == TREE_CODE (old));
+ 
+   /* We cannot blindly propagate the TREE_THIS_NOTRAP flag if we have remapped
+      a parameter as the property might be valid only for the parameter itself,
+      typically when it is passed by reference.  But we propagate the flag when
+      this is the dereference of an entire object done in a type that has self-
+      referential size, to avoid the static size check in tree_could_trap_p.  */
+   if (TREE_THIS_NOTRAP (old)
+       && (!is_parm (TREE_OPERAND (old, 0))
+ 	  || (!id->transform_parameter && is_parm (TREE_OPERAND (t, 0)))
+ 	  || ((TREE_CODE (t) == INDIRECT_REF
+ 	       || integer_zerop (TREE_OPERAND (t, 1)))
+ 	      && TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR
+ 	      && DECL_P (TREE_OPERAND (TREE_OPERAND (t, 0), 0))
+ 	      && type_contains_placeholder_p (TREE_TYPE (t)))))
+     TREE_THIS_NOTRAP (t) = 1;
+ }
+ 
  /* Remap the dependence CLIQUE from the source to the destination function
     as specified in ID.  */
  
*************** remap_gimple_op_r (tree *tp, int *walk_s
*** 1118,1130 ****
  	        = remap_dependence_clique (id, MR_DEPENDENCE_CLIQUE (old));
  	      MR_DEPENDENCE_BASE (*tp) = MR_DEPENDENCE_BASE (old);
  	    }
! 	  /* We cannot propagate the TREE_THIS_NOTRAP flag if we have
! 	     remapped a parameter as the property might be valid only
! 	     for the parameter itself.  */
! 	  if (TREE_THIS_NOTRAP (old)
! 	      && (!is_parm (TREE_OPERAND (old, 0))
! 		  || (!id->transform_parameter && is_parm (ptr))))
! 	    TREE_THIS_NOTRAP (*tp) = 1;
  	  REF_REVERSE_STORAGE_ORDER (*tp) = REF_REVERSE_STORAGE_ORDER (old);
  	  *walk_subtrees = 0;
  	  return NULL;
--- 1142,1148 ----
  	        = remap_dependence_clique (id, MR_DEPENDENCE_CLIQUE (old));
  	      MR_DEPENDENCE_BASE (*tp) = MR_DEPENDENCE_BASE (old);
  	    }
! 	  maybe_copy_this_notrap (id, *tp, old);
  	  REF_REVERSE_STORAGE_ORDER (*tp) = REF_REVERSE_STORAGE_ORDER (old);
  	  *walk_subtrees = 0;
  	  return NULL;
*************** copy_tree_body_r (tree *tp, int *walk_su
*** 1352,1364 ****
  		      TREE_THIS_VOLATILE (*tp) = TREE_THIS_VOLATILE (old);
  		      TREE_SIDE_EFFECTS (*tp) = TREE_SIDE_EFFECTS (old);
  		      TREE_READONLY (*tp) = TREE_READONLY (old);
! 		      /* We cannot propagate the TREE_THIS_NOTRAP flag if we
! 			 have remapped a parameter as the property might be
! 			 valid only for the parameter itself.  */
! 		      if (TREE_THIS_NOTRAP (old)
! 			  && (!is_parm (TREE_OPERAND (old, 0))
! 			      || (!id->transform_parameter && is_parm (ptr))))
! 		        TREE_THIS_NOTRAP (*tp) = 1;
  		    }
  		}
  	      *walk_subtrees = 0;
--- 1370,1376 ----
  		      TREE_THIS_VOLATILE (*tp) = TREE_THIS_VOLATILE (old);
  		      TREE_SIDE_EFFECTS (*tp) = TREE_SIDE_EFFECTS (old);
  		      TREE_READONLY (*tp) = TREE_READONLY (old);
! 		      maybe_copy_this_notrap (id, *tp, old);
  		    }
  		}
  	      *walk_subtrees = 0;
*************** copy_tree_body_r (tree *tp, int *walk_su
*** 1384,1396 ****
  		= remap_dependence_clique (id, MR_DEPENDENCE_CLIQUE (old));
  	      MR_DEPENDENCE_BASE (*tp) = MR_DEPENDENCE_BASE (old);
  	    }
! 	  /* We cannot propagate the TREE_THIS_NOTRAP flag if we have
! 	     remapped a parameter as the property might be valid only
! 	     for the parameter itself.  */
! 	  if (TREE_THIS_NOTRAP (old)
! 	      && (!is_parm (TREE_OPERAND (old, 0))
! 		  || (!id->transform_parameter && is_parm (ptr))))
! 	    TREE_THIS_NOTRAP (*tp) = 1;
  	  REF_REVERSE_STORAGE_ORDER (*tp) = REF_REVERSE_STORAGE_ORDER (old);
  	  *walk_subtrees = 0;
  	  return NULL;
--- 1396,1402 ----
  		= remap_dependence_clique (id, MR_DEPENDENCE_CLIQUE (old));
  	      MR_DEPENDENCE_BASE (*tp) = MR_DEPENDENCE_BASE (old);
  	    }
! 	  maybe_copy_this_notrap (id, *tp, old);
  	  REF_REVERSE_STORAGE_ORDER (*tp) = REF_REVERSE_STORAGE_ORDER (old);
  	  *walk_subtrees = 0;
  	  return NULL;
diff -Nrcpad gcc-16-20250914/gcc/tree-logical-location.cc gcc-16-20250921/gcc/tree-logical-location.cc
*** gcc-16-20250914/gcc/tree-logical-location.cc	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/gcc/tree-logical-location.cc	Sun Sep 21 22:33:31 2025
*************** along with GCC; see the file COPYING3.
*** 26,31 ****
--- 26,32 ----
  #include "tree-logical-location.h"
  #include "langhooks.h"
  #include "intl.h"
+ #include "diagnostics/dumping.h"
  
  using namespace diagnostics::logical_locations;
  
*************** assert_valid_tree (const_tree node)
*** 40,45 ****
--- 41,53 ----
  /* class tree_logical_location_manager
     : public diagnostics::logical_locations::manager.  */
  
+ void
+ tree_logical_location_manager::dump (FILE *outfile, int indent) const
+ {
+   diagnostics::dumping::emit_heading (outfile, indent,
+ 				      "tree_logical_location_manager");
+ }
+ 
  const char *
  tree_logical_location_manager::get_short_name (key k) const
  {
diff -Nrcpad gcc-16-20250914/gcc/tree-logical-location.h gcc-16-20250921/gcc/tree-logical-location.h
*** gcc-16-20250914/gcc/tree-logical-location.h	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/gcc/tree-logical-location.h	Sun Sep 21 22:33:31 2025
*************** public:
*** 34,39 ****
--- 34,41 ----
    using key = diagnostics::logical_locations::key;
    using kind = diagnostics::logical_locations::kind;
  
+   void dump (FILE *out, int indent) const final override;
+ 
    const char *get_short_name (key) const final override;
    const char *get_name_with_scope (key) const final override;
    const char *get_internal_name (key) const final override;
diff -Nrcpad gcc-16-20250914/gcc/tree-sra.cc gcc-16-20250921/gcc/tree-sra.cc
*** gcc-16-20250914/gcc/tree-sra.cc	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/gcc/tree-sra.cc	Sun Sep 21 22:33:31 2025
*************** scan_function (void)
*** 1678,1684 ****
  		  /* If the STMT is a call to DEFERRED_INIT, avoid setting
  		     cannot_scalarize_away_bitmap.  */
  		  if (gimple_call_internal_p (stmt, IFN_DEFERRED_INIT))
! 		    ret |= !!build_access_from_expr_1 (t, stmt, true);
  		  else
  		    ret |= build_access_from_expr (t, stmt, true);
  		}
--- 1678,1690 ----
  		  /* If the STMT is a call to DEFERRED_INIT, avoid setting
  		     cannot_scalarize_away_bitmap.  */
  		  if (gimple_call_internal_p (stmt, IFN_DEFERRED_INIT))
! 		    {
! 		      struct access *access
! 			= build_access_from_expr_1 (t, stmt, true);
! 		      if (access)
! 			access->grp_assignment_write = 1;
! 		      ret |= access != NULL;
! 		    }
  		  else
  		    ret |= build_access_from_expr (t, stmt, true);
  		}
diff -Nrcpad gcc-16-20250914/gcc/tree-ssa-ccp.cc gcc-16-20250921/gcc/tree-ssa-ccp.cc
*** gcc-16-20250914/gcc/tree-ssa-ccp.cc	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/gcc/tree-ssa-ccp.cc	Sun Sep 21 22:33:31 2025
*************** optimize_unreachable (gimple_stmt_iterat
*** 3260,3288 ****
  
    if (flag_sanitize & SANITIZE_UNREACHABLE)
      return false;
! 
!   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
!     {
!       stmt = gsi_stmt (gsi);
! 
!       if (is_gimple_debug (stmt))
!        continue;
! 
!       if (glabel *label_stmt = dyn_cast <glabel *> (stmt))
! 	{
! 	  /* Verify we do not need to preserve the label.  */
! 	  if (FORCED_LABEL (gimple_label_label (label_stmt)))
! 	    return false;
! 
! 	  continue;
! 	}
! 
!       /* Only handle the case that __builtin_unreachable is the first statement
! 	 in the block.  We rely on DCE to remove stmts without side-effects
! 	 before __builtin_unreachable.  */
!       if (gsi_stmt (gsi) != gsi_stmt (i))
!         return false;
!     }
  
    ret = false;
    FOR_EACH_EDGE (e, ei, bb->preds)
--- 3260,3271 ----
  
    if (flag_sanitize & SANITIZE_UNREACHABLE)
      return false;
!   gsi = gsi_start_nondebug_after_labels_bb (bb);
!   /* Only handle the case that __builtin_unreachable is the first
!      statement in the block.  We rely on DCE to remove stmts
!      without side-effects before __builtin_unreachable.  */
!   if (*gsi != *i)
!     return false;
  
    ret = false;
    FOR_EACH_EDGE (e, ei, bb->preds)
diff -Nrcpad gcc-16-20250914/gcc/tree-ssa-forwprop.cc gcc-16-20250921/gcc/tree-ssa-forwprop.cc
*** gcc-16-20250914/gcc/tree-ssa-forwprop.cc	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/gcc/tree-ssa-forwprop.cc	Sun Sep 21 22:33:31 2025
*************** constant_pointer_difference (tree p1, tr
*** 1190,1196 ****
  /* Helper function for optimize_aggr_zeroprop.
     Props the zeroing (memset, VAL) that was done in DEST+OFFSET:LEN
     (DEFSTMT) into the STMT.  Returns true if the STMT was updated.  */
! static bool
  optimize_aggr_zeroprop_1 (gimple *defstmt, gimple *stmt,
  			  tree dest, poly_int64 offset, tree val,
  			  poly_offset_int len)
--- 1190,1196 ----
  /* Helper function for optimize_aggr_zeroprop.
     Props the zeroing (memset, VAL) that was done in DEST+OFFSET:LEN
     (DEFSTMT) into the STMT.  Returns true if the STMT was updated.  */
! static void
  optimize_aggr_zeroprop_1 (gimple *defstmt, gimple *stmt,
  			  tree dest, poly_int64 offset, tree val,
  			  poly_offset_int len)
*************** optimize_aggr_zeroprop_1 (gimple *defstm
*** 1214,1242 ****
  		: TYPE_SIZE_UNIT (TREE_TYPE (src2)));
  	/* Can only handle zero memsets. */
  	if (!integer_zerop (val))
! 	  return false;
       }
     else
!      return false;
  
    if (len2 == NULL_TREE
        || !poly_int_tree_p (len2))
!     return false;
  
    src2 = get_addr_base_and_unit_offset (src2, &offset2);
    if (src2 == NULL_TREE
        || maybe_lt (offset2, offset))
!     return false;
  
    if (!operand_equal_p (dest, src2, 0))
!     return false;
  
    /* [ dest + offset, dest + offset + len - 1 ] is set to val.
       Make sure that
       [ dest + offset2, dest + offset2 + len2 - 1 ] is a subset of that.  */
    if (maybe_gt (wi::to_poly_offset (len2) + (offset2 - offset),
  		len))
!     return false;
  
    if (dump_file && (dump_flags & TDF_DETAILS))
      {
--- 1214,1242 ----
  		: TYPE_SIZE_UNIT (TREE_TYPE (src2)));
  	/* Can only handle zero memsets. */
  	if (!integer_zerop (val))
! 	  return;
       }
     else
!      return;
  
    if (len2 == NULL_TREE
        || !poly_int_tree_p (len2))
!     return;
  
    src2 = get_addr_base_and_unit_offset (src2, &offset2);
    if (src2 == NULL_TREE
        || maybe_lt (offset2, offset))
!     return;
  
    if (!operand_equal_p (dest, src2, 0))
!     return;
  
    /* [ dest + offset, dest + offset + len - 1 ] is set to val.
       Make sure that
       [ dest + offset2, dest + offset2 + len2 - 1 ] is a subset of that.  */
    if (maybe_gt (wi::to_poly_offset (len2) + (offset2 - offset),
  		len))
!     return;
  
    if (dump_file && (dump_flags & TDF_DETAILS))
      {
*************** optimize_aggr_zeroprop_1 (gimple *defstm
*** 1282,1289 ****
    /* Mark the bb for eh cleanup if needed.  */
    if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt))
      bitmap_set_bit (to_purge, gimple_bb (stmt)->index);
- 
-   return true;
  }
  
  /* Optimize
--- 1282,1287 ----
*************** optimize_aggr_zeroprop_1 (gimple *defstm
*** 1295,1313 ****
     Similarly for memset (&a, ..., sizeof (a)); instead of a = {};
     and/or memcpy (&b, &a, sizeof (a)); instead of b = a;  */
  
! static bool
! optimize_aggr_zeroprop (gimple_stmt_iterator *gsip, bool full_walk)
  {
    ao_ref read;
-   gimple *stmt = gsi_stmt (*gsip);
    if (gimple_has_volatile_ops (stmt))
!     return false;
  
    tree dest = NULL_TREE;
    tree val = integer_zero_node;
    tree len = NULL_TREE;
    bool can_use_tbba = true;
-   bool changed = false;
  
    if (gimple_call_builtin_p (stmt, BUILT_IN_MEMSET)
        && TREE_CODE (gimple_call_arg (stmt, 0)) == ADDR_EXPR
--- 1293,1309 ----
     Similarly for memset (&a, ..., sizeof (a)); instead of a = {};
     and/or memcpy (&b, &a, sizeof (a)); instead of b = a;  */
  
! static void
! optimize_aggr_zeroprop (gimple *stmt, bool full_walk)
  {
    ao_ref read;
    if (gimple_has_volatile_ops (stmt))
!     return;
  
    tree dest = NULL_TREE;
    tree val = integer_zero_node;
    tree len = NULL_TREE;
    bool can_use_tbba = true;
  
    if (gimple_call_builtin_p (stmt, BUILT_IN_MEMSET)
        && TREE_CODE (gimple_call_arg (stmt, 0)) == ADDR_EXPR
*************** optimize_aggr_zeroprop (gimple_stmt_iter
*** 1362,1368 ****
      }
  
    if (dest == NULL_TREE)
!     return false;
  
    if (len == NULL_TREE)
      len = (TREE_CODE (dest) == COMPONENT_REF
--- 1358,1364 ----
      }
  
    if (dest == NULL_TREE)
!     return;
  
    if (len == NULL_TREE)
      len = (TREE_CODE (dest) == COMPONENT_REF
*************** optimize_aggr_zeroprop (gimple_stmt_iter
*** 1370,1382 ****
  	   : TYPE_SIZE_UNIT (TREE_TYPE (dest)));
    if (len == NULL_TREE
        || !poly_int_tree_p (len))
!     return false;
  
    /* This store needs to be on the byte boundary and pointing to an object.  */
    poly_int64 offset;
    tree dest_base = get_addr_base_and_unit_offset (dest, &offset);
    if (dest_base == NULL_TREE)
!     return false;
  
    /* Setup the worklist.  */
    auto_vec<std::pair<tree, unsigned>> worklist;
--- 1366,1378 ----
  	   : TYPE_SIZE_UNIT (TREE_TYPE (dest)));
    if (len == NULL_TREE
        || !poly_int_tree_p (len))
!     return;
  
    /* This store needs to be on the byte boundary and pointing to an object.  */
    poly_int64 offset;
    tree dest_base = get_addr_base_and_unit_offset (dest, &offset);
    if (dest_base == NULL_TREE)
!     return;
  
    /* Setup the worklist.  */
    auto_vec<std::pair<tree, unsigned>> worklist;
*************** optimize_aggr_zeroprop (gimple_stmt_iter
*** 1409,1441 ****
  						    new_limit));
  	      }
  
! 	  if (optimize_aggr_zeroprop_1 (stmt, use_stmt, dest_base, offset,
! 					 val, wi::to_poly_offset (len)))
! 	   changed = true;
  	}
      }
  
!   return changed;
  }
  
  /* Helper function for optimize_agr_copyprop.
     For aggregate copies in USE_STMT, see if DEST
     is on the lhs of USE_STMT and replace it with SRC. */
! static bool
  optimize_agr_copyprop_1 (gimple *stmt, gimple *use_stmt,
  			 tree dest, tree src)
  {
    gcc_assert (gimple_assign_load_p (use_stmt)
  	      && gimple_store_p (use_stmt));
    if (gimple_has_volatile_ops (use_stmt))
!     return false;
    tree dest2 = gimple_assign_lhs (use_stmt);
    tree src2 = gimple_assign_rhs1 (use_stmt);
    /* If the new store is `src2 = src2;` skip over it. */
!   if (operand_equal_p (src2, dest2, 0))
!     return false;
!   if (!operand_equal_p (dest, src2, 0))
!     return false;
    /* For 2 memory refences and using a temporary to do the copy,
       don't remove the temporary as the 2 memory references might overlap.
       Note t does not need to be decl as it could be field.
--- 1405,1606 ----
  						    new_limit));
  	      }
  
! 	   optimize_aggr_zeroprop_1 (stmt, use_stmt, dest_base, offset,
! 				     val, wi::to_poly_offset (len));
  	}
      }
  
! }
! 
! /* Returns the pointer to the base of the object of the
!    reference EXPR and extracts the information about
!    the offset of the access, storing it to PBYTESIZE,
!    PBYTEPOS and PREVERSEP.
!    If the access is not a byte sized or position is not
!    on the byte, return NULL.  */
! static tree
! split_core_and_offset_size (tree expr,
! 			    poly_int64 *pbytesize, poly_int64 *pbytepos,
! 			    tree *poffset, int *preversep)
! {
!   tree core;
!   machine_mode mode;
!   int unsignedp, volatilep;
!   poly_int64 bitsize;
!   poly_int64 bitpos;
!   location_t loc = EXPR_LOCATION (expr);
! 
!   core = get_inner_reference (expr, &bitsize, &bitpos,
! 			      poffset, &mode, &unsignedp, preversep,
! 			      &volatilep);
!   if (!multiple_p (bitsize, BITS_PER_UNIT, pbytesize))
!     return NULL_TREE;
!   if (!multiple_p (bitpos, BITS_PER_UNIT, pbytepos))
!     return NULL_TREE;
!   /* If we are left with MEM[a + CST] strip that and add it to the
!      pbytepos and return a. */
!   if (TREE_CODE (core) == MEM_REF)
!     {
!       poly_offset_int tem;
!       tem = wi::to_poly_offset (TREE_OPERAND (core, 1));
!       tem += *pbytepos;
!       if (tem.to_shwi (pbytepos))
! 	return TREE_OPERAND (core, 0);
!     }
!   core = build_fold_addr_expr_loc (loc, core);
!   STRIP_NOPS (core);
!   return core;
! }
! 
! /* Returns a new src based on the
!    copy `DEST = SRC` and for the old SRC2.
!    Returns null if SRC2 is not related to DEST.  */
! 
! static tree
! new_src_based_on_copy (tree src2, tree dest, tree src)
! {
!   /* If the second src is not exactly the same as dest,
!      try to handle it seperately; see it is address/size equivalent.
!      Handles `a` and `a.b` and `MEM<char[N]>(&a)` which all have
!      the same size and offsets as address/size equivalent.
!      This allows copying over a memcpy and also one for copying
!      where one field is the same size as the whole struct.  */
!   if (operand_equal_p (dest, src2))
!     return src;
!   /* if both dest and src2 are decls, then we know these 2
!      accesses can't be the same.  */
!   if (DECL_P (dest) && DECL_P (src2))
!     return NULL_TREE;
!   /* A VCE can't be used with imag/real or BFR so reject them early. */
!   if (TREE_CODE (src) == IMAGPART_EXPR
!       || TREE_CODE (src) == REALPART_EXPR
!       || TREE_CODE (src) == BIT_FIELD_REF)
!     return NULL_TREE;
!   tree core1, core2;
!   poly_int64 bytepos1, bytepos2;
!   poly_int64 bytesize1, bytesize2;
!   tree toffset1, toffset2;
!   int reversep1 = 0;
!   int reversep2 = 0;
!   poly_int64 diff = 0;
!   core1 = split_core_and_offset_size (dest, &bytesize1, &bytepos1,
! 					  &toffset1, &reversep1);
!   core2 = split_core_and_offset_size (src2, &bytesize2, &bytepos2,
! 					  &toffset2, &reversep2);
!   if (!core1 || !core2)
!     return NULL_TREE;
!   if (reversep1 != reversep2)
!     return NULL_TREE;
!   /* The sizes of the 2 accesses need to be the same. */
!   if (!known_eq (bytesize1, bytesize2))
!     return NULL_TREE;
!   if (!operand_equal_p (core1, core2, 0))
!     return NULL_TREE;
! 
!   if (toffset1 && toffset2)
!     {
!       tree type = TREE_TYPE (toffset1);
!       if (type != TREE_TYPE (toffset2))
! 	toffset2 = fold_convert (type, toffset2);
! 
!       tree tdiff = fold_build2 (MINUS_EXPR, type, toffset1, toffset2);
!       if (!cst_and_fits_in_hwi (tdiff))
! 	return NULL_TREE;
! 
!       diff = int_cst_value (tdiff);
!     }
!   else if (toffset1 || toffset2)
!     {
!       /* If only one of the offsets is non-constant, the difference cannot
! 	 be a constant.  */
!       return NULL_TREE;
!     }
!   diff += bytepos1 - bytepos2;
!   /* The offset between the 2 need to be 0. */
!   if (!known_eq (diff, 0))
!     return NULL_TREE;
!   return fold_build1 (VIEW_CONVERT_EXPR,TREE_TYPE (src2), src);
! }
! 
! /* Returns true if SRC and DEST are the same address such that
!    `SRC == DEST;` is considered a nop. This is more than an
!    operand_equal_p check as it needs to be similar to
!    new_src_based_on_copy.  */
! 
! static bool
! same_for_assignment (tree src, tree dest)
! {
!   if (operand_equal_p (dest, src, 0))
!     return true;
!   /* if both dest and src2 are decls, then we know these 2
!      accesses can't be the same.  */
!   if (DECL_P (dest) && DECL_P (src))
!     return false;
! 
!   tree core1, core2;
!   poly_int64 bytepos1, bytepos2;
!   poly_int64 bytesize1, bytesize2;
!   tree toffset1, toffset2;
!   int reversep1 = 0;
!   int reversep2 = 0;
!   poly_int64 diff = 0;
!   core1 = split_core_and_offset_size (dest, &bytesize1, &bytepos1,
! 				      &toffset1, &reversep1);
!   core2 = split_core_and_offset_size (src, &bytesize2, &bytepos2,
! 				      &toffset2, &reversep2);
!   if (!core1 || !core2)
!     return false;
!   if (reversep1 != reversep2)
!     return false;
!   /* The sizes of the 2 accesses need to be the same. */
!   if (!known_eq (bytesize1, bytesize2))
!     return false;
!   if (!operand_equal_p (core1, core2, 0))
!     return false;
!   if (toffset1 && toffset2)
!     {
!       tree type = TREE_TYPE (toffset1);
!       if (type != TREE_TYPE (toffset2))
! 	toffset2 = fold_convert (type, toffset2);
! 
!       tree tdiff = fold_build2 (MINUS_EXPR, type, toffset1, toffset2);
!       if (!cst_and_fits_in_hwi (tdiff))
! 	return false;
! 
!       diff = int_cst_value (tdiff);
!     }
!   else if (toffset1 || toffset2)
!     {
!       /* If only one of the offsets is non-constant, the difference cannot
! 	 be a constant.  */
!       return false;
!     }
!   diff += bytepos1 - bytepos2;
!   /* The offset between the 2 need to be 0. */
!   if (!known_eq (diff, 0))
!     return false;
!   return true;
  }
  
  /* Helper function for optimize_agr_copyprop.
     For aggregate copies in USE_STMT, see if DEST
     is on the lhs of USE_STMT and replace it with SRC. */
! static void
  optimize_agr_copyprop_1 (gimple *stmt, gimple *use_stmt,
  			 tree dest, tree src)
  {
    gcc_assert (gimple_assign_load_p (use_stmt)
  	      && gimple_store_p (use_stmt));
    if (gimple_has_volatile_ops (use_stmt))
!     return;
    tree dest2 = gimple_assign_lhs (use_stmt);
    tree src2 = gimple_assign_rhs1 (use_stmt);
    /* If the new store is `src2 = src2;` skip over it. */
!   if (same_for_assignment (src2, dest2))
!     return;
!   src = new_src_based_on_copy (src2, dest, src);
!   if (!src)
!     return;
    /* For 2 memory refences and using a temporary to do the copy,
       don't remove the temporary as the 2 memory references might overlap.
       Note t does not need to be decl as it could be field.
*************** optimize_agr_copyprop_1 (gimple *stmt, g
*** 1463,1469 ****
        tree len = TYPE_SIZE_UNIT (TREE_TYPE (src));
        if (len == NULL_TREE
  	  || !tree_fits_poly_int64_p (len))
! 	return false;
        tree base1 = get_addr_base_and_unit_offset (dest2, &offset1);
        tree base2 = get_addr_base_and_unit_offset (src, &offset2);
        poly_int64 size = tree_to_poly_int64 (len);
--- 1628,1634 ----
        tree len = TYPE_SIZE_UNIT (TREE_TYPE (src));
        if (len == NULL_TREE
  	  || !tree_fits_poly_int64_p (len))
! 	return;
        tree base1 = get_addr_base_and_unit_offset (dest2, &offset1);
        tree base2 = get_addr_base_and_unit_offset (src, &offset2);
        poly_int64 size = tree_to_poly_int64 (len);
*************** optimize_agr_copyprop_1 (gimple *stmt, g
*** 1488,1501 ****
  	     of overlapping.  */
  	  if (maybe_lt (align1, size)
  	      || maybe_lt (align2, size))
! 	    return false;
  	}
        /* Make sure [offset1, offset1 + len - 1] does
  	 not overlap with [offset2, offset2 + len - 1],
  	 it is ok if they are at the same location though.  */
        else if (ranges_maybe_overlap_p (offset1, size, offset2, size)
  	  && !known_eq (offset2, offset1))
! 	return false;
      }
  
    if (dump_file && (dump_flags & TDF_DETAILS))
--- 1653,1666 ----
  	     of overlapping.  */
  	  if (maybe_lt (align1, size)
  	      || maybe_lt (align2, size))
! 	    return;
  	}
        /* Make sure [offset1, offset1 + len - 1] does
  	 not overlap with [offset2, offset2 + len - 1],
  	 it is ok if they are at the same location though.  */
        else if (ranges_maybe_overlap_p (offset1, size, offset2, size)
  	  && !known_eq (offset2, offset1))
! 	return;
      }
  
    if (dump_file && (dump_flags & TDF_DETAILS))
*************** optimize_agr_copyprop_1 (gimple *stmt, g
*** 1518,1530 ****
    if (maybe_clean_or_replace_eh_stmt (orig_stmt, use_stmt))
      bitmap_set_bit (to_purge, gimple_bb (stmt)->index);
    statistics_counter_event (cfun, "copy prop for aggregate", 1);
-   return true;
  }
  
  /* Helper function for optimize_agr_copyprop_1, propagate aggregates
     into the arguments of USE_STMT if the argument matches with DEST;
     replacing it with SRC.  */
! static bool
  optimize_agr_copyprop_arg (gimple *defstmt, gcall *call,
  			   tree dest, tree src)
  {
--- 1683,1694 ----
    if (maybe_clean_or_replace_eh_stmt (orig_stmt, use_stmt))
      bitmap_set_bit (to_purge, gimple_bb (stmt)->index);
    statistics_counter_event (cfun, "copy prop for aggregate", 1);
  }
  
  /* Helper function for optimize_agr_copyprop_1, propagate aggregates
     into the arguments of USE_STMT if the argument matches with DEST;
     replacing it with SRC.  */
! static void
  optimize_agr_copyprop_arg (gimple *defstmt, gcall *call,
  			   tree dest, tree src)
  {
*************** optimize_agr_copyprop_arg (gimple *defst
*** 1536,1543 ****
  	  || is_gimple_min_invariant (*argptr)
  	  || TYPE_VOLATILE (TREE_TYPE (*argptr)))
  	continue;
!       if (!operand_equal_p (*argptr, dest, 0))
  	continue;
        if (dump_file && (dump_flags & TDF_DETAILS))
  	{
  	  fprintf (dump_file, "Simplified\n  ");
--- 1700,1709 ----
  	  || is_gimple_min_invariant (*argptr)
  	  || TYPE_VOLATILE (TREE_TYPE (*argptr)))
  	continue;
!       tree newsrc = new_src_based_on_copy (*argptr, dest, src);
!       if (!newsrc)
  	continue;
+ 
        if (dump_file && (dump_flags & TDF_DETAILS))
  	{
  	  fprintf (dump_file, "Simplified\n  ");
*************** optimize_agr_copyprop_arg (gimple *defst
*** 1545,1551 ****
  	  fprintf (dump_file, "after previous\n  ");
  	  print_gimple_stmt (dump_file, defstmt, 0, dump_flags);
  	}
!       *argptr = unshare_expr (src);
        changed = true;
        if (dump_file && (dump_flags & TDF_DETAILS))
  	{
--- 1711,1717 ----
  	  fprintf (dump_file, "after previous\n  ");
  	  print_gimple_stmt (dump_file, defstmt, 0, dump_flags);
  	}
!       *argptr = unshare_expr (newsrc);
        changed = true;
        if (dump_file && (dump_flags & TDF_DETAILS))
  	{
*************** optimize_agr_copyprop_arg (gimple *defst
*** 1555,1561 ****
      }
    if (changed)
      update_stmt (call);
-   return changed;
  }
  
  /* Optimizes
--- 1721,1726 ----
*************** optimize_agr_copyprop_arg (gimple *defst
*** 1564,1570 ****
     into
     DEST = SRC;
     DEST2 = SRC;
!    GSIP is the first statement and SRC is the common
     between the statements.
  
     Also optimizes:
--- 1729,1735 ----
     into
     DEST = SRC;
     DEST2 = SRC;
!    STMT is the first statement and SRC is the common
     between the statements.
  
     Also optimizes:
*************** optimize_agr_copyprop_arg (gimple *defst
*** 1575,1613 ****
     call_func(..., SRC, ...);
  
  */
! static bool
! optimize_agr_copyprop (gimple_stmt_iterator *gsip)
  {
-   gimple *stmt = gsi_stmt (*gsip);
    if (gimple_has_volatile_ops (stmt))
!     return false;
  
    /* Can't prop if the statement could throw.  */
    if (stmt_could_throw_p (cfun, stmt))
!     return false;
  
    tree dest = gimple_assign_lhs (stmt);
    tree src = gimple_assign_rhs1 (stmt);
    /* If the statement is `src = src;` then ignore it. */
!   if (operand_equal_p (dest, src, 0))
!     return false;
  
    tree vdef = gimple_vdef (stmt);
    imm_use_iterator iter;
    gimple *use_stmt;
-   bool changed = false;
    FOR_EACH_IMM_USE_STMT (use_stmt, iter, vdef)
      {
        if (gimple_assign_load_p (use_stmt)
! 	  && gimple_store_p (use_stmt)
! 	  && optimize_agr_copyprop_1 (stmt, use_stmt, dest, src))
! 	changed = true;
!       else if (is_gimple_call (use_stmt)
! 	       && optimize_agr_copyprop_arg (stmt, as_a<gcall*>(use_stmt),
! 					     dest, src))
! 	changed = true;
      }
-   return changed;
  }
  
  /* Optimizes builtin memcmps for small constant sizes.
--- 1740,1772 ----
     call_func(..., SRC, ...);
  
  */
! static void
! optimize_agr_copyprop (gimple *stmt)
  {
    if (gimple_has_volatile_ops (stmt))
!     return;
  
    /* Can't prop if the statement could throw.  */
    if (stmt_could_throw_p (cfun, stmt))
!     return;
  
    tree dest = gimple_assign_lhs (stmt);
    tree src = gimple_assign_rhs1 (stmt);
    /* If the statement is `src = src;` then ignore it. */
!   if (same_for_assignment (dest, src))
!     return;
  
    tree vdef = gimple_vdef (stmt);
    imm_use_iterator iter;
    gimple *use_stmt;
    FOR_EACH_IMM_USE_STMT (use_stmt, iter, vdef)
      {
        if (gimple_assign_load_p (use_stmt)
! 	  && gimple_store_p (use_stmt))
! 	optimize_agr_copyprop_1 (stmt, use_stmt, dest, src);
!       else if (is_gimple_call (use_stmt))
! 	optimize_agr_copyprop_arg (stmt, as_a<gcall*>(use_stmt), dest, src);
      }
  }
  
  /* Optimizes builtin memcmps for small constant sizes.
*************** simplify_builtin_call (gimple_stmt_itera
*** 2007,2014 ****
  	{
  	  /* Try to prop the zeroing/value of the memset to memcpy
  	     if the dest is an address and the value is a constant. */
! 	  if (optimize_aggr_zeroprop (gsi_p, full_walk))
! 	    return true;
  	}
        return simplify_builtin_memcpy_memset (gsi_p, as_a<gcall*>(stmt2));
  
--- 2166,2172 ----
  	{
  	  /* Try to prop the zeroing/value of the memset to memcpy
  	     if the dest is an address and the value is a constant. */
! 	  optimize_aggr_zeroprop (stmt2, full_walk);
  	}
        return simplify_builtin_memcpy_memset (gsi_p, as_a<gcall*>(stmt2));
  
*************** pass_forwprop::execute (function *fun)
*** 5150,5168 ****
  		  {
  		    tree rhs1 = gimple_assign_rhs1 (stmt);
  		    enum tree_code code = gimple_assign_rhs_code (stmt);
! 		    if (gimple_store_p (stmt) && optimize_aggr_zeroprop (&gsi, full_walk))
! 		      {
! 			changed = true;
! 			break;
! 		      }
! 		    if (gimple_assign_load_p (stmt) && gimple_store_p (stmt)
! 			&& optimize_agr_copyprop (&gsi))
  		      {
! 			changed = true;
! 			break;
  		      }
! 
! 		    if (TREE_CODE_CLASS (code) == tcc_comparison)
  		      changed |= forward_propagate_into_comparison (&gsi);
  		    else if ((code == PLUS_EXPR
  			      || code == BIT_IOR_EXPR
--- 5308,5320 ----
  		  {
  		    tree rhs1 = gimple_assign_rhs1 (stmt);
  		    enum tree_code code = gimple_assign_rhs_code (stmt);
! 		    if (gimple_store_p (stmt))
  		      {
! 			optimize_aggr_zeroprop (stmt, full_walk);
! 			if (gimple_assign_load_p (stmt))
! 			  optimize_agr_copyprop (stmt);
  		      }
! 		    else if (TREE_CODE_CLASS (code) == tcc_comparison)
  		      changed |= forward_propagate_into_comparison (&gsi);
  		    else if ((code == PLUS_EXPR
  			      || code == BIT_IOR_EXPR
diff -Nrcpad gcc-16-20250914/gcc/tree-ssa-math-opts.cc gcc-16-20250921/gcc/tree-ssa-math-opts.cc
*** gcc-16-20250914/gcc/tree-ssa-math-opts.cc	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/gcc/tree-ssa-math-opts.cc	Sun Sep 21 22:33:31 2025
*************** build_and_insert_cast (gimple_stmt_itera
*** 1632,1638 ****
  		       tree type, tree val)
  {
    tree result = make_ssa_name (type);
!   gassign *stmt = gimple_build_assign (result, NOP_EXPR, val);
    gimple_set_location (stmt, loc);
    gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
    return result;
--- 1632,1658 ----
  		       tree type, tree val)
  {
    tree result = make_ssa_name (type);
!   tree rhs = val;
! 
!   if (TREE_CODE (val) == SSA_NAME)
!     {
!       gimple *def = SSA_NAME_DEF_STMT (val);
! 
!       if (is_gimple_assign (def)
! 	  && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def)))
! 	{
! 	  tree cast_rhs = gimple_assign_rhs1 (def);
! 	  unsigned rhs_prec = TYPE_PRECISION (TREE_TYPE (cast_rhs));
! 	  unsigned type_prec = TYPE_PRECISION (type);
! 	  unsigned val_prec = TYPE_PRECISION (TREE_TYPE (val));
! 
! 	  if (type_prec >= rhs_prec && val_prec >= rhs_prec)
! 	    rhs = cast_rhs;
! 	}
!     }
! 
!   gassign *stmt = gimple_build_assign (result, NOP_EXPR, rhs);
! 
    gimple_set_location (stmt, loc);
    gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
    return result;
*************** math_opts_dom_walker::after_dom_children
*** 6509,6514 ****
--- 6529,6535 ----
  	      break;
  
  	    case BIT_IOR_EXPR:
+ 	      match_unsigned_saturation_mul (&gsi, as_a<gassign *> (stmt));
  	      match_saturation_add_with_assign (&gsi, as_a<gassign *> (stmt));
  	      match_unsigned_saturation_trunc (&gsi, as_a<gassign *> (stmt));
  	      /* fall-through  */
diff -Nrcpad gcc-16-20250914/gcc/tree-ssa-pre.cc gcc-16-20250921/gcc/tree-ssa-pre.cc
*** gcc-16-20250914/gcc/tree-ssa-pre.cc	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/gcc/tree-ssa-pre.cc	Sun Sep 21 22:33:31 2025
*************** sorted_array_from_bitmap_set (bitmap_set
*** 908,914 ****
  /* Subtract all expressions contained in ORIG from DEST.  */
  
  static bitmap_set_t
! bitmap_set_subtract_expressions (bitmap_set_t dest, bitmap_set_t orig)
  {
    bitmap_set_t result = bitmap_set_new ();
    bitmap_iterator bi;
--- 908,915 ----
  /* Subtract all expressions contained in ORIG from DEST.  */
  
  static bitmap_set_t
! bitmap_set_subtract_expressions (bitmap_set_t dest, bitmap_set_t orig,
! 				 bool copy_values = false)
  {
    bitmap_set_t result = bitmap_set_new ();
    bitmap_iterator bi;
*************** bitmap_set_subtract_expressions (bitmap_
*** 917,928 ****
    bitmap_and_compl (&result->expressions, &dest->expressions,
  		    &orig->expressions);
  
!   FOR_EACH_EXPR_ID_IN_SET (result, i, bi)
!     {
!       pre_expr expr = expression_for_id (i);
!       unsigned int value_id = get_expr_value_id (expr);
!       bitmap_set_bit (&result->values, value_id);
!     }
  
    return result;
  }
--- 918,932 ----
    bitmap_and_compl (&result->expressions, &dest->expressions,
  		    &orig->expressions);
  
!   if (copy_values)
!     bitmap_copy (&result->values, &dest->values);
!   else
!     FOR_EACH_EXPR_ID_IN_SET (result, i, bi)
!       {
! 	pre_expr expr = expression_for_id (i);
! 	unsigned int value_id = get_expr_value_id (expr);
! 	bitmap_set_bit (&result->values, value_id);
!       }
  
    return result;
  }
*************** compute_antic_aux (basic_block block, bo
*** 2076,2082 ****
    edge e;
    edge_iterator ei;
  
-   bool was_visited = BB_VISITED (block);
    bool changed = ! BB_VISITED (block);
    bool any_max_on_edge = false;
  
--- 2080,2085 ----
*************** compute_antic_aux (basic_block block, bo
*** 2192,2199 ****
       invalid if translated from ANTIC_OUT to ANTIC_IN.  */
    prune_clobbered_mems (ANTIC_OUT, block, any_max_on_edge);
  
!   /* Generate ANTIC_OUT - TMP_GEN.  */
!   S = bitmap_set_subtract_expressions (ANTIC_OUT, TMP_GEN (block));
  
    /* Start ANTIC_IN with EXP_GEN - TMP_GEN.  */
    ANTIC_IN (block) = bitmap_set_subtract_expressions (EXP_GEN (block),
--- 2195,2207 ----
       invalid if translated from ANTIC_OUT to ANTIC_IN.  */
    prune_clobbered_mems (ANTIC_OUT, block, any_max_on_edge);
  
!   /* Generate ANTIC_OUT - TMP_GEN.  Note when there's a MAX solution
!      on one edge do not prune values as we need to consider the resulting
!      expression set MAX as well.  This avoids a later growing ANTIC_IN
!      value-set during iteration, when the explicitly represented
!      expression set grows.  */
!   S = bitmap_set_subtract_expressions (ANTIC_OUT, TMP_GEN (block),
! 				       any_max_on_edge);
  
    /* Start ANTIC_IN with EXP_GEN - TMP_GEN.  */
    ANTIC_IN (block) = bitmap_set_subtract_expressions (EXP_GEN (block),
*************** compute_antic_aux (basic_block block, bo
*** 2207,2241 ****
    /* clean (ANTIC_IN (block)) is defered to after the iteration converged
       because it can cause non-convergence, see for example PR81181.  */
  
-   /* Intersect ANTIC_IN with the old ANTIC_IN.  This is required until
-      we properly represent the maximum expression set, thus not prune
-      values without expressions during the iteration.  */
-   if (was_visited
-       && bitmap_and_into (&ANTIC_IN (block)->values, &old->values))
-     {
-       if (dump_file && (dump_flags & TDF_DETAILS))
- 	fprintf (dump_file, "warning: intersecting with old ANTIC_IN "
- 		 "shrinks the set\n");
-       /* Prune expressions not in the value set.  */
-       bitmap_iterator bi;
-       unsigned int i;
-       unsigned int to_clear = -1U;
-       FOR_EACH_EXPR_ID_IN_SET (ANTIC_IN (block), i, bi)
- 	{
- 	  if (to_clear != -1U)
- 	    {
- 	      bitmap_clear_bit (&ANTIC_IN (block)->expressions, to_clear);
- 	      to_clear = -1U;
- 	    }
- 	  pre_expr expr = expression_for_id (i);
- 	  unsigned int value_id = get_expr_value_id (expr);
- 	  if (!bitmap_bit_p (&ANTIC_IN (block)->values, value_id))
- 	    to_clear = i;
- 	}
-       if (to_clear != -1U)
- 	bitmap_clear_bit (&ANTIC_IN (block)->expressions, to_clear);
-     }
- 
    if (!bitmap_set_equal (old, ANTIC_IN (block)))
      changed = true;
  
--- 2215,2220 ----
diff -Nrcpad gcc-16-20250914/gcc/tree-ssa-sccvn.cc gcc-16-20250921/gcc/tree-ssa-sccvn.cc
*** gcc-16-20250914/gcc/tree-ssa-sccvn.cc	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/gcc/tree-ssa-sccvn.cc	Sun Sep 21 22:33:31 2025
*************** vn_nary_op_insert_into (vn_nary_op_t vno
*** 4699,4710 ****
  	    = BASIC_BLOCK_FOR_FN (cfun, vno->u.values->valid_dominated_by_p[0]);
  	  vn_pval *nval = vno->u.values;
  	  vn_pval **next = &vno->u.values;
! 	  bool found = false;
  	  for (vn_pval *val = (*slot)->u.values; val; val = val->next)
  	    {
  	      if (expressions_equal_p (val->result, nval->result))
  		{
! 		  found = true;
  		  for (unsigned i = 0; i < val->n; ++i)
  		    {
  		      basic_block val_bb
--- 4699,4715 ----
  	    = BASIC_BLOCK_FOR_FN (cfun, vno->u.values->valid_dominated_by_p[0]);
  	  vn_pval *nval = vno->u.values;
  	  vn_pval **next = &vno->u.values;
! 	  vn_pval *ins = NULL;
! 	  vn_pval *ins_at = NULL;
! 	  /* Find an existing value to append to.  */
  	  for (vn_pval *val = (*slot)->u.values; val; val = val->next)
  	    {
  	      if (expressions_equal_p (val->result, nval->result))
  		{
! 		  /* Limit the number of places we register a predicate
! 		     as valid.  */
! 		  if (val->n > 8)
! 		    return *slot;
  		  for (unsigned i = 0; i < val->n; ++i)
  		    {
  		      basic_block val_bb
*************** vn_nary_op_insert_into (vn_nary_op_t vno
*** 4718,4750 ****
  			gcc_assert (!dominated_by_p (CDI_DOMINATORS,
  						     val_bb, vno_bb));
  		    }
! 		  /* Append value.  */
! 		  *next = (vn_pval *) obstack_alloc (&vn_tables_obstack,
! 						     sizeof (vn_pval)
! 						     + val->n * sizeof (int));
! 		  (*next)->next = NULL;
! 		  (*next)->result = val->result;
! 		  (*next)->n = val->n + 1;
! 		  memcpy ((*next)->valid_dominated_by_p,
  			  val->valid_dominated_by_p,
  			  val->n * sizeof (int));
! 		  (*next)->valid_dominated_by_p[val->n] = vno_bb->index;
! 		  next = &(*next)->next;
  		  if (dump_file && (dump_flags & TDF_DETAILS))
  		    fprintf (dump_file, "Appending predicate to value.\n");
! 		  continue;
  		}
- 	      /* Copy other predicated values.  */
- 	      *next = (vn_pval *) obstack_alloc (&vn_tables_obstack,
- 						 sizeof (vn_pval)
- 						 + (val->n-1) * sizeof (int));
- 	      memcpy (*next, val, sizeof (vn_pval) + (val->n-1) * sizeof (int));
- 	      (*next)->next = NULL;
  	      next = &(*next)->next;
  	    }
! 	  if (!found)
  	    *next = nval;
- 
  	  *slot = vno;
  	  vno->next = last_inserted_nary;
  	  last_inserted_nary = vno;
--- 4723,4767 ----
  			gcc_assert (!dominated_by_p (CDI_DOMINATORS,
  						     val_bb, vno_bb));
  		    }
! 		  /* Append the location.  */
! 		  ins_at = val;
! 		  ins = (vn_pval *) obstack_alloc (&vn_tables_obstack,
! 						   sizeof (vn_pval)
! 						   + val->n * sizeof (int));
! 		  ins->next = NULL;
! 		  ins->result = val->result;
! 		  ins->n = val->n + 1;
! 		  memcpy (ins->valid_dominated_by_p,
  			  val->valid_dominated_by_p,
  			  val->n * sizeof (int));
! 		  ins->valid_dominated_by_p[val->n] = vno_bb->index;
  		  if (dump_file && (dump_flags & TDF_DETAILS))
  		    fprintf (dump_file, "Appending predicate to value.\n");
! 		  break;
! 		}
! 	    }
! 	  /* Copy the rest of the value chain.  */
! 	  for (vn_pval *val = (*slot)->u.values; val; val = val->next)
! 	    {
! 	      if (val == ins_at)
! 		/* Replace the node we appended to.  */
! 		*next = ins;
! 	      else
! 		{
! 		  /* Copy other predicated values.  */
! 		  *next = (vn_pval *) obstack_alloc (&vn_tables_obstack,
! 						     sizeof (vn_pval)
! 						     + ((val->n-1)
! 							* sizeof (int)));
! 		  memcpy (*next, val,
! 			  sizeof (vn_pval) + (val->n-1) * sizeof (int));
! 		  (*next)->next = NULL;
  		}
  	      next = &(*next)->next;
  	    }
! 	  /* Append the value if we didn't find it.  */
! 	  if (!ins_at)
  	    *next = nval;
  	  *slot = vno;
  	  vno->next = last_inserted_nary;
  	  last_inserted_nary = vno;
*************** vn_nary_op_insert_pieces_predicated (uns
*** 4819,4825 ****
  				     tree result, unsigned int value_id,
  				     edge pred_e)
  {
!   gcc_assert (can_track_predicate_on_edge (pred_e));
  
    if (dump_file && (dump_flags & TDF_DETAILS)
        /* ???  Fix dumping, but currently we only get comparisons.  */
--- 4836,4843 ----
  				     tree result, unsigned int value_id,
  				     edge pred_e)
  {
!   if (flag_checking)
!     gcc_assert (can_track_predicate_on_edge (pred_e));
  
    if (dump_file && (dump_flags & TDF_DETAILS)
        /* ???  Fix dumping, but currently we only get comparisons.  */
*************** dominated_by_p_w_unex (basic_block bb1,
*** 5258,5264 ****
  	      }
  	    succe = e;
  	  }
!       if (succe)
  	{
  	  /* Verify the reached block is only reached through succe.
  	     If there is only one edge we can spare us the dominator
--- 5276,5286 ----
  	      }
  	    succe = e;
  	  }
!       if (succe
! 	  /* Limit the number of edges we check, we should bring in
! 	     context from the iteration and compute the single
! 	     executable incoming edge when visiting a block.  */
! 	  && EDGE_COUNT (succe->dest->preds) < 8)
  	{
  	  /* Verify the reached block is only reached through succe.
  	     If there is only one edge we can spare us the dominator
diff -Nrcpad gcc-16-20250914/gcc/tree-vect-loop.cc gcc-16-20250921/gcc/tree-vect-loop.cc
*** gcc-16-20250914/gcc/tree-vect-loop.cc	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/gcc/tree-vect-loop.cc	Sun Sep 21 22:33:31 2025
*************** vect_reduction_update_partial_vector_usa
*** 6753,6760 ****
  			= get_masked_reduction_fn (reduc_fn, vectype_in);
        vec_loop_masks *masks = &LOOP_VINFO_MASKS (loop_vinfo);
        vec_loop_lens *lens = &LOOP_VINFO_LENS (loop_vinfo);
!       unsigned nvectors = vect_get_num_copies (loop_vinfo, slp_node,
! 					       vectype_in);
  
        if (mask_reduc_fn == IFN_MASK_LEN_FOLD_LEFT_PLUS)
  	vect_record_loop_len (loop_vinfo, lens, nvectors, vectype_in, 1);
--- 6753,6759 ----
  			= get_masked_reduction_fn (reduc_fn, vectype_in);
        vec_loop_masks *masks = &LOOP_VINFO_MASKS (loop_vinfo);
        vec_loop_lens *lens = &LOOP_VINFO_LENS (loop_vinfo);
!       unsigned nvectors = vect_get_num_copies (loop_vinfo, slp_node);
  
        if (mask_reduc_fn == IFN_MASK_LEN_FOLD_LEFT_PLUS)
  	vect_record_loop_len (loop_vinfo, lens, nvectors, vectype_in, 1);
*************** vectorizable_lane_reducing (loop_vec_inf
*** 6857,6868 ****
  	return false;
      }
  
!   tree vectype_in = SLP_TREE_VECTYPE (SLP_TREE_CHILDREN (slp_node)[0]);
    gcc_assert (vectype_in);
  
    /* Compute number of effective vector statements for costing.  */
!   unsigned int ncopies_for_cost = vect_get_num_copies (loop_vinfo, slp_node,
! 						       vectype_in);
    gcc_assert (ncopies_for_cost >= 1);
  
    if (vect_is_emulated_mixed_dot_prod (slp_node))
--- 6856,6867 ----
  	return false;
      }
  
!   slp_tree node_in = SLP_TREE_CHILDREN (slp_node)[0];
!   tree vectype_in = SLP_TREE_VECTYPE (node_in);
    gcc_assert (vectype_in);
  
    /* Compute number of effective vector statements for costing.  */
!   unsigned int ncopies_for_cost = vect_get_num_copies (loop_vinfo, node_in);
    gcc_assert (ncopies_for_cost >= 1);
  
    if (vect_is_emulated_mixed_dot_prod (slp_node))
*************** vectorizable_lane_reducing (loop_vec_inf
*** 6888,6894 ****
      {
        enum tree_code code = gimple_assign_rhs_code (stmt);
        vect_reduction_update_partial_vector_usage (loop_vinfo, reduc_info,
! 						  slp_node, code, type,
  						  vectype_in);
      }
  
--- 6887,6893 ----
      {
        enum tree_code code = gimple_assign_rhs_code (stmt);
        vect_reduction_update_partial_vector_usage (loop_vinfo, reduc_info,
! 						  node_in, code, type,
  						  vectype_in);
      }
  
*************** vectorizable_reduction (loop_vec_info lo
*** 7374,7380 ****
    if (STMT_VINFO_LIVE_P (phi_info))
      return false;
  
!   ncopies = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
  
    gcc_assert (ncopies >= 1);
  
--- 7373,7379 ----
    if (STMT_VINFO_LIVE_P (phi_info))
      return false;
  
!   ncopies = vect_get_num_copies (loop_vinfo, slp_node);
  
    gcc_assert (ncopies >= 1);
  
*************** vect_transform_reduction (loop_vec_info
*** 7908,7914 ****
    int reduc_index = SLP_TREE_REDUC_IDX (slp_node);
    tree vectype_in = SLP_TREE_VECTYPE (SLP_TREE_CHILDREN (slp_node)[0]);
  
!   vec_num = vect_get_num_copies (loop_vinfo, slp_node, vectype_in);
  
    code_helper code = canonicalize_code (op.code, op.type);
    internal_fn cond_fn = get_conditional_internal_fn (code, op.type);
--- 7907,7913 ----
    int reduc_index = SLP_TREE_REDUC_IDX (slp_node);
    tree vectype_in = SLP_TREE_VECTYPE (SLP_TREE_CHILDREN (slp_node)[0]);
  
!   vec_num = vect_get_num_copies (loop_vinfo, SLP_TREE_CHILDREN (slp_node)[0]);
  
    code_helper code = canonicalize_code (op.code, op.type);
    internal_fn cond_fn = get_conditional_internal_fn (code, op.type);
*************** vect_transform_reduction (loop_vec_info
*** 8087,8093 ****
        gcc_assert (reduc_vectype_in);
  
        unsigned effec_reduc_ncopies
! 	= vect_get_num_copies (loop_vinfo, slp_node, reduc_vectype_in);
  
        gcc_assert (effec_ncopies <= effec_reduc_ncopies);
  
--- 8086,8092 ----
        gcc_assert (reduc_vectype_in);
  
        unsigned effec_reduc_ncopies
! 	= vect_get_num_copies (loop_vinfo, SLP_TREE_CHILDREN (slp_node)[0]);
  
        gcc_assert (effec_ncopies <= effec_reduc_ncopies);
  
*************** vect_transform_cycle_phi (loop_vec_info
*** 8247,8253 ****
      /* Leave the scalar phi in place.  */
      return true;
  
!   vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
  
    /* Check whether we should use a single PHI node and accumulate
       vectors to one before the backedge.  */
--- 8246,8252 ----
      /* Leave the scalar phi in place.  */
      return true;
  
!   vec_num = vect_get_num_copies (loop_vinfo, slp_node);
  
    /* Check whether we should use a single PHI node and accumulate
       vectors to one before the backedge.  */
*************** vect_transform_lc_phi (loop_vec_info loo
*** 8502,8508 ****
  /* Vectorizes PHIs.  */
  
  bool
! vectorizable_phi (bb_vec_info,
  		  stmt_vec_info stmt_info,
  		  slp_tree slp_node, stmt_vector_for_cost *cost_vec)
  {
--- 8501,8507 ----
  /* Vectorizes PHIs.  */
  
  bool
! vectorizable_phi (bb_vec_info vinfo,
  		  stmt_vec_info stmt_info,
  		  slp_tree slp_node, stmt_vector_for_cost *cost_vec)
  {
*************** vectorizable_phi (bb_vec_info,
*** 8553,8559 ****
  	 for the scalar and the vector PHIs.  This avoids artificially
  	 favoring the vector path (but may pessimize it in some cases).  */
        if (gimple_phi_num_args (as_a <gphi *> (stmt_info->stmt)) > 1)
! 	record_stmt_cost (cost_vec, SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node),
  			  vector_stmt, slp_node, vectype, 0, vect_body);
        SLP_TREE_TYPE (slp_node) = phi_info_type;
        return true;
--- 8552,8558 ----
  	 for the scalar and the vector PHIs.  This avoids artificially
  	 favoring the vector path (but may pessimize it in some cases).  */
        if (gimple_phi_num_args (as_a <gphi *> (stmt_info->stmt)) > 1)
! 	record_stmt_cost (cost_vec, vect_get_num_copies (vinfo, slp_node),
  			  vector_stmt, slp_node, vectype, 0, vect_body);
        SLP_TREE_TYPE (slp_node) = phi_info_type;
        return true;
*************** vectorizable_recurr (loop_vec_info loop_
*** 8657,8663 ****
      return false;
  
    tree vectype = SLP_TREE_VECTYPE (slp_node);
!   unsigned ncopies = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
    poly_int64 nunits = TYPE_VECTOR_SUBPARTS (vectype);
    unsigned dist = SLP_TREE_LANES (slp_node);
    /* We need to be able to make progress with a single vector.  */
--- 8656,8662 ----
      return false;
  
    tree vectype = SLP_TREE_VECTYPE (slp_node);
!   unsigned ncopies = vect_get_num_copies (loop_vinfo, slp_node);
    poly_int64 nunits = TYPE_VECTOR_SUBPARTS (vectype);
    unsigned dist = SLP_TREE_LANES (slp_node);
    /* We need to be able to make progress with a single vector.  */
*************** vectorizable_nonlinear_induction (loop_v
*** 9147,9153 ****
  
    gcc_assert (induction_type > vect_step_op_add);
  
!   ncopies = vect_get_num_copies (loop_vinfo, slp_node, vectype);
    gcc_assert (ncopies >= 1);
  
    /* FORNOW. Only handle nonlinear induction in the same loop.  */
--- 9146,9152 ----
  
    gcc_assert (induction_type > vect_step_op_add);
  
!   ncopies = vect_get_num_copies (loop_vinfo, slp_node);
    gcc_assert (ncopies >= 1);
  
    /* FORNOW. Only handle nonlinear induction in the same loop.  */
*************** vectorizable_induction (loop_vec_info lo
*** 9566,9571 ****
--- 9565,9571 ----
  	}
      }
  
+   unsigned nvects = vect_get_num_copies (loop_vinfo, slp_node);
    if (cost_vec) /* transformation not required.  */
      {
        unsigned inside_cost = 0, prologue_cost = 0;
*************** vectorizable_induction (loop_vec_info lo
*** 9584,9591 ****
  	    return false;
  	  }
        /* loop cost for vec_loop.  */
!       inside_cost = record_stmt_cost (cost_vec,
! 				      SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node),
  				      vector_stmt, slp_node, 0, vect_body);
        /* prologue cost for vec_init (if not nested) and step.  */
        prologue_cost = record_stmt_cost (cost_vec, 1 + !nested_in_vect_loop,
--- 9584,9590 ----
  	    return false;
  	  }
        /* loop cost for vec_loop.  */
!       inside_cost = record_stmt_cost (cost_vec, nvects,
  				      vector_stmt, slp_node, 0, vect_body);
        /* prologue cost for vec_init (if not nested) and step.  */
        prologue_cost = record_stmt_cost (cost_vec, 1 + !nested_in_vect_loop,
*************** vectorizable_induction (loop_vec_info lo
*** 9645,9651 ****
      }
  
    /* Now generate the IVs.  */
-   unsigned nvects = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
    gcc_assert (multiple_p (nunits * nvects, group_size));
    unsigned nivs;
    unsigned HOST_WIDE_INT const_nunits;
--- 9644,9649 ----
*************** vectorizable_live_operation (vec_info *v
*** 10195,10201 ****
       all the slp vectors. Calculate which slp vector it is and the index
       within.  */
    int num_scalar = SLP_TREE_LANES (slp_node);
!   int num_vec = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
    poly_uint64 pos = (num_vec * nunits) - num_scalar + slp_index;
  
    /* Calculate which vector contains the result, and which lane of
--- 10193,10199 ----
       all the slp vectors. Calculate which slp vector it is and the index
       within.  */
    int num_scalar = SLP_TREE_LANES (slp_node);
!   int num_vec = vect_get_num_copies (vinfo, slp_node);
    poly_uint64 pos = (num_vec * nunits) - num_scalar + slp_index;
  
    /* Calculate which vector contains the result, and which lane of
*************** vectorizable_live_operation (vec_info *v
*** 10223,10229 ****
  				 "the loop.\n");
  	      LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo) = false;
  	    }
! 	  else if (SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node) > 1)
  	    {
  	      if (dump_enabled_p ())
  		dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
--- 10221,10227 ----
  				 "the loop.\n");
  	      LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo) = false;
  	    }
! 	  else if (num_vec > 1)
  	    {
  	      if (dump_enabled_p ())
  		dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
diff -Nrcpad gcc-16-20250914/gcc/tree-vect-slp.cc gcc-16-20250921/gcc/tree-vect-slp.cc
*** gcc-16-20250914/gcc/tree-vect-slp.cc	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/gcc/tree-vect-slp.cc	Sun Sep 21 22:33:31 2025
*************** _slp_tree::_slp_tree ()
*** 112,118 ****
    SLP_TREE_SCALAR_STMTS (this) = vNULL;
    SLP_TREE_SCALAR_OPS (this) = vNULL;
    SLP_TREE_VEC_DEFS (this) = vNULL;
-   SLP_TREE_NUMBER_OF_VEC_STMTS (this) = 0;
    SLP_TREE_CHILDREN (this) = vNULL;
    SLP_TREE_LOAD_PERMUTATION (this) = vNULL;
    SLP_TREE_LANE_PERMUTATION (this) = vNULL;
--- 112,117 ----
*************** vect_slp_analyze_node_operations_1 (vec_
*** 8042,8058 ****
  				    slp_instance node_instance,
  				    stmt_vector_for_cost *cost_vec)
  {
-   /* Calculate the number of vector statements to be created for the scalar
-      stmts in this node.  It is the number of scalar elements in one scalar
-      iteration (DR_GROUP_SIZE) multiplied by VF divided by the number of
-      elements in a vector.  For single-defuse-cycle, lane-reducing op, and
-      PHI statement that starts reduction comprised of only lane-reducing ops,
-      the number is more than effective vector statements actually required.  */
-   if (SLP_TREE_VECTYPE (node))
-     SLP_TREE_NUMBER_OF_VEC_STMTS (node) = vect_get_num_copies (vinfo, node);
-   else
-     SLP_TREE_NUMBER_OF_VEC_STMTS (node) = 0;
- 
    /* Handle purely internal nodes.  */
    if (SLP_TREE_PERMUTE_P (node))
      {
--- 8041,8046 ----
*************** vect_scalar_ops_slice_hash::equal (const
*** 8220,8226 ****
     by NODE.  */
  
  static void
! vect_prologue_cost_for_slp (slp_tree node,
  			    stmt_vector_for_cost *cost_vec)
  {
    /* There's a special case of an existing vector, that costs nothing.  */
--- 8208,8214 ----
     by NODE.  */
  
  static void
! vect_prologue_cost_for_slp (vec_info *vinfo, slp_tree node,
  			    stmt_vector_for_cost *cost_vec)
  {
    /* There's a special case of an existing vector, that costs nothing.  */
*************** vect_prologue_cost_for_slp (slp_tree nod
*** 8234,8247 ****
    unsigned group_size = SLP_TREE_SCALAR_OPS (node).length ();
    unsigned HOST_WIDE_INT const_nunits;
    unsigned nelt_limit;
    auto ops = &SLP_TREE_SCALAR_OPS (node);
!   auto_vec<unsigned int> starts (SLP_TREE_NUMBER_OF_VEC_STMTS (node));
    if (TYPE_VECTOR_SUBPARTS (vectype).is_constant (&const_nunits)
        && ! multiple_p (const_nunits, group_size))
      {
        nelt_limit = const_nunits;
        hash_set<vect_scalar_ops_slice_hash> vector_ops;
!       for (unsigned int i = 0; i < SLP_TREE_NUMBER_OF_VEC_STMTS (node); ++i)
  	if (!vector_ops.add ({ ops, i * nelt_limit, nelt_limit }))
  	  starts.quick_push (i * nelt_limit);
      }
--- 8222,8236 ----
    unsigned group_size = SLP_TREE_SCALAR_OPS (node).length ();
    unsigned HOST_WIDE_INT const_nunits;
    unsigned nelt_limit;
+   unsigned nvectors = vect_get_num_copies (vinfo, node);
    auto ops = &SLP_TREE_SCALAR_OPS (node);
!   auto_vec<unsigned int> starts (nvectors);
    if (TYPE_VECTOR_SUBPARTS (vectype).is_constant (&const_nunits)
        && ! multiple_p (const_nunits, group_size))
      {
        nelt_limit = const_nunits;
        hash_set<vect_scalar_ops_slice_hash> vector_ops;
!       for (unsigned int i = 0; i < nvectors; ++i)
  	if (!vector_ops.add ({ ops, i * nelt_limit, nelt_limit }))
  	  starts.quick_push (i * nelt_limit);
      }
*************** vect_slp_analyze_node_operations (vec_in
*** 8395,8404 ****
  	      continue;
  	    }
  
- 	  SLP_TREE_NUMBER_OF_VEC_STMTS (child)
- 		= vect_get_num_copies (vinfo, child);
  	  /* And cost them.  */
! 	  vect_prologue_cost_for_slp (child, cost_vec);
  	}
  
    /* If this node or any of its children can't be vectorized, try pruning
--- 8384,8391 ----
  	      continue;
  	    }
  
  	  /* And cost them.  */
! 	  vect_prologue_cost_for_slp (vinfo, child, cost_vec);
  	}
  
    /* If this node or any of its children can't be vectorized, try pruning
*************** vect_create_constant_vectors (vec_info *
*** 10337,10343 ****
    /* We always want SLP_TREE_VECTYPE (op_node) here correctly set.  */
    vector_type = SLP_TREE_VECTYPE (op_node);
  
!   unsigned int number_of_vectors = SLP_TREE_NUMBER_OF_VEC_STMTS (op_node);
    SLP_TREE_VEC_DEFS (op_node).create (number_of_vectors);
    auto_vec<tree> voprnds (number_of_vectors);
  
--- 10324,10330 ----
    /* We always want SLP_TREE_VECTYPE (op_node) here correctly set.  */
    vector_type = SLP_TREE_VECTYPE (op_node);
  
!   unsigned int number_of_vectors = vect_get_num_copies (vinfo, op_node);
    SLP_TREE_VEC_DEFS (op_node).create (number_of_vectors);
    auto_vec<tree> voprnds (number_of_vectors);
  
*************** vect_get_slp_vect_def (slp_tree slp_node
*** 10562,10568 ****
  void
  vect_get_slp_defs (slp_tree slp_node, vec<tree> *vec_defs)
  {
!   vec_defs->create (SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node));
    vec_defs->splice (SLP_TREE_VEC_DEFS (slp_node));
  }
  
--- 10549,10555 ----
  void
  vect_get_slp_defs (slp_tree slp_node, vec<tree> *vec_defs)
  {
!   vec_defs->create (SLP_TREE_VEC_DEFS (slp_node).length ());
    vec_defs->splice (SLP_TREE_VEC_DEFS (slp_node));
  }
  
*************** vect_transform_slp_perm_load_1 (vec_info
*** 10616,10622 ****
  
    mode = TYPE_MODE (vectype);
    poly_uint64 nunits = TYPE_VECTOR_SUBPARTS (vectype);
!   unsigned int nstmts = SLP_TREE_NUMBER_OF_VEC_STMTS (node);
  
    /* Initialize the vect stmts of NODE to properly insert the generated
       stmts later.  */
--- 10603,10609 ----
  
    mode = TYPE_MODE (vectype);
    poly_uint64 nunits = TYPE_VECTOR_SUBPARTS (vectype);
!   unsigned int nstmts = vect_get_num_copies (vinfo, node);
  
    /* Initialize the vect stmts of NODE to properly insert the generated
       stmts later.  */
*************** vect_transform_slp_perm_load_1 (vec_info
*** 10816,10822 ****
    if (n_loads)
      {
        if (repeating_p)
! 	*n_loads = SLP_TREE_NUMBER_OF_VEC_STMTS (node);
        else
  	{
  	  /* Enforced above when !repeating_p.  */
--- 10803,10809 ----
    if (n_loads)
      {
        if (repeating_p)
! 	*n_loads = nstmts;
        else
  	{
  	  /* Enforced above when !repeating_p.  */
*************** vectorizable_slp_permutation_1 (vec_info
*** 11065,11071 ****
        unsigned vec_idx = (SLP_TREE_LANE_PERMUTATION (node)[0].second
  			  / SLP_TREE_LANES (node));
        unsigned vec_num = SLP_TREE_LANES (child) / SLP_TREE_LANES (node);
!       for (unsigned i = 0; i < SLP_TREE_NUMBER_OF_VEC_STMTS (node); ++i)
  	{
  	  tree def = SLP_TREE_VEC_DEFS (child)[i * vec_num  + vec_idx];
  	  node->push_vec_def (def);
--- 11052,11059 ----
        unsigned vec_idx = (SLP_TREE_LANE_PERMUTATION (node)[0].second
  			  / SLP_TREE_LANES (node));
        unsigned vec_num = SLP_TREE_LANES (child) / SLP_TREE_LANES (node);
!       unsigned nvectors = vect_get_num_copies (vinfo, node);
!       for (unsigned i = 0; i < nvectors; ++i)
  	{
  	  tree def = SLP_TREE_VEC_DEFS (child)[i * vec_num  + vec_idx];
  	  node->push_vec_def (def);
*************** vect_schedule_slp_node (vec_info *vinfo,
*** 11406,11419 ****
        return;
      }
  
-   gcc_assert (SLP_TREE_VEC_DEFS (node).is_empty ());
- 
    stmt_vec_info stmt_info = SLP_TREE_REPRESENTATIVE (node);
  
!   gcc_assert (!SLP_TREE_VECTYPE (node)
! 	      || SLP_TREE_NUMBER_OF_VEC_STMTS (node) != 0);
!   if (SLP_TREE_NUMBER_OF_VEC_STMTS (node) != 0)
!     SLP_TREE_VEC_DEFS (node).create (SLP_TREE_NUMBER_OF_VEC_STMTS (node));
  
    if (!SLP_TREE_PERMUTE_P (node) && STMT_VINFO_DATA_REF (stmt_info))
      {
--- 11394,11404 ----
        return;
      }
  
    stmt_vec_info stmt_info = SLP_TREE_REPRESENTATIVE (node);
  
!   gcc_assert (SLP_TREE_VEC_DEFS (node).is_empty ());
!   if (SLP_TREE_VECTYPE (node))
!     SLP_TREE_VEC_DEFS (node).create (vect_get_num_copies (vinfo, node));
  
    if (!SLP_TREE_PERMUTE_P (node) && STMT_VINFO_DATA_REF (stmt_info))
      {
*************** vectorize_slp_instance_root_stmt (vec_in
*** 11675,11681 ****
  
    if (instance->kind == slp_inst_kind_ctor)
      {
!       if (SLP_TREE_NUMBER_OF_VEC_STMTS (node) == 1)
  	{
  	  tree vect_lhs = SLP_TREE_VEC_DEFS (node)[0];
  	  tree root_lhs = gimple_get_lhs (instance->root_stmts[0]->stmt);
--- 11660,11666 ----
  
    if (instance->kind == slp_inst_kind_ctor)
      {
!       if (SLP_TREE_VEC_DEFS (node).length () == 1)
  	{
  	  tree vect_lhs = SLP_TREE_VEC_DEFS (node)[0];
  	  tree root_lhs = gimple_get_lhs (instance->root_stmts[0]->stmt);
*************** vectorize_slp_instance_root_stmt (vec_in
*** 11685,11697 ****
  			       vect_lhs);
  	  rstmt = gimple_build_assign (root_lhs, vect_lhs);
  	}
!       else if (SLP_TREE_NUMBER_OF_VEC_STMTS (node) > 1)
  	{
! 	  int nelts = SLP_TREE_NUMBER_OF_VEC_STMTS (node);
  	  tree child_def;
  	  int j;
  	  vec<constructor_elt, va_gc> *v;
! 	  vec_alloc (v, nelts);
  
  	  /* A CTOR can handle V16HI composition from VNx8HI so we
  	     do not need to convert vector elements if the types
--- 11670,11682 ----
  			       vect_lhs);
  	  rstmt = gimple_build_assign (root_lhs, vect_lhs);
  	}
!       else
  	{
! 	  gcc_assert (SLP_TREE_VEC_DEFS (node).length () > 1);
  	  tree child_def;
  	  int j;
  	  vec<constructor_elt, va_gc> *v;
! 	  vec_alloc (v, SLP_TREE_VEC_DEFS (node).length ());
  
  	  /* A CTOR can handle V16HI composition from VNx8HI so we
  	     do not need to convert vector elements if the types
diff -Nrcpad gcc-16-20250914/gcc/tree-vect-stmts.cc gcc-16-20250921/gcc/tree-vect-stmts.cc
*** gcc-16-20250914/gcc/tree-vect-stmts.cc	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/gcc/tree-vect-stmts.cc	Sun Sep 21 22:33:31 2025
*************** vect_mark_stmts_to_be_vectorized (loop_v
*** 916,922 ****
     of the same KIND.  */
  
  static void
! vect_model_simple_cost (vec_info *, int n, slp_tree node,
  			stmt_vector_for_cost *cost_vec,
  			vect_cost_for_stmt kind = vector_stmt)
  {
--- 916,922 ----
     of the same KIND.  */
  
  static void
! vect_model_simple_cost (vec_info *vinfo, int n, slp_tree node,
  			stmt_vector_for_cost *cost_vec,
  			vect_cost_for_stmt kind = vector_stmt)
  {
*************** vect_model_simple_cost (vec_info *, int
*** 924,930 ****
  
    gcc_assert (cost_vec != NULL);
  
!   n *= SLP_TREE_NUMBER_OF_VEC_STMTS (node);
  
    /* Pass the inside-of-loop statements to the target-specific cost model.  */
    inside_cost += record_stmt_cost (cost_vec, n, kind, node, 0, vect_body);
--- 924,930 ----
  
    gcc_assert (cost_vec != NULL);
  
!   n *= vect_get_num_copies (vinfo, node);
  
    /* Pass the inside-of-loop statements to the target-specific cost model.  */
    inside_cost += record_stmt_cost (cost_vec, n, kind, node, 0, vect_body);
*************** check_load_store_for_partial_vectors (lo
*** 1459,1465 ****
  	  scalar_mask = def;
        }
  
!   unsigned int nvectors = vect_get_num_copies (loop_vinfo, slp_node, vectype);
    vec_loop_masks *masks = &LOOP_VINFO_MASKS (loop_vinfo);
    vec_loop_lens *lens = &LOOP_VINFO_LENS (loop_vinfo);
    machine_mode vecmode = TYPE_MODE (vectype);
--- 1459,1465 ----
  	  scalar_mask = def;
        }
  
!   unsigned int nvectors = vect_get_num_copies (loop_vinfo, slp_node);
    vec_loop_masks *masks = &LOOP_VINFO_MASKS (loop_vinfo);
    vec_loop_lens *lens = &LOOP_VINFO_LENS (loop_vinfo);
    machine_mode vecmode = TYPE_MODE (vectype);
*************** vector_vector_composition_type (tree vty
*** 1963,1975 ****
     VECTYPE is the vector type that the vectorized statements will use.
  
     If ELSVALS is nonzero the supported else values will be stored in the
!    vector ELSVALS points to.  */
  
  static bool
  get_load_store_type (vec_info  *vinfo, stmt_vec_info stmt_info,
  		     tree vectype, slp_tree slp_node,
  		     bool masked_p, vec_load_store_type vls_type,
! 		     vect_load_store_data *ls)
  {
    vect_memory_access_type *memory_access_type = &ls->memory_access_type;
    poly_int64 *poffset = &ls->poffset;
--- 1963,1978 ----
     VECTYPE is the vector type that the vectorized statements will use.
  
     If ELSVALS is nonzero the supported else values will be stored in the
!    vector ELSVALS points to.
! 
!    For loads PERM_OK indicates whether we can code generate a
!    SLP_TREE_LOAD_PERMUTATION on the node.  */
  
  static bool
  get_load_store_type (vec_info  *vinfo, stmt_vec_info stmt_info,
  		     tree vectype, slp_tree slp_node,
  		     bool masked_p, vec_load_store_type vls_type,
! 		     bool perm_ok, vect_load_store_data *ls)
  {
    vect_memory_access_type *memory_access_type = &ls->memory_access_type;
    poly_int64 *poffset = &ls->poffset;
*************** get_load_store_type (vec_info  *vinfo, s
*** 2153,2169 ****
        /* For single-element interleaving also fall back to elementwise
  	 access in case we did not lower a permutation and cannot
  	 code generate it.  */
-       auto_vec<tree> temv;
-       unsigned n_perms;
        if (loop_vinfo
  	  && single_element_p
  	  && SLP_TREE_LANES (slp_node) == 1
  	  && (*memory_access_type == VMAT_CONTIGUOUS
  	      || *memory_access_type == VMAT_CONTIGUOUS_REVERSE)
  	  && SLP_TREE_LOAD_PERMUTATION (slp_node).exists ()
! 	  && !vect_transform_slp_perm_load
! 	  (loop_vinfo, slp_node, temv, NULL,
! 	   LOOP_VINFO_VECT_FACTOR (loop_vinfo), true, &n_perms))
  	{
  	  *memory_access_type = VMAT_ELEMENTWISE;
  	  if (dump_enabled_p ())
--- 2156,2168 ----
        /* For single-element interleaving also fall back to elementwise
  	 access in case we did not lower a permutation and cannot
  	 code generate it.  */
        if (loop_vinfo
  	  && single_element_p
  	  && SLP_TREE_LANES (slp_node) == 1
  	  && (*memory_access_type == VMAT_CONTIGUOUS
  	      || *memory_access_type == VMAT_CONTIGUOUS_REVERSE)
  	  && SLP_TREE_LOAD_PERMUTATION (slp_node).exists ()
! 	  && !perm_ok)
  	{
  	  *memory_access_type = VMAT_ELEMENTWISE;
  	  if (dump_enabled_p ())
*************** get_load_store_type (vec_info  *vinfo, s
*** 2314,2324 ****
       on nearby locations.  Or, even if it's a win over scalar code,
       it might not be a win over vectorizing at a lower VF, if that
       allows us to use contiguous accesses.  */
!   if ((*memory_access_type == VMAT_ELEMENTWISE
!        || *memory_access_type == VMAT_STRIDED_SLP)
        && !STMT_VINFO_GATHER_SCATTER_P (stmt_info)
        && SLP_TREE_LANES (slp_node) == 1
!       && loop_vinfo)
      {
        gather_scatter_info gs_info;
        if (vect_use_strided_gather_scatters_p (stmt_info, vectype, loop_vinfo,
--- 2313,2325 ----
       on nearby locations.  Or, even if it's a win over scalar code,
       it might not be a win over vectorizing at a lower VF, if that
       allows us to use contiguous accesses.  */
!   if (loop_vinfo
!       && (*memory_access_type == VMAT_ELEMENTWISE
! 	  || *memory_access_type == VMAT_STRIDED_SLP)
        && !STMT_VINFO_GATHER_SCATTER_P (stmt_info)
        && SLP_TREE_LANES (slp_node) == 1
!       && (!SLP_TREE_LOAD_PERMUTATION (slp_node).exists ()
! 	  || single_element_p))
      {
        gather_scatter_info gs_info;
        if (vect_use_strided_gather_scatters_p (stmt_info, vectype, loop_vinfo,
*************** vectorizable_bswap (vec_info *vinfo,
*** 3119,3125 ****
        record_stmt_cost (cost_vec,
  			1, vector_stmt, slp_node, 0, vect_prologue);
        record_stmt_cost (cost_vec,
! 			SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node),
  			vec_perm, slp_node, 0, vect_body);
        return true;
      }
--- 3120,3126 ----
        record_stmt_cost (cost_vec,
  			1, vector_stmt, slp_node, 0, vect_prologue);
        record_stmt_cost (cost_vec,
! 			vect_get_num_copies (vinfo, slp_node),
  			vec_perm, slp_node, 0, vect_body);
        return true;
      }
*************** vectorizable_call (vec_info *vinfo,
*** 3437,3442 ****
--- 3438,3444 ----
    int len_opno = internal_fn_len_index (cond_len_fn);
    vec_loop_masks *masks = (loop_vinfo ? &LOOP_VINFO_MASKS (loop_vinfo) : NULL);
    vec_loop_lens *lens = (loop_vinfo ? &LOOP_VINFO_LENS (loop_vinfo) : NULL);
+   unsigned int nvectors = vect_get_num_copies (vinfo, slp_node);
    if (cost_vec) /* transformation not required.  */
      {
        for (i = 0; i < nargs; ++i)
*************** vectorizable_call (vec_info *vinfo,
*** 3473,3479 ****
  	    }
  	  else
  	    {
- 	      unsigned int nvectors = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
  	      tree scalar_mask = NULL_TREE;
  	      if (mask_opno >= 0)
  		scalar_mask = gimple_call_arg (stmt_info->stmt, mask_opno);
--- 3475,3480 ----
*************** vectorizable_call (vec_info *vinfo,
*** 3530,3536 ****
        /* Build argument list for the vectorized call.  */
        if (cfn == CFN_GOMP_SIMD_LANE)
  	{
! 	  for (i = 0; i < SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node); ++i)
  	    {
  	      /* ???  For multi-lane SLP we'd need to build
  		 { 0, 0, .., 1, 1, ... }.  */
--- 3531,3537 ----
        /* Build argument list for the vectorized call.  */
        if (cfn == CFN_GOMP_SIMD_LANE)
  	{
! 	  for (i = 0; i < nvectors; ++i)
  	    {
  	      /* ???  For multi-lane SLP we'd need to build
  		 { 0, 0, .., 1, 1, ... }.  */
*************** vectorizable_conversion (vec_info *vinfo
*** 5389,5394 ****
--- 5390,5396 ----
  	  return false;
  	}
        DUMP_VECT_SCOPE ("vectorizable_conversion");
+       unsigned int nvectors = vect_get_num_copies (vinfo, slp_node);
        if (modifier == NONE)
          {
  	  SLP_TREE_TYPE (slp_node) = type_conversion_vec_info_type;
*************** vectorizable_conversion (vec_info *vinfo
*** 5399,5405 ****
  	{
  	  SLP_TREE_TYPE (slp_node) = type_demotion_vec_info_type;
  	  /* The final packing step produces one vector result per copy.  */
- 	  unsigned int nvectors = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
  	  vect_model_promotion_demotion_cost (slp_node, nvectors,
  					      multi_step_cvt, cost_vec,
  					      widen_arith);
--- 5401,5406 ----
*************** vectorizable_conversion (vec_info *vinfo
*** 5410,5418 ****
  	  /* The initial unpacking step produces two vector results
  	     per copy.  MULTI_STEP_CVT is 0 for a single conversion,
  	     so >> MULTI_STEP_CVT divides by 2^(number of steps - 1).  */
! 	  unsigned int nvectors
! 	    = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node) >> multi_step_cvt;
! 	  vect_model_promotion_demotion_cost (slp_node, nvectors,
  					      multi_step_cvt, cost_vec,
  					      widen_arith);
  	}
--- 5411,5418 ----
  	  /* The initial unpacking step produces two vector results
  	     per copy.  MULTI_STEP_CVT is 0 for a single conversion,
  	     so >> MULTI_STEP_CVT divides by 2^(number of steps - 1).  */
! 	  vect_model_promotion_demotion_cost (slp_node,
! 					      nvectors >> multi_step_cvt,
  					      multi_step_cvt, cost_vec,
  					      widen_arith);
  	}
*************** vectorizable_shift (vec_info *vinfo,
*** 5942,5948 ****
  	 scalar shift operand but code-generation below simply always
  	 takes the first.  */
        if (dt[1] == vect_internal_def
! 	  && maybe_ne (nunits_out * SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node),
  		       stmts.length ()))
  	scalar_shift_arg = false;
  
--- 5942,5948 ----
  	 scalar shift operand but code-generation below simply always
  	 takes the first.  */
        if (dt[1] == vect_internal_def
! 	  && maybe_ne (nunits_out * vect_get_num_copies (vinfo, slp_node),
  		       stmts.length ()))
  	scalar_shift_arg = false;
  
*************** vectorizable_shift (vec_info *vinfo,
*** 6101,6106 ****
--- 6101,6107 ----
    /* Handle def.  */
    vec_dest = vect_create_destination_var (scalar_dest, vectype);
  
+   unsigned nvectors = vect_get_num_copies (vinfo, slp_node);
    if (scalar_shift_arg && dt[1] != vect_internal_def)
      {
        /* Vector shl and shr insn patterns can be defined with scalar
*************** vectorizable_shift (vec_info *vinfo,
*** 6114,6128 ****
  	    dump_printf_loc (MSG_NOTE, vect_location,
  			     "operand 1 using scalar mode.\n");
  	  vec_oprnd1 = op1;
! 	  vec_oprnds1.create (SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node));
  	  vec_oprnds1.quick_push (vec_oprnd1);
! 	      /* Store vec_oprnd1 for every vector stmt to be created.
! 		 We check during the analysis that all the shift arguments
! 		 are the same.
! 		 TODO: Allow different constants for different vector
! 		 stmts generated for an SLP instance.  */
! 	  for (k = 0;
! 	       k < SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node) - 1; k++)
  	    vec_oprnds1.quick_push (vec_oprnd1);
  	}
      }
--- 6115,6128 ----
  	    dump_printf_loc (MSG_NOTE, vect_location,
  			     "operand 1 using scalar mode.\n");
  	  vec_oprnd1 = op1;
! 	  vec_oprnds1.create (nvectors);
  	  vec_oprnds1.quick_push (vec_oprnd1);
! 	  /* Store vec_oprnd1 for every vector stmt to be created.
! 	     We check during the analysis that all the shift arguments
! 	     are the same.
! 	     TODO: Allow different constants for different vector
! 	     stmts generated for an SLP instance.  */
! 	  for (k = 0; k < nvectors - 1; k++)
  	    vec_oprnds1.quick_push (vec_oprnd1);
  	}
      }
*************** vectorizable_shift (vec_info *vinfo,
*** 6140,6147 ****
  				  gsi);
  	  vec_oprnd1 = vect_init_vector (vinfo, stmt_info, op1, vectype,
  					 gsi);
! 	  vec_oprnds1.create (slp_node->vec_stmts_size);
! 	  for (k = 0; k < slp_node->vec_stmts_size; k++)
  	    vec_oprnds1.quick_push (vec_oprnd1);
  	}
        else if (dt[1] == vect_constant_def)
--- 6140,6147 ----
  				  gsi);
  	  vec_oprnd1 = vect_init_vector (vinfo, stmt_info, op1, vectype,
  					 gsi);
! 	  vec_oprnds1.create (nvectors);
! 	  for (k = 0; k < nvectors; k++)
  	    vec_oprnds1.quick_push (vec_oprnd1);
  	}
        else if (dt[1] == vect_constant_def)
*************** vectorizable_operation (vec_info *vinfo,
*** 6392,6398 ****
  
    /* Multiple types in SLP are handled by creating the appropriate number of
       vectorized stmts for each SLP node.  */
!   auto vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
  
    /* Reject attempts to combine mask types with nonmask types, e.g. if
       we have an AND between a (nonmask) boolean loaded from memory and
--- 6392,6398 ----
  
    /* Multiple types in SLP are handled by creating the appropriate number of
       vectorized stmts for each SLP node.  */
!   auto vec_num = vect_get_num_copies (vinfo, slp_node);
  
    /* Reject attempts to combine mask types with nonmask types, e.g. if
       we have an AND between a (nonmask) boolean loaded from memory and
*************** vectorizable_operation (vec_info *vinfo,
*** 6514,6520 ****
  	     in the prologue and (mis-)costs one of the stmts as
  	     vector stmt.  See below for the actual lowering that will
  	     be applied.  */
! 	  unsigned n = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
  	  switch (code)
  	    {
  	    case PLUS_EXPR:
--- 6514,6520 ----
  	     in the prologue and (mis-)costs one of the stmts as
  	     vector stmt.  See below for the actual lowering that will
  	     be applied.  */
! 	  unsigned n = vect_get_num_copies (vinfo, slp_node);
  	  switch (code)
  	    {
  	    case PLUS_EXPR:
*************** vectorizable_store (vec_info *vinfo,
*** 7854,7864 ****
      }
    else
      vf = 1;
  
    /* FORNOW.  This restriction should be relaxed.  */
    if (loop
        && nested_in_vect_loop_p (loop, stmt_info)
!       && SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node) > 1)
      {
        if (dump_enabled_p ())
  	dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
--- 7854,7865 ----
      }
    else
      vf = 1;
+   vec_num = vect_get_num_copies (vinfo, slp_node);
  
    /* FORNOW.  This restriction should be relaxed.  */
    if (loop
        && nested_in_vect_loop_p (loop, stmt_info)
!       && vec_num > 1)
      {
        if (dump_enabled_p ())
  	dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
*************** vectorizable_store (vec_info *vinfo,
*** 7881,7887 ****
    vect_load_store_data &ls = slp_node->get_data (_ls_data);
    if (cost_vec
        && !get_load_store_type (vinfo, stmt_info, vectype, slp_node, mask_node,
! 			       vls_type, &_ls_data))
      return false;
    /* Temporary aliases to analysis data, should not be modified through
       these.  */
--- 7882,7888 ----
    vect_load_store_data &ls = slp_node->get_data (_ls_data);
    if (cost_vec
        && !get_load_store_type (vinfo, stmt_info, vectype, slp_node, mask_node,
! 			       vls_type, false, &_ls_data))
      return false;
    /* Temporary aliases to analysis data, should not be modified through
       these.  */
*************** vectorizable_store (vec_info *vinfo,
*** 7948,7954 ****
      {
        first_stmt_info = stmt_info;
        first_dr_info = dr_info;
!       group_size = vec_num = 1;
      }
  
    if (STMT_VINFO_SIMD_LANE_ACCESS_P (stmt_info) > 1 && cost_vec)
--- 7949,7955 ----
      {
        first_stmt_info = stmt_info;
        first_dr_info = dr_info;
!       group_size = 1;
      }
  
    if (STMT_VINFO_SIMD_LANE_ACCESS_P (stmt_info) > 1 && cost_vec)
*************** vectorizable_store (vec_info *vinfo,
*** 8025,8033 ****
  	      || !nested_in_vect_loop_p (loop, stmt_info));
  
    grouped_store = false;
-   /* VEC_NUM is the number of vect stmts to be created for this
-      group.  */
-   vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
    first_stmt_info = SLP_TREE_SCALAR_STMTS (slp_node)[0];
    gcc_assert (!STMT_VINFO_GROUPED_ACCESS (first_stmt_info)
  	      || (DR_GROUP_FIRST_ELEMENT (first_stmt_info) == first_stmt_info));
--- 8026,8031 ----
*************** vectorizable_store (vec_info *vinfo,
*** 8200,8206 ****
        if (nstores > 1)
  	align = MIN (tree_to_uhwi (TYPE_SIZE_UNIT (ltype)), align);
        ltype = build_aligned_type (ltype, align * BITS_PER_UNIT);
!       int ncopies = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
  
        if (!costing_p)
  	{
--- 8198,8204 ----
        if (nstores > 1)
  	align = MIN (tree_to_uhwi (TYPE_SIZE_UNIT (ltype)), align);
        ltype = build_aligned_type (ltype, align * BITS_PER_UNIT);
!       int ncopies = vec_num;
  
        if (!costing_p)
  	{
*************** vectorizable_store (vec_info *vinfo,
*** 8411,8417 ****
        /* For costing some adjacent vector stores, we'd like to cost with
  	 the total number of them once instead of cost each one by one. */
        unsigned int n_adjacent_stores = 0;
!       int ncopies = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node) / group_size;
        for (j = 0; j < ncopies; j++)
  	{
  	  if (j == 0)
--- 8409,8415 ----
        /* For costing some adjacent vector stores, we'd like to cost with
  	 the total number of them once instead of cost each one by one. */
        unsigned int n_adjacent_stores = 0;
!       int ncopies = vec_num / group_size;
        for (j = 0; j < ncopies; j++)
  	{
  	  if (j == 0)
*************** vectorizable_load (vec_info *vinfo,
*** 9397,9405 ****
    else
      vf = 1;
  
    /* FORNOW. This restriction should be relaxed.  */
!   if (nested_in_vect_loop
!       && SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node) > 1)
      {
        if (dump_enabled_p ())
          dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
--- 9395,9404 ----
    else
      vf = 1;
  
+   vec_num = vect_get_num_copies (vinfo, slp_node);
+ 
    /* FORNOW. This restriction should be relaxed.  */
!   if (nested_in_vect_loop && vec_num > 1)
      {
        if (dump_enabled_p ())
          dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
*************** vectorizable_load (vec_info *vinfo,
*** 9447,9457 ****
    else
      group_size = 1;
  
    vect_load_store_data _ls_data{};
    vect_load_store_data &ls = slp_node->get_data (_ls_data);
    if (cost_vec
        && !get_load_store_type (vinfo, stmt_info, vectype, slp_node, mask_node,
! 			       VLS_LOAD, &ls))
      return false;
    /* Temporary aliases to analysis data, should not be modified through
       these.  */
--- 9446,9462 ----
    else
      group_size = 1;
  
+   bool perm_ok = true;
+   unsigned n_perms = -1U;
+   if (cost_vec && SLP_TREE_LOAD_PERMUTATION (slp_node).exists ())
+     perm_ok = vect_transform_slp_perm_load (vinfo, slp_node, vNULL, NULL, vf,
+ 					    true, &n_perms);
+ 
    vect_load_store_data _ls_data{};
    vect_load_store_data &ls = slp_node->get_data (_ls_data);
    if (cost_vec
        && !get_load_store_type (vinfo, stmt_info, vectype, slp_node, mask_node,
! 			       VLS_LOAD, perm_ok, &ls))
      return false;
    /* Temporary aliases to analysis data, should not be modified through
       these.  */
*************** vectorizable_load (vec_info *vinfo,
*** 9474,9484 ****
  
    /* ???  The following checks should really be part of
       get_load_store_type.  */
-   unsigned n_perms = -1U;
    if (SLP_TREE_LOAD_PERMUTATION (slp_node).exists ()
        && !((memory_access_type == VMAT_ELEMENTWISE
  	    || mat_gather_scatter_p (memory_access_type))
! 	   && SLP_TREE_LANES (slp_node) == 1))
      {
        slp_perm = true;
  
--- 9479,9490 ----
  
    /* ???  The following checks should really be part of
       get_load_store_type.  */
    if (SLP_TREE_LOAD_PERMUTATION (slp_node).exists ()
        && !((memory_access_type == VMAT_ELEMENTWISE
  	    || mat_gather_scatter_p (memory_access_type))
! 	   && SLP_TREE_LANES (slp_node) == 1
! 	   && (!grouped_load
! 	       || !DR_GROUP_NEXT_ELEMENT (first_stmt_info))))
      {
        slp_perm = true;
  
*************** vectorizable_load (vec_info *vinfo,
*** 9507,9514 ****
  
        if (cost_vec)
  	{
! 	  if (!vect_transform_slp_perm_load (vinfo, slp_node, vNULL, NULL, vf,
! 					     true, &n_perms))
  	    {
  	      if (dump_enabled_p ())
  		dump_printf_loc (MSG_MISSED_OPTIMIZATION,
--- 9513,9519 ----
  
        if (cost_vec)
  	{
! 	  if (!perm_ok)
  	    {
  	      if (dump_enabled_p ())
  		dump_printf_loc (MSG_MISSED_OPTIMIZATION,
*************** vectorizable_load (vec_info *vinfo,
*** 9694,9700 ****
  				       vectype, &gsi2);
  	}
        gimple *new_stmt = SSA_NAME_DEF_STMT (new_temp);
!       for (j = 0; j < (int) SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node); ++j)
  	slp_node->push_vec_def (new_stmt);
        return true;
      }
--- 9699,9705 ----
  				       vectype, &gsi2);
  	}
        gimple *new_stmt = SSA_NAME_DEF_STMT (new_temp);
!       for (j = 0; j < (int) vec_num; ++j)
  	slp_node->push_vec_def (new_stmt);
        return true;
      }
*************** vectorizable_load (vec_info *vinfo,
*** 9889,9895 ****
  	  dr_chain.create (ncopies);
  	}
        else
! 	ncopies = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
  
        unsigned int group_el = 0;
        unsigned HOST_WIDE_INT
--- 9894,9900 ----
  	  dr_chain.create (ncopies);
  	}
        else
! 	ncopies = vec_num;
  
        unsigned int group_el = 0;
        unsigned HOST_WIDE_INT
*************** vectorizable_load (vec_info *vinfo,
*** 10064,10070 ****
  	/* We do not support grouped accesses in a nested loop,
  	   instead the access is contiguous but it might be
  	   permuted.  No gap adjustment is needed though.  */
! 	vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
        else if (slp_perm
  	       && (group_size != scalar_lanes
  		   || !multiple_p (nunits, group_size)))
--- 10069,10075 ----
  	/* We do not support grouped accesses in a nested loop,
  	   instead the access is contiguous but it might be
  	   permuted.  No gap adjustment is needed though.  */
! 	;
        else if (slp_perm
  	       && (group_size != scalar_lanes
  		   || !multiple_p (nunits, group_size)))
*************** vectorizable_load (vec_info *vinfo,
*** 10078,10084 ****
  	}
        else
  	{
- 	  vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
  	  group_gap_adj = group_size - scalar_lanes;
  	}
  
--- 10083,10088 ----
*************** vectorizable_load (vec_info *vinfo,
*** 10088,10097 ****
      {
        first_stmt_info = stmt_info;
        first_dr_info = dr_info;
!       group_size = vec_num = 1;
        group_gap_adj = 0;
        ref_type = reference_alias_ptr_type (DR_REF (first_dr_info->dr));
-       vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
      }
  
    vec_loop_masks *loop_masks
--- 10092,10100 ----
      {
        first_stmt_info = stmt_info;
        first_dr_info = dr_info;
!       group_size = 1;
        group_gap_adj = 0;
        ref_type = reference_alias_ptr_type (DR_REF (first_dr_info->dr));
      }
  
    vec_loop_masks *loop_masks
*************** vectorizable_load (vec_info *vinfo,
*** 10260,10266 ****
        /* For costing some adjacent vector loads, we'd like to cost with
  	 the total number of them once instead of cost each one by one. */
        unsigned int n_adjacent_loads = 0;
!       int ncopies = slp_node->vec_stmts_size / group_size;
        for (j = 0; j < ncopies; j++)
  	{
  	  if (costing_p)
--- 10263,10269 ----
        /* For costing some adjacent vector loads, we'd like to cost with
  	 the total number of them once instead of cost each one by one. */
        unsigned int n_adjacent_loads = 0;
!       int ncopies = vec_num / group_size;
        for (j = 0; j < ncopies; j++)
  	{
  	  if (costing_p)
*************** vectorizable_condition (vec_info *vinfo,
*** 11593,11599 ****
    tree vectype = SLP_TREE_VECTYPE (slp_node);
    tree vectype1 = NULL_TREE, vectype2 = NULL_TREE;
  
!   int vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
  
    cond_expr = gimple_assign_rhs1 (stmt);
    gcc_assert (! COMPARISON_CLASS_P (cond_expr));
--- 11596,11602 ----
    tree vectype = SLP_TREE_VECTYPE (slp_node);
    tree vectype1 = NULL_TREE, vectype2 = NULL_TREE;
  
!   int vec_num = vect_get_num_copies (vinfo, slp_node);
  
    cond_expr = gimple_assign_rhs1 (stmt);
    gcc_assert (! COMPARISON_CLASS_P (cond_expr));
*************** vectorizable_early_exit (loop_vec_info l
*** 12325,12331 ****
      return false;
  
    machine_mode mode = TYPE_MODE (vectype);
!   int vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
  
    vec_loop_masks *masks = &LOOP_VINFO_MASKS (loop_vinfo);
    vec_loop_lens *lens = &LOOP_VINFO_LENS (loop_vinfo);
--- 12328,12334 ----
      return false;
  
    machine_mode mode = TYPE_MODE (vectype);
!   int vec_num = vect_get_num_copies (loop_vinfo, slp_node);
  
    vec_loop_masks *masks = &LOOP_VINFO_MASKS (loop_vinfo);
    vec_loop_lens *lens = &LOOP_VINFO_LENS (loop_vinfo);
*************** vect_transform_stmt (vec_info *vinfo,
*** 12770,12790 ****
        break;
  
      case store_vec_info_type:
!       if (STMT_VINFO_GROUPED_ACCESS (stmt_info)
! 	  && !slp_node
! 	  && (++DR_GROUP_STORE_COUNT (DR_GROUP_FIRST_ELEMENT (stmt_info))
! 	      < DR_GROUP_SIZE (DR_GROUP_FIRST_ELEMENT (stmt_info))))
! 	/* In case of interleaving, the whole chain is vectorized when the
! 	   last store in the chain is reached.  Store stmts before the last
! 	   one are skipped, and there vec_stmt_info shouldn't be freed
! 	   meanwhile.  */
! 	;
!       else
! 	{
! 	  done = vectorizable_store (vinfo, stmt_info, gsi, slp_node, NULL);
! 	  gcc_assert (done);
! 	  is_store = true;
! 	}
        break;
  
      case condition_vec_info_type:
--- 12773,12781 ----
        break;
  
      case store_vec_info_type:
!       done = vectorizable_store (vinfo, stmt_info, gsi, slp_node, NULL);
!       gcc_assert (done);
!       is_store = true;
        break;
  
      case condition_vec_info_type:
diff -Nrcpad gcc-16-20250914/gcc/tree-vectorizer.h gcc-16-20250921/gcc/tree-vectorizer.h
*** gcc-16-20250914/gcc/tree-vectorizer.h	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/gcc/tree-vectorizer.h	Sun Sep 21 22:33:31 2025
*************** struct _slp_tree {
*** 330,340 ****
    tree vectype;
    /* Vectorized defs.  */
    vec<tree> vec_defs;
-   /* Number of vector stmts that are created to replace the group of scalar
-      stmts. It is calculated during the transformation phase as the number of
-      scalar elements in one scalar iteration (GROUP_SIZE) multiplied by VF
-      divided by vector size.  */
-   unsigned int vec_stmts_size;
  
    /* Reference count in the SLP graph.  */
    unsigned int refcnt;
--- 330,335 ----
*************** public:
*** 444,450 ****
  #define SLP_TREE_SCALAR_OPS(S)                   (S)->ops
  #define SLP_TREE_REF_COUNT(S)                    (S)->refcnt
  #define SLP_TREE_VEC_DEFS(S)                     (S)->vec_defs
- #define SLP_TREE_NUMBER_OF_VEC_STMTS(S)          (S)->vec_stmts_size
  #define SLP_TREE_LOAD_PERMUTATION(S)             (S)->load_permutation
  #define SLP_TREE_LANE_PERMUTATION(S)             (S)->lane_permutation
  #define SLP_TREE_DEF_TYPE(S)			 (S)->def_type
--- 439,444 ----
*************** public:
*** 1550,1558 ****
    stmt_vec_info next_element;
    /* The size of the group.  */
    unsigned int size;
-   /* For stores, number of stores from this group seen. We vectorize the last
-      one.  */
-   unsigned int store_count;
    /* For loads only, the gap from the previous load. For consecutive loads, GAP
       is 1.  */
    unsigned int gap;
--- 1544,1549 ----
*************** struct gather_scatter_info {
*** 1716,1723 ****
    (gcc_checking_assert ((S)->dr_aux.dr), (S)->next_element)
  #define DR_GROUP_SIZE(S) \
    (gcc_checking_assert ((S)->dr_aux.dr), (S)->size)
- #define DR_GROUP_STORE_COUNT(S) \
-   (gcc_checking_assert ((S)->dr_aux.dr), (S)->store_count)
  #define DR_GROUP_GAP(S) \
    (gcc_checking_assert ((S)->dr_aux.dr), (S)->gap)
  
--- 1707,1712 ----
*************** vect_get_num_vectors (poly_uint64 nunits
*** 2302,2314 ****
  }
  
  /* Return the number of vectors in the context of vectorization region VINFO,
!    needed for a group of statements, whose size is specified by lanes of NODE,
!    if NULL, it is 1.  The statements are supposed to be interleaved together
!    with no gap, and all operate on vectors of type VECTYPE, if NULL, the
!    vectype of NODE is used.  */
  
  inline unsigned int
! vect_get_num_copies (vec_info *vinfo, slp_tree node, tree vectype = NULL)
  {
    poly_uint64 vf;
  
--- 2291,2300 ----
  }
  
  /* Return the number of vectors in the context of vectorization region VINFO,
!    needed for a group of statements and a vector type as specified by NODE.  */
  
  inline unsigned int
! vect_get_num_copies (vec_info *vinfo, slp_tree node)
  {
    poly_uint64 vf;
  
*************** vect_get_num_copies (vec_info *vinfo, sl
*** 2317,2343 ****
    else
      vf = 1;
  
!   if (node)
!     {
!       vf *= SLP_TREE_LANES (node);
!       if (!vectype)
! 	vectype = SLP_TREE_VECTYPE (node);
!     }
  
    return vect_get_num_vectors (vf, vectype);
  }
  
- /* Return the number of copies needed for loop vectorization when
-    a statement operates on vectors of type VECTYPE.  This is the
-    vectorization factor divided by the number of elements in
-    VECTYPE and is always known at compile time.  */
- 
- inline unsigned int
- vect_get_num_copies (loop_vec_info loop_vinfo, tree vectype)
- {
-   return vect_get_num_copies (loop_vinfo, NULL, vectype);
- }
- 
  /* Update maximum unit count *MAX_NUNITS so that it accounts for
     NUNITS.  *MAX_NUNITS can be 1 if we haven't yet recorded anything.  */
  
--- 2303,2314 ----
    else
      vf = 1;
  
!   vf *= SLP_TREE_LANES (node);
!   tree vectype = SLP_TREE_VECTYPE (node);
  
    return vect_get_num_vectors (vf, vectype);
  }
  
  /* Update maximum unit count *MAX_NUNITS so that it accounts for
     NUNITS.  *MAX_NUNITS can be 1 if we haven't yet recorded anything.  */
  
diff -Nrcpad gcc-16-20250914/gcc/tree.cc gcc-16-20250921/gcc/tree.cc
*** gcc-16-20250914/gcc/tree.cc	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/gcc/tree.cc	Sun Sep 21 22:33:31 2025
*************** verify_type (const_tree t)
*** 14708,14714 ****
  int
  get_range_pos_neg (tree arg, gimple *stmt)
  {
!   if (arg == error_mark_node)
      return 3;
  
    int prec = TYPE_PRECISION (TREE_TYPE (arg));
--- 14708,14714 ----
  int
  get_range_pos_neg (tree arg, gimple *stmt)
  {
!   if (arg == error_mark_node || !INTEGRAL_TYPE_P (TREE_TYPE (arg)))
      return 3;
  
    int prec = TYPE_PRECISION (TREE_TYPE (arg));
diff -Nrcpad gcc-16-20250914/libcpp/ChangeLog gcc-16-20250921/libcpp/ChangeLog
*** gcc-16-20250914/libcpp/ChangeLog	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/libcpp/ChangeLog	Sun Sep 21 22:33:32 2025
***************
*** 1,3 ****
--- 1,10 ----
+ 2025-09-18  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* include/line-map.h (enum location_aspect): Convert to...
+ 	(enum class location_aspect): ...this.
+ 	* line-map.cc: Update for conversion of location_aspect to enum
+ 	class.
+ 
  2025-09-01  Jakub Jelinek  <jakub@redhat.com>
  
  	* macro.cc: Implement C2Y N3457 - The __COUNTER__ predefined macro.
diff -Nrcpad gcc-16-20250914/libcpp/include/line-map.h gcc-16-20250921/libcpp/include/line-map.h
*** gcc-16-20250914/libcpp/include/line-map.h	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/libcpp/include/line-map.h	Sun Sep 21 22:33:32 2025
*************** void line_table_dump (FILE *, const line
*** 1459,1469 ****
  
  /* An enum for distinguishing the various parts within a location_t.  */
  
! enum location_aspect
  {
!   LOCATION_ASPECT_CARET,
!   LOCATION_ASPECT_START,
!   LOCATION_ASPECT_FINISH
  };
  
  /* The rich_location class requires a way to expand location_t instances.
--- 1459,1469 ----
  
  /* An enum for distinguishing the various parts within a location_t.  */
  
! enum class location_aspect
  {
!   caret,
!   start,
!   finish
  };
  
  /* The rich_location class requires a way to expand location_t instances.
diff -Nrcpad gcc-16-20250914/libcpp/line-map.cc gcc-16-20250921/libcpp/line-map.cc
*** gcc-16-20250914/libcpp/line-map.cc	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/libcpp/line-map.cc	Sun Sep 21 22:33:32 2025
*************** rich_location::get_expanded_location (un
*** 2326,2332 ****
         {
  	  m_expanded_location
  	    = linemap_client_expand_location_to_spelling_point
! 		(m_line_table, get_loc (0), LOCATION_ASPECT_CARET);
  	  if (m_column_override)
  	    m_expanded_location.column = m_column_override;
  	  m_have_expanded_location = true;
--- 2326,2332 ----
         {
  	  m_expanded_location
  	    = linemap_client_expand_location_to_spelling_point
! 		(m_line_table, get_loc (0), location_aspect::caret);
  	  if (m_column_override)
  	    m_expanded_location.column = m_column_override;
  	  m_have_expanded_location = true;
*************** rich_location::get_expanded_location (un
*** 2336,2342 ****
     }
    else
      return linemap_client_expand_location_to_spelling_point
! 	     (m_line_table, get_loc (idx), LOCATION_ASPECT_CARET);
  }
  
  /* Set the column of the primary location, with 0 meaning
--- 2336,2342 ----
     }
    else
      return linemap_client_expand_location_to_spelling_point
! 	     (m_line_table, get_loc (idx), location_aspect::caret);
  }
  
  /* Set the column of the primary location, with 0 meaning
*************** rich_location::maybe_add_fixit (location
*** 2611,2621 ****
    expanded_location exploc_start
      = linemap_client_expand_location_to_spelling_point (m_line_table,
  							start,
! 							LOCATION_ASPECT_START);
    expanded_location exploc_next_loc
      = linemap_client_expand_location_to_spelling_point (m_line_table,
  							next_loc,
! 							LOCATION_ASPECT_START);
    /* They must be within the same file...  */
    if (exploc_start.file != exploc_next_loc.file)
      {
--- 2611,2621 ----
    expanded_location exploc_start
      = linemap_client_expand_location_to_spelling_point (m_line_table,
  							start,
! 							location_aspect::start);
    expanded_location exploc_next_loc
      = linemap_client_expand_location_to_spelling_point (m_line_table,
  							next_loc,
! 							location_aspect::start);
    /* They must be within the same file...  */
    if (exploc_start.file != exploc_next_loc.file)
      {
*************** fixit_hint::affects_line_p (const line_m
*** 2717,2723 ****
    expanded_location exploc_start
      = linemap_client_expand_location_to_spelling_point (set,
  							m_start,
! 							LOCATION_ASPECT_START);
    if (file != exploc_start.file)
      return false;
    if (line < exploc_start.line)
--- 2717,2723 ----
    expanded_location exploc_start
      = linemap_client_expand_location_to_spelling_point (set,
  							m_start,
! 							location_aspect::start);
    if (file != exploc_start.file)
      return false;
    if (line < exploc_start.line)
*************** fixit_hint::affects_line_p (const line_m
*** 2725,2731 ****
    expanded_location exploc_next_loc
      = linemap_client_expand_location_to_spelling_point (set,
  							m_next_loc,
! 							LOCATION_ASPECT_START);
    if (file != exploc_next_loc.file)
      return false;
    if (line > exploc_next_loc.line)
--- 2725,2731 ----
    expanded_location exploc_next_loc
      = linemap_client_expand_location_to_spelling_point (set,
  							m_next_loc,
! 							location_aspect::start);
    if (file != exploc_next_loc.file)
      return false;
    if (line > exploc_next_loc.line)
diff -Nrcpad gcc-16-20250914/libgcc/ChangeLog gcc-16-20250921/libgcc/ChangeLog
*** gcc-16-20250914/libgcc/ChangeLog	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/libgcc/ChangeLog	Sun Sep 21 22:33:32 2025
***************
*** 1,3 ****
--- 1,8 ----
+ 2025-09-19  Jim Lin  <jim@andestech.com>
+ 
+ 	* config/riscv/save-restore.S: Only save/restore the registers
+ 	which are really used for ILP32E/LP64.
+ 
  2025-08-21  Dimitar Dimitrov  <dimitar@dinux.eu>
  
  	* config/pru/libgcc-eabi.ver: Add __pruabi_softmpyi and
diff -Nrcpad gcc-16-20250914/libgcc/config/riscv/save-restore.S gcc-16-20250921/libgcc/config/riscv/save-restore.S
*** gcc-16-20250914/libgcc/config/riscv/save-restore.S	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/libgcc/config/riscv/save-restore.S	Sun Sep 21 22:33:33 2025
*************** FUNC_END (__riscv_restore_0)
*** 298,306 ****
  #else
  
  #ifdef __riscv_abi_rve
  FUNC_BEGIN(__riscv_save_2)
- FUNC_BEGIN(__riscv_save_1)
- FUNC_BEGIN(__riscv_save_0)
    .cfi_startproc
    # __riscv_save_* routine use t0/x5 as return address
    .cfi_return_column 5
--- 298,305 ----
  #else
  
  #ifdef __riscv_abi_rve
+ 
  FUNC_BEGIN(__riscv_save_2)
    .cfi_startproc
    # __riscv_save_* routine use t0/x5 as return address
    .cfi_return_column 5
*************** FUNC_BEGIN(__riscv_save_0)
*** 316,336 ****
    jr t0
    .cfi_endproc
  FUNC_END(__riscv_save_2)
  FUNC_END(__riscv_save_1)
  FUNC_END(__riscv_save_0)
  
  FUNC_BEGIN(__riscv_restore_2)
- FUNC_BEGIN(__riscv_restore_1)
- FUNC_BEGIN(__riscv_restore_0)
    .cfi_startproc
!   .cfi_def_cfa_offset 14
    lw s1, 0(sp)
    .cfi_restore 9
!   lw s0, 4(sp)
    .cfi_restore 8
!   lw ra, 8(sp)
    .cfi_restore 1
!   addi sp, sp, 12
    .cfi_def_cfa_offset 0
    ret
    .cfi_endproc
--- 315,370 ----
    jr t0
    .cfi_endproc
  FUNC_END(__riscv_save_2)
+ 
+ FUNC_BEGIN(__riscv_save_1)
+   .cfi_startproc
+   # __riscv_save_* routine use t0/x5 as return address
+   .cfi_return_column 5
+   addi sp, sp, -8
+   .cfi_def_cfa_offset 8
+   sw s0, 0(sp)
+   .cfi_offset 8, -8
+   sw ra, 4(sp)
+   .cfi_offset 1, -4
+   SET_LPAD
+   jr t0
+   .cfi_endproc
  FUNC_END(__riscv_save_1)
+ 
+ FUNC_BEGIN(__riscv_save_0)
+   .cfi_startproc
+   # __riscv_save_* routine use t0/x5 as return address
+   .cfi_return_column 5
+   addi sp, sp, -4
+   .cfi_def_cfa_offset 4
+   sw ra, 0(sp)
+   .cfi_offset 1, -4
+   SET_LPAD
+   jr t0
+   .cfi_endproc
  FUNC_END(__riscv_save_0)
  
  FUNC_BEGIN(__riscv_restore_2)
    .cfi_startproc
!   .cfi_def_cfa_offset 12
    lw s1, 0(sp)
    .cfi_restore 9
!   addi sp, sp, 4
! 
! FUNC_BEGIN(__riscv_restore_1)
!   .cfi_restore 9
!   .cfi_def_cfa_offset 8
!   lw s0, 0(sp)
    .cfi_restore 8
!   addi sp, sp, 4
! 
! FUNC_BEGIN(__riscv_restore_0)
!   .cfi_restore 8
!   .cfi_restore 9
!   .cfi_def_cfa_offset 4
!   lw ra, 0(sp)
    .cfi_restore 1
!   addi sp, sp, 4
    .cfi_def_cfa_offset 0
    ret
    .cfi_endproc
diff -Nrcpad gcc-16-20250914/libgm2/ChangeLog gcc-16-20250921/libgm2/ChangeLog
*** gcc-16-20250914/libgm2/ChangeLog	Sun Sep 14 22:32:34 2025
--- gcc-16-20250921/libgm2/ChangeLog	Sun Sep 21 22:33:33 2025
***************
*** 1,3 ****
--- 1,11 ----
+ 2025-09-19  Gaius Mulley  <gaiusmod2@gmail.com>
+ 
+ 	* libm2pim/Makefile.am (M2MODS): Add M2Diagnostic.mod.
+ 	Add M2WIDESET.mod.
+ 	(M2DEFS): Add M2Diagnostic.def.
+ 	Add M2WIDESET.def.
+ 	* libm2pim/Makefile.in: Regenerate.
+ 
  2025-07-23  Gaius Mulley  <gaiusmod2@gmail.com>
  
  	PR modula2/121164
diff -Nrcpad gcc-16-20250914/libgm2/libm2pim/Makefile.am gcc-16-20250921/libgm2/libm2pim/Makefile.am
*** gcc-16-20250914/libgm2/libm2pim/Makefile.am	Sun Sep 14 22:32:35 2025
--- gcc-16-20250921/libgm2/libm2pim/Makefile.am	Sun Sep 21 22:33:33 2025
*************** toolexeclib_LTLIBRARIES = libm2pim.la
*** 99,104 ****
--- 99,106 ----
  M2MODS = ASCII.mod IO.mod \
         Args.mod M2RTS.mod \
         M2Dependent.mod \
+        M2Diagnostic.mod \
+        M2WIDESET.mod \
         Assertion.mod NumberIO.mod \
         Break.mod SYSTEM.mod \
         CmdArgs.mod Scan.mod \
*************** M2DEFS = Args.def   ASCII.def \
*** 142,149 ****
--- 144,153 ----
           LegacyReal.def  libc.def \
           libm.def  LMathLib0.def \
           M2Dependent.def \
+          M2Diagnostic.def \
           M2EXCEPTION.def \
           M2RTS.def \
+          M2WIDESET.def \
           MathLib0.def  MemUtils.def \
           NumberIO.def  PushBackInput.def \
           RTExceptions.def  RTint.def \
diff -Nrcpad gcc-16-20250914/libgm2/libm2pim/Makefile.in gcc-16-20250921/libgm2/libm2pim/Makefile.in
*** gcc-16-20250914/libgm2/libm2pim/Makefile.in	Sun Sep 14 22:32:35 2025
--- gcc-16-20250921/libgm2/libm2pim/Makefile.in	Sun Sep 21 22:33:33 2025
*************** am__installdirs = "$(DESTDIR)$(toolexecl
*** 158,168 ****
  LTLIBRARIES = $(toolexeclib_LTLIBRARIES)
  libm2pim_la_LIBADD =
  @BUILD_PIMLIB_TRUE@am__objects_1 = ASCII.lo IO.lo Args.lo M2RTS.lo \
! @BUILD_PIMLIB_TRUE@	M2Dependent.lo Assertion.lo NumberIO.lo \
! @BUILD_PIMLIB_TRUE@	Break.lo SYSTEM.lo CmdArgs.lo Scan.lo \
! @BUILD_PIMLIB_TRUE@	StrCase.lo FIO.lo StrIO.lo StrLib.lo \
! @BUILD_PIMLIB_TRUE@	TimeString.lo Environment.lo FpuIO.lo \
! @BUILD_PIMLIB_TRUE@	Debug.lo SysStorage.lo Storage.lo StdIO.lo \
  @BUILD_PIMLIB_TRUE@	SEnvironment.lo DynamicStrings.lo SFIO.lo \
  @BUILD_PIMLIB_TRUE@	SArgs.lo SCmdArgs.lo PushBackInput.lo \
  @BUILD_PIMLIB_TRUE@	StringConvert.lo FormatStrings.lo \
--- 158,169 ----
  LTLIBRARIES = $(toolexeclib_LTLIBRARIES)
  libm2pim_la_LIBADD =
  @BUILD_PIMLIB_TRUE@am__objects_1 = ASCII.lo IO.lo Args.lo M2RTS.lo \
! @BUILD_PIMLIB_TRUE@	M2Dependent.lo M2Diagnostic.lo M2WIDESET.lo \
! @BUILD_PIMLIB_TRUE@	Assertion.lo NumberIO.lo Break.lo SYSTEM.lo \
! @BUILD_PIMLIB_TRUE@	CmdArgs.lo Scan.lo StrCase.lo FIO.lo \
! @BUILD_PIMLIB_TRUE@	StrIO.lo StrLib.lo TimeString.lo \
! @BUILD_PIMLIB_TRUE@	Environment.lo FpuIO.lo Debug.lo \
! @BUILD_PIMLIB_TRUE@	SysStorage.lo Storage.lo StdIO.lo \
  @BUILD_PIMLIB_TRUE@	SEnvironment.lo DynamicStrings.lo SFIO.lo \
  @BUILD_PIMLIB_TRUE@	SArgs.lo SCmdArgs.lo PushBackInput.lo \
  @BUILD_PIMLIB_TRUE@	StringConvert.lo FormatStrings.lo \
*************** FLAGS_TO_PASS = $(AM_MAKEFLAGS)
*** 478,483 ****
--- 479,486 ----
  @BUILD_PIMLIB_TRUE@M2MODS = ASCII.mod IO.mod \
  @BUILD_PIMLIB_TRUE@       Args.mod M2RTS.mod \
  @BUILD_PIMLIB_TRUE@       M2Dependent.mod \
+ @BUILD_PIMLIB_TRUE@       M2Diagnostic.mod \
+ @BUILD_PIMLIB_TRUE@       M2WIDESET.mod \
  @BUILD_PIMLIB_TRUE@       Assertion.mod NumberIO.mod \
  @BUILD_PIMLIB_TRUE@       Break.mod SYSTEM.mod \
  @BUILD_PIMLIB_TRUE@       CmdArgs.mod Scan.mod \
*************** FLAGS_TO_PASS = $(AM_MAKEFLAGS)
*** 521,528 ****
--- 524,533 ----
  @BUILD_PIMLIB_TRUE@         LegacyReal.def  libc.def \
  @BUILD_PIMLIB_TRUE@         libm.def  LMathLib0.def \
  @BUILD_PIMLIB_TRUE@         M2Dependent.def \
+ @BUILD_PIMLIB_TRUE@         M2Diagnostic.def \
  @BUILD_PIMLIB_TRUE@         M2EXCEPTION.def \
  @BUILD_PIMLIB_TRUE@         M2RTS.def \
+ @BUILD_PIMLIB_TRUE@         M2WIDESET.def \
  @BUILD_PIMLIB_TRUE@         MathLib0.def  MemUtils.def \
  @BUILD_PIMLIB_TRUE@         NumberIO.def  PushBackInput.def \
  @BUILD_PIMLIB_TRUE@         RTExceptions.def  RTint.def \
diff -Nrcpad gcc-16-20250914/libgomp/ChangeLog gcc-16-20250921/libgomp/ChangeLog
*** gcc-16-20250914/libgomp/ChangeLog	Sun Sep 14 22:32:36 2025
--- gcc-16-20250921/libgomp/ChangeLog	Sun Sep 21 22:33:38 2025
***************
*** 1,3 ****
--- 1,61 ----
+ 2025-09-18  Tobias Burnus  <tburnus@baylibre.com>
+ 	    Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR middle-end/121922
+ 	* testsuite/libgomp.c-c++-common/declare-variant-1.c: New test.
+ 
+ 2025-09-17  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	PR libgomp/119857
+ 	PR libgomp/114445
+ 	* config/accel/target-indirect.c: Change to use uint128_t instead
+ 	of a struct as data structure and add GOMP_INDIRECT_ADDR_HMAP as
+ 	host-accessible variable.
+ 	(struct indirect_map_t): Remove.
+ 	(USE_HASHTAB_LOOKUP, INDIRECT_DEV_ADDR, INDIRECT_HOST_ADDR,
+ 	SET_INDIRECT_HOST_ADDR, SET_INDIRECT_ADDRS): Define.
+ 	(htab_free): Use __builtin_unreachable.
+ 	(htab_hash, htab_eq, GOMP_target_map_indirect_ptr,
+ 	build_indirect_map): Update for new representation and new
+ 	pointer-to-hash variable.
+ 	* config/gcn/team.c (gomp_gcn_enter_kernel): Only call
+ 	build_indirect_map when GOMP_INDIRECT_ADDR_MAP.
+ 	* config/nvptx/team.c (gomp_nvptx_main): Likewise.
+ 	* libgomp-plugin.h (GOMP_INDIRECT_ADDR_HMAP): Define.
+ 	* plugin/plugin-gcn.c: Conditionally include
+ 	build-target-indirect-htab.h.
+ 	(USE_HASHTAB_LOOKUP_FOR_INDIRECT): Define.
+ 	(create_target_indirect_map): New prototype.
+ 	(GOMP_OFFLOAD_load_image): Update to create the device's
+ 	indirect-function hash table on the host.
+ 	* plugin/plugin-nvptx.c: Conditionally include
+ 	build-target-indirect-htab.h.
+ 	(USE_HASHTAB_LOOKUP_FOR_INDIRECT): Define.
+ 	(create_target_indirect_map): New prototype.
+ 	(GOMP_OFFLOAD_load_image): Update to create the device's
+ 	indirect-function hash table on the host.
+ 	* plugin/build-target-indirect-htab.h: New file.
+ 
+ 2025-09-17  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* libgomp.map (OACC_2.5): Move previously unimplemented
+ 	acc_{copyout,delete}_finalize_async_{32,64,array}_h_ to ...
+ 	(OACC_2.6.1): ... here.
+ 	* libgomp.texi (acc_copyin, acc_present_or_copyin, acc_create,
+ 	acc_present_or_create, acc_copyout, acc_update_device,
+ 	acc_update_self, acc_is_present): Use 'type(*), dimension(..)'
+ 	instead of 'type, dimension(:[,:]...)' for Fortran.
+ 	(acc_delete): Likewise; change acc_delete_async_finalize to
+ 	acc_delete_finalize_async.
+ 	* openacc.f90 (openacc_internal): Add interfaces for
+ 	acc_{copyout,delete}_finalize_async_{{32,64,array}_h,_l}.
+ 	(openacc): Add generic interfaces for
+ 	acc_copyout_finalize_async and acc_delete_finalize_async.
+ 	(acc_{copyout,delete}_finalize_async_{32,64,array}_h): New.
+ 	* openacc_lib.h: Add generic interfaces for
+ 	acc_copyout_finalize_async and acc_delete_finalize_async.
+ 	* testsuite/libgomp.oacc-fortran/pr92970-1.f90: New test.
+ 
  2025-09-06  Jakub Jelinek  <jakub@redhat.com>
  
  	* omp.h.in: Fix up formatting of __cplusplus >= 201103L
diff -Nrcpad gcc-16-20250914/libgomp/config/accel/target-indirect.c gcc-16-20250921/libgomp/config/accel/target-indirect.c
*** gcc-16-20250914/libgomp/config/accel/target-indirect.c	Sun Sep 14 22:32:36 2025
--- gcc-16-20250921/libgomp/config/accel/target-indirect.c	Sun Sep 21 22:33:38 2025
***************
*** 25,67 ****
     <http://www.gnu.org/licenses/>.  */
  
  #include <assert.h>
- #include <string.h>
  #include "libgomp.h"
  
! struct indirect_map_t
! {
!   void *host_addr;
!   void *target_addr;
! };
  
! typedef struct indirect_map_t *hash_entry_type;
  
  static inline void * htab_alloc (size_t size) { return gomp_malloc (size); }
! static inline void htab_free (void *ptr) { free (ptr); }
  
  #include "hashtab.h"
  
  static inline hashval_t
  htab_hash (hash_entry_type element)
  {
!   return hash_pointer (element->host_addr);
  }
  
  static inline bool
  htab_eq (hash_entry_type x, hash_entry_type y)
  {
!   return x->host_addr == y->host_addr;
  }
  
! void **GOMP_INDIRECT_ADDR_MAP = NULL;
! 
! /* Use a hashtab to lookup the target address instead of using a linear
!    search.  */
! #define USE_HASHTAB_LOOKUP
  
! #ifdef USE_HASHTAB_LOOKUP
  
! static htab_t indirect_htab = NULL;
  
  /* Build the hashtab used for host->target address lookups.  */
  
--- 25,92 ----
     <http://www.gnu.org/licenses/>.  */
  
  #include <assert.h>
  #include "libgomp.h"
  
! void *GOMP_INDIRECT_ADDR_MAP = NULL;
  
! #define USE_HASHTAB_LOOKUP
! 
! #ifdef USE_HASHTAB_LOOKUP
! 
! #include <string.h>  /* For memset.  */
! 
! /* Use a hashtab to lookup the target address instead of using a linear
!    search.
! 
!    With newer libgomp on the host the hash is already initialized on the host
!    (i.e plugin/plugin-gcn.c). Thus, build_indirect_map is only used as
!    fallback with older glibc.  */
! 
! void *GOMP_INDIRECT_ADDR_HMAP = NULL;
! 
! typedef unsigned __int128 hash_entry_type;
! #define INDIRECT_DEV_ADDR(p) ((void*) (uintptr_t) (p >> 64))
! #define INDIRECT_HOST_ADDR(p) ((void *) (uintptr_t) p)
! #define SET_INDIRECT_HOST_ADDR(p, host) p = (((unsigned __int128) (uintptr_t) host))
! #define SET_INDIRECT_ADDRS(p, h, d) \
!   p = (((unsigned __int128) h) + (((unsigned __int128) d) << 64))
! 
! /* Besides the sizes, also the endianness either needs to agree or
!    host-device memcpy needs to take care of this.  */
! _Static_assert (sizeof (unsigned __int128) == 2*sizeof(void*),
! 		"indirect_target_map_t size mismatch");
  
  static inline void * htab_alloc (size_t size) { return gomp_malloc (size); }
! static inline void htab_free (void *ptr) { __builtin_unreachable (); }
  
  #include "hashtab.h"
  
  static inline hashval_t
  htab_hash (hash_entry_type element)
  {
!   return hash_pointer (INDIRECT_HOST_ADDR (element));
  }
  
  static inline bool
  htab_eq (hash_entry_type x, hash_entry_type y)
  {
!   return INDIRECT_HOST_ADDR (x) == INDIRECT_HOST_ADDR (y);
  }
  
! void *
! GOMP_target_map_indirect_ptr (void *ptr)
! {
!   /* NULL pointers always resolve to NULL.  */
!   if (!ptr)
!     return ptr;
  
!   assert (GOMP_INDIRECT_ADDR_HMAP);
  
!   hash_entry_type element;
!   SET_INDIRECT_HOST_ADDR (element, ptr);
!   hash_entry_type entry = htab_find ((htab_t) GOMP_INDIRECT_ADDR_HMAP, element);
!   return entry ? INDIRECT_DEV_ADDR (entry) : ptr;
! }
  
  /* Build the hashtab used for host->target address lookups.  */
  
*************** void
*** 69,113 ****
  build_indirect_map (void)
  {
    size_t num_ind_funcs = 0;
!   void **map_entry;
  
!   if (!GOMP_INDIRECT_ADDR_MAP)
      return;
  
!   if (!indirect_htab)
!     {
!       /* Count the number of entries in the NULL-terminated address map.  */
!       for (map_entry = GOMP_INDIRECT_ADDR_MAP; *map_entry;
! 	   map_entry += 2, num_ind_funcs++);
  
!       /* Build hashtab for address lookup.  */
!       indirect_htab = htab_create (num_ind_funcs);
!       map_entry = GOMP_INDIRECT_ADDR_MAP;
  
!       for (int i = 0; i < num_ind_funcs; i++, map_entry += 2)
! 	{
! 	  struct indirect_map_t element = { *map_entry, NULL };
! 	  hash_entry_type *slot = htab_find_slot (&indirect_htab, &element,
! 						  INSERT);
! 	  *slot = (hash_entry_type) map_entry;
! 	}
      }
  }
  
- void *
- GOMP_target_map_indirect_ptr (void *ptr)
- {
-   /* NULL pointers always resolve to NULL.  */
-   if (!ptr)
-     return ptr;
- 
-   assert (indirect_htab);
- 
-   struct indirect_map_t element = { ptr, NULL };
-   hash_entry_type entry = htab_find (indirect_htab, &element);
-   return entry ? entry->target_addr : ptr;
- }
- 
  #else
  
  void
--- 94,123 ----
  build_indirect_map (void)
  {
    size_t num_ind_funcs = 0;
!   uint64_t *map_entry;
  
!   if (!GOMP_INDIRECT_ADDR_MAP || GOMP_INDIRECT_ADDR_HMAP)
      return;
  
!   /* Count the number of entries in the NULL-terminated address map.  */
!   for (map_entry = (uint64_t *) GOMP_INDIRECT_ADDR_MAP; *map_entry;
!     map_entry += 2, num_ind_funcs++);
  
!   /* Build hashtab for address lookup.  */
!   htab_t indirect_htab = htab_create (num_ind_funcs);
!   GOMP_INDIRECT_ADDR_HMAP = (void *) indirect_htab;
  
!   map_entry = GOMP_INDIRECT_ADDR_MAP;
!   for (int i = 0; i < num_ind_funcs; i++, map_entry += 2)
!     {
!       hash_entry_type element;
!       SET_INDIRECT_ADDRS (element, *map_entry, *(map_entry + 1));
!       hash_entry_type *slot = htab_find_slot (&indirect_htab, element,
! 					      INSERT);
!       *slot = element;
      }
  }
  
  #else
  
  void
diff -Nrcpad gcc-16-20250914/libgomp/config/gcn/team.c gcc-16-20250921/libgomp/config/gcn/team.c
*** gcc-16-20250914/libgomp/config/gcn/team.c	Sun Sep 14 22:32:36 2025
--- gcc-16-20250921/libgomp/config/gcn/team.c	Sun Sep 21 22:33:38 2025
***************
*** 32,37 ****
--- 32,41 ----
  #define LITTLEENDIAN_CPU
  #include "hsa.h"
  
+ #define UNLIKELY(x) (__builtin_expect ((x), 0))
+ 
+ extern void *GOMP_INDIRECT_ADDR_MAP;
+ 
  /* Defined in basic-allocator.c via config/amdgcn/allocator.c.  */
  void __gcn_lowlat_init (void *heap, size_t size);
  
*************** gomp_gcn_enter_kernel (void)
*** 57,64 ****
        int numthreads = __builtin_gcn_dim_size (1);
        int teamid = __builtin_gcn_dim_pos(0);
  
!       /* Initialize indirect function support.  */
!       if (teamid == 0)
  	build_indirect_map ();
  
        /* Set up the global state.
--- 61,68 ----
        int numthreads = __builtin_gcn_dim_size (1);
        int teamid = __builtin_gcn_dim_pos(0);
  
!       /* Initialize indirect function support for older libgomp.  */
!       if (UNLIKELY (GOMP_INDIRECT_ADDR_MAP != NULL && teamid == 0))
  	build_indirect_map ();
  
        /* Set up the global state.
diff -Nrcpad gcc-16-20250914/libgomp/config/nvptx/team.c gcc-16-20250921/libgomp/config/nvptx/team.c
*** gcc-16-20250914/libgomp/config/nvptx/team.c	Sun Sep 14 22:32:36 2025
--- gcc-16-20250921/libgomp/config/nvptx/team.c	Sun Sep 21 22:33:38 2025
***************
*** 31,36 ****
--- 31,40 ----
  #include <stdlib.h>
  #include <string.h>
  
+ #define UNLIKELY(x) (__builtin_expect ((x), 0))
+ 
+ extern void *GOMP_INDIRECT_ADDR_MAP;
+ 
  struct gomp_thread *nvptx_thrs __attribute__((shared,nocommon));
  int __gomp_team_num __attribute__((shared,nocommon));
  
*************** gomp_nvptx_main (void (*fn) (void *), vo
*** 71,80 ****
        nvptx_thrs = alloca (ntids * sizeof (*nvptx_thrs));
        memset (nvptx_thrs, 0, ntids * sizeof (*nvptx_thrs));
  
!       /* Initialize indirect function support.  */
        unsigned int block_id;
        asm ("mov.u32 %0, %%ctaid.x;" : "=r" (block_id));
!       if (block_id == 0)
  	build_indirect_map ();
  
        /* Find the low-latency heap details ....  */
--- 75,84 ----
        nvptx_thrs = alloca (ntids * sizeof (*nvptx_thrs));
        memset (nvptx_thrs, 0, ntids * sizeof (*nvptx_thrs));
  
!       /* Initialize indirect function support for older libgomp.  */
        unsigned int block_id;
        asm ("mov.u32 %0, %%ctaid.x;" : "=r" (block_id));
!       if (UNLIKELY (GOMP_INDIRECT_ADDR_MAP != NULL && block_id == 0))
  	build_indirect_map ();
  
        /* Find the low-latency heap details ....  */
diff -Nrcpad gcc-16-20250914/libgomp/libgomp-plugin.h gcc-16-20250921/libgomp/libgomp-plugin.h
*** gcc-16-20250914/libgomp/libgomp-plugin.h	Sun Sep 14 22:32:36 2025
--- gcc-16-20250921/libgomp/libgomp-plugin.h	Sun Sep 21 22:33:38 2025
*************** enum gomp_interop_flag
*** 134,140 ****
--- 134,144 ----
     must be stringified).  */
  #define GOMP_ADDITIONAL_ICVS __gomp_additional_icvs
  
+ /* GOMP_INDIRECT_ADDR_HMAP points to a hash table and is to be used by
+    newer libgomp, while GOMP_INDIRECT_ADDR_MAP points to a linear table
+    and exists for backward compatibility.  */
  #define GOMP_INDIRECT_ADDR_MAP __gomp_indirect_addr_map
+ #define GOMP_INDIRECT_ADDR_HMAP __gomp_indirect_addr_hmap
  
  /* Miscellaneous functions.  */
  extern void *GOMP_PLUGIN_malloc (size_t) __attribute__ ((malloc));
diff -Nrcpad gcc-16-20250914/libgomp/libgomp.map gcc-16-20250921/libgomp/libgomp.map
*** gcc-16-20250914/libgomp/libgomp.map	Sun Sep 14 22:32:36 2025
--- gcc-16-20250921/libgomp/libgomp.map	Sun Sep 21 22:33:38 2025
*************** OACC_2.5 {
*** 562,570 ****
  	acc_copyout_finalize_64_h_;
  	acc_copyout_finalize_array_h_;
  	acc_copyout_finalize_async;
- 	acc_copyout_finalize_async_32_h_;
- 	acc_copyout_finalize_async_64_h_;
- 	acc_copyout_finalize_async_array_h_;
  	acc_create_async;
  	acc_create_async_32_h_;
  	acc_create_async_64_h_;
--- 562,567 ----
*************** OACC_2.5 {
*** 578,586 ****
  	acc_delete_finalize_64_h_;
  	acc_delete_finalize_array_h_;
  	acc_delete_finalize_async;
- 	acc_delete_finalize_async_32_h_;
- 	acc_delete_finalize_async_64_h_;
- 	acc_delete_finalize_async_array_h_;
  	acc_memcpy_from_device_async;
  	acc_memcpy_to_device_async;
  	acc_update_device_async;
--- 575,580 ----
*************** OACC_2.6 {
*** 617,622 ****
--- 611,622 ----
  
  OACC_2.6.1 {
    global:
+ 	acc_copyout_finalize_async_32_h_;
+ 	acc_copyout_finalize_async_64_h_;
+ 	acc_copyout_finalize_async_array_h_;
+ 	acc_delete_finalize_async_32_h_;
+ 	acc_delete_finalize_async_64_h_;
+ 	acc_delete_finalize_async_array_h_;
  	acc_memcpy_device;
  	acc_memcpy_device_async;
  } OACC_2.6;
diff -Nrcpad gcc-16-20250914/libgomp/libgomp.texi gcc-16-20250921/libgomp/libgomp.texi
*** gcc-16-20250914/libgomp/libgomp.texi	Sun Sep 14 22:32:36 2025
--- gcc-16-20250921/libgomp/libgomp.texi	Sun Sep 21 22:33:38 2025
*************** variable or array element and @var{len}
*** 5361,5375 ****
  @item @emph{Fortran}:
  @multitable @columnfractions .20 .80
  @item @emph{Interface}: @tab @code{subroutine acc_copyin(a)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_copyin(a, len)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
  @item @emph{Interface}: @tab @code{subroutine acc_copyin_async(a, async)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @item @emph{Interface}: @tab @code{subroutine acc_copyin_async(a, len, async)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @end multitable
--- 5361,5375 ----
  @item @emph{Fortran}:
  @multitable @columnfractions .20 .80
  @item @emph{Interface}: @tab @code{subroutine acc_copyin(a)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_copyin(a, len)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
  @item @emph{Interface}: @tab @code{subroutine acc_copyin_async(a, async)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @item @emph{Interface}: @tab @code{subroutine acc_copyin_async(a, len, async)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @end multitable
*************** backward compatibility with OpenACC 2.0;
*** 5406,5419 ****
  @item @emph{Fortran}:
  @multitable @columnfractions .20 .80
  @item @emph{Interface}: @tab @code{subroutine acc_present_or_copyin(a)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_present_or_copyin(a, len)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
  @item @emph{Interface}: @tab @code{subroutine acc_pcopyin(a)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_pcopyin(a, len)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
  @end multitable
  
--- 5406,5419 ----
  @item @emph{Fortran}:
  @multitable @columnfractions .20 .80
  @item @emph{Interface}: @tab @code{subroutine acc_present_or_copyin(a)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_present_or_copyin(a, len)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
  @item @emph{Interface}: @tab @code{subroutine acc_pcopyin(a)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_pcopyin(a, len)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
  @end multitable
  
*************** array element and @var{len} specifies th
*** 5445,5459 ****
  @item @emph{Fortran}:
  @multitable @columnfractions .20 .80
  @item @emph{Interface}: @tab @code{subroutine acc_create(a)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_create(a, len)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
  @item @emph{Interface}: @tab @code{subroutine acc_create_async(a, async)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @item @emph{Interface}: @tab @code{subroutine acc_create_async(a, len, async)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @end multitable
--- 5445,5459 ----
  @item @emph{Fortran}:
  @multitable @columnfractions .20 .80
  @item @emph{Interface}: @tab @code{subroutine acc_create(a)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_create(a, len)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
  @item @emph{Interface}: @tab @code{subroutine acc_create_async(a, async)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @item @emph{Interface}: @tab @code{subroutine acc_create_async(a, len, async)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @end multitable
*************** backward compatibility with OpenACC 2.0;
*** 5490,5503 ****
  @item @emph{Fortran}:
  @multitable @columnfractions .20 .80
  @item @emph{Interface}: @tab @code{subroutine acc_present_or_create(a)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_present_or_create(a, len)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
  @item @emph{Interface}: @tab @code{subroutine acc_pcreate(a)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_pcreate(a, len)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
  @end multitable
  
--- 5490,5503 ----
  @item @emph{Fortran}:
  @multitable @columnfractions .20 .80
  @item @emph{Interface}: @tab @code{subroutine acc_present_or_create(a)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_present_or_create(a, len)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
  @item @emph{Interface}: @tab @code{subroutine acc_pcreate(a)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_pcreate(a, len)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
  @end multitable
  
*************** array element and @var{len} specifies th
*** 5530,5556 ****
  @item @emph{Fortran}:
  @multitable @columnfractions .20 .80
  @item @emph{Interface}: @tab @code{subroutine acc_copyout(a)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_copyout(a, len)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
  @item @emph{Interface}: @tab @code{subroutine acc_copyout_async(a, async)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @item @emph{Interface}: @tab @code{subroutine acc_copyout_async(a, len, async)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @item @emph{Interface}: @tab @code{subroutine acc_copyout_finalize(a)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_copyout_finalize(a, len)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
  @item @emph{Interface}: @tab @code{subroutine acc_copyout_finalize_async(a, async)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @item @emph{Interface}: @tab @code{subroutine acc_copyout_finalize_async(a, len, async)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @end multitable
--- 5530,5556 ----
  @item @emph{Fortran}:
  @multitable @columnfractions .20 .80
  @item @emph{Interface}: @tab @code{subroutine acc_copyout(a)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_copyout(a, len)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
  @item @emph{Interface}: @tab @code{subroutine acc_copyout_async(a, async)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @item @emph{Interface}: @tab @code{subroutine acc_copyout_async(a, len, async)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @item @emph{Interface}: @tab @code{subroutine acc_copyout_finalize(a)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_copyout_finalize(a, len)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
  @item @emph{Interface}: @tab @code{subroutine acc_copyout_finalize_async(a, async)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @item @emph{Interface}: @tab @code{subroutine acc_copyout_finalize_async(a, len, async)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @end multitable
*************** array element and @var{len} specifies th
*** 5584,5610 ****
  @item @emph{Fortran}:
  @multitable @columnfractions .20 .80
  @item @emph{Interface}: @tab @code{subroutine acc_delete(a)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_delete(a, len)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
  @item @emph{Interface}: @tab @code{subroutine acc_delete_async(a, async)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @item @emph{Interface}: @tab @code{subroutine acc_delete_async(a, len, async)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @item @emph{Interface}: @tab @code{subroutine acc_delete_finalize(a)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_delete_finalize(a, len)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
! @item @emph{Interface}: @tab @code{subroutine acc_delete_async_finalize(a, async)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
! @item @emph{Interface}: @tab @code{subroutine acc_delete_async_finalize(a, len, async)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @end multitable
--- 5584,5610 ----
  @item @emph{Fortran}:
  @multitable @columnfractions .20 .80
  @item @emph{Interface}: @tab @code{subroutine acc_delete(a)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_delete(a, len)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
  @item @emph{Interface}: @tab @code{subroutine acc_delete_async(a, async)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @item @emph{Interface}: @tab @code{subroutine acc_delete_async(a, len, async)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @item @emph{Interface}: @tab @code{subroutine acc_delete_finalize(a)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_delete_finalize(a, len)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
! @item @emph{Interface}: @tab @code{subroutine acc_delete_finalize_async(a, async)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
! @item @emph{Interface}: @tab @code{subroutine acc_delete_finalize_async(a, len, async)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @end multitable
*************** array element and @var{len} specifies th
*** 5637,5651 ****
  @item @emph{Fortran}:
  @multitable @columnfractions .20 .80
  @item @emph{Interface}: @tab @code{subroutine acc_update_device(a)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_update_device(a, len)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
  @item @emph{Interface}: @tab @code{subroutine acc_update_device_async(a, async)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @item @emph{Interface}: @tab @code{subroutine acc_update_device_async(a, len, async)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @end multitable
--- 5637,5651 ----
  @item @emph{Fortran}:
  @multitable @columnfractions .20 .80
  @item @emph{Interface}: @tab @code{subroutine acc_update_device(a)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_update_device(a, len)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
  @item @emph{Interface}: @tab @code{subroutine acc_update_device_async(a, async)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @item @emph{Interface}: @tab @code{subroutine acc_update_device_async(a, len, async)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @end multitable
*************** array element and @var{len} specifies th
*** 5678,5692 ****
  @item @emph{Fortran}:
  @multitable @columnfractions .20 .80
  @item @emph{Interface}: @tab @code{subroutine acc_update_self(a)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_update_self(a, len)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
  @item @emph{Interface}: @tab @code{subroutine acc_update_self_async(a, async)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @item @emph{Interface}: @tab @code{subroutine acc_update_self_async(a, len, async)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @end multitable
--- 5678,5692 ----
  @item @emph{Fortran}:
  @multitable @columnfractions .20 .80
  @item @emph{Interface}: @tab @code{subroutine acc_update_self(a)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item @emph{Interface}: @tab @code{subroutine acc_update_self(a, len)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
  @item @emph{Interface}: @tab @code{subroutine acc_update_self_async(a, async)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @item @emph{Interface}: @tab @code{subroutine acc_update_self_async(a, len, async)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
  @item                   @tab @code{integer(acc_handle_kind) :: async}
  @end multitable
*************** a @code{false} is return to indicate the
*** 5829,5838 ****
  @item @emph{Fortran}:
  @multitable @columnfractions .20 .80
  @item @emph{Interface}: @tab @code{function acc_is_present(a)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{logical acc_is_present}
  @item @emph{Interface}: @tab @code{function acc_is_present(a, len)}
! @item                   @tab @code{type, dimension(:[,:]...) :: a}
  @item                   @tab @code{integer len}
  @item                   @tab @code{logical acc_is_present}
  @end multitable
--- 5829,5838 ----
  @item @emph{Fortran}:
  @multitable @columnfractions .20 .80
  @item @emph{Interface}: @tab @code{function acc_is_present(a)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{logical acc_is_present}
  @item @emph{Interface}: @tab @code{function acc_is_present(a, len)}
! @item                   @tab @code{type(*), dimension(..) :: a}
  @item                   @tab @code{integer len}
  @item                   @tab @code{logical acc_is_present}
  @end multitable
diff -Nrcpad gcc-16-20250914/libgomp/openacc.f90 gcc-16-20250921/libgomp/openacc.f90
*** gcc-16-20250914/libgomp/openacc.f90	Sun Sep 14 22:32:36 2025
--- gcc-16-20250921/libgomp/openacc.f90	Sun Sep 21 22:33:38 2025
*************** module openacc_internal
*** 269,274 ****
--- 269,298 ----
        type (*), dimension (..), contiguous :: a
      end subroutine
  
+     subroutine acc_copyout_finalize_async_32_h (a, len, async)
+       use iso_c_binding, only: c_int32_t
+       use openacc_kinds, only: acc_handle_kind
+       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
+       type (*), dimension (*) :: a
+       integer (c_int32_t) len
+       integer (acc_handle_kind) async
+     end subroutine
+ 
+     subroutine acc_copyout_finalize_async_64_h (a, len, async)
+       use iso_c_binding, only: c_int64_t
+       use openacc_kinds, only: acc_handle_kind
+       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
+       type (*), dimension (*) :: a
+       integer (c_int64_t) len
+       integer (acc_handle_kind) async
+     end subroutine
+ 
+     subroutine acc_copyout_finalize_async_array_h (a, async)
+       use openacc_kinds, only: acc_handle_kind
+       type (*), dimension (..), contiguous :: a
+       integer (acc_handle_kind) async
+     end subroutine
+ 
      subroutine acc_delete_32_h (a, len)
        use iso_c_binding, only: c_int32_t
        !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
*************** module openacc_internal
*** 458,463 ****
--- 482,511 ----
        integer (acc_handle_kind) async
      end subroutine
  
+     subroutine acc_delete_finalize_async_32_h (a, len, async)
+       use iso_c_binding, only: c_int32_t
+       use openacc_kinds, only: acc_handle_kind
+       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
+       type (*), dimension (*) :: a
+       integer (c_int32_t) len
+       integer (acc_handle_kind) async
+     end subroutine
+ 
+     subroutine acc_delete_finalize_async_64_h (a, len, async)
+       use iso_c_binding, only: c_int64_t
+       use openacc_kinds, only: acc_handle_kind
+       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
+       type (*), dimension (*) :: a
+       integer (c_int64_t) len
+       integer (acc_handle_kind) async
+     end subroutine
+ 
+     subroutine acc_delete_finalize_async_array_h (a, async)
+       use openacc_kinds, only: acc_handle_kind
+       type (*), dimension (..), contiguous :: a
+       integer (acc_handle_kind) async
+     end subroutine
+ 
      subroutine acc_update_device_async_32_h (a, len, async)
        use iso_c_binding, only: c_int32_t
        use openacc_kinds, only: acc_handle_kind
*************** module openacc_internal
*** 663,668 ****
--- 711,725 ----
        integer (c_size_t), value :: len
      end subroutine
  
+     subroutine acc_copyout_finalize_async_l (a, len, async) &
+         bind (C, name = "acc_copyout_finalize_async")
+       use iso_c_binding, only: c_size_t, c_int
+       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
+       type (*), dimension (*) :: a
+       integer (c_size_t), value :: len
+       integer (c_int), value :: async
+     end subroutine
+ 
      subroutine acc_delete_l (a, len) &
          bind (C, name = "acc_delete")
        use iso_c_binding, only: c_size_t
*************** module openacc_internal
*** 679,684 ****
--- 736,750 ----
        integer (c_size_t), value :: len
      end subroutine
  
+     subroutine acc_delete_finalize_async_l (a, len, async) &
+         bind (C, name = "acc_delete_finalize_async")
+       use iso_c_binding, only: c_size_t, c_int
+       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
+       type (*), dimension (*) :: a
+       integer (c_size_t), value :: len
+       integer (c_int), value :: async
+     end subroutine
+ 
      subroutine acc_update_device_l (a, len) &
          bind (C, name = "acc_update_device")
        use iso_c_binding, only: c_size_t
*************** module openacc
*** 794,800 ****
    public :: acc_deviceptr, acc_hostptr, acc_is_present
    public :: acc_copyin_async, acc_create_async, acc_copyout_async
    public :: acc_delete_async, acc_update_device_async, acc_update_self_async
!   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
--- 860,867 ----
    public :: acc_deviceptr, acc_hostptr, acc_is_present
    public :: acc_copyin_async, acc_create_async, acc_copyout_async
    public :: acc_delete_async, acc_update_device_async, acc_update_self_async
!   public :: acc_copyout_finalize, acc_copyout_finalize_async
!   public :: acc_delete_finalize, acc_delete_finalize_async
    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
*************** module openacc
*** 946,951 ****
--- 1013,1024 ----
      procedure :: acc_copyout_finalize_array_h
    end interface
  
+   interface acc_copyout_finalize_async
+     procedure :: acc_copyout_finalize_async_32_h
+     procedure :: acc_copyout_finalize_async_64_h
+     procedure :: acc_copyout_finalize_async_array_h
+   end interface
+ 
    interface acc_delete
      procedure :: acc_delete_32_h
      procedure :: acc_delete_64_h
*************** module openacc
*** 1136,1141 ****
--- 1209,1220 ----
      procedure :: acc_delete_async_array_h
    end interface
  
+   interface acc_delete_finalize_async
+     procedure :: acc_delete_finalize_async_32_h
+     procedure :: acc_delete_finalize_async_64_h
+     procedure :: acc_delete_finalize_async_array_h
+   end interface
+ 
    interface acc_update_device_async
      procedure :: acc_update_device_async_32_h
      procedure :: acc_update_device_async_64_h
*************** subroutine acc_copyout_finalize_array_h
*** 1439,1444 ****
--- 1518,1557 ----
    call acc_copyout_finalize_l (a, sizeof (a))
  end subroutine
  
+ subroutine acc_copyout_finalize_async_32_h (a, len, async)
+   use iso_c_binding, only: c_int32_t, c_size_t, c_int
+   use openacc_internal, only: acc_copyout_finalize_async_l
+   use openacc_kinds, only: acc_handle_kind
+   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
+   type (*), dimension (*) :: a
+   integer (c_int32_t) len
+   integer (acc_handle_kind) async
+   call acc_copyout_finalize_async_l (a, int (len, kind = c_size_t), &
+                                      int (async, kind = c_int))
+ end subroutine
+ 
+ subroutine acc_copyout_finalize_async_64_h (a, len, async)
+   use iso_c_binding, only: c_int64_t, c_size_t, c_int
+   use openacc_internal, only: acc_copyout_finalize_async_l
+   use openacc_kinds, only: acc_handle_kind
+   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
+   type (*), dimension (*) :: a
+   integer (c_int64_t) len
+   integer (acc_handle_kind) async
+   call acc_copyout_finalize_async_l (a, int (len, kind = c_size_t), &
+                                      int (async, kind = c_int))
+ end subroutine
+ 
+ subroutine acc_copyout_finalize_async_array_h (a, async)
+   use iso_c_binding, only: c_int
+   use openacc_internal, only: acc_copyout_finalize_async_l
+   use openacc_kinds, only: acc_handle_kind
+   type (*), dimension (..), contiguous :: a
+   integer (acc_handle_kind) async
+   call acc_copyout_finalize_async_l (a, sizeof (a), int (async, kind = c_int))
+ end subroutine
+ 
+ 
  subroutine acc_delete_32_h (a, len)
    use iso_c_binding, only: c_int32_t, c_size_t
    use openacc_internal, only: acc_delete_l
*************** subroutine acc_delete_async_array_h (a,
*** 1686,1691 ****
--- 1799,1837 ----
    call acc_delete_async_l (a, sizeof (a), int (async, kind = c_int))
  end subroutine
  
+ subroutine acc_delete_finalize_async_32_h (a, len, async)
+   use iso_c_binding, only: c_int32_t, c_size_t, c_int
+   use openacc_internal, only: acc_delete_finalize_async_l
+   use openacc_kinds, only: acc_handle_kind
+   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
+   type (*), dimension (*) :: a
+   integer (c_int32_t) len
+   integer (acc_handle_kind) async
+   call acc_delete_finalize_async_l (a, int (len, kind = c_size_t), &
+                                     int (async, kind = c_int))
+ end subroutine
+ 
+ subroutine acc_delete_finalize_async_64_h (a, len, async)
+   use iso_c_binding, only: c_int64_t, c_size_t, c_int
+   use openacc_internal, only: acc_delete_finalize_async_l
+   use openacc_kinds, only: acc_handle_kind
+   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
+   type (*), dimension (*) :: a
+   integer (c_int64_t) len
+   integer (acc_handle_kind) async
+   call acc_delete_finalize_async_l (a, int (len, kind = c_size_t),&
+                                     int (async, kind = c_int))
+ end subroutine
+ 
+ subroutine acc_delete_finalize_async_array_h (a, async)
+   use iso_c_binding, only: c_int
+   use openacc_internal, only: acc_delete_finalize_async_l
+   use openacc_kinds, only: acc_handle_kind
+   type (*), dimension (..), contiguous :: a
+   integer (acc_handle_kind) async
+   call acc_delete_finalize_async_l (a, sizeof (a), int (async, kind = c_int))
+ end subroutine
+ 
  subroutine acc_update_device_async_32_h (a, len, async)
    use iso_c_binding, only: c_int32_t, c_size_t, c_int
    use openacc_internal, only: acc_update_device_async_l
diff -Nrcpad gcc-16-20250914/libgomp/openacc_lib.h gcc-16-20250921/libgomp/openacc_lib.h
*** gcc-16-20250914/libgomp/openacc_lib.h	Sun Sep 14 22:32:36 2025
--- gcc-16-20250921/libgomp/openacc_lib.h	Sun Sep 21 22:33:38 2025
***************
*** 350,355 ****
--- 350,381 ----
          end subroutine
        end interface
  
+       interface acc_copyout_finalize_async
+         subroutine acc_copyout_finalize_async_32_h (a, len, async)
+           use iso_c_binding, only: c_int32_t
+           import acc_handle_kind
+ !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
+           type (*), dimension (*) :: a
+           integer (c_int32_t) len
+           integer (acc_handle_kind) async
+         end subroutine
+ 
+         subroutine acc_copyout_finalize_async_64_h (a, len, async)
+           use iso_c_binding, only: c_int64_t
+           import acc_handle_kind
+ !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
+           type (*), dimension (*) :: a
+           integer (c_int64_t) len
+           integer (acc_handle_kind) async
+         end subroutine
+ 
+         subroutine acc_copyout_finalize_async_array_h (a, async_)
+           import acc_handle_kind
+           type (*), dimension (..), contiguous :: a
+           integer (acc_handle_kind) async_
+         end subroutine
+       end interface
+ 
        interface acc_delete
          subroutine acc_delete_32_h (a, len)
            use iso_c_binding, only: c_int32_t
***************
*** 390,395 ****
--- 416,447 ----
          end subroutine
        end interface
  
+       interface acc_delete_finalize_async
+         subroutine acc_delete_finalize_async_32_h (a, len, async)
+           use iso_c_binding, only: c_int32_t
+           import acc_handle_kind
+ !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
+           type (*), dimension (*) :: a
+           integer (c_int32_t) len
+           integer (acc_handle_kind) async
+         end subroutine
+ 
+         subroutine acc_delete_finalize_async_64_h (a, len, async)
+           use iso_c_binding, only: c_int64_t
+           import acc_handle_kind
+ !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
+           type (*), dimension (*) :: a
+           integer (c_int64_t) len
+           integer (acc_handle_kind) async
+         end subroutine
+ 
+         subroutine acc_delete_finalize_async_array_h (a, async_)
+           import acc_handle_kind
+           type (*), dimension (..), contiguous :: a
+           integer (acc_handle_kind) async_
+         end subroutine
+       end interface
+ 
        interface acc_update_device
          subroutine acc_update_device_32_h (a, len)
            use iso_c_binding, only: c_int32_t
diff -Nrcpad gcc-16-20250914/libgomp/plugin/build-target-indirect-htab.h gcc-16-20250921/libgomp/plugin/build-target-indirect-htab.h
*** gcc-16-20250914/libgomp/plugin/build-target-indirect-htab.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/libgomp/plugin/build-target-indirect-htab.h	Sun Sep 21 22:33:38 2025
***************
*** 0 ****
--- 1,83 ----
+ /* Copyright (C) 2023-2025 Free Software Foundation, Inc.
+ 
+    Contributed by Siemens.
+ 
+    This file is part of the GNU Offloading and Multi Processing Library
+    (libgomp).
+ 
+    Libgomp is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3, or (at your option)
+    any later version.
+ 
+    Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+    FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+    more details.
+ 
+    Under Section 7 of GPL version 3, you are granted additional
+    permissions described in the GCC Runtime Library Exception, version
+    3.1, as published by the Free Software Foundation.
+ 
+    You should have received a copy of the GNU General Public License and
+    a copy of the GCC Runtime Library Exception along with this program;
+    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+    <http://www.gnu.org/licenses/>.  */
+ 
+ 
+ /* This file is used to create a hash table on the host that is supposed
+    to get use on the device - that's for the 'indirect' clause feature.
+ 
+    In order to habe host initialization work, the pointer sizes must be
+    the same - and either the the endianess or the host-device memcopy
+    has to take of it.  */
+ 
+ typedef unsigned __int128 hash_entry_type;
+ #define INDIRECT_HOST_ADDR(p) ((void *) (uintptr_t) p)
+ #define INDIRECT_DEV_ADDR(p) ((void*) (uintptr_t) (p >> 64))
+ #define SET_INDIRECT_ADDRS(p, h, d) \
+   p = (((unsigned __int128) h) + (((unsigned __int128) d) << 64))
+ 
+ _Static_assert (sizeof (unsigned __int128) == 2 * sizeof (void*),
+ 		"hash_entry_type size mismatch");
+ 
+ static inline void *htab_alloc (size_t size) {
+   return malloc (size);
+ }
+ 
+ static inline void htab_free (void *ptr) { free (ptr); }
+ 
+ #include "hashtab.h"
+ 
+ static inline hashval_t
+ htab_hash (hash_entry_type element)
+ {
+   return hash_pointer (INDIRECT_HOST_ADDR (element));
+ }
+ 
+ static inline bool
+ htab_eq (hash_entry_type x, hash_entry_type y)
+ {
+   return INDIRECT_HOST_ADDR (x) == INDIRECT_HOST_ADDR (x);
+ }
+ 
+ void*
+ create_target_indirect_map (size_t *h_size, size_t count,
+ 			    uint64_t *host_addrs, uint64_t *device_addrs)
+ {
+   assert (htab_find);  /* Silence -Werror=unused-function.  */
+ 
+   htab_t indirect_htab = htab_create (count);
+ 
+   hash_entry_type element;
+   for (int i = 0; i < count; i++)
+     {
+       SET_INDIRECT_ADDRS (element, host_addrs[i], device_addrs[i]);
+       hash_entry_type *slot = htab_find_slot (&indirect_htab, element,
+ 					      INSERT);
+       *slot = element;
+     }
+   *h_size = (sizeof (struct htab)
+ 	     + htab_size (indirect_htab) * sizeof (hash_entry_type));
+   return (void*) indirect_htab;
+ }
diff -Nrcpad gcc-16-20250914/libgomp/plugin/plugin-gcn.c gcc-16-20250921/libgomp/plugin/plugin-gcn.c
*** gcc-16-20250914/libgomp/plugin/plugin-gcn.c	Sun Sep 14 22:32:36 2025
--- gcc-16-20250921/libgomp/plugin/plugin-gcn.c	Sun Sep 21 22:33:38 2025
***************
*** 51,56 ****
--- 51,64 ----
  #include "oacc-int.h"
  #include <assert.h>
  
+ /* Create hash-table for declare target's indirect clause on the host;
+    see build-target-indirect-htab.h for details.  */
+ #define USE_HASHTAB_LOOKUP_FOR_INDIRECT
+ #ifdef USE_HASHTAB_LOOKUP_FOR_INDIRECT
+ static void* create_target_indirect_map (size_t *, size_t,
+ 					 uint64_t *, uint64_t *);
+ #endif
+ 
  /* These probably won't be in elf.h for a while.  */
  #ifndef R_AMDGPU_NONE
  #define R_AMDGPU_NONE		0
*************** GOMP_OFFLOAD_load_image (int ord, unsign
*** 3688,3724 ****
  			     (void*) ind_funcs_table_addr,
  			     sizeof (ind_funcs_table));
  
!       /* Build host->target address map for indirect functions.  */
!       uint64_t ind_fn_map[ind_func_count * 2 + 1];
!       for (unsigned i = 0; i < ind_func_count; i++)
! 	{
! 	  ind_fn_map[i * 2] = host_ind_fn_table[i];
! 	  ind_fn_map[i * 2 + 1] = ind_funcs_table[i];
! 	  GCN_DEBUG ("Indirect function %d: %lx->%lx\n",
! 		     i, host_ind_fn_table[i], ind_funcs_table[i]);
! 	}
!       ind_fn_map[ind_func_count * 2] = 0;
! 
!       /* Write the map onto the target.  */
!       void *map_target_addr
! 	= GOMP_OFFLOAD_alloc (agent->device_id, sizeof (ind_fn_map));
!       GCN_DEBUG ("Allocated indirect map at %p\n", map_target_addr);
! 
!       GOMP_OFFLOAD_host2dev (agent->device_id, map_target_addr,
! 			     (void*) ind_fn_map,
! 			     sizeof (ind_fn_map));
  
-       /* Write address of the map onto the target.  */
        hsa_executable_symbol_t symbol;
! 
        status
  	= hsa_fns.hsa_executable_get_symbol_fn (agent->executable, NULL,
! 						XSTRING (GOMP_INDIRECT_ADDR_MAP),
  						agent->id, 0, &symbol);
        if (status != HSA_STATUS_SUCCESS)
  	hsa_fatal ("Could not find GOMP_INDIRECT_ADDR_MAP in code object",
  		   status);
- 
        uint64_t varptr;
        uint32_t varsize;
  
--- 3696,3723 ----
  			     (void*) ind_funcs_table_addr,
  			     sizeof (ind_funcs_table));
  
!       /* For newer binaries, the hash table for 'indirect' is created on the
! 	 host. Older binaries don't have GOMP_INDIRECT_ADDR_HMAP on the
! 	 device side - and have to create the table themselves using
! 	 GOMP_INDIRECT_ADDR_MAP.  */
  
        hsa_executable_symbol_t symbol;
!       bool host_init_htab = true;
!       #ifdef USE_HASHTAB_LOOKUP_FOR_INDIRECT
        status
  	= hsa_fns.hsa_executable_get_symbol_fn (agent->executable, NULL,
! 						XSTRING (GOMP_INDIRECT_ADDR_HMAP),
  						agent->id, 0, &symbol);
        if (status != HSA_STATUS_SUCCESS)
+       #endif
+ 	{
+ 	  host_init_htab = false;
+ 	  status = hsa_fns.hsa_executable_get_symbol_fn (agent->executable, NULL,
+ 		     XSTRING (GOMP_INDIRECT_ADDR_MAP), agent->id, 0, &symbol);
+ 	}
+       if (status != HSA_STATUS_SUCCESS)
  	hsa_fatal ("Could not find GOMP_INDIRECT_ADDR_MAP in code object",
  		   status);
        uint64_t varptr;
        uint32_t varsize;
  
*************** GOMP_OFFLOAD_load_image (int ord, unsign
*** 3734,3742 ****
  	hsa_fatal ("Could not extract a variable size from its symbol",
  		   status);
  
!       GCN_DEBUG ("Found GOMP_INDIRECT_ADDR_MAP at %lx with size %d\n",
! 		 varptr, varsize);
  
        GOMP_OFFLOAD_host2dev (agent->device_id, (void *) varptr,
  			     &map_target_addr,
  			     sizeof (map_target_addr));
--- 3733,3783 ----
  	hsa_fatal ("Could not extract a variable size from its symbol",
  		   status);
  
!       GCN_DEBUG ("Found GOMP_INDIRECT_ADDR_%sMAP at %lx with size %d\n",
! 		 host_init_htab ? "H" : "", varptr, varsize);
  
+       void *map_target_addr;
+       if (!host_init_htab)
+ 	{
+ 	  /* Build host->target address map for indirect functions.  */
+ 	  uint64_t ind_fn_map[ind_func_count * 2 + 1];
+ 	  for (unsigned i = 0; i < ind_func_count; i++)
+ 	    {
+ 	      ind_fn_map[i * 2] = host_ind_fn_table[i];
+ 	      ind_fn_map[i * 2 + 1] = ind_funcs_table[i];
+ 	      GCN_DEBUG ("Indirect function %d: %lx->%lx\n",
+ 			 i, host_ind_fn_table[i], ind_funcs_table[i]);
+ 	    }
+ 	  ind_fn_map[ind_func_count * 2] = 0;
+ 	  /* Write the map onto the target.  */
+ 	  map_target_addr = GOMP_OFFLOAD_alloc (agent->device_id,
+ 						sizeof (ind_fn_map));
+ 	  GOMP_OFFLOAD_host2dev (agent->device_id, map_target_addr,
+ 				 (void*) ind_fn_map, sizeof (ind_fn_map));
+ 	}
+       #ifdef USE_HASHTAB_LOOKUP_FOR_INDIRECT
+       else
+ 	{
+ 	  /* FIXME: Handle multi-kernel load and unload, cf. PR 114690.  */
+ 	  size_t host_map_size;
+ 	  void *host_map;
+ 	  host_map = create_target_indirect_map (&host_map_size, ind_func_count,
+ 						 host_ind_fn_table,
+ 						 ind_funcs_table);
+ 	  for (unsigned i = 0; i < ind_func_count; i++)
+ 	      GCN_DEBUG ("Indirect function %d: %lx->%lx\n",
+ 			 i, host_ind_fn_table[i], ind_funcs_table[i]);
+ 	  /* Write the map onto the target.  */
+ 	  map_target_addr = GOMP_OFFLOAD_alloc (agent->device_id,
+ 						host_map_size);
+ 	  GOMP_OFFLOAD_host2dev (agent->device_id, map_target_addr,
+ 				 host_map, host_map_size);
+ 	}
+       #endif
+ 
+       GCN_DEBUG ("Allocated indirect map at %p\n", map_target_addr);
+ 
+       /* Write address of the map onto the target.  */
        GOMP_OFFLOAD_host2dev (agent->device_id, (void *) varptr,
  			     &map_target_addr,
  			     sizeof (map_target_addr));
*************** GOMP_OFFLOAD_openacc_destroy_thread_data
*** 5247,5250 ****
--- 5288,5295 ----
    free (data);
  }
  
+ #ifdef USE_HASHTAB_LOOKUP_FOR_INDIRECT
+   #include "build-target-indirect-htab.h"
+ #endif
+ 
  /* }}} */
diff -Nrcpad gcc-16-20250914/libgomp/plugin/plugin-nvptx.c gcc-16-20250921/libgomp/plugin/plugin-nvptx.c
*** gcc-16-20250914/libgomp/plugin/plugin-nvptx.c	Sun Sep 14 22:32:36 2025
--- gcc-16-20250921/libgomp/plugin/plugin-nvptx.c	Sun Sep 21 22:33:38 2025
***************
*** 60,65 ****
--- 60,73 ----
  #include <errno.h>
  #include <stdlib.h>
  
+ /* Create hash-table for declare target's indirect clause on the host;
+    see build-target-indirect-htab.h for details.  */
+ #define USE_HASHTAB_LOOKUP_FOR_INDIRECT
+ #ifdef USE_HASHTAB_LOOKUP_FOR_INDIRECT
+ static void* create_target_indirect_map (size_t *, size_t,
+ 					 uint64_t *, uint64_t *);
+ #endif
+ 
  /* An arbitrary fixed limit (128MB) for the size of the OpenMP soft stacks
     block to cache between kernel invocations.  For soft-stacks blocks bigger
     than this, we will free the block before attempting another GPU memory
*************** GOMP_OFFLOAD_load_image (int ord, unsign
*** 1626,1664 ****
        if (r != CUDA_SUCCESS)
  	GOMP_PLUGIN_fatal ("cuMemcpyDtoH error: %s", cuda_error (r));
  
!       /* Build host->target address map for indirect functions.  */
!       uint64_t ind_fn_map[ind_fn_entries * 2 + 1];
!       for (unsigned k = 0; k < ind_fn_entries; k++)
! 	{
! 	  ind_fn_map[k * 2] = host_ind_fn_table[k];
! 	  ind_fn_map[k * 2 + 1] = ind_fn_table[k];
! 	  GOMP_PLUGIN_debug (0, "Indirect function %d: %lx->%lx\n",
! 			     k, host_ind_fn_table[k], ind_fn_table[k]);
! 	}
!       ind_fn_map[ind_fn_entries * 2] = 0;
! 
!       /* Write the map onto the target.  */
!       void *map_target_addr
! 	= GOMP_OFFLOAD_alloc (ord, sizeof (ind_fn_map));
!       GOMP_PLUGIN_debug (0, "Allocated indirect map at %p\n", map_target_addr);
! 
!       GOMP_OFFLOAD_host2dev (ord, map_target_addr,
! 			     (void*) ind_fn_map,
! 			     sizeof (ind_fn_map));
  
-       /* Write address of the map onto the target.  */
        CUdeviceptr varptr;
        size_t varsize;
        r = CUDA_CALL_NOCHECK (cuModuleGetGlobal, &varptr, &varsize,
! 			     module, XSTRING (GOMP_INDIRECT_ADDR_MAP));
        if (r != CUDA_SUCCESS)
  	GOMP_PLUGIN_fatal ("Indirect map variable not found in image: %s",
  			   cuda_error (r));
- 
        GOMP_PLUGIN_debug (0,
! 			 "Indirect map variable found at %llx with size %ld\n",
  			 varptr, varsize);
  
        GOMP_OFFLOAD_host2dev (ord, (void *) varptr, &map_target_addr,
  			     sizeof (map_target_addr));
      }
--- 1634,1704 ----
        if (r != CUDA_SUCCESS)
  	GOMP_PLUGIN_fatal ("cuMemcpyDtoH error: %s", cuda_error (r));
  
!       /* For newer binaries, the hash table for 'indirect' is created on the
! 	 host. Older binaries don't have GOMP_INDIRECT_ADDR_HMAP on the
! 	 device side - and have to create the table themselves using
! 	 GOMP_INDIRECT_ADDR_MAP.  */
  
        CUdeviceptr varptr;
        size_t varsize;
+       bool host_init_htab = true;
+       #ifdef USE_HASHTAB_LOOKUP_FOR_INDIRECT
        r = CUDA_CALL_NOCHECK (cuModuleGetGlobal, &varptr, &varsize,
! 			     module, XSTRING (GOMP_INDIRECT_ADDR_HMAP));
!       if (r != CUDA_SUCCESS)
!       #endif
! 	{
! 	  host_init_htab = false;
! 	  r = CUDA_CALL_NOCHECK (cuModuleGetGlobal, &varptr, &varsize,
! 				 module, XSTRING (GOMP_INDIRECT_ADDR_MAP));
! 	}
        if (r != CUDA_SUCCESS)
  	GOMP_PLUGIN_fatal ("Indirect map variable not found in image: %s",
  			   cuda_error (r));
        GOMP_PLUGIN_debug (0,
! 			 "%s-style indirect map variable found at %llx with "
! 			 "size %ld\n", host_init_htab ? "New" : "Old",
  			 varptr, varsize);
  
+       void *map_target_addr;
+       if (!host_init_htab)
+ 	{
+ 	  /* Build host->target address map for indirect functions.  */
+ 	  uint64_t ind_fn_map[ind_fn_entries * 2 + 1];
+ 	  for (unsigned k = 0; k < ind_fn_entries; k++)
+ 	    {
+ 	      ind_fn_map[k * 2] = host_ind_fn_table[k];
+ 	      ind_fn_map[k * 2 + 1] = ind_fn_table[k];
+ 	      GOMP_PLUGIN_debug (0, "Indirect function %d: %lx->%lx\n",
+ 				 k, host_ind_fn_table[k], ind_fn_table[k]);
+ 	    }
+ 	  ind_fn_map[ind_fn_entries * 2] = 0;
+ 	  /* Write the map onto the target.  */
+ 	  map_target_addr = GOMP_OFFLOAD_alloc (ord, sizeof (ind_fn_map));
+ 	  GOMP_OFFLOAD_host2dev (ord, map_target_addr,
+ 				 (void *) ind_fn_map, sizeof (ind_fn_map));
+ 	}
+       #ifdef USE_HASHTAB_LOOKUP_FOR_INDIRECT
+       else
+ 	{
+ 	  /* FIXME: Handle multi-kernel load and unload, cf. PR 114690.  */
+ 	  size_t host_map_size;
+ 	  void *host_map;
+ 	  host_map = create_target_indirect_map (&host_map_size, ind_fn_entries,
+ 						 host_ind_fn_table,
+ 						 ind_fn_table);
+ 	  for (unsigned k = 0; k < ind_fn_entries; k++)
+ 	    GOMP_PLUGIN_debug (0, "Indirect function %d: %lx->%lx\n",
+ 			       k, host_ind_fn_table[k], ind_fn_table[k]);
+ 	  /* Write the map onto the target.  */
+ 	  map_target_addr = GOMP_OFFLOAD_alloc (ord, host_map_size);
+ 	  GOMP_OFFLOAD_host2dev (ord, map_target_addr, host_map, host_map_size);
+ 	}
+       #endif
+ 
+       GOMP_PLUGIN_debug (0, "Allocated indirect map at %p\n", map_target_addr);
+ 
+       /* Write address of the map onto the target.  */
        GOMP_OFFLOAD_host2dev (ord, (void *) varptr, &map_target_addr,
  			     sizeof (map_target_addr));
      }
*************** GOMP_OFFLOAD_run (int ord, void *tgt_fn,
*** 2898,2900 ****
--- 2938,2944 ----
  }
  
  /* TODO: Implement GOMP_OFFLOAD_async_run. */
+ 
+ #ifdef USE_HASHTAB_LOOKUP_FOR_INDIRECT
+   #include "build-target-indirect-htab.h"
+ #endif
diff -Nrcpad gcc-16-20250914/libgomp/testsuite/libgomp.c-c++-common/declare-variant-1.c gcc-16-20250921/libgomp/testsuite/libgomp.c-c++-common/declare-variant-1.c
*** gcc-16-20250914/libgomp/testsuite/libgomp.c-c++-common/declare-variant-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/libgomp/testsuite/libgomp.c-c++-common/declare-variant-1.c	Sun Sep 21 22:33:39 2025
***************
*** 0 ****
--- 1,40 ----
+ /* { dg-do run } */
+ /* { dg-additional-options "-fdump-tree-gimple" } */
+ 
+ /* PR middle-end/121922  */
+ 
+ /* Failed to re-check the global flag due to tree sharing.  */
+ 
+ extern int flag;
+ int flag = 0;
+ 
+ int
+ test_with_flag ()
+ {
+   return flag;
+ }
+ 
+ #pragma omp declare variant (test_with_flag) match (user={condition(score(10): flag > 1)})
+ int
+ test ()
+ {
+   return 0;
+ }
+ 
+ void
+ doit ()
+ {
+   flag = 0;
+   if (test () != 0) __builtin_abort ();
+   flag = 1;
+   if (test () != 0) __builtin_abort ();
+   flag = 42;
+   if (test () != 42) __builtin_abort ();
+ }
+ 
+ int main ()
+ {
+   doit ();
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "flag\\.\[^=\]*= flag;\[\n\r\]+ *if \\(flag\\.\[^>\]*> 1\\)" 3 "gimple" } } */
diff -Nrcpad gcc-16-20250914/libgomp/testsuite/libgomp.oacc-fortran/pr92970-1.f90 gcc-16-20250921/libgomp/testsuite/libgomp.oacc-fortran/pr92970-1.f90
*** gcc-16-20250914/libgomp/testsuite/libgomp.oacc-fortran/pr92970-1.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/libgomp/testsuite/libgomp.oacc-fortran/pr92970-1.f90	Sun Sep 21 22:33:40 2025
***************
*** 0 ****
--- 1,71 ----
+ ! Verify that 'acc_delete' etc. on non-present data is a no-op.
+ !
+ ! Fortran version to libgomp.oacc-c-c++-common/pr92970-1.c
+ 
+ program main
+ use openacc
+ implicit none (type, external)
+ 
+ integer :: a, b, async
+ 
+ ! Side remark: 'sizeof' is a GNU extension;
+ ! for standard conforming code, use c_sizeof or (in bits) storage_size.
+ 
+ async = 0
+ !$acc exit data copyout (a)
+   call acc_copyout (a, sizeof (a))
+ !$acc exit data copyout (a) async (async)
+   async = async + 1
+   call acc_copyout_async (a, sizeof (a), async)
+   async = async + 1
+ !$acc exit data copyout (a) finalize
+   call acc_copyout_finalize (a, sizeof (a))
+ !$acc exit data copyout (a) finalize async (async)
+   async = async + 1
+   call acc_copyout_finalize_async (a, sizeof (a), async)
+   async = async + 1
+ 
+ !$acc exit data delete (a)
+   call acc_delete (a, sizeof (a))
+ !$acc exit data delete (a) async (async)
+   async = async + 1
+   call acc_delete_async (a, sizeof (a), async)
+   async = async + 1
+ !$acc exit data delete (a) finalize
+   call acc_delete_finalize (a, sizeof (a))
+ !$acc exit data delete (a) finalize async (async)
+   async = async + 1
+   call acc_delete_finalize_async (a, sizeof (a), async)
+   async = async + 1
+ 
+ 
+ ! Same but taking the byte size from the argument
+ 
+ !$acc exit data copyout (b)
+   call acc_copyout (b)
+ !$acc exit data copyout (b) async (async)
+   async = async + 1
+   call acc_copyout_async (b, async)
+   async = async + 1
+ !$acc exit data copyout (b) finalize
+   call acc_copyout_finalize (b)
+ !$acc exit data copyout (b) finalize async (async)
+   async = async + 1
+   call acc_copyout_finalize_async (b, async)
+   async = async + 1
+ 
+ !$acc exit data delete (b)
+   call acc_delete (b)
+ !$acc exit data delete (b) async (async)
+   async = async + 1
+   call acc_delete_async (b, async)
+   async = async + 1
+ !$acc exit data delete (b) finalize
+   call acc_delete_finalize (b)
+ !$acc exit data delete (b) finalize async (async)
+   async = async + 1
+   call acc_delete_finalize_async (b, async)
+   async = async + 1
+ 
+   call acc_wait_all ()
+ end
diff -Nrcpad gcc-16-20250914/libstdc++-v3/ChangeLog gcc-16-20250921/libstdc++-v3/ChangeLog
*** gcc-16-20250914/libstdc++-v3/ChangeLog	Sun Sep 14 22:32:38 2025
--- gcc-16-20250921/libstdc++-v3/ChangeLog	Sun Sep 21 22:33:41 2025
***************
*** 1,3 ****
--- 1,110 ----
+ 2025-09-19  Nathan Myers  <ncm@cantrip.org>
+ 
+ 	PR libstdc++/119744
+ 	* include/bits/version.def: Redefine __cpp_lib_bind_front etc.
+ 	* include/bits/version.h: Ditto.
+ 	* include/std/functional: Add new bind_front etc. overloads
+ 	* testsuite/20_util/function_objects/bind_back/1.cc:
+ 	Check plumbing better
+ 	* testsuite/20_util/function_objects/bind_back/nttp.cc: New test.
+ 	* testsuite/20_util/function_objects/bind_back/nttp_neg.cc: New test.
+ 	* testsuite/20_util/function_objects/bind_front/1.cc:
+ 	Check plumbing better
+ 	* testsuite/20_util/function_objects/bind_front/nttp.cc: New test.
+ 	* testsuite/20_util/function_objects/bind_front/nttp_neg.cc: New test.
+ 	* testsuite/20_util/function_objects/not_fn/nttp.cc: New test.
+ 	* testsuite/20_util/function_objects/not_fn/nttp_neg.cc: New test.
+ 	* testsuite/20_util/headers/functional/synopsis.cc: New decls.
+ 
+ 2025-09-19  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/bits/chrono_io.h: Remove unused <iomanip> header.
+ 	(operator<<): Constrain overload for chrono::local_time.
+ 	* testsuite/std/time/clock/local/io.cc: Check constraints.
+ 
+ 2025-09-19  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/bits/version.def (start_lifetime_as): Move adjacent to
+ 	other C++23 macros.
+ 	* include/bits/version.h: Regenerate.
+ 
+ 2025-09-18  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/106658
+ 	* include/bits/version.def: Implement C++23 P2590R2 - Explicit
+ 	lifetime management.
+ 	(start_lifetime_as): New.
+ 	* include/bits/version.h: Regenerate.
+ 	* include/std/memory (std::start_lifetime_as,
+ 	std::start_lifetime_as_array): New function templates.
+ 	* src/c++23/std.cc.in (std::start_lifetime_as,
+ 	std::start_lifetime_as_array): Export.
+ 	* testsuite/std/memory/start_lifetime_as/start_lifetime_as.cc: New test.
+ 
+ 2025-09-17  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR libstdc++/111861
+ 	* include/bits/ranges_algo.h (ranges::unique_copy): When
+ 	initializing a value type object from *iter, use
+ 	direct-initialization and don't use a deduced type.
+ 	(ranges::push_heap): Use direct-initialization when initializing
+ 	a value type object from ranges::iter_move.
+ 	(ranges::max): As in ranges::unique_copy.
+ 	* include/bits/ranges_util.h (ranges::min): Likewise.
+ 
+ 2025-09-17  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	* testsuite/20_util/bind/dangling_ref.cc: Compile with
+ 	-Wsystem-headers.
+ 	* testsuite/20_util/ratio/operations/ops_overflow_neg.cc: Likewise.
+ 	* testsuite/20_util/unique_ptr/lwg4148.cc: Likewise.
+ 	* testsuite/29_atomics/atomic/operators/pointer_partial_void.cc:
+ 	Likewise.
+ 	* testsuite/30_threads/packaged_task/cons/dangling_ref.cc:
+ 	Likewise.
+ 
+ 2025-09-16  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/std/ranges (__detail::__repeated_tuple): Use
+ 	__make_tuple helper alias directly, instead of doing overload
+ 	resolution on std::tuple_cat.
+ 	* include/std/tuple (__make_tuple_impl): Remove.
+ 	(__do_make_tuple): Replace recursion with _Index_tuple and pack
+ 	expansion.
+ 	(__make_tuple): Adjust to new __do_make_tuple definition.
+ 	(__combine_tuples<tuple<T1s...>, tuple<T2s...>, Rem...>): Replace
+ 	with a partial specialization for exactly two tuples and a
+ 	partial specialization for three or more tuples.
+ 
+ 2025-09-16  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	PR libstdc++/121913
+ 	* include/bits/ranges_algo.h (__rotate_fn::operator()): Use
+ 	auto_value_t<_Iter> instead of deduced type.
+ 
+ 2025-09-16  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	PR libstdc++/121956
+ 	* include/std/ranges (adjacent_view::_Iterator::value_type):
+ 	Always define as std::tuple<T, N>, not std::pair<T, T>.
+ 	* testsuite/std/ranges/adaptors/adjacent/1.cc: Check value type
+ 	of views::pairwise.
+ 
+ 2025-09-16  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/bits/stl_uninitialized.h (uninitialized_move)
+ 	(uninitialized_move_n): Replace _GLIBCXX_MAKE_MOVE_ITERATOR with
+ 	std::make_move_iterator.
+ 
+ 2025-09-16  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	PR libstdc++/119820
+ 	* include/bits/ranges_algo.h (__shuffle_fn): Use
+ 	ranges::distance to get difference type value to add to
+ 	iterator.
+ 	* include/std/format (__formatter_str::_M_format_range):
+ 	Use ranges::next to increment iterator by a size_t value.
+ 
  2025-09-13  Patrick Palka  <ppalka@redhat.com>
  
  	PR libstdc++/121917
diff -Nrcpad gcc-16-20250914/libstdc++-v3/include/bits/chrono_io.h gcc-16-20250921/libstdc++-v3/include/bits/chrono_io.h
*** gcc-16-20250914/libstdc++-v3/include/bits/chrono_io.h	Sun Sep 14 22:32:38 2025
--- gcc-16-20250921/libstdc++-v3/include/bits/chrono_io.h	Sun Sep 21 22:33:42 2025
***************
*** 37,43 ****
  #if __cplusplus >= 202002L
  
  #include <sstream> // ostringstream
- #include <iomanip> // setw, setfill
  #include <format>
  #include <charconv> // from_chars
  #include <stdexcept> // __sso_string
--- 37,42 ----
*************** namespace __detail
*** 4014,4019 ****
--- 4013,4021 ----
      inline basic_ostream<_CharT, _Traits>&
      operator<<(basic_ostream<_CharT, _Traits>& __os,
  	       const local_time<_Duration>& __lt)
+     // _GLIBCXX_RESOLVE_LIB_DEFECTS
+     // 4257. Stream insertion for chrono::local_time should be constrained
+     requires requires(const sys_time<_Duration>& __st) { __os << __st; }
      {
        __os << sys_time<_Duration>{__lt.time_since_epoch()};
        return __os;
diff -Nrcpad gcc-16-20250914/libstdc++-v3/include/bits/ranges_algo.h gcc-16-20250921/libstdc++-v3/include/bits/ranges_algo.h
*** gcc-16-20250914/libstdc++-v3/include/bits/ranges_algo.h	Sun Sep 14 22:32:38 2025
--- gcc-16-20250921/libstdc++-v3/include/bits/ranges_algo.h	Sun Sep 21 22:33:42 2025
*************** namespace ranges
*** 1529,1535 ****
  	  }
  	else // indirectly_copyable_storable<_Iter, _Out>
  	  {
! 	    auto __value = *__first;
  	    *__result = __value;
  	    while (++__first != __last)
  	      {
--- 1529,1535 ----
  	  }
  	else // indirectly_copyable_storable<_Iter, _Out>
  	  {
! 	    iter_value_t<_Iter> __value(*__first);
  	    *__result = __value;
  	    while (++__first != __last)
  	      {
*************** namespace ranges
*** 1685,1691 ****
  			{
  			  auto __mid = ranges::next(__p, __n - 1);
  			  auto __end = ranges::next(__mid);
! 			  auto __t = ranges::iter_move(__p);
  			  ranges::move(ranges::next(__p), __end, __p);
  			  *__mid = std::move(__t);
  			  return {std::move(__ret), std::move(__lasti)};
--- 1685,1691 ----
  			{
  			  auto __mid = ranges::next(__p, __n - 1);
  			  auto __end = ranges::next(__mid);
! 			  iter_value_t<_Iter> __t(ranges::iter_move(__p));
  			  ranges::move(ranges::next(__p), __end, __p);
  			  *__mid = std::move(__t);
  			  return {std::move(__ret), std::move(__lasti)};
*************** namespace ranges
*** 1713,1719 ****
  			{
  			  auto __mid = ranges::next(__p, __n - 1);
  			  auto __end = ranges::next(__mid);
! 			  auto __t = ranges::iter_move(__mid);
  			  ranges::move_backward(__p, __mid, __end);
  			  *__p = std::move(__t);
  			  return {std::move(__ret), std::move(__lasti)};
--- 1713,1719 ----
  			{
  			  auto __mid = ranges::next(__p, __n - 1);
  			  auto __end = ranges::next(__mid);
! 			  iter_value_t<_Iter> __t(ranges::iter_move(__mid));
  			  ranges::move_backward(__p, __mid, __end);
  			  *__p = std::move(__t);
  			  return {std::move(__ret), std::move(__lasti)};
*************** namespace ranges
*** 2028,2034 ****
  		      && !sized_sentinel_for<sentinel_t<_Range>,
  					     iterator_t<_Range>>)
  	  return (*this)(ranges::begin(__r),
! 			 ranges::begin(__r) + ranges::size(__r),
  			 std::forward<_Gen>(__g));
  	else
  	  return (*this)(ranges::begin(__r), ranges::end(__r),
--- 2028,2034 ----
  		      && !sized_sentinel_for<sentinel_t<_Range>,
  					     iterator_t<_Range>>)
  	  return (*this)(ranges::begin(__r),
! 			 ranges::begin(__r) + ranges::distance(__r),
  			 std::forward<_Gen>(__g));
  	else
  	  return (*this)(ranges::begin(__r), ranges::end(__r),
*************** namespace ranges
*** 2075,2083 ****
  	else
  	  {
  	    auto __comp_proj = __detail::__make_comp_proj(__comp, __proj);
  	    __detail::__push_heap(__first, (__last - __first) - 1,
! 				  0, ranges::iter_move(ranges::prev(__last)),
! 				  __comp_proj);
  	    return __last;
  	  }
        }
--- 2075,2083 ----
  	else
  	  {
  	    auto __comp_proj = __detail::__make_comp_proj(__comp, __proj);
+ 	    iter_value_t<_Iter> __value(ranges::iter_move(ranges::prev(__last)));
  	    __detail::__push_heap(__first, (__last - __first) - 1,
! 				  0, std::move(__value), __comp_proj);
  	    return __last;
  	  }
        }
*************** namespace ranges
*** 4219,4225 ****
  	auto __first = ranges::begin(__r);
  	auto __last = ranges::end(__r);
  	__glibcxx_assert(__first != __last);
! 	auto __result = *__first;
  	while (++__first != __last)
  	  {
  	    auto&& __tmp = *__first;
--- 4219,4225 ----
  	auto __first = ranges::begin(__r);
  	auto __last = ranges::end(__r);
  	__glibcxx_assert(__first != __last);
! 	range_value_t<_Range> __result(*__first);
  	while (++__first != __last)
  	  {
  	    auto&& __tmp = *__first;
diff -Nrcpad gcc-16-20250914/libstdc++-v3/include/bits/ranges_util.h gcc-16-20250921/libstdc++-v3/include/bits/ranges_util.h
*** gcc-16-20250914/libstdc++-v3/include/bits/ranges_util.h	Sun Sep 14 22:32:38 2025
--- gcc-16-20250921/libstdc++-v3/include/bits/ranges_util.h	Sun Sep 21 22:33:42 2025
*************** namespace ranges
*** 761,767 ****
  	auto __first = ranges::begin(__r);
  	auto __last = ranges::end(__r);
  	__glibcxx_assert(__first != __last);
! 	auto __result = *__first;
  	while (++__first != __last)
  	  {
  	    auto&& __tmp = *__first;
--- 761,767 ----
  	auto __first = ranges::begin(__r);
  	auto __last = ranges::end(__r);
  	__glibcxx_assert(__first != __last);
! 	range_value_t<_Range> __result(*__first);
  	while (++__first != __last)
  	  {
  	    auto&& __tmp = *__first;
diff -Nrcpad gcc-16-20250914/libstdc++-v3/include/bits/stl_uninitialized.h gcc-16-20250921/libstdc++-v3/include/bits/stl_uninitialized.h
*** gcc-16-20250914/libstdc++-v3/include/bits/stl_uninitialized.h	Sun Sep 14 22:32:38 2025
--- gcc-16-20250921/libstdc++-v3/include/bits/stl_uninitialized.h	Sun Sep 21 22:33:42 2025
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1265,1273 ****
      uninitialized_move(_InputIterator __first, _InputIterator __last,
  		       _ForwardIterator __result)
      {
!       return std::uninitialized_copy
! 	(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
! 	 _GLIBCXX_MAKE_MOVE_ITERATOR(__last), __result);
      }
  
    /**
--- 1265,1273 ----
      uninitialized_move(_InputIterator __first, _InputIterator __last,
  		       _ForwardIterator __result)
      {
!       return std::uninitialized_copy(std::make_move_iterator(__first),
! 				     std::make_move_iterator(__last),
! 				     __result);
      }
  
    /**
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1284,1292 ****
      uninitialized_move_n(_InputIterator __first, _Size __count,
  			 _ForwardIterator __result)
      {
!       auto __res = std::__uninitialized_copy_n_pair
! 	(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
! 	 __count, __result);
        return {__res.first.base(), __res.second};
      }
  #endif // __glibcxx_raw_memory_algorithms
--- 1284,1292 ----
      uninitialized_move_n(_InputIterator __first, _Size __count,
  			 _ForwardIterator __result)
      {
!       auto __res
! 	= std::__uninitialized_copy_n_pair(std::make_move_iterator(__first),
! 					   __count, __result);
        return {__res.first.base(), __res.second};
      }
  #endif // __glibcxx_raw_memory_algorithms
diff -Nrcpad gcc-16-20250914/libstdc++-v3/include/bits/version.def gcc-16-20250921/libstdc++-v3/include/bits/version.def
*** gcc-16-20250914/libstdc++-v3/include/bits/version.def	Sun Sep 14 22:32:38 2025
--- gcc-16-20250921/libstdc++-v3/include/bits/version.def	Sun Sep 21 22:33:42 2025
*************** ftms = {
*** 472,477 ****
--- 472,481 ----
  ftms = {
    name = not_fn;
    values = {
+     v = 202306;
+     cxxmin = 26;
+   };
+   values = {
      v = 201603;
      cxxmin = 17;
    };
*************** ftms = {
*** 803,808 ****
--- 807,816 ----
  ftms = {
    name = bind_front;
    values = {
+     v = 202306;
+     cxxmin = 26;
+   };
+   values = {
      v = 201907;
      cxxmin = 20;
    };
*************** ftms = {
*** 811,816 ****
--- 819,828 ----
  ftms = {
    name = bind_back;
    values = {
+     v = 202306;
+     cxxmin = 26;
+   };
+   values = {
      v = 202202;
      cxxmin = 23;
      extra_cond = "__cpp_explicit_this_parameter";
*************** ftms = {
*** 1860,1865 ****
--- 1872,1885 ----
    };
  };
  
+ ftms = {
+   name = start_lifetime_as;
+   values = {
+     v =  202207;
+     cxxmin = 23;
+   };
+ };
+ 
  ftms = {
    name = string_contains;
    values = {
diff -Nrcpad gcc-16-20250914/libstdc++-v3/include/bits/version.h gcc-16-20250921/libstdc++-v3/include/bits/version.h
*** gcc-16-20250914/libstdc++-v3/include/bits/version.h	Sun Sep 14 22:32:38 2025
--- gcc-16-20250921/libstdc++-v3/include/bits/version.h	Sun Sep 21 22:33:42 2025
***************
*** 521,527 ****
  #undef __glibcxx_want_make_from_tuple
  
  #if !defined(__cpp_lib_not_fn)
! # if (__cplusplus >= 201703L)
  #  define __glibcxx_not_fn 201603L
  #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_not_fn)
  #   define __cpp_lib_not_fn 201603L
--- 521,532 ----
  #undef __glibcxx_want_make_from_tuple
  
  #if !defined(__cpp_lib_not_fn)
! # if (__cplusplus >  202302L)
! #  define __glibcxx_not_fn 202306L
! #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_not_fn)
! #   define __cpp_lib_not_fn 202306L
! #  endif
! # elif (__cplusplus >= 201703L)
  #  define __glibcxx_not_fn 201603L
  #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_not_fn)
  #   define __cpp_lib_not_fn 201603L
***************
*** 895,901 ****
  #undef __glibcxx_want_atomic_value_initialization
  
  #if !defined(__cpp_lib_bind_front)
! # if (__cplusplus >= 202002L)
  #  define __glibcxx_bind_front 201907L
  #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_bind_front)
  #   define __cpp_lib_bind_front 201907L
--- 900,911 ----
  #undef __glibcxx_want_atomic_value_initialization
  
  #if !defined(__cpp_lib_bind_front)
! # if (__cplusplus >  202302L)
! #  define __glibcxx_bind_front 202306L
! #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_bind_front)
! #   define __cpp_lib_bind_front 202306L
! #  endif
! # elif (__cplusplus >= 202002L)
  #  define __glibcxx_bind_front 201907L
  #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_bind_front)
  #   define __cpp_lib_bind_front 201907L
***************
*** 905,911 ****
  #undef __glibcxx_want_bind_front
  
  #if !defined(__cpp_lib_bind_back)
! # if (__cplusplus >= 202100L) && (__cpp_explicit_this_parameter)
  #  define __glibcxx_bind_back 202202L
  #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_bind_back)
  #   define __cpp_lib_bind_back 202202L
--- 915,926 ----
  #undef __glibcxx_want_bind_front
  
  #if !defined(__cpp_lib_bind_back)
! # if (__cplusplus >  202302L)
! #  define __glibcxx_bind_back 202306L
! #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_bind_back)
! #   define __cpp_lib_bind_back 202306L
! #  endif
! # elif (__cplusplus >= 202100L) && (__cpp_explicit_this_parameter)
  #  define __glibcxx_bind_back 202202L
  #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_bind_back)
  #   define __cpp_lib_bind_back 202202L
***************
*** 2078,2083 ****
--- 2093,2108 ----
  #endif /* !defined(__cpp_lib_stacktrace) && defined(__glibcxx_want_stacktrace) */
  #undef __glibcxx_want_stacktrace
  
+ #if !defined(__cpp_lib_start_lifetime_as)
+ # if (__cplusplus >= 202100L)
+ #  define __glibcxx_start_lifetime_as 202207L
+ #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_start_lifetime_as)
+ #   define __cpp_lib_start_lifetime_as 202207L
+ #  endif
+ # endif
+ #endif /* !defined(__cpp_lib_start_lifetime_as) && defined(__glibcxx_want_start_lifetime_as) */
+ #undef __glibcxx_want_start_lifetime_as
+ 
  #if !defined(__cpp_lib_string_contains)
  # if (__cplusplus >= 202100L) && _GLIBCXX_HOSTED
  #  define __glibcxx_string_contains 202011L
diff -Nrcpad gcc-16-20250914/libstdc++-v3/include/std/format gcc-16-20250921/libstdc++-v3/include/std/format
*** gcc-16-20250914/libstdc++-v3/include/std/format	Sun Sep 14 22:32:38 2025
--- gcc-16-20250921/libstdc++-v3/include/std/format	Sun Sep 21 22:33:42 2025
*************** namespace __format
*** 1440,1446 ****
  	      else if constexpr (ranges::random_access_range<_Rg>)
  		{
  		  ranges::iterator_t<_Rg> __first = ranges::begin(__rg);
! 		  ranges::subrange __sub(__first, __first + __w);
  		  return _M_format_escaped(_String(from_range, __sub), __fc);
  		}
  	      else if (__w <= __n)
--- 1440,1446 ----
  	      else if constexpr (ranges::random_access_range<_Rg>)
  		{
  		  ranges::iterator_t<_Rg> __first = ranges::begin(__rg);
! 		  ranges::subrange __sub(__first, ranges::next(__first, __w));
  		  return _M_format_escaped(_String(from_range, __sub), __fc);
  		}
  	      else if (__w <= __n)
diff -Nrcpad gcc-16-20250914/libstdc++-v3/include/std/functional gcc-16-20250921/libstdc++-v3/include/std/functional
*** gcc-16-20250914/libstdc++-v3/include/std/functional	Sun Sep 14 22:32:38 2025
--- gcc-16-20250921/libstdc++-v3/include/std/functional	Sun Sep 21 22:33:42 2025
***************
*** 68,74 ****
  #include <bits/version.h>
  
  #include <tuple>
- #include <type_traits>
  #include <bits/functional_hash.h>
  #include <bits/invoke.h>
  #include <bits/refwrap.h>	// std::reference_wrapper and _Mem_fn_traits
--- 68,73 ----
***************
*** 88,94 ****
  # 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
  
--- 87,94 ----
  # 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
  
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 922,927 ****
--- 922,941 ----
  					  std::forward<_BoundArgs>(__args)...);
      }
  
+ #if __cpp_lib_bind_front >= 202306L || __cpp_lib_bind_back >= 202306L
+   template <auto __fn>
+     struct _Bind_fn_t
+     {
+       using _Fn = const decltype(__fn)&;
+       template <typename... _Args>
+ 	constexpr static decltype(auto)
+ 	operator()(_Args... __args)
+ 	  noexcept(is_nothrow_invocable_v<_Fn, _Args...>)
+ 	  requires is_invocable_v<_Fn, _Args...>
+ 	{ return std::invoke(__fn, std::forward<_Args>(__args)...); }
+     };
+ #endif
+ 
  #ifdef __cpp_lib_bind_front // C++ >= 20
    /** Create call wrapper by partial application of arguments to function.
     *
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 941,946 ****
--- 955,1004 ----
        return _Bind_front_t<_Fn, _Args...>(0, std::forward<_Fn>(__fn),
  					  std::forward<_Args>(__args)...);
      }
+ 
+ #if __cpp_lib_bind_front >= 202306L
+ 
+   /** Create call wrapper by partial application of arguments to function.
+    *
+    * The result of `std::bind_front<fn>(bind_args...)` is a function object
+    * that stores the bound arguments, `bind_args...`. When that function
+    * object is invoked with `call_args...` it returns the result of calling
+    * `fn(bind_args..., call_args...)`.
+    *
+    *  @since C++26
+    */
+   template<auto __fn, typename... _BindArgs>
+     constexpr decltype(auto)
+     bind_front(_BindArgs&&... __bind_args)
+       noexcept(__and_v<is_nothrow_constructible<_BindArgs>...>)
+     {
+       using _Fn = decltype(__fn);
+       static_assert(
+ 	(is_constructible_v<decay_t<_BindArgs>, _BindArgs> && ...) &&
+ 	(is_move_constructible_v<decay_t<_BindArgs>> && ...));
+       if constexpr (is_pointer_v<_Fn> || is_member_pointer_v<_Fn>)
+ 	static_assert(__fn != nullptr);
+ 
+       if constexpr (sizeof...(_BindArgs) == 0)
+ 	return _Bind_fn_t<__fn>{};
+       else {
+ 	return [... __bound_args(std::forward<_BindArgs>(__bind_args))]
+ 	  <typename _Self, typename... _CallArgs>
+ 	  (this _Self&&, _CallArgs&&... __call_args)
+ 	    noexcept(is_nothrow_invocable_v<
+ 	      const _Fn&, __like_t<_Self, decay_t<_BindArgs>>..., _CallArgs...>)
+ 	    -> decltype(auto)
+ 	    requires is_invocable_v<
+ 	      const _Fn&, __like_t<_Self, decay_t<_BindArgs>>..., _CallArgs...>
+ 	  {
+ 	    return std::invoke(__fn,
+ 	      std::forward_like<_Self>(__bound_args)...,
+ 	      std::forward<_CallArgs>(__call_args)...);
+ 	  };
+       }
+     }
+ 
+ #endif // __cpp_lib_bind_front  // C++26
  #endif // __cpp_lib_bind_front
  
  #ifdef __cpp_lib_bind_back // C++ >= 23
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 962,967 ****
--- 1020,1071 ----
        return _Bind_back_t<_Fn, _Args...>(0, std::forward<_Fn>(__fn),
  					 std::forward<_Args>(__args)...);
      }
+ 
+ #if __cpp_lib_bind_back >= 202306L
+ 
+   /** Create call wrapper by partial application of arguments to function.
+    *
+    * The result of `std::bind_back<fn>(bind_args...)` is a function object
+    * that stores the arguments, `bind_args...`. When that function object
+    * is invoked with `call_args...` it returns the result of calling
+    * `fn(call_args..., bind_args...)`.
+    *
+    *  @since C++26
+    */
+   template<auto __fn, typename... _BindArgs>
+     constexpr decltype(auto)
+     bind_back(_BindArgs&&... __bind_args)
+       noexcept(__and_v<is_nothrow_constructible<_BindArgs>...>)
+     {
+       using _Fn = decltype(__fn);
+       static_assert(
+ 	(is_constructible_v<decay_t<_BindArgs>, _BindArgs> && ...) &&
+ 	(is_move_constructible_v<decay_t<_BindArgs>> && ...));
+       if constexpr (is_pointer_v<_Fn> || is_member_pointer_v<_Fn>)
+ 	static_assert(__fn != nullptr);
+ 
+       if constexpr (sizeof...(_BindArgs) == 0)
+ 	return _Bind_fn_t<__fn>{};
+       else
+       {
+ 	// Capture arguments in a lambda and return that.
+ 	return [... __bound_args(std::forward<_BindArgs>(__bind_args))]
+ 	  <typename _Self, typename... _CallArgs>
+ 	  (this _Self&&, _CallArgs&&... __call_args)
+ 	    noexcept(is_nothrow_invocable_v<
+ 	      const _Fn&, _CallArgs..., __like_t<_Self, decay_t<_BindArgs>>...>)
+ 	    -> decltype(auto)
+ 	    requires is_invocable_v<
+ 	      const _Fn&, _CallArgs..., __like_t<_Self, decay_t<_BindArgs>>...>
+ 	  {
+ 	    return std::invoke(__fn,
+ 	      std::forward<_CallArgs>(__call_args)...,
+ 	      std::forward_like<_Self>(__bound_args)...);
+ 	  };
+       }
+     }
+ 
+ #endif // __cpp_lib_bind_back  // C++26, nttp
  #endif // __cpp_lib_bind_back
  
  #if __cplusplus >= 201402L
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1062,1068 ****
      {
        return _Not_fn<std::decay_t<_Fn>>{std::forward<_Fn>(__fn), 0};
      }
! #endif
  
  #if __cplusplus >= 201703L
    // Searchers
--- 1166,1204 ----
      {
        return _Not_fn<std::decay_t<_Fn>>{std::forward<_Fn>(__fn), 0};
      }
! 
! #if __cpp_lib_not_fn >= 202306L
! 
!   /** Wrap a function type to create a function object that negates its result.
!    *
!    * The function template `std::not_fn` creates a "forwarding call wrapper",
!    * which is a function object that when called forwards its arguments to
!    * its invocable template argument.
!    *
!    * The result of invoking the wrapper is the negation (using `!`) of
!    * the wrapped function object.
!    *
!    *  @ingroup functors
!    *  @since C++26
!    */
!   template<auto __fn>
!     constexpr decltype(auto)
!     not_fn() noexcept
!     {
!       using _Fn = decltype(__fn);
!       if constexpr (is_pointer_v<_Fn> || is_member_pointer_v<_Fn>)
! 	static_assert(__fn != nullptr);
!       return []<typename... _Args>(_Args... __args) static
! 	  noexcept(noexcept(
! 	    !std::invoke(__fn, std::forward<_Args>(__args)...) ))
! 	  -> decltype(auto)
! 	  requires requires {
! 	    !std::invoke(__fn, std::forward<_Args>(__args)...); }
! 	{ return !std::invoke(__fn, std::forward<_Args>(__args)...); };
!     };
! 
! #endif // __cpp_lib_not_fn >= 202306L
! #endif // __cpp_lib_not_fn
  
  #if __cplusplus >= 201703L
    // Searchers
diff -Nrcpad gcc-16-20250914/libstdc++-v3/include/std/memory gcc-16-20250921/libstdc++-v3/include/std/memory
*** gcc-16-20250914/libstdc++-v3/include/std/memory	Sun Sep 14 22:32:39 2025
--- gcc-16-20250921/libstdc++-v3/include/std/memory	Sun Sep 21 22:33:42 2025
***************
*** 120,125 ****
--- 120,126 ----
  #define __glibcxx_want_shared_ptr_arrays
  #define __glibcxx_want_shared_ptr_weak_type
  #define __glibcxx_want_smart_ptr_for_overwrite
+ #define __glibcxx_want_start_lifetime_as
  #define __glibcxx_want_to_address
  #define __glibcxx_want_transparent_operators
  #define __glibcxx_want_smart_ptr_owner_equality
*************** _GLIBCXX_END_NAMESPACE_VERSION
*** 172,177 ****
--- 173,306 ----
  } // namespace
  #endif // C++11 to C++20
  
+ #if __cpp_lib_start_lifetime_as >= 202207L // C++ >= 23
+ namespace std _GLIBCXX_VISIBILITY(default)
+ {
+ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+   template<typename _Tp>
+     [[__gnu__::__always_inline__]]
+     inline _Tp*
+     start_lifetime_as(void* __p) noexcept
+     {
+ #if __cpp_lib_is_implicit_lifetime >= 202302L
+       static_assert(is_implicit_lifetime_v<_Tp>);
+ #endif
+       auto __q = reinterpret_cast<_Tp*>(__p);
+       __asm__ __volatile__("" : "=g" (__q), "=m" (*__q)
+ 			   : "0" (__q), "m" (*__q));
+       return __q;
+     }
+ 
+   template<typename _Tp>
+     [[__gnu__::__always_inline__]]
+     inline const _Tp*
+     start_lifetime_as(const void* __p) noexcept
+     {
+ #if __cpp_lib_is_implicit_lifetime >= 202302L
+       static_assert(is_implicit_lifetime_v<_Tp>);
+ #endif
+       auto __q = reinterpret_cast<const _Tp*>(__p);
+       auto __r = reinterpret_cast<_Tp*>(const_cast<void*>(__p));
+       __asm__ __volatile__("" : "=g" (__q), "=m" (*__r)
+ 			   : "0" (__q), "m" (*__q));
+       return __q;
+     }
+ 
+   template<typename _Tp>
+     [[__gnu__::__always_inline__]]
+     inline volatile _Tp*
+     start_lifetime_as(volatile void* __p) noexcept
+     {
+ #if __cpp_lib_is_implicit_lifetime >= 202302L
+       static_assert(is_implicit_lifetime_v<_Tp>);
+ #endif
+       auto __q = reinterpret_cast<volatile _Tp*>(__p);
+       auto __r = reinterpret_cast<_Tp*>(const_cast<void*>(__p));
+       __asm__ __volatile__("" : "=g" (__q), "=m" (*__r)
+ 			   : "0" (__q), "m" (*__q));
+       return __q;
+     }
+ 
+   template<typename _Tp>
+     [[__gnu__::__always_inline__]]
+     inline const volatile _Tp*
+     start_lifetime_as(const volatile void* __p) noexcept
+     {
+ #if __cpp_lib_is_implicit_lifetime >= 202302L
+       static_assert(is_implicit_lifetime_v<_Tp>);
+ #endif
+       auto __q = reinterpret_cast<const volatile _Tp*>(__p);
+       auto __r = reinterpret_cast<_Tp*>(const_cast<void*>(__p));
+       __asm__ __volatile__("" : "=g" (__q), "=m" (*__r)
+ 			   : "0" (__q), "m" (*__q));
+       return __q;
+     }
+ 
+   template<typename _Tp>
+     [[__gnu__::__always_inline__]]
+     inline _Tp*
+     start_lifetime_as_array(void* __p, size_t __n) noexcept
+     {
+       auto __q = reinterpret_cast<_Tp*>(__p);
+       if (!__n)
+ 	return __q;
+       auto __r = (__extension__ reinterpret_cast<_Tp(*)[__n]>(__p));
+       __asm__ __volatile__("" : "=g" (__q), "=m" (*__r)
+ 			   : "0" (__q), "m" (*__r));
+       return __q;
+     }
+ 
+   template<typename _Tp>
+     [[__gnu__::__always_inline__]]
+     inline const _Tp*
+     start_lifetime_as_array(const void* __p, size_t __n) noexcept
+     {
+       auto __q = reinterpret_cast<const _Tp*>(__p);
+       if (!__n)
+ 	return __q;
+       auto __r = (__extension__ reinterpret_cast<const _Tp(*)[__n]>(__p));
+       auto __s = (__extension__
+ 		  reinterpret_cast<_Tp(*)[__n]>(const_cast<void*>(__p)));
+       __asm__ __volatile__("" : "=g" (__q), "=m" (*__s)
+ 			   : "0" (__q), "m" (*__r));
+       return __q;
+     }
+ 
+   template<typename _Tp>
+     [[__gnu__::__always_inline__]]
+     inline volatile _Tp*
+     start_lifetime_as_array(volatile void* __p, size_t __n) noexcept
+     {
+       auto __q = reinterpret_cast<volatile _Tp*>(__p);
+       if (!__n)
+ 	return __q;
+       auto __r = (__extension__ reinterpret_cast<volatile _Tp(*)[__n]>(__p));
+       auto __s = (__extension__
+ 		  reinterpret_cast<_Tp(*)[__n]>(const_cast<void*>(__p)));
+       __asm__ __volatile__("" : "=g" (__q), "=m" (*__s)
+ 			   : "0" (__q), "m" (*__r));
+       return __q;
+     }
+ 
+   template<typename _Tp>
+     [[__gnu__::__always_inline__]]
+     inline const volatile _Tp*
+     start_lifetime_as_array(const volatile void* __p, size_t __n) noexcept
+     {
+       auto __q = reinterpret_cast<const volatile _Tp*>(__p);
+       if (!__n)
+ 	return __q;
+       auto __r = (__extension__ reinterpret_cast<const volatile _Tp(*)[__n]>(__p));
+       auto __s = (__extension__
+ 		  reinterpret_cast<_Tp(*)[__n]>(const_cast<void*>(__p)));
+       __asm__ __volatile__("" : "=g" (__q), "=m" (*__s)
+ 			   : "0" (__q), "m" (*__r));
+       return __q;
+     }
+ _GLIBCXX_END_NAMESPACE_VERSION
+ } // namespace
+ #endif
+ 
  #ifdef __cpp_lib_parallel_algorithm // C++ >= 17 && HOSTED
  // Parallel STL algorithms
  # if _PSTL_EXECUTION_POLICIES_DEFINED
diff -Nrcpad gcc-16-20250914/libstdc++-v3/include/std/ranges gcc-16-20250921/libstdc++-v3/include/std/ranges
*** gcc-16-20250914/libstdc++-v3/include/std/ranges	Sun Sep 14 22:32:39 2025
--- gcc-16-20250921/libstdc++-v3/include/std/ranges	Sun Sep 21 22:33:42 2025
*************** namespace views::__adaptor
*** 5383,5389 ****
    {
      // Yields tuple<_Tp, ..., _Tp> with _Nm elements.
      template<typename _Tp, size_t _Nm>
!       using __repeated_tuple = decltype(std::tuple_cat(std::declval<array<_Tp, _Nm>>()));
  
      // For a functor F that is callable with N arguments, the expression
      // declval<__unarize<F, N>>(x) is equivalent to declval<F>(x, ..., x).
--- 5383,5389 ----
    {
      // Yields tuple<_Tp, ..., _Tp> with _Nm elements.
      template<typename _Tp, size_t _Nm>
!       using __repeated_tuple = typename __make_tuple<array<_Tp, _Nm>>::__type;
  
      // For a functor F that is callable with N arguments, the expression
      // declval<__unarize<F, N>>(x) is equivalent to declval<F>(x, ..., x).
*************** namespace views::__adaptor
*** 5460,5468 ****
    public:
      using iterator_category = input_iterator_tag;
      using iterator_concept = decltype(_S_iter_concept());
!     using value_type = conditional_t<_Nm == 2,
! 				     pair<range_value_t<_Base>, range_value_t<_Base>>,
! 				     __detail::__repeated_tuple<range_value_t<_Base>, _Nm>>;
      using difference_type = range_difference_t<_Base>;
  
      _Iterator() = default;
--- 5460,5466 ----
    public:
      using iterator_category = input_iterator_tag;
      using iterator_concept = decltype(_S_iter_concept());
!     using value_type = __detail::__repeated_tuple<range_value_t<_Base>, _Nm>;
      using difference_type = range_difference_t<_Base>;
  
      _Iterator() = default;
diff -Nrcpad gcc-16-20250914/libstdc++-v3/include/std/tuple gcc-16-20250921/libstdc++-v3/include/std/tuple
*** gcc-16-20250914/libstdc++-v3/include/std/tuple	Sun Sep 14 22:32:39 2025
--- gcc-16-20250921/libstdc++-v3/include/std/tuple	Sun Sep 21 22:33:42 2025
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 2681,2734 ****
      { return tuple<_Elements&&...>(std::forward<_Elements>(__args)...); }
  
    /// @cond undocumented
!   template<size_t, typename, typename, size_t>
!     struct __make_tuple_impl;
! 
!   template<size_t _Idx, typename _Tuple, typename... _Tp, size_t _Nm>
!     struct __make_tuple_impl<_Idx, tuple<_Tp...>, _Tuple, _Nm>
!     : __make_tuple_impl<_Idx + 1,
! 			tuple<_Tp..., __tuple_element_t<_Idx, _Tuple>>,
! 			_Tuple, _Nm>
!     { };
  
!   template<size_t _Nm, typename _Tuple, typename... _Tp>
!     struct __make_tuple_impl<_Nm, tuple<_Tp...>, _Tuple, _Nm>
      {
!       typedef tuple<_Tp...> __type;
      };
  
-   template<typename _Tuple>
-     struct __do_make_tuple
-     : __make_tuple_impl<0, tuple<>, _Tuple, tuple_size<_Tuple>::value>
-     { };
- 
    // Returns the std::tuple equivalent of a tuple-like type.
!   template<typename _Tuple>
      struct __make_tuple
!     : public __do_make_tuple<__remove_cvref_t<_Tuple>>
      { };
  
!   // Combines several std::tuple's into a single one.
    template<typename...>
      struct __combine_tuples;
  
    template<>
      struct __combine_tuples<>
      {
!       typedef tuple<> __type;
      };
  
    template<typename... _Ts>
      struct __combine_tuples<tuple<_Ts...>>
      {
!       typedef tuple<_Ts...> __type;
      };
  
!   template<typename... _T1s, typename... _T2s, typename... _Rem>
!     struct __combine_tuples<tuple<_T1s...>, tuple<_T2s...>, _Rem...>
      {
!       typedef typename __combine_tuples<tuple<_T1s..., _T2s...>,
! 					_Rem...>::__type __type;
      };
  
    // Computes the result type of tuple_cat given a set of tuple-like types.
--- 2681,2733 ----
      { return tuple<_Elements&&...>(std::forward<_Elements>(__args)...); }
  
    /// @cond undocumented
!   template<typename _Tuple, typename _Idx_tuple>
!     struct __do_make_tuple;
  
!   template<typename _Tuple, size_t... _Idx>
!     struct __do_make_tuple<_Tuple, _Index_tuple<_Idx...>>
      {
!       using __type = tuple<__tuple_element_t<_Idx, _Tuple>...>;
      };
  
    // Returns the std::tuple equivalent of a tuple-like type.
!   template<typename _Tuple,
! 	   typename _Tup = __remove_cvref_t<_Tuple>,
! 	   typename _Indices = _Build_index_tuple<tuple_size<_Tup>::value>>
      struct __make_tuple
!     : __do_make_tuple<_Tup, typename _Indices::__type>
      { };
  
!   // Combines several std::tuple types into a single one.
    template<typename...>
      struct __combine_tuples;
  
    template<>
      struct __combine_tuples<>
      {
!       using __type = tuple<>;
      };
  
    template<typename... _Ts>
      struct __combine_tuples<tuple<_Ts...>>
      {
!       using __type = tuple<_Ts...>;
      };
  
!   template<typename... _T1s, typename... _T2s>
!     struct __combine_tuples<tuple<_T1s...>, tuple<_T2s...>>
      {
!       using __type = tuple<_T1s..., _T2s...>;
!     };
! 
!   template<typename... _T1s, typename... _T2s, typename... _T3s,
! 	   typename... _Rem>
!     struct __combine_tuples<tuple<_T1s...>, tuple<_T2s...>, tuple<_T3s...>,
! 			    _Rem...>
!     {
!       using _First = tuple<_T1s..., _T2s..., _T3s...>;
!       using _Second = typename __combine_tuples<_Rem...>::__type;
!       using __type = typename __combine_tuples<_First, _Second>::__type;
      };
  
    // Computes the result type of tuple_cat given a set of tuple-like types.
diff -Nrcpad gcc-16-20250914/libstdc++-v3/src/c++23/std.cc.in gcc-16-20250921/libstdc++-v3/src/c++23/std.cc.in
*** gcc-16-20250914/libstdc++-v3/src/c++23/std.cc.in	Sun Sep 14 22:32:39 2025
--- gcc-16-20250921/libstdc++-v3/src/c++23/std.cc.in	Sun Sep 21 22:33:42 2025
*************** export namespace std
*** 2004,2009 ****
--- 2004,2013 ----
    using std::owner_equal;
    using std::owner_hash;
  #endif
+ #if __cpp_lib_start_lifetime_as
+   using std::start_lifetime_as;
+   using std::start_lifetime_as_array;
+ #endif
  }
  
  // 20.4 <memory_resource>
diff -Nrcpad gcc-16-20250914/libstdc++-v3/testsuite/20_util/bind/dangling_ref.cc gcc-16-20250921/libstdc++-v3/testsuite/20_util/bind/dangling_ref.cc
*** gcc-16-20250914/libstdc++-v3/testsuite/20_util/bind/dangling_ref.cc	Sun Sep 14 22:32:39 2025
--- gcc-16-20250921/libstdc++-v3/testsuite/20_util/bind/dangling_ref.cc	Sun Sep 21 22:33:43 2025
***************
*** 1,4 ****
--- 1,5 ----
  // { dg-do compile { target c++11 } }
+ // { dg-additional-options "-Wsystem-headers" }
  #include <functional>
  
  int f();
diff -Nrcpad gcc-16-20250914/libstdc++-v3/testsuite/20_util/function_objects/bind_back/1.cc gcc-16-20250921/libstdc++-v3/testsuite/20_util/function_objects/bind_back/1.cc
*** gcc-16-20250914/libstdc++-v3/testsuite/20_util/function_objects/bind_back/1.cc	Sun Sep 14 22:32:39 2025
--- gcc-16-20250921/libstdc++-v3/testsuite/20_util/function_objects/bind_back/1.cc	Sun Sep 21 22:33:43 2025
*************** test03()
*** 266,287 ****
    static_assert(is_invocable_r_v<void*, const G4&&>);
  }
  
! constexpr int f(int i, int j, int k) { return i + 2*(j + k); }
  
  constexpr bool
  test04()
  {
    auto g = bind_back(f);
!   VERIFY( g(1, 2, 3) == 1 + 2*(2 + 3) );
    auto g1 = bind_back(f, 1);
!   VERIFY( g1(2, 3) == 2 + 2*(3 + 1) );
!   VERIFY( bind_back(g, 1)(2, 3) == 2 + 2*(3 + 1) );
    auto g2 = bind_back(f, 1, 2);
!   VERIFY( g2(3) == 3 + 2*(1 + 2) );
!   VERIFY( bind_back(g1, 2)(3) == 3 + 2*(2 + 1) );
    auto g3 = bind_back(f, 1, 2, 3);
!   VERIFY( g3() == 1 + 2*(2 + 3) );
!   VERIFY( bind_back(g2, 3)() == 3 + 2*(1 + 2) );
    return true;
  }
  
--- 266,287 ----
    static_assert(is_invocable_r_v<void*, const G4&&>);
  }
  
! constexpr int f(int i, int j, int k) { return i + 2*j + 3*k; }
  
  constexpr bool
  test04()
  {
    auto g = bind_back(f);
!   VERIFY( g(1, 2, 3) == 1 + 2*2 + 3*3 );
    auto g1 = bind_back(f, 1);
!   VERIFY( g1(2, 3) == 3*1 + 2 + 3*2);
!   VERIFY( bind_back(g, 1)(2, 3) == 3*1 + 2 + 2*3 );
    auto g2 = bind_back(f, 1, 2);
!   VERIFY( g2(3) == 3 + 2*1 + 3*2);
!   VERIFY( bind_back(g1, 2)(3) == 3*1 + 2*2 + 3  );
    auto g3 = bind_back(f, 1, 2, 3);
!   VERIFY( g3() == 1 + 2*2 + 3*3 );
!   VERIFY( bind_back(g2, 3)() == 3*1 + 1*2 + 2*3);
    return true;
  }
  
diff -Nrcpad gcc-16-20250914/libstdc++-v3/testsuite/20_util/function_objects/bind_back/nttp.cc gcc-16-20250921/libstdc++-v3/testsuite/20_util/function_objects/bind_back/nttp.cc
*** gcc-16-20250914/libstdc++-v3/testsuite/20_util/function_objects/bind_back/nttp.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/libstdc++-v3/testsuite/20_util/function_objects/bind_back/nttp.cc	Sun Sep 21 22:33:43 2025
***************
*** 0 ****
--- 1,258 ----
+ // { dg-do run { target c++26 } }
+ // { dg-add-options no_pch }
+ 
+ // Test NTTP bind_back<f>(Args...), P2714
+ 
+ #include <functional>
+ 
+ #ifndef __cpp_lib_bind_back
+ # error "Feature test macro for bind_back is missing in <functional>"
+ #elif __cpp_lib_bind_back < 202306L
+ # error "Feature test macro for bind_back has wrong value in <functional>"
+ #endif
+ 
+ #include <testsuite_hooks.h>
+ 
+ using std::bind_back;
+ using std::is_same_v;
+ using std::is_invocable_v;
+ using std::is_invocable_r_v;
+ 
+ void
+ test01()
+ {
+   struct F { void operator()(int) {} };
+   constexpr F f{};
+ 
+   // Reference wrappers should be handled:
+   static_assert(!std::is_same_v<
+       decltype(bind_back<f>(std::declval<int&>())),
+       decltype(bind_back<f>(std::ref(std::declval<int&>())))
+       >);
+   static_assert(!std::is_same_v<
+       decltype(bind_back<f>(std::declval<const int&>())),
+       decltype(bind_back<f>(std::cref(std::declval<int&>())))
+       >);
+   static_assert(!std::is_same_v<
+       decltype(bind_back<f>(std::ref(std::declval<int&>()))),
+       decltype(bind_back<f>(std::cref(std::declval<int&>())))
+       >);
+ }
+ 
+ void
+ test02()
+ {
+   struct quals
+   {
+     bool as_const;
+     bool as_lvalue;
+   };
+ 
+   struct F
+   {
+     quals operator()(int, int) & { return { false, true }; }
+     quals operator()(int, int) const & { return { true, true }; }
+     quals operator()(int, int) && { return { false, false }; }
+     quals operator()(int, int) const && { return { true, false }; }
+   };
+ 
+   // Constness and value category forwarded to the target object?
+   { // no bound args
+     constexpr F f;
+     auto g = bind_back<f>();
+     const auto& cg = g;
+     quals q;
+ 
+     q = g(0,0);
+     VERIFY( q.as_const && q.as_lvalue );
+     q = std::move(g)(0,0);
+     VERIFY( q.as_const && q.as_lvalue );
+     q = cg(0,0);
+     VERIFY( q.as_const && q.as_lvalue );
+     q = std::move(cg)(0,0);
+     VERIFY( q.as_const && q.as_lvalue );
+   }
+   { // one bound arg
+     constexpr F f;
+     auto g = bind_back<f>(0);
+     const auto& cg = g;
+     quals q;
+ 
+     q = g(0);
+     VERIFY( q.as_const && q.as_lvalue );
+     q = std::move(g)(0);
+     VERIFY( q.as_const && q.as_lvalue );
+     q = cg(0);
+     VERIFY( q.as_const && q.as_lvalue );
+     q = std::move(cg)(0);
+     VERIFY( q.as_const && q.as_lvalue );
+   }
+   { // two bound args, the general case
+     constexpr F f;
+     auto g = bind_back<f>(0,0);
+     const auto& cg = g;
+     quals q;
+ 
+     q = g();
+     VERIFY( q.as_const && q.as_lvalue );
+     q = std::move(g)();
+     VERIFY( q.as_const && q.as_lvalue );
+     q = cg();
+     VERIFY( q.as_const && q.as_lvalue );
+     q = std::move(cg)();
+     VERIFY( q.as_const && q.as_lvalue );
+   }
+ }
+ 
+ void
+ test02a()
+ {
+   struct quals
+   {
+     bool as_const;
+     bool as_lvalue;
+   };
+   struct F
+   {
+     quals operator()(int, int&) const { return { false, true }; }
+     quals operator()(int, int const&) const { return { true, true }; }
+     quals operator()(int, int&&) const { return { false, false }; }
+     quals operator()(int, int const&&) const  { return { true, false }; }
+   };
+   constexpr F f{};
+ 
+   // verify propagation
+   auto h = bind_back<f>(10);
+   auto const& ch = h;
+   quals q;
+ 
+   q = h(0);
+   VERIFY( !q.as_const && q.as_lvalue );
+   q = ch(0);
+   VERIFY( q.as_const && q.as_lvalue );
+   q = std::move(h)(0);
+   VERIFY( !q.as_const && !q.as_lvalue );
+   q = std::move(ch)(0);
+   VERIFY( q.as_const && !q.as_lvalue );
+ }
+ 
+ void
+ test03()
+ {
+   struct F
+   {
+     int& operator()(void*, int& i) { return i; }
+     void* operator()(void* p, int) const { return p; }
+   };
+ 
+   int i = 5;
+   void* vp = &vp; // arbitrary void* value
+   constexpr F f;
+ 
+   // Bound arg always forwarded as const int& so can only call second overload:
+ 
+   auto g0 = bind_back<f>(); // call wrapper has no bound arg
+   using G0 = decltype(g0);
+   static_assert(is_invocable_r_v<void*, G0&, void*, int>);
+   static_assert(is_invocable_r_v<void*, G0&, void*, int&>);
+   static_assert(is_invocable_r_v<void*, G0&, void*, const int&>);
+   static_assert(is_invocable_r_v<void*, const G0&, void*, int>);
+   static_assert(is_invocable_r_v<void*, G0&&, void*, int>);
+   void* p0 = static_cast<G0&&>(g0)(vp, i);
+   VERIFY( p0 == vp );
+ 
+   auto g1 = bind_back<f>(i); // call wrapper has bound arg of type int
+   using G1 = decltype(g1);
+   static_assert(!is_invocable_r_v<int&, G1&, void*>);
+   static_assert(is_invocable_r_v<void*, const G1&, void*>);
+   static_assert(is_invocable_r_v<void*, G1&&, void*>);
+   void* p1 = static_cast<G1&&>(g1)(vp);
+   VERIFY( p1 == vp );
+ 
+   auto g2 = bind_back<f>(std::ref(i)); // bound arg of type int&
+   using G2 = decltype(g2);
+   static_assert(is_invocable_r_v<void*, G2&, void*>);
+   static_assert(is_invocable_r_v<void*, G2&&, void*>);
+   static_assert(is_invocable_r_v<void*, const G2&, void*>);
+   static_assert(is_invocable_r_v<void*, const G2&&, void*>);
+   void* p2 = g2(vp);
+   VERIFY( p2 == vp );
+   p2 = static_cast<G2&&>(g2)(vp);
+   VERIFY( p2 == vp );
+   p2 = const_cast<const G2&>(g2)(vp);
+   VERIFY( p2 == vp );
+ 
+   auto g3 = bind_back<f>(std::cref(i)); // bound arg of type const int&
+   using G3 = decltype(g3);
+   static_assert(is_invocable_r_v<void*, G3&, void*>);
+   static_assert(is_invocable_r_v<void*, G3&&, void*>);
+   static_assert(is_invocable_r_v<void*, const G3&, void*>);
+   static_assert(is_invocable_r_v<void*, const G3&&, void*>);
+ }
+ 
+ void test03a()
+ {
+   struct F
+   {
+     int& operator()(void*, int& i) { return i; }
+     void* operator()(void* p, long) const { return p; }
+   };
+ 
+   int i = 5;
+   void* vp = &vp; // arbitrary void* value
+   constexpr F f;
+ 
+   // Bound arg always forwarded as const int& so can only call second overload:
+   auto g1 = bind_back<f>(i); // call wrapper has bound arg of type int
+   using G1 = decltype(g1);
+   static_assert(is_invocable_r_v<void*, G1&, void*>);
+   static_assert(is_invocable_r_v<void*, const G1&, void*>);
+   static_assert(is_invocable_r_v<void*, G1&&, void*>);
+   void* p1 = static_cast<G1&&>(g1)(vp);
+   VERIFY( p1 == vp );
+ }
+ 
+ 
+ constexpr int f(int i, int j, int k) { return i + 2*j + 3*k; }
+ 
+ consteval bool
+ test04()
+ {
+   constexpr auto g = bind_back<f>();
+   VERIFY( std::is_empty_v<decltype(g)> );
+   VERIFY(g(1, 2, 3) == 1 + 2*2 + 3*3 );
+   constexpr auto g1 = bind_back<f>(1);
+   VERIFY(g1(2, 3) == 3*1 + 1*2 + 2*3 );
+   VERIFY(bind_back<g>(1)(2, 3) == 3*1 + 1*2 + 2*3 );
+   constexpr auto g2 = bind_back<f>(1, 2);
+   VERIFY(g2(3) == 2*1 + 3*2 + 1*3 );
+   VERIFY(bind_back<g1>(2)(3) == 3*1 + 2*2 + 1*3 );
+   constexpr auto g3 = bind_back<f>(1, 2, 3);
+   VERIFY(g3() == 1 + 2*2 + 3*3);
+   VERIFY(bind_back<g2>(3)() == 1*2 + 2*3 + 3*1 );
+   return true;
+ }
+ 
+ struct C { int i = 0; };
+ struct D : C { D(){} D(D&&) { ++i; } };
+ int f5(D const& d1, D const& d2, D const& d3)
+ { return d1.i + d2.i + d3.i; }
+ 
+ void test05()
+ {
+   // Must move arguments into capture object, not construct in place
+   // like normal arguments.
+   VERIFY( bind_back<f5>(D{}, D{})(D{}) == 2 );
+ }
+ 
+ int
+ main()
+ {
+   test01();
+   test02();
+   test02a();
+   test03();
+   test03a();
+   static_assert(test04());
+   test05();
+ }
diff -Nrcpad gcc-16-20250914/libstdc++-v3/testsuite/20_util/function_objects/bind_back/nttp_neg.cc gcc-16-20250921/libstdc++-v3/testsuite/20_util/function_objects/bind_back/nttp_neg.cc
*** gcc-16-20250914/libstdc++-v3/testsuite/20_util/function_objects/bind_back/nttp_neg.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/libstdc++-v3/testsuite/20_util/function_objects/bind_back/nttp_neg.cc	Sun Sep 21 22:33:43 2025
***************
*** 0 ****
--- 1,38 ----
+ //  { dg-do compile { target c++26 } }
+ 
+ #include <functional>
+ 
+ void f() {};
+ using fp = decltype(&f);
+ constexpr fp nfp = nullptr;
+ 
+ struct A { void mf() const {} };
+ using mfp = decltype(&A::mf);
+ constexpr mfp nnmfp = &A::mf;
+ constexpr mfp nmfp = nullptr;
+ 
+ struct B { B() = default; B(B const&) = delete; };
+ void bf(B const&) {};
+ 
+ struct C { C() = default; C(C&&) = delete; };
+ void cf(C&&) {};
+ 
+ int main()
+ {
+   std::bind_back<f>()();
+   // Verify bind_back<fn> with fn a null pointer fails.
+   std::bind_back<nfp>()();  // { dg-error "here" }
+ 
+   std::bind_back<nnmfp>(A{})();
+   // Verify bind_back<mfn> with mfn a null member pointer fails.
+   std::bind_back<nmfp>(A{})(); // { dg-error "here" }
+ 
+   // Verify passing uncopyable type fails.
+   std::bind_back<bf>(B{}); // { dg-error "here" }
+ 			   //
+   // Verify passing unmovable type fails.
+   std::bind_back<cf>(C{}); // { dg-error "here" }
+ }
+ 
+ // { dg-error "static assertion failed" "" { target *-*-* } 0 }
+ // { dg-error "use of deleted function" "" { target *-*-* } 0 }
diff -Nrcpad gcc-16-20250914/libstdc++-v3/testsuite/20_util/function_objects/bind_front/1.cc gcc-16-20250921/libstdc++-v3/testsuite/20_util/function_objects/bind_front/1.cc
*** gcc-16-20250914/libstdc++-v3/testsuite/20_util/function_objects/bind_front/1.cc	Sun Sep 14 22:32:39 2025
--- gcc-16-20250921/libstdc++-v3/testsuite/20_util/function_objects/bind_front/1.cc	Sun Sep 21 22:33:43 2025
*************** test03()
*** 266,287 ****
    static_assert(is_invocable_r_v<void*, const G4&&>);
  }
  
! int f(int i, int j, int k) { return i + j + k; }
  
  void
  test04()
  {
    auto g = bind_front(f);
!   VERIFY( g(1, 2, 3) == 6 );
    auto g1 = bind_front(f, 1);
!   VERIFY( g1(2, 3) == 6 );
!   VERIFY( bind_front(g, 1)(2, 3) == 6 );
    auto g2 = bind_front(f, 1, 2);
!   VERIFY( g2(3) == 6 );
!   VERIFY( bind_front(g1, 2)(3) == 6 );
    auto g3 = bind_front(f, 1, 2, 3);
!   VERIFY( g3() == 6 );
!   VERIFY( bind_front(g2, 3)() == 6 );
  }
  
  struct CountedArg
--- 266,287 ----
    static_assert(is_invocable_r_v<void*, const G4&&>);
  }
  
! int f(int i, int j, int k) { return i + 2*j + 3*k; }
  
  void
  test04()
  {
    auto g = bind_front(f);
!   VERIFY( g(1, 2, 3) == 14 );
    auto g1 = bind_front(f, 1);
!   VERIFY( g1(2, 3) == 14 );
!   VERIFY( bind_front(g, 1)(2, 3) == 14 );
    auto g2 = bind_front(f, 1, 2);
!   VERIFY( g2(3) == 14 );
!   VERIFY( bind_front(g1, 2)(3) == 14 );
    auto g3 = bind_front(f, 1, 2, 3);
!   VERIFY( g3() == 14 );
!   VERIFY( bind_front(g2, 3)() == 14 );
  }
  
  struct CountedArg
diff -Nrcpad gcc-16-20250914/libstdc++-v3/testsuite/20_util/function_objects/bind_front/nttp.cc gcc-16-20250921/libstdc++-v3/testsuite/20_util/function_objects/bind_front/nttp.cc
*** gcc-16-20250914/libstdc++-v3/testsuite/20_util/function_objects/bind_front/nttp.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/libstdc++-v3/testsuite/20_util/function_objects/bind_front/nttp.cc	Sun Sep 21 22:33:43 2025
***************
*** 0 ****
--- 1,260 ----
+ // { dg-do run { target c++26 } }
+ // { dg-add-options no_pch }
+ 
+ // Test NTTP bind_front<f>(Args...), P2714
+ 
+ #include <functional>
+ 
+ #ifndef __cpp_lib_bind_front
+ # error "Feature test macro for bind_front is missing in <functional>"
+ #elif __cpp_lib_bind_front < 202306L
+ # error "Feature test macro for bind_front has wrong value in <functional>"
+ #endif
+ 
+ #include <testsuite_hooks.h>
+ 
+ using std::bind_front;
+ using std::is_same_v;
+ using std::is_invocable_v;
+ using std::is_invocable_r_v;
+ 
+ void
+ test01()
+ {
+   struct F { void operator()(int) {} };
+   constexpr F f{};
+ 
+   // Reference wrappers should be handled:
+   static_assert(!std::is_same_v<
+       decltype(bind_front<f>(std::declval<int&>())),
+       decltype(bind_front<f>(std::ref(std::declval<int&>())))
+       >);
+   static_assert(!std::is_same_v<
+       decltype(bind_front<f>(std::declval<const int&>())),
+       decltype(bind_front<f>(std::cref(std::declval<int&>())))
+       >);
+   static_assert(!std::is_same_v<
+       decltype(bind_front<f>(std::ref(std::declval<int&>()))),
+       decltype(bind_front<f>(std::cref(std::declval<int&>())))
+       >);
+ }
+ 
+ void
+ test02()
+ {
+   struct quals
+   {
+     bool as_const;
+     bool as_lvalue;
+   };
+ 
+   struct F
+   {
+     quals operator()(int, int) & { return { false, true }; }
+     quals operator()(int, int) const & { return { true, true }; }
+     quals operator()(int, int) && { return { false, false }; }
+     quals operator()(int, int) const && { return { true, false }; }
+   };
+ 
+   // Constness and value category forwarded to the target object?
+   { // no bound args
+     constexpr F f;
+     auto g = bind_front<f>();
+     const auto& cg = g;
+     quals q;
+ 
+     // Constness and value category forwarded to the target object?
+     q = g(0,0);
+     VERIFY( q.as_const && q.as_lvalue );
+     q = std::move(g)(0,0);
+     VERIFY( q.as_const && q.as_lvalue );
+     q = cg(0,0);
+     VERIFY( q.as_const && q.as_lvalue );
+     q = std::move(cg)(0,0);
+     VERIFY( q.as_const && q.as_lvalue );
+   }
+   { // one bound arg (for when we implement that as a separate case)
+     constexpr F f;
+     auto g = bind_front<f>(0);
+     const auto& cg = g;
+     quals q;
+ 
+     // Constness and value category forwarded to the target object?
+     q = g(0);
+     VERIFY( q.as_const && q.as_lvalue );
+     q = std::move(g)(0);
+     VERIFY( q.as_const && q.as_lvalue );
+     q = cg(0);
+     VERIFY( q.as_const && q.as_lvalue );
+     q = std::move(cg)(0);
+     VERIFY( q.as_const && q.as_lvalue );
+   }
+   { // two bound args, the general case
+     constexpr F f;
+     auto g = bind_front<f>(0,0);
+     const auto& cg = g;
+     quals q;
+ 
+     q = g();
+     VERIFY( q.as_const && q.as_lvalue );
+     q = std::move(g)();
+     VERIFY( q.as_const && q.as_lvalue );
+     q = cg();
+     VERIFY( q.as_const && q.as_lvalue );
+     q = std::move(cg)();
+     VERIFY( q.as_const && q.as_lvalue );
+   }
+ }
+ 
+ void
+ test02a()
+ {
+   struct quals
+   {
+     bool as_const;
+     bool as_lvalue;
+   };
+ 
+   struct F
+   {
+     quals operator()(int&, int) const { return { false, true }; }
+     quals operator()(int const&, int) const { return { true, true }; }
+     quals operator()(int&&, int) const { return { false, false }; }
+     quals operator()(int const&&, int) const  { return { true, false }; }
+   };
+   constexpr F f{};
+ 
+   // verify propagation
+   auto h = bind_front<f>(10);
+   auto const& ch = h;
+   quals q;
+ 
+   q = h(0);
+   VERIFY( !q.as_const && q.as_lvalue );
+   q = ch(0);
+   VERIFY( q.as_const && q.as_lvalue );
+   q = std::move(h)(0);
+   VERIFY( !q.as_const && !q.as_lvalue );
+   q = std::move(ch)(0);
+   VERIFY( q.as_const && !q.as_lvalue );
+ }
+ 
+ void
+ test03()
+ {
+   struct F
+   {
+     int& operator()(int& i, void*) { return i; }
+     void* operator()(long, void* p) const { return p; }
+   };
+ 
+   int i = 5;
+   void* vp = &vp; // arbitrary void* value
+   constexpr F f;
+ 
+   // Bound arg always forwarded as const int& so can only call second overload:
+ 
+   auto g0 = bind_front<f>(); // call wrapper has no bound arg
+   using G0 = decltype(g0);
+   static_assert(is_invocable_r_v<void*, G0&, int, void*>);
+   static_assert(is_invocable_r_v<void*, G0&, int&, void*>);
+   static_assert(is_invocable_r_v<void*, G0&, const int&, void*>);
+   static_assert(is_invocable_r_v<void*, const G0&, int, void*>);
+   static_assert(is_invocable_r_v<void*, G0&&, int, void*>);
+   void* p0 = static_cast<G0&&>(g0)(i, vp);
+   VERIFY( p0 == vp );
+ 
+   auto g1 = bind_front<f>(i); // call wrapper has bound arg of type int
+   using G1 = decltype(g1);
+   static_assert(!is_invocable_r_v<int&, G1&, void*>);
+   static_assert(is_invocable_r_v<void*, const G1&, void*>);
+   static_assert(is_invocable_r_v<void*, G1&&, void*>);
+   void* p1 = static_cast<G1&&>(g1)(vp);
+   VERIFY( p1 == vp );
+ 
+   auto g2 = bind_front<f>(std::ref(i)); // bound arg of type int&
+   using G2 = decltype(g2);
+   static_assert(is_invocable_r_v<void*, G2&, void*>);
+   static_assert(is_invocable_r_v<void*, G2&&, void*>);
+   static_assert(is_invocable_r_v<void*, const G2&, void*>);
+   static_assert(is_invocable_r_v<void*, const G2&&, void*>);
+   void* p2 = g2(vp);
+   VERIFY( p2 == vp );
+   p2 = static_cast<G2&&>(g2)(vp);
+   VERIFY( p2 == vp );
+   p2 = const_cast<const G2&>(g2)(vp);
+   VERIFY( p2 == vp );
+ 
+   auto g3 = bind_front<f>(std::cref(i)); // bound arg of type const int&
+   using G3 = decltype(g3);
+   static_assert(is_invocable_r_v<void*, G3&, void*>);
+   static_assert(is_invocable_r_v<void*, G3&&, void*>);
+   static_assert(is_invocable_r_v<void*, const G3&, void*>);
+   static_assert(is_invocable_r_v<void*, const G3&&, void*>);
+ }
+ 
+ void test03a()
+ {
+   struct F
+   {
+     int& operator()(int& i, void*) { return i; }
+     void* operator()(long, void* p) const { return p; }
+   };
+ 
+   int i = 5;
+   void* vp = &vp; // arbitrary void* value
+   constexpr F f;
+ 
+   // Bound arg always forwarded as const int& so can only call second overload:
+   auto g1 = bind_front<f>(i); // call wrapper has bound arg of type int
+   using G1 = decltype(g1);
+   static_assert(is_invocable_r_v<void*, G1&, void*>);
+   static_assert(is_invocable_r_v<void*, const G1&, void*>);
+   static_assert(is_invocable_r_v<void*, G1&&, void*>);
+   void* p1 = static_cast<G1&&>(g1)(vp);
+   VERIFY( p1 == vp );
+ }
+ 
+ constexpr int f(int i, int j, int k) { return i + 2*j + 3*k; }
+ 
+ consteval bool
+ test04()
+ {
+   constexpr auto g = bind_front<f>();
+   VERIFY( std::is_empty_v<decltype(g)> );
+   VERIFY( g(1, 2, 3) == 1 + 2*2 + 3*3 );
+   constexpr auto g1 = bind_front<f>(1);
+   VERIFY( g1(2, 3) == 1 + 2*2 + 3*3 );
+   VERIFY( bind_front<g>(1)(2, 3) == 1 + 2*2 + 3*3 );
+   constexpr auto g2 = bind_front<f>(1, 2);
+   VERIFY( g2(3) == 1 + 2*2 + 3*3 );
+   VERIFY( bind_front<g1>(2)(3) == 1 + 2*2 + 3*3 );
+   constexpr auto g3 = bind_front<f>(1, 2, 3);
+   VERIFY( g3() == 1 + 2*2 + 3*3 );
+   VERIFY(bind_front<g2>(3)() == 1 + 2*2 + 3*3 );
+   return true;
+ }
+ 
+ struct C { int i = 0; };
+ struct D : C { D(){} D(D&&) { ++i; } };
+ int f5(D const& d1, D const& d2, D const& d3)
+ { return d1.i + d2.i + d3.i; }
+ 
+ void test05()
+ {
+   // Must move arguments into capture object, not construct in place
+   // like normal arguments.
+   VERIFY( bind_front<f5>(D{}, D{})(D{}) == 2 );
+ }
+ 
+ int
+ main()
+ {
+   test01();
+   test02();
+   test02a();
+   test03();
+   test03a();
+   static_assert(test04());
+   test05();
+ }
diff -Nrcpad gcc-16-20250914/libstdc++-v3/testsuite/20_util/function_objects/bind_front/nttp_neg.cc gcc-16-20250921/libstdc++-v3/testsuite/20_util/function_objects/bind_front/nttp_neg.cc
*** gcc-16-20250914/libstdc++-v3/testsuite/20_util/function_objects/bind_front/nttp_neg.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/libstdc++-v3/testsuite/20_util/function_objects/bind_front/nttp_neg.cc	Sun Sep 21 22:33:43 2025
***************
*** 0 ****
--- 1,38 ----
+ //  { dg-do compile { target c++26 } }
+ 
+ #include <functional>
+ 
+ void f() {}
+ using fp = decltype(&f);
+ constexpr fp nfp = nullptr;
+ 
+ struct A { void mf() const {} };
+ using mfp = decltype(&A::mf);
+ constexpr mfp nnmfp = &A::mf;
+ constexpr mfp nmfp = nullptr;
+ 
+ struct B { B() = default; B(B const&) = delete; };
+ void bf(B const&) {};
+ 
+ struct C { C() = default; C(C&&) = delete; };
+ void cf(C&&) {};
+ 
+ int main()
+ {
+   std::bind_front<f>()();
+   // Verify bind_front<fn> with fn a null pointer fails:
+   std::bind_front<nfp>()();  // { dg-error "here" }
+ 
+   std::bind_front<nnmfp>(A{})();
+   // Verify bind_front<mfn> with mfn a null member pointer fails:
+   std::bind_front<nmfp>(A{})(); // { dg-error "here" }
+ 
+   // Verify passing uncopyable type fails:
+   std::bind_front<bf>(B{}); // { dg-error "here" }
+ 			    //
+   // Verify passing unmovable type fails:
+   std::bind_front<cf>(C{}); // { dg-error "here" }
+ }
+ 
+ // { dg-error "static assertion failed" "" { target *-*-* } 0 }
+ // { dg-error "use of deleted function" "" { target *-*-* } 0 }
diff -Nrcpad gcc-16-20250914/libstdc++-v3/testsuite/20_util/function_objects/not_fn/nttp.cc gcc-16-20250921/libstdc++-v3/testsuite/20_util/function_objects/not_fn/nttp.cc
*** gcc-16-20250914/libstdc++-v3/testsuite/20_util/function_objects/not_fn/nttp.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/libstdc++-v3/testsuite/20_util/function_objects/not_fn/nttp.cc	Sun Sep 21 22:33:43 2025
***************
*** 0 ****
--- 1,100 ----
+ // Test NTTP version of not_fn, from P2714
+ 
+ // { dg-do run { target c++26 } }
+ 
+ #ifndef __cpp_lib_not_fn
+ # error "Feature test macro for not_fn is missing in <functional>"
+ #elif __cpp_lib_not_fn < 202306L
+ # error "Feature test macro for not_fn has wrong value in <functional>"
+ #endif
+ 
+ #include <functional>
+ #include <testsuite_hooks.h>
+ 
+ using std::not_fn;
+ 
+ int func(int, char) { return 0; }
+ 
+ struct F
+ {
+   bool operator()() { return false; }
+   bool operator()() const { return true; }
+   bool operator()(int) const { return false; }
+ };
+ 
+ void
+ test01()
+ {
+   auto f1 = not_fn<func>();
+   VERIFY( std::is_empty_v<decltype(f1)> );
+   VERIFY( f1(1, '2') == true );
+ 
+   auto f2 = not_fn<[] { return true; }>();
+   VERIFY( std::is_empty_v<decltype(f2)> );
+   VERIFY( f2() == false );
+ 
+   auto f3 = not_fn<F{}>();
+   VERIFY( f3() == false );  // Prefer the const member.
+   VERIFY( f3(1) == true );
+   const auto f4 = f3;
+   VERIFY( f4() == false );
+ }
+ 
+ void
+ test04()
+ {
+   struct abstract { virtual void f() = 0; };
+   struct derived : abstract { void f() { } };
+   struct F { bool operator()(const abstract&) const { return false; } };
+   constexpr F f;
+   constexpr derived d;
+   VERIFY( not_fn<f>()(d) );
+ }
+ 
+ void
+ test05()
+ {
+   auto nf = std::not_fn<[] { return false; }>();
+   auto copy(nf); // PR libstdc++/70564
+ }
+ 
+ void
+ test06()
+ {
+   struct Boolean {
+     Boolean operator!() const noexcept(false) { return *this; }
+   };
+   struct F {
+     Boolean operator()() const { return {}; }
+   };
+   const F f;
+   const auto notf = std::not_fn<f>();
+   using NotF = decltype(notf);
+   static_assert( std::is_invocable<NotF>::value, "cannot negate" );
+   static_assert( !noexcept(notf()), "conversion to bool affects noexcept" );
+ }
+ 
+ void
+ test07()
+ {
+   struct NonNegatable { };  // there is no operator!(NonNegatable)
+   struct F {
+     NonNegatable operator()() const { return {}; }
+   };
+   F f;
+   constexpr auto notf = std::not_fn<f>();
+   using NotF = decltype(notf);
+   static_assert( !std::is_invocable<NotF>::value, "cannot negate" );
+ }
+ 
+ int
+ main()
+ {
+   test01();
+   test04();
+   test05();
+   test06();
+   test07();
+   constexpr auto f = []{ return false; };
+   static_assert(std::not_fn<f>()());
+ }
diff -Nrcpad gcc-16-20250914/libstdc++-v3/testsuite/20_util/function_objects/not_fn/nttp_neg.cc gcc-16-20250921/libstdc++-v3/testsuite/20_util/function_objects/not_fn/nttp_neg.cc
*** gcc-16-20250914/libstdc++-v3/testsuite/20_util/function_objects/not_fn/nttp_neg.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/libstdc++-v3/testsuite/20_util/function_objects/not_fn/nttp_neg.cc	Sun Sep 21 22:33:43 2025
***************
*** 0 ****
--- 1,28 ----
+ //  { dg-do compile { target c++26 } }
+ 
+ #include <functional>
+ 
+ bool f() { return {}; }
+ using fp = decltype(&f);
+ constexpr fp nfp = nullptr;
+ 
+ struct A { bool mf() const { return {}; } };
+ using mfp = decltype(&A::mf);
+ constexpr mfp nnmfp = &A::mf;
+ constexpr mfp nmfp = nullptr;
+ constexpr A a;
+ 
+ int main()
+ {
+   (void) std::not_fn<f>()();
+ 
+   // Verify not_fn<fn> with fn a null pointer fails.
+   (void) std::not_fn<nfp>()();  // { dg-error "here" }
+ 				//
+   (void) std::not_fn<nnmfp>()(a);
+ 
+   // Verify not_fn<mfn> with mfn a null member pointer fails.
+   return std::not_fn<nmfp>()(a);  // { dg-error "here" }
+ }
+ 
+ // { dg-error "static assertion failed" "" { target *-*-* } 0 }
diff -Nrcpad gcc-16-20250914/libstdc++-v3/testsuite/20_util/headers/functional/synopsis.cc gcc-16-20250921/libstdc++-v3/testsuite/20_util/headers/functional/synopsis.cc
*** gcc-16-20250914/libstdc++-v3/testsuite/20_util/headers/functional/synopsis.cc	Sun Sep 14 22:32:39 2025
--- gcc-16-20250921/libstdc++-v3/testsuite/20_util/headers/functional/synopsis.cc	Sun Sep 21 22:33:43 2025
*************** namespace std {
*** 57,62 ****
--- 57,69 ----
    template <class Predicate>
    _GLIBCXX14_CONSTEXPR
    binary_negate<Predicate> not2(const Predicate&);
+ #ifdef __cpp_lib_not_fn
+   template <typename F> _GLIBCXX20_CONSTEXPR auto not_fn(F&&)
+   noexcept(std::is_nothrow_constructible<std::decay_t<F>, F&&>::value);
+ #if __cpp_lib_not_fn >= 202306L
+   template <auto f> constexpr decltype(auto) not_fn() noexcept;
+ #endif
+ #endif
  
    //  lib.binders, binders:
    template <class Operation>  class binder1st;
*************** namespace std {
*** 65,70 ****
--- 72,95 ----
    template <class Operation> class binder2nd;
    template <class Operation, class T>
    binder2nd<Operation> bind2nd(const Operation&, const T&);
+ #ifdef __cpp_lib_bind_front
+   template <typename F, typename... Args>
+     _GLIBCXX20_CONSTEXPR auto bind_front(F&&, Args&&...);
+ #if __cpp_lib_bind_front >= 202306L
+   template <auto f, typename... Args>
+     constexpr decltype(auto) bind_front(Args&&...)
+       noexcept(__and_v<is_nothrow_constructible<Args>...>);
+ #endif
+ #endif
+ #ifdef __cpp_lib_bind_back
+   template <typename F, typename... Args>
+     _GLIBCXX20_CONSTEXPR auto bind_back(F&&, Args&&...);
+ #if __cpp_lib_bind_back >= 202306L
+   template <auto f, typename... Args>
+     constexpr decltype(auto) bind_back(Args&&...)
+       noexcept(__and_v<is_nothrow_constructible<Args>...>);
+ #endif
+ #endif
  
    //  lib.function.pointer.adaptors, adaptors:
    template <class Arg, class Result> class pointer_to_unary_function;
diff -Nrcpad gcc-16-20250914/libstdc++-v3/testsuite/20_util/ratio/operations/ops_overflow_neg.cc gcc-16-20250921/libstdc++-v3/testsuite/20_util/ratio/operations/ops_overflow_neg.cc
*** gcc-16-20250914/libstdc++-v3/testsuite/20_util/ratio/operations/ops_overflow_neg.cc	Sun Sep 14 22:32:39 2025
--- gcc-16-20250921/libstdc++-v3/testsuite/20_util/ratio/operations/ops_overflow_neg.cc	Sun Sep 21 22:33:43 2025
***************
*** 1,6 ****
  // { dg-do compile { target c++11 } }
  // { dg-require-cstdint "" }
! 
  // 2008-07-03 Chris Fairles <chris.fairles@gmail.com>
  
  // Copyright (C) 2008-2025 Free Software Foundation, Inc.
--- 1,6 ----
  // { dg-do compile { target c++11 } }
  // { dg-require-cstdint "" }
! // { dg-additional-options "-Wsystem-headers" }
  // 2008-07-03 Chris Fairles <chris.fairles@gmail.com>
  
  // Copyright (C) 2008-2025 Free Software Foundation, Inc.
diff -Nrcpad gcc-16-20250914/libstdc++-v3/testsuite/20_util/unique_ptr/lwg4148.cc gcc-16-20250921/libstdc++-v3/testsuite/20_util/unique_ptr/lwg4148.cc
*** gcc-16-20250914/libstdc++-v3/testsuite/20_util/unique_ptr/lwg4148.cc	Sun Sep 14 22:32:39 2025
--- gcc-16-20250921/libstdc++-v3/testsuite/20_util/unique_ptr/lwg4148.cc	Sun Sep 21 22:33:43 2025
***************
*** 1,4 ****
--- 1,5 ----
  // { dg-do compile { target c++11 } }
+ // { dg-additional-options "-Wsystem-headers" }
  
  // LWG 4148. unique_ptr::operator* should not allow dangling references
  
diff -Nrcpad gcc-16-20250914/libstdc++-v3/testsuite/29_atomics/atomic/operators/pointer_partial_void.cc gcc-16-20250921/libstdc++-v3/testsuite/29_atomics/atomic/operators/pointer_partial_void.cc
*** gcc-16-20250914/libstdc++-v3/testsuite/29_atomics/atomic/operators/pointer_partial_void.cc	Sun Sep 14 22:32:42 2025
--- gcc-16-20250921/libstdc++-v3/testsuite/29_atomics/atomic/operators/pointer_partial_void.cc	Sun Sep 21 22:34:01 2025
***************
*** 1,6 ****
--- 1,7 ----
  // { dg-do run { target { c++11_only || c++14_only } } }
  // { dg-require-atomic-builtins "" }
  // { dg-require-effective-target hosted }
+ // { dg-additional-options "-Wsystem-headers" }
  
  // Copyright (C) 2012-2025 Free Software Foundation, Inc.
  //
diff -Nrcpad gcc-16-20250914/libstdc++-v3/testsuite/30_threads/packaged_task/cons/dangling_ref.cc gcc-16-20250921/libstdc++-v3/testsuite/30_threads/packaged_task/cons/dangling_ref.cc
*** gcc-16-20250914/libstdc++-v3/testsuite/30_threads/packaged_task/cons/dangling_ref.cc	Sun Sep 14 22:32:42 2025
--- gcc-16-20250921/libstdc++-v3/testsuite/30_threads/packaged_task/cons/dangling_ref.cc	Sun Sep 21 22:34:02 2025
***************
*** 1,4 ****
--- 1,5 ----
  // { dg-do compile { target c++11 } }
+ // { dg-additional-options "-Wsystem-headers" }
  #include <future>
  
  // C++20 [futures.task.members]
diff -Nrcpad gcc-16-20250914/libstdc++-v3/testsuite/std/memory/start_lifetime_as/start_lifetime_as.cc gcc-16-20250921/libstdc++-v3/testsuite/std/memory/start_lifetime_as/start_lifetime_as.cc
*** gcc-16-20250914/libstdc++-v3/testsuite/std/memory/start_lifetime_as/start_lifetime_as.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250921/libstdc++-v3/testsuite/std/memory/start_lifetime_as/start_lifetime_as.cc	Sun Sep 21 22:34:02 2025
***************
*** 0 ****
--- 1,94 ----
+ // { dg-do run { target c++23 } }
+ 
+ #include <bit>
+ #include <memory>
+ 
+ #include <testsuite_hooks.h>
+ #include <testsuite_allocator.h>
+ 
+ struct S { int a; int b; };
+ struct T { long long c; };
+ 
+ template<typename S, typename T>
+ void
+ test01()
+ {
+ }
+ 
+ template<typename S, typename T>
+ requires (sizeof(S) == sizeof(T))
+ void
+ test01()
+ {
+   union U { unsigned char a[sizeof(S)]; S b; T c; } u;
+   u.a[0] = 1;
+   T v = std::bit_cast<T> (S{1, 2});
+   union V { unsigned char a[3 * sizeof(S)]; S b[3]; T c[3]; } w;
+   T x = std::bit_cast<T> (S{3, 4});
+   T y = std::bit_cast<T> (S{5, 6});
+   S* d = std::start_lifetime_as<S>(reinterpret_cast<void*>(&u.a));
+   d->a = 1;
+   d->b = 2;
+   T* e = std::start_lifetime_as<T>(reinterpret_cast<void*>(d));
+   VERIFY( e->c == v.c );
+   const T* f = std::start_lifetime_as<T>(reinterpret_cast<const void*>(d));
+   VERIFY( f->c == v.c );
+   volatile T* g
+     = std::start_lifetime_as<T>(reinterpret_cast<volatile void*>(d));
+   VERIFY( g->c == v.c );
+   const volatile T* h
+     = std::start_lifetime_as<T>(reinterpret_cast<const volatile void*>(d));
+   VERIFY( h->c == v.c );
+   S* i = std::start_lifetime_as_array<S>(reinterpret_cast<void*>(&w.a), 3);
+   i[0].a = 1;
+   i[0].b = 2;
+   i[1].a = 3;
+   i[1].b = 4;
+   i[2].a = 5;
+   i[2].b = 6;
+   T* j = std::start_lifetime_as_array<T>(reinterpret_cast<void*>(i), 3);
+   VERIFY( j[0].c == v.c && j[1].c == x.c && j[2].c == y.c );
+   const T* k
+     = std::start_lifetime_as_array<T>(reinterpret_cast<const void*>(i), 3);
+   VERIFY( k[0].c == v.c && k[1].c == x.c && k[2].c == y.c );
+   volatile T* l
+     = std::start_lifetime_as_array<T>(reinterpret_cast<volatile void*>(i), 3);
+   VERIFY( l[0].c == v.c && l[1].c == x.c && l[2].c == y.c );
+   const volatile T* m
+     = std::start_lifetime_as_array<T>(reinterpret_cast<const volatile void*>(i),
+ 				      3);
+   VERIFY( m[0].c == v.c && m[1].c == x.c && m[2].c == y.c );
+   T* n = std::start_lifetime_as_array<T>(static_cast<void*>(nullptr), 0);
+   VERIFY( n == nullptr );
+   const T* o
+     = std::start_lifetime_as_array<T>(static_cast<const void*>(nullptr), 0);
+   VERIFY( o == nullptr );
+   volatile T* p
+     = std::start_lifetime_as_array<T>(static_cast<volatile void*>(nullptr), 0);
+   VERIFY( p == nullptr );
+   const volatile T* q
+     = std::start_lifetime_as_array<T>(static_cast<const volatile void*>(nullptr),
+ 				      0);
+   VERIFY( q == nullptr );
+   VERIFY( std::start_lifetime_as_array<T>(reinterpret_cast<void*>(&w.a), 0)
+ 	  == &w.c[0] );
+   VERIFY( std::start_lifetime_as_array<T>(reinterpret_cast<const void*>(&w.a), 0)
+ 	  == static_cast<const T*>(&w.c[0]) );
+   VERIFY( std::start_lifetime_as_array<T>(reinterpret_cast<volatile void*>(&w.a),
+ 					  0)
+ 	  == static_cast<volatile T*>(&w.c[0]) );
+   VERIFY( std::start_lifetime_as_array<T>(reinterpret_cast<const volatile void*>(&w.a),
+ 					  0)
+ 	  == static_cast<const volatile T*>(&w.c[0]) );
+   static const S r[] = { { 5, 6 }, { 3, 4 } };
+   const T* s = std::start_lifetime_as<T>(&r[1]);
+   VERIFY( s->c == x.c );
+   const T* t = std::start_lifetime_as_array<T>(&r[0], 2);
+   VERIFY( t[0].c == y.c && t[1].c == x.c );
+ }
+ 
+ int
+ main()
+ {
+   test01<S, T>();
+ }
diff -Nrcpad gcc-16-20250914/libstdc++-v3/testsuite/std/ranges/adaptors/adjacent/1.cc gcc-16-20250921/libstdc++-v3/testsuite/std/ranges/adaptors/adjacent/1.cc
*** gcc-16-20250914/libstdc++-v3/testsuite/std/ranges/adaptors/adjacent/1.cc	Sun Sep 14 22:32:42 2025
--- gcc-16-20250921/libstdc++-v3/testsuite/std/ranges/adaptors/adjacent/1.cc	Sun Sep 21 22:34:03 2025
*************** test04()
*** 114,119 ****
--- 114,131 ----
    return true;
  }
  
+ constexpr bool
+ test05()
+ {
+   // PR libstdc++/121956
+   int a[2]{};
+   __gnu_test::test_random_access_range r(a);
+   auto v = r | views::pairwise;
+   static_assert( std::is_same_v<ranges::range_value_t<decltype(v)>,
+ 				std::tuple<int, int>> );
+   return true;
+ }
+ 
  int
  main()
  {
*************** main()
*** 121,124 ****
--- 133,137 ----
    static_assert(test02());
    static_assert(test03());
    static_assert(test04());
+   static_assert(test05());
  }
diff -Nrcpad gcc-16-20250914/libstdc++-v3/testsuite/std/time/clock/local/io.cc gcc-16-20250921/libstdc++-v3/testsuite/std/time/clock/local/io.cc
*** gcc-16-20250914/libstdc++-v3/testsuite/std/time/clock/local/io.cc	Sun Sep 14 22:32:42 2025
--- gcc-16-20250921/libstdc++-v3/testsuite/std/time/clock/local/io.cc	Sun Sep 21 22:34:03 2025
*************** test_parse()
*** 125,130 ****
--- 125,138 ----
    VERIFY( tp.time_since_epoch() == 0s );
  }
  
+ // LWG 4257. Stream insertion for chrono::local_time should be constrained
+ template<typename T>
+ concept ostream_insertable = requires (std::ostream& o, const T& t) { o << t; };
+ using D = std::chrono::duration<double>;
+ static_assert( ostream_insertable<std::chrono::local_days> );
+ static_assert( ostream_insertable<std::chrono::local_seconds> );
+ static_assert( ! ostream_insertable<std::chrono::local_time<D>> );
+ 
  int main()
  {
    test_ostream();
