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:
parent
7de7fd0305
commit
73295fab89
|
@ -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); }
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue