Jakub Jelinek [Fri, 10 Apr 2026 16:49:00 +0000 (18:49 +0200)]
c++: Include anon enum types in namespace members_of [PR124831]
As the testcase shows, we have similar problem with namespace scope
anonymous enums like we have with namespace scope anonymous unions.
Because they are anonymous, in neither case we emit anything into the
namespace bindings but we should still list those.
Now, for anonymous union this is done by adding it (once only) when
seeing corresponding DECL_ANON_UNION_VAR_P (and it doesn't work when there
is anon union without any members but that is a pedwarn anyway).
The following patch handles it similarly for anon enums, namespace scope
enum {}; is still ignored (but that is a pedwarn as well, so not a big deal)
and when there is at least one enumerator in it, we add it when seeing
the CONST_DECL (but again, just once for the whole members_of call).
2026-04-10 Jakub Jelinek <jakub@redhat.com>
PR c++/124831
* reflect.cc (namespace_members_of): Append reflection of anon unions
when we see it first time as CP_DECL_CONTEXT of some CONST_DECL in
the namespace.
fortran: Avoid bogus do-subscript warnings in skipped inner loops [PR94978]
Do not warn from an outer-loop bound substitution when a nested inner loop may
be zero-trip after that substitution, because the guarded array reference may
then be unreachable.
gcc/fortran/ChangeLog:
PR fortran/94978
* frontend-passes.cc (evaluate_loop_bound): New helper.
(inner_loop_may_be_skipped): New helper.
(do_subscript): Skip outer-loop bound warnings when nested inner loops
may be zero-trip for the substituted bound.
gcc/testsuite/ChangeLog:
PR fortran/94978
* gfortran.dg/pr94978.f90: New test.
Signed-off-by: Christopher Albert <albert@tugraz.at>
A few years ago Martin moved for unknown reasons -Winvalid-memory-model
diagnostics from expansion to the gimple-ssa-warn-access middle end warning
black hole.
A recent change limited the second instance of the pass to only a small
subset of warnings.
This regressed diagnostics of -Winvalid-memory-model with -fsanitize=thread,
because invalid cases are not warned about anymore during waccess2 and
during waccess3 we've already transformed those builtins into corresponding
tsan builtins.
The following patch fixes that regression by handling the tsan atomic
builtins as well. While doing that, I've also fixed formatting and noticed
other bogosities in the code, e.g. existance of xchg_models. No idea
where Martin got that from, neither C11, nor C23, nor various versions of
C++ nor GCC documentation have any restrictions on what memory models can be
used for atomic_exchange_explicit, so why is it trying to prevent
__ATOMIC_ACQUIRE?
And incorrectly so, __atomic_exchange_N has 3 arguments, and suc_arg is 0
based, so setting it to 3 meant it didn't check anything because the 4th
argument doesn't exist. So fixed to use all_models with the correct arg
index.
Besides this, there is another problem that we fold some atomic builtins
into IFN_ATOMIC* internal functions. That isn't a 16 Regression though,
could be fixed by also diagnosing this stuff for the IFN_ATOMIC_* calls,
but I'm not doing it right now because there is yet another problem.
C++17 in https://wg21.link/p0418r2 dropped some of the restrictions, in
particular that for the compare and exchange cases failure mode can't be
stronger than success mode. So I'm hesistant to add further warnings for
16 (beyond just fixing the -fsanitize=thread inconsistency), unsure if
we should somehow mark the atomic builtins from the C++ <atomic> APIs
that the no stronger checking shouldn't be done for those, or simply
mark those for all of C++17 and later, something else?
C23/C2Y I think still require it and it is reasonable requirement,
2026-04-10 <jakub@redhat.com>
PR middle-end/124827
* gimple-ssa-warn-access.cc (xchg_models): Remove.
(pass_waccess::check_atomic_builtin): Fix up sucs_arg for
BUILT_IN_ATOMIC_EXCHAGE_* and use all_models instead of xchg_models.
Handle BUILT_IN_TSAN_ATOMIC*. Formatting fixes.
Jakub Jelinek [Fri, 10 Apr 2026 07:47:36 +0000 (09:47 +0200)]
testsuite: Fix up g++.dg/lto/20091022-2_0.C test [PR124828]
From what I can see, this test was added for PR41791 where we didn't stream
in/out the system header flags for LTO. The test isn't perfect, because
even when we actually do stream those flags, whether it fails or not depends
on the exact decisions of the inliner whether it decides to inline all
inline/constexpr functions or not (maybe it would help to use some
--params to request inlining as few functions as possible).
Anyway, guess at some point we simply started to inline everything that was
used and so whether the test stopped failing even if it would use
-Wsystem-headers. Now, when not using installed gcc testing, we use
libstdc++-v3/scripts/testsuite_flags script which uses -I options rather
than -isystem, but the headers still had #pragma GCC system_header pragmas.
Except that r15-3859 guarded those pragmas with a macro which isn't defined
by default and needs to be defined only when we want to make sure the
headers are treated as system headers.
And later on the recent changes for C++20 stable string exports started
seeing a constexpr (thus implicitly inline for -Winline purposes) being too
large for default inlining and so the test started to fail again.
The following patch fixes it by making sure the libstdc++ headers are
treated as system headers, so the test tests again what it was supposed to
test.
2026-04-10 Jakub Jelinek <jakub@redhat.com>
PR lto/124828
* g++.dg/lto/20091022-2_0.C (_GLIBCXX_SYSHDR): Define before including
<string>.
Jakub Jelinek [Fri, 10 Apr 2026 06:46:16 +0000 (08:46 +0200)]
c++: Unshare expr in get_template_parm_object [PR124792]
The following testcase is miscompiled due to incorrect CONSTRUCTOR sharing.
For reflect_constant_array elts which aren't integral we call
convert_reflect_constant_arg (but reflect_constant etc. do the same) and
that eventually indirectly calls get_template_parm_object which creates
the TPO VAR_DECL with DECL_INITIAL. Unfortunately, some CONSTRUCTORs
in that DECL_INITIAL can be shared with whatever we use during constant
expression evaluation later on, so when we evaluate ~vector, we modify
those and with that modify also the CONSTRUCTORs inside of TPO
DECL_INITIAL CONSTRUCTOR.
So we need to unshare it somewhere.
This patch unshares in get_template_parm_object, i.e. the lowest level,
and only when not reusing previously created TPO.
2026-04-10 Jakub Jelinek <jakub@redhat.com>
PR c++/124792
* pt.cc (get_template_parm_object): Call unshare_expr_without_location
on expr if check_init.
Tomasz Kamiński [Thu, 9 Apr 2026 14:54:10 +0000 (16:54 +0200)]
libstdc++: Add default template parameters for uninitialized_fill(_n).
This implements P3217R0 and adds default argument for the value type
templater parameter for uninitialized_fill, uninitialized_fill_n and
their ranges counterpart.
libstdc++-v3/ChangeLog:
* include/bits/ranges_uninitialized.h
(__uninitialized_fill_fn::operator())
(__uninitialized_fill_fn_n::operator()): Add default argument
for _Tp parameter.
* include/bits/stl_uninitialized.h (std::unitialized_fill)
(std::unitialized_fill_n): Likewise.
* include/pstl/glue_memory_defs.h (std::unitialized_fill)
(std::unitialized_fill_n): Likewise.
* include/bits/version.def (algorithm_default_value_type):
Bump to 202603.
* include/bits/version.h: Regenerate.
* testsuite/25_algorithms/default_template_value.cc:
Test for new algorithms.
Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
RISC-V: Update RVV intrinsic version to ratified v1.0
The RVV intrinsic implementation already matches the ratified v1.0
interface, but GCC still advertises __riscv_v_intrinsic as v0.12 and
the manual still points users at the stale v0.11.x documentation.
Update __riscv_v_intrinsic to v1.0, adjust the related tests, and
update the manual to say that GCC supports the ratified v1.0 RVV
intrinsic specification and point at the v1.0-ratified release.
gcc/ChangeLog:
* config/riscv/riscv-c.cc (riscv_cpu_cpp_builtins): Set
__riscv_v_intrinsic to v1.0.
* doc/extend.texi (RISC-V Vector Intrinsics): Document the
ratified v1.0 RVV intrinsic specification and update the link.
gcc/testsuite/ChangeLog:
* gcc.target/riscv/predef-__riscv_v_intrinsic.c: Update expected
__riscv_v_intrinsic value.
* gcc.target/riscv/rvv/base/pr114017-1.c: Update version check and
expected warning text to v1.0.
Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu>
We check this in cp_parser_splice_expression. But when the splice
is dependent, we don't check it when instantiating, thus missing
the error in
template [: N == 0 ? ^^foo : ^^:: :] (0);
This patch introduces SPLICE_EXPR_TEMPLATE_P and SPLICE_EXPR_TARGS_P,
and moves the checking into check_splice_expr. It also adds a missing
check for DECL_TYPE_TEMPLATE_P in case we have a splice-expression of
the form template splice-specialization-specifier.
PR c++/123998
gcc/cp/ChangeLog:
* cp-tree.h (SPLICE_EXPR_TEMPLATE_P): Define.
(SET_SPLICE_EXPR_TEMPLATE_P): Define.
(SPLICE_EXPR_TARGS_P): Define.
(SET_SPLICE_EXPR_TARGS_P): Define.
(check_splice_expr): Adjust.
* parser.cc (cp_parser_splice_expression): Do
SET_SPLICE_EXPR_TEMPLATE_P and SET_SPLICE_EXPR_TARGS_P. Adjust
the call to check_splice_expr. Move the template_p checking into
check_splice_expr.
* pt.cc (tsubst_splice_expr): Do SET_SPLICE_EXPR_TEMPLATE_P and
SET_SPLICE_EXPR_TARGS_P. Adjust the call to check_splice_expr.
* reflect.cc (eval_constant_of): Adjust the call to
check_splice_expr.
(check_splice_expr): Two new bool parameters. Add the template_p
checking from cp_parser_splice_expression. Allow
variable_template_p in the assert. Add a check for
DECL_TYPE_TEMPLATE_P.
fortran: Diagnose invalid array initializer after parameter substitution [PR103367]
Keep the trunk fallback from r16-8509, but turn it into a real
constant-expression error instead of silently returning an empty
constructor. This avoids the ICE from PR103367 without regressing
the more specific diagnostics discussed in the Bugzilla follow-up.
PR fortran/103367
gcc/fortran/ChangeLog:
* trans-array.cc (gfc_conv_array_initializer): Emit an error for
invalid residual initializer expressions before returning a safe
empty constructor.
gcc/testsuite/ChangeLog:
* gfortran.dg/pr103367.f90: Expect a constant-expression error and
prune the legacy-extension warning.
Signed-off-by: Christopher Albert <albert@tugraz.at>
testsuite: arm: xfail test unless SP and DP FP [PR113276]
gcc/testsuite/ChangeLog:
PR testsuite/113276
* gcc.dg/torture/fp-double-convert-float-1.c: Xfail test for arm*
unless single- and double-precision FP.
* lib/target-supports.exp (check_effective_target_arm_mixed_fp):
New function.
Alex Coplan [Fri, 27 Mar 2026 16:54:24 +0000 (16:54 +0000)]
aarch64: Add some missing dependencies to t-aarch64 [PR122483]
A subsequent patch adds a new target hook; I noticed while testing an
incremental build that some aarch64 object files which invoke target
hooks are missing dependencies on target.def. This patch fixes that by
adjusting the relevant object files to depend on TARGET_H instead of
TM_H; the former includes the latter but additionally depends on
target.def.
I verified that these changes fixed test failures (ICEs) in
aarch64-sme.exp seen due to the missed dependencies in an incremental
build with later patches.
gcc/ChangeLog:
PR target/122483
* config/aarch64/t-aarch64: Replace instances of TM_H with
TARGET_H where appropriate, add missing dependency on TARGET_H
for aarch64-early-ra.cc.
Dhruv Chawla [Thu, 12 Feb 2026 04:06:03 +0000 (04:06 +0000)]
aarch64: AutoFDO: Add support for ARM SPE to autoprofiledbootstrap
This patch adds support for ARM SPE as a profiler to gcc-auto-profile
and the corresponding detection required for passing the
--profiler=perf_spe option to create_gcov when creating the GCOV files.
The patch also modifies the create_gcov invocation to make sure that the
corresponding component's profile is actually included in the perf.data
file. This is because some of the profiles end up not including invocations of
one of cc1, cc1plus or lto1 and trying to use them to generate the GCOV with the
missing binary ends up failing the create_gcov command. This is expected and is
not an error condition.
* Makefile.in (AFDO_PROFILER): New variable.
(PERF): Likewise.
* config/aarch64/gcc-auto-profile: Detect and use ARM SPE events when
invoking perf record.
* configure: Regenerate.
* configure.ac: Detect whether build has perf utility available and
check for ARM SPE-based profiling support when building on AArch64.
gcc/c/ChangeLog:
* Make-lang.in (create_fdas_for_cc1): Use $(AFDO_PROFILER) when passing
--profiler to create_gcov. Ensure that perf.data contains profile for
cc1. Make the console output more useful.
gcc/cp/ChangeLog:
* Make-lang.in (create_fdas_for_cc1plus): Use $(AFDO_PROFILER) when
passing --profiler to create_gcov. Ensure that perf.data contains
profile for cc1plus. Make the console output more useful.
gcc/lto/ChangeLog:
* Make-lang.in (create_fdas_for_lto1): Use $(AFDO_PROFILER) when passing
--profiler to create_gcov. Ensure that perf.data contains profile for
lto1. Make the console output more useful.
gcc/testsuite/ChangeLog:
* lib/profopt.exp (profopt-execute): Add support for profiler type
detection.
Only Zbs provides the bseti/binvi support that can directly handle a
large single-bit immediate in scalar IOR/XOR operations. Zbkb alone
does not, but synthesize_ior_xor treated Zbkb as sufficient and
returned false for such constants.
On RV32 with -march=rv32gc_zbkb this leaves an unmatchable
(ior:SI reg (const_int 0x20000)) RTL insn, which later triggers an ICE
in extract_insn during virtual register instantiation.
Restrict the single-bit fast path to Zbs and add an RV32 Zbkb
regression test for the reduced reproducer.
PR target/124818
gcc/ChangeLog:
* config/riscv/riscv.cc (synthesize_ior_xor): Do not treat
TARGET_ZBKB as sufficient for single-bit immediate IOR/XOR.
gcc/testsuite/ChangeLog:
* gcc.target/riscv/pr124818.c: New test.
Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu>
Tamar Christina [Thu, 9 Apr 2026 08:27:15 +0000 (09:27 +0100)]
vect: replace vect_scalar_cost_multiplier with param_vect_allow_possibly_not_worthwhile_vectorizations
The parameter vect_scalar_cost_multiplier was added in order to make it possible
to apply a scaling factor to the cost of a scalar loop in order to make
vectorization more or less profitable.
However because of the way the costing currently works, increasing the cost of a
scalar loop does not always result in vectorization because in some cases when
the cost of vectorization is very low we switch to looking at only the cost of
the epilog and prologs.
One case where this fell apart was uncounted loops. As a result this patch
replaces the parameter with
param_vect_allow_possibly_not_worthwhile_vectorizations which just ignores the
result of costing.
Xi Ruoyao [Mon, 6 Apr 2026 20:03:09 +0000 (04:03 +0800)]
ifcvt: reject use of ctrap post reload [PR 105192]
The ctrap expanders of several targets can end up creating pseudos. And
it would be really counter-intuitive to disallow a define_expand to
generate pseudos. So don't invoke the expander post reload.
PR target/105192
gcc/
* ifcvt.cc (find_if_header): Don't attempt to use ctrap expander
after reload.
fortran: Fix false explicit-interface-required for ENTRY with volatile [PR96986]
When resolving a call to an ENTRY procedure, the entry lookup that
replaces the master procedure's def_sym with the specific entry symbol
was inside the 'resolved != -1' block. During recursive resolution the
namespace is marked resolved == -1, so the lookup was skipped and the
explicit interface check used the master procedure's combined formal
argument list instead of the entry's own formals.
Move the entry lookup after the resolution block so it runs regardless
of the namespace resolution state.
PR fortran/96986
gcc/fortran/ChangeLog:
* resolve.cc (resolve_global_procedure): Move entry symbol
lookup outside the resolved != -1 block.
gcc/testsuite/ChangeLog:
* gfortran.dg/pr96986.f90: New test.
Signed-off-by: Christopher Albert <albert@tugraz.at>
Marek Polacek [Wed, 18 Mar 2026 17:48:40 +0000 (13:48 -0400)]
c++/reflection: ICE with invalid splice in member access expr [PR123726]
This patch fixes a crash on invalid code. In a class member access
with a splice, the splice cannot designate something that is not
a member of the object we're accessing. check_splice_expr could also
detect more invalid splices, such as accessing a class template or
alias template member with . or ->.
PR c++/123726
gcc/cp/ChangeLog:
* reflect.cc (check_splice_expr): Detect accessing a class template
or alias template with . or ->.
* typeck.cc (finish_class_member_access_expr): Check if the scope of
the spliced entity in a member access expression is of a class type.
Allow variable_template_p for context_for_name_lookup.
gcc/testsuite/ChangeLog:
* g++.dg/reflect/member1.C: Adjust dg-error.
* g++.dg/reflect/member22.C: New test.
Co-authored-by: Boris Staletic <boris.staletic@protonmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
Marek Polacek [Tue, 31 Mar 2026 20:52:10 +0000 (16:52 -0400)]
c++/reflection: spurious error with constrained return types [PR124457]
Here we are emitting a bogus error in get_reflection because it
got something for which is_auto was true: the constrained auto
coming from make_constrained_auto. We represent the
return-type-requirement as a constrained auto which is in fact
a placeholder, but in this case we don't want the error.
We can move the error from get_reflection to the parser to avoid
emitting the error.
Marek Polacek [Wed, 18 Mar 2026 21:51:35 +0000 (17:51 -0400)]
c++/reflection: allow fns/arrays as annotation values [PR124177]
With an annotation like [[=func]] gcc ends up calling
handle_annotation_attribute with TREE_VALUE (args) being
a VIEW_CONVERT_EXPR, whose type is a FUNCTION_TYPE. That kind of
annotation value should be decayed before checking if the type is
structural.
PR c++/124177
gcc/cp/ChangeLog:
* tree.cc (handle_annotation_attribute): Decay annotation
values. Turn if !type_dependent_expression_p into an assert.
gcc/testsuite/ChangeLog:
* g++.dg/reflect/annotations18.C: New test.
Co-authored-by: Boris Staletic <boris.staletic@protonmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
and do get_reflection -> resolve_nondeduced_context for ^^visit<0>,
we should already have substituted F, otherwise we only substitute
I with 0 and are left with a partial specialization. F should have
been substituted in tsubst_expr/REFLECT_EXPR, but the reflection is
REFLECT_EXPR<TEMPLATE_ID_EXPR<OVERLOAD, 0>>
and tsubst_expr doesn't do much with an OVERLOAD. This thing should
be
so that we go to tsubst_baselink and properly substitute the
TEMPLATE_DECL in the OVERLOAD.
cp_parser_reflect_expression doesn't call finish_id_expression which
would add the BASELINK for reason mentioned in the comment there. So
I think we can do the following: just call baselink_for_fns to create
the BASELINK if needed.
Richard Biener [Wed, 8 Apr 2026 07:27:41 +0000 (09:27 +0200)]
tree-optimization/124810 - ICE with loop fixup
The following fixes fix_loop_placements to properly consider
re-parenting only outer loops of a nest.
PR tree-optimization/124810
* cfgloopmanip.cc (fix_loop_placements): Do not stop
iterating when an inner loop didn't get re-parented.
Compute the outermost loop we have to consider re-parenting.
Matthias Kretz [Tue, 11 Nov 2025 15:27:34 +0000 (16:27 +0100)]
libstdc++: Remove non_type and replace it with constant_wrapper in function_ref
This implements P3948R1: constant_wrapper is the only tool needed
for passing constant expressions via function arguments.
This changes function_ref from nontype_t to constant_wrapper and
implements the ambiguity check (static_asert in function_ref
from constant_wrapper constructor).
In addition to P3948R1 this also includes the (forgotten) deduction
guide changes suggested in the draft PR [1].
[1] https://github.com/cplusplus/draft/pull/8878
libstdc++-v3/ChangeLog:
* include/bits/funcref_impl.h (function_ref::function_ref):
Change nontype_t parameter to constant_wrapper, and adjust
accordingly. Add static_assert detecting ambigous semantics.
(function_ref::operator=): Detect constant_wrapper rather than
nontype_t.
* include/bits/funcwrap.h (function_ref): Change nontype_t
parameter to constant_wrapper in deduction guides.
* include/bits/utility.h (std::nontype_t, std::nontype)
(std::__is_nontype_v): Remove.
(std::__is_constant_wrapper_v): Define.
* src/c++23/std.cc.in (std::nontype_t, std::nontype):
Remove exports.
* testsuite/20_util/function_ref/cw_cons_neg.cc: New tests
for ambiguity check.
* testsuite/20_util/function_ref/assign.cc: Replace nontype_t
with constant_wrapper and nontype with std::cw.
* testsuite/20_util/function_ref/call.cc: Likewise.
* testsuite/20_util/function_ref/cons.cc: Likewise.
* testsuite/20_util/function_ref/cons_neg.cc: Likewise.
* testsuite/20_util/function_ref/dangling.cc: Likewise.
* testsuite/20_util/function_ref/deduction.cc: Likewise.
* testsuite/20_util/function_ref/mutation.cc: Likewise.
Co-authored-by: Tomasz Kamiński <tkaminsk@redhat.com> Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Matthias Kretz <m.kretz@gsi.de> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
fortran: Fix ICE in gfc_trans_auto_array_allocation with scalar coarray [PR93715]
A scalar coarray variable (e.g. integer :: b[*]) used in asynchronous
I/O causes an ICE in gfc_trans_auto_array_allocation because the
variable reaches gfc_trans_auto_array_allocation which asserts
GFC_ARRAY_TYPE_P on the backend declaration type. For scalar coarrays,
the backend type is a plain scalar, not a GFC array type.
The root cause is in gfc_trans_deferred_vars: scalar coarray variables
enter the AS_EXPLICIT case because sym->attr.codimension is set and the
coarray spec type is AS_EXPLICIT. The existing guard for static coarray
variables does not catch non-static scalar coarrays, so they fall
through to gfc_trans_auto_array_allocation.
Add a check for scalar coarrays (codimension without dimension) to skip
array allocation, since these variables have no array rank and do not
need auto array allocation.
2026-04-08 Paul Thomas <pault@gcc.gnu.org>
PR fortran/93715
gcc/fortran
* trans-decl.cc (gfc_trans_deferred_vars): Skip auto array
allocation for scalar coarrays.
gcc/testsuite
* gfortran.dg/pr93715.f90: New test.
Signed-off-by: Christopher Albert <albert@tugraz.at>
[auto-profile] Improve handling of timestamp merging.
The following condition:
if (other->timestamp() < timestamp())
set_timestamp (other->timetamp())
would set timestamp() to 0 if other->timestamp() was zero effectively
dropping the symbol from time-profile based reordering.
The patch fixes this by ensuring other->timestamp() is greater than zero.
Also, handles the case when timestamp() is zero but other->timestamp() is non-zero.
gcc/ChangeLog:
* auto-profile.cc (function_instance::merge): Set other->timestamp() if it's
lesser than timestamp() and greater than zero or if timestamp() is zero.
Jakub Jelinek [Wed, 8 Apr 2026 05:46:38 +0000 (07:46 +0200)]
c++: Implement CWG3135 - constexpr structured bindings with prvalues from tuples
The following patch implements another CWG issue, added e.g. for the
P1789R3 (Library Support for Expansion Statements) APIs where get returns
a prvalue rather than a reference.
While the issue has been voted as a non-DR, this implementation assumes it
will be changed to a DR. If that won't be the case, we will need to limit
the changes to C++26 and later only.
The gomp testcase was using get returning prvalue and the changes
cause some changes in lines on which stuff is reported.
2026-04-08 Jakub Jelinek <jakub@redhat.com>
* decl.cc (cp_finish_decomp): Implement CWG3135 - constexpr structured
bindings with prvalues from tuples (as a DR). Don't call
cp_build_reference_type if init is prvalue.
* g++.dg/cpp26/decomp30.C: New test.
* g++.dg/gomp/pr108503.C: Adjust expected diagnostic locations.
libphobos: Skip math.hardware unittests on targets without IEEE flags support [PR123202]
PR d/123202
libphobos/ChangeLog:
* testsuite/lib/libphobos.exp
(check_effective_target_phobos_ieee_flags_support): New proc.
* testsuite/libphobos.phobos/phobos.exp: Skip math/hardware.d tests if
target does not have phobos_iee_flags_support.
* testsuite/libphobos.phobos/shared/phobos-shared.exp: Likewise.
* testsuite/libphobos.phobos/static/phobos-static.exp: Likewise.
fortran: Reject array/allocatable LINEAR on DO [PR102430]
The middle-end does not implement array/allocatable LINEAR for OpenMP
worksharing loops, which can ICE during OpenMP expansion. Diagnose this
case in the Fortran front end with a sorry message instead.
PR fortran/102430
gcc/fortran/ChangeLog:
* openmp.cc (resolve_omp_clauses): Reject array/allocatable LINEAR on
worksharing-loop constructs.
gcc/testsuite/ChangeLog:
* gfortran.dg/gomp/pr102430.f90: New test.
Signed-off-by: Christopher Albert <albert@tugraz.at>
if (!TEST_HARD_REG_BIT (hard_stack_slot_access, regno))
...
symbolic_const_load_p = true;
...
if (!symbolic_const_load_p
|| ix86_access_stack_p...)
call ix86_update_stack_alignment.
with
if (ix86_need_alignment_p...
&& ix86_access_stack_p...)
call ix86_update_stack_alignment.
Since ix86_access_stack_p excludes registers on hard_stack_slot_access,
stack alignment isn't updated for registers on hard_stack_slot_access.
Instead, we should do
if (ix86_need_alignment_p...
&& (TEST_HARD_REG_BIT (hard_stack_slot_access, regno)
|| ix86_access_stack_p...))
call ix86_update_stack_alignment.
The compile times of PR target/124165 and PR target/124684 test are
unchanged.
if (ix86_need_alignment_p...
&& (TEST_HARD_REG_BIT (hard_stack_slot_access, regno)
|| ix86_access_stack_p...))
call ix86_update_stack_alignment.
gcc/
PR target/124759
PR target/124789
* config/i386/i386.cc (ix86_need_alignment_p_2): New function.
Exclude memory with SYMBOLIC_CONST.
(ix86_need_alignment_p_1): Call ix86_need_alignment_p_2.
(ix86_find_max_used_stack_alignment): Restore
hard_stack_slot_access handling.
gcc/testsuite/
PR target/124759
PR target/124789
* gcc.target/i386/pr124759.c: New test.
We have some permute SLP nodes which still have a SLP_TREE_REPRESENTATIVE,
so make sure we're not facing a permute note when trying to perform
SLP pattern matching.
PR tree-optimization/124802
* tree-vect-slp-patterns.cc (vect_match_expression_p): Fail
for SLP_TREE_PERMUTE_P.
Tomasz Kamiński [Wed, 1 Apr 2026 12:32:21 +0000 (14:32 +0200)]
libstdc++: Export explicit instantiations for C++20 members of std::string
The C++20 standard added new starts_with and ends_with members to
std::basic_string, which were not previously instantiated in the library.
This meant that the extern template declarations had to be disabled for
C++20 mode. With this patch the new members are instantiated in the
library and so the explicit instantiation declarations can be used for
C++20.
Furthermore, basic_string default constructor is now constrained with
is_default_constructible_v<_Alloc> constrains, that is included in
mangled name, so we also need to instantiate and export it.
The new members added by C++23 are still not exported, and so the
explicit instantiation declarations are still disabled for C++23.
libstdc++-v3/ChangeLog:
* config/abi/pre/gnu.ver (GLIBCXX_3.4): Make string exports
less greedy.
(GLIBCXX_3.4.35): Export basic_string default constructor and
starts_with and ends_with members.
* include/bits/basic_string.h: Update __cpluplus checks for C++20.
* include/bits/cow_string.h: Likewise.
* include/bits/basic_string.tcc: Declare explicit instantiations
for C++20 as well as earlier dialects.
* src/c++20/Makefile.am: Add cow-string-inst.cc and
string-inst.cc source files.
* src/c++20/Makefile.in: Regenerate.
* src/c++20/string-inst.cc: New file defining explicit
instantiations for basic_string default constructor and starts_with,
ends_with methods added in C++20
* src/c++20/cow-string-inst.cc: Version of above for cow-stings.
Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
fortran: Fix ICE in gfc_conv_array_initializer with invalid index [PR103367]
An undefined variable used as an array index in a parameter initializer
expression reaches gfc_conv_array_initializer after parameter substitution
with an unexpected expression type, hitting gcc_unreachable().
Guard against unexpected expression types by returning a zero-filled
constructor, since the frontend has already diagnosed the error.
PR fortran/103367
gcc/fortran/ChangeLog:
* trans-array.cc (gfc_conv_array_initializer): Return empty
constructor for unexpected expression types after parameter
substitution.
gcc/testsuite/ChangeLog:
* gfortran.dg/pr103367.f90: New test.
Signed-off-by: Christopher Albert <albert@tugraz.at>
doc: Make regenerate-opt-urls.py handle two-dash options [PR124784]
I was puzzled as to why the generated config/picolib.opt.urls
contained no entries. It turns out this was a general problem with
regenerate-opt-urls.py failing to handle options starting with two dashes,
which are listed with one dash in the .opt file but zero dashes (same as
one-dash options) in the index entries. The solution here is to remove one
of the dashes when canonicalizing the option name for lookup in the index.
gcc/ChangeLog
PR other/124784
* regenerate-opt-urls.py (canonicalize_option_name): Remove one
of the dashes from option names starting with two dashes.
(test_parse_option_index): Add a self-test for this.
* common.opt.urls: Regenerated.
* config/picolibc.opt.urls: Regenerated.
Patrick Palka [Tue, 7 Apr 2026 16:28:44 +0000 (12:28 -0400)]
c++: template-id typedef with lambda targ [PR123700]
A typedef to a template-id with a lambda targ must not be stripped by
strip_typedefs because it can cause the lambda to leak into a deeper
template context, which breaks substituting into the lambda later.
For example in the below testcases zero<inner> gets stripped to
zero<Type<[](auto) {}>>, and we end up substituting through this
lambda targ twice (with args {double} then {int}) even though the lambda
is from a depth-one template context.
This patch extends the existing lambda typedef handling in
dependent_opaque_alias_p (added by r15-3694 for decltype(lambda))
to also recognize such template-id typedefs. This should recognize
the vast majority of such constructs in practice (though the lambda
could also be a subexpression within a template argument which this
won't recognize).
PR c++/123700
gcc/cp/ChangeLog:
* pt.cc (dependent_opaque_alias_p): Return true for a
template-id typedef with a lambda targ.
gcc/testsuite/ChangeLog:
* g++.dg/cpp2a/lambda-targ24.C: New test.
* g++.dg/cpp2a/lambda-targ24a.C: New test.
Patrick Palka [Tue, 7 Apr 2026 16:28:42 +0000 (12:28 -0400)]
c++: templated static local var has value-dep addr, cont [PR123529]
has_value_dependent_address for a static local variable checks type
dependence of its context, but that's too narrow and we need a more
general dependence check that considers outer template arguments as
well, so that in the testcase below we deem A<T>::g()::i to have a
value-dependent address (making f<&i>() a dependent call).
PR c++/123529
PR c++/98930
gcc/cp/ChangeLog:
* pt.cc (has_value_dependent_address): Correct context
dependence check for a static local variable.
Jakub Jelinek [Tue, 7 Apr 2026 16:13:55 +0000 (18:13 +0200)]
c++: Implement CWG3140 - Allowing expansion over non-constant std::array
The following patch implements CWG3140, which allows non-constexpr
iterating expansion statements over non-constexpr ranges like std::array
where the range size is still known at compile time.
On the other side it breaks iterating expansion statements without constexpr
keyword on range-decl over ranges where to find out the range size the range
needs to be accessed. In some cases one will have to just add the constexpr
keyword, in other cases even that doesn't have to work (e.g. when the
iterator is constexpr except for operator* or some non-constexpr conversion
operator is involved).
2026-04-07 Jakub Jelinek <jakub@redhat.com>
* cp-tree.h: Implement C++26 CWG3140 - Allowing expansion over
non-constant std::array.
(cp_build_range_for_decls): Change last argument from bool to tree.
(build_range_temp): Likewise and default it to NULL_TREE rather than
false.
* parser.cc (build_range_temp): Remove expansion_stmt_p
argument, add expansion_stmt_decl. Don't call cp_build_qualified_type
if expansion_stmt_decl was not declared constexpr.
(cp_build_range_for_decls): Remove expansion_stmt_p argument, add
expansion_stmt_decl. Pass expansion_stmt_decl to build_range_temp.
Don't set TREE_STATIC, TREE_PUBLIC, DECL_COMMON, DECL_INTERFACE_KNOWN,
DECL_DECLARED_CONSTEXPR_P and TREE_READONLY on range_temp if
expansion_stmt_decl was not declared constexpr. Don't call
cp_build_qualified_type on begin type nor set TREE_STATIC etc. on begin
if expansion_stmt_decl was not declared constexpr. If
expansion_stmt_decl is non-NULL, don't build end at all, instead pass
begin_expr and end_expr in end_p[0] and end_p[1] to the caller.
(cp_convert_range_for): Adjust cp_build_range_for_decls caller.
* pt.cc (finish_expansion_stmt): Likewise. Use begin_expr and end_expr
instead of begin and end variables from cp_build_range_for_decls,
make them non-constant and avoid spurious -Wunused-result/nodiscard
diagnostics.
* g++.dg/cpp26/expansion-stmt11.C: Expect some extra diagnostics for
C++11.
* g++.dg/cpp26/expansion-stmt13.C: Likewise. Make it dg-do compile
test for c++11_only and dg-do run only for c++14 and above.
* g++.dg/cpp26/expansion-stmt16.C: Adjust expected diagnostics.
* g++.dg/cpp26/expansion-stmt19.C: Expect some extra diagnostics for
C++11. Make it dg-do compile test for c++11_only and dg-do run only
for c++14 and above.
* g++.dg/cpp26/expansion-stmt25.C (foo): Test both constexpr
range-for-decl and non-constexpr, adjust expected diagnostics.
* g++.dg/cpp26/expansion-stmt30.C: Adjust expected diagnostics.
* g++.dg/cpp26/expansion-stmt35.C: New test.
* g++.dg/cpp26/expansion-stmt36.C: New test.
* g++.dg/cpp26/expansion-stmt37.C: New test.
* g++.dg/cpp26/expansion-stmt38.C: New test.
Jakub Jelinek [Tue, 7 Apr 2026 16:00:24 +0000 (18:00 +0200)]
c++: Implement mangling for partially instantiated C++26 pack indexing [PR124487]
On Fri, Apr 03, 2026 at 05:56:08PM -0400, Jason Merrill wrote:
> Regarding the TODO, the related case I was thinking about was
>
> > ::= sZ <template-param> # sizeof...(T), size of a template parameter pack
> > ::= sP <template-arg>* E # sizeof...(T), size of a captured template parameter pack from an alias template
>
> ...but rather than follow the precedent of a different two-letter
> abbreviation, I might use J...E to express the expanded pack, as in
> <template-arg>. I've now suggested that on the ABI issue, as well.
Here is a patch which implements it.
2026-04-07 Jakub Jelinek <jakub@redhat.com>
PR c++/124487
* mangle.cc (write_type) <case PACK_INDEX_TYPE>: Handle even
the case of partially substituted pack.
(write_expression): Similarly for PACK_INDEX_EXPR.
* g++.dg/cpp26/pack-indexing9.C: Remove dg-sorry/dg-bogus, add
tests for mangled names and further test coverage.
Jakub Jelinek [Tue, 7 Apr 2026 15:59:13 +0000 (17:59 +0200)]
c++: Mark reflected vars/parameters as read [PR124790]
This PR complains about spurious -Wunused-but-set-* warnings when using
reflections. E.g. there is no warning for variable just set and used in
sizeof (var), but there is one when using size_of (^^var). If we reflect
some variable or parameter, we can do all kinds of things with it, so
setting preventing these warnings is IMHO desirable.
2026-04-07 Jakub Jelinek <jakub@redhat.com>
PR c++/124790
* reflect.cc (get_reflection): When reflecting VAR_DECL or PARM_DECL,
call mark_exp_read on it.
Remember the dummy whose bounds or character length are currently being
resolved as a specification expression so sibling ENTRY arguments in the
same unresolved ENTRY can be accepted.
2026-04-07 Paul Thomas <pault@gcc.gnu.org>
gcc/fortran
PR fortran/85352
* resolve.cc (specification_expr_symbol): New variable.
(entry_dummy_seen_p): Return whether a dummy appears in an already
seen ENTRY.
(gfc_resolve_formal_arglist): Remember the dummy whose specification
expressions are being resolved.
(resolve_variable): Accept unresolved sibling ENTRY dummy arguments
while resolving the current dummy's specification expressions.
(resolve_fl_variable): Preserve specification_expr_symbol.
(resolve_symbol_array_spec): Likewise.
gcc/testsuite
PR fortran/85352
* gfortran.dg/pr85352.f90: New test.
Signed-off-by: Christopher Albert <albert@tugraz.at>
Peter Damianov [Sun, 5 Apr 2026 00:41:04 +0000 (01:41 +0100)]
mingw: Remove obsolete STMP_FIXINC override from t-cygming
The STMP_FIXINC assignment in t-cygming dates back to r0-48723-g70e5e841b8b931, which introduced the shared cygwin/mingw
makefile fragment and used it to force fixincludes on for those
targets.
That predates r0-63200-g53c7ffe7dd1c28, which made configure default
STMP_FIXINC to stmp-fixinc, so the t-cygming assignment is now
redundant in normal builds. Once --disable-fixincludes was added by r13-2319-gbe9dd80f933480, the old override became incorrect as well,
because it forced stmp-fixinc back on for targets using t-cygming.
Configuring for mingw targets with --disable-fixincludes would then
fail with:
make[1]: No rule to make target
'../build-x86_64-pc-linux-gnu/fixincludes/fixinc.sh', needed by 'stmp-fixinc'.
Stop.
Remove the obsolete assignment so the configure-time default is used,
including when honoring an explicit --disable-fixincludes.
Richard Biener [Wed, 1 Apr 2026 10:39:43 +0000 (12:39 +0200)]
tree-optimization/124743 - SLP scheduling of invariant internal ops
The following makes us avoid scheduling invariant internal operations
to random points in the CFG when doing loop vectorization since
in that case the stmt UIDs we use for dominance checks are not
initialized outside of loop bodies. Instead schedule such
operations by appending to the loop preheader which is where
invariants generally end up for loop vectorization.
PR tree-optimization/124743
* tree-vect-slp.cc (vect_schedule_slp_node): Schedule
loop invariant operations in the loop preheader.
fortran: Fix ICE with implicit variable in iterator depend clause [PR107425]
An implicitly typed variable used as a subscript in an OpenMP iterator
depend clause (e.g., x(j) where j is implicit and only referenced in
the clause) caused an ICE in gimplify_var_or_parm_decl because the
variable's decl was never associated with a BIND_EXPR.
The root cause is that gfc_match_iterator creates a block namespace
(via gfc_build_block_ns) for iterator variables. When the locator
expression x(j) is parsed with gfc_current_ns set to this iterator
namespace, the implicit variable j is created there rather than in the
enclosing program namespace. In gfc_finish_var_decl, the FL_LABEL
check for BLOCK constructs matched before the omp_affinity_iterators
check, routing j through add_decl_as_local. Unlike real BLOCK
construct variables, these never get a proper BIND_EXPR, so the
gimplifier rejects them.
Fixed by checking for omp_affinity_iterators before the FL_LABEL
BLOCK construct check, and only treating actual iterator variables
(those on the omp_affinity_iterators chain) as block-local. Other
variables in the iterator namespace are added to the enclosing
function scope.
2026-04-07 Paul Thomas <pault@gcc.gnu.org>
gcc/fortran
PR fortran/107425
* trans-decl.cc (gfc_finish_var_decl): Check for
omp_affinity_iterators namespace before FL_LABEL BLOCK check.
Only route actual iterator variables through add_decl_as_local;
add other variables to the enclosing function.
gcc/testsuite
PR fortran/107425
* gfortran.dg/gomp/pr107425.f90: New test.
Signed-off-by: Christopher Albert <albert@tugraz.at>
Paul Thomas [Sun, 5 Apr 2026 09:53:08 +0000 (10:53 +0100)]
Fortran: Bugs found while testing r16-8436 [PR124780]
2026-04-07 Paul Thomas <pault@gcc.gnu.org>
gcc/fortran
PR fortran/124780
* resolve.cc (resolve_ordinary_assign): Do not add the class
data component to an operator expression.
* trans-expr.cc (gfc_trans_scalar_assign): If class to class
assignment uses ordinary scalar assignment and neither lhs or
rhs are class types, do a deep copy for allocatable components.
gcc/testsuite/
PR fortran/124780
* gfortran.dg/pr124780.f90: New test.
testsuite: fork does not work for bare metal targets
For an arm-none-eabi toolchain, at least built with newlib, the fork()
function exists, but it returns failure. The implementation is part of
libnosys.a and is there only to allow linking (runtime failure).
gcc/testsuite/ChangeLog:
* lib/target-supports.exp (check_fork_runtime): New function to
check that target has a working fork() implementation.
* lib/target-supports-dg.exp (dg-require-fork): When test is
"run", then call check_fork_runtime, else check_fork_available.
Avinash Jayakar [Tue, 24 Mar 2026 04:29:02 +0000 (23:29 -0500)]
rs6000: Add new builtin __builtin_ppc_atomic_cas_local
This patch adds a new powerpc specific atomic builtin which is similar
to the generic __atomic_compare_exchange builtin.
bool __builtin_ppc_atomic_cas_local (type *ptr, type *expected,
type *desired, bool weak,
int success_memorder,
int failure_memorder)
It behaves like __atomic_compare_exchange(), but it uses an EH value of
1 in the larx (load-and-reserve) instruction. The new builtin helps
optimize lock contention on PowerPC by keeping the lock cacheline in
the local processor longer, reducing performance penalties from
cache coherence protocol traffic.
* config/rs6000/rs6000-builtin.cc (rs6000_expand_builtin): Add
logic to handle __builtin_ppc_atomic_cas_local.
* config/rs6000/rs6000-builtins.def: New builtins for
__builtin_ppc_atomic_cas_local with types.
* config/rs6000/rs6000-c.cc (altivec_build_resolved_builtin):
Handle builtins with up to 6 arguments.
* config/rs6000/rs6000-overload.def: Overload builtin for
signed/unsiged char, short, int, long, __int128.
* config/rs6000/rs6000-protos.h (rs6000_expand_atomic_compare_and_swap):
Add additional parameter 'local' to the prototype.
* config/rs6000/rs6000.cc (emit_load_locked): Add new parameter. Pass
new parameter to generate load-locked instruction.
(rs6000_expand_atomic_compare_and_swap): Add new parameter. Call
emit_load_locked() with additional parameter value of EH bit.
(rs6000_expand_atomic_exchange): Pass EH value 0 to emit_load_locked().
(rs6000_expand_atomic_op): Likewise.
* config/rs6000/sync.md (load_locked<mode>): Add new operand in RTL
template. Specify EH bit in the larx instruction.
(load_locked<QHI:mode>_si): Likewise.
(load_lockedpti): Likewise.
(load_lockedti): Add new operand in RTL template. Pass EH bit to
gen_load_lockedpti().
(atomic_compare_and_swap<mode>): Pass new parameter 'false' to
rs6000_expand_atomic_compare_and_swap.
(atomic_compare_and_swap_local<mode>): New define_expand.
Nathaniel Shead [Thu, 19 Mar 2026 12:58:30 +0000 (23:58 +1100)]
c++/modules: Allow exporting usings of internal GMF entities with pedwarn [PR124268]
As discussed in libstdc++/124268, the std module relies on exporting
using-declarations for various entities, but on some targets the
relevant declarations have internal linkage.
Given we already support exposures of such internal linkage entities for
migration purposes, it seems reasonable to allow the same for
using-declarations.
PR libstdc++/124268
gcc/ChangeLog:
* doc/invoke.texi: Note that -Wexpose-global-module-tu-local
also applies to 'export using' declarations.
gcc/cp/ChangeLog:
* module.cc (instantiating_tu_local_entity): Use pedwarn instead
of warning.
(depset::hash::add_binding_entity): Don't skip exported
using-decls as TU-local entities.
(depset::hash::finalize_dependencies): Don't attempt to complain
again about using-decls referencing TU-local entities.
* name-lookup.cc (check_can_export_using_decl): Demote the error
to a warning for using-decls of GMF vars or functions.
gcc/testsuite/ChangeLog:
* g++.dg/modules/using-34_a.C: New test.
* g++.dg/modules/using-34_b.C: New test.
Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Patrick Palka <ppalka@redhat.com> Reviewed-by: Jason Merrill <jason@redhat.com>
c++/modules: Handle importing an undeduced auto over a deduced auto [PR124735]
Like with implicit constexpr, we need to handle cases where we import an
function declaration with undeduced auto, but we already have a
definition available with deduced auto. In this case we can just keep
the existing declaration's type.
PR c++/124735
gcc/cp/ChangeLog:
* module.cc (trees_in::is_matching_decl): Handle importing
undeduced auto when existing is already deduced.
gcc/testsuite/ChangeLog:
* g++.dg/modules/auto-8_a.H: New test.
* g++.dg/modules/auto-8_b.C: New test.
Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
c++/modules: Only mark namespace-scope entities as exported [PR124781]
We call 'set_originating_module' before we call pushdecl, which means
that for function-scope entities we might not have set DECL_CONTEXT yet.
Usually this doesn't matter, we only look at DECL_MODULE_EXPORT/ATTACH_P
on namespace-scope entities to begin with, but in the case in the linked
PR it causes issues because declarations in an unevaluated lambda appear
to be in an internal context.
Fixed by only considering non-null DECL_CONTEXT as being namespace scope
within set_originating_module.
As a drive-by improvement, ensured that we only talk about unnamed
namespaces in the diagnostic within check_module_decl_linkage if we're
actually within an anonymous namespace; this should be equivalent but
will lead to a slightly clearer diagnostic if a similar bug crops up
again later.
PR c++/124781
gcc/cp/ChangeLog:
* module.cc (set_originating_module): Add a function comment,
only set attachment/exporting for entities with non-NULL
DECL_CONTEXT.
(check_module_decl_linkage): Use decl_anon_ns_mem_p instead of
decl_internal_context_p.
gcc/testsuite/ChangeLog:
* g++.dg/modules/export-7.C: New test.
Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
c++/modules: Fix propagating noexcept for templates [PR124785]
We triggered a checking assertion because when propagating deduced
noexcept, we were updating the type of the existing TEMPLATE_DECL but
not the type of its DECL_TEMPLATE_RESULT, violating assumptions made
later on during modules streaming.
But actually there was nothing to propagate here anyway, these
declarations are identical, so this patch also fixes the condition for
checking whether we need to propagate anything. And so now I don't
think there is ever a case we should have a noexcept-spec to propagate
for a TEMPLATE_DECL, so add an assertion to validate this.
PR c++/124785
gcc/cp/ChangeLog:
* module.cc (trees_in::is_matching_decl): Narrow condition for
when noexcept propagation occurs; assert that we don't propagate
noexcept-specs for TEMPLATE_DECLs.
gcc/testsuite/ChangeLog:
* g++.dg/modules/noexcept-5.h: New test.
* g++.dg/modules/noexcept-5_a.C: New test.
* g++.dg/modules/noexcept-5_b.C: New test.
* g++.dg/modules/noexcept-5_c.C: New test.
Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
c++/modules: Fix entry-point detection for recursive clusters [PR118630]
In r15-4861-g4a99443c5dd9a235022652ba0fb143c6370ea99d we added support
to handle recursive dependency clusters, where we need to find the
"entry" dependency that all other entities will hook off to ensure that
we stream merge keys in the correct order on read-in.
The logic I'd used to track the entry bit was not completely correct
however, leading to assertion failures in 'sort_cluster' where we found
that entities were not marked maybe_recursive when they should have
been, or multiple entities were marked as the entry point.
Consider a cycle of three entities in a cluster, 'A', 'B', and 'C',
where 'A' is the entry point. By definition we walk into 'A' first, and
find one of the other entities, 'B'. The old logic marked 'A' as the
entry and 'B' as maybe-recursive; so far this is correct.
But then if we walk into 'B' and find 'C' is maybe-recursive, the old
logic would mark 'B' as the entry point (again!). And likewise when we
walk into 'C' and find 'A'. So we would end up with three entry points.
Similar issues could happen with other arrangements of dependencies.
Instead, by aggressively marking everything we see as maybe-recursive,
and only marking an entry point if nothing we see is maybe-recursive, we
avoid this issue. We should only be able to discover these other
entities through the entry point (A) and so this 'flood fill' behaviour
should ensure that all entities are correctly marked maybe-recursive,
and only A is marked as an entry-point.
PR c++/118630
gcc/cp/ChangeLog:
* module.cc (depset::hash::add_dependency): Correct entry point
corection for recursive clusters.
gcc/testsuite/ChangeLog:
* g++.dg/modules/late-ret-5.h: New test.
* g++.dg/modules/late-ret-5_a.H: New test.
* g++.dg/modules/late-ret-5_b.C: New test.
Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
Jakub Jelinek [Mon, 6 Apr 2026 21:10:46 +0000 (23:10 +0200)]
c++: Fix up handling of for-range-decls of expansion stmt [PR124488]
The following testcase is rejected, because we don't set all the needed
flags on range_decl in cp_parser_expansion_statement. During parsing
of the expansion stmt body, it should be treated as if there is a decl
with value dependent initializer in a template, because the value it will
have is yet to be determined (and possibly different in each instantiation
of the body).
For such decls, cp_finish_decl normally conservatively sets
DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (because it might be initialized
by constant expression) and for non-references also sets TREE_CONSTANT
if decl_maybe_constant_var_p. Furthermore, those have a value dependent
initializer and DECL_DEPENDENT_INIT_P is set on those too.
The following patch arranges all of that for the range_decl.
2026-04-06 Jakub Jelinek <jakub@redhat.com>
PR c++/124488
* parser.cc (cp_parser_expansion_statement): Set
DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P, DECL_DEPENDENT_INIT_P and
if maybe constant non-reference TREE_CONSTANT on range_decl.
* pt.cc (tsubst_stmt) <case TEMPLATE_FOR_STMT>: Set
DECL_DEPENDENT_INIT_P on decl.
Jakub Jelinek [Mon, 6 Apr 2026 21:08:48 +0000 (23:08 +0200)]
c++: Implement the annotations_of on parms part of P3795R2
The current behavior of GCC is that we list all annotations gathered from
all the PARM_DECLs merged together on ^^fnparm or
variable_of (parameters_of (^^fn)[0]) and throw on annotations_of
on parameters_of (^^fn)[0]. The paper requires that the last one works
like we currently handle the former two, and for the former two we
filter out annotations that have not appeared on the function definition.
The following patch marks the annotations in grokfndecl before pushdecl
etc. merges it with other decls.
2026-04-06 Jakub Jelinek <jakub@redhat.com>
* decl.cc (grokfndecl): For -freflection mark annotations of
PARM_DECLs in a function definition.
* reflect.cc (eval_annotations_of): Allow annotations_of on
function parameters. For r which is a PARM_DECL without REFLECT_PARM,
filter out annotations not marked by grokfndecl.
(reflection_mangle_prefix): Preserve the grokfndecl marking of
annotations during mangling.
doc: Rewrite Solaris section of install.texi for GCC 16
The Solaris installation information in install.texi urgently needed a
rewrite. It was highly repetitive, with information spread over both a
generic Solaris section and several separate ones for the different
configurations, and contained lots of cruft that's no longer relevant.
This patch merges all of them into a single Solaris section and attempts
a concise documentation of the requirements, configuration options and
quirks.
Without SSE2 double precision uses excess precision, leading to test
failures. For now, std::simd remains a tech preview that simply is
disabled without SSE2.
fortran: Clean up charlens after rejected parameter arrays [PR79524]
When a parameter array declaration such as
character(*), parameter :: z(2) = [character(n) :: 'x', 'y']
is rejected, declaration-local charlen nodes from that statement can remain on
cl_list and later be resolved again. The charlen's length expression still
references the symbol 'n' whose symtree was already freed by gfc_undo_symbols,
causing a heap-use-after-free in resolve_charlen.
Clean up those statement-local charlens at the rejection point in decl.cc,
after clearing the surviving owners in that path.
PR fortran/79524
gcc/fortran/ChangeLog:
PR fortran/79524
* decl.cc (discard_pending_charlens): New helper.
(add_init_expr_to_sym): Drop statement-local charlens when
rejecting variable-length parameter arrays.
(variable_decl, do_parm, enumerator_decl): Save the current
namespace charlen list before parsing declarations with
initializers.
(match_procedure_decl): Adjust call to add_init_expr_to_sym.
gcc/testsuite/ChangeLog:
PR fortran/79524
* gfortran.dg/pr79524.f90: New test.
Signed-off-by: Christopher Albert <albert@tugraz.at>
While the error message isn't particularly helpful, it's from dg.exp
(dg-do): like the other dg-* procs it expects the line number to be the
first argument. However, dg-do-if strips that, so dg-do gets the target
selector instead of the expected action keyword.
Fixed by no longer stripping the line number.
Tested on amd64-pc-freebsd15.0 (sse2_runtime && !sse4_runtime),
i386-pc-solaris2.11 and x86_64-pc-linux-gnu (sse2_runtime &&
sse4_runtime).
Jakub Jelinek [Sun, 5 Apr 2026 16:06:34 +0000 (18:06 +0200)]
c++: Error recovery for fuzzed <meta> [PR124689]
I knew this was coming, but hoped it would come later ;)
Basically, when one preprocesses <meta> + some reflection code and
attempts to fuzz it, we can ICE in various ways as we expect a sane
<meta>. In various places we've already tried to be defensive, error
out e.g. when we don't find the members we are looking for in <meta>
classes etc., plus when adding metafns.gperf I've added to the details
about each metafn the types of arguments and return type (which was
only partially used to evaluate e.g. the arguments in different ways
and prepare for the eval_* handlers, but checking of the types
wasn't actually done.
This patch introduces some limited checking of the return type and
argument types to make sure they are sane. Plus I've noticed the
can_substitute marking said incorrectly it returns info when it returns
bool.
The reflection_range/input_range arguments aren't checked, because they
can be all kinds of things and get_range_elts already does a lot of
checking. Similarly METAFN_KIND_ARG_TEMPLATE_PARM*, those aren't even
argument types, just a hack to tell the code that it needs to supply
the template parameter to the eval_* handlers.
2026-04-05 Jakub Jelinek <jakub@redhat.com>
PR c++/124689
* metafns.gperf (enum metafn_kind): Add
METAFN_KIND_BOOL_INFO_REFLECTION_RANGE.
(can_substitute): Use METAFN_KIND_BOOL_INFO_REFLECTION_RANGE
instead of METAFN_KIND_INFO_INFO_REFLECTION_RANGE.
(METAFN_KIND_ARG): Add MINFO argument.
(METAFN_KIND_RET): Define.
* reflect.cc (is_std_meta_class): New function.
(get_info): Add LOC argument, diagnose invalid argument type instead
of failing assertion.
(check_metafn_arg_type): New function.
(check_metafn_return_type): New function.
(process_metafunction): Diagnose clearly invalid return
or argument types. Use rettype variable instead of TREE_TYPE (call).
* metafns.h: Regenerate.
fortran: Fix character SPREAD intrinsic lowering [PR109788]
Copy the SPREAD intrinsic descriptor before specializing the character
formal argument type so other uses keep the generic signature.
PR fortran/109788
gcc/fortran/ChangeLog:
* iresolve.cc (copy_intrinsic_sym): New helper.
(gfc_resolve_spread): Copy the intrinsic descriptor before
specializing the character formal argument type.
gcc/testsuite/ChangeLog:
* gfortran.dg/pr109788.f90: New test.
Signed-off-by: Christopher Albert <albert@tugraz.at>
Eric Botcazou [Sun, 5 Apr 2026 08:21:46 +0000 (10:21 +0200)]
Ada: Fix too large secondary stack allocation for aggregate return
This is a regression present on the mainline and 15 branch. The problematic
allocation may occur when the result type of the function is a discriminated
record type with defaulted discriminants. Although it had been present for
a long time when the type is limited, the problem was recently propagated
to nonlimited types because of an optimization.
While the fix is a one-liner, the change also makes it so that SS_Allocate
raises a Storage_Error when the size overflows, like the other allocators.
gcc/ada/
* exp_ch6.adb (Expand_Simple_Function_Return): Use a constant return
object when the simple return is rewritten as an extended one.
* libgnat/s-secsta.adb (SS_Allocate): Raise Storage_Error if the
requested size is negative.
* libgnat/s-secsta__cheri.adb (SS_Allocate): Likewise.
gcc/testsuite/
* gnat.dg/aggr35.adb: New test.
* gnat.dg/aggr35_pkg.ads, gnat.dg/aggr35_pkg.adb: New helper.
The documentation for Picolibc options was inserted at the top level
within the GCC options section. It really should be classified with
the target-specific options; that's where we document other options
specific to the runtime configuration, including MinGW, Darwin,
Gnu/Linux, etc.
The node name "Submodel Options" is not meaningful, and the section name
"Machine-Dependent Options" is misleading since this section also contains
subsections documenting options for the software environment on the target
as well as its hardware -- for example, Windows/Cygwin/MinGW, Darwin, etc.
"Target-Specific Options" is a better name for it as we already use that
phrasing elsewhere, e.g. "Target-Specific Attributes".
gcc/ChangeLog
* doc/extend.texi (Common Attributes): Fix cross-reference for
renamed "Submodel Options" -> "Target-Specific Options".
* doc/invoke.texi (Invoking GCC): Likewise for the menu.
(Option Summary): Likewise for the use here.
(Submodel Options): Rename to Target-Specific Options. Leave
an anchor with the old name. Add better index entries. Rewrite
introductory text.
(Precompiled Headers): Fix another cross-reference.
doc, i386: Document more CPUs as having CX16 support [PR107337]
The CX16 extension seems to have been omitted from the documentation
entries for a couple of early CPUs that supported it, which were
subsequently cut-and-pasted for newer models. I checked the code
against the list of CPUs in the issue and found one more (novalake)
affected CPU that was added since then.
gcc/ChangeLog
PR target/107337
* doc/invoke.texi (x86 Options): Add CX16 feature to nocona,
alderlake, arrowlake, arrowlake-s, pantherlake, novalake,
bonnell, sierraforest, grandridge, clearwaterforest, and amdfam10
family processors.
Richard Biener [Tue, 24 Mar 2026 18:09:38 +0000 (19:09 +0100)]
middle-end/121467 - split the Standard Pattern Names section
The following splits the standard pattern names section into two
(for now), listing vector related patterns separately. It also
adds a separate index for the many standard pattern names we have,
something long overdue.
* doc/gccint.texi: Add named pattern index with @mdindex.
* doc/md.texi (Standard Pattern Names For Generation): Split
table into two using subsections, splitting out vectorizer
related standard patterns. Use @mdindex for all standard
pattern names.