1dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant//===------------------------- unwind_05.cpp ------------------------------===// 2dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant// 3dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant// The LLVM Compiler Infrastructure 4dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant// 5dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant// Source Licenses. See LICENSE.TXT for details. 7dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant// 8dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant//===----------------------------------------------------------------------===// 9dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant 10dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant#include <exception> 11dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant#include <stdlib.h> 12dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant#include <assert.h> 13dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant 14dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantstruct A 15dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant{ 16dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant static int count; 17dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant int id_; 18dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant A() : id_(++count) {} 19dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant ~A() {assert(id_ == count--);} 20dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant 21dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantprivate: 22dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant A(const A&); 23dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant A& operator=(const A&); 24dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant}; 25dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant 26dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantint A::count = 0; 27dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant 28dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantstruct B 29dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant{ 30dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant static int count; 31dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant int id_; 32dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant B() : id_(++count) {} 33dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant ~B() {assert(id_ == count--);} 34dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant 35dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantprivate: 36dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant B(const B&); 37dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant B& operator=(const B&); 38dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant}; 39dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant 40dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantint B::count = 0; 41dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant 42dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantstruct C 43dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant{ 44dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant static int count; 45dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant int id_; 46dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant C() : id_(++count) {} 47dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant ~C() {assert(id_ == count--);} 48dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant 49dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantprivate: 50dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant C(const C&); 51dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant C& operator=(const C&); 52dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant}; 53dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant 54dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantint C::count = 0; 55dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant 56dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantvoid f2() 57dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant{ 58dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant C c; 59dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant A a; 60dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant throw 55; 61dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant B b; 62dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant} 63dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant 64dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantvoid f1() throw (long, char, double, std::bad_exception) 65dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant{ 66dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant A a; 67dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant B b; 68dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant f2(); 69dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant C c; 70dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant} 71dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant 72dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantvoid u_handler() 73dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant{ 74dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant throw; 75dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant} 76dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant 77dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnantint main() 78dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant{ 79dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant std::set_unexpected(u_handler); 80dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant try 81dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant { 82dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant f1(); 83dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant assert(false); 84dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant } 85dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant catch (int* i) 86dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant { 87dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant assert(false); 88dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant } 89dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant catch (long i) 90dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant { 91dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant assert(false); 92dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant } 93dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant catch (int i) 94dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant { 95dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant assert(false); 96dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant } 97dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant catch (char c) 98dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant { 99dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant assert(false); 100dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant } 101dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant catch (const std::bad_exception& e) 102dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant { 103dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant assert(true); 104dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant } 105dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant catch (...) 106dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant { 107dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant assert(false); 108dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant } 109dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant assert(A::count == 0); 110dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant assert(B::count == 0); 111dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant assert(C::count == 0); 112dfb07f80c1a0063130c5738ff7d060d22f79b8bfHoward Hinnant} 113