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).

llvm-svn: 53955
This commit is contained in:
Ted Kremenek 2008-07-23 18:04:17 +00:00
parent 7de7fd0305
commit 73295fab89
3 changed files with 22 additions and 11 deletions

View File

@ -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); }

View File

@ -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<ObjCIvarDecl>();
return new (Mem) ObjCIvarDecl(L, Id, T, BW);
return new (Mem) ObjCIvarDecl(L, Id, T, ac, BW);
}
ObjCProtocolDecl *ObjCProtocolDecl::Create(ASTContext &C,

View File

@ -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;
}