2008-07-15 Vladimir Makarov <vmakarov@redhat.com>
[official-gcc.git] / gcc / testsuite / g++.dg / ext / has_trivial_destructor.C
blob719f05fd7a56ea323627c59a23df97327b9cddc7
1 // { dg-do "run" }
2 #include <cassert>
4 struct A
6   double a;
7   double b;
8 };
10 union U
12   double a;
13   double b;
16 struct B
18   ~B() { }
21 struct C 
22 : public B { };
24 struct D
25 : public A { };
27 template<typename T>
28   bool
29   f()
30   { return __has_trivial_destructor(T); } 
32 template<typename T>
33   class My
34   {
35   public:
36     bool
37     f()
38     { return !!__has_trivial_destructor(T); }
39   };
41 template<typename T>
42   class My2
43   {
44   public:
45     static const bool trait = __has_trivial_destructor(T);
46   };
48 template<typename T>
49   const bool My2<T>::trait;
51 template<typename T, bool b = __has_trivial_destructor(T)>
52   struct My3_help
53   { static const bool trait = b; };
55 template<typename T, bool b>
56   const bool My3_help<T, b>::trait;
58 template<typename T>
59   class My3
60   {
61   public:
62     bool
63     f()
64     { return My3_help<T>::trait; }
65   };
67 #define PTEST(T) (__has_trivial_destructor(T) && f<T>() \
68                   && My<T>().f() && My2<T>::trait && My3<T>().f())
70 #define NTEST(T) (!__has_trivial_destructor(T) && !f<T>() \
71                   && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
73 int main()
75   assert (PTEST (int));
76   assert (NTEST (int (int)));
77   assert (NTEST (void));
78   assert (PTEST (A));
79   assert (PTEST (U));
80   assert (NTEST (B));
81   assert (NTEST (C));
82   assert (PTEST (D));
83   assert (PTEST (D[]));
85   return 0;