Simplify RecordDeclCXX::setBases slightly. No functional change.
Add test that a variadic base list which expands to 0 bases doesn't make the class a non-aggregate. This test passed before the change, too. llvm-svn: 142411
This commit is contained in:
parent
05c562f094
commit
aed32b4d8c
|
@ -77,15 +77,20 @@ void
|
|||
CXXRecordDecl::setBases(CXXBaseSpecifier const * const *Bases,
|
||||
unsigned NumBases) {
|
||||
ASTContext &C = getASTContext();
|
||||
|
||||
// C++ [dcl.init.aggr]p1:
|
||||
// An aggregate is an array or a class (clause 9) with [...]
|
||||
// no base classes [...].
|
||||
data().Aggregate = false;
|
||||
|
||||
if (!data().Bases.isOffset() && data().NumBases > 0)
|
||||
C.Deallocate(data().getBases());
|
||||
|
||||
if (NumBases) {
|
||||
// C++ [dcl.init.aggr]p1:
|
||||
// An aggregate is [...] a class with [...] no base classes [...].
|
||||
data().Aggregate = false;
|
||||
|
||||
// C++ [class]p4:
|
||||
// A POD-struct is an aggregate class...
|
||||
data().PlainOldData = false;
|
||||
}
|
||||
|
||||
// The set of seen virtual base types.
|
||||
llvm::SmallPtrSet<CanQualType, 8> SeenVBaseTypes;
|
||||
|
||||
|
@ -105,14 +110,6 @@ CXXRecordDecl::setBases(CXXBaseSpecifier const * const *Bases,
|
|||
CXXRecordDecl *BaseClassDecl
|
||||
= cast<CXXRecordDecl>(BaseType->getAs<RecordType>()->getDecl());
|
||||
|
||||
// C++ [dcl.init.aggr]p1:
|
||||
// An aggregate is [...] a class with [...] no base classes [...].
|
||||
data().Aggregate = false;
|
||||
|
||||
// C++ [class]p4:
|
||||
// A POD-struct is an aggregate class...
|
||||
data().PlainOldData = false;
|
||||
|
||||
// A class with a non-empty base class is not empty.
|
||||
// FIXME: Standard ref?
|
||||
if (!BaseClassDecl->isEmpty()) {
|
||||
|
|
|
@ -53,6 +53,10 @@ NonAggr4 na4 = { 42 }; // expected-error {{non-aggregate type 'NonAggr4'}}
|
|||
struct NonAggr5 : Aggr {
|
||||
};
|
||||
NonAggr5 na5 = { b }; // expected-error {{non-aggregate type 'NonAggr5'}}
|
||||
template<typename...BaseList>
|
||||
struct MaybeAggr5a : BaseList... {};
|
||||
MaybeAggr5a<> ma5a0 = {}; // ok
|
||||
MaybeAggr5a<Aggr> ma5a1 = {}; // expected-error {{non-aggregate type 'MaybeAggr5a<Aggr>'}}
|
||||
|
||||
// and no virtual functions.
|
||||
struct NonAggr6 {
|
||||
|
|
Loading…
Reference in New Issue