From 5806f7716ca0de830266dfbebca11e6919beb581 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 14 Jul 2014 01:25:13 -0400 Subject: [PATCH] re PR c++/58636 (ICE with initializer_list and rvalue references) PR c++/58636 * call.c (build_list_conv): Don't try to build a list of references. From-SVN: r212503 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/call.c | 6 ++++++ gcc/testsuite/g++.dg/cpp0x/initlist-array4.C | 9 +++++++++ 3 files changed, 20 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/initlist-array4.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e873d99..bdad6d9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2014-07-13 Jason Merrill + + PR c++/58636 + * call.c (build_list_conv): Don't try to build a list of references. + 2014-07-13 Edward Smith-Rowland <3dw4rd@verizon.net> PR C++/60209 - Declaration of user-defined literal operator cause error diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 4ca6be5..b16c6e4 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -806,6 +806,12 @@ build_list_conv (tree type, tree ctor, int flags, tsubst_flags_t complain) /* But no narrowing conversions. */ flags |= LOOKUP_NO_NARROWING; + /* Can't make an array of these types. */ + if (TREE_CODE (elttype) == REFERENCE_TYPE + || TREE_CODE (elttype) == FUNCTION_TYPE + || VOID_TYPE_P (elttype)) + return NULL; + FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (ctor), i, val) { conversion *sub diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-array4.C b/gcc/testsuite/g++.dg/cpp0x/initlist-array4.C new file mode 100644 index 0000000..af2045d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-array4.C @@ -0,0 +1,9 @@ +// PR c++/58636 +// { dg-do compile { target c++11 } } + +#include + +// { dg-error "pointer to reference" "" { target *-*-* } 0 } +int foo(std::initializer_list); + +int i = foo({ 0 }); // { dg-error "std::initializer_list" } -- 2.7.4