From: Chris Lattner Date: Sun, 16 Mar 2008 21:17:37 +0000 (+0000) Subject: add the last two Create methods for decls, woo! X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f8d17a59167d9c2026506ed8813ea434d93b662a;p=clang add the last two Create methods for decls, woo! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48432 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 066e6cd430..03fa99abbb 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -876,13 +876,16 @@ class ObjCCompatibleAliasDecl : public ScopedDecl { /// Class that this is an alias of. ObjCInterfaceDecl *AliasedClass; -public: ObjCCompatibleAliasDecl(SourceLocation L, IdentifierInfo *Id, ObjCInterfaceDecl* aliasedClass) - : ScopedDecl(CompatibleAlias, L, Id, 0), - AliasedClass(aliasedClass) {} - - ObjCInterfaceDecl *getClassInterface() const { return AliasedClass; } + : ScopedDecl(CompatibleAlias, L, Id, 0), AliasedClass(aliasedClass) {} +public: + static ObjCCompatibleAliasDecl *Create(ASTContext &C, SourceLocation L, + IdentifierInfo *Id, + ObjCInterfaceDecl* aliasedClass); + + const ObjCInterfaceDecl *getClassInterface() const { return AliasedClass; } + ObjCInterfaceDecl *getClassInterface() { return AliasedClass; } static bool classof(const Decl *D) { return D->getKind() == CompatibleAlias; @@ -914,11 +917,11 @@ private: IdentifierInfo *GetterName; // getter name of NULL if no getter IdentifierInfo *SetterName; // setter name of NULL if no setter -public: ObjCPropertyDecl(SourceLocation L) - : Decl(PropertyDecl, L), - PropertyDecls(0), NumPropertyDecls(-1), PropertyAttributes(OBJC_PR_noattr), - GetterName(0), SetterName(0) {} + : Decl(PropertyDecl, L), PropertyDecls(0), NumPropertyDecls(-1), + PropertyAttributes(OBJC_PR_noattr), GetterName(0), SetterName(0) {} +public: + static ObjCPropertyDecl *Create(ASTContext &C, SourceLocation L); ObjCIvarDecl **const getPropertyDecls() const { return PropertyDecls; } void setPropertyDecls(ObjCIvarDecl **property) { PropertyDecls = property; } diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index 4f1671ef07..dcb53e8c42 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -89,6 +89,19 @@ ObjCImplementationDecl::Create(ASTContext &C, SourceLocation L, return new (Mem) ObjCImplementationDecl(L, Id, ClassInterface, SuperDecl); } +ObjCCompatibleAliasDecl * +ObjCCompatibleAliasDecl::Create(ASTContext &C, SourceLocation L, + IdentifierInfo *Id, + ObjCInterfaceDecl* AliasedClass) { + void *Mem = C.getAllocator().Allocate(); + return new (Mem) ObjCCompatibleAliasDecl(L, Id, AliasedClass); +} + +ObjCPropertyDecl *ObjCPropertyDecl::Create(ASTContext &C, SourceLocation L) { + void *Mem = C.getAllocator().Allocate(); + return new (Mem) ObjCPropertyDecl(L); +} + //===----------------------------------------------------------------------===// // Objective-C Decl Implementation //===----------------------------------------------------------------------===// diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index f9da77ff2c..121004db99 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -172,20 +172,20 @@ Sema::DeclTy *Sema::ActOnCompatiblityAlias( return 0; } // Check for class declaration - ScopedDecl *CDecl = LookupScopedDecl(ClassName, Decl::IDNS_Ordinary, - ClassLocation, TUScope); - if (!CDecl || !isa(CDecl)) { - Diag(ClassLocation, diag::warn_undef_interface, - ClassName->getName()); - if (CDecl) - Diag(CDecl->getLocation(), diag::warn_previous_declaration); + ScopedDecl *CDeclU = LookupScopedDecl(ClassName, Decl::IDNS_Ordinary, + ClassLocation, TUScope); + ObjCInterfaceDecl *CDecl = dyn_cast_or_null(CDeclU); + if (CDecl == 0) { + Diag(ClassLocation, diag::warn_undef_interface, ClassName->getName()); + if (CDeclU) + Diag(CDeclU->getLocation(), diag::warn_previous_declaration); return 0; } - // Everything checked out, instantiate a new alias declaration ast + + // Everything checked out, instantiate a new alias declaration AST. ObjCCompatibleAliasDecl *AliasDecl = - new ObjCCompatibleAliasDecl(AtCompatibilityAliasLoc, - AliasName, - dyn_cast(CDecl)); + ObjCCompatibleAliasDecl::Create(Context, AtCompatibilityAliasLoc, + AliasName, CDecl); // Chain & install the interface decl into the identifier. AliasDecl->setNext(AliasName->getFETokenInfo()); @@ -699,17 +699,19 @@ void Sema::ActOnAtEnd(SourceLocation AtEndLoc, DeclTy *classDecl, llvm::DenseMap ClsMap; bool isInterfaceDeclKind = - (isa(ClassDecl) || isa(ClassDecl) - || isa(ClassDecl)); + isa(ClassDecl) || isa(ClassDecl) + || isa(ClassDecl); bool checkIdenticalMethods = isa(ClassDecl); // TODO: property declaration in category and protocols. - if (pNum != 0 && isa(ClassDecl)) { - ObjCPropertyDecl **properties = new ObjCPropertyDecl*[pNum]; - memcpy(properties, allProperties, pNum*sizeof(ObjCPropertyDecl*)); - dyn_cast(ClassDecl)->setPropertyDecls(properties); - dyn_cast(ClassDecl)->setNumPropertyDecl(pNum); - } + if (pNum != 0) + if (ObjCInterfaceDecl *IDecl = dyn_cast(ClassDecl)) { + // FIXME: Move the memory allocation into setPropertyDecls! + ObjCPropertyDecl **properties = new ObjCPropertyDecl*[pNum]; + memcpy(properties, allProperties, pNum*sizeof(ObjCPropertyDecl*)); + IDecl->setPropertyDecls(properties); + IDecl->setNumPropertyDecl(pNum); + } for (unsigned i = 0; i < allNum; i++ ) { ObjCMethodDecl *Method = @@ -897,7 +899,7 @@ Sema::DeclTy *Sema::ActOnMethodDeclaration( Sema::DeclTy *Sema::ActOnAddObjCProperties(SourceLocation AtLoc, DeclTy **allProperties, unsigned NumProperties, ObjCDeclSpec &DS) { - ObjCPropertyDecl *PDecl = new ObjCPropertyDecl(AtLoc); + ObjCPropertyDecl *PDecl = ObjCPropertyDecl::Create(Context, AtLoc); if(DS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_readonly) PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_readonly);