]> git.ipfire.org Git - thirdparty/gcc.git/log
thirdparty/gcc.git
2 months agotestsuite/123175 - Use int32_t instead of int in vec-type construction.
Georg-Johann Lay [Mon, 19 Jan 2026 17:33:30 +0000 (18:33 +0100)] 
testsuite/123175 - Use int32_t instead of int in vec-type construction.

gcc/testsuite/
PR testsuite/123175
* gcc.dg/torture/pr123175-1.c: Use int32_t instead of int in
vec-type construction.
* gcc.dg/torture/pr123175-2.c: Same.

2 months ago[PR target/113666] Simplify VEC_EXTRACT from a uniform vector
Jeff Law [Mon, 19 Jan 2026 14:44:54 +0000 (07:44 -0700)] 
[PR target/113666] Simplify VEC_EXTRACT from a uniform vector

This fixes a P3 regression relative to gcc-13 on the RISC-V platform for this code:

> unsigned char a;
>
> int main() {
>   short b = a = 0;
>   for (; a != 19; a++)
>     if (a)
>       b = 32872 >> a;
>
>   if (b == 0)
>     return 0;
>   else
>     return 1;
> }
>
> -march=rv64gcv_zvl256b -mabi=lp64d -O3 -ftree-vectorize

Doesn't need vector at all.  Good code generation here looks like:

>         lui     a5,%hi(a)
>         li      a4,19
>         sb      a4,%lo(a)(a5)
>         li      a0,0
>         ret

gcc-14 and gcc-15 produce horrific code here, roughly 20 instructions,
over half of which are vector.  It's not even worth posting, it's
atrocious.

The trunk improves things, but not quite to the quality of gcc-13:

>         vsetivli        zero,8,e16,mf2,ta,ma
>         vmv.v.i v1,0
>         lui     a5,%hi(a)
>         li      a4,19
>         vslidedown.vi   v1,v1,1
>         sb      a4,%lo(a)(a5)
>         vmv.x.s a0,v1
>         snez    a0,a0
>         ret

If we look at the .optimized dump we have this nugget:

>   _26 = .VEC_EXTRACT ({ 0, 0, 0, 0, 0, 0, 0, 0 }, 1);

If we're extracting an element out of a uniform vector, then any element
will do and it's conveniently returned by uniform_vector_p.    So with a
simple match.pd pattern that simplifies to _26 = 0.  That in turn allows
elimination of all the vector code and simplify the return value to a
constant as well, resulting in the desired code shown earlier.

One could easily argue that this need not be restricted to a uniform
vector and I would totally agree.  But given we're in stage4, the
minimal fix for the regression seems more appropriate.  But I could
certainly be convinced to handle the more general case here.

Bootstrapped and regression tested on x86 & riscv64.  Tested across the
cross configurations as well with no regressions.

PR target/113666
gcc/
* fold-const-call.cc (fold_const_vec_extract): New function.
(fold_const_call, case CFN_VEC_EXTRACT): Call it.
* match.pd (IFN_VEC_EXTRACT): Handle extraction from a uniform
vector.

gcc/testsuite
* gcc.target/riscv/rvv/base/pr113666.c: New test.

Co-authored-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
2 months agotree-optimization/123061 - invalid hoisting of division
Richard Biener [Wed, 7 Jan 2026 09:23:22 +0000 (10:23 +0100)] 
tree-optimization/123061 - invalid hoisting of division

The following fixes the computation of always-exeecuted-in in the LIM
pass which was enhanced to handle inner loops in a better way but
in this process ended up setting inner loop always-executed-in state
based on outer loop analysis, which is wrong because an inner loop
block needs to be proven to be always executed for all inner loop
iterations as well, not only for all outer loop iterations.

The fix is to iterate over inner loops first and when processing
an outer loop only update always-executedness if a block belongs
to the very same loop or an immediately nested loop and always
executed inside that.

PR tree-optimization/123061
PR tree-optimization/123636
* tree-ssa-loop-im.cc (fill_always_executed_in_1): Change
outer-to-inner to inner-to-outer iteration.  Update inner
loop state only when always executed in an immediately
nested loop.

* gcc.dg/torture/pr123061.c: New testcase.
* gcc.dg/torture/pr123636.c: Likewise.
* gcc.dg/tree-ssa/ssa-lim-26.c: Likewise.

2 months agoGCN - doc/install.texi: Fix gfx9-4-generic llvm-mc requirements
Tobias Burnus [Mon, 19 Jan 2026 11:17:59 +0000 (12:17 +0100)] 
GCN - doc/install.texi: Fix gfx9-4-generic llvm-mc requirements

gcc/ChangeLog:

* doc/install.texi (GCN): gfx9-4-generic requires LLVM 20.

2 months agolibstdc++: Use overload operator<=> when provided in relational functors [PR114153]
Tomasz Kamiński [Fri, 16 Jan 2026 13:01:53 +0000 (14:01 +0100)] 
libstdc++: Use overload operator<=> when provided in relational functors [PR114153]

The implementation of less<> did not consider the possibility of t < u being
rewritten from overloaded operator<=>. This lead to situation when for t,u that:
* provide overload operator<=>, such that (t < u) is rewritten to (t <=> u) < 0,
* are convertible to pointers,
the expression std::less<>(t, u) would incorrectly result in call of
std::less<void*> on values converted to the pointers, instead of t < u.
The similar issues also occurred for greater<>, less_equal<>, greater_equal<>,
their range equivalents, and in three_way_compare for heterogeneous calls.

This patch addresses above, by also checking for free-functions and member
overloads of operator<=>, before falling back to pointer comparison. We do
not put any constraints on the return type of selected operator, in particular
in being one of the standard defined comparison categories, as the language
does not put any restriction of returned type, and if (t <=> u) is well
formed, (t op u) is interpreted as (t <=> u) op 0. If that later expression
is ill-formed, the expression using op also is (see included tests).

The relational operator rewrites try both order of arguments, t < u,
can be rewritten into operator<=>(t, u) < 0 or 0 < operator<=>(u, t), it
means that we need to test both operator<=>(T, U) and operator<=>(U, T)
if T and U are not the same types. This is now extracted into
__not_overloaded_spaceship helper concept, placed in <concepts>, to
avoid extending set of includes.

The compare_three_way functor defined in compare, already considers overloaded
operator<=>, however it does not consider reversed candidates, leading
to situation in which t <=> u results in 0 <=> operator<=>(u, t), while
compare_three_way{}(t, u) uses pointer comparison. This is also addressed by
using __not_overloaded_spaceship, that check both order of arguments.

Finally, as operator<=> is introduced in C++20, for std::less(_equal)?<>,
std::greater(_equal)?<>, we use provide separate __ptr_cmp implementation
in that mode, that relies on use of requires expression. We use a nested
requires clause to guarantee short-circuiting of their evaluation.
The operator() of aforementioned functors is reworked to use if constexpr,
in all standard modes (as we allow is as extension), eliminating the need
for _S_cmp function.

PR libstdc++/114153

libstdc++-v3/ChangeLog:

* include/bits/ranges_cmp.h (__detail::__less_builtin_ptr_cmp):
Add __not_overloaded_spaceship spaceship check.
* include/bits/stl_function.h (greater<void>::operator())
(less<void>::operator(), greater_equal<void>::operator())
(less_equal<void>::operator()): Implement using if constexpr.
(greater<void>::__S_cmp, less<void>::__S_cmp)
(greater_equal<void>::__ptr_comp, less_equal<void>::S_cmp):
Remove.
(greater<void>::__ptr_cmp, less<void>::__ptr_cmp)
(greater_equal<void>::__ptr_comp, less_equal<void>::ptr_cmp): Change
tostatic constexpr variable. Define in terms of requires expressions
and __not_overloaded_spaceship check.
* include/std/concepts: (__detail::__not_overloaded_spaceship):
Define.
* libsupc++/compare: (__detail::__3way_builtin_ptr_cmp): Use
__not_overloaded_spaceship concept.
* testsuite/20_util/function_objects/comparisons_pointer_spaceship.cc: New test.

Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
2 months agoc++: Make metafns.{gperf,h} usable in C++14
Jakub Jelinek [Mon, 19 Jan 2026 11:04:01 +0000 (12:04 +0100)] 
c++: Make metafns.{gperf,h} usable in C++14

Jonathan mentioned on IRC I've used static_asserts with a single argument
in metafns.gperf.  That is valid in C++17, but not in C++14 we still
support.

Fixed by adding "" as second operand.

2026-01-19  Jakub Jelinek  <jakub@redhat.com>

* metafns.gperf: Add "" as second operand of 2 static_asserts.
* metafns.h: Regenerate.

2 months agotree-optimization/123602 - avoid PRE-inserting abnormal SSA refs
Richard Biener [Mon, 19 Jan 2026 09:21:10 +0000 (10:21 +0100)] 
tree-optimization/123602 - avoid PRE-inserting abnormal SSA refs

The following fixes an omission in find_or_generate_expression to
check for SSA_NAME_OCCURS_IN_ABNORMAL_PHI as already done in
create_expression_by_pieces.

PR tree-optimization/123602
* tree-ssa-pre.cc (find_or_generate_expression): Do not
generate references to abnormal SSA names.

* g++.dg/torture/pr123603.C: New testcase.

2 months agolibstdc++: Fix std::erase_if for std::string with -D_GLIBCXX_USE_CXX11_ABI=0.
Tomasz Kamiński [Mon, 19 Jan 2026 09:03:08 +0000 (10:03 +0100)] 
libstdc++: Fix std::erase_if for std::string with -D_GLIBCXX_USE_CXX11_ABI=0.

The __cow_string used with -D_GLIBCXX_USE_CXX11_ABI=0, does not provide
erase accepting const_iterator, so we adjust  __detail::__erase.if
(introduced in r16-6889-g3287) to call __cont.erase with mutable iterators.

libstdc++-v3/ChangeLog:

* include/bits/erase_if.h (__detail::__erase_if): Pass mutable
iterators to __cont.erase.

2 months agos390: Deprecate -m31
Stefan Schulze Frielinghaus [Mon, 19 Jan 2026 08:56:51 +0000 (09:56 +0100)] 
s390: Deprecate -m31

Support for -m31 is deprecated and will be removed in a future release.

In order to let users know, emit an error/warning during configure.  An
error is thrown if --enable-multilib is given implicitly, or if
explicitly but not --enable-obsolete.

ChangeLog:

* configure: Regenerate.
* configure.ac: Deprecate -m31.

gcc/ChangeLog:

* config.gcc: Deprecate -m31.
* doc/invoke.texi: Deprecate -m31.

2 months agovect-generic: Fix up expand_vector_mult [PR123656]
Jakub Jelinek [Mon, 19 Jan 2026 08:46:36 +0000 (09:46 +0100)] 
vect-generic: Fix up expand_vector_mult [PR123656]

The alg_sub_factor handling in expand_vector_mult had the arguments
reversed.
As documented in expmed.h, the algorithms should be
   These are the operations:
   alg_zero             total := 0;
   alg_m                total := multiplicand;
   alg_shift            total := total * coeff
   alg_add_t_m2         total := total + multiplicand * coeff;
   alg_sub_t_m2         total := total - multiplicand * coeff;
   alg_add_factor       total := total * coeff + total;
   alg_sub_factor       total := total * coeff - total;
   alg_add_t2_m         total := total * coeff + multiplicand;
   alg_sub_t2_m         total := total * coeff - multiplicand;

   The first operand must be either alg_zero or alg_m.  */
So, alg_sub_factor should be identical to alg_sub_t2_m with the
difference that one subtracts accumulator and the other subtracts
op0.  I went through all the other ones and they seem to match
the description except for alg_sub_factor and tree-vect-patterns.cc
seems to be fully correct.  expand_vector_mult at times has
pretty random order of PLUS_EXPR arguments, but that is a commutative
operation, so makes no difference.

Furthermore, I saw weird formatting in the alg_add_t_m2 case, so fixed
that too.

2026-01-19  Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/123656
* tree-vect-generic.cc (expand_vector_mult): Fix up alg_sub_factor
handling.  Fix up formatting in alg_add_t_m2 handling.

* gcc.dg/pr123656.c: New test.

2 months agolibatomic: Change installed libatomic_asneeded.a into a symlink [PR123650]
Jakub Jelinek [Mon, 19 Jan 2026 08:45:10 +0000 (09:45 +0100)] 
libatomic: Change installed libatomic_asneeded.a into a symlink [PR123650]

So, apparently I've tripped over not just one linker bug with the
libatomic/libgcc_s asneeded workaround for libtool bug, but two.
One is that mold doesn't parse INPUT ( AS_NEEDED ( -latomic ) )
or INPUT ( AS_NEEDED ( -lgcc_s ) ) correctly, I think that just
should be fixed in mold.

Another one is that ld.bfd doesn't handle correctly INPUT ( libatomic.a )
when doing static linking with -flto.  While that bug should be fixed too
in the linker, the reason to install a linker script for a static library
has been just my laziness, a symbolic link is more efficient, and even on
hosts without symbolic link for a very small library like libatomic.a
we can live with a cp -pR copy of it.

Furthermore, when I was checking in the last patch (i.e. r16-6736 PR123396),
git was loudly complaining about libatomic_asneeded.a being checked
into repository when *.a is in .gitignored.

So, the following patch revamps the libatomic_asneeded* handling.
libatomic_asneeded.so is rewritten in the way that libgcc_s_asneeded.so
is done and libatomic_asneeded.a installed using $(LN_S).

2026-01-19  Jakub Jelinek  <jakub@redhat.com>

PR libgcc/123650
* Makefile.am (toolexeclib_DATA): Remove.
(all-local): For LIBAT_BUILD_ASNEEDED_SOLINK instead of installing
libatomic_asneeded.{so,a} from top_srcdir cd into the destination
directory, use echo to write libatomic_asneeded.so and $(LN_S) to
symlink libatomic_asneeded.a to libatomic.a.
(install-data-am): For LIBAT_BUILD_ASNEEDED_SOLINK depend on
install-asneeded.
(install-asneeded): New goal.
* libatomic_asneeded.so: Remove.
* libatomic_asneeded.a: Remove.
* Makefile.in: Regenerate.

2 months agotarget/123603 - add --param ix86-vect-compare-costs
Richard Biener [Fri, 16 Jan 2026 09:22:17 +0000 (10:22 +0100)] 
target/123603 - add --param ix86-vect-compare-costs

The following allows to switch the x86 target to use the vectorizer
cost comparison mechanic to select between different vector mode
variants of vectorizations.  The default is still to not do this
but this allows an opt-in.

On SPEC CPU 2017 for -Ofast -march=znver4 this shows 2463 out of
39706 vectorized loops changing mode.  In 503 out of 12378 cases
we decided to not use masked epilogs.  Compile-time increases by ~1% overall.
With a quick 1-run there does not seem to be off-noise effects
for INT, this particular optimization and target option combination
and actual hardware to run on.  For FP 549.fotonik3d_r improves by 6%
(confirmed with a 2-run).

This was triggered by PR123190 and PR123603 which have cases where
comparing costs would have resulted in the faster vector size to be
used.  Both were reported for -O2 -march=x86-64-v3 -flto and with PGO.
The PR123603 recorded regression of 548.exchange2_r with these flags
is resolved with the flag (performance improves by 13%).  I don't
have SPEC 2006 on that machine so did not verify the PR123190 433.milc
regression, but that has been improved with the two earlier patches.
The --param has no effect on the testcase in the PR.

I do expect that some of our tricks in the x86 cost model to make
larger vector sizes unprofitable will be obsolete or are
counter-productive with cost comparison turned on.

PR target/123603
* config/i386/i386.opt (-param=ix86-vect-compare-costs=): Add.
* config/i386/i386.cc (ix86_autovectorize_vector_modes): Honor it.
* doc/invoke.texi (ix86-vect-compare-costs): Document.

* gcc.dg/vect/costmodel/x86_64/costmodel-pr123603.c: New testcase.

2 months agoLoongArch: Fix bug117575.
Lulu Cheng [Sat, 17 Jan 2026 07:12:46 +0000 (15:12 +0800)] 
LoongArch: Fix bug117575.

In the template "vec_set<mode>", a call is made to
"lasx_xvinsve0_<lasxfmt_f>_scalar", but there is an issue due to
the different ranges of operand1 between the two templates.
The range of operand1 in the template
"lasx_xvinsve0_<lasxfmt_f>_scalar" is now set to be the same as
that in "vec_set<mode>".

PR target/117575

gcc/ChangeLog:

* config/loongarch/lasx.md: Modify the range of operand1.

gcc/testsuite/ChangeLog:

* g++.target/loongarch/pr117575.C: New test.

2 months agolibstdc++: Fix std::erase_if behavior for std::__debug containers
François Dumont [Wed, 10 Dec 2025 18:12:58 +0000 (19:12 +0100)] 
libstdc++: Fix std::erase_if behavior for std::__debug containers

Complete fix of std::erase_if/std::erase for all std::__debug containers and
__gnu_debug::basic_string. Make sure that iterators erased by this function
will be properly detected as such by the debug container and so considered as
invalid.

Doing so introduce a new std::__detail::__erase_if function dealing, similarly
to std::__detail::__erase_node_if, with non-node containers.

libstdc++-v3/ChangeLog:

* include/bits/erase_if.h (__detail::__erase_if): New.
* include/debug/deque (std::erase_if<>(__debug::deque<>&, _Pred)): Use latter.
* include/debug/inplace_vector (std::erase_if<>(__debug::inplace_vector<>&, _Pred)):
Likewise.
* include/debug/vector (std::erase_if<>(__debug::vector<>&, _Pred)): Likewise.
* include/std/deque: Include erase_if.h.
(std::erase_if<>(std::vector<>&, _Pred)): Adapt to use __detail::__erase_if.
* include/std/inplace_vector (std::erase_if<>(std::inplace_vector<>&, _Pred)):
Likewise.
* include/std/string (std::erase_if<>(std::basic_string<>&, _Pred)): Likewise.
* include/std/vector (std::erase_if<>(std::vector<>&, _Pred)): Likewise.
* include/debug/forward_list
(std::erase_if<>(__debug::forward_list<>&, _Pred)): New.
(std::erase<>(__debug::forward_list<>&, const _Up&)): New.
* include/debug/list
(std::erase_if<>(__debug::list<>&, _Pred)): New.
(std::erase<>(__debug::list<>&, const _Up&)): New.
* include/debug/map (std::erase_if<>(__debug::map<>&, _Pred)): New.
(std::erase_if<>(__debug::multimap<>&, _Pred)): New.
* include/debug/set (std::erase_if<>(__debug::set<>&, _Pred)): New.
(std::erase_if<>(__debug::multiset<>&, _Pred)): New.
* include/debug/string
(std::erase_if<>(__gnu_debug::basic_string<>&, _Pred)): New.
(std::erase<>(__gnu_debug::basic_string<>&, const _Up&)): New.
* include/debug/unordered_map
(std::erase_if<>(__debug::unordered_map<>&, _Pred)): New.
(std::erase_if<>(__debug::unordered_multimap<>&, _Pred)): New.
* include/debug/unordered_set
(std::erase_if<>(__debug::unordered_set<>&, _Pred)): New.
(std::erase_if<>(__debug::unordered_multiset<>&, _Pred)): New.
* include/std/forward_list (std::erase_if<>(std::forward_list<>&, _Pred)):
Adapt to work exclusively for normal implementation.
(std::erase<>(std::forward_list<>&, const _Up&)): Likewise.
* include/std/list (std::erase_if<>(std::list<>&, _Pred)): Likewise.
(std::erase<>(std::list<>&, const _Up&)): Likewise.
* include/std/map (std::erase_if<>(std::map<>&, _Pred)): Likewise.
(std::erase_if<>(std::multimap<>&, _Pred)): Likewise.
Guard functions using __cpp_lib_erase_if.
* include/std/set (std::erase_if<>(std::set<>&, _Pred)): Likewise.
(std::erase_if<>(std::multiset<>&, _Pred)): Likewise.
Guard functions using __cpp_lib_erase_if.
* include/std/unordered_map
(std::erase_if<>(std::unordered_map<>&, _Pred)): Likewise.
(std::erase_if<>(std::unordered_multimap<>&, _Pred)): Likewise.
Guard functions using __cpp_lib_erase_if.
* include/std/unordered_set
(std::erase_if<>(std::unordered_set<>&, _Pred)): Likewise.
(std::erase_if<>(std::unordered_multiset<>&, _Pred)): Likewise.
Guard functions using __cpp_lib_erase_if.
* testsuite/21_strings/basic_string/debug/erase.cc: New test case.
* testsuite/23_containers/forward_list/debug/erase.cc: New test case.
* testsuite/23_containers/forward_list/debug/invalidation/erase.cc: New test case.
* testsuite/23_containers/list/debug/erase.cc: New test case.
* testsuite/23_containers/list/debug/invalidation/erase.cc: New test case.
* testsuite/23_containers/map/debug/erase_if.cc: New test case.
* testsuite/23_containers/map/debug/invalidation/erase_if.cc: New test case.
* testsuite/23_containers/multimap/debug/erase_if.cc: New test case.
* testsuite/23_containers/multimap/debug/invalidation/erase_if.cc: New test case.
* testsuite/23_containers/multiset/debug/erase_if.cc: New test case.
* testsuite/23_containers/multiset/debug/invalidation/erase_if.cc: New test case.
* testsuite/23_containers/set/debug/erase_if.cc: New test case.
* testsuite/23_containers/set/debug/invalidation/erase_if.cc: New test case.
* testsuite/23_containers/unordered_map/debug/erase_if.cc: New test case.
* testsuite/23_containers/unordered_map/debug/invalidation/erase_if.cc: New test case.
* testsuite/23_containers/unordered_multimap/debug/erase_if.cc: New test case.
* testsuite/23_containers/unordered_multimap/debug/invalidation/erase_if.cc: New test case.
* testsuite/23_containers/unordered_multiset/debug/erase_if.cc: New test case.
* testsuite/23_containers/unordered_multiset/debug/invalidation/erase_if.cc: New test case.
* testsuite/23_containers/unordered_set/debug/erase_if.cc: New test case.
* testsuite/23_containers/unordered_set/debug/invalidation/erase_if.cc: New test case.

