assert(BinaryOperator::isComparisonOp(Op));
// For now, we only support comparing pointers.
- assert(Loc::isLocType(SSE->getLHS()->getType()));
- assert(Loc::isLocType(SSE->getRHS()->getType()));
- QualType DiffTy = SymMgr.getContext().getPointerDiffType();
- SymbolRef Subtraction =
- SymMgr.getSymSymExpr(SSE->getRHS(), BO_Sub, SSE->getLHS(), DiffTy);
-
- const llvm::APSInt &Zero = getBasicVals().getValue(0, DiffTy);
- Op = BinaryOperator::reverseComparisonOp(Op);
- if (!Assumption)
- Op = BinaryOperator::negateComparisonOp(Op);
- return assumeSymRel(State, Subtraction, Op, Zero);
+ if (Loc::isLocType(SSE->getLHS()->getType()) &&
+ Loc::isLocType(SSE->getRHS()->getType())) {
+ QualType DiffTy = SymMgr.getContext().getPointerDiffType();
+ SymbolRef Subtraction =
+ SymMgr.getSymSymExpr(SSE->getRHS(), BO_Sub, SSE->getLHS(), DiffTy);
+
+ const llvm::APSInt &Zero = getBasicVals().getValue(0, DiffTy);
+ Op = BinaryOperator::reverseComparisonOp(Op);
+ if (!Assumption)
+ Op = BinaryOperator::negateComparisonOp(Op);
+ return assumeSymRel(State, Subtraction, Op, Zero);
+ }
}
// If we get here, there's nothing else we can do but treat the symbol as
clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
clang_analyzer_dump(y); // expected-warning{{conj_$2{int}}}
clang_analyzer_dump(x == y);
- // expected-warning@-1{{Unknown}} // FIXME: Can this be simplified?
+ // expected-warning@-1{{((conj_$2{int}) + 1U) == (conj_$2{int})}}
}
void compare_same_symbol_minus_left_int_equal_unsigned() {
clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
clang_analyzer_dump(y); // expected-warning{{conj_$2{int}}}
clang_analyzer_dump(x == y);
- // expected-warning@-1{{Unknown}} // FIXME: Can this be simplified?
+ // expected-warning@-1{{((conj_$2{int}) - 1U) == (conj_$2{int})}}
}
void compare_same_symbol_plus_right_int_equal_unsigned() {
clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) + 1}}
clang_analyzer_dump(x == y);
- // expected-warning@-1{{Unknown}} // FIXME: Can this be simplified?
+ // expected-warning@-1{{(conj_$2{int}) == ((conj_$2{int}) + 1U)}}
}
void compare_same_symbol_minus_right_int_equal_unsigned() {
clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) - 1}}
clang_analyzer_dump(x == y);
- // expected-warning@-1{{Unknown}} // FIXME: Can this be simplified?
+ // expected-warning@-1{{(conj_$2{int}) == ((conj_$2{int}) - 1U)}}
}
void compare_same_symbol_plus_left_plus_right_int_equal_unsigned() {
clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) - 1}}
clang_analyzer_dump(x == y);
- // expected-warning@-1{{Unknown}} // FIXME: Can this be simplified?
+ // expected-warning@-1{{((conj_$2{int}) + 1U) == ((conj_$2{int}) - 1U)}}
}
void compare_same_symbol_minus_left_plus_right_int_equal_unsigned() {
clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) + 1}}
clang_analyzer_dump(x == y);
- // expected-warning@-1{{Unknown}} // FIXME: Can this be simplified?
+ // expected-warning@-1{{((conj_$2{int}) - 1U) == ((conj_$2{int}) + 1U)}}
}
void compare_same_symbol_minus_left_minus_right_int_equal_unsigned() {
clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
clang_analyzer_dump(y); // expected-warning{{conj_$2{int}}}
clang_analyzer_dump(x <= y);
- // expected-warning@-1{{Unknown}} // FIXME: Can this be simplified?
+ // expected-warning@-1{{((conj_$2{int}) + 1U) <= (conj_$2{int})}}
}
void compare_same_symbol_minus_left_int_less_or_equal_unsigned() {
clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
clang_analyzer_dump(y); // expected-warning{{conj_$2{int}}}
clang_analyzer_dump(x <= y);
- // expected-warning@-1{{Unknown}} // FIXME: Can this be simplified?
+ // expected-warning@-1{{((conj_$2{int}) - 1U) <= (conj_$2{int})}}
}
void compare_same_symbol_plus_right_int_less_or_equal_unsigned() {
clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) + 1}}
clang_analyzer_dump(x <= y);
- // expected-warning@-1{{Unknown}} // FIXME: Can this be simplified?
+ // expected-warning@-1{{(conj_$2{int}) <= ((conj_$2{int}) + 1U)}}
}
void compare_same_symbol_minus_right_int_less_or_equal_unsigned() {
clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) - 1}}
clang_analyzer_dump(x <= y);
- // expected-warning@-1{{Unknown}} // FIXME: Can this be simplified?
+ // expected-warning@-1{{(conj_$2{int}) <= ((conj_$2{int}) - 1U)}}
}
void compare_same_symbol_plus_left_plus_right_int_less_or_equal_unsigned() {
clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) - 1}}
clang_analyzer_dump(x <= y);
- // expected-warning@-1{{Unknown}} // FIXME: Can this be simplified?
+ // expected-warning@-1{{((conj_$2{int}) + 1U) <= ((conj_$2{int}) - 1U)}}
}
void compare_same_symbol_minus_left_plus_right_int_less_or_equal_unsigned() {
clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) + 1}}
clang_analyzer_dump(x <= y);
- // expected-warning@-1{{Unknown}} // FIXME: Can this be simplified?
+ // expected-warning@-1{{((conj_$2{int}) - 1U) <= ((conj_$2{int}) + 1U)}}
}
void compare_same_symbol_minus_left_minus_right_int_less_or_equal_unsigned() {
clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
clang_analyzer_dump(y); // expected-warning{{conj_$2{int}}}
clang_analyzer_dump(x < y);
- // expected-warning@-1{{Unknown}} // FIXME: Can this be simplified?
+ // expected-warning@-1{{((conj_$2{int}) + 1U) < (conj_$2{int})}}
}
void compare_same_symbol_minus_left_int_less_unsigned() {
clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
clang_analyzer_dump(y); // expected-warning{{conj_$2{int}}}
clang_analyzer_dump(x < y);
- // expected-warning@-1{{Unknown}} // FIXME: Can this be simplified?
+ // expected-warning@-1{{((conj_$2{int}) - 1U) < (conj_$2{int})}}
}
void compare_same_symbol_plus_right_int_less_unsigned() {
clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) + 1}}
clang_analyzer_dump(x < y);
- // expected-warning@-1{{Unknown}} // FIXME: Can this be simplified?
+ // expected-warning@-1{{(conj_$2{int}) < ((conj_$2{int}) + 1U)}}
}
void compare_same_symbol_minus_right_int_less_unsigned() {
clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) - 1}}
clang_analyzer_dump(x < y);
- // expected-warning@-1{{Unknown}} // FIXME: Can this be simplified?
+ // expected-warning@-1{{(conj_$2{int}) < ((conj_$2{int}) - 1U)}}
}
void compare_same_symbol_plus_left_plus_right_int_less_unsigned() {
clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) - 1}}
clang_analyzer_dump(x < y);
- // expected-warning@-1{{Unknown}} // FIXME: Can this be simplified?
+ // expected-warning@-1{{((conj_$2{int}) + 1U) < ((conj_$2{int}) - 1U)}}
}
void compare_same_symbol_minus_left_plus_right_int_less_unsigned() {
clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) + 1}}
clang_analyzer_dump(x < y);
- // expected-warning@-1{{Unknown}} // FIXME: Can this be simplified?
+ // expected-warning@-1{{((conj_$2{int}) - 1U) < ((conj_$2{int}) + 1U)}}
}
void compare_same_symbol_minus_left_minus_right_int_less_unsigned() {