diff options
author | Paolo Carlini <paolo@gcc.gnu.org> | 2010-05-20 19:31:47 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2010-05-20 19:31:47 +0000 |
commit | 1a494ab5a5303d7157029689758893e63b7f54e9 (patch) | |
tree | 93586309a1e69fad6850fcdda7006587407edb92 /gcc/cp | |
parent | 953c29f73eb8ad665a5e1324bb0b66f98a8e6839 (diff) | |
download | gcc-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/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 7 |
2 files changed, 12 insertions, 1 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); |