diff options
author | Douglas Gregor <dgregor@apple.com> | 2008-11-05 16:20:31 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2008-11-05 16:20:31 +0000 |
commit | 64bffa9a6f40e5a3d5556f994f09f7bf45eecd4c (patch) | |
tree | 1dadd5d78769ad7701edc4f614b9c34e6020da5d /lib/Sema/SemaDeclCXX.cpp | |
parent | f03d7c7af2ca8555c513ba7667acffb667445ecd (diff) |
Keep track of whether a C++ class is an aggregate. Don't allow initialization of non-aggregates with initializer lists.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58757 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDeclCXX.cpp')
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index b95ebf0bad..53051ff57f 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -461,6 +461,15 @@ Sema::ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D, // member decls. CXXClassMemberWrapper(Member).setAccess(AS); + // C++ [dcl.init.aggr]p1: + // An aggregate is an array or a class (clause 9) with [...] no + // private or protected non-static data members (clause 11). + if (isInstField && (AS == AS_private || AS == AS_protected)) + cast<CXXRecordDecl>(CurContext)->setAggregate(false); + + // FIXME: If the member is a virtual function, mark it its class as + // a non-aggregate. + if (BitWidth) { // C++ 9.6p2: Only when declaring an unnamed bit-field may the // constant-expression be a value equal to zero. |