]> gcc.gnu.org Git - gcc.git/commit
c++: constexpr ref to array of array [PR102307]
authorJason Merrill <jason@redhat.com>
Tue, 26 Apr 2022 15:15:04 +0000 (11:15 -0400)
committerJason Merrill <jason@redhat.com>
Tue, 31 May 2022 19:36:47 +0000 (15:36 -0400)
commit3c10dc751e8670c7cc02a1b6db9abffb59d2fc42
tree6476087f1d6d079d8591fb9c5586161c436a5971
parentad1fe0c1edaf3da32d045e1946d40a032fa82587
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.c (check_initializer): Use build_cplus_new in case of
constexpr failure.

gcc/testsuite/ChangeLog:

* g++.dg/cpp1z/constexpr-array2.C: New test.
gcc/cp/decl.c
gcc/testsuite/g++.dg/cpp1z/constexpr-array2.C [new file with mode: 0644]
This page took 0.05213 seconds and 5 git commands to generate.