From: Douglas Gregor Date: Wed, 11 Mar 2009 20:50:30 +0000 (+0000) Subject: Make sure that we set the access specifier for an instantiated FieldDecl, and that... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4dd55f511d1fba732f2968f430ce999fc8293896;p=clang Make sure that we set the access specifier for an instantiated FieldDecl, and that the aggregate and POD flags for an instantiated class template are updated based on instantiation of a FieldDecl git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66701 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index 1a66cc0324..8f033197e4 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -369,12 +369,13 @@ public: Declarator &D, ExprTy *BitfieldWidth); FieldDecl *HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart, - Declarator &D, Expr *BitfieldWidth); + Declarator &D, Expr *BitfieldWidth, + AccessSpecifier AS); FieldDecl *CheckFieldDecl(DeclarationName Name, QualType T, RecordDecl *Record, SourceLocation Loc, bool Mutable, Expr *BitfieldWidth, - NamedDecl *PrevDecl, + AccessSpecifier AS, NamedDecl *PrevDecl, Declarator *D = 0); virtual DeclTy *ActOnIvar(Scope *S, SourceLocation DeclStart, diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index f77d1d8845..2e033bf907 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -3253,14 +3253,16 @@ Sema::DeclTy *Sema::ActOnField(Scope *S, DeclTy *TagD, SourceLocation DeclStart, Declarator &D, ExprTy *BitfieldWidth) { return HandleField(S, static_cast(TagD), DeclStart, D, - static_cast(BitfieldWidth)); + static_cast(BitfieldWidth), + AS_public); } /// HandleField - Analyze a field of a C struct or a C++ data member. /// FieldDecl *Sema::HandleField(Scope *S, RecordDecl *Record, SourceLocation DeclStart, - Declarator &D, Expr *BitWidth) { + Declarator &D, Expr *BitWidth, + AccessSpecifier AS) { IdentifierInfo *II = D.getIdentifier(); SourceLocation Loc = DeclStart; if (II) Loc = D.getIdentifierLoc(); @@ -3277,7 +3279,7 @@ FieldDecl *Sema::HandleField(Scope *S, RecordDecl *Record, FieldDecl *NewFD = CheckFieldDecl(II, T, Record, Loc, D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_mutable, - BitWidth, PrevDecl, &D); + BitWidth, AS, PrevDecl, &D); if (NewFD->isInvalidDecl() && PrevDecl) { // Don't introduce NewFD into scope; there's already something // with the same name in the same scope. @@ -3302,7 +3304,7 @@ FieldDecl *Sema::HandleField(Scope *S, RecordDecl *Record, FieldDecl *Sema::CheckFieldDecl(DeclarationName Name, QualType T, RecordDecl *Record, SourceLocation Loc, bool Mutable, Expr *BitWidth, - NamedDecl *PrevDecl, + AccessSpecifier AS, NamedDecl *PrevDecl, Declarator *D) { IdentifierInfo *II = Name.getAsIdentifierInfo(); bool InvalidDecl = false; @@ -3364,6 +3366,19 @@ FieldDecl *Sema::CheckFieldDecl(DeclarationName Name, QualType T, if (InvalidDecl) NewFD->setInvalidDecl(); + NewFD->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). + // A POD must be an aggregate. + if (getLangOptions().CPlusPlus && + (AS == AS_private || AS == AS_protected)) { + CXXRecordDecl *CXXRecord = cast(Record); + CXXRecord->setAggregate(false); + CXXRecord->setPOD(false); + } + return NewFD; } diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index bedea3a7cd..0ea501d993 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -547,7 +547,8 @@ Sema::ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D, Decl *Member; if (isInstField) { - Member = HandleField(S, cast(CurContext), Loc, D, BitWidth); + Member = HandleField(S, cast(CurContext), Loc, D, BitWidth, + AS); assert(Member && "HandleField never returns null"); } else { Member = static_cast(ActOnDeclarator(S, D, LastInGroup)); @@ -581,22 +582,12 @@ Sema::ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D, BitWidth = 0; Member->setInvalidDecl(); } + + Member->setAccess(AS); } assert((Name || isInstField) && "No identifier for non-field ?"); - 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). - // A POD must be an aggregate. - if (isInstField && (AS == AS_private || AS == AS_protected)) { - CXXRecordDecl *Record = cast(CurContext); - Record->setAggregate(false); - Record->setPOD(false); - } - if (DS.isVirtualSpecified()) { if (!isFunc || DS.getStorageClassSpec() == DeclSpec::SCS_static) { Diag(DS.getVirtualSpecLoc(), diag::err_virtual_non_function); diff --git a/lib/Sema/SemaTemplateInstantiate.cpp b/lib/Sema/SemaTemplateInstantiate.cpp index 5800ab9265..343c00b745 100644 --- a/lib/Sema/SemaTemplateInstantiate.cpp +++ b/lib/Sema/SemaTemplateInstantiate.cpp @@ -718,6 +718,7 @@ Sema::InstantiateClassTemplateSpecialization( Field->getLocation(), Field->isMutable(), Field->getBitWidth(), + Field->getAccess(), 0); if (New) { ClassTemplateSpec->addDecl(New);