2 months agoFortran: Fix ICE on invalid code
Steven G. Kargl [Sun, 18 Jan 2026 02:30:44 +0000 (18:30 -0800)] 
Fortran: Fix ICE on invalid code

This patch tests whether a symbol imported into an interface
is already available in local scope.

PR fortran/123375

gcc/fortran/ChangeLog:

* decl.cc (gfc_match_import): Check that imported entity within
a interface is not from local scope.

gcc/testsuite/ChangeLog:

* gfortran.dg/import.f90: Run code testing for a warning that
is now an error.
* gfortran.dg/pr123375.f90: New test.

2 months agoDaily bump.
GCC Administrator [Mon, 19 Jan 2026 00:16:22 +0000 (00:16 +0000)] 
Daily bump.

2 months agoc++/reflection: adjust error message
Marek Polacek [Fri, 16 Jan 2026 20:50:38 +0000 (15:50 -0500)] 
c++/reflection: adjust error message

Now that the condition includes all captures, let's not talk about
init-capture.  Also print the decl.

gcc/cp/ChangeLog:

* reflect.cc (get_reflection): Adjust the error message for the
is_capture_proxy check.

gcc/testsuite/ChangeLog:

* g++.dg/reflect/expr6.C: Adjust dg-error.

Reviewed-by: Jason Merrill <jason@redhat.com>
2 months agoc++: rename direct_base_parent to direct_base_derived
Marek Polacek [Fri, 16 Jan 2026 21:26:09 +0000 (16:26 -0500)] 
c++: rename direct_base_parent to direct_base_derived

During Reflection review Jason wanted this function renamed.

gcc/cp/ChangeLog:

* cp-tree.h (direct_base_parent): Rename to...
(direct_base_derived): ...this.
* decl2.cc (min_vis_expr_r): Call direct_base_derived instead of
direct_base_parent.
* pt.cc (iterative_hash_template_arg): Likewise.
* reflect.cc (direct_base_parent_binfo): Rename to...
(direct_base_derived_binfo): ...this.
(direct_base_parent): Rename to...
(direct_base_derived): ...this.
(eval_is_expected_access): Call direct_base_derived_binfo instead
of direct_base_parent_binfo.
(eval_source_location_of): Call direct_base_derived instead of
direct_base_parent.
(eval_parent_of): Likewise.
(eval_offset_of): Likewise.
(eval_display_string_of): Likewise.
(eval_annotations_of): Call direct_base_derived_binfo instead
of direct_base_parent_binfo.
(eval_is_accessible): Call direct_base_derived instead of
direct_base_parent.

Reviewed-by: Jason Merrill <jason@redhat.com>
2 months agoc++/reflection: use context_for_name_lookup
Marek Polacek [Fri, 16 Jan 2026 22:22:58 +0000 (17:22 -0500)] 
c++/reflection: use context_for_name_lookup

We can simplify the code here by using context_for_name_lookup.

gcc/cp/ChangeLog:

* reflect.cc (check_splice_expr): Use context_for_name_lookup.

Reviewed-by: Jason Merrill <jason@redhat.com>
2 months agoc++: don't crash determining linkage of invalid TYPE_DECL [PR122391]
Simon Martin [Sun, 18 Jan 2026 10:07:10 +0000 (11:07 +0100)] 
c++: don't crash determining linkage of invalid TYPE_DECL [PR122391]

We currently ICE in decl_linkage for the following invalid input
because we access the TYPE_MAIN_VARIANT of error_mark_node

