1e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//===--------------------- inherited_exception.cpp ------------------------===// 2e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// 3e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// The LLVM Compiler Infrastructure 4e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// 5e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// This file is dual licensed under the MIT and the University of Illinois Open 6e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// Source Licenses. See LICENSE.TXT for details. 7e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// 8e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//===----------------------------------------------------------------------===// 9e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// 10e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// This test case checks specifically the cases under C++ ABI 15.3.1, and 15.3.2 11e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// 12e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// C++ ABI 15.3: 13e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// A handler is a match for an exception object of type E if 14e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// / * The handler is of type cv T or cv T& and E and T are the same type \ 15e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// | (ignoring the top-level cv-qualifiers), or | 16e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// | * the handler is of type cv T or cv T& and T is an unambiguous base | 17e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// \ class of E, or / 18e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// * the handler is of type cv1 T* cv2 and E is a pointer type that can 19e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// be converted to the type of the handler by either or both of 20e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// o a standard pointer conversion (4.10 [conv.ptr]) not involving 21e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// conversions to private or protected or ambiguous classes 22e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// o a qualification conversion 23e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// * the handler is a pointer or pointer to member type and E is 24e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// std::nullptr_t 25e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert// 26e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert//===----------------------------------------------------------------------===// 27e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert 28e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert#include <assert.h> 29e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert 30e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albertstruct Base { 31e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert int b1; 32e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert}; 33e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert 34e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albertstruct Base2 { 35e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert int b2; 36e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert}; 37e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert 38e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albertstruct Child : public Base, public Base2 { 39e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert int c; 40e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert}; 41e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert 42e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albertvoid f1() { 43e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert Child child; 44e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert child.b1 = 10; 45e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert child.b2 = 11; 46e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert child.c = 12; 47e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert throw child; 48e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert} 49e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert 50e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albertvoid f2() { 51e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert Child child; 52e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert child.b1 = 10; 53e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert child.b2 = 11; 54e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert child.c = 12; 55e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert throw static_cast<Base2&>(child); 56e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert} 57e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert 58e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albertvoid f3() { 59e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert Child* child = new Child; 60e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert child->b1 = 10; 61e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert child->b2 = 11; 62e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert child->c = 12; 63e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert throw static_cast<Base2*>(child); 64e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert} 65e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert 66e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albertint main() 67e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert{ 68e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert try 69e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 70e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert f1(); 71e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(false); 72e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 73e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert catch (const Child& c) 74e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 75e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(true); 76e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 77e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert catch (const Base& b) 78e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 79e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(false); 80e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 81e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert catch (...) 82e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 83e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(false); 84e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 85e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert 86e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert try 87e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 88e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert f1(); 89e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(false); 90e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 91e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert catch (const Base& c) 92e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 93e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(true); 94e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 95e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert catch (const Child& b) 96e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 97e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(false); 98e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 99e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert catch (...) 100e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 101e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(false); 102e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 103e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert 104e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert try 105e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 106e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert f1(); 107e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(false); 108e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 109e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert catch (const Base2& c) 110e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 111e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(true); 112e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 113e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert catch (const Child& b) 114e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 115e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(false); 116e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 117e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert catch (...) 118e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 119e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(false); 120e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 121e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert 122e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert try 123e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 124e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert f2(); 125e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(false); 126e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 127e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert catch (const Child& c) 128e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 129e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(false); 130e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 131e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert catch (const Base& b) 132e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 133e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(false); 134e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 135e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert catch (const Base2& b) 136e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 137e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(true); 138e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 139e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert catch (...) 140e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 141e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(false); 142e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 143e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert 144e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert try 145e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 146e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert f3(); 147e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(false); 148e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 149e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert catch (const Base* c) 150e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 151e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(false); 152e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 153e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert catch (const Child* b) 154e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 155e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(false); 156e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 157e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert catch (const Base2* c) 158e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 159e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(true); 160e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 161e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert catch (...) 162e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert { 163e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(false); 164e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 165e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert} 166