diff options
Diffstat (limited to 'lib/Sema')
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 17 | ||||
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 9 |
2 files changed, 26 insertions, 0 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 5dc571c0ee..c8c253a3fb 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -701,6 +701,23 @@ bool Sema::CheckInitializerTypes(Expr *&Init, QualType &DeclType, Init->getSourceRange()); return CheckSingleInitializer(Init, DeclType); + } else if (getLangOptions().CPlusPlus) { + // C++ [dcl.init]p14: + // [...] If the class is an aggregate (8.5.1), and the initializer + // is a brace-enclosed list, see 8.5.1. + // + // Note: 8.5.1 is handled below; here, we diagnose the case where + // we have an initializer list and a destination type that is not + // an aggregate. + // FIXME: In C++0x, this is yet another form of initialization. + if (const RecordType *ClassRec = DeclType->getAsRecordType()) { + const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(ClassRec->getDecl()); + if (!ClassDecl->isAggregate()) + return Diag(InitLoc, + diag::err_init_non_aggr_init_list, + DeclType.getAsString(), + Init->getSourceRange()); + } } InitListChecker CheckInitList(this, InitList, DeclType); 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. |