1bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -verify %s
265f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -DCONSTRUCTORS=1 -analyzer-config c++-inlining=constructors -verify %s
3b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
4b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rosevoid clang_analyzer_eval(bool);
5f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rosevoid clang_analyzer_checkInlined(bool);
64fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
74fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuclass A {
84fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuprotected:
94fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  int x;
104fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu};
114fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
124fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuclass B : public A {
134fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xupublic:
144fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  void f();
154fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu};
164fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu
174fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xuvoid B::f() {
184fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu  x = 3;
194fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu}
202c5f8d79ed128892fa548a3308a938a3a53fbb5eJordan Rose
212c5f8d79ed128892fa548a3308a938a3a53fbb5eJordan Rose
222c5f8d79ed128892fa548a3308a938a3a53fbb5eJordan Roseclass C : public B {
232c5f8d79ed128892fa548a3308a938a3a53fbb5eJordan Rosepublic:
242c5f8d79ed128892fa548a3308a938a3a53fbb5eJordan Rose  void g() {
252c5f8d79ed128892fa548a3308a938a3a53fbb5eJordan Rose    // This used to crash because we are upcasting through two bases.
262c5f8d79ed128892fa548a3308a938a3a53fbb5eJordan Rose    x = 5;
272c5f8d79ed128892fa548a3308a938a3a53fbb5eJordan Rose  }
282c5f8d79ed128892fa548a3308a938a3a53fbb5eJordan Rose};
29b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
30b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
31b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rosenamespace VirtualBaseClasses {
32b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  class A {
33b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  protected:
34b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose    int x;
35b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  };
36b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
37b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  class B : public virtual A {
38b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  public:
39b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose    int getX() { return x; }
40b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  };
41b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
42b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  class C : public virtual A {
43b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  public:
44b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose    void setX() { x = 42; }
45b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  };
46b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
47b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  class D : public B, public C {};
48b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  class DV : virtual public B, public C {};
49b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  class DV2 : public B, virtual public C {};
50b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
51b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  void test() {
52b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose    D d;
53b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose    d.setX();
54b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose    clang_analyzer_eval(d.getX() == 42); // expected-warning{{TRUE}}
55b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
56b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose    DV dv;
57b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose    dv.setX();
58b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose    clang_analyzer_eval(dv.getX() == 42); // expected-warning{{TRUE}}
59b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
60b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose    DV2 dv2;
61b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose    dv2.setX();
62b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose    clang_analyzer_eval(dv2.getX() == 42); // expected-warning{{TRUE}}
63b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  }
64b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
65b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
66b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  // Make sure we're consistent about the offset of the A subobject within an
67b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  // Intermediate virtual base class.
68b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  class Padding1 { int unused; };
69b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  class Padding2 { int unused; };
70b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  class Intermediate : public Padding1, public A, public Padding2 {};
71b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
72b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  class BI : public virtual Intermediate {
73b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  public:
74b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose    int getX() { return x; }
75b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  };
76b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
77b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  class CI : public virtual Intermediate {
78b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  public:
79b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose    void setX() { x = 42; }
80b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  };
81b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
82b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  class DI : public BI, public CI {};
83b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose
84b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  void testIntermediate() {
85b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose    DI d;
86b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose    d.setX();
87b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose    clang_analyzer_eval(d.getX() == 42); // expected-warning{{TRUE}}
88b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  }
89b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose}
900a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose
910a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose
920a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rosenamespace DynamicVirtualUpcast {
930a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  class A {
940a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  public:
950a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose    virtual ~A();
960a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  };
970a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose
980a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  class B : virtual public A {};
990a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  class C : virtual public B {};
1000a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  class D : virtual public C {};
1010a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose
1020a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  bool testCast(A *a) {
1030a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose    return dynamic_cast<B*>(a) && dynamic_cast<C*>(a);
1040a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  }
1050a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose
1060a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  void test() {
1070a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose    D d;
1080a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose    clang_analyzer_eval(testCast(&d)); // expected-warning{{TRUE}}
1090a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  }
1100a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose}
1110a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose
1120a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rosenamespace DynamicMultipleInheritanceUpcast {
1130a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  class B {
1140a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  public:
1150a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose    virtual ~B();
1160a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  };
1170a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  class C {
1180a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  public:
1190a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose    virtual ~C();
1200a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  };
1210a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  class D : public B, public C {};
1220a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose
1230a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  bool testCast(B *a) {
1240a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose    return dynamic_cast<C*>(a);
1250a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  }
1260a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose
1270a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  void test() {
1280a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose    D d;
1290a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose    clang_analyzer_eval(testCast(&d)); // expected-warning{{TRUE}}
1300a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  }
1310a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose
1320a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose
1330a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  class DV : virtual public B, virtual public C {};
1340a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose
1350a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  void testVirtual() {
1360a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose    DV d;
1370a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose    clang_analyzer_eval(testCast(&d)); // expected-warning{{TRUE}}
1380a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose  }
1390a5629812019ce8bef86ade5425ac261bb544fd8Jordan Rose}
14065f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
14165f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rosenamespace LazyBindings {
14265f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose  struct Base {
14365f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    int x;
14465f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose  };
14565f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
14665f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose  struct Derived : public Base {
14765f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    int y;
14865f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose  };
14965f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
15065f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose  struct DoubleDerived : public Derived {
15165f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    int z;
15265f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose  };
15365f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
15465f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose  int getX(const Base &obj) {
15565f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    return obj.x;
15665f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose  }
15765f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
15865f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose  int getY(const Derived &obj) {
15965f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    return obj.y;
16065f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose  }
16165f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
16265f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose  void testDerived() {
16365f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    Derived d;
16465f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    d.x = 1;
16565f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    d.y = 2;
16665f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    clang_analyzer_eval(getX(d) == 1); // expected-warning{{TRUE}}
16765f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    clang_analyzer_eval(getY(d) == 2); // expected-warning{{TRUE}}
16865f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
16965f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    Base b(d);
17065f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    clang_analyzer_eval(getX(b) == 1); // expected-warning{{TRUE}}
17165f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
17265f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    Derived d2(d);
17365f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    clang_analyzer_eval(getX(d2) == 1); // expected-warning{{TRUE}}
17465f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    clang_analyzer_eval(getY(d2) == 2); // expected-warning{{TRUE}}
17565f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose  }
17665f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
17765f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose  void testDoubleDerived() {
17865f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    DoubleDerived d;
17965f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    d.x = 1;
18065f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    d.y = 2;
18165f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    clang_analyzer_eval(getX(d) == 1); // expected-warning{{TRUE}}
18265f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    clang_analyzer_eval(getY(d) == 2); // expected-warning{{TRUE}}
18365f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
18465f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    Base b(d);
18565f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    clang_analyzer_eval(getX(b) == 1); // expected-warning{{TRUE}}
18665f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
18765f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    Derived d2(d);
18865f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    clang_analyzer_eval(getX(d2) == 1); // expected-warning{{TRUE}}
18965f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    clang_analyzer_eval(getY(d2) == 2); // expected-warning{{TRUE}}
19065f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
19165f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    DoubleDerived d3(d);
19265f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    clang_analyzer_eval(getX(d3) == 1); // expected-warning{{TRUE}}
19365f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    clang_analyzer_eval(getY(d3) == 2); // expected-warning{{TRUE}}
19465f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose  }
19565f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
19665f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose  namespace WithOffset {
19765f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    struct Offset {
19865f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      int padding;
19965f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    };
20065f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
20165f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    struct OffsetDerived : private Offset, public Base {
20265f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      int y;
20365f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    };
20465f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
20565f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    struct DoubleOffsetDerived : public OffsetDerived {
20665f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      int z;
20765f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    };
20865f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
20965f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    int getY(const OffsetDerived &obj) {
21065f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      return obj.y;
21165f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    }
21265f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
21365f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    void testDerived() {
21465f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      OffsetDerived d;
21565f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      d.x = 1;
21665f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      d.y = 2;
21765f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getX(d) == 1); // expected-warning{{TRUE}}
21865f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getY(d) == 2); // expected-warning{{TRUE}}
21965f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
22065f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      Base b(d);
22165f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getX(b) == 1); // expected-warning{{TRUE}}
22265f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
22365f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      OffsetDerived d2(d);
22465f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getX(d2) == 1); // expected-warning{{TRUE}}
22565f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getY(d2) == 2); // expected-warning{{TRUE}}
22665f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    }
22765f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
22865f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    void testDoubleDerived() {
22965f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      DoubleOffsetDerived d;
23065f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      d.x = 1;
23165f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      d.y = 2;
23265f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getX(d) == 1); // expected-warning{{TRUE}}
23365f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getY(d) == 2); // expected-warning{{TRUE}}
23465f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
23565f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      Base b(d);
23665f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getX(b) == 1); // expected-warning{{TRUE}}
23765f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
23865f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      OffsetDerived d2(d);
23965f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getX(d2) == 1); // expected-warning{{TRUE}}
24065f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getY(d2) == 2); // expected-warning{{TRUE}}
24165f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
24265f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      DoubleOffsetDerived d3(d);
24365f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getX(d3) == 1); // expected-warning{{TRUE}}
24465f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getY(d3) == 2); // expected-warning{{TRUE}}
24565f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    }
24665f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose  }
24765f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
24865f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose  namespace WithVTable {
24965f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    struct DerivedVTBL : public Base {
25065f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      int y;
25165f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      virtual void method();
25265f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    };
25365f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
25465f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    struct DoubleDerivedVTBL : public DerivedVTBL {
25565f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      int z;
25665f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    };
25765f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
25865f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    int getY(const DerivedVTBL &obj) {
25965f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      return obj.y;
26065f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    }
26165f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
26265f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    int getZ(const DoubleDerivedVTBL &obj) {
26365f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      return obj.z;
26465f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    }
26565f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
26665f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    void testDerived() {
26765f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      DerivedVTBL d;
26865f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      d.x = 1;
26965f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      d.y = 2;
27065f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getX(d) == 1); // expected-warning{{TRUE}}
27165f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getY(d) == 2); // expected-warning{{TRUE}}
27265f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
27365f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      Base b(d);
27465f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getX(b) == 1); // expected-warning{{TRUE}}
27565f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
27665f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose#if CONSTRUCTORS
27765f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      DerivedVTBL d2(d);
27865f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getX(d2) == 1); // expected-warning{{TRUE}}
27965f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getY(d2) == 2); // expected-warning{{TRUE}}
28065f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose#endif
28165f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    }
28265f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
28365f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose#if CONSTRUCTORS
28465f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    void testDoubleDerived() {
28565f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      DoubleDerivedVTBL d;
28665f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      d.x = 1;
28765f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      d.y = 2;
28865f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      d.z = 3;
28965f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getX(d) == 1); // expected-warning{{TRUE}}
29065f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getY(d) == 2); // expected-warning{{TRUE}}
29165f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getZ(d) == 3); // expected-warning{{TRUE}}
29265f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
29365f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      Base b(d);
29465f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getX(b) == 1); // expected-warning{{TRUE}}
29565f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
29665f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      DerivedVTBL d2(d);
29765f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getX(d2) == 1); // expected-warning{{TRUE}}
29865f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getY(d2) == 2); // expected-warning{{TRUE}}
29965f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose
30065f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      DoubleDerivedVTBL d3(d);
30165f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getX(d3) == 1); // expected-warning{{TRUE}}
30265f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getY(d3) == 2); // expected-warning{{TRUE}}
30365f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose      clang_analyzer_eval(getZ(d3) == 3); // expected-warning{{TRUE}}
30465f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose    }
30565f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose#endif
30665f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose  }
30711f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose
30811f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose#if CONSTRUCTORS
30911f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose  namespace Nested {
31011f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose    struct NonTrivialCopy {
31111f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose      int padding;
31211f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose      NonTrivialCopy() {}
31311f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose      NonTrivialCopy(const NonTrivialCopy &) {}
31411f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose    };
31511f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose
31611f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose    struct FullyDerived : private NonTrivialCopy, public Derived {
31711f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose      int z;
31811f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose    };
31911f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose
32011f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose    struct Wrapper {
32111f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose      FullyDerived d;
32211f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose      int zz;
32311f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose
32411f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose      Wrapper(const FullyDerived &d) : d(d), zz(0) {}
32511f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose    };
32611f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose
32711f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose    void test5() {
32811f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose      Wrapper w((FullyDerived()));
32911f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose      w.d.x = 1;
33011f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose
33111f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose      Wrapper w2(w);
33211f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose      clang_analyzer_eval(getX(w2.d) == 1); // expected-warning{{TRUE}}
33311f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose    }
33411f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose  }
33511f0cae4bf4f62dcc706d33c1f795d460cd64816Jordan Rose#endif
33665f991ccbec43b4a860f70594c92528ee8fb7c6fJordan Rose}
337ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose
338ae7396c3891748762d01431e16541b3eb9125c4dJordan Rosenamespace Redeclaration {
339ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose  class Base;
340ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose
341ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose  class Base {
342ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose  public:
343ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose    virtual int foo();
344ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose    int get() { return value; }
345ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose
346ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose    int value;
347ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose  };
348ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose
349ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose  class Derived : public Base {
350ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose  public:
351ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose    virtual int bar();
352ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose  };
353ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose
354ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose  void test(Derived d) {
355ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose    d.foo(); // don't crash
356ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose    d.bar(); // sanity check
357ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose
358ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose    Base &b = d;
359ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose    b.foo(); // don't crash
360ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose
361ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose    d.value = 42; // don't crash
362ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose    clang_analyzer_eval(d.get() == 42); // expected-warning{{TRUE}}
363ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose    clang_analyzer_eval(b.get() == 42); // expected-warning{{TRUE}}
364ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose  }
365ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose};
366ae7396c3891748762d01431e16541b3eb9125c4dJordan Rose
367f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rosenamespace PR15394 {
368f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose  namespace Original {
369f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    class Base {
370f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    public:
371f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      virtual int f() = 0;
372f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      int i;
373f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    };
374f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose
375f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    class Derived1 : public Base {
376f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    public:
377f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      int j;
378f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    };
379f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose
380f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    class Derived2 : public Derived1 {
381f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    public:
382f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      virtual int f() {
383f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose        clang_analyzer_checkInlined(true); // expected-warning{{TRUE}}
384f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose        return i + j;
385f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      }
386f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    };
387f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose
388f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    void testXXX() {
389f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      Derived1 *d1p = reinterpret_cast<Derived1*>(new Derived2);
390f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      d1p->i = 1;
391f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      d1p->j = 2;
392f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      clang_analyzer_eval(d1p->f() == 3); // expected-warning{{TRUE}}
393f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    }
394f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose  }
395f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose
396f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose  namespace VirtualInDerived {
397f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    class Base {
398f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    public:
399f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      int i;
400f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    };
401f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose
402f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    class Derived1 : public Base {
403f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    public:
404f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      virtual int f() = 0;
405f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      int j;
406f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    };
407f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose
408f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    class Derived2 : public Derived1 {
409f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    public:
410f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      virtual int f() {
411f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose        clang_analyzer_checkInlined(true); // expected-warning{{TRUE}}
412f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose        return i + j;
413f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      }
414f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    };
415f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose
416f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    void test() {
417f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      Derived1 *d1p = reinterpret_cast<Derived1*>(new Derived2);
418f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      d1p->i = 1;
419f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      d1p->j = 2;
420f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      clang_analyzer_eval(d1p->f() == 3); // expected-warning{{TRUE}}
421f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    }
422f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose  }
423f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose
424f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose  namespace NoCast {
425f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    class Base {
426f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    public:
427f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      int i;
428f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    };
429f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose
430f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    class Derived1 : public Base {
431f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    public:
432f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      virtual int f() = 0;
433f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      int j;
434f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    };
435f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose
436f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    class Derived2 : public Derived1 {
437f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    public:
438f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      virtual int f() {
439f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose        clang_analyzer_checkInlined(true); // expected-warning{{TRUE}}
440f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose        return i + j;
441f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      }
442f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    };
443f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose
444f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    void test() {
445f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      Derived1 *d1p = new Derived2;
446f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      d1p->i = 1;
447f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      d1p->j = 2;
448f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose      clang_analyzer_eval(d1p->f() == 3); // expected-warning{{TRUE}}
449f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose    }
450f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose  }
451f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose};
452f2edbec1d9817df109304f9c19ae2b34fec1feeaJordan Rose
4539122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labathnamespace Bug16309 {
4549122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath  struct Incomplete;
4559122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath
4569122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath  struct Base { virtual ~Base(); };
4579122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath
4589122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath  struct Derived : public Base { int x; };
4599122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath
4609122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath  void* f(Incomplete *i) {
4619122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath    Base *b = reinterpret_cast<Base *>(i);
4629122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath    // This used to crash because of the reinterpret_cast above.
4639122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath    Derived *d = dynamic_cast<Derived *>(b);
4649122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath    return d;
4659122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath  }
4669122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath
4679122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath  // And check that reinterpret+dynamic casts work correctly after the fix.
4689122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath  void g() {
4699122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath    Derived d;
4709122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath    d.x = 47;
4719122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath    Base *b = &d;
4729122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath    Incomplete *i = reinterpret_cast<Incomplete *>(b);
4739122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath    Base *b2 = reinterpret_cast<Base *>(i);
4749122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath    Derived *d2 = dynamic_cast<Derived *>(b2);
4759122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath    clang_analyzer_eval(d2->x == 47); // expected-warning{{TRUE}}
4769122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath  }
4779122025df6682a29ba4bdfc4330d2caebb8ea4dePavel Labath}
478