// RUN: %clang_analyze_cc1 -analyzer-checker=debug.ExprInspection,core.builtin -analyzer-config aggressive-binary-operation-simplification=true -verify %s

void clang_analyzer_dump(int x);
void clang_analyzer_eval(int x);

void exit(int);

#define UINT_MAX (~0U)
#define INT_MAX (UINT_MAX & (UINT_MAX >> 1))

extern void __assert_fail (__const char *__assertion, __const char *__file,
    unsigned int __line, __const char *__function)
     __attribute__ ((__noreturn__));
#define assert(expr) \
  ((expr)  ? (void)(0)  : __assert_fail (#expr, __FILE__, __LINE__, __func__))

int g();
int f() {
  int x = g();
  // Assert that no overflows occur in this test file.
  // Assuming that concrete integers are also within that range.
  assert(x <= ((int)INT_MAX / 4));
  assert(x >= -((int)INT_MAX / 4));
  return x;
}

void compare_different_symbol_equal() {
  int x = f(), y = f();
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{conj_$9{int}}}
  clang_analyzer_dump(x == y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) == 0}}
}

void compare_different_symbol_plus_left_int_equal() {
  int x = f()+1, y = f();
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_dump(y); // expected-warning{{conj_$9{int}}}
  clang_analyzer_dump(x == y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) == 1}}
}

void compare_different_symbol_minus_left_int_equal() {
  int x = f()-1, y = f();
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_dump(y); // expected-warning{{conj_$9{int}}}
  clang_analyzer_dump(x == y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) == 1}}
}

void compare_different_symbol_plus_right_int_equal() {
  int x = f(), y = f()+2;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) + 2}}
  clang_analyzer_dump(x == y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) == 2}}
}

void compare_different_symbol_minus_right_int_equal() {
  int x = f(), y = f()-2;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) - 2}}
  clang_analyzer_dump(x == y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) == 2}}
}

void compare_different_symbol_plus_left_plus_right_int_equal() {
  int x = f()+2, y = f()+1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) + 1}}
  clang_analyzer_dump(x == y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) == 1}}
}

void compare_different_symbol_plus_left_minus_right_int_equal() {
  int x = f()+2, y = f()-1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) - 1}}
  clang_analyzer_dump(x == y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) == 3}}
}

void compare_different_symbol_minus_left_plus_right_int_equal() {
  int x = f()-2, y = f()+1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) + 1}}
  clang_analyzer_dump(x == y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) == 3}}
}

void compare_different_symbol_minus_left_minus_right_int_equal() {
  int x = f()-2, y = f()-1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) - 1}}
  clang_analyzer_dump(x == y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) == 1}}
}

void compare_same_symbol_equal() {
  int x = f(), y = x;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{conj_$2{int}}}
  clang_analyzer_eval(x == y);
  // expected-warning@-1{{TRUE}}
}

void compare_same_symbol_plus_left_int_equal() {
  int x = f(), y = x;
  ++x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_dump(y); // expected-warning{{conj_$2{int}}}
  clang_analyzer_eval(x == y);
  // expected-warning@-1{{FALSE}}
}

void compare_same_symbol_minus_left_int_equal() {
  int x = f(), y = x;
  --x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_dump(y); // expected-warning{{conj_$2{int}}}
  clang_analyzer_eval(x == y);
  // expected-warning@-1{{FALSE}}
}

void compare_same_symbol_plus_right_int_equal() {
  int x = f(), y = x+1;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_eval(x == y);
  // expected-warning@-1{{FALSE}}
}

void compare_same_symbol_minus_right_int_equal() {
  int x = f(), y = x-1;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_eval(x == y);
  // expected-warning@-1{{FALSE}}
}

void compare_same_symbol_plus_left_plus_right_int_equal() {
  int x = f(), y = x+1;
  ++x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_eval(x == y);
  // expected-warning@-1{{TRUE}}
}

void compare_same_symbol_plus_left_minus_right_int_equal() {
  int x = f(), y = x-1;
  ++x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_eval(x == y);
  // expected-warning@-1{{FALSE}}
}

