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