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// UNSUPPORTED: libcxxabi-no-exceptions 11// REQUIRES: c++98 || c++03 || c++11 || c++14 12 13#include <exception> 14#include <stdlib.h> 15#include <assert.h> 16 17#if defined(__GNUC__) 18#pragma GCC diagnostic ignored "-Wunreachable-code" 19#endif 20 21struct A 22{ 23 static int count; 24 int id_; 25 A() : id_(++count) {} 26 ~A() {assert(id_ == count--);} 27 28private: 29 A(const A&); 30 A& operator=(const A&); 31}; 32 33int A::count = 0; 34 35struct B 36{ 37 static int count; 38 int id_; 39 B() : id_(++count) {} 40 ~B() {assert(id_ == count--);} 41 42private: 43 B(const B&); 44 B& operator=(const B&); 45}; 46 47int B::count = 0; 48 49struct C 50{ 51 static int count; 52 int id_; 53 C() : id_(++count) {} 54 ~C() {assert(id_ == count--);} 55 56private: 57 C(const C&); 58 C& operator=(const C&); 59}; 60 61int C::count = 0; 62 63void f2() 64{ 65 C c; 66 A a; 67 throw 55; 68 B b; 69} 70 71void f1() throw (long, char, double) 72{ 73 A a; 74 B b; 75 f2(); 76 C c; 77} 78 79void u_handler() 80{ 81 throw 'a'; 82} 83 84int main() 85{ 86 std::set_unexpected(u_handler); 87 try 88 { 89 f1(); 90 assert(false); 91 } 92 catch (int* i) 93 { 94 assert(false); 95 } 96 catch (long i) 97 { 98 assert(false); 99 } 100 catch (int i) 101 { 102 assert(false); 103 } 104 catch (char c) 105 { 106 assert(c == 'a'); 107 } 108 catch (...) 109 { 110 assert(false); 111 } 112 assert(A::count == 0); 113 assert(B::count == 0); 114 assert(C::count == 0); 115} 116