Robin Dapp [Wed, 11 Feb 2026 15:32:01 +0000 (16:32 +0100)]
lra: Perform cycle detection for moves with clobber. [PR123381]
In the PR code we have the somewhat rare case that we need to reload
a vector subreg of a scalar register, (subreg:V2HI (reg:DI)).
What complicates things is that the test is compiled with
-mrvv-vector-bits=zvl, so VLS-only mode.
Unfortunately, we can still get VLA-named modes that are actually VLS
modes (i.e. that have a constant number of units).
Here, lra recognizes cycle danger, quickly switches to the memory
alternative and the resulting code is as expected - we perform a vector
load from that memory the DImode reg was spilled to.
The extra clobber here is an optimization: For modes smaller than a full
register we want to store the actual size, rather than always the full
vector size. If that mode size happens to exceed 32, instead of using an
immediate we need to move it to a register so vsetvl can consume it.
As the second mov insn above has three operands lra never checks for cycle
danger and promptly creates a cycle :) This patch loosens the conditions on
the cycle check by allowing a third operand that is a clobber.
PR rtl-optimization/123381
gcc/ChangeLog:
* lra-constraints.cc (process_alt_operands): Detect cycles in
three-operand moves with clobber.
(curr_insn_transform): Don't write back a scratch operand.
gcc/testsuite/ChangeLog:
* gcc.target/riscv/rvv/autovec/pr123381.c: New test.
Piyush Raj [Tue, 24 Feb 2026 20:17:53 +0000 (01:47 +0530)]
contrib: add bpf-vmtest-tool to test BPF programs
This patch adds the bpf-vmtest-tool subdirectory under contrib which tests
BPF programs under a live kernel using a QEMU VM. It can build the
specified kernel version with eBPF support enabled
and stores it under $VMTEST_DIR
It can test BPF C source files and precompiled BPF object files against
the kernel verifier for errors.
When a BPF program is rejected by the kernel verifier,
the verifier logs are displayed.
The script uses vmtest (https://github.com/danobi/vmtest) to boot
the VM and run the program. By default, it uses the host's root
("/") as the VM rootfs via the 9p filesystem, so only the kernel is
replaced during testing.
Tested with Python 3.9 and above.
contrib/ChangeLog:
* bpf-vmtest-tool/README: New file.
* bpf-vmtest-tool/bpf.py: New file.
* bpf-vmtest-tool/config.py: New file.
* bpf-vmtest-tool/kernel.py: New file.
* bpf-vmtest-tool/main.py: New file.
* bpf-vmtest-tool/pyproject.toml: New file.
* bpf-vmtest-tool/tests/test_cli.py: New file.
* bpf-vmtest-tool/utils.py: New file.
* bpf-vmtest-tool/vm.py: New file.
Wilco Dijkstra [Thu, 22 Jan 2026 12:28:36 +0000 (12:28 +0000)]
AArch64: Use anchors for vector constants [PR 121240]
Enable anchors for vector constants - like FP, expand vector constants early
and place them in the constdata section. Avoid unnecessary loads by expanding
simple cases using DUP. Performance on SPECFP2017 is ~0.3% better, codesize
increases by 0.05% due to extra const data.
Eric Botcazou [Tue, 24 Feb 2026 16:42:24 +0000 (17:42 +0100)]
Ada: Fix crash on iterated element association for Ordered_Maps
This is a regression present on the mainline and 15 branch: the compiler
crashes on an iterated element association for Ordered_Maps or similar
container types, because the type of the loop variable is not computed.
gcc/ada/
PR ada/124224
* sem_aggr.adb (Resolve_Container_Aggregate): Minor tweaks.
(Resolve_Iterated_Association): Compute Typ on all paths.
gcc/testsuite/
* gnat.dg/specs/aggr12.ads: New test.
Martin Jambor [Tue, 24 Feb 2026 16:32:32 +0000 (17:32 +0100)]
contrib: Skip Clang -Wreturn-type-c-linkage in rust-fmt.h
When compiling GCC Rust FE, clang gives the following warning:
/home/worker/buildworker/tiber-gcc-clang/build/gcc/rust/ast/rust-fmt.h:403:15: warning: 'collect_pieces' has C-linkage specified, but returns incomplete type 'FFIVec<Piece>' which could be incompatible with C [-Wreturn-type-c-linkage]
/home/worker/buildworker/tiber-gcc-clang/build/gcc/rust/ast/rust-fmt.h:406:15: warning: 'clone_pieces' has C-linkage specified, but returns incomplete type 'FFIVec<Piece>' which could be incompatible with C [-Wreturn-type-c-linkage]
I have raised this with GCC Rust folk on their Zulip chat and we
agreed the warning should be filtered out, at least fornow. It is
tracked as https://github.com/Rust-GCC/gccrs/issues/4441 so it is not
forgotten but even there it seems that the outcome may be we'd just
ignore the warning forever, as far as I can tell.
contrib/ChangeLog:
2026-02-24 Martin Jambor <mjambor@suse.cz>
* filter-clang-warnings.py (skip_warning): Skip warning
-Wreturn-type-c-linkage in rust/ast/rust-fmt.h. Fix indentation of
the entry for libiberty/sha1.c.
Robert Dubner [Tue, 24 Feb 2026 14:56:01 +0000 (09:56 -0500)]
cobol: Increase PIC X(MAX) from 8192 to 2^31.
Up until these changes, temporary intermediate alphanumeric string
variables have been allocated on the stack. With the design change to
a larger limit, that's no longer practical. Such variables are now
placed on the heap, and we now have to take pains to free() that memory
when we are done with it.
gcc/cobol/ChangeLog:
* gcobc: Adjust how -fPIC is applied, and other refinements.
* gcobol.1: Documentation.
* genapi.cc (parser_statement_end): New function. Deallocates
temp char strings from the heap.
(initialize_variable_internal): Ignore temp char strings.
(compare_binary_binary): Formatting.
(parser_end_program): Formatting.
(parser_init_list): Formatting.
(parser_exit_program): Formatting.
(program_end_stuff): Formatting.
(parser_exit): Formatting.
(parser_perform_conditional): Formatting.
(perform_outofline_before_until): Formatting.
(parser_file_add): Formatting.
(mh_source_is_literalA): Formatting.
(psa_new_var_decl): Make cblc_field_t for intermediate_e
alphanumerics program-static.
(parser_symbol_add): Eliminate unnecessary code when
type!=FldConditional; change handling of intermediate_e for
FldAlphanumerics.
* genapi.h (parser_end_program): New declaration.
(parser_exit): Formatting.
(parser_exit_program): Formatting.
(parser_statement_end): New declaration.
* lexio.cc (parse_replace_pairs): Change CDF handling.
(cdftext::lex_open): Likewise.
(cdftext::process_file): Likewise.
* parse.y: Changes to MAXIMUM_ALPHA_LENGTH; refine return value
types for various intrinsic functions; some CDF handling.
* parse_ante.h (MAXLENGTH_FORMATTED_DATE): Eliminate constant.
(MAXLENGTH_FORMATTED_TIME): Likewise.
(MAXLENGTH_CALENDAR_DATE): Likewise.
(MAXLENGTH_FORMATTED_DATETIME): Likewise.
(new_alphanumeric): No longer takes a capacity.
(intrinsic_return_field): New declaration.
(struct ffi_args_t): Changed debug message.
(is_among): New declaration.
* parse_util.h (intrinsic_return_field): New function. Works with
the modified function_descrs[] table.
* scan.l: Modified scanning.
* scan_ante.h (class input_file_status_t): Likewise.
(verify_ws): Likewise.
(is_refmod): Likewise.
* symbols.cc (symbols_update): Improved comment about a debug
message.
(symbol_temporaries): New function for temporaries on the heap that
will have to be deallocated.
(symbol_temporary_alphanumerics): Likewise.
(new_temporary_impl): Eliminate MAXIMUM_ALPHA_LENGTH from template.
(new_alphanumeric): Eliminate capacity as a parameter.
* symbols.h (cbl_dialect_str): Formatting.
(MAXIMUM_ALPHA_LENGTH): Change comment and value.
(IBM_MAXIMUM_ALPHA_LENGTH): Put parentheses around "size_t(1)<<31".
(symbol_temporaries): New declaration.
(symbol_temporary_alphanumerics): New declaration.
(struct function_descr_t): New comment on ret_type.
(new_alphanumeric): New declaration.
* util.cc (class cdf_directives_t): CDF processing.
(cobol_set_indicator_column): Likewise.
(cdf_push_source_format): Likewise.
(cdf_pop_source_format): Likewise.
(parent_names): Likewise.
(cobol_filename): Likewise.
(cobol_lineno): Likewise.
(cobol_filename_restore): Likewise.
libgcobol/ChangeLog:
* intrinsic.cc (string_to_dest): Move call to
__gg__adjust_dest_size().
(__gg__char): Likewise.
(__gg__current_date): Likewise.
(__gg__formatted_current_date): Likewise.
(__gg__formatted_date): Likewise.
(__gg__formatted_datetime): Likewise.
(__gg__formatted_time): Likewise.
(change_case): Likewise.
(__gg__trim): Likewise; fix memory leak.
(__gg__reverse): Move call to __gg__adjust_dest_size().
(__gg__locale_compare): Likewise
(__gg__locale_date): Likewise
(__gg__locale_time): Likewise
(__gg__locale_time_from_seconds): Likewise
* libgcobol.cc (format_for_display_internal): Make the results of
intermediate FldNumericBin5 look nice to a human.
(init_var_both): Move call to __gg__adjust_dest_size().
(__gg__get_argc): Move call to __gg__adjust_dest_size().
(__gg__get_argv): Move call to __gg__adjust_dest_size().
(__gg__get_command_line): Move call to __gg__adjust_dest_size().
(__gg__adjust_dest_size): Properly handle intermediate_e
allocations.
(__gg__adjust_encoding): Move call to __gg__adjust_dest_size().
(__gg__module_name): Move call to __gg__adjust_dest_size().
(__gg__refer_from_string): Move call to __gg__adjust_dest_size().
(__gg__refer_from_psz): Move call to __gg__adjust_dest_size().
(__gg__convert): Move call to __gg__adjust_dest_size().
* posix/shim/lseek.cc: Changes to extended functions.
* posix/shim/open.cc (posix_opent): Likewise.
(posix_open): Likewise.
* posix/udf/posix-open.cbl: Likewise.
* posix/udf/posix-read.cbl: Likewise.
* posix/udf/posix-write.cbl: Likewise.
* xmlparse.cc (sayso): Change to debug message.
* posix/udf/posix-ftruncate.cbl: New file.
The following fixes the sign conversion check added to properly check
whether the BIT_FIELD_REF does a sign conversion on the original
vector elements instead of a conversion to the target constructor
element type. This avoids disabling all unpacking conversions.
Martin Jambor [Tue, 24 Feb 2026 10:43:32 +0000 (11:43 +0100)]
ipa-cp: Make ipcp_val_replacement_ok_p fail better
This is a small improvement to a function which verifies that the
polymorphic context IPA-CP has decided to clone for is indeed among
the known contexts collected for the specialized node. When no
context has been collected and the vector is empty, like in the case
of PR123629, the function will return false rather than ICE because of
an out of bounds vector access. That in turn also results in an
ICE, but hopefully the error will be somewhat clearer.
gcc/ChangeLog:
2026-02-23 Martin Jambor <mjambor@suse.cz>
PR ipa/123629
* ipa-cp.cc (ipcp_val_replacement_ok_p): Also verify that the
vector of known contexts has sufficient length.
Fortran: Fix diagnostic for ambiguous pointer function assignment [PR80012]
The error message for an ambiguous pointer function assignment contained a
FIXME and an embedded newline that the diagnostics printer does not handle.
Split the single gfc_error call into a gfc_error for the main diagnostic
and an inform note for the F2008 explanation, wrapped in an
auto_diagnostic_group.
PR fortran/80012
gcc/fortran/ChangeLog:
* symbol.cc (gfc_add_procedure): Split error into gfc_error and
inform using auto_diagnostic_group.
The fix for PR120505 introduced two test failures on some configurations.
This patch update the scan dump pattern in map-subarray-4.f90 to allow for
differing pointer sizes, and disable map-subarray-16.f90 when no offload device
is available.
PR fortran/120505
libgomp/ChangeLog:
* testsuite/libgomp.fortran/map-subarray-16.f90: Enable test only for
offload device.
gcc/testsuite/ChangeLog:
* gfortran.dg/gomp/map-subarray-4.f90: Update scan dumps for -m32.
Sandra Loosemore [Mon, 23 Feb 2026 16:10:01 +0000 (16:10 +0000)]
amdgcn: prefer scalar ALU instructions over vector
This patch fixes a performance regression that crept in with commit gcc-16-2237-g0eee2dd2865 ("Don't clobber VCC if we don't need to").
Removing the clobber from vector-register ALU insn pattern
alternatives seems to make LRA think those alternatives are less
costly than the scalar-register alternatives, which do need the
clobber, resulting in extra move instructions instead.
In this patch I've adjusted all the ALU patterns (not just the ones
modified by the above-mentioned commit) where the scalar-register
alternatives clobber and vector-register alternatives don't, to
slightly disparage the latter using the "?" constraint modifier.
I also fixed a related issue: the comment on addptrdi3 says the
scalar-register alternative is preferred, but it was listed after the
vector alternative, so other things being equal it would still prefer
the vector expansion. I've not changed the constraints, but simply
flipped the order of the alternatives.
Thanks to Tobias Burnus for identifying the commit that caused the
performance regression, Andrew Stubbs for making the connection between
clobbers and LRA costs, and Arsen Arsenović for setting up the benchmark
scripting I used to compare results.
gcc/ChangeLog
* config/gcn/gcn.md (addsi3): Disparage vector alternative.
(addptrdi3): Reverse order of vector and scalar alternatives
to prefer the latter.
(subsi3): Disparage vector alternatives.
(mulsi3): Likewise.
(muldi3): Likewise.
(bitunop <expander>si2): Likewise.
(vec_and_scalar_com <expander>si3): Likewise.
(vec_and_scalar_nocom <expander>si3): Likewise.
(one_cmpldi2): Likewise.
(vec_and_scalar64_com <expander>di3): Likwise.
(vec_and_scalar64_nocom <expander>di3): Likwise.
Marek Polacek [Thu, 19 Feb 2026 15:51:32 +0000 (10:51 -0500)]
c++/reflection: splices and passing ctx to finish_id_expr
In <https://gcc.gnu.org/pipermail/gcc-patches/2026-January/705175.html>
(bottom of the message) we discussed not passing ctx to finish_id_expression
so that we can get rid of the _deferring_access_checks calls.
We can avoid passing context to finish_id_expression but we can't
completely avoid the _deferring_access_checks calls, because for
address_p we need to call build_offset_ref which needs it.
gcc/cp/ChangeLog:
* parser.cc (cp_parser_splice_expression): For dependent splices return
earlier. Refactor. For address_p, build an OFFSET_REF. Don't pass
context to finish_id_expression.
* semantics.cc (finish_id_expression_1): Adjust an assert to also check
flag_reflection.
Marek Polacek [Tue, 17 Feb 2026 22:08:52 +0000 (17:08 -0500)]
c++/reflection: ICE with missing OVERLOAD [PR124150]
A function template is supposed to be wrapped in an OVERLOAD. Since
in certain cases like members_of it is not, splice makes sure to add
the OVERLOAD if needed. But it wasn't looking into TEMPLATE_ID_EXPRs
and so we ended up with a "naked" TEMPLATE_DECL and crashed.
We can add the missing OVERLOAD in eval_substitute.
PR c++/124150
gcc/cp/ChangeLog:
* reflect.cc (eval_substitute): Add an OVERLOAD around
a DECL_FUNCTION_TEMPLATE_P.
Marek Polacek [Thu, 19 Feb 2026 19:47:26 +0000 (14:47 -0500)]
c++/reflection: members_of and friend class [PR123641]
The assert in this test currently doesn't pass because .size () is 3, due to
{A, B, B} found in N, but it should only be {A, B}, because we should
skip the hidden "void N::B()".
PR c++/123641
gcc/cp/ChangeLog:
* name-lookup.cc: Move STAT_* and MAYBE_STAT_* macros from here to...
* name-lookup.h: ...here.
* reflect.cc (namespace_members_of): Use them. Skip STAT_TYPE_HIDDEN_P.
Consider the following code, assuming tiles is allocatable:
type t
integer, allocatable :: den1(:,:), den2(:,:)
end type t
[...]
!$omp target enter data map(var%tiles(1)%den2, var%tiles(1)%den1)
r16-5789-g05c2ad4a2e7104 allowed mapping several components from the same
allocatable derived type, provided they are in the right order in user code.
This patch relaxes this constraint by computing offsets and sorting to-be-mapped
components at gimplification time.
PR fortran/120505
gcc/ChangeLog:
* gimplify.cc (omp_accumulate_sibling_list): When the containing struct
is a Fortran array descriptor, sort mapped components by offset.
libgomp/ChangeLog:
* testsuite/libgomp.fortran/map-subarray-12.f90: New test.
Consider the following OMP directive, assuming tiles is allocatable:
!$omp target enter data &
!$omp map(to: chunk%tiles(1)%field%density0) &
!$omp map(to: chunk%left_rcv_buffer)
libgomp reports an illegal memory access error at runtime. This is because
density0 is referenced through tiles, which requires its descriptor to be mapped
along its content.
This patch ensures that all such intervening allocatables in a reference chain
are properly mapped. For the above example, the frontend has to create the
following three additional map clauses:
(1) is required by the gimplifier for attaching but will be removed at the end
of the pass; the inner component is explicitly to-mapped elsewhere. (2) ensures
that the array descriptor will be available at runtime to compute offsets and
strides in various dimensions. The gimplifier will turn (3) into a regular
attach of the data pointer and compute the bias.
PR fortran/120505
gcc/fortran/ChangeLog:
* trans-openmp.cc (gfc_map_array_descriptor): New function.
(gfc_trans_omp_clauses): Emit map clauses for intermediate array
descriptors.
gcc/ChangeLog:
* gimplify.cc (omp_mapped_by_containing_struct): Handle Fortran array
descriptors.
(omp_build_struct_sibling_lists): Allow attach_detach bias to be
adjusted on non-target regions.
(gimplify_adjust_omp_clauses): Remove GIMPLE-only nodes.
* tree-pretty-print.cc (dump_omp_clause): Handle
OMP_CLAUSE_MAP_SIZE_NEEDS_ADJUSTMENT and OMP_CLAUSE_MAP_GIMPLE_ONLY.
* tree.h (OMP_CLAUSE_MAP_SIZE_NEEDS_ADJUSTMENT,
OMP_CLAUSE_MAP_GIMPLE_ONLY): Define.
libgomp/ChangeLog:
* testsuite/libgomp.fortran/map-subarray-11.f90: New test.
* testsuite/libgomp.fortran/map-subarray-13.f90: New test.
* testsuite/libgomp.fortran/map-subarray-14.f90: New test.
* testsuite/libgomp.fortran/map-subarray-15.f90: New test.
* testsuite/libgomp.fortran/map-subarray-16.f90: New test.
* testsuite/libgomp.fortran/map-alloc-present-2.f90: New file.
gcc/testsuite/ChangeLog:
* gfortran.dg/gomp/map-subarray-3.f90: New test.
* gfortran.dg/gomp/map-subarray-5.f90: New test.
Tomasz Kamiński [Thu, 19 Feb 2026 12:53:01 +0000 (13:53 +0100)]
libstdc++: Harmonize mdspan operator[] and at methods.
This patch changes the implementation of operator[], to follow similar
pattern as at, where we normalize argument types and forward to single
overload. The conversion now uses __mdspan::__index_type_cast, instead
of static_assert. This introduces asserts assuring that conversion is
is value preserving.
Finally, __is_multi_index is implemented as local lambda, avoiding
the need to create a local array with copies of the arguments.
libstdc++-v3/ChangeLog:
* include/std/mdspan (__mdspan::__is_multi_index): Removed,
replaced with local lambda in mdspan::operator[].
(__mdspan::operator[]): Implement in terms of single overload
accepting index_type. Use __mdspan::__index_type_cast for type
conversion.
Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
Tomasz Kamiński [Thu, 19 Feb 2026 12:14:16 +0000 (13:14 +0100)]
libstdc++: Implement mdspan::at member functions from P3383R3.
This patch implements P3383R3: mdspan.at().
The mdspan::at cast only non-integral types to the index_type, before
performing the checks. This allows to detect negative value of arguments,
even if the index type is unsigned, and other values that would overflow
index_type.
libstdc++-v3/ChangeLog:
* include/std/mdspan (mdspan::at, mdspan::__index_int_t):
Define.
* testsuite/23_containers/mdspan/at.cc: New test.
Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
Alice Carlotti [Sun, 16 Nov 2025 05:05:30 +0000 (05:05 +0000)]
aarch64: Change default -march for SME tests
The current fallback option -march=armv9-a+sme pulls in an SVE2
dependency that isn't need in most tests. Switch to -march=armv8-a+sme
so that we test SME without SVE enabled.
gcc/testsuite/ChangeLog:
* g++.target/aarch64/sme/aarch64-sme-acle-asm.exp: Use
-march=armv8-a+sme when SME isn't already enabled.
* g++.target/aarch64/sme/aarch64-sme.exp: Ditto.
* g++.target/aarch64/sme2/aarch64-sme2-acle-asm.exp: Ditto.
* gcc.target/aarch64/sme/aarch64-sme-acle-asm.exp: Ditto.
* gcc.target/aarch64/sme/aarch64-sme.exp: Ditto.
* gcc.target/aarch64/sme2/aarch64-sme2-acle-asm.exp: Ditto.
Alice Carlotti [Tue, 30 Dec 2025 08:53:10 +0000 (08:53 +0000)]
aarch64: Adjust sme tests that require sve
Some SME tests currently require SVE to be enabled as well. Either mark
this requirement explicitly in the test file (with a pragma), or
eliminate it by modifying the test.
For some check-function-bodies tests we take both approaches - that is,
we add "+sve" to the existing test, and create a duplicate "+nosve" test
that checks for the use of __arm_get_current_vg in the prologue.
For vect-dotprod-twoway.c, the issue is that the number of
udot/sdot/whilelo instructions depends on the selected tuning option.
Pass an explicit -mtune option to preserve the expected codegen.
Alice Carlotti [Fri, 2 Jan 2026 16:58:31 +0000 (16:58 +0000)]
aarch64: Remove +sme+nosve sorry
The preceding patches have fixed support for SME without SVE enabled, so
we can now remove the "sorry" for this configuration. This allows us to
remove SVE/SVE2 from the features that are added as a workaround when
trying to process a streaming function with SME disabled.
gcc/ChangeLog:
* config/aarch64/aarch64.cc (aarch64_override_options_internal):
Remove +sme+nosve sorry, and remove SVE from nosme workaround.
* doc/invoke.texi: Remove SVE2 requirement from +sme.
Alice Carlotti [Fri, 2 Jan 2026 16:58:09 +0000 (16:58 +0000)]
aarch64: Adjust TARGET_SVE{2}
Many instructions that are currently gated on TARGET_SVE or TARGET_SVE2
are also available in streaming mode when non-streaming SVE is disabled.
The simplest way to reflect this is by updating the macros to include
"|| TARGET_STREAMING".
Any SVE/SVE2 instructions that aren't available in streaming mode
already have an explicit "&& TARGET_NONSTREAMING" in their condition, so
in this case the extra condition has no impact besides a marginal
performance loss.
There are two uses of TARGET_SVE{2} that need handling separately:
- In aarch64_adjust_generic_arch_tuning, we are using features as a
proxy for tuning decisions, in which case we should treat
non-streaming mode with SME enabled the same as if either SVE2 or
streaming mode are enabled.
- In aarch64_update_cpp_builtins, streaming mode enablement is not a
relevant condition for defining __ARM_FEATURE_* macros, so use an
explicit feature flags check instead.
gcc/ChangeLog:
* config/aarch64/aarch64-c.cc (aarch64_update_cpp_builtins):
Replace TARGET_SVE{2} with explicit feature flag checks.
* config/aarch64/aarch64.cc
(aarch64_adjust_generic_arch_tuning): Add SME to SVE2 check.
* config/aarch64/aarch64.h (TARGET_SVE): Adjust condition.
(TARGET_SVE2): Ditto.
Alice Carlotti [Tue, 30 Dec 2025 08:53:57 +0000 (08:53 +0000)]
aarch64: Use __arm_get_current_vg for CFI
We can't use the cntd instruction in non-streaming mode if SVE is not
available, so instead use __arm_get_current_vg to get the value for the
VG save slot. This is more expensive, so continue using cntd if we know
we're in streaming mode or have +sve enabled.
gcc/ChangeLog:
* config/aarch64/aarch64-sme.md (UNSPEC_GET_CURRENT_VG): New
enum value.
(aarch64_get_current_vg): New insn.
* config/aarch64/aarch64.cc (aarch64_save_callee_saves): Use
__arm_get_current_vg if cntd is unavailable.
Alice Carlotti [Tue, 30 Dec 2025 08:52:24 +0000 (08:52 +0000)]
libgcc: aarch64: Add __arm_get_current_vg
AAPCS64* specifies several runtime support routines that must be
supported by any platform that supports SME. Add __arm_get_current_vg
to libgcc to help meet this requirement. This will be used to enable
support for SME without (non-streaming) SVE.
Alice Carlotti [Fri, 2 Jan 2026 13:59:02 +0000 (13:59 +0000)]
testsuite: Improve check-function-bodies logging
When a check-function-bodies test fails, it can sometimes be hard to
identify which part of a large function regexp is causing the failure.
To aid debugging these failures, find the largest initial set of lines
that matches the function, and log this separately from the remainder of
the regexp.
Additionally, add a newline before logging the function bodies, so that
the first line has the same indentation as the rest of that function.
gcc/testsuite/ChangeLog:
* lib/scanasm.exp (check_function_body): Log matching portion
of body_regexp separately.
fortran: Initialize gfc_se in PDT component allocation [PR123949]
Add missing gfc_init_se call for the default initializer case in
ALLOCATE_PDT_COMP. The adjacent KIND/LEN block (line 11118) and
pdt_string block (line 11149) both initialize tse, but this block
left it uninitialized, causing undefined behavior when tse.ss
contained stack garbage. Exposed as an ICE in gfc_conv_constant
(trans-const.cc:425) on aarch64 with LTO bootstrap.
PR fortran/123949
gcc/fortran/ChangeLog:
* trans-array.cc (structure_alloc_comps): Add missing
gfc_init_se call in case ALLOCATE_PDT_COMP for scalar
component default initializer.
Signed-off-by: Christopher Albert <albert@tugraz.at>
Jose E. Marchesi [Mon, 23 Feb 2026 00:29:56 +0000 (01:29 +0100)]
a68: more standard prelude in Algol 68
This commit moves the contents of libga68/transput.a68.in to
libga68/standard.a68.in and removes the built-in expansion of the
L_{int,real,exp}_width standard routines.
Signed-off-by: Jose E. Marchesi <jemarch@gnu.org>
libga68/ChangeLog
Jakub Jelinek [Sun, 22 Feb 2026 21:09:13 +0000 (22:09 +0100)]
c++: Fix up recent regression in convert_nontype_argument for C++1[14] [PR124173]
The following testcase is rejected since my recent convert_nontype_argument
change, but only in C++11/14 modes.
The problem is that C++17 says that all NTTPs should be converted constant
expressions, but C++11 only said that for integral and enumeration ones and
something that applied to the decltype(nullptr) case was
- a constant expression that evaluates to a null pointer value
The problem is that for NULLPTR_TYPE_P for C++11/14, we just never called
maybe_constant_value, so obviously just making sure it is integer_zerop and
without tf_error returning NULL_TREE otherwise changes behavior on valid
programs, we really need to constant evaluate it first.
The following patch fixes that.
I'm afraid I actually don't know what exactly C++14 specifies, whether I've
grabbed a pre-C++14 or post-C++14 draft, which looked like the C++17
wording. So, if C++14 needs something different, we'll need a further
change, but this at least fixes the regression.
2026-02-22 Jakub Jelinek <jakub@redhat.com>
PR c++/124173
* pt.cc (convert_nontype_argument): For C++11/C++14 handle
NULLPTR_TYPE_P non-type arguments like TYPE_PTR_P.
Jakub Jelinek [Sun, 22 Feb 2026 21:07:45 +0000 (22:07 +0100)]
c++: Fix up CWG 3123 expansion stmt handling once again [PR124184]
Barry Revzin mentioned in private mail that we reject the following
testcase even when it should be accepted.
The problem is that I thought finish_call_expr with tf_none would
be just harmless, but it is not, it can result in errors while trying
to instantiate something else (e.g. the noexcept).
So, instead of doing finish_call_expr with tf_none and only if that
returns error_mark_node calling it again with tf_any_viable, the
following patch just calls it only with tf_any_viable immediately.
2026-02-22 Jakub Jelinek <jakub@redhat.com>
PR c++/124184
* parser.cc (cp_perform_range_for_lookup): If tf_error is
missing, call finish_call_expr after perform_koenig_lookup
calls immediately with tf_any_viable instead of twice, once
with tf_none and then with tf_any_viable.
* pt.cc (finish_expansion_stmt): Remove unneeded parens.
Nathaniel Shead [Sat, 21 Feb 2026 11:32:25 +0000 (22:32 +1100)]
libcpp: Fix ICE with directives-only and cpp_maybe_module_directive [PR124153]
When doing directives-only processing (-E -fdirectives-only, or -M) we
crash if we hit an unexpected CPP_PRAGMA_EOL because we 'know' we're in
a module directive but the in_deferred_pragma flag is no longer set.
Fixed by undoing the "finished a module directive" behaviour within
cpp_maybe_module_directive if we're bailing due to an ill-formed peeked
token.
PR c++/124153
libcpp/ChangeLog:
* lex.cc (cpp_maybe_module_directive): Set in_deferred_pragma
and eol when we see an unexpected CPP_PRAGMA_EOL.
gcc/testsuite/ChangeLog:
* g++.dg/modules/cpp-22.C: New test.
Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
Nathaniel Shead [Sat, 21 Feb 2026 13:32:00 +0000 (00:32 +1100)]
libcpp: Fix reading from stdin with -fsearch-include-path [PR119756]
When using -fsearch-include-path, we prepend the result of
search_path_head to the provided filenames, which for non-absolute paths
will return "./". At this point, stdin is represented by the empty
string, and so prepending "./" confuses 'open_file'. This patch fixes
the issue by treating stdin as-if it were an absolute path.
PR c++/119756
libcpp/ChangeLog:
* files.cc (search_path_head): Also treat empty string (stdin)
as an absolute path.
Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
Nathaniel Shead [Sun, 22 Feb 2026 02:09:00 +0000 (13:09 +1100)]
driver: Escape special characters in '-fdeps-{file,target}' [PR120974]
The driver uses the 'join' function to calculate the default output for
the -fdeps-file and -fdeps-target parameters from the parameter given to
-o (or the basename of the input file). But if the path given to -o has
any whitespace in it this causes cc1plus to see arguments like
"-o some file.o" "-fdeps-file=some" "file.ddi"
which breaks. Fixed by adjusting the 'join' function to escape any
special characters in the result.
PR c++/120974
gcc/ChangeLog:
* gcc.cc (join_spec_func): Escape special characters.
Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
c++/reflection: anon union member from splice [PR123642]
Fixes a bogus "'Cls::<unnamed union>' is not a base of 'const Cls'" error
when user tries to do a class member lookup using splice with reflection of
anon union member.
PR c++/123642
gcc/cp/ChangeLog:
* typeck.cc (finish_class_member_access_expr): Change context lookup
to handle anon union members.
gcc/testsuite/ChangeLog:
* g++.dg/reflect/member4.C: Remove expected error.
* g++.dg/reflect/anon4.C: New test based on original bug report.
Eric Botcazou [Sun, 22 Feb 2026 10:23:35 +0000 (11:23 +0100)]
Ada: Fix crash on call to null procedure as triggering statement of select
This is really a corner case, but it exposes a couple of small issues in
Analyze_Triggering_Alternative that are worth fixing: 1) the detection of
delay and entry call statements is not robust enough and 2) there is also
a thinko in the detection of procedure call statements.
gcc/ada/
PR ada/124179
* sem_ch9.adb (Analyze_Triggering_Alternative): Use more robust
test for delay and entry call statements and fix thinko in test
for procedure call statements.
When updating the value of the stack pointer through a sequence of instruc-
tions, only the last instruction in the sequence must modify the stack
pointer, because the stack pointer may be referenced by an interrupt or
other event during the sequence:
* config/xtensa/xtensa.cc (constantsynth_pass1):
Add the case where the assignment destination is a stack pointer
to the exclusion criteria for processing.
Jose E. Marchesi [Sat, 21 Feb 2026 20:36:19 +0000 (21:36 +0100)]
a68: fix %%< and %%> marks in snprintf calls
The function a68_mode_error_text computes a string that is then passed
to a68_error or a68_warning. The later functions feed the resulting
string to the diagnostics machinery, which knows how to handle %< and
%>, but the *printf calls don't. Therefore the %s have to be escaped
for %< and %> to be interpreted literally.
Signed-off-by: Jose E. Marchesi <jemarch@gnu.org>
* a68-moids-diagnostics.cc (a68_mode_error_text): Properly escape
%< and %> in snprintf calls.
Jakub Jelinek [Sat, 21 Feb 2026 20:17:43 +0000 (21:17 +0100)]
libatomic: Fix race condition in libatomic all-local
In the past few bootstraps/regtests, I got occassionally one random FAIL
in libgomp testsuite, and the log said in each of the cases something like
obj02/x86_64-pc-linux-gnu/libgomp/testsuite/libgomp.log:/usr/bin/ld: error: /home/jakub/src/gcc/obj02/gcc/libatomic.so: file too short
obj02/x86_64-pc-linux-gnu/libgomp/testsuite/libgomp.log:/usr/bin/ld: error: /home/jakub/src/gcc/obj02/gcc/libatomic.so: file too short
obj05/i686-pc-linux-gnu/libgomp/testsuite/libgomp.log:/home/jakub/src/gcc/obj05/gcc/libatomic.so: file not recognized: file format not recognized
obj05/i686-pc-linux-gnu/libgomp/testsuite/libgomp.log:/home/jakub/src/gcc/obj05/gcc/libatomic.so: file not recognized: file format not recognized
I think what happens is that make check in libgomp and make check
in libatomic directories happen concurrently and in libatomic
there is the check -> check_recursive -> check-am -> all-am -> all-local
chain of dependencies. And all-local is like many other automake goals
.PHONY, so even when it depends on libatomic.la, it is reexecuted each time
and each time attempts to install libatomic*.{so,a}* again, which can race
with make check in other directories.
The following patch fixes it by just adding dependency for all-local
on stmp-libatomic file and only rule for that file dependent on libatomic.la
and performing the installation. So, if libatomic.la is not relinked, nothing
is reinstalled.
2026-02-21 Jakub Jelinek <jakub@redhat.com>
* Makefile.am (all-local): Depend on stmp-libatomic and otherwise
do nothing.
(stmp-libatomic): New goal, move all commands from all-local here plus
touch $@ at the end.
* Makefile.in: Regenerate.
Jose E. Marchesi [Sat, 21 Feb 2026 13:53:55 +0000 (14:53 +0100)]
a68: make Algol 68 diagnostics to use pp_format tags
This commit changes the Algol 68 front-end diagnostics so it uses
regular format strings as recognized as pp_format, instead of the
upper-letter tags inherited from Genie.
Signed-off-by: Jose E. Marchesi <jemarch@gnu.org>
gcc/algol68/ChangeLog
* a68-pretty-print.h: New file.
* a68.h: Mark prototypes of diagnostic functions with
ATTRIBUTE_A68_DIAG.
* a68-diagnostics.cc (diagnostic): Do not translate upper-case
tags and pass a copy of the va_list `args' to diagnostic_set_info.
Mark with ATTRIBUTE_A68_DIAG.
* a68-imports-archive.cc: Convert to use standard error format
tags.
* a68-parser-victal.cc: Likewise.
* a68-parser-top-down.cc: Likewise.
* a68-parser-taxes.cc: Likewise.
* a68-parser-scanner.cc: Likeise.
* a68-parser-moids-check.cc: Likewise.
* a68-parser-modes.cc: Likewise.
* a68-parser-extract.cc: Likewise.
* a68-parser-pragmat.cc: Likewise.
* a68-parser-scope.cc: Likewise.
* a68-parser-brackets.cc: Likewise.
* a68-parser-bottom-up.cc: LIkewise.
* a68-moids-diagnostics.cc: Likewise.
* a68-imports.cc: Likewise.
Jose E. Marchesi [Sat, 21 Feb 2026 16:12:24 +0000 (17:12 +0100)]
a68: fix handling of & in C formal hole symbols
Signed-off-by: Jose E. Marchesi <jemarch@gnu.org>
gcc/algol68/ChangeLog
* a68-low.cc (a68_make_formal_hole_decl): Get a boolean indicating
whether the declaration is for the address of the given symbol.
* a68.h: Update prototype of a68_make_formal_hole_decl.
* a68-low-holes.cc (a68_wrap_formal_var_hole): Pass a boolean to
a68_make_formal_hole_decl indicating whether an address is
required.
* Adds support to the FFI mechanism to map Algol 68 procedures
returning strings to an equivalent C interface.
* Adds a new command-line option -fbuilding-libga68.
* Adds support for having modules in libga68 implicitly invoked in
user-written programs and modules.
* Using the infrastructure agove, removes the compiler-generated glue
to call the standard POSIX prelude shipped in libga68 to, instead, use
the formal holes mechanism for FFI.
* Adds posix.a68 to libga68.
* Adds standard.a68 to libga68.
Signed-off-by: Jose E. Marchesi <jemarch@gnu.org>
gcc/algol68/ChangeLog
* a68-moids-misc.cc (a68_is_c_mode): Allow C formal holes for
routines yielding strings.
* a68-low-holes.cc (a68_wrap_formal_proc_hole): Support wrappers
that yield strings.
* a68.h: Remove a68_posix_* and a68_lower_posix* prototypes.
* a68-low-posix.cc: Remove.
* a68-imports.cc (a68_open_packet): Get argument filename.
* Make-lang.in (ALGOL68_OBJS): Remove algol68/a68-low-posix.o.
* a68-low-runtime.def: Remove POSIX_*.
* lang.opt (-fcheck): Add new undocumented option -fbuilding-libga68.
* a68-parser-prelude.cc (stand_transput): New function.
(posix_prelude): Remove hardcoded additions to the top-level
environment and use a68_extract_revelations instead.
* a68-parser-extract.cc (a68_extract_revelation): Renamed from
extract_revelation and made accessible externally.
* a68-low.cc (a68_make_formal_hole_decl): Remove unneeded check.
(lower_lude_decl): New function.
(lower_module_text): Add calls to preludes and postludes of
standard modules if not building libga68.
(a68_lower_particular_program): Likewise.
* a68-low-prelude.cc (a68_lower_posixargc): Remove.
(a68_lower_posixargv): Likewise.
(a68_lower_posixgetenv): Likewise.
(a68_lower_posixputchar): Likewise.
(a68_lower_posixputs): Likewise.
(a68_lower_posixfconnect): Likewise.
(a68_lower_posixfopen): Likewise.
(a68_lower_posixfcreate): Likewise.
(a68_lower_posixfclose): Likewise.
(a68_lower_posixfsize): Likewise.
(a68_lower_posixlseek): Likewise.
(a68_lower_posixseekcur): Likewise.
(a68_lower_posixseekend): Likewise.
(a68_lower_posixseekset): Likewise.
(a68_lower_posixstdinfiledes): Likewise.
(a68_lower_posixstdoutfiledes): Likewise.
(a68_lower_posixstderrfiledes): Likewise.
(a68_lower_posixfileodefault): Likewise.
(a68_lower_posixfileordwr): Likewise.
(a68_lower_posixfileordonly): Likewise.
(a68_lower_posixfileowronly): Likewise.
(a68_lower_posixfileotrunc): Likewise.
(a68_lower_posixerrno): Likewise.
(a68_lower_posixexit): Likewise.
(a68_lower_posixperror): Likewise.
(a68_lower_posixstrerror): Likewise.
(a68_lower_posixfputc): Likewise.
(a68_lower_posixfputs): Likewise.
(a68_lower_posixgetchar): Likewise.
(a68_lower_posixfgetc): Likewise.
(a68_lower_posixgets): Likewise.
(a68_lower_posixfgets): Likewise.
gcc/testsuite/ChangeLog
* lib/algol68.exp (algol68_init): Add -I options to
ALGOL68_UNDER_TEST so exports in libga68.{a,so} are found.
* algol68/compile/warning-hidding-6.a68: Likewise.
* algol68/compile/warning-hidding-5.a68: Use maxint instead of
getchar to trigger the warning.
* algol68/compile/error-nest-4.a68: Procedures yielding strings
are now on in C formal holes.
libga68/ChangeLog
* posix.a68: New file.
* standard.a68.in: Likewise.
* ga68-posix.c (_libga68_stdin): Define.
(_libga68_stdout): Likewise.
(_libga68_stderr): Likewise.
(_libga68_file_o_default): Likewise.
(_libga68_file_o_rdonly): Likewise.
(_libga68_file_o_rdwr): Likewise.
(_libga68_file_o_trunc): Likewise.
(_libga68_seek_cur): Likewise.
(_libga68_seek_end): Likewise.
(_libga68_seek_set): Likewise.
(_libga68_posixstrerror): Update interface to new way of returning
Algol 68 strings.
(_libga68_posixargv): Likewise.
(_libga68_posixfgets): Likewise.
(_libga68_posixgets): Likewise.
(_libga68_posixfopen): Use _libga68_file_o_default rather than FILE_O_DEFAULT.
(_libga68_posixfopen): Ditto for other FILE_O_* values.
* ga68.h: Update prototypes.
* Makefile.am (libga68_la_LIBADD): Add standard.lo.
(libga68_la_DEPENDENCIES): Likeise.
(.a68.o): Pass -fbuilding-libga68.
(.a68.lo): Likewise.
(standard.a68): New rule.
* Makefile.in: Regenerate.
* transput.a68.in: Add Emacs -*- mode: a68 -*- comment.
Jose E. Marchesi [Thu, 19 Feb 2026 02:46:57 +0000 (03:46 +0100)]
a68: distinguish between NO_LOWERER and LOWERER_UNIMPL
Until now all the identifiers interned in A68_STANDENV were lowered by
using an explicit lowering routine. This is because the entirely of
the standard preludes were implemented by having the compiler generate
the corresponding code inline. We have a check in place to determine
whether a lowerer has been installed for a given standard construct:
NO_LOWERER. This is a lowerer routine that just prints a message and
ICEs.
We want to write part of the standard preludes in Algol 68. To make
that possible this patch introduces a distinction between NO_LOWERER,
meaning the definition comes from Algol 68 code in the runtime library
and therefore does not use a lowering routine, and LOWERER_UNIMPL,
which means the definition uses a lowering routine but a proper one
has not been written yet.
Signed-off-by: Jose E. Marchesi <jemarch@gnu.org>
gcc/algol68/ChangeLog
* a68-types.h (NO_LOWERER): Redefine as NULL.
(LOWERER_UNIMPL): Define.
* a68-parser-prelude.cc (a68_idf): Use LOWERER_UNIMPL instead of
NO_LOWERER.
(a68_prio): Likewise.
(a68_op): Likewise.
* a68-low-units.cc (a68_lower_identifier): Do not assume
declarations in A68_STANDENV all have lowerers.
(a68_lower_formula): Likewise.
(a68_lower_monadic_formula): Likewise.
Jeff Law [Sat, 21 Feb 2026 18:49:11 +0000 (11:49 -0700)]
[PR rtl-optimization/123994] Bullet-proof RTL-SSA loop to determine insertion location
As discussed in the PR, there's two things we want to do WRT this bug.
First, we want to bullet-proof this loop. It's trying to find an insertion
point, but can run off the end of the insn chain in the process. That's enough
to fix the regression and the purpose of this patch.
For gcc-17 Richard S. has a more invasive change which fixes the underlying
cause of walking off the end of the insn chain. This patch has the potential
to trigger more combinations which in turn could trip over latent bugs, so we
agreed to defer that fix until the gcc-17 cycle out of an abundance of caution.
My fix has been bootstrapped and regression tested on x86. Pushing to the
trunk.
PR rtl-optimization/123994
gcc/
* rtl-ssa/changes.cc (function_info::verify_insn_changes): Bullet
proof loop to not fault if we run off the end of the insn chain.
gcc/testsuite/
* gcc.dg/torture/pr123994.c: New test.
Eric Botcazou [Fri, 20 Feb 2026 19:46:30 +0000 (20:46 +0100)]
Ada: Fix finalization glitch for pools with subpools
Finalize_Pool calls Finalize_And_Deallocate on every subpool handle, but
the parameter is declared with In Out mode, so the call ends up writing
back the updated value into the node that was just deallocated.
gcc/ada/
* libgnat/s-stposu.adb (Finalize_Pool): Pass a local copy of the
handle in the call to Finalize_And_Deallocate.
Fortran: Fix diagnostic for ambiguous pointer function assignment [PR80012]
The error message for an ambiguous pointer function assignment contained a
FIXME and an embedded newline that the diagnostics printer does not handle.
Split the single gfc_error call into a gfc_error for the main diagnostic
and an inform note for the F2008 explanation, wrapped in an
auto_diagnostic_group.
PR fortran/80012
gcc/fortran/ChangeLog:
* symbol.cc (gfc_add_procedure): Split error into gfc_error and
inform using auto_diagnostic_group.
Jerry DeLisle [Fri, 20 Feb 2026 00:59:16 +0000 (16:59 -0800)]
Fortran: [PR123949] Fix PDT ICE with large KIND values.
Signed-off-by: Christopher Albert <albert@tugraz.at>
PR fortran/123949
gcc/fortran/ChangeLog:
* decl.cc (gfc_get_pdt_instance): Use full integer string encoding
for PDT instance naming rather than 32-bit extraction, which caused
ICEs for valid large KIND values.
gcc/testsuite/ChangeLog:
* gfortran.dg/pdt_85.f03: New test.
* gfortran.dg/pr123949.f90: New test.
openmp: Fix regression in libgomp.c++/target-6.C testcase [PR113436]
The fix for PR113436 introduced a regression causing the
libgomp.c++/target-6.C testcase to fail on some configurations.
This was caused by a change in how is_variable_sized is applied for variables
that are references in private clauses, causing the path that was intended for
variables that are variable-sized in themselves to be taken, instead of
that for referencing a variable-sized object.
PR middle-end/113436
* omp-low.cc (omp_lower_target): Do not check for variable-length
variables in private clauses by reference when allocating memory.
Richard Biener [Wed, 18 Feb 2026 12:46:38 +0000 (13:46 +0100)]
tree-optimization/124068 - fix missed AVX2 vectorization of shift
The following fixes a regression in AVX2 vectorization because on
trunk we are now correctly determine we can shorten a shift operation
but we never really bothered to check we can implement the
resulting operation. With the patch we now check this. For shifts
and rotates we have the choice between vector-vector and vector-scalar
operations which in the end depends on whether we perform SLP or not
and how the shift operand matches up. The patch heuristically
assumes that constant or external shifts can be handled by vector-scalar
operations.
As we were not checking for target support was to allow recursive matching
other patterns, the following still errors on that side in case the
original operation was not supported by the target or it is binary and
the 2nd operand is a constant. This helps avoiding regressions in
gcc.dg/vect/vect-over-widen-13.c and gcc.dg/vect/vect-div-bitmask-1.c
and gcc.target/aarch64/sve2/div-by-bitmask_1.c where the operation in
question is integer division.
PR tree-optimization/124068
* tree-vect-patterns.cc (target_has_vecop_for_code): Move
earlier, add defaulted optab_subtype parameter.
(vect_recog_over_widening_pattern): Check that the target
supports the narrowed operation before committing to the
pattern.
Martin Jambor [Fri, 20 Feb 2026 13:34:27 +0000 (14:34 +0100)]
ipa-cp: Also look at self-recursive ancestor jump functions (PR122856)
PR 122856 shows that when looking at self recursive calls with
self-feeding jump functions, we did consider pass-through functions
but not ancestor functions with zero offsets. This then leads to the
fact that constants which were collected from IPA-CP lattices were not
among those collected from available edges, triggering a verification
assert.
This patch fixes that by also detecting self-feeding ancestor jump
functions.
gcc/ChangeLog:
2026-02-06 Martin Jambor <mjambor@suse.cz>
PR ipa/122856
* ipa-cp.cc (self_recursive_pass_through_p): Test jump function type first.
(self_recursive_ancestor_p): New function.
(find_scalar_values_for_callers_subset): Test also for self-recursive
ancestor jump functions.
(push_agg_values_for_index_from_edge): Likewise.
This fixes 2 related bugs. The user marks memmove as noreturn
so when we simplify the memmove to a memory load/store there
is no longer a statement that can alter the CFG and things go
down hill.
The same is true for removing the call in DSE.
So the fix is not to simplify/take into account the call from
gimple-fold and DSE.
changes since v1:
* v2: Use gimple_call_ctrl_altering_p instead of flags.
Robert Dubner [Fri, 20 Feb 2026 02:15:59 +0000 (21:15 -0500)]
cobol: Update and expand DejaGNU test suite.
The cobol.dg/group2 tests are extracted from a list of autotest programs
that are not maintained in the gnu GCC repository. They can be see at
/https://gitlab.cobolworx.com/COBOLworx/gcc-cobol.
Many of these tests have been refined in order to make them work
properly when the exec-charset is ASCII, EBCDIC, or UTF16. The changes
to existing tests seen here largely reflect those changes.
The new files shown below are newly extracted from that same list of
tests.
gcc/testsuite/ChangeLog:
* cobol.dg/group2/ALLOCATE_Rule_8_OPTION_INITIALIZE_with_figconst.cob: Updated.
* cobol.dg/group2/ALLOCATE_Rule_8_OPTION_INITIALIZE_with_figconst.out: Updated.
* cobol.dg/group2/ALPHABETIC-LOWER_test.cob: Updated.
* cobol.dg/group2/ALPHABETIC-UPPER_test.cob: Updated.
* cobol.dg/group2/ALPHABETIC_test.cob: Updated.
* cobol.dg/group2/Context_sensitive_words__1_.cob: Updated.
* cobol.dg/group2/DEBUG_Line.cob: Updated.
* cobol.dg/group2/DISPLAY__Sign_ASCII.cob: Updated.
* cobol.dg/group2/DISPLAY__Sign_ASCII.out: Updated.
* cobol.dg/group2/DISPLAY__Sign_ASCII__2_.cob: Updated.
* cobol.dg/group2/DISPLAY__Sign_ASCII__2_.out: Updated.
* cobol.dg/group2/EC-BOUND-REF-MOD_checking_process_termination.cob: Updated.
* cobol.dg/group2/FUNCTION_BIGGER-POINTER.cob: Updated.
* cobol.dg/group2/FUNCTION_BYTE-LENGTH.cob: Updated.
* cobol.dg/group2/FUNCTION_BYTE-LENGTH.out: Updated.
* cobol.dg/group2/FUNCTION_CHAR.cob: Updated.
* cobol.dg/group2/FUNCTION_DATE___TIME_OMNIBUS.cob: Updated.
* cobol.dg/group2/FUNCTION_HEX-OF.cob: Updated.
* cobol.dg/group2/FUNCTION_HEX-OF.out: Updated.
* cobol.dg/group2/FUNCTION_ORD.cob: Updated.
* cobol.dg/group2/FUNCTION_ORD.out: Updated.
* cobol.dg/group2/FUNCTION_TEST-DAY-YYYYDDD__2_.cob: Updated.
* cobol.dg/group2/FUNCTION_TEST-FORMATTED-DATETIME_additional.cob: Updated.
* cobol.dg/group2/FUNCTION_as_CALL_parameter_BY_CONTENT.cob: Updated.
* cobol.dg/group2/Hexadecimal_literal.cob: Updated.
* cobol.dg/group2/INSPECT_CONVERTING_TO_figurative_constants.cob: Updated.
* cobol.dg/group2/INSPECT_CONVERTING_TO_figurative_constants.out: Updated.
* cobol.dg/group2/LENGTH_OF_omnibus.cob: Updated.
* cobol.dg/group2/Non-numeric_data_in_numeric_items__2_.cob: Updated.
* cobol.dg/group2/PACKED-DECIMAL_dump.cob: Updated.
* cobol.dg/group2/PACKED-DECIMAL_dump.out: Updated.
* cobol.dg/group2/Refmod__comparisons_inside_numeric-display.cob: Updated.
* cobol.dg/group2/Refmod_sources_are_figurative_constants.cob: Updated.
* cobol.dg/group2/Refmod_sources_are_figurative_constants.out: Updated.
* cobol.dg/group2/debugging_lines__not_active_.cob: Updated.
* cobol.dg/group2/floating-point_SUBTRACT_FORMAT_2.out: Updated.
* cobol.dg/group2/floating-point_literals.out: Updated.
* cobol.dg/group2/37-digit_Initialization_of_fundamental_types.cob: New test.
* cobol.dg/group2/37-digit_Initialization_of_fundamental_types.out: New test.
* cobol.dg/group2/ACCEPT_FROM_ENVIRONMENT-NAME.cob: New test.
* cobol.dg/group2/ACCEPT_FROM_ENVIRONMENT-NAME.out: New test.
* cobol.dg/group2/ACCEPT_foo_FROM_COMMAND-LINE_1_.cob: New test.
* cobol.dg/group2/ADD_1_2_TO_3_GIVING_B.cob: New test.
* cobol.dg/group2/ALLOCATE_Rules_6_-_9._Without_OPTION_INITIALIZE_Without_-fdefaultbyte___ASCII_.cob:
New test.
* cobol.dg/group2/ALLOCATE_Rules_6_-_9._Without_OPTION_INITIALIZE_Without_-fdefaultbyte___ASCII_.out:
New test.
* cobol.dg/group2/ALLOCATE_Rules_6_-_9._Without_OPTION_INITIALIZE_Without_-fdefaultbyte___EBCDIC_.cob:
New test.
* cobol.dg/group2/ALLOCATE_Rules_6_-_9._Without_OPTION_INITIALIZE_Without_-fdefaultbyte___EBCDIC_.out:
New test.
* cobol.dg/group2/ALLOCATE_Rules_6_-_9_Without_OPTION_INITIALIZE_With_-fdefaultbyte___UTF16_.cob:
New test.
* cobol.dg/group2/ALLOCATE_Rules_6_-_9_Without_OPTION_INITIALIZE_With_-fdefaultbyte___UTF16_.out:
New test.
* cobol.dg/group2/ANY_LENGTH__7_.cob: New test.
* cobol.dg/group2/ANY_LENGTH__7_.out: New test.
* cobol.dg/group2/Assorted_SPECIAL-NAMES_CLASS.cob: New test.
* cobol.dg/group2/Assorted_SPECIAL-NAMES_CLASS.out: New test.
* cobol.dg/group2/BINARY_and_COMP-5.cob: New test.
* cobol.dg/group2/BINARY_and_COMP-5.out: New test.
* cobol.dg/group2/CDF2_-_DEFINE_FOO_AS_literal-1.cob: New test.
* cobol.dg/group2/CDF2_-_DEFINE_FOO_AS_literal-1.out: New test.
* cobol.dg/group2/CDF2_Trouble_with___IF__1_.cob: New test.
* cobol.dg/group2/CDF2_Trouble_with___IF__2_.cob: New test.
* cobol.dg/group2/CDF2_Trouble_with___IF__2_.out: New test.
* cobol.dg/group2/CDF4_.cob: New test.
* cobol.dg/group2/CDF4_.out: New test.
* cobol.dg/group2/CDF_Feature_.cob: New test.
* cobol.dg/group2/CDF_Feature_.out: New test.
* cobol.dg/group2/CDF_IS_NOT_DEFINED.cob: New test.
* cobol.dg/group2/CDF_IS_NOT_DEFINED.out: New test.
* cobol.dg/group2/CDF__1__IF____text_.cob: New test.
* cobol.dg/group2/CDF__1__IF____text_.out: New test.
* cobol.dg/group2/CDF__2__IF____number_.cob: New test.
* cobol.dg/group2/CDF__2__IF____number_.out: New test.
* cobol.dg/group2/CDF__3__ALL_NUMERIC_COMPARISONS.cob: New test.
* cobol.dg/group2/CDF__3__ALL_NUMERIC_COMPARISONS.out: New test.
* cobol.dg/group2/COMP-5_Sanity_Check_.cob: New test.
* cobol.dg/group2/Complex_HEX__VALUE_and_MOVE_-_ASCII_EBCDIC.cob: New test.
* cobol.dg/group2/Complex_HEX__VALUE_and_MOVE_-_ASCII_EBCDIC.out: New test.
* cobol.dg/group2/Complex_INITIALIZE_with_nested_tables__1_.cob: New test.
* cobol.dg/group2/Complex_INITIALIZE_with_nested_tables__1_.out: New test.
* cobol.dg/group2/Complex_INITIALIZE_with_nested_tables__2_.cob: New test.
* cobol.dg/group2/Complex_INITIALIZE_with_nested_tables__2_.out: New test.
* cobol.dg/group2/Default_Arithmetic__1_.cob: New test.
* cobol.dg/group2/Default_Arithmetic__1_.out: New test.
* cobol.dg/group2/ENTRY_statement.cob: New test.
* cobol.dg/group2/ENTRY_statement.out: New test.
* cobol.dg/group2/EVALUATE__A__OR__a_.cob: New test.
* cobol.dg/group2/EVALUATE__A__OR__a_.out: New test.
* cobol.dg/group2/EVALUATE_condition__1_.cob: New test.
* cobol.dg/group2/EVALUATE_condition__1_.out: New test.
* cobol.dg/group2/FIND-STRING__forward_.cob: New test.
* cobol.dg/group2/FIND-STRING__forward_.out: New test.
* cobol.dg/group2/FIND-STRING__reverse_.cob: New test.
* cobol.dg/group2/FIND-STRING__reverse_.out: New test.
* cobol.dg/group2/FIXED_FORMAT_data_in_cols_73_and_beyond.cob: New test.
* cobol.dg/group2/FIXED_FORMAT_data_in_cols_73_and_beyond.out: New test.
* cobol.dg/group2/FIXED_FORMAT_data_misplaced_asterisk.cob: New test.
* cobol.dg/group2/FUNCTION_CONVERT.cob: New test.
* cobol.dg/group2/FUNCTION_CONVERT.out: New test.
* cobol.dg/group2/Fundamental_INSPECT_BACKWARD_REPLACING.cob: New test.
* cobol.dg/group2/Fundamental_INSPECT_BACKWARD_REPLACING.out: New test.
* cobol.dg/group2/Fundamental_INSPECT_BACKWARD_TALLYING.cob: New test.
* cobol.dg/group2/Fundamental_INSPECT_BACKWARD_TALLYING.out: New test.
* cobol.dg/group2/Fundamental_INSPECT_REPLACING.cob: New test.
* cobol.dg/group2/Fundamental_INSPECT_REPLACING.out: New test.
* cobol.dg/group2/Fundamental_INSPECT_TALLYING.cob: New test.
* cobol.dg/group2/Fundamental_INSPECT_TALLYING.out: New test.
* cobol.dg/group2/INITIALIZE_OCCURS_with_SIGN_LEADING___TRAILING.cob: New test.
* cobol.dg/group2/INITIALIZE_OCCURS_with_SIGN_LEADING___TRAILING.out: New test.
* cobol.dg/group2/INITIALIZE_OCCURS_with_numeric_edited.cob: New test.
* cobol.dg/group2/INITIALIZE_complex_group__1_.cob: New test.
* cobol.dg/group2/INITIALIZE_complex_group__2_.cob: New test.
* cobol.dg/group2/INITIALIZE_complex_group__2_.out: New test.
* cobol.dg/group2/INITIALIZE_group_entry_with_OCCURS.cob: New test.
* cobol.dg/group2/INITIALIZE_of_EXTERNAL_data_items.cob: New test.
* cobol.dg/group2/INITIALIZE_with_-defaultbyte__ASCII_.cob: New test.
* cobol.dg/group2/INITIALIZE_with_-defaultbyte__ASCII_.out: New test.
* cobol.dg/group2/INITIALIZE_with_-defaultbyte__EBCDIC_.cob: New test.
* cobol.dg/group2/INITIALIZE_with_-defaultbyte__EBCDIC_.out: New test.
* cobol.dg/group2/INITIALIZE_with_FILLER.cob: New test.
* cobol.dg/group2/INITIALIZE_with_REDEFINES.cob: New test.
* cobol.dg/group2/INITIALIZE_with_reference_modification.cob: New test.
* cobol.dg/group2/Intrinsic_Function_ABS.cob: New test.
* cobol.dg/group2/Intrinsic_Function_ACOS.cob: New test.
* cobol.dg/group2/Intrinsic_Function_ANNUITY.cob: New test.
* cobol.dg/group2/Intrinsic_Function_DATE-YYYYMMDD.cob: New test.
* cobol.dg/group2/Intrinsic_Function_NUMVAL.cob: New test.
* cobol.dg/group2/Intrinsic_Function_NUMVAL.out: New test.
* cobol.dg/group2/Long_Division.cob: New test.
* cobol.dg/group2/Long_Division.out: New test.
* cobol.dg/group2/MOVE_X_000203_.cob: New test.
* cobol.dg/group2/MOVE_X_000203_.out: New test.
* cobol.dg/group2/MOVE_to_JUSTIFIED_items.cob: New test.
* cobol.dg/group2/MOVE_to_JUSTIFIED_items.out: New test.
* cobol.dg/group2/N-Queens_algorithm.cob: New test.
* cobol.dg/group2/N-Queens_algorithm.out: New test.
* cobol.dg/group2/Numeric_operations__6_.cob: New test.
* cobol.dg/group2/Numeric_operations__6_.out: New test.
* cobol.dg/group2/Preserve_collation_past_a_CALL.cob: New test.
* cobol.dg/group2/Preserve_collation_past_a_CALL.out: New test.
* cobol.dg/group2/RETURN-CODE_moving.cob: New test.
* cobol.dg/group2/RETURN-CODE_nested.cob: New test.
* cobol.dg/group2/SORT__table_sort__2___ASCII_.cob: New test.
* cobol.dg/group2/SORT__table_sort__2___ASCII_.out: New test.
* cobol.dg/group2/SORT__table_sort__2___EBCDIC_.cob: New test.
* cobol.dg/group2/SORT__table_sort__2___EBCDIC_.out: New test.
* cobol.dg/group2/Simple_DEBUG-ITEM.cob: New test.
* cobol.dg/group2/Simple_DEBUG-ITEM.out: New test.
* cobol.dg/group2/Simple_ENVIRONMENT-NAME_with_exception.cob: New test.
* cobol.dg/group2/Simple_ENVIRONMENT-NAME_with_exception.out: New test.
* cobol.dg/group2/UNSTRING_with_refmods.cob: New test.
* cobol.dg/group2/UNSTRING_with_refmods.out: New test.
* cobol.dg/group2/command-line.cob: New test.
* cobol.dg/group2/command-line.out: New test.
* cobol.dg/group2/floating-point_FORMAT_1.cob: New test.
* cobol.dg/group2/floating-point_FORMAT_1.out: New test.
* cobol.dg/group2/floating-point_FORMAT_2.cob: New test.
* cobol.dg/group2/floating-point_FORMAT_2.out: New test.
* cobol.dg/group2/procedure_division_using_by.cob: New test.
* cobol.dg/group2/repository.cob: New test.
* cobol.dg/group2/skipping_at_the_top.cob: New test.
* cobol.dg/group2/source-computer_object-computer_repository__2_.cob: New test.
Tomasz Kamiński [Wed, 18 Feb 2026 09:38:04 +0000 (10:38 +0100)]
libstdc++: Rework constant_wrapper assignments and increments
This implements LWG4383 with LWG4500, LWG4523 follow-up corrections.
This patch changes the constant_wrapper assignments operator (including
compounds), increment and decrement to apply directly to value. In
consequence the operators are only supported for types, for which above
operations can be applied on const value.
libstdc++-v3/ChangeLog:
* include/std/type_traits (_CWOperators::operator++)
(_CWOperators::operator--, _CWOperators::operator+=)
(_CWOperators::operator-=, _CWOperators::operator*=)
(_CWOperators::operator/=, _CWOperators::operator%=)
(_CWOperators::operator&=, _CWOperators::operator|=)
(_CWOperators::operator^=, _CWOperators::operator<<=)
(_CWOperators::operator>>=, constant_wrapper::operator=):
Adjust definitions to apply operator on value.
* testsuite/20_util/constant_wrapper/generic.cc:
Remove test_pseudo_mutator.
* testsuite/20_util/constant_wrapper/instantiate.cc:
Test that operators are not provided if wrapped type
do not support them, or provide mutable operators.
Jonathan Wakely [Tue, 17 Feb 2026 12:48:51 +0000 (12:48 +0000)]
libstdc++: Use global variables for default/max std in libstdc++.exp
This simplifies the v3-minimum-std procedure slightly, but the main
advantage is making v3_modules_std depend on v3_max_std so that we don't
have to update two separate variables when new effective targets such as
c++29 get added.
libstdc++-v3/ChangeLog:
* testsuite/lib/libstdc++.exp (v3_default_std, v3_max_std): New
global variables.
(v3-minimum-std): Use globals instead of arguments.
(v3_modules_std): Define in terms of $v3_max_std.
(v3-dg-runtest): Use globals instead of local variables. Adjust
call to v3-min-std.
Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
jlaw [Thu, 19 Feb 2026 14:04:27 +0000 (07:04 -0700)]
[PR tree-optimization/124108] Verify type_has_mode_precision before reassociating expressions
As Andrew noted in pr124108, the two patterns that reassociate expressions to
expose a rotate hidden by an embedded XOR need to check
type_has_mode_precision_p to avoid an ICE during gimple->RTL expansion.
This adds the necessary checks. Bootstrapped and regression tested on x86.
PR tree-optimization/124108
gcc/
* match.pd (reassociating XOR to expose rotations): Check
type_has_mode_precision_p before simplifying.
gcc/testsuite/
* gcc.dg/torture/pr124108.c: New test.
Marek Polacek [Wed, 18 Feb 2026 20:03:35 +0000 (15:03 -0500)]
c++/reflection: introduce METAFN_KIND_ARG
This is mostly cosmetic. It had to be a macro because a constexpr fn
would need a metafn_info* parameter but that struct comes only after
the %{ %} section in the gperf file, and we can only have one such
section.
Thomas Schwinge [Thu, 19 Feb 2026 10:29:42 +0000 (11:29 +0100)]
Further fix up effective-target 'no_fsanitize_address' check
That got added with commit r11-4762-g65e82636bcdb72a878c2e53943e71b15dd9fb22d
"PR target/96307: Fix KASAN option checking", and already fixed up in
commit r12-3723-g6e6bf4cd21af39a7923bae007517ab43a4c3b36a
"Fix no_fsanitize_address effective target", but I just realized that on, for
example, standard x86_64-pc-linux-gnu, I'm unexpectedly seeing test cases
UNSUPPORTED, due to the effective-target 'no_fsanitize_address' check failing
with:
Executing on host: [...]/build-gcc/gcc/xgcc -B[...]/build-gcc/gcc/ fsanitize_address3454287.c -fdiagnostics-plain-output -fsanitize=address -Wno-complain-wrong-lang -lm -o fsanitize_address3454287.exe (timeout = 300)
spawn [...]
/usr/bin/ld: cannot find libasan_preinit.o: No such file or directory
/usr/bin/ld: cannot find -lasan: No such file or directory
collect2: error: ld returned 1 exit status
compiler exited with status 1
Notice no setup for paths to build-tree libsanitizer. Need to use a proper
'asan.exp' file with 'asan_init'/'asan_finish' calls to set up linker paths,
etc. -- however, all test cases using effective-target 'no_fsanitize_address'
are compilation test cases, so let's just reflect that in the effective-target
'no_fsanitize_address' check. With that, I then get the desired:
-UNSUPPORTED: gcc.dg/pr91441.c
+PASS: gcc.dg/pr91441.c (test for excess errors)
-UNSUPPORTED: gcc.dg/pr96260.c
+PASS: gcc.dg/pr96260.c (test for excess errors)
-UNSUPPORTED: gcc.dg/pr96307.c
+PASS: gcc.dg/pr96307.c (test for excess errors)
-UNSUPPORTED: gcc.dg/uninit-pr93100.c
+PASS: gcc.dg/uninit-pr93100.c (test for warnings, line 16)
+PASS: gcc.dg/uninit-pr93100.c (test for warnings, line 26)
+PASS: gcc.dg/uninit-pr93100.c (test for warnings, line 38)
+PASS: gcc.dg/uninit-pr93100.c (test for warnings, line 48)
+PASS: gcc.dg/uninit-pr93100.c (test for warnings, line 61)
+PASS: gcc.dg/uninit-pr93100.c (test for warnings, line 71)
+PASS: gcc.dg/uninit-pr93100.c (test for excess errors)
-UNSUPPORTED: g++.dg/warn/uninit-pr93100.C -std=gnu++20
+PASS: g++.dg/warn/uninit-pr93100.C -std=gnu++20 (test for warnings, line 13)
+PASS: g++.dg/warn/uninit-pr93100.C -std=gnu++20 (test for warnings, line 20)
+PASS: g++.dg/warn/uninit-pr93100.C -std=gnu++20 (test for warnings, line 31)
+PASS: g++.dg/warn/uninit-pr93100.C -std=gnu++20 (test for warnings, line 38)
+PASS: g++.dg/warn/uninit-pr93100.C -std=gnu++20 (test for warnings, line 49)
+PASS: g++.dg/warn/uninit-pr93100.C -std=gnu++20 (test for warnings, line 56)
+PASS: g++.dg/warn/uninit-pr93100.C -std=gnu++20 (test for excess errors)
[Etc.]
-UNSUPPORTED: g++.dg/warn/uninit-pr95825-1.C -std=gnu++20
+PASS: g++.dg/warn/uninit-pr95825-1.C -std=gnu++20 (test for bogus messages, line 17)
+PASS: g++.dg/warn/uninit-pr95825-1.C -std=gnu++20 (test for excess errors)
[Etc.]
-UNSUPPORTED: gnat.dg/asan1.adb
+PASS: gnat.dg/asan1.adb (test for excess errors)
..., while these remain UNSUPPORTED for targets that don't support
'-fsanitize=address'.
gcc/testsuite/
* lib/target-supports.exp
(check_effective_target_no_fsanitize_address): Check 'assembly'
instead of 'executable'.
Filip Kastl [Mon, 16 Feb 2026 08:57:14 +0000 (09:57 +0100)]
contrib/filter-clang-warnings.py: Ignore all .texi
Compiling GCC with Clang doesn't only yield Clang's warnings but also
warnings about .texi documentation files. In filter-clang-warnings.py
we blacklisted some .texi files. Blacklist all of them.
contrib/ChangeLog:
* filter-clang-warnings.py: Filter out all warnings comming from
files with ".texi" in their name.
Jakub Jelinek [Thu, 19 Feb 2026 06:56:59 +0000 (07:56 +0100)]
i386: Use IN_RANGE in avx_vpermilp_parallel
On Wed, Feb 18, 2026 at 10:00:38AM +0100, Uros Bizjak wrote:
> BTW: Maybe IN_RANGE should be used more in this function? IMO,
> "!IN_RANGE (ipar[i], 2,3)" is easier to comprehend.
This patch does that.
2026-02-19 Jakub Jelinek <jakub@redhat.com>
* config/i386/i386.cc (avx_vpermilp_parallel): Use IN_RANGE
macro.
Jakub Jelinek [Thu, 19 Feb 2026 06:55:38 +0000 (07:55 +0100)]
c++: Fix up convert_nontype_argument [PR124070]
Some of the following testcases are incorrectly accepted.
The problem is in convert_nontype_argument. It just does
maybe_constant_value earlier. Later on for integral/enum/floating
point args it uses cxx_constant_value for complain & tf_error if
not val_dep_p and expr is not a simple constant, similarly for
class type it calls
/* Replace the argument with a reference to the corresponding template
parameter object. */
if (!val_dep_p)
expr = create_template_parm_object (expr, complain);
if (expr == error_mark_node)
return NULL_TREE;
etc. But for NULLPTR_TYPE_P and REFLECTION_TYPE_P cases (I bet
Marek has based the latter on the former) it only verifies the type
and not the actual expression.
I think we need to do that, because if maybe_constant_value fails, it
just returns the passed in argument and if nothing checks it, we accept
whatever was there (and sometimes ICE later).
The following patch implements that.
2026-02-19 Jakub Jelinek <jakub@redhat.com>
PR c++/124070
* pt.cc (convert_nontype_argument): For NULLPTR_TYPE_P case
if expr is not integer_zerop and is not val_dep_p try harder,
for complain & tf_error use cxx_constant_value and return NULL_TREE
for error_mark_node, without tf_error return NULL_TREE. Similarly
for REFLECTION_TYPE_P case if expr is not REFLECT_EXPR and is not
val_dep_p try harder like for NULLPTR_TYPE_P.
* g++.dg/cpp26/pr124070.C: New test.
* g++.dg/reflect/parameters_of4.C: Expect different diagnostics.
* g++.dg/reflect/define_aggregate7.C: New test.
* g++.dg/reflect/define_aggregate8.C: New test.
Jakub Jelinek [Thu, 19 Feb 2026 06:51:50 +0000 (07:51 +0100)]
++: Implement proposed CWG 3123 resolution
On Wed, Feb 11, 2026 at 02:56:36AM +0200, Ville Voutilainen wrote:
> > Anyway, with the hope that CWG 3123 is voted in, this patch adds
> > a testcase for it.
>
> This was discussed some moments ago on the Core reflector, and it was
> pointed out that it's quite
> intentional in the proposed resolution of CWG 3123 that there's no
> overload resolution used for
> determining whether iteration is the chosen approach instead of
> destructuring, just a viability check.
> As far as I understand the code, finish_call_expr indeed does overload
> resolution.
>
> This additional testcase was provided: https://godbolt.org/z/o39hEs876
>
> In it, overload resolution fails due to an ambiguity, for iteration,
> and then destructuring is used instead. But the intent
> of the proposed resolution is that the semantics are (more) similar to
> what range-for uses, so the intent
> is that for iteration, only the presence of viable overloads is
> checked, and then iteration is committed to,
> and then the testcase should be rejected because the actual attempt to
> expand with iteration fails due to the aforementioned
> ambiguity.
>
> None of that affects this patch as such, but I think it's worth
> pointing out where this should eventually be going.
Ah, you're right.
We don't have any API to return whether there are any viable candidates.
I was looking into adding one, but realized that finish_call_expr
does way too many things before calling build_new_function_call
which does further stuff that
would also need to be duplicated before we can reach to splice_viable.
So, instead of duplicating all of that I've added tf_any_viable (using
an unused bit in tsubst_flags_t), which is then handled in
finish_call_expr, perform_overload_resolution and build_new_function_call
functions to return void_node instead of actually building any calls
if there are any viable candidates (and keep returning error_mark_node
if something earlier fails or there are no viable candidates)
and filtered out of complain flags for calls where it shouldn't be propagated.
The new testcase adds some extra new tests, e.g. struct with begin and
end non-static data members (my reading is that in that case E.begin
and E.end has been found, so we commit to iterating expansion stmt and
fail unless e.g. they whould have class type and usable operator ()).
2026-02-19 Jakub Jelinek <jakub@redhat.com>
* cp-tree.h: Implement proposed CWG 3123 resolution.
(enum tsubst_flags): Add tf_any_viable enumerator. Indent all
comments the same.
* call.cc (perform_overload_resolution): For tf_any_viable
return the first candidate instead of doing tourney. Filter out
tf_any_viable flag from add_candidates call.
(build_new_function_call): For tf_any_viable return void_node
if any viable candidates are found rather than build_over_call.
Filter out tf_any_viable flag from resolve_args call.
* parser.cc (cp_perform_range_for_lookup): Pass COMPLAIN to
cp_range_for_member_function calls. If not tf_error, for
successful ADL if one or both of finish_call_expr calls returns
error_mark_node, retry with tf_any_viable. If both begin and
end expressions have a viable candidate or when member lookup
found both begin and end members, return NULL_TREE rather than
error_mark_node even when both *begin and *end are error_mark_node.
(cp_range_for_member_function): Add COMPLAIN argument, pass it
down to finish_class_member_access_expr and finish_call_expr.
* pt.cc (finish_expansion_stmt): Use esk_iterating if
cp_perform_range_for_lookup returned something other than
error_mark_node or if both begin_expr and end_expr are not
error_mark_node.
* semantics.cc (finish_call_expr): Filter out tf_any_viable
flag from all uses of complain except one build_new_function_call
call for the is_overloaded_fn case.
* g++.dg/cpp26/expansion-stmt29.C: New test.
* g++.dg/cpp26/expansion-stmt30.C: New test.
Robert Dubner [Thu, 19 Feb 2026 04:01:38 +0000 (23:01 -0500)]
cobol: Improve generated code for fast_add and fast_subtract.
These changes improve the efficiency of generated code by recognizing
more instances where operations are on little-endian binary COBOL
variables and then avoiding calls to libgcobol. The generated code
also reduces the number of intermediate variables created for that
little-endian arithmetic.
gcc/cobol/ChangeLog:
* genapi.cc (tree_type_from_field_type): Move static code.
(compare_binary_binary): Identify little-endian compares.
(psa_FldLiteralN): Eliminate obsolete development code; make the
initialized variables TREE_CONSTANT.
(parser_symbol_add): Adjust for modified FldLiteralN.
* genmath.cc (all_results_binary): Renamed. Modified for fastness.
(all_results_integer): Likewise.
(all_refers_integer): Likewise.
(largest_binary_term): Likewise.
(fast_add): Expand conditions. Use get_binary_value_tree.
(fast_subtract): Likewise.
(fast_multiply): Expand conditions.
(fast_divide): Expand conditions.
(parser_add): Avoid fast_add when error or not-error are specified.
(parser_multiply): Likewise.
(parser_divide): Likewise.
(parser_subtract): Likewise.
* genutil.cc (tree_type_from_field): Disable; flagged for removal.
(get_binary_value): Use get_binary_value_tree.
(get_binary_value_tree): Avoid intermediate variables when possible.
(refer_is_clean): Formatting.
(is_pure_integer): Refine test for little-endian binary.
* genutil.h (get_binary_value_tree): New declaration.
(is_pure_integer): New declaration.
* symbols.cc (symbol_table_init): Explanatory ZEROS comment.
libgcobol/ChangeLog:
* gfileio.cc (__gg__file_reopen): Raise exception on failed OPEN
* gmath.cc (__gg__fixed_phase2_assign_to_c): Let pointer arithmetic
go negative.
(__gg__subtractf2_fixed_phase1): Edit a comment.
David Malcolm [Thu, 19 Feb 2026 02:58:32 +0000 (21:58 -0500)]
testsuite: remove xfails from analyzer test [PR108400,PR124116]
gcc/testsuite/ChangeLog:
PR analyzer/108400
PR analyzer/124116
* c-c++-common/analyzer/null-deref-pr108400-SoftEtherVPN-WebUi.c:
Remove xfails; these false positives appears to have been fixed by r16-7365-g498fb8a24516b1.
Signed-off-by: David Malcolm <dmalcolm@redhat.com>
Pan Li [Tue, 17 Feb 2026 11:15:36 +0000 (19:15 +0800)]
RISC-V: Add another combine pattern for vfmin/max on cost model
The recent change introduce another form of vfmin/max, which is
more "literal" compare the previous one. The related vx_vf/vf*
test cases also failed due to this change. Thus, add the pattern
to make the test case happy.
The below test suites are passed for this patch series.
* The rv64gcv fully regression test.
* Fix the vx_vf/vf* testcases.
gcc/ChangeLog:
* config/riscv/autovec-opt.md (*literal_v<ieee_fmaxmin_op>_vf_<mode>):
Add new pattern for vfmax/min combine to fx.
Jerry DeLisle [Thu, 19 Feb 2026 00:19:26 +0000 (16:19 -0800)]
Fortran: Fix heap-use-after-free
This fix stops freeing the current BLOCK namespace during malformed
END error recovery. It now lets normal block unwinding/cleanup handle
the free, preventing the heap-use-after-free.
Suggested-by: Jakub Jelinek <jakub@redhat.com> Signed-off-by: Christopher Albert <albert@tugraz.at>
PR fortran/122491
gcc/fortran/ChangeLog:
* decl.cc (gfc_match_end): Do not free current BLOCK namespace
during malformed END cleanup.
Andrew Pinski [Wed, 18 Feb 2026 05:42:30 +0000 (21:42 -0800)]
cprop_hardreg: Use delete_insn_and_edges instead of delete_insn [PR116053]
So delete_insn_and_edges was added explicitly to solve the problem of having
to cleanup the dead eh edges when a load becomes dead (non-trapping in this case).
This moves the one call to delete_insn in cprop_hardreg over to use delete_insn_and_edges
to fix this case.
Basically we copyprop the sp register into a memory load. This memory load is normally
dead way before but with non-call eh and -fno-delete-dead-exceptions, it is alive until
cprop_hardreg. After thie copy prop of the sp register into the memory address of the load,
the load becomes non-trapping and is allowed to be deleted. Except we don't remove the eh edges
because cprop_hardreg only called delete_insn. So this updates the call to delete_insn_and_edges
which removes the eh edges.
Bootstrapped and tested on x86_64-linux-gnu with no regressions.
PR rtl-optimization/116053
gcc/ChangeLog:
* regcprop.cc (copyprop_hardreg_forward_1): Use delete_insn_and_edges
instead of delete_insn.
gcc/testsuite/ChangeLog:
* gcc.dg/pr116053-1.c: New test.
Signed-off-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
[PR120169, LRA]: Fix up REG_ARGS_SIZE note for output reloads
In this test case, LRA reloads arg push insn but does not move original
REG_ARGS_SIZE note to the reload insn which becomes a new arg push. The
patch fixes it.
gcc/ChangeLog:
PR rtl-optimization/120169
* lra-int.h (lra_process_new_insns): Modify the prototype.
* lra.cc (lra_process_new_insns): Add arg fixup_reg_args_size with
implicit value. Move REG_ARGS_SIZE note if necessary.
* lra-constraints.cc (curr_insn_transform): Pass the new arg value.
AMDGCN: Disable subdirectory configuration for unsupported GAS and LD
The `amdgcn' target is not supported by GAS or LD, so disable building
in the respective subdirectories, removing configuration errors such as:
This target is no longer supported in gas
make[1]: *** [Makefile:5473: configure-gas] Error 1
and:
*** ld does not support target amdgcn-unknown-none
*** see ld/configure.tgt for supported targets
make[1]: *** [Makefile:6968: configure-ld] Error 1
in builds where no explicit `--disable-gas' and `--disable-ld' options
have been used with the top-level `configure' script. Users must not
have to disable features selected by default to get a working
configuration.
Jakub Jelinek [Wed, 18 Feb 2026 16:46:38 +0000 (17:46 +0100)]
c: Call relayout_decl in build_compound_literal when completing type [PR123365]
Most other spots inthe C FE which change type of some VAR_DECL
through complete_array_type call relayout_decl to fix up DECL_MODE
etc., but build_compound_literal strangely does not.
It has layout_decl (decl, 0); call later on but I think that is
quite useless given that already the build_decl call earlier
calls that and so the second layout_decl probably does nothing
most of the time.
On the following testcase, the compound literal VAR_DECL has
BLKmode from the time it had incomplete array type and isn't
changed to DImode that the completed type has and asm stmt
expansion is unhappy about that.
Fixed thusly.
2026-02-18 Jakub Jelinek <jakub@redhat.com>
PR c/123365
* c-decl.cc (build_compound_literal): Call relayout_decl
after completing the type.