// B1, 'A && B' for B2, and 'A && B || C' for B3. Let's check whether we
// reached the end of the condition!
if (const Stmt *ElseCond = Else->getTerminatorCondition())
- if (isa<BinaryOperator>(ElseCond)) {
- assert(cast<BinaryOperator>(ElseCond)->isLogicalOp());
- return isAssertlikeBlock(Else, Context);
- }
+ if (const auto *BinOp = dyn_cast<BinaryOperator>(ElseCond))
+ if (BinOp->isLogicalOp())
+ return isAssertlikeBlock(Else, Context);
return false;
}
} // end of namespace unimportant_write_before_collapse_point
+namespace dont_crash_on_nonlogical_binary_operator {
+
+void f6(int x) {
+ int a[20];
+ if (x == 25) {} // expected-note{{Assuming 'x' is equal to 25}}
+ // expected-note@-1{{Taking true branch}}
+ if (a[x] == 123) {} // expected-warning{{The left operand of '==' is a garbage value due to array index out of bounds}}
+ // expected-note@-1{{The left operand of '==' is a garbage value due to array index out of bounds}}
+}
+
+} // end of namespace dont_crash_on_nonlogical_binary_operator
+
namespace dont_track_assertlike_conditions {
extern void __assert_fail(__const char *__assertion, __const char *__file,
}
#undef assert
-
} // end of namespace dont_track_assertlike_and_conditions
namespace dont_track_assertlike_or_conditions {