1*eb8650a7SLouis Dionne //===----------------------------------------------------------------------===// 2ac18e063SSaleem Abdulrasool // 357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6ac18e063SSaleem Abdulrasool // 7ac18e063SSaleem Abdulrasool //===----------------------------------------------------------------------===// 8ac18e063SSaleem Abdulrasool 98c61114cSLouis Dionne // UNSUPPORTED: no-exceptions 1031cbe0f2SLouis Dionne // REQUIRES: c++03 || c++11 || c++14 1157e446daSAsiri Rathnayake 12ac18e063SSaleem Abdulrasool #include <assert.h> 13ac18e063SSaleem Abdulrasool 1447570b8dSEric Fiselier #if defined(__GNUC__) 1547570b8dSEric Fiselier #pragma GCC diagnostic ignored "-Wunreachable-code" 16851a335bSLouis Dionne #pragma GCC diagnostic ignored "-Wdeprecated" // dynamic exception specifications are deprecated 1747570b8dSEric Fiselier #endif 1847570b8dSEric Fiselier 19ac18e063SSaleem Abdulrasool struct A 20ac18e063SSaleem Abdulrasool { 21ac18e063SSaleem Abdulrasool static int count; 22ac18e063SSaleem Abdulrasool int id_; AA23ac18e063SSaleem Abdulrasool A() : id_(++count) {} ~AA24ac18e063SSaleem Abdulrasool ~A() {assert(id_ == count--);} 25ac18e063SSaleem Abdulrasool 26ac18e063SSaleem Abdulrasool private: 27ac18e063SSaleem Abdulrasool A(const A&); 28ac18e063SSaleem Abdulrasool A& operator=(const A&); 29ac18e063SSaleem Abdulrasool }; 30ac18e063SSaleem Abdulrasool 31ac18e063SSaleem Abdulrasool int A::count = 0; 32ac18e063SSaleem Abdulrasool 33ac18e063SSaleem Abdulrasool struct B 34ac18e063SSaleem Abdulrasool { 35ac18e063SSaleem Abdulrasool static int count; 36ac18e063SSaleem Abdulrasool int id_; BB37ac18e063SSaleem Abdulrasool B() : id_(++count) {} ~BB38ac18e063SSaleem Abdulrasool ~B() {assert(id_ == count--);} 39ac18e063SSaleem Abdulrasool 40ac18e063SSaleem Abdulrasool private: 41ac18e063SSaleem Abdulrasool B(const B&); 42ac18e063SSaleem Abdulrasool B& operator=(const B&); 43ac18e063SSaleem Abdulrasool }; 44ac18e063SSaleem Abdulrasool 45ac18e063SSaleem Abdulrasool int B::count = 0; 46ac18e063SSaleem Abdulrasool 47ac18e063SSaleem Abdulrasool struct C 48ac18e063SSaleem Abdulrasool { 49ac18e063SSaleem Abdulrasool static int count; 50ac18e063SSaleem Abdulrasool int id_; CC51ac18e063SSaleem Abdulrasool C() : id_(++count) {} ~CC52ac18e063SSaleem Abdulrasool ~C() {assert(id_ == count--);} 53ac18e063SSaleem Abdulrasool 54ac18e063SSaleem Abdulrasool private: 55ac18e063SSaleem Abdulrasool C(const C&); 56ac18e063SSaleem Abdulrasool C& operator=(const C&); 57ac18e063SSaleem Abdulrasool }; 58ac18e063SSaleem Abdulrasool 59ac18e063SSaleem Abdulrasool int C::count = 0; 60ac18e063SSaleem Abdulrasool f2()61ac18e063SSaleem Abdulrasoolvoid f2() 62ac18e063SSaleem Abdulrasool { 63ac18e063SSaleem Abdulrasool C c; 64ac18e063SSaleem Abdulrasool A a; 65ac18e063SSaleem Abdulrasool throw 55; 66ac18e063SSaleem Abdulrasool B b; 67ac18e063SSaleem Abdulrasool } 68ac18e063SSaleem Abdulrasool f1()69ac18e063SSaleem Abdulrasoolvoid f1() throw (long, char, int, double) 70ac18e063SSaleem Abdulrasool { 71ac18e063SSaleem Abdulrasool A a; 72ac18e063SSaleem Abdulrasool B b; 73ac18e063SSaleem Abdulrasool f2(); 74ac18e063SSaleem Abdulrasool C c; 75ac18e063SSaleem Abdulrasool } 76ac18e063SSaleem Abdulrasool main(int,char **)77504bc07dSLouis Dionneint main(int, char**) 78ac18e063SSaleem Abdulrasool { 79ac18e063SSaleem Abdulrasool try 80ac18e063SSaleem Abdulrasool { 81ac18e063SSaleem Abdulrasool f1(); 82ac18e063SSaleem Abdulrasool assert(false); 83ac18e063SSaleem Abdulrasool } 84ac18e063SSaleem Abdulrasool catch (int* i) 85ac18e063SSaleem Abdulrasool { 86ac18e063SSaleem Abdulrasool assert(false); 87ac18e063SSaleem Abdulrasool } 88ac18e063SSaleem Abdulrasool catch (long i) 89ac18e063SSaleem Abdulrasool { 90ac18e063SSaleem Abdulrasool assert(false); 91ac18e063SSaleem Abdulrasool } 92ac18e063SSaleem Abdulrasool catch (int i) 93ac18e063SSaleem Abdulrasool { 94ac18e063SSaleem Abdulrasool assert(i == 55); 95ac18e063SSaleem Abdulrasool } 96ac18e063SSaleem Abdulrasool catch (...) 97ac18e063SSaleem Abdulrasool { 98ac18e063SSaleem Abdulrasool assert(false); 99ac18e063SSaleem Abdulrasool } 100ac18e063SSaleem Abdulrasool assert(A::count == 0); 101ac18e063SSaleem Abdulrasool assert(B::count == 0); 102ac18e063SSaleem Abdulrasool assert(C::count == 0); 103504bc07dSLouis Dionne 104504bc07dSLouis Dionne return 0; 105ac18e063SSaleem Abdulrasool } 106