]> git.ipfire.org Git - thirdparty/gcc.git/log
thirdparty/gcc.git
4 months agoOpenMP: Create additional interop objects with append_args.
Sandra Loosemore [Tue, 25 Mar 2025 15:55:45 +0000 (15:55 +0000)] 
OpenMP: Create additional interop objects with append_args.

This patch adds support for the case where #pragma omp declare variant
with append_args is used inside a #pragma omp dispatch interop that
specifies fewer interop args than required by the variant; new interop
objects are implicitly created and then destroyed around the call to the
variant, using the GOMP_interop builtin.

gcc/fortran/ChangeLog
* trans-openmp.cc (gfc_trans_omp_declare_variant): Remove accidental
redeclaration of pref.

gcc/ChangeLog
* gimplify.cc (modify_call_for_omp_dispatch): Adjust arguments.
Remove the "sorry" for the case where new interop objects must be
constructed, and add code to make it work instead.
(expand_variant_call_expr): Adjust arguments and call to
modify_call_for_omp_dispatch.
(gimplify_variant_call_expr): Simplify logic for calling
expand_variant_call_expr.

gcc/testsuite/ChangeLog
* c-c++-common/gomp/append-args-1.c: Adjust expected behavior.
* c-c++-common/gomp/append-args-interop.c: New.
* c-c++-common/gomp/dispatch-11.c: Adjust expected behavior.
* g++.dg/gomp/append-args-1.C: Likewise.
* gfortran.dg/gomp/append-args-interop.f90: New.
* gfortran.dg/gomp/declare-variant-mod-2.f90: Adjust expected behavior.

libgomp/ChangeLog
* libgomp.texi (OpenMP 5.1): Mark append_args as fully supported.

Co-Authored-By: Tobias Burnus <tburnus@baylibre.com>
4 months agoarm: testsuite: adjust ftest tests
Richard Earnshaw [Tue, 25 Mar 2025 15:36:02 +0000 (15:36 +0000)] 
arm: testsuite: adjust ftest tests

The ftest-*.c tests for Arm check certain ACLE mandated macros to ensure
they are correctly defined based on the selected architecture.  ACLE
states that the macro should be defined if the operation exists in
the hardware, but it doesn't have to exist in the current ISA because
and interworking call to the library function will still result in using
the hardware operation (both GCC and Clang agree on this).  So adjust
the tests accordingly.

Whilst cleaning this up, also remove the now redundant dg-skip-if operations
that were testing for incompatible command-line options.  That should now
be a thing of the past as the framework will clean this up more thoroughly
before running the test, or detect incompatible option combinations.

gcc/testsuite/ChangeLog:

* gcc.target/arm/ftest-armv4t-thumb.c:  Expect __ARM_FEATURE_CLZ to be
defined.  Remove redundant dg-skip-if rules.
* gcc.target/arm/ftest-armv5t-thumb.c: Likewise.
* gcc.target/arm/ftest-armv5te-thumb.c: Likewise.
* gcc.target/arm/ftest-armv6-thumb.c: Likewise.
* gcc.target/arm/ftest-armv6k-thumb.c: Likewise.
* gcc.target/arm/ftest-armv6z-thumb.c: Likewise.
* gcc.target/arm/ftest-armv7em-thumb.c: Remove redundant dg-skip-if
rules.  Add a require-effective-target for armv7em.
* gcc.target/arm/ftest-armv7a-arm.c: Likewise.
* gcc.target/arm/ftest-armv7a-thumb.c: Likewise.
* gcc.target/arm/ftest-armv7r-arm.c: Likewise.
* gcc.target/arm/ftest-armv7r-thumb.c: Likewise.
* gcc.target/arm/ftest-armv7ve-arm.c: Likewise.
* gcc.target/arm/ftest-armv7ve-thumb.c: Likewise.
* gcc.target/arm/ftest-armv8a-arm.c: Likewise.
* gcc.target/arm/ftest-armv8a-thumb.c: Likewise.
* gcc.target/arm/ftest-armv4-arm.c: Remove redundant dg-skip-if rules.
* gcc.target/arm/ftest-armv4t-arm.c: Likewise.
* gcc.target/arm/ftest-armv5t-arm.c: Likewise.
* gcc.target/arm/ftest-armv5te-arm.c: Likewise.
* gcc.target/arm/ftest-armv6-arm.c: Likewise.
* gcc.target/arm/ftest-armv6k-arm.c: Likewise.
* gcc.target/arm/ftest-armv6m-thumb.c: Likewise.
* gcc.target/arm/ftest-armv6t2-arm.c: Likewise.
* gcc.target/arm/ftest-armv6t2-thumb.c: Likewise.
* gcc.target/arm/ftest-armv6z-arm.c: Likewise.

4 months agoi386: Fix up combination of -2 r<<= (x & 7) into btr [PR119428]
Jakub Jelinek [Tue, 25 Mar 2025 15:55:24 +0000 (16:55 +0100)] 
i386: Fix up combination of -2 r<<= (x & 7) into btr [PR119428]

The following patch is miscompiled from r15-8478 but latently already
since my r11-5756 and r11-6631 changes.
The r11-5756 change was
https://gcc.gnu.org/pipermail/gcc-patches/2020-December/561164.html
which changed the splitters to immediately throw away the masking.
And the r11-6631 change was an optimization to recognize
(set (zero_extract:HI (...) (const_int 1) (...)) (const_int 1)
as btr.

The problem is their interaction.  x86 is not a SHIFT_COUNT_TRUNCATED
target, so the masking needs to be explicit in the IL.
And combine.cc (make_field_assignment) has since 1992 optimizations
which try to optimize x &= (-2 r<< y) into zero_extract (x) = 0.
Now, such an optimization is fine if y has not been masked or if the
chosen zero_extract has the same mode as the rotate (or it recognizes
something with a left shift too).  IMHO such optimization is invalid
for SHIFT_COUNT_TRUNCATED targets because we explicitly say that
the masking of the shift/rotate counts are redundant there and don't
need to be part of the IL (I have a patch for that, but because it
is just latent, I'm not sure it needs to be posted for gcc 15 (and
also am not sure if it should punt or add operand masking just in case)).
x86 is not SHIFT_COUNT_TRUNCATED though and so even fixing combine
not to do that for SHIFT_COUNT_TRUNCATED targets doesn't help, and we don't
have QImode insv, so it is optimized into HImode insertions.  Now,
if the y in x &= (-2 r<< y) wasn't masked in any way, turning it into
HImode btr is just fine, but if it was x &= (-2 r<< (y & 7)) and we just
decided to throw away the masking, using btr changes the behavior on it
and causes e2fsprogs and sqlite miscompilations.

So IMHO on !SHIFT_COUNT_TRUNCATED targets, we need to keep the maskings
explicit in the IL, either at least for the duration of the combine pass
as does the following patch (where combine is the only known pass to have
such transformation), or even keep it until final pass in case there are
some later optimizations that would also need to know whether there was
explicit masking or not and with what mask.  The latter change would be
much larger.

The following patch just reverts the r11-5756 change and adds a testcase.

2025-03-25  Jakub Jelinek  <jakub@redhat.com>

PR target/96226
PR target/119428
* config/i386/i386.md (splitter after *<rotate_insn><mode>3_mask,
splitter after *<rotate_insn><mode>3_mask_1): Revert 2020-12-05
changes.

* gcc.c-torture/execute/pr119428.c: New test.

4 months agoRISC-V: disable the abd expander for gcc-15 release [PR119224]
Vineet Gupta [Mon, 24 Mar 2025 17:36:52 +0000 (10:36 -0700)] 
RISC-V: disable the abd expander for gcc-15 release [PR119224]

It seems the new expander triggers a latent issue in sched1 causing
extraneous spills in a different sad variant.
Given how close we are to gcc-15 release, disable it for now.

Since we do want to retain and re-enable this capabilty, manully disable
vs. reverting the orig patch which takes away the test case too.
Fix the orig test case to expect old codegen idiom (although vneg is no
longer emitted, in favor of vrsub).
Also add a new testcase which flags any future spills in the affected
routine.

PR target/119224

gcc/ChangeLog:
* config/riscv/autovec.md: Disable abd splitter.

gcc/testsuite/ChangeLog:
* gcc.target/riscv/rvv/autovec/pr117722.c: Adjust output insn.
* gcc.target/riscv/rvv/autovec/pr119224.c: Add new test.

Signed-off-by: Vineet Gupta <vineetg@rivosinc.com>
4 months agoOpenMP: interop - fix Fortran test
Paul-Antoine Arras [Mon, 24 Mar 2025 14:53:36 +0000 (15:53 +0100)] 
OpenMP: interop - fix Fortran test

This fixes up commit r15-8654-g99e2906ae255fc:
* Do not use omp_lib in Fortran compile test; instead, provide needed
declarations explicitly.
* Update scan-dump patterns to be compatible with 32-bit architectures.

gcc/testsuite/ChangeLog:

* gfortran.dg/gomp/interop-5.f90: Declare omp_interop_kind explicitly
instead of use'ing omp_lib. Update scan-dumps to allow for 4-byte
pointers.

4 months agoinstall.texi: gcn - suggest to use Newlib with simd math fix [PR119325]
Tobias Burnus [Tue, 25 Mar 2025 14:07:56 +0000 (15:07 +0100)] 
install.texi: gcn - suggest to use Newlib with simd math fix [PR119325]

Suggest a Newlib with a fix for the SIMD math issue.  Newlib commit:
https://sourceware.org/git/?p=newlib-cygwin.git;a=commitdiff;h=2ef1a37e7

Additionally, for generic support in ROCm, it is expected that 6.4 will
added the support; the current version is 6.3.3 and it does not support it;
bump >6.3.2 to >6.3.3 in install.texi to avoid doubts.

gcc/ChangeLog:

PR middle-end/119325

* doc/install.texi (gcn): Change ROCm > 6.3.2 to >6.3.3 for generic
support; mention Newlib commit that fixes a SIMD math issue.

