[cfe-commits] r70336 - in /cfe/trunk: include/clang/AST/Attr.h include/clang/Parse/AttributeList.h lib/Analysis/CFRefCount.cpp lib/Frontend/PCHReaderDecl.cpp lib/Frontend/PCHWriter.cpp lib/Parse/AttributeList.cpp lib/Sema/SemaDeclAttr.cpp test/Analysis/retain-release-gc-only.m
Ted Kremenek
kremenek at apple.com
Tue Apr 28 15:32:28 PDT 2009
Author: kremenek
Date: Tue Apr 28 17:32:26 2009
New Revision: 70336
URL: http://llvm.org/viewvc/llvm-project?rev=70336&view=rev
Log:
Implement ownership attribute 'objc_ownership_make_collectable'. This allows one
to add 'CFMakeCollectable' semantics to a method.
Modified:
cfe/trunk/include/clang/AST/Attr.h
cfe/trunk/include/clang/Parse/AttributeList.h
cfe/trunk/lib/Analysis/CFRefCount.cpp
cfe/trunk/lib/Frontend/PCHReaderDecl.cpp
cfe/trunk/lib/Frontend/PCHWriter.cpp
cfe/trunk/lib/Parse/AttributeList.cpp
cfe/trunk/lib/Sema/SemaDeclAttr.cpp
cfe/trunk/test/Analysis/retain-release-gc-only.m
Modified: cfe/trunk/include/clang/AST/Attr.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Attr.h?rev=70336&r1=70335&r2=70336&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/Attr.h (original)
+++ cfe/trunk/include/clang/AST/Attr.h Tue Apr 28 17:32:26 2009
@@ -59,11 +59,12 @@
NonNull,
ObjCException,
ObjCNSObject,
- ObjCOwnershipCFRelease, // Clang/Checker-specific.
- ObjCOwnershipCFRetain, // Clang/Checker-specific.
- ObjCOwnershipRelease, // Clang/Checker-specific.
- ObjCOwnershipRetain, // Clang/Checker-specific.
- ObjCOwnershipReturns, // Clang/Checker-specific.
+ ObjCOwnershipCFRelease, // Clang/Checker-specific.
+ ObjCOwnershipCFRetain, // Clang/Checker-specific.
+ ObjCOwnershipMakeCollectable, // Clang/Checker-specific.
+ ObjCOwnershipRelease, // Clang/Checker-specific.
+ ObjCOwnershipRetain, // Clang/Checker-specific.
+ ObjCOwnershipReturns, // Clang/Checker-specific.
Overloadable, // Clang-specific
Packed,
Pure,
@@ -467,6 +468,7 @@
DEF_SIMPLE_ATTR(ObjCOwnershipRelease);
DEF_SIMPLE_ATTR(ObjCOwnershipCFRetain);
DEF_SIMPLE_ATTR(ObjCOwnershipRetain);
+DEF_SIMPLE_ATTR(ObjCOwnershipMakeCollectable);
DEF_SIMPLE_ATTR(ObjCOwnershipReturns);
#undef DEF_SIMPLE_ATTR
Modified: cfe/trunk/include/clang/Parse/AttributeList.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/AttributeList.h?rev=70336&r1=70335&r2=70336&view=diff
==============================================================================
--- cfe/trunk/include/clang/Parse/AttributeList.h (original)
+++ cfe/trunk/include/clang/Parse/AttributeList.h Tue Apr 28 17:32:26 2009
@@ -76,11 +76,12 @@
AT_nothrow,
AT_nsobject,
AT_objc_exception,
- AT_objc_ownership_cfrelease, // Clang-specific.
- AT_objc_ownership_cfretain, // Clang-specific.
- AT_objc_ownership_release, // Clang-specific.
- AT_objc_ownership_retain, // Clang-specific.
- AT_objc_ownership_returns, // Clang-specific.
+ AT_objc_ownership_cfrelease, // Clang-specific.
+ AT_objc_ownership_cfretain, // Clang-specific.
+ AT_objc_ownership_make_collectable, // Clang-specific.
+ AT_objc_ownership_release, // Clang-specific.
+ AT_objc_ownership_retain, // Clang-specific.
+ AT_objc_ownership_returns, // Clang-specific.
AT_objc_gc,
AT_overloadable, // Clang-specific.
AT_packed,
Modified: cfe/trunk/lib/Analysis/CFRefCount.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFRefCount.cpp?rev=70336&r1=70335&r2=70336&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/CFRefCount.cpp (original)
+++ cfe/trunk/lib/Analysis/CFRefCount.cpp Tue Apr 28 17:32:26 2009
@@ -1121,6 +1121,10 @@
ScratchArgs.push_back(std::make_pair(i, DecRef));
hasArgEffect = true;
}
+ else if ((*I)->getAttr<ObjCOwnershipMakeCollectableAttr>()) {
+ ScratchArgs.push_back(std::make_pair(i, MakeCollectable));
+ hasArgEffect = true;
+ }
}
if (!hasRetEffect && !hasArgEffect)
Modified: cfe/trunk/lib/Frontend/PCHReaderDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PCHReaderDecl.cpp?rev=70336&r1=70335&r2=70336&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/PCHReaderDecl.cpp (original)
+++ cfe/trunk/lib/Frontend/PCHReaderDecl.cpp Tue Apr 28 17:32:26 2009
@@ -476,8 +476,9 @@
SIMPLE_ATTR(ObjCException);
SIMPLE_ATTR(ObjCNSObject);
SIMPLE_ATTR(ObjCOwnershipCFRelease);
- SIMPLE_ATTR(ObjCOwnershipRelease);
SIMPLE_ATTR(ObjCOwnershipCFRetain);
+ SIMPLE_ATTR(ObjCOwnershipMakeCollectable);
+ SIMPLE_ATTR(ObjCOwnershipRelease);
SIMPLE_ATTR(ObjCOwnershipRetain);
SIMPLE_ATTR(ObjCOwnershipReturns);
SIMPLE_ATTR(Overloadable);
Modified: cfe/trunk/lib/Frontend/PCHWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PCHWriter.cpp?rev=70336&r1=70335&r2=70336&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/PCHWriter.cpp (original)
+++ cfe/trunk/lib/Frontend/PCHWriter.cpp Tue Apr 28 17:32:26 2009
@@ -1545,8 +1545,9 @@
case Attr::ObjCException:
case Attr::ObjCNSObject:
case Attr::ObjCOwnershipCFRelease:
- case Attr::ObjCOwnershipRelease:
case Attr::ObjCOwnershipCFRetain:
+ case Attr::ObjCOwnershipMakeCollectable:
+ case Attr::ObjCOwnershipRelease:
case Attr::ObjCOwnershipRetain:
case Attr::ObjCOwnershipReturns:
case Attr::Overloadable:
Modified: cfe/trunk/lib/Parse/AttributeList.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/AttributeList.cpp?rev=70336&r1=70335&r2=70336&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/AttributeList.cpp (original)
+++ cfe/trunk/lib/Parse/AttributeList.cpp Tue Apr 28 17:32:26 2009
@@ -152,6 +152,10 @@
case 24:
if (!memcmp(Str, "objc_ownership_cfrelease", 24))
return AT_objc_ownership_cfrelease;
+ break;
+ case 31:
+ if (!memcmp(Str, "objc_ownership_make_collectable", 31))
+ return AT_objc_ownership_make_collectable;
break;
}
return UnknownAttribute;
Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=70336&r1=70335&r2=70336&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Tue Apr 28 17:32:26 2009
@@ -1539,14 +1539,16 @@
default:
assert(0 && "invalid ownership attribute");
return;
+ case AttributeList::AT_objc_ownership_cfrelease:
+ name = "objc_ownership_cfrelease"; break;
+ case AttributeList::AT_objc_ownership_cfretain:
+ name = "objc_ownership_cfretain"; break;
+ case AttributeList::AT_objc_ownership_make_collectable:
+ name = "objc_ownership_make_collectable"; break;
case AttributeList::AT_objc_ownership_release:
name = "objc_ownership_release"; break;
- case AttributeList::AT_objc_ownership_cfrelease:
- name = "objc_ownership_cfrelease"; break;
case AttributeList::AT_objc_ownership_retain:
name = "objc_ownership_retain"; break;
- case AttributeList::AT_objc_ownership_cfretain:
- name = "objc_ownership_cfretain"; break;
};
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type) << name
@@ -1558,14 +1560,16 @@
default:
assert(0 && "invalid ownership attribute");
return;
- case AttributeList::AT_objc_ownership_release:
- d->addAttr(::new (S.Context) ObjCOwnershipReleaseAttr()); return;
case AttributeList::AT_objc_ownership_cfrelease:
d->addAttr(::new (S.Context) ObjCOwnershipCFReleaseAttr()); return;
- case AttributeList::AT_objc_ownership_retain:
- d->addAttr(::new (S.Context) ObjCOwnershipRetainAttr()); return;
case AttributeList::AT_objc_ownership_cfretain:
d->addAttr(::new (S.Context) ObjCOwnershipCFRetainAttr()); return;
+ case AttributeList::AT_objc_ownership_make_collectable:
+ d->addAttr(::new (S.Context) ObjCOwnershipMakeCollectableAttr()); return;
+ case AttributeList::AT_objc_ownership_release:
+ d->addAttr(::new (S.Context) ObjCOwnershipReleaseAttr()); return;
+ case AttributeList::AT_objc_ownership_retain:
+ d->addAttr(::new (S.Context) ObjCOwnershipRetainAttr()); return;
}
}
@@ -1607,10 +1611,11 @@
case AttributeList::AT_nothrow: HandleNothrowAttr (D, Attr, S); break;
// Checker-specific.
+ case AttributeList::AT_objc_ownership_cfrelease:
+ case AttributeList::AT_objc_ownership_cfretain:
+ case AttributeList::AT_objc_ownership_make_collectable:
case AttributeList::AT_objc_ownership_release:
- case AttributeList::AT_objc_ownership_cfrelease:
case AttributeList::AT_objc_ownership_retain:
- case AttributeList::AT_objc_ownership_cfretain:
HandleObjCOwnershipParmAttr(D, Attr, S); break;
case AttributeList::AT_objc_ownership_returns:
HandleObjCOwnershipReturnsAttr(D, Attr, S); break;
Modified: cfe/trunk/test/Analysis/retain-release-gc-only.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/retain-release-gc-only.m?rev=70336&r1=70335&r2=70336&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/retain-release-gc-only.m (original)
+++ cfe/trunk/test/Analysis/retain-release-gc-only.m Tue Apr 28 17:32:26 2009
@@ -134,6 +134,7 @@
- (void) myCFRetain:(id)__attribute__((objc_ownership_cfretain))obj;
- (void) myRelease:(id)__attribute__((objc_ownership_release))obj;
- (void) myCFRelease:(id)__attribute__((objc_ownership_cfrelease))obj;
+- (void) makeCollectable:(id)__attribute__((objc_ownership_make_collectable))obj;
@end
void test_attr_1(TestOwnershipAttr *X) {
@@ -181,3 +182,14 @@
[X myCFRetain:str];
[X myCFRelease:str];
}
+
+void test_attr_6a(TestOwnershipAttr *X) {
+ CFMutableArrayRef A = CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // expected-warning{{leak}}
+}
+
+void test_attr_6b(TestOwnershipAttr *X) {
+ CFMutableArrayRef A = CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // no-warning
+ [X makeCollectable:(id)A];
+}
+
+
More information about the cfe-commits
mailing list