From: Ted Kremenek Date: Wed, 23 Jul 2008 18:04:17 +0000 (+0000) Subject: When constructing an ObjCIvarDecl object in Sema, provide its visibility up front... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b8db21d4df5fbb6ce1ace6411b82d3d623d789de;p=clang When constructing an ObjCIvarDecl object in Sema, provide its visibility up front instead of setting it afterwards. This change also fixes a subtle bug where the access control of an ivar would be initialized to garbage if we didn't have an explicit visibility specifier (e.g., @private). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@53955 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 264a84035d..9267bde14a 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -479,16 +479,21 @@ public: /// } /// class ObjCIvarDecl : public FieldDecl { - ObjCIvarDecl(SourceLocation L, IdentifierInfo *Id, QualType T, Expr *BW) - : FieldDecl(ObjCIvar, L, Id, T, BW) {} public: - static ObjCIvarDecl *Create(ASTContext &C, SourceLocation L, - IdentifierInfo *Id, QualType T, Expr *BW = NULL); - enum AccessControl { None, Private, Protected, Public, Package }; +private: + ObjCIvarDecl(SourceLocation L, IdentifierInfo *Id, QualType T, + AccessControl ac, Expr *BW) + : FieldDecl(ObjCIvar, L, Id, T, BW) {} + +public: + static ObjCIvarDecl *Create(ASTContext &C, SourceLocation L, + IdentifierInfo *Id, QualType T, + AccessControl ac, Expr *BW = NULL); + void setAccessControl(AccessControl ac) { DeclAccess = ac; } AccessControl getAccessControl() const { return AccessControl(DeclAccess); } diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index 4b798474f6..9ba6e86cf0 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -87,9 +87,10 @@ void ObjCInterfaceDecl::Destroy(ASTContext& C) { ObjCIvarDecl *ObjCIvarDecl::Create(ASTContext &C, SourceLocation L, - IdentifierInfo *Id, QualType T, Expr *BW) { + IdentifierInfo *Id, QualType T, + AccessControl ac, Expr *BW) { void *Mem = C.getAllocator().Allocate(); - return new (Mem) ObjCIvarDecl(L, Id, T, BW); + return new (Mem) ObjCIvarDecl(L, Id, T, ac, BW); } ObjCProtocolDecl *ObjCProtocolDecl::Create(ASTContext &C, diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 7753a75796..25d4ad5751 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -1947,16 +1947,21 @@ Sema::DeclTy *Sema::ActOnIvar(Scope *S, InvalidDecl = true; } - ObjCIvarDecl *NewID = ObjCIvarDecl::Create(Context, Loc, II, T, + // Get the visibility (access control) for this ivar. + ObjCIvarDecl::AccessControl ac = + Visibility != tok::objc_not_keyword ? TranslateIvarVisibility(Visibility) + : ObjCIvarDecl::None; + + // Construct the decl. + ObjCIvarDecl *NewID = ObjCIvarDecl::Create(Context, Loc, II, T, ac, (Expr *)BitfieldWidth); + // Process attributes attached to the ivar. ProcessDeclAttributes(NewID, D); if (D.getInvalidType() || InvalidDecl) NewID->setInvalidDecl(); - // If we have visibility info, make sure the AST is set accordingly. - if (Visibility != tok::objc_not_keyword) - NewID->setAccessControl(TranslateIvarVisibility(Visibility)); + return NewID; }