aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2014-01-27 23:31:07 -0500
committerJason Merrill <jason@gcc.gnu.org>2014-01-27 23:31:07 -0500
commit1b87c9918084cc4cefecb3b34b4001b01583df25 (patch)
tree49f964226a836d3aca6a8b0c810891fb29512238
parent110740003a153d13ad8c1ea73aa909d9827d0f15 (diff)
downloadgcc-1b87c9918084cc4cefecb3b34b4001b01583df25.zip
gcc-1b87c9918084cc4cefecb3b34b4001b01583df25.tar.gz
gcc-1b87c9918084cc4cefecb3b34b4001b01583df25.tar.bz2
re PR c++/58639 (ICE on self-referential struct member)
PR c++/58639 * call.c (build_aggr_conv): Reject value-initialization of reference. From-SVN: r207166
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/call.c3
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/initlist78.C12
3 files changed, 18 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index fdd9bca..99c00a2 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2014-01-27 Jason Merrill <jason@redhat.com>
+ PR c++/58639
+ * call.c (build_aggr_conv): Reject value-initialization of reference.
+
PR c++/58812
PR c++/58651
* call.c (convert_like_real): Give helpful error about excess braces
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index b72f2d4..b3db840 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -894,6 +894,9 @@ build_aggr_conv (tree type, tree ctor, int flags, tsubst_flags_t complain)
if (i < CONSTRUCTOR_NELTS (ctor))
val = CONSTRUCTOR_ELT (ctor, i)->value;
+ else if (TREE_CODE (ftype) == REFERENCE_TYPE)
+ /* Value-initialization of reference is ill-formed. */
+ return NULL;
else
{
if (empty_ctor == NULL_TREE)
diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist78.C b/gcc/testsuite/g++.dg/cpp0x/initlist78.C
new file mode 100644
index 0000000..648ec53
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/initlist78.C
@@ -0,0 +1,12 @@
+// PR c++/58639
+// { dg-require-effective-target c++11 }
+
+struct node {
+ node &parent;
+};
+
+struct vector {
+ node n;
+};
+
+vector v({}); // { dg-error "" }