blob: 4f6a9a430a78e6e1c15a6dbd6ee3bffa4ac21039 [file] [log] [blame]
Dominic Chen184c6242017-03-03 18:02:02 +00001// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-config c++-inlining=constructors -verify %s
Zhongxing Xu627a1862010-11-01 09:09:44 +00002
Jordy Rose6d5a8ca2012-05-16 16:01:10 +00003void clang_analyzer_eval(bool);
4
Jordan Rose83e40492012-08-15 21:56:23 +00005
Zhongxing Xu52c28fe2010-04-20 05:48:57 +00006struct A {
7 int x;
8 A(int a) { x = a; }
Zhongxing Xu8be65a72010-11-24 13:48:50 +00009 int getx() const { return x; }
Zhongxing Xu52c28fe2010-04-20 05:48:57 +000010};
11
Anna Zaks7bd06742012-10-31 01:18:26 +000012struct B{
13 int x;
14};
15
Jordan Rose83e40492012-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 Xu52c28fe2010-04-20 05:48:57 +000022void f1() {
23 A x(3);
Jordan Rosec9318302012-08-27 17:50:07 +000024 clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}}
Zhongxing Xu52c28fe2010-04-20 05:48:57 +000025}
26
Zhongxing Xu33f13592010-11-25 03:18:57 +000027void f2() {
28 const A &x = A(3);
Jordan Rosec9318302012-08-27 17:50:07 +000029 clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}}
Zhongxing Xu33f13592010-11-25 03:18:57 +000030}
31
Argyrios Kyrtzidis1227f3a2011-02-19 01:08:37 +000032void f3() {
33 const A &x = (A)3;
Jordan Rosec9318302012-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 Kyrtzidis1227f3a2011-02-19 01:08:37 +000040}
Anna Zaks7bd06742012-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}