forked from OSchip/llvm-project
[analyzer] Specialize "loop executed 0 times" for for-in and for-range loops.
The path note that says "Loop body executed 0 times" has been changed to "Loop body skipped when range is empty" for C++11 for-range loops, and to "Loop body skipped when collection is empty" for Objective-C for-in loops. Part of <rdar://problem/14992886> llvm-svn: 194234
This commit is contained in:
parent
ec7cea925e
commit
236dbd25e7
|
@ -1629,6 +1629,10 @@ static const Stmt *getTerminatorCondition(const CFGBlock *B) {
|
|||
|
||||
static const char StrEnteringLoop[] = "Entering loop body";
|
||||
static const char StrLoopBodyZero[] = "Loop body executed 0 times";
|
||||
static const char StrLoopRangeEmpty[] =
|
||||
"Loop body skipped when range is empty";
|
||||
static const char StrLoopCollectionEmpty[] =
|
||||
"Loop body skipped when collection is empty";
|
||||
|
||||
static bool
|
||||
GenerateAlternateExtensivePathDiagnostic(PathDiagnostic& PD,
|
||||
|
@ -1827,7 +1831,13 @@ GenerateAlternateExtensivePathDiagnostic(PathDiagnostic& PD,
|
|||
|
||||
if (isJumpToFalseBranch(&*BE)) {
|
||||
if (!IsInLoopBody) {
|
||||
str = StrLoopBodyZero;
|
||||
if (isa<ObjCForCollectionStmt>(Term)) {
|
||||
str = StrLoopCollectionEmpty;
|
||||
} else if (isa<CXXForRangeStmt>(Term)) {
|
||||
str = StrLoopRangeEmpty;
|
||||
} else {
|
||||
str = StrLoopBodyZero;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
str = StrEnteringLoop;
|
||||
|
@ -2072,7 +2082,8 @@ static void simplifySimpleBranches(PathPieces &pieces) {
|
|||
PathDiagnosticEventPiece *EV = dyn_cast<PathDiagnosticEventPiece>(*NextI);
|
||||
if (EV) {
|
||||
StringRef S = EV->getString();
|
||||
if (S == StrEnteringLoop || S == StrLoopBodyZero) {
|
||||
if (S == StrEnteringLoop || S == StrLoopBodyZero ||
|
||||
S == StrLoopCollectionEmpty || S == StrLoopRangeEmpty) {
|
||||
++NextI;
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -1133,9 +1133,9 @@ void testLoopErrorInRange() {
|
|||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: <key>depth</key><integer>0</integer>
|
||||
// CHECK-NEXT: <key>extended_message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when range is empty</string>
|
||||
// CHECK-NEXT: <key>message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when range is empty</string>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>kind</key><string>control</string>
|
||||
|
@ -1550,9 +1550,9 @@ void testLoopErrorInRange() {
|
|||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: <key>depth</key><integer>0</integer>
|
||||
// CHECK-NEXT: <key>extended_message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when range is empty</string>
|
||||
// CHECK-NEXT: <key>message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when range is empty</string>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>kind</key><string>control</string>
|
||||
|
|
|
@ -2925,9 +2925,9 @@ namespace rdar14960554 {
|
|||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: <key>depth</key><integer>0</integer>
|
||||
// CHECK-NEXT: <key>extended_message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when collection is empty</string>
|
||||
// CHECK-NEXT: <key>message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when collection is empty</string>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>kind</key><string>control</string>
|
||||
|
@ -12896,9 +12896,9 @@ namespace rdar14960554 {
|
|||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: <key>depth</key><integer>0</integer>
|
||||
// CHECK-NEXT: <key>extended_message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when collection is empty</string>
|
||||
// CHECK-NEXT: <key>message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when collection is empty</string>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>kind</key><string>control</string>
|
||||
|
@ -13415,9 +13415,9 @@ namespace rdar14960554 {
|
|||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: <key>depth</key><integer>0</integer>
|
||||
// CHECK-NEXT: <key>extended_message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when range is empty</string>
|
||||
// CHECK-NEXT: <key>message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when range is empty</string>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>kind</key><string>control</string>
|
||||
|
@ -14150,9 +14150,9 @@ namespace rdar14960554 {
|
|||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: <key>depth</key><integer>0</integer>
|
||||
// CHECK-NEXT: <key>extended_message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when collection is empty</string>
|
||||
// CHECK-NEXT: <key>message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when collection is empty</string>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>kind</key><string>control</string>
|
||||
|
@ -14669,9 +14669,9 @@ namespace rdar14960554 {
|
|||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: <key>depth</key><integer>0</integer>
|
||||
// CHECK-NEXT: <key>extended_message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when range is empty</string>
|
||||
// CHECK-NEXT: <key>message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when range is empty</string>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>kind</key><string>control</string>
|
||||
|
@ -15467,9 +15467,9 @@ namespace rdar14960554 {
|
|||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: <key>depth</key><integer>0</integer>
|
||||
// CHECK-NEXT: <key>extended_message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when collection is empty</string>
|
||||
// CHECK-NEXT: <key>message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when collection is empty</string>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>kind</key><string>control</string>
|
||||
|
@ -15986,9 +15986,9 @@ namespace rdar14960554 {
|
|||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: <key>depth</key><integer>0</integer>
|
||||
// CHECK-NEXT: <key>extended_message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when range is empty</string>
|
||||
// CHECK-NEXT: <key>message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when range is empty</string>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>kind</key><string>control</string>
|
||||
|
@ -16881,9 +16881,9 @@ namespace rdar14960554 {
|
|||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: <key>depth</key><integer>0</integer>
|
||||
// CHECK-NEXT: <key>extended_message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when collection is empty</string>
|
||||
// CHECK-NEXT: <key>message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when collection is empty</string>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>kind</key><string>control</string>
|
||||
|
@ -17400,9 +17400,9 @@ namespace rdar14960554 {
|
|||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: <key>depth</key><integer>0</integer>
|
||||
// CHECK-NEXT: <key>extended_message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when range is empty</string>
|
||||
// CHECK-NEXT: <key>message</key>
|
||||
// CHECK-NEXT: <string>Loop body executed 0 times</string>
|
||||
// CHECK-NEXT: <string>Loop body skipped when range is empty</string>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>kind</key><string>control</string>
|
||||
|
|
Loading…
Reference in New Issue