void compare_same_symbol_minus_left_plus_right_int_equal() {
  int x = f(), y = x+1;
  --x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_eval(x == y);
  // expected-warning@-1{{FALSE}}
}

void compare_same_symbol_minus_left_minus_right_int_equal() {
  int x = f(), y = x-1;
  --x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_eval(x == y);
  // expected-warning@-1{{TRUE}}
}

void compare_different_symbol_less_or_equal() {
  int x = f(), y = f();
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{conj_$9{int}}}
  clang_analyzer_dump(x <= y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) <= 0}}
}

void compare_different_symbol_plus_left_int_less_or_equal() {
  int x = f()+1, y = f();
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_dump(y); // expected-warning{{conj_$9{int}}}
  clang_analyzer_dump(x <= y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) >= 1}}
}

void compare_different_symbol_minus_left_int_less_or_equal() {
  int x = f()-1, y = f();
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_dump(y); // expected-warning{{conj_$9{int}}}
  clang_analyzer_dump(x <= y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) <= 1}}
}

void compare_different_symbol_plus_right_int_less_or_equal() {
  int x = f(), y = f()+2;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) + 2}}
  clang_analyzer_dump(x <= y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) <= 2}}
}

void compare_different_symbol_minus_right_int_less_or_equal() {
  int x = f(), y = f()-2;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) - 2}}
  clang_analyzer_dump(x <= y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) >= 2}}
}

void compare_different_symbol_plus_left_plus_right_int_less_or_equal() {
  int x = f()+2, y = f()+1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) + 1}}
  clang_analyzer_dump(x <= y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) >= 1}}
}

void compare_different_symbol_plus_left_minus_right_int_less_or_equal() {
  int x = f()+2, y = f()-1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) - 1}}
  clang_analyzer_dump(x <= y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) >= 3}}
}

void compare_different_symbol_minus_left_plus_right_int_less_or_equal() {
  int x = f()-2, y = f()+1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) + 1}}
  clang_analyzer_dump(x <= y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) <= 3}}
}

void compare_different_symbol_minus_left_minus_right_int_less_or_equal() {
  int x = f()-2, y = f()-1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) - 1}}
  clang_analyzer_dump(x <= y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) <= 1}}
}

void compare_same_symbol_less_or_equal() {
  int x = f(), y = x;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{conj_$2{int}}}
  clang_analyzer_eval(x <= y);
  // expected-warning@-1{{TRUE}}
}

void compare_same_symbol_plus_left_int_less_or_equal() {
  int x = f(), y = x;
  ++x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_dump(y); // expected-warning{{conj_$2{int}}}
  clang_analyzer_eval(x <= y);
  // expected-warning@-1{{FALSE}}
}

void compare_same_symbol_minus_left_int_less_or_equal() {
  int x = f(), y = x;
  --x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_dump(y); // expected-warning{{conj_$2{int}}}
  clang_analyzer_eval(x <= y);
  // expected-warning@-1{{TRUE}}
}

void compare_same_symbol_plus_right_int_less_or_equal() {
  int x = f(), y = x+1;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_eval(x <= y);
  // expected-warning@-1{{TRUE}}
}

void compare_same_symbol_minus_right_int_less_or_equal() {
  int x = f(), y = x-1;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_eval(x <= y);
  // expected-warning@-1{{FALSE}}
}

void compare_same_symbol_plus_left_plus_right_int_less_or_equal() {
  int x = f(), y = x+1;
  ++x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_eval(x <= y);
  // expected-warning@-1{{TRUE}}
}

void compare_same_symbol_plus_left_minus_right_int_less_or_equal() {
  int x = f(), y = x-1;
  ++x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_eval(x <= y);
  // expected-warning@-1{{FALSE}}
}

void compare_same_symbol_minus_left_plus_right_int_less_or_equal() {
  int x = f(), y = x+1;
  --x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_eval(x <= y);
  // expected-warning@-1{{TRUE}}
}

void compare_same_symbol_minus_left_minus_right_int_less_or_equal() {
  int x = f(), y = x-1;
  --x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_eval(x <= y);
  // expected-warning@-1{{TRUE}}
}

