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

Reply via email to