diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index ad2d571dcf..a01d62b6e0 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -523,7 +523,7 @@ public: class ObjCClassDecl : public Decl { ObjCInterfaceDecl **ForwardDecls; unsigned NumForwardDecls; -public: + ObjCClassDecl(SourceLocation L, ObjCInterfaceDecl **Elts, unsigned nElts) : Decl(ObjCClass, L) { if (nElts) { @@ -534,6 +534,10 @@ public: } NumForwardDecls = nElts; } +public: + static ObjCClassDecl *Create(ASTContext &C, SourceLocation L, + ObjCInterfaceDecl **Elts, unsigned nElts); + void setInterfaceDecl(unsigned idx, ObjCInterfaceDecl *OID) { assert(idx < NumForwardDecls && "index out of range"); ForwardDecls[idx] = OID; @@ -553,7 +557,7 @@ public: class ObjCForwardProtocolDecl : public Decl { ObjCProtocolDecl **ReferencedProtocols; unsigned NumReferencedProtocols; -public: + ObjCForwardProtocolDecl(SourceLocation L, ObjCProtocolDecl **Elts, unsigned nElts) : Decl(ObjCForwardProtocol, L) { @@ -565,6 +569,11 @@ public: ReferencedProtocols = 0; } } +public: + static ObjCForwardProtocolDecl *Create(ASTContext &C, SourceLocation L, + ObjCProtocolDecl **Elts, unsigned Num); + + void setForwardProtocolDecl(unsigned idx, ObjCProtocolDecl *OID) { assert(idx < NumReferencedProtocols && "index out of range"); ReferencedProtocols[idx] = OID; @@ -625,7 +634,7 @@ class ObjCCategoryDecl : public NamedDecl { SourceLocation EndLoc; // marks the '>' or identifier. SourceLocation AtEndLoc; // marks the end of the entire interface. -public: + ObjCCategoryDecl(SourceLocation L, unsigned numRefProtocol,IdentifierInfo *Id) : NamedDecl(ObjCCategory, L, Id), ClassInterface(0), ReferencedProtocols(0), NumReferencedProtocols(0), @@ -639,7 +648,12 @@ public: NumReferencedProtocols = numRefProtocol; } } +public: + + static ObjCCategoryDecl *Create(ASTContext &C, SourceLocation L, + unsigned numRefProtocol, IdentifierInfo *Id); + ObjCInterfaceDecl *getClassInterface() const { return ClassInterface; } void setClassInterface(ObjCInterfaceDecl *IDecl) { ClassInterface = IDecl; } diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index 62336b67bd..2ec9395644 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -54,6 +54,26 @@ ObjCProtocolDecl *ObjCProtocolDecl::Create(ASTContext &C, SourceLocation L, return new (Mem) ObjCProtocolDecl(L, numRefProtos, Id); } +ObjCClassDecl *ObjCClassDecl::Create(ASTContext &C, SourceLocation L, + ObjCInterfaceDecl **Elts, unsigned nElts) { + void *Mem = C.getAllocator().Allocate(); + return new (Mem) ObjCClassDecl(L, Elts, nElts); +} + +ObjCForwardProtocolDecl * +ObjCForwardProtocolDecl::Create(ASTContext &C, SourceLocation L, + ObjCProtocolDecl **Elts, unsigned NumElts) { + void *Mem = C.getAllocator().Allocate(); + return new (Mem) ObjCForwardProtocolDecl(L, Elts, NumElts); +} + +ObjCCategoryDecl *ObjCCategoryDecl::Create(ASTContext &C, SourceLocation L, + unsigned numRefProtocol, + IdentifierInfo *Id) { + void *Mem = C.getAllocator().Allocate(); + return new (Mem) ObjCCategoryDecl(L, numRefProtocol, Id); +} + //===----------------------------------------------------------------------===// // Objective-C Decl Implementation diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 28a92c7ba2..7bdfd9e014 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -268,8 +268,8 @@ Sema::ActOnForwardProtocolDeclaration(SourceLocation AtProtocolLoc, Protocols.push_back(PDecl); } - return new ObjCForwardProtocolDecl(AtProtocolLoc, - &Protocols[0], Protocols.size()); + return ObjCForwardProtocolDecl::Create(Context, AtProtocolLoc, + &Protocols[0], Protocols.size()); } Sema::DeclTy *Sema::ActOnStartCategoryInterface( @@ -280,8 +280,9 @@ Sema::DeclTy *Sema::ActOnStartCategoryInterface( SourceLocation EndProtoLoc) { ObjCInterfaceDecl *IDecl = getObjCInterfaceDecl(ClassName); - ObjCCategoryDecl *CDecl = new ObjCCategoryDecl(AtInterfaceLoc, NumProtoRefs, - CategoryName); + ObjCCategoryDecl *CDecl = + ObjCCategoryDecl::Create(Context, AtInterfaceLoc, NumProtoRefs, + CategoryName); CDecl->setClassInterface(IDecl); /// Check that class of this category is already completely declared. @@ -605,7 +606,8 @@ Sema::ActOnForwardClassDeclaration(SourceLocation AtClassLoc, Interfaces.push_back(IDecl); } - return new ObjCClassDecl(AtClassLoc, &Interfaces[0], Interfaces.size()); + return ObjCClassDecl::Create(Context, AtClassLoc, + &Interfaces[0], Interfaces.size()); }