From 2acb5adac95e5e5d8dbbd88f6312ad8bd4a46367 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Thu, 30 Apr 2009 19:18:03 +0000 Subject: Allow attributes 'objc_ownership_retain' and 'objc_ownership_release' to be applied to ObjCMethodDecls, not just parameters. This allows one to specific side-effects on the receiver of a message expression. No checker support yet. llvm-svn: 70505 --- clang/lib/Sema/SemaDeclAttr.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'clang/lib/Sema') diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index 4853028ba36..1e3a7e58bb1 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -1559,10 +1559,10 @@ static void HandleObjCOwnershipReturnsAttr(Decl *d, const AttributeList &Attr, d->addAttr(::new (S.Context) ObjCOwnershipReturnsAttr()); } -static void HandleObjCOwnershipParmAttr(Decl *d, const AttributeList &Attr, - Sema &S) { +static void HandleObjCOwnershipAttr(Decl *d, const AttributeList &Attr, + Sema &S, bool attachToMethodDecl = false) { - if (!isa(d)) { + if (!isa(d) && (!attachToMethodDecl || !isa(d))){ const char *name; switch (Attr.getKind()) { @@ -1582,7 +1582,8 @@ static void HandleObjCOwnershipParmAttr(Decl *d, const AttributeList &Attr, }; S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type) << name - << 4 /* parameter */; + << (attachToMethodDecl ? 5 /* parameter or method decl */ + : 4 /* parameter */); return; } @@ -1643,10 +1644,11 @@ static void ProcessDeclAttribute(Decl *D, const AttributeList &Attr, Sema &S) { // Checker-specific. case AttributeList::AT_objc_ownership_cfrelease: case AttributeList::AT_objc_ownership_cfretain: + HandleObjCOwnershipAttr(D, Attr, S); break; case AttributeList::AT_objc_ownership_make_collectable: case AttributeList::AT_objc_ownership_release: case AttributeList::AT_objc_ownership_retain: - HandleObjCOwnershipParmAttr(D, Attr, S); break; + HandleObjCOwnershipAttr(D, Attr, S, true); break; case AttributeList::AT_objc_ownership_returns: HandleObjCOwnershipReturnsAttr(D, Attr, S); break; -- cgit v1.2.3