/ test / unwind_01.pass.cpp
unwind_01.pass.cpp
  1  //===------------------------- unwind_01.cpp ------------------------------===//
  2  //
  3  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4  // See https://llvm.org/LICENSE.txt for license information.
  5  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6  //
  7  //===----------------------------------------------------------------------===//
  8  
  9  // UNSUPPORTED: no-exceptions
 10  
 11  #include <assert.h>
 12  
 13  #if defined(__GNUC__)
 14  #pragma GCC diagnostic ignored "-Wunreachable-code"
 15  #endif
 16  
 17  struct A
 18  {
 19      static int count;
 20      int id_;
 21      A() : id_(++count) {}
 22      ~A() {assert(id_ == count--);}
 23  
 24  private:
 25      A(const A&);
 26      A& operator=(const A&);
 27  };
 28  
 29  int A::count = 0;
 30  
 31  struct B
 32  {
 33      static int count;
 34      int id_;
 35      B() : id_(++count) {}
 36      ~B() {assert(id_ == count--);}
 37  
 38  private:
 39      B(const B&);
 40      B& operator=(const B&);
 41  };
 42  
 43  int B::count = 0;
 44  
 45  struct C
 46  {
 47      static int count;
 48      int id_;
 49      C() : id_(++count) {}
 50      ~C() {assert(id_ == count--);}
 51  
 52  private:
 53      C(const C&);
 54      C& operator=(const C&);
 55  };
 56  
 57  int C::count = 0;
 58  
 59  void f2()
 60  {
 61      C c;
 62      A a;
 63      throw 55;
 64      B b;
 65  }
 66  
 67  void f1()
 68  {
 69      A a;
 70      B b;
 71      f2();
 72      C c;
 73  }
 74  
 75  int main(int, char**)
 76  {
 77      try
 78      {
 79          f1();
 80          assert(false);
 81      }
 82      catch (int* i)
 83      {
 84          assert(false);
 85      }
 86      catch (long i)
 87      {
 88          assert(false);
 89      }
 90      catch (int i)
 91      {
 92          assert(i == 55);
 93      }
 94      catch (...)
 95      {
 96          assert(false);
 97      }
 98      assert(A::count == 0);
 99      assert(B::count == 0);
100      assert(C::count == 0);
101  
102      return 0;
103  }