blob: 912062739c340a88f850e75782fea95a36d2dc73 [file] [log] [blame]
Jordy Rose43d9f0d2012-05-16 16:01:10 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-ipa=inlining -analyzer-store region -verify %s
Zhongxing Xu7ce351d2010-11-01 09:09:44 +00002
Jordy Rose43d9f0d2012-05-16 16:01:10 +00003void clang_analyzer_eval(bool);
4
Jordan Rose7f660852012-08-15 21:56:23 +00005
Zhongxing Xu40ab43b2010-04-20 05:48:57 +00006struct A {
7 int x;
8 A(int a) { x = a; }
Zhongxing Xu32303022010-11-24 13:48:50 +00009 int getx() const { return x; }
Zhongxing Xu40ab43b2010-04-20 05:48:57 +000010};
11
Jordan Rose7f660852012-08-15 21:56:23 +000012void testNullObject(A *a) {
13 clang_analyzer_eval(a); // expected-warning{{UNKNOWN}}
14 (void)a->getx(); // assume we know what we're doing
15 clang_analyzer_eval(a); // expected-warning{{TRUE}}
16}
17
18
19// FIXME: These require constructor inlining to be enabled.
20
Zhongxing Xu40ab43b2010-04-20 05:48:57 +000021void f1() {
22 A x(3);
Jordan Rose7f660852012-08-15 21:56:23 +000023 // should be TRUE
24 clang_analyzer_eval(x.getx() == 3); // expected-warning{{UNKNOWN}}
Zhongxing Xu40ab43b2010-04-20 05:48:57 +000025}
26
Zhongxing Xu0e38d5d2010-11-25 03:18:57 +000027void f2() {
28 const A &x = A(3);
Jordan Rose7f660852012-08-15 21:56:23 +000029 // should be TRUE
30 clang_analyzer_eval(x.getx() == 3); // expected-warning{{UNKNOWN}}
Zhongxing Xu0e38d5d2010-11-25 03:18:57 +000031}
32
Argyrios Kyrtzidisb76fdf62011-02-19 01:08:37 +000033void f3() {
34 const A &x = (A)3;
Jordan Rose7f660852012-08-15 21:56:23 +000035 // should be TRUE
36 clang_analyzer_eval(x.getx() == 3); // expected-warning{{UNKNOWN}}
Argyrios Kyrtzidisb76fdf62011-02-19 01:08:37 +000037}