diff options
-rw-r--r-- | lib/AST/RecordLayoutBuilder.cpp | 4 | ||||
-rw-r--r-- | test/SemaCXX/primary-base.cpp | 11 |
2 files changed, 13 insertions, 2 deletions
diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index 836e43c43a..8a3e08965f 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -158,8 +158,8 @@ void ASTRecordLayoutBuilder::SelectPrimaryBase(const CXXRecordDecl *RD) { // Otherwise if is the first nearly empty virtual base, if one exists, // otherwise there is no primary base class. - setPrimaryBase(FirstPrimary, true); - return; + if (!PrimaryBase) + setPrimaryBase(FirstPrimary, true); } void ASTRecordLayoutBuilder::LayoutVirtualBase(const CXXRecordDecl *RD) { diff --git a/test/SemaCXX/primary-base.cpp b/test/SemaCXX/primary-base.cpp new file mode 100644 index 0000000000..62f9087bd9 --- /dev/null +++ b/test/SemaCXX/primary-base.cpp @@ -0,0 +1,11 @@ +// RUN: clang-cc -fsyntax-only -verify %s +class A { virtual void f(); }; +class B : virtual A { }; + +class C : B { }; + +// Since A is already a primary base class, C should be the primary base class of F. +class F : virtual A, virtual C { }; + +int sa[sizeof(F) == sizeof(A) ? 1 : -1]; + |