48 lines · cpp
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-config c++-inlining=constructors -verify %s2 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 doing19 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