]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Fix error recovery of invalid splice during tsubst_splice_expr [PR123752]
authorJakub Jelinek <jakub@redhat.com>
Sat, 7 Feb 2026 10:06:35 +0000 (11:06 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 7 Feb 2026 10:09:20 +0000 (11:09 +0100)
splice can return error_mark_node, e.g. if the evaluation of the
constant expression throws without being caught, and the error_mark_node
later on causes ICEs in various asserts.

The following patch fixes it by returning early if error_mark_node is
returned.

2026-02-07  Jakub Jelinek  <jakub@redhat.com>

PR c++/123752
* pt.cc (tsubst_splice_expr): Return error_mark_node if
splice returned it.

* g++.dg/reflect/splice8.C: New test.

gcc/cp/pt.cc
gcc/testsuite/g++.dg/reflect/splice8.C [new file with mode: 0644]

index 50966de76f8d1d30f6578b4624603974dd992c0a..049bbf07e015768ca5d004627110ea39cea3423f 100644 (file)
@@ -16753,6 +16753,8 @@ tsubst_splice_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
   if (op == error_mark_node)
     return error_mark_node;
   op = splice (op);
+  if (op == error_mark_node)
+    return error_mark_node;
   if (dependent_splice_p (op))
     {
       if (SPLICE_EXPR_EXPRESSION_P (t))
diff --git a/gcc/testsuite/g++.dg/reflect/splice8.C b/gcc/testsuite/g++.dg/reflect/splice8.C
new file mode 100644 (file)
index 0000000..5ca2846
--- /dev/null
@@ -0,0 +1,33 @@
+// PR c++/123752
+// { dg-do compile { target c++26 } }
+// { dg-additional-options "-freflection" }
+
+struct S { int s; };
+struct U { int u; };
+
+template <typename T>
+consteval decltype (^^int)
+foo ()
+{
+  return ^^S::s;
+}
+
+template <>
+consteval decltype (^^int)
+foo <U> ()
+{
+  throw 1;
+}
+
+template <typename T>
+auto
+bar (T x)
+{
+  return x.[: foo <T> () :];   // { dg-error "uncaught exception '1'" }
+}
+
+auto
+baz (U x)
+{
+  return bar (x);
+}