1*c05d8e5dSAndroid Build Coastguard Worker //===---------------------- catch_class_02.cpp ----------------------------===// 2*c05d8e5dSAndroid Build Coastguard Worker // 3*c05d8e5dSAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*c05d8e5dSAndroid Build Coastguard Worker // 5*c05d8e5dSAndroid Build Coastguard Worker // This file is dual licensed under the MIT and the University of Illinois Open 6*c05d8e5dSAndroid Build Coastguard Worker // Source Licenses. See LICENSE.TXT for details. 7*c05d8e5dSAndroid Build Coastguard Worker // 8*c05d8e5dSAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*c05d8e5dSAndroid Build Coastguard Worker 10*c05d8e5dSAndroid Build Coastguard Worker // UNSUPPORTED: libcxxabi-no-exceptions 11*c05d8e5dSAndroid Build Coastguard Worker 12*c05d8e5dSAndroid Build Coastguard Worker #include <exception> 13*c05d8e5dSAndroid Build Coastguard Worker #include <stdlib.h> 14*c05d8e5dSAndroid Build Coastguard Worker #include <assert.h> 15*c05d8e5dSAndroid Build Coastguard Worker 16*c05d8e5dSAndroid Build Coastguard Worker struct B 17*c05d8e5dSAndroid Build Coastguard Worker { 18*c05d8e5dSAndroid Build Coastguard Worker static int count; 19*c05d8e5dSAndroid Build Coastguard Worker int id_; BB20*c05d8e5dSAndroid Build Coastguard Worker explicit B(int id) : id_(id) {count++;} BB21*c05d8e5dSAndroid Build Coastguard Worker B(const B& a) : id_(a.id_) {count++;} ~BB22*c05d8e5dSAndroid Build Coastguard Worker ~B() {count--;} 23*c05d8e5dSAndroid Build Coastguard Worker }; 24*c05d8e5dSAndroid Build Coastguard Worker 25*c05d8e5dSAndroid Build Coastguard Worker int B::count = 0; 26*c05d8e5dSAndroid Build Coastguard Worker 27*c05d8e5dSAndroid Build Coastguard Worker struct A 28*c05d8e5dSAndroid Build Coastguard Worker : B 29*c05d8e5dSAndroid Build Coastguard Worker { 30*c05d8e5dSAndroid Build Coastguard Worker static int count; 31*c05d8e5dSAndroid Build Coastguard Worker int id_; AA32*c05d8e5dSAndroid Build Coastguard Worker explicit A(int id) : B(id-1), id_(id) {count++;} AA33*c05d8e5dSAndroid Build Coastguard Worker A(const A& a) : B(a.id_-1), id_(a.id_) {count++;} ~AA34*c05d8e5dSAndroid Build Coastguard Worker ~A() {count--;} 35*c05d8e5dSAndroid Build Coastguard Worker }; 36*c05d8e5dSAndroid Build Coastguard Worker 37*c05d8e5dSAndroid Build Coastguard Worker int A::count = 0; 38*c05d8e5dSAndroid Build Coastguard Worker f1()39*c05d8e5dSAndroid Build Coastguard Workervoid f1() 40*c05d8e5dSAndroid Build Coastguard Worker { 41*c05d8e5dSAndroid Build Coastguard Worker assert(A::count == 0); 42*c05d8e5dSAndroid Build Coastguard Worker assert(B::count == 0); 43*c05d8e5dSAndroid Build Coastguard Worker A a(3); 44*c05d8e5dSAndroid Build Coastguard Worker assert(A::count == 1); 45*c05d8e5dSAndroid Build Coastguard Worker assert(B::count == 1); 46*c05d8e5dSAndroid Build Coastguard Worker throw a; 47*c05d8e5dSAndroid Build Coastguard Worker assert(false); 48*c05d8e5dSAndroid Build Coastguard Worker } 49*c05d8e5dSAndroid Build Coastguard Worker f2()50*c05d8e5dSAndroid Build Coastguard Workervoid f2() 51*c05d8e5dSAndroid Build Coastguard Worker { 52*c05d8e5dSAndroid Build Coastguard Worker try 53*c05d8e5dSAndroid Build Coastguard Worker { 54*c05d8e5dSAndroid Build Coastguard Worker assert(A::count == 0); 55*c05d8e5dSAndroid Build Coastguard Worker f1(); 56*c05d8e5dSAndroid Build Coastguard Worker assert(false); 57*c05d8e5dSAndroid Build Coastguard Worker } 58*c05d8e5dSAndroid Build Coastguard Worker catch (A a) 59*c05d8e5dSAndroid Build Coastguard Worker { 60*c05d8e5dSAndroid Build Coastguard Worker assert(A::count != 0); 61*c05d8e5dSAndroid Build Coastguard Worker assert(B::count != 0); 62*c05d8e5dSAndroid Build Coastguard Worker assert(a.id_ == 3); 63*c05d8e5dSAndroid Build Coastguard Worker throw; 64*c05d8e5dSAndroid Build Coastguard Worker } 65*c05d8e5dSAndroid Build Coastguard Worker catch (B b) 66*c05d8e5dSAndroid Build Coastguard Worker { 67*c05d8e5dSAndroid Build Coastguard Worker assert(false); 68*c05d8e5dSAndroid Build Coastguard Worker } 69*c05d8e5dSAndroid Build Coastguard Worker } 70*c05d8e5dSAndroid Build Coastguard Worker main()71*c05d8e5dSAndroid Build Coastguard Workerint main() 72*c05d8e5dSAndroid Build Coastguard Worker { 73*c05d8e5dSAndroid Build Coastguard Worker try 74*c05d8e5dSAndroid Build Coastguard Worker { 75*c05d8e5dSAndroid Build Coastguard Worker f2(); 76*c05d8e5dSAndroid Build Coastguard Worker assert(false); 77*c05d8e5dSAndroid Build Coastguard Worker } 78*c05d8e5dSAndroid Build Coastguard Worker catch (const B& b) 79*c05d8e5dSAndroid Build Coastguard Worker { 80*c05d8e5dSAndroid Build Coastguard Worker assert(B::count != 0); 81*c05d8e5dSAndroid Build Coastguard Worker assert(b.id_ == 2); 82*c05d8e5dSAndroid Build Coastguard Worker } 83*c05d8e5dSAndroid Build Coastguard Worker assert(A::count == 0); 84*c05d8e5dSAndroid Build Coastguard Worker assert(B::count == 0); 85*c05d8e5dSAndroid Build Coastguard Worker } 86