Merged trunk at revision 161680 into branch.
[official-gcc.git] / gcc / testsuite / g++.dg / ext / has_virtual_destructor.C
blob093e7f5004d095777d0c44ff00274cc4c25aecc3
1 // { dg-do "run" }
2 #include <cassert>
3 #include <exception>
5 struct A
7   double a;
8   double b;
9 };
11 union U
13   double a;
14   double b;
17 struct B
19   virtual ~B() { }
22 struct C
23 : public B { };
25 struct D
27   ~D() { }
30 template<typename T>
31   bool
32   f()
33   { return __has_virtual_destructor(T); } 
35 template<typename T>
36   class My
37   {
38   public:
39     bool
40     f()
41     { return !!__has_virtual_destructor(T); }
42   };
44 template<typename T>
45   class My2
46   {
47   public:
48     static const bool trait = __has_virtual_destructor(T);
49   };
51 template<typename T>
52   const bool My2<T>::trait;
54 template<typename T, bool b = __has_virtual_destructor(T)>
55   struct My3_help
56   { static const bool trait = b; };
58 template<typename T, bool b>
59   const bool My3_help<T, b>::trait;
61 template<typename T>
62   class My3
63   {
64   public:
65     bool
66     f()
67     { return My3_help<T>::trait; }
68   };
70 #define PTEST(T) (__has_virtual_destructor(T) && f<T>() \
71                   && My<T>().f() && My2<T>::trait && My3<T>().f())
73 #define NTEST(T) (!__has_virtual_destructor(T) && !f<T>() \
74                   && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
76 int main()
78   assert (NTEST (int));
79   assert (NTEST (void));
80   assert (PTEST (std::exception));
81   assert (NTEST (A));
82   assert (NTEST (U));
83   assert (PTEST (B));
84   assert (PTEST (C));
85   assert (NTEST (C[]));
86   assert (NTEST (D));
88   return 0;