void compare_different_symbol_less() {
  int x = f(), y = f();
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{conj_$9{int}}}
  clang_analyzer_dump(x < y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) < 0}}
}

void compare_different_symbol_plus_left_int_less() {
  int x = f()+1, y = f();
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_dump(y); // expected-warning{{conj_$9{int}}}
  clang_analyzer_dump(x < y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) > 1}}
}

void compare_different_symbol_minus_left_int_less() {
  int x = f()-1, y = f();
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_dump(y); // expected-warning{{conj_$9{int}}}
  clang_analyzer_dump(x < y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) < 1}}
}

void compare_different_symbol_plus_right_int_less() {
  int x = f(), y = f()+2;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) + 2}}
  clang_analyzer_dump(x < y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) < 2}}
}

void compare_different_symbol_minus_right_int_less() {
  int x = f(), y = f()-2;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) - 2}}
  clang_analyzer_dump(x < y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) > 2}}
}

void compare_different_symbol_plus_left_plus_right_int_less() {
  int x = f()+2, y = f()+1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) + 1}}
  clang_analyzer_dump(x < y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) > 1}}
}

void compare_different_symbol_plus_left_minus_right_int_less() {
  int x = f()+2, y = f()-1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) - 1}}
  clang_analyzer_dump(x < y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) > 3}}
}

void compare_different_symbol_minus_left_plus_right_int_less() {
  int x = f()-2, y = f()+1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) + 1}}
  clang_analyzer_dump(x < y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) < 3}}
}

void compare_different_symbol_minus_left_minus_right_int_less() {
  int x = f()-2, y = f()-1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) - 1}}
  clang_analyzer_dump(x < y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) < 1}}
}

void compare_same_symbol_less() {
  int x = f(), y = x;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{conj_$2{int}}}
  clang_analyzer_eval(x < y);
  // expected-warning@-1{{FALSE}}
}

void compare_same_symbol_plus_left_int_less() {
  int x = f(), y = x;
  ++x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_dump(y); // expected-warning{{conj_$2{int}}}
  clang_analyzer_eval(x < y);
  // expected-warning@-1{{FALSE}}
}

void compare_same_symbol_minus_left_int_less() {
  int x = f(), y = x;
  --x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_dump(y); // expected-warning{{conj_$2{int}}}
  clang_analyzer_eval(x < y);
  // expected-warning@-1{{TRUE}}
}

void compare_same_symbol_plus_right_int_less() {
  int x = f(), y = x+1;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_eval(x < y);
  // expected-warning@-1{{TRUE}}
}

void compare_same_symbol_minus_right_int_less() {
  int x = f(), y = x-1;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_eval(x < y);
  // expected-warning@-1{{FALSE}}
}

void compare_same_symbol_plus_left_plus_right_int_less() {
  int x = f(), y = x+1;
  ++x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_eval(x < y);
  // expected-warning@-1{{FALSE}}
}

void compare_same_symbol_plus_left_minus_right_int_less() {
  int x = f(), y = x-1;
  ++x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_eval(x < y);
  // expected-warning@-1{{FALSE}}
}

void compare_same_symbol_minus_left_plus_right_int_less() {
  int x = f(), y = x+1;
  --x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_eval(x < y);
  // expected-warning@-1{{TRUE}}
}

void compare_same_symbol_minus_left_minus_right_int_less() {
  int x = f(), y = x-1;
  --x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_eval(x < y);
  // expected-warning@-1{{FALSE}}
}

void compare_different_symbol_equal_unsigned() {
  unsigned x = f(), y = f();
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{conj_$9{int}}}
  clang_analyzer_dump(x == y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) == 0}}
}

void compare_different_symbol_plus_left_int_equal_unsigned() {
  unsigned x = f()+1, y = f();
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_dump(y); // expected-warning{{conj_$9{int}}}
  clang_analyzer_dump(x == y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) == 1}}
}

void compare_different_symbol_minus_left_int_equal_unsigned() {
  unsigned x = f()-1, y = f();
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_dump(y); // expected-warning{{conj_$9{int}}}
  clang_analyzer_dump(x == y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) == 1}}
}

