diff options
author | Ted Kremenek <kremenek@apple.com> | 2013-02-18 07:18:28 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2013-02-18 07:18:28 +0000 |
commit | 3e05be9de38b571d23d07c56667111b0d6717a65 (patch) | |
tree | 3cf5533a49cfc4f63eb80704bcd7766c35559eb5 | |
parent | 9211bd33ec1c0923b992e9644cb94303b0fa3420 (diff) | |
download | bcm5719-llvm-3e05be9de38b571d23d07c56667111b0d6717a65.tar.gz bcm5719-llvm-3e05be9de38b571d23d07c56667111b0d6717a65.zip |
Disable dead stores checker for template instantations. Fixes <rdar://problem/13213575>.
llvm-svn: 175425
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp | 9 | ||||
-rw-r--r-- | clang/test/Analysis/dead-stores.cpp | 18 |
2 files changed, 27 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp index e2f8395da90..f2e3e6d7815 100644 --- a/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp @@ -419,6 +419,15 @@ class DeadStoresChecker : public Checker<check::ASTCodeBody> { public: void checkASTCodeBody(const Decl *D, AnalysisManager& mgr, BugReporter &BR) const { + + // Don't do anything for template instantiations. + // Proving that code in a template instantiation is "dead" + // means proving that it is dead in all instantiations. + // This same problem exists with -Wunreachable-code. + if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) + if (FD->isTemplateInstantiation()) + return; + if (LiveVariables *L = mgr.getAnalysis<LiveVariables>(D)) { CFG &cfg = *mgr.getCFG(D); AnalysisDeclContext *AC = mgr.getAnalysisDeclContext(D); diff --git a/clang/test/Analysis/dead-stores.cpp b/clang/test/Analysis/dead-stores.cpp index e1a034b1d02..d442c621d87 100644 --- a/clang/test/Analysis/dead-stores.cpp +++ b/clang/test/Analysis/dead-stores.cpp @@ -156,3 +156,21 @@ void testCXX11Using() { Int value; value = 1; // expected-warning {{never read}} } + +//===----------------------------------------------------------------------===// +// Dead stores in template instantiations (do not warn). +//===----------------------------------------------------------------------===// + +template <bool f> int radar13213575_testit(int i) { + int x = 5+i; // warning: Value stored to 'x' during its initialization is never read + int y = 7; + if (f) + return x; + else + return y; +} + +int radar_13213575() { + return radar13213575_testit<true>(5) + radar13213575_testit<false>(3); +} + |