From 73a73f52fdb7417f17a40077137a2880be0f438d Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Wed, 20 Aug 2008 18:02:42 +0000 Subject: [PATCH] Fix attributes on Obj-C interfaces & methods. - Drop MethodAttrs parameter to ObjCMethodDecl - Call ProcessDeclAttributeList for interface & method decls. llvm-svn: 55068 --- clang/include/clang/AST/DeclObjC.h | 9 +++------ clang/lib/AST/DeclObjC.cpp | 7 +++---- clang/lib/Sema/SemaDeclObjC.cpp | 11 +++++++++-- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/clang/include/clang/AST/DeclObjC.h b/clang/include/clang/AST/DeclObjC.h index f4efbc052bdb..688f18caf338 100644 --- a/clang/include/clang/AST/DeclObjC.h +++ b/clang/include/clang/AST/DeclObjC.h @@ -126,8 +126,6 @@ private: unsigned NumMethodParams; /// List of attributes for this method declaration. - AttributeList *MethodAttrs; - SourceLocation EndLoc; // the location of the ';' or '{'. // The following are only used for method definitions, null otherwise. @@ -140,7 +138,7 @@ private: ObjCMethodDecl(SourceLocation beginLoc, SourceLocation endLoc, Selector SelInfo, QualType T, Decl *contextDecl, - AttributeList *M = 0, bool isInstance = true, + bool isInstance = true, bool isVariadic = false, bool isSynthesized = false, ImplementationControl impControl = None) @@ -151,7 +149,7 @@ private: DeclImplementation(impControl), objcDeclQualifier(OBJC_TQ_None), MethodContext(static_cast(contextDecl)), SelName(SelInfo), MethodDeclType(T), - ParamInfo(0), NumMethodParams(0), MethodAttrs(M), + ParamInfo(0), NumMethodParams(0), EndLoc(endLoc), Body(0), SelfDecl(0), CmdDecl(0) {} virtual ~ObjCMethodDecl(); @@ -165,7 +163,7 @@ public: SourceLocation beginLoc, SourceLocation endLoc, Selector SelInfo, QualType T, Decl *contextDecl, - AttributeList *M = 0, bool isInstance = true, + bool isInstance = true, bool isVariadic = false, bool isSynthesized = false, ImplementationControl impControl = None); @@ -214,7 +212,6 @@ public: ImplicitParamDecl * getCmdDecl() const { return CmdDecl; } void setCmdDecl(ImplicitParamDecl *decl) { CmdDecl = decl; } - AttributeList *getMethodAttrs() const {return MethodAttrs;} bool isInstance() const { return IsInstance; } bool isVariadic() const { return IsVariadic; } diff --git a/clang/lib/AST/DeclObjC.cpp b/clang/lib/AST/DeclObjC.cpp index bd8b874735fc..0d921e3c0e85 100644 --- a/clang/lib/AST/DeclObjC.cpp +++ b/clang/lib/AST/DeclObjC.cpp @@ -25,20 +25,19 @@ ObjCMethodDecl *ObjCMethodDecl::Create(ASTContext &C, SourceLocation endLoc, Selector SelInfo, QualType T, Decl *contextDecl, - AttributeList *M, bool isInstance, + bool isInstance, bool isVariadic, bool isSynthesized, ImplementationControl impControl) { void *Mem = C.getAllocator().Allocate(); return new (Mem) ObjCMethodDecl(beginLoc, endLoc, SelInfo, T, contextDecl, - M, isInstance, + isInstance, isVariadic, isSynthesized, impControl); } ObjCMethodDecl::~ObjCMethodDecl() { delete [] ParamInfo; - //delete [] MethodAttrs; // FIXME: Also destroy the stored Expr*. } void ObjCMethodDecl::Destroy(ASTContext& C) { @@ -401,7 +400,7 @@ void ObjCInterfaceDecl::addPropertyMethods( ObjCMethodDecl::Create(Context, property->getLocation(), property->getLocation(), property->getGetterName(), resultDeclType, - this, 0, + this, true, false, true, ObjCMethodDecl::Required); property->setGetterMethodDecl(ObjCMethod); insMethods.push_back(ObjCMethod); diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index 28768fc56b26..872156ee2575 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -98,8 +98,10 @@ ActOnStartClassInterface(SourceLocation AtInterfaceLoc, IDecl->setForwardDecl(false); } } else { - IDecl = ObjCInterfaceDecl::Create(Context, AtInterfaceLoc, + IDecl = ObjCInterfaceDecl::Create(Context, AtInterfaceLoc, ClassName, ClassLoc); + if (AttrList) + ProcessDeclAttributeList(IDecl, AttrList); ObjCInterfaceDecls[ClassName] = IDecl; // Remember that this needs to be removed when the scope is popped. @@ -491,6 +493,9 @@ Sema::DeclTy *Sema::ActOnStartClassImplementation( if (!IDecl) { // Legacy case of @implementation with no corresponding @interface. // Build, chain & install the interface decl into the identifier. + + // FIXME: Do we support attributes on the @implementation? If so + // we should copy them over. IDecl = ObjCInterfaceDecl::Create(Context, AtClassImplLoc, ClassName, ClassLoc, false, true); ObjCInterfaceDecls[ClassName] = IDecl; @@ -960,12 +965,14 @@ Sema::DeclTy *Sema::ActOnMethodDeclaration( ObjCMethodDecl* ObjCMethod = ObjCMethodDecl::Create(Context, MethodLoc, EndLoc, Sel, resultDeclType, - ClassDecl, AttrList, + ClassDecl, MethodType == tok::minus, isVariadic, false, MethodDeclKind == tok::objc_optional ? ObjCMethodDecl::Optional : ObjCMethodDecl::Required); + if (AttrList) + ProcessDeclAttributeList(ObjCMethod, AttrList); llvm::SmallVector Params;