Home | History | Annotate | Download | only in jni
      1 // { dg-do "run" }
      2 #include <cassert>
      3 
      4 struct A
      5 {
      6   double a;
      7   double b;
      8 };
      9 
     10 struct B
     11 {
     12   A a;
     13 };
     14 
     15 struct C
     16 : public A { };
     17 
     18 struct D
     19 {
     20   D(const D&) throw() { }
     21 };
     22 
     23 struct E
     24 {
     25   E(const E&) throw(int) { }
     26 };
     27 
     28 struct E1
     29 {
     30   E1(const E1&) throw(int) { throw int(); }
     31 };
     32 
     33 struct F
     34 {
     35   F() throw() { }
     36 };
     37 
     38 struct G
     39 {
     40   G() throw(int) { throw int(); }
     41 };
     42 
     43 struct H
     44 {
     45   H(H&) throw(int) { }
     46 };
     47 
     48 struct H1
     49 {
     50   H1(H1&) throw(int) { throw int(); }
     51 };
     52 
     53 struct I
     54 {
     55   I(I&) throw(int) { }
     56   I(const I&) throw() { }
     57 };
     58 
     59 struct I1
     60 {
     61   I1(I1&) throw(int) { throw int(); }
     62   I1(const I1&) throw() { }
     63 };
     64 
     65 struct J
     66 {
     67   J(J&) throw() { }
     68   J(const J&) throw() { }
     69   J(volatile J&) throw() { }
     70   J(const volatile J&) throw() { }
     71 };
     72 
     73 template<typename T>
     74   bool
     75   f()
     76   { return __has_nothrow_copy(T); }
     77 
     78 template<typename T>
     79   class My
     80   {
     81   public:
     82     bool
     83     f()
     84     { return !!__has_nothrow_copy(T); }
     85   };
     86 
     87 template<typename T>
     88   class My2
     89   {
     90   public:
     91     static const bool trait = __has_nothrow_copy(T);
     92   };
     93 
     94 template<typename T>
     95   const bool My2<T>::trait;
     96 
     97 template<typename T, bool b = __has_nothrow_copy(T)>
     98   struct My3_help
     99   { static const bool trait = b; };
    100 
    101 template<typename T, bool b>
    102   const bool My3_help<T, b>::trait;
    103 
    104 template<typename T>
    105   class My3
    106   {
    107   public:
    108     bool
    109     f()
    110     { return My3_help<T>::trait; }
    111   };
    112 
    113 #define PTEST(T) (__has_nothrow_copy(T) && f<T>() \
    114                   && My<T>().f() && My2<T>::trait && My3<T>().f())
    115 
    116 #define NTEST(T) (!__has_nothrow_copy(T) && !f<T>() \
    117                   && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
    118 
    119 int main()
    120 {
    121   assert (PTEST (int));
    122   assert (NTEST (int (int)));
    123   assert (NTEST (void));
    124   assert (PTEST (A));
    125   assert (PTEST (B));
    126   assert (PTEST (C));
    127   assert (NTEST (C[]));
    128   assert (PTEST (D));
    129   assert (NTEST (E));
    130   assert (NTEST (E1));
    131   assert (PTEST (F));
    132   assert (PTEST (G));
    133   assert (NTEST (H));
    134   assert (NTEST (H1));
    135   assert (NTEST (I));
    136   assert (NTEST (I1));
    137   assert (PTEST (J));
    138 
    139   return 0;
    140 }
    141