1e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant//===---------------------- catch_class_04.cpp ----------------------------===//
2e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant//
3e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant//                     The LLVM Compiler Infrastructure
4e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant//
5e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
7e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant//
8e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant//===----------------------------------------------------------------------===//
9e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant
10e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant/*
11e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    This test checks that adjustedPtr is correct as there exist offsets in this
12e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    object for the various subobjects, all of which have a unique id_ to
13e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    check against.  It also checks that virtual bases work properly
14e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant*/
15e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant
16e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant#include <exception>
17e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant#include <stdlib.h>
18e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant#include <assert.h>
19e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant
20e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnantstruct B
21e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant{
22e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    static int count;
23e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    int id_;
24e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    explicit B(int id) : id_(id) {count++;}
25e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    B(const B& a) : id_(a.id_) {count++;}
26e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    ~B() {count--;}
27e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant};
28e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant
29e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnantint B::count = 0;
30e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant
31e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnantstruct C1
32e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    : virtual B
33e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant{
34e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    static int count;
35e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    int id_;
36e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    explicit C1(int id) : B(id-2), id_(id) {count++;}
37e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    C1(const C1& a) : B(a.id_-2), id_(a.id_) {count++;}
38e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    ~C1() {count--;}
39e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant};
40e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant
41e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnantint C1::count = 0;
42e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant
43e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnantstruct C2
44e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    : virtual private B
45e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant{
46e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    static int count;
47e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    int id_;
48e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    explicit C2(int id) : B(id-2), id_(id) {count++;}
49e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    C2(const C2& a) : B(a.id_-2), id_(a.id_) {count++;}
50e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    ~C2() {count--;}
51e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant};
52e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant
53e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnantint C2::count = 0;
54e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant
55e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnantstruct A
56e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    : C1, C2
57e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant{
58e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    static int count;
59e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    int id_;
60e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    explicit A(int id) : C1(id-1), C2(id-2), B(id+3), id_(id) {count++;}
61e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    A(const A& a) : C1(a.id_-1), C2(a.id_-2), B(a.id_+3), id_(a.id_) {count++;}
62e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    ~A() {count--;}
63e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant};
64e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant
65e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnantint A::count = 0;
66e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant
67e162bf2dec6169ed06396af11eac19791e37957aHoward HinnantA a(5);
68e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant
69e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnantvoid f1()
70e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant{
71e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    throw &a;
72e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    assert(false);
73e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant}
74e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant
75e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnantvoid f2()
76e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant{
77e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    try
78e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    {
79e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        f1();
80e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(false);
81e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    }
82e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    catch (const A* a)  // can catch A
83e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    {
84e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(a->id_ == 5);
85e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(static_cast<const C1*>(a)->id_ == 4);
86e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(static_cast<const C2*>(a)->id_ == 3);
87e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(static_cast<const B*>(a)->id_ == 8);
88e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        throw;
89e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    }
90e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    catch (const C1*)
91e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    {
92e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(false);
93e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    }
94e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    catch (const C2*)
95e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    {
96e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(false);
97e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    }
98e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    catch (const B*)
99e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    {
100e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(false);
101e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    }
102e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant}
103e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant
104e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnantvoid f3()
105e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant{
106e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    try
107e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    {
108e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        f2();
109e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(false);
110e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    }
111e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    catch (const B* a)  // can catch B
112e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    {
113e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(static_cast<const B*>(a)->id_ == 8);
114e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        throw;
115e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    }
116e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    catch (const C1* c1)
117e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    {
118e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(false);
119e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    }
120e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    catch (const C2*)
121e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    {
122e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(false);
123e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    }
124e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant}
125e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant
126e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnantvoid f4()
127e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant{
128e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    try
129e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    {
130e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        f3();
131e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(false);
132e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    }
133e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    catch (const C2* c2)  // can catch C2
134e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    {
135e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(c2->id_ == 3);
136e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        throw;
137e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    }
138e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    catch (const B* a)
139e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    {
140e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(false);
141e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    }
142e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    catch (const C1*)
143e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    {
144e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(false);
145e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    }
146e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant}
147e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant
148e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnantvoid f5()
149e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant{
150e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    try
151e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    {
152e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        f4();
153e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(false);
154e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    }
155e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    catch (const C1* c1)  // can catch C1
156e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    {
157e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(c1->id_ == 4);
158e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(static_cast<const B*>(c1)->id_ == 8);
159e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        throw;
160e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    }
161e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    catch (const B* a)
162e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    {
163e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(false);
164e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    }
165e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    catch (const C2*)
166e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    {
167e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(false);
168e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    }
169e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant}
170e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant
171e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnantint main()
172e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant{
173e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    try
174e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    {
175e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        f5();
176e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant        assert(false);
177e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    }
178e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    catch (...)
179e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    {
180e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant    }
181e162bf2dec6169ed06396af11eac19791e37957aHoward Hinnant}
182