From 1c6a3cc88177c67498fccdf14cfdf09959214e41 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Mon, 4 May 2009 17:04:30 +0000 Subject: [PATCH] Remove support for ObjCMethodDecl attributes that appear between the return type and the selector. This is inconsistent with C functions (where such attributes would be placed on the return type, not the the FunctionDecl), and is inconsistent with what people are use to seeing. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70878 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Parse/Action.h | 1 - lib/Parse/ParseObjc.cpp | 13 +++---------- lib/Sema/Sema.h | 4 ---- lib/Sema/SemaDeclAttr.cpp | 34 ---------------------------------- lib/Sema/SemaDeclObjC.cpp | 4 ---- test/Analysis/retain-release.m | 6 +----- 6 files changed, 4 insertions(+), 58 deletions(-) diff --git a/include/clang/Parse/Action.h b/include/clang/Parse/Action.h index 60cc7cf154..fdd2b2abac 100644 --- a/include/clang/Parse/Action.h +++ b/include/clang/Parse/Action.h @@ -1439,7 +1439,6 @@ public: Selector Sel, // a unique name for the method. ObjCArgInfo *ArgInfo, // ArgInfo: Has 'Sel.getNumArgs()' entries. llvm::SmallVectorImpl &Cdecls, // c-style args - AttributeList *ReturnAttrList, // optional AttributeList *MethodAttrList, // optional // tok::objc_not_keyword, tok::objc_optional, tok::objc_required tok::ObjCKeywordKind impKind, diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp index 2e0df826bb..6c42f429cc 100644 --- a/lib/Parse/ParseObjc.cpp +++ b/lib/Parse/ParseObjc.cpp @@ -677,12 +677,6 @@ Parser::DeclPtrTy Parser::ParseObjCMethodDecl(SourceLocation mLoc, if (Tok.is(tok::l_paren)) ReturnType = ParseObjCTypeName(DSRet); - // Parse attributes that can appear before the selector. - AttributeList *ReturnAttrs = 0; - - if (getLang().ObjC2 && Tok.is(tok::kw___attribute)) - ReturnAttrs = ParseAttributes(); - SourceLocation selLoc; IdentifierInfo *SelIdent = ParseObjCSelectorPiece(selLoc); @@ -705,8 +699,8 @@ Parser::DeclPtrTy Parser::ParseObjCMethodDecl(SourceLocation mLoc, Selector Sel = PP.getSelectorTable().getNullarySelector(SelIdent); return Actions.ActOnMethodDeclaration(mLoc, Tok.getLocation(), mType, IDecl, DSRet, ReturnType, Sel, - 0, CargNames, ReturnAttrs, - MethodAttrs, MethodImplKind); + 0, CargNames, MethodAttrs, + MethodImplKind); } llvm::SmallVector KeyIdents; @@ -779,8 +773,7 @@ Parser::DeclPtrTy Parser::ParseObjCMethodDecl(SourceLocation mLoc, &KeyIdents[0]); return Actions.ActOnMethodDeclaration(mLoc, Tok.getLocation(), mType, IDecl, DSRet, ReturnType, Sel, - &ArgInfos[0], CargNames, ReturnAttrs, - MethodAttrs, + &ArgInfos[0], CargNames, MethodAttrs, MethodImplKind, isVariadic); } diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index 1c652114e3..3ca00ca143 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -1098,9 +1098,6 @@ public: // Decl attributes - this routine is the top level dispatcher. void ProcessDeclAttributes(Decl *D, const Declarator &PD); void ProcessDeclAttributeList(Decl *D, const AttributeList *AttrList); - - void ProcessObjCMethDeclReturnAttributeList(ObjCMethodDecl *D, - const AttributeList *AttrList); void WarnUndefinedMethod(SourceLocation ImpLoc, ObjCMethodDecl *method, bool &IncompleteImpl); @@ -2227,7 +2224,6 @@ public: // from the Sel.getNumArgs(). ObjCArgInfo *ArgInfo, llvm::SmallVectorImpl &Cdecls, - AttributeList *ReturnAttrList, AttributeList *AttrList, tok::ObjCKeywordKind MethodImplKind, bool isVariadic = false); diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index 1e3a7e58bb..68d682ddab 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -1719,37 +1719,3 @@ void Sema::ProcessDeclAttributes(Decl *D, const Declarator &PD) { if (const AttributeList *Attrs = PD.getAttributes()) ProcessDeclAttributeList(D, Attrs); } - - -/// ProcessObjCMethDeclReturnAttribute - Apply the specific attribute to the -/// specified ObjCMethodDecl. This is a separate codepath because it -/// corresponds to attributes applied essentially to the return type of -/// an Objective-C method declaration (as opposed to attributes that hang off -/// the end of the method declaration). -static void ProcessObjCMethDeclReturnAttribute(Decl *D, - const AttributeList &Attr, - Sema &S) { - switch (Attr.getKind()) { - // Checker-specific. - case AttributeList::AT_objc_ownership_returns: - HandleObjCOwnershipReturnsAttr(D, Attr, S); break; - break; - default: - S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName(); - break; - } -} - -/// ProcessObjCMethDeclAttributeList - Apply all the decl attributes in the -/// specified attribute list to the specified ObjCMethodDecl. This is -/// a separate codepath because it corresponds to attributes applied -/// essentiallyto the return type of an Objective-C method declaration -/// (as opposed to attributes that hang off the end of the method declaration). -void Sema::ProcessObjCMethDeclReturnAttributeList(ObjCMethodDecl *D, - const AttributeList *AttrList) -{ - while (AttrList) { - ProcessObjCMethDeclReturnAttribute(D, *AttrList, *this); - AttrList = AttrList->getNext(); - } -} diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 80b30bdb74..0e655a493d 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -1557,7 +1557,6 @@ Sema::DeclPtrTy Sema::ActOnMethodDeclaration( // from the Sel.getNumArgs(). ObjCArgInfo *ArgInfo, llvm::SmallVectorImpl &Cdecls, - AttributeList *ReturnAttrList, AttributeList *AttrList, tok::ObjCKeywordKind MethodDeclKind, bool isVariadic) { Decl *ClassDecl = classDecl.getAs(); @@ -1640,9 +1639,6 @@ Sema::DeclPtrTy Sema::ActOnMethodDeclaration( if (AttrList) ProcessDeclAttributeList(ObjCMethod, AttrList); - if (ReturnAttrList) - ProcessObjCMethDeclReturnAttributeList(ObjCMethod, ReturnAttrList); - // For implementations (which can be very "coarse grain"), we add the // method now. This allows the AST to implement lookup methods that work // incrementally (without waiting until we parse the @end). It also allows diff --git a/test/Analysis/retain-release.m b/test/Analysis/retain-release.m index c01da9cabb..93d461329b 100644 --- a/test/Analysis/retain-release.m +++ b/test/Analysis/retain-release.m @@ -431,11 +431,7 @@ void rdar6704930(unsigned char *s, unsigned int length) { //===----------------------------------------------------------------------===// @interface TestOwnershipAttr : NSObject -- (NSString*) __attribute__((objc_ownership_returns)) returnsAnOwnedString; -// Soon we won't accept __attribute__((objc_ownership_returns)) at the end -// of a method decl. -- (NSString*) returnsAnOwnedString2 __attribute__((objc_ownership_returns)); - +- (NSString*) returnsAnOwnedString __attribute__((objc_ownership_returns)); - (void) myRetain:(id)__attribute__((objc_ownership_retain))obj; - (void) myCFRetain:(id)__attribute__((objc_ownership_cfretain))obj; - (void) myRelease:(id)__attribute__((objc_ownership_release))obj; -- 2.40.0