From: Ted Kremenek Date: Wed, 15 Jan 2014 00:59:23 +0000 (+0000) Subject: Teach DeadStoresChecker about attribute objc_precise_lifetime. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=93f745884daf300da09c6f58d034e287293c654a;p=clang Teach DeadStoresChecker about attribute objc_precise_lifetime. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@199277 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp b/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp index 3468140c91..4ad4e1c8c6 100644 --- a/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp @@ -214,7 +214,8 @@ public: return; if (!isLive(Live, VD) && - !(VD->hasAttr() || VD->hasAttr())) { + !(VD->hasAttr() || VD->hasAttr() || + VD->hasAttr())) { 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()) { + // marked 'unused' or 'objc_precise_lifetime'. + if (!isLive(Live, V) && + !V->hasAttr() && + !V->hasAttr()) { // Special case: check for initializations with constants. // // e.g. : int x = 0; diff --git a/test/Analysis/dead-stores.m b/test/Analysis/dead-stores.m index 5a807ed52c..13b28dcf53 100644 --- a/test/Analysis/dead-stores.m +++ b/test/Analysis/dead-stores.m @@ -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; +}