1 // RUN: %clang_analyze_cc1 %s \ 2 // RUN: -analyzer-checker=core,debug.ExprInspection \ 3 // RUN: -analyzer-config eagerly-assume=false \ 4 // RUN: -verify 5 6 void clang_analyzer_eval(int); 7 void clang_analyzer_dump(int); 8 9 int test(int x, int y) { 10 11 clang_analyzer_dump(-x); // expected-warning{{-reg_$0<int x>}} 12 clang_analyzer_dump(~x); // expected-warning{{~reg_$0<int x>}} 13 int z = x + y; 14 clang_analyzer_dump(-z); // expected-warning{{-((reg_$0<int x>) + (reg_$3<int y>))}} 15 clang_analyzer_dump(-(x + y)); // expected-warning{{-((reg_$0<int x>) + (reg_$3<int y>))}} 16 clang_analyzer_dump(-x + y); // expected-warning{{(-reg_$0<int x>) + (reg_$3<int y>)}} 17 18 if (-x == 0) { 19 clang_analyzer_eval(-x == 0); // expected-warning{{TRUE}} 20 clang_analyzer_eval(-x > 0); // expected-warning{{FALSE}} 21 clang_analyzer_eval(-x < 0); // expected-warning{{FALSE}} 22 } 23 if (~y == 0) { 24 clang_analyzer_eval(~y == 0); // expected-warning{{TRUE}} 25 clang_analyzer_eval(~y > 0); // expected-warning{{FALSE}} 26 clang_analyzer_eval(~y < 0); // expected-warning{{FALSE}} 27 } 28 (void)(x); 29 return 42; 30 } 31 32 void test_svalbuilder_simplification_add(int x, int y) { 33 if (x + y != 3) 34 return; 35 clang_analyzer_eval(-(x + y) == -3); // expected-warning{{TRUE}} 36 clang_analyzer_eval(-(y + x) == -3); // expected-warning{{TRUE}} 37 } 38 39 void test_svalbuilder_simplification_mul(int x, int y) { 40 if (x * y != 3) 41 return; 42 clang_analyzer_eval(-(x * y) == -3); // expected-warning{{TRUE}} 43 clang_analyzer_eval(-(y * x) == -3); // expected-warning{{TRUE}} 44 } 45 46 void test_svalbuilder_simplification_and(int x, int y) { 47 if ((x & y) != 3) 48 return; 49 clang_analyzer_eval(-(x & y) == -3); // expected-warning{{TRUE}} 50 clang_analyzer_eval(-(y & x) == -3); // expected-warning{{TRUE}} 51 } 52 53 void test_svalbuilder_simplification_or(int x, int y) { 54 if ((x | y) != 3) 55 return; 56 clang_analyzer_eval(-(x | y) == -3); // expected-warning{{TRUE}} 57 clang_analyzer_eval(-(y | x) == -3); // expected-warning{{TRUE}} 58 } 59 60 void test_svalbuilder_simplification_xor(int x, int y) { 61 if ((x ^ y) != 3) 62 return; 63 clang_analyzer_eval(-(x ^ y) == -3); // expected-warning{{TRUE}} 64 clang_analyzer_eval(-(y ^ x) == -3); // expected-warning{{TRUE}} 65 } 66 67 int test_fp(int flag) { 68 int value; 69 if (flag == 0) 70 value = 1; 71 if (-flag == 0) 72 return value; // no-warning 73 return 42; 74 } 75