aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2014-01-17 20:25:01 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2014-01-17 20:25:01 +0000
commita95aef3c126b193ad4f7cf6bed6c40534236bc0b (patch)
treea44fec4e4862e692907a24e3c7eaace881f5c487 /gcc
parentaef836828d33f32ac63d67d0e83180551b5a6fa8 (diff)
downloadgcc-a95aef3c126b193ad4f7cf6bed6c40534236bc0b.zip
gcc-a95aef3c126b193ad4f7cf6bed6c40534236bc0b.tar.gz
gcc-a95aef3c126b193ad4f7cf6bed6c40534236bc0b.tar.bz2
re PR c++/59270 ([c++11] ICE with decltype of a broken class)
/cp 2014-01-17 Paolo Carlini <paolo.carlini@oracle.com> PR c++/59270 PR c++/58811 * init.c (build_value_init_noctor): Don't pass error_mark_node to build_value_init. /testsuite 2014-01-17 Paolo Carlini <paolo.carlini@oracle.com> PR c++/59270 PR c++/58811 * g++.dg/cpp0x/decltype-incomplete1.C: New. * g++.dg/init/pr58811.C: Likewise. From-SVN: r206731
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/init.c3
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/decltype-incomplete1.C9
-rw-r--r--gcc/testsuite/g++.dg/init/pr58811.C11
5 files changed, 37 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 45a6c97..0508ea0 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,12 @@
2014-01-17 Paolo Carlini <paolo.carlini@oracle.com>
+ PR c++/59270
+ PR c++/58811
+ * init.c (build_value_init_noctor): Don't pass error_mark_node to
+ build_value_init.
+
+2014-01-17 Paolo Carlini <paolo.carlini@oracle.com>
+
PR c++/59269
* init.c (build_value_init_noctor): Assert !TYPE_HAS_COMPLEX_DFLT
only when errorcount == 0.
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 931b5c8..194a797 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -400,6 +400,9 @@ build_value_init_noctor (tree type, tsubst_flags_t complain)
ftype = TREE_TYPE (field);
+ if (ftype == error_mark_node)
+ continue;
+
/* We could skip vfields and fields of types with
user-defined constructors, but I think that won't improve
performance at all; it should be simpler in general just
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5d80c8e..c471ae9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2014-01-17 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/59270
+ PR c++/58811
+ * g++.dg/cpp0x/decltype-incomplete1.C: New.
+ * g++.dg/init/pr58811.C: Likewise.
+
2014-01-17 Jeff Law <law@redhat.com>
PR middle-end/57904
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype-incomplete1.C b/gcc/testsuite/g++.dg/cpp0x/decltype-incomplete1.C
new file mode 100644
index 0000000..f46d0ba
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/decltype-incomplete1.C
@@ -0,0 +1,9 @@
+// PR c++/59270
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ struct B b; // { dg-error "incomplete type" }
+};
+
+decltype(A()) a;
diff --git a/gcc/testsuite/g++.dg/init/pr58811.C b/gcc/testsuite/g++.dg/init/pr58811.C
new file mode 100644
index 0000000..42e7fac
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/pr58811.C
@@ -0,0 +1,11 @@
+// PR c++/58811
+
+struct B
+{
+ struct A a; // { dg-error "incomplete type" }
+};
+
+void foo()
+{
+ B();
+}