void compare_different_symbol_plus_right_int_equal_unsigned() {
  unsigned x = f(), y = f()+2;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) + 2}}
  clang_analyzer_dump(x == y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) == 2}}
}

void compare_different_symbol_minus_right_int_equal_unsigned() {
  unsigned x = f(), y = f()-2;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) - 2}}
  clang_analyzer_dump(x == y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) == 2}}
}

void compare_different_symbol_plus_left_plus_right_int_equal_unsigned() {
  unsigned x = f()+2, y = f()+1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) + 1}}
  clang_analyzer_dump(x == y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) == 1}}
}

void compare_different_symbol_plus_left_minus_right_int_equal_unsigned() {
  unsigned x = f()+2, y = f()-1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) - 1}}
  clang_analyzer_dump(x == y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) == 3}}
}

void compare_different_symbol_minus_left_plus_right_int_equal_unsigned() {
  unsigned x = f()-2, y = f()+1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) + 1}}
  clang_analyzer_dump(x == y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) == 3}}
}

void compare_different_symbol_minus_left_minus_right_int_equal_unsigned() {
  unsigned x = f()-2, y = f()-1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) - 1}}
  clang_analyzer_dump(x == y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) == 1}}
}

void compare_same_symbol_equal_unsigned() {
  unsigned x = f(), y = x;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{conj_$2{int}}}
  clang_analyzer_eval(x == y);
  // expected-warning@-1{{TRUE}}
}

void compare_same_symbol_plus_left_int_equal_unsigned() {
  unsigned x = f(), y = x;
  ++x;
  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{{((conj_$2{int}) + 1U) == (conj_$2{int})}}
}

void compare_same_symbol_minus_left_int_equal_unsigned() {
  unsigned x = f(), y = x;
  --x;
  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{{((conj_$2{int}) - 1U) == (conj_$2{int})}}
}

void compare_same_symbol_plus_right_int_equal_unsigned() {
  unsigned x = f(), y = x+1;
  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{{(conj_$2{int}) == ((conj_$2{int}) + 1U)}}
}

void compare_same_symbol_minus_right_int_equal_unsigned() {
  unsigned x = f(), y = x-1;
  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{{(conj_$2{int}) == ((conj_$2{int}) - 1U)}}
}

void compare_same_symbol_plus_left_plus_right_int_equal_unsigned() {
  unsigned x = f(), y = x+1;
  ++x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_eval(x == y);
  // expected-warning@-1{{TRUE}}
}

void compare_same_symbol_plus_left_minus_right_int_equal_unsigned() {
  unsigned x = f(), y = x-1;
  ++x;
  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{{((conj_$2{int}) + 1U) == ((conj_$2{int}) - 1U)}}
}

void compare_same_symbol_minus_left_plus_right_int_equal_unsigned() {
  unsigned x = f(), y = x+1;
  --x;
  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{{((conj_$2{int}) - 1U) == ((conj_$2{int}) + 1U)}}
}

void compare_same_symbol_minus_left_minus_right_int_equal_unsigned() {
  unsigned x = f(), y = x-1;
  --x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_eval(x == y);
  // expected-warning@-1{{TRUE}}
}

void compare_different_symbol_less_or_equal_unsigned() {
  unsigned x = f(), y = f();
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{conj_$9{int}}}
  clang_analyzer_dump(x <= y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) <= 0}}
}

void compare_different_symbol_plus_left_int_less_or_equal_unsigned() {
  unsigned x = f()+1, y = f();
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_dump(y); // expected-warning{{conj_$9{int}}}
  clang_analyzer_dump(x <= y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) >= 1}}
}

void compare_different_symbol_minus_left_int_less_or_equal_unsigned() {
  unsigned x = f()-1, y = f();
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_dump(y); // expected-warning{{conj_$9{int}}}
  clang_analyzer_dump(x <= y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) <= 1}}
}

void compare_different_symbol_plus_right_int_less_or_equal_unsigned() {
  unsigned x = f(), y = f()+2;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) + 2}}
  clang_analyzer_dump(x <= y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) <= 2}}
}