===
extern "C" {
  template <a> class b;
  struct {
    typedef b:
===

This patch fixes this by returning no linkage for any TYPE_DECL with an
erroneous type.

PR c++/122391

gcc/cp/ChangeLog:

* tree.cc (decl_linkage): Return lk_none for TYPE_DECLs with
erroneous type.

gcc/testsuite/ChangeLog:

* g++.dg/parse/bitfield10.C: New test.

2 months agophiopt: Rewrite cond_removal_in_builtin_zero_pattern canonicalization args code ...
Andrew Pinski [Sat, 17 Jan 2026 20:55:04 +0000 (12:55 -0800)] 
phiopt: Rewrite cond_removal_in_builtin_zero_pattern canonicalization args code [PR123645]

The canonicalization of args code was originally thinking edges e1/e2
were edges out going from the cond block but they were the edges
coming into the join block. This rewrites the canonicalization of arg0/1
args to correct that mistake. And it fixes the wrong code that would
happen in this case.

PR tree-optimization/123645

gcc/ChangeLog:

* tree-ssa-phiopt.cc (cond_removal_in_builtin_zero_pattern): Rewrite
the canonicalization of the args code based on e1/e2 being edges into
the join block.

gcc/testsuite/ChangeLog:

* gcc.dg/torture/pr123645-1.c: New test.
* gcc.dg/torture/pr123645-2.c: New test.

Signed-off-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
2 months agoDaily bump.
GCC Administrator [Sun, 18 Jan 2026 00:16:31 +0000 (00:16 +0000)] 
Daily bump.

2 months agoa68: do not use `^' for the pow operator
Jose E. Marchesi [Sat, 17 Jan 2026 22:50:31 +0000 (23:50 +0100)] 
a68: do not use `^' for the pow operator

The RR mentions all of "**", "^" and "UP" as the representation of the
several pow operators for integral, real and complex operations.  This
patch removes "^" from the list (and a remnant of "UP") and thus frees
that worthy character to be used for some other purpose in the future.

Signed-off-by: Jose E. Marchesi <jemarch@gnu.org>
gcc/algol68/ChangeLog

* a68-parser-prelude.cc (stand_prelude): Remove definitions for ^
operator.
* ga68.texi (Real operators): Remove entries for ^.
(Integral operators): Likewise.

gcc/testsuite/ChangeLog

* algol68/execute/pow-real-1.a68: Adapt test to use ** rather than
^ for pow operator.

2 months agoa68: new Coding Guidelines manual for Algol 68
Jose E. Marchesi [Sat, 17 Jan 2026 22:03:34 +0000 (23:03 +0100)] 
a68: new Coding Guidelines manual for Algol 68

This commit adds a new manual containing a few coding guidelines and
recommendations for writing Algol 68 code.  The primary goal of the
document is to be used in the context of GCC development to achieve a
coherent style among the code base.  However, other people may want to
adopt these coding conventions as well, so we are distributing them in
their own manual rather than as part of the ga68 internals manual.

Thanks to Chris Hermansen, Mohammad-Reza Nabipoor, Pietro Monteiro and
'jpl' James for their help and nice discussions in the algol68@
mailing list.

Signed-off-by: Jose E. Marchesi <jemarch@gnu.org>
gcc/algol68/ChangeLog

* ga68-coding-guidelines.texi: New file.
* Make-lang.in (A68_CODING_GUIDE_MANUAL_FILES): Define.
(A68_TEXI_FILES): Add A68_CODING_GUIDE_MANUAL_FILES.
(doc/ga68-coding-guidelines.info): New rule.
(doc/ga68-coding-guidelines.dvi): Likewise.
(doc/ga68-coding-guidelines.pdf): Likewise.
($(build_htmldir)/ga68-coding-guidelines/index.html): Likewise.
(algol68.info): Add ga68-coding-guidelines.info.
(algol68.srcinfo): Likewise.
(algol68.install-info): Likewise.
(algol68.install-html): Likewise.
(algol68.dvi): Add ga68-coding-guielines.dvi.
(algol68.pdf): Add ga68-coding-guidelines.pdf.

2 months agoAda: Fix packed boolean array with Default_Component_Value aspect
Eric Botcazou [Sat, 17 Jan 2026 21:27:53 +0000 (22:27 +0100)] 
Ada: Fix packed boolean array with Default_Component_Value aspect

Putting the Default_Component_Value aspect on a bit-packed array type has
never worked, so this plugs the loophole.  For the sake of consistency,
the recent fix for PR ada/68179 is adjusted to use Has_Default_Aspect too.

gcc/ada/
PR ada/68179
PR ada/123589
* exp_ch3.adb (Expand_Freeze_Array_Type): Build an initialization
procedure for a bit-packed array type if Has_Default_Aspect is set
on the base type, but make sure not to build it twice.  Also test
Has_Default_Aspect for a type derived from String.

gcc/testsuite/
* gnat.dg/component_value2.adb: New test.

Co-authored-by: Lisa Felidae <lisa@felidae.bam.moe>
2 months agodoc: make regenerate-opt-urls
Sandra Loosemore [Sat, 17 Jan 2026 20:45:45 +0000 (20:45 +0000)] 
doc: make regenerate-opt-urls

Mechanical update to reflect recent batch of commits to clean up options
documentation.

gcc/ChangeLog
* config/darwin.opt.urls: Regenerated.
* config/dragonfly.opt.urls: Regenerated.
* config/freebsd.opt.urls: Regenerated.
* config/gnu-user.opt.urls: Regenerated.
* config/hpux11.opt.urls: Regenerated.
* config/i386/cygwin.opt.urls: Regenerated.
* config/i386/i386.opt.urls: Regenerated.
* config/mingw/mingw.opt.urls: Regenerated.
* config/nds32/nds32.opt.urls: Regenerated.
* config/netbsd.opt.urls: Regenerated.
* config/nvptx/nvptx.opt.urls: Regenerated.
* config/openbsd.opt.urls: Regenerated.
* config/pru/pru.opt.urls: Regenerated.
* config/riscv/riscv.opt.urls: Regenerated.
* config/rl78/rl78.opt.urls: Regenerated.
* config/rs6000/aix64.opt.urls: Regenerated.
* config/rs6000/rs6000.opt.urls: Regenerated.
* config/rs6000/sysv4.opt.urls: Regenerated.
* config/rtems.opt.urls: Regenerated.
* config/rx/rx.opt.urls: Regenerated.
* config/s390/s390.opt.urls: Regenerated.
* config/s390/tpf.opt.urls: Regenerated.
* config/sh/sh.opt.urls: Regenerated.
* config/sol2.opt.urls: Regenerated.
* config/sparc/sparc.opt.urls: Regenerated.
* config/v850/v850.opt.urls: Regenerated.
* config/vax/vax.opt.urls: Regenerated.
* config/vxworks.opt.urls: Regenerated.

2 months agodoc, nds32: Add missing documentation for nds32 options [PR122243]
Sandra Loosemore [Sat, 10 Jan 2026 20:27:36 +0000 (20:27 +0000)] 
doc, nds32: Add missing documentation for nds32 options [PR122243]

This back end had numerous options defined that were not documented in
the manual.  Descriptions were taken from the .opt file.  I also did some
editorial cleanups in the .opt file text where appropriate.

gcc/ChangeLog
PR other/122243
* config/nds32/nds32.opt: Tidy documentation strings.
(mbig-endian, mlittle-endian): Remove "Undocumented" flag since
these are, in fact, documented.
* doc/invoke.texi (Option Summary) <NDS32 Options>: Document
-EB, -EL, -mabi, -mfloat-abi, -malways-align, -malign-functions,
-mfp-as-gp, -mext-dsp, -mext-fpu-fma, -mext-fpu-sp, -mext-fpu-dp,
-misr-vector-size, -misr-secure, -mcpu, -mconfig-fpu,
-mconfig-mul, -mconfig-register-ports, -mrelax-hint,
-msched-prolog-epilog, -mno-ret-in-naked-func, -malways-save-lp,
-munaligned-access, and -minline-asm-r15.
(NDS32 Options): Likewise.

2 months agodoc, xtensa: Clean up Xtensa options documentation [PR122243]
Sandra Loosemore [Thu, 8 Jan 2026 17:24:56 +0000 (17:24 +0000)] 
doc, xtensa: Clean up Xtensa options documentation [PR122243]

gcc/ChangeLog
PR other/122243
* config/xtensa/uclinux.opt (elf2flt, elf2flt=): Mark as Undocumented.
* config/xtensa/xtensa.opt (mlra): Likewise.
* doc/invoke.texi (Option Summary) <Xtensa Options>: Remove
redundant negative forms plus obsolete -mfused-madd option.
(Xtensa Options): Likewise undocument -mfused-madd.  List
negative form of -mforce-no-pic.

2 months agodoc, x86: Clean up x86 options documentation [PR122243]
Sandra Loosemore [Tue, 6 Jan 2026 23:49:27 +0000 (23:49 +0000)] 
doc, x86: Clean up x86 options documentation [PR122243]

Besides the usual fixes in this series to make the options summary
agree with the options listed in the detailed documentation and add
missing @opindex entries, I decided it was not very helpful to users
to have dozens of ISA extension options documented as a group spanning
multiple pages in the manual.  I broke that up so each of those
options is described separately, using the documentation string from
the .opt file.

gcc/ChangeLog
PR other/122243
* config/i386/i386.opt (malign-functions): Mark undocumented/unused
option as Undocumented.
(malign-jumps): Likewise.
(malign-loops): Likewise.
(mbranch-cost, mforce-drap): Mark undocumented options likely
intended for developer use only as Undocumented.
(mstv): Correct sense of option in doc string.
(mavx512cd): Remove extra "and" from doc string.
(mavx512dq): Likewise.
(mavx512bw): Likewise.
(mavx512vl): Likewise.
(mavx512ifma): Likewise.
(mavx512bvmi): Likewise.
* doc/invoke.texi (Options Summary) <x86 Options>: Add
missing options.  Correct whitespace and re-wrap long lines.
Remove -mthreads which is now classed as a MinGW option.
(Cygwin and MinGW Options): Replace existing documentation of
-mthreads with the more detailed text moved from x86 Options.
(x86 Options): Move introductory text about ISA extensions before
the individual options instead of after.  Document them all
individually instead of as a group, and move immediately after
-march/-mtune documentation.  Rewrap long lines.  Document
interaction between SSE and AVX with -mfpmath=sse.  Move -masm
documentation farther down instead of grouped with options
affecting floating-point behavior.  Add missing @opindex
entries.  Rewrite the -mdaz-ftz documentation.  Document
-mstack-arg-probe.  Copy-editing.  Document -mstv.  Remove
obsolete warning about -mskip-rax-setup in very old GCC versions.
Rewrite the -mapx-inline-asm-use-gpr32 documentation.
Document -mgather and -mscatter.  Split -miamcu documentation
from -m32/-m64/etc.  Rewrite -munroll-only-small-loops documentation.
Document -mdispatch-scheduler.

2 months agodoc, VxWorks: Clean up VxWorks option documentation [PR122243]
Sandra Loosemore [Mon, 5 Jan 2026 23:46:12 +0000 (23:46 +0000)] 
doc, VxWorks: Clean up VxWorks option documentation [PR122243]

gcc/ChangeLog
PR other/122243
* doc/invoke.texi (Option Summary) <VxWorks Options>: Add -mvthreads.
(VxWorks Options): Likewise.

2 months agodoc, vms: Clean up VMS options [PR122243]
Sandra Loosemore [Mon, 5 Jan 2026 22:26:08 +0000 (22:26 +0000)] 
doc, vms: Clean up VMS options [PR122243]

gcc/ChangeLog
PR other/122243
* config/vms/vms.opt (map): Mark as Undocumented.

2 months agodoc, visium: Clean up Visium options documentation [PR122243]
Sandra Loosemore [Mon, 5 Jan 2026 21:39:07 +0000 (21:39 +0000)] 
doc, visium: Clean up Visium options documentation [PR122243]

gcc/ChangeLog
PR other/122243
* config/visium/visium.opt (menable-trampolines): Mark Undocumented.
* doc/invoke.texi (Options Summary) <Visium Options>: Remove
redundant -mno- option.
(Visium Options): Copy-editing to put in active voice and add markup.

2 months agodoc, vax: Clean up VAX option documentation [PR122243]
Sandra Loosemore [Mon, 5 Jan 2026 21:12:26 +0000 (21:12 +0000)] 
doc, vax: Clean up VAX option documentation [PR122243]

gcc/ChangeLog
PR other/122243
* config/vax/elf.opt (mno-asm-pic): Mark as Undocumented.
* doc/invoke.texi (Option Summary) <VAX Options>: Add
-mvaxc-alignment and -mqmath.
(VAX Options): Likewise.

2 months agodoc, v850: Clean up V850 options and documentation [PR122243]
Sandra Loosemore [Mon, 5 Jan 2026 15:48:00 +0000 (15:48 +0000)] 
doc, v850: Clean up V850 options and documentation [PR122243]

gcc/ChangeLog
PR other/122243
* config/v850/v850.opt: Copy-edit documentation strings.
(mdebug): Make Undocumented.
(mno-strict-align): Add RejectNegative.
(mUS-bit-set): Make Undocumented.
* doc/invoke.texi (Option Summary) <V850 Options>: Remove
redundant -mno- forms from list.  Add missing entries.
(V850 Options): Add @opindex for negative forms.  Combine
entries for -mapp-regs and -mno-app-regs.  Document -msmall-sld,
-mno-strict-align, and -mjump-tables-in-data-section.

2 months agodoc, sparc: Clean up SPARC option documentation [PR122243]
Sandra Loosemore [Mon, 5 Jan 2026 01:09:22 +0000 (01:09 +0000)] 
doc, sparc: Clean up SPARC option documentation [PR122243]

gcc/ChangeLog
PR other/122243
* doc/invoke.texi (Option Summary) <SPARC Options>: Remove
redundant -mno- forms from the list.  Add -mptr32 and -mptr64.
(SPARC Options): Document -mptr32 and -mptr64.

2 months agodoc, Solaris: Clean up documentation of Solaris 2 options [PR122243]
Sandra Loosemore [Sun, 4 Jan 2026 23:03:46 +0000 (23:03 +0000)] 
doc, Solaris: Clean up documentation of Solaris 2 options [PR122243]

gcc/ChangeLog
PR other/122243
* doc/invoke.texi (Option Summary) <Solaris 2 Options>:
Remove redundant negative option forms from list.  List both
-pthread and -pthreads.
(Solaris 2 Options): Index and list the negative forms here.
Combine the two @table environments.  Document both -pthread
and -pthreads.

2 months agodoc, sh: Clean up SH options documentation [PR122243]
Sandra Loosemore [Sun, 4 Jan 2026 20:48:26 +0000 (20:48 +0000)] 
doc, sh: Clean up SH options documentation [PR122243]

gcc/ChangeLog
PR other/122243
* config/sh/sh.opt (mhitachi, mpadstruct): Mark obsolete options
as Undocumented.
* doc/invoke.texi (Option Summary) <SH Options>: Add missing
entries for -m4-* and other options.  Remove redundant -mno- entries
and obsolete options.  Add missing options -mfdpic, -mlra.
(SH Options): Combine entries for -mrenesas and -mno-renesas.
Index and list -mno- forms for other options that have them.
Remove documentation for obsolete options -mpadstruct and
-mfused-madd.  Add documentation for -mlra.  Copy-edit and wrap long
lines throughout the section.

2 months agodoc, s390: Clean up S/390 and z series options [PR122243]
Sandra Loosemore [Fri, 2 Jan 2026 17:38:52 +0000 (17:38 +0000)] 
doc, s390: Clean up S/390 and z series options [PR122243]

There were numerous S/390 options missing entries in the manual.
Fortunately the documentation strings in the .opt file and previous
commit messages and patch mails explained these well enough that I
was able to fill in the missing material without too much trouble.
I marked a few that seemed to be for internal use or intentially not
exposed to the user as "Undocumented".

gcc/ChangeLog
PR other/122243
* config/s390/s390.opt (mbranch-cost): Mark as Undocumented.
* config/s390/tpf.opt (mtpf-trace-hook-prologue-check=): Likewise.
(mtpf-trace-hook-prologue-target=): Likewise.
(mtpf-trace-hook-epilogue-check=): Likewise.
(mtpf-trace-hook-epilogue-target=): Likewise.
* doc/invoke.texi (Option Summary) <S/390 and zSeries Options>:
Remove redundant -mno- entries and add missing options.  Make
entries with arguments match the syntax in the main documentation.
(S/390 and zSeries Options): Light copy-editing.  Wrap overly-long
lines.  Add missing @opindex entries.  Add documention for
-mmain, -mno-pic-data-is-text-relative, -mindirect-branch,
-mindirect-branch-jump, -mindirect-branch-call,
-mfunction-return, -mfunction-return-mem, -mfunction-return-reg,
-mindirect-branch-table, -mfentry, -mrecord-mcount, -mnop-mcount,
-mpreserve-args, and -munaligned-symbols.

2 months agodoc, rx: Clean up RX options documentation [PR122243]
Sandra Loosemore [Thu, 1 Jan 2026 18:29:54 +0000 (18:29 +0000)] 
doc, rx: Clean up RX options documentation [PR122243]

gcc/ChangeLog
PR other/122243
* config/rx/rx.opt (mgcc-abi, mrx-abi): Mark as Undocumented.
* doc/invoke.texi (Option Summary) <RX Options>: Remove redundant
entries for -mno-forms, correct name of -msmall-data-limit option,
add -mlra, clean up formatting.
(RX Options): Minor copy-editing, add -mlra.

2 months agodoc, rs6000: Clean up RS/6000 options documentation [PR122243]
Sandra Loosemore [Wed, 31 Dec 2025 16:28:38 +0000 (16:28 +0000)] 
doc, rs6000: Clean up RS/6000 options documentation [PR122243]

Similar to other patches in this series, the focus is on ensuring all
options are either documented or marked "Undocumented", listed in both
the options summary and detailed documentation, and both positive and
negative forms have entries in the table of contents.

gcc/ChangeLog
PR other/122243
* config/rs6000/darwin.opt (Waltivec-long-deprecated): Mark as
Undocumented.
(faltivec, ffix-and-continue, findirect-data): Likewise.
* config/rs6000/rs6000.opt (mvrsave): Likewise.
* config/rs6000/sysv4.opt (mno-toc, mtoc, mno-traceback): Likewise.
(mshlib, mnewlib): Likewise.
* doc/invoke.texi (Option Summary) <RS/6000 and PowerPC Options>:
Document only one form of each option.  Add missing options.
Correct whitespace.
(RS/6000 and PowerPC Options): Separately document -mpowerpc-gpopt,
-mpowerpc-gfxopt, -mpowerpc64, -mmfcrf, -mpopcntb, -mpopcntd,
-mfprnd, -mcmpb, and -mhard-dfp and move their documentation after
-mcpu=.  Remove documentation for -mtoc which is unimplemented.
Add missing @opindex entries.  Minor copy-editing and whitespace
fixes.

2 months agodoc, rl78: Clean up RL78 option documentation [PR122243] [PR71340]
Sandra Loosemore [Sat, 27 Dec 2025 21:03:55 +0000 (21:03 +0000)] 
doc, rl78: Clean up RL78 option documentation [PR122243] [PR71340]

This target is probably dead (no listed maintainer and no support for
LRA).  There seems to be no interest in reviving the 2014 patch for
the documented but never-committed -m64bit-doubles and -m32bit-doubles
options, so I've removed those docs instead, along with some other
routine housekeeping to keep the docs in sync with the options file.

gcc/ChangeLog
PR other/122243
PR target/71340
* doc/invoke.texi (Option Summary) <RL78 Options>: Remove
never-implemented -m64bit-doubles and -m32bit-doubles options.
Add missing entries for -mrelax, -mes0, -mmul=rl78, -mcpu=rl78,
and -mrl78.
(RL78 Options): Likewise.  Add missing @opindex entries.
Light copy-editing.

2 months agoa68: add explicative comment to are_packs_equivalent
Jose E. Marchesi [Sat, 17 Jan 2026 20:56:20 +0000 (21:56 +0100)] 
a68: add explicative comment to are_packs_equivalent

While fixing PR algol68/123653 I noticed that there was a struct mode
interned in the compiler with the form `struct (ref int)'.  This is
odd because fields are supposed to have names in struct modes.

Turns out that the culprit is:

    (void) a68_add_mode_to_pack (&z, M_REF_INT, NO_TEXT, NO_NODE);

    EQUIVALENT (M_SEMA) = a68_add_mode (&TOP_MOID (&A68_JOB),
                                        STRUCT_SYMBOL,
                                        a68_count_pack_members (z),
                                        NO_NODE, NO_MOID, z);

i.e. it is the standard mode `sema'.  The report says that it is a
struct that hold a reference to int within, but you are not allowed to
access it.

This patch adds a comment to are_packs_equivalent explaining why the
name of a pack may be NULL.

Signed-off-by: Jose E. Marchesi <jemarch@gnu.org>
gcc/algol68/ChangeLog

* a68-parser-moids-equivalence.cc (are_packs_equivalent): Add
explicative comment.

2 months agoa68: fix logic for name comparison in are_packs_equivalent [PR algol68/123653]
Jose E. Marchesi [Sat, 17 Jan 2026 20:12:24 +0000 (21:12 +0100)] 
a68: fix logic for name comparison in are_packs_equivalent [PR algol68/123653]

Signed-off-by: Jose E. Marchesi <jemarch@gnu.org>
gcc/algol68/ChangeLog

PR algol68/123653
* a68-parser-moids-equivalence.cc (are_packs_equivalent): Fix
logic in name comparison.

2 months agoRegenerate cobol lang.opt.urls
Jakub Jelinek [Sat, 17 Jan 2026 18:27:54 +0000 (19:27 +0100)] 
Regenerate cobol lang.opt.urls

r16-6851 added -fexec-charset= option to cobol/lang.opt but hasn't
regenerated lang.opt.urls.  While the other options don't match
anything, -fexec-charset= is C/C++ option.

2026-01-17  Jakub Jelinek  <jakub@redhat.com>

* lang.opt.urls: Regenerate.

2 months agoa68: do not define Number and whole as built-ins
Jose E. Marchesi [Sat, 17 Jan 2026 17:28:34 +0000 (18:28 +0100)] 
a68: do not define Number and whole as built-ins

Now that we have the support of adding Algol 68 code to the run-time
library libga68, we are writing most of the Transput in Algol 68.  In
particular, both the Number mode and the standard procedure `whole',
among others, are already implemented in transput.a68.in.

This patch removed remnant code that used to define these as compiler
built-ins.

Signed-off-by: Jose E. Marchesi <jemarch@gnu.org>
gcc/algol68/ChangeLog

* a68-parser-prelude.cc (stand_transput): Do not define
`Number' and `whole' as built-ins.

2 months agoFortran: Add new test case
Jerry DeLisle [Sat, 17 Jan 2026 18:02:26 +0000 (10:02 -0800)] 
Fortran: Add new test case

PR fortran/94377

gcc/testsuite/ChangeLog:

* gfortran.dg/pr94377.f90: New test, failed on gcc-15

2 months agoFortran: Documentation update on -fdefault-real-8 and family
Jerry DeLisle [Sat, 17 Jan 2026 17:23:53 +0000 (09:23 -0800)] 
Fortran: Documentation update on -fdefault-real-8 and family

PR fortran/122957

gcc/fortran/ChangeLog:

* invoke.texi: Add note that these features are incompatible
with user defined derived type I/O. (DTIO)

2 months agoFortran: Fix accepts invalid implicit none (external)
Steven G. Kargl [Sat, 17 Jan 2026 02:09:56 +0000 (18:09 -0800)] 
Fortran: Fix accepts invalid implicit none (external)

This patch yields an error for the test case which was
previously being accepted even though implicit none (external)
was being specified.

PR fortran/109512

gcc/fortran/ChangeLog:

* resolve.cc (resolve_function): Check if an external
attribute is required on a call to an external procedure.
(resolve_call): Likewise.

gcc/testsuite/ChangeLog:

* gfortran.dg/pr109512.f90: New test.

2 months agotree: Handle ::operator {new,delete} function templates as uncertain matches [PR123513]
Jakub Jelinek [Sat, 17 Jan 2026 13:37:30 +0000 (14:37 +0100)] 
tree: Handle ::operator {new,delete} function templates as uncertain matches [PR123513]

We have for some reason two different ways to check for matching
::operator new vs. ::operator delete kind.  One is a dumb one in
tree.cc (valid_new_delete_pair_p) and another one is in
gimple-ssa-warn-access.cc (new_delete_mismatch_p).
The former is used both in the latter and in optimizations,
the latter only for warnings.
The former just handles the easy cases, global operator new and
the latter can handle everything as it uses the demangler.
The former has essentially a tri-state return even when it has just bool
return type, it has another bool * optional argument, so can return
true for this is definitely ok, false with false with this might be
not matching and false with true for this definitely doesn't match.
false with false is returned e.g. for the class scope operator new/delete,
where we definitely need the demangler to figure stuff out.
false with true is returned for mismatches which are guaranteed, e.g.
when one mangled name starts with _Znw and the other with _Zda,
one is ::operator new and the other is ::operator delete[].
valid_new_delete_pair_p expects that after the _Znw/_Zna/_Zdl/_Zda
prefix (or two _ at the start instead of one) it sees [jmy] for
the size_t argument resp. Pv for void* for delete, for delete
then optionally the same [jmy] for sized deallocation and
optionally RKSt9nothrow_t after it for nothrow versions or
also something with St11align_val_t.  If it has some extra arguments
after it, it also returns false/false.

The following testcase shows another case where I'm afraid we need
to return the maybe mismatch - when the global operators are function
templates.
_ZnwILm1024EEPvmR13BumpAllocatorIXT_EE
_ZdlILm1024EEvPvR13BumpAllocatorIXT_EE
where the Ilm1024EE here mean <1024ul> and Pv after it means function
return type void *.  As valid_new_delete_pair_p needs to find the m
after it, it would need to know everything about what can appear
in between I and E for the template arguments (which is a lot) and
also be able to skip over mangling of arbitrary function return types
(though perhaps it could hardcode those Pv vs. v cases for those).

So, the following patch just returns false/false instead of false/true
if known _Z{nw,na,dl,da} is followed by I, i.e. if it is a function
template.  For optimizations it makes no difference, those care just
about the return value and not on *pcertain, and for the warning it
means it will use the demangler which will figure stuff hopefully right.

2026-01-17  Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/123513
* tree.cc (valid_new_delete_pair_p): If new_name[3] or delete_name[3]
is 'I', return false with *pcertain set to false rather than true.

* g++.dg/warn/Wmismatched-new-delete-10.C: New test.

2 months agoc++/modules: Fix local type handling when not streaming function definitions [PR123627]
Nathaniel Shead [Fri, 16 Jan 2026 23:41:58 +0000 (10:41 +1100)] 
c++/modules: Fix local type handling when not streaming function definitions [PR123627]

r14-9948-g716af95fd45487 added support for merging local types of
functions.  This however causes the linked PR to crash, because when
restreaming the local type from a partition for the primary module
interface's CMI, we no longer have the DECL_INITIAL for a function.

This patch fixes the issue by reusing the MK_keyed merge kind, as used
for lambda types.  This is required so that if a module partition
imports both the primary module interface and a different module
partition that both provide the same local type it can properly dedup
the declarations.

We only need to do this if !has_definition; in cases where a definition
is available we keep using the MK_local_type behaviour as that avoids
the need to maintain a separately allocated chain of keyed decls.

An additional change is to further the modifications made in r16-4671
and always attempt to key to the top-most decl, including going through
possibly many nested class and function definitions.  This avoids any
similar issues to that bug where we read a keyed decl before we see the
decl it's keyed to now that we support keying to functions as well.

PR c++/123627

gcc/cp/ChangeLog:

* class.cc (finish_struct): Maybe key function-local types.
* module.cc (trees_out::get_merge_kind): Choose whether to use
MK_local_type or MK_keyed for a local type based on if the
immediate context's definition will be streamed.
(trees_in::key_mergeable): Allow key decls on FUNCTION_DECL.
(adjust_key_scope): New function.
(maybe_key_decl): Handle key decls on FUNCTION_DECL; check that
we only key a given decl to a context at most once.
(get_keyed_decl_scope): Support non-lambda decls.

gcc/testsuite/ChangeLog:

* g++.dg/modules/block-decl-4_a.C: New test.
* g++.dg/modules/block-decl-4_b.C: New test.
* g++.dg/modules/block-decl-4_c.C: New test.

Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
Reviewed-by: Jason Merrill <jason@redhat.com>
2 months agoa68: handle TImode in a68_type_for_{mode,size}
Mohammad-Reza Nabipoor [Sat, 17 Jan 2026 02:36:47 +0000 (03:36 +0100)] 
a68: handle TImode in a68_type_for_{mode,size}

Signed-off-by: Mohammad-Reza Nabipoor <mnabipoor@gnu.org>
gcc/algol68/ChangeLog

PR algol68/123007
* a68-lang.cc (a68_type_for_mode): Handle TImode.
(a68_type_for_size): Handle unsigned_intTI_type_node.

2 months agocobol: Support National characters and Unicode runtime encoding.
Robert Dubner [Fri, 16 Jan 2026 20:42:50 +0000 (15:42 -0500)] 
cobol: Support National characters and Unicode runtime encoding.

The last few months have seen an evolution in the COBOL compiler.  Up
until now it could use either CP1252/ASCII or CP1140/EBCDIC to represent
alphanumeric variables and numeric types that are stored as character
strings.  With these changes, those types can be represented in many
other single-byte encodings, as well as UTF16 and UTF32 encodings.

These changes required extensive changes.

1) The initial parsing has to handle the extended capabilities.

2) Each run-time variable designates its character set.

3) The run-time code has to be able to handle wide characters.

Since the development took place over a period of time, other changes
crept in. In particular, there is an expansion of bindings making
certain POSIX functions available to the COBOL programmer.

There has also been an expansion of gcobol's use of the GCC diagnostic
framework.

Co-Authored-By: Robert Dubner <rdubner@symas.com>
Co-Authored-By: James K. Lowden <jklowden@cobolworx.com>
gcc/cobol/ChangeLog:

* cbldiag.h (struct cbl_loc_t): Diagnostics.
(enum cbl_diag_id_t): Diagnostics.
* cdf.y: Includes.
* cobol1.cc (cobol_warning_suppress): Diagnostics.
(cobol_langhook_handle_option): Implement -fexec-charset.  Expand
the use of diagnostics.
* gcobc: Expand options and warnings.
* gcobol.1: Documentation.
* genapi.cc (level_88_helper): Charsets.
(get_level_88_domain): Charsets.
(get_class_condition_string): Charsets.
(function_pointer_from_name): Charsets.
(initialize_variable_internal):  Charsets.
(parser_initialize): Charsets.
(get_binary_value_from_float): Charsets.
(get_bytes_needed): Charsets.
(cobol_compare): Charsets.
(move_tree): Eliminate function.
(move_tree_to_field): Eliminate function.
(get_string_from): Eliminate function.
(parser_init_list): Charsets.
(psa_FldLiteralN): Charsets.
(parser_accept_date_yymmdd): Charsets.
(parser_accept_date_yyyymmdd): Charsets.
(parser_accept_date_yyddd): Charsets.
(parser_accept_date_yyyyddd): Charsets.
(parser_accept_date_dow): Charsets.
(parser_accept_date_hhmmssff): Charsets.
(parser_alphabet): Charsets.
(parser_alphabet_use): Charsets.
(parser_display_internal): Charsets.
(get_literalN_value): Charsets.
(tree_type_from_field_type): Charsets.
(program_end_stuff): Charsets.
(walk_initialization): Charsets.
(parser_xml_parse): Charsets.
(initialize_the_data): Charsets.
(establish_using): Charsets.
(parser_setop): Charsets.
(parser_set_conditional88): Charsets.
(parser_file_add): Charsets.
(get_the_filename): Eliminate function.
(parser_file_open): Charsets.
(parser_file_delete_file): Charsets.
(parser_file_start): Charsets.
(parser_module_name): Charsets.
(parser_intrinsic_find_string): New function.
(parser_intrinsic_numval_c): Charsets.
(parser_intrinsic_convert): New function.
(parser_intrinsic_call_1): Charsets.
(create_and_call): Charsets.
(mh_identical): Charsets.
(mh_source_is_literalN): Charsets.
(float_type_of): Charsets.
(mh_dest_is_float): Charsets.
(mh_numeric_display): Charsets.
(mh_little_endian): Charsets.
(mh_source_is_group): Charsets.
(mh_source_is_literalA): Charsets.
(move_helper): Charsets.
(binary_initial): Eliminate function.
(digits_from_int128): Eliminate function.
(digits_from_float128): Eliminate function.
(initial_from_initial):  Eliminate function.
(convert_data_initial): New function.
(actually_create_the_static_field): Charsets.
(psa_new_var_decl): Charsets.
(psa_FldLiteralA): Charsets.
(parser_local_add): Charsets.
(parser_symbol_add): Charsets.
* genapi.h (parser_intrinsic_convert): New function.
(parser_intrinsic_find_string): New function.
* genmath.cc (arithmetic_operation): Charsets.
(largest_binary_term): Charsets.
(fast_add): Charsets.
(fast_subtract): Charsets.
(fast_multiply): Charsets.
(fast_divide): Charsets.
(parser_subtract): Fix subtract float from float.
* genutil.cc (get_any_capacity): Charsets.
(get_and_check_refstart_and_reflen): Charsets.
(get_data_offset): Charsets.
(get_binary_value): Charsets.
(tree_type_from_field): Charsets.
(copy_little_endian_into_place): Charsets.
(get_literal_string): Charsets.
(refer_is_clean): Charsets.
(refer_fill_depends): Charsets.
(refer_size_source): Comment.
* lang-specs.h: Charsets.
* lang.opt: Charsets.
* lexio.cc (parse_copy_directive): Diagnostics.
* messages.cc (cbl_diagnostic_kind): Diagnostics.
(cobol_warning_suppress): Diagnostics.
* parse.y: Many changes for charsets and diagnostics.
* parse_ante.h (MAXLENGTH_FORMATTED_DATE): Charsets.
(MAXLENGTH_FORMATTED_TIME): Charsets.
(MAXLENGTH_CALENDAR_DATE): Charsets.
(MAXLENGTH_FORMATTED_DATETIME): Charsets.
(consistent_encoding_check): Charsets.
(enum data_clause_t): Charsets.
(new_alphanumeric): Charsets.
(name_of): Charsets.
(class eval_subject_t): Charsets.
(struct domain_t): Charsets.
(struct file_list_t): Charsets.
(current_encoding): Charsets.
(new_tempnumeric): Charsets.
(is_integer_literal): Charsets.
(new_literal): Charsets.
(new_constant): Charsets.
(conditional_set): Charsets.
(field_find): Charsets.
(valid_redefine): Charsets.
(field_value_all): Charsets.
(parent_has_picture): Charsets.
(parent_has_value): Charsets.
(blank_pad_initial): Charsets.
(blankit): Charsets.
(cbl_field_t::blank_initial): Charsets.
(value_encoding_check): Charsets.
(cbl_field_t::set_initial): Charsets.
(field_alloc): Charsets.
(parser_move_carefully): Charsets.
(data_division_ready): Charsets.
(anybody_redefines): Charsets.
(procedure_division_ready): Charsets.
(file_section_parent_set): Charsets.
(field_binary_usage): Charsets.
(goodnight_gracie): Formatting.
* scan.l: Charsets.
* scan_ante.h (numstr_of): Charsets.
(typed_name): Charsets.
* show_parse.h: Charsets.
* structs.cc (create_cblc_file_t): Charsets.
* symbols.cc (symbol_table_extend): Charsets.
(WARNING_FIELD): Diagnostics.
(constq): Charsets.
(elementize): Charsets.
(field_size): Charsets.
(cbl_field_t::set_attr): Eliminate run-time component.
(cbl_field_t::clear_attr): Eliminate run-time component.
(field_memsize): Charsets.
(cbl_encoding_str): Charsets.
(symbols_dump): Charsets.
(is_variable_length): Formatting.
(field_str): Charsets.
(extend_66_capacity): Charsets.
(operator<<): Charsets.
(symbols_update): Charsets.
(symbol_field_parent_set): Charsets.
(symbol_table_init): Charsets.
(numeric_group_attrs): Charsets.
(symbol_field_add): Charsets.
(symbol_field_alias): Charsets.
(fd_record_size_cmp): Charsets.
(symbol_file_record_sizes): Charsets.
(cbl_alphabet_t::reencode): Charsets.
(symbol_temporary_location): Charsets.
(new_literal_2): Charsets.
(new_alphanumeric): Charsets.
(standard_internal): Charsets.
(cbl_field_t::codeset_t::stride): Charsets.
(cobol_alpha_encoding): Charsets.
(cobol_national_encoding): Charsets.
(new_temporary): Charsets.
(new_literal_float): Charsets.
(cbl_field_t::is_ascii): Charsets.
(cbl_field_t::internalize): Eliminate function.
(cbl_field_t::source_code_check): Charsets.
(iconv_cd): Charsets.
(cbl_field_t::encode): New function for charsets.
(cbl_field_t::set_capacity): Charsets.
(cbl_field_t::add_capacity): Charsets.
(cbl_field_t::char_capacity): Charsets.
(symbol_label_section_exists): Charsets.
(size): Charsets.
(validate_numeric_edited): Charsets.
* symbols.h (cobol_alpha_encoding): Charsets.
(cobol_national_encoding): Charsets.
(consistent_encoding_check): Charsets.
(class cbl_domain_elem_t): Charsets.
(struct cbl_domain_t): Charsets.
(struct cbl_field_data_t): Charsets.
(class cbl_field_data_t): Charsets.
(struct cbl_subtable_t): Charsets.
(struct cbl_field_t): Charsets.
(new_literal_float): Charsets.
(new_temporary): Charsets.
(new_literal_2): Charsets.
(symbol_temporary_location): Charsets.
(class temporaries_t): Charsets.
(struct symbol_elem_t): Charsets.
(symbol_elem_of): Charsets.
(symbol_unique_index): Charsets.
(cbl_field_type_name): Charsets.
(validate_numeric_edited): Charsets.
* token_names.h: Charsets.
* util.cc (cdf_literalize): Charsets.
(cbl_field_type_name): Charsets.
(determine_intermediate_type): Charsets.
(is_alpha_edited): Charsets.
(cbl_field_data_t::is_alpha_edited): Charsets.
(symbol_field_type_update): Charsets.
(redefine_field): Charsets.
(FIXED_WIDE_INT): Charsets.
(dirty_to_binary): Charsets.
(digits_from_int128): Charsets.
(binary_initial): Charsets.
(cbl_field_t::encode_numeric): Charsets.
(FOR_JIM): Temporary conditional demonstration code.
(parse_error_inc): Diagnostics.
(parse_error_count): Diagnostics.
(cbl_field_t::report_invalid_initial_value): Diagnostics.
(valid_move): Diagnostics.
(type_capacity): Charsets.
(symbol_unique_index): New function.
(cbl_unimplementedw): Formatting.

libgcobol/ChangeLog:

* charmaps.cc (__gg__encoding_iconv_name): Charsets.
(__gg__encoding_iconv_valid): Charsets.
(__gg__encoding_iconv_type): Charsets.
(encoding_descr): Charsets.
(__gg__encoding_iconv_descr): Charsets.
(__gg__iconverter): Charsets.
(__gg__miconverter): Charsets.
* charmaps.h (NOT_A_CHARACTER): Charsets.
(ascii_nul): Charsets.
(ascii_bang): Charsets.
(__gg__encoding_iconv_type): Charsets.
(__gg__iconverter): Charsets.
(__gg__miconverter): Charsets.
(DEFAULT_32_ENCODING): Charsets.
(class charmap_t): Charsets.
(__gg__get_charmap): Charsets.
* common-defs.h (enum cbl_field_attr_t):
(enum cbl_figconst_t): Formatting.
(LOW_VALUE_E): Handle enum arithmetic.
(ZERO_VALUE_E): Handle enum arithmetic.
(SPACE_VALUE_E): Handle enum arithmetic.
(QUOTE_VALUE_E): Handle enum arithmetic.
(HIGH_VALUE_E): Handle enum arithmetic.
(enum convert_type_t): Enum for new FUNCTION CONVERT.
(struct cbl_declarative_t): Formatting.
* encodings.h (struct encodings_t): Charsets.
* gcobolio.h: Charsets.
* gfileio.cc (get_filename): Rename to establish filename.
(establish_filename): Renamed from get_filename.
(relative_file_delete):  Charsets.
(__io__file_remove): Moved.
(trim_in_place): Charsets.
(relative_file_start): Charsets.
(relative_file_rewrite): Charsets.
(relative_file_write): Charsets.
(sequential_file_write): Charsets.
(line_sequential_file_read): Charsets.
(sequential_file_read): Charsets.
(relative_file_read): Charsets.
(__gg__file_reopen): Charsets.
(__io__file_open): Charsets.
(__io__file_close): Charsets.
(gcobol_fileops): Charsets.
(__gg__file_open): Charsets.
(__gg__file_remove): Charsets.
* gfileio.h (__gg__file_open): Charsets.
* gmath.cc (__gg__subtractf1_float_phase2): Comment.
(__gg__subtractf2_float_phase1): Comment.
(__gg__multiplyf1_phase2): Comment.
* intrinsic.cc (is_zulu_format): Charsets.
(string_to_dest): Charsets.
(get_all_time): Charsets.
(ftime_replace): Charsets.
(__gg__char): Charsets.
(__gg__current_date): Charsets.
(__gg__formatted_current_date): Charsets.
(__gg__formatted_date): Charsets.
(__gg__formatted_datetime): Charsets.
(__gg__formatted_time): Charsets.
(change_case): Charsets.
(__gg__upper_case): Charsets.
(numval): Charsets.
(numval_c): Charsets.
(__gg__trim): Charsets.
(__gg__reverse): Charsets.
(fill_cobol_tm): Charsets.
(__gg__seconds_from_formatted_time): Charsets.
(__gg__hex_of): Charsets.
(__gg__numval_f): Charsets.
(__gg__test_numval_f): Charsets.
(__gg__locale_date): Charsets.
(__gg__locale_time): Charsets.
(__gg__locale_time_from_seconds): Charsets.
* libgcobol.cc (NO_RDIGITS): Alias for (0).
(__gg__move): Forward reference.
(struct program_state): Charsets.
(cstrncmp): Charsets.
(__gg__init_program_state): Charsets.
(edited_to_binary): Charsets.
(var_is_refmod): Comment.
(__gg__power_of_ten): Reworked data initialization.
(__gg__scale_by_power_of_ten_1): Likewise.
(__gg__scale_by_power_of_ten_2): Likewise.
(value_is_too_big): Likewise.
(binary_to_big_endian): Likewise.
(binary_to_little_endian): Likewise.
(int128_to_int128_rounded): Likewise.
(get_binary_value_local): Likewise.
(get_init_value): Likewise.
(f128_to_i128_rounded): Likewise.
(__gg__initialization_values): Likewise.
(int128_to_field): Likewise.
(__gg__get_date_yymmdd): Charsets.
(__gg__field_from_string): Charsets.
(field_from_ascii): Charsets.
(__gg__get_date_yyyymmdd): Charsets.
(__gg__get_date_yyddd): Charsets.
(__gg__get_yyyyddd): Charsets.
(__gg__get_date_dow): Charsets.
(__gg__get_date_hhmmssff): Charsets.
(collation_position): Charsets.
(uber_compare): Charsets.
(__gg__dirty_to_binary): Charsets.
(__gg__dirty_to_float): Charsets.
(format_for_display_internal): Charsets.
(compare_88): Charsets.
(get_float128): Reworked.
(compare_field_class): Charsets.
(interconvert): Charsets.
(compare_strings): Charsets.
(__gg__compare_2): Charsets.
(compare_two_records): Charsets.
(__gg__sort_table): Charsets.
(init_var_both): Charsets.
(__gg__initialize_variable_clean): Charsets.
(alpha_to_alpha_move_from_location): Charsets.
(__gg__memdup): New function.
(alpha_to_alpha_move): Charsets.
(__gg__sort_workfile): Charsets.
(__gg__merge_files): Charsets.
(funky_find_wide): Charsets.
(funky_find_wide_backward): Charsets.
(normalize_id): Charsets.
(match_lengths): Charsets.
(the_alpha_and_omega): Charsets.
(the_alpha_and_omega_backward): Charsets.
(inspect_backward_format_1): Charsets.
(__gg__inspect_format_1): Charsets.
(inspect_backward_format_2): Charsets.
(__gg__inspect_format_2): Charsets.
(normalize_for_inspect_format_4): Charsets.
(__gg__inspect_format_4): Charsets.
(move_string): Charsets.
(brute_force_trim): Charsets.
(__gg__string): Charsets.
(display_both): Charsets.
(__gg__display_string): Charsets.
(__gg__bitwise_op): Charsets.
(is_numeric_display_numeric): Charsets.
(is_alpha_a_number): Charsets.
(classify_numeric_type): Charsets.
(classify_alphabetic_type): Charsets.
(__gg__classify): Charsets.
(__gg__convert_encoding): Charsets.
(accept_envar): Charsets.
(__gg__accept_envar): Charsets.
(__gg__get_argc): Charsets.
(__gg__get_argv): Charsets.
(__gg__get_command_line): Charsets.
(__gg__parser_set_conditional): Charsets.
(__gg__literaln_alpha_compare): Charsets.
(string_in): Charsets.
(__gg__unstring): Charsets.
(__gg__integer_from_float128): Charsets.
(__gg__adjust_dest_size): Charsets.
(__gg__just_mangle_name): Charsets.
(__gg__function_handle_from_name): Charsets.
(get_the_byte): Charsets.
(__gg__refer_from_string): Charsets.
(__gg__refer_from_psz): Charsets.
(__gg__find_string): Charsets.
(convert_for_convert): Charsets.
(__gg__convert): Charsets.
* libgcobol.h (__gg__compare_2): Charsets.
(__gg__field_from_string): Charsets.
(__gg__memdup): Charsets.
* posix/bin/Makefile: Posix bindings.
* posix/bin/scrape.awk: Posix bindings.
* posix/bin/udf-gen: Posix bindings.
* posix/udf/posix-lseek.cbl: Posix bindings.
* posix/udf/posix-unlink.cbl: Posix bindings.
* stringbin.cc (__gg__binary_to_string_encoded): Charsets.
(__gg__numeric_display_to_binary): Charsets.
* stringbin.h (__gg__binary_to_string_encoded): Charsets.
* valconv.cc (__gg__string_to_numeric_edited): Charsets.
* posix/cpy/psx-lseek.cpy: New file.
* posix/shim/lseek.cc: New file.

gcc/testsuite/ChangeLog:

* cobol.dg/group2/CHAR_and_ORD_with_COLLATING_sequence_-_EBCDIC.cob:
Change diagnostics message.
* cobol.dg/group2/Multi-target_MOVE_with_subscript_re-evaluation.cob:
Change diagnostics message.
* cobol.dg/group2/floating-point_SUBTRACT_FORMAT_2.out:
Change diagnostics message.
* cobol.dg/group2/floating-point_literals.out:
Change diagnostics message.

2 months agoDaily bump.
GCC Administrator [Sat, 17 Jan 2026 00:16:34 +0000 (00:16 +0000)] 
Daily bump.

2 months agoc++/reflection: amend comment
Marek Polacek [Fri, 16 Jan 2026 22:30:05 +0000 (17:30 -0500)] 
c++/reflection: amend comment

Clarify that the current code seems fine.

gcc/cp/ChangeLog:

* reflect.cc (eval_variable_of): Update comment.

2 months ago[AutoFDO] Walk function body to to find existing max copyids per location
Kugan Vivekanandarajah [Fri, 16 Jan 2026 20:59:57 +0000 (07:59 +1100)] 
[AutoFDO] Walk function body to to find existing max copyids per location

This patch addresses the review comment and walks the function body to
find existing max copyids per location in init_copyid_allocator.

gcc/ChangeLog:

2026-01-15  Kugan Vivekanandarajah  <kvivekananda@nvidia.com>

* hierarchical_discriminator.cc (init_copyid_allocator): Walks the function
body to find existing max copyids per location.
(record_existing_copyid): New.

gcc/testsuite/ChangeLog:

2026-01-15  Kugan Vivekanandarajah  <kvivekananda@nvidia.com>

* gcc.dg/hierarchical-discriminator-loop-version.c: Simplify.
* gcc.dg/hierarchical-discriminator-unroll.c: Likewise
* gcc.dg/hierarchical-discriminator-vect-version.c: Likewise.

Signed-off-by: Kugan Vivekanandarajah <kvivekananda@nvidia.com>
2 months agoaarch64: Accept hyphenated extensions in --with-arch [PR123460]
Alice Carlotti [Wed, 7 Jan 2026 18:55:46 +0000 (18:55 +0000)] 
aarch64: Accept hyphenated extensions in --with-arch [PR123460]

Add "-" to the list of valid characters in an extension name that is
used when removing the first extension from an extension string.

gcc/ChangeLog:

PR target/123460
* config.gcc: Accept hyphens in aarch64 --with-arch extensions.

2 months agogccrs: Fix empty struct constructors causing ICE during type checking
Yap Zhi Heng [Sun, 28 Dec 2025 13:03:13 +0000 (21:03 +0800)] 
gccrs: Fix empty struct constructors causing ICE during type checking

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check-expr.cc (visit(StructExprStruct)): Update to properly
unwrap enum variants for type checking.
* typecheck/rust-tyty.cc (VariantDef::get_fields) : Remove NUM assert.
* backend/rust-compile-expr.cc: Update to properly unwrap enum variants for type
resolution checking.

Signed-off-by: Yap Zhi Heng <yapzhhg@gmail.com>
2 months agogccrs: Adds and fixes tests for outer attributes in expression
lenny.chiadmi-delage [Tue, 6 Jan 2026 14:57:47 +0000 (14:57 +0000)] 
gccrs: Adds and fixes tests for outer attributes in expression

Adds test of issue 3904 and fix test of the issue 3874 to follows rust
1.49 behavior.

Fixes GCC-Rust/gccrs#3904

gcc/testsuite/ChangeLog:

* rust/compile/issue-3874.rs: Fixes test.
* rust/compile/issue-3904.rs: New test.

Signed-off-by: lenny.chiadmi-delage <lenny.chiadmi-delage@epita.fr>
2 months agogccrs: handle outer attributes in expression parsing
lenny.chiadmi-delage [Tue, 6 Jan 2026 14:51:14 +0000 (14:51 +0000)] 
gccrs: handle outer attributes in expression parsing

Fix parsing of outer attributes in expressions.

Fixes Rust-GCC/gccrs#3904

gcc/rust/ChangeLog:

* parse/rust-parse-impl-expr.hxx(Parser::null_denotation): Add
HASH case to handle outer attributes in expressions.

Signed-off-by: lenny.chiadmi-delage <lenny.chiadmi-delage@epita.fr>
2 months agogccrs: add unused label lint
Lucas Ly Ba [Wed, 7 Jan 2026 11:46:50 +0000 (11:46 +0000)] 
gccrs: add unused label lint

gcc/rust/ChangeLog:

* checks/lints/unused/rust-unused-checker.cc (UnusedChecker::visit_loop_label):
Add warning for unused label in LoopLabel expr.
* checks/lints/unused/rust-unused-checker.h: Likewise.
* checks/lints/unused/rust-unused-collector.cc (UnusedCollector::visit):
Check in BreakExpr and ContinueExpr if a label is used.
* checks/lints/unused/rust-unused-collector.h: Likewise.
* checks/lints/unused/rust-unused-context.cc (UnusedContext::add_label):
Method helper.
(UnusedContext::is_label_used): Likewise
* checks/lints/unused/rust-unused-context.h: Likewise.

gcc/testsuite/ChangeLog:

* rust/compile/unused-label_0.rs: New test.

Signed-off-by: Lucas Ly Ba <lucas.ly-ba@outlook.com>
2 months agogccrs: util/attributes: error on malformed #[no_mangle] input
Jayant Chauhan [Tue, 6 Jan 2026 18:12:58 +0000 (23:42 +0530)] 
gccrs: util/attributes: error on malformed #[no_mangle] input

Emit a diagnostic when #[no_mangle] is used with arguments,
matching rustc behavior. The no_mangle attribute is a word
attribute and should not accept any input values.

Fixes Rust-GCC#4230

gcc/rust/ChangeLog:

* util/rust-attributes.cc (AttributeChecker::visit): Emit diagnostic.

gcc/testsuite/ChangeLog:

* rust/compile/no_mangle-malformed.rs: New test.

Signed-off-by: Jayant Chauhan <0001jayant@gmail.com>
2 months agogccrs: util/attributes: error on malformed #[target_feature] input
Jayant Chauhan [Tue, 6 Jan 2026 16:25:02 +0000 (21:55 +0530)] 
gccrs: util/attributes: error on malformed #[target_feature] input

Emit a diagnostic when #[target_feature] is used without arguments,
matching rustc behavior. This prevents silent acceptance of empty
attributes and provides a helpful diagnostic that shows the expected form.

Fixes Rust-GCC#4233

gcc/rust/ChangeLog:

* util/rust-attributes.cc (AttributeChecker::visit): Emit diagnostic.

gcc/testsuite/ChangeLog:

* rust/compile/target_feature-malformed-4233.rs: New test.

Signed-off-by: Jayant Chauhan <0001jayant@gmail.com>
2 months agogccrs: add redudant semicolon lint
Lucas Ly Ba [Tue, 6 Jan 2026 11:21:13 +0000 (11:21 +0000)] 
gccrs: add redudant semicolon lint

gcc/rust/ChangeLog:

* checks/lints/unused/rust-unused-checker.cc (UnusedChecker::visit):
Emit warning in empty statement visitor.
* checks/lints/unused/rust-unused-checker.h:
Likewise.

gcc/testsuite/ChangeLog:

* rust/compile/redundant-semicolons_0.rs: New test.

Signed-off-by: Lucas Ly Ba <lucas.ly-ba@outlook.com>
2 months agogccrs: util/attributes: error on malformed #[link_name] input
Jayant Chauhan [Sat, 3 Jan 2026 23:36:53 +0000 (05:06 +0530)] 
gccrs: util/attributes: error on malformed #[link_name] input

Emit a diagnostic when #[link_name] is used without arguments,
matching rustc behavior. This prevents silent acceptance of empty
attributes and provides a helpful diagnostic that shows the expected form.