4 months agoomp-general.cc: Remove 'if' around call to always 'true' returning function [PR118627]
Tobias Burnus [Tue, 25 Mar 2025 14:02:54 +0000 (15:02 +0100)] 
omp-general.cc: Remove 'if' around call to always 'true' returning function [PR118627]

Before omp_parse_access_method and omp_parse_access_methods unconditionally
returned true, now they are void functions.
Accordingly, calls had to be updated by removing the 'if' around the call;
this also fixes Clang's -Wsometimes-uninitialized warning when compiling
omp-general.cc as one variable remained uninitialized for a never occurring
false.

gcc/ChangeLog:

PR middle-end/118627

* omp-general.cc (omp_parse_access_method): Change to return void.
(omp_parse_access_methods): Return void; remove 'if' around a
function call.
(omp_parse_expr): Remove 'if' around a function call.

4 months agoarm: testsuite: avoid dg-options in primary LTO file
Richard Earnshaw [Tue, 25 Mar 2025 13:48:06 +0000 (13:48 +0000)] 
arm: testsuite: avoid dg-options in primary LTO file

As the primary LTO file in this test, it cannot use dg-options.  Move
the flags from there to dg-lto-options.

gcc/testsuite/ChangeLog:

* gcc.target/arm/lto/pr96939_0.c (dg-options):  Delete.  Move the
options from here ...
(dg-lto-options): ... to here.

4 months agoarm: testsuite: update expected output in vect-early-break-cbranch.c
Richard Earnshaw [Tue, 25 Mar 2025 13:31:54 +0000 (13:31 +0000)] 
arm: testsuite: update expected output in vect-early-break-cbranch.c

Similar to r15-4930-gd56d2f3102ada3, update the branch operations when not
using CBN?Z for inverting the direction of the branch operations.

gcc/testsuite/ChangeLog:

* gcc.target/arm/vect-early-break-cbranch.c: Allow BEQ as well as BNE.

4 months agoarm: testsuite use -std=gnu17 for pr65647.c
Richard Earnshaw [Tue, 25 Mar 2025 13:18:06 +0000 (13:18 +0000)] 
arm: testsuite use -std=gnu17 for pr65647.c

This test has missing prototypes.  To avoid disturbing the test, use gnu17.

gcc/testsuite/ChangeLog:

* gcc.target/arm/pr65647.c (dg-options): Add -std=gnu17.

4 months agotestsuite: aarch64: arm: Remove redundant dg-do run in advsimd-intrinsics tests
Christophe Lyon [Fri, 14 Mar 2025 13:12:08 +0000 (13:12 +0000)] 
testsuite: aarch64: arm: Remove redundant dg-do run in advsimd-intrinsics tests

Tests under advsimd-intrinsics are controlled by
advsimd-intrinsics.exp which computes the adequate dg-do-what
depending on the actual target, it should not be redefined in the
tests, except when the action can never be 'run'.

This currently makes no difference, but it would when we remove
dg-skip-if for arm targets from tests that could at least be compiled
(e.g. vst1x2.c)

gcc/testsuite/

* gcc.target/aarch64/advsimd-intrinsics/vabdh_f16_1.c: Remove
dg-do directive.
* gcc.target/aarch64/advsimd-intrinsics/vabsh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vaddh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcageh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcagth_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcaleh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcalth_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vceqh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vceqzh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcgeh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcgezh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcgth_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcgtzh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcleh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vclezh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vclth_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcltzh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtah_s16_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtah_s32_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtah_s64_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtah_u16_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtah_u32_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtah_u64_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_f16_s16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_f16_s32_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_f16_s64_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_f16_u16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_f16_u32_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_f16_u64_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_n_f16_s16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_n_f16_s32_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_n_f16_s64_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_n_f16_u16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_n_f16_u32_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_n_f16_u64_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_n_s16_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_n_s32_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_n_s64_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_n_u16_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_n_u32_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_n_u64_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_s16_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_s32_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_s64_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_u16_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_u32_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvth_u64_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtmh_s16_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtmh_s32_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtmh_s64_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtmh_u16_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtmh_u32_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtmh_u64_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtnh_s16_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtnh_s32_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtnh_s64_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtnh_u16_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtnh_u32_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtnh_u64_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtph_s16_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtph_s32_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtph_s64_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtph_u16_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtph_u32_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vcvtph_u64_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vdiv_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vdivh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vduph_lane.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vfmah_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vfmas_lane_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vfmas_n_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vfmash_lane_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vfmsh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vld1x2.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vld1x3.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vld1x4.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vmaxh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vmaxnmh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vmaxnmv_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vmaxv_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vminh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vminnmh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vminnmv_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vminv_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vmul_lane_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vmulh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vmulh_lane_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vmulx_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vmulx_lane_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vmulx_n_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vmulxh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vmulxh_lane_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vnegh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vpminmaxnm_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vqrshrn_high_n.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vqrshrun_high_n.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vqshrn_high_n.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vqshrun_high_n.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vrecpeh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vrecpsh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vrecpxh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vrndah_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vrndh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vrndi_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vrndih_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vrndmh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vrndnh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vrndph_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vrndxh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vrsqrteh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vrsqrtsh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vsqrt_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vsqrth_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vst1x2.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vst1x3.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vst1x4.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vsubh_f16_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vtrn_half.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vuzp_half.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/vzip_half.c: Likewise.

4 months agotestsuite: aarch64: restore torture options in vml[as]_float_not_used.c
Christophe Lyon [Mon, 17 Mar 2025 23:38:50 +0000 (23:38 +0000)] 
testsuite: aarch64: restore torture options in vml[as]_float_not_used.c

Remove dg-options, so that the test is executed as expected using the
options defined by advsimd-intrinsics.exp.

gcc/testsuite/
* gcc.target/aarch64/advsimd-intrinsics/vmla_float_not_fused.c:
Remove dg-options.
* gcc.target/aarch64/advsimd-intrinsics/vmls_float_not_fused.c:
Likewise.

4 months agotestsuite: aarch64: restore torture options in bf16_dup.c
Christophe Lyon [Mon, 17 Mar 2025 23:37:25 +0000 (23:37 +0000)] 
testsuite: aarch64: restore torture options in bf16_dup.c

Remove dg-options, so that the test is executed as expected using the
options defined by advsimd-intrinsics.exp.
(Previously we pretend we do, but in fact all torture options are
silently overriden with -O2)

We skip it at -O0, because the tested optimizations does not take
place at this level.

gcc/testsuite/
* gcc.target/aarch64/advsimd-intrinsics/bf16_dup.c: Remove
dg-options.

4 months agotestsuite: aarch64: arm: move saturating_arithmetic_autovect tests to simd/
Christophe Lyon [Tue, 18 Mar 2025 14:56:41 +0000 (14:56 +0000)] 
testsuite: aarch64: arm: move saturating_arithmetic_autovect tests to simd/

These tests force dg-options because they rely on -ftree-vectorize and
do not make use of torture options, so move them to simd/ where they
belong.

gcc/testsuite/
* gcc.target/aarch64/advsimd-intrinsics/saturating_arithmetic_autovect.inc:
Move to gcc.target/aarch64/simd/.
* gcc.target/aarch64/advsimd-intrinsics/saturating_arithmetic_autovect_1.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/saturating_arithmetic_autovect_2.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/saturating_arithmetic_autovect_3.c: Likewise.
* gcc.target/aarch64/advsimd-intrinsics/saturating_arithmetic_autovect_4.c: Likewise.

4 months agotestsuite: arm: remove duplicate -mcpu=unset in arm_v8_1_lob_ok
Christophe Lyon [Wed, 19 Mar 2025 10:59:04 +0000 (10:59 +0000)] 
testsuite: arm: remove duplicate -mcpu=unset in arm_v8_1_lob_ok

This was probably a typo / oversight.

gcc/testsuite/
* lib/target-supports.exp
(check_effective_target_arm_v8_1_lob_ok): Remove duplicate
-mcpu=unset.

4 months agolibstdc++: Add testcase for std::filesystem::copy [PR118699]
Jonathan Wakely [Thu, 30 Jan 2025 17:02:47 +0000 (17:02 +0000)] 
libstdc++: Add testcase for std::filesystem::copy [PR118699]

This was fixed last year by r15-2409-g017e3f89b081e4 (and backports), so
just add the testcase.

libstdc++-v3/ChangeLog:

PR libstdc++/118699
* testsuite/27_io/filesystem/operations/copy.cc: Check copying a
file to a directory.

4 months agoarm: add commutative alternatives to <US>mull pattern.
Richard Earnshaw [Tue, 25 Mar 2025 11:50:30 +0000 (11:50 +0000)] 
arm: add commutative alternatives to <US>mull pattern.

Prior to Armv6, the SMULL and UMULL instructions, which have the form

     UMULL Rdlo, Rdhi, Rm, Rs

had an operand restriction such that Rdlo, Rdhi and Rm must all be
different registers.  Rs, however can overlap either of the
destination registers.  Add some register-tie alternatives to allow
the register allocator to find these forms without having to use
additional register moves.

In addition to this, the test is pretty meaningless on Thumb-1 targets
as the S/UMULL instructions do not exist in a 16-bit encoding.  So skip
the test in this case.

gcc/ChangeLog:

* config/arm/arm.md (<US>mull): Add alternatives that allow Rs
to be tied to either Rdlo or Rdhi.

gcc/testsuite/ChangeLog:

* gcc.target/arm/pr42575.c: Skip test if thumb1.

4 months agoopcodes: fix wrong code in expand_binop_directly [PR117811]
Richard Earnshaw [Thu, 20 Mar 2025 14:42:59 +0000 (14:42 +0000)] 
opcodes: fix wrong code in expand_binop_directly [PR117811]

If expand_binop_directly fails to add a REG_EQUAL note it tries to
unwind and restart.  But it can unwind too far if expand_binop changed
some of the operands before calling it.  We don't need to unwind that
far anyway since we should end up taking exactly the same route next
time, just without a target rtx.

To fix this we remove LAST from the argument list and let the callers
(all in expand_binop) do their own unwinding if the call fails.
Instead we unwind just as far as the entry to expand_binop_directly
and recurse within this function instead of all the way back up.