void compare_different_symbol_minus_right_int_less_or_equal_unsigned() {
  unsigned x = f(), y = f()-2;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) - 2}}
  clang_analyzer_dump(x <= y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) >= 2}}
}

void compare_different_symbol_plus_left_plus_right_int_less_or_equal_unsigned() {
  unsigned x = f()+2, y = f()+1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) + 1}}
  clang_analyzer_dump(x <= y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) >= 1}}
}

void compare_different_symbol_plus_left_minus_right_int_less_or_equal_unsigned() {
  unsigned x = f()+2, y = f()-1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) - 1}}
  clang_analyzer_dump(x <= y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) >= 3}}
}

void compare_different_symbol_minus_left_plus_right_int_less_or_equal_unsigned() {
  unsigned x = f()-2, y = f()+1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) + 1}}
  clang_analyzer_dump(x <= y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) <= 3}}
}

void compare_different_symbol_minus_left_minus_right_int_less_or_equal_unsigned() {
  unsigned x = f()-2, y = f()-1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) - 1}}
  clang_analyzer_dump(x <= y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) <= 1}}
}

void compare_same_symbol_less_or_equal_unsigned() {
  unsigned x = f(), y = x;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{conj_$2{int}}}
  clang_analyzer_eval(x <= y);
  // expected-warning@-1{{TRUE}}
}

void compare_same_symbol_plus_left_int_less_or_equal_unsigned() {
  unsigned x = f(), y = x;
  ++x;
  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{{((conj_$2{int}) + 1U) <= (conj_$2{int})}}
}

void compare_same_symbol_minus_left_int_less_or_equal_unsigned() {
  unsigned x = f(), y = x;
  --x;
  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{{((conj_$2{int}) - 1U) <= (conj_$2{int})}}
}

void compare_same_symbol_plus_right_int_less_or_equal_unsigned() {
  unsigned x = f(), y = x+1;
  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{{(conj_$2{int}) <= ((conj_$2{int}) + 1U)}}
}

void compare_same_symbol_minus_right_int_less_or_equal_unsigned() {
  unsigned x = f(), y = x-1;
  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{{(conj_$2{int}) <= ((conj_$2{int}) - 1U)}}
}

void compare_same_symbol_plus_left_plus_right_int_less_or_equal_unsigned() {
  unsigned x = f(), y = x+1;
  ++x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_eval(x <= y);
  // expected-warning@-1{{TRUE}}
}

void compare_same_symbol_plus_left_minus_right_int_less_or_equal_unsigned() {
  unsigned x = f(), y = x-1;
  ++x;
  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{{((conj_$2{int}) + 1U) <= ((conj_$2{int}) - 1U)}}
}

void compare_same_symbol_minus_left_plus_right_int_less_or_equal_unsigned() {
  unsigned x = f(), y = x+1;
  --x;
  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{{((conj_$2{int}) - 1U) <= ((conj_$2{int}) + 1U)}}
}

void compare_same_symbol_minus_left_minus_right_int_less_or_equal_unsigned() {
  unsigned x = f(), y = x-1;
  --x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_eval(x <= y);
  // expected-warning@-1{{TRUE}}
}

void compare_different_symbol_less_unsigned() {
  unsigned x = f(), y = f();
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{conj_$9{int}}}
  clang_analyzer_dump(x < y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) < 0}}
}

void compare_different_symbol_plus_left_int_less_unsigned() {
  unsigned x = f()+1, y = f();
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_dump(y); // expected-warning{{conj_$9{int}}}
  clang_analyzer_dump(x < y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) > 1}}
}

void compare_different_symbol_minus_left_int_less_unsigned() {
  unsigned x = f()-1, y = f();
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_dump(y); // expected-warning{{conj_$9{int}}}
  clang_analyzer_dump(x < y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) < 1}}
}

void compare_different_symbol_plus_right_int_less_unsigned() {
  unsigned x = f(), y = f()+2;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) + 2}}
  clang_analyzer_dump(x < y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) < 2}}
}

void compare_different_symbol_minus_right_int_less_unsigned() {
  unsigned x = f(), y = f()-2;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) - 2}}
  clang_analyzer_dump(x < y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) > 2}}
}

