aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/ChangeLog474
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/copy-prop-aggregate-sra-1.C33
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/copy-prop-aggregate-sra-2.C31
-rw-r--r--gcc/testsuite/gcc.dg/builtin-assume-aligned-1.c10
-rw-r--r--gcc/testsuite/gcc.dg/cpp/escape-3.i2
-rw-r--r--gcc/testsuite/gcc.dg/debug/btf/btf-prune-4.c61
-rw-r--r--gcc/testsuite/gcc.dg/debug/dwarf2/dwarf-btf-decl-tag-4.c28
-rw-r--r--gcc/testsuite/gcc.dg/debug/dwarf2/dwarf-btf-decl-tag-5.c35
-rw-r--r--gcc/testsuite/gcc.dg/debug/dwarf2/dwarf-btf-decl-tag-6.c24
-rw-r--r--gcc/testsuite/gcc.dg/fold-vecperm-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/pointer-counted-by-10.c8
-rw-r--r--gcc/testsuite/gcc.dg/pointer-counted-by-4-void.c6
-rw-r--r--gcc/testsuite/gcc.dg/pointer-counted-by.c3
-rw-r--r--gcc/testsuite/gcc.dg/pr116815.c57
-rw-r--r--gcc/testsuite/gcc.dg/pr41488.c2
-rw-r--r--gcc/testsuite/gcc.dg/pr91191.c20
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr122497-1.c13
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr122502.c21
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ctz-ch.c23
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ctz-char.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ctz-complement-char.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ctz-complement-int.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ctz-complement-long-long.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ctz-complement-long.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ctz-int.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ctz-long-long.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ctz-long.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr122478.c17
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr92834.c6
-rw-r--r--gcc/testsuite/gcc.dg/vect/slp-reduc-13.c66
-rw-r--r--gcc/testsuite/gcc.dg/vect/slp-widen-mult-half.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/tree-vect.h2
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-u16.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-widen-mult-half-u8.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-widen-mult-half.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-widen-mult-u16.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8-s16-s32.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8-u32.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8.c1
-rw-r--r--gcc/testsuite/gcc.target/aarch64/pr121853_1.c64
-rw-r--r--gcc/testsuite/gcc.target/aarch64/pr121853_2.c14
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/dup-insr-1.c26
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/dup-insr-2.c26
-rw-r--r--gcc/testsuite/gcc.target/avr/pr121198.c10
-rw-r--r--gcc/testsuite/gcc.target/i386/pr116815.c31
-rw-r--r--gcc/testsuite/gcc.target/i386/pr122457.c4
-rw-r--r--gcc/testsuite/gcc.target/loongarch/conditional-move-opt-1.c4
-rw-r--r--gcc/testsuite/gcc.target/loongarch/conditional-move-opt-2.c2
-rw-r--r--gcc/testsuite/gcc.target/loongarch/conditional-move-opt-3.c14
-rw-r--r--gcc/testsuite/gcc.target/loongarch/fnmam4-vec.c14
-rw-r--r--gcc/testsuite/gcc.target/loongarch/pr122097.c271
-rw-r--r--gcc/testsuite/gcc.target/loongarch/trap-1.c9
-rw-r--r--gcc/testsuite/gcc.target/loongarch/trap-default.c9
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/pr122445.c26
-rw-r--r--gcc/testsuite/gfortran.dg/pdt_62.f0378
-rw-r--r--gcc/testsuite/gfortran.dg/pdt_63.f0326
-rw-r--r--gcc/testsuite/gfortran.dg/pdt_64.f0317
-rw-r--r--gcc/testsuite/gfortran.dg/pdt_65.f03135
-rw-r--r--gcc/testsuite/gfortran.dg/vect/pr70102.f21
-rw-r--r--gcc/testsuite/gm2.dg/spell/iso/fail/badimport.mod14
-rw-r--r--gcc/testsuite/gnat.dg/aggr32.adb15
-rw-r--r--gcc/testsuite/gnat.dg/aggr32_pkg-child.ads6
-rw-r--r--gcc/testsuite/gnat.dg/aggr32_pkg.ads8
-rw-r--r--gcc/testsuite/gnat.dg/specs/generic_inst6.ads6
-rw-r--r--gcc/testsuite/gnat.dg/specs/generic_inst6_pkg1-child-grand1.ads3
-rw-r--r--gcc/testsuite/gnat.dg/specs/generic_inst6_pkg1-child-grand2.ads6
-rw-r--r--gcc/testsuite/gnat.dg/specs/generic_inst6_pkg1-child.ads3
-rw-r--r--gcc/testsuite/gnat.dg/specs/generic_inst6_pkg1.ads3
-rw-r--r--gcc/testsuite/gnat.dg/specs/generic_inst6_pkg2.ads3
-rw-r--r--gcc/testsuite/gnat.dg/specs/generic_inst6_pkg3.ads4
-rw-r--r--gcc/testsuite/gnat.dg/specs/generic_inst7.ads17
-rw-r--r--gcc/testsuite/gnat.dg/specs/generic_inst8.ads18
-rw-r--r--gcc/testsuite/rust/compile/attr-macro.rs7
-rw-r--r--gcc/testsuite/rust/compile/attr_malformed_doc.rs3
-rw-r--r--gcc/testsuite/rust/compile/attr_malformed_path.rs3
-rw-r--r--gcc/testsuite/rust/compile/cfg-test.rs4
-rw-r--r--gcc/testsuite/rust/compile/enum_discriminant3.rs8
-rw-r--r--gcc/testsuite/rust/compile/format_args_concat.rs51
-rw-r--r--gcc/testsuite/rust/compile/global-path-array.rs5
-rw-r--r--gcc/testsuite/rust/compile/impl_fnptr.rs18
-rw-r--r--gcc/testsuite/rust/compile/import_wildcards.rs8
-rw-r--r--gcc/testsuite/rust/compile/issue-1725-2.rs3
-rw-r--r--gcc/testsuite/rust/compile/issue-2394.rs1
-rw-r--r--gcc/testsuite/rust/compile/issue-3538.rs9
-rw-r--r--gcc/testsuite/rust/compile/issue-3556.rs4
-rw-r--r--gcc/testsuite/rust/compile/issue-3592.rs7
-rw-r--r--gcc/testsuite/rust/compile/issue-3645.rs6
-rw-r--r--gcc/testsuite/rust/compile/issue-3726.rs17
-rw-r--r--gcc/testsuite/rust/compile/issue-3898.rs112
-rw-r--r--gcc/testsuite/rust/compile/issue-3922.rs12
-rw-r--r--gcc/testsuite/rust/compile/issue-3924.rs6
-rw-r--r--gcc/testsuite/rust/compile/issue-3928.rs12
-rw-r--r--gcc/testsuite/rust/compile/issue-3929-1.rs9
-rw-r--r--gcc/testsuite/rust/compile/issue-3929-2.rs12
-rw-r--r--gcc/testsuite/rust/compile/issue-3930.rs4
-rw-r--r--gcc/testsuite/rust/compile/issue-3947.rs10
-rw-r--r--gcc/testsuite/rust/compile/issue-3958.rs11
-rw-r--r--gcc/testsuite/rust/compile/issue-3965-1.rs4
-rw-r--r--gcc/testsuite/rust/compile/issue-3965-2.rs7
-rw-r--r--gcc/testsuite/rust/compile/issue-3966.rs5
-rw-r--r--gcc/testsuite/rust/compile/issue-3969.rs30
-rw-r--r--gcc/testsuite/rust/compile/issue-3974.rs8
-rw-r--r--gcc/testsuite/rust/compile/issue-4090-1.rs68
-rw-r--r--gcc/testsuite/rust/compile/issue-4090-2.rs71
-rw-r--r--gcc/testsuite/rust/compile/issue-4139.rs7
-rw-r--r--gcc/testsuite/rust/compile/issue-4145.rs13
-rw-r--r--gcc/testsuite/rust/compile/issue-4146.rs3
-rw-r--r--gcc/testsuite/rust/compile/issue-4148.rs26
-rw-r--r--gcc/testsuite/rust/compile/issue-4155.rs7
-rw-r--r--gcc/testsuite/rust/compile/issue-4165.rs12
-rw-r--r--gcc/testsuite/rust/compile/issue-4168.rs7
-rw-r--r--gcc/testsuite/rust/compile/issue-4212.rs5
-rw-r--r--gcc/testsuite/rust/compile/issue-4231.rs6
-rw-r--r--gcc/testsuite/rust/compile/macros/mbe/macro-issue4054.rs14
-rw-r--r--gcc/testsuite/rust/compile/macros/mbe/macro49.rs11
-rw-r--r--gcc/testsuite/rust/compile/macros/mbe/macro58.rs12
-rw-r--r--gcc/testsuite/rust/compile/match-tuplestructpattern-err.rs14
-rw-r--r--gcc/testsuite/rust/compile/match-tuplestructpattern-non-variant.rs20
-rw-r--r--gcc/testsuite/rust/compile/match-tuplestructpattern-rest.rs9
-rw-r--r--gcc/testsuite/rust/compile/parse_closure_bind.rs19
-rw-r--r--gcc/testsuite/rust/compile/parse_float_dot.rs3
-rw-r--r--gcc/testsuite/rust/compile/primitive-import.rs7
-rw-r--r--gcc/testsuite/rust/compile/slice_rest_pattern.rs3
-rw-r--r--gcc/testsuite/rust/compile/tuple_index_on_non_tuple.rs15
-rw-r--r--gcc/testsuite/rust/compile/tuplepattern-rest-readonly.rs5
-rw-r--r--gcc/testsuite/rust/compile/tuplepattern-restpattern-typecheck-err.rs8
-rw-r--r--gcc/testsuite/rust/compile/use_3.rs10
-rw-r--r--gcc/testsuite/rust/compile/use_self_alone.rs2
-rw-r--r--gcc/testsuite/rust/compile/use_self_alone_in_list.rs7
-rw-r--r--gcc/testsuite/rust/core/core.exp37
-rw-r--r--gcc/testsuite/rust/execute/inline_asm_inout_ident.rs1
-rw-r--r--gcc/testsuite/rust/execute/inline_asm_inout_var.rs1
-rw-r--r--gcc/testsuite/rust/execute/torture/let-identifierpattern-subpattern.rs11
-rw-r--r--gcc/testsuite/rust/execute/torture/link-name.rs16
-rw-r--r--gcc/testsuite/rust/execute/torture/match-slicepattern-array-2.rs27
-rw-r--r--gcc/testsuite/rust/execute/torture/match-slicepattern-slice-2.rs28
-rw-r--r--gcc/testsuite/rust/execute/torture/match-tuplestructpattern-rest-1.rs24
-rw-r--r--gcc/testsuite/rust/execute/torture/match-tuplestructpattern-rest-2.rs28
139 files changed, 2797 insertions, 34 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 40f1582..013121d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,477 @@
+2025-10-31 Tamar Christina <tamar.christina@arm.com>
+
+ PR target/121853
+ * gcc.target/aarch64/pr121853_1.c: New test.
+ * gcc.target/aarch64/pr121853_2.c: New test.
+
+2025-10-31 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/122452
+ * gfortran.dg/pdt_65.f03: New test.
+
+2025-10-31 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/122502
+ * gcc.dg/torture/pr122502.c: New testcase.
+
+2025-10-31 Andrew Pinski <andrew.pinski@oss.qualcomm.com>
+
+ * gcc.dg/tree-ssa/pr122478.c: Swap `1` and `"optimized"`.
+
+2025-10-31 Andrew Pinski <andrew.pinski@oss.qualcomm.com>
+
+ PR tree-optimization/122497
+ * gcc.dg/torture/pr122497-1.c: New test.
+
+2025-10-31 Lulu Cheng <chenglulu@loongson.cn>
+
+ * gcc.dg/vect/slp-widen-mult-half.c: Remove '-mlasx'.
+ * gcc.dg/vect/tree-vect.h: Check whether the runtime
+ environment supports LSX instructions.
+ * gcc.dg/vect/vect-widen-mult-const-s16.c: Dito.
+ * gcc.dg/vect/vect-widen-mult-const-u16.c: Dito.
+ * gcc.dg/vect/vect-widen-mult-half-u8.c: Dito.
+ * gcc.dg/vect/vect-widen-mult-half.c: Dito.
+ * gcc.dg/vect/vect-widen-mult-u16.c: Dito.
+ * gcc.dg/vect/vect-widen-mult-u8-s16-s32.c: Dito.
+ * gcc.dg/vect/vect-widen-mult-u8-u32.c: Dito.
+ * gcc.dg/vect/vect-widen-mult-u8.c: Dito.
+
+2025-10-30 Yap Zhi Heng <yapzhhg@gmail.com>
+
+ * rust/compile/tuplepattern-restpattern-typecheck-err.rs: New file.
+
+2025-10-30 Ryo Yoshida <low.ryoshida@gmail.com>
+
+ * rust/compile/match-tuplestructpattern-non-variant.rs: New test.
+
+2025-10-30 Yap Zhi Heng <yapzhhg@gmail.com>
+
+ * rust/compile/issue-4231.rs: New file.
+
+2025-10-30 Lucas Ly Ba <lucas.ly-ba@outlook.fr>
+
+ * rust/compile/issue-4212.rs: New test.
+
+2025-10-30 lishin <lishin1008@gmail.com>
+
+ * rust/compile/issue-3556.rs: New test.
+
+2025-10-30 Ryo Yoshida <low.ryoshida@gmail.com>
+
+ * rust/compile/tuple_index_on_non_tuple.rs: New test.
+
+2025-10-30 0xllx0 <github+elle@weathered-steel.dev>
+
+ * rust/compile/issue-4145.rs: New test.
+
+2025-10-30 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * rust/compile/attr_malformed_doc.rs: New test.
+
+2025-10-30 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * rust/compile/attr_malformed_path.rs: New test.
+
+2025-10-30 Yap Zhi Heng <yapzhhg@gmail.com>
+
+ * rust/compile/match-tuplestructpattern-err.rs: New file.
+
+2025-10-30 Yap Zhi Heng <yapzhhg@gmail.com>
+
+ * rust/compile/match-tuplestructpattern-rest.rs: New file.
+ * rust/execute/torture/match-tuplestructpattern-rest-1.rs: New file.
+ * rust/execute/torture/match-tuplestructpattern-rest-2.rs: New file.
+
+2025-10-30 0xllx0 <github+elle@weathered-steel.dev>
+
+ * rust/compile/issue-4148.rs: New test.
+
+2025-10-30 Owen Avery <powerboat9.gamer@gmail.com>
+
+ * rust/core/core.exp: New test.
+
+2025-10-30 Yap Zhi Heng <yapzhhg@gmail.com>
+
+ * rust/compile/issue-3929-1.rs: New file.
+ * rust/compile/issue-3929-2.rs: New file.
+
+2025-10-30 Owen Avery <powerboat9.gamer@gmail.com>
+
+ * rust/execute/torture/link-name.rs: New test.
+
+2025-10-30 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * rust/compile/macros/mbe/macro58.rs: New test.
+
+2025-10-30 Philip Herron <herron.philip@googlemail.com>
+
+ * rust/compile/issue-3538.rs: New test.
+
+2025-10-30 Philip Herron <herron.philip@googlemail.com>
+
+ * rust/compile/issue-3592.rs: New test.
+
+2025-10-30 Philip Herron <herron.philip@googlemail.com>
+
+ * rust/compile/issue-4165.rs: New test.
+
+2025-10-30 Philip Herron <herron.philip@googlemail.com>
+
+ * rust/compile/issue-4090-1.rs: New test.
+ * rust/compile/issue-4090-2.rs: New test.
+
+2025-10-30 Philip Herron <herron.philip@googlemail.com>
+
+ * rust/compile/issue-4168.rs: New test.
+
+2025-10-30 Philip Herron <herron.philip@googlemail.com>
+
+ * rust/compile/issue-2394.rs: Update test case
+ * rust/compile/issue-4146.rs: New test.
+
+2025-10-30 Philip Herron <herron.philip@googlemail.com>
+
+ * rust/compile/issue-4139.rs: New test.
+
+2025-10-30 Owen Avery <powerboat9.gamer@gmail.com>
+
+ * rust/compile/issue-4155.rs: New test.
+
+2025-10-30 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * rust/compile/issue-3922.rs: New test.
+
+2025-10-30 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * rust/compile/issue-3924.rs: New test.
+
+2025-10-30 Philip Herron <herron.philip@googlemail.com>
+
+ * rust/compile/issue-3969.rs: New test.
+
+2025-10-30 Philip Herron <herron.philip@googlemail.com>
+
+ * rust/compile/issue-3965-1.rs: New test.
+ * rust/compile/issue-3965-2.rs: New test.
+
+2025-10-30 Yap Zhi Heng <yapzhhg@gmail.com>
+
+ * rust/compile/tuplepattern-rest-readonly.rs: New file.
+
+2025-10-30 Yap Zhi Heng <yapzhhg@gmail.com>
+
+ * rust/compile/issue-3930.rs: New file.
+
+2025-10-30 Philip Herron <herron.philip@googlemail.com>
+
+ * rust/compile/issue-1725-2.rs: remove bad error message
+
+2025-10-30 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * rust/compile/use_self_alone_in_list.rs: New test.
+
+2025-10-30 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * rust/compile/use_self_alone.rs: New test.
+
+2025-10-30 Owen Avery <powerboat9.gamer@gmail.com>
+
+ * rust/compile/primitive-import.rs: New test.
+
+2025-10-30 Owen Avery <powerboat9.gamer@gmail.com>
+
+ * rust/compile/parse_float_dot.rs: New test.
+
+2025-10-30 Owen Avery <powerboat9.gamer@gmail.com>
+
+ * rust/compile/format_args_concat.rs: New test.
+
+2025-10-30 Owen Avery <powerboat9.gamer@gmail.com>
+
+ * rust/compile/global-path-array.rs: New test.
+
+2025-10-30 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * rust/compile/impl_fnptr.rs: New test.
+
+2025-10-30 Owen Avery <powerboat9.gamer@gmail.com>
+
+ * rust/compile/parse_closure_bind.rs: New test.
+
+2025-10-30 lishin <lishin1008@gmail.com>
+
+ * rust/compile/issue-3645.rs: New test.
+
+2025-10-30 Yap Zhi Heng <yapzhhg@gmail.com>
+
+ * rust/compile/slice_rest_pattern.rs: Removed -fsyntax-only.
+ * rust/execute/torture/match-slicepattern-array-2.rs: New file.
+ * rust/execute/torture/match-slicepattern-slice-2.rs: New file.
+
+2025-10-30 Yap Zhi Heng <yapzhhg@gmail.com>
+
+ * rust/execute/torture/let-identifierpattern-subpattern.rs: New file.
+
+2025-10-30 lishin <lishin1008@gmail.com>
+
+ * rust/compile/issue-3958.rs: New test.
+
+2025-10-30 lishin <lishin1008@gmail.com>
+
+ * rust/compile/issue-3947.rs: New test.
+
+2025-10-30 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * rust/compile/issue-3966.rs: New test.
+
+2025-10-30 Owen Avery <powerboat9.gamer@gmail.com>
+
+ * rust/compile/use_3.rs: New test.
+
+2025-10-30 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * rust/compile/issue-3974.rs: New test.
+
+2025-10-30 Arthur Cohen <arthur.cohen@embecosm.com>
+
+ * rust/compile/issue-3726.rs: New test.
+ * rust/compile/issue-3898.rs: New test.
+
+2025-10-30 Owen Avery <powerboat9.gamer@gmail.com>
+
+ * rust/compile/macros/mbe/macro-issue4054.rs: New test.
+
+2025-10-30 Ryutaro Okada <1015ryu88@gmail.com>
+
+ * rust/compile/enum_discriminant3.rs: New test.
+
+2025-10-30 Owen Avery <powerboat9.gamer@gmail.com>
+
+ * rust/compile/cfg-test.rs: New test.
+
+2025-10-30 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * rust/compile/import_wildcards.rs: New test.
+
+2025-10-30 Owen Avery <powerboat9.gamer@gmail.com>
+
+ * rust/compile/macros/mbe/macro49.rs: Add missing lang items.
+
+2025-10-30 lishin <lishin1008@gmail.com>
+
+ * rust/compile/issue-3928.rs: New test.
+
+2025-10-30 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
+
+ * rust/execute/inline_asm_inout_ident.rs: Add arch filter on test.
+ * rust/execute/inline_asm_inout_var.rs: Likewise.
+
+2025-10-30 Owen Avery <powerboat9.gamer@gmail.com>
+
+ * rust/compile/attr-macro.rs: New test.
+
+2025-10-30 David Faust <david.faust@oracle.com>
+
+ PR debug/122248
+ * gcc.dg/debug/dwarf2/dwarf-btf-decl-tag-4.c: New.
+ * gcc.dg/debug/dwarf2/dwarf-btf-decl-tag-5.c: New.
+ * gcc.dg/debug/dwarf2/dwarf-btf-decl-tag-6.c: New.
+
+2025-10-30 David Faust <david.faust@oracle.com>
+
+ * gcc.dg/debug/btf/btf-prune-4.c: New.
+
+2025-10-30 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc.dg/cpp/escape-3.i: Remove parentheses in dg-scan directive.
+
+2025-10-30 Qing Zhao <qing.zhao@oracle.com>
+
+ * gcc.dg/pointer-counted-by.c: Update for void pointers.
+ * gcc.dg/pointer-counted-by-10.c: New test.
+ * gcc.dg/pointer-counted-by-4-void.c: New test.
+
+2025-10-30 Andrew Pinski <andrew.pinski@oss.qualcomm.com>
+
+ PR target/116075
+ * gcc.target/aarch64/sve/dup-insr-1.c: New test.
+ * gcc.target/aarch64/sve/dup-insr-2.c: New test.
+
+2025-10-30 Andrew Pinski <andrew.pinski@oss.qualcomm.com>
+
+ PR tree-optimization/122247
+ * g++.dg/tree-ssa/copy-prop-aggregate-sra-2.C: New test.
+
+2025-10-30 Andrew Pinski <andrew.pinski@oss.qualcomm.com>
+
+ PR tree-optimization/122247
+ * g++.dg/tree-ssa/copy-prop-aggregate-sra-1.C: New test.
+
+2025-10-30 Robin Dapp <rdapp@ventanamicro.com>
+
+ * gcc.dg/tree-ssa/ctz-char.c: Remove -fno-tree-ch.
+ * gcc.dg/tree-ssa/ctz-complement-char.c: Ditto.
+ * gcc.dg/tree-ssa/ctz-complement-int.c: Ditto.
+ * gcc.dg/tree-ssa/ctz-complement-long-long.c: Ditto.
+ * gcc.dg/tree-ssa/ctz-complement-long.c: Ditto.
+ * gcc.dg/tree-ssa/ctz-int.c: Ditto.
+ * gcc.dg/tree-ssa/ctz-long-long.c: Ditto.
+ * gcc.dg/tree-ssa/ctz-long.c: Ditto.
+ * gcc.dg/tree-ssa/ctz-ch.c: New test.
+ * gcc.dg/pr41488.c: Add -fno-tree-scev-cprop.
+
+2025-10-30 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/specs/generic_inst7.ads: New test.
+ * gnat.dg/specs/generic_inst8.ads: New test.
+
+2025-10-30 Robin Dapp <rdapp.gcc@gmail.com>
+
+ PR target/122445
+ * gcc.target/riscv/rvv/autovec/pr122445.c: New test.
+
+2025-10-30 Artemiy Volkov <artemiy.volkov@arm.com>
+
+ PR tree-optimization/122478
+ * gcc.dg/tree-ssa/pr122478.c: New test.
+
+2025-10-30 Richard Biener <rguenther@suse.de>
+
+ * gcc.dg/tree-ssa/pr92834.c: Scan phiopt1 instead of optimized.
+
+2025-10-30 Stefan Schulze Frielinghaus <stefansf@gcc.gnu.org>
+
+ PR rtl-optimization/121198
+ * gcc.target/avr/pr121198.c: New test.
+
+2025-10-30 Gaius Mulley <gaiusmod2@gmail.com>
+
+ PR modula2/122485
+ * gm2.dg/spell/iso/fail/badimport.mod: New test.
+
+2025-10-30 Richard Biener <rguenther@suse.de>
+ Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc.dg/vect/slp-reduc-13.c: New testcase.
+
+2025-10-30 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/116815
+ * gcc.dg/pr116815.c: New test.
+ * gcc.target/i386/pr116815.c: New test.
+
+2025-10-30 Andrew Pinski <andrew.pinski@oss.qualcomm.com>
+
+ * c-c++-common/ubsan/align-5.c: Xfail.
+ * gcc.dg/pr107389.c: Move to...
+ * gcc.dg/torture/pr107389.c: ...here. Skip for lto.
+ * gcc.dg/builtin-assume-aligned-1.c: Instead of
+ testing for deleting of assume-align, test for
+ the alignment/misalignment. Also disable the
+ vectorizer.
+
+2025-10-30 Andrew Pinski <andrew.pinski@oss.qualcomm.com>
+
+ Revert:
+ 2025-10-30 Andrew Pinski <andrew.pinski@oss.qualcomm.com>
+
+ PR middle-end/107389
+ PR tree-optimization/122086
+ * gcc.dg/pr107389.c: Move to...
+ * gcc.dg/torture/pr107389.c: ...here. Skip for lto.
+ Use dg-additional-options rather than dg-options.
+ * c-c++-common/ubsan/align-5.c: xfail.
+
+2025-10-30 liuhongt <hongtao.liu@intel.com>
+
+ * gcc.target/i386/pr122457.c: New test.
+
+2025-10-30 Guo Jie <guojie@loongson.cn>
+
+ * gcc.target/loongarch/fnmam4-vec.c: New test.
+
+2025-10-30 Jinyang He <hejinyang@loongson.cn>
+ Peng Fan <fanpeng@loongson.cn>
+
+ * gcc.target/loongarch/conditional-move-opt-1.c: Remove mul.
+ * gcc.target/loongarch/conditional-move-opt-2.c: Remove and.
+ * gcc.target/loongarch/conditional-move-opt-3.c: New test.
+
+2025-10-30 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/aggr32.adb: New test.
+ * gnat.dg/aggr32_pkg.ads: New helper.
+ * gnat.dg/aggr32_pkg-child.ads: Likewise.
+
+2025-10-30 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/specs/generic_inst6.ads: New test.
+ * gnat.dg/specs/generic_inst6_pkg1-child.ads: New helper.
+ * gnat.dg/specs/generic_inst6_pkg1-child-grand1.ads: Likewise.
+ * gnat.dg/specs/generic_inst6_pkg1-child-grand2.ads: Likewise.
+ * gnat.dg/specs/generic_inst6_pkg1.ads: Likewise.
+ * gnat.dg/specs/generic_inst6_pkg2.ads: Likewise.
+ * gnat.dg/specs/generic_inst6_pkg3.ads: Likewise.
+
+2025-10-29 Andrew MacLeod <amacleod@redhat.com>
+
+ PR tree-optimization/91191
+ * gcc.dg/pr91191.c: New.
+
+2025-10-29 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/122165
+ * gfortran.dg/pdt_64.f03: New test.
+
+2025-10-29 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/70102
+ * gfortran.dg/vect/pr70102.f: New testcase.
+
+2025-10-29 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/122433
+ PR fortran/122434
+ * gfortran.dg/pdt_62.f03: New test.
+ * gfortran.dg/pdt_63.f03: New test.
+
+2025-10-29 Lulu Cheng <chenglulu@loongson.cn>
+
+ PR target/122097
+ * gcc.target/loongarch/pr122097.c: New test.
+
+2025-10-29 Xi Ruoyao <xry111@xry111.site>
+
+ * gcc.target/loongarch/trap-default.c: New test.
+ * gcc.target/loongarch/trap-1.c: New test.
+
+2025-10-28 Yuao Ma <c8ef@outlook.com>
+
+ PR fortran/122342
+ * gfortran.dg/coarray_atomic_5.f90: Update testcase.
+ * gfortran.dg/team_form_3.f90: Likewise.
+
+2025-10-28 Artemiy Volkov <artemiy.volkov@arm.com>
+
+ * gcc.dg/tree-ssa/forwprop-42.c: New test.
+
+2025-10-28 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/specs/generic_inst5.ads: New test.
+ * gnat.dg/specs/generic_inst5_pkg1.ads: New helper.
+ * gnat.dg/specs/generic_inst5_pkg2.ads: Likewise.
+
+2025-10-28 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/specs/generic_inst4-child2.ads: New test.
+ * gnat.dg/specs/generic_inst4.ads: New helper.
+ * gnat.dg/specs/generic_inst4-child1.ads: Likewise.
+
+2025-10-28 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/specs/generic_inst3.ads: Add dg-do directive.
+
2025-10-27 Nathaniel Shead <nathanieloshead@gmail.com>
PR c++/122422
diff --git a/gcc/testsuite/g++.dg/tree-ssa/copy-prop-aggregate-sra-1.C b/gcc/testsuite/g++.dg/tree-ssa/copy-prop-aggregate-sra-1.C
new file mode 100644
index 0000000..52f1779
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/copy-prop-aggregate-sra-1.C
@@ -0,0 +1,33 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-forwprop1-details -fdump-tree-esra-details -fexceptions" } */
+
+/* PR tree-optimization/122247 */
+
+struct s1
+{
+ int t[1024];
+};
+
+struct s1 f(void);
+
+void g(int a, int b, int );
+void p(struct s1);
+void h(struct s1 outer)
+{
+ {
+ struct s1 inner = outer;
+ p(inner);
+ }
+ g(outer.t[0], outer.t[1], outer.t[2]);
+}
+/* Forwprop should be able to copy prop the copy of `inner = outer` to the call of p.
+ Also remove this copy. */
+
+/* { dg-final { scan-tree-dump-times "after previous" 1 "forwprop1" } } */
+/* { dg-final { scan-tree-dump-times "Removing dead store stmt inner = outer" 1 "forwprop1" } } */
+
+/* The extra copy that was done by inlining is removed so SRA should not decide to cause
+ inner nor outer to be scalarized even for the 3 elements accessed afterwards. */
+/* { dg-final { scan-tree-dump-times "Disqualifying inner" 1 "esra" } } */
+/* { dg-final { scan-tree-dump-times "Disqualifying outer" 1 "esra" } } */
+
diff --git a/gcc/testsuite/g++.dg/tree-ssa/copy-prop-aggregate-sra-2.C b/gcc/testsuite/g++.dg/tree-ssa/copy-prop-aggregate-sra-2.C
new file mode 100644
index 0000000..0b05d5d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/copy-prop-aggregate-sra-2.C
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-forwprop1-details -fdump-tree-esra-details -fexceptions" } */
+
+/* PR tree-optimization/122247 */
+
+struct s1
+{
+ int t[1024];
+};
+
+struct s1 f(void);
+
+void g(int a, int b, int );
+void p(struct s1);
+void h(struct s1 outer)
+{
+ struct s1 inner = outer;
+ p(inner);
+ g(outer.t[0], outer.t[1], outer.t[2]);
+}
+/* Forwprop should be able to copy prop the copy of `inner = outer` to the call of p.
+ Also remove this copy. */
+
+/* { dg-final { scan-tree-dump-times "after previous" 1 "forwprop1" } } */
+/* { dg-final { scan-tree-dump-times "Removing dead store stmt inner = outer" 1 "forwprop1" } } */
+
+/* The extra copy that was done by inlining is removed so SRA should not decide to cause
+ inner nor outer to be scalarized even for the 3 elements accessed afterwards. */
+/* { dg-final { scan-tree-dump-times "Disqualifying inner" 1 "esra" } } */
+/* { dg-final { scan-tree-dump-times "Disqualifying outer" 1 "esra" } } */
+
diff --git a/gcc/testsuite/gcc.dg/builtin-assume-aligned-1.c b/gcc/testsuite/gcc.dg/builtin-assume-aligned-1.c
index a74ecce..01aa884 100644
--- a/gcc/testsuite/gcc.dg/builtin-assume-aligned-1.c
+++ b/gcc/testsuite/gcc.dg/builtin-assume-aligned-1.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O3 -fdump-tree-optimized" } */
+/* { dg-options "-O3 -fno-tree-vectorize -fdump-tree-optimized-alias" } */
void
test1 (double *out1, double *out2, double *out3, double *in1,
@@ -19,6 +19,8 @@ test1 (double *out1, double *out2, double *out3, double *in1,
}
}
+/* { dg-final { scan-tree-dump-times " ALIGN = 16, MISALIGN = 0" 5 "optimized" } } */
+
void
test2 (double *out1, double *out2, double *out3, double *in1,
double *in2, int len)
@@ -37,4 +39,8 @@ test2 (double *out1, double *out2, double *out3, double *in1,
}
}
-/* { dg-final { scan-tree-dump-not "__builtin_assume_aligned" "optimized" } } */
+
+/* { dg-final { scan-tree-dump-times " ALIGN = 32" 5 "optimized" } } */
+/* { dg-final { scan-tree-dump-times " ALIGN = 32, MISALIGN = 16" 4 "optimized" } } */
+/* { dg-final { scan-tree-dump-times " ALIGN = 32, MISALIGN = 0" 1 "optimized" } } */
+
diff --git a/gcc/testsuite/gcc.dg/cpp/escape-3.i b/gcc/testsuite/gcc.dg/cpp/escape-3.i
index 6eb7dc4..cb47581 100644
--- a/gcc/testsuite/gcc.dg/cpp/escape-3.i
+++ b/gcc/testsuite/gcc.dg/cpp/escape-3.i
@@ -13,4 +13,4 @@ int foo (int a, int b)
}
/* Test for "/some\\directory" instead of "/some\\\\directory" */
-/* { dg-final { scan-assembler { "/some\\\\directory" } } } */
+/* { dg-final { scan-assembler "/some\\\\\\\\directory" } } */
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-prune-4.c b/gcc/testsuite/gcc.dg/debug/btf/btf-prune-4.c
new file mode 100644
index 0000000..3f19559
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-prune-4.c
@@ -0,0 +1,61 @@
+/* Test that -gprune-btf does not prune at typedefs. */
+
+/* { dg-do compile } */
+/* { dg-options "-gbtf -gprune-btf -dA" } */
+
+/* We must have the full definitions of td1 and td3. Neither are pruned.
+ td2 will be skipped entirely, only because the only reference to
+ it is through struct inner, which is pruned because inner itself
+ is only used as a pointer member.
+
+ In general, we must never get an anonymous FWD; the only FWD in this
+ case will be for 'inner' */
+
+/* Exactly 1 FWD for inner and no anonymous FWD. */
+/* { dg-final { scan-assembler-times "TYPE \[0-9\]+ BTF_KIND_FWD" 1 } } */
+/* { dg-final { scan-assembler-not "TYPE \[0-9\]+ BTF_KIND_FWD ''" } } */
+/* { dg-final { scan-assembler " BTF_KIND_FWD 'inner'" } } */
+
+/* One anonymous struct for td1 and one anonymous union for td3. */
+/* { dg-final { scan-assembler-times "TYPE \[0-9\]+ BTF_KIND_STRUCT ''" 1 } } */
+/* { dg-final { scan-assembler-times "TYPE \[0-9\]+ BTF_KIND_UNION ''" 1 } } */
+
+/* The two remaining typedefs. */
+/* { dg-final { scan-assembler " BTF_KIND_TYPEDEF 'td1'" } } */
+/* { dg-final { scan-assembler " BTF_KIND_TYPEDEF 'td3'" } } */
+
+typedef struct {
+ int x;
+ char c;
+} td1;
+
+typedef struct {
+ long l;
+ char b[4];
+} td2;
+
+typedef union {
+ long l;
+ unsigned short s[2];
+} td3;
+
+struct inner {
+ char a;
+ td2 *ptd;
+ long z;
+};
+
+struct A {
+ td1 *pt;
+ struct inner *in;
+ unsigned long l[4];
+};
+
+struct A foo;
+
+struct B {
+ int x;
+ td3 **ppptd3;
+};
+
+struct B bar;
diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/dwarf-btf-decl-tag-4.c b/gcc/testsuite/gcc.dg/debug/dwarf2/dwarf-btf-decl-tag-4.c
new file mode 100644
index 0000000..6fdcdc6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/debug/dwarf2/dwarf-btf-decl-tag-4.c
@@ -0,0 +1,28 @@
+/* Test DWARF generation for decl_tags on global decls appearing multiple
+ times with different decl_tags. PR122248. */
+/* { dg-do compile } */
+/* { dg-options "-gdwarf -dA" } */
+
+#define __tag1 __attribute__((btf_decl_tag ("tag1")))
+#define __tag2 __attribute__((btf_decl_tag ("tag2")))
+#define __tag3 __attribute__((btf_decl_tag ("tag3")))
+#define __tag4 __attribute__((btf_decl_tag ("tag4")))
+
+int foo __tag1;
+int foo __tag2;
+
+/* Result: foo has __tag1 and __tag2. */
+
+int bar __tag3;
+int bar;
+
+/* Result: bar has __tag3. */
+
+int baz;
+int baz __tag4;
+
+/* Result: baz has __tag4. */
+
+/* { dg-final { scan-assembler-times "DIE \\(\[^\n\]*\\) DW_TAG_GNU_annotation" 4 } } */
+/* { dg-final { scan-assembler-times " DW_AT_GNU_annotation" 4 } } */
+
diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/dwarf-btf-decl-tag-5.c b/gcc/testsuite/gcc.dg/debug/dwarf2/dwarf-btf-decl-tag-5.c
new file mode 100644
index 0000000..c7cb60c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/debug/dwarf2/dwarf-btf-decl-tag-5.c
@@ -0,0 +1,35 @@
+/* Test DWARF generation for decl_tags on global decls appearing multiple
+ times with different decl_tags. PR122248. */
+/* { dg-do compile } */
+/* { dg-options "-gdwarf -dA" } */
+
+#define __tag1 __attribute__((btf_decl_tag ("tag1")))
+#define __tag2 __attribute__((btf_decl_tag ("tag2")))
+#define __tag3 __attribute__((btf_decl_tag ("tag3")))
+
+struct S
+{
+ int x;
+ char c;
+};
+
+extern struct S foo __tag1;
+struct S foo __tag2;
+
+/* Result: non-completing variable DIE for 'foo' has tag1, and the
+ completing DIE (with AT_specification) for 'foo' has tag2 -> tag1. */
+
+extern int a __tag3;
+int a;
+
+/* Result: non-completing variable DIE for a has tag3, and the
+ completing DIE (with AT_specification) for 'a' also refers to tag3. */
+
+/* { dg-final { scan-assembler-times "DIE \\(\[^\n\]*\\) DW_TAG_GNU_annotation" 3 } } */
+
+/* 5 AT_GNU annotations:
+ - foo -> tag1
+ - foo -> tag2 -> tag1
+ - a -> tag3
+ - a -> tag3 */
+/* { dg-final { scan-assembler-times " DW_AT_GNU_annotation" 5 } } */
diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/dwarf-btf-decl-tag-6.c b/gcc/testsuite/gcc.dg/debug/dwarf2/dwarf-btf-decl-tag-6.c
new file mode 100644
index 0000000..dd89d11
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/debug/dwarf2/dwarf-btf-decl-tag-6.c
@@ -0,0 +1,24 @@
+/* Test DWARF generation for decl_tags on global decls appearing multiple
+ times with different decl_tags. PR122248. */
+/* { dg-do compile } */
+/* { dg-options "-gdwarf -dA" } */
+
+#define __tag1 __attribute__((btf_decl_tag ("tag1")))
+#define __tag2 __attribute__((btf_decl_tag ("tag2")))
+#define __tag3 __attribute__((btf_decl_tag ("tag3")))
+
+__tag1
+extern int
+do_thing (int);
+
+__tag2
+__tag3
+int
+do_thing (int x)
+{
+ return x * x;
+}
+
+/* Result: do_thing has all 3 tags. */
+/* { dg-final { scan-assembler-times "DIE \\(\[^\n\]*\\) DW_TAG_GNU_annotation" 3 } } */
+/* { dg-final { scan-assembler-times " DW_AT_GNU_annotation" 3 } } */
diff --git a/gcc/testsuite/gcc.dg/fold-vecperm-1.c b/gcc/testsuite/gcc.dg/fold-vecperm-1.c
index 5d4456b..878d392 100644
--- a/gcc/testsuite/gcc.dg/fold-vecperm-1.c
+++ b/gcc/testsuite/gcc.dg/fold-vecperm-1.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-optimized" } */
+/* { dg-options "-O2 -fdump-tree-forwprop3" } */
typedef int v4si __attribute__((vector_size(16)));
typedef short v8hi __attribute__((vector_size(16)));
@@ -20,4 +20,4 @@ int128 concat (int128 a, int128 b) {
return res;
}
-/* { dg-final { scan-tree-dump-times "VEC_PERM_EXPR" 1 "optimized" } } */
+/* { dg-final { scan-tree-dump-times "VEC_PERM_EXPR" 1 "forwprop3" } } */
diff --git a/gcc/testsuite/gcc.dg/pointer-counted-by-10.c b/gcc/testsuite/gcc.dg/pointer-counted-by-10.c
new file mode 100644
index 0000000..e2bd018
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pointer-counted-by-10.c
@@ -0,0 +1,8 @@
+/* Testing the correct usage of attribute counted_by for pointer to void. */
+/* { dg-do compile } */
+/* { dg-options "-O0 -Wpointer-arith" } */
+
+struct pointer_array {
+ int count;
+ void *array __attribute__ ((counted_by (count))); /* { dg-warning "attribute is used for a pointer to void" } */
+};
diff --git a/gcc/testsuite/gcc.dg/pointer-counted-by-4-void.c b/gcc/testsuite/gcc.dg/pointer-counted-by-4-void.c
new file mode 100644
index 0000000..71bac95
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pointer-counted-by-4-void.c
@@ -0,0 +1,6 @@
+/* Test the attribute counted_by for pointer field and its usage in
+ * __builtin_dynamic_object_size. */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+#define PTR_TYPE void
+#include "pointer-counted-by-4.c"
diff --git a/gcc/testsuite/gcc.dg/pointer-counted-by.c b/gcc/testsuite/gcc.dg/pointer-counted-by.c
index 0f18828..5e9ebef 100644
--- a/gcc/testsuite/gcc.dg/pointer-counted-by.c
+++ b/gcc/testsuite/gcc.dg/pointer-counted-by.c
@@ -49,9 +49,10 @@ struct pointer_array_6 {
int *array_6 __attribute__ ((counted_by (days)));
};
+/* counted_by is allowed for pointer to void when GNU extension is enabled. */
struct pointer_array_7 {
int count;
- void *array_7 __attribute__ ((counted_by (count))); /* { dg-error "attribute is not allowed for a pointer to void" } */
+ void *array_7 __attribute__ ((counted_by (count)));
};
struct pointer_array_8 {
diff --git a/gcc/testsuite/gcc.dg/pr116815.c b/gcc/testsuite/gcc.dg/pr116815.c
new file mode 100644
index 0000000..b5f1330
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr116815.c
@@ -0,0 +1,57 @@
+/* PR target/116815 */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+[[gnu::always_inline]]
+inline unsigned min (unsigned a, unsigned b)
+{
+ return (a < b) ? a : b;
+}
+
+[[gnu::always_inline]]
+inline unsigned max (unsigned a, unsigned b)
+{
+ return (a > b) ? a : b;
+}
+
+[[gnu::noipa]] unsigned
+umaxadd (unsigned a, unsigned b)
+{
+ return max (a + b, a);
+}
+
+[[gnu::noipa]] unsigned
+umaxsub (unsigned a, unsigned b)
+{
+ return max (a - b, a);
+}
+
+[[gnu::noipa]] unsigned
+uminadd (unsigned a, unsigned b)
+{
+ return min (a + b, a);
+}
+
+[[gnu::noipa]] unsigned
+uminsub (unsigned a, unsigned b)
+{
+ return min (a - b, a);
+}
+
+int
+main ()
+{
+ /* Overflows to 0x30000000. */
+ if (umaxadd (0x90000000, 0xa0000000) != 0x90000000)
+ __builtin_abort ();
+
+ if (uminadd (0x90000000, 0xa0000000) != 0x30000000)
+ __builtin_abort ();
+
+ /* Underflows to 0x60000000. */
+ if (umaxsub (0x00000000, 0xa0000000) != 0x60000000)
+ __builtin_abort ();
+
+ if (uminsub (0x00000000, 0xa0000000) != 0x00000000)
+ __builtin_abort ();
+}
diff --git a/gcc/testsuite/gcc.dg/pr41488.c b/gcc/testsuite/gcc.dg/pr41488.c
index 1e4bf19..a7ba367 100644
--- a/gcc/testsuite/gcc.dg/pr41488.c
+++ b/gcc/testsuite/gcc.dg/pr41488.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-ivcanon-scev" } */
+/* { dg-options "-O2 -fno-tree-scev-cprop -fdump-tree-ivcanon-scev" } */
struct struct_t
{
diff --git a/gcc/testsuite/gcc.dg/pr91191.c b/gcc/testsuite/gcc.dg/pr91191.c
new file mode 100644
index 0000000..7bf727e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr91191.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-evrp" } */
+
+unsigned char reg(_Bool b) {
+ union U {
+ unsigned char f0;
+ _Bool f1;
+ };
+ union U u;
+ u.f1 = b;
+ if (u.f0 > 1) {
+ // This cannot happen
+ // if b is only allowed
+ // to be 0 or 1:
+ return 42;
+ }
+ return 13;
+}
+
+/* { dg-final { scan-tree-dump "return 13" "evrp" } } */
diff --git a/gcc/testsuite/gcc.dg/torture/pr122497-1.c b/gcc/testsuite/gcc.dg/torture/pr122497-1.c
new file mode 100644
index 0000000..8b027ca
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr122497-1.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* PR tree-optimization/122497 */
+
+/* This was ICEing during SCCP
+ trying to simplify a reference back to the phi
+ which was removed. */
+
+char g_2[1][2];
+int g_4, g_5;
+void main() {
+ for (; g_4; g_4 -= 1)
+ g_5 = g_2[g_4 + 2][g_4];
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr122502.c b/gcc/testsuite/gcc.dg/torture/pr122502.c
new file mode 100644
index 0000000..5e2cb2e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr122502.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+
+short int *ts;
+
+void
+c2 (unsigned long long int s4, int ns)
+{
+ short int *b2 = (short int *)&ns;
+
+ while (ns != 0)
+ {
+ int xn;
+
+ for (xn = 0; xn < 3; ++xn)
+ for (*b2 = 0; *b2 < 2; ++*b2)
+ s4 += xn;
+ if (s4 != 0)
+ b2 = ts;
+ ++ns;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ctz-ch.c b/gcc/testsuite/gcc.dg/tree-ssa/ctz-ch.c
new file mode 100644
index 0000000..5d72597
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ctz-ch.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+typedef unsigned long BITMAP_WORD;
+
+bool
+bmp_iter_set (BITMAP_WORD bits, unsigned *bit_no)
+{
+ /* If our current word is nonzero, it contains the bit we want. */
+ if (bits)
+ {
+ while (!(bits & 1))
+ {
+ bits >>= 1;
+ *bit_no += 1;
+ }
+ return true;
+ }
+
+ return false;
+}
+
+/* { dg-final { scan-tree-dump-times "__builtin_ctz|\\.CTZ" 1 "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ctz-char.c b/gcc/testsuite/gcc.dg/tree-ssa/ctz-char.c
index 3cd166a..fa8b7f3 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ctz-char.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ctz-char.c
@@ -1,6 +1,6 @@
/* { dg-do run } */
/* { dg-require-effective-target ctz } */
-/* { dg-options "-O2 -fno-tree-ch -fdump-tree-optimized" } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
#define PREC (__CHAR_BIT__)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ctz-complement-char.c b/gcc/testsuite/gcc.dg/tree-ssa/ctz-complement-char.c
index b9afe88..5ebc321 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ctz-complement-char.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ctz-complement-char.c
@@ -1,6 +1,6 @@
/* { dg-do run } */
/* { dg-require-effective-target ctz } */
-/* { dg-options "-O2 -fdump-tree-optimized" } */
+/* { dg-options "-O2 -fno-tree-ch -fdump-tree-optimized" } */
#define PREC (__CHAR_BIT__)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ctz-complement-int.c b/gcc/testsuite/gcc.dg/tree-ssa/ctz-complement-int.c
index d2702a6..0ce4b6b 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ctz-complement-int.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ctz-complement-int.c
@@ -1,6 +1,6 @@
/* { dg-do run } */
/* { dg-require-effective-target ctz } */
-/* { dg-options "-O2 -fdump-tree-optimized" } */
+/* { dg-options "-O2 -fno-tree-ch -fdump-tree-optimized" } */
#define PREC (__CHAR_BIT__ * __SIZEOF_INT__)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ctz-complement-long-long.c b/gcc/testsuite/gcc.dg/tree-ssa/ctz-complement-long-long.c
index 1ea0d5d..f98bec0 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ctz-complement-long-long.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ctz-complement-long-long.c
@@ -1,6 +1,6 @@
/* { dg-do run } */
/* { dg-require-effective-target ctzll } */
-/* { dg-options "-O2 -fdump-tree-optimized" } */
+/* { dg-options "-O2 -fno-tree-ch -fdump-tree-optimized" } */
#define PREC (__CHAR_BIT__ * __SIZEOF_LONG_LONG__)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ctz-complement-long.c b/gcc/testsuite/gcc.dg/tree-ssa/ctz-complement-long.c
index 80fb02d..8edb372 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ctz-complement-long.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ctz-complement-long.c
@@ -1,6 +1,6 @@
/* { dg-do run } */
/* { dg-require-effective-target ctzl } */
-/* { dg-options "-O2 -fdump-tree-optimized" } */
+/* { dg-options "-O2 -fno-tree-ch -fdump-tree-optimized" } */
#define PREC (__CHAR_BIT__ * __SIZEOF_LONG__)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ctz-int.c b/gcc/testsuite/gcc.dg/tree-ssa/ctz-int.c
index 7f63493..2bf3ae6 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ctz-int.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ctz-int.c
@@ -1,6 +1,6 @@
/* { dg-do run } */
/* { dg-require-effective-target ctz } */
-/* { dg-options "-O2 -fno-tree-ch -fdump-tree-optimized" } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
#define PREC (__CHAR_BIT__ * __SIZEOF_INT__)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ctz-long-long.c b/gcc/testsuite/gcc.dg/tree-ssa/ctz-long-long.c
index 924f61b..2e15948 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ctz-long-long.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ctz-long-long.c
@@ -1,6 +1,6 @@
/* { dg-do run } */
/* { dg-require-effective-target ctzll } */
-/* { dg-options "-O2 -fno-tree-ch -fdump-tree-optimized" } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
#define PREC (__CHAR_BIT__ * __SIZEOF_LONG_LONG__)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ctz-long.c b/gcc/testsuite/gcc.dg/tree-ssa/ctz-long.c
index 178945d..2e3be65 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ctz-long.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ctz-long.c
@@ -1,6 +1,6 @@
/* { dg-do run } */
/* { dg-require-effective-target ctzl } */
-/* { dg-options "-O2 -fno-tree-ch -fdump-tree-optimized" } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
#define PREC (__CHAR_BIT__ * __SIZEOF_LONG__)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr122478.c b/gcc/testsuite/gcc.dg/tree-ssa/pr122478.c
new file mode 100644
index 0000000..a39c91b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr122478.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+/* { dg-additional-options "-fgimple" } */
+
+unsigned char __GIMPLE (ssa)
+foo (unsigned short mask__701)
+{
+ _Bool _19;
+ unsigned char _180;
+
+__BB(2):
+ _19 = __BIT_FIELD_REF <_Bool> (mask__701, 1, 12);
+ _180 = __VIEW_CONVERT<unsigned char>(_19);
+ return _180;
+}
+
+/* { dg-final { scan-tree-dump-times "VIEW_CONVERT_EXPR" 1 "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr92834.c b/gcc/testsuite/gcc.dg/tree-ssa/pr92834.c
index 889048d..70acf74 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr92834.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr92834.c
@@ -1,8 +1,8 @@
/* PR tree-optimization/92834 */
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-optimized" } */
-/* { dg-final { scan-tree-dump-times "MIN_EXPR <" 8 "optimized" } } */
-/* { dg-final { scan-tree-dump-times "MAX_EXPR <" 8 "optimized" } } */
+/* { dg-options "-O2 -fdump-tree-phiopt1" } */
+/* { dg-final { scan-tree-dump-times "MIN_EXPR <" 16 "phiopt1" } } */
+/* { dg-final { scan-tree-dump-times "MAX_EXPR <" 16 "phiopt1" } } */
static inline unsigned
umax1 (unsigned a, unsigned b)
diff --git a/gcc/testsuite/gcc.dg/vect/slp-reduc-13.c b/gcc/testsuite/gcc.dg/vect/slp-reduc-13.c
new file mode 100644
index 0000000..00e91fc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/slp-reduc-13.c
@@ -0,0 +1,66 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_int } */
+/* { dg-additional-options "-fgimple" } */
+
+int q[2];
+
+void __GIMPLE (ssa,guessed_local(16535624),startwith("loop"))
+foo (int * r)
+{
+ int i;
+ int sum2;
+ int sum1;
+ int _1;
+ long unsigned int _2;
+ long unsigned int _3;
+ int * _4;
+ int _24;
+ __SIZETYPE__ _6;
+ __SIZETYPE__ _7;
+ int * _8;
+ int _9;
+ int _13;
+ unsigned int _30;
+ unsigned int _31;
+
+ __BB(2,guessed_local(16535624)):
+ goto __BB3(precise(134217728));
+
+ __BB(3,loop_header(1),guessed_local(1057206200)):
+ sum1_5 = __PHI (__BB5: sum1_18, __BB2: 0);
+ sum2_26 = __PHI (__BB5: sum2_19, __BB2: 0);
+ i_28 = __PHI (__BB5: i_20, __BB2: 0);
+ _31 = __PHI (__BB5: _30, __BB2: 64u);
+ _1 = i_28 * 2;
+ _2 = (long unsigned int) _1;
+ _3 = _2 * 4ul;
+ _4 = r_17(D) + _3;
+ _24 = __MEM <int> (_4);
+ /* Deliberately have swapped operands here */
+ sum1_18 = sum1_5 + _24;
+ _13 = _1 + 1;
+ _6 = (__SIZETYPE__) _13;
+ _7 = _6 * 4ul;
+ _8 = r_17(D) + _7;
+ _9 = __MEM <int> (_8);
+ /* versus here. */
+ sum2_19 = _9 + sum2_26;
+ i_20 = i_28 + 1;
+ _30 = _31 - 1u;
+ if (_30 != 0u)
+ goto __BB5(guessed(132118446));
+ else
+ goto __BB4(guessed(2099282));
+
+ __BB(5,guessed_local(1040670576)):
+ goto __BB3(precise(134217728));
+
+ __BB(4,guessed_local(16535624)):
+ sum1_33 = __PHI (__BB3: sum1_18);
+ sum2_32 = __PHI (__BB3: sum2_19);
+ q[0] = sum1_33;
+ q[1] = sum2_32;
+ return;
+}
+
+/* { dg-final { scan-tree-dump "SLP discovery of size 2 reduction group succeeded" "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/slp-widen-mult-half.c b/gcc/testsuite/gcc.dg/vect/slp-widen-mult-half.c
index b69ade3..72811eb 100644
--- a/gcc/testsuite/gcc.dg/vect/slp-widen-mult-half.c
+++ b/gcc/testsuite/gcc.dg/vect/slp-widen-mult-half.c
@@ -1,7 +1,6 @@
/* Disabling epilogues until we find a better way to deal with scans. */
/* { dg-additional-options "--param vect-epilogues-nomask=0" } */
/* { dg-require-effective-target vect_int } */
-/* { dg-additional-options "-mlasx" { target loongarch*-*-* } } */
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.dg/vect/tree-vect.h b/gcc/testsuite/gcc.dg/vect/tree-vect.h
index 1e4b56e..37908c9 100644
--- a/gcc/testsuite/gcc.dg/vect/tree-vect.h
+++ b/gcc/testsuite/gcc.dg/vect/tree-vect.h
@@ -76,6 +76,8 @@ check_vect (void)
}
#elif defined(__mips_msa)
asm volatile ("or.v $w0,$w0,$w0");
+#elif defined(__loongarch__)
+ asm volatile ("vor.v\t$vr0,$vr0,$vr0");
#endif
signal (SIGILL, SIG_DFL);
}
diff --git a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c
index 53c9b84..dfbb217 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c
@@ -2,7 +2,6 @@
/* { dg-additional-options "--param vect-epilogues-nomask=0" } */
/* { dg-require-effective-target vect_int } */
/* { dg-additional-options "-fno-ipa-icf" } */
-/* { dg-additional-options "-mlasx" { target loongarch*-*-*} } */
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-u16.c b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-u16.c
index e9db828..c2ad58f 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-u16.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-u16.c
@@ -2,7 +2,6 @@
/* { dg-additional-options "--param vect-epilogues-nomask=0" } */
/* { dg-require-effective-target vect_int } */
/* { dg-additional-options "-fno-ipa-icf" } */
-/* { dg-additional-options "-mlasx" { target loongarch*-*-*} } */
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-half-u8.c b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-half-u8.c
index 607f317..bfdcbaa 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-half-u8.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-half-u8.c
@@ -2,7 +2,6 @@
/* { dg-additional-options "--param vect-epilogues-nomask=0" } */
/* { dg-require-effective-target vect_int } */
/* { dg-additional-options "-fno-ipa-icf" } */
-/* { dg-additional-options "-mlasx" { target loongarch*-*-*} } */
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-half.c b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-half.c
index cd13d82..e46b0cc 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-half.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-half.c
@@ -1,7 +1,6 @@
/* Disabling epilogues until we find a better way to deal with scans. */
/* { dg-additional-options "--param vect-epilogues-nomask=0" } */
/* { dg-require-effective-target vect_int } */
-/* { dg-additional-options "-mlasx" { target loongarch*-*-*} } */
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u16.c b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u16.c
index 258d253..14411ef 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u16.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u16.c
@@ -1,7 +1,6 @@
/* Disabling epilogues until we find a better way to deal with scans. */
/* { dg-additional-options "--param vect-epilogues-nomask=0" } */
/* { dg-require-effective-target vect_int } */
-/* { dg-additional-options "-mlasx" { target loongarch*-*-*} } */
#include <stdarg.h>
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8-s16-s32.c b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8-s16-s32.c
index 3baafca..f40def5 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8-s16-s32.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8-s16-s32.c
@@ -1,7 +1,6 @@
/* Disabling epilogues until we find a better way to deal with scans. */
/* { dg-additional-options "--param vect-epilogues-nomask=0" } */
/* { dg-require-effective-target vect_int } */
-/* { dg-additional-options "-mlasx" { target loongarch*-*-*} } */
#include <stdarg.h>
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8-u32.c b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8-u32.c
index bcfbe19..6386639 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8-u32.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8-u32.c
@@ -1,6 +1,5 @@
/* { dg-additional-options "--param vect-epilogues-nomask=0" } */
/* { dg-require-effective-target vect_int } */
-/* { dg-additional-options "-mlasx" { target loongarch*-*-* } } */
#include <stdarg.h>
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8.c b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8.c
index e3bf13b..78ad74b 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8.c
@@ -1,6 +1,5 @@
/* { dg-additional-options "--param vect-epilogues-nomask=0" } */
/* { dg-require-effective-target vect_int } */
-/* { dg-additional-options "-mlasx" { target loongarch*-*-*} } */
#include <stdarg.h>
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.target/aarch64/pr121853_1.c b/gcc/testsuite/gcc.target/aarch64/pr121853_1.c
new file mode 100644
index 0000000..24b2fdc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/pr121853_1.c
@@ -0,0 +1,64 @@
+/* { dg-do run } */
+/* { dg-additional-options "-O2 -std=c99" } */
+
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+__attribute__ ((noipa))
+float convert(__bf16 value) {
+ return (float)value;
+}
+
+static inline uint32_t f32_bits(float f) {
+ uint32_t u; memcpy(&u, &f, sizeof u); return u;
+}
+static inline __bf16 bf16_from_bits(uint16_t u) {
+ __bf16 b; memcpy(&b, &u, sizeof b); return b;
+}
+
+/* Fixed bf16 inputs (as raw 16-bit payloads) covering edge cases. */
+static const uint16_t inputs[] = {
+ 0x0000, // +0
+ 0x8000, // -0
+ 0x7F80, // +inf
+ 0xFF80, // -inf
+ 0x7FC0, // qNaN (+) (quiet bit set in bf16)
+ 0xFFC0, // qNaN (-)
+ 0x7F01, // sNaN (+) (will be quieted by conversion)
+ 0xFF01, // sNaN (-)
+ 0x0001, // smallest +subnormal
+ 0x007F, // largest +subnormal
+ 0x8001, // smallest -subnormal
+ 0x807F, // largest -subnormal
+ 0x0080, // smallest +normal
+ 0x3F80, // +1.0
+ 0xBF80, // -1.0
+ 0x3F00, // +0.5
+ 0xBF00, // -0.5
+ 0x3FC0, // +1.5
+ 0x7F7F, // max finite +
+ 0xFF7F, // max finite -
+};
+
+int main(void) {
+ const size_t N = sizeof(inputs)/sizeof(inputs[0]);
+ size_t fails = 0;
+
+ for (size_t i = 0; i < N; ++i) {
+ __bf16 in = bf16_from_bits(inputs[i]);
+ float out = convert(in);
+ uint32_t got = f32_bits(out);
+ uint32_t exp = inputs[i] << 16;
+
+ if (got != exp) {
+ printf("FAIL[%zu]: in_bf16=0x%04X exp_f32=0x%08X got_f32=0x%08X\n",
+ i, inputs[i], exp, got);
+ ++fails;
+ }
+ }
+
+ if (fails != 0)
+ __builtin_abort ();
+}
+
diff --git a/gcc/testsuite/gcc.target/aarch64/pr121853_2.c b/gcc/testsuite/gcc.target/aarch64/pr121853_2.c
new file mode 100644
index 0000000..e9fb401
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/pr121853_2.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-O1" } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+float convert(__bf16 value) {
+ return (float)value;
+}
+
+/*
+** convert:
+** movi v[0-9]+.4s, 0
+** ext v[0-9]+.16b, v[0-9]+.16b, v[0-9]+.16b, #14
+** ret
+*/
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/dup-insr-1.c b/gcc/testsuite/gcc.target/aarch64/sve/dup-insr-1.c
new file mode 100644
index 0000000..41dcbba
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/dup-insr-1.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized" } */
+/* PR target/116075 */
+
+#include <arm_sve.h>
+
+svint8_t f(void)
+{
+ svint8_t tt;
+ tt = svdup_s8 (0);
+ tt = svinsr (tt, 0);
+ return tt;
+}
+
+svint8_t f1(int8_t t)
+{
+ svint8_t tt;
+ tt = svdup_s8 (t);
+ tt = svinsr (tt, t);
+ return tt;
+}
+
+/* The above 2 functions should have removed the VEC_SHL_INSERT. */
+
+/* { dg-final { scan-tree-dump-not ".VEC_SHL_INSERT " "optimized" } } */
+
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/dup-insr-2.c b/gcc/testsuite/gcc.target/aarch64/sve/dup-insr-2.c
new file mode 100644
index 0000000..8eafe97
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/dup-insr-2.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized" } */
+/* PR target/116075 */
+
+#include <arm_sve.h>
+
+svint8_t f(int8_t t)
+{
+ svint8_t tt;
+ tt = svdup_s8 (0);
+ tt = svinsr (tt, t);
+ return tt;
+}
+
+svint8_t f1(int8_t t)
+{
+ svint8_t tt;
+ tt = svdup_s8 (t);
+ tt = svinsr (tt, 0);
+ return tt;
+}
+
+/* The above 2 functions should not have removed the VEC_SHL_INSERT. */
+
+/* { dg-final { scan-tree-dump-times ".VEC_SHL_INSERT " 2 "optimized" } } */
+
diff --git a/gcc/testsuite/gcc.target/avr/pr121198.c b/gcc/testsuite/gcc.target/avr/pr121198.c
new file mode 100644
index 0000000..551247e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/pr121198.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-Os -mmcu=atmega8" } */
+
+long
+test (void)
+{
+ long x;
+ __asm__ ("" : "={r22}" (x));
+ return x;
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr116815.c b/gcc/testsuite/gcc.target/i386/pr116815.c
new file mode 100644
index 0000000..1cd2f72
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr116815.c
@@ -0,0 +1,31 @@
+/* PR target/116815 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-additional-options "-march=pentiumpro" { target ia32 } } */
+
+static inline __attribute__ ((always_inline))
+unsigned max (unsigned a, unsigned b) { return a > b ? a : b; }
+
+static inline __attribute__ ((always_inline))
+unsigned min (unsigned a, unsigned b) { return a < b ? a : b; }
+
+#define OPERATION(op, type, N, exp1, exp2) \
+ unsigned u##op##type##N (unsigned a, unsigned b) { return op (exp1, exp2); }
+
+OPERATION (max, add, 1, a, a + b)
+OPERATION (max, add, 2, a, b + a)
+OPERATION (max, add, 3, a + b, a)
+OPERATION (max, add, 4, b + a, a)
+
+OPERATION (min, add, 1, a, a + b)
+OPERATION (min, add, 2, a, b + a)
+OPERATION (min, add, 3, a + b, a)
+OPERATION (min, add, 4, b + a, a)
+
+OPERATION (max, sub, 1, a, a - b)
+OPERATION (max, sub, 2, a - b, a)
+
+OPERATION (min, sub, 1, a, a - b)
+OPERATION (min, sub, 2, a - b, a)
+
+/* { dg-final { scan-assembler-not "cmp" } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr122457.c b/gcc/testsuite/gcc.target/i386/pr122457.c
new file mode 100644
index 0000000..dc57fb2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr122457.c
@@ -0,0 +1,4 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=x86-64-v4 -mavxvnniint16" } */
+
+#include "vnniint16-auto-vectorize-2.c"
diff --git a/gcc/testsuite/gcc.target/loongarch/conditional-move-opt-1.c b/gcc/testsuite/gcc.target/loongarch/conditional-move-opt-1.c
index ed13471..47802aa 100644
--- a/gcc/testsuite/gcc.target/loongarch/conditional-move-opt-1.c
+++ b/gcc/testsuite/gcc.target/loongarch/conditional-move-opt-1.c
@@ -27,7 +27,7 @@ void
test_lt ()
{
if (lm < ln)
- lr *= (1 << 16);
+ lr += (1 << 16);
lr += lm;
}
@@ -35,7 +35,7 @@ void
test_le ()
{
if (lm <= ln)
- lr = lm * ((long)1 << 32);
+ lr = lm + ((long)1 << 32);
else
lr = lm;
lr += lm;
diff --git a/gcc/testsuite/gcc.target/loongarch/conditional-move-opt-2.c b/gcc/testsuite/gcc.target/loongarch/conditional-move-opt-2.c
index ac72d4d..743fd5e 100644
--- a/gcc/testsuite/gcc.target/loongarch/conditional-move-opt-2.c
+++ b/gcc/testsuite/gcc.target/loongarch/conditional-move-opt-2.c
@@ -29,7 +29,7 @@ void
test_lez ()
{
if (lm <= 0)
- lr &= (1 << 16);
+ lr |= (1 << 16);
lr += lm;
}
diff --git a/gcc/testsuite/gcc.target/loongarch/conditional-move-opt-3.c b/gcc/testsuite/gcc.target/loongarch/conditional-move-opt-3.c
new file mode 100644
index 0000000..9588798
--- /dev/null
+++ b/gcc/testsuite/gcc.target/loongarch/conditional-move-opt-3.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler "maskeqz" } } */
+/* { dg-final { scan-assembler "masknez" } } */
+
+extern long lm, ln, lr;
+
+void
+test_and ()
+{
+ if (lm < 0)
+ lr &= (1 << 16);
+ lr += lm;
+}
diff --git a/gcc/testsuite/gcc.target/loongarch/fnmam4-vec.c b/gcc/testsuite/gcc.target/loongarch/fnmam4-vec.c
new file mode 100644
index 0000000..0969303
--- /dev/null
+++ b/gcc/testsuite/gcc.target/loongarch/fnmam4-vec.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-Ofast -mlasx -ftree-vectorize" } */
+/* { dg-require-effective-target loongarch_asx } */
+
+void
+foo (float *u, float x, float *y, float z)
+{
+ int i;
+ for (i = 0; i < 1024; i++)
+ *(u++) = (x - y[i] * z);
+}
+
+/* { dg-final { scan-assembler-not "\tvori.b"} } */
+/* { dg-final { scan-assembler-not "\txvori.b"} } */
diff --git a/gcc/testsuite/gcc.target/loongarch/pr122097.c b/gcc/testsuite/gcc.target/loongarch/pr122097.c
new file mode 100644
index 0000000..5d32b19
--- /dev/null
+++ b/gcc/testsuite/gcc.target/loongarch/pr122097.c
@@ -0,0 +1,271 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -mabi=lp64d -mlsx" } */
+/* { dg-final { scan-assembler "vbitseti\.d\t\\\$vr\[0-9\]+,\\\$vr\[0-9\]+,63" } } */
+
+typedef long unsigned int size_t;
+typedef unsigned char simde__mmask8;
+typedef long simde__m128i __attribute__ ((__aligned__ ((16))))
+__attribute__ ((__vector_size__ (16))) __attribute__ ((__may_alias__));
+typedef union
+{
+
+ __attribute__ ((__aligned__ ((16)))) long i64
+ __attribute__ ((__vector_size__ (16))) __attribute__ ((__may_alias__));
+} simde__m128i_private;
+typedef double simde_float64;
+typedef simde_float64 simde__m128d __attribute__ ((__aligned__ ((16))))
+__attribute__ ((__vector_size__ (16))) __attribute__ ((__may_alias__));
+typedef long int int_fast32_t;
+typedef union
+{
+
+ __attribute__ ((__aligned__ ((16)))) int_fast32_t i32f
+ __attribute__ ((__vector_size__ (16))) __attribute__ ((__may_alias__));
+ __attribute__ ((__aligned__ ((16)))) long i64
+ __attribute__ ((__vector_size__ (16))) __attribute__ ((__may_alias__));
+ __attribute__ ((__aligned__ ((16)))) simde_float64 f64
+ __attribute__ ((__vector_size__ (16))) __attribute__ ((__may_alias__));
+} simde__m128d_private;
+__attribute__ ((__always_inline__)) inline static simde__m128d
+simde__m128d_from_private (simde__m128d_private v)
+{
+ simde__m128d r;
+ __builtin_memcpy (&r, &v, sizeof (r));
+ return r;
+}
+
+__attribute__ ((__always_inline__)) inline static simde__m128d
+simde_mm_set_pd (simde_float64 e1, simde_float64 e0)
+{
+
+ simde__m128d_private r_;
+ r_.f64[0] = e0;
+ r_.f64[1] = e1;
+
+ return simde__m128d_from_private (r_);
+}
+__attribute__ ((__always_inline__)) inline static simde__m128i
+simde_mm_castpd_si128 (simde__m128d a)
+{
+ simde__m128i r;
+ __builtin_memcpy (&r, &a, sizeof (a));
+ return r;
+}
+
+__attribute__ ((__always_inline__)) inline static simde__m128i
+simde__m128i_from_private (simde__m128i_private v)
+{
+ simde__m128i r;
+ __builtin_memcpy (&r, &v, sizeof (r));
+ return r;
+}
+
+__attribute__ ((__always_inline__)) inline static simde__m128i_private
+simde__m128i_to_private (simde__m128i v)
+{
+ simde__m128i_private r;
+ __builtin_memcpy (&r, &v, sizeof (r));
+ return r;
+}
+__attribute__ ((__always_inline__)) inline static simde__m128d
+simde_mm_castsi128_pd (simde__m128i a)
+{
+ simde__m128d r;
+ __builtin_memcpy (&r, &a, sizeof (a));
+ return r;
+}
+
+__attribute__ ((__always_inline__)) inline static simde__m128i
+simde_mm_mask_mov_epi64 (simde__m128i src, simde__mmask8 k, simde__m128i a)
+{
+
+ simde__m128i_private src_ = simde__m128i_to_private (src),
+ a_ = simde__m128i_to_private (a), r_;
+
+ for (size_t i = 0; i < (sizeof (r_.i64) / sizeof (r_.i64[0])); i++)
+ {
+ r_.i64[i] = ((k >> i) & 1) ? a_.i64[i] : src_.i64[i];
+ }
+
+ return simde__m128i_from_private (r_);
+}
+
+__attribute__ ((__always_inline__)) inline static simde__m128d
+simde_mm_mask_mov_pd (simde__m128d src, simde__mmask8 k, simde__m128d a)
+{
+ return simde_mm_castsi128_pd (simde_mm_mask_mov_epi64 (
+ simde_mm_castpd_si128 (src), k, simde_mm_castpd_si128 (a)));
+}
+
+static double
+simde_test_f64_precision_to_slop (int precision)
+{
+ return __builtin_expect (!!(precision == 0x7fffffff), 0)
+ ? 0.0
+ : __builtin_pow (10.0, -((double)(precision)));
+}
+__attribute__ ((__always_inline__)) inline static void
+simde_mm_storeu_pd (simde_float64 *mem_addr, simde__m128d a)
+{
+
+ __builtin_memcpy (mem_addr, &a, sizeof (a));
+}
+int simde_test_equal_f64 (simde_float64 a, simde_float64 b,
+ simde_float64 slop);
+void simde_test_debug_printf_ (const char *format, ...);
+static int
+simde_assert_equal_vf64_ (size_t vec_len, simde_float64 const a[(vec_len)],
+ simde_float64 const b[(vec_len)], simde_float64 slop,
+ const char *filename, int line, const char *astr,
+ const char *bstr)
+{
+ for (size_t i = 0; i < vec_len; i++)
+ {
+ if (__builtin_expect (!!(!simde_test_equal_f64 (a[i], b[i], slop)), 0))
+ {
+ simde_test_debug_printf_ (
+ "%s:%d: assertion failed: %s[%zu] ~= %s[%zu] (%f ~= %f)\n",
+ filename, line, astr, i, bstr, i, ((double)(a[i])),
+ ((double)(b[i])));
+ return 1;
+ }
+ }
+ return 0;
+}
+static int
+simde_test_x86_assert_equal_f64x2_ (simde__m128d a, simde__m128d b,
+ simde_float64 slop, const char *filename,
+ int line, const char *astr,
+ const char *bstr)
+{
+ simde_float64 a_[sizeof (a) / sizeof (simde_float64)],
+ b_[sizeof (a) / sizeof (simde_float64)];
+ simde_mm_storeu_pd (a_, a);
+ simde_mm_storeu_pd (b_, b);
+ return simde_assert_equal_vf64_ (sizeof (a_) / sizeof (a_[0]), a_, b_, slop,
+ filename, line, astr, bstr);
+}
+__attribute__ ((__always_inline__)) inline static simde__m128d_private
+simde__m128d_to_private (simde__m128d v)
+{
+ simde__m128d_private r;
+ __builtin_memcpy (&r, &v, sizeof (r));
+ return r;
+}
+__attribute__ ((__always_inline__)) inline static simde__m128d
+simde_mm_min_pd (simde__m128d a, simde__m128d b)
+{
+
+ simde__m128d_private r_, a_ = simde__m128d_to_private (a),
+ b_ = simde__m128d_to_private (b);
+
+ for (size_t i = 0; i < (sizeof (r_.f64) / sizeof (r_.f64[0])); i++)
+ {
+ r_.f64[i] = (a_.f64[i] < b_.f64[i]) ? a_.f64[i] : b_.f64[i];
+ }
+
+ return simde__m128d_from_private (r_);
+}
+
+__attribute__ ((__always_inline__)) inline static simde__m128d
+simde_mm_max_pd (simde__m128d a, simde__m128d b)
+{
+
+ simde__m128d_private r_, a_ = simde__m128d_to_private (a),
+ b_ = simde__m128d_to_private (b);
+
+ for (size_t i = 0; i < (sizeof (r_.f64) / sizeof (r_.f64[0])); i++)
+ {
+ r_.f64[i] = (a_.f64[i] > b_.f64[i]) ? a_.f64[i] : b_.f64[i];
+ }
+
+ return simde__m128d_from_private (r_);
+}
+
+__attribute__ ((__always_inline__)) inline static simde__m128d
+simde_x_mm_abs_pd (simde__m128d a)
+{
+
+ simde__m128d_private r_, a_ = simde__m128d_to_private (a);
+ for (size_t i = 0; i < (sizeof (r_.f64) / sizeof (r_.f64[0])); i++)
+ {
+ r_.f64[i] = __builtin_fabs (a_.f64[i]);
+ }
+
+ return simde__m128d_from_private (r_);
+}
+__attribute__ ((__always_inline__)) inline static simde__m128d
+simde_mm_cmple_pd (simde__m128d a, simde__m128d b)
+{
+
+ simde__m128d_private r_, a_ = simde__m128d_to_private (a),
+ b_ = simde__m128d_to_private (b);
+
+ r_.i64 = ((__typeof__ (r_.i64))((a_.f64 <= b_.f64)));
+ return simde__m128d_from_private (r_);
+}
+
+__attribute__ ((__always_inline__)) inline static simde__m128d
+simde_x_mm_select_pd (simde__m128d a, simde__m128d b, simde__m128d mask)
+{
+ simde__m128d_private r_, a_ = simde__m128d_to_private (a),
+ b_ = simde__m128d_to_private (b),
+ mask_ = simde__m128d_to_private (mask);
+
+ r_.i64 = a_.i64 ^ ((a_.i64 ^ b_.i64) & mask_.i64);
+ return simde__m128d_from_private (r_);
+}
+simde__m128d simde_mm_cmpge_pd (simde__m128d a, simde__m128d b);
+
+simde__m128d
+simde_x_mm_copysign_pd (simde__m128d dest, simde__m128d src)
+{
+ simde__m128d_private r_, dest_ = simde__m128d_to_private (dest),
+ src_ = simde__m128d_to_private (src);
+ for (size_t i = 0; i < (sizeof (r_.f64) / sizeof (r_.f64[0])); i++)
+ {
+ r_.f64[i] = __builtin_copysign (dest_.f64[i], src_.f64[i]);
+ }
+
+ return simde__m128d_from_private (r_);
+}
+simde__m128d simde_mm_or_pd (simde__m128d a, simde__m128d b);
+
+simde__m128d simde_mm_set1_pd (simde_float64 a);
+
+__attribute__ ((__always_inline__)) inline static simde__m128d
+simde_mm_range_pd (simde__m128d a, simde__m128d b, int imm8)
+{
+ simde__m128d r;
+
+ r = simde_x_mm_select_pd (
+ b, a, simde_mm_cmple_pd (simde_x_mm_abs_pd (a), simde_x_mm_abs_pd (b)));
+
+ r = simde_x_mm_copysign_pd (r, a);
+
+ return r;
+}
+int
+test_simde_mm_mask_range_pd (void)
+{
+
+ simde__m128d src, a, b, e, r;
+
+ src = simde_mm_set_pd (-2.92, -85.39);
+ a = simde_mm_set_pd (-47.59, -122.31);
+ b = simde_mm_set_pd (877.42, 69.15);
+ e = simde_mm_set_pd (-47.59, -69.15);
+ r = simde_mm_mask_mov_pd (src, 143, simde_mm_range_pd (a, b, 2));
+ do
+ {
+ if (simde_test_x86_assert_equal_f64x2_ (
+ r, e, simde_test_f64_precision_to_slop (1),
+ "../test/x86/avx512/range.c", 1454, "r", "e"))
+ {
+ return 1;
+ }
+ }
+ while (0);
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/loongarch/trap-1.c b/gcc/testsuite/gcc.target/loongarch/trap-1.c
new file mode 100644
index 0000000..8936f60
--- /dev/null
+++ b/gcc/testsuite/gcc.target/loongarch/trap-1.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -w -fisolate-erroneous-paths-dereference -mbreak-code=1" } */
+/* { dg-final { scan-assembler "break\\t1" } } */
+
+int
+bug (void)
+{
+ return *(int *)0;
+}
diff --git a/gcc/testsuite/gcc.target/loongarch/trap-default.c b/gcc/testsuite/gcc.target/loongarch/trap-default.c
new file mode 100644
index 0000000..32948d4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/loongarch/trap-default.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -w -fisolate-erroneous-paths-dereference" } */
+/* { dg-final { scan-assembler "amswap\\.w\\t\\\$r0,\\\$r1,\\\$r0" } } */
+
+int
+bug (void)
+{
+ return *(int *)0;
+}
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr122445.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr122445.c
new file mode 100644
index 0000000..4736868
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr122445.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcbv_zvl256b -mabi=lp64d -O3 -mrvv-vector-bits=zvl --param=riscv-autovec-mode=V4QI -mtune=generic-ooo -fdump-rtl-avlprop-all" } */
+
+typedef unsigned char uint8_t;
+typedef short int16_t;
+
+#define FDEC_STRIDE 32
+
+static inline uint8_t x264_clip_uint8( int x )
+{
+ return x;
+}
+
+void
+x264_add4x4_idct (uint8_t *p_dst, int16_t d[16])
+{
+ for( int y = 0; y < 4; y++ )
+ {
+ for( int x = 0; x < 4; x++ )
+ p_dst[x] = x264_clip_uint8( p_dst[x] + d[y*4+x] );
+ p_dst += FDEC_STRIDE;
+ }
+}
+
+/* { dg-final { scan-rtl-dump "Propagating AVL: \\(const_int 4" "avlprop" } } */
+/* { dg-final { scan-rtl-dump-not "Propagating AVL: \\(const_int 1" "avlprop" } } */
diff --git a/gcc/testsuite/gfortran.dg/pdt_62.f03 b/gcc/testsuite/gfortran.dg/pdt_62.f03
new file mode 100644
index 0000000..efbcdad
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pdt_62.f03
@@ -0,0 +1,78 @@
+! { dg-do run }
+!
+! Test fix for PR122433
+!
+! Contributed by Damian Rouson <damian@archaeologic.codes>
+!
+module neuron_m
+ implicit none
+
+ type string_t
+ character(len=:), allocatable :: string_
+ end type
+
+ type neuron_t(k)
+ integer, kind :: k = kind(1.)
+ real(k) bias_
+ type(neuron_t(k)), allocatable :: next
+ end type
+
+contains
+ recursive function from_json(neuron_lines, start) result(neuron)
+ type(string_t) neuron_lines(:)
+ integer start
+ type(neuron_t) neuron
+ character(len=:), allocatable :: line
+ line = neuron_lines(start+1)%string_
+ read(line(index(line, ":")+1:), fmt=*) neuron%bias_
+ line = adjustr(neuron_lines(start+3)%string_)
+! Used to give "Error: Syntax error in IF-clause" for next line.
+ if (line(len(line):) == ",") neuron%next = from_json(neuron_lines, start+4)
+ end function
+ recursive function from_json_8(neuron_lines, start) result(neuron)
+ type(string_t) neuron_lines(:)
+ integer start
+ type(neuron_t(kind(1d0))) neuron
+ character(len=:), allocatable :: line
+ line = neuron_lines(start+1)%string_
+ read(line(index(line, ":")+1:), fmt=*) neuron%bias_
+ line = adjustr(neuron_lines(start+3)%string_)
+ if (line(len(line):) == ",") neuron%next = from_json_8(neuron_lines, start+4)
+ end function
+end module
+
+ use neuron_m
+ call foo
+ call bar
+contains
+ subroutine foo
+ type(neuron_t) neuron
+ type(string_t) :: neuron_lines(8)
+ neuron_lines(2)%string_ = "real : 4.0 "
+ neuron_lines(4)%string_ = " ,"
+ neuron_lines(6)%string_ = "real : 8.0 "
+ neuron_lines(8)%string_ = " "
+ neuron = from_json(neuron_lines, 1)
+ if (int (neuron%bias_) /= 4) stop 1
+ if (allocated (neuron%next)) then
+ if (int (neuron%next%bias_) /= 8) stop 2
+ else
+ stop 3
+ endif
+ end subroutine
+ subroutine bar
+ type(neuron_t(kind(1d0))) neuron
+ type(string_t) :: neuron_lines(8)
+ neuron_lines(2)%string_ = "real : 4.0d0 "
+ neuron_lines(4)%string_ = " ,"
+ neuron_lines(6)%string_ = "real : 8.0d0 "
+ neuron_lines(8)%string_ = " "
+ neuron = from_json_8(neuron_lines, 1)
+ if (int (neuron%bias_) /= 4) stop 1
+ if (allocated (neuron%next)) then
+ if (int (neuron%next%bias_) /= 8) stop 2
+ else
+ stop 3
+ endif
+ end subroutine
+end
diff --git a/gcc/testsuite/gfortran.dg/pdt_63.f03 b/gcc/testsuite/gfortran.dg/pdt_63.f03
new file mode 100644
index 0000000..127e5fe
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pdt_63.f03
@@ -0,0 +1,26 @@
+! { dg-do compile }
+!
+! Test fix for PR122434
+!
+! Contributed by Damian Rouson <damian@archaeologic.codes>
+!
+module neuron_m
+ implicit none
+
+ type neuron_t
+ real, allocatable :: weight_
+ end type
+
+ interface
+ type(neuron_t) pure module function from_json() result(neuron)
+ end function
+ end interface
+
+contains
+ module procedure from_json
+ associate(num_inputs => 1)
+! Gave "Error: Bad allocate-object at (1) for a PURE procedure" in next line.
+ allocate(neuron%weight_, source=0.)
+ end associate
+ end procedure
+end module
diff --git a/gcc/testsuite/gfortran.dg/pdt_64.f03 b/gcc/testsuite/gfortran.dg/pdt_64.f03
new file mode 100644
index 0000000..dfa4e3a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pdt_64.f03
@@ -0,0 +1,17 @@
+! { dg-do compile }
+!
+! Test the fix for PR122165.
+!
+! Contributed by Steve Kargl <kargls@comcast.net>
+!
+program foo
+ implicit none
+ type dt(k,l)
+ integer(8), len :: k = 1
+ integer(8), KIND :: l = 1
+ character(k) :: arr
+ end type
+ type(dt(:)), allocatable :: d1
+ if (d1%k%kind /= 8) stop 1 ! { dg-error "cannot be followed by the type inquiry ref" }
+ if (d1%l%kind /= 8) stop 2 ! { dg-error "cannot be followed by the type inquiry ref" }
+end
diff --git a/gcc/testsuite/gfortran.dg/pdt_65.f03 b/gcc/testsuite/gfortran.dg/pdt_65.f03
new file mode 100644
index 0000000..d5e45c2
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pdt_65.f03
@@ -0,0 +1,135 @@
+! { dg-do compile }
+! { dg-options "-fdump-tree-original" }
+!
+! Test fix for PR122452
+!
+! Contributed by Damian Rouson <damian@archaeologic.codes>
+!
+module kind_parameters_m
+ integer, parameter :: default_real = kind(1e0)
+ integer, parameter :: double_precision = kind(1d0)
+end module
+
+module tensor_m
+ use kind_parameters_m, only : default_real, double_precision
+ implicit none
+
+ private
+ public :: tensor_t
+
+ type tensor_t(k)
+ integer, kind :: k = default_real
+ real(k), allocatable, private :: values_(:)
+ contains
+ generic :: values => default_real_values, double_precision_values
+ procedure, private, non_overridable :: default_real_values, double_precision_values
+ generic :: num_components => default_real_num_components, double_precision_num_components
+ procedure, private :: default_real_num_components, double_precision_num_components
+ end type
+
+ interface tensor_t
+
+ pure module function construct_default_real(values) result(tensor)
+ implicit none
+ real, intent(in) :: values(:)
+ type(tensor_t) tensor
+ end function
+
+ pure module function construct_double_precision(values) result(tensor)
+ implicit none
+ double precision, intent(in) :: values(:)
+ type(tensor_t(double_precision)) tensor
+ end function
+
+ end interface
+
+ interface
+
+ pure module function default_real_values(self) result(tensor_values)
+ implicit none
+ class(tensor_t), intent(in) :: self
+ real, allocatable :: tensor_values(:)
+ end function
+
+ pure module function double_precision_values(self) result(tensor_values)
+ implicit none
+ class(tensor_t(double_precision)), intent(in) :: self
+ double precision, allocatable :: tensor_values(:)
+ end function
+
+ pure module function default_real_num_components(self) result(n)
+ implicit none
+ class(tensor_t), intent(in) :: self
+ integer n
+ end function
+
+ pure module function double_precision_num_components(self) result(n)
+ implicit none
+ class(tensor_t(double_precision)), intent(in) :: self
+ integer n
+ end function
+
+ end interface
+
+end module tensor_m
+
+submodule(tensor_m) tensor_s
+contains
+
+ pure module function construct_default_real(values) result(tensor)
+ implicit none
+ real, intent(in) :: values(:)
+ type(tensor_t) tensor
+ tensor = tensor_t ()(values)
+ end function
+
+ pure module function construct_double_precision(values) result(tensor)
+ implicit none
+ double precision, intent(in) :: values(:)
+ type(tensor_t(double_precision)) tensor
+ tensor = tensor_t (double_precision)(values)
+ end function
+
+ pure module function default_real_values(self) result(tensor_values)
+ implicit none
+ class(tensor_t), intent(in) :: self
+ real, allocatable :: tensor_values(:)
+ tensor_values = self%values_
+ end function
+
+ pure module function double_precision_values(self) result(tensor_values)
+ implicit none
+ class(tensor_t(double_precision)), intent(in) :: self
+ double precision, allocatable :: tensor_values(:)
+ tensor_values = self%values_
+ end function
+
+
+ pure module function default_real_num_components(self) result(n)
+ implicit none
+ class(tensor_t), intent(in) :: self
+ integer n
+ n = default_real
+ end function
+
+ pure module function double_precision_num_components(self) result(n)
+ implicit none
+ class(tensor_t(double_precision)), intent(in) :: self
+ integer n
+ n = double_precision
+ end function
+
+end submodule tensor_s
+
+
+ use tensor_m
+ type(tensor_t(kind(0e0))) :: a
+ type(tensor_t(kind(0D0))) :: b
+ a = tensor_t ([1e0,2e0])
+ print *, a%num_components (), a%values ()
+ b = tensor_t ([3d0,4d0])
+ print *, b%num_components (), b%values ()
+end
+! { dg-final { scan-tree-dump-times "construct_" 4 "original" } }
+! { dg-final { scan-tree-dump-times "_components" 4 "original" } }
+! { dg-final { scan-tree-dump-times "_values" 4 "original" } }
diff --git a/gcc/testsuite/gfortran.dg/vect/pr70102.f b/gcc/testsuite/gfortran.dg/vect/pr70102.f
new file mode 100644
index 0000000..b6a2878
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/vect/pr70102.f
@@ -0,0 +1,21 @@
+! { dg-do compile }
+! { dg-additional-options "-Ofast" }
+ subroutine test (x,y,z)
+ integer x,y,z
+ real*8 a(5,x,y,z),b(5,x,y,z)
+ real*8 c
+
+ c = 0.0d0
+ do k=1,z
+ do j=1,y
+ do i=1,x
+ do l=1,5
+ c = c + a(l,i,j,k)*b(l,i,j,k)
+ enddo
+ enddo
+ enddo
+ enddo
+ write(30,*)'c ==',c
+ return
+ end
+! { dg-final { scan-tree-dump "vectorizing a reduction chain" "vect" { target vect_double } } }
diff --git a/gcc/testsuite/gm2.dg/spell/iso/fail/badimport.mod b/gcc/testsuite/gm2.dg/spell/iso/fail/badimport.mod
new file mode 100644
index 0000000..337cf34
--- /dev/null
+++ b/gcc/testsuite/gm2.dg/spell/iso/fail/badimport.mod
@@ -0,0 +1,14 @@
+
+(* { dg-do compile } *)
+(* { dg-options "-g -c" } *)
+
+MODULE badimport ;
+
+IMPORT ASCII ;
+FROM StrIO IMPORT WriteString ;
+FROM ASCIi IMPORT nul ;
+ (* { dg-error "error: the file containing the definition module 'ASCIi' cannot be found, did you mean ASCII" "ASCIi" { target *-*-* } 9 } *)
+
+BEGIN
+
+END badimport.
diff --git a/gcc/testsuite/gnat.dg/aggr32.adb b/gcc/testsuite/gnat.dg/aggr32.adb
new file mode 100644
index 0000000..e5b0887
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/aggr32.adb
@@ -0,0 +1,15 @@
+-- { dg-do compile }
+
+with Aggr32_Pkg.Child;
+
+procedure Aggr32 (W, H : Positive) is
+
+ use Aggr32_Pkg;
+
+ package Test_1 is new Child (Frame => (Width => W, Height => H));
+
+ package Test_2 is new Child (Frame => Rec'(Width => W, Height => H));
+
+begin
+ null;
+end;
diff --git a/gcc/testsuite/gnat.dg/aggr32_pkg-child.ads b/gcc/testsuite/gnat.dg/aggr32_pkg-child.ads
new file mode 100644
index 0000000..352e2b5
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/aggr32_pkg-child.ads
@@ -0,0 +1,6 @@
+generic
+
+ Frame : Rec;
+
+package Aggr32_Pkg.Child is
+end Aggr32_Pkg.Child;
diff --git a/gcc/testsuite/gnat.dg/aggr32_pkg.ads b/gcc/testsuite/gnat.dg/aggr32_pkg.ads
new file mode 100644
index 0000000..e0e8bef
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/aggr32_pkg.ads
@@ -0,0 +1,8 @@
+package Aggr32_Pkg is
+
+ type Rec is record
+ Width : Positive;
+ Height : Positive;
+ end record;
+
+end Aggr32_Pkg;
diff --git a/gcc/testsuite/gnat.dg/specs/generic_inst6.ads b/gcc/testsuite/gnat.dg/specs/generic_inst6.ads
new file mode 100644
index 0000000..0f15207
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/specs/generic_inst6.ads
@@ -0,0 +1,6 @@
+-- { dg-do compile }
+
+with Generic_Inst6_Pkg1.Child.Grand2;
+with Generic_Inst6_Pkg3;
+
+package Generic_Inst6 is new Generic_Inst6_Pkg3.Grand2;
diff --git a/gcc/testsuite/gnat.dg/specs/generic_inst6_pkg1-child-grand1.ads b/gcc/testsuite/gnat.dg/specs/generic_inst6_pkg1-child-grand1.ads
new file mode 100644
index 0000000..4d8e7ce
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/specs/generic_inst6_pkg1-child-grand1.ads
@@ -0,0 +1,3 @@
+generic
+package Generic_Inst6_Pkg1.Child.Grand1 is
+end Generic_Inst6_Pkg1.Child.Grand1;
diff --git a/gcc/testsuite/gnat.dg/specs/generic_inst6_pkg1-child-grand2.ads b/gcc/testsuite/gnat.dg/specs/generic_inst6_pkg1-child-grand2.ads
new file mode 100644
index 0000000..326a3e0
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/specs/generic_inst6_pkg1-child-grand2.ads
@@ -0,0 +1,6 @@
+with Generic_Inst6_Pkg1.Child.Grand1;
+
+generic
+package Generic_Inst6_Pkg1.Child.Grand2 is
+ package My_Grand1 is new Generic_Inst6_Pkg1.Child.Grand1;
+end Generic_Inst6_Pkg1.Child.Grand2;
diff --git a/gcc/testsuite/gnat.dg/specs/generic_inst6_pkg1-child.ads b/gcc/testsuite/gnat.dg/specs/generic_inst6_pkg1-child.ads
new file mode 100644
index 0000000..3676052
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/specs/generic_inst6_pkg1-child.ads
@@ -0,0 +1,3 @@
+generic
+package Generic_Inst6_Pkg1.Child is
+end Generic_Inst6_Pkg1.Child;
diff --git a/gcc/testsuite/gnat.dg/specs/generic_inst6_pkg1.ads b/gcc/testsuite/gnat.dg/specs/generic_inst6_pkg1.ads
new file mode 100644
index 0000000..a480bbd
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/specs/generic_inst6_pkg1.ads
@@ -0,0 +1,3 @@
+generic
+package Generic_Inst6_Pkg1 is
+end Generic_Inst6_Pkg1;
diff --git a/gcc/testsuite/gnat.dg/specs/generic_inst6_pkg2.ads b/gcc/testsuite/gnat.dg/specs/generic_inst6_pkg2.ads
new file mode 100644
index 0000000..98b2011
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/specs/generic_inst6_pkg2.ads
@@ -0,0 +1,3 @@
+with Generic_Inst6_Pkg1;
+
+package Generic_Inst6_Pkg2 is new Generic_Inst6_Pkg1;
diff --git a/gcc/testsuite/gnat.dg/specs/generic_inst6_pkg3.ads b/gcc/testsuite/gnat.dg/specs/generic_inst6_pkg3.ads
new file mode 100644
index 0000000..395b9f0
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/specs/generic_inst6_pkg3.ads
@@ -0,0 +1,4 @@
+with Generic_Inst6_Pkg1.Child;
+with Generic_Inst6_Pkg2;
+
+package Generic_Inst6_Pkg3 is new Generic_Inst6_Pkg2.Child;
diff --git a/gcc/testsuite/gnat.dg/specs/generic_inst7.ads b/gcc/testsuite/gnat.dg/specs/generic_inst7.ads
new file mode 100644
index 0000000..3132525
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/specs/generic_inst7.ads
@@ -0,0 +1,17 @@
+-- { dg-do compile }
+
+package Generic_Inst7 is
+
+ function F return Integer is (0);
+
+ generic
+ with function Foo return Integer;
+ package P is
+ type Color is (Foo);
+ end P;
+
+ package My_P is new P (F);
+
+ I : Integer := My_P.Foo; -- { dg-error "expected type|found type" }
+
+end Generic_Inst7;
diff --git a/gcc/testsuite/gnat.dg/specs/generic_inst8.ads b/gcc/testsuite/gnat.dg/specs/generic_inst8.ads
new file mode 100644
index 0000000..0eac709
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/specs/generic_inst8.ads
@@ -0,0 +1,18 @@
+-- { dg-do compile }
+
+package Generic_Inst8 is
+
+ function F return Integer is (0);
+
+ generic
+ with function Foo return Integer;
+ package P is
+ type Color1 is (Foo);
+ type Color2 is (Foo);
+ end P;
+
+ package My_P is new P (F);
+
+ I : Integer := My_P.Foo; -- { dg-error "no visible interpretation|use" }
+
+end Generic_Inst8;
diff --git a/gcc/testsuite/rust/compile/attr-macro.rs b/gcc/testsuite/rust/compile/attr-macro.rs
new file mode 100644
index 0000000..de9fce1
--- /dev/null
+++ b/gcc/testsuite/rust/compile/attr-macro.rs
@@ -0,0 +1,7 @@
+macro_rules! foo {
+ () => { #[cfg(all())] 12 }
+}
+
+fn main() -> i32 {
+ foo!()
+}
diff --git a/gcc/testsuite/rust/compile/attr_malformed_doc.rs b/gcc/testsuite/rust/compile/attr_malformed_doc.rs
new file mode 100644
index 0000000..6b9ef61
--- /dev/null
+++ b/gcc/testsuite/rust/compile/attr_malformed_doc.rs
@@ -0,0 +1,3 @@
+// { dg-error "valid forms for the attribute are ...doc.hidden.inline....... and ...doc = . string ..." "" { target *-*-* } .+1 }
+#[doc]
+trait MyTrait {}
diff --git a/gcc/testsuite/rust/compile/attr_malformed_path.rs b/gcc/testsuite/rust/compile/attr_malformed_path.rs
new file mode 100644
index 0000000..2bccf37
--- /dev/null
+++ b/gcc/testsuite/rust/compile/attr_malformed_path.rs
@@ -0,0 +1,3 @@
+#[cfg_attr(target_arch = "x86_64", path = (target_arch = "x86", path = "x86.rs"))]
+mod imp {}
+// { dg-error "malformed .path. attribute input" "" { target *-*-* } .-2 }
diff --git a/gcc/testsuite/rust/compile/cfg-test.rs b/gcc/testsuite/rust/compile/cfg-test.rs
new file mode 100644
index 0000000..a2e870c
--- /dev/null
+++ b/gcc/testsuite/rust/compile/cfg-test.rs
@@ -0,0 +1,4 @@
+#[test]
+fn foo() {
+ some_function_which_doesnt_exist();
+}
diff --git a/gcc/testsuite/rust/compile/enum_discriminant3.rs b/gcc/testsuite/rust/compile/enum_discriminant3.rs
new file mode 100644
index 0000000..32c79a5
--- /dev/null
+++ b/gcc/testsuite/rust/compile/enum_discriminant3.rs
@@ -0,0 +1,8 @@
+const x: isize = 1;
+// { dg-warning "unused name" "" { target *-*-* } .-1 }
+
+fn main() {
+ enum Foo {
+ Bar = x,
+ }
+}
diff --git a/gcc/testsuite/rust/compile/format_args_concat.rs b/gcc/testsuite/rust/compile/format_args_concat.rs
new file mode 100644
index 0000000..b180667
--- /dev/null
+++ b/gcc/testsuite/rust/compile/format_args_concat.rs
@@ -0,0 +1,51 @@
+#![feature(rustc_attrs)]
+
+#[rustc_builtin_macro]
+macro_rules! format_args {
+ () => {};
+}
+
+#[rustc_builtin_macro]
+macro_rules! concat {
+ () => {};
+}
+
+#[lang = "sized"]
+trait Sized {}
+
+pub mod core {
+ pub mod fmt {
+ pub struct Formatter;
+ pub struct Result;
+
+ pub struct Arguments<'a>;
+
+ impl<'a> Arguments<'a> {
+ pub fn new_v1(_: &'a [&'static str], _: &'a [ArgumentV1<'a>]) -> Arguments<'a> {
+ Arguments
+ }
+ }
+
+ pub struct ArgumentV1<'a>;
+
+ impl<'a> ArgumentV1<'a> {
+ pub fn new<'b, T>(_: &'b T, _: fn(&T, &mut Formatter) -> Result) -> ArgumentV1 {
+ ArgumentV1
+ }
+ }
+
+ pub trait Display {
+ fn fmt(&self, _: &mut Formatter) -> Result;
+ }
+
+ impl Display for i32 {
+ fn fmt(&self, _: &mut Formatter) -> Result {
+ Result
+ }
+ }
+ }
+}
+
+fn main() {
+ let _formatted = format_args!(concat!("hello ", "{}"), 15);
+}
diff --git a/gcc/testsuite/rust/compile/global-path-array.rs b/gcc/testsuite/rust/compile/global-path-array.rs
new file mode 100644
index 0000000..c3aa024
--- /dev/null
+++ b/gcc/testsuite/rust/compile/global-path-array.rs
@@ -0,0 +1,5 @@
+const X: i32 = 1;
+
+pub fn foo() -> [i32; 1] {
+ [::X]
+}
diff --git a/gcc/testsuite/rust/compile/impl_fnptr.rs b/gcc/testsuite/rust/compile/impl_fnptr.rs
new file mode 100644
index 0000000..20c9d88
--- /dev/null
+++ b/gcc/testsuite/rust/compile/impl_fnptr.rs
@@ -0,0 +1,18 @@
+#[lang = "sized"]
+pub trait Sized {}
+
+#[lang = "eq"]
+pub trait PartialEq<Rhs: ?Sized = Self> {
+ fn eq(&self, other: &Rhs) -> bool;
+
+ fn ne(&self, other: &Rhs) -> bool {
+ !self.eq(other)
+ }
+}
+
+impl<Ret> PartialEq for extern "C" fn() -> Ret {
+ #[inline]
+ fn eq(&self, other: &Self) -> bool {
+ *self as usize == *other as usize
+ }
+}
diff --git a/gcc/testsuite/rust/compile/import_wildcards.rs b/gcc/testsuite/rust/compile/import_wildcards.rs
new file mode 100644
index 0000000..3fc3658
--- /dev/null
+++ b/gcc/testsuite/rust/compile/import_wildcards.rs
@@ -0,0 +1,8 @@
+mod x {}
+
+mod y {}
+
+fn main() {
+ use x as _;
+ use y as _;
+}
diff --git a/gcc/testsuite/rust/compile/issue-1725-2.rs b/gcc/testsuite/rust/compile/issue-1725-2.rs
index 726d967..d6a2d68 100644
--- a/gcc/testsuite/rust/compile/issue-1725-2.rs
+++ b/gcc/testsuite/rust/compile/issue-1725-2.rs
@@ -26,6 +26,5 @@ pub fn foo<T: core::ops::Add<Output = i32>>(a: T) -> i32 {
pub fn main() {
foo(123f32);
- // { dg-error "type mismatch, expected .i32. but got .f32." "" { target *-*-* } .-1 }
- // { dg-error "bounds not satisfied for f32 .Add. is not satisfied" "" { target *-*-* } .-2 }
+ // { dg-error "bounds not satisfied for f32 .Add. is not satisfied" "" { target *-*-* } .-1 }
}
diff --git a/gcc/testsuite/rust/compile/issue-2394.rs b/gcc/testsuite/rust/compile/issue-2394.rs
index 92f7afc..b5b5394 100644
--- a/gcc/testsuite/rust/compile/issue-2394.rs
+++ b/gcc/testsuite/rust/compile/issue-2394.rs
@@ -1,5 +1,6 @@
const A: i32 = (1 / 0);
// { dg-error "division by zero" "" { target *-*-* } .-1 }
+// { dg-error "is not a constant expression" "" { target *-*-* } .-2 }
fn main() {
let a = 1 / 0;
diff --git a/gcc/testsuite/rust/compile/issue-3538.rs b/gcc/testsuite/rust/compile/issue-3538.rs
new file mode 100644
index 0000000..7269457
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3538.rs
@@ -0,0 +1,9 @@
+enum A {
+ Value(()),
+}
+
+fn main() {
+ let a = A::Value(());
+ a == A::Value;
+ // { dg-error "variant expected constructor call" "" { target *-*-* } .-1 }
+}
diff --git a/gcc/testsuite/rust/compile/issue-3556.rs b/gcc/testsuite/rust/compile/issue-3556.rs
new file mode 100644
index 0000000..be7d85a
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3556.rs
@@ -0,0 +1,4 @@
+fn main() {
+ let ref mut a @ (ref mut b,);
+ // { dg-error "expected T\\?, found tuple" "" { target *-*-* } .-1 }
+} \ No newline at end of file
diff --git a/gcc/testsuite/rust/compile/issue-3592.rs b/gcc/testsuite/rust/compile/issue-3592.rs
new file mode 100644
index 0000000..34018d1
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3592.rs
@@ -0,0 +1,7 @@
+pub trait X {
+ fn x() {
+ fn f(&mut self) {}
+ // { dg-error ".self. parameter is only allowed in associated functions" "" { target *-*-* } .-1 }
+ f();
+ }
+}
diff --git a/gcc/testsuite/rust/compile/issue-3645.rs b/gcc/testsuite/rust/compile/issue-3645.rs
new file mode 100644
index 0000000..91285f1
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3645.rs
@@ -0,0 +1,6 @@
+// { dg-warning "unused name 'y'" "" { target *-*-* } 5 }
+// { dg-warning "unused name 'z'" "" { target *-*-* } 5 }
+
+fn main() {
+ let (ref y,z) = (1i32, 2u32);
+} \ No newline at end of file
diff --git a/gcc/testsuite/rust/compile/issue-3726.rs b/gcc/testsuite/rust/compile/issue-3726.rs
new file mode 100644
index 0000000..ced87a5
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3726.rs
@@ -0,0 +1,17 @@
+pub enum TypeCtor {
+ Slice,
+ Array,
+}
+pub struct ApplicationTy(TypeCtor);
+
+macro_rules! ty_app {
+ ($ctor:pat) => {
+ ApplicationTy($ctor)
+ };
+}
+
+pub fn foo(ty: ApplicationTy) {
+ match ty {
+ ty_app!(TypeCtor::Array) => {}
+ }
+}
diff --git a/gcc/testsuite/rust/compile/issue-3898.rs b/gcc/testsuite/rust/compile/issue-3898.rs
new file mode 100644
index 0000000..114370c
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3898.rs
@@ -0,0 +1,112 @@
+// { dg-additional-options "-frust-compile-until=lowering" }
+
+#[lang = "sized"]
+trait Sized {}
+
+enum Result<T, E> {
+ Ok(T),
+ Err(E),
+}
+
+use Result::{Err, Ok};
+
+struct Utf8Error;
+
+const CONT_MASK: u8 = 15;
+const TAG_CONT_U8: u8 = 15;
+
+#[inline(always)]
+pub fn run_utf8_validation(v: &[u8]) -> Result<(), Utf8Error> {
+ let mut index = 0;
+ let len = 64;
+
+ let usize_bytes = 8;
+ let ascii_block_size = 2 * usize_bytes;
+ let blocks_end = if len >= ascii_block_size {
+ len - ascii_block_size + 1
+ } else {
+ 0
+ };
+
+ while index < len {
+ let old_offset = index;
+ macro_rules! err {
+ ($error_len: expr) => {
+ return Err(Utf8Error)
+ };
+ }
+
+ macro_rules! next {
+ () => {{
+ index += 1;
+ // we needed data, but there was none: error!
+ if index >= len {
+ err!(None)
+ }
+ v[index]
+ }};
+ }
+
+ let first = v[index];
+ if first >= 128 {
+ let w = 15;
+ // 2-byte encoding is for codepoints \u{0080} to \u{07ff}
+ // first C2 80 last DF BF
+ // 3-byte encoding is for codepoints \u{0800} to \u{ffff}
+ // first E0 A0 80 last EF BF BF
+ // excluding surrogates codepoints \u{d800} to \u{dfff}
+ // ED A0 80 to ED BF BF
+ // 4-byte encoding is for codepoints \u{1000}0 to \u{10ff}ff
+ // first F0 90 80 80 last F4 8F BF BF
+ //
+ // Use the UTF-8 syntax from the RFC
+ //
+ // https://tools.ietf.org/html/rfc3629
+ // UTF8-1 = %x00-7F
+ // UTF8-2 = %xC2-DF UTF8-tail
+ // UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
+ // %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
+ // UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
+ // %xF4 %x80-8F 2( UTF8-tail )
+ match w {
+ 2 => {
+ if next!() & !CONT_MASK != TAG_CONT_U8 {
+ err!(Some(1))
+ }
+ }
+ 3 => {
+ match (first, next!()) {
+ (0xE0, 0xA0..=0xBF)
+ | (0xE1..=0xEC, 0x80..=0xBF)
+ | (0xED, 0x80..=0x9F)
+ | (0xEE..=0xEF, 0x80..=0xBF) => {}
+ _ => err!(Some(1)),
+ }
+ if next!() & !CONT_MASK != TAG_CONT_U8 {
+ err!(Some(2))
+ }
+ }
+ 4 => {
+ match (first, next!()) {
+ (0xF0, 0x90..=0xBF) | (0xF1..=0xF3, 0x80..=0xBF) | (0xF4, 0x80..=0x8F) => {}
+ _ => err!(Some(1)),
+ }
+ if next!() & !CONT_MASK != TAG_CONT_U8 {
+ err!(Some(2))
+ }
+ if next!() & !CONT_MASK != TAG_CONT_U8 {
+ err!(Some(3))
+ }
+ }
+ _ => err!(Some(1)),
+ }
+ index += 1;
+ } else {
+ index += 1;
+ }
+ }
+
+ Ok(())
+}
+
+fn main() {}
diff --git a/gcc/testsuite/rust/compile/issue-3922.rs b/gcc/testsuite/rust/compile/issue-3922.rs
new file mode 100644
index 0000000..3c07f94
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3922.rs
@@ -0,0 +1,12 @@
+struct S(
+ [u8; {
+ {
+ // { dg-error "mismatched types. expected .... but got ..integer.. .E0308." "" { target *-*-* } .-1 }
+ struct Z;
+ 0
+ }
+ 0
+ }],
+);
+
+fn main() {}
diff --git a/gcc/testsuite/rust/compile/issue-3924.rs b/gcc/testsuite/rust/compile/issue-3924.rs
new file mode 100644
index 0000000..cc423ce
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3924.rs
@@ -0,0 +1,6 @@
+pub fn main() {
+ const S: usize = 23 as i64;
+ // { dg-error {mismatched types, expected .usize. but got .i64.} "" { target *-*-* } .-1 }
+ [0; S];
+ ()
+}
diff --git a/gcc/testsuite/rust/compile/issue-3928.rs b/gcc/testsuite/rust/compile/issue-3928.rs
new file mode 100644
index 0000000..639d4c8
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3928.rs
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options "-fsyntax-only" }
+
+#![feature(exclusive_range_pattern)]
+
+fn Foo() {
+ let x = 1u32;
+
+ match x {
+ 3..-1 => 4,
+ };
+}
diff --git a/gcc/testsuite/rust/compile/issue-3929-1.rs b/gcc/testsuite/rust/compile/issue-3929-1.rs
new file mode 100644
index 0000000..3d7b056
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3929-1.rs
@@ -0,0 +1,9 @@
+// { dg-options "-w" }
+struct S();
+
+fn main() {
+ let s = S{};
+ match s {
+ S{..} => {}
+ }
+}
diff --git a/gcc/testsuite/rust/compile/issue-3929-2.rs b/gcc/testsuite/rust/compile/issue-3929-2.rs
new file mode 100644
index 0000000..5f45a7c
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3929-2.rs
@@ -0,0 +1,12 @@
+// { dg-options "-w" }
+struct S {
+ x: i32,
+ y: i32,
+}
+
+fn main() {
+ let s = S{x: 1, y: 2};
+ match s {
+ S{x: 1, ..} => {}
+ }
+}
diff --git a/gcc/testsuite/rust/compile/issue-3930.rs b/gcc/testsuite/rust/compile/issue-3930.rs
new file mode 100644
index 0000000..dfcd19a
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3930.rs
@@ -0,0 +1,4 @@
+// { dg-additional-options "-w" }
+fn main() {
+ let (a, .., b) = (2, 3);
+}
diff --git a/gcc/testsuite/rust/compile/issue-3947.rs b/gcc/testsuite/rust/compile/issue-3947.rs
new file mode 100644
index 0000000..58ccde6
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3947.rs
@@ -0,0 +1,10 @@
+enum _Enum {
+ A(),
+}
+
+type _E = _Enum;
+
+// { dg-warning "function is never used: '_a'" "" { target *-*-* } .+1 }
+const fn _a() -> _Enum {
+ _E::A()
+}
diff --git a/gcc/testsuite/rust/compile/issue-3958.rs b/gcc/testsuite/rust/compile/issue-3958.rs
new file mode 100644
index 0000000..935b512
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3958.rs
@@ -0,0 +1,11 @@
+// { dg-options "-fsyntax-only" }
+trait A {
+ fn a(&self) -> <Self as A>::X;
+}
+
+impl A for u32 {}
+
+fn main() {
+ let a: u32 = 0;
+ let b: u32 = a.a();
+}
diff --git a/gcc/testsuite/rust/compile/issue-3965-1.rs b/gcc/testsuite/rust/compile/issue-3965-1.rs
new file mode 100644
index 0000000..291a220
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3965-1.rs
@@ -0,0 +1,4 @@
+fn main() {
+ [(); { continue }];
+ // { dg-error ".continue. outside of a loop .E0268." "" { target *-*-* } .-1 }
+}
diff --git a/gcc/testsuite/rust/compile/issue-3965-2.rs b/gcc/testsuite/rust/compile/issue-3965-2.rs
new file mode 100644
index 0000000..d48503f
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3965-2.rs
@@ -0,0 +1,7 @@
+fn main() {
+ loop { continue }
+
+ [(); {while true {break}; 0}];
+
+ [(); {while true {break}; 0}];
+}
diff --git a/gcc/testsuite/rust/compile/issue-3966.rs b/gcc/testsuite/rust/compile/issue-3966.rs
new file mode 100644
index 0000000..20d3031
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3966.rs
@@ -0,0 +1,5 @@
+struct S {
+ #[cfg_attr()]
+ field: u8,
+ // { dg-error "malformed .cfg_attr. attribute input" "" { target *-*-* } .-2 }
+}
diff --git a/gcc/testsuite/rust/compile/issue-3969.rs b/gcc/testsuite/rust/compile/issue-3969.rs
new file mode 100644
index 0000000..9608589
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3969.rs
@@ -0,0 +1,30 @@
+#[lang = "sized"]
+pub trait Sized {
+ // Empty.
+}
+
+#[lang = "fn_once"]
+pub trait FnOnce<Args> {
+ #[lang = "fn_once_output"]
+ type Output;
+
+ extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
+}
+
+fn main() {
+ [(); {
+ while true {
+ // { dg-error ".constexpr. loop iteration count exceeds limit" "" { target *-*-* } .-1 }
+ break 9;
+ // { dg-error "can only .break. with a value inside a .loop. block .E0571." "" { target *-*-* } .-1 }
+ }
+ 51
+ }];
+
+ while true {
+ break (|| {
+ // { dg-error "can only .break. with a value inside a .loop. block .E0571." "" { target *-*-* } .-1 }
+ let while_true = 9;
+ });
+ }
+}
diff --git a/gcc/testsuite/rust/compile/issue-3974.rs b/gcc/testsuite/rust/compile/issue-3974.rs
new file mode 100644
index 0000000..dfd693a
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3974.rs
@@ -0,0 +1,8 @@
+impl<'a, F> RunUntil<'a, F> {
+ // { dg-error "could not resolve type path" "" { target *-*-* } .-1 }
+ fn project<'pin>() -> Projection<'pin, 'a, F> {
+ // { dg-error "could not resolve type path" "" { target *-*-* } .-1 }
+ Self!()
+ // { dg-error "could not resolve macro invocation" "" { target *-*-* } .-1 }
+ }
+}
diff --git a/gcc/testsuite/rust/compile/issue-4090-1.rs b/gcc/testsuite/rust/compile/issue-4090-1.rs
new file mode 100644
index 0000000..9f83835
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-4090-1.rs
@@ -0,0 +1,68 @@
+mod core {
+ mod marker {
+ #[lang = "sized"]
+ pub trait Sized {}
+
+ #[lang = "phantom_data"]
+ #[stable(feature = "rust1", since = "1.0.0")]
+ pub struct PhantomData<T: ?Sized>;
+
+ #[unstable(feature = "structural_match", issue = "31434")]
+ #[lang = "structural_teq"]
+ pub trait StructuralEq {
+ // Empty.
+ }
+
+ #[unstable(feature = "structural_match", issue = "31434")]
+ #[lang = "structural_peq"]
+ pub trait StructuralPartialEq {
+ // Empty.
+ }
+ }
+
+ pub mod cmp {
+ use super::marker::Sized;
+
+ #[lang = "eq"]
+ pub trait PartialEq<Rhs: ?Sized = Self> {
+ fn eq(&self, other: &Rhs) -> bool;
+
+ fn ne(&self, other: &Rhs) -> bool {
+ !self.eq(other)
+ }
+ }
+
+ pub trait Eq: PartialEq<Self> {
+ fn assert_receiver_is_total_eq(&self) {}
+ }
+ }
+
+ pub mod ptr {
+
+ use super::cmp::{Eq, PartialEq};
+
+ macro_rules! fnptr_impls_safety_abi {
+ ($FnTy: ty, $($Arg: ident),*) => {
+ #[stable(feature = "fnptr_impls", since = "1.4.0")]
+ impl<Ret, $($Arg),*> PartialEq for $FnTy {
+ #[inline]
+ fn eq(&self, other: &Self) -> bool {
+ *self as usize == *other as usize
+ }
+ }
+
+ #[stable(feature = "fnptr_impls", since = "1.4.0")]
+ impl<Ret, $($Arg),*> Eq for $FnTy {}
+
+ }
+ }
+
+ fnptr_impls_safety_abi! { extern "Rust" fn() -> Ret, }
+ }
+}
+
+#[derive(PartialEq, Eq)]
+struct AllowedBelow {
+ // { dg-warning "struct is never constructed" "" { target *-*-* } .-1 }
+ f: fn(),
+}
diff --git a/gcc/testsuite/rust/compile/issue-4090-2.rs b/gcc/testsuite/rust/compile/issue-4090-2.rs
new file mode 100644
index 0000000..75d6b7c
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-4090-2.rs
@@ -0,0 +1,71 @@
+mod core {
+ mod marker {
+ #[lang = "sized"]
+ pub trait Sized {}
+
+ #[lang = "phantom_data"]
+ #[stable(feature = "rust1", since = "1.0.0")]
+ pub struct PhantomData<T: ?Sized>;
+
+ #[unstable(feature = "structural_match", issue = "31434")]
+ #[lang = "structural_teq"]
+ pub trait StructuralEq {
+ // Empty.
+ }
+
+ #[unstable(feature = "structural_match", issue = "31434")]
+ #[lang = "structural_peq"]
+ pub trait StructuralPartialEq {
+ // Empty.
+ }
+ }
+
+ pub mod cmp {
+ use super::marker::Sized;
+
+ #[lang = "eq"]
+ pub trait PartialEq<Rhs: ?Sized = Self> {
+ fn eq(&self, other: &Rhs) -> bool;
+
+ fn ne(&self, other: &Rhs) -> bool {
+ !self.eq(other)
+ }
+ }
+
+ pub trait Eq: PartialEq<Self> {
+ fn assert_receiver_is_total_eq(&self) {}
+ }
+ }
+
+ pub mod ptr {
+
+ use super::cmp::{Eq, PartialEq};
+
+ macro_rules! fnptr_impls_safety_abi {
+ ($FnTy: ty, $($Arg: ident),*) => {
+ #[stable(feature = "fnptr_impls", since = "1.4.0")]
+ impl<Ret, $($Arg),*> PartialEq for $FnTy {
+ #[inline]
+ fn eq(&self, other: &Self) -> bool {
+ *self as usize == *other as usize
+ }
+ }
+
+ #[stable(feature = "fnptr_impls", since = "1.4.0")]
+ impl<Ret, $($Arg),*> Eq for $FnTy {}
+
+ }
+ }
+
+ fnptr_impls_safety_abi! { extern "Rust" fn() -> Ret, }
+ fnptr_impls_safety_abi! { extern "C" fn() -> Ret, }
+ fnptr_impls_safety_abi! { unsafe extern "Rust" fn() -> Ret, }
+ fnptr_impls_safety_abi! { unsafe extern "C" fn() -> Ret, }
+ }
+}
+
+#[derive(PartialEq, Eq)]
+struct AllowedBelow {
+ // { dg-warning "struct is never constructed" "" { target *-*-* } .-1 }
+ f: fn(),
+}
diff --git a/gcc/testsuite/rust/compile/issue-4139.rs b/gcc/testsuite/rust/compile/issue-4139.rs
new file mode 100644
index 0000000..dc62d1c
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-4139.rs
@@ -0,0 +1,7 @@
+// { dg-skip-if "" { *-*-* } { "-m32" } { "" } }
+const X: i32 = const {
+ let a = 0x736f6d6570736575;
+ // { dg-error "integer overflows the respective type" "" { target *-*-* } .-1 }
+ let b = 14;
+ a + b
+};
diff --git a/gcc/testsuite/rust/compile/issue-4145.rs b/gcc/testsuite/rust/compile/issue-4145.rs
new file mode 100644
index 0000000..98b33ca
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-4145.rs
@@ -0,0 +1,13 @@
+// { dg-excess-errors "warnings" }
+
+struct S {
+ field: [u8; {
+ #[path = "outer/inner.rs"]
+ // { dg-warning "error handling module file for .inner." "#4145" { xfail *-*-* } .+1 }
+ mod inner;
+ // OK
+ 0
+ }],
+}
+
+fn main() {}
diff --git a/gcc/testsuite/rust/compile/issue-4146.rs b/gcc/testsuite/rust/compile/issue-4146.rs
new file mode 100644
index 0000000..efb3ee2
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-4146.rs
@@ -0,0 +1,3 @@
+const _NISIZE_DIV_P: &isize = &(1isize / 0);
+// { dg-error "division by zero" "" { target *-*-* } .-1 }
+// { dg-error "is not a constant expression" "" { target *-*-* } .-2 }
diff --git a/gcc/testsuite/rust/compile/issue-4148.rs b/gcc/testsuite/rust/compile/issue-4148.rs
new file mode 100644
index 0000000..599d739
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-4148.rs
@@ -0,0 +1,26 @@
+// { dg-excess-errors "warnings" }
+
+// TODO: all `xfail` conditions should be changed to `target` once the ICE in #4148 is resolved
+
+pub fn ret_parens(x: i32) -> i32 {
+ // { dg-warning "unnecessary parentheses around block return value" "#4148" { xfail *-*-* } .+1 }
+ ((x+1))
+}
+
+// { dg-warning "unnecessary parentheses around type" "#4148" { xfail *-*-* } .+1 }
+// { dg-warning "unnecessary parentheses around pattern" "#4148" { xfail *-*-* } .+1 }
+pub fn arg_ret_parens((x): (i32)) -> (i32) {
+ // { dg-warning "unnecessary parentheses around block return value" "#4148" { xfail *-*-* } .+1 }
+ ((x+1))
+}
+
+// { dg-warning "unnecessary parentheses around type" "#4148" { xfail *-*-* } .+1 }
+pub fn ret_rpit_parens2(x: i32) -> (i32) {
+ // { dg-warning "unnecessary parentheses around block return value" "#4148" { xfail *-*-* } .+1 }
+ ((x+1))
+}
+
+pub fn ret_parens3(x: i32) -> i32 {
+ // { dg-warning "unnecessary parentheses around block return value" "#4148" { xfail *-*-* } .+1 }
+ ((x+1))
+}
diff --git a/gcc/testsuite/rust/compile/issue-4155.rs b/gcc/testsuite/rust/compile/issue-4155.rs
new file mode 100644
index 0000000..9fae613
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-4155.rs
@@ -0,0 +1,7 @@
+struct Bug {
+ inner: [(); match Vec::new {
+ f @ |n() => 1
+// { dg-error "failed to parse pattern to bind" "" { target *-*-* } .-1 }
+// { dg-error "unexpected token .|. in pattern" "" { target *-*-* } .-2 }
+ }],
+}
diff --git a/gcc/testsuite/rust/compile/issue-4165.rs b/gcc/testsuite/rust/compile/issue-4165.rs
new file mode 100644
index 0000000..bc513da
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-4165.rs
@@ -0,0 +1,12 @@
+const N: usize = 2;
+const ARR: [i32; N] = [42; X];
+// { dg-error {cannot find value .X. in this scope \[E0425\]} "" { target *-*-* } .-1 }
+// { dg-error {mismatched types, expected .\[i32; 2]. but got .<tyty::error>. \[E0308\]} "" { target *-*-* } .-2 }
+// { dg-error {mismatched types, expected .usize. but got .bool. \[E0308\]} "" { target *-*-* } .-3 }
+const X: bool = (N[0] == 99) && (ARR[0] == 0);
+// { dg-error {the type .usize. cannot be indexed by .<integer>. \[E0277\]} "" { target *-*-* } .-1 }
+// { dg-error {mismatched types, expected .<tyty::error>. but got .<integer>. \[E0308\]} "" { target *-*-* } .-2 }
+
+fn main() {
+ let _ = X;
+}
diff --git a/gcc/testsuite/rust/compile/issue-4168.rs b/gcc/testsuite/rust/compile/issue-4168.rs
new file mode 100644
index 0000000..abb1190
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-4168.rs
@@ -0,0 +1,7 @@
+const fn add(x: usize, y: usize) -> i32 {
+ add + y
+ // { dg-error "cannot apply operator .+. to types fn .x usize,y usize,. -> i32 and usize" "" { target *-*-* } .-1 }
+}
+const ARR: [i32; add(1, 2)] = [5, 6, 1];
+// { dg-error "mismatched types, expected .usize. but got .i32. .E0308." "" { target *-*-* } .-1 }
+// { dg-error "mismatched types" "" { target *-*-* } .-2 }
diff --git a/gcc/testsuite/rust/compile/issue-4212.rs b/gcc/testsuite/rust/compile/issue-4212.rs
new file mode 100644
index 0000000..e068e45
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-4212.rs
@@ -0,0 +1,5 @@
+#![derive(PartialOrd, PartialEq)]
+// { dg-error "derive attribute cannot be used at crate level" "" { target *-*-* } .-1 }
+pub fn check_ge(a: i32, b: i32) -> bool {
+ a >= b
+}
diff --git a/gcc/testsuite/rust/compile/issue-4231.rs b/gcc/testsuite/rust/compile/issue-4231.rs
new file mode 100644
index 0000000..4629baa
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-4231.rs
@@ -0,0 +1,6 @@
+#[repr = ""] // { dg-error "malformed .repr. attribute" }
+struct ThreeInts {
+ first: i16,
+ second: i8,
+ third: i32
+}
diff --git a/gcc/testsuite/rust/compile/macros/mbe/macro-issue4054.rs b/gcc/testsuite/rust/compile/macros/mbe/macro-issue4054.rs
new file mode 100644
index 0000000..6dcab23
--- /dev/null
+++ b/gcc/testsuite/rust/compile/macros/mbe/macro-issue4054.rs
@@ -0,0 +1,14 @@
+#[allow(path_statements)]
+
+macro_rules! array_impl_default {
+ {$t:ident} => {
+ $t;
+ array_impl_default!{}
+ };
+ {} => {}
+}
+
+pub fn foo() {
+ let x = 12;
+ array_impl_default! {x}
+}
diff --git a/gcc/testsuite/rust/compile/macros/mbe/macro49.rs b/gcc/testsuite/rust/compile/macros/mbe/macro49.rs
index 0900f7c..9d63ff1 100644
--- a/gcc/testsuite/rust/compile/macros/mbe/macro49.rs
+++ b/gcc/testsuite/rust/compile/macros/mbe/macro49.rs
@@ -1,3 +1,14 @@
+#[lang = "sized"]
+pub trait Sized {}
+
+#[lang = "fn_once"]
+trait FnOnce<Args> {
+ #[lang = "fn_once_output"]
+ type Output;
+
+ extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
+}
+
macro_rules! closure {
() => {{
14 + 15
diff --git a/gcc/testsuite/rust/compile/macros/mbe/macro58.rs b/gcc/testsuite/rust/compile/macros/mbe/macro58.rs
new file mode 100644
index 0000000..d8f7599
--- /dev/null
+++ b/gcc/testsuite/rust/compile/macros/mbe/macro58.rs
@@ -0,0 +1,12 @@
+pub fn print(a: *const u8) {}
+#[macro_export]
+macro_rules! pr_warn (
+ ($($arg:tt)*) => (
+ $($crate::print($arg))*
+ )
+);
+
+fn main() {
+ pr_warn!("test\0", "test\0");
+ // { dg-error "expecting .;. but .identifier. found" "" { target *-*-* } .-1 }
+}
diff --git a/gcc/testsuite/rust/compile/match-tuplestructpattern-err.rs b/gcc/testsuite/rust/compile/match-tuplestructpattern-err.rs
new file mode 100644
index 0000000..efd1a89
--- /dev/null
+++ b/gcc/testsuite/rust/compile/match-tuplestructpattern-err.rs
@@ -0,0 +1,14 @@
+fn main() {
+ struct A (i32, i32);
+ let a = A (0, 1);
+
+ match a {
+ A (1, 2, 3, 4) => {},
+ // { dg-error "this pattern has 4 fields but the corresponding tuple variant has 2 fields .E0023." "" { target *-*-* } .-1 }
+ A (1, 2, .., 3, 4) => {},
+ // { dg-error "this pattern has 4 fields but the corresponding tuple variant has 2 fields .E0023." "" { target *-*-* } .-1 }
+ A (.., 3, 4, 5) => {},
+ // { dg-error "this pattern has 3 fields but the corresponding tuple variant has 2 fields .E0023." "" { target *-*-* } .-1 }
+ _ => {}
+ }
+} \ No newline at end of file
diff --git a/gcc/testsuite/rust/compile/match-tuplestructpattern-non-variant.rs b/gcc/testsuite/rust/compile/match-tuplestructpattern-non-variant.rs
new file mode 100644
index 0000000..cf751cb
--- /dev/null
+++ b/gcc/testsuite/rust/compile/match-tuplestructpattern-non-variant.rs
@@ -0,0 +1,20 @@
+enum Empty {}
+enum NonEmpty {
+ Foo(i32),
+}
+
+fn f(e: Empty) {
+ match e {
+ Empty(0) => {} // { dg-error "expected tuple struct or tuple variant, found enum 'Empty'" }
+ }
+
+ match e {
+ Empty(Empty(..)) => {} // { dg-error "expected tuple struct or tuple variant, found enum 'Empty'" }
+ }
+}
+
+fn g(e: NonEmpty) {
+ match e {
+ NonEmpty(0) => {} // { dg-error "expected tuple struct or tuple variant, found enum 'NonEmpty'" }
+ }
+}
diff --git a/gcc/testsuite/rust/compile/match-tuplestructpattern-rest.rs b/gcc/testsuite/rust/compile/match-tuplestructpattern-rest.rs
new file mode 100644
index 0000000..4681acb
--- /dev/null
+++ b/gcc/testsuite/rust/compile/match-tuplestructpattern-rest.rs
@@ -0,0 +1,9 @@
+fn main() {
+ struct A (i32, i32);
+ let a = A (0, 1);
+
+ match a {
+ A (0, ..) => {},
+ _ => {}
+ }
+}
diff --git a/gcc/testsuite/rust/compile/parse_closure_bind.rs b/gcc/testsuite/rust/compile/parse_closure_bind.rs
new file mode 100644
index 0000000..1e08197
--- /dev/null
+++ b/gcc/testsuite/rust/compile/parse_closure_bind.rs
@@ -0,0 +1,19 @@
+// { dg-additional-options "-frust-compile-until=typecheck" }
+// TODO: this should typecheck
+
+#[lang = "sized"]
+trait Sized {}
+
+#[lang = "fn_once"]
+pub trait FnOnce<Args> {
+ /// The returned type after the call operator is used.
+ #[lang = "fn_once_output"]
+ type Output;
+
+ /// Performs the call operation.
+ extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
+}
+
+pub fn foo() {
+ (|_a @ _b| {}) (1)
+}
diff --git a/gcc/testsuite/rust/compile/parse_float_dot.rs b/gcc/testsuite/rust/compile/parse_float_dot.rs
new file mode 100644
index 0000000..bfe3da2
--- /dev/null
+++ b/gcc/testsuite/rust/compile/parse_float_dot.rs
@@ -0,0 +1,3 @@
+// floating point literals can't start with a '.'
+// TODO: improve the error message emitted here
+const X: f32 = .5; // { dg-error ".*" }
diff --git a/gcc/testsuite/rust/compile/primitive-import.rs b/gcc/testsuite/rust/compile/primitive-import.rs
new file mode 100644
index 0000000..cc750af
--- /dev/null
+++ b/gcc/testsuite/rust/compile/primitive-import.rs
@@ -0,0 +1,7 @@
+mod primitive {
+ pub use i32;
+}
+
+pub fn foo() -> primitive::i32 {
+ 1
+}
diff --git a/gcc/testsuite/rust/compile/slice_rest_pattern.rs b/gcc/testsuite/rust/compile/slice_rest_pattern.rs
index c27a8dd..bb3c414 100644
--- a/gcc/testsuite/rust/compile/slice_rest_pattern.rs
+++ b/gcc/testsuite/rust/compile/slice_rest_pattern.rs
@@ -1,5 +1,4 @@
-// { dg-options "-fsyntax-only" }
-fn foo(a: &[u32]) {
+pub fn foo(a: &[u32]) {
match a {
[first, ..] => {}
[.., last] => {}
diff --git a/gcc/testsuite/rust/compile/tuple_index_on_non_tuple.rs b/gcc/testsuite/rust/compile/tuple_index_on_non_tuple.rs
new file mode 100644
index 0000000..f94b8c3
--- /dev/null
+++ b/gcc/testsuite/rust/compile/tuple_index_on_non_tuple.rs
@@ -0,0 +1,15 @@
+enum E {
+ V(usize),
+}
+
+struct S {
+ field: i32,
+}
+
+fn main() {
+ let e = E::V(0);
+ let _ = e.0; // { dg-error "expected tuple or tuple struct, found 'E'" }
+
+ let s = S { field: 0 };
+ let _ = s.0; // { dg-error "expected tuple or tuple struct, found 'S'" }
+}
diff --git a/gcc/testsuite/rust/compile/tuplepattern-rest-readonly.rs b/gcc/testsuite/rust/compile/tuplepattern-rest-readonly.rs
new file mode 100644
index 0000000..db165ef
--- /dev/null
+++ b/gcc/testsuite/rust/compile/tuplepattern-rest-readonly.rs
@@ -0,0 +1,5 @@
+fn main() {
+ let (a, .., b) = (1, 1);
+ a = 2; // { dg-error "assignment of read-only variable .a." }
+ b = 2; // { dg-error "assignment of read-only variable .b." }
+} \ No newline at end of file
diff --git a/gcc/testsuite/rust/compile/tuplepattern-restpattern-typecheck-err.rs b/gcc/testsuite/rust/compile/tuplepattern-restpattern-typecheck-err.rs
new file mode 100644
index 0000000..d9f7c18
--- /dev/null
+++ b/gcc/testsuite/rust/compile/tuplepattern-restpattern-typecheck-err.rs
@@ -0,0 +1,8 @@
+fn main() {
+ match (1, 2.2, "not 3") {
+ // { dg-error "expected a tuple with 3 elements, found one with 5 elements" "" { target *-*-* } .+1 }
+ (a, b, .., c, d, e) => {
+ let _ = b + c; // { dg-error "cannot apply operator .+. to types <float> and & str" }
+ }
+ }
+} \ No newline at end of file
diff --git a/gcc/testsuite/rust/compile/use_3.rs b/gcc/testsuite/rust/compile/use_3.rs
new file mode 100644
index 0000000..2cfe38f
--- /dev/null
+++ b/gcc/testsuite/rust/compile/use_3.rs
@@ -0,0 +1,10 @@
+mod intrinsic {
+ pub fn foo() {}
+}
+
+pub mod a {
+ pub fn b() {
+ use crate::intrinsic;
+ intrinsic::foo();
+ }
+}
diff --git a/gcc/testsuite/rust/compile/use_self_alone.rs b/gcc/testsuite/rust/compile/use_self_alone.rs
new file mode 100644
index 0000000..1df923c
--- /dev/null
+++ b/gcc/testsuite/rust/compile/use_self_alone.rs
@@ -0,0 +1,2 @@
+use self;
+// { dg-error ".self. imports are only allowed within a { } list" "" { target *-*-* } .-1 }
diff --git a/gcc/testsuite/rust/compile/use_self_alone_in_list.rs b/gcc/testsuite/rust/compile/use_self_alone_in_list.rs
new file mode 100644
index 0000000..2e87227
--- /dev/null
+++ b/gcc/testsuite/rust/compile/use_self_alone_in_list.rs
@@ -0,0 +1,7 @@
+struct B;
+
+use {B as B2, self};
+// { dg-error ".self. import can only appear in an import list with a non-empty prefix" "" { target *-*-* } .-1 }
+
+use {self};
+// { dg-error ".self. import can only appear in an import list with a non-empty prefix" "" { target *-*-* } .-1 }
diff --git a/gcc/testsuite/rust/core/core.exp b/gcc/testsuite/rust/core/core.exp
new file mode 100644
index 0000000..330c6d5
--- /dev/null
+++ b/gcc/testsuite/rust/core/core.exp
@@ -0,0 +1,37 @@
+# Copyright (C) 2025 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# Compile test libcore, no torture testing.
+#
+# Skip torture testing for now, as it'd be slow
+
+# Load support procs.
+load_lib rust-dg.exp
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+set saved-dg-do-what-default ${dg-do-what-default}
+
+set dg-do-what-default "compile"
+set individual_timeout 600
+dg-additional-files [lsort [glob -nocomplain $srcdir/../../libgrust/rustc-lib/*]]
+dg-runtest $srcdir/../../libgrust/rustc-lib/core/src/lib.rs "-frust-edition=2018 -frust-crate=core -frust-compile-until=astvalidation -w" ""
+set dg-do-what-default ${saved-dg-do-what-default}
+
+# All done.
+dg-finish
diff --git a/gcc/testsuite/rust/execute/inline_asm_inout_ident.rs b/gcc/testsuite/rust/execute/inline_asm_inout_ident.rs
index b0a3d25..324b84d 100644
--- a/gcc/testsuite/rust/execute/inline_asm_inout_ident.rs
+++ b/gcc/testsuite/rust/execute/inline_asm_inout_ident.rs
@@ -1,3 +1,4 @@
+/* { dg-do run { target x86_64*-*-* } } */
/* { dg-output "Value is: 5\r*\n" } */
#![feature(rustc_attrs)]
diff --git a/gcc/testsuite/rust/execute/inline_asm_inout_var.rs b/gcc/testsuite/rust/execute/inline_asm_inout_var.rs
index ff101b8..fff432e 100644
--- a/gcc/testsuite/rust/execute/inline_asm_inout_var.rs
+++ b/gcc/testsuite/rust/execute/inline_asm_inout_var.rs
@@ -1,3 +1,4 @@
+/* { dg-do run { target x86_64*-*-* } } */
/* { dg-output "Value is: 5\r*\n" } */
#![feature(rustc_attrs)]
diff --git a/gcc/testsuite/rust/execute/torture/let-identifierpattern-subpattern.rs b/gcc/testsuite/rust/execute/torture/let-identifierpattern-subpattern.rs
new file mode 100644
index 0000000..fa1f56e
--- /dev/null
+++ b/gcc/testsuite/rust/execute/torture/let-identifierpattern-subpattern.rs
@@ -0,0 +1,11 @@
+fn main() -> i32 {
+ let foo @ (bar, _, _) = (0, 2, 3);
+ let mut ret = 1;
+
+ match foo {
+ (0, 2, 3) => { ret = bar },
+ _ => {}
+ }
+
+ ret
+} \ No newline at end of file
diff --git a/gcc/testsuite/rust/execute/torture/link-name.rs b/gcc/testsuite/rust/execute/torture/link-name.rs
new file mode 100644
index 0000000..1ab1ac1
--- /dev/null
+++ b/gcc/testsuite/rust/execute/torture/link-name.rs
@@ -0,0 +1,16 @@
+// { dg-additional-options "-fdump-rtl-final" }
+// { dg-final { scan-rtl-dump "printf" "final" } }
+// { dg-output "gcc\r*\n" }
+
+extern "C" {
+ #[link_name = "printf"]
+ fn druckt(fmt: *const i8, ...);
+}
+
+fn main() -> i32 {
+ let a = "gcc\0";
+
+ unsafe { druckt("%s\n\0" as *const str as *const i8, a as *const str as *const i8); }
+
+ 0
+}
diff --git a/gcc/testsuite/rust/execute/torture/match-slicepattern-array-2.rs b/gcc/testsuite/rust/execute/torture/match-slicepattern-array-2.rs
new file mode 100644
index 0000000..c6e7762
--- /dev/null
+++ b/gcc/testsuite/rust/execute/torture/match-slicepattern-array-2.rs
@@ -0,0 +1,27 @@
+// { dg-output "correct\r*" }
+extern "C" {
+ fn puts(s: *const i8);
+}
+
+fn main() -> i32 {
+ let a = [0, 4, 5, 6, 1];
+ let mut ret = 1;
+
+ match a {
+ [1, .., b] => {
+ /* should not take this path */
+ unsafe { puts("wrong\0" as *const str as *const i8) }
+ }
+ [0, .., 0] => {
+ /* should not take this path */
+ unsafe { puts("wrong\0" as *const str as *const i8) }
+ },
+ [0, .., b] => {
+ ret -= b;
+ unsafe { puts("correct\0" as *const str as *const i8) }
+ },
+ _ => {}
+ }
+
+ ret
+}
diff --git a/gcc/testsuite/rust/execute/torture/match-slicepattern-slice-2.rs b/gcc/testsuite/rust/execute/torture/match-slicepattern-slice-2.rs
new file mode 100644
index 0000000..2fdffbb
--- /dev/null
+++ b/gcc/testsuite/rust/execute/torture/match-slicepattern-slice-2.rs
@@ -0,0 +1,28 @@
+// { dg-output "correct\r*" }
+extern "C" {
+ fn puts(s: *const i8);
+}
+
+fn main() -> i32 {
+ let arr = [0, 4, 5, 6, 1];
+ let a: &[i32] = &arr;
+ let mut ret = 1;
+
+ match a {
+ [1, .., b] => {
+ /* should not take this path */
+ unsafe { puts("wrong\0" as *const str as *const i8) }
+ }
+ [0, .., 0] => {
+ /* should not take this path */
+ unsafe { puts("wrong\0" as *const str as *const i8) }
+ },
+ [0, .., b] => {
+ ret -= b;
+ unsafe { puts("correct\0" as *const str as *const i8) }
+ },
+ _ => {}
+ }
+
+ ret
+}
diff --git a/gcc/testsuite/rust/execute/torture/match-tuplestructpattern-rest-1.rs b/gcc/testsuite/rust/execute/torture/match-tuplestructpattern-rest-1.rs
new file mode 100644
index 0000000..8d7446d
--- /dev/null
+++ b/gcc/testsuite/rust/execute/torture/match-tuplestructpattern-rest-1.rs
@@ -0,0 +1,24 @@
+// { dg-output "correct\r*" }
+extern "C" {
+ fn puts(s: *const i8);
+}
+
+fn main() -> i32 {
+ struct A (i32, i32, i32);
+ let a = A (0, 1, 2);
+ let mut ret = 1;
+
+ match a {
+ A (1, ..) => {
+ /* should not take this path */
+ unsafe { puts("wrong\0" as *const str as *const i8) }
+ }
+ A (0, b, ..) => {
+ ret -= b;
+ unsafe { puts("correct\0" as *const str as *const i8) }
+ },
+ _ => {}
+ }
+
+ ret
+}
diff --git a/gcc/testsuite/rust/execute/torture/match-tuplestructpattern-rest-2.rs b/gcc/testsuite/rust/execute/torture/match-tuplestructpattern-rest-2.rs
new file mode 100644
index 0000000..f433be9
--- /dev/null
+++ b/gcc/testsuite/rust/execute/torture/match-tuplestructpattern-rest-2.rs
@@ -0,0 +1,28 @@
+// { dg-output "correct\r*" }
+extern "C" {
+ fn puts(s: *const i8);
+}
+
+fn main() -> i32 {
+ struct A (i32, i32, i32);
+ let a = A (0, 3, 1);
+ let mut ret = 1;
+
+ match a {
+ A (1, ..) => {
+ /* should not take this path */
+ unsafe { puts("wrong\0" as *const str as *const i8) }
+ }
+ A (.., 3) => {
+ /* should not take this path */
+ unsafe { puts("wrong\0" as *const str as *const i8) }
+ }
+ A (.., b) => {
+ ret -= b;
+ unsafe { puts("correct\0" as *const str as *const i8) }
+ },
+ _ => {}
+ }
+
+ ret
+}