Fixes Rust-GCC#4228

gcc/rust/ChangeLog:

* util/rust-attributes.cc: Emit diagnostic.

gcc/testsuite/ChangeLog:

* rust/compile/link_name-malformed.rs: New test.

Signed-off-by: Jayant Chauhan <0001jayant@gmail.com>
2 months agogccrs: nr: Ignore errors when doing prelude resolution
Arthur Cohen [Wed, 1 Oct 2025 10:10:58 +0000 (12:10 +0200)] 
gccrs: nr: Ignore errors when doing prelude resolution

We only want to emit the ones from regular name resolution as otherwise
they will be doubled for the user for no good reason.

gcc/rust/ChangeLog:

* resolve/rust-name-resolution-context.h:

Co-authored-by: Owen Avery <powerboat9.gamer@gmail.com>
2 months agogccrs: nr: Do prelude resolution for Identifiers
Arthur Cohen [Fri, 12 Sep 2025 14:11:15 +0000 (16:11 +0200)] 
gccrs: nr: Do prelude resolution for Identifiers

gcc/rust/ChangeLog:

* resolve/rust-forever-stack.h: New function.
* resolve/rust-forever-stack.hxx: Implement it.
* resolve/rust-late-name-resolver-2.0.cc (Late::visit): Call it if the prelude exists
and we have an unresolved Identifier Call it if the prelude exists and we have
an unresolved Identifier.

2 months agogccrs: forever-stack: Add extra path resolution from a known NodeId.
Arthur Cohen [Wed, 10 Sep 2025 07:39:18 +0000 (09:39 +0200)] 
gccrs: forever-stack: Add extra path resolution from a known NodeId.

gcc/rust/ChangeLog:

* resolve/rust-forever-stack.h: Add new resolve_path function.
* resolve/rust-forever-stack.hxx: Implement it.

2 months agogccrs: nr: Add prelude field to NRCtx, and fill it upon encountering a prelude.
Arthur Cohen [Wed, 10 Sep 2025 07:07:55 +0000 (09:07 +0200)] 
gccrs: nr: Add prelude field to NRCtx, and fill it upon encountering a prelude.

gcc/rust/ChangeLog:

* resolve/rust-early-name-resolver-2.0.cc (Early::finalize_glob_import): Save prelude
if we find one.
* resolve/rust-name-resolution-context.h: Add field.
* resolve/rust-toplevel-name-resolver-2.0.cc (has_prelude_import): New function.
(TopLevel::visit): Create a prelude glob import if necessary.
* resolve/rust-toplevel-name-resolver-2.0.h: Allow glob imports to be prelude imports.

2 months agogccrs: forever-stack: Display depth in debug string
Arthur Cohen [Wed, 31 Dec 2025 15:29:23 +0000 (16:29 +0100)] 
gccrs: forever-stack: Display depth in debug string

gcc/rust/ChangeLog:

* resolve/rust-forever-stack.h: Add depth parameter to function.
* resolve/rust-forever-stack.hxx: Likewise and use it.

2 months agogccrs: Explicitely specify templates for GCC5
Pierre-Emmanuel Patry [Mon, 5 Jan 2026 16:03:27 +0000 (17:03 +0100)] 
gccrs: Explicitely specify templates for GCC5

GCC5 does not infer correctly the type to use within the template.

gcc/rust/ChangeLog:

* parse/rust-parse-impl-expr.hxx: Use explicit template.
* parse/rust-parse-impl-path.hxx: Likewise.
* parse/rust-parse-impl-ttree.hxx: Likewise.
* parse/rust-parse-impl.hxx: Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2 months agogccrs: Use error wrapper when required instead of nullptr
Pierre-Emmanuel Patry [Fri, 26 Dec 2025 03:38:52 +0000 (04:38 +0100)] 
gccrs: Use error wrapper when required instead of nullptr

gcc/rust/ChangeLog:

* ast/rust-ast-collector.cc (TokenCollector::visit): Update function
name.
* ast/rust-ast-pointer-visitor.cc (PointerVisitor::visit): Likewise.
* ast/rust-ast-visitor.cc (DefaultASTVisitor::visit): Likewise.
* ast/rust-ast.cc (BreakExpr::as_string): Use getter function.
(AttributeParser::parse_path_meta_item): Convert to expected type.
(ReturnExpr::as_string): Change access to returned expr.
* ast/rust-desugar-for-loops.cc (DesugarForLoops::DesugarCtx::make_break_arm):
Likewise.
* ast/rust-expr.h (class BreakExpr): Make expr in break optional.
(class ReturnExpr): Make returned expr explicitely optional. Change the
getters and introduce a  const getter.
* expand/rust-cfg-strip.cc (CfgStrip::visit): Convert to expected type.
* expand/rust-macro-builtins-asm.cc (parse_reg_operand_in): Update
constructor call to new expected types.
(parse_reg_operand_out): Likewise.
(parse_reg_operand_inout): Likewise.
(parse_llvm_operands): Likewise.
* expand/rust-macro-builtins-format-args.cc (format_args_parse_expr):
Likewise.
(format_args_parse_arguments): Likewise.
* expand/rust-macro-builtins-helpers.cc (try_expand_many_expr): Update
value for tl::expected.
* expand/rust-macro-builtins-include.cc (MacroBuiltin::include_handler):
Likewise.
* expand/rust-macro-expand.cc (transcribe_expression): Update
constructor call with expected value.
* hir/rust-ast-lower-expr.cc (ASTLoweringExpr::visit): Likewise.
* parse/rust-parse-error.h (enum class): Add new error types for Expr
and StructExprField.
* parse/rust-parse-impl-expr.hxx: Explicitely handle return expr
parsing failure. Update to fit new expected types.
* parse/rust-parse-impl.hxx: Likewise.
* resolve/rust-late-name-resolver-2.0.cc (Late::visit): Adapt to
tl::expected.
* ast/rust-desugar-while-let.cc (DesugarWhileLet::DesugarCtx::make_break_arm):
Use optional for break expressions when missing instead of nullptr.
* parse/rust-parse.h: Change function return type with expected. Remove
error state from ExprOrStmt.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2 months agogccrs: Remove redundant error types
Pierre-Emmanuel Patry [Fri, 12 Dec 2025 12:17:22 +0000 (13:17 +0100)] 
gccrs: Remove redundant error types

Some error types in the parser had the exact same meaning and could be
grouped under one same type.

gcc/rust/ChangeLog:

* ast/rust-ast.cc (AttributeParser::parse_meta_item_lit): Use
tl::expected
* expand/rust-macro-builtins-helpers.cc (parse_single_string_literal):
Likewise.
* expand/rust-macro-expand.cc (MacroExpander::match_fragment):
Likewise.
* parse/rust-cfg-parser.cc (parse_cfg_option): Likewise.
* parse/rust-parse-error.h (struct SimplePath): Remove error type.
(struct DelimTokenTree): Likewise.
(struct Token): Likewise.
(struct TokenTree): Likewise.
(class LifetimeParam): Move from here ...
(struct LifetimeParam): ... to here. Add ctor.
(class Lifetime): Add error type.
(enum class): Remove AnonConst.
(struct BlockExpr): Change BlockExpr to generic node error.
* parse/rust-parse-impl-expr.hxx: Use tl::expected for errors.
* parse/rust-parse-impl-path.hxx: Likewise.
* parse/rust-parse-impl-ttree.hxx: Likewise.
* parse/rust-parse-impl.hxx: Likewise.
* parse/rust-parse.h: Update function return types with tl::expected
to propagate errors.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2 months agogccrs: Use tl::expected for parse_block_expr results
Pierre-Emmanuel Patry [Wed, 10 Dec 2025 14:24:58 +0000 (15:24 +0100)] 
gccrs: Use tl::expected for parse_block_expr results

gcc/rust/ChangeLog:

* parse/rust-parse-error.h (struct BlockExpr): Add BlockExpr error type
* parse/rust-parse-impl-expr.hxx: Update return types.
* parse/rust-parse-impl.hxx: Likewise.
* parse/rust-parse.h: Update function prototypes.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2 months agogccrs: Use error collector in the parser
Pierre-Emmanuel Patry [Wed, 10 Dec 2025 12:59:13 +0000 (13:59 +0100)] 
gccrs: Use error collector in the parser

Errors in the parser needs to be collected instead of emitted directly.

gcc/rust/ChangeLog:

* parse/rust-parse-impl.hxx: Collect errors instead of emitting them.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2 months agogccrs: Move old parser error classes to error header
Pierre-Emmanuel Patry [Wed, 10 Dec 2025 12:38:24 +0000 (13:38 +0100)] 
gccrs: Move old parser error classes to error header

A parser error header with Parse::Error namespace has recently been
introduced. Move some old parser error classes to this namespace.

gcc/rust/ChangeLog:

* parse/rust-parse.h (class ParseLifetimeParamError): Move error from
here ...
(class ParseLifetimeError): Likewise.
(enum class): Likewise.
* parse/rust-parse-error.h (class LifetimeParam): ... to here.
here.
(class Lifetime): Likewise.
(enum class): Likewise.
(struct LoopLabel): Likewise and make it a full struct with ctors.
(struct Self): Likewise.
* parse/rust-parse-impl-expr.hxx: Make error point to new namespace.
* parse/rust-parse-impl.hxx: Likewise.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
2 months agogccrs: Fix rogue macro error during lowering on expansion failure
Harishankar [Thu, 1 Jan 2026 05:17:23 +0000 (10:47 +0530)] 
gccrs: Fix rogue macro error during lowering on expansion failure

When a macro expansion fails (e.g. due to a parsing error like invalid
syntax in the macro body), the expander previously returned an error
fragment but did not update the AST. This left the original macro
invocation in place, which subsequently caused an ICE (rogue macro
detected) during the lowering phase.

This patch updates `expand_invoc` to replace the macro invocation with
an empty fragment if expansion fails, ensuring the compiler can proceed
(or exit gracefully) without crashing.

Fixes Rust-GCC/gccrs#4213

gcc/rust/ChangeLog:

* expand/rust-macro-expand.cc (MacroExpander::expand_invoc): Handle
error fragments by replacing them with empty fragments.

gcc/testsuite/ChangeLog:

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

Signed-off-by: Harishankar <harishankarpp7@gmail.com>
2 months agogccrs: remove match arm pattern vector to single pattern
Lucas Ly Ba [Thu, 20 Nov 2025 14:01:08 +0000 (14:01 +0000)] 
gccrs: remove match arm pattern vector to single pattern

This patch refactors all uses of vector patterns since a vector of
patterns would be considered as an alt pattern, a vector is considered
useless.

gcc/rust/ChangeLog:

* ast/rust-ast-builder.cc (Builder::match_arm): Moves the vector of patterns
to a single pattern.
* ast/rust-ast-collector.cc (TokenCollector::visit):Likewise.
* ast/rust-ast-pointer-visitor.cc (PointerVisitor::visit):Likewise.
* ast/rust-ast-visitor.cc (DefaultASTVisitor::visit):Likewise.
* ast/rust-ast.cc (IfLetExpr::as_string):Likewise.
(WhileLetLoopExpr::as_string):Likewise.
(MatchArm::as_string):Likewise.
* ast/rust-desugar-question-mark.cc (make_match_arm):Likewise.
* ast/rust-desugar-while-let.cc (DesugarWhileLet::desugar):Likewise.
* ast/rust-expr.h (class WhileLetLoopExpr):Likewise.
(class IfLetExpr):Likewise.
* backend/rust-compile-expr.cc (CompileExpr::visit):Likewise.
* checks/errors/rust-hir-pattern-analysis.cc (lower_arm):Likewise.
* expand/rust-cfg-strip.cc (CfgStrip::visit):Likewise.
* hir/rust-ast-lower.cc (ASTLoweringIfLetBlock::desugar_iflet):Likewise.
(ASTLoweringExprWithBlock::visit):Likewise.
* hir/rust-hir-dump.cc (Dump::do_matcharm):Likewise.
(Dump::visit):Likewise.
* hir/tree/rust-hir-expr.cc (OperatorExpr::operator=):Likewise.
(ArithmeticOrLogicalExpr::operator=):Likewise.
(ComparisonExpr::operator=):Likewise.
(LazyBooleanExpr::operator=):Likewise.
(TypeCastExpr::operator=):Likewise.
(AssignmentExpr::operator=):Likewise.
(CompoundAssignmentExpr::operator=):Likewise.
(GroupedExpr::operator=):Likewise.
(ArrayExpr::operator=):Likewise.
(ArrayIndexExpr::operator=):Likewise.
(CallExpr::operator=):Likewise.
(MethodCallExpr::operator=):Likewise.
(FieldAccessExpr::operator=):Likewise.
(BlockExpr::operator=):Likewise.
(BreakExpr::operator=):Likewise.
(ReturnExpr::operator=):Likewise.
(UnsafeBlockExpr::operator=):Likewise.
(BaseLoopExpr::operator=):Likewise.
(WhileLetLoopExpr::WhileLetLoopExpr):Likewise.
(WhileLetLoopExpr::operator=):Likewise.
(MatchArm::MatchArm):Likewise.
(MatchArm::operator=):Likewise.
(MatchExpr::operator=):Likewise.
* hir/tree/rust-hir-expr.h (class WhileLetLoopExpr):Likewise.
* hir/tree/rust-hir-visitor.cc (DefaultHIRVisitor::walk):Likewise.
(DefaultHIRVisitor::visit_match_arm):Likewise.
* hir/tree/rust-hir.cc (WhileLetLoopExpr::as_string):Likewise.
(MatchArm::as_string):Likewise.
* parse/rust-parse-impl-expr.hxx: Likewise.
* parse/rust-parse-impl.hxx: Likewise.
* parse/rust-parse.h:Likewise.
* resolve/rust-default-resolver.cc (DefaultResolver::visit_if_let_patterns):Likewise.
* resolve/rust-late-name-resolver-2.0.cc (Late::visit):Likewise.
* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit):Likewise.

Signed-off-by: Lucas Ly Ba <lucas.ly-ba@outlook.com>
2 months agogccrs: nr: Add better error to unresolved attribute macro
Arthur Cohen [Tue, 16 Sep 2025 08:47:05 +0000 (10:47 +0200)] 
gccrs: nr: Add better error to unresolved attribute macro

gcc/rust/ChangeLog:

* resolve/rust-early-name-resolver-2.0.cc (Early::visit_attributes): Mention the name
of the attribute macro that hasn't been found.

2 months agoanalyzer: fix check against --param=analyzer-bb-explosion-factor=0
David Malcolm [Fri, 16 Jan 2026 15:54:32 +0000 (10:54 -0500)] 
analyzer: fix check against --param=analyzer-bb-explosion-factor=0

analyzer.texi documents --param=analyzer-bb-explosion-factor=0 as a way
to make the analysis bail out early, but I broke this in
r16-6063-g0b786d961d4426.

Fix thusly.

gcc/analyzer/ChangeLog:
* engine.cc (exploded_graph::process_worklist): Remove guard on
limit being non-zero when checking for -Wanalyzer-too-complex
on overall number of exploded nodes.  Allow for the origin enode.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2 months agoanalyzer: add timevar values for supergraph manipulation [PR123145]
David Malcolm [Fri, 16 Jan 2026 15:54:31 +0000 (10:54 -0500)] 
analyzer: add timevar values for supergraph manipulation [PR123145]

Whilst tracking down the slowdown of PR analyzer/123145, I noticed that
the various supergraph manipulations introduced in
r16-6063-g0b786d961d4426 can take non-trivial amounts of time on
complicated TUs.  Add timevars to track each of them.

gcc/analyzer/ChangeLog:
PR analyzer/123145
* supergraph-fixup-locations.cc: Include "timevar.h".
(supergraph::fixup_locations): Track time spent as
TV_ANALYZER_SUPERGRAPH_FIXUP_LOCATIONS.
* supergraph-simplify.cc: Include "timevar.h".
(supergraph::simplify): Track time spent as
TV_ANALYZER_SUPERGRAPH_SIMPLIFY.
* supergraph-sorting.cc: Include "timevar.h".
(supergraph::sort_nodes): Track time spent as
TV_ANALYZER_SUPERGRAPH_SORTING.
* supergraph.cc (supergraph::supergraph): Track time spent as
TV_ANALYZER_SUPERGRAPH_CREATION rather than
TV_ANALYZER_SUPERGRAPH.

gcc/ChangeLog:
PR analyzer/123145
* timevar.def (TV_ANALYZER_SUPERGRAPH): Rename to...
(TV_ANALYZER_SUPERGRAPH_CREATION): ...this.
(TV_ANALYZER_SUPERGRAPH_FIXUP_LOCATIONS): New.
(TV_ANALYZER_SUPERGRAPH_SIMPLIFY): New.
(TV_ANALYZER_SUPERGRAPH_SORTING): New.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2 months agoanalyzer: eliminate unused field eh_dispatch_edge_op::m_dst_snode [PR123540]
David Malcolm [Fri, 16 Jan 2026 15:54:31 +0000 (10:54 -0500)] 
analyzer: eliminate unused field eh_dispatch_edge_op::m_dst_snode [PR123540]

gcc/analyzer/ChangeLog:
PR analyzer/123540
* ops.cc (eh_dispatch_edge_op::make): Drop dst_snode param to
ctor.
(eh_dispatch_edge_op::eh_dispatch_edge_op): Likewise, dropping
field eh_dispatch_edge_op::m_dst_snode.
(eh_dispatch_try_edge_op::eh_dispatch_try_edge_op): Likewise.
(eh_dispatch_allowed_edge_op::eh_dispatch_allowed_edge_op):
Likewise.
* ops.h (eh_dispatch_edge_op::eh_dispatch_edge_op): Likewise.
(eh_dispatch_edge_op::m_dst_snode): Drop unused field.
(eh_dispatch_try_edge_op::eh_dispatch_try_edge_op): Drop unused
dst_snode param.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2 months ago[PR123092, LRA]: Reprocess insn after equivalence substitution
Vladimir N. Makarov [Fri, 16 Jan 2026 15:09:52 +0000 (10:09 -0500)] 
[PR123092, LRA]: Reprocess insn after equivalence substitution

LRA in the test case substituted equivalence in an insn but did not
process the insn on satisfying constraints after that.  It resulted in
error "insn does not satisfy its constraints"

gcc/ChangeLog:

PR target/123092
* lra-constraints.cc (lra_constraints): Push insn on processing
stack after equivalence substitution.

gcc/testsuite/ChangeLog:

PR target/123092
* gcc.target/riscv/pr123092.c: New.

2 months agoc++/reflection: enable more testing
Marek Polacek [Thu, 15 Jan 2026 19:57:13 +0000 (14:57 -0500)] 
c++/reflection: enable more testing

These TODOs already work fine so let's enable more testing.

gcc/testsuite/ChangeLog:

* g++.dg/reflect/member15.C: Enable commented-out test.
* g++.dg/reflect/splice5.C: Likewise.  Add XFAIL.

Reviewed-by: Jason Merrill <jason@redhat.com>
2 months agoProvide gt_pch_get_address etc. on FreeBSD [PR110746]
Rainer Orth [Fri, 16 Jan 2026 12:12:03 +0000 (13:12 +0100)] 
Provide gt_pch_get_address etc. on FreeBSD [PR110746]

On FreeBSD/amd64, more than 700 tests FAIL like

FAIL: gcc.dg/pch/common-1.c  -O0 -g -I. -Dwith_PCH (test for excess errors)
Excess errors:
gcc/testsuite/gcc.dg/pch/common-1.c:1: sorry, unimplemented: PCH allocation failure

This can easily be fixed by implementing the
host_hooks.gt_pch_get_address hook.  The code is shamelessly stolen from
the openbsd implementation, only changing the names and omitting the
hppa and i386 code.  The former isn't supported by FreeBSD at all AFAIK,
while the latter has just been removed in FreeBSD 15.0.

Bootstrapped without regressions on x86_64-unknown-freebsd14.3: all PCH
failures are gone.

2026-01-15  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

gcc:
PR pch/110746
* config/host-freebsd.cc: New file.
* config.host <*-*-freebsd*>: Use it.
* config/x-freebsd: New file.

