diff options
author | Daniel Dunbar <daniel@zuster.org> | 2008-08-20 18:02:42 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2008-08-20 18:02:42 +0000 |
commit | f6414927e67e27d9324d8d179c5f7ea620443924 (patch) | |
tree | c19cf1617d0e9ecc8855d13503ab6b1a1e326598 | |
parent | 1536839607e42fdb7133b7830a1ff84b378c509b (diff) |
Fix attributes on Obj-C interfaces & methods.
- Drop MethodAttrs parameter to ObjCMethodDecl
- Call ProcessDeclAttributeList for interface & method decls.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55068 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/AST/DeclObjC.h | 9 | ||||
-rw-r--r-- | lib/AST/DeclObjC.cpp | 7 | ||||
-rw-r--r-- | lib/Sema/SemaDeclObjC.cpp | 11 |
3 files changed, 15 insertions, 12 deletions
diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index f4efbc052b..688f18caf3 100644 --- a/include/clang/AST/DeclObjC.h +++ b/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<NamedDecl*>(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/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index bd8b874735..0d921e3c0e 100644 --- a/lib/AST/DeclObjC.cpp +++ b/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<ObjCMethodDecl>(); 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/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 28768fc56b..872156ee25 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/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<ParmVarDecl*, 16> Params; |