1184c6242SDominic Chen // RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-output=text -verify %s
239165091SGeorge Karpenkov // RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-output=plist-multi-file  %s -o %t.plist
3*61c848d2SHubert Tong // RUN: %normalize_plist <%t.plist | diff -ub %S/Inputs/expected-plists/method-call-path-notes.cpp.plist -
492e1449bSJordan Rose 
592e1449bSJordan Rose // Test warning about null or uninitialized pointer values used as instance member
692e1449bSJordan Rose // calls.
792e1449bSJordan Rose class TestInstanceCall {
892e1449bSJordan Rose public:
foo()992e1449bSJordan Rose   void foo() {}
1092e1449bSJordan Rose };
1192e1449bSJordan Rose 
test_ic()1292e1449bSJordan Rose void test_ic() {
1337c777ecSTed Kremenek   TestInstanceCall *p; // expected-note {{'p' declared without an initial value}}
1492e1449bSJordan Rose   p->foo(); // expected-warning {{Called C++ object pointer is uninitialized}} expected-note {{Called C++ object pointer is uninitialized}}
1592e1449bSJordan Rose }
1692e1449bSJordan Rose 
test_ic_null()1792e1449bSJordan Rose void test_ic_null() {
1837c777ecSTed Kremenek   TestInstanceCall *p = 0; // expected-note {{'p' initialized to a null pointer value}}
1992e1449bSJordan Rose   p->foo(); // expected-warning {{Called C++ object pointer is null}} expected-note {{Called C++ object pointer is null}}
2092e1449bSJordan Rose }
2192e1449bSJordan Rose 
test_ic_set_to_null()2292e1449bSJordan Rose void test_ic_set_to_null() {
2392e1449bSJordan Rose   TestInstanceCall *p;
2492e1449bSJordan Rose   p = 0; // expected-note {{Null pointer value stored to 'p'}}
2592e1449bSJordan Rose   p->foo(); // expected-warning {{Called C++ object pointer is null}} expected-note {{Called C++ object pointer is null}}
2692e1449bSJordan Rose }
2792e1449bSJordan Rose 
test_ic_null(TestInstanceCall * p)2892e1449bSJordan Rose void test_ic_null(TestInstanceCall *p) {
29a5958869STed Kremenek   if (!p) // expected-note {{Assuming 'p' is null}} expected-note {{Taking true branch}}
3092e1449bSJordan Rose     p->foo(); // expected-warning {{Called C++ object pointer is null}} expected-note{{Called C++ object pointer is null}}
3192e1449bSJordan Rose }
3292e1449bSJordan Rose 
test_ic_member_ptr()3392e1449bSJordan Rose void test_ic_member_ptr() {
3437c777ecSTed Kremenek   TestInstanceCall *p = 0; // expected-note {{'p' initialized to a null pointer value}}
3592e1449bSJordan Rose   typedef void (TestInstanceCall::*IC_Ptr)();
3692e1449bSJordan Rose   IC_Ptr bar = &TestInstanceCall::foo;
3792e1449bSJordan Rose   (p->*bar)(); // expected-warning {{Called C++ object pointer is null}} expected-note{{Called C++ object pointer is null}}
3892e1449bSJordan Rose }
39a3e3343eSJordan Rose 
test_cast(const TestInstanceCall * p)406ee44e1fSJordan Rose void test_cast(const TestInstanceCall *p) {
41a5958869STed Kremenek   if (!p) // expected-note {{Assuming 'p' is null}} expected-note {{Taking true branch}}
426ee44e1fSJordan Rose     const_cast<TestInstanceCall *>(p)->foo(); // expected-warning {{Called C++ object pointer is null}} expected-note {{Called C++ object pointer is null}}
436ee44e1fSJordan Rose }
446ee44e1fSJordan Rose 
45