| // RUN: %clang_analyze_cc1 -analyzer-checker=core -verify %s | |
| struct A { | |
| int a; | |
| struct { | |
| struct { | |
| int b; | |
| union { | |
| int c; | |
| }; | |
| }; | |
| }; | |
| }; | |
| int testCrash() { | |
| int *x = 0; | |
| int A::*ap = &A::a; | |
| if (ap) // no crash | |
| return *x; // expected-warning{{Dereference of null pointer (loaded from variable 'x')}} | |
| return 10; | |
| } | |
| int testIndirectCrash() { | |
| int *x = 0; | |
| int A::*cp = &A::c; | |
| if (cp) // no crash | |
| return *x; // expected-warning{{Dereference of null pointer (loaded from variable 'x')}} | |
| return 10; | |
| } | |
| // PR46264 | |
| // This case shall not crash with an assertion failure about void* dereferening. | |
| namespace ns1 { | |
| namespace a { | |
| class b { | |
| public: | |
| typedef int b::*c; | |
| operator c() { return d ? &b::d : 0; } | |
| int d; | |
| }; | |
| } // namespace a | |
| using a::b; | |
| class e { | |
| void f(); | |
| void g(); | |
| b h; | |
| }; | |
| void e::f() { | |
| e *i; | |
| if (h) | |
| i->g(); // expected-warning{{Called C++ object pointer is uninitialized}} | |
| } | |
| } // namespace ns1 |