aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2018-01-18 17:11:43 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2018-01-18 17:11:43 +0000
commit50b27938f70819e2453bcd72a80a6a4c2b9e2fcb (patch)
treec19191d92f8a1319273979ed172ebc3d4d215ebf /gcc
parent9f7b87cad7c110dc656b4f201782819633dae2cf (diff)
downloadgcc-50b27938f70819e2453bcd72a80a6a4c2b9e2fcb.zip
gcc-50b27938f70819e2453bcd72a80a6a4c2b9e2fcb.tar.gz
gcc-50b27938f70819e2453bcd72a80a6a4c2b9e2fcb.tar.bz2
re PR c++/81013 (ICE with invalid union in class hierarchy)
/cp 2018-01-18 Paolo Carlini <paolo.carlini@oracle.com> PR c++/81013 * decl.c (xref_basetypes): Early return upon error about derived union. /testsuite 2018-01-18 Paolo Carlini <paolo.carlini@oracle.com> PR c++/81013 * g++.dg/inherit/union3.C: New. From-SVN: r256856
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/inherit/union3.C16
4 files changed, 31 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 0cacefa..2de9dcb 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2018-01-18 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/81013
+ * decl.c (xref_basetypes): Early return upon error about derived
+ union.
+
2018-01-18 Nathan Sidwell <nathan@acm.org>
PR c++/83160
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 12022a2..32ac81f 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -13801,7 +13801,10 @@ xref_basetypes (tree ref, tree base_list)
CLASSTYPE_NON_LAYOUT_POD_P (ref) = true;
if (TREE_CODE (ref) == UNION_TYPE)
- error ("derived union %qT invalid", ref);
+ {
+ error ("derived union %qT invalid", ref);
+ return;
+ }
}
if (max_bases > 1)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f9674a9..3110c48 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-01-18 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/81013
+ * g++.dg/inherit/union3.C: New.
+
2018-01-18 Christophe Lyon <christophe.lyon@linaro.org>
* gcc.dg/rtl/arm/stl-cond.c: Enable on arm*.
diff --git a/gcc/testsuite/g++.dg/inherit/union3.C b/gcc/testsuite/g++.dg/inherit/union3.C
new file mode 100644
index 0000000..c13b397
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/union3.C
@@ -0,0 +1,16 @@
+// PR c++/81013
+
+struct A
+{
+ virtual void foo() const;
+};
+
+union B : A // { dg-error "derived union 'B' invalid" }
+{
+ void foo() const;
+};
+
+void bar(const B& b)
+{
+ b.foo();
+}