Skip to content
Snippets Groups Projects
  1. Mar 06, 2025
    • Richard Biener's avatar
      lto/114501 - missed free-lang-data for CONSTRUCTOR index · fdd95e1c
      Richard Biener authored
      The following makes sure to also walk CONSTRUCTOR element indexes
      which can be FIELD_DECLs, referencing otherwise unused types we
      need to clean.  walk_tree only walks CONSTRUCTOR element data.
      
      	PR lto/114501
      	* ipa-free-lang-data.cc (find_decls_types_r): Explicitly
      	handle CONSTRUCTORs as walk_tree handling of those is
      	incomplete.
      
      	* g++.dg/pr114501_0.C: New testcase.
      fdd95e1c
    • Richard Biener's avatar
      middle-end/119119 - re-gimplification of empty CTOR assignments · 3bd61c1d
      Richard Biener authored
      The following testcase runs into a re-gimplification issue during
      inlining when processing
      
        MEM[(struct e *)this_2(D)].a = {};
      
      where re-gimplification does not handle assignments in the same
      way than the gimplifier but instead relies on rhs_predicate_for
      and gimplifying the RHS standalone.  This fails to handle
      special-casing of CTORs.  The is_gimple_mem_rhs_or_call predicate
      already handles clobbers but not empty CTORs so we end up in
      the fallback code trying to force the CTOR into a separate stmt
      using a temporary - but as we have a non-copyable type here that ICEs.
      
      The following generalizes empty CTORs in is_gimple_mem_rhs_or_call
      since those need no additional re-gimplification.
      
      	PR middle-end/119119
      	* gimplify.cc (is_gimple_mem_rhs_or_call): All empty CTORs
      	are OK when not a register type.
      
      	* g++.dg/torture/pr11911.C: New testcase.
      3bd61c1d
    • Simon Martin's avatar
      c++: Don't replace INDIRECT_REFs by a const capture proxy too eagerly [PR117504] · fdf846fd
      Simon Martin authored
      We have been miscompiling the following valid code since GCC8, and
      r8-3497-g281e6c1d8f1b4c
      
      === cut here ===
      struct span {
        span (const int (&__first)[1]) : _M_ptr (__first) {}
        int operator[] (long __i) { return _M_ptr[__i]; }
        const int *_M_ptr;
      };
      void foo () {
        constexpr int a_vec[]{1};
        auto vec{[&a_vec]() -> span { return a_vec; }()};
      }
      === cut here ===
      
      The problem is that perform_implicit_conversion_flags (via
      mark_rvalue_use) replaces "a_vec" in the return statement by a
      CONSTRUCTOR representing a_vec's constant value, and then takes its
      address when invoking span's constructor. So we end up with an instance
      that points to garbage instead of a_vec's storage.
      
      As per Jason's suggestion, this patch simply removes the calls to
      mark_*_use from perform_implicit_conversion_flags, which fixes the PR.
      
      	PR c++/117504
      
      gcc/cp/ChangeLog:
      
      	* call.cc (perform_implicit_conversion_flags): Don't call
      	mark_{l,r}value_use.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/cpp2a/constexpr-117504.C: New test.
      	* g++.dg/cpp2a/constexpr-117504a.C: New test.
      fdf846fd
  2. Mar 05, 2025
    • Marek Polacek's avatar
      c++: disable -Wnonnull in unevaluated context [PR115580] · 459c8a55
      Marek Polacek authored
      
      This PR complains that we issue a -Wnonnull even in a decltype.
      This fix disables even -Wformat and -Wrestrict.  I think that's fine.
      
      	PR c++/115580
      
      gcc/c-family/ChangeLog:
      
      	* c-common.cc (check_function_arguments): Return early if
      	c_inhibit_evaluation_warnings.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/warn/Wnonnull16.C: New test.
      
      Reviewed-by: default avatarJason Merrill <jason@redhat.com>
      459c8a55
    • Jason Merrill's avatar
      c++: coroutines and return in registers [PR118874] · 7e576d5b
      Jason Merrill authored
      
      Because coroutines insert a call to the resumer between the initialization
      of the return value and the actual return to the caller, we need to
      duplicate the work of gimplify_return_expr for the !aggregate_value_p case.
      
      	PR c++/117364
      	PR c++/118874
      
      gcc/cp/ChangeLog:
      
      	* coroutines.cc (cp_coroutine_transform::build_ramp_function): For
      	!aggregate_value_p return force return value into a local temp.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/coroutines/torture/pr118874.C: New test.
      
      Co-authored-by: default avatarJakub Jelinek <jakub@redhat.com>
      7e576d5b
    • Da Xie's avatar
      c++: Check invalid use of constrained auto with trailing return type [PR100589] · 7439febd
      Da Xie authored
      
      Add check for constrained auto type specifier in function declaration or
      function type declaration with trailing return type. Issue error if such
      usage is detected.
      
      Test file renamed, and added a new test for type declaration.
      
      Successfully bootstrapped and regretested on x86_64-pc-linux-gnu:
      Added 6 passed and 4 unsupported tests.
      
      	PR c++/100589
      
      gcc/cp/ChangeLog:
      
      	* decl.cc (grokdeclarator): Issue an error for a declarator with
      	constrained auto type specifier and trailing return types. Include
      	function names if available.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/cpp2a/concepts-pr100589.C: New test.
      
      Signed-off-by: default avatarDa Xie <xxie_xd@163.com>
      Reviewed-by: default avatarPatrick Palka <ppalka@redhat.com>
      Reviewed-by: default avatarJason Merrill <jason@redhat.com>
      7439febd
    • Simon Martin's avatar
      c++: Fix checking assert upon invalid class definition [PR116740] · b3d07822
      Simon Martin authored
      A checking assert triggers upon the following invalid code since
      GCC 11:
      
      === cut here ===
      class { a (struct b;
      } struct b
      === cut here ===
      
      The problem is that during error recovery, we call
      set_identifier_type_value_with_scope for B in the global namespace, and
      the checking assert added via r11-7228-g8f93e1b892850b fails.
      
      This patch relaxes that assert to not fail if we've seen a parser error
      (it a generalization of another fix done to that checking assert via
      r11-7266-g24bf79f1798ad1).
      
      	PR c++/116740
      
      gcc/cp/ChangeLog:
      
      	* name-lookup.cc (set_identifier_type_value_with_scope): Don't
      	fail assert with ill-formed input.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/parse/crash80.C: New test.
      b3d07822
    • Jakub Jelinek's avatar
      openmp, c++: Fix up OpenMP/OpenACC handling in C++ modules [PR119102] · ddeb7054
      Jakub Jelinek authored
      modules.cc has apparently support for extensions and attempts to ensure
      that if a module is compiled with those extensions enabled, sources which
      use the module are compiled with the same extensions.
      The only extension supported is SE_OPENMP right now.
      And the use of the extension is keyed on streaming out or in OMP_CLAUSE
      tree.
      This is undesirable for several reasons.
      OMP_CLAUSE is the only tree which can appear in the IL even without
      -fopenmp/-fopenmp-simd/-fopenacc (when simd ("notinbranch") or
      simd ("inbranch") attributes are used), and it can appear also in all
      the 3 modes mentioned above.  On the other side, with the exception of
      arguments of attributes added e.g. for declare simd where no harm should
      be done if -fopenmp/-fopenmp-simd isn't enabled later on, OMP_CLAUSE appears
      in OMP_*_CLAUSES of OpenMP/OpenACC construct trees.  And those construct
      trees often have no clauses at all, so keying the extension on OMP_CLAUSE
      doesn't catch many cases that should be caught.
      Furthermore, for OpenMP we have 2 modes, -fopenmp-simd which parses some
      OpenMP but constructs from that mostly OMP_SIMD and a few other cases,
      and -fopenmp which includes that and far more on top of that; and there is
      also -fopenacc.
      
      So, this patch stops setting/requesting the extension on OMP_CLAUSE,
      introduces 3 extensions rather than one (SE_OPENMP_SIMD, SE_OPENMP and
      SE_OPENACC) and keyes those on OpenMP constructs from the -fopenmp-simd
      subset, other OpenMP constructs and OpenACC constructs.
      
      2025-03-05  Jakub Jelinek  <jakub@redhat.com>
      
      	PR c++/119102
      gcc/cp/
      	* module.cc (enum streamed_extensions): Add SE_OPENMP_SIMD
      	and SE_OPENACC, change value of SE_OPENMP and SE_BITS.
      	(CASE_OMP_SIMD_CODE, CASE_OMP_CODE, CASE_OACC_CODE): Define.
      	(trees_out::start): Don't set SE_OPENMP extension for OMP_CLAUSE.
      	Set SE_OPENMP_SIMD extension for CASE_OMP_SIMD_CODE, SE_OPENMP
      	for CASE_OMP_CODE and SE_OPENACC for CASE_OACC_CODE.
      	(trees_in::start): Don't fail for OMP_CLAUSE with missing
      	SE_OPENMP extension.  Do fail for CASE_OMP_SIMD_CODE and missing
      	SE_OPENMP_SIMD extension, or CASE_OMP_CODE and missing SE_OPENMP
      	extension, or CASE_OACC_CODE and missing SE_OPENACC extension.
      	(module_state::write_readme): Write all of SE_OPENMP_SIMD, SE_OPENMP
      	and SE_OPENACC extensions.
      	(module_state::read_config): Diagnose missing -fopenmp, -fopenmp-simd
      	and/or -fopenacc depending on extensions used.
      gcc/testsuite/
      	* g++.dg/modules/pr119102_a.H: New test.
      	* g++.dg/modules/pr119102_b.C: New test.
      	* g++.dg/modules/omp-3_a.C: New test.
      	* g++.dg/modules/omp-3_b.C: New test.
      	* g++.dg/modules/omp-3_c.C: New test.
      	* g++.dg/modules/omp-3_d.C: New test.
      	* g++.dg/modules/oacc-1_a.C: New test.
      	* g++.dg/modules/oacc-1_b.C: New test.
      	* g++.dg/modules/oacc-1_c.C: New test.
      ddeb7054
    • Jakub Jelinek's avatar
      c++: Apply/diagnose attributes when instatiating ARRAY/POINTER/REFERENCE_TYPE [PR118787] · 1853b02d
      Jakub Jelinek authored
      The following testcase IMO in violation of the P2552R3 paper doesn't
      pedwarn on alignas applying to dependent types or alignas with dependent
      argument.
      
      tsubst was just ignoring TYPE_ATTRIBUTES.
      
      The following patch fixes it for the POINTER/REFERENCE_TYPE and
      ARRAY_TYPE cases, but perhaps we need to do the same also for other
      types (INTEGER_TYPE/REAL_TYPE and the like).  I guess I'll need to
      construct more testcases.
      
      2025-03-05  Jakub Jelinek  <jakub@redhat.com>
      
      	PR c++/118787
      	* pt.cc (tsubst) <case ARRAY_TYPE>: Use return t; only if it doesn't
      	have any TYPE_ATTRIBUTES.  Call apply_late_template_attributes.
      	<case POINTER_TYPE, case REFERENCE_TYPE>: Likewise.  Formatting fix.
      
      	* g++.dg/cpp0x/alignas22.C: New test.
      1853b02d
  3. Mar 04, 2025
    • Jason Merrill's avatar
      c++: C++23 range-for temps and ?: [PR119073] · f2a7f845
      Jason Merrill authored
      Here gimplification got confused because extend_temps_r messed up the types
      of the arms of a COND_EXPR.
      
      	PR c++/119073
      
      gcc/cp/ChangeLog:
      
      	* call.cc (extend_temps_r): Preserve types of COND_EXPR arms.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/cpp0x/range-for39.C: New test.
      f2a7f845
    • Marek Polacek's avatar
      c++: ICE with RANGE_EXPR and array init [PR109431] · 173cf7c9
      Marek Polacek authored
      
      We crash because we generate
      
        {[0 ... 1]={.low=0, .high=1}, [1]={.low=0, .high=1}}
      
      which output_constructor_regular_field doesn't want to see.  This
      happens since r9-1483: process_init_constructor_array can now create
      a RANGE_EXPR.  But the bug isn't in that patch; the problem is that
      build_vec_init doesn't handle RANGE_EXPRs.
      
      build_vec_init has a FOR_EACH_CONSTRUCTOR_ELT loop which populates
      const_vec.  In this case it loops over the elements of
      
        {[0 ... 1]={.low=0, .high=1}}
      
      but assumes that each element initializes one element.  So after the
      loop num_initialized_elts was 1, and then below:
      
                    HOST_WIDE_INT last = tree_to_shwi (maxindex);
                    if (num_initialized_elts <= last)
                      {
                        tree field = size_int (num_initialized_elts);
                        if (num_initialized_elts != last)
                          field = build2 (RANGE_EXPR, sizetype, field,
                                          size_int (last));
                        CONSTRUCTOR_APPEND_ELT (const_vec, field, e);
                      }
      
      we added the extra initializer.
      
      It seemed convenient to use range_expr_nelts like below.
      
      	PR c++/109431
      
      gcc/cp/ChangeLog:
      
      	* cp-tree.h (range_expr_nelts): Declare.
      	* init.cc (build_vec_init): If the CONSTRUCTOR's index is a
      	RANGE_EXPR, use range_expr_nelts to count how many elements
      	were initialized.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/init/array67.C: New test.
      
      Reviewed-by: default avatarJason Merrill <jason@redhat.com>
      173cf7c9
  4. Mar 03, 2025
    • Martin Jambor's avatar
      ipa-vr: Handle non-conversion unary ops separately from conversions (PR 118785) · d05b64bd
      Martin Jambor authored
      Since we construct arithmetic jump functions even when there is a
      type conversion in between the operation encoded in the jump function
      and when it is passed in a call argument, the IPA propagation phase
      must also perform the operation and conversion in two steps.  IPA-VR
      had actually been doing it even before for binary operations but, as
      PR 118756 exposes, not in the case on unary operations.  This patch
      adds the necessary step to rectify that.
      
      Like in the scalar constant case, we depend on
      expr_type_first_operand_type_p to determine the type of the result of
      the arithmetic operation.  On top this, the patch special-cases
      ABSU_EXPR because it looks useful an so that the PR testcase exercises
      the added code-path.  This seems most appropriate for stage 4, long
      term we should probably stream the types, probably after also encoding
      them with a string of expr_eval_op rather than what we have today.
      
      A check for expr_type_first_operand_type_p was also missing in the
      handling of binary ops and the intermediate value_range was
      initialized with a wrong type, so I also fixed this.
      
      gcc/ChangeLog:
      
      2025-02-24  Martin Jambor  <mjambor@suse.cz>
      
      	PR ipa/118785
      
      	* ipa-cp.cc (ipa_vr_intersect_with_arith_jfunc): Handle non-conversion
      	unary operations separately before doing any conversions.  Check
      	expr_type_first_operand_type_p for non-unary operations too.  Fix type
      	of op_res.
      
      gcc/testsuite/ChangeLog:
      
      2025-02-24  Martin Jambor  <mjambor@suse.cz>
      
      	PR ipa/118785
      	* g++.dg/lto/pr118785_0.C: New test.
      d05b64bd
    • Richard Biener's avatar
      ipa/119067 - bogus TYPE_PRECISION check on VECTOR_TYPE · f22e8916
      Richard Biener authored
      odr_types_equivalent_p can end up using TYPE_PRECISION on vector
      types which is a no-go.  The following instead uses TYPE_VECTOR_SUBPARTS
      for vector types so we also end up comparing the number of vector elements.
      
      	PR ipa/119067
      	* ipa-devirt.cc (odr_types_equivalent_p): Check
      	TYPE_VECTOR_SUBPARTS for vectors.
      
      	* g++.dg/lto/pr119067_0.C: New testcase.
      	* g++.dg/lto/pr119067_1.C: Likewise.
      f22e8916
  5. Mar 02, 2025
    • Filip Kastl's avatar
      gimple: sccopy: Prune removed statements from SCCs [PR117919] · 5349aa2a
      Filip Kastl authored
      
      While writing the sccopy pass I didn't realize that 'replace_uses_by ()' can
      remove portions of the CFG.  This happens when replacing arguments of some
      statement results in the removal of an EH edge.  Because of this sccopy can
      then work with GIMPLE statements that aren't part of the IR anymore.  In
      PR117919 this triggered an assertion within the pass which assumes that
      statements the pass works with are reachable.
      
      This patch tells the pass to notice when a statement isn't in the IR anymore
      and remove it from it's worklist.
      
      	PR tree-optimization/117919
      
      gcc/ChangeLog:
      
      	* gimple-ssa-sccopy.cc (scc_copy_prop::propagate): Prune
      	statements that 'replace_uses_by ()' removed.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/pr117919.C: New test.
      
      Signed-off-by: default avatarFilip Kastl <fkastl@suse.cz>
      5349aa2a
  6. Feb 28, 2025
    • Marek Polacek's avatar
      c++: fix rejects-valid and ICE with constexpr NSDMI [PR110822] · 96572464
      Marek Polacek authored
      
      Since r10-7718 the attached tests produce an ICE in verify_address:
      
        error: constant not recomputed when 'ADDR_EXPR' changed
      
      but before that we wrongly rejected the tests with "is not a constant
      expression".  This patch fixes both problems.
      
      Since r10-7718 replace_decl_r can replace
      
        {._M_dataplus=&<retval>._M_local_buf, ._M_local_buf=0}
      
      with
      
        {._M_dataplus=&HelloWorld._M_local_buf, ._M_local_buf=0}
      
      The initial &<retval>._M_local_buf was not constant, but since
      HelloWorld is a static VAR_DECL, the resulting &HelloWorld._M_local_buf
      should have been marked as TREE_CONSTANT.  And since we're taking
      its address, the whole thing should be TREE_ADDRESSABLE.
      
      	PR c++/114913
      	PR c++/110822
      
      gcc/cp/ChangeLog:
      
      	* constexpr.cc (replace_decl_r): If we've replaced something
      	inside of an ADDR_EXPR, call cxx_mark_addressable and
      	recompute_tree_invariant_for_addr_expr on the resulting ADDR_EXPR.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/cpp0x/constexpr-nsdmi4.C: New test.
      	* g++.dg/cpp0x/constexpr-nsdmi5.C: New test.
      
      Reviewed-by: default avatarJason Merrill <jason@redhat.com>
      96572464
    • Marek Polacek's avatar
      c++: ICE in replace_decl [PR118986] · 22018a4a
      Marek Polacek authored
      
      Yet another problem that started with r15-6052, compile time evaluation of
      prvalues.
      
      cp_fold_r/TARGET_EXPR sees:
      
        TARGET_EXPR <D.2701, <<< Unknown tree: expr_stmt
          D.2701.__p = TARGET_EXPR <D.2684, <<< Unknown tree: aggr_init_expr
            3
            f1
            D.2684 >>>> >>>>
      
      so when we call maybe_constant_init, the object we're initializing is D.2701,
      and the init is the expr_stmt.  We unwrap the EXPR_STMT/INIT_EXPR/TARGET_EXPR
      in maybe_constant_init_1 and so end up evaluating the f1 call.  But f1 returns
      c2 whereas the type of D.2701 is ._anon_0 -- the closure.
      
      So then we crash in replace_decl on:
      
      	  gcc_checking_assert (same_type_ignoring_top_level_qualifiers_p
      			       (TREE_TYPE (decl), TREE_TYPE (replacement)));
      
      due to the mismatched types.
      
      cxx_eval_outermost_constant_expr is already ready for the types to be
      different, in which case the result isn't constant.  But replace_decl
      is called before that check.
      
      I'm leaving the assert in replace_decl on purpose, maybe we'll find
      another use for it.
      
      	PR c++/118986
      
      gcc/cp/ChangeLog:
      
      	* constexpr.cc (cxx_eval_call_expression): Check that the types match
      	before calling replace_decl, if not, set *non_constant_p.
      	(maybe_constant_init_1): Don't strip INIT_EXPR if it would change the
      	type of the expression.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/cpp2a/constexpr-prvalue1.C: New test.
      
      Reviewed-by: default avatarJason Merrill <jason@redhat.com>
      22018a4a
    • Martin Jambor's avatar
      ipa-sra: Avoid clashes with ipa-cp when pulling accesses across calls (PR 118243) · 0bffcd46
      Martin Jambor authored
      Among other things, IPA-SRA checks whether splitting out a bit of an
      aggregate or something passed by reference would lead into a clash
      with an already known IPA-CP constant a way which would cause problems
      later on.  Unfortunately the test is done only in
      adjust_parameter_descriptions and is missing when accesses are
      propagated from callees to callers, which leads to miscompilation
      reported as PR 118243 (where the callee is a function created by
      ipa-split).
      
      The matter is then further complicated by the fact that we consider
      complex numbers as scalars even though they can be modified piecemeal
      (IPA-CP can detect and propagate the pieces separately too) which then
      confuses the parameter manipulation machinery furter.
      
      This patch simply adds the missing check to avoid the IPA-SRA
      transform in these cases too, which should be suitable for backporting
      to all affected release branches.  It is a bit of a shame as in the PR
      testcase we do propagate both components of the complex number in
      question and the transformation phase could recover.  I have some
      prototype patches in this direction but that is something for (a)
      stage 1.
      
      gcc/ChangeLog:
      
      2025-02-10  Martin Jambor  <mjambor@suse.cz>
      
      	PR ipa/118243
      	* ipa-sra.cc (pull_accesses_from_callee): New parameters
      	caller_ipcp_ts and param_idx.  Check that scalar pulled accesses would
      	not clash with a known IPA-CP aggregate constant.
      	(param_splitting_across_edge): Pass IPA-CP transformation summary and
      	caller parameter index to pull_accesses_from_callee.
      
      gcc/testsuite/ChangeLog:
      
      2025-02-10  Martin Jambor  <mjambor@suse.cz>
      
      	PR ipa/118243
      	* g++.dg/ipa/pr118243.C: New test.
      0bffcd46
    • Patrick Palka's avatar
      c++: generic lambda, implicit 'this' capture, xobj memfn [PR119038] · 1a150f1f
      Patrick Palka authored
      
      When a generic lambda calls an overload set containing an iobj member
      function we speculatively capture 'this'.  We need to do the same
      for an xobj member function.
      
      	PR c++/119038
      
      gcc/cp/ChangeLog:
      
      	* lambda.cc (maybe_generic_this_capture): Consider xobj
      	member functions as well, not just iobj.  Update function
      	comment.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/cpp23/explicit-obj-lambda15.C: New test.
      
      Reviewed-by: default avatarJason Merrill <jason@redhat.com>
      1a150f1f
    • Jakub Jelinek's avatar
      c++: Fix cxx_eval_store_expression {REAL,IMAG}PART_EXPR handling [PR119045] · 7eb8ec18
      Jakub Jelinek authored
      I've added the asserts that probe == target because {REAL,IMAG}PART_EXPR
      always implies a scalar type and so applying ARRAY_REF/COMPONENT_REF
      etc. on it further doesn't make sense and the later code relies on it
      to be the last one in refs array.  But as the following testcase shows,
      we can fail those assertions in case there is a reference or pointer
      to the __real__ or __imag__ part, in that case we just evaluate the
      constant expression and so probe won't be the same as target.
      That case doesn't push anything into the refs array though.
      
      The following patch changes those asserts to verify that refs is still
      empty, which fixes it.
      
      2025-02-28  Jakub Jelinek  <jakub@redhat.com>
      
      	PR c++/119045
      	* constexpr.cc (cxx_eval_store_expression) <case REALPART_EXPR>:
      	Assert that refs->is_empty () rather than probe == target.
      	(cxx_eval_store_expression) <case IMAGPART_EXPR>: Likewise.
      
      	* g++.dg/cpp1y/constexpr-complex2.C: New test.
      7eb8ec18
    • Jakub Jelinek's avatar
      c++: Adjust #embed support for P1967R14 · b510c53b
      Jakub Jelinek authored
      Now that the #embed paper has been voted in, the following patch
      removes the pedwarn for C++26 on it (and adjusts pedwarn warning for
      older C++ versions) and predefines __cpp_pp_embed FTM.
      
      Also, the patch changes cpp_error to cpp_pedwarning with for C++
      -Wc++26-extensions guarding, and for C add -Wc11-c23-compat warning
      about #embed.
      
      I believe we otherwise implement everything in the paper already,
      except I'm really confused by the
       [Example:
      
       #embed <data.dat> limit(__has_include("a.h"))
      
       #if __has_embed(<data.dat> limit(__has_include("a.h")))
       // ill-formed: __has_include [cpp.cond] cannot appear here
       #endif
      
       — end example]
      part.  My reading of both C23 and C++ with the P1967R14 paper in
      is that the first case (#embed with __has_include or __has_embed in its
      clauses) is what is clearly invalid and so the ill-formed note should be
      for #embed.  And the __has_include/__has_embed in __has_embed is actually
      questionable.
      Both C and C++ have something like
      "The identifiers __has_include, __has_embed, and __has_c_attribute
      shall not appear in any context not mentioned in this subclause."
      or
      "The identifiers __has_include and __has_cpp_attribute shall not appear
      in any context not mentioned in this subclause."
      (into which P1967R14 adds __has_embed) in the conditional inclusion
      subclause.  #embed is defined in a different one, so using those in there
      is invalid (unless "using the rules specified for conditional inclusion"
      wording e.g. in limit clause overrides that).
      The reason why I think it is fuzzy for __has_embed is that __has_embed
      is actually defined in the Conditional inclusion subclause (so that
      would mean one can use __has_include, __has_embed and __has_*attribute
      in there) but its clauses are described in a different one.
      
      GCC currently accepts
       #embed __FILE__ limit (__has_include (<stdarg.h>))
       #if __has_embed (__FILE__ limit (__has_include (<stdarg.h>)))
       #endif
       #embed __FILE__ limit (__has_embed (__FILE__))
       #if __has_embed (__FILE__ limit (__has_embed (__FILE__)))
       #endif
      Note, it isn't just about limit clause, but also about
      prefix/suffix/if_empty, except that in those cases the "using the rules
      specified for conditional inclusion" doesn't apply.
      
      In any case, I'd hope that can be dealt with incrementally (and should
      be handled the same for both C and C++).
      
      2025-02-28  Jakub Jelinek  <jakub@redhat.com>
      
      libcpp/
      	* include/cpplib.h (enum cpp_warning_reason): Add
      	CPP_W_CXX26_EXTENSIONS enumerator.
      	* init.cc (lang_defaults): Set embed for GNUCXX26 and CXX26.
      	* directives.cc (do_embed): Adjust pedwarn wording for embed in C++,
      	use cpp_pedwarning instead of cpp_error and add CPP_W_C11_C23_COMPAT
      	warning of cpp_pedwarning hasn't diagnosed anything.
      gcc/c-family/
      	* c.opt (Wc++26-extensions): Add CppReason(CPP_W_CXX26_EXTENSIONS).
      	* c-cppbuiltin.cc (c_cpp_builtins): Predefine __cpp_pp_embed=202502
      	for C++26.
      gcc/testsuite/
      	* g++.dg/cpp/embed-1.C: Adjust for pedwarn wording change and don't
      	expect any error for C++26.
      	* g++.dg/cpp/embed-2.C: Adjust for pedwarn wording change and don't
      	expect any warning for C++26.
      	* g++.dg/cpp26/feat-cxx26.C: Test __cpp_pp_embed value.
      	* gcc.dg/cpp/embed-17.c: New test.
      b510c53b
    • Richard Biener's avatar
      ipa/111245 - bogus modref analysis for store in call that might throw · e6037af6
      Richard Biener authored
      We currently record a kill for
      
        *x_4(D) = always_throws ();
      
      because we consider the store always executing since the appropriate
      check for whether the stmt could throw is guarded by
      !cfun->can_throw_non_call_exceptions.
      
      	PR ipa/111245
      	* ipa-modref.cc (modref_access_analysis::analyze_store): Do
      	not guard the check of whether the stmt could throw by
      	cfun->can_throw_non_call_exceptions.
      
      	* g++.dg/torture/pr111245.C: New testcase.
      e6037af6
    • Richard Biener's avatar
      middle-end/66279 - gimplification clobbers shared asm constraints · 95f5d6cc
      Richard Biener authored
      When the C++ frontend clones a CTOR we do not copy ASM_EXPR constraints
      fully as walk_tree does not recurse to TREE_PURPOSE of TREE_LIST nodes.
      At this point doing that seems too dangerous so the following instead
      avoids gimplification of ASM_EXPRs to clobber the shared constraints
      and unshares it there, like it also unshares TREE_VALUE when it
      re-writes a "+" output constraint to separate "=" output and matching
      input constraint.
      
      	PR middle-end/66279
      	* gimplify.cc (gimplify_asm_expr): Copy TREE_PURPOSE before
      	rewriting it for "+" processing.
      
      	* g++.dg/pr66279.C: New testcase.
      95f5d6cc
  7. Feb 27, 2025
    • Marek Polacek's avatar
      c++: ICE with GOTO_EXPR [PR118928] · 9792126a
      Marek Polacek authored
      
      In this PR we crash in cxx_eval_constant_expression/GOTO_EXPR on:
      
        gcc_assert (cxx_dialect >= cxx23);
      
      The code obviously doesn't expect to see a goto pre-C++23.  But we can
      get here with the new prvalue optimization.  In this test we found
      ourselves in synthesize_method for X::X().  This function calls:
      
       a) finish_function, which does cp_genericize -> ... -> genericize_c_loops,
          which creates the GOTO_EXPR;
       b) expand_or_defer_fn -> maybe_clone_body -> ... -> cp_fold_function
          where we reach the new maybe_constant_init call and crash on the
          goto.
      
      Since we can validly get to that assert, I think we should just remove
      it.  I don't see other similar asserts like this one.
      
      	PR c++/118928
      
      gcc/cp/ChangeLog:
      
      	* constexpr.cc (cxx_eval_constant_expression) <case GOTO_EXPR>: Remove
      	an assert.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/cpp0x/constexpr-prvalue5.C: New test.
      
      Reviewed-by: default avatarJason Merrill <jason@redhat.com>
      9792126a
    • Marek Polacek's avatar
      c++: too many errors with sneaky template [PR118516] · 3605e057
      Marek Polacek authored
      Since C++20 P0846, a name followed by a < can be treated as a template-name
      even though name lookup did not find a template-name.  That happens
      in this test with "i < foo ()":
      
        for (int id = 0; i < foo(); ++id);
      
      and results in a raft of errors about non-constant foo().  The problem
      is that the require_potential_constant_expression call in
      cp_parser_template_argument emits errors even when we're parsing
      tentatively.  So we repeat the error when we're trying to parse
      as a nested-name-specifier, type-name, etc.
      
      Guarding the call with !cp_parser_uncommitted_to_tentative_parse_p would
      mean that require_potential_constant_expression never gets called.  But
      we don't need the call at all as far as I can tell.  Stuff like
      
        template<int N> struct S { };
        int foo () { return 4; }
        void
        g ()
        {
          S<foo()> s;
        }
      
      gets diagnosed in convert_nontype_argument.  In fact, with this patch,
      we only emit "call to non-constexpr function" once.  (That is, in C++17
      only; C++14 uses a different path.)
      
      	PR c++/118516
      
      gcc/cp/ChangeLog:
      
      	* parser.cc (cp_parser_template_argument): Don't call
      	require_potential_constant_expression.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/cpp2a/fn-template11.C:
      	* g++.dg/template/fn-template1.C: New test.
      	* g++.dg/template/fn-template2.C: New test.
      3605e057
  8. Feb 26, 2025
    • Tamar Christina's avatar
      testsuite: Add pragma novector to more tests [PR118464] · ebe7cd9f
      Tamar Christina authored
      These loops will now vectorize the entry finding
      loops.  As such we get more failures because they
      were not expecting to be vectorized.
      
      Fixed by adding #pragma GCC novector.
      
      gcc/testsuite/ChangeLog:
      
      	PR tree-optimization/118464
      	PR tree-optimization/116855
      	* g++.dg/ext/pragma-unroll-lambda-lto.C: Add pragma novector.
      	* gcc.dg/tree-ssa/gen-vect-2.c: Likewise.
      	* gcc.dg/tree-ssa/gen-vect-25.c: Likewise.
      	* gcc.dg/tree-ssa/gen-vect-32.c: Likewise.
      	* gcc.dg/tree-ssa/ivopt_mult_2g.c: Likewise.
      	* gcc.dg/tree-ssa/ivopts-5.c: Likewise.
      	* gcc.dg/tree-ssa/ivopts-6.c: Likewise.
      	* gcc.dg/tree-ssa/ivopts-7.c: Likewise.
      	* gcc.dg/tree-ssa/ivopts-8.c: Likewise.
      	* gcc.dg/tree-ssa/ivopts-9.c: Likewise.
      	* gcc.dg/tree-ssa/predcom-dse-1.c: Likewise.
      	* gcc.dg/tree-ssa/predcom-dse-10.c: Likewise.
      	* gcc.dg/tree-ssa/predcom-dse-11.c: Likewise.
      	* gcc.dg/tree-ssa/predcom-dse-12.c: Likewise.
      	* gcc.dg/tree-ssa/predcom-dse-2.c: Likewise.
      	* gcc.dg/tree-ssa/predcom-dse-3.c: Likewise.
      	* gcc.dg/tree-ssa/predcom-dse-4.c: Likewise.
      	* gcc.dg/tree-ssa/predcom-dse-5.c: Likewise.
      	* gcc.dg/tree-ssa/predcom-dse-6.c: Likewise.
      	* gcc.dg/tree-ssa/predcom-dse-7.c: Likewise.
      	* gcc.dg/tree-ssa/predcom-dse-8.c: Likewise.
      	* gcc.dg/tree-ssa/predcom-dse-9.c: Likewise.
      	* gcc.target/i386/pr90178.c: Likewise.
      ebe7cd9f
  9. Feb 25, 2025
    • Jakub Jelinek's avatar
      openmp: Fix handling of declare target statics with array type which need destruction [PR118876] · 86a4af27
      Jakub Jelinek authored
      The following testcase ICEs because it attempts to emit the __tcfa function twice,
      once when handling the host destruction and once when handling nohost destruction.
      
      This patch fixes it by using __omp_tcfa function for the nohost case and marks it
      with the needed "omp declare target" and "omp declare target nohost" attributes.
      
      2025-02-25  Jakub Jelinek  <jakub@redhat.com>
      
      	PR c++/118876
      	* cp-tree.h (register_dtor_fn): Add a bool argument defaulted to false.
      	* decl.cc (start_cleanup_fn): Add OMP_TARGET argument, use
      	"__omp_tcf" prefix rather than "__tcf" in that case.  Add
      	"omp declare target" and "omp declare target nohost" attributes
      	to the fndecl.
      	(register_dtor_fn): Add OMP_TARGET argument, pass it down to
      	start_cleanup_fn.
      	* decl2.cc (one_static_initialization_or_destruction): Add OMP_TARGET
      	argument, pass it down to register_dtor_fn.
      	(emit_partial_init_fini_fn): Pass omp_target to
      	one_static_initialization_or_destruction.
      	(handle_tls_init): Pass false to
      	one_static_initialization_or_destruction.
      
      	* g++.dg/gomp/pr118876.C: New test.
      86a4af27
    • Jakub Jelinek's avatar
      c++: Fix range for with PMFs [PR118923] · a41b3f54
      Jakub Jelinek authored
      The following testcases segfault because the new range for -frange-for-ext-temps
      temporary extension extends even the internal TARGET_EXPRs created by
      get_member_function_from_ptrfunc.
      
      The following patch fixes that by using get_internal_target_expr for those
      instead of force_target_expr (similarly in cp_finish_decl and
      build_comparison_op) and using force_target_expr inside of
      get_internal_target_expr.
      
      2025-02-25  Jakub Jelinek  <jakub@redhat.com>
      
      	PR c++/118923
      	* tree.cc (get_internal_target_expr): Use force_target_expr
      	instead of build_target_expr_with_type.
      	* typeck.cc (get_member_function_from_ptrfunc): Use
      	get_internal_target_expr instead of force_target_expr.
      	* decl.cc (cp_finish_decl): Likewise.
      	* method.cc (build_comparison_op): Likewise.
      
      	* g++.dg/cpp0x/pr118923.C: New test.
      	* g++.dg/cpp1y/pr118923.C: New test.
      a41b3f54
  10. Feb 24, 2025
    • Richard Biener's avatar
      tree-optimization/118973 - stray abnormal edge after DCE · 9e4c57f7
      Richard Biener authored
      DCE preserves stmts performing abnormal control flow transfer but
      currently has an exception for replaceable allocations and cxa_atexit
      calls.  That results in a broken CFG since DCE isn't set up to prune
      abnormal edges possibly hanging off those.
      
      While we could try to add this handling, the following is the safe
      fix at this point and more suitable for backporting.
      
      	PR tree-optimization/118973
      	* tree-ssa-dce.cc (mark_stmt_if_obviously_necessary): Calls
      	that alter control flow in unpredictable ways need to be
      	preserved.
      
      	* g++.dg/torture/pr118973.C: New testcase.
      9e4c57f7
  11. Feb 22, 2025
    • Thomas Schwinge's avatar
      Turn test cases into UNSUPPORTED if running into 'sorry, unimplemented:... · 0128fa8b
      Thomas Schwinge authored
      Turn test cases into UNSUPPORTED if running into 'sorry, unimplemented: dynamic stack allocation not supported'
      
      In Subversion r217296 (Git commit e2acc079)
      "Testsuite alloca fixes for ptx", effective-target 'alloca' was added to mark
      up test cases that run into the nvptx back end's non-support of dynamic stack
      allocation.  (Later, nvptx gained conditional support for that in
      commit 3861d362
      "nvptx: PTX 'alloca' for '-mptx=7.3'+, '-march=sm_52'+ [PR65181]", but on the
      other hand, in commit f93a612f
      "bpf: liberate R9 for general register allocation", the BPF back end joined
      "the list of targets that do not support alloca in target-support.exp".
      
      Manually maintaining the list of test cases requiring effective-target 'alloca'
      is notoriously hard, gets out of date quickly: new test cases added to the test
      suite may need to be analyzed and annotated, and over time annotations also may
      need to be removed, in cases where the compiler learns to optimize out
      'alloca'/VLA usage, for example.  This commit replaces (99 % of) the manual
      annotations with an automatic scheme: turn test cases into UNSUPPORTED if
      running into 'sorry, unimplemented: dynamic stack allocation not supported'.
      
      	gcc/testsuite/
      	* lib/target-supports.exp (check_effective_target_alloca):
      	Gracefully handle the case that we've not be called (indirectly)
      	from 'dg-test'.
      	* lib/gcc-dg.exp (proc gcc-dg-prune): Turn
      	'sorry, unimplemented: dynamic stack allocation not supported' into
      	UNSUPPORTED.
      	* c-c++-common/Walloca-larger-than.c: Don't
      	'dg-require-effective-target alloca'.
      	* c-c++-common/Warray-bounds-9.c: Likewise.
      	* c-c++-common/Warray-bounds.c: Likewise.
      	* c-c++-common/Wdangling-pointer-2.c: Likewise.
      	* c-c++-common/Wdangling-pointer-4.c: Likewise.
      	* c-c++-common/Wdangling-pointer-5.c: Likewise.
      	* c-c++-common/Wdangling-pointer.c: Likewise.
      	* c-c++-common/Wimplicit-fallthrough-7.c: Likewise.
      	* c-c++-common/Wsizeof-pointer-memaccess1.c: Likewise.
      	* c-c++-common/Wsizeof-pointer-memaccess2.c: Likewise.
      	* c-c++-common/Wstringop-truncation.c: Likewise.
      	* c-c++-common/Wunused-var-6.c: Likewise.
      	* c-c++-common/Wunused-var-8.c: Likewise.
      	* c-c++-common/analyzer/alloca-leak.c: Likewise.
      	* c-c++-common/analyzer/allocation-size-multiline-2.c: Likewise.
      	* c-c++-common/analyzer/allocation-size-multiline-3.c: Likewise.
      	* c-c++-common/analyzer/capacity-1.c: Likewise.
      	* c-c++-common/analyzer/capacity-3.c: Likewise.
      	* c-c++-common/analyzer/imprecise-floating-point-1.c: Likewise.
      	* c-c++-common/analyzer/infinite-recursion-alloca.c: Likewise.
      	* c-c++-common/analyzer/malloc-callbacks.c: Likewise.
      	* c-c++-common/analyzer/malloc-paths-8.c: Likewise.
      	* c-c++-common/analyzer/out-of-bounds-5.c: Likewise.
      	* c-c++-common/analyzer/out-of-bounds-diagram-11.c: Likewise.
      	* c-c++-common/analyzer/uninit-alloca.c: Likewise.
      	* c-c++-common/analyzer/write-to-string-literal-5.c: Likewise.
      	* c-c++-common/asan/alloca_loop_unpoisoning.c: Likewise.
      	* c-c++-common/auto-init-11.c: Likewise.
      	* c-c++-common/auto-init-12.c: Likewise.
      	* c-c++-common/auto-init-15.c: Likewise.
      	* c-c++-common/auto-init-16.c: Likewise.
      	* c-c++-common/builtins.c: Likewise.
      	* c-c++-common/dwarf2/vla1.c: Likewise.
      	* c-c++-common/gomp/pr61486-2.c: Likewise.
      	* c-c++-common/torture/builtin-clear-padding-4.c: Likewise.
      	* c-c++-common/torture/strub-run3.c: Likewise.
      	* c-c++-common/torture/strub-run4.c: Likewise.
      	* c-c++-common/torture/strub-run4c.c: Likewise.
      	* c-c++-common/torture/strub-run4d.c: Likewise.
      	* c-c++-common/torture/strub-run4i.c: Likewise.
      	* g++.dg/Walloca1.C: Likewise.
      	* g++.dg/Walloca2.C: Likewise.
      	* g++.dg/cpp0x/pr70338.C: Likewise.
      	* g++.dg/cpp1y/lambda-generic-vla1.C: Likewise.
      	* g++.dg/cpp1y/vla10.C: Likewise.
      	* g++.dg/cpp1y/vla2.C: Likewise.
      	* g++.dg/cpp1y/vla6.C: Likewise.
      	* g++.dg/cpp1y/vla8.C: Likewise.
      	* g++.dg/debug/debug5.C: Likewise.
      	* g++.dg/debug/debug6.C: Likewise.
      	* g++.dg/debug/pr54828.C: Likewise.
      	* g++.dg/diagnostic/pr70105.C: Likewise.
      	* g++.dg/eh/cleanup5.C: Likewise.
      	* g++.dg/eh/spbp.C: Likewise.
      	* g++.dg/ext/builtin_alloca.C: Likewise.
      	* g++.dg/ext/tmplattr9.C: Likewise.
      	* g++.dg/ext/vla10.C: Likewise.
      	* g++.dg/ext/vla11.C: Likewise.
      	* g++.dg/ext/vla12.C: Likewise.
      	* g++.dg/ext/vla15.C: Likewise.
      	* g++.dg/ext/vla16.C: Likewise.
      	* g++.dg/ext/vla17.C: Likewise.
      	* g++.dg/ext/vla23.C: Likewise.
      	* g++.dg/ext/vla3.C: Likewise.
      	* g++.dg/ext/vla6.C: Likewise.
      	* g++.dg/ext/vla7.C: Likewise.
      	* g++.dg/init/array24.C: Likewise.
      	* g++.dg/init/new47.C: Likewise.
      	* g++.dg/init/pr55497.C: Likewise.
      	* g++.dg/opt/pr78201.C: Likewise.
      	* g++.dg/template/vla2.C: Likewise.
      	* g++.dg/torture/Wsizeof-pointer-memaccess1.C: Likewise.
      	* g++.dg/torture/Wsizeof-pointer-memaccess2.C: Likewise.
      	* g++.dg/torture/pr62127.C: Likewise.
      	* g++.dg/torture/pr67055.C: Likewise.
      	* g++.dg/torture/stackalign/eh-alloca-1.C: Likewise.
      	* g++.dg/torture/stackalign/eh-inline-2.C: Likewise.
      	* g++.dg/torture/stackalign/eh-vararg-1.C: Likewise.
      	* g++.dg/torture/stackalign/eh-vararg-2.C: Likewise.
      	* g++.dg/warn/Wplacement-new-size-5.C: Likewise.
      	* g++.dg/warn/Wsizeof-pointer-memaccess-1.C: Likewise.
      	* g++.dg/warn/Wvla-1.C: Likewise.
      	* g++.dg/warn/Wvla-3.C: Likewise.
      	* g++.old-deja/g++.ext/array2.C: Likewise.
      	* g++.old-deja/g++.ext/constructor.C: Likewise.
      	* g++.old-deja/g++.law/builtin1.C: Likewise.
      	* g++.old-deja/g++.other/crash12.C: Likewise.
      	* g++.old-deja/g++.other/eh3.C: Likewise.
      	* g++.old-deja/g++.pt/array6.C: Likewise.
      	* g++.old-deja/g++.pt/dynarray.C: Likewise.
      	* gcc.c-torture/compile/20000923-1.c: Likewise.
      	* gcc.c-torture/compile/20030224-1.c: Likewise.
      	* gcc.c-torture/compile/20071108-1.c: Likewise.
      	* gcc.c-torture/compile/20071117-1.c: Likewise.
      	* gcc.c-torture/compile/900313-1.c: Likewise.
      	* gcc.c-torture/compile/parms.c: Likewise.
      	* gcc.c-torture/compile/pr17397.c: Likewise.
      	* gcc.c-torture/compile/pr35006.c: Likewise.
      	* gcc.c-torture/compile/pr42956.c: Likewise.
      	* gcc.c-torture/compile/pr51354.c: Likewise.
      	* gcc.c-torture/compile/pr52714.c: Likewise.
      	* gcc.c-torture/compile/pr55851.c: Likewise.
      	* gcc.c-torture/compile/pr77754-1.c: Likewise.
      	* gcc.c-torture/compile/pr77754-2.c: Likewise.
      	* gcc.c-torture/compile/pr77754-3.c: Likewise.
      	* gcc.c-torture/compile/pr77754-4.c: Likewise.
      	* gcc.c-torture/compile/pr77754-5.c: Likewise.
      	* gcc.c-torture/compile/pr77754-6.c: Likewise.
      	* gcc.c-torture/compile/pr78439.c: Likewise.
      	* gcc.c-torture/compile/pr79413.c: Likewise.
      	* gcc.c-torture/compile/pr82564.c: Likewise.
      	* gcc.c-torture/compile/pr87110.c: Likewise.
      	* gcc.c-torture/compile/pr99787-1.c: Likewise.
      	* gcc.c-torture/compile/vla-const-1.c: Likewise.
      	* gcc.c-torture/compile/vla-const-2.c: Likewise.
      	* gcc.c-torture/execute/20010209-1.c: Likewise.
      	* gcc.c-torture/execute/20020314-1.c: Likewise.
      	* gcc.c-torture/execute/20020412-1.c: Likewise.
      	* gcc.c-torture/execute/20021113-1.c: Likewise.
      	* gcc.c-torture/execute/20040223-1.c: Likewise.
      	* gcc.c-torture/execute/20040308-1.c: Likewise.
      	* gcc.c-torture/execute/20040811-1.c: Likewise.
      	* gcc.c-torture/execute/20070824-1.c: Likewise.
      	* gcc.c-torture/execute/20070919-1.c: Likewise.
      	* gcc.c-torture/execute/built-in-setjmp.c: Likewise.
      	* gcc.c-torture/execute/pr22061-1.c: Likewise.
      	* gcc.c-torture/execute/pr43220.c: Likewise.
      	* gcc.c-torture/execute/pr82210.c: Likewise.
      	* gcc.c-torture/execute/pr86528.c: Likewise.
      	* gcc.c-torture/execute/vla-dealloc-1.c: Likewise.
      	* gcc.dg/20001012-2.c: Likewise.
      	* gcc.dg/20020415-1.c: Likewise.
      	* gcc.dg/20030331-2.c: Likewise.
      	* gcc.dg/20101010-1.c: Likewise.
      	* gcc.dg/Walloca-1.c: Likewise.
      	* gcc.dg/Walloca-10.c: Likewise.
      	* gcc.dg/Walloca-11.c: Likewise.
      	* gcc.dg/Walloca-12.c: Likewise.
      	* gcc.dg/Walloca-13.c: Likewise.
      	* gcc.dg/Walloca-14.c: Likewise.
      	* gcc.dg/Walloca-15.c: Likewise.
      	* gcc.dg/Walloca-2.c: Likewise.
      	* gcc.dg/Walloca-3.c: Likewise.
      	* gcc.dg/Walloca-4.c: Likewise.
      	* gcc.dg/Walloca-5.c: Likewise.
      	* gcc.dg/Walloca-6.c: Likewise.
      	* gcc.dg/Walloca-7.c: Likewise.
      	* gcc.dg/Walloca-8.c: Likewise.
      	* gcc.dg/Walloca-9.c: Likewise.
      	* gcc.dg/Walloca-larger-than-2.c: Likewise.
      	* gcc.dg/Walloca-larger-than-3.c: Likewise.
      	* gcc.dg/Walloca-larger-than-4.c: Likewise.
      	* gcc.dg/Walloca-larger-than.c: Likewise.
      	* gcc.dg/Warray-bounds-22.c: Likewise.
      	* gcc.dg/Warray-bounds-41.c: Likewise.
      	* gcc.dg/Warray-bounds-46.c: Likewise.
      	* gcc.dg/Warray-bounds-48-novec.c: Likewise.
      	* gcc.dg/Warray-bounds-48.c: Likewise.
      	* gcc.dg/Warray-bounds-50.c: Likewise.
      	* gcc.dg/Warray-bounds-63.c: Likewise.
      	* gcc.dg/Warray-bounds-66.c: Likewise.
      	* gcc.dg/Wdangling-pointer.c: Likewise.
      	* gcc.dg/Wfree-nonheap-object-2.c: Likewise.
      	* gcc.dg/Wfree-nonheap-object.c: Likewise.
      	* gcc.dg/Wrestrict-17.c: Likewise.
      	* gcc.dg/Wrestrict.c: Likewise.
      	* gcc.dg/Wreturn-local-addr-2.c: Likewise.
      	* gcc.dg/Wreturn-local-addr-3.c: Likewise.
      	* gcc.dg/Wreturn-local-addr-4.c: Likewise.
      	* gcc.dg/Wreturn-local-addr-6.c: Likewise.
      	* gcc.dg/Wsizeof-pointer-memaccess1.c: Likewise.
      	* gcc.dg/Wstack-usage.c: Likewise.
      	* gcc.dg/Wstrict-aliasing-bogus-vla-1.c: Likewise.
      	* gcc.dg/Wstrict-overflow-27.c: Likewise.
      	* gcc.dg/Wstringop-overflow-15.c: Likewise.
      	* gcc.dg/Wstringop-overflow-23.c: Likewise.
      	* gcc.dg/Wstringop-overflow-25.c: Likewise.
      	* gcc.dg/Wstringop-overflow-27.c: Likewise.
      	* gcc.dg/Wstringop-overflow-3.c: Likewise.
      	* gcc.dg/Wstringop-overflow-39.c: Likewise.
      	* gcc.dg/Wstringop-overflow-56.c: Likewise.
      	* gcc.dg/Wstringop-overflow-57.c: Likewise.
      	* gcc.dg/Wstringop-overflow-67.c: Likewise.
      	* gcc.dg/Wstringop-overflow-71.c: Likewise.
      	* gcc.dg/Wstringop-truncation-3.c: Likewise.
      	* gcc.dg/Wvla-larger-than-1.c: Likewise.
      	* gcc.dg/Wvla-larger-than-2.c: Likewise.
      	* gcc.dg/Wvla-larger-than-3.c: Likewise.
      	* gcc.dg/Wvla-larger-than-4.c: Likewise.
      	* gcc.dg/Wvla-larger-than-5.c: Likewise.
      	* gcc.dg/analyzer/boxed-malloc-1.c: Likewise.
      	* gcc.dg/analyzer/call-summaries-2.c: Likewise.
      	* gcc.dg/analyzer/malloc-1.c: Likewise.
      	* gcc.dg/analyzer/malloc-reuse.c: Likewise.
      	* gcc.dg/analyzer/out-of-bounds-diagram-12.c: Likewise.
      	* gcc.dg/analyzer/pr93355-localealias.c: Likewise.
      	* gcc.dg/analyzer/putenv-1.c: Likewise.
      	* gcc.dg/analyzer/taint-alloc-1.c: Likewise.
      	* gcc.dg/analyzer/torture/pr93373.c: Likewise.
      	* gcc.dg/analyzer/torture/ubsan-1.c: Likewise.
      	* gcc.dg/analyzer/vla-1.c: Likewise.
      	* gcc.dg/atomic/stdatomic-vm.c: Likewise.
      	* gcc.dg/attr-alloc_size-6.c: Likewise.
      	* gcc.dg/attr-alloc_size-7.c: Likewise.
      	* gcc.dg/attr-alloc_size-8.c: Likewise.
      	* gcc.dg/attr-alloc_size-9.c: Likewise.
      	* gcc.dg/attr-noipa.c: Likewise.
      	* gcc.dg/auto-init-uninit-36.c: Likewise.
      	* gcc.dg/auto-init-uninit-9.c: Likewise.
      	* gcc.dg/auto-type-1.c: Likewise.
      	* gcc.dg/builtin-alloc-size.c: Likewise.
      	* gcc.dg/builtin-dynamic-alloc-size.c: Likewise.
      	* gcc.dg/builtin-dynamic-object-size-1.c: Likewise.
      	* gcc.dg/builtin-dynamic-object-size-2.c: Likewise.
      	* gcc.dg/builtin-dynamic-object-size-3.c: Likewise.
      	* gcc.dg/builtin-dynamic-object-size-4.c: Likewise.
      	* gcc.dg/builtin-object-size-1.c: Likewise.
      	* gcc.dg/builtin-object-size-2.c: Likewise.
      	* gcc.dg/builtin-object-size-3.c: Likewise.
      	* gcc.dg/builtin-object-size-4.c: Likewise.
      	* gcc.dg/builtins-64.c: Likewise.
      	* gcc.dg/builtins-68.c: Likewise.
      	* gcc.dg/c23-auto-2.c: Likewise.
      	* gcc.dg/c99-const-expr-13.c: Likewise.
      	* gcc.dg/c99-vla-1.c: Likewise.
      	* gcc.dg/fold-alloca-1.c: Likewise.
      	* gcc.dg/gomp/pr30494.c: Likewise.
      	* gcc.dg/gomp/vla-2.c: Likewise.
      	* gcc.dg/gomp/vla-3.c: Likewise.
      	* gcc.dg/gomp/vla-4.c: Likewise.
      	* gcc.dg/gomp/vla-5.c: Likewise.
      	* gcc.dg/graphite/pr99085.c: Likewise.
      	* gcc.dg/guality/guality.c: Likewise.
      	* gcc.dg/lto/pr80778_0.c: Likewise.
      	* gcc.dg/nested-func-10.c: Likewise.
      	* gcc.dg/nested-func-12.c: Likewise.
      	* gcc.dg/nested-func-13.c: Likewise.
      	* gcc.dg/nested-func-14.c: Likewise.
      	* gcc.dg/nested-func-15.c: Likewise.
      	* gcc.dg/nested-func-16.c: Likewise.
      	* gcc.dg/nested-func-17.c: Likewise.
      	* gcc.dg/nested-func-9.c: Likewise.
      	* gcc.dg/packed-vla.c: Likewise.
      	* gcc.dg/pr100225.c: Likewise.
      	* gcc.dg/pr25682.c: Likewise.
      	* gcc.dg/pr27301.c: Likewise.
      	* gcc.dg/pr31507-1.c: Likewise.
      	* gcc.dg/pr33238.c: Likewise.
      	* gcc.dg/pr41470.c: Likewise.
      	* gcc.dg/pr49120.c: Likewise.
      	* gcc.dg/pr50764.c: Likewise.
      	* gcc.dg/pr51491-2.c: Likewise.
      	* gcc.dg/pr51990-2.c: Likewise.
      	* gcc.dg/pr51990.c: Likewise.
      	* gcc.dg/pr59011.c: Likewise.
      	* gcc.dg/pr59523.c: Likewise.
      	* gcc.dg/pr61561.c: Likewise.
      	* gcc.dg/pr78468.c: Likewise.
      	* gcc.dg/pr78902.c: Likewise.
      	* gcc.dg/pr79972.c: Likewise.
      	* gcc.dg/pr82875.c: Likewise.
      	* gcc.dg/pr83844.c: Likewise.
      	* gcc.dg/pr84131.c: Likewise.
      	* gcc.dg/pr87099.c: Likewise.
      	* gcc.dg/pr87320.c: Likewise.
      	* gcc.dg/pr89045.c: Likewise.
      	* gcc.dg/pr91014.c: Likewise.
      	* gcc.dg/pr93986.c: Likewise.
      	* gcc.dg/pr98721-1.c: Likewise.
      	* gcc.dg/pr99122-2.c: Likewise.
      	* gcc.dg/shrink-wrap-alloca.c: Likewise.
      	* gcc.dg/sso-14.c: Likewise.
      	* gcc.dg/strlenopt-62.c: Likewise.
      	* gcc.dg/strlenopt-83.c: Likewise.
      	* gcc.dg/strlenopt-84.c: Likewise.
      	* gcc.dg/strlenopt-91.c: Likewise.
      	* gcc.dg/torture/Wsizeof-pointer-memaccess1.c: Likewise.
      	* gcc.dg/torture/calleesave-sse.c: Likewise.
      	* gcc.dg/torture/pr48953.c: Likewise.
      	* gcc.dg/torture/pr71881.c: Likewise.
      	* gcc.dg/torture/pr71901.c: Likewise.
      	* gcc.dg/torture/pr78742.c: Likewise.
      	* gcc.dg/torture/pr92088-1.c: Likewise.
      	* gcc.dg/torture/pr92088-2.c: Likewise.
      	* gcc.dg/torture/pr93124.c: Likewise.
      	* gcc.dg/torture/pr94479.c: Likewise.
      	* gcc.dg/torture/stackalign/alloca-1.c: Likewise.
      	* gcc.dg/torture/stackalign/inline-2.c: Likewise.
      	* gcc.dg/torture/stackalign/nested-3.c: Likewise.
      	* gcc.dg/torture/stackalign/vararg-1.c: Likewise.
      	* gcc.dg/torture/stackalign/vararg-2.c: Likewise.
      	* gcc.dg/tree-ssa/20030807-2.c: Likewise.
      	* gcc.dg/tree-ssa/20080530.c: Likewise.
      	* gcc.dg/tree-ssa/alias-37.c: Likewise.
      	* gcc.dg/tree-ssa/builtin-sprintf-warn-22.c: Likewise.
      	* gcc.dg/tree-ssa/builtin-sprintf-warn-25.c: Likewise.
      	* gcc.dg/tree-ssa/builtin-sprintf-warn-3.c: Likewise.
      	* gcc.dg/tree-ssa/loop-interchange-15.c: Likewise.
      	* gcc.dg/tree-ssa/pr23848-1.c: Likewise.
      	* gcc.dg/tree-ssa/pr23848-2.c: Likewise.
      	* gcc.dg/tree-ssa/pr23848-3.c: Likewise.
      	* gcc.dg/tree-ssa/pr23848-4.c: Likewise.
      	* gcc.dg/uninit-32.c: Likewise.
      	* gcc.dg/uninit-36.c: Likewise.
      	* gcc.dg/uninit-39.c: Likewise.
      	* gcc.dg/uninit-41.c: Likewise.
      	* gcc.dg/uninit-9-O0.c: Likewise.
      	* gcc.dg/uninit-9.c: Likewise.
      	* gcc.dg/uninit-pr100250.c: Likewise.
      	* gcc.dg/uninit-pr101300.c: Likewise.
      	* gcc.dg/uninit-pr101494.c: Likewise.
      	* gcc.dg/uninit-pr98583.c: Likewise.
      	* gcc.dg/vla-2.c: Likewise.
      	* gcc.dg/vla-22.c: Likewise.
      	* gcc.dg/vla-24.c: Likewise.
      	* gcc.dg/vla-3.c: Likewise.
      	* gcc.dg/vla-4.c: Likewise.
      	* gcc.dg/vla-stexp-1.c: Likewise.
      	* gcc.dg/vla-stexp-2.c: Likewise.
      	* gcc.dg/vla-stexp-4.c: Likewise.
      	* gcc.dg/vla-stexp-5.c: Likewise.
      	* gcc.dg/winline-7.c: Likewise.
      	* gcc.target/aarch64/stack-check-alloca-1.c: Likewise.
      	* gcc.target/aarch64/stack-check-alloca-10.c: Likewise.
      	* gcc.target/aarch64/stack-check-alloca-2.c: Likewise.
      	* gcc.target/aarch64/stack-check-alloca-3.c: Likewise.
      	* gcc.target/aarch64/stack-check-alloca-4.c: Likewise.
      	* gcc.target/aarch64/stack-check-alloca-5.c: Likewise.
      	* gcc.target/aarch64/stack-check-alloca-6.c: Likewise.
      	* gcc.target/aarch64/stack-check-alloca-7.c: Likewise.
      	* gcc.target/aarch64/stack-check-alloca-8.c: Likewise.
      	* gcc.target/aarch64/stack-check-alloca-9.c: Likewise.
      	* gcc.target/arc/interrupt-6.c: Likewise.
      	* gcc.target/i386/pr80969-3.c: Likewise.
      	* gcc.target/loongarch/stack-check-alloca-1.c: Likewise.
      	* gcc.target/loongarch/stack-check-alloca-2.c: Likewise.
      	* gcc.target/loongarch/stack-check-alloca-3.c: Likewise.
      	* gcc.target/loongarch/stack-check-alloca-4.c: Likewise.
      	* gcc.target/loongarch/stack-check-alloca-5.c: Likewise.
      	* gcc.target/loongarch/stack-check-alloca-6.c: Likewise.
      	* gcc.target/riscv/stack-check-alloca-1.c: Likewise.
      	* gcc.target/riscv/stack-check-alloca-10.c: Likewise.
      	* gcc.target/riscv/stack-check-alloca-2.c: Likewise.
      	* gcc.target/riscv/stack-check-alloca-3.c: Likewise.
      	* gcc.target/riscv/stack-check-alloca-4.c: Likewise.
      	* gcc.target/riscv/stack-check-alloca-5.c: Likewise.
      	* gcc.target/riscv/stack-check-alloca-6.c: Likewise.
      	* gcc.target/riscv/stack-check-alloca-7.c: Likewise.
      	* gcc.target/riscv/stack-check-alloca-8.c: Likewise.
      	* gcc.target/riscv/stack-check-alloca-9.c: Likewise.
      	* gcc.target/sparc/setjmp-1.c: Likewise.
      	* gcc.target/x86_64/abi/ms-sysv/ms-sysv.c: Likewise.
      	* gcc.c-torture/compile/20001221-1.c: Don't 'dg-skip-if'
      	for '! alloca'.
      	* gcc.c-torture/compile/20020807-1.c: Likewise.
      	* gcc.c-torture/compile/20050801-2.c: Likewise.
      	* gcc.c-torture/compile/920428-4.c: Likewise.
      	* gcc.c-torture/compile/debugvlafunction-1.c: Likewise.
      	* gcc.c-torture/compile/pr41469.c: Likewise.
      	* gcc.c-torture/execute/920721-2.c: Likewise.
      	* gcc.c-torture/execute/920929-1.c: Likewise.
      	* gcc.c-torture/execute/921017-1.c: Likewise.
      	* gcc.c-torture/execute/941202-1.c: Likewise.
      	* gcc.c-torture/execute/align-nest.c: Likewise.
      	* gcc.c-torture/execute/alloca-1.c: Likewise.
      	* gcc.c-torture/execute/pr22061-4.c: Likewise.
      	* gcc.c-torture/execute/pr36321.c: Likewise.
      	* gcc.dg/torture/pr8081.c: Likewise.
      	* gcc.dg/analyzer/data-model-1.c: Don't
      	'dg-require-effective-target alloca'.  XFAIL relevant
      	'dg-warning's for '! alloca'.
      	* gcc.dg/uninit-38.c: Likewise.
      	* gcc.dg/uninit-pr98578.c: Likewise.
      	* gcc.dg/compat/struct-by-value-22_main.c: Comment on
      	'dg-require-effective-target alloca'.
      	libstdc++-v3/
      	* testsuite/lib/prune.exp (proc libstdc++-dg-prune): Turn
      	'sorry, unimplemented: dynamic stack allocation not supported' into
      	UNSUPPORTED.
      0128fa8b
  12. Feb 21, 2025
    • Richard Biener's avatar
      Improve g++.dg/torture/pr118521.C · d2720051
      Richard Biener authored
      Alexander pointed out the way to do a dg-bogus in an included header.
      
      	PR tree-optimization/118521
      	* g++.dg/torture/pr118521.C: Use dg-bogus properly.
      d2720051
  13. Feb 20, 2025
    • Richard Biener's avatar
      tree-optimization/118521 - bogus diagnostic from unreachable code · a2755339
      Richard Biener authored
      When SCCP does final value replacement we end up with unfolded IL like
      
      __result_274 = _150 + 1;
      ...
      __new_finish_106 = __result_274 + 3;  <-- from SCCP
      _115 = _150 + 4;
      if (__new_finish_106 != _115)
      
      this does only get rectified by the next full folding which happens
      in forwprop4 which is after the strlen pass emitting the unwanted
      diagnostic.  The following mitigates this case in a similar way as
      r15-7472 did for PR118817 - by ensuring we have the IL folded.
      This is done by simply folding all immediate uses of the former
      PHI def that SCCP replaces.  All other more general approaches have
      too much fallout at this point.
      
      	PR tree-optimization/118521
      	* tree-scalar-evolution.cc (final_value_replacement_loop):
      	Fold uses of the replaced PHI def.
      
      	* g++.dg/torture/pr118521.C: New testcase.
      a2755339
  14. Feb 17, 2025
    • Marek Polacek's avatar
      c++: add fixed test [PR102455] · 17871192
      Marek Polacek authored
      Fixed by r13-4564 but the tests are very different.
      
      	PR c++/102455
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/ext/vector43.C: New test.
      17871192
    • Jason Merrill's avatar
      c++: extended temps and statement-exprs [PR118763] · 720c8f68
      Jason Merrill authored
      My last patch for 118856 broke the test for 118763 (which my testing didn't
      catch, for some reason), because it effectively reverted Jakub's recent fix
      (r15-7415) for that bug.  It seems we need a new flag to indicate internal
      temporaries.
      
      In that patch Jakub wondered if other uses of CLEANUP_EH_ONLY would have the
      same issue with jumps out of a statement-expr, and indeed it seems that
      maybe_push_temp_cleanup and now set_up_extended_ref_temp have the same
      problem.  Since maybe_push_temp_cleanup already uses a flag, we can easily
      stop setting CLEANUP_EH_ONLY there as well.  Since set_up_extended_ref_temp
      doesn't, working around this issue there will be more involved.
      
      	PR c++/118856
      	PR c++/118763
      
      gcc/cp/ChangeLog:
      
      	* cp-tree.h (TARGET_EXPR_INTERNAL_P): New.
      	* call.cc (extend_temps_r): Check it instead of CLEANUP_EH_ONLY.
      	* tree.cc (get_internal_target_expr): Set it instead.
      	* typeck2.cc (maybe_push_temp_cleanup): Don't set CLEANUP_EH_ONLY.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/ext/stmtexpr29.C: New test.
      720c8f68
    • Marek Polacek's avatar
      c++: add fixed test [PR96364] · 5954c5a7
      Marek Polacek authored
      We were rejecting this, but the test compiles correctly since r14-6346.
      
      	PR c++/96364
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/cpp0x/gen-attrs-88.C: New test.
      5954c5a7
    • Matthew Malcomson's avatar
      gcc: testsuite: Fix builtin-speculation-overloads[14].C testism · 9335ff73
      Matthew Malcomson authored
      
      When making warnings trigger a failure in template substitution I
      could not find any way to trigger the warning about builtin speculation
      not being available on the given target.
      
      Turns out I misread the code -- this warning happens when the
      speculation_barrier pattern is not defined.
      
      Here we add an effective target to represent
      "__builtin_speculation_safe_value is available on this target" and use
      that to adjust our test on SFINAE behaviour accordingly.
      N.b. this means that we get extra testing -- not just that things work
      on targets which support __builtin_speculation_safe_value, but also that
      the behaviour works on targets which don't support it.
      
      Tested with AArch64 native, AArch64 cross compiler, and RISC-V cross
      compiler (just running the tests that I've changed).
      
      Ok for trunk?
      
      gcc/testsuite/ChangeLog:
      
      	PR target/117991
      	* g++.dg/template/builtin-speculation-overloads.def: SUCCESS
      	argument in SPECULATION_ASSERTS now uses a macro `true_def`
      	instead of the literal `true` for arguments which should work
      	with `__builtin_speculation_safe_value`.
      	* g++.dg/template/builtin-speculation-overloads1.C: Define
      	`true_def` macro on command line to compiler according to the
      	effective target representing that
      	`__builtin_speculation_safe_value` does something on this
      	target.
      	* g++.dg/template/builtin-speculation-overloads4.C: Likewise.
      	* lib/target-supports.exp
      	(check_effective_target_speculation_barrier_defined): New.
      
      Signed-off-by: default avatarMatthew Malcomson <mmalcomson@nvidia.com>
      9335ff73
  15. Feb 16, 2025
  16. Feb 15, 2025
    • Nathaniel Shead's avatar
      c++/modules: Don't treat template parameters as TU-local [PR118846] · 9f1f4efc
      Nathaniel Shead authored
      
      There are two separate issues making various template parameters behave
      as if they were TU-local.
      
      Firstly, the TU-local detection code uses WILDCARD_TYPE_P to check for
      types that are not yet concrete; for some reason UNBOUND_CLASS_TEMPLATE
      is not on that list.  I don't see any particular reason why it shouldn't
      be, so this patch adds it; this may solve other latent issues as well.
      
      Secondly, the TEMPLATE_DECL for a type with expressions involving
      TEMPLATE_TEMPLATE_PARM_Ps is currently always constrained to internal
      linkage, because the result does not have TREE_PUBLIC set. Rather than
      messing with TREE_PUBLIC here, I think rather we just should ensure that
      we only attempt to constrain visiblity of templates of type, variable,
      or function decls.
      
      	PR c++/118846
      
      gcc/cp/ChangeLog:
      
      	* cp-tree.h (WILDCARD_TYPE_P): Include UNBOUND_CLASS_TEMPLATE.
      	* decl2.cc (min_vis_expr_r): Don't assume a TEMPLATE_DECL will
      	be a function or variable.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/modules/pr118846_a.C: New test.
      	* g++.dg/modules/pr118846_b.C: New test.
      
      Signed-off-by: default avatarNathaniel Shead <nathanieloshead@gmail.com>
      Reviewed-by: default avatarJason Merrill <jason@redhat.com>
      9f1f4efc
    • Jason Merrill's avatar
      testsuite: tweak constexpr-lamda1.C [PR118053] · 74107346
      Jason Merrill authored
      I forgot to add the -O necessary to reproduce the bug before pushing the
      fix.
      
      	PR c++/118053
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/cpp1y/constexpr-lambda1.C: Add -O.
      74107346
    • Jason Merrill's avatar
      c++: NRVO, constexpr, lambda [PR118053] · de66529f
      Jason Merrill authored
      Here during constant evaluation we encounter a VAR_DECL with DECL_VALUE_EXPR
      of the RESULT_DECL, where the latter has been adjusted for
      pass-by-invisible-reference.  We already had the code to deal with this, we
      just need to use it in the non-capture case of DECL_VALUE_EXPR as well.
      
      	PR c++/118053
      
      gcc/cp/ChangeLog:
      
      	* constexpr.cc (cxx_eval_constant_expression): Generalize
      	DECL_VALUE_EXPR invisiref handling.
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/cpp1y/constexpr-lambda1.C: New test.
      de66529f
  17. Feb 14, 2025
    • Marek Polacek's avatar
      c++: add fixed test [PR83144] · 8e44f7ec
      Marek Polacek authored
      Fixed by r12-4425 and it seemed worth adding.
      
      	PR c++/83144
      
      gcc/testsuite/ChangeLog:
      
      	* g++.dg/cpp0x/constexpr-83144.C: New test.
      8e44f7ec
Loading