1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-config c++-inlining=constructors -verify %s 2 3 void clang_analyzer_eval(bool); 4 5 6 struct A { 7 int x; AA8 A(int a) { x = a; } getxA9 int getx() const { return x; } 10 }; 11 12 struct B{ 13 int x; 14 }; 15 testNullObject(A * a)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 f1()22void f1() { 23 A x(3); 24 clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}} 25 } 26 f2()27void f2() { 28 const A &x = A(3); 29 clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}} 30 } 31 f3()32void f3() { 33 const A &x = (A)3; 34 clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}} 35 } 36 f4()37void f4() { 38 A x = 3; 39 clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}} 40 } 41 checkThatCopyConstructorDoesNotInvalidateObjectBeingCopied()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