1// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-config c++-inlining=constructors -verify %s
2
3void clang_analyzer_eval(bool);
4
5
6struct A {
7  int x;
8  A(int a) { x = a; }
9  int getx() const { return x; }
10};
11
12struct B{
13  int x;
14};
15
16void 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
22void f1() {
23  A x(3);
24  clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}}
25}
26
27void f2() {
28  const A &x = A(3);
29  clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}}
30}
31
32void f3() {
33  const A &x = (A)3;
34  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}}
40}
41
42void checkThatCopyConstructorDoesNotInvalidateObjectBeingCopied() {
43  B t;
44  t.x = 0;
45  B t2(t);
46  clang_analyzer_eval(t.x == 0); // expected-warning{{TRUE}}
47}
48