2 months agoipa-cp: Fix devirt bonus for targets that cannot be inlined
Martin Jambor [Fri, 16 Jan 2026 11:04:23 +0000 (12:04 +0100)] 
ipa-cp: Fix devirt bonus for targets that cannot be inlined

PR 123412 has been filed because since commit
r16-3990-gad3fb999a1b568 (Jan Hubicka: Improve ipa-cp devirtualization
costing), there is accidentally zero devirtualization bonus for
functions which cannot be inlined.  This has resulted in
g++.dg/ipa/devirt-2.C failing since it has been pushed because the
required function is not cloned even with --param max-devirt-targets=1.

The intention was that we do get at least some small benefit boost and
so this patch adds an addition of the indirect edge frequency once
before the early continue statements.

gcc/ChangeLog:

2026-01-14  Martin Jambor  <mjambor@suse.cz>

PR ipa/123412
* ipa-cp.cc (devirtualization_time_bonus): Do add the indirect
edge frequency at least once even for targets which cannot be
inlined.

2 months agoc, c++: Fix vector enum division handling [PR123437]
Jakub Jelinek [Fri, 16 Jan 2026 10:03:18 +0000 (11:03 +0100)] 
c, c++: Fix vector enum division handling [PR123437]

To my surprise we accept generic vectors with enumeral element
types (unlike e.g. _Complex) and we don't actually try to
perform "integral" promotions for those either (which for scalars
promotes ENUMERAL_TYPE operands to their underlying type or
promoted underlying type).  I'm afraid it is inappropriate
to change the promotions at this point in stage4, that would
be a significant user visible change (though sure for a feature
that hopefully nobody actually uses).  Anyway, in GCC 16
development some assertions that RDIV_EXPR is only used for floating
(scalar/vector/complex) operands were added and those now trigger
on trying to divide vectors where both operands are enum vectors.
THis is due to the FEs using RDIV_EXPR instead of TRUNC_DIV_EXPR
when the operands (after promotions) don't have INTEGER_TYPE (or for C
BITINT_TYPE) operands.

This patch just adds vector enum to that.

2026-01-16  Jakub Jelinek  <jakub@redhat.com>
    Peter Damianov  <peter0x44@disroot.org>

PR c/123437
* c-typeck.cc (build_binary_op): Don't use RDIV_EXPR
resultcode if both types are integral, _BitInt or
newly VECTOR_TYPE of ENUMERAL_TYPE.

* typeck.cc (cp_build_binary_op): Don't use RDIV_EXPR
resultcode if both types are integral, _BitInt or
newly VECTOR_TYPE of ENUMERAL_TYPE.

* c-c++-common/pr123437.c: New test.

2 months agoi386: Fix up movhf_mask constraints [PR123607]
Jakub Jelinek [Fri, 16 Jan 2026 07:22:32 +0000 (08:22 +0100)] 
i386: Fix up movhf_mask constraints [PR123607]

As documented in the manuals and enforced by gas,
VMOVSH two operand loads and three operands moves accept both
masking and masking/zeroing, but VMOVSH two operand store accepts
only masking:
EVEX.LLIG.F3.MAP5.W0 10 /r VMOVSH xmm1{k1}{z}, m16
EVEX.LLIG.F3.MAP5.W0 11 /r VMOVSH m16{k1}, xmm1
EVEX.LLIG.F3.MAP5.W0 10 /r VMOVSH xmm1{k1}{z}, xmm2, xmm3
EVEX.LLIG.F3.MAP5.W0 11 /r VMOVSH xmm1{k1}{z}, xmm2, xmm3
But the constraints in movhf_mask define_insn were allowing 0C
for all the alternatives.  The following patch enforces just 0
(i.e. just non-zeroing masking) for the second alternative (i.e.
the store).

2026-01-16  Jakub Jelinek  <jakub@redhat.com>

PR target/123607
* config/i386/i386.md (movhf_mask): Change constraint on
match_operand 2's second alternative from 0C to 0.

* g++.target/i386/avx512fp16-pr123607.C: New test.

2 months agoLoongArch: Fix bug123521.
Lulu Cheng [Mon, 12 Jan 2026 09:23:41 +0000 (17:23 +0800)] 
LoongArch: Fix bug123521.

In the vector initialization process, optimization can be performed
if it can be determined that all elements are the same, or if the
upper or lower halves are identical.  However, during this
optimization, when the identical element is an immediate value
larger than 10 bits, an internal compiler error (ICE) occurs.
The reason is that in such cases, the function
`simplify_gen_subreg (imode, reg_tmp, GET_MODE (reg_tmp), 0)` is
called, where `imode` is `E_DImode`.  The mode of `reg_tmp` in
`GET_MODE (reg_tmp)` is taken from the immediate value's mode,
which is `E_VOIDmode`.  This results in a move from `E_VOIDmode`
to `E_DImode`, an operation not supported by LoongArch.

PR target/123521

gcc/ChangeLog:

* config/loongarch/loongarch.cc
(loongarch_expand_vector_init_same): Fixed a bug in the
vector initialization section..

gcc/testsuite/ChangeLog:

* gcc.target/loongarch/vector/lasx/pr123521.c: New test.

Suggested-by: Xi Ruoyao <xry111@xry111.site>
2 months agoMIPS: Add R5900 to ISA_HAS_FMIN_FMAX.
David Guillen Fandos [Wed, 14 Jan 2026 23:45:37 +0000 (00:45 +0100)] 
MIPS: Add R5900 to ISA_HAS_FMIN_FMAX.

The R5900 doesn't have proper IEEE754 handling: for all its FP
instructions, like "c.eq.s" or "add.s".

Since most of the other instructions are also broken,
so we can just define this, and the users should know about
what they are doing.

gcc/ChangeLog:

* config/mips/mips.h (ISA_HAS_FMIN_FMAX): Add R5900;
note that, R5900 is not IEEE754 fully compatiable.

Signed-off-by: David Guillen Fandos <david@davidgf.net>
2 months agoDaily bump.
GCC Administrator [Fri, 16 Jan 2026 00:16:30 +0000 (00:16 +0000)] 
Daily bump.

2 months agotestsuite: Require target x86_64 and aarch64 for gcc.dg/pr123109.c
Pengxuan Zheng [Thu, 15 Jan 2026 19:53:21 +0000 (11:53 -0800)] 
testsuite: Require target x86_64 and aarch64 for gcc.dg/pr123109.c

This fixes failures on i686 and arm.

gcc/testsuite/ChangeLog:

* gcc.dg/pr123109.c: Require target x86_64 and aarch64.

Signed-off-by: Pengxuan Zheng <pengxuan.zheng@oss.qualcomm.com>
2 months agoFix RISC-V test after recent vectorizer changes
Jeff Law [Thu, 15 Jan 2026 19:49:55 +0000 (12:49 -0700)] 
Fix RISC-V test after recent vectorizer changes

Richi's patch to fix costing of permuted contiguous loads changed the code
generation for pr122445.c in the testsuite.  After reviewing the code, it looks
clearly better to me -- essentially covering 2X as many elements per vector op
with fewer total vector ops in the end (without resulting to LMUL > 1).

I've verified this fixes the overnight regressions seen on riscv{32,64}-elf.
The bootstrap and regression tests are in flight, but won't finish for many
more hours.

gcc/testsuite
* gcc.target/riscv/rvv/autovec/pr122445.c: Adjust expected output.

2 months agoc-family: Regenerate c.opt.urls
Jakub Jelinek [Thu, 15 Jan 2026 16:12:07 +0000 (17:12 +0100)] 
c-family: Regenerate c.opt.urls

We forgot to regenerate c.opt.urls after the addition of -freflection
to c.opt.

2026-01-15  Jakub Jelinek  <jakub@redhat.com>

* c.opt.urls: Regenerate.

2 months agolibstdc++: Fix __cpp_impl_reflection comparisons
Jakub Jelinek [Thu, 15 Jan 2026 15:34:14 +0000 (16:34 +0100)] 
libstdc++: Fix __cpp_impl_reflection comparisons

Last night when applying Marek's patchset for testing I've noticed I forgot
to change these 5 spots when changing the -freflection -std=c++26 predefined
value from 202500 which meant we implement some reflection, but not the
whole paper, to 202506 which is the https://eel.is/c++draft/tab:cpp.predefined.ft
value for it.

2026-01-15  Jakub Jelinek  <jakub@redhat.com>

* include/std/type_traits (std::is_reflection, std::is_fundamental,
std::is_reflection_v, std::is_consteval_only): Compare
__cpp_impl_reflection >= 202506L instead of 202500L.
* testsuite/20_util/variable_templates_for_traits.cc: Likewise.

2 months agoc++: C++26 Reflection [PR120775]
Marek Polacek [Wed, 14 Jan 2026 16:37:39 +0000 (11:37 -0500)] 
c++: C++26 Reflection [PR120775]

This patch implements C++26 Reflection as specified by P2996R13, which allows
users to perform magic.  This patch also implements related papers:
Annotations for Reflection (P3394R4),
Splicing a base class subobject (P3293R3),
define_static_{string,object,array} (P3491R3),
Function Parameter Reflection (P3096R12).
(I already implemented consteval blocks back in July.)
(We do not yet implement P3795.)

We also implemented some CWG issues that had been approved in Kona;
e.g., CWG 3101, 3109, 3111, 3115, 3117.

All metafunctions are implemented in this patch.

The feature needs to be enabled by -std=c++26 -freflection.

Some stats: the v1 patch was over 51,200 LOC which were written in ~335
commits.  It came with over 400 tests with 11,722 static_asserts.  We still
had about 50 TODOs and FIXMEs in the code.
v2 consists of about 56,000 LOC which were created in 440 commits.  We
now have 446 tests with 40 TODOs remaining.
v3 brought another 77 commits, mostly clean-ups and various bug fixes.

