1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-ipa=inlining -verify %s 2 3 void clang_analyzer_eval(bool); 4 5 class A { 6 public: 7 int getZero() { return 0; } 8 virtual int getNum() { return 0; } 9 }; 10 11 void test(A &a) { 12 clang_analyzer_eval(a.getZero() == 0); // expected-warning{{TRUE}} 13 clang_analyzer_eval(a.getNum() == 0); // expected-warning{{UNKNOWN}} 14 15 A copy(a); 16 clang_analyzer_eval(copy.getZero() == 0); // expected-warning{{TRUE}} 17 clang_analyzer_eval(copy.getNum() == 0); // expected-warning{{TRUE}} 18 } 19 20 21 class One : public A { 22 public: 23 virtual int getNum() { return 1; } 24 }; 25 26 void testPathSensitivity(int x) { 27 A a; 28 One b; 29 30 A *ptr; 31 switch (x) { 32 case 0: 33 ptr = &a; 34 break; 35 case 1: 36 ptr = &b; 37 break; 38 default: 39 return; 40 } 41 42 // This should be true on both branches. 43 clang_analyzer_eval(ptr->getNum() == x); // expected-warning {{TRUE}} 44 } 45 46