aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo@gcc.gnu.org>2010-05-20 19:31:47 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2010-05-20 19:31:47 +0000
commit1a494ab5a5303d7157029689758893e63b7f54e9 (patch)
tree93586309a1e69fad6850fcdda7006587407edb92 /gcc
parent953c29f73eb8ad665a5e1324bb0b66f98a8e6839 (diff)
downloadgcc-1a494ab5a5303d7157029689758893e63b7f54e9.zip
gcc-1a494ab5a5303d7157029689758893e63b7f54e9.tar.gz
gcc-1a494ab5a5303d7157029689758893e63b7f54e9.tar.bz2
re PR c++/30298 (ICE with duplicate broken inheritance)
/cp 2010-05-20 Paolo Carlini <paolo.carlini@oracle.com> PR c++/30298 * decl.c (xref_basetypes): Return false in case of ill-formed redefinition. /testsuite 2010-05-20 Paolo Carlini <paolo.carlini@oracle.com> PR c++/30298 * g++.dg/inherit/crash1.C: New. * g++.dg/inherit/crash2.C: Likewise. From-SVN: r159637
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl.c7
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/g++.dg/inherit/crash1.C6
-rw-r--r--gcc/testsuite/g++.dg/inherit/crash2.C6
5 files changed, 32 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 68d461e..8e6cd75 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2010-05-20 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/30298
+ * decl.c (xref_basetypes): Return false in case of ill-formed
+ redefinition.
+
2010-05-19 Jason Merrill <jason@redhat.com>
* call.c (reference_binding): Use cp_build_qualified_type_real
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 43a6bc3..95ae8eb 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -11025,7 +11025,12 @@ xref_basetypes (tree ref, tree base_list)
/* The binfo slot should be empty, unless this is an (ill-formed)
redefinition. */
- gcc_assert (!TYPE_BINFO (ref) || TYPE_SIZE (ref));
+ if (TYPE_BINFO (ref) && !TYPE_SIZE (ref))
+ {
+ error ("redefinition of %q#T", ref);
+ return false;
+ }
+
gcc_assert (TYPE_MAIN_VARIANT (ref) == ref);
binfo = make_tree_binfo (max_bases);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d50e8ba..d4c10f3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2010-05-20 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/30298
+ * g++.dg/inherit/crash1.C: New.
+ * g++.dg/inherit/crash2.C: Likewise.
+
2010-05-20 Jakub Jelinek <jakub@redhat.com>
PR debug/44178
@@ -6,7 +12,8 @@
2010-05-20 Changpeng Fang <changpeng.fang@amd.com>
PR middle-end/44185
- * gcc.dg/tree-ssa/prefetch-6.c: Add --param min-insn-to-prefetch-ratio=6.
+ * gcc.dg/tree-ssa/prefetch-6.c: Add
+ --param min-insn-to-prefetch-ratio=6.
* gcc.dg/tree-ssa/prefetch-7.c: Remove --param max-unrolled-insns=1 to
allow unrolling, and adjust the movnti count.
diff --git a/gcc/testsuite/g++.dg/inherit/crash1.C b/gcc/testsuite/g++.dg/inherit/crash1.C
new file mode 100644
index 0000000..d5eb7c2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/crash1.C
@@ -0,0 +1,6 @@
+// PR c++/30298
+
+union A {};
+
+struct B : A {}; // { dg-error "fails to be a struct or class type" }
+struct B : A {}; // { dg-error "redefinition" }
diff --git a/gcc/testsuite/g++.dg/inherit/crash2.C b/gcc/testsuite/g++.dg/inherit/crash2.C
new file mode 100644
index 0000000..0d82f77
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/crash2.C
@@ -0,0 +1,6 @@
+// PR c++/30298
+
+struct A {};
+
+struct B : A, A {}; // { dg-error "duplicate base type" }
+struct B : A, A {}; // { dg-error "redefinition" }