https://gcc.gnu.org/bugzilla/show_bug.cgi?id=123611
--- Comment #14 from GCC Commits <cvs-commit at gcc dot gnu.org> --- The trunk branch has been updated by Marek Polacek <[email protected]>: https://gcc.gnu.org/g:d1c6023698dbf575af4affa05bb1dc9e90502a33 commit r16-7718-gd1c6023698dbf575af4affa05bb1dc9e90502a33 Author: Marek Polacek <[email protected]> Date: Mon Feb 23 14:16:13 2026 -0500 c++/reflection: fix wrong "consteval-only" error [PR123662] This patch fixes a very annoying problem where we emit a bogus check_out_of_consteval_use error. The error is provoked while processing [: std::meta::reflect_constant_array (data) :] The argument of a [: :] is a constant-expression = a manifestly constant-evaluated context, so any consteval-only exprs in it are OK. But in eval_reflect_constant_array we do get_template_parm_object which does push_to_top_level -- so we have no scope_chain, therefore any in_consteval_if_p and current_function_decl are cleared, so we're not in an immediate context. As part of this get_template_parm_object, we call cp_finish_decl -> check_initializer -> build_aggr_init -> -> build_vec_init. Here in build_vec_init try_const is true, but we still generate code for the initializer like <<< Unknown tree: expr_stmt (void) ++D.67757 >>>; <<< Unknown tree: expr_stmt (void) --D.67758 >>>; etc. We add ++D.67757 with finish_expr_stmt which calls convert_to_void -> check_out_of_consteval_use which causes the error because ++D.67757's type is consteval-only. Note that what we end up using is the simple _ZTAX... = {{.name=<<< Unknown tree: reflect_expr _ZTAXtlA2_KcLS_95EEE >>>, .none=1}} because we didn't see anything non-const in the initializer. Rather than convincing check_out_of_consteval_use that we are in an immediate context, we should only call check_out_of_consteval_use on the outermost statement, not sub-statements like the ++D.67757 above. This is not a complete fix though, see the FIXME. PR c++/123662 PR c++/123611 gcc/cp/ChangeLog: * cvt.cc (convert_to_void): Only call check_out_of_consteval_use when stmts_are_full_exprs_p. gcc/testsuite/ChangeLog: * g++.dg/reflect/reflect_constant_array5.C: New test. * g++.dg/reflect/reflect_constant_array6.C: New test. Reviewed-by: Jason Merrill <[email protected]>
