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