1 // RUN: clang-cc -fsyntax-only -verify %s
2 #define T(b) (b) ? 1 : -1
3 #define F(b) (b) ? -1 : 1
4 
5 struct NonPOD { NonPOD(int); };
6 
7 // PODs
8 enum Enum { EV };
9 struct POD { Enum e; int i; float f; NonPOD* p; };
10 typedef int Int;
11 typedef Int IntAr[10];
12 class Statics { static int priv; static NonPOD np; };
13 
14 // Not PODs
15 struct Derives : POD {};
16 struct HasCons { HasCons(int); };
17 struct HasAssign { HasAssign operator =(const HasAssign&); };
18 struct HasDest { ~HasDest(); };
19 class  HasPriv { int priv; };
20 class  HasProt { protected: int prot; };
21 struct HasRef { int i; int& ref; HasRef() : i(0), ref(i) {} };
22 struct HasNonPOD { NonPOD np; };
23 struct HasVirt { virtual void Virt() {}; };
24 typedef Derives NonPODAr[10];
25 typedef HasVirt VirtAr[10];
26 
27 void is_pod()
28 {
29   int t01[T(__is_pod(int))];
30   int t02[T(__is_pod(Enum))];
31   int t03[T(__is_pod(POD))];
32   int t04[T(__is_pod(Int))];
33   int t05[T(__is_pod(IntAr))];
34   int t06[T(__is_pod(Statics))];
35 
36   int t21[F(__is_pod(Derives))];
37   int t22[F(__is_pod(HasCons))];
38   int t23[F(__is_pod(HasAssign))];
39   int t24[F(__is_pod(HasDest))];
40   int t25[F(__is_pod(HasPriv))];
41   int t26[F(__is_pod(HasProt))];
42   int t27[F(__is_pod(HasRef))];
43   int t28[F(__is_pod(HasNonPOD))];
44   int t29[F(__is_pod(HasVirt))];
45   int t30[F(__is_pod(NonPODAr))];
46 }
47 
48 union Union { int i; float f; };
49 typedef Derives ClassType;
50 
51 void is_class()
52 {
53   int t01[T(__is_class(Derives))];
54   int t02[T(__is_class(HasPriv))];
55   int t03[T(__is_class(ClassType))];
56 
57   int t11[F(__is_class(int))];
58   int t12[F(__is_class(Enum))];
59   int t13[F(__is_class(Int))];
60   int t14[F(__is_class(IntAr))];
61   int t15[F(__is_class(NonPODAr))];
62   int t16[F(__is_class(Union))];
63 }
64 
65 typedef Union UnionAr[10];
66 typedef Union UnionType;
67 
68 void is_union()
69 {
70   int t01[T(__is_union(Union))];
71   int t02[T(__is_union(UnionType))];
72 
73   int t11[F(__is_union(int))];
74   int t12[F(__is_union(Enum))];
75   int t13[F(__is_union(Int))];
76   int t14[F(__is_union(IntAr))];
77   int t15[F(__is_union(UnionAr))];
78 }
79 
80 typedef Enum EnumType;
81 
82 void is_enum()
83 {
84   int t01[T(__is_enum(Enum))];
85   int t02[T(__is_enum(EnumType))];
86 
87   int t11[F(__is_enum(int))];
88   int t12[F(__is_enum(Union))];
89   int t13[F(__is_enum(Int))];
90   int t14[F(__is_enum(IntAr))];
91   int t15[F(__is_enum(UnionAr))];
92   int t16[F(__is_enum(Derives))];
93   int t17[F(__is_enum(ClassType))];
94 }
95 
96 struct Polymorph { virtual void f(); };
97 struct InheritPolymorph : Polymorph {};
98 
99 void is_polymorphic()
100 {
101   int t01[T(__is_polymorphic(Polymorph))];
102   int t02[T(__is_polymorphic(InheritPolymorph))];
103 
104   int t11[F(__is_polymorphic(int))];
105   int t12[F(__is_polymorphic(Union))];
106   int t13[F(__is_polymorphic(Int))];
107   int t14[F(__is_polymorphic(IntAr))];
108   int t15[F(__is_polymorphic(UnionAr))];
109   int t16[F(__is_polymorphic(Derives))];
110   int t17[F(__is_polymorphic(ClassType))];
111   int t18[F(__is_polymorphic(Enum))];
112 }
113 
114 typedef Int& IntRef;
115 typedef const IntAr ConstIntAr;
116 typedef ConstIntAr ConstIntArAr[4];
117 
118 struct HasCopy {
119   HasCopy(HasCopy& cp);
120 };
121 
122 void has_trivial_default_constructor() {
123   int t01[T(__has_trivial_constructor(Int))];
124   int t02[T(__has_trivial_constructor(IntAr))];
125   int t03[T(__has_trivial_constructor(Union))];
126   int t04[T(__has_trivial_constructor(UnionAr))];
127   int t05[T(__has_trivial_constructor(POD))];
128   int t06[T(__has_trivial_constructor(Derives))];
129   int t07[T(__has_trivial_constructor(ConstIntAr))];
130   int t08[T(__has_trivial_constructor(ConstIntArAr))];
131   int t09[T(__has_trivial_constructor(HasDest))];
132   int t10[T(__has_trivial_constructor(HasPriv))];
133   int t11[F(__has_trivial_constructor(HasCons))];
134   int t12[F(__has_trivial_constructor(HasRef))];
135   int t13[F(__has_trivial_constructor(HasCopy))];
136   int t14[F(__has_trivial_constructor(IntRef))];
137   int t15[T(__has_trivial_constructor(HasAssign))];
138   int t16[T(__has_trivial_constructor(const Int))];
139   int t17[T(__has_trivial_constructor(NonPODAr))];
140   int t18[F(__has_trivial_constructor(VirtAr))];
141 }
142 
143 void has_trivial_copy_constructor() {
144   int t01[T(__has_trivial_copy(Int))];
145   int t02[T(__has_trivial_copy(IntAr))];
146   int t03[T(__has_trivial_copy(Union))];
147   int t04[T(__has_trivial_copy(UnionAr))];
148   int t05[T(__has_trivial_copy(POD))];
149   int t06[T(__has_trivial_copy(Derives))];
150   int t07[T(__has_trivial_copy(ConstIntAr))];
151   int t08[T(__has_trivial_copy(ConstIntArAr))];
152   int t09[T(__has_trivial_copy(HasDest))];
153   int t10[T(__has_trivial_copy(HasPriv))];
154   int t11[T(__has_trivial_copy(HasCons))];
155   int t12[T(__has_trivial_copy(HasRef))];
156   int t13[F(__has_trivial_copy(HasCopy))];
157   int t14[T(__has_trivial_copy(IntRef))];
158   int t15[T(__has_trivial_copy(HasAssign))];
159   int t16[T(__has_trivial_copy(const Int))];
160   int t17[F(__has_trivial_copy(NonPODAr))];
161   int t18[F(__has_trivial_copy(VirtAr))];
162 }
163 
164 void has_trivial_copy_assignment() {
165   int t01[T(__has_trivial_assign(Int))];
166   int t02[T(__has_trivial_assign(IntAr))];
167   int t03[T(__has_trivial_assign(Union))];
168   int t04[T(__has_trivial_assign(UnionAr))];
169   int t05[T(__has_trivial_assign(POD))];
170   int t06[T(__has_trivial_assign(Derives))];
171   int t07[F(__has_trivial_assign(ConstIntAr))];
172   int t08[F(__has_trivial_assign(ConstIntArAr))];
173   int t09[T(__has_trivial_assign(HasDest))];
174   int t10[T(__has_trivial_assign(HasPriv))];
175   int t11[T(__has_trivial_assign(HasCons))];
176   int t12[T(__has_trivial_assign(HasRef))];
177   int t13[T(__has_trivial_assign(HasCopy))];
178   int t14[F(__has_trivial_assign(IntRef))];
179   int t15[F(__has_trivial_assign(HasAssign))];
180   int t16[F(__has_trivial_assign(const Int))];
181   int t17[F(__has_trivial_assign(NonPODAr))];
182   int t18[F(__has_trivial_assign(VirtAr))];
183 }
184 
185 void has_trivial_destructor() {
186   int t01[T(__has_trivial_destructor(Int))];
187   int t02[T(__has_trivial_destructor(IntAr))];
188   int t03[T(__has_trivial_destructor(Union))];
189   int t04[T(__has_trivial_destructor(UnionAr))];
190   int t05[T(__has_trivial_destructor(POD))];
191   int t06[T(__has_trivial_destructor(Derives))];
192   int t07[T(__has_trivial_destructor(ConstIntAr))];
193   int t08[T(__has_trivial_destructor(ConstIntArAr))];
194   int t09[F(__has_trivial_destructor(HasDest))];
195   int t10[T(__has_trivial_destructor(HasPriv))];
196   int t11[T(__has_trivial_destructor(HasCons))];
197   int t12[T(__has_trivial_destructor(HasRef))];
198   int t13[T(__has_trivial_destructor(HasCopy))];
199   int t14[T(__has_trivial_destructor(IntRef))];
200   int t15[T(__has_trivial_destructor(HasAssign))];
201   int t16[T(__has_trivial_destructor(const Int))];
202   int t17[T(__has_trivial_destructor(NonPODAr))];
203   int t18[T(__has_trivial_destructor(VirtAr))];
204 }
205