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.
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))
--- /dev/null
+// 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);
+}