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
