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,
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;
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;
}
// 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>
// 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>
// 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>
// 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>
// 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>
// 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>
// 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>
// 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>
// 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>
// 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>
// 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>