1de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-ipa=inlining -analyzer-config c++-inlining=constructors -verify %s
27ce351db56fbce162a3b650518ce05b5c61ebf36Zhongxing Xu
343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rosevoid clang_analyzer_eval(bool);
443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose
57f660857309a14c036a80ef90b40bf8f68fda9daJordan Rose
640ab43b29bff9a240e5281e5952f59ddee623fcaZhongxing Xustruct A {
740ab43b29bff9a240e5281e5952f59ddee623fcaZhongxing Xu  int x;
840ab43b29bff9a240e5281e5952f59ddee623fcaZhongxing Xu  A(int a) { x = a; }
932303020d0f1a21cbcab65ae0c69a4218dc8f0fbZhongxing Xu  int getx() const { return x; }
1040ab43b29bff9a240e5281e5952f59ddee623fcaZhongxing Xu};
1140ab43b29bff9a240e5281e5952f59ddee623fcaZhongxing Xu
127f660857309a14c036a80ef90b40bf8f68fda9daJordan Rosevoid testNullObject(A *a) {
137f660857309a14c036a80ef90b40bf8f68fda9daJordan Rose  clang_analyzer_eval(a); // expected-warning{{UNKNOWN}}
147f660857309a14c036a80ef90b40bf8f68fda9daJordan Rose  (void)a->getx(); // assume we know what we're doing
157f660857309a14c036a80ef90b40bf8f68fda9daJordan Rose  clang_analyzer_eval(a); // expected-warning{{TRUE}}
167f660857309a14c036a80ef90b40bf8f68fda9daJordan Rose}
177f660857309a14c036a80ef90b40bf8f68fda9daJordan Rose
1840ab43b29bff9a240e5281e5952f59ddee623fcaZhongxing Xuvoid f1() {
1940ab43b29bff9a240e5281e5952f59ddee623fcaZhongxing Xu  A x(3);
20c210cb7a358d14cdd93b58562f33ff5ed2d895c1Jordan Rose  clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}}
2140ab43b29bff9a240e5281e5952f59ddee623fcaZhongxing Xu}
2240ab43b29bff9a240e5281e5952f59ddee623fcaZhongxing Xu
230e38d5d6775a26f8f39df353e34b0dc14c2d6cfcZhongxing Xuvoid f2() {
240e38d5d6775a26f8f39df353e34b0dc14c2d6cfcZhongxing Xu  const A &x = A(3);
25c210cb7a358d14cdd93b58562f33ff5ed2d895c1Jordan Rose  clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}}
260e38d5d6775a26f8f39df353e34b0dc14c2d6cfcZhongxing Xu}
270e38d5d6775a26f8f39df353e34b0dc14c2d6cfcZhongxing Xu
28b76fdf69df5f35c3af9ebe3afc72b0d3c9bf76e7Argyrios Kyrtzidisvoid f3() {
29b76fdf69df5f35c3af9ebe3afc72b0d3c9bf76e7Argyrios Kyrtzidis  const A &x = (A)3;
30c210cb7a358d14cdd93b58562f33ff5ed2d895c1Jordan Rose  clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}}
31c210cb7a358d14cdd93b58562f33ff5ed2d895c1Jordan Rose}
32c210cb7a358d14cdd93b58562f33ff5ed2d895c1Jordan Rose
33c210cb7a358d14cdd93b58562f33ff5ed2d895c1Jordan Rosevoid f4() {
34c210cb7a358d14cdd93b58562f33ff5ed2d895c1Jordan Rose  A x = 3;
35c210cb7a358d14cdd93b58562f33ff5ed2d895c1Jordan Rose  clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}}
36b76fdf69df5f35c3af9ebe3afc72b0d3c9bf76e7Argyrios Kyrtzidis}
37