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