blob: 95db452aec6ab4c755ead760bbb5f8ba77e99aff [file] [log] [blame]
Anna Zaksbfa9ab82013-01-24 23:15:30 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-config c++-inlining=constructors -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
Anna Zaks3719ed22012-10-31 01:18:26 +000012struct B{
13 int x;
14};
15
Jordan Rose7f660852012-08-15 21:56:23 +000016void testNullObject(A *a) {
17 clang_analyzer_eval(a); // expected-warning{{UNKNOWN}}
18 (void)a->getx(); // assume we know what we're doing
19 clang_analyzer_eval(a); // expected-warning{{TRUE}}
20}
21
Zhongxing Xu40ab43b2010-04-20 05:48:57 +000022void f1() {
23 A x(3);
Jordan Rosec210cb72012-08-27 17:50:07 +000024 clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}}
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 Rosec210cb72012-08-27 17:50:07 +000029 clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}}
Zhongxing Xu0e38d5d2010-11-25 03:18:57 +000030}
31
Argyrios Kyrtzidisb76fdf62011-02-19 01:08:37 +000032void f3() {
33 const A &x = (A)3;
Jordan Rosec210cb72012-08-27 17:50:07 +000034 clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}}
35}
36
37void f4() {
38 A x = 3;
39 clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}}
Argyrios Kyrtzidisb76fdf62011-02-19 01:08:37 +000040}
Anna Zaks3719ed22012-10-31 01:18:26 +000041
42void checkThatCopyConstructorDoesNotInvalidateObjectBeingCopied() {
43 B t;
44 t.x = 0;
45 B t2(t);
46 clang_analyzer_eval(t.x == 0); // expected-warning{{TRUE}}
47}