xref: /llvm-project/clang/test/Analysis/method-call.cpp (revision 184c6242faca0be0188611d45b41235e68ef282a)
1*184c6242SDominic Chen // RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-config c++-inlining=constructors -verify %s
2627a1868SZhongxing Xu 
36d5a8caaSJordy Rose void clang_analyzer_eval(bool);
46d5a8caaSJordy Rose 
583e4049dSJordan Rose 
652c28fe6SZhongxing Xu struct A {
752c28fe6SZhongxing Xu   int x;
AA852c28fe6SZhongxing Xu   A(int a) { x = a; }
getxA98be65a79SZhongxing Xu   int getx() const { return x; }
1052c28fe6SZhongxing Xu };
1152c28fe6SZhongxing Xu 
127bd0674dSAnna Zaks struct B{
137bd0674dSAnna Zaks   int x;
147bd0674dSAnna Zaks };
157bd0674dSAnna Zaks 
testNullObject(A * a)1683e4049dSJordan Rose void testNullObject(A *a) {
1783e4049dSJordan Rose   clang_analyzer_eval(a); // expected-warning{{UNKNOWN}}
1883e4049dSJordan Rose   (void)a->getx(); // assume we know what we're doing
1983e4049dSJordan Rose   clang_analyzer_eval(a); // expected-warning{{TRUE}}
2083e4049dSJordan Rose }
2183e4049dSJordan Rose 
f1()2252c28fe6SZhongxing Xu void f1() {
2352c28fe6SZhongxing Xu   A x(3);
24c9318304SJordan Rose   clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}}
2552c28fe6SZhongxing Xu }
2652c28fe6SZhongxing Xu 
f2()2733f13595SZhongxing Xu void f2() {
2833f13595SZhongxing Xu   const A &x = A(3);
29c9318304SJordan Rose   clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}}
3033f13595SZhongxing Xu }
3133f13595SZhongxing Xu 
f3()321227f3afSArgyrios Kyrtzidis void f3() {
331227f3afSArgyrios Kyrtzidis   const A &x = (A)3;
34c9318304SJordan Rose   clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}}
35c9318304SJordan Rose }
36c9318304SJordan Rose 
f4()37c9318304SJordan Rose void f4() {
38c9318304SJordan Rose   A x = 3;
39c9318304SJordan Rose   clang_analyzer_eval(x.getx() == 3); // expected-warning{{TRUE}}
401227f3afSArgyrios Kyrtzidis }
417bd0674dSAnna Zaks 
checkThatCopyConstructorDoesNotInvalidateObjectBeingCopied()427bd0674dSAnna Zaks void checkThatCopyConstructorDoesNotInvalidateObjectBeingCopied() {
437bd0674dSAnna Zaks   B t;
447bd0674dSAnna Zaks   t.x = 0;
457bd0674dSAnna Zaks   B t2(t);
467bd0674dSAnna Zaks   clang_analyzer_eval(t.x == 0); // expected-warning{{TRUE}}
477bd0674dSAnna Zaks }
48