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