void compare_different_symbol_plus_left_plus_right_int_less_unsigned() {
  unsigned x = f()+2, y = f()+1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) + 1}}
  clang_analyzer_dump(x < y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) > 1}}
}

void compare_different_symbol_plus_left_minus_right_int_less_unsigned() {
  unsigned x = f()+2, y = f()-1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) - 1}}
  clang_analyzer_dump(x < y);
  // expected-warning@-1{{((conj_$9{int}) - (conj_$2{int})) > 3}}
}

void compare_different_symbol_minus_left_plus_right_int_less_unsigned() {
  unsigned x = f()-2, y = f()+1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) + 1}}
  clang_analyzer_dump(x < y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) < 3}}
}

void compare_different_symbol_minus_left_minus_right_int_less_unsigned() {
  unsigned x = f()-2, y = f()-1;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 2}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$9{int}) - 1}}
  clang_analyzer_dump(x < y);
  // expected-warning@-1{{((conj_$2{int}) - (conj_$9{int})) < 1}}
}

void compare_same_symbol_less_unsigned() {
  unsigned x = f(), y = x;
  clang_analyzer_dump(x); // expected-warning{{conj_$2{int}}}
  clang_analyzer_dump(y); // expected-warning{{conj_$2{int}}}
  clang_analyzer_eval(x < y);
  // expected-warning@-1{{FALSE}}
}

void compare_same_symbol_plus_left_int_less_unsigned() {
  unsigned x = f(), y = x;
  ++x;
  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{{((conj_$2{int}) + 1U) < (conj_$2{int})}}
}

void compare_same_symbol_minus_left_int_less_unsigned() {
  unsigned x = f(), y = x;
  --x;
  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{{((conj_$2{int}) - 1U) < (conj_$2{int})}}
}

void compare_same_symbol_plus_right_int_less_unsigned() {
  unsigned x = f(), y = x+1;
  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{{(conj_$2{int}) < ((conj_$2{int}) + 1U)}}
}

void compare_same_symbol_minus_right_int_less_unsigned() {
  unsigned x = f(), y = x-1;
  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{{(conj_$2{int}) < ((conj_$2{int}) - 1U)}}
}

void compare_same_symbol_plus_left_plus_right_int_less_unsigned() {
  unsigned x = f(), y = x+1;
  ++x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) + 1}}
  clang_analyzer_eval(x < y);
  // expected-warning@-1{{FALSE}}
}

void compare_same_symbol_plus_left_minus_right_int_less_unsigned() {
  unsigned x = f(), y = x-1;
  ++x;
  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{{((conj_$2{int}) + 1U) < ((conj_$2{int}) - 1U)}}
}

void compare_same_symbol_minus_left_plus_right_int_less_unsigned() {
  unsigned x = f(), y = x+1;
  --x;
  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{{((conj_$2{int}) - 1U) < ((conj_$2{int}) + 1U)}}
}

void compare_same_symbol_minus_left_minus_right_int_less_unsigned() {
  unsigned x = f(), y = x-1;
  --x;
  clang_analyzer_dump(x); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_dump(y); // expected-warning{{(conj_$2{int}) - 1}}
  clang_analyzer_eval(x < y);
  // expected-warning@-1{{FALSE}}
}

void overflow(signed char n, signed char m) {
  if (n + 0 > m + 0) {
    clang_analyzer_eval(n - 126 == m + 3); // expected-warning{{UNKNOWN}}
  }
}

int mixed_integer_types(int x, int y) {
  short a = x - 1U;
  return a - y;
}

unsigned gu();
unsigned fu() {
  unsigned x = gu();
  // Assert that no overflows occur in this test file.
  // Assuming that concrete integers are also within that range.
  assert(x <= ((unsigned)UINT_MAX / 4));
  return x;
}

void unsigned_concrete_int_no_crash() {
  unsigned x = fu() + 1U, y = fu() + 1U;
  clang_analyzer_dump(x == y); // expected-warning {{((conj_$2{unsigned int}) + 1U) == ((conj_$7{unsigned int}) + 1U)}}
}
