19cbfdde2SValeriy Savchenko // RUN: %clang_analyze_cc1 -analyzer-checker=core -verify %s
29cbfdde2SValeriy Savchenko 
39cbfdde2SValeriy Savchenko // rdar://problem/64202361
49cbfdde2SValeriy Savchenko 
59cbfdde2SValeriy Savchenko struct A {
69cbfdde2SValeriy Savchenko   int a;
79cbfdde2SValeriy Savchenko   struct {
89cbfdde2SValeriy Savchenko     struct {
99cbfdde2SValeriy Savchenko       int b;
109cbfdde2SValeriy Savchenko       union {
119cbfdde2SValeriy Savchenko         int c;
129cbfdde2SValeriy Savchenko       };
139cbfdde2SValeriy Savchenko     };
149cbfdde2SValeriy Savchenko   };
159cbfdde2SValeriy Savchenko };
169cbfdde2SValeriy Savchenko 
testCrash()179cbfdde2SValeriy Savchenko int testCrash() {
189cbfdde2SValeriy Savchenko   int *x = 0;
199cbfdde2SValeriy Savchenko   int A::*ap = &A::a;
209cbfdde2SValeriy Savchenko 
219cbfdde2SValeriy Savchenko   if (ap)      // no crash
229cbfdde2SValeriy Savchenko     return *x; // expected-warning{{Dereference of null pointer (loaded from variable 'x')}}
239cbfdde2SValeriy Savchenko 
249cbfdde2SValeriy Savchenko   return 10;
259cbfdde2SValeriy Savchenko }
269cbfdde2SValeriy Savchenko 
testIndirectCrash()279cbfdde2SValeriy Savchenko int testIndirectCrash() {
289cbfdde2SValeriy Savchenko   int *x = 0;
299cbfdde2SValeriy Savchenko   int A::*cp = &A::c;
309cbfdde2SValeriy Savchenko 
319cbfdde2SValeriy Savchenko   if (cp)      // no crash
329cbfdde2SValeriy Savchenko     return *x; // expected-warning{{Dereference of null pointer (loaded from variable 'x')}}
339cbfdde2SValeriy Savchenko 
349cbfdde2SValeriy Savchenko   return 10;
359cbfdde2SValeriy Savchenko }
36*497b1b95SDenys Petrov 
37*497b1b95SDenys Petrov // PR46264
38*497b1b95SDenys Petrov // This case shall not crash with an assertion failure about void* dereferening.
39*497b1b95SDenys Petrov namespace ns1 {
40*497b1b95SDenys Petrov namespace a {
41*497b1b95SDenys Petrov class b {
42*497b1b95SDenys Petrov public:
43*497b1b95SDenys Petrov   typedef int b::*c;
operator c()44*497b1b95SDenys Petrov   operator c() { return d ? &b::d : 0; }
45*497b1b95SDenys Petrov   int d;
46*497b1b95SDenys Petrov };
47*497b1b95SDenys Petrov } // namespace a
48*497b1b95SDenys Petrov using a::b;
49*497b1b95SDenys Petrov class e {
50*497b1b95SDenys Petrov   void f();
51*497b1b95SDenys Petrov   void g();
52*497b1b95SDenys Petrov   b h;
53*497b1b95SDenys Petrov };
f()54*497b1b95SDenys Petrov void e::f() {
55*497b1b95SDenys Petrov   e *i;
56*497b1b95SDenys Petrov   if (h)
57*497b1b95SDenys Petrov     i->g(); // expected-warning{{Called C++ object pointer is uninitialized}}
58*497b1b95SDenys Petrov }
59*497b1b95SDenys Petrov } // namespace ns1
60