diff options
author | Jordan Rose <jordan_rose@apple.com> | 2012-08-20 20:01:15 +0000 |
---|---|---|
committer | Jordan Rose <jordan_rose@apple.com> | 2012-08-20 20:01:15 +0000 |
commit | bda04301d47fb16fe5773b49fc7cee6bb5e81be9 (patch) | |
tree | 12c97481e1efa5925a0584031099565be7248d54 /clang/test/Analysis/retain-release.m | |
parent | 53cb2f327abbe46887c1ed0f9ced75a43f1fd176 (diff) | |
download | bcm5719-llvm-bda04301d47fb16fe5773b49fc7cee6bb5e81be9.tar.gz bcm5719-llvm-bda04301d47fb16fe5773b49fc7cee6bb5e81be9.zip |
[analyzer] Add a test for "release and stop tracking" behavior.
This is used to handle functions and methods that consume an argument
(annotated with the ns_consumed or cf_consumed attribute), but then the
argument's retain count may be further modified in a callback. We want
to warn about over-releasing, but we can't really track the object afterwards.
llvm-svn: 162221
Diffstat (limited to 'clang/test/Analysis/retain-release.m')
-rw-r--r-- | clang/test/Analysis/retain-release.m | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/clang/test/Analysis/retain-release.m b/clang/test/Analysis/retain-release.m index ba492b7b19a..efd05329455 100644 --- a/clang/test/Analysis/retain-release.m +++ b/clang/test/Analysis/retain-release.m @@ -1855,3 +1855,17 @@ id makeCollectableNonLeak() { [objCObject release]; // +1 return [objCObject autorelease]; // +0 } + +void consumeAndStopTracking(id NS_CONSUMED obj, void (^callback)(void)); +void testConsumeAndStopTracking() { + id retained = [@[] retain]; // +1 + consumeAndStopTracking(retained, ^{}); // no-warning + + id doubleRetained = [[@[] retain] retain]; // +2 + consumeAndStopTracking(doubleRetained, ^{ + [doubleRetained release]; + }); // no-warning + + id unretained = @[]; // +0 + consumeAndStopTracking(unretained, ^{}); // expected-warning {{Incorrect decrement of the reference count of an object that is not owned at this point by the caller}} +} |