summaryrefslogtreecommitdiffstats
path: root/clang/lib/StaticAnalyzer/Core/ProgramState.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2012-06-01 20:04:04 +0000
committerTed Kremenek <kremenek@apple.com>2012-06-01 20:04:04 +0000
commitc3da376fbc567e1d9143bc1d908ddd07044a47e8 (patch)
tree94d753b6053ba5c2c9bebb34b9cc7d4efe4f8650 /clang/lib/StaticAnalyzer/Core/ProgramState.cpp
parent0bc272cf9a27a9fe15305df77df3d58edb3bd5f6 (diff)
downloadbcm5719-llvm-c3da376fbc567e1d9143bc1d908ddd07044a47e8.tar.gz
bcm5719-llvm-c3da376fbc567e1d9143bc1d908ddd07044a47e8.zip
static analyzer: add inlining support for directly called blocks.
llvm-svn: 157833
Diffstat (limited to 'clang/lib/StaticAnalyzer/Core/ProgramState.cpp')
-rw-r--r--clang/lib/StaticAnalyzer/Core/ProgramState.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/ProgramState.cpp b/clang/lib/StaticAnalyzer/Core/ProgramState.cpp
index b9cfa27808c..a666de0c5ce 100644
--- a/clang/lib/StaticAnalyzer/Core/ProgramState.cpp
+++ b/clang/lib/StaticAnalyzer/Core/ProgramState.cpp
@@ -568,6 +568,16 @@ bool ScanReachableSymbols::scan(const MemRegion *R) {
if (!scan(SR->getSuperRegion()))
return false;
+ // Regions captured by a block are also implicitly reachable.
+ if (const BlockDataRegion *BDR = dyn_cast<BlockDataRegion>(R)) {
+ BlockDataRegion::referenced_vars_iterator I = BDR->referenced_vars_begin(),
+ E = BDR->referenced_vars_end();
+ for ( ; I != E; ++I) {
+ if (!scan(I.getCapturedRegion()))
+ return false;
+ }
+ }
+
// Now look at the binding to this region (if any).
if (!scan(state->getSValAsScalarOrLoc(R)))
return false;
OpenPOWER on IntegriCloud