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