OSDN Git Service

PR java/43504
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / g++.dg / ext / is_abstract.C
1 // { dg-do "run" }
2 #include <cassert>
3
4 struct A
5 {
6   double a;
7   double b;
8 };
9
10 union U
11 {
12   double a;
13   double b;
14 };
15
16 class B
17 {
18   B();
19 };
20
21 class C
22 {
23   virtual void rotate(int) = 0;
24 };
25
26 class D
27 {
28   virtual void rotate(int) { }
29 };
30
31 template<typename T>
32   bool
33   f()
34   { return __is_abstract(T); } 
35
36 template<typename T>
37   class My
38   {
39   public:
40     bool
41     f()
42     { return !!__is_abstract(T); }
43   };
44
45 template<typename T>
46   class My2
47   {
48   public:
49     static const bool trait = __is_abstract(T);
50   };
51
52 template<typename T>
53   const bool My2<T>::trait;
54
55 template<typename T, bool b = __is_abstract(T)>
56   struct My3_help
57   { static const bool trait = b; };
58
59 template<typename T, bool b>
60   const bool My3_help<T, b>::trait;
61
62 template<typename T>
63   class My3
64   {
65   public:
66     bool
67     f()
68     { return My3_help<T>::trait; }
69   };
70
71 #define PTEST(T) (__is_abstract(T) && f<T>() \
72                   && My<T>().f() && My2<T>::trait && My3<T>().f())
73
74 #define NTEST(T) (!__is_abstract(T) && !f<T>() \
75                   && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
76
77 int main()
78 {
79   assert (NTEST (int));
80   assert (NTEST (void));
81   assert (NTEST (A));
82   assert (NTEST (U));
83   assert (NTEST (B));
84   assert (NTEST (B[]));  
85   assert (PTEST (C));
86   assert (NTEST (D));
87
88   return 0;
89 }