]> granicus.if.org Git - clang/commitdiff
Teach DeadStoresChecker about attribute objc_precise_lifetime.
authorTed Kremenek <kremenek@apple.com>
Wed, 15 Jan 2014 00:59:23 +0000 (00:59 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 15 Jan 2014 00:59:23 +0000 (00:59 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@199277 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp
test/Analysis/dead-stores.m

index 3468140c917446ebd17803f23dc660a292c46ede..4ad4e1c8c62727d1da1d20e535bdb313000fabb4 100644 (file)
@@ -214,7 +214,8 @@ public:
       return;
 
     if (!isLive(Live, VD) &&
-        !(VD->hasAttr<UnusedAttr>() || VD->hasAttr<BlocksAttr>())) {
+        !(VD->hasAttr<UnusedAttr>() || VD->hasAttr<BlocksAttr>() ||
+          VD->hasAttr<ObjCPreciseLifetimeAttr>())) {
 
       PathDiagnosticLocation ExLoc =
         PathDiagnosticLocation::createBegin(Ex, BR.getSourceManager(), AC);
@@ -339,8 +340,10 @@ public:
             
             // A dead initialization is a variable that is dead after it
             // is initialized.  We don't flag warnings for those variables
-            // marked 'unused'.
-            if (!isLive(Live, V) && !V->hasAttr<UnusedAttr>()) {
+            // marked 'unused' or 'objc_precise_lifetime'.
+            if (!isLive(Live, V) &&
+                !V->hasAttr<UnusedAttr>() &&
+                !V->hasAttr<ObjCPreciseLifetimeAttr>()) {
               // Special case: check for initializations with constants.
               //
               //  e.g. : int x = 0;
index 5a807ed52c99d8c30be524495de5a9e11f91bc73..13b28dcf5374eeb175b9fb502a12907b7ea21e0c 100644 (file)
@@ -109,3 +109,11 @@ Radar11059352_1 *_Path;
     return wp;
 }
 @end
+
+id test_objc_precise_lifetime_foo();
+void test_objc_precise_lifetime() {
+  __attribute__((objc_precise_lifetime)) id dead = test_objc_precise_lifetime_foo(); // no-warning
+  dead = 0;
+  dead = test_objc_precise_lifetime_foo(); // no-warning
+  dead = 0;
+}