111
|
1 // { dg-do run }
|
|
2 #include <cassert>
|
|
3
|
|
4 struct A
|
|
5 {
|
|
6 double a;
|
|
7 double b;
|
|
8 };
|
|
9
|
|
10 class B
|
|
11 {
|
|
12 B() { }
|
|
13 };
|
|
14
|
|
15 union U
|
|
16 {
|
|
17 double a;
|
|
18 double b;
|
|
19 };
|
|
20
|
|
21 template<typename T>
|
|
22 bool
|
|
23 f()
|
|
24 { return __is_union(T); }
|
|
25
|
|
26 template<typename T>
|
|
27 class My
|
|
28 {
|
|
29 public:
|
|
30 bool
|
|
31 f()
|
|
32 { return !!__is_union(T); }
|
|
33 };
|
|
34
|
|
35 template<typename T>
|
|
36 class My2
|
|
37 {
|
|
38 public:
|
|
39 static const bool trait = __is_union(T);
|
|
40 };
|
|
41
|
|
42 template<typename T>
|
|
43 const bool My2<T>::trait;
|
|
44
|
|
45 template<typename T, bool b = __is_union(T)>
|
|
46 struct My3_help
|
|
47 { static const bool trait = b; };
|
|
48
|
|
49 template<typename T, bool b>
|
|
50 const bool My3_help<T, b>::trait;
|
|
51
|
|
52 template<typename T>
|
|
53 class My3
|
|
54 {
|
|
55 public:
|
|
56 bool
|
|
57 f()
|
|
58 { return My3_help<T>::trait; }
|
|
59 };
|
|
60
|
|
61 #define PTEST(T) (__is_union(T) && f<T>() \
|
|
62 && My<T>().f() && My2<T>::trait && My3<T>().f())
|
|
63
|
|
64 #define NTEST(T) (!__is_union(T) && !f<T>() \
|
|
65 && !My<T>().f() && !My2<T>::trait && !My3<T>().f())
|
|
66
|
|
67 int main()
|
|
68 {
|
|
69 assert (NTEST (int));
|
|
70 assert (NTEST (void));
|
|
71 assert (NTEST (A));
|
|
72 assert (NTEST (B));
|
|
73 assert (PTEST (U));
|
|
74
|
|
75 return 0;
|
|
76 }
|