| // 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}} | |
| } |