I'd like to thank:
Jakub Jelinek, whose efforts can only be described as heroic and who
never ceases to amaze me even after nearly 15 years of working together,
he implemented many difficult metafunctions, annotations, mangling,
converted our metafunction dispatch to using gperf, and so on and on;
Jonathan Wakely for his libstdc++ patch review and generous & impeccable
advice even at odd hours; Dan Katz for his work on the Reflection papers,
writing Reflection tests for clang++ (many of which I've stolen^Wused),
for his advice, bug reports, and generally cheering me on; Jason Merrill
for his guidance, patch review, and, in fact, encouraging me to take on
this project in the first place; Michael Levine, Valentyn Yukhymenko, and
Alex Yesmanchyk for their nice contributions to Reflection; and Tomasz
Kamiński for providing test cases, finding bugs, and answering my C++
questions.

PR c++/120775
PR c++/123081
PR c++/122634

gcc/ChangeLog:

* attribs.cc (attribute_value_equal): Return false if either attribute
is ATTR_UNIQUE_VALUE_P.
(merge_attributes): Handle lists with ATTR_UNIQUE_VALUE_P values.
* doc/invoke.texi: Document -freflection.
* dwarf2out.cc (is_base_type) <case default>: Check
TREE_CODE >= LAST_AND_UNUSED_TREE_CODE instead of is_cxx_auto.
(gen_type_die_with_usage): For TREE_CODE >= LAST_AND_UNUSED_TREE_CODE
trees use use DW_TAG_unspecified_type.
* tree-core.h (struct tree_base): Update a comment.
* tree.h (ATTR_UNIQUE_VALUE_P): Define.
(BINFO_BASE_ACCESSES): Update the comment.

gcc/c-family/ChangeLog:

* c-attribs.cc (attribute_takes_identifier_p): Return false for C++
annotations.  Handle "old parm name".
* c-cppbuiltin.cc (c_cpp_builtins): Define __cpp_impl_reflection.
* c.opt (freflection): New.

gcc/cp/ChangeLog:

* Make-lang.in: Add cp/reflect.o.  Add a rule for cp/metafns.h.
* config-lang.in: Add reflect.cc.
* constexpr.cc (constexpr_global_ctx): Add consteval_block and
metafns_called members.  Initialize them.
(cxx_constexpr_quiet_p): New.
(cxx_constexpr_manifestly_const_eval): New.
(cxx_constexpr_caller): New.
(cxx_constexpr_consteval_block): New.
(enum value_cat): Move into cp-tree.h.
(cxx_eval_constant_expression): Move the declaration into cp-tree.h.
No longer static.  Handle REFLECT_EXPR.  Handle conversion of
a reflection to the meta::info type.
(cxx_eval_cxa_builtin_fn): Override current_function_decl.
(cxx_eval_builtin_function_call): Handle __builtin_is_string_literal.
(is_std_allocator): Also check __new_allocator.
(is_std_allocator_allocate): No longer static.
(cxa_allocate_and_throw_exception): New.
(cxx_eval_call_expression): Handle metafunctions.  Maybe set
metafns_called.
(reduced_constant_expression_p): Handle REFLECT_EXPR.
(cxx_eval_binary_expression): Use compare_reflections for comparing
reflections.
(find_immediate_fndecl): Don't walk REFLECT_EXPR_P.
(cxx_eval_outermost_constant_expr): Set global_ctx.consteval_block.
Detect consteval-only smuggling.
(potential_constant_expression_1): Return true for REFLECT_EXPR
and SPLICE_EXPR.
* constraint.cc (diagnose_trait_expr): Add CPTK_IS_CONSTEVAL_ONLY case.
* cp-gimplify.cc (immediate_escalating_function_p): No longer static.
(promote_function_to_consteval): Likewise.
(cp_gimplify_expr) <case CALL_EXPR>: Detect any surviving consteval-only
expressions.
<case CP_BUILT_IN_IS_STRING_LITERAL>: Handle.
(wipe_consteval_only_r): New.
(cp_fold_immediate_r): Detect invalid uses of consteval-only types.
Clear consteval-only DECL_EXPRs.
(cp_genericize_r): Wipe consteval-only vars from BIND_EXPR_VARS and
BLOCK_VARS.
* cp-objcp-common.cc (cp_common_init_ts): Mark META_TYPE, SPLICE_SCOPE,
SPLICE_EXPR, and REFLECT_EXPR.
* cp-trait.def (IS_CONSTEVAL_ONLY): New trait.
* cp-tree.def (REFLECT_EXPR, META_TYPE, SPLICE_EXPR, SPLICE_SCOPE): New
trees.
* cp-tree.h (enum cp_tree_index): Add CPTI_ANNOTATION_IDENTIFIER,
CPTI_STD_META, and CPTI_META_INFO_TYPE.
(std_meta_node): Define.
(meta_info_type_node): Define.
(annotation_identifier): Define.
(REFLECTION_TYPE_P): Define.
(REFLECT_EXPR_P): Define.
(REFLECT_EXPR_HANDLE): Define.
(enum reflect_kind): New.
(REFLECT_EXPR_KIND): Define.
(SET_REFLECT_EXPR_KIND): Define.
(SPLICE_EXPR_EXPRESSION_P): Define.
(SET_SPLICE_EXPR_EXPRESSION_P): Define.
(SPLICE_EXPR_MEMBER_ACCESS_P): Define.
(SET_SPLICE_EXPR_MEMBER_ACCESS_P): Define.
(SPLICE_EXPR_ADDRESS_P): Define.
(SET_SPLICE_EXPR_ADDRESS_P): Define.
(SPLICE_SCOPE_EXPR): Define.
(SPLICE_SCOPE_TYPE_P): Define.
(WILDCARD_TYPE_P): Include SPLICE_SCOPE.
(COMPONENT_REF_SPLICE_P): Define.
(SCALAR_TYPE_P): Include REFLECTION_TYPE_P.
(ENUM_BEING_DEFINED_P): Define.
(OLD_PARM_DECL_P): Define.
(MULTIPLE_NAMES_PARM_P): Define.
(cp_preserve_using_decl): Declare.
(DEF_OPERATOR, DEF_ASSN_OPERATOR): Include META.
(struct ovl_op_info_t): Add meta_name member.
(enum cp_built_in_function): Add CP_BUILT_IN_IS_STRING_LITERAL.
(build_stub_type): Declare.
(current_function_decl_without_access_scope): Declare.
(dependent_namespace_p): Declare.
(convert_reflect_constant_arg): Declare.
(finish_base_specifier): Adjust declaration.
(parsing_lambda_declarator): Declare.
(fold_builtin_is_string_literal): Declare.
(annotation_p): Declare.
(finish_class_member_access_expr): Adjust declaration.
(immediate_escalating_function_p): Declare.
(promote_function_to_consteval): Declare.
(is_std_allocator_allocate): Declare.
(cxa_allocate_and_throw_exception): Declare.
(enum value_cat): Define.
(cxx_eval_constant_expression): Declare.
(cxx_constexpr_quiet_p): Declare.
(cxx_constexpr_manifestly_const_eval): Declare.
(cxx_constexpr_caller): Declare.
(cxx_constexpr_consteval_block): Declare.
(init_reflection): Declare.
(metafunction_p): Declare.
(direct_base_parent): Declare.
(process_metafunction): Declare.
(get_reflection): Declare.
(get_null_reflection): Declare.
(splice): Declare.
(check_out_of_consteval_use): Declare.
(consteval_only_p): Declare.
(compare_reflections): Declare.
(valid_splice_type_p): Declare.
(valid_splice_scope_p): Declare.
(check_splice_expr): Declare.
(make_splice_scope): Declare.
(dependent_splice_p): Declare.
(reflection_mangle_prefix): Declare.
(check_consteval_only_fn): Declare.
* cvt.cc (convert_to_void): Call check_out_of_consteval_use.
* cxx-pretty-print.cc (cxx_pretty_printer::unary_expression): New
REFLECT_EXPR case.
(cxx_pretty_printer::expression): Likewise.
(cxx_pretty_printer::simple_type_specifier): New META_TYPE case.
(cxx_pretty_printer::type_id): Likewise.
* decl.cc (duplicate_decls): Merge parameter names for Reflection.
Maybe set OLD_PARM_DECL_P.
(initialize_predefined_identifiers): Add "annotation ".
(cxx_init_decl_processing): Add __builtin_is_string_literal.  Call
init_reflection.
(maybe_commonize_var): Do nothing for consteval_only_p.
(check_initializer): Default-initialize std::meta::info.
(make_rtl_for_nonlocal_decl): For consteval_only_p vars, set
DECL_EXTERNAL and return early.
(cp_finish_decl): Call check_out_of_consteval_use.  Don't go
creating a varpool node for consteval_only_p.
(get_tuple_size): Check the instantiation instead of the type.
(grokfndecl): Call check_consteval_only_fn.
(xref_basetypes): Stitch annotations onto BINFO_BASE_ACCESSES.
(finish_enum_value_list): Clear ENUM_BEING_DEFINED_P.
* decl2.cc (is_late_template_attribute): Handle all annotations as
late.
(cp_check_const_attributes): Don't handle annotations here.
(maybe_make_one_only): Do nothing for consteval_only_p.
(mark_needed): Likewise.
(min_vis_expr_r): Handle reflections.
(prune_vars_needing_no_initialization): Skip consteval_only_p.
(no_linkage_error): Return early for metafunctions.
(c_parse_final_cleanups): Don't write out consteval_only_p vars.  Avoid
complaining about metafunctions.
* error.cc (dump_type): New cases for CONST_DECL, META_TYPE, and
SPLICE_SCOPE.
(dump_type_prefix): New cases for META_TYPE and SPLICE_SCOPE.
(dump_type_suffix): Likewise.
(dump_decl): Dump SPLICE_EXPR.
(dump_expr): Dump REFLECT_EXPR and SPLICE_EXPR.
* init.cc (build_zero_init_1): Build a null reflection value.
(perform_member_init): Call check_out_of_consteval_use.
* lex.cc (DEF_OPERATOR, OPERATOR_TRANSITION): Update defines.
* mangle.cc (write_type): Mangle META_TYPE.
(write_expression): Handle REFLECT_EXPR.
(write_reflection): New.
(write_template_arg_literal): New REFLECT_EXPR case.
(write_template_arg): Handle REFLECT_EXPR.
* method.cc (build_stub_type): No longer static.
* module.cc (trees_out::type_node): Handle META_TYPE.
(trees_in::tree_node): Likewise.
* name-lookup.cc (name_lookup::adl_type): std::meta is an associated
namespace of std::meta::info.
(strip_using_decl): Don't strip when cp_preserve_using_decl.
(handle_namespace_attrs): Handle annotations.
(do_namespace_alias): Handle SPLICE_EXPR.
(lookup_qualified_name): When cp_preserve_using_decl, don't do
OVL_FUNCTION.
(finish_using_directive): Detect annotations on using directive.
* operators.def: Update for META_NAME.
* parser.cc: New cp_preserve_using_decl global.
(enum required_token): Add RT_CLOSE_SPLICE.
(get_required_cpp_ttype): Return CPP_CLOSE_SPLICE for RT_CLOSE_SPLICE.
(cp_parser_next_tokens_start_splice_type_spec_p): New.
(cp_parser_next_tokens_can_start_splice_scope_spec_p): New.
(cp_parser_splice_specifier): New.
(cp_parser_splice_type_specifier): New.
(cp_parser_splice_expression): New.
(cp_parser_splice_scope_specifier): New.
(cp_parser_splice_spec_is_nns_p): New.
(cp_parser_nth_token_starts_splice_without_nns_p): New.
(cp_parser_primary_expression): Handle CPP_OPEN_SPLICE.  Give an
error for ^^ outside reflection.
(cp_parser_unqualified_id): Allow r.~typename [:R:].
(cp_parser_nested_name_specifier_opt): Cope with splice-scope-specifier.
(cp_parser_qualifying_entity): Parse splice-scope-specifier.
(cp_parser_postfix_expression): Deal with [: :] after a typename.
(cp_parser_postfix_dot_deref_expression): Parse & handle splices
in a class member access.  Pass splice_p to
finish_class_member_access_expr.
(cp_parser_reflection_name): New.
(cp_parser_reflect_expression): New.
(cp_parser_unary_expression): Parse reflect-expression.
(cp_parser_declaration): Parse splice-scope-specifier.
(cp_parser_decomposition_declaration): Detect annotations on structured
bindings.
(cp_parser_decltype_expr): Parse splice-expression.
(cp_parser_template_id): New parsed_templ argument.  If it's nonnull,
don't parse the template name.  Turn an assert into a condition.
(cp_parser_type_specifier): Handle typename [: :].
(cp_parser_simple_type_specifier): Parse splice-type-specifier.
(cp_parser_enum_specifier): Set ENUM_BEING_DEFINED_P.
(cp_parser_namespace_alias_definition): Parse splice-specifier.
(cp_parser_using_directive): Likewise.
(cp_parser_type_id_1): New bool * parameter to distinguish between
types and type aliases.  Set it.
(cp_parser_type_id): Adjust the call to cp_parser_type_id_1.
(cp_parser_template_type_arg): Likewise.
(cp_parser_trailing_type_id): Likewise.
(cp_parser_base_specifier): Handle annotations.  Maybe give an error
for splice-scope-specifier.  Parse splice-type-specifier.  Pass
annotations to finish_base_specifier.
(cp_parser_annotation): New.
(cp_parser_std_attribute_list): Detect mixing annotations and attributes
in the same list.
(cp_parser_annotation_list): New.
(cp_parser_std_attribute_spec): Parse annotations.
(cp_parser_skip_balanced_tokens): Also handle CPP_OPEN_SPLICE
and CPP_CLOSE_SPLICE.
(cp_parser_type_requirement): Parse splice-type-specifier.
(cp_parser_lookup_name): Also consider dependent namespaces.  Don't
call check_accessibility_of_qualified_id for USING_DECLs.
(cp_parser_required_error): Handle RT_CLOSE_SPLICE.
* pt.cc (current_function_decl_without_access_scope): New.
(verify_unstripped_args_1): REFLECT_EXPR_P is OK.
(iterative_hash_template_arg): Handle REFLECT_EXPR.
(convert_nontype_argument): Maybe give an error for REFLECTION_TYPE_P.
(for_each_template_parm_r): Handle SPLICE_SCOPE.
(instantiate_class_template): Handle annotations.
(tsubst_pack_index): Make static.
(tsubst_decl): Handle NAMESPACE_DECL.
(tsubst_splice_scope): New.
(tsubst_splice_expr): New.
(tsubst): Don't return early for NAMESPACE_DECL.   New META_TYPE case.
Handle a splice-specifier that expanded into a NAMESPACE_DECL.  Handle
SPLICE_SCOPE, SPLICE_EXPR, and TEMPLATE_ID_EXPR.
(tsubst_scope): Also accept NAMESPACE_DECL.
(tsubst_qualified_id): Check dependent_namespace_p.
(tsubst_lambda_expr): Set LAMBDA_EXPR_CONSTEVAL_BLOCK_P.
(tsubst_expr): Allow dependent_splice_p in an assert.  Check
COMPONENT_REF_SPLICE_P and pass it to finish_class_member_access_expr.
<case NAMESPACE_DECL>: Remove.
New REFLECT_EXPR and SPLICE_EXPR cases.
(unify): Handle META_TYPE.
(instantiate_body): Call check_consteval_only_fn.
(tsubst_enum): Set ENUM_BEING_DEFINED_P.
(dependent_type_p_r): A splice-scope-specifier is dependent.
(dependent_namespace_p): New.
(value_dependent_expression_p): Handle REFLECT_EXPR.  Also handle
[meta.reflection.access.context]/8.
(type_dependent_expression_p): REFLECT_EXPR_P is not type-dependent.
(convert_reflect_constant_arg): New.
* search.cc (check_final_overrider): Adjust for CWG 3117.
* semantics.cc (finish_base_specifier): Handle annotations.
(parsing_lambda_declarator): No longer static.
(finish_id_expression_1): Check dependent_namespace_p.
(fold_builtin_is_string_literal): New.
(trait_expr_value): Handle CPTK_IS_CONSTEVAL_ONLY.
(finish_trait_expr): Likewise.
* tree.cc (handle_annotation_attribute): New.
(builtin_valid_in_constant_expr_p): Return true for
CP_BUILT_IN_IS_STRING_LITERAL.
(cp_tree_equal): Handle comparing REFLECT_EXPRs.
(internal_attributes): Add "annotation ".
(annotation_p): New.
* typeck.cc (finish_class_member_access_expr): New splice_p argument.
Handle dependent splices.  Implement splicing a base class subobject.
Handle class member access using a splice-expression.
(cp_build_binary_op): Handle comparing std::meta::infos.
(check_return_expr): Call check_out_of_consteval_use.
* metafns.gperf: New file.
* metafns.h: New file.
* reflect.cc: New file.

libcc1/ChangeLog:

* libcp1plugin.cc (start_class_def): Update the call to
finish_base_specifier.

libcpp/ChangeLog:

* charset.cc (_cpp_destroy_iconv): Destroy narrow_cset_desc and
utf8_cset_desc.
(cpp_translate_string): New.
(cpp_valid_identifier): New.
* include/cpplib.h: Add OPEN_SPLICE, CLOSE_SPLICE, and REFLECT_OP to
TTYPE_TABLE.
(cpp_translate_string): Declare.
(cpp_valid_identifier): Declare.
* internal.h (struct cpp_reader): Add reverse_narrow_cset_desc and
reverse_utf8_cset_desc fields.
* lex.cc (_cpp_lex_direct): Emit CPP_CLOSE_SPLICE, CPP_REFLECT_OP,
and CPP_OPEN_SPLICE tokens.

libstdc++-v3/ChangeLog:

* include/Makefile.am (std_headers): Add ${std_srcdir}/meta.
* include/Makefile.in: Regenerate.
* include/bits/iterator_concepts.h (std::ranges::__access::__begin): Add
constexpr.
* include/bits/version.def (reflection): New.
* include/bits/version.h: Regenerate.
* include/precompiled/stdc++.h: Include <meta> for C++26.
* include/std/meta: New file.
* include/std/type_traits (std::is_reflection): New trait.
(std::is_fundamental): Include is_reflection for C++26 -freflection.
(std::is_reflection_v): New variable template.
(std::is_consteval_only): New trait.
(std::is_consteval_only_v): New variable template.
* src/c++23/std.cc.in: Add <meta> exports.
* testsuite/20_util/variable_templates_for_traits.cc: Add -freflection as
dg-additional-options for C++26.  Add std::is_reflection_v test in that case.
* testsuite/20_util/is_consteval_only/requirements/explicit_instantiation.cc: New test.
* testsuite/20_util/is_consteval_only/requirements/typedefs.cc: New test.
* testsuite/20_util/is_consteval_only/value.cc: New test.
* testsuite/20_util/is_reflection/requirements/explicit_instantiation.cc: New test.
* testsuite/20_util/is_reflection/requirements/typedefs.cc: New test.
* testsuite/20_util/is_reflection/value.cc: New test.

gcc/testsuite/ChangeLog:

* g++.dg/DRs/dr2581-1.C: Add -freflection.
* g++.dg/DRs/dr2581-2.C: Likewise.
* g++.dg/reflect/access_context1.C: New test.
* g++.dg/reflect/access_context2.C: New test.
* g++.dg/reflect/access_context3.C: New test.
* g++.dg/reflect/adl1.C: New test.
* g++.dg/reflect/alignment_of1.C: New test.
* g++.dg/reflect/alignment_of2.C: New test.
* g++.dg/reflect/annotations1.C: New test.
* g++.dg/reflect/annotations2.C: New test.
* g++.dg/reflect/annotations3.C: New test.
* g++.dg/reflect/annotations4.C: New test.
* g++.dg/reflect/annotations5.C: New test.
* g++.dg/reflect/annotations6.C: New test.
* g++.dg/reflect/annotations7.C: New test.
* g++.dg/reflect/annotations8.C: New test.
* g++.dg/reflect/anon1.C: New test.
* g++.dg/reflect/anon2.C: New test.
* g++.dg/reflect/anon3.C: New test.
* g++.dg/reflect/bases_of1.C: New test.
* g++.dg/reflect/bases_of2.C: New test.
* g++.dg/reflect/bases_of3.C: New test.
* g++.dg/reflect/bit_size_of1.C: New test.
* g++.dg/reflect/bitfield1.C: New test.
* g++.dg/reflect/can_substitute1.C: New test.
* g++.dg/reflect/class1.C: New test.
* g++.dg/reflect/class2.C: New test.
* g++.dg/reflect/common_reference1.C: New test.
* g++.dg/reflect/common_type1.C: New test.
* g++.dg/reflect/compare1.C: New test.
* g++.dg/reflect/compare10.C: New test.
* g++.dg/reflect/compare2.C: New test.
* g++.dg/reflect/compare3.C: New test.
* g++.dg/reflect/compare4.C: New test.
* g++.dg/reflect/compare5.C: New test.
* g++.dg/reflect/compare6.C: New test.
* g++.dg/reflect/compare7.C: New test.
* g++.dg/reflect/compare8.C: New test.
* g++.dg/reflect/compare9.C: New test.
* g++.dg/reflect/compat1.C: New test.
* g++.dg/reflect/complete1.C: New test.
* g++.dg/reflect/constant_of1.C: New test.
* g++.dg/reflect/constant_of2.C: New test.
* g++.dg/reflect/constant_of3.C: New test.
* g++.dg/reflect/constant_of4.C: New test.
* g++.dg/reflect/constant_of5.C: New test.
* g++.dg/reflect/constant_of6.C: New test.
* g++.dg/reflect/constant_of7.C: New test.
* g++.dg/reflect/constant_of8.C: New test.
* g++.dg/reflect/constant_of9.C: New test.
* g++.dg/reflect/crash1.C: New test.
* g++.dg/reflect/crash10.C: New test.
* g++.dg/reflect/crash11.C: New test.
* g++.dg/reflect/crash12.C: New test.
* g++.dg/reflect/crash13.C: New test.
* g++.dg/reflect/crash14.C: New test.
* g++.dg/reflect/crash15.C: New test.
* g++.dg/reflect/crash16.C: New test.
* g++.dg/reflect/crash17.C: New test.
* g++.dg/reflect/crash18.C: New test.
* g++.dg/reflect/crash2.C: New test.
* g++.dg/reflect/crash3.C: New test.
* g++.dg/reflect/crash4.C: New test.
* g++.dg/reflect/crash5.C: New test.
* g++.dg/reflect/crash6.C: New test.
* g++.dg/reflect/crash7.C: New test.
* g++.dg/reflect/crash8.C: New test.
* g++.dg/reflect/crash9.C: New test.
* g++.dg/reflect/data_member_spec1.C: New test.
* g++.dg/reflect/data_member_spec2.C: New test.
* g++.dg/reflect/data_member_spec3.C: New test.
* g++.dg/reflect/data_member_spec4.C: New test.
* g++.dg/reflect/dealias1.C: New test.
* g++.dg/reflect/dealias2.C: New test.
* g++.dg/reflect/dealias3.C: New test.
* g++.dg/reflect/define_aggregate1.C: New test.
* g++.dg/reflect/define_aggregate2.C: New test.
* g++.dg/reflect/define_aggregate3.C: New test.
* g++.dg/reflect/define_aggregate4.C: New test.
* g++.dg/reflect/define_aggregate5.C: New test.
* g++.dg/reflect/define_static_array1.C: New test.
* g++.dg/reflect/define_static_array2.C: New test.
* g++.dg/reflect/define_static_array3.C: New test.
* g++.dg/reflect/define_static_array4.C: New test.
* g++.dg/reflect/define_static_object1.C: New test.
* g++.dg/reflect/define_static_object2.C: New test.
* g++.dg/reflect/define_static_string1.C: New test.
* g++.dg/reflect/dep1.C: New test.
* g++.dg/reflect/dep10.C: New test.
* g++.dg/reflect/dep11.C: New test.
* g++.dg/reflect/dep2.C: New test.
* g++.dg/reflect/dep3.C: New test.
* g++.dg/reflect/dep4.C: New test.
* g++.dg/reflect/dep5.C: New test.
* g++.dg/reflect/dep6.C: New test.
* g++.dg/reflect/dep7.C: New test.
* g++.dg/reflect/dep8.C: New test.
* g++.dg/reflect/dep9.C: New test.
* g++.dg/reflect/diag1.C: New test.
* g++.dg/reflect/diag2.C: New test.
* g++.dg/reflect/diag3.C: New test.
* g++.dg/reflect/diag4.C: New test.
* g++.dg/reflect/display_string_of1.C: New test.
* g++.dg/reflect/eh1.C: New test.
* g++.dg/reflect/eh2.C: New test.
* g++.dg/reflect/eh3.C: New test.
* g++.dg/reflect/eh4.C: New test.
* g++.dg/reflect/eh5.C: New test.
* g++.dg/reflect/eh6.C: New test.
* g++.dg/reflect/eh7.C: New test.
* g++.dg/reflect/eh8.C: New test.
* g++.dg/reflect/eh9.C: New test.
* g++.dg/reflect/enumerators_of1.C: New test.
* g++.dg/reflect/error1.C: New test.
* g++.dg/reflect/error10.C: New test.
* g++.dg/reflect/error2.C: New test.
* g++.dg/reflect/error3.C: New test.
* g++.dg/reflect/error4.C: New test.
* g++.dg/reflect/error5.C: New test.
* g++.dg/reflect/error6.C: New test.
* g++.dg/reflect/error8.C: New test.
* g++.dg/reflect/error9.C: New test.
* g++.dg/reflect/expr1.C: New test.
* g++.dg/reflect/expr10.C: New test.
* g++.dg/reflect/expr11.C: New test.
* g++.dg/reflect/expr12.C: New test.
* g++.dg/reflect/expr13.C: New test.
* g++.dg/reflect/expr14.C: New test.
* g++.dg/reflect/expr2.C: New test.
* g++.dg/reflect/expr3.C: New test.
* g++.dg/reflect/expr4.C: New test.
* g++.dg/reflect/expr5.C: New test.
* g++.dg/reflect/expr6.C: New test.
* g++.dg/reflect/expr7.C: New test.
* g++.dg/reflect/expr8.C: New test.
* g++.dg/reflect/expr9.C: New test.
* g++.dg/reflect/extract1.C: New test.
* g++.dg/reflect/extract2.C: New test.
* g++.dg/reflect/extract3.C: New test.
* g++.dg/reflect/extract4.C: New test.
* g++.dg/reflect/extract5.C: New test.
* g++.dg/reflect/extract6.C: New test.
* g++.dg/reflect/extract7.C: New test.
* g++.dg/reflect/extract8.C: New test.
* g++.dg/reflect/extract9.C: New test.
* g++.dg/reflect/feat1.C: New test.
* g++.dg/reflect/feat2.C: New test.
* g++.dg/reflect/has_c_language_linkage1.C: New test.
* g++.dg/reflect/has_default_argument1.C: New test.
* g++.dg/reflect/has_default_argument2.C: New test.
* g++.dg/reflect/has_default_member_initializer1.C: New test.
* g++.dg/reflect/has_ellipsis_parameter1.C: New test.
* g++.dg/reflect/has_external_linkage1.C: New test.
* g++.dg/reflect/has_external_linkage2.C: New test.
* g++.dg/reflect/has_identifier1.C: New test.
* g++.dg/reflect/has_identifier2.C: New test.
* g++.dg/reflect/has_internal_linkage1.C: New test.
* g++.dg/reflect/has_internal_linkage2.C: New test.
* g++.dg/reflect/has_linkage1.C: New test.
* g++.dg/reflect/has_module_linkage1.C: New test.
* g++.dg/reflect/has_module_linkage2.C: New test.
* g++.dg/reflect/has_parent1.C: New test.
* g++.dg/reflect/has_template_arguments1.C: New test.
* g++.dg/reflect/has_template_arguments2.C: New test.
* g++.dg/reflect/has_template_arguments3.C: New test.
* g++.dg/reflect/has_template_arguments4.C: New test.
* g++.dg/reflect/identifier_of1.C: New test.
* g++.dg/reflect/identifier_of2.C: New test.
* g++.dg/reflect/init1.C: New test.
* g++.dg/reflect/init10.C: New test.
* g++.dg/reflect/init11.C: New test.
* g++.dg/reflect/init12.C: New test.
* g++.dg/reflect/init13.C: New test.
* g++.dg/reflect/init14.C: New test.
* g++.dg/reflect/init15.C: New test.
* g++.dg/reflect/init16.C: New test.
* g++.dg/reflect/init17.C: New test.
* g++.dg/reflect/init2.C: New test.
* g++.dg/reflect/init3.C: New test.
* g++.dg/reflect/init4.C: New test.
* g++.dg/reflect/init5.C: New test.
* g++.dg/reflect/init6.C: New test.
* g++.dg/reflect/init7.C: New test.
* g++.dg/reflect/init8.C: New test.
* g++.dg/reflect/init9.C: New test.
* g++.dg/reflect/is_accessible1.C: New test.
* g++.dg/reflect/is_accessible2.C: New test.
* g++.dg/reflect/is_alias_template1.C: New test.
* g++.dg/reflect/is_assignment1.C: New test.
* g++.dg/reflect/is_bit_field1.C: New test.
* g++.dg/reflect/is_class_member1.C: New test.
* g++.dg/reflect/is_class_template1.C: New test.
* g++.dg/reflect/is_complete_type1.C: New test.
* g++.dg/reflect/is_complete_type2.C: New test.
* g++.dg/reflect/is_concept1.C: New test.
* g++.dg/reflect/is_const1.C: New test.
* g++.dg/reflect/is_consteval_only1.C: New test.
* g++.dg/reflect/is_constructible_type1.C: New test.
* g++.dg/reflect/is_constructible_type2.C: New test.
* g++.dg/reflect/is_constructor_template1.C: New test.
* g++.dg/reflect/is_constuctor1.C: New test.
* g++.dg/reflect/is_conversion_function1.C: New test.
* g++.dg/reflect/is_conversion_function_template1.C: New test.
* g++.dg/reflect/is_copy_assignment1.C: New test.
* g++.dg/reflect/is_copy_constructor1.C: New test.
* g++.dg/reflect/is_data_member_spec1.C: New test.
* g++.dg/reflect/is_default_constructor1.C: New test.
* g++.dg/reflect/is_defaulted1.C: New test.
* g++.dg/reflect/is_defaulted2.C: New test.
* g++.dg/reflect/is_deleted1.C: New test.
* g++.dg/reflect/is_deleted2.C: New test.
* g++.dg/reflect/is_destructor1.C: New test.
* g++.dg/reflect/is_enumerable_type1.C: New test.
* g++.dg/reflect/is_enumerator1.C: New test.
* g++.dg/reflect/is_explicit1.C: New test.
* g++.dg/reflect/is_explicit2.C: New test.
* g++.dg/reflect/is_explicit_object_parameter1.C: New test.
* g++.dg/reflect/is_final1.C: New test.
* g++.dg/reflect/is_function1.C: New test.
* g++.dg/reflect/is_function2.C: New test.
* g++.dg/reflect/is_function3.C: New test.
* g++.dg/reflect/is_function_parameter1.C: New test.
* g++.dg/reflect/is_function_parameter2.C: New test.
* g++.dg/reflect/is_function_template1.C: New test.
* g++.dg/reflect/is_function_template2.C: New test.
* g++.dg/reflect/is_function_type1.C: New test.
* g++.dg/reflect/is_literal_operator1.C: New test.
* g++.dg/reflect/is_literal_operator_template1.C: New test.
* g++.dg/reflect/is_lrvalue_reference_qualified1.C: New test.
* g++.dg/reflect/is_move_assignment1.C: New test.
* g++.dg/reflect/is_move_constructor1.C: New test.
* g++.dg/reflect/is_mutable_member1.C: New test.
* g++.dg/reflect/is_namespace1.C: New test.
* g++.dg/reflect/is_namespace_alias1.C: New test.
* g++.dg/reflect/is_namespace_member1.C: New test.
* g++.dg/reflect/is_noexcept1.C: New test.
* g++.dg/reflect/is_noexcept2.C: New test.
* g++.dg/reflect/is_noexcept3.C: New test.
* g++.dg/reflect/is_noexcept4.C: New test.
* g++.dg/reflect/is_nonstatic_data_member1.C: New test.
* g++.dg/reflect/is_object1.C: New test.
* g++.dg/reflect/is_object2.C: New test.
* g++.dg/reflect/is_operator_function1.C: New test.
* g++.dg/reflect/is_operator_function_template1.C: New test.
* g++.dg/reflect/is_override1.C: New test.
* g++.dg/reflect/is_pure_virtual1.C: New test.
* g++.dg/reflect/is_special_member_function1.C: New test.
* g++.dg/reflect/is_static_member1.C: New test.
* g++.dg/reflect/is_string_literal1.C: New test.
* g++.dg/reflect/is_structured_binding1.C: New test.
* g++.dg/reflect/is_structured_binding2.C: New test.
* g++.dg/reflect/is_template1.C: New test.
* g++.dg/reflect/is_template2.C: New test.
* g++.dg/reflect/is_type1.C: New test.
* g++.dg/reflect/is_type_alias1.C: New test.
* g++.dg/reflect/is_type_alias2.C: New test.
* g++.dg/reflect/is_type_alias3.C: New test.
* g++.dg/reflect/is_user_declared1.C: New test.
* g++.dg/reflect/is_user_declared2.C: New test.
* g++.dg/reflect/is_user_provided1.C: New test.
* g++.dg/reflect/is_user_provided2.C: New test.
* g++.dg/reflect/is_variable1.C: New test.
* g++.dg/reflect/is_variable_template1.C: New test.
* g++.dg/reflect/is_virtual1.C: New test.
* g++.dg/reflect/is_volatile1.C: New test.
* g++.dg/reflect/lex1.C: New test.
* g++.dg/reflect/lex2.C: New test.
* g++.dg/reflect/mangle1.C: New test.
* g++.dg/reflect/member-visibility1.C: New test.
* g++.dg/reflect/member-visibility2.C: New test.
* g++.dg/reflect/member1.C: New test.
* g++.dg/reflect/member10.C: New test.
* g++.dg/reflect/member11.C: New test.
* g++.dg/reflect/member12.C: New test.
* g++.dg/reflect/member13.C: New test.
* g++.dg/reflect/member14.C: New test.
* g++.dg/reflect/member15.C: New test.
* g++.dg/reflect/member16.C: New test.
* g++.dg/reflect/member17.C: New test.
* g++.dg/reflect/member18.C: New test.
* g++.dg/reflect/member19.C: New test.
* g++.dg/reflect/member2.C: New test.
* g++.dg/reflect/member20.C: New test.
* g++.dg/reflect/member3.C: New test.
* g++.dg/reflect/member4.C: New test.
* g++.dg/reflect/member5.C: New test.
* g++.dg/reflect/member6.C: New test.
* g++.dg/reflect/member7.C: New test.
* g++.dg/reflect/member8.C: New test.
* g++.dg/reflect/member9.C: New test.
* g++.dg/reflect/members_of1.C: New test.
* g++.dg/reflect/members_of2.C: New test.
* g++.dg/reflect/members_of3.C: New test.
* g++.dg/reflect/members_of4.C: New test.
* g++.dg/reflect/members_of5.C: New test.
* g++.dg/reflect/members_of6.C: New test.
* g++.dg/reflect/members_of7.C: New test.
* g++.dg/reflect/metafn-ptr1.C: New test.
* g++.dg/reflect/ns1.C: New test.
* g++.dg/reflect/ns2.C: New test.
* g++.dg/reflect/ns3.C: New test.
* g++.dg/reflect/ns4.C: New test.
* g++.dg/reflect/ns5.C: New test.
* g++.dg/reflect/ns6.C: New test.
* g++.dg/reflect/null1.C: New test.
* g++.dg/reflect/null2.C: New test.
* g++.dg/reflect/null3.C: New test.
* g++.dg/reflect/null4.C: New test.
* g++.dg/reflect/null5.C: New test.
* g++.dg/reflect/object_of1.C: New test.
* g++.dg/reflect/object_of2.C: New test.
* g++.dg/reflect/odr1.C: New test.
* g++.dg/reflect/offset_of1.C: New test.
* g++.dg/reflect/operator_of1.C: New test.
* g++.dg/reflect/override1.C: New test.
* g++.dg/reflect/p2996-1.C: New test.
* g++.dg/reflect/p2996-10.C: New test.
* g++.dg/reflect/p2996-11.C: New test.
* g++.dg/reflect/p2996-12.C: New test.
* g++.dg/reflect/p2996-13.C: New test.
* g++.dg/reflect/p2996-14.C: New test.
* g++.dg/reflect/p2996-15.C: New test.
* g++.dg/reflect/p2996-16.C: New test.
* g++.dg/reflect/p2996-17.C: New test.
* g++.dg/reflect/p2996-18.C: New test.
* g++.dg/reflect/p2996-19.C: New test.
* g++.dg/reflect/p2996-2.C: New test.
* g++.dg/reflect/p2996-20.C: New test.
* g++.dg/reflect/p2996-21.C: New test.
* g++.dg/reflect/p2996-3.C: New test.
* g++.dg/reflect/p2996-4.C: New test.
* g++.dg/reflect/p2996-5.C: New test.
* g++.dg/reflect/p2996-6.C: New test.
* g++.dg/reflect/p2996-7.C: New test.
* g++.dg/reflect/p2996-8.C: New test.
* g++.dg/reflect/p2996-9.C: New test.
* g++.dg/reflect/p3394-1.C: New test.
* g++.dg/reflect/p3491-1.C: New test.
* g++.dg/reflect/p3491-2.C: New test.
* g++.dg/reflect/p3491-3.C: New test.
* g++.dg/reflect/pack-index1.C: New test.
* g++.dg/reflect/parameters_of1.C: New test.
* g++.dg/reflect/parameters_of2.C: New test.
* g++.dg/reflect/parameters_of3.C: New test.
* g++.dg/reflect/parameters_of4.C: New test.
* g++.dg/reflect/parameters_of5.C: New test.
* g++.dg/reflect/parameters_of6.C: New test.
* g++.dg/reflect/parent_of1.C: New test.
* g++.dg/reflect/parm1.C: New test.
* g++.dg/reflect/parm2.C: New test.
* g++.dg/reflect/parm3.C: New test.
* g++.dg/reflect/parm4.C: New test.
* g++.dg/reflect/pr122634-1.C: New test.
* g++.dg/reflect/pr122634-2.C: New test.
* g++.dg/reflect/qrn1.C: New test.
* g++.dg/reflect/qrn2.C: New test.
* g++.dg/reflect/range_args.C: New test.
* g++.dg/reflect/reflect_constant1.C: New test.
* g++.dg/reflect/reflect_constant2.C: New test.
* g++.dg/reflect/reflect_constant3.C: New test.
* g++.dg/reflect/reflect_constant4.C: New test.
* g++.dg/reflect/reflect_constant5.C: New test.
* g++.dg/reflect/reflect_constant6.C: New test.
* g++.dg/reflect/reflect_constant7.C: New test.
* g++.dg/reflect/reflect_constant8.C: New test.
* g++.dg/reflect/reflect_constant9.C: New test.
* g++.dg/reflect/reflect_constant_array1.C: New test.
* g++.dg/reflect/reflect_constant_array2.C: New test.
* g++.dg/reflect/reflect_constant_array3.C: New test.
* g++.dg/reflect/reflect_constant_array4.C: New test.
* g++.dg/reflect/reflect_constant_string1.C: New test.
* g++.dg/reflect/reflect_constant_string2.C: New test.
* g++.dg/reflect/reflect_function1.C: New test.
* g++.dg/reflect/reflect_function2.C: New test.
* g++.dg/reflect/reflect_object1.C: New test.
* g++.dg/reflect/reflect_object2.C: New test.
* g++.dg/reflect/reflect_object3.C: New test.
* g++.dg/reflect/reflect_object4.C: New test.
* g++.dg/reflect/return_type_of1.C: New test.
* g++.dg/reflect/return_type_of2.C: New test.
* g++.dg/reflect/serialize1.C: New test.
* g++.dg/reflect/serialize2.C: New test.
* g++.dg/reflect/size_of1.C: New test.
* g++.dg/reflect/source_location_of1.C: New test.
* g++.dg/reflect/source_location_of2.C: New test.
* g++.dg/reflect/splice1.C: New test.
* g++.dg/reflect/splice2.C: New test.
* g++.dg/reflect/splice3.C: New test.
* g++.dg/reflect/splice4.C: New test.
* g++.dg/reflect/splice5.C: New test.
* g++.dg/reflect/splice6.C: New test.
* g++.dg/reflect/splice7.C: New test.
* g++.dg/reflect/splicing-base1.C: New test.
* g++.dg/reflect/splicing-base2.C: New test.
* g++.dg/reflect/splicing-base3.C: New test.
* g++.dg/reflect/splicing-base4.C: New test.
* g++.dg/reflect/storage_duration1.C: New test.
* g++.dg/reflect/storage_duration2.C: New test.
* g++.dg/reflect/storage_duration3.C: New test.
* g++.dg/reflect/subobjects_of1.C: New test.
* g++.dg/reflect/substitute1.C: New test.
* g++.dg/reflect/substitute2.C: New test.
* g++.dg/reflect/symbol_of1.C: New test.
* g++.dg/reflect/symbol_of2.C: New test.
* g++.dg/reflect/template_arguments_of1.C: New test.
* g++.dg/reflect/template_arguments_of2.C: New test.
* g++.dg/reflect/template_arguments_of3.C: New test.
* g++.dg/reflect/template_of1.C: New test.
* g++.dg/reflect/template_of2.C: New test.
* g++.dg/reflect/template_of3.C: New test.
* g++.dg/reflect/tuple1.C: New test.
* g++.dg/reflect/tuple2.C: New test.
* g++.dg/reflect/type1.C: New test.
* g++.dg/reflect/type10.C: New test.
* g++.dg/reflect/type2.C: New test.
* g++.dg/reflect/type3.C: New test.
* g++.dg/reflect/type4.C: New test.
* g++.dg/reflect/type5.C: New test.
* g++.dg/reflect/type6.C: New test.
* g++.dg/reflect/type7.C: New test.
* g++.dg/reflect/type8.C: New test.
* g++.dg/reflect/type9.C: New test.
* g++.dg/reflect/type_of1.C: New test.
* g++.dg/reflect/type_of2.C: New test.
* g++.dg/reflect/type_rels1.C: New test.
* g++.dg/reflect/type_trait1.C: New test.
* g++.dg/reflect/type_trait10.C: New test.
* g++.dg/reflect/type_trait11.C: New test.
* g++.dg/reflect/type_trait12.C: New test.
* g++.dg/reflect/type_trait13.C: New test.
* g++.dg/reflect/type_trait2.C: New test.
* g++.dg/reflect/type_trait3.C: New test.
* g++.dg/reflect/type_trait4.C: New test.
* g++.dg/reflect/type_trait5.C: New test.
* g++.dg/reflect/type_trait6.C: New test.
* g++.dg/reflect/type_trait8.C: New test.
* g++.dg/reflect/type_trait9.C: New test.
* g++.dg/reflect/u8display_string_of1.C: New test.
* g++.dg/reflect/u8identifier_of1.C: New test.
* g++.dg/reflect/u8symbol_of1.C: New test.
* g++.dg/reflect/underlying_type1.C: New test.
* g++.dg/reflect/using1.C: New test.
* g++.dg/reflect/value_or_object1.C: New test.
* g++.dg/reflect/variable_of1.C: New test.
* g++.dg/reflect/variable_of2.C: New test.
* g++.dg/reflect/variable_of3.C: New test.
* g++.dg/reflect/variant1.C: New test.
* g++.dg/reflect/variant2.C: New test.
* g++.dg/reflect/vector1.C: New test.
* g++.dg/reflect/visibility1.C: New test.

Co-authored-by: Jakub Jelinek <jakub@redhat.com>
Signed-off-by: Valentyn Yukhymenko <vyuhimenko@bloomberg.net>
Signed-off-by: Alex Yesmanchyk <ayesmanchyk@bloomberg.net>
Signed-off-by: Michael Levine <mlevine55@bloomberg.net>
Reviewed-by: Jason Merrill <jason@redhat.com>
2 months agoRemove .res specs to fix COFF passthrough [PR123504]
Peter Damianov [Sat, 10 Jan 2026 09:19:54 +0000 (09:19 +0000)] 
Remove .res specs to fix COFF passthrough [PR123504]

Some packages (gnulib) pass COFF object files with .res extension
directly to gcc, expecting them to be passed through to the linker,
instead of windres.  However, the current EXTRA_DEFAULT_COMPILERS spec
intercepts all .res files and runs them through windres, which fails for
COFF files that are not Windows resource files (Microsoft Visual C
binary resource file as identified by libmagic/file).

This patch removes the .res file specs, leaving only the .rc
support specs active. At a later date, this can be reviewed.

The driver could inspect the .res file to see if it's a object file or,
but, it's somewhat questionable if handling .res is even useful.

gcc/ChangeLog:

PR driver/123504
* config/i386/cygming.h (EXTRA_DEFAULT_COMPILERS): Comment out
.res spec to allow COFF files with .res extension to pass
through to the linker.
* config/aarch64/cygming.h (EXTRA_DEFAULT_COMPILERS): Likewise.

Signed-off-by: Jonathan Yong <10walls@gmail.com>
2 months agoira: Implicit uses via hard register constraints
Stefan Schulze Frielinghaus [Thu, 15 Jan 2026 14:14:59 +0000 (15:14 +0100)] 
ira: Implicit uses via hard register constraints

In ira_implicitly_set_insn_hard_regs() all potentially used registers
stemming from single register constraints are recorded.  Since hard
register constraints are pretty similar, do the same for those, too.
This requires to setup the preferred alternatives which is done via
ira_setup_alts() and also implemented for hard register constraints by
this patch.

This fixes an ICE were previously sched1 swapped the order of the
instructions

(insn 10 9 6 2 (parallel [
            (set (reg:DF 118)
                (asm_operands:DF ("") ("={fr2}") 0 [
                        (reg:TF 121 [ a ])
                    ]
                     [
                        (asm_input:TF ("{fr1}") t.i:5)
                    ]
                     [] t.i:5))
            (clobber (reg:SI 98 ca))
        ]) "t.i":5:3 -1
     (expr_list:REG_DEAD (reg:TF 121 [ a ])
        (expr_list:REG_UNUSED (reg:SI 98 ca)
            (nil))))
...
(insn 13 6 14 2 (set (reg:DF 34 2)
        (const_double:DF 0.0 [0x0.0p+0])) "t.i":6:3 606 {*movdf_hardfloat64}
     (nil))

for the attached example.  This led to an ICE because register 34/fr2
was then live while allocating for pseudo 121.

gcc/ChangeLog:

* ira-lives.cc (ira_implicitly_set_insn_hard_regs): Honor hard
register constraints.
* ira.cc (ira_setup_alts): Ditto.

gcc/testsuite/ChangeLog:

* gcc.target/powerpc/asm-hard-reg-1.c: New test.

2 months agoDeal with combinations of hard register constraints
Stefan Schulze Frielinghaus [Thu, 15 Jan 2026 14:14:59 +0000 (15:14 +0100)] 
Deal with combinations of hard register constraints

Currently, multiple hard register constraints in one alternative are not
supported.  Likewise, a combination of hard register constraints and
regular register constraints is not supported.  Note, a combination of
hard register constraints and non-register constraints as e.g. immediate
constraints is supported.  This is inspired by the i386 target where
constraints like aI are used which could be expressed as {ax}I, too.

gcc/ChangeLog:

* doc/extend.texi: Document current limitations of hard register
constraints.
* stmt.cc (parse_output_constraint): Reject multiple hard
register constraints or a combination of hard register
constraints and regular register constraints in one alternative.
(parse_input_constraint): Ditto.

gcc/testsuite/ChangeLog:

* gcc.dg/asm-hard-reg-error-1.c: Remove tests containing
multiple hard register constraints in one alternative.
* gcc.dg/asm-hard-reg-error-6.c: New test.

2 months agoaarch64: Add comment explaining code layout
Alfie Richards [Fri, 9 Jan 2026 16:51:34 +0000 (16:51 +0000)] 
aarch64: Add comment explaining code layout

gcc/ChangeLog:

* config/aarch64/aarch64-simd.md: Add comment.
* config/aarch64/aarch64-sme.md: Likewise.
* config/aarch64/aarch64-sve-builtins-base.def: Likewise.
* config/aarch64/aarch64-sve-builtins-sme.def: Likewise.
* config/aarch64/aarch64-sve-builtins-sve2.def: Likewise.
* config/aarch64/aarch64-sve-builtins.def: Likewise.
* config/aarch64/aarch64-sve.md: Likewise.
* config/aarch64/aarch64-sve2.md: Likewise.
* config/aarch64/aarch64.md: Likewise.

2 months agosparc: Remove TARGET_SUN_TLS
Rainer Orth [Thu, 15 Jan 2026 12:03:59 +0000 (13:03 +0100)] 
sparc: Remove TARGET_SUN_TLS

All remaining uses of TARGET_SUN_TLS refer to either

* a feature missing in Solaris as:

  Lack of support for R_SPARC_TLS_DTPOFF{32,64}: while Solaris ld
  supports those just fine, I know of no Solaris as syntax for them.

* workarounds for bugs in Solaris as in sparc_tls_got,
  sparc_legitimize_tls_address, and the tls_delay_slot attribute

Therefor this patch replaces all uses of TARGET_SUN_TLS with
!HAVE_GNU_AS.

Bootstrapped without regressions on sparc-sun-solaris2.11,
sparcv9-sun-solaris2.11 (as and gas), and sparc64-unknown-linux-gnu.

2026-01-14  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

gcc:
* config/sparc/sparc.h (TARGET_SUN_TLS): Remove.
* config/sparc/sol2.h (TARGET_SUN_TLS): Likewise.

* config/sparc/sparc.cc (TARGET_ASM_OUTPUT_DWARF_DTPREL): Guard
with HAVE_GNU_AS.
(sparc_tls_got): Guard with !HAVE_GNU_AS.
(sparc_legitimize_tls_address): Likewise.
* config/sparc/sparc.md ("tls_delay_slot"): Likewise.
("@tie_add<P:mode>"): Likewise.