112 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: no-exceptions10// REQUIRES: c++03 || c++11 || c++1411 12#include <exception>13#include <stdlib.h>14#include <assert.h>15 16#if defined(__GNUC__)17#pragma GCC diagnostic ignored "-Wunreachable-code"18#pragma GCC diagnostic ignored "-Wdeprecated" // dynamic exception specifications are deprecated19#endif20 21struct A22{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 B36{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 C50{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 exit(0);82}83 84int main(int, char**)85{86 std::set_unexpected(u_handler);87 try88 {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(i == 55);103 }104 catch (...)105 {106 assert(false);107 }108 assert(false);109 110 return 0;111}112