diff options
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/inherit/union3.C | 16 |
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(); +} |