On Fri, Feb 06, 2026 at 10:41:56AM +0100, Jakub Jelinek wrote: > Hi! > > 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.
LGTM. > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > > 2026-02-05 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. > > --- gcc/cp/pt.cc.jj 2026-02-05 15:14:59.078531057 +0100 > +++ gcc/cp/pt.cc 2026-02-05 19:27:49.528258536 +0100 > @@ -16753,6 +16753,8 @@ tsubst_splice_expr (tree t, tree args, t > 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)) > --- gcc/testsuite/g++.dg/reflect/splice8.C.jj 2026-02-05 19:29:28.915578706 > +0100 > +++ gcc/testsuite/g++.dg/reflect/splice8.C 2026-02-05 19:28:59.850069966 > +0100 > @@ -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); > +} > > Jakub > Marek
