Compiler projects using llvm
// RUN: %clang_analyze_cc1 -verify %s \
// RUN:   -analyzer-checker core,debug.ExprInspection

// Stuff that used to hang.

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__))

void clang_analyzer_eval(int);

int g(void);

int f(int y) {
  return y + g();
}

int produce_a_very_large_symbol(int x) {
  return f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(
             f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(x))))))))))))))))))))))))))))))));
}

void produce_an_exponentially_exploding_symbol(int x, int y) {
  x += y; y += x + g();
  x += y; y += x + g();
  x += y; y += x + g();
  x += y; y += x + g();
  x += y; y += x + g();
  x += y; y += x + g();
  x += y; y += x + g();
  x += y; y += x + g();
  x += y; y += x + g();
  x += y; y += x + g();
  x += y; y += x + g();
}

void produce_an_exponentially_exploding_symbol_2(int x, int y) {
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  if (x > 1) {
    if (x > 2) {
      if (x > 3) {
        if (x > 4) {
          if (x > 5) {
            if (x > 6) {
              if (x > 7) {
                if (x > 8) {
                  if (x > 9) {
                    if (x > 10) {
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

void produce_an_exponentially_exploding_symbol_3(int x, int y) {
  assert(0 < x && x < 10);
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  x &= y;
  y &= x & g();
  clang_analyzer_eval(0 < x && x < 10); // expected-warning{{TRUE}}
                                        // expected-warning@-1{{FALSE}}
}