summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorDevin Coughlin <dcoughlin@apple.com>2015-11-18 22:46:52 +0000
committerDevin Coughlin <dcoughlin@apple.com>2015-11-18 22:46:52 +0000
commit6e644abd46ec6f339e6e639e30566816e75694a7 (patch)
tree758c47963bd0eb0eac5a5c81ac302a1d3bfdd556 /clang
parentcfb1456572949abcbe1769c5c272ce1f397db883 (diff)
downloadbcm5719-llvm-6e644abd46ec6f339e6e639e30566816e75694a7.tar.gz
bcm5719-llvm-6e644abd46ec6f339e6e639e30566816e75694a7.zip
[analyzer] Skip checking blocks in dependent contexts.
Since we don't check functions in dependent contexts, we should skip blocks in those contexts as well. This avoids an assertion failure when the DeadStoresChecker attempts to evaluate an array subscript expression with a dependent name type. rdar://problem/23564220 llvm-svn: 253516
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp6
-rw-r--r--clang/test/Analysis/dead-stores.cpp18
2 files changed, 21 insertions, 3 deletions
diff --git a/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp b/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
index ca92ffe8f01..bbcd23c8a25 100644
--- a/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
+++ b/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
@@ -368,7 +368,11 @@ public:
bool VisitBlockDecl(BlockDecl *BD) {
if (BD->hasBody()) {
assert(RecVisitorMode == AM_Syntax || Mgr->shouldInlineCall() == false);
- HandleCode(BD, RecVisitorMode);
+ // Since we skip function template definitions, we should skip blocks
+ // declared in those functions as well.
+ if (!BD->isDependentContext()) {
+ HandleCode(BD, RecVisitorMode);
+ }
}
return true;
}
diff --git a/clang/test/Analysis/dead-stores.cpp b/clang/test/Analysis/dead-stores.cpp
index 2027ee6be1f..78cba161065 100644
--- a/clang/test/Analysis/dead-stores.cpp
+++ b/clang/test/Analysis/dead-stores.cpp
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -std=c++11 -analyze -analyzer-checker=deadcode.DeadStores -verify -Wno-unreachable-code %s
-// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -std=c++11 -analyze -analyzer-store=region -analyzer-constraints=range -analyzer-checker=deadcode.DeadStores -verify -Wno-unreachable-code %s
+// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fblocks -std=c++11 -analyze -analyzer-checker=deadcode.DeadStores -verify -Wno-unreachable-code %s
+// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fblocks -std=c++11 -analyze -analyzer-store=region -analyzer-constraints=range -analyzer-checker=deadcode.DeadStores -verify -Wno-unreachable-code %s
//===----------------------------------------------------------------------===//
// Basic dead store checking (but in C++ mode).
@@ -174,6 +174,20 @@ int radar_13213575() {
return radar13213575_testit<true>(5) + radar13213575_testit<false>(3);
}
+template <class T>
+void test_block_in_dependent_context(typename T::some_t someArray) {
+ ^{
+ int i = someArray[0]; // no-warning
+ }();
+}
+
+void test_block_in_non_dependent_context(int *someArray) {
+ ^{
+ int i = someArray[0]; // expected-warning {{Value stored to 'i' during its initialization is never read}}
+ }();
+}
+
+
//===----------------------------------------------------------------------===//
// Dead store checking involving lambdas.
//===----------------------------------------------------------------------===//
OpenPOWER on IntegriCloud