ychen created this revision. ychen added reviewers: hubert.reinterpretcast, Xiangling_L. ychen requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Sema layer should handle these already. Otherwise checking build of the compiler would crash for these invalid constructs. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D113145 Files: clang/lib/AST/RecordLayoutBuilder.cpp clang/test/SemaCXX/virtual-function-in-union.cpp Index: clang/test/SemaCXX/virtual-function-in-union.cpp =================================================================== --- clang/test/SemaCXX/virtual-function-in-union.cpp +++ 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; } Index: clang/lib/AST/RecordLayoutBuilder.cpp =================================================================== --- clang/lib/AST/RecordLayoutBuilder.cpp +++ 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;
Index: clang/test/SemaCXX/virtual-function-in-union.cpp =================================================================== --- clang/test/SemaCXX/virtual-function-in-union.cpp +++ 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; } Index: clang/lib/AST/RecordLayoutBuilder.cpp =================================================================== --- clang/lib/AST/RecordLayoutBuilder.cpp +++ 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;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits