https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102307

--- Comment #8 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jason Merrill <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:2b0c8377729a3c62a05897136666574ab939aaab

commit r13-576-g2b0c8377729a3c62a05897136666574ab939aaab
Author: Jason Merrill <ja...@redhat.com>
Date:   Tue Apr 26 11:15:04 2022 -0400

    c++: constexpr ref to array of array [PR102307]

    The problem here is that first check_initializer calls
    build_aggr_init_full_exprs, which does overload resolution, but then in the
    case of failed constexpr throws away the result and does it again in
    build_functional_cast.  But in the first overload resolution,
    reshape_init_array_1 decided to reuse the inner CONSTRUCTORs because
    tf_error is set, so we know we're committed.  But the second pass gets
    confused by the CONSTRUCTORs with non-init-list types.

    Fixed by avoiding a second pass: instead, pass the call from
build_aggr_init
    to build_cplus_new, which will turn it into a TARGET_EXPR.  I don't bother
    to change the object argument because it will be replaced later in
    simplify_aggr_init_expr.

            PR c++/102307

    gcc/cp/ChangeLog:

            * decl.cc (check_initializer): Use build_cplus_new in case of
            constexpr failure.

    gcc/testsuite/ChangeLog:

            * g++.dg/cpp1z/constexpr-array2.C: New test.

Reply via email to