]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: fix ICE with consteval functions in template decls [PR122658]
authorDaniele Sahebi <daniele@mkryss.me>
Wed, 19 Nov 2025 16:03:05 +0000 (17:03 +0100)
committerPatrick Palka <ppalka@redhat.com>
Sat, 22 Nov 2025 01:59:17 +0000 (20:59 -0500)
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>
gcc/cp/call.cc
gcc/testsuite/g++.dg/cpp2a/consteval42.C [new file with mode: 0644]

index ea89130572b8ba9c9c3b38845aa56c869084dd0a..b069bb5c5e1f993729ee788c5801fa02c5fcdc2f 100644 (file)
@@ -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 (file)
index 0000000..c75bb49
--- /dev/null
@@ -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> ();
+}