c++: build initializer_list<string> in a loop [PR105838]
commitbd0485f20f4794f9787237706a6308473a8e9415
authorJason Merrill <jason@redhat.com>
Tue, 6 Dec 2022 23:10:48 +0000 (6 18:10 -0500)
committerJason Merrill <jason@redhat.com>
Thu, 8 Dec 2022 18:43:25 +0000 (8 13:43 -0500)
treefce5865dde25c38a2f1d403cf3ba3154b3d0e5f1
parentd081807d8d70e3e87eae41e1560e54d503f4d465
c++: build initializer_list<string> in a loop [PR105838]

The previous patch avoided building an initializer_list<string> at all when
building a vector<string>, but in situations where that isn't possible, we
could still build the initializer_list with a loop over a constant array.

This is represented using a VEC_INIT_EXPR, which required adjusting a couple
of places that expected the initializer array to have the same type as the
target array and fixing build_vec_init not to undo our efforts.

PR c++/105838

gcc/cp/ChangeLog:

* call.cc (convert_like_internal) [ck_list]: Use
maybe_init_list_as_array.
* constexpr.cc (cxx_eval_vec_init_1): Init might have
a different type.
* tree.cc (build_vec_init_elt): Likewise.
* init.cc (build_vec_init): Handle from_array from a
TARGET_EXPR.  Retain TARGET_EXPR of a different type.

gcc/testsuite/ChangeLog:

* g++.dg/tree-ssa/initlist-opt2.C: New test.
gcc/cp/call.cc
gcc/cp/constexpr.cc
gcc/cp/init.cc
gcc/cp/tree.cc
gcc/testsuite/g++.dg/tree-ssa/initlist-opt2.C [new file with mode: 0644]