diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -1066,7 +1066,6 @@ EnsureVTablePointerAlignment(PtrAlign); HasOwnVFPtr = true; - assert(!IsUnion && "Unions cannot be dynamic classes."); HandledFirstNonOverlappingEmptyField = true; setSize(getSize() + PtrWidth); @@ -1204,8 +1203,6 @@ CharUnits ItaniumRecordLayoutBuilder::LayoutBase(const BaseSubobjectInfo *Base) { - assert(!IsUnion && "Unions cannot have base classes."); - const ASTRecordLayout &Layout = Context.getASTRecordLayout(Base->Class); CharUnits Offset; diff --git a/clang/test/SemaCXX/virtual-function-in-union.cpp b/clang/test/SemaCXX/virtual-function-in-union.cpp --- a/clang/test/SemaCXX/virtual-function-in-union.cpp +++ b/clang/test/SemaCXX/virtual-function-in-union.cpp @@ -1,5 +1,8 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s -union x { - virtual void f(); // expected-error {{unions cannot have virtual functions}} +union U { + int d; + virtual int f() { return d; }; // expected-error {{unions cannot have virtual functions}} }; + +int foo() { U u; return u.d; }