From a121fca3f3d932cdeed9e839db4c7ded0cd80b00 Mon Sep 17 00:00:00 2001 From: Devin Coughlin Date: Wed, 18 Nov 2015 22:46:52 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@253516 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Frontend/AnalysisConsumer.cpp | 6 +++++- test/Analysis/dead-stores.cpp | 18 ++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp b/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp index ca92ffe8f0..bbcd23c8a2 100644 --- a/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp +++ b/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/test/Analysis/dead-stores.cpp b/test/Analysis/dead-stores.cpp index 2027ee6be1..78cba16106 100644 --- a/test/Analysis/dead-stores.cpp +++ b/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(5) + radar13213575_testit(3); } +template +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. //===----------------------------------------------------------------------===// -- 2.40.0