// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-config c++-inlining=constructors -verify %s

void clang_analyzer_eval(bool);


struct A {
  int x;
  A(int a) { x = a; }
  int getx() const { return x; }
};

struct B{
  int x;
};

void testNullObject(A *a) {
  clang_analyzer_eval(a); // expected-warning{{UNKNOWN}}
  (void)a->getx(); // assume we know what we're doing
  clang_analyzer_eval(a); // expected-warning{{TRUE}}
}

void f1() {
  A x(3);
  clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}}
}

void f2() {
  const A &x = A(3);
  clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}}
}

void f3() {
  const A &x = (A)3;
  clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}}
}

void f4() {
  A x = 3;
  clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}}
}

void checkThatCopyConstructorDoesNotInvalidateObjectBeingCopied() {
  B t;
  t.x = 0;
  B t2(t);
  clang_analyzer_eval(t.x == 0); // expected-warning{{TRUE}}
}
