1 // RUN: %clang_analyze_cc1 -analyzer-checker=core -verify %s
2 
3 // rdar://problem/64202361
4 
5 struct A {
6   int a;
7   struct {
8     struct {
9       int b;
10       union {
11         int c;
12       };
13     };
14   };
15 };
16 
testCrash()17 int testCrash() {
18   int *x = 0;
19   int A::*ap = &A::a;
20 
21   if (ap)      // no crash
22     return *x; // expected-warning{{Dereference of null pointer (loaded from variable 'x')}}
23 
24   return 10;
25 }
26 
testIndirectCrash()27 int testIndirectCrash() {
28   int *x = 0;
29   int A::*cp = &A::c;
30 
31   if (cp)      // no crash
32     return *x; // expected-warning{{Dereference of null pointer (loaded from variable 'x')}}
33 
34   return 10;
35 }
36 
37 // PR46264
38 // This case shall not crash with an assertion failure about void* dereferening.
39 namespace ns1 {
40 namespace a {
41 class b {
42 public:
43   typedef int b::*c;
operator c()44   operator c() { return d ? &b::d : 0; }
45   int d;
46 };
47 } // namespace a
48 using a::b;
49 class e {
50   void f();
51   void g();
52   b h;
53 };
f()54 void e::f() {
55   e *i;
56   if (h)
57     i->g(); // expected-warning{{Called C++ object pointer is uninitialized}}
58 }
59 } // namespace ns1
60