blob: d16eeaf619b09c301d03a2c88ab820a7304a5d6b [file] [log] [blame]
Jordan Rosec36b30c2012-07-12 00:16:25 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-ipa=inlining -verify %s
2
3void clang_analyzer_eval(bool);
4
5class A {
6public:
7 int getZero() { return 0; }
8 virtual int getNum() { return 0; }
9};
10
11void 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
21class One : public A {
22public:
23 virtual int getNum() { return 1; }
24};
25
26void 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