diff options
| author | Daniele Sahebi <daniele@mkryss.me> | 2025-11-19 17:03:05 +0100 |
|---|---|---|
| committer | Patrick Palka <ppalka@redhat.com> | 2025-11-21 20:59:17 -0500 |
| commit | 9badb670e28dae8c5a98ac3217eb16dfac20d38c (patch) | |
| tree | c06821f5090c6d5d46f9681813b446e60d6cb554 | |
| parent | 10e987956f243550b174922722fff7798ebd54c2 (diff) | |
c++: fix ICE with consteval functions in template decls [PR122658]
Currently, build_over_call calls build_cplus_new in template decls, generating
a TARGET_EXPR that it then passes to fold_non_dependent_expr, which ends up
calling tsubst_expr, and since tsubst_expr doesn't handle TARGET_EXPRs, it ICEs.
Since there is no way for this code path to be executed without causing an
ICE, I believe it can be removed.
PR c++/122658
gcc/cp/ChangeLog:
* call.cc (build_over_call): Don't call build_cplus_new in
template declarations.
gcc/testsuite/ChangeLog:
* g++.dg/cpp2a/consteval42.C: New test.
Co-authored-by: Jakub Jelinek <jakub@redhat.com>
Signed-off-by: Daniele Sahebi <daniele@mkryss.me>
Reviewed-by: Marek Polacek <polacek@redhat.com>
Reviewed-by: Patrick Palka <ppalka@redhat.com>
| -rw-r--r-- | gcc/cp/call.cc | 13 | ||||
| -rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/consteval42.C | 21 |
2 files changed, 24 insertions, 10 deletions
diff --git a/gcc/cp/call.cc b/gcc/cp/call.cc index ea89130572b..b069bb5c5e1 100644 --- a/gcc/cp/call.cc +++ b/gcc/cp/call.cc @@ -10336,18 +10336,11 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) TREE_NO_WARNING (expr) = true; if (immediate_invocation_p (fn)) { - tree obj_arg = NULL_TREE, exprimm = expr; + tree obj_arg = NULL_TREE; if (DECL_CONSTRUCTOR_P (fn)) obj_arg = first_arg; - if (obj_arg - && is_dummy_object (obj_arg) - && !type_dependent_expression_p (obj_arg)) - { - exprimm = build_cplus_new (DECL_CONTEXT (fn), expr, complain); - obj_arg = NULL_TREE; - } /* Look through *(const T *)&obj. */ - else if (obj_arg && INDIRECT_REF_P (obj_arg)) + if (obj_arg && INDIRECT_REF_P (obj_arg)) { tree addr = TREE_OPERAND (obj_arg, 0); STRIP_NOPS (addr); @@ -10359,7 +10352,7 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) obj_arg = TREE_OPERAND (addr, 0); } } - fold_non_dependent_expr (exprimm, complain, + fold_non_dependent_expr (expr, complain, /*manifestly_const_eval=*/true, obj_arg); } diff --git a/gcc/testsuite/g++.dg/cpp2a/consteval42.C b/gcc/testsuite/g++.dg/cpp2a/consteval42.C new file mode 100644 index 00000000000..c75bb49f11e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/consteval42.C @@ -0,0 +1,21 @@ +// PR c++/122658 +// { dg-do compile { target c++20 } } + +struct S { + consteval S () noexcept { } + consteval S (const S &) = default; +}; + +template <typename T> +S +foo () +{ + constexpr auto s = S(); + return s; +} + +S +bar () +{ + return foo <int> (); +} |
