| // RUN: %clang_cc1 -analyze -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}} |
| } |