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 <exception> 13ac18e063SSaleem Abdulrasool #include <stdlib.h> 14ac18e063SSaleem Abdulrasool #include <assert.h> 15ac18e063SSaleem Abdulrasool 1647570b8dSEric Fiselier #if defined(__GNUC__) 1747570b8dSEric Fiselier #pragma GCC diagnostic ignored "-Wunreachable-code" 18851a335bSLouis Dionne #pragma GCC diagnostic ignored "-Wdeprecated" // dynamic exception specifications are deprecated 1947570b8dSEric Fiselier #endif 2047570b8dSEric Fiselier 21ac18e063SSaleem Abdulrasool struct A 22ac18e063SSaleem Abdulrasool { 23ac18e063SSaleem Abdulrasool static int count; 24ac18e063SSaleem Abdulrasool int id_; AA25ac18e063SSaleem Abdulrasool A() : id_(++count) {} ~AA26ac18e063SSaleem Abdulrasool ~A() {assert(id_ == count--);} 27ac18e063SSaleem Abdulrasool 28ac18e063SSaleem Abdulrasool private: 29ac18e063SSaleem Abdulrasool A(const A&); 30ac18e063SSaleem Abdulrasool A& operator=(const A&); 31ac18e063SSaleem Abdulrasool }; 32ac18e063SSaleem Abdulrasool 33ac18e063SSaleem Abdulrasool int A::count = 0; 34ac18e063SSaleem Abdulrasool 35ac18e063SSaleem Abdulrasool struct B 36ac18e063SSaleem Abdulrasool { 37ac18e063SSaleem Abdulrasool static int count; 38ac18e063SSaleem Abdulrasool int id_; BB39ac18e063SSaleem Abdulrasool B() : id_(++count) {} ~BB40ac18e063SSaleem Abdulrasool ~B() {assert(id_ == count--);} 41ac18e063SSaleem Abdulrasool 42ac18e063SSaleem Abdulrasool private: 43ac18e063SSaleem Abdulrasool B(const B&); 44ac18e063SSaleem Abdulrasool B& operator=(const B&); 45ac18e063SSaleem Abdulrasool }; 46ac18e063SSaleem Abdulrasool 47ac18e063SSaleem Abdulrasool int B::count = 0; 48ac18e063SSaleem Abdulrasool 49ac18e063SSaleem Abdulrasool struct C 50ac18e063SSaleem Abdulrasool { 51ac18e063SSaleem Abdulrasool static int count; 52ac18e063SSaleem Abdulrasool int id_; CC53ac18e063SSaleem Abdulrasool C() : id_(++count) {} ~CC54ac18e063SSaleem Abdulrasool ~C() {assert(id_ == count--);} 55ac18e063SSaleem Abdulrasool 56ac18e063SSaleem Abdulrasool private: 57ac18e063SSaleem Abdulrasool C(const C&); 58ac18e063SSaleem Abdulrasool C& operator=(const C&); 59ac18e063SSaleem Abdulrasool }; 60ac18e063SSaleem Abdulrasool 61ac18e063SSaleem Abdulrasool int C::count = 0; 62ac18e063SSaleem Abdulrasool f2()63ac18e063SSaleem Abdulrasoolvoid f2() 64ac18e063SSaleem Abdulrasool { 65ac18e063SSaleem Abdulrasool C c; 66ac18e063SSaleem Abdulrasool A a; 67ac18e063SSaleem Abdulrasool throw 55; 68ac18e063SSaleem Abdulrasool B b; 69ac18e063SSaleem Abdulrasool } 70ac18e063SSaleem Abdulrasool f1()71ac18e063SSaleem Abdulrasoolvoid f1() throw (long, char, double) 72ac18e063SSaleem Abdulrasool { 73ac18e063SSaleem Abdulrasool A a; 74ac18e063SSaleem Abdulrasool B b; 75ac18e063SSaleem Abdulrasool f2(); 76ac18e063SSaleem Abdulrasool C c; 77ac18e063SSaleem Abdulrasool } 78ac18e063SSaleem Abdulrasool u_handler()79ac18e063SSaleem Abdulrasoolvoid u_handler() 80ac18e063SSaleem Abdulrasool { 81ac18e063SSaleem Abdulrasool throw 'a'; 82ac18e063SSaleem Abdulrasool } 83ac18e063SSaleem Abdulrasool main(int,char **)84504bc07dSLouis Dionneint main(int, char**) 85ac18e063SSaleem Abdulrasool { 86ac18e063SSaleem Abdulrasool std::set_unexpected(u_handler); 87ac18e063SSaleem Abdulrasool try 88ac18e063SSaleem Abdulrasool { 89ac18e063SSaleem Abdulrasool f1(); 90ac18e063SSaleem Abdulrasool assert(false); 91ac18e063SSaleem Abdulrasool } 92ac18e063SSaleem Abdulrasool catch (int* i) 93ac18e063SSaleem Abdulrasool { 94ac18e063SSaleem Abdulrasool assert(false); 95ac18e063SSaleem Abdulrasool } 96ac18e063SSaleem Abdulrasool catch (long i) 97ac18e063SSaleem Abdulrasool { 98ac18e063SSaleem Abdulrasool assert(false); 99ac18e063SSaleem Abdulrasool } 100ac18e063SSaleem Abdulrasool catch (int i) 101ac18e063SSaleem Abdulrasool { 102ac18e063SSaleem Abdulrasool assert(false); 103ac18e063SSaleem Abdulrasool } 104ac18e063SSaleem Abdulrasool catch (char c) 105ac18e063SSaleem Abdulrasool { 106ac18e063SSaleem Abdulrasool assert(c == 'a'); 107ac18e063SSaleem Abdulrasool } 108ac18e063SSaleem Abdulrasool catch (...) 109ac18e063SSaleem Abdulrasool { 110ac18e063SSaleem Abdulrasool assert(false); 111ac18e063SSaleem Abdulrasool } 112ac18e063SSaleem Abdulrasool assert(A::count == 0); 113ac18e063SSaleem Abdulrasool assert(B::count == 0); 114ac18e063SSaleem Abdulrasool assert(C::count == 0); 115504bc07dSLouis Dionne 116504bc07dSLouis Dionne return 0; 117ac18e063SSaleem Abdulrasool } 118