gcc/ChangeLog:

PR middle-end/117811
* optabs.cc (expand_binop_directly): Remove LAST as an argument,
instead record the last insn on entry.  Only delete insns if
we need to restart and restart by calling ourself, not expand_binop.
(expand_binop): Update callers to expand_binop_directly.  If it
fails to expand the operation, delete back to LAST.

gcc/testsuite:

PR middle-end/117811
* gcc.dg/torture/pr117811.c: New test.

4 months agolibstdc++: Cast -1 to size_t in <format> [PR119429]
Jonathan Wakely [Mon, 24 Mar 2025 21:25:20 +0000 (21:25 +0000)] 
libstdc++: Cast -1 to size_t in <format> [PR119429]

This avoids a runtime error from Clang's annoying -fsanitize=integer
(even though it's not undefined and behaves correctly).

libstdc++-v3/ChangeLog:

PR libstdc++/119429
* include/std/format (__format::_Scanner::_Scanner): Cast
default argument to size_t.

4 months agolibstdc++: Fix handling of common cpp20-only ranges for flat sets [PR119415]
Tomasz Kamiński [Mon, 24 Mar 2025 17:04:28 +0000 (18:04 +0100)] 
libstdc++: Fix handling of common cpp20-only ranges for flat sets [PR119415]

These patch add check to verify if common range iterators satisfies
Cpp17LegacyIterator requirements (__detail::__cpp17_input_iterator),
before invoking overloads of insert that accepts two iterators.
As such overloads existed before c++20 iterators were introduced,
they commonly assume existence of iterator_traits<..>::iterator_category,
and passing a cpp20-only iterators, leads to hard errors.

In case if user-defined container wants to support more efficient
insertion in such cases, it should provided insert_range method,
as in the case of standard containers.

PR libstdc++/119415

libstdc++-v3/ChangeLog:

* include/std/flat_set (_Flat_set_impl:insert_range):
Add __detail::__cpp17_input_iterator check.
* testsuite/23_containers/flat_multiset/1.cc: New tests
* testsuite/23_containers/flat_set/1.cc: New tests

Reviewed-by: Patrick Palka <ppalka@redhat.com>, Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
4 months agotailc: Only diagnose musttail failures during tailc or musttail passes [PR119376]
Jakub Jelinek [Tue, 25 Mar 2025 08:36:41 +0000 (09:36 +0100)] 
tailc: Only diagnose musttail failures during tailc or musttail passes [PR119376]

The following testcases FAIL because musttail failures are diagnosed
not just in the tailc or musttail passes, but also during the tailr1
and tailr2.
tailr1 pass is before IPA and in the testcases eh cleanup has not
cleaned up the IL sufficiently yet to make the musttail calls pass,
even tailr2 could be too early.

The following patch does that only during the tailc pass, and if that
pass is not actually executed, during musttail pass.
To do it only in the tailc pass, I chose to pass a new bool flag, because
while we have the opt_tailcalls argument, it is actually passed by reference
to find_tail_calls and sometimes cleared during that.
musttail calls when the new DIAG_MUSTTAIL flag is not set are handled like
any other calls, we simply silently punt on those if they can't be turned
into tail calls.

Furthermore, I had to tweak the musttail pass gate.  Previously it was
!flag_optimize_sibling_calls && f->has_musttail.  The problem is that
gate of tailr and tailc passes is
flag_optimize_sibling_calls != 0 && dbg_cnt (tail_call)
and furthermore, tailc pass is only in the normal optimization queue,
so only if not -O0 or -Og.  So when one would use tail_call dbg_cnt
with some limit, or when e.g. using -foptimize-sibling-calls with -O0 or
-Og, nothing would actually diagnose invalid musttail calls or set tail call
flags on those if they are ok.  I could insert a new PROP_ flag on whether
musttail has been handled by tailc pass, but given that we have the
cfun->has_musttail flag already and nothing after tailc/musttail passes uses
it, I think it is easier to just clear the flag when musttail failures are
diagnosed and correct ones have [[tail call]] flag added.  Expansion will
then only look at the [[tail call]] flag, it could even at the [[must tail
call]] flag, but I don't see a point to check cfun->has_musttail.

2025-03-25  Jakub Jelinek  <jakub@redhat.com>

PR ipa/119376
* tree-tailcall.cc (suitable_for_tail_opt_p): Add DIAG_MUSTTAIL
argument, propagate it down to maybe_error_musttail.
(suitable_for_tail_call_opt_p): Likewise.
(maybe_error_musttail): Add DIAG_MUSTTAIL argument.  Don't emit error
for gimple_call_must_tail_p calls if it is false.
(find_tail_calls): Add DIAG_MUSTTAIL argument, propagate it down to
maybe_error_musttail, suitable_for_tail_opt_p,
suitable_for_tail_call_opt_p and find_tail_calls calls.
(tree_optimize_tail_calls_1): Add DIAG_MUSTTAIL argument, propagate
it down to find_tail_calls and if set, clear cfun->has_musttail flag
at the end.  Rename OPT_MUSTCALL argument to OPT_MUSTTAIL.
(execute_tail_calls): Pass true to DIAG_MUSTTAIL
tree_optimize_tail_calls_1 argument.
(pass_tail_recursion::execute): Pass false to DIAG_MUSTTAIL
tree_optimize_tail_calls_1 argument.
(pass_musttail::gate): Don't test flag_optimize_sibling_calls.
(pass_musttail::execute): Pass true to DIAG_MUSTTAIL
tree_optimize_tail_calls_1 argument.

* g++.dg/torture/musttail1.C: New test.
* g++.dg/opt/musttail2.C: New test.

4 months agoPR modula2/119449 MAX of SYSTEM.REAL64 cause an ICE
Gaius Mulley [Tue, 25 Mar 2025 02:08:05 +0000 (02:08 +0000)] 
PR modula2/119449 MAX of SYSTEM.REAL64 cause an ICE

This bugfix implements MAX(REAL64) and MIN(REAL64) etc for
REAL64, REAL96 and REAL128.

gcc/m2/ChangeLog:

PR modula2/119449
* gm2-compiler/M2GCCDeclare.def (TryDeclareType): Remove tokenno
parameter.
* gm2-compiler/M2GCCDeclare.mod (TryDeclareType): Ditto.
* gm2-compiler/M2GenGCC.mod (FoldTBitsize): Remove op2 and
rename op1 as res and op3 as type.
(FoldStandardFunction): Call FoldTBitsize omitting op2.
* gm2-compiler/M2Quads.mod (GetTypeMin): Rewrite.
(GetTypeMinLower): New procedure function.
(GetTypeMax): Rewrite.
(GetTypeMaxLower): New procedure function.
* gm2-compiler/M2Range.mod (CheckCancelled): Comment out.
* gm2-compiler/M2System.mod (CreateMinMaxFor): Add realtype
parameter.
(MapType): Rewrite to use realtype.
(CreateType): Ditto.
(AttemptToCreateType): Ditto.
(MakeFixedSizedTypes): Add realtype boolean.
(InitPIMTypes): Ditto.
(InitISOTypes): Ditto.
(MakeExtraSystemTypes): Ditto.
* gm2-gcc/m2pp.cc (m2pp_nop_expr): Remove code.
* gm2-gcc/m2type.cc (IsGccRealType): New function.
(m2type_GetMinFrom): Rewrite.
(m2type_GetMaxFrom): Ditto.
(do_min_real): Declare static.
(do_max_real): Declare static.

gcc/testsuite/ChangeLog:

PR modula2/119449
* gm2/pim/pass/minmaxreal.mod: New test.
* gm2/pim/pass/minmaxreal2.mod: New test.
* gm2/pim/pass/minmaxreal3.mod: New test.

Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
4 months agoi386: Fix AVX10.2 sat cvt intrinsic.
Hu, Lin1 [Tue, 25 Mar 2025 01:24:59 +0000 (09:24 +0800)] 
i386: Fix AVX10.2 sat cvt intrinsic.

The patch aims to modify the missed fixed for vcvttph2iubs's testcase.

gcc/testsuite/ChangeLog:

* gcc.target/i386/avx10_2-512-vcvttph2iubs-2.c: Modify testcase.

4 months agoDaily bump.
GCC Administrator [Tue, 25 Mar 2025 00:19:18 +0000 (00:19 +0000)] 
Daily bump.

4 months agovect: Add assert to expand_vector_conversion [PR118616]
Andrew Pinski [Sun, 23 Mar 2025 17:38:39 +0000 (10:38 -0700)] 
vect: Add assert to expand_vector_conversion [PR118616]

In some cases (after inliing due to LTO and -O3), GCC cannot
figure out that the length of the converts vect is not empty
when supportable_indirect_convert_operation returns true. So
we get an extra warning because we loop through all but the last
entry and GCC decided that `converts.length () - 1` is -1. This
adds an assert to avoid the warning and maybe even produce slightly
better code for this function. A gcc_checking_assert would be better
here but we don't convert that into an assume attribute or
`if(!a) __builtin_unreachable();`, I filed PR 119439  for that.

Bootstrapped and tested on x86_64-linux-gnu.

PR tree-optimization/118616
gcc/ChangeLog:

* tree-vect-generic.cc (expand_vector_conversion): Add
an assert that converts vect is non empty if
supportable_indirect_convert_operation returns true.

Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
4 months agolibstdc++: Fix some broken links in the manual
Jonathan Wakely [Mon, 24 Mar 2025 21:28:47 +0000 (21:28 +0000)] 
libstdc++: Fix some broken links in the manual

libstdc++-v3/ChangeLog:

* doc/xml/manual/policy_data_structures_biblio.xml: Fix two
broken links.
* doc/html/manual/policy_data_structures.html: Regenerate.

4 months agolibstdc++: Add testcases for resolved bug [PR101527]
Jonathan Wakely [Mon, 24 Mar 2025 21:36:16 +0000 (21:36 +0000)] 
libstdc++: Add testcases for resolved bug [PR101527]

These tests were fixed by a front-end change r13-465-g4df735e01e3199 so
this just adds them to the testsuite to be sure we don't regress.

libstdc++-v3/ChangeLog:

PR libstdc++/101527
* testsuite/24_iterators/common_iterator/101527.cc: New test.
* testsuite/24_iterators/counted_iterator/101527.cc: New test.

4 months agoUpdate gcc hr.po, sv.po
Joseph Myers [Mon, 24 Mar 2025 20:05:34 +0000 (20:05 +0000)] 
Update gcc hr.po, sv.po

* hr.po, sv.po: Update.

4 months agolibgomp: Save OpenMP device number when initializing the interop object
Tobias Burnus [Mon, 24 Mar 2025 18:52:10 +0000 (19:52 +0100)] 
libgomp: Save OpenMP device number when initializing the interop object

The interop object (opaque object to the user, used internally in libgomp)
already had a 'device_num' member, but it was missed to actually set it.

libgomp/ChangeLog:

* target.c (gomp_interop_internal): Set the 'device_num' member
when initializing an interop object.

4 months agoc++: pack indexing and if consteval
Jason Merrill [Sat, 22 Mar 2025 14:52:14 +0000 (10:52 -0400)] 
c++: pack indexing and if consteval

The pack index is manifestly constant-evaluated, and the call to
maybe_constant_value needs to reflect that or we wrongly complain about
non-constant index if the evaluation uses if consteval.

gcc/cp/ChangeLog:

* semantics.cc (finish_type_pack_element): Pass mce_true to
maybe_constant_value.

gcc/testsuite/ChangeLog:

* g++.dg/cpp26/pack-indexing16.C: New test.

4 months agocobol: Move includes before system.h
Iain Sandoe [Sat, 15 Mar 2025 22:37:58 +0000 (22:37 +0000)] 
cobol: Move includes before system.h

This just moves an include ahead of cobol-system.h which
in turn includes system.h.

gcc/cobol/ChangeLog:

* cdf-copy.cc: Move host include before system.h

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
4 months agolibgomp/plugin/plugin-nvptx.c: Fix device used for stream creation
Tobias Burnus [Mon, 24 Mar 2025 15:08:20 +0000 (16:08 +0100)] 
libgomp/plugin/plugin-nvptx.c: Fix device used for stream creation

libgomp/ChangeLog:

* plugin/plugin-nvptx.c (GOMP_OFFLOAD_interop): Set context for
stream creation to use the specified device.

4 months agoRemove buffer overflow in cobol driver
Andreas Schwab [Mon, 24 Mar 2025 10:39:29 +0000 (11:39 +0100)] 
Remove buffer overflow in cobol driver

PR cobol/119390
* gcobolspec.cc (lang_specific_driver): Use pointer instead of
copying into fixed array.

4 months agotestsuite: d: Break up Wbuiltin_declaration_mismatch2.d into smaller tests
Iain Buclaw [Mon, 24 Mar 2025 13:07:49 +0000 (14:07 +0100)] 
testsuite: d: Break up Wbuiltin_declaration_mismatch2.d into smaller tests

gcc/testsuite/ChangeLog:

* gdc.dg/Wbuiltin_declaration_mismatch2.d: Split test into ...
* gdc.dg/Wbuiltin_declaration_mismatch3.d: New test.
* gdc.dg/Wbuiltin_declaration_mismatch4.d: New test.
* gdc.dg/Wbuiltin_declaration_mismatch5.d: New test.
* gdc.dg/Wbuiltin_declaration_mismatch6.d: New test.

4 months agogccrs: support generic super traits recursively
Philip Herron [Sat, 22 Mar 2025 17:40:48 +0000 (17:40 +0000)] 
gccrs: support generic super traits recursively

In order to handle generic super traits on any trait bound we need to ensure
we track the TypeBoundPredicate as part of the TraitReference instead of just
the raw TraitReferences because these will have any applied generics enplace.

Then for any TypeBoundPredicate it takes a copy of the super traits because
this is the usage of a TraitBound and we can apply generics which then need
to be recursively applied up the chain of super predicates.

The main tweak is around TypeBoundPredicate::lookup_associated_item because
we need to associate the predicate with the item we are looking up so the caller
can respect the generics correctly as well.

Fixes Rust-GCC#3502

gcc/rust/ChangeLog:

* typecheck/rust-hir-path-probe.cc: update call
* typecheck/rust-hir-trait-reference.cc (TraitReference::lookup_trait_item): track predicate
(TraitReference::is_equal): likewise
(TraitReference::is_object_safe): likewise
(TraitReference::satisfies_bound): likewise
* typecheck/rust-hir-trait-reference.h: likewise
* typecheck/rust-hir-trait-resolve.cc (TraitResolver::resolve_trait): likewise
* typecheck/rust-tyty-bounds.cc (TypeBoundPredicate::TypeBoundPredicate): track super traits
(TypeBoundPredicate::operator=): likewise
(TypeBoundPredicate::apply_generic_arguments): ensure we apply to super predicates
(TypeBoundPredicateItem::operator=): take copy of parent predicate
(TypeBoundPredicateItem::error): pass error instead of nullptr
(TypeBoundPredicateItem::is_error): update to no longer check for nullptr
(TypeBoundPredicateItem::get_parent): updated
(TypeBoundPredicateItem::get_tyty_for_receiver): likewise
(TypeBoundPredicate::get_associated_type_items): likewise
* typecheck/rust-tyty-bounds.h (class TypeBoundPredicateItem): move
* typecheck/rust-tyty-subst.cc: flag to handle placeholder Self on traits
* typecheck/rust-tyty-subst.h (class TypeBoundPredicateItem): likewise
* typecheck/rust-tyty.h (class TypeBoundPredicateItem): refactored

gcc/testsuite/ChangeLog:

* rust/execute/torture/issue-3502.rs: New test.

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
4 months agogccrs: nr2.0: Fix StructExprFieldIdentifier handling
Owen Avery [Mon, 3 Mar 2025 01:03:12 +0000 (20:03 -0500)] 
gccrs: nr2.0: Fix StructExprFieldIdentifier handling

gcc/rust/ChangeLog:

* resolve/rust-late-name-resolver-2.0.cc
(Late::visit): Add visitor for StructExprFieldIdentifier.
* resolve/rust-late-name-resolver-2.0.h
(Late::visit): Likewise.

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude: Remove entries.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: nr2.0: Adjust indentifier expression handling
Owen Avery [Wed, 19 Mar 2025 00:28:25 +0000 (20:28 -0400)] 
gccrs: nr2.0: Adjust indentifier expression handling

gcc/rust/ChangeLog:

* resolve/rust-late-name-resolver-2.0.cc
(Late::visit): Make sure to return early after a resolution
error, improve the resolution error message, fix a typo, handle
ambiguous resolutions, and remove an old comment.

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude: Remove entries.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: Modify multiple definition error
Owen Avery [Sun, 23 Feb 2025 21:45:41 +0000 (16:45 -0500)] 
gccrs: Modify multiple definition error

gcc/rust/ChangeLog:

* resolve/rust-ast-resolve-expr.cc
(ResolveExpr::visit): Modify error message.
* resolve/rust-ast-resolve-implitem.h
(ResolveToplevelImplItem::visit): Likewise.
(ResolveTopLevelTraitItems::visit): Likewise.
(ResolveToplevelExternItem::visit): Likewise.
* resolve/rust-ast-resolve-stmt.cc
(ResolveStmt::visit): Likewise.
* resolve/rust-ast-resolve-stmt.h
(ResolveStmt::visit): Likewise.
* resolve/rust-ast-resolve-toplevel.h
(ResolveTopLevel::visit): Likewise.
* resolve/rust-ast-resolve-type.h
(ResolveGenericParams::visit): Likewise.

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude: Remove entries.
* rust/compile/redef_error2.rs: Modify expected error.
* rust/compile/redef_error5.rs: Likewise.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: nr2.0: Adjust visitors for struct expressions
Owen Avery [Sun, 9 Feb 2025 08:28:43 +0000 (03:28 -0500)] 
gccrs: nr2.0: Adjust visitors for struct expressions

gcc/rust/ChangeLog:

* ast/rust-ast-visitor.cc
(DefaultASTVisitor::visit): Make sure to always visit the struct
name.
* resolve/rust-late-name-resolver-2.0.cc
(Late::visit): Avoid visiting the struct name twice.

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude: Remove entries.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: Prevent multiple resolution insertion
Owen Avery [Wed, 26 Feb 2025 14:56:42 +0000 (09:56 -0500)] 
gccrs: Prevent multiple resolution insertion

gcc/rust/ChangeLog:

* expand/rust-derive-clone.cc
(DeriveClone::clone_impl): Avoid using the same node id multiple
times.
(DeriveClone::clone_enum_identifier): Likewise.
(DeriveClone::clone_enum_tuple): Likewise.
* expand/rust-derive-copy.cc
(DeriveCopy::copy_impl): Likewise.
* resolve/rust-ast-resolve-item.cc
(flatten_list): Likewise.
* resolve/rust-ast-resolve-path.cc
(ResolvePath::resolve_path): Prevent reinsertion of resolutions.
* resolve/rust-ast-resolve-type.cc
(ResolveRelativeTypePath::go): Likewise.
* typecheck/rust-hir-type-check-expr.cc
(TypeCheckExpr::resolve_fn_trait_call): Likewise.
* resolve/rust-name-resolver.cc
(Resolver::insert_resolved_name): Catch multiple resolution
insertions.
(Resolver::insert_resolved_type): Likewise.

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude: Remove entries.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: nr2.0: Fix test self-path2.rs
Owen Avery [Sun, 9 Feb 2025 20:16:59 +0000 (15:16 -0500)] 
gccrs: nr2.0: Fix test self-path2.rs

gcc/rust/ChangeLog:

* resolve/rust-ast-resolve-path.cc
(ResolvePath::resolve_path): Adjust the error message for a lower
self segment in the middle of a path.
* resolve/rust-ast-resolve-type.cc
(ResolveRelativeTypePath::go): Likewise.

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude: Remove self-path2.rs
* rust/compile/self-path2.rs: Adjust expected errors.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: emit an error for type or const parameters on foreign items
Ryutaro Okada [Fri, 14 Mar 2025 12:25:03 +0000 (21:25 +0900)] 
gccrs: emit an error for type or const parameters on foreign items

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check-implitem.cc (TypeCheckTopLevelExternItem::visit):
emit an error for type or const parameters on foreign items

gcc/testsuite/ChangeLog:

* rust/compile/extern_generics.rs: New test.

Signed-off-by: Ryutaro Okada <1015ryu88@gmail.com>
4 months agogccrs: Fix modules with same name as builtins causing ICE (#3315)
Liam Naddell [Tue, 11 Feb 2025 21:42:41 +0000 (16:42 -0500)] 
gccrs: Fix modules with same name as builtins causing ICE (#3315)

gcc/rust/ChangeLog:

* resolve/rust-forever-stack.h (ForeverStack): Add a dedicated prelude node for
the Language prelude
* resolve/rust-forever-stack.hxx (ForeverStack): Add support code for the
prelude node
* resolve/rust-late-name-resolver-2.0.cc (Late::visit): Move
language prelude builtins to the prelude context
* resolve/rust-name-resolution-context.cc
(NameResolutionContext::scoped): Add code for handling
the prelude corner case
* resolve/rust-rib.h (Rib::Kind): Add a special Prelude rib type

gcc/testsuite/ChangeLog:

* rust/compile/issue-3315-1.rs: Add test for module with same name
as builtin
* rust/compile/issue-3315-2.rs: Test with utilization of i32
type
* rust/compile/nr2/exclude: issue-3315-2.rs Does not work with
NR2.0

Signed-off-by: Liam Naddell <liamnprg@gmail.com>
4 months agogccrs: nr2.0: Check compile/torture/*.rs tests
Owen Avery [Sun, 2 Mar 2025 23:54:37 +0000 (18:54 -0500)] 
gccrs: nr2.0: Check compile/torture/*.rs tests

gcc/testsuite/ChangeLog:

* rust/compile/nr2/compile.exp: Adjust to cover tests in the
torture subdirectory.
* rust/compile/nr2/exclude: Add entries.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: Remove mangling tests from exclusion list
Pierre-Emmanuel Patry [Tue, 11 Mar 2025 13:35:04 +0000 (14:35 +0100)] 
gccrs: Remove mangling tests from exclusion list

Those tests are now passing.

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude: Remove two mangling tests from exclusion
file.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
4 months agogccrs: Fix canonical path parent resolution
Pierre-Emmanuel Patry [Tue, 11 Mar 2025 13:33:05 +0000 (14:33 +0100)] 
gccrs: Fix canonical path parent resolution

The algorithm was comparing using the wrong id, this lead to some
mangling errors as an erroneous parent was selected.

gcc/rust/ChangeLog:

* resolve/rust-forever-stack.hxx: Fix the id comparison.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
4 months agogccrs: Insert crate name in canonical path
Pierre-Emmanuel Patry [Mon, 10 Mar 2025 15:05:18 +0000 (16:05 +0100)] 
gccrs: Insert crate name in canonical path

gcc/rust/ChangeLog:

* resolve/rust-forever-stack.hxx: Insert a new segment with the crate's
name as canonical's path prefix.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
4 months agogccrs: Add a function to get the crate number from node id
Pierre-Emmanuel Patry [Mon, 10 Mar 2025 14:13:27 +0000 (15:13 +0100)] 
gccrs: Add a function to get the crate number from node id

gcc/rust/ChangeLog:

* util/rust-hir-map.cc (Mappings::lookup_crate_num): Add function to
retrieve crate number from it's node id.
(Mappings::node_is_crate): change function with call to
lookup_crate_num to avoid looping through all crates.
(Mappings::insert_ast_crate): Populate node id to crate number map.
* util/rust-hir-map.h: Change function prototype.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
4 months agogccrs: Remove finalize import visitor
Pierre-Emmanuel Patry [Thu, 13 Mar 2025 14:18:58 +0000 (15:18 +0100)] 
gccrs: Remove finalize import visitor

This visitor is not used anymore.

gcc/rust/ChangeLog:

* resolve/rust-finalize-imports-2.0.cc (FinalizeImports::FinalizeImports):
Remove constructor.
(FinalizeImports::go): Remove function.
(FinalizeImports::visit): Likewise.
* resolve/rust-finalize-imports-2.0.h (class FinalizeImports): Remove
FinalizeImports class.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
4 months agogccrs: Remove tests from exclusion list
Pierre-Emmanuel Patry [Thu, 13 Mar 2025 13:51:53 +0000 (14:51 +0100)] 
gccrs: Remove tests from exclusion list

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude: Remove issue-1786 and issue-3033 from
exclusion list.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
4 months agogccrs: Move import mapping resolution to in tree visit
Pierre-Emmanuel Patry [Thu, 13 Mar 2025 12:41:38 +0000 (13:41 +0100)] 
gccrs: Move import mapping resolution to in tree visit

Import mapping was relying on resolve_path which in turn relies on
the cursor function. This means the mapping resolver should be called
from the correct scope instead of being called from the crate scope.

gcc/rust/ChangeLog:

* resolve/rust-early-name-resolver-2.0.cc (Early::Early): Move the
top level visitor from the function scope to attributes.
(Early::go): Remove top level visitor creation and adapt calling code.
Remove call to mapping resolution and import finalization.
(Early::finalize_simple_import): Move the finalization from it's
visitor.
(Early::finalize_glob_import): Likewise.
(Early::finalize_rebind_import): Likewise.
(Early::visit): Add mapping resolution and finalization in
UseDeclaration visitor function.
* resolve/rust-finalize-imports-2.0.cc (finalize_simple_import): Move
function.
(finalize_glob_import): Likewise.
(finalize_rebind_import): Likewise.
(FinalizeImports::visit): Remove call to finalizers.
* resolve/rust-early-name-resolver-2.0.h (class Early): Add top level
attribute.
* resolve/rust-finalize-imports-2.0.h: Add function prototypes.
* resolve/rust-toplevel-name-resolver-2.0.h: Change getter return type
to reference.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
4 months agogccrs: check for recursion trait cycle with bounds checks
Philip Herron [Wed, 12 Mar 2025 17:03:25 +0000 (17:03 +0000)] 
gccrs: check for recursion trait cycle with bounds checks

We need to be careful when doing bounds check as to not create a recusive
trait resolution. This patch checks for that case and fixes a bad type
is equal check on ADT Types which was caught with a regression here.

Fixes Rust-GCC#3126

gcc/rust/ChangeLog:

* typecheck/rust-hir-trait-resolve.cc (TraitResolver::ResolveHirItem): new helper
* typecheck/rust-hir-trait-resolve.h: add helper prototype
* typecheck/rust-type-util.cc (query_type): add debug
* typecheck/rust-tyty-bounds.cc (TypeBoundsProbe::scan): check for recursion
* typecheck/rust-tyty.cc (VariantDef::is_equal): fix is equal check

gcc/testsuite/ChangeLog:

* rust/execute/torture/issue-3126.rs: New test.

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
4 months agogccrs: track DefId on ADT Types this could be useful information
Philip Herron [Tue, 18 Feb 2025 17:45:58 +0000 (17:45 +0000)] 
gccrs: track DefId on ADT Types this could be useful information

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check-item.cc (TypeCheckItem::visit): track DefId of origin
* typecheck/rust-tyty.cc (BaseType::monomorphized_clone): likewise
(ADTType::ADTType): likewise
(ADTType::get_id): likewise
(ADTType::clone): likewise
* typecheck/rust-tyty.h: likewise

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
4 months agogccrs: remove visitor which is not needed here
Philip Herron [Tue, 18 Feb 2025 17:44:05 +0000 (17:44 +0000)] 
gccrs: remove visitor which is not needed here

Just a small refactor to remove a visitor which is not needed.

gcc/rust/ChangeLog:

* backend/rust-compile-resolve-path.cc (ResolvePathRef::Compile): remove visitor
(ResolvePathRef::ResolvePathRef): likewise
(ResolvePathRef::visit): likewise
* backend/rust-compile-resolve-path.h (class ResolvePathRef): likewise

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
4 months agogccrs: Fix some small issues
Owen Avery [Tue, 11 Mar 2025 16:03:34 +0000 (12:03 -0400)] 
gccrs: Fix some small issues

gcc/rust/ChangeLog:

* backend/rust-compile-intrinsic.cc
(assume_handler): Fix copy/paste error.
* typecheck/rust-hir-type-check-pattern.cc
(TypeCheckPattern::visit): Fix spelling mistake.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: Add a test for enum variant name resolution
Pierre-Emmanuel Patry [Wed, 5 Mar 2025 10:56:49 +0000 (11:56 +0100)] 
gccrs: Add a test for enum variant name resolution

Highlight the fact that a value inside an enum definition refers to
a struct outside of the enum and not to the enum variant's name
directly.

gcc/testsuite/ChangeLog:

* rust/compile/enum_variant_name.rs: New test.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
4 months agogccrs: Remove nr2 exhaustiveness test from exclusion list
Pierre-Emmanuel Patry [Tue, 4 Mar 2025 17:12:14 +0000 (18:12 +0100)] 
gccrs: Remove nr2 exhaustiveness test from exclusion list

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude: Remove test.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
4 months agogccrs: Add enum variant string information to definition
Pierre-Emmanuel Patry [Tue, 4 Mar 2025 15:59:11 +0000 (16:59 +0100)] 
gccrs: Add enum variant string information to definition

New enum variant status now appears in the string representation of
the resolver's definition.

gcc/rust/ChangeLog:

* resolve/rust-rib.cc (Rib::Definition::to_string): Add enum variant
status.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
4 months agogccrs: Keep definition provenance to skip enum variants
Pierre-Emmanuel Patry [Tue, 4 Mar 2025 15:41:48 +0000 (16:41 +0100)] 
gccrs: Keep definition provenance to skip enum variants

Enum variants shouldn't be accessed directly even from within an enum.
This commit keeps the provenance for enum variants definition so we
can skip them when resolving a value within an enum definition.

gcc/rust/ChangeLog:

* resolve/rust-forever-stack.h: Add new function to insert enum
variants and add argument to resolver's get function to explicitely
skip enum variants.
* resolve/rust-forever-stack.hxx: Update function
definitions.
* resolve/rust-name-resolution-context.cc (NameResolutionContext::insert_variant):
Add function to insert enum variants.
* resolve/rust-name-resolution-context.h: Add function's prototype.
* resolve/rust-rib.cc (Rib::Definition::Definition): Add new boolean to
hint at enum variant provenance.
(Rib::Definition::is_variant): New getter for variant status.
(Rib::Definition::Shadowable): Update constructor to opt out of enum
variants.
(Rib::Definition::Globbed): Likewise.
(Rib::Definition::NonShadowable): Change constructor to forward enum
variant provenance status.
* resolve/rust-rib.h: Update function prototypes.
* resolve/rust-toplevel-name-resolver-2.0.cc (TopLevel::insert_enum_variant_or_error_out):
Add function to insert enum variants in the name resolver.
(TopLevel::visit): Update several enum variant's visitor function
with the new enum variant name resolving code.
* resolve/rust-toplevel-name-resolver-2.0.h: Update function
prototypes.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
4 months agogccrs: Add rib kind debug representation
Pierre-Emmanuel Patry [Thu, 27 Feb 2025 11:28:32 +0000 (12:28 +0100)] 
gccrs: Add rib kind debug representation

Rib kind had no string representation, and thus were not used in the
debug string representation.

gcc/rust/ChangeLog:

* resolve/rust-forever-stack.hxx: Output rib kind.
* resolve/rust-rib.h: Add function to get string representation from
a rib kind.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
4 months agogccrs: nr2.0: Set the node id of the root node
Owen Avery [Tue, 18 Feb 2025 08:56:33 +0000 (03:56 -0500)] 
gccrs: nr2.0: Set the node id of the root node

gcc/rust/ChangeLog:

* resolve/rust-forever-stack.h
(ForeverStack::ForeverStack): Set the node id of the root node
to that of the current crate.
* resolve/rust-forever-stack.hxx
(ForeverStack::find_starting_point): Use the node id of the root
node during resolution of crate segments.

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude: Remove entries.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: expansion: Correctly expand $crate metavar
Arthur Cohen [Mon, 24 Feb 2025 12:09:17 +0000 (13:09 +0100)] 
gccrs: expansion: Correctly expand $crate metavar

gcc/rust/ChangeLog:

* expand/rust-macro-expand.cc: Use new SubstituteCtx API.
* expand/rust-macro-expand.h: Likewise.
* expand/rust-macro-substitute-ctx.cc: Implement proper expansion of $crate.
* expand/rust-macro-substitute-ctx.h: Adapt APIs to take macro definition when
substituting.
* util/rust-hir-map.cc (Mappings::insert_macro_def): Store crate information when
inserting macro definition in mappings.
(Mappings::lookup_macro_def_crate): New.
* util/rust-hir-map.h: Adapt mappings to store crate in which macros were defined.

gcc/testsuite/ChangeLog:

* rust/execute/crate-metavar1.rs: New test.
* rust/compile/crate-metavar1.rs: New test.

4 months agogccrs: nr2.0: Make sure PathInExpression is default resolved
Owen Avery [Tue, 18 Feb 2025 08:06:09 +0000 (03:06 -0500)] 
gccrs: nr2.0: Make sure PathInExpression is default resolved

gcc/rust/ChangeLog:

* resolve/rust-late-name-resolver-2.0.cc
(Late::visit): Call DefaultResolver::visit earlier, in order to
ensure it is called even if Late::visit returns early.

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude: Remove entries.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: Reduce usage of rust-session-manager.h
Owen Avery [Sat, 1 Mar 2025 23:05:07 +0000 (18:05 -0500)] 
gccrs: Reduce usage of rust-session-manager.h

gcc/rust/ChangeLog:

* util/rust-edition.cc: New file.
* util/rust-edition.h: New file.
* Make-lang.in: Add rust-edition.o to the object list.

* ast/rust-pattern.cc: Remove inclusion of
rust-session-manager.h.
* expand/rust-macro-expand.cc: Likewise.
* expand/rust-macro-builtins-helpers.h: Likewise.

* expand/rust-macro-builtins-include.cc: Include
rust-session-manager.h.
* expand/rust-macro-builtins-utility.cc: Likewise.

* lex/rust-lex.cc: Include rust-edition.h instead of
rust-session-manager.h.
(Lexer::classify_keyword): Use get_rust_edition instead of
Session and CompileOptions.

* parse/rust-parse-impl.h: Include rust-edition.h instead of
rust-session-manager.h.
(Parser::parse_async_item): Use get_rust_edition instead of
Session and CompileOptions.

* checks/errors/rust-feature.h: Include rust-edition.h instead
of rust-session-manager.h.
(class Feature): Use Rust::Edition instead of
Rust::CompileOptions::Edition.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: session-manager: Call into DesugarQuestionMark
Arthur Cohen [Thu, 23 Jan 2025 11:46:09 +0000 (11:46 +0000)] 
gccrs: session-manager: Call into DesugarQuestionMark

gcc/rust/ChangeLog:

* rust-session-manager.cc (Session::compile_crate): Call DesugarQuestionMark::go().

4 months agogccrs: lower: Error out when lowering ErrorPropagationExpr
Arthur Cohen [Thu, 23 Jan 2025 11:44:33 +0000 (11:44 +0000)] 
gccrs: lower: Error out when lowering ErrorPropagationExpr

Adapt functions for lowering nodes that should never reach the lowering phase to cause an
unreachable, and mark them as final so as it not possible to override them in other visitors.

gcc/rust/ChangeLog:

* hir/rust-ast-lower-base.cc: Adapt functions for ErrorPropagationExpr and MacroInvocation.
* hir/rust-ast-lower-base.h: Mark them as final.
* hir/rust-ast-lower-expr.cc: Remove previous definition for those overrides.
* hir/rust-ast-lower-expr.h: Likewise.

4 months agogccrs: ast: Add base for desugaring try expressions
Arthur Cohen [Wed, 22 Jan 2025 17:20:37 +0000 (17:20 +0000)] 
gccrs: ast: Add base for desugaring try expressions

gcc/rust/ChangeLog:

* Make-lang.in: Compile it.
* ast/rust-desugar-question-mark.cc: New file.
* ast/rust-desugar-question-mark.h: New file.

gcc/testsuite/ChangeLog:

* rust/compile/try-expr1.rs: New test.

4 months agogccrs: Adjust unknown macro error message
Owen Avery [Tue, 25 Feb 2025 15:16:18 +0000 (10:16 -0500)] 
gccrs: Adjust unknown macro error message

gcc/rust/ChangeLog:

* resolve/rust-early-name-resolver-2.0.cc
(Early::visit): Adjust error produced when macro resolution
fails.
* resolve/rust-early-name-resolver.cc
(EarlyNameResolver::visit): Likewise.

gcc/testsuite/ChangeLog:

* rust/compile/macros/mbe/macro43.rs: Adjust expected errors.
* rust/compile/macros/mbe/macro44.rs: Likewise.
* rust/compile/nested_macro_use2.rs: Likewise.
* rust/compile/nr2/exclude: Remove entries.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: nr2.0: Handle lang item type path segments
Owen Avery [Sun, 9 Feb 2025 08:02:58 +0000 (03:02 -0500)] 
gccrs: nr2.0: Handle lang item type path segments

gcc/rust/ChangeLog:

* resolve/rust-forever-stack.hxx
(ForeverStack::find_starting_point): Stop when hitting a lang
item segment.
(ForeverStack::resolve_segments): Resolve lang item segments.
(ForeverStacl::resolve_path): Handle single segment lang item
paths and add comment.
* util/rust-unwrap-segment.cc
(unwrap_segment_get_lang_item): Add.
* util/rust-unwrap-segment.h
(unwrap_segment_get_lang_item): Add.

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude: Remove entries.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: expansion: Expand generic args in generic type path segments
Arthur Cohen [Mon, 24 Feb 2025 11:18:54 +0000 (12:18 +0100)] 
gccrs: expansion: Expand generic args in generic type path segments

gcc/rust/ChangeLog:

* expand/rust-expand-visitor.cc (ExpandVisitor::visit): Correctly visit the generic args
of a generic type path segment.

gcc/testsuite/ChangeLog:

* rust/compile/issue-2015.rs: New test.

4 months agogccrs: name-resolution: early: Remove overzealous overrides
Arthur Cohen [Mon, 24 Feb 2025 11:18:39 +0000 (12:18 +0100)] 
gccrs: name-resolution: early: Remove overzealous overrides

Some empty overrides were incorrectly being set-up instead of using the correct behavior
from DefaultASTVisitor.

gcc/rust/ChangeLog:

* resolve/rust-early-name-resolver.cc: Remove definitions.
* resolve/rust-early-name-resolver.h: Remove declarations.

4 months agogccrs: lower: Always crash when lowering macro invocations
Arthur Cohen [Mon, 24 Feb 2025 11:16:11 +0000 (12:16 +0100)] 
gccrs: lower: Always crash when lowering macro invocations

gcc/rust/ChangeLog:

* hir/rust-ast-lower-base.cc (ASTLoweringBase::visit): Add base implementation
for visitor.

4 months agogccrs: nr2.0: Implement macro_use for modules
Owen Avery [Wed, 19 Feb 2025 02:20:45 +0000 (21:20 -0500)] 
gccrs: nr2.0: Implement macro_use for modules

gcc/rust/ChangeLog:

* resolve/rust-early-name-resolver-2.0.cc:
Include rust-attribute-values.h.
(Early::visit): If a module has a macro_use attribute, avoid
pushing a new textual macro scope.

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude: Remove entries.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: Adjust type path resolution error message
Owen Avery [Mon, 10 Feb 2025 02:42:21 +0000 (21:42 -0500)] 
gccrs: Adjust type path resolution error message

gcc/rust/ChangeLog:

* resolve/rust-ast-resolve-type.cc
(ResolveRelativeTypePath::go): Adjust error message to match
the 2.0 name resolver.

gcc/testsuite/ChangeLog:

* rust/compile/additional-trait-bounds2.rs: Adjust expected
errors.
* rust/compile/const_generics_4.rs: Likewise.
* rust/compile/const_generics_7.rs: Likewise.
* rust/compile/generic-default1.rs: Likewise.
* rust/compile/generics5.rs: Likewise.
* rust/compile/generics9.rs: Likewise.
* rust/compile/issue-2423.rs: Likewise.
* rust/compile/method2.rs: Likewise.
* rust/compile/nr2/exclude: Remove entries.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: hir-dump: Fix more segfaults in the HIR dump
Arthur Cohen [Fri, 20 Dec 2024 18:00:48 +0000 (18:00 +0000)] 
gccrs: hir-dump: Fix more segfaults in the HIR dump

gcc/rust/ChangeLog:

* hir/rust-hir-dump.cc: Check unique_ptr members are present before
visiting them.
* hir/tree/rust-hir-path.h: Add `has_{type, trait}` methods to
QualifiedPathInType.

4 months agogccrs: derive(Hash): Add implementation.
Arthur Cohen [Thu, 20 Feb 2025 17:01:28 +0000 (17:01 +0000)] 
gccrs: derive(Hash): Add implementation.

gcc/rust/ChangeLog:

* Make-lang.in: Compile it.
* expand/rust-derive.cc (DeriveVisitor::derive): Call it.
* expand/rust-derive-hash.cc: New file.
* expand/rust-derive-hash.h: New file.

gcc/testsuite/ChangeLog:

* rust/compile/derive-hash1.rs: New test.
* rust/compile/nr2/exclude: Add testcase to exclusion list.

4 months agogccrs: derive(Debug): Use builder's ptrify function instead
Arthur Cohen [Fri, 21 Feb 2025 14:54:09 +0000 (14:54 +0000)] 
gccrs: derive(Debug): Use builder's ptrify function instead

gcc/rust/ChangeLog:

* expand/rust-derive-debug.cc (ptrify): Remove function.

4 months agogccrs: ast: builder: Add new builder methods
Arthur Cohen [Fri, 21 Feb 2025 14:52:17 +0000 (14:52 +0000)] 
gccrs: ast: builder: Add new builder methods

gcc/rust/ChangeLog:

* ast/rust-ast-builder.cc (Builder::statementify): New.
(Builder::function): Add generic params optional argument.
(Builder::path_in_expression): Add opening_scope_resolution optional argument.
(Builder::block): Add function for creating empty blocks.
(Builder::generic_type_param):  New.
* ast/rust-ast-builder.h (ptrify): New.

4 months agogccrs: Remove some member functions from SingleASTNode
Owen Avery [Sat, 22 Feb 2025 03:51:32 +0000 (22:51 -0500)] 
gccrs: Remove some member functions from SingleASTNode

gcc/rust/ChangeLog:

* ast/rust-ast.h
(SingleASTNode::take_trait_item): Remove.
(SingleASTNode::take_impl_item): Remove.
(SingleASTNode::take_trait_impl_item): Remove.
* expand/rust-expand-visitor.cc
(ExpandVisitor::visit): Replace calls to aforementioned
functions with calls to SingleASTNode::take_assoc_item.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: Fix expansion of macros inside modules
Owen Avery [Sat, 22 Feb 2025 00:07:59 +0000 (19:07 -0500)] 
gccrs: Fix expansion of macros inside modules

gcc/rust/ChangeLog:

* expand/rust-expand-visitor.cc
(ExpandVisitor::visit): Override DefaultASTVisitor in order to
expand a module's items, rather than directly visit them.
* expand/rust-expand-visitor.h
(ExpandVisitor::visit): Add override.

gcc/testsuite/ChangeLog:

* rust/compile/macros/mbe/macro-expand-module.rs: New test.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: Remove PathInExpression::get_pattern_node_id
Owen Avery [Sat, 22 Feb 2025 03:50:51 +0000 (22:50 -0500)] 
gccrs: Remove PathInExpression::get_pattern_node_id

gcc/rust/ChangeLog:

* ast/rust-path.h
(PathInExpression::get_pattern_node_id): Remove.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: derive(Eq): Create copies of Eq typepath to avoid NodeId confusion
Arthur Cohen [Thu, 20 Feb 2025 09:11:21 +0000 (09:11 +0000)] 
gccrs: derive(Eq): Create copies of Eq typepath to avoid NodeId confusion

gcc/rust/ChangeLog:

* expand/rust-derive-eq.cc: Copy `Eq` typepath.

4 months agogccrs: derive(Eq): Also derive StructuralEq
Arthur Cohen [Tue, 4 Feb 2025 15:12:25 +0000 (16:12 +0100)] 
gccrs: derive(Eq): Also derive StructuralEq

gcc/rust/ChangeLog:

* expand/rust-derive-eq.cc: Adapt functions to return two generated impls.
* expand/rust-derive-eq.h: Likewise.
* expand/rust-derive.cc (DeriveVisitor::derive): Likewise.

4 months agogccrs: derive(PartialEq): Also derive StructuralPartialEq
Arthur Cohen [Tue, 4 Feb 2025 15:06:33 +0000 (16:06 +0100)] 
gccrs: derive(PartialEq): Also derive StructuralPartialEq

gcc/rust/ChangeLog:

* expand/rust-derive-partial-eq.cc: Adapt signatures to generate two impls.
* expand/rust-derive-partial-eq.h: Likewise.
* expand/rust-derive.cc (DeriveVisitor::derive): Adapt to multiple item generation.

gcc/testsuite/ChangeLog:

* rust/compile/derive-eq-invalid.rs: Declare StructuralPartialEq.
* rust/compile/derive-partialeq1.rs: Likewise.
* rust/execute/torture/derive-partialeq1.rs: Likewise.

4 months agogccrs: expand: Allow built-in derives to generate multiple items
Arthur Cohen [Tue, 4 Feb 2025 08:58:14 +0000 (09:58 +0100)] 
gccrs: expand: Allow built-in derives to generate multiple items

gcc/rust/ChangeLog:

* expand/rust-derive.cc (DeriveVisitor::derive): Return a vector of items.
* expand/rust-derive.h: Change return type.
* expand/rust-expand-visitor.cc: Insert all generated items into the AST.

4 months agogccrs: derive(PartialEq): Add partial implementation
Arthur Cohen [Thu, 30 Jan 2025 13:41:11 +0000 (14:41 +0100)] 
gccrs: derive(PartialEq): Add partial implementation

We are still missing some deriving for enums, as part of our codegen and nameres for rebinding struct
field patterns is missing.

gcc/rust/ChangeLog:

* expand/rust-derive-partial-eq.cc: New file.
* expand/rust-derive-partial-eq.h: New file.
* expand/rust-derive.cc (DeriveVisitor::derive): Call them.
* Make-lang.in: Compile them.

gcc/testsuite/ChangeLog:

* rust/compile/derive-eq-invalid.rs: Mark PartialEq def as a lang item.
* rust/compile/derive-partialeq1.rs: New test.
* rust/execute/torture/derive-partialeq1.rs: New test.
* rust/compile/nr2/exclude: Exclude all of them.

4 months agogccrs: derive(Clone): chore: Cleanup
Arthur Cohen [Fri, 31 Jan 2025 17:58:24 +0000 (17:58 +0000)] 
gccrs: derive(Clone): chore: Cleanup

gcc/rust/ChangeLog:

* expand/rust-derive-clone.cc: Cleanup implementation, avoid repetitions.
* expand/rust-derive-clone.h: Likewise.

4 months agogccrs: ast-builder: Add new methods for creating operator expressions
Arthur Cohen [Fri, 31 Jan 2025 13:24:02 +0000 (13:24 +0000)] 
gccrs: ast-builder: Add new methods for creating operator expressions

gcc/rust/ChangeLog:

* ast/rust-ast-builder.cc (Builder::literal_bool): New method.
(Builder::comparison_expr): Likewise.
(Builder::boolean_operation): Likewise.
* ast/rust-ast-builder.h: Declare them.

4 months agogccrs: ast-builder: Improve function generation.
Arthur Cohen [Thu, 30 Jan 2025 13:56:37 +0000 (14:56 +0100)] 
gccrs: ast-builder: Improve function generation.

gcc/rust/ChangeLog:

* ast/rust-ast-builder.cc (Builder::block): Change return type.
(Builder::loop): Use new APIs.
* ast/rust-ast-builder.h: Change return type of block functions.

4 months agogccrs: derive(Eq): Add implementation.
Arthur Cohen [Thu, 30 Jan 2025 13:04:17 +0000 (14:04 +0100)] 
gccrs: derive(Eq): Add implementation.

gcc/rust/ChangeLog:

* expand/rust-derive.cc (DeriveVisitor::derive): Call into DeriveEq.
* expand/rust-derive-eq.cc: New file.
* expand/rust-derive-eq.h: New file.
* Make-lang.in: Compile them.

gcc/testsuite/ChangeLog:

* rust/compile/derive-eq-invalid.rs: New test.

4 months agogccrs: nr2.0: Run DefaultResolver::visit on PathInExpression
Owen Avery [Tue, 4 Feb 2025 10:53:10 +0000 (05:53 -0500)] 
gccrs: nr2.0: Run DefaultResolver::visit on PathInExpression

gcc/rust/ChangeLog:

* resolve/rust-late-name-resolver-2.0.cc
(Late::visit): When visiting a PathInExpression instance, call
into DefaultResolver::visit, ensuring generic arguments are
visited.

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude: Remove entries.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: nr2.0: Fix issue with external crates
Owen Avery [Tue, 18 Feb 2025 07:03:56 +0000 (02:03 -0500)] 
gccrs: nr2.0: Fix issue with external crates

gcc/rust/ChangeLog:

* resolve/rust-toplevel-name-resolver-2.0.cc
(TopLevel::visit): When visiting an external crate declaration,
handle failed crate name lookups. This can happen when
Session::load_extern_crate fails to load a crate during the
CfgStrip phase.

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude: Remove entries.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: Add comments to resolve_segments
Owen Avery [Mon, 17 Feb 2025 23:33:08 +0000 (18:33 -0500)] 
gccrs: Add comments to resolve_segments

gcc/rust/ChangeLog:

* resolve/rust-forever-stack.hxx
(ForeverStack::resolve_segments): Add comments explaining
the behaviour of a while loop.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: Add type check on if-expr
Benjamin Thos [Mon, 16 Dec 2024 13:11:38 +0000 (14:11 +0100)] 
gccrs: Add type check on if-expr

Check if an if-expr returns void type or a coercible type like an early return.

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit):
Add check on if-expr.

gcc/testsuite/ChangeLog:

* rust/compile/implicit_returns_err3.rs: Change test to be valid.
* rust/compile/torture/if.rs: Likewise.
* rust/compile/if-without-else.rs: New test.

Signed-off-by: Benjamin Thos <benjamin.thos@epita.fr>
4 months agogccrs: nr2.0: Resolve paths which start with Self
Owen Avery [Tue, 4 Feb 2025 10:02:38 +0000 (05:02 -0500)] 
gccrs: nr2.0: Resolve paths which start with Self

gcc/rust/ChangeLog:

* resolve/rust-forever-stack.hxx
(ForeverStack::find_starting_point): Be more careful about
applying ForeverStack::find_closest_module.
(ForeverStack::resolve_segments): Allow traversal into parent
nodes when not in a module node or root node, which
ForeverStack::find_starting_point previously made moot through
use of ForeverStack::find_closest_module. Also, when a child
node lookup fails when resolving in the type namespace, attempt
a rib lookup as a fallback.
* resolve/rust-late-name-resolver-2.0.cc
(Late::visit): Avoid throwing a resolution error for type paths
when the typechecker may be able to finish the resolution. Also,
throw an error when a resolution is ambiguous.

gcc/testsuite/ChangeLog:

* rust/compile/nr2/exclude: Remove entries.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
4 months agogccrs: initial setup for new OpaqueType to represent Impl types
Philip Herron [Sun, 16 Feb 2025 01:42:05 +0000 (01:42 +0000)] 
gccrs: initial setup for new OpaqueType to represent Impl types

This completes the initial setup and boilerplate for the new type in the
typesystem. This is not functional yet but its a big patch already.

gcc/rust/ChangeLog:

* backend/rust-compile-type.cc (TyTyResolveCompile::visit): new tyty::OpaqueType
* backend/rust-compile-type.h: likewise
* checks/errors/borrowck/rust-bir-fact-collector.h: likewise
* checks/errors/borrowck/rust-bir-place.h: likewise
* checks/errors/privacy/rust-privacy-reporter.cc (PrivacyReporter::check_base_type_privacy):
likewise
* typecheck/rust-hir-type-check-type.cc (TypeCheckType::visit): likewise
* typecheck/rust-hir-type-check-type.h: likewise
* typecheck/rust-substitution-mapper.cc (SubstMapperInternal::visit): likewise
* typecheck/rust-substitution-mapper.h: likewise
* typecheck/rust-tyty-bounds.cc (TypeBoundsProbe::assemble_sized_builtin): likewise
* typecheck/rust-tyty-call.h: likewise
* typecheck/rust-tyty-cmp.h (class OpaqueCmp): likewise
* typecheck/rust-tyty-variance-analysis-private.h: likewise
* typecheck/rust-tyty-visitor.h: likewise
* typecheck/rust-tyty.cc (TypeKindFormat::to_string): likewise
(BaseType::is_unit): likewise
(BaseType::destructure): likewise
(BaseType::has_substitutions_defined): likewise
(BaseType::needs_generic_substitutions): likewise
(OpaqueType::OpaqueType): likewise
(OpaqueType::can_resolve): likewise
(OpaqueType::accept_vis): likewise
(OpaqueType::as_string): likewise
(OpaqueType::get_name): likewise
(OpaqueType::can_eq): likewise
(OpaqueType::clone): likewise
(OpaqueType::resolve): likewise
(OpaqueType::is_equal): likewise
(OpaqueType::handle_substitions): likewise
* typecheck/rust-tyty.h (enum TypeKind): likewise
(class OpaqueType): likewise
* typecheck/rust-unify.cc (UnifyRules::go): likewise
(UnifyRules::expect_inference_variable): likewise
(UnifyRules::expect_adt): likewise
(UnifyRules::expect_str): likewise
(UnifyRules::expect_reference): likewise
(UnifyRules::expect_pointer): likewise
(UnifyRules::expect_param): likewise
(UnifyRules::expect_array): likewise
(UnifyRules::expect_slice): likewise
(UnifyRules::expect_fndef): likewise
(UnifyRules::expect_fnptr): likewise
(UnifyRules::expect_tuple): likewise
(UnifyRules::expect_bool): likewise
(UnifyRules::expect_char): likewise
(UnifyRules::expect_int): likewise
(UnifyRules::expect_uint): likewise
(UnifyRules::expect_float): likewise
(UnifyRules::expect_isize): likewise
(UnifyRules::expect_usize): likewise
(UnifyRules::expect_placeholder): likewise
(UnifyRules::expect_projection): likewise
(UnifyRules::expect_dyn): likewise
(UnifyRules::expect_opaque): likewise
* typecheck/rust-unify.h: likewise

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
4 months agogccrs: Add name resolution and HIR lowering for ImplTraitType's
Philip Herron [Sat, 15 Feb 2025 21:22:16 +0000 (21:22 +0000)] 
gccrs: Add name resolution and HIR lowering for ImplTraitType's

Our AST has ImplTraitType for multiple bounds and a singular
ImplTraitTypeOneBound, this patch desugars these into a simple
HIR::ImplTraitType. It also does the name resolution for this.

gcc/rust/ChangeLog:

* checks/errors/borrowck/rust-bir-builder-struct.h: remove HIR::ImplTraitTypeOneBound
* checks/errors/borrowck/rust-function-collector.h: likewise
* checks/errors/rust-const-checker.cc (ConstChecker::visit): likewise
* checks/errors/rust-const-checker.h: likewise
* checks/errors/rust-hir-pattern-analysis.cc (PatternChecker::visit): likewise
* checks/errors/rust-hir-pattern-analysis.h: likewise
* checks/errors/rust-unsafe-checker.cc (UnsafeChecker::visit): likewise
* checks/errors/rust-unsafe-checker.h: likewise
* hir/rust-ast-lower-type.cc (ASTLoweringType::translate): likewise
(ASTLoweringType::visit): likewise
* hir/rust-ast-lower-type.h: cleanup
* hir/rust-hir-dump.cc (Dump::visit): remove ImplTraitTypeOneBound
* hir/rust-hir-dump.h: likewise
* hir/tree/rust-hir-full-decls.h (class ImplTraitTypeOneBound): likewise
* hir/tree/rust-hir-type.h (class ImplTraitTypeOneBound): likewise
* hir/tree/rust-hir-visitor.h: likewise
* hir/tree/rust-hir.cc (ImplTraitTypeOneBound::as_string):  likewise
(ImplTraitTypeOneBound::accept_vis):  likewise
* resolve/rust-ast-resolve-type.cc (ResolveType::go): likewise
(ResolveType::visit): likewise
* resolve/rust-ast-resolve-type.h: add name resolution
* typecheck/rust-hir-type-check-type.h: likewise

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
4 months agogccrs: improve error diagnostic for bad type-resolution in CallExpr
Philip Herron [Fri, 14 Feb 2025 17:32:20 +0000 (17:32 +0000)] 
gccrs: improve error diagnostic for bad type-resolution in CallExpr

We have the type information for the resolved call lets tell the user about
it in the diagnostic and apply the correct error code.

Fixes Rust-GCC#2035

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): improve error diag

gcc/testsuite/ChangeLog:

* rust/compile/generics4.rs: cleanup
* rust/compile/generics6.rs: likewise
* rust/compile/type-bindings1.rs: likewise
* rust/compile/unconstrained_type_param.rs: likewise
* rust/compile/issue-2035.rs: New test.

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
4 months agogccrs: self paths are patterns but we dont have mappings for it
Philip Herron [Thu, 13 Feb 2025 17:45:09 +0000 (17:45 +0000)] 
gccrs: self paths are patterns but we dont have mappings for it

With simple patterns we dont introduce any more inference varaibles as
they are already declared in a specific way. This would only lead to
more unconstrained inference varaibles than is required.

Fixes Rust-GCC#3022

gcc/rust/ChangeLog:

* hir/rust-ast-lower-base.cc (ASTLoweringBase::lower_self): add location mappings
* typecheck/rust-hir-type-check-path.cc (TypeCheckExpr::resolve_root_path): check for self

gcc/testsuite/ChangeLog:

* rust/compile/issue-3022.rs: New test.

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
4 months agogccrs: fix name resolution for generics where type param is declared later
Philip Herron [Thu, 13 Feb 2025 17:01:31 +0000 (17:01 +0000)] 
gccrs: fix name resolution for generics where type param is declared later

Rust allows you to use generics within type bounds when they are declared
later on. This changes the name resolution to walk the genric params
in two passes to ensure the type parameters are setup before drilling down
into the type parameters

This issue has exposed another type checking issue which needs fixed in
a subseqent patch.

Addresses Rust-GCC#3022

gcc/rust/ChangeLog:

* resolve/rust-ast-resolve-item.cc (ResolveTraitItems::visit): use new api
(ResolveItem::visit): likewise
(ResolveExternItem::visit): likewise
* resolve/rust-ast-resolve-stmt.h: likewise
* resolve/rust-ast-resolve-type.h (class ResolveGenericParam): remove
(class ResolveGenericParams): added new api

Signed-off-by: Philip Herron <herron.philip@googlemail.com>