]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/SemaCXX/type-traits.cpp
Vendor import of clang trunk r338150:
[FreeBSD/FreeBSD.git] / test / SemaCXX / type-traits.cpp
1 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify -std=gnu++11 -fms-extensions -Wno-microsoft %s
2 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify -std=gnu++14 -fms-extensions -Wno-microsoft %s
3 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify -std=gnu++1z -fms-extensions -Wno-microsoft %s
4
5 #define T(b) (b) ? 1 : -1
6 #define F(b) (b) ? -1 : 1
7
8 struct NonPOD { NonPOD(int); };
9 typedef NonPOD NonPODAr[10];
10 typedef NonPOD NonPODArNB[];
11 typedef NonPOD NonPODArMB[10][2];
12
13 // PODs
14 enum Enum { EV };
15 struct POD { Enum e; int i; float f; NonPOD* p; };
16 struct Empty {};
17 typedef Empty EmptyAr[10];
18 typedef Empty EmptyArNB[];
19 typedef Empty EmptyArMB[1][2];
20 typedef int Int;
21 typedef Int IntAr[10];
22 typedef Int IntArNB[];
23 class Statics { static int priv; static NonPOD np; };
24 union EmptyUnion {};
25 union IncompleteUnion; // expected-note {{forward declaration of 'IncompleteUnion'}}
26 union Union { int i; float f; };
27 struct HasFunc { void f (); };
28 struct HasOp { void operator *(); };
29 struct HasConv { operator int(); };
30 struct HasAssign { void operator =(int); };
31
32 struct HasAnonymousUnion {
33   union {
34     int i;
35     float f;
36   };
37 };
38
39 typedef int Vector __attribute__((vector_size(16)));
40 typedef int VectorExt __attribute__((ext_vector_type(4)));
41
42 using ComplexFloat = _Complex float;
43 using ComplexInt = _Complex int;
44
45 // Not PODs
46 typedef const void cvoid;
47 struct Derives : POD {};
48 typedef Derives DerivesAr[10];
49 typedef Derives DerivesArNB[];
50 struct DerivesEmpty : Empty {};
51 struct HasCons { HasCons(int); };
52 struct HasDefaultCons { HasDefaultCons() = default; };
53 struct HasExplicitDefaultCons { explicit HasExplicitDefaultCons() = default; };
54 struct HasInheritedCons : HasDefaultCons { using HasDefaultCons::HasDefaultCons; };
55 struct HasNoInheritedCons : HasCons {};
56 struct HasCopyAssign { HasCopyAssign operator =(const HasCopyAssign&); };
57 struct HasMoveAssign { HasMoveAssign operator =(const HasMoveAssign&&); };
58 struct HasNoThrowMoveAssign { 
59   HasNoThrowMoveAssign& operator=(
60     const HasNoThrowMoveAssign&&) throw(); };
61 struct HasNoExceptNoThrowMoveAssign { 
62   HasNoExceptNoThrowMoveAssign& operator=(
63     const HasNoExceptNoThrowMoveAssign&&) noexcept; 
64 };
65 struct HasThrowMoveAssign { 
66   HasThrowMoveAssign& operator=(const HasThrowMoveAssign&&)
67 #if __cplusplus <= 201402L
68   throw(POD);
69 #else
70   noexcept(false);
71 #endif
72 };
73
74
75 struct HasNoExceptFalseMoveAssign { 
76   HasNoExceptFalseMoveAssign& operator=(
77     const HasNoExceptFalseMoveAssign&&) noexcept(false); };
78 struct HasMoveCtor { HasMoveCtor(const HasMoveCtor&&); };
79 struct HasMemberMoveCtor { HasMoveCtor member; };
80 struct HasMemberMoveAssign { HasMoveAssign member; };
81 struct HasStaticMemberMoveCtor { static HasMoveCtor member; };
82 struct HasStaticMemberMoveAssign { static HasMoveAssign member; };
83 struct HasMemberThrowMoveAssign { HasThrowMoveAssign member; };
84 struct HasMemberNoExceptFalseMoveAssign { 
85   HasNoExceptFalseMoveAssign member; };
86 struct HasMemberNoThrowMoveAssign { HasNoThrowMoveAssign member; };
87 struct HasMemberNoExceptNoThrowMoveAssign { 
88   HasNoExceptNoThrowMoveAssign member; };
89
90 struct HasDefaultTrivialCopyAssign { 
91   HasDefaultTrivialCopyAssign &operator=(
92     const HasDefaultTrivialCopyAssign&) = default; 
93 };
94 struct TrivialMoveButNotCopy { 
95   TrivialMoveButNotCopy &operator=(TrivialMoveButNotCopy&&) = default;
96   TrivialMoveButNotCopy &operator=(const TrivialMoveButNotCopy&);
97 };
98 struct NonTrivialDefault {
99   NonTrivialDefault();
100 };
101
102 struct HasDest { ~HasDest(); };
103 class  HasPriv { int priv; };
104 class  HasProt { protected: int prot; };
105 struct HasRef { int i; int& ref; HasRef() : i(0), ref(i) {} };
106 struct HasRefAggregate { int i; int& ref; };
107 struct HasNonPOD { NonPOD np; };
108 struct HasVirt { virtual void Virt() {}; };
109 typedef NonPOD NonPODAr[10];
110 typedef HasVirt VirtAr[10];
111 typedef NonPOD NonPODArNB[];
112 union NonPODUnion { int i; Derives n; };
113 struct DerivesHasCons : HasCons {};
114 struct DerivesHasCopyAssign : HasCopyAssign {};
115 struct DerivesHasMoveAssign : HasMoveAssign {};
116 struct DerivesHasDest : HasDest {};
117 struct DerivesHasPriv : HasPriv {};
118 struct DerivesHasProt : HasProt {};
119 struct DerivesHasRef : HasRef {};
120 struct DerivesHasVirt : HasVirt {};
121 struct DerivesHasMoveCtor : HasMoveCtor {};
122
123 struct HasNoThrowCopyAssign {
124   void operator =(const HasNoThrowCopyAssign&) throw();
125 };
126 struct HasMultipleCopyAssign {
127   void operator =(const HasMultipleCopyAssign&) throw();
128   void operator =(volatile HasMultipleCopyAssign&);
129 };
130 struct HasMultipleNoThrowCopyAssign {
131   void operator =(const HasMultipleNoThrowCopyAssign&) throw();
132   void operator =(volatile HasMultipleNoThrowCopyAssign&) throw();
133 };
134
135 struct HasNoThrowConstructor { HasNoThrowConstructor() throw(); };
136 struct HasNoThrowConstructorWithArgs {
137   HasNoThrowConstructorWithArgs(HasCons i = HasCons(0)) throw();
138 };
139 struct HasMultipleDefaultConstructor1 {
140   HasMultipleDefaultConstructor1() throw();
141   HasMultipleDefaultConstructor1(int i = 0);
142 };
143 struct HasMultipleDefaultConstructor2 {
144   HasMultipleDefaultConstructor2(int i = 0);
145   HasMultipleDefaultConstructor2() throw();
146 };
147
148 struct HasNoThrowCopy { HasNoThrowCopy(const HasNoThrowCopy&) throw(); };
149 struct HasMultipleCopy {
150   HasMultipleCopy(const HasMultipleCopy&) throw();
151   HasMultipleCopy(volatile HasMultipleCopy&);
152 };
153 struct HasMultipleNoThrowCopy {
154   HasMultipleNoThrowCopy(const HasMultipleNoThrowCopy&) throw();
155   HasMultipleNoThrowCopy(volatile HasMultipleNoThrowCopy&) throw();
156 };
157
158 struct HasVirtDest { virtual ~HasVirtDest(); };
159 struct DerivedVirtDest : HasVirtDest {};
160 typedef HasVirtDest VirtDestAr[1];
161
162 class AllPrivate {
163   AllPrivate() throw();
164   AllPrivate(const AllPrivate&) throw();
165   AllPrivate &operator=(const AllPrivate &) throw();
166   ~AllPrivate() throw();
167 };
168
169 struct ThreeArgCtor {
170   ThreeArgCtor(int*, char*, int);
171 };
172
173 struct VariadicCtor {
174   template<typename...T> VariadicCtor(T...);
175 };
176
177 struct ThrowingDtor {
178   ~ThrowingDtor()
179 #if __cplusplus <= 201402L
180   throw(int);
181 #else
182   noexcept(false);
183 #endif
184 };
185
186 struct NoExceptDtor {
187   ~NoExceptDtor() noexcept(true);
188 };
189
190 struct NoThrowDtor {
191   ~NoThrowDtor() throw();
192 };
193
194 struct ACompleteType {};
195 struct AnIncompleteType; // expected-note 1+ {{forward declaration of 'AnIncompleteType'}}
196 typedef AnIncompleteType AnIncompleteTypeAr[42];
197 typedef AnIncompleteType AnIncompleteTypeArNB[];
198 typedef AnIncompleteType AnIncompleteTypeArMB[1][10];
199
200 struct HasInClassInit {
201   int x = 42;
202 };
203
204 struct HasPrivateBase : private ACompleteType {};
205 struct HasProtectedBase : protected ACompleteType {};
206 struct HasVirtBase : virtual ACompleteType {};
207
208 void is_pod()
209 {
210   { int arr[T(__is_pod(int))]; }
211   { int arr[T(__is_pod(Enum))]; }
212   { int arr[T(__is_pod(POD))]; }
213   { int arr[T(__is_pod(Int))]; }
214   { int arr[T(__is_pod(IntAr))]; }
215   { int arr[T(__is_pod(Statics))]; }
216   { int arr[T(__is_pod(Empty))]; }
217   { int arr[T(__is_pod(EmptyUnion))]; }
218   { int arr[T(__is_pod(Union))]; }
219   { int arr[T(__is_pod(HasFunc))]; }
220   { int arr[T(__is_pod(HasOp))]; }
221   { int arr[T(__is_pod(HasConv))]; }
222   { int arr[T(__is_pod(HasAssign))]; }
223   { int arr[T(__is_pod(IntArNB))]; }
224   { int arr[T(__is_pod(HasAnonymousUnion))]; }
225   { int arr[T(__is_pod(Vector))]; }
226   { int arr[T(__is_pod(VectorExt))]; }
227   { int arr[T(__is_pod(Derives))]; }
228   { int arr[T(__is_pod(DerivesAr))]; }
229   { int arr[T(__is_pod(DerivesArNB))]; }
230   { int arr[T(__is_pod(DerivesEmpty))]; }
231   { int arr[T(__is_pod(HasPriv))]; }
232   { int arr[T(__is_pod(HasProt))]; }
233   { int arr[T(__is_pod(DerivesHasPriv))]; }
234   { int arr[T(__is_pod(DerivesHasProt))]; }
235
236   { int arr[F(__is_pod(HasCons))]; }
237   { int arr[F(__is_pod(HasCopyAssign))]; }
238   { int arr[F(__is_pod(HasMoveAssign))]; }
239   { int arr[F(__is_pod(HasDest))]; }
240   { int arr[F(__is_pod(HasRef))]; }
241   { int arr[F(__is_pod(HasVirt))]; }
242   { int arr[F(__is_pod(DerivesHasCons))]; }
243   { int arr[F(__is_pod(DerivesHasCopyAssign))]; }
244   { int arr[F(__is_pod(DerivesHasMoveAssign))]; }
245   { int arr[F(__is_pod(DerivesHasDest))]; }
246   { int arr[F(__is_pod(DerivesHasRef))]; }
247   { int arr[F(__is_pod(DerivesHasVirt))]; }
248   { int arr[F(__is_pod(NonPOD))]; }
249   { int arr[F(__is_pod(HasNonPOD))]; }
250   { int arr[F(__is_pod(NonPODAr))]; }
251   { int arr[F(__is_pod(NonPODArNB))]; }
252   { int arr[F(__is_pod(void))]; }
253   { int arr[F(__is_pod(cvoid))]; }
254 // { int arr[F(__is_pod(NonPODUnion))]; }
255
256   { int arr[T(__is_pod(ACompleteType))]; }
257   { int arr[F(__is_pod(AnIncompleteType))]; } // expected-error {{incomplete type}}
258   { int arr[F(__is_pod(AnIncompleteType[]))]; } // expected-error {{incomplete type}}
259   { int arr[F(__is_pod(AnIncompleteType[1]))]; } // expected-error {{incomplete type}}
260 }
261
262 typedef Empty EmptyAr[10];
263 struct Bit0 { int : 0; };
264 struct Bit0Cons { int : 0; Bit0Cons(); };
265 struct AnonBitOnly { int : 3; };
266 struct BitOnly { int x : 3; };
267 struct DerivesVirt : virtual POD {};
268
269 void is_empty()
270 {
271   { int arr[T(__is_empty(Empty))]; }
272   { int arr[T(__is_empty(DerivesEmpty))]; }
273   { int arr[T(__is_empty(HasCons))]; }
274   { int arr[T(__is_empty(HasCopyAssign))]; }
275   { int arr[T(__is_empty(HasMoveAssign))]; }
276   { int arr[T(__is_empty(HasDest))]; }
277   { int arr[T(__is_empty(HasFunc))]; }
278   { int arr[T(__is_empty(HasOp))]; }
279   { int arr[T(__is_empty(HasConv))]; }
280   { int arr[T(__is_empty(HasAssign))]; }
281   { int arr[T(__is_empty(Bit0))]; }
282   { int arr[T(__is_empty(Bit0Cons))]; }
283
284   { int arr[F(__is_empty(Int))]; }
285   { int arr[F(__is_empty(POD))]; }
286   { int arr[F(__is_empty(EmptyUnion))]; }
287   { int arr[F(__is_empty(IncompleteUnion))]; }
288   { int arr[F(__is_empty(EmptyAr))]; }
289   { int arr[F(__is_empty(HasRef))]; }
290   { int arr[F(__is_empty(HasVirt))]; }
291   { int arr[F(__is_empty(AnonBitOnly))]; }
292   { int arr[F(__is_empty(BitOnly))]; }
293   { int arr[F(__is_empty(void))]; }
294   { int arr[F(__is_empty(IntArNB))]; }
295   { int arr[F(__is_empty(HasAnonymousUnion))]; }
296 //  { int arr[F(__is_empty(DerivesVirt))]; }
297
298   { int arr[T(__is_empty(ACompleteType))]; }
299   { int arr[F(__is_empty(AnIncompleteType))]; } // expected-error {{incomplete type}}
300   { int arr[F(__is_empty(AnIncompleteType[]))]; }
301   { int arr[F(__is_empty(AnIncompleteType[1]))]; }
302 }
303
304 typedef Derives ClassType;
305
306 void is_class()
307 {
308   { int arr[T(__is_class(Derives))]; }
309   { int arr[T(__is_class(HasPriv))]; }
310   { int arr[T(__is_class(ClassType))]; }
311   { int arr[T(__is_class(HasAnonymousUnion))]; }
312
313   { int arr[F(__is_class(int))]; }
314   { int arr[F(__is_class(Enum))]; }
315   { int arr[F(__is_class(Int))]; }
316   { int arr[F(__is_class(IntAr))]; }
317   { int arr[F(__is_class(DerivesAr))]; }
318   { int arr[F(__is_class(Union))]; }
319   { int arr[F(__is_class(cvoid))]; }
320   { int arr[F(__is_class(IntArNB))]; }
321 }
322
323 typedef Union UnionAr[10];
324 typedef Union UnionType;
325
326 void is_union()
327 {
328   { int arr[T(__is_union(Union))]; }
329   { int arr[T(__is_union(UnionType))]; }
330
331   { int arr[F(__is_union(int))]; }
332   { int arr[F(__is_union(Enum))]; }
333   { int arr[F(__is_union(Int))]; }
334   { int arr[F(__is_union(IntAr))]; }
335   { int arr[F(__is_union(UnionAr))]; }
336   { int arr[F(__is_union(cvoid))]; }
337   { int arr[F(__is_union(IntArNB))]; }
338   { int arr[F(__is_union(HasAnonymousUnion))]; }
339 }
340
341 typedef Enum EnumType;
342
343 void is_enum()
344 {
345   { int arr[T(__is_enum(Enum))]; }
346   { int arr[T(__is_enum(EnumType))]; }
347
348   { int arr[F(__is_enum(int))]; }
349   { int arr[F(__is_enum(Union))]; }
350   { int arr[F(__is_enum(Int))]; }
351   { int arr[F(__is_enum(IntAr))]; }
352   { int arr[F(__is_enum(UnionAr))]; }
353   { int arr[F(__is_enum(Derives))]; }
354   { int arr[F(__is_enum(ClassType))]; }
355   { int arr[F(__is_enum(cvoid))]; }
356   { int arr[F(__is_enum(IntArNB))]; }
357   { int arr[F(__is_enum(HasAnonymousUnion))]; }
358 }
359
360 struct FinalClass final {
361 };
362
363 template<typename T> 
364 struct PotentiallyFinal { };
365
366 template<typename T>
367 struct PotentiallyFinal<T*> final { };
368
369 template<>
370 struct PotentiallyFinal<int> final { };
371
372 struct SealedClass sealed {
373 };
374
375 template<typename T>
376 struct PotentiallySealed { };
377
378 template<typename T>
379 struct PotentiallySealed<T*> sealed { };
380
381 template<>
382 struct PotentiallySealed<int> sealed { };
383
384 void is_final()
385 {
386         { int arr[T(__is_final(SealedClass))]; }
387         { int arr[T(__is_final(PotentiallySealed<float*>))]; }
388         { int arr[T(__is_final(PotentiallySealed<int>))]; }
389         { int arr[T(__is_final(FinalClass))]; }
390         { int arr[T(__is_final(PotentiallyFinal<float*>))]; }
391         { int arr[T(__is_final(PotentiallyFinal<int>))]; }
392
393         { int arr[F(__is_final(int))]; }
394         { int arr[F(__is_final(Union))]; }
395         { int arr[F(__is_final(Int))]; }
396         { int arr[F(__is_final(IntAr))]; }
397         { int arr[F(__is_final(UnionAr))]; }
398         { int arr[F(__is_final(Derives))]; }
399         { int arr[F(__is_final(ClassType))]; }
400         { int arr[F(__is_final(cvoid))]; }
401         { int arr[F(__is_final(IntArNB))]; }
402         { int arr[F(__is_final(HasAnonymousUnion))]; }
403         { int arr[F(__is_final(PotentiallyFinal<float>))]; }
404         { int arr[F(__is_final(PotentiallySealed<float>))]; }
405 }
406
407 void is_sealed()
408 {
409         { int arr[T(__is_sealed(SealedClass))]; }
410         { int arr[T(__is_sealed(PotentiallySealed<float*>))]; }
411         { int arr[T(__is_sealed(PotentiallySealed<int>))]; }
412         { int arr[T(__is_sealed(FinalClass))]; }
413         { int arr[T(__is_sealed(PotentiallyFinal<float*>))]; }
414         { int arr[T(__is_sealed(PotentiallyFinal<int>))]; }
415
416         { int arr[F(__is_sealed(int))]; }
417         { int arr[F(__is_sealed(Union))]; }
418         { int arr[F(__is_sealed(Int))]; }
419         { int arr[F(__is_sealed(IntAr))]; }
420         { int arr[F(__is_sealed(UnionAr))]; }
421         { int arr[F(__is_sealed(Derives))]; }
422         { int arr[F(__is_sealed(ClassType))]; }
423         { int arr[F(__is_sealed(cvoid))]; }
424         { int arr[F(__is_sealed(IntArNB))]; }
425         { int arr[F(__is_sealed(HasAnonymousUnion))]; }
426         { int arr[F(__is_sealed(PotentiallyFinal<float>))]; }
427         { int arr[F(__is_sealed(PotentiallySealed<float>))]; }
428 }
429
430 typedef HasVirt Polymorph;
431 struct InheritPolymorph : Polymorph {};
432
433 void is_polymorphic()
434 {
435   { int arr[T(__is_polymorphic(Polymorph))]; }
436   { int arr[T(__is_polymorphic(InheritPolymorph))]; }
437
438   { int arr[F(__is_polymorphic(int))]; }
439   { int arr[F(__is_polymorphic(Union))]; }
440   { int arr[F(__is_polymorphic(IncompleteUnion))]; }
441   { int arr[F(__is_polymorphic(Int))]; }
442   { int arr[F(__is_polymorphic(IntAr))]; }
443   { int arr[F(__is_polymorphic(UnionAr))]; }
444   { int arr[F(__is_polymorphic(Derives))]; }
445   { int arr[F(__is_polymorphic(ClassType))]; }
446   { int arr[F(__is_polymorphic(Enum))]; }
447   { int arr[F(__is_polymorphic(cvoid))]; }
448   { int arr[F(__is_polymorphic(IntArNB))]; }
449 }
450
451 void is_integral()
452 {
453   int t01[T(__is_integral(bool))];
454   int t02[T(__is_integral(char))];
455   int t03[T(__is_integral(signed char))];
456   int t04[T(__is_integral(unsigned char))];
457   //int t05[T(__is_integral(char16_t))];
458   //int t06[T(__is_integral(char32_t))];
459   int t07[T(__is_integral(wchar_t))];
460   int t08[T(__is_integral(short))];
461   int t09[T(__is_integral(unsigned short))];
462   int t10[T(__is_integral(int))];
463   int t11[T(__is_integral(unsigned int))];
464   int t12[T(__is_integral(long))];
465   int t13[T(__is_integral(unsigned long))];
466
467   int t21[F(__is_integral(float))];
468   int t22[F(__is_integral(double))];
469   int t23[F(__is_integral(long double))];
470   int t24[F(__is_integral(Union))];
471   int t25[F(__is_integral(UnionAr))];
472   int t26[F(__is_integral(Derives))];
473   int t27[F(__is_integral(ClassType))];
474   int t28[F(__is_integral(Enum))];
475   int t29[F(__is_integral(void))];
476   int t30[F(__is_integral(cvoid))];
477   int t31[F(__is_integral(IntArNB))];
478 }
479
480 void is_floating_point()
481 {
482   int t01[T(__is_floating_point(float))];
483   int t02[T(__is_floating_point(double))];
484   int t03[T(__is_floating_point(long double))];
485
486   int t11[F(__is_floating_point(bool))];
487   int t12[F(__is_floating_point(char))];
488   int t13[F(__is_floating_point(signed char))];
489   int t14[F(__is_floating_point(unsigned char))];
490   //int t15[F(__is_floating_point(char16_t))];
491   //int t16[F(__is_floating_point(char32_t))];
492   int t17[F(__is_floating_point(wchar_t))];
493   int t18[F(__is_floating_point(short))];
494   int t19[F(__is_floating_point(unsigned short))];
495   int t20[F(__is_floating_point(int))];
496   int t21[F(__is_floating_point(unsigned int))];
497   int t22[F(__is_floating_point(long))];
498   int t23[F(__is_floating_point(unsigned long))];
499   int t24[F(__is_floating_point(Union))];
500   int t25[F(__is_floating_point(UnionAr))];
501   int t26[F(__is_floating_point(Derives))];
502   int t27[F(__is_floating_point(ClassType))];
503   int t28[F(__is_floating_point(Enum))];
504   int t29[F(__is_floating_point(void))];
505   int t30[F(__is_floating_point(cvoid))];
506   int t31[F(__is_floating_point(IntArNB))];
507 }
508
509 template <class T>
510 struct AggregateTemplate {
511   T value;
512 };
513
514 template <class T>
515 struct NonAggregateTemplate {
516   T value;
517   NonAggregateTemplate();
518 };
519
520 void is_aggregate()
521 {
522   constexpr bool TrueAfterCpp11 = __cplusplus > 201103L;
523   constexpr bool TrueAfterCpp14 = __cplusplus > 201402L;
524
525   __is_aggregate(AnIncompleteType); // expected-error {{incomplete type}}
526   __is_aggregate(AnIncompleteType[]); // expected-error {{incomplete type}}
527   __is_aggregate(AnIncompleteType[1]); // expected-error {{incomplete type}}
528   __is_aggregate(AnIncompleteTypeAr); // expected-error {{incomplete type}}
529   __is_aggregate(AnIncompleteTypeArNB); // expected-error {{incomplete type}}
530   __is_aggregate(AnIncompleteTypeArMB); // expected-error {{incomplete type}}
531   __is_aggregate(IncompleteUnion); // expected-error {{incomplete type}}
532
533   static_assert(!__is_aggregate(NonPOD), "");
534   static_assert(__is_aggregate(NonPODAr), "");
535   static_assert(__is_aggregate(NonPODArNB), "");
536   static_assert(__is_aggregate(NonPODArMB), "");
537
538   static_assert(!__is_aggregate(Enum), "");
539   static_assert(__is_aggregate(POD), "");
540   static_assert(__is_aggregate(Empty), "");
541   static_assert(__is_aggregate(EmptyAr), "");
542   static_assert(__is_aggregate(EmptyArNB), "");
543   static_assert(__is_aggregate(EmptyArMB), "");
544   static_assert(!__is_aggregate(void), "");
545   static_assert(!__is_aggregate(const volatile void), "");
546   static_assert(!__is_aggregate(int), "");
547   static_assert(__is_aggregate(IntAr), "");
548   static_assert(__is_aggregate(IntArNB), "");
549   static_assert(__is_aggregate(EmptyUnion), "");
550   static_assert(__is_aggregate(Union), "");
551   static_assert(__is_aggregate(Statics), "");
552   static_assert(__is_aggregate(HasFunc), "");
553   static_assert(__is_aggregate(HasOp), "");
554   static_assert(__is_aggregate(HasAssign), "");
555   static_assert(__is_aggregate(HasAnonymousUnion), "");
556
557   static_assert(__is_aggregate(Derives) == TrueAfterCpp14, "");
558   static_assert(__is_aggregate(DerivesAr), "");
559   static_assert(__is_aggregate(DerivesArNB), "");
560   static_assert(!__is_aggregate(HasCons), "");
561   static_assert(__is_aggregate(HasDefaultCons), "");
562   static_assert(!__is_aggregate(HasExplicitDefaultCons), "");
563   static_assert(!__is_aggregate(HasInheritedCons), "");
564   static_assert(__is_aggregate(HasNoInheritedCons) == TrueAfterCpp14, "");
565   static_assert(__is_aggregate(HasCopyAssign), "");
566   static_assert(!__is_aggregate(NonTrivialDefault), "");
567   static_assert(__is_aggregate(HasDest), "");
568   static_assert(!__is_aggregate(HasPriv), "");
569   static_assert(!__is_aggregate(HasProt), "");
570   static_assert(__is_aggregate(HasRefAggregate), "");
571   static_assert(__is_aggregate(HasNonPOD), "");
572   static_assert(!__is_aggregate(HasVirt), "");
573   static_assert(__is_aggregate(VirtAr), "");
574   static_assert(__is_aggregate(HasInClassInit) == TrueAfterCpp11, "");
575   static_assert(!__is_aggregate(HasPrivateBase), "");
576   static_assert(!__is_aggregate(HasProtectedBase), "");
577   static_assert(!__is_aggregate(HasVirtBase), "");
578
579   static_assert(__is_aggregate(AggregateTemplate<int>), "");
580   static_assert(!__is_aggregate(NonAggregateTemplate<int>), "");
581
582   static_assert(__is_aggregate(Vector), ""); // Extension supported by GCC and Clang
583   static_assert(__is_aggregate(VectorExt), "");
584   static_assert(__is_aggregate(ComplexInt), "");
585   static_assert(__is_aggregate(ComplexFloat), "");
586 }
587
588 void is_arithmetic()
589 {
590   int t01[T(__is_arithmetic(float))];
591   int t02[T(__is_arithmetic(double))];
592   int t03[T(__is_arithmetic(long double))];
593   int t11[T(__is_arithmetic(bool))];
594   int t12[T(__is_arithmetic(char))];
595   int t13[T(__is_arithmetic(signed char))];
596   int t14[T(__is_arithmetic(unsigned char))];
597   //int t15[T(__is_arithmetic(char16_t))];
598   //int t16[T(__is_arithmetic(char32_t))];
599   int t17[T(__is_arithmetic(wchar_t))];
600   int t18[T(__is_arithmetic(short))];
601   int t19[T(__is_arithmetic(unsigned short))];
602   int t20[T(__is_arithmetic(int))];
603   int t21[T(__is_arithmetic(unsigned int))];
604   int t22[T(__is_arithmetic(long))];
605   int t23[T(__is_arithmetic(unsigned long))];
606
607   int t24[F(__is_arithmetic(Union))];
608   int t25[F(__is_arithmetic(UnionAr))];
609   int t26[F(__is_arithmetic(Derives))];
610   int t27[F(__is_arithmetic(ClassType))];
611   int t28[F(__is_arithmetic(Enum))];
612   int t29[F(__is_arithmetic(void))];
613   int t30[F(__is_arithmetic(cvoid))];
614   int t31[F(__is_arithmetic(IntArNB))];
615 }
616
617 void is_complete_type()
618 {
619   int t01[T(__is_complete_type(float))];
620   int t02[T(__is_complete_type(double))];
621   int t03[T(__is_complete_type(long double))];
622   int t11[T(__is_complete_type(bool))];
623   int t12[T(__is_complete_type(char))];
624   int t13[T(__is_complete_type(signed char))];
625   int t14[T(__is_complete_type(unsigned char))];
626   //int t15[T(__is_complete_type(char16_t))];
627   //int t16[T(__is_complete_type(char32_t))];
628   int t17[T(__is_complete_type(wchar_t))];
629   int t18[T(__is_complete_type(short))];
630   int t19[T(__is_complete_type(unsigned short))];
631   int t20[T(__is_complete_type(int))];
632   int t21[T(__is_complete_type(unsigned int))];
633   int t22[T(__is_complete_type(long))];
634   int t23[T(__is_complete_type(unsigned long))];
635   int t24[T(__is_complete_type(ACompleteType))];
636
637   int t30[F(__is_complete_type(AnIncompleteType))];
638 }
639
640 void is_void()
641 {
642   int t01[T(__is_void(void))];
643   int t02[T(__is_void(cvoid))];
644
645   int t10[F(__is_void(float))];
646   int t11[F(__is_void(double))];
647   int t12[F(__is_void(long double))];
648   int t13[F(__is_void(bool))];
649   int t14[F(__is_void(char))];
650   int t15[F(__is_void(signed char))];
651   int t16[F(__is_void(unsigned char))];
652   int t17[F(__is_void(wchar_t))];
653   int t18[F(__is_void(short))];
654   int t19[F(__is_void(unsigned short))];
655   int t20[F(__is_void(int))];
656   int t21[F(__is_void(unsigned int))];
657   int t22[F(__is_void(long))];
658   int t23[F(__is_void(unsigned long))];
659   int t24[F(__is_void(Union))];
660   int t25[F(__is_void(UnionAr))];
661   int t26[F(__is_void(Derives))];
662   int t27[F(__is_void(ClassType))];
663   int t28[F(__is_void(Enum))];
664   int t29[F(__is_void(IntArNB))];
665   int t30[F(__is_void(void*))];
666   int t31[F(__is_void(cvoid*))];
667 }
668
669 void is_array()
670 {
671   int t01[T(__is_array(IntAr))];
672   int t02[T(__is_array(IntArNB))];
673   int t03[T(__is_array(UnionAr))];
674
675   int t10[F(__is_array(void))];
676   int t11[F(__is_array(cvoid))];
677   int t12[F(__is_array(float))];
678   int t13[F(__is_array(double))];
679   int t14[F(__is_array(long double))];
680   int t15[F(__is_array(bool))];
681   int t16[F(__is_array(char))];
682   int t17[F(__is_array(signed char))];
683   int t18[F(__is_array(unsigned char))];
684   int t19[F(__is_array(wchar_t))];
685   int t20[F(__is_array(short))];
686   int t21[F(__is_array(unsigned short))];
687   int t22[F(__is_array(int))];
688   int t23[F(__is_array(unsigned int))];
689   int t24[F(__is_array(long))];
690   int t25[F(__is_array(unsigned long))];
691   int t26[F(__is_array(Union))];
692   int t27[F(__is_array(Derives))];
693   int t28[F(__is_array(ClassType))];
694   int t29[F(__is_array(Enum))];
695   int t30[F(__is_array(void*))];
696   int t31[F(__is_array(cvoid*))];
697 }
698
699 template <typename T> void tmpl_func(T&) {}
700
701 template <typename T> struct type_wrapper {
702   typedef T type;
703   typedef T* ptrtype;
704   typedef T& reftype;
705 };
706
707 void is_function()
708 {
709   int t01[T(__is_function(type_wrapper<void(void)>::type))];
710   int t02[T(__is_function(typeof(tmpl_func<int>)))];
711
712   typedef void (*ptr_to_func_type)(void);
713
714   int t10[F(__is_function(void))];
715   int t11[F(__is_function(cvoid))];
716   int t12[F(__is_function(float))];
717   int t13[F(__is_function(double))];
718   int t14[F(__is_function(long double))];
719   int t15[F(__is_function(bool))];
720   int t16[F(__is_function(char))];
721   int t17[F(__is_function(signed char))];
722   int t18[F(__is_function(unsigned char))];
723   int t19[F(__is_function(wchar_t))];
724   int t20[F(__is_function(short))];
725   int t21[F(__is_function(unsigned short))];
726   int t22[F(__is_function(int))];
727   int t23[F(__is_function(unsigned int))];
728   int t24[F(__is_function(long))];
729   int t25[F(__is_function(unsigned long))];
730   int t26[F(__is_function(Union))];
731   int t27[F(__is_function(Derives))];
732   int t28[F(__is_function(ClassType))];
733   int t29[F(__is_function(Enum))];
734   int t30[F(__is_function(void*))];
735   int t31[F(__is_function(cvoid*))];
736   int t32[F(__is_function(void(*)()))];
737   int t33[F(__is_function(ptr_to_func_type))];
738   int t34[F(__is_function(type_wrapper<void(void)>::ptrtype))];
739   int t35[F(__is_function(type_wrapper<void(void)>::reftype))];
740 }
741
742 void is_reference()
743 {
744   int t01[T(__is_reference(int&))];
745   int t02[T(__is_reference(const int&))];
746   int t03[T(__is_reference(void *&))];
747
748   int t10[F(__is_reference(int))];
749   int t11[F(__is_reference(const int))];
750   int t12[F(__is_reference(void *))];
751 }
752
753 void is_lvalue_reference()
754 {
755   int t01[T(__is_lvalue_reference(int&))];
756   int t02[T(__is_lvalue_reference(void *&))];
757   int t03[T(__is_lvalue_reference(const int&))];
758   int t04[T(__is_lvalue_reference(void * const &))];
759
760   int t10[F(__is_lvalue_reference(int))];
761   int t11[F(__is_lvalue_reference(const int))];
762   int t12[F(__is_lvalue_reference(void *))];
763 }
764
765 #if __has_feature(cxx_rvalue_references)
766
767 void is_rvalue_reference()
768 {
769   int t01[T(__is_rvalue_reference(const int&&))];
770   int t02[T(__is_rvalue_reference(void * const &&))];
771
772   int t10[F(__is_rvalue_reference(int&))];
773   int t11[F(__is_rvalue_reference(void *&))];
774   int t12[F(__is_rvalue_reference(const int&))];
775   int t13[F(__is_rvalue_reference(void * const &))];
776   int t14[F(__is_rvalue_reference(int))];
777   int t15[F(__is_rvalue_reference(const int))];
778   int t16[F(__is_rvalue_reference(void *))];
779 }
780
781 #endif
782
783 void is_fundamental()
784 {
785   int t01[T(__is_fundamental(float))];
786   int t02[T(__is_fundamental(double))];
787   int t03[T(__is_fundamental(long double))];
788   int t11[T(__is_fundamental(bool))];
789   int t12[T(__is_fundamental(char))];
790   int t13[T(__is_fundamental(signed char))];
791   int t14[T(__is_fundamental(unsigned char))];
792   //int t15[T(__is_fundamental(char16_t))];
793   //int t16[T(__is_fundamental(char32_t))];
794   int t17[T(__is_fundamental(wchar_t))];
795   int t18[T(__is_fundamental(short))];
796   int t19[T(__is_fundamental(unsigned short))];
797   int t20[T(__is_fundamental(int))];
798   int t21[T(__is_fundamental(unsigned int))];
799   int t22[T(__is_fundamental(long))];
800   int t23[T(__is_fundamental(unsigned long))];
801   int t24[T(__is_fundamental(void))];
802   int t25[T(__is_fundamental(cvoid))];
803
804   int t30[F(__is_fundamental(Union))];
805   int t31[F(__is_fundamental(UnionAr))];
806   int t32[F(__is_fundamental(Derives))];
807   int t33[F(__is_fundamental(ClassType))];
808   int t34[F(__is_fundamental(Enum))];
809   int t35[F(__is_fundamental(IntArNB))];
810 }
811
812 void is_object()
813 {
814   int t01[T(__is_object(int))];
815   int t02[T(__is_object(int *))];
816   int t03[T(__is_object(void *))];
817   int t04[T(__is_object(Union))];
818   int t05[T(__is_object(UnionAr))];
819   int t06[T(__is_object(ClassType))];
820   int t07[T(__is_object(Enum))];
821
822   int t10[F(__is_object(type_wrapper<void(void)>::type))];
823   int t11[F(__is_object(int&))];
824   int t12[F(__is_object(void))];
825 }
826
827 void is_scalar()
828 {
829   int t01[T(__is_scalar(float))];
830   int t02[T(__is_scalar(double))];
831   int t03[T(__is_scalar(long double))];
832   int t04[T(__is_scalar(bool))];
833   int t05[T(__is_scalar(char))];
834   int t06[T(__is_scalar(signed char))];
835   int t07[T(__is_scalar(unsigned char))];
836   int t08[T(__is_scalar(wchar_t))];
837   int t09[T(__is_scalar(short))];
838   int t10[T(__is_scalar(unsigned short))];
839   int t11[T(__is_scalar(int))];
840   int t12[T(__is_scalar(unsigned int))];
841   int t13[T(__is_scalar(long))];
842   int t14[T(__is_scalar(unsigned long))];
843   int t15[T(__is_scalar(Enum))];
844   int t16[T(__is_scalar(void*))];
845   int t17[T(__is_scalar(cvoid*))];
846
847   int t20[F(__is_scalar(void))];
848   int t21[F(__is_scalar(cvoid))];
849   int t22[F(__is_scalar(Union))];
850   int t23[F(__is_scalar(UnionAr))];
851   int t24[F(__is_scalar(Derives))];
852   int t25[F(__is_scalar(ClassType))];
853   int t26[F(__is_scalar(IntArNB))];
854 }
855
856 struct StructWithMembers {
857   int member;
858   void method() {}
859 };
860
861 void is_compound()
862 {
863   int t01[T(__is_compound(void*))];
864   int t02[T(__is_compound(cvoid*))];
865   int t03[T(__is_compound(void (*)()))];
866   int t04[T(__is_compound(int StructWithMembers::*))];
867   int t05[T(__is_compound(void (StructWithMembers::*)()))];
868   int t06[T(__is_compound(int&))];
869   int t07[T(__is_compound(Union))];
870   int t08[T(__is_compound(UnionAr))];
871   int t09[T(__is_compound(Derives))];
872   int t10[T(__is_compound(ClassType))];
873   int t11[T(__is_compound(IntArNB))];
874   int t12[T(__is_compound(Enum))];
875
876   int t20[F(__is_compound(float))];
877   int t21[F(__is_compound(double))];
878   int t22[F(__is_compound(long double))];
879   int t23[F(__is_compound(bool))];
880   int t24[F(__is_compound(char))];
881   int t25[F(__is_compound(signed char))];
882   int t26[F(__is_compound(unsigned char))];
883   int t27[F(__is_compound(wchar_t))];
884   int t28[F(__is_compound(short))];
885   int t29[F(__is_compound(unsigned short))];
886   int t30[F(__is_compound(int))];
887   int t31[F(__is_compound(unsigned int))];
888   int t32[F(__is_compound(long))];
889   int t33[F(__is_compound(unsigned long))];
890   int t34[F(__is_compound(void))];
891   int t35[F(__is_compound(cvoid))];
892 }
893
894 void is_pointer()
895 {
896   StructWithMembers x;
897
898   int t01[T(__is_pointer(void*))];
899   int t02[T(__is_pointer(cvoid*))];
900   int t03[T(__is_pointer(cvoid*))];
901   int t04[T(__is_pointer(char*))];
902   int t05[T(__is_pointer(int*))];
903   int t06[T(__is_pointer(int**))];
904   int t07[T(__is_pointer(ClassType*))];
905   int t08[T(__is_pointer(Derives*))];
906   int t09[T(__is_pointer(Enum*))];
907   int t10[T(__is_pointer(IntArNB*))];
908   int t11[T(__is_pointer(Union*))];
909   int t12[T(__is_pointer(UnionAr*))];
910   int t13[T(__is_pointer(StructWithMembers*))];
911   int t14[T(__is_pointer(void (*)()))];
912
913   int t20[F(__is_pointer(void))];
914   int t21[F(__is_pointer(cvoid))];
915   int t22[F(__is_pointer(cvoid))];
916   int t23[F(__is_pointer(char))];
917   int t24[F(__is_pointer(int))];
918   int t25[F(__is_pointer(int))];
919   int t26[F(__is_pointer(ClassType))];
920   int t27[F(__is_pointer(Derives))];
921   int t28[F(__is_pointer(Enum))];
922   int t29[F(__is_pointer(IntArNB))];
923   int t30[F(__is_pointer(Union))];
924   int t31[F(__is_pointer(UnionAr))];
925   int t32[F(__is_pointer(StructWithMembers))];
926   int t33[F(__is_pointer(int StructWithMembers::*))];
927   int t34[F(__is_pointer(void (StructWithMembers::*) ()))];
928 }
929
930 void is_member_object_pointer()
931 {
932   StructWithMembers x;
933
934   int t01[T(__is_member_object_pointer(int StructWithMembers::*))];
935
936   int t10[F(__is_member_object_pointer(void (StructWithMembers::*) ()))];
937   int t11[F(__is_member_object_pointer(void*))];
938   int t12[F(__is_member_object_pointer(cvoid*))];
939   int t13[F(__is_member_object_pointer(cvoid*))];
940   int t14[F(__is_member_object_pointer(char*))];
941   int t15[F(__is_member_object_pointer(int*))];
942   int t16[F(__is_member_object_pointer(int**))];
943   int t17[F(__is_member_object_pointer(ClassType*))];
944   int t18[F(__is_member_object_pointer(Derives*))];
945   int t19[F(__is_member_object_pointer(Enum*))];
946   int t20[F(__is_member_object_pointer(IntArNB*))];
947   int t21[F(__is_member_object_pointer(Union*))];
948   int t22[F(__is_member_object_pointer(UnionAr*))];
949   int t23[F(__is_member_object_pointer(StructWithMembers*))];
950   int t24[F(__is_member_object_pointer(void))];
951   int t25[F(__is_member_object_pointer(cvoid))];
952   int t26[F(__is_member_object_pointer(cvoid))];
953   int t27[F(__is_member_object_pointer(char))];
954   int t28[F(__is_member_object_pointer(int))];
955   int t29[F(__is_member_object_pointer(int))];
956   int t30[F(__is_member_object_pointer(ClassType))];
957   int t31[F(__is_member_object_pointer(Derives))];
958   int t32[F(__is_member_object_pointer(Enum))];
959   int t33[F(__is_member_object_pointer(IntArNB))];
960   int t34[F(__is_member_object_pointer(Union))];
961   int t35[F(__is_member_object_pointer(UnionAr))];
962   int t36[F(__is_member_object_pointer(StructWithMembers))];
963   int t37[F(__is_member_object_pointer(void (*)()))];
964 }
965
966 void is_member_function_pointer()
967 {
968   StructWithMembers x;
969
970   int t01[T(__is_member_function_pointer(void (StructWithMembers::*) ()))];
971
972   int t10[F(__is_member_function_pointer(int StructWithMembers::*))];
973   int t11[F(__is_member_function_pointer(void*))];
974   int t12[F(__is_member_function_pointer(cvoid*))];
975   int t13[F(__is_member_function_pointer(cvoid*))];
976   int t14[F(__is_member_function_pointer(char*))];
977   int t15[F(__is_member_function_pointer(int*))];
978   int t16[F(__is_member_function_pointer(int**))];
979   int t17[F(__is_member_function_pointer(ClassType*))];
980   int t18[F(__is_member_function_pointer(Derives*))];
981   int t19[F(__is_member_function_pointer(Enum*))];
982   int t20[F(__is_member_function_pointer(IntArNB*))];
983   int t21[F(__is_member_function_pointer(Union*))];
984   int t22[F(__is_member_function_pointer(UnionAr*))];
985   int t23[F(__is_member_function_pointer(StructWithMembers*))];
986   int t24[F(__is_member_function_pointer(void))];
987   int t25[F(__is_member_function_pointer(cvoid))];
988   int t26[F(__is_member_function_pointer(cvoid))];
989   int t27[F(__is_member_function_pointer(char))];
990   int t28[F(__is_member_function_pointer(int))];
991   int t29[F(__is_member_function_pointer(int))];
992   int t30[F(__is_member_function_pointer(ClassType))];
993   int t31[F(__is_member_function_pointer(Derives))];
994   int t32[F(__is_member_function_pointer(Enum))];
995   int t33[F(__is_member_function_pointer(IntArNB))];
996   int t34[F(__is_member_function_pointer(Union))];
997   int t35[F(__is_member_function_pointer(UnionAr))];
998   int t36[F(__is_member_function_pointer(StructWithMembers))];
999   int t37[F(__is_member_function_pointer(void (*)()))];
1000 }
1001
1002 void is_member_pointer()
1003 {
1004   StructWithMembers x;
1005
1006   int t01[T(__is_member_pointer(int StructWithMembers::*))];
1007   int t02[T(__is_member_pointer(void (StructWithMembers::*) ()))];
1008
1009   int t10[F(__is_member_pointer(void*))];
1010   int t11[F(__is_member_pointer(cvoid*))];
1011   int t12[F(__is_member_pointer(cvoid*))];
1012   int t13[F(__is_member_pointer(char*))];
1013   int t14[F(__is_member_pointer(int*))];
1014   int t15[F(__is_member_pointer(int**))];
1015   int t16[F(__is_member_pointer(ClassType*))];
1016   int t17[F(__is_member_pointer(Derives*))];
1017   int t18[F(__is_member_pointer(Enum*))];
1018   int t19[F(__is_member_pointer(IntArNB*))];
1019   int t20[F(__is_member_pointer(Union*))];
1020   int t21[F(__is_member_pointer(UnionAr*))];
1021   int t22[F(__is_member_pointer(StructWithMembers*))];
1022   int t23[F(__is_member_pointer(void))];
1023   int t24[F(__is_member_pointer(cvoid))];
1024   int t25[F(__is_member_pointer(cvoid))];
1025   int t26[F(__is_member_pointer(char))];
1026   int t27[F(__is_member_pointer(int))];
1027   int t28[F(__is_member_pointer(int))];
1028   int t29[F(__is_member_pointer(ClassType))];
1029   int t30[F(__is_member_pointer(Derives))];
1030   int t31[F(__is_member_pointer(Enum))];
1031   int t32[F(__is_member_pointer(IntArNB))];
1032   int t33[F(__is_member_pointer(Union))];
1033   int t34[F(__is_member_pointer(UnionAr))];
1034   int t35[F(__is_member_pointer(StructWithMembers))];
1035   int t36[F(__is_member_pointer(void (*)()))];
1036 }
1037
1038 void is_const()
1039 {
1040   int t01[T(__is_const(cvoid))];
1041   int t02[T(__is_const(const char))];
1042   int t03[T(__is_const(const int))];
1043   int t04[T(__is_const(const long))];
1044   int t05[T(__is_const(const short))];
1045   int t06[T(__is_const(const signed char))];
1046   int t07[T(__is_const(const wchar_t))];
1047   int t08[T(__is_const(const bool))];
1048   int t09[T(__is_const(const float))];
1049   int t10[T(__is_const(const double))];
1050   int t11[T(__is_const(const long double))];
1051   int t12[T(__is_const(const unsigned char))];
1052   int t13[T(__is_const(const unsigned int))];
1053   int t14[T(__is_const(const unsigned long long))];
1054   int t15[T(__is_const(const unsigned long))];
1055   int t16[T(__is_const(const unsigned short))];
1056   int t17[T(__is_const(const void))];
1057   int t18[T(__is_const(const ClassType))];
1058   int t19[T(__is_const(const Derives))];
1059   int t20[T(__is_const(const Enum))];
1060   int t21[T(__is_const(const IntArNB))];
1061   int t22[T(__is_const(const Union))];
1062   int t23[T(__is_const(const UnionAr))];
1063
1064   int t30[F(__is_const(char))];
1065   int t31[F(__is_const(int))];
1066   int t32[F(__is_const(long))];
1067   int t33[F(__is_const(short))];
1068   int t34[F(__is_const(signed char))];
1069   int t35[F(__is_const(wchar_t))];
1070   int t36[F(__is_const(bool))];
1071   int t37[F(__is_const(float))];
1072   int t38[F(__is_const(double))];
1073   int t39[F(__is_const(long double))];
1074   int t40[F(__is_const(unsigned char))];
1075   int t41[F(__is_const(unsigned int))];
1076   int t42[F(__is_const(unsigned long long))];
1077   int t43[F(__is_const(unsigned long))];
1078   int t44[F(__is_const(unsigned short))];
1079   int t45[F(__is_const(void))];
1080   int t46[F(__is_const(ClassType))];
1081   int t47[F(__is_const(Derives))];
1082   int t48[F(__is_const(Enum))];
1083   int t49[F(__is_const(IntArNB))];
1084   int t50[F(__is_const(Union))];
1085   int t51[F(__is_const(UnionAr))];
1086 }
1087
1088 void is_volatile()
1089 {
1090   int t02[T(__is_volatile(volatile char))];
1091   int t03[T(__is_volatile(volatile int))];
1092   int t04[T(__is_volatile(volatile long))];
1093   int t05[T(__is_volatile(volatile short))];
1094   int t06[T(__is_volatile(volatile signed char))];
1095   int t07[T(__is_volatile(volatile wchar_t))];
1096   int t08[T(__is_volatile(volatile bool))];
1097   int t09[T(__is_volatile(volatile float))];
1098   int t10[T(__is_volatile(volatile double))];
1099   int t11[T(__is_volatile(volatile long double))];
1100   int t12[T(__is_volatile(volatile unsigned char))];
1101   int t13[T(__is_volatile(volatile unsigned int))];
1102   int t14[T(__is_volatile(volatile unsigned long long))];
1103   int t15[T(__is_volatile(volatile unsigned long))];
1104   int t16[T(__is_volatile(volatile unsigned short))];
1105   int t17[T(__is_volatile(volatile void))];
1106   int t18[T(__is_volatile(volatile ClassType))];
1107   int t19[T(__is_volatile(volatile Derives))];
1108   int t20[T(__is_volatile(volatile Enum))];
1109   int t21[T(__is_volatile(volatile IntArNB))];
1110   int t22[T(__is_volatile(volatile Union))];
1111   int t23[T(__is_volatile(volatile UnionAr))];
1112
1113   int t30[F(__is_volatile(char))];
1114   int t31[F(__is_volatile(int))];
1115   int t32[F(__is_volatile(long))];
1116   int t33[F(__is_volatile(short))];
1117   int t34[F(__is_volatile(signed char))];
1118   int t35[F(__is_volatile(wchar_t))];
1119   int t36[F(__is_volatile(bool))];
1120   int t37[F(__is_volatile(float))];
1121   int t38[F(__is_volatile(double))];
1122   int t39[F(__is_volatile(long double))];
1123   int t40[F(__is_volatile(unsigned char))];
1124   int t41[F(__is_volatile(unsigned int))];
1125   int t42[F(__is_volatile(unsigned long long))];
1126   int t43[F(__is_volatile(unsigned long))];
1127   int t44[F(__is_volatile(unsigned short))];
1128   int t45[F(__is_volatile(void))];
1129   int t46[F(__is_volatile(ClassType))];
1130   int t47[F(__is_volatile(Derives))];
1131   int t48[F(__is_volatile(Enum))];
1132   int t49[F(__is_volatile(IntArNB))];
1133   int t50[F(__is_volatile(Union))];
1134   int t51[F(__is_volatile(UnionAr))];
1135 }
1136
1137 struct TrivialStruct {
1138   int member;
1139 };
1140
1141 struct NonTrivialStruct {
1142   int member;
1143   NonTrivialStruct() {
1144     member = 0;
1145   }
1146 };
1147
1148 struct SuperNonTrivialStruct {
1149   SuperNonTrivialStruct() { }
1150   ~SuperNonTrivialStruct() { }
1151 };
1152
1153 struct NonTCStruct {
1154   NonTCStruct(const NonTCStruct&) {}
1155 };
1156
1157 struct AllDefaulted {
1158   AllDefaulted() = default;
1159   AllDefaulted(const AllDefaulted &) = default;
1160   AllDefaulted(AllDefaulted &&) = default;
1161   AllDefaulted &operator=(const AllDefaulted &) = default;
1162   AllDefaulted &operator=(AllDefaulted &&) = default;
1163   ~AllDefaulted() = default;
1164 };
1165
1166 struct NoDefaultMoveAssignDueToUDCopyCtor {
1167   NoDefaultMoveAssignDueToUDCopyCtor(const NoDefaultMoveAssignDueToUDCopyCtor&);
1168 };
1169
1170 struct NoDefaultMoveAssignDueToUDCopyAssign {
1171   NoDefaultMoveAssignDueToUDCopyAssign& operator=(
1172     const NoDefaultMoveAssignDueToUDCopyAssign&);
1173 };
1174
1175 struct NoDefaultMoveAssignDueToDtor {
1176   ~NoDefaultMoveAssignDueToDtor();
1177 };
1178
1179 struct AllDeleted {
1180   AllDeleted() = delete;
1181   AllDeleted(const AllDeleted &) = delete;
1182   AllDeleted(AllDeleted &&) = delete;
1183   AllDeleted &operator=(const AllDeleted &) = delete;
1184   AllDeleted &operator=(AllDeleted &&) = delete;
1185   ~AllDeleted() = delete;
1186 };
1187
1188 struct ExtDefaulted {
1189   ExtDefaulted();
1190   ExtDefaulted(const ExtDefaulted &);
1191   ExtDefaulted(ExtDefaulted &&);
1192   ExtDefaulted &operator=(const ExtDefaulted &);
1193   ExtDefaulted &operator=(ExtDefaulted &&);
1194   ~ExtDefaulted();
1195 };
1196
1197 // Despite being defaulted, these functions are not trivial.
1198 ExtDefaulted::ExtDefaulted() = default;
1199 ExtDefaulted::ExtDefaulted(const ExtDefaulted &) = default;
1200 ExtDefaulted::ExtDefaulted(ExtDefaulted &&) = default;
1201 ExtDefaulted &ExtDefaulted::operator=(const ExtDefaulted &) = default;
1202 ExtDefaulted &ExtDefaulted::operator=(ExtDefaulted &&) = default;
1203 ExtDefaulted::~ExtDefaulted() = default;
1204
1205 void is_trivial2()
1206 {
1207   int t01[T(__is_trivial(char))];
1208   int t02[T(__is_trivial(int))];
1209   int t03[T(__is_trivial(long))];
1210   int t04[T(__is_trivial(short))];
1211   int t05[T(__is_trivial(signed char))];
1212   int t06[T(__is_trivial(wchar_t))];
1213   int t07[T(__is_trivial(bool))];
1214   int t08[T(__is_trivial(float))];
1215   int t09[T(__is_trivial(double))];
1216   int t10[T(__is_trivial(long double))];
1217   int t11[T(__is_trivial(unsigned char))];
1218   int t12[T(__is_trivial(unsigned int))];
1219   int t13[T(__is_trivial(unsigned long long))];
1220   int t14[T(__is_trivial(unsigned long))];
1221   int t15[T(__is_trivial(unsigned short))];
1222   int t16[T(__is_trivial(ClassType))];
1223   int t17[T(__is_trivial(Derives))];
1224   int t18[T(__is_trivial(Enum))];
1225   int t19[T(__is_trivial(IntAr))];
1226   int t20[T(__is_trivial(Union))];
1227   int t21[T(__is_trivial(UnionAr))];
1228   int t22[T(__is_trivial(TrivialStruct))];
1229   int t23[T(__is_trivial(AllDefaulted))];
1230   int t24[T(__is_trivial(AllDeleted))];
1231
1232   int t30[F(__is_trivial(void))];
1233   int t31[F(__is_trivial(NonTrivialStruct))];
1234   int t32[F(__is_trivial(SuperNonTrivialStruct))];
1235   int t33[F(__is_trivial(NonTCStruct))];
1236   int t34[F(__is_trivial(ExtDefaulted))];
1237
1238   int t40[T(__is_trivial(ACompleteType))];
1239   int t41[F(__is_trivial(AnIncompleteType))]; // expected-error {{incomplete type}}
1240   int t42[F(__is_trivial(AnIncompleteType[]))]; // expected-error {{incomplete type}}
1241   int t43[F(__is_trivial(AnIncompleteType[1]))]; // expected-error {{incomplete type}}
1242   int t44[F(__is_trivial(void))];
1243   int t45[F(__is_trivial(const volatile void))];
1244 }
1245
1246 void is_trivially_copyable2()
1247 {
1248   int t01[T(__is_trivially_copyable(char))];
1249   int t02[T(__is_trivially_copyable(int))];
1250   int t03[T(__is_trivially_copyable(long))];
1251   int t04[T(__is_trivially_copyable(short))];
1252   int t05[T(__is_trivially_copyable(signed char))];
1253   int t06[T(__is_trivially_copyable(wchar_t))];
1254   int t07[T(__is_trivially_copyable(bool))];
1255   int t08[T(__is_trivially_copyable(float))];
1256   int t09[T(__is_trivially_copyable(double))];
1257   int t10[T(__is_trivially_copyable(long double))];
1258   int t11[T(__is_trivially_copyable(unsigned char))];
1259   int t12[T(__is_trivially_copyable(unsigned int))];
1260   int t13[T(__is_trivially_copyable(unsigned long long))];
1261   int t14[T(__is_trivially_copyable(unsigned long))];
1262   int t15[T(__is_trivially_copyable(unsigned short))];
1263   int t16[T(__is_trivially_copyable(ClassType))];
1264   int t17[T(__is_trivially_copyable(Derives))];
1265   int t18[T(__is_trivially_copyable(Enum))];
1266   int t19[T(__is_trivially_copyable(IntAr))];
1267   int t20[T(__is_trivially_copyable(Union))];
1268   int t21[T(__is_trivially_copyable(UnionAr))];
1269   int t22[T(__is_trivially_copyable(TrivialStruct))];
1270   int t23[T(__is_trivially_copyable(NonTrivialStruct))];
1271   int t24[T(__is_trivially_copyable(AllDefaulted))];
1272   int t25[T(__is_trivially_copyable(AllDeleted))];
1273
1274   int t30[F(__is_trivially_copyable(void))];
1275   int t31[F(__is_trivially_copyable(SuperNonTrivialStruct))];
1276   int t32[F(__is_trivially_copyable(NonTCStruct))];
1277   int t33[F(__is_trivially_copyable(ExtDefaulted))];
1278
1279   int t34[T(__is_trivially_copyable(const int))];
1280   int t35[T(__is_trivially_copyable(volatile int))];
1281
1282   int t40[T(__is_trivially_copyable(ACompleteType))];
1283   int t41[F(__is_trivially_copyable(AnIncompleteType))]; // expected-error {{incomplete type}}
1284   int t42[F(__is_trivially_copyable(AnIncompleteType[]))]; // expected-error {{incomplete type}}
1285   int t43[F(__is_trivially_copyable(AnIncompleteType[1]))]; // expected-error {{incomplete type}}
1286   int t44[F(__is_trivially_copyable(void))];
1287   int t45[F(__is_trivially_copyable(const volatile void))];
1288 }
1289
1290 struct CStruct {
1291   int one;
1292   int two;
1293 };
1294
1295 struct CEmptyStruct {};
1296
1297 struct CppEmptyStruct : CStruct {};
1298 struct CppStructStandard : CEmptyStruct {
1299   int three;
1300   int four;
1301 };
1302 struct CppStructNonStandardByBase : CStruct {
1303   int three;
1304   int four;
1305 };
1306 struct CppStructNonStandardByVirt : CStruct {
1307   virtual void method() {}
1308 };
1309 struct CppStructNonStandardByMemb : CStruct {
1310   CppStructNonStandardByVirt member;
1311 };
1312 struct CppStructNonStandardByProt : CStruct {
1313   int five;
1314 protected:
1315   int six;
1316 };
1317 struct CppStructNonStandardByVirtBase : virtual CStruct {
1318 };
1319 struct CppStructNonStandardBySameBase : CEmptyStruct {
1320   CEmptyStruct member;
1321 };
1322 struct CppStructNonStandardBy2ndVirtBase : CEmptyStruct {
1323   CEmptyStruct member;
1324 };
1325
1326 void is_standard_layout()
1327 {
1328   typedef const int ConstInt;
1329   typedef ConstInt ConstIntAr[4];
1330   typedef CppStructStandard CppStructStandardAr[4];
1331
1332   int t01[T(__is_standard_layout(int))];
1333   int t02[T(__is_standard_layout(ConstInt))];
1334   int t03[T(__is_standard_layout(ConstIntAr))];
1335   int t04[T(__is_standard_layout(CStruct))];
1336   int t05[T(__is_standard_layout(CppStructStandard))];
1337   int t06[T(__is_standard_layout(CppStructStandardAr))];
1338   int t07[T(__is_standard_layout(Vector))];
1339   int t08[T(__is_standard_layout(VectorExt))];
1340
1341   typedef CppStructNonStandardByBase CppStructNonStandardByBaseAr[4];
1342
1343   int t10[F(__is_standard_layout(CppStructNonStandardByVirt))];
1344   int t11[F(__is_standard_layout(CppStructNonStandardByMemb))];
1345   int t12[F(__is_standard_layout(CppStructNonStandardByProt))];
1346   int t13[F(__is_standard_layout(CppStructNonStandardByVirtBase))];
1347   int t14[F(__is_standard_layout(CppStructNonStandardByBase))];
1348   int t15[F(__is_standard_layout(CppStructNonStandardByBaseAr))];
1349   int t16[F(__is_standard_layout(CppStructNonStandardBySameBase))];
1350   int t17[F(__is_standard_layout(CppStructNonStandardBy2ndVirtBase))];
1351
1352   int t40[T(__is_standard_layout(ACompleteType))];
1353   int t41[F(__is_standard_layout(AnIncompleteType))]; // expected-error {{incomplete type}}
1354   int t42[F(__is_standard_layout(AnIncompleteType[]))]; // expected-error {{incomplete type}}
1355   int t43[F(__is_standard_layout(AnIncompleteType[1]))]; // expected-error {{incomplete type}}
1356   int t44[F(__is_standard_layout(void))];
1357   int t45[F(__is_standard_layout(const volatile void))];
1358
1359   struct HasAnonEmptyBitfield { int : 0; };
1360   struct HasAnonBitfield { int : 4; };
1361   struct DerivesFromBitfield : HasAnonBitfield {};
1362   struct DerivesFromBitfieldWithBitfield : HasAnonBitfield { int : 5; };
1363   struct DerivesFromBitfieldTwice : DerivesFromBitfield, HasAnonEmptyBitfield {};
1364
1365   int t50[T(__is_standard_layout(HasAnonEmptyBitfield))];
1366   int t51[T(__is_standard_layout(HasAnonBitfield))];
1367   int t52[T(__is_standard_layout(DerivesFromBitfield))];
1368   int t53[F(__is_standard_layout(DerivesFromBitfieldWithBitfield))];
1369   int t54[F(__is_standard_layout(DerivesFromBitfieldTwice))];
1370
1371   struct Empty {};
1372   struct HasEmptyBase : Empty {};
1373   struct HoldsEmptyBase { Empty e; };
1374   struct HasRepeatedEmptyBase : Empty, HasEmptyBase {}; // expected-warning {{inaccessible}}
1375   struct HasEmptyBaseAsMember : Empty { Empty e; };
1376   struct HasEmptyBaseAsSubobjectOfMember1 : Empty { HoldsEmptyBase e; };
1377   struct HasEmptyBaseAsSubobjectOfMember2 : Empty { HasEmptyBase e; };
1378   struct HasEmptyBaseAsSubobjectOfMember3 : Empty { HoldsEmptyBase e[2]; };
1379   struct HasEmptyIndirectBaseAsMember : HasEmptyBase { Empty e; };
1380   struct HasEmptyIndirectBaseAsSecondMember : HasEmptyBase { int n; Empty e; };
1381   struct HasEmptyIndirectBaseAfterBitfield : HasEmptyBase { int : 4; Empty e; };
1382
1383   int t60[T(__is_standard_layout(Empty))];
1384   int t61[T(__is_standard_layout(HasEmptyBase))];
1385   int t62[F(__is_standard_layout(HasRepeatedEmptyBase))];
1386   int t63[F(__is_standard_layout(HasEmptyBaseAsMember))];
1387   int t64[F(__is_standard_layout(HasEmptyBaseAsSubobjectOfMember1))];
1388   int t65[T(__is_standard_layout(HasEmptyBaseAsSubobjectOfMember2))]; // FIXME: standard bug?
1389   int t66[F(__is_standard_layout(HasEmptyBaseAsSubobjectOfMember3))];
1390   int t67[F(__is_standard_layout(HasEmptyIndirectBaseAsMember))];
1391   int t68[T(__is_standard_layout(HasEmptyIndirectBaseAsSecondMember))];
1392   int t69[F(__is_standard_layout(HasEmptyIndirectBaseAfterBitfield))]; // FIXME: standard bug?
1393
1394   struct StructWithEmptyFields {
1395     int n;
1396     HoldsEmptyBase e[3];
1397   };
1398   union UnionWithEmptyFields {
1399     int n;
1400     HoldsEmptyBase e[3];
1401   };
1402   struct HasEmptyIndirectBaseAsSecondStructMember : HasEmptyBase {
1403     StructWithEmptyFields u;
1404   };
1405   struct HasEmptyIndirectBaseAsSecondUnionMember : HasEmptyBase {
1406     UnionWithEmptyFields u;
1407   };
1408
1409   int t70[T(__is_standard_layout(HasEmptyIndirectBaseAsSecondStructMember))];
1410   int t71[F(__is_standard_layout(HasEmptyIndirectBaseAsSecondUnionMember))];
1411 }
1412
1413 void is_signed()
1414 {
1415   //int t01[T(__is_signed(char))];
1416   int t02[T(__is_signed(int))];
1417   int t03[T(__is_signed(long))];
1418   int t04[T(__is_signed(short))];
1419   int t05[T(__is_signed(signed char))];
1420   int t06[T(__is_signed(wchar_t))];
1421
1422   int t10[F(__is_signed(bool))];
1423   int t11[F(__is_signed(cvoid))];
1424   int t12[F(__is_signed(float))];
1425   int t13[F(__is_signed(double))];
1426   int t14[F(__is_signed(long double))];
1427   int t15[F(__is_signed(unsigned char))];
1428   int t16[F(__is_signed(unsigned int))];
1429   int t17[F(__is_signed(unsigned long long))];
1430   int t18[F(__is_signed(unsigned long))];
1431   int t19[F(__is_signed(unsigned short))];
1432   int t20[F(__is_signed(void))];
1433   int t21[F(__is_signed(ClassType))];
1434   int t22[F(__is_signed(Derives))];
1435   int t23[F(__is_signed(Enum))];
1436   int t24[F(__is_signed(IntArNB))];
1437   int t25[F(__is_signed(Union))];
1438   int t26[F(__is_signed(UnionAr))];
1439 }
1440
1441 void is_unsigned()
1442 {
1443   int t01[T(__is_unsigned(bool))];
1444   int t02[T(__is_unsigned(unsigned char))];
1445   int t03[T(__is_unsigned(unsigned short))];
1446   int t04[T(__is_unsigned(unsigned int))];
1447   int t05[T(__is_unsigned(unsigned long))];
1448   int t06[T(__is_unsigned(unsigned long long))];
1449   int t07[T(__is_unsigned(Enum))];
1450
1451   int t10[F(__is_unsigned(void))];
1452   int t11[F(__is_unsigned(cvoid))];
1453   int t12[F(__is_unsigned(float))];
1454   int t13[F(__is_unsigned(double))];
1455   int t14[F(__is_unsigned(long double))];
1456   int t16[F(__is_unsigned(char))];
1457   int t17[F(__is_unsigned(signed char))];
1458   int t18[F(__is_unsigned(wchar_t))];
1459   int t19[F(__is_unsigned(short))];
1460   int t20[F(__is_unsigned(int))];
1461   int t21[F(__is_unsigned(long))];
1462   int t22[F(__is_unsigned(Union))];
1463   int t23[F(__is_unsigned(UnionAr))];
1464   int t24[F(__is_unsigned(Derives))];
1465   int t25[F(__is_unsigned(ClassType))];
1466   int t26[F(__is_unsigned(IntArNB))];
1467 }
1468
1469 typedef Int& IntRef;
1470 typedef const IntAr ConstIntAr;
1471 typedef ConstIntAr ConstIntArAr[4];
1472
1473 struct HasCopy {
1474   HasCopy(HasCopy& cp);
1475 };
1476
1477 struct HasMove {
1478   HasMove(HasMove&& cp);
1479 };
1480
1481 struct HasTemplateCons {
1482   HasVirt Annoying;
1483
1484   template <typename T>
1485   HasTemplateCons(const T&);
1486 };
1487
1488 void has_trivial_default_constructor() {
1489   { int arr[T(__has_trivial_constructor(Int))]; }
1490   { int arr[T(__has_trivial_constructor(IntAr))]; }
1491   { int arr[T(__has_trivial_constructor(Union))]; }
1492   { int arr[T(__has_trivial_constructor(UnionAr))]; }
1493   { int arr[T(__has_trivial_constructor(POD))]; }
1494   { int arr[T(__has_trivial_constructor(Derives))]; }
1495   { int arr[T(__has_trivial_constructor(DerivesAr))]; }
1496   { int arr[T(__has_trivial_constructor(ConstIntAr))]; }
1497   { int arr[T(__has_trivial_constructor(ConstIntArAr))]; }
1498   { int arr[T(__has_trivial_constructor(HasDest))]; }
1499   { int arr[T(__has_trivial_constructor(HasPriv))]; }
1500   { int arr[T(__has_trivial_constructor(HasCopyAssign))]; }
1501   { int arr[T(__has_trivial_constructor(HasMoveAssign))]; }
1502   { int arr[T(__has_trivial_constructor(const Int))]; }
1503   { int arr[T(__has_trivial_constructor(AllDefaulted))]; }
1504   { int arr[T(__has_trivial_constructor(AllDeleted))]; }
1505   { int arr[T(__has_trivial_constructor(ACompleteType[]))]; }
1506
1507   { int arr[F(__has_trivial_constructor(AnIncompleteType[]))]; } // expected-error {{incomplete type}}
1508   { int arr[F(__has_trivial_constructor(HasCons))]; }
1509   { int arr[F(__has_trivial_constructor(HasRef))]; }
1510   { int arr[F(__has_trivial_constructor(HasCopy))]; }
1511   { int arr[F(__has_trivial_constructor(IntRef))]; }
1512   { int arr[F(__has_trivial_constructor(VirtAr))]; }
1513   { int arr[F(__has_trivial_constructor(void))]; }
1514   { int arr[F(__has_trivial_constructor(cvoid))]; }
1515   { int arr[F(__has_trivial_constructor(HasTemplateCons))]; }
1516   { int arr[F(__has_trivial_constructor(AllPrivate))]; }
1517   { int arr[F(__has_trivial_constructor(ExtDefaulted))]; }
1518 }
1519
1520 void has_trivial_move_constructor() {
1521   // n3376 12.8 [class.copy]/12
1522   // A copy/move constructor for class X is trivial if it is not
1523   // user-provided, its declared parameter type is the same as
1524   // if it had been implicitly declared, and if
1525   //   - class X has no virtual functions (10.3) and no virtual
1526   //     base classes (10.1), and
1527   //   - the constructor selected to copy/move each direct base
1528   //     class subobject is trivial, and
1529   //   - for each non-static data member of X that is of class
1530   //     type (or array thereof), the constructor selected
1531   //     to copy/move that member is trivial;
1532   // otherwise the copy/move constructor is non-trivial.
1533   { int arr[T(__has_trivial_move_constructor(POD))]; }
1534   { int arr[T(__has_trivial_move_constructor(Union))]; }
1535   { int arr[T(__has_trivial_move_constructor(HasCons))]; }
1536   { int arr[T(__has_trivial_move_constructor(HasStaticMemberMoveCtor))]; }
1537   { int arr[T(__has_trivial_move_constructor(AllDeleted))]; }
1538   { int arr[T(__has_trivial_move_constructor(ACompleteType[]))]; }
1539
1540   { int arr[F(__has_trivial_move_constructor(AnIncompleteType[]))]; } // expected-error {{incomplete type}}
1541   { int arr[F(__has_trivial_move_constructor(HasVirt))]; }
1542   { int arr[F(__has_trivial_move_constructor(DerivesVirt))]; }
1543   { int arr[F(__has_trivial_move_constructor(HasMoveCtor))]; }
1544   { int arr[F(__has_trivial_move_constructor(DerivesHasMoveCtor))]; }
1545   { int arr[F(__has_trivial_move_constructor(HasMemberMoveCtor))]; }
1546 }
1547
1548 void has_trivial_copy_constructor() {
1549   { int arr[T(__has_trivial_copy(Int))]; }
1550   { int arr[T(__has_trivial_copy(IntAr))]; }
1551   { int arr[T(__has_trivial_copy(Union))]; }
1552   { int arr[T(__has_trivial_copy(UnionAr))]; }
1553   { int arr[T(__has_trivial_copy(POD))]; }
1554   { int arr[T(__has_trivial_copy(Derives))]; }
1555   { int arr[T(__has_trivial_copy(ConstIntAr))]; }
1556   { int arr[T(__has_trivial_copy(ConstIntArAr))]; }
1557   { int arr[T(__has_trivial_copy(HasDest))]; }
1558   { int arr[T(__has_trivial_copy(HasPriv))]; }
1559   { int arr[T(__has_trivial_copy(HasCons))]; }
1560   { int arr[T(__has_trivial_copy(HasRef))]; }
1561   { int arr[T(__has_trivial_copy(HasMove))]; }
1562   { int arr[T(__has_trivial_copy(IntRef))]; }
1563   { int arr[T(__has_trivial_copy(HasCopyAssign))]; }
1564   { int arr[T(__has_trivial_copy(HasMoveAssign))]; }
1565   { int arr[T(__has_trivial_copy(const Int))]; }
1566   { int arr[T(__has_trivial_copy(AllDefaulted))]; }
1567   { int arr[T(__has_trivial_copy(AllDeleted))]; }
1568   { int arr[T(__has_trivial_copy(DerivesAr))]; }
1569   { int arr[T(__has_trivial_copy(DerivesHasRef))]; }
1570   { int arr[T(__has_trivial_copy(ACompleteType[]))]; }
1571
1572   { int arr[F(__has_trivial_copy(AnIncompleteType[]))]; } // expected-error {{incomplete type}}
1573   { int arr[F(__has_trivial_copy(HasCopy))]; }
1574   { int arr[F(__has_trivial_copy(HasTemplateCons))]; }
1575   { int arr[F(__has_trivial_copy(VirtAr))]; }
1576   { int arr[F(__has_trivial_copy(void))]; }
1577   { int arr[F(__has_trivial_copy(cvoid))]; }
1578   { int arr[F(__has_trivial_copy(AllPrivate))]; }
1579   { int arr[F(__has_trivial_copy(ExtDefaulted))]; }
1580 }
1581
1582 void has_trivial_copy_assignment() {
1583   { int arr[T(__has_trivial_assign(Int))]; }
1584   { int arr[T(__has_trivial_assign(IntAr))]; }
1585   { int arr[T(__has_trivial_assign(Union))]; }
1586   { int arr[T(__has_trivial_assign(UnionAr))]; }
1587   { int arr[T(__has_trivial_assign(POD))]; }
1588   { int arr[T(__has_trivial_assign(Derives))]; }
1589   { int arr[T(__has_trivial_assign(HasDest))]; }
1590   { int arr[T(__has_trivial_assign(HasPriv))]; }
1591   { int arr[T(__has_trivial_assign(HasCons))]; }
1592   { int arr[T(__has_trivial_assign(HasRef))]; }
1593   { int arr[T(__has_trivial_assign(HasCopy))]; }
1594   { int arr[T(__has_trivial_assign(HasMove))]; }
1595   { int arr[T(__has_trivial_assign(HasMoveAssign))]; }
1596   { int arr[T(__has_trivial_assign(AllDefaulted))]; }
1597   { int arr[T(__has_trivial_assign(AllDeleted))]; }
1598   { int arr[T(__has_trivial_assign(DerivesAr))]; }
1599   { int arr[T(__has_trivial_assign(DerivesHasRef))]; }
1600   { int arr[T(__has_trivial_assign(ACompleteType[]))]; }
1601
1602   { int arr[F(__has_trivial_assign(AnIncompleteType[]))]; } // expected-error {{incomplete type}}
1603   { int arr[F(__has_trivial_assign(IntRef))]; }
1604   { int arr[F(__has_trivial_assign(HasCopyAssign))]; }
1605   { int arr[F(__has_trivial_assign(const Int))]; }
1606   { int arr[F(__has_trivial_assign(ConstIntAr))]; }
1607   { int arr[F(__has_trivial_assign(ConstIntArAr))]; }
1608   { int arr[F(__has_trivial_assign(VirtAr))]; }
1609   { int arr[F(__has_trivial_assign(void))]; }
1610   { int arr[F(__has_trivial_assign(cvoid))]; }
1611   { int arr[F(__has_trivial_assign(AllPrivate))]; }
1612   { int arr[F(__has_trivial_assign(ExtDefaulted))]; }
1613 }
1614
1615 void has_trivial_destructor() {
1616   { int arr[T(__has_trivial_destructor(Int))]; }
1617   { int arr[T(__has_trivial_destructor(IntAr))]; }
1618   { int arr[T(__has_trivial_destructor(Union))]; }
1619   { int arr[T(__has_trivial_destructor(UnionAr))]; }
1620   { int arr[T(__has_trivial_destructor(POD))]; }
1621   { int arr[T(__has_trivial_destructor(Derives))]; }
1622   { int arr[T(__has_trivial_destructor(ConstIntAr))]; }
1623   { int arr[T(__has_trivial_destructor(ConstIntArAr))]; }
1624   { int arr[T(__has_trivial_destructor(HasPriv))]; }
1625   { int arr[T(__has_trivial_destructor(HasCons))]; }
1626   { int arr[T(__has_trivial_destructor(HasRef))]; }
1627   { int arr[T(__has_trivial_destructor(HasCopy))]; }
1628   { int arr[T(__has_trivial_destructor(HasMove))]; }
1629   { int arr[T(__has_trivial_destructor(IntRef))]; }
1630   { int arr[T(__has_trivial_destructor(HasCopyAssign))]; }
1631   { int arr[T(__has_trivial_destructor(HasMoveAssign))]; }
1632   { int arr[T(__has_trivial_destructor(const Int))]; }
1633   { int arr[T(__has_trivial_destructor(DerivesAr))]; }
1634   { int arr[T(__has_trivial_destructor(VirtAr))]; }
1635   { int arr[T(__has_trivial_destructor(AllDefaulted))]; }
1636   { int arr[T(__has_trivial_destructor(AllDeleted))]; }
1637   { int arr[T(__has_trivial_destructor(DerivesHasRef))]; }
1638   { int arr[T(__has_trivial_destructor(ACompleteType[]))]; }
1639
1640   { int arr[F(__has_trivial_destructor(HasDest))]; }
1641   { int arr[F(__has_trivial_destructor(AnIncompleteType[]))]; } // expected-error {{incomplete type}}
1642   { int arr[F(__has_trivial_destructor(void))]; }
1643   { int arr[F(__has_trivial_destructor(cvoid))]; }
1644   { int arr[F(__has_trivial_destructor(AllPrivate))]; }
1645   { int arr[F(__has_trivial_destructor(ExtDefaulted))]; }
1646 }
1647
1648 struct A { ~A() {} };
1649 template<typename> struct B : A { };
1650
1651 void f() {
1652   { int arr[F(__has_trivial_destructor(A))]; }
1653   { int arr[F(__has_trivial_destructor(B<int>))]; }
1654 }
1655
1656 class PR11110 {
1657   template <int> int operator=( int );
1658   int operator=(PR11110);
1659 };
1660
1661 class UsingAssign;
1662
1663 class UsingAssignBase {
1664 protected:
1665   UsingAssign &operator=(const UsingAssign&) throw();
1666 };
1667
1668 class UsingAssign : public UsingAssignBase {
1669 public:
1670   using UsingAssignBase::operator=;
1671 };
1672
1673 void has_nothrow_assign() {
1674   { int arr[T(__has_nothrow_assign(Int))]; }
1675   { int arr[T(__has_nothrow_assign(IntAr))]; }
1676   { int arr[T(__has_nothrow_assign(Union))]; }
1677   { int arr[T(__has_nothrow_assign(UnionAr))]; }
1678   { int arr[T(__has_nothrow_assign(POD))]; }
1679   { int arr[T(__has_nothrow_assign(Derives))]; }
1680   { int arr[T(__has_nothrow_assign(HasDest))]; }
1681   { int arr[T(__has_nothrow_assign(HasPriv))]; }
1682   { int arr[T(__has_nothrow_assign(HasCons))]; }
1683   { int arr[T(__has_nothrow_assign(HasRef))]; }
1684   { int arr[T(__has_nothrow_assign(HasCopy))]; }
1685   { int arr[T(__has_nothrow_assign(HasMove))]; }
1686   { int arr[T(__has_nothrow_assign(HasMoveAssign))]; }
1687   { int arr[T(__has_nothrow_assign(HasNoThrowCopyAssign))]; }
1688   { int arr[T(__has_nothrow_assign(HasMultipleNoThrowCopyAssign))]; }
1689   { int arr[T(__has_nothrow_assign(HasVirtDest))]; }
1690   { int arr[T(__has_nothrow_assign(AllPrivate))]; }
1691   { int arr[T(__has_nothrow_assign(UsingAssign))]; }
1692   { int arr[T(__has_nothrow_assign(DerivesAr))]; }
1693   { int arr[T(__has_nothrow_assign(ACompleteType[]))]; }
1694
1695   { int arr[F(__has_nothrow_assign(AnIncompleteType[]))]; } // expected-error {{incomplete type}}
1696   { int arr[F(__has_nothrow_assign(IntRef))]; }
1697   { int arr[F(__has_nothrow_assign(HasCopyAssign))]; }
1698   { int arr[F(__has_nothrow_assign(HasMultipleCopyAssign))]; }
1699   { int arr[F(__has_nothrow_assign(const Int))]; }
1700   { int arr[F(__has_nothrow_assign(ConstIntAr))]; }
1701   { int arr[F(__has_nothrow_assign(ConstIntArAr))]; }
1702   { int arr[F(__has_nothrow_assign(VirtAr))]; }
1703   { int arr[F(__has_nothrow_assign(void))]; }
1704   { int arr[F(__has_nothrow_assign(cvoid))]; }
1705   { int arr[F(__has_nothrow_assign(PR11110))]; }
1706 }
1707
1708 void has_nothrow_move_assign() {
1709   { int arr[T(__has_nothrow_move_assign(Int))]; }
1710   { int arr[T(__has_nothrow_move_assign(Enum))]; }
1711   { int arr[T(__has_nothrow_move_assign(Int*))]; }
1712   { int arr[T(__has_nothrow_move_assign(Enum POD::*))]; }
1713   { int arr[T(__has_nothrow_move_assign(POD))]; }
1714   { int arr[T(__has_nothrow_move_assign(HasPriv))]; }
1715   { int arr[T(__has_nothrow_move_assign(HasNoThrowMoveAssign))]; }
1716   { int arr[T(__has_nothrow_move_assign(HasNoExceptNoThrowMoveAssign))]; }
1717   { int arr[T(__has_nothrow_move_assign(HasMemberNoThrowMoveAssign))]; }
1718   { int arr[T(__has_nothrow_move_assign(HasMemberNoExceptNoThrowMoveAssign))]; }
1719   { int arr[T(__has_nothrow_move_assign(AllDeleted))]; }
1720   { int arr[T(__has_nothrow_move_assign(ACompleteType[]))]; }
1721
1722   { int arr[F(__has_nothrow_move_assign(AnIncompleteType[]))]; } // expected-error {{incomplete type}}
1723   { int arr[F(__has_nothrow_move_assign(HasThrowMoveAssign))]; }
1724   { int arr[F(__has_nothrow_move_assign(HasNoExceptFalseMoveAssign))]; }
1725   { int arr[F(__has_nothrow_move_assign(HasMemberThrowMoveAssign))]; }
1726   { int arr[F(__has_nothrow_move_assign(HasMemberNoExceptFalseMoveAssign))]; }
1727   { int arr[F(__has_nothrow_move_assign(NoDefaultMoveAssignDueToUDCopyCtor))]; }
1728   { int arr[F(__has_nothrow_move_assign(NoDefaultMoveAssignDueToUDCopyAssign))]; }
1729   { int arr[F(__has_nothrow_move_assign(NoDefaultMoveAssignDueToDtor))]; }
1730
1731
1732   { int arr[T(__is_nothrow_assignable(HasNoThrowMoveAssign, HasNoThrowMoveAssign))]; }
1733   { int arr[F(__is_nothrow_assignable(HasThrowMoveAssign, HasThrowMoveAssign))]; }
1734
1735   { int arr[T(__is_assignable(HasNoThrowMoveAssign, HasNoThrowMoveAssign))]; }
1736   { int arr[T(__is_assignable(HasThrowMoveAssign, HasThrowMoveAssign))]; }
1737 }
1738
1739 void has_trivial_move_assign() {
1740   // n3376 12.8 [class.copy]/25
1741   // A copy/move assignment operator for class X is trivial if it
1742   // is not user-provided, its declared parameter type is the same
1743   // as if it had been implicitly declared, and if:
1744   //  - class X has no virtual functions (10.3) and no virtual base
1745   //    classes (10.1), and
1746   //  - the assignment operator selected to copy/move each direct
1747   //    base class subobject is trivial, and
1748   //  - for each non-static data member of X that is of class type
1749   //    (or array thereof), the assignment operator
1750   //    selected to copy/move that member is trivial;
1751   { int arr[T(__has_trivial_move_assign(Int))]; }
1752   { int arr[T(__has_trivial_move_assign(HasStaticMemberMoveAssign))]; }
1753   { int arr[T(__has_trivial_move_assign(AllDeleted))]; }
1754   { int arr[T(__has_trivial_move_assign(ACompleteType[]))]; }
1755
1756   { int arr[F(__has_trivial_move_assign(AnIncompleteType[]))]; } // expected-error {{incomplete type}}
1757   { int arr[F(__has_trivial_move_assign(HasVirt))]; }
1758   { int arr[F(__has_trivial_move_assign(DerivesVirt))]; }
1759   { int arr[F(__has_trivial_move_assign(HasMoveAssign))]; }
1760   { int arr[F(__has_trivial_move_assign(DerivesHasMoveAssign))]; }
1761   { int arr[F(__has_trivial_move_assign(HasMemberMoveAssign))]; }
1762   { int arr[F(__has_nothrow_move_assign(NoDefaultMoveAssignDueToUDCopyCtor))]; }
1763   { int arr[F(__has_nothrow_move_assign(NoDefaultMoveAssignDueToUDCopyAssign))]; }
1764 }
1765
1766 void has_nothrow_copy() {
1767   { int arr[T(__has_nothrow_copy(Int))]; }
1768   { int arr[T(__has_nothrow_copy(IntAr))]; }
1769   { int arr[T(__has_nothrow_copy(Union))]; }
1770   { int arr[T(__has_nothrow_copy(UnionAr))]; }
1771   { int arr[T(__has_nothrow_copy(POD))]; }
1772   { int arr[T(__has_nothrow_copy(const Int))]; }
1773   { int arr[T(__has_nothrow_copy(ConstIntAr))]; }
1774   { int arr[T(__has_nothrow_copy(ConstIntArAr))]; }
1775   { int arr[T(__has_nothrow_copy(Derives))]; }
1776   { int arr[T(__has_nothrow_copy(IntRef))]; }
1777   { int arr[T(__has_nothrow_copy(HasDest))]; }
1778   { int arr[T(__has_nothrow_copy(HasPriv))]; }
1779   { int arr[T(__has_nothrow_copy(HasCons))]; }
1780   { int arr[T(__has_nothrow_copy(HasRef))]; }
1781   { int arr[T(__has_nothrow_copy(HasMove))]; }
1782   { int arr[T(__has_nothrow_copy(HasCopyAssign))]; }
1783   { int arr[T(__has_nothrow_copy(HasMoveAssign))]; }
1784   { int arr[T(__has_nothrow_copy(HasNoThrowCopy))]; }
1785   { int arr[T(__has_nothrow_copy(HasMultipleNoThrowCopy))]; }
1786   { int arr[T(__has_nothrow_copy(HasVirtDest))]; }
1787   { int arr[T(__has_nothrow_copy(HasTemplateCons))]; }
1788   { int arr[T(__has_nothrow_copy(AllPrivate))]; }
1789   { int arr[T(__has_nothrow_copy(DerivesAr))]; }
1790   { int arr[T(__has_nothrow_copy(ACompleteType[]))]; }
1791
1792   { int arr[F(__has_nothrow_copy(AnIncompleteType[]))]; } // expected-error {{incomplete type}}
1793   { int arr[F(__has_nothrow_copy(HasCopy))]; }
1794   { int arr[F(__has_nothrow_copy(HasMultipleCopy))]; }
1795   { int arr[F(__has_nothrow_copy(VirtAr))]; }
1796   { int arr[F(__has_nothrow_copy(void))]; }
1797   { int arr[F(__has_nothrow_copy(cvoid))]; }
1798 }
1799
1800 void has_nothrow_constructor() {
1801   { int arr[T(__has_nothrow_constructor(Int))]; }
1802   { int arr[T(__has_nothrow_constructor(IntAr))]; }
1803   { int arr[T(__has_nothrow_constructor(Union))]; }
1804   { int arr[T(__has_nothrow_constructor(UnionAr))]; }
1805   { int arr[T(__has_nothrow_constructor(POD))]; }
1806   { int arr[T(__has_nothrow_constructor(Derives))]; }
1807   { int arr[T(__has_nothrow_constructor(DerivesAr))]; }
1808   { int arr[T(__has_nothrow_constructor(ConstIntAr))]; }
1809   { int arr[T(__has_nothrow_constructor(ConstIntArAr))]; }
1810   { int arr[T(__has_nothrow_constructor(HasDest))]; }
1811   { int arr[T(__has_nothrow_constructor(HasPriv))]; }
1812   { int arr[T(__has_nothrow_constructor(HasCopyAssign))]; }
1813   { int arr[T(__has_nothrow_constructor(const Int))]; }
1814   { int arr[T(__has_nothrow_constructor(HasNoThrowConstructor))]; }
1815   { int arr[T(__has_nothrow_constructor(HasVirtDest))]; }
1816   // { int arr[T(__has_nothrow_constructor(VirtAr))]; } // not implemented
1817   { int arr[T(__has_nothrow_constructor(AllPrivate))]; }
1818   { int arr[T(__has_nothrow_constructor(ACompleteType[]))]; }
1819
1820   { int arr[F(__has_nothrow_constructor(AnIncompleteType[]))]; } // expected-error {{incomplete type}}
1821   { int arr[F(__has_nothrow_constructor(HasCons))]; }
1822   { int arr[F(__has_nothrow_constructor(HasRef))]; }
1823   { int arr[F(__has_nothrow_constructor(HasCopy))]; }
1824   { int arr[F(__has_nothrow_constructor(HasMove))]; }
1825   { int arr[F(__has_nothrow_constructor(HasNoThrowConstructorWithArgs))]; }
1826   { int arr[F(__has_nothrow_constructor(IntRef))]; }
1827   { int arr[F(__has_nothrow_constructor(void))]; }
1828   { int arr[F(__has_nothrow_constructor(cvoid))]; }
1829   { int arr[F(__has_nothrow_constructor(HasTemplateCons))]; }
1830
1831   { int arr[F(__has_nothrow_constructor(HasMultipleDefaultConstructor1))]; }
1832   { int arr[F(__has_nothrow_constructor(HasMultipleDefaultConstructor2))]; }
1833 }
1834
1835 void has_virtual_destructor() {
1836   { int arr[F(__has_virtual_destructor(Int))]; }
1837   { int arr[F(__has_virtual_destructor(IntAr))]; }
1838   { int arr[F(__has_virtual_destructor(Union))]; }
1839   { int arr[F(__has_virtual_destructor(UnionAr))]; }
1840   { int arr[F(__has_virtual_destructor(POD))]; }
1841   { int arr[F(__has_virtual_destructor(Derives))]; }
1842   { int arr[F(__has_virtual_destructor(DerivesAr))]; }
1843   { int arr[F(__has_virtual_destructor(const Int))]; }
1844   { int arr[F(__has_virtual_destructor(ConstIntAr))]; }
1845   { int arr[F(__has_virtual_destructor(ConstIntArAr))]; }
1846   { int arr[F(__has_virtual_destructor(HasDest))]; }
1847   { int arr[F(__has_virtual_destructor(HasPriv))]; }
1848   { int arr[F(__has_virtual_destructor(HasCons))]; }
1849   { int arr[F(__has_virtual_destructor(HasRef))]; }
1850   { int arr[F(__has_virtual_destructor(HasCopy))]; }
1851   { int arr[F(__has_virtual_destructor(HasMove))]; }
1852   { int arr[F(__has_virtual_destructor(HasCopyAssign))]; }
1853   { int arr[F(__has_virtual_destructor(HasMoveAssign))]; }
1854   { int arr[F(__has_virtual_destructor(IntRef))]; }
1855   { int arr[F(__has_virtual_destructor(VirtAr))]; }
1856   { int arr[F(__has_virtual_destructor(ACompleteType[]))]; }
1857
1858   { int arr[F(__has_virtual_destructor(AnIncompleteType[]))]; } // expected-error {{incomplete type}}
1859   { int arr[T(__has_virtual_destructor(HasVirtDest))]; }
1860   { int arr[T(__has_virtual_destructor(DerivedVirtDest))]; }
1861   { int arr[F(__has_virtual_destructor(VirtDestAr))]; }
1862   { int arr[F(__has_virtual_destructor(void))]; }
1863   { int arr[F(__has_virtual_destructor(cvoid))]; }
1864   { int arr[F(__has_virtual_destructor(AllPrivate))]; }
1865 }
1866
1867
1868 class Base {};
1869 class Derived : Base {};
1870 class Derived2a : Derived {};
1871 class Derived2b : Derived {};
1872 class Derived3 : virtual Derived2a, virtual Derived2b {};
1873 template<typename T> struct BaseA { T a;  };
1874 template<typename T> struct DerivedB : BaseA<T> { };
1875 template<typename T> struct CrazyDerived : T { };
1876
1877
1878 class class_forward; // expected-note 2 {{forward declaration of 'class_forward'}}
1879
1880 template <typename Base, typename Derived>
1881 void isBaseOfT() {
1882   int t[T(__is_base_of(Base, Derived))];
1883 };
1884 template <typename Base, typename Derived>
1885 void isBaseOfF() {
1886   int t[F(__is_base_of(Base, Derived))];
1887 };
1888
1889 template <class T> class DerivedTemp : Base {};
1890 template <class T> class NonderivedTemp {};
1891 template <class T> class UndefinedTemp; // expected-note {{declared here}}
1892
1893 void is_base_of() {
1894   { int arr[T(__is_base_of(Base, Derived))]; }
1895   { int arr[T(__is_base_of(const Base, Derived))]; }
1896   { int arr[F(__is_base_of(Derived, Base))]; }
1897   { int arr[F(__is_base_of(Derived, int))]; }
1898   { int arr[T(__is_base_of(Base, Base))]; }
1899   { int arr[T(__is_base_of(Base, Derived3))]; }
1900   { int arr[T(__is_base_of(Derived, Derived3))]; }
1901   { int arr[T(__is_base_of(Derived2b, Derived3))]; }
1902   { int arr[T(__is_base_of(Derived2a, Derived3))]; }
1903   { int arr[T(__is_base_of(BaseA<int>, DerivedB<int>))]; }
1904   { int arr[F(__is_base_of(DerivedB<int>, BaseA<int>))]; }
1905   { int arr[T(__is_base_of(Base, CrazyDerived<Base>))]; }
1906   { int arr[F(__is_base_of(Union, Union))]; }
1907   { int arr[T(__is_base_of(Empty, Empty))]; }
1908   { int arr[T(__is_base_of(class_forward, class_forward))]; }
1909   { int arr[F(__is_base_of(Empty, class_forward))]; } // expected-error {{incomplete type 'class_forward' used in type trait expression}}
1910   { int arr[F(__is_base_of(Base&, Derived&))]; }
1911   int t18[F(__is_base_of(Base[10], Derived[10]))];
1912   { int arr[F(__is_base_of(int, int))]; }
1913   { int arr[F(__is_base_of(long, int))]; }
1914   { int arr[T(__is_base_of(Base, DerivedTemp<int>))]; }
1915   { int arr[F(__is_base_of(Base, NonderivedTemp<int>))]; }
1916   { int arr[F(__is_base_of(Base, UndefinedTemp<int>))]; } // expected-error {{implicit instantiation of undefined template 'UndefinedTemp<int>'}}
1917
1918   isBaseOfT<Base, Derived>();
1919   isBaseOfF<Derived, Base>();
1920
1921   isBaseOfT<Base, CrazyDerived<Base> >();
1922   isBaseOfF<CrazyDerived<Base>, Base>();
1923
1924   isBaseOfT<BaseA<int>, DerivedB<int> >();
1925   isBaseOfF<DerivedB<int>, BaseA<int> >();
1926 }
1927
1928 template<class T, class U>
1929 class TemplateClass {};
1930
1931 template<class T>
1932 using TemplateAlias = TemplateClass<T, int>;
1933
1934 typedef class Base BaseTypedef;
1935
1936 void is_same()
1937 {
1938   int t01[T(__is_same(Base, Base))];
1939   int t02[T(__is_same(Base, BaseTypedef))];
1940   int t03[T(__is_same(TemplateClass<int, int>, TemplateAlias<int>))];
1941
1942   int t10[F(__is_same(Base, const Base))];
1943   int t11[F(__is_same(Base, Base&))];
1944   int t12[F(__is_same(Base, Derived))];
1945 }
1946
1947 struct IntWrapper
1948 {
1949   int value;
1950   IntWrapper(int _value) : value(_value) {}
1951   operator int() const {
1952     return value;
1953   }
1954 };
1955
1956 struct FloatWrapper
1957 {
1958   float value;
1959   FloatWrapper(float _value) : value(_value) {}
1960   FloatWrapper(const IntWrapper& obj)
1961     : value(static_cast<float>(obj.value)) {}
1962   operator float() const {
1963     return value;
1964   }
1965   operator IntWrapper() const {
1966     return IntWrapper(static_cast<int>(value));
1967   }
1968 };
1969
1970 void is_convertible()
1971 {
1972   int t01[T(__is_convertible(IntWrapper, IntWrapper))];
1973   int t02[T(__is_convertible(IntWrapper, const IntWrapper))];
1974   int t03[T(__is_convertible(IntWrapper, int))];
1975   int t04[T(__is_convertible(int, IntWrapper))];
1976   int t05[T(__is_convertible(IntWrapper, FloatWrapper))];
1977   int t06[T(__is_convertible(FloatWrapper, IntWrapper))];
1978   int t07[T(__is_convertible(FloatWrapper, float))];
1979   int t08[T(__is_convertible(float, FloatWrapper))];
1980 }
1981
1982 struct FromInt { FromInt(int); };
1983 struct ToInt { operator int(); };
1984 typedef void Function();
1985
1986 void is_convertible_to();
1987 class PrivateCopy {
1988   PrivateCopy(const PrivateCopy&);
1989   friend void is_convertible_to();
1990 };
1991
1992 template<typename T>
1993 struct X0 { 
1994   template<typename U> X0(const X0<U>&);
1995 };
1996
1997 struct Abstract { virtual void f() = 0; };
1998
1999 void is_convertible_to() {
2000   { int arr[T(__is_convertible_to(Int, Int))]; }
2001   { int arr[F(__is_convertible_to(Int, IntAr))]; }
2002   { int arr[F(__is_convertible_to(IntAr, IntAr))]; }
2003   { int arr[T(__is_convertible_to(void, void))]; }
2004   { int arr[T(__is_convertible_to(cvoid, void))]; }
2005   { int arr[T(__is_convertible_to(void, cvoid))]; }
2006   { int arr[T(__is_convertible_to(cvoid, cvoid))]; }
2007   { int arr[T(__is_convertible_to(int, FromInt))]; }
2008   { int arr[T(__is_convertible_to(long, FromInt))]; }
2009   { int arr[T(__is_convertible_to(double, FromInt))]; }
2010   { int arr[T(__is_convertible_to(const int, FromInt))]; }
2011   { int arr[T(__is_convertible_to(const int&, FromInt))]; }
2012   { int arr[T(__is_convertible_to(ToInt, int))]; }
2013   { int arr[T(__is_convertible_to(ToInt, const int&))]; }
2014   { int arr[T(__is_convertible_to(ToInt, long))]; }
2015   { int arr[F(__is_convertible_to(ToInt, int&))]; }
2016   { int arr[F(__is_convertible_to(ToInt, FromInt))]; }
2017   { int arr[T(__is_convertible_to(IntAr&, IntAr&))]; }
2018   { int arr[T(__is_convertible_to(IntAr&, const IntAr&))]; }
2019   { int arr[F(__is_convertible_to(const IntAr&, IntAr&))]; }
2020   { int arr[F(__is_convertible_to(Function, Function))]; }
2021   { int arr[F(__is_convertible_to(PrivateCopy, PrivateCopy))]; }
2022   { int arr[T(__is_convertible_to(X0<int>, X0<float>))]; }
2023   { int arr[F(__is_convertible_to(Abstract, Abstract))]; }
2024 }
2025
2026 namespace is_convertible_to_instantiate {
2027   // Make sure we don't try to instantiate the constructor.
2028   template<int x> class A { A(int) { int a[x]; } };
2029   int x = __is_convertible_to(int, A<-1>);
2030 }
2031
2032 void is_trivial()
2033 {
2034   { int arr[T(__is_trivial(int))]; }
2035   { int arr[T(__is_trivial(Enum))]; }
2036   { int arr[T(__is_trivial(POD))]; }
2037   { int arr[T(__is_trivial(Int))]; }
2038   { int arr[T(__is_trivial(IntAr))]; }
2039   { int arr[T(__is_trivial(IntArNB))]; }
2040   { int arr[T(__is_trivial(Statics))]; }
2041   { int arr[T(__is_trivial(Empty))]; }
2042   { int arr[T(__is_trivial(EmptyUnion))]; }
2043   { int arr[T(__is_trivial(Union))]; }
2044   { int arr[T(__is_trivial(Derives))]; }
2045   { int arr[T(__is_trivial(DerivesAr))]; }
2046   { int arr[T(__is_trivial(DerivesArNB))]; }
2047   { int arr[T(__is_trivial(DerivesEmpty))]; }
2048   { int arr[T(__is_trivial(HasFunc))]; }
2049   { int arr[T(__is_trivial(HasOp))]; }
2050   { int arr[T(__is_trivial(HasConv))]; }
2051   { int arr[T(__is_trivial(HasAssign))]; }
2052   { int arr[T(__is_trivial(HasAnonymousUnion))]; }
2053   { int arr[T(__is_trivial(HasPriv))]; }
2054   { int arr[T(__is_trivial(HasProt))]; }
2055   { int arr[T(__is_trivial(DerivesHasPriv))]; }
2056   { int arr[T(__is_trivial(DerivesHasProt))]; }
2057   { int arr[T(__is_trivial(Vector))]; }
2058   { int arr[T(__is_trivial(VectorExt))]; }
2059
2060   { int arr[F(__is_trivial(HasCons))]; }
2061   { int arr[F(__is_trivial(HasCopyAssign))]; }
2062   { int arr[F(__is_trivial(HasMoveAssign))]; }
2063   { int arr[F(__is_trivial(HasDest))]; }
2064   { int arr[F(__is_trivial(HasRef))]; }
2065   { int arr[F(__is_trivial(HasNonPOD))]; }
2066   { int arr[F(__is_trivial(HasVirt))]; }
2067   { int arr[F(__is_trivial(DerivesHasCons))]; }
2068   { int arr[F(__is_trivial(DerivesHasCopyAssign))]; }
2069   { int arr[F(__is_trivial(DerivesHasMoveAssign))]; }
2070   { int arr[F(__is_trivial(DerivesHasDest))]; }
2071   { int arr[F(__is_trivial(DerivesHasRef))]; }
2072   { int arr[F(__is_trivial(DerivesHasVirt))]; }
2073   { int arr[F(__is_trivial(void))]; }
2074   { int arr[F(__is_trivial(cvoid))]; }
2075 }
2076
2077 template<typename T> struct TriviallyConstructibleTemplate {};
2078
2079 void trivial_checks()
2080 {
2081   { int arr[T(__is_trivially_copyable(int))]; }
2082   { int arr[T(__is_trivially_copyable(Enum))]; }
2083   { int arr[T(__is_trivially_copyable(POD))]; }
2084   { int arr[T(__is_trivially_copyable(Int))]; }
2085   { int arr[T(__is_trivially_copyable(IntAr))]; }
2086   { int arr[T(__is_trivially_copyable(IntArNB))]; }
2087   { int arr[T(__is_trivially_copyable(Statics))]; }
2088   { int arr[T(__is_trivially_copyable(Empty))]; }
2089   { int arr[T(__is_trivially_copyable(EmptyUnion))]; }
2090   { int arr[T(__is_trivially_copyable(Union))]; }
2091   { int arr[T(__is_trivially_copyable(Derives))]; }
2092   { int arr[T(__is_trivially_copyable(DerivesAr))]; }
2093   { int arr[T(__is_trivially_copyable(DerivesArNB))]; }
2094   { int arr[T(__is_trivially_copyable(DerivesEmpty))]; }
2095   { int arr[T(__is_trivially_copyable(HasFunc))]; }
2096   { int arr[T(__is_trivially_copyable(HasOp))]; }
2097   { int arr[T(__is_trivially_copyable(HasConv))]; }
2098   { int arr[T(__is_trivially_copyable(HasAssign))]; }
2099   { int arr[T(__is_trivially_copyable(HasAnonymousUnion))]; }
2100   { int arr[T(__is_trivially_copyable(HasPriv))]; }
2101   { int arr[T(__is_trivially_copyable(HasProt))]; }
2102   { int arr[T(__is_trivially_copyable(DerivesHasPriv))]; }
2103   { int arr[T(__is_trivially_copyable(DerivesHasProt))]; }
2104   { int arr[T(__is_trivially_copyable(Vector))]; }
2105   { int arr[T(__is_trivially_copyable(VectorExt))]; }
2106   { int arr[T(__is_trivially_copyable(HasCons))]; }
2107   { int arr[T(__is_trivially_copyable(HasRef))]; }
2108   { int arr[T(__is_trivially_copyable(HasNonPOD))]; }
2109   { int arr[T(__is_trivially_copyable(DerivesHasCons))]; }
2110   { int arr[T(__is_trivially_copyable(DerivesHasRef))]; }
2111   { int arr[T(__is_trivially_copyable(NonTrivialDefault))]; }
2112   { int arr[T(__is_trivially_copyable(NonTrivialDefault[]))]; }
2113   { int arr[T(__is_trivially_copyable(NonTrivialDefault[3]))]; }
2114
2115   { int arr[F(__is_trivially_copyable(HasCopyAssign))]; }
2116   { int arr[F(__is_trivially_copyable(HasMoveAssign))]; }
2117   { int arr[F(__is_trivially_copyable(HasDest))]; }
2118   { int arr[F(__is_trivially_copyable(HasVirt))]; }
2119   { int arr[F(__is_trivially_copyable(DerivesHasCopyAssign))]; }
2120   { int arr[F(__is_trivially_copyable(DerivesHasMoveAssign))]; }
2121   { int arr[F(__is_trivially_copyable(DerivesHasDest))]; }
2122   { int arr[F(__is_trivially_copyable(DerivesHasVirt))]; }
2123   { int arr[F(__is_trivially_copyable(void))]; }
2124   { int arr[F(__is_trivially_copyable(cvoid))]; }
2125
2126   { int arr[T((__is_trivially_constructible(int)))]; }
2127   { int arr[T((__is_trivially_constructible(int, int)))]; }
2128   { int arr[T((__is_trivially_constructible(int, float)))]; }
2129   { int arr[T((__is_trivially_constructible(int, int&)))]; }
2130   { int arr[T((__is_trivially_constructible(int, const int&)))]; }
2131   { int arr[T((__is_trivially_constructible(int, int)))]; }
2132   { int arr[T((__is_trivially_constructible(HasCopyAssign, HasCopyAssign)))]; }
2133   { int arr[T((__is_trivially_constructible(HasCopyAssign, const HasCopyAssign&)))]; }
2134   { int arr[T((__is_trivially_constructible(HasCopyAssign, HasCopyAssign&&)))]; }
2135   { int arr[T((__is_trivially_constructible(HasCopyAssign)))]; }
2136   { int arr[T((__is_trivially_constructible(NonTrivialDefault,
2137                                             const NonTrivialDefault&)))]; }
2138   { int arr[T((__is_trivially_constructible(NonTrivialDefault,
2139                                             NonTrivialDefault&&)))]; }
2140   { int arr[T((__is_trivially_constructible(AllDefaulted)))]; }
2141   { int arr[T((__is_trivially_constructible(AllDefaulted,
2142                                             const AllDefaulted &)))]; }
2143   { int arr[T((__is_trivially_constructible(AllDefaulted,
2144                                             AllDefaulted &&)))]; }
2145
2146   { int arr[F((__is_trivially_constructible(int, int*)))]; }
2147   { int arr[F((__is_trivially_constructible(NonTrivialDefault)))]; }
2148   { int arr[F((__is_trivially_constructible(ThreeArgCtor, int*, char*, int&)))]; }
2149   { int arr[F((__is_trivially_constructible(AllDeleted)))]; }
2150   { int arr[F((__is_trivially_constructible(AllDeleted,
2151                                             const AllDeleted &)))]; }
2152   { int arr[F((__is_trivially_constructible(AllDeleted,
2153                                             AllDeleted &&)))]; }
2154   { int arr[F((__is_trivially_constructible(ExtDefaulted)))]; }
2155   { int arr[F((__is_trivially_constructible(ExtDefaulted,
2156                                             const ExtDefaulted &)))]; }
2157   { int arr[F((__is_trivially_constructible(ExtDefaulted,
2158                                             ExtDefaulted &&)))]; }
2159
2160   { int arr[T((__is_trivially_constructible(TriviallyConstructibleTemplate<int>)))]; }
2161   { int arr[F((__is_trivially_constructible(class_forward)))]; } // expected-error {{incomplete type 'class_forward' used in type trait expression}}
2162   { int arr[F((__is_trivially_constructible(class_forward[])))]; }
2163   { int arr[F((__is_trivially_constructible(void)))]; }
2164
2165   { int arr[T((__is_trivially_assignable(int&, int)))]; }
2166   { int arr[T((__is_trivially_assignable(int&, int&)))]; }
2167   { int arr[T((__is_trivially_assignable(int&, int&&)))]; }
2168   { int arr[T((__is_trivially_assignable(int&, const int&)))]; }
2169   { int arr[T((__is_trivially_assignable(POD&, POD)))]; }
2170   { int arr[T((__is_trivially_assignable(POD&, POD&)))]; }
2171   { int arr[T((__is_trivially_assignable(POD&, POD&&)))]; }
2172   { int arr[T((__is_trivially_assignable(POD&, const POD&)))]; }
2173   { int arr[T((__is_trivially_assignable(int*&, int*)))]; }
2174   { int arr[T((__is_trivially_assignable(AllDefaulted,
2175                                          const AllDefaulted &)))]; }
2176   { int arr[T((__is_trivially_assignable(AllDefaulted,
2177                                          AllDefaulted &&)))]; }
2178
2179   { int arr[F((__is_trivially_assignable(int*&, float*)))]; }
2180   { int arr[F((__is_trivially_assignable(HasCopyAssign&, HasCopyAssign)))]; }
2181   { int arr[F((__is_trivially_assignable(HasCopyAssign&, HasCopyAssign&)))]; }
2182   { int arr[F((__is_trivially_assignable(HasCopyAssign&, const HasCopyAssign&)))]; }
2183   { int arr[F((__is_trivially_assignable(HasCopyAssign&, HasCopyAssign&&)))]; }
2184   { int arr[F((__is_trivially_assignable(TrivialMoveButNotCopy&,
2185                                         TrivialMoveButNotCopy&)))]; }
2186   { int arr[F((__is_trivially_assignable(TrivialMoveButNotCopy&,
2187                                         const TrivialMoveButNotCopy&)))]; }
2188   { int arr[F((__is_trivially_assignable(AllDeleted,
2189                                          const AllDeleted &)))]; }
2190   { int arr[F((__is_trivially_assignable(AllDeleted,
2191                                          AllDeleted &&)))]; }
2192   { int arr[F((__is_trivially_assignable(ExtDefaulted,
2193                                          const ExtDefaulted &)))]; }
2194   { int arr[F((__is_trivially_assignable(ExtDefaulted,
2195                                          ExtDefaulted &&)))]; }
2196
2197   { int arr[T((__is_trivially_assignable(HasDefaultTrivialCopyAssign&,
2198                                          HasDefaultTrivialCopyAssign&)))]; }
2199   { int arr[T((__is_trivially_assignable(HasDefaultTrivialCopyAssign&,
2200                                        const HasDefaultTrivialCopyAssign&)))]; }
2201   { int arr[T((__is_trivially_assignable(TrivialMoveButNotCopy&,
2202                                          TrivialMoveButNotCopy)))]; }
2203   { int arr[T((__is_trivially_assignable(TrivialMoveButNotCopy&,
2204                                          TrivialMoveButNotCopy&&)))]; }
2205   { int arr[T((__is_trivially_assignable(int&, int)))]; }
2206   { int arr[T((__is_trivially_assignable(int&, int&)))]; }
2207   { int arr[T((__is_trivially_assignable(int&, int&&)))]; }
2208   { int arr[T((__is_trivially_assignable(int&, const int&)))]; }
2209   { int arr[T((__is_trivially_assignable(POD&, POD)))]; }
2210   { int arr[T((__is_trivially_assignable(POD&, POD&)))]; }
2211   { int arr[T((__is_trivially_assignable(POD&, POD&&)))]; }
2212   { int arr[T((__is_trivially_assignable(POD&, const POD&)))]; }
2213   { int arr[T((__is_trivially_assignable(int*&, int*)))]; }
2214   { int arr[T((__is_trivially_assignable(AllDefaulted,
2215                                          const AllDefaulted &)))]; }
2216   { int arr[T((__is_trivially_assignable(AllDefaulted,
2217                                          AllDefaulted &&)))]; }
2218
2219   { int arr[F((__is_assignable(int *&, float *)))]; }
2220   { int arr[T((__is_assignable(HasCopyAssign &, HasCopyAssign)))]; }
2221   { int arr[T((__is_assignable(HasCopyAssign &, HasCopyAssign &)))]; }
2222   { int arr[T((__is_assignable(HasCopyAssign &, const HasCopyAssign &)))]; }
2223   { int arr[T((__is_assignable(HasCopyAssign &, HasCopyAssign &&)))]; }
2224   { int arr[T((__is_assignable(TrivialMoveButNotCopy &,
2225                                TrivialMoveButNotCopy &)))]; }
2226   { int arr[T((__is_assignable(TrivialMoveButNotCopy &,
2227                                const TrivialMoveButNotCopy &)))]; }
2228   { int arr[F((__is_assignable(AllDeleted,
2229                                const AllDeleted &)))]; }
2230   { int arr[F((__is_assignable(AllDeleted,
2231                                AllDeleted &&)))]; }
2232   { int arr[T((__is_assignable(ExtDefaulted,
2233                                const ExtDefaulted &)))]; }
2234   { int arr[T((__is_assignable(ExtDefaulted,
2235                                ExtDefaulted &&)))]; }
2236
2237   { int arr[T((__is_assignable(HasDefaultTrivialCopyAssign &,
2238                                HasDefaultTrivialCopyAssign &)))]; }
2239   { int arr[T((__is_assignable(HasDefaultTrivialCopyAssign &,
2240                                const HasDefaultTrivialCopyAssign &)))]; }
2241   { int arr[T((__is_assignable(TrivialMoveButNotCopy &,
2242                                TrivialMoveButNotCopy)))]; }
2243   { int arr[T((__is_assignable(TrivialMoveButNotCopy &,
2244                                TrivialMoveButNotCopy &&)))]; }
2245
2246   { int arr[T(__is_assignable(ACompleteType, ACompleteType))]; }
2247   { int arr[F(__is_assignable(AnIncompleteType, AnIncompleteType))]; } // expected-error {{incomplete type}}
2248   { int arr[F(__is_assignable(AnIncompleteType[], AnIncompleteType[]))]; }
2249   { int arr[F(__is_assignable(AnIncompleteType[1], AnIncompleteType[1]))]; } // expected-error {{incomplete type}}
2250   { int arr[F(__is_assignable(void, void))]; }
2251   { int arr[F(__is_assignable(const volatile void, const volatile void))]; }
2252 }
2253
2254 void constructible_checks() {
2255   { int arr[T(__is_constructible(HasNoThrowConstructorWithArgs))]; }
2256   { int arr[F(__is_nothrow_constructible(HasNoThrowConstructorWithArgs))]; } // MSVC doesn't look into default args and gets this wrong.
2257
2258   { int arr[T(__is_constructible(HasNoThrowConstructorWithArgs, HasCons))]; }
2259   { int arr[T(__is_nothrow_constructible(HasNoThrowConstructorWithArgs, HasCons))]; }
2260
2261   { int arr[T(__is_constructible(NonTrivialDefault))]; }
2262   { int arr[F(__is_nothrow_constructible(NonTrivialDefault))]; }
2263
2264   { int arr[T(__is_constructible(int))]; }
2265   { int arr[T(__is_nothrow_constructible(int))]; }
2266
2267   { int arr[F(__is_constructible(NonPOD))]; }
2268   { int arr[F(__is_nothrow_constructible(NonPOD))]; }
2269
2270   { int arr[T(__is_constructible(NonPOD, int))]; }
2271   { int arr[F(__is_nothrow_constructible(NonPOD, int))]; }
2272
2273   // PR19178
2274   { int arr[F(__is_constructible(Abstract))]; }
2275   { int arr[F(__is_nothrow_constructible(Abstract))]; }
2276
2277   // PR20228
2278   { int arr[T(__is_constructible(VariadicCtor,
2279                                  int, int, int, int, int, int, int, int, int))]; }
2280
2281   // PR25513
2282   { int arr[F(__is_constructible(int(int)))]; }
2283   { int arr[T(__is_constructible(int const &, long))]; }
2284
2285   { int arr[T(__is_constructible(ACompleteType))]; }
2286   { int arr[T(__is_nothrow_constructible(ACompleteType))]; }
2287   { int arr[F(__is_constructible(AnIncompleteType))]; } // expected-error {{incomplete type}}
2288   { int arr[F(__is_nothrow_constructible(AnIncompleteType))]; } // expected-error {{incomplete type}}
2289   { int arr[F(__is_constructible(AnIncompleteType[]))]; }
2290   { int arr[F(__is_nothrow_constructible(AnIncompleteType[]))]; }
2291   { int arr[F(__is_constructible(AnIncompleteType[1]))]; } // expected-error {{incomplete type}}
2292   { int arr[F(__is_nothrow_constructible(AnIncompleteType[1]))]; } // expected-error {{incomplete type}}
2293   { int arr[F(__is_constructible(void))]; }
2294   { int arr[F(__is_nothrow_constructible(void))]; }
2295   { int arr[F(__is_constructible(const volatile void))]; }
2296   { int arr[F(__is_nothrow_constructible(const volatile void))]; }
2297 }
2298
2299 // Instantiation of __is_trivially_constructible
2300 template<typename T, typename ...Args>
2301 struct is_trivially_constructible {
2302   static const bool value = __is_trivially_constructible(T, Args...);
2303 };
2304
2305 void is_trivially_constructible_test() {
2306   { int arr[T((is_trivially_constructible<int>::value))]; }
2307   { int arr[T((is_trivially_constructible<int, int>::value))]; }
2308   { int arr[T((is_trivially_constructible<int, float>::value))]; }
2309   { int arr[T((is_trivially_constructible<int, int&>::value))]; }
2310   { int arr[T((is_trivially_constructible<int, const int&>::value))]; }
2311   { int arr[T((is_trivially_constructible<int, int>::value))]; }
2312   { int arr[T((is_trivially_constructible<HasCopyAssign, HasCopyAssign>::value))]; }
2313   { int arr[T((is_trivially_constructible<HasCopyAssign, const HasCopyAssign&>::value))]; }
2314   { int arr[T((is_trivially_constructible<HasCopyAssign, HasCopyAssign&&>::value))]; }
2315   { int arr[T((is_trivially_constructible<HasCopyAssign>::value))]; }
2316   { int arr[T((is_trivially_constructible<NonTrivialDefault,
2317                                             const NonTrivialDefault&>::value))]; }
2318   { int arr[T((is_trivially_constructible<NonTrivialDefault,
2319                                             NonTrivialDefault&&>::value))]; }
2320
2321   { int arr[F((is_trivially_constructible<int, int*>::value))]; }
2322   { int arr[F((is_trivially_constructible<NonTrivialDefault>::value))]; }
2323   { int arr[F((is_trivially_constructible<ThreeArgCtor, int*, char*, int&>::value))]; }
2324   { int arr[F((is_trivially_constructible<Abstract>::value))]; } // PR19178
2325
2326   { int arr[T(__is_trivially_constructible(ACompleteType))]; }
2327   { int arr[F(__is_trivially_constructible(AnIncompleteType))]; } // expected-error {{incomplete type}}
2328   { int arr[F(__is_trivially_constructible(AnIncompleteType[]))]; }
2329   { int arr[F(__is_trivially_constructible(AnIncompleteType[1]))]; } // expected-error {{incomplete type}}
2330   { int arr[F(__is_trivially_constructible(void))]; }
2331   { int arr[F(__is_trivially_constructible(const volatile void))]; }
2332 }
2333
2334 template <class T, class RefType = T &>
2335 struct ConvertsToRef {
2336   operator RefType() const { return static_cast<RefType>(obj); }
2337   mutable T obj = 42;
2338 };
2339
2340 void reference_binds_to_temporary_checks() {
2341   { int arr[F((__reference_binds_to_temporary(int &, int &)))]; }
2342   { int arr[F((__reference_binds_to_temporary(int &, int &&)))]; }
2343
2344   { int arr[F((__reference_binds_to_temporary(int const &, int &)))]; }
2345   { int arr[F((__reference_binds_to_temporary(int const &, int const &)))]; }
2346   { int arr[F((__reference_binds_to_temporary(int const &, int &&)))]; }
2347
2348   { int arr[F((__reference_binds_to_temporary(int &, long &)))]; } // doesn't construct
2349   { int arr[T((__reference_binds_to_temporary(int const &, long &)))]; }
2350   { int arr[T((__reference_binds_to_temporary(int const &, long &&)))]; }
2351   { int arr[T((__reference_binds_to_temporary(int &&, long &)))]; }
2352
2353   using LRef = ConvertsToRef<int, int &>;
2354   using RRef = ConvertsToRef<int, int &&>;
2355   using CLRef = ConvertsToRef<int, const int &>;
2356   using LongRef = ConvertsToRef<long, long &>;
2357   { int arr[T((__is_constructible(int &, LRef)))]; }
2358   { int arr[F((__reference_binds_to_temporary(int &, LRef)))]; }
2359
2360   { int arr[T((__is_constructible(int &&, RRef)))]; }
2361   { int arr[F((__reference_binds_to_temporary(int &&, RRef)))]; }
2362
2363   { int arr[T((__is_constructible(int const &, CLRef)))]; }
2364   { int arr[F((__reference_binds_to_temporary(int &&, CLRef)))]; }
2365
2366   { int arr[T((__is_constructible(int const &, LongRef)))]; }
2367   { int arr[T((__reference_binds_to_temporary(int const &, LongRef)))]; }
2368
2369   // Test that it doesn't accept non-reference types as input.
2370   { int arr[F((__reference_binds_to_temporary(int, long)))]; }
2371
2372   { int arr[T((__reference_binds_to_temporary(const int &, long)))]; }
2373 }
2374
2375 void array_rank() {
2376   int t01[T(__array_rank(IntAr) == 1)];
2377   int t02[T(__array_rank(ConstIntArAr) == 2)];
2378 }
2379
2380 void array_extent() {
2381   int t01[T(__array_extent(IntAr, 0) == 10)];
2382   int t02[T(__array_extent(ConstIntArAr, 0) == 4)];
2383   int t03[T(__array_extent(ConstIntArAr, 1) == 10)];
2384 }
2385
2386 void is_destructible_test() {
2387   { int arr[T(__is_destructible(int))]; }
2388   { int arr[T(__is_destructible(int[2]))]; }
2389   { int arr[F(__is_destructible(int[]))]; }
2390   { int arr[F(__is_destructible(void))]; }
2391   { int arr[T(__is_destructible(int &))]; }
2392   { int arr[T(__is_destructible(HasDest))]; }
2393   { int arr[F(__is_destructible(AllPrivate))]; }
2394   { int arr[T(__is_destructible(SuperNonTrivialStruct))]; }
2395   { int arr[T(__is_destructible(AllDefaulted))]; }
2396   { int arr[F(__is_destructible(AllDeleted))]; }
2397   { int arr[T(__is_destructible(ThrowingDtor))]; }
2398   { int arr[T(__is_destructible(NoThrowDtor))]; }
2399
2400   { int arr[T(__is_destructible(ACompleteType))]; }
2401   { int arr[F(__is_destructible(AnIncompleteType))]; } // expected-error {{incomplete type}}
2402   { int arr[F(__is_destructible(AnIncompleteType[]))]; }
2403   { int arr[F(__is_destructible(AnIncompleteType[1]))]; } // expected-error {{incomplete type}}
2404   { int arr[F(__is_destructible(void))]; }
2405   { int arr[F(__is_destructible(const volatile void))]; }
2406 }
2407
2408 void is_nothrow_destructible_test() {
2409   { int arr[T(__is_nothrow_destructible(int))]; }
2410   { int arr[T(__is_nothrow_destructible(int[2]))]; }
2411   { int arr[F(__is_nothrow_destructible(int[]))]; }
2412   { int arr[F(__is_nothrow_destructible(void))]; }
2413   { int arr[T(__is_nothrow_destructible(int &))]; }
2414   { int arr[T(__is_nothrow_destructible(HasDest))]; }
2415   { int arr[F(__is_nothrow_destructible(AllPrivate))]; }
2416   { int arr[T(__is_nothrow_destructible(SuperNonTrivialStruct))]; }
2417   { int arr[T(__is_nothrow_destructible(AllDefaulted))]; }
2418   { int arr[F(__is_nothrow_destructible(AllDeleted))]; }
2419   { int arr[F(__is_nothrow_destructible(ThrowingDtor))]; }
2420   { int arr[T(__is_nothrow_destructible(NoExceptDtor))]; }
2421   { int arr[T(__is_nothrow_destructible(NoThrowDtor))]; }
2422
2423   { int arr[T(__is_nothrow_destructible(ACompleteType))]; }
2424   { int arr[F(__is_nothrow_destructible(AnIncompleteType))]; } // expected-error {{incomplete type}}
2425   { int arr[F(__is_nothrow_destructible(AnIncompleteType[]))]; }
2426   { int arr[F(__is_nothrow_destructible(AnIncompleteType[1]))]; } // expected-error {{incomplete type}}
2427   { int arr[F(__is_nothrow_destructible(void))]; }
2428   { int arr[F(__is_nothrow_destructible(const volatile void))]; }
2429 }
2430
2431 void is_trivially_destructible_test() {
2432   { int arr[T(__is_trivially_destructible(int))]; }
2433   { int arr[T(__is_trivially_destructible(int[2]))]; }
2434   { int arr[F(__is_trivially_destructible(int[]))]; }
2435   { int arr[F(__is_trivially_destructible(void))]; }
2436   { int arr[T(__is_trivially_destructible(int &))]; }
2437   { int arr[F(__is_trivially_destructible(HasDest))]; }
2438   { int arr[F(__is_trivially_destructible(AllPrivate))]; }
2439   { int arr[F(__is_trivially_destructible(SuperNonTrivialStruct))]; }
2440   { int arr[T(__is_trivially_destructible(AllDefaulted))]; }
2441   { int arr[F(__is_trivially_destructible(AllDeleted))]; }
2442   { int arr[F(__is_trivially_destructible(ThrowingDtor))]; }
2443   { int arr[F(__is_trivially_destructible(NoThrowDtor))]; }
2444
2445   { int arr[T(__is_trivially_destructible(ACompleteType))]; }
2446   { int arr[F(__is_trivially_destructible(AnIncompleteType))]; } // expected-error {{incomplete type}}
2447   { int arr[F(__is_trivially_destructible(AnIncompleteType[]))]; }
2448   { int arr[F(__is_trivially_destructible(AnIncompleteType[1]))]; } // expected-error {{incomplete type}}
2449   { int arr[F(__is_trivially_destructible(void))]; }
2450   { int arr[F(__is_trivially_destructible(const volatile void))]; }
2451 }
2452
2453 // Instantiation of __has_unique_object_representations
2454 template <typename T>
2455 struct has_unique_object_representations {
2456   static const bool value = __has_unique_object_representations(T);
2457 };
2458
2459 static_assert(!has_unique_object_representations<void>::value, "void is never unique");
2460 static_assert(!has_unique_object_representations<const void>::value, "void is never unique");
2461 static_assert(!has_unique_object_representations<volatile void>::value, "void is never unique");
2462 static_assert(!has_unique_object_representations<const volatile void>::value, "void is never unique");
2463
2464 static_assert(has_unique_object_representations<int>::value, "integrals are");
2465 static_assert(has_unique_object_representations<const int>::value, "integrals are");
2466 static_assert(has_unique_object_representations<volatile int>::value, "integrals are");
2467 static_assert(has_unique_object_representations<const volatile int>::value, "integrals are");
2468
2469 static_assert(has_unique_object_representations<void *>::value, "as are pointers");
2470 static_assert(has_unique_object_representations<const void *>::value, "as are pointers");
2471 static_assert(has_unique_object_representations<volatile void *>::value, "are pointers");
2472 static_assert(has_unique_object_representations<const volatile void *>::value, "as are pointers");
2473
2474 static_assert(has_unique_object_representations<int *>::value, "as are pointers");
2475 static_assert(has_unique_object_representations<const int *>::value, "as are pointers");
2476 static_assert(has_unique_object_representations<volatile int *>::value, "as are pointers");
2477 static_assert(has_unique_object_representations<const volatile int *>::value, "as are pointers");
2478
2479 class C {};
2480 using FP = int (*)(int);
2481 using PMF = int (C::*)(int);
2482 using PMD = int C::*;
2483
2484 static_assert(has_unique_object_representations<FP>::value, "even function pointers");
2485 static_assert(has_unique_object_representations<const FP>::value, "even function pointers");
2486 static_assert(has_unique_object_representations<volatile FP>::value, "even function pointers");
2487 static_assert(has_unique_object_representations<const volatile FP>::value, "even function pointers");
2488
2489 static_assert(has_unique_object_representations<PMF>::value, "and pointer to members");
2490 static_assert(has_unique_object_representations<const PMF>::value, "and pointer to members");
2491 static_assert(has_unique_object_representations<volatile PMF>::value, "and pointer to members");
2492 static_assert(has_unique_object_representations<const volatile PMF>::value, "and pointer to members");
2493
2494 static_assert(has_unique_object_representations<PMD>::value, "and pointer to members");
2495 static_assert(has_unique_object_representations<const PMD>::value, "and pointer to members");
2496 static_assert(has_unique_object_representations<volatile PMD>::value, "and pointer to members");
2497 static_assert(has_unique_object_representations<const volatile PMD>::value, "and pointer to members");
2498
2499 static_assert(has_unique_object_representations<bool>::value, "yes, all integral types");
2500 static_assert(has_unique_object_representations<char>::value, "yes, all integral types");
2501 static_assert(has_unique_object_representations<signed char>::value, "yes, all integral types");
2502 static_assert(has_unique_object_representations<unsigned char>::value, "yes, all integral types");
2503 static_assert(has_unique_object_representations<short>::value, "yes, all integral types");
2504 static_assert(has_unique_object_representations<unsigned short>::value, "yes, all integral types");
2505 static_assert(has_unique_object_representations<int>::value, "yes, all integral types");
2506 static_assert(has_unique_object_representations<unsigned int>::value, "yes, all integral types");
2507 static_assert(has_unique_object_representations<long>::value, "yes, all integral types");
2508 static_assert(has_unique_object_representations<unsigned long>::value, "yes, all integral types");
2509 static_assert(has_unique_object_representations<long long>::value, "yes, all integral types");
2510 static_assert(has_unique_object_representations<unsigned long long>::value, "yes, all integral types");
2511 static_assert(has_unique_object_representations<wchar_t>::value, "yes, all integral types");
2512 static_assert(has_unique_object_representations<char16_t>::value, "yes, all integral types");
2513 static_assert(has_unique_object_representations<char32_t>::value, "yes, all integral types");
2514
2515 static_assert(!has_unique_object_representations<void>::value, "but not void!");
2516 static_assert(!has_unique_object_representations<decltype(nullptr)>::value, "or nullptr_t");
2517 static_assert(!has_unique_object_representations<float>::value, "definitely not Floating Point");
2518 static_assert(!has_unique_object_representations<double>::value, "definitely not Floating Point");
2519 static_assert(!has_unique_object_representations<long double>::value, "definitely not Floating Point");
2520
2521 struct NoPadding {
2522   int a;
2523   int b;
2524 };
2525
2526 static_assert(has_unique_object_representations<NoPadding>::value, "types without padding are");
2527
2528 struct InheritsFromNoPadding : NoPadding {
2529   int c;
2530   int d;
2531 };
2532
2533 static_assert(has_unique_object_representations<InheritsFromNoPadding>::value, "types without padding are");
2534
2535 struct VirtuallyInheritsFromNoPadding : virtual NoPadding {
2536   int c;
2537   int d;
2538 };
2539
2540 static_assert(!has_unique_object_representations<VirtuallyInheritsFromNoPadding>::value, "No virtual inheritance");
2541
2542 struct Padding {
2543   char a;
2544   int b;
2545 };
2546
2547 //static_assert(!has_unique_object_representations<Padding>::value, "but not with padding");
2548
2549 struct InheritsFromPadding : Padding {
2550   int c;
2551   int d;
2552 };
2553
2554 static_assert(!has_unique_object_representations<InheritsFromPadding>::value, "or its subclasses");
2555
2556 struct TailPadding {
2557   int a;
2558   char b;
2559 };
2560
2561 static_assert(!has_unique_object_representations<TailPadding>::value, "even at the end");
2562
2563 struct TinyStruct {
2564   char a;
2565 };
2566
2567 static_assert(has_unique_object_representations<TinyStruct>::value, "Should be no padding");
2568
2569 struct InheritsFromTinyStruct : TinyStruct {
2570   int b;
2571 };
2572
2573 static_assert(!has_unique_object_representations<InheritsFromTinyStruct>::value, "Inherit causes padding");
2574
2575 union NoPaddingUnion {
2576   int a;
2577   unsigned int b;
2578 };
2579
2580 static_assert(has_unique_object_representations<NoPaddingUnion>::value, "unions follow the same rules as structs");
2581
2582 union PaddingUnion {
2583   int a;
2584   long long b;
2585 };
2586
2587 static_assert(!has_unique_object_representations<PaddingUnion>::value, "unions follow the same rules as structs");
2588
2589 struct NotTriviallyCopyable {
2590   int x;
2591   NotTriviallyCopyable(const NotTriviallyCopyable &) {}
2592 };
2593
2594 static_assert(!has_unique_object_representations<NotTriviallyCopyable>::value, "must be trivially copyable");
2595
2596 struct HasNonUniqueMember {
2597   float x;
2598 };
2599
2600 static_assert(!has_unique_object_representations<HasNonUniqueMember>::value, "all members must be unique");
2601
2602 enum ExampleEnum { xExample,
2603                    yExample };
2604 enum LLEnum : long long { xLongExample,
2605                           yLongExample };
2606
2607 static_assert(has_unique_object_representations<ExampleEnum>::value, "Enums are integrals, so unique!");
2608 static_assert(has_unique_object_representations<LLEnum>::value, "Enums are integrals, so unique!");
2609
2610 enum class ExampleEnumClass { xExample,
2611                               yExample };
2612 enum class LLEnumClass : long long { xLongExample,
2613                                      yLongExample };
2614
2615 static_assert(has_unique_object_representations<ExampleEnumClass>::value, "Enums are integrals, so unique!");
2616 static_assert(has_unique_object_representations<LLEnumClass>::value, "Enums are integrals, so unique!");
2617
2618 // because references aren't trivially copyable.
2619 static_assert(!has_unique_object_representations<int &>::value, "No references!");
2620 static_assert(!has_unique_object_representations<const int &>::value, "No references!");
2621 static_assert(!has_unique_object_representations<volatile int &>::value, "No references!");
2622 static_assert(!has_unique_object_representations<const volatile int &>::value, "No references!");
2623 static_assert(!has_unique_object_representations<Empty>::value, "No empty types!");
2624 static_assert(!has_unique_object_representations<EmptyUnion>::value, "No empty types!");
2625
2626 class Compressed : Empty {
2627   int x;
2628 };
2629
2630 static_assert(has_unique_object_representations<Compressed>::value, "But inheriting from one is ok");
2631
2632 class EmptyInheritor : Compressed {};
2633
2634 static_assert(has_unique_object_representations<EmptyInheritor>::value, "As long as the base has items, empty is ok");
2635
2636 class Dynamic {
2637   virtual void A();
2638   int i;
2639 };
2640
2641 static_assert(!has_unique_object_representations<Dynamic>::value, "Dynamic types are not valid");
2642
2643 class InheritsDynamic : Dynamic {
2644   int j;
2645 };
2646
2647 static_assert(!has_unique_object_representations<InheritsDynamic>::value, "Dynamic types are not valid");
2648
2649 static_assert(has_unique_object_representations<int[42]>::value, "Arrays are fine, as long as their value type is");
2650 static_assert(has_unique_object_representations<int[]>::value, "Arrays are fine, as long as their value type is");
2651 static_assert(has_unique_object_representations<int[][42]>::value, "Arrays are fine, as long as their value type is");
2652 static_assert(!has_unique_object_representations<double[42]>::value, "So no array of doubles!");
2653 static_assert(!has_unique_object_representations<double[]>::value, "So no array of doubles!");
2654 static_assert(!has_unique_object_representations<double[][42]>::value, "So no array of doubles!");
2655
2656 struct __attribute__((aligned(16))) WeirdAlignment {
2657   int i;
2658 };
2659 union __attribute__((aligned(16))) WeirdAlignmentUnion {
2660   int i;
2661 };
2662 static_assert(!has_unique_object_representations<WeirdAlignment>::value, "Alignment causes padding");
2663 static_assert(!has_unique_object_representations<WeirdAlignmentUnion>::value, "Alignment causes padding");
2664 static_assert(!has_unique_object_representations<WeirdAlignment[42]>::value, "Also no arrays that have padding");
2665
2666 static_assert(!has_unique_object_representations<int(int)>::value, "Functions are not unique");
2667 static_assert(!has_unique_object_representations<int(int) const>::value, "Functions are not unique");
2668 static_assert(!has_unique_object_representations<int(int) volatile>::value, "Functions are not unique");
2669 static_assert(!has_unique_object_representations<int(int) const volatile>::value, "Functions are not unique");
2670 static_assert(!has_unique_object_representations<int(int) &>::value, "Functions are not unique");
2671 static_assert(!has_unique_object_representations<int(int) const &>::value, "Functions are not unique");
2672 static_assert(!has_unique_object_representations<int(int) volatile &>::value, "Functions are not unique");
2673 static_assert(!has_unique_object_representations<int(int) const volatile &>::value, "Functions are not unique");
2674 static_assert(!has_unique_object_representations<int(int) &&>::value, "Functions are not unique");
2675 static_assert(!has_unique_object_representations<int(int) const &&>::value, "Functions are not unique");
2676 static_assert(!has_unique_object_representations<int(int) volatile &&>::value, "Functions are not unique");
2677 static_assert(!has_unique_object_representations<int(int) const volatile &&>::value, "Functions are not unique");
2678
2679 static_assert(!has_unique_object_representations<int(int, ...)>::value, "Functions are not unique");
2680 static_assert(!has_unique_object_representations<int(int, ...) const>::value, "Functions are not unique");
2681 static_assert(!has_unique_object_representations<int(int, ...) volatile>::value, "Functions are not unique");
2682 static_assert(!has_unique_object_representations<int(int, ...) const volatile>::value, "Functions are not unique");
2683 static_assert(!has_unique_object_representations<int(int, ...) &>::value, "Functions are not unique");
2684 static_assert(!has_unique_object_representations<int(int, ...) const &>::value, "Functions are not unique");
2685 static_assert(!has_unique_object_representations<int(int, ...) volatile &>::value, "Functions are not unique");
2686 static_assert(!has_unique_object_representations<int(int, ...) const volatile &>::value, "Functions are not unique");
2687 static_assert(!has_unique_object_representations<int(int, ...) &&>::value, "Functions are not unique");
2688 static_assert(!has_unique_object_representations<int(int, ...) const &&>::value, "Functions are not unique");
2689 static_assert(!has_unique_object_representations<int(int, ...) volatile &&>::value, "Functions are not unique");
2690 static_assert(!has_unique_object_representations<int(int, ...) const volatile &&>::value, "Functions are not unique");
2691
2692 void foo(){
2693   static auto lambda = []() {};
2694   static_assert(!has_unique_object_representations<decltype(lambda)>::value, "Lambdas follow struct rules");
2695   int i;
2696   static auto lambda2 = [i]() {};
2697   static_assert(has_unique_object_representations<decltype(lambda2)>::value, "Lambdas follow struct rules");
2698 }
2699
2700 struct PaddedBitfield {
2701   char c : 6;
2702   char d : 1;
2703 };
2704
2705 struct UnPaddedBitfield {
2706   char c : 6;
2707   char d : 2;
2708 };
2709
2710 struct AlignedPaddedBitfield {
2711   char c : 6;
2712   __attribute__((aligned(1)))
2713   char d : 2;
2714 };
2715
2716 static_assert(!has_unique_object_representations<PaddedBitfield>::value, "Bitfield padding");
2717 static_assert(has_unique_object_representations<UnPaddedBitfield>::value, "Bitfield padding");
2718 static_assert(!has_unique_object_representations<AlignedPaddedBitfield>::value, "Bitfield padding");
2719
2720 struct BoolBitfield {
2721   bool b : 8;
2722 };
2723
2724 static_assert(has_unique_object_representations<BoolBitfield>::value, "Bitfield bool");
2725
2726 struct BoolBitfield2 {
2727   bool b : 16;
2728 };
2729
2730 static_assert(!has_unique_object_representations<BoolBitfield2>::value, "Bitfield bool");
2731
2732 struct GreaterSizeBitfield {
2733   //expected-warning@+1 {{width of bit-field 'n'}}
2734   int n : 1024;
2735 };
2736
2737 static_assert(sizeof(GreaterSizeBitfield) == 128, "Bitfield Size");
2738 static_assert(!has_unique_object_representations<GreaterSizeBitfield>::value, "Bitfield padding");
2739
2740 struct StructWithRef {
2741   int &I;
2742 };
2743
2744 static_assert(has_unique_object_representations<StructWithRef>::value, "References are still unique");
2745
2746 struct NotUniqueBecauseTailPadding {
2747   int &r;
2748   char a;
2749 };
2750 struct CanBeUniqueIfNoPadding : NotUniqueBecauseTailPadding {
2751   char b[7];
2752 };
2753
2754 static_assert(!has_unique_object_representations<NotUniqueBecauseTailPadding>::value, 
2755               "non trivial");
2756 // Can be unique on Itanium, since the is child class' data is 'folded' into the
2757 // parent's tail padding.
2758 static_assert(sizeof(CanBeUniqueIfNoPadding) != 16 ||
2759               has_unique_object_representations<CanBeUniqueIfNoPadding>::value,
2760               "inherit from std layout");
2761
2762 namespace ErrorType {
2763   struct S; //expected-note{{forward declaration of 'ErrorType::S'}}
2764
2765   struct T {
2766         S t; //expected-error{{field has incomplete type 'ErrorType::S'}}
2767   };
2768   bool b = __has_unique_object_representations(T);
2769 };