diff options
337 files changed, 23386 insertions, 3514 deletions
@@ -1,3 +1,15 @@ +2025-05-28 Kugan Vivekanandarajah <kvivekananda@nvidia.com> + + * Makefile.def: Fix typo in cpu_type + * Makefile.tpl: Add cpu_type + +2025-05-26 Kugan Vivekanandarajah <kvivekananda@nvidia.com> + + * Makefile.def: AUTO_PROFILE based on cpu_type. + * Makefile.in: Likewise. + * configure: Regenerate. + * configure.ac: Set autofdo_target. + 2025-05-23 Kishan Parmar <kishan@linux.ibm.com> * MAINTAINERS: Add myself to write after approval. diff --git a/Makefile.def b/Makefile.def index 3f980bc..fa60f6e 100644 --- a/Makefile.def +++ b/Makefile.def @@ -758,7 +758,7 @@ bootstrap_stage = { bootstrap_target=profiledbootstrap ; }; bootstrap_stage = { id=autoprofile ; prev=1 ; - autoprofile="$$s/gcc/config/i386/$(AUTO_PROFILE)" ; }; + autoprofile="$$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE)" ; }; bootstrap_stage = { id=autofeedback ; prev=autoprofile ; bootstrap_target=autoprofiledbootstrap ; diff --git a/Makefile.in b/Makefile.in index b1ed67d..931507c 100644 --- a/Makefile.in +++ b/Makefile.in @@ -38,6 +38,7 @@ build_alias=@build_noncanonical@ build_vendor=@build_vendor@ build_os=@build_os@ build=@build@ +cpu_type=@cpu_type@ host_alias=@host_noncanonical@ host_vendor=@host_vendor@ host_os=@host_os@ @@ -4271,7 +4272,7 @@ all-stageautoprofile-bfd: configure-stageautoprofile-bfd $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/bfd && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -5411,7 +5412,7 @@ all-stageautoprofile-opcodes: configure-stageautoprofile-opcodes $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/opcodes && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -6551,7 +6552,7 @@ all-stageautoprofile-binutils: configure-stageautoprofile-binutils $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/binutils && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -10037,7 +10038,7 @@ all-stageautoprofile-fixincludes: configure-stageautoprofile-fixincludes $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/fixincludes && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -11617,7 +11618,7 @@ all-stageautoprofile-gas: configure-stageautoprofile-gas $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/gas && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -12766,7 +12767,7 @@ all-stageautoprofile-gcc: configure-stageautoprofile-gcc $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/gcc && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -13915,7 +13916,7 @@ all-stageautoprofile-gmp: configure-stageautoprofile-gmp $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/gmp && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -15052,7 +15053,7 @@ all-stageautoprofile-mpfr: configure-stageautoprofile-mpfr $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/mpfr && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -16189,7 +16190,7 @@ all-stageautoprofile-mpc: configure-stageautoprofile-mpc $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/mpc && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -17326,7 +17327,7 @@ all-stageautoprofile-isl: configure-stageautoprofile-isl $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/isl && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -18454,7 +18455,7 @@ all-stageautoprofile-gold: configure-stageautoprofile-gold $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/gold && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -20539,7 +20540,7 @@ all-stageautoprofile-gettext: configure-stageautoprofile-gettext $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/gettext && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -22449,7 +22450,7 @@ all-stageautoprofile-ld: configure-stageautoprofile-ld $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/ld && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -23589,7 +23590,7 @@ all-stageautoprofile-libbacktrace: configure-stageautoprofile-libbacktrace $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/libbacktrace && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -24729,7 +24730,7 @@ all-stageautoprofile-libcpp: configure-stageautoprofile-libcpp $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/libcpp && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -25869,7 +25870,7 @@ all-stageautoprofile-libcody: configure-stageautoprofile-libcody $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/libcody && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -26858,7 +26859,7 @@ all-stageautoprofile-libdecnumber: configure-stageautoprofile-libdecnumber $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/libdecnumber && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -28460,7 +28461,7 @@ all-stageautoprofile-libiberty: configure-stageautoprofile-libiberty $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/libiberty && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -29609,7 +29610,7 @@ all-stageautoprofile-libiberty-linker-plugin: configure-stageautoprofile-libiber $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/libiberty-linker-plugin && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -30758,7 +30759,7 @@ all-stageautoprofile-libiconv: configure-stageautoprofile-libiconv $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/libiconv && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -34130,7 +34131,7 @@ all-stageautoprofile-zlib: configure-stageautoprofile-zlib $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/zlib && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -40321,7 +40322,7 @@ all-stageautoprofile-lto-plugin: configure-stageautoprofile-lto-plugin $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/lto-plugin && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -42397,7 +42398,7 @@ all-stageautoprofile-libctf: configure-stageautoprofile-libctf $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/libctf && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -43537,7 +43538,7 @@ all-stageautoprofile-libsframe: configure-stageautoprofile-libsframe $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/libsframe && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -44677,7 +44678,7 @@ all-stageautoprofile-libgrust: configure-stageautoprofile-libgrust $(HOST_EXPORTS) \ $(POSTSTAGE1_HOST_EXPORTS) \ cd $(HOST_SUBDIR)/libgrust && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(STAGEautoprofile_CFLAGS)" \ GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \ @@ -45939,7 +45940,7 @@ all-stageautoprofile-target-libstdc++-v3: configure-stageautoprofile-target-libs $(RAW_CXX_TARGET_EXPORTS) \ \ cd $(TARGET_SUBDIR)/libstdc++-v3 && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(CFLAGS_FOR_TARGET)" \ CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \ @@ -47209,7 +47210,7 @@ all-stageautoprofile-target-libsanitizer: configure-stageautoprofile-target-libs $(RAW_CXX_TARGET_EXPORTS) \ \ cd $(TARGET_SUBDIR)/libsanitizer && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(CFLAGS_FOR_TARGET)" \ CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \ @@ -48479,7 +48480,7 @@ all-stageautoprofile-target-libvtv: configure-stageautoprofile-target-libvtv $(RAW_CXX_TARGET_EXPORTS) \ \ cd $(TARGET_SUBDIR)/libvtv && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(CFLAGS_FOR_TARGET)" \ CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \ @@ -50719,7 +50720,7 @@ all-stageautoprofile-target-libgcc: configure-stageautoprofile-target-libgcc $(NORMAL_TARGET_EXPORTS) \ \ cd $(TARGET_SUBDIR)/libgcc && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(CFLAGS_FOR_TARGET)" \ CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \ @@ -51951,7 +51952,7 @@ all-stageautoprofile-target-libbacktrace: configure-stageautoprofile-target-libb $(NORMAL_TARGET_EXPORTS) \ \ cd $(TARGET_SUBDIR)/libbacktrace && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(CFLAGS_FOR_TARGET)" \ CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \ @@ -55128,7 +55129,7 @@ all-stageautoprofile-target-libphobos: configure-stageautoprofile-target-libphob $(NORMAL_TARGET_EXPORTS) \ \ cd $(TARGET_SUBDIR)/libphobos && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(CFLAGS_FOR_TARGET)" \ CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \ @@ -58258,7 +58259,7 @@ all-stageautoprofile-target-zlib: configure-stageautoprofile-target-zlib $(NORMAL_TARGET_EXPORTS) \ \ cd $(TARGET_SUBDIR)/zlib && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(CFLAGS_FOR_TARGET)" \ CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \ @@ -60983,7 +60984,7 @@ all-stageautoprofile-target-libgomp: configure-stageautoprofile-target-libgomp $(NORMAL_TARGET_EXPORTS) \ \ cd $(TARGET_SUBDIR)/libgomp && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(CFLAGS_FOR_TARGET)" \ CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \ @@ -62738,7 +62739,7 @@ all-stageautoprofile-target-libatomic: configure-stageautoprofile-target-libatom $(NORMAL_TARGET_EXPORTS) \ \ cd $(TARGET_SUBDIR)/libatomic && \ - $$s/gcc/config/i386/$(AUTO_PROFILE) \ + $$s/gcc/config/$(cpu_type)/$(AUTO_PROFILE) \ $(MAKE) $(BASE_FLAGS_TO_PASS) \ CFLAGS="$(CFLAGS_FOR_TARGET)" \ CXXFLAGS="$(CXXFLAGS_FOR_TARGET)" \ diff --git a/Makefile.tpl b/Makefile.tpl index 7dccf91..b164a17 100644 --- a/Makefile.tpl +++ b/Makefile.tpl @@ -41,6 +41,7 @@ build_alias=@build_noncanonical@ build_vendor=@build_vendor@ build_os=@build_os@ build=@build@ +cpu_type=@cpu_type@ host_alias=@host_noncanonical@ host_vendor=@host_vendor@ host_os=@host_os@ @@ -730,6 +730,7 @@ CPPFLAGS LDFLAGS CFLAGS CC +cpu_type target_subdir host_subdir build_subdir @@ -3395,6 +3396,9 @@ case "${target}" in ;; esac +cpu_type=`echo ${host} | sed 's/-.*$//'` + + # Disable libssp for some systems. case "${target}" in avr-*-*) diff --git a/configure.ac b/configure.ac index d6c3fb5..33c130f 100644 --- a/configure.ac +++ b/configure.ac @@ -621,6 +621,9 @@ case "${target}" in ;; esac +cpu_type=`echo ${host} | sed 's/-.*$//'` +AC_SUBST(cpu_type) + # Disable libssp for some systems. case "${target}" in avr-*-*) diff --git a/contrib/ChangeLog b/contrib/ChangeLog index 331b99f..276ce74 100644 --- a/contrib/ChangeLog +++ b/contrib/ChangeLog @@ -1,3 +1,8 @@ +2025-05-27 Jan Hubicka <hubicka@ucw.cz> + + * gen_autofdo_event.py: Add support for AMD Zen 3 and + later CPUs. + 2025-05-23 Andi Kleen <ak@gcc.gnu.org> * diffsummary.py: New file. diff --git a/contrib/gen_autofdo_event.py b/contrib/gen_autofdo_event.py index 4364e5c..b1d373f 100755 --- a/contrib/gen_autofdo_event.py +++ b/contrib/gen_autofdo_event.py @@ -138,8 +138,16 @@ if [ "$1" = "--all" ] ; then shift fi -if ! grep -q Intel /proc/cpuinfo ; then - echo >&2 "Only Intel CPUs supported" +if grep -q AuthenticAMD /proc/cpuinfo ; then + vendor=AMD + if ! grep -q " brs" /proc/cpuinfo && ! grep -q amd_lbr_v2 /proc/cpuinfo ; then + echo >&2 "AMD CPU with brs (Zen 3) or amd_lbr_v2 (Zen 4+) feature is required" + exit 1 + fi +elif grep -q Intel /proc/cpuinfo ; then + vendor=Intel +else + echo >&2 "Only AMD and Intel CPUs supported" exit 1 fi @@ -147,7 +155,7 @@ if grep -q hypervisor /proc/cpuinfo ; then echo >&2 "Warning: branch profiling may not be functional in VMs" fi -case `grep -E -q "^cpu family\s*: 6" /proc/cpuinfo && +case `test $vendor = Intel && grep -E -q "^cpu family\s*: 6" /proc/cpuinfo && grep -E "^model\s*:" /proc/cpuinfo | head -n1` in''') for event, mod in eventmap.items(): for m in mod[:-1]: @@ -156,8 +164,13 @@ case `grep -E -q "^cpu family\s*: 6" /proc/cpuinfo && print(r'''*) if perf list br_inst_retired | grep -q br_inst_retired.near_taken ; then E=br_inst_retired.near_taken:p + elif perf list ex_ret_brn_tkn | grep -q ex_ret_brn_tkn ; then + E=ex_ret_brn_tkn:P$FLAGS + elif $vendor = Intel ; then +echo >&2 "Unknown Intel CPU. Run contrib/gen_autofdo_event.py --all --script to update script." + exit 1 else -echo >&2 "Unknown CPU. Run contrib/gen_autofdo_event.py --all --script to update script." +echo >&2 "AMD CPU without support for ex_ret_brn_tkn event" exit 1 fi ;;''') print(r"esac") diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9ee26b8..ca53504 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,521 @@ +2025-05-28 Jan Hubicka <hubicka@ucw.cz> + + PR target/119298 + * config/i386/x86-tune-costs.h (struct processor_costs): Set addss cost + back to 2. + +2025-05-28 Robin Dapp <rdapp.gcc@gmail.com> + + * tree-vect-stmts.cc (vectorizable_load): Remove non-SLP paths. + +2025-05-28 Robin Dapp <rdapp@ventanamicro.com> + + PR target/120436 + * config/riscv/riscv-vector-builtins-shapes.cc (struct vset_def): + Avoid division by zero. + (struct vget_def): Ditto. + * config/riscv/riscv-vector-builtins.h (struct function_group_info): + Use required_extensions_specified instead of duplicating code. + +2025-05-28 Pan Li <pan2.li@intel.com> + + * config/riscv/autovec.md (avg<v_double_trunc>3_floor): Add insn + expand to leverage vaadd directly. + +2025-05-28 Jan Hubicka <hubicka@ucw.cz> + + * cgraph.cc (cgraph_edge::maybe_hot_p): For auto-fdo turn 0 + to non-zero. + * ipa-cp.cc (cs_interesting_for_ipcp_p): Do not trust + auto-fdo 0. + * profile-count.cc (profile_count::adjust_for_ipa_scaling): Likewise. + (profile_count::from_gcov_type): Fix formating. + +2025-05-28 Jan Hubicka <hubicka@ucw.cz> + + * predict.cc (rebuild_frequencies): look harder for presence + of profile feedback. + +2025-05-28 Yuta Mukai <mukai.yuta@fujitsu.com> + + * config/aarch64/aarch64-cores.def (fujitsu-monaka): Update ISA + features. + +2025-05-28 Jan Hubicka <hubicka@ucw.cz> + + * predict.cc (set_even_probabilities): Set quality to guessed. + +2025-05-28 Jan Hubicka <hubicka@ucw.cz> + + * auto-profile.cc (update_count_by_afdo_count): New function. + (afdo_set_bb_count): Add debug output; only set count if it is + non-zero. + (afdo_find_equiv_class): Add debug output. + (afdo_calculate_branch_prob): Fix formating. + (afdo_annotate_cfg): Add debug output; do not erase static + profile if autofdo profile is all 0. + +2025-05-28 Haochen Jiang <haochen.jiang@intel.com> + + * doc/extend.texi (C Extensions): Add missing menu items. + +2025-05-28 liuhongt <hongtao.liu@intel.com> + + PR tree-optimization/119181 + * tree-vect-data-refs.cc (vect_analyze_data_ref_accesses): + Split datarefs when there's a gap bigger than + MAX_BITSIZE_MODE_ANY_MODE. + +2025-05-27 Jason Merrill <jason@redhat.com> + + PR c++/120400 + * fold-const.cc (simple_operand_p): False for vars with + DECL_VALUE_EXPR. + +2025-05-27 Alejandro Colomar <alx@kernel.org> + + PR c/117025 + * Makefile.in (USER_H): Add <stdcountof.h>. + * ginclude/stdcountof.h: New file. + +2025-05-27 Alejandro Colomar <alx@kernel.org> + Martin Uecker <uecker@tugraz.at> + + PR c/117025 + * doc/extend.texi: Document _Countof operator. + +2025-05-27 Jan Hubicka <hubicka@ucw.cz> + + * config/i386/gcc-auto-profile: regenerate. + +2025-05-27 Jan Hubicka <hubicka@ucw.cz> + + * auto-profile.cc (function_instance::mark_annotated): Remove. + (function_instance::total_annotated_count): Remove. + (autofdo_source_profile::mark_annotated): Remove. + (afdo_set_bb_count): Do not mark annotated locations. + (afdo_annotate_cfg): Likewise. + +2025-05-27 Eric Botcazou <ebotcazou@adacore.com> + + * ipa-sra.cc (scan_expr_access): Also disqualify storage order + barriers from splitting. + * tree.h (storage_order_barrier_p): Also return false if the + operand of the VIEW_CONVERT_EXPR has reverse storage order. + +2025-05-27 David Malcolm <dmalcolm@redhat.com> + + PR other/116792 + * diagnostic-format-html.cc: Define INCLUDE_STRING. + Include "xml.h", "xml-printer.h", and "json.h". + (html_generation_options::html_generation_options): New. + (namespace xml): Move decls to xml.h and convert from using + label_text to std::string. + (xml::text::write_as_xml): Reimplement indentation so it is done + by this node, rather than the parent. + (xml::node_with_children::add_text): Convert from label_text to + std::string. Consolidate runs of text into a single node. + (xml::document::write_as_xml): Reimplement indentation. + (xml::element::write_as_xml): Reimplement indentation so it is + done by this node, rather than the parent. Convert from + label_text to std::string. Update attribute-printing to new + representation to preserve insertion order. + (xml::element::set_attr): Convert from label_text to std::string. + Record insertion order. + (xml::raw::write_as_xml): New. + (xml::printer::printer): New. + (xml::printer::push_tag): New. + (xml::printer::push_tag_with_class): New. + (xml::printer::pop_tag): New. + (xml::printer::set_attr): New. + (xml::printer::add_text): New. + (xml::printer::add_raw): New. + (xml::printer::push_element): New. + (xml::printer::append): New. + (xml::printer::get_insertion_point): New. + (html_builder::add_focus_id): New. + (html_builder::m_html_gen_opts): New field. + (html_builder::m_head_element): New field. + (html_builder::m_next_diag_id): New field. + (html_builder::m_ui_focus_ids): New field. + (make_div): Convert from label_text to std::string. + (make_span): Likewise. + (HTML_STYLE): New. + (HTML_SCRIPT): New. + (html_builder::html_builder): Fix indentation. Add + "html_gen_opts" param. Initialize new fields. Reimplement + using xml::printer. Optionally add style and script tags. + (class html_path_label_writer): New. + (html_builder::make_element_for_diagnostic): Convert from + label_text to std::string. Set "id" on "gcc-diagnostic" and + "gcc-message" <div> elements; add the latter to the focus ids. + Use diagnostic_context::maybe_show_locus_as_html rather than + html_builder::make_element_for_source. Use print_path_as_html + rather than html_builder::make_element_for_path. + (html_builder::make_element_for_source): Drop. + (html_builder::make_element_for_path): Drop. + (html_builder::make_element_for_patch): Convert from label_text to + std::string. + (html_builder::make_metadata_element): Likewise. Use + xml::printer. + (html_builder::make_element_for_metadata): Convert from label_text + to std::string. + (html_builder::emit_diagram): Expand comment. + (html_builder::flush_to_file): Write out initializer for + "focus_ids" into javascript. + (html_output_format::html_output_format): Add param + "html_gen_opts" and use it to initialize m_builder. + (html_file_output_format::html_file_output_format): Likewise, to + initialize base class. + (make_html_sink): Likewise, to pass to ctor. + (selftest::test_html_diagnostic_context::test_html_diagnostic_context): + Set up html_generation_options. + (selftest::html_buffered_output_format::html_buffered_output_format): + Add html_gen_opts param. + (selftest::test_simple_log): Add id attributes to expected text + for "gcc-diagnostic" and "gcc-message" elements. Update + whitespace for indentation fixes. + (selftest::test_metadata): Update whitespace for indentation + fixes. + (selftest::test_printer): New selftest. + (selftest::test_attribute_ordering): New selftest. + (selftest::diagnostic_format_html_cc_tests): Call the new + selftests. + * diagnostic-format-html.h (struct html_generation_options): New. + (make_html_sink): Add "html_gen_opts" param. + (print_path_as_html): New decl. + * diagnostic-path-output.cc: Define INCLUDE_MAP. Add includes of + "diagnostic-format-html.h", "xml.h", and "xml-printer.h". + (path_print_policy::path_print_policy): Add ctor. + (path_print_policy::get_diagram_theme): Fix whitespace. + (struct stack_frame): New. + (begin_html_stack_frame): New function. + (end_html_stack_frame): New function. + (emit_svg_arrow): New function. + (event_range::print): Rename to... + (event_range::print_as_text): ...this. Update call to + diagnostic_start_span. + (event_range::print_as_html): New, based on the above, but ported + from pretty_printer to xml::printer. + (thread_event_printer::print_swimlane_for_event_range): Rename + to... + (thread_event_printer::print_swimlane_for_event_range_as_text): + ...this. Update for renaming of event_range::print to + event_range::print_as_text. + (thread_event_printer::print_swimlane_for_event_range_as_html): + New. + (print_path_summary_as_text): Update for "_as_text" renaming. + (print_path_summary_as_html): New. + (print_path_as_html): New. + * diagnostic-show-locus.cc: Add defines of INCLUDE_MAP and + INCLUDE_STRING. Add includes of "xml.h" and "xml-printer.h". + (struct char_display_policy): Replace "m_print_cb" with + "m_print_text_cb" and "m_print_html_cb". + (struct to_text): New. + (struct to_html): New. + (get_printer): New. + (default_diagnostic_start_span_fn<to_text>): New. + (default_diagnostic_start_span_fn<to_html>): New. + (class layout): Update "friend class layout_printer;" for + template. + (enum class margin_kind): New. + (class layout_printer): Convert into a template. + (layout_printer::m_pp): Replace field with... + (layout_printer::m_sink): ...this. + (layout_printer::m_colorizer): Drop field in favor of a pointer + in the "to_text" sink. + (default_print_decoded_ch): Convert into a template. + (escape_as_bytes_print): Likewise. + (escape_as_unicode_print): Likewise. + (make_char_policy): Update to use both text and html callbacks. + (layout_printer::print_gap_in_line_numbering): Replace with... + (layout_printer<to_text>::print_gap_in_line_numbering): ...this + (layout_printer<to_html>::print_gap_in_line_numbering): ...and + this. + (layout_printer::print_source_line): Convert to template, using + m_sink. + (layout_printer::print_leftmost_column): Likewise. + (layout_printer::start_annotation_line): Likewise. + (layout_printer<to_text>::end_line): New. + (layout_printer<to_html>::end_line): New. + (layout_printer::print_annotation_line): Convert to template, + using m_sink. + (class line_label): Add field m_original_range_idx. + (layout_printer<to_text>::begin_label): New. + (layout_printer<to_html>::begin_label): New. + (layout_printer<to_text>::end_label): New. + (layout_printer<to_html>::end_label): New. + (layout_printer::print_any_labels): Convert to template, using + m_sink. + (layout_printer::print_leading_fixits): Likewise. + (layout_printer::print_trailing_fixits): Likewise. + (layout_printer::print_newline): Drop. + (layout_printer::move_to_column): Convert to template, using + m_sink. + (layout_printer::show_ruler): Likewise. + (layout_printer::print_line): Likewise. + (layout_printer::print_any_right_to_left_edge_lines): Likewise. + (layout_printer::layout_printer): Likewise. + (diagnostic_context::maybe_show_locus_as_html): New. + (diagnostic_source_print_policy::diagnostic_source_print_policy): + Update for split of start_span_cb into text vs html variants. + (diagnostic_source_print_policy::print): Update for use of + templates; use to_text. + (diagnostic_source_print_policy::print_as_html): New. + (layout_printer::print): Convert to template, using m_sink. + (selftest::make_element_for_locus): New. + (selftest::make_raw_html_for_locus): New. + (selftest::test_layout_x_offset_display_utf8): Update for use of + templates. + (selftest::test_layout_x_offset_display_tab): Likewise. + (selftest::test_one_liner_caret_and_range): Add test coverage of + HTML output. + (selftest::test_one_liner_labels): Likewise. + * diagnostic.cc (diagnostic_context::initialize): Update for split + of start_span_cb into text vs html variants. + (default_diagnostic_start_span_fn): Move to + diagnostic-show-locus.cc, converting to template. + * diagnostic.h (class xml::printer): New forward decl. + (diagnostic_start_span_fn): Replace typedef with "using", + converting to a template. + (struct to_text): New forward decl. + (struct to_html): New forward decl. + (get_printer): New decl. + (diagnostic_location_print_policy::print_text_span_start): New + decl. + (diagnostic_location_print_policy::print_html_span_start): New + decl. + (class html_label_writer): New. + (diagnostic_source_print_policy::print_as_html): New decl. + (diagnostic_source_print_policy::get_start_span_fn): Replace + with... + (diagnostic_source_print_policy::get_text_start_span_fn): ...this + (diagnostic_source_print_policy::get_html_start_span_fn): ...and + this + (diagnostic_source_print_policy::m_start_span_cb): Replace with... + (diagnostic_source_print_policy::m_text_start_span_cb): ...this + (diagnostic_source_print_policy::m_html_start_span_cb): ...and + this. + (diagnostic_context::maybe_show_locus_as_html): New decl. + (diagnostic_context::m_text_callbacks::m_start_span): Replace + with... + (diagnostic_context::m_text_callbacks::m_text_start_span): ...this + (diagnostic_context::m_text_callbacks::m_html_start_span): ...and + this. + (diagnostic_start_span): Update for template change. + (diagnostic_show_locus_as_html): New inline function. + (default_diagnostic_start_span_fn): Convert to template. + * doc/invoke.texi (experimental-html): Add "css" and "javascript" + keys. + * opts-diagnostic.cc (html_scheme_handler::make_sink): Likewise. + * selftest-diagnostic.cc + (selftest::test_diagnostic_context::start_span_cb): Update for + template changes. + * selftest-diagnostic.h + (selftest::test_diagnostic_context::start_span_cb): Likewise. + * xml-printer.h: New file. + * xml.h: New file, based on material in diagnostic-format-html.cc, + but using std::string rather than label_text. + (xml::element::m_key_insertion_order): New field. + (struct xml::raw): New. + +2025-05-27 David Malcolm <dmalcolm@redhat.com> + + * Makefile.in (OBJS-libcommon): Add diagnostic-path-output.o. + * diagnostic-path-output.cc: New file, taken from material in + diagnostic-path.cc. + * diagnostic-path.cc: Drop includes of + "diagnostic-macro-unwinding.h", "intl.h", "gcc-rich-location.h", + "diagnostic-color.h", "diagnostic-event-id.h", + "diagnostic-label-effects.h", "pretty-print-markup.h", + "selftest.h", "selftest-diagnostic.h", + "selftest-diagnostic-path.h", "text-art/theme.h", and + "diagnostic-format-text.h". + (class path_print_policy): Move to diagnostic-path-output.cc. + (class path_label): Likewise. + (can_consolidate_events): Likewise. + (class per_thread_summary): Likewise. + (struct event_range): Likewise. + (struct path_summary): Likewise. + (per_thread_summary::interprocedural_p): Likewise. + (path_summary::path_summary): Likewise. + (write_indent): Likewise. + (base_indent): Likewise. + (per_frame_indent): Likewise. + (class thread_event_printer): Likewise. + (print_path_summary_as_text): Likewise. + (class element_event_desc): Likewise. + (diagnostic_text_output_format::print_path): Likewise. + (selftest::path_events_have_column_data_p): Likewise. + (selftest::test_empty_path): Likewise. + (selftest::test_intraprocedural_path): Likewise. + (selftest::test_interprocedural_path_1): Likewise. + (selftest::test_interprocedural_path_2): Likewise. + (selftest::test_recursion): Likewise. + (class selftest::control_flow_test): Likewise. + (selftest::test_control_flow_1): Likewise. + (selftest::test_control_flow_2): Likewise. + (selftest::test_control_flow_3): Likewise. + (selftest::assert_cfg_edge_path_streq): Likewise. + (ASSERT_CFG_EDGE_PATH_STREQ): Likewise. + (selftest::test_control_flow_4): Likewise. + (selftest::test_control_flow_5): Likewise. + (selftest::test_control_flow_6): Likewise. + (selftest::control_flow_tests): Likewise. + (selftest::diagnostic_path_cc_tests): Likewise, renaming + accordingly. + * selftest-run-tests.cc (selftest::run_tests): Update for + move of path-printing selftests. + * selftest.h (selftest::diagnostic_path_cc_tests): Replace decl + with... + (selftest::diagnostic_path_output_cc_tests): ...this. + +2025-05-27 Juergen Christ <jchrist@linux.ibm.com> + + * config/s390/vector.md(*vec_extract<mode>): Fix mnemonic. + +2025-05-27 Richard Biener <rguenther@suse.de> + + PR tree-optimization/117965 + * tree-ssa-phiprop.cc (phivn_valid_p): Remove. + (propagate_with_phi): Pass in virtual PHI node from BB, + rewrite load motion validity check to require the same + virtual use along all paths. + +2025-05-27 Konstantinos Eleftheriou <konstantinos.eleftheriou@vrull.eu> + + PR rtl-optimization/119884 + * avoid-store-forwarding.cc (process_store_forwarding): + Use `lowpart_subreg` for the base register initialization + and remove redundant stores from the store/load sequence. + +2025-05-27 Konstantinos Eleftheriou <konstantinos.eleftheriou@vrull.eu> + + * sbitmap.cc (bitmap_any_bit_in_range_p): + Call and return the result of `bitmap_bit_in_range_p` with the + `any_inverted` parameter set to false. + (bitmap_bit_in_range_p): New function. + (bitmap_all_bits_in_range_p): New function. + * sbitmap.h (bitmap_all_bits_in_range_p): New function. + +2025-05-27 Konstantinos Eleftheriou <konstantinos.eleftheriou@vrull.eu> + + * sbitmap.cc (bitmap_bit_in_range_p): Renamed the function. + (bitmap_any_bit_in_range_p): New function name. + (bitmap_bit_in_range_p_checking): Renamed the function. + (bitmap_any_bit_in_range_p_checking): New function name. + (test_set_range): Updated function calls to use the new name. + (test_bit_in_range): Likewise. + * sbitmap.h (bitmap_bit_in_range_p): Renamed the function. + (bitmap_any_bit_in_range_p): New function name. + * tree-ssa-dse.cc (live_bytes_read): + Updated function call to use the new name. + +2025-05-27 Co-authored-by: Jeff Law <jlaw@ventanamicro.com> + + * config/riscv/bitmanip.md (andi+bclr splits): Simplified from + prior define_insn_and_splits. + * config/riscv/riscv.cc (synthesize_and): Add support for andi+bclr + sequences. + +2025-05-27 Pan Li <pan2.li@intel.com> + + * config/riscv/riscv-v.cc (expand_vx_binary_vec_dup_vec): Add + new case for XOR op. + (expand_vx_binary_vec_vec_dup): Diito. + * config/riscv/riscv.cc (riscv_rtx_costs): Ditto. + * config/riscv/vector-iterators.md: Add new op or to no_shift_vx_ops. + +2025-05-27 Juergen Christ <jchrist@linux.ibm.com> + + * config/s390/vector.md (VF): New mode iterator. + (VEC_SET_NONFLOAT): New mode iterator. + (VEC_SET_SINGLEFLOAT): New mode iterator. + (*vec_set<mode>): Split pattern in two. + (*vec_setv2df): Extract special handling for V2DF mode. + (*vec_extract<mode>): Split pattern in two. + +2025-05-27 Jonathan Wakely <jwakely@redhat.com> + + * doc/extend.texi (Common Variable Attributes): Fix typo in + description of nonstring. + +2025-05-27 Kito Cheng <kito.cheng@sifive.com> + + * gcc.cc (find_multilib_os_dir_by_multilib_dir): New. + (set_multilib_dir): Fix multilib_os_dir and multiarch_dir + if multilib_os_dir is not set. + +2025-05-27 xuli <xuli1@eswincomputing.com> + + * match.pd: add singned vector SAT_ADD IMM form1 matching. + +2025-05-27 xuli <xuli1@eswincomputing.com> + + * match.pd: Add signed scalar SAT_ADD IMM form1 with IMM=-1 matching. + * tree-ssa-math-opts.cc (match_unsigned_saturation_add): Adapt function name. + (match_saturation_add_with_assign): Match signed and unsigned SAT_ADD with assign. + (math_opts_dom_walker::after_dom_children): Match imm=-1 signed SAT_ADD with NOP_EXPR case. + +2025-05-26 Jason Merrill <jason@redhat.com> + + * doc/invoke.texi: Move C++ -fdump-lang to C++ section. + Add -fdump-lang-tinst. + +2025-05-26 Kugan Vivekanandarajah <kvivekananda@nvidia.com> + + * config/aarch64/gcc-auto-profile: New file. + +2025-05-26 Segher Boessenkool <segher@kernel.crashing.org> + + * config/rs6000/rs6000.cc: Remove include of reload.h . + +2025-05-26 Kugan Vivekanandarajah <kvivekananda@nvidia.com> + + * ipa-split.cc (pass_feedback_split_functions::clone): New. + * passes.def: Enable pass_feedback_split_functions for + pass_ipa_auto_profile. + +2025-05-25 Michael J. Eager <eager@eagercon.com> + + PR target/86772 + Tracking CVE-2017-5753 + * config/microblaze/microblaze.cc (TARGET_HAVE_SPECULATION_SAFE_VALUE): + Define to speculation_save_value_not_needed + +2025-05-25 Jan Hubicka <hubicka@ucw.cz> + + * config/i386/i386.cc (ix86_builtin_vectorization_cost): + use sse_op instead of addss to cost vinsertti128 and vinsertti64x4; + compute correct mode of vinsertti128. + (ix86_vector_costs::add_stmt_cost): For integer 256bit and 512bit + vector constructions account more integer_to_sse moves. + +2025-05-25 LIU Hao <lh_mouse@126.com> + + PR target/53929 + PR target/80881 + * config/i386/i386-protos.h (ix86_asm_output_labelref): Declare new + function for quoting user-defined symbols in Intel syntax. + * config/i386/i386.cc (ix86_asm_output_labelref): Implement it. + * config/i386/i386.h (ASM_OUTPUT_LABELREF): Use it. + * config/i386/cygming.h (ASM_OUTPUT_LABELREF): Use it. + +2025-05-24 Shreya Munnangi <smunnangi1@ventanamicro.com> + + * config/riscv/riscv.cc (synthesize_and): Use a srl+andi+sll + sequence when the mask fits in a simm12 after shifting by the + number of trailing zeros. + Co-authored-by: Jeff Law <jlaw@ventanamicro.com> + +2025-05-24 Pan Li <pan2.li@intel.com> + + * config/riscv/riscv-v.cc (expand_vx_binary_vec_dup_vec): Add new + case for IOR op. + (expand_vx_binary_vec_vec_dup): Ditto. + * config/riscv/riscv.cc (riscv_rtx_costs): Ditto. + * config/riscv/vector-iterators.md: Add new op or to no_shift_vx_ops. + 2025-05-23 Andi Kleen <ak@gcc.gnu.org> * doc/install.texi: Document bootstrap-native. diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP index cc6fc26..9398513 100644 --- a/gcc/DATESTAMP +++ b/gcc/DATESTAMP @@ -1 +1 @@ -20250524 +20250529 diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 366364a..49869531 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -480,6 +480,7 @@ USER_H = $(srcdir)/ginclude/float.h \ $(srcdir)/ginclude/stdalign.h \ $(srcdir)/ginclude/stdatomic.h \ $(srcdir)/ginclude/stdckdint.h \ + $(srcdir)/ginclude/stdcountof.h \ $(EXTRA_HEADERS) USER_H_INC_NEXT_PRE = @user_headers_inc_next_pre@ @@ -1856,6 +1857,7 @@ OBJS-libcommon = diagnostic-spec.o diagnostic.o diagnostic-color.o \ diagnostic-global-context.o \ diagnostic-macro-unwinding.o \ diagnostic-path.o \ + diagnostic-path-output.o \ diagnostic-show-locus.o \ edit-context.o \ pretty-print.o intl.o \ diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index f0046a0..55c8f74 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,7 @@ +2025-05-24 Eric Botcazou <ebotcazou@adacore.com> + + * gcc-interface/Make-lang.in (ACATSDIR): Use acats-2 directory. + 2025-05-13 Nicolas Boulenguez <nicolas@debian.org> PR ada/87778 diff --git a/gcc/auto-profile.cc b/gcc/auto-profile.cc index 9966d93..3eefb97 100644 --- a/gcc/auto-profile.cc +++ b/gcc/auto-profile.cc @@ -151,7 +151,6 @@ public: Each inline stack should only be used to annotate IR once. This will be enforced when instruction-level discriminator is supported. */ - bool annotated; }; /* operator< for "const char *". */ @@ -242,9 +241,6 @@ public: MAP, return the total count for all inlined indirect calls. */ gcov_type find_icall_target_map (gcall *stmt, icall_target_map *map) const; - /* Sum of counts that is used during annotation. */ - gcov_type total_annotated_count () const; - /* Mark LOC as annotated. */ void mark_annotated (location_t loc); @@ -314,9 +310,6 @@ public: Return true if INFO is updated. */ bool update_inlined_ind_target (gcall *stmt, count_info *info); - /* Mark LOC as annotated. */ - void mark_annotated (location_t loc); - private: /* Map from function_instance name index (in string_table) to function_instance. */ @@ -578,17 +571,6 @@ function_instance::get_count_info (location_t loc, count_info *info) const return true; } -/* Mark LOC as annotated. */ - -void -function_instance::mark_annotated (location_t loc) -{ - position_count_map::iterator iter = pos_counts.find (loc); - if (iter == pos_counts.end ()) - return; - iter->second.annotated = true; -} - /* Read the inlined indirect call target profile for STMT and store it in MAP, return the total count for all inlined indirect calls. */ @@ -685,22 +667,6 @@ function_instance::read_function_instance (function_instance_stack *stack, return s; } -/* Sum of counts that is used during annotation. */ - -gcov_type -function_instance::total_annotated_count () const -{ - gcov_type ret = 0; - for (callsite_map::const_iterator iter = callsites.begin (); - iter != callsites.end (); ++iter) - ret += iter->second->total_annotated_count (); - for (position_count_map::const_iterator iter = pos_counts.begin (); - iter != pos_counts.end (); ++iter) - if (iter->second.annotated) - ret += iter->second.count; - return ret; -} - /* Member functions for autofdo_source_profile. */ autofdo_source_profile::~autofdo_source_profile () @@ -748,21 +714,6 @@ autofdo_source_profile::get_count_info (location_t gimple_loc, return s->get_count_info (stack[0].second, info); } -/* Mark LOC as annotated. */ - -void -autofdo_source_profile::mark_annotated (location_t loc) -{ - inline_stack stack; - get_inline_stack (loc, &stack); - if (stack.length () == 0) - return; - function_instance *s = get_function_instance_by_inline_stack (stack); - if (s == NULL) - return; - s->mark_annotated (stack[0].second); -} - /* Update value profile INFO for STMT from the inlined indirect callsite. Return true if INFO is updated. */ @@ -1110,6 +1061,19 @@ set_bb_annotated (basic_block bb, bb_set *annotated) annotated->insert (bb); } +/* Update profile_count by known autofdo count. */ +void +update_count_by_afdo_count (profile_count *count, gcov_type c) +{ + if (c) + *count = profile_count::from_gcov_type (c).afdo (); + /* In case we have guessed profile which is already zero, preserve + quality info. */ + else if (count->nonzero_p () + || count->quality () == GUESSED) + *count = profile_count::zero ().afdo (); +} + /* For a given BB, set its execution count. Attach value profile if a stmt is not in PROMOTED, because we only want to promote an indirect call once. Return TRUE if BB is annotated. */ @@ -1118,10 +1082,10 @@ static bool afdo_set_bb_count (basic_block bb, const stmt_set &promoted) { gimple_stmt_iterator gsi; - edge e; - edge_iterator ei; gcov_type max_count = 0; bool has_annotated = false; + if (dump_file) + fprintf (dump_file, " Looking up AFDO count of bb %i\n", bb->index); for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) { @@ -1133,6 +1097,12 @@ afdo_set_bb_count (basic_block bb, const stmt_set &promoted) { if (info.count > max_count) max_count = info.count; + if (dump_file && info.count) + { + fprintf (dump_file, " count %" PRIu64 " in stmt: ", + (int64_t)info.count); + print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM); + } has_annotated = true; if (info.targets.size () > 0 && promoted.find (stmt) == promoted.end ()) @@ -1163,6 +1133,13 @@ afdo_set_bb_count (basic_block bb, const stmt_set &promoted) { if (info.count > max_count) max_count = info.count; + if (dump_file && info.count) + { + fprintf (dump_file, + " phi op in BB %i with count %" PRIu64": ", + bb_succ->index, (int64_t)info.count); + print_gimple_stmt (dump_file, phi, 0, TDF_SLIM); + } has_annotated = true; } } @@ -1172,21 +1149,14 @@ afdo_set_bb_count (basic_block bb, const stmt_set &promoted) return false; } - for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) - afdo_source_profile->mark_annotated (gimple_location (gsi_stmt (gsi))); - for (gphi_iterator gpi = gsi_start_phis (bb); - !gsi_end_p (gpi); - gsi_next (&gpi)) + if (max_count) { - gphi *phi = gpi.phi (); - size_t i; - for (i = 0; i < gimple_phi_num_args (phi); i++) - afdo_source_profile->mark_annotated (gimple_phi_arg_location (phi, i)); + update_count_by_afdo_count (&bb->count, max_count); + if (dump_file) + fprintf (dump_file, + " Annotated bb %i with count %" PRId64 "\n", + bb->index, (int64_t)max_count); } - FOR_EACH_EDGE (e, ei, bb->succs) - afdo_source_profile->mark_annotated (e->goto_locus); - - bb->count = profile_count::from_gcov_type (max_count).afdo (); return true; } @@ -1219,6 +1189,14 @@ afdo_find_equiv_class (bb_set *annotated_bb) bb1->aux = bb; if (bb1->count > bb->count && is_bb_annotated (bb1, *annotated_bb)) { + if (dump_file) + { + fprintf (dump_file, + " Copying count of bb %i to bb %i; count is:", + bb1->index, + bb->index); + bb1->count.dump (dump_file); + } bb->count = bb1->count; set_bb_annotated (bb, annotated_bb); } @@ -1231,6 +1209,14 @@ afdo_find_equiv_class (bb_set *annotated_bb) bb1->aux = bb; if (bb1->count > bb->count && is_bb_annotated (bb1, *annotated_bb)) { + if (dump_file) + { + fprintf (dump_file, + " Copying count of bb %i to bb %i; count is:", + bb1->index, + bb->index); + bb1->count.dump (dump_file); + } bb->count = bb1->count; set_bb_annotated (bb, annotated_bb); } @@ -1476,7 +1462,7 @@ afdo_calculate_branch_prob (bb_set *annotated_bb) else total_count += AFDO_EINFO (e)->get_count (); } - if (num_unknown_succ == 0 && total_count.nonzero_p()) + if (num_unknown_succ == 0 && total_count.nonzero_p ()) { FOR_EACH_EDGE (e, ei, bb->succs) e->probability @@ -1577,22 +1563,55 @@ afdo_annotate_cfg (const stmt_set &promoted_stmts) current_function_decl); if (s == NULL) - return; - ENTRY_BLOCK_PTR_FOR_FN (cfun)->count - = profile_count::from_gcov_type (s->head_count ()).afdo (); - EXIT_BLOCK_PTR_FOR_FN (cfun)->count = profile_count::zero ().afdo (); - profile_count max_count = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count; + { + if (dump_file) + fprintf (dump_file, "No afdo profile for %s", + cgraph_node::get (current_function_decl)->dump_name ()); + return; + } + if (dump_file) + fprintf (dump_file, "\n\nAnnotating BB profile of %s\n", + cgraph_node::get (current_function_decl)->dump_name ()); + + /* In the first pass only store non-zero counts. */ + gcov_type head_count = s->head_count (); + bool profile_found = head_count > 0; FOR_EACH_BB_FN (bb, cfun) { - /* As autoFDO uses sampling approach, we have to assume that all - counters are zero when not seen by autoFDO. */ - bb->count = profile_count::zero ().afdo (); if (afdo_set_bb_count (bb, promoted_stmts)) - set_bb_annotated (bb, &annotated_bb); - if (bb->count > max_count) - max_count = bb->count; + { + if (bb->count.quality () == AFDO) + { + gcc_assert (bb->count.nonzero_p ()); + profile_found = true; + } + set_bb_annotated (bb, &annotated_bb); + } + } + /* Exit without clobbering static profile if there was no + non-zero count. + ??? Instead of keeping guessed profile we can introduce + GUESSED_GLOBAL0_AFDO. */ + if (!profile_found) + { + if (dump_file) + fprintf (dump_file, "No afdo samples found; keeping original profile"); + return; } + + /* Update profile. */ + update_count_by_afdo_count (&ENTRY_BLOCK_PTR_FOR_FN (cfun)->count, + head_count); + update_count_by_afdo_count (&EXIT_BLOCK_PTR_FOR_FN (cfun)->count, 0); + profile_count max_count = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count; + + FOR_EACH_BB_FN (bb, cfun) + if (bb->count.quality () != AFDO) + update_count_by_afdo_count (&bb->count, 0); + else + max_count = max_count.max (bb->count); + if (ENTRY_BLOCK_PTR_FOR_FN (cfun)->count > ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb->count) { @@ -1607,15 +1626,10 @@ afdo_annotate_cfg (const stmt_set &promoted_stmts) = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count; set_bb_annotated (EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb, &annotated_bb); } - afdo_source_profile->mark_annotated ( - DECL_SOURCE_LOCATION (current_function_decl)); - afdo_source_profile->mark_annotated (cfun->function_start_locus); - afdo_source_profile->mark_annotated (cfun->function_end_locus); - if (max_count.nonzero_p()) - { - /* Calculate, propagate count and probability information on CFG. */ - afdo_calculate_branch_prob (&annotated_bb); - } + gcc_assert (max_count.nonzero_p ()); + /* Calculate, propagate count and probability information on CFG. */ + afdo_calculate_branch_prob (&annotated_bb); + cgraph_node::get(current_function_decl)->count = ENTRY_BLOCK_PTR_FOR_FN(cfun)->count; update_max_bb_count (); diff --git a/gcc/avoid-store-forwarding.cc b/gcc/avoid-store-forwarding.cc index 5d960ade..6825d04 100644 --- a/gcc/avoid-store-forwarding.cc +++ b/gcc/avoid-store-forwarding.cc @@ -176,20 +176,28 @@ process_store_forwarding (vec<store_fwd_info> &stores, rtx_insn *load_insn, /* Memory sizes should be constants at this stage. */ HOST_WIDE_INT load_size = MEM_SIZE (load_mem).to_constant (); - /* If the stores cover all the bytes of the load without overlap then we can - eliminate the load entirely and use the computed value instead. */ + /* If the stores cover all the bytes of the load, then we can eliminate + the load entirely and use the computed value instead. + We can also eliminate stores on addresses that are overwritten + by later stores. */ sbitmap forwarded_bytes = sbitmap_alloc (load_size); bitmap_clear (forwarded_bytes); unsigned int i; store_fwd_info* it; + auto_vec<store_fwd_info> redundant_stores; + auto_vec<int> store_ind_to_remove; FOR_EACH_VEC_ELT (stores, i, it) { HOST_WIDE_INT store_size = MEM_SIZE (it->store_mem).to_constant (); - if (bitmap_bit_in_range_p (forwarded_bytes, it->offset, - it->offset + store_size - 1)) - break; + if (bitmap_all_bits_in_range_p (forwarded_bytes, it->offset, + it->offset + store_size - 1)) + { + redundant_stores.safe_push (*it); + store_ind_to_remove.safe_push (i); + continue; + } bitmap_set_range (forwarded_bytes, it->offset, store_size); } @@ -215,6 +223,15 @@ process_store_forwarding (vec<store_fwd_info> &stores, rtx_insn *load_insn, fprintf (dump_file, "(Load elimination candidate)\n"); } + /* Remove redundant stores from the vector. Although this is quadratic, + there doesn't seem to be much point optimizing it. The number of + redundant stores is expected to be low and the length of the list is + limited by a --param. The dependence checking that we did earlier is + also quadratic in the size of this list. */ + store_ind_to_remove.reverse (); + for (int i : store_ind_to_remove) + stores.ordered_remove (i); + rtx load = single_set (load_insn); rtx dest; @@ -231,18 +248,16 @@ process_store_forwarding (vec<store_fwd_info> &stores, rtx_insn *load_insn, { it->mov_reg = gen_reg_rtx (GET_MODE (it->store_mem)); rtx_insn *insns = NULL; + const bool has_zero_offset = it->offset == 0; /* If we're eliminating the load then find the store with zero offset and use it as the base register to avoid a bit insert if possible. */ - if (load_elim && it->offset == 0) + if (load_elim && has_zero_offset) { start_sequence (); - machine_mode dest_mode = GET_MODE (dest); - rtx base_reg = it->mov_reg; - if (known_gt (GET_MODE_BITSIZE (dest_mode), - GET_MODE_BITSIZE (GET_MODE (it->mov_reg)))) - base_reg = gen_rtx_ZERO_EXTEND (dest_mode, it->mov_reg); + rtx base_reg = lowpart_subreg (GET_MODE (dest), it->mov_reg, + GET_MODE (it->mov_reg)); if (base_reg) { @@ -380,6 +395,16 @@ process_store_forwarding (vec<store_fwd_info> &stores, rtx_insn *load_insn, print_rtl_single (dump_file, insn); } } + + if (redundant_stores.length () > 0) + { + fprintf (dump_file, "\nRedundant stores that have been removed:\n"); + FOR_EACH_VEC_ELT (redundant_stores, i, it) + { + fprintf (dump_file, " "); + print_rtl_single (dump_file, it->store_insn); + } + } } stats_sf_avoided++; @@ -399,6 +424,10 @@ process_store_forwarding (vec<store_fwd_info> &stores, rtx_insn *load_insn, delete_insn (it->store_insn); } + /* Delete redundant stores. */ + FOR_EACH_VEC_ELT (redundant_stores, i, it) + delete_insn (it->store_insn); + df_insn_rescan (load_insn); if (load_elim) diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 4136d54..8de6ae5 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,13 @@ +2025-05-27 Alejandro Colomar <alx@kernel.org> + Martin Uecker <uecker@tugraz.at> + + PR c/117025 + * c-common.h (enum rid): Add RID_COUNTOF. + (c_countof_type): New function prototype. + * c-common.def (COUNTOF_EXPR): New tree. + * c-common.cc (c_common_reswords): Add RID_COUNTOF entry. + (c_countof_type): New function. + 2025-05-23 Jason Merrill <jason@redhat.com> * c-format.cc (flag_chars_t::validate): Control quoting warnings diff --git a/gcc/c-family/c-common.cc b/gcc/c-family/c-common.cc index 587d764..f71cb26 100644 --- a/gcc/c-family/c-common.cc +++ b/gcc/c-family/c-common.cc @@ -394,6 +394,7 @@ const struct c_common_resword c_common_reswords[] = { { "_Alignas", RID_ALIGNAS, D_CONLY }, { "_Alignof", RID_ALIGNOF, D_CONLY }, + { "_Countof", RID_COUNTOF, D_CONLY }, { "_Atomic", RID_ATOMIC, D_CONLY }, { "_BitInt", RID_BITINT, D_CONLY }, { "_Bool", RID_BOOL, D_CONLY }, @@ -4080,6 +4081,31 @@ c_alignof_expr (location_t loc, tree expr) return fold_convert_loc (loc, size_type_node, t); } + +/* Implement the _Countof keyword: + Return the number of elements of an array. */ + +tree +c_countof_type (location_t loc, tree type) +{ + enum tree_code type_code; + + type_code = TREE_CODE (type); + if (type_code != ARRAY_TYPE) + { + error_at (loc, "invalid application of %<_Countof%> to type %qT", type); + return error_mark_node; + } + if (!COMPLETE_TYPE_P (type)) + { + error_at (loc, + "invalid application of %<_Countof%> to incomplete type %qT", + type); + return error_mark_node; + } + + return array_type_nelts_top (type); +} /* Handle C and C++ default attributes. */ diff --git a/gcc/c-family/c-common.def b/gcc/c-family/c-common.def index cf22282..0bcc499 100644 --- a/gcc/c-family/c-common.def +++ b/gcc/c-family/c-common.def @@ -50,6 +50,9 @@ DEFTREECODE (EXCESS_PRECISION_EXPR, "excess_precision_expr", tcc_expression, 1) number. */ DEFTREECODE (USERDEF_LITERAL, "userdef_literal", tcc_exceptional, 3) +/* Represents a 'countof' expression. */ +DEFTREECODE (COUNTOF_EXPR, "countof_expr", tcc_expression, 1) + /* Represents a 'sizeof' expression during C++ template expansion, or for the purpose of -Wsizeof-pointer-memaccess warning. */ DEFTREECODE (SIZEOF_EXPR, "sizeof_expr", tcc_expression, 1) diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h index ea6c297..91fd120 100644 --- a/gcc/c-family/c-common.h +++ b/gcc/c-family/c-common.h @@ -105,6 +105,7 @@ enum rid /* C extensions */ RID_ASM, RID_TYPEOF, RID_TYPEOF_UNQUAL, RID_ALIGNOF, RID_ATTRIBUTE, + RID_COUNTOF, RID_C23_VA_START, RID_VA_ARG, RID_EXTENSION, RID_IMAGPART, RID_REALPART, RID_LABEL, RID_CHOOSE_EXPR, RID_TYPES_COMPATIBLE_P, RID_BUILTIN_COMPLEX, RID_BUILTIN_SHUFFLE, @@ -890,6 +891,7 @@ extern tree c_common_truthvalue_conversion (location_t, tree); extern void c_apply_type_quals_to_decl (int, tree); extern tree c_sizeof_or_alignof_type (location_t, tree, bool, bool, int); extern tree c_alignof_expr (location_t, tree); +extern tree c_countof_type (location_t, tree); /* Print an error message for invalid operands to arith operation CODE. NOP_EXPR is used as a special case (see truthvalue_conversion). */ extern void binary_op_error (rich_location *, enum tree_code, tree, tree); diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index b7cdd11..c8587b4 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,37 @@ +2025-05-27 Jakub Jelinek <jakub@redhat.com> + + PR c/117025 + * c-parser.cc (c_parser_sizeof_or_countof_expression): Use + C2Y rather than C23 in pedwarn_c23. + +2025-05-27 Alejandro Colomar <alx@kernel.org> + + PR c/117025 + * c-parser.cc (c_parser_sizeof_or_countof_expression): + Add -Wpedantic diagnostic for _Countof in <= C23 mode. + +2025-05-27 Alejandro Colomar <alx@kernel.org> + Martin Uecker <uecker@tugraz.at> + + PR c/117025 + * c-tree.h (in_countof): Add global variable declaration. + (c_expr_countof_expr): Add function prototype. + (c_expr_countof_type): Add function prototype. + * c-decl.cc (start_struct, finish_struct): Add support for + _Countof. + (start_enum, finish_enum): Add support for _Countof. + * c-parser.cc (c_parser_sizeof_expression): New macro. + (c_parser_countof_expression): New macro. + (c_parser_sizeof_or_countof_expression): Rename function and add + support for _Countof. + (c_parser_unary_expression): Add RID_COUNTOF entry. + * c-typeck.cc (in_countof): Add global variable. + (build_external_ref): Add support for _Countof. + (record_maybe_used_decl): Add support for _Countof. + (pop_maybe_used): Add support for _Countof. + (is_top_array_vla): New function. + (c_expr_countof_expr, c_expr_countof_type): New functions. + 2025-05-02 Jakub Jelinek <jakub@redhat.com> PR c/120057 diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc index ad66d7d..33d0ec1 100644 --- a/gcc/c/c-decl.cc +++ b/gcc/c/c-decl.cc @@ -8943,12 +8943,14 @@ start_struct (location_t loc, enum tree_code code, tree name, within a statement expr used within sizeof, et. al. This is not terribly serious as C++ doesn't permit statement exprs within sizeof anyhow. */ - if (warn_cxx_compat && (in_sizeof || in_typeof || in_alignof)) + if (warn_cxx_compat + && (in_sizeof || in_typeof || in_alignof || in_countof)) warning_at (loc, OPT_Wc___compat, "defining type in %qs expression is invalid in C++", - (in_sizeof - ? "sizeof" - : (in_typeof ? "typeof" : "alignof"))); + (in_sizeof ? "sizeof" + : in_typeof ? "typeof" + : in_alignof ? "alignof" + : "_Countof")); if (in_underspecified_init) error_at (loc, "%qT defined in underspecified object initializer", ref); @@ -9923,7 +9925,7 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes, struct_types. */ if (warn_cxx_compat && struct_parse_info != NULL - && !in_sizeof && !in_typeof && !in_alignof) + && !in_sizeof && !in_typeof && !in_alignof && !in_countof) struct_parse_info->struct_types.safe_push (t); } @@ -10097,12 +10099,14 @@ start_enum (location_t loc, struct c_enum_contents *the_enum, tree name, /* FIXME: This will issue a warning for a use of a type defined within sizeof in a statement expr. This is not terribly serious as C++ doesn't permit statement exprs within sizeof anyhow. */ - if (warn_cxx_compat && (in_sizeof || in_typeof || in_alignof)) + if (warn_cxx_compat + && (in_sizeof || in_typeof || in_alignof || in_countof)) warning_at (loc, OPT_Wc___compat, "defining type in %qs expression is invalid in C++", - (in_sizeof - ? "sizeof" - : (in_typeof ? "typeof" : "alignof"))); + (in_sizeof ? "sizeof" + : in_typeof ? "typeof" + : in_alignof ? "alignof" + : "_Countof")); if (in_underspecified_init) error_at (loc, "%qT defined in underspecified object initializer", @@ -10296,7 +10300,7 @@ finish_enum (tree enumtype, tree values, tree attributes) struct_types. */ if (warn_cxx_compat && struct_parse_info != NULL - && !in_sizeof && !in_typeof && !in_alignof) + && !in_sizeof && !in_typeof && !in_alignof && !in_countof) struct_parse_info->struct_types.safe_push (enumtype); /* Check for consistency with previous definition */ diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc index 8a63dc5..0d79f58 100644 --- a/gcc/c/c-parser.cc +++ b/gcc/c/c-parser.cc @@ -77,7 +77,7 @@ along with GCC; see the file COPYING3. If not see #include "asan.h" #include "c-family/c-ubsan.h" #include "gcc-urlifier.h" - + /* We need to walk over decls with incomplete struct/union/enum types after parsing the whole translation unit. In finish_decl(), if the decl is static, has incomplete @@ -1737,7 +1737,10 @@ static struct c_expr c_parser_binary_expression (c_parser *, struct c_expr *, tree); static struct c_expr c_parser_cast_expression (c_parser *, struct c_expr *); static struct c_expr c_parser_unary_expression (c_parser *); -static struct c_expr c_parser_sizeof_expression (c_parser *); +static inline struct c_expr c_parser_sizeof_expression (c_parser *); +static inline struct c_expr c_parser_countof_expression (c_parser *); +static struct c_expr c_parser_sizeof_or_countof_expression (c_parser *, + enum rid); static struct c_expr c_parser_alignof_expression (c_parser *); static struct c_expr c_parser_postfix_expression (c_parser *); static struct c_expr c_parser_postfix_expression_after_paren_type (c_parser *, @@ -10452,9 +10455,13 @@ c_parser_cast_expression (c_parser *parser, struct c_expr *after) ++ unary-expression -- unary-expression unary-operator cast-expression + _Countof unary-expression + _Countof ( type-name ) sizeof unary-expression sizeof ( type-name ) + (_Countof is new in C2y.) + unary-operator: one of & * + - ~ ! @@ -10572,6 +10579,8 @@ c_parser_unary_expression (c_parser *parser) case CPP_KEYWORD: switch (c_parser_peek_token (parser)->keyword) { + case RID_COUNTOF: + return c_parser_countof_expression (parser); case RID_SIZEOF: return c_parser_sizeof_expression (parser); case RID_ALIGNOF: @@ -10610,22 +10619,46 @@ c_parser_unary_expression (c_parser *parser) /* Parse a sizeof expression. */ -static struct c_expr +static inline struct c_expr c_parser_sizeof_expression (c_parser *parser) { + return c_parser_sizeof_or_countof_expression (parser, RID_SIZEOF); +} + +/* Parse a _Countof expression. */ + +static inline struct c_expr +c_parser_countof_expression (c_parser *parser) +{ + return c_parser_sizeof_or_countof_expression (parser, RID_COUNTOF); +} + +/* Parse a sizeof or _Countof expression. */ + +static struct c_expr +c_parser_sizeof_or_countof_expression (c_parser *parser, enum rid rid) +{ + const char *op_name = (rid == RID_COUNTOF) ? "_Countof" : "sizeof"; struct c_expr expr; struct c_expr result; location_t expr_loc; - gcc_assert (c_parser_next_token_is_keyword (parser, RID_SIZEOF)); + gcc_assert (c_parser_next_token_is_keyword (parser, rid)); location_t start; location_t finish = UNKNOWN_LOCATION; start = c_parser_peek_token (parser)->location; + if (rid == RID_COUNTOF) + pedwarn_c23 (start, OPT_Wpedantic, + "ISO C does not support %qs before C2Y", op_name); + c_parser_consume_token (parser); c_inhibit_evaluation_warnings++; - in_sizeof++; + if (rid == RID_COUNTOF) + in_countof++; + else + in_sizeof++; if (c_parser_next_token_is (parser, CPP_OPEN_PAREN) && c_token_starts_compound_literal (c_parser_peek_2nd_token (parser))) { @@ -10646,7 +10679,7 @@ c_parser_sizeof_expression (c_parser *parser) for parsing error; the parsing of the expression could have called record_maybe_used_decl. */ expr.set_error (); - goto sizeof_expr; + goto Xof_expr; } if (c_parser_next_token_is (parser, CPP_OPEN_BRACE)) { @@ -10654,31 +10687,45 @@ c_parser_sizeof_expression (c_parser *parser) type_name, expr_loc); finish = expr.get_finish (); - goto sizeof_expr; + goto Xof_expr; } /* sizeof ( type-name ). */ if (scspecs) - error_at (expr_loc, "storage class specifier in %<sizeof%>"); + error_at (expr_loc, "storage class specifier in %qs", op_name); if (type_name->specs->alignas_p) error_at (type_name->specs->locations[cdw_alignas], - "alignment specified for type name in %<sizeof%>"); + "alignment specified for type name in %qs", op_name); c_inhibit_evaluation_warnings--; - in_sizeof--; - result = c_expr_sizeof_type (expr_loc, type_name); + if (rid == RID_COUNTOF) + { + in_countof--; + result = c_expr_countof_type (expr_loc, type_name); + } + else + { + in_sizeof--; + result = c_expr_sizeof_type (expr_loc, type_name); + } } else { expr_loc = c_parser_peek_token (parser)->location; expr = c_parser_unary_expression (parser); finish = expr.get_finish (); - sizeof_expr: + Xof_expr: c_inhibit_evaluation_warnings--; - in_sizeof--; + if (rid == RID_COUNTOF) + in_countof--; + else + in_sizeof--; mark_exp_read (expr.value); if (TREE_CODE (expr.value) == COMPONENT_REF && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1))) - error_at (expr_loc, "%<sizeof%> applied to a bit-field"); - result = c_expr_sizeof_expr (expr_loc, expr); + error_at (expr_loc, "%qs applied to a bit-field", op_name); + if (rid == RID_COUNTOF) + result = c_expr_countof_expr (expr_loc, expr); + else + result = c_expr_sizeof_expr (expr_loc, expr); } if (finish == UNKNOWN_LOCATION) finish = start; diff --git a/gcc/c/c-tree.h b/gcc/c/c-tree.h index 2098120..723a28b 100644 --- a/gcc/c/c-tree.h +++ b/gcc/c/c-tree.h @@ -765,6 +765,7 @@ extern int c_type_dwarf_attribute (const_tree, int); /* in c-typeck.cc */ extern int in_alignof; extern int in_sizeof; +extern int in_countof; extern int in_typeof; extern bool c_in_omp_for; extern bool c_omp_array_section_p; @@ -827,6 +828,9 @@ extern tree build_external_ref (location_t, tree, bool, tree *); extern void pop_maybe_used (bool); extern struct c_expr c_expr_sizeof_expr (location_t, struct c_expr); extern struct c_expr c_expr_sizeof_type (location_t, struct c_type_name *); +extern struct c_expr c_expr_countof_expr (location_t, struct c_expr); +extern struct c_expr c_expr_countof_type (location_t loc, + struct c_type_name *); extern struct c_expr parser_build_unary_op (location_t, enum tree_code, struct c_expr); extern struct c_expr parser_build_binary_op (location_t, diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc index 0e1f842..360216b 100644 --- a/gcc/c/c-typeck.cc +++ b/gcc/c/c-typeck.cc @@ -72,6 +72,9 @@ int in_alignof; /* The level of nesting inside "sizeof". */ int in_sizeof; +/* The level of nesting inside "countof". */ +int in_countof; + /* The level of nesting inside "typeof". */ int in_typeof; @@ -3540,7 +3543,7 @@ build_external_ref (location_t loc, tree id, bool fun, tree *type) if (TREE_CODE (ref) == FUNCTION_DECL && !in_alignof) { - if (!in_sizeof && !in_typeof) + if (!in_sizeof && !in_typeof && !in_countof) C_DECL_USED (ref) = 1; else if (DECL_INITIAL (ref) == NULL_TREE && DECL_EXTERNAL (ref) @@ -3596,7 +3599,7 @@ struct maybe_used_decl { /* The decl. */ tree decl; - /* The level seen at (in_sizeof + in_typeof). */ + /* The level seen at (in_sizeof + in_typeof + in_countof). */ int level; /* The next one at this level or above, or NULL. */ struct maybe_used_decl *next; @@ -3614,7 +3617,7 @@ record_maybe_used_decl (tree decl) { struct maybe_used_decl *t = XOBNEW (&parser_obstack, struct maybe_used_decl); t->decl = decl; - t->level = in_sizeof + in_typeof; + t->level = in_sizeof + in_typeof + in_countof; t->next = maybe_used_decls; maybe_used_decls = t; } @@ -3628,7 +3631,7 @@ void pop_maybe_used (bool used) { struct maybe_used_decl *p = maybe_used_decls; - int cur_level = in_sizeof + in_typeof; + int cur_level = in_sizeof + in_typeof + in_countof; while (p && p->level > cur_level) { if (used) @@ -3738,6 +3741,110 @@ c_expr_sizeof_type (location_t loc, struct c_type_name *t) return ret; } +static bool +is_top_array_vla (tree type) +{ + bool zero, var; + tree d; + + if (TREE_CODE (type) != ARRAY_TYPE) + return false; + if (!COMPLETE_TYPE_P (type)) + return false; + + d = TYPE_DOMAIN (type); + zero = !TYPE_MAX_VALUE (d); + if (zero) + return false; + + var = (TREE_CODE (TYPE_MIN_VALUE (d)) != INTEGER_CST + || TREE_CODE (TYPE_MAX_VALUE (d)) != INTEGER_CST); + return var; +} + +/* Return the result of countof applied to EXPR. */ + +struct c_expr +c_expr_countof_expr (location_t loc, struct c_expr expr) +{ + struct c_expr ret; + if (expr.value == error_mark_node) + { + ret.value = error_mark_node; + ret.original_code = ERROR_MARK; + ret.original_type = NULL; + ret.m_decimal = 0; + pop_maybe_used (false); + } + else + { + bool expr_const_operands = true; + + tree folded_expr = c_fully_fold (expr.value, require_constant_value, + &expr_const_operands); + ret.value = c_countof_type (loc, TREE_TYPE (folded_expr)); + c_last_sizeof_arg = expr.value; + c_last_sizeof_loc = loc; + ret.original_code = COUNTOF_EXPR; + ret.original_type = NULL; + ret.m_decimal = 0; + if (is_top_array_vla (TREE_TYPE (folded_expr))) + { + /* countof is evaluated when given a vla. */ + ret.value = build2 (C_MAYBE_CONST_EXPR, TREE_TYPE (ret.value), + folded_expr, ret.value); + C_MAYBE_CONST_EXPR_NON_CONST (ret.value) = !expr_const_operands; + SET_EXPR_LOCATION (ret.value, loc); + } + pop_maybe_used (is_top_array_vla (TREE_TYPE (folded_expr))); + } + return ret; +} + +/* Return the result of countof applied to T, a structure for the type + name passed to countof (rather than the type itself). LOC is the + location of the original expression. */ + +struct c_expr +c_expr_countof_type (location_t loc, struct c_type_name *t) +{ + tree type; + struct c_expr ret; + tree type_expr = NULL_TREE; + bool type_expr_const = true; + type = groktypename (t, &type_expr, &type_expr_const); + ret.value = c_countof_type (loc, type); + c_last_sizeof_arg = type; + c_last_sizeof_loc = loc; + ret.original_code = COUNTOF_EXPR; + ret.original_type = NULL; + ret.m_decimal = 0; + if (type == error_mark_node) + { + ret.value = error_mark_node; + ret.original_code = ERROR_MARK; + } + else + if ((type_expr || TREE_CODE (ret.value) == INTEGER_CST) + && is_top_array_vla (type)) + { + /* If the type is a [*] array, it is a VLA but is represented as + having a size of zero. In such a case we must ensure that + the result of countof does not get folded to a constant by + c_fully_fold, because if the number of elements is evaluated + the result is not constant and so + constraints on zero or negative size arrays must not be applied + when this countof call is inside another array declarator. */ + if (!type_expr) + type_expr = integer_zero_node; + ret.value = build2 (C_MAYBE_CONST_EXPR, TREE_TYPE (ret.value), + type_expr, ret.value); + C_MAYBE_CONST_EXPR_NON_CONST (ret.value) = !type_expr_const; + } + pop_maybe_used (type != error_mark_node ? is_top_array_vla (type) : false); + return ret; +} + /* Build a function call to function FUNCTION with parameters PARAMS. The function call is at LOC. PARAMS is a list--a chain of TREE_LIST nodes--in which the diff --git a/gcc/cgraph.cc b/gcc/cgraph.cc index ac0f251..3f95ca1 100644 --- a/gcc/cgraph.cc +++ b/gcc/cgraph.cc @@ -3019,7 +3019,14 @@ cgraph_edge::maybe_hot_p (sreal scale) /* Use IPA count and if it s not available appy local heuristics. */ if (c.initialized_p ()) - return maybe_hot_count_p (NULL, c * scale); + { + /* A special case; AFDO zero means that function may quite possibly + be executed few times per execution. If scale is large, we still + want to consider the call hot. */ + if (c.quality () == AFDO) + c = c.force_nonzero (); + return maybe_hot_count_p (NULL, c * scale); + } if (!count.initialized_p ()) return true; cgraph_node *where = caller->inlined_to ? caller->inlined_to : caller; diff --git a/gcc/config/aarch64/aarch64-cores.def b/gcc/config/aarch64/aarch64-cores.def index 1209630..24b7cd3 100644 --- a/gcc/config/aarch64/aarch64-cores.def +++ b/gcc/config/aarch64/aarch64-cores.def @@ -132,7 +132,7 @@ AARCH64_CORE("octeontx2f95mm", octeontx2f95mm, cortexa57, V8_2A, (CRYPTO, PROFI /* Fujitsu ('F') cores. */ AARCH64_CORE("a64fx", a64fx, a64fx, V8_2A, (F16, SVE), a64fx, 0x46, 0x001, -1) -AARCH64_CORE("fujitsu-monaka", fujitsu_monaka, cortexa57, V9_3A, (F16, FP8, LS64, RNG, CRYPTO, SVE2_AES, SVE2_BITPERM, SVE2_SHA3, SVE2_SM4), fujitsu_monaka, 0x46, 0x003, -1) +AARCH64_CORE("fujitsu-monaka", fujitsu_monaka, cortexa57, V9_3A, (F16, FAMINMAX, FP8FMA, FP8DOT2, FP8DOT4, LS64, LUT, RNG, CRYPTO, SVE2_AES, SVE2_BITPERM, SVE2_SHA3, SVE2_SM4), fujitsu_monaka, 0x46, 0x003, -1) /* HiSilicon ('H') cores. */ AARCH64_CORE("tsv110", tsv110, tsv110, V8_2A, (CRYPTO, F16), tsv110, 0x48, 0xd01, -1) diff --git a/gcc/config/aarch64/gcc-auto-profile b/gcc/config/aarch64/gcc-auto-profile new file mode 100644 index 0000000..4d5c2e3 --- /dev/null +++ b/gcc/config/aarch64/gcc-auto-profile @@ -0,0 +1,53 @@ +#!/bin/sh +# Profile workload for gcc profile feedback (autofdo) using Linux perf. +# Copyright The GNU Toolchain Authors. +# +# This file is part of GCC. +# +# GCC is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 3, or (at your option) any later +# version. + +# GCC is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. */ + +# Run perf record with branch stack sampling and check for +# specific error message to see if it is supported. +use_brbe=true +output=$(perf record -j any,u /bin/true 2>&1) +case "$output" in + *"PMU Hardware or event type doesn't support branch stack sampling."*) + use_brbe=false;; + *) + use_brbe=true;; +esac + +FLAGS=u +if [ "$1" = "--kernel" ] ; then + FLAGS=k + shift +elif [ "$1" = "--all" ] ; then + FLAGS=u,k + shift +fi + +if [ "$use_brbe" = true ] ; then + if grep -q hypervisor /proc/cpuinfo ; then + echo >&2 "Warning: branch profiling may not be functional in VMs" + fi + set -x + perf record -j any,$FLAGS "$@" + set +x +else + echo >&2 "Warning: branch profiling may not be functional without BRBE" + set -x + perf record "$@" + set +x +fi diff --git a/gcc/config/i386/cygming.h b/gcc/config/i386/cygming.h index 743cc38..0a3173c 100644 --- a/gcc/config/i386/cygming.h +++ b/gcc/config/i386/cygming.h @@ -246,9 +246,10 @@ do { \ #undef ASM_OUTPUT_LABELREF #define ASM_OUTPUT_LABELREF(STREAM, NAME) \ do { \ + const char *prefix = ""; \ if ((NAME)[0] != FASTCALL_PREFIX) \ - fputs (user_label_prefix, (STREAM)); \ - fputs ((NAME), (STREAM)); \ + prefix = user_label_prefix; \ + ix86_asm_output_labelref ((STREAM), prefix, (NAME)); \ } while (0) /* This does much the same in memory rather than to a stream. */ diff --git a/gcc/config/i386/gcc-auto-profile b/gcc/config/i386/gcc-auto-profile index 528b34e..0e9e5fe 100755 --- a/gcc/config/i386/gcc-auto-profile +++ b/gcc/config/i386/gcc-auto-profile @@ -24,8 +24,16 @@ if [ "$1" = "--all" ] ; then shift fi -if ! grep -q Intel /proc/cpuinfo ; then - echo >&2 "Only Intel CPUs supported" +if grep -q AuthenticAMD /proc/cpuinfo ; then + vendor=AMD + if ! grep -q " brs" /proc/cpuinfo && ! grep -q amd_lbr_v2 /proc/cpuinfo ; then + echo >&2 "AMD CPU with brs (Zen 3) or amd_lbr_v2 (Zen 4+) feature is required" + exit 1 + fi +elif grep -q Intel /proc/cpuinfo ; then + vendor=Intel +else + echo >&2 "Only AMD and Intel CPUs supported" exit 1 fi @@ -33,7 +41,7 @@ if grep -q hypervisor /proc/cpuinfo ; then echo >&2 "Warning: branch profiling may not be functional in VMs" fi -case `grep -E -q "^cpu family\s*: 6" /proc/cpuinfo && +case `test $vendor = Intel && grep -E -q "^cpu family\s*: 6" /proc/cpuinfo && grep -E "^model\s*:" /proc/cpuinfo | head -n1` in model*:\ 46|\ model*:\ 30|\ @@ -82,6 +90,8 @@ model*:\ 126|\ model*:\ 167|\ model*:\ 140|\ model*:\ 141|\ +model*:\ 143|\ +model*:\ 207|\ model*:\ 106|\ model*:\ 108|\ model*:\ 173|\ @@ -89,15 +99,20 @@ model*:\ 174) E="cpu/event=0xc4,umask=0x20/$FLAGS" ;; model*:\ 134|\ model*:\ 150|\ model*:\ 156) E="cpu/event=0xc4,umask=0xfe/p$FLAGS" ;; -model*:\ 143|\ -model*:\ 207) E="cpu/event=0xc4,umask=0x20/p$FLAGS" ;; -model*:\ 190) E="cpu/event=0xc4,umask=0xc0/$FLAGS" ;; +model*:\ 190|\ +model*:\ 175|\ +model*:\ 182) E="cpu/event=0xc4,umask=0xc0/$FLAGS" ;; model*:\ 190) E="cpu/event=0xc4,umask=0xfe/$FLAGS" ;; *) if perf list br_inst_retired | grep -q br_inst_retired.near_taken ; then E=br_inst_retired.near_taken:p + elif perf list ex_ret_brn_tkn | grep -q ex_ret_brn_tkn ; then + E=ex_ret_brn_tkn:P$FLAGS + elif $vendor = Intel ; then +echo >&2 "Unknown Intel CPU. Run contrib/gen_autofdo_event.py --all --script to update script." + exit 1 else -echo >&2 "Unknown CPU. Run contrib/gen_autofdo_event.py --all --script to update script." +echo >&2 "AMD CPU without support for ex_ret_brn_tkn event" exit 1 fi ;; esac diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h index e85b925..10863ab 100644 --- a/gcc/config/i386/i386-protos.h +++ b/gcc/config/i386/i386-protos.h @@ -199,6 +199,7 @@ extern int ix86_attr_length_vex_default (rtx_insn *, bool, bool); extern rtx ix86_libcall_value (machine_mode); extern bool ix86_function_arg_regno_p (int); extern void ix86_asm_output_function_label (FILE *, const char *, tree); +extern void ix86_asm_output_labelref (FILE *, const char *, const char *); extern void ix86_call_abi_override (const_tree); extern int ix86_reg_parm_stack_space (const_tree); diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc index 5cb66da..d48654a 100644 --- a/gcc/config/i386/i386.cc +++ b/gcc/config/i386/i386.cc @@ -1716,6 +1716,19 @@ ix86_asm_output_function_label (FILE *out_file, const char *fname, } } +/* Output a user-defined label. In AT&T syntax, registers are prefixed + with %, so labels require no punctuation. In Intel syntax, registers + are unprefixed, so labels may clash with registers or other operators, + and require quoting. */ +void +ix86_asm_output_labelref (FILE *file, const char *prefix, const char *label) +{ + if (ASSEMBLER_DIALECT == ASM_ATT) + fprintf (file, "%s%s", prefix, label); + else + fprintf (file, "\"%s%s\"", prefix, label); +} + /* Implementation of call abi switching target hook. Specific to FNDECL the specific call register sets are set. See also ix86_conditional_register_usage for more details. */ @@ -25172,12 +25185,18 @@ ix86_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost, /* One vinserti128 for combining two SSE vectors for AVX256. */ else if (GET_MODE_BITSIZE (mode) == 256) return ((n - 2) * ix86_cost->sse_op - + ix86_vec_cost (mode, ix86_cost->addss)); + + ix86_vec_cost (mode, ix86_cost->sse_op)); /* One vinserti64x4 and two vinserti128 for combining SSE and AVX256 vectors to AVX512. */ else if (GET_MODE_BITSIZE (mode) == 512) - return ((n - 4) * ix86_cost->sse_op - + 3 * ix86_vec_cost (mode, ix86_cost->addss)); + { + machine_mode half_mode + = mode_for_vector (GET_MODE_INNER (mode), + GET_MODE_NUNITS (mode) / 2).require (); + return ((n - 4) * ix86_cost->sse_op + + 2 * ix86_vec_cost (half_mode, ix86_cost->sse_op) + + ix86_vec_cost (mode, ix86_cost->sse_op)); + } gcc_unreachable (); } @@ -26035,7 +26054,22 @@ ix86_vector_costs::add_stmt_cost (int count, vect_cost_for_stmt kind, else { m_num_gpr_needed[where]++; - stmt_cost += COSTS_N_INSNS (ix86_cost->integer_to_sse) / 2; + + int cost = COSTS_N_INSNS (ix86_cost->integer_to_sse) / 2; + + /* For integer construction, the number of actual GPR -> XMM + moves will be somewhere between 0 and n. + We do not have very good idea about actual number, since + the source may be a constant, memory or a chain of + instructions that will be later converted by + scalar-to-vector pass. */ + if (kind == vec_construct + && GET_MODE_BITSIZE (mode) == 256) + cost *= 2; + else if (kind == vec_construct + && GET_MODE_BITSIZE (mode) == 512) + cost *= 3; + stmt_cost += cost; } } } diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index 5aa056f..ccc62fc 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -2267,6 +2267,13 @@ extern unsigned int const svr4_debugger_register_map[FIRST_PSEUDO_REGISTER]; } while (0) #endif +/* In Intel syntax, we have to quote user-defined labels that would + match (unprefixed) registers or operators. */ + +#undef ASM_OUTPUT_LABELREF +#define ASM_OUTPUT_LABELREF(STREAM, NAME) \ + ix86_asm_output_labelref ((STREAM), user_label_prefix, (NAME)) + /* Under some conditions we need jump tables in the text section, because the assembler cannot handle label differences between sections. */ diff --git a/gcc/config/i386/x86-tune-costs.h b/gcc/config/i386/x86-tune-costs.h index e509129..b08081e 100644 --- a/gcc/config/i386/x86-tune-costs.h +++ b/gcc/config/i386/x86-tune-costs.h @@ -2252,7 +2252,7 @@ struct processor_costs znver5_cost = { COSTS_N_INSNS (1), /* cost of cheap SSE instruction. */ /* ADDSS has throughput 2 and latency 2 (in some cases when source is another addition). */ - COSTS_N_INSNS (3), /* cost of ADDSS/SD SUBSS/SD insns. */ + COSTS_N_INSNS (2), /* cost of ADDSS/SD SUBSS/SD insns. */ /* MULSS has throughput 2 and latency 3. */ COSTS_N_INSNS (3), /* cost of MULSS instruction. */ COSTS_N_INSNS (3), /* cost of MULSD instruction. */ diff --git a/gcc/config/microblaze/microblaze.cc b/gcc/config/microblaze/microblaze.cc index db8e334..2ab5ada 100644 --- a/gcc/config/microblaze/microblaze.cc +++ b/gcc/config/microblaze/microblaze.cc @@ -239,6 +239,10 @@ section *sdata2_section; #define TARGET_HAVE_TLS true #endif +/* MicroBlaze does not do speculative execution. */ +#undef TARGET_HAVE_SPECULATION_SAFE_VALUE +#define TARGET_HAVE_SPECULATION_SAFE_VALUE speculation_safe_value_not_needed + /* Return truth value if a CONST_DOUBLE is ok to be a legitimate constant. */ static bool microblaze_const_double_ok (rtx op, machine_mode mode) diff --git a/gcc/config/riscv/autovec.md b/gcc/config/riscv/autovec.md index 9e51e3c..a54f552 100644 --- a/gcc/config/riscv/autovec.md +++ b/gcc/config/riscv/autovec.md @@ -2491,19 +2491,12 @@ (sign_extend:VWEXTI (match_operand:<V_DOUBLE_TRUNC> 2 "register_operand"))))))] "TARGET_VECTOR" -{ - /* First emit a widening addition. */ - rtx tmp1 = gen_reg_rtx (<MODE>mode); - rtx ops1[] = {tmp1, operands[1], operands[2]}; - insn_code icode = code_for_pred_dual_widen (PLUS, SIGN_EXTEND, <MODE>mode); - riscv_vector::emit_vlmax_insn (icode, riscv_vector::BINARY_OP, ops1); - - /* Then a narrowing shift. */ - rtx ops2[] = {operands[0], tmp1, const1_rtx}; - icode = code_for_pred_narrow_scalar (ASHIFTRT, <MODE>mode); - riscv_vector::emit_vlmax_insn (icode, riscv_vector::BINARY_OP, ops2); - DONE; -}) + { + insn_code icode = code_for_pred (UNSPEC_VAADD, <V_DOUBLE_TRUNC>mode); + riscv_vector::emit_vlmax_insn (icode, riscv_vector::BINARY_OP_VXRM_RDN, operands); + DONE; + } +) (define_expand "avg<v_double_trunc>3_ceil" [(set (match_operand:<V_DOUBLE_TRUNC> 0 "register_operand") diff --git a/gcc/config/riscv/bitmanip.md b/gcc/config/riscv/bitmanip.md index 85ace28..21426f4 100644 --- a/gcc/config/riscv/bitmanip.md +++ b/gcc/config/riscv/bitmanip.md @@ -846,14 +846,12 @@ [(set_attr "type" "bitmanip")]) ;; In case we have "val & ~IMM" where ~IMM has 2 bits set. -(define_insn_and_split "*bclri<mode>_nottwobits" - [(set (match_operand:X 0 "register_operand" "=r") - (and:X (match_operand:X 1 "register_operand" "r") - (match_operand:X 2 "const_nottwobits_not_arith_operand" "i"))) - (clobber (match_scratch:X 3 "=&r"))] +(define_split + [(set (match_operand:X 0 "register_operand") + (and:X (match_operand:X 1 "register_operand") + (match_operand:X 2 "const_nottwobits_not_arith_operand"))) + (clobber (match_operand:X 3 "register_operand"))] "TARGET_ZBS && !paradoxical_subreg_p (operands[1])" - "#" - "&& reload_completed" [(set (match_dup 3) (and:X (match_dup 1) (match_dup 4))) (set (match_dup 0) (and:X (match_dup 3) (match_dup 5)))] { @@ -862,20 +860,17 @@ operands[4] = GEN_INT (~bits | topbit); operands[5] = GEN_INT (~topbit); -} -[(set_attr "type" "bitmanip")]) +}) ;; In case of a paradoxical subreg, the sign bit and the high bits are ;; not allowed to be changed -(define_insn_and_split "*bclridisi_nottwobits" - [(set (match_operand:DI 0 "register_operand" "=r") - (and:DI (match_operand:DI 1 "register_operand" "r") - (match_operand:DI 2 "const_nottwobits_not_arith_operand" "i"))) - (clobber (match_scratch:DI 3 "=&r"))] +(define_split + [(set (match_operand:DI 0 "register_operand") + (and:DI (match_operand:DI 1 "register_operand") + (match_operand:DI 2 "const_nottwobits_not_arith_operand"))) + (clobber (match_operand:DI 3 "register_operand"))] "TARGET_64BIT && TARGET_ZBS && clz_hwi (~UINTVAL (operands[2])) > 33" - "#" - "&& reload_completed" [(set (match_dup 3) (and:DI (match_dup 1) (match_dup 4))) (set (match_dup 0) (and:DI (match_dup 3) (match_dup 5)))] { @@ -884,8 +879,7 @@ operands[4] = GEN_INT (~bits | topbit); operands[5] = GEN_INT (~topbit); -} -[(set_attr "type" "bitmanip")]) +}) ;; An outer AND with a constant where bits 31..63 are 0 can be seen as ;; a virtual zero extension from 31 to 64 bits. @@ -1061,14 +1055,12 @@ [(set_attr "type" "bitmanip")]) ;; Same to use blcri + andi and blcri + bclri -(define_insn_and_split "*andi<mode>_extrabit" - [(set (match_operand:X 0 "register_operand" "=r") - (and:X (match_operand:X 1 "register_operand" "r") - (match_operand:X 2 "not_uimm_extra_bit_or_nottwobits" "i"))) - (clobber (match_scratch:X 3 "=&r"))] +(define_split + [(set (match_operand:X 0 "register_operand") + (and:X (match_operand:X 1 "register_operand") + (match_operand:X 2 "not_uimm_extra_bit_or_nottwobits"))) + (clobber (match_operand:X 3 "register_operand"))] "TARGET_ZBS && !not_single_bit_mask_operand (operands[2], VOIDmode)" - "#" - "&& reload_completed" [(set (match_dup 3) (and:X (match_dup 1) (match_dup 4))) (set (match_dup 0) (and:X (match_dup 3) (match_dup 5)))] { @@ -1077,8 +1069,7 @@ operands[4] = GEN_INT (bits | topbit); operands[5] = GEN_INT (~topbit); -} -[(set_attr "type" "bitmanip")]) +}) ;; If we have the ZBA extension, then we can clear the upper half of a 64 ;; bit object with a zext.w. So if we have AND where the constant would diff --git a/gcc/config/riscv/riscv-v.cc b/gcc/config/riscv/riscv-v.cc index a6ee582..6162797 100644 --- a/gcc/config/riscv/riscv-v.cc +++ b/gcc/config/riscv/riscv-v.cc @@ -5535,6 +5535,8 @@ expand_vx_binary_vec_dup_vec (rtx op_0, rtx op_1, rtx op_2, case PLUS: case AND: case IOR: + case XOR: + case MULT: icode = code_for_pred_scalar (code, mode); break; case MINUS: @@ -5563,6 +5565,8 @@ expand_vx_binary_vec_vec_dup (rtx op_0, rtx op_1, rtx op_2, case MINUS: case AND: case IOR: + case XOR: + case MULT: icode = code_for_pred_scalar (code, mode); break; default: diff --git a/gcc/config/riscv/riscv-vector-builtins-shapes.cc b/gcc/config/riscv/riscv-vector-builtins-shapes.cc index b855d4c..9832eb9 100644 --- a/gcc/config/riscv/riscv-vector-builtins-shapes.cc +++ b/gcc/config/riscv/riscv-vector-builtins-shapes.cc @@ -908,6 +908,8 @@ struct vset_def : public build_base { poly_int64 outer_size = GET_MODE_SIZE (c.arg_mode (0)); poly_int64 inner_size = GET_MODE_SIZE (c.arg_mode (2)); + if (maybe_eq (inner_size, 0)) + return false; unsigned int nvecs = exact_div (outer_size, inner_size).to_constant (); return c.require_immediate (1, 0, nvecs - 1); } @@ -920,6 +922,8 @@ struct vget_def : public misc_def { poly_int64 outer_size = GET_MODE_SIZE (c.arg_mode (0)); poly_int64 inner_size = GET_MODE_SIZE (c.ret_mode ()); + if (maybe_eq (inner_size, 0)) + return false; unsigned int nvecs = exact_div (outer_size, inner_size).to_constant (); return c.require_immediate (1, 0, nvecs - 1); } diff --git a/gcc/config/riscv/riscv-vector-builtins.h b/gcc/config/riscv/riscv-vector-builtins.h index ffc2893..1f2587a 100644 --- a/gcc/config/riscv/riscv-vector-builtins.h +++ b/gcc/config/riscv/riscv-vector-builtins.h @@ -331,45 +331,7 @@ struct function_group_info /* Return true if required extension is enabled */ bool match (required_ext ext_value) const { - switch (ext_value) - { - case VECTOR_EXT: - return TARGET_VECTOR; - case ZVBB_EXT: - return TARGET_ZVBB; - case ZVBB_OR_ZVKB_EXT: - return (TARGET_ZVBB || TARGET_ZVKB); - case ZVBC_EXT: - return TARGET_ZVBC; - case ZVKG_EXT: - return TARGET_ZVKG; - case ZVKNED_EXT: - return TARGET_ZVKNED; - case ZVKNHA_OR_ZVKNHB_EXT: - return (TARGET_ZVKNHA || TARGET_ZVKNHB); - case ZVKNHB_EXT: - return TARGET_ZVKNHB; - case ZVKSED_EXT: - return TARGET_ZVKSED; - case ZVKSH_EXT: - return TARGET_ZVKSH; - case XTHEADVECTOR_EXT: - return TARGET_XTHEADVECTOR; - case ZVFBFMIN_EXT: - return TARGET_ZVFBFMIN; - case ZVFBFWMA_EXT: - return TARGET_ZVFBFWMA; - case XSFVQMACCQOQ_EXT: - return TARGET_XSFVQMACCQOQ; - case XSFVQMACCDOD_EXT: - return TARGET_XSFVQMACCDOD; - case XSFVFNRCLIPXFQF_EXT: - return TARGET_XSFVFNRCLIPXFQF; - case XSFVCP_EXT: - return TARGET_XSFVCP; - default: - gcc_unreachable (); - } + return required_extensions_specified (ext_value); } /* The base name, as a string. */ const char *base_name; diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index eaaca36..d3cee96 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -3918,6 +3918,8 @@ riscv_rtx_costs (rtx x, machine_mode mode, int outer_code, int opno ATTRIBUTE_UN case MINUS: case AND: case IOR: + case XOR: + case MULT: { rtx op_0 = XEXP (x, 0); rtx op_1 = XEXP (x, 1); @@ -14621,19 +14623,70 @@ synthesize_and (rtx operands[3]) return true; } + /* The special cases didn't apply. It's entirely possible we may + want to combine some of the ideas above with bclr, but for now + those are deferred until we see them popping up in practice. */ + + unsigned HOST_WIDE_INT ival = ~INTVAL (operands[2]); + + /* Clear as many bits using andi as we can. */ + if ((ival & HOST_WIDE_INT_UC (0x7ff)) != 0x0) + { + ival &= ~HOST_WIDE_INT_UC (0x7ff); + budget--; + } + + /* And handle remaining bits via bclr. */ + while (TARGET_ZBS && ival) + { + unsigned HOST_WIDE_INT tmpval = HOST_WIDE_INT_UC (1) << ctz_hwi (ival); + ival &= ~tmpval; + budget--; + } + /* If the remaining budget has gone to less than zero, it forces the value into a register and performs the AND operation. It returns TRUE to the caller so the caller knows code generation is complete. FIXME: This is hacked to always be enabled until the last patch in the series is enabled. */ - if (1) + if (ival || budget < 0) { rtx x = force_reg (word_mode, operands[2]); x = gen_rtx_AND (word_mode, operands[1], x); emit_insn (gen_rtx_SET (operands[0], x)); return true; } + + /* Synthesis is better than loading the constant. */ + ival = ~INTVAL (operands[2]); + input = operands[1]; + + /* Clear any of the lower 11 bits we need. */ + if ((ival & HOST_WIDE_INT_UC (0x7ff)) != 0) + { + rtx x = GEN_INT (~(ival & HOST_WIDE_INT_UC (0x7ff))); + x = gen_rtx_AND (word_mode, input, x); + output = gen_reg_rtx (word_mode); + emit_insn (gen_rtx_SET (output, x)); + input = output; + ival &= ~HOST_WIDE_INT_UC (0x7ff); + } + + /* Clear the rest with bclr. */ + while (ival) + { + unsigned HOST_WIDE_INT tmpval = HOST_WIDE_INT_UC (1) << ctz_hwi (ival); + rtx x = GEN_INT (~tmpval); + x = gen_rtx_AND (word_mode, input, x); + output = gen_reg_rtx (word_mode); + emit_insn (gen_rtx_SET (output, x)); + input = output; + ival &= ~tmpval; + } + + emit_move_insn (operands[0], input); + return true; } diff --git a/gcc/config/riscv/vector-iterators.md b/gcc/config/riscv/vector-iterators.md index a50b7fd..2bd99ee 100644 --- a/gcc/config/riscv/vector-iterators.md +++ b/gcc/config/riscv/vector-iterators.md @@ -4042,7 +4042,7 @@ ]) (define_code_iterator any_int_binop_no_shift_vx [ - plus minus and ior + plus minus and ior xor mult ]) (define_code_iterator any_int_unop [neg not]) diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index 7ea3777..7375c36 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -55,7 +55,6 @@ #include "output.h" #include "common/common-target.h" #include "langhooks.h" -#include "reload.h" #include "sched-int.h" #include "gimplify.h" #include "gimple-iterator.h" diff --git a/gcc/config/s390/vector.md b/gcc/config/s390/vector.md index cdd55b6..6f4e192 100644 --- a/gcc/config/s390/vector.md +++ b/gcc/config/s390/vector.md @@ -75,6 +75,8 @@ V1DF V2DF (V1TF "TARGET_VXE") (TF "TARGET_VXE")]) +(define_mode_iterator VF [(V2SF "TARGET_VXE") (V4SF "TARGET_VXE") V2DF]) + ; All modes present in V_HW1 and VFT. (define_mode_iterator V_HW1_FT [V16QI V8HI V4SI V2DI V1TI V1DF V2DF (V1SF "TARGET_VXE") (V2SF "TARGET_VXE") @@ -506,26 +508,89 @@ UNSPEC_VEC_SET))] "TARGET_VX") +; Iterator for vec_set that does not use special float/vect overlay tricks +(define_mode_iterator VEC_SET_NONFLOAT + [V1QI V2QI V4QI V8QI V16QI V1HI V2HI V4HI V8HI V1SI V2SI V4SI V1DI V2DI V2SF V4SF]) +; Iterator for single element float vectors +(define_mode_iterator VEC_SET_SINGLEFLOAT [(V1SF "TARGET_VXE") V1DF (V1TF "TARGET_VXE")]) + ; FIXME: Support also vector mode operands for 1 ; FIXME: A target memory operand seems to be useful otherwise we end ; up with vl vlvgg vst. Shouldn't the middle-end be able to handle ; that itself? ; vlvgb, vlvgh, vlvgf, vlvgg, vleb, vleh, vlef, vleg, vleib, vleih, vleif, vleig (define_insn "*vec_set<mode>" - [(set (match_operand:V 0 "register_operand" "=v,v,v") - (unspec:V [(match_operand:<non_vec> 1 "general_operand" "d,R,K") - (match_operand:SI 2 "nonmemory_operand" "an,I,I") - (match_operand:V 3 "register_operand" "0,0,0")] - UNSPEC_VEC_SET))] + [(set (match_operand:VEC_SET_NONFLOAT 0 "register_operand" "=v,v,v") + (unspec:VEC_SET_NONFLOAT + [(match_operand:<non_vec> 1 "general_operand" "d,R,K") + (match_operand:SI 2 "nonmemory_operand" "an,I,I") + (match_operand:VEC_SET_NONFLOAT 3 "register_operand" "0,0,0")] + UNSPEC_VEC_SET))] "TARGET_VX && (!CONST_INT_P (operands[2]) - || UINTVAL (operands[2]) < GET_MODE_NUNITS (<V:MODE>mode))" + || UINTVAL (operands[2]) < GET_MODE_NUNITS (<VEC_SET_NONFLOAT:MODE>mode))" "@ vlvg<bhfgq>\t%v0,%1,%Y2 vle<bhfgq>\t%v0,%1,%2 vlei<bhfgq>\t%v0,%1,%2" [(set_attr "op_type" "VRS,VRX,VRI")]) +(define_insn "*vec_set<mode>" + [(set (match_operand:VEC_SET_SINGLEFLOAT 0 "register_operand" "=v,v") + (unspec:VEC_SET_SINGLEFLOAT + [(match_operand:<non_vec> 1 "general_operand" "v,R") + (match_operand:SI 2 "nonmemory_operand" "an,I") + (match_operand:VEC_SET_SINGLEFLOAT 3 "register_operand" "0,0")] + UNSPEC_VEC_SET))] + "TARGET_VX" + "@ + vlr\t%v0,%v1 + vle<bhfgq>\t%v0,%1,0" + [(set_attr "op_type" "VRR,VRX")]) + +(define_insn "*vec_setv2df" + [(set (match_operand:V2DF 0 "register_operand" "=v,v,v,v") + (unspec:V2DF [(match_operand:DF 1 "general_operand" "d,R,K,v") + (match_operand:SI 2 "nonmemory_operand" "an,I,I,n") + (match_operand:V2DF 3 "register_operand" "0,0,0,0")] + UNSPEC_VEC_SET))] + "TARGET_VX + && (!CONST_INT_P (operands[2]) + || UINTVAL (operands[2]) < GET_MODE_NUNITS (V2DFmode))" + "@ + vlvgg\t%v0,%1,%Y2 + vleg\t%v0,%1,%2 + vleig\t%v0,%1,%2 + #" + [(set_attr "op_type" "VRS,VRX,VRI,*")]) + +(define_split + [(set (match_operand:V2DF 0 "register_operand" "") + (unspec:V2DF [(match_operand:DF 1 "register_operand" "") + (match_operand:SI 2 "const_int_operand" "") + (match_operand:V2DF 3 "register_operand" "")] + UNSPEC_VEC_SET))] + "TARGET_VX + && (UINTVAL (operands[2]) < GET_MODE_NUNITS (V2DFmode)) + && reload_completed + && VECTOR_REGNO_P (REGNO (operands[1]))" + [(set (match_dup 0) + (vec_select:V2DF + (vec_concat:V4DF + (match_dup 1) + (match_dup 3)) + (parallel [(const_int 0) (match_dup 4)])))] +{ + operands[1] = gen_rtx_REG (V2DFmode, REGNO (operands[1])); + if (UINTVAL (operands[2]) == 0) + operands[4] = GEN_INT (3); + else + { + std::swap (operands[1], operands[3]); + operands[4] = GEN_INT (2); + } +}) + ; vlvgb, vlvgh, vlvgf, vlvgg (define_insn "*vec_set<mode>_plus" [(set (match_operand:V 0 "register_operand" "=v") @@ -562,18 +627,66 @@ (define_insn "*vec_extract<mode>" [(set (match_operand:<non_vec> 0 "nonimmediate_operand" "=d,R") (vec_select:<non_vec> - (match_operand:V 1 "nonmemory_operand" "v,v") + (match_operand:VI 1 "nonmemory_operand" "v,v") (parallel [(match_operand:SI 2 "nonmemory_operand" "an,I")])))] "TARGET_VX" { if (CONST_INT_P (operands[2])) - operands[2] = GEN_INT (UINTVAL (operands[2]) & (GET_MODE_NUNITS (<V:MODE>mode) - 1)); + operands[2] = GEN_INT (UINTVAL (operands[2]) & (GET_MODE_NUNITS (<VI:MODE>mode) - 1)); if (which_alternative == 0) return "vlgv<bhfgq>\t%0,%v1,%Y2"; return "vste<bhfgq>\t%v1,%0,%2"; } - [(set_attr "op_type" "VRS,VRX")]) + [(set_attr "op_type" "VRS,VRX") + (set_attr "mnemonic" "vlgv<bhfgq>,vste<bhfgq>")]) + +(define_insn "*vec_extract<mode>" + [(set (match_operand:<non_vec> 0 "nonimmediate_operand" "=d,R,v") + (vec_select:<non_vec> + (match_operand:VF 1 "nonmemory_operand" "v,v,v") + (parallel + [(match_operand:SI 2 "nonmemory_operand" "an,I,n")])))] + "TARGET_VX" + { + if (CONST_INT_P (operands[2])) + operands[2] = GEN_INT (UINTVAL (operands[2]) & (GET_MODE_NUNITS (<VF:MODE>mode) - 1)); + if (which_alternative == 0) + return "vlgv<bhfgq>\t%0,%v1,%Y2"; + else if (which_alternative == 1) + return "vste<bhfgq>\t%v1,%0,%2"; + else + return "#"; + } + [(set_attr "op_type" "VRS,VRX,*") + (set_attr "mnemonic" "vlgv<bhfgq>,vste<bhfgq>,*")]) + +(define_split + [(set (match_operand:<non_vec> 0 "register_operand" "") + (vec_select:<non_vec> + (match_operand:VF 1 "register_operand" "") + (parallel + [(match_operand:SI 2 "const_int_operand" "")])))] + "TARGET_VX && reload_completed && VECTOR_REGNO_P (REGNO (operands[0]))" + [(set (match_dup 0) + (vec_duplicate:VF + (vec_select:<non_vec> + (match_dup 1) + (parallel [(match_dup 2)]))))] +{ + unsigned HOST_WIDE_INT idx = UINTVAL (operands[2]) & (GET_MODE_NUNITS (<VF:MODE>mode) - 1); + if (idx == 0) + { + rtx dest = gen_rtx_REG (<VF:MODE>mode, REGNO (operands[0])); + emit_insn (gen_mov<VF:mode> (dest, operands[1])); + DONE; + } + else + { + operands[0] = gen_rtx_REG (<VF:MODE>mode, REGNO (operands[0])); + operands[2] = GEN_INT (idx); + } +}) ; vlgvb, vlgvh, vlgvf, vlgvg (define_insn "*vec_extract<mode>_plus" @@ -611,10 +724,10 @@ ; Replicate from vector element ; vrepb, vreph, vrepf, vrepg (define_insn "*vec_splat<mode>" - [(set (match_operand:V_128_NOSINGLE 0 "register_operand" "=v") - (vec_duplicate:V_128_NOSINGLE + [(set (match_operand:V 0 "register_operand" "=v") + (vec_duplicate:V (vec_select:<non_vec> - (match_operand:V_128_NOSINGLE 1 "register_operand" "v") + (match_operand:V 1 "register_operand" "v") (parallel [(match_operand:QI 2 "const_mask_operand" "C")]))))] "TARGET_VX && UINTVAL (operands[2]) < GET_MODE_NUNITS (<MODE>mode)" diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 278f75f..db79783 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,47 @@ +2025-05-28 Jason Merrill <jason@redhat.com> + + * module.cc (module_state::write_namespaces): Write + using-directives. + (module_state::read_namespaces): And read them. + * name-lookup.cc (add_using_namespace): Add overload. Build a + USING_DECL for modules. + (name_lookup::search_usings, name_lookup::queue_usings) + (using_directives_contain_std_p): Strip the USING_DECL. + * name-lookup.h: Declare it. + * parser.cc (cp_parser_import_declaration): Set MK_EXPORTING + for export import. + +2025-05-27 Iain Sandoe <iain@sandoe.co.uk> + + * coroutines.cc (cp_coroutine_transform::build_ramp_function): + Replace TRUTH_AND_EXPR with TRUTH_ANDIF_EXPR in three places. + +2025-05-26 Tobias Burnus <tburnus@baylibre.com> + + PR c++/120413 + * semantics.cc (finish_omp_target_clauses_r): Handle + BIND_EXPR with empty BIND_EXPR_BLOCK. + +2025-05-26 Jason Merrill <jason@redhat.com> + + * cp-tree.h: Declare tinst_dump_id. + * cp-objcp-common.cc (cp_register_dumps): Set it. + * pt.cc (push_tinst_level_loc): Dump it. + (reopen_tinst_level): Here too. + (tinst_complete_p): New. + (instantiate_pending_templates): Don't reopen_tinst_level for + already-complete instantiations. + +2025-05-26 Jason Merrill <jason@redhat.com> + + * cp-tree.h (class cxx_dump_pretty_printer): New. + * error.cc (cxx_dump_pretty_printer): Ctor/dtor definitions. + +2025-05-25 Jason Merrill <jason@redhat.com> + + * error.cc (dump_template_bindings): Correct skipping of + redundant bindings. + 2025-05-23 Nathaniel Shead <nathanieloshead@gmail.com> PR c++/120363 diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc index 44fb086..9062570 100644 --- a/gcc/cp/constraint.cc +++ b/gcc/cp/constraint.cc @@ -3100,6 +3100,9 @@ diagnose_trait_expr (tree expr, tree args) case CPTK_IS_CONVERTIBLE: inform (loc, " %qT is not convertible from %qE", t2, t1); break; + case CPTK_IS_DESTRUCTIBLE: + inform (loc, " %qT is not destructible", t1); + break; case CPTK_IS_EMPTY: inform (loc, " %qT is not an empty class", t1); break; @@ -3145,6 +3148,9 @@ diagnose_trait_expr (tree expr, tree args) case CPTK_IS_NOTHROW_CONVERTIBLE: inform (loc, " %qT is not nothrow convertible from %qE", t2, t1); break; + case CPTK_IS_NOTHROW_DESTRUCTIBLE: + inform (loc, " %qT is not nothrow destructible", t1); + break; case CPTK_IS_NOTHROW_INVOCABLE: if (!t2) inform (loc, " %qT is not nothrow invocable", t1); @@ -3194,6 +3200,9 @@ diagnose_trait_expr (tree expr, tree args) case CPTK_IS_TRIVIALLY_COPYABLE: inform (loc, " %qT is not trivially copyable", t1); break; + case CPTK_IS_TRIVIALLY_DESTRUCTIBLE: + inform (loc, " %qT is not trivially destructible", t1); + break; case CPTK_IS_UNBOUNDED_ARRAY: inform (loc, " %qT is not an unbounded array", t1); break; diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc index a620996..b1e555c 100644 --- a/gcc/cp/coroutines.cc +++ b/gcc/cp/coroutines.cc @@ -4944,7 +4944,7 @@ cp_coroutine_transform::build_ramp_function () tree frame_cleanup = push_stmt_list (); tree do_fr_cleanup = build1_loc (loc, TRUTH_NOT_EXPR, boolean_type_node, iarc_x); - do_fr_cleanup = build2_loc (loc, TRUTH_AND_EXPR, boolean_type_node, + do_fr_cleanup = build2_loc (loc, TRUTH_ANDIF_EXPR, boolean_type_node, coro_before_return, do_fr_cleanup); r = build3 (COND_EXPR, void_type_node, do_fr_cleanup, delete_frame_call, void_node); @@ -5036,7 +5036,7 @@ cp_coroutine_transform::build_ramp_function () tree do_cleanup = build1_loc (loc, TRUTH_NOT_EXPR, boolean_type_node, iarc_x); do_cleanup - = build2_loc (loc, TRUTH_AND_EXPR, boolean_type_node, + = build2_loc (loc, TRUTH_ANDIF_EXPR, boolean_type_node, coro_before_return, do_cleanup); r = build3_loc (loc, COND_EXPR, void_type_node, do_cleanup, parm.fr_copy_dtor, void_node); @@ -5096,7 +5096,7 @@ cp_coroutine_transform::build_ramp_function () tree promise_cleanup = push_stmt_list (); tree do_cleanup = build1_loc (loc, TRUTH_NOT_EXPR, boolean_type_node, iarc_x); - do_cleanup = build2_loc (loc, TRUTH_AND_EXPR, boolean_type_node, + do_cleanup = build2_loc (loc, TRUTH_ANDIF_EXPR, boolean_type_node, coro_before_return, do_cleanup); r = build3 (COND_EXPR, void_type_node, do_cleanup, promise_dtor, void_node); diff --git a/gcc/cp/cp-objcp-common.cc b/gcc/cp/cp-objcp-common.cc index 8336d0b..7665b94 100644 --- a/gcc/cp/cp-objcp-common.cc +++ b/gcc/cp/cp-objcp-common.cc @@ -614,6 +614,8 @@ cp_register_dumps (gcc::dump_manager *dumps) (".raw", "lang-raw", "lang-raw", DK_lang, OPTGROUP_NONE, false); coro_dump_id = dumps->dump_register (".coro", "lang-coro", "lang-coro", DK_lang, OPTGROUP_NONE, false); + tinst_dump_id = dumps->dump_register + (".tinst", "lang-tinst", "lang-tinst", DK_lang, OPTGROUP_NONE, false); } void diff --git a/gcc/cp/cp-trait.def b/gcc/cp/cp-trait.def index 6aaca13..9c7380d 100644 --- a/gcc/cp/cp-trait.def +++ b/gcc/cp/cp-trait.def @@ -71,6 +71,7 @@ DEFTRAIT_EXPR (IS_CLASS, "__is_class", 1) DEFTRAIT_EXPR (IS_CONST, "__is_const", 1) DEFTRAIT_EXPR (IS_CONSTRUCTIBLE, "__is_constructible", -1) DEFTRAIT_EXPR (IS_CONVERTIBLE, "__is_convertible", 2) +DEFTRAIT_EXPR (IS_DESTRUCTIBLE, "__is_destructible", 1) DEFTRAIT_EXPR (IS_EMPTY, "__is_empty", 1) DEFTRAIT_EXPR (IS_ENUM, "__is_enum", 1) DEFTRAIT_EXPR (IS_FINAL, "__is_final", 1) @@ -84,6 +85,7 @@ DEFTRAIT_EXPR (IS_MEMBER_POINTER, "__is_member_pointer", 1) DEFTRAIT_EXPR (IS_NOTHROW_ASSIGNABLE, "__is_nothrow_assignable", 2) DEFTRAIT_EXPR (IS_NOTHROW_CONSTRUCTIBLE, "__is_nothrow_constructible", -1) DEFTRAIT_EXPR (IS_NOTHROW_CONVERTIBLE, "__is_nothrow_convertible", 2) +DEFTRAIT_EXPR (IS_NOTHROW_DESTRUCTIBLE, "__is_nothrow_destructible", 1) DEFTRAIT_EXPR (IS_NOTHROW_INVOCABLE, "__is_nothrow_invocable", -1) DEFTRAIT_EXPR (IS_OBJECT, "__is_object", 1) DEFTRAIT_EXPR (IS_POINTER_INTERCONVERTIBLE_BASE_OF, "__is_pointer_interconvertible_base_of", 2) @@ -98,6 +100,7 @@ DEFTRAIT_EXPR (IS_TRIVIAL, "__is_trivial", 1) DEFTRAIT_EXPR (IS_TRIVIALLY_ASSIGNABLE, "__is_trivially_assignable", 2) DEFTRAIT_EXPR (IS_TRIVIALLY_CONSTRUCTIBLE, "__is_trivially_constructible", -1) DEFTRAIT_EXPR (IS_TRIVIALLY_COPYABLE, "__is_trivially_copyable", 1) +DEFTRAIT_EXPR (IS_TRIVIALLY_DESTRUCTIBLE, "__is_trivially_destructible", -1) DEFTRAIT_EXPR (IS_UNBOUNDED_ARRAY, "__is_unbounded_array", 1) DEFTRAIT_EXPR (IS_UNION, "__is_union", 1) DEFTRAIT_EXPR (IS_VIRTUAL_BASE_OF, "__builtin_is_virtual_base_of", 2) diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 175ab28..19c0b45 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -6822,6 +6822,7 @@ extern int class_dump_id; extern int module_dump_id; extern int raw_dump_id; extern int coro_dump_id; +extern int tinst_dump_id; /* Whether the current context is manifestly constant-evaluated. Used by the constexpr machinery to control folding of @@ -7322,6 +7323,29 @@ extern void cp_check_const_attributes (tree); extern void maybe_propagate_warmth_attributes (tree, tree); /* in error.cc */ +/* A class for pretty-printing to -flang-dump-XXX files. Used like + + if (cxx_dump_pretty_printer pp {foo_dump_id}) + { + pp_printf (&pp, ...); + } + + If the dump is enabled, the pretty printer will open the dump file and + attach to it, and flush and close the file on destruction. */ + +class cxx_dump_pretty_printer: public pretty_printer +{ + int phase; + FILE *outf; + dump_flags_t flags; + +public: + cxx_dump_pretty_printer (int phase); + operator bool() { return outf != nullptr; } + bool has_flag (dump_flags_t f) { return (flags & f); } + ~cxx_dump_pretty_printer (); +}; + extern const char *type_as_string (tree, int); extern const char *type_as_string_translate (tree, int); extern const char *decl_as_string (tree, int); diff --git a/gcc/cp/error.cc b/gcc/cp/error.cc index 75bf7dc..d52dad3 100644 --- a/gcc/cp/error.cc +++ b/gcc/cp/error.cc @@ -193,6 +193,33 @@ class cxx_format_postprocessor : public format_postprocessor deferred_printed_type m_type_b; }; +/* Constructor and destructor for cxx_dump_pretty_printer, defined here to + avoid needing to move cxx_format_postprocessor into the header as well. */ + +cxx_dump_pretty_printer:: +cxx_dump_pretty_printer (int phase) + : phase (phase) +{ + outf = dump_begin (phase, &flags); + if (outf) + { + pp_format_decoder (this) = cp_printer; + /* This gets deleted in ~pretty_printer. */ + pp_format_postprocessor (this) = new cxx_format_postprocessor (); + set_output_stream (outf); + } +} + +cxx_dump_pretty_printer:: +~cxx_dump_pretty_printer () +{ + if (outf) + { + pp_flush (this); + dump_end (phase, outf); + } +} + /* Return the in-scope template that's currently being parsed, or NULL_TREE otherwise. */ @@ -541,12 +568,13 @@ dump_template_bindings (cxx_pretty_printer *pp, tree parms, tree args, /* If the template argument repeats the template parameter (T = T), skip the parameter.*/ if (arg && TREE_CODE (arg) == TEMPLATE_TYPE_PARM - && TREE_CODE (parm_i) == TREE_LIST - && TREE_CODE (TREE_VALUE (parm_i)) == TYPE_DECL - && TREE_CODE (TREE_TYPE (TREE_VALUE (parm_i))) - == TEMPLATE_TYPE_PARM - && DECL_NAME (TREE_VALUE (parm_i)) - == DECL_NAME (TREE_CHAIN (arg))) + && arg == TYPE_MAIN_VARIANT (arg) + && TREE_CODE (parm_i) == TREE_LIST + && TREE_CODE (TREE_VALUE (parm_i)) == TYPE_DECL + && (TREE_CODE (TREE_TYPE (TREE_VALUE (parm_i))) + == TEMPLATE_TYPE_PARM) + && (DECL_NAME (TREE_VALUE (parm_i)) + == DECL_NAME (TYPE_STUB_DECL (arg)))) continue; semicolon_or_introducer (); diff --git a/gcc/cp/method.cc b/gcc/cp/method.cc index 092bae2..3a675d9 100644 --- a/gcc/cp/method.cc +++ b/gcc/cp/method.cc @@ -2330,6 +2330,19 @@ constructible_expr (tree to, tree from) return expr; } +/* Return declval<T>().~T() treated as an unevaluated operand. */ + +static tree +destructible_expr (tree to) +{ + cp_unevaluated cp_uneval_guard; + int flags = LOOKUP_NORMAL|LOOKUP_DESTRUCTOR; + to = build_trait_object (to); + tree r = build_delete (input_location, TREE_TYPE (to), to, + sfk_complete_destructor, flags, 0, tf_none); + return r; +} + /* Returns a tree iff TO is assignable (if CODE is MODIFY_EXPR) or constructible (otherwise) from FROM, which is a single type for assignment or a list of types for construction. */ @@ -2346,6 +2359,8 @@ is_xible_helper (enum tree_code code, tree to, tree from, bool trivial) tree expr; if (code == MODIFY_EXPR) expr = assignable_expr (to, from); + else if (code == BIT_NOT_EXPR) + expr = destructible_expr (to); else if (trivial && TREE_VEC_LENGTH (from) > 1 && cxx_dialect < cxx20) return error_mark_node; // only 0- and 1-argument ctors can be trivial diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index 17c040d..ad2acaf 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -16865,11 +16865,15 @@ module_state::write_namespaces (elf_out *to, vec<depset *> spaces, bytes_out sec (to); sec.begin (); + hash_map<tree, unsigned> ns_map; + for (unsigned ix = 0; ix != num; ix++) { depset *b = spaces[ix]; tree ns = b->get_entity (); + ns_map.put (ns, ix); + /* This could be an anonymous namespace even for a named module, since we can still emit no-linkage decls. */ gcc_checking_assert (TREE_CODE (ns) == NAMESPACE_DECL); @@ -16911,6 +16915,31 @@ module_state::write_namespaces (elf_out *to, vec<depset *> spaces, } } + /* Now write exported using-directives, as a sequence of 1-origin indices in + the spaces array (not entity indices): First the using namespace, then the + used namespaces. And then a zero terminating the list. :: is + represented as index -1. */ + auto emit_one_ns = [&](unsigned ix, tree ns) { + for (auto udir: NAMESPACE_LEVEL (ns)->using_directives) + { + if (TREE_CODE (udir) != USING_DECL || !DECL_MODULE_EXPORT_P (udir)) + continue; + tree ns2 = USING_DECL_DECLS (udir); + dump() && dump ("Writing using-directive in %N for %N", + ns, ns2); + sec.u (ix); + sec.u (*ns_map.get (ns2) + 1); + } + }; + emit_one_ns (-1, global_namespace); + for (unsigned ix = 0; ix != num; ix++) + { + depset *b = spaces[ix]; + tree ns = b->get_entity (); + emit_one_ns (ix + 1, ns); + } + sec.u (0); + sec.end (to, to->name (MOD_SNAME_PFX ".nms"), crc_p); dump.outdent (); } @@ -16929,6 +16958,8 @@ module_state::read_namespaces (unsigned num) dump () && dump ("Reading namespaces"); dump.indent (); + tree *ns_map = XALLOCAVEC (tree, num); + for (unsigned ix = 0; ix != num; ix++) { unsigned entity_index = sec.u (); @@ -16990,6 +17021,8 @@ module_state::read_namespaces (unsigned num) DECL_ATTRIBUTES (inner) = tree_cons (get_identifier ("abi_tag"), tags, DECL_ATTRIBUTES (inner)); + ns_map[ix] = inner; + /* Install the namespace. */ (*entity_ary)[entity_lwm + entity_index] = inner; if (DECL_MODULE_IMPORT_P (inner)) @@ -17004,6 +17037,44 @@ module_state::read_namespaces (unsigned num) *slot = entity_lwm + entity_index; } } + + /* Read the exported using-directives. */ + while (unsigned ix = sec.u ()) + { + tree ns; + if (ix == (unsigned)-1) + ns = global_namespace; + else + { + if (--ix >= num) + { + sec.set_overrun (); + break; + } + ns = ns_map [ix]; + } + unsigned ix2 = sec.u (); + if (--ix2 >= num) + { + sec.set_overrun (); + break; + } + tree ns2 = ns_map [ix2]; + if (directness) + { + dump() && dump ("Reading using-directive in %N for %N", + ns, ns2); + /* In an export import this will mark the using-directive as + exported, so it will be emitted again. */ + add_using_namespace (ns, ns2); + } + else + /* Ignore using-directives from indirect imports, we only want them + from our own imports. */ + dump() && dump ("Ignoring using-directive in %N for %N", + ns, ns2); + } + dump.outdent (); if (!sec.end (from ())) return false; diff --git a/gcc/cp/name-lookup.cc b/gcc/cp/name-lookup.cc index 84b5e67..9aa7c16 100644 --- a/gcc/cp/name-lookup.cc +++ b/gcc/cp/name-lookup.cc @@ -1049,7 +1049,7 @@ name_lookup::search_usings (tree scope) bool found = false; if (vec<tree, va_gc> *usings = NAMESPACE_LEVEL (scope)->using_directives) for (unsigned ix = usings->length (); ix--;) - found |= search_qualified ((*usings)[ix], true); + found |= search_qualified (strip_using_decl ((*usings)[ix]), true); /* Look in its inline children. */ if (vec<tree, va_gc> *inlinees = DECL_NAMESPACE_INLINEES (scope)) @@ -1121,7 +1121,7 @@ name_lookup::queue_usings (using_queue& queue, int depth, vec<tree, va_gc> *usin { if (usings) for (unsigned ix = usings->length (); ix--;) - queue_namespace (queue, depth, (*usings)[ix]); + queue_namespace (queue, depth, strip_using_decl ((*usings)[ix])); } /* Unqualified namespace lookup in SCOPE. @@ -6868,7 +6868,7 @@ using_directives_contain_std_p (vec<tree, va_gc> *usings) return false; for (unsigned ix = usings->length (); ix--;) - if ((*usings)[ix] == std_node) + if (strip_using_decl ((*usings)[ix]) == std_node) return true; return false; @@ -8943,9 +8943,27 @@ add_using_namespace (vec<tree, va_gc> *&usings, tree target) if ((*usings)[ix] == target) return; + if (modules_p ()) + { + tree u = build_lang_decl (USING_DECL, NULL_TREE, NULL_TREE); + USING_DECL_DECLS (u) = target; + DECL_MODULE_EXPORT_P (u) = module_exporting_p (); + DECL_MODULE_PURVIEW_P (u) = module_purview_p (); + target = u; + } vec_safe_push (usings, target); } +/* Convenience overload for the above, taking the user as its first + parameter. */ + +void +add_using_namespace (tree ns, tree target) +{ + add_using_namespace (NAMESPACE_LEVEL (ns)->using_directives, + ORIGINAL_NAMESPACE (target)); +} + /* Tell the debug system of a using directive. */ static void diff --git a/gcc/cp/name-lookup.h b/gcc/cp/name-lookup.h index f1596c6..4216a51 100644 --- a/gcc/cp/name-lookup.h +++ b/gcc/cp/name-lookup.h @@ -462,6 +462,7 @@ extern cxx_binding *outer_binding (tree, cxx_binding *, bool); extern void cp_emit_debug_info_for_using (tree, tree); extern void finish_nonmember_using_decl (tree scope, tree name); +extern void add_using_namespace (tree, tree); extern void finish_using_directive (tree target, tree attribs); void push_local_extern_decl_alias (tree decl); extern tree pushdecl (tree, bool hiding = false); diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index 1fb9e7f..d9fc5f7 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -15827,7 +15827,13 @@ cp_parser_import_declaration (cp_parser *parser, module_parse mp_state, " must not be from header inclusion"); } + auto mk = module_kind; + if (exporting) + module_kind |= MK_EXPORTING; + import_module (mod, token->location, exporting, attrs, parse_in); + + module_kind = mk; } } diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 1973d25..c687fdc 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -11378,6 +11378,7 @@ limit_bad_template_recursion (tree decl) static int tinst_depth; extern int max_tinst_depth; int depth_reached; +int tinst_dump_id; static GTY(()) struct tinst_level *last_error_tinst_level; @@ -11430,6 +11431,40 @@ push_tinst_level_loc (tree tldcl, tree targs, location_t loc) set_refcount_ptr (new_level->next, current_tinst_level); set_refcount_ptr (current_tinst_level, new_level); + if (cxx_dump_pretty_printer pp {tinst_dump_id}) + { +#if __GNUC__ >= 10 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-diag" +#endif + bool list_p = new_level->list_p (); + if (list_p && !pp.has_flag (TDF_DETAILS)) + /* Skip non-instantiations unless -details. */; + else + { + if (tinst_depth == 0) + pp_newline (&pp); + if (loc && pp.has_flag (TDF_LINENO)) + { + for (int i = 0; i < tinst_depth; ++i) + pp_space (&pp); + const expanded_location el = expand_location (loc); + pp_printf (&pp, "%s:%d:%d", el.file, el.line, el.column); + pp_newline (&pp); + } + for (int i = 0; i < tinst_depth; ++i) + pp_space (&pp); + if (list_p) + pp_printf (&pp, "S %S", new_level->get_node ()); + else + pp_printf (&pp, "I %D", tldcl); + pp_newline (&pp); + } +#if __GNUC__ >= 10 +#pragma GCC diagnostic pop +#endif + } + ++tinst_depth; if (GATHER_STATISTICS && (tinst_depth > depth_reached)) depth_reached = tinst_depth; @@ -11481,6 +11516,20 @@ pop_tinst_level (void) --tinst_depth; } +/* True if the instantiation represented by LEVEL is complete. */ + +static bool +tinst_complete_p (struct tinst_level *level) +{ + gcc_assert (!level->list_p ()); + tree node = level->get_node (); + if (TYPE_P (node)) + return COMPLETE_TYPE_P (node); + else + return (DECL_TEMPLATE_INSTANTIATED (node) + || DECL_TEMPLATE_SPECIALIZATION (node)); +} + /* We're instantiating a deferred template; restore the template instantiation context in which the instantiation was requested, which is one step out from LEVEL. Return the corresponding DECL or TYPE. */ @@ -11499,6 +11548,38 @@ reopen_tinst_level (struct tinst_level *level) if (current_tinst_level && !current_tinst_level->had_errors) current_tinst_level->errors = errorcount+sorrycount; + if (cxx_dump_pretty_printer pp {tinst_dump_id}) + { +#if __GNUC__ >= 10 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-diag" +#endif + /* Dump the reopened instantiation context. */ + t = current_tinst_level; + if (!pp.has_flag (TDF_DETAILS)) + /* Skip non-instantiations unless -details. */ + while (t && t->list_p ()) + t = t->next; + if (t) + { + static tree last_ctx = NULL_TREE; + tree ctx = t->get_node (); + if (ctx != last_ctx) + { + last_ctx = ctx; + pp_newline (&pp); + if (t->list_p ()) + pp_printf (&pp, "RS %S", ctx); + else + pp_printf (&pp, "RI %D", ctx); + pp_newline (&pp); + } + } +#if __GNUC__ >= 10 +#pragma GCC diagnostic pop +#endif + } + tree decl = level->maybe_get_node (); if (decl && modules_p ()) { @@ -28068,14 +28149,16 @@ instantiate_pending_templates (int retries) reconsider = 0; while (*t) { - tree instantiation = reopen_tinst_level ((*t)->tinst); - bool complete = false; + struct tinst_level *tinst = (*t)->tinst; + bool complete = tinst_complete_p (tinst); - if (limit_bad_template_recursion (instantiation)) - /* Do nothing. */; - else if (TYPE_P (instantiation)) + if (!complete) { - if (!COMPLETE_TYPE_P (instantiation)) + tree instantiation = reopen_tinst_level (tinst); + + if (limit_bad_template_recursion (instantiation)) + /* Do nothing. */; + else if (TYPE_P (instantiation)) { instantiate_class_template (instantiation); if (CLASSTYPE_TEMPLATE_INSTANTIATION (instantiation)) @@ -28092,13 +28175,7 @@ instantiate_pending_templates (int retries) if (COMPLETE_TYPE_P (instantiation)) reconsider = 1; } - - complete = COMPLETE_TYPE_P (instantiation); - } - else - { - if (!DECL_TEMPLATE_SPECIALIZATION (instantiation) - && !DECL_TEMPLATE_INSTANTIATED (instantiation)) + else { instantiation = instantiate_decl (instantiation, @@ -28108,8 +28185,10 @@ instantiate_pending_templates (int retries) reconsider = 1; } - complete = (DECL_TEMPLATE_SPECIALIZATION (instantiation) - || DECL_TEMPLATE_INSTANTIATED (instantiation)); + complete = tinst_complete_p (tinst); + + tinst_depth = 0; + set_refcount_ptr (current_tinst_level); } if (complete) @@ -28126,8 +28205,6 @@ instantiate_pending_templates (int retries) last = *t; t = &(*t)->next; } - tinst_depth = 0; - set_refcount_ptr (current_tinst_level); } last_pending_template = last; } diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc index 43a0eab..241f273 100644 --- a/gcc/cp/semantics.cc +++ b/gcc/cp/semantics.cc @@ -10565,10 +10565,10 @@ finish_omp_target_clauses_r (tree *tp, int *walk_subtrees, void *ptr) if (TREE_CODE (t) == BIND_EXPR) { - tree block = BIND_EXPR_BLOCK (t); - for (tree var = BLOCK_VARS (block); var; var = DECL_CHAIN (var)) - if (!data->local_decls.contains (var)) - data->local_decls.add (var); + if (tree block = BIND_EXPR_BLOCK (t)) + for (tree var = BLOCK_VARS (block); var; var = DECL_CHAIN (var)) + if (!data->local_decls.contains (var)) + data->local_decls.add (var); return NULL_TREE; } @@ -13235,6 +13235,14 @@ trait_expr_value (cp_trait_kind kind, tree type1, tree type2) case CPTK_HAS_TRIVIAL_DESTRUCTOR: type1 = strip_array_types (type1); + if (CLASS_TYPE_P (type1) && type_build_dtor_call (type1)) + { + deferring_access_check_sentinel dacs (dk_no_check); + tree fn = get_dtor (type1, tf_none); + if (!fn && !seen_error ()) + warning (0, "checking %qs for type %qT with a destructor that " + "cannot be called", "__has_trivial_destructor", type1); + } return (trivial_type_p (type1) || type_code1 == REFERENCE_TYPE || (CLASS_TYPE_P (type1) && TYPE_HAS_TRIVIAL_DESTRUCTOR (type1))); @@ -13290,6 +13298,9 @@ trait_expr_value (cp_trait_kind kind, tree type1, tree type2) case CPTK_IS_CONVERTIBLE: return is_convertible (type1, type2); + case CPTK_IS_DESTRUCTIBLE: + return is_xible (BIT_NOT_EXPR, type1, NULL_TREE); + case CPTK_IS_EMPTY: return NON_UNION_CLASS_TYPE_P (type1) && CLASSTYPE_EMPTY_P (type1); @@ -13329,6 +13340,9 @@ trait_expr_value (cp_trait_kind kind, tree type1, tree type2) case CPTK_IS_NOTHROW_CONVERTIBLE: return is_nothrow_convertible (type1, type2); + case CPTK_IS_NOTHROW_DESTRUCTIBLE: + return is_nothrow_xible (BIT_NOT_EXPR, type1, NULL_TREE); + case CPTK_IS_NOTHROW_INVOCABLE: return expr_noexcept_p (build_invoke (type1, type2, tf_none), tf_none); @@ -13371,6 +13385,9 @@ trait_expr_value (cp_trait_kind kind, tree type1, tree type2) case CPTK_IS_TRIVIALLY_COPYABLE: return trivially_copyable_p (type1); + case CPTK_IS_TRIVIALLY_DESTRUCTIBLE: + return is_trivially_xible (BIT_NOT_EXPR, type1, NULL_TREE); + case CPTK_IS_UNBOUNDED_ARRAY: return array_of_unknown_bound_p (type1); @@ -13543,6 +13560,9 @@ finish_trait_expr (location_t loc, cp_trait_kind kind, tree type1, tree type2) case CPTK_HAS_NOTHROW_COPY: case CPTK_HAS_TRIVIAL_COPY: case CPTK_HAS_TRIVIAL_DESTRUCTOR: + case CPTK_IS_DESTRUCTIBLE: + case CPTK_IS_NOTHROW_DESTRUCTIBLE: + case CPTK_IS_TRIVIALLY_DESTRUCTIBLE: if (!check_trait_type (type1)) return error_mark_node; break; diff --git a/gcc/diagnostic-format-html.cc b/gcc/diagnostic-format-html.cc index 6bb1caf..f2b255b 100644 --- a/gcc/diagnostic-format-html.cc +++ b/gcc/diagnostic-format-html.cc @@ -20,6 +20,7 @@ along with GCC; see the file COPYING3. If not see #include "config.h" #define INCLUDE_MAP +#define INCLUDE_STRING #define INCLUDE_VECTOR #include "system.h" #include "coretypes.h" @@ -36,6 +37,17 @@ along with GCC; see the file COPYING3. If not see #include "pretty-print-urlifier.h" #include "edit-context.h" #include "intl.h" +#include "xml.h" +#include "xml-printer.h" +#include "json.h" + +// struct html_generation_options + +html_generation_options::html_generation_options () +: m_css (true), + m_javascript (true) +{ +} namespace xml { @@ -46,57 +58,6 @@ namespace xml { # pragma GCC diagnostic ignored "-Wformat-diag" #endif -struct node -{ - virtual ~node () {} - virtual void write_as_xml (pretty_printer *pp, - int depth, bool indent) const = 0; - void dump (FILE *out) const; - void DEBUG_FUNCTION dump () const { dump (stderr); } -}; - -struct text : public node -{ - text (label_text str) - : m_str (std::move (str)) - {} - - void write_as_xml (pretty_printer *pp, - int depth, bool indent) const final override; - - label_text m_str; -}; - -struct node_with_children : public node -{ - void add_child (std::unique_ptr<node> node); - void add_text (label_text str); - - std::vector<std::unique_ptr<node>> m_children; -}; - -struct document : public node_with_children -{ - void write_as_xml (pretty_printer *pp, - int depth, bool indent) const final override; -}; - -struct element : public node_with_children -{ - element (const char *kind, bool preserve_whitespace) - : m_kind (kind), - m_preserve_whitespace (preserve_whitespace) - {} - - void write_as_xml (pretty_printer *pp, - int depth, bool indent) const final override; - - void set_attr (const char *name, label_text value); - - const char *m_kind; - bool m_preserve_whitespace; - std::map<const char *, label_text> m_attributes; -}; /* Implementation. */ @@ -146,9 +107,16 @@ node::dump (FILE *out) const /* struct text : public node. */ void -text::write_as_xml (pretty_printer *pp, int /*depth*/, bool /*indent*/) const +text::write_as_xml (pretty_printer *pp, int depth, bool indent) const { - write_escaped_text (pp, m_str.get ()); + if (indent) + { + for (int i = 0; i < depth; ++i) + pp_string (pp, " "); + } + write_escaped_text (pp, m_str.c_str ()); + if (indent) + pp_newline (pp); } /* struct node_with_children : public node. */ @@ -161,9 +129,15 @@ node_with_children::add_child (std::unique_ptr<node> node) } void -node_with_children::add_text (label_text str) +node_with_children::add_text (std::string str) { - gcc_assert (str.get ()); + // Consolidate runs of text + if (!m_children.empty ()) + if (text *t = m_children.back ()->dyn_cast_text ()) + { + t->m_str += std::move (str); + return; + } add_child (std::make_unique <text> (std::move (str))); } @@ -177,6 +151,8 @@ document::write_as_xml (pretty_printer *pp, int depth, bool indent) const pp_string (pp, "<!DOCTYPE html\n" " PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n" " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"); + if (indent) + pp_newline (pp); for (auto &iter : m_children) iter->write_as_xml (pp, depth, indent); } @@ -188,48 +164,139 @@ element::write_as_xml (pretty_printer *pp, int depth, bool indent) const { if (indent) { - pp_newline (pp); for (int i = 0; i < depth; ++i) pp_string (pp, " "); } - if (m_preserve_whitespace) - indent = false; - - pp_printf (pp, "<%s", m_kind); - for (auto &attr : m_attributes) + pp_printf (pp, "<%s", m_kind.c_str ()); + for (auto &key : m_key_insertion_order) { - pp_printf (pp, " %s=\"", attr.first); - write_escaped_text (pp, attr.second.get ()); - pp_string (pp, "\""); + auto iter = m_attributes.find (key); + if (iter != m_attributes.end ()) + { + pp_printf (pp, " %s=\"", key.c_str ()); + write_escaped_text (pp, iter->second.c_str ()); + pp_string (pp, "\""); + } } if (m_children.empty ()) - pp_string (pp, " />"); + pp_string (pp, "/>"); else { + const bool indent_children = m_preserve_whitespace ? false : indent; pp_string (pp, ">"); + if (indent_children) + pp_newline (pp); for (auto &child : m_children) - child->write_as_xml (pp, depth + 1, indent); - if (indent) + child->write_as_xml (pp, depth + 1, indent_children); + if (indent_children) { - pp_newline (pp); for (int i = 0; i < depth; ++i) pp_string (pp, " "); } - pp_printf (pp, "</%s>", m_kind); + pp_printf (pp, "</%s>", m_kind.c_str ()); } + + if (indent) + pp_newline (pp); } void -element::set_attr (const char *name, label_text value) +element::set_attr (const char *name, std::string value) { + auto iter = m_attributes.find (name); + if (iter == m_attributes.end ()) + m_key_insertion_order.push_back (name); m_attributes[name] = std::move (value); } +// struct raw : public node + +void +raw::write_as_xml (pretty_printer *pp, + int /*depth*/, bool /*indent*/) const +{ + pp_string (pp, m_xml_src.c_str ()); +} + #if __GNUC__ >= 10 # pragma GCC diagnostic pop #endif +// class printer + +printer::printer (element &insertion_point) +{ + m_open_tags.push_back (&insertion_point); +} + +void +printer::push_tag (std::string name, + bool preserve_whitespace) +{ + push_element + (std::make_unique<element> (std::move (name), + preserve_whitespace)); +} + +void +printer::push_tag_with_class (std::string name, std::string class_, + bool preserve_whitespace) +{ + auto new_element + = std::make_unique<element> (std::move (name), + preserve_whitespace); + new_element->set_attr ("class", class_); + push_element (std::move (new_element)); +} + +void +printer::pop_tag () +{ + m_open_tags.pop_back (); +} + +void +printer::set_attr (const char *name, std::string value) +{ + m_open_tags.back ()->set_attr (name, value); +} + +void +printer::add_text (std::string text) +{ + element *parent = m_open_tags.back (); + parent->add_text (std::move (text)); +} + +void +printer::add_raw (std::string text) +{ + element *parent = m_open_tags.back (); + parent->add_child (std::make_unique<xml::raw> (std::move (text))); +} + +void +printer::push_element (std::unique_ptr<element> new_element) +{ + element *parent = m_open_tags.back (); + m_open_tags.push_back (new_element.get ()); + parent->add_child (std::move (new_element)); +} + +void +printer::append (std::unique_ptr<node> new_node) +{ + element *parent = m_open_tags.back (); + parent->add_child (std::move (new_node)); +} + +element * +printer::get_insertion_point () const +{ + return m_open_tags.back (); +} + } // namespace xml class html_builder; @@ -284,7 +351,8 @@ public: html_builder (diagnostic_context &context, pretty_printer &pp, - const line_maps *line_maps); + const line_maps *line_maps, + const html_generation_options &html_gen_opts); void on_report_diagnostic (const diagnostic_info &diagnostic, diagnostic_t orig_diag_kind, @@ -310,14 +378,13 @@ public: make_element_for_metadata (const diagnostic_metadata &metadata); std::unique_ptr<xml::element> - make_element_for_source (const diagnostic_info &diagnostic); - - std::unique_ptr<xml::element> - make_element_for_path (const diagnostic_path &path); - - std::unique_ptr<xml::element> make_element_for_patch (const diagnostic_info &diagnostic); + void add_focus_id (std::string focus_id) + { + m_ui_focus_ids.append_string (focus_id.c_str ()); + } + private: std::unique_ptr<xml::element> make_element_for_diagnostic (const diagnostic_info &diagnostic, @@ -330,14 +397,18 @@ private: diagnostic_context &m_context; pretty_printer *m_printer; const line_maps *m_line_maps; + html_generation_options m_html_gen_opts; std::unique_ptr<xml::document> m_document; + xml::element *m_head_element; xml::element *m_diagnostics_element; std::unique_ptr<xml::element> m_cur_diagnostic_element; + int m_next_diag_id; // for handing out unique IDs + json::array m_ui_focus_ids; }; static std::unique_ptr<xml::element> -make_div (label_text class_) +make_div (std::string class_) { auto div = std::make_unique<xml::element> ("div", false); div->set_attr ("class", std::move (class_)); @@ -345,7 +416,7 @@ make_div (label_text class_) } static std::unique_ptr<xml::element> -make_span (label_text class_) +make_span (std::string class_) { auto span = std::make_unique<xml::element> ("span", true); span->set_attr ("class", std::move (class_)); @@ -400,45 +471,151 @@ diagnostic_html_format_buffer::flush () /* class html_builder. */ +/* Style information for writing out HTML paths. + Colors taken from https://www.patternfly.org/v3/styles/color-palette/ */ + +static const char * const HTML_STYLE + = (" <style>\n" + " .linenum { color: white;\n" + " background-color: #0088ce;\n" + " white-space: pre;\n" + " border-right: 1px solid black; }\n" + " .ruler { color: red;\n" + " white-space: pre; }\n" + " .source { color: blue;\n" + " white-space: pre; }\n" + " .annotation { color: green;\n" + " white-space: pre; }\n" + " .linenum-gap { text-align: center;\n" + " border-top: 1px solid black;\n" + " border-right: 1px solid black;\n" + " background-color: #ededed; }\n" + " .source-gap { border-bottom: 1px dashed black;\n" + " border-top: 1px dashed black;\n" + " background-color: #ededed; }\n" + " .no-locus-event { font-family: monospace;\n" + " color: green;\n" + " white-space: pre; }\n" + " .funcname { font-weight: bold; }\n" + " .events-hdr { color: white;\n" + " background-color: #030303; }\n" + " .event-range { border: 1px solid black;\n" + " padding: 0px; }\n" + " .event-range-with-margin { border-spacing: 0; }\n" + " .locus { font-family: monospace;\n" + " border-spacing: 0px; }\n" + " .selected { color: white;\n" + " background-color: #0088ce; }\n" + " .stack-frame-with-margin { border-spacing: 0; }\n" + " .stack-frame { padding: 5px;\n" + " box-shadow: 0 5px 10px 0 rgba(0, 0, 0, 0.5); }\n" + " .frame-funcname { text-align: right;\n" + " font-style: italic; } \n" + " </style>\n"); + +/* A little JavaScript for ease of navigation. + Keys j/k move forward and backward cyclically through a list + of focus ids (written out in another <script> tag as the HTML + is flushed). */ + +const char * const HTML_SCRIPT + = (" var current_focus_idx = 0;\n" + "\n" + " function get_focus_span (focus_idx)\n" + " {\n" + " const element_id = focus_ids[focus_idx];\n" + " return document.getElementById(element_id);\n" + " }\n" + " function unhighlight_current_focus_idx ()\n" + " {\n" + " get_focus_span (current_focus_idx).classList.remove ('selected');\n" + " }\n" + " function highlight_current_focus_idx ()\n" + " {\n" + " const el = get_focus_span (current_focus_idx);\n" + " el.classList.add ('selected');\n" + " // Center the element on the screen\n" + " const top_y = el.getBoundingClientRect ().top + window.pageYOffset;\n" + " const middle = top_y - (window.innerHeight / 2);\n" + " window.scrollTo (0, middle);\n" + " }\n" + " function select_prev_focus_idx ()\n" + " {\n" + " unhighlight_current_focus_idx ();\n" + " if (current_focus_idx > 0)\n" + " current_focus_idx -= 1;\n" + " else\n" + " current_focus_idx = focus_ids.length - 1;\n" + " highlight_current_focus_idx ();\n" + " }\n" + " function select_next_focus_idx ()\n" + " {\n" + " unhighlight_current_focus_idx ();\n" + " if (current_focus_idx < focus_ids.length - 1)\n" + " current_focus_idx += 1;\n" + " else\n" + " current_focus_idx = 0;\n" + " highlight_current_focus_idx ();\n" + " }\n" + " document.addEventListener('keydown', function (ev) {\n" + " if (ev.key == 'j')\n" + " select_next_focus_idx ();\n" + " else if (ev.key == 'k')\n" + " select_prev_focus_idx ();\n" + " });\n" + " highlight_current_focus_idx ();\n"); + /* html_builder's ctor. */ html_builder::html_builder (diagnostic_context &context, - pretty_printer &pp, - const line_maps *line_maps) + pretty_printer &pp, + const line_maps *line_maps, + const html_generation_options &html_gen_opts) : m_context (context), m_printer (&pp), - m_line_maps (line_maps) + m_line_maps (line_maps), + m_html_gen_opts (html_gen_opts), + m_head_element (nullptr), + m_diagnostics_element (nullptr), + m_next_diag_id (0) { gcc_assert (m_line_maps); m_document = std::make_unique<xml::document> (); { auto html_element = std::make_unique<xml::element> ("html", false); - html_element->set_attr - ("xmlns", - label_text::borrow ("http://www.w3.org/1999/xhtml")); + html_element->set_attr ("xmlns", + "http://www.w3.org/1999/xhtml"); + xml::printer xp (*html_element.get ()); + m_document->add_child (std::move (html_element)); + { + xml::auto_print_element head (xp, "head"); + m_head_element = xp.get_insertion_point (); { - auto head_element = std::make_unique<xml::element> ("head", false); + xml::auto_print_element title (xp, "title", true); + xp.add_text ("Title goes here"); + } + if (m_html_gen_opts.m_css) + xp.add_raw (HTML_STYLE); + if (m_html_gen_opts.m_javascript) { - auto title_element = std::make_unique<xml::element> ("title", true); - label_text title (label_text::borrow ("Title goes here")); // TODO - title_element->add_text (std::move (title)); - head_element->add_child (std::move (title_element)); + xp.push_tag ("script"); + /* Escaping rules are different for HTML <script> elements, + so add the script "raw" for now. */ + xp.add_raw (HTML_SCRIPT); + xp.pop_tag (); // script } - html_element->add_child (std::move (head_element)); + } - auto body_element = std::make_unique<xml::element> ("body", false); - { - auto diagnostics_element - = make_div (label_text::borrow ("gcc-diagnostic-list")); - m_diagnostics_element = diagnostics_element.get (); - body_element->add_child (std::move (diagnostics_element)); - } - html_element->add_child (std::move (body_element)); + { + xml::auto_print_element body (xp, "body"); + { + auto diagnostics_element = make_div ("gcc-diagnostic-list"); + m_diagnostics_element = diagnostics_element.get (); + xp.append (std::move (diagnostics_element)); } } - m_document->add_child (std::move (html_element)); } } @@ -477,6 +654,45 @@ html_builder::on_report_diagnostic (const diagnostic_info &diagnostic, } } +/* Custom subclass of html_label_writer. + Wrap labels within a <span> element, supplying them with event IDs. + Add the IDs to the list of focus IDs. */ + +class html_path_label_writer : public html_label_writer +{ +public: + html_path_label_writer (xml::printer &xp, + html_builder &builder, + const std::string &event_id_prefix) + : m_xp (xp), + m_html_builder (builder), + m_event_id_prefix (event_id_prefix), + m_next_event_idx (0) + { + } + + void begin_label () final override + { + m_xp.push_tag_with_class ("span", "event", true); + pretty_printer pp; + pp_printf (&pp, "%s%i", + m_event_id_prefix.c_str (), m_next_event_idx++); + m_xp.set_attr ("id", pp_formatted_text (&pp)); + m_html_builder.add_focus_id (pp_formatted_text (&pp)); + } + + void end_label () final override + { + m_xp.pop_tag (); // span + } + +private: + xml::printer &m_xp; + html_builder &m_html_builder; + const std::string &m_event_id_prefix; + int m_next_event_idx; +}; + std::unique_ptr<xml::element> html_builder::make_element_for_diagnostic (const diagnostic_info &diagnostic, diagnostic_t orig_diag_kind) @@ -506,8 +722,7 @@ html_builder::make_element_for_diagnostic (const diagnostic_info &diagnostic, pp_token_text *sub = as_a <pp_token_text *> (iter); /* The value might be in the obstack, so we may need to copy it. */ - insertion_element ().add_text - (label_text::take (xstrdup (sub->m_value.get ()))); + insertion_element ().add_text (sub->m_value.get ()); } break; @@ -518,14 +733,14 @@ html_builder::make_element_for_diagnostic (const diagnostic_info &diagnostic, case pp_token::kind::begin_quote: { - insertion_element ().add_text (label_text::borrow (open_quote)); - push_element (make_span (label_text::borrow ("gcc-quoted-text"))); + insertion_element ().add_text (open_quote); + push_element (make_span ("gcc-quoted-text")); } break; case pp_token::kind::end_quote: { pop_element (); - insertion_element ().add_text (label_text::borrow (close_quote)); + insertion_element ().add_text (close_quote); } break; @@ -533,7 +748,7 @@ html_builder::make_element_for_diagnostic (const diagnostic_info &diagnostic, { pp_token_begin_url *sub = as_a <pp_token_begin_url *> (iter); auto anchor = std::make_unique<xml::element> ("a", true); - anchor->set_attr ("href", std::move (sub->m_value)); + anchor->set_attr ("href", sub->m_value.get ()); push_element (std::move (anchor)); } break; @@ -565,11 +780,24 @@ html_builder::make_element_for_diagnostic (const diagnostic_info &diagnostic, std::vector<xml::element *> m_open_elements; }; - auto diag_element = make_div (label_text::borrow ("gcc-diagnostic")); + auto diag_element = make_div ("gcc-diagnostic"); + + const int diag_idx = m_next_diag_id++; + std::string diag_id; + { + pretty_printer pp; + pp_printf (&pp, "gcc-diag-%i", diag_idx); + diag_id = pp_formatted_text (&pp); + } + diag_element->set_attr ("id", diag_id); // TODO: might be nice to emulate the text output format, but colorize it - auto message_span = make_span (label_text::borrow ("gcc-message")); + auto message_span = make_span ("gcc-message"); + std::string message_span_id (diag_id + "-message"); + message_span->set_attr ("id", message_span_id); + add_focus_id (message_span_id); + html_token_printer tok_printer (*this, *message_span.get ()); m_printer->set_token_printer (&tok_printer); pp_output_formatted_text (m_printer, m_context.get_urlifier ()); @@ -579,7 +807,7 @@ html_builder::make_element_for_diagnostic (const diagnostic_info &diagnostic, if (diagnostic.metadata) { - diag_element->add_text (label_text::borrow (" ")); + diag_element->add_text (" "); diag_element->add_child (make_element_for_metadata (*diagnostic.metadata)); } @@ -592,32 +820,47 @@ html_builder::make_element_for_diagnostic (const diagnostic_info &diagnostic, label_text option_url = label_text::take (m_context.make_option_url (diagnostic.option_id)); - diag_element->add_text (label_text::borrow (" ")); - auto option_span = make_span (label_text::borrow ("gcc-option")); - option_span->add_text (label_text::borrow ("[")); + diag_element->add_text (" "); + auto option_span = make_span ("gcc-option"); + option_span->add_text ("["); { if (option_url.get ()) { auto anchor = std::make_unique<xml::element> ("a", true); - anchor->set_attr ("href", std::move (option_url)); - anchor->add_text (std::move (option_text)); + anchor->set_attr ("href", option_url.get ()); + anchor->add_text (option_text.get ()); option_span->add_child (std::move (anchor)); } else - option_span->add_text (std::move (option_text)); - option_span->add_text (label_text::borrow ("]")); + option_span->add_text (option_text.get ()); + option_span->add_text ("]"); } diag_element->add_child (std::move (option_span)); } /* Source (and fix-it hints). */ - if (auto source_element = make_element_for_source (diagnostic)) - diag_element->add_child (std::move (source_element)); + { + xml::printer xp (*diag_element); + m_context.m_last_location = UNKNOWN_LOCATION; + m_context.maybe_show_locus_as_html (*diagnostic.richloc, + m_context.m_source_printing, + diagnostic.kind, + xp, + nullptr, + nullptr); + } /* Execution path. */ if (auto path = diagnostic.richloc->get_path ()) - if (auto path_element = make_element_for_path (*path)) - diag_element->add_child (std::move (path_element)); + { + xml::printer xp (*diag_element); + std::string event_id_prefix (diag_id + "-event-"); + html_path_label_writer event_label_writer (xp, *this, + event_id_prefix); + diagnostic_source_print_policy dspp (m_context); + print_path_as_html (xp, *path, m_context, &event_label_writer, + dspp); + } if (auto patch_element = make_element_for_patch (diagnostic)) diag_element->add_child (std::move (patch_element)); @@ -626,61 +869,23 @@ html_builder::make_element_for_diagnostic (const diagnostic_info &diagnostic, } std::unique_ptr<xml::element> -html_builder::make_element_for_source (const diagnostic_info &diagnostic) -{ - // TODO: ideally we'd like to capture elements within the following: - m_context.m_last_location = UNKNOWN_LOCATION; - pp_clear_output_area (m_printer); - diagnostic_show_locus (&m_context, - m_context.m_source_printing, - diagnostic.richloc, diagnostic.kind, - m_printer); - auto text = label_text::take (xstrdup (pp_formatted_text (m_printer))); - pp_clear_output_area (m_printer); - - if (strlen (text.get ()) == 0) - return nullptr; - - auto pre = std::make_unique<xml::element> ("pre", true); - pre->set_attr ("class", label_text::borrow ("gcc-annotated-source")); - pre->add_text (std::move (text)); - return pre; -} - -std::unique_ptr<xml::element> -html_builder::make_element_for_path (const diagnostic_path &path) -{ - m_context.m_last_location = UNKNOWN_LOCATION; - diagnostic_text_output_format text_format (m_context); - pp_show_color (text_format.get_printer ()) = false; - pp_buffer (text_format.get_printer ())->m_flush_p = false; - // TODO: ideally we'd like to capture elements within the following: - text_format.print_path (path); - auto text = label_text::take - (xstrdup (pp_formatted_text (text_format.get_printer ()))); - - if (strlen (text.get ()) == 0) - return nullptr; - - auto pre = std::make_unique<xml::element> ("pre", true); - pre->set_attr ("class", label_text::borrow ("gcc-execution-path")); - pre->add_text (std::move (text)); - return pre; -} - -std::unique_ptr<xml::element> html_builder::make_element_for_patch (const diagnostic_info &diagnostic) { edit_context ec (m_context.get_file_cache ()); ec.add_fixits (diagnostic.richloc); if (char *diff = ec.generate_diff (true)) - if (strlen (diff) > 0) - { - auto element = std::make_unique<xml::element> ("pre", true); - element->set_attr ("class", label_text::borrow ("gcc-generated-patch")); - element->add_text (label_text::take (diff)); - return element; - } + { + if (strlen (diff) > 0) + { + auto element = std::make_unique<xml::element> ("pre", true); + element->set_attr ("class", "gcc-generated-patch"); + element->add_text (diff); + free (diff); + return element; + } + else + free (diff); + } return nullptr; } @@ -688,22 +893,23 @@ std::unique_ptr<xml::element> html_builder::make_metadata_element (label_text label, label_text url) { - auto item = make_span (label_text::borrow ("gcc-metadata-item")); - item->add_text (label_text::borrow ("[")); + auto item = make_span ("gcc-metadata-item"); + xml::printer xp (*item.get ()); + xp.add_text ("["); { - auto anchor = std::make_unique<xml::element> ("a", true); - anchor->set_attr ("href", std::move (url)); - anchor->add_child (std::make_unique<xml::text> (std::move (label))); - item->add_child (std::move (anchor)); + xp.push_tag ("a", true); + xp.set_attr ("href", url.get ()); + xp.add_text (label.get ()); + xp.pop_tag (); } - item->add_text (label_text::borrow ("]")); + xp.add_text ("]"); return item; } std::unique_ptr<xml::element> html_builder::make_element_for_metadata (const diagnostic_metadata &metadata) { - auto span_metadata = make_span (label_text::borrow ("gcc-metadata")); + auto span_metadata = make_span ("gcc-metadata"); int cwe = metadata.get_cwe (); if (cwe) @@ -737,7 +943,7 @@ html_builder::emit_diagram (const diagnostic_diagram &/*diagram*/) /* We must be within the emission of a top-level diagnostic. */ gcc_assert (m_cur_diagnostic_element); - // TODO + // TODO: currently a no-op } /* Implementation of "end_group_cb" for HTML output. */ @@ -757,6 +963,20 @@ html_builder::end_group () void html_builder::flush_to_file (FILE *outf) { + if (m_html_gen_opts.m_javascript) + { + gcc_assert (m_head_element); + xml::printer xp (*m_head_element); + /* Add an initialization of the global js variable "focus_ids" + using the array of IDs we saved as we went. */ + xp.push_tag ("script"); + pretty_printer pp; + pp_string (&pp, "focus_ids = "); + m_ui_focus_ids.print (&pp, true); + pp_string (&pp, ";\n"); + xp.add_raw (pp_formatted_text (&pp)); + xp.pop_tag (); // script + } auto top = m_document.get (); top->dump (outf); fprintf (outf, "\n"); @@ -842,9 +1062,10 @@ public: protected: html_output_format (diagnostic_context &context, - const line_maps *line_maps) + const line_maps *line_maps, + const html_generation_options &html_gen_opts) : diagnostic_output_format (context), - m_builder (context, *get_printer (), line_maps), + m_builder (context, *get_printer (), line_maps, html_gen_opts), m_buffer (nullptr) {} @@ -857,8 +1078,9 @@ class html_file_output_format : public html_output_format public: html_file_output_format (diagnostic_context &context, const line_maps *line_maps, + const html_generation_options &html_gen_opts, diagnostic_output_file output_file) - : html_output_format (context, line_maps), + : html_output_format (context, line_maps, html_gen_opts), m_output_file (std::move (output_file)) { gcc_assert (m_output_file.get_open_file ()); @@ -922,11 +1144,13 @@ diagnostic_output_format_open_html_file (diagnostic_context &context, std::unique_ptr<diagnostic_output_format> make_html_sink (diagnostic_context &context, const line_maps &line_maps, + const html_generation_options &html_gen_opts, diagnostic_output_file output_file) { auto sink = std::make_unique<html_file_output_format> (context, &line_maps, + html_gen_opts, std::move (output_file)); sink->update_printer (); return sink; @@ -945,8 +1169,12 @@ class test_html_diagnostic_context : public test_diagnostic_context public: test_html_diagnostic_context () { + html_generation_options html_gen_opts; + html_gen_opts.m_css = false; + html_gen_opts.m_javascript = false; auto sink = std::make_unique<html_buffered_output_format> (*this, - line_table); + line_table, + html_gen_opts); sink->update_printer (); m_format = sink.get (); // borrowed @@ -968,8 +1196,9 @@ private: { public: html_buffered_output_format (diagnostic_context &context, - const line_maps *line_maps) - : html_output_format (context, line_maps) + const line_maps *line_maps, + const html_generation_options &html_gen_opts) + : html_output_format (context, line_maps, html_gen_opts) { } bool machine_readable_stderr_p () const final override @@ -1009,12 +1238,12 @@ test_simple_log () " </head>\n" " <body>\n" " <div class=\"gcc-diagnostic-list\">\n" - " <div class=\"gcc-diagnostic\">\n" - " <span class=\"gcc-message\">this is a test: `<span class=\"gcc-quoted-text\">foo</span>'</span>\n" + " <div class=\"gcc-diagnostic\" id=\"gcc-diag-0\">\n" + " <span class=\"gcc-message\" id=\"gcc-diag-0-message\">this is a test: `<span class=\"gcc-quoted-text\">foo</span>'</span>\n" " </div>\n" " </div>\n" " </body>\n" - "</html>")); + "</html>\n")); } static void @@ -1031,7 +1260,6 @@ test_metadata () element->write_as_xml (&pp, 0, true); ASSERT_STREQ (pp_formatted_text (&pp), - "\n" "<span class=\"gcc-metadata\">" "<span class=\"gcc-metadata-item\">" "[" @@ -1040,7 +1268,7 @@ test_metadata () "</a>" "]" "</span>" - "</span>"); + "</span>\n"); } { @@ -1053,7 +1281,6 @@ test_metadata () element->write_as_xml (&pp, 0, true); ASSERT_STREQ (pp_formatted_text (&pp), - "\n" "<span class=\"gcc-metadata\">" "<span class=\"gcc-metadata-item\">" "[" @@ -1062,10 +1289,71 @@ test_metadata () "</a>" "]" "</span>" - "</span>"); + "</span>\n"); } } +static void +test_printer () +{ + xml::element top ("top", false); + xml::printer xp (top); + xp.push_tag ("foo"); + xp.add_text ("hello"); + xp.push_tag ("bar"); + xp.set_attr ("size", "3"); + xp.set_attr ("color", "red"); + xp.add_text ("world"); + xp.push_tag ("baz"); + xp.pop_tag (); + xp.pop_tag (); + xp.pop_tag (); + + pretty_printer pp; + top.write_as_xml (&pp, 0, true); + ASSERT_STREQ + (pp_formatted_text (&pp), + "<top>\n" + " <foo>\n" + " hello\n" + " <bar size=\"3\" color=\"red\">\n" + " world\n" + " <baz/>\n" + " </bar>\n" + " </foo>\n" + "</top>\n"); +} + +// Verify that element attributes preserve insertion order. + +static void +test_attribute_ordering () +{ + xml::element top ("top", false); + xml::printer xp (top); + xp.push_tag ("chronological"); + xp.set_attr ("maldon", "991"); + xp.set_attr ("hastings", "1066"); + xp.set_attr ("edgehill", "1642"); + xp.set_attr ("naseby", "1645"); + xp.pop_tag (); + xp.push_tag ("alphabetical"); + xp.set_attr ("edgehill", "1642"); + xp.set_attr ("hastings", "1066"); + xp.set_attr ("maldon", "991"); + xp.set_attr ("naseby", "1645"); + xp.pop_tag (); + + pretty_printer pp; + top.write_as_xml (&pp, 0, true); + ASSERT_STREQ + (pp_formatted_text (&pp), + "<top>\n" + " <chronological maldon=\"991\" hastings=\"1066\" edgehill=\"1642\" naseby=\"1645\"/>\n" + " <alphabetical edgehill=\"1642\" hastings=\"1066\" maldon=\"991\" naseby=\"1645\"/>\n" + "</top>\n"); +} + /* Run all of the selftests within this file. */ void @@ -1074,6 +1362,8 @@ diagnostic_format_html_cc_tests () auto_fix_quotes fix_quotes; test_simple_log (); test_metadata (); + test_printer (); + test_attribute_ordering (); } } // namespace selftest diff --git a/gcc/diagnostic-format-html.h b/gcc/diagnostic-format-html.h index ff5edca..9ca43f2 100644 --- a/gcc/diagnostic-format-html.h +++ b/gcc/diagnostic-format-html.h @@ -24,6 +24,14 @@ along with GCC; see the file COPYING3. If not see #include "diagnostic-format.h" #include "diagnostic-output-file.h" +struct html_generation_options +{ + html_generation_options (); + + bool m_css; + bool m_javascript; +}; + extern diagnostic_output_file diagnostic_output_format_open_html_file (diagnostic_context &context, line_maps *line_maps, @@ -32,6 +40,14 @@ diagnostic_output_format_open_html_file (diagnostic_context &context, extern std::unique_ptr<diagnostic_output_format> make_html_sink (diagnostic_context &context, const line_maps &line_maps, + const html_generation_options &html_gen_opts, diagnostic_output_file output_file); +extern void +print_path_as_html (xml::printer &xp, + const diagnostic_path &path, + diagnostic_context &dc, + html_label_writer *event_label_writer, + const diagnostic_source_print_policy &dspp); + #endif /* ! GCC_DIAGNOSTIC_FORMAT_HTML_H */ diff --git a/gcc/diagnostic-path-output.cc b/gcc/diagnostic-path-output.cc new file mode 100644 index 0000000..4c17865 --- /dev/null +++ b/gcc/diagnostic-path-output.cc @@ -0,0 +1,2713 @@ +/* Printing paths through the code associated with a diagnostic. + Copyright (C) 2019-2025 Free Software Foundation, Inc. + Contributed by David Malcolm <dmalcolm@redhat.com> + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#include "config.h" +#define INCLUDE_ALGORITHM +#define INCLUDE_MAP +#define INCLUDE_STRING +#define INCLUDE_VECTOR +#include "system.h" +#include "coretypes.h" +#include "diagnostic.h" +#include "diagnostic-macro-unwinding.h" +#include "intl.h" +#include "diagnostic-path.h" +#include "gcc-rich-location.h" +#include "diagnostic-color.h" +#include "diagnostic-event-id.h" +#include "diagnostic-label-effects.h" +#include "pretty-print-markup.h" +#include "selftest.h" +#include "selftest-diagnostic.h" +#include "selftest-diagnostic-path.h" +#include "text-art/theme.h" +#include "diagnostic-format-text.h" +#include "diagnostic-format-html.h" +#include "xml.h" +#include "xml-printer.h" + +/* Disable warnings about missing quoting in GCC diagnostics for the print + calls below. */ +#if __GNUC__ >= 10 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wformat-diag" +#endif + +/* Anonymous namespace for path-printing code. */ + +namespace { + +/* A bundle of state for printing a path. */ + +class path_print_policy +{ +public: + path_print_policy (const diagnostic_text_output_format &text_output) + : m_source_policy (text_output.get_context ()) + { + } + + path_print_policy (const diagnostic_context &dc) + : m_source_policy (dc) + { + } + + text_art::theme * + get_diagram_theme () const + { + return m_source_policy.get_diagram_theme (); + } + + const diagnostic_source_print_policy & + get_source_policy () const { return m_source_policy; } + +private: + diagnostic_source_print_policy m_source_policy; +}; + +/* Subclass of range_label for showing a particular event + when showing a consecutive run of events within a diagnostic_path as + labelled ranges within one gcc_rich_location. */ + +class path_label : public range_label +{ + public: + path_label (const diagnostic_path &path, + const pretty_printer &ref_pp, + unsigned start_idx, + bool colorize, + bool allow_emojis) + : m_path (path), + m_ref_pp (ref_pp), + m_start_idx (start_idx), m_effects (*this), + m_colorize (colorize), m_allow_emojis (allow_emojis) + {} + + label_text get_text (unsigned range_idx) const final override + { + unsigned event_idx = m_start_idx + range_idx; + const diagnostic_event &event = m_path.get_event (event_idx); + + const diagnostic_event::meaning meaning (event.get_meaning ()); + + auto pp = m_ref_pp.clone (); + pp_show_color (pp.get ()) = m_colorize; + diagnostic_event_id_t event_id (event_idx); + + pp_printf (pp.get (), "%@", &event_id); + pp_space (pp.get ()); + + if (meaning.m_verb == diagnostic_event::VERB_danger + && m_allow_emojis) + { + pp_unicode_character (pp.get (), 0x26A0); /* U+26A0 WARNING SIGN. */ + /* Append U+FE0F VARIATION SELECTOR-16 to select the emoji + variation of the char. */ + pp_unicode_character (pp.get (), 0xFE0F); + /* U+26A0 WARNING SIGN has East_Asian_Width == Neutral, but in its + emoji variant is printed (by vte at least) with a 2nd half + overlapping the next char. Hence we add two spaces here: a space + to be covered by this overlap, plus another space of padding. */ + pp_string (pp.get (), " "); + } + + event.print_desc (*pp.get ()); + + label_text result + = label_text::take (xstrdup (pp_formatted_text (pp.get ()))); + return result; + } + + const label_effects *get_effects (unsigned /*range_idx*/) const + { + return &m_effects; + } + + private: + class path_label_effects : public label_effects + { + public: + path_label_effects (const path_label &path_label) + : m_path_label (path_label) + { + } + bool has_in_edge (unsigned range_idx) const final override + { + if (const diagnostic_event *prev_event + = m_path_label.get_prev_event (range_idx)) + return prev_event->connect_to_next_event_p (); + return false; + } + bool has_out_edge (unsigned range_idx) const final override + { + const diagnostic_event &event = m_path_label.get_event (range_idx); + return event.connect_to_next_event_p (); + } + + private: + const path_label &m_path_label; + }; + + const diagnostic_event &get_event (unsigned range_idx) const + { + unsigned event_idx = m_start_idx + range_idx; + return m_path.get_event (event_idx); + } + + const diagnostic_event *get_prev_event (unsigned range_idx) const + { + if (m_start_idx + range_idx == 0) + return nullptr; + unsigned event_idx = m_start_idx + range_idx - 1; + return &m_path.get_event (event_idx); + } + + const diagnostic_path &m_path; + const pretty_printer &m_ref_pp; + unsigned m_start_idx; + path_label_effects m_effects; + const bool m_colorize; + const bool m_allow_emojis; +}; + +/* Return true if E1 and E2 can be consolidated into the same run of events + when printing a diagnostic_path. */ + +static bool +can_consolidate_events (const diagnostic_path &path, + const diagnostic_event &e1, + unsigned ev1_idx, + const diagnostic_event &e2, + unsigned ev2_idx, + bool check_locations) +{ + if (e1.get_thread_id () != e2.get_thread_id ()) + return false; + + if (!path.same_function_p (ev1_idx, ev2_idx)) + return false; + + if (e1.get_stack_depth () != e2.get_stack_depth ()) + return false; + + if (check_locations) + { + location_t loc1 = e1.get_location (); + location_t loc2 = e2.get_location (); + + if (loc1 < RESERVED_LOCATION_COUNT + || loc2 < RESERVED_LOCATION_COUNT) + return false; + + /* Neither can be macro-based. */ + if (linemap_location_from_macro_expansion_p (line_table, loc1)) + return false; + if (linemap_location_from_macro_expansion_p (line_table, loc2)) + return false; + } + + /* Passed all the tests. */ + return true; +} + +struct event_range; +struct path_summary; +class thread_event_printer; + +/* A bundle of information about all of the events in a diagnostic_path + relating to a specific path, for use by path_summary. */ + +class per_thread_summary +{ +public: + per_thread_summary (const diagnostic_path &path, + const logical_location_manager &logical_loc_mgr, + label_text name, unsigned swimlane_idx) + : m_path (path), + m_logical_loc_mgr (logical_loc_mgr), + m_name (std::move (name)), + m_swimlane_idx (swimlane_idx), + m_last_event (nullptr), + m_min_depth (INT_MAX), + m_max_depth (INT_MIN) + {} + + void update_depth_limits (int stack_depth) + { + if (stack_depth < m_min_depth) + m_min_depth = stack_depth; + if (stack_depth > m_max_depth) + m_max_depth = stack_depth; + } + + const char *get_name () const { return m_name.get (); } + unsigned get_swimlane_index () const { return m_swimlane_idx; } + + bool interprocedural_p () const; + +private: + friend struct path_summary; + friend class thread_event_printer; + friend struct event_range; + + const diagnostic_path &m_path; + const logical_location_manager &m_logical_loc_mgr; + + const label_text m_name; + + /* The "swimlane index" is the order in which this per_thread_summary + was created, for use when printing the events. */ + const unsigned m_swimlane_idx; + + // The event ranges specific to this thread: + auto_vec<event_range *> m_event_ranges; + + const diagnostic_event *m_last_event; + + int m_min_depth; + int m_max_depth; +}; + +/* A stack frame for use in HTML output, holding child stack frames, + and event ranges. */ + +struct stack_frame +{ + stack_frame (std::unique_ptr<stack_frame> parent, + logical_location logical_loc, + int stack_depth) + : m_parent (std::move (parent)), + m_logical_loc (logical_loc), + m_stack_depth (stack_depth) + {} + + std::unique_ptr<stack_frame> m_parent; + logical_location m_logical_loc; + const int m_stack_depth; +}; + +/* Begin emitting content relating to a new stack frame within PARENT. + Allocated a new stack_frame and return it. */ + +static std::unique_ptr<stack_frame> +begin_html_stack_frame (xml::printer &xp, + std::unique_ptr<stack_frame> parent, + logical_location logical_loc, + int stack_depth, + const logical_location_manager *logical_loc_mgr) +{ + if (logical_loc) + { + gcc_assert (logical_loc_mgr); + xp.push_tag_with_class ("table", "stack-frame-with-margin", false); + xp.push_tag ("tr", false); + { + xp.push_tag_with_class ("td", "interprocmargin", false); + xp.set_attr ("style", "padding-left: 100px"); + xp.pop_tag (); + } + xp.push_tag_with_class ("td", "stack-frame", false); + label_text funcname + = logical_loc_mgr->get_name_for_path_output (logical_loc); + if (funcname.get ()) + { + xp.push_tag_with_class ("div", "frame-funcname", false); + xp.push_tag ("span", true); + xp.add_text (funcname.get ()); + xp.pop_tag (); // span + xp.pop_tag (); // div + } + } + return std::make_unique<stack_frame> (std::move (parent), + logical_loc, + stack_depth); +} + +/* Finish emitting content for FRAME and delete it. + Return parent. */ + +static std::unique_ptr<stack_frame> +end_html_stack_frame (xml::printer &xp, + std::unique_ptr<stack_frame> frame) +{ + auto parent = std::move (frame->m_parent); + if (frame->m_logical_loc) + { + xp.pop_tag (); // td + xp.pop_tag (); // tr + xp.pop_tag (); // table + } + return parent; +} + +/* Append an HTML <div> element to XP containing an SVG arrow representing + a change in stack depth from OLD_DEPTH to NEW_DEPTH. */ + +static void +emit_svg_arrow (xml::printer &xp, int old_depth, int new_depth) +{ + const int pixels_per_depth = 100; + const int min_depth = MIN (old_depth, new_depth); + const int base_x = 20; + const int excess = 30; + const int last_x + = base_x + (old_depth - min_depth) * pixels_per_depth; + const int this_x + = base_x + (new_depth - min_depth) * pixels_per_depth; + pretty_printer tmp_pp; + pretty_printer *pp = &tmp_pp; + pp_printf (pp, "<div class=\"%s\">\n", + old_depth < new_depth + ? "between-ranges-call" : "between-ranges-return"); + pp_printf (pp, " <svg height=\"30\" width=\"%i\">\n", + MAX (last_x, this_x) + excess); + pp_string + (pp, + " <defs>\n" + " <marker id=\"arrowhead\" markerWidth=\"10\" markerHeight=\"7\"\n" + " refX=\"0\" refY=\"3.5\" orient=\"auto\" stroke=\"#0088ce\" fill=\"#0088ce\">\n" + " <polygon points=\"0 0, 10 3.5, 0 7\"/>\n" + " </marker>\n" + " </defs>\n"); + pp_printf (pp, + " <polyline points=\"%i,0 %i,10 %i,10 %i,20\"\n", + last_x, last_x, this_x, this_x); + pp_string + (pp, + " style=\"fill:none;stroke: #0088ce\"\n" + " marker-end=\"url(#arrowhead)\"/>\n" + " </svg>\n" + "</div>\n\n"); + xp.add_raw (pp_formatted_text (pp)); +} + +/* A range of consecutive events within a diagnostic_path, all within the + same thread, and with the same fndecl and stack_depth, and which are suitable + to print with a single call to diagnostic_show_locus. */ +struct event_range +{ + /* A struct for tracking the mergability of labels on a particular + source line. In particular, track information about links between + labels to ensure that we only consolidate events involving links + that the source-printing code is able to handle (splitting them + otherwise). */ + struct per_source_line_info + { + void init (int line) + { + m_line = line; + m_has_in_edge = false; + m_has_out_edge = false; + m_min_label_source_column = INT_MAX; + m_max_label_source_column = INT_MIN; + } + + /* Return true if our source-printing/labelling/linking code can handle + the events already on this source line, *and* a new event at COLUMN. */ + bool + can_add_label_for_event_p (bool has_in_edge, + const diagnostic_event *prev_event, + bool has_out_edge, + int column) const + { + /* Any existing in-edge has to be the left-most label on its + source line. */ + if (m_has_in_edge && column < m_min_label_source_column) + return false; + /* Any existing out-edge has to be the right-most label on its + source line. */ + if (m_has_out_edge && column > m_max_label_source_column) + return false; + /* Can't have more than one in-edge. */ + if (m_has_in_edge && has_in_edge) + return false; + /* Can't have more than one out-edge. */ + if (m_has_out_edge && has_out_edge) + return false; + + if (has_in_edge) + { + /* Any new in-edge needs to be the left-most label on its + source line. */ + if (column > m_min_label_source_column) + return false; + + gcc_assert (prev_event); + const location_t prev_loc = prev_event->get_location (); + expanded_location prev_exploc + = linemap_client_expand_location_to_spelling_point + (line_table, prev_loc, LOCATION_ASPECT_CARET); + /* The destination in-edge's line number has to be <= the + source out-edge's line number (if any). */ + if (prev_exploc.line >= m_line) + return false; + } + + /* Any new out-edge needs to be the right-most label on its + source line. */ + if (has_out_edge) + if (column < m_max_label_source_column) + return false; + + /* All checks passed; we can add the new event at COLUMN. */ + return true; + } + + void + add_label_for_event (bool has_in_edge, bool has_out_edge, int column) + { + if (has_in_edge) + m_has_in_edge = true; + if (has_out_edge) + m_has_out_edge = true; + m_min_label_source_column = std::min (m_min_label_source_column, column); + m_max_label_source_column = std::max (m_max_label_source_column, column); + } + + int m_line; + bool m_has_in_edge; + bool m_has_out_edge; + int m_min_label_source_column; + int m_max_label_source_column; + }; + + event_range (const diagnostic_path &path, + const pretty_printer &ref_pp, + unsigned start_idx, + const diagnostic_event &initial_event, + per_thread_summary &t, + bool show_event_links, + bool colorize_labels, + bool allow_emojis) + : m_path (path), + m_initial_event (initial_event), + m_logical_loc (initial_event.get_logical_location ()), + m_stack_depth (initial_event.get_stack_depth ()), + m_start_idx (start_idx), m_end_idx (start_idx), + m_path_label (path, ref_pp, + start_idx, colorize_labels, allow_emojis), + m_richloc (initial_event.get_location (), &m_path_label, nullptr), + m_thread_id (initial_event.get_thread_id ()), + m_per_thread_summary (t), + m_show_event_links (show_event_links) + { + if (m_show_event_links) + { + expanded_location exploc + = linemap_client_expand_location_to_spelling_point + (line_table, initial_event.get_location (), LOCATION_ASPECT_CARET); + per_source_line_info &source_line_info + = get_per_source_line_info (exploc.line); + + const diagnostic_event *prev_thread_event = t.m_last_event; + const bool has_in_edge + = (prev_thread_event + ? prev_thread_event->connect_to_next_event_p () + : false); + const bool has_out_edge = initial_event.connect_to_next_event_p (); + + source_line_info.add_label_for_event + (has_in_edge, has_out_edge, exploc.column); + } + } + + per_source_line_info & + get_per_source_line_info (int source_line) + { + bool existed = false; + per_source_line_info &result + = m_source_line_info_map.get_or_insert (source_line, &existed); + if (!existed) + result.init (source_line); + return result; + } + + bool maybe_add_event (const path_print_policy &policy, + const diagnostic_event &new_ev, + unsigned new_ev_idx, + bool check_rich_locations) + { + if (!can_consolidate_events (m_path, + m_initial_event, m_start_idx, + new_ev, new_ev_idx, + check_rich_locations)) + return false; + + /* Verify compatibility of the new label and existing labels + with respect to the link-printing code. */ + expanded_location exploc + = linemap_client_expand_location_to_spelling_point + (line_table, new_ev.get_location (), LOCATION_ASPECT_CARET); + per_source_line_info &source_line_info + = get_per_source_line_info (exploc.line); + const diagnostic_event *prev_event = nullptr; + if (new_ev_idx > 0) + prev_event = &m_path.get_event (new_ev_idx - 1); + const bool has_in_edge = (prev_event + ? prev_event->connect_to_next_event_p () + : false); + const bool has_out_edge = new_ev.connect_to_next_event_p (); + if (m_show_event_links) + if (!source_line_info.can_add_label_for_event_p + (has_in_edge, prev_event, + has_out_edge, exploc.column)) + return false; + + /* Potentially verify that the locations are sufficiently close. */ + if (check_rich_locations) + if (!m_richloc.add_location_if_nearby (policy.get_source_policy (), + new_ev.get_location (), + false, &m_path_label)) + return false; + + m_end_idx = new_ev_idx; + m_per_thread_summary.m_last_event = &new_ev; + + if (m_show_event_links) + source_line_info.add_label_for_event + (has_in_edge, has_out_edge, exploc.column); + + return true; + } + + /* Print the events in this range to PP, typically as a single + call to diagnostic_show_locus. */ + + void print_as_text (pretty_printer &pp, + diagnostic_text_output_format &text_output, + diagnostic_source_effect_info *effect_info) + { + location_t initial_loc = m_initial_event.get_location (); + + diagnostic_context &dc = text_output.get_context (); + + /* Emit a span indicating the filename (and line/column) if the + line has changed relative to the last call to + diagnostic_show_locus. */ + if (dc.m_source_printing.enabled) + { + expanded_location exploc + = linemap_client_expand_location_to_spelling_point + (line_table, initial_loc, LOCATION_ASPECT_CARET); + if (exploc.file != LOCATION_FILE (dc.m_last_location)) + { + diagnostic_location_print_policy loc_policy (text_output); + loc_policy.print_text_span_start (dc, pp, exploc); + } + } + + /* If we have an UNKNOWN_LOCATION (or BUILTINS_LOCATION) as the + primary location for an event, diagnostic_show_locus won't print + anything. + + In particular the label for the event won't get printed. + Fail more gracefully in this case by showing the event + index and text, at no particular location. */ + if (get_pure_location (initial_loc) <= BUILTINS_LOCATION) + { + for (unsigned i = m_start_idx; i <= m_end_idx; i++) + { + const diagnostic_event &iter_event = m_path.get_event (i); + diagnostic_event_id_t event_id (i); + pp_printf (&pp, " %@: ", &event_id); + iter_event.print_desc (pp); + pp_newline (&pp); + } + return; + } + + /* Call diagnostic_show_locus to show the events using labels. */ + diagnostic_show_locus (&dc, text_output.get_source_printing_options (), + &m_richloc, DK_DIAGNOSTIC_PATH, &pp, + effect_info); + + /* If we have a macro expansion, show the expansion to the user. */ + if (linemap_location_from_macro_expansion_p (line_table, initial_loc)) + { + gcc_assert (m_start_idx == m_end_idx); + maybe_unwind_expanded_macro_loc (text_output, initial_loc); + } + } + + /* Print the events in this range to XP, typically as a single + call to diagnostic_show_locus_as_html. */ + + void print_as_html (xml::printer &xp, + diagnostic_context &dc, + diagnostic_source_effect_info *effect_info, + html_label_writer *event_label_writer) + { + location_t initial_loc = m_initial_event.get_location (); + + /* Emit a span indicating the filename (and line/column) if the + line has changed relative to the last call to + diagnostic_show_locus. */ + if (dc.m_source_printing.enabled) + { + expanded_location exploc + = linemap_client_expand_location_to_spelling_point + (line_table, initial_loc, LOCATION_ASPECT_CARET); + if (exploc.file != LOCATION_FILE (dc.m_last_location)) + { + diagnostic_location_print_policy loc_policy (dc); + loc_policy.print_html_span_start (dc, xp, exploc); + } + } + + /* If we have an UNKNOWN_LOCATION (or BUILTINS_LOCATION) as the + primary location for an event, diagnostic_show_locus_as_html won't print + anything. + + In particular the label for the event won't get printed. + Fail more gracefully in this case by showing the event + index and text, at no particular location. */ + if (get_pure_location (initial_loc) <= BUILTINS_LOCATION) + { + for (unsigned i = m_start_idx; i <= m_end_idx; i++) + { + const diagnostic_event &iter_event = m_path.get_event (i); + diagnostic_event_id_t event_id (i); + pretty_printer pp; + pp_printf (&pp, " %@: ", &event_id); + iter_event.print_desc (pp); + if (event_label_writer) + event_label_writer->begin_label (); + xp.add_text (pp_formatted_text (&pp)); + if (event_label_writer) + event_label_writer->end_label (); + } + return; + } + + /* Call diagnostic_show_locus_as_html to show the source, + showing events using labels. */ + diagnostic_show_locus_as_html (&dc, dc.m_source_printing, + &m_richloc, DK_DIAGNOSTIC_PATH, xp, + effect_info, event_label_writer); + + // TODO: show macro expansions + } + + const diagnostic_path &m_path; + const diagnostic_event &m_initial_event; + logical_location m_logical_loc; + int m_stack_depth; + unsigned m_start_idx; + unsigned m_end_idx; + path_label m_path_label; + gcc_rich_location m_richloc; + diagnostic_thread_id_t m_thread_id; + per_thread_summary &m_per_thread_summary; + hash_map<int_hash<int, -1, -2>, + per_source_line_info> m_source_line_info_map; + bool m_show_event_links; +}; + +/* A struct for grouping together the events in a diagnostic_path into + ranges of events, partitioned by thread and by stack frame (i.e. by fndecl + and stack depth). */ + +struct path_summary +{ + path_summary (const path_print_policy &policy, + const pretty_printer &ref_pp, + const diagnostic_path &path, + bool check_rich_locations, + bool colorize = false, + bool show_event_links = true); + + const logical_location_manager &get_logical_location_manager () const + { + return m_logical_loc_mgr; + } + unsigned get_num_ranges () const { return m_ranges.length (); } + bool multithreaded_p () const { return m_per_thread_summary.length () > 1; } + + const per_thread_summary &get_events_for_thread_id (diagnostic_thread_id_t tid) + { + per_thread_summary **slot = m_thread_id_to_events.get (tid); + gcc_assert (slot); + gcc_assert (*slot); + return **slot; + } + + const logical_location_manager &m_logical_loc_mgr; + auto_delete_vec <event_range> m_ranges; + auto_delete_vec <per_thread_summary> m_per_thread_summary; + hash_map<int_hash<diagnostic_thread_id_t, -1, -2>, + per_thread_summary *> m_thread_id_to_events; + +private: + per_thread_summary & + get_or_create_events_for_thread_id (const diagnostic_path &path, + diagnostic_thread_id_t tid) + { + if (per_thread_summary **slot = m_thread_id_to_events.get (tid)) + return **slot; + + const diagnostic_thread &thread = path.get_thread (tid); + per_thread_summary *pts + = new per_thread_summary (path, + m_logical_loc_mgr, + thread.get_name (false), + m_per_thread_summary.length ()); + m_thread_id_to_events.put (tid, pts); + m_per_thread_summary.safe_push (pts); + return *pts; + } +}; + +/* Return true iff there is more than one stack frame used by the events + of this thread. */ + +bool +per_thread_summary::interprocedural_p () const +{ + if (m_event_ranges.is_empty ()) + return false; + int first_stack_depth = m_event_ranges[0]->m_stack_depth; + for (auto range : m_event_ranges) + { + if (!m_path.same_function_p (m_event_ranges[0]->m_start_idx, + range->m_start_idx)) + return true; + if (range->m_stack_depth != first_stack_depth) + return true; + } + return false; +} + +/* path_summary's ctor. */ + +path_summary::path_summary (const path_print_policy &policy, + const pretty_printer &ref_pp, + const diagnostic_path &path, + bool check_rich_locations, + bool colorize, + bool show_event_links) +: m_logical_loc_mgr (path.get_logical_location_manager ()) +{ + const unsigned num_events = path.num_events (); + + event_range *cur_event_range = NULL; + for (unsigned idx = 0; idx < num_events; idx++) + { + const diagnostic_event &event = path.get_event (idx); + const diagnostic_thread_id_t thread_id = event.get_thread_id (); + per_thread_summary &pts + = get_or_create_events_for_thread_id (path, thread_id); + + pts.update_depth_limits (event.get_stack_depth ()); + + if (cur_event_range) + if (cur_event_range->maybe_add_event (policy, + event, + idx, check_rich_locations)) + continue; + + auto theme = policy.get_diagram_theme (); + const bool allow_emojis = theme ? theme->emojis_p () : false; + cur_event_range = new event_range (path, ref_pp, + idx, event, pts, + show_event_links, + colorize, + allow_emojis); + m_ranges.safe_push (cur_event_range); + pts.m_event_ranges.safe_push (cur_event_range); + pts.m_last_event = &event; + } +} + +/* Write SPACES to PP. */ + +static void +write_indent (pretty_printer *pp, int spaces) +{ + for (int i = 0; i < spaces; i++) + pp_space (pp); +} + +static const int base_indent = 2; +static const int per_frame_indent = 2; + +/* A bundle of state for printing event_range instances for a particular + thread. */ + +class thread_event_printer +{ +public: + thread_event_printer (const per_thread_summary &t, bool show_depths) + : m_per_thread_summary (t), + m_show_depths (show_depths), + m_cur_indent (base_indent), + m_vbar_column_for_depth (), + m_num_printed (0) + { + } + + /* Get the previous event_range within this thread, if any. */ + const event_range *get_any_prev_range () const + { + if (m_num_printed > 0) + return m_per_thread_summary.m_event_ranges[m_num_printed - 1]; + else + return nullptr; + } + + /* Get the next event_range within this thread, if any. */ + const event_range *get_any_next_range () const + { + if (m_num_printed < m_per_thread_summary.m_event_ranges.length () - 1) + return m_per_thread_summary.m_event_ranges[m_num_printed + 1]; + else + return nullptr; + } + + void + print_swimlane_for_event_range_as_text (diagnostic_text_output_format &text_output, + pretty_printer *pp, + const logical_location_manager &logical_loc_mgr, + event_range *range, + diagnostic_source_effect_info *effect_info) + { + gcc_assert (pp); + const char *const line_color = "path"; + const char *start_line_color + = colorize_start (pp_show_color (pp), line_color); + const char *end_line_color = colorize_stop (pp_show_color (pp)); + + text_art::ascii_theme fallback_theme; + text_art::theme *theme = text_output.get_diagram_theme (); + if (!theme) + theme = &fallback_theme; + + cppchar_t depth_marker_char = theme->get_cppchar + (text_art::theme::cell_kind::INTERPROCEDURAL_DEPTH_MARKER); + /* e.g. "|". */ + + const bool interprocedural_p = m_per_thread_summary.interprocedural_p (); + + write_indent (pp, m_cur_indent); + if (const event_range *prev_range = get_any_prev_range ()) + { + if (range->m_stack_depth > prev_range->m_stack_depth) + { + gcc_assert (interprocedural_p); + /* Show pushed stack frame(s). */ + cppchar_t left = theme->get_cppchar + (text_art::theme::cell_kind::INTERPROCEDURAL_PUSH_FRAME_LEFT); + cppchar_t middle = theme->get_cppchar + (text_art::theme::cell_kind::INTERPROCEDURAL_PUSH_FRAME_MIDDLE); + cppchar_t right = theme->get_cppchar + (text_art::theme::cell_kind::INTERPROCEDURAL_PUSH_FRAME_RIGHT); + /* e.g. "+--> ". */ + pp_string (pp, start_line_color); + pp_unicode_character (pp, left); + pp_unicode_character (pp, middle); + pp_unicode_character (pp, middle); + pp_unicode_character (pp, right); + pp_space (pp); + pp_string (pp, end_line_color); + m_cur_indent += 5; + } + } + if (range->m_logical_loc) + { + label_text name + (logical_loc_mgr.get_name_for_path_output (range->m_logical_loc)); + if (name.get ()) + pp_printf (pp, "%qs: ", name.get ()); + } + if (range->m_start_idx == range->m_end_idx) + pp_printf (pp, "event %i", + range->m_start_idx + 1); + else + pp_printf (pp, "events %i-%i", + range->m_start_idx + 1, range->m_end_idx + 1); + if (m_show_depths) + pp_printf (pp, " (depth %i)", range->m_stack_depth); + pp_newline (pp); + + /* Print a run of events. */ + if (interprocedural_p) + { + write_indent (pp, m_cur_indent + per_frame_indent); + pp_string (pp, start_line_color); + pp_unicode_character (pp, depth_marker_char); + pp_string (pp, end_line_color); + pp_newline (pp); + + char *saved_prefix = pp_take_prefix (pp); + char *prefix; + { + pretty_printer tmp_pp; + write_indent (&tmp_pp, m_cur_indent + per_frame_indent); + pp_string (&tmp_pp, start_line_color); + pp_unicode_character (&tmp_pp, depth_marker_char); + pp_string (&tmp_pp, end_line_color); + prefix = xstrdup (pp_formatted_text (&tmp_pp)); + } + pp_set_prefix (pp, prefix); + pp_prefixing_rule (pp) = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE; + range->print_as_text (*pp, text_output, effect_info); + pp_set_prefix (pp, saved_prefix); + + write_indent (pp, m_cur_indent + per_frame_indent); + pp_string (pp, start_line_color); + pp_unicode_character (pp, depth_marker_char); + pp_string (pp, end_line_color); + pp_newline (pp); + } + else + range->print_as_text (*pp, text_output, effect_info); + + if (const event_range *next_range = get_any_next_range ()) + { + if (range->m_stack_depth > next_range->m_stack_depth) + { + if (m_vbar_column_for_depth.get (next_range->m_stack_depth)) + { + /* Show returning from stack frame(s), by printing + something like: + " |\n" + " <-------------+\n" + " |\n". */ + gcc_assert (interprocedural_p); + cppchar_t left = theme->get_cppchar + (text_art::theme::cell_kind::INTERPROCEDURAL_POP_FRAMES_LEFT); + cppchar_t middle = theme->get_cppchar + (text_art::theme::cell_kind::INTERPROCEDURAL_POP_FRAMES_MIDDLE); + cppchar_t right = theme->get_cppchar + (text_art::theme::cell_kind::INTERPROCEDURAL_POP_FRAMES_RIGHT); + int vbar_for_next_frame + = *m_vbar_column_for_depth.get (next_range->m_stack_depth); + + int indent_for_next_frame + = vbar_for_next_frame - per_frame_indent; + write_indent (pp, vbar_for_next_frame); + pp_string (pp, start_line_color); + pp_unicode_character (pp, left); + for (int i = indent_for_next_frame + per_frame_indent; + i < m_cur_indent + per_frame_indent - 1; i++) + pp_unicode_character (pp, middle); + pp_unicode_character (pp, right); + pp_string (pp, end_line_color); + pp_newline (pp); + m_cur_indent = indent_for_next_frame; + + write_indent (pp, vbar_for_next_frame); + pp_string (pp, start_line_color); + pp_unicode_character (pp, depth_marker_char); + pp_string (pp, end_line_color); + pp_newline (pp); + } + else + { + /* Handle disjoint paths (e.g. a callback at some later + time). */ + m_cur_indent = base_indent; + } + } + else if (range->m_stack_depth < next_range->m_stack_depth) + { + /* Prepare to show pushed stack frame. */ + gcc_assert (interprocedural_p); + gcc_assert (range->m_stack_depth != EMPTY); + gcc_assert (range->m_stack_depth != DELETED); + m_vbar_column_for_depth.put (range->m_stack_depth, + m_cur_indent + per_frame_indent); + m_cur_indent += per_frame_indent; + } + } + + m_num_printed++; + } + + void + print_swimlane_for_event_range_as_html (diagnostic_context &dc, + xml::printer &xp, + html_label_writer *event_label_writer, + event_range *range, + diagnostic_source_effect_info *effect_info) + { + range->print_as_html (xp, dc, effect_info, event_label_writer); + m_num_printed++; + } + + int get_cur_indent () const { return m_cur_indent; } + +private: + const per_thread_summary &m_per_thread_summary; + bool m_show_depths; + + /* Print the ranges. */ + int m_cur_indent; + + /* Keep track of column numbers of existing '|' characters for + stack depths we've already printed. */ + static const int EMPTY = -1; + static const int DELETED = -2; + typedef int_hash <int, EMPTY, DELETED> vbar_hash; + hash_map <vbar_hash, int> m_vbar_column_for_depth; + + /* How many event ranges within this swimlane have we printed. + This is the index of the next event_range to print. */ + unsigned m_num_printed; +}; + +/* Print path_summary PS to TEXT_OUTPUT, giving an overview of the + interprocedural calls and returns. + + Print the event descriptions in a nested form, printing the event + descriptions within calls to diagnostic_show_locus, using labels to + show the events: + + 'foo' (events 1-2) + | NN | + | | + +--> 'bar' (events 3-4) + | NN | + | | + +--> 'baz' (events 5-6) + | NN | + | | + <------------ + + | + 'foo' (events 7-8) + | NN | + | | + +--> 'bar' (events 9-10) + | NN | + | | + +--> 'baz' (events 11-12) + | NN | + | | + + If SHOW_DEPTHS is true, append " (depth N)" to the header of each run + of events. + + For events with UNKNOWN_LOCATION, print a summary of each the event. */ + +static void +print_path_summary_as_text (const path_summary &ps, + diagnostic_text_output_format &text_output, + bool show_depths) +{ + pretty_printer *const pp = text_output.get_printer (); + + std::vector<thread_event_printer> thread_event_printers; + for (auto t : ps.m_per_thread_summary) + thread_event_printers.push_back (thread_event_printer (*t, show_depths)); + + unsigned i; + event_range *range; + int last_out_edge_column = -1; + FOR_EACH_VEC_ELT (ps.m_ranges, i, range) + { + const int swimlane_idx + = range->m_per_thread_summary.get_swimlane_index (); + if (ps.multithreaded_p ()) + if (i == 0 || ps.m_ranges[i - 1]->m_thread_id != range->m_thread_id) + { + if (i > 0) + pp_newline (pp); + pp_printf (pp, "Thread: %qs", + range->m_per_thread_summary.get_name ()); + pp_newline (pp); + } + thread_event_printer &tep = thread_event_printers[swimlane_idx]; + /* Wire up any trailing out-edge from previous range to leading in-edge + of this range. */ + diagnostic_source_effect_info effect_info; + effect_info.m_leading_in_edge_column = last_out_edge_column; + tep.print_swimlane_for_event_range_as_text + (text_output, pp, + ps.get_logical_location_manager (), + range, &effect_info); + last_out_edge_column = effect_info.m_trailing_out_edge_column; + } +} + +/* Print PS as HTML to XP, using DC and, if non-null EVENT_LABEL_WRITER. */ + +static void +print_path_summary_as_html (const path_summary &ps, + diagnostic_context &dc, + xml::printer &xp, + html_label_writer *event_label_writer, + bool show_depths) +{ + std::vector<thread_event_printer> thread_event_printers; + for (auto t : ps.m_per_thread_summary) + thread_event_printers.push_back (thread_event_printer (*t, show_depths)); + + const logical_location_manager *logical_loc_mgr + = dc.get_logical_location_manager (); + + xp.push_tag_with_class ("div", "event-ranges", false); + + /* Group the ranges into stack frames. */ + std::unique_ptr<stack_frame> curr_frame; + unsigned i; + event_range *range; + int last_out_edge_column = -1; + FOR_EACH_VEC_ELT (ps.m_ranges, i, range) + { + const int swimlane_idx + = range->m_per_thread_summary.get_swimlane_index (); + + const logical_location this_logical_loc = range->m_logical_loc; + const int this_depth = range->m_stack_depth; + if (curr_frame) + { + int old_stack_depth = curr_frame->m_stack_depth; + if (this_depth > curr_frame->m_stack_depth) + { + emit_svg_arrow (xp, old_stack_depth, this_depth); + curr_frame + = begin_html_stack_frame (xp, + std::move (curr_frame), + range->m_logical_loc, + range->m_stack_depth, + logical_loc_mgr); + } + else + { + while (this_depth < curr_frame->m_stack_depth + || this_logical_loc != curr_frame->m_logical_loc) + { + curr_frame = end_html_stack_frame (xp, std::move (curr_frame)); + if (curr_frame == NULL) + { + curr_frame + = begin_html_stack_frame (xp, + nullptr, + range->m_logical_loc, + range->m_stack_depth, + logical_loc_mgr); + break; + } + } + emit_svg_arrow (xp, old_stack_depth, this_depth); + } + } + else + { + curr_frame = begin_html_stack_frame (xp, + NULL, + range->m_logical_loc, + range->m_stack_depth, + logical_loc_mgr); + } + + xp.push_tag_with_class ("table", "event-range-with-margin", false); + xp.push_tag ("tr", false); + xp.push_tag_with_class ("td", "event-range", false); + xp.push_tag_with_class ("div", "events-hdr", true); + if (range->m_logical_loc) + { + gcc_assert (logical_loc_mgr); + label_text funcname + = logical_loc_mgr->get_name_for_path_output (range->m_logical_loc); + if (funcname.get ()) + { + xp.push_tag_with_class ("span", "funcname", true); + xp.add_text (funcname.get ()); + xp.pop_tag (); //span + xp.add_text (": "); + } + } + { + xp.push_tag_with_class ("span", "event-ids", true); + pretty_printer pp; + if (range->m_start_idx == range->m_end_idx) + pp_printf (&pp, "event %i", + range->m_start_idx + 1); + else + pp_printf (&pp, "events %i-%i", + range->m_start_idx + 1, range->m_end_idx + 1); + xp.add_text (pp_formatted_text (&pp)); + xp.pop_tag (); // span + } + if (show_depths) + { + xp.add_text (" "); + xp.push_tag_with_class ("span", "depth", true); + pretty_printer pp; + pp_printf (&pp, "(depth %i)", range->m_stack_depth); + xp.add_text (pp_formatted_text (&pp)); + xp.pop_tag (); //span + } + xp.pop_tag (); // div + + /* Print a run of events. */ + thread_event_printer &tep = thread_event_printers[swimlane_idx]; + /* Wire up any trailing out-edge from previous range to leading in-edge + of this range. */ + diagnostic_source_effect_info effect_info; + effect_info.m_leading_in_edge_column = last_out_edge_column; + tep.print_swimlane_for_event_range_as_html (dc, xp, event_label_writer, + range, &effect_info); + last_out_edge_column = effect_info.m_trailing_out_edge_column; + + xp.pop_tag (); // td + xp.pop_tag (); // tr + xp.pop_tag (); // table + } + + /* Close outstanding frames. */ + while (curr_frame) + curr_frame = end_html_stack_frame (xp, std::move (curr_frame)); + + xp.pop_tag (); // div +} + +} /* end of anonymous namespace for path-printing code. */ + +class element_event_desc : public pp_element +{ +public: + element_event_desc (const diagnostic_event &event) + : m_event (event) + { + } + + void add_to_phase_2 (pp_markup::context &ctxt) final override + { + auto pp = ctxt.m_pp.clone (); + m_event.print_desc (*pp.get ()); + pp_string (&ctxt.m_pp, pp_formatted_text (pp.get ())); + } + +private: + const diagnostic_event &m_event; +}; + +/* Print PATH according to the context's path_format. */ + +void +diagnostic_text_output_format::print_path (const diagnostic_path &path) +{ + const unsigned num_events = path.num_events (); + + switch (get_context ().get_path_format ()) + { + case DPF_NONE: + /* Do nothing. */ + return; + + case DPF_SEPARATE_EVENTS: + { + /* A note per event. */ + auto &logical_loc_mgr = path.get_logical_location_manager (); + for (unsigned i = 0; i < num_events; i++) + { + const diagnostic_event &event = path.get_event (i); + element_event_desc e_event_desc (event); + diagnostic_event_id_t event_id (i); + if (get_context ().show_path_depths_p ()) + { + int stack_depth = event.get_stack_depth (); + /* -fdiagnostics-path-format=separate-events doesn't print + fndecl information, so with -fdiagnostics-show-path-depths + print the fndecls too, if any. */ + if (logical_location logical_loc + = event.get_logical_location ()) + { + label_text name + (logical_loc_mgr.get_name_for_path_output (logical_loc)); + inform (event.get_location (), + "%@ %e (fndecl %qs, depth %i)", + &event_id, &e_event_desc, + name.get (), stack_depth); + } + else + inform (event.get_location (), + "%@ %e (depth %i)", + &event_id, &e_event_desc, + stack_depth); + } + else + inform (event.get_location (), + "%@ %e", &event_id, &e_event_desc); + } + } + break; + + case DPF_INLINE_EVENTS: + { + /* Consolidate related events. */ + path_print_policy policy (*this); + pretty_printer *const pp = get_printer (); + const bool check_rich_locations = true; + const bool colorize = pp_show_color (pp); + const bool show_event_links = m_source_printing.show_event_links_p; + path_summary summary (policy, + *pp, + path, + check_rich_locations, + colorize, + show_event_links); + char *saved_prefix = pp_take_prefix (pp); + pp_set_prefix (pp, NULL); + print_path_summary_as_text (summary, *this, + get_context ().show_path_depths_p ()); + pp_flush (pp); + pp_set_prefix (pp, saved_prefix); + } + break; + } +} + +/* Print PATH as HTML to XP, using DC and DSPP for settings. + If non-null, use EVENT_LABEL_WRITER when writing events. */ + +void +print_path_as_html (xml::printer &xp, + const diagnostic_path &path, + diagnostic_context &dc, + html_label_writer *event_label_writer, + const diagnostic_source_print_policy &dspp) +{ + path_print_policy policy (dc); + const bool check_rich_locations = true; + const bool colorize = false; + const diagnostic_source_printing_options &source_printing_opts + = dspp.get_options (); + const bool show_event_links = source_printing_opts.show_event_links_p; + path_summary summary (policy, + *dc.get_reference_printer (), + path, + check_rich_locations, + colorize, + show_event_links); + print_path_summary_as_html (summary, dc, xp, event_label_writer, + dc.show_path_depths_p ()); +} + +#if CHECKING_P + +namespace selftest { + +/* Return true iff all events in PATH have locations for which column data + is available, so that selftests that require precise string output can + bail out for awkward line_table cases. */ + +static bool +path_events_have_column_data_p (const diagnostic_path &path) +{ + for (unsigned idx = 0; idx < path.num_events (); idx++) + { + location_t event_loc = path.get_event (idx).get_location (); + if (line_table->get_pure_location (event_loc) + > LINE_MAP_MAX_LOCATION_WITH_COLS) + return false; + if (line_table->get_start (event_loc) > LINE_MAP_MAX_LOCATION_WITH_COLS) + return false; + if (line_table->get_finish (event_loc) > LINE_MAP_MAX_LOCATION_WITH_COLS) + return false; + } + return true; +} + +/* Verify that empty paths are handled gracefully. */ + +static void +test_empty_path (pretty_printer *event_pp) +{ + test_diagnostic_path path (event_pp); + ASSERT_FALSE (path.interprocedural_p ()); + + test_diagnostic_context dc; + diagnostic_text_output_format text_output (dc); + path_print_policy policy (text_output); + path_summary summary (policy, *event_pp, path, false); + ASSERT_EQ (summary.get_num_ranges (), 0); + + print_path_summary_as_text (summary, text_output, true); + ASSERT_STREQ ("", + pp_formatted_text (text_output.get_printer ())); +} + +/* Verify that print_path_summary works on a purely intraprocedural path. */ + +static void +test_intraprocedural_path (pretty_printer *event_pp) +{ + test_diagnostic_path path (event_pp); + const char *const funcname = "foo"; + path.add_event (UNKNOWN_LOCATION, funcname, 0, "first %qs", "free"); + path.add_event (UNKNOWN_LOCATION, funcname, 0, "double %qs", "free"); + + ASSERT_FALSE (path.interprocedural_p ()); + + test_diagnostic_context dc; + diagnostic_text_output_format text_output (dc); + path_print_policy policy (text_output); + path_summary summary (policy, *event_pp, path, false, false, false); + ASSERT_EQ (summary.get_num_ranges (), 1); + + print_path_summary_as_text (summary, text_output, true); + ASSERT_STREQ (" `foo': events 1-2 (depth 0)\n" + " (1): first `free'\n" + " (2): double `free'\n", + pp_formatted_text (text_output.get_printer ())); +} + +/* Verify that print_path_summary works on an interprocedural path. */ + +static void +test_interprocedural_path_1 (pretty_printer *event_pp) +{ + test_diagnostic_path path (event_pp); + path.add_entry ("test", 0); + path.add_call ("test", 0, "make_boxed_int"); + path.add_call ("make_boxed_int", 1, "wrapped_malloc"); + path.add_event (UNKNOWN_LOCATION, + "wrapped_malloc", 2, "calling malloc"); + path.add_return ("test", 0); + path.add_call ("test", 0, "free_boxed_int"); + path.add_call ("free_boxed_int", 1, "wrapped_free"); + path.add_event (UNKNOWN_LOCATION, "wrapped_free", 2, "calling free"); + path.add_return ("test", 0); + path.add_call ("test", 0, "free_boxed_int"); + path.add_call ("free_boxed_int", 1, "wrapped_free"); + path.add_event (UNKNOWN_LOCATION, "wrapped_free", 2, "calling free"); + ASSERT_EQ (path.num_events (), 18); + + ASSERT_TRUE (path.interprocedural_p ()); + + { + test_diagnostic_context dc; + diagnostic_text_output_format text_output (dc, nullptr, false); + path_print_policy policy (text_output); + path_summary summary (policy, *event_pp, path, false); + ASSERT_EQ (summary.get_num_ranges (), 9); + + dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); + print_path_summary_as_text (summary, text_output, true); + ASSERT_STREQ + (" `test': events 1-2 (depth 0)\n" + " |\n" + " | (1): entering `test'\n" + " | (2): calling `make_boxed_int'\n" + " |\n" + " +--> `make_boxed_int': events 3-4 (depth 1)\n" + " |\n" + " | (3): entering `make_boxed_int'\n" + " | (4): calling `wrapped_malloc'\n" + " |\n" + " +--> `wrapped_malloc': events 5-6 (depth 2)\n" + " |\n" + " | (5): entering `wrapped_malloc'\n" + " | (6): calling malloc\n" + " |\n" + " <-------------+\n" + " |\n" + " `test': events 7-8 (depth 0)\n" + " |\n" + " | (7): returning to `test'\n" + " | (8): calling `free_boxed_int'\n" + " |\n" + " +--> `free_boxed_int': events 9-10 (depth 1)\n" + " |\n" + " | (9): entering `free_boxed_int'\n" + " | (10): calling `wrapped_free'\n" + " |\n" + " +--> `wrapped_free': events 11-12 (depth 2)\n" + " |\n" + " | (11): entering `wrapped_free'\n" + " | (12): calling free\n" + " |\n" + " <-------------+\n" + " |\n" + " `test': events 13-14 (depth 0)\n" + " |\n" + " | (13): returning to `test'\n" + " | (14): calling `free_boxed_int'\n" + " |\n" + " +--> `free_boxed_int': events 15-16 (depth 1)\n" + " |\n" + " | (15): entering `free_boxed_int'\n" + " | (16): calling `wrapped_free'\n" + " |\n" + " +--> `wrapped_free': events 17-18 (depth 2)\n" + " |\n" + " | (17): entering `wrapped_free'\n" + " | (18): calling free\n" + " |\n", + pp_formatted_text (text_output.get_printer ())); + } + { + test_diagnostic_context dc; + dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE); + diagnostic_text_output_format text_output (dc); + path_print_policy policy (text_output); + path_summary summary (policy, *event_pp, path, false); + print_path_summary_as_text (summary, text_output, true); + ASSERT_STREQ + (" `test': events 1-2 (depth 0)\n" + " │\n" + " │ (1): entering `test'\n" + " │ (2): calling `make_boxed_int'\n" + " │\n" + " └──> `make_boxed_int': events 3-4 (depth 1)\n" + " │\n" + " │ (3): entering `make_boxed_int'\n" + " │ (4): calling `wrapped_malloc'\n" + " │\n" + " └──> `wrapped_malloc': events 5-6 (depth 2)\n" + " │\n" + " │ (5): entering `wrapped_malloc'\n" + " │ (6): calling malloc\n" + " │\n" + " <─────────────┘\n" + " │\n" + " `test': events 7-8 (depth 0)\n" + " │\n" + " │ (7): returning to `test'\n" + " │ (8): calling `free_boxed_int'\n" + " │\n" + " └──> `free_boxed_int': events 9-10 (depth 1)\n" + " │\n" + " │ (9): entering `free_boxed_int'\n" + " │ (10): calling `wrapped_free'\n" + " │\n" + " └──> `wrapped_free': events 11-12 (depth 2)\n" + " │\n" + " │ (11): entering `wrapped_free'\n" + " │ (12): calling free\n" + " │\n" + " <─────────────┘\n" + " │\n" + " `test': events 13-14 (depth 0)\n" + " │\n" + " │ (13): returning to `test'\n" + " │ (14): calling `free_boxed_int'\n" + " │\n" + " └──> `free_boxed_int': events 15-16 (depth 1)\n" + " │\n" + " │ (15): entering `free_boxed_int'\n" + " │ (16): calling `wrapped_free'\n" + " │\n" + " └──> `wrapped_free': events 17-18 (depth 2)\n" + " │\n" + " │ (17): entering `wrapped_free'\n" + " │ (18): calling free\n" + " │\n", + pp_formatted_text (text_output.get_printer ())); + } + +} + +/* Example where we pop the stack to an intermediate frame, rather than the + initial one. */ + +static void +test_interprocedural_path_2 (pretty_printer *event_pp) +{ + test_diagnostic_path path (event_pp); + path.add_entry ("foo", 0); + path.add_call ("foo", 0, "bar"); + path.add_call ("bar", 1, "baz"); + path.add_return ("bar", 1); + path.add_call ("bar", 1, "baz"); + ASSERT_EQ (path.num_events (), 8); + + ASSERT_TRUE (path.interprocedural_p ()); + + { + test_diagnostic_context dc; + diagnostic_text_output_format text_output (dc); + path_print_policy policy (text_output); + path_summary summary (policy, *event_pp, path, false); + ASSERT_EQ (summary.get_num_ranges (), 5); + dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); + print_path_summary_as_text (summary, text_output, true); + ASSERT_STREQ + (" `foo': events 1-2 (depth 0)\n" + " |\n" + " | (1): entering `foo'\n" + " | (2): calling `bar'\n" + " |\n" + " +--> `bar': events 3-4 (depth 1)\n" + " |\n" + " | (3): entering `bar'\n" + " | (4): calling `baz'\n" + " |\n" + " +--> `baz': event 5 (depth 2)\n" + " |\n" + " | (5): entering `baz'\n" + " |\n" + " <------+\n" + " |\n" + " `bar': events 6-7 (depth 1)\n" + " |\n" + " | (6): returning to `bar'\n" + " | (7): calling `baz'\n" + " |\n" + " +--> `baz': event 8 (depth 2)\n" + " |\n" + " | (8): entering `baz'\n" + " |\n", + pp_formatted_text (text_output.get_printer ())); + } + { + test_diagnostic_context dc; + dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE); + diagnostic_text_output_format text_output (dc); + path_print_policy policy (text_output); + path_summary summary (policy, *event_pp, path, false); + print_path_summary_as_text (summary, text_output, true); + ASSERT_STREQ + (" `foo': events 1-2 (depth 0)\n" + " │\n" + " │ (1): entering `foo'\n" + " │ (2): calling `bar'\n" + " │\n" + " └──> `bar': events 3-4 (depth 1)\n" + " │\n" + " │ (3): entering `bar'\n" + " │ (4): calling `baz'\n" + " │\n" + " └──> `baz': event 5 (depth 2)\n" + " │\n" + " │ (5): entering `baz'\n" + " │\n" + " <──────┘\n" + " │\n" + " `bar': events 6-7 (depth 1)\n" + " │\n" + " │ (6): returning to `bar'\n" + " │ (7): calling `baz'\n" + " │\n" + " └──> `baz': event 8 (depth 2)\n" + " │\n" + " │ (8): entering `baz'\n" + " │\n", + pp_formatted_text (text_output.get_printer ())); + } +} + +/* Verify that print_path_summary is sane in the face of a recursive + diagnostic_path. */ + +static void +test_recursion (pretty_printer *event_pp) +{ + test_diagnostic_path path (event_pp); + path.add_entry ("factorial", 0); + for (int depth = 0; depth < 3; depth++) + path.add_call ("factorial", depth, "factorial"); + ASSERT_EQ (path.num_events (), 7); + + ASSERT_TRUE (path.interprocedural_p ()); + + { + test_diagnostic_context dc; + dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); + + diagnostic_text_output_format text_output (dc); + path_print_policy policy (text_output); + path_summary summary (policy, *event_pp, path, false); + ASSERT_EQ (summary.get_num_ranges (), 4); + + print_path_summary_as_text (summary, text_output, true); + ASSERT_STREQ + (" `factorial': events 1-2 (depth 0)\n" + " |\n" + " | (1): entering `factorial'\n" + " | (2): calling `factorial'\n" + " |\n" + " +--> `factorial': events 3-4 (depth 1)\n" + " |\n" + " | (3): entering `factorial'\n" + " | (4): calling `factorial'\n" + " |\n" + " +--> `factorial': events 5-6 (depth 2)\n" + " |\n" + " | (5): entering `factorial'\n" + " | (6): calling `factorial'\n" + " |\n" + " +--> `factorial': event 7 (depth 3)\n" + " |\n" + " | (7): entering `factorial'\n" + " |\n", + pp_formatted_text (text_output.get_printer ())); + } + { + test_diagnostic_context dc; + dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE); + + diagnostic_text_output_format text_output (dc); + path_print_policy policy (text_output); + path_summary summary (policy, *event_pp, path, false); + print_path_summary_as_text (summary, text_output, true); + ASSERT_STREQ + (" `factorial': events 1-2 (depth 0)\n" + " │\n" + " │ (1): entering `factorial'\n" + " │ (2): calling `factorial'\n" + " │\n" + " └──> `factorial': events 3-4 (depth 1)\n" + " │\n" + " │ (3): entering `factorial'\n" + " │ (4): calling `factorial'\n" + " │\n" + " └──> `factorial': events 5-6 (depth 2)\n" + " │\n" + " │ (5): entering `factorial'\n" + " │ (6): calling `factorial'\n" + " │\n" + " └──> `factorial': event 7 (depth 3)\n" + " │\n" + " │ (7): entering `factorial'\n" + " │\n", + pp_formatted_text (text_output.get_printer ())); + } +} + +/* Helper class for writing tests of control flow visualization. */ + +class control_flow_test +{ +public: + control_flow_test (const location &loc, + const line_table_case &case_, + const char *content) + : m_tmp_file (loc, ".c", content, + /* gcc_rich_location::add_location_if_nearby implicitly + uses global_dc's file_cache, so we need to evict + tmp when we're done. */ + &global_dc->get_file_cache ()), + m_ltt (case_) + { + m_ord_map + = linemap_check_ordinary (linemap_add (line_table, LC_ENTER, false, + m_tmp_file.get_filename (), 0)); + linemap_line_start (line_table, 1, 100); + } + + location_t get_line_and_column (int line, int column) + { + return linemap_position_for_line_and_column (line_table, m_ord_map, + line, column); + } + + location_t get_line_and_columns (int line, int first_column, int last_column) + { + return get_line_and_columns (line, + first_column, first_column, last_column); + } + + location_t get_line_and_columns (int line, + int first_column, + int caret_column, + int last_column) + { + return make_location (get_line_and_column (line, caret_column), + get_line_and_column (line, first_column), + get_line_and_column (line, last_column)); + } + +private: + temp_source_file m_tmp_file; + line_table_test m_ltt; + const line_map_ordinary *m_ord_map; +}; + +/* Example of event edges where all events can go in the same layout, + testing the 6 combinations of: + - ASCII vs Unicode vs event links off + - line numbering on and off. */ + +static void +test_control_flow_1 (const line_table_case &case_, + pretty_printer *event_pp) +{ + /* Create a tempfile and write some text to it. + ...000000000111111111122222222223333333333. + ...123456789012345678901234567890123456789. */ + const char *content + = ("int test (int *p)\n" /* line 1. */ + "{\n" /* line 2. */ + " if (p)\n" /* line 3. */ + " return 0;\n" /* line 4. */ + " return *p;\n" /* line 5. */ + "}\n"); /* line 6. */ + + control_flow_test t (SELFTEST_LOCATION, case_, content); + + const location_t conditional = t.get_line_and_column (3, 7); + const location_t cfg_dest = t.get_line_and_column (5, 10); + + test_diagnostic_path path (event_pp); + path.add_event (conditional, nullptr, 0, + "following %qs branch (when %qs is NULL)...", + "false", "p"); + path.connect_to_next_event (); + + path.add_event (cfg_dest, nullptr, 0, + "...to here"); + path.add_event (cfg_dest, nullptr, 0, + "dereference of NULL %qs", + "p"); + + if (!path_events_have_column_data_p (path)) + return; + + + { + test_diagnostic_context dc; + dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); + dc.m_source_printing.show_event_links_p = true; + diagnostic_text_output_format text_output (dc); + path_print_policy policy (text_output); + path_summary summary (policy, *event_pp, path, true); + print_path_summary_as_text (summary, text_output, false); + ASSERT_STREQ + (" events 1-3\n" + "FILENAME:3:7:\n" + " if (p)\n" + " ^\n" + " |\n" + " (1) following `false' branch (when `p' is NULL)... ->-+\n" + " |\n" + "FILENAME:5:10:\n" + " |\n" + "+------------------------------------------------------------+\n" + "| return *p;\n" + "| ~\n" + "| |\n" + "+-------->(2) ...to here\n" + " (3) dereference of NULL `p'\n", + pp_formatted_text (text_output.get_printer ())); + } + { + test_diagnostic_context dc; + dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); + dc.m_source_printing.show_event_links_p = false; + diagnostic_text_output_format text_output (dc); + path_print_policy policy (text_output); + path_summary summary (policy, *event_pp, path, true); + print_path_summary_as_text (summary, text_output, false); + ASSERT_STREQ + (" events 1-3\n" + "FILENAME:3:7:\n" + " if (p)\n" + " ^\n" + " |\n" + " (1) following `false' branch (when `p' is NULL)...\n" + "FILENAME:5:10:\n" + " return *p;\n" + " ~\n" + " |\n" + " (2) ...to here\n" + " (3) dereference of NULL `p'\n", + pp_formatted_text (text_output.get_printer ())); + } + { + test_diagnostic_context dc; + dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); + dc.m_source_printing.show_line_numbers_p = true; + dc.m_source_printing.show_event_links_p = true; + diagnostic_text_output_format text_output (dc); + path_print_policy policy (text_output); + path_summary summary (policy, *event_pp, path, true); + print_path_summary_as_text (summary, text_output, false); + ASSERT_STREQ + (" events 1-3\n" + "FILENAME:3:7:\n" + " 3 | if (p)\n" + " | ^\n" + " | |\n" + " | (1) following `false' branch (when `p' is NULL)... ->-+\n" + " | |\n" + " | |\n" + " |+------------------------------------------------------------+\n" + " 4 || return 0;\n" + " 5 || return *p;\n" + " || ~\n" + " || |\n" + " |+-------->(2) ...to here\n" + " | (3) dereference of NULL `p'\n", + pp_formatted_text (text_output.get_printer ())); + } + { + test_diagnostic_context dc; + dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); + dc.m_source_printing.show_line_numbers_p = true; + dc.m_source_printing.show_event_links_p = false; + diagnostic_text_output_format text_output (dc); + path_print_policy policy (text_output); + path_summary summary (policy, *event_pp, path, true); + print_path_summary_as_text (summary, text_output, false); + ASSERT_STREQ + (" events 1-3\n" + "FILENAME:3:7:\n" + " 3 | if (p)\n" + " | ^\n" + " | |\n" + " | (1) following `false' branch (when `p' is NULL)...\n" + " 4 | return 0;\n" + " 5 | return *p;\n" + " | ~\n" + " | |\n" + " | (2) ...to here\n" + " | (3) dereference of NULL `p'\n", + pp_formatted_text (text_output.get_printer ())); + } + { + test_diagnostic_context dc; + dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE); + dc.m_source_printing.show_event_links_p = true; + diagnostic_text_output_format text_output (dc); + path_print_policy policy (text_output); + path_summary summary (policy, *event_pp, path, true); + print_path_summary_as_text (summary, text_output, false); + ASSERT_STREQ + (" events 1-3\n" + "FILENAME:3:7:\n" + " if (p)\n" + " ^\n" + " |\n" + " (1) following `false' branch (when `p' is NULL)... ─>─┐\n" + " │\n" + "FILENAME:5:10:\n" + " │\n" + "┌────────────────────────────────────────────────────────────┘\n" + "│ return *p;\n" + "│ ~\n" + "│ |\n" + "└────────>(2) ...to here\n" + " (3) dereference of NULL `p'\n", + pp_formatted_text (text_output.get_printer ())); + } + { + test_diagnostic_context dc; + dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE); + dc.m_source_printing.show_event_links_p = true; + dc.m_source_printing.show_line_numbers_p = true; + diagnostic_text_output_format text_output (dc); + path_print_policy policy (text_output); + path_summary summary (policy, *event_pp, path, true); + print_path_summary_as_text (summary, text_output, false); + ASSERT_STREQ + (" events 1-3\n" + "FILENAME:3:7:\n" + " 3 | if (p)\n" + " | ^\n" + " | |\n" + " | (1) following `false' branch (when `p' is NULL)... ─>─┐\n" + " | │\n" + " | │\n" + " |┌────────────────────────────────────────────────────────────┘\n" + " 4 |│ return 0;\n" + " 5 |│ return *p;\n" + " |│ ~\n" + " |│ |\n" + " |└────────>(2) ...to here\n" + " | (3) dereference of NULL `p'\n", + pp_formatted_text (text_output.get_printer ())); + } +} + +/* Complex example involving a backedge. */ + +static void +test_control_flow_2 (const line_table_case &case_, + pretty_printer *event_pp) +{ + /* Create a tempfile and write some text to it. + ...000000000111111111122222222223333333333. + ...123456789012345678901234567890123456789. */ + const char *content + = ("int for_loop_noop_next (struct node *n)\n" /* <--------- line 1. */ + "{\n" /* <----------------------------------------------- line 2. */ + " int sum = 0;\n" /* <---------------------------------- line 3. */ + " for (struct node *iter = n; iter; iter->next)\n" /* <- line 4. */ + " sum += n->val;\n" /* <------------------------------ line 5. */ + " return sum;\n" /* <----------------------------------- line 6. */ + "}\n"); /* <-------------------------------------------- line 7. */ + /* Adapted from infinite-loop-linked-list.c where + "iter->next" should be "iter = iter->next". */ + + control_flow_test t (SELFTEST_LOCATION, case_, content); + + const location_t iter_test = t.get_line_and_columns (4, 31, 34); + const location_t loop_body_start = t.get_line_and_columns (5, 12, 17); + const location_t loop_body_end = t.get_line_and_columns (5, 5, 9, 17); + + test_diagnostic_path path (event_pp); + path.add_event (iter_test, nullptr, 0, "infinite loop here"); + + path.add_event (iter_test, nullptr, 0, "looping from here..."); + path.connect_to_next_event (); + + path.add_event (loop_body_start, nullptr, 0, "...to here"); + + path.add_event (loop_body_end, nullptr, 0, "looping back..."); + path.connect_to_next_event (); + + path.add_event (iter_test, nullptr, 0, "...to here"); + + if (!path_events_have_column_data_p (path)) + return; + + { + test_diagnostic_context dc; + dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); + dc.m_source_printing.show_event_links_p = true; + dc.m_source_printing.show_line_numbers_p = true; + diagnostic_text_output_format text_output (dc); + path_print_policy policy (text_output); + path_summary summary (policy, *event_pp, path, true); + print_path_summary_as_text (summary, text_output, false); + ASSERT_STREQ + (" events 1-3\n" + "FILENAME:4:31:\n" + " 4 | for (struct node *iter = n; iter; iter->next)\n" + " | ^~~~\n" + " | |\n" + " | (1) infinite loop here\n" + " | (2) looping from here... ->-+\n" + " | |\n" + " | |\n" + " |+----------------------------------------------------------+\n" + " 5 || sum += n->val;\n" + " || ~~~~~~ \n" + " || |\n" + " |+---------->(3) ...to here\n" + /* We need to start an new event_range here as event (4) is to the + left of event (3), and thus (4) would mess up the in-edge to (3). */ + " event 4\n" + " 5 | sum += n->val;\n" + " | ~~~~^~~~~~~~~\n" + " | |\n" + " | (4) looping back... ->-+\n" + " | |\n" + /* We need to start an new event_range here as event (4) with an + out-edge is on a later line (line 5) than its destination event (5), + on line 4. */ + " event 5\n" + " | |\n" + " |+-------------------------------+\n" + " 4 || for (struct node *iter = n; iter; iter->next)\n" + " || ^~~~\n" + " || |\n" + " |+----------------------------->(5) ...to here\n", + pp_formatted_text (text_output.get_printer ())); + } +} + +/* Complex example involving a backedge and both an in-edge and out-edge + on the same line. */ + +static void +test_control_flow_3 (const line_table_case &case_, + pretty_printer *event_pp) +{ + /* Create a tempfile and write some text to it. + ...000000000111111111122222222223333333333. + ...123456789012345678901234567890123456789. */ + const char *content + = ("void test_missing_comparison_in_for_condition_1 (int n)\n" + "{\n" /* <------------------------- line 2. */ + " for (int i = 0; n; i++)\n" /* <- line 3. */ + " {\n" /* <--------------------- line 4. */ + " }\n" /* <--------------------- line 5. */ + "}\n"); /* <----------------------- line 6. */ + /* Adapted from infinite-loop-1.c where the condition should have been + "i < n", rather than just "n". */ + + control_flow_test t (SELFTEST_LOCATION, case_, content); + + const location_t iter_test = t.get_line_and_column (3, 19); + const location_t iter_next = t.get_line_and_columns (3, 22, 24); + + test_diagnostic_path path (event_pp); + path.add_event (iter_test, nullptr, 0, "infinite loop here"); + + path.add_event (iter_test, nullptr, 0, "looping from here..."); + path.connect_to_next_event (); + + path.add_event (iter_next, nullptr, 0, "...to here"); + + path.add_event (iter_next, nullptr, 0, "looping back..."); + path.connect_to_next_event (); + + path.add_event (iter_test, nullptr, 0, "...to here"); + + if (!path_events_have_column_data_p (path)) + return; + + { + test_diagnostic_context dc; + dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); + dc.m_source_printing.show_event_links_p = true; + dc.m_source_printing.show_line_numbers_p = true; + diagnostic_text_output_format text_output (dc); + path_print_policy policy (text_output); + path_summary summary (policy, *event_pp, path, true); + print_path_summary_as_text (summary, text_output, false); + ASSERT_STREQ + (" events 1-2\n" + "FILENAME:3:19:\n" + " 3 | for (int i = 0; n; i++)\n" + " | ^\n" + " | |\n" + " | (1) infinite loop here\n" + " | (2) looping from here... ->-+\n" + " | |\n" + " events 3-4\n" + " | |\n" + " |+----------------------------------------------+\n" + " 3 || for (int i = 0; n; i++)\n" + " || ^~~\n" + " || |\n" + " |+-------------------->(3) ...to here\n" + " | (4) looping back... ->-+\n" + " | |\n" + /* We need to start an new event_range here as event (4) with an + out-edge is on the same line as its destination event (5), but + to the right, which we can't handle as a single event_range. */ + " event 5\n" + " | |\n" + " |+--------------------------------------------+\n" + " 3 || for (int i = 0; n; i++)\n" + " || ^\n" + " || |\n" + " |+----------------->(5) ...to here\n", + pp_formatted_text (text_output.get_printer ())); + } +} + +/* Implementation of ASSERT_CFG_EDGE_PATH_STREQ. */ + +static void +assert_cfg_edge_path_streq (const location &loc, + pretty_printer *event_pp, + const location_t src_loc, + const location_t dst_loc, + const char *expected_str) +{ + test_diagnostic_path path (event_pp); + path.add_event (src_loc, nullptr, 0, "from here..."); + path.connect_to_next_event (); + + path.add_event (dst_loc, nullptr, 0, "...to here"); + + if (!path_events_have_column_data_p (path)) + return; + + test_diagnostic_context dc; + dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); + dc.m_source_printing.show_event_links_p = true; + dc.m_source_printing.show_line_numbers_p = true; + diagnostic_text_output_format text_output (dc); + path_print_policy policy (text_output); + path_summary summary (policy, *event_pp, path, true); + print_path_summary_as_text (summary, text_output, false); + ASSERT_STREQ_AT (loc, expected_str, + pp_formatted_text (text_output.get_printer ())); +} + +/* Assert that if we make a path with an event with "from here..." at SRC_LOC + leading to an event "...to here" at DST_LOC that we print the path + as EXPECTED_STR. */ + +#define ASSERT_CFG_EDGE_PATH_STREQ(SRC_LOC, DST_LOC, EXPECTED_STR) \ + assert_cfg_edge_path_streq ((SELFTEST_LOCATION), (event_pp), \ + (SRC_LOC), (DST_LOC), (EXPECTED_STR)) + +/* Various examples of edge, trying to cover all combinations of: + - relative x positive of src label and dst label + - relative y position of labels: + - on same line + - on next line + - on line after next + - big gap, where src is before dst + - big gap, where src is after dst + and other awkward cases. */ + +static void +test_control_flow_4 (const line_table_case &case_, + pretty_printer *event_pp) +{ + std::string many_lines; + for (int i = 1; i <= 100; i++) + /* ............000000000111 + ............123456789012. */ + many_lines += "LHS RHS\n"; + control_flow_test t (SELFTEST_LOCATION, case_, many_lines.c_str ()); + + /* Same line. */ + { + /* LHS -> RHS. */ + ASSERT_CFG_EDGE_PATH_STREQ + (t.get_line_and_columns (3, 1, 3), + t.get_line_and_columns (3, 10, 12), + (" event 1\n" + "FILENAME:3:1:\n" + " 3 | LHS RHS\n" + " | ^~~\n" + " | |\n" + " | (1) from here... ->-+\n" + " | |\n" + " event 2\n" + " | |\n" + " |+--------------------+\n" + " 3 ||LHS RHS\n" + " || ^~~\n" + " || |\n" + " |+-------->(2) ...to here\n")); + + /* RHS -> LHS. */ + ASSERT_CFG_EDGE_PATH_STREQ + (t.get_line_and_columns (3, 10, 12), + t.get_line_and_columns (3, 1, 3), + (" event 1\n" + "FILENAME:3:10:\n" + " 3 | LHS RHS\n" + " | ^~~\n" + " | |\n" + " | (1) from here... ->-+\n" + " | |\n" + " event 2\n" + " | |\n" + " |+-----------------------------+\n" + " 3 ||LHS RHS\n" + " ||^~~\n" + " |||\n" + " |+(2) ...to here\n")); + } + + /* Next line. */ + { + /* LHS -> RHS. */ + ASSERT_CFG_EDGE_PATH_STREQ + (t.get_line_and_columns (3, 1, 3), + t.get_line_and_columns (4, 5, 7), + (" events 1-2\n" + "FILENAME:3:1:\n" + " 3 | LHS RHS\n" + " | ^~~\n" + " | |\n" + " | (1) from here... ->-+\n" + " | |\n" + " | |\n" + " |+--------------------+\n" + " 4 ||LHS RHS\n" + " || ~~~\n" + " || |\n" + " |+--->(2) ...to here\n")); + + /* RHS -> LHS. */ + ASSERT_CFG_EDGE_PATH_STREQ + (t.get_line_and_columns (3, 10, 12), + t.get_line_and_columns (4, 1, 3), + (" events 1-2\n" + "FILENAME:3:10:\n" + " 3 | LHS RHS\n" + " | ^~~\n" + " | |\n" + " | (1) from here... ->-+\n" + " | |\n" + " | |\n" + " |+-----------------------------+\n" + " 4 ||LHS RHS\n" + " ||~~~ \n" + " |||\n" + " |+(2) ...to here\n")); + } + + /* Line after next. */ + { + /* LHS -> RHS. */ + ASSERT_CFG_EDGE_PATH_STREQ + (t.get_line_and_columns (3, 1, 3), + t.get_line_and_columns (5, 10, 12), + (" events 1-2\n" + "FILENAME:3:1:\n" + " 3 | LHS RHS\n" + " | ^~~\n" + " | |\n" + " | (1) from here... ->-+\n" + " | |\n" + " | |\n" + " |+--------------------+\n" + " 4 ||LHS RHS\n" + " 5 ||LHS RHS\n" + " || ~~~\n" + " || |\n" + " |+-------->(2) ...to here\n")); + + /* RHS -> LHS. */ + ASSERT_CFG_EDGE_PATH_STREQ + (t.get_line_and_columns (3, 10, 12), + t.get_line_and_columns (5, 1, 3), + (" events 1-2\n" + "FILENAME:3:10:\n" + " 3 | LHS RHS\n" + " | ^~~\n" + " | |\n" + " | (1) from here... ->-+\n" + " | |\n" + " | |\n" + " |+-----------------------------+\n" + " 4 ||LHS RHS\n" + " 5 ||LHS RHS\n" + " ||~~~ \n" + " |||\n" + " |+(2) ...to here\n")); + } + + /* Big gap, increasing line number. */ + { + /* LHS -> RHS. */ + ASSERT_CFG_EDGE_PATH_STREQ + (t.get_line_and_columns (3, 1, 3), + t.get_line_and_columns (97, 10, 12), + (" events 1-2\n" + "FILENAME:3:1:\n" + " 3 | LHS RHS\n" + " | ^~~\n" + " | |\n" + " | (1) from here... ->-+\n" + " | |\n" + "......\n" + " | |\n" + " |+--------------------+\n" + " 97 ||LHS RHS\n" + " || ~~~\n" + " || |\n" + " |+-------->(2) ...to here\n")); + + /* RHS -> LHS. */ + ASSERT_CFG_EDGE_PATH_STREQ + (t.get_line_and_columns (3, 10, 12), + t.get_line_and_columns (97, 1, 3), + (" events 1-2\n" + "FILENAME:3:10:\n" + " 3 | LHS RHS\n" + " | ^~~\n" + " | |\n" + " | (1) from here... ->-+\n" + " | |\n" + "......\n" + " | |\n" + " |+-----------------------------+\n" + " 97 ||LHS RHS\n" + " ||~~~ \n" + " |||\n" + " |+(2) ...to here\n")); + } + + /* Big gap, decreasing line number. */ + { + /* LHS -> RHS. */ + ASSERT_CFG_EDGE_PATH_STREQ + (t.get_line_and_columns (97, 1, 3), + t.get_line_and_columns (3, 10, 12), + (" event 1\n" + "FILENAME:97:1:\n" + " 97 | LHS RHS\n" + " | ^~~\n" + " | |\n" + " | (1) from here... ->-+\n" + " | |\n" + " event 2\n" + " | |\n" + " |+--------------------+\n" + " 3 ||LHS RHS\n" + " || ^~~\n" + " || |\n" + " |+-------->(2) ...to here\n")); + + /* RHS -> LHS. */ + ASSERT_CFG_EDGE_PATH_STREQ + (t.get_line_and_columns (97, 10, 12), + t.get_line_and_columns (3, 1, 3), + (" event 1\n" + "FILENAME:97:10:\n" + " 97 | LHS RHS\n" + " | ^~~\n" + " | |\n" + " | (1) from here... ->-+\n" + " | |\n" + " event 2\n" + " | |\n" + " |+-----------------------------+\n" + " 3 ||LHS RHS\n" + " ||^~~\n" + " |||\n" + " |+(2) ...to here\n")); + } + + /* Unknown src. */ + { + ASSERT_CFG_EDGE_PATH_STREQ + (UNKNOWN_LOCATION, + t.get_line_and_columns (3, 10, 12), + (" event 1\n" + " (1): from here...\n" + " event 2\n" + "FILENAME:3:10:\n" + " 3 | LHS RHS\n" + " | ^~~\n" + " | |\n" + " |+-------->(2) ...to here\n")); + } + + /* Unknown dst. */ + { + ASSERT_CFG_EDGE_PATH_STREQ + (t.get_line_and_columns (3, 1, 3), + UNKNOWN_LOCATION, + (" event 1\n" + "FILENAME:3:1:\n" + " 3 | LHS RHS\n" + " | ^~~\n" + " | |\n" + " | (1) from here... ->-+\n" + " | |\n" + " event 2\n" + "FILENAME:\n" + " (2): ...to here\n")); + } +} + +/* Another complex example, adapted from data-model-20.c. */ + +static void +test_control_flow_5 (const line_table_case &case_, + pretty_printer *event_pp) +{ + /* Create a tempfile and write some text to it. + ...000000000111111111122222222223333333333444444444455555555556666666666. + ...123456789012345678901234567890123456789012345678901234567890123456789. */ + const char *content + = (" if ((arr = (struct foo **)malloc(n * sizeof(struct foo *))) == NULL)\n" + " return NULL;\n" /* <------------------------- line 2. */ + "\n" /* <----------------------------------------- line 3. */ + " for (i = 0; i < n; i++) {\n" /* <-------------- line 4. */ + " if ((arr[i] = (struct foo *)malloc(sizeof(struct foo))) == NULL) {\n"); + + control_flow_test t (SELFTEST_LOCATION, case_, content); + + test_diagnostic_path path (event_pp); + /* (1) */ + path.add_event (t.get_line_and_column (1, 6), nullptr, 0, + "following %qs branch (when %qs is non-NULL)...", + "false", "arr"); + path.connect_to_next_event (); + + /* (2) */ + path.add_event (t.get_line_and_columns (4, 8, 10, 12), nullptr, 0, + "...to here"); + + /* (3) */ + path.add_event (t.get_line_and_columns (4, 15, 17, 19), nullptr, 0, + "following %qs branch (when %qs)...", + "true", "i < n"); + path.connect_to_next_event (); + + /* (4) */ + path.add_event (t.get_line_and_column (5, 13), nullptr, 0, + "...to here"); + + /* (5) */ + path.add_event (t.get_line_and_columns (5, 33, 58), nullptr, 0, + "allocated here"); + + if (!path_events_have_column_data_p (path)) + return; + + { + test_diagnostic_context dc; + dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); + dc.m_source_printing.show_event_links_p = true; + dc.m_source_printing.show_line_numbers_p = true; + diagnostic_text_output_format text_output (dc); + path_print_policy policy (text_output); + path_summary summary (policy, *event_pp, path, true); + print_path_summary_as_text (summary, text_output, false); + ASSERT_STREQ + (" events 1-5\n" + "FILENAME:1:6:\n" + " 1 | if ((arr = (struct foo **)malloc(n * sizeof(struct foo *))) == NULL)\n" + " | ^\n" + " | |\n" + " | (1) following `false' branch (when `arr' is non-NULL)... ->-+\n" + " | |\n" + "......\n" + " | |\n" + " |+-----------------------------------------------------------------+\n" + " 4 || for (i = 0; i < n; i++) {\n" + " || ~~~~~ ~~~~~\n" + " || | |\n" + " || | (3) following `true' branch (when `i < n')... ->-+\n" + " |+-------->(2) ...to here |\n" + " | |\n" + " | |\n" + " |+-----------------------------------------------------------------+\n" + " 5 || if ((arr[i] = (struct foo *)malloc(sizeof(struct foo))) == NULL) {\n" + " || ~ ~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + " || | |\n" + " |+----------->(4) ...to here (5) allocated here\n", + pp_formatted_text (text_output.get_printer ())); + } +} + +/* Another complex example, adapted from loop-3.c. */ + +static void +test_control_flow_6 (const line_table_case &case_, + pretty_printer *event_pp) +{ + /* Create a tempfile and write some text to it. + ...000000000111111111122222222223333333. + ...123456789012345678901234567890123456. */ + const char *content + = ("#include <stdlib.h>\n" /* <------------------ line 1. */ + "\n" /* <------------------------------------- line 2. */ + "void test(int c)\n" /* <--------------------- line 3. */ + "{\n" /* <------------------------------------ line 4. */ + " int i;\n" /* <----------------------------- line 5. */ + " char *buffer = (char*)malloc(256);\n" /* <- line 6. */ + "\n" /* <------------------------------------- line 7. */ + " for (i=0; i<255; i++) {\n" /* <------------ line 8. */ + " buffer[i] = c;\n" /* <------------------- line 9. */ + "\n" /* <------------------------------------- line 10. */ + " free(buffer);\n" /* <-------------------- line 11. */ + " }\n"); /* <-------------------------------- line 12. */ + + control_flow_test t (SELFTEST_LOCATION, case_, content); + + test_diagnostic_path path (event_pp); + /* (1) */ + path.add_event (t.get_line_and_columns (6, 25, 35), nullptr, 0, + "allocated here"); + + /* (2) */ + path.add_event (t.get_line_and_columns (8, 13, 14, 17), nullptr, 0, + "following %qs branch (when %qs)...", + "true", "i <= 254"); + path.connect_to_next_event (); + + /* (3) */ + path.add_event (t.get_line_and_columns (9, 5, 15, 17), nullptr, 0, + "...to here"); + + /* (4) */ + path.add_event (t.get_line_and_columns (8, 13, 14, 17), nullptr, 0, + "following %qs branch (when %qs)...", + "true", "i <= 254"); + path.connect_to_next_event (); + + /* (5) */ + path.add_event (t.get_line_and_columns (9, 5, 15, 17), nullptr, 0, + "...to here"); + + if (!path_events_have_column_data_p (path)) + return; + + { + test_diagnostic_context dc; + dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); + dc.m_source_printing.show_event_links_p = true; + dc.m_source_printing.show_line_numbers_p = true; + diagnostic_text_output_format text_output (dc); + path_print_policy policy (text_output); + path_summary summary (policy, *event_pp, path, true); + print_path_summary_as_text (summary, text_output, false); + ASSERT_STREQ + (" events 1-3\n" + "FILENAME:6:25:\n" + " 6 | char *buffer = (char*)malloc(256);\n" + " | ^~~~~~~~~~~\n" + " | |\n" + " | (1) allocated here\n" + " 7 | \n" + " 8 | for (i=0; i<255; i++) {\n" + " | ~~~~~ \n" + " | |\n" + " | (2) following `true' branch (when `i <= 254')... ->-+\n" + " | |\n" + " | |\n" + " |+-----------------------------------------------------------------+\n" + " 9 || buffer[i] = c;\n" + " || ~~~~~~~~~~~~~ \n" + " || |\n" + " |+------------->(3) ...to here\n" + " events 4-5\n" + " 8 | for (i=0; i<255; i++) {\n" + " | ~^~~~\n" + " | |\n" + " | (4) following `true' branch (when `i <= 254')... ->-+\n" + " | |\n" + " | |\n" + " |+-----------------------------------------------------------------+\n" + " 9 || buffer[i] = c;\n" + " || ~~~~~~~~~~~~~\n" + " || |\n" + " |+------------->(5) ...to here\n", + pp_formatted_text (text_output.get_printer ())); + } +} + +static void +control_flow_tests (const line_table_case &case_) +{ + pretty_printer pp; + pp_show_color (&pp) = false; + + test_control_flow_1 (case_, &pp); + test_control_flow_2 (case_, &pp); + test_control_flow_3 (case_, &pp); + test_control_flow_4 (case_, &pp); + test_control_flow_5 (case_, &pp); + test_control_flow_6 (case_, &pp); +} + +/* Run all of the selftests within this file. */ + +void +diagnostic_path_output_cc_tests () +{ + pretty_printer pp; + pp_show_color (&pp) = false; + + auto_fix_quotes fix_quotes; + test_empty_path (&pp); + test_intraprocedural_path (&pp); + test_interprocedural_path_1 (&pp); + test_interprocedural_path_2 (&pp); + test_recursion (&pp); + for_each_line_table_case (control_flow_tests); +} + +} // namespace selftest + +#if __GNUC__ >= 10 +# pragma GCC diagnostic pop +#endif + +#endif /* #if CHECKING_P */ diff --git a/gcc/diagnostic-path.cc b/gcc/diagnostic-path.cc index 9340e4e..7a9c051 100644 --- a/gcc/diagnostic-path.cc +++ b/gcc/diagnostic-path.cc @@ -25,19 +25,7 @@ along with GCC; see the file COPYING3. If not see #include "system.h" #include "coretypes.h" #include "diagnostic.h" -#include "diagnostic-macro-unwinding.h" -#include "intl.h" #include "diagnostic-path.h" -#include "gcc-rich-location.h" -#include "diagnostic-color.h" -#include "diagnostic-event-id.h" -#include "diagnostic-label-effects.h" -#include "pretty-print-markup.h" -#include "selftest.h" -#include "selftest-diagnostic.h" -#include "selftest-diagnostic-path.h" -#include "text-art/theme.h" -#include "diagnostic-format-text.h" /* Disable warnings about missing quoting in GCC diagnostics for the print calls below. */ @@ -226,2315 +214,6 @@ void debug (diagnostic_path *path) inform (&richloc, "debug path"); } -/* Anonymous namespace for path-printing code. */ - -namespace { - -/* A bundle of state for printing a path. */ - -class path_print_policy -{ -public: - path_print_policy (const diagnostic_text_output_format &text_output) - : m_source_policy (text_output.get_context ()) - { - } - - text_art::theme * - get_diagram_theme () const - { - return m_source_policy.get_diagram_theme (); - } - - const diagnostic_source_print_policy & - get_source_policy () const { return m_source_policy; } - -private: - diagnostic_source_print_policy m_source_policy; -}; - -/* Subclass of range_label for showing a particular event - when showing a consecutive run of events within a diagnostic_path as - labelled ranges within one gcc_rich_location. */ - -class path_label : public range_label -{ - public: - path_label (const diagnostic_path &path, - const pretty_printer &ref_pp, - unsigned start_idx, - bool colorize, - bool allow_emojis) - : m_path (path), - m_ref_pp (ref_pp), - m_start_idx (start_idx), m_effects (*this), - m_colorize (colorize), m_allow_emojis (allow_emojis) - {} - - label_text get_text (unsigned range_idx) const final override - { - unsigned event_idx = m_start_idx + range_idx; - const diagnostic_event &event = m_path.get_event (event_idx); - - const diagnostic_event::meaning meaning (event.get_meaning ()); - - auto pp = m_ref_pp.clone (); - pp_show_color (pp.get ()) = m_colorize; - diagnostic_event_id_t event_id (event_idx); - - pp_printf (pp.get (), "%@", &event_id); - pp_space (pp.get ()); - - if (meaning.m_verb == diagnostic_event::VERB_danger - && m_allow_emojis) - { - pp_unicode_character (pp.get (), 0x26A0); /* U+26A0 WARNING SIGN. */ - /* Append U+FE0F VARIATION SELECTOR-16 to select the emoji - variation of the char. */ - pp_unicode_character (pp.get (), 0xFE0F); - /* U+26A0 WARNING SIGN has East_Asian_Width == Neutral, but in its - emoji variant is printed (by vte at least) with a 2nd half - overlapping the next char. Hence we add two spaces here: a space - to be covered by this overlap, plus another space of padding. */ - pp_string (pp.get (), " "); - } - - event.print_desc (*pp.get ()); - - label_text result - = label_text::take (xstrdup (pp_formatted_text (pp.get ()))); - return result; - } - - const label_effects *get_effects (unsigned /*range_idx*/) const - { - return &m_effects; - } - - private: - class path_label_effects : public label_effects - { - public: - path_label_effects (const path_label &path_label) - : m_path_label (path_label) - { - } - bool has_in_edge (unsigned range_idx) const final override - { - if (const diagnostic_event *prev_event - = m_path_label.get_prev_event (range_idx)) - return prev_event->connect_to_next_event_p (); - return false; - } - bool has_out_edge (unsigned range_idx) const final override - { - const diagnostic_event &event = m_path_label.get_event (range_idx); - return event.connect_to_next_event_p (); - } - - private: - const path_label &m_path_label; - }; - - const diagnostic_event &get_event (unsigned range_idx) const - { - unsigned event_idx = m_start_idx + range_idx; - return m_path.get_event (event_idx); - } - - const diagnostic_event *get_prev_event (unsigned range_idx) const - { - if (m_start_idx + range_idx == 0) - return nullptr; - unsigned event_idx = m_start_idx + range_idx - 1; - return &m_path.get_event (event_idx); - } - - const diagnostic_path &m_path; - const pretty_printer &m_ref_pp; - unsigned m_start_idx; - path_label_effects m_effects; - const bool m_colorize; - const bool m_allow_emojis; -}; - -/* Return true if E1 and E2 can be consolidated into the same run of events - when printing a diagnostic_path. */ - -static bool -can_consolidate_events (const diagnostic_path &path, - const diagnostic_event &e1, - unsigned ev1_idx, - const diagnostic_event &e2, - unsigned ev2_idx, - bool check_locations) -{ - if (e1.get_thread_id () != e2.get_thread_id ()) - return false; - - if (!path.same_function_p (ev1_idx, ev2_idx)) - return false; - - if (e1.get_stack_depth () != e2.get_stack_depth ()) - return false; - - if (check_locations) - { - location_t loc1 = e1.get_location (); - location_t loc2 = e2.get_location (); - - if (loc1 < RESERVED_LOCATION_COUNT - || loc2 < RESERVED_LOCATION_COUNT) - return false; - - /* Neither can be macro-based. */ - if (linemap_location_from_macro_expansion_p (line_table, loc1)) - return false; - if (linemap_location_from_macro_expansion_p (line_table, loc2)) - return false; - } - - /* Passed all the tests. */ - return true; -} - -struct event_range; -struct path_summary; -class thread_event_printer; - -/* A bundle of information about all of the events in a diagnostic_path - relating to a specific path, for use by path_summary. */ - -class per_thread_summary -{ -public: - per_thread_summary (const diagnostic_path &path, - const logical_location_manager &logical_loc_mgr, - label_text name, unsigned swimlane_idx) - : m_path (path), - m_logical_loc_mgr (logical_loc_mgr), - m_name (std::move (name)), - m_swimlane_idx (swimlane_idx), - m_last_event (nullptr), - m_min_depth (INT_MAX), - m_max_depth (INT_MIN) - {} - - void update_depth_limits (int stack_depth) - { - if (stack_depth < m_min_depth) - m_min_depth = stack_depth; - if (stack_depth > m_max_depth) - m_max_depth = stack_depth; - } - - const char *get_name () const { return m_name.get (); } - unsigned get_swimlane_index () const { return m_swimlane_idx; } - - bool interprocedural_p () const; - -private: - friend struct path_summary; - friend class thread_event_printer; - friend struct event_range; - - const diagnostic_path &m_path; - const logical_location_manager &m_logical_loc_mgr; - - const label_text m_name; - - /* The "swimlane index" is the order in which this per_thread_summary - was created, for use when printing the events. */ - const unsigned m_swimlane_idx; - - // The event ranges specific to this thread: - auto_vec<event_range *> m_event_ranges; - - const diagnostic_event *m_last_event; - - int m_min_depth; - int m_max_depth; -}; - -/* A range of consecutive events within a diagnostic_path, all within the - same thread, and with the same fndecl and stack_depth, and which are suitable - to print with a single call to diagnostic_show_locus. */ -struct event_range -{ - /* A struct for tracking the mergability of labels on a particular - source line. In particular, track information about links between - labels to ensure that we only consolidate events involving links - that the source-printing code is able to handle (splitting them - otherwise). */ - struct per_source_line_info - { - void init (int line) - { - m_line = line; - m_has_in_edge = false; - m_has_out_edge = false; - m_min_label_source_column = INT_MAX; - m_max_label_source_column = INT_MIN; - } - - /* Return true if our source-printing/labelling/linking code can handle - the events already on this source line, *and* a new event at COLUMN. */ - bool - can_add_label_for_event_p (bool has_in_edge, - const diagnostic_event *prev_event, - bool has_out_edge, - int column) const - { - /* Any existing in-edge has to be the left-most label on its - source line. */ - if (m_has_in_edge && column < m_min_label_source_column) - return false; - /* Any existing out-edge has to be the right-most label on its - source line. */ - if (m_has_out_edge && column > m_max_label_source_column) - return false; - /* Can't have more than one in-edge. */ - if (m_has_in_edge && has_in_edge) - return false; - /* Can't have more than one out-edge. */ - if (m_has_out_edge && has_out_edge) - return false; - - if (has_in_edge) - { - /* Any new in-edge needs to be the left-most label on its - source line. */ - if (column > m_min_label_source_column) - return false; - - gcc_assert (prev_event); - const location_t prev_loc = prev_event->get_location (); - expanded_location prev_exploc - = linemap_client_expand_location_to_spelling_point - (line_table, prev_loc, LOCATION_ASPECT_CARET); - /* The destination in-edge's line number has to be <= the - source out-edge's line number (if any). */ - if (prev_exploc.line >= m_line) - return false; - } - - /* Any new out-edge needs to be the right-most label on its - source line. */ - if (has_out_edge) - if (column < m_max_label_source_column) - return false; - - /* All checks passed; we can add the new event at COLUMN. */ - return true; - } - - void - add_label_for_event (bool has_in_edge, bool has_out_edge, int column) - { - if (has_in_edge) - m_has_in_edge = true; - if (has_out_edge) - m_has_out_edge = true; - m_min_label_source_column = std::min (m_min_label_source_column, column); - m_max_label_source_column = std::max (m_max_label_source_column, column); - } - - int m_line; - bool m_has_in_edge; - bool m_has_out_edge; - int m_min_label_source_column; - int m_max_label_source_column; - }; - - event_range (const diagnostic_path &path, - const pretty_printer &ref_pp, - unsigned start_idx, - const diagnostic_event &initial_event, - per_thread_summary &t, - bool show_event_links, - bool colorize_labels, - bool allow_emojis) - : m_path (path), - m_initial_event (initial_event), - m_logical_loc (initial_event.get_logical_location ()), - m_stack_depth (initial_event.get_stack_depth ()), - m_start_idx (start_idx), m_end_idx (start_idx), - m_path_label (path, ref_pp, - start_idx, colorize_labels, allow_emojis), - m_richloc (initial_event.get_location (), &m_path_label, nullptr), - m_thread_id (initial_event.get_thread_id ()), - m_per_thread_summary (t), - m_show_event_links (show_event_links) - { - if (m_show_event_links) - { - expanded_location exploc - = linemap_client_expand_location_to_spelling_point - (line_table, initial_event.get_location (), LOCATION_ASPECT_CARET); - per_source_line_info &source_line_info - = get_per_source_line_info (exploc.line); - - const diagnostic_event *prev_thread_event = t.m_last_event; - const bool has_in_edge - = (prev_thread_event - ? prev_thread_event->connect_to_next_event_p () - : false); - const bool has_out_edge = initial_event.connect_to_next_event_p (); - - source_line_info.add_label_for_event - (has_in_edge, has_out_edge, exploc.column); - } - } - - per_source_line_info & - get_per_source_line_info (int source_line) - { - bool existed = false; - per_source_line_info &result - = m_source_line_info_map.get_or_insert (source_line, &existed); - if (!existed) - result.init (source_line); - return result; - } - - bool maybe_add_event (const path_print_policy &policy, - const diagnostic_event &new_ev, - unsigned new_ev_idx, - bool check_rich_locations) - { - if (!can_consolidate_events (m_path, - m_initial_event, m_start_idx, - new_ev, new_ev_idx, - check_rich_locations)) - return false; - - /* Verify compatibility of the new label and existing labels - with respect to the link-printing code. */ - expanded_location exploc - = linemap_client_expand_location_to_spelling_point - (line_table, new_ev.get_location (), LOCATION_ASPECT_CARET); - per_source_line_info &source_line_info - = get_per_source_line_info (exploc.line); - const diagnostic_event *prev_event = nullptr; - if (new_ev_idx > 0) - prev_event = &m_path.get_event (new_ev_idx - 1); - const bool has_in_edge = (prev_event - ? prev_event->connect_to_next_event_p () - : false); - const bool has_out_edge = new_ev.connect_to_next_event_p (); - if (m_show_event_links) - if (!source_line_info.can_add_label_for_event_p - (has_in_edge, prev_event, - has_out_edge, exploc.column)) - return false; - - /* Potentially verify that the locations are sufficiently close. */ - if (check_rich_locations) - if (!m_richloc.add_location_if_nearby (policy.get_source_policy (), - new_ev.get_location (), - false, &m_path_label)) - return false; - - m_end_idx = new_ev_idx; - m_per_thread_summary.m_last_event = &new_ev; - - if (m_show_event_links) - source_line_info.add_label_for_event - (has_in_edge, has_out_edge, exploc.column); - - return true; - } - - /* Print the events in this range to PP, typically as a single - call to diagnostic_show_locus. */ - - void print (pretty_printer &pp, - diagnostic_text_output_format &text_output, - diagnostic_source_effect_info *effect_info) - { - location_t initial_loc = m_initial_event.get_location (); - - diagnostic_context &dc = text_output.get_context (); - - /* Emit a span indicating the filename (and line/column) if the - line has changed relative to the last call to - diagnostic_show_locus. */ - if (dc.m_source_printing.enabled) - { - expanded_location exploc - = linemap_client_expand_location_to_spelling_point - (line_table, initial_loc, LOCATION_ASPECT_CARET); - if (exploc.file != LOCATION_FILE (dc.m_last_location)) - { - diagnostic_location_print_policy loc_policy (text_output); - diagnostic_start_span (&dc) (loc_policy, &pp, exploc); - } - } - - /* If we have an UNKNOWN_LOCATION (or BUILTINS_LOCATION) as the - primary location for an event, diagnostic_show_locus won't print - anything. - - In particular the label for the event won't get printed. - Fail more gracefully in this case by showing the event - index and text, at no particular location. */ - if (get_pure_location (initial_loc) <= BUILTINS_LOCATION) - { - for (unsigned i = m_start_idx; i <= m_end_idx; i++) - { - const diagnostic_event &iter_event = m_path.get_event (i); - diagnostic_event_id_t event_id (i); - pp_printf (&pp, " %@: ", &event_id); - iter_event.print_desc (pp); - pp_newline (&pp); - } - return; - } - - /* Call diagnostic_show_locus to show the events using labels. */ - diagnostic_show_locus (&dc, text_output.get_source_printing_options (), - &m_richloc, DK_DIAGNOSTIC_PATH, &pp, - effect_info); - - /* If we have a macro expansion, show the expansion to the user. */ - if (linemap_location_from_macro_expansion_p (line_table, initial_loc)) - { - gcc_assert (m_start_idx == m_end_idx); - maybe_unwind_expanded_macro_loc (text_output, initial_loc); - } - } - - const diagnostic_path &m_path; - const diagnostic_event &m_initial_event; - logical_location m_logical_loc; - int m_stack_depth; - unsigned m_start_idx; - unsigned m_end_idx; - path_label m_path_label; - gcc_rich_location m_richloc; - diagnostic_thread_id_t m_thread_id; - per_thread_summary &m_per_thread_summary; - hash_map<int_hash<int, -1, -2>, - per_source_line_info> m_source_line_info_map; - bool m_show_event_links; -}; - -/* A struct for grouping together the events in a diagnostic_path into - ranges of events, partitioned by thread and by stack frame (i.e. by fndecl - and stack depth). */ - -struct path_summary -{ - path_summary (const path_print_policy &policy, - const pretty_printer &ref_pp, - const diagnostic_path &path, - bool check_rich_locations, - bool colorize = false, - bool show_event_links = true); - - const logical_location_manager &get_logical_location_manager () const - { - return m_logical_loc_mgr; - } - unsigned get_num_ranges () const { return m_ranges.length (); } - bool multithreaded_p () const { return m_per_thread_summary.length () > 1; } - - const per_thread_summary &get_events_for_thread_id (diagnostic_thread_id_t tid) - { - per_thread_summary **slot = m_thread_id_to_events.get (tid); - gcc_assert (slot); - gcc_assert (*slot); - return **slot; - } - - const logical_location_manager &m_logical_loc_mgr; - auto_delete_vec <event_range> m_ranges; - auto_delete_vec <per_thread_summary> m_per_thread_summary; - hash_map<int_hash<diagnostic_thread_id_t, -1, -2>, - per_thread_summary *> m_thread_id_to_events; - -private: - per_thread_summary & - get_or_create_events_for_thread_id (const diagnostic_path &path, - diagnostic_thread_id_t tid) - { - if (per_thread_summary **slot = m_thread_id_to_events.get (tid)) - return **slot; - - const diagnostic_thread &thread = path.get_thread (tid); - per_thread_summary *pts - = new per_thread_summary (path, - m_logical_loc_mgr, - thread.get_name (false), - m_per_thread_summary.length ()); - m_thread_id_to_events.put (tid, pts); - m_per_thread_summary.safe_push (pts); - return *pts; - } -}; - -/* Return true iff there is more than one stack frame used by the events - of this thread. */ - -bool -per_thread_summary::interprocedural_p () const -{ - if (m_event_ranges.is_empty ()) - return false; - int first_stack_depth = m_event_ranges[0]->m_stack_depth; - for (auto range : m_event_ranges) - { - if (!m_path.same_function_p (m_event_ranges[0]->m_start_idx, - range->m_start_idx)) - return true; - if (range->m_stack_depth != first_stack_depth) - return true; - } - return false; -} - -/* path_summary's ctor. */ - -path_summary::path_summary (const path_print_policy &policy, - const pretty_printer &ref_pp, - const diagnostic_path &path, - bool check_rich_locations, - bool colorize, - bool show_event_links) -: m_logical_loc_mgr (path.get_logical_location_manager ()) -{ - const unsigned num_events = path.num_events (); - - event_range *cur_event_range = NULL; - for (unsigned idx = 0; idx < num_events; idx++) - { - const diagnostic_event &event = path.get_event (idx); - const diagnostic_thread_id_t thread_id = event.get_thread_id (); - per_thread_summary &pts - = get_or_create_events_for_thread_id (path, thread_id); - - pts.update_depth_limits (event.get_stack_depth ()); - - if (cur_event_range) - if (cur_event_range->maybe_add_event (policy, - event, - idx, check_rich_locations)) - continue; - - auto theme = policy.get_diagram_theme (); - const bool allow_emojis = theme ? theme->emojis_p () : false; - cur_event_range = new event_range (path, ref_pp, - idx, event, pts, - show_event_links, - colorize, - allow_emojis); - m_ranges.safe_push (cur_event_range); - pts.m_event_ranges.safe_push (cur_event_range); - pts.m_last_event = &event; - } -} - -/* Write SPACES to PP. */ - -static void -write_indent (pretty_printer *pp, int spaces) -{ - for (int i = 0; i < spaces; i++) - pp_space (pp); -} - -static const int base_indent = 2; -static const int per_frame_indent = 2; - -/* A bundle of state for printing event_range instances for a particular - thread. */ - -class thread_event_printer -{ -public: - thread_event_printer (const per_thread_summary &t, bool show_depths) - : m_per_thread_summary (t), - m_show_depths (show_depths), - m_cur_indent (base_indent), - m_vbar_column_for_depth (), - m_num_printed (0) - { - } - - /* Get the previous event_range within this thread, if any. */ - const event_range *get_any_prev_range () const - { - if (m_num_printed > 0) - return m_per_thread_summary.m_event_ranges[m_num_printed - 1]; - else - return nullptr; - } - - /* Get the next event_range within this thread, if any. */ - const event_range *get_any_next_range () const - { - if (m_num_printed < m_per_thread_summary.m_event_ranges.length () - 1) - return m_per_thread_summary.m_event_ranges[m_num_printed + 1]; - else - return nullptr; - } - - void - print_swimlane_for_event_range (diagnostic_text_output_format &text_output, - pretty_printer *pp, - const logical_location_manager &logical_loc_mgr, - event_range *range, - diagnostic_source_effect_info *effect_info) - { - gcc_assert (pp); - const char *const line_color = "path"; - const char *start_line_color - = colorize_start (pp_show_color (pp), line_color); - const char *end_line_color = colorize_stop (pp_show_color (pp)); - - text_art::ascii_theme fallback_theme; - text_art::theme *theme = text_output.get_diagram_theme (); - if (!theme) - theme = &fallback_theme; - - cppchar_t depth_marker_char = theme->get_cppchar - (text_art::theme::cell_kind::INTERPROCEDURAL_DEPTH_MARKER); - /* e.g. "|". */ - - const bool interprocedural_p = m_per_thread_summary.interprocedural_p (); - - write_indent (pp, m_cur_indent); - if (const event_range *prev_range = get_any_prev_range ()) - { - if (range->m_stack_depth > prev_range->m_stack_depth) - { - gcc_assert (interprocedural_p); - /* Show pushed stack frame(s). */ - cppchar_t left = theme->get_cppchar - (text_art::theme::cell_kind::INTERPROCEDURAL_PUSH_FRAME_LEFT); - cppchar_t middle = theme->get_cppchar - (text_art::theme::cell_kind::INTERPROCEDURAL_PUSH_FRAME_MIDDLE); - cppchar_t right = theme->get_cppchar - (text_art::theme::cell_kind::INTERPROCEDURAL_PUSH_FRAME_RIGHT); - /* e.g. "+--> ". */ - pp_string (pp, start_line_color); - pp_unicode_character (pp, left); - pp_unicode_character (pp, middle); - pp_unicode_character (pp, middle); - pp_unicode_character (pp, right); - pp_space (pp); - pp_string (pp, end_line_color); - m_cur_indent += 5; - } - } - if (range->m_logical_loc) - { - label_text name - (logical_loc_mgr.get_name_for_path_output (range->m_logical_loc)); - if (name.get ()) - pp_printf (pp, "%qs: ", name.get ()); - } - if (range->m_start_idx == range->m_end_idx) - pp_printf (pp, "event %i", - range->m_start_idx + 1); - else - pp_printf (pp, "events %i-%i", - range->m_start_idx + 1, range->m_end_idx + 1); - if (m_show_depths) - pp_printf (pp, " (depth %i)", range->m_stack_depth); - pp_newline (pp); - - /* Print a run of events. */ - if (interprocedural_p) - { - write_indent (pp, m_cur_indent + per_frame_indent); - pp_string (pp, start_line_color); - pp_unicode_character (pp, depth_marker_char); - pp_string (pp, end_line_color); - pp_newline (pp); - - char *saved_prefix = pp_take_prefix (pp); - char *prefix; - { - pretty_printer tmp_pp; - write_indent (&tmp_pp, m_cur_indent + per_frame_indent); - pp_string (&tmp_pp, start_line_color); - pp_unicode_character (&tmp_pp, depth_marker_char); - pp_string (&tmp_pp, end_line_color); - prefix = xstrdup (pp_formatted_text (&tmp_pp)); - } - pp_set_prefix (pp, prefix); - pp_prefixing_rule (pp) = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE; - range->print (*pp, text_output, effect_info); - pp_set_prefix (pp, saved_prefix); - - write_indent (pp, m_cur_indent + per_frame_indent); - pp_string (pp, start_line_color); - pp_unicode_character (pp, depth_marker_char); - pp_string (pp, end_line_color); - pp_newline (pp); - } - else - range->print (*pp, text_output, effect_info); - - if (const event_range *next_range = get_any_next_range ()) - { - if (range->m_stack_depth > next_range->m_stack_depth) - { - if (m_vbar_column_for_depth.get (next_range->m_stack_depth)) - { - /* Show returning from stack frame(s), by printing - something like: - " |\n" - " <-------------+\n" - " |\n". */ - gcc_assert (interprocedural_p); - cppchar_t left = theme->get_cppchar - (text_art::theme::cell_kind::INTERPROCEDURAL_POP_FRAMES_LEFT); - cppchar_t middle = theme->get_cppchar - (text_art::theme::cell_kind::INTERPROCEDURAL_POP_FRAMES_MIDDLE); - cppchar_t right = theme->get_cppchar - (text_art::theme::cell_kind::INTERPROCEDURAL_POP_FRAMES_RIGHT); - int vbar_for_next_frame - = *m_vbar_column_for_depth.get (next_range->m_stack_depth); - - int indent_for_next_frame - = vbar_for_next_frame - per_frame_indent; - write_indent (pp, vbar_for_next_frame); - pp_string (pp, start_line_color); - pp_unicode_character (pp, left); - for (int i = indent_for_next_frame + per_frame_indent; - i < m_cur_indent + per_frame_indent - 1; i++) - pp_unicode_character (pp, middle); - pp_unicode_character (pp, right); - pp_string (pp, end_line_color); - pp_newline (pp); - m_cur_indent = indent_for_next_frame; - - write_indent (pp, vbar_for_next_frame); - pp_string (pp, start_line_color); - pp_unicode_character (pp, depth_marker_char); - pp_string (pp, end_line_color); - pp_newline (pp); - } - else - { - /* Handle disjoint paths (e.g. a callback at some later - time). */ - m_cur_indent = base_indent; - } - } - else if (range->m_stack_depth < next_range->m_stack_depth) - { - /* Prepare to show pushed stack frame. */ - gcc_assert (interprocedural_p); - gcc_assert (range->m_stack_depth != EMPTY); - gcc_assert (range->m_stack_depth != DELETED); - m_vbar_column_for_depth.put (range->m_stack_depth, - m_cur_indent + per_frame_indent); - m_cur_indent += per_frame_indent; - } - } - - m_num_printed++; - } - - int get_cur_indent () const { return m_cur_indent; } - -private: - const per_thread_summary &m_per_thread_summary; - bool m_show_depths; - - /* Print the ranges. */ - int m_cur_indent; - - /* Keep track of column numbers of existing '|' characters for - stack depths we've already printed. */ - static const int EMPTY = -1; - static const int DELETED = -2; - typedef int_hash <int, EMPTY, DELETED> vbar_hash; - hash_map <vbar_hash, int> m_vbar_column_for_depth; - - /* How many event ranges within this swimlane have we printed. - This is the index of the next event_range to print. */ - unsigned m_num_printed; -}; - -/* Print path_summary PS to TEXT_OUTPUT, giving an overview of the - interprocedural calls and returns. - - Print the event descriptions in a nested form, printing the event - descriptions within calls to diagnostic_show_locus, using labels to - show the events: - - 'foo' (events 1-2) - | NN | - | | - +--> 'bar' (events 3-4) - | NN | - | | - +--> 'baz' (events 5-6) - | NN | - | | - <------------ + - | - 'foo' (events 7-8) - | NN | - | | - +--> 'bar' (events 9-10) - | NN | - | | - +--> 'baz' (events 11-12) - | NN | - | | - - If SHOW_DEPTHS is true, append " (depth N)" to the header of each run - of events. - - For events with UNKNOWN_LOCATION, print a summary of each the event. */ - -static void -print_path_summary_as_text (const path_summary &ps, - diagnostic_text_output_format &text_output, - bool show_depths) -{ - pretty_printer *const pp = text_output.get_printer (); - - std::vector<thread_event_printer> thread_event_printers; - for (auto t : ps.m_per_thread_summary) - thread_event_printers.push_back (thread_event_printer (*t, show_depths)); - - unsigned i; - event_range *range; - int last_out_edge_column = -1; - FOR_EACH_VEC_ELT (ps.m_ranges, i, range) - { - const int swimlane_idx - = range->m_per_thread_summary.get_swimlane_index (); - if (ps.multithreaded_p ()) - if (i == 0 || ps.m_ranges[i - 1]->m_thread_id != range->m_thread_id) - { - if (i > 0) - pp_newline (pp); - pp_printf (pp, "Thread: %qs", - range->m_per_thread_summary.get_name ()); - pp_newline (pp); - } - thread_event_printer &tep = thread_event_printers[swimlane_idx]; - /* Wire up any trailing out-edge from previous range to leading in-edge - of this range. */ - diagnostic_source_effect_info effect_info; - effect_info.m_leading_in_edge_column = last_out_edge_column; - tep.print_swimlane_for_event_range (text_output, pp, - ps.get_logical_location_manager (), - range, &effect_info); - last_out_edge_column = effect_info.m_trailing_out_edge_column; - } -} - -} /* end of anonymous namespace for path-printing code. */ - -class element_event_desc : public pp_element -{ -public: - element_event_desc (const diagnostic_event &event) - : m_event (event) - { - } - - void add_to_phase_2 (pp_markup::context &ctxt) final override - { - auto pp = ctxt.m_pp.clone (); - m_event.print_desc (*pp.get ()); - pp_string (&ctxt.m_pp, pp_formatted_text (pp.get ())); - } - -private: - const diagnostic_event &m_event; -}; - -/* Print PATH according to the context's path_format. */ - -void -diagnostic_text_output_format::print_path (const diagnostic_path &path) -{ - const unsigned num_events = path.num_events (); - - switch (get_context ().get_path_format ()) - { - case DPF_NONE: - /* Do nothing. */ - return; - - case DPF_SEPARATE_EVENTS: - { - /* A note per event. */ - auto &logical_loc_mgr = path.get_logical_location_manager (); - for (unsigned i = 0; i < num_events; i++) - { - const diagnostic_event &event = path.get_event (i); - element_event_desc e_event_desc (event); - diagnostic_event_id_t event_id (i); - if (get_context ().show_path_depths_p ()) - { - int stack_depth = event.get_stack_depth (); - /* -fdiagnostics-path-format=separate-events doesn't print - fndecl information, so with -fdiagnostics-show-path-depths - print the fndecls too, if any. */ - if (logical_location logical_loc - = event.get_logical_location ()) - { - label_text name - (logical_loc_mgr.get_name_for_path_output (logical_loc)); - inform (event.get_location (), - "%@ %e (fndecl %qs, depth %i)", - &event_id, &e_event_desc, - name.get (), stack_depth); - } - else - inform (event.get_location (), - "%@ %e (depth %i)", - &event_id, &e_event_desc, - stack_depth); - } - else - inform (event.get_location (), - "%@ %e", &event_id, &e_event_desc); - } - } - break; - - case DPF_INLINE_EVENTS: - { - /* Consolidate related events. */ - path_print_policy policy (*this); - pretty_printer *const pp = get_printer (); - const bool check_rich_locations = true; - const bool colorize = pp_show_color (pp); - const bool show_event_links = m_source_printing.show_event_links_p; - path_summary summary (policy, - *pp, - path, - check_rich_locations, - colorize, - show_event_links); - char *saved_prefix = pp_take_prefix (pp); - pp_set_prefix (pp, NULL); - print_path_summary_as_text (summary, *this, - get_context ().show_path_depths_p ()); - pp_flush (pp); - pp_set_prefix (pp, saved_prefix); - } - break; - } -} - -#if CHECKING_P - -namespace selftest { - -/* Return true iff all events in PATH have locations for which column data - is available, so that selftests that require precise string output can - bail out for awkward line_table cases. */ - -static bool -path_events_have_column_data_p (const diagnostic_path &path) -{ - for (unsigned idx = 0; idx < path.num_events (); idx++) - { - location_t event_loc = path.get_event (idx).get_location (); - if (line_table->get_pure_location (event_loc) - > LINE_MAP_MAX_LOCATION_WITH_COLS) - return false; - if (line_table->get_start (event_loc) > LINE_MAP_MAX_LOCATION_WITH_COLS) - return false; - if (line_table->get_finish (event_loc) > LINE_MAP_MAX_LOCATION_WITH_COLS) - return false; - } - return true; -} - -/* Verify that empty paths are handled gracefully. */ - -static void -test_empty_path (pretty_printer *event_pp) -{ - test_diagnostic_path path (event_pp); - ASSERT_FALSE (path.interprocedural_p ()); - - test_diagnostic_context dc; - diagnostic_text_output_format text_output (dc); - path_print_policy policy (text_output); - path_summary summary (policy, *event_pp, path, false); - ASSERT_EQ (summary.get_num_ranges (), 0); - - print_path_summary_as_text (summary, text_output, true); - ASSERT_STREQ ("", - pp_formatted_text (text_output.get_printer ())); -} - -/* Verify that print_path_summary works on a purely intraprocedural path. */ - -static void -test_intraprocedural_path (pretty_printer *event_pp) -{ - test_diagnostic_path path (event_pp); - const char *const funcname = "foo"; - path.add_event (UNKNOWN_LOCATION, funcname, 0, "first %qs", "free"); - path.add_event (UNKNOWN_LOCATION, funcname, 0, "double %qs", "free"); - - ASSERT_FALSE (path.interprocedural_p ()); - - test_diagnostic_context dc; - diagnostic_text_output_format text_output (dc); - path_print_policy policy (text_output); - path_summary summary (policy, *event_pp, path, false, false, false); - ASSERT_EQ (summary.get_num_ranges (), 1); - - print_path_summary_as_text (summary, text_output, true); - ASSERT_STREQ (" `foo': events 1-2 (depth 0)\n" - " (1): first `free'\n" - " (2): double `free'\n", - pp_formatted_text (text_output.get_printer ())); -} - -/* Verify that print_path_summary works on an interprocedural path. */ - -static void -test_interprocedural_path_1 (pretty_printer *event_pp) -{ - test_diagnostic_path path (event_pp); - path.add_entry ("test", 0); - path.add_call ("test", 0, "make_boxed_int"); - path.add_call ("make_boxed_int", 1, "wrapped_malloc"); - path.add_event (UNKNOWN_LOCATION, - "wrapped_malloc", 2, "calling malloc"); - path.add_return ("test", 0); - path.add_call ("test", 0, "free_boxed_int"); - path.add_call ("free_boxed_int", 1, "wrapped_free"); - path.add_event (UNKNOWN_LOCATION, "wrapped_free", 2, "calling free"); - path.add_return ("test", 0); - path.add_call ("test", 0, "free_boxed_int"); - path.add_call ("free_boxed_int", 1, "wrapped_free"); - path.add_event (UNKNOWN_LOCATION, "wrapped_free", 2, "calling free"); - ASSERT_EQ (path.num_events (), 18); - - ASSERT_TRUE (path.interprocedural_p ()); - - { - test_diagnostic_context dc; - diagnostic_text_output_format text_output (dc, nullptr, false); - path_print_policy policy (text_output); - path_summary summary (policy, *event_pp, path, false); - ASSERT_EQ (summary.get_num_ranges (), 9); - - dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); - print_path_summary_as_text (summary, text_output, true); - ASSERT_STREQ - (" `test': events 1-2 (depth 0)\n" - " |\n" - " | (1): entering `test'\n" - " | (2): calling `make_boxed_int'\n" - " |\n" - " +--> `make_boxed_int': events 3-4 (depth 1)\n" - " |\n" - " | (3): entering `make_boxed_int'\n" - " | (4): calling `wrapped_malloc'\n" - " |\n" - " +--> `wrapped_malloc': events 5-6 (depth 2)\n" - " |\n" - " | (5): entering `wrapped_malloc'\n" - " | (6): calling malloc\n" - " |\n" - " <-------------+\n" - " |\n" - " `test': events 7-8 (depth 0)\n" - " |\n" - " | (7): returning to `test'\n" - " | (8): calling `free_boxed_int'\n" - " |\n" - " +--> `free_boxed_int': events 9-10 (depth 1)\n" - " |\n" - " | (9): entering `free_boxed_int'\n" - " | (10): calling `wrapped_free'\n" - " |\n" - " +--> `wrapped_free': events 11-12 (depth 2)\n" - " |\n" - " | (11): entering `wrapped_free'\n" - " | (12): calling free\n" - " |\n" - " <-------------+\n" - " |\n" - " `test': events 13-14 (depth 0)\n" - " |\n" - " | (13): returning to `test'\n" - " | (14): calling `free_boxed_int'\n" - " |\n" - " +--> `free_boxed_int': events 15-16 (depth 1)\n" - " |\n" - " | (15): entering `free_boxed_int'\n" - " | (16): calling `wrapped_free'\n" - " |\n" - " +--> `wrapped_free': events 17-18 (depth 2)\n" - " |\n" - " | (17): entering `wrapped_free'\n" - " | (18): calling free\n" - " |\n", - pp_formatted_text (text_output.get_printer ())); - } - { - test_diagnostic_context dc; - dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE); - diagnostic_text_output_format text_output (dc); - path_print_policy policy (text_output); - path_summary summary (policy, *event_pp, path, false); - print_path_summary_as_text (summary, text_output, true); - ASSERT_STREQ - (" `test': events 1-2 (depth 0)\n" - " │\n" - " │ (1): entering `test'\n" - " │ (2): calling `make_boxed_int'\n" - " │\n" - " └──> `make_boxed_int': events 3-4 (depth 1)\n" - " │\n" - " │ (3): entering `make_boxed_int'\n" - " │ (4): calling `wrapped_malloc'\n" - " │\n" - " └──> `wrapped_malloc': events 5-6 (depth 2)\n" - " │\n" - " │ (5): entering `wrapped_malloc'\n" - " │ (6): calling malloc\n" - " │\n" - " <─────────────┘\n" - " │\n" - " `test': events 7-8 (depth 0)\n" - " │\n" - " │ (7): returning to `test'\n" - " │ (8): calling `free_boxed_int'\n" - " │\n" - " └──> `free_boxed_int': events 9-10 (depth 1)\n" - " │\n" - " │ (9): entering `free_boxed_int'\n" - " │ (10): calling `wrapped_free'\n" - " │\n" - " └──> `wrapped_free': events 11-12 (depth 2)\n" - " │\n" - " │ (11): entering `wrapped_free'\n" - " │ (12): calling free\n" - " │\n" - " <─────────────┘\n" - " │\n" - " `test': events 13-14 (depth 0)\n" - " │\n" - " │ (13): returning to `test'\n" - " │ (14): calling `free_boxed_int'\n" - " │\n" - " └──> `free_boxed_int': events 15-16 (depth 1)\n" - " │\n" - " │ (15): entering `free_boxed_int'\n" - " │ (16): calling `wrapped_free'\n" - " │\n" - " └──> `wrapped_free': events 17-18 (depth 2)\n" - " │\n" - " │ (17): entering `wrapped_free'\n" - " │ (18): calling free\n" - " │\n", - pp_formatted_text (text_output.get_printer ())); - } - -} - -/* Example where we pop the stack to an intermediate frame, rather than the - initial one. */ - -static void -test_interprocedural_path_2 (pretty_printer *event_pp) -{ - test_diagnostic_path path (event_pp); - path.add_entry ("foo", 0); - path.add_call ("foo", 0, "bar"); - path.add_call ("bar", 1, "baz"); - path.add_return ("bar", 1); - path.add_call ("bar", 1, "baz"); - ASSERT_EQ (path.num_events (), 8); - - ASSERT_TRUE (path.interprocedural_p ()); - - { - test_diagnostic_context dc; - diagnostic_text_output_format text_output (dc); - path_print_policy policy (text_output); - path_summary summary (policy, *event_pp, path, false); - ASSERT_EQ (summary.get_num_ranges (), 5); - dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); - print_path_summary_as_text (summary, text_output, true); - ASSERT_STREQ - (" `foo': events 1-2 (depth 0)\n" - " |\n" - " | (1): entering `foo'\n" - " | (2): calling `bar'\n" - " |\n" - " +--> `bar': events 3-4 (depth 1)\n" - " |\n" - " | (3): entering `bar'\n" - " | (4): calling `baz'\n" - " |\n" - " +--> `baz': event 5 (depth 2)\n" - " |\n" - " | (5): entering `baz'\n" - " |\n" - " <------+\n" - " |\n" - " `bar': events 6-7 (depth 1)\n" - " |\n" - " | (6): returning to `bar'\n" - " | (7): calling `baz'\n" - " |\n" - " +--> `baz': event 8 (depth 2)\n" - " |\n" - " | (8): entering `baz'\n" - " |\n", - pp_formatted_text (text_output.get_printer ())); - } - { - test_diagnostic_context dc; - dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE); - diagnostic_text_output_format text_output (dc); - path_print_policy policy (text_output); - path_summary summary (policy, *event_pp, path, false); - print_path_summary_as_text (summary, text_output, true); - ASSERT_STREQ - (" `foo': events 1-2 (depth 0)\n" - " │\n" - " │ (1): entering `foo'\n" - " │ (2): calling `bar'\n" - " │\n" - " └──> `bar': events 3-4 (depth 1)\n" - " │\n" - " │ (3): entering `bar'\n" - " │ (4): calling `baz'\n" - " │\n" - " └──> `baz': event 5 (depth 2)\n" - " │\n" - " │ (5): entering `baz'\n" - " │\n" - " <──────┘\n" - " │\n" - " `bar': events 6-7 (depth 1)\n" - " │\n" - " │ (6): returning to `bar'\n" - " │ (7): calling `baz'\n" - " │\n" - " └──> `baz': event 8 (depth 2)\n" - " │\n" - " │ (8): entering `baz'\n" - " │\n", - pp_formatted_text (text_output.get_printer ())); - } -} - -/* Verify that print_path_summary is sane in the face of a recursive - diagnostic_path. */ - -static void -test_recursion (pretty_printer *event_pp) -{ - test_diagnostic_path path (event_pp); - path.add_entry ("factorial", 0); - for (int depth = 0; depth < 3; depth++) - path.add_call ("factorial", depth, "factorial"); - ASSERT_EQ (path.num_events (), 7); - - ASSERT_TRUE (path.interprocedural_p ()); - - { - test_diagnostic_context dc; - dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); - - diagnostic_text_output_format text_output (dc); - path_print_policy policy (text_output); - path_summary summary (policy, *event_pp, path, false); - ASSERT_EQ (summary.get_num_ranges (), 4); - - print_path_summary_as_text (summary, text_output, true); - ASSERT_STREQ - (" `factorial': events 1-2 (depth 0)\n" - " |\n" - " | (1): entering `factorial'\n" - " | (2): calling `factorial'\n" - " |\n" - " +--> `factorial': events 3-4 (depth 1)\n" - " |\n" - " | (3): entering `factorial'\n" - " | (4): calling `factorial'\n" - " |\n" - " +--> `factorial': events 5-6 (depth 2)\n" - " |\n" - " | (5): entering `factorial'\n" - " | (6): calling `factorial'\n" - " |\n" - " +--> `factorial': event 7 (depth 3)\n" - " |\n" - " | (7): entering `factorial'\n" - " |\n", - pp_formatted_text (text_output.get_printer ())); - } - { - test_diagnostic_context dc; - dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE); - - diagnostic_text_output_format text_output (dc); - path_print_policy policy (text_output); - path_summary summary (policy, *event_pp, path, false); - print_path_summary_as_text (summary, text_output, true); - ASSERT_STREQ - (" `factorial': events 1-2 (depth 0)\n" - " │\n" - " │ (1): entering `factorial'\n" - " │ (2): calling `factorial'\n" - " │\n" - " └──> `factorial': events 3-4 (depth 1)\n" - " │\n" - " │ (3): entering `factorial'\n" - " │ (4): calling `factorial'\n" - " │\n" - " └──> `factorial': events 5-6 (depth 2)\n" - " │\n" - " │ (5): entering `factorial'\n" - " │ (6): calling `factorial'\n" - " │\n" - " └──> `factorial': event 7 (depth 3)\n" - " │\n" - " │ (7): entering `factorial'\n" - " │\n", - pp_formatted_text (text_output.get_printer ())); - } -} - -/* Helper class for writing tests of control flow visualization. */ - -class control_flow_test -{ -public: - control_flow_test (const location &loc, - const line_table_case &case_, - const char *content) - : m_tmp_file (loc, ".c", content, - /* gcc_rich_location::add_location_if_nearby implicitly - uses global_dc's file_cache, so we need to evict - tmp when we're done. */ - &global_dc->get_file_cache ()), - m_ltt (case_) - { - m_ord_map - = linemap_check_ordinary (linemap_add (line_table, LC_ENTER, false, - m_tmp_file.get_filename (), 0)); - linemap_line_start (line_table, 1, 100); - } - - location_t get_line_and_column (int line, int column) - { - return linemap_position_for_line_and_column (line_table, m_ord_map, - line, column); - } - - location_t get_line_and_columns (int line, int first_column, int last_column) - { - return get_line_and_columns (line, - first_column, first_column, last_column); - } - - location_t get_line_and_columns (int line, - int first_column, - int caret_column, - int last_column) - { - return make_location (get_line_and_column (line, caret_column), - get_line_and_column (line, first_column), - get_line_and_column (line, last_column)); - } - -private: - temp_source_file m_tmp_file; - line_table_test m_ltt; - const line_map_ordinary *m_ord_map; -}; - -/* Example of event edges where all events can go in the same layout, - testing the 6 combinations of: - - ASCII vs Unicode vs event links off - - line numbering on and off. */ - -static void -test_control_flow_1 (const line_table_case &case_, - pretty_printer *event_pp) -{ - /* Create a tempfile and write some text to it. - ...000000000111111111122222222223333333333. - ...123456789012345678901234567890123456789. */ - const char *content - = ("int test (int *p)\n" /* line 1. */ - "{\n" /* line 2. */ - " if (p)\n" /* line 3. */ - " return 0;\n" /* line 4. */ - " return *p;\n" /* line 5. */ - "}\n"); /* line 6. */ - - control_flow_test t (SELFTEST_LOCATION, case_, content); - - const location_t conditional = t.get_line_and_column (3, 7); - const location_t cfg_dest = t.get_line_and_column (5, 10); - - test_diagnostic_path path (event_pp); - path.add_event (conditional, nullptr, 0, - "following %qs branch (when %qs is NULL)...", - "false", "p"); - path.connect_to_next_event (); - - path.add_event (cfg_dest, nullptr, 0, - "...to here"); - path.add_event (cfg_dest, nullptr, 0, - "dereference of NULL %qs", - "p"); - - if (!path_events_have_column_data_p (path)) - return; - - - { - test_diagnostic_context dc; - dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); - dc.m_source_printing.show_event_links_p = true; - diagnostic_text_output_format text_output (dc); - path_print_policy policy (text_output); - path_summary summary (policy, *event_pp, path, true); - print_path_summary_as_text (summary, text_output, false); - ASSERT_STREQ - (" events 1-3\n" - "FILENAME:3:7:\n" - " if (p)\n" - " ^\n" - " |\n" - " (1) following `false' branch (when `p' is NULL)... ->-+\n" - " |\n" - "FILENAME:5:10:\n" - " |\n" - "+------------------------------------------------------------+\n" - "| return *p;\n" - "| ~\n" - "| |\n" - "+-------->(2) ...to here\n" - " (3) dereference of NULL `p'\n", - pp_formatted_text (text_output.get_printer ())); - } - { - test_diagnostic_context dc; - dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); - dc.m_source_printing.show_event_links_p = false; - diagnostic_text_output_format text_output (dc); - path_print_policy policy (text_output); - path_summary summary (policy, *event_pp, path, true); - print_path_summary_as_text (summary, text_output, false); - ASSERT_STREQ - (" events 1-3\n" - "FILENAME:3:7:\n" - " if (p)\n" - " ^\n" - " |\n" - " (1) following `false' branch (when `p' is NULL)...\n" - "FILENAME:5:10:\n" - " return *p;\n" - " ~\n" - " |\n" - " (2) ...to here\n" - " (3) dereference of NULL `p'\n", - pp_formatted_text (text_output.get_printer ())); - } - { - test_diagnostic_context dc; - dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); - dc.m_source_printing.show_line_numbers_p = true; - dc.m_source_printing.show_event_links_p = true; - diagnostic_text_output_format text_output (dc); - path_print_policy policy (text_output); - path_summary summary (policy, *event_pp, path, true); - print_path_summary_as_text (summary, text_output, false); - ASSERT_STREQ - (" events 1-3\n" - "FILENAME:3:7:\n" - " 3 | if (p)\n" - " | ^\n" - " | |\n" - " | (1) following `false' branch (when `p' is NULL)... ->-+\n" - " | |\n" - " | |\n" - " |+------------------------------------------------------------+\n" - " 4 || return 0;\n" - " 5 || return *p;\n" - " || ~\n" - " || |\n" - " |+-------->(2) ...to here\n" - " | (3) dereference of NULL `p'\n", - pp_formatted_text (text_output.get_printer ())); - } - { - test_diagnostic_context dc; - dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); - dc.m_source_printing.show_line_numbers_p = true; - dc.m_source_printing.show_event_links_p = false; - diagnostic_text_output_format text_output (dc); - path_print_policy policy (text_output); - path_summary summary (policy, *event_pp, path, true); - print_path_summary_as_text (summary, text_output, false); - ASSERT_STREQ - (" events 1-3\n" - "FILENAME:3:7:\n" - " 3 | if (p)\n" - " | ^\n" - " | |\n" - " | (1) following `false' branch (when `p' is NULL)...\n" - " 4 | return 0;\n" - " 5 | return *p;\n" - " | ~\n" - " | |\n" - " | (2) ...to here\n" - " | (3) dereference of NULL `p'\n", - pp_formatted_text (text_output.get_printer ())); - } - { - test_diagnostic_context dc; - dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE); - dc.m_source_printing.show_event_links_p = true; - diagnostic_text_output_format text_output (dc); - path_print_policy policy (text_output); - path_summary summary (policy, *event_pp, path, true); - print_path_summary_as_text (summary, text_output, false); - ASSERT_STREQ - (" events 1-3\n" - "FILENAME:3:7:\n" - " if (p)\n" - " ^\n" - " |\n" - " (1) following `false' branch (when `p' is NULL)... ─>─┐\n" - " │\n" - "FILENAME:5:10:\n" - " │\n" - "┌────────────────────────────────────────────────────────────┘\n" - "│ return *p;\n" - "│ ~\n" - "│ |\n" - "└────────>(2) ...to here\n" - " (3) dereference of NULL `p'\n", - pp_formatted_text (text_output.get_printer ())); - } - { - test_diagnostic_context dc; - dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_UNICODE); - dc.m_source_printing.show_event_links_p = true; - dc.m_source_printing.show_line_numbers_p = true; - diagnostic_text_output_format text_output (dc); - path_print_policy policy (text_output); - path_summary summary (policy, *event_pp, path, true); - print_path_summary_as_text (summary, text_output, false); - ASSERT_STREQ - (" events 1-3\n" - "FILENAME:3:7:\n" - " 3 | if (p)\n" - " | ^\n" - " | |\n" - " | (1) following `false' branch (when `p' is NULL)... ─>─┐\n" - " | │\n" - " | │\n" - " |┌────────────────────────────────────────────────────────────┘\n" - " 4 |│ return 0;\n" - " 5 |│ return *p;\n" - " |│ ~\n" - " |│ |\n" - " |└────────>(2) ...to here\n" - " | (3) dereference of NULL `p'\n", - pp_formatted_text (text_output.get_printer ())); - } -} - -/* Complex example involving a backedge. */ - -static void -test_control_flow_2 (const line_table_case &case_, - pretty_printer *event_pp) -{ - /* Create a tempfile and write some text to it. - ...000000000111111111122222222223333333333. - ...123456789012345678901234567890123456789. */ - const char *content - = ("int for_loop_noop_next (struct node *n)\n" /* <--------- line 1. */ - "{\n" /* <----------------------------------------------- line 2. */ - " int sum = 0;\n" /* <---------------------------------- line 3. */ - " for (struct node *iter = n; iter; iter->next)\n" /* <- line 4. */ - " sum += n->val;\n" /* <------------------------------ line 5. */ - " return sum;\n" /* <----------------------------------- line 6. */ - "}\n"); /* <-------------------------------------------- line 7. */ - /* Adapted from infinite-loop-linked-list.c where - "iter->next" should be "iter = iter->next". */ - - control_flow_test t (SELFTEST_LOCATION, case_, content); - - const location_t iter_test = t.get_line_and_columns (4, 31, 34); - const location_t loop_body_start = t.get_line_and_columns (5, 12, 17); - const location_t loop_body_end = t.get_line_and_columns (5, 5, 9, 17); - - test_diagnostic_path path (event_pp); - path.add_event (iter_test, nullptr, 0, "infinite loop here"); - - path.add_event (iter_test, nullptr, 0, "looping from here..."); - path.connect_to_next_event (); - - path.add_event (loop_body_start, nullptr, 0, "...to here"); - - path.add_event (loop_body_end, nullptr, 0, "looping back..."); - path.connect_to_next_event (); - - path.add_event (iter_test, nullptr, 0, "...to here"); - - if (!path_events_have_column_data_p (path)) - return; - - { - test_diagnostic_context dc; - dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); - dc.m_source_printing.show_event_links_p = true; - dc.m_source_printing.show_line_numbers_p = true; - diagnostic_text_output_format text_output (dc); - path_print_policy policy (text_output); - path_summary summary (policy, *event_pp, path, true); - print_path_summary_as_text (summary, text_output, false); - ASSERT_STREQ - (" events 1-3\n" - "FILENAME:4:31:\n" - " 4 | for (struct node *iter = n; iter; iter->next)\n" - " | ^~~~\n" - " | |\n" - " | (1) infinite loop here\n" - " | (2) looping from here... ->-+\n" - " | |\n" - " | |\n" - " |+----------------------------------------------------------+\n" - " 5 || sum += n->val;\n" - " || ~~~~~~ \n" - " || |\n" - " |+---------->(3) ...to here\n" - /* We need to start an new event_range here as event (4) is to the - left of event (3), and thus (4) would mess up the in-edge to (3). */ - " event 4\n" - " 5 | sum += n->val;\n" - " | ~~~~^~~~~~~~~\n" - " | |\n" - " | (4) looping back... ->-+\n" - " | |\n" - /* We need to start an new event_range here as event (4) with an - out-edge is on a later line (line 5) than its destination event (5), - on line 4. */ - " event 5\n" - " | |\n" - " |+-------------------------------+\n" - " 4 || for (struct node *iter = n; iter; iter->next)\n" - " || ^~~~\n" - " || |\n" - " |+----------------------------->(5) ...to here\n", - pp_formatted_text (text_output.get_printer ())); - } -} - -/* Complex example involving a backedge and both an in-edge and out-edge - on the same line. */ - -static void -test_control_flow_3 (const line_table_case &case_, - pretty_printer *event_pp) -{ - /* Create a tempfile and write some text to it. - ...000000000111111111122222222223333333333. - ...123456789012345678901234567890123456789. */ - const char *content - = ("void test_missing_comparison_in_for_condition_1 (int n)\n" - "{\n" /* <------------------------- line 2. */ - " for (int i = 0; n; i++)\n" /* <- line 3. */ - " {\n" /* <--------------------- line 4. */ - " }\n" /* <--------------------- line 5. */ - "}\n"); /* <----------------------- line 6. */ - /* Adapted from infinite-loop-1.c where the condition should have been - "i < n", rather than just "n". */ - - control_flow_test t (SELFTEST_LOCATION, case_, content); - - const location_t iter_test = t.get_line_and_column (3, 19); - const location_t iter_next = t.get_line_and_columns (3, 22, 24); - - test_diagnostic_path path (event_pp); - path.add_event (iter_test, nullptr, 0, "infinite loop here"); - - path.add_event (iter_test, nullptr, 0, "looping from here..."); - path.connect_to_next_event (); - - path.add_event (iter_next, nullptr, 0, "...to here"); - - path.add_event (iter_next, nullptr, 0, "looping back..."); - path.connect_to_next_event (); - - path.add_event (iter_test, nullptr, 0, "...to here"); - - if (!path_events_have_column_data_p (path)) - return; - - { - test_diagnostic_context dc; - dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); - dc.m_source_printing.show_event_links_p = true; - dc.m_source_printing.show_line_numbers_p = true; - diagnostic_text_output_format text_output (dc); - path_print_policy policy (text_output); - path_summary summary (policy, *event_pp, path, true); - print_path_summary_as_text (summary, text_output, false); - ASSERT_STREQ - (" events 1-2\n" - "FILENAME:3:19:\n" - " 3 | for (int i = 0; n; i++)\n" - " | ^\n" - " | |\n" - " | (1) infinite loop here\n" - " | (2) looping from here... ->-+\n" - " | |\n" - " events 3-4\n" - " | |\n" - " |+----------------------------------------------+\n" - " 3 || for (int i = 0; n; i++)\n" - " || ^~~\n" - " || |\n" - " |+-------------------->(3) ...to here\n" - " | (4) looping back... ->-+\n" - " | |\n" - /* We need to start an new event_range here as event (4) with an - out-edge is on the same line as its destination event (5), but - to the right, which we can't handle as a single event_range. */ - " event 5\n" - " | |\n" - " |+--------------------------------------------+\n" - " 3 || for (int i = 0; n; i++)\n" - " || ^\n" - " || |\n" - " |+----------------->(5) ...to here\n", - pp_formatted_text (text_output.get_printer ())); - } -} - -/* Implementation of ASSERT_CFG_EDGE_PATH_STREQ. */ - -static void -assert_cfg_edge_path_streq (const location &loc, - pretty_printer *event_pp, - const location_t src_loc, - const location_t dst_loc, - const char *expected_str) -{ - test_diagnostic_path path (event_pp); - path.add_event (src_loc, nullptr, 0, "from here..."); - path.connect_to_next_event (); - - path.add_event (dst_loc, nullptr, 0, "...to here"); - - if (!path_events_have_column_data_p (path)) - return; - - test_diagnostic_context dc; - dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); - dc.m_source_printing.show_event_links_p = true; - dc.m_source_printing.show_line_numbers_p = true; - diagnostic_text_output_format text_output (dc); - path_print_policy policy (text_output); - path_summary summary (policy, *event_pp, path, true); - print_path_summary_as_text (summary, text_output, false); - ASSERT_STREQ_AT (loc, expected_str, - pp_formatted_text (text_output.get_printer ())); -} - -/* Assert that if we make a path with an event with "from here..." at SRC_LOC - leading to an event "...to here" at DST_LOC that we print the path - as EXPECTED_STR. */ - -#define ASSERT_CFG_EDGE_PATH_STREQ(SRC_LOC, DST_LOC, EXPECTED_STR) \ - assert_cfg_edge_path_streq ((SELFTEST_LOCATION), (event_pp), \ - (SRC_LOC), (DST_LOC), (EXPECTED_STR)) - -/* Various examples of edge, trying to cover all combinations of: - - relative x positive of src label and dst label - - relative y position of labels: - - on same line - - on next line - - on line after next - - big gap, where src is before dst - - big gap, where src is after dst - and other awkward cases. */ - -static void -test_control_flow_4 (const line_table_case &case_, - pretty_printer *event_pp) -{ - std::string many_lines; - for (int i = 1; i <= 100; i++) - /* ............000000000111 - ............123456789012. */ - many_lines += "LHS RHS\n"; - control_flow_test t (SELFTEST_LOCATION, case_, many_lines.c_str ()); - - /* Same line. */ - { - /* LHS -> RHS. */ - ASSERT_CFG_EDGE_PATH_STREQ - (t.get_line_and_columns (3, 1, 3), - t.get_line_and_columns (3, 10, 12), - (" event 1\n" - "FILENAME:3:1:\n" - " 3 | LHS RHS\n" - " | ^~~\n" - " | |\n" - " | (1) from here... ->-+\n" - " | |\n" - " event 2\n" - " | |\n" - " |+--------------------+\n" - " 3 ||LHS RHS\n" - " || ^~~\n" - " || |\n" - " |+-------->(2) ...to here\n")); - - /* RHS -> LHS. */ - ASSERT_CFG_EDGE_PATH_STREQ - (t.get_line_and_columns (3, 10, 12), - t.get_line_and_columns (3, 1, 3), - (" event 1\n" - "FILENAME:3:10:\n" - " 3 | LHS RHS\n" - " | ^~~\n" - " | |\n" - " | (1) from here... ->-+\n" - " | |\n" - " event 2\n" - " | |\n" - " |+-----------------------------+\n" - " 3 ||LHS RHS\n" - " ||^~~\n" - " |||\n" - " |+(2) ...to here\n")); - } - - /* Next line. */ - { - /* LHS -> RHS. */ - ASSERT_CFG_EDGE_PATH_STREQ - (t.get_line_and_columns (3, 1, 3), - t.get_line_and_columns (4, 5, 7), - (" events 1-2\n" - "FILENAME:3:1:\n" - " 3 | LHS RHS\n" - " | ^~~\n" - " | |\n" - " | (1) from here... ->-+\n" - " | |\n" - " | |\n" - " |+--------------------+\n" - " 4 ||LHS RHS\n" - " || ~~~\n" - " || |\n" - " |+--->(2) ...to here\n")); - - /* RHS -> LHS. */ - ASSERT_CFG_EDGE_PATH_STREQ - (t.get_line_and_columns (3, 10, 12), - t.get_line_and_columns (4, 1, 3), - (" events 1-2\n" - "FILENAME:3:10:\n" - " 3 | LHS RHS\n" - " | ^~~\n" - " | |\n" - " | (1) from here... ->-+\n" - " | |\n" - " | |\n" - " |+-----------------------------+\n" - " 4 ||LHS RHS\n" - " ||~~~ \n" - " |||\n" - " |+(2) ...to here\n")); - } - - /* Line after next. */ - { - /* LHS -> RHS. */ - ASSERT_CFG_EDGE_PATH_STREQ - (t.get_line_and_columns (3, 1, 3), - t.get_line_and_columns (5, 10, 12), - (" events 1-2\n" - "FILENAME:3:1:\n" - " 3 | LHS RHS\n" - " | ^~~\n" - " | |\n" - " | (1) from here... ->-+\n" - " | |\n" - " | |\n" - " |+--------------------+\n" - " 4 ||LHS RHS\n" - " 5 ||LHS RHS\n" - " || ~~~\n" - " || |\n" - " |+-------->(2) ...to here\n")); - - /* RHS -> LHS. */ - ASSERT_CFG_EDGE_PATH_STREQ - (t.get_line_and_columns (3, 10, 12), - t.get_line_and_columns (5, 1, 3), - (" events 1-2\n" - "FILENAME:3:10:\n" - " 3 | LHS RHS\n" - " | ^~~\n" - " | |\n" - " | (1) from here... ->-+\n" - " | |\n" - " | |\n" - " |+-----------------------------+\n" - " 4 ||LHS RHS\n" - " 5 ||LHS RHS\n" - " ||~~~ \n" - " |||\n" - " |+(2) ...to here\n")); - } - - /* Big gap, increasing line number. */ - { - /* LHS -> RHS. */ - ASSERT_CFG_EDGE_PATH_STREQ - (t.get_line_and_columns (3, 1, 3), - t.get_line_and_columns (97, 10, 12), - (" events 1-2\n" - "FILENAME:3:1:\n" - " 3 | LHS RHS\n" - " | ^~~\n" - " | |\n" - " | (1) from here... ->-+\n" - " | |\n" - "......\n" - " | |\n" - " |+--------------------+\n" - " 97 ||LHS RHS\n" - " || ~~~\n" - " || |\n" - " |+-------->(2) ...to here\n")); - - /* RHS -> LHS. */ - ASSERT_CFG_EDGE_PATH_STREQ - (t.get_line_and_columns (3, 10, 12), - t.get_line_and_columns (97, 1, 3), - (" events 1-2\n" - "FILENAME:3:10:\n" - " 3 | LHS RHS\n" - " | ^~~\n" - " | |\n" - " | (1) from here... ->-+\n" - " | |\n" - "......\n" - " | |\n" - " |+-----------------------------+\n" - " 97 ||LHS RHS\n" - " ||~~~ \n" - " |||\n" - " |+(2) ...to here\n")); - } - - /* Big gap, decreasing line number. */ - { - /* LHS -> RHS. */ - ASSERT_CFG_EDGE_PATH_STREQ - (t.get_line_and_columns (97, 1, 3), - t.get_line_and_columns (3, 10, 12), - (" event 1\n" - "FILENAME:97:1:\n" - " 97 | LHS RHS\n" - " | ^~~\n" - " | |\n" - " | (1) from here... ->-+\n" - " | |\n" - " event 2\n" - " | |\n" - " |+--------------------+\n" - " 3 ||LHS RHS\n" - " || ^~~\n" - " || |\n" - " |+-------->(2) ...to here\n")); - - /* RHS -> LHS. */ - ASSERT_CFG_EDGE_PATH_STREQ - (t.get_line_and_columns (97, 10, 12), - t.get_line_and_columns (3, 1, 3), - (" event 1\n" - "FILENAME:97:10:\n" - " 97 | LHS RHS\n" - " | ^~~\n" - " | |\n" - " | (1) from here... ->-+\n" - " | |\n" - " event 2\n" - " | |\n" - " |+-----------------------------+\n" - " 3 ||LHS RHS\n" - " ||^~~\n" - " |||\n" - " |+(2) ...to here\n")); - } - - /* Unknown src. */ - { - ASSERT_CFG_EDGE_PATH_STREQ - (UNKNOWN_LOCATION, - t.get_line_and_columns (3, 10, 12), - (" event 1\n" - " (1): from here...\n" - " event 2\n" - "FILENAME:3:10:\n" - " 3 | LHS RHS\n" - " | ^~~\n" - " | |\n" - " |+-------->(2) ...to here\n")); - } - - /* Unknown dst. */ - { - ASSERT_CFG_EDGE_PATH_STREQ - (t.get_line_and_columns (3, 1, 3), - UNKNOWN_LOCATION, - (" event 1\n" - "FILENAME:3:1:\n" - " 3 | LHS RHS\n" - " | ^~~\n" - " | |\n" - " | (1) from here... ->-+\n" - " | |\n" - " event 2\n" - "FILENAME:\n" - " (2): ...to here\n")); - } -} - -/* Another complex example, adapted from data-model-20.c. */ - -static void -test_control_flow_5 (const line_table_case &case_, - pretty_printer *event_pp) -{ - /* Create a tempfile and write some text to it. - ...000000000111111111122222222223333333333444444444455555555556666666666. - ...123456789012345678901234567890123456789012345678901234567890123456789. */ - const char *content - = (" if ((arr = (struct foo **)malloc(n * sizeof(struct foo *))) == NULL)\n" - " return NULL;\n" /* <------------------------- line 2. */ - "\n" /* <----------------------------------------- line 3. */ - " for (i = 0; i < n; i++) {\n" /* <-------------- line 4. */ - " if ((arr[i] = (struct foo *)malloc(sizeof(struct foo))) == NULL) {\n"); - - control_flow_test t (SELFTEST_LOCATION, case_, content); - - test_diagnostic_path path (event_pp); - /* (1) */ - path.add_event (t.get_line_and_column (1, 6), nullptr, 0, - "following %qs branch (when %qs is non-NULL)...", - "false", "arr"); - path.connect_to_next_event (); - - /* (2) */ - path.add_event (t.get_line_and_columns (4, 8, 10, 12), nullptr, 0, - "...to here"); - - /* (3) */ - path.add_event (t.get_line_and_columns (4, 15, 17, 19), nullptr, 0, - "following %qs branch (when %qs)...", - "true", "i < n"); - path.connect_to_next_event (); - - /* (4) */ - path.add_event (t.get_line_and_column (5, 13), nullptr, 0, - "...to here"); - - /* (5) */ - path.add_event (t.get_line_and_columns (5, 33, 58), nullptr, 0, - "allocated here"); - - if (!path_events_have_column_data_p (path)) - return; - - { - test_diagnostic_context dc; - dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); - dc.m_source_printing.show_event_links_p = true; - dc.m_source_printing.show_line_numbers_p = true; - diagnostic_text_output_format text_output (dc); - path_print_policy policy (text_output); - path_summary summary (policy, *event_pp, path, true); - print_path_summary_as_text (summary, text_output, false); - ASSERT_STREQ - (" events 1-5\n" - "FILENAME:1:6:\n" - " 1 | if ((arr = (struct foo **)malloc(n * sizeof(struct foo *))) == NULL)\n" - " | ^\n" - " | |\n" - " | (1) following `false' branch (when `arr' is non-NULL)... ->-+\n" - " | |\n" - "......\n" - " | |\n" - " |+-----------------------------------------------------------------+\n" - " 4 || for (i = 0; i < n; i++) {\n" - " || ~~~~~ ~~~~~\n" - " || | |\n" - " || | (3) following `true' branch (when `i < n')... ->-+\n" - " |+-------->(2) ...to here |\n" - " | |\n" - " | |\n" - " |+-----------------------------------------------------------------+\n" - " 5 || if ((arr[i] = (struct foo *)malloc(sizeof(struct foo))) == NULL) {\n" - " || ~ ~~~~~~~~~~~~~~~~~~~~~~~~~~\n" - " || | |\n" - " |+----------->(4) ...to here (5) allocated here\n", - pp_formatted_text (text_output.get_printer ())); - } -} - -/* Another complex example, adapted from loop-3.c. */ - -static void -test_control_flow_6 (const line_table_case &case_, - pretty_printer *event_pp) -{ - /* Create a tempfile and write some text to it. - ...000000000111111111122222222223333333. - ...123456789012345678901234567890123456. */ - const char *content - = ("#include <stdlib.h>\n" /* <------------------ line 1. */ - "\n" /* <------------------------------------- line 2. */ - "void test(int c)\n" /* <--------------------- line 3. */ - "{\n" /* <------------------------------------ line 4. */ - " int i;\n" /* <----------------------------- line 5. */ - " char *buffer = (char*)malloc(256);\n" /* <- line 6. */ - "\n" /* <------------------------------------- line 7. */ - " for (i=0; i<255; i++) {\n" /* <------------ line 8. */ - " buffer[i] = c;\n" /* <------------------- line 9. */ - "\n" /* <------------------------------------- line 10. */ - " free(buffer);\n" /* <-------------------- line 11. */ - " }\n"); /* <-------------------------------- line 12. */ - - control_flow_test t (SELFTEST_LOCATION, case_, content); - - test_diagnostic_path path (event_pp); - /* (1) */ - path.add_event (t.get_line_and_columns (6, 25, 35), nullptr, 0, - "allocated here"); - - /* (2) */ - path.add_event (t.get_line_and_columns (8, 13, 14, 17), nullptr, 0, - "following %qs branch (when %qs)...", - "true", "i <= 254"); - path.connect_to_next_event (); - - /* (3) */ - path.add_event (t.get_line_and_columns (9, 5, 15, 17), nullptr, 0, - "...to here"); - - /* (4) */ - path.add_event (t.get_line_and_columns (8, 13, 14, 17), nullptr, 0, - "following %qs branch (when %qs)...", - "true", "i <= 254"); - path.connect_to_next_event (); - - /* (5) */ - path.add_event (t.get_line_and_columns (9, 5, 15, 17), nullptr, 0, - "...to here"); - - if (!path_events_have_column_data_p (path)) - return; - - { - test_diagnostic_context dc; - dc.set_text_art_charset (DIAGNOSTICS_TEXT_ART_CHARSET_ASCII); - dc.m_source_printing.show_event_links_p = true; - dc.m_source_printing.show_line_numbers_p = true; - diagnostic_text_output_format text_output (dc); - path_print_policy policy (text_output); - path_summary summary (policy, *event_pp, path, true); - print_path_summary_as_text (summary, text_output, false); - ASSERT_STREQ - (" events 1-3\n" - "FILENAME:6:25:\n" - " 6 | char *buffer = (char*)malloc(256);\n" - " | ^~~~~~~~~~~\n" - " | |\n" - " | (1) allocated here\n" - " 7 | \n" - " 8 | for (i=0; i<255; i++) {\n" - " | ~~~~~ \n" - " | |\n" - " | (2) following `true' branch (when `i <= 254')... ->-+\n" - " | |\n" - " | |\n" - " |+-----------------------------------------------------------------+\n" - " 9 || buffer[i] = c;\n" - " || ~~~~~~~~~~~~~ \n" - " || |\n" - " |+------------->(3) ...to here\n" - " events 4-5\n" - " 8 | for (i=0; i<255; i++) {\n" - " | ~^~~~\n" - " | |\n" - " | (4) following `true' branch (when `i <= 254')... ->-+\n" - " | |\n" - " | |\n" - " |+-----------------------------------------------------------------+\n" - " 9 || buffer[i] = c;\n" - " || ~~~~~~~~~~~~~\n" - " || |\n" - " |+------------->(5) ...to here\n", - pp_formatted_text (text_output.get_printer ())); - } -} - -static void -control_flow_tests (const line_table_case &case_) -{ - pretty_printer pp; - pp_show_color (&pp) = false; - - test_control_flow_1 (case_, &pp); - test_control_flow_2 (case_, &pp); - test_control_flow_3 (case_, &pp); - test_control_flow_4 (case_, &pp); - test_control_flow_5 (case_, &pp); - test_control_flow_6 (case_, &pp); -} - -/* Run all of the selftests within this file. */ - -void -diagnostic_path_cc_tests () -{ - pretty_printer pp; - pp_show_color (&pp) = false; - - auto_fix_quotes fix_quotes; - test_empty_path (&pp); - test_intraprocedural_path (&pp); - test_interprocedural_path_1 (&pp); - test_interprocedural_path_2 (&pp); - test_recursion (&pp); - for_each_line_table_case (control_flow_tests); -} - -} // namespace selftest - #if __GNUC__ >= 10 # pragma GCC diagnostic pop #endif - -#endif /* #if CHECKING_P */ diff --git a/gcc/diagnostic-show-locus.cc b/gcc/diagnostic-show-locus.cc index 898efe7..397fffb 100644 --- a/gcc/diagnostic-show-locus.cc +++ b/gcc/diagnostic-show-locus.cc @@ -19,6 +19,8 @@ along with GCC; see the file COPYING3. If not see <http://www.gnu.org/licenses/>. */ #include "config.h" +#define INCLUDE_MAP +#define INCLUDE_STRING #define INCLUDE_VECTOR #include "system.h" #include "coretypes.h" @@ -37,6 +39,8 @@ along with GCC; see the file COPYING3. If not see #include "text-art/types.h" #include "text-art/theme.h" #include "diagnostic-label-effects.h" +#include "xml.h" +#include "xml-printer.h" #ifdef HAVE_TERMIOS_H # include <termios.h> @@ -70,7 +74,8 @@ struct point_state bool draw_caret_p; }; -/* A class to inject colorization codes when printing the diagnostic locus. +/* A class to inject colorization codes when printing the diagnostic locus + as text. It has one kind of colorization for each of: - normal text @@ -369,17 +374,348 @@ struct char_display_policy : public cpp_char_column_policy public: char_display_policy (int tabstop, int (*width_cb) (cppchar_t c), - void (*print_cb) (pretty_printer *pp, - const cpp_decoded_char &cp)) + void (*print_text_cb) (to_text &sink, + const cpp_decoded_char &cp), + void (*print_html_cb) (to_html &sink, + const cpp_decoded_char &cp)) : cpp_char_column_policy (tabstop, width_cb), - m_print_cb (print_cb) + m_print_text_cb (print_text_cb), + m_print_html_cb (print_html_cb) { } - void (*m_print_cb) (pretty_printer *pp, - const cpp_decoded_char &cp); + void (*m_print_text_cb) (to_text &sink, + const cpp_decoded_char &cp); + void (*m_print_html_cb) (to_html &sink, + const cpp_decoded_char &cp); }; +template <typename Sink> class layout_printer; + +} // anonymous namespace + +/* This code is written generically to write either: + - text, to a pretty_printer, potentially with colorization codes, or + - html, to an xml::printer, with nested HTML tags. + + This is handled via a "Sink" template, which is either to_text + or to_html. */ + +/* Writing text output. */ + +struct to_text +{ + friend class layout_printer<to_text>; + + to_text (pretty_printer &pp, + colorizer &colorizer) + : m_pp (pp), + m_colorizer (&colorizer) + { + m_saved_rule = pp_prefixing_rule (&m_pp); + pp_prefixing_rule (&m_pp) = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE; + } + to_text (pretty_printer &pp, + colorizer *colorizer) + : m_pp (pp), + m_colorizer (colorizer) + { + m_saved_rule = pp_prefixing_rule (&m_pp); + pp_prefixing_rule (&m_pp) = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE; + } + ~to_text () + { + + pp_prefixing_rule (&m_pp) = m_saved_rule; + } + + static bool is_text () { return true; } + static bool is_html () { return false; } + + void emit_text_prefix () + { + pp_emit_prefix (&m_pp); + } + + void push_html_tag (std::string, bool) + { + // no-op for text + } + void push_html_tag_with_class (std::string, std::string, bool) + { + // no-op for text + } + void pop_html_tag (std::string) + { + // no-op for text + } + + void add_html_tag_with_class (std::string, std::string, bool) + { + // no-op for text + } + + void add_space () + { + pp_space (&m_pp); + } + + void add_character (cppchar_t ch) + { + pp_unicode_character (&m_pp, ch); + } + + void add_utf8_byte (char b) + { + pp_character (&m_pp, b); + } + + void add_text (const char *text) + { + pp_string (&m_pp, text); + } + + void print_decoded_char (const char_display_policy &char_policy, + cpp_decoded_char cp) + { + char_policy.m_print_text_cb (*this, cp); + } + + void colorize_text_ensure_normal () + { + gcc_assert (m_colorizer); + m_colorizer->set_normal_text (); + } + + void colorize_text_for_range_idx (int range_idx) + { + gcc_assert (m_colorizer); + m_colorizer->set_range (range_idx); + } + + void colorize_text_for_cfg_edge () + { + gcc_assert (m_colorizer); + m_colorizer->set_cfg_edge (); + } + + void colorize_text_for_fixit_insert () + { + gcc_assert (m_colorizer); + m_colorizer->set_fixit_insert (); + } + + void colorize_text_for_fixit_delete () + { + gcc_assert (m_colorizer); + m_colorizer->set_fixit_delete (); + } + + void + invoke_start_span_fn (const diagnostic_source_print_policy &source_policy, + const diagnostic_location_print_policy &loc_policy, + const expanded_location &exploc) + { + source_policy.get_text_start_span_fn () (loc_policy, *this, exploc); + } + + // Text-specific functions + void add_newline () + { + pp_newline (&m_pp); + } + + pretty_printer &m_pp; +private: + colorizer *m_colorizer; + diagnostic_prefixing_rule_t m_saved_rule; +}; + +/* Writing HTML output. */ + +struct to_html +{ + friend class layout_printer<to_html>; + + to_html (xml::printer &xp, + html_label_writer *html_label_writer) + : m_xp (xp), + m_html_label_writer (html_label_writer) + {} + + static bool is_text () { return false; } + static bool is_html () { return true; } + + void emit_text_prefix () + { + // no-op for HTML + } + + void push_html_tag (std::string name, + bool preserve_whitespace) + { + m_xp.push_tag (std::move (name), preserve_whitespace); + } + + void push_html_tag_with_class (std::string name, + std::string class_, + bool preserve_whitespace) + { + m_xp.push_tag_with_class (std::move (name), + std::move (class_), + preserve_whitespace); + } + + void pop_html_tag (std::string /*name*/) + { + m_xp.pop_tag (); + } + + void add_html_tag_with_class (std::string name, + std::string class_, + bool preserve_whitespace) + { + auto element = std::make_unique<xml::element> (std::move (name), + preserve_whitespace); + element->set_attr ("class", std::move (class_)); + m_xp.append (std::move (element)); + } + + void add_raw_html (const char *src) + { + m_xp.add_raw (src); + } + + void add_space () + { + m_xp.add_text (" "); + } + + void add_character (cppchar_t ch) + { + pp_clear_output_area (&m_scratch_pp); + pp_unicode_character (&m_scratch_pp, ch); + m_xp.add_text (pp_formatted_text (&m_scratch_pp)); + } + + void add_utf8_byte (char b) + { + m_xp.add_text (std::string (1, b)); + } + + void add_text (const char *text) + { + m_xp.add_text (text); + } + + void print_decoded_char (const char_display_policy &char_policy, + cpp_decoded_char cp) + { + char_policy.m_print_html_cb (*this, cp); + } + + void colorize_text_ensure_normal () + { + // no-op for HTML + } + + void colorize_text_for_range_idx (int) + { + // no-op for HTML + } + + void colorize_text_for_cfg_edge () + { + // no-op for HTML + } + + void colorize_text_for_fixit_insert () + { + // no-op for HTML + } + + void colorize_text_for_fixit_delete () + { + // no-op for HTML + } + + void + invoke_start_span_fn (const diagnostic_source_print_policy &source_policy, + const diagnostic_location_print_policy &loc_policy, + const expanded_location &exploc) + { + source_policy.get_html_start_span_fn () (loc_policy, *this, exploc); + } + + xml::printer &m_xp; +private: + html_label_writer *m_html_label_writer; + pretty_printer m_scratch_pp; +}; + +void +diagnostic_location_print_policy:: +print_text_span_start (const diagnostic_context &dc, + pretty_printer &pp, + const expanded_location &exploc) +{ + to_text sink (pp, nullptr); + diagnostic_source_print_policy source_policy (dc); + source_policy.get_text_start_span_fn () (*this, sink, exploc); +} + +void +diagnostic_location_print_policy:: +print_html_span_start (const diagnostic_context &dc, + xml::printer &xp, + const expanded_location &exploc) +{ + to_html sink (xp, nullptr); + diagnostic_source_print_policy source_policy (dc); + source_policy.get_html_start_span_fn () (*this, sink, exploc); +} + +pretty_printer * +get_printer (to_text &sink) +{ + return &sink.m_pp; +} + +template<> +void +default_diagnostic_start_span_fn<to_text> (const diagnostic_location_print_policy &loc_policy, + to_text &sink, + expanded_location exploc) +{ + const diagnostic_column_policy &column_policy + = loc_policy.get_column_policy (); + label_text text + = column_policy.get_location_text (exploc, + loc_policy.show_column_p (), + pp_show_color (&sink.m_pp)); + pp_string (&sink.m_pp, text.get ()); + pp_newline (&sink.m_pp); +} + +template<> +void +default_diagnostic_start_span_fn<to_html> (const diagnostic_location_print_policy &loc_policy, + to_html &sink, + expanded_location exploc) +{ + const diagnostic_column_policy &column_policy + = loc_policy.get_column_policy (); + label_text text + = column_policy.get_location_text (exploc, + loc_policy.show_column_p (), + false); + sink.m_xp.push_tag_with_class ("span", "location", true); + sink.m_xp.add_text (text.get ()); + sink.m_xp.pop_tag (); // span +} + +namespace { + /* A class to control the overall layout when printing a diagnostic. The layout is determined within the constructor. @@ -392,7 +728,8 @@ struct char_display_policy : public cpp_char_column_policy class layout { public: - friend class layout_printer; + friend class layout_printer<to_text>; + friend class layout_printer<to_html>; layout (const diagnostic_source_print_policy &source_policy, const rich_location &richloc, @@ -458,16 +795,24 @@ class layout bool m_escape_on_output; }; -/* A bundle of state for printing a particular layout - to a particular pretty_printer. */ +class line_label; +enum class margin_kind +{ + normal, + insertion, + ruler +}; + +/* A bundle of state for printing a particular layout + to a particular Sink (either to_text or to_html). */ +template <typename Sink> class layout_printer { public: - layout_printer (pretty_printer &pp, + layout_printer (Sink &sink, const layout &layout, - const rich_location &richloc, - diagnostic_t diagnostic_kind); + bool is_diagnostic_path); void print (const diagnostic_source_print_policy &source_policy); @@ -485,11 +830,13 @@ private: line_bounds print_source_line (linenum_type row, const char *line, int line_bytes); void print_leftmost_column (); - void start_annotation_line (char margin_char = ' '); + void start_annotation_line (enum margin_kind); + void end_line (); void print_annotation_line (linenum_type row, const line_bounds lbounds); void print_any_labels (linenum_type row); + void begin_label (const line_label &label); + void end_label (); void print_trailing_fixits (linenum_type row); - void print_newline (); void move_to_column (int *column, int dest_column, bool add_left_margin); @@ -497,9 +844,8 @@ private: void print_any_right_to_left_edge_lines (); private: - pretty_printer &m_pp; + Sink &m_sink; const layout &m_layout; - colorizer m_colorizer; bool m_is_diagnostic_path; /* Fields for handling links between labels (e.g. for showing CFG edges @@ -1178,8 +1524,9 @@ fixit_cmp (const void *p_a, const void *p_b) /* Callback for char_display_policy::m_print_cb for printing source chars when not escaping the source. */ +template <class Sink> static void -default_print_decoded_ch (pretty_printer *pp, +default_print_decoded_ch (Sink &sink, const cpp_decoded_char &decoded_ch) { for (const char *ptr = decoded_ch.m_start_byte; @@ -1187,11 +1534,11 @@ default_print_decoded_ch (pretty_printer *pp, { if (*ptr == '\0' || *ptr == '\r') { - pp_space (pp); + sink.add_space (); continue; } - pp_character (pp, *ptr); + sink.add_utf8_byte (*ptr); } } @@ -1219,8 +1566,9 @@ escape_as_bytes_width (cppchar_t ch) /* Callback for char_display_policy::m_print_cb for printing source chars when escaping with DIAGNOSTICS_ESCAPE_FORMAT_BYTES. */ +template <typename Sink> static void -escape_as_bytes_print (pretty_printer *pp, +escape_as_bytes_print (Sink &sink, const cpp_decoded_char &decoded_ch) { if (!decoded_ch.m_valid_ch) @@ -1230,14 +1578,14 @@ escape_as_bytes_print (pretty_printer *pp, { char buf[16]; sprintf (buf, "<%02x>", (unsigned char)*iter); - pp_string (pp, buf); + sink.add_text (buf); } return; } cppchar_t ch = decoded_ch.m_ch; if (ch < 0x80 && ISPRINT (ch)) - pp_character (pp, ch); + sink.add_character (ch); else { for (const char *iter = decoded_ch.m_start_byte; @@ -1245,7 +1593,7 @@ escape_as_bytes_print (pretty_printer *pp, { char buf[16]; sprintf (buf, "<%02x>", (unsigned char)*iter); - pp_string (pp, buf); + sink.add_text (buf); } } } @@ -1275,24 +1623,25 @@ escape_as_unicode_width (cppchar_t ch) /* Callback for char_display_policy::m_print_cb for printing source chars when escaping with DIAGNOSTICS_ESCAPE_FORMAT_UNICODE. */ +template <typename Sink> static void -escape_as_unicode_print (pretty_printer *pp, +escape_as_unicode_print (Sink &sink, const cpp_decoded_char &decoded_ch) { if (!decoded_ch.m_valid_ch) { - escape_as_bytes_print (pp, decoded_ch); + escape_as_bytes_print<Sink> (sink, decoded_ch); return; } cppchar_t ch = decoded_ch.m_ch; if (ch < 0x80 && ISPRINT (ch)) - pp_character (pp, ch); + sink.add_character (ch); else { char buf[16]; sprintf (buf, "<U+%04X>", ch); - pp_string (pp, buf); + sink.add_text (buf); } } @@ -1306,7 +1655,8 @@ make_char_policy (const diagnostic_source_print_policy &source_policy, char_display_policy result (source_policy.get_column_policy ().get_tabstop (), cpp_wcwidth, - default_print_decoded_ch); + default_print_decoded_ch<to_text>, + default_print_decoded_ch<to_html>); /* If the diagnostic suggests escaping non-ASCII bytes, then use policy from user-supplied options. */ @@ -1319,11 +1669,13 @@ make_char_policy (const diagnostic_source_print_policy &source_policy, gcc_unreachable (); case DIAGNOSTICS_ESCAPE_FORMAT_UNICODE: result.m_width_cb = escape_as_unicode_width; - result.m_print_cb = escape_as_unicode_print; + result.m_print_text_cb = escape_as_unicode_print<to_text>; + result.m_print_html_cb = escape_as_unicode_print<to_html>; break; case DIAGNOSTICS_ESCAPE_FORMAT_BYTES: result.m_width_cb = escape_as_bytes_width; - result.m_print_cb = escape_as_bytes_print; + result.m_print_text_cb = escape_as_bytes_print<to_text>; + result.m_print_html_cb = escape_as_bytes_print<to_html>; break; } } @@ -1530,17 +1882,32 @@ layout::will_show_line_p (linenum_type row) const /* Print a line showing a gap in the line numbers, for showing the boundary between two line spans. */ +template<> void -layout_printer::print_gap_in_line_numbering () +layout_printer<to_text>::print_gap_in_line_numbering () { gcc_assert (m_layout.m_options.show_line_numbers_p); - pp_emit_prefix (&m_pp); + m_sink.emit_text_prefix (); for (int i = 0; i < m_layout.get_linenum_width () + 1; i++) - pp_character (&m_pp, '.'); + m_sink.add_character ('.'); - pp_newline (&m_pp); + m_sink.add_newline (); +} + +template<> +void +layout_printer<to_html>::print_gap_in_line_numbering () +{ + gcc_assert (m_layout.m_options.show_line_numbers_p); + + m_sink.add_raw_html + ("<tbody class=\"line-span-jump\">\n" + "<tr class=\"line-span-jump-row\">" + "<td class=\"linenum-gap\">[...]</td>" + "<td class=\"source-gap\"/></tr>\n" + "</tbody>\n"); } /* Return true iff we should print a heading when starting the @@ -1854,21 +2221,32 @@ layout::calculate_x_offset_display () colorization and tab expansion, this function tracks the line position in both byte and display column units. */ +template<typename Sink> line_bounds -layout_printer::print_source_line (linenum_type row, const char *line, int line_bytes) +layout_printer<Sink>::print_source_line (linenum_type row, + const char *line, + int line_bytes) { - m_colorizer.set_normal_text (); - - pp_emit_prefix (&m_pp); + m_sink.colorize_text_ensure_normal (); + m_sink.push_html_tag ("tr", true); + m_sink.emit_text_prefix (); if (m_layout.m_options.show_line_numbers_p) { + m_sink.push_html_tag_with_class ("td", "linenum", true); int width = num_digits (row); for (int i = 0; i < m_layout.get_linenum_width () - width; i++) - pp_space (&m_pp); - pp_printf (&m_pp, "%i |", row); + m_sink.add_space (); + char buf[20]; + sprintf (buf, "%i", row); + m_sink.add_text (buf); + if (Sink::is_text ()) + m_sink.add_text (" |"); + m_sink.pop_html_tag ("td"); } + m_sink.push_html_tag_with_class ("td", "left-margin", true); print_leftmost_column (); + m_sink.pop_html_tag ("td"); /* We will stop printing the source line at any trailing whitespace. */ line_bytes = get_line_bytes_without_trailing_whitespace (line, @@ -1879,6 +2257,8 @@ layout_printer::print_source_line (linenum_type row, const char *line, int line_ tab expansion, and for implementing m_x_offset_display. */ cpp_display_width_computation dw (line, line_bytes, m_layout.m_char_policy); + m_sink.push_html_tag_with_class ("td", "source", true); + /* Skip the first m_x_offset_display display columns. In case the leading portion that will be skipped ends with a character with wcwidth > 1, then it is possible we skipped too much, so account for that by padding with @@ -1889,7 +2269,7 @@ layout_printer::print_source_line (linenum_type row, const char *line, int line_ for (int skipped_display_cols = dw.advance_display_cols (m_layout.m_x_offset_display); skipped_display_cols > m_layout.m_x_offset_display; --skipped_display_cols) - pp_space (&m_pp); + m_sink.add_space (); /* Print the line and compute the line_bounds. */ line_bounds lbounds; @@ -1917,9 +2297,9 @@ layout_printer::print_source_line (linenum_type row, const char *line, int line_ CU_BYTES, &state); if (in_range_p) - m_colorizer.set_range (state.range_idx); + m_sink.colorize_text_for_range_idx (state.range_idx); else - m_colorizer.set_normal_text (); + m_sink.colorize_text_ensure_normal (); } /* Get the display width of the next character to be output, expanding @@ -1933,7 +2313,7 @@ layout_printer::print_source_line (linenum_type row, const char *line, int line_ /* The returned display width is the number of spaces into which the tab should be expanded. */ for (int i = 0; i != this_display_width; ++i) - pp_space (&m_pp); + m_sink.add_space (); continue; } @@ -1947,10 +2327,10 @@ layout_printer::print_source_line (linenum_type row, const char *line, int line_ } /* Output the character. */ - m_layout.m_char_policy.m_print_cb (&m_pp, cp); + m_sink.print_decoded_char (m_layout.m_char_policy, cp); c = dw.next_byte (); } - print_newline (); + end_line (); return lbounds; } @@ -1975,8 +2355,9 @@ layout::should_print_annotation_line_p (linenum_type row) const /* Print the leftmost column after the margin, which is used for showing links between labels (e.g. for CFG edges in execution paths). */ +template<typename Sink> void -layout_printer::print_leftmost_column () +layout_printer<Sink>::print_leftmost_column () { if (!get_options ().show_event_links_p) gcc_assert (m_link_lhs_state == link_lhs_state::none); @@ -1986,76 +2367,124 @@ layout_printer::print_leftmost_column () default: gcc_unreachable (); case link_lhs_state::none: - pp_space (&m_pp); + m_sink.add_space (); break; case link_lhs_state::rewinding_to_lhs: { - m_colorizer.set_cfg_edge (); + m_sink.colorize_text_for_cfg_edge (); const cppchar_t ch = get_theme ().get_cppchar (text_art::theme::cell_kind::CFG_FROM_LEFT_TO_DOWN); - pp_unicode_character (&m_pp, ch); - m_colorizer.set_normal_text (); + m_sink.add_character (ch); + m_sink.colorize_text_ensure_normal (); } break; case link_lhs_state::at_lhs: { - m_colorizer.set_cfg_edge (); + m_sink.colorize_text_for_cfg_edge (); const cppchar_t ch = get_theme ().get_cppchar (text_art::theme::cell_kind::CFG_DOWN); - pp_unicode_character (&m_pp, ch); - m_colorizer.set_normal_text (); + m_sink.add_character (ch); + m_sink.colorize_text_ensure_normal (); } break; case link_lhs_state::indenting_to_dest: { - m_colorizer.set_cfg_edge (); + m_sink.colorize_text_for_cfg_edge (); const cppchar_t ch = get_theme ().get_cppchar (text_art::theme::cell_kind::CFG_FROM_DOWN_TO_RIGHT); - pp_unicode_character (&m_pp, ch); - m_colorizer.set_normal_text (); + m_sink.add_character (ch); + m_sink.colorize_text_ensure_normal (); } break; } } -/* Begin an annotation line. If m_show_line_numbers_p, print the left - margin, which is empty for annotation lines. +/* Begin an annotation line for either text or html output + + If m_show_line_numbers_p, print the left margin, which is empty + for annotation lines. After any left margin, print a leftmost column, which is used for - showing links between labels (e.g. for CFG edges in execution paths). */ + showing links between labels (e.g. for CFG edges in execution paths). + + For text sinks, this also first prints the text prefix. + For html sinks, this also pushes <tr> and <td> open tags, where the + <td> is for the coming annotations. */ +template<typename Sink> void -layout_printer::start_annotation_line (char margin_char) +layout_printer<Sink>::start_annotation_line (enum margin_kind margin) { - pp_emit_prefix (&m_pp); + m_sink.emit_text_prefix (); + m_sink.push_html_tag ("tr", true); + + char margin_char = (margin == margin_kind::insertion + ? '+' + : ' '); + if (get_options ().show_line_numbers_p) { /* Print the margin. If MARGIN_CHAR != ' ', then print up to 3 of it, right-aligned, padded with spaces. */ + m_sink.push_html_tag_with_class ("td", "linenum", true); int i; for (i = 0; i < m_layout.m_linenum_width - 3; i++) - pp_space (&m_pp); + m_sink.add_space (); for (; i < m_layout.m_linenum_width; i++) - pp_character (&m_pp, margin_char); - pp_string (&m_pp, " |"); + m_sink.add_character (margin_char); + if (Sink::is_text ()) + m_sink.add_text (" |"); + m_sink.pop_html_tag ("td"); } - if (margin_char == ' ') - print_leftmost_column (); + + m_sink.push_html_tag_with_class ("td", "left-margin", true); + if (margin == margin_kind::insertion) + m_sink.add_character (margin_char); else - pp_character (&m_pp, margin_char); + print_leftmost_column (); + m_sink.pop_html_tag ("td"); + + m_sink.push_html_tag_with_class ("td", + (margin == margin_kind::ruler + ? "ruler" + : "annotation"), + true); +} + +/* End a source or annotation line: text implementation. + Reset any colorization and emit a newline. */ + +template<> +void +layout_printer<to_text>::end_line () +{ + m_sink.colorize_text_ensure_normal (); + m_sink.add_newline (); +} + +/* End a source or annotation line: HTML implementation. + Close the <td> and <tr> tags. */ + +template<> +void +layout_printer<to_html>::end_line () +{ + m_sink.pop_html_tag ("td"); + m_sink.pop_html_tag ("tr"); } /* Print a line consisting of the caret/underlines for the given source line. */ +template<typename Sink> void -layout_printer::print_annotation_line (linenum_type row, - const line_bounds lbounds) +layout_printer<Sink>::print_annotation_line (linenum_type row, + const line_bounds lbounds) { int x_bound = m_layout.get_x_bound_for_row (row, m_layout.m_exploc.m_display_col, lbounds.m_last_non_ws_disp_col); - start_annotation_line (); + start_annotation_line (margin_kind::normal); for (int column = 1 + m_layout.m_x_offset_display; column < x_bound; column++) { @@ -2069,7 +2498,7 @@ layout_printer::print_annotation_line (linenum_type row, if (in_range_p) { /* Within a range. Draw either the caret or an underline. */ - m_colorizer.set_range (state.range_idx); + m_sink.colorize_text_for_range_idx (state.range_idx); if (state.draw_caret_p) { /* Draw the caret. */ @@ -2078,19 +2507,20 @@ layout_printer::print_annotation_line (linenum_type row, caret_char = get_options ().caret_chars[state.range_idx]; else caret_char = '^'; - pp_character (&m_pp, caret_char); + m_sink.add_character (caret_char); } else - pp_character (&m_pp, '~'); + m_sink.add_character ('~'); } else { /* Not in a range. */ - m_colorizer.set_normal_text (); - pp_character (&m_pp, ' '); + m_sink.colorize_text_ensure_normal (); + m_sink.add_character (' '); } } - print_newline (); + + end_line (); } /* A version of label_text that can live inside a vec. @@ -2126,11 +2556,13 @@ struct pod_label_text class line_label { public: - line_label (int state_idx, int column, + line_label (unsigned original_range_idx, + int state_idx, int column, label_text text, bool has_in_edge, bool has_out_edge) - : m_state_idx (state_idx), m_column (column), + : m_original_range_idx (original_range_idx), + m_state_idx (state_idx), m_column (column), m_text (std::move (text)), m_label_line (0), m_has_vbar (true), m_has_in_edge (has_in_edge), m_has_out_edge (has_out_edge) @@ -2158,6 +2590,7 @@ public: return -compare (ll1->m_state_idx, ll2->m_state_idx); } + unsigned m_original_range_idx; int m_state_idx; int m_column; pod_label_text m_text; @@ -2168,9 +2601,43 @@ public: bool m_has_out_edge; }; +template<> +void +layout_printer<to_text>::begin_label (const line_label &label) +{ + /* Colorize the text, unless it's for events in a + diagnostic_path. */ + if (!m_is_diagnostic_path) + m_sink.colorize_text_for_range_idx (label.m_state_idx); +} + +template<> +void +layout_printer<to_html>::begin_label (const line_label &) +{ + if (m_sink.m_html_label_writer) + m_sink.m_html_label_writer->begin_label (); +} + +template<> +void +layout_printer<to_text>::end_label () +{ + m_sink.colorize_text_ensure_normal (); +} + +template<> +void +layout_printer<to_html>::end_label () +{ + if (m_sink.m_html_label_writer) + m_sink.m_html_label_writer->end_label (); +} + /* Print any labels in this row. */ +template <typename Sink> void -layout_printer::print_any_labels (linenum_type row) +layout_printer<Sink>::print_any_labels (linenum_type row) { int i; auto_vec<line_label> labels; @@ -2203,7 +2670,8 @@ layout_printer::print_any_labels (linenum_type row) if (text.get () == NULL) continue; - labels.safe_push (line_label (i, disp_col, std::move (text), + labels.safe_push (line_label (range->m_original_idx, + i, disp_col, std::move (text), range->has_in_edge (), range->has_out_edge ())); } @@ -2288,7 +2756,7 @@ layout_printer::print_any_labels (linenum_type row) gcc_assert (get_options ().show_event_links_p); m_link_lhs_state = link_lhs_state::indenting_to_dest; } - start_annotation_line (); + start_annotation_line (margin_kind::normal); int column = 1 + m_layout.m_x_offset_display; line_label *label; @@ -2310,32 +2778,31 @@ layout_printer::print_any_labels (linenum_type row) . ^~~~~~~~~~~~~ . this text. */ gcc_assert (get_options ().show_event_links_p); - m_colorizer.set_cfg_edge (); + m_sink.colorize_text_for_cfg_edge (); const cppchar_t right= get_theme ().get_cppchar (text_art::theme::cell_kind::CFG_RIGHT); while (column < label->m_column - 1) { - pp_unicode_character (&m_pp, right); + m_sink.add_character (right); column++; } if (column == label->m_column - 1) { - pp_character (&m_pp, '>'); + m_sink.add_character ('>'); column++; } - m_colorizer.set_normal_text (); + m_sink.colorize_text_ensure_normal (); m_link_lhs_state = link_lhs_state::none; label_line_with_in_edge = -1; } else move_to_column (&column, label->m_column, true); gcc_assert (column == label->m_column); - /* Colorize the text, unless it's for events in a - diagnostic_path. */ - if (!m_is_diagnostic_path) - m_colorizer.set_range (label->m_state_idx); - pp_string (&m_pp, label->m_text.m_buffer); - m_colorizer.set_normal_text (); + + begin_label (*label); + m_sink.add_text (label->m_text.m_buffer); + end_label (); + column += label->m_display_width; if (get_options ().show_event_links_p && label->m_has_out_edge) { @@ -2350,13 +2817,13 @@ layout_printer::print_any_labels (linenum_type row) (text_art::theme::cell_kind::CFG_RIGHT); const cppchar_t from_right_to_down= get_theme ().get_cppchar (text_art::theme::cell_kind::CFG_FROM_RIGHT_TO_DOWN); - m_colorizer.set_cfg_edge (); - pp_space (&m_pp); - pp_unicode_character (&m_pp, right); - pp_unicode_character (&m_pp, '>'); - pp_unicode_character (&m_pp, right); - pp_unicode_character (&m_pp, from_right_to_down); - m_colorizer.set_normal_text (); + m_sink.colorize_text_for_cfg_edge (); + m_sink.add_space (); + m_sink.add_character (right); + m_sink.add_character ('>'); + m_sink.add_character (right); + m_sink.add_character (from_right_to_down); + m_sink.colorize_text_ensure_normal (); column += 5; m_link_rhs_column = column - 1; } @@ -2365,9 +2832,9 @@ layout_printer::print_any_labels (linenum_type row) { gcc_assert (column <= label->m_column); move_to_column (&column, label->m_column, true); - m_colorizer.set_range (label->m_state_idx); - pp_character (&m_pp, '|'); - m_colorizer.set_normal_text (); + m_sink.colorize_text_for_range_idx (label->m_state_idx); + m_sink.add_character ('|'); + m_sink.colorize_text_ensure_normal (); column++; } } @@ -2377,14 +2844,14 @@ layout_printer::print_any_labels (linenum_type row) if (m_link_rhs_column != -1 && column < m_link_rhs_column) { move_to_column (&column, m_link_rhs_column, true); - m_colorizer.set_cfg_edge (); + m_sink.colorize_text_for_cfg_edge (); const cppchar_t down= get_theme ().get_cppchar (text_art::theme::cell_kind::CFG_DOWN); - pp_unicode_character (&m_pp, down); - m_colorizer.set_normal_text (); + m_sink.add_character (down); + m_sink.colorize_text_ensure_normal (); } - print_newline (); + end_line (); } } @@ -2393,14 +2860,13 @@ layout_printer::print_any_labels (linenum_type row) if (m_link_rhs_column != -1) { int column = 1 + m_layout.m_x_offset_display; - start_annotation_line (); + start_annotation_line (margin_kind::normal); move_to_column (&column, m_link_rhs_column, true); - m_colorizer.set_cfg_edge (); + m_sink.colorize_text_for_cfg_edge (); const cppchar_t down= get_theme ().get_cppchar (text_art::theme::cell_kind::CFG_DOWN); - pp_unicode_character (&m_pp, down); - m_colorizer.set_normal_text (); - print_newline (); + m_sink.add_character (down); + end_line (); } /* Clean up. */ @@ -2417,8 +2883,9 @@ layout_printer::print_any_labels (linenum_type row) They are printed on lines of their own, before the source line itself, with a leading '+'. */ +template <typename Sink> void -layout_printer::print_leading_fixits (linenum_type row) +layout_printer<Sink>::print_leading_fixits (linenum_type row) { for (unsigned int i = 0; i < m_layout.m_fixit_hints.length (); i++) { @@ -2438,16 +2905,15 @@ layout_printer::print_leading_fixits (linenum_type row) and the inserted line with "insert" colorization helps them stand out from each other, and from the surrounding text. */ - m_colorizer.set_normal_text (); - start_annotation_line ('+'); - m_colorizer.set_fixit_insert (); + m_sink.colorize_text_ensure_normal (); + start_annotation_line (margin_kind::insertion); + m_sink.colorize_text_for_fixit_insert (); /* Print all but the trailing newline of the fix-it hint. We have to print the newline separately to avoid getting additional pp prefixes printed. */ for (size_t i = 0; i < hint->get_length () - 1; i++) - pp_character (&m_pp, hint->get_string ()[i]); - m_colorizer.set_normal_text (); - pp_newline (&m_pp); + m_sink.add_character (hint->get_string ()[i]); + end_line (); } } } @@ -2877,8 +3343,9 @@ line_corrections::add_hint (const fixit_hint *hint) Fix-it hints that insert new lines are handled separately, in layout::print_leading_fixits. */ +template<typename Sink> void -layout_printer::print_trailing_fixits (linenum_type row) +layout_printer<Sink>::print_trailing_fixits (linenum_type row) { /* Build a list of correction instances for the line, potentially consolidating hints (for the sake of readability). */ @@ -2904,7 +3371,7 @@ layout_printer::print_trailing_fixits (linenum_type row) int column = 1 + m_layout.m_x_offset_display; if (!corrections.m_corrections.is_empty ()) - start_annotation_line (); + start_annotation_line (margin_kind::normal); FOR_EACH_VEC_ELT (corrections.m_corrections, i, c) { @@ -2914,9 +3381,9 @@ layout_printer::print_trailing_fixits (linenum_type row) /* This assumes the insertion just affects one line. */ int start_column = c->m_printed_columns.start; move_to_column (&column, start_column, true); - m_colorizer.set_fixit_insert (); - pp_string (&m_pp, c->m_text); - m_colorizer.set_normal_text (); + m_sink.colorize_text_for_fixit_insert (); + m_sink.add_text (c->m_text); + m_sink.colorize_text_ensure_normal (); column += c->m_display_cols; } else @@ -2932,10 +3399,10 @@ layout_printer::print_trailing_fixits (linenum_type row) || c->m_byte_length == 0) { move_to_column (&column, start_column, true); - m_colorizer.set_fixit_delete (); + m_sink.colorize_text_for_fixit_delete (); for (; column <= finish_column; column++) - pp_character (&m_pp, '-'); - m_colorizer.set_normal_text (); + m_sink.add_character ('-'); + m_sink.colorize_text_ensure_normal (); } /* Print the replacement text. REPLACE also covers removals, so only do this extra work (potentially starting @@ -2943,27 +3410,21 @@ layout_printer::print_trailing_fixits (linenum_type row) if (c->m_byte_length > 0) { move_to_column (&column, start_column, true); - m_colorizer.set_fixit_insert (); - pp_string (&m_pp, c->m_text); - m_colorizer.set_normal_text (); + m_sink.colorize_text_for_fixit_insert (); + m_sink.add_text (c->m_text); + m_sink.colorize_text_ensure_normal (); column += c->m_display_cols; } } } + if (!corrections.m_corrections.is_empty ()) + m_sink.pop_html_tag ("td"); + /* Add a trailing newline, if necessary. */ move_to_column (&column, 1 + m_layout.m_x_offset_display, false); } -/* Disable any colorization and emit a newline. */ - -void -layout_printer::print_newline () -{ - m_colorizer.set_normal_text (); - pp_newline (&m_pp); -} - /* Return true if (ROW/COLUMN) is within a range of the layout. If it returns true, OUT_STATE is written to, with the range index, and whether we should draw the caret at @@ -3060,27 +3521,28 @@ layout::get_x_bound_for_row (linenum_type row, int caret_column, and updating *COLUMN. If ADD_LEFT_MARGIN, then print the (empty) left margin after any newline. */ +template<typename Sink> void -layout_printer::move_to_column (int *column, - int dest_column, - bool add_left_margin) +layout_printer<Sink>::move_to_column (int *column, + int dest_column, + bool add_left_margin) { /* Start a new line if we need to. */ if (*column > dest_column) { - print_newline (); + end_line (); if (add_left_margin) - start_annotation_line (); + start_annotation_line (margin_kind::normal); *column = 1 + m_layout.m_x_offset_display; } while (*column < dest_column) { /* For debugging column issues, it can be helpful to replace this - pp_space call with - pp_character (&m_pp, '0' + (*column % 10)); + add_space call with + m_sink.add_character ('0' + (*column % 10)); to visualize the changing value of "*column". */ - pp_space (&m_pp); + m_sink.add_space (); (*column)++; } } @@ -3088,49 +3550,55 @@ layout_printer::move_to_column (int *column, /* For debugging layout issues, render a ruler giving column numbers (after the 1-column indent). */ +template<typename Sink> void -layout_printer::show_ruler (int max_column) +layout_printer<Sink>::show_ruler (int max_column) { + m_sink.push_html_tag_with_class("thead", "ruler", false); + /* Hundreds. */ if (max_column > 99) { - start_annotation_line (); + start_annotation_line (margin_kind::ruler); for (int column = 1 + m_layout.m_x_offset_display; column <= max_column; ++column) if (column % 10 == 0) - pp_character (&m_pp, '0' + (column / 100) % 10); + m_sink.add_character ('0' + (column / 100) % 10); else - pp_space (&m_pp); - pp_newline (&m_pp); + m_sink.add_space (); + end_line (); } /* Tens. */ - start_annotation_line (); + start_annotation_line (margin_kind::ruler); for (int column = 1 + m_layout.m_x_offset_display; column <= max_column; ++column) if (column % 10 == 0) - pp_character (&m_pp, '0' + (column / 10) % 10); + m_sink.add_character ('0' + (column / 10) % 10); else - pp_space (&m_pp); - pp_newline (&m_pp); + m_sink.add_space (); + end_line (); /* Units. */ - start_annotation_line (); + start_annotation_line (margin_kind::ruler); for (int column = 1 + m_layout.m_x_offset_display; column <= max_column; ++column) - pp_character (&m_pp, '0' + (column % 10)); - pp_newline (&m_pp); + m_sink.add_character ('0' + (column % 10)); + end_line (); + + m_sink.pop_html_tag("thead"); // thead } /* Print leading fix-its (for new lines inserted before the source line) then the source line, followed by an annotation line consisting of any caret/underlines, then any fixits. If the source line can't be read, print nothing. */ +template<typename Sink> void -layout_printer::print_line (linenum_type row) +layout_printer<Sink>::print_line (linenum_type row) { char_span line = m_layout.m_file_cache.get_source_line (m_layout.m_exploc.file, row); @@ -3154,8 +3622,9 @@ layout_printer::print_line (linenum_type row) showing the link entering at the top right and emerging at the bottom left. */ +template<typename Sink> void -layout_printer::print_any_right_to_left_edge_lines () +layout_printer<Sink>::print_any_right_to_left_edge_lines () { if (m_link_rhs_column == -1) /* Can also happen if the out-edge had UNKNOWN_LOCATION. */ @@ -3164,31 +3633,30 @@ layout_printer::print_any_right_to_left_edge_lines () gcc_assert (get_options ().show_event_links_p); /* Print the line with "|". */ - start_annotation_line (); + start_annotation_line (margin_kind::normal); + int column = 1 + m_layout.m_x_offset_display; move_to_column (&column, m_link_rhs_column, true); - m_colorizer.set_cfg_edge (); + m_sink.colorize_text_for_cfg_edge (); const cppchar_t down= get_theme ().get_cppchar (text_art::theme::cell_kind::CFG_DOWN); - pp_unicode_character (&m_pp, down); - m_colorizer.set_normal_text (); - pp_newline (&m_pp); + m_sink.add_character (down); + end_line (); /* Print the line with "┌──────────────────────────────────────────┘". */ m_link_lhs_state = link_lhs_state::rewinding_to_lhs; - start_annotation_line (); - m_colorizer.set_cfg_edge (); + start_annotation_line (margin_kind::normal); + m_sink.colorize_text_for_cfg_edge (); const cppchar_t left= get_theme ().get_cppchar (text_art::theme::cell_kind::CFG_LEFT); for (int column = 1 + m_layout.m_x_offset_display; column < m_link_rhs_column; ++column) - pp_unicode_character (&m_pp, left); + m_sink.add_character (left); const cppchar_t from_down_to_left = get_theme ().get_cppchar (text_art::theme::cell_kind::CFG_FROM_DOWN_TO_LEFT); - pp_unicode_character (&m_pp, from_down_to_left); - m_colorizer.set_normal_text (); - pp_newline (&m_pp); + m_sink.add_character (from_down_to_left); + end_line (); /* We now have a link line on the LHS, and no longer have one on the RHS. */ @@ -3196,14 +3664,13 @@ layout_printer::print_any_right_to_left_edge_lines () m_link_rhs_column = -1; } -layout_printer::layout_printer (pretty_printer &pp, - const layout &layout, - const rich_location &richloc, - diagnostic_t diagnostic_kind) -: m_pp (pp), +template<typename Sink> +layout_printer<Sink>::layout_printer (Sink &sink, + const layout &layout, + bool is_diagnostic_path) +: m_sink (sink), m_layout (layout), - m_colorizer (m_pp, richloc, diagnostic_kind), - m_is_diagnostic_path (diagnostic_kind == DK_DIAGNOSTIC_PATH), + m_is_diagnostic_path (is_diagnostic_path), m_link_lhs_state (link_lhs_state::none), m_link_rhs_column (-1) { @@ -3293,11 +3760,47 @@ diagnostic_context::maybe_show_locus (const rich_location &richloc, source_policy.print (pp, richloc, diagnostic_kind, effects); } +/* As above, but print in HTML form to XP. + If non-null, use LABEL_WRITER when writing labelled ranges. */ + +void +diagnostic_context::maybe_show_locus_as_html (const rich_location &richloc, + const diagnostic_source_printing_options &opts, + diagnostic_t diagnostic_kind, + xml::printer &xp, + diagnostic_source_effect_info *effects, + html_label_writer *label_writer) +{ + const location_t loc = richloc.get_loc (); + /* Do nothing if source-printing has been disabled. */ + if (!opts.enabled) + return; + + /* Don't attempt to print source for UNKNOWN_LOCATION and for builtins. */ + if (loc <= BUILTINS_LOCATION) + return; + + /* Don't print the same source location twice in a row, unless we have + fix-it hints, or multiple locations, or a label. */ + if (loc == m_last_location + && richloc.get_num_fixit_hints () == 0 + && richloc.get_num_locations () == 1 + && richloc.get_range (0)->m_label == NULL) + return; + + m_last_location = loc; + + diagnostic_source_print_policy source_policy (*this, opts); + source_policy.print_as_html (xp, richloc, diagnostic_kind, effects, + label_writer); +} + diagnostic_source_print_policy:: diagnostic_source_print_policy (const diagnostic_context &dc) : m_options (dc.m_source_printing), m_location_policy (dc), - m_start_span_cb (dc.m_text_callbacks.m_start_span), + m_text_start_span_cb (dc.m_text_callbacks.m_text_start_span), + m_html_start_span_cb (dc.m_text_callbacks.m_html_start_span), m_file_cache (dc.get_file_cache ()), m_diagram_theme (dc.get_diagram_theme ()), m_escape_format (dc.get_escape_format ()) @@ -3309,7 +3812,8 @@ diagnostic_source_print_policy (const diagnostic_context &dc, const diagnostic_source_printing_options &opts) : m_options (opts), m_location_policy (dc), - m_start_span_cb (dc.m_text_callbacks.m_start_span), + m_text_start_span_cb (dc.m_text_callbacks.m_text_start_span), + m_html_start_span_cb (dc.m_text_callbacks.m_html_start_span), m_file_cache (dc.get_file_cache ()), m_diagram_theme (dc.get_diagram_theme ()), m_escape_format (dc.get_escape_format ()) @@ -3329,15 +3833,36 @@ diagnostic_source_print_policy::print (pretty_printer &pp, const { layout layout (*this, richloc, effects); - layout_printer lp (pp, layout, richloc, diagnostic_kind); + colorizer col (pp, richloc, diagnostic_kind); + to_text sink (pp, col); + layout_printer<to_text> lp (sink, layout, + diagnostic_kind == DK_DIAGNOSTIC_PATH); lp.print (*this); } +/* As above, but print in HTML form to XP. + If non-null, use LABEL_WRITER when writing labelled ranges. */ + void -layout_printer::print (const diagnostic_source_print_policy &source_policy) +diagnostic_source_print_policy::print_as_html (xml::printer &xp, + const rich_location &richloc, + diagnostic_t diagnostic_kind, + diagnostic_source_effect_info *effects, + html_label_writer *label_writer) + const { - diagnostic_prefixing_rule_t saved_rule = pp_prefixing_rule (&m_pp); - pp_prefixing_rule (&m_pp) = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE; + layout layout (*this, richloc, effects); + to_html sink (xp, label_writer); + layout_printer<to_html> lp (sink, layout, + diagnostic_kind == DK_DIAGNOSTIC_PATH); + lp.print (*this); +} + +template <typename Sink> +void +layout_printer<Sink>::print (const diagnostic_source_print_policy &source_policy) +{ + m_sink.push_html_tag_with_class ("table", "locus", false); if (get_options ().show_ruler_p) show_ruler (m_layout.m_x_offset_display + get_options ().max_width); @@ -3362,27 +3887,65 @@ layout_printer::print (const diagnostic_source_print_policy &source_policy) = m_layout.get_expanded_location (line_span); const diagnostic_location_print_policy & loc_policy = source_policy.get_location_policy (); - source_policy.get_start_span_fn () (loc_policy, &m_pp, exploc); + m_sink.invoke_start_span_fn (source_policy, loc_policy, exploc); } } + + m_sink.push_html_tag_with_class ("tbody", "line-span", false); + /* Iterate over the lines within this span (using linenum_arith_t to avoid overflow with 0xffffffff causing an infinite loop). */ linenum_arith_t last_line = line_span->get_last_line (); for (linenum_arith_t row = line_span->get_first_line (); row <= last_line; row++) print_line (row); + + m_sink.pop_html_tag ("tbody"); } if (auto effect_info = m_layout.m_effect_info) effect_info->m_trailing_out_edge_column = m_link_rhs_column; - pp_prefixing_rule (&m_pp) = saved_rule; + m_sink.pop_html_tag ("table"); } #if CHECKING_P namespace selftest { +static std::unique_ptr<xml::node> +make_element_for_locus (const rich_location &rich_loc, + diagnostic_t kind, + diagnostic_context &dc) +{ + dc.m_last_location = UNKNOWN_LOCATION; + + xml::element wrapper ("wrapper", false); + xml::printer xp (wrapper); + dc.maybe_show_locus_as_html (rich_loc, + dc.m_source_printing, + kind, + xp, + nullptr, + nullptr); // label_writer + if (wrapper.m_children.size () > 0) + return std::move (wrapper.m_children[0]); + else + return nullptr; +} + +static label_text +make_raw_html_for_locus (const rich_location &rich_loc, + diagnostic_t kind, + diagnostic_context &dc) +{ + auto node = make_element_for_locus (rich_loc, kind, dc); + pretty_printer pp; + if (node) + node->write_as_xml (&pp, 0, true); + return label_text::take (xstrdup (pp_formatted_text (&pp))); +} + /* Selftests for diagnostic_show_locus. */ diagnostic_show_locus_fixture:: @@ -3600,7 +4163,10 @@ test_layout_x_offset_display_utf8 (const line_table_case &case_) linemap_position_for_column (line_table, emoji_col)); layout test_layout (policy, richloc, nullptr); - layout_printer lp (*dc.get_reference_printer (), test_layout, richloc, DK_ERROR); + colorizer col (*dc.get_reference_printer (), + richloc, DK_ERROR); + to_text sink (*dc.get_reference_printer (), col); + layout_printer<to_text> lp (sink, test_layout, false); lp.print (policy); ASSERT_STREQ (" | 1 \n" " | 1 \n" @@ -3627,7 +4193,10 @@ test_layout_x_offset_display_utf8 (const line_table_case &case_) linemap_position_for_column (line_table, emoji_col + 2)); layout test_layout (dc, richloc, nullptr); - layout_printer lp (*dc.get_reference_printer (), test_layout, richloc, DK_ERROR); + colorizer col (*dc.get_reference_printer (), + richloc, DK_ERROR); + to_text sink (*dc.get_reference_printer (), col); + layout_printer<to_text> lp (sink, test_layout, false); lp.print (policy); ASSERT_STREQ (" | 1 1 \n" " | 1 2 \n" @@ -3708,7 +4277,10 @@ test_layout_x_offset_display_tab (const line_table_case &case_) dc.m_tabstop = tabstop; diagnostic_source_print_policy policy (dc); layout test_layout (policy, richloc, nullptr); - layout_printer lp (*dc.get_reference_printer (), test_layout, richloc, DK_ERROR); + colorizer col (*dc.get_reference_printer (), + richloc, DK_ERROR); + to_text sink (*dc.get_reference_printer (), col); + layout_printer<to_text> lp (sink, test_layout, false); lp.print (policy); const char *out = pp_formatted_text (dc.get_reference_printer ()); ASSERT_EQ (NULL, strchr (out, '\t')); @@ -3733,7 +4305,10 @@ test_layout_x_offset_display_tab (const line_table_case &case_) dc.m_source_printing.show_line_numbers_p = true; diagnostic_source_print_policy policy (dc); layout test_layout (policy, richloc, nullptr); - layout_printer lp (*dc.get_reference_printer (), test_layout, richloc, DK_ERROR); + colorizer col (*dc.get_reference_printer (), + richloc, DK_ERROR); + to_text sink (*dc.get_reference_printer (), col); + layout_printer<to_text> lp (sink, test_layout, false); lp.print (policy); /* We have arranged things so that two columns will be printed before @@ -3814,6 +4389,32 @@ test_one_liner_caret_and_range () ASSERT_STREQ (" foo = bar.field;\n" " ~~~^~~~~~\n", dc.test_show_locus (richloc)); + + { + test_diagnostic_context dc; + auto out = make_raw_html_for_locus (richloc, DK_ERROR, dc); + ASSERT_STREQ + ("<table class=\"locus\">\n" + " <tbody class=\"line-span\">\n" + " <tr><td class=\"left-margin\"> </td><td class=\"source\">foo = bar.field;</td></tr>\n" + " <tr><td class=\"left-margin\"> </td><td class=\"annotation\"> ~~~^~~~~~</td></tr>\n" + " </tbody>\n" + "</table>\n", + out.get ()); + } + { + test_diagnostic_context dc; + dc.m_source_printing.show_line_numbers_p = true; + auto out = make_raw_html_for_locus (richloc, DK_ERROR, dc); + ASSERT_STREQ + ("<table class=\"locus\">\n" + " <tbody class=\"line-span\">\n" + " <tr><td class=\"linenum\"> 1</td><td class=\"left-margin\"> </td><td class=\"source\">foo = bar.field;</td></tr>\n" + " <tr><td class=\"linenum\"> </td><td class=\"left-margin\"> </td><td class=\"annotation\"> ~~~^~~~~~</td></tr>\n" + " </tbody>\n" + "</table>\n", + out.get ()); + } } /* Multiple ranges and carets. */ @@ -4231,6 +4832,24 @@ test_one_liner_labels () " | label 1\n" " label 0\n", dc.test_show_locus (richloc)); + + { + test_diagnostic_context dc; + dc.m_source_printing.show_line_numbers_p = true; + auto out = make_raw_html_for_locus (richloc, DK_ERROR, dc); + ASSERT_STREQ + ("<table class=\"locus\">\n" + " <tbody class=\"line-span\">\n" + " <tr><td class=\"linenum\"> 1</td><td class=\"left-margin\"> </td><td class=\"source\">foo = bar.field;</td></tr>\n" + " <tr><td class=\"linenum\"> </td><td class=\"left-margin\"> </td><td class=\"annotation\">^~~ ~~~ ~~~~~</td></tr>\n" + " <tr><td class=\"linenum\"> </td><td class=\"left-margin\"> </td><td class=\"annotation\">| | |</td></tr>\n" + " <tr><td class=\"linenum\"> </td><td class=\"left-margin\"> </td><td class=\"annotation\">| | label 2</td></tr>\n" + " <tr><td class=\"linenum\"> </td><td class=\"left-margin\"> </td><td class=\"annotation\">| label 1</td></tr>\n" + " <tr><td class=\"linenum\"> </td><td class=\"left-margin\"> </td><td class=\"annotation\">label 0</td></tr>\n" + " </tbody>\n" + "</table>\n", + out.get ()); + } } /* Example of boundary conditions: label 0 and 1 have just enough clearance, diff --git a/gcc/diagnostic.cc b/gcc/diagnostic.cc index b43fc90..20582b1 100644 --- a/gcc/diagnostic.cc +++ b/gcc/diagnostic.cc @@ -250,7 +250,10 @@ diagnostic_context::initialize (int n_opts) m_internal_error = nullptr; m_adjust_diagnostic_info = nullptr; m_text_callbacks.m_begin_diagnostic = default_diagnostic_text_starter; - m_text_callbacks.m_start_span = default_diagnostic_start_span_fn; + m_text_callbacks.m_text_start_span + = default_diagnostic_start_span_fn<to_text>; + m_text_callbacks.m_html_start_span + = default_diagnostic_start_span_fn<to_html>; m_text_callbacks.m_end_diagnostic = default_diagnostic_text_finalizer; m_option_mgr = nullptr; m_urlifier_stack = new auto_vec<urlifier_stack_node> (); @@ -1071,21 +1074,6 @@ logical_location_manager::function_p (key k) const } } -void -default_diagnostic_start_span_fn (const diagnostic_location_print_policy &loc_policy, - pretty_printer *pp, - expanded_location exploc) -{ - const diagnostic_column_policy &column_policy - = loc_policy.get_column_policy (); - label_text text - = column_policy.get_location_text (exploc, - loc_policy.show_column_p (), - pp_show_color (pp)); - pp_string (pp, text.get ()); - pp_newline (pp); -} - /* Interface to specify diagnostic kind overrides. Returns the previous setting, or DK_UNSPECIFIED if the parameters are out of range. If OPTION_ID is zero, the new setting is for all the diff --git a/gcc/diagnostic.h b/gcc/diagnostic.h index 00d7812..cdd6f26 100644 --- a/gcc/diagnostic.h +++ b/gcc/diagnostic.h @@ -31,6 +31,11 @@ namespace text_art class theme; } // namespace text_art +namespace xml +{ + class printer; +} // namespace xml + /* An enum for controlling what units to use for the column number when diagnostics are output, used by the -fdiagnostics-column-unit option. Tabs will be expanded or not according to the value of -ftabstop. The origin @@ -177,10 +182,15 @@ class diagnostic_source_print_policy; typedef void (*diagnostic_text_starter_fn) (diagnostic_text_output_format &, const diagnostic_info *); -typedef void -(*diagnostic_start_span_fn) (const diagnostic_location_print_policy &, - pretty_printer *, - expanded_location); +struct to_text; +struct to_html; + +extern pretty_printer *get_printer (to_text &); + +template <typename Sink> +using diagnostic_start_span_fn = void (*) (const diagnostic_location_print_policy &, + Sink &sink, + expanded_location); typedef void (*diagnostic_text_finalizer_fn) (diagnostic_text_output_format &, const diagnostic_info *, @@ -389,11 +399,32 @@ public: const diagnostic_column_policy & get_column_policy () const { return m_column_policy; } + void + print_text_span_start (const diagnostic_context &dc, + pretty_printer &pp, + const expanded_location &exploc); + + void + print_html_span_start (const diagnostic_context &dc, + xml::printer &xp, + const expanded_location &exploc); + private: diagnostic_column_policy m_column_policy; bool m_show_column; }; +/* Abstract base class for optionally supplying extra tags when writing + out annotation labels in HTML output. */ + +class html_label_writer +{ +public: + virtual ~html_label_writer () {} + virtual void begin_label () = 0; + virtual void end_label () = 0; +}; + /* A bundle of state for printing source within a diagnostic, to isolate the interactions between diagnostic_context and the implementation of diagnostic_show_locus. */ @@ -411,11 +442,21 @@ public: diagnostic_t diagnostic_kind, diagnostic_source_effect_info *effect_info) const; + void + print_as_html (xml::printer &xp, + const rich_location &richloc, + diagnostic_t diagnostic_kind, + diagnostic_source_effect_info *effect_info, + html_label_writer *label_writer) const; + const diagnostic_source_printing_options & get_options () const { return m_options; } - diagnostic_start_span_fn - get_start_span_fn () const { return m_start_span_cb; } + diagnostic_start_span_fn<to_text> + get_text_start_span_fn () const { return m_text_start_span_cb; } + + diagnostic_start_span_fn<to_html> + get_html_start_span_fn () const { return m_html_start_span_cb; } file_cache & get_file_cache () const { return m_file_cache; } @@ -442,7 +483,8 @@ public: private: const diagnostic_source_printing_options &m_options; class diagnostic_location_print_policy m_location_policy; - diagnostic_start_span_fn m_start_span_cb; + diagnostic_start_span_fn<to_text> m_text_start_span_cb; + diagnostic_start_span_fn<to_html> m_html_start_span_cb; file_cache &m_file_cache; /* Other data copied from diagnostic_context. */ @@ -508,7 +550,7 @@ public: /* Give access to m_text_callbacks. */ friend diagnostic_text_starter_fn & diagnostic_text_starter (diagnostic_context *context); - friend diagnostic_start_span_fn & + friend diagnostic_start_span_fn<to_text> & diagnostic_start_span (diagnostic_context *context); friend diagnostic_text_finalizer_fn & diagnostic_text_finalizer (diagnostic_context *context); @@ -602,6 +644,12 @@ public: diagnostic_t diagnostic_kind, pretty_printer &pp, diagnostic_source_effect_info *effect_info); + void maybe_show_locus_as_html (const rich_location &richloc, + const diagnostic_source_printing_options &opts, + diagnostic_t diagnostic_kind, + xml::printer &xp, + diagnostic_source_effect_info *effect_info, + html_label_writer *label_writer); void emit_diagram (const diagnostic_diagram &diagram); @@ -882,7 +930,8 @@ private: /* This function is called by diagnostic_show_locus in between disjoint spans of source code, so that the context can print something to indicate that a new span of source code has begun. */ - diagnostic_start_span_fn m_start_span; + diagnostic_start_span_fn<to_text> m_text_start_span; + diagnostic_start_span_fn<to_html> m_html_start_span; /* This function is called after the diagnostic message is printed. */ diagnostic_text_finalizer_fn m_end_diagnostic; @@ -1040,10 +1089,10 @@ diagnostic_text_starter (diagnostic_context *context) /* Client supplied function called between disjoint spans of source code, so that the context can print something to indicate that a new span of source code has begun. */ -inline diagnostic_start_span_fn & +inline diagnostic_start_span_fn<to_text> & diagnostic_start_span (diagnostic_context *context) { - return context->m_text_callbacks.m_start_span; + return context->m_text_callbacks.m_text_start_span; } /* Client supplied function called after a diagnostic message is @@ -1128,6 +1177,21 @@ diagnostic_show_locus (diagnostic_context *context, context->maybe_show_locus (*richloc, opts, diagnostic_kind, *pp, effect_info); } +inline void +diagnostic_show_locus_as_html (diagnostic_context *context, + const diagnostic_source_printing_options &opts, + rich_location *richloc, + diagnostic_t diagnostic_kind, + xml::printer &xp, + diagnostic_source_effect_info *effect_info = nullptr, + html_label_writer *label_writer = nullptr) +{ + gcc_assert (context); + gcc_assert (richloc); + context->maybe_show_locus_as_html (*richloc, opts, diagnostic_kind, xp, + effect_info, label_writer); +} + /* Because we read source files a second time after the frontend did it the first time, we need to know how the frontend handled things like character set conversion and UTF-8 BOM stripping, in order to make everything @@ -1201,8 +1265,9 @@ extern void diagnostic_set_info_translated (diagnostic_info *, const char *, #endif void default_diagnostic_text_starter (diagnostic_text_output_format &, const diagnostic_info *); +template <typename Sink> void default_diagnostic_start_span_fn (const diagnostic_location_print_policy &, - pretty_printer *, + Sink &sink, expanded_location); void default_diagnostic_text_finalizer (diagnostic_text_output_format &, const diagnostic_info *, diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 442fce6..fe22d34 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -31,6 +31,7 @@ extensions, accepted by GCC in C90 mode and in C++. * Thread-Local:: Per-thread variables. * OpenMP:: Multiprocessing extensions. * OpenACC:: Extensions for offloading code to accelerator devices. +* _Countof:: The number of elements of arrays. * Inline:: Defining inline functions (as fast as macros). * Volatiles:: What constitutes an access to a volatile object. * Using Assembly Language with C:: Instructions and extensions for interfacing C with assembler. @@ -7323,7 +7324,7 @@ truncate the copy without appending the terminating @code{NUL} character. Using the attribute makes it possible to suppress the warning. However, when the array is declared with the attribute the call to @code{strlen} is diagnosed because when the array doesn't contain a @code{NUL}-terminated -string the call is undefined. To copy, compare, of search non-string +string the call is undefined. To copy, compare, or search non-string character arrays use the @code{memcpy}, @code{memcmp}, @code{memchr}, and other functions that operate on arrays of bytes. In addition, calling @code{strnlen} and @code{strndup} with such arrays is safe @@ -10693,6 +10694,36 @@ library. @xref{OpenMP and OpenACC Options}, for additional options useful with @option{-fopenacc}. +@node _Countof +@section Determining the Number of Elements of Arrays +@cindex _Countof +@cindex number of elements + +The keyword @code{_Countof} determines +the number of elements of an array operand. +Its syntax is similar to @code{sizeof}. +The operand must be +a parenthesized complete array type name +or an expression of such a type. +For example: + +@smallexample +int a[n]; +_Countof (a); // returns n +_Countof (int [7][3]); // returns 7 +@end smallexample + +The result of this operator is an integer constant expression, +unless the array has a variable number of elements. +The operand is only evaluated +if the array has a variable number of elements. +For example: + +@smallexample +_Countof (int [7][n++]); // integer constant expression +_Countof (int [n++][7]); // run-time value; n++ is evaluated +@end smallexample + @node Inline @section An Inline Function is As Fast As a Macro @cindex inline functions diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index fe47ce5..0150ad0 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -3297,6 +3297,50 @@ Enable support for the C++ coroutines extension (experimental). Permit the C++ front end to note all candidates during overload resolution failure, including when a deleted function is selected. +@item -fdump-lang- +@itemx -fdump-lang-@var{switch} +@itemx -fdump-lang-@var{switch}-@var{options} +@itemx -fdump-lang-@var{switch}-@var{options}=@var{filename} +Control the dumping of C++-specific information. The @var{options} +and @var{filename} portions behave as described in the +@option{-fdump-tree} option. The following @var{switch} values are +accepted: + +@table @samp +@item all +Enable all of the below. + +@opindex fdump-lang-class +@item class +Dump class hierarchy information. Virtual table information is emitted +unless '@option{slim}' is specified. + +@opindex fdump-lang-module +@item module +Dump module information. Options @option{lineno} (locations), +@option{graph} (reachability), @option{blocks} (clusters), +@option{uid} (serialization), @option{alias} (mergeable), +@option{asmname} (Elrond), @option{eh} (mapper) & @option{vops} +(macros) may provide additional information. + +@opindex fdump-lang-raw +@item raw +Dump the raw internal tree data. + +@opindex fdump-lang-tinst +@item tinst +Dump the sequence of template instantiations, indented to show the +depth of recursion. The @option{lineno} option adds the source +location where the instantiation was triggered, and the +@option{details} option also dumps pre-instantiation substitutions +such as those performed during template argument deduction. + +Lines in the .tinst dump start with @samp{I} for an instantiation, +@samp{S} for another substitution, and @samp{R[IS]} for the reopened +context of a deferred instantiation. + +@end table + @opindex fno-elide-constructors @opindex felide-constructors @item -fno-elide-constructors @@ -6075,18 +6119,25 @@ in this release. @item experimental-html Emit diagnostics to a file in HTML format. This scheme is experimental, -and may go away in future GCC releases. The details of the output are -also subject to change. +and may go away in future GCC releases. The keys and details of the output +are also subject to change. Supported keys are: @table @gcctabopt +@item css=@r{[}yes@r{|}no@r{]} +Add an embedded <style> to the generated HTML. Defaults to yes. + @item file=@var{FILENAME} Specify the filename to write the HTML output to, potentially with a leading absolute or relative path. If not specified, it defaults to @file{@var{source}.html}. +@item javascript=@r{[}yes@r{|}no@r{]} +Add an embedded <script> to the generated HTML providing a barebones UI +for viewing results. Defaults to yes. + @end table @end table @@ -20891,30 +20942,10 @@ Dump language-specific information. The file name is made by appending @itemx -fdump-lang-@var{switch}-@var{options}=@var{filename} Control the dumping of language-specific information. The @var{options} and @var{filename} portions behave as described in the -@option{-fdump-tree} option. The following @var{switch} values are -accepted: - -@table @samp -@item all - -Enable all language-specific dumps. - -@item class -Dump class hierarchy information. Virtual table information is emitted -unless '@option{slim}' is specified. This option is applicable to C++ only. - -@item module -Dump module information. Options @option{lineno} (locations), -@option{graph} (reachability), @option{blocks} (clusters), -@option{uid} (serialization), @option{alias} (mergeable), -@option{asmname} (Elrond), @option{eh} (mapper) & @option{vops} -(macros) may provide additional information. This option is -applicable to C++ only. - -@item raw -Dump the raw internal tree data. This option is applicable to C++ only. - -@end table +@option{-fdump-tree} option. @option{-fdump-tree-all} enables all +language-specific dumps; other options vary with the language. For +instance, see @xref{C++ Dialect Options} for the @option{-fdump-lang} +flags supported by the C++ front-end. @opindex fdump-passes @item -fdump-passes diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc index 5f48ced..014f421 100644 --- a/gcc/fold-const.cc +++ b/gcc/fold-const.cc @@ -5085,6 +5085,11 @@ simple_operand_p (const_tree exp) #pragma weak, etc). */ && ! TREE_PUBLIC (exp) && ! DECL_EXTERNAL (exp) + /* DECL_VALUE_EXPR will expand to something non-simple. */ + && ! ((VAR_P (exp) + || TREE_CODE (exp) == PARM_DECL + || TREE_CODE (exp) == RESULT_DECL) + && DECL_HAS_VALUE_EXPR_P (exp)) /* Weakrefs are not safe to be read, since they can be NULL. They are !TREE_PUBLIC && !DECL_EXTERNAL but still have DECL_WEAK flag set. */ diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index f0d4e2c..3496d06 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,72 @@ +2025-05-28 Tobias Burnus <tburnus@baylibre.com> + + PR fortran/113152 + * simplify.cc (gfc_simplify_cospi, gfc_simplify_sinpi): Avoid using + mpfr_fmod_ui in the MPFR < 4.2.0 version. + +2025-05-28 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + PR fortran/119856 + * io.cc: Set missing comma error checks to STD_STD_LEGACY. + +2025-05-28 Yuao Ma <c8ef@outlook.com> + Steven G. Kargl <kargl@gcc.gnu.org> + + PR fortran/113152 + * gfortran.h (enum gfc_isym_id): Add new enum. + * intrinsic.cc (add_functions): Register new intrinsics. Changing the call + from gfc_resolve_trigd{,2} to gfc_resolve_trig{,2}. + * intrinsic.h (gfc_simplify_acospi, gfc_simplify_asinpi, + gfc_simplify_asinpi, gfc_simplify_atanpi, gfc_simplify_atan2pi, + gfc_simplify_cospi, gfc_simplify_sinpi, gfc_simplify_tanpi): New. + (gfc_resolve_trig): Rename from gfc_resolve_trigd. + (gfc_resolve_trig2): Rename from gfc_resolve_trigd2. + * iresolve.cc (gfc_resolve_trig): Rename from gfc_resolve_trigd. + (gfc_resolve_trig2): Rename from gfc_resolve_trigd2. + * mathbuiltins.def: Add 7 new math builtins and re-align. + * simplify.cc (gfc_simplify_acos, gfc_simplify_asin, + gfc_simplify_acosd, gfc_simplify_asind): Revise error message. + (gfc_simplify_acospi, gfc_simplify_asinpi, + gfc_simplify_asinpi, gfc_simplify_atanpi, gfc_simplify_atan2pi, + gfc_simplify_cospi, gfc_simplify_sinpi, gfc_simplify_tanpi): New. + +2025-05-27 Harald Anlauf <anlauf@gmx.de> + + PR fortran/101735 + * primary.cc (gfc_match_varspec): Correct order of logic. + +2025-05-27 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + PR fortran/120049 + * check.cc (gfc_check_c_associated): Use new helper functions. + Only call check_c_ptr_1 if optional c_ptr_2 tests succeed. + (check_c_ptr_1): Handle only c_ptr_1 checks. + (check_c_ptr_2): Expand checks for c_ptr_2 and handle cases + where there is no derived pointer in the gfc_expr and check + the inmod_sym_id only if it exists. + * misc.cc (gfc_typename): Handle the case for BT_VOID rather + than throw an internal error. + +2025-05-27 Harald Anlauf <anlauf@gmx.de> + + PR fortran/101735 + * expr.cc (find_inquiry_ref): If an inquiry reference applies to + a substring, use that, and calculate substring length if needed. + * primary.cc (extend_ref): Also handle attaching to end of + reference chain for appending. + (gfc_match_varspec): Discrimate between arrays of character and + substrings of them. If a substring is taken from a character + component of a derived type, get the proper typespec so that + inquiry references work correctly. + (gfc_match_rvalue): Handle corner case where we hit a seemingly + dangling '%' and missed an inquiry reference. Try another match. + +2025-05-27 David Malcolm <dmalcolm@redhat.com> + + PR other/116792 + * error.cc (gfc_diagnostic_start_span): Update for diagnostic.h + changes. + 2025-05-19 Harald Anlauf <anlauf@gmx.de> PR fortran/120099 diff --git a/gcc/fortran/check.cc b/gcc/fortran/check.cc index f02a2a3..c693e42 100644 --- a/gcc/fortran/check.cc +++ b/gcc/fortran/check.cc @@ -5952,49 +5952,110 @@ gfc_check_c_sizeof (gfc_expr *arg) } -bool -gfc_check_c_associated (gfc_expr *c_ptr_1, gfc_expr *c_ptr_2) +/* Helper functions check_c_ptr_1 and check_c_ptr_2 + used in gfc_check_c_associated. */ + +static inline +bool check_c_ptr_1 (gfc_expr *c_ptr_1) { - if (c_ptr_1) - { - if (c_ptr_1->expr_type == EXPR_FUNCTION && c_ptr_1->ts.type == BT_VOID) - return true; + if ((c_ptr_1->ts.type == BT_VOID) + && (c_ptr_1->expr_type == EXPR_FUNCTION)) + return true; - if (c_ptr_1->ts.type != BT_DERIVED - || c_ptr_1->ts.u.derived->from_intmod != INTMOD_ISO_C_BINDING - || (c_ptr_1->ts.u.derived->intmod_sym_id != ISOCBINDING_PTR - && c_ptr_1->ts.u.derived->intmod_sym_id != ISOCBINDING_FUNPTR)) - { - gfc_error ("Argument C_PTR_1 at %L to C_ASSOCIATED shall have the " - "type TYPE(C_PTR) or TYPE(C_FUNPTR)", &c_ptr_1->where); - return false; - } - } + if (c_ptr_1->ts.type != BT_DERIVED + || c_ptr_1->ts.u.derived->from_intmod != INTMOD_ISO_C_BINDING + || (c_ptr_1->ts.u.derived->intmod_sym_id != ISOCBINDING_PTR + && c_ptr_1->ts.u.derived->intmod_sym_id != ISOCBINDING_FUNPTR)) + goto check_1_error; - if (!scalar_check (c_ptr_1, 0)) + if ((c_ptr_1->ts.type == BT_DERIVED) + && (c_ptr_1->expr_type == EXPR_STRUCTURE) + && (c_ptr_1->ts.u.derived->intmod_sym_id + == ISOCBINDING_NULL_FUNPTR)) + goto check_1_error; + + if (scalar_check (c_ptr_1, 0)) + return true; + else + /* Return since the check_1_error message may not apply here. */ return false; - if (c_ptr_2) - { - if (c_ptr_2->expr_type == EXPR_FUNCTION && c_ptr_2->ts.type == BT_VOID) - return true; +check_1_error: - if (c_ptr_2->ts.type != BT_DERIVED - || c_ptr_2->ts.u.derived->from_intmod != INTMOD_ISO_C_BINDING - || (c_ptr_1->ts.u.derived->intmod_sym_id - != c_ptr_2->ts.u.derived->intmod_sym_id)) + gfc_error ("Argument C_PTR_1 at %L to C_ASSOCIATED shall have the " + "type TYPE(C_PTR) or TYPE(C_FUNPTR)", &c_ptr_1->where); + return false; +} + +static inline +bool check_c_ptr_2 (gfc_expr *c_ptr_1, gfc_expr *c_ptr_2) +{ + switch (c_ptr_2->ts.type) + { + case BT_VOID: + if (c_ptr_2->expr_type == EXPR_FUNCTION) { - gfc_error ("Argument C_PTR_2 at %L to C_ASSOCIATED shall have the " - "same type as C_PTR_1: %s instead of %s", &c_ptr_1->where, - gfc_typename (&c_ptr_1->ts), gfc_typename (&c_ptr_2->ts)); - return false; + if ((c_ptr_1->ts.type == BT_DERIVED) + && c_ptr_1->expr_type == EXPR_STRUCTURE + && (c_ptr_1->ts.u.derived->intmod_sym_id + == ISOCBINDING_FUNPTR)) + goto check_2_error; } - } + break; + + case BT_DERIVED: + if ((c_ptr_2->expr_type == EXPR_STRUCTURE) + && (c_ptr_2->ts.u.derived->intmod_sym_id == ISOCBINDING_PTR) + && (c_ptr_1->ts.type == BT_VOID) + && (c_ptr_1->expr_type == EXPR_FUNCTION)) + return scalar_check (c_ptr_2, 1); - if (c_ptr_2 && !scalar_check (c_ptr_2, 1)) + if ((c_ptr_2->expr_type == EXPR_STRUCTURE) + && (c_ptr_1->ts.type == BT_VOID) + && (c_ptr_1->expr_type == EXPR_FUNCTION)) + goto check_2_error; + + if (c_ptr_2->ts.u.derived->from_intmod != INTMOD_ISO_C_BINDING) + goto check_2_error; + + if (c_ptr_1->ts.type == BT_DERIVED + && (c_ptr_1->ts.u.derived->intmod_sym_id + != c_ptr_2->ts.u.derived->intmod_sym_id)) + goto check_2_error; + break; + + default: + goto check_2_error; + } + + if (scalar_check (c_ptr_2, 1)) + return true; + else + /* Return since the check_2_error message may not apply here. */ return false; - return true; +check_2_error: + + gfc_error ("Argument C_PTR_2 at %L to C_ASSOCIATED shall have the " + "same type as C_PTR_1: %s instead of %s", &c_ptr_2->where, + gfc_typename (&c_ptr_1->ts), gfc_typename (&c_ptr_2->ts)); + + return false; + } + + +bool +gfc_check_c_associated (gfc_expr *c_ptr_1, gfc_expr *c_ptr_2) +{ + if (c_ptr_2) + { + if (check_c_ptr_2 (c_ptr_1, c_ptr_2)) + return check_c_ptr_1 (c_ptr_1); + else + return false; + } + else + return check_c_ptr_1 (c_ptr_1); } diff --git a/gcc/fortran/error.cc b/gcc/fortran/error.cc index f89d41d..004a4b2 100644 --- a/gcc/fortran/error.cc +++ b/gcc/fortran/error.cc @@ -618,9 +618,10 @@ gfc_diagnostic_text_starter (diagnostic_text_output_format &text_output, static void gfc_diagnostic_start_span (const diagnostic_location_print_policy &loc_policy, - pretty_printer *pp, + to_text &sink, expanded_location exploc) { + pretty_printer *pp = get_printer (sink); const bool colorize = pp_show_color (pp); char *locus_prefix = gfc_diagnostic_build_locus_prefix (loc_policy, exploc, colorize); diff --git a/gcc/fortran/expr.cc b/gcc/fortran/expr.cc index 92a9ebd..bf858ea 100644 --- a/gcc/fortran/expr.cc +++ b/gcc/fortran/expr.cc @@ -1846,6 +1846,7 @@ find_inquiry_ref (gfc_expr *p, gfc_expr **newp) gfc_ref *ref; gfc_ref *inquiry = NULL; gfc_ref *inquiry_head; + gfc_ref *ref_ss = NULL; gfc_expr *tmp; tmp = gfc_copy_expr (p); @@ -1862,6 +1863,9 @@ find_inquiry_ref (gfc_expr *p, gfc_expr **newp) { inquiry = ref->next; ref->next = NULL; + if (ref->type == REF_SUBSTRING) + ref_ss = ref; + break; } } @@ -1891,6 +1895,28 @@ find_inquiry_ref (gfc_expr *p, gfc_expr **newp) if (!gfc_notify_std (GFC_STD_F2003, "LEN part_ref at %C")) goto cleanup; + /* Inquire length of substring? */ + if (ref_ss) + { + if (ref_ss->u.ss.start->expr_type == EXPR_CONSTANT + && ref_ss->u.ss.end->expr_type == EXPR_CONSTANT) + { + HOST_WIDE_INT istart, iend, length; + istart = gfc_mpz_get_hwi (ref_ss->u.ss.start->value.integer); + iend = gfc_mpz_get_hwi (ref_ss->u.ss.end->value.integer); + + if (istart <= iend) + length = iend - istart + 1; + else + length = 0; + *newp = gfc_get_int_expr (gfc_default_integer_kind, + NULL, length); + break; + } + else + goto cleanup; + } + if (tmp->ts.u.cl->length && tmp->ts.u.cl->length->expr_type == EXPR_CONSTANT) *newp = gfc_copy_expr (tmp->ts.u.cl->length); diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index 4740c36..e461aa6 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -721,6 +721,14 @@ enum gfc_isym_id remains compatible. */ GFC_ISYM_SU_KIND, GFC_ISYM_UINT, + + GFC_ISYM_ACOSPI, + GFC_ISYM_ASINPI, + GFC_ISYM_ATANPI, + GFC_ISYM_ATAN2PI, + GFC_ISYM_COSPI, + GFC_ISYM_SINPI, + GFC_ISYM_TANPI, }; enum init_local_logical diff --git a/gcc/fortran/intrinsic.cc b/gcc/fortran/intrinsic.cc index 908e1da..9e07627 100644 --- a/gcc/fortran/intrinsic.cc +++ b/gcc/fortran/intrinsic.cc @@ -3452,37 +3452,37 @@ add_functions (void) add_sym_1 ("acosd", GFC_ISYM_ACOSD, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F2023, - gfc_check_fn_r, gfc_simplify_acosd, gfc_resolve_trigd, + gfc_check_fn_r, gfc_simplify_acosd, gfc_resolve_trig, x, BT_REAL, dr, REQUIRED); make_generic ("acosd", GFC_ISYM_ACOSD, GFC_STD_F2023); add_sym_1 ("dacosd", GFC_ISYM_ACOSD, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU, - gfc_check_fn_d, gfc_simplify_acosd, gfc_resolve_trigd, + gfc_check_fn_d, gfc_simplify_acosd, gfc_resolve_trig, x, BT_REAL, dd, REQUIRED); add_sym_1 ("asind", GFC_ISYM_ASIND, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F2023, - gfc_check_fn_r, gfc_simplify_asind, gfc_resolve_trigd, + gfc_check_fn_r, gfc_simplify_asind, gfc_resolve_trig, x, BT_REAL, dr, REQUIRED); make_generic ("asind", GFC_ISYM_ASIND, GFC_STD_F2023); add_sym_1 ("dasind", GFC_ISYM_ASIND, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU, - gfc_check_fn_d, gfc_simplify_asind, gfc_resolve_trigd, + gfc_check_fn_d, gfc_simplify_asind, gfc_resolve_trig, x, BT_REAL, dd, REQUIRED); add_sym_1 ("atand", GFC_ISYM_ATAND, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F2023, - gfc_check_fn_r, gfc_simplify_atand, gfc_resolve_trigd, + gfc_check_fn_r, gfc_simplify_atand, gfc_resolve_trig, x, BT_REAL, dr, REQUIRED); /* Two-argument version of atand, equivalent to atan2d. */ add_sym_2 ("atand", GFC_ISYM_ATAN2D, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F2023, - gfc_check_atan2, gfc_simplify_atan2d, gfc_resolve_trigd2, + gfc_check_atan2, gfc_simplify_atan2d, gfc_resolve_trig2, y, BT_REAL, dr, REQUIRED, x, BT_REAL, dr, REQUIRED); @@ -3490,12 +3490,12 @@ add_functions (void) add_sym_1 ("datand", GFC_ISYM_ATAND, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU, - gfc_check_fn_d, gfc_simplify_atand, gfc_resolve_trigd, + gfc_check_fn_d, gfc_simplify_atand, gfc_resolve_trig, x, BT_REAL, dd, REQUIRED); add_sym_2 ("atan2d", GFC_ISYM_ATAN2D, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F2023, - gfc_check_atan2, gfc_simplify_atan2d, gfc_resolve_trigd2, + gfc_check_atan2, gfc_simplify_atan2d, gfc_resolve_trig2, y, BT_REAL, dr, REQUIRED, x, BT_REAL, dr, REQUIRED); @@ -3503,78 +3503,78 @@ add_functions (void) add_sym_2 ("datan2d", GFC_ISYM_ATAN2D, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU, - gfc_check_datan2, gfc_simplify_atan2d, gfc_resolve_trigd2, + gfc_check_datan2, gfc_simplify_atan2d, gfc_resolve_trig2, y, BT_REAL, dd, REQUIRED, x, BT_REAL, dd, REQUIRED); add_sym_1 ("cosd", GFC_ISYM_COSD, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F2023, - gfc_check_fn_r, gfc_simplify_cosd, gfc_resolve_trigd, + gfc_check_fn_r, gfc_simplify_cosd, gfc_resolve_trig, x, BT_REAL, dr, REQUIRED); make_generic ("cosd", GFC_ISYM_COSD, GFC_STD_F2023); add_sym_1 ("dcosd", GFC_ISYM_COSD, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU, - gfc_check_fn_d, gfc_simplify_cosd, gfc_resolve_trigd, + gfc_check_fn_d, gfc_simplify_cosd, gfc_resolve_trig, x, BT_REAL, dd, REQUIRED); add_sym_1 ("cotan", GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_GNU, - gfc_check_fn_rc2008, gfc_simplify_cotan, gfc_resolve_trigd, + gfc_check_fn_rc2008, gfc_simplify_cotan, gfc_resolve_trig, x, BT_REAL, dr, REQUIRED); add_sym_1 ("dcotan", GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU, - gfc_check_fn_d, gfc_simplify_cotan, gfc_resolve_trigd, + gfc_check_fn_d, gfc_simplify_cotan, gfc_resolve_trig, x, BT_REAL, dd, REQUIRED); add_sym_1 ("ccotan", GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_GNU, - NULL, gfc_simplify_cotan, gfc_resolve_trigd, + NULL, gfc_simplify_cotan, gfc_resolve_trig, x, BT_COMPLEX, dz, REQUIRED); add_sym_1 ("zcotan", GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU, - NULL, gfc_simplify_cotan, gfc_resolve_trigd, + NULL, gfc_simplify_cotan, gfc_resolve_trig, x, BT_COMPLEX, dd, REQUIRED); make_generic ("cotan", GFC_ISYM_COTAN, GFC_STD_GNU); add_sym_1 ("cotand", GFC_ISYM_COTAND, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_GNU, - gfc_check_fn_r, gfc_simplify_cotand, gfc_resolve_trigd, + gfc_check_fn_r, gfc_simplify_cotand, gfc_resolve_trig, x, BT_REAL, dr, REQUIRED); add_sym_1 ("dcotand", GFC_ISYM_COTAND, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU, - gfc_check_fn_d, gfc_simplify_cotand, gfc_resolve_trigd, + gfc_check_fn_d, gfc_simplify_cotand, gfc_resolve_trig, x, BT_REAL, dd, REQUIRED); make_generic ("cotand", GFC_ISYM_COTAND, GFC_STD_GNU); add_sym_1 ("sind", GFC_ISYM_SIND, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F2023, - gfc_check_fn_r, gfc_simplify_sind, gfc_resolve_trigd, + gfc_check_fn_r, gfc_simplify_sind, gfc_resolve_trig, x, BT_REAL, dr, REQUIRED); make_generic ("sind", GFC_ISYM_SIND, GFC_STD_F2023); add_sym_1 ("dsind", GFC_ISYM_SIND, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU, - gfc_check_fn_d, gfc_simplify_sind, gfc_resolve_trigd, + gfc_check_fn_d, gfc_simplify_sind, gfc_resolve_trig, x, BT_REAL, dd, REQUIRED); add_sym_1 ("tand", GFC_ISYM_TAND, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F2023, - gfc_check_fn_r, gfc_simplify_tand, gfc_resolve_trigd, + gfc_check_fn_r, gfc_simplify_tand, gfc_resolve_trig, x, BT_REAL, dr, REQUIRED); make_generic ("tand", GFC_ISYM_TAND, GFC_STD_F2023); add_sym_1 ("dtand", GFC_ISYM_TAND, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU, - gfc_check_fn_d, gfc_simplify_tand, gfc_resolve_trigd, + gfc_check_fn_d, gfc_simplify_tand, gfc_resolve_trig, x, BT_REAL, dd, REQUIRED); /* The following function is internally used for coarray libray functions. @@ -3590,6 +3590,57 @@ add_functions (void) REQUIRED, val, BT_INTEGER, di, REQUIRED, i, BT_INTEGER, di, REQUIRED); make_from_module (); + + /* The half-cycle trigonometric functions were added by Fortran 2023. */ + + add_sym_1 ("acospi", GFC_ISYM_ACOSPI, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, + GFC_STD_F2023, gfc_check_fn_r, gfc_simplify_acospi, + gfc_resolve_trig, x, BT_REAL, dr, REQUIRED); + + make_generic ("acospi", GFC_ISYM_ACOSPI, GFC_STD_F2023); + + add_sym_1 ("asinpi", GFC_ISYM_ASINPI, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, + GFC_STD_F2023, gfc_check_fn_r, gfc_simplify_asinpi, + gfc_resolve_trig, x, BT_REAL, dr, REQUIRED); + + make_generic ("asinpi", GFC_ISYM_ASINPI, GFC_STD_F2023); + + add_sym_1 ("atanpi", GFC_ISYM_ATANPI, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, + GFC_STD_F2023, gfc_check_fn_r, gfc_simplify_atanpi, + gfc_resolve_trig, x, BT_REAL, dr, REQUIRED); + + /* Two-argument version of atanpi, equivalent to atan2pi. */ + add_sym_2 ("atanpi", GFC_ISYM_ATAN2PI, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, + dr, GFC_STD_F2023, gfc_check_atan2, gfc_simplify_atan2pi, + gfc_resolve_trig2, y, BT_REAL, dr, REQUIRED, x, BT_REAL, dr, + REQUIRED); + + make_generic ("atanpi", GFC_ISYM_ATANPI, GFC_STD_F2023); + + add_sym_2 ("atan2pi", GFC_ISYM_ATAN2PI, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, + dr, GFC_STD_F2023, gfc_check_atan2, gfc_simplify_atan2pi, + gfc_resolve_trig2, y, BT_REAL, dr, REQUIRED, x, BT_REAL, dr, + REQUIRED); + + make_generic ("atan2pi", GFC_ISYM_ATAN2PI, GFC_STD_F2023); + + add_sym_1 ("cospi", GFC_ISYM_COSPI, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, + GFC_STD_F2023, gfc_check_fn_r, gfc_simplify_cospi, + gfc_resolve_trig, x, BT_REAL, dr, REQUIRED); + + make_generic ("cospi", GFC_ISYM_COSPI, GFC_STD_F2023); + + add_sym_1 ("sinpi", GFC_ISYM_SINPI, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, + GFC_STD_F2023, gfc_check_fn_r, gfc_simplify_sinpi, + gfc_resolve_trig, x, BT_REAL, dr, REQUIRED); + + make_generic ("sinpi", GFC_ISYM_SINPI, GFC_STD_F2023); + + add_sym_1 ("tanpi", GFC_ISYM_TANPI, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, + GFC_STD_F2023, gfc_check_fn_r, gfc_simplify_tanpi, + gfc_resolve_trig, x, BT_REAL, dr, REQUIRED); + + make_generic ("tanpi", GFC_ISYM_TANPI, GFC_STD_F2023); } diff --git a/gcc/fortran/intrinsic.h b/gcc/fortran/intrinsic.h index 767792c..fd54588 100644 --- a/gcc/fortran/intrinsic.h +++ b/gcc/fortran/intrinsic.h @@ -246,6 +246,7 @@ gfc_expr *gfc_simplify_achar (gfc_expr *, gfc_expr *); gfc_expr *gfc_simplify_acos (gfc_expr *); gfc_expr *gfc_simplify_acosd (gfc_expr *); gfc_expr *gfc_simplify_acosh (gfc_expr *); +gfc_expr *gfc_simplify_acospi (gfc_expr *); gfc_expr *gfc_simplify_adjustl (gfc_expr *); gfc_expr *gfc_simplify_adjustr (gfc_expr *); gfc_expr *gfc_simplify_aimag (gfc_expr *); @@ -259,11 +260,14 @@ gfc_expr *gfc_simplify_and (gfc_expr *, gfc_expr *); gfc_expr *gfc_simplify_any (gfc_expr *, gfc_expr *); gfc_expr *gfc_simplify_asin (gfc_expr *); gfc_expr *gfc_simplify_asinh (gfc_expr *); +gfc_expr *gfc_simplify_asinpi (gfc_expr *); gfc_expr *gfc_simplify_atan (gfc_expr *); gfc_expr *gfc_simplify_atand (gfc_expr *); gfc_expr *gfc_simplify_atanh (gfc_expr *); +gfc_expr *gfc_simplify_atanpi (gfc_expr *); gfc_expr *gfc_simplify_atan2 (gfc_expr *, gfc_expr *); gfc_expr *gfc_simplify_atan2d (gfc_expr *, gfc_expr *); +gfc_expr *gfc_simplify_atan2pi (gfc_expr *, gfc_expr *); gfc_expr *gfc_simplify_bessel_j0 (gfc_expr *); gfc_expr *gfc_simplify_bessel_j1 (gfc_expr *); gfc_expr *gfc_simplify_bessel_jn (gfc_expr *, gfc_expr *); @@ -288,6 +292,7 @@ gfc_expr *gfc_simplify_conjg (gfc_expr *); gfc_expr *gfc_simplify_cos (gfc_expr *); gfc_expr *gfc_simplify_cosd (gfc_expr *); gfc_expr *gfc_simplify_cosh (gfc_expr *); +gfc_expr *gfc_simplify_cospi (gfc_expr *); gfc_expr *gfc_simplify_cotan (gfc_expr *); gfc_expr *gfc_simplify_cotand (gfc_expr *); gfc_expr *gfc_simplify_count (gfc_expr *, gfc_expr *, gfc_expr *); @@ -421,6 +426,7 @@ gfc_expr *gfc_simplify_shiftr (gfc_expr *, gfc_expr *); gfc_expr *gfc_simplify_sin (gfc_expr *); gfc_expr *gfc_simplify_sind (gfc_expr *); gfc_expr *gfc_simplify_sinh (gfc_expr *); +gfc_expr *gfc_simplify_sinpi (gfc_expr *); gfc_expr *gfc_simplify_size (gfc_expr *, gfc_expr *, gfc_expr *); gfc_expr *gfc_simplify_sizeof (gfc_expr *); gfc_expr *gfc_simplify_storage_size (gfc_expr *, gfc_expr *); @@ -432,6 +438,7 @@ gfc_expr *gfc_simplify_sum (gfc_expr *, gfc_expr *, gfc_expr *); gfc_expr *gfc_simplify_tan (gfc_expr *); gfc_expr *gfc_simplify_tand (gfc_expr *); gfc_expr *gfc_simplify_tanh (gfc_expr *); +gfc_expr *gfc_simplify_tanpi (gfc_expr *); gfc_expr *gfc_simplify_this_image (gfc_expr *, gfc_expr *, gfc_expr *); gfc_expr *gfc_simplify_tiny (gfc_expr *); gfc_expr *gfc_simplify_trailz (gfc_expr *); @@ -631,8 +638,8 @@ void gfc_resolve_time (gfc_expr *); void gfc_resolve_time8 (gfc_expr *); void gfc_resolve_transfer (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *); void gfc_resolve_transpose (gfc_expr *, gfc_expr *); -void gfc_resolve_trigd (gfc_expr *, gfc_expr *); -void gfc_resolve_trigd2 (gfc_expr *, gfc_expr *, gfc_expr *); +void gfc_resolve_trig (gfc_expr *, gfc_expr *); +void gfc_resolve_trig2 (gfc_expr *, gfc_expr *, gfc_expr *); void gfc_resolve_trim (gfc_expr *, gfc_expr *); void gfc_resolve_ttynam (gfc_expr *, gfc_expr *); void gfc_resolve_ubound (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *); diff --git a/gcc/fortran/io.cc b/gcc/fortran/io.cc index b5c9d33..7466d8f 100644 --- a/gcc/fortran/io.cc +++ b/gcc/fortran/io.cc @@ -1228,7 +1228,8 @@ between_desc: default: if (mode != MODE_FORMAT) format_locus.nextc += format_string_pos - 1; - if (!gfc_notify_std (GFC_STD_GNU, "Missing comma at %L", &format_locus)) + if (!gfc_notify_std (GFC_STD_LEGACY, + "Missing comma in FORMAT string at %L", &format_locus)) return false; /* If we do not actually return a failure, we need to unwind this before the next round. */ @@ -1290,7 +1291,8 @@ extension_optional_comma: default: if (mode != MODE_FORMAT) format_locus.nextc += format_string_pos; - if (!gfc_notify_std (GFC_STD_GNU, "Missing comma at %L", &format_locus)) + if (!gfc_notify_std (GFC_STD_LEGACY, + "Missing comma in FORMAT string at %L", &format_locus)) return false; /* If we do not actually return a failure, we need to unwind this before the next round. */ diff --git a/gcc/fortran/iresolve.cc b/gcc/fortran/iresolve.cc index 6930e2c..1001309 100644 --- a/gcc/fortran/iresolve.cc +++ b/gcc/fortran/iresolve.cc @@ -3435,13 +3435,12 @@ gfc_resolve_trim (gfc_expr *f, gfc_expr *string) f->value.function.name = gfc_get_string ("__trim_%d", string->ts.kind); } - -/* Resolve the degree trigonometric functions. This amounts to setting +/* Resolve the trigonometric functions. This amounts to setting the function return type-spec from its argument and building a library function names of the form _gfortran_sind_r4. */ void -gfc_resolve_trigd (gfc_expr *f, gfc_expr *x) +gfc_resolve_trig (gfc_expr *f, gfc_expr *x) { f->ts = x->ts; f->value.function.name @@ -3450,9 +3449,8 @@ gfc_resolve_trigd (gfc_expr *f, gfc_expr *x) gfc_type_abi_kind (&x->ts)); } - void -gfc_resolve_trigd2 (gfc_expr *f, gfc_expr *y, gfc_expr *x) +gfc_resolve_trig2 (gfc_expr *f, gfc_expr *y, gfc_expr *x) { f->ts = y->ts; f->value.function.name diff --git a/gcc/fortran/mathbuiltins.def b/gcc/fortran/mathbuiltins.def index 2d475a2..bdc9058 100644 --- a/gcc/fortran/mathbuiltins.def +++ b/gcc/fortran/mathbuiltins.def @@ -23,34 +23,41 @@ along with GCC; see the file COPYING3. If not see Use DEFINE_MATH_BUILTIN_C if the complex versions of the builtin are also available. */ -DEFINE_MATH_BUILTIN_C (ACOS, "acos", 0) -DEFINE_MATH_BUILTIN_C (ACOSH, "acosh", 0) -DEFINE_MATH_BUILTIN_C (ASIN, "asin", 0) -DEFINE_MATH_BUILTIN_C (ASINH, "asinh", 0) -DEFINE_MATH_BUILTIN_C (ATAN, "atan", 0) -DEFINE_MATH_BUILTIN_C (ATANH, "atanh", 0) -DEFINE_MATH_BUILTIN (ATAN2, "atan2", 1) -DEFINE_MATH_BUILTIN_C (COS, "cos", 0) -DEFINE_MATH_BUILTIN_C (COSH, "cosh", 0) -DEFINE_MATH_BUILTIN_C (EXP, "exp", 0) -DEFINE_MATH_BUILTIN_C (LOG, "log", 0) -DEFINE_MATH_BUILTIN_C (LOG10, "log10", 0) -DEFINE_MATH_BUILTIN_C (SIN, "sin", 0) -DEFINE_MATH_BUILTIN_C (SINH, "sinh", 0) -DEFINE_MATH_BUILTIN_C (SQRT, "sqrt", 0) -DEFINE_MATH_BUILTIN_C (TAN, "tan", 0) -DEFINE_MATH_BUILTIN_C (TANH, "tanh", 0) -DEFINE_MATH_BUILTIN (J0, "j0", 0) -DEFINE_MATH_BUILTIN (J1, "j1", 0) -DEFINE_MATH_BUILTIN (JN, "jn", 5) -DEFINE_MATH_BUILTIN (Y0, "y0", 0) -DEFINE_MATH_BUILTIN (Y1, "y1", 0) -DEFINE_MATH_BUILTIN (YN, "yn", 5) -DEFINE_MATH_BUILTIN (ERF, "erf", 0) -DEFINE_MATH_BUILTIN (ERFC, "erfc", 0) -DEFINE_MATH_BUILTIN (TGAMMA,"tgamma", 0) -DEFINE_MATH_BUILTIN (LGAMMA,"lgamma", 0) -DEFINE_MATH_BUILTIN (HYPOT, "hypot", 1) +DEFINE_MATH_BUILTIN_C (ACOS, "acos", 0) +DEFINE_MATH_BUILTIN_C (ACOSH, "acosh", 0) +DEFINE_MATH_BUILTIN (ACOSPI, "acospi", 0) +DEFINE_MATH_BUILTIN_C (ASIN, "asin", 0) +DEFINE_MATH_BUILTIN_C (ASINH, "asinh", 0) +DEFINE_MATH_BUILTIN (ASINPI, "asinpi", 0) +DEFINE_MATH_BUILTIN_C (ATAN, "atan", 0) +DEFINE_MATH_BUILTIN (ATAN2, "atan2", 1) +DEFINE_MATH_BUILTIN (ATAN2PI, "atan2pi", 1) +DEFINE_MATH_BUILTIN_C (ATANH, "atanh", 0) +DEFINE_MATH_BUILTIN (ATANPI, "atanpi", 0) +DEFINE_MATH_BUILTIN_C (COS, "cos", 0) +DEFINE_MATH_BUILTIN_C (COSH, "cosh", 0) +DEFINE_MATH_BUILTIN (COSPI, "cospi", 0) +DEFINE_MATH_BUILTIN (ERF, "erf", 0) +DEFINE_MATH_BUILTIN (ERFC, "erfc", 0) +DEFINE_MATH_BUILTIN_C (EXP, "exp", 0) +DEFINE_MATH_BUILTIN (HYPOT, "hypot", 1) +DEFINE_MATH_BUILTIN (J0, "j0", 0) +DEFINE_MATH_BUILTIN (J1, "j1", 0) +DEFINE_MATH_BUILTIN (JN, "jn", 5) +DEFINE_MATH_BUILTIN (LGAMMA, "lgamma", 0) +DEFINE_MATH_BUILTIN_C (LOG, "log", 0) +DEFINE_MATH_BUILTIN_C (LOG10, "log10", 0) +DEFINE_MATH_BUILTIN_C (SIN, "sin", 0) +DEFINE_MATH_BUILTIN_C (SINH, "sinh", 0) +DEFINE_MATH_BUILTIN (SINPI, "sinpi", 0) +DEFINE_MATH_BUILTIN_C (SQRT, "sqrt", 0) +DEFINE_MATH_BUILTIN_C (TAN, "tan", 0) +DEFINE_MATH_BUILTIN_C (TANH, "tanh", 0) +DEFINE_MATH_BUILTIN (TANPI, "tanpi", 0) +DEFINE_MATH_BUILTIN (TGAMMA, "tgamma", 0) +DEFINE_MATH_BUILTIN (Y0, "y0", 0) +DEFINE_MATH_BUILTIN (Y1, "y1", 0) +DEFINE_MATH_BUILTIN (YN, "yn", 5) /* OTHER_BUILTIN (CODE, NAME, PROTOTYPE_TYPE, CONST) For floating-point builtins that do not directly correspond to a diff --git a/gcc/fortran/misc.cc b/gcc/fortran/misc.cc index 893c40f..b8bdf75 100644 --- a/gcc/fortran/misc.cc +++ b/gcc/fortran/misc.cc @@ -214,6 +214,9 @@ gfc_typename (gfc_typespec *ts, bool for_hash) case BT_UNKNOWN: strcpy (buffer, "UNKNOWN"); break; + case BT_VOID: + strcpy (buffer, "VOID"); + break; default: gfc_internal_error ("gfc_typename(): Undefined type"); } diff --git a/gcc/fortran/primary.cc b/gcc/fortran/primary.cc index ec4e135..db5fc5d 100644 --- a/gcc/fortran/primary.cc +++ b/gcc/fortran/primary.cc @@ -2102,10 +2102,18 @@ extend_ref (gfc_expr *primary, gfc_ref *tail) { if (primary->ref == NULL) primary->ref = tail = gfc_get_ref (); + else if (tail == NULL) + { + /* Set tail to end of reference chain. */ + for (gfc_ref *ref = primary->ref; ref; ref = ref->next) + if (ref->next == NULL) + { + tail = ref; + break; + } + } else { - if (tail == NULL) - gfc_internal_error ("extend_ref(): Bad tail"); tail->next = gfc_get_ref (); tail = tail->next; } @@ -2302,9 +2310,22 @@ gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag, gfc_array_spec *as; bool coarray_only = sym->attr.codimension && !sym->attr.dimension && sym->ts.type == BT_CHARACTER; + gfc_ref *ref, *strarr = NULL; tail = extend_ref (primary, tail); - tail->type = REF_ARRAY; + if (sym->ts.type == BT_CHARACTER && tail->type == REF_SUBSTRING) + { + gcc_assert (sym->attr.dimension); + /* Find array reference for substrings of character arrays. */ + for (ref = primary->ref; ref && ref->next; ref = ref->next) + if (ref->type == REF_ARRAY && ref->next->type == REF_SUBSTRING) + { + strarr = ref; + break; + } + } + else + tail->type = REF_ARRAY; /* In EQUIVALENCE, we don't know yet whether we are seeing an array, character variable or array of character @@ -2317,7 +2338,8 @@ gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag, else as = sym->as; - m = gfc_match_array_ref (&tail->u.ar, as, equiv_flag, as ? as->corank : 0, + ref = strarr ? strarr : tail; + m = gfc_match_array_ref (&ref->u.ar, as, equiv_flag, as ? as->corank : 0, coarray_only); if (m != MATCH_YES) return m; @@ -2483,6 +2505,7 @@ gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag, { bool t; gfc_symtree *tbp; + gfc_typespec *ts = &primary->ts; m = gfc_match_name (name); if (m == MATCH_NO) @@ -2490,8 +2513,18 @@ gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag, if (m != MATCH_YES) return MATCH_ERROR; + /* For derived type components find typespec of ultimate component. */ + if (ts->type == BT_DERIVED && primary->ref) + { + for (gfc_ref *ref = primary->ref; ref; ref = ref->next) + { + if (ref->type == REF_COMPONENT && ref->u.c.component) + ts = &ref->u.c.component->ts; + } + } + intrinsic = false; - if (primary->ts.type != BT_CLASS && primary->ts.type != BT_DERIVED) + if (ts->type != BT_CLASS && ts->type != BT_DERIVED) { inquiry = is_inquiry_ref (name, &tmp); if (inquiry) @@ -2564,7 +2597,7 @@ gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag, return MATCH_ERROR; } else if (tmp->u.i == INQUIRY_LEN - && primary->ts.type != BT_CHARACTER) + && ts->type != BT_CHARACTER) { gfc_error ("The LEN part_ref at %C must be applied " "to a CHARACTER expression"); @@ -2659,6 +2692,11 @@ gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag, primary->ref = tmp; else { + /* Find end of reference chain if inquiry reference and tail not + set. */ + if (tail == NULL && inquiry && tmp) + tail = extend_ref (primary, tail); + /* Set by the for loop below for the last component ref. */ gcc_assert (tail != NULL); tail->next = tmp; @@ -2828,6 +2866,7 @@ check_substring: if (substring) primary->ts.u.cl = NULL; + gfc_gobble_whitespace (); if (gfc_peek_ascii_char () == '(') { gfc_error_now ("Unexpected array/substring ref at %C"); @@ -4271,6 +4310,16 @@ gfc_match_rvalue (gfc_expr **result) return MATCH_ERROR; } + /* Scan for possible inquiry references. */ + if (m == MATCH_YES + && e->expr_type == EXPR_VARIABLE + && gfc_peek_ascii_char () == '%') + { + m = gfc_match_varspec (e, 0, false, false); + if (m == MATCH_NO) + m = MATCH_YES; + } + if (m == MATCH_YES) { e->where = where; diff --git a/gcc/fortran/simplify.cc b/gcc/fortran/simplify.cc index 1927097..b25cd2c 100644 --- a/gcc/fortran/simplify.cc +++ b/gcc/fortran/simplify.cc @@ -885,7 +885,8 @@ gfc_simplify_acos (gfc_expr *x) if (mpfr_cmp_si (x->value.real, 1) > 0 || mpfr_cmp_si (x->value.real, -1) < 0) { - gfc_error ("Argument of ACOS at %L must be between -1 and 1", + gfc_error ("Argument of ACOS at %L must be within the closed " + "interval [-1, 1]", &x->where); return &gfc_bad_expr; } @@ -1162,7 +1163,8 @@ gfc_simplify_asin (gfc_expr *x) if (mpfr_cmp_si (x->value.real, 1) > 0 || mpfr_cmp_si (x->value.real, -1) < 0) { - gfc_error ("Argument of ASIN at %L must be between -1 and 1", + gfc_error ("Argument of ASIN at %L must be within the closed " + "interval [-1, 1]", &x->where); return &gfc_bad_expr; } @@ -1213,8 +1215,9 @@ gfc_simplify_acosd (gfc_expr *x) if (mpfr_cmp_si (x->value.real, 1) > 0 || mpfr_cmp_si (x->value.real, -1) < 0) { - gfc_error ("Argument of ACOSD at %L must be between -1 and 1", - &x->where); + gfc_error ( + "Argument of ACOSD at %L must be within the closed interval [-1, 1]", + &x->where); return &gfc_bad_expr; } @@ -1243,8 +1246,9 @@ gfc_simplify_asind (gfc_expr *x) if (mpfr_cmp_si (x->value.real, 1) > 0 || mpfr_cmp_si (x->value.real, -1) < 0) { - gfc_error ("Argument of ASIND at %L must be between -1 and 1", - &x->where); + gfc_error ( + "Argument of ASIND at %L must be within the closed interval [-1, 1]", + &x->where); return &gfc_bad_expr; } @@ -1383,7 +1387,7 @@ gfc_simplify_atan2 (gfc_expr *y, gfc_expr *x) if (mpfr_zero_p (y->value.real) && mpfr_zero_p (x->value.real)) { - gfc_error ("If first argument of ATAN2 at %L is zero, then the " + gfc_error ("If the first argument of ATAN2 at %L is zero, then the " "second argument must not be zero", &y->where); return &gfc_bad_expr; } @@ -1962,7 +1966,7 @@ gfc_simplify_atan2d (gfc_expr *y, gfc_expr *x) if (mpfr_zero_p (y->value.real) && mpfr_zero_p (x->value.real)) { - gfc_error ("If first argument of ATAN2D at %L is zero, then the " + gfc_error ("If the first argument of ATAN2D at %L is zero, then the " "second argument must not be zero", &y->where); return &gfc_bad_expr; } @@ -2151,6 +2155,250 @@ gfc_simplify_cosh (gfc_expr *x) return range_check (result, "COSH"); } +gfc_expr * +gfc_simplify_acospi (gfc_expr *x) +{ + gfc_expr *result; + + if (x->expr_type != EXPR_CONSTANT) + return NULL; + + if (mpfr_cmp_si (x->value.real, 1) > 0 || mpfr_cmp_si (x->value.real, -1) < 0) + { + gfc_error ( + "Argument of ACOSPI at %L must be within the closed interval [-1, 1]", + &x->where); + return &gfc_bad_expr; + } + + result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); + +#if MPFR_VERSION >= MPFR_VERSION_NUM(4, 2, 0) + mpfr_acospi (result->value.real, x->value.real, GFC_RND_MODE); +#else + mpfr_t pi, tmp; + mpfr_inits2 (2 * mpfr_get_prec (x->value.real), pi, tmp, NULL); + mpfr_const_pi (pi, GFC_RND_MODE); + mpfr_acos (tmp, x->value.real, GFC_RND_MODE); + mpfr_div (result->value.real, tmp, pi, GFC_RND_MODE); + mpfr_clears (pi, tmp, NULL); +#endif + + return result; +} + +gfc_expr * +gfc_simplify_asinpi (gfc_expr *x) +{ + gfc_expr *result; + + if (x->expr_type != EXPR_CONSTANT) + return NULL; + + if (mpfr_cmp_si (x->value.real, 1) > 0 || mpfr_cmp_si (x->value.real, -1) < 0) + { + gfc_error ( + "Argument of ASINPI at %L must be within the closed interval [-1, 1]", + &x->where); + return &gfc_bad_expr; + } + + result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); + +#if MPFR_VERSION >= MPFR_VERSION_NUM(4, 2, 0) + mpfr_asinpi (result->value.real, x->value.real, GFC_RND_MODE); +#else + mpfr_t pi, tmp; + mpfr_inits2 (2 * mpfr_get_prec (x->value.real), pi, tmp, NULL); + mpfr_const_pi (pi, GFC_RND_MODE); + mpfr_asin (tmp, x->value.real, GFC_RND_MODE); + mpfr_div (result->value.real, tmp, pi, GFC_RND_MODE); + mpfr_clears (pi, tmp, NULL); +#endif + + return result; +} + +gfc_expr * +gfc_simplify_atanpi (gfc_expr *x) +{ + gfc_expr *result; + + if (x->expr_type != EXPR_CONSTANT) + return NULL; + + result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); + +#if MPFR_VERSION >= MPFR_VERSION_NUM(4, 2, 0) + mpfr_atanpi (result->value.real, x->value.real, GFC_RND_MODE); +#else + mpfr_t pi, tmp; + mpfr_inits2 (2 * mpfr_get_prec (x->value.real), pi, tmp, NULL); + mpfr_const_pi (pi, GFC_RND_MODE); + mpfr_atan (tmp, x->value.real, GFC_RND_MODE); + mpfr_div (result->value.real, tmp, pi, GFC_RND_MODE); + mpfr_clears (pi, tmp, NULL); +#endif + + return range_check (result, "ATANPI"); +} + +gfc_expr * +gfc_simplify_atan2pi (gfc_expr *y, gfc_expr *x) +{ + gfc_expr *result; + + if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT) + return NULL; + + if (mpfr_zero_p (y->value.real) && mpfr_zero_p (x->value.real)) + { + gfc_error ("If the first argument of ATAN2PI at %L is zero, then the " + "second argument must not be zero", + &y->where); + return &gfc_bad_expr; + } + + result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); + +#if MPFR_VERSION >= MPFR_VERSION_NUM(4, 2, 0) + mpfr_atan2pi (result->value.real, y->value.real, x->value.real, GFC_RND_MODE); +#else + mpfr_t pi, tmp; + mpfr_inits2 (2 * mpfr_get_prec (x->value.real), pi, tmp, NULL); + mpfr_const_pi (pi, GFC_RND_MODE); + mpfr_atan2 (tmp, y->value.real, x->value.real, GFC_RND_MODE); + mpfr_div (result->value.real, tmp, pi, GFC_RND_MODE); + mpfr_clears (pi, tmp, NULL); +#endif + + return range_check (result, "ATAN2PI"); +} + +gfc_expr * +gfc_simplify_cospi (gfc_expr *x) +{ + gfc_expr *result; + + if (x->expr_type != EXPR_CONSTANT) + return NULL; + + result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); + +#if MPFR_VERSION >= MPFR_VERSION_NUM(4, 2, 0) + mpfr_cospi (result->value.real, x->value.real, GFC_RND_MODE); +#else + mpfr_t cs, n, r, two; + int s; + + mpfr_inits2 (2 * mpfr_get_prec (x->value.real), cs, n, r, two, NULL); + + mpfr_abs (r, x->value.real, GFC_RND_MODE); + mpfr_modf (n, r, r, GFC_RND_MODE); + + if (mpfr_cmp_d (r, 0.5) == 0) + { + mpfr_set_ui (result->value.real, 0, GFC_RND_MODE); + return result; + } + + mpfr_set_ui (two, 2, GFC_RND_MODE); + mpfr_fmod (cs, n, two, GFC_RND_MODE); + s = mpfr_cmp_ui (cs, 0) == 0 ? 1 : -1; + + mpfr_const_pi (cs, GFC_RND_MODE); + mpfr_mul (cs, cs, r, GFC_RND_MODE); + mpfr_cos (cs, cs, GFC_RND_MODE); + mpfr_mul_si (result->value.real, cs, s, GFC_RND_MODE); + + mpfr_clears (cs, n, r, two, NULL); +#endif + + return range_check (result, "COSPI"); +} + +gfc_expr * +gfc_simplify_sinpi (gfc_expr *x) +{ + gfc_expr *result; + + if (x->expr_type != EXPR_CONSTANT) + return NULL; + + result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); + +#if MPFR_VERSION >= MPFR_VERSION_NUM(4, 2, 0) + mpfr_sinpi (result->value.real, x->value.real, GFC_RND_MODE); +#else + mpfr_t sn, n, r, two; + int s; + + mpfr_inits2 (2 * mpfr_get_prec (x->value.real), sn, n, r, two, NULL); + + mpfr_abs (r, x->value.real, GFC_RND_MODE); + mpfr_modf (n, r, r, GFC_RND_MODE); + + if (mpfr_cmp_d (r, 0.0) == 0) + { + mpfr_set_ui (result->value.real, 0, GFC_RND_MODE); + return result; + } + + mpfr_set_ui (two, 2, GFC_RND_MODE); + mpfr_fmod (sn, n, two, GFC_RND_MODE); + s = mpfr_cmp_si (x->value.real, 0) < 0 ? -1 : 1; + s *= mpfr_cmp_ui (sn, 0) == 0 ? 1 : -1; + + mpfr_const_pi (sn, GFC_RND_MODE); + mpfr_mul (sn, sn, r, GFC_RND_MODE); + mpfr_sin (sn, sn, GFC_RND_MODE); + mpfr_mul_si (result->value.real, sn, s, GFC_RND_MODE); + + mpfr_clears (sn, n, r, two, NULL); +#endif + + return range_check (result, "SINPI"); +} + +gfc_expr * +gfc_simplify_tanpi (gfc_expr *x) +{ + gfc_expr *result; + + if (x->expr_type != EXPR_CONSTANT) + return NULL; + + result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); + +#if MPFR_VERSION >= MPFR_VERSION_NUM(4, 2, 0) + mpfr_tanpi (result->value.real, x->value.real, GFC_RND_MODE); +#else + mpfr_t tn, n, r; + int s; + + mpfr_inits2 (2 * mpfr_get_prec (x->value.real), tn, n, r, NULL); + + mpfr_abs (r, x->value.real, GFC_RND_MODE); + mpfr_modf (n, r, r, GFC_RND_MODE); + + if (mpfr_cmp_d (r, 0.0) == 0) + { + mpfr_set_ui (result->value.real, 0, GFC_RND_MODE); + return result; + } + + s = mpfr_cmp_si (x->value.real, 0) < 0 ? -1 : 1; + + mpfr_const_pi (tn, GFC_RND_MODE); + mpfr_mul (tn, tn, r, GFC_RND_MODE); + mpfr_tan (tn, tn, GFC_RND_MODE); + mpfr_mul_si (result->value.real, tn, s, GFC_RND_MODE); + + mpfr_clears (tn, n, r, NULL); +#endif + + return range_check (result, "TANPI"); +} gfc_expr * gfc_simplify_count (gfc_expr *mask, gfc_expr *dim, gfc_expr *kind) @@ -9747,6 +9747,103 @@ default_arg (const char *p, int len) return 0; } +/* Use multilib_dir as key to find corresponding multilib_os_dir and + multiarch_dir. */ + +static void +find_multilib_os_dir_by_multilib_dir (const char *multilib_dir, + const char **p_multilib_os_dir, + const char **p_multiarch_dir) +{ + const char *p = multilib_select; + unsigned int this_path_len; + const char *this_path; + int ok = 0; + + while (*p != '\0') + { + /* Ignore newlines. */ + if (*p == '\n') + { + ++p; + continue; + } + + /* Get the initial path. */ + this_path = p; + while (*p != ' ') + { + if (*p == '\0') + { + fatal_error (input_location, "multilib select %qs %qs is invalid", + multilib_select, multilib_reuse); + } + ++p; + } + this_path_len = p - this_path; + + ok = 0; + + /* Skip any arguments, we don't care at this stage. */ + while (*++p != ';'); + + if (this_path_len != 1 + || this_path[0] != '.') + { + char *new_multilib_dir = XNEWVEC (char, this_path_len + 1); + char *q; + + strncpy (new_multilib_dir, this_path, this_path_len); + new_multilib_dir[this_path_len] = '\0'; + q = strchr (new_multilib_dir, ':'); + if (q != NULL) + *q = '\0'; + + if (strcmp (new_multilib_dir, multilib_dir) == 0) + ok = 1; + } + + /* Found matched multilib_dir, update multilib_os_dir and + multiarch_dir. */ + if (ok) + { + const char *q = this_path, *end = this_path + this_path_len; + + while (q < end && *q != ':') + q++; + if (q < end) + { + const char *q2 = q + 1, *ml_end = end; + char *new_multilib_os_dir; + + while (q2 < end && *q2 != ':') + q2++; + if (*q2 == ':') + ml_end = q2; + if (ml_end - q == 1) + *p_multilib_os_dir = xstrdup ("."); + else + { + new_multilib_os_dir = XNEWVEC (char, ml_end - q); + memcpy (new_multilib_os_dir, q + 1, ml_end - q - 1); + new_multilib_os_dir[ml_end - q - 1] = '\0'; + *p_multilib_os_dir = new_multilib_os_dir; + } + + if (q2 < end && *q2 == ':') + { + char *new_multiarch_dir = XNEWVEC (char, end - q2); + memcpy (new_multiarch_dir, q2 + 1, end - q2 - 1); + new_multiarch_dir[end - q2 - 1] = '\0'; + *p_multiarch_dir = new_multiarch_dir; + } + break; + } + } + ++p; + } +} + /* Work out the subdirectory to use based on the options. The format of multilib_select is a list of elements. Each element is a subdirectory name followed by a list of options followed by a semicolon. The format @@ -10025,7 +10122,16 @@ set_multilib_dir (void) multilib_os_dir = NULL; } else if (multilib_dir != NULL && multilib_os_dir == NULL) - multilib_os_dir = multilib_dir; + { + /* Give second chance to search matched multilib_os_dir again by matching + the multilib_dir since some target may use TARGET_COMPUTE_MULTILIB + hook rather than the builtin way. */ + find_multilib_os_dir_by_multilib_dir (multilib_dir, &multilib_os_dir, + &multiarch_dir); + + if (multilib_os_dir == NULL) + multilib_os_dir = multilib_dir; + } } /* Print out the multiple library subdirectory selection diff --git a/gcc/ginclude/stdcountof.h b/gcc/ginclude/stdcountof.h new file mode 100644 index 0000000..1d914f4 --- /dev/null +++ b/gcc/ginclude/stdcountof.h @@ -0,0 +1,31 @@ +/* Copyright (C) 2025 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. + +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +<http://www.gnu.org/licenses/>. */ + +/* ISO C2Y: 7.21 Array count <stdcountof.h>. */ + +#ifndef _STDCOUNTOF_H +#define _STDCOUNTOF_H + +#define countof _Countof + +#endif /* stdcountof.h */ diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc index f06ac46..73cf904 100644 --- a/gcc/ipa-cp.cc +++ b/gcc/ipa-cp.cc @@ -544,8 +544,12 @@ cs_interesting_for_ipcp_p (cgraph_edge *e) if (e->count.ipa ().nonzero_p ()) return true; /* If local (possibly guseed or adjusted 0 profile) claims edge is - not executed, do not propagate. */ - if (e->count.initialized_p () && !e->count.nonzero_p ()) + not executed, do not propagate. + Do not trust AFDO since branch needs to be executed multiple + time to count while we want to propagate even call called + once during the train run if callee is important. */ + if (e->count.initialized_p () && !e->count.nonzero_p () + && e->count.quality () != AFDO) return false; /* If we have zero IPA profile, still consider edge for cloning in case we do partial training. */ diff --git a/gcc/ipa-split.cc b/gcc/ipa-split.cc index 729fb79..933ca16 100644 --- a/gcc/ipa-split.cc +++ b/gcc/ipa-split.cc @@ -1992,6 +1992,10 @@ public: return execute_feedback_split_functions (); } + opt_pass * clone () final override + { + return new pass_feedback_split_functions (m_ctxt); + } }; // class pass_feedback_split_functions bool diff --git a/gcc/ipa-sra.cc b/gcc/ipa-sra.cc index 88bfae9..6e6cf89 100644 --- a/gcc/ipa-sra.cc +++ b/gcc/ipa-sra.cc @@ -1848,6 +1848,12 @@ scan_expr_access (tree expr, gimple *stmt, isra_scan_context ctx, if (!desc || !desc->split_candidate) return; + if (storage_order_barrier_p (expr)) + { + disqualify_split_candidate (desc, "Encountered a storage order barrier."); + return; + } + if (!poffset.is_constant (&offset) || !psize.is_constant (&size) || !pmax_size.is_constant (&max_size)) diff --git a/gcc/match.pd b/gcc/match.pd index 27f662f..bde9bd6 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -3438,6 +3438,16 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (signed_integer_sat_val @0) @2)) (match (signed_integer_sat_add @0 @1) + /* T SUM = (T)((UT)X + (UT)IMM) + SAT_S_ADD = (X ^ SUM) < 0 && (X ^ IMM) >= 0 ? (-(T)(X < 0) ^ MAX) : SUM */ + (cond^ (bit_and:c (lt (bit_xor @0 (nop_convert@2 (plus (nop_convert @0) + INTEGER_CST@1))) + integer_zerop) + (ge (bit_xor:c @0 INTEGER_CST@3) integer_zerop)) + (signed_integer_sat_val @0) + @2) + (if (wi::eq_p (wi::to_wide (@1), wi::to_wide (@3))))) + (match (signed_integer_sat_add @0 @1) /* SUM = .ADD_OVERFLOW (X, Y) SAT_S_ADD = IMAGPART_EXPR (SUM) != 0 ? (-(T)(X < 0) ^ MAX) : SUM */ (cond^ (ne (imagpart (IFN_ADD_OVERFLOW:c@2 @0 @1)) integer_zerop) @@ -3461,7 +3471,24 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (bit_xor:c @0 INTEGER_CST@3)) integer_zerop) (signed_integer_sat_val @0) @2) - (if (wi::bit_and (wi::to_wide (@1), wi::to_wide (@3)) == 0)))) + (if (wi::bit_and (wi::to_wide (@1), wi::to_wide (@3)) == 0))) + +(match (signed_integer_sat_add @0 @1) + /* T SUM = (T)((UT)X + (UT)-1); + SAT_S_ADD = (X ^ -1) < 0 ? SUM : (X ^ SUM) >= 0 ? SUM + : (x < 0) ? MIN : MAX */ + (convert (cond^ (lt (bit_and:c @0 (nop_convert (negate (nop_convert @0)))) + integer_zerop) + INTEGER_CST@2 + (plus (nop_convert @0) integer_all_onesp@1))) + (with + { + unsigned precision = TYPE_PRECISION (type); + wide_int c1 = wi::to_wide (@1); + wide_int c2 = wi::to_wide (@2); + wide_int sum = wi::add (c1, c2); + } + (if (wi::eq_p (sum, wi::max_value (precision, SIGNED))))))) /* Saturation sub for signed integer. */ (if (INTEGRAL_TYPE_P (type) && !TYPE_UNSIGNED (type)) diff --git a/gcc/opts-diagnostic.cc b/gcc/opts-diagnostic.cc index 34c3906..3a1dc52 100644 --- a/gcc/opts-diagnostic.cc +++ b/gcc/opts-diagnostic.cc @@ -545,21 +545,40 @@ html_scheme_handler::make_sink (const context &ctxt, const char *unparsed_arg, const scheme_name_and_params &parsed_arg) const { + bool css = true; label_text filename; + bool javascript = true; for (auto& iter : parsed_arg.m_kvs) { const std::string &key = iter.first; const std::string &value = iter.second; + if (key == "css") + { + if (!parse_bool_value (ctxt, unparsed_arg, key, value, + css)) + return nullptr; + continue; + } if (key == "file") { filename = label_text::take (xstrdup (value.c_str ())); continue; } + if (key == "javascript") + { + if (!parse_bool_value (ctxt, unparsed_arg, key, value, + javascript)) + return nullptr; + continue; + } /* Key not found. */ auto_vec<const char *> known_keys; + known_keys.safe_push ("css"); known_keys.safe_push ("file"); - ctxt.report_unknown_key (unparsed_arg, key, get_scheme_name (), known_keys); + known_keys.safe_push ("javascript"); + ctxt.report_unknown_key (unparsed_arg, key, get_scheme_name (), + known_keys); return nullptr; } @@ -579,8 +598,13 @@ html_scheme_handler::make_sink (const context &ctxt, if (!output_file) return nullptr; + html_generation_options html_gen_opts; + html_gen_opts.m_css = css; + html_gen_opts.m_javascript = javascript; + auto sink = make_html_sink (ctxt.m_dc, *line_table, + html_gen_opts, std::move (output_file)); return sink; } diff --git a/gcc/passes.def b/gcc/passes.def index 3b25105..0f7a659 100644 --- a/gcc/passes.def +++ b/gcc/passes.def @@ -140,6 +140,9 @@ along with GCC; see the file COPYING3. If not see NEXT_PASS (pass_target_clone); NEXT_PASS (pass_ipa_auto_profile); + PUSH_INSERT_PASSES_WITHIN (pass_ipa_auto_profile) + NEXT_PASS (pass_feedback_split_functions); + POP_INSERT_PASSES () NEXT_PASS (pass_ipa_tree_profile); PUSH_INSERT_PASSES_WITHIN (pass_ipa_tree_profile) NEXT_PASS (pass_feedback_split_functions); diff --git a/gcc/predict.cc b/gcc/predict.cc index ef31c48..872f54d 100644 --- a/gcc/predict.cc +++ b/gcc/predict.cc @@ -961,7 +961,7 @@ set_even_probabilities (basic_block bb, if (unlikely_edges != NULL && unlikely_edges->contains (e)) e->probability = profile_probability::very_unlikely (); else - e->probability = all / scale; + e->probability = (all / scale).guessed (); } else e->probability = profile_probability::never (); @@ -4444,11 +4444,14 @@ rebuild_frequencies (void) bool inconsistency_found = false; bool uninitialized_probablity_found = false; bool uninitialized_count_found = false; + bool feedback_found = false; cfun->cfg->count_max = profile_count::uninitialized (); FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun), NULL, next_bb) { cfun->cfg->count_max = cfun->cfg->count_max.max (bb->count); + if (bb->count.nonzero_p () && bb->count.quality () >= AFDO) + feedback_found = true; /* Uninitialized count may be result of inlining or an omision in an optimization pass. */ if (!bb->count.initialized_p ()) @@ -4516,8 +4519,7 @@ rebuild_frequencies (void) Propagating from probabilities would make profile look consistent, but because probablities after code duplication may not be representative for a given run, we would only propagate the error further. */ - if (ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.ipa ().nonzero_p () - && !uninitialized_count_found) + if (feedback_found && !uninitialized_count_found) { if (dump_file) fprintf (dump_file, diff --git a/gcc/profile-count.cc b/gcc/profile-count.cc index 374f06f..2d9c778 100644 --- a/gcc/profile-count.cc +++ b/gcc/profile-count.cc @@ -364,8 +364,12 @@ profile_count::adjust_for_ipa_scaling (profile_count *num, /* Scaling to zero is always zero. */ if (*num == zero ()) return; - /* If den is non-zero we are safe. */ - if (den->force_nonzero () == *den) + /* If den is non-zero we are safe. + However take care of zeros in AFDO profiles since + they simply means that no useful samples were collected. + Called function still may contain important loop. */ + if (den->force_nonzero () == *den + && num->quality () != AFDO) return; /* Force both to non-zero so we do not push profiles to 0 when both num == 0 and den == 0. */ @@ -417,17 +421,17 @@ profile_count::combine_with_ipa_count_within (profile_count ipa, profile_count profile_count::from_gcov_type (gcov_type v, profile_quality quality) - { - profile_count ret; - gcc_checking_assert (v >= 0); - if (dump_file && v >= (gcov_type)max_count) - fprintf (dump_file, - "Capping gcov count %" PRId64 " to max_count %" PRId64 "\n", - (int64_t) v, (int64_t) max_count); - ret.m_val = MIN (v, (gcov_type)max_count); - ret.m_quality = quality; - return ret; - } +{ + profile_count ret; + gcc_checking_assert (v >= 0); + if (dump_file && v >= (gcov_type)max_count) + fprintf (dump_file, + "Capping gcov count %" PRId64 " to max_count %" PRId64 "\n", + (int64_t) v, (int64_t) max_count); + ret.m_val = MIN (v, (gcov_type)max_count); + ret.m_quality = quality; + return ret; +} /* COUNT1 times event happens with *THIS probability, COUNT2 times OTHER happens with COUNT2 probability. Return probability that either *THIS or diff --git a/gcc/sbitmap.cc b/gcc/sbitmap.cc index df2e1aa..075d0d3 100644 --- a/gcc/sbitmap.cc +++ b/gcc/sbitmap.cc @@ -326,11 +326,13 @@ bitmap_set_range (sbitmap bmap, unsigned int start, unsigned int count) bmap->elms[start_word] |= mask; } -/* Return TRUE if any bit between START and END inclusive is set within - the simple bitmap BMAP. Return FALSE otherwise. */ +/* Helper function for bitmap_any_bit_in_range_p and + bitmap_all_bits_in_range_p. If ANY_INVERTED is true, the function checks + if any bit in the range is unset. */ -bool -bitmap_bit_in_range_p (const_sbitmap bmap, unsigned int start, unsigned int end) +static bool +bitmap_bit_in_range_p (const_sbitmap bmap, unsigned int start, + unsigned int end, bool any_inverted) { gcc_checking_assert (start <= end); bitmap_check_index (bmap, end); @@ -350,7 +352,8 @@ bitmap_bit_in_range_p (const_sbitmap bmap, unsigned int start, unsigned int end) SBITMAP_ELT_TYPE low_mask = ((SBITMAP_ELT_TYPE)1 << start_bitno) - 1; SBITMAP_ELT_TYPE mask = high_mask - low_mask; - if (bmap->elms[start_word] & mask) + const SBITMAP_ELT_TYPE expected_partial = any_inverted ? mask : 0; + if ((bmap->elms[start_word] & mask) != expected_partial) return true; start_word++; } @@ -360,9 +363,10 @@ bitmap_bit_in_range_p (const_sbitmap bmap, unsigned int start, unsigned int end) /* Now test words at a time until we hit a partial word. */ unsigned int nwords = (end_word - start_word); + const SBITMAP_ELT_TYPE expected = any_inverted ? ~(SBITMAP_ELT_TYPE)0 : 0; while (nwords) { - if (bmap->elms[start_word]) + if (bmap->elms[start_word] != expected) return true; start_word++; nwords--; @@ -372,7 +376,28 @@ bitmap_bit_in_range_p (const_sbitmap bmap, unsigned int start, unsigned int end) SBITMAP_ELT_TYPE mask = ~(SBITMAP_ELT_TYPE)0; if (end_bitno + 1 < SBITMAP_ELT_BITS) mask = ((SBITMAP_ELT_TYPE)1 << (end_bitno + 1)) - 1; - return (bmap->elms[start_word] & mask) != 0; + const SBITMAP_ELT_TYPE expected_partial = any_inverted ? mask : 0; + return (bmap->elms[start_word] & mask) != expected_partial; +} + +/* Return TRUE if all bits between START and END inclusive are set within + the simple bitmap BMAP. Return FALSE otherwise. */ + +bool +bitmap_all_bits_in_range_p (const_sbitmap bmap, unsigned int start, + unsigned int end) +{ + return !bitmap_bit_in_range_p (bmap, start, end, true); +} + +/* Return TRUE if any bit between START and END inclusive is set within + the simple bitmap BMAP. Return FALSE otherwise. */ + +bool +bitmap_any_bit_in_range_p (const_sbitmap bmap, unsigned int start, + unsigned int end) +{ + return bitmap_bit_in_range_p (bmap, start, end, false); } #if GCC_VERSION < 3400 @@ -863,14 +888,14 @@ namespace selftest { /* Selftests for sbitmaps. */ -/* Checking function that uses both bitmap_bit_in_range_p and +/* Checking function that uses both bitmap_any_bit_in_range_p and loop of bitmap_bit_p and verifies consistent results. */ static bool -bitmap_bit_in_range_p_checking (sbitmap s, unsigned int start, +bitmap_any_bit_in_range_p_checking (sbitmap s, unsigned int start, unsigned end) { - bool r1 = bitmap_bit_in_range_p (s, start, end); + bool r1 = bitmap_any_bit_in_range_p (s, start, end); bool r2 = false; for (unsigned int i = start; i <= end; i++) @@ -893,33 +918,33 @@ test_set_range () bitmap_clear (s); bitmap_set_range (s, 0, 1); - ASSERT_TRUE (bitmap_bit_in_range_p_checking (s, 0, 0)); - ASSERT_FALSE (bitmap_bit_in_range_p_checking (s, 1, 15)); + ASSERT_TRUE (bitmap_any_bit_in_range_p_checking (s, 0, 0)); + ASSERT_FALSE (bitmap_any_bit_in_range_p_checking (s, 1, 15)); bitmap_set_range (s, 15, 1); - ASSERT_FALSE (bitmap_bit_in_range_p_checking (s, 1, 14)); - ASSERT_TRUE (bitmap_bit_in_range_p_checking (s, 15, 15)); + ASSERT_FALSE (bitmap_any_bit_in_range_p_checking (s, 1, 14)); + ASSERT_TRUE (bitmap_any_bit_in_range_p_checking (s, 15, 15)); sbitmap_free (s); s = sbitmap_alloc (1024); bitmap_clear (s); bitmap_set_range (s, 512, 1); - ASSERT_FALSE (bitmap_bit_in_range_p_checking (s, 0, 511)); - ASSERT_FALSE (bitmap_bit_in_range_p_checking (s, 513, 1023)); - ASSERT_TRUE (bitmap_bit_in_range_p_checking (s, 512, 512)); - ASSERT_TRUE (bitmap_bit_in_range_p_checking (s, 508, 512)); - ASSERT_TRUE (bitmap_bit_in_range_p_checking (s, 508, 513)); - ASSERT_FALSE (bitmap_bit_in_range_p_checking (s, 508, 511)); + ASSERT_FALSE (bitmap_any_bit_in_range_p_checking (s, 0, 511)); + ASSERT_FALSE (bitmap_any_bit_in_range_p_checking (s, 513, 1023)); + ASSERT_TRUE (bitmap_any_bit_in_range_p_checking (s, 512, 512)); + ASSERT_TRUE (bitmap_any_bit_in_range_p_checking (s, 508, 512)); + ASSERT_TRUE (bitmap_any_bit_in_range_p_checking (s, 508, 513)); + ASSERT_FALSE (bitmap_any_bit_in_range_p_checking (s, 508, 511)); bitmap_clear (s); bitmap_set_range (s, 512, 64); - ASSERT_FALSE (bitmap_bit_in_range_p_checking (s, 0, 511)); - ASSERT_FALSE (bitmap_bit_in_range_p_checking (s, 512 + 64, 1023)); - ASSERT_TRUE (bitmap_bit_in_range_p_checking (s, 512, 512)); - ASSERT_TRUE (bitmap_bit_in_range_p_checking (s, 512 + 63, 512 + 63)); + ASSERT_FALSE (bitmap_any_bit_in_range_p_checking (s, 0, 511)); + ASSERT_FALSE (bitmap_any_bit_in_range_p_checking (s, 512 + 64, 1023)); + ASSERT_TRUE (bitmap_any_bit_in_range_p_checking (s, 512, 512)); + ASSERT_TRUE (bitmap_any_bit_in_range_p_checking (s, 512 + 63, 512 + 63)); sbitmap_free (s); } -/* Verify bitmap_bit_in_range_p functions for sbitmap. */ +/* Verify bitmap_any_bit_in_range_p functions for sbitmap. */ static void test_bit_in_range () @@ -927,15 +952,15 @@ test_bit_in_range () sbitmap s = sbitmap_alloc (1024); bitmap_clear (s); - ASSERT_FALSE (bitmap_bit_in_range_p (s, 512, 1023)); + ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 512, 1023)); bitmap_set_bit (s, 100); - ASSERT_FALSE (bitmap_bit_in_range_p (s, 512, 1023)); - ASSERT_FALSE (bitmap_bit_in_range_p (s, 0, 99)); - ASSERT_FALSE (bitmap_bit_in_range_p (s, 101, 1023)); - ASSERT_TRUE (bitmap_bit_in_range_p (s, 1, 100)); - ASSERT_TRUE (bitmap_bit_in_range_p (s, 64, 100)); - ASSERT_TRUE (bitmap_bit_in_range_p (s, 100, 100)); + ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 512, 1023)); + ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 0, 99)); + ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 101, 1023)); + ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 1, 100)); + ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 64, 100)); + ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 100, 100)); ASSERT_TRUE (bitmap_bit_p (s, 100)); sbitmap_free (s); @@ -943,54 +968,54 @@ test_bit_in_range () s = sbitmap_alloc (64); bitmap_clear (s); bitmap_set_bit (s, 63); - ASSERT_TRUE (bitmap_bit_in_range_p (s, 0, 63)); - ASSERT_TRUE (bitmap_bit_in_range_p (s, 1, 63)); - ASSERT_TRUE (bitmap_bit_in_range_p (s, 63, 63)); + ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 0, 63)); + ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 1, 63)); + ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 63, 63)); ASSERT_TRUE (bitmap_bit_p (s, 63)); sbitmap_free (s); s = sbitmap_alloc (1024); bitmap_clear (s); bitmap_set_bit (s, 128); - ASSERT_FALSE (bitmap_bit_in_range_p (s, 0, 127)); - ASSERT_FALSE (bitmap_bit_in_range_p (s, 129, 1023)); + ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 0, 127)); + ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 129, 1023)); - ASSERT_TRUE (bitmap_bit_in_range_p (s, 0, 128)); - ASSERT_TRUE (bitmap_bit_in_range_p (s, 1, 128)); - ASSERT_TRUE (bitmap_bit_in_range_p (s, 128, 255)); - ASSERT_TRUE (bitmap_bit_in_range_p (s, 128, 254)); + ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 0, 128)); + ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 1, 128)); + ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 128, 255)); + ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 128, 254)); ASSERT_TRUE (bitmap_bit_p (s, 128)); bitmap_clear (s); bitmap_set_bit (s, 8); - ASSERT_TRUE (bitmap_bit_in_range_p (s, 0, 8)); - ASSERT_TRUE (bitmap_bit_in_range_p (s, 0, 12)); - ASSERT_TRUE (bitmap_bit_in_range_p (s, 0, 63)); - ASSERT_TRUE (bitmap_bit_in_range_p (s, 0, 127)); - ASSERT_TRUE (bitmap_bit_in_range_p (s, 0, 512)); - ASSERT_TRUE (bitmap_bit_in_range_p (s, 8, 8)); + ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 0, 8)); + ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 0, 12)); + ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 0, 63)); + ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 0, 127)); + ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 0, 512)); + ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 8, 8)); ASSERT_TRUE (bitmap_bit_p (s, 8)); bitmap_clear (s); - ASSERT_FALSE (bitmap_bit_in_range_p (s, 0, 0)); - ASSERT_FALSE (bitmap_bit_in_range_p (s, 0, 8)); - ASSERT_FALSE (bitmap_bit_in_range_p (s, 0, 63)); - ASSERT_FALSE (bitmap_bit_in_range_p (s, 1, 63)); - ASSERT_FALSE (bitmap_bit_in_range_p (s, 0, 256)); + ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 0, 0)); + ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 0, 8)); + ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 0, 63)); + ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 1, 63)); + ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 0, 256)); bitmap_set_bit (s, 0); bitmap_set_bit (s, 16); bitmap_set_bit (s, 32); bitmap_set_bit (s, 48); bitmap_set_bit (s, 64); - ASSERT_TRUE (bitmap_bit_in_range_p (s, 0, 0)); - ASSERT_TRUE (bitmap_bit_in_range_p (s, 1, 16)); - ASSERT_TRUE (bitmap_bit_in_range_p (s, 48, 63)); - ASSERT_TRUE (bitmap_bit_in_range_p (s, 64, 64)); - ASSERT_FALSE (bitmap_bit_in_range_p (s, 1, 15)); - ASSERT_FALSE (bitmap_bit_in_range_p (s, 17, 31)); - ASSERT_FALSE (bitmap_bit_in_range_p (s, 49, 63)); - ASSERT_FALSE (bitmap_bit_in_range_p (s, 65, 1023)); + ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 0, 0)); + ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 1, 16)); + ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 48, 63)); + ASSERT_TRUE (bitmap_any_bit_in_range_p (s, 64, 64)); + ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 1, 15)); + ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 17, 31)); + ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 49, 63)); + ASSERT_FALSE (bitmap_any_bit_in_range_p (s, 65, 1023)); sbitmap_free (s); } diff --git a/gcc/sbitmap.h b/gcc/sbitmap.h index 66f9e13..633d84f 100644 --- a/gcc/sbitmap.h +++ b/gcc/sbitmap.h @@ -51,7 +51,7 @@ along with GCC; see the file COPYING3. If not see * set_difference : bitmap_and_compl * set_disjuction : (not implemented) * set_compare : bitmap_equal_p - * bit_in_range_p : bitmap_bit_in_range_p + * any_bit_in_range_p : bitmap_any_bit_in_range_p Some operations on 3 sets that occur frequently in data flow problems are also implemented: @@ -287,7 +287,10 @@ extern bool bitmap_and (sbitmap, const_sbitmap, const_sbitmap); extern bool bitmap_ior (sbitmap, const_sbitmap, const_sbitmap); extern bool bitmap_xor (sbitmap, const_sbitmap, const_sbitmap); extern bool bitmap_subset_p (const_sbitmap, const_sbitmap); -extern bool bitmap_bit_in_range_p (const_sbitmap, unsigned int, unsigned int); +extern bool bitmap_any_bit_in_range_p (const_sbitmap, unsigned int, + unsigned int); +extern bool bitmap_all_bits_in_range_p (const_sbitmap, unsigned int, + unsigned int); extern int bitmap_first_set_bit (const_sbitmap); extern int bitmap_last_set_bit (const_sbitmap); diff --git a/gcc/selftest-diagnostic.cc b/gcc/selftest-diagnostic.cc index 1a10807..eeee2eb 100644 --- a/gcc/selftest-diagnostic.cc +++ b/gcc/selftest-diagnostic.cc @@ -58,11 +58,11 @@ test_diagnostic_context::~test_diagnostic_context () void test_diagnostic_context:: start_span_cb (const diagnostic_location_print_policy &loc_policy, - pretty_printer *pp, + to_text &sink, expanded_location exploc) { exploc.file = "FILENAME"; - default_diagnostic_start_span_fn (loc_policy, pp, exploc); + default_diagnostic_start_span_fn<to_text> (loc_policy, sink, exploc); } bool diff --git a/gcc/selftest-diagnostic.h b/gcc/selftest-diagnostic.h index c8f67a0..4a43310 100644 --- a/gcc/selftest-diagnostic.h +++ b/gcc/selftest-diagnostic.h @@ -40,7 +40,7 @@ class test_diagnostic_context : public diagnostic_context real filename (to avoid printing the names of tempfiles). */ static void start_span_cb (const diagnostic_location_print_policy &, - pretty_printer *, + to_text &sink, expanded_location exploc); /* Report a diagnostic to this context. For a selftest, this diff --git a/gcc/selftest-run-tests.cc b/gcc/selftest-run-tests.cc index 959e5d0..0090e56 100644 --- a/gcc/selftest-run-tests.cc +++ b/gcc/selftest-run-tests.cc @@ -106,7 +106,7 @@ selftest::run_tests () spellcheck_cc_tests (); spellcheck_tree_cc_tests (); tree_cfg_cc_tests (); - diagnostic_path_cc_tests (); + diagnostic_path_output_cc_tests (); simple_diagnostic_path_cc_tests (); lazy_diagnostic_path_cc_tests (); attribs_cc_tests (); diff --git a/gcc/selftest.h b/gcc/selftest.h index 7e1d94c..cd85840 100644 --- a/gcc/selftest.h +++ b/gcc/selftest.h @@ -224,7 +224,7 @@ extern void diagnostic_color_cc_tests (); extern void diagnostic_format_html_cc_tests (); extern void diagnostic_format_json_cc_tests (); extern void diagnostic_format_sarif_cc_tests (); -extern void diagnostic_path_cc_tests (); +extern void diagnostic_path_output_cc_tests (); extern void diagnostic_show_locus_cc_tests (); extern void digraph_cc_tests (); extern void dumpfile_cc_tests (); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 06fcdf4..9b97c4a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8614 @@ +2025-05-28 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + PR fortran/119586 + * gfortran.dg/comma_format_extension_1.f: Update dg-options to + "-std=legacy". + * gfortran.dg/comma_format_extension_3.f: Likewise. + * gfortran.dg/continuation_13.f90: Likewise. + +2025-05-28 Yuao Ma <c8ef@outlook.com> + Steven G. Kargl <kargl@gcc.gnu.org> + + PR fortran/113152 + * gfortran.dg/dec_math_3.f90: Test invalid input. + * gfortran.dg/dec_math_5.f90: Test valid output. + * gfortran.dg/dec_math_6.f90: New test. + +2025-05-28 Robin Dapp <rdapp@ventanamicro.com> + + PR target/120436 + * gcc.target/riscv/rvv/base/pr120436.c: New test. + +2025-05-28 Jason Merrill <jason@redhat.com> + + * g++.dg/modules/namespace-8_a.C: New test. + * g++.dg/modules/namespace-8_b.C: New test. + * g++.dg/modules/namespace-9_a.C: New test. + * g++.dg/modules/namespace-9_b.C: New test. + * g++.dg/modules/namespace-10_a.C: New test. + * g++.dg/modules/namespace-10_b.C: New test. + * g++.dg/modules/namespace-10_c.C: New test. + * g++.dg/modules/namespace-11_a.C: New test. + * g++.dg/modules/namespace-11_b.C: New test. + * g++.dg/modules/namespace-11_c.C: New test. + +2025-05-28 Pan Li <pan2.li@intel.com> + + * gcc.target/riscv/rvv/autovec/avg.h: New test. + * gcc.target/riscv/rvv/autovec/avg_data.h: New test. + * gcc.target/riscv/rvv/autovec/avg_floor-1-i16-from-i32.c: New test. + * gcc.target/riscv/rvv/autovec/avg_floor-1-i16-from-i64.c: New test. + * gcc.target/riscv/rvv/autovec/avg_floor-1-i32-from-i64.c: New test. + * gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i16.c: New test. + * gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i32.c: New test. + * gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i64.c: New test. + * gcc.target/riscv/rvv/autovec/avg_floor-run-1-i16-from-i32.c: New test. + * gcc.target/riscv/rvv/autovec/avg_floor-run-1-i16-from-i64.c: New test. + * gcc.target/riscv/rvv/autovec/avg_floor-run-1-i32-from-i64.c: New test. + * gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i16.c: New test. + * gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i32.c: New test. + * gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i64.c: New test. + * gcc.target/riscv/rvv/autovec/avg_run.h: New test. + +2025-05-28 Pan Li <pan2.li@intel.com> + + * gcc.target/riscv/rvv/autovec/vls/avg-1.c: Update asm check + to vaadd. + * gcc.target/riscv/rvv/autovec/vls/avg-2.c: Ditto. + * gcc.target/riscv/rvv/autovec/vls/avg-3.c: Ditto. + * gcc.target/riscv/rvv/autovec/widen/vec-avg-rv32gcv.c: Ditto. + * gcc.target/riscv/rvv/autovec/widen/vec-avg-rv64gcv.c: Ditto. + +2025-05-28 liuhongt <hongtao.liu@intel.com> + + * gcc.dg/vect/bb-slp-pr119181.c: New test. + +2025-05-27 Alejandro Colomar <alx@kernel.org> + + PR c/117025 + * gcc.dg/countof-compat.c: New test. + * gcc.dg/countof-no-compat.c: New test. + * gcc.dg/countof-pedantic.c: New test. + * gcc.dg/countof-pedantic-errors.c: New test. + +2025-05-27 Alejandro Colomar <alx@kernel.org> + + PR c/117025 + * gcc.dg/countof-stdcountof.c: New test. + +2025-05-27 Alejandro Colomar <alx@kernel.org> + Martin Uecker <uecker@tugraz.at> + + PR c/117025 + * gcc.dg/countof-compile.c: New test. + * gcc.dg/countof-vla.c: New test. + * gcc.dg/countof-vmt.c: New test. + * gcc.dg/countof-zero-compile.c: New test. + * gcc.dg/countof-zero.c: New test. + * gcc.dg/countof.c: New test. + +2025-05-27 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + PR fortran/120049 + * gfortran.dg/pr120049_a.f90: Update test directives. + * gfortran.dg/pr120049_b.f90: Update test directives + * gfortran.dg/pr120049_2.f90: New test. + Co-Authored-By: Steve Kargl <kargl@gcc.gnu.org> + +2025-05-27 Harald Anlauf <anlauf@gmx.de> + + PR fortran/101735 + * gfortran.dg/inquiry_type_ref_7.f90: New test. + +2025-05-27 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/sso19.adb: New test. + * gnat.dg/sso19_pkg.ads, gnat.dg/sso19_pkg.adb: New helper. + +2025-05-27 David Malcolm <dmalcolm@redhat.com> + + PR other/116792 + * gcc.dg/html-output/missing-semicolon.c: Add ":javascript=no" to + html output. + * gcc.dg/html-output/missing-semicolon.py: Move repeated + definitions into lib/htmltest.py. + * gcc.dg/plugin/diagnostic_group_plugin.cc: Update for template + changes. + * gcc.dg/plugin/diagnostic-test-metadata-html.c: Add + ":javascript=no" to html output. Add + "-fdiagnostics-show-line-numbers". + * gcc.dg/plugin/diagnostic-test-metadata-html.py: Move repeated + definitions into lib/htmltest.py. Add checks of annotated source. + * gcc.dg/plugin/diagnostic-test-paths-2.c: Add ":javascript=no" to + html output. + * gcc.dg/plugin/diagnostic-test-paths-2.py: Move repeated + definitions into lib/htmltest.py. Add checks of execution path. + * gcc.dg/plugin/diagnostic-test-paths-4.c: Add + -fdiagnostics-add-output=experimental-html:javascript=no. Add + invocation ot diagnostic-test-paths-4.py. + * gcc.dg/plugin/diagnostic-test-paths-4.py: New test script. + * gcc.dg/plugin/diagnostic-test-show-locus-bw-line-numbers.c: Add + -fdiagnostics-add-output=experimental-html:javascript=no. Add + invocation of diagnostic-test-show-locus.py. + * gcc.dg/plugin/diagnostic-test-show-locus.py: New test script. + * lib/htmltest.py: New test support script. + +2025-05-27 Richard Biener <rguenther@suse.de> + + PR tree-optimization/117965 + * g++.dg/tree-ssa/pr117965-1.C: New testcase. + * g++.dg/tree-ssa/pr117965-2.C: Likewise. + +2025-05-27 Konstantinos Eleftheriou <konstantinos.eleftheriou@vrull.eu> + + PR rtl-optimization/119884 + * gcc.target/i386/pr119884.c: New test. + +2025-05-27 Pan Li <pan2.li@intel.com> + + * gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i16.c: Add asm check + for vxor.vx combine. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i16.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i16.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c: Ditto. + +2025-05-27 Pan Li <pan2.li@intel.com> + + * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i16.c: Add asm check + for vxor.vx combine. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i16.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i16.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h: Add test + data for vxor run test. + * gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i16.c: New test. + * gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i32.c: New test. + * gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i64.c: New test. + * gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i8.c: New test. + * gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u16.c: New test. + * gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u32.c: New test. + * gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u64.c: New test. + * gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u8.c: New test. + +2025-05-27 Juergen Christ <jchrist@linux.ibm.com> + + * gcc.target/s390/vector/vec-extract-1.c: New test. + * gcc.target/s390/vector/vec-set-1.c: New test. + +2025-05-27 xuli <xuli1@eswincomputing.com> + + * gcc.target/riscv/rvv/autovec/sat/vec_sat_arith.h: add signed vec SAT_ADD IMM form1. + * gcc.target/riscv/rvv/autovec/sat/vec_sat_data.h: add sat_s_add_imm data. + * gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i16.c: New test. + * gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i32.c: New test. + * gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i64.c: New test. + * gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i8.c: New test. + * gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i16.c: New test. + * gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i32.c: New test. + * gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i64.c: New test. + * gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i8.c: New test. + * gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i16.c: New test. + * gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i32.c: New test. + * gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i8.c: New test. + +2025-05-27 xuli <xuli1@eswincomputing.com> + + * gcc.target/riscv/sat/sat_s_add_imm-2.c: Move to... + * gcc.target/riscv/sat/sat_s_add_imm-1-i16.c: ...here. + * gcc.target/riscv/sat/sat_s_add_imm-3.c: Move to... + * gcc.target/riscv/sat/sat_s_add_imm-1-i32.c: ...here. + * gcc.target/riscv/sat/sat_s_add_imm-4.c: Move to... + * gcc.target/riscv/sat/sat_s_add_imm-1-i64.c: ...here. + * gcc.target/riscv/sat/sat_s_add_imm-1.c: Move to... + * gcc.target/riscv/sat/sat_s_add_imm-1-i8.c: ...here. + * gcc.target/riscv/sat/sat_s_add_imm-run-2.c: Move to... + * gcc.target/riscv/sat/sat_s_add_imm-run-1-i16.c: ...here. + * gcc.target/riscv/sat/sat_s_add_imm-run-3.c: Move to... + * gcc.target/riscv/sat/sat_s_add_imm-run-1-i32.c: ...here. + * gcc.target/riscv/sat/sat_s_add_imm-run-4.c: Move to... + * gcc.target/riscv/sat/sat_s_add_imm-run-1-i64.c: ...here. + * gcc.target/riscv/sat/sat_s_add_imm-run-1.c: Move to... + * gcc.target/riscv/sat/sat_s_add_imm-run-1-i8.c: ...here. + * gcc.target/riscv/sat/sat_s_add_imm-2-1.c: Move to... + * gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i16.c: ...here. + * gcc.target/riscv/sat/sat_s_add_imm-3-1.c: Move to... + * gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i32.c: ...here. + * gcc.target/riscv/sat/sat_s_add_imm-1-1.c: Move to... + * gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i8.c: ...here. + +2025-05-26 Tobias Burnus <tburnus@baylibre.com> + + PR middle-end/118694 + * c-c++-common/gomp/attrs-metadirective-3.c: Change to never + expect 'omp metadirective' in the dump. If !offload_nvptx, check + that no 'teams' shows up in the dump; for offload_nvptx, expect + OMP_NEXT_VARIANT and an error about directive between 'target' + and 'teams'. + * c-c++-common/gomp/metadirective-3.c: Likewise. + +2025-05-26 Tobias Burnus <tburnus@baylibre.com> + + PR c++/120413 + * g++.dg/gomp/target-4.C: New test. + +2025-05-26 Richard Biener <rguenther@suse.de> + + * gcc.target/i386/vect-epilogues-5.c: Adjust. + +2025-05-24 Eric Botcazou <ebotcazou@adacore.com> + + * ada/acats-4/elabd.lst: New file. + * ada/acats-4/floatstore.lst: Likewise. + * ada/acats-4/norun.lst: Likewise. + * ada/acats-4/run_acats.sh: Likewise. + * ada/acats-4/run_all.sh: Likewise. + * ada/acats-4/run_test.exp: Likewise. + * ada/acats-4/stackcheck.lst: Likewise. + * ada/acats-4/support/acats42.lst: Likewise. + * ada/acats-4/support/checkfil.ada: Likewise. + * ada/acats-4/support/enumchek.ada: Likewise. + * ada/acats-4/support/f340a000.a: Likewise. + * ada/acats-4/support/f340a001.a: Likewise. + * ada/acats-4/support/f341a00.a: Likewise. + * ada/acats-4/support/f350a00.a: Likewise. + * ada/acats-4/support/f350b00.a: Likewise. + * ada/acats-4/support/f360a00.a: Likewise. + * ada/acats-4/support/f360b00.a: Likewise. + * ada/acats-4/support/f390a00.a: Likewise. + * ada/acats-4/support/f392a00.a: Likewise. + * ada/acats-4/support/f392c00.a: Likewise. + * ada/acats-4/support/f392d00.a: Likewise. + * ada/acats-4/support/f393a00.a: Likewise. + * ada/acats-4/support/f393b00.a: Likewise. + * ada/acats-4/support/f394a00.a: Likewise. + * ada/acats-4/support/f3a1a00.a: Likewise. + * ada/acats-4/support/f3a2a00.a: Likewise. + * ada/acats-4/support/f416a00.a: Likewise. + * ada/acats-4/support/f431a00.a: Likewise. + * ada/acats-4/support/f433a00.a: Likewise. + * ada/acats-4/support/f452a00.a: Likewise. + * ada/acats-4/support/f458a00.a: Likewise. + * ada/acats-4/support/f460a00.a: Likewise. + * ada/acats-4/support/f552a00.a: Likewise. + * ada/acats-4/support/f611a00.a: Likewise. + * ada/acats-4/support/f611b00.a: Likewise. + * ada/acats-4/support/f650a00.a: Likewise. + * ada/acats-4/support/f650b00.a: Likewise. + * ada/acats-4/support/f730a000.a: Likewise. + * ada/acats-4/support/f730a001.a: Likewise. + * ada/acats-4/support/f731a00.a: Likewise. + * ada/acats-4/support/f732a00.a: Likewise. + * ada/acats-4/support/f732b00.a: Likewise. + * ada/acats-4/support/f732c00.a: Likewise. + * ada/acats-4/support/f750a00.a: Likewise. + * ada/acats-4/support/f760a00.a: Likewise. + * ada/acats-4/support/f940a00.a: Likewise. + * ada/acats-4/support/f954a00.a: Likewise. + * ada/acats-4/support/fa11a00.a: Likewise. + * ada/acats-4/support/fa11b00.a: Likewise. + * ada/acats-4/support/fa11c00.a: Likewise. + * ada/acats-4/support/fa11d00.a: Likewise. + * ada/acats-4/support/fa13a00.a: Likewise. + * ada/acats-4/support/fa13b00.a: Likewise. + * ada/acats-4/support/fa21a00.a: Likewise. + * ada/acats-4/support/fb20a00.a: Likewise. + * ada/acats-4/support/fb40a00.a: Likewise. + * ada/acats-4/support/fc50a00.a: Likewise. + * ada/acats-4/support/fc51a00.a: Likewise. + * ada/acats-4/support/fc51b00.a: Likewise. + * ada/acats-4/support/fc51c00.a: Likewise. + * ada/acats-4/support/fc51d00.a: Likewise. + * ada/acats-4/support/fc54a00.a: Likewise. + * ada/acats-4/support/fc70a00.a: Likewise. + * ada/acats-4/support/fc70b00.a: Likewise. + * ada/acats-4/support/fc70c00.a: Likewise. + * ada/acats-4/support/fcndecl.ada: Likewise. + * ada/acats-4/support/fd72a00.a: Likewise. + * ada/acats-4/support/fdb0a00.a: Likewise. + * ada/acats-4/support/fdb3a00.a: Likewise. + * ada/acats-4/support/fdd2a00.a: Likewise. + * ada/acats-4/support/fdd2b00.a: Likewise. + * ada/acats-4/support/fxa5a00.a: Likewise. + * ada/acats-4/support/fxaca00.a: Likewise. + * ada/acats-4/support/fxacb00.a: Likewise. + * ada/acats-4/support/fxacc00.a: Likewise. + * ada/acats-4/support/fxaia00.a: Likewise. + * ada/acats-4/support/fxaib00.a: Likewise. + * ada/acats-4/support/fxc6a00.a: Likewise. + * ada/acats-4/support/fxe2a00.a: Likewise. + * ada/acats-4/support/fxf2a00.a: Likewise. + * ada/acats-4/support/fxf3a00.a: Likewise. + * ada/acats-4/support/grade.a: Likewise. + * ada/acats-4/support/grd_data.a: Likewise. + * ada/acats-4/support/impbit.adb: Likewise. + * ada/acats-4/support/impdef.a: Likewise. + * ada/acats-4/support/impdefc.a: Likewise. + * ada/acats-4/support/impdefd.a: Likewise. + * ada/acats-4/support/impdefe.a: Likewise. + * ada/acats-4/support/impdefg.a: Likewise. + * ada/acats-4/support/impdefh.a: Likewise. + * ada/acats-4/support/lencheck.ada: Likewise. + * ada/acats-4/support/macro.dfs: Likewise. + * ada/acats-4/support/macrodef.adb: Likewise. + * ada/acats-4/support/macrosub.ada: Likewise. + * ada/acats-4/support/report.a: Likewise. + * ada/acats-4/support/special.a: Likewise. + * ada/acats-4/support/spprt13s.tst: Likewise. + * ada/acats-4/support/summary.a: Likewise. + * ada/acats-4/support/tctouch.ada: Likewise. + * ada/acats-4/support/trace.a: Likewise. + * ada/acats-4/support/tst_sum.a: Likewise. + * ada/acats-4/support/tsttests.dat: Likewise. + * ada/acats-4/support/version.a: Likewise. + * ada/acats-4/tests/a/a22006b.ada: Likewise. + * ada/acats-4/tests/a/a22006c.ada: Likewise. + * ada/acats-4/tests/a/a22006d.ada: Likewise. + * ada/acats-4/tests/a/a26007a.tst: Likewise. + * ada/acats-4/tests/a/a27003a.ada: Likewise. + * ada/acats-4/tests/a/a29003a.ada: Likewise. + * ada/acats-4/tests/a/a2a031a.ada: Likewise. + * ada/acats-4/tests/a/a33003a.ada: Likewise. + * ada/acats-4/tests/a/a34017c.ada: Likewise. + * ada/acats-4/tests/a/a35101b.ada: Likewise. + * ada/acats-4/tests/a/a35402a.ada: Likewise. + * ada/acats-4/tests/a/a35801f.ada: Likewise. + * ada/acats-4/tests/a/a35902c.ada: Likewise. + * ada/acats-4/tests/a/a38106d.ada: Likewise. + * ada/acats-4/tests/a/a38106e.ada: Likewise. + * ada/acats-4/tests/a/a49027a.ada: Likewise. + * ada/acats-4/tests/a/a49027b.ada: Likewise. + * ada/acats-4/tests/a/a49027c.ada: Likewise. + * ada/acats-4/tests/a/a54b01a.ada: Likewise. + * ada/acats-4/tests/a/a54b02a.ada: Likewise. + * ada/acats-4/tests/a/a55b12a.ada: Likewise. + * ada/acats-4/tests/a/a55b13a.ada: Likewise. + * ada/acats-4/tests/a/a55b14a.ada: Likewise. + * ada/acats-4/tests/a/a71004a.ada: Likewise. + * ada/acats-4/tests/a/a73001i.ada: Likewise. + * ada/acats-4/tests/a/a73001j.ada: Likewise. + * ada/acats-4/tests/a/a74105b.ada: Likewise. + * ada/acats-4/tests/a/a74106a.ada: Likewise. + * ada/acats-4/tests/a/a74106b.ada: Likewise. + * ada/acats-4/tests/a/a74106c.ada: Likewise. + * ada/acats-4/tests/a/a74205e.ada: Likewise. + * ada/acats-4/tests/a/a74205f.ada: Likewise. + * ada/acats-4/tests/a/a83009a.ada: Likewise. + * ada/acats-4/tests/a/a83009b.ada: Likewise. + * ada/acats-4/tests/a/a83a02a.ada: Likewise. + * ada/acats-4/tests/a/a83a02b.ada: Likewise. + * ada/acats-4/tests/a/a83a06a.ada: Likewise. + * ada/acats-4/tests/a/a83a08a.ada: Likewise. + * ada/acats-4/tests/a/a83c01c.ada: Likewise. + * ada/acats-4/tests/a/a83c01h.ada: Likewise. + * ada/acats-4/tests/a/a83c01i.ada: Likewise. + * ada/acats-4/tests/a/a85007d.ada: Likewise. + * ada/acats-4/tests/a/a85013b.ada: Likewise. + * ada/acats-4/tests/a/a87b59a.ada: Likewise. + * ada/acats-4/tests/a/a95001c.ada: Likewise. + * ada/acats-4/tests/a/a95074d.ada: Likewise. + * ada/acats-4/tests/a/a97106a.ada: Likewise. + * ada/acats-4/tests/a/a99006a.ada: Likewise. + * ada/acats-4/tests/a/aa2010a.ada: Likewise. + * ada/acats-4/tests/a/aa2012a.ada: Likewise. + * ada/acats-4/tests/a/ac1015b.ada: Likewise. + * ada/acats-4/tests/a/ac3106a.ada: Likewise. + * ada/acats-4/tests/a/ac3206a.ada: Likewise. + * ada/acats-4/tests/a/ac3207a.ada: Likewise. + * ada/acats-4/tests/a/ad7001b.ada: Likewise. + * ada/acats-4/tests/a/ad7001c0.ada: Likewise. + * ada/acats-4/tests/a/ad7001c1.ada: Likewise. + * ada/acats-4/tests/a/ad7001d0.ada: Likewise. + * ada/acats-4/tests/a/ad7001d1.ada: Likewise. + * ada/acats-4/tests/a/ad7006a.ada: Likewise. + * ada/acats-4/tests/a/ad7101a.ada: Likewise. + * ada/acats-4/tests/a/ad7101c.ada: Likewise. + * ada/acats-4/tests/a/ad7102a.ada: Likewise. + * ada/acats-4/tests/a/ad7103a.ada: Likewise. + * ada/acats-4/tests/a/ad7103c.ada: Likewise. + * ada/acats-4/tests/a/ad7104a.ada: Likewise. + * ada/acats-4/tests/a/ad7201a.ada: Likewise. + * ada/acats-4/tests/a/ad7203b.ada: Likewise. + * ada/acats-4/tests/a/ad7205b.ada: Likewise. + * ada/acats-4/tests/a/ad8011a.tst: Likewise. + * ada/acats-4/tests/a/ada101a.ada: Likewise. + * ada/acats-4/tests/a/ae2113a.ada: Likewise. + * ada/acats-4/tests/a/ae2113b.ada: Likewise. + * ada/acats-4/tests/a/ae3002g.ada: Likewise. + * ada/acats-4/tests/a/ae3101a.ada: Likewise. + * ada/acats-4/tests/a/ae3702a.ada: Likewise. + * ada/acats-4/tests/a/ae3709a.ada: Likewise. + * ada/acats-4/tests/c2/c23001a.ada: Likewise. + * ada/acats-4/tests/c2/c23003a.tst: Likewise. + * ada/acats-4/tests/c2/c23003b.tst: Likewise. + * ada/acats-4/tests/c2/c23003g.tst: Likewise. + * ada/acats-4/tests/c2/c23003i.tst: Likewise. + * ada/acats-4/tests/c2/c23006a.ada: Likewise. + * ada/acats-4/tests/c2/c23006b.ada: Likewise. + * ada/acats-4/tests/c2/c23006c.ada: Likewise. + * ada/acats-4/tests/c2/c23006d.ada: Likewise. + * ada/acats-4/tests/c2/c23006e.ada: Likewise. + * ada/acats-4/tests/c2/c23006f.ada: Likewise. + * ada/acats-4/tests/c2/c23006g.ada: Likewise. + * ada/acats-4/tests/c2/c24002d.ada: Likewise. + * ada/acats-4/tests/c2/c24003a.ada: Likewise. + * ada/acats-4/tests/c2/c24003b.ada: Likewise. + * ada/acats-4/tests/c2/c24003c.ada: Likewise. + * ada/acats-4/tests/c2/c24106a.ada: Likewise. + * ada/acats-4/tests/c2/c24202d.ada: Likewise. + * ada/acats-4/tests/c2/c24203a.ada: Likewise. + * ada/acats-4/tests/c2/c24203b.ada: Likewise. + * ada/acats-4/tests/c2/c24207a.ada: Likewise. + * ada/acats-4/tests/c2/c24211a.ada: Likewise. + * ada/acats-4/tests/c2/c250001.au: Likewise. + * ada/acats-4/tests/c2/c250002.au: Likewise. + * ada/acats-4/tests/c2/c25001a.ada: Likewise. + * ada/acats-4/tests/c2/c25001b.ada: Likewise. + * ada/acats-4/tests/c2/c26006a.ada: Likewise. + * ada/acats-4/tests/c2/c26008a.ada: Likewise. + * ada/acats-4/tests/c2/c2a001a.ada: Likewise. + * ada/acats-4/tests/c2/c2a001b.ada: Likewise. + * ada/acats-4/tests/c2/c2a001c.ada: Likewise. + * ada/acats-4/tests/c2/c2a002a.ada: Likewise. + * ada/acats-4/tests/c2/c2a008a.ada: Likewise. + * ada/acats-4/tests/c2/c2a021b.ada: Likewise. + * ada/acats-4/tests/c3/c32001a.ada: Likewise. + * ada/acats-4/tests/c3/c32001b.ada: Likewise. + * ada/acats-4/tests/c3/c32001c.ada: Likewise. + * ada/acats-4/tests/c3/c32001d.ada: Likewise. + * ada/acats-4/tests/c3/c32001e.ada: Likewise. + * ada/acats-4/tests/c3/c32107a.ada: Likewise. + * ada/acats-4/tests/c3/c32107c.ada: Likewise. + * ada/acats-4/tests/c3/c32108a.ada: Likewise. + * ada/acats-4/tests/c3/c32108b.ada: Likewise. + * ada/acats-4/tests/c3/c32111a.ada: Likewise. + * ada/acats-4/tests/c3/c32111b.ada: Likewise. + * ada/acats-4/tests/c3/c32112b.ada: Likewise. + * ada/acats-4/tests/c3/c32113a.ada: Likewise. + * ada/acats-4/tests/c3/c32115a.ada: Likewise. + * ada/acats-4/tests/c3/c32115b.ada: Likewise. + * ada/acats-4/tests/c3/c324001.a: Likewise. + * ada/acats-4/tests/c3/c324002.a: Likewise. + * ada/acats-4/tests/c3/c324003.a: Likewise. + * ada/acats-4/tests/c3/c324004.a: Likewise. + * ada/acats-4/tests/c3/c324005.a: Likewise. + * ada/acats-4/tests/c3/c324006.a: Likewise. + * ada/acats-4/tests/c3/c330001.a: Likewise. + * ada/acats-4/tests/c3/c330002.a: Likewise. + * ada/acats-4/tests/c3/c332001.a: Likewise. + * ada/acats-4/tests/c3/c340001.a: Likewise. + * ada/acats-4/tests/c3/c34001a.ada: Likewise. + * ada/acats-4/tests/c3/c34001c.ada: Likewise. + * ada/acats-4/tests/c3/c34001d.ada: Likewise. + * ada/acats-4/tests/c3/c34001f.ada: Likewise. + * ada/acats-4/tests/c3/c34002a.ada: Likewise. + * ada/acats-4/tests/c3/c34002c.ada: Likewise. + * ada/acats-4/tests/c3/c34003a.ada: Likewise. + * ada/acats-4/tests/c3/c34003c.ada: Likewise. + * ada/acats-4/tests/c3/c34004a.ada: Likewise. + * ada/acats-4/tests/c3/c34004c.ada: Likewise. + * ada/acats-4/tests/c3/c34005a.ada: Likewise. + * ada/acats-4/tests/c3/c34005c.ada: Likewise. + * ada/acats-4/tests/c3/c34005d.ada: Likewise. + * ada/acats-4/tests/c3/c34005f.ada: Likewise. + * ada/acats-4/tests/c3/c34005g.ada: Likewise. + * ada/acats-4/tests/c3/c34005i.ada: Likewise. + * ada/acats-4/tests/c3/c34005j.ada: Likewise. + * ada/acats-4/tests/c3/c34005l.ada: Likewise. + * ada/acats-4/tests/c3/c34005m.ada: Likewise. + * ada/acats-4/tests/c3/c34005o.ada: Likewise. + * ada/acats-4/tests/c3/c34005p.ada: Likewise. + * ada/acats-4/tests/c3/c34005r.ada: Likewise. + * ada/acats-4/tests/c3/c34005s.ada: Likewise. + * ada/acats-4/tests/c3/c34005u.ada: Likewise. + * ada/acats-4/tests/c3/c34005v.ada: Likewise. + * ada/acats-4/tests/c3/c34006a.ada: Likewise. + * ada/acats-4/tests/c3/c34006d.ada: Likewise. + * ada/acats-4/tests/c3/c34006f.ada: Likewise. + * ada/acats-4/tests/c3/c34006g.ada: Likewise. + * ada/acats-4/tests/c3/c34006j.ada: Likewise. + * ada/acats-4/tests/c3/c34006l.ada: Likewise. + * ada/acats-4/tests/c3/c34007a.ada: Likewise. + * ada/acats-4/tests/c3/c34007d.ada: Likewise. + * ada/acats-4/tests/c3/c34007f.ada: Likewise. + * ada/acats-4/tests/c3/c34007g.ada: Likewise. + * ada/acats-4/tests/c3/c34007i.ada: Likewise. + * ada/acats-4/tests/c3/c34007j.ada: Likewise. + * ada/acats-4/tests/c3/c34007m.ada: Likewise. + * ada/acats-4/tests/c3/c34007p.ada: Likewise. + * ada/acats-4/tests/c3/c34007r.ada: Likewise. + * ada/acats-4/tests/c3/c34007s.ada: Likewise. + * ada/acats-4/tests/c3/c34007u.ada: Likewise. + * ada/acats-4/tests/c3/c34007v.ada: Likewise. + * ada/acats-4/tests/c3/c34008a.ada: Likewise. + * ada/acats-4/tests/c3/c34009a.ada: Likewise. + * ada/acats-4/tests/c3/c34009d.ada: Likewise. + * ada/acats-4/tests/c3/c34009f.ada: Likewise. + * ada/acats-4/tests/c3/c34009g.ada: Likewise. + * ada/acats-4/tests/c3/c34009j.ada: Likewise. + * ada/acats-4/tests/c3/c34009l.ada: Likewise. + * ada/acats-4/tests/c3/c34011b.ada: Likewise. + * ada/acats-4/tests/c3/c34012a.ada: Likewise. + * ada/acats-4/tests/c3/c34014a.ada: Likewise. + * ada/acats-4/tests/c3/c34014c.ada: Likewise. + * ada/acats-4/tests/c3/c34014e.ada: Likewise. + * ada/acats-4/tests/c3/c34014g.ada: Likewise. + * ada/acats-4/tests/c3/c34014h.ada: Likewise. + * ada/acats-4/tests/c3/c34014n.ada: Likewise. + * ada/acats-4/tests/c3/c34014p.ada: Likewise. + * ada/acats-4/tests/c3/c34014r.ada: Likewise. + * ada/acats-4/tests/c3/c34014t.ada: Likewise. + * ada/acats-4/tests/c3/c34014u.ada: Likewise. + * ada/acats-4/tests/c3/c34018a.ada: Likewise. + * ada/acats-4/tests/c3/c340a01.a: Likewise. + * ada/acats-4/tests/c3/c340a02.a: Likewise. + * ada/acats-4/tests/c3/c341a01.a: Likewise. + * ada/acats-4/tests/c3/c341a02.a: Likewise. + * ada/acats-4/tests/c3/c341a03.a: Likewise. + * ada/acats-4/tests/c3/c341a04.a: Likewise. + * ada/acats-4/tests/c3/c350001.a: Likewise. + * ada/acats-4/tests/c3/c35003a.ada: Likewise. + * ada/acats-4/tests/c3/c35003b.ada: Likewise. + * ada/acats-4/tests/c3/c35003d.ada: Likewise. + * ada/acats-4/tests/c3/c350a01.a: Likewise. + * ada/acats-4/tests/c3/c350a02.a: Likewise. + * ada/acats-4/tests/c3/c350b01.a: Likewise. + * ada/acats-4/tests/c3/c350b02.a: Likewise. + * ada/acats-4/tests/c3/c35102a.ada: Likewise. + * ada/acats-4/tests/c3/c352001.a: Likewise. + * ada/acats-4/tests/c3/c354002.a: Likewise. + * ada/acats-4/tests/c3/c354003.a: Likewise. + * ada/acats-4/tests/c3/c354004.a: Likewise. + * ada/acats-4/tests/c3/c35502a.ada: Likewise. + * ada/acats-4/tests/c3/c35502b.ada: Likewise. + * ada/acats-4/tests/c3/c35502c.ada: Likewise. + * ada/acats-4/tests/c3/c35502d.tst: Likewise. + * ada/acats-4/tests/c3/c35502e.ada: Likewise. + * ada/acats-4/tests/c3/c35502f.tst: Likewise. + * ada/acats-4/tests/c3/c35502g.ada: Likewise. + * ada/acats-4/tests/c3/c35502h.ada: Likewise. + * ada/acats-4/tests/c3/c35502i.ada: Likewise. + * ada/acats-4/tests/c3/c35502j.ada: Likewise. + * ada/acats-4/tests/c3/c35502k.ada: Likewise. + * ada/acats-4/tests/c3/c35502l.ada: Likewise. + * ada/acats-4/tests/c3/c35502m.ada: Likewise. + * ada/acats-4/tests/c3/c35502n.ada: Likewise. + * ada/acats-4/tests/c3/c35502o.ada: Likewise. + * ada/acats-4/tests/c3/c35502p.ada: Likewise. + * ada/acats-4/tests/c3/c35503a.ada: Likewise. + * ada/acats-4/tests/c3/c35503b.ada: Likewise. + * ada/acats-4/tests/c3/c35503c.ada: Likewise. + * ada/acats-4/tests/c3/c35503d.tst: Likewise. + * ada/acats-4/tests/c3/c35503e.ada: Likewise. + * ada/acats-4/tests/c3/c35503f.tst: Likewise. + * ada/acats-4/tests/c3/c35503g.ada: Likewise. + * ada/acats-4/tests/c3/c35503h.ada: Likewise. + * ada/acats-4/tests/c3/c35503k.ada: Likewise. + * ada/acats-4/tests/c3/c35503l.ada: Likewise. + * ada/acats-4/tests/c3/c35503o.ada: Likewise. + * ada/acats-4/tests/c3/c35503p.ada: Likewise. + * ada/acats-4/tests/c3/c35504a.ada: Likewise. + * ada/acats-4/tests/c3/c35504b.ada: Likewise. + * ada/acats-4/tests/c3/c35505c.ada: Likewise. + * ada/acats-4/tests/c3/c35505e.ada: Likewise. + * ada/acats-4/tests/c3/c35505f.ada: Likewise. + * ada/acats-4/tests/c3/c35507a.ada: Likewise. + * ada/acats-4/tests/c3/c35507b.ada: Likewise. + * ada/acats-4/tests/c3/c35507c.ada: Likewise. + * ada/acats-4/tests/c3/c35507e.ada: Likewise. + * ada/acats-4/tests/c3/c35507g.ada: Likewise. + * ada/acats-4/tests/c3/c35507h.ada: Likewise. + * ada/acats-4/tests/c3/c35507i.ada: Likewise. + * ada/acats-4/tests/c3/c35507j.ada: Likewise. + * ada/acats-4/tests/c3/c35507k.ada: Likewise. + * ada/acats-4/tests/c3/c35507l.ada: Likewise. + * ada/acats-4/tests/c3/c35507m.ada: Likewise. + * ada/acats-4/tests/c3/c35507n.ada: Likewise. + * ada/acats-4/tests/c3/c35507o.ada: Likewise. + * ada/acats-4/tests/c3/c35507p.ada: Likewise. + * ada/acats-4/tests/c3/c35508a.ada: Likewise. + * ada/acats-4/tests/c3/c35508b.ada: Likewise. + * ada/acats-4/tests/c3/c35508c.ada: Likewise. + * ada/acats-4/tests/c3/c35508e.ada: Likewise. + * ada/acats-4/tests/c3/c35508g.ada: Likewise. + * ada/acats-4/tests/c3/c35508h.ada: Likewise. + * ada/acats-4/tests/c3/c35508k.ada: Likewise. + * ada/acats-4/tests/c3/c35508l.ada: Likewise. + * ada/acats-4/tests/c3/c35508o.ada: Likewise. + * ada/acats-4/tests/c3/c35508p.ada: Likewise. + * ada/acats-4/tests/c3/c35703a.ada: Likewise. + * ada/acats-4/tests/c3/c35704a.ada: Likewise. + * ada/acats-4/tests/c3/c35704b.ada: Likewise. + * ada/acats-4/tests/c3/c35704c.ada: Likewise. + * ada/acats-4/tests/c3/c35704d.ada: Likewise. + * ada/acats-4/tests/c3/c35801d.ada: Likewise. + * ada/acats-4/tests/c3/c35902d.ada: Likewise. + * ada/acats-4/tests/c3/c35904a.ada: Likewise. + * ada/acats-4/tests/c3/c35904b.ada: Likewise. + * ada/acats-4/tests/c3/c35a001.a: Likewise. + * ada/acats-4/tests/c3/c35a02a.ada: Likewise. + * ada/acats-4/tests/c3/c35a05a.ada: Likewise. + * ada/acats-4/tests/c3/c35a05d.ada: Likewise. + * ada/acats-4/tests/c3/c35a05n.ada: Likewise. + * ada/acats-4/tests/c3/c35a05q.ada: Likewise. + * ada/acats-4/tests/c3/c35a07a.ada: Likewise. + * ada/acats-4/tests/c3/c35a07d.ada: Likewise. + * ada/acats-4/tests/c3/c35a08b.ada: Likewise. + * ada/acats-4/tests/c3/c360002.a: Likewise. + * ada/acats-4/tests/c3/c360a01.a: Likewise. + * ada/acats-4/tests/c3/c360a02.a: Likewise. + * ada/acats-4/tests/c3/c360b01.a: Likewise. + * ada/acats-4/tests/c3/c360b02.a: Likewise. + * ada/acats-4/tests/c3/c36104a.ada: Likewise. + * ada/acats-4/tests/c3/c36104b.ada: Likewise. + * ada/acats-4/tests/c3/c36172a.ada: Likewise. + * ada/acats-4/tests/c3/c36172b.ada: Likewise. + * ada/acats-4/tests/c3/c36172c.ada: Likewise. + * ada/acats-4/tests/c3/c36174a.ada: Likewise. + * ada/acats-4/tests/c3/c36180a.ada: Likewise. + * ada/acats-4/tests/c3/c36202c.ada: Likewise. + * ada/acats-4/tests/c3/c36203a.ada: Likewise. + * ada/acats-4/tests/c3/c36204a.ada: Likewise. + * ada/acats-4/tests/c3/c36204b.ada: Likewise. + * ada/acats-4/tests/c3/c36204c.ada: Likewise. + * ada/acats-4/tests/c3/c36204d.ada: Likewise. + * ada/acats-4/tests/c3/c36205a.ada: Likewise. + * ada/acats-4/tests/c3/c36205b.ada: Likewise. + * ada/acats-4/tests/c3/c36205c.ada: Likewise. + * ada/acats-4/tests/c3/c36205d.ada: Likewise. + * ada/acats-4/tests/c3/c36205e.ada: Likewise. + * ada/acats-4/tests/c3/c36205f.ada: Likewise. + * ada/acats-4/tests/c3/c36205g.ada: Likewise. + * ada/acats-4/tests/c3/c36205h.ada: Likewise. + * ada/acats-4/tests/c3/c36205i.ada: Likewise. + * ada/acats-4/tests/c3/c36205j.ada: Likewise. + * ada/acats-4/tests/c3/c36205k.ada: Likewise. + * ada/acats-4/tests/c3/c36205l.ada: Likewise. + * ada/acats-4/tests/c3/c36301a.ada: Likewise. + * ada/acats-4/tests/c3/c36301b.ada: Likewise. + * ada/acats-4/tests/c3/c36302a.ada: Likewise. + * ada/acats-4/tests/c3/c36304a.ada: Likewise. + * ada/acats-4/tests/c3/c36305a.ada: Likewise. + * ada/acats-4/tests/c3/c37002a.ada: Likewise. + * ada/acats-4/tests/c3/c37003a.ada: Likewise. + * ada/acats-4/tests/c3/c37003b.ada: Likewise. + * ada/acats-4/tests/c3/c37005a.ada: Likewise. + * ada/acats-4/tests/c3/c37006a.ada: Likewise. + * ada/acats-4/tests/c3/c37008a.ada: Likewise. + * ada/acats-4/tests/c3/c37008b.ada: Likewise. + * ada/acats-4/tests/c3/c37009a.ada: Likewise. + * ada/acats-4/tests/c3/c37010a.ada: Likewise. + * ada/acats-4/tests/c3/c37010b.ada: Likewise. + * ada/acats-4/tests/c3/c371001.a: Likewise. + * ada/acats-4/tests/c3/c371002.a: Likewise. + * ada/acats-4/tests/c3/c371003.a: Likewise. + * ada/acats-4/tests/c3/c37102b.ada: Likewise. + * ada/acats-4/tests/c3/c37103a.ada: Likewise. + * ada/acats-4/tests/c3/c37105a.ada: Likewise. + * ada/acats-4/tests/c3/c37107a.ada: Likewise. + * ada/acats-4/tests/c3/c37108b.ada: Likewise. + * ada/acats-4/tests/c3/c37206a.ada: Likewise. + * ada/acats-4/tests/c3/c37207a.ada: Likewise. + * ada/acats-4/tests/c3/c37208a.ada: Likewise. + * ada/acats-4/tests/c3/c37208b.ada: Likewise. + * ada/acats-4/tests/c3/c37209a.ada: Likewise. + * ada/acats-4/tests/c3/c37209b.ada: Likewise. + * ada/acats-4/tests/c3/c37210a.ada: Likewise. + * ada/acats-4/tests/c3/c37211a.ada: Likewise. + * ada/acats-4/tests/c3/c37211b.ada: Likewise. + * ada/acats-4/tests/c3/c37211c.ada: Likewise. + * ada/acats-4/tests/c3/c37211d.ada: Likewise. + * ada/acats-4/tests/c3/c37211e.ada: Likewise. + * ada/acats-4/tests/c3/c37213b.ada: Likewise. + * ada/acats-4/tests/c3/c37213d.ada: Likewise. + * ada/acats-4/tests/c3/c37213f.ada: Likewise. + * ada/acats-4/tests/c3/c37213h.ada: Likewise. + * ada/acats-4/tests/c3/c37213j.ada: Likewise. + * ada/acats-4/tests/c3/c37213k.ada: Likewise. + * ada/acats-4/tests/c3/c37213l.ada: Likewise. + * ada/acats-4/tests/c3/c37215b.ada: Likewise. + * ada/acats-4/tests/c3/c37215d.ada: Likewise. + * ada/acats-4/tests/c3/c37215f.ada: Likewise. + * ada/acats-4/tests/c3/c37215h.ada: Likewise. + * ada/acats-4/tests/c3/c37217a.ada: Likewise. + * ada/acats-4/tests/c3/c37217b.ada: Likewise. + * ada/acats-4/tests/c3/c37217c.ada: Likewise. + * ada/acats-4/tests/c3/c37304a.ada: Likewise. + * ada/acats-4/tests/c3/c37305a.ada: Likewise. + * ada/acats-4/tests/c3/c37306a.ada: Likewise. + * ada/acats-4/tests/c3/c37309a.ada: Likewise. + * ada/acats-4/tests/c3/c37310a.ada: Likewise. + * ada/acats-4/tests/c3/c37312a.ada: Likewise. + * ada/acats-4/tests/c3/c37402a.ada: Likewise. + * ada/acats-4/tests/c3/c37403a.ada: Likewise. + * ada/acats-4/tests/c3/c37404a.ada: Likewise. + * ada/acats-4/tests/c3/c37404b.ada: Likewise. + * ada/acats-4/tests/c3/c37405a.ada: Likewise. + * ada/acats-4/tests/c3/c37411a.ada: Likewise. + * ada/acats-4/tests/c3/c380001.a: Likewise. + * ada/acats-4/tests/c3/c380002.a: Likewise. + * ada/acats-4/tests/c3/c380003.a: Likewise. + * ada/acats-4/tests/c3/c380004.a: Likewise. + * ada/acats-4/tests/c3/c38002a.ada: Likewise. + * ada/acats-4/tests/c3/c38002b.ada: Likewise. + * ada/acats-4/tests/c3/c38005a.ada: Likewise. + * ada/acats-4/tests/c3/c38005b.ada: Likewise. + * ada/acats-4/tests/c3/c38005c.ada: Likewise. + * ada/acats-4/tests/c3/c38102a.ada: Likewise. + * ada/acats-4/tests/c3/c38102b.ada: Likewise. + * ada/acats-4/tests/c3/c38102c.ada: Likewise. + * ada/acats-4/tests/c3/c38102d.ada: Likewise. + * ada/acats-4/tests/c3/c38102e.ada: Likewise. + * ada/acats-4/tests/c3/c38104a.ada: Likewise. + * ada/acats-4/tests/c3/c38107a.ada: Likewise. + * ada/acats-4/tests/c3/c38107b.ada: Likewise. + * ada/acats-4/tests/c3/c38108a.ada: Likewise. + * ada/acats-4/tests/c3/c38108b.ada: Likewise. + * ada/acats-4/tests/c3/c38108c0.ada: Likewise. + * ada/acats-4/tests/c3/c38108c1.ada: Likewise. + * ada/acats-4/tests/c3/c38108c2.ada: Likewise. + * ada/acats-4/tests/c3/c38108d0.ada: Likewise. + * ada/acats-4/tests/c3/c38108d1.ada: Likewise. + * ada/acats-4/tests/c3/c3900010.a: Likewise. + * ada/acats-4/tests/c3/c3900011.am: Likewise. + * ada/acats-4/tests/c3/c390002.a: Likewise. + * ada/acats-4/tests/c3/c390003.a: Likewise. + * ada/acats-4/tests/c3/c390004.a: Likewise. + * ada/acats-4/tests/c3/c3900050.a: Likewise. + * ada/acats-4/tests/c3/c3900051.a: Likewise. + * ada/acats-4/tests/c3/c3900052.a: Likewise. + * ada/acats-4/tests/c3/c3900053.am: Likewise. + * ada/acats-4/tests/c3/c3900060.a: Likewise. + * ada/acats-4/tests/c3/c3900061.a: Likewise. + * ada/acats-4/tests/c3/c3900062.a: Likewise. + * ada/acats-4/tests/c3/c3900063.am: Likewise. + * ada/acats-4/tests/c3/c390007.a: Likewise. + * ada/acats-4/tests/c3/c390010.a: Likewise. + * ada/acats-4/tests/c3/c390011.a: Likewise. + * ada/acats-4/tests/c3/c390012.a: Likewise. + * ada/acats-4/tests/c3/c39006a.ada: Likewise. + * ada/acats-4/tests/c3/c39006b.ada: Likewise. + * ada/acats-4/tests/c3/c39006c0.ada: Likewise. + * ada/acats-4/tests/c3/c39006c1.ada: Likewise. + * ada/acats-4/tests/c3/c39006d.ada: Likewise. + * ada/acats-4/tests/c3/c39006e.ada: Likewise. + * ada/acats-4/tests/c3/c39006f0.ada: Likewise. + * ada/acats-4/tests/c3/c39006f1.ada: Likewise. + * ada/acats-4/tests/c3/c39006f2.ada: Likewise. + * ada/acats-4/tests/c3/c39006f3.ada: Likewise. + * ada/acats-4/tests/c3/c39006g.ada: Likewise. + * ada/acats-4/tests/c3/c39007a.ada: Likewise. + * ada/acats-4/tests/c3/c39007b.ada: Likewise. + * ada/acats-4/tests/c3/c39008a.ada: Likewise. + * ada/acats-4/tests/c3/c39008b.ada: Likewise. + * ada/acats-4/tests/c3/c39008c.ada: Likewise. + * ada/acats-4/tests/c3/c390a010.a: Likewise. + * ada/acats-4/tests/c3/c390a011.am: Likewise. + * ada/acats-4/tests/c3/c390a020.a: Likewise. + * ada/acats-4/tests/c3/c390a021.a: Likewise. + * ada/acats-4/tests/c3/c390a022.am: Likewise. + * ada/acats-4/tests/c3/c390a030.a: Likewise. + * ada/acats-4/tests/c3/c390a031.am: Likewise. + * ada/acats-4/tests/c3/c391001.a: Likewise. + * ada/acats-4/tests/c3/c391002.a: Likewise. + * ada/acats-4/tests/c3/c391003.a: Likewise. + * ada/acats-4/tests/c3/c392002.a: Likewise. + * ada/acats-4/tests/c3/c392003.a: Likewise. + * ada/acats-4/tests/c3/c392004.a: Likewise. + * ada/acats-4/tests/c3/c392005.a: Likewise. + * ada/acats-4/tests/c3/c392008.a: Likewise. + * ada/acats-4/tests/c3/c392010.a: Likewise. + * ada/acats-4/tests/c3/c392011.a: Likewise. + * ada/acats-4/tests/c3/c392013.a: Likewise. + * ada/acats-4/tests/c3/c392014.a: Likewise. + * ada/acats-4/tests/c3/c392015.a: Likewise. + * ada/acats-4/tests/c3/c392a01.a: Likewise. + * ada/acats-4/tests/c3/c392c05.a: Likewise. + * ada/acats-4/tests/c3/c392c07.a: Likewise. + * ada/acats-4/tests/c3/c392d01.a: Likewise. + * ada/acats-4/tests/c3/c392d02.a: Likewise. + * ada/acats-4/tests/c3/c392d03.a: Likewise. + * ada/acats-4/tests/c3/c393001.a: Likewise. + * ada/acats-4/tests/c3/c393007.a: Likewise. + * ada/acats-4/tests/c3/c393008.a: Likewise. + * ada/acats-4/tests/c3/c393009.a: Likewise. + * ada/acats-4/tests/c3/c393010.a: Likewise. + * ada/acats-4/tests/c3/c393011.a: Likewise. + * ada/acats-4/tests/c3/c393012.a: Likewise. + * ada/acats-4/tests/c3/c393013.a: Likewise. + * ada/acats-4/tests/c3/c393a02.a: Likewise. + * ada/acats-4/tests/c3/c393a03.a: Likewise. + * ada/acats-4/tests/c3/c393a05.a: Likewise. + * ada/acats-4/tests/c3/c393a06.a: Likewise. + * ada/acats-4/tests/c3/c393b12.a: Likewise. + * ada/acats-4/tests/c3/c393b13.a: Likewise. + * ada/acats-4/tests/c3/c393b14.a: Likewise. + * ada/acats-4/tests/c3/c394001.a: Likewise. + * ada/acats-4/tests/c3/c394002.a: Likewise. + * ada/acats-4/tests/c3/c394003.a: Likewise. + * ada/acats-4/tests/c3/c3a0001.a: Likewise. + * ada/acats-4/tests/c3/c3a0002.a: Likewise. + * ada/acats-4/tests/c3/c3a0003.a: Likewise. + * ada/acats-4/tests/c3/c3a0004.a: Likewise. + * ada/acats-4/tests/c3/c3a0005.a: Likewise. + * ada/acats-4/tests/c3/c3a0006.a: Likewise. + * ada/acats-4/tests/c3/c3a0007.a: Likewise. + * ada/acats-4/tests/c3/c3a0008.a: Likewise. + * ada/acats-4/tests/c3/c3a0009.a: Likewise. + * ada/acats-4/tests/c3/c3a0010.a: Likewise. + * ada/acats-4/tests/c3/c3a0011.a: Likewise. + * ada/acats-4/tests/c3/c3a00120.a: Likewise. + * ada/acats-4/tests/c3/c3a00121.a: Likewise. + * ada/acats-4/tests/c3/c3a00122.am: Likewise. + * ada/acats-4/tests/c3/c3a0013.a: Likewise. + * ada/acats-4/tests/c3/c3a0014.a: Likewise. + * ada/acats-4/tests/c3/c3a0015.a: Likewise. + * ada/acats-4/tests/c3/c3a0016.a: Likewise. + * ada/acats-4/tests/c3/c3a0017.a: Likewise. + * ada/acats-4/tests/c3/c3a0018.a: Likewise. + * ada/acats-4/tests/c3/c3a0019.a: Likewise. + * ada/acats-4/tests/c3/c3a0020.a: Likewise. + * ada/acats-4/tests/c3/c3a0021.a: Likewise. + * ada/acats-4/tests/c3/c3a0022.a: Likewise. + * ada/acats-4/tests/c3/c3a0023.a: Likewise. + * ada/acats-4/tests/c3/c3a0024.a: Likewise. + * ada/acats-4/tests/c3/c3a0025.a: Likewise. + * ada/acats-4/tests/c3/c3a0026.a: Likewise. + * ada/acats-4/tests/c3/c3a0027.a: Likewise. + * ada/acats-4/tests/c3/c3a0028.a: Likewise. + * ada/acats-4/tests/c3/c3a0029.a: Likewise. + * ada/acats-4/tests/c3/c3a0030.a: Likewise. + * ada/acats-4/tests/c3/c3a1001.a: Likewise. + * ada/acats-4/tests/c3/c3a1002.a: Likewise. + * ada/acats-4/tests/c3/c3a10030.a: Likewise. + * ada/acats-4/tests/c3/c3a10031.a: Likewise. + * ada/acats-4/tests/c3/c3a10032.am: Likewise. + * ada/acats-4/tests/c3/c3a10040.a: Likewise. + * ada/acats-4/tests/c3/c3a10041.a: Likewise. + * ada/acats-4/tests/c3/c3a10042.am: Likewise. + * ada/acats-4/tests/c3/c3a1005.a: Likewise. + * ada/acats-4/tests/c3/c3a2001.a: Likewise. + * ada/acats-4/tests/c3/c3a2002.a: Likewise. + * ada/acats-4/tests/c3/c3a2003.a: Likewise. + * ada/acats-4/tests/c3/c3a2004.a: Likewise. + * ada/acats-4/tests/c3/c3a2a01.a: Likewise. + * ada/acats-4/tests/c3/c3a2a02.a: Likewise. + * ada/acats-4/tests/c4/c410001.a: Likewise. + * ada/acats-4/tests/c4/c41101d.ada: Likewise. + * ada/acats-4/tests/c4/c41103a.ada: Likewise. + * ada/acats-4/tests/c4/c41103b.ada: Likewise. + * ada/acats-4/tests/c4/c41104a.ada: Likewise. + * ada/acats-4/tests/c4/c41105a.ada: Likewise. + * ada/acats-4/tests/c4/c41107a.ada: Likewise. + * ada/acats-4/tests/c4/c41201d.ada: Likewise. + * ada/acats-4/tests/c4/c41203a.ada: Likewise. + * ada/acats-4/tests/c4/c41203b.ada: Likewise. + * ada/acats-4/tests/c4/c41204a.ada: Likewise. + * ada/acats-4/tests/c4/c41205a.ada: Likewise. + * ada/acats-4/tests/c4/c41206a.ada: Likewise. + * ada/acats-4/tests/c4/c41207a.ada: Likewise. + * ada/acats-4/tests/c4/c413001.a: Likewise. + * ada/acats-4/tests/c4/c413002.a: Likewise. + * ada/acats-4/tests/c4/c413003.a: Likewise. + * ada/acats-4/tests/c4/c413004.a: Likewise. + * ada/acats-4/tests/c4/c413005.a: Likewise. + * ada/acats-4/tests/c4/c413006.a: Likewise. + * ada/acats-4/tests/c4/c413007.a: Likewise. + * ada/acats-4/tests/c4/c41301a.ada: Likewise. + * ada/acats-4/tests/c4/c41303a.ada: Likewise. + * ada/acats-4/tests/c4/c41303b.ada: Likewise. + * ada/acats-4/tests/c4/c41303c.ada: Likewise. + * ada/acats-4/tests/c4/c41303e.ada: Likewise. + * ada/acats-4/tests/c4/c41303f.ada: Likewise. + * ada/acats-4/tests/c4/c41303g.ada: Likewise. + * ada/acats-4/tests/c4/c41303i.ada: Likewise. + * ada/acats-4/tests/c4/c41303j.ada: Likewise. + * ada/acats-4/tests/c4/c41303k.ada: Likewise. + * ada/acats-4/tests/c4/c41303m.ada: Likewise. + * ada/acats-4/tests/c4/c41303n.ada: Likewise. + * ada/acats-4/tests/c4/c41303o.ada: Likewise. + * ada/acats-4/tests/c4/c41303q.ada: Likewise. + * ada/acats-4/tests/c4/c41303r.ada: Likewise. + * ada/acats-4/tests/c4/c41303s.ada: Likewise. + * ada/acats-4/tests/c4/c41303u.ada: Likewise. + * ada/acats-4/tests/c4/c41303v.ada: Likewise. + * ada/acats-4/tests/c4/c41303w.ada: Likewise. + * ada/acats-4/tests/c4/c41304a.ada: Likewise. + * ada/acats-4/tests/c4/c41304b.ada: Likewise. + * ada/acats-4/tests/c4/c41306b.ada: Likewise. + * ada/acats-4/tests/c4/c41306c.ada: Likewise. + * ada/acats-4/tests/c4/c41307d.ada: Likewise. + * ada/acats-4/tests/c4/c41309a.ada: Likewise. + * ada/acats-4/tests/c4/c41320a.ada: Likewise. + * ada/acats-4/tests/c4/c41321a.ada: Likewise. + * ada/acats-4/tests/c4/c41322a.ada: Likewise. + * ada/acats-4/tests/c4/c41323a.ada: Likewise. + * ada/acats-4/tests/c4/c41324a.ada: Likewise. + * ada/acats-4/tests/c4/c41325a.ada: Likewise. + * ada/acats-4/tests/c4/c41326a.ada: Likewise. + * ada/acats-4/tests/c4/c41327a.ada: Likewise. + * ada/acats-4/tests/c4/c41328a.ada: Likewise. + * ada/acats-4/tests/c4/c41401a.ada: Likewise. + * ada/acats-4/tests/c4/c41402a.ada: Likewise. + * ada/acats-4/tests/c4/c41404a.ada: Likewise. + * ada/acats-4/tests/c4/c416a01.a: Likewise. + * ada/acats-4/tests/c4/c416a02.a: Likewise. + * ada/acats-4/tests/c4/c420001.a: Likewise. + * ada/acats-4/tests/c4/c42006a.ada: Likewise. + * ada/acats-4/tests/c4/c42007e.ada: Likewise. + * ada/acats-4/tests/c4/c43003a.ada: Likewise. + * ada/acats-4/tests/c4/c43004a.ada: Likewise. + * ada/acats-4/tests/c4/c43004c.ada: Likewise. + * ada/acats-4/tests/c4/c431001.a: Likewise. + * ada/acats-4/tests/c4/c431002.a: Likewise. + * ada/acats-4/tests/c4/c431003.a: Likewise. + * ada/acats-4/tests/c4/c431004.a: Likewise. + * ada/acats-4/tests/c4/c43103a.ada: Likewise. + * ada/acats-4/tests/c4/c43103b.ada: Likewise. + * ada/acats-4/tests/c4/c43104a.ada: Likewise. + * ada/acats-4/tests/c4/c43105a.ada: Likewise. + * ada/acats-4/tests/c4/c43105b.ada: Likewise. + * ada/acats-4/tests/c4/c43106a.ada: Likewise. + * ada/acats-4/tests/c4/c43107a.ada: Likewise. + * ada/acats-4/tests/c4/c43108a.ada: Likewise. + * ada/acats-4/tests/c4/c431a01.a: Likewise. + * ada/acats-4/tests/c4/c431a02.a: Likewise. + * ada/acats-4/tests/c4/c431a03.a: Likewise. + * ada/acats-4/tests/c4/c432001.a: Likewise. + * ada/acats-4/tests/c4/c432002.a: Likewise. + * ada/acats-4/tests/c4/c432003.a: Likewise. + * ada/acats-4/tests/c4/c432004.a: Likewise. + * ada/acats-4/tests/c4/c432005.a: Likewise. + * ada/acats-4/tests/c4/c43204a.ada: Likewise. + * ada/acats-4/tests/c4/c43204c.ada: Likewise. + * ada/acats-4/tests/c4/c43204e.ada: Likewise. + * ada/acats-4/tests/c4/c43204f.ada: Likewise. + * ada/acats-4/tests/c4/c43204g.ada: Likewise. + * ada/acats-4/tests/c4/c43204h.ada: Likewise. + * ada/acats-4/tests/c4/c43204i.ada: Likewise. + * ada/acats-4/tests/c4/c43205a.ada: Likewise. + * ada/acats-4/tests/c4/c43205b.ada: Likewise. + * ada/acats-4/tests/c4/c43205c.ada: Likewise. + * ada/acats-4/tests/c4/c43205d.ada: Likewise. + * ada/acats-4/tests/c4/c43205e.ada: Likewise. + * ada/acats-4/tests/c4/c43205g.ada: Likewise. + * ada/acats-4/tests/c4/c43205h.ada: Likewise. + * ada/acats-4/tests/c4/c43205i.ada: Likewise. + * ada/acats-4/tests/c4/c43205j.ada: Likewise. + * ada/acats-4/tests/c4/c43205k.ada: Likewise. + * ada/acats-4/tests/c4/c43206a.ada: Likewise. + * ada/acats-4/tests/c4/c43207b.ada: Likewise. + * ada/acats-4/tests/c4/c43207d.ada: Likewise. + * ada/acats-4/tests/c4/c43208a.ada: Likewise. + * ada/acats-4/tests/c4/c43208b.ada: Likewise. + * ada/acats-4/tests/c4/c43209a.ada: Likewise. + * ada/acats-4/tests/c4/c43210a.ada: Likewise. + * ada/acats-4/tests/c4/c43211a.ada: Likewise. + * ada/acats-4/tests/c4/c43212a.ada: Likewise. + * ada/acats-4/tests/c4/c43212c.ada: Likewise. + * ada/acats-4/tests/c4/c43214a.ada: Likewise. + * ada/acats-4/tests/c4/c43214b.ada: Likewise. + * ada/acats-4/tests/c4/c43214c.ada: Likewise. + * ada/acats-4/tests/c4/c43214d.ada: Likewise. + * ada/acats-4/tests/c4/c43214e.ada: Likewise. + * ada/acats-4/tests/c4/c43214f.ada: Likewise. + * ada/acats-4/tests/c4/c43215a.ada: Likewise. + * ada/acats-4/tests/c4/c43215b.ada: Likewise. + * ada/acats-4/tests/c4/c43222a.ada: Likewise. + * ada/acats-4/tests/c4/c43224a.ada: Likewise. + * ada/acats-4/tests/c4/c433001.a: Likewise. + * ada/acats-4/tests/c4/c433002.a: Likewise. + * ada/acats-4/tests/c4/c433003.a: Likewise. + * ada/acats-4/tests/c4/c433004.a: Likewise. + * ada/acats-4/tests/c4/c433005.a: Likewise. + * ada/acats-4/tests/c4/c433006.a: Likewise. + * ada/acats-4/tests/c4/c433007.a: Likewise. + * ada/acats-4/tests/c4/c433008.a: Likewise. + * ada/acats-4/tests/c4/c433a01.a: Likewise. + * ada/acats-4/tests/c4/c433a02.a: Likewise. + * ada/acats-4/tests/c4/c433a03.a: Likewise. + * ada/acats-4/tests/c4/c433a04.a: Likewise. + * ada/acats-4/tests/c4/c44003d.ada: Likewise. + * ada/acats-4/tests/c4/c44003f.ada: Likewise. + * ada/acats-4/tests/c4/c44003g.ada: Likewise. + * ada/acats-4/tests/c4/c450001.a: Likewise. + * ada/acats-4/tests/c4/c45112a.ada: Likewise. + * ada/acats-4/tests/c4/c45112b.ada: Likewise. + * ada/acats-4/tests/c4/c45113a.ada: Likewise. + * ada/acats-4/tests/c4/c45114b.ada: Likewise. + * ada/acats-4/tests/c4/c452001.a: Likewise. + * ada/acats-4/tests/c4/c452002.a: Likewise. + * ada/acats-4/tests/c4/c452003.a: Likewise. + * ada/acats-4/tests/c4/c452004.a: Likewise. + * ada/acats-4/tests/c4/c452005.a: Likewise. + * ada/acats-4/tests/c4/c452006.a: Likewise. + * ada/acats-4/tests/c4/c45201a.ada: Likewise. + * ada/acats-4/tests/c4/c45201b.ada: Likewise. + * ada/acats-4/tests/c4/c45202b.ada: Likewise. + * ada/acats-4/tests/c4/c45210a.ada: Likewise. + * ada/acats-4/tests/c4/c45211a.ada: Likewise. + * ada/acats-4/tests/c4/c45220a.ada: Likewise. + * ada/acats-4/tests/c4/c45220b.ada: Likewise. + * ada/acats-4/tests/c4/c45220c.ada: Likewise. + * ada/acats-4/tests/c4/c45220d.ada: Likewise. + * ada/acats-4/tests/c4/c45220e.ada: Likewise. + * ada/acats-4/tests/c4/c45220f.ada: Likewise. + * ada/acats-4/tests/c4/c45231a.ada: Likewise. + * ada/acats-4/tests/c4/c45231b.dep: Likewise. + * ada/acats-4/tests/c4/c45231c.dep: Likewise. + * ada/acats-4/tests/c4/c45231d.tst: Likewise. + * ada/acats-4/tests/c4/c45232b.ada: Likewise. + * ada/acats-4/tests/c4/c45242b.ada: Likewise. + * ada/acats-4/tests/c4/c45251a.ada: Likewise. + * ada/acats-4/tests/c4/c45252a.ada: Likewise. + * ada/acats-4/tests/c4/c45252b.ada: Likewise. + * ada/acats-4/tests/c4/c45253a.ada: Likewise. + * ada/acats-4/tests/c4/c45262a.ada: Likewise. + * ada/acats-4/tests/c4/c45262b.ada: Likewise. + * ada/acats-4/tests/c4/c45262c.ada: Likewise. + * ada/acats-4/tests/c4/c45262d.ada: Likewise. + * ada/acats-4/tests/c4/c45264a.ada: Likewise. + * ada/acats-4/tests/c4/c45264b.ada: Likewise. + * ada/acats-4/tests/c4/c45264c.ada: Likewise. + * ada/acats-4/tests/c4/c45265a.ada: Likewise. + * ada/acats-4/tests/c4/c45271a.ada: Likewise. + * ada/acats-4/tests/c4/c45272a.ada: Likewise. + * ada/acats-4/tests/c4/c45273a.ada: Likewise. + * ada/acats-4/tests/c4/c45274a.ada: Likewise. + * ada/acats-4/tests/c4/c45274b.ada: Likewise. + * ada/acats-4/tests/c4/c45274c.ada: Likewise. + * ada/acats-4/tests/c4/c45281a.ada: Likewise. + * ada/acats-4/tests/c4/c45282a.ada: Likewise. + * ada/acats-4/tests/c4/c45282b.ada: Likewise. + * ada/acats-4/tests/c4/c45291a.ada: Likewise. + * ada/acats-4/tests/c4/c452a01.a: Likewise. + * ada/acats-4/tests/c4/c452a02.a: Likewise. + * ada/acats-4/tests/c4/c452a03.a: Likewise. + * ada/acats-4/tests/c4/c453001.a: Likewise. + * ada/acats-4/tests/c4/c45303a.ada: Likewise. + * ada/acats-4/tests/c4/c45304a.ada: Likewise. + * ada/acats-4/tests/c4/c45304b.dep: Likewise. + * ada/acats-4/tests/c4/c45304c.dep: Likewise. + * ada/acats-4/tests/c4/c45322a.ada: Likewise. + * ada/acats-4/tests/c4/c45323a.ada: Likewise. + * ada/acats-4/tests/c4/c45331a.ada: Likewise. + * ada/acats-4/tests/c4/c45342a.ada: Likewise. + * ada/acats-4/tests/c4/c45343a.ada: Likewise. + * ada/acats-4/tests/c4/c45344a.ada: Likewise. + * ada/acats-4/tests/c4/c45345b.ada: Likewise. + * ada/acats-4/tests/c4/c45347a.ada: Likewise. + * ada/acats-4/tests/c4/c45347b.ada: Likewise. + * ada/acats-4/tests/c4/c45347c.ada: Likewise. + * ada/acats-4/tests/c4/c45347d.ada: Likewise. + * ada/acats-4/tests/c4/c45411a.ada: Likewise. + * ada/acats-4/tests/c4/c45411b.dep: Likewise. + * ada/acats-4/tests/c4/c45411c.dep: Likewise. + * ada/acats-4/tests/c4/c45411d.ada: Likewise. + * ada/acats-4/tests/c4/c45413a.ada: Likewise. + * ada/acats-4/tests/c4/c45431a.ada: Likewise. + * ada/acats-4/tests/c4/c455001.a: Likewise. + * ada/acats-4/tests/c4/c45502b.dep: Likewise. + * ada/acats-4/tests/c4/c45502c.dep: Likewise. + * ada/acats-4/tests/c4/c45503a.ada: Likewise. + * ada/acats-4/tests/c4/c45503b.dep: Likewise. + * ada/acats-4/tests/c4/c45503c.dep: Likewise. + * ada/acats-4/tests/c4/c45504a.ada: Likewise. + * ada/acats-4/tests/c4/c45504b.dep: Likewise. + * ada/acats-4/tests/c4/c45504c.dep: Likewise. + * ada/acats-4/tests/c4/c45504d.ada: Likewise. + * ada/acats-4/tests/c4/c45504e.dep: Likewise. + * ada/acats-4/tests/c4/c45504f.dep: Likewise. + * ada/acats-4/tests/c4/c45505a.ada: Likewise. + * ada/acats-4/tests/c4/c45523a.ada: Likewise. + * ada/acats-4/tests/c4/c45531a.ada: Likewise. + * ada/acats-4/tests/c4/c45531b.ada: Likewise. + * ada/acats-4/tests/c4/c45531c.ada: Likewise. + * ada/acats-4/tests/c4/c45531d.ada: Likewise. + * ada/acats-4/tests/c4/c45531e.ada: Likewise. + * ada/acats-4/tests/c4/c45531f.ada: Likewise. + * ada/acats-4/tests/c4/c45531g.ada: Likewise. + * ada/acats-4/tests/c4/c45531h.ada: Likewise. + * ada/acats-4/tests/c4/c45531i.ada: Likewise. + * ada/acats-4/tests/c4/c45531j.ada: Likewise. + * ada/acats-4/tests/c4/c45531k.ada: Likewise. + * ada/acats-4/tests/c4/c45531l.ada: Likewise. + * ada/acats-4/tests/c4/c45531m.dep: Likewise. + * ada/acats-4/tests/c4/c45531n.dep: Likewise. + * ada/acats-4/tests/c4/c45531o.dep: Likewise. + * ada/acats-4/tests/c4/c45531p.dep: Likewise. + * ada/acats-4/tests/c4/c45532a.ada: Likewise. + * ada/acats-4/tests/c4/c45532b.ada: Likewise. + * ada/acats-4/tests/c4/c45532c.ada: Likewise. + * ada/acats-4/tests/c4/c45532d.ada: Likewise. + * ada/acats-4/tests/c4/c45532e.ada: Likewise. + * ada/acats-4/tests/c4/c45532f.ada: Likewise. + * ada/acats-4/tests/c4/c45532g.ada: Likewise. + * ada/acats-4/tests/c4/c45532h.ada: Likewise. + * ada/acats-4/tests/c4/c45532i.ada: Likewise. + * ada/acats-4/tests/c4/c45532j.ada: Likewise. + * ada/acats-4/tests/c4/c45532k.ada: Likewise. + * ada/acats-4/tests/c4/c45532l.ada: Likewise. + * ada/acats-4/tests/c4/c45532m.dep: Likewise. + * ada/acats-4/tests/c4/c45532n.dep: Likewise. + * ada/acats-4/tests/c4/c45532o.dep: Likewise. + * ada/acats-4/tests/c4/c45532p.dep: Likewise. + * ada/acats-4/tests/c4/c45534b.ada: Likewise. + * ada/acats-4/tests/c4/c45536a.dep: Likewise. + * ada/acats-4/tests/c4/c456001.a: Likewise. + * ada/acats-4/tests/c4/c45611a.ada: Likewise. + * ada/acats-4/tests/c4/c45611b.dep: Likewise. + * ada/acats-4/tests/c4/c45611c.dep: Likewise. + * ada/acats-4/tests/c4/c45613a.ada: Likewise. + * ada/acats-4/tests/c4/c45613b.dep: Likewise. + * ada/acats-4/tests/c4/c45613c.dep: Likewise. + * ada/acats-4/tests/c4/c45614a.ada: Likewise. + * ada/acats-4/tests/c4/c45614b.dep: Likewise. + * ada/acats-4/tests/c4/c45614c.dep: Likewise. + * ada/acats-4/tests/c4/c45631a.ada: Likewise. + * ada/acats-4/tests/c4/c45631b.dep: Likewise. + * ada/acats-4/tests/c4/c45631c.dep: Likewise. + * ada/acats-4/tests/c4/c45632a.ada: Likewise. + * ada/acats-4/tests/c4/c45632b.dep: Likewise. + * ada/acats-4/tests/c4/c45632c.dep: Likewise. + * ada/acats-4/tests/c4/c45651a.ada: Likewise. + * ada/acats-4/tests/c4/c45662a.ada: Likewise. + * ada/acats-4/tests/c4/c45662b.ada: Likewise. + * ada/acats-4/tests/c4/c45672a.ada: Likewise. + * ada/acats-4/tests/c4/c457001.a: Likewise. + * ada/acats-4/tests/c4/c457002.a: Likewise. + * ada/acats-4/tests/c4/c457003.a: Likewise. + * ada/acats-4/tests/c4/c457004.a: Likewise. + * ada/acats-4/tests/c4/c457005.a: Likewise. + * ada/acats-4/tests/c4/c457006.a: Likewise. + * ada/acats-4/tests/c4/c457007.a: Likewise. + * ada/acats-4/tests/c4/c458001.a: Likewise. + * ada/acats-4/tests/c4/c458002.a: Likewise. + * ada/acats-4/tests/c4/c458003.a: Likewise. + * ada/acats-4/tests/c4/c458a01.a: Likewise. + * ada/acats-4/tests/c4/c458a02.a: Likewise. + * ada/acats-4/tests/c4/c460001.a: Likewise. + * ada/acats-4/tests/c4/c460002.a: Likewise. + * ada/acats-4/tests/c4/c460004.a: Likewise. + * ada/acats-4/tests/c4/c460005.a: Likewise. + * ada/acats-4/tests/c4/c460006.a: Likewise. + * ada/acats-4/tests/c4/c460007.a: Likewise. + * ada/acats-4/tests/c4/c460008.a: Likewise. + * ada/acats-4/tests/c4/c460009.a: Likewise. + * ada/acats-4/tests/c4/c460010.a: Likewise. + * ada/acats-4/tests/c4/c460011.a: Likewise. + * ada/acats-4/tests/c4/c460012.a: Likewise. + * ada/acats-4/tests/c4/c460013.a: Likewise. + * ada/acats-4/tests/c4/c460014.a: Likewise. + * ada/acats-4/tests/c4/c460015.a: Likewise. + * ada/acats-4/tests/c4/c46011a.ada: Likewise. + * ada/acats-4/tests/c4/c46013a.ada: Likewise. + * ada/acats-4/tests/c4/c46014a.ada: Likewise. + * ada/acats-4/tests/c4/c46021a.ada: Likewise. + * ada/acats-4/tests/c4/c46024a.ada: Likewise. + * ada/acats-4/tests/c4/c46031a.ada: Likewise. + * ada/acats-4/tests/c4/c46032a.ada: Likewise. + * ada/acats-4/tests/c4/c46033a.ada: Likewise. + * ada/acats-4/tests/c4/c46041a.ada: Likewise. + * ada/acats-4/tests/c4/c46042a.ada: Likewise. + * ada/acats-4/tests/c4/c46043b.ada: Likewise. + * ada/acats-4/tests/c4/c46044b.ada: Likewise. + * ada/acats-4/tests/c4/c46051a.ada: Likewise. + * ada/acats-4/tests/c4/c46051b.ada: Likewise. + * ada/acats-4/tests/c4/c46051c.ada: Likewise. + * ada/acats-4/tests/c4/c46052a.ada: Likewise. + * ada/acats-4/tests/c4/c46053a.ada: Likewise. + * ada/acats-4/tests/c4/c46054a.ada: Likewise. + * ada/acats-4/tests/c4/c460a01.a: Likewise. + * ada/acats-4/tests/c4/c460a02.a: Likewise. + * ada/acats-4/tests/c4/c470001.a: Likewise. + * ada/acats-4/tests/c4/c47002a.ada: Likewise. + * ada/acats-4/tests/c4/c47002b.ada: Likewise. + * ada/acats-4/tests/c4/c47002c.ada: Likewise. + * ada/acats-4/tests/c4/c47002d.ada: Likewise. + * ada/acats-4/tests/c4/c47003a.ada: Likewise. + * ada/acats-4/tests/c4/c47004a.ada: Likewise. + * ada/acats-4/tests/c4/c47005a.ada: Likewise. + * ada/acats-4/tests/c4/c47006a.ada: Likewise. + * ada/acats-4/tests/c4/c47007a.ada: Likewise. + * ada/acats-4/tests/c4/c47008a.ada: Likewise. + * ada/acats-4/tests/c4/c47009a.ada: Likewise. + * ada/acats-4/tests/c4/c47009b.ada: Likewise. + * ada/acats-4/tests/c4/c480001.a: Likewise. + * ada/acats-4/tests/c4/c48004a.ada: Likewise. + * ada/acats-4/tests/c4/c48004b.ada: Likewise. + * ada/acats-4/tests/c4/c48004c.ada: Likewise. + * ada/acats-4/tests/c4/c48004d.ada: Likewise. + * ada/acats-4/tests/c4/c48004e.ada: Likewise. + * ada/acats-4/tests/c4/c48004f.ada: Likewise. + * ada/acats-4/tests/c4/c48005a.ada: Likewise. + * ada/acats-4/tests/c4/c48005b.ada: Likewise. + * ada/acats-4/tests/c4/c48006a.ada: Likewise. + * ada/acats-4/tests/c4/c48006b.ada: Likewise. + * ada/acats-4/tests/c4/c48007a.ada: Likewise. + * ada/acats-4/tests/c4/c48007b.ada: Likewise. + * ada/acats-4/tests/c4/c48007c.ada: Likewise. + * ada/acats-4/tests/c4/c48008a.ada: Likewise. + * ada/acats-4/tests/c4/c48008c.ada: Likewise. + * ada/acats-4/tests/c4/c48009a.ada: Likewise. + * ada/acats-4/tests/c4/c48009b.ada: Likewise. + * ada/acats-4/tests/c4/c48009c.ada: Likewise. + * ada/acats-4/tests/c4/c48009d.ada: Likewise. + * ada/acats-4/tests/c4/c48009e.ada: Likewise. + * ada/acats-4/tests/c4/c48009f.ada: Likewise. + * ada/acats-4/tests/c4/c48009g.ada: Likewise. + * ada/acats-4/tests/c4/c48009h.ada: Likewise. + * ada/acats-4/tests/c4/c48009i.ada: Likewise. + * ada/acats-4/tests/c4/c48009j.ada: Likewise. + * ada/acats-4/tests/c4/c48010a.ada: Likewise. + * ada/acats-4/tests/c4/c48011a.ada: Likewise. + * ada/acats-4/tests/c4/c48012a.ada: Likewise. + * ada/acats-4/tests/c4/c490001.a: Likewise. + * ada/acats-4/tests/c4/c490002.a: Likewise. + * ada/acats-4/tests/c4/c490003.a: Likewise. + * ada/acats-4/tests/c4/c49020a.ada: Likewise. + * ada/acats-4/tests/c4/c49021a.ada: Likewise. + * ada/acats-4/tests/c4/c49022a.ada: Likewise. + * ada/acats-4/tests/c4/c49022b.ada: Likewise. + * ada/acats-4/tests/c4/c49022c.ada: Likewise. + * ada/acats-4/tests/c4/c49023a.ada: Likewise. + * ada/acats-4/tests/c4/c49024a.ada: Likewise. + * ada/acats-4/tests/c4/c49025a.ada: Likewise. + * ada/acats-4/tests/c4/c49026a.ada: Likewise. + * ada/acats-4/tests/c4/c4a005b.ada: Likewise. + * ada/acats-4/tests/c4/c4a006a.ada: Likewise. + * ada/acats-4/tests/c4/c4a007a.tst: Likewise. + * ada/acats-4/tests/c4/c4a010a.ada: Likewise. + * ada/acats-4/tests/c4/c4a010b.ada: Likewise. + * ada/acats-4/tests/c4/c4a011a.ada: Likewise. + * ada/acats-4/tests/c4/c4a012b.ada: Likewise. + * ada/acats-4/tests/c4/c4a013a.ada: Likewise. + * ada/acats-4/tests/c4/c4a014a.ada: Likewise. + * ada/acats-4/tests/c5/c51004a.ada: Likewise. + * ada/acats-4/tests/c5/c52005a.ada: Likewise. + * ada/acats-4/tests/c5/c52005b.ada: Likewise. + * ada/acats-4/tests/c5/c52005c.ada: Likewise. + * ada/acats-4/tests/c5/c52005d.ada: Likewise. + * ada/acats-4/tests/c5/c52005e.ada: Likewise. + * ada/acats-4/tests/c5/c52005f.ada: Likewise. + * ada/acats-4/tests/c5/c52008a.ada: Likewise. + * ada/acats-4/tests/c5/c52008b.ada: Likewise. + * ada/acats-4/tests/c5/c52009a.ada: Likewise. + * ada/acats-4/tests/c5/c52009b.ada: Likewise. + * ada/acats-4/tests/c5/c52010a.ada: Likewise. + * ada/acats-4/tests/c5/c52011a.ada: Likewise. + * ada/acats-4/tests/c5/c52011b.ada: Likewise. + * ada/acats-4/tests/c5/c52101a.ada: Likewise. + * ada/acats-4/tests/c5/c52102a.ada: Likewise. + * ada/acats-4/tests/c5/c52102b.ada: Likewise. + * ada/acats-4/tests/c5/c52102c.ada: Likewise. + * ada/acats-4/tests/c5/c52102d.ada: Likewise. + * ada/acats-4/tests/c5/c52103a.ada: Likewise. + * ada/acats-4/tests/c5/c52103b.ada: Likewise. + * ada/acats-4/tests/c5/c52103c.ada: Likewise. + * ada/acats-4/tests/c5/c52103f.ada: Likewise. + * ada/acats-4/tests/c5/c52103g.ada: Likewise. + * ada/acats-4/tests/c5/c52103h.ada: Likewise. + * ada/acats-4/tests/c5/c52103k.ada: Likewise. + * ada/acats-4/tests/c5/c52103l.ada: Likewise. + * ada/acats-4/tests/c5/c52103m.ada: Likewise. + * ada/acats-4/tests/c5/c52103p.ada: Likewise. + * ada/acats-4/tests/c5/c52103q.ada: Likewise. + * ada/acats-4/tests/c5/c52103r.ada: Likewise. + * ada/acats-4/tests/c5/c52103x.ada: Likewise. + * ada/acats-4/tests/c5/c52104a.ada: Likewise. + * ada/acats-4/tests/c5/c52104b.ada: Likewise. + * ada/acats-4/tests/c5/c52104c.ada: Likewise. + * ada/acats-4/tests/c5/c52104f.ada: Likewise. + * ada/acats-4/tests/c5/c52104g.ada: Likewise. + * ada/acats-4/tests/c5/c52104h.ada: Likewise. + * ada/acats-4/tests/c5/c52104k.ada: Likewise. + * ada/acats-4/tests/c5/c52104l.ada: Likewise. + * ada/acats-4/tests/c5/c52104m.ada: Likewise. + * ada/acats-4/tests/c5/c52104p.ada: Likewise. + * ada/acats-4/tests/c5/c52104q.ada: Likewise. + * ada/acats-4/tests/c5/c52104r.ada: Likewise. + * ada/acats-4/tests/c5/c52104x.ada: Likewise. + * ada/acats-4/tests/c5/c52104y.ada: Likewise. + * ada/acats-4/tests/c5/c53007a.ada: Likewise. + * ada/acats-4/tests/c5/c540001.a: Likewise. + * ada/acats-4/tests/c5/c540002.a: Likewise. + * ada/acats-4/tests/c5/c540003.a: Likewise. + * ada/acats-4/tests/c5/c54a03a.ada: Likewise. + * ada/acats-4/tests/c5/c54a04a.ada: Likewise. + * ada/acats-4/tests/c5/c54a07a.ada: Likewise. + * ada/acats-4/tests/c5/c54a13a.ada: Likewise. + * ada/acats-4/tests/c5/c54a13b.ada: Likewise. + * ada/acats-4/tests/c5/c54a13c.ada: Likewise. + * ada/acats-4/tests/c5/c54a13d.ada: Likewise. + * ada/acats-4/tests/c5/c54a22a.ada: Likewise. + * ada/acats-4/tests/c5/c54a23a.ada: Likewise. + * ada/acats-4/tests/c5/c54a24a.ada: Likewise. + * ada/acats-4/tests/c5/c54a24b.ada: Likewise. + * ada/acats-4/tests/c5/c54a42a.ada: Likewise. + * ada/acats-4/tests/c5/c54a42b.ada: Likewise. + * ada/acats-4/tests/c5/c54a42c.ada: Likewise. + * ada/acats-4/tests/c5/c54a42d.ada: Likewise. + * ada/acats-4/tests/c5/c54a42e.ada: Likewise. + * ada/acats-4/tests/c5/c54a42f.ada: Likewise. + * ada/acats-4/tests/c5/c54a42g.ada: Likewise. + * ada/acats-4/tests/c5/c550001.a: Likewise. + * ada/acats-4/tests/c5/c552001.a: Likewise. + * ada/acats-4/tests/c5/c552002.a: Likewise. + * ada/acats-4/tests/c5/c552a01.a: Likewise. + * ada/acats-4/tests/c5/c552a02.a: Likewise. + * ada/acats-4/tests/c5/c55b03a.ada: Likewise. + * ada/acats-4/tests/c5/c55b04a.ada: Likewise. + * ada/acats-4/tests/c5/c55b05a.ada: Likewise. + * ada/acats-4/tests/c5/c55b06a.ada: Likewise. + * ada/acats-4/tests/c5/c55b06b.ada: Likewise. + * ada/acats-4/tests/c5/c55b07a.dep: Likewise. + * ada/acats-4/tests/c5/c55b07b.dep: Likewise. + * ada/acats-4/tests/c5/c55b10a.ada: Likewise. + * ada/acats-4/tests/c5/c55b11a.ada: Likewise. + * ada/acats-4/tests/c5/c55b11b.ada: Likewise. + * ada/acats-4/tests/c5/c55b15a.ada: Likewise. + * ada/acats-4/tests/c5/c55b16a.ada: Likewise. + * ada/acats-4/tests/c5/c55c02a.ada: Likewise. + * ada/acats-4/tests/c5/c55c02b.ada: Likewise. + * ada/acats-4/tests/c5/c56002a.ada: Likewise. + * ada/acats-4/tests/c5/c57003a.ada: Likewise. + * ada/acats-4/tests/c5/c57004a.ada: Likewise. + * ada/acats-4/tests/c5/c57004b.ada: Likewise. + * ada/acats-4/tests/c5/c58004c.ada: Likewise. + * ada/acats-4/tests/c5/c58004d.ada: Likewise. + * ada/acats-4/tests/c5/c58004g.ada: Likewise. + * ada/acats-4/tests/c5/c58005a.ada: Likewise. + * ada/acats-4/tests/c5/c58005b.ada: Likewise. + * ada/acats-4/tests/c5/c58005h.ada: Likewise. + * ada/acats-4/tests/c5/c58006a.ada: Likewise. + * ada/acats-4/tests/c5/c58006b.ada: Likewise. + * ada/acats-4/tests/c5/c59002a.ada: Likewise. + * ada/acats-4/tests/c5/c59002b.ada: Likewise. + * ada/acats-4/tests/c5/c59002c.ada: Likewise. + * ada/acats-4/tests/c6/c61008a.ada: Likewise. + * ada/acats-4/tests/c6/c61009a.ada: Likewise. + * ada/acats-4/tests/c6/c61010a.ada: Likewise. + * ada/acats-4/tests/c6/c611001.a: Likewise. + * ada/acats-4/tests/c6/c611a01.a: Likewise. + * ada/acats-4/tests/c6/c611a020.a: Likewise. + * ada/acats-4/tests/c6/c611a021.a: Likewise. + * ada/acats-4/tests/c6/c611a022.am: Likewise. + * ada/acats-4/tests/c6/c611a030.a: Likewise. + * ada/acats-4/tests/c6/c611a031.a: Likewise. + * ada/acats-4/tests/c6/c611a032.am: Likewise. + * ada/acats-4/tests/c6/c611a040.a: Likewise. + * ada/acats-4/tests/c6/c611a041.a: Likewise. + * ada/acats-4/tests/c6/c611a042.a: Likewise. + * ada/acats-4/tests/c6/c611a043.am: Likewise. + * ada/acats-4/tests/c6/c611b010.a: Likewise. + * ada/acats-4/tests/c6/c611b011.a: Likewise. + * ada/acats-4/tests/c6/c611b012.am: Likewise. + * ada/acats-4/tests/c6/c611b020.a: Likewise. + * ada/acats-4/tests/c6/c611b021.a: Likewise. + * ada/acats-4/tests/c6/c611b022.am: Likewise. + * ada/acats-4/tests/c6/c611b030.a: Likewise. + * ada/acats-4/tests/c6/c611b031.a: Likewise. + * ada/acats-4/tests/c6/c611b032.a: Likewise. + * ada/acats-4/tests/c6/c611b033.am: Likewise. + * ada/acats-4/tests/c6/c620001.a: Likewise. + * ada/acats-4/tests/c6/c620002.a: Likewise. + * ada/acats-4/tests/c6/c62002a.ada: Likewise. + * ada/acats-4/tests/c6/c62003b.ada: Likewise. + * ada/acats-4/tests/c6/c62004a.ada: Likewise. + * ada/acats-4/tests/c6/c62006a.ada: Likewise. + * ada/acats-4/tests/c6/c631001.a: Likewise. + * ada/acats-4/tests/c6/c640001.a: Likewise. + * ada/acats-4/tests/c6/c640002.a: Likewise. + * ada/acats-4/tests/c6/c64002b.ada: Likewise. + * ada/acats-4/tests/c6/c64004g.ada: Likewise. + * ada/acats-4/tests/c6/c64005a.ada: Likewise. + * ada/acats-4/tests/c6/c64005b.ada: Likewise. + * ada/acats-4/tests/c6/c64005c.ada: Likewise. + * ada/acats-4/tests/c6/c64005d0.ada: Likewise. + * ada/acats-4/tests/c6/c64005da.ada: Likewise. + * ada/acats-4/tests/c6/c64005db.ada: Likewise. + * ada/acats-4/tests/c6/c64005dc.ada: Likewise. + * ada/acats-4/tests/c6/c641001.a: Likewise. + * ada/acats-4/tests/c6/c641002.a: Likewise. + * ada/acats-4/tests/c6/c641003.a: Likewise. + * ada/acats-4/tests/c6/c64103b.ada: Likewise. + * ada/acats-4/tests/c6/c64103c.ada: Likewise. + * ada/acats-4/tests/c6/c64103d.ada: Likewise. + * ada/acats-4/tests/c6/c64103e.ada: Likewise. + * ada/acats-4/tests/c6/c64103f.ada: Likewise. + * ada/acats-4/tests/c6/c64104a.ada: Likewise. + * ada/acats-4/tests/c6/c64104b.ada: Likewise. + * ada/acats-4/tests/c6/c64104c.ada: Likewise. + * ada/acats-4/tests/c6/c64104d.ada: Likewise. + * ada/acats-4/tests/c6/c64104e.ada: Likewise. + * ada/acats-4/tests/c6/c64104f.ada: Likewise. + * ada/acats-4/tests/c6/c64104g.ada: Likewise. + * ada/acats-4/tests/c6/c64104h.ada: Likewise. + * ada/acats-4/tests/c6/c64104i.ada: Likewise. + * ada/acats-4/tests/c6/c64104j.ada: Likewise. + * ada/acats-4/tests/c6/c64104k.ada: Likewise. + * ada/acats-4/tests/c6/c64104l.ada: Likewise. + * ada/acats-4/tests/c6/c64104m.ada: Likewise. + * ada/acats-4/tests/c6/c64104n.ada: Likewise. + * ada/acats-4/tests/c6/c64104o.ada: Likewise. + * ada/acats-4/tests/c6/c64105a.ada: Likewise. + * ada/acats-4/tests/c6/c64105b.ada: Likewise. + * ada/acats-4/tests/c6/c64105c.ada: Likewise. + * ada/acats-4/tests/c6/c64105d.ada: Likewise. + * ada/acats-4/tests/c6/c64106a.ada: Likewise. + * ada/acats-4/tests/c6/c64106b.ada: Likewise. + * ada/acats-4/tests/c6/c64106c.ada: Likewise. + * ada/acats-4/tests/c6/c64106d.ada: Likewise. + * ada/acats-4/tests/c6/c64107a.ada: Likewise. + * ada/acats-4/tests/c6/c64108a.ada: Likewise. + * ada/acats-4/tests/c6/c64109a.ada: Likewise. + * ada/acats-4/tests/c6/c64109b.ada: Likewise. + * ada/acats-4/tests/c6/c64109c.ada: Likewise. + * ada/acats-4/tests/c6/c64109d.ada: Likewise. + * ada/acats-4/tests/c6/c64109e.ada: Likewise. + * ada/acats-4/tests/c6/c64109f.ada: Likewise. + * ada/acats-4/tests/c6/c64109g.ada: Likewise. + * ada/acats-4/tests/c6/c64109h.ada: Likewise. + * ada/acats-4/tests/c6/c64109i.ada: Likewise. + * ada/acats-4/tests/c6/c64109j.ada: Likewise. + * ada/acats-4/tests/c6/c64109k.ada: Likewise. + * ada/acats-4/tests/c6/c64109l.ada: Likewise. + * ada/acats-4/tests/c6/c64201b.ada: Likewise. + * ada/acats-4/tests/c6/c64201c.ada: Likewise. + * ada/acats-4/tests/c6/c64202a.ada: Likewise. + * ada/acats-4/tests/c6/c650002.a: Likewise. + * ada/acats-4/tests/c6/c650003.a: Likewise. + * ada/acats-4/tests/c6/c65003a.ada: Likewise. + * ada/acats-4/tests/c6/c65003b.ada: Likewise. + * ada/acats-4/tests/c6/c650a01.a: Likewise. + * ada/acats-4/tests/c6/c650a02.a: Likewise. + * ada/acats-4/tests/c6/c650b01.a: Likewise. + * ada/acats-4/tests/c6/c650b02.a: Likewise. + * ada/acats-4/tests/c6/c650b03.a: Likewise. + * ada/acats-4/tests/c6/c650b04.a: Likewise. + * ada/acats-4/tests/c6/c651001.a: Likewise. + * ada/acats-4/tests/c6/c651002.a: Likewise. + * ada/acats-4/tests/c6/c660001.a: Likewise. + * ada/acats-4/tests/c6/c66002a.ada: Likewise. + * ada/acats-4/tests/c6/c66002c.ada: Likewise. + * ada/acats-4/tests/c6/c66002d.ada: Likewise. + * ada/acats-4/tests/c6/c66002e.ada: Likewise. + * ada/acats-4/tests/c6/c66002f.ada: Likewise. + * ada/acats-4/tests/c6/c66002g.ada: Likewise. + * ada/acats-4/tests/c6/c67002a.ada: Likewise. + * ada/acats-4/tests/c6/c67002b.ada: Likewise. + * ada/acats-4/tests/c6/c67002c.ada: Likewise. + * ada/acats-4/tests/c6/c67002d.ada: Likewise. + * ada/acats-4/tests/c6/c67002e.ada: Likewise. + * ada/acats-4/tests/c6/c67003f.ada: Likewise. + * ada/acats-4/tests/c6/c67005a.ada: Likewise. + * ada/acats-4/tests/c6/c67005b.ada: Likewise. + * ada/acats-4/tests/c6/c67005c.ada: Likewise. + * ada/acats-4/tests/c6/c67005d.ada: Likewise. + * ada/acats-4/tests/c6/c680001.a: Likewise. + * ada/acats-4/tests/c7/c72001b.ada: Likewise. + * ada/acats-4/tests/c7/c72002a.ada: Likewise. + * ada/acats-4/tests/c7/c730001.a: Likewise. + * ada/acats-4/tests/c7/c730002.a: Likewise. + * ada/acats-4/tests/c7/c730003.a: Likewise. + * ada/acats-4/tests/c7/c730004.a: Likewise. + * ada/acats-4/tests/c7/c73002a.ada: Likewise. + * ada/acats-4/tests/c7/c730a01.a: Likewise. + * ada/acats-4/tests/c7/c730a02.a: Likewise. + * ada/acats-4/tests/c7/c731001.a: Likewise. + * ada/acats-4/tests/c7/c7320010.a: Likewise. + * ada/acats-4/tests/c7/c7320011.a: Likewise. + * ada/acats-4/tests/c7/c7320012.am: Likewise. + * ada/acats-4/tests/c7/c732002.a: Likewise. + * ada/acats-4/tests/c7/c732a01.a: Likewise. + * ada/acats-4/tests/c7/c732a02.a: Likewise. + * ada/acats-4/tests/c7/c732b01.a: Likewise. + * ada/acats-4/tests/c7/c732b02.a: Likewise. + * ada/acats-4/tests/c7/c732c01.a: Likewise. + * ada/acats-4/tests/c7/c74004a.ada: Likewise. + * ada/acats-4/tests/c7/c74203a.ada: Likewise. + * ada/acats-4/tests/c7/c74206a.ada: Likewise. + * ada/acats-4/tests/c7/c74207b.ada: Likewise. + * ada/acats-4/tests/c7/c74208a.ada: Likewise. + * ada/acats-4/tests/c7/c74208b.ada: Likewise. + * ada/acats-4/tests/c7/c74209a.ada: Likewise. + * ada/acats-4/tests/c7/c74210a.ada: Likewise. + * ada/acats-4/tests/c7/c74211a.ada: Likewise. + * ada/acats-4/tests/c7/c74211b.ada: Likewise. + * ada/acats-4/tests/c7/c74302a.ada: Likewise. + * ada/acats-4/tests/c7/c74302b.ada: Likewise. + * ada/acats-4/tests/c7/c74305a.ada: Likewise. + * ada/acats-4/tests/c7/c74305b.ada: Likewise. + * ada/acats-4/tests/c7/c74306a.ada: Likewise. + * ada/acats-4/tests/c7/c74307a.ada: Likewise. + * ada/acats-4/tests/c7/c74401d.ada: Likewise. + * ada/acats-4/tests/c7/c74401e.ada: Likewise. + * ada/acats-4/tests/c7/c74401k.ada: Likewise. + * ada/acats-4/tests/c7/c74401q.ada: Likewise. + * ada/acats-4/tests/c7/c74402a.ada: Likewise. + * ada/acats-4/tests/c7/c74402b.ada: Likewise. + * ada/acats-4/tests/c7/c74406a.ada: Likewise. + * ada/acats-4/tests/c7/c74407b.ada: Likewise. + * ada/acats-4/tests/c7/c74409b.ada: Likewise. + * ada/acats-4/tests/c7/c760001.a: Likewise. + * ada/acats-4/tests/c7/c760002.a: Likewise. + * ada/acats-4/tests/c7/c760007.a: Likewise. + * ada/acats-4/tests/c7/c760009.a: Likewise. + * ada/acats-4/tests/c7/c760010.a: Likewise. + * ada/acats-4/tests/c7/c760011.a: Likewise. + * ada/acats-4/tests/c7/c760012.a: Likewise. + * ada/acats-4/tests/c7/c760013.a: Likewise. + * ada/acats-4/tests/c7/c760014.a: Likewise. + * ada/acats-4/tests/c7/c760015.a: Likewise. + * ada/acats-4/tests/c7/c760a01.a: Likewise. + * ada/acats-4/tests/c7/c760a02.a: Likewise. + * ada/acats-4/tests/c7/c760a03.a: Likewise. + * ada/acats-4/tests/c7/c761001.a: Likewise. + * ada/acats-4/tests/c7/c761002.a: Likewise. + * ada/acats-4/tests/c7/c761003.a: Likewise. + * ada/acats-4/tests/c7/c761004.a: Likewise. + * ada/acats-4/tests/c7/c761005.a: Likewise. + * ada/acats-4/tests/c7/c761006.a: Likewise. + * ada/acats-4/tests/c7/c761007.a: Likewise. + * ada/acats-4/tests/c7/c761010.a: Likewise. + * ada/acats-4/tests/c7/c761011.a: Likewise. + * ada/acats-4/tests/c7/c761012.a: Likewise. + * ada/acats-4/tests/c7/c761013.a: Likewise. + * ada/acats-4/tests/c8/c83007a.ada: Likewise. + * ada/acats-4/tests/c8/c83012d.ada: Likewise. + * ada/acats-4/tests/c8/c83022a.ada: Likewise. + * ada/acats-4/tests/c8/c83022g0.ada: Likewise. + * ada/acats-4/tests/c8/c83022g1.ada: Likewise. + * ada/acats-4/tests/c8/c83023a.ada: Likewise. + * ada/acats-4/tests/c8/c83024a.ada: Likewise. + * ada/acats-4/tests/c8/c83024e0.ada: Likewise. + * ada/acats-4/tests/c8/c83024e1.ada: Likewise. + * ada/acats-4/tests/c8/c83025a.ada: Likewise. + * ada/acats-4/tests/c8/c83025c.ada: Likewise. + * ada/acats-4/tests/c8/c83027a.ada: Likewise. + * ada/acats-4/tests/c8/c83027c.ada: Likewise. + * ada/acats-4/tests/c8/c83028a.ada: Likewise. + * ada/acats-4/tests/c8/c83029a.ada: Likewise. + * ada/acats-4/tests/c8/c83030a.ada: Likewise. + * ada/acats-4/tests/c8/c83030c.ada: Likewise. + * ada/acats-4/tests/c8/c83031a.ada: Likewise. + * ada/acats-4/tests/c8/c83031c.ada: Likewise. + * ada/acats-4/tests/c8/c83031e.ada: Likewise. + * ada/acats-4/tests/c8/c83032a.ada: Likewise. + * ada/acats-4/tests/c8/c83033a.ada: Likewise. + * ada/acats-4/tests/c8/c83051a.ada: Likewise. + * ada/acats-4/tests/c8/c831001.a: Likewise. + * ada/acats-4/tests/c8/c83b02a.ada: Likewise. + * ada/acats-4/tests/c8/c83b02b.ada: Likewise. + * ada/acats-4/tests/c8/c83e02a.ada: Likewise. + * ada/acats-4/tests/c8/c83e02b.ada: Likewise. + * ada/acats-4/tests/c8/c83e03a.ada: Likewise. + * ada/acats-4/tests/c8/c83f01a.ada: Likewise. + * ada/acats-4/tests/c8/c83f01b.ada: Likewise. + * ada/acats-4/tests/c8/c83f01c0.ada: Likewise. + * ada/acats-4/tests/c8/c83f01c1.ada: Likewise. + * ada/acats-4/tests/c8/c83f01c2.ada: Likewise. + * ada/acats-4/tests/c8/c83f01d0.ada: Likewise. + * ada/acats-4/tests/c8/c83f01d1.ada: Likewise. + * ada/acats-4/tests/c8/c83f03a.ada: Likewise. + * ada/acats-4/tests/c8/c83f03b.ada: Likewise. + * ada/acats-4/tests/c8/c83f03c0.ada: Likewise. + * ada/acats-4/tests/c8/c83f03c1.ada: Likewise. + * ada/acats-4/tests/c8/c83f03c2.ada: Likewise. + * ada/acats-4/tests/c8/c83f03d0.ada: Likewise. + * ada/acats-4/tests/c8/c83f03d1.ada: Likewise. + * ada/acats-4/tests/c8/c840001.a: Likewise. + * ada/acats-4/tests/c8/c840002.a: Likewise. + * ada/acats-4/tests/c8/c84002a.ada: Likewise. + * ada/acats-4/tests/c8/c84005a.ada: Likewise. + * ada/acats-4/tests/c8/c84008a.ada: Likewise. + * ada/acats-4/tests/c8/c84009a.ada: Likewise. + * ada/acats-4/tests/c8/c85004b.ada: Likewise. + * ada/acats-4/tests/c8/c85005a.ada: Likewise. + * ada/acats-4/tests/c8/c85005b.ada: Likewise. + * ada/acats-4/tests/c8/c85005c.ada: Likewise. + * ada/acats-4/tests/c8/c85005d.ada: Likewise. + * ada/acats-4/tests/c8/c85005e.ada: Likewise. + * ada/acats-4/tests/c8/c85005f.ada: Likewise. + * ada/acats-4/tests/c8/c85005g.ada: Likewise. + * ada/acats-4/tests/c8/c85006a.ada: Likewise. + * ada/acats-4/tests/c8/c85006b.ada: Likewise. + * ada/acats-4/tests/c8/c85006c.ada: Likewise. + * ada/acats-4/tests/c8/c85006d.ada: Likewise. + * ada/acats-4/tests/c8/c85006e.ada: Likewise. + * ada/acats-4/tests/c8/c85006f.ada: Likewise. + * ada/acats-4/tests/c8/c85006g.ada: Likewise. + * ada/acats-4/tests/c8/c85007a.ada: Likewise. + * ada/acats-4/tests/c8/c85007e.ada: Likewise. + * ada/acats-4/tests/c8/c85009a.ada: Likewise. + * ada/acats-4/tests/c8/c85011a.ada: Likewise. + * ada/acats-4/tests/c8/c85013a.ada: Likewise. + * ada/acats-4/tests/c8/c85014a.ada: Likewise. + * ada/acats-4/tests/c8/c85014b.ada: Likewise. + * ada/acats-4/tests/c8/c85014c.ada: Likewise. + * ada/acats-4/tests/c8/c85017a.ada: Likewise. + * ada/acats-4/tests/c8/c85018a.ada: Likewise. + * ada/acats-4/tests/c8/c85018b.ada: Likewise. + * ada/acats-4/tests/c8/c85019a.ada: Likewise. + * ada/acats-4/tests/c8/c851001.a: Likewise. + * ada/acats-4/tests/c8/c851002.a: Likewise. + * ada/acats-4/tests/c8/c854001.a: Likewise. + * ada/acats-4/tests/c8/c854002.a: Likewise. + * ada/acats-4/tests/c8/c854003.a: Likewise. + * ada/acats-4/tests/c8/c86003a.ada: Likewise. + * ada/acats-4/tests/c8/c86004a.ada: Likewise. + * ada/acats-4/tests/c8/c86004b0.ada: Likewise. + * ada/acats-4/tests/c8/c86004b1.ada: Likewise. + * ada/acats-4/tests/c8/c86004b2.ada: Likewise. + * ada/acats-4/tests/c8/c86004c0.ada: Likewise. + * ada/acats-4/tests/c8/c86004c1.ada: Likewise. + * ada/acats-4/tests/c8/c86004c2.ada: Likewise. + * ada/acats-4/tests/c8/c86006i.ada: Likewise. + * ada/acats-4/tests/c8/c86007a.ada: Likewise. + * ada/acats-4/tests/c8/c87a05a.ada: Likewise. + * ada/acats-4/tests/c8/c87a05b.ada: Likewise. + * ada/acats-4/tests/c8/c87b02a.ada: Likewise. + * ada/acats-4/tests/c8/c87b02b.ada: Likewise. + * ada/acats-4/tests/c8/c87b03a.ada: Likewise. + * ada/acats-4/tests/c8/c87b04a.ada: Likewise. + * ada/acats-4/tests/c8/c87b04b.ada: Likewise. + * ada/acats-4/tests/c8/c87b04c.ada: Likewise. + * ada/acats-4/tests/c8/c87b05a.ada: Likewise. + * ada/acats-4/tests/c8/c87b06a.ada: Likewise. + * ada/acats-4/tests/c8/c87b07a.ada: Likewise. + * ada/acats-4/tests/c8/c87b07b.ada: Likewise. + * ada/acats-4/tests/c8/c87b07c.ada: Likewise. + * ada/acats-4/tests/c8/c87b07d.ada: Likewise. + * ada/acats-4/tests/c8/c87b07e.ada: Likewise. + * ada/acats-4/tests/c8/c87b08a.ada: Likewise. + * ada/acats-4/tests/c8/c87b09a.ada: Likewise. + * ada/acats-4/tests/c8/c87b09c.ada: Likewise. + * ada/acats-4/tests/c8/c87b10a.ada: Likewise. + * ada/acats-4/tests/c8/c87b11a.ada: Likewise. + * ada/acats-4/tests/c8/c87b11b.ada: Likewise. + * ada/acats-4/tests/c8/c87b13a.ada: Likewise. + * ada/acats-4/tests/c8/c87b14a.ada: Likewise. + * ada/acats-4/tests/c8/c87b14b.ada: Likewise. + * ada/acats-4/tests/c8/c87b14c.ada: Likewise. + * ada/acats-4/tests/c8/c87b14d.ada: Likewise. + * ada/acats-4/tests/c8/c87b15a.ada: Likewise. + * ada/acats-4/tests/c8/c87b16a.ada: Likewise. + * ada/acats-4/tests/c8/c87b17a.ada: Likewise. + * ada/acats-4/tests/c8/c87b18a.ada: Likewise. + * ada/acats-4/tests/c8/c87b18b.ada: Likewise. + * ada/acats-4/tests/c8/c87b19a.ada: Likewise. + * ada/acats-4/tests/c8/c87b23a.ada: Likewise. + * ada/acats-4/tests/c8/c87b24a.ada: Likewise. + * ada/acats-4/tests/c8/c87b24b.ada: Likewise. + * ada/acats-4/tests/c8/c87b26b.ada: Likewise. + * ada/acats-4/tests/c8/c87b27a.ada: Likewise. + * ada/acats-4/tests/c8/c87b28a.ada: Likewise. + * ada/acats-4/tests/c8/c87b29a.ada: Likewise. + * ada/acats-4/tests/c8/c87b30a.ada: Likewise. + * ada/acats-4/tests/c8/c87b31a.ada: Likewise. + * ada/acats-4/tests/c8/c87b32a.ada: Likewise. + * ada/acats-4/tests/c8/c87b33a.ada: Likewise. + * ada/acats-4/tests/c8/c87b34a.ada: Likewise. + * ada/acats-4/tests/c8/c87b34b.ada: Likewise. + * ada/acats-4/tests/c8/c87b34c.ada: Likewise. + * ada/acats-4/tests/c8/c87b35c.ada: Likewise. + * ada/acats-4/tests/c8/c87b38a.ada: Likewise. + * ada/acats-4/tests/c8/c87b39a.ada: Likewise. + * ada/acats-4/tests/c8/c87b40a.ada: Likewise. + * ada/acats-4/tests/c8/c87b41a.ada: Likewise. + * ada/acats-4/tests/c8/c87b42a.ada: Likewise. + * ada/acats-4/tests/c8/c87b43a.ada: Likewise. + * ada/acats-4/tests/c8/c87b44a.ada: Likewise. + * ada/acats-4/tests/c8/c87b45a.ada: Likewise. + * ada/acats-4/tests/c8/c87b45c.ada: Likewise. + * ada/acats-4/tests/c8/c87b47a.ada: Likewise. + * ada/acats-4/tests/c8/c87b48a.ada: Likewise. + * ada/acats-4/tests/c8/c87b48b.ada: Likewise. + * ada/acats-4/tests/c8/c87b50a.ada: Likewise. + * ada/acats-4/tests/c8/c87b54a.ada: Likewise. + * ada/acats-4/tests/c8/c87b57a.ada: Likewise. + * ada/acats-4/tests/c8/c87b62a.ada: Likewise. + * ada/acats-4/tests/c8/c87b62b.ada: Likewise. + * ada/acats-4/tests/c8/c87b62c.ada: Likewise. + * ada/acats-4/tests/c8/c87b62d.tst: Likewise. + * ada/acats-4/tests/c9/c910001.a: Likewise. + * ada/acats-4/tests/c9/c910002.a: Likewise. + * ada/acats-4/tests/c9/c910003.a: Likewise. + * ada/acats-4/tests/c9/c91004b.ada: Likewise. + * ada/acats-4/tests/c9/c91004c.ada: Likewise. + * ada/acats-4/tests/c9/c91006a.ada: Likewise. + * ada/acats-4/tests/c9/c91007a.ada: Likewise. + * ada/acats-4/tests/c9/c920001.a: Likewise. + * ada/acats-4/tests/c9/c92002a.ada: Likewise. + * ada/acats-4/tests/c9/c92003a.ada: Likewise. + * ada/acats-4/tests/c9/c92005a.ada: Likewise. + * ada/acats-4/tests/c9/c92005b.ada: Likewise. + * ada/acats-4/tests/c9/c92006a.ada: Likewise. + * ada/acats-4/tests/c9/c930001.a: Likewise. + * ada/acats-4/tests/c9/c93001a.ada: Likewise. + * ada/acats-4/tests/c9/c93002a.ada: Likewise. + * ada/acats-4/tests/c9/c93003a.ada: Likewise. + * ada/acats-4/tests/c9/c93004a.ada: Likewise. + * ada/acats-4/tests/c9/c93004b.ada: Likewise. + * ada/acats-4/tests/c9/c93004c.ada: Likewise. + * ada/acats-4/tests/c9/c93004d.ada: Likewise. + * ada/acats-4/tests/c9/c93004f.ada: Likewise. + * ada/acats-4/tests/c9/c93005a.ada: Likewise. + * ada/acats-4/tests/c9/c93005b.ada: Likewise. + * ada/acats-4/tests/c9/c93005c.ada: Likewise. + * ada/acats-4/tests/c9/c93005d.ada: Likewise. + * ada/acats-4/tests/c9/c93005e.ada: Likewise. + * ada/acats-4/tests/c9/c93005f.ada: Likewise. + * ada/acats-4/tests/c9/c93005g.ada: Likewise. + * ada/acats-4/tests/c9/c93005h.ada: Likewise. + * ada/acats-4/tests/c9/c93006a.ada: Likewise. + * ada/acats-4/tests/c9/c93007a.ada: Likewise. + * ada/acats-4/tests/c9/c93008a.ada: Likewise. + * ada/acats-4/tests/c9/c93008b.ada: Likewise. + * ada/acats-4/tests/c9/c940001.a: Likewise. + * ada/acats-4/tests/c9/c940002.a: Likewise. + * ada/acats-4/tests/c9/c940004.a: Likewise. + * ada/acats-4/tests/c9/c940005.a: Likewise. + * ada/acats-4/tests/c9/c940006.a: Likewise. + * ada/acats-4/tests/c9/c940007.a: Likewise. + * ada/acats-4/tests/c9/c940010.a: Likewise. + * ada/acats-4/tests/c9/c940011.a: Likewise. + * ada/acats-4/tests/c9/c940012.a: Likewise. + * ada/acats-4/tests/c9/c940013.a: Likewise. + * ada/acats-4/tests/c9/c940014.a: Likewise. + * ada/acats-4/tests/c9/c940015.a: Likewise. + * ada/acats-4/tests/c9/c940016.a: Likewise. + * ada/acats-4/tests/c9/c940017.a: Likewise. + * ada/acats-4/tests/c9/c94001a.ada: Likewise. + * ada/acats-4/tests/c9/c94001b.ada: Likewise. + * ada/acats-4/tests/c9/c94001c.ada: Likewise. + * ada/acats-4/tests/c9/c94001e.ada: Likewise. + * ada/acats-4/tests/c9/c94001f.ada: Likewise. + * ada/acats-4/tests/c9/c94001g.ada: Likewise. + * ada/acats-4/tests/c9/c94002a.ada: Likewise. + * ada/acats-4/tests/c9/c94002b.ada: Likewise. + * ada/acats-4/tests/c9/c94002d.ada: Likewise. + * ada/acats-4/tests/c9/c94002e.ada: Likewise. + * ada/acats-4/tests/c9/c94002f.ada: Likewise. + * ada/acats-4/tests/c9/c94002g.ada: Likewise. + * ada/acats-4/tests/c9/c94004a.ada: Likewise. + * ada/acats-4/tests/c9/c94004b.ada: Likewise. + * ada/acats-4/tests/c9/c94004c.ada: Likewise. + * ada/acats-4/tests/c9/c94005a.ada: Likewise. + * ada/acats-4/tests/c9/c94005b.ada: Likewise. + * ada/acats-4/tests/c9/c94006a.ada: Likewise. + * ada/acats-4/tests/c9/c94007a.ada: Likewise. + * ada/acats-4/tests/c9/c94007b.ada: Likewise. + * ada/acats-4/tests/c9/c94008a.ada: Likewise. + * ada/acats-4/tests/c9/c94008b.ada: Likewise. + * ada/acats-4/tests/c9/c94008c.ada: Likewise. + * ada/acats-4/tests/c9/c94008d.ada: Likewise. + * ada/acats-4/tests/c9/c94010a.ada: Likewise. + * ada/acats-4/tests/c9/c94011a.ada: Likewise. + * ada/acats-4/tests/c9/c94020a.ada: Likewise. + * ada/acats-4/tests/c9/c940a03.a: Likewise. + * ada/acats-4/tests/c9/c950001.a: Likewise. + * ada/acats-4/tests/c9/c95008a.ada: Likewise. + * ada/acats-4/tests/c9/c95009a.ada: Likewise. + * ada/acats-4/tests/c9/c95010a.ada: Likewise. + * ada/acats-4/tests/c9/c95011a.ada: Likewise. + * ada/acats-4/tests/c9/c95012a.ada: Likewise. + * ada/acats-4/tests/c9/c95021a.ada: Likewise. + * ada/acats-4/tests/c9/c95022a.ada: Likewise. + * ada/acats-4/tests/c9/c95022b.ada: Likewise. + * ada/acats-4/tests/c9/c95033a.ada: Likewise. + * ada/acats-4/tests/c9/c95033b.ada: Likewise. + * ada/acats-4/tests/c9/c95034a.ada: Likewise. + * ada/acats-4/tests/c9/c95034b.ada: Likewise. + * ada/acats-4/tests/c9/c95035a.ada: Likewise. + * ada/acats-4/tests/c9/c95040a.ada: Likewise. + * ada/acats-4/tests/c9/c95040b.ada: Likewise. + * ada/acats-4/tests/c9/c95040c.ada: Likewise. + * ada/acats-4/tests/c9/c95040d.ada: Likewise. + * ada/acats-4/tests/c9/c95041a.ada: Likewise. + * ada/acats-4/tests/c9/c95065a.ada: Likewise. + * ada/acats-4/tests/c9/c95065b.ada: Likewise. + * ada/acats-4/tests/c9/c95065c.ada: Likewise. + * ada/acats-4/tests/c9/c95065d.ada: Likewise. + * ada/acats-4/tests/c9/c95065e.ada: Likewise. + * ada/acats-4/tests/c9/c95065f.ada: Likewise. + * ada/acats-4/tests/c9/c95066a.ada: Likewise. + * ada/acats-4/tests/c9/c95067a.ada: Likewise. + * ada/acats-4/tests/c9/c95071a.ada: Likewise. + * ada/acats-4/tests/c9/c95072b.ada: Likewise. + * ada/acats-4/tests/c9/c95073a.ada: Likewise. + * ada/acats-4/tests/c9/c95074c.ada: Likewise. + * ada/acats-4/tests/c9/c95076a.ada: Likewise. + * ada/acats-4/tests/c9/c95078a.ada: Likewise. + * ada/acats-4/tests/c9/c95080b.ada: Likewise. + * ada/acats-4/tests/c9/c95082g.ada: Likewise. + * ada/acats-4/tests/c9/c95085a.ada: Likewise. + * ada/acats-4/tests/c9/c95085b.ada: Likewise. + * ada/acats-4/tests/c9/c95085c.ada: Likewise. + * ada/acats-4/tests/c9/c95085d.ada: Likewise. + * ada/acats-4/tests/c9/c95085e.ada: Likewise. + * ada/acats-4/tests/c9/c95085f.ada: Likewise. + * ada/acats-4/tests/c9/c95085g.ada: Likewise. + * ada/acats-4/tests/c9/c95085h.ada: Likewise. + * ada/acats-4/tests/c9/c95085i.ada: Likewise. + * ada/acats-4/tests/c9/c95085j.ada: Likewise. + * ada/acats-4/tests/c9/c95085k.ada: Likewise. + * ada/acats-4/tests/c9/c95085l.ada: Likewise. + * ada/acats-4/tests/c9/c95085m.ada: Likewise. + * ada/acats-4/tests/c9/c95085n.ada: Likewise. + * ada/acats-4/tests/c9/c95085o.ada: Likewise. + * ada/acats-4/tests/c9/c95086a.ada: Likewise. + * ada/acats-4/tests/c9/c95086b.ada: Likewise. + * ada/acats-4/tests/c9/c95086c.ada: Likewise. + * ada/acats-4/tests/c9/c95086d.ada: Likewise. + * ada/acats-4/tests/c9/c95086e.ada: Likewise. + * ada/acats-4/tests/c9/c95086f.ada: Likewise. + * ada/acats-4/tests/c9/c95087a.ada: Likewise. + * ada/acats-4/tests/c9/c95087b.ada: Likewise. + * ada/acats-4/tests/c9/c95087c.ada: Likewise. + * ada/acats-4/tests/c9/c95087d.ada: Likewise. + * ada/acats-4/tests/c9/c95088a.ada: Likewise. + * ada/acats-4/tests/c9/c95089a.ada: Likewise. + * ada/acats-4/tests/c9/c95090a.ada: Likewise. + * ada/acats-4/tests/c9/c95092a.ada: Likewise. + * ada/acats-4/tests/c9/c95093a.ada: Likewise. + * ada/acats-4/tests/c9/c95095a.ada: Likewise. + * ada/acats-4/tests/c9/c95095b.ada: Likewise. + * ada/acats-4/tests/c9/c95095c.ada: Likewise. + * ada/acats-4/tests/c9/c95095d.ada: Likewise. + * ada/acats-4/tests/c9/c95095e.ada: Likewise. + * ada/acats-4/tests/c9/c951001.a: Likewise. + * ada/acats-4/tests/c9/c951002.a: Likewise. + * ada/acats-4/tests/c9/c953001.a: Likewise. + * ada/acats-4/tests/c9/c953002.a: Likewise. + * ada/acats-4/tests/c9/c953003.a: Likewise. + * ada/acats-4/tests/c9/c954001.a: Likewise. + * ada/acats-4/tests/c9/c954010.a: Likewise. + * ada/acats-4/tests/c9/c954011.a: Likewise. + * ada/acats-4/tests/c9/c954012.a: Likewise. + * ada/acats-4/tests/c9/c954013.a: Likewise. + * ada/acats-4/tests/c9/c954014.a: Likewise. + * ada/acats-4/tests/c9/c954015.a: Likewise. + * ada/acats-4/tests/c9/c954016.a: Likewise. + * ada/acats-4/tests/c9/c954017.a: Likewise. + * ada/acats-4/tests/c9/c954018.a: Likewise. + * ada/acats-4/tests/c9/c954019.a: Likewise. + * ada/acats-4/tests/c9/c954020.a: Likewise. + * ada/acats-4/tests/c9/c954021.a: Likewise. + * ada/acats-4/tests/c9/c954022.a: Likewise. + * ada/acats-4/tests/c9/c954023.a: Likewise. + * ada/acats-4/tests/c9/c954024.a: Likewise. + * ada/acats-4/tests/c9/c954025.a: Likewise. + * ada/acats-4/tests/c9/c954026.a: Likewise. + * ada/acats-4/tests/c9/c954027.a: Likewise. + * ada/acats-4/tests/c9/c954a01.a: Likewise. + * ada/acats-4/tests/c9/c954a02.a: Likewise. + * ada/acats-4/tests/c9/c954a03.a: Likewise. + * ada/acats-4/tests/c9/c960001.a: Likewise. + * ada/acats-4/tests/c9/c960002.a: Likewise. + * ada/acats-4/tests/c9/c960004.a: Likewise. + * ada/acats-4/tests/c9/c96001a.ada: Likewise. + * ada/acats-4/tests/c9/c96004a.ada: Likewise. + * ada/acats-4/tests/c9/c96005a.ada: Likewise. + * ada/acats-4/tests/c9/c96005b.tst: Likewise. + * ada/acats-4/tests/c9/c96005d.ada: Likewise. + * ada/acats-4/tests/c9/c96005f.ada: Likewise. + * ada/acats-4/tests/c9/c96006a.ada: Likewise. + * ada/acats-4/tests/c9/c96007a.ada: Likewise. + * ada/acats-4/tests/c9/c96008a.ada: Likewise. + * ada/acats-4/tests/c9/c96008b.ada: Likewise. + * ada/acats-4/tests/c9/c961001.a: Likewise. + * ada/acats-4/tests/c9/c97112a.ada: Likewise. + * ada/acats-4/tests/c9/c97113a.ada: Likewise. + * ada/acats-4/tests/c9/c97114a.ada: Likewise. + * ada/acats-4/tests/c9/c97115a.ada: Likewise. + * ada/acats-4/tests/c9/c97116a.ada: Likewise. + * ada/acats-4/tests/c9/c97117a.ada: Likewise. + * ada/acats-4/tests/c9/c97117b.ada: Likewise. + * ada/acats-4/tests/c9/c97117c.ada: Likewise. + * ada/acats-4/tests/c9/c97118a.ada: Likewise. + * ada/acats-4/tests/c9/c97120a.ada: Likewise. + * ada/acats-4/tests/c9/c97120b.ada: Likewise. + * ada/acats-4/tests/c9/c97201a.ada: Likewise. + * ada/acats-4/tests/c9/c97201b.ada: Likewise. + * ada/acats-4/tests/c9/c97201c.ada: Likewise. + * ada/acats-4/tests/c9/c97201d.ada: Likewise. + * ada/acats-4/tests/c9/c97201e.ada: Likewise. + * ada/acats-4/tests/c9/c97201g.ada: Likewise. + * ada/acats-4/tests/c9/c97201h.ada: Likewise. + * ada/acats-4/tests/c9/c97201x.ada: Likewise. + * ada/acats-4/tests/c9/c97202a.ada: Likewise. + * ada/acats-4/tests/c9/c97203a.ada: Likewise. + * ada/acats-4/tests/c9/c97203b.ada: Likewise. + * ada/acats-4/tests/c9/c97203c.ada: Likewise. + * ada/acats-4/tests/c9/c97204a.ada: Likewise. + * ada/acats-4/tests/c9/c97204b.ada: Likewise. + * ada/acats-4/tests/c9/c97205a.ada: Likewise. + * ada/acats-4/tests/c9/c97205b.ada: Likewise. + * ada/acats-4/tests/c9/c97301a.ada: Likewise. + * ada/acats-4/tests/c9/c97301b.ada: Likewise. + * ada/acats-4/tests/c9/c97301c.ada: Likewise. + * ada/acats-4/tests/c9/c97301d.ada: Likewise. + * ada/acats-4/tests/c9/c97301e.ada: Likewise. + * ada/acats-4/tests/c9/c97302a.ada: Likewise. + * ada/acats-4/tests/c9/c97303a.ada: Likewise. + * ada/acats-4/tests/c9/c97303b.ada: Likewise. + * ada/acats-4/tests/c9/c97303c.ada: Likewise. + * ada/acats-4/tests/c9/c97304a.ada: Likewise. + * ada/acats-4/tests/c9/c97304b.ada: Likewise. + * ada/acats-4/tests/c9/c97305a.ada: Likewise. + * ada/acats-4/tests/c9/c97305b.ada: Likewise. + * ada/acats-4/tests/c9/c97305c.ada: Likewise. + * ada/acats-4/tests/c9/c97305d.ada: Likewise. + * ada/acats-4/tests/c9/c97307a.ada: Likewise. + * ada/acats-4/tests/c9/c974001.a: Likewise. + * ada/acats-4/tests/c9/c974002.a: Likewise. + * ada/acats-4/tests/c9/c974003.a: Likewise. + * ada/acats-4/tests/c9/c974004.a: Likewise. + * ada/acats-4/tests/c9/c974005.a: Likewise. + * ada/acats-4/tests/c9/c974006.a: Likewise. + * ada/acats-4/tests/c9/c974007.a: Likewise. + * ada/acats-4/tests/c9/c974008.a: Likewise. + * ada/acats-4/tests/c9/c974009.a: Likewise. + * ada/acats-4/tests/c9/c974010.a: Likewise. + * ada/acats-4/tests/c9/c974011.a: Likewise. + * ada/acats-4/tests/c9/c974012.a: Likewise. + * ada/acats-4/tests/c9/c974013.a: Likewise. + * ada/acats-4/tests/c9/c974014.a: Likewise. + * ada/acats-4/tests/c9/c980001.a: Likewise. + * ada/acats-4/tests/c9/c980002.a: Likewise. + * ada/acats-4/tests/c9/c980003.a: Likewise. + * ada/acats-4/tests/c9/c990001.a: Likewise. + * ada/acats-4/tests/c9/c99005a.ada: Likewise. + * ada/acats-4/tests/c9/c9a003a.ada: Likewise. + * ada/acats-4/tests/c9/c9a004a.ada: Likewise. + * ada/acats-4/tests/c9/c9a007a.ada: Likewise. + * ada/acats-4/tests/c9/c9a009a.ada: Likewise. + * ada/acats-4/tests/c9/c9a009c.ada: Likewise. + * ada/acats-4/tests/c9/c9a009f.ada: Likewise. + * ada/acats-4/tests/c9/c9a009g.ada: Likewise. + * ada/acats-4/tests/c9/c9a009h.ada: Likewise. + * ada/acats-4/tests/c9/c9a010a.ada: Likewise. + * ada/acats-4/tests/c9/c9a011a.ada: Likewise. + * ada/acats-4/tests/c9/c9a011b.ada: Likewise. + * ada/acats-4/tests/ca/ca1003a.ada: Likewise. + * ada/acats-4/tests/ca/ca1004a.ada: Likewise. + * ada/acats-4/tests/ca/ca1005a.ada: Likewise. + * ada/acats-4/tests/ca/ca1006a.ada: Likewise. + * ada/acats-4/tests/ca/ca1011a0.ada: Likewise. + * ada/acats-4/tests/ca/ca1011a1.ada: Likewise. + * ada/acats-4/tests/ca/ca1011a2.ada: Likewise. + * ada/acats-4/tests/ca/ca1011a3.ada: Likewise. + * ada/acats-4/tests/ca/ca1011a4.ada: Likewise. + * ada/acats-4/tests/ca/ca1011a5.ada: Likewise. + * ada/acats-4/tests/ca/ca1011a6.ada: Likewise. + * ada/acats-4/tests/ca/ca1012a0.ada: Likewise. + * ada/acats-4/tests/ca/ca1012a1.ada: Likewise. + * ada/acats-4/tests/ca/ca1012a2.ada: Likewise. + * ada/acats-4/tests/ca/ca1012a3.ada: Likewise. + * ada/acats-4/tests/ca/ca1012a4.ada: Likewise. + * ada/acats-4/tests/ca/ca1012b0.ada: Likewise. + * ada/acats-4/tests/ca/ca1012b2.ada: Likewise. + * ada/acats-4/tests/ca/ca1012b4.ada: Likewise. + * ada/acats-4/tests/ca/ca1013a0.ada: Likewise. + * ada/acats-4/tests/ca/ca1013a1.ada: Likewise. + * ada/acats-4/tests/ca/ca1013a2.ada: Likewise. + * ada/acats-4/tests/ca/ca1013a3.ada: Likewise. + * ada/acats-4/tests/ca/ca1013a4.ada: Likewise. + * ada/acats-4/tests/ca/ca1013a5.ada: Likewise. + * ada/acats-4/tests/ca/ca1013a6.ada: Likewise. + * ada/acats-4/tests/ca/ca1014a0.ada: Likewise. + * ada/acats-4/tests/ca/ca1014a1.ada: Likewise. + * ada/acats-4/tests/ca/ca1014a2.ada: Likewise. + * ada/acats-4/tests/ca/ca1014a3.ada: Likewise. + * ada/acats-4/tests/ca/ca1020e0.ada: Likewise. + * ada/acats-4/tests/ca/ca1020e1.ada: Likewise. + * ada/acats-4/tests/ca/ca1020e2.ada: Likewise. + * ada/acats-4/tests/ca/ca1020e3.ada: Likewise. + * ada/acats-4/tests/ca/ca1022a0.ada: Likewise. + * ada/acats-4/tests/ca/ca1022a1.ada: Likewise. + * ada/acats-4/tests/ca/ca1022a2.ada: Likewise. + * ada/acats-4/tests/ca/ca1022a3.ada: Likewise. + * ada/acats-4/tests/ca/ca1022a4.ada: Likewise. + * ada/acats-4/tests/ca/ca1022a5.ada: Likewise. + * ada/acats-4/tests/ca/ca1022a6.ada: Likewise. + * ada/acats-4/tests/ca/ca11001.a: Likewise. + * ada/acats-4/tests/ca/ca11002.a: Likewise. + * ada/acats-4/tests/ca/ca11003.a: Likewise. + * ada/acats-4/tests/ca/ca110040.a: Likewise. + * ada/acats-4/tests/ca/ca110041.a: Likewise. + * ada/acats-4/tests/ca/ca110042.am: Likewise. + * ada/acats-4/tests/ca/ca110050.a: Likewise. + * ada/acats-4/tests/ca/ca110051.am: Likewise. + * ada/acats-4/tests/ca/ca11006.a: Likewise. + * ada/acats-4/tests/ca/ca11007.a: Likewise. + * ada/acats-4/tests/ca/ca11008.a: Likewise. + * ada/acats-4/tests/ca/ca11009.a: Likewise. + * ada/acats-4/tests/ca/ca11010.a: Likewise. + * ada/acats-4/tests/ca/ca11011.a: Likewise. + * ada/acats-4/tests/ca/ca11012.a: Likewise. + * ada/acats-4/tests/ca/ca11013.a: Likewise. + * ada/acats-4/tests/ca/ca11014.a: Likewise. + * ada/acats-4/tests/ca/ca11015.a: Likewise. + * ada/acats-4/tests/ca/ca11016.a: Likewise. + * ada/acats-4/tests/ca/ca11017.a: Likewise. + * ada/acats-4/tests/ca/ca11018.a: Likewise. + * ada/acats-4/tests/ca/ca11019.a: Likewise. + * ada/acats-4/tests/ca/ca11020.a: Likewise. + * ada/acats-4/tests/ca/ca11021.a: Likewise. + * ada/acats-4/tests/ca/ca11022.a: Likewise. + * ada/acats-4/tests/ca/ca110230.a: Likewise. + * ada/acats-4/tests/ca/ca110231.a: Likewise. + * ada/acats-4/tests/ca/ca110232.am: Likewise. + * ada/acats-4/tests/ca/ca1102a0.ada: Likewise. + * ada/acats-4/tests/ca/ca1102a1.ada: Likewise. + * ada/acats-4/tests/ca/ca1102a2.ada: Likewise. + * ada/acats-4/tests/ca/ca1106a.ada: Likewise. + * ada/acats-4/tests/ca/ca1108a.ada: Likewise. + * ada/acats-4/tests/ca/ca1108b.ada: Likewise. + * ada/acats-4/tests/ca/ca11a01.a: Likewise. + * ada/acats-4/tests/ca/ca11a02.a: Likewise. + * ada/acats-4/tests/ca/ca11b01.a: Likewise. + * ada/acats-4/tests/ca/ca11b02.a: Likewise. + * ada/acats-4/tests/ca/ca11c01.a: Likewise. + * ada/acats-4/tests/ca/ca11c02.a: Likewise. + * ada/acats-4/tests/ca/ca11c03.a: Likewise. + * ada/acats-4/tests/ca/ca11d010.a: Likewise. + * ada/acats-4/tests/ca/ca11d011.a: Likewise. + * ada/acats-4/tests/ca/ca11d012.a: Likewise. + * ada/acats-4/tests/ca/ca11d013.am: Likewise. + * ada/acats-4/tests/ca/ca11d02.a: Likewise. + * ada/acats-4/tests/ca/ca11d03.a: Likewise. + * ada/acats-4/tests/ca/ca120010.a: Likewise. + * ada/acats-4/tests/ca/ca120011.a: Likewise. + * ada/acats-4/tests/ca/ca120012.am: Likewise. + * ada/acats-4/tests/ca/ca12002.a: Likewise. + * ada/acats-4/tests/ca/ca13001.a: Likewise. + * ada/acats-4/tests/ca/ca13002.a: Likewise. + * ada/acats-4/tests/ca/ca13003.a: Likewise. + * ada/acats-4/tests/ca/ca13a01.a: Likewise. + * ada/acats-4/tests/ca/ca13a02.a: Likewise. + * ada/acats-4/tests/ca/ca140230.a: Likewise. + * ada/acats-4/tests/ca/ca140231.a: Likewise. + * ada/acats-4/tests/ca/ca140232.am: Likewise. + * ada/acats-4/tests/ca/ca140233.a: Likewise. + * ada/acats-4/tests/ca/ca140280.a: Likewise. + * ada/acats-4/tests/ca/ca140281.a: Likewise. + * ada/acats-4/tests/ca/ca140282.a: Likewise. + * ada/acats-4/tests/ca/ca140283.am: Likewise. + * ada/acats-4/tests/ca/ca15003.a: Likewise. + * ada/acats-4/tests/ca/ca200020.a: Likewise. + * ada/acats-4/tests/ca/ca200021.a: Likewise. + * ada/acats-4/tests/ca/ca200022.am: Likewise. + * ada/acats-4/tests/ca/ca200030.a: Likewise. + * ada/acats-4/tests/ca/ca200031.am: Likewise. + * ada/acats-4/tests/ca/ca2001h0.ada: Likewise. + * ada/acats-4/tests/ca/ca2001h1.ada: Likewise. + * ada/acats-4/tests/ca/ca2001h2.ada: Likewise. + * ada/acats-4/tests/ca/ca2001h3.ada: Likewise. + * ada/acats-4/tests/ca/ca2002a0.ada: Likewise. + * ada/acats-4/tests/ca/ca2002a1.ada: Likewise. + * ada/acats-4/tests/ca/ca2002a2.ada: Likewise. + * ada/acats-4/tests/ca/ca2003a0.ada: Likewise. + * ada/acats-4/tests/ca/ca2003a1.ada: Likewise. + * ada/acats-4/tests/ca/ca2004a0.ada: Likewise. + * ada/acats-4/tests/ca/ca2004a1.ada: Likewise. + * ada/acats-4/tests/ca/ca2004a2.ada: Likewise. + * ada/acats-4/tests/ca/ca2004a3.ada: Likewise. + * ada/acats-4/tests/ca/ca2004a4.ada: Likewise. + * ada/acats-4/tests/ca/ca2007a0.ada: Likewise. + * ada/acats-4/tests/ca/ca2007a1.ada: Likewise. + * ada/acats-4/tests/ca/ca2007a2.ada: Likewise. + * ada/acats-4/tests/ca/ca2007a3.ada: Likewise. + * ada/acats-4/tests/ca/ca2008a0.ada: Likewise. + * ada/acats-4/tests/ca/ca2008a1.ada: Likewise. + * ada/acats-4/tests/ca/ca2008a2.ada: Likewise. + * ada/acats-4/tests/ca/ca2009a.ada: Likewise. + * ada/acats-4/tests/ca/ca2009c0.ada: Likewise. + * ada/acats-4/tests/ca/ca2009c1.ada: Likewise. + * ada/acats-4/tests/ca/ca2009d.ada: Likewise. + * ada/acats-4/tests/ca/ca2009f0.ada: Likewise. + * ada/acats-4/tests/ca/ca2009f1.ada: Likewise. + * ada/acats-4/tests/ca/ca2009f2.ada: Likewise. + * ada/acats-4/tests/ca/ca2011b.ada: Likewise. + * ada/acats-4/tests/ca/ca21001.a: Likewise. + * ada/acats-4/tests/ca/ca21002.a: Likewise. + * ada/acats-4/tests/ca/ca3011a0.ada: Likewise. + * ada/acats-4/tests/ca/ca3011a1.ada: Likewise. + * ada/acats-4/tests/ca/ca3011a2.ada: Likewise. + * ada/acats-4/tests/ca/ca3011a3.ada: Likewise. + * ada/acats-4/tests/ca/ca3011a4.ada: Likewise. + * ada/acats-4/tests/ca/ca5003a0.ada: Likewise. + * ada/acats-4/tests/ca/ca5003a1.ada: Likewise. + * ada/acats-4/tests/ca/ca5003a2.ada: Likewise. + * ada/acats-4/tests/ca/ca5003a3.ada: Likewise. + * ada/acats-4/tests/ca/ca5003a4.ada: Likewise. + * ada/acats-4/tests/ca/ca5003a5.ada: Likewise. + * ada/acats-4/tests/ca/ca5003a6.ada: Likewise. + * ada/acats-4/tests/ca/ca5003b0.ada: Likewise. + * ada/acats-4/tests/ca/ca5003b1.ada: Likewise. + * ada/acats-4/tests/ca/ca5003b2.ada: Likewise. + * ada/acats-4/tests/ca/ca5003b3.ada: Likewise. + * ada/acats-4/tests/ca/ca5003b4.ada: Likewise. + * ada/acats-4/tests/ca/ca5003b5.ada: Likewise. + * ada/acats-4/tests/ca/ca5004a.ada: Likewise. + * ada/acats-4/tests/ca/ca5004b0.ada: Likewise. + * ada/acats-4/tests/ca/ca5004b1.ada: Likewise. + * ada/acats-4/tests/ca/ca5004b2.ada: Likewise. + * ada/acats-4/tests/ca/ca5006a.ada: Likewise. + * ada/acats-4/tests/cb/cb10002.a: Likewise. + * ada/acats-4/tests/cb/cb1001a.ada: Likewise. + * ada/acats-4/tests/cb/cb1004a.ada: Likewise. + * ada/acats-4/tests/cb/cb1005a.ada: Likewise. + * ada/acats-4/tests/cb/cb1010a.ada: Likewise. + * ada/acats-4/tests/cb/cb1010c.ada: Likewise. + * ada/acats-4/tests/cb/cb1010d.ada: Likewise. + * ada/acats-4/tests/cb/cb20001.a: Likewise. + * ada/acats-4/tests/cb/cb20003.a: Likewise. + * ada/acats-4/tests/cb/cb20004.a: Likewise. + * ada/acats-4/tests/cb/cb20005.a: Likewise. + * ada/acats-4/tests/cb/cb20006.a: Likewise. + * ada/acats-4/tests/cb/cb20007.a: Likewise. + * ada/acats-4/tests/cb/cb2004a.ada: Likewise. + * ada/acats-4/tests/cb/cb2005a.ada: Likewise. + * ada/acats-4/tests/cb/cb2006a.ada: Likewise. + * ada/acats-4/tests/cb/cb2007a.ada: Likewise. + * ada/acats-4/tests/cb/cb20a02.a: Likewise. + * ada/acats-4/tests/cb/cb30001.a: Likewise. + * ada/acats-4/tests/cb/cb30002.a: Likewise. + * ada/acats-4/tests/cb/cb3003a.ada: Likewise. + * ada/acats-4/tests/cb/cb3003b.ada: Likewise. + * ada/acats-4/tests/cb/cb3004a.ada: Likewise. + * ada/acats-4/tests/cb/cb40005.a: Likewise. + * ada/acats-4/tests/cb/cb4001a.ada: Likewise. + * ada/acats-4/tests/cb/cb4002a.ada: Likewise. + * ada/acats-4/tests/cb/cb4003a.ada: Likewise. + * ada/acats-4/tests/cb/cb4004a.ada: Likewise. + * ada/acats-4/tests/cb/cb4005a.ada: Likewise. + * ada/acats-4/tests/cb/cb4006a.ada: Likewise. + * ada/acats-4/tests/cb/cb4007a.ada: Likewise. + * ada/acats-4/tests/cb/cb4008a.ada: Likewise. + * ada/acats-4/tests/cb/cb4009a.ada: Likewise. + * ada/acats-4/tests/cb/cb4013a.ada: Likewise. + * ada/acats-4/tests/cb/cb40a01.a: Likewise. + * ada/acats-4/tests/cb/cb40a020.a: Likewise. + * ada/acats-4/tests/cb/cb40a021.am: Likewise. + * ada/acats-4/tests/cb/cb40a030.a: Likewise. + * ada/acats-4/tests/cb/cb40a031.am: Likewise. + * ada/acats-4/tests/cb/cb40a04.a: Likewise. + * ada/acats-4/tests/cb/cb41001.a: Likewise. + * ada/acats-4/tests/cb/cb41002.a: Likewise. + * ada/acats-4/tests/cb/cb41003.a: Likewise. + * ada/acats-4/tests/cb/cb41004.a: Likewise. + * ada/acats-4/tests/cb/cb42001.a: Likewise. + * ada/acats-4/tests/cb/cb42002.a: Likewise. + * ada/acats-4/tests/cb/cb42003.a: Likewise. + * ada/acats-4/tests/cb/cb50001.a: Likewise. + * ada/acats-4/tests/cb/cb5001a.ada: Likewise. + * ada/acats-4/tests/cb/cb5001b.ada: Likewise. + * ada/acats-4/tests/cb/cb5002a.ada: Likewise. + * ada/acats-4/tests/cc/cc1004a.ada: Likewise. + * ada/acats-4/tests/cc/cc1005b.ada: Likewise. + * ada/acats-4/tests/cc/cc1010a.ada: Likewise. + * ada/acats-4/tests/cc/cc1010b.ada: Likewise. + * ada/acats-4/tests/cc/cc1018a.ada: Likewise. + * ada/acats-4/tests/cc/cc1104c.ada: Likewise. + * ada/acats-4/tests/cc/cc1107b.ada: Likewise. + * ada/acats-4/tests/cc/cc1111a.ada: Likewise. + * ada/acats-4/tests/cc/cc1204a.ada: Likewise. + * ada/acats-4/tests/cc/cc1207b.ada: Likewise. + * ada/acats-4/tests/cc/cc1220a.ada: Likewise. + * ada/acats-4/tests/cc/cc1221a.ada: Likewise. + * ada/acats-4/tests/cc/cc1221b.ada: Likewise. + * ada/acats-4/tests/cc/cc1221c.ada: Likewise. + * ada/acats-4/tests/cc/cc1221d.ada: Likewise. + * ada/acats-4/tests/cc/cc1222a.ada: Likewise. + * ada/acats-4/tests/cc/cc1223a.ada: Likewise. + * ada/acats-4/tests/cc/cc1224a.ada: Likewise. + * ada/acats-4/tests/cc/cc1225a.tst: Likewise. + * ada/acats-4/tests/cc/cc1226b.ada: Likewise. + * ada/acats-4/tests/cc/cc1227a.ada: Likewise. + * ada/acats-4/tests/cc/cc1301a.ada: Likewise. + * ada/acats-4/tests/cc/cc1302a.ada: Likewise. + * ada/acats-4/tests/cc/cc1304a.ada: Likewise. + * ada/acats-4/tests/cc/cc1304b.ada: Likewise. + * ada/acats-4/tests/cc/cc1307a.ada: Likewise. + * ada/acats-4/tests/cc/cc1307b.ada: Likewise. + * ada/acats-4/tests/cc/cc1308a.ada: Likewise. + * ada/acats-4/tests/cc/cc1310a.ada: Likewise. + * ada/acats-4/tests/cc/cc1311a.ada: Likewise. + * ada/acats-4/tests/cc/cc1311b.ada: Likewise. + * ada/acats-4/tests/cc/cc2002a.ada: Likewise. + * ada/acats-4/tests/cc/cc30001.a: Likewise. + * ada/acats-4/tests/cc/cc30002.a: Likewise. + * ada/acats-4/tests/cc/cc30003.a: Likewise. + * ada/acats-4/tests/cc/cc30004.a: Likewise. + * ada/acats-4/tests/cc/cc3004a.ada: Likewise. + * ada/acats-4/tests/cc/cc3007a.ada: Likewise. + * ada/acats-4/tests/cc/cc3007b.ada: Likewise. + * ada/acats-4/tests/cc/cc3011a.ada: Likewise. + * ada/acats-4/tests/cc/cc3011d.ada: Likewise. + * ada/acats-4/tests/cc/cc3012a.ada: Likewise. + * ada/acats-4/tests/cc/cc3015a.ada: Likewise. + * ada/acats-4/tests/cc/cc3016b.ada: Likewise. + * ada/acats-4/tests/cc/cc3016c.ada: Likewise. + * ada/acats-4/tests/cc/cc3016f.ada: Likewise. + * ada/acats-4/tests/cc/cc3016i.ada: Likewise. + * ada/acats-4/tests/cc/cc3017b.ada: Likewise. + * ada/acats-4/tests/cc/cc3019a.ada: Likewise. + * ada/acats-4/tests/cc/cc3019b0.ada: Likewise. + * ada/acats-4/tests/cc/cc3019b1.ada: Likewise. + * ada/acats-4/tests/cc/cc3019b2.ada: Likewise. + * ada/acats-4/tests/cc/cc3019c0.ada: Likewise. + * ada/acats-4/tests/cc/cc3019c1.ada: Likewise. + * ada/acats-4/tests/cc/cc3019c2.ada: Likewise. + * ada/acats-4/tests/cc/cc3106b.ada: Likewise. + * ada/acats-4/tests/cc/cc3120a.ada: Likewise. + * ada/acats-4/tests/cc/cc3120b.ada: Likewise. + * ada/acats-4/tests/cc/cc3121a.ada: Likewise. + * ada/acats-4/tests/cc/cc3123a.ada: Likewise. + * ada/acats-4/tests/cc/cc3125a.ada: Likewise. + * ada/acats-4/tests/cc/cc3125b.ada: Likewise. + * ada/acats-4/tests/cc/cc3125c.ada: Likewise. + * ada/acats-4/tests/cc/cc3125d.ada: Likewise. + * ada/acats-4/tests/cc/cc3126a.ada: Likewise. + * ada/acats-4/tests/cc/cc3127a.ada: Likewise. + * ada/acats-4/tests/cc/cc3128a.ada: Likewise. + * ada/acats-4/tests/cc/cc3203a.ada: Likewise. + * ada/acats-4/tests/cc/cc3207b.ada: Likewise. + * ada/acats-4/tests/cc/cc3220a.ada: Likewise. + * ada/acats-4/tests/cc/cc3221a.ada: Likewise. + * ada/acats-4/tests/cc/cc3222a.ada: Likewise. + * ada/acats-4/tests/cc/cc3223a.ada: Likewise. + * ada/acats-4/tests/cc/cc3224a.ada: Likewise. + * ada/acats-4/tests/cc/cc3225a.ada: Likewise. + * ada/acats-4/tests/cc/cc3230a.ada: Likewise. + * ada/acats-4/tests/cc/cc3231a.ada: Likewise. + * ada/acats-4/tests/cc/cc3232a.ada: Likewise. + * ada/acats-4/tests/cc/cc3233a.ada: Likewise. + * ada/acats-4/tests/cc/cc3234a.ada: Likewise. + * ada/acats-4/tests/cc/cc3235a.ada: Likewise. + * ada/acats-4/tests/cc/cc3236a.ada: Likewise. + * ada/acats-4/tests/cc/cc3240a.ada: Likewise. + * ada/acats-4/tests/cc/cc3305a.ada: Likewise. + * ada/acats-4/tests/cc/cc3305b.ada: Likewise. + * ada/acats-4/tests/cc/cc3305c.ada: Likewise. + * ada/acats-4/tests/cc/cc3305d.ada: Likewise. + * ada/acats-4/tests/cc/cc3601a.ada: Likewise. + * ada/acats-4/tests/cc/cc3601c.ada: Likewise. + * ada/acats-4/tests/cc/cc3602a.ada: Likewise. + * ada/acats-4/tests/cc/cc3603a.ada: Likewise. + * ada/acats-4/tests/cc/cc3605a.ada: Likewise. + * ada/acats-4/tests/cc/cc3606a.ada: Likewise. + * ada/acats-4/tests/cc/cc3606b.ada: Likewise. + * ada/acats-4/tests/cc/cc3607b.ada: Likewise. + * ada/acats-4/tests/cc/cc40001.a: Likewise. + * ada/acats-4/tests/cc/cc50001.a: Likewise. + * ada/acats-4/tests/cc/cc50a01.a: Likewise. + * ada/acats-4/tests/cc/cc50a02.a: Likewise. + * ada/acats-4/tests/cc/cc51001.a: Likewise. + * ada/acats-4/tests/cc/cc51002.a: Likewise. + * ada/acats-4/tests/cc/cc51003.a: Likewise. + * ada/acats-4/tests/cc/cc51004.a: Likewise. + * ada/acats-4/tests/cc/cc51006.a: Likewise. + * ada/acats-4/tests/cc/cc51007.a: Likewise. + * ada/acats-4/tests/cc/cc51008.a: Likewise. + * ada/acats-4/tests/cc/cc51009.a: Likewise. + * ada/acats-4/tests/cc/cc510100.a: Likewise. + * ada/acats-4/tests/cc/cc510101.a: Likewise. + * ada/acats-4/tests/cc/cc510102.a: Likewise. + * ada/acats-4/tests/cc/cc510103.am: Likewise. + * ada/acats-4/tests/cc/cc51011.a: Likewise. + * ada/acats-4/tests/cc/cc51a01.a: Likewise. + * ada/acats-4/tests/cc/cc51b03.a: Likewise. + * ada/acats-4/tests/cc/cc51d01.a: Likewise. + * ada/acats-4/tests/cc/cc51d02.a: Likewise. + * ada/acats-4/tests/cc/cc54001.a: Likewise. + * ada/acats-4/tests/cc/cc54002.a: Likewise. + * ada/acats-4/tests/cc/cc54003.a: Likewise. + * ada/acats-4/tests/cc/cc54004.a: Likewise. + * ada/acats-4/tests/cc/cc60001.a: Likewise. + * ada/acats-4/tests/cc/cc70001.a: Likewise. + * ada/acats-4/tests/cc/cc70002.a: Likewise. + * ada/acats-4/tests/cc/cc70003.a: Likewise. + * ada/acats-4/tests/cc/cc70a01.a: Likewise. + * ada/acats-4/tests/cc/cc70a02.a: Likewise. + * ada/acats-4/tests/cc/cc70b01.a: Likewise. + * ada/acats-4/tests/cc/cc70b02.a: Likewise. + * ada/acats-4/tests/cc/cc70c01.a: Likewise. + * ada/acats-4/tests/cc/cc70c02.a: Likewise. + * ada/acats-4/tests/cd/cd10001.a: Likewise. + * ada/acats-4/tests/cd/cd10002.a: Likewise. + * ada/acats-4/tests/cd/cd1009d.ada: Likewise. + * ada/acats-4/tests/cd/cd1009e.ada: Likewise. + * ada/acats-4/tests/cd/cd1009f.ada: Likewise. + * ada/acats-4/tests/cd/cd1009g.ada: Likewise. + * ada/acats-4/tests/cd/cd1009h.ada: Likewise. + * ada/acats-4/tests/cd/cd1009i.ada: Likewise. + * ada/acats-4/tests/cd/cd1009j.ada: Likewise. + * ada/acats-4/tests/cd/cd1009k.tst: Likewise. + * ada/acats-4/tests/cd/cd1009n.ada: Likewise. + * ada/acats-4/tests/cd/cd1009o.ada: Likewise. + * ada/acats-4/tests/cd/cd1009p.ada: Likewise. + * ada/acats-4/tests/cd/cd1009q.ada: Likewise. + * ada/acats-4/tests/cd/cd1009r.ada: Likewise. + * ada/acats-4/tests/cd/cd1009s.ada: Likewise. + * ada/acats-4/tests/cd/cd1009t.tst: Likewise. + * ada/acats-4/tests/cd/cd1009u.tst: Likewise. + * ada/acats-4/tests/cd/cd1009v.ada: Likewise. + * ada/acats-4/tests/cd/cd1009w.ada: Likewise. + * ada/acats-4/tests/cd/cd1009x.ada: Likewise. + * ada/acats-4/tests/cd/cd1009y.ada: Likewise. + * ada/acats-4/tests/cd/cd1009z.ada: Likewise. + * ada/acats-4/tests/cd/cd11001.a: Likewise. + * ada/acats-4/tests/cd/cd1c03a.ada: Likewise. + * ada/acats-4/tests/cd/cd1c03b.ada: Likewise. + * ada/acats-4/tests/cd/cd1c03c.ada: Likewise. + * ada/acats-4/tests/cd/cd1c03e.tst: Likewise. + * ada/acats-4/tests/cd/cd1c03f.ada: Likewise. + * ada/acats-4/tests/cd/cd1c03g.ada: Likewise. + * ada/acats-4/tests/cd/cd1c03h.ada: Likewise. + * ada/acats-4/tests/cd/cd1c03i.ada: Likewise. + * ada/acats-4/tests/cd/cd1c04a.ada: Likewise. + * ada/acats-4/tests/cd/cd1c04d.ada: Likewise. + * ada/acats-4/tests/cd/cd1c04e.ada: Likewise. + * ada/acats-4/tests/cd/cd1c06a.tst: Likewise. + * ada/acats-4/tests/cd/cd20001.a: Likewise. + * ada/acats-4/tests/cd/cd2a21a.ada: Likewise. + * ada/acats-4/tests/cd/cd2a21e.ada: Likewise. + * ada/acats-4/tests/cd/cd2a22a.ada: Likewise. + * ada/acats-4/tests/cd/cd2a22e.ada: Likewise. + * ada/acats-4/tests/cd/cd2a22i.ada: Likewise. + * ada/acats-4/tests/cd/cd2a22j.ada: Likewise. + * ada/acats-4/tests/cd/cd2a23a.ada: Likewise. + * ada/acats-4/tests/cd/cd2a23e.ada: Likewise. + * ada/acats-4/tests/cd/cd2a24a.ada: Likewise. + * ada/acats-4/tests/cd/cd2a24e.ada: Likewise. + * ada/acats-4/tests/cd/cd2a24i.ada: Likewise. + * ada/acats-4/tests/cd/cd2a24j.ada: Likewise. + * ada/acats-4/tests/cd/cd2a31a.ada: Likewise. + * ada/acats-4/tests/cd/cd2a31e.ada: Likewise. + * ada/acats-4/tests/cd/cd2a32a.ada: Likewise. + * ada/acats-4/tests/cd/cd2a32c.ada: Likewise. + * ada/acats-4/tests/cd/cd2a32e.ada: Likewise. + * ada/acats-4/tests/cd/cd2a32g.ada: Likewise. + * ada/acats-4/tests/cd/cd2a32i.ada: Likewise. + * ada/acats-4/tests/cd/cd2a32j.ada: Likewise. + * ada/acats-4/tests/cd/cd2a51a.ada: Likewise. + * ada/acats-4/tests/cd/cd2a53a.ada: Likewise. + * ada/acats-4/tests/cd/cd2a53e.ada: Likewise. + * ada/acats-4/tests/cd/cd2a83c.tst: Likewise. + * ada/acats-4/tests/cd/cd2a91c.tst: Likewise. + * ada/acats-4/tests/cd/cd2b11b.ada: Likewise. + * ada/acats-4/tests/cd/cd2b11d.ada: Likewise. + * ada/acats-4/tests/cd/cd2b11e.ada: Likewise. + * ada/acats-4/tests/cd/cd2b11f.ada: Likewise. + * ada/acats-4/tests/cd/cd2b16a.ada: Likewise. + * ada/acats-4/tests/cd/cd2c11a.tst: Likewise. + * ada/acats-4/tests/cd/cd2c11d.tst: Likewise. + * ada/acats-4/tests/cd/cd2d11a.ada: Likewise. + * ada/acats-4/tests/cd/cd2d13a.ada: Likewise. + * ada/acats-4/tests/cd/cd30001.a: Likewise. + * ada/acats-4/tests/cd/cd30002.a: Likewise. + * ada/acats-4/tests/cd/cd30003.a: Likewise. + * ada/acats-4/tests/cd/cd30004.a: Likewise. + * ada/acats-4/tests/cd/cd300050.am: Likewise. + * ada/acats-4/tests/cd/cd300051.c: Likewise. + * ada/acats-4/tests/cd/cd30006.a: Likewise. + * ada/acats-4/tests/cd/cd30007.a: Likewise. + * ada/acats-4/tests/cd/cd30008.a: Likewise. + * ada/acats-4/tests/cd/cd30009.a: Likewise. + * ada/acats-4/tests/cd/cd30010.a: Likewise. + * ada/acats-4/tests/cd/cd30011.a: Likewise. + * ada/acats-4/tests/cd/cd30012.a: Likewise. + * ada/acats-4/tests/cd/cd30013.a: Likewise. + * ada/acats-4/tests/cd/cd30014.a: Likewise. + * ada/acats-4/tests/cd/cd3014a.ada: Likewise. + * ada/acats-4/tests/cd/cd3014c.ada: Likewise. + * ada/acats-4/tests/cd/cd3014d.ada: Likewise. + * ada/acats-4/tests/cd/cd3014f.ada: Likewise. + * ada/acats-4/tests/cd/cd3015a.ada: Likewise. + * ada/acats-4/tests/cd/cd3015c.ada: Likewise. + * ada/acats-4/tests/cd/cd3015e.ada: Likewise. + * ada/acats-4/tests/cd/cd3015f.ada: Likewise. + * ada/acats-4/tests/cd/cd3015g.ada: Likewise. + * ada/acats-4/tests/cd/cd3015h.ada: Likewise. + * ada/acats-4/tests/cd/cd3015i.ada: Likewise. + * ada/acats-4/tests/cd/cd3015k.ada: Likewise. + * ada/acats-4/tests/cd/cd3021a.ada: Likewise. + * ada/acats-4/tests/cd/cd40001.a: Likewise. + * ada/acats-4/tests/cd/cd4031a.ada: Likewise. + * ada/acats-4/tests/cd/cd4041a.tst: Likewise. + * ada/acats-4/tests/cd/cd4051a.ada: Likewise. + * ada/acats-4/tests/cd/cd4051b.ada: Likewise. + * ada/acats-4/tests/cd/cd4051c.ada: Likewise. + * ada/acats-4/tests/cd/cd4051d.ada: Likewise. + * ada/acats-4/tests/cd/cd5003a.ada: Likewise. + * ada/acats-4/tests/cd/cd5003b.ada: Likewise. + * ada/acats-4/tests/cd/cd5003c.ada: Likewise. + * ada/acats-4/tests/cd/cd5003d.ada: Likewise. + * ada/acats-4/tests/cd/cd5003e.ada: Likewise. + * ada/acats-4/tests/cd/cd5003f.ada: Likewise. + * ada/acats-4/tests/cd/cd5003g.ada: Likewise. + * ada/acats-4/tests/cd/cd5003h.ada: Likewise. + * ada/acats-4/tests/cd/cd5003i.ada: Likewise. + * ada/acats-4/tests/cd/cd5011a.ada: Likewise. + * ada/acats-4/tests/cd/cd5011c.ada: Likewise. + * ada/acats-4/tests/cd/cd5011e.ada: Likewise. + * ada/acats-4/tests/cd/cd5011g.ada: Likewise. + * ada/acats-4/tests/cd/cd5011i.ada: Likewise. + * ada/acats-4/tests/cd/cd5011k.ada: Likewise. + * ada/acats-4/tests/cd/cd5011m.ada: Likewise. + * ada/acats-4/tests/cd/cd5011q.ada: Likewise. + * ada/acats-4/tests/cd/cd5011s.ada: Likewise. + * ada/acats-4/tests/cd/cd5012a.ada: Likewise. + * ada/acats-4/tests/cd/cd5012b.ada: Likewise. + * ada/acats-4/tests/cd/cd5012e.ada: Likewise. + * ada/acats-4/tests/cd/cd5012f.ada: Likewise. + * ada/acats-4/tests/cd/cd5012i.ada: Likewise. + * ada/acats-4/tests/cd/cd5012m.ada: Likewise. + * ada/acats-4/tests/cd/cd5013a.ada: Likewise. + * ada/acats-4/tests/cd/cd5013c.ada: Likewise. + * ada/acats-4/tests/cd/cd5013e.ada: Likewise. + * ada/acats-4/tests/cd/cd5013g.ada: Likewise. + * ada/acats-4/tests/cd/cd5013i.ada: Likewise. + * ada/acats-4/tests/cd/cd5013k.ada: Likewise. + * ada/acats-4/tests/cd/cd5013m.ada: Likewise. + * ada/acats-4/tests/cd/cd5013o.ada: Likewise. + * ada/acats-4/tests/cd/cd5014a.ada: Likewise. + * ada/acats-4/tests/cd/cd5014c.ada: Likewise. + * ada/acats-4/tests/cd/cd5014e.ada: Likewise. + * ada/acats-4/tests/cd/cd5014g.ada: Likewise. + * ada/acats-4/tests/cd/cd5014i.ada: Likewise. + * ada/acats-4/tests/cd/cd5014k.ada: Likewise. + * ada/acats-4/tests/cd/cd5014m.ada: Likewise. + * ada/acats-4/tests/cd/cd5014o.ada: Likewise. + * ada/acats-4/tests/cd/cd5014t.ada: Likewise. + * ada/acats-4/tests/cd/cd5014v.ada: Likewise. + * ada/acats-4/tests/cd/cd5014x.ada: Likewise. + * ada/acats-4/tests/cd/cd5014y.ada: Likewise. + * ada/acats-4/tests/cd/cd5014z.ada: Likewise. + * ada/acats-4/tests/cd/cd70001.a: Likewise. + * ada/acats-4/tests/cd/cd7002a.ada: Likewise. + * ada/acats-4/tests/cd/cd7007b.ada: Likewise. + * ada/acats-4/tests/cd/cd7101d.ada: Likewise. + * ada/acats-4/tests/cd/cd7101e.dep: Likewise. + * ada/acats-4/tests/cd/cd7101f.dep: Likewise. + * ada/acats-4/tests/cd/cd7101g.tst: Likewise. + * ada/acats-4/tests/cd/cd7103d.ada: Likewise. + * ada/acats-4/tests/cd/cd7202a.ada: Likewise. + * ada/acats-4/tests/cd/cd7204b.ada: Likewise. + * ada/acats-4/tests/cd/cd7204c.ada: Likewise. + * ada/acats-4/tests/cd/cd72a01.a: Likewise. + * ada/acats-4/tests/cd/cd72a02.a: Likewise. + * ada/acats-4/tests/cd/cd7305a.ada: Likewise. + * ada/acats-4/tests/cd/cd90001.a: Likewise. + * ada/acats-4/tests/cd/cd92001.a: Likewise. + * ada/acats-4/tests/cd/cda201a.ada: Likewise. + * ada/acats-4/tests/cd/cda201b.ada: Likewise. + * ada/acats-4/tests/cd/cda201c.ada: Likewise. + * ada/acats-4/tests/cd/cda201e.ada: Likewise. + * ada/acats-4/tests/cd/cdb0001.a: Likewise. + * ada/acats-4/tests/cd/cdb0002.a: Likewise. + * ada/acats-4/tests/cd/cdb0a01.a: Likewise. + * ada/acats-4/tests/cd/cdb0a02.a: Likewise. + * ada/acats-4/tests/cd/cdb3a01.a: Likewise. + * ada/acats-4/tests/cd/cdb4001.a: Likewise. + * ada/acats-4/tests/cd/cdd1001.a: Likewise. + * ada/acats-4/tests/cd/cdd2001.a: Likewise. + * ada/acats-4/tests/cd/cdd2a01.a: Likewise. + * ada/acats-4/tests/cd/cdd2a02.a: Likewise. + * ada/acats-4/tests/cd/cdd2a03.a: Likewise. + * ada/acats-4/tests/cd/cdd2b01.a: Likewise. + * ada/acats-4/tests/cd/cdd2b02.a: Likewise. + * ada/acats-4/tests/cd/cdd2b03.a: Likewise. + * ada/acats-4/tests/cd/cdd2b04.a: Likewise. + * ada/acats-4/tests/cd/cde0001.a: Likewise. + * ada/acats-4/tests/cd/cde0002.a: Likewise. + * ada/acats-4/tests/cd/cde0003.a: Likewise. + * ada/acats-4/tests/ce/ce2102a.ada: Likewise. + * ada/acats-4/tests/ce/ce2102b.ada: Likewise. + * ada/acats-4/tests/ce/ce2102c.tst: Likewise. + * ada/acats-4/tests/ce/ce2102d.ada: Likewise. + * ada/acats-4/tests/ce/ce2102e.ada: Likewise. + * ada/acats-4/tests/ce/ce2102f.ada: Likewise. + * ada/acats-4/tests/ce/ce2102g.ada: Likewise. + * ada/acats-4/tests/ce/ce2102h.tst: Likewise. + * ada/acats-4/tests/ce/ce2102i.ada: Likewise. + * ada/acats-4/tests/ce/ce2102j.ada: Likewise. + * ada/acats-4/tests/ce/ce2102k.ada: Likewise. + * ada/acats-4/tests/ce/ce2102l.ada: Likewise. + * ada/acats-4/tests/ce/ce2102m.ada: Likewise. + * ada/acats-4/tests/ce/ce2102n.ada: Likewise. + * ada/acats-4/tests/ce/ce2102o.ada: Likewise. + * ada/acats-4/tests/ce/ce2102p.ada: Likewise. + * ada/acats-4/tests/ce/ce2102q.ada: Likewise. + * ada/acats-4/tests/ce/ce2102r.ada: Likewise. + * ada/acats-4/tests/ce/ce2102s.ada: Likewise. + * ada/acats-4/tests/ce/ce2102t.ada: Likewise. + * ada/acats-4/tests/ce/ce2102u.ada: Likewise. + * ada/acats-4/tests/ce/ce2102v.ada: Likewise. + * ada/acats-4/tests/ce/ce2102w.ada: Likewise. + * ada/acats-4/tests/ce/ce2102x.ada: Likewise. + * ada/acats-4/tests/ce/ce2102y.ada: Likewise. + * ada/acats-4/tests/ce/ce2103a.tst: Likewise. + * ada/acats-4/tests/ce/ce2103b.tst: Likewise. + * ada/acats-4/tests/ce/ce2103c.ada: Likewise. + * ada/acats-4/tests/ce/ce2103d.ada: Likewise. + * ada/acats-4/tests/ce/ce2104a.ada: Likewise. + * ada/acats-4/tests/ce/ce2104b.ada: Likewise. + * ada/acats-4/tests/ce/ce2104c.ada: Likewise. + * ada/acats-4/tests/ce/ce2104d.ada: Likewise. + * ada/acats-4/tests/ce/ce2106a.ada: Likewise. + * ada/acats-4/tests/ce/ce2106b.ada: Likewise. + * ada/acats-4/tests/ce/ce2108e.ada: Likewise. + * ada/acats-4/tests/ce/ce2108f.ada: Likewise. + * ada/acats-4/tests/ce/ce2108g.ada: Likewise. + * ada/acats-4/tests/ce/ce2108h.ada: Likewise. + * ada/acats-4/tests/ce/ce2109a.ada: Likewise. + * ada/acats-4/tests/ce/ce2109b.ada: Likewise. + * ada/acats-4/tests/ce/ce2109c.ada: Likewise. + * ada/acats-4/tests/ce/ce2110a.ada: Likewise. + * ada/acats-4/tests/ce/ce2110c.ada: Likewise. + * ada/acats-4/tests/ce/ce2111a.ada: Likewise. + * ada/acats-4/tests/ce/ce2111b.ada: Likewise. + * ada/acats-4/tests/ce/ce2111c.ada: Likewise. + * ada/acats-4/tests/ce/ce2111e.ada: Likewise. + * ada/acats-4/tests/ce/ce2111f.ada: Likewise. + * ada/acats-4/tests/ce/ce2111g.ada: Likewise. + * ada/acats-4/tests/ce/ce2111i.ada: Likewise. + * ada/acats-4/tests/ce/ce2201a.ada: Likewise. + * ada/acats-4/tests/ce/ce2201b.ada: Likewise. + * ada/acats-4/tests/ce/ce2201c.ada: Likewise. + * ada/acats-4/tests/ce/ce2201d.dep: Likewise. + * ada/acats-4/tests/ce/ce2201e.dep: Likewise. + * ada/acats-4/tests/ce/ce2201f.ada: Likewise. + * ada/acats-4/tests/ce/ce2201g.ada: Likewise. + * ada/acats-4/tests/ce/ce2201h.ada: Likewise. + * ada/acats-4/tests/ce/ce2201i.ada: Likewise. + * ada/acats-4/tests/ce/ce2201j.ada: Likewise. + * ada/acats-4/tests/ce/ce2201k.ada: Likewise. + * ada/acats-4/tests/ce/ce2201l.ada: Likewise. + * ada/acats-4/tests/ce/ce2201m.ada: Likewise. + * ada/acats-4/tests/ce/ce2201n.ada: Likewise. + * ada/acats-4/tests/ce/ce2202a.ada: Likewise. + * ada/acats-4/tests/ce/ce2203a.tst: Likewise. + * ada/acats-4/tests/ce/ce2204a.ada: Likewise. + * ada/acats-4/tests/ce/ce2204b.ada: Likewise. + * ada/acats-4/tests/ce/ce2204c.ada: Likewise. + * ada/acats-4/tests/ce/ce2204d.ada: Likewise. + * ada/acats-4/tests/ce/ce2205a.ada: Likewise. + * ada/acats-4/tests/ce/ce2206a.ada: Likewise. + * ada/acats-4/tests/ce/ce2208b.ada: Likewise. + * ada/acats-4/tests/ce/ce2401a.ada: Likewise. + * ada/acats-4/tests/ce/ce2401b.ada: Likewise. + * ada/acats-4/tests/ce/ce2401c.ada: Likewise. + * ada/acats-4/tests/ce/ce2401e.ada: Likewise. + * ada/acats-4/tests/ce/ce2401f.ada: Likewise. + * ada/acats-4/tests/ce/ce2401h.ada: Likewise. + * ada/acats-4/tests/ce/ce2401i.ada: Likewise. + * ada/acats-4/tests/ce/ce2401j.ada: Likewise. + * ada/acats-4/tests/ce/ce2401k.ada: Likewise. + * ada/acats-4/tests/ce/ce2401l.ada: Likewise. + * ada/acats-4/tests/ce/ce2402a.ada: Likewise. + * ada/acats-4/tests/ce/ce2403a.tst: Likewise. + * ada/acats-4/tests/ce/ce2404a.ada: Likewise. + * ada/acats-4/tests/ce/ce2404b.ada: Likewise. + * ada/acats-4/tests/ce/ce2405b.ada: Likewise. + * ada/acats-4/tests/ce/ce2406a.ada: Likewise. + * ada/acats-4/tests/ce/ce2407a.ada: Likewise. + * ada/acats-4/tests/ce/ce2407b.ada: Likewise. + * ada/acats-4/tests/ce/ce2408a.ada: Likewise. + * ada/acats-4/tests/ce/ce2408b.ada: Likewise. + * ada/acats-4/tests/ce/ce2409a.ada: Likewise. + * ada/acats-4/tests/ce/ce2409b.ada: Likewise. + * ada/acats-4/tests/ce/ce2410a.ada: Likewise. + * ada/acats-4/tests/ce/ce2410b.ada: Likewise. + * ada/acats-4/tests/ce/ce2411a.ada: Likewise. + * ada/acats-4/tests/ce/ce3002b.tst: Likewise. + * ada/acats-4/tests/ce/ce3002c.tst: Likewise. + * ada/acats-4/tests/ce/ce3002d.ada: Likewise. + * ada/acats-4/tests/ce/ce3002f.ada: Likewise. + * ada/acats-4/tests/ce/ce3102a.ada: Likewise. + * ada/acats-4/tests/ce/ce3102b.tst: Likewise. + * ada/acats-4/tests/ce/ce3102d.ada: Likewise. + * ada/acats-4/tests/ce/ce3102e.ada: Likewise. + * ada/acats-4/tests/ce/ce3102f.ada: Likewise. + * ada/acats-4/tests/ce/ce3102g.ada: Likewise. + * ada/acats-4/tests/ce/ce3102h.ada: Likewise. + * ada/acats-4/tests/ce/ce3102i.ada: Likewise. + * ada/acats-4/tests/ce/ce3102j.ada: Likewise. + * ada/acats-4/tests/ce/ce3102k.ada: Likewise. + * ada/acats-4/tests/ce/ce3103a.ada: Likewise. + * ada/acats-4/tests/ce/ce3104a.ada: Likewise. + * ada/acats-4/tests/ce/ce3104b.ada: Likewise. + * ada/acats-4/tests/ce/ce3104c.ada: Likewise. + * ada/acats-4/tests/ce/ce3106a.ada: Likewise. + * ada/acats-4/tests/ce/ce3106b.ada: Likewise. + * ada/acats-4/tests/ce/ce3107a.tst: Likewise. + * ada/acats-4/tests/ce/ce3107b.ada: Likewise. + * ada/acats-4/tests/ce/ce3108a.ada: Likewise. + * ada/acats-4/tests/ce/ce3108b.ada: Likewise. + * ada/acats-4/tests/ce/ce3110a.ada: Likewise. + * ada/acats-4/tests/ce/ce3112c.ada: Likewise. + * ada/acats-4/tests/ce/ce3112d.ada: Likewise. + * ada/acats-4/tests/ce/ce3114a.ada: Likewise. + * ada/acats-4/tests/ce/ce3115a.ada: Likewise. + * ada/acats-4/tests/ce/ce3201a.ada: Likewise. + * ada/acats-4/tests/ce/ce3202a.ada: Likewise. + * ada/acats-4/tests/ce/ce3206a.ada: Likewise. + * ada/acats-4/tests/ce/ce3207a.ada: Likewise. + * ada/acats-4/tests/ce/ce3301a.ada: Likewise. + * ada/acats-4/tests/ce/ce3302a.ada: Likewise. + * ada/acats-4/tests/ce/ce3303a.ada: Likewise. + * ada/acats-4/tests/ce/ce3304a.tst: Likewise. + * ada/acats-4/tests/ce/ce3305a.ada: Likewise. + * ada/acats-4/tests/ce/ce3306a.ada: Likewise. + * ada/acats-4/tests/ce/ce3401a.ada: Likewise. + * ada/acats-4/tests/ce/ce3402a.ada: Likewise. + * ada/acats-4/tests/ce/ce3402c.ada: Likewise. + * ada/acats-4/tests/ce/ce3402d.ada: Likewise. + * ada/acats-4/tests/ce/ce3402e.ada: Likewise. + * ada/acats-4/tests/ce/ce3403a.ada: Likewise. + * ada/acats-4/tests/ce/ce3403b.ada: Likewise. + * ada/acats-4/tests/ce/ce3403c.ada: Likewise. + * ada/acats-4/tests/ce/ce3403d.ada: Likewise. + * ada/acats-4/tests/ce/ce3403e.ada: Likewise. + * ada/acats-4/tests/ce/ce3403f.ada: Likewise. + * ada/acats-4/tests/ce/ce3404a.ada: Likewise. + * ada/acats-4/tests/ce/ce3404b.ada: Likewise. + * ada/acats-4/tests/ce/ce3404c.ada: Likewise. + * ada/acats-4/tests/ce/ce3404d.ada: Likewise. + * ada/acats-4/tests/ce/ce3405a.ada: Likewise. + * ada/acats-4/tests/ce/ce3405c.ada: Likewise. + * ada/acats-4/tests/ce/ce3405d.ada: Likewise. + * ada/acats-4/tests/ce/ce3406a.ada: Likewise. + * ada/acats-4/tests/ce/ce3406b.ada: Likewise. + * ada/acats-4/tests/ce/ce3406c.ada: Likewise. + * ada/acats-4/tests/ce/ce3406d.ada: Likewise. + * ada/acats-4/tests/ce/ce3407a.ada: Likewise. + * ada/acats-4/tests/ce/ce3407b.ada: Likewise. + * ada/acats-4/tests/ce/ce3407c.ada: Likewise. + * ada/acats-4/tests/ce/ce3408a.ada: Likewise. + * ada/acats-4/tests/ce/ce3408b.ada: Likewise. + * ada/acats-4/tests/ce/ce3408c.ada: Likewise. + * ada/acats-4/tests/ce/ce3409a.ada: Likewise. + * ada/acats-4/tests/ce/ce3409b.ada: Likewise. + * ada/acats-4/tests/ce/ce3409c.ada: Likewise. + * ada/acats-4/tests/ce/ce3409d.ada: Likewise. + * ada/acats-4/tests/ce/ce3409e.ada: Likewise. + * ada/acats-4/tests/ce/ce3410a.ada: Likewise. + * ada/acats-4/tests/ce/ce3410b.ada: Likewise. + * ada/acats-4/tests/ce/ce3410c.ada: Likewise. + * ada/acats-4/tests/ce/ce3410d.ada: Likewise. + * ada/acats-4/tests/ce/ce3410e.ada: Likewise. + * ada/acats-4/tests/ce/ce3411a.ada: Likewise. + * ada/acats-4/tests/ce/ce3411c.ada: Likewise. + * ada/acats-4/tests/ce/ce3412a.ada: Likewise. + * ada/acats-4/tests/ce/ce3413a.ada: Likewise. + * ada/acats-4/tests/ce/ce3413b.ada: Likewise. + * ada/acats-4/tests/ce/ce3413c.ada: Likewise. + * ada/acats-4/tests/ce/ce3414a.ada: Likewise. + * ada/acats-4/tests/ce/ce3601a.ada: Likewise. + * ada/acats-4/tests/ce/ce3602a.ada: Likewise. + * ada/acats-4/tests/ce/ce3602b.ada: Likewise. + * ada/acats-4/tests/ce/ce3602c.ada: Likewise. + * ada/acats-4/tests/ce/ce3602d.ada: Likewise. + * ada/acats-4/tests/ce/ce3603a.ada: Likewise. + * ada/acats-4/tests/ce/ce3604a.ada: Likewise. + * ada/acats-4/tests/ce/ce3604b.ada: Likewise. + * ada/acats-4/tests/ce/ce3605a.ada: Likewise. + * ada/acats-4/tests/ce/ce3605b.ada: Likewise. + * ada/acats-4/tests/ce/ce3605c.ada: Likewise. + * ada/acats-4/tests/ce/ce3605d.ada: Likewise. + * ada/acats-4/tests/ce/ce3605e.ada: Likewise. + * ada/acats-4/tests/ce/ce3606a.ada: Likewise. + * ada/acats-4/tests/ce/ce3606b.ada: Likewise. + * ada/acats-4/tests/ce/ce3701a.ada: Likewise. + * ada/acats-4/tests/ce/ce3704a.ada: Likewise. + * ada/acats-4/tests/ce/ce3704b.ada: Likewise. + * ada/acats-4/tests/ce/ce3704c.ada: Likewise. + * ada/acats-4/tests/ce/ce3704d.ada: Likewise. + * ada/acats-4/tests/ce/ce3704e.ada: Likewise. + * ada/acats-4/tests/ce/ce3704f.ada: Likewise. + * ada/acats-4/tests/ce/ce3704m.ada: Likewise. + * ada/acats-4/tests/ce/ce3704n.ada: Likewise. + * ada/acats-4/tests/ce/ce3704o.ada: Likewise. + * ada/acats-4/tests/ce/ce3705a.ada: Likewise. + * ada/acats-4/tests/ce/ce3705b.ada: Likewise. + * ada/acats-4/tests/ce/ce3705c.ada: Likewise. + * ada/acats-4/tests/ce/ce3705d.ada: Likewise. + * ada/acats-4/tests/ce/ce3705e.ada: Likewise. + * ada/acats-4/tests/ce/ce3706c.ada: Likewise. + * ada/acats-4/tests/ce/ce3706d.ada: Likewise. + * ada/acats-4/tests/ce/ce3706f.ada: Likewise. + * ada/acats-4/tests/ce/ce3706g.ada: Likewise. + * ada/acats-4/tests/ce/ce3707a.ada: Likewise. + * ada/acats-4/tests/ce/ce3708a.ada: Likewise. + * ada/acats-4/tests/ce/ce3801a.ada: Likewise. + * ada/acats-4/tests/ce/ce3801b.ada: Likewise. + * ada/acats-4/tests/ce/ce3804a.ada: Likewise. + * ada/acats-4/tests/ce/ce3804b.ada: Likewise. + * ada/acats-4/tests/ce/ce3804c.ada: Likewise. + * ada/acats-4/tests/ce/ce3804d.ada: Likewise. + * ada/acats-4/tests/ce/ce3804e.ada: Likewise. + * ada/acats-4/tests/ce/ce3804f.ada: Likewise. + * ada/acats-4/tests/ce/ce3804g.ada: Likewise. + * ada/acats-4/tests/ce/ce3804h.ada: Likewise. + * ada/acats-4/tests/ce/ce3804i.ada: Likewise. + * ada/acats-4/tests/ce/ce3804j.ada: Likewise. + * ada/acats-4/tests/ce/ce3804m.ada: Likewise. + * ada/acats-4/tests/ce/ce3804o.ada: Likewise. + * ada/acats-4/tests/ce/ce3804p.ada: Likewise. + * ada/acats-4/tests/ce/ce3805a.ada: Likewise. + * ada/acats-4/tests/ce/ce3805b.ada: Likewise. + * ada/acats-4/tests/ce/ce3806a.ada: Likewise. + * ada/acats-4/tests/ce/ce3806b.ada: Likewise. + * ada/acats-4/tests/ce/ce3806c.ada: Likewise. + * ada/acats-4/tests/ce/ce3806d.ada: Likewise. + * ada/acats-4/tests/ce/ce3806e.ada: Likewise. + * ada/acats-4/tests/ce/ce3806f.ada: Likewise. + * ada/acats-4/tests/ce/ce3806g.ada: Likewise. + * ada/acats-4/tests/ce/ce3806h.ada: Likewise. + * ada/acats-4/tests/ce/ce3809a.ada: Likewise. + * ada/acats-4/tests/ce/ce3809b.ada: Likewise. + * ada/acats-4/tests/ce/ce3810a.ada: Likewise. + * ada/acats-4/tests/ce/ce3810b.ada: Likewise. + * ada/acats-4/tests/ce/ce3815a.ada: Likewise. + * ada/acats-4/tests/ce/ce3901a.ada: Likewise. + * ada/acats-4/tests/ce/ce3902b.ada: Likewise. + * ada/acats-4/tests/ce/ce3904a.ada: Likewise. + * ada/acats-4/tests/ce/ce3904b.ada: Likewise. + * ada/acats-4/tests/ce/ce3905a.ada: Likewise. + * ada/acats-4/tests/ce/ce3905b.ada: Likewise. + * ada/acats-4/tests/ce/ce3905c.ada: Likewise. + * ada/acats-4/tests/ce/ce3905l.ada: Likewise. + * ada/acats-4/tests/ce/ce3906a.ada: Likewise. + * ada/acats-4/tests/ce/ce3906b.ada: Likewise. + * ada/acats-4/tests/ce/ce3906c.ada: Likewise. + * ada/acats-4/tests/ce/ce3906d.ada: Likewise. + * ada/acats-4/tests/ce/ce3906e.ada: Likewise. + * ada/acats-4/tests/ce/ce3906f.ada: Likewise. + * ada/acats-4/tests/ce/ce3907a.ada: Likewise. + * ada/acats-4/tests/ce/ce3908a.ada: Likewise. + * ada/acats-4/tests/cxa/cxa3001.a: Likewise. + * ada/acats-4/tests/cxa/cxa3002.a: Likewise. + * ada/acats-4/tests/cxa/cxa3003.a: Likewise. + * ada/acats-4/tests/cxa/cxa3004.a: Likewise. + * ada/acats-4/tests/cxa/cxa3005.a: Likewise. + * ada/acats-4/tests/cxa/cxa3006.a: Likewise. + * ada/acats-4/tests/cxa/cxa3007.a: Likewise. + * ada/acats-4/tests/cxa/cxa3008.a: Likewise. + * ada/acats-4/tests/cxa/cxa4001.a: Likewise. + * ada/acats-4/tests/cxa/cxa4002.a: Likewise. + * ada/acats-4/tests/cxa/cxa4003.a: Likewise. + * ada/acats-4/tests/cxa/cxa4004.a: Likewise. + * ada/acats-4/tests/cxa/cxa4005.a: Likewise. + * ada/acats-4/tests/cxa/cxa4006.a: Likewise. + * ada/acats-4/tests/cxa/cxa4007.a: Likewise. + * ada/acats-4/tests/cxa/cxa4008.a: Likewise. + * ada/acats-4/tests/cxa/cxa4009.a: Likewise. + * ada/acats-4/tests/cxa/cxa4010.a: Likewise. + * ada/acats-4/tests/cxa/cxa4011.a: Likewise. + * ada/acats-4/tests/cxa/cxa4012.a: Likewise. + * ada/acats-4/tests/cxa/cxa4013.a: Likewise. + * ada/acats-4/tests/cxa/cxa4014.a: Likewise. + * ada/acats-4/tests/cxa/cxa4015.a: Likewise. + * ada/acats-4/tests/cxa/cxa4016.a: Likewise. + * ada/acats-4/tests/cxa/cxa4017.a: Likewise. + * ada/acats-4/tests/cxa/cxa4018.a: Likewise. + * ada/acats-4/tests/cxa/cxa4019.a: Likewise. + * ada/acats-4/tests/cxa/cxa4020.a: Likewise. + * ada/acats-4/tests/cxa/cxa4021.a: Likewise. + * ada/acats-4/tests/cxa/cxa4022.a: Likewise. + * ada/acats-4/tests/cxa/cxa4023.a: Likewise. + * ada/acats-4/tests/cxa/cxa4024.a: Likewise. + * ada/acats-4/tests/cxa/cxa4025.a: Likewise. + * ada/acats-4/tests/cxa/cxa4026.a: Likewise. + * ada/acats-4/tests/cxa/cxa4027.a: Likewise. + * ada/acats-4/tests/cxa/cxa4028.a: Likewise. + * ada/acats-4/tests/cxa/cxa4029.a: Likewise. + * ada/acats-4/tests/cxa/cxa4030.a: Likewise. + * ada/acats-4/tests/cxa/cxa4031.a: Likewise. + * ada/acats-4/tests/cxa/cxa4032.a: Likewise. + * ada/acats-4/tests/cxa/cxa4033.a: Likewise. + * ada/acats-4/tests/cxa/cxa4035.a: Likewise. + * ada/acats-4/tests/cxa/cxa4036.a: Likewise. + * ada/acats-4/tests/cxa/cxa4037.a: Likewise. + * ada/acats-4/tests/cxa/cxa4038.a: Likewise. + * ada/acats-4/tests/cxa/cxa4039.a: Likewise. + * ada/acats-4/tests/cxa/cxa5011.a: Likewise. + * ada/acats-4/tests/cxa/cxa5012.a: Likewise. + * ada/acats-4/tests/cxa/cxa5013.a: Likewise. + * ada/acats-4/tests/cxa/cxa5015.a: Likewise. + * ada/acats-4/tests/cxa/cxa5016.a: Likewise. + * ada/acats-4/tests/cxa/cxa5a01.a: Likewise. + * ada/acats-4/tests/cxa/cxa5a02.a: Likewise. + * ada/acats-4/tests/cxa/cxa5a03.a: Likewise. + * ada/acats-4/tests/cxa/cxa5a04.a: Likewise. + * ada/acats-4/tests/cxa/cxa5a05.a: Likewise. + * ada/acats-4/tests/cxa/cxa5a06.a: Likewise. + * ada/acats-4/tests/cxa/cxa5a07.a: Likewise. + * ada/acats-4/tests/cxa/cxa5a08.a: Likewise. + * ada/acats-4/tests/cxa/cxa5a09.a: Likewise. + * ada/acats-4/tests/cxa/cxa5a10.a: Likewise. + * ada/acats-4/tests/cxa/cxa8001.a: Likewise. + * ada/acats-4/tests/cxa/cxa8002.a: Likewise. + * ada/acats-4/tests/cxa/cxa8003.a: Likewise. + * ada/acats-4/tests/cxa/cxa9001.a: Likewise. + * ada/acats-4/tests/cxa/cxa9002.a: Likewise. + * ada/acats-4/tests/cxa/cxaa001.a: Likewise. + * ada/acats-4/tests/cxa/cxaa002.a: Likewise. + * ada/acats-4/tests/cxa/cxaa003.a: Likewise. + * ada/acats-4/tests/cxa/cxaa004.a: Likewise. + * ada/acats-4/tests/cxa/cxaa005.a: Likewise. + * ada/acats-4/tests/cxa/cxaa006.a: Likewise. + * ada/acats-4/tests/cxa/cxaa007.a: Likewise. + * ada/acats-4/tests/cxa/cxaa008.a: Likewise. + * ada/acats-4/tests/cxa/cxaa009.a: Likewise. + * ada/acats-4/tests/cxa/cxaa010.a: Likewise. + * ada/acats-4/tests/cxa/cxaa011.a: Likewise. + * ada/acats-4/tests/cxa/cxaa012.a: Likewise. + * ada/acats-4/tests/cxa/cxaa013.a: Likewise. + * ada/acats-4/tests/cxa/cxaa014.a: Likewise. + * ada/acats-4/tests/cxa/cxaa015.a: Likewise. + * ada/acats-4/tests/cxa/cxaa016.a: Likewise. + * ada/acats-4/tests/cxa/cxaa017.a: Likewise. + * ada/acats-4/tests/cxa/cxaa018.a: Likewise. + * ada/acats-4/tests/cxa/cxaa019.a: Likewise. + * ada/acats-4/tests/cxa/cxaa020.a: Likewise. + * ada/acats-4/tests/cxa/cxaa021.a: Likewise. + * ada/acats-4/tests/cxa/cxaa022.a: Likewise. + * ada/acats-4/tests/cxa/cxab001.a: Likewise. + * ada/acats-4/tests/cxa/cxab002.au: Likewise. + * ada/acats-4/tests/cxa/cxab003.au: Likewise. + * ada/acats-4/tests/cxa/cxab004.au: Likewise. + * ada/acats-4/tests/cxa/cxab005.au: Likewise. + * ada/acats-4/tests/cxa/cxac001.a: Likewise. + * ada/acats-4/tests/cxa/cxac002.a: Likewise. + * ada/acats-4/tests/cxa/cxac003.a: Likewise. + * ada/acats-4/tests/cxa/cxac004.a: Likewise. + * ada/acats-4/tests/cxa/cxac005.a: Likewise. + * ada/acats-4/tests/cxa/cxac006.a: Likewise. + * ada/acats-4/tests/cxa/cxac007.a: Likewise. + * ada/acats-4/tests/cxa/cxac008.a: Likewise. + * ada/acats-4/tests/cxa/cxac009.a: Likewise. + * ada/acats-4/tests/cxa/cxaca01.a: Likewise. + * ada/acats-4/tests/cxa/cxaca02.a: Likewise. + * ada/acats-4/tests/cxa/cxacb01.a: Likewise. + * ada/acats-4/tests/cxa/cxacb02.a: Likewise. + * ada/acats-4/tests/cxa/cxacc01.a: Likewise. + * ada/acats-4/tests/cxa/cxaf001.a: Likewise. + * ada/acats-4/tests/cxa/cxag001.a: Likewise. + * ada/acats-4/tests/cxa/cxag002.a: Likewise. + * ada/acats-4/tests/cxa/cxag003.a: Likewise. + * ada/acats-4/tests/cxa/cxah001.a: Likewise. + * ada/acats-4/tests/cxa/cxah002.a: Likewise. + * ada/acats-4/tests/cxa/cxah003.a: Likewise. + * ada/acats-4/tests/cxa/cxai001.a: Likewise. + * ada/acats-4/tests/cxa/cxai002.a: Likewise. + * ada/acats-4/tests/cxa/cxai003.a: Likewise. + * ada/acats-4/tests/cxa/cxai004.a: Likewise. + * ada/acats-4/tests/cxa/cxai005.a: Likewise. + * ada/acats-4/tests/cxa/cxai006.a: Likewise. + * ada/acats-4/tests/cxa/cxai007.a: Likewise. + * ada/acats-4/tests/cxa/cxai008.a: Likewise. + * ada/acats-4/tests/cxa/cxai009.a: Likewise. + * ada/acats-4/tests/cxa/cxai010.a: Likewise. + * ada/acats-4/tests/cxa/cxai011.a: Likewise. + * ada/acats-4/tests/cxa/cxai012.a: Likewise. + * ada/acats-4/tests/cxa/cxai013.a: Likewise. + * ada/acats-4/tests/cxa/cxai014.a: Likewise. + * ada/acats-4/tests/cxa/cxai015.a: Likewise. + * ada/acats-4/tests/cxa/cxai016.a: Likewise. + * ada/acats-4/tests/cxa/cxai017.a: Likewise. + * ada/acats-4/tests/cxa/cxai018.a: Likewise. + * ada/acats-4/tests/cxa/cxai019.a: Likewise. + * ada/acats-4/tests/cxa/cxai020.a: Likewise. + * ada/acats-4/tests/cxa/cxai021.a: Likewise. + * ada/acats-4/tests/cxa/cxai022.a: Likewise. + * ada/acats-4/tests/cxa/cxai023.a: Likewise. + * ada/acats-4/tests/cxa/cxai024.a: Likewise. + * ada/acats-4/tests/cxa/cxai025.a: Likewise. + * ada/acats-4/tests/cxa/cxai026.a: Likewise. + * ada/acats-4/tests/cxa/cxai027.a: Likewise. + * ada/acats-4/tests/cxa/cxai028.a: Likewise. + * ada/acats-4/tests/cxa/cxai029.a: Likewise. + * ada/acats-4/tests/cxa/cxai030.a: Likewise. + * ada/acats-4/tests/cxa/cxai031.a: Likewise. + * ada/acats-4/tests/cxa/cxai032.a: Likewise. + * ada/acats-4/tests/cxa/cxai033.a: Likewise. + * ada/acats-4/tests/cxa/cxai034.a: Likewise. + * ada/acats-4/tests/cxa/cxai035.a: Likewise. + * ada/acats-4/tests/cxa/cxai036.a: Likewise. + * ada/acats-4/tests/cxa/cxaia01.a: Likewise. + * ada/acats-4/tests/cxa/cxaia02.a: Likewise. + * ada/acats-4/tests/cxa/cxaia03.a: Likewise. + * ada/acats-4/tests/cxa/cxaia04.a: Likewise. + * ada/acats-4/tests/cxa/cxaia05.a: Likewise. + * ada/acats-4/tests/cxa/cxaia06.a: Likewise. + * ada/acats-4/tests/cxa/cxaia07.a: Likewise. + * ada/acats-4/tests/cxa/cxaia08.a: Likewise. + * ada/acats-4/tests/cxa/cxaia09.a: Likewise. + * ada/acats-4/tests/cxa/cxaia10.a: Likewise. + * ada/acats-4/tests/cxa/cxaia11.a: Likewise. + * ada/acats-4/tests/cxa/cxaia12.a: Likewise. + * ada/acats-4/tests/cxa/cxaia13.a: Likewise. + * ada/acats-4/tests/cxa/cxaia14.a: Likewise. + * ada/acats-4/tests/cxa/cxaib01.a: Likewise. + * ada/acats-4/tests/cxa/cxaib02.a: Likewise. + * ada/acats-4/tests/cxa/cxaib03.a: Likewise. + * ada/acats-4/tests/cxa/cxaib04.a: Likewise. + * ada/acats-4/tests/cxa/cxaib05.a: Likewise. + * ada/acats-4/tests/cxa/cxaib06.a: Likewise. + * ada/acats-4/tests/cxa/cxaib07.a: Likewise. + * ada/acats-4/tests/cxa/cxaib08.a: Likewise. + * ada/acats-4/tests/cxa/cxaj001.a: Likewise. + * ada/acats-4/tests/cxb/cxb2001.a: Likewise. + * ada/acats-4/tests/cxb/cxb2002.a: Likewise. + * ada/acats-4/tests/cxb/cxb2003.a: Likewise. + * ada/acats-4/tests/cxb/cxb3001.a: Likewise. + * ada/acats-4/tests/cxb/cxb3002.a: Likewise. + * ada/acats-4/tests/cxb/cxb3003.a: Likewise. + * ada/acats-4/tests/cxb/cxb30040.c: Likewise. + * ada/acats-4/tests/cxb/cxb30041.am: Likewise. + * ada/acats-4/tests/cxb/cxb3005.a: Likewise. + * ada/acats-4/tests/cxb/cxb30060.c: Likewise. + * ada/acats-4/tests/cxb/cxb30061.am: Likewise. + * ada/acats-4/tests/cxb/cxb3007.a: Likewise. + * ada/acats-4/tests/cxb/cxb3008.a: Likewise. + * ada/acats-4/tests/cxb/cxb3009.a: Likewise. + * ada/acats-4/tests/cxb/cxb3010.a: Likewise. + * ada/acats-4/tests/cxb/cxb3011.a: Likewise. + * ada/acats-4/tests/cxb/cxb3012.a: Likewise. + * ada/acats-4/tests/cxb/cxb30130.c: Likewise. + * ada/acats-4/tests/cxb/cxb30131.c: Likewise. + * ada/acats-4/tests/cxb/cxb30132.am: Likewise. + * ada/acats-4/tests/cxb/cxb3014.a: Likewise. + * ada/acats-4/tests/cxb/cxb3015.a: Likewise. + * ada/acats-4/tests/cxb/cxb3016.a: Likewise. + * ada/acats-4/tests/cxb/cxb30170.c: Likewise. + * ada/acats-4/tests/cxb/cxb30171.a: Likewise. + * ada/acats-4/tests/cxb/cxb30172.am: Likewise. + * ada/acats-4/tests/cxb/cxb30180.c: Likewise. + * ada/acats-4/tests/cxb/cxb30181.a: Likewise. + * ada/acats-4/tests/cxb/cxb30182.am: Likewise. + * ada/acats-4/tests/cxb/cxb3019.a: Likewise. + * ada/acats-4/tests/cxb/cxb3020.a: Likewise. + * ada/acats-4/tests/cxb/cxb3021.a: Likewise. + * ada/acats-4/tests/cxb/cxb3022.a: Likewise. + * ada/acats-4/tests/cxb/cxb30230.c: Likewise. + * ada/acats-4/tests/cxb/cxb30231.am: Likewise. + * ada/acats-4/tests/cxb/cxb30240.c: Likewise. + * ada/acats-4/tests/cxb/cxb30241.am: Likewise. + * ada/acats-4/tests/cxb/cxb4001.a: Likewise. + * ada/acats-4/tests/cxb/cxb4002.a: Likewise. + * ada/acats-4/tests/cxb/cxb4003.a: Likewise. + * ada/acats-4/tests/cxb/cxb4004.a: Likewise. + * ada/acats-4/tests/cxb/cxb4005.a: Likewise. + * ada/acats-4/tests/cxb/cxb4006.a: Likewise. + * ada/acats-4/tests/cxb/cxb4007.a: Likewise. + * ada/acats-4/tests/cxb/cxb4008.a: Likewise. + * ada/acats-4/tests/cxb/cxb5001.a: Likewise. + * ada/acats-4/tests/cxb/cxb5002.a: Likewise. + * ada/acats-4/tests/cxb/cxb5003.a: Likewise. + * ada/acats-4/tests/cxf/cxf1001.a: Likewise. + * ada/acats-4/tests/cxf/cxf2001.a: Likewise. + * ada/acats-4/tests/cxf/cxf2002.a: Likewise. + * ada/acats-4/tests/cxf/cxf2003.a: Likewise. + * ada/acats-4/tests/cxf/cxf2004.a: Likewise. + * ada/acats-4/tests/cxf/cxf2005.a: Likewise. + * ada/acats-4/tests/cxf/cxf2a01.a: Likewise. + * ada/acats-4/tests/cxf/cxf2a02.a: Likewise. + * ada/acats-4/tests/cxf/cxf3001.a: Likewise. + * ada/acats-4/tests/cxf/cxf3002.a: Likewise. + * ada/acats-4/tests/cxf/cxf3003.a: Likewise. + * ada/acats-4/tests/cxf/cxf3004.a: Likewise. + * ada/acats-4/tests/cxf/cxf3a01.a: Likewise. + * ada/acats-4/tests/cxf/cxf3a02.a: Likewise. + * ada/acats-4/tests/cxf/cxf3a03.a: Likewise. + * ada/acats-4/tests/cxf/cxf3a04.a: Likewise. + * ada/acats-4/tests/cxf/cxf3a05.a: Likewise. + * ada/acats-4/tests/cxf/cxf3a06.a: Likewise. + * ada/acats-4/tests/cxf/cxf3a07.a: Likewise. + * ada/acats-4/tests/cxf/cxf3a08.a: Likewise. + * ada/acats-4/tests/cxg/cxg1001.a: Likewise. + * ada/acats-4/tests/cxg/cxg1002.a: Likewise. + * ada/acats-4/tests/cxg/cxg1003.a: Likewise. + * ada/acats-4/tests/cxg/cxg1004.a: Likewise. + * ada/acats-4/tests/cxg/cxg1005.a: Likewise. + * ada/acats-4/tests/cxg/cxg2001.a: Likewise. + * ada/acats-4/tests/cxg/cxg2002.a: Likewise. + * ada/acats-4/tests/cxg/cxg2003.a: Likewise. + * ada/acats-4/tests/cxg/cxg2004.a: Likewise. + * ada/acats-4/tests/cxg/cxg2005.a: Likewise. + * ada/acats-4/tests/cxg/cxg2006.a: Likewise. + * ada/acats-4/tests/cxg/cxg2007.a: Likewise. + * ada/acats-4/tests/cxg/cxg2008.a: Likewise. + * ada/acats-4/tests/cxg/cxg2009.a: Likewise. + * ada/acats-4/tests/cxg/cxg2010.a: Likewise. + * ada/acats-4/tests/cxg/cxg2011.a: Likewise. + * ada/acats-4/tests/cxg/cxg2012.a: Likewise. + * ada/acats-4/tests/cxg/cxg2013.a: Likewise. + * ada/acats-4/tests/cxg/cxg2014.a: Likewise. + * ada/acats-4/tests/cxg/cxg2015.a: Likewise. + * ada/acats-4/tests/cxg/cxg2016.a: Likewise. + * ada/acats-4/tests/cxg/cxg2017.a: Likewise. + * ada/acats-4/tests/cxg/cxg2018.a: Likewise. + * ada/acats-4/tests/cxg/cxg2019.a: Likewise. + * ada/acats-4/tests/cxg/cxg2020.a: Likewise. + * ada/acats-4/tests/cxg/cxg2021.a: Likewise. + * ada/acats-4/tests/cxg/cxg2022.a: Likewise. + * ada/acats-4/tests/cxg/cxg2023.a: Likewise. + * ada/acats-4/tests/cxg/cxg2024.a: Likewise. + * ada/acats-4/tests/cxh/cxh3001.a: Likewise. + * ada/acats-4/tests/cxh/cxh3002.a: Likewise. + * ada/acats-4/tests/cxh/cxh30030.a: Likewise. + * ada/acats-4/tests/cxh/cxh30031.am: Likewise. + * ada/acats-4/tests/cz/cz1101a.ada: Likewise. + * ada/acats-4/tests/cz/cz1102a.ada: Likewise. + * ada/acats-4/tests/cz/cz1103a.ada: Likewise. + * ada/acats-4/tests/d/d4a002a.ada: Likewise. + * ada/acats-4/tests/d/d4a002b.ada: Likewise. + * ada/acats-4/tests/d/d4a004a.ada: Likewise. + * ada/acats-4/tests/d/d4a004b.ada: Likewise. + * ada/acats-4/tests/e/e28002b.ada: Likewise. + * ada/acats-4/tests/e/e28005d.ada: Likewise. + * ada/acats-4/tests/e/e52103y.ada: Likewise. + * ada/acats-4/tests/e/eb4011a.ada: Likewise. + * ada/acats-4/tests/e/eb4012a.ada: Likewise. + * ada/acats-4/tests/e/eb4014a.ada: Likewise. + * ada/acats-4/tests/e/ee3203a.ada: Likewise. + * ada/acats-4/tests/e/ee3204a.ada: Likewise. + * ada/acats-4/tests/e/ee3402b.ada: Likewise. + * ada/acats-4/tests/e/ee3409f.ada: Likewise. + * ada/acats-4/tests/e/ee3412c.ada: Likewise. + * ada/acats-4/tests/l/la140010.a: Likewise. + * ada/acats-4/tests/l/la140011.am: Likewise. + * ada/acats-4/tests/l/la140012.a: Likewise. + * ada/acats-4/tests/l/la140020.a: Likewise. + * ada/acats-4/tests/l/la140021.am: Likewise. + * ada/acats-4/tests/l/la140022.a: Likewise. + * ada/acats-4/tests/l/la140030.a: Likewise. + * ada/acats-4/tests/l/la140031.a: Likewise. + * ada/acats-4/tests/l/la140032.am: Likewise. + * ada/acats-4/tests/l/la140033.a: Likewise. + * ada/acats-4/tests/l/la140040.a: Likewise. + * ada/acats-4/tests/l/la140041.am: Likewise. + * ada/acats-4/tests/l/la140042.a: Likewise. + * ada/acats-4/tests/l/la140050.a: Likewise. + * ada/acats-4/tests/l/la140051.a: Likewise. + * ada/acats-4/tests/l/la140052.am: Likewise. + * ada/acats-4/tests/l/la140053.a: Likewise. + * ada/acats-4/tests/l/la140060.a: Likewise. + * ada/acats-4/tests/l/la140061.a: Likewise. + * ada/acats-4/tests/l/la140062.am: Likewise. + * ada/acats-4/tests/l/la140063.a: Likewise. + * ada/acats-4/tests/l/la140070.a: Likewise. + * ada/acats-4/tests/l/la140071.a: Likewise. + * ada/acats-4/tests/l/la140072.am: Likewise. + * ada/acats-4/tests/l/la140073.a: Likewise. + * ada/acats-4/tests/l/la140080.a: Likewise. + * ada/acats-4/tests/l/la140081.a: Likewise. + * ada/acats-4/tests/l/la140082.am: Likewise. + * ada/acats-4/tests/l/la140083.a: Likewise. + * ada/acats-4/tests/l/la140090.a: Likewise. + * ada/acats-4/tests/l/la140091.a: Likewise. + * ada/acats-4/tests/l/la140092.am: Likewise. + * ada/acats-4/tests/l/la140093.a: Likewise. + * ada/acats-4/tests/l/la140100.a: Likewise. + * ada/acats-4/tests/l/la140101.a: Likewise. + * ada/acats-4/tests/l/la140102.am: Likewise. + * ada/acats-4/tests/l/la140103.a: Likewise. + * ada/acats-4/tests/l/la140110.a: Likewise. + * ada/acats-4/tests/l/la140111.a: Likewise. + * ada/acats-4/tests/l/la140112.am: Likewise. + * ada/acats-4/tests/l/la140113.a: Likewise. + * ada/acats-4/tests/l/la140120.a: Likewise. + * ada/acats-4/tests/l/la140121.a: Likewise. + * ada/acats-4/tests/l/la140122.am: Likewise. + * ada/acats-4/tests/l/la140123.a: Likewise. + * ada/acats-4/tests/l/la140130.a: Likewise. + * ada/acats-4/tests/l/la140131.a: Likewise. + * ada/acats-4/tests/l/la140132.am: Likewise. + * ada/acats-4/tests/l/la140133.a: Likewise. + * ada/acats-4/tests/l/la140140.a: Likewise. + * ada/acats-4/tests/l/la140141.a: Likewise. + * ada/acats-4/tests/l/la140142.am: Likewise. + * ada/acats-4/tests/l/la140143.a: Likewise. + * ada/acats-4/tests/l/la140150.a: Likewise. + * ada/acats-4/tests/l/la140151.a: Likewise. + * ada/acats-4/tests/l/la140152.am: Likewise. + * ada/acats-4/tests/l/la140153.a: Likewise. + * ada/acats-4/tests/l/la140160.a: Likewise. + * ada/acats-4/tests/l/la140161.a: Likewise. + * ada/acats-4/tests/l/la140162.am: Likewise. + * ada/acats-4/tests/l/la140163.a: Likewise. + * ada/acats-4/tests/l/la140170.a: Likewise. + * ada/acats-4/tests/l/la140171.a: Likewise. + * ada/acats-4/tests/l/la140172.am: Likewise. + * ada/acats-4/tests/l/la140173.a: Likewise. + * ada/acats-4/tests/l/la140180.a: Likewise. + * ada/acats-4/tests/l/la140181.a: Likewise. + * ada/acats-4/tests/l/la140182.am: Likewise. + * ada/acats-4/tests/l/la140183.a: Likewise. + * ada/acats-4/tests/l/la140190.a: Likewise. + * ada/acats-4/tests/l/la140191.a: Likewise. + * ada/acats-4/tests/l/la140192.am: Likewise. + * ada/acats-4/tests/l/la140193.a: Likewise. + * ada/acats-4/tests/l/la140200.a: Likewise. + * ada/acats-4/tests/l/la140201.a: Likewise. + * ada/acats-4/tests/l/la140202.am: Likewise. + * ada/acats-4/tests/l/la140203.a: Likewise. + * ada/acats-4/tests/l/la140210.a: Likewise. + * ada/acats-4/tests/l/la140211.am: Likewise. + * ada/acats-4/tests/l/la140212.a: Likewise. + * ada/acats-4/tests/l/la140220.a: Likewise. + * ada/acats-4/tests/l/la140221.am: Likewise. + * ada/acats-4/tests/l/la140222.a: Likewise. + * ada/acats-4/tests/l/la140240.a: Likewise. + * ada/acats-4/tests/l/la140241.a: Likewise. + * ada/acats-4/tests/l/la140242.am: Likewise. + * ada/acats-4/tests/l/la140243.a: Likewise. + * ada/acats-4/tests/l/la140250.a: Likewise. + * ada/acats-4/tests/l/la140251.am: Likewise. + * ada/acats-4/tests/l/la140252.a: Likewise. + * ada/acats-4/tests/l/la140260.a: Likewise. + * ada/acats-4/tests/l/la140261.a: Likewise. + * ada/acats-4/tests/l/la140262.am: Likewise. + * ada/acats-4/tests/l/la140263.a: Likewise. + * ada/acats-4/tests/l/la140270.a: Likewise. + * ada/acats-4/tests/l/la140271.a: Likewise. + * ada/acats-4/tests/l/la140272.am: Likewise. + * ada/acats-4/tests/l/la140273.a: Likewise. + +2025-05-24 Eric Botcazou <ebotcazou@adacore.com> + + * ada/acats-3/elabd.lst: New file. + * ada/acats-3/floatstore.lst: Likewise. + * ada/acats-3/norun.lst: Likewise. + * ada/acats-3/run_acats.sh: Likewise. + * ada/acats-3/run_all.sh: Likewise. + * ada/acats-3/run_test.exp: Likewise. + * ada/acats-3/stackcheck.lst: Likewise. + * ada/acats-3/support/acats31.lst: Likewise. + * ada/acats-3/support/checkfil.ada: Likewise. + * ada/acats-3/support/enumchek.ada: Likewise. + * ada/acats-3/support/f340a000.a: Likewise. + * ada/acats-3/support/f340a001.a: Likewise. + * ada/acats-3/support/f341a00.a: Likewise. + * ada/acats-3/support/f390a00.a: Likewise. + * ada/acats-3/support/f392a00.a: Likewise. + * ada/acats-3/support/f392c00.a: Likewise. + * ada/acats-3/support/f392d00.a: Likewise. + * ada/acats-3/support/f393a00.a: Likewise. + * ada/acats-3/support/f393b00.a: Likewise. + * ada/acats-3/support/f394a00.a: Likewise. + * ada/acats-3/support/f3a1a00.a: Likewise. + * ada/acats-3/support/f3a2a00.a: Likewise. + * ada/acats-3/support/f431a00.a: Likewise. + * ada/acats-3/support/f433a00.a: Likewise. + * ada/acats-3/support/f452a00.a: Likewise. + * ada/acats-3/support/f460a00.a: Likewise. + * ada/acats-3/support/f650a00.a: Likewise. + * ada/acats-3/support/f730a000.a: Likewise. + * ada/acats-3/support/f730a001.a: Likewise. + * ada/acats-3/support/f731a00.a: Likewise. + * ada/acats-3/support/f750a00.a: Likewise. + * ada/acats-3/support/f750b00.a: Likewise. + * ada/acats-3/support/f760a00.a: Likewise. + * ada/acats-3/support/f940a00.a: Likewise. + * ada/acats-3/support/f954a00.a: Likewise. + * ada/acats-3/support/fa11a00.a: Likewise. + * ada/acats-3/support/fa11b00.a: Likewise. + * ada/acats-3/support/fa11c00.a: Likewise. + * ada/acats-3/support/fa11d00.a: Likewise. + * ada/acats-3/support/fa13a00.a: Likewise. + * ada/acats-3/support/fa13b00.a: Likewise. + * ada/acats-3/support/fa21a00.a: Likewise. + * ada/acats-3/support/fb20a00.a: Likewise. + * ada/acats-3/support/fb40a00.a: Likewise. + * ada/acats-3/support/fc50a00.a: Likewise. + * ada/acats-3/support/fc51a00.a: Likewise. + * ada/acats-3/support/fc51b00.a: Likewise. + * ada/acats-3/support/fc51c00.a: Likewise. + * ada/acats-3/support/fc51d00.a: Likewise. + * ada/acats-3/support/fc54a00.a: Likewise. + * ada/acats-3/support/fc70a00.a: Likewise. + * ada/acats-3/support/fc70b00.a: Likewise. + * ada/acats-3/support/fc70c00.a: Likewise. + * ada/acats-3/support/fcndecl.ada: Likewise. + * ada/acats-3/support/fd72a00.a: Likewise. + * ada/acats-3/support/fdb0a00.a: Likewise. + * ada/acats-3/support/fdd2a00.a: Likewise. + * ada/acats-3/support/fdd2b00.a: Likewise. + * ada/acats-3/support/fxa5a00.a: Likewise. + * ada/acats-3/support/fxaca00.a: Likewise. + * ada/acats-3/support/fxacb00.a: Likewise. + * ada/acats-3/support/fxacc00.a: Likewise. + * ada/acats-3/support/fxaia00.a: Likewise. + * ada/acats-3/support/fxc6a00.a: Likewise. + * ada/acats-3/support/fxe2a00.a: Likewise. + * ada/acats-3/support/fxf2a00.a: Likewise. + * ada/acats-3/support/fxf3a00.a: Likewise. + * ada/acats-3/support/impbit.adb: Likewise. + * ada/acats-3/support/impdef.a: Likewise. + * ada/acats-3/support/impdefc.a: Likewise. + * ada/acats-3/support/impdefd.a: Likewise. + * ada/acats-3/support/impdefe.a: Likewise. + * ada/acats-3/support/impdefg.a: Likewise. + * ada/acats-3/support/impdefh.a: Likewise. + * ada/acats-3/support/lencheck.ada: Likewise. + * ada/acats-3/support/macro.dfs: Likewise. + * ada/acats-3/support/macrodef.adb: Likewise. + * ada/acats-3/support/macrosub.ada: Likewise. + * ada/acats-3/support/repbody.ada: Likewise. + * ada/acats-3/support/repspec.ada: Likewise. + * ada/acats-3/support/spprt13s.tst: Likewise. + * ada/acats-3/support/tctouch.ada: Likewise. + * ada/acats-3/support/tsttests.dat: Likewise. + * ada/acats-3/tests/a/a22006b.ada: Likewise. + * ada/acats-3/tests/a/a22006c.ada: Likewise. + * ada/acats-3/tests/a/a22006d.ada: Likewise. + * ada/acats-3/tests/a/a26007a.tst: Likewise. + * ada/acats-3/tests/a/a27003a.ada: Likewise. + * ada/acats-3/tests/a/a29003a.ada: Likewise. + * ada/acats-3/tests/a/a2a031a.ada: Likewise. + * ada/acats-3/tests/a/a33003a.ada: Likewise. + * ada/acats-3/tests/a/a34017c.ada: Likewise. + * ada/acats-3/tests/a/a35101b.ada: Likewise. + * ada/acats-3/tests/a/a35402a.ada: Likewise. + * ada/acats-3/tests/a/a35801f.ada: Likewise. + * ada/acats-3/tests/a/a35902c.ada: Likewise. + * ada/acats-3/tests/a/a38106d.ada: Likewise. + * ada/acats-3/tests/a/a38106e.ada: Likewise. + * ada/acats-3/tests/a/a49027a.ada: Likewise. + * ada/acats-3/tests/a/a49027b.ada: Likewise. + * ada/acats-3/tests/a/a49027c.ada: Likewise. + * ada/acats-3/tests/a/a54b01a.ada: Likewise. + * ada/acats-3/tests/a/a54b02a.ada: Likewise. + * ada/acats-3/tests/a/a55b12a.ada: Likewise. + * ada/acats-3/tests/a/a55b13a.ada: Likewise. + * ada/acats-3/tests/a/a55b14a.ada: Likewise. + * ada/acats-3/tests/a/a71004a.ada: Likewise. + * ada/acats-3/tests/a/a73001i.ada: Likewise. + * ada/acats-3/tests/a/a73001j.ada: Likewise. + * ada/acats-3/tests/a/a74105b.ada: Likewise. + * ada/acats-3/tests/a/a74106a.ada: Likewise. + * ada/acats-3/tests/a/a74106b.ada: Likewise. + * ada/acats-3/tests/a/a74106c.ada: Likewise. + * ada/acats-3/tests/a/a74205e.ada: Likewise. + * ada/acats-3/tests/a/a74205f.ada: Likewise. + * ada/acats-3/tests/a/a83009a.ada: Likewise. + * ada/acats-3/tests/a/a83009b.ada: Likewise. + * ada/acats-3/tests/a/a83a02a.ada: Likewise. + * ada/acats-3/tests/a/a83a02b.ada: Likewise. + * ada/acats-3/tests/a/a83a06a.ada: Likewise. + * ada/acats-3/tests/a/a83a08a.ada: Likewise. + * ada/acats-3/tests/a/a83c01c.ada: Likewise. + * ada/acats-3/tests/a/a83c01h.ada: Likewise. + * ada/acats-3/tests/a/a83c01i.ada: Likewise. + * ada/acats-3/tests/a/a85007d.ada: Likewise. + * ada/acats-3/tests/a/a85013b.ada: Likewise. + * ada/acats-3/tests/a/a87b59a.ada: Likewise. + * ada/acats-3/tests/a/a95001c.ada: Likewise. + * ada/acats-3/tests/a/a95074d.ada: Likewise. + * ada/acats-3/tests/a/a97106a.ada: Likewise. + * ada/acats-3/tests/a/a99006a.ada: Likewise. + * ada/acats-3/tests/a/aa2010a.ada: Likewise. + * ada/acats-3/tests/a/aa2012a.ada: Likewise. + * ada/acats-3/tests/a/ac1015b.ada: Likewise. + * ada/acats-3/tests/a/ac3106a.ada: Likewise. + * ada/acats-3/tests/a/ac3206a.ada: Likewise. + * ada/acats-3/tests/a/ac3207a.ada: Likewise. + * ada/acats-3/tests/a/ad7001b.ada: Likewise. + * ada/acats-3/tests/a/ad7001c0.ada: Likewise. + * ada/acats-3/tests/a/ad7001c1.ada: Likewise. + * ada/acats-3/tests/a/ad7001d0.ada: Likewise. + * ada/acats-3/tests/a/ad7001d1.ada: Likewise. + * ada/acats-3/tests/a/ad7006a.ada: Likewise. + * ada/acats-3/tests/a/ad7101a.ada: Likewise. + * ada/acats-3/tests/a/ad7101c.ada: Likewise. + * ada/acats-3/tests/a/ad7102a.ada: Likewise. + * ada/acats-3/tests/a/ad7103a.ada: Likewise. + * ada/acats-3/tests/a/ad7103c.ada: Likewise. + * ada/acats-3/tests/a/ad7104a.ada: Likewise. + * ada/acats-3/tests/a/ad7201a.ada: Likewise. + * ada/acats-3/tests/a/ad7203b.ada: Likewise. + * ada/acats-3/tests/a/ad7205b.ada: Likewise. + * ada/acats-3/tests/a/ad8011a.tst: Likewise. + * ada/acats-3/tests/a/ada101a.ada: Likewise. + * ada/acats-3/tests/a/ae2113a.ada: Likewise. + * ada/acats-3/tests/a/ae2113b.ada: Likewise. + * ada/acats-3/tests/a/ae3002g.ada: Likewise. + * ada/acats-3/tests/a/ae3101a.ada: Likewise. + * ada/acats-3/tests/a/ae3702a.ada: Likewise. + * ada/acats-3/tests/a/ae3709a.ada: Likewise. + * ada/acats-3/tests/c2/c23001a.ada: Likewise. + * ada/acats-3/tests/c2/c23003a.tst: Likewise. + * ada/acats-3/tests/c2/c23003b.tst: Likewise. + * ada/acats-3/tests/c2/c23003g.tst: Likewise. + * ada/acats-3/tests/c2/c23003i.tst: Likewise. + * ada/acats-3/tests/c2/c23006a.ada: Likewise. + * ada/acats-3/tests/c2/c23006b.ada: Likewise. + * ada/acats-3/tests/c2/c23006c.ada: Likewise. + * ada/acats-3/tests/c2/c23006d.ada: Likewise. + * ada/acats-3/tests/c2/c23006e.ada: Likewise. + * ada/acats-3/tests/c2/c23006f.ada: Likewise. + * ada/acats-3/tests/c2/c23006g.ada: Likewise. + * ada/acats-3/tests/c2/c24002d.ada: Likewise. + * ada/acats-3/tests/c2/c24003a.ada: Likewise. + * ada/acats-3/tests/c2/c24003b.ada: Likewise. + * ada/acats-3/tests/c2/c24003c.ada: Likewise. + * ada/acats-3/tests/c2/c24106a.ada: Likewise. + * ada/acats-3/tests/c2/c24202d.ada: Likewise. + * ada/acats-3/tests/c2/c24203a.ada: Likewise. + * ada/acats-3/tests/c2/c24203b.ada: Likewise. + * ada/acats-3/tests/c2/c24207a.ada: Likewise. + * ada/acats-3/tests/c2/c24211a.ada: Likewise. + * ada/acats-3/tests/c2/c250001.au: Likewise. + * ada/acats-3/tests/c2/c250002.au: Likewise. + * ada/acats-3/tests/c2/c25001a.ada: Likewise. + * ada/acats-3/tests/c2/c25001b.ada: Likewise. + * ada/acats-3/tests/c2/c26006a.ada: Likewise. + * ada/acats-3/tests/c2/c26008a.ada: Likewise. + * ada/acats-3/tests/c2/c2a001a.ada: Likewise. + * ada/acats-3/tests/c2/c2a001b.ada: Likewise. + * ada/acats-3/tests/c2/c2a001c.ada: Likewise. + * ada/acats-3/tests/c2/c2a002a.ada: Likewise. + * ada/acats-3/tests/c2/c2a008a.ada: Likewise. + * ada/acats-3/tests/c2/c2a021b.ada: Likewise. + * ada/acats-3/tests/c3/c32001a.ada: Likewise. + * ada/acats-3/tests/c3/c32001b.ada: Likewise. + * ada/acats-3/tests/c3/c32001c.ada: Likewise. + * ada/acats-3/tests/c3/c32001d.ada: Likewise. + * ada/acats-3/tests/c3/c32001e.ada: Likewise. + * ada/acats-3/tests/c3/c32107a.ada: Likewise. + * ada/acats-3/tests/c3/c32107c.ada: Likewise. + * ada/acats-3/tests/c3/c32108a.ada: Likewise. + * ada/acats-3/tests/c3/c32108b.ada: Likewise. + * ada/acats-3/tests/c3/c32111a.ada: Likewise. + * ada/acats-3/tests/c3/c32111b.ada: Likewise. + * ada/acats-3/tests/c3/c32112b.ada: Likewise. + * ada/acats-3/tests/c3/c32113a.ada: Likewise. + * ada/acats-3/tests/c3/c32115a.ada: Likewise. + * ada/acats-3/tests/c3/c32115b.ada: Likewise. + * ada/acats-3/tests/c3/c330001.a: Likewise. + * ada/acats-3/tests/c3/c330002.a: Likewise. + * ada/acats-3/tests/c3/c332001.a: Likewise. + * ada/acats-3/tests/c3/c340001.a: Likewise. + * ada/acats-3/tests/c3/c34001a.ada: Likewise. + * ada/acats-3/tests/c3/c34001c.ada: Likewise. + * ada/acats-3/tests/c3/c34001d.ada: Likewise. + * ada/acats-3/tests/c3/c34001f.ada: Likewise. + * ada/acats-3/tests/c3/c34002a.ada: Likewise. + * ada/acats-3/tests/c3/c34002c.ada: Likewise. + * ada/acats-3/tests/c3/c34003a.ada: Likewise. + * ada/acats-3/tests/c3/c34003c.ada: Likewise. + * ada/acats-3/tests/c3/c34004a.ada: Likewise. + * ada/acats-3/tests/c3/c34004c.ada: Likewise. + * ada/acats-3/tests/c3/c34005a.ada: Likewise. + * ada/acats-3/tests/c3/c34005c.ada: Likewise. + * ada/acats-3/tests/c3/c34005d.ada: Likewise. + * ada/acats-3/tests/c3/c34005f.ada: Likewise. + * ada/acats-3/tests/c3/c34005g.ada: Likewise. + * ada/acats-3/tests/c3/c34005i.ada: Likewise. + * ada/acats-3/tests/c3/c34005j.ada: Likewise. + * ada/acats-3/tests/c3/c34005l.ada: Likewise. + * ada/acats-3/tests/c3/c34005m.ada: Likewise. + * ada/acats-3/tests/c3/c34005o.ada: Likewise. + * ada/acats-3/tests/c3/c34005p.ada: Likewise. + * ada/acats-3/tests/c3/c34005r.ada: Likewise. + * ada/acats-3/tests/c3/c34005s.ada: Likewise. + * ada/acats-3/tests/c3/c34005u.ada: Likewise. + * ada/acats-3/tests/c3/c34005v.ada: Likewise. + * ada/acats-3/tests/c3/c34006a.ada: Likewise. + * ada/acats-3/tests/c3/c34006d.ada: Likewise. + * ada/acats-3/tests/c3/c34006f.ada: Likewise. + * ada/acats-3/tests/c3/c34006g.ada: Likewise. + * ada/acats-3/tests/c3/c34006j.ada: Likewise. + * ada/acats-3/tests/c3/c34006l.ada: Likewise. + * ada/acats-3/tests/c3/c34007a.ada: Likewise. + * ada/acats-3/tests/c3/c34007d.ada: Likewise. + * ada/acats-3/tests/c3/c34007f.ada: Likewise. + * ada/acats-3/tests/c3/c34007g.ada: Likewise. + * ada/acats-3/tests/c3/c34007i.ada: Likewise. + * ada/acats-3/tests/c3/c34007j.ada: Likewise. + * ada/acats-3/tests/c3/c34007m.ada: Likewise. + * ada/acats-3/tests/c3/c34007p.ada: Likewise. + * ada/acats-3/tests/c3/c34007r.ada: Likewise. + * ada/acats-3/tests/c3/c34007s.ada: Likewise. + * ada/acats-3/tests/c3/c34007u.ada: Likewise. + * ada/acats-3/tests/c3/c34007v.ada: Likewise. + * ada/acats-3/tests/c3/c34008a.ada: Likewise. + * ada/acats-3/tests/c3/c34009a.ada: Likewise. + * ada/acats-3/tests/c3/c34009d.ada: Likewise. + * ada/acats-3/tests/c3/c34009f.ada: Likewise. + * ada/acats-3/tests/c3/c34009g.ada: Likewise. + * ada/acats-3/tests/c3/c34009j.ada: Likewise. + * ada/acats-3/tests/c3/c34009l.ada: Likewise. + * ada/acats-3/tests/c3/c34011b.ada: Likewise. + * ada/acats-3/tests/c3/c34012a.ada: Likewise. + * ada/acats-3/tests/c3/c34014a.ada: Likewise. + * ada/acats-3/tests/c3/c34014c.ada: Likewise. + * ada/acats-3/tests/c3/c34014e.ada: Likewise. + * ada/acats-3/tests/c3/c34014g.ada: Likewise. + * ada/acats-3/tests/c3/c34014h.ada: Likewise. + * ada/acats-3/tests/c3/c34014n.ada: Likewise. + * ada/acats-3/tests/c3/c34014p.ada: Likewise. + * ada/acats-3/tests/c3/c34014r.ada: Likewise. + * ada/acats-3/tests/c3/c34014t.ada: Likewise. + * ada/acats-3/tests/c3/c34014u.ada: Likewise. + * ada/acats-3/tests/c3/c34018a.ada: Likewise. + * ada/acats-3/tests/c3/c340a01.a: Likewise. + * ada/acats-3/tests/c3/c340a02.a: Likewise. + * ada/acats-3/tests/c3/c341a01.a: Likewise. + * ada/acats-3/tests/c3/c341a02.a: Likewise. + * ada/acats-3/tests/c3/c341a03.a: Likewise. + * ada/acats-3/tests/c3/c341a04.a: Likewise. + * ada/acats-3/tests/c3/c35003a.ada: Likewise. + * ada/acats-3/tests/c3/c35003b.ada: Likewise. + * ada/acats-3/tests/c3/c35003d.ada: Likewise. + * ada/acats-3/tests/c3/c35102a.ada: Likewise. + * ada/acats-3/tests/c3/c352001.a: Likewise. + * ada/acats-3/tests/c3/c354002.a: Likewise. + * ada/acats-3/tests/c3/c354003.a: Likewise. + * ada/acats-3/tests/c3/c354004.a: Likewise. + * ada/acats-3/tests/c3/c35502a.ada: Likewise. + * ada/acats-3/tests/c3/c35502b.ada: Likewise. + * ada/acats-3/tests/c3/c35502c.ada: Likewise. + * ada/acats-3/tests/c3/c35502d.tst: Likewise. + * ada/acats-3/tests/c3/c35502e.ada: Likewise. + * ada/acats-3/tests/c3/c35502f.tst: Likewise. + * ada/acats-3/tests/c3/c35502g.ada: Likewise. + * ada/acats-3/tests/c3/c35502h.ada: Likewise. + * ada/acats-3/tests/c3/c35502i.ada: Likewise. + * ada/acats-3/tests/c3/c35502j.ada: Likewise. + * ada/acats-3/tests/c3/c35502k.ada: Likewise. + * ada/acats-3/tests/c3/c35502l.ada: Likewise. + * ada/acats-3/tests/c3/c35502m.ada: Likewise. + * ada/acats-3/tests/c3/c35502n.ada: Likewise. + * ada/acats-3/tests/c3/c35502o.ada: Likewise. + * ada/acats-3/tests/c3/c35502p.ada: Likewise. + * ada/acats-3/tests/c3/c35503a.ada: Likewise. + * ada/acats-3/tests/c3/c35503b.ada: Likewise. + * ada/acats-3/tests/c3/c35503c.ada: Likewise. + * ada/acats-3/tests/c3/c35503d.tst: Likewise. + * ada/acats-3/tests/c3/c35503e.ada: Likewise. + * ada/acats-3/tests/c3/c35503f.tst: Likewise. + * ada/acats-3/tests/c3/c35503g.ada: Likewise. + * ada/acats-3/tests/c3/c35503h.ada: Likewise. + * ada/acats-3/tests/c3/c35503k.ada: Likewise. + * ada/acats-3/tests/c3/c35503l.ada: Likewise. + * ada/acats-3/tests/c3/c35503o.ada: Likewise. + * ada/acats-3/tests/c3/c35503p.ada: Likewise. + * ada/acats-3/tests/c3/c35504a.ada: Likewise. + * ada/acats-3/tests/c3/c35504b.ada: Likewise. + * ada/acats-3/tests/c3/c35505c.ada: Likewise. + * ada/acats-3/tests/c3/c35505e.ada: Likewise. + * ada/acats-3/tests/c3/c35505f.ada: Likewise. + * ada/acats-3/tests/c3/c35507a.ada: Likewise. + * ada/acats-3/tests/c3/c35507b.ada: Likewise. + * ada/acats-3/tests/c3/c35507c.ada: Likewise. + * ada/acats-3/tests/c3/c35507e.ada: Likewise. + * ada/acats-3/tests/c3/c35507g.ada: Likewise. + * ada/acats-3/tests/c3/c35507h.ada: Likewise. + * ada/acats-3/tests/c3/c35507i.ada: Likewise. + * ada/acats-3/tests/c3/c35507j.ada: Likewise. + * ada/acats-3/tests/c3/c35507k.ada: Likewise. + * ada/acats-3/tests/c3/c35507l.ada: Likewise. + * ada/acats-3/tests/c3/c35507m.ada: Likewise. + * ada/acats-3/tests/c3/c35507n.ada: Likewise. + * ada/acats-3/tests/c3/c35507o.ada: Likewise. + * ada/acats-3/tests/c3/c35507p.ada: Likewise. + * ada/acats-3/tests/c3/c35508a.ada: Likewise. + * ada/acats-3/tests/c3/c35508b.ada: Likewise. + * ada/acats-3/tests/c3/c35508c.ada: Likewise. + * ada/acats-3/tests/c3/c35508e.ada: Likewise. + * ada/acats-3/tests/c3/c35508g.ada: Likewise. + * ada/acats-3/tests/c3/c35508h.ada: Likewise. + * ada/acats-3/tests/c3/c35508k.ada: Likewise. + * ada/acats-3/tests/c3/c35508l.ada: Likewise. + * ada/acats-3/tests/c3/c35508o.ada: Likewise. + * ada/acats-3/tests/c3/c35508p.ada: Likewise. + * ada/acats-3/tests/c3/c35703a.ada: Likewise. + * ada/acats-3/tests/c3/c35704a.ada: Likewise. + * ada/acats-3/tests/c3/c35704b.ada: Likewise. + * ada/acats-3/tests/c3/c35704c.ada: Likewise. + * ada/acats-3/tests/c3/c35704d.ada: Likewise. + * ada/acats-3/tests/c3/c35801d.ada: Likewise. + * ada/acats-3/tests/c3/c35902d.ada: Likewise. + * ada/acats-3/tests/c3/c35904a.ada: Likewise. + * ada/acats-3/tests/c3/c35904b.ada: Likewise. + * ada/acats-3/tests/c3/c35a02a.ada: Likewise. + * ada/acats-3/tests/c3/c35a05a.ada: Likewise. + * ada/acats-3/tests/c3/c35a05d.ada: Likewise. + * ada/acats-3/tests/c3/c35a05n.ada: Likewise. + * ada/acats-3/tests/c3/c35a05q.ada: Likewise. + * ada/acats-3/tests/c3/c35a07a.ada: Likewise. + * ada/acats-3/tests/c3/c35a07d.ada: Likewise. + * ada/acats-3/tests/c3/c35a08b.ada: Likewise. + * ada/acats-3/tests/c3/c360002.a: Likewise. + * ada/acats-3/tests/c3/c36104a.ada: Likewise. + * ada/acats-3/tests/c3/c36104b.ada: Likewise. + * ada/acats-3/tests/c3/c36172a.ada: Likewise. + * ada/acats-3/tests/c3/c36172b.ada: Likewise. + * ada/acats-3/tests/c3/c36172c.ada: Likewise. + * ada/acats-3/tests/c3/c36174a.ada: Likewise. + * ada/acats-3/tests/c3/c36180a.ada: Likewise. + * ada/acats-3/tests/c3/c36202c.ada: Likewise. + * ada/acats-3/tests/c3/c36203a.ada: Likewise. + * ada/acats-3/tests/c3/c36204a.ada: Likewise. + * ada/acats-3/tests/c3/c36204b.ada: Likewise. + * ada/acats-3/tests/c3/c36204c.ada: Likewise. + * ada/acats-3/tests/c3/c36204d.ada: Likewise. + * ada/acats-3/tests/c3/c36205a.ada: Likewise. + * ada/acats-3/tests/c3/c36205b.ada: Likewise. + * ada/acats-3/tests/c3/c36205c.ada: Likewise. + * ada/acats-3/tests/c3/c36205d.ada: Likewise. + * ada/acats-3/tests/c3/c36205e.ada: Likewise. + * ada/acats-3/tests/c3/c36205f.ada: Likewise. + * ada/acats-3/tests/c3/c36205g.ada: Likewise. + * ada/acats-3/tests/c3/c36205h.ada: Likewise. + * ada/acats-3/tests/c3/c36205i.ada: Likewise. + * ada/acats-3/tests/c3/c36205j.ada: Likewise. + * ada/acats-3/tests/c3/c36205k.ada: Likewise. + * ada/acats-3/tests/c3/c36205l.ada: Likewise. + * ada/acats-3/tests/c3/c36301a.ada: Likewise. + * ada/acats-3/tests/c3/c36301b.ada: Likewise. + * ada/acats-3/tests/c3/c36302a.ada: Likewise. + * ada/acats-3/tests/c3/c36304a.ada: Likewise. + * ada/acats-3/tests/c3/c36305a.ada: Likewise. + * ada/acats-3/tests/c3/c37002a.ada: Likewise. + * ada/acats-3/tests/c3/c37003a.ada: Likewise. + * ada/acats-3/tests/c3/c37003b.ada: Likewise. + * ada/acats-3/tests/c3/c37005a.ada: Likewise. + * ada/acats-3/tests/c3/c37006a.ada: Likewise. + * ada/acats-3/tests/c3/c37008a.ada: Likewise. + * ada/acats-3/tests/c3/c37008b.ada: Likewise. + * ada/acats-3/tests/c3/c37009a.ada: Likewise. + * ada/acats-3/tests/c3/c37010a.ada: Likewise. + * ada/acats-3/tests/c3/c37010b.ada: Likewise. + * ada/acats-3/tests/c3/c371001.a: Likewise. + * ada/acats-3/tests/c3/c371002.a: Likewise. + * ada/acats-3/tests/c3/c371003.a: Likewise. + * ada/acats-3/tests/c3/c37102b.ada: Likewise. + * ada/acats-3/tests/c3/c37103a.ada: Likewise. + * ada/acats-3/tests/c3/c37105a.ada: Likewise. + * ada/acats-3/tests/c3/c37107a.ada: Likewise. + * ada/acats-3/tests/c3/c37108b.ada: Likewise. + * ada/acats-3/tests/c3/c37206a.ada: Likewise. + * ada/acats-3/tests/c3/c37207a.ada: Likewise. + * ada/acats-3/tests/c3/c37208a.ada: Likewise. + * ada/acats-3/tests/c3/c37208b.ada: Likewise. + * ada/acats-3/tests/c3/c37209a.ada: Likewise. + * ada/acats-3/tests/c3/c37209b.ada: Likewise. + * ada/acats-3/tests/c3/c37210a.ada: Likewise. + * ada/acats-3/tests/c3/c37211a.ada: Likewise. + * ada/acats-3/tests/c3/c37211b.ada: Likewise. + * ada/acats-3/tests/c3/c37211c.ada: Likewise. + * ada/acats-3/tests/c3/c37211d.ada: Likewise. + * ada/acats-3/tests/c3/c37211e.ada: Likewise. + * ada/acats-3/tests/c3/c37213b.ada: Likewise. + * ada/acats-3/tests/c3/c37213d.ada: Likewise. + * ada/acats-3/tests/c3/c37213f.ada: Likewise. + * ada/acats-3/tests/c3/c37213h.ada: Likewise. + * ada/acats-3/tests/c3/c37213j.ada: Likewise. + * ada/acats-3/tests/c3/c37213k.ada: Likewise. + * ada/acats-3/tests/c3/c37213l.ada: Likewise. + * ada/acats-3/tests/c3/c37215b.ada: Likewise. + * ada/acats-3/tests/c3/c37215d.ada: Likewise. + * ada/acats-3/tests/c3/c37215f.ada: Likewise. + * ada/acats-3/tests/c3/c37215h.ada: Likewise. + * ada/acats-3/tests/c3/c37217a.ada: Likewise. + * ada/acats-3/tests/c3/c37217b.ada: Likewise. + * ada/acats-3/tests/c3/c37217c.ada: Likewise. + * ada/acats-3/tests/c3/c37304a.ada: Likewise. + * ada/acats-3/tests/c3/c37305a.ada: Likewise. + * ada/acats-3/tests/c3/c37306a.ada: Likewise. + * ada/acats-3/tests/c3/c37309a.ada: Likewise. + * ada/acats-3/tests/c3/c37310a.ada: Likewise. + * ada/acats-3/tests/c3/c37312a.ada: Likewise. + * ada/acats-3/tests/c3/c37402a.ada: Likewise. + * ada/acats-3/tests/c3/c37403a.ada: Likewise. + * ada/acats-3/tests/c3/c37404a.ada: Likewise. + * ada/acats-3/tests/c3/c37404b.ada: Likewise. + * ada/acats-3/tests/c3/c37405a.ada: Likewise. + * ada/acats-3/tests/c3/c37411a.ada: Likewise. + * ada/acats-3/tests/c3/c380001.a: Likewise. + * ada/acats-3/tests/c3/c380002.a: Likewise. + * ada/acats-3/tests/c3/c380003.a: Likewise. + * ada/acats-3/tests/c3/c380004.a: Likewise. + * ada/acats-3/tests/c3/c38002a.ada: Likewise. + * ada/acats-3/tests/c3/c38002b.ada: Likewise. + * ada/acats-3/tests/c3/c38005a.ada: Likewise. + * ada/acats-3/tests/c3/c38005b.ada: Likewise. + * ada/acats-3/tests/c3/c38005c.ada: Likewise. + * ada/acats-3/tests/c3/c38102a.ada: Likewise. + * ada/acats-3/tests/c3/c38102b.ada: Likewise. + * ada/acats-3/tests/c3/c38102c.ada: Likewise. + * ada/acats-3/tests/c3/c38102d.ada: Likewise. + * ada/acats-3/tests/c3/c38102e.ada: Likewise. + * ada/acats-3/tests/c3/c38104a.ada: Likewise. + * ada/acats-3/tests/c3/c38107a.ada: Likewise. + * ada/acats-3/tests/c3/c38107b.ada: Likewise. + * ada/acats-3/tests/c3/c38108a.ada: Likewise. + * ada/acats-3/tests/c3/c38108b.ada: Likewise. + * ada/acats-3/tests/c3/c38108c0.ada: Likewise. + * ada/acats-3/tests/c3/c38108c1.ada: Likewise. + * ada/acats-3/tests/c3/c38108c2.ada: Likewise. + * ada/acats-3/tests/c3/c38108d0.ada: Likewise. + * ada/acats-3/tests/c3/c38108d1.ada: Likewise. + * ada/acats-3/tests/c3/c3900010.a: Likewise. + * ada/acats-3/tests/c3/c3900011.am: Likewise. + * ada/acats-3/tests/c3/c390002.a: Likewise. + * ada/acats-3/tests/c3/c390003.a: Likewise. + * ada/acats-3/tests/c3/c390004.a: Likewise. + * ada/acats-3/tests/c3/c3900050.a: Likewise. + * ada/acats-3/tests/c3/c3900051.a: Likewise. + * ada/acats-3/tests/c3/c3900052.a: Likewise. + * ada/acats-3/tests/c3/c3900053.am: Likewise. + * ada/acats-3/tests/c3/c3900060.a: Likewise. + * ada/acats-3/tests/c3/c3900061.a: Likewise. + * ada/acats-3/tests/c3/c3900062.a: Likewise. + * ada/acats-3/tests/c3/c3900063.am: Likewise. + * ada/acats-3/tests/c3/c390007.a: Likewise. + * ada/acats-3/tests/c3/c390010.a: Likewise. + * ada/acats-3/tests/c3/c390011.a: Likewise. + * ada/acats-3/tests/c3/c390012.a: Likewise. + * ada/acats-3/tests/c3/c39006a.ada: Likewise. + * ada/acats-3/tests/c3/c39006b.ada: Likewise. + * ada/acats-3/tests/c3/c39006c0.ada: Likewise. + * ada/acats-3/tests/c3/c39006c1.ada: Likewise. + * ada/acats-3/tests/c3/c39006d.ada: Likewise. + * ada/acats-3/tests/c3/c39006e.ada: Likewise. + * ada/acats-3/tests/c3/c39006f0.ada: Likewise. + * ada/acats-3/tests/c3/c39006f1.ada: Likewise. + * ada/acats-3/tests/c3/c39006f2.ada: Likewise. + * ada/acats-3/tests/c3/c39006f3.ada: Likewise. + * ada/acats-3/tests/c3/c39006g.ada: Likewise. + * ada/acats-3/tests/c3/c39007a.ada: Likewise. + * ada/acats-3/tests/c3/c39007b.ada: Likewise. + * ada/acats-3/tests/c3/c39008a.ada: Likewise. + * ada/acats-3/tests/c3/c39008b.ada: Likewise. + * ada/acats-3/tests/c3/c39008c.ada: Likewise. + * ada/acats-3/tests/c3/c390a010.a: Likewise. + * ada/acats-3/tests/c3/c390a011.am: Likewise. + * ada/acats-3/tests/c3/c390a020.a: Likewise. + * ada/acats-3/tests/c3/c390a021.a: Likewise. + * ada/acats-3/tests/c3/c390a022.am: Likewise. + * ada/acats-3/tests/c3/c390a030.a: Likewise. + * ada/acats-3/tests/c3/c390a031.am: Likewise. + * ada/acats-3/tests/c3/c391001.a: Likewise. + * ada/acats-3/tests/c3/c391002.a: Likewise. + * ada/acats-3/tests/c3/c391003.a: Likewise. + * ada/acats-3/tests/c3/c392002.a: Likewise. + * ada/acats-3/tests/c3/c392003.a: Likewise. + * ada/acats-3/tests/c3/c392004.a: Likewise. + * ada/acats-3/tests/c3/c392005.a: Likewise. + * ada/acats-3/tests/c3/c392008.a: Likewise. + * ada/acats-3/tests/c3/c392010.a: Likewise. + * ada/acats-3/tests/c3/c392011.a: Likewise. + * ada/acats-3/tests/c3/c392013.a: Likewise. + * ada/acats-3/tests/c3/c392014.a: Likewise. + * ada/acats-3/tests/c3/c392015.a: Likewise. + * ada/acats-3/tests/c3/c392a01.a: Likewise. + * ada/acats-3/tests/c3/c392c05.a: Likewise. + * ada/acats-3/tests/c3/c392c07.a: Likewise. + * ada/acats-3/tests/c3/c392d01.a: Likewise. + * ada/acats-3/tests/c3/c392d02.a: Likewise. + * ada/acats-3/tests/c3/c392d03.a: Likewise. + * ada/acats-3/tests/c3/c393001.a: Likewise. + * ada/acats-3/tests/c3/c393007.a: Likewise. + * ada/acats-3/tests/c3/c393008.a: Likewise. + * ada/acats-3/tests/c3/c393009.a: Likewise. + * ada/acats-3/tests/c3/c393010.a: Likewise. + * ada/acats-3/tests/c3/c393011.a: Likewise. + * ada/acats-3/tests/c3/c393012.a: Likewise. + * ada/acats-3/tests/c3/c393013.a: Likewise. + * ada/acats-3/tests/c3/c393a02.a: Likewise. + * ada/acats-3/tests/c3/c393a03.a: Likewise. + * ada/acats-3/tests/c3/c393a05.a: Likewise. + * ada/acats-3/tests/c3/c393a06.a: Likewise. + * ada/acats-3/tests/c3/c393b12.a: Likewise. + * ada/acats-3/tests/c3/c393b13.a: Likewise. + * ada/acats-3/tests/c3/c393b14.a: Likewise. + * ada/acats-3/tests/c3/c394001.a: Likewise. + * ada/acats-3/tests/c3/c394002.a: Likewise. + * ada/acats-3/tests/c3/c394003.a: Likewise. + * ada/acats-3/tests/c3/c3a0001.a: Likewise. + * ada/acats-3/tests/c3/c3a0002.a: Likewise. + * ada/acats-3/tests/c3/c3a0003.a: Likewise. + * ada/acats-3/tests/c3/c3a0004.a: Likewise. + * ada/acats-3/tests/c3/c3a0005.a: Likewise. + * ada/acats-3/tests/c3/c3a0006.a: Likewise. + * ada/acats-3/tests/c3/c3a0007.a: Likewise. + * ada/acats-3/tests/c3/c3a0008.a: Likewise. + * ada/acats-3/tests/c3/c3a0009.a: Likewise. + * ada/acats-3/tests/c3/c3a0010.a: Likewise. + * ada/acats-3/tests/c3/c3a0011.a: Likewise. + * ada/acats-3/tests/c3/c3a00120.a: Likewise. + * ada/acats-3/tests/c3/c3a00121.a: Likewise. + * ada/acats-3/tests/c3/c3a00122.am: Likewise. + * ada/acats-3/tests/c3/c3a0013.a: Likewise. + * ada/acats-3/tests/c3/c3a0014.a: Likewise. + * ada/acats-3/tests/c3/c3a0015.a: Likewise. + * ada/acats-3/tests/c3/c3a0016.a: Likewise. + * ada/acats-3/tests/c3/c3a0017.a: Likewise. + * ada/acats-3/tests/c3/c3a0018.a: Likewise. + * ada/acats-3/tests/c3/c3a0019.a: Likewise. + * ada/acats-3/tests/c3/c3a0020.a: Likewise. + * ada/acats-3/tests/c3/c3a0021.a: Likewise. + * ada/acats-3/tests/c3/c3a0022.a: Likewise. + * ada/acats-3/tests/c3/c3a0023.a: Likewise. + * ada/acats-3/tests/c3/c3a0024.a: Likewise. + * ada/acats-3/tests/c3/c3a0025.a: Likewise. + * ada/acats-3/tests/c3/c3a0026.a: Likewise. + * ada/acats-3/tests/c3/c3a0027.a: Likewise. + * ada/acats-3/tests/c3/c3a0028.a: Likewise. + * ada/acats-3/tests/c3/c3a0029.a: Likewise. + * ada/acats-3/tests/c3/c3a0030.a: Likewise. + * ada/acats-3/tests/c3/c3a1001.a: Likewise. + * ada/acats-3/tests/c3/c3a1002.a: Likewise. + * ada/acats-3/tests/c3/c3a10030.a: Likewise. + * ada/acats-3/tests/c3/c3a10031.a: Likewise. + * ada/acats-3/tests/c3/c3a10032.am: Likewise. + * ada/acats-3/tests/c3/c3a10040.a: Likewise. + * ada/acats-3/tests/c3/c3a10041.a: Likewise. + * ada/acats-3/tests/c3/c3a10042.am: Likewise. + * ada/acats-3/tests/c3/c3a2001.a: Likewise. + * ada/acats-3/tests/c3/c3a2002.a: Likewise. + * ada/acats-3/tests/c3/c3a2003.a: Likewise. + * ada/acats-3/tests/c3/c3a2004.a: Likewise. + * ada/acats-3/tests/c3/c3a2a01.a: Likewise. + * ada/acats-3/tests/c3/c3a2a02.a: Likewise. + * ada/acats-3/tests/c4/c410001.a: Likewise. + * ada/acats-3/tests/c4/c41101d.ada: Likewise. + * ada/acats-3/tests/c4/c41103a.ada: Likewise. + * ada/acats-3/tests/c4/c41103b.ada: Likewise. + * ada/acats-3/tests/c4/c41104a.ada: Likewise. + * ada/acats-3/tests/c4/c41105a.ada: Likewise. + * ada/acats-3/tests/c4/c41107a.ada: Likewise. + * ada/acats-3/tests/c4/c41201d.ada: Likewise. + * ada/acats-3/tests/c4/c41203a.ada: Likewise. + * ada/acats-3/tests/c4/c41203b.ada: Likewise. + * ada/acats-3/tests/c4/c41204a.ada: Likewise. + * ada/acats-3/tests/c4/c41205a.ada: Likewise. + * ada/acats-3/tests/c4/c41206a.ada: Likewise. + * ada/acats-3/tests/c4/c41207a.ada: Likewise. + * ada/acats-3/tests/c4/c413001.a: Likewise. + * ada/acats-3/tests/c4/c413002.a: Likewise. + * ada/acats-3/tests/c4/c413003.a: Likewise. + * ada/acats-3/tests/c4/c413004.a: Likewise. + * ada/acats-3/tests/c4/c413005.a: Likewise. + * ada/acats-3/tests/c4/c413006.a: Likewise. + * ada/acats-3/tests/c4/c41301a.ada: Likewise. + * ada/acats-3/tests/c4/c41303a.ada: Likewise. + * ada/acats-3/tests/c4/c41303b.ada: Likewise. + * ada/acats-3/tests/c4/c41303c.ada: Likewise. + * ada/acats-3/tests/c4/c41303e.ada: Likewise. + * ada/acats-3/tests/c4/c41303f.ada: Likewise. + * ada/acats-3/tests/c4/c41303g.ada: Likewise. + * ada/acats-3/tests/c4/c41303i.ada: Likewise. + * ada/acats-3/tests/c4/c41303j.ada: Likewise. + * ada/acats-3/tests/c4/c41303k.ada: Likewise. + * ada/acats-3/tests/c4/c41303m.ada: Likewise. + * ada/acats-3/tests/c4/c41303n.ada: Likewise. + * ada/acats-3/tests/c4/c41303o.ada: Likewise. + * ada/acats-3/tests/c4/c41303q.ada: Likewise. + * ada/acats-3/tests/c4/c41303r.ada: Likewise. + * ada/acats-3/tests/c4/c41303s.ada: Likewise. + * ada/acats-3/tests/c4/c41303u.ada: Likewise. + * ada/acats-3/tests/c4/c41303v.ada: Likewise. + * ada/acats-3/tests/c4/c41303w.ada: Likewise. + * ada/acats-3/tests/c4/c41304a.ada: Likewise. + * ada/acats-3/tests/c4/c41304b.ada: Likewise. + * ada/acats-3/tests/c4/c41306b.ada: Likewise. + * ada/acats-3/tests/c4/c41306c.ada: Likewise. + * ada/acats-3/tests/c4/c41307d.ada: Likewise. + * ada/acats-3/tests/c4/c41309a.ada: Likewise. + * ada/acats-3/tests/c4/c41320a.ada: Likewise. + * ada/acats-3/tests/c4/c41321a.ada: Likewise. + * ada/acats-3/tests/c4/c41322a.ada: Likewise. + * ada/acats-3/tests/c4/c41323a.ada: Likewise. + * ada/acats-3/tests/c4/c41324a.ada: Likewise. + * ada/acats-3/tests/c4/c41325a.ada: Likewise. + * ada/acats-3/tests/c4/c41326a.ada: Likewise. + * ada/acats-3/tests/c4/c41327a.ada: Likewise. + * ada/acats-3/tests/c4/c41328a.ada: Likewise. + * ada/acats-3/tests/c4/c41401a.ada: Likewise. + * ada/acats-3/tests/c4/c41402a.ada: Likewise. + * ada/acats-3/tests/c4/c41404a.ada: Likewise. + * ada/acats-3/tests/c4/c420001.a: Likewise. + * ada/acats-3/tests/c4/c42006a.ada: Likewise. + * ada/acats-3/tests/c4/c42007e.ada: Likewise. + * ada/acats-3/tests/c4/c43003a.ada: Likewise. + * ada/acats-3/tests/c4/c43004a.ada: Likewise. + * ada/acats-3/tests/c4/c43004c.ada: Likewise. + * ada/acats-3/tests/c4/c431001.a: Likewise. + * ada/acats-3/tests/c4/c43103a.ada: Likewise. + * ada/acats-3/tests/c4/c43103b.ada: Likewise. + * ada/acats-3/tests/c4/c43104a.ada: Likewise. + * ada/acats-3/tests/c4/c43105a.ada: Likewise. + * ada/acats-3/tests/c4/c43105b.ada: Likewise. + * ada/acats-3/tests/c4/c43106a.ada: Likewise. + * ada/acats-3/tests/c4/c43107a.ada: Likewise. + * ada/acats-3/tests/c4/c43108a.ada: Likewise. + * ada/acats-3/tests/c4/c431a01.a: Likewise. + * ada/acats-3/tests/c4/c431a02.a: Likewise. + * ada/acats-3/tests/c4/c431a03.a: Likewise. + * ada/acats-3/tests/c4/c432001.a: Likewise. + * ada/acats-3/tests/c4/c432002.a: Likewise. + * ada/acats-3/tests/c4/c432003.a: Likewise. + * ada/acats-3/tests/c4/c432004.a: Likewise. + * ada/acats-3/tests/c4/c432005.a: Likewise. + * ada/acats-3/tests/c4/c43204a.ada: Likewise. + * ada/acats-3/tests/c4/c43204c.ada: Likewise. + * ada/acats-3/tests/c4/c43204e.ada: Likewise. + * ada/acats-3/tests/c4/c43204f.ada: Likewise. + * ada/acats-3/tests/c4/c43204g.ada: Likewise. + * ada/acats-3/tests/c4/c43204h.ada: Likewise. + * ada/acats-3/tests/c4/c43204i.ada: Likewise. + * ada/acats-3/tests/c4/c43205a.ada: Likewise. + * ada/acats-3/tests/c4/c43205b.ada: Likewise. + * ada/acats-3/tests/c4/c43205c.ada: Likewise. + * ada/acats-3/tests/c4/c43205d.ada: Likewise. + * ada/acats-3/tests/c4/c43205e.ada: Likewise. + * ada/acats-3/tests/c4/c43205g.ada: Likewise. + * ada/acats-3/tests/c4/c43205h.ada: Likewise. + * ada/acats-3/tests/c4/c43205i.ada: Likewise. + * ada/acats-3/tests/c4/c43205j.ada: Likewise. + * ada/acats-3/tests/c4/c43205k.ada: Likewise. + * ada/acats-3/tests/c4/c43206a.ada: Likewise. + * ada/acats-3/tests/c4/c43207b.ada: Likewise. + * ada/acats-3/tests/c4/c43207d.ada: Likewise. + * ada/acats-3/tests/c4/c43208a.ada: Likewise. + * ada/acats-3/tests/c4/c43208b.ada: Likewise. + * ada/acats-3/tests/c4/c43209a.ada: Likewise. + * ada/acats-3/tests/c4/c43210a.ada: Likewise. + * ada/acats-3/tests/c4/c43211a.ada: Likewise. + * ada/acats-3/tests/c4/c43212a.ada: Likewise. + * ada/acats-3/tests/c4/c43212c.ada: Likewise. + * ada/acats-3/tests/c4/c43214a.ada: Likewise. + * ada/acats-3/tests/c4/c43214b.ada: Likewise. + * ada/acats-3/tests/c4/c43214c.ada: Likewise. + * ada/acats-3/tests/c4/c43214d.ada: Likewise. + * ada/acats-3/tests/c4/c43214e.ada: Likewise. + * ada/acats-3/tests/c4/c43214f.ada: Likewise. + * ada/acats-3/tests/c4/c43215a.ada: Likewise. + * ada/acats-3/tests/c4/c43215b.ada: Likewise. + * ada/acats-3/tests/c4/c43222a.ada: Likewise. + * ada/acats-3/tests/c4/c43224a.ada: Likewise. + * ada/acats-3/tests/c4/c433001.a: Likewise. + * ada/acats-3/tests/c4/c433a01.a: Likewise. + * ada/acats-3/tests/c4/c433a02.a: Likewise. + * ada/acats-3/tests/c4/c433a03.a: Likewise. + * ada/acats-3/tests/c4/c433a04.a: Likewise. + * ada/acats-3/tests/c4/c44003d.ada: Likewise. + * ada/acats-3/tests/c4/c44003f.ada: Likewise. + * ada/acats-3/tests/c4/c44003g.ada: Likewise. + * ada/acats-3/tests/c4/c450001.a: Likewise. + * ada/acats-3/tests/c4/c45112a.ada: Likewise. + * ada/acats-3/tests/c4/c45112b.ada: Likewise. + * ada/acats-3/tests/c4/c45113a.ada: Likewise. + * ada/acats-3/tests/c4/c45114b.ada: Likewise. + * ada/acats-3/tests/c4/c452001.a: Likewise. + * ada/acats-3/tests/c4/c45201a.ada: Likewise. + * ada/acats-3/tests/c4/c45201b.ada: Likewise. + * ada/acats-3/tests/c4/c45202b.ada: Likewise. + * ada/acats-3/tests/c4/c45210a.ada: Likewise. + * ada/acats-3/tests/c4/c45211a.ada: Likewise. + * ada/acats-3/tests/c4/c45220a.ada: Likewise. + * ada/acats-3/tests/c4/c45220b.ada: Likewise. + * ada/acats-3/tests/c4/c45220c.ada: Likewise. + * ada/acats-3/tests/c4/c45220d.ada: Likewise. + * ada/acats-3/tests/c4/c45220e.ada: Likewise. + * ada/acats-3/tests/c4/c45220f.ada: Likewise. + * ada/acats-3/tests/c4/c45231a.ada: Likewise. + * ada/acats-3/tests/c4/c45231b.dep: Likewise. + * ada/acats-3/tests/c4/c45231c.dep: Likewise. + * ada/acats-3/tests/c4/c45231d.tst: Likewise. + * ada/acats-3/tests/c4/c45232b.ada: Likewise. + * ada/acats-3/tests/c4/c45242b.ada: Likewise. + * ada/acats-3/tests/c4/c45251a.ada: Likewise. + * ada/acats-3/tests/c4/c45252a.ada: Likewise. + * ada/acats-3/tests/c4/c45252b.ada: Likewise. + * ada/acats-3/tests/c4/c45253a.ada: Likewise. + * ada/acats-3/tests/c4/c45262a.ada: Likewise. + * ada/acats-3/tests/c4/c45262b.ada: Likewise. + * ada/acats-3/tests/c4/c45262c.ada: Likewise. + * ada/acats-3/tests/c4/c45262d.ada: Likewise. + * ada/acats-3/tests/c4/c45264a.ada: Likewise. + * ada/acats-3/tests/c4/c45264b.ada: Likewise. + * ada/acats-3/tests/c4/c45264c.ada: Likewise. + * ada/acats-3/tests/c4/c45265a.ada: Likewise. + * ada/acats-3/tests/c4/c45271a.ada: Likewise. + * ada/acats-3/tests/c4/c45272a.ada: Likewise. + * ada/acats-3/tests/c4/c45273a.ada: Likewise. + * ada/acats-3/tests/c4/c45274a.ada: Likewise. + * ada/acats-3/tests/c4/c45274b.ada: Likewise. + * ada/acats-3/tests/c4/c45274c.ada: Likewise. + * ada/acats-3/tests/c4/c45281a.ada: Likewise. + * ada/acats-3/tests/c4/c45282a.ada: Likewise. + * ada/acats-3/tests/c4/c45282b.ada: Likewise. + * ada/acats-3/tests/c4/c45291a.ada: Likewise. + * ada/acats-3/tests/c4/c452a01.a: Likewise. + * ada/acats-3/tests/c4/c452a02.a: Likewise. + * ada/acats-3/tests/c4/c452a03.a: Likewise. + * ada/acats-3/tests/c4/c453001.a: Likewise. + * ada/acats-3/tests/c4/c45303a.ada: Likewise. + * ada/acats-3/tests/c4/c45304a.ada: Likewise. + * ada/acats-3/tests/c4/c45304b.dep: Likewise. + * ada/acats-3/tests/c4/c45304c.dep: Likewise. + * ada/acats-3/tests/c4/c45322a.ada: Likewise. + * ada/acats-3/tests/c4/c45323a.ada: Likewise. + * ada/acats-3/tests/c4/c45331a.ada: Likewise. + * ada/acats-3/tests/c4/c45342a.ada: Likewise. + * ada/acats-3/tests/c4/c45343a.ada: Likewise. + * ada/acats-3/tests/c4/c45344a.ada: Likewise. + * ada/acats-3/tests/c4/c45345b.ada: Likewise. + * ada/acats-3/tests/c4/c45347a.ada: Likewise. + * ada/acats-3/tests/c4/c45347b.ada: Likewise. + * ada/acats-3/tests/c4/c45347c.ada: Likewise. + * ada/acats-3/tests/c4/c45347d.ada: Likewise. + * ada/acats-3/tests/c4/c45411a.ada: Likewise. + * ada/acats-3/tests/c4/c45411b.dep: Likewise. + * ada/acats-3/tests/c4/c45411c.dep: Likewise. + * ada/acats-3/tests/c4/c45411d.ada: Likewise. + * ada/acats-3/tests/c4/c45413a.ada: Likewise. + * ada/acats-3/tests/c4/c45431a.ada: Likewise. + * ada/acats-3/tests/c4/c455001.a: Likewise. + * ada/acats-3/tests/c4/c45502b.dep: Likewise. + * ada/acats-3/tests/c4/c45502c.dep: Likewise. + * ada/acats-3/tests/c4/c45503a.ada: Likewise. + * ada/acats-3/tests/c4/c45503b.dep: Likewise. + * ada/acats-3/tests/c4/c45503c.dep: Likewise. + * ada/acats-3/tests/c4/c45504a.ada: Likewise. + * ada/acats-3/tests/c4/c45504b.dep: Likewise. + * ada/acats-3/tests/c4/c45504c.dep: Likewise. + * ada/acats-3/tests/c4/c45504d.ada: Likewise. + * ada/acats-3/tests/c4/c45504e.dep: Likewise. + * ada/acats-3/tests/c4/c45504f.dep: Likewise. + * ada/acats-3/tests/c4/c45505a.ada: Likewise. + * ada/acats-3/tests/c4/c45523a.ada: Likewise. + * ada/acats-3/tests/c4/c45531a.ada: Likewise. + * ada/acats-3/tests/c4/c45531b.ada: Likewise. + * ada/acats-3/tests/c4/c45531c.ada: Likewise. + * ada/acats-3/tests/c4/c45531d.ada: Likewise. + * ada/acats-3/tests/c4/c45531e.ada: Likewise. + * ada/acats-3/tests/c4/c45531f.ada: Likewise. + * ada/acats-3/tests/c4/c45531g.ada: Likewise. + * ada/acats-3/tests/c4/c45531h.ada: Likewise. + * ada/acats-3/tests/c4/c45531i.ada: Likewise. + * ada/acats-3/tests/c4/c45531j.ada: Likewise. + * ada/acats-3/tests/c4/c45531k.ada: Likewise. + * ada/acats-3/tests/c4/c45531l.ada: Likewise. + * ada/acats-3/tests/c4/c45531m.dep: Likewise. + * ada/acats-3/tests/c4/c45531n.dep: Likewise. + * ada/acats-3/tests/c4/c45531o.dep: Likewise. + * ada/acats-3/tests/c4/c45531p.dep: Likewise. + * ada/acats-3/tests/c4/c45532a.ada: Likewise. + * ada/acats-3/tests/c4/c45532b.ada: Likewise. + * ada/acats-3/tests/c4/c45532c.ada: Likewise. + * ada/acats-3/tests/c4/c45532d.ada: Likewise. + * ada/acats-3/tests/c4/c45532e.ada: Likewise. + * ada/acats-3/tests/c4/c45532f.ada: Likewise. + * ada/acats-3/tests/c4/c45532g.ada: Likewise. + * ada/acats-3/tests/c4/c45532h.ada: Likewise. + * ada/acats-3/tests/c4/c45532i.ada: Likewise. + * ada/acats-3/tests/c4/c45532j.ada: Likewise. + * ada/acats-3/tests/c4/c45532k.ada: Likewise. + * ada/acats-3/tests/c4/c45532l.ada: Likewise. + * ada/acats-3/tests/c4/c45532m.dep: Likewise. + * ada/acats-3/tests/c4/c45532n.dep: Likewise. + * ada/acats-3/tests/c4/c45532o.dep: Likewise. + * ada/acats-3/tests/c4/c45532p.dep: Likewise. + * ada/acats-3/tests/c4/c45534b.ada: Likewise. + * ada/acats-3/tests/c4/c45536a.dep: Likewise. + * ada/acats-3/tests/c4/c456001.a: Likewise. + * ada/acats-3/tests/c4/c45611a.ada: Likewise. + * ada/acats-3/tests/c4/c45611b.dep: Likewise. + * ada/acats-3/tests/c4/c45611c.dep: Likewise. + * ada/acats-3/tests/c4/c45613a.ada: Likewise. + * ada/acats-3/tests/c4/c45613b.dep: Likewise. + * ada/acats-3/tests/c4/c45613c.dep: Likewise. + * ada/acats-3/tests/c4/c45614a.ada: Likewise. + * ada/acats-3/tests/c4/c45614b.dep: Likewise. + * ada/acats-3/tests/c4/c45614c.dep: Likewise. + * ada/acats-3/tests/c4/c45631a.ada: Likewise. + * ada/acats-3/tests/c4/c45631b.dep: Likewise. + * ada/acats-3/tests/c4/c45631c.dep: Likewise. + * ada/acats-3/tests/c4/c45632a.ada: Likewise. + * ada/acats-3/tests/c4/c45632b.dep: Likewise. + * ada/acats-3/tests/c4/c45632c.dep: Likewise. + * ada/acats-3/tests/c4/c45651a.ada: Likewise. + * ada/acats-3/tests/c4/c45662a.ada: Likewise. + * ada/acats-3/tests/c4/c45662b.ada: Likewise. + * ada/acats-3/tests/c4/c45672a.ada: Likewise. + * ada/acats-3/tests/c4/c460001.a: Likewise. + * ada/acats-3/tests/c4/c460002.a: Likewise. + * ada/acats-3/tests/c4/c460004.a: Likewise. + * ada/acats-3/tests/c4/c460005.a: Likewise. + * ada/acats-3/tests/c4/c460006.a: Likewise. + * ada/acats-3/tests/c4/c460007.a: Likewise. + * ada/acats-3/tests/c4/c460008.a: Likewise. + * ada/acats-3/tests/c4/c460009.a: Likewise. + * ada/acats-3/tests/c4/c460010.a: Likewise. + * ada/acats-3/tests/c4/c460011.a: Likewise. + * ada/acats-3/tests/c4/c460012.a: Likewise. + * ada/acats-3/tests/c4/c460013.a: Likewise. + * ada/acats-3/tests/c4/c460014.a: Likewise. + * ada/acats-3/tests/c4/c460015.a: Likewise. + * ada/acats-3/tests/c4/c46011a.ada: Likewise. + * ada/acats-3/tests/c4/c46013a.ada: Likewise. + * ada/acats-3/tests/c4/c46014a.ada: Likewise. + * ada/acats-3/tests/c4/c46021a.ada: Likewise. + * ada/acats-3/tests/c4/c46024a.ada: Likewise. + * ada/acats-3/tests/c4/c46031a.ada: Likewise. + * ada/acats-3/tests/c4/c46032a.ada: Likewise. + * ada/acats-3/tests/c4/c46033a.ada: Likewise. + * ada/acats-3/tests/c4/c46041a.ada: Likewise. + * ada/acats-3/tests/c4/c46042a.ada: Likewise. + * ada/acats-3/tests/c4/c46043b.ada: Likewise. + * ada/acats-3/tests/c4/c46044b.ada: Likewise. + * ada/acats-3/tests/c4/c46051a.ada: Likewise. + * ada/acats-3/tests/c4/c46051b.ada: Likewise. + * ada/acats-3/tests/c4/c46051c.ada: Likewise. + * ada/acats-3/tests/c4/c46052a.ada: Likewise. + * ada/acats-3/tests/c4/c46053a.ada: Likewise. + * ada/acats-3/tests/c4/c46054a.ada: Likewise. + * ada/acats-3/tests/c4/c460a01.a: Likewise. + * ada/acats-3/tests/c4/c460a02.a: Likewise. + * ada/acats-3/tests/c4/c47002a.ada: Likewise. + * ada/acats-3/tests/c4/c47002b.ada: Likewise. + * ada/acats-3/tests/c4/c47002c.ada: Likewise. + * ada/acats-3/tests/c4/c47002d.ada: Likewise. + * ada/acats-3/tests/c4/c47003a.ada: Likewise. + * ada/acats-3/tests/c4/c47004a.ada: Likewise. + * ada/acats-3/tests/c4/c47005a.ada: Likewise. + * ada/acats-3/tests/c4/c47006a.ada: Likewise. + * ada/acats-3/tests/c4/c47007a.ada: Likewise. + * ada/acats-3/tests/c4/c47008a.ada: Likewise. + * ada/acats-3/tests/c4/c47009a.ada: Likewise. + * ada/acats-3/tests/c4/c47009b.ada: Likewise. + * ada/acats-3/tests/c4/c480001.a: Likewise. + * ada/acats-3/tests/c4/c48004a.ada: Likewise. + * ada/acats-3/tests/c4/c48004b.ada: Likewise. + * ada/acats-3/tests/c4/c48004c.ada: Likewise. + * ada/acats-3/tests/c4/c48004d.ada: Likewise. + * ada/acats-3/tests/c4/c48004e.ada: Likewise. + * ada/acats-3/tests/c4/c48004f.ada: Likewise. + * ada/acats-3/tests/c4/c48005a.ada: Likewise. + * ada/acats-3/tests/c4/c48005b.ada: Likewise. + * ada/acats-3/tests/c4/c48006a.ada: Likewise. + * ada/acats-3/tests/c4/c48006b.ada: Likewise. + * ada/acats-3/tests/c4/c48007a.ada: Likewise. + * ada/acats-3/tests/c4/c48007b.ada: Likewise. + * ada/acats-3/tests/c4/c48007c.ada: Likewise. + * ada/acats-3/tests/c4/c48008a.ada: Likewise. + * ada/acats-3/tests/c4/c48008c.ada: Likewise. + * ada/acats-3/tests/c4/c48009a.ada: Likewise. + * ada/acats-3/tests/c4/c48009b.ada: Likewise. + * ada/acats-3/tests/c4/c48009c.ada: Likewise. + * ada/acats-3/tests/c4/c48009d.ada: Likewise. + * ada/acats-3/tests/c4/c48009e.ada: Likewise. + * ada/acats-3/tests/c4/c48009f.ada: Likewise. + * ada/acats-3/tests/c4/c48009g.ada: Likewise. + * ada/acats-3/tests/c4/c48009h.ada: Likewise. + * ada/acats-3/tests/c4/c48009i.ada: Likewise. + * ada/acats-3/tests/c4/c48009j.ada: Likewise. + * ada/acats-3/tests/c4/c48010a.ada: Likewise. + * ada/acats-3/tests/c4/c48011a.ada: Likewise. + * ada/acats-3/tests/c4/c48012a.ada: Likewise. + * ada/acats-3/tests/c4/c490001.a: Likewise. + * ada/acats-3/tests/c4/c490002.a: Likewise. + * ada/acats-3/tests/c4/c490003.a: Likewise. + * ada/acats-3/tests/c4/c49020a.ada: Likewise. + * ada/acats-3/tests/c4/c49021a.ada: Likewise. + * ada/acats-3/tests/c4/c49022a.ada: Likewise. + * ada/acats-3/tests/c4/c49022b.ada: Likewise. + * ada/acats-3/tests/c4/c49022c.ada: Likewise. + * ada/acats-3/tests/c4/c49023a.ada: Likewise. + * ada/acats-3/tests/c4/c49024a.ada: Likewise. + * ada/acats-3/tests/c4/c49025a.ada: Likewise. + * ada/acats-3/tests/c4/c49026a.ada: Likewise. + * ada/acats-3/tests/c4/c4a005b.ada: Likewise. + * ada/acats-3/tests/c4/c4a006a.ada: Likewise. + * ada/acats-3/tests/c4/c4a007a.tst: Likewise. + * ada/acats-3/tests/c4/c4a010a.ada: Likewise. + * ada/acats-3/tests/c4/c4a010b.ada: Likewise. + * ada/acats-3/tests/c4/c4a011a.ada: Likewise. + * ada/acats-3/tests/c4/c4a012b.ada: Likewise. + * ada/acats-3/tests/c4/c4a013a.ada: Likewise. + * ada/acats-3/tests/c4/c4a014a.ada: Likewise. + * ada/acats-3/tests/c5/c51004a.ada: Likewise. + * ada/acats-3/tests/c5/c52005a.ada: Likewise. + * ada/acats-3/tests/c5/c52005b.ada: Likewise. + * ada/acats-3/tests/c5/c52005c.ada: Likewise. + * ada/acats-3/tests/c5/c52005d.ada: Likewise. + * ada/acats-3/tests/c5/c52005e.ada: Likewise. + * ada/acats-3/tests/c5/c52005f.ada: Likewise. + * ada/acats-3/tests/c5/c52008a.ada: Likewise. + * ada/acats-3/tests/c5/c52008b.ada: Likewise. + * ada/acats-3/tests/c5/c52009a.ada: Likewise. + * ada/acats-3/tests/c5/c52009b.ada: Likewise. + * ada/acats-3/tests/c5/c52010a.ada: Likewise. + * ada/acats-3/tests/c5/c52011a.ada: Likewise. + * ada/acats-3/tests/c5/c52011b.ada: Likewise. + * ada/acats-3/tests/c5/c52101a.ada: Likewise. + * ada/acats-3/tests/c5/c52102a.ada: Likewise. + * ada/acats-3/tests/c5/c52102b.ada: Likewise. + * ada/acats-3/tests/c5/c52102c.ada: Likewise. + * ada/acats-3/tests/c5/c52102d.ada: Likewise. + * ada/acats-3/tests/c5/c52103a.ada: Likewise. + * ada/acats-3/tests/c5/c52103b.ada: Likewise. + * ada/acats-3/tests/c5/c52103c.ada: Likewise. + * ada/acats-3/tests/c5/c52103f.ada: Likewise. + * ada/acats-3/tests/c5/c52103g.ada: Likewise. + * ada/acats-3/tests/c5/c52103h.ada: Likewise. + * ada/acats-3/tests/c5/c52103k.ada: Likewise. + * ada/acats-3/tests/c5/c52103l.ada: Likewise. + * ada/acats-3/tests/c5/c52103m.ada: Likewise. + * ada/acats-3/tests/c5/c52103p.ada: Likewise. + * ada/acats-3/tests/c5/c52103q.ada: Likewise. + * ada/acats-3/tests/c5/c52103r.ada: Likewise. + * ada/acats-3/tests/c5/c52103x.ada: Likewise. + * ada/acats-3/tests/c5/c52104a.ada: Likewise. + * ada/acats-3/tests/c5/c52104b.ada: Likewise. + * ada/acats-3/tests/c5/c52104c.ada: Likewise. + * ada/acats-3/tests/c5/c52104f.ada: Likewise. + * ada/acats-3/tests/c5/c52104g.ada: Likewise. + * ada/acats-3/tests/c5/c52104h.ada: Likewise. + * ada/acats-3/tests/c5/c52104k.ada: Likewise. + * ada/acats-3/tests/c5/c52104l.ada: Likewise. + * ada/acats-3/tests/c5/c52104m.ada: Likewise. + * ada/acats-3/tests/c5/c52104p.ada: Likewise. + * ada/acats-3/tests/c5/c52104q.ada: Likewise. + * ada/acats-3/tests/c5/c52104r.ada: Likewise. + * ada/acats-3/tests/c5/c52104x.ada: Likewise. + * ada/acats-3/tests/c5/c52104y.ada: Likewise. + * ada/acats-3/tests/c5/c53007a.ada: Likewise. + * ada/acats-3/tests/c5/c540001.a: Likewise. + * ada/acats-3/tests/c5/c540002.a: Likewise. + * ada/acats-3/tests/c5/c54a03a.ada: Likewise. + * ada/acats-3/tests/c5/c54a04a.ada: Likewise. + * ada/acats-3/tests/c5/c54a07a.ada: Likewise. + * ada/acats-3/tests/c5/c54a13a.ada: Likewise. + * ada/acats-3/tests/c5/c54a13b.ada: Likewise. + * ada/acats-3/tests/c5/c54a13c.ada: Likewise. + * ada/acats-3/tests/c5/c54a13d.ada: Likewise. + * ada/acats-3/tests/c5/c54a22a.ada: Likewise. + * ada/acats-3/tests/c5/c54a23a.ada: Likewise. + * ada/acats-3/tests/c5/c54a24a.ada: Likewise. + * ada/acats-3/tests/c5/c54a24b.ada: Likewise. + * ada/acats-3/tests/c5/c54a42a.ada: Likewise. + * ada/acats-3/tests/c5/c54a42b.ada: Likewise. + * ada/acats-3/tests/c5/c54a42c.ada: Likewise. + * ada/acats-3/tests/c5/c54a42d.ada: Likewise. + * ada/acats-3/tests/c5/c54a42e.ada: Likewise. + * ada/acats-3/tests/c5/c54a42f.ada: Likewise. + * ada/acats-3/tests/c5/c54a42g.ada: Likewise. + * ada/acats-3/tests/c5/c55b03a.ada: Likewise. + * ada/acats-3/tests/c5/c55b04a.ada: Likewise. + * ada/acats-3/tests/c5/c55b05a.ada: Likewise. + * ada/acats-3/tests/c5/c55b06a.ada: Likewise. + * ada/acats-3/tests/c5/c55b06b.ada: Likewise. + * ada/acats-3/tests/c5/c55b07a.dep: Likewise. + * ada/acats-3/tests/c5/c55b07b.dep: Likewise. + * ada/acats-3/tests/c5/c55b10a.ada: Likewise. + * ada/acats-3/tests/c5/c55b11a.ada: Likewise. + * ada/acats-3/tests/c5/c55b11b.ada: Likewise. + * ada/acats-3/tests/c5/c55b15a.ada: Likewise. + * ada/acats-3/tests/c5/c55b16a.ada: Likewise. + * ada/acats-3/tests/c5/c55c02a.ada: Likewise. + * ada/acats-3/tests/c5/c55c02b.ada: Likewise. + * ada/acats-3/tests/c5/c56002a.ada: Likewise. + * ada/acats-3/tests/c5/c57003a.ada: Likewise. + * ada/acats-3/tests/c5/c57004a.ada: Likewise. + * ada/acats-3/tests/c5/c57004b.ada: Likewise. + * ada/acats-3/tests/c5/c58004c.ada: Likewise. + * ada/acats-3/tests/c5/c58004d.ada: Likewise. + * ada/acats-3/tests/c5/c58004g.ada: Likewise. + * ada/acats-3/tests/c5/c58005a.ada: Likewise. + * ada/acats-3/tests/c5/c58005b.ada: Likewise. + * ada/acats-3/tests/c5/c58005h.ada: Likewise. + * ada/acats-3/tests/c5/c58006a.ada: Likewise. + * ada/acats-3/tests/c5/c58006b.ada: Likewise. + * ada/acats-3/tests/c5/c59002a.ada: Likewise. + * ada/acats-3/tests/c5/c59002b.ada: Likewise. + * ada/acats-3/tests/c5/c59002c.ada: Likewise. + * ada/acats-3/tests/c6/c61008a.ada: Likewise. + * ada/acats-3/tests/c6/c61009a.ada: Likewise. + * ada/acats-3/tests/c6/c61010a.ada: Likewise. + * ada/acats-3/tests/c6/c620001.a: Likewise. + * ada/acats-3/tests/c6/c620002.a: Likewise. + * ada/acats-3/tests/c6/c62002a.ada: Likewise. + * ada/acats-3/tests/c6/c62003a.ada: Likewise. + * ada/acats-3/tests/c6/c62003b.ada: Likewise. + * ada/acats-3/tests/c6/c62004a.ada: Likewise. + * ada/acats-3/tests/c6/c62006a.ada: Likewise. + * ada/acats-3/tests/c6/c631001.a: Likewise. + * ada/acats-3/tests/c6/c640001.a: Likewise. + * ada/acats-3/tests/c6/c640002.a: Likewise. + * ada/acats-3/tests/c6/c64002b.ada: Likewise. + * ada/acats-3/tests/c6/c64004g.ada: Likewise. + * ada/acats-3/tests/c6/c64005a.ada: Likewise. + * ada/acats-3/tests/c6/c64005b.ada: Likewise. + * ada/acats-3/tests/c6/c64005c.ada: Likewise. + * ada/acats-3/tests/c6/c64005d0.ada: Likewise. + * ada/acats-3/tests/c6/c64005da.ada: Likewise. + * ada/acats-3/tests/c6/c64005db.ada: Likewise. + * ada/acats-3/tests/c6/c64005dc.ada: Likewise. + * ada/acats-3/tests/c6/c641001.a: Likewise. + * ada/acats-3/tests/c6/c64103b.ada: Likewise. + * ada/acats-3/tests/c6/c64103c.ada: Likewise. + * ada/acats-3/tests/c6/c64103d.ada: Likewise. + * ada/acats-3/tests/c6/c64103e.ada: Likewise. + * ada/acats-3/tests/c6/c64103f.ada: Likewise. + * ada/acats-3/tests/c6/c64104a.ada: Likewise. + * ada/acats-3/tests/c6/c64104b.ada: Likewise. + * ada/acats-3/tests/c6/c64104c.ada: Likewise. + * ada/acats-3/tests/c6/c64104d.ada: Likewise. + * ada/acats-3/tests/c6/c64104e.ada: Likewise. + * ada/acats-3/tests/c6/c64104f.ada: Likewise. + * ada/acats-3/tests/c6/c64104g.ada: Likewise. + * ada/acats-3/tests/c6/c64104h.ada: Likewise. + * ada/acats-3/tests/c6/c64104i.ada: Likewise. + * ada/acats-3/tests/c6/c64104j.ada: Likewise. + * ada/acats-3/tests/c6/c64104k.ada: Likewise. + * ada/acats-3/tests/c6/c64104l.ada: Likewise. + * ada/acats-3/tests/c6/c64104m.ada: Likewise. + * ada/acats-3/tests/c6/c64104n.ada: Likewise. + * ada/acats-3/tests/c6/c64104o.ada: Likewise. + * ada/acats-3/tests/c6/c64105a.ada: Likewise. + * ada/acats-3/tests/c6/c64105b.ada: Likewise. + * ada/acats-3/tests/c6/c64105c.ada: Likewise. + * ada/acats-3/tests/c6/c64105d.ada: Likewise. + * ada/acats-3/tests/c6/c64106a.ada: Likewise. + * ada/acats-3/tests/c6/c64106b.ada: Likewise. + * ada/acats-3/tests/c6/c64106c.ada: Likewise. + * ada/acats-3/tests/c6/c64106d.ada: Likewise. + * ada/acats-3/tests/c6/c64107a.ada: Likewise. + * ada/acats-3/tests/c6/c64108a.ada: Likewise. + * ada/acats-3/tests/c6/c64109a.ada: Likewise. + * ada/acats-3/tests/c6/c64109b.ada: Likewise. + * ada/acats-3/tests/c6/c64109c.ada: Likewise. + * ada/acats-3/tests/c6/c64109d.ada: Likewise. + * ada/acats-3/tests/c6/c64109e.ada: Likewise. + * ada/acats-3/tests/c6/c64109f.ada: Likewise. + * ada/acats-3/tests/c6/c64109g.ada: Likewise. + * ada/acats-3/tests/c6/c64109h.ada: Likewise. + * ada/acats-3/tests/c6/c64109i.ada: Likewise. + * ada/acats-3/tests/c6/c64109j.ada: Likewise. + * ada/acats-3/tests/c6/c64109k.ada: Likewise. + * ada/acats-3/tests/c6/c64109l.ada: Likewise. + * ada/acats-3/tests/c6/c64201b.ada: Likewise. + * ada/acats-3/tests/c6/c64201c.ada: Likewise. + * ada/acats-3/tests/c6/c64202a.ada: Likewise. + * ada/acats-3/tests/c6/c650002.a: Likewise. + * ada/acats-3/tests/c6/c650003.a: Likewise. + * ada/acats-3/tests/c6/c65003a.ada: Likewise. + * ada/acats-3/tests/c6/c65003b.ada: Likewise. + * ada/acats-3/tests/c6/c650a01.a: Likewise. + * ada/acats-3/tests/c6/c651001.a: Likewise. + * ada/acats-3/tests/c6/c660001.a: Likewise. + * ada/acats-3/tests/c6/c66002a.ada: Likewise. + * ada/acats-3/tests/c6/c66002c.ada: Likewise. + * ada/acats-3/tests/c6/c66002d.ada: Likewise. + * ada/acats-3/tests/c6/c66002e.ada: Likewise. + * ada/acats-3/tests/c6/c66002f.ada: Likewise. + * ada/acats-3/tests/c6/c66002g.ada: Likewise. + * ada/acats-3/tests/c6/c67002a.ada: Likewise. + * ada/acats-3/tests/c6/c67002b.ada: Likewise. + * ada/acats-3/tests/c6/c67002c.ada: Likewise. + * ada/acats-3/tests/c6/c67002d.ada: Likewise. + * ada/acats-3/tests/c6/c67002e.ada: Likewise. + * ada/acats-3/tests/c6/c67003f.ada: Likewise. + * ada/acats-3/tests/c6/c67005a.ada: Likewise. + * ada/acats-3/tests/c6/c67005b.ada: Likewise. + * ada/acats-3/tests/c6/c67005c.ada: Likewise. + * ada/acats-3/tests/c6/c67005d.ada: Likewise. + * ada/acats-3/tests/c7/c72001b.ada: Likewise. + * ada/acats-3/tests/c7/c72002a.ada: Likewise. + * ada/acats-3/tests/c7/c730001.a: Likewise. + * ada/acats-3/tests/c7/c730002.a: Likewise. + * ada/acats-3/tests/c7/c730003.a: Likewise. + * ada/acats-3/tests/c7/c730004.a: Likewise. + * ada/acats-3/tests/c7/c73002a.ada: Likewise. + * ada/acats-3/tests/c7/c730a01.a: Likewise. + * ada/acats-3/tests/c7/c730a02.a: Likewise. + * ada/acats-3/tests/c7/c731001.a: Likewise. + * ada/acats-3/tests/c7/c74004a.ada: Likewise. + * ada/acats-3/tests/c7/c74203a.ada: Likewise. + * ada/acats-3/tests/c7/c74206a.ada: Likewise. + * ada/acats-3/tests/c7/c74207b.ada: Likewise. + * ada/acats-3/tests/c7/c74208a.ada: Likewise. + * ada/acats-3/tests/c7/c74208b.ada: Likewise. + * ada/acats-3/tests/c7/c74209a.ada: Likewise. + * ada/acats-3/tests/c7/c74210a.ada: Likewise. + * ada/acats-3/tests/c7/c74211a.ada: Likewise. + * ada/acats-3/tests/c7/c74211b.ada: Likewise. + * ada/acats-3/tests/c7/c74302a.ada: Likewise. + * ada/acats-3/tests/c7/c74302b.ada: Likewise. + * ada/acats-3/tests/c7/c74305a.ada: Likewise. + * ada/acats-3/tests/c7/c74305b.ada: Likewise. + * ada/acats-3/tests/c7/c74306a.ada: Likewise. + * ada/acats-3/tests/c7/c74307a.ada: Likewise. + * ada/acats-3/tests/c7/c74401d.ada: Likewise. + * ada/acats-3/tests/c7/c74401e.ada: Likewise. + * ada/acats-3/tests/c7/c74401k.ada: Likewise. + * ada/acats-3/tests/c7/c74401q.ada: Likewise. + * ada/acats-3/tests/c7/c74402a.ada: Likewise. + * ada/acats-3/tests/c7/c74402b.ada: Likewise. + * ada/acats-3/tests/c7/c74406a.ada: Likewise. + * ada/acats-3/tests/c7/c74407b.ada: Likewise. + * ada/acats-3/tests/c7/c74409b.ada: Likewise. + * ada/acats-3/tests/c7/c750b01.a: Likewise. + * ada/acats-3/tests/c7/c760001.a: Likewise. + * ada/acats-3/tests/c7/c760002.a: Likewise. + * ada/acats-3/tests/c7/c760007.a: Likewise. + * ada/acats-3/tests/c7/c760009.a: Likewise. + * ada/acats-3/tests/c7/c760010.a: Likewise. + * ada/acats-3/tests/c7/c760011.a: Likewise. + * ada/acats-3/tests/c7/c760012.a: Likewise. + * ada/acats-3/tests/c7/c760013.a: Likewise. + * ada/acats-3/tests/c7/c760015.a: Likewise. + * ada/acats-3/tests/c7/c760a02.a: Likewise. + * ada/acats-3/tests/c7/c761001.a: Likewise. + * ada/acats-3/tests/c7/c761002.a: Likewise. + * ada/acats-3/tests/c7/c761003.a: Likewise. + * ada/acats-3/tests/c7/c761004.a: Likewise. + * ada/acats-3/tests/c7/c761005.a: Likewise. + * ada/acats-3/tests/c7/c761006.a: Likewise. + * ada/acats-3/tests/c7/c761007.a: Likewise. + * ada/acats-3/tests/c7/c761010.a: Likewise. + * ada/acats-3/tests/c7/c761011.a: Likewise. + * ada/acats-3/tests/c7/c761012.a: Likewise. + * ada/acats-3/tests/c7/c761013.a: Likewise. + * ada/acats-3/tests/c8/c83007a.ada: Likewise. + * ada/acats-3/tests/c8/c83012d.ada: Likewise. + * ada/acats-3/tests/c8/c83022a.ada: Likewise. + * ada/acats-3/tests/c8/c83022g0.ada: Likewise. + * ada/acats-3/tests/c8/c83022g1.ada: Likewise. + * ada/acats-3/tests/c8/c83023a.ada: Likewise. + * ada/acats-3/tests/c8/c83024a.ada: Likewise. + * ada/acats-3/tests/c8/c83024e0.ada: Likewise. + * ada/acats-3/tests/c8/c83024e1.ada: Likewise. + * ada/acats-3/tests/c8/c83025a.ada: Likewise. + * ada/acats-3/tests/c8/c83025c.ada: Likewise. + * ada/acats-3/tests/c8/c83027a.ada: Likewise. + * ada/acats-3/tests/c8/c83027c.ada: Likewise. + * ada/acats-3/tests/c8/c83028a.ada: Likewise. + * ada/acats-3/tests/c8/c83029a.ada: Likewise. + * ada/acats-3/tests/c8/c83030a.ada: Likewise. + * ada/acats-3/tests/c8/c83030c.ada: Likewise. + * ada/acats-3/tests/c8/c83031a.ada: Likewise. + * ada/acats-3/tests/c8/c83031c.ada: Likewise. + * ada/acats-3/tests/c8/c83031e.ada: Likewise. + * ada/acats-3/tests/c8/c83032a.ada: Likewise. + * ada/acats-3/tests/c8/c83033a.ada: Likewise. + * ada/acats-3/tests/c8/c83051a.ada: Likewise. + * ada/acats-3/tests/c8/c83b02a.ada: Likewise. + * ada/acats-3/tests/c8/c83b02b.ada: Likewise. + * ada/acats-3/tests/c8/c83e02a.ada: Likewise. + * ada/acats-3/tests/c8/c83e02b.ada: Likewise. + * ada/acats-3/tests/c8/c83e03a.ada: Likewise. + * ada/acats-3/tests/c8/c83f01a.ada: Likewise. + * ada/acats-3/tests/c8/c83f01b.ada: Likewise. + * ada/acats-3/tests/c8/c83f01c0.ada: Likewise. + * ada/acats-3/tests/c8/c83f01c1.ada: Likewise. + * ada/acats-3/tests/c8/c83f01c2.ada: Likewise. + * ada/acats-3/tests/c8/c83f01d0.ada: Likewise. + * ada/acats-3/tests/c8/c83f01d1.ada: Likewise. + * ada/acats-3/tests/c8/c83f03a.ada: Likewise. + * ada/acats-3/tests/c8/c83f03b.ada: Likewise. + * ada/acats-3/tests/c8/c83f03c0.ada: Likewise. + * ada/acats-3/tests/c8/c83f03c1.ada: Likewise. + * ada/acats-3/tests/c8/c83f03c2.ada: Likewise. + * ada/acats-3/tests/c8/c83f03d0.ada: Likewise. + * ada/acats-3/tests/c8/c83f03d1.ada: Likewise. + * ada/acats-3/tests/c8/c840001.a: Likewise. + * ada/acats-3/tests/c8/c84002a.ada: Likewise. + * ada/acats-3/tests/c8/c84005a.ada: Likewise. + * ada/acats-3/tests/c8/c84008a.ada: Likewise. + * ada/acats-3/tests/c8/c84009a.ada: Likewise. + * ada/acats-3/tests/c8/c85004b.ada: Likewise. + * ada/acats-3/tests/c8/c85005a.ada: Likewise. + * ada/acats-3/tests/c8/c85005b.ada: Likewise. + * ada/acats-3/tests/c8/c85005c.ada: Likewise. + * ada/acats-3/tests/c8/c85005d.ada: Likewise. + * ada/acats-3/tests/c8/c85005e.ada: Likewise. + * ada/acats-3/tests/c8/c85005f.ada: Likewise. + * ada/acats-3/tests/c8/c85005g.ada: Likewise. + * ada/acats-3/tests/c8/c85006a.ada: Likewise. + * ada/acats-3/tests/c8/c85006b.ada: Likewise. + * ada/acats-3/tests/c8/c85006c.ada: Likewise. + * ada/acats-3/tests/c8/c85006d.ada: Likewise. + * ada/acats-3/tests/c8/c85006e.ada: Likewise. + * ada/acats-3/tests/c8/c85006f.ada: Likewise. + * ada/acats-3/tests/c8/c85006g.ada: Likewise. + * ada/acats-3/tests/c8/c85007a.ada: Likewise. + * ada/acats-3/tests/c8/c85007e.ada: Likewise. + * ada/acats-3/tests/c8/c85009a.ada: Likewise. + * ada/acats-3/tests/c8/c85011a.ada: Likewise. + * ada/acats-3/tests/c8/c85013a.ada: Likewise. + * ada/acats-3/tests/c8/c85014a.ada: Likewise. + * ada/acats-3/tests/c8/c85014b.ada: Likewise. + * ada/acats-3/tests/c8/c85014c.ada: Likewise. + * ada/acats-3/tests/c8/c85017a.ada: Likewise. + * ada/acats-3/tests/c8/c85018a.ada: Likewise. + * ada/acats-3/tests/c8/c85018b.ada: Likewise. + * ada/acats-3/tests/c8/c85019a.ada: Likewise. + * ada/acats-3/tests/c8/c851001.a: Likewise. + * ada/acats-3/tests/c8/c851002.a: Likewise. + * ada/acats-3/tests/c8/c854001.a: Likewise. + * ada/acats-3/tests/c8/c854002.a: Likewise. + * ada/acats-3/tests/c8/c854003.a: Likewise. + * ada/acats-3/tests/c8/c86003a.ada: Likewise. + * ada/acats-3/tests/c8/c86004a.ada: Likewise. + * ada/acats-3/tests/c8/c86004b0.ada: Likewise. + * ada/acats-3/tests/c8/c86004b1.ada: Likewise. + * ada/acats-3/tests/c8/c86004b2.ada: Likewise. + * ada/acats-3/tests/c8/c86004c0.ada: Likewise. + * ada/acats-3/tests/c8/c86004c1.ada: Likewise. + * ada/acats-3/tests/c8/c86004c2.ada: Likewise. + * ada/acats-3/tests/c8/c86006i.ada: Likewise. + * ada/acats-3/tests/c8/c86007a.ada: Likewise. + * ada/acats-3/tests/c8/c87a05a.ada: Likewise. + * ada/acats-3/tests/c8/c87a05b.ada: Likewise. + * ada/acats-3/tests/c8/c87b02a.ada: Likewise. + * ada/acats-3/tests/c8/c87b02b.ada: Likewise. + * ada/acats-3/tests/c8/c87b03a.ada: Likewise. + * ada/acats-3/tests/c8/c87b04a.ada: Likewise. + * ada/acats-3/tests/c8/c87b04b.ada: Likewise. + * ada/acats-3/tests/c8/c87b04c.ada: Likewise. + * ada/acats-3/tests/c8/c87b05a.ada: Likewise. + * ada/acats-3/tests/c8/c87b06a.ada: Likewise. + * ada/acats-3/tests/c8/c87b07a.ada: Likewise. + * ada/acats-3/tests/c8/c87b07b.ada: Likewise. + * ada/acats-3/tests/c8/c87b07c.ada: Likewise. + * ada/acats-3/tests/c8/c87b07d.ada: Likewise. + * ada/acats-3/tests/c8/c87b07e.ada: Likewise. + * ada/acats-3/tests/c8/c87b08a.ada: Likewise. + * ada/acats-3/tests/c8/c87b09a.ada: Likewise. + * ada/acats-3/tests/c8/c87b09c.ada: Likewise. + * ada/acats-3/tests/c8/c87b10a.ada: Likewise. + * ada/acats-3/tests/c8/c87b11a.ada: Likewise. + * ada/acats-3/tests/c8/c87b11b.ada: Likewise. + * ada/acats-3/tests/c8/c87b13a.ada: Likewise. + * ada/acats-3/tests/c8/c87b14a.ada: Likewise. + * ada/acats-3/tests/c8/c87b14b.ada: Likewise. + * ada/acats-3/tests/c8/c87b14c.ada: Likewise. + * ada/acats-3/tests/c8/c87b14d.ada: Likewise. + * ada/acats-3/tests/c8/c87b15a.ada: Likewise. + * ada/acats-3/tests/c8/c87b16a.ada: Likewise. + * ada/acats-3/tests/c8/c87b17a.ada: Likewise. + * ada/acats-3/tests/c8/c87b18a.ada: Likewise. + * ada/acats-3/tests/c8/c87b18b.ada: Likewise. + * ada/acats-3/tests/c8/c87b19a.ada: Likewise. + * ada/acats-3/tests/c8/c87b23a.ada: Likewise. + * ada/acats-3/tests/c8/c87b24a.ada: Likewise. + * ada/acats-3/tests/c8/c87b24b.ada: Likewise. + * ada/acats-3/tests/c8/c87b26b.ada: Likewise. + * ada/acats-3/tests/c8/c87b27a.ada: Likewise. + * ada/acats-3/tests/c8/c87b28a.ada: Likewise. + * ada/acats-3/tests/c8/c87b29a.ada: Likewise. + * ada/acats-3/tests/c8/c87b30a.ada: Likewise. + * ada/acats-3/tests/c8/c87b31a.ada: Likewise. + * ada/acats-3/tests/c8/c87b32a.ada: Likewise. + * ada/acats-3/tests/c8/c87b33a.ada: Likewise. + * ada/acats-3/tests/c8/c87b34a.ada: Likewise. + * ada/acats-3/tests/c8/c87b34b.ada: Likewise. + * ada/acats-3/tests/c8/c87b34c.ada: Likewise. + * ada/acats-3/tests/c8/c87b35c.ada: Likewise. + * ada/acats-3/tests/c8/c87b38a.ada: Likewise. + * ada/acats-3/tests/c8/c87b39a.ada: Likewise. + * ada/acats-3/tests/c8/c87b40a.ada: Likewise. + * ada/acats-3/tests/c8/c87b41a.ada: Likewise. + * ada/acats-3/tests/c8/c87b42a.ada: Likewise. + * ada/acats-3/tests/c8/c87b43a.ada: Likewise. + * ada/acats-3/tests/c8/c87b44a.ada: Likewise. + * ada/acats-3/tests/c8/c87b45a.ada: Likewise. + * ada/acats-3/tests/c8/c87b45c.ada: Likewise. + * ada/acats-3/tests/c8/c87b47a.ada: Likewise. + * ada/acats-3/tests/c8/c87b48a.ada: Likewise. + * ada/acats-3/tests/c8/c87b48b.ada: Likewise. + * ada/acats-3/tests/c8/c87b50a.ada: Likewise. + * ada/acats-3/tests/c8/c87b54a.ada: Likewise. + * ada/acats-3/tests/c8/c87b57a.ada: Likewise. + * ada/acats-3/tests/c8/c87b62a.ada: Likewise. + * ada/acats-3/tests/c8/c87b62b.ada: Likewise. + * ada/acats-3/tests/c8/c87b62c.ada: Likewise. + * ada/acats-3/tests/c8/c87b62d.tst: Likewise. + * ada/acats-3/tests/c9/c910001.a: Likewise. + * ada/acats-3/tests/c9/c910002.a: Likewise. + * ada/acats-3/tests/c9/c910003.a: Likewise. + * ada/acats-3/tests/c9/c91004b.ada: Likewise. + * ada/acats-3/tests/c9/c91004c.ada: Likewise. + * ada/acats-3/tests/c9/c91006a.ada: Likewise. + * ada/acats-3/tests/c9/c91007a.ada: Likewise. + * ada/acats-3/tests/c9/c920001.a: Likewise. + * ada/acats-3/tests/c9/c92002a.ada: Likewise. + * ada/acats-3/tests/c9/c92003a.ada: Likewise. + * ada/acats-3/tests/c9/c92005a.ada: Likewise. + * ada/acats-3/tests/c9/c92005b.ada: Likewise. + * ada/acats-3/tests/c9/c92006a.ada: Likewise. + * ada/acats-3/tests/c9/c930001.a: Likewise. + * ada/acats-3/tests/c9/c93001a.ada: Likewise. + * ada/acats-3/tests/c9/c93002a.ada: Likewise. + * ada/acats-3/tests/c9/c93003a.ada: Likewise. + * ada/acats-3/tests/c9/c93004a.ada: Likewise. + * ada/acats-3/tests/c9/c93004b.ada: Likewise. + * ada/acats-3/tests/c9/c93004c.ada: Likewise. + * ada/acats-3/tests/c9/c93004d.ada: Likewise. + * ada/acats-3/tests/c9/c93004f.ada: Likewise. + * ada/acats-3/tests/c9/c93005a.ada: Likewise. + * ada/acats-3/tests/c9/c93005b.ada: Likewise. + * ada/acats-3/tests/c9/c93005c.ada: Likewise. + * ada/acats-3/tests/c9/c93005d.ada: Likewise. + * ada/acats-3/tests/c9/c93005e.ada: Likewise. + * ada/acats-3/tests/c9/c93005f.ada: Likewise. + * ada/acats-3/tests/c9/c93005g.ada: Likewise. + * ada/acats-3/tests/c9/c93005h.ada: Likewise. + * ada/acats-3/tests/c9/c93006a.ada: Likewise. + * ada/acats-3/tests/c9/c93007a.ada: Likewise. + * ada/acats-3/tests/c9/c93008a.ada: Likewise. + * ada/acats-3/tests/c9/c93008b.ada: Likewise. + * ada/acats-3/tests/c9/c940001.a: Likewise. + * ada/acats-3/tests/c9/c940002.a: Likewise. + * ada/acats-3/tests/c9/c940004.a: Likewise. + * ada/acats-3/tests/c9/c940005.a: Likewise. + * ada/acats-3/tests/c9/c940006.a: Likewise. + * ada/acats-3/tests/c9/c940007.a: Likewise. + * ada/acats-3/tests/c9/c940010.a: Likewise. + * ada/acats-3/tests/c9/c940011.a: Likewise. + * ada/acats-3/tests/c9/c940012.a: Likewise. + * ada/acats-3/tests/c9/c940013.a: Likewise. + * ada/acats-3/tests/c9/c940014.a: Likewise. + * ada/acats-3/tests/c9/c940015.a: Likewise. + * ada/acats-3/tests/c9/c940016.a: Likewise. + * ada/acats-3/tests/c9/c940017.a: Likewise. + * ada/acats-3/tests/c9/c94001a.ada: Likewise. + * ada/acats-3/tests/c9/c94001b.ada: Likewise. + * ada/acats-3/tests/c9/c94001c.ada: Likewise. + * ada/acats-3/tests/c9/c94001e.ada: Likewise. + * ada/acats-3/tests/c9/c94001f.ada: Likewise. + * ada/acats-3/tests/c9/c94001g.ada: Likewise. + * ada/acats-3/tests/c9/c94002a.ada: Likewise. + * ada/acats-3/tests/c9/c94002b.ada: Likewise. + * ada/acats-3/tests/c9/c94002d.ada: Likewise. + * ada/acats-3/tests/c9/c94002e.ada: Likewise. + * ada/acats-3/tests/c9/c94002f.ada: Likewise. + * ada/acats-3/tests/c9/c94002g.ada: Likewise. + * ada/acats-3/tests/c9/c94004a.ada: Likewise. + * ada/acats-3/tests/c9/c94004b.ada: Likewise. + * ada/acats-3/tests/c9/c94004c.ada: Likewise. + * ada/acats-3/tests/c9/c94005a.ada: Likewise. + * ada/acats-3/tests/c9/c94005b.ada: Likewise. + * ada/acats-3/tests/c9/c94006a.ada: Likewise. + * ada/acats-3/tests/c9/c94007a.ada: Likewise. + * ada/acats-3/tests/c9/c94007b.ada: Likewise. + * ada/acats-3/tests/c9/c94008a.ada: Likewise. + * ada/acats-3/tests/c9/c94008b.ada: Likewise. + * ada/acats-3/tests/c9/c94008c.ada: Likewise. + * ada/acats-3/tests/c9/c94008d.ada: Likewise. + * ada/acats-3/tests/c9/c94010a.ada: Likewise. + * ada/acats-3/tests/c9/c94011a.ada: Likewise. + * ada/acats-3/tests/c9/c94020a.ada: Likewise. + * ada/acats-3/tests/c9/c940a03.a: Likewise. + * ada/acats-3/tests/c9/c95008a.ada: Likewise. + * ada/acats-3/tests/c9/c95009a.ada: Likewise. + * ada/acats-3/tests/c9/c95010a.ada: Likewise. + * ada/acats-3/tests/c9/c95011a.ada: Likewise. + * ada/acats-3/tests/c9/c95012a.ada: Likewise. + * ada/acats-3/tests/c9/c95021a.ada: Likewise. + * ada/acats-3/tests/c9/c95022a.ada: Likewise. + * ada/acats-3/tests/c9/c95022b.ada: Likewise. + * ada/acats-3/tests/c9/c95033a.ada: Likewise. + * ada/acats-3/tests/c9/c95033b.ada: Likewise. + * ada/acats-3/tests/c9/c95034a.ada: Likewise. + * ada/acats-3/tests/c9/c95034b.ada: Likewise. + * ada/acats-3/tests/c9/c95035a.ada: Likewise. + * ada/acats-3/tests/c9/c95040a.ada: Likewise. + * ada/acats-3/tests/c9/c95040b.ada: Likewise. + * ada/acats-3/tests/c9/c95040c.ada: Likewise. + * ada/acats-3/tests/c9/c95040d.ada: Likewise. + * ada/acats-3/tests/c9/c95041a.ada: Likewise. + * ada/acats-3/tests/c9/c95065a.ada: Likewise. + * ada/acats-3/tests/c9/c95065b.ada: Likewise. + * ada/acats-3/tests/c9/c95065c.ada: Likewise. + * ada/acats-3/tests/c9/c95065d.ada: Likewise. + * ada/acats-3/tests/c9/c95065e.ada: Likewise. + * ada/acats-3/tests/c9/c95065f.ada: Likewise. + * ada/acats-3/tests/c9/c95066a.ada: Likewise. + * ada/acats-3/tests/c9/c95067a.ada: Likewise. + * ada/acats-3/tests/c9/c95071a.ada: Likewise. + * ada/acats-3/tests/c9/c95072a.ada: Likewise. + * ada/acats-3/tests/c9/c95072b.ada: Likewise. + * ada/acats-3/tests/c9/c95073a.ada: Likewise. + * ada/acats-3/tests/c9/c95074c.ada: Likewise. + * ada/acats-3/tests/c9/c95076a.ada: Likewise. + * ada/acats-3/tests/c9/c95078a.ada: Likewise. + * ada/acats-3/tests/c9/c95080b.ada: Likewise. + * ada/acats-3/tests/c9/c95082g.ada: Likewise. + * ada/acats-3/tests/c9/c95085a.ada: Likewise. + * ada/acats-3/tests/c9/c95085b.ada: Likewise. + * ada/acats-3/tests/c9/c95085c.ada: Likewise. + * ada/acats-3/tests/c9/c95085d.ada: Likewise. + * ada/acats-3/tests/c9/c95085e.ada: Likewise. + * ada/acats-3/tests/c9/c95085f.ada: Likewise. + * ada/acats-3/tests/c9/c95085g.ada: Likewise. + * ada/acats-3/tests/c9/c95085h.ada: Likewise. + * ada/acats-3/tests/c9/c95085i.ada: Likewise. + * ada/acats-3/tests/c9/c95085j.ada: Likewise. + * ada/acats-3/tests/c9/c95085k.ada: Likewise. + * ada/acats-3/tests/c9/c95085l.ada: Likewise. + * ada/acats-3/tests/c9/c95085m.ada: Likewise. + * ada/acats-3/tests/c9/c95085n.ada: Likewise. + * ada/acats-3/tests/c9/c95085o.ada: Likewise. + * ada/acats-3/tests/c9/c95086a.ada: Likewise. + * ada/acats-3/tests/c9/c95086b.ada: Likewise. + * ada/acats-3/tests/c9/c95086c.ada: Likewise. + * ada/acats-3/tests/c9/c95086d.ada: Likewise. + * ada/acats-3/tests/c9/c95086e.ada: Likewise. + * ada/acats-3/tests/c9/c95086f.ada: Likewise. + * ada/acats-3/tests/c9/c95087a.ada: Likewise. + * ada/acats-3/tests/c9/c95087b.ada: Likewise. + * ada/acats-3/tests/c9/c95087c.ada: Likewise. + * ada/acats-3/tests/c9/c95087d.ada: Likewise. + * ada/acats-3/tests/c9/c95088a.ada: Likewise. + * ada/acats-3/tests/c9/c95089a.ada: Likewise. + * ada/acats-3/tests/c9/c95090a.ada: Likewise. + * ada/acats-3/tests/c9/c95092a.ada: Likewise. + * ada/acats-3/tests/c9/c95093a.ada: Likewise. + * ada/acats-3/tests/c9/c95095a.ada: Likewise. + * ada/acats-3/tests/c9/c95095b.ada: Likewise. + * ada/acats-3/tests/c9/c95095c.ada: Likewise. + * ada/acats-3/tests/c9/c95095d.ada: Likewise. + * ada/acats-3/tests/c9/c95095e.ada: Likewise. + * ada/acats-3/tests/c9/c951001.a: Likewise. + * ada/acats-3/tests/c9/c951002.a: Likewise. + * ada/acats-3/tests/c9/c953001.a: Likewise. + * ada/acats-3/tests/c9/c953002.a: Likewise. + * ada/acats-3/tests/c9/c953003.a: Likewise. + * ada/acats-3/tests/c9/c954001.a: Likewise. + * ada/acats-3/tests/c9/c954010.a: Likewise. + * ada/acats-3/tests/c9/c954011.a: Likewise. + * ada/acats-3/tests/c9/c954012.a: Likewise. + * ada/acats-3/tests/c9/c954013.a: Likewise. + * ada/acats-3/tests/c9/c954014.a: Likewise. + * ada/acats-3/tests/c9/c954015.a: Likewise. + * ada/acats-3/tests/c9/c954016.a: Likewise. + * ada/acats-3/tests/c9/c954017.a: Likewise. + * ada/acats-3/tests/c9/c954018.a: Likewise. + * ada/acats-3/tests/c9/c954019.a: Likewise. + * ada/acats-3/tests/c9/c954020.a: Likewise. + * ada/acats-3/tests/c9/c954021.a: Likewise. + * ada/acats-3/tests/c9/c954022.a: Likewise. + * ada/acats-3/tests/c9/c954023.a: Likewise. + * ada/acats-3/tests/c9/c954024.a: Likewise. + * ada/acats-3/tests/c9/c954025.a: Likewise. + * ada/acats-3/tests/c9/c954026.a: Likewise. + * ada/acats-3/tests/c9/c954a01.a: Likewise. + * ada/acats-3/tests/c9/c954a02.a: Likewise. + * ada/acats-3/tests/c9/c954a03.a: Likewise. + * ada/acats-3/tests/c9/c960001.a: Likewise. + * ada/acats-3/tests/c9/c960002.a: Likewise. + * ada/acats-3/tests/c9/c960004.a: Likewise. + * ada/acats-3/tests/c9/c96001a.ada: Likewise. + * ada/acats-3/tests/c9/c96004a.ada: Likewise. + * ada/acats-3/tests/c9/c96005a.ada: Likewise. + * ada/acats-3/tests/c9/c96005b.tst: Likewise. + * ada/acats-3/tests/c9/c96005d.ada: Likewise. + * ada/acats-3/tests/c9/c96005f.ada: Likewise. + * ada/acats-3/tests/c9/c96006a.ada: Likewise. + * ada/acats-3/tests/c9/c96007a.ada: Likewise. + * ada/acats-3/tests/c9/c96008a.ada: Likewise. + * ada/acats-3/tests/c9/c96008b.ada: Likewise. + * ada/acats-3/tests/c9/c97112a.ada: Likewise. + * ada/acats-3/tests/c9/c97113a.ada: Likewise. + * ada/acats-3/tests/c9/c97114a.ada: Likewise. + * ada/acats-3/tests/c9/c97115a.ada: Likewise. + * ada/acats-3/tests/c9/c97116a.ada: Likewise. + * ada/acats-3/tests/c9/c97117a.ada: Likewise. + * ada/acats-3/tests/c9/c97117b.ada: Likewise. + * ada/acats-3/tests/c9/c97117c.ada: Likewise. + * ada/acats-3/tests/c9/c97118a.ada: Likewise. + * ada/acats-3/tests/c9/c97120a.ada: Likewise. + * ada/acats-3/tests/c9/c97120b.ada: Likewise. + * ada/acats-3/tests/c9/c97201a.ada: Likewise. + * ada/acats-3/tests/c9/c97201b.ada: Likewise. + * ada/acats-3/tests/c9/c97201c.ada: Likewise. + * ada/acats-3/tests/c9/c97201d.ada: Likewise. + * ada/acats-3/tests/c9/c97201e.ada: Likewise. + * ada/acats-3/tests/c9/c97201g.ada: Likewise. + * ada/acats-3/tests/c9/c97201h.ada: Likewise. + * ada/acats-3/tests/c9/c97201x.ada: Likewise. + * ada/acats-3/tests/c9/c97202a.ada: Likewise. + * ada/acats-3/tests/c9/c97203a.ada: Likewise. + * ada/acats-3/tests/c9/c97203b.ada: Likewise. + * ada/acats-3/tests/c9/c97203c.ada: Likewise. + * ada/acats-3/tests/c9/c97204a.ada: Likewise. + * ada/acats-3/tests/c9/c97204b.ada: Likewise. + * ada/acats-3/tests/c9/c97205a.ada: Likewise. + * ada/acats-3/tests/c9/c97205b.ada: Likewise. + * ada/acats-3/tests/c9/c97301a.ada: Likewise. + * ada/acats-3/tests/c9/c97301b.ada: Likewise. + * ada/acats-3/tests/c9/c97301c.ada: Likewise. + * ada/acats-3/tests/c9/c97301d.ada: Likewise. + * ada/acats-3/tests/c9/c97301e.ada: Likewise. + * ada/acats-3/tests/c9/c97302a.ada: Likewise. + * ada/acats-3/tests/c9/c97303a.ada: Likewise. + * ada/acats-3/tests/c9/c97303b.ada: Likewise. + * ada/acats-3/tests/c9/c97303c.ada: Likewise. + * ada/acats-3/tests/c9/c97304a.ada: Likewise. + * ada/acats-3/tests/c9/c97304b.ada: Likewise. + * ada/acats-3/tests/c9/c97305a.ada: Likewise. + * ada/acats-3/tests/c9/c97305b.ada: Likewise. + * ada/acats-3/tests/c9/c97305c.ada: Likewise. + * ada/acats-3/tests/c9/c97305d.ada: Likewise. + * ada/acats-3/tests/c9/c97307a.ada: Likewise. + * ada/acats-3/tests/c9/c974001.a: Likewise. + * ada/acats-3/tests/c9/c974002.a: Likewise. + * ada/acats-3/tests/c9/c974003.a: Likewise. + * ada/acats-3/tests/c9/c974004.a: Likewise. + * ada/acats-3/tests/c9/c974005.a: Likewise. + * ada/acats-3/tests/c9/c974006.a: Likewise. + * ada/acats-3/tests/c9/c974007.a: Likewise. + * ada/acats-3/tests/c9/c974008.a: Likewise. + * ada/acats-3/tests/c9/c974009.a: Likewise. + * ada/acats-3/tests/c9/c974010.a: Likewise. + * ada/acats-3/tests/c9/c974011.a: Likewise. + * ada/acats-3/tests/c9/c974012.a: Likewise. + * ada/acats-3/tests/c9/c974013.a: Likewise. + * ada/acats-3/tests/c9/c974014.a: Likewise. + * ada/acats-3/tests/c9/c980001.a: Likewise. + * ada/acats-3/tests/c9/c980002.a: Likewise. + * ada/acats-3/tests/c9/c980003.a: Likewise. + * ada/acats-3/tests/c9/c990001.a: Likewise. + * ada/acats-3/tests/c9/c99005a.ada: Likewise. + * ada/acats-3/tests/c9/c9a003a.ada: Likewise. + * ada/acats-3/tests/c9/c9a004a.ada: Likewise. + * ada/acats-3/tests/c9/c9a007a.ada: Likewise. + * ada/acats-3/tests/c9/c9a009a.ada: Likewise. + * ada/acats-3/tests/c9/c9a009c.ada: Likewise. + * ada/acats-3/tests/c9/c9a009f.ada: Likewise. + * ada/acats-3/tests/c9/c9a009g.ada: Likewise. + * ada/acats-3/tests/c9/c9a009h.ada: Likewise. + * ada/acats-3/tests/c9/c9a010a.ada: Likewise. + * ada/acats-3/tests/c9/c9a011a.ada: Likewise. + * ada/acats-3/tests/c9/c9a011b.ada: Likewise. + * ada/acats-3/tests/ca/ca1003a.ada: Likewise. + * ada/acats-3/tests/ca/ca1004a.ada: Likewise. + * ada/acats-3/tests/ca/ca1005a.ada: Likewise. + * ada/acats-3/tests/ca/ca1006a.ada: Likewise. + * ada/acats-3/tests/ca/ca1011a0.ada: Likewise. + * ada/acats-3/tests/ca/ca1011a1.ada: Likewise. + * ada/acats-3/tests/ca/ca1011a2.ada: Likewise. + * ada/acats-3/tests/ca/ca1011a3.ada: Likewise. + * ada/acats-3/tests/ca/ca1011a4.ada: Likewise. + * ada/acats-3/tests/ca/ca1011a5.ada: Likewise. + * ada/acats-3/tests/ca/ca1011a6.ada: Likewise. + * ada/acats-3/tests/ca/ca1012a0.ada: Likewise. + * ada/acats-3/tests/ca/ca1012a1.ada: Likewise. + * ada/acats-3/tests/ca/ca1012a2.ada: Likewise. + * ada/acats-3/tests/ca/ca1012a3.ada: Likewise. + * ada/acats-3/tests/ca/ca1012a4.ada: Likewise. + * ada/acats-3/tests/ca/ca1012b0.ada: Likewise. + * ada/acats-3/tests/ca/ca1012b2.ada: Likewise. + * ada/acats-3/tests/ca/ca1012b4.ada: Likewise. + * ada/acats-3/tests/ca/ca1013a0.ada: Likewise. + * ada/acats-3/tests/ca/ca1013a1.ada: Likewise. + * ada/acats-3/tests/ca/ca1013a2.ada: Likewise. + * ada/acats-3/tests/ca/ca1013a3.ada: Likewise. + * ada/acats-3/tests/ca/ca1013a4.ada: Likewise. + * ada/acats-3/tests/ca/ca1013a5.ada: Likewise. + * ada/acats-3/tests/ca/ca1013a6.ada: Likewise. + * ada/acats-3/tests/ca/ca1014a0.ada: Likewise. + * ada/acats-3/tests/ca/ca1014a1.ada: Likewise. + * ada/acats-3/tests/ca/ca1014a2.ada: Likewise. + * ada/acats-3/tests/ca/ca1014a3.ada: Likewise. + * ada/acats-3/tests/ca/ca1020e0.ada: Likewise. + * ada/acats-3/tests/ca/ca1020e1.ada: Likewise. + * ada/acats-3/tests/ca/ca1020e2.ada: Likewise. + * ada/acats-3/tests/ca/ca1020e3.ada: Likewise. + * ada/acats-3/tests/ca/ca1022a0.ada: Likewise. + * ada/acats-3/tests/ca/ca1022a1.ada: Likewise. + * ada/acats-3/tests/ca/ca1022a2.ada: Likewise. + * ada/acats-3/tests/ca/ca1022a3.ada: Likewise. + * ada/acats-3/tests/ca/ca1022a4.ada: Likewise. + * ada/acats-3/tests/ca/ca1022a5.ada: Likewise. + * ada/acats-3/tests/ca/ca1022a6.ada: Likewise. + * ada/acats-3/tests/ca/ca11001.a: Likewise. + * ada/acats-3/tests/ca/ca11002.a: Likewise. + * ada/acats-3/tests/ca/ca11003.a: Likewise. + * ada/acats-3/tests/ca/ca110040.a: Likewise. + * ada/acats-3/tests/ca/ca110041.a: Likewise. + * ada/acats-3/tests/ca/ca110042.am: Likewise. + * ada/acats-3/tests/ca/ca110050.a: Likewise. + * ada/acats-3/tests/ca/ca110051.am: Likewise. + * ada/acats-3/tests/ca/ca11006.a: Likewise. + * ada/acats-3/tests/ca/ca11007.a: Likewise. + * ada/acats-3/tests/ca/ca11008.a: Likewise. + * ada/acats-3/tests/ca/ca11009.a: Likewise. + * ada/acats-3/tests/ca/ca11010.a: Likewise. + * ada/acats-3/tests/ca/ca11011.a: Likewise. + * ada/acats-3/tests/ca/ca11012.a: Likewise. + * ada/acats-3/tests/ca/ca11013.a: Likewise. + * ada/acats-3/tests/ca/ca11014.a: Likewise. + * ada/acats-3/tests/ca/ca11015.a: Likewise. + * ada/acats-3/tests/ca/ca11016.a: Likewise. + * ada/acats-3/tests/ca/ca11017.a: Likewise. + * ada/acats-3/tests/ca/ca11018.a: Likewise. + * ada/acats-3/tests/ca/ca11019.a: Likewise. + * ada/acats-3/tests/ca/ca11020.a: Likewise. + * ada/acats-3/tests/ca/ca11021.a: Likewise. + * ada/acats-3/tests/ca/ca11022.a: Likewise. + * ada/acats-3/tests/ca/ca110230.a: Likewise. + * ada/acats-3/tests/ca/ca110231.a: Likewise. + * ada/acats-3/tests/ca/ca110232.am: Likewise. + * ada/acats-3/tests/ca/ca1102a0.ada: Likewise. + * ada/acats-3/tests/ca/ca1102a1.ada: Likewise. + * ada/acats-3/tests/ca/ca1102a2.ada: Likewise. + * ada/acats-3/tests/ca/ca1106a.ada: Likewise. + * ada/acats-3/tests/ca/ca1108a.ada: Likewise. + * ada/acats-3/tests/ca/ca1108b.ada: Likewise. + * ada/acats-3/tests/ca/ca11a01.a: Likewise. + * ada/acats-3/tests/ca/ca11a02.a: Likewise. + * ada/acats-3/tests/ca/ca11b01.a: Likewise. + * ada/acats-3/tests/ca/ca11b02.a: Likewise. + * ada/acats-3/tests/ca/ca11c01.a: Likewise. + * ada/acats-3/tests/ca/ca11c02.a: Likewise. + * ada/acats-3/tests/ca/ca11c03.a: Likewise. + * ada/acats-3/tests/ca/ca11d010.a: Likewise. + * ada/acats-3/tests/ca/ca11d011.a: Likewise. + * ada/acats-3/tests/ca/ca11d012.a: Likewise. + * ada/acats-3/tests/ca/ca11d013.am: Likewise. + * ada/acats-3/tests/ca/ca11d02.a: Likewise. + * ada/acats-3/tests/ca/ca11d03.a: Likewise. + * ada/acats-3/tests/ca/ca120010.a: Likewise. + * ada/acats-3/tests/ca/ca120011.a: Likewise. + * ada/acats-3/tests/ca/ca120012.am: Likewise. + * ada/acats-3/tests/ca/ca12002.a: Likewise. + * ada/acats-3/tests/ca/ca13001.a: Likewise. + * ada/acats-3/tests/ca/ca13002.a: Likewise. + * ada/acats-3/tests/ca/ca13003.a: Likewise. + * ada/acats-3/tests/ca/ca13a01.a: Likewise. + * ada/acats-3/tests/ca/ca13a02.a: Likewise. + * ada/acats-3/tests/ca/ca140230.a: Likewise. + * ada/acats-3/tests/ca/ca140231.a: Likewise. + * ada/acats-3/tests/ca/ca140232.am: Likewise. + * ada/acats-3/tests/ca/ca140233.a: Likewise. + * ada/acats-3/tests/ca/ca140280.a: Likewise. + * ada/acats-3/tests/ca/ca140281.a: Likewise. + * ada/acats-3/tests/ca/ca140282.a: Likewise. + * ada/acats-3/tests/ca/ca140283.am: Likewise. + * ada/acats-3/tests/ca/ca15003.a: Likewise. + * ada/acats-3/tests/ca/ca200020.a: Likewise. + * ada/acats-3/tests/ca/ca200021.a: Likewise. + * ada/acats-3/tests/ca/ca200022.am: Likewise. + * ada/acats-3/tests/ca/ca200030.a: Likewise. + * ada/acats-3/tests/ca/ca200031.am: Likewise. + * ada/acats-3/tests/ca/ca2001h0.ada: Likewise. + * ada/acats-3/tests/ca/ca2001h1.ada: Likewise. + * ada/acats-3/tests/ca/ca2001h2.ada: Likewise. + * ada/acats-3/tests/ca/ca2001h3.ada: Likewise. + * ada/acats-3/tests/ca/ca2002a0.ada: Likewise. + * ada/acats-3/tests/ca/ca2002a1.ada: Likewise. + * ada/acats-3/tests/ca/ca2002a2.ada: Likewise. + * ada/acats-3/tests/ca/ca2003a0.ada: Likewise. + * ada/acats-3/tests/ca/ca2003a1.ada: Likewise. + * ada/acats-3/tests/ca/ca2004a0.ada: Likewise. + * ada/acats-3/tests/ca/ca2004a1.ada: Likewise. + * ada/acats-3/tests/ca/ca2004a2.ada: Likewise. + * ada/acats-3/tests/ca/ca2004a3.ada: Likewise. + * ada/acats-3/tests/ca/ca2004a4.ada: Likewise. + * ada/acats-3/tests/ca/ca2007a0.ada: Likewise. + * ada/acats-3/tests/ca/ca2007a1.ada: Likewise. + * ada/acats-3/tests/ca/ca2007a2.ada: Likewise. + * ada/acats-3/tests/ca/ca2007a3.ada: Likewise. + * ada/acats-3/tests/ca/ca2008a0.ada: Likewise. + * ada/acats-3/tests/ca/ca2008a1.ada: Likewise. + * ada/acats-3/tests/ca/ca2008a2.ada: Likewise. + * ada/acats-3/tests/ca/ca2009a.ada: Likewise. + * ada/acats-3/tests/ca/ca2009c0.ada: Likewise. + * ada/acats-3/tests/ca/ca2009c1.ada: Likewise. + * ada/acats-3/tests/ca/ca2009d.ada: Likewise. + * ada/acats-3/tests/ca/ca2009f0.ada: Likewise. + * ada/acats-3/tests/ca/ca2009f1.ada: Likewise. + * ada/acats-3/tests/ca/ca2009f2.ada: Likewise. + * ada/acats-3/tests/ca/ca2011b.ada: Likewise. + * ada/acats-3/tests/ca/ca21001.a: Likewise. + * ada/acats-3/tests/ca/ca3011a0.ada: Likewise. + * ada/acats-3/tests/ca/ca3011a1.ada: Likewise. + * ada/acats-3/tests/ca/ca3011a2.ada: Likewise. + * ada/acats-3/tests/ca/ca3011a3.ada: Likewise. + * ada/acats-3/tests/ca/ca3011a4.ada: Likewise. + * ada/acats-3/tests/ca/ca5003a0.ada: Likewise. + * ada/acats-3/tests/ca/ca5003a1.ada: Likewise. + * ada/acats-3/tests/ca/ca5003a2.ada: Likewise. + * ada/acats-3/tests/ca/ca5003a3.ada: Likewise. + * ada/acats-3/tests/ca/ca5003a4.ada: Likewise. + * ada/acats-3/tests/ca/ca5003a5.ada: Likewise. + * ada/acats-3/tests/ca/ca5003a6.ada: Likewise. + * ada/acats-3/tests/ca/ca5003b0.ada: Likewise. + * ada/acats-3/tests/ca/ca5003b1.ada: Likewise. + * ada/acats-3/tests/ca/ca5003b2.ada: Likewise. + * ada/acats-3/tests/ca/ca5003b3.ada: Likewise. + * ada/acats-3/tests/ca/ca5003b4.ada: Likewise. + * ada/acats-3/tests/ca/ca5003b5.ada: Likewise. + * ada/acats-3/tests/ca/ca5004a.ada: Likewise. + * ada/acats-3/tests/ca/ca5004b0.ada: Likewise. + * ada/acats-3/tests/ca/ca5004b1.ada: Likewise. + * ada/acats-3/tests/ca/ca5004b2.ada: Likewise. + * ada/acats-3/tests/ca/ca5006a.ada: Likewise. + * ada/acats-3/tests/cb/cb10002.a: Likewise. + * ada/acats-3/tests/cb/cb1001a.ada: Likewise. + * ada/acats-3/tests/cb/cb1004a.ada: Likewise. + * ada/acats-3/tests/cb/cb1005a.ada: Likewise. + * ada/acats-3/tests/cb/cb1010a.ada: Likewise. + * ada/acats-3/tests/cb/cb1010c.ada: Likewise. + * ada/acats-3/tests/cb/cb1010d.ada: Likewise. + * ada/acats-3/tests/cb/cb20001.a: Likewise. + * ada/acats-3/tests/cb/cb20003.a: Likewise. + * ada/acats-3/tests/cb/cb20004.a: Likewise. + * ada/acats-3/tests/cb/cb20005.a: Likewise. + * ada/acats-3/tests/cb/cb20006.a: Likewise. + * ada/acats-3/tests/cb/cb20007.a: Likewise. + * ada/acats-3/tests/cb/cb2004a.ada: Likewise. + * ada/acats-3/tests/cb/cb2005a.ada: Likewise. + * ada/acats-3/tests/cb/cb2006a.ada: Likewise. + * ada/acats-3/tests/cb/cb2007a.ada: Likewise. + * ada/acats-3/tests/cb/cb20a02.a: Likewise. + * ada/acats-3/tests/cb/cb30001.a: Likewise. + * ada/acats-3/tests/cb/cb3003a.ada: Likewise. + * ada/acats-3/tests/cb/cb3003b.ada: Likewise. + * ada/acats-3/tests/cb/cb3004a.ada: Likewise. + * ada/acats-3/tests/cb/cb40005.a: Likewise. + * ada/acats-3/tests/cb/cb4001a.ada: Likewise. + * ada/acats-3/tests/cb/cb4002a.ada: Likewise. + * ada/acats-3/tests/cb/cb4003a.ada: Likewise. + * ada/acats-3/tests/cb/cb4004a.ada: Likewise. + * ada/acats-3/tests/cb/cb4005a.ada: Likewise. + * ada/acats-3/tests/cb/cb4006a.ada: Likewise. + * ada/acats-3/tests/cb/cb4007a.ada: Likewise. + * ada/acats-3/tests/cb/cb4008a.ada: Likewise. + * ada/acats-3/tests/cb/cb4009a.ada: Likewise. + * ada/acats-3/tests/cb/cb4013a.ada: Likewise. + * ada/acats-3/tests/cb/cb40a01.a: Likewise. + * ada/acats-3/tests/cb/cb40a020.a: Likewise. + * ada/acats-3/tests/cb/cb40a021.am: Likewise. + * ada/acats-3/tests/cb/cb40a030.a: Likewise. + * ada/acats-3/tests/cb/cb40a031.am: Likewise. + * ada/acats-3/tests/cb/cb40a04.a: Likewise. + * ada/acats-3/tests/cb/cb41001.a: Likewise. + * ada/acats-3/tests/cb/cb41002.a: Likewise. + * ada/acats-3/tests/cb/cb41003.a: Likewise. + * ada/acats-3/tests/cb/cb41004.a: Likewise. + * ada/acats-3/tests/cb/cb42001.a: Likewise. + * ada/acats-3/tests/cb/cb42002.a: Likewise. + * ada/acats-3/tests/cb/cb42003.a: Likewise. + * ada/acats-3/tests/cb/cb5001a.ada: Likewise. + * ada/acats-3/tests/cb/cb5001b.ada: Likewise. + * ada/acats-3/tests/cb/cb5002a.ada: Likewise. + * ada/acats-3/tests/cc/cc1004a.ada: Likewise. + * ada/acats-3/tests/cc/cc1005b.ada: Likewise. + * ada/acats-3/tests/cc/cc1010a.ada: Likewise. + * ada/acats-3/tests/cc/cc1010b.ada: Likewise. + * ada/acats-3/tests/cc/cc1018a.ada: Likewise. + * ada/acats-3/tests/cc/cc1104c.ada: Likewise. + * ada/acats-3/tests/cc/cc1107b.ada: Likewise. + * ada/acats-3/tests/cc/cc1111a.ada: Likewise. + * ada/acats-3/tests/cc/cc1204a.ada: Likewise. + * ada/acats-3/tests/cc/cc1207b.ada: Likewise. + * ada/acats-3/tests/cc/cc1220a.ada: Likewise. + * ada/acats-3/tests/cc/cc1221a.ada: Likewise. + * ada/acats-3/tests/cc/cc1221b.ada: Likewise. + * ada/acats-3/tests/cc/cc1221c.ada: Likewise. + * ada/acats-3/tests/cc/cc1221d.ada: Likewise. + * ada/acats-3/tests/cc/cc1222a.ada: Likewise. + * ada/acats-3/tests/cc/cc1223a.ada: Likewise. + * ada/acats-3/tests/cc/cc1224a.ada: Likewise. + * ada/acats-3/tests/cc/cc1225a.tst: Likewise. + * ada/acats-3/tests/cc/cc1226b.ada: Likewise. + * ada/acats-3/tests/cc/cc1227a.ada: Likewise. + * ada/acats-3/tests/cc/cc1301a.ada: Likewise. + * ada/acats-3/tests/cc/cc1302a.ada: Likewise. + * ada/acats-3/tests/cc/cc1304a.ada: Likewise. + * ada/acats-3/tests/cc/cc1304b.ada: Likewise. + * ada/acats-3/tests/cc/cc1307a.ada: Likewise. + * ada/acats-3/tests/cc/cc1307b.ada: Likewise. + * ada/acats-3/tests/cc/cc1308a.ada: Likewise. + * ada/acats-3/tests/cc/cc1310a.ada: Likewise. + * ada/acats-3/tests/cc/cc1311a.ada: Likewise. + * ada/acats-3/tests/cc/cc1311b.ada: Likewise. + * ada/acats-3/tests/cc/cc2002a.ada: Likewise. + * ada/acats-3/tests/cc/cc30001.a: Likewise. + * ada/acats-3/tests/cc/cc30002.a: Likewise. + * ada/acats-3/tests/cc/cc30003.a: Likewise. + * ada/acats-3/tests/cc/cc30004.a: Likewise. + * ada/acats-3/tests/cc/cc3004a.ada: Likewise. + * ada/acats-3/tests/cc/cc3007a.ada: Likewise. + * ada/acats-3/tests/cc/cc3007b.ada: Likewise. + * ada/acats-3/tests/cc/cc3011a.ada: Likewise. + * ada/acats-3/tests/cc/cc3011d.ada: Likewise. + * ada/acats-3/tests/cc/cc3012a.ada: Likewise. + * ada/acats-3/tests/cc/cc3015a.ada: Likewise. + * ada/acats-3/tests/cc/cc3016b.ada: Likewise. + * ada/acats-3/tests/cc/cc3016c.ada: Likewise. + * ada/acats-3/tests/cc/cc3016f.ada: Likewise. + * ada/acats-3/tests/cc/cc3016i.ada: Likewise. + * ada/acats-3/tests/cc/cc3017b.ada: Likewise. + * ada/acats-3/tests/cc/cc3017c.ada: Likewise. + * ada/acats-3/tests/cc/cc3019a.ada: Likewise. + * ada/acats-3/tests/cc/cc3019b0.ada: Likewise. + * ada/acats-3/tests/cc/cc3019b1.ada: Likewise. + * ada/acats-3/tests/cc/cc3019b2.ada: Likewise. + * ada/acats-3/tests/cc/cc3019c0.ada: Likewise. + * ada/acats-3/tests/cc/cc3019c1.ada: Likewise. + * ada/acats-3/tests/cc/cc3019c2.ada: Likewise. + * ada/acats-3/tests/cc/cc3106b.ada: Likewise. + * ada/acats-3/tests/cc/cc3120a.ada: Likewise. + * ada/acats-3/tests/cc/cc3120b.ada: Likewise. + * ada/acats-3/tests/cc/cc3121a.ada: Likewise. + * ada/acats-3/tests/cc/cc3123a.ada: Likewise. + * ada/acats-3/tests/cc/cc3125a.ada: Likewise. + * ada/acats-3/tests/cc/cc3125b.ada: Likewise. + * ada/acats-3/tests/cc/cc3125c.ada: Likewise. + * ada/acats-3/tests/cc/cc3125d.ada: Likewise. + * ada/acats-3/tests/cc/cc3126a.ada: Likewise. + * ada/acats-3/tests/cc/cc3127a.ada: Likewise. + * ada/acats-3/tests/cc/cc3128a.ada: Likewise. + * ada/acats-3/tests/cc/cc3203a.ada: Likewise. + * ada/acats-3/tests/cc/cc3207b.ada: Likewise. + * ada/acats-3/tests/cc/cc3220a.ada: Likewise. + * ada/acats-3/tests/cc/cc3221a.ada: Likewise. + * ada/acats-3/tests/cc/cc3222a.ada: Likewise. + * ada/acats-3/tests/cc/cc3223a.ada: Likewise. + * ada/acats-3/tests/cc/cc3224a.ada: Likewise. + * ada/acats-3/tests/cc/cc3225a.ada: Likewise. + * ada/acats-3/tests/cc/cc3230a.ada: Likewise. + * ada/acats-3/tests/cc/cc3231a.ada: Likewise. + * ada/acats-3/tests/cc/cc3232a.ada: Likewise. + * ada/acats-3/tests/cc/cc3233a.ada: Likewise. + * ada/acats-3/tests/cc/cc3234a.ada: Likewise. + * ada/acats-3/tests/cc/cc3235a.ada: Likewise. + * ada/acats-3/tests/cc/cc3236a.ada: Likewise. + * ada/acats-3/tests/cc/cc3240a.ada: Likewise. + * ada/acats-3/tests/cc/cc3305a.ada: Likewise. + * ada/acats-3/tests/cc/cc3305b.ada: Likewise. + * ada/acats-3/tests/cc/cc3305c.ada: Likewise. + * ada/acats-3/tests/cc/cc3305d.ada: Likewise. + * ada/acats-3/tests/cc/cc3601a.ada: Likewise. + * ada/acats-3/tests/cc/cc3601c.ada: Likewise. + * ada/acats-3/tests/cc/cc3602a.ada: Likewise. + * ada/acats-3/tests/cc/cc3603a.ada: Likewise. + * ada/acats-3/tests/cc/cc3605a.ada: Likewise. + * ada/acats-3/tests/cc/cc3606a.ada: Likewise. + * ada/acats-3/tests/cc/cc3606b.ada: Likewise. + * ada/acats-3/tests/cc/cc3607b.ada: Likewise. + * ada/acats-3/tests/cc/cc40001.a: Likewise. + * ada/acats-3/tests/cc/cc50001.a: Likewise. + * ada/acats-3/tests/cc/cc50a01.a: Likewise. + * ada/acats-3/tests/cc/cc50a02.a: Likewise. + * ada/acats-3/tests/cc/cc51001.a: Likewise. + * ada/acats-3/tests/cc/cc51002.a: Likewise. + * ada/acats-3/tests/cc/cc51003.a: Likewise. + * ada/acats-3/tests/cc/cc51004.a: Likewise. + * ada/acats-3/tests/cc/cc51006.a: Likewise. + * ada/acats-3/tests/cc/cc51007.a: Likewise. + * ada/acats-3/tests/cc/cc51008.a: Likewise. + * ada/acats-3/tests/cc/cc51a01.a: Likewise. + * ada/acats-3/tests/cc/cc51b03.a: Likewise. + * ada/acats-3/tests/cc/cc51d01.a: Likewise. + * ada/acats-3/tests/cc/cc51d02.a: Likewise. + * ada/acats-3/tests/cc/cc54001.a: Likewise. + * ada/acats-3/tests/cc/cc54002.a: Likewise. + * ada/acats-3/tests/cc/cc54003.a: Likewise. + * ada/acats-3/tests/cc/cc54004.a: Likewise. + * ada/acats-3/tests/cc/cc60001.a: Likewise. + * ada/acats-3/tests/cc/cc70001.a: Likewise. + * ada/acats-3/tests/cc/cc70002.a: Likewise. + * ada/acats-3/tests/cc/cc70003.a: Likewise. + * ada/acats-3/tests/cc/cc70a01.a: Likewise. + * ada/acats-3/tests/cc/cc70a02.a: Likewise. + * ada/acats-3/tests/cc/cc70b01.a: Likewise. + * ada/acats-3/tests/cc/cc70b02.a: Likewise. + * ada/acats-3/tests/cc/cc70c01.a: Likewise. + * ada/acats-3/tests/cc/cc70c02.a: Likewise. + * ada/acats-3/tests/cd/cd10001.a: Likewise. + * ada/acats-3/tests/cd/cd10002.a: Likewise. + * ada/acats-3/tests/cd/cd1009a.ada: Likewise. + * ada/acats-3/tests/cd/cd1009b.ada: Likewise. + * ada/acats-3/tests/cd/cd1009d.ada: Likewise. + * ada/acats-3/tests/cd/cd1009e.ada: Likewise. + * ada/acats-3/tests/cd/cd1009f.ada: Likewise. + * ada/acats-3/tests/cd/cd1009g.ada: Likewise. + * ada/acats-3/tests/cd/cd1009h.ada: Likewise. + * ada/acats-3/tests/cd/cd1009i.ada: Likewise. + * ada/acats-3/tests/cd/cd1009j.ada: Likewise. + * ada/acats-3/tests/cd/cd1009k.tst: Likewise. + * ada/acats-3/tests/cd/cd1009l.ada: Likewise. + * ada/acats-3/tests/cd/cd1009m.ada: Likewise. + * ada/acats-3/tests/cd/cd1009n.ada: Likewise. + * ada/acats-3/tests/cd/cd1009o.ada: Likewise. + * ada/acats-3/tests/cd/cd1009p.ada: Likewise. + * ada/acats-3/tests/cd/cd1009q.ada: Likewise. + * ada/acats-3/tests/cd/cd1009r.ada: Likewise. + * ada/acats-3/tests/cd/cd1009s.ada: Likewise. + * ada/acats-3/tests/cd/cd1009t.tst: Likewise. + * ada/acats-3/tests/cd/cd1009u.tst: Likewise. + * ada/acats-3/tests/cd/cd1009v.ada: Likewise. + * ada/acats-3/tests/cd/cd1009w.ada: Likewise. + * ada/acats-3/tests/cd/cd1009x.ada: Likewise. + * ada/acats-3/tests/cd/cd1009y.ada: Likewise. + * ada/acats-3/tests/cd/cd1009z.ada: Likewise. + * ada/acats-3/tests/cd/cd1c03a.ada: Likewise. + * ada/acats-3/tests/cd/cd1c03b.ada: Likewise. + * ada/acats-3/tests/cd/cd1c03c.ada: Likewise. + * ada/acats-3/tests/cd/cd1c03e.tst: Likewise. + * ada/acats-3/tests/cd/cd1c03f.ada: Likewise. + * ada/acats-3/tests/cd/cd1c03g.ada: Likewise. + * ada/acats-3/tests/cd/cd1c03h.ada: Likewise. + * ada/acats-3/tests/cd/cd1c03i.ada: Likewise. + * ada/acats-3/tests/cd/cd1c04a.ada: Likewise. + * ada/acats-3/tests/cd/cd1c04d.ada: Likewise. + * ada/acats-3/tests/cd/cd1c04e.ada: Likewise. + * ada/acats-3/tests/cd/cd1c06a.tst: Likewise. + * ada/acats-3/tests/cd/cd20001.a: Likewise. + * ada/acats-3/tests/cd/cd2a21a.ada: Likewise. + * ada/acats-3/tests/cd/cd2a21c.ada: Likewise. + * ada/acats-3/tests/cd/cd2a21e.ada: Likewise. + * ada/acats-3/tests/cd/cd2a22a.ada: Likewise. + * ada/acats-3/tests/cd/cd2a22e.ada: Likewise. + * ada/acats-3/tests/cd/cd2a22i.ada: Likewise. + * ada/acats-3/tests/cd/cd2a22j.ada: Likewise. + * ada/acats-3/tests/cd/cd2a23a.ada: Likewise. + * ada/acats-3/tests/cd/cd2a23e.ada: Likewise. + * ada/acats-3/tests/cd/cd2a24a.ada: Likewise. + * ada/acats-3/tests/cd/cd2a24e.ada: Likewise. + * ada/acats-3/tests/cd/cd2a24i.ada: Likewise. + * ada/acats-3/tests/cd/cd2a24j.ada: Likewise. + * ada/acats-3/tests/cd/cd2a31a.ada: Likewise. + * ada/acats-3/tests/cd/cd2a31c.ada: Likewise. + * ada/acats-3/tests/cd/cd2a31e.ada: Likewise. + * ada/acats-3/tests/cd/cd2a32a.ada: Likewise. + * ada/acats-3/tests/cd/cd2a32c.ada: Likewise. + * ada/acats-3/tests/cd/cd2a32e.ada: Likewise. + * ada/acats-3/tests/cd/cd2a32g.ada: Likewise. + * ada/acats-3/tests/cd/cd2a32i.ada: Likewise. + * ada/acats-3/tests/cd/cd2a32j.ada: Likewise. + * ada/acats-3/tests/cd/cd2a51a.ada: Likewise. + * ada/acats-3/tests/cd/cd2a53a.ada: Likewise. + * ada/acats-3/tests/cd/cd2a53e.ada: Likewise. + * ada/acats-3/tests/cd/cd2a83c.tst: Likewise. + * ada/acats-3/tests/cd/cd2a91c.tst: Likewise. + * ada/acats-3/tests/cd/cd2b11b.ada: Likewise. + * ada/acats-3/tests/cd/cd2b11d.ada: Likewise. + * ada/acats-3/tests/cd/cd2b11e.ada: Likewise. + * ada/acats-3/tests/cd/cd2b11f.ada: Likewise. + * ada/acats-3/tests/cd/cd2b16a.ada: Likewise. + * ada/acats-3/tests/cd/cd2c11a.tst: Likewise. + * ada/acats-3/tests/cd/cd2c11d.tst: Likewise. + * ada/acats-3/tests/cd/cd2d11a.ada: Likewise. + * ada/acats-3/tests/cd/cd2d13a.ada: Likewise. + * ada/acats-3/tests/cd/cd30001.a: Likewise. + * ada/acats-3/tests/cd/cd30002.a: Likewise. + * ada/acats-3/tests/cd/cd30003.a: Likewise. + * ada/acats-3/tests/cd/cd30004.a: Likewise. + * ada/acats-3/tests/cd/cd300050.am: Likewise. + * ada/acats-3/tests/cd/cd300051.c: Likewise. + * ada/acats-3/tests/cd/cd30008.a: Likewise. + * ada/acats-3/tests/cd/cd30009.a: Likewise. + * ada/acats-3/tests/cd/cd30011.a: Likewise. + * ada/acats-3/tests/cd/cd30012.a: Likewise. + * ada/acats-3/tests/cd/cd3014a.ada: Likewise. + * ada/acats-3/tests/cd/cd3014c.ada: Likewise. + * ada/acats-3/tests/cd/cd3014d.ada: Likewise. + * ada/acats-3/tests/cd/cd3014f.ada: Likewise. + * ada/acats-3/tests/cd/cd3015a.ada: Likewise. + * ada/acats-3/tests/cd/cd3015c.ada: Likewise. + * ada/acats-3/tests/cd/cd3015e.ada: Likewise. + * ada/acats-3/tests/cd/cd3015f.ada: Likewise. + * ada/acats-3/tests/cd/cd3015g.ada: Likewise. + * ada/acats-3/tests/cd/cd3015h.ada: Likewise. + * ada/acats-3/tests/cd/cd3015i.ada: Likewise. + * ada/acats-3/tests/cd/cd3015k.ada: Likewise. + * ada/acats-3/tests/cd/cd3021a.ada: Likewise. + * ada/acats-3/tests/cd/cd33001.a: Likewise. + * ada/acats-3/tests/cd/cd33002.a: Likewise. + * ada/acats-3/tests/cd/cd40001.a: Likewise. + * ada/acats-3/tests/cd/cd4031a.ada: Likewise. + * ada/acats-3/tests/cd/cd4041a.tst: Likewise. + * ada/acats-3/tests/cd/cd4051a.ada: Likewise. + * ada/acats-3/tests/cd/cd4051b.ada: Likewise. + * ada/acats-3/tests/cd/cd4051c.ada: Likewise. + * ada/acats-3/tests/cd/cd4051d.ada: Likewise. + * ada/acats-3/tests/cd/cd5003a.ada: Likewise. + * ada/acats-3/tests/cd/cd5003b.ada: Likewise. + * ada/acats-3/tests/cd/cd5003c.ada: Likewise. + * ada/acats-3/tests/cd/cd5003d.ada: Likewise. + * ada/acats-3/tests/cd/cd5003e.ada: Likewise. + * ada/acats-3/tests/cd/cd5003f.ada: Likewise. + * ada/acats-3/tests/cd/cd5003g.ada: Likewise. + * ada/acats-3/tests/cd/cd5003h.ada: Likewise. + * ada/acats-3/tests/cd/cd5003i.ada: Likewise. + * ada/acats-3/tests/cd/cd5011a.ada: Likewise. + * ada/acats-3/tests/cd/cd5011c.ada: Likewise. + * ada/acats-3/tests/cd/cd5011e.ada: Likewise. + * ada/acats-3/tests/cd/cd5011g.ada: Likewise. + * ada/acats-3/tests/cd/cd5011i.ada: Likewise. + * ada/acats-3/tests/cd/cd5011k.ada: Likewise. + * ada/acats-3/tests/cd/cd5011m.ada: Likewise. + * ada/acats-3/tests/cd/cd5011q.ada: Likewise. + * ada/acats-3/tests/cd/cd5011s.ada: Likewise. + * ada/acats-3/tests/cd/cd5012a.ada: Likewise. + * ada/acats-3/tests/cd/cd5012b.ada: Likewise. + * ada/acats-3/tests/cd/cd5012e.ada: Likewise. + * ada/acats-3/tests/cd/cd5012f.ada: Likewise. + * ada/acats-3/tests/cd/cd5012i.ada: Likewise. + * ada/acats-3/tests/cd/cd5012m.ada: Likewise. + * ada/acats-3/tests/cd/cd5013a.ada: Likewise. + * ada/acats-3/tests/cd/cd5013c.ada: Likewise. + * ada/acats-3/tests/cd/cd5013e.ada: Likewise. + * ada/acats-3/tests/cd/cd5013g.ada: Likewise. + * ada/acats-3/tests/cd/cd5013i.ada: Likewise. + * ada/acats-3/tests/cd/cd5013k.ada: Likewise. + * ada/acats-3/tests/cd/cd5013m.ada: Likewise. + * ada/acats-3/tests/cd/cd5013o.ada: Likewise. + * ada/acats-3/tests/cd/cd5014a.ada: Likewise. + * ada/acats-3/tests/cd/cd5014c.ada: Likewise. + * ada/acats-3/tests/cd/cd5014e.ada: Likewise. + * ada/acats-3/tests/cd/cd5014g.ada: Likewise. + * ada/acats-3/tests/cd/cd5014i.ada: Likewise. + * ada/acats-3/tests/cd/cd5014k.ada: Likewise. + * ada/acats-3/tests/cd/cd5014m.ada: Likewise. + * ada/acats-3/tests/cd/cd5014o.ada: Likewise. + * ada/acats-3/tests/cd/cd5014t.ada: Likewise. + * ada/acats-3/tests/cd/cd5014v.ada: Likewise. + * ada/acats-3/tests/cd/cd5014x.ada: Likewise. + * ada/acats-3/tests/cd/cd5014y.ada: Likewise. + * ada/acats-3/tests/cd/cd5014z.ada: Likewise. + * ada/acats-3/tests/cd/cd70001.a: Likewise. + * ada/acats-3/tests/cd/cd7002a.ada: Likewise. + * ada/acats-3/tests/cd/cd7007b.ada: Likewise. + * ada/acats-3/tests/cd/cd7101d.ada: Likewise. + * ada/acats-3/tests/cd/cd7101e.dep: Likewise. + * ada/acats-3/tests/cd/cd7101f.dep: Likewise. + * ada/acats-3/tests/cd/cd7101g.tst: Likewise. + * ada/acats-3/tests/cd/cd7103d.ada: Likewise. + * ada/acats-3/tests/cd/cd7202a.ada: Likewise. + * ada/acats-3/tests/cd/cd7204b.ada: Likewise. + * ada/acats-3/tests/cd/cd7204c.ada: Likewise. + * ada/acats-3/tests/cd/cd72a01.a: Likewise. + * ada/acats-3/tests/cd/cd72a02.a: Likewise. + * ada/acats-3/tests/cd/cd7305a.ada: Likewise. + * ada/acats-3/tests/cd/cd90001.a: Likewise. + * ada/acats-3/tests/cd/cd92001.a: Likewise. + * ada/acats-3/tests/cd/cda201a.ada: Likewise. + * ada/acats-3/tests/cd/cda201b.ada: Likewise. + * ada/acats-3/tests/cd/cda201c.ada: Likewise. + * ada/acats-3/tests/cd/cda201e.ada: Likewise. + * ada/acats-3/tests/cd/cdb0001.a: Likewise. + * ada/acats-3/tests/cd/cdb0002.a: Likewise. + * ada/acats-3/tests/cd/cdb0a01.a: Likewise. + * ada/acats-3/tests/cd/cdb0a02.a: Likewise. + * ada/acats-3/tests/cd/cdd1001.a: Likewise. + * ada/acats-3/tests/cd/cdd2001.a: Likewise. + * ada/acats-3/tests/cd/cdd2a01.a: Likewise. + * ada/acats-3/tests/cd/cdd2a02.a: Likewise. + * ada/acats-3/tests/cd/cdd2a03.a: Likewise. + * ada/acats-3/tests/cd/cdd2b01.a: Likewise. + * ada/acats-3/tests/cd/cdd2b03.a: Likewise. + * ada/acats-3/tests/cd/cde0001.a: Likewise. + * ada/acats-3/tests/ce/ce2102a.ada: Likewise. + * ada/acats-3/tests/ce/ce2102b.ada: Likewise. + * ada/acats-3/tests/ce/ce2102c.tst: Likewise. + * ada/acats-3/tests/ce/ce2102d.ada: Likewise. + * ada/acats-3/tests/ce/ce2102e.ada: Likewise. + * ada/acats-3/tests/ce/ce2102f.ada: Likewise. + * ada/acats-3/tests/ce/ce2102g.ada: Likewise. + * ada/acats-3/tests/ce/ce2102h.tst: Likewise. + * ada/acats-3/tests/ce/ce2102i.ada: Likewise. + * ada/acats-3/tests/ce/ce2102j.ada: Likewise. + * ada/acats-3/tests/ce/ce2102k.ada: Likewise. + * ada/acats-3/tests/ce/ce2102l.ada: Likewise. + * ada/acats-3/tests/ce/ce2102m.ada: Likewise. + * ada/acats-3/tests/ce/ce2102n.ada: Likewise. + * ada/acats-3/tests/ce/ce2102o.ada: Likewise. + * ada/acats-3/tests/ce/ce2102p.ada: Likewise. + * ada/acats-3/tests/ce/ce2102q.ada: Likewise. + * ada/acats-3/tests/ce/ce2102r.ada: Likewise. + * ada/acats-3/tests/ce/ce2102s.ada: Likewise. + * ada/acats-3/tests/ce/ce2102t.ada: Likewise. + * ada/acats-3/tests/ce/ce2102u.ada: Likewise. + * ada/acats-3/tests/ce/ce2102v.ada: Likewise. + * ada/acats-3/tests/ce/ce2102w.ada: Likewise. + * ada/acats-3/tests/ce/ce2102x.ada: Likewise. + * ada/acats-3/tests/ce/ce2102y.ada: Likewise. + * ada/acats-3/tests/ce/ce2103a.tst: Likewise. + * ada/acats-3/tests/ce/ce2103b.tst: Likewise. + * ada/acats-3/tests/ce/ce2103c.ada: Likewise. + * ada/acats-3/tests/ce/ce2103d.ada: Likewise. + * ada/acats-3/tests/ce/ce2104a.ada: Likewise. + * ada/acats-3/tests/ce/ce2104b.ada: Likewise. + * ada/acats-3/tests/ce/ce2104c.ada: Likewise. + * ada/acats-3/tests/ce/ce2104d.ada: Likewise. + * ada/acats-3/tests/ce/ce2106a.ada: Likewise. + * ada/acats-3/tests/ce/ce2106b.ada: Likewise. + * ada/acats-3/tests/ce/ce2108e.ada: Likewise. + * ada/acats-3/tests/ce/ce2108f.ada: Likewise. + * ada/acats-3/tests/ce/ce2108g.ada: Likewise. + * ada/acats-3/tests/ce/ce2108h.ada: Likewise. + * ada/acats-3/tests/ce/ce2109a.ada: Likewise. + * ada/acats-3/tests/ce/ce2109b.ada: Likewise. + * ada/acats-3/tests/ce/ce2109c.ada: Likewise. + * ada/acats-3/tests/ce/ce2110a.ada: Likewise. + * ada/acats-3/tests/ce/ce2110c.ada: Likewise. + * ada/acats-3/tests/ce/ce2111a.ada: Likewise. + * ada/acats-3/tests/ce/ce2111b.ada: Likewise. + * ada/acats-3/tests/ce/ce2111c.ada: Likewise. + * ada/acats-3/tests/ce/ce2111e.ada: Likewise. + * ada/acats-3/tests/ce/ce2111f.ada: Likewise. + * ada/acats-3/tests/ce/ce2111g.ada: Likewise. + * ada/acats-3/tests/ce/ce2111i.ada: Likewise. + * ada/acats-3/tests/ce/ce2201a.ada: Likewise. + * ada/acats-3/tests/ce/ce2201b.ada: Likewise. + * ada/acats-3/tests/ce/ce2201c.ada: Likewise. + * ada/acats-3/tests/ce/ce2201d.dep: Likewise. + * ada/acats-3/tests/ce/ce2201e.dep: Likewise. + * ada/acats-3/tests/ce/ce2201f.ada: Likewise. + * ada/acats-3/tests/ce/ce2201g.ada: Likewise. + * ada/acats-3/tests/ce/ce2201h.ada: Likewise. + * ada/acats-3/tests/ce/ce2201i.ada: Likewise. + * ada/acats-3/tests/ce/ce2201j.ada: Likewise. + * ada/acats-3/tests/ce/ce2201k.ada: Likewise. + * ada/acats-3/tests/ce/ce2201l.ada: Likewise. + * ada/acats-3/tests/ce/ce2201m.ada: Likewise. + * ada/acats-3/tests/ce/ce2201n.ada: Likewise. + * ada/acats-3/tests/ce/ce2202a.ada: Likewise. + * ada/acats-3/tests/ce/ce2203a.tst: Likewise. + * ada/acats-3/tests/ce/ce2204a.ada: Likewise. + * ada/acats-3/tests/ce/ce2204b.ada: Likewise. + * ada/acats-3/tests/ce/ce2204c.ada: Likewise. + * ada/acats-3/tests/ce/ce2204d.ada: Likewise. + * ada/acats-3/tests/ce/ce2205a.ada: Likewise. + * ada/acats-3/tests/ce/ce2206a.ada: Likewise. + * ada/acats-3/tests/ce/ce2208b.ada: Likewise. + * ada/acats-3/tests/ce/ce2401a.ada: Likewise. + * ada/acats-3/tests/ce/ce2401b.ada: Likewise. + * ada/acats-3/tests/ce/ce2401c.ada: Likewise. + * ada/acats-3/tests/ce/ce2401e.ada: Likewise. + * ada/acats-3/tests/ce/ce2401f.ada: Likewise. + * ada/acats-3/tests/ce/ce2401h.ada: Likewise. + * ada/acats-3/tests/ce/ce2401i.ada: Likewise. + * ada/acats-3/tests/ce/ce2401j.ada: Likewise. + * ada/acats-3/tests/ce/ce2401k.ada: Likewise. + * ada/acats-3/tests/ce/ce2401l.ada: Likewise. + * ada/acats-3/tests/ce/ce2402a.ada: Likewise. + * ada/acats-3/tests/ce/ce2403a.tst: Likewise. + * ada/acats-3/tests/ce/ce2404a.ada: Likewise. + * ada/acats-3/tests/ce/ce2404b.ada: Likewise. + * ada/acats-3/tests/ce/ce2405b.ada: Likewise. + * ada/acats-3/tests/ce/ce2406a.ada: Likewise. + * ada/acats-3/tests/ce/ce2407a.ada: Likewise. + * ada/acats-3/tests/ce/ce2407b.ada: Likewise. + * ada/acats-3/tests/ce/ce2408a.ada: Likewise. + * ada/acats-3/tests/ce/ce2408b.ada: Likewise. + * ada/acats-3/tests/ce/ce2409a.ada: Likewise. + * ada/acats-3/tests/ce/ce2409b.ada: Likewise. + * ada/acats-3/tests/ce/ce2410a.ada: Likewise. + * ada/acats-3/tests/ce/ce2410b.ada: Likewise. + * ada/acats-3/tests/ce/ce2411a.ada: Likewise. + * ada/acats-3/tests/ce/ce3002b.tst: Likewise. + * ada/acats-3/tests/ce/ce3002c.tst: Likewise. + * ada/acats-3/tests/ce/ce3002d.ada: Likewise. + * ada/acats-3/tests/ce/ce3002f.ada: Likewise. + * ada/acats-3/tests/ce/ce3102a.ada: Likewise. + * ada/acats-3/tests/ce/ce3102b.tst: Likewise. + * ada/acats-3/tests/ce/ce3102d.ada: Likewise. + * ada/acats-3/tests/ce/ce3102e.ada: Likewise. + * ada/acats-3/tests/ce/ce3102f.ada: Likewise. + * ada/acats-3/tests/ce/ce3102g.ada: Likewise. + * ada/acats-3/tests/ce/ce3102h.ada: Likewise. + * ada/acats-3/tests/ce/ce3102i.ada: Likewise. + * ada/acats-3/tests/ce/ce3102j.ada: Likewise. + * ada/acats-3/tests/ce/ce3102k.ada: Likewise. + * ada/acats-3/tests/ce/ce3103a.ada: Likewise. + * ada/acats-3/tests/ce/ce3104a.ada: Likewise. + * ada/acats-3/tests/ce/ce3104b.ada: Likewise. + * ada/acats-3/tests/ce/ce3104c.ada: Likewise. + * ada/acats-3/tests/ce/ce3106a.ada: Likewise. + * ada/acats-3/tests/ce/ce3106b.ada: Likewise. + * ada/acats-3/tests/ce/ce3107a.tst: Likewise. + * ada/acats-3/tests/ce/ce3107b.ada: Likewise. + * ada/acats-3/tests/ce/ce3108a.ada: Likewise. + * ada/acats-3/tests/ce/ce3108b.ada: Likewise. + * ada/acats-3/tests/ce/ce3110a.ada: Likewise. + * ada/acats-3/tests/ce/ce3112c.ada: Likewise. + * ada/acats-3/tests/ce/ce3112d.ada: Likewise. + * ada/acats-3/tests/ce/ce3114a.ada: Likewise. + * ada/acats-3/tests/ce/ce3115a.ada: Likewise. + * ada/acats-3/tests/ce/ce3201a.ada: Likewise. + * ada/acats-3/tests/ce/ce3202a.ada: Likewise. + * ada/acats-3/tests/ce/ce3206a.ada: Likewise. + * ada/acats-3/tests/ce/ce3207a.ada: Likewise. + * ada/acats-3/tests/ce/ce3301a.ada: Likewise. + * ada/acats-3/tests/ce/ce3302a.ada: Likewise. + * ada/acats-3/tests/ce/ce3303a.ada: Likewise. + * ada/acats-3/tests/ce/ce3304a.tst: Likewise. + * ada/acats-3/tests/ce/ce3305a.ada: Likewise. + * ada/acats-3/tests/ce/ce3306a.ada: Likewise. + * ada/acats-3/tests/ce/ce3401a.ada: Likewise. + * ada/acats-3/tests/ce/ce3402a.ada: Likewise. + * ada/acats-3/tests/ce/ce3402c.ada: Likewise. + * ada/acats-3/tests/ce/ce3402d.ada: Likewise. + * ada/acats-3/tests/ce/ce3402e.ada: Likewise. + * ada/acats-3/tests/ce/ce3403a.ada: Likewise. + * ada/acats-3/tests/ce/ce3403b.ada: Likewise. + * ada/acats-3/tests/ce/ce3403c.ada: Likewise. + * ada/acats-3/tests/ce/ce3403d.ada: Likewise. + * ada/acats-3/tests/ce/ce3403e.ada: Likewise. + * ada/acats-3/tests/ce/ce3403f.ada: Likewise. + * ada/acats-3/tests/ce/ce3404a.ada: Likewise. + * ada/acats-3/tests/ce/ce3404b.ada: Likewise. + * ada/acats-3/tests/ce/ce3404c.ada: Likewise. + * ada/acats-3/tests/ce/ce3404d.ada: Likewise. + * ada/acats-3/tests/ce/ce3405a.ada: Likewise. + * ada/acats-3/tests/ce/ce3405c.ada: Likewise. + * ada/acats-3/tests/ce/ce3405d.ada: Likewise. + * ada/acats-3/tests/ce/ce3406a.ada: Likewise. + * ada/acats-3/tests/ce/ce3406b.ada: Likewise. + * ada/acats-3/tests/ce/ce3406c.ada: Likewise. + * ada/acats-3/tests/ce/ce3406d.ada: Likewise. + * ada/acats-3/tests/ce/ce3407a.ada: Likewise. + * ada/acats-3/tests/ce/ce3407b.ada: Likewise. + * ada/acats-3/tests/ce/ce3407c.ada: Likewise. + * ada/acats-3/tests/ce/ce3408a.ada: Likewise. + * ada/acats-3/tests/ce/ce3408b.ada: Likewise. + * ada/acats-3/tests/ce/ce3408c.ada: Likewise. + * ada/acats-3/tests/ce/ce3409a.ada: Likewise. + * ada/acats-3/tests/ce/ce3409b.ada: Likewise. + * ada/acats-3/tests/ce/ce3409c.ada: Likewise. + * ada/acats-3/tests/ce/ce3409d.ada: Likewise. + * ada/acats-3/tests/ce/ce3409e.ada: Likewise. + * ada/acats-3/tests/ce/ce3410a.ada: Likewise. + * ada/acats-3/tests/ce/ce3410b.ada: Likewise. + * ada/acats-3/tests/ce/ce3410c.ada: Likewise. + * ada/acats-3/tests/ce/ce3410d.ada: Likewise. + * ada/acats-3/tests/ce/ce3410e.ada: Likewise. + * ada/acats-3/tests/ce/ce3411a.ada: Likewise. + * ada/acats-3/tests/ce/ce3411c.ada: Likewise. + * ada/acats-3/tests/ce/ce3412a.ada: Likewise. + * ada/acats-3/tests/ce/ce3413a.ada: Likewise. + * ada/acats-3/tests/ce/ce3413b.ada: Likewise. + * ada/acats-3/tests/ce/ce3413c.ada: Likewise. + * ada/acats-3/tests/ce/ce3414a.ada: Likewise. + * ada/acats-3/tests/ce/ce3601a.ada: Likewise. + * ada/acats-3/tests/ce/ce3602a.ada: Likewise. + * ada/acats-3/tests/ce/ce3602b.ada: Likewise. + * ada/acats-3/tests/ce/ce3602c.ada: Likewise. + * ada/acats-3/tests/ce/ce3602d.ada: Likewise. + * ada/acats-3/tests/ce/ce3603a.ada: Likewise. + * ada/acats-3/tests/ce/ce3604a.ada: Likewise. + * ada/acats-3/tests/ce/ce3604b.ada: Likewise. + * ada/acats-3/tests/ce/ce3605a.ada: Likewise. + * ada/acats-3/tests/ce/ce3605b.ada: Likewise. + * ada/acats-3/tests/ce/ce3605c.ada: Likewise. + * ada/acats-3/tests/ce/ce3605d.ada: Likewise. + * ada/acats-3/tests/ce/ce3605e.ada: Likewise. + * ada/acats-3/tests/ce/ce3606a.ada: Likewise. + * ada/acats-3/tests/ce/ce3606b.ada: Likewise. + * ada/acats-3/tests/ce/ce3701a.ada: Likewise. + * ada/acats-3/tests/ce/ce3704a.ada: Likewise. + * ada/acats-3/tests/ce/ce3704b.ada: Likewise. + * ada/acats-3/tests/ce/ce3704c.ada: Likewise. + * ada/acats-3/tests/ce/ce3704d.ada: Likewise. + * ada/acats-3/tests/ce/ce3704e.ada: Likewise. + * ada/acats-3/tests/ce/ce3704f.ada: Likewise. + * ada/acats-3/tests/ce/ce3704m.ada: Likewise. + * ada/acats-3/tests/ce/ce3704n.ada: Likewise. + * ada/acats-3/tests/ce/ce3704o.ada: Likewise. + * ada/acats-3/tests/ce/ce3705a.ada: Likewise. + * ada/acats-3/tests/ce/ce3705b.ada: Likewise. + * ada/acats-3/tests/ce/ce3705c.ada: Likewise. + * ada/acats-3/tests/ce/ce3705d.ada: Likewise. + * ada/acats-3/tests/ce/ce3705e.ada: Likewise. + * ada/acats-3/tests/ce/ce3706c.ada: Likewise. + * ada/acats-3/tests/ce/ce3706d.ada: Likewise. + * ada/acats-3/tests/ce/ce3706f.ada: Likewise. + * ada/acats-3/tests/ce/ce3706g.ada: Likewise. + * ada/acats-3/tests/ce/ce3707a.ada: Likewise. + * ada/acats-3/tests/ce/ce3708a.ada: Likewise. + * ada/acats-3/tests/ce/ce3801a.ada: Likewise. + * ada/acats-3/tests/ce/ce3801b.ada: Likewise. + * ada/acats-3/tests/ce/ce3804a.ada: Likewise. + * ada/acats-3/tests/ce/ce3804b.ada: Likewise. + * ada/acats-3/tests/ce/ce3804c.ada: Likewise. + * ada/acats-3/tests/ce/ce3804d.ada: Likewise. + * ada/acats-3/tests/ce/ce3804e.ada: Likewise. + * ada/acats-3/tests/ce/ce3804f.ada: Likewise. + * ada/acats-3/tests/ce/ce3804g.ada: Likewise. + * ada/acats-3/tests/ce/ce3804h.ada: Likewise. + * ada/acats-3/tests/ce/ce3804i.ada: Likewise. + * ada/acats-3/tests/ce/ce3804j.ada: Likewise. + * ada/acats-3/tests/ce/ce3804m.ada: Likewise. + * ada/acats-3/tests/ce/ce3804o.ada: Likewise. + * ada/acats-3/tests/ce/ce3804p.ada: Likewise. + * ada/acats-3/tests/ce/ce3805a.ada: Likewise. + * ada/acats-3/tests/ce/ce3805b.ada: Likewise. + * ada/acats-3/tests/ce/ce3806a.ada: Likewise. + * ada/acats-3/tests/ce/ce3806b.ada: Likewise. + * ada/acats-3/tests/ce/ce3806c.ada: Likewise. + * ada/acats-3/tests/ce/ce3806d.ada: Likewise. + * ada/acats-3/tests/ce/ce3806e.ada: Likewise. + * ada/acats-3/tests/ce/ce3806f.ada: Likewise. + * ada/acats-3/tests/ce/ce3806g.ada: Likewise. + * ada/acats-3/tests/ce/ce3806h.ada: Likewise. + * ada/acats-3/tests/ce/ce3809a.ada: Likewise. + * ada/acats-3/tests/ce/ce3809b.ada: Likewise. + * ada/acats-3/tests/ce/ce3810a.ada: Likewise. + * ada/acats-3/tests/ce/ce3810b.ada: Likewise. + * ada/acats-3/tests/ce/ce3815a.ada: Likewise. + * ada/acats-3/tests/ce/ce3901a.ada: Likewise. + * ada/acats-3/tests/ce/ce3902b.ada: Likewise. + * ada/acats-3/tests/ce/ce3904a.ada: Likewise. + * ada/acats-3/tests/ce/ce3904b.ada: Likewise. + * ada/acats-3/tests/ce/ce3905a.ada: Likewise. + * ada/acats-3/tests/ce/ce3905b.ada: Likewise. + * ada/acats-3/tests/ce/ce3905c.ada: Likewise. + * ada/acats-3/tests/ce/ce3905l.ada: Likewise. + * ada/acats-3/tests/ce/ce3906a.ada: Likewise. + * ada/acats-3/tests/ce/ce3906b.ada: Likewise. + * ada/acats-3/tests/ce/ce3906c.ada: Likewise. + * ada/acats-3/tests/ce/ce3906d.ada: Likewise. + * ada/acats-3/tests/ce/ce3906e.ada: Likewise. + * ada/acats-3/tests/ce/ce3906f.ada: Likewise. + * ada/acats-3/tests/ce/ce3907a.ada: Likewise. + * ada/acats-3/tests/ce/ce3908a.ada: Likewise. + * ada/acats-3/tests/cxa/cxa3001.a: Likewise. + * ada/acats-3/tests/cxa/cxa3002.a: Likewise. + * ada/acats-3/tests/cxa/cxa3003.a: Likewise. + * ada/acats-3/tests/cxa/cxa3004.a: Likewise. + * ada/acats-3/tests/cxa/cxa4001.a: Likewise. + * ada/acats-3/tests/cxa/cxa4002.a: Likewise. + * ada/acats-3/tests/cxa/cxa4003.a: Likewise. + * ada/acats-3/tests/cxa/cxa4004.a: Likewise. + * ada/acats-3/tests/cxa/cxa4005.a: Likewise. + * ada/acats-3/tests/cxa/cxa4006.a: Likewise. + * ada/acats-3/tests/cxa/cxa4007.a: Likewise. + * ada/acats-3/tests/cxa/cxa4008.a: Likewise. + * ada/acats-3/tests/cxa/cxa4009.a: Likewise. + * ada/acats-3/tests/cxa/cxa4010.a: Likewise. + * ada/acats-3/tests/cxa/cxa4011.a: Likewise. + * ada/acats-3/tests/cxa/cxa4012.a: Likewise. + * ada/acats-3/tests/cxa/cxa4013.a: Likewise. + * ada/acats-3/tests/cxa/cxa4014.a: Likewise. + * ada/acats-3/tests/cxa/cxa4015.a: Likewise. + * ada/acats-3/tests/cxa/cxa4016.a: Likewise. + * ada/acats-3/tests/cxa/cxa4017.a: Likewise. + * ada/acats-3/tests/cxa/cxa4018.a: Likewise. + * ada/acats-3/tests/cxa/cxa4019.a: Likewise. + * ada/acats-3/tests/cxa/cxa4020.a: Likewise. + * ada/acats-3/tests/cxa/cxa4021.a: Likewise. + * ada/acats-3/tests/cxa/cxa4022.a: Likewise. + * ada/acats-3/tests/cxa/cxa4023.a: Likewise. + * ada/acats-3/tests/cxa/cxa4024.a: Likewise. + * ada/acats-3/tests/cxa/cxa4025.a: Likewise. + * ada/acats-3/tests/cxa/cxa4026.a: Likewise. + * ada/acats-3/tests/cxa/cxa4027.a: Likewise. + * ada/acats-3/tests/cxa/cxa4028.a: Likewise. + * ada/acats-3/tests/cxa/cxa4029.a: Likewise. + * ada/acats-3/tests/cxa/cxa4030.a: Likewise. + * ada/acats-3/tests/cxa/cxa4031.a: Likewise. + * ada/acats-3/tests/cxa/cxa4032.a: Likewise. + * ada/acats-3/tests/cxa/cxa4033.a: Likewise. + * ada/acats-3/tests/cxa/cxa4034.a: Likewise. + * ada/acats-3/tests/cxa/cxa4037.a: Likewise. + * ada/acats-3/tests/cxa/cxa5011.a: Likewise. + * ada/acats-3/tests/cxa/cxa5012.a: Likewise. + * ada/acats-3/tests/cxa/cxa5013.a: Likewise. + * ada/acats-3/tests/cxa/cxa5015.a: Likewise. + * ada/acats-3/tests/cxa/cxa5016.a: Likewise. + * ada/acats-3/tests/cxa/cxa5a01.a: Likewise. + * ada/acats-3/tests/cxa/cxa5a02.a: Likewise. + * ada/acats-3/tests/cxa/cxa5a03.a: Likewise. + * ada/acats-3/tests/cxa/cxa5a04.a: Likewise. + * ada/acats-3/tests/cxa/cxa5a05.a: Likewise. + * ada/acats-3/tests/cxa/cxa5a06.a: Likewise. + * ada/acats-3/tests/cxa/cxa5a07.a: Likewise. + * ada/acats-3/tests/cxa/cxa5a08.a: Likewise. + * ada/acats-3/tests/cxa/cxa5a09.a: Likewise. + * ada/acats-3/tests/cxa/cxa5a10.a: Likewise. + * ada/acats-3/tests/cxa/cxa8001.a: Likewise. + * ada/acats-3/tests/cxa/cxa8002.a: Likewise. + * ada/acats-3/tests/cxa/cxa8003.a: Likewise. + * ada/acats-3/tests/cxa/cxa9001.a: Likewise. + * ada/acats-3/tests/cxa/cxa9002.a: Likewise. + * ada/acats-3/tests/cxa/cxaa001.a: Likewise. + * ada/acats-3/tests/cxa/cxaa002.a: Likewise. + * ada/acats-3/tests/cxa/cxaa003.a: Likewise. + * ada/acats-3/tests/cxa/cxaa004.a: Likewise. + * ada/acats-3/tests/cxa/cxaa005.a: Likewise. + * ada/acats-3/tests/cxa/cxaa006.a: Likewise. + * ada/acats-3/tests/cxa/cxaa007.a: Likewise. + * ada/acats-3/tests/cxa/cxaa008.a: Likewise. + * ada/acats-3/tests/cxa/cxaa009.a: Likewise. + * ada/acats-3/tests/cxa/cxaa010.a: Likewise. + * ada/acats-3/tests/cxa/cxaa011.a: Likewise. + * ada/acats-3/tests/cxa/cxaa012.a: Likewise. + * ada/acats-3/tests/cxa/cxaa013.a: Likewise. + * ada/acats-3/tests/cxa/cxaa014.a: Likewise. + * ada/acats-3/tests/cxa/cxaa015.a: Likewise. + * ada/acats-3/tests/cxa/cxaa016.a: Likewise. + * ada/acats-3/tests/cxa/cxaa017.a: Likewise. + * ada/acats-3/tests/cxa/cxaa018.a: Likewise. + * ada/acats-3/tests/cxa/cxaa019.a: Likewise. + * ada/acats-3/tests/cxa/cxaa020.a: Likewise. + * ada/acats-3/tests/cxa/cxaa021.a: Likewise. + * ada/acats-3/tests/cxa/cxaa022.a: Likewise. + * ada/acats-3/tests/cxa/cxab001.a: Likewise. + * ada/acats-3/tests/cxa/cxab002.au: Likewise. + * ada/acats-3/tests/cxa/cxab003.au: Likewise. + * ada/acats-3/tests/cxa/cxab004.au: Likewise. + * ada/acats-3/tests/cxa/cxab005.au: Likewise. + * ada/acats-3/tests/cxa/cxac001.a: Likewise. + * ada/acats-3/tests/cxa/cxac002.a: Likewise. + * ada/acats-3/tests/cxa/cxac003.a: Likewise. + * ada/acats-3/tests/cxa/cxac004.a: Likewise. + * ada/acats-3/tests/cxa/cxac005.a: Likewise. + * ada/acats-3/tests/cxa/cxac006.a: Likewise. + * ada/acats-3/tests/cxa/cxac008.a: Likewise. + * ada/acats-3/tests/cxa/cxaca01.a: Likewise. + * ada/acats-3/tests/cxa/cxaca02.a: Likewise. + * ada/acats-3/tests/cxa/cxacb01.a: Likewise. + * ada/acats-3/tests/cxa/cxacb02.a: Likewise. + * ada/acats-3/tests/cxa/cxacc01.a: Likewise. + * ada/acats-3/tests/cxa/cxaf001.a: Likewise. + * ada/acats-3/tests/cxa/cxag001.a: Likewise. + * ada/acats-3/tests/cxa/cxah001.a: Likewise. + * ada/acats-3/tests/cxa/cxah002.a: Likewise. + * ada/acats-3/tests/cxa/cxai001.a: Likewise. + * ada/acats-3/tests/cxa/cxai002.a: Likewise. + * ada/acats-3/tests/cxa/cxai003.a: Likewise. + * ada/acats-3/tests/cxa/cxai004.a: Likewise. + * ada/acats-3/tests/cxa/cxai005.a: Likewise. + * ada/acats-3/tests/cxa/cxai006.a: Likewise. + * ada/acats-3/tests/cxa/cxaia01.a: Likewise. + * ada/acats-3/tests/cxa/cxaia02.a: Likewise. + * ada/acats-3/tests/cxa/cxaia03.a: Likewise. + * ada/acats-3/tests/cxa/cxaia04.a: Likewise. + * ada/acats-3/tests/cxa/cxaia05.a: Likewise. + * ada/acats-3/tests/cxa/cxaia06.a: Likewise. + * ada/acats-3/tests/cxb/cxb2001.a: Likewise. + * ada/acats-3/tests/cxb/cxb2002.a: Likewise. + * ada/acats-3/tests/cxb/cxb2003.a: Likewise. + * ada/acats-3/tests/cxb/cxb3001.a: Likewise. + * ada/acats-3/tests/cxb/cxb3002.a: Likewise. + * ada/acats-3/tests/cxb/cxb3003.a: Likewise. + * ada/acats-3/tests/cxb/cxb30040.c: Likewise. + * ada/acats-3/tests/cxb/cxb30041.am: Likewise. + * ada/acats-3/tests/cxb/cxb3005.a: Likewise. + * ada/acats-3/tests/cxb/cxb30060.c: Likewise. + * ada/acats-3/tests/cxb/cxb30061.am: Likewise. + * ada/acats-3/tests/cxb/cxb3007.a: Likewise. + * ada/acats-3/tests/cxb/cxb3008.a: Likewise. + * ada/acats-3/tests/cxb/cxb3009.a: Likewise. + * ada/acats-3/tests/cxb/cxb3010.a: Likewise. + * ada/acats-3/tests/cxb/cxb3011.a: Likewise. + * ada/acats-3/tests/cxb/cxb3012.a: Likewise. + * ada/acats-3/tests/cxb/cxb30130.c: Likewise. + * ada/acats-3/tests/cxb/cxb30131.c: Likewise. + * ada/acats-3/tests/cxb/cxb30132.am: Likewise. + * ada/acats-3/tests/cxb/cxb3014.a: Likewise. + * ada/acats-3/tests/cxb/cxb3015.a: Likewise. + * ada/acats-3/tests/cxb/cxb3016.a: Likewise. + * ada/acats-3/tests/cxb/cxb30170.c: Likewise. + * ada/acats-3/tests/cxb/cxb30171.a: Likewise. + * ada/acats-3/tests/cxb/cxb30172.am: Likewise. + * ada/acats-3/tests/cxb/cxb30230.c: Likewise. + * ada/acats-3/tests/cxb/cxb30231.am: Likewise. + * ada/acats-3/tests/cxb/cxb4001.a: Likewise. + * ada/acats-3/tests/cxb/cxb4002.a: Likewise. + * ada/acats-3/tests/cxb/cxb4003.a: Likewise. + * ada/acats-3/tests/cxb/cxb4004.a: Likewise. + * ada/acats-3/tests/cxb/cxb4005.a: Likewise. + * ada/acats-3/tests/cxb/cxb4006.a: Likewise. + * ada/acats-3/tests/cxb/cxb4007.a: Likewise. + * ada/acats-3/tests/cxb/cxb4008.a: Likewise. + * ada/acats-3/tests/cxb/cxb5001.a: Likewise. + * ada/acats-3/tests/cxb/cxb5002.a: Likewise. + * ada/acats-3/tests/cxb/cxb5003.a: Likewise. + * ada/acats-3/tests/cxf/cxf1001.a: Likewise. + * ada/acats-3/tests/cxf/cxf2001.a: Likewise. + * ada/acats-3/tests/cxf/cxf2002.a: Likewise. + * ada/acats-3/tests/cxf/cxf2003.a: Likewise. + * ada/acats-3/tests/cxf/cxf2004.a: Likewise. + * ada/acats-3/tests/cxf/cxf2005.a: Likewise. + * ada/acats-3/tests/cxf/cxf2a01.a: Likewise. + * ada/acats-3/tests/cxf/cxf2a02.a: Likewise. + * ada/acats-3/tests/cxf/cxf3001.a: Likewise. + * ada/acats-3/tests/cxf/cxf3002.a: Likewise. + * ada/acats-3/tests/cxf/cxf3003.a: Likewise. + * ada/acats-3/tests/cxf/cxf3004.a: Likewise. + * ada/acats-3/tests/cxf/cxf3a01.a: Likewise. + * ada/acats-3/tests/cxf/cxf3a02.a: Likewise. + * ada/acats-3/tests/cxf/cxf3a03.a: Likewise. + * ada/acats-3/tests/cxf/cxf3a04.a: Likewise. + * ada/acats-3/tests/cxf/cxf3a05.a: Likewise. + * ada/acats-3/tests/cxf/cxf3a06.a: Likewise. + * ada/acats-3/tests/cxf/cxf3a07.a: Likewise. + * ada/acats-3/tests/cxf/cxf3a08.a: Likewise. + * ada/acats-3/tests/cxg/cxg1001.a: Likewise. + * ada/acats-3/tests/cxg/cxg1002.a: Likewise. + * ada/acats-3/tests/cxg/cxg1003.a: Likewise. + * ada/acats-3/tests/cxg/cxg1004.a: Likewise. + * ada/acats-3/tests/cxg/cxg1005.a: Likewise. + * ada/acats-3/tests/cxg/cxg2001.a: Likewise. + * ada/acats-3/tests/cxg/cxg2002.a: Likewise. + * ada/acats-3/tests/cxg/cxg2003.a: Likewise. + * ada/acats-3/tests/cxg/cxg2004.a: Likewise. + * ada/acats-3/tests/cxg/cxg2005.a: Likewise. + * ada/acats-3/tests/cxg/cxg2006.a: Likewise. + * ada/acats-3/tests/cxg/cxg2007.a: Likewise. + * ada/acats-3/tests/cxg/cxg2008.a: Likewise. + * ada/acats-3/tests/cxg/cxg2009.a: Likewise. + * ada/acats-3/tests/cxg/cxg2010.a: Likewise. + * ada/acats-3/tests/cxg/cxg2011.a: Likewise. + * ada/acats-3/tests/cxg/cxg2012.a: Likewise. + * ada/acats-3/tests/cxg/cxg2013.a: Likewise. + * ada/acats-3/tests/cxg/cxg2014.a: Likewise. + * ada/acats-3/tests/cxg/cxg2015.a: Likewise. + * ada/acats-3/tests/cxg/cxg2016.a: Likewise. + * ada/acats-3/tests/cxg/cxg2017.a: Likewise. + * ada/acats-3/tests/cxg/cxg2018.a: Likewise. + * ada/acats-3/tests/cxg/cxg2019.a: Likewise. + * ada/acats-3/tests/cxg/cxg2020.a: Likewise. + * ada/acats-3/tests/cxg/cxg2021.a: Likewise. + * ada/acats-3/tests/cxg/cxg2022.a: Likewise. + * ada/acats-3/tests/cxg/cxg2023.a: Likewise. + * ada/acats-3/tests/cxg/cxg2024.a: Likewise. + * ada/acats-3/tests/cxh/cxh3001.a: Likewise. + * ada/acats-3/tests/cxh/cxh3002.a: Likewise. + * ada/acats-3/tests/cxh/cxh30030.a: Likewise. + * ada/acats-3/tests/cxh/cxh30031.am: Likewise. + * ada/acats-3/tests/cz/cz1101a.ada: Likewise. + * ada/acats-3/tests/cz/cz1102a.ada: Likewise. + * ada/acats-3/tests/cz/cz1103a.ada: Likewise. + * ada/acats-3/tests/d/d4a002a.ada: Likewise. + * ada/acats-3/tests/d/d4a002b.ada: Likewise. + * ada/acats-3/tests/d/d4a004a.ada: Likewise. + * ada/acats-3/tests/d/d4a004b.ada: Likewise. + * ada/acats-3/tests/e/e28002b.ada: Likewise. + * ada/acats-3/tests/e/e28005d.ada: Likewise. + * ada/acats-3/tests/e/e52103y.ada: Likewise. + * ada/acats-3/tests/e/eb4011a.ada: Likewise. + * ada/acats-3/tests/e/eb4012a.ada: Likewise. + * ada/acats-3/tests/e/eb4014a.ada: Likewise. + * ada/acats-3/tests/e/ee3203a.ada: Likewise. + * ada/acats-3/tests/e/ee3204a.ada: Likewise. + * ada/acats-3/tests/e/ee3402b.ada: Likewise. + * ada/acats-3/tests/e/ee3409f.ada: Likewise. + * ada/acats-3/tests/e/ee3412c.ada: Likewise. + * ada/acats-3/tests/l/la140010.a: Likewise. + * ada/acats-3/tests/l/la140011.am: Likewise. + * ada/acats-3/tests/l/la140012.a: Likewise. + * ada/acats-3/tests/l/la140020.a: Likewise. + * ada/acats-3/tests/l/la140021.am: Likewise. + * ada/acats-3/tests/l/la140022.a: Likewise. + * ada/acats-3/tests/l/la140030.a: Likewise. + * ada/acats-3/tests/l/la140031.a: Likewise. + * ada/acats-3/tests/l/la140032.am: Likewise. + * ada/acats-3/tests/l/la140033.a: Likewise. + * ada/acats-3/tests/l/la140040.a: Likewise. + * ada/acats-3/tests/l/la140041.am: Likewise. + * ada/acats-3/tests/l/la140042.a: Likewise. + * ada/acats-3/tests/l/la140050.a: Likewise. + * ada/acats-3/tests/l/la140051.a: Likewise. + * ada/acats-3/tests/l/la140052.am: Likewise. + * ada/acats-3/tests/l/la140053.a: Likewise. + * ada/acats-3/tests/l/la140060.a: Likewise. + * ada/acats-3/tests/l/la140061.a: Likewise. + * ada/acats-3/tests/l/la140062.am: Likewise. + * ada/acats-3/tests/l/la140063.a: Likewise. + * ada/acats-3/tests/l/la140070.a: Likewise. + * ada/acats-3/tests/l/la140071.a: Likewise. + * ada/acats-3/tests/l/la140072.am: Likewise. + * ada/acats-3/tests/l/la140073.a: Likewise. + * ada/acats-3/tests/l/la140080.a: Likewise. + * ada/acats-3/tests/l/la140081.a: Likewise. + * ada/acats-3/tests/l/la140082.am: Likewise. + * ada/acats-3/tests/l/la140083.a: Likewise. + * ada/acats-3/tests/l/la140090.a: Likewise. + * ada/acats-3/tests/l/la140091.a: Likewise. + * ada/acats-3/tests/l/la140092.am: Likewise. + * ada/acats-3/tests/l/la140093.a: Likewise. + * ada/acats-3/tests/l/la140100.a: Likewise. + * ada/acats-3/tests/l/la140101.a: Likewise. + * ada/acats-3/tests/l/la140102.am: Likewise. + * ada/acats-3/tests/l/la140103.a: Likewise. + * ada/acats-3/tests/l/la140110.a: Likewise. + * ada/acats-3/tests/l/la140111.a: Likewise. + * ada/acats-3/tests/l/la140112.am: Likewise. + * ada/acats-3/tests/l/la140113.a: Likewise. + * ada/acats-3/tests/l/la140120.a: Likewise. + * ada/acats-3/tests/l/la140121.a: Likewise. + * ada/acats-3/tests/l/la140122.am: Likewise. + * ada/acats-3/tests/l/la140123.a: Likewise. + * ada/acats-3/tests/l/la140130.a: Likewise. + * ada/acats-3/tests/l/la140131.a: Likewise. + * ada/acats-3/tests/l/la140132.am: Likewise. + * ada/acats-3/tests/l/la140133.a: Likewise. + * ada/acats-3/tests/l/la140140.a: Likewise. + * ada/acats-3/tests/l/la140141.a: Likewise. + * ada/acats-3/tests/l/la140142.am: Likewise. + * ada/acats-3/tests/l/la140143.a: Likewise. + * ada/acats-3/tests/l/la140150.a: Likewise. + * ada/acats-3/tests/l/la140151.a: Likewise. + * ada/acats-3/tests/l/la140152.am: Likewise. + * ada/acats-3/tests/l/la140153.a: Likewise. + * ada/acats-3/tests/l/la140160.a: Likewise. + * ada/acats-3/tests/l/la140161.a: Likewise. + * ada/acats-3/tests/l/la140162.am: Likewise. + * ada/acats-3/tests/l/la140163.a: Likewise. + * ada/acats-3/tests/l/la140170.a: Likewise. + * ada/acats-3/tests/l/la140171.a: Likewise. + * ada/acats-3/tests/l/la140172.am: Likewise. + * ada/acats-3/tests/l/la140173.a: Likewise. + * ada/acats-3/tests/l/la140180.a: Likewise. + * ada/acats-3/tests/l/la140181.a: Likewise. + * ada/acats-3/tests/l/la140182.am: Likewise. + * ada/acats-3/tests/l/la140183.a: Likewise. + * ada/acats-3/tests/l/la140190.a: Likewise. + * ada/acats-3/tests/l/la140191.a: Likewise. + * ada/acats-3/tests/l/la140192.am: Likewise. + * ada/acats-3/tests/l/la140193.a: Likewise. + * ada/acats-3/tests/l/la140200.a: Likewise. + * ada/acats-3/tests/l/la140201.a: Likewise. + * ada/acats-3/tests/l/la140202.am: Likewise. + * ada/acats-3/tests/l/la140203.a: Likewise. + * ada/acats-3/tests/l/la140210.a: Likewise. + * ada/acats-3/tests/l/la140211.am: Likewise. + * ada/acats-3/tests/l/la140212.a: Likewise. + * ada/acats-3/tests/l/la140220.a: Likewise. + * ada/acats-3/tests/l/la140221.am: Likewise. + * ada/acats-3/tests/l/la140222.a: Likewise. + * ada/acats-3/tests/l/la140240.a: Likewise. + * ada/acats-3/tests/l/la140241.a: Likewise. + * ada/acats-3/tests/l/la140242.am: Likewise. + * ada/acats-3/tests/l/la140243.a: Likewise. + * ada/acats-3/tests/l/la140250.a: Likewise. + * ada/acats-3/tests/l/la140251.am: Likewise. + * ada/acats-3/tests/l/la140252.a: Likewise. + * ada/acats-3/tests/l/la140260.a: Likewise. + * ada/acats-3/tests/l/la140261.a: Likewise. + * ada/acats-3/tests/l/la140262.am: Likewise. + * ada/acats-3/tests/l/la140263.a: Likewise. + * ada/acats-3/tests/l/la140270.a: Likewise. + * ada/acats-3/tests/l/la140271.a: Likewise. + * ada/acats-3/tests/l/la140272.am: Likewise. + * ada/acats-3/tests/l/la140273.a: Likewise. + +2025-05-24 Eric Botcazou <ebotcazou@adacore.com> + + * ada/acats-2/run_all.sh: Minor tweaks in comments. + * ada/acats-2/tests/cd/cd300050.am: Upgrade to 2.6K revision. + * ada/acats-2/tests/cd/cd300051.c: Likewise. + * ada/acats-2/tests/cxa/cxa4001.a: Likewise. + * ada/acats-2/tests/cxb/cxb30131.c: Likewise. + +2025-05-24 Eric Botcazou <ebotcazou@adacore.com> + + * ada/acats/*: Rename into ada/acats-2/*. + * ada/acats-2/run_all.sh: Adjust to above renaming. + * ada/acats-2/support/impdefc.a: New file. + * ada/acats-2/elabd.lst: New file. + * ada/acats-2/floatstore.lst: New file. + * ada/acats-2/norun.lst: New file. + * ada/acats-2/run_acats.sh: New file. + * ada/acats-2/run_test.exp: New file. + * ada/acats-2/stackcheck.lst: New file. + * ada/acats-2/support/acats26.lst: New file. + * ada/acats-2/support/checkfil.ada: New file. + * ada/acats-2/support/enumchek.ada: New file. + * ada/acats-2/support/f340a000.a: New file. + * ada/acats-2/support/f340a001.a: New file. + * ada/acats-2/support/f341a00.a: New file. + * ada/acats-2/support/f390a00.a: New file. + * ada/acats-2/support/f392a00.a: New file. + * ada/acats-2/support/f392c00.a: New file. + * ada/acats-2/support/f392d00.a: New file. + * ada/acats-2/support/f393a00.a: New file. + * ada/acats-2/support/f393b00.a: New file. + * ada/acats-2/support/f3a2a00.a: New file. + * ada/acats-2/support/f460a00.a: New file. + * ada/acats-2/support/f730a000.a: New file. + * ada/acats-2/support/f730a001.a: New file. + * ada/acats-2/support/f731a00.a: New file. + * ada/acats-2/support/f940a00.a: New file. + * ada/acats-2/support/f954a00.a: New file. + * ada/acats-2/support/fa11a00.a: New file. + * ada/acats-2/support/fa11b00.a: New file. + * ada/acats-2/support/fa11c00.a: New file. + * ada/acats-2/support/fa11d00.a: New file. + * ada/acats-2/support/fa13a00.a: New file. + * ada/acats-2/support/fa13b00.a: New file. + * ada/acats-2/support/fa21a00.a: New file. + * ada/acats-2/support/fb20a00.a: New file. + * ada/acats-2/support/fb40a00.a: New file. + * ada/acats-2/support/fc50a00.a: New file. + * ada/acats-2/support/fc51a00.a: New file. + * ada/acats-2/support/fc51b00.a: New file. + * ada/acats-2/support/fc51c00.a: New file. + * ada/acats-2/support/fc51d00.a: New file. + * ada/acats-2/support/fc54a00.a: New file. + * ada/acats-2/support/fc70a00.a: New file. + * ada/acats-2/support/fc70b00.a: New file. + * ada/acats-2/support/fc70c00.a: New file. + * ada/acats-2/support/fcndecl.ada: New file. + * ada/acats-2/support/fd72a00.a: New file. + * ada/acats-2/support/fdb0a00.a: New file. + * ada/acats-2/support/fdd2a00.a: New file. + * ada/acats-2/support/fxa5a00.a: New file. + * ada/acats-2/support/fxaca00.a: New file. + * ada/acats-2/support/fxacb00.a: New file. + * ada/acats-2/support/fxacc00.a: New file. + * ada/acats-2/support/fxc6a00.a: New file. + * ada/acats-2/support/fxe2a00.a: New file. + * ada/acats-2/support/fxf2a00.a: New file. + * ada/acats-2/support/fxf3a00.a: New file. + * ada/acats-2/support/impbit.adb: New file. + * ada/acats-2/support/impdef.a: New file. + * ada/acats-2/support/impdefd.a: New file. + * ada/acats-2/support/impdefe.a: New file. + * ada/acats-2/support/impdefg.a: New file. + * ada/acats-2/support/impdefh.a: New file. + * ada/acats-2/support/lencheck.ada: New file. + * ada/acats-2/support/macro.dfs: New file. + * ada/acats-2/support/macrodef.adb: New file. + * ada/acats-2/support/macrosub.ada: New file. + * ada/acats-2/support/repbody.ada: New file. + * ada/acats-2/support/repspec.ada: New file. + * ada/acats-2/support/spprt13s.tst: New file. + * ada/acats-2/support/tctouch.ada: New file. + * ada/acats-2/support/tsttests.dat: New file. + * ada/acats-2/support/widechr.a: New file. + * ada/acats-2/tests/a/a22006b.ada: New file. + * ada/acats-2/tests/a/a22006c.ada: New file. + * ada/acats-2/tests/a/a22006d.ada: New file. + * ada/acats-2/tests/a/a26007a.tst: New file. + * ada/acats-2/tests/a/a27003a.ada: New file. + * ada/acats-2/tests/a/a29003a.ada: New file. + * ada/acats-2/tests/a/a2a031a.ada: New file. + * ada/acats-2/tests/a/a33003a.ada: New file. + * ada/acats-2/tests/a/a34017c.ada: New file. + * ada/acats-2/tests/a/a35101b.ada: New file. + * ada/acats-2/tests/a/a35402a.ada: New file. + * ada/acats-2/tests/a/a35801f.ada: New file. + * ada/acats-2/tests/a/a35902c.ada: New file. + * ada/acats-2/tests/a/a38106d.ada: New file. + * ada/acats-2/tests/a/a38106e.ada: New file. + * ada/acats-2/tests/a/a49027a.ada: New file. + * ada/acats-2/tests/a/a49027b.ada: New file. + * ada/acats-2/tests/a/a49027c.ada: New file. + * ada/acats-2/tests/a/a54b01a.ada: New file. + * ada/acats-2/tests/a/a54b02a.ada: New file. + * ada/acats-2/tests/a/a55b12a.ada: New file. + * ada/acats-2/tests/a/a55b13a.ada: New file. + * ada/acats-2/tests/a/a55b14a.ada: New file. + * ada/acats-2/tests/a/a71004a.ada: New file. + * ada/acats-2/tests/a/a73001i.ada: New file. + * ada/acats-2/tests/a/a73001j.ada: New file. + * ada/acats-2/tests/a/a74105b.ada: New file. + * ada/acats-2/tests/a/a74106a.ada: New file. + * ada/acats-2/tests/a/a74106b.ada: New file. + * ada/acats-2/tests/a/a74106c.ada: New file. + * ada/acats-2/tests/a/a74205e.ada: New file. + * ada/acats-2/tests/a/a74205f.ada: New file. + * ada/acats-2/tests/a/a83009a.ada: New file. + * ada/acats-2/tests/a/a83009b.ada: New file. + * ada/acats-2/tests/a/a83a02a.ada: New file. + * ada/acats-2/tests/a/a83a02b.ada: New file. + * ada/acats-2/tests/a/a83a06a.ada: New file. + * ada/acats-2/tests/a/a83a08a.ada: New file. + * ada/acats-2/tests/a/a83c01c.ada: New file. + * ada/acats-2/tests/a/a83c01h.ada: New file. + * ada/acats-2/tests/a/a83c01i.ada: New file. + * ada/acats-2/tests/a/a85007d.ada: New file. + * ada/acats-2/tests/a/a85013b.ada: New file. + * ada/acats-2/tests/a/a87b59a.ada: New file. + * ada/acats-2/tests/a/a95001c.ada: New file. + * ada/acats-2/tests/a/a95074d.ada: New file. + * ada/acats-2/tests/a/a97106a.ada: New file. + * ada/acats-2/tests/a/a99006a.ada: New file. + * ada/acats-2/tests/a/aa2010a.ada: New file. + * ada/acats-2/tests/a/aa2012a.ada: New file. + * ada/acats-2/tests/a/ac1015b.ada: New file. + * ada/acats-2/tests/a/ac3106a.ada: New file. + * ada/acats-2/tests/a/ac3206a.ada: New file. + * ada/acats-2/tests/a/ac3207a.ada: New file. + * ada/acats-2/tests/a/ad7001b.ada: New file. + * ada/acats-2/tests/a/ad7001c0.ada: New file. + * ada/acats-2/tests/a/ad7001c1.ada: New file. + * ada/acats-2/tests/a/ad7001d0.ada: New file. + * ada/acats-2/tests/a/ad7001d1.ada: New file. + * ada/acats-2/tests/a/ad7006a.ada: New file. + * ada/acats-2/tests/a/ad7101a.ada: New file. + * ada/acats-2/tests/a/ad7101c.ada: New file. + * ada/acats-2/tests/a/ad7102a.ada: New file. + * ada/acats-2/tests/a/ad7103a.ada: New file. + * ada/acats-2/tests/a/ad7103c.ada: New file. + * ada/acats-2/tests/a/ad7104a.ada: New file. + * ada/acats-2/tests/a/ad7201a.ada: New file. + * ada/acats-2/tests/a/ad7203b.ada: New file. + * ada/acats-2/tests/a/ad7205b.ada: New file. + * ada/acats-2/tests/a/ad8011a.tst: New file. + * ada/acats-2/tests/a/ada101a.ada: New file. + * ada/acats-2/tests/a/ae2113a.ada: New file. + * ada/acats-2/tests/a/ae2113b.ada: New file. + * ada/acats-2/tests/a/ae3002g.ada: New file. + * ada/acats-2/tests/a/ae3101a.ada: New file. + * ada/acats-2/tests/a/ae3702a.ada: New file. + * ada/acats-2/tests/a/ae3709a.ada: New file. + * ada/acats-2/tests/c2/c23001a.ada: New file. + * ada/acats-2/tests/c2/c23003a.tst: New file. + * ada/acats-2/tests/c2/c23003b.tst: New file. + * ada/acats-2/tests/c2/c23003g.tst: New file. + * ada/acats-2/tests/c2/c23003i.tst: New file. + * ada/acats-2/tests/c2/c23006a.ada: New file. + * ada/acats-2/tests/c2/c23006b.ada: New file. + * ada/acats-2/tests/c2/c23006c.ada: New file. + * ada/acats-2/tests/c2/c23006d.ada: New file. + * ada/acats-2/tests/c2/c23006e.ada: New file. + * ada/acats-2/tests/c2/c23006f.ada: New file. + * ada/acats-2/tests/c2/c23006g.ada: New file. + * ada/acats-2/tests/c2/c24002d.ada: New file. + * ada/acats-2/tests/c2/c24003a.ada: New file. + * ada/acats-2/tests/c2/c24003b.ada: New file. + * ada/acats-2/tests/c2/c24003c.ada: New file. + * ada/acats-2/tests/c2/c24106a.ada: New file. + * ada/acats-2/tests/c2/c24202d.ada: New file. + * ada/acats-2/tests/c2/c24203a.ada: New file. + * ada/acats-2/tests/c2/c24203b.ada: New file. + * ada/acats-2/tests/c2/c24207a.ada: New file. + * ada/acats-2/tests/c2/c24211a.ada: New file. + * ada/acats-2/tests/c2/c250001.aw: New file. + * ada/acats-2/tests/c2/c250002.aw: New file. + * ada/acats-2/tests/c2/c25001a.ada: New file. + * ada/acats-2/tests/c2/c25001b.ada: New file. + * ada/acats-2/tests/c2/c26006a.ada: New file. + * ada/acats-2/tests/c2/c26008a.ada: New file. + * ada/acats-2/tests/c2/c2a001a.ada: New file. + * ada/acats-2/tests/c2/c2a001b.ada: New file. + * ada/acats-2/tests/c2/c2a001c.ada: New file. + * ada/acats-2/tests/c2/c2a002a.ada: New file. + * ada/acats-2/tests/c2/c2a008a.ada: New file. + * ada/acats-2/tests/c2/c2a021b.ada: New file. + * ada/acats-2/tests/c3/c32001a.ada: New file. + * ada/acats-2/tests/c3/c32001b.ada: New file. + * ada/acats-2/tests/c3/c32001c.ada: New file. + * ada/acats-2/tests/c3/c32001d.ada: New file. + * ada/acats-2/tests/c3/c32001e.ada: New file. + * ada/acats-2/tests/c3/c32107a.ada: New file. + * ada/acats-2/tests/c3/c32107c.ada: New file. + * ada/acats-2/tests/c3/c32108a.ada: New file. + * ada/acats-2/tests/c3/c32108b.ada: New file. + * ada/acats-2/tests/c3/c32111a.ada: New file. + * ada/acats-2/tests/c3/c32111b.ada: New file. + * ada/acats-2/tests/c3/c32112b.ada: New file. + * ada/acats-2/tests/c3/c32113a.ada: New file. + * ada/acats-2/tests/c3/c32115a.ada: New file. + * ada/acats-2/tests/c3/c32115b.ada: New file. + * ada/acats-2/tests/c3/c330001.a: New file. + * ada/acats-2/tests/c3/c330002.a: New file. + * ada/acats-2/tests/c3/c332001.a: New file. + * ada/acats-2/tests/c3/c340001.a: New file. + * ada/acats-2/tests/c3/c34001a.ada: New file. + * ada/acats-2/tests/c3/c34001c.ada: New file. + * ada/acats-2/tests/c3/c34001d.ada: New file. + * ada/acats-2/tests/c3/c34001f.ada: New file. + * ada/acats-2/tests/c3/c34002a.ada: New file. + * ada/acats-2/tests/c3/c34002c.ada: New file. + * ada/acats-2/tests/c3/c34003a.ada: New file. + * ada/acats-2/tests/c3/c34003c.ada: New file. + * ada/acats-2/tests/c3/c34004a.ada: New file. + * ada/acats-2/tests/c3/c34004c.ada: New file. + * ada/acats-2/tests/c3/c34005a.ada: New file. + * ada/acats-2/tests/c3/c34005c.ada: New file. + * ada/acats-2/tests/c3/c34005d.ada: New file. + * ada/acats-2/tests/c3/c34005f.ada: New file. + * ada/acats-2/tests/c3/c34005g.ada: New file. + * ada/acats-2/tests/c3/c34005i.ada: New file. + * ada/acats-2/tests/c3/c34005j.ada: New file. + * ada/acats-2/tests/c3/c34005l.ada: New file. + * ada/acats-2/tests/c3/c34005m.ada: New file. + * ada/acats-2/tests/c3/c34005o.ada: New file. + * ada/acats-2/tests/c3/c34005p.ada: New file. + * ada/acats-2/tests/c3/c34005r.ada: New file. + * ada/acats-2/tests/c3/c34005s.ada: New file. + * ada/acats-2/tests/c3/c34005u.ada: New file. + * ada/acats-2/tests/c3/c34005v.ada: New file. + * ada/acats-2/tests/c3/c34006a.ada: New file. + * ada/acats-2/tests/c3/c34006d.ada: New file. + * ada/acats-2/tests/c3/c34006f.ada: New file. + * ada/acats-2/tests/c3/c34006g.ada: New file. + * ada/acats-2/tests/c3/c34006j.ada: New file. + * ada/acats-2/tests/c3/c34006l.ada: New file. + * ada/acats-2/tests/c3/c34007a.ada: New file. + * ada/acats-2/tests/c3/c34007d.ada: New file. + * ada/acats-2/tests/c3/c34007f.ada: New file. + * ada/acats-2/tests/c3/c34007g.ada: New file. + * ada/acats-2/tests/c3/c34007i.ada: New file. + * ada/acats-2/tests/c3/c34007j.ada: New file. + * ada/acats-2/tests/c3/c34007m.ada: New file. + * ada/acats-2/tests/c3/c34007p.ada: New file. + * ada/acats-2/tests/c3/c34007r.ada: New file. + * ada/acats-2/tests/c3/c34007s.ada: New file. + * ada/acats-2/tests/c3/c34007u.ada: New file. + * ada/acats-2/tests/c3/c34007v.ada: New file. + * ada/acats-2/tests/c3/c34008a.ada: New file. + * ada/acats-2/tests/c3/c34009a.ada: New file. + * ada/acats-2/tests/c3/c34009d.ada: New file. + * ada/acats-2/tests/c3/c34009f.ada: New file. + * ada/acats-2/tests/c3/c34009g.ada: New file. + * ada/acats-2/tests/c3/c34009j.ada: New file. + * ada/acats-2/tests/c3/c34009l.ada: New file. + * ada/acats-2/tests/c3/c34011b.ada: New file. + * ada/acats-2/tests/c3/c34012a.ada: New file. + * ada/acats-2/tests/c3/c34014a.ada: New file. + * ada/acats-2/tests/c3/c34014c.ada: New file. + * ada/acats-2/tests/c3/c34014e.ada: New file. + * ada/acats-2/tests/c3/c34014g.ada: New file. + * ada/acats-2/tests/c3/c34014h.ada: New file. + * ada/acats-2/tests/c3/c34014n.ada: New file. + * ada/acats-2/tests/c3/c34014p.ada: New file. + * ada/acats-2/tests/c3/c34014r.ada: New file. + * ada/acats-2/tests/c3/c34014t.ada: New file. + * ada/acats-2/tests/c3/c34014u.ada: New file. + * ada/acats-2/tests/c3/c34018a.ada: New file. + * ada/acats-2/tests/c3/c340a01.a: New file. + * ada/acats-2/tests/c3/c340a02.a: New file. + * ada/acats-2/tests/c3/c341a01.a: New file. + * ada/acats-2/tests/c3/c341a02.a: New file. + * ada/acats-2/tests/c3/c341a03.a: New file. + * ada/acats-2/tests/c3/c341a04.a: New file. + * ada/acats-2/tests/c3/c35003a.ada: New file. + * ada/acats-2/tests/c3/c35003b.ada: New file. + * ada/acats-2/tests/c3/c35003d.ada: New file. + * ada/acats-2/tests/c3/c35102a.ada: New file. + * ada/acats-2/tests/c3/c352001.a: New file. + * ada/acats-2/tests/c3/c354002.a: New file. + * ada/acats-2/tests/c3/c354003.a: New file. + * ada/acats-2/tests/c3/c35502a.ada: New file. + * ada/acats-2/tests/c3/c35502b.ada: New file. + * ada/acats-2/tests/c3/c35502c.ada: New file. + * ada/acats-2/tests/c3/c35502d.tst: New file. + * ada/acats-2/tests/c3/c35502e.ada: New file. + * ada/acats-2/tests/c3/c35502f.tst: New file. + * ada/acats-2/tests/c3/c35502g.ada: New file. + * ada/acats-2/tests/c3/c35502h.ada: New file. + * ada/acats-2/tests/c3/c35502i.ada: New file. + * ada/acats-2/tests/c3/c35502j.ada: New file. + * ada/acats-2/tests/c3/c35502k.ada: New file. + * ada/acats-2/tests/c3/c35502l.ada: New file. + * ada/acats-2/tests/c3/c35502m.ada: New file. + * ada/acats-2/tests/c3/c35502n.ada: New file. + * ada/acats-2/tests/c3/c35502o.ada: New file. + * ada/acats-2/tests/c3/c35502p.ada: New file. + * ada/acats-2/tests/c3/c35503a.ada: New file. + * ada/acats-2/tests/c3/c35503b.ada: New file. + * ada/acats-2/tests/c3/c35503c.ada: New file. + * ada/acats-2/tests/c3/c35503d.tst: New file. + * ada/acats-2/tests/c3/c35503e.ada: New file. + * ada/acats-2/tests/c3/c35503f.tst: New file. + * ada/acats-2/tests/c3/c35503g.ada: New file. + * ada/acats-2/tests/c3/c35503h.ada: New file. + * ada/acats-2/tests/c3/c35503k.ada: New file. + * ada/acats-2/tests/c3/c35503l.ada: New file. + * ada/acats-2/tests/c3/c35503o.ada: New file. + * ada/acats-2/tests/c3/c35503p.ada: New file. + * ada/acats-2/tests/c3/c35504a.ada: New file. + * ada/acats-2/tests/c3/c35504b.ada: New file. + * ada/acats-2/tests/c3/c35505c.ada: New file. + * ada/acats-2/tests/c3/c35505e.ada: New file. + * ada/acats-2/tests/c3/c35505f.ada: New file. + * ada/acats-2/tests/c3/c35507a.ada: New file. + * ada/acats-2/tests/c3/c35507b.ada: New file. + * ada/acats-2/tests/c3/c35507c.ada: New file. + * ada/acats-2/tests/c3/c35507e.ada: New file. + * ada/acats-2/tests/c3/c35507g.ada: New file. + * ada/acats-2/tests/c3/c35507h.ada: New file. + * ada/acats-2/tests/c3/c35507i.ada: New file. + * ada/acats-2/tests/c3/c35507j.ada: New file. + * ada/acats-2/tests/c3/c35507k.ada: New file. + * ada/acats-2/tests/c3/c35507l.ada: New file. + * ada/acats-2/tests/c3/c35507m.ada: New file. + * ada/acats-2/tests/c3/c35507n.ada: New file. + * ada/acats-2/tests/c3/c35507o.ada: New file. + * ada/acats-2/tests/c3/c35507p.ada: New file. + * ada/acats-2/tests/c3/c35508a.ada: New file. + * ada/acats-2/tests/c3/c35508b.ada: New file. + * ada/acats-2/tests/c3/c35508c.ada: New file. + * ada/acats-2/tests/c3/c35508e.ada: New file. + * ada/acats-2/tests/c3/c35508g.ada: New file. + * ada/acats-2/tests/c3/c35508h.ada: New file. + * ada/acats-2/tests/c3/c35508k.ada: New file. + * ada/acats-2/tests/c3/c35508l.ada: New file. + * ada/acats-2/tests/c3/c35508o.ada: New file. + * ada/acats-2/tests/c3/c35508p.ada: New file. + * ada/acats-2/tests/c3/c35703a.ada: New file. + * ada/acats-2/tests/c3/c35704a.ada: New file. + * ada/acats-2/tests/c3/c35704b.ada: New file. + * ada/acats-2/tests/c3/c35704c.ada: New file. + * ada/acats-2/tests/c3/c35704d.ada: New file. + * ada/acats-2/tests/c3/c35801d.ada: New file. + * ada/acats-2/tests/c3/c35902d.ada: New file. + * ada/acats-2/tests/c3/c35904a.ada: New file. + * ada/acats-2/tests/c3/c35904b.ada: New file. + * ada/acats-2/tests/c3/c35a02a.ada: New file. + * ada/acats-2/tests/c3/c35a05a.ada: New file. + * ada/acats-2/tests/c3/c35a05d.ada: New file. + * ada/acats-2/tests/c3/c35a05n.ada: New file. + * ada/acats-2/tests/c3/c35a05q.ada: New file. + * ada/acats-2/tests/c3/c35a07a.ada: New file. + * ada/acats-2/tests/c3/c35a07d.ada: New file. + * ada/acats-2/tests/c3/c35a08b.ada: New file. + * ada/acats-2/tests/c3/c360002.a: New file. + * ada/acats-2/tests/c3/c36104a.ada: New file. + * ada/acats-2/tests/c3/c36104b.ada: New file. + * ada/acats-2/tests/c3/c36172a.ada: New file. + * ada/acats-2/tests/c3/c36172b.ada: New file. + * ada/acats-2/tests/c3/c36172c.ada: New file. + * ada/acats-2/tests/c3/c36174a.ada: New file. + * ada/acats-2/tests/c3/c36180a.ada: New file. + * ada/acats-2/tests/c3/c36202c.ada: New file. + * ada/acats-2/tests/c3/c36203a.ada: New file. + * ada/acats-2/tests/c3/c36204a.ada: New file. + * ada/acats-2/tests/c3/c36204b.ada: New file. + * ada/acats-2/tests/c3/c36204c.ada: New file. + * ada/acats-2/tests/c3/c36204d.ada: New file. + * ada/acats-2/tests/c3/c36205a.ada: New file. + * ada/acats-2/tests/c3/c36205b.ada: New file. + * ada/acats-2/tests/c3/c36205c.ada: New file. + * ada/acats-2/tests/c3/c36205d.ada: New file. + * ada/acats-2/tests/c3/c36205e.ada: New file. + * ada/acats-2/tests/c3/c36205f.ada: New file. + * ada/acats-2/tests/c3/c36205g.ada: New file. + * ada/acats-2/tests/c3/c36205h.ada: New file. + * ada/acats-2/tests/c3/c36205i.ada: New file. + * ada/acats-2/tests/c3/c36205j.ada: New file. + * ada/acats-2/tests/c3/c36205k.ada: New file. + * ada/acats-2/tests/c3/c36205l.ada: New file. + * ada/acats-2/tests/c3/c36301a.ada: New file. + * ada/acats-2/tests/c3/c36301b.ada: New file. + * ada/acats-2/tests/c3/c36302a.ada: New file. + * ada/acats-2/tests/c3/c36304a.ada: New file. + * ada/acats-2/tests/c3/c36305a.ada: New file. + * ada/acats-2/tests/c3/c37002a.ada: New file. + * ada/acats-2/tests/c3/c37003a.ada: New file. + * ada/acats-2/tests/c3/c37003b.ada: New file. + * ada/acats-2/tests/c3/c37005a.ada: New file. + * ada/acats-2/tests/c3/c37006a.ada: New file. + * ada/acats-2/tests/c3/c37008a.ada: New file. + * ada/acats-2/tests/c3/c37008b.ada: New file. + * ada/acats-2/tests/c3/c37009a.ada: New file. + * ada/acats-2/tests/c3/c37010a.ada: New file. + * ada/acats-2/tests/c3/c37010b.ada: New file. + * ada/acats-2/tests/c3/c371001.a: New file. + * ada/acats-2/tests/c3/c371002.a: New file. + * ada/acats-2/tests/c3/c371003.a: New file. + * ada/acats-2/tests/c3/c37102b.ada: New file. + * ada/acats-2/tests/c3/c37103a.ada: New file. + * ada/acats-2/tests/c3/c37105a.ada: New file. + * ada/acats-2/tests/c3/c37107a.ada: New file. + * ada/acats-2/tests/c3/c37108b.ada: New file. + * ada/acats-2/tests/c3/c37206a.ada: New file. + * ada/acats-2/tests/c3/c37207a.ada: New file. + * ada/acats-2/tests/c3/c37208a.ada: New file. + * ada/acats-2/tests/c3/c37208b.ada: New file. + * ada/acats-2/tests/c3/c37209a.ada: New file. + * ada/acats-2/tests/c3/c37209b.ada: New file. + * ada/acats-2/tests/c3/c37210a.ada: New file. + * ada/acats-2/tests/c3/c37211a.ada: New file. + * ada/acats-2/tests/c3/c37211b.ada: New file. + * ada/acats-2/tests/c3/c37211c.ada: New file. + * ada/acats-2/tests/c3/c37211d.ada: New file. + * ada/acats-2/tests/c3/c37211e.ada: New file. + * ada/acats-2/tests/c3/c37213b.ada: New file. + * ada/acats-2/tests/c3/c37213d.ada: New file. + * ada/acats-2/tests/c3/c37213f.ada: New file. + * ada/acats-2/tests/c3/c37213h.ada: New file. + * ada/acats-2/tests/c3/c37213j.ada: New file. + * ada/acats-2/tests/c3/c37213k.ada: New file. + * ada/acats-2/tests/c3/c37213l.ada: New file. + * ada/acats-2/tests/c3/c37215b.ada: New file. + * ada/acats-2/tests/c3/c37215d.ada: New file. + * ada/acats-2/tests/c3/c37215f.ada: New file. + * ada/acats-2/tests/c3/c37215h.ada: New file. + * ada/acats-2/tests/c3/c37217a.ada: New file. + * ada/acats-2/tests/c3/c37217b.ada: New file. + * ada/acats-2/tests/c3/c37217c.ada: New file. + * ada/acats-2/tests/c3/c37304a.ada: New file. + * ada/acats-2/tests/c3/c37305a.ada: New file. + * ada/acats-2/tests/c3/c37306a.ada: New file. + * ada/acats-2/tests/c3/c37309a.ada: New file. + * ada/acats-2/tests/c3/c37310a.ada: New file. + * ada/acats-2/tests/c3/c37312a.ada: New file. + * ada/acats-2/tests/c3/c37402a.ada: New file. + * ada/acats-2/tests/c3/c37403a.ada: New file. + * ada/acats-2/tests/c3/c37404a.ada: New file. + * ada/acats-2/tests/c3/c37404b.ada: New file. + * ada/acats-2/tests/c3/c37405a.ada: New file. + * ada/acats-2/tests/c3/c37411a.ada: New file. + * ada/acats-2/tests/c3/c380001.a: New file. + * ada/acats-2/tests/c3/c380002.a: New file. + * ada/acats-2/tests/c3/c380003.a: New file. + * ada/acats-2/tests/c3/c380004.a: New file. + * ada/acats-2/tests/c3/c38002a.ada: New file. + * ada/acats-2/tests/c3/c38002b.ada: New file. + * ada/acats-2/tests/c3/c38005a.ada: New file. + * ada/acats-2/tests/c3/c38005b.ada: New file. + * ada/acats-2/tests/c3/c38005c.ada: New file. + * ada/acats-2/tests/c3/c38006a.ada: New file. + * ada/acats-2/tests/c3/c38102a.ada: New file. + * ada/acats-2/tests/c3/c38102b.ada: New file. + * ada/acats-2/tests/c3/c38102c.ada: New file. + * ada/acats-2/tests/c3/c38102d.ada: New file. + * ada/acats-2/tests/c3/c38102e.ada: New file. + * ada/acats-2/tests/c3/c38104a.ada: New file. + * ada/acats-2/tests/c3/c38107a.ada: New file. + * ada/acats-2/tests/c3/c38107b.ada: New file. + * ada/acats-2/tests/c3/c38108a.ada: New file. + * ada/acats-2/tests/c3/c38108b.ada: New file. + * ada/acats-2/tests/c3/c38108c0.ada: New file. + * ada/acats-2/tests/c3/c38108c1.ada: New file. + * ada/acats-2/tests/c3/c38108c2.ada: New file. + * ada/acats-2/tests/c3/c38108d0.ada: New file. + * ada/acats-2/tests/c3/c38108d1.ada: New file. + * ada/acats-2/tests/c3/c38202a.ada: New file. + * ada/acats-2/tests/c3/c3900010.a: New file. + * ada/acats-2/tests/c3/c3900011.am: New file. + * ada/acats-2/tests/c3/c390002.a: New file. + * ada/acats-2/tests/c3/c390003.a: New file. + * ada/acats-2/tests/c3/c390004.a: New file. + * ada/acats-2/tests/c3/c3900050.a: New file. + * ada/acats-2/tests/c3/c3900051.a: New file. + * ada/acats-2/tests/c3/c3900052.a: New file. + * ada/acats-2/tests/c3/c3900053.am: New file. + * ada/acats-2/tests/c3/c3900060.a: New file. + * ada/acats-2/tests/c3/c3900061.a: New file. + * ada/acats-2/tests/c3/c3900062.a: New file. + * ada/acats-2/tests/c3/c3900063.am: New file. + * ada/acats-2/tests/c3/c390007.a: New file. + * ada/acats-2/tests/c3/c390010.a: New file. + * ada/acats-2/tests/c3/c390011.a: New file. + * ada/acats-2/tests/c3/c39006a.ada: New file. + * ada/acats-2/tests/c3/c39006b.ada: New file. + * ada/acats-2/tests/c3/c39006c0.ada: New file. + * ada/acats-2/tests/c3/c39006c1.ada: New file. + * ada/acats-2/tests/c3/c39006d.ada: New file. + * ada/acats-2/tests/c3/c39006e.ada: New file. + * ada/acats-2/tests/c3/c39006f0.ada: New file. + * ada/acats-2/tests/c3/c39006f1.ada: New file. + * ada/acats-2/tests/c3/c39006f2.ada: New file. + * ada/acats-2/tests/c3/c39006f3.ada: New file. + * ada/acats-2/tests/c3/c39006g.ada: New file. + * ada/acats-2/tests/c3/c39007a.ada: New file. + * ada/acats-2/tests/c3/c39007b.ada: New file. + * ada/acats-2/tests/c3/c39008a.ada: New file. + * ada/acats-2/tests/c3/c39008b.ada: New file. + * ada/acats-2/tests/c3/c39008c.ada: New file. + * ada/acats-2/tests/c3/c390a010.a: New file. + * ada/acats-2/tests/c3/c390a011.am: New file. + * ada/acats-2/tests/c3/c390a020.a: New file. + * ada/acats-2/tests/c3/c390a021.a: New file. + * ada/acats-2/tests/c3/c390a022.am: New file. + * ada/acats-2/tests/c3/c390a030.a: New file. + * ada/acats-2/tests/c3/c390a031.am: New file. + * ada/acats-2/tests/c3/c391001.a: New file. + * ada/acats-2/tests/c3/c391002.a: New file. + * ada/acats-2/tests/c3/c392002.a: New file. + * ada/acats-2/tests/c3/c392003.a: New file. + * ada/acats-2/tests/c3/c392004.a: New file. + * ada/acats-2/tests/c3/c392005.a: New file. + * ada/acats-2/tests/c3/c392008.a: New file. + * ada/acats-2/tests/c3/c392010.a: New file. + * ada/acats-2/tests/c3/c392011.a: New file. + * ada/acats-2/tests/c3/c392013.a: New file. + * ada/acats-2/tests/c3/c392014.a: New file. + * ada/acats-2/tests/c3/c392a01.a: New file. + * ada/acats-2/tests/c3/c392c05.a: New file. + * ada/acats-2/tests/c3/c392c07.a: New file. + * ada/acats-2/tests/c3/c392d01.a: New file. + * ada/acats-2/tests/c3/c392d02.a: New file. + * ada/acats-2/tests/c3/c392d03.a: New file. + * ada/acats-2/tests/c3/c393001.a: New file. + * ada/acats-2/tests/c3/c393007.a: New file. + * ada/acats-2/tests/c3/c393008.a: New file. + * ada/acats-2/tests/c3/c393009.a: New file. + * ada/acats-2/tests/c3/c393010.a: New file. + * ada/acats-2/tests/c3/c393011.a: New file. + * ada/acats-2/tests/c3/c393012.a: New file. + * ada/acats-2/tests/c3/c393a02.a: New file. + * ada/acats-2/tests/c3/c393a03.a: New file. + * ada/acats-2/tests/c3/c393a05.a: New file. + * ada/acats-2/tests/c3/c393a06.a: New file. + * ada/acats-2/tests/c3/c393b12.a: New file. + * ada/acats-2/tests/c3/c393b13.a: New file. + * ada/acats-2/tests/c3/c393b14.a: New file. + * ada/acats-2/tests/c3/c3a0001.a: New file. + * ada/acats-2/tests/c3/c3a0002.a: New file. + * ada/acats-2/tests/c3/c3a0003.a: New file. + * ada/acats-2/tests/c3/c3a0004.a: New file. + * ada/acats-2/tests/c3/c3a0005.a: New file. + * ada/acats-2/tests/c3/c3a0006.a: New file. + * ada/acats-2/tests/c3/c3a0007.a: New file. + * ada/acats-2/tests/c3/c3a0008.a: New file. + * ada/acats-2/tests/c3/c3a0009.a: New file. + * ada/acats-2/tests/c3/c3a0010.a: New file. + * ada/acats-2/tests/c3/c3a0011.a: New file. + * ada/acats-2/tests/c3/c3a00120.a: New file. + * ada/acats-2/tests/c3/c3a00121.a: New file. + * ada/acats-2/tests/c3/c3a00122.am: New file. + * ada/acats-2/tests/c3/c3a0013.a: New file. + * ada/acats-2/tests/c3/c3a0014.a: New file. + * ada/acats-2/tests/c3/c3a0015.a: New file. + * ada/acats-2/tests/c3/c3a1001.a: New file. + * ada/acats-2/tests/c3/c3a1002.a: New file. + * ada/acats-2/tests/c3/c3a2001.a: New file. + * ada/acats-2/tests/c3/c3a2002.a: New file. + * ada/acats-2/tests/c3/c3a2003.a: New file. + * ada/acats-2/tests/c3/c3a2a01.a: New file. + * ada/acats-2/tests/c3/c3a2a02.a: New file. + * ada/acats-2/tests/c4/c410001.a: New file. + * ada/acats-2/tests/c4/c41101d.ada: New file. + * ada/acats-2/tests/c4/c41103a.ada: New file. + * ada/acats-2/tests/c4/c41103b.ada: New file. + * ada/acats-2/tests/c4/c41104a.ada: New file. + * ada/acats-2/tests/c4/c41105a.ada: New file. + * ada/acats-2/tests/c4/c41107a.ada: New file. + * ada/acats-2/tests/c4/c41201d.ada: New file. + * ada/acats-2/tests/c4/c41203a.ada: New file. + * ada/acats-2/tests/c4/c41203b.ada: New file. + * ada/acats-2/tests/c4/c41204a.ada: New file. + * ada/acats-2/tests/c4/c41205a.ada: New file. + * ada/acats-2/tests/c4/c41206a.ada: New file. + * ada/acats-2/tests/c4/c41207a.ada: New file. + * ada/acats-2/tests/c4/c41301a.ada: New file. + * ada/acats-2/tests/c4/c41303a.ada: New file. + * ada/acats-2/tests/c4/c41303b.ada: New file. + * ada/acats-2/tests/c4/c41303c.ada: New file. + * ada/acats-2/tests/c4/c41303e.ada: New file. + * ada/acats-2/tests/c4/c41303f.ada: New file. + * ada/acats-2/tests/c4/c41303g.ada: New file. + * ada/acats-2/tests/c4/c41303i.ada: New file. + * ada/acats-2/tests/c4/c41303j.ada: New file. + * ada/acats-2/tests/c4/c41303k.ada: New file. + * ada/acats-2/tests/c4/c41303m.ada: New file. + * ada/acats-2/tests/c4/c41303n.ada: New file. + * ada/acats-2/tests/c4/c41303o.ada: New file. + * ada/acats-2/tests/c4/c41303q.ada: New file. + * ada/acats-2/tests/c4/c41303r.ada: New file. + * ada/acats-2/tests/c4/c41303s.ada: New file. + * ada/acats-2/tests/c4/c41303u.ada: New file. + * ada/acats-2/tests/c4/c41303v.ada: New file. + * ada/acats-2/tests/c4/c41303w.ada: New file. + * ada/acats-2/tests/c4/c41304a.ada: New file. + * ada/acats-2/tests/c4/c41304b.ada: New file. + * ada/acats-2/tests/c4/c41306a.ada: New file. + * ada/acats-2/tests/c4/c41306b.ada: New file. + * ada/acats-2/tests/c4/c41306c.ada: New file. + * ada/acats-2/tests/c4/c41307d.ada: New file. + * ada/acats-2/tests/c4/c41309a.ada: New file. + * ada/acats-2/tests/c4/c41320a.ada: New file. + * ada/acats-2/tests/c4/c41321a.ada: New file. + * ada/acats-2/tests/c4/c41322a.ada: New file. + * ada/acats-2/tests/c4/c41323a.ada: New file. + * ada/acats-2/tests/c4/c41324a.ada: New file. + * ada/acats-2/tests/c4/c41325a.ada: New file. + * ada/acats-2/tests/c4/c41326a.ada: New file. + * ada/acats-2/tests/c4/c41327a.ada: New file. + * ada/acats-2/tests/c4/c41328a.ada: New file. + * ada/acats-2/tests/c4/c41401a.ada: New file. + * ada/acats-2/tests/c4/c41402a.ada: New file. + * ada/acats-2/tests/c4/c41404a.ada: New file. + * ada/acats-2/tests/c4/c420001.a: New file. + * ada/acats-2/tests/c4/c42006a.ada: New file. + * ada/acats-2/tests/c4/c42007e.ada: New file. + * ada/acats-2/tests/c4/c43003a.ada: New file. + * ada/acats-2/tests/c4/c43004a.ada: New file. + * ada/acats-2/tests/c4/c43004c.ada: New file. + * ada/acats-2/tests/c4/c431001.a: New file. + * ada/acats-2/tests/c4/c43103a.ada: New file. + * ada/acats-2/tests/c4/c43103b.ada: New file. + * ada/acats-2/tests/c4/c43104a.ada: New file. + * ada/acats-2/tests/c4/c43105a.ada: New file. + * ada/acats-2/tests/c4/c43105b.ada: New file. + * ada/acats-2/tests/c4/c43106a.ada: New file. + * ada/acats-2/tests/c4/c43107a.ada: New file. + * ada/acats-2/tests/c4/c43108a.ada: New file. + * ada/acats-2/tests/c4/c432001.a: New file. + * ada/acats-2/tests/c4/c432002.a: New file. + * ada/acats-2/tests/c4/c432003.a: New file. + * ada/acats-2/tests/c4/c432004.a: New file. + * ada/acats-2/tests/c4/c43204a.ada: New file. + * ada/acats-2/tests/c4/c43204c.ada: New file. + * ada/acats-2/tests/c4/c43204e.ada: New file. + * ada/acats-2/tests/c4/c43204f.ada: New file. + * ada/acats-2/tests/c4/c43204g.ada: New file. + * ada/acats-2/tests/c4/c43204h.ada: New file. + * ada/acats-2/tests/c4/c43204i.ada: New file. + * ada/acats-2/tests/c4/c43205a.ada: New file. + * ada/acats-2/tests/c4/c43205b.ada: New file. + * ada/acats-2/tests/c4/c43205c.ada: New file. + * ada/acats-2/tests/c4/c43205d.ada: New file. + * ada/acats-2/tests/c4/c43205e.ada: New file. + * ada/acats-2/tests/c4/c43205g.ada: New file. + * ada/acats-2/tests/c4/c43205h.ada: New file. + * ada/acats-2/tests/c4/c43205i.ada: New file. + * ada/acats-2/tests/c4/c43205j.ada: New file. + * ada/acats-2/tests/c4/c43205k.ada: New file. + * ada/acats-2/tests/c4/c43206a.ada: New file. + * ada/acats-2/tests/c4/c43207b.ada: New file. + * ada/acats-2/tests/c4/c43207d.ada: New file. + * ada/acats-2/tests/c4/c43208a.ada: New file. + * ada/acats-2/tests/c4/c43208b.ada: New file. + * ada/acats-2/tests/c4/c43209a.ada: New file. + * ada/acats-2/tests/c4/c43210a.ada: New file. + * ada/acats-2/tests/c4/c43211a.ada: New file. + * ada/acats-2/tests/c4/c43212a.ada: New file. + * ada/acats-2/tests/c4/c43212c.ada: New file. + * ada/acats-2/tests/c4/c43214a.ada: New file. + * ada/acats-2/tests/c4/c43214b.ada: New file. + * ada/acats-2/tests/c4/c43214c.ada: New file. + * ada/acats-2/tests/c4/c43214d.ada: New file. + * ada/acats-2/tests/c4/c43214e.ada: New file. + * ada/acats-2/tests/c4/c43214f.ada: New file. + * ada/acats-2/tests/c4/c43215a.ada: New file. + * ada/acats-2/tests/c4/c43215b.ada: New file. + * ada/acats-2/tests/c4/c43222a.ada: New file. + * ada/acats-2/tests/c4/c43224a.ada: New file. + * ada/acats-2/tests/c4/c433001.a: New file. + * ada/acats-2/tests/c4/c44003d.ada: New file. + * ada/acats-2/tests/c4/c44003f.ada: New file. + * ada/acats-2/tests/c4/c44003g.ada: New file. + * ada/acats-2/tests/c4/c450001.a: New file. + * ada/acats-2/tests/c4/c45112a.ada: New file. + * ada/acats-2/tests/c4/c45112b.ada: New file. + * ada/acats-2/tests/c4/c45113a.ada: New file. + * ada/acats-2/tests/c4/c45114b.ada: New file. + * ada/acats-2/tests/c4/c452001.a: New file. + * ada/acats-2/tests/c4/c45201a.ada: New file. + * ada/acats-2/tests/c4/c45201b.ada: New file. + * ada/acats-2/tests/c4/c45202b.ada: New file. + * ada/acats-2/tests/c4/c45210a.ada: New file. + * ada/acats-2/tests/c4/c45211a.ada: New file. + * ada/acats-2/tests/c4/c45220a.ada: New file. + * ada/acats-2/tests/c4/c45220b.ada: New file. + * ada/acats-2/tests/c4/c45220c.ada: New file. + * ada/acats-2/tests/c4/c45220d.ada: New file. + * ada/acats-2/tests/c4/c45220e.ada: New file. + * ada/acats-2/tests/c4/c45220f.ada: New file. + * ada/acats-2/tests/c4/c45231a.ada: New file. + * ada/acats-2/tests/c4/c45231b.dep: New file. + * ada/acats-2/tests/c4/c45231c.dep: New file. + * ada/acats-2/tests/c4/c45231d.tst: New file. + * ada/acats-2/tests/c4/c45232b.ada: New file. + * ada/acats-2/tests/c4/c45242b.ada: New file. + * ada/acats-2/tests/c4/c45251a.ada: New file. + * ada/acats-2/tests/c4/c45252a.ada: New file. + * ada/acats-2/tests/c4/c45252b.ada: New file. + * ada/acats-2/tests/c4/c45253a.ada: New file. + * ada/acats-2/tests/c4/c45262a.ada: New file. + * ada/acats-2/tests/c4/c45262b.ada: New file. + * ada/acats-2/tests/c4/c45262c.ada: New file. + * ada/acats-2/tests/c4/c45262d.ada: New file. + * ada/acats-2/tests/c4/c45264a.ada: New file. + * ada/acats-2/tests/c4/c45264b.ada: New file. + * ada/acats-2/tests/c4/c45264c.ada: New file. + * ada/acats-2/tests/c4/c45265a.ada: New file. + * ada/acats-2/tests/c4/c45271a.ada: New file. + * ada/acats-2/tests/c4/c45272a.ada: New file. + * ada/acats-2/tests/c4/c45273a.ada: New file. + * ada/acats-2/tests/c4/c45274a.ada: New file. + * ada/acats-2/tests/c4/c45274b.ada: New file. + * ada/acats-2/tests/c4/c45274c.ada: New file. + * ada/acats-2/tests/c4/c45281a.ada: New file. + * ada/acats-2/tests/c4/c45282a.ada: New file. + * ada/acats-2/tests/c4/c45282b.ada: New file. + * ada/acats-2/tests/c4/c45291a.ada: New file. + * ada/acats-2/tests/c4/c453001.a: New file. + * ada/acats-2/tests/c4/c45303a.ada: New file. + * ada/acats-2/tests/c4/c45304a.ada: New file. + * ada/acats-2/tests/c4/c45304b.dep: New file. + * ada/acats-2/tests/c4/c45304c.dep: New file. + * ada/acats-2/tests/c4/c45322a.ada: New file. + * ada/acats-2/tests/c4/c45323a.ada: New file. + * ada/acats-2/tests/c4/c45331a.ada: New file. + * ada/acats-2/tests/c4/c45342a.ada: New file. + * ada/acats-2/tests/c4/c45343a.ada: New file. + * ada/acats-2/tests/c4/c45344a.ada: New file. + * ada/acats-2/tests/c4/c45345b.ada: New file. + * ada/acats-2/tests/c4/c45347a.ada: New file. + * ada/acats-2/tests/c4/c45347b.ada: New file. + * ada/acats-2/tests/c4/c45347c.ada: New file. + * ada/acats-2/tests/c4/c45347d.ada: New file. + * ada/acats-2/tests/c4/c45411a.ada: New file. + * ada/acats-2/tests/c4/c45411b.dep: New file. + * ada/acats-2/tests/c4/c45411c.dep: New file. + * ada/acats-2/tests/c4/c45411d.ada: New file. + * ada/acats-2/tests/c4/c45413a.ada: New file. + * ada/acats-2/tests/c4/c45431a.ada: New file. + * ada/acats-2/tests/c4/c455001.a: New file. + * ada/acats-2/tests/c4/c45502b.dep: New file. + * ada/acats-2/tests/c4/c45502c.dep: New file. + * ada/acats-2/tests/c4/c45503a.ada: New file. + * ada/acats-2/tests/c4/c45503b.dep: New file. + * ada/acats-2/tests/c4/c45503c.dep: New file. + * ada/acats-2/tests/c4/c45504a.ada: New file. + * ada/acats-2/tests/c4/c45504b.dep: New file. + * ada/acats-2/tests/c4/c45504c.dep: New file. + * ada/acats-2/tests/c4/c45504d.ada: New file. + * ada/acats-2/tests/c4/c45504e.dep: New file. + * ada/acats-2/tests/c4/c45504f.dep: New file. + * ada/acats-2/tests/c4/c45505a.ada: New file. + * ada/acats-2/tests/c4/c45523a.ada: New file. + * ada/acats-2/tests/c4/c45531a.ada: New file. + * ada/acats-2/tests/c4/c45531b.ada: New file. + * ada/acats-2/tests/c4/c45531c.ada: New file. + * ada/acats-2/tests/c4/c45531d.ada: New file. + * ada/acats-2/tests/c4/c45531e.ada: New file. + * ada/acats-2/tests/c4/c45531f.ada: New file. + * ada/acats-2/tests/c4/c45531g.ada: New file. + * ada/acats-2/tests/c4/c45531h.ada: New file. + * ada/acats-2/tests/c4/c45531i.ada: New file. + * ada/acats-2/tests/c4/c45531j.ada: New file. + * ada/acats-2/tests/c4/c45531k.ada: New file. + * ada/acats-2/tests/c4/c45531l.ada: New file. + * ada/acats-2/tests/c4/c45531m.dep: New file. + * ada/acats-2/tests/c4/c45531n.dep: New file. + * ada/acats-2/tests/c4/c45531o.dep: New file. + * ada/acats-2/tests/c4/c45531p.dep: New file. + * ada/acats-2/tests/c4/c45532a.ada: New file. + * ada/acats-2/tests/c4/c45532b.ada: New file. + * ada/acats-2/tests/c4/c45532c.ada: New file. + * ada/acats-2/tests/c4/c45532d.ada: New file. + * ada/acats-2/tests/c4/c45532e.ada: New file. + * ada/acats-2/tests/c4/c45532f.ada: New file. + * ada/acats-2/tests/c4/c45532g.ada: New file. + * ada/acats-2/tests/c4/c45532h.ada: New file. + * ada/acats-2/tests/c4/c45532i.ada: New file. + * ada/acats-2/tests/c4/c45532j.ada: New file. + * ada/acats-2/tests/c4/c45532k.ada: New file. + * ada/acats-2/tests/c4/c45532l.ada: New file. + * ada/acats-2/tests/c4/c45532m.dep: New file. + * ada/acats-2/tests/c4/c45532n.dep: New file. + * ada/acats-2/tests/c4/c45532o.dep: New file. + * ada/acats-2/tests/c4/c45532p.dep: New file. + * ada/acats-2/tests/c4/c45534b.ada: New file. + * ada/acats-2/tests/c4/c45536a.dep: New file. + * ada/acats-2/tests/c4/c456001.a: New file. + * ada/acats-2/tests/c4/c45611a.ada: New file. + * ada/acats-2/tests/c4/c45611b.dep: New file. + * ada/acats-2/tests/c4/c45611c.dep: New file. + * ada/acats-2/tests/c4/c45613a.ada: New file. + * ada/acats-2/tests/c4/c45613b.dep: New file. + * ada/acats-2/tests/c4/c45613c.dep: New file. + * ada/acats-2/tests/c4/c45614a.ada: New file. + * ada/acats-2/tests/c4/c45614b.dep: New file. + * ada/acats-2/tests/c4/c45614c.dep: New file. + * ada/acats-2/tests/c4/c45631a.ada: New file. + * ada/acats-2/tests/c4/c45631b.dep: New file. + * ada/acats-2/tests/c4/c45631c.dep: New file. + * ada/acats-2/tests/c4/c45632a.ada: New file. + * ada/acats-2/tests/c4/c45632b.dep: New file. + * ada/acats-2/tests/c4/c45632c.dep: New file. + * ada/acats-2/tests/c4/c45651a.ada: New file. + * ada/acats-2/tests/c4/c45662a.ada: New file. + * ada/acats-2/tests/c4/c45662b.ada: New file. + * ada/acats-2/tests/c4/c45672a.ada: New file. + * ada/acats-2/tests/c4/c460001.a: New file. + * ada/acats-2/tests/c4/c460002.a: New file. + * ada/acats-2/tests/c4/c460004.a: New file. + * ada/acats-2/tests/c4/c460005.a: New file. + * ada/acats-2/tests/c4/c460006.a: New file. + * ada/acats-2/tests/c4/c460007.a: New file. + * ada/acats-2/tests/c4/c460008.a: New file. + * ada/acats-2/tests/c4/c460009.a: New file. + * ada/acats-2/tests/c4/c460010.a: New file. + * ada/acats-2/tests/c4/c460011.a: New file. + * ada/acats-2/tests/c4/c460012.a: New file. + * ada/acats-2/tests/c4/c460013.a: New file. + * ada/acats-2/tests/c4/c460014.a: New file. + * ada/acats-2/tests/c4/c46011a.ada: New file. + * ada/acats-2/tests/c4/c46013a.ada: New file. + * ada/acats-2/tests/c4/c46014a.ada: New file. + * ada/acats-2/tests/c4/c46021a.ada: New file. + * ada/acats-2/tests/c4/c46024a.ada: New file. + * ada/acats-2/tests/c4/c46031a.ada: New file. + * ada/acats-2/tests/c4/c46032a.ada: New file. + * ada/acats-2/tests/c4/c46033a.ada: New file. + * ada/acats-2/tests/c4/c46041a.ada: New file. + * ada/acats-2/tests/c4/c46042a.ada: New file. + * ada/acats-2/tests/c4/c46043b.ada: New file. + * ada/acats-2/tests/c4/c46044b.ada: New file. + * ada/acats-2/tests/c4/c46051a.ada: New file. + * ada/acats-2/tests/c4/c46051b.ada: New file. + * ada/acats-2/tests/c4/c46051c.ada: New file. + * ada/acats-2/tests/c4/c46052a.ada: New file. + * ada/acats-2/tests/c4/c46053a.ada: New file. + * ada/acats-2/tests/c4/c46054a.ada: New file. + * ada/acats-2/tests/c4/c460a01.a: New file. + * ada/acats-2/tests/c4/c460a02.a: New file. + * ada/acats-2/tests/c4/c47002a.ada: New file. + * ada/acats-2/tests/c4/c47002b.ada: New file. + * ada/acats-2/tests/c4/c47002c.ada: New file. + * ada/acats-2/tests/c4/c47002d.ada: New file. + * ada/acats-2/tests/c4/c47003a.ada: New file. + * ada/acats-2/tests/c4/c47004a.ada: New file. + * ada/acats-2/tests/c4/c47005a.ada: New file. + * ada/acats-2/tests/c4/c47006a.ada: New file. + * ada/acats-2/tests/c4/c47007a.ada: New file. + * ada/acats-2/tests/c4/c47008a.ada: New file. + * ada/acats-2/tests/c4/c47009a.ada: New file. + * ada/acats-2/tests/c4/c47009b.ada: New file. + * ada/acats-2/tests/c4/c48004a.ada: New file. + * ada/acats-2/tests/c4/c48004b.ada: New file. + * ada/acats-2/tests/c4/c48004c.ada: New file. + * ada/acats-2/tests/c4/c48004d.ada: New file. + * ada/acats-2/tests/c4/c48004e.ada: New file. + * ada/acats-2/tests/c4/c48004f.ada: New file. + * ada/acats-2/tests/c4/c48005a.ada: New file. + * ada/acats-2/tests/c4/c48005b.ada: New file. + * ada/acats-2/tests/c4/c48006a.ada: New file. + * ada/acats-2/tests/c4/c48006b.ada: New file. + * ada/acats-2/tests/c4/c48007a.ada: New file. + * ada/acats-2/tests/c4/c48007b.ada: New file. + * ada/acats-2/tests/c4/c48007c.ada: New file. + * ada/acats-2/tests/c4/c48008a.ada: New file. + * ada/acats-2/tests/c4/c48008c.ada: New file. + * ada/acats-2/tests/c4/c48009a.ada: New file. + * ada/acats-2/tests/c4/c48009b.ada: New file. + * ada/acats-2/tests/c4/c48009c.ada: New file. + * ada/acats-2/tests/c4/c48009d.ada: New file. + * ada/acats-2/tests/c4/c48009e.ada: New file. + * ada/acats-2/tests/c4/c48009f.ada: New file. + * ada/acats-2/tests/c4/c48009g.ada: New file. + * ada/acats-2/tests/c4/c48009h.ada: New file. + * ada/acats-2/tests/c4/c48009i.ada: New file. + * ada/acats-2/tests/c4/c48009j.ada: New file. + * ada/acats-2/tests/c4/c48010a.ada: New file. + * ada/acats-2/tests/c4/c48011a.ada: New file. + * ada/acats-2/tests/c4/c48012a.ada: New file. + * ada/acats-2/tests/c4/c490001.a: New file. + * ada/acats-2/tests/c4/c490002.a: New file. + * ada/acats-2/tests/c4/c490003.a: New file. + * ada/acats-2/tests/c4/c49020a.ada: New file. + * ada/acats-2/tests/c4/c49021a.ada: New file. + * ada/acats-2/tests/c4/c49022a.ada: New file. + * ada/acats-2/tests/c4/c49022b.ada: New file. + * ada/acats-2/tests/c4/c49022c.ada: New file. + * ada/acats-2/tests/c4/c49023a.ada: New file. + * ada/acats-2/tests/c4/c49024a.ada: New file. + * ada/acats-2/tests/c4/c49025a.ada: New file. + * ada/acats-2/tests/c4/c49026a.ada: New file. + * ada/acats-2/tests/c4/c4a005b.ada: New file. + * ada/acats-2/tests/c4/c4a006a.ada: New file. + * ada/acats-2/tests/c4/c4a007a.tst: New file. + * ada/acats-2/tests/c4/c4a010a.ada: New file. + * ada/acats-2/tests/c4/c4a010b.ada: New file. + * ada/acats-2/tests/c4/c4a011a.ada: New file. + * ada/acats-2/tests/c4/c4a012b.ada: New file. + * ada/acats-2/tests/c4/c4a013a.ada: New file. + * ada/acats-2/tests/c4/c4a014a.ada: New file. + * ada/acats-2/tests/c5/c51004a.ada: New file. + * ada/acats-2/tests/c5/c52005a.ada: New file. + * ada/acats-2/tests/c5/c52005b.ada: New file. + * ada/acats-2/tests/c5/c52005c.ada: New file. + * ada/acats-2/tests/c5/c52005d.ada: New file. + * ada/acats-2/tests/c5/c52005e.ada: New file. + * ada/acats-2/tests/c5/c52005f.ada: New file. + * ada/acats-2/tests/c5/c52008a.ada: New file. + * ada/acats-2/tests/c5/c52008b.ada: New file. + * ada/acats-2/tests/c5/c52009a.ada: New file. + * ada/acats-2/tests/c5/c52009b.ada: New file. + * ada/acats-2/tests/c5/c52010a.ada: New file. + * ada/acats-2/tests/c5/c52011a.ada: New file. + * ada/acats-2/tests/c5/c52011b.ada: New file. + * ada/acats-2/tests/c5/c52101a.ada: New file. + * ada/acats-2/tests/c5/c52102a.ada: New file. + * ada/acats-2/tests/c5/c52102b.ada: New file. + * ada/acats-2/tests/c5/c52102c.ada: New file. + * ada/acats-2/tests/c5/c52102d.ada: New file. + * ada/acats-2/tests/c5/c52103a.ada: New file. + * ada/acats-2/tests/c5/c52103b.ada: New file. + * ada/acats-2/tests/c5/c52103c.ada: New file. + * ada/acats-2/tests/c5/c52103f.ada: New file. + * ada/acats-2/tests/c5/c52103g.ada: New file. + * ada/acats-2/tests/c5/c52103h.ada: New file. + * ada/acats-2/tests/c5/c52103k.ada: New file. + * ada/acats-2/tests/c5/c52103l.ada: New file. + * ada/acats-2/tests/c5/c52103m.ada: New file. + * ada/acats-2/tests/c5/c52103p.ada: New file. + * ada/acats-2/tests/c5/c52103q.ada: New file. + * ada/acats-2/tests/c5/c52103r.ada: New file. + * ada/acats-2/tests/c5/c52103x.ada: New file. + * ada/acats-2/tests/c5/c52104a.ada: New file. + * ada/acats-2/tests/c5/c52104b.ada: New file. + * ada/acats-2/tests/c5/c52104c.ada: New file. + * ada/acats-2/tests/c5/c52104f.ada: New file. + * ada/acats-2/tests/c5/c52104g.ada: New file. + * ada/acats-2/tests/c5/c52104h.ada: New file. + * ada/acats-2/tests/c5/c52104k.ada: New file. + * ada/acats-2/tests/c5/c52104l.ada: New file. + * ada/acats-2/tests/c5/c52104m.ada: New file. + * ada/acats-2/tests/c5/c52104p.ada: New file. + * ada/acats-2/tests/c5/c52104q.ada: New file. + * ada/acats-2/tests/c5/c52104r.ada: New file. + * ada/acats-2/tests/c5/c52104x.ada: New file. + * ada/acats-2/tests/c5/c52104y.ada: New file. + * ada/acats-2/tests/c5/c53007a.ada: New file. + * ada/acats-2/tests/c5/c540001.a: New file. + * ada/acats-2/tests/c5/c54a03a.ada: New file. + * ada/acats-2/tests/c5/c54a04a.ada: New file. + * ada/acats-2/tests/c5/c54a07a.ada: New file. + * ada/acats-2/tests/c5/c54a13a.ada: New file. + * ada/acats-2/tests/c5/c54a13b.ada: New file. + * ada/acats-2/tests/c5/c54a13c.ada: New file. + * ada/acats-2/tests/c5/c54a13d.ada: New file. + * ada/acats-2/tests/c5/c54a22a.ada: New file. + * ada/acats-2/tests/c5/c54a23a.ada: New file. + * ada/acats-2/tests/c5/c54a24a.ada: New file. + * ada/acats-2/tests/c5/c54a24b.ada: New file. + * ada/acats-2/tests/c5/c54a42a.ada: New file. + * ada/acats-2/tests/c5/c54a42b.ada: New file. + * ada/acats-2/tests/c5/c54a42c.ada: New file. + * ada/acats-2/tests/c5/c54a42d.ada: New file. + * ada/acats-2/tests/c5/c54a42e.ada: New file. + * ada/acats-2/tests/c5/c54a42f.ada: New file. + * ada/acats-2/tests/c5/c54a42g.ada: New file. + * ada/acats-2/tests/c5/c55b03a.ada: New file. + * ada/acats-2/tests/c5/c55b04a.ada: New file. + * ada/acats-2/tests/c5/c55b05a.ada: New file. + * ada/acats-2/tests/c5/c55b06a.ada: New file. + * ada/acats-2/tests/c5/c55b06b.ada: New file. + * ada/acats-2/tests/c5/c55b07a.dep: New file. + * ada/acats-2/tests/c5/c55b07b.dep: New file. + * ada/acats-2/tests/c5/c55b10a.ada: New file. + * ada/acats-2/tests/c5/c55b11a.ada: New file. + * ada/acats-2/tests/c5/c55b11b.ada: New file. + * ada/acats-2/tests/c5/c55b15a.ada: New file. + * ada/acats-2/tests/c5/c55b16a.ada: New file. + * ada/acats-2/tests/c5/c55c02a.ada: New file. + * ada/acats-2/tests/c5/c55c02b.ada: New file. + * ada/acats-2/tests/c5/c56002a.ada: New file. + * ada/acats-2/tests/c5/c57003a.ada: New file. + * ada/acats-2/tests/c5/c57004a.ada: New file. + * ada/acats-2/tests/c5/c57004b.ada: New file. + * ada/acats-2/tests/c5/c58004c.ada: New file. + * ada/acats-2/tests/c5/c58004d.ada: New file. + * ada/acats-2/tests/c5/c58004g.ada: New file. + * ada/acats-2/tests/c5/c58005a.ada: New file. + * ada/acats-2/tests/c5/c58005b.ada: New file. + * ada/acats-2/tests/c5/c58005h.ada: New file. + * ada/acats-2/tests/c5/c58006a.ada: New file. + * ada/acats-2/tests/c5/c58006b.ada: New file. + * ada/acats-2/tests/c5/c59002a.ada: New file. + * ada/acats-2/tests/c5/c59002b.ada: New file. + * ada/acats-2/tests/c5/c59002c.ada: New file. + * ada/acats-2/tests/c6/c61008a.ada: New file. + * ada/acats-2/tests/c6/c61009a.ada: New file. + * ada/acats-2/tests/c6/c61010a.ada: New file. + * ada/acats-2/tests/c6/c620001.a: New file. + * ada/acats-2/tests/c6/c620002.a: New file. + * ada/acats-2/tests/c6/c62002a.ada: New file. + * ada/acats-2/tests/c6/c62003a.ada: New file. + * ada/acats-2/tests/c6/c62003b.ada: New file. + * ada/acats-2/tests/c6/c62004a.ada: New file. + * ada/acats-2/tests/c6/c62006a.ada: New file. + * ada/acats-2/tests/c6/c631001.a: New file. + * ada/acats-2/tests/c6/c640001.a: New file. + * ada/acats-2/tests/c6/c64002b.ada: New file. + * ada/acats-2/tests/c6/c64004g.ada: New file. + * ada/acats-2/tests/c6/c64005a.ada: New file. + * ada/acats-2/tests/c6/c64005b.ada: New file. + * ada/acats-2/tests/c6/c64005c.ada: New file. + * ada/acats-2/tests/c6/c64005d0.ada: New file. + * ada/acats-2/tests/c6/c64005da.ada: New file. + * ada/acats-2/tests/c6/c64005db.ada: New file. + * ada/acats-2/tests/c6/c64005dc.ada: New file. + * ada/acats-2/tests/c6/c641001.a: New file. + * ada/acats-2/tests/c6/c64103b.ada: New file. + * ada/acats-2/tests/c6/c64103c.ada: New file. + * ada/acats-2/tests/c6/c64103d.ada: New file. + * ada/acats-2/tests/c6/c64103e.ada: New file. + * ada/acats-2/tests/c6/c64103f.ada: New file. + * ada/acats-2/tests/c6/c64104a.ada: New file. + * ada/acats-2/tests/c6/c64104b.ada: New file. + * ada/acats-2/tests/c6/c64104c.ada: New file. + * ada/acats-2/tests/c6/c64104d.ada: New file. + * ada/acats-2/tests/c6/c64104e.ada: New file. + * ada/acats-2/tests/c6/c64104f.ada: New file. + * ada/acats-2/tests/c6/c64104g.ada: New file. + * ada/acats-2/tests/c6/c64104h.ada: New file. + * ada/acats-2/tests/c6/c64104i.ada: New file. + * ada/acats-2/tests/c6/c64104j.ada: New file. + * ada/acats-2/tests/c6/c64104k.ada: New file. + * ada/acats-2/tests/c6/c64104l.ada: New file. + * ada/acats-2/tests/c6/c64104m.ada: New file. + * ada/acats-2/tests/c6/c64104n.ada: New file. + * ada/acats-2/tests/c6/c64104o.ada: New file. + * ada/acats-2/tests/c6/c64105a.ada: New file. + * ada/acats-2/tests/c6/c64105b.ada: New file. + * ada/acats-2/tests/c6/c64105c.ada: New file. + * ada/acats-2/tests/c6/c64105d.ada: New file. + * ada/acats-2/tests/c6/c64106a.ada: New file. + * ada/acats-2/tests/c6/c64106b.ada: New file. + * ada/acats-2/tests/c6/c64106c.ada: New file. + * ada/acats-2/tests/c6/c64106d.ada: New file. + * ada/acats-2/tests/c6/c64107a.ada: New file. + * ada/acats-2/tests/c6/c64108a.ada: New file. + * ada/acats-2/tests/c6/c64109a.ada: New file. + * ada/acats-2/tests/c6/c64109b.ada: New file. + * ada/acats-2/tests/c6/c64109c.ada: New file. + * ada/acats-2/tests/c6/c64109d.ada: New file. + * ada/acats-2/tests/c6/c64109e.ada: New file. + * ada/acats-2/tests/c6/c64109f.ada: New file. + * ada/acats-2/tests/c6/c64109g.ada: New file. + * ada/acats-2/tests/c6/c64109h.ada: New file. + * ada/acats-2/tests/c6/c64109i.ada: New file. + * ada/acats-2/tests/c6/c64109j.ada: New file. + * ada/acats-2/tests/c6/c64109k.ada: New file. + * ada/acats-2/tests/c6/c64109l.ada: New file. + * ada/acats-2/tests/c6/c64201b.ada: New file. + * ada/acats-2/tests/c6/c64201c.ada: New file. + * ada/acats-2/tests/c6/c64202a.ada: New file. + * ada/acats-2/tests/c6/c650001.a: New file. + * ada/acats-2/tests/c6/c65003a.ada: New file. + * ada/acats-2/tests/c6/c65003b.ada: New file. + * ada/acats-2/tests/c6/c66002a.ada: New file. + * ada/acats-2/tests/c6/c66002c.ada: New file. + * ada/acats-2/tests/c6/c66002d.ada: New file. + * ada/acats-2/tests/c6/c66002e.ada: New file. + * ada/acats-2/tests/c6/c66002f.ada: New file. + * ada/acats-2/tests/c6/c66002g.ada: New file. + * ada/acats-2/tests/c6/c67002a.ada: New file. + * ada/acats-2/tests/c6/c67002b.ada: New file. + * ada/acats-2/tests/c6/c67002c.ada: New file. + * ada/acats-2/tests/c6/c67002d.ada: New file. + * ada/acats-2/tests/c6/c67002e.ada: New file. + * ada/acats-2/tests/c6/c67003f.ada: New file. + * ada/acats-2/tests/c6/c67005a.ada: New file. + * ada/acats-2/tests/c6/c67005b.ada: New file. + * ada/acats-2/tests/c6/c67005c.ada: New file. + * ada/acats-2/tests/c6/c67005d.ada: New file. + * ada/acats-2/tests/c7/c72001b.ada: New file. + * ada/acats-2/tests/c7/c72002a.ada: New file. + * ada/acats-2/tests/c7/c730001.a: New file. + * ada/acats-2/tests/c7/c730002.a: New file. + * ada/acats-2/tests/c7/c730003.a: New file. + * ada/acats-2/tests/c7/c730004.a: New file. + * ada/acats-2/tests/c7/c73002a.ada: New file. + * ada/acats-2/tests/c7/c730a01.a: New file. + * ada/acats-2/tests/c7/c730a02.a: New file. + * ada/acats-2/tests/c7/c731001.a: New file. + * ada/acats-2/tests/c7/c74004a.ada: New file. + * ada/acats-2/tests/c7/c74203a.ada: New file. + * ada/acats-2/tests/c7/c74206a.ada: New file. + * ada/acats-2/tests/c7/c74207b.ada: New file. + * ada/acats-2/tests/c7/c74208a.ada: New file. + * ada/acats-2/tests/c7/c74208b.ada: New file. + * ada/acats-2/tests/c7/c74209a.ada: New file. + * ada/acats-2/tests/c7/c74210a.ada: New file. + * ada/acats-2/tests/c7/c74211a.ada: New file. + * ada/acats-2/tests/c7/c74211b.ada: New file. + * ada/acats-2/tests/c7/c74302a.ada: New file. + * ada/acats-2/tests/c7/c74302b.ada: New file. + * ada/acats-2/tests/c7/c74305a.ada: New file. + * ada/acats-2/tests/c7/c74305b.ada: New file. + * ada/acats-2/tests/c7/c74306a.ada: New file. + * ada/acats-2/tests/c7/c74307a.ada: New file. + * ada/acats-2/tests/c7/c74401d.ada: New file. + * ada/acats-2/tests/c7/c74401e.ada: New file. + * ada/acats-2/tests/c7/c74401k.ada: New file. + * ada/acats-2/tests/c7/c74401q.ada: New file. + * ada/acats-2/tests/c7/c74402a.ada: New file. + * ada/acats-2/tests/c7/c74402b.ada: New file. + * ada/acats-2/tests/c7/c74406a.ada: New file. + * ada/acats-2/tests/c7/c74407b.ada: New file. + * ada/acats-2/tests/c7/c74409b.ada: New file. + * ada/acats-2/tests/c7/c760001.a: New file. + * ada/acats-2/tests/c7/c760002.a: New file. + * ada/acats-2/tests/c7/c760007.a: New file. + * ada/acats-2/tests/c7/c760009.a: New file. + * ada/acats-2/tests/c7/c760010.a: New file. + * ada/acats-2/tests/c7/c760011.a: New file. + * ada/acats-2/tests/c7/c760012.a: New file. + * ada/acats-2/tests/c7/c760013.a: New file. + * ada/acats-2/tests/c7/c761001.a: New file. + * ada/acats-2/tests/c7/c761002.a: New file. + * ada/acats-2/tests/c7/c761003.a: New file. + * ada/acats-2/tests/c7/c761004.a: New file. + * ada/acats-2/tests/c7/c761005.a: New file. + * ada/acats-2/tests/c7/c761006.a: New file. + * ada/acats-2/tests/c7/c761007.a: New file. + * ada/acats-2/tests/c7/c761010.a: New file. + * ada/acats-2/tests/c7/c761011.a: New file. + * ada/acats-2/tests/c7/c761012.a: New file. + * ada/acats-2/tests/c8/c83007a.ada: New file. + * ada/acats-2/tests/c8/c83012d.ada: New file. + * ada/acats-2/tests/c8/c83022a.ada: New file. + * ada/acats-2/tests/c8/c83022g0.ada: New file. + * ada/acats-2/tests/c8/c83022g1.ada: New file. + * ada/acats-2/tests/c8/c83023a.ada: New file. + * ada/acats-2/tests/c8/c83024a.ada: New file. + * ada/acats-2/tests/c8/c83024e0.ada: New file. + * ada/acats-2/tests/c8/c83024e1.ada: New file. + * ada/acats-2/tests/c8/c83025a.ada: New file. + * ada/acats-2/tests/c8/c83025c.ada: New file. + * ada/acats-2/tests/c8/c83027a.ada: New file. + * ada/acats-2/tests/c8/c83027c.ada: New file. + * ada/acats-2/tests/c8/c83028a.ada: New file. + * ada/acats-2/tests/c8/c83029a.ada: New file. + * ada/acats-2/tests/c8/c83030a.ada: New file. + * ada/acats-2/tests/c8/c83030c.ada: New file. + * ada/acats-2/tests/c8/c83031a.ada: New file. + * ada/acats-2/tests/c8/c83031c.ada: New file. + * ada/acats-2/tests/c8/c83031e.ada: New file. + * ada/acats-2/tests/c8/c83032a.ada: New file. + * ada/acats-2/tests/c8/c83033a.ada: New file. + * ada/acats-2/tests/c8/c83051a.ada: New file. + * ada/acats-2/tests/c8/c83b02a.ada: New file. + * ada/acats-2/tests/c8/c83b02b.ada: New file. + * ada/acats-2/tests/c8/c83e02a.ada: New file. + * ada/acats-2/tests/c8/c83e02b.ada: New file. + * ada/acats-2/tests/c8/c83e03a.ada: New file. + * ada/acats-2/tests/c8/c83f01a.ada: New file. + * ada/acats-2/tests/c8/c83f01b.ada: New file. + * ada/acats-2/tests/c8/c83f01c0.ada: New file. + * ada/acats-2/tests/c8/c83f01c1.ada: New file. + * ada/acats-2/tests/c8/c83f01c2.ada: New file. + * ada/acats-2/tests/c8/c83f01d0.ada: New file. + * ada/acats-2/tests/c8/c83f01d1.ada: New file. + * ada/acats-2/tests/c8/c83f03a.ada: New file. + * ada/acats-2/tests/c8/c83f03b.ada: New file. + * ada/acats-2/tests/c8/c83f03c0.ada: New file. + * ada/acats-2/tests/c8/c83f03c1.ada: New file. + * ada/acats-2/tests/c8/c83f03c2.ada: New file. + * ada/acats-2/tests/c8/c83f03d0.ada: New file. + * ada/acats-2/tests/c8/c83f03d1.ada: New file. + * ada/acats-2/tests/c8/c840001.a: New file. + * ada/acats-2/tests/c8/c84002a.ada: New file. + * ada/acats-2/tests/c8/c84005a.ada: New file. + * ada/acats-2/tests/c8/c84008a.ada: New file. + * ada/acats-2/tests/c8/c84009a.ada: New file. + * ada/acats-2/tests/c8/c85004b.ada: New file. + * ada/acats-2/tests/c8/c85005a.ada: New file. + * ada/acats-2/tests/c8/c85005b.ada: New file. + * ada/acats-2/tests/c8/c85005c.ada: New file. + * ada/acats-2/tests/c8/c85005d.ada: New file. + * ada/acats-2/tests/c8/c85005e.ada: New file. + * ada/acats-2/tests/c8/c85005f.ada: New file. + * ada/acats-2/tests/c8/c85005g.ada: New file. + * ada/acats-2/tests/c8/c85006a.ada: New file. + * ada/acats-2/tests/c8/c85006b.ada: New file. + * ada/acats-2/tests/c8/c85006c.ada: New file. + * ada/acats-2/tests/c8/c85006d.ada: New file. + * ada/acats-2/tests/c8/c85006e.ada: New file. + * ada/acats-2/tests/c8/c85006f.ada: New file. + * ada/acats-2/tests/c8/c85006g.ada: New file. + * ada/acats-2/tests/c8/c85007a.ada: New file. + * ada/acats-2/tests/c8/c85007e.ada: New file. + * ada/acats-2/tests/c8/c85009a.ada: New file. + * ada/acats-2/tests/c8/c85011a.ada: New file. + * ada/acats-2/tests/c8/c85013a.ada: New file. + * ada/acats-2/tests/c8/c85014a.ada: New file. + * ada/acats-2/tests/c8/c85014b.ada: New file. + * ada/acats-2/tests/c8/c85014c.ada: New file. + * ada/acats-2/tests/c8/c85017a.ada: New file. + * ada/acats-2/tests/c8/c85018a.ada: New file. + * ada/acats-2/tests/c8/c85018b.ada: New file. + * ada/acats-2/tests/c8/c85019a.ada: New file. + * ada/acats-2/tests/c8/c854001.a: New file. + * ada/acats-2/tests/c8/c854002.a: New file. + * ada/acats-2/tests/c8/c854003.a: New file. + * ada/acats-2/tests/c8/c86003a.ada: New file. + * ada/acats-2/tests/c8/c86004a.ada: New file. + * ada/acats-2/tests/c8/c86004b0.ada: New file. + * ada/acats-2/tests/c8/c86004b1.ada: New file. + * ada/acats-2/tests/c8/c86004b2.ada: New file. + * ada/acats-2/tests/c8/c86004c0.ada: New file. + * ada/acats-2/tests/c8/c86004c1.ada: New file. + * ada/acats-2/tests/c8/c86004c2.ada: New file. + * ada/acats-2/tests/c8/c86006i.ada: New file. + * ada/acats-2/tests/c8/c86007a.ada: New file. + * ada/acats-2/tests/c8/c87a05a.ada: New file. + * ada/acats-2/tests/c8/c87a05b.ada: New file. + * ada/acats-2/tests/c8/c87b02a.ada: New file. + * ada/acats-2/tests/c8/c87b02b.ada: New file. + * ada/acats-2/tests/c8/c87b03a.ada: New file. + * ada/acats-2/tests/c8/c87b04a.ada: New file. + * ada/acats-2/tests/c8/c87b04b.ada: New file. + * ada/acats-2/tests/c8/c87b04c.ada: New file. + * ada/acats-2/tests/c8/c87b05a.ada: New file. + * ada/acats-2/tests/c8/c87b06a.ada: New file. + * ada/acats-2/tests/c8/c87b07a.ada: New file. + * ada/acats-2/tests/c8/c87b07b.ada: New file. + * ada/acats-2/tests/c8/c87b07c.ada: New file. + * ada/acats-2/tests/c8/c87b07d.ada: New file. + * ada/acats-2/tests/c8/c87b07e.ada: New file. + * ada/acats-2/tests/c8/c87b08a.ada: New file. + * ada/acats-2/tests/c8/c87b09a.ada: New file. + * ada/acats-2/tests/c8/c87b09c.ada: New file. + * ada/acats-2/tests/c8/c87b10a.ada: New file. + * ada/acats-2/tests/c8/c87b11a.ada: New file. + * ada/acats-2/tests/c8/c87b11b.ada: New file. + * ada/acats-2/tests/c8/c87b13a.ada: New file. + * ada/acats-2/tests/c8/c87b14a.ada: New file. + * ada/acats-2/tests/c8/c87b14b.ada: New file. + * ada/acats-2/tests/c8/c87b14c.ada: New file. + * ada/acats-2/tests/c8/c87b14d.ada: New file. + * ada/acats-2/tests/c8/c87b15a.ada: New file. + * ada/acats-2/tests/c8/c87b16a.ada: New file. + * ada/acats-2/tests/c8/c87b17a.ada: New file. + * ada/acats-2/tests/c8/c87b18a.ada: New file. + * ada/acats-2/tests/c8/c87b18b.ada: New file. + * ada/acats-2/tests/c8/c87b19a.ada: New file. + * ada/acats-2/tests/c8/c87b23a.ada: New file. + * ada/acats-2/tests/c8/c87b24a.ada: New file. + * ada/acats-2/tests/c8/c87b24b.ada: New file. + * ada/acats-2/tests/c8/c87b26b.ada: New file. + * ada/acats-2/tests/c8/c87b27a.ada: New file. + * ada/acats-2/tests/c8/c87b28a.ada: New file. + * ada/acats-2/tests/c8/c87b29a.ada: New file. + * ada/acats-2/tests/c8/c87b30a.ada: New file. + * ada/acats-2/tests/c8/c87b31a.ada: New file. + * ada/acats-2/tests/c8/c87b32a.ada: New file. + * ada/acats-2/tests/c8/c87b33a.ada: New file. + * ada/acats-2/tests/c8/c87b34a.ada: New file. + * ada/acats-2/tests/c8/c87b34b.ada: New file. + * ada/acats-2/tests/c8/c87b34c.ada: New file. + * ada/acats-2/tests/c8/c87b35c.ada: New file. + * ada/acats-2/tests/c8/c87b38a.ada: New file. + * ada/acats-2/tests/c8/c87b39a.ada: New file. + * ada/acats-2/tests/c8/c87b40a.ada: New file. + * ada/acats-2/tests/c8/c87b41a.ada: New file. + * ada/acats-2/tests/c8/c87b42a.ada: New file. + * ada/acats-2/tests/c8/c87b43a.ada: New file. + * ada/acats-2/tests/c8/c87b44a.ada: New file. + * ada/acats-2/tests/c8/c87b45a.ada: New file. + * ada/acats-2/tests/c8/c87b45c.ada: New file. + * ada/acats-2/tests/c8/c87b47a.ada: New file. + * ada/acats-2/tests/c8/c87b48a.ada: New file. + * ada/acats-2/tests/c8/c87b48b.ada: New file. + * ada/acats-2/tests/c8/c87b50a.ada: New file. + * ada/acats-2/tests/c8/c87b54a.ada: New file. + * ada/acats-2/tests/c8/c87b57a.ada: New file. + * ada/acats-2/tests/c8/c87b62a.ada: New file. + * ada/acats-2/tests/c8/c87b62b.ada: New file. + * ada/acats-2/tests/c8/c87b62c.ada: New file. + * ada/acats-2/tests/c8/c87b62d.tst: New file. + * ada/acats-2/tests/c9/c910001.a: New file. + * ada/acats-2/tests/c9/c910002.a: New file. + * ada/acats-2/tests/c9/c910003.a: New file. + * ada/acats-2/tests/c9/c91004b.ada: New file. + * ada/acats-2/tests/c9/c91004c.ada: New file. + * ada/acats-2/tests/c9/c91006a.ada: New file. + * ada/acats-2/tests/c9/c91007a.ada: New file. + * ada/acats-2/tests/c9/c92002a.ada: New file. + * ada/acats-2/tests/c9/c92003a.ada: New file. + * ada/acats-2/tests/c9/c92005a.ada: New file. + * ada/acats-2/tests/c9/c92005b.ada: New file. + * ada/acats-2/tests/c9/c92006a.ada: New file. + * ada/acats-2/tests/c9/c930001.a: New file. + * ada/acats-2/tests/c9/c93001a.ada: New file. + * ada/acats-2/tests/c9/c93002a.ada: New file. + * ada/acats-2/tests/c9/c93003a.ada: New file. + * ada/acats-2/tests/c9/c93004a.ada: New file. + * ada/acats-2/tests/c9/c93004b.ada: New file. + * ada/acats-2/tests/c9/c93004c.ada: New file. + * ada/acats-2/tests/c9/c93004d.ada: New file. + * ada/acats-2/tests/c9/c93004f.ada: New file. + * ada/acats-2/tests/c9/c93005a.ada: New file. + * ada/acats-2/tests/c9/c93005b.ada: New file. + * ada/acats-2/tests/c9/c93005c.ada: New file. + * ada/acats-2/tests/c9/c93005d.ada: New file. + * ada/acats-2/tests/c9/c93005e.ada: New file. + * ada/acats-2/tests/c9/c93005f.ada: New file. + * ada/acats-2/tests/c9/c93005g.ada: New file. + * ada/acats-2/tests/c9/c93005h.ada: New file. + * ada/acats-2/tests/c9/c93006a.ada: New file. + * ada/acats-2/tests/c9/c93007a.ada: New file. + * ada/acats-2/tests/c9/c93008a.ada: New file. + * ada/acats-2/tests/c9/c93008b.ada: New file. + * ada/acats-2/tests/c9/c940001.a: New file. + * ada/acats-2/tests/c9/c940002.a: New file. + * ada/acats-2/tests/c9/c940004.a: New file. + * ada/acats-2/tests/c9/c940005.a: New file. + * ada/acats-2/tests/c9/c940006.a: New file. + * ada/acats-2/tests/c9/c940007.a: New file. + * ada/acats-2/tests/c9/c940010.a: New file. + * ada/acats-2/tests/c9/c940011.a: New file. + * ada/acats-2/tests/c9/c940012.a: New file. + * ada/acats-2/tests/c9/c940013.a: New file. + * ada/acats-2/tests/c9/c940014.a: New file. + * ada/acats-2/tests/c9/c940015.a: New file. + * ada/acats-2/tests/c9/c940016.a: New file. + * ada/acats-2/tests/c9/c94001a.ada: New file. + * ada/acats-2/tests/c9/c94001b.ada: New file. + * ada/acats-2/tests/c9/c94001c.ada: New file. + * ada/acats-2/tests/c9/c94001e.ada: New file. + * ada/acats-2/tests/c9/c94001f.ada: New file. + * ada/acats-2/tests/c9/c94001g.ada: New file. + * ada/acats-2/tests/c9/c94002a.ada: New file. + * ada/acats-2/tests/c9/c94002b.ada: New file. + * ada/acats-2/tests/c9/c94002d.ada: New file. + * ada/acats-2/tests/c9/c94002e.ada: New file. + * ada/acats-2/tests/c9/c94002f.ada: New file. + * ada/acats-2/tests/c9/c94002g.ada: New file. + * ada/acats-2/tests/c9/c94004a.ada: New file. + * ada/acats-2/tests/c9/c94004b.ada: New file. + * ada/acats-2/tests/c9/c94004c.ada: New file. + * ada/acats-2/tests/c9/c94005a.ada: New file. + * ada/acats-2/tests/c9/c94005b.ada: New file. + * ada/acats-2/tests/c9/c94006a.ada: New file. + * ada/acats-2/tests/c9/c94007a.ada: New file. + * ada/acats-2/tests/c9/c94007b.ada: New file. + * ada/acats-2/tests/c9/c94008a.ada: New file. + * ada/acats-2/tests/c9/c94008b.ada: New file. + * ada/acats-2/tests/c9/c94008c.ada: New file. + * ada/acats-2/tests/c9/c94008d.ada: New file. + * ada/acats-2/tests/c9/c94010a.ada: New file. + * ada/acats-2/tests/c9/c94011a.ada: New file. + * ada/acats-2/tests/c9/c94020a.ada: New file. + * ada/acats-2/tests/c9/c940a03.a: New file. + * ada/acats-2/tests/c9/c95008a.ada: New file. + * ada/acats-2/tests/c9/c95009a.ada: New file. + * ada/acats-2/tests/c9/c95010a.ada: New file. + * ada/acats-2/tests/c9/c95011a.ada: New file. + * ada/acats-2/tests/c9/c95012a.ada: New file. + * ada/acats-2/tests/c9/c95021a.ada: New file. + * ada/acats-2/tests/c9/c95022a.ada: New file. + * ada/acats-2/tests/c9/c95022b.ada: New file. + * ada/acats-2/tests/c9/c95033a.ada: New file. + * ada/acats-2/tests/c9/c95033b.ada: New file. + * ada/acats-2/tests/c9/c95034a.ada: New file. + * ada/acats-2/tests/c9/c95034b.ada: New file. + * ada/acats-2/tests/c9/c95035a.ada: New file. + * ada/acats-2/tests/c9/c95040a.ada: New file. + * ada/acats-2/tests/c9/c95040b.ada: New file. + * ada/acats-2/tests/c9/c95040c.ada: New file. + * ada/acats-2/tests/c9/c95040d.ada: New file. + * ada/acats-2/tests/c9/c95041a.ada: New file. + * ada/acats-2/tests/c9/c95065a.ada: New file. + * ada/acats-2/tests/c9/c95065b.ada: New file. + * ada/acats-2/tests/c9/c95065c.ada: New file. + * ada/acats-2/tests/c9/c95065d.ada: New file. + * ada/acats-2/tests/c9/c95065e.ada: New file. + * ada/acats-2/tests/c9/c95065f.ada: New file. + * ada/acats-2/tests/c9/c95066a.ada: New file. + * ada/acats-2/tests/c9/c95067a.ada: New file. + * ada/acats-2/tests/c9/c95071a.ada: New file. + * ada/acats-2/tests/c9/c95072a.ada: New file. + * ada/acats-2/tests/c9/c95072b.ada: New file. + * ada/acats-2/tests/c9/c95073a.ada: New file. + * ada/acats-2/tests/c9/c95074c.ada: New file. + * ada/acats-2/tests/c9/c95076a.ada: New file. + * ada/acats-2/tests/c9/c95078a.ada: New file. + * ada/acats-2/tests/c9/c95080b.ada: New file. + * ada/acats-2/tests/c9/c95082g.ada: New file. + * ada/acats-2/tests/c9/c95085a.ada: New file. + * ada/acats-2/tests/c9/c95085b.ada: New file. + * ada/acats-2/tests/c9/c95085c.ada: New file. + * ada/acats-2/tests/c9/c95085d.ada: New file. + * ada/acats-2/tests/c9/c95085e.ada: New file. + * ada/acats-2/tests/c9/c95085f.ada: New file. + * ada/acats-2/tests/c9/c95085g.ada: New file. + * ada/acats-2/tests/c9/c95085h.ada: New file. + * ada/acats-2/tests/c9/c95085i.ada: New file. + * ada/acats-2/tests/c9/c95085j.ada: New file. + * ada/acats-2/tests/c9/c95085k.ada: New file. + * ada/acats-2/tests/c9/c95085l.ada: New file. + * ada/acats-2/tests/c9/c95085m.ada: New file. + * ada/acats-2/tests/c9/c95085n.ada: New file. + * ada/acats-2/tests/c9/c95085o.ada: New file. + * ada/acats-2/tests/c9/c95086a.ada: New file. + * ada/acats-2/tests/c9/c95086b.ada: New file. + * ada/acats-2/tests/c9/c95086c.ada: New file. + * ada/acats-2/tests/c9/c95086d.ada: New file. + * ada/acats-2/tests/c9/c95086e.ada: New file. + * ada/acats-2/tests/c9/c95086f.ada: New file. + * ada/acats-2/tests/c9/c95087a.ada: New file. + * ada/acats-2/tests/c9/c95087b.ada: New file. + * ada/acats-2/tests/c9/c95087c.ada: New file. + * ada/acats-2/tests/c9/c95087d.ada: New file. + * ada/acats-2/tests/c9/c95088a.ada: New file. + * ada/acats-2/tests/c9/c95089a.ada: New file. + * ada/acats-2/tests/c9/c95090a.ada: New file. + * ada/acats-2/tests/c9/c95092a.ada: New file. + * ada/acats-2/tests/c9/c95093a.ada: New file. + * ada/acats-2/tests/c9/c95095a.ada: New file. + * ada/acats-2/tests/c9/c95095b.ada: New file. + * ada/acats-2/tests/c9/c95095c.ada: New file. + * ada/acats-2/tests/c9/c95095d.ada: New file. + * ada/acats-2/tests/c9/c95095e.ada: New file. + * ada/acats-2/tests/c9/c951001.a: New file. + * ada/acats-2/tests/c9/c951002.a: New file. + * ada/acats-2/tests/c9/c953001.a: New file. + * ada/acats-2/tests/c9/c953002.a: New file. + * ada/acats-2/tests/c9/c953003.a: New file. + * ada/acats-2/tests/c9/c954001.a: New file. + * ada/acats-2/tests/c9/c954010.a: New file. + * ada/acats-2/tests/c9/c954011.a: New file. + * ada/acats-2/tests/c9/c954012.a: New file. + * ada/acats-2/tests/c9/c954013.a: New file. + * ada/acats-2/tests/c9/c954014.a: New file. + * ada/acats-2/tests/c9/c954015.a: New file. + * ada/acats-2/tests/c9/c954016.a: New file. + * ada/acats-2/tests/c9/c954017.a: New file. + * ada/acats-2/tests/c9/c954018.a: New file. + * ada/acats-2/tests/c9/c954019.a: New file. + * ada/acats-2/tests/c9/c954020.a: New file. + * ada/acats-2/tests/c9/c954021.a: New file. + * ada/acats-2/tests/c9/c954022.a: New file. + * ada/acats-2/tests/c9/c954023.a: New file. + * ada/acats-2/tests/c9/c954024.a: New file. + * ada/acats-2/tests/c9/c954025.a: New file. + * ada/acats-2/tests/c9/c954026.a: New file. + * ada/acats-2/tests/c9/c954a01.a: New file. + * ada/acats-2/tests/c9/c954a02.a: New file. + * ada/acats-2/tests/c9/c954a03.a: New file. + * ada/acats-2/tests/c9/c960001.a: New file. + * ada/acats-2/tests/c9/c960002.a: New file. + * ada/acats-2/tests/c9/c960004.a: New file. + * ada/acats-2/tests/c9/c96001a.ada: New file. + * ada/acats-2/tests/c9/c96004a.ada: New file. + * ada/acats-2/tests/c9/c96005a.ada: New file. + * ada/acats-2/tests/c9/c96005b.tst: New file. + * ada/acats-2/tests/c9/c96005d.ada: New file. + * ada/acats-2/tests/c9/c96005f.ada: New file. + * ada/acats-2/tests/c9/c96006a.ada: New file. + * ada/acats-2/tests/c9/c96007a.ada: New file. + * ada/acats-2/tests/c9/c96008a.ada: New file. + * ada/acats-2/tests/c9/c96008b.ada: New file. + * ada/acats-2/tests/c9/c97112a.ada: New file. + * ada/acats-2/tests/c9/c97113a.ada: New file. + * ada/acats-2/tests/c9/c97114a.ada: New file. + * ada/acats-2/tests/c9/c97115a.ada: New file. + * ada/acats-2/tests/c9/c97116a.ada: New file. + * ada/acats-2/tests/c9/c97117a.ada: New file. + * ada/acats-2/tests/c9/c97117b.ada: New file. + * ada/acats-2/tests/c9/c97117c.ada: New file. + * ada/acats-2/tests/c9/c97118a.ada: New file. + * ada/acats-2/tests/c9/c97120a.ada: New file. + * ada/acats-2/tests/c9/c97120b.ada: New file. + * ada/acats-2/tests/c9/c97201a.ada: New file. + * ada/acats-2/tests/c9/c97201b.ada: New file. + * ada/acats-2/tests/c9/c97201c.ada: New file. + * ada/acats-2/tests/c9/c97201d.ada: New file. + * ada/acats-2/tests/c9/c97201e.ada: New file. + * ada/acats-2/tests/c9/c97201g.ada: New file. + * ada/acats-2/tests/c9/c97201h.ada: New file. + * ada/acats-2/tests/c9/c97201x.ada: New file. + * ada/acats-2/tests/c9/c97202a.ada: New file. + * ada/acats-2/tests/c9/c97203a.ada: New file. + * ada/acats-2/tests/c9/c97203b.ada: New file. + * ada/acats-2/tests/c9/c97203c.ada: New file. + * ada/acats-2/tests/c9/c97204a.ada: New file. + * ada/acats-2/tests/c9/c97204b.ada: New file. + * ada/acats-2/tests/c9/c97205a.ada: New file. + * ada/acats-2/tests/c9/c97205b.ada: New file. + * ada/acats-2/tests/c9/c97301a.ada: New file. + * ada/acats-2/tests/c9/c97301b.ada: New file. + * ada/acats-2/tests/c9/c97301c.ada: New file. + * ada/acats-2/tests/c9/c97301d.ada: New file. + * ada/acats-2/tests/c9/c97301e.ada: New file. + * ada/acats-2/tests/c9/c97302a.ada: New file. + * ada/acats-2/tests/c9/c97303a.ada: New file. + * ada/acats-2/tests/c9/c97303b.ada: New file. + * ada/acats-2/tests/c9/c97303c.ada: New file. + * ada/acats-2/tests/c9/c97304a.ada: New file. + * ada/acats-2/tests/c9/c97304b.ada: New file. + * ada/acats-2/tests/c9/c97305a.ada: New file. + * ada/acats-2/tests/c9/c97305b.ada: New file. + * ada/acats-2/tests/c9/c97305c.ada: New file. + * ada/acats-2/tests/c9/c97305d.ada: New file. + * ada/acats-2/tests/c9/c97307a.ada: New file. + * ada/acats-2/tests/c9/c974001.a: New file. + * ada/acats-2/tests/c9/c974002.a: New file. + * ada/acats-2/tests/c9/c974003.a: New file. + * ada/acats-2/tests/c9/c974004.a: New file. + * ada/acats-2/tests/c9/c974005.a: New file. + * ada/acats-2/tests/c9/c974006.a: New file. + * ada/acats-2/tests/c9/c974007.a: New file. + * ada/acats-2/tests/c9/c974008.a: New file. + * ada/acats-2/tests/c9/c974009.a: New file. + * ada/acats-2/tests/c9/c974010.a: New file. + * ada/acats-2/tests/c9/c974011.a: New file. + * ada/acats-2/tests/c9/c974012.a: New file. + * ada/acats-2/tests/c9/c974013.a: New file. + * ada/acats-2/tests/c9/c974014.a: New file. + * ada/acats-2/tests/c9/c980001.a: New file. + * ada/acats-2/tests/c9/c980002.a: New file. + * ada/acats-2/tests/c9/c980003.a: New file. + * ada/acats-2/tests/c9/c99004a.ada: New file. + * ada/acats-2/tests/c9/c99005a.ada: New file. + * ada/acats-2/tests/c9/c9a003a.ada: New file. + * ada/acats-2/tests/c9/c9a004a.ada: New file. + * ada/acats-2/tests/c9/c9a007a.ada: New file. + * ada/acats-2/tests/c9/c9a009a.ada: New file. + * ada/acats-2/tests/c9/c9a009c.ada: New file. + * ada/acats-2/tests/c9/c9a009f.ada: New file. + * ada/acats-2/tests/c9/c9a009g.ada: New file. + * ada/acats-2/tests/c9/c9a009h.ada: New file. + * ada/acats-2/tests/c9/c9a010a.ada: New file. + * ada/acats-2/tests/c9/c9a011a.ada: New file. + * ada/acats-2/tests/c9/c9a011b.ada: New file. + * ada/acats-2/tests/ca/ca1003a.ada: New file. + * ada/acats-2/tests/ca/ca1004a.ada: New file. + * ada/acats-2/tests/ca/ca1005a.ada: New file. + * ada/acats-2/tests/ca/ca1006a.ada: New file. + * ada/acats-2/tests/ca/ca1011a0.ada: New file. + * ada/acats-2/tests/ca/ca1011a1.ada: New file. + * ada/acats-2/tests/ca/ca1011a2.ada: New file. + * ada/acats-2/tests/ca/ca1011a3.ada: New file. + * ada/acats-2/tests/ca/ca1011a4.ada: New file. + * ada/acats-2/tests/ca/ca1011a5.ada: New file. + * ada/acats-2/tests/ca/ca1011a6.ada: New file. + * ada/acats-2/tests/ca/ca1012a0.ada: New file. + * ada/acats-2/tests/ca/ca1012a1.ada: New file. + * ada/acats-2/tests/ca/ca1012a2.ada: New file. + * ada/acats-2/tests/ca/ca1012a3.ada: New file. + * ada/acats-2/tests/ca/ca1012a4.ada: New file. + * ada/acats-2/tests/ca/ca1012b0.ada: New file. + * ada/acats-2/tests/ca/ca1012b2.ada: New file. + * ada/acats-2/tests/ca/ca1012b4.ada: New file. + * ada/acats-2/tests/ca/ca1013a0.ada: New file. + * ada/acats-2/tests/ca/ca1013a1.ada: New file. + * ada/acats-2/tests/ca/ca1013a2.ada: New file. + * ada/acats-2/tests/ca/ca1013a3.ada: New file. + * ada/acats-2/tests/ca/ca1013a4.ada: New file. + * ada/acats-2/tests/ca/ca1013a5.ada: New file. + * ada/acats-2/tests/ca/ca1013a6.ada: New file. + * ada/acats-2/tests/ca/ca1014a0.ada: New file. + * ada/acats-2/tests/ca/ca1014a1.ada: New file. + * ada/acats-2/tests/ca/ca1014a2.ada: New file. + * ada/acats-2/tests/ca/ca1014a3.ada: New file. + * ada/acats-2/tests/ca/ca1020e0.ada: New file. + * ada/acats-2/tests/ca/ca1020e1.ada: New file. + * ada/acats-2/tests/ca/ca1020e2.ada: New file. + * ada/acats-2/tests/ca/ca1020e3.ada: New file. + * ada/acats-2/tests/ca/ca1022a0.ada: New file. + * ada/acats-2/tests/ca/ca1022a1.ada: New file. + * ada/acats-2/tests/ca/ca1022a2.ada: New file. + * ada/acats-2/tests/ca/ca1022a3.ada: New file. + * ada/acats-2/tests/ca/ca1022a4.ada: New file. + * ada/acats-2/tests/ca/ca1022a5.ada: New file. + * ada/acats-2/tests/ca/ca1022a6.ada: New file. + * ada/acats-2/tests/ca/ca11001.a: New file. + * ada/acats-2/tests/ca/ca11002.a: New file. + * ada/acats-2/tests/ca/ca11003.a: New file. + * ada/acats-2/tests/ca/ca110040.a: New file. + * ada/acats-2/tests/ca/ca110041.a: New file. + * ada/acats-2/tests/ca/ca110042.am: New file. + * ada/acats-2/tests/ca/ca110050.a: New file. + * ada/acats-2/tests/ca/ca110051.am: New file. + * ada/acats-2/tests/ca/ca11006.a: New file. + * ada/acats-2/tests/ca/ca11007.a: New file. + * ada/acats-2/tests/ca/ca11008.a: New file. + * ada/acats-2/tests/ca/ca11009.a: New file. + * ada/acats-2/tests/ca/ca11010.a: New file. + * ada/acats-2/tests/ca/ca11011.a: New file. + * ada/acats-2/tests/ca/ca11012.a: New file. + * ada/acats-2/tests/ca/ca11013.a: New file. + * ada/acats-2/tests/ca/ca11014.a: New file. + * ada/acats-2/tests/ca/ca11015.a: New file. + * ada/acats-2/tests/ca/ca11016.a: New file. + * ada/acats-2/tests/ca/ca11017.a: New file. + * ada/acats-2/tests/ca/ca11018.a: New file. + * ada/acats-2/tests/ca/ca11019.a: New file. + * ada/acats-2/tests/ca/ca11020.a: New file. + * ada/acats-2/tests/ca/ca11021.a: New file. + * ada/acats-2/tests/ca/ca11022.a: New file. + * ada/acats-2/tests/ca/ca1102a0.ada: New file. + * ada/acats-2/tests/ca/ca1102a1.ada: New file. + * ada/acats-2/tests/ca/ca1102a2.ada: New file. + * ada/acats-2/tests/ca/ca1106a.ada: New file. + * ada/acats-2/tests/ca/ca1108a.ada: New file. + * ada/acats-2/tests/ca/ca1108b.ada: New file. + * ada/acats-2/tests/ca/ca11a01.a: New file. + * ada/acats-2/tests/ca/ca11a02.a: New file. + * ada/acats-2/tests/ca/ca11b01.a: New file. + * ada/acats-2/tests/ca/ca11b02.a: New file. + * ada/acats-2/tests/ca/ca11c01.a: New file. + * ada/acats-2/tests/ca/ca11c02.a: New file. + * ada/acats-2/tests/ca/ca11c03.a: New file. + * ada/acats-2/tests/ca/ca11d010.a: New file. + * ada/acats-2/tests/ca/ca11d011.a: New file. + * ada/acats-2/tests/ca/ca11d012.a: New file. + * ada/acats-2/tests/ca/ca11d013.am: New file. + * ada/acats-2/tests/ca/ca11d02.a: New file. + * ada/acats-2/tests/ca/ca11d03.a: New file. + * ada/acats-2/tests/ca/ca13001.a: New file. + * ada/acats-2/tests/ca/ca13002.a: New file. + * ada/acats-2/tests/ca/ca13003.a: New file. + * ada/acats-2/tests/ca/ca13a01.a: New file. + * ada/acats-2/tests/ca/ca13a02.a: New file. + * ada/acats-2/tests/ca/ca140230.a: New file. + * ada/acats-2/tests/ca/ca140231.a: New file. + * ada/acats-2/tests/ca/ca140232.am: New file. + * ada/acats-2/tests/ca/ca140233.a: New file. + * ada/acats-2/tests/ca/ca140280.a: New file. + * ada/acats-2/tests/ca/ca140281.a: New file. + * ada/acats-2/tests/ca/ca140282.a: New file. + * ada/acats-2/tests/ca/ca140283.am: New file. + * ada/acats-2/tests/ca/ca15003.a: New file. + * ada/acats-2/tests/ca/ca200020.a: New file. + * ada/acats-2/tests/ca/ca200021.a: New file. + * ada/acats-2/tests/ca/ca200022.am: New file. + * ada/acats-2/tests/ca/ca2001h0.ada: New file. + * ada/acats-2/tests/ca/ca2001h1.ada: New file. + * ada/acats-2/tests/ca/ca2001h2.ada: New file. + * ada/acats-2/tests/ca/ca2001h3.ada: New file. + * ada/acats-2/tests/ca/ca2002a0.ada: New file. + * ada/acats-2/tests/ca/ca2002a1.ada: New file. + * ada/acats-2/tests/ca/ca2002a2.ada: New file. + * ada/acats-2/tests/ca/ca2003a0.ada: New file. + * ada/acats-2/tests/ca/ca2003a1.ada: New file. + * ada/acats-2/tests/ca/ca2004a0.ada: New file. + * ada/acats-2/tests/ca/ca2004a1.ada: New file. + * ada/acats-2/tests/ca/ca2004a2.ada: New file. + * ada/acats-2/tests/ca/ca2004a3.ada: New file. + * ada/acats-2/tests/ca/ca2004a4.ada: New file. + * ada/acats-2/tests/ca/ca2007a0.ada: New file. + * ada/acats-2/tests/ca/ca2007a1.ada: New file. + * ada/acats-2/tests/ca/ca2007a2.ada: New file. + * ada/acats-2/tests/ca/ca2007a3.ada: New file. + * ada/acats-2/tests/ca/ca2008a0.ada: New file. + * ada/acats-2/tests/ca/ca2008a1.ada: New file. + * ada/acats-2/tests/ca/ca2008a2.ada: New file. + * ada/acats-2/tests/ca/ca2009a.ada: New file. + * ada/acats-2/tests/ca/ca2009c0.ada: New file. + * ada/acats-2/tests/ca/ca2009c1.ada: New file. + * ada/acats-2/tests/ca/ca2009d.ada: New file. + * ada/acats-2/tests/ca/ca2009f0.ada: New file. + * ada/acats-2/tests/ca/ca2009f1.ada: New file. + * ada/acats-2/tests/ca/ca2009f2.ada: New file. + * ada/acats-2/tests/ca/ca2011b.ada: New file. + * ada/acats-2/tests/ca/ca21001.a: New file. + * ada/acats-2/tests/ca/ca3011a0.ada: New file. + * ada/acats-2/tests/ca/ca3011a1.ada: New file. + * ada/acats-2/tests/ca/ca3011a2.ada: New file. + * ada/acats-2/tests/ca/ca3011a3.ada: New file. + * ada/acats-2/tests/ca/ca3011a4.ada: New file. + * ada/acats-2/tests/ca/ca5003a0.ada: New file. + * ada/acats-2/tests/ca/ca5003a1.ada: New file. + * ada/acats-2/tests/ca/ca5003a2.ada: New file. + * ada/acats-2/tests/ca/ca5003a3.ada: New file. + * ada/acats-2/tests/ca/ca5003a4.ada: New file. + * ada/acats-2/tests/ca/ca5003a5.ada: New file. + * ada/acats-2/tests/ca/ca5003a6.ada: New file. + * ada/acats-2/tests/ca/ca5003b0.ada: New file. + * ada/acats-2/tests/ca/ca5003b1.ada: New file. + * ada/acats-2/tests/ca/ca5003b2.ada: New file. + * ada/acats-2/tests/ca/ca5003b3.ada: New file. + * ada/acats-2/tests/ca/ca5003b4.ada: New file. + * ada/acats-2/tests/ca/ca5003b5.ada: New file. + * ada/acats-2/tests/ca/ca5004a.ada: New file. + * ada/acats-2/tests/ca/ca5004b0.ada: New file. + * ada/acats-2/tests/ca/ca5004b1.ada: New file. + * ada/acats-2/tests/ca/ca5004b2.ada: New file. + * ada/acats-2/tests/ca/ca5006a.ada: New file. + * ada/acats-2/tests/cb/cb10002.a: New file. + * ada/acats-2/tests/cb/cb1001a.ada: New file. + * ada/acats-2/tests/cb/cb1004a.ada: New file. + * ada/acats-2/tests/cb/cb1005a.ada: New file. + * ada/acats-2/tests/cb/cb1010a.ada: New file. + * ada/acats-2/tests/cb/cb1010c.ada: New file. + * ada/acats-2/tests/cb/cb1010d.ada: New file. + * ada/acats-2/tests/cb/cb20001.a: New file. + * ada/acats-2/tests/cb/cb20003.a: New file. + * ada/acats-2/tests/cb/cb20004.a: New file. + * ada/acats-2/tests/cb/cb20005.a: New file. + * ada/acats-2/tests/cb/cb20006.a: New file. + * ada/acats-2/tests/cb/cb20007.a: New file. + * ada/acats-2/tests/cb/cb2004a.ada: New file. + * ada/acats-2/tests/cb/cb2005a.ada: New file. + * ada/acats-2/tests/cb/cb2006a.ada: New file. + * ada/acats-2/tests/cb/cb2007a.ada: New file. + * ada/acats-2/tests/cb/cb20a02.a: New file. + * ada/acats-2/tests/cb/cb3003a.ada: New file. + * ada/acats-2/tests/cb/cb3003b.ada: New file. + * ada/acats-2/tests/cb/cb3004a.ada: New file. + * ada/acats-2/tests/cb/cb40005.a: New file. + * ada/acats-2/tests/cb/cb4001a.ada: New file. + * ada/acats-2/tests/cb/cb4002a.ada: New file. + * ada/acats-2/tests/cb/cb4003a.ada: New file. + * ada/acats-2/tests/cb/cb4004a.ada: New file. + * ada/acats-2/tests/cb/cb4005a.ada: New file. + * ada/acats-2/tests/cb/cb4006a.ada: New file. + * ada/acats-2/tests/cb/cb4007a.ada: New file. + * ada/acats-2/tests/cb/cb4008a.ada: New file. + * ada/acats-2/tests/cb/cb4009a.ada: New file. + * ada/acats-2/tests/cb/cb4013a.ada: New file. + * ada/acats-2/tests/cb/cb40a01.a: New file. + * ada/acats-2/tests/cb/cb40a020.a: New file. + * ada/acats-2/tests/cb/cb40a021.am: New file. + * ada/acats-2/tests/cb/cb40a030.a: New file. + * ada/acats-2/tests/cb/cb40a031.am: New file. + * ada/acats-2/tests/cb/cb40a04.a: New file. + * ada/acats-2/tests/cb/cb41001.a: New file. + * ada/acats-2/tests/cb/cb41002.a: New file. + * ada/acats-2/tests/cb/cb41003.a: New file. + * ada/acats-2/tests/cb/cb41004.a: New file. + * ada/acats-2/tests/cb/cb5001a.ada: New file. + * ada/acats-2/tests/cb/cb5001b.ada: New file. + * ada/acats-2/tests/cb/cb5002a.ada: New file. + * ada/acats-2/tests/cc/cc1004a.ada: New file. + * ada/acats-2/tests/cc/cc1005b.ada: New file. + * ada/acats-2/tests/cc/cc1010a.ada: New file. + * ada/acats-2/tests/cc/cc1010b.ada: New file. + * ada/acats-2/tests/cc/cc1018a.ada: New file. + * ada/acats-2/tests/cc/cc1104c.ada: New file. + * ada/acats-2/tests/cc/cc1107b.ada: New file. + * ada/acats-2/tests/cc/cc1111a.ada: New file. + * ada/acats-2/tests/cc/cc1204a.ada: New file. + * ada/acats-2/tests/cc/cc1207b.ada: New file. + * ada/acats-2/tests/cc/cc1220a.ada: New file. + * ada/acats-2/tests/cc/cc1221a.ada: New file. + * ada/acats-2/tests/cc/cc1221b.ada: New file. + * ada/acats-2/tests/cc/cc1221c.ada: New file. + * ada/acats-2/tests/cc/cc1221d.ada: New file. + * ada/acats-2/tests/cc/cc1222a.ada: New file. + * ada/acats-2/tests/cc/cc1223a.ada: New file. + * ada/acats-2/tests/cc/cc1224a.ada: New file. + * ada/acats-2/tests/cc/cc1225a.tst: New file. + * ada/acats-2/tests/cc/cc1226b.ada: New file. + * ada/acats-2/tests/cc/cc1227a.ada: New file. + * ada/acats-2/tests/cc/cc1301a.ada: New file. + * ada/acats-2/tests/cc/cc1302a.ada: New file. + * ada/acats-2/tests/cc/cc1304a.ada: New file. + * ada/acats-2/tests/cc/cc1304b.ada: New file. + * ada/acats-2/tests/cc/cc1307a.ada: New file. + * ada/acats-2/tests/cc/cc1307b.ada: New file. + * ada/acats-2/tests/cc/cc1308a.ada: New file. + * ada/acats-2/tests/cc/cc1310a.ada: New file. + * ada/acats-2/tests/cc/cc1311a.ada: New file. + * ada/acats-2/tests/cc/cc1311b.ada: New file. + * ada/acats-2/tests/cc/cc2002a.ada: New file. + * ada/acats-2/tests/cc/cc30001.a: New file. + * ada/acats-2/tests/cc/cc30002.a: New file. + * ada/acats-2/tests/cc/cc3004a.ada: New file. + * ada/acats-2/tests/cc/cc3007a.ada: New file. + * ada/acats-2/tests/cc/cc3007b.ada: New file. + * ada/acats-2/tests/cc/cc3011a.ada: New file. + * ada/acats-2/tests/cc/cc3011d.ada: New file. + * ada/acats-2/tests/cc/cc3012a.ada: New file. + * ada/acats-2/tests/cc/cc3015a.ada: New file. + * ada/acats-2/tests/cc/cc3016b.ada: New file. + * ada/acats-2/tests/cc/cc3016c.ada: New file. + * ada/acats-2/tests/cc/cc3016f.ada: New file. + * ada/acats-2/tests/cc/cc3016i.ada: New file. + * ada/acats-2/tests/cc/cc3017b.ada: New file. + * ada/acats-2/tests/cc/cc3017c.ada: New file. + * ada/acats-2/tests/cc/cc3019a.ada: New file. + * ada/acats-2/tests/cc/cc3019b0.ada: New file. + * ada/acats-2/tests/cc/cc3019b1.ada: New file. + * ada/acats-2/tests/cc/cc3019b2.ada: New file. + * ada/acats-2/tests/cc/cc3019c0.ada: New file. + * ada/acats-2/tests/cc/cc3019c1.ada: New file. + * ada/acats-2/tests/cc/cc3019c2.ada: New file. + * ada/acats-2/tests/cc/cc3106b.ada: New file. + * ada/acats-2/tests/cc/cc3120a.ada: New file. + * ada/acats-2/tests/cc/cc3120b.ada: New file. + * ada/acats-2/tests/cc/cc3121a.ada: New file. + * ada/acats-2/tests/cc/cc3123a.ada: New file. + * ada/acats-2/tests/cc/cc3125a.ada: New file. + * ada/acats-2/tests/cc/cc3125b.ada: New file. + * ada/acats-2/tests/cc/cc3125c.ada: New file. + * ada/acats-2/tests/cc/cc3125d.ada: New file. + * ada/acats-2/tests/cc/cc3126a.ada: New file. + * ada/acats-2/tests/cc/cc3127a.ada: New file. + * ada/acats-2/tests/cc/cc3128a.ada: New file. + * ada/acats-2/tests/cc/cc3203a.ada: New file. + * ada/acats-2/tests/cc/cc3207b.ada: New file. + * ada/acats-2/tests/cc/cc3220a.ada: New file. + * ada/acats-2/tests/cc/cc3221a.ada: New file. + * ada/acats-2/tests/cc/cc3222a.ada: New file. + * ada/acats-2/tests/cc/cc3223a.ada: New file. + * ada/acats-2/tests/cc/cc3224a.ada: New file. + * ada/acats-2/tests/cc/cc3225a.ada: New file. + * ada/acats-2/tests/cc/cc3230a.ada: New file. + * ada/acats-2/tests/cc/cc3231a.ada: New file. + * ada/acats-2/tests/cc/cc3232a.ada: New file. + * ada/acats-2/tests/cc/cc3233a.ada: New file. + * ada/acats-2/tests/cc/cc3234a.ada: New file. + * ada/acats-2/tests/cc/cc3235a.ada: New file. + * ada/acats-2/tests/cc/cc3236a.ada: New file. + * ada/acats-2/tests/cc/cc3240a.ada: New file. + * ada/acats-2/tests/cc/cc3305a.ada: New file. + * ada/acats-2/tests/cc/cc3305b.ada: New file. + * ada/acats-2/tests/cc/cc3305c.ada: New file. + * ada/acats-2/tests/cc/cc3305d.ada: New file. + * ada/acats-2/tests/cc/cc3601a.ada: New file. + * ada/acats-2/tests/cc/cc3601c.ada: New file. + * ada/acats-2/tests/cc/cc3602a.ada: New file. + * ada/acats-2/tests/cc/cc3603a.ada: New file. + * ada/acats-2/tests/cc/cc3605a.ada: New file. + * ada/acats-2/tests/cc/cc3606a.ada: New file. + * ada/acats-2/tests/cc/cc3606b.ada: New file. + * ada/acats-2/tests/cc/cc3607b.ada: New file. + * ada/acats-2/tests/cc/cc40001.a: New file. + * ada/acats-2/tests/cc/cc50001.a: New file. + * ada/acats-2/tests/cc/cc50a01.a: New file. + * ada/acats-2/tests/cc/cc50a02.a: New file. + * ada/acats-2/tests/cc/cc51001.a: New file. + * ada/acats-2/tests/cc/cc51002.a: New file. + * ada/acats-2/tests/cc/cc51003.a: New file. + * ada/acats-2/tests/cc/cc51004.a: New file. + * ada/acats-2/tests/cc/cc51006.a: New file. + * ada/acats-2/tests/cc/cc51007.a: New file. + * ada/acats-2/tests/cc/cc51008.a: New file. + * ada/acats-2/tests/cc/cc51a01.a: New file. + * ada/acats-2/tests/cc/cc51b03.a: New file. + * ada/acats-2/tests/cc/cc51d01.a: New file. + * ada/acats-2/tests/cc/cc51d02.a: New file. + * ada/acats-2/tests/cc/cc54001.a: New file. + * ada/acats-2/tests/cc/cc54002.a: New file. + * ada/acats-2/tests/cc/cc54003.a: New file. + * ada/acats-2/tests/cc/cc54004.a: New file. + * ada/acats-2/tests/cc/cc70001.a: New file. + * ada/acats-2/tests/cc/cc70002.a: New file. + * ada/acats-2/tests/cc/cc70003.a: New file. + * ada/acats-2/tests/cc/cc70a01.a: New file. + * ada/acats-2/tests/cc/cc70a02.a: New file. + * ada/acats-2/tests/cc/cc70b01.a: New file. + * ada/acats-2/tests/cc/cc70b02.a: New file. + * ada/acats-2/tests/cc/cc70c01.a: New file. + * ada/acats-2/tests/cc/cc70c02.a: New file. + * ada/acats-2/tests/cd/cd10001.a: New file. + * ada/acats-2/tests/cd/cd10002.a: New file. + * ada/acats-2/tests/cd/cd1009a.ada: New file. + * ada/acats-2/tests/cd/cd1009b.ada: New file. + * ada/acats-2/tests/cd/cd1009d.ada: New file. + * ada/acats-2/tests/cd/cd1009e.ada: New file. + * ada/acats-2/tests/cd/cd1009f.ada: New file. + * ada/acats-2/tests/cd/cd1009g.ada: New file. + * ada/acats-2/tests/cd/cd1009h.ada: New file. + * ada/acats-2/tests/cd/cd1009i.ada: New file. + * ada/acats-2/tests/cd/cd1009j.ada: New file. + * ada/acats-2/tests/cd/cd1009k.tst: New file. + * ada/acats-2/tests/cd/cd1009l.ada: New file. + * ada/acats-2/tests/cd/cd1009m.ada: New file. + * ada/acats-2/tests/cd/cd1009n.ada: New file. + * ada/acats-2/tests/cd/cd1009o.ada: New file. + * ada/acats-2/tests/cd/cd1009p.ada: New file. + * ada/acats-2/tests/cd/cd1009q.ada: New file. + * ada/acats-2/tests/cd/cd1009r.ada: New file. + * ada/acats-2/tests/cd/cd1009s.ada: New file. + * ada/acats-2/tests/cd/cd1009t.tst: New file. + * ada/acats-2/tests/cd/cd1009u.tst: New file. + * ada/acats-2/tests/cd/cd1009v.ada: New file. + * ada/acats-2/tests/cd/cd1009w.ada: New file. + * ada/acats-2/tests/cd/cd1009x.ada: New file. + * ada/acats-2/tests/cd/cd1009y.ada: New file. + * ada/acats-2/tests/cd/cd1009z.ada: New file. + * ada/acats-2/tests/cd/cd1c03a.ada: New file. + * ada/acats-2/tests/cd/cd1c03b.ada: New file. + * ada/acats-2/tests/cd/cd1c03c.ada: New file. + * ada/acats-2/tests/cd/cd1c03e.tst: New file. + * ada/acats-2/tests/cd/cd1c03f.ada: New file. + * ada/acats-2/tests/cd/cd1c03g.ada: New file. + * ada/acats-2/tests/cd/cd1c03h.ada: New file. + * ada/acats-2/tests/cd/cd1c03i.ada: New file. + * ada/acats-2/tests/cd/cd1c04a.ada: New file. + * ada/acats-2/tests/cd/cd1c04d.ada: New file. + * ada/acats-2/tests/cd/cd1c04e.ada: New file. + * ada/acats-2/tests/cd/cd1c06a.tst: New file. + * ada/acats-2/tests/cd/cd20001.a: New file. + * ada/acats-2/tests/cd/cd2a21a.ada: New file. + * ada/acats-2/tests/cd/cd2a21c.ada: New file. + * ada/acats-2/tests/cd/cd2a21e.ada: New file. + * ada/acats-2/tests/cd/cd2a22a.ada: New file. + * ada/acats-2/tests/cd/cd2a22e.ada: New file. + * ada/acats-2/tests/cd/cd2a22i.ada: New file. + * ada/acats-2/tests/cd/cd2a22j.ada: New file. + * ada/acats-2/tests/cd/cd2a23a.ada: New file. + * ada/acats-2/tests/cd/cd2a23e.ada: New file. + * ada/acats-2/tests/cd/cd2a24a.ada: New file. + * ada/acats-2/tests/cd/cd2a24e.ada: New file. + * ada/acats-2/tests/cd/cd2a24i.ada: New file. + * ada/acats-2/tests/cd/cd2a24j.ada: New file. + * ada/acats-2/tests/cd/cd2a31a.ada: New file. + * ada/acats-2/tests/cd/cd2a31c.ada: New file. + * ada/acats-2/tests/cd/cd2a31e.ada: New file. + * ada/acats-2/tests/cd/cd2a32a.ada: New file. + * ada/acats-2/tests/cd/cd2a32c.ada: New file. + * ada/acats-2/tests/cd/cd2a32e.ada: New file. + * ada/acats-2/tests/cd/cd2a32g.ada: New file. + * ada/acats-2/tests/cd/cd2a32i.ada: New file. + * ada/acats-2/tests/cd/cd2a32j.ada: New file. + * ada/acats-2/tests/cd/cd2a51a.ada: New file. + * ada/acats-2/tests/cd/cd2a53a.ada: New file. + * ada/acats-2/tests/cd/cd2a53e.ada: New file. + * ada/acats-2/tests/cd/cd2a83c.tst: New file. + * ada/acats-2/tests/cd/cd2a91c.tst: New file. + * ada/acats-2/tests/cd/cd2b11a.ada: New file. + * ada/acats-2/tests/cd/cd2b11b.ada: New file. + * ada/acats-2/tests/cd/cd2b11d.ada: New file. + * ada/acats-2/tests/cd/cd2b11e.ada: New file. + * ada/acats-2/tests/cd/cd2b11f.ada: New file. + * ada/acats-2/tests/cd/cd2b15c.ada: New file. + * ada/acats-2/tests/cd/cd2b16a.ada: New file. + * ada/acats-2/tests/cd/cd2c11a.tst: New file. + * ada/acats-2/tests/cd/cd2c11d.tst: New file. + * ada/acats-2/tests/cd/cd2d11a.ada: New file. + * ada/acats-2/tests/cd/cd2d13a.ada: New file. + * ada/acats-2/tests/cd/cd30001.a: New file. + * ada/acats-2/tests/cd/cd30002.a: New file. + * ada/acats-2/tests/cd/cd30003.a: New file. + * ada/acats-2/tests/cd/cd30004.a: New file. + * ada/acats-2/tests/cd/cd300050.am: New file. + * ada/acats-2/tests/cd/cd300051.c: New file. + * ada/acats-2/tests/cd/cd30011.a: New file. + * ada/acats-2/tests/cd/cd30012.a: New file. + * ada/acats-2/tests/cd/cd3014a.ada: New file. + * ada/acats-2/tests/cd/cd3014c.ada: New file. + * ada/acats-2/tests/cd/cd3014d.ada: New file. + * ada/acats-2/tests/cd/cd3014f.ada: New file. + * ada/acats-2/tests/cd/cd3015a.ada: New file. + * ada/acats-2/tests/cd/cd3015c.ada: New file. + * ada/acats-2/tests/cd/cd3015e.ada: New file. + * ada/acats-2/tests/cd/cd3015f.ada: New file. + * ada/acats-2/tests/cd/cd3015g.ada: New file. + * ada/acats-2/tests/cd/cd3015h.ada: New file. + * ada/acats-2/tests/cd/cd3015i.ada: New file. + * ada/acats-2/tests/cd/cd3015k.ada: New file. + * ada/acats-2/tests/cd/cd3021a.ada: New file. + * ada/acats-2/tests/cd/cd33001.a: New file. + * ada/acats-2/tests/cd/cd33002.a: New file. + * ada/acats-2/tests/cd/cd40001.a: New file. + * ada/acats-2/tests/cd/cd4031a.ada: New file. + * ada/acats-2/tests/cd/cd4041a.tst: New file. + * ada/acats-2/tests/cd/cd4051a.ada: New file. + * ada/acats-2/tests/cd/cd4051b.ada: New file. + * ada/acats-2/tests/cd/cd4051c.ada: New file. + * ada/acats-2/tests/cd/cd4051d.ada: New file. + * ada/acats-2/tests/cd/cd5003a.ada: New file. + * ada/acats-2/tests/cd/cd5003b.ada: New file. + * ada/acats-2/tests/cd/cd5003c.ada: New file. + * ada/acats-2/tests/cd/cd5003d.ada: New file. + * ada/acats-2/tests/cd/cd5003e.ada: New file. + * ada/acats-2/tests/cd/cd5003f.ada: New file. + * ada/acats-2/tests/cd/cd5003g.ada: New file. + * ada/acats-2/tests/cd/cd5003h.ada: New file. + * ada/acats-2/tests/cd/cd5003i.ada: New file. + * ada/acats-2/tests/cd/cd5011a.ada: New file. + * ada/acats-2/tests/cd/cd5011c.ada: New file. + * ada/acats-2/tests/cd/cd5011e.ada: New file. + * ada/acats-2/tests/cd/cd5011g.ada: New file. + * ada/acats-2/tests/cd/cd5011i.ada: New file. + * ada/acats-2/tests/cd/cd5011k.ada: New file. + * ada/acats-2/tests/cd/cd5011m.ada: New file. + * ada/acats-2/tests/cd/cd5011q.ada: New file. + * ada/acats-2/tests/cd/cd5011s.ada: New file. + * ada/acats-2/tests/cd/cd5012a.ada: New file. + * ada/acats-2/tests/cd/cd5012b.ada: New file. + * ada/acats-2/tests/cd/cd5012e.ada: New file. + * ada/acats-2/tests/cd/cd5012f.ada: New file. + * ada/acats-2/tests/cd/cd5012i.ada: New file. + * ada/acats-2/tests/cd/cd5012m.ada: New file. + * ada/acats-2/tests/cd/cd5013a.ada: New file. + * ada/acats-2/tests/cd/cd5013c.ada: New file. + * ada/acats-2/tests/cd/cd5013e.ada: New file. + * ada/acats-2/tests/cd/cd5013g.ada: New file. + * ada/acats-2/tests/cd/cd5013i.ada: New file. + * ada/acats-2/tests/cd/cd5013k.ada: New file. + * ada/acats-2/tests/cd/cd5013m.ada: New file. + * ada/acats-2/tests/cd/cd5013o.ada: New file. + * ada/acats-2/tests/cd/cd5014a.ada: New file. + * ada/acats-2/tests/cd/cd5014c.ada: New file. + * ada/acats-2/tests/cd/cd5014e.ada: New file. + * ada/acats-2/tests/cd/cd5014g.ada: New file. + * ada/acats-2/tests/cd/cd5014i.ada: New file. + * ada/acats-2/tests/cd/cd5014k.ada: New file. + * ada/acats-2/tests/cd/cd5014m.ada: New file. + * ada/acats-2/tests/cd/cd5014o.ada: New file. + * ada/acats-2/tests/cd/cd5014t.ada: New file. + * ada/acats-2/tests/cd/cd5014v.ada: New file. + * ada/acats-2/tests/cd/cd5014x.ada: New file. + * ada/acats-2/tests/cd/cd5014y.ada: New file. + * ada/acats-2/tests/cd/cd5014z.ada: New file. + * ada/acats-2/tests/cd/cd70001.a: New file. + * ada/acats-2/tests/cd/cd7002a.ada: New file. + * ada/acats-2/tests/cd/cd7007b.ada: New file. + * ada/acats-2/tests/cd/cd7101d.ada: New file. + * ada/acats-2/tests/cd/cd7101e.dep: New file. + * ada/acats-2/tests/cd/cd7101f.dep: New file. + * ada/acats-2/tests/cd/cd7101g.tst: New file. + * ada/acats-2/tests/cd/cd7103d.ada: New file. + * ada/acats-2/tests/cd/cd7202a.ada: New file. + * ada/acats-2/tests/cd/cd7204b.ada: New file. + * ada/acats-2/tests/cd/cd7204c.ada: New file. + * ada/acats-2/tests/cd/cd72a01.a: New file. + * ada/acats-2/tests/cd/cd72a02.a: New file. + * ada/acats-2/tests/cd/cd7305a.ada: New file. + * ada/acats-2/tests/cd/cd90001.a: New file. + * ada/acats-2/tests/cd/cd92001.a: New file. + * ada/acats-2/tests/cd/cda201a.ada: New file. + * ada/acats-2/tests/cd/cda201b.ada: New file. + * ada/acats-2/tests/cd/cda201c.ada: New file. + * ada/acats-2/tests/cd/cda201e.ada: New file. + * ada/acats-2/tests/cd/cdb0a01.a: New file. + * ada/acats-2/tests/cd/cdb0a02.a: New file. + * ada/acats-2/tests/cd/cdd1001.a: New file. + * ada/acats-2/tests/cd/cdd2001.a: New file. + * ada/acats-2/tests/cd/cdd2a01.a: New file. + * ada/acats-2/tests/cd/cdd2a02.a: New file. + * ada/acats-2/tests/cd/cdd2a03.a: New file. + * ada/acats-2/tests/cd/cde0001.a: New file. + * ada/acats-2/tests/ce/ce2102a.ada: New file. + * ada/acats-2/tests/ce/ce2102b.ada: New file. + * ada/acats-2/tests/ce/ce2102c.tst: New file. + * ada/acats-2/tests/ce/ce2102d.ada: New file. + * ada/acats-2/tests/ce/ce2102e.ada: New file. + * ada/acats-2/tests/ce/ce2102f.ada: New file. + * ada/acats-2/tests/ce/ce2102g.ada: New file. + * ada/acats-2/tests/ce/ce2102h.tst: New file. + * ada/acats-2/tests/ce/ce2102i.ada: New file. + * ada/acats-2/tests/ce/ce2102j.ada: New file. + * ada/acats-2/tests/ce/ce2102k.ada: New file. + * ada/acats-2/tests/ce/ce2102l.ada: New file. + * ada/acats-2/tests/ce/ce2102m.ada: New file. + * ada/acats-2/tests/ce/ce2102n.ada: New file. + * ada/acats-2/tests/ce/ce2102o.ada: New file. + * ada/acats-2/tests/ce/ce2102p.ada: New file. + * ada/acats-2/tests/ce/ce2102q.ada: New file. + * ada/acats-2/tests/ce/ce2102r.ada: New file. + * ada/acats-2/tests/ce/ce2102s.ada: New file. + * ada/acats-2/tests/ce/ce2102t.ada: New file. + * ada/acats-2/tests/ce/ce2102u.ada: New file. + * ada/acats-2/tests/ce/ce2102v.ada: New file. + * ada/acats-2/tests/ce/ce2102w.ada: New file. + * ada/acats-2/tests/ce/ce2102x.ada: New file. + * ada/acats-2/tests/ce/ce2102y.ada: New file. + * ada/acats-2/tests/ce/ce2103a.tst: New file. + * ada/acats-2/tests/ce/ce2103b.tst: New file. + * ada/acats-2/tests/ce/ce2103c.ada: New file. + * ada/acats-2/tests/ce/ce2103d.ada: New file. + * ada/acats-2/tests/ce/ce2104a.ada: New file. + * ada/acats-2/tests/ce/ce2104b.ada: New file. + * ada/acats-2/tests/ce/ce2104c.ada: New file. + * ada/acats-2/tests/ce/ce2104d.ada: New file. + * ada/acats-2/tests/ce/ce2106a.ada: New file. + * ada/acats-2/tests/ce/ce2106b.ada: New file. + * ada/acats-2/tests/ce/ce2108e.ada: New file. + * ada/acats-2/tests/ce/ce2108f.ada: New file. + * ada/acats-2/tests/ce/ce2108g.ada: New file. + * ada/acats-2/tests/ce/ce2108h.ada: New file. + * ada/acats-2/tests/ce/ce2109a.ada: New file. + * ada/acats-2/tests/ce/ce2109b.ada: New file. + * ada/acats-2/tests/ce/ce2109c.ada: New file. + * ada/acats-2/tests/ce/ce2110a.ada: New file. + * ada/acats-2/tests/ce/ce2110c.ada: New file. + * ada/acats-2/tests/ce/ce2111a.ada: New file. + * ada/acats-2/tests/ce/ce2111b.ada: New file. + * ada/acats-2/tests/ce/ce2111c.ada: New file. + * ada/acats-2/tests/ce/ce2111e.ada: New file. + * ada/acats-2/tests/ce/ce2111f.ada: New file. + * ada/acats-2/tests/ce/ce2111g.ada: New file. + * ada/acats-2/tests/ce/ce2111i.ada: New file. + * ada/acats-2/tests/ce/ce2201a.ada: New file. + * ada/acats-2/tests/ce/ce2201b.ada: New file. + * ada/acats-2/tests/ce/ce2201c.ada: New file. + * ada/acats-2/tests/ce/ce2201d.dep: New file. + * ada/acats-2/tests/ce/ce2201e.dep: New file. + * ada/acats-2/tests/ce/ce2201f.ada: New file. + * ada/acats-2/tests/ce/ce2201g.ada: New file. + * ada/acats-2/tests/ce/ce2201h.ada: New file. + * ada/acats-2/tests/ce/ce2201i.ada: New file. + * ada/acats-2/tests/ce/ce2201j.ada: New file. + * ada/acats-2/tests/ce/ce2201k.ada: New file. + * ada/acats-2/tests/ce/ce2201l.ada: New file. + * ada/acats-2/tests/ce/ce2201m.ada: New file. + * ada/acats-2/tests/ce/ce2201n.ada: New file. + * ada/acats-2/tests/ce/ce2202a.ada: New file. + * ada/acats-2/tests/ce/ce2203a.tst: New file. + * ada/acats-2/tests/ce/ce2204a.ada: New file. + * ada/acats-2/tests/ce/ce2204b.ada: New file. + * ada/acats-2/tests/ce/ce2204c.ada: New file. + * ada/acats-2/tests/ce/ce2204d.ada: New file. + * ada/acats-2/tests/ce/ce2205a.ada: New file. + * ada/acats-2/tests/ce/ce2206a.ada: New file. + * ada/acats-2/tests/ce/ce2208b.ada: New file. + * ada/acats-2/tests/ce/ce2401a.ada: New file. + * ada/acats-2/tests/ce/ce2401b.ada: New file. + * ada/acats-2/tests/ce/ce2401c.ada: New file. + * ada/acats-2/tests/ce/ce2401e.ada: New file. + * ada/acats-2/tests/ce/ce2401f.ada: New file. + * ada/acats-2/tests/ce/ce2401h.ada: New file. + * ada/acats-2/tests/ce/ce2401i.ada: New file. + * ada/acats-2/tests/ce/ce2401j.ada: New file. + * ada/acats-2/tests/ce/ce2401k.ada: New file. + * ada/acats-2/tests/ce/ce2401l.ada: New file. + * ada/acats-2/tests/ce/ce2402a.ada: New file. + * ada/acats-2/tests/ce/ce2403a.tst: New file. + * ada/acats-2/tests/ce/ce2404a.ada: New file. + * ada/acats-2/tests/ce/ce2404b.ada: New file. + * ada/acats-2/tests/ce/ce2405b.ada: New file. + * ada/acats-2/tests/ce/ce2406a.ada: New file. + * ada/acats-2/tests/ce/ce2407a.ada: New file. + * ada/acats-2/tests/ce/ce2407b.ada: New file. + * ada/acats-2/tests/ce/ce2408a.ada: New file. + * ada/acats-2/tests/ce/ce2408b.ada: New file. + * ada/acats-2/tests/ce/ce2409a.ada: New file. + * ada/acats-2/tests/ce/ce2409b.ada: New file. + * ada/acats-2/tests/ce/ce2410a.ada: New file. + * ada/acats-2/tests/ce/ce2410b.ada: New file. + * ada/acats-2/tests/ce/ce2411a.ada: New file. + * ada/acats-2/tests/ce/ce3002b.tst: New file. + * ada/acats-2/tests/ce/ce3002c.tst: New file. + * ada/acats-2/tests/ce/ce3002d.ada: New file. + * ada/acats-2/tests/ce/ce3002f.ada: New file. + * ada/acats-2/tests/ce/ce3102a.ada: New file. + * ada/acats-2/tests/ce/ce3102b.tst: New file. + * ada/acats-2/tests/ce/ce3102d.ada: New file. + * ada/acats-2/tests/ce/ce3102e.ada: New file. + * ada/acats-2/tests/ce/ce3102f.ada: New file. + * ada/acats-2/tests/ce/ce3102g.ada: New file. + * ada/acats-2/tests/ce/ce3102h.ada: New file. + * ada/acats-2/tests/ce/ce3102i.ada: New file. + * ada/acats-2/tests/ce/ce3102j.ada: New file. + * ada/acats-2/tests/ce/ce3102k.ada: New file. + * ada/acats-2/tests/ce/ce3103a.ada: New file. + * ada/acats-2/tests/ce/ce3104a.ada: New file. + * ada/acats-2/tests/ce/ce3104b.ada: New file. + * ada/acats-2/tests/ce/ce3104c.ada: New file. + * ada/acats-2/tests/ce/ce3106a.ada: New file. + * ada/acats-2/tests/ce/ce3106b.ada: New file. + * ada/acats-2/tests/ce/ce3107a.tst: New file. + * ada/acats-2/tests/ce/ce3107b.ada: New file. + * ada/acats-2/tests/ce/ce3108a.ada: New file. + * ada/acats-2/tests/ce/ce3108b.ada: New file. + * ada/acats-2/tests/ce/ce3110a.ada: New file. + * ada/acats-2/tests/ce/ce3112c.ada: New file. + * ada/acats-2/tests/ce/ce3112d.ada: New file. + * ada/acats-2/tests/ce/ce3114a.ada: New file. + * ada/acats-2/tests/ce/ce3115a.ada: New file. + * ada/acats-2/tests/ce/ce3201a.ada: New file. + * ada/acats-2/tests/ce/ce3202a.ada: New file. + * ada/acats-2/tests/ce/ce3206a.ada: New file. + * ada/acats-2/tests/ce/ce3207a.ada: New file. + * ada/acats-2/tests/ce/ce3301a.ada: New file. + * ada/acats-2/tests/ce/ce3302a.ada: New file. + * ada/acats-2/tests/ce/ce3303a.ada: New file. + * ada/acats-2/tests/ce/ce3304a.tst: New file. + * ada/acats-2/tests/ce/ce3305a.ada: New file. + * ada/acats-2/tests/ce/ce3306a.ada: New file. + * ada/acats-2/tests/ce/ce3401a.ada: New file. + * ada/acats-2/tests/ce/ce3402a.ada: New file. + * ada/acats-2/tests/ce/ce3402c.ada: New file. + * ada/acats-2/tests/ce/ce3402d.ada: New file. + * ada/acats-2/tests/ce/ce3402e.ada: New file. + * ada/acats-2/tests/ce/ce3403a.ada: New file. + * ada/acats-2/tests/ce/ce3403b.ada: New file. + * ada/acats-2/tests/ce/ce3403c.ada: New file. + * ada/acats-2/tests/ce/ce3403d.ada: New file. + * ada/acats-2/tests/ce/ce3403e.ada: New file. + * ada/acats-2/tests/ce/ce3403f.ada: New file. + * ada/acats-2/tests/ce/ce3404a.ada: New file. + * ada/acats-2/tests/ce/ce3404b.ada: New file. + * ada/acats-2/tests/ce/ce3404c.ada: New file. + * ada/acats-2/tests/ce/ce3404d.ada: New file. + * ada/acats-2/tests/ce/ce3405a.ada: New file. + * ada/acats-2/tests/ce/ce3405c.ada: New file. + * ada/acats-2/tests/ce/ce3405d.ada: New file. + * ada/acats-2/tests/ce/ce3406a.ada: New file. + * ada/acats-2/tests/ce/ce3406b.ada: New file. + * ada/acats-2/tests/ce/ce3406c.ada: New file. + * ada/acats-2/tests/ce/ce3406d.ada: New file. + * ada/acats-2/tests/ce/ce3407a.ada: New file. + * ada/acats-2/tests/ce/ce3407b.ada: New file. + * ada/acats-2/tests/ce/ce3407c.ada: New file. + * ada/acats-2/tests/ce/ce3408a.ada: New file. + * ada/acats-2/tests/ce/ce3408b.ada: New file. + * ada/acats-2/tests/ce/ce3408c.ada: New file. + * ada/acats-2/tests/ce/ce3409a.ada: New file. + * ada/acats-2/tests/ce/ce3409b.ada: New file. + * ada/acats-2/tests/ce/ce3409c.ada: New file. + * ada/acats-2/tests/ce/ce3409d.ada: New file. + * ada/acats-2/tests/ce/ce3409e.ada: New file. + * ada/acats-2/tests/ce/ce3410a.ada: New file. + * ada/acats-2/tests/ce/ce3410b.ada: New file. + * ada/acats-2/tests/ce/ce3410c.ada: New file. + * ada/acats-2/tests/ce/ce3410d.ada: New file. + * ada/acats-2/tests/ce/ce3410e.ada: New file. + * ada/acats-2/tests/ce/ce3411a.ada: New file. + * ada/acats-2/tests/ce/ce3411c.ada: New file. + * ada/acats-2/tests/ce/ce3412a.ada: New file. + * ada/acats-2/tests/ce/ce3413a.ada: New file. + * ada/acats-2/tests/ce/ce3413b.ada: New file. + * ada/acats-2/tests/ce/ce3413c.ada: New file. + * ada/acats-2/tests/ce/ce3414a.ada: New file. + * ada/acats-2/tests/ce/ce3601a.ada: New file. + * ada/acats-2/tests/ce/ce3602a.ada: New file. + * ada/acats-2/tests/ce/ce3602b.ada: New file. + * ada/acats-2/tests/ce/ce3602c.ada: New file. + * ada/acats-2/tests/ce/ce3602d.ada: New file. + * ada/acats-2/tests/ce/ce3603a.ada: New file. + * ada/acats-2/tests/ce/ce3604a.ada: New file. + * ada/acats-2/tests/ce/ce3604b.ada: New file. + * ada/acats-2/tests/ce/ce3605a.ada: New file. + * ada/acats-2/tests/ce/ce3605b.ada: New file. + * ada/acats-2/tests/ce/ce3605c.ada: New file. + * ada/acats-2/tests/ce/ce3605d.ada: New file. + * ada/acats-2/tests/ce/ce3605e.ada: New file. + * ada/acats-2/tests/ce/ce3606a.ada: New file. + * ada/acats-2/tests/ce/ce3606b.ada: New file. + * ada/acats-2/tests/ce/ce3701a.ada: New file. + * ada/acats-2/tests/ce/ce3704a.ada: New file. + * ada/acats-2/tests/ce/ce3704b.ada: New file. + * ada/acats-2/tests/ce/ce3704c.ada: New file. + * ada/acats-2/tests/ce/ce3704d.ada: New file. + * ada/acats-2/tests/ce/ce3704e.ada: New file. + * ada/acats-2/tests/ce/ce3704f.ada: New file. + * ada/acats-2/tests/ce/ce3704m.ada: New file. + * ada/acats-2/tests/ce/ce3704n.ada: New file. + * ada/acats-2/tests/ce/ce3704o.ada: New file. + * ada/acats-2/tests/ce/ce3705a.ada: New file. + * ada/acats-2/tests/ce/ce3705b.ada: New file. + * ada/acats-2/tests/ce/ce3705c.ada: New file. + * ada/acats-2/tests/ce/ce3705d.ada: New file. + * ada/acats-2/tests/ce/ce3705e.ada: New file. + * ada/acats-2/tests/ce/ce3706c.ada: New file. + * ada/acats-2/tests/ce/ce3706d.ada: New file. + * ada/acats-2/tests/ce/ce3706f.ada: New file. + * ada/acats-2/tests/ce/ce3706g.ada: New file. + * ada/acats-2/tests/ce/ce3707a.ada: New file. + * ada/acats-2/tests/ce/ce3708a.ada: New file. + * ada/acats-2/tests/ce/ce3801a.ada: New file. + * ada/acats-2/tests/ce/ce3801b.ada: New file. + * ada/acats-2/tests/ce/ce3804a.ada: New file. + * ada/acats-2/tests/ce/ce3804b.ada: New file. + * ada/acats-2/tests/ce/ce3804c.ada: New file. + * ada/acats-2/tests/ce/ce3804d.ada: New file. + * ada/acats-2/tests/ce/ce3804e.ada: New file. + * ada/acats-2/tests/ce/ce3804f.ada: New file. + * ada/acats-2/tests/ce/ce3804g.ada: New file. + * ada/acats-2/tests/ce/ce3804h.ada: New file. + * ada/acats-2/tests/ce/ce3804i.ada: New file. + * ada/acats-2/tests/ce/ce3804j.ada: New file. + * ada/acats-2/tests/ce/ce3804m.ada: New file. + * ada/acats-2/tests/ce/ce3804o.ada: New file. + * ada/acats-2/tests/ce/ce3804p.ada: New file. + * ada/acats-2/tests/ce/ce3805a.ada: New file. + * ada/acats-2/tests/ce/ce3805b.ada: New file. + * ada/acats-2/tests/ce/ce3806a.ada: New file. + * ada/acats-2/tests/ce/ce3806b.ada: New file. + * ada/acats-2/tests/ce/ce3806c.ada: New file. + * ada/acats-2/tests/ce/ce3806d.ada: New file. + * ada/acats-2/tests/ce/ce3806e.ada: New file. + * ada/acats-2/tests/ce/ce3806f.ada: New file. + * ada/acats-2/tests/ce/ce3806g.ada: New file. + * ada/acats-2/tests/ce/ce3806h.ada: New file. + * ada/acats-2/tests/ce/ce3809a.ada: New file. + * ada/acats-2/tests/ce/ce3809b.ada: New file. + * ada/acats-2/tests/ce/ce3810a.ada: New file. + * ada/acats-2/tests/ce/ce3810b.ada: New file. + * ada/acats-2/tests/ce/ce3815a.ada: New file. + * ada/acats-2/tests/ce/ce3901a.ada: New file. + * ada/acats-2/tests/ce/ce3902b.ada: New file. + * ada/acats-2/tests/ce/ce3904a.ada: New file. + * ada/acats-2/tests/ce/ce3904b.ada: New file. + * ada/acats-2/tests/ce/ce3905a.ada: New file. + * ada/acats-2/tests/ce/ce3905b.ada: New file. + * ada/acats-2/tests/ce/ce3905c.ada: New file. + * ada/acats-2/tests/ce/ce3905l.ada: New file. + * ada/acats-2/tests/ce/ce3906a.ada: New file. + * ada/acats-2/tests/ce/ce3906b.ada: New file. + * ada/acats-2/tests/ce/ce3906c.ada: New file. + * ada/acats-2/tests/ce/ce3906d.ada: New file. + * ada/acats-2/tests/ce/ce3906e.ada: New file. + * ada/acats-2/tests/ce/ce3906f.ada: New file. + * ada/acats-2/tests/ce/ce3907a.ada: New file. + * ada/acats-2/tests/ce/ce3908a.ada: New file. + * ada/acats-2/tests/cxa/cxa3001.a: New file. + * ada/acats-2/tests/cxa/cxa3002.a: New file. + * ada/acats-2/tests/cxa/cxa3003.a: New file. + * ada/acats-2/tests/cxa/cxa3004.a: New file. + * ada/acats-2/tests/cxa/cxa4001.a: New file. + * ada/acats-2/tests/cxa/cxa4002.a: New file. + * ada/acats-2/tests/cxa/cxa4003.a: New file. + * ada/acats-2/tests/cxa/cxa4004.a: New file. + * ada/acats-2/tests/cxa/cxa4005.a: New file. + * ada/acats-2/tests/cxa/cxa4006.a: New file. + * ada/acats-2/tests/cxa/cxa4007.a: New file. + * ada/acats-2/tests/cxa/cxa4008.a: New file. + * ada/acats-2/tests/cxa/cxa4009.a: New file. + * ada/acats-2/tests/cxa/cxa4010.a: New file. + * ada/acats-2/tests/cxa/cxa4011.a: New file. + * ada/acats-2/tests/cxa/cxa4012.a: New file. + * ada/acats-2/tests/cxa/cxa4013.a: New file. + * ada/acats-2/tests/cxa/cxa4014.a: New file. + * ada/acats-2/tests/cxa/cxa4015.a: New file. + * ada/acats-2/tests/cxa/cxa4016.a: New file. + * ada/acats-2/tests/cxa/cxa4017.a: New file. + * ada/acats-2/tests/cxa/cxa4018.a: New file. + * ada/acats-2/tests/cxa/cxa4019.a: New file. + * ada/acats-2/tests/cxa/cxa4020.a: New file. + * ada/acats-2/tests/cxa/cxa4021.a: New file. + * ada/acats-2/tests/cxa/cxa4022.a: New file. + * ada/acats-2/tests/cxa/cxa4023.a: New file. + * ada/acats-2/tests/cxa/cxa4024.a: New file. + * ada/acats-2/tests/cxa/cxa4025.a: New file. + * ada/acats-2/tests/cxa/cxa4026.a: New file. + * ada/acats-2/tests/cxa/cxa4027.a: New file. + * ada/acats-2/tests/cxa/cxa4028.a: New file. + * ada/acats-2/tests/cxa/cxa4029.a: New file. + * ada/acats-2/tests/cxa/cxa4030.a: New file. + * ada/acats-2/tests/cxa/cxa4031.a: New file. + * ada/acats-2/tests/cxa/cxa4032.a: New file. + * ada/acats-2/tests/cxa/cxa4033.a: New file. + * ada/acats-2/tests/cxa/cxa4034.a: New file. + * ada/acats-2/tests/cxa/cxa5011.a: New file. + * ada/acats-2/tests/cxa/cxa5012.a: New file. + * ada/acats-2/tests/cxa/cxa5013.a: New file. + * ada/acats-2/tests/cxa/cxa5015.a: New file. + * ada/acats-2/tests/cxa/cxa5a01.a: New file. + * ada/acats-2/tests/cxa/cxa5a02.a: New file. + * ada/acats-2/tests/cxa/cxa5a03.a: New file. + * ada/acats-2/tests/cxa/cxa5a04.a: New file. + * ada/acats-2/tests/cxa/cxa5a05.a: New file. + * ada/acats-2/tests/cxa/cxa5a06.a: New file. + * ada/acats-2/tests/cxa/cxa5a07.a: New file. + * ada/acats-2/tests/cxa/cxa5a08.a: New file. + * ada/acats-2/tests/cxa/cxa5a09.a: New file. + * ada/acats-2/tests/cxa/cxa5a10.a: New file. + * ada/acats-2/tests/cxa/cxa8001.a: New file. + * ada/acats-2/tests/cxa/cxa8002.a: New file. + * ada/acats-2/tests/cxa/cxa8003.a: New file. + * ada/acats-2/tests/cxa/cxa9001.a: New file. + * ada/acats-2/tests/cxa/cxa9002.a: New file. + * ada/acats-2/tests/cxa/cxaa001.a: New file. + * ada/acats-2/tests/cxa/cxaa002.a: New file. + * ada/acats-2/tests/cxa/cxaa003.a: New file. + * ada/acats-2/tests/cxa/cxaa004.a: New file. + * ada/acats-2/tests/cxa/cxaa005.a: New file. + * ada/acats-2/tests/cxa/cxaa006.a: New file. + * ada/acats-2/tests/cxa/cxaa007.a: New file. + * ada/acats-2/tests/cxa/cxaa008.a: New file. + * ada/acats-2/tests/cxa/cxaa009.a: New file. + * ada/acats-2/tests/cxa/cxaa010.a: New file. + * ada/acats-2/tests/cxa/cxaa011.a: New file. + * ada/acats-2/tests/cxa/cxaa012.a: New file. + * ada/acats-2/tests/cxa/cxaa013.a: New file. + * ada/acats-2/tests/cxa/cxaa014.a: New file. + * ada/acats-2/tests/cxa/cxaa015.a: New file. + * ada/acats-2/tests/cxa/cxaa016.a: New file. + * ada/acats-2/tests/cxa/cxaa017.a: New file. + * ada/acats-2/tests/cxa/cxaa018.a: New file. + * ada/acats-2/tests/cxa/cxaa019.a: New file. + * ada/acats-2/tests/cxa/cxab001.a: New file. + * ada/acats-2/tests/cxa/cxac001.a: New file. + * ada/acats-2/tests/cxa/cxac002.a: New file. + * ada/acats-2/tests/cxa/cxac003.a: New file. + * ada/acats-2/tests/cxa/cxac004.a: New file. + * ada/acats-2/tests/cxa/cxac005.a: New file. + * ada/acats-2/tests/cxa/cxaca01.a: New file. + * ada/acats-2/tests/cxa/cxaca02.a: New file. + * ada/acats-2/tests/cxa/cxacb01.a: New file. + * ada/acats-2/tests/cxa/cxacb02.a: New file. + * ada/acats-2/tests/cxa/cxacc01.a: New file. + * ada/acats-2/tests/cxa/cxaf001.a: New file. + * ada/acats-2/tests/cxb/cxb2001.a: New file. + * ada/acats-2/tests/cxb/cxb2002.a: New file. + * ada/acats-2/tests/cxb/cxb2003.a: New file. + * ada/acats-2/tests/cxb/cxb3001.a: New file. + * ada/acats-2/tests/cxb/cxb3002.a: New file. + * ada/acats-2/tests/cxb/cxb3003.a: New file. + * ada/acats-2/tests/cxb/cxb30040.c: New file. + * ada/acats-2/tests/cxb/cxb30041.am: New file. + * ada/acats-2/tests/cxb/cxb3005.a: New file. + * ada/acats-2/tests/cxb/cxb30060.c: New file. + * ada/acats-2/tests/cxb/cxb30061.am: New file. + * ada/acats-2/tests/cxb/cxb3007.a: New file. + * ada/acats-2/tests/cxb/cxb3008.a: New file. + * ada/acats-2/tests/cxb/cxb3009.a: New file. + * ada/acats-2/tests/cxb/cxb3010.a: New file. + * ada/acats-2/tests/cxb/cxb3011.a: New file. + * ada/acats-2/tests/cxb/cxb3012.a: New file. + * ada/acats-2/tests/cxb/cxb30130.c: New file. + * ada/acats-2/tests/cxb/cxb30131.c: New file. + * ada/acats-2/tests/cxb/cxb30132.am: New file. + * ada/acats-2/tests/cxb/cxb3014.a: New file. + * ada/acats-2/tests/cxb/cxb3015.a: New file. + * ada/acats-2/tests/cxb/cxb3016.a: New file. + * ada/acats-2/tests/cxb/cxb4001.a: New file. + * ada/acats-2/tests/cxb/cxb4002.a: New file. + * ada/acats-2/tests/cxb/cxb4003.a: New file. + * ada/acats-2/tests/cxb/cxb4004.a: New file. + * ada/acats-2/tests/cxb/cxb4005.a: New file. + * ada/acats-2/tests/cxb/cxb4006.a: New file. + * ada/acats-2/tests/cxb/cxb4007.a: New file. + * ada/acats-2/tests/cxb/cxb4008.a: New file. + * ada/acats-2/tests/cxb/cxb5001.a: New file. + * ada/acats-2/tests/cxb/cxb5002.a: New file. + * ada/acats-2/tests/cxb/cxb5003.a: New file. + * ada/acats-2/tests/cxf/cxf1001.a: New file. + * ada/acats-2/tests/cxf/cxf2001.a: New file. + * ada/acats-2/tests/cxf/cxf2002.a: New file. + * ada/acats-2/tests/cxf/cxf2003.a: New file. + * ada/acats-2/tests/cxf/cxf2004.a: New file. + * ada/acats-2/tests/cxf/cxf2005.a: New file. + * ada/acats-2/tests/cxf/cxf2a01.a: New file. + * ada/acats-2/tests/cxf/cxf2a02.a: New file. + * ada/acats-2/tests/cxf/cxf3001.a: New file. + * ada/acats-2/tests/cxf/cxf3002.a: New file. + * ada/acats-2/tests/cxf/cxf3003.a: New file. + * ada/acats-2/tests/cxf/cxf3004.a: New file. + * ada/acats-2/tests/cxf/cxf3a01.a: New file. + * ada/acats-2/tests/cxf/cxf3a02.a: New file. + * ada/acats-2/tests/cxf/cxf3a03.a: New file. + * ada/acats-2/tests/cxf/cxf3a04.a: New file. + * ada/acats-2/tests/cxf/cxf3a05.a: New file. + * ada/acats-2/tests/cxf/cxf3a06.a: New file. + * ada/acats-2/tests/cxf/cxf3a07.a: New file. + * ada/acats-2/tests/cxf/cxf3a08.a: New file. + * ada/acats-2/tests/cxg/cxg1001.a: New file. + * ada/acats-2/tests/cxg/cxg1002.a: New file. + * ada/acats-2/tests/cxg/cxg1003.a: New file. + * ada/acats-2/tests/cxg/cxg1004.a: New file. + * ada/acats-2/tests/cxg/cxg1005.a: New file. + * ada/acats-2/tests/cxg/cxg2001.a: New file. + * ada/acats-2/tests/cxg/cxg2002.a: New file. + * ada/acats-2/tests/cxg/cxg2003.a: New file. + * ada/acats-2/tests/cxg/cxg2004.a: New file. + * ada/acats-2/tests/cxg/cxg2005.a: New file. + * ada/acats-2/tests/cxg/cxg2006.a: New file. + * ada/acats-2/tests/cxg/cxg2007.a: New file. + * ada/acats-2/tests/cxg/cxg2008.a: New file. + * ada/acats-2/tests/cxg/cxg2009.a: New file. + * ada/acats-2/tests/cxg/cxg2010.a: New file. + * ada/acats-2/tests/cxg/cxg2011.a: New file. + * ada/acats-2/tests/cxg/cxg2012.a: New file. + * ada/acats-2/tests/cxg/cxg2013.a: New file. + * ada/acats-2/tests/cxg/cxg2014.a: New file. + * ada/acats-2/tests/cxg/cxg2015.a: New file. + * ada/acats-2/tests/cxg/cxg2016.a: New file. + * ada/acats-2/tests/cxg/cxg2017.a: New file. + * ada/acats-2/tests/cxg/cxg2018.a: New file. + * ada/acats-2/tests/cxg/cxg2019.a: New file. + * ada/acats-2/tests/cxg/cxg2020.a: New file. + * ada/acats-2/tests/cxg/cxg2021.a: New file. + * ada/acats-2/tests/cxg/cxg2022.a: New file. + * ada/acats-2/tests/cxg/cxg2023.a: New file. + * ada/acats-2/tests/cxg/cxg2024.a: New file. + * ada/acats-2/tests/cxh/cxh3001.a: New file. + * ada/acats-2/tests/cxh/cxh3002.a: New file. + * ada/acats-2/tests/cxh/cxh30030.a: New file. + * ada/acats-2/tests/cxh/cxh30031.am: New file. + * ada/acats-2/tests/cz/cz1101a.ada: New file. + * ada/acats-2/tests/cz/cz1102a.ada: New file. + * ada/acats-2/tests/cz/cz1103a.ada: New file. + * ada/acats-2/tests/d/d4a002a.ada: New file. + * ada/acats-2/tests/d/d4a002b.ada: New file. + * ada/acats-2/tests/d/d4a004a.ada: New file. + * ada/acats-2/tests/d/d4a004b.ada: New file. + * ada/acats-2/tests/e/e28002b.ada: New file. + * ada/acats-2/tests/e/e28005d.ada: New file. + * ada/acats-2/tests/e/e52103y.ada: New file. + * ada/acats-2/tests/e/eb4011a.ada: New file. + * ada/acats-2/tests/e/eb4012a.ada: New file. + * ada/acats-2/tests/e/eb4014a.ada: New file. + * ada/acats-2/tests/e/ee3203a.ada: New file. + * ada/acats-2/tests/e/ee3204a.ada: New file. + * ada/acats-2/tests/e/ee3402b.ada: New file. + * ada/acats-2/tests/e/ee3409f.ada: New file. + * ada/acats-2/tests/e/ee3412c.ada: New file. + * ada/acats-2/tests/l/la140010.a: New file. + * ada/acats-2/tests/l/la140011.am: New file. + * ada/acats-2/tests/l/la140012.a: New file. + * ada/acats-2/tests/l/la140020.a: New file. + * ada/acats-2/tests/l/la140021.am: New file. + * ada/acats-2/tests/l/la140022.a: New file. + * ada/acats-2/tests/l/la140030.a: New file. + * ada/acats-2/tests/l/la140031.a: New file. + * ada/acats-2/tests/l/la140032.am: New file. + * ada/acats-2/tests/l/la140033.a: New file. + * ada/acats-2/tests/l/la140040.a: New file. + * ada/acats-2/tests/l/la140041.am: New file. + * ada/acats-2/tests/l/la140042.a: New file. + * ada/acats-2/tests/l/la140050.a: New file. + * ada/acats-2/tests/l/la140051.a: New file. + * ada/acats-2/tests/l/la140052.am: New file. + * ada/acats-2/tests/l/la140053.a: New file. + * ada/acats-2/tests/l/la140060.a: New file. + * ada/acats-2/tests/l/la140061.a: New file. + * ada/acats-2/tests/l/la140062.am: New file. + * ada/acats-2/tests/l/la140063.a: New file. + * ada/acats-2/tests/l/la140070.a: New file. + * ada/acats-2/tests/l/la140071.a: New file. + * ada/acats-2/tests/l/la140072.am: New file. + * ada/acats-2/tests/l/la140073.a: New file. + * ada/acats-2/tests/l/la140080.a: New file. + * ada/acats-2/tests/l/la140081.a: New file. + * ada/acats-2/tests/l/la140082.am: New file. + * ada/acats-2/tests/l/la140083.a: New file. + * ada/acats-2/tests/l/la140090.a: New file. + * ada/acats-2/tests/l/la140091.a: New file. + * ada/acats-2/tests/l/la140092.am: New file. + * ada/acats-2/tests/l/la140093.a: New file. + * ada/acats-2/tests/l/la140100.a: New file. + * ada/acats-2/tests/l/la140101.a: New file. + * ada/acats-2/tests/l/la140102.am: New file. + * ada/acats-2/tests/l/la140103.a: New file. + * ada/acats-2/tests/l/la140110.a: New file. + * ada/acats-2/tests/l/la140111.a: New file. + * ada/acats-2/tests/l/la140112.am: New file. + * ada/acats-2/tests/l/la140113.a: New file. + * ada/acats-2/tests/l/la140120.a: New file. + * ada/acats-2/tests/l/la140121.a: New file. + * ada/acats-2/tests/l/la140122.am: New file. + * ada/acats-2/tests/l/la140123.a: New file. + * ada/acats-2/tests/l/la140130.a: New file. + * ada/acats-2/tests/l/la140131.a: New file. + * ada/acats-2/tests/l/la140132.am: New file. + * ada/acats-2/tests/l/la140133.a: New file. + * ada/acats-2/tests/l/la140140.a: New file. + * ada/acats-2/tests/l/la140141.a: New file. + * ada/acats-2/tests/l/la140142.am: New file. + * ada/acats-2/tests/l/la140143.a: New file. + * ada/acats-2/tests/l/la140150.a: New file. + * ada/acats-2/tests/l/la140151.a: New file. + * ada/acats-2/tests/l/la140152.am: New file. + * ada/acats-2/tests/l/la140153.a: New file. + * ada/acats-2/tests/l/la140160.a: New file. + * ada/acats-2/tests/l/la140161.a: New file. + * ada/acats-2/tests/l/la140162.am: New file. + * ada/acats-2/tests/l/la140163.a: New file. + * ada/acats-2/tests/l/la140170.a: New file. + * ada/acats-2/tests/l/la140171.a: New file. + * ada/acats-2/tests/l/la140172.am: New file. + * ada/acats-2/tests/l/la140173.a: New file. + * ada/acats-2/tests/l/la140180.a: New file. + * ada/acats-2/tests/l/la140181.a: New file. + * ada/acats-2/tests/l/la140182.am: New file. + * ada/acats-2/tests/l/la140183.a: New file. + * ada/acats-2/tests/l/la140190.a: New file. + * ada/acats-2/tests/l/la140191.a: New file. + * ada/acats-2/tests/l/la140192.am: New file. + * ada/acats-2/tests/l/la140193.a: New file. + * ada/acats-2/tests/l/la140200.a: New file. + * ada/acats-2/tests/l/la140201.a: New file. + * ada/acats-2/tests/l/la140202.am: New file. + * ada/acats-2/tests/l/la140203.a: New file. + * ada/acats-2/tests/l/la140210.a: New file. + * ada/acats-2/tests/l/la140211.am: New file. + * ada/acats-2/tests/l/la140212.a: New file. + * ada/acats-2/tests/l/la140220.a: New file. + * ada/acats-2/tests/l/la140221.am: New file. + * ada/acats-2/tests/l/la140222.a: New file. + * ada/acats-2/tests/l/la140240.a: New file. + * ada/acats-2/tests/l/la140241.a: New file. + * ada/acats-2/tests/l/la140242.am: New file. + * ada/acats-2/tests/l/la140243.a: New file. + * ada/acats-2/tests/l/la140250.a: New file. + * ada/acats-2/tests/l/la140251.am: New file. + * ada/acats-2/tests/l/la140252.a: New file. + * ada/acats-2/tests/l/la140260.a: New file. + * ada/acats-2/tests/l/la140261.a: New file. + * ada/acats-2/tests/l/la140262.am: New file. + * ada/acats-2/tests/l/la140263.a: New file. + * ada/acats-2/tests/l/la140270.a: New file. + * ada/acats-2/tests/l/la140271.a: New file. + * ada/acats-2/tests/l/la140272.am: New file. + * ada/acats-2/tests/l/la140273.a: New file. + +2025-05-24 Pan Li <pan2.li@intel.com> + + * gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i16.c: Add asm check + for vor.vx combine. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i16.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i16.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c: Ditto. + +2025-05-24 Pan Li <pan2.li@intel.com> + + * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i16.c: Add test cases + for vor vx combine case 0 on GR2VR cost. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i16.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i16.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c: Ditto. + * gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h: Add test + data for vor.vx run test. + * gcc.target/riscv/rvv/autovec/vx_vf/vx_vor-run-1-i16.c: New test. + * gcc.target/riscv/rvv/autovec/vx_vf/vx_vor-run-1-i32.c: New test. + * gcc.target/riscv/rvv/autovec/vx_vf/vx_vor-run-1-i64.c: New test. + * gcc.target/riscv/rvv/autovec/vx_vf/vx_vor-run-1-i8.c: New test. + * gcc.target/riscv/rvv/autovec/vx_vf/vx_vor-run-1-u16.c: New test. + * gcc.target/riscv/rvv/autovec/vx_vf/vx_vor-run-1-u32.c: New test. + * gcc.target/riscv/rvv/autovec/vx_vf/vx_vor-run-1-u64.c: New test. + * gcc.target/riscv/rvv/autovec/vx_vf/vx_vor-run-1-u8.c: New test. + 2025-05-23 Nathaniel Shead <nathanieloshead@gmail.com> PR c++/120363 diff --git a/gcc/testsuite/c-c++-common/gomp/attrs-metadirective-3.c b/gcc/testsuite/c-c++-common/gomp/attrs-metadirective-3.c index 31dd054..803bf0a 100644 --- a/gcc/testsuite/c-c++-common/gomp/attrs-metadirective-3.c +++ b/gcc/testsuite/c-c++-common/gomp/attrs-metadirective-3.c @@ -9,7 +9,7 @@ f (int x[], int y[], int z[]) { int i; - [[omp::sequence (directive (target map(to: x, y) map(from: z)), + [[omp::sequence (directive (target map(to: x, y) map(from: z)), /* { dg-bogus "'target' construct with nested 'teams' construct contains directives outside of the 'teams' construct" "PR118694" { xfail offload_nvptx } } */ directive (metadirective when (device={arch("nvptx")}: teams loop) default (parallel loop)))]] @@ -20,5 +20,6 @@ f (int x[], int y[], int z[]) /* If offload device "nvptx" isn't supported, the front end can eliminate that alternative and not produce a metadirective at all. Otherwise this won't be resolved until late. */ -/* { dg-final { scan-tree-dump-not "#pragma omp metadirective" "gimple" { target { ! offload_nvptx } } } } */ -/* { dg-final { scan-tree-dump "#pragma omp metadirective" "gimple" { target { offload_nvptx } } } } */ +/* { dg-final { scan-tree-dump-not "#pragma omp metadirective" "gimple" } } */ +/* { dg-final { scan-tree-dump-not " teams" "gimple" { target { ! offload_nvptx } } } } */ +/* { dg-final { scan-tree-dump "variant.\[0-9\]+ = \\\[omp_next_variant\\\] OMP_NEXT_VARIANT <0,\[\r\n \]+construct context = 14\[\r\n \]+1: device = \\{arch \\(.nvptx.\\)\\}\[\r\n \]+2: >;" "gimple" { target { offload_nvptx } } } } */ diff --git a/gcc/testsuite/c-c++-common/gomp/metadirective-3.c b/gcc/testsuite/c-c++-common/gomp/metadirective-3.c index 0ac0d1d..b6c1601 100644 --- a/gcc/testsuite/c-c++-common/gomp/metadirective-3.c +++ b/gcc/testsuite/c-c++-common/gomp/metadirective-3.c @@ -8,7 +8,7 @@ f (int x[], int y[], int z[]) { int i; - #pragma omp target map(to: x, y) map(from: z) + #pragma omp target map(to: x, y) map(from: z) /* { dg-bogus "'target' construct with nested 'teams' construct contains directives outside of the 'teams' construct" "PR118694" { xfail offload_nvptx } } */ #pragma omp metadirective \ when (device={arch("nvptx")}: teams loop) \ default (parallel loop) @@ -19,5 +19,6 @@ f (int x[], int y[], int z[]) /* If offload device "nvptx" isn't supported, the front end can eliminate that alternative and not produce a metadirective at all. Otherwise this won't be resolved until late. */ -/* { dg-final { scan-tree-dump-not "#pragma omp metadirective" "gimple" { target { ! offload_nvptx } } } } */ -/* { dg-final { scan-tree-dump "#pragma omp metadirective" "gimple" { target { offload_nvptx } } } } */ +/* { dg-final { scan-tree-dump-not "#pragma omp metadirective" "gimple" } } */ +/* { dg-final { scan-tree-dump-not " teams" "gimple" { target { ! offload_nvptx } } } } */ +/* { dg-final { scan-tree-dump "variant.\[0-9\]+ = \\\[omp_next_variant\\\] OMP_NEXT_VARIANT <0,\[\r\n \]+construct context = 14\[\r\n \]+1: device = \\{arch \\(.nvptx.\\)\\}\[\r\n \]+2: >;" "gimple" { target { offload_nvptx } } } } */ diff --git a/gcc/testsuite/g++.dg/ext/is_destructible1.C b/gcc/testsuite/g++.dg/ext/is_destructible1.C new file mode 100644 index 0000000..994c388 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_destructible1.C @@ -0,0 +1,60 @@ +// PR c++/107600 +// { dg-do compile { target c++11 } } + +#define SA(X) static_assert ((X), #X) + +namespace N1 { + struct A { ~A() = delete; }; + + SA (!__is_destructible (A)); + SA (!__is_nothrow_destructible (A)); + SA (!__is_trivially_destructible (A)); + + bool b = __has_trivial_destructor (A); // { dg-message "has_trivial_destructor" } +} + +namespace N2 { + struct A { protected: ~A() = default; }; + + SA (!__is_destructible (A)); + SA (!__is_nothrow_destructible (A)); + SA (!__is_trivially_destructible (A)); + SA (__has_trivial_destructor (A)); +} + +namespace N3 { + struct A { ~A(); }; + + SA (__is_destructible (A)); + SA (__is_nothrow_destructible (A)); + SA (!__is_trivially_destructible (A)); + SA (!__has_trivial_destructor (A)); +} + +namespace N4 { + struct A { ~A() noexcept (false); }; + + SA (__is_destructible (A)); + SA (!__is_nothrow_destructible (A)); + SA (!__is_trivially_destructible (A)); + SA (!__has_trivial_destructor (A)); +} + +namespace N5 { + struct A { ~A() = default; }; + + SA (__is_destructible (A)); + SA (__is_nothrow_destructible (A)); + SA (__is_trivially_destructible (A)); + SA (__has_trivial_destructor (A)); +} + +namespace N6 { + struct A { }; + + SA (__is_destructible (A)); + SA (__is_nothrow_destructible (A)); + SA (__is_trivially_destructible (A)); + SA (__has_trivial_destructor (A)); +} + diff --git a/gcc/testsuite/g++.dg/gomp/target-4.C b/gcc/testsuite/g++.dg/gomp/target-4.C new file mode 100644 index 0000000..80fc9df --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/target-4.C @@ -0,0 +1,22 @@ +// { dg-do compile { target c++11 } } +// PR c++/120413 + +struct S +{ + S() {} + ~S() {} +}; + +struct array +{ + S _arr[1]; +}; + +int main() +{ +#pragma omp target + { + array arr{}; + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/modules/namespace-10_a.C b/gcc/testsuite/g++.dg/modules/namespace-10_a.C new file mode 100644 index 0000000..c67c93a --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/namespace-10_a.C @@ -0,0 +1,11 @@ +// { dg-additional-options -fmodules } + +export module M1; + +namespace A +{ + export using AT = int; +} + +export using namespace A; +inline AT var; diff --git a/gcc/testsuite/g++.dg/modules/namespace-10_b.C b/gcc/testsuite/g++.dg/modules/namespace-10_b.C new file mode 100644 index 0000000..5a3558d --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/namespace-10_b.C @@ -0,0 +1,9 @@ +// { dg-additional-options "-fmodules" } + +export module M2; +import M1; + +namespace A +{ + export using A::AT; +} diff --git a/gcc/testsuite/g++.dg/modules/namespace-10_c.C b/gcc/testsuite/g++.dg/modules/namespace-10_c.C new file mode 100644 index 0000000..aee00bd --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/namespace-10_c.C @@ -0,0 +1,6 @@ +// { dg-additional-options -fmodules } + +import M2; + +A::AT var1; +AT var2; // { dg-error "AT" } diff --git a/gcc/testsuite/g++.dg/modules/namespace-11_a.C b/gcc/testsuite/g++.dg/modules/namespace-11_a.C new file mode 100644 index 0000000..c67c93a --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/namespace-11_a.C @@ -0,0 +1,11 @@ +// { dg-additional-options -fmodules } + +export module M1; + +namespace A +{ + export using AT = int; +} + +export using namespace A; +inline AT var; diff --git a/gcc/testsuite/g++.dg/modules/namespace-11_b.C b/gcc/testsuite/g++.dg/modules/namespace-11_b.C new file mode 100644 index 0000000..c0e0b9e --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/namespace-11_b.C @@ -0,0 +1,9 @@ +// { dg-additional-options "-fmodules" } + +export module M2; +export import M1; + +namespace A +{ + export using A::AT; +} diff --git a/gcc/testsuite/g++.dg/modules/namespace-11_c.C b/gcc/testsuite/g++.dg/modules/namespace-11_c.C new file mode 100644 index 0000000..e12a8ae --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/namespace-11_c.C @@ -0,0 +1,6 @@ +// { dg-additional-options -fmodules } + +import M2; + +A::AT var1; +AT var2; diff --git a/gcc/testsuite/g++.dg/modules/namespace-8_a.C b/gcc/testsuite/g++.dg/modules/namespace-8_a.C new file mode 100644 index 0000000..67ffc6a --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/namespace-8_a.C @@ -0,0 +1,12 @@ +// { dg-additional-options "-fmodules" } + +export module M; + +export namespace B +{ + int i; +} +export namespace C +{ + using namespace B; +} diff --git a/gcc/testsuite/g++.dg/modules/namespace-8_b.C b/gcc/testsuite/g++.dg/modules/namespace-8_b.C new file mode 100644 index 0000000..7db35bf --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/namespace-8_b.C @@ -0,0 +1,8 @@ +// { dg-additional-options "-fmodules" } + +import M; + +int main() +{ + C::i = 42; +} diff --git a/gcc/testsuite/g++.dg/modules/namespace-9_a.C b/gcc/testsuite/g++.dg/modules/namespace-9_a.C new file mode 100644 index 0000000..4cc3ab0 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/namespace-9_a.C @@ -0,0 +1,11 @@ +// { dg-additional-options -fmodules } + +export module M; + +namespace A +{ + export using AT = int; +} + +using namespace A; +inline AT var; diff --git a/gcc/testsuite/g++.dg/modules/namespace-9_b.C b/gcc/testsuite/g++.dg/modules/namespace-9_b.C new file mode 100644 index 0000000..05bb300 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/namespace-9_b.C @@ -0,0 +1,6 @@ +// { dg-additional-options -fmodules } + +import M; + +A::AT var1; +AT var2; // { dg-error "AT" } diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr117965-1.C b/gcc/testsuite/g++.dg/tree-ssa/pr117965-1.C new file mode 100644 index 0000000..84f0f2b --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr117965-1.C @@ -0,0 +1,28 @@ +// { dg-do compile } +// { dg-options "-O2 -fdump-tree-phiopt1" } + +void f(); +void f(int&); + +static inline const int & +clamp(const int &v, const int &min, const int &max) +{ + const int &t = (v > min) ? v : min; + return t > max ? max : t; +} + +void clamp2(int num1) { + try { + int low = -12, high = 12; + f(); + num1 = clamp(num1, low, high); + f(num1); + } catch(...) + { + __builtin_printf("caught.\n"); + return; + } +} + +// { dg-final { scan-tree-dump-times "MAX" 1 "phiopt1" } } */ +// { dg-final { scan-tree-dump-times "MIN" 1 "phiopt1" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr117965-2.C b/gcc/testsuite/g++.dg/tree-ssa/pr117965-2.C new file mode 100644 index 0000000..3e94fb3 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr117965-2.C @@ -0,0 +1,19 @@ +// { dg-do compile { target c++17 } } +// { dg-options "-O2 -fdump-tree-phiopt1" } + +#include <iostream> +#include <algorithm> + +void clamp2 () +{ + float low = -1.0f, high = 1.0f; + float num1, num2, num3; + std::cin >> num1; + num1 = std::clamp(num1, low, high); + std::cout << num1; +} + +// { dg-final { scan-tree-dump-times " < -1.0" 1 "phiopt1" } } +// { dg-final { scan-tree-dump-times " \\\? -1.0e\\\+0 : " 1 "phiopt1" } } +// { dg-final { scan-tree-dump-times " > 1.0" 1 "phiopt1" } } +// { dg-final { scan-tree-dump-times " \\\? 1.0e\\\+0 : " 1 "phiopt1" } } diff --git a/gcc/testsuite/gcc.dg/countof-compat.c b/gcc/testsuite/gcc.dg/countof-compat.c new file mode 100644 index 0000000..ab5b4ae --- /dev/null +++ b/gcc/testsuite/gcc.dg/countof-compat.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c2y -pedantic-errors -Wc23-c2y-compat" } */ + +#include <stdcountof.h> + +int a[1]; +int b[countof(a)]; +int c[_Countof(a)]; /* { dg-warning "ISO C does not support" } */ diff --git a/gcc/testsuite/gcc.dg/countof-compile.c b/gcc/testsuite/gcc.dg/countof-compile.c new file mode 100644 index 0000000..afd5659 --- /dev/null +++ b/gcc/testsuite/gcc.dg/countof-compile.c @@ -0,0 +1,124 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c2y -pedantic-errors" } */ + +#define NULL ((void *) 0) + +extern int x[]; + +static int w[] = {1, 2, 3}; + +void +completed (void) +{ + int i = 42; + int a[] = {1, 2, i}; + + _Static_assert(_Countof (w) == 3); + _Static_assert(_Countof (a) == 3); +} + +void +incomplete (int p[]) +{ + _Countof (x); /* { dg-error "incomplete" } */ + + /* We want to support array parameters in the future, + which should change this from "invalid" to "incomplete". */ + _Countof (p); /* { dg-error "invalid" } */ +} + +void +fam (void) +{ + struct { + int x; + int fam[]; + } s; + + _Countof (s.fam); /* { dg-error "incomplete" } */ +} + +void +param (int n, int p[n]) +{ + /* We want to support array parameters in the future, + which would make this work. */ + _Countof (p); /* { dg-error "invalid" } */ +} + +void fix_fix (int i, char (*a)[3][5], int (*x)[_Countof (*a)], + short (*)[_Generic(x, int (*)[3]: 1)]); +void fix_var (int i, char (*a)[3][i], int (*x)[_Countof (*a)], + short (*)[_Generic(x, int (*)[3]: 1)]); +void fix_uns (int i, char (*a)[3][*], int (*x)[_Countof (*a)], + short (*)[_Generic(x, int (*)[3]: 1)]); + +void +func (void) +{ + int i3[3]; + int i5[5]; + char c35[3][5]; + + fix_fix (5, &c35, &i3, NULL); + fix_fix (5, &c35, &i5, NULL); /* { dg-error "incompatible-pointer-types" } */ + + fix_var (5, &c35, &i3, NULL); + fix_var (5, &c35, &i5, NULL); /* { dg-error "incompatible-pointer-types" } */ + + fix_uns (5, &c35, &i3, NULL); + fix_uns (5, &c35, &i5, NULL); /* { dg-error "incompatible-pointer-types" } */ +} + +void +non_arr(void) +{ + int x; + int *p; + struct s { + int x[3]; + } s; + + _Countof (x); /* { dg-error "invalid" } */ + _Countof (int); /* { dg-error "invalid" } */ + _Countof (s); /* { dg-error "invalid" } */ + _Countof (struct s); /* { dg-error "invalid" } */ + _Countof (&x); /* { dg-error "invalid" } */ + _Countof (p); /* { dg-error "invalid" } */ + _Countof (int *); /* { dg-error "invalid" } */ + _Countof (&s.x); /* { dg-error "invalid" } */ + _Countof (int (*)[3]); /* { dg-error "invalid" } */ +} + +static int f1(); +static int f2(); /* { dg-error "never defined" } */ +int a[10][9]; +int n; + +void +syms(void) +{ + int b[n][n]; + + _Countof (a[f1()]); + _Countof (b[f2()]); +} + +void +no_parens(void) +{ + _Static_assert(_Countof a == 10); + _Static_assert(_Countof *a == 9); + _Static_assert(_Countof (int [3]) {} == 3); + + _Countof int [3]; /* { dg-error "expected expression before" } */ +} + +void +const_expr(void) +{ + int n = 7; + + _Static_assert (_Countof (int [3][n]) == 3); + _Static_assert (_Countof (int [n][3]) == 7); /* { dg-error "not constant" } */ +} diff --git a/gcc/testsuite/gcc.dg/countof-no-compat.c b/gcc/testsuite/gcc.dg/countof-no-compat.c new file mode 100644 index 0000000..4a244cf --- /dev/null +++ b/gcc/testsuite/gcc.dg/countof-no-compat.c @@ -0,0 +1,5 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c23 -pedantic-errors -Wno-c23-c2y-compat" } */ + +int a[1]; +int b[_Countof(a)]; diff --git a/gcc/testsuite/gcc.dg/countof-pedantic-errors.c b/gcc/testsuite/gcc.dg/countof-pedantic-errors.c new file mode 100644 index 0000000..5d5bedb --- /dev/null +++ b/gcc/testsuite/gcc.dg/countof-pedantic-errors.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c23 -pedantic-errors" } */ + +#include <stdcountof.h> + +int a[1]; +int b[countof(a)]; +int c[_Countof(a)]; /* { dg-error "ISO C does not support" } */ diff --git a/gcc/testsuite/gcc.dg/countof-pedantic.c b/gcc/testsuite/gcc.dg/countof-pedantic.c new file mode 100644 index 0000000..408dc6f --- /dev/null +++ b/gcc/testsuite/gcc.dg/countof-pedantic.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c23 -pedantic" } */ + +#include <stdcountof.h> + +int a[1]; +int b[countof(a)]; +int c[_Countof(a)]; /* { dg-warning "ISO C does not support" } */ diff --git a/gcc/testsuite/gcc.dg/countof-stdcountof.c b/gcc/testsuite/gcc.dg/countof-stdcountof.c new file mode 100644 index 0000000..2fb0c63 --- /dev/null +++ b/gcc/testsuite/gcc.dg/countof-stdcountof.c @@ -0,0 +1,24 @@ +/* { dg-do run } */ +/* { dg-options "-std=c2y -pedantic-errors" } */ + +#include <stdcountof.h> + +#define assert(e) ((e) ? (void) 0 : __builtin_abort ()) + +extern int strcmp (const char *, const char *); + +#ifndef countof +#error "countof not defined" +#endif + +int a[3]; +int b[countof a]; + +#define str(x) #x +#define xstr(x) str(x) + +int +main (void) +{ + assert (strcmp (xstr(countof), "_Countof") == 0); +} diff --git a/gcc/testsuite/gcc.dg/countof-vla.c b/gcc/testsuite/gcc.dg/countof-vla.c new file mode 100644 index 0000000..cc225df --- /dev/null +++ b/gcc/testsuite/gcc.dg/countof-vla.c @@ -0,0 +1,35 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c2y -pedantic-errors -Wvla-parameter" } */ + +void fix_fix (int i, + char (*a)[3][5], + int (*x)[_Countof (*a)], + short (*)[_Generic(x, int (*)[3]: 1)]); +void fix_var (int i, + char (*a)[3][i], /* dg-warn "variable" */ + int (*x)[_Countof (*a)], + short (*)[_Generic(x, int (*)[3]: 1)]); +void fix_uns (int i, + char (*a)[3][*], + int (*x)[_Countof (*a)], + short (*)[_Generic(x, int (*)[3]: 1)]); + +void var_fix (int i, + char (*a)[i][5], /* dg-warn "variable" */ + int (*x)[_Countof (*a)]); /* dg-warn "variable" */ +void var_var (int i, + char (*a)[i][i], /* dg-warn "variable" */ + int (*x)[_Countof (*a)]); /* dg-warn "variable" */ +void var_uns (int i, + char (*a)[i][*], /* dg-warn "variable" */ + int (*x)[_Countof (*a)]); /* dg-warn "variable" */ + +void uns_fix (int i, + char (*a)[*][5], + int (*x)[_Countof (*a)]); +void uns_var (int i, + char (*a)[*][i], /* dg-warn "variable" */ + int (*x)[_Countof (*a)]); +void uns_uns (int i, + char (*a)[*][*], + int (*x)[_Countof (*a)]); diff --git a/gcc/testsuite/gcc.dg/countof-vmt.c b/gcc/testsuite/gcc.dg/countof-vmt.c new file mode 100644 index 0000000..67467b0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/countof-vmt.c @@ -0,0 +1,20 @@ +/* { dg-do run } */ +/* { dg-options "-std=gnu2y" } */ + +#define assert(e) ((e) ? (void) 0 : __builtin_abort ()) + +void +inner_vla_noeval (void) +{ + int i; + + i = 3; + static_assert (_Countof (struct {int x[i++];}[3]) == 3); + assert (i == 3); +} + +int +main (void) +{ + inner_vla_noeval (); +} diff --git a/gcc/testsuite/gcc.dg/countof-zero-compile.c b/gcc/testsuite/gcc.dg/countof-zero-compile.c new file mode 100644 index 0000000..b561186 --- /dev/null +++ b/gcc/testsuite/gcc.dg/countof-zero-compile.c @@ -0,0 +1,38 @@ +/* { dg-do compile } */ +/* { dg-options "-std=gnu2y" } */ + +static int z[0]; +static int y[_Countof (z)]; + +_Static_assert(_Countof (y) == 0); + +void +completed (void) +{ + int z[] = {}; + + static_assert (_Countof (z) == 0); +} + +void zro_fix (int i, + char (*a)[0][5], + int (*x)[_Countof (*a)], + short (*)[_Generic(x, int (*)[0]: 1)]); +void zro_var (int i, + char (*a)[0][i], /* dg-warn "variable" */ + int (*x)[_Countof (*a)], + short (*)[_Generic(x, int (*)[0]: 1)]); +void zro_uns (int i, + char (*a)[0][*], + int (*x)[_Countof (*a)], + short (*)[_Generic(x, int (*)[0]: 1)]); + +void +const_expr(void) +{ + int n = 7; + + _Static_assert (_Countof (int [0][3]) == 0); + _Static_assert (_Countof (int [0]) == 0); + _Static_assert (_Countof (int [0][n]) == 0); +} diff --git a/gcc/testsuite/gcc.dg/countof-zero.c b/gcc/testsuite/gcc.dg/countof-zero.c new file mode 100644 index 0000000..27b5bdd --- /dev/null +++ b/gcc/testsuite/gcc.dg/countof-zero.c @@ -0,0 +1,31 @@ +/* { dg-do run } */ +/* { dg-options "-std=gnu2y" } */ + +#define assert(e) ((e) ? (void) 0 : __builtin_abort ()) + +void +vla (void) +{ + unsigned n; + + n = 0; + int z[n]; + assert (_Countof (z) == 0); +} + +void +matrix_vla (void) +{ + int i; + + i = 0; + assert (_Countof (int [i++][4]) == 0); + assert (i == 0 + 1); +} + +int +main (void) +{ + vla (); + matrix_vla (); +} diff --git a/gcc/testsuite/gcc.dg/countof.c b/gcc/testsuite/gcc.dg/countof.c new file mode 100644 index 0000000..5344885 --- /dev/null +++ b/gcc/testsuite/gcc.dg/countof.c @@ -0,0 +1,120 @@ +/* { dg-do run } */ +/* { dg-options "-std=c2y -pedantic-errors" } */ + +#define assert(e) ((e) ? (void) 0 : __builtin_abort ()) + +void +array (void) +{ + short a[7]; + + static_assert (_Countof (a) == 7); + static_assert (_Countof (unsigned [99]) == 99); +} + +void +completed (void) +{ + int a[] = {1, 2, 3}; + + static_assert (_Countof (a) == 3); +} + +void +vla (void) +{ + unsigned n; + + n = 99; + assert (_Countof (short [n - 10]) == 99 - 10); + + int v[n / 2]; + assert (_Countof (v) == 99 / 2); +} + +void +member (void) +{ + struct { + int a[8]; + } s; + + static_assert (_Countof (s.a) == 8); +} + +void +vla_eval (void) +{ + int i; + + i = 7; + assert (_Countof (struct {int x;}[i++]) == 7); + assert (i == 7 + 1); + + int v[i]; + int (*p)[i]; + p = &v; + assert (_Countof (*p++) == i); + assert (p - 1 == &v); +} + +void +array_noeval (void) +{ + long a[5]; + long (*p)[_Countof (a)]; + + p = &a; + static_assert (_Countof (*p++) == 5); + assert (p == &a); +} + +void +matrix_fixed (void) +{ + int i; + + static_assert (_Countof (int [7][4]) == 7); + i = 3; + static_assert (_Countof (int [7][i]) == 7); +} + +void +matrix_vla (void) +{ + int i, j; + + i = 7; + assert (_Countof (int [i++][4]) == 7); + assert (i == 7 + 1); + + i = 9; + j = 3; + assert (_Countof (int [i++][j]) == 9); + assert (i == 9 + 1); +} + +void +no_parens(void) +{ + int n = 3; + int a[7]; + int v[n]; + + static_assert (_Countof a == 7); + assert (_Countof v == 3); +} + +int +main (void) +{ + array (); + completed (); + vla (); + member (); + vla_eval (); + array_noeval (); + matrix_fixed (); + matrix_vla (); + no_parens (); +} diff --git a/gcc/testsuite/gcc.dg/html-output/missing-semicolon.c b/gcc/testsuite/gcc.dg/html-output/missing-semicolon.c index c211f4f..fe5f081 100644 --- a/gcc/testsuite/gcc.dg/html-output/missing-semicolon.c +++ b/gcc/testsuite/gcc.dg/html-output/missing-semicolon.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-fdiagnostics-add-output=experimental-html" } */ +/* { dg-options "-fdiagnostics-add-output=experimental-html:javascript=no" } */ /* Verify that basics of HTML output work. */ diff --git a/gcc/testsuite/gcc.dg/html-output/missing-semicolon.py b/gcc/testsuite/gcc.dg/html-output/missing-semicolon.py index 8ac1f14..02ff84c 100644 --- a/gcc/testsuite/gcc.dg/html-output/missing-semicolon.py +++ b/gcc/testsuite/gcc.dg/html-output/missing-semicolon.py @@ -18,12 +18,6 @@ import pytest def html_tree(): return html_tree_from_env() -XHTML = 'http://www.w3.org/1999/xhtml' -ns = {'xhtml': XHTML} - -def make_tag(local_name): - return f'{{{XHTML}}}' + local_name - def test_basics(html_tree): root = html_tree.getroot () assert root.tag == make_tag('html') diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-html.c b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-html.c index 2499e8d..df57b25 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-html.c +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-html.c @@ -1,6 +1,6 @@ /* { dg-do compile } */ -/* { dg-options "-fdiagnostics-set-output=experimental-html" } */ -/* { dg-additional-options "-fdiagnostics-show-caret" } */ +/* { dg-options "-fdiagnostics-set-output=experimental-html:javascript=no" } */ +/* { dg-additional-options "-fdiagnostics-show-caret -fdiagnostics-show-line-numbers" } */ extern char *gets (char *s); diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-html.py b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-html.py index e475e95..b4c75b2 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-html.py +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-metadata-html.py @@ -8,12 +8,6 @@ import pytest def html_tree(): return html_tree_from_env() -XHTML = 'http://www.w3.org/1999/xhtml' -ns = {'xhtml': XHTML} - -def make_tag(local_name): - return f'{{{XHTML}}}' + local_name - def test_metadata(html_tree): root = html_tree.getroot () assert root.tag == make_tag('html') @@ -48,11 +42,21 @@ def test_metadata(html_tree): assert metadata[1][0].text == 'STR34-C' assert metadata[1][0].tail == ']' - src = diag.find('xhtml:pre', ns) - assert src.attrib['class'] == 'gcc-annotated-source' - assert src.text == ( - ' gets (buf);\n' - ' ^~~~~~~~~~\n') + src = diag.find('xhtml:table', ns) + assert src.attrib['class'] == 'locus' + + tbody = src.find('xhtml:tbody', ns) + assert tbody.attrib['class'] == 'line-span' + + rows = tbody.findall('xhtml:tr', ns) + + quoted_src_tr = rows[0] + assert_quoted_line(quoted_src_tr, + ' 10', ' gets (buf);') + + annotation_tr = rows[1] + assert_annotation_line(annotation_tr, + ' ^~~~~~~~~~') # For reference, here's the generated HTML: """ @@ -60,8 +64,13 @@ def test_metadata(html_tree): <div class="gcc-diagnostic-list"> <div class="gcc-diagnostic"> <span class="gcc-message">never use '<span class="gcc-quoted-text">gets</span>'</span> - <span class="gcc-metadata"><span class="gcc-metadata-item">[<a href="https://cwe.mitre.org/data/definitions/242.html">CWE-242</a>]</span><span class="gcc-metadata-item">[<a href="https://example.com/">STR34-C</a>]</span></span> - ...etc... + <span class="gcc-metadata"><span class="gcc-metadata-item">[<a href="https://cwe.mitre.org/data/definitions/242.html">CWE-242</a>]</span><span class="gcc-metadata-item">[<a href="https://example.com/">STR34-C</a>]</span></span><table class="locus"> +<tbody class="line-span"> +<tr><td class="linenum"> 10</td> <td class="source"> gets (buf);</td></tr> +<tr><td class="linenum"/><td class="annotation"> ^~~~~~~~~~</td></tr> +</tbody> +</table> + </div> </div> </body> diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.c b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.c index 26605f7..dab9c38 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.c +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-fdiagnostics-show-caret -fdiagnostics-show-line-numbers -fdiagnostics-path-format=inline-events -fdiagnostics-add-output=experimental-html" } */ +/* { dg-options "-fdiagnostics-show-caret -fdiagnostics-show-line-numbers -fdiagnostics-path-format=inline-events -fdiagnostics-add-output=experimental-html:javascript=no" } */ #include <stddef.h> #include <stdlib.h> diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.py b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.py index c212e49..59bee24 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.py +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-2.py @@ -8,12 +8,6 @@ import pytest def html_tree(): return html_tree_from_env() -XHTML = 'http://www.w3.org/1999/xhtml' -ns = {'xhtml': XHTML} - -def make_tag(local_name): - return f'{{{XHTML}}}' + local_name - def test_paths(html_tree): root = html_tree.getroot () assert root.tag == make_tag('html') @@ -29,7 +23,19 @@ def test_paths(html_tree): assert diag is not None assert diag.attrib['class'] == 'gcc-diagnostic' - pre = diag.findall('xhtml:pre', ns) - assert pre[0].attrib['class'] == 'gcc-annotated-source' - assert pre[1].attrib['class'] == 'gcc-execution-path' - assert pre[1].text.startswith(" 'make_a_list_of_random_ints_badly': events 1-3") + event_ranges = diag.find('xhtml:div', ns) + assert_class(event_ranges, 'event-ranges') + + frame_margin = event_ranges.find('xhtml:table', ns) + assert_class(frame_margin, 'stack-frame-with-margin') + + tr = frame_margin.find('xhtml:tr', ns) + assert tr is not None + tds = tr.findall('xhtml:td', ns) + assert len(tds) == 2 + + assert_class(tds[0], 'interprocmargin') + + test_frame = tds[1] + assert_frame(test_frame, 'make_a_list_of_random_ints_badly') + assert_event_range_with_margin(test_frame[1]) diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-4.c b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-4.c index 847b6d4..7eb0c50 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-4.c +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-4.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-fdiagnostics-path-format=inline-events -fdiagnostics-show-caret -fdiagnostics-show-line-numbers" } */ +/* { dg-options "-fdiagnostics-path-format=inline-events -fdiagnostics-show-caret -fdiagnostics-show-line-numbers -fdiagnostics-add-output=experimental-html:javascript=no" } */ /* { dg-enable-nn-line-numbers "" } */ #include <stdio.h> @@ -82,3 +82,7 @@ void test (void) | | (9) calling 'fprintf' | { dg-end-multiline-output "" } */ + +/* Use a Python script to verify various properties about the generated + HTML file: + { dg-final { run-html-pytest diagnostic-test-paths-4.c "diagnostic-test-paths-4.py" } } */ diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-4.py b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-4.py new file mode 100644 index 0000000..e738729 --- /dev/null +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-paths-4.py @@ -0,0 +1,190 @@ +# Verify that interprocedural execution paths work in HTML output. + +from htmltest import * + +import pytest + +@pytest.fixture(scope='function', autouse=True) +def html_tree(): + return html_tree_from_env() + +def test_paths(html_tree): + diag = get_diag_by_index(html_tree, 0) + src = get_locus_within_diag (diag) + + tbody = src.find('xhtml:tbody', ns) + assert_class(tbody, 'line-span') + + rows = tbody.findall('xhtml:tr', ns) + + quoted_src_tr = rows[0] + assert_quoted_line(quoted_src_tr, + ' 13', ' fprintf(stderr, "LOG: %s", msg); /* { dg-warning "call to \'fprintf\' from within signal handler" } */') + + annotation_tr = rows[1] + assert_annotation_line(annotation_tr, + ' ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~') + + event_ranges = diag.find('xhtml:div', ns) + assert_class(event_ranges, 'event-ranges') + + test_frame_margin = event_ranges.find('xhtml:table', ns) + assert_class(test_frame_margin, 'stack-frame-with-margin') + + tr = test_frame_margin.find('xhtml:tr', ns) + assert tr is not None + tds = tr.findall('xhtml:td', ns) + assert len(tds) == 2 + + assert_class(tds[0], 'interprocmargin') + + test_frame = tds[1] + assert_frame(test_frame, 'test') + assert_event_range_with_margin(test_frame[1]) + +# For reference, generated HTML looks like this: +""" +<table class="stack-frame-with-margin"><tr> + <td class="interprocmargin" style="padding-left: 100px"/> + <td class="stack-frame"> +<div class="frame-funcname"><span>test</span></div><table class="event-range-with-margin"><tr> + <td class="event-range"> + <div class="events-hdr"><span class="funcname">test</span>: <span class="event-ids">events 1-2</span></div> +<table class="locus"> +<tbody class="line-span"> +<tr><td class="linenum"> 27</td> <td class="source">{</td></tr> +<tr><td class="linenum"/><td class="annotation">^</td></tr> +<tr><td class="linenum"/><td class="annotation">|</td></tr> +<tr><td class="linenum"/><td class="annotation">(1) entering 'test'</td></tr> +<tr><td class="linenum"> 28</td> <td class="source"> register_handler ();</td></tr> +<tr><td class="linenum"/><td class="annotation"> ~~~~~~~~~~~~~~~~~~~</td></tr> +<tr><td class="linenum"/><td class="annotation"> |</td></tr> +<tr><td class="linenum"/><td class="annotation"> (2) calling 'register_handler'</td></tr> +</tbody> +</table> +</td></tr></table> +<div class="between-ranges-call"> + <svg height="30" width="150"> + <defs> + <marker id="arrowhead" markerWidth="10" markerHeight="7" + refX="0" refY="3.5" orient="auto" stroke="#0088ce" fill="#0088ce"> + <polygon points="0 0, 10 3.5, 0 7"/> + </marker> + </defs> + <polyline points="20,0 20,10 120,10 120,20" + style="fill:none;stroke: #0088ce" + marker-end="url(#arrowhead)"/> + </svg> +</div> + +<table class="stack-frame-with-margin"><tr> + <td class="interprocmargin" style="padding-left: 100px"/> + <td class="stack-frame"> +<div class="frame-funcname"><span>register_handler</span></div><table class="event-range-with-margin"><tr> + <td class="event-range"> + <div class="events-hdr"><span class="funcname">register_handler</span>: <span class="event-ids">events 3-4</span></div> +<table class="locus"> +<tbody class="line-span"> +<tr><td class="linenum"> 22</td> <td class="source">{</td></tr> +<tr><td class="linenum"/><td class="annotation">^</td></tr> +<tr><td class="linenum"/><td class="annotation">|</td></tr> +<tr><td class="linenum"/><td class="annotation">(3) entering 'register_handler'</td></tr> +<tr><td class="linenum"> 23</td> <td class="source"> signal(SIGINT, int_handler);</td></tr> +<tr><td class="linenum"/><td class="annotation"> ~~~~~~~~~~~~~~~~~~~~~~~~~~~</td></tr> +<tr><td class="linenum"/><td class="annotation"> |</td></tr> +<tr><td class="linenum"/><td class="annotation"> (4) registering 'int_handler' as signal handler</td></tr> +</tbody> +</table> +</td></tr></table> +</td></tr></table> +</td></tr></table> +<div class="between-ranges-return"> + <svg height="30" width="250"> + <defs> + <marker id="arrowhead" markerWidth="10" markerHeight="7" + refX="0" refY="3.5" orient="auto" stroke="#0088ce" fill="#0088ce"> + <polygon points="0 0, 10 3.5, 0 7"/> + </marker> + </defs> + <polyline points="220,0 220,10 20,10 20,20" + style="fill:none;stroke: #0088ce" + marker-end="url(#arrowhead)"/> + </svg> +</div> + +<table class="event-range-with-margin"><tr> + <td class="event-range"> + <div class="events-hdr"><span class="event-ids">event 5</span></div> + (5): later on, when the signal is delivered to the process +</td></tr></table> +<div class="between-ranges-call"> + <svg height="30" width="150"> + <defs> + <marker id="arrowhead" markerWidth="10" markerHeight="7" + refX="0" refY="3.5" orient="auto" stroke="#0088ce" fill="#0088ce"> + <polygon points="0 0, 10 3.5, 0 7"/> + </marker> + </defs> + <polyline points="20,0 20,10 120,10 120,20" + style="fill:none;stroke: #0088ce" + marker-end="url(#arrowhead)"/> + </svg> +</div> + +<table class="stack-frame-with-margin"><tr> + <td class="interprocmargin" style="padding-left: 100px"/> + <td class="stack-frame"> +<div class="frame-funcname"><span>int_handler</span></div><table class="event-range-with-margin"><tr> + <td class="event-range"> + <div class="events-hdr"><span class="funcname">int_handler</span>: <span class="event-ids">events 6-7</span></div> +<table class="locus"> +<tbody class="line-span"> +<tr><td class="linenum"> 17</td> <td class="source">{</td></tr> +<tr><td class="linenum"/><td class="annotation">^</td></tr> +<tr><td class="linenum"/><td class="annotation">|</td></tr> +<tr><td class="linenum"/><td class="annotation">(6) entering 'int_handler'</td></tr> +<tr><td class="linenum"> 18</td> <td class="source"> custom_logger("got signal");</td></tr> +<tr><td class="linenum"/><td class="annotation"> ~~~~~~~~~~~~~~~~~~~~~~~~~~~</td></tr> +<tr><td class="linenum"/><td class="annotation"> |</td></tr> +<tr><td class="linenum"/><td class="annotation"> (7) calling 'custom_logger'</td></tr> +</tbody> +</table> +</td></tr></table> +<div class="between-ranges-call"> + <svg height="30" width="150"> + <defs> + <marker id="arrowhead" markerWidth="10" markerHeight="7" + refX="0" refY="3.5" orient="auto" stroke="#0088ce" fill="#0088ce"> + <polygon points="0 0, 10 3.5, 0 7"/> + </marker> + </defs> + <polyline points="20,0 20,10 120,10 120,20" + style="fill:none;stroke: #0088ce" + marker-end="url(#arrowhead)"/> + </svg> +</div> + +<table class="stack-frame-with-margin"><tr> + <td class="interprocmargin" style="padding-left: 100px"/> + <td class="stack-frame"> +<div class="frame-funcname"><span>custom_logger</span></div><table class="event-range-with-margin"><tr> + <td class="event-range"> + <div class="events-hdr"><span class="funcname">custom_logger</span>: <span class="event-ids">events 8-9</span></div> +<table class="locus"> +<tbody class="line-span"> +<tr><td class="linenum"> 12</td> <td class="source">{</td></tr> +<tr><td class="linenum"/><td class="annotation">^</td></tr> +<tr><td class="linenum"/><td class="annotation">|</td></tr> +<tr><td class="linenum"/><td class="annotation">(8) entering 'custom_logger'</td></tr> +<tr><td class="linenum"> 13</td> <td class="source"> fprintf(stderr, "LOG: %s", msg); /* { dg-warning "call to 'fprintf' from within signal handler" } */</td></tr> +<tr><td class="linenum"/><td class="annotation"> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</td></tr> +<tr><td class="linenum"/><td class="annotation"> |</td></tr> +<tr><td class="linenum"/><td class="annotation"> (9) calling 'fprintf'</td></tr> +</tbody> +</table> +</td></tr></table> +</td></tr></table> +</td></tr></table> + +</div> + """ diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw-line-numbers.c b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw-line-numbers.c index 1e8f73b..e81856a 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw-line-numbers.c +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw-line-numbers.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O -fdiagnostics-show-caret -fdiagnostics-show-line-numbers" } */ +/* { dg-options "-O -fdiagnostics-show-caret -fdiagnostics-show-line-numbers -fdiagnostics-add-output=experimental-html:javascript=no" } */ /* This is a collection of unittests for diagnostic_show_locus; see the overview in diagnostic_plugin_test_show_locus.c. @@ -118,3 +118,7 @@ void test_fixit_insert_newline (void) { dg-end-multiline-output "" } */ #endif } + +/* Use a Python script to verify various properties about the generated + HTML file: + { dg-final { run-html-pytest diagnostic-test-show-locus-bw-line-numbers.c "diagnostic-test-show-locus.py" } } */ diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus.py b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus.py new file mode 100644 index 0000000..d963b29 --- /dev/null +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus.py @@ -0,0 +1,111 @@ +# Verify that diagnostic-show-locus.cc works with HTML output. + +from htmltest import * + +import pytest + +@pytest.fixture(scope='function', autouse=True) +def html_tree(): + return html_tree_from_env() + +#def get_tr_within_thead(thead, idx) + +def get_ruler_text(thead, idx): + trs = thead.findall('xhtml:tr', ns) + tr = trs[idx] + tds = tr.findall('xhtml:td', ns) + assert len(tds) == 3 + assert_class(tds[2], 'ruler') + return tds[2].text + +def test_very_wide_line(html_tree): + diag = get_diag_by_index(html_tree, 2) + src = get_locus_within_diag(diag) + + # Check ruler + thead = src.find('xhtml:thead', ns) + assert_class(thead, 'ruler') + trs = thead.findall('xhtml:tr', ns) + assert len(trs) == 3 + + assert get_ruler_text(thead, 0) == ' 0 0 0 0 0 1 1 ' + assert get_ruler_text(thead, 1) == ' 5 6 7 8 9 0 1 ' + assert get_ruler_text(thead, 2) == '34567890123456789012345678901234567890123456789012345678901234567890123' + + # Check quoted source + tbody = src.find('xhtml:tbody', ns) + assert_class(tbody, 'line-span') + trs = tbody.findall('xhtml:tr', ns) + assert len(trs) == 5 + assert_quoted_line(trs[0], ' 43', ' float f = foo * bar; /* { dg-warning "95: test" } */') + assert_annotation_line(trs[1], ' ~~~~^~~~~') + assert_annotation_line(trs[2], ' |') + assert_annotation_line(trs[3], ' label 0') + assert_annotation_line(trs[4], ' bar * foo') + +def test_fixit_insert(html_tree): + diag = get_diag_by_index(html_tree, 3) + msg = get_message_within_diag(diag) + assert msg.text == 'example of insertion hints' + + src = get_locus_within_diag(diag) + + # Check quoted source + tbody = src.find('xhtml:tbody', ns) + assert_class(tbody, 'line-span') + trs = tbody.findall('xhtml:tr', ns) + assert len(trs) == 3 + assert_quoted_line(trs[0], ' 63', ' int a[2][2] = { 0, 1 , 2, 3 }; /* { dg-warning "insertion hints" } */') + assert_annotation_line(trs[1], ' ^~~~') + assert_annotation_line(trs[2], ' { }') + +def test_fixit_remove(html_tree): + diag = get_diag_by_index(html_tree, 4) + msg = get_message_within_diag(diag) + assert msg.text == 'example of a removal hint' + + src = get_locus_within_diag(diag) + + # Check quoted source + tbody = src.find('xhtml:tbody', ns) + assert_class(tbody, 'line-span') + trs = tbody.findall('xhtml:tr', ns) + assert len(trs) == 3 + assert_quoted_line(trs[0], ' 77', ' int a;; /* { dg-warning "example of a removal hint" } */') + assert_annotation_line(trs[1], ' ^') + assert_annotation_line(trs[2], ' -') + +def test_fixit_replace(html_tree): + diag = get_diag_by_index(html_tree, 5) + msg = get_message_within_diag(diag) + assert msg.text == 'example of a replacement hint' + + src = get_locus_within_diag(diag) + + # Check quoted source + tbody = src.find('xhtml:tbody', ns) + assert_class(tbody, 'line-span') + trs = tbody.findall('xhtml:tr', ns) + assert len(trs) == 3 + assert_quoted_line(trs[0], ' 91', ' gtk_widget_showall (dlg); /* { dg-warning "example of a replacement hint" } */') + assert_annotation_line(trs[1], ' ^~~~~~~~~~~~~~~~~~') + assert_annotation_line(trs[2], ' gtk_widget_show_all') + +def test_fixit_insert_newline(html_tree): + diag = get_diag_by_index(html_tree, 6) + msg = get_message_within_diag(diag) + assert msg.text == 'example of newline insertion hint' + + src = get_locus_within_diag(diag) + + # Check quoted source + tbody = src.find('xhtml:tbody', ns) + assert_class(tbody, 'line-span') + trs = tbody.findall('xhtml:tr', ns) + assert len(trs) == 4 + assert_quoted_line(trs[0], ' 109', ' x = a;') + assert_annotation_line(trs[1], ' break;', + expected_line_num=' +++', + expected_left_margin='+') + assert_quoted_line(trs[2], ' 110', " case 'b': /* { dg-warning \"newline insertion\" } */") + assert_annotation_line(trs[3], ' ^~~~~~~~') diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic_group_plugin.cc b/gcc/testsuite/gcc.dg/plugin/diagnostic_group_plugin.cc index 5ec3418..4ade232 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic_group_plugin.cc +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic_group_plugin.cc @@ -176,9 +176,10 @@ test_diagnostic_text_starter (diagnostic_text_output_format &text_output, void test_diagnostic_start_span_fn (const diagnostic_location_print_policy &, - pretty_printer *pp, + to_text &sink, expanded_location) { + pretty_printer *pp = get_printer (sink); pp_string (pp, "START_SPAN_FN: "); pp_newline (pp); } diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-pr119181.c b/gcc/testsuite/gcc.dg/vect/bb-slp-pr119181.c new file mode 100644 index 0000000..b0d3e5a --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-pr119181.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +void +foo (int* a, int* restrict b) +{ + b[0] = a[0] * a[64]; + b[1] = a[65] * a[1]; + b[2] = a[2] * a[66]; + b[3] = a[67] * a[3]; + b[4] = a[68] * a[4]; + b[5] = a[69] * a[5]; + b[6] = a[6] * a[70]; + b[7] = a[7] * a[71]; +} + +/* { dg-final { scan-tree-dump-times "optimized: basic block" 1 "slp2" { target vect_int_mult } } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr119884.c b/gcc/testsuite/gcc.target/i386/pr119884.c new file mode 100644 index 0000000..34d5b68 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr119884.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-dse -favoid-store-forwarding" } */ + +typedef __attribute__((__vector_size__(64))) char V; +char c; +V v; + +char +foo() +{ + v *= c; + return v[0]; +}
\ No newline at end of file diff --git a/gcc/testsuite/gcc.target/i386/vect-epilogues-5.c b/gcc/testsuite/gcc.target/i386/vect-epilogues-5.c index 6772cab..d7c75df 100644 --- a/gcc/testsuite/gcc.target/i386/vect-epilogues-5.c +++ b/gcc/testsuite/gcc.target/i386/vect-epilogues-5.c @@ -9,5 +9,6 @@ int test (signed char *data, int n) return sum; } -/* { dg-final { scan-tree-dump-times "loop vectorized using 64 byte vectors" 2 "vect" } } */ +/* { 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 --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg.h new file mode 100644 index 0000000..746c635 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg.h @@ -0,0 +1,23 @@ +#ifndef HAVE_DEFINED_AVG_H +#define HAVE_DEFINED_AVG_H + +#include <stdint.h> + +#define DEF_AVG_0(NT, WT, NAME) \ +__attribute__((noinline)) \ +void \ +test_##NAME##_##WT##_##NT##_0(NT * restrict a, NT * restrict b, \ + NT * restrict out, int n) \ +{ \ + for (int i = 0; i < n; i++) { \ + out[i] = (NT)(((WT)a[i] + (WT)b[i]) >> 1); \ + } \ +} +#define DEF_AVG_0_WRAP(NT, WT, NAME) DEF_AVG_0(NT, WT, NAME) + +#define RUN_AVG_0(NT, WT, NAME, a, b, out, n) \ + test_##NAME##_##WT##_##NT##_0(a, b, out, n) +#define RUN_AVG_0_WRAP(NT, WT, NAME, a, b, out, n) \ + RUN_AVG_0(NT, WT, NAME, a, b, out, n) + +#endif diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_data.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_data.h new file mode 100644 index 0000000..cbeed14 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_data.h @@ -0,0 +1,185 @@ +#ifndef HAVE_DEFINED_AVG_DATA_H +#define HAVE_DEFINED_AVG_DATA_H + +#define N 16 + +#define TEST_AVG_DATA(T, NAME) test_##T##_##NAME##_data +#define TEST_AVG_DATA_WRAP(T, NAME) TEST_AVG_DATA(T, NAME) + +int8_t TEST_AVG_DATA(int8_t, avg_floor)[][3][N] = +{ + { + { + 0, 0, 0, 0, + 1, 1, 1, 1, + -1, -1, -1, -1, + 8, 8, 8, 8, + }, + { + 0, 0, 0, 0, + 0, 0, 0, 0, + -2, -2, -2, -2, + 1, 1, 1, 1, + }, + { + 0, 0, 0, 0, + 0, 0, 0, 0, + -2, -2, -2, -2, + 4, 4, 4, 4, + }, + }, + { + { + 127, 127, 127, 127, + 127, 127, 127, 127, + -128, -128, -128, -128, + -128, -128, -128, -128, + }, + { + 126, 126, 126, 126, + -2, -2, -2, -2, + 127, 127, 127, 127, + -127, -127, -127, -127, + }, + { + 126, 126, 126, 126, + 62, 62, 62, 62, + -1, -1, -1, -1, + -128, -128, -128, -128, + }, + }, +}; + +int16_t TEST_AVG_DATA(int16_t, avg_floor)[][3][N] = +{ + { + { + 0, 0, 0, 0, + 1, 1, 1, 1, + -1, -1, -1, -1, + 8, 8, 8, 8, + }, + { + 0, 0, 0, 0, + 0, 0, 0, 0, + -2, -2, -2, -2, + 1, 1, 1, 1, + }, + { + 0, 0, 0, 0, + 0, 0, 0, 0, + -2, -2, -2, -2, + 4, 4, 4, 4, + }, + }, + { + { + 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, + -32768, -32768, -32768, -32768, + -32768, -32768, -32768, -32768, + }, + { + 32766, 32766, 32766, 32766, + -2, -2, -2, -2, + 32767, 32767, 32767, 32767, + -32767, -32767, -32767, -32767, + }, + { + 32766, 32766, 32766, 32766, + 16382, 16382, 16382, 16382, + -1, -1, -1, -1, + -32768, -32768, -32768, -32768, + }, + }, +}; + +int32_t TEST_AVG_DATA(int32_t, avg_floor)[][3][N] = +{ + { + { + 0, 0, 0, 0, + 1, 1, 1, 1, + -1, -1, -1, -1, + 8, 8, 8, 8, + }, + { + 0, 0, 0, 0, + 0, 0, 0, 0, + -2, -2, -2, -2, + 1, 1, 1, 1, + }, + { + 0, 0, 0, 0, + 0, 0, 0, 0, + -2, -2, -2, -2, + 4, 4, 4, 4, + }, + }, + { + { + 2147483647, 2147483647, 2147483647, 2147483647, + 2147483647, 2147483647, 2147483647, 2147483647, + -2147483648, -2147483648, -2147483648, -2147483648, + -2147483648, -2147483648, -2147483648, -2147483648, + }, + { + 2147483646, 2147483646, 2147483646, 2147483646, + -2, -2, -2, -2, + 2147483647, 2147483647, 2147483647, 2147483647, + -2147483647, -2147483647, -2147483647, -2147483647, + }, + { + 2147483646, 2147483646, 2147483646, 2147483646, + 1073741822, 1073741822, 1073741822, 1073741822, + -1, -1, -1, -1, + -2147483648, -2147483648, -2147483648, -2147483648, + }, + }, +}; + +int64_t TEST_AVG_DATA(int64_t, avg_floor)[][3][N] = +{ + { + { + 0, 0, 0, 0, + 1, 1, 1, 1, + -1, -1, -1, -1, + 8, 8, 8, 8, + }, + { + 0, 0, 0, 0, + 0, 0, 0, 0, + -2, -2, -2, -2, + 1, 1, 1, 1, + }, + { + 0, 0, 0, 0, + 0, 0, 0, 0, + -2, -2, -2, -2, + 4, 4, 4, 4, + }, + }, + { + { + 9223372036854775807ull, 9223372036854775807ull, 9223372036854775807ull, 9223372036854775807ull, + 9223372036854775807ull, 9223372036854775807ull, 9223372036854775807ull, 9223372036854775807ull, + -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, + -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, + }, + { + 9223372036854775806ull, 9223372036854775806ull, 9223372036854775806ull, 9223372036854775806ull, + 9223372036854775807ull, 9223372036854775807ull, 9223372036854775807ull, 9223372036854775807ull, + -2ull, -2ull, -2ull, -2ull, + -9223372036854775807ull, -9223372036854775807ull, -9223372036854775807ull, -9223372036854775807ull, + }, + { + 9223372036854775806ull, 9223372036854775806ull, 9223372036854775806ull, 9223372036854775806ull, + 4611686018427387902ull, 4611686018427387902ull, 4611686018427387902ull, 4611686018427387902ull, + -1ull, -1ull, -1ull, -1ull, + -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, + }, + }, +}; + +#endif diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i16-from-i32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i16-from-i32.c new file mode 100644 index 0000000..16ba967 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i16-from-i32.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64d" } */ + +#include "avg.h" + +#define NT int16_t +#define WT int32_t + +DEF_AVG_0(NT, WT, avg_floor) + +/* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 1 } } */ +/* { dg-final { scan-assembler-times {vaadd.vv} 1 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i16-from-i64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i16-from-i64.c new file mode 100644 index 0000000..b229b4b --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i16-from-i64.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64d" } */ + +#include "avg.h" + +#define NT int16_t +#define WT int64_t + +DEF_AVG_0(NT, WT, avg_floor) + +/* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 1 } } */ +/* { dg-final { scan-assembler-times {vaadd.vv} 1 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i32-from-i64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i32-from-i64.c new file mode 100644 index 0000000..5f946bb --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i32-from-i64.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64d" } */ + +#include "avg.h" + +#define NT int32_t +#define WT int64_t + +DEF_AVG_0(NT, WT, avg_floor) + +/* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 1 } } */ +/* { dg-final { scan-assembler-times {vaadd.vv} 1 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i16.c new file mode 100644 index 0000000..5d9297a --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i16.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64d" } */ + +#include "avg.h" + +#define NT int8_t +#define WT int16_t + +DEF_AVG_0(NT, WT, avg_floor) + +/* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 1 } } */ +/* { dg-final { scan-assembler-times {vaadd.vv} 1 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i32.c new file mode 100644 index 0000000..5c5d4ea --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i32.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64d" } */ + +#include "avg.h" + +#define NT int8_t +#define WT int32_t + +DEF_AVG_0(NT, WT, avg_floor) + +/* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 1 } } */ +/* { dg-final { scan-assembler-times {vaadd.vv} 1 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i64.c new file mode 100644 index 0000000..f297953 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-1-i8-from-i64.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64d" } */ + +#include "avg.h" + +#define NT int8_t +#define WT int64_t + +DEF_AVG_0(NT, WT, avg_floor) + +/* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 1 } } */ +/* { dg-final { scan-assembler-times {vaadd.vv} 1 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i16-from-i32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i16-from-i32.c new file mode 100644 index 0000000..9d0dd61 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i16-from-i32.c @@ -0,0 +1,16 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99 -O3" } */ + +#include "avg.h" +#include "avg_data.h" + +#define WT int32_t +#define NT int16_t +#define NAME avg_floor + +DEF_AVG_0_WRAP(NT, WT, NAME) + +#define TEST_DATA TEST_AVG_DATA_WRAP(NT, NAME) +#define TEST_RUN(NT, WT, NAME, a, b, out, n) RUN_AVG_0_WRAP(NT, WT, NAME, a, b, out, n) + +#include "avg_run.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i16-from-i64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i16-from-i64.c new file mode 100644 index 0000000..2736baa --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i16-from-i64.c @@ -0,0 +1,16 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99 -O3" } */ + +#include "avg.h" +#include "avg_data.h" + +#define WT int64_t +#define NT int16_t +#define NAME avg_floor + +DEF_AVG_0_WRAP(NT, WT, NAME) + +#define TEST_DATA TEST_AVG_DATA_WRAP(NT, NAME) +#define TEST_RUN(NT, WT, NAME, a, b, out, n) RUN_AVG_0_WRAP(NT, WT, NAME, a, b, out, n) + +#include "avg_run.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i32-from-i64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i32-from-i64.c new file mode 100644 index 0000000..2334045 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i32-from-i64.c @@ -0,0 +1,16 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99 -O3" } */ + +#include "avg.h" +#include "avg_data.h" + +#define WT int64_t +#define NT int32_t +#define NAME avg_floor + +DEF_AVG_0_WRAP(NT, WT, NAME) + +#define TEST_DATA TEST_AVG_DATA_WRAP(NT, NAME) +#define TEST_RUN(NT, WT, NAME, a, b, out, n) RUN_AVG_0_WRAP(NT, WT, NAME, a, b, out, n) + +#include "avg_run.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i16.c new file mode 100644 index 0000000..8364748 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i16.c @@ -0,0 +1,16 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99 -O3" } */ + +#include "avg.h" +#include "avg_data.h" + +#define WT int16_t +#define NT int8_t +#define NAME avg_floor + +DEF_AVG_0_WRAP(NT, WT, NAME) + +#define TEST_DATA TEST_AVG_DATA_WRAP(NT, NAME) +#define TEST_RUN(NT, WT, NAME, a, b, out, n) RUN_AVG_0_WRAP(NT, WT, NAME, a, b, out, n) + +#include "avg_run.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i32.c new file mode 100644 index 0000000..157c936 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i32.c @@ -0,0 +1,16 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99 -O3" } */ + +#include "avg.h" +#include "avg_data.h" + +#define WT int32_t +#define NT int8_t +#define NAME avg_floor + +DEF_AVG_0_WRAP(NT, WT, NAME) + +#define TEST_DATA TEST_AVG_DATA_WRAP(NT, NAME) +#define TEST_RUN(NT, WT, NAME, a, b, out, n) RUN_AVG_0_WRAP(NT, WT, NAME, a, b, out, n) + +#include "avg_run.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i64.c new file mode 100644 index 0000000..2db0d3c --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_floor-run-1-i8-from-i64.c @@ -0,0 +1,16 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99 -O3" } */ + +#include "avg.h" +#include "avg_data.h" + +#define WT int64_t +#define NT int8_t +#define NAME avg_floor + +DEF_AVG_0_WRAP(NT, WT, NAME) + +#define TEST_DATA TEST_AVG_DATA_WRAP(NT, NAME) +#define TEST_RUN(NT, WT, NAME, a, b, out, n) RUN_AVG_0_WRAP(NT, WT, NAME, a, b, out, n) + +#include "avg_run.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_run.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_run.h new file mode 100644 index 0000000..a6bbee9 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/avg_run.h @@ -0,0 +1,26 @@ +#ifndef HAVE_DEFINED_AVG_RUN_H +#define HAVE_DEFINED_AVG_RUN_H + +int +main () +{ + unsigned i, k; + NT out[N]; + + for (i = 0; i < sizeof (TEST_DATA) / sizeof (TEST_DATA[0]); i++) + { + NT *a = TEST_DATA[i][0]; + NT *b = TEST_DATA[i][1]; + NT *expect = TEST_DATA[i][2]; + + TEST_RUN (NT, WT, NAME, a, b, out, N); + + for (k = 0; k < N; k++) + if (out[k] != expect[k]) + __builtin_abort (); + } + + return 0; +} + +#endif diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_arith.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_arith.h index 983c9b4..f78bdc0 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_arith.h +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_arith.h @@ -345,6 +345,31 @@ vec_sat_s_add_##T##_fmt_4 (T *out, T *op_1, T *op_2, unsigned limit) \ #define RUN_VEC_SAT_S_ADD_FMT_4_WRAP(T, out, op_1, op_2, N) \ RUN_VEC_SAT_S_ADD_FMT_4(T, out, op_1, op_2, N) +#define DEF_VEC_SAT_S_ADD_IMM_FMT_1(INDEX, T, UT, IMM, MIN, MAX) \ +void __attribute__((noinline)) \ +vec_sat_s_add_imm_##T##_fmt_1##_##INDEX (T *out, T *op_1, unsigned limit) \ +{ \ + unsigned i; \ + for (i = 0; i < limit; i++) \ + { \ + T x = op_1[i]; \ + T sum = (UT)x + (UT)IMM; \ + out[i] = (x ^ IMM) < 0 \ + ? sum \ + : (sum ^ x) >= 0 \ + ? sum \ + : x < 0 ? MIN : MAX; \ + } \ +} +#define DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(INDEX, T, UT, IMM, MIN, MAX) \ + DEF_VEC_SAT_S_ADD_IMM_FMT_1(INDEX, T, UT, IMM, MIN, MAX) + +#define RUN_VEC_SAT_S_ADD_IMM_FMT_1(INDEX, T, out, in, expect, IMM, N) \ + vec_sat_s_add_imm_##T##_fmt_1##_##INDEX (out, in, N); \ + VALIDATE_RESULT (out, expect, N) +#define RUN_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(INDEX, T, out, in, expect, IMM, N) \ + RUN_VEC_SAT_S_ADD_IMM_FMT_1(INDEX, T, out, in, expect, IMM, N) + /******************************************************************************/ /* Saturation Sub (Unsigned and Signed) */ /******************************************************************************/ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_data.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_data.h index ec4d64c..9f05c0c 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_data.h +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_data.h @@ -744,6 +744,246 @@ uint64_t TEST_UNARY_DATA(uint64_t, sat_u_sub_imm)[][2][N] = }, }; +int8_t TEST_UNARY_DATA(int8_t, sat_s_add_imm)[][2][N] = +{ + { /* For add imm -128 */ + { + -128, 0, 100, 127, + -128, 0, 100, 127, + -128, 0, 100, 127, + -128, 0, 100, 127, + }, + { + -128, -128, -28, -1, + -128, -128, -28, -1, + -128, -128, -28, -1, + -128, -128, -28, -1, + }, + }, + { /* For add imm 0 */ + { + -128, 0, 100, 127, + -128, 0, 100, 127, + -128, 0, 100, 127, + -128, 0, 100, 127, + }, + { + -128, 0, 100, 127, + -128, 0, 100, 127, + -128, 0, 100, 127, + -128, 0, 100, 127, + }, + }, + { /* For add imm 1 */ + { + -128, 0, 100, 127, + -128, 0, 100, 127, + -128, 0, 100, 127, + -128, 0, 100, 127, + }, + { + -127, 1, 101, 127, + -127, 1, 101, 127, + -127, 1, 101, 127, + -127, 1, 101, 127, + }, + }, + { /* For add imm 127 */ + { + -128, 0, 100, 127, + -128, 0, 100, 127, + -128, 0, 100, 127, + -128, 0, 100, 127, + }, + { + -1, 127, 127, 127, + -1, 127, 127, 127, + -1, 127, 127, 127, + -1, 127, 127, 127, + }, + }, +}; + +int16_t TEST_UNARY_DATA(int16_t, sat_s_add_imm)[][2][N] = +{ + { /* For add imm -32768 */ + { + -32768, 0, 100, 32767, + -32768, 0, 100, 32767, + -32768, 0, 100, 32767, + -32768, 0, 100, 32767, + }, + { + -32768, -32768, -32668, -1, + -32768, -32768, -32668, -1, + -32768, -32768, -32668, -1, + -32768, -32768, -32668, -1, + }, + }, + { /* For add imm 0 */ + { + -32768, 0, 100, 32767, + -32768, 0, 100, 32767, + -32768, 0, 100, 32767, + -32768, 0, 100, 32767, + }, + { + -32768, 0, 100, 32767, + -32768, 0, 100, 32767, + -32768, 0, 100, 32767, + -32768, 0, 100, 32767, + }, + }, + { /* For add imm 1 */ + { + -32768, 0, 100, 32767, + -32768, 0, 100, 32767, + -32768, 0, 100, 32767, + -32768, 0, 100, 32767, + }, + { + -32767, 1, 101, 32767, + -32767, 1, 101, 32767, + -32767, 1, 101, 32767, + -32767, 1, 101, 32767, + }, + }, + { /* For add imm 32767 */ + { + -32768, 0, 100, 32767, + -32768, 0, 100, 32767, + -32768, 0, 100, 32767, + -32768, 0, 100, 32767, + }, + { + -1, 32767, 32767, 32767, + -1, 32767, 32767, 32767, + -1, 32767, 32767, 32767, + -1, 32767, 32767, 32767, + }, + }, +}; + +int32_t TEST_UNARY_DATA(int32_t, sat_s_add_imm)[][2][N] = +{ + { /* For add imm -2147483648 */ + { + -2147483648, 0, 100, 2147483647, + -2147483648, 0, 100, 2147483647, + -2147483648, 0, 100, 2147483647, + -2147483648, 0, 100, 2147483647, + }, + { + -2147483648, -2147483648, -2147483548, -1, + -2147483648, -2147483648, -2147483548, -1, + -2147483648, -2147483648, -2147483548, -1, + -2147483648, -2147483648, -2147483548, -1, + }, + }, + { /* For add imm 0 */ + { + -2147483648, 0, 100, 2147483647, + -2147483648, 0, 100, 2147483647, + -2147483648, 0, 100, 2147483647, + -2147483648, 0, 100, 2147483647, + }, + { + -2147483648, 0, 100, 2147483647, + -2147483648, 0, 100, 2147483647, + -2147483648, 0, 100, 2147483647, + -2147483648, 0, 100, 2147483647, + }, + }, + { /* For add imm 1 */ + { + -2147483648, 0, 100, 2147483647, + -2147483648, 0, 100, 2147483647, + -2147483648, 0, 100, 2147483647, + -2147483648, 0, 100, 2147483647, + }, + { + -2147483647, 1, 101, 2147483647, + -2147483647, 1, 101, 2147483647, + -2147483647, 1, 101, 2147483647, + -2147483647, 1, 101, 2147483647, + }, + }, + { /* For add imm 2147483647 */ + { + -2147483648, 0, 100, 2147483647, + -2147483648, 0, 100, 2147483647, + -2147483648, 0, 100, 2147483647, + -2147483648, 0, 100, 2147483647, + }, + { + -1, 2147483647, 2147483647, 2147483647, + -1, 2147483647, 2147483647, 2147483647, + -1, 2147483647, 2147483647, 2147483647, + -1, 2147483647, 2147483647, 2147483647, + }, + }, +}; + +int64_t TEST_UNARY_DATA(int64_t, sat_s_add_imm)[][2][N] = +{ + { /* For add imm -9223372036854775808ll */ + { + INT64_MIN, 0, 100, INT64_MAX, + INT64_MIN, 0, 100, INT64_MAX, + INT64_MIN, 0, 100, INT64_MAX, + INT64_MIN, 0, 100, INT64_MAX, + }, + { + INT64_MIN, INT64_MIN, -9223372036854775708ll, -1, + INT64_MIN, INT64_MIN, -9223372036854775708ll, -1, + INT64_MIN, INT64_MIN, -9223372036854775708ll, -1, + INT64_MIN, INT64_MIN, -9223372036854775708ll, -1, + }, + }, + { /* For add imm 0 */ + { + INT64_MIN, 0, 100, INT64_MAX, + INT64_MIN, 0, 100, INT64_MAX, + INT64_MIN, 0, 100, INT64_MAX, + INT64_MIN, 0, 100, INT64_MAX, + }, + { + INT64_MIN, 0, 100, INT64_MAX, + INT64_MIN, 0, 100, INT64_MAX, + INT64_MIN, 0, 100, INT64_MAX, + INT64_MIN, 0, 100, INT64_MAX, + }, + }, + { /* For add imm 1 */ + { + INT64_MIN, 0, 100, INT64_MAX, + INT64_MIN, 0, 100, INT64_MAX, + INT64_MIN, 0, 100, INT64_MAX, + INT64_MIN, 0, 100, INT64_MAX, + }, + { + -INT64_MAX, 1, 101, INT64_MAX, + -INT64_MAX, 1, 101, INT64_MAX, + -INT64_MAX, 1, 101, INT64_MAX, + -INT64_MAX, 1, 101, INT64_MAX, + }, + }, + { /* For add imm 9223372036854775807ll */ + { + INT64_MIN, 0, 100, INT64_MAX, + INT64_MIN, 0, 100, INT64_MAX, + INT64_MIN, 0, 100, INT64_MAX, + INT64_MIN, 0, 100, INT64_MAX, + }, + { + -1, INT64_MAX, INT64_MAX, INT64_MAX, + -1, INT64_MAX, INT64_MAX, INT64_MAX, + -1, INT64_MAX, INT64_MAX, INT64_MAX, + -1, INT64_MAX, INT64_MAX, INT64_MAX, + }, + }, +}; + #define TEST_BINARY_DATA_NAME(T1, T2, NAME) test_bin_##T1##_##T2##_##NAME##_data #define TEST_BINARY_DATA_NAME_WRAP(T1, T2, NAME) \ TEST_BINARY_DATA_NAME(T1, T2, NAME) diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i16.c new file mode 100644 index 0000000..396c741 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i16.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64d -ftree-vectorize -fdump-tree-optimized" } */ + +#include "vec_sat_arith.h" + +DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int16_t, uint16_t, 9, INT16_MIN, INT16_MAX) + +/* { dg-final { scan-tree-dump-times ".SAT_ADD " 1 "optimized" { target { no-opts "-O2" } } } } */ +/* { dg-final { scan-tree-dump-times ".SAT_ADD " 2 "optimized" { target { no-opts "-O3" } } } } */ +/* { dg-final { scan-assembler-times {vsadd\.vi} 1 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i32.c new file mode 100644 index 0000000..da9e538 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i32.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64d -ftree-vectorize -fdump-tree-optimized" } */ + +#include "vec_sat_arith.h" + +DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int32_t, uint32_t, 9, INT32_MIN, INT32_MAX) + +/* { dg-final { scan-tree-dump-times ".SAT_ADD " 1 "optimized" { target { no-opts "-O2" } } } } */ +/* { dg-final { scan-tree-dump-times ".SAT_ADD " 2 "optimized" { target { no-opts "-O3" } } } } */ +/* { dg-final { scan-assembler-times {vsadd\.vi} 1 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i64.c new file mode 100644 index 0000000..e9af1a1 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i64.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64d -ftree-vectorize -fdump-tree-optimized" } */ + +#include "vec_sat_arith.h" + +DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int64_t, uint64_t, 9, INT64_MIN, INT64_MAX) + +/* { dg-final { scan-tree-dump-times ".SAT_ADD " 1 "optimized" { target { no-opts "-O2" } } } } */ +/* { dg-final { scan-tree-dump-times ".SAT_ADD " 2 "optimized" { target { no-opts "-O3" } } } } */ +/* { dg-final { scan-assembler-times {vsadd\.vi} 1 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i8.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i8.c new file mode 100644 index 0000000..66b9d7f --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i8.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64d -ftree-vectorize -fdump-tree-optimized" } */ + +#include "vec_sat_arith.h" + +DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int8_t, uint8_t, 9, INT8_MIN, INT8_MAX) + +/* { dg-final { scan-tree-dump-times ".SAT_ADD " 1 "optimized" { target { no-opts "-O2" } } } } */ +/* { dg-final { scan-tree-dump-times ".SAT_ADD " 2 "optimized" { target { no-opts "-O3" } } } } */ +/* { dg-final { scan-assembler-times {vsadd\.vi} 1 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i16.c new file mode 100644 index 0000000..fbfa4e2 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i16.c @@ -0,0 +1,28 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99" } */ + +#include "vec_sat_arith.h" +#include "vec_sat_data.h" + +#define T int16_t +#define RUN(INDEX, T, out, in, expect, IMM, N) \ + RUN_VEC_SAT_S_ADD_IMM_FMT_1_WRAP (INDEX, T, out, in, expect, IMM, N) + +DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(0, int16_t, uint16_t, -32768, INT16_MIN, INT16_MAX) +DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(1, int16_t, uint16_t, 0, INT16_MIN, INT16_MAX) +DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(2, int16_t, uint16_t, 1, INT16_MIN, INT16_MAX) +DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(3, int16_t, uint16_t, 32767, INT16_MIN, INT16_MAX) + +int +main () +{ + T out[N]; + T (*d)[2][N] = TEST_UNARY_DATA_WRAP (T, sat_s_add_imm); + + RUN (0, T, out, d[0][0], d[0][1], -32768, N); + RUN (1, T, out, d[1][0], d[1][1], 0, N); + RUN (2, T, out, d[2][0], d[2][1], 1, N); + RUN (3, T, out, d[3][0], d[3][1], 32767, N); + + return 0; +} diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i32.c new file mode 100644 index 0000000..5f1763c --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i32.c @@ -0,0 +1,28 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99" } */ + +#include "vec_sat_arith.h" +#include "vec_sat_data.h" + +#define T int32_t +#define RUN(INDEX, T, out, in, expect, IMM, N) \ + RUN_VEC_SAT_S_ADD_IMM_FMT_1_WRAP (INDEX, T, out, in, expect, IMM, N) + +DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(0, int32_t, uint32_t, -2147483648, INT32_MIN, INT32_MAX) +DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(1, int32_t, uint32_t, 0, INT32_MIN, INT32_MAX) +DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(2, int32_t, uint32_t, 1, INT32_MIN, INT32_MAX) +DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(3, int32_t, uint32_t, 2147483647, INT32_MIN, INT32_MAX) + +int +main () +{ + T out[N]; + T (*d)[2][N] = TEST_UNARY_DATA_WRAP (T, sat_s_add_imm); + + RUN (0, T, out, d[0][0], d[0][1], -2147483648, N); + RUN (1, T, out, d[1][0], d[1][1], 0, N); + RUN (2, T, out, d[2][0], d[2][1], 1, N); + RUN (3, T, out, d[3][0], d[3][1], 2147483647, N); + + return 0; +} diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i64.c new file mode 100644 index 0000000..435eb1b --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i64.c @@ -0,0 +1,28 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99" } */ + +#include "vec_sat_arith.h" +#include "vec_sat_data.h" + +#define T int64_t +#define RUN(INDEX, T, out, in, expect, IMM, N) \ + RUN_VEC_SAT_S_ADD_IMM_FMT_1_WRAP (INDEX, T, out, in, expect, IMM, N) + +DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(0, int64_t, uint64_t, INT64_MIN, INT64_MIN, INT64_MAX) +DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(1, int64_t, uint64_t, 0, INT64_MIN, INT64_MAX) +DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(2, int64_t, uint64_t, 1, INT64_MIN, INT64_MAX) +DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(3, int64_t, uint64_t, INT64_MAX, INT64_MIN, INT64_MAX) + +int +main () +{ + T out[N]; + T (*d)[2][N] = TEST_UNARY_DATA_WRAP (T, sat_s_add_imm); + + RUN (0, T, out, d[0][0], d[0][1], INT64_MIN, N); + RUN (1, T, out, d[1][0], d[1][1], 0, N); + RUN (2, T, out, d[2][0], d[2][1], 1, N); + RUN (3, T, out, d[3][0], d[3][1], INT64_MAX, N); + + return 0; +} diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i8.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i8.c new file mode 100644 index 0000000..535e873 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i8.c @@ -0,0 +1,28 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99" } */ + +#include "vec_sat_arith.h" +#include "vec_sat_data.h" + +#define T int8_t +#define RUN(INDEX, T, out, in, expect, IMM, N) \ + RUN_VEC_SAT_S_ADD_IMM_FMT_1_WRAP (INDEX, T, out, in, expect, IMM, N) + +DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(0, int8_t, uint8_t, -128, INT8_MIN, INT8_MAX) +DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(1, int8_t, uint8_t, 0, INT8_MIN, INT8_MAX) +DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(2, int8_t, uint8_t, 1, INT8_MIN, INT8_MAX) +DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(3, int8_t, uint8_t, 127, INT8_MIN, INT8_MAX) + +int +main () +{ + T out[N]; + T (*d)[2][N] = TEST_UNARY_DATA_WRAP (T, sat_s_add_imm); + + RUN (0, T, out, d[0][0], d[0][1], -128, N); + RUN (1, T, out, d[1][0], d[1][1], 0, N); + RUN (2, T, out, d[2][0], d[2][1], 1, N); + RUN (3, T, out, d[3][0], d[3][1], 127, N); + + return 0; +} diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i16.c new file mode 100644 index 0000000..26e96fc --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i16.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized" } */ + +#include "vec_sat_arith.h" + +DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int16_t, uint16_t, -32769, INT16_MIN, INT16_MAX) +DEF_VEC_SAT_S_ADD_IMM_FMT_1(1, int16_t, uint16_t, 32768, INT16_MIN, INT16_MAX) + +/* { dg-final { scan-tree-dump-not ".SAT_ADD " "optimized" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i32.c new file mode 100644 index 0000000..519e72c --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i32.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized" } */ + +#include "vec_sat_arith.h" + +DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int32_t, uint32_t, -2147483649, INT32_MIN, INT32_MAX) +DEF_VEC_SAT_S_ADD_IMM_FMT_1(1, int32_t, uint32_t, 2147483648, INT32_MIN, INT32_MAX) + +/* { dg-final { scan-tree-dump-not ".SAT_ADD " "optimized" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i8.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i8.c new file mode 100644 index 0000000..2b0af52 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i8.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64d -ftree-vectorize -fdump-tree-optimized" } */ + +#include "vec_sat_arith.h" + +DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int8_t, uint8_t, 200, INT8_MIN, INT8_MAX) +DEF_VEC_SAT_S_ADD_IMM_FMT_1(1, int8_t, uint8_t, -300, INT8_MIN, INT8_MAX) + +/* { dg-final { scan-tree-dump-not ".SAT_ADD " "optimized" } } */ + diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-1.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-1.c index 30e60d5..4920fa6 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-1.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-1.c @@ -25,9 +25,8 @@ DEF_AVG_FLOOR (uint8_t, uint16_t, 512) DEF_AVG_FLOOR (uint8_t, uint16_t, 1024) DEF_AVG_FLOOR (uint8_t, uint16_t, 2048) -/* { dg-final { scan-assembler-times {vwadd\.vv} 10 } } */ -/* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 10 } } */ -/* { dg-final { scan-assembler-times {vnsra\.wi} 10 } } */ +/* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 20 } } */ +/* { dg-final { scan-assembler-times {vaadd\.vv} 10 } } */ /* { dg-final { scan-assembler-times {vaaddu\.vv} 10 } } */ /* { dg-final { scan-assembler-not {csrr} } } */ /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-2.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-2.c index 33df429..c6a120b 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-2.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-2.c @@ -23,9 +23,8 @@ DEF_AVG_FLOOR (uint16_t, uint32_t, 256) DEF_AVG_FLOOR (uint16_t, uint32_t, 512) DEF_AVG_FLOOR (uint16_t, uint32_t, 1024) -/* { dg-final { scan-assembler-times {vwadd\.vv} 9 } } */ -/* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 9 } } */ -/* { dg-final { scan-assembler-times {vnsra\.wi} 9 } } */ +/* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 18 } } */ +/* { dg-final { scan-assembler-times {vaadd\.vv} 9 } } */ /* { dg-final { scan-assembler-times {vaaddu\.vv} 9 } } */ /* { dg-final { scan-assembler-not {csrr} } } */ /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-3.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-3.c index 9058905..2838c1e 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-3.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/avg-3.c @@ -21,9 +21,8 @@ DEF_AVG_FLOOR (uint32_t, uint64_t, 128) DEF_AVG_FLOOR (uint32_t, uint64_t, 256) DEF_AVG_FLOOR (uint32_t, uint64_t, 512) -/* { dg-final { scan-assembler-times {vwadd\.vv} 8 } } */ -/* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 8 } } */ -/* { dg-final { scan-assembler-times {vnsra\.wi} 8 } } */ +/* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 16 } } */ +/* { dg-final { scan-assembler-times {vaadd\.vv} 8 } } */ /* { dg-final { scan-assembler-times {vaaddu\.vv} 8 } } */ /* { dg-final { scan-assembler-not {csrr} } } */ /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i16.c index b15cb4c..144d1ba 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i16.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i16.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub); DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) +DEF_VX_BINARY_CASE_0_WRAP(T, *, mul) /* { dg-final { scan-assembler-times {vadd.vx} 1 } } */ /* { dg-final { scan-assembler-times {vsub.vx} 1 } } */ /* { dg-final { scan-assembler-times {vrsub.vx} 1 } } */ /* { dg-final { scan-assembler-times {vand.vx} 1 } } */ /* { dg-final { scan-assembler-times {vor.vx} 1 } } */ +/* { dg-final { scan-assembler-times {vxor.vx} 1 } } */ +/* { dg-final { scan-assembler-times {vmul.vx} 1 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i32.c index df3d3a3..74d35d1 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i32.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i32.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub); DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) +DEF_VX_BINARY_CASE_0_WRAP(T, *, mul) /* { dg-final { scan-assembler-times {vadd.vx} 1 } } */ /* { dg-final { scan-assembler-times {vsub.vx} 1 } } */ /* { dg-final { scan-assembler-times {vrsub.vx} 1 } } */ /* { dg-final { scan-assembler-times {vand.vx} 1 } } */ /* { dg-final { scan-assembler-times {vor.vx} 1 } } */ +/* { dg-final { scan-assembler-times {vxor.vx} 1 } } */ +/* { dg-final { scan-assembler-times {vmul.vx} 1 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i64.c index ed17b83..ac512ff 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i64.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i64.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub); DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) +DEF_VX_BINARY_CASE_0_WRAP(T, *, mul) /* { dg-final { scan-assembler-times {vadd.vx} 1 } } */ /* { dg-final { scan-assembler-times {vsub.vx} 1 } } */ /* { dg-final { scan-assembler-times {vrsub.vx} 1 } } */ /* { dg-final { scan-assembler-times {vand.vx} 1 } } */ /* { dg-final { scan-assembler-times {vor.vx} 1 } } */ +/* { dg-final { scan-assembler-times {vxor.vx} 1 } } */ +/* { dg-final { scan-assembler-times {vmul.vx} 1 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i8.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i8.c index aa11daf..4f7b675 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i8.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i8.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub); DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) +DEF_VX_BINARY_CASE_0_WRAP(T, *, mul) /* { dg-final { scan-assembler-times {vadd.vx} 1 } } */ /* { dg-final { scan-assembler-times {vsub.vx} 1 } } */ /* { dg-final { scan-assembler-times {vrsub.vx} 1 } } */ /* { dg-final { scan-assembler-times {vand.vx} 1 } } */ /* { dg-final { scan-assembler-times {vor.vx} 1 } } */ +/* { dg-final { scan-assembler-times {vxor.vx} 1 } } */ +/* { dg-final { scan-assembler-times {vmul.vx} 1 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c index 15db588..7e107d3 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub); DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) /* { dg-final { scan-assembler-times {vadd.vx} 1 } } */ /* { dg-final { scan-assembler-times {vsub.vx} 1 } } */ /* { dg-final { scan-assembler-times {vrsub.vx} 1 } } */ /* { dg-final { scan-assembler-times {vand.vx} 1 } } */ /* { dg-final { scan-assembler-times {vor.vx} 1 } } */ +/* { dg-final { scan-assembler-times {vxor.vx} 1 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c index f15592c..f8ffab7 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub); DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) /* { dg-final { scan-assembler-times {vadd.vx} 1 } } */ /* { dg-final { scan-assembler-times {vsub.vx} 1 } } */ /* { dg-final { scan-assembler-times {vrsub.vx} 1 } } */ /* { dg-final { scan-assembler-times {vand.vx} 1 } } */ /* { dg-final { scan-assembler-times {vor.vx} 1 } } */ +/* { dg-final { scan-assembler-times {vxor.vx} 1 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c index 80e32af..31d2945 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub); DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) /* { dg-final { scan-assembler-times {vadd.vx} 1 } } */ /* { dg-final { scan-assembler-times {vsub.vx} 1 } } */ /* { dg-final { scan-assembler-times {vrsub.vx} 1 } } */ /* { dg-final { scan-assembler-times {vand.vx} 1 } } */ /* { dg-final { scan-assembler-times {vor.vx} 1 } } */ +/* { dg-final { scan-assembler-times {vxor.vx} 1 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c index 9b19276..59e0334 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub); DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) /* { dg-final { scan-assembler-times {vadd.vx} 1 } } */ /* { dg-final { scan-assembler-times {vsub.vx} 1 } } */ /* { dg-final { scan-assembler-times {vrsub.vx} 1 } } */ /* { dg-final { scan-assembler-times {vand.vx} 1 } } */ /* { dg-final { scan-assembler-times {vor.vx} 1 } } */ +/* { dg-final { scan-assembler-times {vxor.vx} 1 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i16.c index 596488c..075c8be 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i16.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i16.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub) DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) +DEF_VX_BINARY_CASE_0_WRAP(T, *, mul) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler-not {vsub.vx} } } */ /* { dg-final { scan-assembler-not {vrsub.vx} } } */ /* { dg-final { scan-assembler-not {vand.vx} } } */ /* { dg-final { scan-assembler-not {vor.vx} } } */ +/* { dg-final { scan-assembler-not {vxor.vx} } } */ +/* { dg-final { scan-assembler-not {vmul.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i32.c index 8b4b7eb..595479c 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i32.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i32.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub) DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) +DEF_VX_BINARY_CASE_0_WRAP(T, *, mul) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler-not {vsub.vx} } } */ /* { dg-final { scan-assembler-not {vrsub.vx} } } */ /* { dg-final { scan-assembler-not {vand.vx} } } */ /* { dg-final { scan-assembler-not {vor.vx} } } */ +/* { dg-final { scan-assembler-not {vxor.vx} } } */ +/* { dg-final { scan-assembler-not {vmul.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i64.c index 544c907..7b6fcbf 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i64.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i64.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub) DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) +DEF_VX_BINARY_CASE_0_WRAP(T, *, mul) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler-not {vsub.vx} } } */ /* { dg-final { scan-assembler-not {vrsub.vx} } } */ /* { dg-final { scan-assembler-not {vand.vx} } } */ /* { dg-final { scan-assembler-not {vor.vx} } } */ +/* { dg-final { scan-assembler-not {vxor.vx} } } */ +/* { dg-final { scan-assembler-not {vmul.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i8.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i8.c index af53f2b..55fc717 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i8.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i8.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub) DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) +DEF_VX_BINARY_CASE_0_WRAP(T, *, mul) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler-not {vsub.vx} } } */ /* { dg-final { scan-assembler-not {vrsub.vx} } } */ /* { dg-final { scan-assembler-not {vand.vx} } } */ /* { dg-final { scan-assembler-not {vor.vx} } } */ +/* { dg-final { scan-assembler-not {vxor.vx} } } */ +/* { dg-final { scan-assembler-not {vmul.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c index a8ff915..9612e3f 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub) DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler-not {vsub.vx} } } */ /* { dg-final { scan-assembler-not {vrsub.vx} } } */ /* { dg-final { scan-assembler-not {vand.vx} } } */ /* { dg-final { scan-assembler-not {vor.vx} } } */ +/* { dg-final { scan-assembler-not {vxor.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c index d587a88..9641802 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub) DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler-not {vsub.vx} } } */ /* { dg-final { scan-assembler-not {vrsub.vx} } } */ /* { dg-final { scan-assembler-not {vand.vx} } } */ /* { dg-final { scan-assembler-not {vor.vx} } } */ +/* { dg-final { scan-assembler-not {vxor.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c index ff205d5..0d173e0 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub) DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler-not {vsub.vx} } } */ /* { dg-final { scan-assembler-not {vrsub.vx} } } */ /* { dg-final { scan-assembler-not {vand.vx} } } */ /* { dg-final { scan-assembler-not {vor.vx} } } */ +/* { dg-final { scan-assembler-not {vxor.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c index e8e2c7f..931295e 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub) DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler-not {vsub.vx} } } */ /* { dg-final { scan-assembler-not {vrsub.vx} } } */ /* { dg-final { scan-assembler-not {vand.vx} } } */ /* { dg-final { scan-assembler-not {vor.vx} } } */ +/* { dg-final { scan-assembler-not {vxor.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i16.c index bd38b86..bec6b3a 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i16.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i16.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub) DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) +DEF_VX_BINARY_CASE_0_WRAP(T, *, mul) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler-not {vsub.vx} } } */ /* { dg-final { scan-assembler-not {vrsub.vx} } } */ /* { dg-final { scan-assembler-not {vand.vx} } } */ /* { dg-final { scan-assembler-not {vor.vx} } } */ +/* { dg-final { scan-assembler-not {vxor.vx} } } */ +/* { dg-final { scan-assembler-not {vmul.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i32.c index e0bdd22..98fce52 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i32.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i32.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub) DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) +DEF_VX_BINARY_CASE_0_WRAP(T, *, mul) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler-not {vsub.vx} } } */ /* { dg-final { scan-assembler-not {vrsub.vx} } } */ /* { dg-final { scan-assembler-not {vand.vx} } } */ /* { dg-final { scan-assembler-not {vor.vx} } } */ +/* { dg-final { scan-assembler-not {vxor.vx} } } */ +/* { dg-final { scan-assembler-not {vmul.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i64.c index aab3b4af..48dd57a 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i64.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i64.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub) DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) +DEF_VX_BINARY_CASE_0_WRAP(T, *, mul) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler-not {vsub.vx} } } */ /* { dg-final { scan-assembler-not {vrsub.vx} } } */ /* { dg-final { scan-assembler-not {vand.vx} } } */ /* { dg-final { scan-assembler-not {vor.vx} } } */ +/* { dg-final { scan-assembler-not {vxor.vx} } } */ +/* { dg-final { scan-assembler-not {vmul.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i8.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i8.c index 825988b..9bdce82 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i8.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i8.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub) DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) +DEF_VX_BINARY_CASE_0_WRAP(T, *, mul) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler-not {vsub.vx} } } */ /* { dg-final { scan-assembler-not {vrsub.vx} } } */ /* { dg-final { scan-assembler-not {vand.vx} } } */ /* { dg-final { scan-assembler-not {vor.vx} } } */ +/* { dg-final { scan-assembler-not {vxor.vx} } } */ +/* { dg-final { scan-assembler-not {vmul.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c index a750510..24b4aa7 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub) DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler-not {vsub.vx} } } */ /* { dg-final { scan-assembler-not {vrsub.vx} } } */ /* { dg-final { scan-assembler-not {vand.vx} } } */ /* { dg-final { scan-assembler-not {vor.vx} } } */ +/* { dg-final { scan-assembler-not {vxor.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c index 2d279cf..0c1552a 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub) DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler-not {vsub.vx} } } */ /* { dg-final { scan-assembler-not {vrsub.vx} } } */ /* { dg-final { scan-assembler-not {vand.vx} } } */ /* { dg-final { scan-assembler-not {vor.vx} } } */ +/* { dg-final { scan-assembler-not {vxor.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c index 5a90883..8364f19 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_0(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0(T, -, rsub) DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler-not {vsub.vx} } } */ /* { dg-final { scan-assembler-not {vrsub.vx} } } */ /* { dg-final { scan-assembler-not {vand.vx} } } */ /* { dg-final { scan-assembler-not {vor.vx} } } */ +/* { dg-final { scan-assembler-not {vxor.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c index 69af97a..8a31111 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_0_WRAP(T, -, sub) DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub) DEF_VX_BINARY_CASE_0_WRAP(T, &, and) DEF_VX_BINARY_CASE_0_WRAP(T, |, or) +DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler-not {vsub.vx} } } */ /* { dg-final { scan-assembler-not {vrsub.vx} } } */ /* { dg-final { scan-assembler-not {vand.vx} } } */ /* { dg-final { scan-assembler-not {vor.vx} } } */ +/* { dg-final { scan-assembler-not {vxor.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i16.c index ffad2a2..a1b24f7 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i16.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i16.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY_X16) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X16) DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X16) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X16) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X16) +DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY_X16) /* { dg-final { scan-assembler {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ +/* { dg-final { scan-assembler {vmul.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i32.c index 275a11e..53bd744 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i32.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i32.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY_X4) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X4) DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X4) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X4) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X4) +DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY_X4) /* { dg-final { scan-assembler {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ +/* { dg-final { scan-assembler {vmul.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i64.c index 006f241..73cb89d 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i64.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i64.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY) DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY) +DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY) /* { dg-final { scan-assembler {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ +/* { dg-final { scan-assembler {vmul.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i8.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i8.c index 75df007..ec20474 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i8.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i8.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY_X16) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X16) DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X16) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X16) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X16) +DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY_X16) /* { dg-final { scan-assembler {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ +/* { dg-final { scan-assembler {vmul.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c index e8ae8e9..4bc0850 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY_X16) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X16) DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X16) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X16) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X16) /* { dg-final { scan-assembler {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c index eee51f8..255273d 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY_X4) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X4) DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X4) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X4) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X4) /* { dg-final { scan-assembler {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c index 061fead..d21f61b 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY) DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY) /* { dg-final { scan-assembler {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c index 36e50f4..51492ae 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY_X16) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X16) DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X16) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X16) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X16) /* { dg-final { scan-assembler {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i16.c index 0f1d2a5..902ba1e 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i16.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i16.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY_X8) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X8) DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X8) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X8) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X8) +DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY_X8) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ +/* { dg-final { scan-assembler-not {vmul.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i32.c index 45beac2..e57cee6 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i32.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i32.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY_X4) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X4) DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X4) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X4) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X4) +DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY_X4) /* { dg-final { scan-assembler {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ +/* { dg-final { scan-assembler {vmul.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i64.c index b27009d..3b4138d 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i64.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i64.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY) DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY) +DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY) /* { dg-final { scan-assembler {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ +/* { dg-final { scan-assembler {vmul.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i8.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i8.c index 112e018..0ad52b2 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i8.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i8.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY_X16) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X16) DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X16) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X16) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X16) +DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY_X16) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ +/* { dg-final { scan-assembler-not {vmul.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c index 8651909..2ab0967 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY_X8) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X8) DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X8) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X8) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X8) /* { dg-final { scan-assembler {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c index 6786326..799c5db 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY_X4) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X4) DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X4) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X4) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X4) /* { dg-final { scan-assembler {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c index 5b57191..a5d25d21 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY) DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY) /* { dg-final { scan-assembler {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c index 59f8f06..61d2b24 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY_X16) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X16) DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X16) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X16) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X16) /* { dg-final { scan-assembler {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i16.c index 1ae8b92..5e04050 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i16.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i16.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY_X8) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X8); DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X8) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X8) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X8) +DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY_X8) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ +/* { dg-final { scan-assembler-not {vmul.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i32.c index a532fde..13a9fe2 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i32.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i32.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY_X4) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X4); DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X4) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X4) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X4) +DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY_X4) /* { dg-final { scan-assembler {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ +/* { dg-final { scan-assembler {vmul.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i64.c index 2237639..ca515b4 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i64.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i64.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY); DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY) +DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler-not {vsub.vx} } } */ /* { dg-final { scan-assembler-not {vrsub.vx} } } */ /* { dg-final { scan-assembler-not {vand.vx} } } */ /* { dg-final { scan-assembler-not {vor.vx} } } */ +/* { dg-final { scan-assembler-not {vxor.vx} } } */ +/* { dg-final { scan-assembler-not {vmul.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i8.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i8.c index cb0640d..70e1abc 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i8.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i8.c @@ -10,9 +10,13 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY_X16) DEF_VX_BINARY_REVERSE_CASE_1(T, -, rsub, VX_BINARY_REVERSE_BODY_X16); DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X16) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X16) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X16) +DEF_VX_BINARY_CASE_1_WRAP(T, *, mul, VX_BINARY_BODY_X16) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ +/* { dg-final { scan-assembler-not {vmul.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c index 2d9ee5e..57220f2 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY_X8) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X8); DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X8) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X8) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X8) /* { dg-final { scan-assembler {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c index 9cd4dae..45244a0 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY_X4) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X4); DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X4) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X4) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X4) /* { dg-final { scan-assembler {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c index 515d544..3bad130 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY); DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY) /* { dg-final { scan-assembler-not {vadd.vx} } } */ /* { dg-final { scan-assembler-not {vsub.vx} } } */ /* { dg-final { scan-assembler-not {vrsub.vx} } } */ /* { dg-final { scan-assembler-not {vand.vx} } } */ /* { dg-final { scan-assembler-not {vor.vx} } } */ +/* { dg-final { scan-assembler-not {vxor.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c index f59254b..bb860dd 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c @@ -10,9 +10,11 @@ DEF_VX_BINARY_CASE_1_WRAP(T, -, sub, VX_BINARY_BODY_X16) DEF_VX_BINARY_REVERSE_CASE_1_WRAP(T, -, rsub, VX_BINARY_REVERSE_BODY_X16); DEF_VX_BINARY_CASE_1_WRAP(T, &, and, VX_BINARY_BODY_X16) DEF_VX_BINARY_CASE_1_WRAP(T, |, or, VX_BINARY_BODY_X16) +DEF_VX_BINARY_CASE_1_WRAP(T, ^, xor, VX_BINARY_BODY_X16) /* { dg-final { scan-assembler {vadd.vx} } } */ /* { dg-final { scan-assembler {vsub.vx} } } */ /* { dg-final { scan-assembler {vrsub.vx} } } */ /* { dg-final { scan-assembler {vand.vx} } } */ /* { dg-final { scan-assembler {vor.vx} } } */ +/* { dg-final { scan-assembler {vxor.vx} } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h index cd3cede..c7289ac 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h @@ -1966,4 +1966,592 @@ uint64_t TEST_BINARY_DATA(uint64_t, or)[][3][N] = }, }; +int8_t TEST_BINARY_DATA(int8_t, xor)[][3][N] = +{ + { + { 0x1 }, + { + 0x1, 0x1, 0x1, 0x1, + 0x2, 0x2, 0x2, 0x2, + 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, + }, + { + 0x0, 0x0, 0x0, 0x0, + 0x3, 0x3, 0x3, 0x3, + 0x1, 0x1, 0x1, 0x1, + 0xfe, 0xfe, 0xfe, 0xfe, + }, + }, + { + { 0x7f }, + { + 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, + 0xf, 0xf, 0xf, 0xf, + 0x70, 0x70, 0x70, 0x70, + }, + { + 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, + 0x70, 0x70, 0x70, 0x70, + 0xf, 0xf, 0xf, 0xf, + }, + }, + { + { 0xf0 }, + { + 0xff, 0xff, 0xff, 0xff, + 0x1f, 0x1f, 0x1f, 0x1f, + 0x80, 0x80, 0x80, 0x80, + 0x1, 0x1, 0x1, 0x1, + }, + { + 0xf, 0xf, 0xf, 0xf, + 0xef, 0xef, 0xef, 0xef, + 0x70, 0x70, 0x70, 0x70, + 0xf1, 0xf1, 0xf1, 0xf1, + }, + }, +}; + +int16_t TEST_BINARY_DATA(int16_t, xor)[][3][N] = +{ + { + { 0x1 }, + { + 0x1, 0x1, 0x1, 0x1, + 0x2, 0x2, 0x2, 0x2, + 0x0, 0x0, 0x0, 0x0, + 0xffff, 0xffff, 0xffff, 0xffff, + }, + { + 0x0, 0x0, 0x0, 0x0, + 0x3, 0x3, 0x3, 0x3, + 0x1, 0x1, 0x1, 0x1, + 0xfffe, 0xfffe, 0xfffe, 0xfffe, + }, + }, + { + { 0x7fff }, + { + 0x7fff, 0x7fff, 0x7fff, 0x7fff, + 0x8000, 0x8000, 0x8000, 0x8000, + 0xf, 0xf, 0xf, 0xf, + 0x7000, 0x7000, 0x7000, 0x7000, + }, + { + 0x0, 0x0, 0x0, 0x0, + 0xffff, 0xffff, 0xffff, 0xffff, + 0x7ff0, 0x7ff0, 0x7ff0, 0x7ff0, + 0x0fff, 0x0fff, 0x0fff, 0x0fff, + }, + }, + { + { 0xfff0 }, + { + 0xffff, 0xffff, 0xffff, 0xffff, + 0x1f, 0x1f, 0x1f, 0x1f, + 0x8000, 0x8000, 0x8000, 0x8000, + 0x1, 0x1, 0x1, 0x1, + }, + { + 0xf, 0xf, 0xf, 0xf, + 0xffef, 0xffef, 0xffef, 0xffef, + 0x7ff0, 0x7ff0, 0x7ff0, 0x7ff0, + 0xfff1, 0xfff1, 0xfff1, 0xfff1, + }, + }, +}; + +int32_t TEST_BINARY_DATA(int32_t, xor)[][3][N] = +{ + { + { 0x1 }, + { + 0x1, 0x1, 0x1, 0x1, + 0x2, 0x2, 0x2, 0x2, + 0x0, 0x0, 0x0, 0x0, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + }, + { + 0x0, 0x0, 0x0, 0x0, + 0x3, 0x3, 0x3, 0x3, + 0x1, 0x1, 0x1, 0x1, + 0xfffffffe, 0xfffffffe, 0xfffffffe, 0xfffffffe, + }, + }, + { + { 0x7fffffff }, + { + 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, + 0x80000000, 0x80000000, 0x80000000, 0x80000000, + 0xf, 0xf, 0xf, 0xf, + 0x70000000, 0x70000000, 0x70000000, 0x70000000, + }, + { + 0x0, 0x0, 0x0, 0x0, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0x7ffffff0, 0x7ffffff0, 0x7ffffff0, 0x7ffffff0, + 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, + }, + }, + { + { 0xfffffff0 }, + { + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0x1f, 0x1f, 0x1f, 0x1f, + 0x80000000, 0x80000000, 0x80000000, 0x80000000, + 0x1, 0x1, 0x1, 0x1, + }, + { + 0xf, 0xf, 0xf, 0xf, + 0xffffffef, 0xffffffef, 0xffffffef, 0xffffffef, + 0x7ffffff0, 0x7ffffff0, 0x7ffffff0, 0x7ffffff0, + 0xfffffff1, 0xfffffff1, 0xfffffff1, 0xfffffff1, + }, + }, +}; + +int64_t TEST_BINARY_DATA(int64_t, xor)[][3][N] = +{ + { + { 0x1 }, + { + 0x1, 0x1, 0x1, 0x1, + 0x2, 0x2, 0x2, 0x2, + 0x0, 0x0, 0x0, 0x0, + 0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull, + }, + { + 0x0, 0x0, 0x0, 0x0, + 0x3, 0x3, 0x3, 0x3, + 0x1, 0x1, 0x1, 0x1, + 0xfffffffffffffffeull, 0xfffffffffffffffeull, 0xfffffffffffffffeull, 0xfffffffffffffffeull, + }, + }, + { + { 0x7fffffffffffffffull }, + { + 0x7fffffffffffffffull, 0x7fffffffffffffffull, 0x7fffffffffffffffull, 0x7fffffffffffffffull, + 0x8000000000000000ull, 0x8000000000000000ull, 0x8000000000000000ull, 0x8000000000000000ull, + 0xf, 0xf, 0xf, 0xf, + 0x7000000000000000ull, 0x7000000000000000ull, 0x7000000000000000ull, 0x7000000000000000ull, + }, + { + 0x0, 0x0, 0x0, 0x0, + 0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull, + 0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull, + 0xfffffffffffffffull, 0xfffffffffffffffull, 0xfffffffffffffffull, 0xfffffffffffffffull, + }, + }, + { + { 0xfffffffffffffff0ull }, + { + 0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull, + 0x1f, 0x1f, 0x1f, 0x1f, + 0x8000000000000000ull, 0x8000000000000000ull, 0x8000000000000000ull, 0x8000000000000000ull, + 0x1, 0x1, 0x1, 0x1, + }, + { + 0xf, 0xf, 0xf, 0xf, + 0xffffffffffffffefull, 0xffffffffffffffefull, 0xffffffffffffffefull, 0xffffffffffffffefull, + 0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull, + 0xfffffffffffffff1ull, 0xfffffffffffffff1ull, 0xfffffffffffffff1ull, 0xfffffffffffffff1ull, + }, + }, +}; + +uint8_t TEST_BINARY_DATA(uint8_t, xor)[][3][N] = +{ + { + { 0x1 }, + { + 0x1, 0x1, 0x1, 0x1, + 0x2, 0x2, 0x2, 0x2, + 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, + }, + { + 0x0, 0x0, 0x0, 0x0, + 0x3, 0x3, 0x3, 0x3, + 0x1, 0x1, 0x1, 0x1, + 0xfe, 0xfe, 0xfe, 0xfe, + }, + }, + { + { 0x7f }, + { + 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, + 0xf, 0xf, 0xf, 0xf, + 0x70, 0x70, 0x70, 0x70, + }, + { + 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, + 0x70, 0x70, 0x70, 0x70, + 0xf, 0xf, 0xf, 0xf, + }, + }, + { + { 0xf0 }, + { + 0xff, 0xff, 0xff, 0xff, + 0x1f, 0x1f, 0x1f, 0x1f, + 0x80, 0x80, 0x80, 0x80, + 0x1, 0x1, 0x1, 0x1, + }, + { + 0xf, 0xf, 0xf, 0xf, + 0xef, 0xef, 0xef, 0xef, + 0x70, 0x70, 0x70, 0x70, + 0xf1, 0xf1, 0xf1, 0xf1, + }, + }, +}; + +uint16_t TEST_BINARY_DATA(uint16_t, xor)[][3][N] = +{ + { + { 0x1 }, + { + 0x1, 0x1, 0x1, 0x1, + 0x2, 0x2, 0x2, 0x2, + 0x0, 0x0, 0x0, 0x0, + 0xffff, 0xffff, 0xffff, 0xffff, + }, + { + 0x0, 0x0, 0x0, 0x0, + 0x3, 0x3, 0x3, 0x3, + 0x1, 0x1, 0x1, 0x1, + 0xfffe, 0xfffe, 0xfffe, 0xfffe, + }, + }, + { + { 0x7fff }, + { + 0x7fff, 0x7fff, 0x7fff, 0x7fff, + 0x8000, 0x8000, 0x8000, 0x8000, + 0xf, 0xf, 0xf, 0xf, + 0x7000, 0x7000, 0x7000, 0x7000, + }, + { + 0x0, 0x0, 0x0, 0x0, + 0xffff, 0xffff, 0xffff, 0xffff, + 0x7ff0, 0x7ff0, 0x7ff0, 0x7ff0, + 0x0fff, 0x0fff, 0x0fff, 0x0fff, + }, + }, + { + { 0xfff0 }, + { + 0xffff, 0xffff, 0xffff, 0xffff, + 0x1f, 0x1f, 0x1f, 0x1f, + 0x8000, 0x8000, 0x8000, 0x8000, + 0x1, 0x1, 0x1, 0x1, + }, + { + 0xf, 0xf, 0xf, 0xf, + 0xffef, 0xffef, 0xffef, 0xffef, + 0x7ff0, 0x7ff0, 0x7ff0, 0x7ff0, + 0xfff1, 0xfff1, 0xfff1, 0xfff1, + }, + }, +}; + +uint32_t TEST_BINARY_DATA(uint32_t, xor)[][3][N] = +{ + { + { 0x1 }, + { + 0x1, 0x1, 0x1, 0x1, + 0x2, 0x2, 0x2, 0x2, + 0x0, 0x0, 0x0, 0x0, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + }, + { + 0x0, 0x0, 0x0, 0x0, + 0x3, 0x3, 0x3, 0x3, + 0x1, 0x1, 0x1, 0x1, + 0xfffffffe, 0xfffffffe, 0xfffffffe, 0xfffffffe, + }, + }, + { + { 0x7fffffff }, + { + 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, + 0x80000000, 0x80000000, 0x80000000, 0x80000000, + 0xf, 0xf, 0xf, 0xf, + 0x70000000, 0x70000000, 0x70000000, 0x70000000, + }, + { + 0x0, 0x0, 0x0, 0x0, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0x7ffffff0, 0x7ffffff0, 0x7ffffff0, 0x7ffffff0, + 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff, + }, + }, + { + { 0xfffffff0 }, + { + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0x1f, 0x1f, 0x1f, 0x1f, + 0x80000000, 0x80000000, 0x80000000, 0x80000000, + 0x1, 0x1, 0x1, 0x1, + }, + { + 0xf, 0xf, 0xf, 0xf, + 0xffffffef, 0xffffffef, 0xffffffef, 0xffffffef, + 0x7ffffff0, 0x7ffffff0, 0x7ffffff0, 0x7ffffff0, + 0xfffffff1, 0xfffffff1, 0xfffffff1, 0xfffffff1, + }, + }, +}; + +uint64_t TEST_BINARY_DATA(uint64_t, xor)[][3][N] = +{ + { + { 0x1 }, + { + 0x1, 0x1, 0x1, 0x1, + 0x2, 0x2, 0x2, 0x2, + 0x0, 0x0, 0x0, 0x0, + 0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull, + }, + { + 0x0, 0x0, 0x0, 0x0, + 0x3, 0x3, 0x3, 0x3, + 0x1, 0x1, 0x1, 0x1, + 0xfffffffffffffffeull, 0xfffffffffffffffeull, 0xfffffffffffffffeull, 0xfffffffffffffffeull, + }, + }, + { + { 0x7fffffffffffffffull }, + { + 0x7fffffffffffffffull, 0x7fffffffffffffffull, 0x7fffffffffffffffull, 0x7fffffffffffffffull, + 0x8000000000000000ull, 0x8000000000000000ull, 0x8000000000000000ull, 0x8000000000000000ull, + 0xf, 0xf, 0xf, 0xf, + 0x7000000000000000ull, 0x7000000000000000ull, 0x7000000000000000ull, 0x7000000000000000ull, + }, + { + 0x0, 0x0, 0x0, 0x0, + 0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull, + 0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull, + 0xfffffffffffffffull, 0xfffffffffffffffull, 0xfffffffffffffffull, 0xfffffffffffffffull, + }, + }, + { + { 0xfffffffffffffff0ull }, + { + 0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull, 0xffffffffffffffffull, + 0x1f, 0x1f, 0x1f, 0x1f, + 0x8000000000000000ull, 0x8000000000000000ull, 0x8000000000000000ull, 0x8000000000000000ull, + 0x1, 0x1, 0x1, 0x1, + }, + { + 0xf, 0xf, 0xf, 0xf, + 0xffffffffffffffefull, 0xffffffffffffffefull, 0xffffffffffffffefull, 0xffffffffffffffefull, + 0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull, 0x7ffffffffffffff0ull, + 0xfffffffffffffff1ull, 0xfffffffffffffff1ull, 0xfffffffffffffff1ull, 0xfffffffffffffff1ull, + }, + }, +}; + +int8_t TEST_BINARY_DATA(int8_t, mul)[][3][N] = +{ + { + { 1 }, + { + 0, 0, 0, 0, + 1, 1, 1, 1, + -1, -1, -1, -1, + -2, -2, -2, -2, + }, + { + 0, 0, 0, 0, + 1, 1, 1, 1, + -1, -1, -1, -1, + -2, -2, -2, -2, + }, + }, + { + { 127 }, + { + 0, 0, 0, 0, + -1, -1, -1, -1, + -128, -128, -128, -128, + -2, -2, -2, -2, + }, + { + 0, 0, 0, 0, + -127, -127, -127, -127, + -128, -128, -128, -128, + 2, 2, 2, 2, + }, + }, + { + { -128 }, + { + 0, 0, 0, 0, + 1, 1, 1, 1, + 127, 127, 127, 127, + 2, 2, 2, 2, + }, + { + 0, 0, 0, 0, + -128, -128, -128, -128, + -128, -128, -128, -128, + 0, 0, 0, 0, + }, + }, +}; + +int16_t TEST_BINARY_DATA(int16_t, mul)[][3][N] = +{ + { + { 1 }, + { + 0, 0, 0, 0, + 1, 1, 1, 1, + -1, -1, -1, -1, + -2, -2, -2, -2, + }, + { + 0, 0, 0, 0, + 1, 1, 1, 1, + -1, -1, -1, -1, + -2, -2, -2, -2, + }, + }, + { + { 32767 }, + { + 0, 0, 0, 0, + -1, -1, -1, -1, + -32768, -32768, -32768, -32768, + -2, -2, -2, -2, + }, + { + 0, 0, 0, 0, + -32767, -32767, -32767, -32767, + -32768, -32768, -32768, -32768, + 2, 2, 2, 2, + }, + }, + { + { -32768 }, + { + 0, 0, 0, 0, + 1, 1, 1, 1, + 32767, 32767, 32767, 32767, + 2, 2, 2, 2, + }, + { + 0, 0, 0, 0, + -32768, -32768, -32768, -32768, + -32768, -32768, -32768, -32768, + 0, 0, 0, 0, + }, + }, +}; + +int32_t TEST_BINARY_DATA(int32_t, mul)[][3][N] = +{ + { + { 1 }, + { + 0, 0, 0, 0, + 1, 1, 1, 1, + -1, -1, -1, -1, + -2, -2, -2, -2, + }, + { + 0, 0, 0, 0, + 1, 1, 1, 1, + -1, -1, -1, -1, + -2, -2, -2, -2, + }, + }, + { + { 2147483647 }, + { + 0, 0, 0, 0, + -1, -1, -1, -1, + -2147483648, -2147483648, -2147483648, -2147483648, + -2, -2, -2, -2, + }, + { + 0, 0, 0, 0, + -2147483647, -2147483647, -2147483647, -2147483647, + -2147483648, -2147483648, -2147483648, -2147483648, + 2, 2, 2, 2, + }, + }, + { + { -2147483648 }, + { + 0, 0, 0, 0, + 1, 1, 1, 1, + 2147483647, 2147483647, 2147483647, 2147483647, + 2, 2, 2, 2, + }, + { + 0, 0, 0, 0, + -2147483648, -2147483648, -2147483648, -2147483648, + -2147483648, -2147483648, -2147483648, -2147483648, + 0, 0, 0, 0, + }, + }, +}; + +int64_t TEST_BINARY_DATA(int64_t, mul)[][3][N] = +{ + { + { 1 }, + { + 0, 0, 0, 0, + 1, 1, 1, 1, + -1, -1, -1, -1, + -2, -2, -2, -2, + }, + { + 0, 0, 0, 0, + 1, 1, 1, 1, + -1, -1, -1, -1, + -2, -2, -2, -2, + }, + }, + { + { 9223372036854775807ll }, + { + 0, 0, 0, 0, + -1, -1, -1, -1, + -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, + -2, -2, -2, -2, + }, + { + 0, 0, 0, 0, + -9223372036854775807ll, -9223372036854775807ll, -9223372036854775807ll, -9223372036854775807ll, + -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, + 2, 2, 2, 2, + }, + }, + { + { -9223372036854775808ull }, + { + 0, 0, 0, 0, + 1, 1, 1, 1, + 9223372036854775807ll, 9223372036854775807ll, 9223372036854775807ll, 9223372036854775807ll, + 2, 2, 2, 2, + }, + { + 0, 0, 0, 0, + -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, + -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, -9223372036854775808ull, + 0, 0, 0, 0, + }, + }, +}; + #endif diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i16.c new file mode 100644 index 0000000..c6be0ec --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i16.c @@ -0,0 +1,15 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */ + +#include "vx_binary.h" +#include "vx_binary_data.h" + +#define T int16_t +#define NAME mul + +DEF_VX_BINARY_CASE_0_WRAP(T, *, NAME) + +#define TEST_DATA TEST_BINARY_DATA_WRAP(T, NAME) +#define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n) + +#include "vx_binary_run.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i32.c new file mode 100644 index 0000000..3c78042 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i32.c @@ -0,0 +1,15 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */ + +#include "vx_binary.h" +#include "vx_binary_data.h" + +#define T int32_t +#define NAME mul + +DEF_VX_BINARY_CASE_0_WRAP(T, *, NAME) + +#define TEST_DATA TEST_BINARY_DATA_WRAP(T, NAME) +#define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n) + +#include "vx_binary_run.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i64.c new file mode 100644 index 0000000..63925d9 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i64.c @@ -0,0 +1,15 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */ + +#include "vx_binary.h" +#include "vx_binary_data.h" + +#define T int64_t +#define NAME mul + +DEF_VX_BINARY_CASE_0_WRAP(T, *, NAME) + +#define TEST_DATA TEST_BINARY_DATA_WRAP(T, NAME) +#define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n) + +#include "vx_binary_run.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i8.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i8.c new file mode 100644 index 0000000..69962f5 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vmul-run-1-i8.c @@ -0,0 +1,15 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */ + +#include "vx_binary.h" +#include "vx_binary_data.h" + +#define T int8_t +#define NAME mul + +DEF_VX_BINARY_CASE_0_WRAP(T, *, NAME) + +#define TEST_DATA TEST_BINARY_DATA_WRAP(T, NAME) +#define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n) + +#include "vx_binary_run.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i16.c new file mode 100644 index 0000000..8441720 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i16.c @@ -0,0 +1,15 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */ + +#include "vx_binary.h" +#include "vx_binary_data.h" + +#define T int16_t +#define NAME xor + +DEF_VX_BINARY_CASE_0_WRAP(T, ^, NAME) + +#define TEST_DATA TEST_BINARY_DATA_WRAP(T, NAME) +#define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n) + +#include "vx_binary_run.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i32.c new file mode 100644 index 0000000..cdb773f --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i32.c @@ -0,0 +1,15 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */ + +#include "vx_binary.h" +#include "vx_binary_data.h" + +#define T int32_t +#define NAME xor + +DEF_VX_BINARY_CASE_0_WRAP(T, ^, NAME) + +#define TEST_DATA TEST_BINARY_DATA_WRAP(T, NAME) +#define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n) + +#include "vx_binary_run.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i64.c new file mode 100644 index 0000000..8618b9e --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i64.c @@ -0,0 +1,15 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */ + +#include "vx_binary.h" +#include "vx_binary_data.h" + +#define T int64_t +#define NAME xor + +DEF_VX_BINARY_CASE_0_WRAP(T, ^, NAME) + +#define TEST_DATA TEST_BINARY_DATA_WRAP(T, NAME) +#define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n) + +#include "vx_binary_run.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i8.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i8.c new file mode 100644 index 0000000..13724ce --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-i8.c @@ -0,0 +1,15 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */ + +#include "vx_binary.h" +#include "vx_binary_data.h" + +#define T int8_t +#define NAME xor + +DEF_VX_BINARY_CASE_0_WRAP(T, ^, NAME) + +#define TEST_DATA TEST_BINARY_DATA_WRAP(T, NAME) +#define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n) + +#include "vx_binary_run.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u16.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u16.c new file mode 100644 index 0000000..e6030f3 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u16.c @@ -0,0 +1,15 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */ + +#include "vx_binary.h" +#include "vx_binary_data.h" + +#define T uint16_t +#define NAME xor + +DEF_VX_BINARY_CASE_0_WRAP(T, ^, NAME) + +#define TEST_DATA TEST_BINARY_DATA_WRAP(T, NAME) +#define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n) + +#include "vx_binary_run.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u32.c new file mode 100644 index 0000000..cdb773f --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u32.c @@ -0,0 +1,15 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */ + +#include "vx_binary.h" +#include "vx_binary_data.h" + +#define T int32_t +#define NAME xor + +DEF_VX_BINARY_CASE_0_WRAP(T, ^, NAME) + +#define TEST_DATA TEST_BINARY_DATA_WRAP(T, NAME) +#define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n) + +#include "vx_binary_run.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u64.c new file mode 100644 index 0000000..44f0fff --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u64.c @@ -0,0 +1,15 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */ + +#include "vx_binary.h" +#include "vx_binary_data.h" + +#define T uint64_t +#define NAME xor + +DEF_VX_BINARY_CASE_0_WRAP(T, ^, NAME) + +#define TEST_DATA TEST_BINARY_DATA_WRAP(T, NAME) +#define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n) + +#include "vx_binary_run.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u8.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u8.c new file mode 100644 index 0000000..2e983e5 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vxor-run-1-u8.c @@ -0,0 +1,15 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */ + +#include "vx_binary.h" +#include "vx_binary_data.h" + +#define T uint8_t +#define NAME xor + +DEF_VX_BINARY_CASE_0_WRAP(T, ^, NAME) + +#define TEST_DATA TEST_BINARY_DATA_WRAP(T, NAME) +#define TEST_RUN(T, NAME, out, in, x, n) RUN_VX_BINARY_CASE_0_WRAP(T, NAME, out, in, x, n) + +#include "vx_binary_run.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv32gcv.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv32gcv.c index 5880ccc..b7246a3 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv32gcv.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv32gcv.c @@ -3,9 +3,6 @@ #include "vec-avg-template.h" -/* { dg-final { scan-assembler-times {\tvwadd\.vv} 6 } } */ -/* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*0} 3 } } */ -/* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 3 } } */ -/* { dg-final { scan-assembler-times {\tvadd\.vi} 3 } } */ -/* { dg-final { scan-assembler-times {\tvnsra.wi} 6 } } */ +/* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 6 } } */ /* { dg-final { scan-assembler-times {vaaddu\.vv} 6 } } */ +/* { dg-final { scan-assembler-times {vaadd\.vv} 3 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv64gcv.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv64gcv.c index 916f33d..3ffe0ef 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv64gcv.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/widen/vec-avg-rv64gcv.c @@ -3,9 +3,6 @@ #include "vec-avg-template.h" -/* { dg-final { scan-assembler-times {\tvwadd\.vv} 6 } } */ -/* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*0} 3 } } */ -/* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 3 } } */ -/* { dg-final { scan-assembler-times {\tvadd\.vi} 3 } } */ -/* { dg-final { scan-assembler-times {\tvnsra\.wi} 6 } } */ +/* { dg-final { scan-assembler-times {csrwi\s*vxrm,\s*2} 6 } } */ /* { dg-final { scan-assembler-times {vaaddu\.vv} 6 } } */ +/* { dg-final { scan-assembler-times {vaadd\.vv} 3 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/pr120436.c b/gcc/testsuite/gcc.target/riscv/rvv/base/pr120436.c new file mode 100644 index 0000000..d22091e --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/base/pr120436.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gc -mabi=lp64d -O0" } */ + +/* Use -O0 as otherwise the unused intrinsics get + optimized away. We used to ICE here instead of + emitting an error. */ + +#include "riscv_vector.h" + +void +clean_subreg (int32_t *in, int32_t *out, size_t m) /* { dg-error {this operation requires the RVV ISA extension} } */ +{ + vint16m8_t v24, v8, v16; + vint32m8_t result = __riscv_vle32_v_i32m8 (in, 32); /* { dg-error {built-in function '__riscv_vle32_v_i32m8\(in, 32\)' requires the 'v' ISA extension} } */ + vint32m1_t v0 = __riscv_vget_v_i32m8_i32m1 (result, 0); +} diff --git a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-2.c b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i16.c index 3878286..2e23af5 100644 --- a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-2.c +++ b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i16.c @@ -29,4 +29,29 @@ */ DEF_SAT_S_ADD_IMM_FMT_1(0, int16_t, uint16_t, -7, INT16_MIN, INT16_MAX) -/* { dg-final { scan-tree-dump-times ".SAT_ADD " 1 "optimized" } } */ +/* +** sat_s_add_imm_int16_t_fmt_1_1: +** addi\s+[atx][0-9]+,\s*a0,\s*-1 +** not\s+[atx][0-9]+,\s*a0 +** xor\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+ +** srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*15 +** srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*15 +** xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1 +** and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+ +** andi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1 +** srai\s+a0,\s*a0,\s*63 +** li\s+[atx][0-9]+,\s*32768 +** addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1 +** xor\s+[atx][0-9]+,\s*[atx][0-9]+,\s*a0 +** neg\s+a0,\s*[atx][0-9]+ +** and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*a0 +** addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1 +** and\s+a0,\s*[atx][0-9]+,\s*[atx][0-9]+ +** or\s+a0,\s*a0,\s*[atx][0-9]+ +** slliw\s+a0,\s*a0,\s*16 +** sraiw\s+a0,\s*a0,\s*16 +** ret +*/ +DEF_SAT_S_ADD_IMM_FMT_1(1, int16_t, uint16_t, -1, INT16_MIN, INT16_MAX) + +/* { dg-final { scan-tree-dump-times ".SAT_ADD " 2 "optimized" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-3.c b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i32.c index c9fbc66..e63211f 100644 --- a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-3.c +++ b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i32.c @@ -27,4 +27,28 @@ */ DEF_SAT_S_ADD_IMM_FMT_1(0, int32_t, uint32_t, 10, INT32_MIN, INT32_MAX) -/* { dg-final { scan-tree-dump-times ".SAT_ADD " 1 "optimized" } } */ +/* +** sat_s_add_imm_int32_t_fmt_1_1: +** addi\s+[atx][0-9]+,\s*a0,\s*-1 +** not\s+[atx][0-9]+,\s*a0 +** xor\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+ +** srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*31 +** srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*31 +** xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1 +** and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+ +** andi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1 +** srai\s+a0,\s*a0,\s*63 +** li\s+[atx][0-9]+,\s*-2147483648 +** xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1 +** xor\s+[atx][0-9]+,\s*[atx][0-9]+,\s*a0 +** neg\s+a0,\s*[atx][0-9]+ +** and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*a0 +** addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1 +** and\s+a0,\s*[atx][0-9]+,\s*[atx][0-9]+ +** or\s+a0,\s*a0,\s*[atx][0-9]+ +** sext.w\s+a0,\s*a0 +** ret +*/ +DEF_SAT_S_ADD_IMM_FMT_1(1, int32_t, uint32_t, -1, INT32_MIN, INT32_MAX) + +/* { dg-final { scan-tree-dump-times ".SAT_ADD " 2 "optimized" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-4.c b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i64.c index 2aa9545..3843b71 100644 --- a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-4.c +++ b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i64.c @@ -25,4 +25,24 @@ */ DEF_SAT_S_ADD_IMM_FMT_1(0, int64_t, uint64_t, 10, INT64_MIN, INT64_MAX) -/* { dg-final { scan-tree-dump-times ".SAT_ADD " 1 "optimized" } } */ +/* +** sat_s_add_imm_int64_t_fmt_1_1: +** addi\s+[atx][0-9]+,\s*a0,\s*-1 +** xor\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+ +** srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*63 +** slti\s+[atx][0-9]+,\s*a0,\s*0 +** and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+ +** srai\s+[atx][0-9]+,\s*a0,\s*63 +** li\s+[atx][0-9]+,\s*-1 +** srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1 +** xor\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+ +** neg\s+[atx][0-9]+,\s*[atx][0-9]+ +** and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+ +** addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1 +** and\s+a0,\s*[atx][0-9]+,\s*[atx][0-9]+ +** or\s+a0,\s*a0,\s*[atx][0-9]+ +** ret +*/ +DEF_SAT_S_ADD_IMM_FMT_1(1, int64_t, uint64_t, -1, INT64_MIN, INT64_MAX) + +/* { dg-final { scan-tree-dump-times ".SAT_ADD " 2 "optimized" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1.c b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i8.c index b6f1731..ceae1ea 100644 --- a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1.c +++ b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-i8.c @@ -26,4 +26,24 @@ */ DEF_SAT_S_ADD_IMM_FMT_1(0, int8_t, uint8_t, 9, INT8_MIN, INT8_MAX) -/* { dg-final { scan-tree-dump-times ".SAT_ADD " 1 "optimized" } } */ +/* +** sat_s_add_imm_int8_t_fmt_1_1: +** addi\s+[atx][0-9]+,\s*a0,\s*-1 +** xor\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+ +** and\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+ +** slli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*56 +** srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*63 +** srai\s+a0,\s*a0,\s*63 +** xori\s+[atx][0-9]+,\s*a0,\s*127 +** neg\s+a0,\s*a5 +** and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*a0 +** addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1 +** and\s+a0,\s*[atx][0-9]+,\s*[atx][0-9]+ +** or\s+a0,\s*a0,\s*[atx][0-9]+ +** slliw\s+a0,\s*a0,\s*24 +** sraiw\s+a0,\s*a0,\s*24 +** ret +*/ +DEF_SAT_S_ADD_IMM_FMT_1(1, int8_t, uint8_t, -1, INT8_MIN, INT8_MAX) + +/* { dg-final { scan-tree-dump-times ".SAT_ADD " 2 "optimized" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-2.c b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i16.c index 187a098..ae2c306 100644 --- a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-2.c +++ b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i16.c @@ -7,6 +7,7 @@ DEF_SAT_S_ADD_IMM_FMT_1(0, int16_t, uint16_t, -32768, INT16_MIN, INT16_MAX) DEF_SAT_S_ADD_IMM_FMT_1(1, int16_t, uint16_t, 32767, INT16_MIN, INT16_MAX) DEF_SAT_S_ADD_IMM_FMT_1(2, int16_t, uint16_t, 100, INT16_MIN, INT16_MAX) DEF_SAT_S_ADD_IMM_FMT_1(3, int16_t, uint16_t, -100, INT16_MIN, INT16_MAX) +DEF_SAT_S_ADD_IMM_FMT_1(4, int16_t, uint16_t, -1, INT16_MIN, INT16_MAX) #define T int16_t #define RUN(INDEX,T, x, expect) RUN_SAT_S_ADD_IMM_FMT_1(INDEX, T, x, expect) @@ -21,6 +22,8 @@ T d[][2] = { { -32768, -32668, }, { -32768, -32768, }, { 0, -100, }, + { -32768, -32768, }, + { 0, -1, }, }; int @@ -38,5 +41,8 @@ main () RUN (3, T, d[6][0], d[6][1]); RUN (3, T, d[7][0], d[7][1]); + RUN (4, T, d[8][0], d[8][1]); + RUN (4, T, d[9][0], d[9][1]); + return 0; } diff --git a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-3.c b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i32.c index 899fda8..02a947f 100644 --- a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-3.c +++ b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i32.c @@ -7,6 +7,7 @@ DEF_SAT_S_ADD_IMM_FMT_1(0, int32_t, uint32_t, -2147483648, INT32_MIN, INT32_MAX) DEF_SAT_S_ADD_IMM_FMT_1(1, int32_t, uint32_t, 2147483647, INT32_MIN, INT32_MAX) DEF_SAT_S_ADD_IMM_FMT_1(2, int32_t, uint32_t, 100, INT32_MIN, INT32_MAX) DEF_SAT_S_ADD_IMM_FMT_1(3, int32_t, uint32_t, -100, INT32_MIN, INT32_MAX) +DEF_SAT_S_ADD_IMM_FMT_1(4, int32_t, uint32_t, -1, INT32_MIN, INT32_MAX) #define T int32_t #define RUN(INDEX,T, x, expect) RUN_SAT_S_ADD_IMM_FMT_1(INDEX, T, x, expect) @@ -21,6 +22,8 @@ T d[][2] = { { -300, -200, }, { 100, 0, }, { 0, -100, }, + { 100, 99, }, + { 0, -1, }, }; int @@ -38,5 +41,8 @@ main () RUN (3, T, d[6][0], d[6][1]); RUN (3, T, d[7][0], d[7][1]); + RUN (4, T, d[8][0], d[8][1]); + RUN (4, T, d[9][0], d[9][1]); + return 0; } diff --git a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-4.c b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i64.c index 3dc4f72..40270ec 100644 --- a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-4.c +++ b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i64.c @@ -7,6 +7,7 @@ DEF_SAT_S_ADD_IMM_FMT_1(0, int64_t, uint64_t, (-9223372036854775807ll - 1), INT6 DEF_SAT_S_ADD_IMM_FMT_1(1, int64_t, uint64_t, 9223372036854775807ll, INT64_MIN, INT64_MAX) DEF_SAT_S_ADD_IMM_FMT_1(2, int64_t, uint64_t, 100, INT64_MIN, INT64_MAX) DEF_SAT_S_ADD_IMM_FMT_1(3, int64_t, uint64_t, -100, INT64_MIN, INT64_MAX) +DEF_SAT_S_ADD_IMM_FMT_1(4, int64_t, uint64_t, -1, INT64_MIN, INT64_MAX) #define T int64_t #define RUN(INDEX,T, x, expect) RUN_SAT_S_ADD_IMM_FMT_1(INDEX, T, x, expect) @@ -21,6 +22,8 @@ T d[][2] = { { -1, 99, }, { 0, -100, }, { 100, 0, }, + { 0, -1, }, + { 100, 99, }, }; int @@ -38,5 +41,8 @@ main () RUN (3, T, d[6][0], d[6][1]); RUN (3, T, d[7][0], d[7][1]); + RUN (4, T, d[8][0], d[8][1]); + RUN (4, T, d[9][0], d[9][1]); + return 0; } diff --git a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1.c b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i8.c index c71b717..9efb743 100644 --- a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1.c +++ b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-run-1-i8.c @@ -7,6 +7,7 @@ DEF_SAT_S_ADD_IMM_FMT_1(0, int8_t, uint8_t, -128, INT8_MIN, INT8_MAX) DEF_SAT_S_ADD_IMM_FMT_1(1, int8_t, uint8_t, 127, INT8_MIN, INT8_MAX) DEF_SAT_S_ADD_IMM_FMT_1(2, int8_t, uint8_t, 6, INT8_MIN, INT8_MAX) DEF_SAT_S_ADD_IMM_FMT_1(3, int8_t, uint8_t, -6, INT8_MIN, INT8_MAX) +DEF_SAT_S_ADD_IMM_FMT_1(4, int8_t, uint8_t, -1, INT8_MIN, INT8_MAX) #define T int8_t #define RUN(INDEX,T, x, expect) RUN_SAT_S_ADD_IMM_FMT_1(INDEX, T, x, expect) @@ -21,6 +22,8 @@ T d[][2] = { { -10, -4, }, { -128, -128, }, { 127, 121, }, + { -128, -128, }, + { 1, 0, }, }; int @@ -38,5 +41,8 @@ main () RUN (3, T, d[6][0], d[6][1]); RUN (3, T, d[7][0], d[7][1]); + RUN (4, T, d[8][0], d[8][1]); + RUN (4, T, d[9][0], d[9][1]); + return 0; } diff --git a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-2-1.c b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i16.c index e9f7080..e9f7080 100644 --- a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-2-1.c +++ b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i16.c diff --git a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-3-1.c b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i32.c index 9dae425..9dae425 100644 --- a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-3-1.c +++ b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i32.c diff --git a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-1.c b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i8.c index 84c6bc7..84c6bc7 100644 --- a/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm-1-1.c +++ b/gcc/testsuite/gcc.target/riscv/sat/sat_s_add_imm_type_check-1-i8.c diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-extract-1.c b/gcc/testsuite/gcc.target/s390/vector/vec-extract-1.c new file mode 100644 index 0000000..9df7909 --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/vector/vec-extract-1.c @@ -0,0 +1,190 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -march=z14 -mzarch" } */ +/* { dg-final { check-function-bodies "**" "" } } */ + +typedef double V2DF __attribute__((vector_size(16))); +typedef float V4SF __attribute__((vector_size(16))); +typedef float V2SF __attribute__((vector_size(8))); +typedef double V1DF __attribute__((vector_size(8))); +typedef float V1SF __attribute__((vector_size(4))); +typedef long double V1TF __attribute__((vector_size(16))); + +/* +** extractfirstdouble: +** vlr %v0,%v24 +** br %r14 +*/ +double +extractfirstdouble (V2DF x) +{ + return x[0]; +} + +/* +** extractseconddouble: +** vrepg %v0,%v24,1 +** br %r14 +*/ +double +extractseconddouble (V2DF x) +{ + return x[1]; +} + +/* +** extractnthdouble: +** vlgvg (%r.),%v24,0\(%r2\) +** ldgr %f0,\1 +** br %r14 +*/ +double +extractnthdouble (V2DF x, int n) +{ + return x[n]; +} + +/* +** sumfirstdouble: +** vfadb %v0,%v24,%v26 +** br %r14 +*/ +double +sumfirstdouble (V2DF x, V2DF y) +{ + return (x + y)[0]; +} + +/* +** extractfirstfloat: +** vlr %v0,%v24 +** br %r14 +*/ +float +extractfirstfloat (V4SF x) +{ + return x[0]; +} + +/* +** extractsecondfloat: +** vrepf %v0,%v24,1 +** br %r14 +*/ +float +extractsecondfloat (V4SF x) +{ + return x[1]; +} + +/* +** extractthirdfloat: +** vrepf %v0,%v24,2 +** br %r14 +*/ +float +extractthirdfloat (V4SF x) +{ + return x[2]; +} + +/* +** extractfourthfloat: +** vrepf %v0,%v24,3 +** br %r14 +*/ +float +extractfourthfloat (V4SF x) +{ + return x[3]; +} + +/* +** extractnthfloat: +** vlgvf (%r.),%v24,0\(%r2\) +** vlvgf %v0,\1,0 +** br %r14 +*/ +float +extractnthfloat (V4SF x, int n) +{ + return x[n]; +} + +/* +** sumfirstfloat: +** vfasb %v0,%v24,%v26 +** br %r14 +*/ +float +sumfirstfloat (V4SF x, V4SF y) +{ + return (x + y)[0]; +} + +/* +** extractfirst2: +** vlr %v0,%v24 +** br %r14 +*/ +float +extractfirst2 (V2SF x) +{ + return x[0]; +} + +/* +** extractsecond2: +** vrepf %v0,%v24,1 +** br %r14 +*/ +float +extractsecond2 (V2SF x) +{ + return x[1]; +} + +/* +** extractnth2: +** vlgvf (%r.),%v24,0\(%r2\) +** vlvgf %v0,\1,0 +** br %r14 +*/ +float +extractnth2 (V2SF x, int n) +{ + return x[n]; +} + +/* +** extractsinglef: +** vlr %v0,%v24 +** br %r14 +*/ +float +extractsinglef (V1SF x) +{ + return x[0]; +} + +/* +** extractsingled: +** vlr %v0,%v24 +** br %r14 +*/ +double +extractsingled (V1DF x) +{ + return x[0]; +} + +/* +** extractsingleld: +** vlr (%v.),%v24 +** vst \1,0\(%r2\),3 +** br %r14 +*/ +long double +extractsingleld (V1TF x) +{ + return x[0]; +} diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-set-1.c b/gcc/testsuite/gcc.target/s390/vector/vec-set-1.c new file mode 100644 index 0000000..021a5b9 --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/vector/vec-set-1.c @@ -0,0 +1,133 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -march=z14 -mzarch" } */ +/* { dg-final { check-function-bodies "**" "" } } */ + +typedef double V2DF __attribute__((vector_size(16))); +typedef double V1DF __attribute__((vector_size(8))); +typedef float V4SF __attribute__((vector_size(16))); + +/* +** setdf0: +** vpdi %v24,%v0,%v24,1 +** br %r14 +*/ +V2DF +setdf0 (V2DF x, double y) +{ + x[0] = y; + return x; +} + +/* +** setdf1: +** vmrhg %v24,%v24,%v0 +** br %r14 +*/ +V2DF +setdf1 (V2DF x, double y) +{ + x[1] = y; + return x; +} + +/* +** setdfn: +** lgdr (%r.),%f0 +** vlvgg %v24,\1,0\(%r2\) +** br %r14 +*/ +V2DF +setdfn (V2DF x, double y, int n) +{ + x[n] = y; + return x; +} + +/* +** set1df: +** vlr %v24,%v0 +** br %r14 +*/ +V1DF +set1df (V1DF x, double y) +{ + x[0] = y; + return x; +} + +/* +** set1dfn: +** vlr %v24,%v0 +** br %r14 +*/ +V1DF +set1dfn (V1DF x, double y, int n) +{ + x[n] = y; + return x; +} + +/* +** setsf0: +** lgdr (%r.),%f0 +** vlvgf %v24,\1,0 +** br %r14 +*/ +V4SF +setsf0 (V4SF x, float y) +{ + x[0] = y; + return x; +} + +/* +** setsf1: +** lgdr (%r.),%f0 +** vlvgf %v24,\1,1 +** br %r14 +*/ +V4SF +setsf1 (V4SF x, float y) +{ + x[1] = y; + return x; +} + +/* +** setsf0: +** lgdr (%r.),%f0 +** vlvgf %v24,\1,2 +** br %r14 +*/ +V4SF +setsf2 (V4SF x, float y) +{ + x[2] = y; + return x; +} + +/* +** setsf1: +** lgdr (%r.),%f0 +** vlvgf %v24,\1,3 +** br %r14 +*/ +V4SF +setsf3 (V4SF x, float y) +{ + x[3] = y; + return x; +} + +/* +** setsfn: +** lgdr (%r.),%f0 +** vlvgf %v24,\1,0\(%r2\) +** br %r14 +*/ +V4SF +setsfn (V4SF x, float y, int n) +{ + x[n] = y; + return x; +} diff --git a/gcc/testsuite/gfortran.dg/comma_format_extension_1.f b/gcc/testsuite/gfortran.dg/comma_format_extension_1.f index a3a5a98..c4b43f0 100644 --- a/gcc/testsuite/gfortran.dg/comma_format_extension_1.f +++ b/gcc/testsuite/gfortran.dg/comma_format_extension_1.f @@ -1,5 +1,5 @@ ! { dg-do compile } -! { dg-options "" } +! { dg-options "-std=legacy" } ! test that the extension for a missing comma is accepted subroutine mysub diff --git a/gcc/testsuite/gfortran.dg/comma_format_extension_3.f b/gcc/testsuite/gfortran.dg/comma_format_extension_3.f index 0b00224..9d974d6 100644 --- a/gcc/testsuite/gfortran.dg/comma_format_extension_3.f +++ b/gcc/testsuite/gfortran.dg/comma_format_extension_3.f @@ -3,7 +3,7 @@ ! did do the correct thing at runtime. ! Note the missing , before i1 in the format. ! { dg-do run } -! { dg-options "" } +! { dg-options "-std=legacy" } character*12 c write (c,100) 0, 1 diff --git a/gcc/testsuite/gfortran.dg/continuation_13.f90 b/gcc/testsuite/gfortran.dg/continuation_13.f90 index 9799b59e..475c896 100644 --- a/gcc/testsuite/gfortran.dg/continuation_13.f90 +++ b/gcc/testsuite/gfortran.dg/continuation_13.f90 @@ -1,5 +1,5 @@ ! { dg-do run } -! { dg-options "-std=gnu" } +! { dg-options "-std=legacy" } ! PR64506 character(25) :: astring diff --git a/gcc/testsuite/gfortran.dg/dec_math_3.f90 b/gcc/testsuite/gfortran.dg/dec_math_3.f90 index 5bf4398..d2f57e2 100644 --- a/gcc/testsuite/gfortran.dg/dec_math_3.f90 +++ b/gcc/testsuite/gfortran.dg/dec_math_3.f90 @@ -1,8 +1,17 @@ ! { dg-options "-std=gnu" } ! { dg-do compile } -! Former ICE when simplifying asind, plus wrong function name in error message -real, parameter :: d = asind(1.1) ! { dg-error "Argument of ASIND at.*must be between -1 and 1" } -print *, d +real, parameter :: dacos = acosd(1.1) ! { dg-error "Argument of ACOSD at .1. must be within the closed interval \\\[-1, 1\\\]" } +print *, dacos +real, parameter :: dasin = asind(-1.1) ! { dg-error "Argument of ASIND at .1. must be within the closed interval \\\[-1, 1\\\]" } +print *, dasin +real, parameter :: datan2 = atan2d(0.0, 0.0) ! { dg-error "If the first argument of ATAN2D at .1. is zero, then the second argument must not be zero" } +print *, datan2 +real, parameter :: piacos = acospi(-1.1) ! { dg-error "Argument of ACOSPI at .1. must be within the closed interval \\\[-1, 1\\\]" } +print *, piacos +real, parameter :: piasin = asinpi(1.1) ! { dg-error "Argument of ASINPI at .1. must be within the closed interval \\\[-1, 1\\\]" } +print *, piasin +real, parameter :: piatan2 = atan2pi(0.0, 0.0) ! { dg-error "If the first argument of ATAN2PI at .1. is zero, then the second argument must not be zero" } +print *, piatan2 end diff --git a/gcc/testsuite/gfortran.dg/dec_math_5.f90 b/gcc/testsuite/gfortran.dg/dec_math_5.f90 index dee2de4..a7ff327 100644 --- a/gcc/testsuite/gfortran.dg/dec_math_5.f90 +++ b/gcc/testsuite/gfortran.dg/dec_math_5.f90 @@ -101,4 +101,67 @@ program p if (abs(b1 - 0.5) > e2) stop 38 if (abs(c1 - 0.5) > e3) stop 39 if (abs(d1 - 0.5) > e4) stop 40 + + a1 = acospi(0.5) + b1 = acospi(-0.5) + c1 = acospi(0.5) + d1 = acospi(-0.5) + if (abs(a1 - 1.0 / 3) > e1) stop 41 + if (abs(b1 - 2.0 / 3) > e2) stop 42 + if (abs(c1 - 1.0 / 3) > e3) stop 43 + if (abs(d1 - 2.0 / 3) > e4) stop 44 + + a1 = asinpi(0.5) + b1 = asinpi(-0.5) + c1 = asinpi(0.5) + d1 = asinpi(-0.5) + if (abs(a1 - 1.0 / 6) > e1) stop 45 + if (abs(b1 + 1.0 / 6) > e2) stop 46 + if (abs(c1 - 1.0 / 6) > e3) stop 47 + if (abs(d1 + 1.0 / 6) > e4) stop 48 + + a1 = atanpi(1.0) + b1 = atanpi(-1.0) + c1 = atanpi(1.0) + d1 = atanpi(-1.0) + if (abs(a1 - 0.25) > e1) stop 49 + if (abs(b1 + 0.25) > e2) stop 50 + if (abs(c1 - 0.25) > e3) stop 51 + if (abs(d1 + 0.25) > e4) stop 52 + + a1 = atan2pi(1.0, 1.0) + b1 = atan2pi(1.0, 1.0) + c1 = atan2pi(1.0, 1.0) + d1 = atan2pi(1.0, 1.0) + if (abs(a1 - 0.25) > e1) stop 53 + if (abs(b1 - 0.25) > e2) stop 54 + if (abs(c1 - 0.25) > e3) stop 55 + if (abs(d1 - 0.25) > e4) stop 56 + + a1 = cospi(1._4 / 3) + b1 = cospi(-1._8 / 3) + c1 = cospi(4._ep / 3) + d1 = cospi(-4._16 / 3) + if (abs(a1 - 0.5) > e1) stop 57 + if (abs(b1 - 0.5) > e2) stop 58 + if (abs(c1 + 0.5) > e3) stop 59 + if (abs(d1 + 0.5) > e4) stop 60 + + a1 = sinpi(1._4 / 6) + b1 = sinpi(-1._8 / 6) + c1 = sinpi(5._ep / 6) + d1 = sinpi(-7._16 / 6) + if (abs(a1 - 0.5) > e1) stop 61 + if (abs(b1 + 0.5) > e2) stop 62 + if (abs(c1 - 0.5) > e3) stop 63 + if (abs(d1 - 0.5) > e4) stop 64 + + a1 = tanpi(0.25) + b1 = tanpi(-0.25) + c1 = tanpi(1.25) + d1 = tanpi(-1.25) + if (abs(a1 - 1.0) > e1) stop 65 + if (abs(b1 + 1.0) > e2) stop 66 + if (abs(c1 - 1.0) > e3) stop 67 + if (abs(d1 + 1.0) > e4) stop 68 end program p diff --git a/gcc/testsuite/gfortran.dg/dec_math_6.f90 b/gcc/testsuite/gfortran.dg/dec_math_6.f90 new file mode 100644 index 0000000..dfb8b06 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec_math_6.f90 @@ -0,0 +1,12 @@ +! { dg-options "-std=f2018" } +! { dg-do compile } + +intrinsic :: acospi ! { dg-error "The intrinsic 'acospi' declared INTRINSIC at .1. is not available in the current standard settings but new in Fortran 2023. Use an appropriate '-std=\\*' option or enable '-fall-intrinsics' in order to use it" } +intrinsic :: asinpi ! { dg-error "The intrinsic 'asinpi' declared INTRINSIC at .1. is not available in the current standard settings but new in Fortran 2023. Use an appropriate '-std=\\*' option or enable '-fall-intrinsics' in order to use it" } +intrinsic :: atanpi ! { dg-error "The intrinsic 'atanpi' declared INTRINSIC at .1. is not available in the current standard settings but new in Fortran 2023. Use an appropriate '-std=\\*' option or enable '-fall-intrinsics' in order to use it" } +intrinsic :: atan2pi ! { dg-error "The intrinsic 'atan2pi' declared INTRINSIC at .1. is not available in the current standard settings but new in Fortran 2023. Use an appropriate '-std=\\*' option or enable '-fall-intrinsics' in order to use it" } +intrinsic :: cospi ! { dg-error "The intrinsic 'cospi' declared INTRINSIC at .1. is not available in the current standard settings but new in Fortran 2023. Use an appropriate '-std=\\*' option or enable '-fall-intrinsics' in order to use it" } +intrinsic :: sinpi ! { dg-error "The intrinsic 'sinpi' declared INTRINSIC at .1. is not available in the current standard settings but new in Fortran 2023. Use an appropriate '-std=\\*' option or enable '-fall-intrinsics' in order to use it" } +intrinsic :: tanpi ! { dg-error "The intrinsic 'tanpi' declared INTRINSIC at .1. is not available in the current standard settings but new in Fortran 2023. Use an appropriate '-std=\\*' option or enable '-fall-intrinsics' in order to use it" } + +end diff --git a/gcc/testsuite/gfortran.dg/inquiry_type_ref_7.f90 b/gcc/testsuite/gfortran.dg/inquiry_type_ref_7.f90 new file mode 100644 index 0000000..534225a --- /dev/null +++ b/gcc/testsuite/gfortran.dg/inquiry_type_ref_7.f90 @@ -0,0 +1,62 @@ +! { dg-do compile } +! { dg-additional-options "-fdump-tree-original" } +! +! PR fortran/101735 - substrings and parsing of type parameter inquiries + +program p + implicit none + integer, parameter :: ck = 4 + character(len=5) :: str = "" + character(len=5) :: str2(4) + character(len=5,kind=ck) :: str4 = ck_"" + type t + character(len=5) :: str(4) + end type t + type(t) :: var + integer :: x, y + + integer, parameter :: i1 = kind (str(1:3)) + integer, parameter :: j1 = str (1:3) % kind + integer, parameter :: k1 = (str(1:3) % kind) + integer, parameter :: kk = str (1:3) % kind % kind + + integer, parameter :: i4 = kind (str4(1:3)) + integer, parameter :: j4 = str4 (1:3) % kind + integer, parameter :: ll = str4 (1:3) % len + + integer, parameter :: i2 = len (str(1:3)) + integer, parameter :: j2 = str (1:3) % len + integer, parameter :: k2 = (str(1:3) % len) + integer, parameter :: lk = str (1:3) % len % kind + + integer, parameter :: l4 = str2 (:) (2:3) % len + integer, parameter :: l5 = var % str (:) (2:4) % len + integer, parameter :: k4 = str2 (:) (2:3) % kind + integer, parameter :: k5 = var % str (:) (2:4) % kind + integer, parameter :: k6 = str2 (:) (2:3) % len % kind + integer, parameter :: k7 = var % str (:) (2:4) % len % kind + + if (i1 /= 1) stop 1 + if (j1 /= 1) stop 2 + if (k1 /= 1) stop 3 + + if (i4 /= ck) stop 4 + if (j4 /= ck) stop 5 + if (ll /= 3) stop 6 + + if (kk /= 4) stop 7 + if (lk /= 4) stop 8 + + if (i2 /= 3) stop 9 + if (j2 /= 3) stop 10 + if (k2 /= 3) stop 11 + + if (l4 /= 2) stop 12 + if (l5 /= 3) stop 13 + if (k4 /= 1) stop 14 + if (k5 /= 1) stop 15 + if (k6 /= 4) stop 16 + if (k7 /= 4) stop 17 +end + +! { dg-final { scan-tree-dump-not "_gfortran_stop_numeric" "original" } } diff --git a/gcc/testsuite/gfortran.dg/pr120049_2.f90 b/gcc/testsuite/gfortran.dg/pr120049_2.f90 new file mode 100644 index 0000000..1f91e06 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr120049_2.f90 @@ -0,0 +1,62 @@ +! Compiled with pr120049_b.f90 +! { dg-options -O0 } +! { dg-do compile } +! { dg-compile-aux-modules "pr120049_b.f90" } +! +! Test the fix for PR120049 +program tests_gtk_sup + use gtk_sup + implicit none + + type mytype + integer :: myint + end type mytype + type(mytype) :: ijkl = mytype(42) + logical :: truth + real :: var1 + type(c_ptr), target :: val + type(c_funptr), target :: fptr + character(15) :: stringy + complex :: certainly + truth = .true. + var1 = 86. + stringy = "what the hay!" + certainly = (3.14,-4.13) + if (c_associated(val, c_loc(val))) then + stop 1 + endif + if (c_associated(c_loc(val), val)) then + stop 2 + endif + print *, c_associated(fptr, C_NULL_FUNPTR) + print *, c_associated(c_loc(val), C_NULL_PTR) + print *, c_associated(C_NULL_PTR, c_loc(val)) + print *, c_associated(c_loc(val), 42) ! { dg-error "C_ASSOCIATED shall have the" } + print *, c_associated(c_loc(val), .42) ! { dg-error "C_ASSOCIATED shall have the" } + print *, c_associated(c_loc(val), truth) ! { dg-error "C_ASSOCIATED shall have the" } + print *, c_associated(c_loc(val), .false.) ! { dg-error "C_ASSOCIATED shall have the" } + print *, c_associated(c_loc(val), var1) ! { dg-error "C_ASSOCIATED shall have the" } + print *, c_associated(c_loc(val), stringy) ! { dg-error "C_ASSOCIATED shall have the" } + print *, c_associated(c_loc(val), certainly) ! { dg-error "C_ASSOCIATED shall have the" } + print *, c_associated(42) ! { dg-error "C_ASSOCIATED shall have the" } + print *, c_associated(.42) ! { dg-error "C_ASSOCIATED shall have the" } + print *, c_associated(truth) ! { dg-error "C_ASSOCIATED shall have the" } + print *, c_associated(.false.) ! { dg-error "C_ASSOCIATED shall have the" } + print *, c_associated(var1) ! { dg-error "C_ASSOCIATED shall have the" } + print *, c_associated(stringy) ! { dg-error "C_ASSOCIATED shall have the" } + print *, c_associated(certainly) ! { dg-error "C_ASSOCIATED shall have the" } + print *, c_associated(.42) ! { dg-error "C_ASSOCIATED shall have the" } + print *, c_associated(val, testit(val)) ! { dg-error "C_ASSOCIATED shall have the" } + print *, c_associated(testit(val), val) ! { dg-error "C_ASSOCIATED shall have the" } + print *, c_associated(testit(val)) ! { dg-error "C_ASSOCIATED shall have the" } + print *, c_associated(c_loc(val), C_NULL_FUNPTR) ! { dg-error "C_ASSOCIATED shall have the" } + print *, c_associated(C_NULL_FUNPTR, c_loc(val)) ! { dg-error "C_ASSOCIATED shall have the" } +contains + + function testit (avalue) result(res) + type(c_ptr) :: avalue + type(mytype) :: res + res%myint = 42 + end function + +end program tests_gtk_sup diff --git a/gcc/testsuite/gfortran.dg/pr120049_a.f90 b/gcc/testsuite/gfortran.dg/pr120049_a.f90 index c404a4d..7095314 100644 --- a/gcc/testsuite/gfortran.dg/pr120049_a.f90 +++ b/gcc/testsuite/gfortran.dg/pr120049_a.f90 @@ -1,5 +1,8 @@ -! { dg-do preprocess } -! { dg-additional-options "-cpp" } +! Compiled with pr120049_b.f90 +! { dg-options -O0 } +! { dg-do run } +! { dg-compile-aux-modules "pr120049_b.f90" } +! { dg-additional-sources pr120049_b.f90 } ! ! Test the fix for PR86248 program tests_gtk_sup diff --git a/gcc/testsuite/gfortran.dg/pr120049_b.f90 b/gcc/testsuite/gfortran.dg/pr120049_b.f90 index 127db98..28a2783 100644 --- a/gcc/testsuite/gfortran.dg/pr120049_b.f90 +++ b/gcc/testsuite/gfortran.dg/pr120049_b.f90 @@ -1,5 +1,3 @@ -! { dg-do run } -! { dg-additional-sources pr120049_a.f90 } ! ! Module for pr120049.f90 ! diff --git a/gcc/testsuite/gnat.dg/sso19.adb b/gcc/testsuite/gnat.dg/sso19.adb new file mode 100644 index 0000000..497d9874 --- /dev/null +++ b/gcc/testsuite/gnat.dg/sso19.adb @@ -0,0 +1,13 @@ +-- { dg-do run } +-- { dg-options "-O2" } + +with SSO19_Pkg; use SSO19_Pkg; + +procedure SSO19 is + R : constant Rec := (D => (I => 8, F => 4.6095713E-41)); + +begin + if not Is_Valid (R) then + raise Program_Error; + end if; +end; diff --git a/gcc/testsuite/gnat.dg/sso19_pkg.adb b/gcc/testsuite/gnat.dg/sso19_pkg.adb new file mode 100644 index 0000000..cbcb2f9 --- /dev/null +++ b/gcc/testsuite/gnat.dg/sso19_pkg.adb @@ -0,0 +1,13 @@ +package body SSO19_Pkg is + + function Is_Valid_Private (Item : Data) return Boolean is + begin + return Item.I'Valid and Item.F'Valid; + end Is_Valid_Private; + + function Is_Valid (Item : Rec) return Boolean is + begin + return Is_Valid_Private (Item.D); + end Is_Valid; + +end SSO19_Pkg; diff --git a/gcc/testsuite/gnat.dg/sso19_pkg.ads b/gcc/testsuite/gnat.dg/sso19_pkg.ads new file mode 100644 index 0000000..cad5368 --- /dev/null +++ b/gcc/testsuite/gnat.dg/sso19_pkg.ads @@ -0,0 +1,24 @@ +with System; + +package SSO19_Pkg is + + subtype Small_Int is Short_Integer range -1000 .. 1000; + + type Data is record + I : Small_Int; + F : Float; + end record; + for Data use record + I at 0 range 0 .. 15; + F at 4 range 0 .. 31; + end record; + for Data'Bit_Order use System.High_Order_First; + for Data'Scalar_Storage_Order use System.High_Order_First; + + type Rec is record + D : Data; + end record; + + function Is_Valid (Item : Rec) return Boolean; + +end SSO19_Pkg; diff --git a/gcc/testsuite/lib/htmltest.py b/gcc/testsuite/lib/htmltest.py index b249ea6..8e42a8c 100644 --- a/gcc/testsuite/lib/htmltest.py +++ b/gcc/testsuite/lib/htmltest.py @@ -7,3 +7,93 @@ def html_tree_from_env(): html_filename += '.html' print('html_filename: %r' % html_filename) return ET.parse(html_filename) + +XHTML = 'http://www.w3.org/1999/xhtml' +ns = {'xhtml': XHTML} + +def make_tag(local_name): + return f'{{{XHTML}}}' + local_name + +def assert_tag(element, expected): + assert element.tag == make_tag(expected) + +def assert_class(element, expected): + assert element.attrib['class'] == expected + +def assert_quoted_line(tr, expected_line_num, expected_src): + """Verify that tr is a line of quoted source.""" + tds = tr.findall('xhtml:td', ns) + assert len(tds) == 3 + assert_class(tds[0], 'linenum') + assert tds[0].text == expected_line_num + assert_class(tds[1], 'left-margin') + assert tds[1].text == ' ' + assert_class(tds[2], 'source') + assert tds[2].text == expected_src + +def assert_annotation_line(tr, expected_src, + expected_line_num=' ', + expected_left_margin=' '): + """Verify that tr is an annotation line.""" + tds = tr.findall('xhtml:td', ns) + assert len(tds) == 3 + assert_class(tds[0], 'linenum') + assert tds[0].text == expected_line_num + assert_class(tds[1], 'left-margin') + assert tds[1].text == expected_left_margin + assert_class(tds[2], 'annotation') + assert tds[2].text == expected_src + +def assert_frame(frame, expected_fnname): + """ + Assert that frame is of class 'stack-frame' + and has a child showing the expected fnname. + """ + assert_class(frame, 'stack-frame') + funcname = frame[0] + assert_class(funcname, 'frame-funcname') + span = funcname[0] + assert_tag(span, 'span') + assert span.text == expected_fnname + +def assert_event_range_with_margin(element): + """ + Verify that "element" is an event-range-with-margin + """ + assert_tag(element, 'table') + assert_class(element, 'event-range-with-margin') + tr = element.find('xhtml:tr', ns) + assert tr is not None + td = tr.find('xhtml:td', ns) + assert_class(td, 'event-range') + + events_hdr = td.find('xhtml:div', ns) + assert_class(events_hdr, 'events-hdr') + + #...etc + +def get_diag_by_index(html_tree, index): + root = html_tree.getroot () + assert root.tag == make_tag('html') + + body = root.find('xhtml:body', ns) + assert body is not None + + diag_list = body.find('xhtml:div', ns) + assert diag_list is not None + assert_class(diag_list, 'gcc-diagnostic-list') + + diags = diag_list.findall('xhtml:div', ns) + diag = diags[index] + assert_class(diag, 'gcc-diagnostic') + return diag + +def get_message_within_diag(diag_element): + msg = diag_element.find('xhtml:span', ns) + assert_class(msg, 'gcc-message') + return msg + +def get_locus_within_diag(diag_element): + src = diag_element.find('xhtml:table', ns) + assert_class(src, 'locus') + return src diff --git a/gcc/tree-ssa-dse.cc b/gcc/tree-ssa-dse.cc index d1d58bf..5ac4280 100644 --- a/gcc/tree-ssa-dse.cc +++ b/gcc/tree-ssa-dse.cc @@ -842,7 +842,7 @@ live_bytes_read (ao_ref *use_ref, ao_ref *ref, sbitmap live) return true; /* Now check if any of the remaining bits in use_ref are set in LIVE. */ - return bitmap_bit_in_range_p (live, start, (start + size - 1)); + return bitmap_any_bit_in_range_p (live, start, (start + size - 1)); } return true; } diff --git a/gcc/tree-ssa-math-opts.cc b/gcc/tree-ssa-math-opts.cc index eb03ebe..7e819f3 100644 --- a/gcc/tree-ssa-math-opts.cc +++ b/gcc/tree-ssa-math-opts.cc @@ -4104,15 +4104,34 @@ build_saturation_binary_arith_call_and_insert (gimple_stmt_iterator *gsi, * _10 = -_9; * _12 = _7 | _10; * => - * _12 = .SAT_ADD (_4, _6); */ + * _12 = .SAT_ADD (_4, _6); + * + * Try to match IMM=-1 saturation signed add with assign. + * <bb 2> [local count: 1073741824]: + * x.0_1 = (unsigned char) x_5(D); + * _3 = -x.0_1; + * _10 = (signed char) _3; + * _8 = x_5(D) & _10; + * if (_8 < 0) + * goto <bb 4>; [1.40%] + * else + * goto <bb 3>; [98.60%] + * <bb 3> [local count: 434070867]: + * _2 = x.0_1 + 255; + * <bb 4> [local count: 1073741824]: + * # _9 = PHI <_2(3), 128(2)> + * _4 = (int8_t) _9; + * => + * _4 = .SAT_ADD (x_5, -1); */ static void -match_unsigned_saturation_add (gimple_stmt_iterator *gsi, gassign *stmt) +match_saturation_add_with_assign (gimple_stmt_iterator *gsi, gassign *stmt) { tree ops[2]; tree lhs = gimple_assign_lhs (stmt); - if (gimple_unsigned_integer_sat_add (lhs, ops, NULL)) + if (gimple_unsigned_integer_sat_add (lhs, ops, NULL) + || gimple_signed_integer_sat_add (lhs, ops, NULL)) build_saturation_binary_arith_call_and_replace (gsi, IFN_SAT_ADD, lhs, ops[0], ops[1]); } @@ -6403,7 +6422,7 @@ math_opts_dom_walker::after_dom_children (basic_block bb) break; case PLUS_EXPR: - match_unsigned_saturation_add (&gsi, as_a<gassign *> (stmt)); + match_saturation_add_with_assign (&gsi, as_a<gassign *> (stmt)); match_unsigned_saturation_sub (&gsi, as_a<gassign *> (stmt)); /* fall-through */ case MINUS_EXPR: @@ -6429,7 +6448,7 @@ math_opts_dom_walker::after_dom_children (basic_block bb) break; case BIT_IOR_EXPR: - match_unsigned_saturation_add (&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 */ case BIT_XOR_EXPR: @@ -6450,6 +6469,7 @@ math_opts_dom_walker::after_dom_children (basic_block bb) case NOP_EXPR: match_unsigned_saturation_trunc (&gsi, as_a<gassign *> (stmt)); + match_saturation_add_with_assign (&gsi, as_a<gassign *> (stmt)); break; default:; diff --git a/gcc/tree-ssa-phiprop.cc b/gcc/tree-ssa-phiprop.cc index a2e1fb1..897bd58 100644 --- a/gcc/tree-ssa-phiprop.cc +++ b/gcc/tree-ssa-phiprop.cc @@ -99,35 +99,6 @@ struct phiprop_d tree vuse; }; -/* Verify if the value recorded for NAME in PHIVN is still valid at - the start of basic block BB. */ - -static bool -phivn_valid_p (struct phiprop_d *phivn, tree name, basic_block bb) -{ - tree vuse = phivn[SSA_NAME_VERSION (name)].vuse; - gimple *use_stmt; - imm_use_iterator ui2; - bool ok = true; - - /* The def stmts of the virtual uses need to be dominated by bb. */ - gcc_assert (vuse != NULL_TREE); - - FOR_EACH_IMM_USE_STMT (use_stmt, ui2, vuse) - { - /* If BB does not dominate a VDEF, the value is invalid. */ - if ((gimple_vdef (use_stmt) != NULL_TREE - || gimple_code (use_stmt) == GIMPLE_PHI) - && !dominated_by_p (CDI_DOMINATORS, gimple_bb (use_stmt), bb)) - { - ok = false; - break; - } - } - - return ok; -} - /* Insert a new phi node for the dereference of PHI at basic_block BB with the virtual operands from USE_STMT. */ @@ -275,12 +246,13 @@ chk_uses (tree, tree *idx, void *data) <Lx>:; Returns true if a transformation was done and edge insertions need to be committed. Global data PHIVN and N is used to track - past transformation results. We need to be especially careful here + past transformation results. VPHI is the virtual PHI node in BB + if there is one. We need to be especially careful here with aliasing issues as we are moving memory reads. */ static bool -propagate_with_phi (basic_block bb, gphi *phi, struct phiprop_d *phivn, - size_t n, bitmap dce_ssa_names) +propagate_with_phi (basic_block bb, gphi *vphi, gphi *phi, + struct phiprop_d *phivn, size_t n, bitmap dce_ssa_names) { tree ptr = PHI_RESULT (phi); gimple *use_stmt; @@ -298,6 +270,7 @@ propagate_with_phi (basic_block bb, gphi *phi, struct phiprop_d *phivn, && TYPE_MODE (TREE_TYPE (TREE_TYPE (ptr))) == BLKmode)) return false; + tree up_vuse = NULL_TREE; /* Check if we can "cheaply" dereference all phi arguments. */ FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_USE) { @@ -315,14 +288,28 @@ propagate_with_phi (basic_block bb, gphi *phi, struct phiprop_d *phivn, return false; arg = gimple_assign_rhs1 (def_stmt); } - if (TREE_CODE (arg) != ADDR_EXPR - && !(TREE_CODE (arg) == SSA_NAME + if (TREE_CODE (arg) == ADDR_EXPR) + ; + /* When we have an SSA name see if we previously encountered a + dereference of it. */ + else if (TREE_CODE (arg) == SSA_NAME && SSA_NAME_VERSION (arg) < n && phivn[SSA_NAME_VERSION (arg)].value != NULL_TREE && (!type || types_compatible_p - (type, TREE_TYPE (phivn[SSA_NAME_VERSION (arg)].value))) - && phivn_valid_p (phivn, arg, bb))) + (type, TREE_TYPE (phivn[SSA_NAME_VERSION (arg)].value)))) + { + /* The dereference should be under the VUSE that's active in BB. + If the BB has no virtual PHI then record the common "incoming" + vuse. */ + if (vphi) + up_vuse = gimple_phi_arg_def (vphi, phi_arg_index_from_use (arg_p)); + if (!up_vuse) + up_vuse = phivn[SSA_NAME_VERSION (arg)].vuse; + else if (up_vuse != phivn[SSA_NAME_VERSION (arg)].vuse) + return false; + } + else return false; if (!type && TREE_CODE (arg) == SSA_NAME) @@ -372,17 +359,32 @@ propagate_with_phi (basic_block bb, gphi *phi, struct phiprop_d *phivn, && !gimple_has_volatile_ops (use_stmt))) continue; - /* Check if we can move the loads. The def stmt of the virtual use - needs to be in a different basic block dominating bb. When the + /* Check if we can move the loads. This is when the virtual use + is the same as the one active at the start of BB which we know + either from its virtual PHI def or from the common incoming + VUSE. If neither is present make sure the def stmt of the virtual + use is in a different basic block dominating BB. When the def is an edge-inserted one we know it dominates us. */ vuse = gimple_vuse (use_stmt); - def_stmt = SSA_NAME_DEF_STMT (vuse); - if (!SSA_NAME_IS_DEFAULT_DEF (vuse) - && (gimple_bb (def_stmt) == bb - || (gimple_bb (def_stmt) - && !dominated_by_p (CDI_DOMINATORS, - bb, gimple_bb (def_stmt))))) - goto next; + if (vphi) + { + if (vuse != gimple_phi_result (vphi)) + goto next; + } + else if (up_vuse) + { + if (vuse != up_vuse) + goto next; + } + else + { + def_stmt = SSA_NAME_DEF_STMT (vuse); + if (!SSA_NAME_IS_DEFAULT_DEF (vuse) + && (gimple_bb (def_stmt) == bb + || !dominated_by_p (CDI_DOMINATORS, + bb, gimple_bb (def_stmt)))) + goto next; + } /* Found a proper dereference with an aggregate copy. Just insert aggregate copies on the edges instead. */ @@ -535,8 +537,10 @@ pass_phiprop::execute (function *fun) edges avoid blocks with abnormal predecessors. */ if (bb_has_abnormal_pred (bb)) continue; + gphi *vphi = get_virtual_phi (bb); for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) - did_something |= propagate_with_phi (bb, gsi.phi (), phivn, n, dce_ssa_names); + did_something |= propagate_with_phi (bb, vphi, gsi.phi (), + phivn, n, dce_ssa_names); } if (did_something) diff --git a/gcc/tree-vect-data-refs.cc b/gcc/tree-vect-data-refs.cc index 9fd1ef2..f2deb75 100644 --- a/gcc/tree-vect-data-refs.cc +++ b/gcc/tree-vect-data-refs.cc @@ -3682,6 +3682,13 @@ vect_analyze_data_ref_accesses (vec_info *vinfo, != type_size_a)) break; + /* For datarefs with big gap, it's better to split them into different + groups. + .i.e a[0], a[1], a[2], .. a[7], a[100], a[101],..., a[107] */ + if ((unsigned HOST_WIDE_INT)(init_b - init_prev) * tree_to_uhwi (szb) + > MAX_BITSIZE_MODE_ANY_MODE / BITS_PER_UNIT) + break; + /* If the step (if not zero or non-constant) is smaller than the difference between data-refs' inits this splits groups into suitable sizes. */ diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc index 6695854..3710694 100644 --- a/gcc/tree-vect-stmts.cc +++ b/gcc/tree-vect-stmts.cc @@ -10689,8 +10689,7 @@ vectorizable_load (vec_info *vinfo, first_dr_info = dr_info; } - if (slp && grouped_load - && memory_access_type == VMAT_STRIDED_SLP) + if (grouped_load && memory_access_type == VMAT_STRIDED_SLP) { group_size = DR_GROUP_SIZE (first_stmt_info); ref_type = get_group_alias_ptr_type (first_stmt_info); @@ -10830,22 +10829,20 @@ vectorizable_load (vec_info *vinfo, ltype = build_aligned_type (ltype, align * BITS_PER_UNIT); } - if (slp) + /* For SLP permutation support we need to load the whole group, + not only the number of vector stmts the permutation result + fits in. */ + if (slp_perm) { - /* For SLP permutation support we need to load the whole group, - not only the number of vector stmts the permutation result - fits in. */ - if (slp_perm) - { - /* We don't yet generate SLP_TREE_LOAD_PERMUTATIONs for - variable VF. */ - unsigned int const_vf = vf.to_constant (); - ncopies = CEIL (group_size * const_vf, const_nunits); - dr_chain.create (ncopies); - } - else - ncopies = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node); + /* We don't yet generate SLP_TREE_LOAD_PERMUTATIONs for + variable VF. */ + unsigned int const_vf = vf.to_constant (); + ncopies = CEIL (group_size * const_vf, const_nunits); + dr_chain.create (ncopies); } + else + ncopies = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node); + unsigned int group_el = 0; unsigned HOST_WIDE_INT elsz = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (vectype))); @@ -10883,14 +10880,13 @@ vectorizable_load (vec_info *vinfo, CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, new_temp); group_el += lnel; - if (! slp - || group_el == group_size) + if (group_el == group_size) { n_groups++; /* When doing SLP make sure to not load elements from the next vector iteration, those will not be accessed so just use the last element again. See PR107451. */ - if (!slp || known_lt (n_groups, vf)) + if (known_lt (n_groups, vf)) { tree newoff = copy_ssa_name (running_off); gimple *incr @@ -10938,19 +10934,10 @@ vectorizable_load (vec_info *vinfo, if (!costing_p) { - if (slp) - { - if (slp_perm) - dr_chain.quick_push (gimple_assign_lhs (new_stmt)); - else - slp_node->push_vec_def (new_stmt); - } + if (slp_perm) + dr_chain.quick_push (gimple_assign_lhs (new_stmt)); else - { - if (j == 0) - *vec_stmt = new_stmt; - STMT_VINFO_VEC_STMTS (stmt_info).safe_push (new_stmt); - } + slp_node->push_vec_def (new_stmt); } } if (slp_perm) @@ -5499,7 +5499,7 @@ storage_order_barrier_p (const_tree t) && TYPE_REVERSE_STORAGE_ORDER (TREE_TYPE (op))) return true; - return false; + return reverse_storage_order_for_component_p (op); } /* Given a DECL or TYPE, return the scope in which it was declared, or diff --git a/gcc/xml-printer.h b/gcc/xml-printer.h new file mode 100644 index 0000000..b90390c --- /dev/null +++ b/gcc/xml-printer.h @@ -0,0 +1,84 @@ +/* Classes for creating XML trees by appending. + Copyright (C) 2025 Free Software Foundation, Inc. + Contributed by David Malcolm <dmalcolm@redhat.com>. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#ifndef GCC_XML_PRINTER_H +#define GCC_XML_PRINTER_H + +namespace xml { + +class node; + class element; + +/* A class for creating XML trees by appending to an insertion + point, with a stack of open tags. */ + +class printer +{ +public: + printer (element &insertion_point); + + void push_tag (std::string name, + bool preserve_whitespace = false); + void push_tag_with_class (std::string name, + std::string class_, + bool preserve_whitespace = false); + void pop_tag (); + + void set_attr (const char *name, std::string value); + + void add_text (std::string text); + + void add_raw (std::string text); + + void push_element (std::unique_ptr<element> new_element); + + void append (std::unique_ptr<node> new_node); + + element *get_insertion_point () const; + +private: + // borrowed ptrs: + std::vector<element *> m_open_tags; +}; + +// RAII for push/pop element on xml::printer + +class auto_print_element +{ +public: + auto_print_element (printer &printer, + std::string name, + bool preserve_whitespace = false) + : m_printer (printer) + { + m_printer.push_tag (name, preserve_whitespace); + } + ~auto_print_element () + { + m_printer.pop_tag (); + } + +private: + printer &m_printer; +}; + +} // namespace xml + +#endif /* GCC_XML_PRINTER_H. */ diff --git a/gcc/xml.h b/gcc/xml.h new file mode 100644 index 0000000..523a44d --- /dev/null +++ b/gcc/xml.h @@ -0,0 +1,113 @@ +/* Classes for representing XML trees. + Copyright (C) 2024-2025 Free Software Foundation, Inc. + Contributed by David Malcolm <dmalcolm@redhat.com>. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#ifndef GCC_XML_H +#define GCC_XML_H + +namespace xml { + +// Forward decls; indentation reflects inheritance +struct node; + struct text; + struct node_with_children; + struct document; + struct element; + +struct node +{ + virtual ~node () {} + virtual void write_as_xml (pretty_printer *pp, + int depth, bool indent) const = 0; + virtual text *dyn_cast_text () + { + return 0; + } + void dump (FILE *out) const; + void DEBUG_FUNCTION dump () const { dump (stderr); } +}; + +struct text : public node +{ + text (std::string str) + : m_str (std::move (str)) + {} + + void write_as_xml (pretty_printer *pp, + int depth, bool indent) const final override; + + text *dyn_cast_text () final override + { + return this; + } + + std::string m_str; +}; + +struct node_with_children : public node +{ + void add_child (std::unique_ptr<node> node); + void add_text (std::string str); + + std::vector<std::unique_ptr<node>> m_children; +}; + +struct document : public node_with_children +{ + void write_as_xml (pretty_printer *pp, + int depth, bool indent) const final override; +}; + +struct element : public node_with_children +{ + element (std::string kind, bool preserve_whitespace) + : m_kind (std::move (kind)), + m_preserve_whitespace (preserve_whitespace) + {} + + void write_as_xml (pretty_printer *pp, + int depth, bool indent) const final override; + + void set_attr (const char *name, std::string value); + + std::string m_kind; + bool m_preserve_whitespace; + std::map<std::string, std::string> m_attributes; + std::vector<std::string> m_key_insertion_order; +}; + +/* A fragment of raw XML source, to be spliced in directly. + Use sparingly. */ + +struct raw : public node +{ + raw (std::string xml_src) + : m_xml_src (xml_src) + { + } + + void write_as_xml (pretty_printer *pp, + int depth, bool indent) const final override; + + std::string m_xml_src; +}; + +} // namespace xml + +#endif /* GCC_XML_H. */ diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index d55d191..7e907b6 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,88 @@ +2025-05-27 Jakub Jelinek <jakub@redhat.com> + + * config/t-softfp (softfp_bid_list): Don't guard with + $(enable_decimal_float) == bid. + * soft-fp/bitint.h (__bid_pow10bitint): For + !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_pow10bitint. + (__dpd_d2bbitint, __dpd_b2dbitint): Declare. + * soft-fp/bitintpow10.c (__dpd_d2bbitint, __dpd_b2dbitint): New + variables. + * soft-fp/fixsdbitint.c (__bid_fixsdbitint): For + !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_fixsdbitint. + Add DPD support. Fix big-endian support. + * soft-fp/fixddbitint.c (__bid_fixddbitint): For + !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_fixddbitint. + Add DPD support. Fix big-endian support. + * soft-fp/fixtdbitint.c (__bid_fixtdbitint): For + !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_fixtdbitint. + Add DPD support. Fix big-endian support. + * soft-fp/fixsdti.c (__bid_fixsdbitint): For + !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_fixsdbitint. + (__bid_fixsdti): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to + __dpd_fixsdti. + * soft-fp/fixddti.c (__bid_fixddbitint): For + !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_fixddbitint. + (__bid_fixddti): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to + __dpd_fixddti. + * soft-fp/fixtdti.c (__bid_fixtdbitint): For + !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_fixtdbitint. + (__bid_fixtdti): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to + __dpd_fixtdti. + * soft-fp/fixunssdti.c (__bid_fixsdbitint): For + !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_fixsdbitint. + (__bid_fixunssdti): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine + to __dpd_fixunssdti. + * soft-fp/fixunsddti.c (__bid_fixddbitint): For + !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_fixddbitint. + (__bid_fixunsddti): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine + to __dpd_fixunsddti. + * soft-fp/fixunstdti.c (__bid_fixtdbitint): For + !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_fixtdbitint. + (__bid_fixunstdti): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine + to __dpd_fixunstdti. + * soft-fp/floatbitintsd.c (__bid_floatbitintsd): For + !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_floatbitintsd. + Add DPD support. Avoid calling __builtin_clzll with 0 argument. Fix + big-endian support. + * soft-fp/floatbitintdd.c (__bid_floatbitintdd): For + !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_floatbitintdd. + Add DPD support. Avoid calling __builtin_clzll with 0 argument. Fix + big-endian support. + * soft-fp/floatbitinttd.c (__bid_floatbitinttd): For + !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_floatbitinttd. + Add DPD support. Avoid calling __builtin_clzll with 0 argument. Fix + big-endian support. + * soft-fp/floattisd.c (__bid_floatbitintsd): For + !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_floatbitintsd. + (__bid_floattisd): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to + __dpd_floattisd. + * soft-fp/floattidd.c (__bid_floatbitintdd): For + !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_floatbitintdd. + (__bid_floattidd): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to + __dpd_floattidd. + * soft-fp/floattitd.c (__bid_floatbitinttd): For + !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_floatbitinttd. + (__bid_floattitd): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to + __dpd_floattitd. + * soft-fp/floatuntisd.c (__bid_floatbitintsd): For + !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_floatbitintsd. + (__bid_floatuntisd): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine + to __dpd_floatuntisd. + * soft-fp/floatuntidd.c (__bid_floatbitintdd): For + !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_floatbitintdd. + (__bid_floatuntidd): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine + to __dpd_floatuntidd. + * soft-fp/floatuntitd.c (__bid_floatbitinttd): For + !defined(ENABLE_DECIMAL_BID_FORMAT) redefine to __dpd_floatbitinttd. + (__bid_floatuntitd): For !defined(ENABLE_DECIMAL_BID_FORMAT) redefine + to __dpd_floatuntitd. + +2025-05-25 LIU Hao <lh_mouse@126.com> + + * config.host: Enable mcf thread model for aarch64-*-mingw*. + * config/i386/t-mingw-mcfgthread: Move to... + * config/mingw/t-mingw-mcfgthread: ...here. + 2025-05-21 Alexandre Oliva <oliva@adacore.com> * config/gthr-vxworks-thread.c: Include string.h for memset. diff --git a/libgcc/config.host b/libgcc/config.host index 6a88ee5..d36f0e3 100644 --- a/libgcc/config.host +++ b/libgcc/config.host @@ -472,6 +472,9 @@ aarch64-*-mingw*) posix) tmake_thr_file="mingw/t-mingw-pthread" ;; + mcf) + tmake_thr_file="mingw/t-mingw-mcfgthread" + ;; esac tmake_file="${tmake_file} ${cpu_type}/t-no-eh ${tmake_thr_file}" tmake_file="${tmake_file} t-dfprules" @@ -904,7 +907,7 @@ i[34567]86-*-mingw*) tmake_thr_file="mingw/t-mingw-pthread" ;; mcf) - tmake_thr_file="i386/t-mingw-mcfgthread" + tmake_thr_file="mingw/t-mingw-mcfgthread" ;; esac # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h @@ -931,7 +934,7 @@ x86_64-*-mingw*) tmake_thr_file="mingw/t-mingw-pthread" ;; mcf) - tmake_thr_file="i386/t-mingw-mcfgthread" + tmake_thr_file="mingw/t-mingw-mcfgthread" ;; esac # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h diff --git a/libgcc/config/avr/libf7/ChangeLog b/libgcc/config/avr/libf7/ChangeLog index 1b8a29a..b19b5b4 100644 --- a/libgcc/config/avr/libf7/ChangeLog +++ b/libgcc/config/avr/libf7/ChangeLog @@ -1,3 +1,18 @@ +2025-05-27 Georg-Johann Lay <avr@gjlay.de> + + PR target/120442 + * libf7-common.mk (LIBF_C_PARTS, m_ddd): Add fdim. + * libf7.h (f7_fdim): New proto. + * libf7.c (f7_fdim): New function. + * f7renames.sh (f7_fdim): Add rename. + * f7-wraps.h: Rebuild + * f7-renames.h: Rebuild + +2025-05-27 Georg-Johann Lay <avr@gjlay.de> + + PR target/120441 + * libf7.c (f7_exp): Limit aa->expo to 10 (not to 9). + 2025-03-22 Georg-Johann Lay <avr@gjlay.de> * t-libf7 (libgcc-objects): Only add objects when building diff --git a/libgcc/config/avr/libf7/f7-renames.h b/libgcc/config/avr/libf7/f7-renames.h index bbe571a..bce2dd3 100644 --- a/libgcc/config/avr/libf7/f7-renames.h +++ b/libgcc/config/avr/libf7/f7-renames.h @@ -97,6 +97,7 @@ #define f7_acos __f7_acos #define f7_atan __f7_atan #define f7_atan2 __f7_atan2 +#define f7_fdim __f7_fdim #define f7_mul_noround __f7_mul_noround #define f7_sqrt16_round __f7_sqrt16_round #define f7_sqrt16_floor __f7_sqrt16_floor diff --git a/libgcc/config/avr/libf7/f7-wraps.h b/libgcc/config/avr/libf7/f7-wraps.h index a455b7d..409492e 100644 --- a/libgcc/config/avr/libf7/f7-wraps.h +++ b/libgcc/config/avr/libf7/f7-wraps.h @@ -239,7 +239,7 @@ _ENDF __extendsfdf2 ;; Functions that usually live in libm: Depending on [long] double layout, ;; define <name> and <name>l as weak alias(es) of __<name> for <name> in: -;; pow fmin fmax fmod hypot atan2 +;; pow fmin fmax fmod hypot atan2 fdim ;; double __pow (double, double) #ifdef F7MOD_D_pow_ @@ -313,6 +313,18 @@ _DEFUN __atan2 _ENDF __atan2 #endif /* F7MOD_D_atan2_ */ +;; double __fdim (double, double) +#ifdef F7MOD_D_fdim_ +_DEFUN __fdim + DALIAS fdim + LALIAS fdiml + .global F7_NAME(fdim) + ldi ZH, hi8(gs(F7_NAME(fdim))) + ldi ZL, lo8(gs(F7_NAME(fdim))) + F7jmp call_ddd +_ENDF __fdim +#endif /* F7MOD_D_fdim_ */ + ;; Functions that usually live in libm: Depending on [long] double layout, ;; define <name> and <name>l as weak alias(es) of __<name> for <name> in: ;; ldexp frexp diff --git a/libgcc/config/avr/libf7/f7renames.sh b/libgcc/config/avr/libf7/f7renames.sh index 7ef251e..4ced423 100755 --- a/libgcc/config/avr/libf7/f7renames.sh +++ b/libgcc/config/avr/libf7/f7renames.sh @@ -35,9 +35,9 @@ EOF c) if [ x${PRE} != xf7_ ]; then - echo " " + echo "" echo "/* Renames for libf7.c, libf7.h. */" - echo " " + echo "" for x in $*; do echo "#define f7_$x ${PRE}$x" done @@ -46,9 +46,9 @@ EOF cst) if [ x${PRE} != xf7_ ]; then - echo " " + echo "" echo "/* Renames for libf7.c, libf7.h. */" - echo " " + echo "" for x in $*; do echo "#define f7_const_${x} ${PRE}const_${x}" echo "#define f7_const_${x}_P ${PRE}const_${x}_P" @@ -58,9 +58,9 @@ EOF asm) if [ x${PRE} != xf7_ ]; then - echo " " + echo "" echo "/* Renames for libf7-asm.sx, f7-wraps.h. */" - echo " " + echo "" for x in $*; do echo "#define f7_${x}_asm ${PRE}${x}_asm" done diff --git a/libgcc/config/avr/libf7/libf7-common.mk b/libgcc/config/avr/libf7/libf7-common.mk index 5d41107..644be2c 100644 --- a/libgcc/config/avr/libf7/libf7-common.mk +++ b/libgcc/config/avr/libf7/libf7-common.mk @@ -8,7 +8,7 @@ F7_C_PARTS += set_float get_float get_double set_double set_pdouble F7_C_PARTS += fabs neg fmin fmax minmax truncx trunc floor ceil round lround F7_C_PARTS += horner logx log log10 log2 exp pow10 pow powi F7_C_PARTS += sin cos tan cotan sincos sinh cosh tanh sinhcosh -F7_C_PARTS += asinacos asin acos atan atan2 +F7_C_PARTS += asinacos asin acos atan atan2 fdim F7_C_PARTS += abscmp_msb_ge cmp cmp_abs cmp_unordered F7_C_PARTS += const_1 const_1_2 const_1_3 @@ -34,7 +34,7 @@ g_xdd_cmp += le lt ge gt ne eq unord g_dx += floatunsidf floatsidf extendsfdf2 g_xd += fixdfsi fixdfdi fixunsdfdi fixunsdfsi truncdfsf2 -m_ddd += pow fmin fmax fmod hypot atan2 +m_ddd += pow fmin fmax fmod hypot atan2 fdim m_ddx += ldexp frexp m_dd += sqrt cbrt exp exp10 pow10 log log10 log2 sin cos tan cotan asin acos atan m_dd += ceil floor trunc round sinh cosh tanh @@ -59,7 +59,7 @@ F7F += lrint ldexp frexp exp logx log log10 log2 F7F += minmax fmax fmin floor ceil round lround trunc truncx F7F += horner pow10 exp10 pow powi F7F += sin cos tan cotan sincos sinh cosh tanh sinhcosh -F7F += asinacos asin acos atan atan2 +F7F += asinacos asin acos atan atan2 fdim F7F += mul_noround sqrt16_round sqrt16_floor F7F += clr_mant_lsbs abscmp_msb_ge lshrdi3 ashldi3 F7F += assert diff --git a/libgcc/config/avr/libf7/libf7.c b/libgcc/config/avr/libf7/libf7.c index a64554c..78c218a 100644 --- a/libgcc/config/avr/libf7/libf7.c +++ b/libgcc/config/avr/libf7/libf7.c @@ -928,6 +928,21 @@ void f7_sub (f7_t *cc, const f7_t *aa, const f7_t *bb) #endif // F7MOD_sub_ +#ifdef F7MOD_fdim_ +F7_WEAK +void f7_fdim (f7_t *cc, const f7_t *aa, const f7_t *bb) +{ + int8_t cmp = f7_cmp_unordered (aa, bb, true /*with_sign*/); + if (cmp == INT8_MIN) + return f7_set_nan (cc); + if (cmp < 0) + return f7_clr (cc); + + f7_sub (cc, aa, bb); +} +#endif // F7MOD_fdim_ + + #ifdef F7MOD_addsub_ static void return_with_sign (f7_t *cc, const f7_t *aa, int8_t c_sign) { @@ -1649,10 +1664,10 @@ void f7_exp (f7_t *cc, const f7_t *aa) return f7_set_nan (cc); /* The maximal exponent of 2 for a double is 1023, hence we may limit - to |A| < 1023 * ln2 ~ 709. We limit to 1024 ~ 1.99 * 2^9 */ + to |A| < 1023 * ln2 ~ 709. We limit to 1024 = 2^10 */ if (f7_class_inf (a_class) - || (f7_class_nonzero (a_class) && aa->expo >= 9)) + || (f7_class_nonzero (a_class) && aa->expo >= 10)) { if (f7_class_sign (a_class)) return f7_clr (cc); diff --git a/libgcc/config/avr/libf7/libf7.h b/libgcc/config/avr/libf7/libf7.h index 8aa91c7..786e141 100644 --- a/libgcc/config/avr/libf7/libf7.h +++ b/libgcc/config/avr/libf7/libf7.h @@ -612,6 +612,7 @@ extern void f7_cos (f7_t*, const f7_t*); extern void f7_tan (f7_t*, const f7_t*); extern void f7_atan (f7_t*, const f7_t*); extern void f7_atan2 (f7_t*, const f7_t*, const f7_t*); +extern void f7_fdim (f7_t*, const f7_t*, const f7_t*); extern void f7_asin (f7_t*, const f7_t*); extern void f7_acos (f7_t*, const f7_t*); extern void f7_tanh (f7_t*, const f7_t*); diff --git a/libgcc/config/i386/t-mingw-mcfgthread b/libgcc/config/mingw/t-mingw-mcfgthread index c5b817f..c5b817f 100644 --- a/libgcc/config/i386/t-mingw-mcfgthread +++ b/libgcc/config/mingw/t-mingw-mcfgthread diff --git a/libgcc/config/t-softfp b/libgcc/config/t-softfp index 94297ad..b352dfa 100644 --- a/libgcc/config/t-softfp +++ b/libgcc/config/t-softfp @@ -67,13 +67,11 @@ softfp_floatint_funcs = fix$(m)$(i) fixuns$(m)$(i) \ softfp_floatbitint_funcs = fix$(m)bitint floatbitint$(m) softfp_bid_list := ifeq ($(decimal_float),yes) -ifeq ($(enable_decimal_float),bid) softfp_bid_list += bitintpow10 \ $(foreach m,sd dd td,fix$(m)bitint floatbitint$(m) \ fix$(m)ti fixuns$(m)ti \ floatti$(m) floatunti$(m)) endif -endif softfp_func_list := \ $(foreach m,$(softfp_float_modes), \ diff --git a/libgcc/soft-fp/bitint.h b/libgcc/soft-fp/bitint.h index 8d489e6..457fc8f 100644 --- a/libgcc/soft-fp/bitint.h +++ b/libgcc/soft-fp/bitint.h @@ -1,7 +1,7 @@ /* Software floating-point emulation. Definitions for _BitInt implementation details. - Copyright (C) 2023 Free Software Foundation, Inc. + Copyright (C) 2023-2025 Free Software Foundation, Inc. This file is part of GCC. @@ -352,6 +352,10 @@ extern void __divmodbitint4 (UBILtype *, SItype, UBILtype *, SItype, const UBILtype *, SItype, const UBILtype *, SItype); +#ifndef ENABLE_DECIMAL_BID_FORMAT +#define __bid_pow10bitint __dpd_pow10bitint +extern const unsigned short __dpd_d2bbitint[1024], __dpd_b2dbitint[1000]; +#endif extern USItype __bid_pow10bitint (UBILtype *, SItype, USItype); #endif /* __BITINT_MAXWIDTH__ */ diff --git a/libgcc/soft-fp/bitintpow10.c b/libgcc/soft-fp/bitintpow10.c index 06a470f0..15b288c 100644 --- a/libgcc/soft-fp/bitintpow10.c +++ b/libgcc/soft-fp/bitintpow10.c @@ -1,7 +1,7 @@ /* Software floating-point emulation. Compute powers of 10 into _BitInt. - Copyright (C) 2023 Free Software Foundation, Inc. + Copyright (C) 2023-2025 Free Software Foundation, Inc. This file is part of GCC. @@ -130,3 +130,341 @@ __bid_pow10bitint (UBILtype *r, SItype rprec, USItype n) } } #endif + +#ifndef ENABLE_DECIMAL_BID_FORMAT +/* DPD encoded 10-bit number to decimal table. */ +const unsigned short __dpd_d2bbitint[1024] = { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 80, 81, 800, 801, 880, 881, + 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 90, 91, 810, 811, 890, 891, + 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 82, 83, 820, 821, 808, 809, + 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 92, 93, 830, 831, 818, 819, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 84, 85, 840, 841, 88, 89, + 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 94, 95, 850, 851, 98, 99, + 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 86, 87, 860, 861, 888, 889, + 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 96, 97, 870, 871, 898, 899, + 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 180, 181, 900, 901, 980, 981, + 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 190, 191, 910, 911, 990, 991, + 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 182, 183, 920, 921, 908, 909, + 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 192, 193, 930, 931, 918, 919, + 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 184, 185, 940, 941, 188, 189, + 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 194, 195, 950, 951, 198, 199, + 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 186, 187, 960, 961, 988, 989, + 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 196, 197, 970, 971, 998, 999, + 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 280, 281, 802, 803, 882, 883, + 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 290, 291, 812, 813, 892, 893, + 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 282, 283, 822, 823, 828, 829, + 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 292, 293, 832, 833, 838, 839, + 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 284, 285, 842, 843, 288, 289, + 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 294, 295, 852, 853, 298, 299, + 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 286, 287, 862, 863, 888, 889, + 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 296, 297, 872, 873, 898, 899, + 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 380, 381, 902, 903, 982, 983, + 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 390, 391, 912, 913, 992, 993, + 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 382, 383, 922, 923, 928, 929, + 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 392, 393, 932, 933, 938, 939, + 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 384, 385, 942, 943, 388, 389, + 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 394, 395, 952, 953, 398, 399, + 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 386, 387, 962, 963, 988, 989, + 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 396, 397, 972, 973, 998, 999, + 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 480, 481, 804, 805, 884, 885, + 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 490, 491, 814, 815, 894, 895, + 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 482, 483, 824, 825, 848, 849, + 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 492, 493, 834, 835, 858, 859, + 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 484, 485, 844, 845, 488, 489, + 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 494, 495, 854, 855, 498, 499, + 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 486, 487, 864, 865, 888, 889, + 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 496, 497, 874, 875, 898, 899, + 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 580, 581, 904, 905, 984, 985, + 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 590, 591, 914, 915, 994, 995, + 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 582, 583, 924, 925, 948, 949, + 530, 531, 532, 533, 534, 535, 536, 537, + 538, 539, 592, 593, 934, 935, 958, 959, + 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 584, 585, 944, 945, 588, 589, + 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 594, 595, 954, 955, 598, 599, + 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 586, 587, 964, 965, 988, 989, + 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 596, 597, 974, 975, 998, 999, + 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 680, 681, 806, 807, 886, 887, + 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 690, 691, 816, 817, 896, 897, + 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 682, 683, 826, 827, 868, 869, + 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 692, 693, 836, 837, 878, 879, + 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 684, 685, 846, 847, 688, 689, + 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 694, 695, 856, 857, 698, 699, + 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 686, 687, 866, 867, 888, 889, + 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 696, 697, 876, 877, 898, 899, + 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 780, 781, 906, 907, 986, 987, + 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 790, 791, 916, 917, 996, 997, + 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 782, 783, 926, 927, 968, 969, + 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 792, 793, 936, 937, 978, 979, + 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 784, 785, 946, 947, 788, 789, + 750, 751, 752, 753, 754, 755, 756, 757, + 758, 759, 794, 795, 956, 957, 798, 799, + 760, 761, 762, 763, 764, 765, 766, 767, + 768, 769, 786, 787, 966, 967, 988, 989, + 770, 771, 772, 773, 774, 775, 776, 777, + 778, 779, 796, 797, 976, 977, 998, 999 +}; + +/* Decimal to DPD encoded 10-bit number table. */ +const unsigned short __dpd_b2dbitint[1000] = { + 0x000, 0x001, 0x002, 0x003, 0x004, + 0x005, 0x006, 0x007, 0x008, 0x009, + 0x010, 0x011, 0x012, 0x013, 0x014, + 0x015, 0x016, 0x017, 0x018, 0x019, + 0x020, 0x021, 0x022, 0x023, 0x024, + 0x025, 0x026, 0x027, 0x028, 0x029, + 0x030, 0x031, 0x032, 0x033, 0x034, + 0x035, 0x036, 0x037, 0x038, 0x039, + 0x040, 0x041, 0x042, 0x043, 0x044, + 0x045, 0x046, 0x047, 0x048, 0x049, + 0x050, 0x051, 0x052, 0x053, 0x054, + 0x055, 0x056, 0x057, 0x058, 0x059, + 0x060, 0x061, 0x062, 0x063, 0x064, + 0x065, 0x066, 0x067, 0x068, 0x069, + 0x070, 0x071, 0x072, 0x073, 0x074, + 0x075, 0x076, 0x077, 0x078, 0x079, + 0x00a, 0x00b, 0x02a, 0x02b, 0x04a, + 0x04b, 0x06a, 0x06b, 0x04e, 0x04f, + 0x01a, 0x01b, 0x03a, 0x03b, 0x05a, + 0x05b, 0x07a, 0x07b, 0x05e, 0x05f, + 0x080, 0x081, 0x082, 0x083, 0x084, + 0x085, 0x086, 0x087, 0x088, 0x089, + 0x090, 0x091, 0x092, 0x093, 0x094, + 0x095, 0x096, 0x097, 0x098, 0x099, + 0x0a0, 0x0a1, 0x0a2, 0x0a3, 0x0a4, + 0x0a5, 0x0a6, 0x0a7, 0x0a8, 0x0a9, + 0x0b0, 0x0b1, 0x0b2, 0x0b3, 0x0b4, + 0x0b5, 0x0b6, 0x0b7, 0x0b8, 0x0b9, + 0x0c0, 0x0c1, 0x0c2, 0x0c3, 0x0c4, + 0x0c5, 0x0c6, 0x0c7, 0x0c8, 0x0c9, + 0x0d0, 0x0d1, 0x0d2, 0x0d3, 0x0d4, + 0x0d5, 0x0d6, 0x0d7, 0x0d8, 0x0d9, + 0x0e0, 0x0e1, 0x0e2, 0x0e3, 0x0e4, + 0x0e5, 0x0e6, 0x0e7, 0x0e8, 0x0e9, + 0x0f0, 0x0f1, 0x0f2, 0x0f3, 0x0f4, + 0x0f5, 0x0f6, 0x0f7, 0x0f8, 0x0f9, + 0x08a, 0x08b, 0x0aa, 0x0ab, 0x0ca, + 0x0cb, 0x0ea, 0x0eb, 0x0ce, 0x0cf, + 0x09a, 0x09b, 0x0ba, 0x0bb, 0x0da, + 0x0db, 0x0fa, 0x0fb, 0x0de, 0x0df, + 0x100, 0x101, 0x102, 0x103, 0x104, + 0x105, 0x106, 0x107, 0x108, 0x109, + 0x110, 0x111, 0x112, 0x113, 0x114, + 0x115, 0x116, 0x117, 0x118, 0x119, + 0x120, 0x121, 0x122, 0x123, 0x124, + 0x125, 0x126, 0x127, 0x128, 0x129, + 0x130, 0x131, 0x132, 0x133, 0x134, + 0x135, 0x136, 0x137, 0x138, 0x139, + 0x140, 0x141, 0x142, 0x143, 0x144, + 0x145, 0x146, 0x147, 0x148, 0x149, + 0x150, 0x151, 0x152, 0x153, 0x154, + 0x155, 0x156, 0x157, 0x158, 0x159, + 0x160, 0x161, 0x162, 0x163, 0x164, + 0x165, 0x166, 0x167, 0x168, 0x169, + 0x170, 0x171, 0x172, 0x173, 0x174, + 0x175, 0x176, 0x177, 0x178, 0x179, + 0x10a, 0x10b, 0x12a, 0x12b, 0x14a, + 0x14b, 0x16a, 0x16b, 0x14e, 0x14f, + 0x11a, 0x11b, 0x13a, 0x13b, 0x15a, + 0x15b, 0x17a, 0x17b, 0x15e, 0x15f, + 0x180, 0x181, 0x182, 0x183, 0x184, + 0x185, 0x186, 0x187, 0x188, 0x189, + 0x190, 0x191, 0x192, 0x193, 0x194, + 0x195, 0x196, 0x197, 0x198, 0x199, + 0x1a0, 0x1a1, 0x1a2, 0x1a3, 0x1a4, + 0x1a5, 0x1a6, 0x1a7, 0x1a8, 0x1a9, + 0x1b0, 0x1b1, 0x1b2, 0x1b3, 0x1b4, + 0x1b5, 0x1b6, 0x1b7, 0x1b8, 0x1b9, + 0x1c0, 0x1c1, 0x1c2, 0x1c3, 0x1c4, + 0x1c5, 0x1c6, 0x1c7, 0x1c8, 0x1c9, + 0x1d0, 0x1d1, 0x1d2, 0x1d3, 0x1d4, + 0x1d5, 0x1d6, 0x1d7, 0x1d8, 0x1d9, + 0x1e0, 0x1e1, 0x1e2, 0x1e3, 0x1e4, + 0x1e5, 0x1e6, 0x1e7, 0x1e8, 0x1e9, + 0x1f0, 0x1f1, 0x1f2, 0x1f3, 0x1f4, + 0x1f5, 0x1f6, 0x1f7, 0x1f8, 0x1f9, + 0x18a, 0x18b, 0x1aa, 0x1ab, 0x1ca, + 0x1cb, 0x1ea, 0x1eb, 0x1ce, 0x1cf, + 0x19a, 0x19b, 0x1ba, 0x1bb, 0x1da, + 0x1db, 0x1fa, 0x1fb, 0x1de, 0x1df, + 0x200, 0x201, 0x202, 0x203, 0x204, + 0x205, 0x206, 0x207, 0x208, 0x209, + 0x210, 0x211, 0x212, 0x213, 0x214, + 0x215, 0x216, 0x217, 0x218, 0x219, + 0x220, 0x221, 0x222, 0x223, 0x224, + 0x225, 0x226, 0x227, 0x228, 0x229, + 0x230, 0x231, 0x232, 0x233, 0x234, + 0x235, 0x236, 0x237, 0x238, 0x239, + 0x240, 0x241, 0x242, 0x243, 0x244, + 0x245, 0x246, 0x247, 0x248, 0x249, + 0x250, 0x251, 0x252, 0x253, 0x254, + 0x255, 0x256, 0x257, 0x258, 0x259, + 0x260, 0x261, 0x262, 0x263, 0x264, + 0x265, 0x266, 0x267, 0x268, 0x269, + 0x270, 0x271, 0x272, 0x273, 0x274, + 0x275, 0x276, 0x277, 0x278, 0x279, + 0x20a, 0x20b, 0x22a, 0x22b, 0x24a, + 0x24b, 0x26a, 0x26b, 0x24e, 0x24f, + 0x21a, 0x21b, 0x23a, 0x23b, 0x25a, + 0x25b, 0x27a, 0x27b, 0x25e, 0x25f, + 0x280, 0x281, 0x282, 0x283, 0x284, + 0x285, 0x286, 0x287, 0x288, 0x289, + 0x290, 0x291, 0x292, 0x293, 0x294, + 0x295, 0x296, 0x297, 0x298, 0x299, + 0x2a0, 0x2a1, 0x2a2, 0x2a3, 0x2a4, + 0x2a5, 0x2a6, 0x2a7, 0x2a8, 0x2a9, + 0x2b0, 0x2b1, 0x2b2, 0x2b3, 0x2b4, + 0x2b5, 0x2b6, 0x2b7, 0x2b8, 0x2b9, + 0x2c0, 0x2c1, 0x2c2, 0x2c3, 0x2c4, + 0x2c5, 0x2c6, 0x2c7, 0x2c8, 0x2c9, + 0x2d0, 0x2d1, 0x2d2, 0x2d3, 0x2d4, + 0x2d5, 0x2d6, 0x2d7, 0x2d8, 0x2d9, + 0x2e0, 0x2e1, 0x2e2, 0x2e3, 0x2e4, + 0x2e5, 0x2e6, 0x2e7, 0x2e8, 0x2e9, + 0x2f0, 0x2f1, 0x2f2, 0x2f3, 0x2f4, + 0x2f5, 0x2f6, 0x2f7, 0x2f8, 0x2f9, + 0x28a, 0x28b, 0x2aa, 0x2ab, 0x2ca, + 0x2cb, 0x2ea, 0x2eb, 0x2ce, 0x2cf, + 0x29a, 0x29b, 0x2ba, 0x2bb, 0x2da, + 0x2db, 0x2fa, 0x2fb, 0x2de, 0x2df, + 0x300, 0x301, 0x302, 0x303, 0x304, + 0x305, 0x306, 0x307, 0x308, 0x309, + 0x310, 0x311, 0x312, 0x313, 0x314, + 0x315, 0x316, 0x317, 0x318, 0x319, + 0x320, 0x321, 0x322, 0x323, 0x324, + 0x325, 0x326, 0x327, 0x328, 0x329, + 0x330, 0x331, 0x332, 0x333, 0x334, + 0x335, 0x336, 0x337, 0x338, 0x339, + 0x340, 0x341, 0x342, 0x343, 0x344, + 0x345, 0x346, 0x347, 0x348, 0x349, + 0x350, 0x351, 0x352, 0x353, 0x354, + 0x355, 0x356, 0x357, 0x358, 0x359, + 0x360, 0x361, 0x362, 0x363, 0x364, + 0x365, 0x366, 0x367, 0x368, 0x369, + 0x370, 0x371, 0x372, 0x373, 0x374, + 0x375, 0x376, 0x377, 0x378, 0x379, + 0x30a, 0x30b, 0x32a, 0x32b, 0x34a, + 0x34b, 0x36a, 0x36b, 0x34e, 0x34f, + 0x31a, 0x31b, 0x33a, 0x33b, 0x35a, + 0x35b, 0x37a, 0x37b, 0x35e, 0x35f, + 0x380, 0x381, 0x382, 0x383, 0x384, + 0x385, 0x386, 0x387, 0x388, 0x389, + 0x390, 0x391, 0x392, 0x393, 0x394, + 0x395, 0x396, 0x397, 0x398, 0x399, + 0x3a0, 0x3a1, 0x3a2, 0x3a3, 0x3a4, + 0x3a5, 0x3a6, 0x3a7, 0x3a8, 0x3a9, + 0x3b0, 0x3b1, 0x3b2, 0x3b3, 0x3b4, + 0x3b5, 0x3b6, 0x3b7, 0x3b8, 0x3b9, + 0x3c0, 0x3c1, 0x3c2, 0x3c3, 0x3c4, + 0x3c5, 0x3c6, 0x3c7, 0x3c8, 0x3c9, + 0x3d0, 0x3d1, 0x3d2, 0x3d3, 0x3d4, + 0x3d5, 0x3d6, 0x3d7, 0x3d8, 0x3d9, + 0x3e0, 0x3e1, 0x3e2, 0x3e3, 0x3e4, + 0x3e5, 0x3e6, 0x3e7, 0x3e8, 0x3e9, + 0x3f0, 0x3f1, 0x3f2, 0x3f3, 0x3f4, + 0x3f5, 0x3f6, 0x3f7, 0x3f8, 0x3f9, + 0x38a, 0x38b, 0x3aa, 0x3ab, 0x3ca, + 0x3cb, 0x3ea, 0x3eb, 0x3ce, 0x3cf, + 0x39a, 0x39b, 0x3ba, 0x3bb, 0x3da, + 0x3db, 0x3fa, 0x3fb, 0x3de, 0x3df, + 0x00c, 0x00d, 0x10c, 0x10d, 0x20c, + 0x20d, 0x30c, 0x30d, 0x02e, 0x02f, + 0x01c, 0x01d, 0x11c, 0x11d, 0x21c, + 0x21d, 0x31c, 0x31d, 0x03e, 0x03f, + 0x02c, 0x02d, 0x12c, 0x12d, 0x22c, + 0x22d, 0x32c, 0x32d, 0x12e, 0x12f, + 0x03c, 0x03d, 0x13c, 0x13d, 0x23c, + 0x23d, 0x33c, 0x33d, 0x13e, 0x13f, + 0x04c, 0x04d, 0x14c, 0x14d, 0x24c, + 0x24d, 0x34c, 0x34d, 0x22e, 0x22f, + 0x05c, 0x05d, 0x15c, 0x15d, 0x25c, + 0x25d, 0x35c, 0x35d, 0x23e, 0x23f, + 0x06c, 0x06d, 0x16c, 0x16d, 0x26c, + 0x26d, 0x36c, 0x36d, 0x32e, 0x32f, + 0x07c, 0x07d, 0x17c, 0x17d, 0x27c, + 0x27d, 0x37c, 0x37d, 0x33e, 0x33f, + 0x00e, 0x00f, 0x10e, 0x10f, 0x20e, + 0x20f, 0x30e, 0x30f, 0x06e, 0x06f, + 0x01e, 0x01f, 0x11e, 0x11f, 0x21e, + 0x21f, 0x31e, 0x31f, 0x07e, 0x07f, + 0x08c, 0x08d, 0x18c, 0x18d, 0x28c, + 0x28d, 0x38c, 0x38d, 0x0ae, 0x0af, + 0x09c, 0x09d, 0x19c, 0x19d, 0x29c, + 0x29d, 0x39c, 0x39d, 0x0be, 0x0bf, + 0x0ac, 0x0ad, 0x1ac, 0x1ad, 0x2ac, + 0x2ad, 0x3ac, 0x3ad, 0x1ae, 0x1af, + 0x0bc, 0x0bd, 0x1bc, 0x1bd, 0x2bc, + 0x2bd, 0x3bc, 0x3bd, 0x1be, 0x1bf, + 0x0cc, 0x0cd, 0x1cc, 0x1cd, 0x2cc, + 0x2cd, 0x3cc, 0x3cd, 0x2ae, 0x2af, + 0x0dc, 0x0dd, 0x1dc, 0x1dd, 0x2dc, + 0x2dd, 0x3dc, 0x3dd, 0x2be, 0x2bf, + 0x0ec, 0x0ed, 0x1ec, 0x1ed, 0x2ec, + 0x2ed, 0x3ec, 0x3ed, 0x3ae, 0x3af, + 0x0fc, 0x0fd, 0x1fc, 0x1fd, 0x2fc, + 0x2fd, 0x3fc, 0x3fd, 0x3be, 0x3bf, + 0x08e, 0x08f, 0x18e, 0x18f, 0x28e, + 0x28f, 0x38e, 0x38f, 0x0ee, 0x0ef, + 0x09e, 0x09f, 0x19e, 0x19f, 0x29e, + 0x29f, 0x39e, 0x39f, 0x0fe, 0x0ff +}; +#endif diff --git a/libgcc/soft-fp/fixddbitint.c b/libgcc/soft-fp/fixddbitint.c index 7b0162e..067a9a6 100644 --- a/libgcc/soft-fp/fixddbitint.c +++ b/libgcc/soft-fp/fixddbitint.c @@ -1,7 +1,7 @@ /* Software floating-point emulation. Convert _Decimal64 to signed or unsigned _BitInt. - Copyright (C) 2023 Free Software Foundation, Inc. + Copyright (C) 2023-2025 Free Software Foundation, Inc. This file is part of GCC. @@ -28,6 +28,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "bitint.h" #ifdef __BITINT_MAXWIDTH__ +#ifndef ENABLE_DECIMAL_BID_FORMAT +#define __bid_fixddbitint __dpd_fixddbitint +#endif extern void __bid_fixddbitint (UBILtype *, SItype, _Decimal64); void @@ -48,6 +51,7 @@ __bid_fixddbitint (UBILtype *r, SItype rprec, _Decimal64 a) u.d = a; t = u.u >> 51; sgn = (DItype) u.u < 0; +#ifdef ENABLE_DECIMAL_BID_FORMAT if ((t & (3 << 10)) != (3 << 10)) { mantissa = u.u & ((((UDItype) 1) << 53) - 1); @@ -61,6 +65,31 @@ __bid_fixddbitint (UBILtype *r, SItype rprec, _Decimal64 a) if (mantissa > (UDItype) 9999999999999999) mantissa = 0; } +#else + if ((t & (15 << 8)) != (15 << 8)) + { + exponent = (u.u >> 50) & 255; + if ((t & (3 << 10)) != (3 << 10)) + { + mantissa = ((t >> 7) & 7) * 1000; + exponent += (t >> 2) & (3 << 8); + } + else + { + mantissa = ((t >> 7) & 1) ? 9000 : 8000; + exponent += t & (3 << 8); + } + mantissa += __dpd_d2bbitint[(u.u >> 40) & 1023]; + mantissa *= 1000; + mantissa += __dpd_d2bbitint[(u.u >> 30) & 1023]; + mantissa *= 1000; + mantissa += __dpd_d2bbitint[(u.u >> 20) & 1023]; + mantissa *= 1000; + mantissa += __dpd_d2bbitint[(u.u >> 10) & 1023]; + mantissa *= 1000; + mantissa += __dpd_d2bbitint[u.u & 1023]; + } +#endif else { FP_SET_EXCEPTION (FP_EX_INVALID @@ -162,7 +191,7 @@ __bid_fixddbitint (UBILtype *r, SItype rprec, _Decimal64 a) if (res_limbs + low_zeros > rn && resv[BITINT_END (0, res_limbs - 1)]) goto ovf_ex; if ((arprec % BIL_TYPE_SIZE) != 0 - && (resv[BITINT_END (rn - res_limbs, rn - 1) - low_zeros] + && (resv[BITINT_END (res_limbs + low_zeros - rn, rn - 1 - low_zeros)] & ((UBILtype) -1 << (arprec % BIL_TYPE_SIZE))) != 0) goto ovf_ex; min_limbs = rn - low_zeros; diff --git a/libgcc/soft-fp/fixddti.c b/libgcc/soft-fp/fixddti.c index c27ae8b..c7b4ad7 100644 --- a/libgcc/soft-fp/fixddti.c +++ b/libgcc/soft-fp/fixddti.c @@ -1,7 +1,7 @@ /* Software floating-point emulation. Convert _Decimal64 to 128bit signed integer. - Copyright (C) 2023 Free Software Foundation, Inc. + Copyright (C) 2023-2025 Free Software Foundation, Inc. This file is part of GCC. @@ -28,6 +28,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "bitint.h" #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__) +#ifndef ENABLE_DECIMAL_BID_FORMAT +#define __bid_fixddbitint __dpd_fixddbitint +#define __bid_fixddti __dpd_fixddti +#endif extern void __bid_fixddbitint (UBILtype *, SItype, _Decimal64); extern TItype __bid_fixddti (_Decimal64); diff --git a/libgcc/soft-fp/fixsdbitint.c b/libgcc/soft-fp/fixsdbitint.c index 2ba550f..fc117d9 100644 --- a/libgcc/soft-fp/fixsdbitint.c +++ b/libgcc/soft-fp/fixsdbitint.c @@ -1,7 +1,7 @@ /* Software floating-point emulation. Convert _Decimal32 to signed or unsigned _BitInt. - Copyright (C) 2023 Free Software Foundation, Inc. + Copyright (C) 2023-2025 Free Software Foundation, Inc. This file is part of GCC. @@ -28,6 +28,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "bitint.h" #ifdef __BITINT_MAXWIDTH__ +#ifndef ENABLE_DECIMAL_BID_FORMAT +#define __bid_fixsdbitint __dpd_fixsdbitint +#endif extern void __bid_fixsdbitint (UBILtype *, SItype, _Decimal32); void @@ -48,6 +51,7 @@ __bid_fixsdbitint (UBILtype *r, SItype rprec, _Decimal32 a) u.d = a; t = u.u >> 21; sgn = (SItype) u.u < 0; +#ifdef ENABLE_DECIMAL_BID_FORMAT if ((t & (3 << 8)) != (3 << 8)) { mantissa = u.u & ((((USItype) 1) << 23) - 1); @@ -61,6 +65,25 @@ __bid_fixsdbitint (UBILtype *r, SItype rprec, _Decimal32 a) if (mantissa > (USItype) 9999999) mantissa = 0; } +#else + if ((t & (15 << 6)) != (15 << 6)) + { + exponent = (u.u >> 20) & 63; + if ((t & (3 << 8)) != (3 << 8)) + { + mantissa = ((t >> 5) & 7) * 1000; + exponent += (t >> 2) & (3 << 6); + } + else + { + mantissa = ((t >> 5) & 1) ? 9000 : 8000; + exponent += t & (3 << 6); + } + mantissa += __dpd_d2bbitint[(u.u >> 10) & 1023]; + mantissa *= 1000; + mantissa += __dpd_d2bbitint[u.u & 1023]; + } +#endif else { FP_SET_EXCEPTION (FP_EX_INVALID @@ -153,7 +176,7 @@ __bid_fixsdbitint (UBILtype *r, SItype rprec, _Decimal32 a) if (res_limbs + low_zeros > rn && resv[BITINT_END (0, res_limbs - 1)]) goto ovf_ex; if ((arprec % BIL_TYPE_SIZE) != 0 - && (resv[BITINT_END (rn - res_limbs, rn - 1) - low_zeros] + && (resv[BITINT_END (res_limbs + low_zeros - rn, rn - 1 - low_zeros)] & ((UBILtype) -1 << (arprec % BIL_TYPE_SIZE))) != 0) goto ovf_ex; min_limbs = rn - low_zeros; diff --git a/libgcc/soft-fp/fixsdti.c b/libgcc/soft-fp/fixsdti.c index 8477ace..9a53508 100644 --- a/libgcc/soft-fp/fixsdti.c +++ b/libgcc/soft-fp/fixsdti.c @@ -28,6 +28,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "bitint.h" #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__) +#ifndef ENABLE_DECIMAL_BID_FORMAT +#define __bid_fixsdbitint __dpd_fixsdbitint +#define __bid_fixsdti __dpd_fixsdti +#endif extern void __bid_fixsdbitint (UBILtype *, SItype, _Decimal32); extern TItype __bid_fixsdti (_Decimal32); diff --git a/libgcc/soft-fp/fixtdbitint.c b/libgcc/soft-fp/fixtdbitint.c index 66aca1c..a16aaab 100644 --- a/libgcc/soft-fp/fixtdbitint.c +++ b/libgcc/soft-fp/fixtdbitint.c @@ -1,7 +1,7 @@ /* Software floating-point emulation. Convert _Decimal128 to signed or unsigned _BitInt. - Copyright (C) 2023 Free Software Foundation, Inc. + Copyright (C) 2023-2025 Free Software Foundation, Inc. This file is part of GCC. @@ -28,6 +28,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "bitint.h" #ifdef __BITINT_MAXWIDTH__ +#ifndef ENABLE_DECIMAL_BID_FORMAT +#define __bid_fixtdbitint __dpd_fixtdbitint +#endif extern void __bid_fixtdbitint (UBILtype *, SItype, _Decimal128); void @@ -50,6 +53,7 @@ __bid_fixtdbitint (UBILtype *r, SItype rprec, _Decimal128 a) mantissalo = u.u[__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__]; t = mantissahi >> 47; sgn = (DItype) mantissahi < 0; +#ifdef ENABLE_DECIMAL_BID_FORMAT if ((t & (3 << 14)) != (3 << 14)) { mantissahi &= ((((UDItype) 1) << 49) - 1); @@ -68,6 +72,52 @@ __bid_fixtdbitint (UBILtype *r, SItype rprec, _Decimal128 a) mantissalo = 0; exponent = t & 0x3fff; } +#else + if ((t & (15 << 12)) != (15 << 12)) + { + exponent = (mantissahi >> 46) & 4095; + if ((t & (3 << 14)) != (3 << 14)) + { + exponent += (t >> 2) & (3 << 12); + t = ((t >> 11) & 7) * 1000; + } + else + { + exponent += t & (3 << 12); + t = ((t >> 11) & 1) ? 9000 : 8000; + } + t += __dpd_d2bbitint[(mantissahi >> (100 - 64)) & 1023]; + t *= 1000; + t += __dpd_d2bbitint[(mantissahi >> (90 - 64)) & 1023]; + t *= 1000; + t += __dpd_d2bbitint[(mantissahi >> (80 - 64)) & 1023]; + t *= 1000; + t += __dpd_d2bbitint[(mantissahi >> (70 - 64)) & 1023]; + t *= 1000; + t += __dpd_d2bbitint[((mantissahi & 63) << 4) + + ((mantissalo >> 60) & 15)]; + t *= 1000; + t += __dpd_d2bbitint[mantissalo >> 50 & 1023]; +#ifdef __SIZEOF_INT128__ + unsigned __int128 m = t; +#else + unsigned _BitInt(128) m = t; +#endif + m *= 1000000000000000ULL; + t = __dpd_d2bbitint[(mantissalo >> 40) & 1023]; + t *= 1000; + t += __dpd_d2bbitint[(mantissalo >> 30) & 1023]; + t *= 1000; + t += __dpd_d2bbitint[(mantissalo >> 20) & 1023]; + t *= 1000; + t += __dpd_d2bbitint[(mantissalo >> 10) & 1023]; + t *= 1000; + t += __dpd_d2bbitint[mantissalo & 1023]; + m += t; + mantissahi = m >> 64; + mantissalo = m; + } +#endif else { FP_SET_EXCEPTION (FP_EX_INVALID @@ -199,7 +249,7 @@ __bid_fixtdbitint (UBILtype *r, SItype rprec, _Decimal128 a) if (res_limbs + low_zeros > rn && resv[BITINT_END (0, res_limbs - 1)]) goto ovf_ex; if ((arprec % BIL_TYPE_SIZE) != 0 - && (resv[BITINT_END (rn - res_limbs, rn - 1) - low_zeros] + && (resv[BITINT_END (res_limbs + low_zeros - rn, rn - 1 - low_zeros)] & ((UBILtype) -1 << (arprec % BIL_TYPE_SIZE))) != 0) goto ovf_ex; min_limbs = rn - low_zeros; diff --git a/libgcc/soft-fp/fixtdti.c b/libgcc/soft-fp/fixtdti.c index 9ac1333..ee26f26 100644 --- a/libgcc/soft-fp/fixtdti.c +++ b/libgcc/soft-fp/fixtdti.c @@ -1,7 +1,7 @@ /* Software floating-point emulation. Convert _Decimal128 to 128bit signed integer. - Copyright (C) 2023 Free Software Foundation, Inc. + Copyright (C) 2023-2025 Free Software Foundation, Inc. This file is part of GCC. @@ -28,6 +28,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "bitint.h" #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__) +#ifndef ENABLE_DECIMAL_BID_FORMAT +#define __bid_fixtdbitint __dpd_fixtdbitint +#define __bid_fixtdti __dpd_fixtdti +#endif extern void __bid_fixtdbitint (UBILtype *, SItype, _Decimal128); extern TItype __bid_fixtdti (_Decimal128); diff --git a/libgcc/soft-fp/fixunsddti.c b/libgcc/soft-fp/fixunsddti.c index 7551e00..b7a4a80 100644 --- a/libgcc/soft-fp/fixunsddti.c +++ b/libgcc/soft-fp/fixunsddti.c @@ -1,7 +1,7 @@ /* Software floating-point emulation. Convert _Decimal64 to 128bit unsigned integer. - Copyright (C) 2023 Free Software Foundation, Inc. + Copyright (C) 2023-2025 Free Software Foundation, Inc. This file is part of GCC. @@ -28,6 +28,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "bitint.h" #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__) +#ifndef ENABLE_DECIMAL_BID_FORMAT +#define __bid_fixddbitint __dpd_fixddbitint +#define __bid_fixunsddti __dpd_fixunsddti +#endif extern void __bid_fixddbitint (UBILtype *, SItype, _Decimal64); extern UTItype __bid_fixunsddti (_Decimal64); diff --git a/libgcc/soft-fp/fixunssdti.c b/libgcc/soft-fp/fixunssdti.c index 8d71b2c..3425c29 100644 --- a/libgcc/soft-fp/fixunssdti.c +++ b/libgcc/soft-fp/fixunssdti.c @@ -1,7 +1,7 @@ /* Software floating-point emulation. Convert _Decimal32 to 128bit unsigned integer. - Copyright (C) 2023 Free Software Foundation, Inc. + Copyright (C) 2023-2025 Free Software Foundation, Inc. This file is part of GCC. @@ -28,6 +28,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "bitint.h" #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__) +#ifndef ENABLE_DECIMAL_BID_FORMAT +#define __bid_fixsdbitint __dpd_fixsdbitint +#define __bid_fixunssdti __dpd_fixunssdti +#endif extern void __bid_fixsdbitint (UBILtype *, SItype, _Decimal32); extern UTItype __bid_fixunssdti (_Decimal32); diff --git a/libgcc/soft-fp/fixunstdti.c b/libgcc/soft-fp/fixunstdti.c index 41ae974..d63ec2b 100644 --- a/libgcc/soft-fp/fixunstdti.c +++ b/libgcc/soft-fp/fixunstdti.c @@ -1,7 +1,7 @@ /* Software floating-point emulation. Convert _Decimal128 to 128bit unsigned integer. - Copyright (C) 2023 Free Software Foundation, Inc. + Copyright (C) 2023-2025 Free Software Foundation, Inc. This file is part of GCC. @@ -28,6 +28,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "bitint.h" #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__) +#ifndef ENABLE_DECIMAL_BID_FORMAT +#define __bid_fixtdbitint __dpd_fixtdbitint +#define __bid_fixunstdti __dpd_fixunstdti +#endif extern void __bid_fixtdbitint (UBILtype *, SItype, _Decimal128); extern UTItype __bid_fixunstdti (_Decimal128); diff --git a/libgcc/soft-fp/floatbitintdd.c b/libgcc/soft-fp/floatbitintdd.c index 4565572..0547bb5 100644 --- a/libgcc/soft-fp/floatbitintdd.c +++ b/libgcc/soft-fp/floatbitintdd.c @@ -1,7 +1,7 @@ /* Software floating-point emulation. Convert a _BitInt to _Decimal64. - Copyright (C) 2023 Free Software Foundation, Inc. + Copyright (C) 2023-2025 Free Software Foundation, Inc. This file is part of GCC. @@ -28,6 +28,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "bitint.h" #ifdef __BITINT_MAXWIDTH__ +#ifndef ENABLE_DECIMAL_BID_FORMAT +#define __bid_floatbitintdd __dpd_floatbitintdd +#endif extern _Decimal64 __bid_floatbitintdd (const UBILtype *, SItype); _Decimal64 @@ -51,7 +54,11 @@ __bid_floatbitintdd (const UBILtype *i, SItype iprec) } if (iprec < 0) { - SItype n = sizeof (0ULL) * __CHAR_BIT__ + 1 - __builtin_clzll (~msb); + SItype n; + if (msb == ~(UBILtype) 0) + n = 1; + else + n = sizeof (0ULL) * __CHAR_BIT__ + 1 - __builtin_clzll (~msb); aiprec = (in - 1) * BIL_TYPE_SIZE + n; } else if (msb == 0) @@ -118,7 +125,8 @@ __bid_floatbitintdd (const UBILtype *i, SItype iprec) } else { - __builtin_memcpy (buf + BITINT_END (q_limbs - in + 1, 0), i, + __builtin_memcpy (buf + BITINT_END (q_limbs - in + 1, 0), + i + BITINT_END (1, 0), (in - 1) * sizeof (UBILtype)); buf[BITINT_END (q_limbs - in, in - 1)] = msb; if (iprec < 0) @@ -239,6 +247,7 @@ __bid_floatbitintdd (const UBILtype *i, SItype iprec) } exponent += 398; +#ifdef ENABLE_DECIMAL_BID_FORMAT if (mantissa >= (UDItype) 0x20000000000000) u.u = (((((iprec < 0) << 2) | (UDItype) 3) << 61) | (((UDItype) exponent) << 51) @@ -247,10 +256,40 @@ __bid_floatbitintdd (const UBILtype *i, SItype iprec) u.u = ((((UDItype) (iprec < 0)) << 63) | (((UDItype) exponent) << 53) | mantissa); +#else + u.u = mantissa; + mantissa = __dpd_b2dbitint[u.u % 1000]; + u.u /= 1000; + mantissa |= ((UDItype) __dpd_b2dbitint[u.u % 1000]) << 10; + u.u /= 1000; + mantissa |= ((UDItype) __dpd_b2dbitint[u.u % 1000]) << 20; + u.u /= 1000; + mantissa |= ((UDItype) __dpd_b2dbitint[u.u % 1000]) << 30; + u.u /= 1000; + mantissa |= ((UDItype) __dpd_b2dbitint[u.u % 1000]) << 40; + u.u /= 1000; + if (u.u >= 8) + u.u = (((((iprec < 0) << 2) | (UDItype) 3) << 61) + | (((UDItype) exponent & (3 << 8)) << 51) + | ((u.u & 1) << 58) + | (((UDItype) exponent & 255) << 50) + | mantissa); + else + u.u = ((((UDItype) (iprec < 0)) << 63) + | (((UDItype) exponent & (3 << 8)) << 53) + | (u.u << 58) + | (((UDItype) exponent & 255) << 50) + | mantissa); +#endif if (inexact) { ui.u = ((((UDItype) (iprec < 0)) << 63) +#ifdef ENABLE_DECIMAL_BID_FORMAT | (((UDItype) (exponent - 1)) << 53) +#else + | (((UDItype) (exponent - 1) & (3 << 8)) << 53) + | (((UDItype) (exponent - 1) & 255) << 50) +#endif | (inexact + 3)); __asm ("" : "+g" (u.d)); __asm ("" : "+g" (ui.d)); diff --git a/libgcc/soft-fp/floatbitintsd.c b/libgcc/soft-fp/floatbitintsd.c index 4901aa8..915f46c 100644 --- a/libgcc/soft-fp/floatbitintsd.c +++ b/libgcc/soft-fp/floatbitintsd.c @@ -1,7 +1,7 @@ /* Software floating-point emulation. Convert a _BitInt to _Decimal32. - Copyright (C) 2023 Free Software Foundation, Inc. + Copyright (C) 2023-2025 Free Software Foundation, Inc. This file is part of GCC. @@ -28,6 +28,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "bitint.h" #ifdef __BITINT_MAXWIDTH__ +#ifndef ENABLE_DECIMAL_BID_FORMAT +#define __bid_floatbitintsd __dpd_floatbitintsd +#endif extern _Decimal32 __bid_floatbitintsd (const UBILtype *, SItype); _Decimal32 @@ -51,7 +54,11 @@ __bid_floatbitintsd (const UBILtype *i, SItype iprec) } if (iprec < 0) { - SItype n = sizeof (0ULL) * __CHAR_BIT__ + 1 - __builtin_clzll (~msb); + SItype n; + if (msb == ~(UBILtype) 0) + n = 1; + else + n = sizeof (0ULL) * __CHAR_BIT__ + 1 - __builtin_clzll (~msb); aiprec = (in - 1) * BIL_TYPE_SIZE + n; } else if (msb == 0) @@ -117,7 +124,8 @@ __bid_floatbitintsd (const UBILtype *i, SItype iprec) } else { - __builtin_memcpy (buf + BITINT_END (q_limbs - in + 1, 0), i, + __builtin_memcpy (buf + BITINT_END (q_limbs - in + 1, 0), + i + BITINT_END (1, 0), (in - 1) * sizeof (UBILtype)); buf[BITINT_END (q_limbs - in, in - 1)] = msb; if (iprec < 0) @@ -210,6 +218,7 @@ __bid_floatbitintsd (const UBILtype *i, SItype iprec) } exponent += 101; +#ifdef ENABLE_DECIMAL_BID_FORMAT if (mantissa >= (USItype) 0x800000) u.u = (((((iprec < 0) << 2) | (USItype) 3) << 29) | (((USItype) exponent) << 21) @@ -218,10 +227,34 @@ __bid_floatbitintsd (const UBILtype *i, SItype iprec) u.u = ((((USItype) (iprec < 0)) << 31) | (((USItype) exponent) << 23) | mantissa); +#else + u.u = mantissa; + mantissa = __dpd_b2dbitint[u.u % 1000]; + u.u /= 1000; + mantissa |= ((USItype) __dpd_b2dbitint[u.u % 1000]) << 10; + u.u /= 1000; + if (u.u >= 8) + u.u = (((((iprec < 0) << 2) | (USItype) 3) << 29) + | (((USItype) exponent & (3 << 6)) << 21) + | ((u.u & 1) << 26) + | (((USItype) exponent & 63) << 20) + | mantissa); + else + u.u = ((((USItype) (iprec < 0)) << 31) + | (((USItype) exponent & (3 << 6)) << 23) + | (u.u << 26) + | (((USItype) exponent & 63) << 20) + | mantissa); +#endif if (inexact) { ui.u = ((((USItype) (iprec < 0)) << 31) +#ifdef ENABLE_DECIMAL_BID_FORMAT | (((USItype) (exponent - 1)) << 23) +#else + | (((USItype) (exponent - 1) & (3 << 6)) << 23) + | (((USItype) (exponent - 1) & 63) << 20) +#endif | (inexact + 3)); __asm ("" : "+g" (u.d)); __asm ("" : "+g" (ui.d)); diff --git a/libgcc/soft-fp/floatbitinttd.c b/libgcc/soft-fp/floatbitinttd.c index 5fff339..50b9e77 100644 --- a/libgcc/soft-fp/floatbitinttd.c +++ b/libgcc/soft-fp/floatbitinttd.c @@ -1,7 +1,7 @@ /* Software floating-point emulation. Convert a _BitInt to _Decimal128. - Copyright (C) 2023 Free Software Foundation, Inc. + Copyright (C) 2023-2025 Free Software Foundation, Inc. This file is part of GCC. @@ -28,6 +28,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "bitint.h" #ifdef __BITINT_MAXWIDTH__ +#ifndef ENABLE_DECIMAL_BID_FORMAT +#define __bid_floatbitinttd __dpd_floatbitinttd +#endif extern _Decimal128 __bid_floatbitinttd (const UBILtype *, SItype); _Decimal128 @@ -51,7 +54,11 @@ __bid_floatbitinttd (const UBILtype *i, SItype iprec) } if (iprec < 0) { - SItype n = sizeof (0ULL) * __CHAR_BIT__ + 1 - __builtin_clzll (~msb); + SItype n; + if (msb == ~(UBILtype) 0) + n = 1; + else + n = sizeof (0ULL) * __CHAR_BIT__ + 1 - __builtin_clzll (~msb); aiprec = (in - 1) * BIL_TYPE_SIZE + n; } else if (msb == 0) @@ -117,7 +124,8 @@ __bid_floatbitinttd (const UBILtype *i, SItype iprec) } else { - __builtin_memcpy (buf + BITINT_END (q_limbs - in + 1, 0), i, + __builtin_memcpy (buf + BITINT_END (q_limbs - in + 1, 0), + i + BITINT_END (1, 0), (in - 1) * sizeof (UBILtype)); buf[BITINT_END (q_limbs - in, in - 1)] = msb; if (iprec < 0) @@ -253,15 +261,69 @@ __bid_floatbitinttd (const UBILtype *i, SItype iprec) } exponent += 6176; +#ifdef ENABLE_DECIMAL_BID_FORMAT u.u[__FLOAT_WORD_ORDER__ != __ORDER_BIG_ENDIAN__] = ((((UDItype) (iprec < 0)) << 63) | (((UDItype) exponent) << 49) | mantissahi); +#else +#ifdef __SIZEOF_INT128__ + unsigned __int128 m = mantissahi; +#else + unsigned _BitInt(128) m = mantissahi; +#endif + m = (m << 64) | mantissalo; + u.u[0] = m / 1000000000000000ULL; + u.u[1] = m % 1000000000000000ULL; + mantissalo = __dpd_b2dbitint[u.u[1] % 1000]; + u.u[1] /= 1000; + mantissalo |= ((UDItype) __dpd_b2dbitint[u.u[1] % 1000]) << 10; + u.u[1] /= 1000; + mantissalo |= ((UDItype) __dpd_b2dbitint[u.u[1] % 1000]) << 20; + u.u[1] /= 1000; + mantissalo |= ((UDItype) __dpd_b2dbitint[u.u[1] % 1000]) << 30; + u.u[1] /= 1000; + mantissalo |= ((UDItype) __dpd_b2dbitint[u.u[1] % 1000]) << 40; + mantissalo |= ((UDItype) __dpd_b2dbitint[u.u[0] % 1000]) << 50; + u.u[0] /= 1000; + mantissahi = __dpd_b2dbitint[u.u[0] % 1000]; + u.u[0] /= 1000; + mantissalo |= mantissahi << 60; + mantissahi >>= 4; + mantissahi |= ((UDItype) __dpd_b2dbitint[u.u[0] % 1000]) << 6; + u.u[0] /= 1000; + mantissahi |= ((UDItype) __dpd_b2dbitint[u.u[0] % 1000]) << 16; + u.u[0] /= 1000; + mantissahi |= ((UDItype) __dpd_b2dbitint[u.u[0] % 1000]) << 26; + u.u[0] /= 1000; + mantissahi |= ((UDItype) __dpd_b2dbitint[u.u[0] % 1000]) << 36; + u.u[0] /= 1000; + if (u.u[0] >= 8) + u.u[__FLOAT_WORD_ORDER__ != __ORDER_BIG_ENDIAN__] + = (((((iprec < 0) << 2) | (UDItype) 3) << 61) + | (((UDItype) exponent & (3 << 12)) << 47) + | ((u.u[0] & 1) << 58) + | (((UDItype) exponent & 4095) << 46) + | mantissahi); + else + u.u[__FLOAT_WORD_ORDER__ != __ORDER_BIG_ENDIAN__] + = ((((UDItype) (iprec < 0)) << 63) + | (((UDItype) exponent & (3 << 12)) << 49) + | (u.u[0] << 58) + | (((UDItype) exponent & 4095) << 46) + | mantissahi); +#endif u.u[__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__] = mantissalo; if (inexact) { ui.u[__FLOAT_WORD_ORDER__ != __ORDER_BIG_ENDIAN__] +#ifdef ENABLE_DECIMAL_BID_FORMAT = (((UDItype) (iprec < 0)) << 63) | (((UDItype) exponent - 1) << 49); +#else + = ((((UDItype) (iprec < 0)) << 63) + | ((((UDItype) exponent - 1) & (3 << 12)) << 49) + | ((((UDItype) exponent - 1) & 4095) << 46)); +#endif ui.u[__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__] = inexact + 3; __asm ("" : "+g" (u.d)); __asm ("" : "+g" (ui.d)); diff --git a/libgcc/soft-fp/floattidd.c b/libgcc/soft-fp/floattidd.c index 31ad9d0..c4e569d 100644 --- a/libgcc/soft-fp/floattidd.c +++ b/libgcc/soft-fp/floattidd.c @@ -1,7 +1,7 @@ /* Software floating-point emulation. Convert a 128bit signed integer to _Decimal64. - Copyright (C) 2023 Free Software Foundation, Inc. + Copyright (C) 2023-2025 Free Software Foundation, Inc. This file is part of GCC. @@ -28,6 +28,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "bitint.h" #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__) +#ifndef ENABLE_DECIMAL_BID_FORMAT +#define __bid_floatbitintdd __dpd_floatbitintdd +#define __bid_floattidd __dpd_floattidd +#endif extern _Decimal64 __bid_floatbitintdd (const UBILtype *, SItype); extern _Decimal64 __bid_floattidd (TItype); diff --git a/libgcc/soft-fp/floattisd.c b/libgcc/soft-fp/floattisd.c index 37a24a3..641c32a 100644 --- a/libgcc/soft-fp/floattisd.c +++ b/libgcc/soft-fp/floattisd.c @@ -1,7 +1,7 @@ /* Software floating-point emulation. Convert a 128bit signed integer to _Decimal32. - Copyright (C) 2023 Free Software Foundation, Inc. + Copyright (C) 2023-2025 Free Software Foundation, Inc. This file is part of GCC. @@ -28,6 +28,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "bitint.h" #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__) +#ifndef ENABLE_DECIMAL_BID_FORMAT +#define __bid_floatbitintsd __dpd_floatbitintsd +#define __bid_floattisd __dpd_floattisd +#endif extern _Decimal32 __bid_floatbitintsd (const UBILtype *, SItype); extern _Decimal32 __bid_floattisd (TItype); diff --git a/libgcc/soft-fp/floattitd.c b/libgcc/soft-fp/floattitd.c index edc0b37..9d10ed7 100644 --- a/libgcc/soft-fp/floattitd.c +++ b/libgcc/soft-fp/floattitd.c @@ -1,7 +1,7 @@ /* Software floating-point emulation. Convert a 128bit signed integer to _Decimal128. - Copyright (C) 2023 Free Software Foundation, Inc. + Copyright (C) 2023-2025 Free Software Foundation, Inc. This file is part of GCC. @@ -28,6 +28,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "bitint.h" #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__) +#ifndef ENABLE_DECIMAL_BID_FORMAT +#define __bid_floatbitinttd __dpd_floatbitinttd +#define __bid_floattitd __dpd_floattitd +#endif extern _Decimal128 __bid_floatbitinttd (const UBILtype *, SItype); extern _Decimal128 __bid_floattitd (TItype); diff --git a/libgcc/soft-fp/floatuntidd.c b/libgcc/soft-fp/floatuntidd.c index ea4108f..f977400 100644 --- a/libgcc/soft-fp/floatuntidd.c +++ b/libgcc/soft-fp/floatuntidd.c @@ -1,7 +1,7 @@ /* Software floating-point emulation. Convert a 128bit unsigned integer to _Decimal64. - Copyright (C) 2023 Free Software Foundation, Inc. + Copyright (C) 2023-2025 Free Software Foundation, Inc. This file is part of GCC. @@ -28,6 +28,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "bitint.h" #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__) +#ifndef ENABLE_DECIMAL_BID_FORMAT +#define __bid_floatbitintdd __dpd_floatbitintdd +#define __bid_floatunstidd __dpd_floatunstidd +#endif extern _Decimal64 __bid_floatbitintdd (const UBILtype *, SItype); extern _Decimal64 __bid_floatunstidd (UTItype); diff --git a/libgcc/soft-fp/floatuntisd.c b/libgcc/soft-fp/floatuntisd.c index d907353e..cc00d83 100644 --- a/libgcc/soft-fp/floatuntisd.c +++ b/libgcc/soft-fp/floatuntisd.c @@ -1,7 +1,7 @@ /* Software floating-point emulation. Convert a 128bit unsigned integer to _Decimal32. - Copyright (C) 2023 Free Software Foundation, Inc. + Copyright (C) 2023-2025 Free Software Foundation, Inc. This file is part of GCC. @@ -28,6 +28,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "bitint.h" #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__) +#ifndef ENABLE_DECIMAL_BID_FORMAT +#define __bid_floatbitintsd __dpd_floatbitintsd +#define __bid_floatunstisd __dpd_floatunstisd +#endif extern _Decimal32 __bid_floatbitintsd (const UBILtype *, SItype); extern _Decimal32 __bid_floatunstisd (UTItype); diff --git a/libgcc/soft-fp/floatuntitd.c b/libgcc/soft-fp/floatuntitd.c index 5731f2a..551166e 100644 --- a/libgcc/soft-fp/floatuntitd.c +++ b/libgcc/soft-fp/floatuntitd.c @@ -1,7 +1,7 @@ /* Software floating-point emulation. Convert a 128bit unsigned integer to _Decimal128. - Copyright (C) 2023 Free Software Foundation, Inc. + Copyright (C) 2023-2025 Free Software Foundation, Inc. This file is part of GCC. @@ -28,6 +28,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "bitint.h" #if defined(__BITINT_MAXWIDTH__) && defined(__SIZEOF_INT128__) +#ifndef ENABLE_DECIMAL_BID_FORMAT +#define __bid_floatbitinttd __dpd_floatbitinttd +#define __bid_floatunstitd __dpd_floatunstitd +#endif extern _Decimal128 __bid_floatbitinttd (const UBILtype *, SItype); extern _Decimal128 __bid_floatunstitd (UTItype); diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index ecf84ff..4aab62b 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,9 @@ +2025-05-28 Tobias Burnus <tburnus@baylibre.com> + + PR middle-end/118694 + * testsuite/libgomp.fortran/metadirective-1.f90: xfail when + compiling (also) for nvptx offloading as an error is then expected. + 2025-05-23 Tobias Burnus <tburnus@baylibre.com> PR middle-end/118694 diff --git a/libgomp/testsuite/libgomp.fortran/metadirective-1.f90 b/libgomp/testsuite/libgomp.fortran/metadirective-1.f90 index 7b3e09f..d6f4d5b 100644 --- a/libgomp/testsuite/libgomp.fortran/metadirective-1.f90 +++ b/libgomp/testsuite/libgomp.fortran/metadirective-1.f90 @@ -1,4 +1,5 @@ -! { dg-do run } +! { dg-do run { target { ! offload_target_nvptx } } } +! { dg-do compile { target offload_target_nvptx } } program test implicit none @@ -33,6 +34,10 @@ program test contains subroutine f (x, y, z) integer :: x(N), y(N), z(N) + ! The following fails as on the host the target side cannot be + ! resolved - and the 'teams' or not status affects how 'target' + ! is called. -> See PR118694, esp. comment 9. + ! Note also the dg-do compile above for offload_target_nvptx !$omp target map (to: x, y) map(from: z) block @@ -43,6 +48,7 @@ contains z(i) = x(i) * y(i) enddo end block + ! { dg-bogus "'target' construct with nested 'teams' construct contains directives outside of the 'teams' construct" "PR118694" { xfail offload_target_nvptx } .-9 } */ end subroutine subroutine g (x, y, z) integer :: x(N), y(N), z(N) @@ -56,6 +62,7 @@ contains z(i) = x(i) * y(i) enddo end block + ! { dg-bogus "'target' construct with nested 'teams' construct contains directives outside of the 'teams' construct" "PR118694" { xfail offload_target_nvptx } .-9 } */ !$omp end target end subroutine end program diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 0c2b698..ba4a398 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,99 @@ +2025-05-27 Jonathan Wakely <jwakely@redhat.com> + + * testsuite/17_intro/names.cc [_AIX] (n): Undefine. + * testsuite/experimental/names.cc [_AIX] (ptr): Undefine. + +2025-05-27 Jonathan Wakely <jwakely@redhat.com> + + * testsuite/std/format/debug.cc: Disable for targets with 16-bit + wchar_t. + * testsuite/std/format/functions/format.cc: Use -DUNICODE for + targets with 32-bit wchar_t. + (test_unicode) [UNICODE]: Only run checks when UNICODE is + defined. + +2025-05-27 Jonathan Wakely <jwakely@redhat.com> + + * include/Makefile.in: Regenerate. + +2025-05-27 Jonathan Wakely <jwakely@redhat.com> + + PR libstdc++/96710 + * include/bits/std_abs.h [__SIZEOF_INT128__] (abs(__int128)): + Define. + [_GLIBCXX_USE_FLOAT128] (abs(__float128)): Enable definition for + strict modes. + * testsuite/26_numerics/headers/cmath/82644.cc: Use strict_std + instead of defining __STRICT_ANSI__. + * testsuite/26_numerics/headers/cstdlib/abs128.cc: New test. + +2025-05-27 Luc Grosheintz <luc.grosheintz@gmail.com> + + * include/std/mdspan: Value initialize the array storing the + dynamic extents. + * testsuite/23_containers/mdspan/extents/ctor_default.cc: New + test. + +2025-05-26 Tomasz Kamiński <tkaminsk@redhat.com> + + PR libstdc++/119152 + * testsuite/std/memory/indirect/ctor.cc: Run test_inplace_ctor. + +2025-05-26 Jonathan Wakely <jwakely@redhat.com> + Tomasz Kamiński <tkaminsk@redhat.com> + + PR libstdc++/119152 + * doc/doxygen/stdheader.cc: Added indirect.h file. + * include/Makefile.am: Add new header. + * include/Makefile.in: Regenerate. + * include/bits/indirect.h: New file. + * include/bits/version.def (indirect): Define. + * include/bits/version.h: Regenerate. + * include/std/memory: Include new header. + * testsuite/std/memory/indirect/copy.cc + * testsuite/std/memory/indirect/copy_alloc.cc + * testsuite/std/memory/indirect/ctor.cc + * testsuite/std/memory/indirect/incomplete.cc + * testsuite/std/memory/indirect/invalid_neg.cc + * testsuite/std/memory/indirect/move.cc + * testsuite/std/memory/indirect/move_alloc.cc + * testsuite/std/memory/indirect/relops.cc + +2025-05-26 Tomasz Kamiński <tkaminsk@redhat.com> + + PR libstdc++/119126 + * doc/doxygen/stdheader.cc: Added funcref_impl.h file. + * include/Makefile.am: Added funcref_impl.h file. + * include/Makefile.in: Added funcref_impl.h file. + * include/bits/funcref_impl.h: New file. + * include/bits/funcwrap.h: (_Ptrs::_M_obj): Const-qualify. + (_Storage::_M_ptr, _Storage::_M_ref): Remove. + (__polyfunc::__cast_to) Define. + (_Base_invoker::_S_ptrs, _Base_invoker::_S_nttp) + (_Base_invoker::_S_bind_ptrs, _Base_invoker::_S_bind_ref) + (_Base_invoker::_S_call_ptrs): Define. + (_Base_invoker::_S_call_storage): Foward to _S_call_ptrs. + (_Manager::_S_local, _Manager::_S_ptr): Adjust for _M_obj being + const qualified. + (__polyfunc::_Manager, __polyfunc::_Mo_base): Guard with + __glibcxx_move_only_function || __glibcxx_copyable_function. + (__polyfunc::__skip_first_arg, __polyfunc::__deduce_funcref) + (std::function_ref) [__glibcxx_function_ref]: Define. + * include/bits/utility.h (std::nontype_t, std::nontype) + (__is_nontype_v) [__glibcxx_function_ref]: Define. + * include/bits/version.def: Define function_ref. + * include/bits/version.h: Regenerate. + * include/std/functional: Define __cpp_lib_function_ref. + * src/c++23/std.cc.in (std::nontype_t, std::nontype) + (std::function_ref) [__cpp_lib_function_ref]: Export. + * testsuite/20_util/function_ref/assign.cc: New test. + * testsuite/20_util/function_ref/call.cc: New test. + * testsuite/20_util/function_ref/cons.cc: New test. + * testsuite/20_util/function_ref/cons_neg.cc: New test. + * testsuite/20_util/function_ref/conv.cc: New test. + * testsuite/20_util/function_ref/deduction.cc: New test. + * testsuite/20_util/function_ref/mutation.cc: New test. + 2025-05-23 Jonathan Wakely <jwakely@redhat.com> PR libstdc++/120384 diff --git a/libstdc++-v3/doc/doxygen/stdheader.cc b/libstdc++-v3/doc/doxygen/stdheader.cc index 839bfc8..cb5d17a 100644 --- a/libstdc++-v3/doc/doxygen/stdheader.cc +++ b/libstdc++-v3/doc/doxygen/stdheader.cc @@ -55,6 +55,7 @@ void init_map() headers["functional_hash.h"] = "functional"; headers["mofunc_impl.h"] = "functional"; headers["cpyfunc_impl.h"] = "functional"; + headers["funcref_impl.h"] = "functional"; headers["funcwrap.h"] = "functional"; headers["invoke.h"] = "functional"; headers["ranges_cmp.h"] = "functional"; @@ -105,6 +106,7 @@ void init_map() headers["uses_allocator.h"] = "memory"; headers["uses_allocator_args.h"] = "memory"; headers["out_ptr.h"] = "memory"; + headers["indirect.h"] = "memory"; headers["memory_resource.h"] = "memory_resource"; headers["unique_lock.h"] = "mutex"; headers["sat_arith.h"] = "numeric"; diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am index 3e5b6c4..cc402f0 100644 --- a/libstdc++-v3/include/Makefile.am +++ b/libstdc++-v3/include/Makefile.am @@ -205,11 +205,13 @@ bits_headers = \ ${bits_srcdir}/fs_ops.h \ ${bits_srcdir}/fs_path.h \ ${bits_srcdir}/fstream.tcc \ + ${bits_srcdir}/funcref_impl.h \ ${bits_srcdir}/funcwrap.h \ ${bits_srcdir}/gslice.h \ ${bits_srcdir}/gslice_array.h \ ${bits_srcdir}/hashtable.h \ ${bits_srcdir}/hashtable_policy.h \ + ${bits_srcdir}/indirect.h \ ${bits_srcdir}/indirect_array.h \ ${bits_srcdir}/ios_base.h \ ${bits_srcdir}/istream.tcc \ diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in index 3531162..0ef8564 100644 --- a/libstdc++-v3/include/Makefile.in +++ b/libstdc++-v3/include/Makefile.in @@ -558,11 +558,13 @@ bits_freestanding = \ @GLIBCXX_HOSTED_TRUE@ ${bits_srcdir}/fs_ops.h \ @GLIBCXX_HOSTED_TRUE@ ${bits_srcdir}/fs_path.h \ @GLIBCXX_HOSTED_TRUE@ ${bits_srcdir}/fstream.tcc \ +@GLIBCXX_HOSTED_TRUE@ ${bits_srcdir}/funcref_impl.h \ @GLIBCXX_HOSTED_TRUE@ ${bits_srcdir}/funcwrap.h \ @GLIBCXX_HOSTED_TRUE@ ${bits_srcdir}/gslice.h \ @GLIBCXX_HOSTED_TRUE@ ${bits_srcdir}/gslice_array.h \ @GLIBCXX_HOSTED_TRUE@ ${bits_srcdir}/hashtable.h \ @GLIBCXX_HOSTED_TRUE@ ${bits_srcdir}/hashtable_policy.h \ +@GLIBCXX_HOSTED_TRUE@ ${bits_srcdir}/indirect.h \ @GLIBCXX_HOSTED_TRUE@ ${bits_srcdir}/indirect_array.h \ @GLIBCXX_HOSTED_TRUE@ ${bits_srcdir}/ios_base.h \ @GLIBCXX_HOSTED_TRUE@ ${bits_srcdir}/istream.tcc \ diff --git a/libstdc++-v3/include/bits/funcref_impl.h b/libstdc++-v3/include/bits/funcref_impl.h new file mode 100644 index 0000000..1e19866 --- /dev/null +++ b/libstdc++-v3/include/bits/funcref_impl.h @@ -0,0 +1,198 @@ +// Implementation of std::function_ref -*- C++ -*- + +// Copyright The GNU Toolchain Authors. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// Under Section 7 of GPL version 3, you are granted additional +// permissions described in the GCC Runtime Library Exception, version +// 3.1, as published by the Free Software Foundation. + +// You should have received a copy of the GNU General Public License and +// a copy of the GCC Runtime Library Exception along with this program; +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +// <http://www.gnu.org/licenses/>. + +/** @file include/bits/funcref_impl.h + * This is an internal header file, included by other library headers. + * Do not attempt to use it directly. @headername{functional} + */ + +#ifndef _GLIBCXX_MOF_CV +# define _GLIBCXX_MOF_CV +#endif + +namespace std _GLIBCXX_VISIBILITY(default) +{ +_GLIBCXX_BEGIN_NAMESPACE_VERSION + + /// @cond undocumented + namespace __polyfunc + { + template<bool _Noex, typename _Ret, typename _Class, typename... _Args> + struct __skip_first_arg<_Ret(_Class::*)(_Args...) _GLIBCXX_MOF_CV + noexcept(_Noex)> + { using type = _Ret(_Args...) noexcept(_Noex); }; + + template<bool _Noex, typename _Ret, typename _Class, typename... _Args> + struct __skip_first_arg<_Ret(_Class::*)(_Args...) _GLIBCXX_MOF_CV& + noexcept(_Noex)> + { using type = _Ret(_Args...) noexcept(_Noex); }; + } // namespace __polyfunc + /// @endcond + + /** + * @brief Non-owning polymorphic function wrapper. + * @ingroup functors + * @since C++26 + * @headerfile functional + * + * The `std::function_ref` class template is a non-owning call wrapper, + * that refers to a bound object. Using function_ref outside of the lifetime + * of the bound object has undefined behavior. + * + * It supports const-qualification and no-throw guarantees. The + * qualifications and exception-specification of the signature are respected + * when invoking the reference function. + */ + template<typename _Res, typename... _ArgTypes, bool _Noex> + class function_ref<_Res(_ArgTypes...) _GLIBCXX_MOF_CV + noexcept(_Noex)> + { + using _Invoker = __polyfunc::_Invoker<_Noex, _Res, _ArgTypes...>; + using _Signature = _Invoker::_Signature; + + // [func.wrap.ref.ctor]/1 is-invokable-using + template<typename... _Tps> + static constexpr bool __is_invocable_using + = __conditional_t<_Noex, + is_nothrow_invocable_r<_Res, _Tps..., _ArgTypes...>, + is_invocable_r<_Res, _Tps..., _ArgTypes...>>::value; + + public: + /// Target and bound object is function pointed by parameter. + template<typename _Fn> + requires is_function_v<_Fn> && __is_invocable_using<_Fn*> + function_ref(_Fn* __fn) noexcept + { + __glibcxx_assert(__fn != nullptr); + _M_invoke = _Invoker::template _S_ptrs<_Fn*>(); + _M_init(__fn); + } + + /// Target and bound object is object referenced by parameter. + template<typename _Fn, typename _Vt = remove_reference_t<_Fn>> + requires (!is_same_v<remove_cv_t<_Vt>, function_ref>) + && (!is_member_pointer_v<_Vt>) + // We deviate from standard by having this condition, that forces + // function references to use _Fn* constructors. This simplies + // implementation and provide better diagnostic when used in + // constant expression (above constructor is not constexpr). + && (!is_function_v<_Vt>) + && __is_invocable_using<_Vt _GLIBCXX_MOF_CV&> + constexpr + function_ref(_Fn&& __f) noexcept + { + _M_invoke = _Invoker::template _S_ptrs<_Vt _GLIBCXX_MOF_CV&>(); + _M_init(std::addressof(__f)); + } + + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 4256. Incorrect constrains for function_ref constructors from nontype + /// Target object is __fn. There is no bound object. + template<auto __fn> + requires __is_invocable_using<const decltype(__fn)&> + constexpr + function_ref(nontype_t<__fn>) noexcept + { + using _Fn = remove_cv_t<decltype(__fn)>; + if constexpr (is_pointer_v<_Fn> || is_member_pointer_v<_Fn>) + static_assert(__fn != nullptr); + + _M_invoke = &_Invoker::template _S_nttp<__fn>; + _M_ptrs._M_obj = nullptr; + } + + /// Target object is equivalent to std::bind_front<_fn>(std::ref(__ref)). + /// Bound object is object referenced by second parameter. + template<auto __fn, typename _Up, typename _Td = remove_reference_t<_Up>> + requires (!is_rvalue_reference_v<_Up&&>) + && __is_invocable_using<const decltype(__fn)&, _Td _GLIBCXX_MOF_CV&> + constexpr + function_ref(nontype_t<__fn>, _Up&& __ref) noexcept + { + using _Fn = remove_cv_t<decltype(__fn)>; + if constexpr (is_pointer_v<_Fn> || is_member_pointer_v<_Fn>) + static_assert(__fn != nullptr); + + using _Tr = _Td _GLIBCXX_MOF_CV&; + if constexpr (is_member_pointer_v<_Fn> && is_lvalue_reference_v<_Tr>) + // N.B. invoking member pointer on lvalue produces the same effects, + // as invoking it on pointer to that lvalue. + _M_invoke = &_Invoker::template _S_bind_ptr<__fn, _Td _GLIBCXX_MOF_CV>; + else + _M_invoke = &_Invoker::template _S_bind_ref<__fn, _Tr>; + _M_init(std::addressof(__ref)); + } + + /// Target object is equivalent to std::bind_front<_fn>(__ptr). + /// Bound object is object pointed by second parameter (if any). + template<auto __fn, typename _Td> + requires __is_invocable_using<const decltype(__fn)&, _Td _GLIBCXX_MOF_CV*> + constexpr + function_ref(nontype_t<__fn>, _Td _GLIBCXX_MOF_CV* __ptr) noexcept + { + using _Fn = remove_cv_t<decltype(__fn)>; + if constexpr (is_pointer_v<_Fn> || is_member_pointer_v<_Fn>) + static_assert(__fn != nullptr); + if constexpr (is_member_pointer_v<_Fn>) + __glibcxx_assert(__ptr != nullptr); + + _M_invoke = &_Invoker::template _S_bind_ptr<__fn, _Td _GLIBCXX_MOF_CV>; + _M_init(__ptr); + } + + template<typename _Tp> + requires (!is_same_v<_Tp, function_ref>) + && (!is_pointer_v<_Tp>) && (!__is_nontype_v<_Tp>) + function_ref& + operator=(_Tp) = delete; + + /** Invoke the target object. + * + * The bound object will be invoked using the supplied arguments, + * and as const or non-const, as dictated by the template arguments + * of the `function_ref` specialization. + */ + _Res + operator()(_ArgTypes... __args) const noexcept(_Noex) + { return _M_invoke(_M_ptrs, std::forward<_ArgTypes>(__args)...); } + + private: + template<typename _Tp> + constexpr void + _M_init(_Tp* __ptr) noexcept + { + if constexpr (is_function_v<_Tp>) + _M_ptrs._M_func = reinterpret_cast<void(*)()>(__ptr); + else + _M_ptrs._M_obj = __ptr; + } + + typename _Invoker::__ptrs_func_t _M_invoke; + __polyfunc::_Ptrs _M_ptrs; + }; + +#undef _GLIBCXX_MOF_CV + +_GLIBCXX_END_NAMESPACE_VERSION +} // namespace std diff --git a/libstdc++-v3/include/bits/funcwrap.h b/libstdc++-v3/include/bits/funcwrap.h index 4e05353..cf261bc 100644 --- a/libstdc++-v3/include/bits/funcwrap.h +++ b/libstdc++-v3/include/bits/funcwrap.h @@ -1,4 +1,5 @@ -// Implementation of std::move_only_function and std::copyable_function -*- C++ -*- +// Implementation of std::move_only_function, std::copyable_function +// and std::function_ref -*- C++ -*- // Copyright The GNU Toolchain Authors. // @@ -36,7 +37,7 @@ #include <bits/version.h> -#if defined(__glibcxx_move_only_function) || defined(__glibcxx_copyable_function) +#if __glibcxx_move_only_function || __glibcxx_copyable_function || __glibcxx_function_ref #include <bits/invoke.h> #include <bits/utility.h> @@ -53,10 +54,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { union _Ptrs { - void* _M_obj; + const void* _M_obj; void (*_M_func)(); }; + template<typename _Tp> + [[__gnu__::__always_inline__]] + constexpr auto* + __cast_to(_Ptrs __ptrs) noexcept + { + using _Td = remove_reference_t<_Tp>; + if constexpr (is_function_v<_Td>) + return reinterpret_cast<_Td*>(__ptrs._M_func); + else if constexpr (is_const_v<_Td>) + return static_cast<_Td*>(__ptrs._M_obj); + else + return static_cast<_Td*>(const_cast<void*>(__ptrs._M_obj)); + } + struct _Storage { void* _M_addr() noexcept { return &_M_bytes[0]; } @@ -97,32 +112,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ::new (_M_addr()) _Tp(std::forward<_Args>(__args)...); } - template<typename _Tp> - [[__gnu__::__always_inline__]] - _Tp* - _M_ptr() const noexcept - { - if constexpr (!_S_stored_locally<remove_const_t<_Tp>>()) - return static_cast<_Tp*>(_M_ptrs._M_obj); - else if constexpr (is_const_v<_Tp>) - return static_cast<_Tp*>(_M_addr()); - else - // _Manager and _Invoker pass _Storage by const&, even for mutable sources. - return static_cast<_Tp*>(const_cast<void*>(_M_addr())); - } - - template<typename _Ref> - [[__gnu__::__always_inline__]] - _Ref - _M_ref() const noexcept - { - using _Tp = remove_reference_t<_Ref>; - if constexpr (is_function_v<remove_pointer_t<_Tp>>) - return reinterpret_cast<_Tp>(_M_ptrs._M_func); - else - return static_cast<_Ref>(*_M_ptr<_Tp>()); - } - // We want to have enough space to store a simple delegate type. struct _Delegate { void (_Storage::*__pfm)(); _Storage* __obj; }; union { @@ -143,6 +132,37 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _S_storage() { return &_S_call_storage<_Adjust_target<_Tp>>; } + using __ptrs_func_t = _Ret(*)(_Ptrs, _Args...) noexcept(_Noex); + template<typename _Tp> + static consteval __ptrs_func_t + _S_ptrs() + { return &_S_call_ptrs<_Adjust_target<_Tp>>; } + +#ifdef __glibcxx_function_ref // C++ >= 26 + template<auto __fn> + static _Ret + _S_nttp(_Ptrs, _Args... __args) noexcept(_Noex) + { return std::__invoke_r<_Ret>(__fn, std::forward<_Args>(__args)...); } + + template<auto __fn, typename _Tp> + static _Ret + _S_bind_ptr(_Ptrs __ptrs, _Args... __args) noexcept(_Noex) + { + auto* __p = __polyfunc::__cast_to<_Tp>(__ptrs); + return std::__invoke_r<_Ret>(__fn, __p, + std::forward<_Args>(__args)...); + } + + template<auto __fn, typename _Ref> + static _Ret + _S_bind_ref(_Ptrs __ptrs, _Args... __args) noexcept(_Noex) + { + auto* __p = __polyfunc::__cast_to<_Ref>(__ptrs); + return std::__invoke_r<_Ret>(__fn, static_cast<_Ref>(*__p), + std::forward<_Args>(__args)...); + } +#endif // __glibcxx_function_ref + private: template<typename _Tp, typename _Td = remove_cvref_t<_Tp>> using _Adjust_target = @@ -152,8 +172,29 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION static _Ret _S_call_storage(const _Storage& __ref, _Args... __args) noexcept(_Noex) { - return std::__invoke_r<_Ret>(__ref._M_ref<_Tp>(), - std::forward<_Args>(__args)...); + _Ptrs __ptrs; + if constexpr (is_function_v<remove_pointer_t<_Tp>>) + __ptrs._M_func = __ref._M_ptrs._M_func; + else if constexpr (!_Storage::_S_stored_locally<remove_cvref_t<_Tp>>()) + __ptrs._M_obj = __ref._M_ptrs._M_obj; + else + __ptrs._M_obj = __ref._M_addr(); + return _S_call_ptrs<_Tp>(__ptrs, std::forward<_Args>(__args)...); + } + + template<typename _Tp> + static _Ret + _S_call_ptrs(_Ptrs __ptrs, _Args... __args) noexcept(_Noex) + { + if constexpr (is_function_v<remove_pointer_t<_Tp>>) + return std::__invoke_r<_Ret>(reinterpret_cast<_Tp>(__ptrs._M_func), + std::forward<_Args>(__args)...); + else + { + auto* __p = __polyfunc::__cast_to<_Tp>(__ptrs); + return std::__invoke_r<_Ret>(static_cast<_Tp>(*__p), + std::forward<_Args>(__args)...); + } } }; @@ -184,6 +225,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return false; } +#if __glibcxx_move_only_function || __glibcxx_copyable_function struct _Manager { enum class _Op @@ -241,7 +283,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION switch (__op) { case _Op::_Address: - __target._M_ptrs._M_obj = const_cast<void*>(__src->_M_addr()); + __target._M_ptrs._M_obj = __src->_M_addr(); return; case _Op::_Move: case _Op::_Copy: @@ -263,24 +305,26 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION switch (__op) { case _Op::_Address: - __target._M_ptrs._M_obj = __src->_M_ptr<_Tp>(); + __target._M_ptrs._M_obj = __src->_M_addr(); return; case _Op::_Move: { - _Tp* __obj = __src->_M_ptr<_Tp>(); + _Tp* __obj = static_cast<_Tp*>(const_cast<void*>(__src->_M_addr())); ::new(__target._M_addr()) _Tp(std::move(*__obj)); __obj->~_Tp(); } return; case _Op::_Destroy: - __target._M_ptr<_Tp>()->~_Tp(); + static_cast<_Tp*>(__target._M_addr())->~_Tp(); return; case _Op::_Copy: if constexpr (_Provide_copy) - ::new (__target._M_addr()) _Tp(__src->_M_ref<const _Tp&>()); - else - __builtin_unreachable(); - return; + { + auto* __obj = static_cast<const _Tp*>(__src->_M_addr()); + ::new (__target._M_addr()) _Tp(*__obj); + return; + } + __builtin_unreachable(); } } @@ -296,14 +340,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __target._M_ptrs._M_obj = __src->_M_ptrs._M_obj; return; case _Op::_Destroy: - delete __target._M_ptr<_Tp>(); + delete static_cast<const _Tp*>(__target._M_ptrs._M_obj); return; case _Op::_Copy: if constexpr (_Provide_copy) - __target._M_ptrs._M_obj = new _Tp(__src->_M_ref<const _Tp&>()); - else - __builtin_unreachable(); - return; + { + auto* __obj = static_cast<const _Tp*>(__src->_M_ptrs._M_obj); + __target._M_ptrs._M_obj = new _Tp(*__obj); + return; + } + __builtin_unreachable(); } } }; @@ -382,7 +428,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION friend class _Cpy_base; #endif // __glibcxx_copyable_function }; - +#endif // __glibcxx_copyable_function || __glibcxx_copyable_function } // namespace __polyfunc /// @endcond @@ -468,6 +514,50 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } // namespace __detail::__variant #endif // __glibcxx_copyable_function +#ifdef __glibcxx_function_ref // C++ >= 26 + /// @cond undocumented + namespace __polyfunc + { + template<typename _Sig> + struct __skip_first_arg; + + // Additional partial specializations are defined in bits/funcref_impl.h + template<bool _Noex, typename _Ret, typename _Arg, typename... _Args> + struct __skip_first_arg<_Ret(*)(_Arg, _Args...) noexcept(_Noex)> + { using type = _Ret(_Args...) noexcept(_Noex); }; + + template<typename _Fn, typename _Tr> + consteval auto + __deduce_funcref() + { + if constexpr (is_member_object_pointer_v<_Fn>) + // TODO Consider reporting issue to make this noexcept + return static_cast<invoke_result_t<_Fn, _Tr>(*)()>(nullptr); + else + return static_cast<__skip_first_arg<_Fn>::type*>(nullptr); + } + } // namespace __polyfunc + /// @endcond + + template<typename... _Signature> + class function_ref; // not defined + + template<typename _Fn> + requires is_function_v<_Fn> + function_ref(_Fn*) -> function_ref<_Fn>; + + template<auto __f, class _Fn = remove_pointer_t<decltype(__f)>> + requires is_function_v<_Fn> + function_ref(nontype_t<__f>) -> function_ref<_Fn>; + + template<auto __f, typename _Tp, class _Fn = decltype(__f)> + requires is_member_pointer_v<_Fn> || is_function_v<remove_pointer_t<_Fn>> + function_ref(nontype_t<__f>, _Tp&&) + -> function_ref< + remove_pointer_t<decltype(__polyfunc::__deduce_funcref<_Fn, _Tp&>())>>; + +#endif // __glibcxx_function_ref + _GLIBCXX_END_NAMESPACE_VERSION } // namespace std @@ -503,5 +593,11 @@ _GLIBCXX_END_NAMESPACE_VERSION #include "cpyfunc_impl.h" #endif // __glibcxx_copyable_function -#endif // __glibcxx_copyable_function || __glibcxx_copyable_function +#ifdef __glibcxx_function_ref // C++ >= 26 +#include "funcref_impl.h" +#define _GLIBCXX_MOF_CV const +#include "funcref_impl.h" +#endif // __glibcxx_function_ref + +#endif // move_only_function || copyable_function || function_ref #endif // _GLIBCXX_FUNCWRAP_H diff --git a/libstdc++-v3/include/bits/indirect.h b/libstdc++-v3/include/bits/indirect.h new file mode 100644 index 0000000..85908e2 --- /dev/null +++ b/libstdc++-v3/include/bits/indirect.h @@ -0,0 +1,459 @@ +// Vocabulary Types for Composite Class Design -*- C++ -*- + +// Copyright The GNU Toolchain Authors. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// Under Section 7 of GPL version 3, you are granted additional +// permissions described in the GCC Runtime Library Exception, version +// 3.1, as published by the Free Software Foundation. + +// You should have received a copy of the GNU General Public License and +// a copy of the GCC Runtime Library Exception along with this program; +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +// <http://www.gnu.org/licenses/>. + +/** @file include/bits/indirect.h + * This is an internal header file, included by other library headers. + * Do not attempt to use it directly. @headername{memory} + */ + +#ifndef _GLIBCXX_INDIRECT_H +#define _GLIBCXX_INDIRECT_H 1 + +#pragma GCC system_header + +#include <bits/version.h> + +#if __glibcxx_indirect || __glibcxx_polymorphic // >= C++26 +#include <compare> +#include <initializer_list> +#include <bits/allocator.h> +#include <bits/alloc_traits.h> +#include <bits/allocated_ptr.h> // __allocate_guarded +#include <bits/uses_allocator.h> // allocator_arg_t +#include <bits/utility.h> // __is_in_place_type_v +#include <bits/functional_hash.h> // hash +#include <bits/memory_resource.h> // polymorphic_allocator + +namespace std _GLIBCXX_VISIBILITY(default) +{ +_GLIBCXX_BEGIN_NAMESPACE_VERSION + +#if __glibcxx_indirect + template<typename _Tp, typename _Alloc = allocator<_Tp>> + class indirect; + + template<typename _Tp> + constexpr bool __is_indirect = false; + template<typename _Tp, typename _Alloc> + constexpr bool __is_indirect<indirect<_Tp, _Alloc>> = true; + +#if _GLIBCXX_HOSTED + namespace pmr + { + template<typename _Tp> + using indirect = indirect<_Tp, polymorphic_allocator<_Tp>>; + } +#endif + + // [indirect], class template indirect + template<typename _Tp, typename _Alloc> + class indirect + { + static_assert(is_object_v<_Tp>); + static_assert(!is_array_v<_Tp>); + static_assert(!is_same_v<_Tp, in_place_t>); + static_assert(!__is_in_place_type_v<_Tp>); + static_assert(!is_const_v<_Tp> && !is_volatile_v<_Tp>); + + using _ATraits = allocator_traits<_Alloc>; + static_assert(is_same_v<_Tp, typename _ATraits::value_type>); + + public: + using value_type = _Tp; + using allocator_type = _Alloc; + using pointer = typename allocator_traits<_Alloc>::pointer; + using const_pointer = typename allocator_traits<_Alloc>::const_pointer; + + constexpr explicit + indirect() requires is_default_constructible_v<_Alloc> + : _M_objp(_M_make_obj_chk()) + { } + + constexpr explicit + indirect(allocator_arg_t, const _Alloc& __a) + : _M_alloc(__a), _M_objp(_M_make_obj_chk()) + { } + + constexpr + indirect(const indirect& __o) + : indirect(allocator_arg, + _ATraits::select_on_container_copy_construction(__o._M_alloc), + __o) + { } + + constexpr + indirect(allocator_arg_t, const _Alloc& __a, const indirect& __other) + : _M_alloc(__a) + { + if (__other._M_objp) + _M_objp = _M_make_obj_chk(__other.__get()); + else + _M_objp = nullptr; + } + + constexpr + indirect(indirect&& __other) noexcept + : _M_alloc(std::move(__other._M_alloc)), + _M_objp(std::__exchange(__other._M_objp, nullptr)) + { } + + constexpr + indirect(allocator_arg_t, const _Alloc& __a, + indirect&& __other) noexcept(_ATraits::is_always_equal::value) + : _M_alloc(__a), + _M_objp(std::__exchange(__other._M_objp, nullptr)) + { + if constexpr (!_ATraits::is_always_equal::value) + if (_M_objp && _M_alloc != __other._M_alloc) + { + static_assert(sizeof(_Tp) != 0, "must be a complete type"); + + // _M_alloc cannot free _M_objp, give it back to __other. + __other._M_objp = std::__exchange(_M_objp, nullptr); + // And create a new object that can be freed by _M_alloc. + _M_objp = _M_make_obj(std::move(*__other._M_objp)); + } + } + + template<typename _Up = _Tp> + requires (!is_same_v<remove_cvref_t<_Up>, in_place_t>) + && (!is_same_v<remove_cvref_t<_Up>, indirect>) + && is_constructible_v<_Tp, _Up> + && is_default_constructible_v<_Alloc> + constexpr explicit + indirect(_Up&& __u) + : _M_objp(_M_make_obj(std::forward<_Up>(__u))) + { } + + template<typename _Up = _Tp> + requires (!is_same_v<remove_cvref_t<_Up>, in_place_t>) + && (!is_same_v<remove_cvref_t<_Up>, indirect>) + && is_constructible_v<_Tp, _Up> + constexpr explicit + indirect(allocator_arg_t, const _Alloc& __a, _Up&& __u) + : _M_alloc(__a), _M_objp(_M_make_obj(std::forward<_Up>(__u))) + { } + + template<typename... _Us> + requires is_constructible_v<_Tp, _Us...> + && is_default_constructible_v<_Alloc> + constexpr explicit + indirect(in_place_t, _Us&&... __us) + : _M_objp(_M_make_obj(std::forward<_Us>(__us)...)) + { } + + template<typename... _Us> + requires is_constructible_v<_Tp, _Us...> + constexpr explicit + indirect(allocator_arg_t, const _Alloc& __a, in_place_t, _Us&&... __us) + : _M_alloc(__a), + _M_objp(_M_make_obj(std::forward<_Us>(__us)...)) + { } + + template<typename _Ip, typename... _Us> + requires is_constructible_v<_Tp, initializer_list<_Ip>&, _Us...> + && is_default_constructible_v<_Alloc> + constexpr explicit + indirect(in_place_t, initializer_list<_Ip> __il, _Us&&... __us) + : _M_objp(_M_make_obj(__il, std::forward<_Us>(__us)...)) + { } + + template<typename _Ip, typename... _Us> + requires is_constructible_v<_Tp, initializer_list<_Ip>&, _Us...> + constexpr explicit + indirect(allocator_arg_t, const _Alloc& __a, + in_place_t, initializer_list<_Ip> __il, _Us&&... __us) + : _M_alloc(__a), + _M_objp(_M_make_obj(__il, std::forward<_Us>(__us)...)) + { } + + constexpr ~indirect() + { + static_assert(sizeof(_Tp) != 0, "must be a complete type"); + _M_reset(nullptr); + } + + constexpr indirect& + operator=(const indirect& __other) + { + static_assert(is_copy_assignable_v<_Tp>); + static_assert(is_copy_constructible_v<_Tp>); + + if (__builtin_addressof(__other) == this) [[unlikely]] + return *this; + + constexpr bool __pocca + = _ATraits::propagate_on_container_copy_assignment::value; + + pointer __ptr = nullptr; + if (__other._M_objp) + { + if (_ATraits::is_always_equal::value + || _M_alloc == __other._M_alloc) + { + if (_M_objp) + { + *_M_objp = __other.__get(); + if constexpr (__pocca) + _M_alloc = __other._M_alloc; + return *this; + } + } + const indirect& __x = __pocca ? __other : *this; + __ptr = __x._M_make_obj(__other.__get()); + } + + _M_reset(__ptr); + + if constexpr (__pocca) + _M_alloc = __other._M_alloc; + + return *this; + } + + constexpr indirect& + operator=(indirect&& __other) + noexcept(_ATraits::propagate_on_container_move_assignment::value + || _ATraits::is_always_equal::value) + { + // N5008 says is_copy_constructible_v<T> here, but that seems wrong. + // We only require move-constructible, and only for unequal allocators. + + if (__builtin_addressof(__other) == this) [[unlikely]] + return *this; + + constexpr bool __pocma + = _ATraits::propagate_on_container_move_assignment::value; + + pointer __ptr = nullptr; + + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 4251. Move assignment for indirect unnecessarily requires copy construction + if constexpr (_ATraits::is_always_equal::value || __pocma) + __ptr = std::__exchange(__other._M_objp, nullptr); + else if (_M_alloc == __other._M_alloc) + __ptr = std::__exchange(__other._M_objp, nullptr); + else if (__other._M_objp) + { + static_assert(is_move_constructible_v<_Tp>); + __ptr = _M_make_obj(std::move(*__other._M_objp)); + } + + _M_reset(__ptr); + + if constexpr (__pocma) + _M_alloc = __other._M_alloc; + + return *this; + } + + template<typename _Up = _Tp> + requires (!is_same_v<remove_cvref_t<_Up>, indirect>) + && is_constructible_v<_Tp, _Up> && is_assignable_v<_Tp&, _Up> + constexpr indirect& + operator=(_Up&& __u) + { + if (_M_objp == nullptr) + _M_objp = _M_make_obj(std::forward<_Up>(__u)); + else + *_M_objp = std::forward<_Up>(__u); + + return *this; + } + + template<typename _Self> + constexpr auto&& + operator*(this _Self&& __self) noexcept + { + __glibcxx_assert(__self._M_objp != nullptr); + return std::forward_like<_Self>(*((_Self)__self)._M_objp); + } + + constexpr const_pointer + operator->() const noexcept + { + // Do we want to enforce this? __glibcxx_assert(_M_objp != nullptr); + return _M_objp; + } + + constexpr pointer + operator->() noexcept + { + // Do we want to enforce this? __glibcxx_assert(_M_objp != nullptr); + return _M_objp; + } + + constexpr bool + valueless_after_move() const noexcept { return _M_objp == nullptr; } + + constexpr allocator_type + get_allocator() const noexcept { return _M_alloc; } + + constexpr void + swap(indirect& __other) + noexcept(_ATraits::propagate_on_container_swap::value + || _ATraits::is_always_equal::value) + { + using std::swap; + swap(_M_objp, __other._M_objp); + if constexpr (_ATraits::propagate_on_container_swap::value) + swap(_M_alloc, __other._M_alloc); + else if constexpr (!_ATraits::is_always_equal::value) + __glibcxx_assert(_M_alloc == __other._M_alloc); + } + + friend constexpr void + swap(indirect& __lhs, indirect& __rhs) + noexcept(_ATraits::propagate_on_container_swap::value + || _ATraits::is_always_equal::value) + { __lhs.swap(__rhs); } + + template<typename _Up, typename _Alloc2> + requires requires (const _Tp& __t, const _Up& __u) { __t == __u; } + friend constexpr bool + operator==(const indirect& __lhs, const indirect<_Up, _Alloc2>& __rhs) + noexcept(noexcept(*__lhs == *__rhs)) + { + if (!__lhs._M_objp || !__rhs._M_objp) + return bool(__lhs._M_objp) == bool(__rhs._M_objp); + else + return __lhs.__get() == __rhs.__get(); + } + + template<typename _Up> + requires (!__is_indirect<_Up>) // See PR c++/99599 + && requires (const _Tp& __t, const _Up& __u) { __t == __u; } + friend constexpr bool + operator==(const indirect& __lhs, const _Up& __rhs) + noexcept(noexcept(*__lhs == __rhs)) + { + if (!__lhs._M_objp) + return false; + else + return __lhs.__get() == __rhs; + } + + template<typename _Up, typename _Alloc2> + friend constexpr __detail::__synth3way_t<_Tp, _Up> + operator<=>(const indirect& __lhs, const indirect<_Up, _Alloc2>& __rhs) + noexcept(noexcept(__detail::__synth3way(*__lhs, *__rhs))) + { + if (!__lhs._M_objp || !__rhs._M_objp) + return bool(__lhs._M_objp) <=> bool(__rhs._M_objp); + else + return __detail::__synth3way(__lhs.__get(), __rhs.__get()); + } + + template<typename _Up> + requires (!__is_indirect<_Up>) // See PR c++/99599 + friend constexpr __detail::__synth3way_t<_Tp, _Up> + operator<=>(const indirect& __lhs, const _Up& __rhs) + noexcept(noexcept(__detail::__synth3way(*__lhs, __rhs))) + { + if (!__lhs._M_objp) + return strong_ordering::less; + else + return __detail::__synth3way(__lhs.__get(), __rhs); + } + + private: + template<typename, typename> friend class indirect; + + constexpr void + _M_reset(pointer __ptr) noexcept + { + if (_M_objp) + { + _ATraits::destroy(_M_alloc, std::to_address(_M_objp)); + _ATraits::deallocate(_M_alloc, _M_objp, 1); + } + _M_objp = __ptr; + } + + template<typename... _Args> + constexpr pointer + _M_make_obj(_Args&&... __args) const + { + _Scoped_allocation __sa(_M_alloc, in_place, + std::forward<_Args>(__args)...); + return __sa.release(); + } + + // Enforces is_constructible check and then calls _M_make_obj. + template<typename... _Args> + [[__gnu__::__always_inline__]] + constexpr pointer + _M_make_obj_chk(_Args&&... __args) const + { + static_assert(is_constructible_v<_Tp, _Args...>); + return _M_make_obj(std::forward<_Args>(__args)...); + } + + // Always-const accessor that avoids ADL for operator*. + // This can be preferable to using *_M_objp because that might give _Tp&. + // This can be preferable to using **this because that does ADL. + [[__gnu__::__always_inline__]] + constexpr const _Tp& + __get() const noexcept + { return *_M_objp; } + + [[no_unique_address]] _Alloc _M_alloc = _Alloc(); + pointer _M_objp; // Pointer to the owned object. + }; + + template<typename _Value> + indirect(_Value) -> indirect<_Value>; + + template<typename _Alloc, typename _Value> + indirect(allocator_arg_t, _Alloc, _Value) + -> indirect<_Value, __alloc_rebind<_Alloc, _Value>>; + + // [indirect.hash], hash support + template<typename _Tp, typename _Alloc> + requires is_default_constructible_v<hash<_Tp>> + struct hash<indirect<_Tp, _Alloc>> + { + constexpr size_t + operator()(const indirect<_Tp, _Alloc>& __t) const + noexcept(noexcept(hash<_Tp>{}(*__t))) + { + // We pick an arbitrary hash for valueless indirect objects + // which hopefully usual values of _Tp won't typically hash to. + if (__t.valueless_after_move()) + return -4444zu; + return hash<_Tp>{}(*__t); + } + }; + + template<typename _Tp, typename _Alloc> + struct __is_fast_hash<hash<indirect<_Tp, _Alloc>>> + : __is_fast_hash<hash<_Tp>> + { }; +#endif // __glibcxx_indirect + + _GLIBCXX_END_NAMESPACE_VERSION +} // namespace +#endif // C++26 __glibcxx_indirect || __glibcxx_polymorphic + +#endif // _GLIBCXX_INDIRECT_H diff --git a/libstdc++-v3/include/bits/std_abs.h b/libstdc++-v3/include/bits/std_abs.h index 35ec4d3..3d805e6 100644 --- a/libstdc++-v3/include/bits/std_abs.h +++ b/libstdc++-v3/include/bits/std_abs.h @@ -103,6 +103,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION abs(__GLIBCXX_TYPE_INT_N_3 __x) { return __x >= 0 ? __x : -__x; } #endif +#if defined __STRICT_ANSI__ && defined __SIZEOF_INT128__ + // In strict modes __GLIBCXX_TYPE_INT_N_0 is not defined for __int128, + // but we want to always define std::abs(__int128). + __extension__ inline _GLIBCXX_CONSTEXPR __int128 + abs(__int128 __x) { return __x >= 0 ? __x : -__x; } +#endif + #if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) constexpr _Float16 abs(_Float16 __x) @@ -137,7 +144,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return __gnu_cxx::__bfloat16_t(__builtin_fabsf(__x)); } #endif -#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128) +#if defined(_GLIBCXX_USE_FLOAT128) __extension__ inline _GLIBCXX_CONSTEXPR __float128 abs(__float128 __x) diff --git a/libstdc++-v3/include/bits/utility.h b/libstdc++-v3/include/bits/utility.h index 6fa6b67..84d25e0 100644 --- a/libstdc++-v3/include/bits/utility.h +++ b/libstdc++-v3/include/bits/utility.h @@ -316,6 +316,23 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline constexpr sorted_equivalent_t sorted_equivalent{}; #endif +#if __glibcxx_function_ref // >= C++26 + template<auto> + struct nontype_t + { + explicit nontype_t() = default; + }; + + template<auto __val> + constexpr nontype_t<__val> nontype{}; + + template<typename> + inline constexpr bool __is_nontype_v = false; + + template<auto __val> + inline constexpr bool __is_nontype_v<nontype_t<__val>> = true; +#endif + _GLIBCXX_END_NAMESPACE_VERSION } // namespace diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def index 6ca148f..5a981ca 100644 --- a/libstdc++-v3/include/bits/version.def +++ b/libstdc++-v3/include/bits/version.def @@ -1757,6 +1757,14 @@ ftms = { }; ftms = { + name = function_ref; + values = { + v = 202306; + cxxmin = 26; + }; +}; + +ftms = { name = out_ptr; values = { v = 202311; @@ -1961,6 +1969,15 @@ ftms = { }; }; +ftms = { + name = indirect; + values = { + v = 202502; + cxxmin = 26; + hosted = yes; + }; +}; + // Standard test specifications. stds[97] = ">= 199711L"; stds[03] = ">= 199711L"; diff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h index 48a090c..0664611 100644 --- a/libstdc++-v3/include/bits/version.h +++ b/libstdc++-v3/include/bits/version.h @@ -1958,6 +1958,16 @@ #endif /* !defined(__cpp_lib_copyable_function) && defined(__glibcxx_want_copyable_function) */ #undef __glibcxx_want_copyable_function +#if !defined(__cpp_lib_function_ref) +# if (__cplusplus > 202302L) +# define __glibcxx_function_ref 202306L +# if defined(__glibcxx_want_all) || defined(__glibcxx_want_function_ref) +# define __cpp_lib_function_ref 202306L +# endif +# endif +#endif /* !defined(__cpp_lib_function_ref) && defined(__glibcxx_want_function_ref) */ +#undef __glibcxx_want_function_ref + #if !defined(__cpp_lib_out_ptr) # if (__cplusplus >= 202100L) # define __glibcxx_out_ptr 202311L @@ -2193,4 +2203,14 @@ #endif /* !defined(__cpp_lib_modules) && defined(__glibcxx_want_modules) */ #undef __glibcxx_want_modules +#if !defined(__cpp_lib_indirect) +# if (__cplusplus > 202302L) && _GLIBCXX_HOSTED +# define __glibcxx_indirect 202502L +# if defined(__glibcxx_want_all) || defined(__glibcxx_want_indirect) +# define __cpp_lib_indirect 202502L +# endif +# endif +#endif /* !defined(__cpp_lib_indirect) && defined(__glibcxx_want_indirect) */ +#undef __glibcxx_want_indirect + #undef __glibcxx_want_all diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional index 9a55b18..307bcb9 100644 --- a/libstdc++-v3/include/std/functional +++ b/libstdc++-v3/include/std/functional @@ -57,6 +57,7 @@ #define __glibcxx_want_bind_back #define __glibcxx_want_constexpr_functional #define __glibcxx_want_copyable_function +#define __glibcxx_want_function_ref #define __glibcxx_want_invoke #define __glibcxx_want_invoke_r #define __glibcxx_want_move_only_function @@ -86,7 +87,7 @@ # include <bits/ranges_cmp.h> // std::identity, ranges::equal_to etc. # include <compare> #endif -#if defined(__glibcxx_move_only_function) || defined(__glibcxx_copyable_function) +#if __glibcxx_move_only_function || __glibcxx_copyable_function || __glibcxx_function_ref # include <bits/funcwrap.h> #endif diff --git a/libstdc++-v3/include/std/mdspan b/libstdc++-v3/include/std/mdspan index 47cfa40..bcf2fa6 100644 --- a/libstdc++-v3/include/std/mdspan +++ b/libstdc++-v3/include/std/mdspan @@ -146,7 +146,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION private: using _S_storage = __array_traits<_IndexType, _S_rank_dynamic>::_Type; - [[no_unique_address]] _S_storage _M_dynamic_extents; + [[no_unique_address]] _S_storage _M_dynamic_extents{}; }; template<typename _OIndexType, typename _SIndexType> diff --git a/libstdc++-v3/include/std/memory b/libstdc++-v3/include/std/memory index 78a1250..d64e65c 100644 --- a/libstdc++-v3/include/std/memory +++ b/libstdc++-v3/include/std/memory @@ -97,6 +97,10 @@ # include <bits/out_ptr.h> #endif +#if __cplusplus > 202302L +# include <bits/indirect.h> +#endif + #define __glibcxx_want_addressof_constexpr #define __glibcxx_want_allocator_traits_is_always_equal #define __glibcxx_want_assume_aligned @@ -105,6 +109,7 @@ #define __glibcxx_want_constexpr_dynamic_alloc #define __glibcxx_want_constexpr_memory #define __glibcxx_want_enable_shared_from_this +#define __glibcxx_want_indirect #define __glibcxx_want_make_unique #define __glibcxx_want_out_ptr #define __glibcxx_want_parallel_algorithm diff --git a/libstdc++-v3/src/c++23/std.cc.in b/libstdc++-v3/src/c++23/std.cc.in index 417c8a1..ba46853 100644 --- a/libstdc++-v3/src/c++23/std.cc.in +++ b/libstdc++-v3/src/c++23/std.cc.in @@ -1415,6 +1415,9 @@ export namespace std #if __cpp_lib_copyable_function using std::copyable_function; #endif +#if __cpp_lib_function_ref + using std::function_ref; +#endif using std::multiplies; using std::negate; using std::not_equal_to; @@ -3195,6 +3198,10 @@ export namespace std using std::make_integer_sequence; using std::move; using std::move_if_noexcept; +#if __cpp_lib_function_ref + using std::nontype_t; + using std::nontype; +#endif using std::pair; using std::swap; using std::operator==; diff --git a/libstdc++-v3/testsuite/17_intro/names.cc b/libstdc++-v3/testsuite/17_intro/names.cc index 0e67c79..a61e49d 100644 --- a/libstdc++-v3/testsuite/17_intro/names.cc +++ b/libstdc++-v3/testsuite/17_intro/names.cc @@ -248,6 +248,8 @@ #undef r #undef x #undef y +// <sys/localedef.h> defines _LC_weight_t::n +#undef n // <sys/poll.h> defines pollfd_ext::u on AIX 7.3 #undef u // <sys/var.h> defines vario::v diff --git a/libstdc++-v3/testsuite/20_util/function_ref/assign.cc b/libstdc++-v3/testsuite/20_util/function_ref/assign.cc new file mode 100644 index 0000000..9b02dc4 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/function_ref/assign.cc @@ -0,0 +1,108 @@ +// { dg-do compile { target c++26 } } + +#include <functional> + +#ifndef __cpp_lib_function_ref +# error "Feature-test macro for function_ref missing in <functional>" +#elif __cpp_lib_function_ref != 202306L +# error "Feature-test macro for function_ref has wrong value in <functional>" +#endif + +using std::nontype; +using std::nontype_t; +using std::function_ref; + +using std::is_nothrow_move_assignable_v; +using std::is_nothrow_copy_assignable_v; +using std::is_nothrow_assignable_v; +using std::is_assignable_v; +using std::is_nothrow_swappable_v; +using std::is_trivially_copyable_v; + +static_assert( is_nothrow_move_assignable_v<function_ref<void()>> ); +static_assert( is_nothrow_copy_assignable_v<function_ref<void()>> ); +static_assert( is_nothrow_swappable_v<function_ref<void()>> ); + +static_assert( ! is_assignable_v<function_ref<void()>, std::nullptr_t> ); + +static_assert( is_nothrow_assignable_v<function_ref<void()>, void()> ); +static_assert( is_nothrow_assignable_v<function_ref<void()>, void(&)()> ); +static_assert( is_nothrow_assignable_v<function_ref<void()>, void(*)()> ); +static_assert( is_nothrow_assignable_v<function_ref<void()>, int()> ); +static_assert( is_nothrow_assignable_v<function_ref<void()>, int(&)()> ); +static_assert( is_nothrow_assignable_v<function_ref<void()>, int(*)()> ); +static_assert( ! is_nothrow_assignable_v<function_ref<void()>, void(int)> ); +static_assert( is_nothrow_assignable_v<function_ref<void(int)>, void(int)> ); + +static_assert( is_nothrow_assignable_v<function_ref<void()>, + void() noexcept> ); +static_assert( is_nothrow_assignable_v<function_ref<void() noexcept>, + void() noexcept> ); +static_assert( ! is_assignable_v<function_ref<void() noexcept>, void() > ); + +struct S +{ + int x; + int f(); +}; +int funS(S); + +static_assert( is_nothrow_assignable_v<function_ref<int(S)>, + decltype(funS)> ); +static_assert( is_nothrow_assignable_v<function_ref<int(S)>, + decltype(&funS)> ); +static_assert( ! is_assignable_v<function_ref<int(S)>, decltype(&S::x)> ); +static_assert( ! is_assignable_v<function_ref<int(S)>, decltype(&S::f)> ); + +static_assert( is_nothrow_assignable_v<function_ref<int(S)>, + nontype_t<funS>> ); +static_assert( is_nothrow_assignable_v<function_ref<int(S)>, + nontype_t<&funS>> ); +static_assert( is_nothrow_assignable_v<function_ref<int(S)>, + nontype_t<&S::x>> ); +static_assert( is_nothrow_assignable_v<function_ref<int(S)>, + nontype_t<&S::f>> ); +struct Q +{ + void operator()() const; +}; + +static_assert( ! is_assignable_v<function_ref<void()>, Q> ); +static_assert( ! is_assignable_v<function_ref<void()>, Q&> ); +static_assert( ! is_assignable_v<function_ref<void()>, const Q&> ); +static_assert( ! is_assignable_v<function_ref<void() const>, Q> ); +static_assert( ! is_assignable_v<function_ref<void() const>, Q&> ); +static_assert( ! is_assignable_v<function_ref<void() const>, const Q&> ); + +static_assert( is_nothrow_assignable_v<function_ref<void()>, + nontype_t<Q{}>> ); +static_assert( is_nothrow_assignable_v<function_ref<void() const>, + nontype_t<Q{}>> ); + +constexpr bool +test_constexpr() +{ + function_ref<void(S)> fp(nontype<funS>); + fp = nontype<funS>; + fp = nontype<&funS>; + fp = nontype<&S::x>; + fp = nontype<&S::f>; + + constexpr Q cq; + function_ref<void() const> fq(cq); + fq = nontype<cq>; + return true; +} +static_assert( test_constexpr() ); + +void func(); + +void +test_instantiation() +{ + function_ref<void(S)> fp(funS); + fp = funS; + fp = &funS; + + test_constexpr(); +} diff --git a/libstdc++-v3/testsuite/20_util/function_ref/call.cc b/libstdc++-v3/testsuite/20_util/function_ref/call.cc new file mode 100644 index 0000000..a91c6b4 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/function_ref/call.cc @@ -0,0 +1,186 @@ +// { dg-do run { target c++26 } } + +#include <functional> +#include <utility> +#include <testsuite_hooks.h> + +using std::nontype; +using std::function_ref; + +using std::is_same_v; +using std::is_invocable_v; +using std::is_nothrow_invocable_v; +using std::invoke_result_t; + +// Check return types +static_assert( is_same_v<void, invoke_result_t<function_ref<void()>>> ); +static_assert( is_same_v<int, invoke_result_t<function_ref<int()>>> ); +static_assert( is_same_v<int&, invoke_result_t<function_ref<int&()>>> ); + +// Const qualier applies to target object +static_assert( is_invocable_v< function_ref<void()> const > ); +static_assert( is_invocable_v< function_ref<void()> const &> ); +static_assert( is_invocable_v< function_ref<void() const> > ); +static_assert( is_invocable_v< function_ref<void() const> &> ); +static_assert( is_invocable_v< function_ref<void() const> const > ); +static_assert( is_invocable_v< function_ref<void() const> const &> ); + +// With noexcept-specifier +static_assert( ! is_nothrow_invocable_v< function_ref<void()> > ); +static_assert( ! is_nothrow_invocable_v< function_ref<void() noexcept(false)> > ); +static_assert( is_nothrow_invocable_v< function_ref<void() noexcept> > ); + +void +test01() +{ + struct F + { + int operator()() { return 0; } + int operator()() const { return 1; } + }; + + function_ref<int()> f0{F{}}; + VERIFY( f0() == 0 ); + VERIFY( std::move(f0)() == 0 ); + + function_ref<int()> f1{nontype<F{}>}; + VERIFY( f1() == 1 ); + VERIFY( std::move(f1)() == 1 ); + + function_ref<int() const> f2{F{}}; + VERIFY( f2() == 1 ); + VERIFY( std::as_const(f2)() == 1 ); + VERIFY( std::move(f2)() == 1 ); + VERIFY( std::move(std::as_const(f2))() == 1 ); + + function_ref<int() const> f3{nontype<F{}>}; + VERIFY( f3() == 1 ); + VERIFY( std::as_const(f3)() == 1 ); + VERIFY( std::move(f3)() == 1 ); + VERIFY( std::move(std::as_const(f3))() == 1 ); +} + +void +test02() +{ + struct F + { + struct Arg {}; + int operator()(Arg& arg) const { return 0; } + int operator()(const Arg& arg) const { return 1; } + }; + F::Arg arg; + + function_ref<int()> f0{std::nontype<F{}>, arg}; + VERIFY( f0() == 0 ); + VERIFY( std::move(f0)() == 0 ); + + function_ref<int() const> f1{std::nontype<F{}>, arg}; + VERIFY( f1() == 1 ); + VERIFY( std::as_const(f1)() == 1 ); +} + +void +test03() +{ + struct F + { + struct Arg {}; + int operator()(Arg* arg) const { return 0; } + int operator()(const Arg* arg) const { return 1; } + }; + F::Arg arg; + + function_ref<int()> f0{std::nontype<F{}>, &arg}; + VERIFY( f0() == 0 ); + VERIFY( std::move(f0)() == 0 ); + + function_ref<int() const> f1{std::nontype<F{}>, &arg}; + VERIFY( f1() == 1 ); + VERIFY( std::as_const(f1)() == 1 ); +} + +void +test04() +{ + constexpr int (*fp)() = [] { return 0; }; + function_ref<int()> f0{fp}; + VERIFY( f0() == 0 ); + VERIFY( std::move(f0)() == 0 ); + + function_ref<int()> f1{nontype<fp>}; + VERIFY( f1() == 0 ); + VERIFY( std::move(f1)() == 0 ); + + const function_ref<int() const> f2{fp}; + VERIFY( f2() == 0 ); + VERIFY( std::move(f2)() == 0 ); + + const function_ref<int() const> f3{nontype<fp>}; + VERIFY( f2() == 0 ); + VERIFY( std::move(f2)() == 0 ); +} + +using ftype = int(int); +int twice(int x) { return x * 2; } +int cube(int x) { return x * x * x; } +int callback_ptr(ftype* f, int x) { return f(x); } +int callback_ref(ftype& f, int x) { return f(x); } + +void +test05() +{ + + function_ref<int(int)> r1(nontype<&callback_ptr>, &twice); + VERIFY( r1(2) == 4 ); + function_ref<int(int)> r2(nontype<&callback_ptr>, cube); + VERIFY( r2(2) == 8 ); + + function_ref<int(int)> r3(nontype<&callback_ref>, twice); + VERIFY( r3(3) == 6 ); + function_ref<int(int)> r4(nontype<&callback_ref>, cube); + VERIFY( r4(3) == 27 ); + + // Checks if distinction between reference and pointer + // is preserved. + struct F + { + static + int operator()(ftype* f, int x) + { return f(x) + 1000; } + + static + int operator()(ftype& f, int x) + { return f(x) + 2000; } + }; + function_ref<int(int)> r5(nontype<F{}>, &twice); + VERIFY( r5(2) == 1004 ); + function_ref<int(int)> r6(nontype<F{}>, twice); + VERIFY( r6(2) == 2008 ); + function_ref<int(int)> r7(nontype<F{}>, &cube); + VERIFY( r7(3) == 1006 ); + function_ref<int(int)> r8(nontype<F{}>, cube); + VERIFY( r8(3) == 2027 ); +} + +struct Incomplete; + +void +test_params() +{ + auto f = [](auto&&) {}; + // There is discussion if this is supported. + // std::function_ref<void(Incomplete)> f1(f); + std::function_ref<void(Incomplete&)> f2(f); + // See PR120259, this should be supported. + // std::function_ref<void(Incomplete&&)> f3(f); +} + +int main() +{ + test01(); + test02(); + test03(); + test04(); + test_params(); +} diff --git a/libstdc++-v3/testsuite/20_util/function_ref/cons.cc b/libstdc++-v3/testsuite/20_util/function_ref/cons.cc new file mode 100644 index 0000000..a91f5ba --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/function_ref/cons.cc @@ -0,0 +1,218 @@ +// { dg-do compile { target c++26 } } +// { dg-add-options no_pch } + +#include <functional> + +#ifndef __cpp_lib_function_ref +# error "Feature-test macro for function_ref missing in <functional>" +#elif __cpp_lib_function_ref != 202306L +# error "Feature-test macro for function_ref has wrong value in <functional>" +#endif + +using std::nontype; +using std::nontype_t; +using std::function_ref; + +using std::is_default_constructible_v; +using std::is_nothrow_copy_constructible_v; +using std::is_nothrow_move_constructible_v; +using std::is_nothrow_constructible_v; +using std::is_constructible_v; +using std::is_trivially_copyable_v; + +static_assert( ! is_default_constructible_v<function_ref<void()>> ); +static_assert( is_nothrow_move_constructible_v<function_ref<void()>> ); +static_assert( is_nothrow_copy_constructible_v<function_ref<void()>> ); +static_assert( is_trivially_copyable_v<function_ref<void()>> ); + +static_assert( ! is_constructible_v<function_ref<void()>, std::nullptr_t> ); + +static_assert( is_nothrow_constructible_v<function_ref<void()>, void()> ); +static_assert( is_nothrow_constructible_v<function_ref<void()>, void(&)()> ); +static_assert( is_nothrow_constructible_v<function_ref<void()>, void(*)()> ); +static_assert( is_nothrow_constructible_v<function_ref<void()>, int()> ); +static_assert( is_nothrow_constructible_v<function_ref<void()>, int(&)()> ); +static_assert( is_nothrow_constructible_v<function_ref<void()>, int(*)()> ); +static_assert( ! is_constructible_v<function_ref<void()>, void(int)> ); +static_assert( is_nothrow_constructible_v<function_ref<void(int)>, void(int)> ); + +static_assert( is_nothrow_constructible_v<function_ref<void()>, + void() noexcept> ); +static_assert( is_nothrow_constructible_v<function_ref<void() noexcept>, + void() noexcept> ); +static_assert( ! is_constructible_v<function_ref<void() noexcept>, + void() > ); + +struct S +{ + int x; + int f(); +}; +int funS(S); + +static_assert( is_nothrow_constructible_v<function_ref<int(S)>, + decltype(funS)> ); +static_assert( is_nothrow_constructible_v<function_ref<int(S)>, + decltype(&funS)> ); +static_assert( ! is_constructible_v<function_ref<int(S)>, + decltype(&S::x)> ); +static_assert( ! is_constructible_v<function_ref<int(S)>, + decltype(&S::f)> ); + +static_assert( is_nothrow_constructible_v<function_ref<int(S)>, + nontype_t<funS>> ); +static_assert( is_nothrow_constructible_v<function_ref<int(S)>, + nontype_t<&funS>> ); +static_assert( is_nothrow_constructible_v<function_ref<int(S)>, + nontype_t<&S::x>> ); +static_assert( is_nothrow_constructible_v<function_ref<int(S)>, + nontype_t<&S::f>> ); + +static_assert( is_nothrow_constructible_v<function_ref<int()>, + nontype_t<funS>, S&> ); +static_assert( is_nothrow_constructible_v<function_ref<int()>, + nontype_t<&funS>, S&> ); +static_assert( is_nothrow_constructible_v<function_ref<int()>, + nontype_t<&S::x>, S&> ); +static_assert( is_nothrow_constructible_v<function_ref<int()>, + nontype_t<&S::f>, S&> ); + +static_assert( ! is_constructible_v<function_ref<int()>, + nontype_t<funS>, S*> ); +static_assert( ! is_constructible_v<function_ref<int()>, + nontype_t<&funS>, S*> ); +static_assert( is_nothrow_constructible_v<function_ref<int()>, + nontype_t<&S::x>, S*> ); +static_assert( is_nothrow_constructible_v<function_ref<int()>, + nontype_t<&S::f>, S*> ); + +struct M +{ + void operator()(); +}; + + +static_assert( is_nothrow_constructible_v<function_ref<void()>, M> ); +static_assert( is_nothrow_constructible_v<function_ref<void()>, M&> ); +static_assert( ! is_constructible_v<function_ref<void()>, const M&> ); +static_assert( ! is_constructible_v<function_ref<void() const>, M> ); +static_assert( ! is_constructible_v<function_ref<void() const>, const M&> ); +static_assert( ! is_constructible_v<function_ref<void()>, + nontype_t<M{}>> ); +static_assert( ! is_constructible_v<function_ref<void() const>, + nontype_t<M{}>> ); +struct Q +{ + void operator()(int) const; + void operator()(int*) const; +}; + +static_assert( is_nothrow_constructible_v<function_ref<void(int)>, Q> ); +static_assert( is_nothrow_constructible_v<function_ref<void(int)>, Q&> ); +static_assert( is_nothrow_constructible_v<function_ref<void(int)>, const Q&> ); +static_assert( is_nothrow_constructible_v<function_ref<void(int) const>, Q> ); +static_assert( is_nothrow_constructible_v<function_ref<void(int) const>, Q&> ); +static_assert( is_nothrow_constructible_v<function_ref<void(int) const>, const Q&> ); + +static_assert( is_nothrow_constructible_v<function_ref<void(int)>, + nontype_t<Q{}>> ); +static_assert( is_nothrow_constructible_v<function_ref<void(int) const>, + nontype_t<Q{}>> ); +static_assert( is_nothrow_constructible_v<function_ref<void()>, + nontype_t<Q{}>, int&> ); +static_assert( is_nothrow_constructible_v<function_ref<void() const>, + nontype_t<Q{}>, int&> ); +static_assert( ! is_constructible_v<function_ref<void()>, + nontype_t<Q{}>, int> ); +static_assert( ! is_constructible_v<function_ref<void() const>, + nontype_t<Q{}>, int> ); + +static_assert( is_nothrow_constructible_v<function_ref<void()>, + nontype_t<Q{}>, int*> ); +static_assert( ! is_constructible_v<function_ref<void() const>, + nontype_t<Q{}>, int*> ); + +struct L +{ + void operator()() &; +}; + +static_assert( is_nothrow_constructible_v<function_ref<void()>, L> ); +static_assert( is_nothrow_constructible_v<function_ref<void()>, L&> ); +static_assert( ! is_constructible_v<function_ref<void()>, const L&> ); +static_assert( ! is_constructible_v<function_ref<void() const>, L> ); +static_assert( ! is_constructible_v<function_ref<void() const>, const L&> ); +static_assert( ! is_constructible_v<function_ref<void()>, + nontype_t<L{}>> ); +static_assert( ! is_constructible_v<function_ref<void() const>, + nontype_t<L{}>> ); + +struct R +{ + void operator()(float) const&&; +}; + +static_assert( ! is_constructible_v<function_ref<void(float)>, R> ); +static_assert( ! is_constructible_v<function_ref<void(float)>, R&> ); +static_assert( ! is_constructible_v<function_ref<void(float) const>, R> ); +static_assert( ! is_constructible_v<function_ref<void(float) const>, R&> ); +static_assert( ! is_constructible_v<function_ref<void(float) const>, const R&> ); + +static_assert( ! is_constructible_v<function_ref<void(float)>, + nontype_t<R{}>> ); +static_assert( ! is_constructible_v<function_ref<void(float) const>, + nontype_t<R{}>> ); + +constexpr bool +test_constexpr() +{ + function_ref<void(S)> fp1(nontype<funS>); + function_ref<void(S)> fp3(nontype<&funS>); + function_ref<void(S)> fp4(nontype<&S::x>); + function_ref<void(S)> fp5(nontype<&S::f>); + + S s; + function_ref<void()> fp6(nontype<&funS>, s); + function_ref<void()> fp7(nontype<&S::x>, s); + function_ref<void()> fp8(nontype<&S::x>, &s); + function_ref<void()> fp9(nontype<&S::f>, s); + function_ref<void()> fp10(nontype<&S::f>, &s); + + M m; + function_ref<void()> fm1(m); + function_ref<void()> fm2(std::move(m)); + + Q q; + constexpr Q cq; + function_ref<void(int)> fq1(q); + function_ref<void(int) const> fq2(q); + function_ref<void(int) const> fq3(std::move(q)); + + function_ref<void(int)> fcq1(cq); + function_ref<void(int) const> f(cq); + function_ref<void(int)> fcq3(nontype<cq>); + function_ref<void(int) const> fcq4(nontype<cq>); + + int i = 0; + function_ref<void()> fcq5(nontype<cq>, i); + function_ref<void() const> fcq6(nontype<cq>, i); + function_ref<void()> fcq7(nontype<cq>, &i); + + L l; + function_ref<void()> fl1(l); + function_ref<void()> fl2(std::move(l)); + + return true; +} +static_assert( test_constexpr() ); + +void func(); + +void +test_instantiation() +{ + function_ref<void(S)> fp1(funS); + function_ref<void(S)> fp2(&funS); + + test_constexpr(); +} diff --git a/libstdc++-v3/testsuite/20_util/function_ref/cons_neg.cc b/libstdc++-v3/testsuite/20_util/function_ref/cons_neg.cc new file mode 100644 index 0000000..050090d --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/function_ref/cons_neg.cc @@ -0,0 +1,30 @@ +// { dg-do compile { target c++26 } } + +#include <functional> + +using std::nontype; +using std::function_ref; + +struct S +{ + int x; + void foo(); +}; +S s; + +constexpr int(*fp)(S) = nullptr; +constexpr int S::*mdp = nullptr; +constexpr int (S::*mfp)() = nullptr; + +function_ref<int(S)> fd1(nontype<fp>); // { dg-error "from here" } +function_ref<int(S)> fd2(nontype<mdp>); // { dg-error "from here" } +function_ref<int(S)> fd3(nontype<mfp>); // { dg-error "from here" } + +function_ref<int()> br4(nontype<fp>, s); // { dg-error "from here" } +function_ref<int()> br5(nontype<mdp>, s); // { dg-error "from here" } +function_ref<int()> br6(nontype<mfp>, s); // { dg-error "from here" } + +function_ref<int()> bp7(nontype<mdp>, &s); // { dg-error "from here" } +function_ref<int()> bp8(nontype<mfp>, &s); // { dg-error "from here" } + +// { dg-prune-output "static assertion failed" } diff --git a/libstdc++-v3/testsuite/20_util/function_ref/conv.cc b/libstdc++-v3/testsuite/20_util/function_ref/conv.cc new file mode 100644 index 0000000..7dc7b8c --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/function_ref/conv.cc @@ -0,0 +1,259 @@ +// { dg-do run { target c++26 } } +// { dg-require-effective-target hosted } + +#include <functional> +#include <testsuite_hooks.h> + +using std::function_ref; + +static_assert( std::is_constructible_v<std::function_ref<void() const>, + std::function_ref<void()>> ); + +// Non-trivial args, guarantess that type is not passed by copy +struct CountedArg +{ + CountedArg() = default; + CountedArg(const CountedArg& f) noexcept : counter(f.counter) { ++counter; } + CountedArg& operator=(CountedArg&&) = delete; + + int counter = 0; +}; +CountedArg const c; + +// The C++26 [func.wrap.general] p2 does not currently cover funciton_ref, +// so we make extra copies of arguments. + +void +test01() +{ + auto f = [](CountedArg const& arg) noexcept { return arg.counter; }; + std::function_ref<int(CountedArg) const noexcept> r1(f); + std::move_only_function<int(CountedArg) const noexcept> m1(f); + std::copyable_function<int(CountedArg) const noexcept> c1(f); + + // Complatible signatures + std::function_ref<int(CountedArg) const noexcept> r2m(m1); + VERIFY( r2m(c) == 2 ); + std::function_ref<int(CountedArg) const noexcept> r2c(c1); + VERIFY( r2c(c) == 2 ); + + std::function_ref<int(CountedArg) const> r3r(r1); + VERIFY( r3r(c) == 2 ); + std::function_ref<int(CountedArg) const> r3m(m1); + VERIFY( r3m(c) == 2 ); + std::function_ref<int(CountedArg) const> r3c(c1); + VERIFY( r3c(c) == 2 ); + + std::function_ref<int(CountedArg)> r4r(r1); + VERIFY( r4r(c) == 2 ); + std::function_ref<int(CountedArg)> r4m(m1); + VERIFY( r4m(c) == 2 ); + std::function_ref<int(CountedArg)> r4c(c1); + VERIFY( r4c(c) == 2 ); + + // Incompatible signatures + std::function_ref<long(CountedArg) const noexcept> r5r(r1); + VERIFY( r5r(c) == 2 ); + std::function_ref<long(CountedArg) const noexcept> r5m(m1); + VERIFY( r5r(c) == 2 ); + std::function_ref<long(CountedArg) const noexcept> r5c(c1); + VERIFY( r5r(c) == 2 ); +} + +void +test02() +{ + // Constructing move_only_function and copyable_function from function_ref, + // have not chance to restore manager, so we store function_ref inside. + auto f = [](CountedArg const& arg) noexcept { return arg.counter; }; + std::function_ref<int(CountedArg) const noexcept> r1(f); + + std::move_only_function<int(CountedArg) const noexcept> m1(r1); + VERIFY( m1(c) == 2 ); + + std::copyable_function<int(CountedArg) const noexcept> c1(r1); + VERIFY( c1(c) == 2 ); +} + +void +test03() +{ + struct F + { + int operator()(CountedArg const& arg) noexcept + { return arg.counter; } + + int operator()(CountedArg const& arg) const noexcept + { return arg.counter + 1000; } + }; + + F f; + std::function_ref<int(CountedArg) const> r1(f); + VERIFY( r1(c) == 1001 ); + + // Call const overload as std::function_ref<int(CountedArg) const> + // inside std::function_ref<int(CountedArg)> would do. + std::function_ref<int(CountedArg)> r2(r1); + VERIFY( r2(c) == 1002 ); + std::move_only_function<int(CountedArg)> m2(r1); + VERIFY( m2(c) == 1002 ); + + // Call non-const overload as const-qualifed operator() for + // std::function_ref<int(CountedArg)> do. + std::function_ref<int(CountedArg)> r3(f); + VERIFY( r3(c) == 1 ); + std::function_ref<int(CountedArg) const> r4(r3); + VERIFY( r4(c) == 2 ); + std::move_only_function<int(CountedArg) const> m4(r3); + VERIFY( m4(c) == 2 ); +} + +void +test04() +{ + auto f = [](CountedArg const& arg) noexcept { return arg.counter; }; + std::function_ref<int(CountedArg)> w1(f); + // function_ref stores function_ref due incompatibile signatures + std::function_ref<int(CountedArg const&)> w2(std::move(w1)); + // copy is made when passing to int(CountedArg) + VERIFY( w2(c) == 1 ); + // wrapped 3 times + std::function_ref<int(CountedArg)> w3(w2); + VERIFY( w3(c) == 2 ); + // wrapped 4 times + std::function_ref<int(CountedArg const&)> w4(w3); + VERIFY( w4(c) == 2 ); + // wrapped 5 times + std::function_ref<int(CountedArg)> w5(w4); + VERIFY( w5(c) == 3 ); +} + +void +test05() +{ + // No special interoperability with std::function + auto f = [](CountedArg const& arg) noexcept { return arg.counter; }; + std::function<int(CountedArg)> f1(f); + std::function_ref<int(CountedArg) const> c1(std::move(f1)); + VERIFY( c1(c) == 2 ); + + std::function_ref<int(CountedArg) const> c2(f); + std::function<int(CountedArg)> f2(c2); + VERIFY( f2(c) == 2 ); +} + +void +test06() +{ + auto* func = +[]{ static int x; return &x; }; + std::move_only_function<const void*() const> m1(func); + std::function_ref<const void*() const> rm1(m1); + VERIFY( m1() == rm1() ); + std::copyable_function<const void*() const> c1(func); + std::function_ref<const void*() const> rc1(c1); + VERIFY( c1() == rc1() ); + + struct Trivial + { + void const* operator()() const + { return this; } + }; + std::move_only_function<const void*() const> m2(Trivial{}); + std::function_ref<const void*() const> rm2(m2); + VERIFY( m2() == rm2() ); + std::copyable_function<const void*() const> c2(Trivial{}); + std::function_ref<const void*() const> rc2(c2); + VERIFY( c2() == rc2() ); + + struct NonTrivial : Trivial + { + NonTrivial() {} + NonTrivial(NonTrivial&&) noexcept {} + NonTrivial(const NonTrivial&) {} + }; + std::move_only_function<const void*() const> m3(NonTrivial{}); + std::function_ref<const void*() const> rm3(m3); + VERIFY( m3() == rm3() ); + std::copyable_function<const void*() const> c3(NonTrivial{}); + std::function_ref<const void*() const> rc3(c3); + VERIFY( c3() == rc3() ); + + struct Large : Trivial + { + int tab[10]; + }; + std::move_only_function<const void*() const> m4(Large{}); + std::function_ref<const void*() const> rm4(m4); + VERIFY( m4() == rm4() ); + std::copyable_function<const void*() const> c4(Large{}); + std::function_ref<const void*() const> rc4(c4); + VERIFY( c4() == rc4() ); +} + +void +test07() +{ + int (*f1)() = [] { return 1; }; + int (*f2)() = [] { return 2; }; + + std::function_ref<int() const> r1(f1); + std::move_only_function<int() const> m1(f1); + std::copyable_function<int() const> c1(f1); + + std::function_ref<int() const> r2r(r1); + VERIFY( r2r() == 1 ); + r1 = f2; + VERIFY( r2r() == 1 ); // same-siganture, copy constructor is used + + std::function_ref<int() const> r2m(m1); + VERIFY( r2m() == 1 ); + m1 = f2; + VERIFY( r2m() == 2 ); + + std::function_ref<int() const> r2c(c1); + VERIFY( r2c() == 1 ); + c1 = f2; + VERIFY( r2c() == 2 ); + + std::function_ref<int()> r3r(r1); + VERIFY( r3r() == 2 ); + r1 = f1; + VERIFY( r3r() == 1 ); // converting-constructor + + std::function_ref<int()> r3m(m1); + VERIFY( r3m() == 2 ); + m1 = f1; + VERIFY( r3m() == 1 ); + + std::function_ref<int()> r3c(c1); + VERIFY( r3c() == 2 ); + c1 = f1; + VERIFY( r3c() == 1 ); + +} + +constexpr bool +test08() +{ + auto f = [](int x) noexcept { return x; }; + std::function_ref<int(int) const noexcept> rf(f); + + std::function_ref<int(int) const noexcept> rr1(rf); + std::function_ref<int(int)> rr2(rf); + std::function_ref<int(long)> rr3(rf); + return true; +}; + + +int main() +{ + test01(); + test02(); + test03(); + test04(); + test05(); + test06(); + test07(); + + static_assert( test08() ); +} diff --git a/libstdc++-v3/testsuite/20_util/function_ref/deduction.cc b/libstdc++-v3/testsuite/20_util/function_ref/deduction.cc new file mode 100644 index 0000000..2940b87 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/function_ref/deduction.cc @@ -0,0 +1,103 @@ +// { dg-do compile { target c++26 } } + +#include <functional> +#include <type_traits> + +using std::is_same_v; +using std::nontype; +using std::nontype_t; +using std::function_ref; + +int i = 0; + +void f0(); +void f0n() noexcept; + +static_assert( is_same_v<decltype(function_ref(f0)), + function_ref<void()>> ); +static_assert( is_same_v<decltype(function_ref(f0n)), + function_ref<void() noexcept>> ); +static_assert( is_same_v<decltype(function_ref(nontype<f0>)), + function_ref<void()>> ); +static_assert( is_same_v<decltype(function_ref(nontype<f0n>)), + function_ref<void() noexcept>> ); + +void f1(int); +void f1n(int) noexcept; + +static_assert( is_same_v<decltype(function_ref(f1)), + function_ref<void(int)>> ); +static_assert( is_same_v<decltype(function_ref(f1n)), + function_ref<void(int) noexcept>> ); +static_assert( is_same_v<decltype(function_ref(nontype<f1>)), + function_ref<void(int)>> ); +static_assert( is_same_v<decltype(function_ref(nontype<f1n>)), + function_ref<void(int) noexcept>> ); +static_assert( is_same_v<decltype(function_ref(nontype<f1>, i)), + function_ref<void()>> ); +static_assert( is_same_v<decltype(function_ref(nontype<f1n>, i)), + function_ref<void() noexcept>> ); + +void f2(int*, int); +void f2n(int*, int) noexcept; + +static_assert( is_same_v<decltype(function_ref(f2)), + function_ref<void(int*, int)>> ); +static_assert( is_same_v<decltype(function_ref(f2n)), + function_ref<void(int*, int) noexcept>> ); +static_assert( is_same_v<decltype(function_ref(nontype<f2>)), + function_ref<void(int*, int)>> ); +static_assert( is_same_v<decltype(function_ref(nontype<f2n>)), + function_ref<void(int*, int) noexcept>> ); +static_assert( is_same_v<decltype(function_ref(nontype<f2>, &i)), + function_ref<void(int)>> ); +static_assert( is_same_v<decltype(function_ref(nontype<f2n>, &i)), + function_ref<void(int) noexcept>> ); + +struct S +{ + int mem; + int f(); + int fn() noexcept; + + int fc(int) const; + int fcn(int) const noexcept; + + int fl(int) &; + int fln(int) & noexcept; + + int fcl(float) const&; + int fcln(float) const& noexcept; +}; +S s{}; +const S cs{}; + +static_assert( is_same_v<decltype(function_ref(nontype<&S::mem>, s)), + function_ref<int&()>> ); +static_assert( is_same_v<decltype(function_ref(nontype<&S::mem>, cs)), + function_ref<const int&()>> ); +static_assert( is_same_v<decltype(function_ref(nontype<&S::mem>, &s)), + function_ref<int&()>> ); +static_assert( is_same_v<decltype(function_ref(nontype<&S::mem>, &cs)), + function_ref<const int&()>> ); + +static_assert( is_same_v<decltype(function_ref(nontype<&S::f>, s)), + function_ref<int()>> ); +static_assert( is_same_v<decltype(function_ref(nontype<&S::fn>, &s)), + function_ref<int() noexcept>> ); + +static_assert( is_same_v<decltype(function_ref(nontype<&S::fc>, &s)), + function_ref<int(int)>> ); +static_assert( is_same_v<decltype(function_ref(nontype<&S::fcn>, s)), + function_ref<int(int) noexcept>> ); + +static_assert( is_same_v<decltype(function_ref(nontype<&S::fl>, &s)), + function_ref<int(int)>> ); +static_assert( is_same_v<decltype(function_ref(nontype<&S::fln>, s)), + function_ref<int(int) noexcept>> ); + +static_assert( is_same_v<decltype(function_ref(nontype<&S::fcl>, s)), + function_ref<int(float)>> ); +static_assert( is_same_v<decltype(function_ref(nontype<&S::fcln>, &s)), + function_ref<int(float) noexcept>> ); + diff --git a/libstdc++-v3/testsuite/20_util/function_ref/mutation.cc b/libstdc++-v3/testsuite/20_util/function_ref/mutation.cc new file mode 100644 index 0000000..32c6931 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/function_ref/mutation.cc @@ -0,0 +1,85 @@ +// { dg-do run { target c++26 } } + +#include <functional> +#include <testsuite_hooks.h> + +using std::nontype; +using std::function_ref; + +void +test01() +{ + struct F { + int v; + int operator()() { return v; } + }; + F f1{2}, f2{5}; + + function_ref<int()> r1(f1); + function_ref<long()> r2(f1); + + VERIFY( r1() == 2 ); + VERIFY( r2() == 2 ); + + f1.v = 10; + + VERIFY( r1() == 10 ); + VERIFY( r2() == 10 ); + + r1 = function_ref<int()>(f2); + r2 = function_ref<long()>(f2); + + VERIFY( r1() == 5 ); + VERIFY( r2() == 5 ); + + f2.v = 13; + + VERIFY( r1() == 13 ); + VERIFY( r2() == 13 ); + + r1 = function_ref<int()>(f1); + r2 = function_ref<long()>(f1); + + f1.v = 20; + VERIFY( r1() == 20 ); + VERIFY( r2() == 20 ); +} + +void +test02() +{ + struct S + { + int x; + int f() { return x; }; + }; + S s{10}; + + function_ref<int()> r1(nontype<&S::x>, s); + function_ref<long()> r2(nontype<&S::x>, &s); + + VERIFY( r1() == 10 ); + VERIFY( r2() == 10 ); + + s.x = 20; + + VERIFY( r1() == 20 ); + VERIFY( r2() == 20 ); + + r1 = function_ref<int()>(nontype<&S::f>, &s); + r2 = function_ref<long()>(nontype<&S::f>, s); + + VERIFY( r1() == 20 ); + VERIFY( r2() == 20 ); + + s.x = 30; + + VERIFY( r1() == 30 ); + VERIFY( r2() == 30 ); +} + +int main() +{ + test01(); + test02(); +} diff --git a/libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_default.cc b/libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_default.cc new file mode 100644 index 0000000..eec300f --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_default.cc @@ -0,0 +1,41 @@ +// { dg-do run { target c++23 } } +#include <mdspan> + +#include <cstdint> +#include <testsuite_hooks.h> + +constexpr auto dyn = std::dynamic_extent; + +template<typename Extents> + constexpr void + test_default_ctor() + { + Extents exts; + for(size_t i = 0; i < Extents::rank(); ++i) + if(exts.static_extent(i) == std::dynamic_extent) + VERIFY(exts.extent(i) == 0); + else + VERIFY(exts.extent(i) == Extents::static_extent(i)); + } + +constexpr bool +test_default_ctor_all() +{ + test_default_ctor<std::extents<int, 1>>(); + test_default_ctor<std::extents<int, dyn>>(); + test_default_ctor<std::extents<int, 1, 2>>(); + test_default_ctor<std::extents<int, dyn, 2>>(); + test_default_ctor<std::extents<int, dyn, dyn>>(); + test_default_ctor<std::extents<int, 1, 2, 3>>(); + test_default_ctor<std::extents<int, dyn, 2, dyn>>(); + test_default_ctor<std::extents<int, dyn, dyn, dyn>>(); + return true; +} + +int +main() +{ + test_default_ctor_all(); + static_assert(test_default_ctor_all()); + return 0; +} diff --git a/libstdc++-v3/testsuite/26_numerics/headers/cmath/82644.cc b/libstdc++-v3/testsuite/26_numerics/headers/cmath/82644.cc index 3274f05..40abb2c 100644 --- a/libstdc++-v3/testsuite/26_numerics/headers/cmath/82644.cc +++ b/libstdc++-v3/testsuite/26_numerics/headers/cmath/82644.cc @@ -15,8 +15,9 @@ // with this library; see the file COPYING3. If not see // <http://www.gnu.org/licenses/>. -// { dg-options "-D__STDCPP_WANT_MATH_SPEC_FUNCS__ -D__STRICT_ANSI__" } +// { dg-options "-D__STDCPP_WANT_MATH_SPEC_FUNCS__" } // { dg-do compile { target c++11 } } +// // { dg-add-options strict_std } #define conf_hyperg 1 #define conf_hypergf 2 diff --git a/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/abs128.cc b/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/abs128.cc new file mode 100644 index 0000000..cfb0562 --- /dev/null +++ b/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/abs128.cc @@ -0,0 +1,16 @@ +// { dg-do compile } +// { dg-add-options strict_std } + +#include <cstdlib> + +template<typename T> T same_type(T, T) { return T(); } + +#ifdef __SIZEOF_INT128__ +__int128 i = 0; +__int128 j = same_type(std::abs(i), i); +#endif + +#ifdef __SIZEOF_FLOAT128__ +__float128 f = 0.0; +__float128 g = same_type(std::abs(f), f); +#endif diff --git a/libstdc++-v3/testsuite/experimental/names.cc b/libstdc++-v3/testsuite/experimental/names.cc index e0a7d4f..4bedd53 100644 --- a/libstdc++-v3/testsuite/experimental/names.cc +++ b/libstdc++-v3/testsuite/experimental/names.cc @@ -22,6 +22,12 @@ // naming variables, parameters etc. in the library. #include "../17_intro/names.cc" + +#ifdef _AIX +// <netdb.h> declares endnetgrent_r with ptr parameter. +# undef n +#endif + // Filesystem #if __has_include(<experimental/filesystem>) # include <experimental/filesystem> diff --git a/libstdc++-v3/testsuite/std/format/debug.cc b/libstdc++-v3/testsuite/std/format/debug.cc index 6165a29..965b4df 100644 --- a/libstdc++-v3/testsuite/std/format/debug.cc +++ b/libstdc++-v3/testsuite/std/format/debug.cc @@ -1,6 +1,7 @@ // { dg-options "-fexec-charset=UTF-8 -fwide-exec-charset=UTF-32LE -DUNICODE_ENC" { target le } } // { dg-options "-fexec-charset=UTF-8 -fwide-exec-charset=UTF-32BE -DUNICODE_ENC" { target be } } // { dg-do run { target c++23 } } +// { dg-require-effective-target 4byte_wchar_t } // { dg-add-options no_pch } // { dg-timeout-factor 2 } diff --git a/libstdc++-v3/testsuite/std/format/functions/format.cc b/libstdc++-v3/testsuite/std/format/functions/format.cc index 93c33b4..e4adf3a 100644 --- a/libstdc++-v3/testsuite/std/format/functions/format.cc +++ b/libstdc++-v3/testsuite/std/format/functions/format.cc @@ -1,6 +1,7 @@ // { dg-options "-fexec-charset=UTF-8" } // { dg-do run { target c++20 } } // { dg-add-options no_pch } +// { dg-additional-options "-DUNICODE" { target 4byte_wchar_t } } #include <format> @@ -511,6 +512,7 @@ test_bool() void test_unicode() { +#ifdef UNICODE // Similar to sC example in test_std_examples, but not from the standard. // Verify that the character "🤡" has estimated field width 2, // rather than estimated field width equal to strlen("🤡"), which would be 4, @@ -564,6 +566,7 @@ test_unicode() std::string sA = std::format("{:>5}", input[0]); VERIFY( sA == input[1] ); } +#endif } int main() diff --git a/libstdc++-v3/testsuite/std/memory/indirect/copy.cc b/libstdc++-v3/testsuite/std/memory/indirect/copy.cc new file mode 100644 index 0000000..0ac6e92 --- /dev/null +++ b/libstdc++-v3/testsuite/std/memory/indirect/copy.cc @@ -0,0 +1,121 @@ +// { dg-do run { target c++26 } } + +#include <memory> +#include <scoped_allocator> +#include <utility> +#include <vector> + +#include <testsuite_hooks.h> +#include <testsuite_allocator.h> + +using __gnu_test::tracker_allocator; +using Counter = __gnu_test::tracker_allocator_counter; +using Vector = std::vector<int>; +using Indirect = std::indirect<Vector, tracker_allocator<Vector>>; +const Indirect src(std::in_place, {1, 2, 3}); + +constexpr void +test_ctor() +{ + Counter::reset(); + Indirect i1(src); + VERIFY( *i1 == *src ); + VERIFY( &*i1 != &*src ); + VERIFY( Counter::get_allocation_count() == sizeof(Vector) ); + VERIFY( Counter::get_deallocation_count() == 0 ); + VERIFY( Counter::get_construct_count() == 1 ); + VERIFY( Counter::get_destruct_count() == 0 ); + + Counter::reset(); + Indirect i2(std::allocator_arg, {}, src); + VERIFY( *i2 == *src ); + VERIFY( &*i2 != &*src ); + VERIFY( Counter::get_allocation_count() == sizeof(Vector) ); + VERIFY( Counter::get_deallocation_count() == 0 ); + VERIFY( Counter::get_construct_count() == 1 ); + VERIFY( Counter::get_destruct_count() == 0 ); +} + +constexpr void +test_assign() +{ + Indirect i1; + Counter::reset(); + + i1 = src; + VERIFY( *i1 == *src ); + VERIFY( &*i1 != &*src ); + VERIFY( Counter::get_allocation_count() == 0 ); + VERIFY( Counter::get_deallocation_count() == 0 ); + VERIFY( Counter::get_construct_count() == 0 ); + VERIFY( Counter::get_destruct_count() == 0 ); + + auto(std::move(i1)); + Counter::reset(); + + i1 = src; + VERIFY( *i1 == *src ); + VERIFY( &*i1 != &*src ); + VERIFY( Counter::get_allocation_count() == sizeof(Vector) ); + VERIFY( Counter::get_deallocation_count() == 0 ); + VERIFY( Counter::get_construct_count() == 1 ); + VERIFY( Counter::get_destruct_count() == 0 ); +} + +constexpr void +test_valueless() +{ + Indirect e; + auto(std::move(e)); + VERIFY( e.valueless_after_move() ); + + Counter::reset(); + Indirect i1(e); + VERIFY( i1.valueless_after_move() ); + VERIFY( Counter::get_allocation_count() == 0 ); + VERIFY( Counter::get_deallocation_count() == 0 ); + VERIFY( Counter::get_construct_count() == 0 ); + VERIFY( Counter::get_destruct_count() == 0 ); + + Indirect i2(std::allocator_arg, {}, e); + VERIFY( i2.valueless_after_move() ); + VERIFY( Counter::get_allocation_count() == 0 ); + VERIFY( Counter::get_deallocation_count() == 0 ); + VERIFY( Counter::get_construct_count() == 0 ); + VERIFY( Counter::get_destruct_count() == 0 ); + + Indirect i3(src); + Counter::reset(); + i3 = e; + VERIFY( i3.valueless_after_move() ); + VERIFY( Counter::get_allocation_count() == 0 ); + VERIFY( Counter::get_deallocation_count() == sizeof(Vector) ); + VERIFY( Counter::get_construct_count() == 0 ); + VERIFY( Counter::get_destruct_count() == 1 ); + + Counter::reset(); + i3 = e; + VERIFY( i3.valueless_after_move() ); + VERIFY( Counter::get_allocation_count() == 0 ); + VERIFY( Counter::get_deallocation_count() == 0 ); + VERIFY( Counter::get_construct_count() == 0 ); + VERIFY( Counter::get_destruct_count() == 0 ); +} + +constexpr void +test_all() +{ + test_ctor(); + test_assign(); + test_valueless(); +} + +int main() +{ + test_all(); + + static_assert([] { + test_all(); + return true; + }); +} diff --git a/libstdc++-v3/testsuite/std/memory/indirect/copy_alloc.cc b/libstdc++-v3/testsuite/std/memory/indirect/copy_alloc.cc new file mode 100644 index 0000000..d5865b9 --- /dev/null +++ b/libstdc++-v3/testsuite/std/memory/indirect/copy_alloc.cc @@ -0,0 +1,228 @@ +// { dg-do run { target c++26 } } + +#include <memory> +#include <scoped_allocator> +#include <utility> +#include <vector> + +#include <testsuite_hooks.h> +#include <testsuite_allocator.h> + +using __gnu_test::propagating_allocator; +using __gnu_test::tracker_allocator; +using Counter = __gnu_test::tracker_allocator_counter; + +template<bool Propagate> +constexpr void +test_ctor() +{ + using PropAlloc = propagating_allocator<int, Propagate>; + using Vector = std::vector<int, PropAlloc>; + using ScopedAlloc = std::scoped_allocator_adaptor< + propagating_allocator<Vector, Propagate, tracker_allocator<Vector>>, + PropAlloc>; + using Indirect = std::indirect<Vector, ScopedAlloc>; + + const Indirect src(std::allocator_arg, ScopedAlloc{11, 22}, + std::in_place, {1, 2, 3}); + + Counter::reset(); + Indirect i1(src); + VERIFY( *i1 == *src ); + VERIFY( &*i1 != &*src ); + if (Propagate) + { + VERIFY( i1->get_allocator().get_personality() == 22 ); + VERIFY( i1.get_allocator().get_personality() == 11 ); + } + else + { + VERIFY( i1->get_allocator().get_personality() == 0 ); + VERIFY( i1.get_allocator().get_personality() == 0 ); + } + VERIFY( Counter::get_allocation_count() == sizeof(Vector) ); + VERIFY( Counter::get_deallocation_count() == 0 ); + VERIFY( Counter::get_construct_count() == 1 ); + VERIFY( Counter::get_destruct_count() == 0 ); + + + Counter::reset(); + Indirect i2(std::allocator_arg, ScopedAlloc{33, 44}, src); + VERIFY( *i2 == *src ); + VERIFY( &*i2 != &*src ); + VERIFY( i2->get_allocator().get_personality() == 44 ); + VERIFY( i2.get_allocator().get_personality() == 33 ); + VERIFY( Counter::get_allocation_count() == sizeof(Vector) ); + VERIFY( Counter::get_deallocation_count() == 0 ); + VERIFY( Counter::get_construct_count() == 1 ); + VERIFY( Counter::get_destruct_count() == 0 ); +} + +template<bool Propagate> +constexpr void +test_assign() +{ + using PropAlloc = propagating_allocator<int, Propagate>; + using Vector = std::vector<int, PropAlloc>; + using ScopedAlloc = std::scoped_allocator_adaptor< + propagating_allocator<Vector, Propagate, tracker_allocator<Vector>>, + PropAlloc>; + using Indirect = std::indirect<Vector, ScopedAlloc>; + + const Indirect src(std::allocator_arg, ScopedAlloc{11, 22}, + std::in_place, {1, 2, 3}); + + Indirect i1(std::allocator_arg, ScopedAlloc{11, 22}); + Counter::reset(); + + i1 = src; + VERIFY( *i1 == *src ); + VERIFY( &*i1 != &*src ); + VERIFY( i1->get_allocator().get_personality() == 22 ); + VERIFY( i1.get_allocator().get_personality() == 11 ); + VERIFY( Counter::get_allocation_count() == 0 ); + VERIFY( Counter::get_deallocation_count() == 0 ); + VERIFY( Counter::get_construct_count() == 0 ); + VERIFY( Counter::get_destruct_count() == 0 ); + + Indirect i2(std::allocator_arg, ScopedAlloc{33, 44}); + Counter::reset(); + + i2 = src; + VERIFY( *i2 == *src ); + VERIFY( &*i2 != &*src ); + if (Propagate) + { + VERIFY( i2->get_allocator().get_personality() == 22 ); + VERIFY( i2.get_allocator().get_personality() == 11 ); + } + else + { + VERIFY( i2->get_allocator().get_personality() == 44 ); + VERIFY( i2.get_allocator().get_personality() == 33 ); + } + VERIFY( Counter::get_allocation_count() == sizeof(Vector) ); + VERIFY( Counter::get_deallocation_count() == sizeof(Vector) ); + VERIFY( Counter::get_construct_count() == 1 ); + VERIFY( Counter::get_destruct_count() == 1 ); + + Indirect i3(std::allocator_arg, ScopedAlloc{11, 22}); + auto(std::move(i3)); + Counter::reset(); + + i3 = src; + VERIFY( *i3 == *src ); + VERIFY( &*i3 != &*src ); + VERIFY( i3->get_allocator().get_personality() == 22 ); + VERIFY( i3.get_allocator().get_personality() == 11 ); + VERIFY( Counter::get_allocation_count() == sizeof(Vector) ); + VERIFY( Counter::get_deallocation_count() == 0 ); + VERIFY( Counter::get_construct_count() == 1 ); + VERIFY( Counter::get_destruct_count() == 0 ); + + Indirect i4(std::allocator_arg, ScopedAlloc{33, 44}); + auto(std::move(i4)); + Counter::reset(); + + i4 = src; + VERIFY( *i4 == *src ); + VERIFY( &*i4 != &*src ); + if (Propagate) + { + VERIFY( i4->get_allocator().get_personality() == 22 ); + VERIFY( i4.get_allocator().get_personality() == 11 ); + } + else + { + VERIFY( i4->get_allocator().get_personality() == 44 ); + VERIFY( i4.get_allocator().get_personality() == 33 ); + } + VERIFY( Counter::get_allocation_count() == sizeof(Vector) ); + VERIFY( Counter::get_deallocation_count() == 0 ); + VERIFY( Counter::get_construct_count() == 1 ); + VERIFY( Counter::get_destruct_count() == 0 ); +} + +template<bool Propagate> +constexpr void +test_valueless() +{ + using PropAlloc = propagating_allocator<int, Propagate>; + using Vector = std::vector<int, PropAlloc>; + using ScopedAlloc = std::scoped_allocator_adaptor< + propagating_allocator<Vector, Propagate, tracker_allocator<Vector>>, + PropAlloc>; + using Indirect = std::indirect<Vector, ScopedAlloc>; + + Indirect e(std::allocator_arg, ScopedAlloc{11, 22}); + auto(std::move(e)); + VERIFY( e.valueless_after_move() ); + + Counter::reset(); + Indirect i1(e); + VERIFY( i1.valueless_after_move() ); + if (Propagate) + VERIFY( i1.get_allocator().get_personality() == 11 ); + else + VERIFY( i1.get_allocator().get_personality() == 0 ); + VERIFY( Counter::get_allocation_count() == 0 ); + VERIFY( Counter::get_deallocation_count() == 0 ); + VERIFY( Counter::get_construct_count() == 0 ); + VERIFY( Counter::get_destruct_count() == 0 ); + + Counter::reset(); + Indirect i2(std::allocator_arg, ScopedAlloc{33, 44}, e); + VERIFY( i2.valueless_after_move() ); + VERIFY( i2.get_allocator().get_personality() == 33 ); + VERIFY( Counter::get_allocation_count() == 0 ); + VERIFY( Counter::get_deallocation_count() == 0 ); + VERIFY( Counter::get_construct_count() == 0 ); + VERIFY( Counter::get_destruct_count() == 0 ); + + Indirect i3(std::allocator_arg, ScopedAlloc{33, 44}); + Counter::reset(); + + i3 = e; + VERIFY( i3.valueless_after_move() ); + if (Propagate) + VERIFY( i3.get_allocator().get_personality() == 11 ); + else + VERIFY( i3.get_allocator().get_personality() == 33 ); + VERIFY( Counter::get_allocation_count() == 0 ); + VERIFY( Counter::get_deallocation_count() == sizeof(Vector) ); + VERIFY( Counter::get_construct_count() == 0 ); + VERIFY( Counter::get_destruct_count() == 1 ); + + Counter::reset(); + i2 = e; + VERIFY( i2.valueless_after_move() ); + if (Propagate) + VERIFY( i2.get_allocator().get_personality() == 11 ); + else + VERIFY( i2.get_allocator().get_personality() == 33 ); + VERIFY( Counter::get_allocation_count() == 0 ); + VERIFY( Counter::get_deallocation_count() == 0 ); + VERIFY( Counter::get_construct_count() == 0 ); + VERIFY( Counter::get_destruct_count() == 0 ); +} + +template<bool Propagate> +constexpr void +test_all() +{ + test_ctor<Propagate>(); + test_assign<Propagate>(); + test_valueless<Propagate>(); +} + +int main() +{ + test_all<true>(); + test_all<false>(); + + static_assert([] { + test_all<true>(); + test_all<false>(); + return true; + }); +} diff --git a/libstdc++-v3/testsuite/std/memory/indirect/ctor.cc b/libstdc++-v3/testsuite/std/memory/indirect/ctor.cc new file mode 100644 index 0000000..124874d --- /dev/null +++ b/libstdc++-v3/testsuite/std/memory/indirect/ctor.cc @@ -0,0 +1,204 @@ +// { dg-do run { target c++26 } } + +#include <memory> +#include <scoped_allocator> +#include <utility> +#include <vector> + +#ifndef __cpp_lib_indirect +# error __cpp_lib_indirect feature test macro missing in <memory> +#elif __cpp_lib_indirect != 202502 +# error __cpp_lib_indirect feature test macro has wrong value in <memory> +#endif + +#include <testsuite_hooks.h> +#include <testsuite_allocator.h> + +using __gnu_test::uneq_allocator; +using UneqAlloc = uneq_allocator<int>; +using ScopedAlloc = std::scoped_allocator_adaptor< + uneq_allocator<std::vector<int, UneqAlloc>>, + UneqAlloc>; + +struct Obj +{ + int i; + char c[2]; +}; + +constexpr void +test_deduction_guides() +{ + const Obj o{}; + std::indirect i1(o); + static_assert(std::is_same_v<decltype(i1), std::indirect<Obj>>); + + using Alloc = __gnu_test::SimpleAllocator<Obj>; + Alloc a; + std::indirect i2(std::allocator_arg, a, o); + static_assert(std::is_same_v<decltype(i2), std::indirect<Obj, Alloc>>); +} + +constexpr void +test_default_ctor() +{ + using __gnu_test::default_init_allocator; + + std::indirect<Obj, default_init_allocator<Obj>> i1; + default_init_allocator<int> a{}; + + // The contained object and the allocator should be value-initialized. + VERIFY( i1->i == 0 ); + VERIFY( i1->c[0] == 0 ); + VERIFY( i1->c[1] == 0 ); + VERIFY( i1.get_allocator() == a ); + + a.state = 5; + // Allocator-extended default constructor: + std::indirect<Obj, default_init_allocator<Obj>> i2(std::allocator_arg, a); + VERIFY( i2.get_allocator() == a ); + + // Object is constructed using allocator-aware constructor. + std::indirect<std::vector<int, UneqAlloc>, ScopedAlloc> + i3(std::allocator_arg, ScopedAlloc(11, 22)); + VERIFY( i3->empty() ); + VERIFY( i3->get_allocator().get_personality() == 22 ); + VERIFY( i3.get_allocator().get_personality() == 11 ); +} + +constexpr void +test_forwarding_ctor() +{ + Obj obj{1, {'2', '3'}}; + auto verify = [](std::indirect<Obj> const& i) + { + VERIFY( i->i == 1 ); + VERIFY( i->c[0] == '2' ); + VERIFY( i->c[1] == '3' ); + }; + + std::indirect<Obj> i1(std::as_const(obj)); + verify(i1); + std::indirect<Obj> i2(std::move(std::as_const(obj))); + verify(i2); + std::indirect<Obj> i3(obj); + verify(i3); + std::indirect<Obj> i4(std::move(obj)); + verify(i4); + + std::indirect<Obj> i5({1, {'2', '3'}}); + verify(i5); + + // Aggregate parens init + std::indirect<Obj> i6(7); + VERIFY( i6->i == 7 ); + + std::vector<int, UneqAlloc> v{1, 2, 3, 4, 5}; + // Object is constructed using allocator-aware constructor. + std::indirect<std::vector<int, UneqAlloc>, ScopedAlloc> + i7(std::allocator_arg, ScopedAlloc(11, 22), v); + VERIFY( i7->size() == 5 ); + VERIFY( v.size() == 5 ); + VERIFY( i7->get_allocator().get_personality() == 22 ); + VERIFY( i7.get_allocator().get_personality() == 11 ); + + std::indirect<std::vector<int, UneqAlloc>, ScopedAlloc> + i8(std::allocator_arg, ScopedAlloc(11, 22), std::move(v)); + VERIFY( i8->size() == 5 ); + VERIFY( v.size() == 0 ); + VERIFY( i8->get_allocator().get_personality() == 22 ); + VERIFY( i8.get_allocator().get_personality() == 11 ); +} + +constexpr void +test_inplace_ctor() +{ + std::indirect<Obj> i1(std::in_place); + VERIFY( i1->i == 0 ); + VERIFY( i1->c[0] == 0 ); + VERIFY( i1->c[1] == 0 ); + + std::indirect<Obj> i2(std::in_place, 10); + VERIFY( i2->i == 10 ); + VERIFY( i2->c[0] == 0 ); + VERIFY( i2->c[1] == 0 ); + + std::indirect<Obj, uneq_allocator<Obj>> + i3(std::allocator_arg, 42, std::in_place); + VERIFY( i3->i == 0 ); + VERIFY( i3->c[0] == 0 ); + VERIFY( i3->c[1] == 0 ); + VERIFY( i3.get_allocator().get_personality() == 42 ); + + std::indirect<Obj, uneq_allocator<Obj>> + i4(std::allocator_arg, 42, std::in_place, 10); + VERIFY( i4->i == 10 ); + VERIFY( i4->c[0] == 0 ); + VERIFY( i4->c[1] == 0 ); + VERIFY( i4.get_allocator().get_personality() == 42 ); + + std::indirect<std::vector<int>> i5(std::in_place); + VERIFY( i5->size() == 0 ); + + std::indirect<std::vector<int>> i6(std::in_place, 5, 13); + VERIFY( i6->size() == 5 ); + VERIFY( i6->at(0) == 13 ); + + std::indirect<std::vector<int>> i7(std::in_place, {1, 2, 3, 4}); + VERIFY( i7->size() == 4 ); + VERIFY( i7->at(2) == 3 ); + + std::indirect<std::vector<int, UneqAlloc>> + i8(std::in_place, UneqAlloc{42}); + VERIFY( i8->size() == 0 ); + VERIFY( i8->get_allocator().get_personality() == 42 ); + + std::indirect<std::vector<int, UneqAlloc>> + i9(std::in_place, 5, 13, UneqAlloc{42}); + VERIFY( i9->size() == 5 ); + VERIFY( i9->at(0) == 13 ); + VERIFY( i9->get_allocator().get_personality() == 42 ); + + std::indirect<std::vector<int, UneqAlloc>> + i10(std::in_place, {1, 2, 3, 4}, UneqAlloc{42}); + VERIFY( i10->size() == 4 ); + VERIFY( i10->at(2) == 3 ); + VERIFY( i10->get_allocator().get_personality() == 42 ); + + std::indirect<std::vector<int, UneqAlloc>, ScopedAlloc> + i14(std::allocator_arg, ScopedAlloc(11, 22), + std::in_place); + VERIFY( i14->size() == 0 ); + VERIFY( i14->get_allocator().get_personality() == 22 ); + VERIFY( i14.get_allocator().get_personality() == 11 ); + + std::indirect<std::vector<int, UneqAlloc>, ScopedAlloc> + i15(std::allocator_arg, ScopedAlloc(11, 22), + std::in_place, 5, 13); + VERIFY( i15->size() == 5 ); + VERIFY( i15->at(0) == 13 ); + VERIFY( i15->get_allocator().get_personality() == 22 ); + VERIFY( i15.get_allocator().get_personality() == 11 ); + + std::indirect<std::vector<int, UneqAlloc>, ScopedAlloc> + i16(std::allocator_arg, ScopedAlloc(11, 22), + std::in_place, {1, 2, 3, 4}); + VERIFY( i16->size() == 4 ); + VERIFY( i16->at(2) == 3 ); + VERIFY( i16->get_allocator().get_personality() == 22 ); + VERIFY( i16.get_allocator().get_personality() == 11 ); +} + +int main() +{ + test_default_ctor(); + test_forwarding_ctor(); + test_inplace_ctor(); + + static_assert([] { + test_default_ctor(); + test_forwarding_ctor(); + test_inplace_ctor(); + return true; + }); +} diff --git a/libstdc++-v3/testsuite/std/memory/indirect/incomplete.cc b/libstdc++-v3/testsuite/std/memory/indirect/incomplete.cc new file mode 100644 index 0000000..1faf13d --- /dev/null +++ b/libstdc++-v3/testsuite/std/memory/indirect/incomplete.cc @@ -0,0 +1,38 @@ +// { dg-do compile { target c++26 } } + +#include <memory> + +struct Incomplete; +bool operator==(const Incomplete&, const Incomplete&); +std::strong_ordering operator<=>(const Incomplete&, const Incomplete&); + +template<> +struct std::hash<Incomplete> +{ + static std::size_t operator()(const Incomplete& c); +}; + +std::indirect<Incomplete>* +test_move(std::indirect<Incomplete>& i1, std::indirect<Incomplete>& i2) +{ + i2.swap(i2); + return new std::indirect<Incomplete>(std::move(i1)); +} + +void +test_relops(std::indirect<Incomplete> const& i1, Incomplete const& o) +{ + void(i1 == i1); + void(i1 < i1); + void(i1 >= i1); + + void(i1 != o); + void(i1 < o); +} + +void +test_hash(std::indirect<Incomplete> const& i1) +{ + std::hash<std::indirect<Incomplete>> h; + h(i1); +} diff --git a/libstdc++-v3/testsuite/std/memory/indirect/invalid_neg.cc b/libstdc++-v3/testsuite/std/memory/indirect/invalid_neg.cc new file mode 100644 index 0000000..82e7e84 --- /dev/null +++ b/libstdc++-v3/testsuite/std/memory/indirect/invalid_neg.cc @@ -0,0 +1,28 @@ +// { dg-do compile { target c++26 } } + +#include <memory> + +// In every specialization indirect<T, Allocator>, if the type +// allocator_traits<Allocator>::value_type is not the same type as T, +// the program is ill-formed. +using T1 = std::indirect<int, std::allocator<long>>::value_type; // { dg-error "here" } + +// A program that instantiates the definition of the template +// indirect<T, Allocator> with a type for the T parameter that is +// a non-object type, an array type, in_place_t, +// a specialization of in_place_type_t, or a cv-qualified type is ill-formed. + +using T2 = std::indirect<int&>::value_type; // { dg-error "here" } + +using T3 = std::indirect<int[1]>::value_type; // { dg-error "here" } + +using T4 = std::indirect<std::in_place_t>::value_type; // { dg-error "here" } + +using T5 = std::indirect<std::in_place_type_t<int>>::value_type; // { dg-error "here" } + +using T6 = std::indirect<const int>::value_type; // { dg-error "here" } + +using T7 = std::indirect<volatile int>::value_type; // { dg-error "here" } + +// { dg-error "static assertion failed" "" { target *-*-* } 0 } +// { dg-prune-output "forming pointer to reference" } diff --git a/libstdc++-v3/testsuite/std/memory/indirect/move.cc b/libstdc++-v3/testsuite/std/memory/indirect/move.cc new file mode 100644 index 0000000..6e87c60 --- /dev/null +++ b/libstdc++-v3/testsuite/std/memory/indirect/move.cc @@ -0,0 +1,144 @@ +// { dg-do run { target c++26 } } + +#include <memory> +#include <scoped_allocator> +#include <utility> +#include <vector> +#include <optional> + +#include <testsuite_hooks.h> +#include <testsuite_allocator.h> + +using __gnu_test::tracker_allocator; +using Counter = __gnu_test::tracker_allocator_counter; +using Vector = std::vector<int>; +using Indirect = std::indirect<Vector, tracker_allocator<Vector>>; +const Indirect val(std::in_place, {1, 2, 3}); + +constexpr void +verifyNoAllocations() +{ + VERIFY( Counter::get_allocation_count() == 0 ); + VERIFY( Counter::get_deallocation_count() == 0 ); + VERIFY( Counter::get_construct_count() == 0 ); + VERIFY( Counter::get_destruct_count() == 0 ); +} + +constexpr void +test_ctor() +{ + std::optional<Indirect> src; + auto make = [&src] -> Indirect&& { + src.emplace(val); + Counter::reset(); + return std::move(*src); + }; + + Indirect i1(make()); + VERIFY( src->valueless_after_move() ); + VERIFY( *i1 == *val ); + verifyNoAllocations(); + + Indirect i2(std::allocator_arg, {}, make()); + VERIFY( src->valueless_after_move() ); + VERIFY( *i2 == *val ); + verifyNoAllocations(); +} + +constexpr void +test_assign() +{ + std::optional<Indirect> src; + auto make = [&src] -> Indirect&& { + src.emplace(val); + Counter::reset(); + return std::move(*src); + }; + + Indirect i1; + + i1 = make(); + VERIFY( src->valueless_after_move() ); + VERIFY( *i1 == *val ); + VERIFY( Counter::get_allocation_count() == 0 ); + VERIFY( Counter::get_deallocation_count() == sizeof(Vector) ); + VERIFY( Counter::get_construct_count() == 0 ); + VERIFY( Counter::get_destruct_count() == 1 ); + + auto(std::move(i1)); + i1 = make(); + VERIFY( *i1 == *val ); + VERIFY( src->valueless_after_move() ); + verifyNoAllocations(); +} + +constexpr void +test_swap() +{ + const Indirect val1(std::in_place, {1, 2, 3}); + const Indirect val2(std::in_place, {2, 4, 6}); + + Indirect i1(val1); + Indirect i2(val2); + Counter::reset(); + i1.swap(i2); + VERIFY( *i2 == *val1 ); + VERIFY( *i1 == *val2 ); + verifyNoAllocations(); + + auto(std::move(i1)); + + Counter::reset(); + i1.swap(i2); + VERIFY( *i1 == *val1 ); + VERIFY( i2.valueless_after_move() ); + verifyNoAllocations(); +} + +constexpr void +test_valueless() +{ + auto e = [] { + Indirect res; + auto(std::move(res)); + Counter::reset(); + return res; + }; + + Indirect i1(e()); + VERIFY( i1.valueless_after_move() ); + verifyNoAllocations(); + + Indirect i2(std::allocator_arg, {}, e()); + VERIFY( i2.valueless_after_move() ); + verifyNoAllocations(); + + Indirect i3(val); + i3 = e(); + VERIFY( Counter::get_allocation_count() == 0 ); + VERIFY( Counter::get_deallocation_count() == sizeof(Vector) ); + VERIFY( Counter::get_construct_count() == 0 ); + VERIFY( Counter::get_destruct_count() == 1 ); + + i3 = e(); + verifyNoAllocations(); +} + +constexpr void +test_all() +{ + test_ctor(); + test_assign(); + test_swap(); + test_valueless(); +} + +int main() +{ + test_all(); + + static_assert([] { + test_all(); + return true; + }); +} diff --git a/libstdc++-v3/testsuite/std/memory/indirect/move_alloc.cc b/libstdc++-v3/testsuite/std/memory/indirect/move_alloc.cc new file mode 100644 index 0000000..cd6f90d --- /dev/null +++ b/libstdc++-v3/testsuite/std/memory/indirect/move_alloc.cc @@ -0,0 +1,296 @@ +// { dg-do run { target c++26 } } + +#include <memory> +#include <scoped_allocator> +#include <utility> +#include <vector> +#include <optional> + +#include <testsuite_hooks.h> +#include <testsuite_allocator.h> + +using __gnu_test::propagating_allocator; +using __gnu_test::tracker_allocator; +using Counter = __gnu_test::tracker_allocator_counter; + +constexpr void +verifyNoAllocations() +{ + VERIFY( Counter::get_allocation_count() == 0 ); + VERIFY( Counter::get_deallocation_count() == 0 ); + VERIFY( Counter::get_construct_count() == 0 ); + VERIFY( Counter::get_destruct_count() == 0 ); +} + +template<bool Propagate> +constexpr void +test_ctor() +{ + using PropAlloc = propagating_allocator<int, Propagate>; + using Vector = std::vector<int, PropAlloc>; + using ScopedAlloc = std::scoped_allocator_adaptor< + propagating_allocator<Vector, Propagate, tracker_allocator<Vector>>, + PropAlloc>; + using Indirect = std::indirect<Vector, ScopedAlloc>; + + const Indirect val(std::in_place, {1, 2, 3}); + std::optional<Indirect> src; + auto make = [&val, &src] -> Indirect&& { + src.emplace(std::allocator_arg, ScopedAlloc{11, 22}, val); + Counter::reset(); + return std::move(*src); + }; + + Indirect i1(make()); + VERIFY( src->valueless_after_move() ); + VERIFY( *i1 == *val ); + VERIFY( i1->get_allocator().get_personality() == 22 ); + VERIFY( i1.get_allocator().get_personality() == 11 ); + verifyNoAllocations(); + + Indirect i2(std::allocator_arg, ScopedAlloc{11, 22}, make()); + VERIFY( src->valueless_after_move() ); + VERIFY( *i2 == *val ); + VERIFY( i2->get_allocator().get_personality() == 22 ); + VERIFY( i2.get_allocator().get_personality() == 11 ); + verifyNoAllocations(); + + Indirect i3(std::allocator_arg, ScopedAlloc{33, 44}, make()); + // We move-from contained object + VERIFY( !src->valueless_after_move() ); + VERIFY( *i3 == *val ); + VERIFY( i3->get_allocator().get_personality() == 44 ); + VERIFY( i3.get_allocator().get_personality() == 33 ); + VERIFY( Counter::get_allocation_count() == sizeof(Vector) ); + VERIFY( Counter::get_deallocation_count() == 0 ); + VERIFY( Counter::get_construct_count() == 1 ); + VERIFY( Counter::get_destruct_count() == 0 ); +} + +template<bool Propagate> +constexpr void +test_assign() +{ + using PropAlloc = propagating_allocator<int, Propagate>; + using Vector = std::vector<int, PropAlloc>; + using ScopedAlloc = std::scoped_allocator_adaptor< + propagating_allocator<Vector, Propagate, tracker_allocator<Vector>>, + PropAlloc>; + using Indirect = std::indirect<Vector, ScopedAlloc>; + + const Indirect val(std::in_place, {1, 2, 3}); + std::optional<Indirect> src; + auto make = [&val, &src] -> Indirect&& { + src.emplace(std::allocator_arg, ScopedAlloc{11, 22}, val); + Counter::reset(); + return std::move(*src); + }; + + Indirect i1(std::allocator_arg, ScopedAlloc{11, 22}); + + i1 = make(); + VERIFY( src->valueless_after_move() ); + VERIFY( *i1 == *val ); + VERIFY( i1->get_allocator().get_personality() == 22 ); + VERIFY( i1.get_allocator().get_personality() == 11 ); + VERIFY( Counter::get_allocation_count() == 0 ); + VERIFY( Counter::get_deallocation_count() == sizeof(Vector) ); + VERIFY( Counter::get_construct_count() == 0 ); + VERIFY( Counter::get_destruct_count() == 1 ); + + Indirect i2(std::allocator_arg, ScopedAlloc{33, 44}); + + i2 = make(); + VERIFY( *i2 == *val ); + if (Propagate) + { + VERIFY( src->valueless_after_move() ); + VERIFY( i2->get_allocator().get_personality() == 22 ); + VERIFY( i2.get_allocator().get_personality() == 11 ); + VERIFY( Counter::get_allocation_count() == 0 ); + VERIFY( Counter::get_construct_count() == 0 ); + } + else + { + // We allocate new holder and move-from contained object + VERIFY( !src->valueless_after_move() ); + VERIFY( i2->get_allocator().get_personality() == 44 ); + VERIFY( i2.get_allocator().get_personality() == 33 ); + VERIFY( Counter::get_allocation_count() == sizeof(Vector) ); + VERIFY( Counter::get_construct_count() == 1 ); + } + VERIFY( Counter::get_deallocation_count() == sizeof(Vector) ); + VERIFY( Counter::get_destruct_count() == 1 ); + + Indirect i3(std::allocator_arg, ScopedAlloc{11, 22}); + auto(std::move(i3)); + + i3 = make(); + VERIFY( *i3 == *val ); + VERIFY( src->valueless_after_move() ); + VERIFY( i3->get_allocator().get_personality() == 22 ); + VERIFY( i3.get_allocator().get_personality() == 11 ); + verifyNoAllocations(); + + Indirect i4(std::allocator_arg, ScopedAlloc{33, 44}); + auto(std::move(i4)); + + i4 = make(); + VERIFY( *i4 == *val ); + if (Propagate) + { + VERIFY( src->valueless_after_move() ); + VERIFY( i4->get_allocator().get_personality() == 22 ); + VERIFY( i4.get_allocator().get_personality() == 11 ); + VERIFY( Counter::get_allocation_count() == 0 ); + VERIFY( Counter::get_construct_count() == 0 ); + } + else + { + // We allocate new holder and move-from contained object + VERIFY( !src->valueless_after_move() ); + VERIFY( i4->get_allocator().get_personality() == 44 ); + VERIFY( i4.get_allocator().get_personality() == 33 ); + VERIFY( Counter::get_allocation_count() == sizeof(Vector) ); + VERIFY( Counter::get_construct_count() == 1 ); + } + VERIFY( Counter::get_deallocation_count() == 0 ); + VERIFY( Counter::get_destruct_count() == 0 ); +} + +template<bool Propagate> +constexpr void +test_swap() +{ + using PropAlloc = propagating_allocator<int, Propagate>; + using Vector = std::vector<int, PropAlloc>; + using ScopedAlloc = std::scoped_allocator_adaptor< + propagating_allocator<Vector, Propagate, tracker_allocator<Vector>>, + PropAlloc>; + using Indirect = std::indirect<Vector, ScopedAlloc>; + + const Indirect val1(std::in_place, {1, 2, 3}); + const Indirect val2(std::in_place, {2, 4, 6}); + + Indirect i1(std::allocator_arg, ScopedAlloc{11, 22}, val1); + Indirect i2(std::allocator_arg, ScopedAlloc{11, 22}, val2); + Counter::reset(); + i1.swap(i2); + VERIFY( *i2 == *val1 ); + VERIFY( *i1 == *val2 ); + verifyNoAllocations(); + + auto(std::move(i1)); + + Counter::reset(); + i1.swap(i2); + VERIFY( *i1 == *val1 ); + VERIFY( i2.valueless_after_move() ); + verifyNoAllocations(); + + if (!Propagate) + return; + + Indirect i3(std::allocator_arg, ScopedAlloc{33, 44}, val2); + Counter::reset(); + i1.swap(i3); + VERIFY( *i1 == *val2 ); + VERIFY( i1->get_allocator().get_personality() == 44 ); + VERIFY( i1.get_allocator().get_personality() == 33 ); + VERIFY( *i3 == *val1 ); + VERIFY( i3->get_allocator().get_personality() == 22 ); + VERIFY( i3.get_allocator().get_personality() == 11 ); + verifyNoAllocations(); + + i1.swap(i2); + VERIFY( i1.valueless_after_move() ); + VERIFY( i1.get_allocator().get_personality() == 11 ); + VERIFY( *i2 == *val2 ); + VERIFY( i2->get_allocator().get_personality() == 44 ); + VERIFY( i2.get_allocator().get_personality() == 33 ); + verifyNoAllocations(); +} + +template<bool Propagate> +constexpr void +test_valueless() +{ + using PropAlloc = propagating_allocator<int, Propagate>; + using Vector = std::vector<int, PropAlloc>; + using ScopedAlloc = std::scoped_allocator_adaptor< + propagating_allocator<Vector, Propagate, tracker_allocator<Vector>>, + PropAlloc>; + using Indirect = std::indirect<Vector, ScopedAlloc>; + + auto e = [] { + Indirect res(std::allocator_arg, ScopedAlloc{11, 22}); + auto(std::move(res)); + Counter::reset(); + return res; + }; + + Indirect i1(e()); + VERIFY( i1.valueless_after_move() ); + VERIFY( i1.get_allocator().get_personality() == 11 ); + verifyNoAllocations(); + + Indirect i2(std::allocator_arg, ScopedAlloc{33, 44}, e()); + VERIFY( i2.valueless_after_move() ); + VERIFY( i2.get_allocator().get_personality() == 33 ); + verifyNoAllocations(); + + Indirect i3(std::allocator_arg, ScopedAlloc{33, 44}); + + i3 = e(); + VERIFY( i3.valueless_after_move() ); + if (Propagate) + VERIFY( i3.get_allocator().get_personality() == 11 ); + else + VERIFY( i3.get_allocator().get_personality() == 33 ); + VERIFY( Counter::get_allocation_count() == 0 ); + VERIFY( Counter::get_deallocation_count() == sizeof(Vector) ); + VERIFY( Counter::get_construct_count() == 0 ); + VERIFY( Counter::get_destruct_count() == 1 ); + + i2 = e(); + VERIFY( i2.valueless_after_move() ); + if (Propagate) + VERIFY( i2.get_allocator().get_personality() == 11 ); + else + VERIFY( i2.get_allocator().get_personality() == 33 ); + verifyNoAllocations(); + + i3.swap(i2); + VERIFY( i2.valueless_after_move() ); + VERIFY( i1.valueless_after_move() ); + verifyNoAllocations(); + + if (!Propagate) + return; + + Indirect i4(std::allocator_arg, ScopedAlloc{33, 44}, e()); + i4.swap(i1); + verifyNoAllocations(); +} + +template<bool Propagate> +constexpr void +test_all() +{ + test_ctor<Propagate>(); + test_assign<Propagate>(); + test_swap<Propagate>(); + test_valueless<Propagate>(); +} + +int main() +{ + test_all<true>(); + test_all<false>(); + + static_assert([] { + test_all<true>(); + test_all<false>(); + return true; + }); +} diff --git a/libstdc++-v3/testsuite/std/memory/indirect/relops.cc b/libstdc++-v3/testsuite/std/memory/indirect/relops.cc new file mode 100644 index 0000000..d77fef2 --- /dev/null +++ b/libstdc++-v3/testsuite/std/memory/indirect/relops.cc @@ -0,0 +1,82 @@ +// { dg-do run { target c++26 } } + +#include <memory> +#include <testsuite_hooks.h> + +struct Obj +{ + int i; + constexpr auto operator<=>(const Obj&) const = default; +}; + +template<> +struct std::hash<Obj> +{ + static size_t operator()(Obj const& obj) + { return std::hash<int>{}(obj.i); } +}; + +constexpr void +test_relops() +{ + std::indirect<Obj> i1; + VERIFY( i1 == i1 ); + VERIFY( i1 <= i1 ); + VERIFY( i1 >= i1 ); + + std::indirect<Obj> i2 = std::move(i1); // make i1 valueless + VERIFY( i1 == i1 ); + VERIFY( i2 == i2 ); + VERIFY( i2 != i1 ); + VERIFY( i1 < i2 ); + VERIFY( i2 >= i1 ); + + std::indirect<Obj> i3 = std::move(i2); // make i2 valueless + VERIFY( i2 == i1 ); + VERIFY( i2 >= i1 ); + VERIFY( i2 <= i1 ); + VERIFY( i3 > i2 ); +} + +constexpr void +test_comp_with_t() +{ + std::indirect<Obj> i1; + Obj o{2}; + VERIFY( i1 != o ); + VERIFY( i1 < o ); + + std::indirect<Obj> i2(Obj{2}); + VERIFY( i2 == o ); + VERIFY( i2 <= o ); + VERIFY( o <= i2 ); + + std::indirect<Obj> i3 = std::move(i2); // make i2 valueless + VERIFY( i2 != o ); + VERIFY( i2 < o ); +} + +void +test_hash() +{ + Obj o{5}; + std::indirect<Obj> i(o); + VERIFY( std::hash<std::indirect<Obj>>{}(i) + == std::hash<Obj>{}(o) ); + + auto(std::move(i)); // make i valueless + (void)std::hash<std::indirect<Obj>>{}(i); +} + +int main() +{ + test_relops(); + test_comp_with_t(); + test_hash(); + + static_assert([] { + test_relops(); + test_comp_with_t(); + return true; + }); +} |