On Tue, May 26, 2026 at 05:56:21PM +0200, Jakub Jelinek wrote:
> On Tue, May 26, 2026 at 09:38:33AM -0400, Marek Polacek wrote:
> > I'm not against this but I would think we may want to check error_operand_p 
> > (h)
> > in process_metafunction instead?
> 
> That works too in reflect/* testing.

Thanks, LGTM.
 
> 2026-05-26  Jakub Jelinek  <[email protected]>
> 
>       PR c++/125412
>       * reflect.cc (process_metafunction): If ht is error_operand_p, set
>       *non_constant_p and return NULL_TREE.
> 
>       * g++.dg/reflect/pr125412.C: New test.
> 
> --- gcc/cp/reflect.cc.jj      2026-05-25 10:42:52.681817335 +0200
> +++ gcc/cp/reflect.cc 2026-05-26 17:29:29.483733178 +0200
> @@ -7887,6 +7887,11 @@ process_metafunction (const constexpr_ct
>       if (*jump_target || *non_constant_p)
>         return NULL_TREE;
>       ht = REFLECT_EXPR_HANDLE (info);
> +     if (error_operand_p (ht))
> +       {
> +         *non_constant_p = true;
> +         return NULL_TREE;
> +       }
>       if (METAFN_KIND_ARG (minfo, argno) == METAFN_KIND_ARG_TINFO
>           && eval_is_type (ht) != boolean_true_node)
>         return throw_exception_nontype (loc, ctx, fun, non_constant_p,
> --- gcc/testsuite/g++.dg/reflect/pr125412.C.jj        2026-05-25 
> 12:02:08.456192292 +0200
> +++ gcc/testsuite/g++.dg/reflect/pr125412.C   2026-05-25 12:10:38.405976096 
> +0200
> @@ -0,0 +1,24 @@
> +// PR c++/125412
> +// { dg-do compile { target c++26 } }
> +// { dg-additional-options "-freflection" }
> +
> +#include <meta>
> +
> +void
> +foo ()
> +{
> +}
> +
> +auto bar ();
> +
> +template <typename T>
> +auto a = foo ();     // { dg-error "variable or field 'a' declared void" }
> +template <typename T>
> +auto b = bar ();     // { dg-error "use of 'auto bar\\\(\\\)' before 
> deduction of 'auto'" }
> +
> +consteval {
> +  auto c = substitute (^^a, { ^^int });
> +  std::meta::extract <int> (c);
> +  auto d = substitute (^^b, { ^^int });
> +  std::meta::extract <int> (d);
> +}
> 
> 
>       Jakub
> 

Marek

Reply via email to