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