aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
AgeCommit message (Collapse)AuthorFilesLines
2025-08-08arm: Fix CMSE nonecure calls [PR 120977]Christophe Lyon2-3/+18
As discussed in https://gcc.gnu.org/pipermail/gcc-patches/2025-June/685733.html the operand of the call should be a mem rather than an unspec. This patch moves the unspec to an additional argument of the parallel and adjusts cmse_nonsecure_call_inline_register_clear accordingly. The scan-rtl-dump in cmse-18.c needs a fix since we no longer emit the 'unspec' part. In addition, I noticed that since arm_v8_1m_mve_ok is always true in the context of the test (we know we support CMSE as per cmse.exp, and arm_v8_1m_mve_ok finds the adequate options), we actually only use the more permissive regex. To improve that, the patch duplicates the test, such that cmse-18.c forces -march=armv8-m.main+fp (so FPCXP is disabled), and cmse-19.c forces -march=armv8.1-m.main+mve (so FPCXP is enabled). Each test uses the appropriate scan-rtl-dump, and also checks we are using UNSPEC_NONSECURE_MEM (we need to remove -slim for that). The tests enable an FPU via -march so that the test passes whether the testing harness forces -mfloat-abi or not. 2025-07-08 Christophe Lyon <christophe.lyon@linaro.org> PR target/120977 gcc/ * config/arm/arm.md (call): Move unspec parameter to parallel. (nonsecure_call_internal): Likewise. (call_value): Likewise. (nonsecure_call_value_internal): Likewise. * config/arm/thumb1.md (nonsecure_call_reg_thumb1_v5): Likewise. (nonsecure_call_value_reg_thumb1_v5): Likewise. * config/arm/thumb2.md (nonsecure_call_reg_thumb2_fpcxt): Likewise. (nonsecure_call_reg_thumb2): Likewise. (nonsecure_call_value_reg_thumb2_fpcxt): Likewise. (nonsecure_call_value_reg_thumb2): Likewise. * config/arm/arm.cc (cmse_nonsecure_call_inline_register_clear): Likewise. gcc/testsuite * gcc.target/arm/cmse/cmse-18.c: Check only the case when FPCXT is not enabled. * gcc.target/arm/cmse/cmse-19.c: New test.
2025-08-08AArch64: Fix invalid immediate offsets in SVE gather/scatter [PR121449]Pengfei Li1-0/+44
This patch fixes incorrect constraints in RTL patterns for AArch64 SVE gather/scatter with type widening/narrowing and vector-plus-immediate addressing. The bug leads to below "immediate offset out of range" errors during assembly, eventually causing compilation failures. /tmp/ccsVqBp1.s: Assembler messages: /tmp/ccsVqBp1.s:54: Error: immediate offset out of range 0 to 31 at operand 3 -- `ld1b z1.d,p0/z,[z1.d,#64]' Current RTL patterns for such instructions incorrectly use vgw or vgd constraints for the immediate operand, base on the vector element type in Z registers (zN.s or zN.d). However, for gather/scatter with type conversions, the immediate range for vector-plus-immediate addressing is determined by the element type in memory, which differs from that in vector registers. Using the wrong constraint can produce out-of-range offset values that cannot be encoded in the instruction. This patch corrects the constraints used in these patterns. A test case that reproduces the issue is also included. Bootstrapped and regression-tested on aarch64-linux-gnu. gcc/ChangeLog: PR target/121449 * config/aarch64/aarch64-sve.md (mask_gather_load<mode><v_int_container>): Use vg<Vesize> constraints for alternatives with immediate offset. (mask_scatter_store<mode><v_int_container>): Likewise. gcc/testsuite/ChangeLog: PR target/121449 * g++.target/aarch64/sve/pr121449.C: New test.
2025-08-08aarch64: Relax fpm_t assert to allow const_ints [PR120986]Alex Coplan1-0/+7
This relaxes an overzealous assert that required the fpm_t argument to be in DImode when expanding FP8 intrinsics. Of course this fails to account for modeless const_ints. gcc/ChangeLog: PR target/120986 * config/aarch64/aarch64-sve-builtins.cc (function_expander::expand): Relax fpm_t assert to allow modeless const_ints. gcc/testsuite/ChangeLog: PR target/120986 * gcc.target/aarch64/torture/pr120986-2.c: New test.
2025-08-08aarch64: Fix predication of FP8 FDOT insns [PR120986]Alex Coplan1-0/+10
The predication of the SVE2 FP8 dot product insns was relying on the architectural dependency: FEAT_FP8DOT2 => FEAT_FP8DOT4 which was relaxed in GCC as of r15-7480-g299a8e2dc667e795991bc439d2cad5ea5bd379e2, thus leading to unrecognisable insn ICEs when compiling a two-way FDOT with just +fp8dot2. This patch introduces a new mode iterator which selectively enables the appropriate mode(s) depending on which of the FP8DOT{2,4} features are available, and uses it to fix the predication of the patterns. gcc/ChangeLog: PR target/120986 * config/aarch64/aarch64-sve2.md (@aarch64_sve_dot<mode>): Switch mode iterator from SVE_FULL_HSF to new iterator; remove insn predicate as this is now taken care of by conditions in the mode iterator. (@aarch64_sve_dot_lane<mode>): Likewise. * config/aarch64/iterators.md (SVE_FULL_HSF_FP8_FDOT): New. gcc/testsuite/ChangeLog: PR target/120986 * gcc.target/aarch64/pr120986-1.c: New test.
2025-08-08tailc: Handle other forms of finally_tmp.N conditional cleanups after ↵Jakub Jelinek4-0/+196
musttail [PR121389] My earlier r16-1886 PR120608 change incorrectly assumed that the finally_tmp.N vars introduced by eh pass will be only initialized to values 0 and 1 and there will be only EQ_EXPR/NE_EXPR comparisons of those. The following testcases show that is a bad assumption, the eh pass sets finally_tmp.N vars to 0 up to some highest index depending on hoiw many different exits there are from the finally region. And it emits then switch (finally_tmp.N) statement for all the different cases. So, if it uses more than 0/1 indexes, the lowering of the switch can turn it into a series of GIMPLE_CONDs, if (finally_tmp.N_M > 15) goto ... else goto ... if (finally_tmp.N_M > 7) goto ... else goto ... etc. (and that also means no longer single uses). And if unlucky, we can see a non-lowered GIMPLE_SWITCH as well. So, the following patch removes the assumption that it has to be 0/1 and EQ_EXPR/NE_EXPR, allows all the normal integral comparisons and handles GIMPLE_SWITCH too. 2025-08-08 Jakub Jelinek <jakub@redhat.com> PR middle-end/121389 * tree-tailcall.cc (find_tail_calls): For finally_tmp.N handle not just GIMPLE_CONDs with EQ_EXPR/NE_EXPR and only values 0 and 1, but arbitrary non-negative values, arbitrary comparisons in conditions and also GIMPLE_SWITCH next to GIMPLE_CONDs. * c-c++-common/asan/pr121389-1.c: New test. * c-c++-common/asan/pr121389-2.c: New test. * c-c++-common/asan/pr121389-3.c: New test. * c-c++-common/asan/pr121389-4.c: New test.
2025-08-08Daily bump.GCC Administrator1-0/+97
2025-08-07c++: Implement C++26 P1061R10 - Structured Bindings can introduce a Pack ↵Jakub Jelinek10-2/+1581
[PR117783] The following patch implements the C++26 P1061R10 - Structured Bindings can introduce a Pack paper. One thing unresolved in the patch is mangling, I've raised https://github.com/itanium-cxx-abi/cxx-abi/issues/200 for that but no comments there yet. One question is if it is ok not to mention the fact that there is a structured binding pack in the mangling of the structured bindings but more important is in case of std::tuple* we might need to mangle individual structured binding pack elements separately (each might need an exported name for the var itself and perhaps its guard variable as well). The patch just uses the normal mangling for the whole structured bindings and emits sorry if we need to mangle the structured binding pack elements. The patch just marks the structured binding pack specially (considered e.g. using some bit on it, but in the end I'm identifying it using a made up type which causes DECL_PACK_P to be true; it is kind of self-referential solution, because the type on the pack mentions the DECL_DECOMPOSITION_P VAR_DECL on which the type is attached as its pack, so it needs to be handled carefully during instantiation to avoid infinite recursion, but it is the type that should be used if something else actually needs to use the same type as the structured binding pack, e.g. a capture proxy), and stores the pack elements when actually processed through cp_finish_decomp with non-dependent initializer into a TREE_VEC used as DECL_VALUE_EXPR of the pack; though because several spots use the DECL_VALUE_EXPR and assume it is ARRAY_REF from which they can find out the base variable and the index, it stores the base variable and index in the first 2 TREE_VEC elts and has the structured binding elements only after that. https://eel.is/c++draft/temp.dep.expr#3.6 says the packs are type dependent regardless of whether the initializer of the structured binding is type dependent or not, so I hope having a dependent type on the structured binding VAR_DECL is ok. The paper also has an exception for sizeof... which is then not value dependent when the structured bindings are initialized with non-dependent initializer: https://eel.is/c++draft/temp.dep.constexpr#4 The patch special cases that in 3 spots (I've been wondering if e.g. during parsing I couldn't just fold the sizeof... to the INTEGER_CST right away, but guess I'd need to repeat that also during partial instantiation). And one thing still unresolved is debug info, I've just added DECL_IGNORED_P on the structured binding pack VAR_DECL because there were ICEs with -g for now, hope it can be fixed incrementally but am not sure what exactly we should emit in the debug info for that. Speaking of which, I see DW_TAG_GNU_template_parameter_pack DW_TAG_GNU_formal_parameter_pack etc. DIEs emitted regardless of DWARF version, shouldn't we try to upstream those into DWARF 6 or check what other compilers emit for the packs? And bet we'd need DW_TAG_GNU_structured_binding_pack as well. 2025-08-07 Jakub Jelinek <jakub@redhat.com> PR c++/117783 gcc/c-family/ * c-cppbuiltin.cc (c_cpp_builtins): Change __cpp_structured_bindings predefined value for C++26 from 202403L to 202411L. gcc/cp/ * parser.cc: Implement C++26 P1061R10 - Structured Bindings can introduce a Pack. (cp_parser_range_for): Also handle TREE_VEC as DECL_VALUE_EXPR instead of ARRAY_REF. (cp_parser_decomposition_declaration): Use sb-identifier-list instead of identifier-list in comments. Parse structured bindings with structured binding pack. Don't emit pedwarn about structured binding attributes in structured bindings inside of a condition. (cp_convert_omp_range_for): Also handle TREE_VEC as DECL_VALUE_EXPR instead of ARRAY_REF. * decl.cc (get_tuple_element_type): Change i argument type from unsigned to unsigned HOST_WIDE_INT. (get_tuple_decomp_init): Likewise. (set_sb_pack_name): New function. (cp_finish_decomp): Handle structured binding packs. * pt.cc (tsubst_pack_expansion): Handle structured binding packs and capture proxies for them. Formatting fixes. (tsubst_decl): For structured binding packs don't tsubst TREE_TYPE first, instead recreate the type after r is created. (tsubst_omp_for_iterator): Also handle TREE_VEC as DECL_VALUE_EXPR instead of ARRAY_REF. (tsubst_expr): Handle sizeof... on non-dependent structure binding packs. (value_dependent_expression_p): Return false for sizeof... on non-dependent structure binding packs. (instantiation_dependent_r): Don't recurse on sizeof... on non-dependent structure binding packs. * constexpr.cc (potential_constant_expression_1): Also handle TREE_VEC on DECL_VALUE_EXPR of structure binding packs. gcc/testsuite/ * g++.dg/cpp26/decomp13.C: New test. * g++.dg/cpp26/decomp14.C: New test. * g++.dg/cpp26/decomp15.C: New test. * g++.dg/cpp26/decomp16.C: New test. * g++.dg/cpp26/decomp17.C: New test. * g++.dg/cpp26/decomp18.C: New test. * g++.dg/cpp26/decomp19.C: New test. * g++.dg/cpp26/decomp20.C: New test. * g++.dg/cpp26/decomp21.C: New test. * g++.dg/cpp26/feat-cxx26.C (__cpp_structured_bindings): Expect 202411 rather than 202403.
2025-08-07aarch64: Mark SME functions as .variant_pcs [PR121414]Richard Sandiford1-0/+27
Unlike base PCS functions, __arm_streaming and __arm_streaming_compatible functions allow/require PSTATE.SM to be 1 on entry, so they need to be treated as STO_AARCH64_VARIANT_PCS. Similarly, functions that share ZA or ZT0 with their callers require ZA to be active on entry, whereas the base PCS requires ZA to be dormant or off. These functions too need to be marked as having a variant PCS. gcc/ PR target/121414 * config/aarch64/aarch64.cc (aarch64_is_variant_pcs): New function, split out from... (aarch64_asm_output_variant_pcs): ...here. Handle various types of SME function type. gcc/testsuite/ PR target/121414 * gcc.target/aarch64/sme/pr121414_1.c: New test.
2025-08-07Remove MODE_COMPOSITE_P test from simplify_gen_subreg [PR120718]Richard Sandiford1-0/+12
simplify_gen_subreg rejected subregs of literal constants if MODE_COMPOSITE_P. This was added by the fix for PR96648 in g:c0f772894b6b3cd8ed5c5dd09d0c7917f51cf70f. Jakub said: As for the simplify_gen_subreg change, I think it would be desirable to just avoid creating SUBREGs of constants on all targets and for all constants, if simplify_immed_subreg simplified, fine, otherwise punt, but as we are late in GCC11 development, the patch instead guards this behavior on MODE_COMPOSITE_P (outermode) - i.e. only conversions to powerpc{,64,64le} double double long double - and only for the cases where simplify_immed_subreg was called. I'm not sure about relaxing the codes further, since subregs might be wanted for CONST, SYMBOL_REF and LABEL_REF. But removing the MODE_COMPOSITE_P is needed to fix PR120718, where we get an ICE from generating a subreg of a V2SI const_vector. gcc/ PR rtl-optimization/120718 * simplify-rtx.cc (simplify_context::simplify_gen_subreg): Remove MODE_COMPOSITE_P condition. gcc/testsuite/ PR rtl-optimization/120718 * gcc.target/aarch64/sve/acle/general/pr120718.c: New test.
2025-08-07tree-optimization/121405 - missed VN with aggregate copyRichard Biener2-5/+31
The following handles value-numbering of a BIT_FIELD_REF of a register that's defined by a load by looking up a subset load similar to how we handle bit-and masked loads. This allows the testcase to be simplified by two FRE passes, the first one will create the BIT_FIELD_REF. PR tree-optimization/121405 * tree-ssa-sccvn.cc (visit_nary_op): Handle BIT_FIELD_REF with reference def by looking up a combination of both. * gcc.dg/tree-ssa/ssa-fre-107.c: New testcase. * gcc.target/i386/pr90579.c: Adjust.
2025-08-07vect: Extend peeling and versioning for alignment to VLA modesPengfei Li6-0/+136
This patch extends the support for peeling and versioning for alignment from VLS modes to VLA modes. The key change is allowing the DR target alignment to be set to a non-constant poly_int. Since the value must be a power-of-two, for variable VFs, the power-of-two check is deferred to runtime through loop versioning. The vectorizable check for speculative loads is also refactored in this patch to handle both constant and variable target alignment values. Additional changes for VLA modes include: 1) Peeling In VLA modes, we use peeling with masking - using a partial vector in the first iteration of the vectorized loop to ensure aligned DRs in subsequent iterations. It was already enabled for VLS modes to avoid scalar peeling. This patch reuses most of the existing logic and just fixes a small issue of incorrect IV offset in VLA code path. This also removes a power-of-two rounding when computing the number of iterations to peel, as power-of-two VF has been guaranteed by a new runtime check. 2) Versioning The type of the mask for runtime alignment check is updated to poly_int to support variable VFs. After this change, both standalone versioning and peeling with versioning are available in VLA modes. This patch also introduces another runtime check for speculative read amount, to ensure that all speculative loads remain within current valid memory page. We plan to remove these runtime checks in the future by introducing capped VF - using partial vectors to limit the actual VF value at runtime. 3) Speculative read flag DRs whose scalar accesses are known to be in-bounds will be considered unaligned unsupported with a variable target alignment. But in fact, speculative reads can be naturally avoided for in-bounds DRs as long as partial vectors are used. Therefore, this patch clears the speculative flags and sets the "must use partial vectors" flag for these cases. This patch is bootstrapped and regression-tested on x86_64-linux-gnu, arm-linux-gnueabihf and aarch64-linux-gnu with bootstrap-O3. gcc/ChangeLog: * tree-vect-data-refs.cc (vect_compute_data_ref_alignment): Allow DR target alignment to be a poly_int. (vect_enhance_data_refs_alignment): Support peeling and versioning for VLA modes. * tree-vect-loop-manip.cc (get_misalign_in_elems): Remove power-of-two rounding in peeling. (vect_create_cond_for_align_checks): Update alignment check logic for poly_int mask. (vect_create_cond_for_vla_spec_read): New runtime checks. (vect_loop_versioning): Support new runtime checks. * tree-vect-loop.cc (_loop_vec_info::_loop_vec_info): Add a new loop_vinfo field. (vectorizable_induction): Fix wrong IV offset issue. * tree-vect-stmts.cc (get_load_store_type): Refactor vectorizable checks for speculative loads. * tree-vectorizer.h (LOOP_VINFO_MAX_SPEC_READ_AMOUNT): New macro for new runtime checks. (LOOP_REQUIRES_VERSIONING_FOR_SPEC_READ): Likewise (LOOP_REQUIRES_VERSIONING): Update macro for new runtime checks. gcc/testsuite/ChangeLog: * gcc.target/aarch64/sve/peel_ind_11.c: New test. * gcc.target/aarch64/sve/peel_ind_11_run.c: New test. * gcc.target/aarch64/sve/peel_ind_12.c: New test. * gcc.target/aarch64/sve/peel_ind_12_run.c: New test. * gcc.target/aarch64/sve/peel_ind_13.c: New test. * gcc.target/aarch64/sve/peel_ind_13_run.c: New test.
2025-08-07c++: Add testcase for CWG2577 [PR120778]Jakub Jelinek5-0/+62
And here is the last part of the paper. Contrary what the paper claims (clearly they haven't tried -pedantic nor -pedantic-errors), I think we already diagnose everything we should. 2025-08-07 Jakub Jelinek <jakub@redhat.com> PR preprocessor/120778 * g++.dg/DRs/dr2577-1.C: New test. * g++.dg/DRs/dr2577-2.C: New test. * g++.dg/DRs/dr2577-2.h: New file. * g++.dg/DRs/dr2577-3.C: New test. * g++.dg/DRs/dr2577-3.h: New file.
2025-08-07c++: Add testcase for CWG2575 [PR120778]Jakub Jelinek1-0/+51
From the paper it isn't clear what caused the decision changes, not to drop the "the token defined is generated as a result of this replacement process or" part and make [cpp.cond]/10 violations IFNDR rather than ill-formed (the latter maybe so that the extension to handle e.g. !A(A) below etc. can be accepted). Anyway, because that case hasn't been dropped and we pedwarn on it already, and diagnose everything else the way it should, the following patch just adds testcase for it. 2025-08-07 Jakub Jelinek <jakub@redhat.com> PR preprocessor/120778 * g++.dg/DRs/dr2575.C: New test.
2025-08-07c++: Add testcase for CWG2576 [PR120778]Jakub Jelinek1-0/+47
Another part of the C++26 P2843R3, this time in https://eel.is/c++draft/cpp.include#7 changing former (compile time) undefined behavior to IFNDR. With IFNDR we wouldn't have to test anything I guess, but this still adds the cases from the 3.4 section of the paper plus related tests. The paper wonders about implementation divergence between most compilers and gcc in the case of glueing tokens together with <> around from multiple macros, GCC doesn't add CPP_PADDING macros in that case (and even if it would, it would ignore them through get_token_no_padding). But I think this behavior is allowed by https://eel.is/c++draft/cpp.include#7.sentence-3 and changing it now after 25+ years of such behavior might break real-world stuff, especially making it really hard to construct the <> includes from some name and adding < and > from some other macro around that. We handle #define A <cstd def> #include A like clang++ and try to open 'cstd def' file. But not adding spaces for all the padding means handling even stuff where nothing else can help, while for cstd def coming from different macros one can use token pasting to combine them together, e.g. < and following identifier or identifier followed by . or . followed by identifier or identifier followed by > can't be pasted together. 2025-08-07 Jakub Jelinek <jakub@redhat.com> PR preprocessor/120778 * g++.dg/DRs/dr2576.C: New test.
2025-08-07c++, c: Introduce -Wkeyword-macro warning/pedwarn - part of C++26 P2843R3 ↵Jakub Jelinek22-7/+989
[PR120778] The following patch introduces a -Wkeyword-macro warning that clang has since 2014 to implement part of C++26 P2843R3 Preprocessing is never undefined paper. The relevant change in the paper is moving [macro.names]/2 paragraph to https://eel.is/c++draft/cpp.replace.general#9 : "A translation unit shall not #define or #undef names lexically identical to keywords, to the identifiers listed in Table 4, or to the attribute-tokens described in [dcl.attr], except that the names likely and unlikely may be defined as function-like macros." Now, my understanding of the paper is that in [macro.names] and surrounding sections the word shall bears different meaning from [cpp.replace.general], where only the latter location implies ill-formed, diagnostic required. The warning in clang when introduced diagnosed all #define/#undef directives on keywords, but shortly after introduction has been changed not to diagnose #undef at all (with "#undef a keyword is generally harmless but used often in configuration scripts" message) and later on even the #define part tweaked - not warn about say #define inline (or const, extern, static), or #define keyword keyword or #define keyword __keyword or #define keyword __keyword__ Later on the warning has been moved to be only pedantic diagnostic unless requested by users. Clearly some code in the wild does e.g. #define private public and similar games, or e.g. Linux kernel (sure, C) does #define inline __inline__ __attribute__((__always_inline__)) etc. Now, I believe at least with the current C++26 wording such exceptions aren't allowed (unless it is changed to IFNDR). But given that this is just pedantic stuff, the following patch makes the warning off by default for C and C++ before C++26 and even for C++26 it enables it by default only if -pedantic/-pedantic-errors (in that case it pedwarns, otherwise it warns). And it diagnoses both #define and #undef without exceptions. From what I can see, all the current NODE_WARN cases are macros starting with __ with one exception (_Pragma). As the NODE_* flags seem to be a limited resource, I chose to just use NODE_WARN as well and differentiate on the node names (if they don't start with __ or _P, they are considered to be -Wkeyword-macro registered ones, otherwise old NODE_WARN cases, typically builtin macros or __STDC* macros). 2025-08-07 Jakub Jelinek <jakub@redhat.com> PR preprocessor/120778 gcc/ * doc/invoke.texi (Wkeyword-macro): Document. gcc/c-family/ * c.opt (Wkeyword-macro): New option. * c.opt.urls: Regenerate. * c-common.h (cxx_dialect): Comment formatting fix. * c-opts.cc (c_common_post_options): Default to -Wkeyword-macro for C++26 if pedantic. gcc/c/ * c-decl.cc (c_init_decl_processing): Mark cpp nodes corresponding to keywords as NODE_WARN if warn_keyword_macro. gcc/cp/ * lex.cc (cxx_init): Mark cpp nodes corresponding to keywords, identifiers with special meaning and standard attribute identifiers as NODE_WARN if warn_keyword_macro. gcc/testsuite/ * gcc.dg/Wkeyword-macro-1.c: New test. * gcc.dg/Wkeyword-macro-2.c: New test. * gcc.dg/Wkeyword-macro-3.c: New test. * gcc.dg/Wkeyword-macro-4.c: New test. * gcc.dg/Wkeyword-macro-5.c: New test. * gcc.dg/Wkeyword-macro-6.c: New test. * gcc.dg/Wkeyword-macro-7.c: New test. * gcc.dg/Wkeyword-macro-8.c: New test. * gcc.dg/Wkeyword-macro-9.c: New test. * g++.dg/warn/Wkeyword-macro-1.C: New test. * g++.dg/warn/Wkeyword-macro-2.C: New test. * g++.dg/warn/Wkeyword-macro-3.C: New test. * g++.dg/warn/Wkeyword-macro-4.C: New test. * g++.dg/warn/Wkeyword-macro-5.C: New test. * g++.dg/warn/Wkeyword-macro-6.C: New test. * g++.dg/warn/Wkeyword-macro-7.C: New test. * g++.dg/warn/Wkeyword-macro-8.C: New test. * g++.dg/warn/Wkeyword-macro-9.C: New test. * g++.dg/warn/Wkeyword-macro-10.C: New test. * g++.dg/opt/pr82577.C: Don't #define register to nothing for C++17 and later. Instead define reg macro to nothing for C++17 and later or to register and use it instead of register. * g++.dg/modules/atom-preamble-3.C: Add -Wno-keyword-macro to dg-additional-options. * g++.dg/template/sfinae17.C (static_assert): Rename macro to ... (my_static_assert): ... this. (main): Use my_static_assert instead of static_assert. libcpp/ * include/cpplib.h (struct cpp_options): Add cpp_warn_keyword_macro. (enum cpp_warning_reason): Add CPP_W_KEYWORD_MACRO enumerator. (cpp_keyword_p): New inline function. * directives.cc (do_undef): Support -Wkeyword-macro diagnostics. * macro.cc (warn_of_redefinition): Ignore NODE_WARN flag on nodes registered for -Wkeyword-macro. (_cpp_create_definition): Support -Wkeyword-macro diagnostics. Formatting fixes.
2025-08-07s390: Add _BitInt supportStefan Schulze Frielinghaus4-0/+214
gcc/ChangeLog: * config/s390/s390.cc (print_operand): Allow arbitrary wide_int constants for _BitInt. (s390_bitint_type_info): Implement target hook TARGET_C_BITINT_TYPE_INFO. libgcc/ChangeLog: * config/s390/libgcc-glibc.ver: Export _BitInt support functions. * config/s390/t-softfp (softfp_extras): Add fixtfbitint floatbitinttf. gcc/testsuite/ChangeLog: * gcc.target/s390/bitint-1.c: New test. * gcc.target/s390/bitint-2.c: New test. * gcc.target/s390/bitint-3.c: New test. * gcc.target/s390/bitint-4.c: New test.
2025-08-07Daily bump.GCC Administrator1-0/+109
2025-08-06testsuite: fix escaping of square bracketsSam James1-1/+1
This fails for me as: +ERROR: g++.dg/cpp26/constexpr-new3.C -std=c++26: unknown dg option: 2 for " dg-error 40 "accessing value of 'int [2]' object through a 'long int' glvalue in a constant expression" " otherwise. Escape '[' and ']'. gcc/testsuite/ChangeLog: * g++.dg/cpp26/constexpr-new3.C: Escape '[' and ']'.
2025-08-06[hardbool] implement OP=, ++ and --, volatile and atomicsAlexandre Oliva3-1/+79
hardbools didn't behave quite like bools when incremented, decremented, or otherwise modified using their previous value, as in += et al. Fix that. Also fix some checking errors that come up when using qualified base types. for gcc/c-family/ChangeLog * c-attribs.cc (handle_hardbool_attribute): Create distinct enumeration types, with structural equality. Handle base type qualifiers. for gcc/c/ChangeLog * c-tree.h (C_BOOLEAN_TYPE_P): Cover hardbools as well. * c-typeck.cc (convert_lvalue_to_rvalue): New overload and wrapper. (build_atomic_assign, build_modify_expr): Use it. (build_asm_expr, handle_omp-array_sections_1): Simplify with it. (build_unary_op): Handle hardbools. for gcc/testsuite/ChangeLog * gcc.dg/torture/hardbool-ai.c: New. * gcc.dg/torture/hardbool-vi.c: New. * gcc.dg/torture/hardbool.c: Handle NO_BITFIELDS. (add1, preinc, postinc, sub1, predec, postdec): New. (main): Exercise them.
2025-08-06c2y: Evaluate size expression only in the active branch of conditional ↵Martin Uecker1-0/+293
operator [PR108931] For size expressions in the branches of the conditional operator should be evaluated only for the active branch. To achieve this, construct also the size expressions for the composite type as conditional expressions depending on the condition of the conditional operator. The change avoids some undefined behavior removed by N3652, but the new constraints for C2Y are not yet implemented. PR c/108931 gcc/c/ChangeLog: * c-typeck.cc (composite_type_cond): Renamed from composite_type with argument for condition (composite_type): New function. (composite_type_internal): Implement new logic. (build_conditional_expr): Pass condition. (common_pointer_type): Adapt. (pointer_diff): Adapt. (build_binary_op): Adapt. gcc/testsuite/ChangeLog: * gcc.dg/vla-tert-1.c: New test.
2025-08-06c++: mangling cNTTP object w/ implicit non-trailing zeros [PR121231]Patrick Palka2-0/+115
Here the results of A::make(0, 0, 1), (0, 1, 0) and (1, 0, 0) are each represented as a single-element CONSTRUCTOR with CONSTRUCTOR_NO_CLEARING cleared, and when used as as a class NTTP argument we end up mangling them all as A{1}, i.e. eliding both the implicit initial and trailing zeros. Mangling them all the same seems clearly wrong since they're logically different values. It turns out the mangling also omits intermediate zeros, e.g. A::make(1, 0, 1) is mangled as A{1, 1}, the same as A::make(1, 1, 0). It seems we can't omit both trailing and non-trailing implicit zeros without introducing mangling ambiguities. This patch makes us include non-trailing zeros in these manglings (while continuing to omit trailing zeros). This also manifests as a wrong-code bug where the specializations table would conflate different specializations that are in terms of different class NTTP arguments, since the identity of such arguments is tied to their mangling. PR c++/121231 PR c++/119688 PR c++/94511 gcc/ChangeLog: * common.opt: Document additional ABI version 21 change. * doc/invoke.texi: Likewise. gcc/cp/ChangeLog: * mangle.cc (write_expression): Write out implicit non-trailing zeroes of a CONSTRUCTOR when the ABI version is at least 21. gcc/testsuite/ChangeLog: * g++.dg/abi/mangle82.C: New test. * g++.dg/cpp2a/nontype-class73.C: New test. Reviewed-by: Jason Merrill <jason@redhat.com>
2025-08-06c++: improve constexpr type mismatch diagnosticJason Merrill1-1/+1
This diagnostic failed to specify the actual type of the object being accessed through a glvalue of an incompatible type, and could also use to indicate where that object comes from. gcc/cp/ChangeLog: * constexpr.cc (cxx_eval_indirect_ref): Improve diagnostic. gcc/testsuite/ChangeLog: * g++.dg/cpp26/constexpr-new3.C: Tweak diagnostic.
2025-08-06Allow fully masked loops with legacy gather/scatterRichard Biener1-3/+3
The following removes the redundant check on supported gather/scatter IFN in check_load_store_for_partial_vectors which is already done and adjusts those to check the recorded ifn, also allowing legacy gather/scatter which all handle masking. * tree-vect-stmts.cc (check_load_store_for_partial_vectors): Remove redundant gather/scatter target support check, instead check the recorded ifns. Also allow legacy gather/scatter with loop masking. * gcc.dg/vect/vect-gather-1.c: Adjust to hide N.
2025-08-06AArch64: Fix test for vector length safetyTejas Belagod1-4/+4
The test was unsafe when tested on different vector lengths. This patch fixes it to work on all lengths. gcc/testsuite/ChangeLog * gcc.target/aarch64/sve/acle/general/cops.c: Fix test.
2025-08-06bitint: Do not optimize away conversion to _BitInt before a VCEYang Yujie1-0/+18
A _BitInt value may rely on a conversion to become properly extended. So a conversion to _BitInt is not trivially removable even if the types of the result and the operand have the same precision and size. This patch fixes gcc.dg/torture/bitint-64.c at -O2 on LoongArch, which fails because extension of the result is dropped in a compare-and-swap loop generated for incrementing an _Atomic _BitInt, causing an ABI violation. * match.pd: Preserve conversion to _BitInt before a VCE if the _BitInt is extended. * gcc.dg/torture/bitint-84.c: New test.
2025-08-06bitint: Zero-extend the result of a signed->unsigned widening castYang Yujie1-0/+48
A widening cast from a signed _BitInt operand to an unsigned _BitInt type involves filling the extra limb(s) with sign extension. On a target that wants _BitInts extended in memory, if this unsigned type has a partial limb, the unused part of it should be zeroed. e.g. Assuming limb_mode == E_DImode, at the end of void test (unsigned _BitInt(519) *t, _BitInt(512) x) { *t = -x; } the most significant limb of *t should be masked with 0x7f. This patch also fixes gcc.dg/torture/bitint-16.c, which aborts at -O2 when the extension on load is optimized away. * gimple-lower-bitint.cc (bitint_large_huge::lower_mergeable_stmt): Zero-extend the partial limb of any unsigned _BitInt LHS assigned with a widening sign-extension. * gcc.dg/torture/bitint-83.c: New test.
2025-08-06bitint: Make sure BEXTC checks extension when optimizedYang Yujie1-15/+13
In BEXTC, whether a _BitInt object is properly extended is examined by a value comparison against a copied object in a wider _BitInt type that utilizes all of the partial limb. Since the (implicit) conversion to the wider type may be optimized away now and cause the result of the comparison to always be true, we need to cast the copied object down to the original type to force a extension, so that it can serve as our reference. * gcc.dg/bitintext.h (BEXTC1): Define. Convert the copied object back to the original type before comparison. (BEXTC): Use BEXTC1 for both the signed and the unsigned case.
2025-08-06bitint: Fix up INTEGER_CST PHI handling [PR121413]Jakub Jelinek1-0/+34
The following testcase is miscompiled on aarch64-linux. The problem is in the optimization to shorten large constants in PHI arguments. In a couple of places during bitint lowering we compute minimal precision of constant and if it is significantly smaller than the precision of the type, store smaller constant in memory and extend it at runtime (zero or all ones). Now, in most places that works fine, we handle the stored number of limbs by loading them from memory and then the rest is extended. In the PHI INTEGER_CST argument handling we do it differently, we don't form there any loops (because we insert stmt sequences on the edges). The problem is that we copy the whole _BitInt variable from memory to the PHI VAR_DECL + initialize the rest to = {} or memset to -1. It has min_prec = CEIL (min_prec, limb_prec) * limb_prec; precision, so e.g. on x86_64 there is no padding and it works just fine. But on aarch64 which has abi_limb_mode TImode and limb_mode DImode it doesn't in some cases. In the testcase the constant has 408 bits min precision, rounded up to limb_prec (64) is 448, i.e. 7 limbs. But aarch64 with TImode abi_limb_mode will actually allocate 8 limbs and the most significant limb is solely padding. As we want to extend the constant with all ones, copying the padding (from memory, so 0s) will result in 64 0 bits where 1 bits were needed. The following patch fixes it by detecting this case and setting min_prec to a multiple of abi limb precision so that it has no padding. 2025-08-06 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/121413 * gimple-lower-bitint.cc (abi_limb_prec): New variable (bitint_precision_kind): Initialize it. (gimple_lower_bitint): Clear it at the start. For min_prec > limb_prec descreased precision vars for INTEGER_CST PHI arguments ensure min_prec is either prec or multiple of abi_limb_prec. * gcc.dg/torture/bitint-85.c: New test.
2025-08-06bitint: Fix up handling of uninitialized mul/div/float cast operands [PR121127]Jakub Jelinek1-0/+15
handle_operand_addr (used for the cases where we use libgcc APIs, so multiplication, division, modulo, casts of _BitInt to float/dfp) when it sees default definition of an SSA_NAME which is not PARM_DECL (i.e. uninitialized one) just allocates single uninitialized limb, there is no need to waste more memory on it, it can just tell libgcc that it has 64-bit precision, not say 1024 bit etc. Unfortunately, doing this runs into some asserts when we have a narrowing cast of the uninitialized SSA_NAME (but still large/huge _BitInt). The following patch fixes that by using a magic value in *prec_stored for the uninitialized cases (0) and just don't do any *prec tweaks for narrowing casts from that. precs still needs to be maintained as before, that one is used for big endian adjustment. 2025-08-06 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/121127 * gimple-lower-bitint.cc (bitint_large_huge::handle_operand_addr): For uninitialized SSA_NAME, set *prec_stored to 0 rather than *prec. Handle that case in narrowing casts. If prec_stored is non-NULL, set *prec_stored to prec_stored_val. * gcc.dg/bitint-125.c: New test.
2025-08-06fortran: cleanup duplicate tests for c_f_pointer_shape_driverYuao Ma5-94/+49
tests_2_driver and tests_4_driver are identical, and tests_4_driver is not used at all. This patch clean this up, and format the driver with gcc style. gcc/testsuite/ChangeLog: * gfortran.dg/c_f_pointer_shape_tests_2.f03: Use the new driver. * gfortran.dg/c_f_pointer_shape_tests_4.f03: Ditto. * gfortran.dg/c_f_pointer_shape_tests_4_driver.c: Removed. * gfortran.dg/c_f_pointer_shape_tests_2_driver.c: Renamed to ... * gfortran.dg/c_f_pointer_shape_tests_driver.c: ... this; format with gcc style.
2025-08-06c++: Add test for vt/ff in line commentsJakub Jelinek2-0/+24
P2843R3 dropped the "If there is a form-feed or a vertical-tab character in such a comment, only whitespace characters shall appear between it and the new-line that terminates the comment; no diagnostic is required." sentence from [lex.comment]. AFAIK we've never diagnosed nor checked for that and C23 doesn't have anything like that, so the following testcase merely tests that we don't diagnose anything on it. 2025-08-06 Jakub Jelinek <jakub@redhat.com> PR preprocessor/120778 * c-c++-common/cpp/comment-ff-1.c: New test. * c-c++-common/cpp/comment-vtab-1.c: New test.
2025-08-06c: Fix ICE on invalid code involving bit fields [PR121217]Martin Uecker1-0/+19
Under some error condition we can end up with NULL_TREEs for the type of bitfields, which can cause an ICE when testing for type compatibility. Add the missing check. PR c/121217 gcc/c/ChangeLog: * c-typeck.cc (tagged_types_tu_compatible_p): Add check. gcc/testsuite/ChangeLog: * gcc.dg/pr121217.c: New test.
2025-08-06RISC-V: Support -march=unsetKito Cheng5-0/+35
This patch introduces a new `-march=unset` option for RISC-V GCC that allows users to explicitly ignore previous `-march` options and derive the architecture string from the `-mcpu` option instead. This feature is particularly useful for build systems and toolchain configurations where you want to ensure the architecture is always derived from the CPU specification rather than relying on potentially conflicting `-march` options. gcc/ChangeLog: * common/config/riscv/riscv-common.cc (riscv_expand_arch): Ignore `unset`. * config/riscv/riscv.h (OPTION_DEFAULT_SPECS): Handle `-march=unset`. (ARCH_UNSET_CLEANUP_SPECS): New. (DRIVER_SELF_SPECS): Handle -march=unset. * doc/invoke.texi (RISC-V Options): Update documentation for `-march=unset`. gcc/testsuite/ChangeLog: * gcc.target/riscv/arch-unset-1.c: New test. * gcc.target/riscv/arch-unset-2.c: New test. * gcc.target/riscv/arch-unset-3.c: New test. * gcc.target/riscv/arch-unset-4.c: New test. * gcc.target/riscv/arch-unset-5.c: New test.
2025-08-06openmp: Add support for iterators in 'target update' clauses (C/C++)Kwok Cheung Yeung3-0/+61
This adds support for iterators in 'to' and 'from' clauses in the 'target update' OpenMP directive. gcc/c/ * c-parser.cc (c_parser_omp_clause_from_to): Parse 'iterator' modifier. * c-typeck.cc (c_finish_omp_clauses): Finish iterators for to/from clauses. gcc/cp/ * parser.cc (cp_parser_omp_clause_from_to): Parse 'iterator' modifier. * semantics.cc (finish_omp_clauses): Finish iterators for to/from clauses. gcc/ * gimplify.cc (remove_unused_omp_iterator_vars): Display unused variable warning for 'to' and 'from' clauses. (gimplify_scan_omp_clauses): Add argument for iterator loop sequence. Gimplify the clause decl and size into the iterator loop if iterators are used. (gimplify_omp_workshare): Add argument for iterator loops sequence in call to gimplify_scan_omp_clauses. (gimplify_omp_target_update): Call remove_unused_omp_iterator_vars and build_omp_iterators_loops. Add loop sequence as argument when calling gimplify_scan_omp_clauses, gimplify_adjust_omp_clauses and building the Gimple statement. * tree-pretty-print.cc (dump_omp_clause): Call dump_omp_iterators for to/from clauses with iterators. * tree.cc (omp_clause_num_ops): Add extra operand for OMP_CLAUSE_FROM and OMP_CLAUSE_TO. * tree.h (OMP_CLAUSE_HAS_ITERATORS): Add check for OMP_CLAUSE_TO and OMP_CLAUSE_FROM. (OMP_CLAUSE_ITERATORS): Likewise. gcc/testsuite/ * c-c++-common/gomp/target-update-iterators-1.c: New. * c-c++-common/gomp/target-update-iterators-2.c: New. * c-c++-common/gomp/target-update-iterators-3.c: New. libgomp/ * target.c (gomp_update): Call gomp_merge_iterator_maps. Free allocated variables. * testsuite/libgomp.c-c++-common/target-update-iterators-1.c: New. * testsuite/libgomp.c-c++-common/target-update-iterators-2.c: New. * testsuite/libgomp.c-c++-common/target-update-iterators-3.c: New.
2025-08-06openmp: Add support for iterators in map clauses (C/C++)Kwok Cheung Yeung5-10/+115
This adds preliminary support for iterators in map clauses within OpenMP 'target' constructs (which includes constructs such as 'target enter data'). Iterators with non-constant loop bounds are not currently supported. gcc/c/ * c-parser.cc (c_parser_omp_variable_list): Use location of the map expression as the clause location. (c_parser_omp_clause_map): Parse 'iterator' modifier. * c-typeck.cc (c_finish_omp_clauses): Finish iterators. Apply iterators to generated clauses. gcc/cp/ * parser.cc (cp_parser_omp_clause_map): Parse 'iterator' modifier. * semantics.cc (finish_omp_clauses): Finish iterators. Apply iterators to generated clauses. gcc/ * gimple-pretty-print.cc (dump_gimple_omp_target): Print expanded iterator loops. * gimple.cc (gimple_build_omp_target): Add argument for iterator loops sequence. Initialize iterator loops field. * gimple.def (GIMPLE_OMP_TARGET): Set GSS symbol to GSS_OMP_TARGET. * gimple.h (gomp_target): Set GSS symbol to GSS_OMP_TARGET. Add extra field for iterator loops. (gimple_build_omp_target): Add argument for iterator loops sequence. (gimple_omp_target_iterator_loops): New. (gimple_omp_target_iterator_loops_ptr): New. (gimple_omp_target_set_iterator_loops): New. * gimplify.cc (find_var_decl): New. (copy_omp_iterator): New. (remap_omp_iterator_var_1): New. (remap_omp_iterator_var): New. (remove_unused_omp_iterator_vars): New. (struct iterator_loop_info_t): New type. (iterator_loop_info_map_t): New type. (build_omp_iterators_loops): New. (enter_omp_iterator_loop_context_1): New. (enter_omp_iterator_loop_context): New. (enter_omp_iterator_loop_context): New. (exit_omp_iterator_loop_context): New. (gimplify_adjust_omp_clauses): Add argument for iterator loop sequence. Gimplify the clause decl and size into the iterator loop if iterators are used. (gimplify_omp_workshare): Call remove_unused_omp_iterator_vars and build_omp_iterators_loops for OpenMP target expressions. Add loop sequence as argument when calling gimplify_adjust_omp_clauses and building the Gimple statement. * gimplify.h (enter_omp_iterator_loop_context): New prototype. (exit_omp_iterator_loop_context): New prototype. * gsstruct.def (GSS_OMP_TARGET): New. * omp-low.cc (lower_omp_map_iterator_expr): New. (lower_omp_map_iterator_size): New. (finish_omp_map_iterators): New. (lower_omp_target): Add sorry if iterators used with deep mapping. Call lower_omp_map_iterator_expr before assigning to sender ref. Call lower_omp_map_iterator_size before setting the size. Insert iterator loop sequence before the statements for the target clause. * tree-nested.cc (convert_nonlocal_reference_stmt): Walk the iterator loop sequence of OpenMP target statements. (convert_local_reference_stmt): Likewise. (convert_tramp_reference_stmt): Likewise. * tree-pretty-print.cc (dump_omp_iterators): Dump extra iterator information if present. (dump_omp_clause): Call dump_omp_iterators for iterators in map clauses. * tree.cc (omp_clause_num_ops): Add operand for OMP_CLAUSE_MAP. (walk_tree_1): Do not walk last operand of OMP_CLAUSE_MAP. * tree.h (OMP_CLAUSE_HAS_ITERATORS): New. (OMP_CLAUSE_ITERATORS): New. gcc/testsuite/ * c-c++-common/gomp/map-6.c (foo): Amend expected error message. * c-c++-common/gomp/target-map-iterators-1.c: New. * c-c++-common/gomp/target-map-iterators-2.c: New. * c-c++-common/gomp/target-map-iterators-3.c: New. * c-c++-common/gomp/target-map-iterators-4.c: New. libgomp/ * target.c (kind_to_name): New. (gomp_merge_iterator_maps): New. (gomp_map_vars_internal): Call gomp_merge_iterator_maps. Copy address of only the first iteration to target vars. Free allocated variables. * testsuite/libgomp.c-c++-common/target-map-iterators-1.c: New. * testsuite/libgomp.c-c++-common/target-map-iterators-2.c: New. * testsuite/libgomp.c-c++-common/target-map-iterators-3.c: New. Co-authored-by: Andrew Stubbs <ams@baylibre.com>
2025-08-05Fortran: Fix runtime bogus diagnostic with ';'Jerry DeLisle1-0/+28
PR libfortran/121234 libgfortran/ChangeLog: * io/list_read.c (read_character): Add checks to bypass eating semicolons when reading strings with decimal mode 'point' (list_formatted_read_scalar): Likewise. gcc/testsuite/ChangeLog: * gfortran.dg/pr121234.f90: New test.
2025-08-06Daily bump.GCC Administrator1-0/+555
2025-08-05c++: clobber object on placement new [PR121068]Jason Merrill1-0/+43
My r16-2432 patch addressed the original testcase involving an array of scalars, but not this additional testcase involving an array of classes. This patch addresses the issue more thoroughly, by having placement new first clobber the new object, and improving cxx_eval_store_expression to implement initial clobbers as well. My earlier attempt to do this clobbered the array as a whole, which broke construct_at after the resolution of LWG3436 due to trying to create a multidimensional array over the top of a single-dimensional array. To side-step that issue, this patch instead clobbers the individual elements of an array, taking advantage of the earlier change to let that activate the array member of a union. PR c++/121068 gcc/cp/ChangeLog: * constexpr.cc (cxx_eval_store_expression): Handle clobbers. (potential_constant_expression_1): Handle clobbers more. * decl.cc (build_clobber_this): Use INIT_EXPR for initial clobber. * init.cc (build_new_1): Clobber on placement new. (build_vec_init): Don't clean up after clobber. gcc/testsuite/ChangeLog: * g++.dg/cpp26/constexpr-new5.C: New test.
2025-08-05fortran: Remove span overwrite with pointer assignmentsMikael Morin1-0/+25
Remove an overwrite of the array descriptor span field when pointer- assigning from a polymorphic function result to a non-polymorphic pointer. That overwrite doesn't make sense because the span is determined by the memory layout of the array; we can't change it without also changing the data pointer. gcc/fortran/ChangeLog: * trans-expr.cc (gfc_trans_pointer_assignment): Remove overwrite of the span after assignment of the array descriptor in the polymorphic function result to non-polymorphic pointer case. gcc/testsuite/ChangeLog: * gfortran.dg/pointer_assign_16.f90: New test.
2025-08-05x86: Get the widest vector mode from STORE_MAX_PIECES for memsetH.J. Lu1-0/+11
commit 050b1708ea532ea4840e97d85fad4ca63d4cd631 Author: H.J. Lu <hjl.tools@gmail.com> Date: Thu Jun 19 05:03:48 2025 +0800 x86: Get the widest vector mode from MOVE_MAX gets the widest vector mode from MOVE_MAX. But for memset, it should use STORE_MAX_PIECES. gcc/ PR target/121410 * config/i386/i386-expand.cc (ix86_expand_set_or_cpymem): Use STORE_MAX_PIECES to get the widest vector mode in vector loop for memset. gcc/testsuite/ PR target/121410 * gcc.target/i386/pr121410.c: New test. Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2025-08-05gccrs: offset_of: Compile the offset properlyArthur Cohen1-0/+16
gcc/rust/ChangeLog: * backend/rust-compile-expr.cc (CompileExpr::visit): Add proper handling of the node. * rust-backend.h (lookup_field): Declare it. * rust-gcc.cc (lookup_field): Add forked implementation from gcc/c/. gcc/testsuite/ChangeLog: * rust/execute/torture/offset_of1.rs: New test.
2025-08-05gccrs: Add test case showing method resolution with const-genericsPhilip Herron1-0/+24
gcc/testsuite/ChangeLog: * rust/execute/torture/const-generics-1.rs: New test. Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2025-08-05gccrs: Remove more calls to the old TyTy::BaseType::can_eq interfacePhilip Herron1-1/+1
This old can_eq interface was an old method to try and check if types can match up by taking into account generics but its not maintained properly and we already have a new wrapper Resolver::types_compatable (type, type, locus, emit_errors) which just calls unify_site_and infer with commit false. There are only a few places left to update. One minor downside is that i need to remove const in some places because the unify interface is non const. Ideally we would want to avoid writing a seperate const unify anyway so i think this is not ideal but fine for us. gcc/rust/ChangeLog: * typecheck/rust-autoderef.cc: remove useless assertion * typecheck/rust-coercion.cc (TypeCoercionRules::coerce_unsafe_ptr): refactor (TypeCoercionRules::coerce_borrowed_pointer): remove FIXME this is fine * typecheck/rust-hir-inherent-impl-overlap.h: use types_compatable * typecheck/rust-hir-path-probe.cc (PathProbeType::PathProbeType): remove const (PathProbeType::Probe): likewise (PathProbeImplTrait::PathProbeImplTrait): likewise (PathProbeImplTrait::Probe): likewise * typecheck/rust-hir-path-probe.h: likewise * typecheck/rust-hir-type-check-base.cc (walk_types_to_constrain): likewise * typecheck/rust-hir-type-check-base.h: likewise * typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): use types_compatable * typecheck/rust-hir-type-check.h: remove const * typecheck/rust-typecheck-context.cc (TypeCheckContext::insert_associated_impl_mapping): likewise (TypeCheckContext::lookup_associated_impl_mapping_for_self): remove can_Eq * typecheck/rust-tyty-bounds.cc (TypeBoundPredicate::is_equal): likewise * typecheck/rust-tyty-subst.cc (SubstitutionArg::get_tyty): remove const version * typecheck/rust-tyty-subst.h: likewise * typecheck/rust-tyty.cc (BaseType::get_root): likewise * typecheck/rust-tyty.h: likewise gcc/testsuite/ChangeLog: * rust/compile/generics8.rs: extra error message Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2025-08-05gccrs: Fix ICE when extra const arguments suppliedPhilip Herron1-0/+16
The substitution code was not taking into account the const generic arguments for checking the max bounds of total available parameters. Fixes Rust-GCC#3546 gcc/rust/ChangeLog: * typecheck/rust-tyty-subst.cc: fix check for total arguments gcc/testsuite/ChangeLog: * rust/compile/issue-3546.rs: New test. Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2025-08-05gccrs: Support const generic inference variablesPhilip Herron1-0/+7
We already support const infer so this just creates a fresh tyty::infer_var for the const element type and then a ConstKind::Infer type for the const type wrapper and the existing plumbing handles this. Fixes Rust-GCC#3885 gcc/rust/ChangeLog: * typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): create infer variable gcc/testsuite/ChangeLog: * rust/compile/issue-3885.rs: New test. Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2025-08-05gccrs: Add initial support for const genericsPhilip Herron11-21/+138
In order to support const generics we map the declarations to a ConstType this means we reuse all our existing type coercion, unification code and generic substitutions code to support this with minimal impact. This patch adds support for: 1. Default const generics 2. Infer const generics 3. ADTType suport 4. unconstrained checks 5. ensure types of the const generic and default 6. validation if passing a const argument to a type argument Lots of test cases now work and new ones added. More work is needed to support this on functions and method resolution of impls like Foo<1> vs Foo<2> once thats in we can look to support some of the const generic array impls next. gcc/rust/ChangeLog: * backend/rust-compile-base.cc: useful debug * backend/rust-compile-stmt.cc (CompileStmt::visit): likewise * backend/rust-compile-type.cc (TyTyResolveCompile::visit): fold the capacity into ConstType * hir/tree/rust-hir-generic-param.h: make const * hir/tree/rust-hir-path.h: take into account const arguments now * typecheck/rust-hir-type-check-base.cc (TypeCheckBase::resolve_literal): needs const * typecheck/rust-hir-type-check-base.h: add error handling for const supported locations * typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): const type the arrays * typecheck/rust-hir-type-check-implitem.cc (TypeCheckTopLevelExternItem::visit): update (TypeCheckImplItem::visit): likewise * typecheck/rust-hir-type-check-item.cc (TypeCheckItem::visit): likewise (TypeCheckItem::resolve_impl_block_substitutions): likewise * typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit): wrap up const type * typecheck/rust-hir-type-check-type.cc (TypeCheckType::visit): likewise (TypeResolveGenericParam::visit): likewise (TypeResolveGenericParam::apply_trait_bounds): remove HIR::Generic from Param * typecheck/rust-hir-type-check.cc (TraitItemReference::get_type_from_fn): cleanup * typecheck/rust-tyty-subst.cc (SubstitutionParamMapping::SubstitutionParamMapping): handle const generics (SubstitutionParamMapping::get_type_representation): likewise (SubstitutionParamMapping::param_has_default_ty): likewise (SubstitutionParamMapping::get_default_ty): likewise (SubstitutionRef::infer_substitions): likewise * typecheck/rust-tyty-subst.h: likewise * typecheck/rust-tyty-util.cc (TyVar::get_implicit_const_infer_var): new helper * typecheck/rust-tyty-util.h (class ConstType): likewise * typecheck/rust-tyty.cc (BaseType::is_concrete): check for array const concrete (ArrayType::as_string): update to const (ArrayType::handle_substitions): likewise (ParamType::ParamType): likewise (ParamType::get_generic_param): likewise (ParamType::clone): likewise (ConstType::ConstType): likewise (ConstType::set_value): likewise (ConstType::clone): likewise (ConstType::get_generic_param): likewise (generate_tree_str): new helper to pretty print gimple (ConstType::get_name): uses the generate_tree_str (ConstType::handle_substitions): handle const infer's * typecheck/rust-tyty.h (RUST_TYTY): likewise * typecheck/rust-unify.cc (UnifyRules::expect_array): likewise (UnifyRules::expect_const): likewise gcc/testsuite/ChangeLog: * rust/compile/const_generics_3.rs: this works now * rust/compile/const_generics_5.rs: likewise * rust/compile/const_generics_8.rs: move the failure to another test case * rust/compile/const_generics_10.rs: New test. * rust/compile/const_generics_11.rs: New test. * rust/compile/const_generics_12.rs: New test. * rust/compile/const_generics_13.rs: New test. * rust/compile/const_generics_14.rs: New test. * rust/compile/const_generics_15.rs: New test. * rust/compile/const_generics_16.rs: New test. * rust/compile/const_generics_9.rs: New test. Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2025-08-05gccrs: Fix ICE during const eval of const capacityPhilip Herron1-0/+7
We assert that struct expressions during code-gen must be of TyTy::ADTType but we can simply just check for this and return error_mark_node to make this safe. Fixes Rust-GCC#3960 gcc/rust/ChangeLog: * backend/rust-compile-expr.cc (CompileExpr::visit): check for ADTType instead of assert gcc/testsuite/ChangeLog: * rust/compile/issue-3960.rs: New test. Signed-off-by: Philip Herron <herron.philip@googlemail.com>
2025-08-05gccrs: Remove warning for unused `self` parameterRyutaro Okada23-26/+9
gcc/testsuite/ChangeLog: * rust/compile/auto_traits2.rs: emove warning for unused `self` parameter * rust/compile/derive-debug1.rs: emove warning for unused `self` parameter * rust/compile/derive_macro1.rs: Remove warning for unused `self` parameter * rust/compile/format_args_basic_expansion.rs: Remove warning for unused `self` parameter * rust/compile/format_args_extra_comma.rs: Remove warning for unused `self` parameter * rust/compile/issue-2043.rs: Remove warning for unused `self` parameter * rust/compile/issue-2166.rs: Remove warning for unused `self` parameter * rust/compile/issue-2238.rs: Remove warning for unused `self` parameter * rust/compile/issue-2907.rs: Remove warning for unused `self` parameter * rust/compile/min_specialization1.rs: Remove warning for unused `self` parameter * rust/compile/name_resolution2.rs: Remove warning for unused `self` parameter * rust/compile/name_resolution4.rs: Remove warning for unused `self` parameter * rust/compile/torture/generics29.rs: Remove warning for unused `self` parameter * rust/compile/torture/generics30.rs: Remove warning for unused `self` parameter * rust/compile/torture/traits3.rs: Remove warning for unused `self` parameter * rust/compile/torture/traits7.rs: Remove warning for unused `self` parameter * rust/execute/torture/impl_trait3.rs: Remove warning for unused `self` parameter * rust/execute/torture/min_specialization2.rs: Remove warning for unused `self` parameter * rust/execute/torture/trait10.rs: Remove warning for unused `self` parameter * rust/execute/torture/trait11.rs: Remove warning for unused `self` parameter * rust/execute/torture/trait12.rs: Remove warning for unused `self` parameter * rust/execute/torture/trait13.rs: Remove warning for unused `self` parameter * rust/execute/torture/trait9.rs: Remove warning for unused `self` parameter Signed-off-by: Ryutaro Okada <1015ryu88@gmail.com>
2025-08-05gccrs: desugar: Add base for desugaring while-let loopsArthur Cohen1-0/+109
gcc/rust/ChangeLog: * Make-lang.in: * ast/rust-expression-yeast.cc (ExpressionYeast::dispatch_loops): Call DesugarWhileLet. * ast/rust-desugar-while-let.cc: New file. * ast/rust-desugar-while-let.h: New file. gcc/testsuite/ChangeLog: * rust/compile/while_let1.rs: New test.
2025-08-05gccrs: hir: Add OffsetOf nodeArthur Cohen1-0/+9
gcc/rust/ChangeLog: * hir/tree/rust-hir-expr.h (class OffsetOf): New. * hir/tree/rust-hir-expr.cc: Define its methods. * hir/tree/rust-hir-expr-abstract.h: Add ExprType::OffsetOf. * hir/tree/rust-hir-full-decls.h (class OffsetOf): Declare it. * backend/rust-compile-block.h: Add handling for OffsetOf. * backend/rust-compile-expr.cc (CompileExpr::visit): Likewise. * backend/rust-compile-expr.h: Likewise. * checks/errors/borrowck/rust-bir-builder-expr-stmt.cc (ExprStmtBuilder::visit): Likewise. * checks/errors/borrowck/rust-bir-builder-expr-stmt.h (RUST_BIR_BUILDER_EXPR_H): Likewise. * checks/errors/borrowck/rust-bir-builder-lazyboolexpr.h: Likewise. * checks/errors/borrowck/rust-bir-builder-struct.h: Likewise. * checks/errors/borrowck/rust-function-collector.h: Likewise. * checks/errors/privacy/rust-privacy-reporter.cc (PrivacyReporter::visit): Likewise. * checks/errors/privacy/rust-privacy-reporter.h (RUST_PRIVACY_REPORTER_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-expr.cc (ASTLoweringExpr::visit): Likewise. * hir/rust-hir-dump.cc (Dump::visit): Likewise. * hir/rust-hir-dump.h: Likewise. * hir/tree/rust-hir-visitor.cc (DefaultHIRVisitor::walk): Likewise. * hir/tree/rust-hir-visitor.h: Likewise. * typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): Likewise. * typecheck/rust-hir-type-check-expr.h (RUST_HIR_TYPE_CHECK_EXPR): Likewise. gcc/testsuite/ChangeLog: * rust/compile/offset_of2.rs: New test.