1830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant//===---------------------- catch_class_02.cpp ----------------------------===// 2830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant// 3830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant// The LLVM Compiler Infrastructure 4830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant// 5830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant// 8830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant//===----------------------------------------------------------------------===// 9830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant 10830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant#include <exception> 11830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant#include <stdlib.h> 12830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant#include <assert.h> 13830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant 14830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnantstruct B 15830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant{ 16830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant static int count; 17830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant int id_; 18830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant explicit B(int id) : id_(id) {count++;} 19830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant B(const B& a) : id_(a.id_) {count++;} 20830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant ~B() {count--;} 21830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant}; 22830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant 23830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnantint B::count = 0; 24830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant 25830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnantstruct A 26830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant : B 27830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant{ 28830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant static int count; 29830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant int id_; 30830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant explicit A(int id) : B(id-1), id_(id) {count++;} 31830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant A(const A& a) : B(a.id_-1), id_(a.id_) {count++;} 32830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant ~A() {count--;} 33830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant}; 34830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant 35830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnantint A::count = 0; 36830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant 37830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnantvoid f1() 38830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant{ 39830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant assert(A::count == 0); 40830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant assert(B::count == 0); 41830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant A a(3); 42830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant assert(A::count == 1); 43830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant assert(B::count == 1); 44830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant throw a; 45830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant assert(false); 46830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant} 47830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant 48830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnantvoid f2() 49830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant{ 50830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant try 51830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant { 52830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant assert(A::count == 0); 53830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant f1(); 54830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant assert(false); 55830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant } 56830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant catch (A a) 57830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant { 58830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant assert(A::count != 0); 59830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant assert(B::count != 0); 60830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant assert(a.id_ == 3); 61830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant throw; 62830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant } 63830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant catch (B b) 64830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant { 65830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant assert(false); 66830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant } 67830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant} 68830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant 69830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnantint main() 70830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant{ 71830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant try 72830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant { 73830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant f2(); 74830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant assert(false); 75830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant } 76830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant catch (const B& b) 77830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant { 78830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant assert(B::count != 0); 79830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant assert(b.id_ == 2); 80830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant } 81830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant assert(A::count == 0); 82830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant assert(B::count == 0); 83830713c63ecaf0a5d7690db92f83f2741754de15Howard Hinnant} 84