https://gcc.gnu.org/g:e6749b94438a1a47c34a390e2eee53546c6d33ea
commit r16-7380-ge6749b94438a1a47c34a390e2eee53546c6d33ea Author: Jakub Jelinek <[email protected]> Date: Sat Feb 7 11:06:35 2026 +0100 c++: Fix error recovery of invalid splice during tsubst_splice_expr [PR123752] 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 <[email protected]> PR c++/123752 * pt.cc (tsubst_splice_expr): Return error_mark_node if splice returned it. * g++.dg/reflect/splice8.C: New test. Diff: --- gcc/cp/pt.cc | 2 ++ gcc/testsuite/g++.dg/reflect/splice8.C | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 50966de76f8d..049bbf07e015 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -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 index 000000000000..5ca28466c084 --- /dev/null +++ b/gcc/testsuite/g++.dg/reflect/splice8.C @@ -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); +}
