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]>

Reply via email to