From: Chris Lattner Date: Sun, 16 Mar 2008 20:53:07 +0000 (+0000) Subject: add two more Create methods. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=75c9cae5f85c72cbb1649e93849e16ede3f07522;p=clang add two more Create methods. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48428 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 35bc0146d0..048661cdf8 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -729,10 +729,14 @@ class ObjCCategoryImplDecl : public NamedDecl { llvm::SmallVector ClassMethods; SourceLocation EndLoc; -public: + ObjCCategoryImplDecl(SourceLocation L, IdentifierInfo *Id, ObjCInterfaceDecl *classInterface) : NamedDecl(ObjCCategoryImpl, L, Id), ClassInterface(classInterface) {} +public: + static ObjCCategoryImplDecl *Create(ASTContext &C, SourceLocation L, + IdentifierInfo *Id, + ObjCInterfaceDecl *classInterface); ObjCInterfaceDecl *getClassInterface() const { return ClassInterface; } @@ -804,13 +808,19 @@ class ObjCImplementationDecl : public NamedDecl { llvm::SmallVector ClassMethods; SourceLocation EndLoc; -public: + ObjCImplementationDecl(SourceLocation L, IdentifierInfo *Id, ObjCInterfaceDecl *classInterface, ObjCInterfaceDecl *superDecl) : NamedDecl(ObjCImplementation, L, Id), ClassInterface(classInterface), SuperClass(superDecl), Ivars(0), NumIvars(-1) {} +public: + static ObjCImplementationDecl *Create(ASTContext &C, SourceLocation L, + IdentifierInfo *Id, + ObjCInterfaceDecl *classInterface, + ObjCInterfaceDecl *superDecl); + void ObjCAddInstanceVariablesToClassImpl(ObjCIvarDecl **ivars, unsigned numIvars); diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index cd4c6fff9f..4f1671ef07 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -73,6 +73,21 @@ ObjCCategoryDecl *ObjCCategoryDecl::Create(ASTContext &C, SourceLocation L, return new (Mem) ObjCCategoryDecl(L, Id); } +ObjCCategoryImplDecl * +ObjCCategoryImplDecl::Create(ASTContext &C, SourceLocation L,IdentifierInfo *Id, + ObjCInterfaceDecl *ClassInterface) { + void *Mem = C.getAllocator().Allocate(); + return new (Mem) ObjCCategoryImplDecl(L, Id, ClassInterface); +} + +ObjCImplementationDecl * +ObjCImplementationDecl::Create(ASTContext &C, SourceLocation L, + IdentifierInfo *Id, + ObjCInterfaceDecl *ClassInterface, + ObjCInterfaceDecl *SuperDecl) { + void *Mem = C.getAllocator().Allocate(); + return new (Mem) ObjCImplementationDecl(L, Id, ClassInterface, SuperDecl); +} //===----------------------------------------------------------------------===// // Objective-C Decl Implementation diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index e07d3c59e6..f9da77ff2c 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -330,8 +330,8 @@ Sema::DeclTy *Sema::ActOnStartCategoryImplementation( IdentifierInfo *ClassName, SourceLocation ClassLoc, IdentifierInfo *CatName, SourceLocation CatLoc) { ObjCInterfaceDecl *IDecl = getObjCInterfaceDecl(ClassName); - ObjCCategoryImplDecl *CDecl = new ObjCCategoryImplDecl(AtCatImplLoc, - CatName, IDecl); + ObjCCategoryImplDecl *CDecl = + ObjCCategoryImplDecl::Create(Context, AtCatImplLoc, CatName, IDecl); /// Check that class of this category is already completely declared. if (!IDecl || IDecl->isForwardDecl()) Diag(ClassLoc, diag::err_undef_interface, ClassName->getName()); @@ -401,10 +401,12 @@ Sema::DeclTy *Sema::ActOnStartClassImplementation( } ObjCImplementationDecl* IMPDecl = - new ObjCImplementationDecl(AtClassImplLoc, ClassName, IDecl, SDecl); + ObjCImplementationDecl::Create(Context, AtClassImplLoc, ClassName, + IDecl, SDecl); // Check that there is no duplicate implementation of this class. if (ObjCImplementations[ClassName]) + // FIXME: Don't leak everything! Diag(ClassLoc, diag::err_dup_implementation_class, ClassName->getName()); else // add it to the list. ObjCImplementations[ClassName] = IMPDecl;