|  | //===------------------------- unwind_05.cpp ------------------------------===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is dual licensed under the MIT and the University of Illinois Open | 
|  | // Source Licenses. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | // UNSUPPORTED: libcxxabi-no-exceptions | 
|  | // REQUIRES: c++98 || c++03 || c++11 || c++14 | 
|  |  | 
|  | #include <exception> | 
|  | #include <stdlib.h> | 
|  | #include <assert.h> | 
|  |  | 
|  | #if defined(__GNUC__) | 
|  | #pragma GCC diagnostic ignored "-Wunreachable-code" | 
|  | #endif | 
|  |  | 
|  | struct A | 
|  | { | 
|  | static int count; | 
|  | int id_; | 
|  | A() : id_(++count) {} | 
|  | ~A() {assert(id_ == count--);} | 
|  |  | 
|  | private: | 
|  | A(const A&); | 
|  | A& operator=(const A&); | 
|  | }; | 
|  |  | 
|  | int A::count = 0; | 
|  |  | 
|  | struct B | 
|  | { | 
|  | static int count; | 
|  | int id_; | 
|  | B() : id_(++count) {} | 
|  | ~B() {assert(id_ == count--);} | 
|  |  | 
|  | private: | 
|  | B(const B&); | 
|  | B& operator=(const B&); | 
|  | }; | 
|  |  | 
|  | int B::count = 0; | 
|  |  | 
|  | struct C | 
|  | { | 
|  | static int count; | 
|  | int id_; | 
|  | C() : id_(++count) {} | 
|  | ~C() {assert(id_ == count--);} | 
|  |  | 
|  | private: | 
|  | C(const C&); | 
|  | C& operator=(const C&); | 
|  | }; | 
|  |  | 
|  | int C::count = 0; | 
|  |  | 
|  | void f2() | 
|  | { | 
|  | C c; | 
|  | A a; | 
|  | throw 55; | 
|  | B b; | 
|  | } | 
|  |  | 
|  | void f1() throw (long, char, double, std::bad_exception) | 
|  | { | 
|  | A a; | 
|  | B b; | 
|  | f2(); | 
|  | C c; | 
|  | } | 
|  |  | 
|  | void u_handler() | 
|  | { | 
|  | throw; | 
|  | } | 
|  |  | 
|  | int main() | 
|  | { | 
|  | std::set_unexpected(u_handler); | 
|  | try | 
|  | { | 
|  | f1(); | 
|  | assert(false); | 
|  | } | 
|  | catch (int* i) | 
|  | { | 
|  | assert(false); | 
|  | } | 
|  | catch (long i) | 
|  | { | 
|  | assert(false); | 
|  | } | 
|  | catch (int i) | 
|  | { | 
|  | assert(false); | 
|  | } | 
|  | catch (char c) | 
|  | { | 
|  | assert(false); | 
|  | } | 
|  | catch (const std::bad_exception& e) | 
|  | { | 
|  | assert(true); | 
|  | } | 
|  | catch (...) | 
|  | { | 
|  | assert(false); | 
|  | } | 
|  | assert(A::count == 0); | 
|  | assert(B::count == 0); | 
|  | assert(C::count == 0); | 
|  | } |