11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//===---------------------- catch_class_01.cpp ----------------------------===//
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//                     The LLVM Compiler Infrastructure
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This file is dual licensed under the MIT and the University of Illinois Open
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Source Licenses. See LICENSE.TXT for details.
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//===----------------------------------------------------------------------===//
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <exception>
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <stdlib.h>
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <assert.h>
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistruct A
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    static int count;
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int id_;
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    explicit A(int id) : id_(id) {count++;}
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    A(const A& a) : id_(a.id_) {count++;}
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ~A() {count--;}
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint A::count = 0;
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid f1()
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    throw A(3);
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid f2()
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    try
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert(A::count == 0);
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        f1();
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    catch (A a)
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert(A::count != 0);
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert(a.id_ == 3);
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        throw;
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint main()
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    try
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        f2();
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert(false);
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    catch (const A& a)
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert(A::count != 0);
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        assert(a.id_ == 3);
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    assert(A::count == 0);
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci