diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-10-18 20:08:55 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-10-18 20:08:55 +0000 |
commit | aed32b4d8cdb37b4cbc40dab6a668dd242c1361f (patch) | |
tree | 8fdc9c365ca77ab3eccc44c29d6eceacaa43963d /clang | |
parent | 05c562f0942721e7efaf7321dda2df80e31965c7 (diff) | |
download | bcm5719-llvm-aed32b4d8cdb37b4cbc40dab6a668dd242c1361f.tar.gz bcm5719-llvm-aed32b4d8cdb37b4cbc40dab6a668dd242c1361f.zip |
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
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/AST/DeclCXX.cpp | 23 | ||||
-rw-r--r-- | clang/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1-0x.cpp | 4 |
2 files changed, 14 insertions, 13 deletions
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp index f3da67c4ff8..576d0d51483 100644 --- a/clang/lib/AST/DeclCXX.cpp +++ b/clang/lib/AST/DeclCXX.cpp @@ -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()) { diff --git a/clang/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1-0x.cpp b/clang/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1-0x.cpp index b8c1e18a2e1..13b02c014e4 100644 --- a/clang/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1-0x.cpp +++ b/clang/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1-0x.cpp @@ -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 { |