PR c++/89144 - link error with constexpr initializer_list.
authorJason Merrill <jason@redhat.com>
Tue, 12 Feb 2019 21:18:51 +0000 (16:18 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 12 Feb 2019 21:18:51 +0000 (16:18 -0500)
commitd950b005f993d092dd6e0cefbaf1ecfaf6765cb4
tree8672ef152764d8e8920214c9d589230803191a12
parent705c92a2ab98d373c8500fd096cd49e8cc97c070
PR c++/89144 - link error with constexpr initializer_list.

In this PR, we were unnecessarily rejecting a constexpr initializer_list
with no elements.  This seems like a fairly useless degenerate case, but it
makes sense to avoid allocating an underlying array at all if there are no
elements and instead use a null pointer, like the initializer_list default
constructor.

If the (automatic storage duration) list does have initializer elements, we
continue to reject the declaration, because the initializer_list ends up
referring to an automatic storage duration temporary array, which is not a
suitable constant initializer.  If we make it static, it should be OK
because we refer to a static array.  The second hunk fixes that case.  It
also means we won't diagnose some real errors in templates, but those
diagnostics aren't required, and we'll get them when the template is
instantiated.

* call.c (convert_like_real) [ck_list]: Don't allocate a temporary
array for an empty list.
* typeck2.c (store_init_value): Don't use cxx_constant_init in a
template.

From-SVN: r268827
gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/typeck2.c
gcc/testsuite/g++.dg/cpp0x/constexpr-initlist11.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/constexpr-initlist11a.C [new file with mode: 0644]