aboutsummaryrefslogblamecommitdiff
path: root/test/SemaCXX/type-traits.cpp
blob: c53b02774aca9288bf71c8975a2f42bf78b76001 (plain) (tree)
1
2
3
4
5
6
7
8
9
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
                                                                                                                     







                                                  

                          

                      
                      
                                                     
                    
                      




                                           
 






                          


                                                          
           
                         
                        

                              
                               
                                 
                                                                         
                                                                          
























                                                                   
                                     

                                                   








                                                                      





                                                              
                            
                           
                            
                                        







                                               
                                           
 















                                                                  







                                            














                                                                         






                                                    



                                 



                                            











                                 

             
















                                              







                                           
 



                                          





                                                 








                                           





                                         
                                    


               















                                            
                                              







                                                

 



                          



                                                
 







                                        






                          

                                        
 







                                                





                      

                                      
 









                                               

 











                                       











                                         

               


                                                              














                                                             
                                                             

 




                                                               


                                                              











                                                             
                                                              

 
                          



                                       




                                                     
                                                    



































































































































































































































































































































































































































































                                                                         
 

















































































































































































                                                                           








                                    








                                                          












                                                                                

























                                                                      























                                               

                                         


                                             

                                                  
                                         


























                                                          

                                                    

                                            


                                                             


                                                    






















































































































                                                                      
 








                                   
                
                        

  






                            
                                        













                                                           

                                                          








                                                             
                                                        
                                                          

 

                                     

                                                                
                                               
                                                               
                                 
                                                               
                                        
                                                              















                                                                          
                                     
















                                                    

                                                   
                                                
                                                    


                                                      


                                             
                                                 
                                                   


                                    












                                                      

                                                     
                                                  
                                                      





                                                      


                                               
                                                   
                                                     


                               


















                                                          

                                                         
                                                          



                                                    
                                                       
                                                         
 




                                    

                                                   
 
 
















                                                     
                           















                                                                     

                                                    
                                                  






                                                              


                                               
                                                

 




















                                                                                  



                                                                                      


                                                                              



                                

                                                                  
                                                   
                                                                   
                           
                                                                 
                                            
                                                                  














                                                                                  
                         




















                                                             
                                                 
                                                


                                                      


                                             


                                















                                                                          
                                                        









                                                                           


                                                                            


                               

























                                                            
                                                       












                                                         
                                                                                  














                                                                          
















                                                                                                                                         
                                                  




                                                                                                                                                 










                                          




                                            






                                           
                                                                     








































                                                             














                                        

                                          
                          






















                                                                
                                                          

 





                                                           












































                                                     

                                                              
                     






























                                                             


                                                                










                                                                


































                                                                                      




                                                                                                                                                    







































                                                                                    







































                                                                            

 





















                                                                                                                                        



                                                                                  


                                               

 
























                                                                                           
                                                                           

 








                                                    
 






























                                                                   
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify -std=gnu++11 -fms-extensions -Wno-microsoft %s
#define T(b) (b) ? 1 : -1
#define F(b) (b) ? -1 : 1

struct NonPOD { NonPOD(int); };

// PODs
enum Enum { EV };
struct POD { Enum e; int i; float f; NonPOD* p; };
struct Empty {};
typedef Empty EmptyAr[10];
typedef int Int;
typedef Int IntAr[10];
typedef Int IntArNB[];
class Statics { static int priv; static NonPOD np; };
union EmptyUnion {};
union IncompleteUnion;
union Union { int i; float f; };
struct HasFunc { void f (); };
struct HasOp { void operator *(); };
struct HasConv { operator int(); };
struct HasAssign { void operator =(int); };

struct HasAnonymousUnion {
  union {
    int i;
    float f;
  };
};

typedef int Vector __attribute__((vector_size(16)));
typedef int VectorExt __attribute__((ext_vector_type(4)));

// Not PODs
typedef const void cvoid;
struct Derives : POD {};
typedef Derives DerivesAr[10];
typedef Derives DerivesArNB[];
struct DerivesEmpty : Empty {};
struct HasCons { HasCons(int); };
struct HasCopyAssign { HasCopyAssign operator =(const HasCopyAssign&); };
struct HasMoveAssign { HasMoveAssign operator =(const HasMoveAssign&&); };
struct HasNoThrowMoveAssign { 
  HasNoThrowMoveAssign& operator=(
    const HasNoThrowMoveAssign&&) throw(); };
struct HasNoExceptNoThrowMoveAssign { 
  HasNoExceptNoThrowMoveAssign& operator=(
    const HasNoExceptNoThrowMoveAssign&&) noexcept; 
};
struct HasThrowMoveAssign { 
  HasThrowMoveAssign& operator=(
    const HasThrowMoveAssign&&) throw(POD); };
struct HasNoExceptFalseMoveAssign { 
  HasNoExceptFalseMoveAssign& operator=(
    const HasNoExceptFalseMoveAssign&&) noexcept(false); };
struct HasMoveCtor { HasMoveCtor(const HasMoveCtor&&); };
struct HasMemberMoveCtor { HasMoveCtor member; };
struct HasMemberMoveAssign { HasMoveAssign member; };
struct HasStaticMemberMoveCtor { static HasMoveCtor member; };
struct HasStaticMemberMoveAssign { static HasMoveAssign member; };
struct HasMemberThrowMoveAssign { HasThrowMoveAssign member; };
struct HasMemberNoExceptFalseMoveAssign { 
  HasNoExceptFalseMoveAssign member; };
struct HasMemberNoThrowMoveAssign { HasNoThrowMoveAssign member; };
struct HasMemberNoExceptNoThrowMoveAssign { 
  HasNoExceptNoThrowMoveAssign member; };

struct HasDefaultTrivialCopyAssign { 
  HasDefaultTrivialCopyAssign &operator=(
    const HasDefaultTrivialCopyAssign&) = default; 
};
struct TrivialMoveButNotCopy { 
  TrivialMoveButNotCopy &operator=(TrivialMoveButNotCopy&&) = default;
  TrivialMoveButNotCopy &operator=(const TrivialMoveButNotCopy&);
};
struct NonTrivialDefault {
  NonTrivialDefault();
};

struct HasDest { ~HasDest(); };
class  HasPriv { int priv; };
class  HasProt { protected: int prot; };
struct HasRef { int i; int& ref; HasRef() : i(0), ref(i) {} };
struct HasNonPOD { NonPOD np; };
struct HasVirt { virtual void Virt() {}; };
typedef NonPOD NonPODAr[10];
typedef HasVirt VirtAr[10];
typedef NonPOD NonPODArNB[];
union NonPODUnion { int i; Derives n; };
struct DerivesHasCons : HasCons {};
struct DerivesHasCopyAssign : HasCopyAssign {};
struct DerivesHasMoveAssign : HasMoveAssign {};
struct DerivesHasDest : HasDest {};
struct DerivesHasPriv : HasPriv {};
struct DerivesHasProt : HasProt {};
struct DerivesHasRef : HasRef {};
struct DerivesHasVirt : HasVirt {};
struct DerivesHasMoveCtor : HasMoveCtor {};

struct HasNoThrowCopyAssign {
  void operator =(const HasNoThrowCopyAssign&) throw();
};
struct HasMultipleCopyAssign {
  void operator =(const HasMultipleCopyAssign&) throw();
  void operator =(volatile HasMultipleCopyAssign&);
};
struct HasMultipleNoThrowCopyAssign {
  void operator =(const HasMultipleNoThrowCopyAssign&) throw();
  void operator =(volatile HasMultipleNoThrowCopyAssign&) throw();
};

struct HasNoThrowConstructor { HasNoThrowConstructor() throw(); };
struct HasNoThrowConstructorWithArgs {
  HasNoThrowConstructorWithArgs(HasCons i = HasCons(0)) throw();
};
struct HasMultipleDefaultConstructor1 {
  HasMultipleDefaultConstructor1() throw();
  HasMultipleDefaultConstructor1(int i = 0);
};
struct HasMultipleDefaultConstructor2 {
  HasMultipleDefaultConstructor2(int i = 0);
  HasMultipleDefaultConstructor2() throw();
};

struct HasNoThrowCopy { HasNoThrowCopy(const HasNoThrowCopy&) throw(); };
struct HasMultipleCopy {
  HasMultipleCopy(const HasMultipleCopy&) throw();
  HasMultipleCopy(volatile HasMultipleCopy&);
};
struct HasMultipleNoThrowCopy {
  HasMultipleNoThrowCopy(const HasMultipleNoThrowCopy&) throw();
  HasMultipleNoThrowCopy(volatile HasMultipleNoThrowCopy&) throw();
};

struct HasVirtDest { virtual ~HasVirtDest(); };
struct DerivedVirtDest : HasVirtDest {};
typedef HasVirtDest VirtDestAr[1];

class AllPrivate {
  AllPrivate() throw();
  AllPrivate(const AllPrivate&) throw();
  AllPrivate &operator=(const AllPrivate &) throw();
  ~AllPrivate() throw();
};

struct ThreeArgCtor {
  ThreeArgCtor(int*, char*, int);
};

struct VariadicCtor {
  template<typename...T> VariadicCtor(T...);
};

struct ThrowingDtor {
  ~ThrowingDtor() throw(int);
};

struct NoExceptDtor {
  ~NoExceptDtor() noexcept(true);
};

struct NoThrowDtor {
  ~NoThrowDtor() throw();
};

void is_pod()
{
  { int arr[T(__is_pod(int))]; }
  { int arr[T(__is_pod(Enum))]; }
  { int arr[T(__is_pod(POD))]; }
  { int arr[T(__is_pod(Int))]; }
  { int arr[T(__is_pod(IntAr))]; }
  { int arr[T(__is_pod(Statics))]; }
  { int arr[T(__is_pod(Empty))]; }
  { int arr[T(__is_pod(EmptyUnion))]; }
  { int arr[T(__is_pod(Union))]; }
  { int arr[T(__is_pod(HasFunc))]; }
  { int arr[T(__is_pod(HasOp))]; }
  { int arr[T(__is_pod(HasConv))]; }
  { int arr[T(__is_pod(HasAssign))]; }
  { int arr[T(__is_pod(IntArNB))]; }
  { int arr[T(__is_pod(HasAnonymousUnion))]; }
  { int arr[T(__is_pod(Vector))]; }
  { int arr[T(__is_pod(VectorExt))]; }
  { int arr[T(__is_pod(Derives))]; }
  { int arr[T(__is_pod(DerivesAr))]; }
  { int arr[T(__is_pod(DerivesArNB))]; }
  { int arr[T(__is_pod(DerivesEmpty))]; }
  { int arr[T(__is_pod(HasPriv))]; }
  { int arr[T(__is_pod(HasProt))]; }
  { int arr[T(__is_pod(DerivesHasPriv))]; }
  { int arr[T(__is_pod(DerivesHasProt))]; }

  { int arr[F(__is_pod(HasCons))]; }
  { int arr[F(__is_pod(HasCopyAssign))]; }
  { int arr[F(__is_pod(HasMoveAssign))]; }
  { int arr[F(__is_pod(HasDest))]; }
  { int arr[F(__is_pod(HasRef))]; }
  { int arr[F(__is_pod(HasVirt))]; }
  { int arr[F(__is_pod(DerivesHasCons))]; }
  { int arr[F(__is_pod(DerivesHasCopyAssign))]; }
  { int arr[F(__is_pod(DerivesHasMoveAssign))]; }
  { int arr[F(__is_pod(DerivesHasDest))]; }
  { int arr[F(__is_pod(DerivesHasRef))]; }
  { int arr[F(__is_pod(DerivesHasVirt))]; }
  { int arr[F(__is_pod(NonPOD))]; }
  { int arr[F(__is_pod(HasNonPOD))]; }
  { int arr[F(__is_pod(NonPODAr))]; }
  { int arr[F(__is_pod(NonPODArNB))]; }
  { int arr[F(__is_pod(void))]; }
  { int arr[F(__is_pod(cvoid))]; }
// { int arr[F(__is_pod(NonPODUnion))]; }
}

typedef Empty EmptyAr[10];
struct Bit0 { int : 0; };
struct Bit0Cons { int : 0; Bit0Cons(); };
struct BitOnly { int x : 3; };
struct DerivesVirt : virtual POD {};

void is_empty()
{
  { int arr[T(__is_empty(Empty))]; }
  { int arr[T(__is_empty(DerivesEmpty))]; }
  { int arr[T(__is_empty(HasCons))]; }
  { int arr[T(__is_empty(HasCopyAssign))]; }
  { int arr[T(__is_empty(HasMoveAssign))]; }
  { int arr[T(__is_empty(HasDest))]; }
  { int arr[T(__is_empty(HasFunc))]; }
  { int arr[T(__is_empty(HasOp))]; }
  { int arr[T(__is_empty(HasConv))]; }
  { int arr[T(__is_empty(HasAssign))]; }
  { int arr[T(__is_empty(Bit0))]; }
  { int arr[T(__is_empty(Bit0Cons))]; }

  { int arr[F(__is_empty(Int))]; }
  { int arr[F(__is_empty(POD))]; }
  { int arr[F(__is_empty(EmptyUnion))]; }
  { int arr[F(__is_empty(IncompleteUnion))]; }
  { int arr[F(__is_empty(EmptyAr))]; }
  { int arr[F(__is_empty(HasRef))]; }
  { int arr[F(__is_empty(HasVirt))]; }
  { int arr[F(__is_empty(BitOnly))]; }
  { int arr[F(__is_empty(void))]; }
  { int arr[F(__is_empty(IntArNB))]; }
  { int arr[F(__is_empty(HasAnonymousUnion))]; }
//  { int arr[F(__is_empty(DerivesVirt))]; }
}

typedef Derives ClassType;

void is_class()
{
  { int arr[T(__is_class(Derives))]; }
  { int arr[T(__is_class(HasPriv))]; }
  { int arr[T(__is_class(ClassType))]; }
  { int arr[T(__is_class(HasAnonymousUnion))]; }

  { int arr[F(__is_class(int))]; }
  { int arr[F(__is_class(Enum))]; }
  { int arr[F(__is_class(Int))]; }
  { int arr[F(__is_class(IntAr))]; }
  { int arr[F(__is_class(DerivesAr))]; }
  { int arr[F(__is_class(Union))]; }
  { int arr[F(__is_class(cvoid))]; }
  { int arr[F(__is_class(IntArNB))]; }
}

typedef Union UnionAr[10];
typedef Union UnionType;

void is_union()
{
  { int arr[T(__is_union(Union))]; }
  { int arr[T(__is_union(UnionType))]; }

  { int arr[F(__is_union(int))]; }
  { int arr[F(__is_union(Enum))]; }
  { int arr[F(__is_union(Int))]; }
  { int arr[F(__is_union(IntAr))]; }
  { int arr[F(__is_union(UnionAr))]; }
  { int arr[F(__is_union(cvoid))]; }
  { int arr[F(__is_union(IntArNB))]; }
  { int arr[F(__is_union(HasAnonymousUnion))]; }
}

typedef Enum EnumType;

void is_enum()
{
  { int arr[T(__is_enum(Enum))]; }
  { int arr[T(__is_enum(EnumType))]; }

  { int arr[F(__is_enum(int))]; }
  { int arr[F(__is_enum(Union))]; }
  { int arr[F(__is_enum(Int))]; }
  { int arr[F(__is_enum(IntAr))]; }
  { int arr[F(__is_enum(UnionAr))]; }
  { int arr[F(__is_enum(Derives))]; }
  { int arr[F(__is_enum(ClassType))]; }
  { int arr[F(__is_enum(cvoid))]; }
  { int arr[F(__is_enum(IntArNB))]; }
  { int arr[F(__is_enum(HasAnonymousUnion))]; }
}

struct FinalClass final {
};

template<typename T> 
struct PotentiallyFinal { };

template<typename T>
struct PotentiallyFinal<T*> final { };

template<>
struct PotentiallyFinal<int> final { };

struct SealedClass sealed {
};

template<typename T>
struct PotentiallySealed { };

template<typename T>
struct PotentiallySealed<T*> sealed { };

template<>
struct PotentiallySealed<int> sealed { };

void is_final()
{
	{ int arr[T(__is_final(SealedClass))]; }
	{ int arr[T(__is_final(PotentiallySealed<float*>))]; }
	{ int arr[T(__is_final(PotentiallySealed<int>))]; }
	{ int arr[T(__is_final(FinalClass))]; }
	{ int arr[T(__is_final(PotentiallyFinal<float*>))]; }
	{ int arr[T(__is_final(PotentiallyFinal<int>))]; }

	{ int arr[F(__is_final(int))]; }
	{ int arr[F(__is_final(Union))]; }
	{ int arr[F(__is_final(Int))]; }
	{ int arr[F(__is_final(IntAr))]; }
	{ int arr[F(__is_final(UnionAr))]; }
	{ int arr[F(__is_final(Derives))]; }
	{ int arr[F(__is_final(ClassType))]; }
	{ int arr[F(__is_final(cvoid))]; }
	{ int arr[F(__is_final(IntArNB))]; }
	{ int arr[F(__is_final(HasAnonymousUnion))]; }
	{ int arr[F(__is_final(PotentiallyFinal<float>))]; }
	{ int arr[F(__is_final(PotentiallySealed<float>))]; }
}

void is_sealed()
{
	{ int arr[T(__is_sealed(SealedClass))]; }
	{ int arr[T(__is_sealed(PotentiallySealed<float*>))]; }
	{ int arr[T(__is_sealed(PotentiallySealed<int>))]; }
	{ int arr[T(__is_sealed(FinalClass))]; }
	{ int arr[T(__is_sealed(PotentiallyFinal<float*>))]; }
	{ int arr[T(__is_sealed(PotentiallyFinal<int>))]; }

	{ int arr[F(__is_sealed(int))]; }
	{ int arr[F(__is_sealed(Union))]; }
	{ int arr[F(__is_sealed(Int))]; }
	{ int arr[F(__is_sealed(IntAr))]; }
	{ int arr[F(__is_sealed(UnionAr))]; }
	{ int arr[F(__is_sealed(Derives))]; }
	{ int arr[F(__is_sealed(ClassType))]; }
	{ int arr[F(__is_sealed(cvoid))]; }
	{ int arr[F(__is_sealed(IntArNB))]; }
	{ int arr[F(__is_sealed(HasAnonymousUnion))]; }
	{ int arr[F(__is_sealed(PotentiallyFinal<float>))]; }
	{ int arr[F(__is_sealed(PotentiallySealed<float>))]; }
}

typedef HasVirt Polymorph;
struct InheritPolymorph : Polymorph {};

void is_polymorphic()
{
  { int arr[T(__is_polymorphic(Polymorph))]; }
  { int arr[T(__is_polymorphic(InheritPolymorph))]; }

  { int arr[F(__is_polymorphic(int))]; }
  { int arr[F(__is_polymorphic(Union))]; }
  { int arr[F(__is_polymorphic(IncompleteUnion))]; }
  { int arr[F(__is_polymorphic(Int))]; }
  { int arr[F(__is_polymorphic(IntAr))]; }
  { int arr[F(__is_polymorphic(UnionAr))]; }
  { int arr[F(__is_polymorphic(Derives))]; }
  { int arr[F(__is_polymorphic(ClassType))]; }
  { int arr[F(__is_polymorphic(Enum))]; }
  { int arr[F(__is_polymorphic(cvoid))]; }
  { int arr[F(__is_polymorphic(IntArNB))]; }
}

void is_integral()
{
  int t01[T(__is_integral(bool))];
  int t02[T(__is_integral(char))];
  int t03[T(__is_integral(signed char))];
  int t04[T(__is_integral(unsigned char))];
  //int t05[T(__is_integral(char16_t))];
  //int t06[T(__is_integral(char32_t))];
  int t07[T(__is_integral(wchar_t))];
  int t08[T(__is_integral(short))];
  int t09[T(__is_integral(unsigned short))];
  int t10[T(__is_integral(int))];
  int t11[T(__is_integral(unsigned int))];
  int t12[T(__is_integral(long))];
  int t13[T(__is_integral(unsigned long))];

  int t21[F(__is_integral(float))];
  int t22[F(__is_integral(double))];
  int t23[F(__is_integral(long double))];
  int t24[F(__is_integral(Union))];
  int t25[F(__is_integral(UnionAr))];
  int t26[F(__is_integral(Derives))];
  int t27[F(__is_integral(ClassType))];
  int t28[F(__is_integral(Enum))];
  int t29[F(__is_integral(void))];
  int t30[F(__is_integral(cvoid))];
  int t31[F(__is_integral(IntArNB))];
}

void is_floating_point()
{
  int t01[T(__is_floating_point(float))];
  int t02[T(__is_floating_point(double))];
  int t03[T(__is_floating_point(long double))];

  int t11[F(__is_floating_point(bool))];
  int t12[F(__is_floating_point(char))];
  int t13[F(__is_floating_point(signed char))];
  int t14[F(__is_floating_point(unsigned char))];
  //int t15[F(__is_floating_point(char16_t))];
  //int t16[F(__is_floating_point(char32_t))];
  int t17[F(__is_floating_point(wchar_t))];
  int t18[F(__is_floating_point(short))];
  int t19[F(__is_floating_point(unsigned short))];
  int t20[F(__is_floating_point(int))];
  int t21[F(__is_floating_point(unsigned int))];
  int t22[F(__is_floating_point(long))];
  int t23[F(__is_floating_point(unsigned long))];
  int t24[F(__is_floating_point(Union))];
  int t25[F(__is_floating_point(UnionAr))];
  int t26[F(__is_floating_point(Derives))];
  int t27[F(__is_floating_point(ClassType))];
  int t28[F(__is_floating_point(Enum))];
  int t29[F(__is_floating_point(void))];
  int t30[F(__is_floating_point(cvoid))];
  int t31[F(__is_floating_point(IntArNB))];
}

void is_arithmetic()
{
  int t01[T(__is_arithmetic(float))];
  int t02[T(__is_arithmetic(double))];
  int t03[T(__is_arithmetic(long double))];
  int t11[T(__is_arithmetic(bool))];
  int t12[T(__is_arithmetic(char))];
  int t13[T(__is_arithmetic(signed char))];
  int t14[T(__is_arithmetic(unsigned char))];
  //int t15[T(__is_arithmetic(char16_t))];
  //int t16[T(__is_arithmetic(char32_t))];
  int t17[T(__is_arithmetic(wchar_t))];
  int t18[T(__is_arithmetic(short))];
  int t19[T(__is_arithmetic(unsigned short))];
  int t20[T(__is_arithmetic(int))];
  int t21[T(__is_arithmetic(unsigned int))];
  int t22[T(__is_arithmetic(long))];
  int t23[T(__is_arithmetic(unsigned long))];

  int t24[F(__is_arithmetic(Union))];
  int t25[F(__is_arithmetic(UnionAr))];
  int t26[F(__is_arithmetic(Derives))];
  int t27[F(__is_arithmetic(ClassType))];
  int t28[F(__is_arithmetic(Enum))];
  int t29[F(__is_arithmetic(void))];
  int t30[F(__is_arithmetic(cvoid))];
  int t31[F(__is_arithmetic(IntArNB))];
}

struct ACompleteType {};
struct AnIncompleteType;

void is_complete_type()
{
  int t01[T(__is_complete_type(float))];
  int t02[T(__is_complete_type(double))];
  int t03[T(__is_complete_type(long double))];
  int t11[T(__is_complete_type(bool))];
  int t12[T(__is_complete_type(char))];
  int t13[T(__is_complete_type(signed char))];
  int t14[T(__is_complete_type(unsigned char))];
  //int t15[T(__is_complete_type(char16_t))];
  //int t16[T(__is_complete_type(char32_t))];
  int t17[T(__is_complete_type(wchar_t))];
  int t18[T(__is_complete_type(short))];
  int t19[T(__is_complete_type(unsigned short))];
  int t20[T(__is_complete_type(int))];
  int t21[T(__is_complete_type(unsigned int))];
  int t22[T(__is_complete_type(long))];
  int t23[T(__is_complete_type(unsigned long))];
  int t24[T(__is_complete_type(ACompleteType))];

  int t30[F(__is_complete_type(AnIncompleteType))];
}

void is_void()
{
  int t01[T(__is_void(void))];
  int t02[T(__is_void(cvoid))];

  int t10[F(__is_void(float))];
  int t11[F(__is_void(double))];
  int t12[F(__is_void(long double))];
  int t13[F(__is_void(bool))];
  int t14[F(__is_void(char))];
  int t15[F(__is_void(signed char))];
  int t16[F(__is_void(unsigned char))];
  int t17[F(__is_void(wchar_t))];
  int t18[F(__is_void(short))];
  int t19[F(__is_void(unsigned short))];
  int t20[F(__is_void(int))];
  int t21[F(__is_void(unsigned int))];
  int t22[F(__is_void(long))];
  int t23[F(__is_void(unsigned long))];
  int t24[F(__is_void(Union))];
  int t25[F(__is_void(UnionAr))];
  int t26[F(__is_void(Derives))];
  int t27[F(__is_void(ClassType))];
  int t28[F(__is_void(Enum))];
  int t29[F(__is_void(IntArNB))];
  int t30[F(__is_void(void*))];
  int t31[F(__is_void(cvoid*))];
}

void is_array()
{
  int t01[T(__is_array(IntAr))];
  int t02[T(__is_array(IntArNB))];
  int t03[T(__is_array(UnionAr))];

  int t10[F(__is_array(void))];
  int t11[F(__is_array(cvoid))];
  int t12[F(__is_array(float))];
  int t13[F(__is_array(double))];
  int t14[F(__is_array(long double))];
  int t15[F(__is_array(bool))];
  int t16[F(__is_array(char))];
  int t17[F(__is_array(signed char))];
  int t18[F(__is_array(unsigned char))];
  int t19[F(__is_array(wchar_t))];
  int t20[F(__is_array(short))];
  int t21[F(__is_array(unsigned short))];
  int t22[F(__is_array(int))];
  int t23[F(__is_array(unsigned int))];
  int t24[F(__is_array(long))];
  int t25[F(__is_array(unsigned long))];
  int t26[F(__is_array(Union))];
  int t27[F(__is_array(Derives))];
  int t28[F(__is_array(ClassType))];
  int t29[F(__is_array(Enum))];
  int t30[F(__is_array(void*))];
  int t31[F(__is_array(cvoid*))];
}

template <typename T> void tmpl_func(T&) {}

template <typename T> struct type_wrapper {
  typedef T type;
  typedef T* ptrtype;
  typedef T& reftype;
};

void is_function()
{
  int t01[T(__is_function(type_wrapper<void(void)>::type))];
  int t02[T(__is_function(typeof(tmpl_func<int>)))];

  typedef void (*ptr_to_func_type)(void);

  int t10[F(__is_function(void))];
  int t11[F(__is_function(cvoid))];
  int t12[F(__is_function(float))];
  int t13[F(__is_function(double))];
  int t14[F(__is_function(long double))];
  int t15[F(__is_function(bool))];
  int t16[F(__is_function(char))];
  int t17[F(__is_function(signed char))];
  int t18[F(__is_function(unsigned char))];
  int t19[F(__is_function(wchar_t))];
  int t20[F(__is_function(short))];
  int t21[F(__is_function(unsigned short))];
  int t22[F(__is_function(int))];
  int t23[F(__is_function(unsigned int))];
  int t24[F(__is_function(long))];
  int t25[F(__is_function(unsigned long))];
  int t26[F(__is_function(Union))];
  int t27[F(__is_function(Derives))];
  int t28[F(__is_function(ClassType))];
  int t29[F(__is_function(Enum))];
  int t30[F(__is_function(void*))];
  int t31[F(__is_function(cvoid*))];
  int t32[F(__is_function(void(*)()))];
  int t33[F(__is_function(ptr_to_func_type))];
  int t34[F(__is_function(type_wrapper<void(void)>::ptrtype))];
  int t35[F(__is_function(type_wrapper<void(void)>::reftype))];
}

void is_reference()
{
  int t01[T(__is_reference(int&))];
  int t02[T(__is_reference(const int&))];
  int t03[T(__is_reference(void *&))];

  int t10[F(__is_reference(int))];
  int t11[F(__is_reference(const int))];
  int t12[F(__is_reference(void *))];
}

void is_lvalue_reference()
{
  int t01[T(__is_lvalue_reference(int&))];
  int t02[T(__is_lvalue_reference(void *&))];
  int t03[T(__is_lvalue_reference(const int&))];
  int t04[T(__is_lvalue_reference(void * const &))];

  int t10[F(__is_lvalue_reference(int))];
  int t11[F(__is_lvalue_reference(const int))];
  int t12[F(__is_lvalue_reference(void *))];
}

#if __has_feature(cxx_rvalue_references)

void is_rvalue_reference()
{
  int t01[T(__is_rvalue_reference(const int&&))];
  int t02[T(__is_rvalue_reference(void * const &&))];

  int t10[F(__is_rvalue_reference(int&))];
  int t11[F(__is_rvalue_reference(void *&))];
  int t12[F(__is_rvalue_reference(const int&))];
  int t13[F(__is_rvalue_reference(void * const &))];
  int t14[F(__is_rvalue_reference(int))];
  int t15[F(__is_rvalue_reference(const int))];
  int t16[F(__is_rvalue_reference(void *))];
}

#endif

void is_fundamental()
{
  int t01[T(__is_fundamental(float))];
  int t02[T(__is_fundamental(double))];
  int t03[T(__is_fundamental(long double))];
  int t11[T(__is_fundamental(bool))];
  int t12[T(__is_fundamental(char))];
  int t13[T(__is_fundamental(signed char))];
  int t14[T(__is_fundamental(unsigned char))];
  //int t15[T(__is_fundamental(char16_t))];
  //int t16[T(__is_fundamental(char32_t))];
  int t17[T(__is_fundamental(wchar_t))];
  int t18[T(__is_fundamental(short))];
  int t19[T(__is_fundamental(unsigned short))];
  int t20[T(__is_fundamental(int))];
  int t21[T(__is_fundamental(unsigned int))];
  int t22[T(__is_fundamental(long))];
  int t23[T(__is_fundamental(unsigned long))];
  int t24[T(__is_fundamental(void))];
  int t25[T(__is_fundamental(cvoid))];

  int t30[F(__is_fundamental(Union))];
  int t31[F(__is_fundamental(UnionAr))];
  int t32[F(__is_fundamental(Derives))];
  int t33[F(__is_fundamental(ClassType))];
  int t34[F(__is_fundamental(Enum))];
  int t35[F(__is_fundamental(IntArNB))];
}

void is_object()
{
  int t01[T(__is_object(int))];
  int t02[T(__is_object(int *))];
  int t03[T(__is_object(void *))];
  int t04[T(__is_object(Union))];
  int t05[T(__is_object(UnionAr))];
  int t06[T(__is_object(ClassType))];
  int t07[T(__is_object(Enum))];

  int t10[F(__is_object(type_wrapper<void(void)>::type))];
  int t11[F(__is_object(int&))];
  int t12[F(__is_object(void))];
}

void is_scalar()
{
  int t01[T(__is_scalar(float))];
  int t02[T(__is_scalar(double))];
  int t03[T(__is_scalar(long double))];
  int t04[T(__is_scalar(bool))];
  int t05[T(__is_scalar(char))];
  int t06[T(__is_scalar(signed char))];
  int t07[T(__is_scalar(unsigned char))];
  int t08[T(__is_scalar(wchar_t))];
  int t09[T(__is_scalar(short))];
  int t10[T(__is_scalar(unsigned short))];
  int t11[T(__is_scalar(int))];
  int t12[T(__is_scalar(unsigned int))];
  int t13[T(__is_scalar(long))];
  int t14[T(__is_scalar(unsigned long))];
  int t15[T(__is_scalar(Enum))];
  int t16[T(__is_scalar(void*))];
  int t17[T(__is_scalar(cvoid*))];

  int t20[F(__is_scalar(void))];
  int t21[F(__is_scalar(cvoid))];
  int t22[F(__is_scalar(Union))];
  int t23[F(__is_scalar(UnionAr))];
  int t24[F(__is_scalar(Derives))];
  int t25[F(__is_scalar(ClassType))];
  int t26[F(__is_scalar(IntArNB))];
}

struct StructWithMembers {
  int member;
  void method() {}
};

void is_compound()
{
  int t01[T(__is_compound(void*))];
  int t02[T(__is_compound(cvoid*))];
  int t03[T(__is_compound(void (*)()))];
  int t04[T(__is_compound(int StructWithMembers::*))];
  int t05[T(__is_compound(void (StructWithMembers::*)()))];
  int t06[T(__is_compound(int&))];
  int t07[T(__is_compound(Union))];
  int t08[T(__is_compound(UnionAr))];
  int t09[T(__is_compound(Derives))];
  int t10[T(__is_compound(ClassType))];
  int t11[T(__is_compound(IntArNB))];
  int t12[T(__is_compound(Enum))];

  int t20[F(__is_compound(float))];
  int t21[F(__is_compound(double))];
  int t22[F(__is_compound(long double))];
  int t23[F(__is_compound(bool))];
  int t24[F(__is_compound(char))];
  int t25[F(__is_compound(signed char))];
  int t26[F(__is_compound(unsigned char))];
  int t27[F(__is_compound(wchar_t))];
  int t28[F(__is_compound(short))];
  int t29[F(__is_compound(unsigned short))];
  int t30[F(__is_compound(int))];
  int t31[F(__is_compound(unsigned int))];
  int t32[F(__is_compound(long))];
  int t33[F(__is_compound(unsigned long))];
  int t34[F(__is_compound(void))];
  int t35[F(__is_compound(cvoid))];
}

void is_pointer()
{
  StructWithMembers x;

  int t01[T(__is_pointer(void*))];
  int t02[T(__is_pointer(cvoid*))];
  int t03[T(__is_pointer(cvoid*))];
  int t04[T(__is_pointer(char*))];
  int t05[T(__is_pointer(int*))];
  int t06[T(__is_pointer(int**))];
  int t07[T(__is_pointer(ClassType*))];
  int t08[T(__is_pointer(Derives*))];
  int t09[T(__is_pointer(Enum*))];
  int t10[T(__is_pointer(IntArNB*))];
  int t11[T(__is_pointer(Union*))];
  int t12[T(__is_pointer(UnionAr*))];
  int t13[T(__is_pointer(StructWithMembers*))];
  int t14[T(__is_pointer(void (*)()))];

  int t20[F(__is_pointer(void))];
  int t21[F(__is_pointer(cvoid))];
  int t22[F(__is_pointer(cvoid))];
  int t23[F(__is_pointer(char))];
  int t24[F(__is_pointer(int))];
  int t25[F(__is_pointer(int))];
  int t26[F(__is_pointer(ClassType))];
  int t27[F(__is_pointer(Derives))];
  int t28[F(__is_pointer(Enum))];
  int t29[F(__is_pointer(IntArNB))];
  int t30[F(__is_pointer(Union))];
  int t31[F(__is_pointer(UnionAr))];
  int t32[F(__is_pointer(StructWithMembers))];
  int t33[F(__is_pointer(int StructWithMembers::*))];
  int t34[F(__is_pointer(void (StructWithMembers::*) ()))];
}

void is_member_object_pointer()
{
  StructWithMembers x;

  int t01[T(__is_member_object_pointer(int StructWithMembers::*))];

  int t10[F(__is_member_object_pointer(void (StructWithMembers::*) ()))];
  int t11[F(__is_member_object_pointer(void*))];
  int t12[F(__is_member_object_pointer(cvoid*))];
  int t13[F(__is_member_object_pointer(cvoid*))];
  int t14[F(__is_member_object_pointer(char*))];
  int t15[F(__is_member_object_pointer(int*))];
  int t16[F(__is_member_object_pointer(int**))];
  int t17[F(__is_member_object_pointer(ClassType*))];
  int t18[F(__is_member_object_pointer(Derives*))];
  int t19[F(__is_member_object_pointer(Enum*))];
  int t20[F(__is_member_object_pointer(IntArNB*))];
  int t21[F(__is_member_object_pointer(Union*))];
  int t22[F(__is_member_object_pointer(UnionAr*))];
  int t23[F(__is_member_object_pointer(StructWithMembers*))];
  int t24[F(__is_member_object_pointer(void))];
  int t25[F(__is_member_object_pointer(cvoid))];
  int t26[F(__is_member_object_pointer(cvoid))];
  int t27[F(__is_member_object_pointer(char))];
  int t28[F(__is_member_object_pointer(int))];
  int t29[F(__is_member_object_pointer(int))];
  int t30[F(__is_member_object_pointer(ClassType))];
  int t31[F(__is_member_object_pointer(Derives))];
  int t32[F(__is_member_object_pointer(Enum))];
  int t33[F(__is_member_object_pointer(IntArNB))];
  int t34[F(__is_member_object_pointer(Union))];
  int t35[F(__is_member_object_pointer(UnionAr))];
  int t36[F(__is_member_object_pointer(StructWithMembers))];
  int t37[F(__is_member_object_pointer(void (*)()))];
}

void is_member_function_pointer()
{
  StructWithMembers x;

  int t01[T(__is_member_function_pointer(void (StructWithMembers::*) ()))];

  int t10[F(__is_member_function_pointer(int StructWithMembers::*))];
  int t11[F(__is_member_function_pointer(void*))];
  int t12[F(__is_member_function_pointer(cvoid*))];
  int t13[F(__is_member_function_pointer(cvoid*))];
  int t14[F(__is_member_function_pointer(char*))];
  int t15[F(__is_member_function_pointer(int*))];
  int t16[F(__is_member_function_pointer(int**))];
  int t17[F(__is_member_function_pointer(ClassType*))];
  int t18[F(__is_member_function_pointer(Derives*))];
  int t19[F(__is_member_function_pointer(Enum*))];
  int t20[F(__is_member_function_pointer(IntArNB*))];
  int t21[F(__is_member_function_pointer(Union*))];
  int t22[F(__is_member_function_pointer(UnionAr*))];
  int t23[F(__is_member_function_pointer(StructWithMembers*))];
  int t24[F(__is_member_function_pointer(void))];
  int t25[F(__is_member_function_pointer(cvoid))];
  int t26[F(__is_member_function_pointer(cvoid))];
  int t27[F(__is_member_function_pointer(char))];
  int t28[F(__is_member_function_pointer(int))];
  int t29[F(__is_member_function_pointer(int))];
  int t30[F(__is_member_function_pointer(ClassType))];
  int t31[F(__is_member_function_pointer(Derives))];
  int t32[F(__is_member_function_pointer(Enum))];
  int t33[F(__is_member_function_pointer(IntArNB))];
  int t34[F(__is_member_function_pointer(Union))];
  int t35[F(__is_member_function_pointer(UnionAr))];
  int t36[F(__is_member_function_pointer(StructWithMembers))];
  int t37[F(__is_member_function_pointer(void (*)()))];
}

void is_member_pointer()
{
  StructWithMembers x;

  int t01[T(__is_member_pointer(int StructWithMembers::*))];
  int t02[T(__is_member_pointer(void (StructWithMembers::*) ()))];

  int t10[F(__is_member_pointer(void*))];
  int t11[F(__is_member_pointer(cvoid*))];
  int t12[F(__is_member_pointer(cvoid*))];
  int t13[F(__is_member_pointer(char*))];
  int t14[F(__is_member_pointer(int*))];
  int t15[F(__is_member_pointer(int**))];
  int t16[F(__is_member_pointer(ClassType*))];
  int t17[F(__is_member_pointer(Derives*))];
  int t18[F(__is_member_pointer(Enum*))];
  int t19[F(__is_member_pointer(IntArNB*))];
  int t20[F(__is_member_pointer(Union*))];
  int t21[F(__is_member_pointer(UnionAr*))];
  int t22[F(__is_member_pointer(StructWithMembers*))];
  int t23[F(__is_member_pointer(void))];
  int t24[F(__is_member_pointer(cvoid))];
  int t25[F(__is_member_pointer(cvoid))];
  int t26[F(__is_member_pointer(char))];
  int t27[F(__is_member_pointer(int))];
  int t28[F(__is_member_pointer(int))];
  int t29[F(__is_member_pointer(ClassType))];
  int t30[F(__is_member_pointer(Derives))];
  int t31[F(__is_member_pointer(Enum))];
  int t32[F(__is_member_pointer(IntArNB))];
  int t33[F(__is_member_pointer(Union))];
  int t34[F(__is_member_pointer(UnionAr))];
  int t35[F(__is_member_pointer(StructWithMembers))];
  int t36[F(__is_member_pointer(void (*)()))];
}

void is_const()
{
  int t01[T(__is_const(cvoid))];
  int t02[T(__is_const(const char))];
  int t03[T(__is_const(const int))];
  int t04[T(__is_const(const long))];
  int t05[T(__is_const(const short))];
  int t06[T(__is_const(const signed char))];
  int t07[T(__is_const(const wchar_t))];
  int t08[T(__is_const(const bool))];
  int t09[T(__is_const(const float))];
  int t10[T(__is_const(const double))];
  int t11[T(__is_const(const long double))];
  int t12[T(__is_const(const unsigned char))];
  int t13[T(__is_const(const unsigned int))];
  int t14[T(__is_const(const unsigned long long))];
  int t15[T(__is_const(const unsigned long))];
  int t16[T(__is_const(const unsigned short))];
  int t17[T(__is_const(const void))];
  int t18[T(__is_const(const ClassType))];
  int t19[T(__is_const(const Derives))];
  int t20[T(__is_const(const Enum))];
  int t21[T(__is_const(const IntArNB))];
  int t22[T(__is_const(const Union))];
  int t23[T(__is_const(const UnionAr))];

  int t30[F(__is_const(char))];
  int t31[F(__is_const(int))];
  int t32[F(__is_const(long))];
  int t33[F(__is_const(short))];
  int t34[F(__is_const(signed char))];
  int t35[F(__is_const(wchar_t))];
  int t36[F(__is_const(bool))];
  int t37[F(__is_const(float))];
  int t38[F(__is_const(double))];
  int t39[F(__is_const(long double))];
  int t40[F(__is_const(unsigned char))];
  int t41[F(__is_const(unsigned int))];
  int t42[F(__is_const(unsigned long long))];
  int t43[F(__is_const(unsigned long))];
  int t44[F(__is_const(unsigned short))];
  int t45[F(__is_const(void))];
  int t46[F(__is_const(ClassType))];
  int t47[F(__is_const(Derives))];
  int t48[F(__is_const(Enum))];
  int t49[F(__is_const(IntArNB))];
  int t50[F(__is_const(Union))];
  int t51[F(__is_const(UnionAr))];
}

void is_volatile()
{
  int t02[T(__is_volatile(volatile char))];
  int t03[T(__is_volatile(volatile int))];
  int t04[T(__is_volatile(volatile long))];
  int t05[T(__is_volatile(volatile short))];
  int t06[T(__is_volatile(volatile signed char))];
  int t07[T(__is_volatile(volatile wchar_t))];
  int t08[T(__is_volatile(volatile bool))];
  int t09[T(__is_volatile(volatile float))];
  int t10[T(__is_volatile(volatile double))];
  int t11[T(__is_volatile(volatile long double))];
  int t12[T(__is_volatile(volatile unsigned char))];
  int t13[T(__is_volatile(volatile unsigned int))];
  int t14[T(__is_volatile(volatile unsigned long long))];
  int t15[T(__is_volatile(volatile unsigned long))];
  int t16[T(__is_volatile(volatile unsigned short))];
  int t17[T(__is_volatile(volatile void))];
  int t18[T(__is_volatile(volatile ClassType))];
  int t19[T(__is_volatile(volatile Derives))];
  int t20[T(__is_volatile(volatile Enum))];
  int t21[T(__is_volatile(volatile IntArNB))];
  int t22[T(__is_volatile(volatile Union))];
  int t23[T(__is_volatile(volatile UnionAr))];

  int t30[F(__is_volatile(char))];
  int t31[F(__is_volatile(int))];
  int t32[F(__is_volatile(long))];
  int t33[F(__is_volatile(short))];
  int t34[F(__is_volatile(signed char))];
  int t35[F(__is_volatile(wchar_t))];
  int t36[F(__is_volatile(bool))];
  int t37[F(__is_volatile(float))];
  int t38[F(__is_volatile(double))];
  int t39[F(__is_volatile(long double))];
  int t40[F(__is_volatile(unsigned char))];
  int t41[F(__is_volatile(unsigned int))];
  int t42[F(__is_volatile(unsigned long long))];
  int t43[F(__is_volatile(unsigned long))];
  int t44[F(__is_volatile(unsigned short))];
  int t45[F(__is_volatile(void))];
  int t46[F(__is_volatile(ClassType))];
  int t47[F(__is_volatile(Derives))];
  int t48[F(__is_volatile(Enum))];
  int t49[F(__is_volatile(IntArNB))];
  int t50[F(__is_volatile(Union))];
  int t51[F(__is_volatile(UnionAr))];
}

struct TrivialStruct {
  int member;
};

struct NonTrivialStruct {
  int member;
  NonTrivialStruct() {
    member = 0;
  }
};

struct SuperNonTrivialStruct {
  SuperNonTrivialStruct() { }
  ~SuperNonTrivialStruct() { }
};

struct NonTCStruct {
  NonTCStruct(const NonTCStruct&) {}
};

struct AllDefaulted {
  AllDefaulted() = default;
  AllDefaulted(const AllDefaulted &) = default;
  AllDefaulted(AllDefaulted &&) = default;
  AllDefaulted &operator=(const AllDefaulted &) = default;
  AllDefaulted &operator=(AllDefaulted &&) = default;
  ~AllDefaulted() = default;
};

struct NoDefaultMoveAssignDueToUDCopyCtor {
  NoDefaultMoveAssignDueToUDCopyCtor(const NoDefaultMoveAssignDueToUDCopyCtor&);
};

struct NoDefaultMoveAssignDueToUDCopyAssign {
  NoDefaultMoveAssignDueToUDCopyAssign& operator=(
    const NoDefaultMoveAssignDueToUDCopyAssign&);
};

struct NoDefaultMoveAssignDueToDtor {
  ~NoDefaultMoveAssignDueToDtor();
};

struct AllDeleted {
  AllDeleted() = delete;
  AllDeleted(const AllDeleted &) = delete;
  AllDeleted(AllDeleted &&) = delete;
  AllDeleted &operator=(const AllDeleted &) = delete;
  AllDeleted &operator=(AllDeleted &&) = delete;
  ~AllDeleted() = delete;
};

struct ExtDefaulted {
  ExtDefaulted();
  ExtDefaulted(const ExtDefaulted &);
  ExtDefaulted(ExtDefaulted &&);
  ExtDefaulted &operator=(const ExtDefaulted &);
  ExtDefaulted &operator=(ExtDefaulted &&);
  ~ExtDefaulted();
};

// Despite being defaulted, these functions are not trivial.
ExtDefaulted::ExtDefaulted() = default;
ExtDefaulted::ExtDefaulted(const ExtDefaulted &) = default;
ExtDefaulted::ExtDefaulted(ExtDefaulted &&) = default;
ExtDefaulted &ExtDefaulted::operator=(const ExtDefaulted &) = default;
ExtDefaulted &ExtDefaulted::operator=(ExtDefaulted &&) = default;
ExtDefaulted::~ExtDefaulted() = default;

void is_trivial2()
{
  int t01[T(__is_trivial(char))];
  int t02[T(__is_trivial(int))];
  int t03[T(__is_trivial(long))];
  int t04[T(__is_trivial(short))];
  int t05[T(__is_trivial(signed char))];
  int t06[T(__is_trivial(wchar_t))];
  int t07[T(__is_trivial(bool))];
  int t08[T(__is_trivial(float))];
  int t09[T(__is_trivial(double))];
  int t10[T(__is_trivial(long double))];
  int t11[T(__is_trivial(unsigned char))];
  int t12[T(__is_trivial(unsigned int))];
  int t13[T(__is_trivial(unsigned long long))];
  int t14[T(__is_trivial(unsigned long))];
  int t15[T(__is_trivial(unsigned short))];
  int t16[T(__is_trivial(ClassType))];
  int t17[T(__is_trivial(Derives))];
  int t18[T(__is_trivial(Enum))];
  int t19[T(__is_trivial(IntAr))];
  int t20[T(__is_trivial(Union))];
  int t21[T(__is_trivial(UnionAr))];
  int t22[T(__is_trivial(TrivialStruct))];
  int t23[T(__is_trivial(AllDefaulted))];
  int t24[T(__is_trivial(AllDeleted))];

  int t30[F(__is_trivial(void))];
  int t31[F(__is_trivial(NonTrivialStruct))];
  int t32[F(__is_trivial(SuperNonTrivialStruct))];
  int t33[F(__is_trivial(NonTCStruct))];
  int t34[F(__is_trivial(ExtDefaulted))];
}

void is_trivially_copyable2()
{
  int t01[T(__is_trivially_copyable(char))];
  int t02[T(__is_trivially_copyable(int))];
  int t03[T(__is_trivially_copyable(long))];
  int t04[T(__is_trivially_copyable(short))];
  int t05[T(__is_trivially_copyable(signed char))];
  int t06[T(__is_trivially_copyable(wchar_t))];
  int t07[T(__is_trivially_copyable(bool))];
  int t08[T(__is_trivially_copyable(float))];
  int t09[T(__is_trivially_copyable(double))];
  int t10[T(__is_trivially_copyable(long double))];
  int t11[T(__is_trivially_copyable(unsigned char))];
  int t12[T(__is_trivially_copyable(unsigned int))];
  int t13[T(__is_trivially_copyable(unsigned long long))];
  int t14[T(__is_trivially_copyable(unsigned long))];
  int t15[T(__is_trivially_copyable(unsigned short))];
  int t16[T(__is_trivially_copyable(ClassType))];
  int t17[T(__is_trivially_copyable(Derives))];
  int t18[T(__is_trivially_copyable(Enum))];
  int t19[T(__is_trivially_copyable(IntAr))];
  int t20[T(__is_trivially_copyable(Union))];
  int t21[T(__is_trivially_copyable(UnionAr))];
  int t22[T(__is_trivially_copyable(TrivialStruct))];
  int t23[T(__is_trivially_copyable(NonTrivialStruct))];
  int t24[T(__is_trivially_copyable(AllDefaulted))];
  int t25[T(__is_trivially_copyable(AllDeleted))];

  int t30[F(__is_trivially_copyable(void))];
  int t31[F(__is_trivially_copyable(SuperNonTrivialStruct))];
  int t32[F(__is_trivially_copyable(NonTCStruct))];
  int t33[F(__is_trivially_copyable(ExtDefaulted))];

  int t34[T(__is_trivially_copyable(const int))];
  int t35[F(__is_trivially_copyable(volatile int))];
}

struct CStruct {
  int one;
  int two;
};

struct CEmptyStruct {};

struct CppEmptyStruct : CStruct {};
struct CppStructStandard : CEmptyStruct {
  int three;
  int four;
};
struct CppStructNonStandardByBase : CStruct {
  int three;
  int four;
};
struct CppStructNonStandardByVirt : CStruct {
  virtual void method() {}
};
struct CppStructNonStandardByMemb : CStruct {
  CppStructNonStandardByVirt member;
};
struct CppStructNonStandardByProt : CStruct {
  int five;
protected:
  int six;
};
struct CppStructNonStandardByVirtBase : virtual CStruct {
};
struct CppStructNonStandardBySameBase : CEmptyStruct {
  CEmptyStruct member;
};
struct CppStructNonStandardBy2ndVirtBase : CEmptyStruct {
  CEmptyStruct member;
};

void is_standard_layout()
{
  typedef const int ConstInt;
  typedef ConstInt ConstIntAr[4];
  typedef CppStructStandard CppStructStandardAr[4];

  int t01[T(__is_standard_layout(int))];
  int t02[T(__is_standard_layout(ConstInt))];
  int t03[T(__is_standard_layout(ConstIntAr))];
  int t04[T(__is_standard_layout(CStruct))];
  int t05[T(__is_standard_layout(CppStructStandard))];
  int t06[T(__is_standard_layout(CppStructStandardAr))];
  int t07[T(__is_standard_layout(Vector))];
  int t08[T(__is_standard_layout(VectorExt))];

  typedef CppStructNonStandardByBase CppStructNonStandardByBaseAr[4];

  int t10[F(__is_standard_layout(CppStructNonStandardByVirt))];
  int t11[F(__is_standard_layout(CppStructNonStandardByMemb))];
  int t12[F(__is_standard_layout(CppStructNonStandardByProt))];
  int t13[F(__is_standard_layout(CppStructNonStandardByVirtBase))];
  int t14[F(__is_standard_layout(CppStructNonStandardByBase))];
  int t15[F(__is_standard_layout(CppStructNonStandardByBaseAr))];
  int t16[F(__is_standard_layout(CppStructNonStandardBySameBase))];
  int t17[F(__is_standard_layout(CppStructNonStandardBy2ndVirtBase))];
}

void is_signed()
{
  //int t01[T(__is_signed(char))];
  int t02[T(__is_signed(int))];
  int t03[T(__is_signed(long))];
  int t04[T(__is_signed(short))];
  int t05[T(__is_signed(signed char))];
  int t06[T(__is_signed(wchar_t))];

  int t10[F(__is_signed(bool))];
  int t11[F(__is_signed(cvoid))];
  int t12[F(__is_signed(float))];
  int t13[F(__is_signed(double))];
  int t14[F(__is_signed(long double))];
  int t15[F(__is_signed(unsigned char))];
  int t16[F(__is_signed(unsigned int))];
  int t17[F(__is_signed(unsigned long long))];
  int t18[F(__is_signed(unsigned long))];
  int t19[F(__is_signed(unsigned short))];
  int t20[F(__is_signed(void))];
  int t21[F(__is_signed(ClassType))];
  int t22[F(__is_signed(Derives))];
  int t23[F(__is_signed(Enum))];
  int t24[F(__is_signed(IntArNB))];
  int t25[F(__is_signed(Union))];
  int t26[F(__is_signed(UnionAr))];
}

void is_unsigned()
{
  int t01[T(__is_unsigned(bool))];
  int t02[T(__is_unsigned(unsigned char))];
  int t03[T(__is_unsigned(unsigned short))];
  int t04[T(__is_unsigned(unsigned int))];
  int t05[T(__is_unsigned(unsigned long))];
  int t06[T(__is_unsigned(unsigned long long))];
  int t07[T(__is_unsigned(Enum))];

  int t10[F(__is_unsigned(void))];
  int t11[F(__is_unsigned(cvoid))];
  int t12[F(__is_unsigned(float))];
  int t13[F(__is_unsigned(double))];
  int t14[F(__is_unsigned(long double))];
  int t16[F(__is_unsigned(char))];
  int t17[F(__is_unsigned(signed char))];
  int t18[F(__is_unsigned(wchar_t))];
  int t19[F(__is_unsigned(short))];
  int t20[F(__is_unsigned(int))];
  int t21[F(__is_unsigned(long))];
  int t22[F(__is_unsigned(Union))];
  int t23[F(__is_unsigned(UnionAr))];
  int t24[F(__is_unsigned(Derives))];
  int t25[F(__is_unsigned(ClassType))];
  int t26[F(__is_unsigned(IntArNB))];
}

typedef Int& IntRef;
typedef const IntAr ConstIntAr;
typedef ConstIntAr ConstIntArAr[4];

struct HasCopy {
  HasCopy(HasCopy& cp);
};

struct HasMove {
  HasMove(HasMove&& cp);
};

struct HasTemplateCons {
  HasVirt Annoying;

  template <typename T>
  HasTemplateCons(const T&);
};

void has_trivial_default_constructor() {
  { int arr[T(__has_trivial_constructor(Int))]; }
  { int arr[T(__has_trivial_constructor(IntAr))]; }
  { int arr[T(__has_trivial_constructor(Union))]; }
  { int arr[T(__has_trivial_constructor(UnionAr))]; }
  { int arr[T(__has_trivial_constructor(POD))]; }
  { int arr[T(__has_trivial_constructor(Derives))]; }
  { int arr[T(__has_trivial_constructor(DerivesAr))]; }
  { int arr[T(__has_trivial_constructor(ConstIntAr))]; }
  { int arr[T(__has_trivial_constructor(ConstIntArAr))]; }
  { int arr[T(__has_trivial_constructor(HasDest))]; }
  { int arr[T(__has_trivial_constructor(HasPriv))]; }
  { int arr[T(__has_trivial_constructor(HasCopyAssign))]; }
  { int arr[T(__has_trivial_constructor(HasMoveAssign))]; }
  { int arr[T(__has_trivial_constructor(const Int))]; }
  { int arr[T(__has_trivial_constructor(AllDefaulted))]; }
  { int arr[T(__has_trivial_constructor(AllDeleted))]; }

  { int arr[F(__has_trivial_constructor(HasCons))]; }
  { int arr[F(__has_trivial_constructor(HasRef))]; }
  { int arr[F(__has_trivial_constructor(HasCopy))]; }
  { int arr[F(__has_trivial_constructor(IntRef))]; }
  { int arr[F(__has_trivial_constructor(VirtAr))]; }
  { int arr[F(__has_trivial_constructor(void))]; }
  { int arr[F(__has_trivial_constructor(cvoid))]; }
  { int arr[F(__has_trivial_constructor(HasTemplateCons))]; }
  { int arr[F(__has_trivial_constructor(AllPrivate))]; }
  { int arr[F(__has_trivial_constructor(ExtDefaulted))]; }
}

void has_trivial_move_constructor() {
  // n3376 12.8 [class.copy]/12
  // A copy/move constructor for class X is trivial if it is not
  // user-provided, its declared parameter type is the same as
  // if it had been implicitly declared, and if
  //   - class X has no virtual functions (10.3) and no virtual
  //     base classes (10.1), and
  //   - the constructor selected to copy/move each direct base
  //     class subobject is trivial, and
  //   - for each non-static data member of X that is of class
  //     type (or array thereof), the constructor selected
  //     to copy/move that member is trivial;
  // otherwise the copy/move constructor is non-trivial.
  { int arr[T(__has_trivial_move_constructor(POD))]; }
  { int arr[T(__has_trivial_move_constructor(Union))]; }
  { int arr[T(__has_trivial_move_constructor(HasCons))]; }
  { int arr[T(__has_trivial_move_constructor(HasStaticMemberMoveCtor))]; }
  { int arr[T(__has_trivial_move_constructor(AllDeleted))]; }
  
  { int arr[F(__has_trivial_move_constructor(HasVirt))]; }
  { int arr[F(__has_trivial_move_constructor(DerivesVirt))]; }
  { int arr[F(__has_trivial_move_constructor(HasMoveCtor))]; }
  { int arr[F(__has_trivial_move_constructor(DerivesHasMoveCtor))]; }
  { int arr[F(__has_trivial_move_constructor(HasMemberMoveCtor))]; }
}

void has_trivial_copy_constructor() {
  { int arr[T(__has_trivial_copy(Int))]; }
  { int arr[T(__has_trivial_copy(IntAr))]; }
  { int arr[T(__has_trivial_copy(Union))]; }
  { int arr[T(__has_trivial_copy(UnionAr))]; }
  { int arr[T(__has_trivial_copy(POD))]; }
  { int arr[T(__has_trivial_copy(Derives))]; }
  { int arr[T(__has_trivial_copy(ConstIntAr))]; }
  { int arr[T(__has_trivial_copy(ConstIntArAr))]; }
  { int arr[T(__has_trivial_copy(HasDest))]; }
  { int arr[T(__has_trivial_copy(HasPriv))]; }
  { int arr[T(__has_trivial_copy(HasCons))]; }
  { int arr[T(__has_trivial_copy(HasRef))]; }
  { int arr[T(__has_trivial_copy(HasMove))]; }
  { int arr[T(__has_trivial_copy(IntRef))]; }
  { int arr[T(__has_trivial_copy(HasCopyAssign))]; }
  { int arr[T(__has_trivial_copy(HasMoveAssign))]; }
  { int arr[T(__has_trivial_copy(const Int))]; }
  { int arr[T(__has_trivial_copy(AllDefaulted))]; }
  { int arr[T(__has_trivial_copy(AllDeleted))]; }
  { int arr[T(__has_trivial_copy(DerivesAr))]; }
  { int arr[T(__has_trivial_copy(DerivesHasRef))]; }

  { int arr[F(__has_trivial_copy(HasCopy))]; }
  { int arr[F(__has_trivial_copy(HasTemplateCons))]; }
  { int arr[F(__has_trivial_copy(VirtAr))]; }
  { int arr[F(__has_trivial_copy(void))]; }
  { int arr[F(__has_trivial_copy(cvoid))]; }
  { int arr[F(__has_trivial_copy(AllPrivate))]; }
  { int arr[F(__has_trivial_copy(ExtDefaulted))]; }
}

void has_trivial_copy_assignment() {
  { int arr[T(__has_trivial_assign(Int))]; }
  { int arr[T(__has_trivial_assign(IntAr))]; }
  { int arr[T(__has_trivial_assign(Union))]; }
  { int arr[T(__has_trivial_assign(UnionAr))]; }
  { int arr[T(__has_trivial_assign(POD))]; }
  { int arr[T(__has_trivial_assign(Derives))]; }
  { int arr[T(__has_trivial_assign(HasDest))]; }
  { int arr[T(__has_trivial_assign(HasPriv))]; }
  { int arr[T(__has_trivial_assign(HasCons))]; }
  { int arr[T(__has_trivial_assign(HasRef))]; }
  { int arr[T(__has_trivial_assign(HasCopy))]; }
  { int arr[T(__has_trivial_assign(HasMove))]; }
  { int arr[T(__has_trivial_assign(HasMoveAssign))]; }
  { int arr[T(__has_trivial_assign(AllDefaulted))]; }
  { int arr[T(__has_trivial_assign(AllDeleted))]; }
  { int arr[T(__has_trivial_assign(DerivesAr))]; }
  { int arr[T(__has_trivial_assign(DerivesHasRef))]; }

  { int arr[F(__has_trivial_assign(IntRef))]; }
  { int arr[F(__has_trivial_assign(HasCopyAssign))]; }
  { int arr[F(__has_trivial_assign(const Int))]; }
  { int arr[F(__has_trivial_assign(ConstIntAr))]; }
  { int arr[F(__has_trivial_assign(ConstIntArAr))]; }
  { int arr[F(__has_trivial_assign(VirtAr))]; }
  { int arr[F(__has_trivial_assign(void))]; }
  { int arr[F(__has_trivial_assign(cvoid))]; }
  { int arr[F(__has_trivial_assign(AllPrivate))]; }
  { int arr[F(__has_trivial_assign(ExtDefaulted))]; }
}

void has_trivial_destructor() {
  { int arr[T(__has_trivial_destructor(Int))]; }
  { int arr[T(__has_trivial_destructor(IntAr))]; }
  { int arr[T(__has_trivial_destructor(Union))]; }
  { int arr[T(__has_trivial_destructor(UnionAr))]; }
  { int arr[T(__has_trivial_destructor(POD))]; }
  { int arr[T(__has_trivial_destructor(Derives))]; }
  { int arr[T(__has_trivial_destructor(ConstIntAr))]; }
  { int arr[T(__has_trivial_destructor(ConstIntArAr))]; }
  { int arr[T(__has_trivial_destructor(HasPriv))]; }
  { int arr[T(__has_trivial_destructor(HasCons))]; }
  { int arr[T(__has_trivial_destructor(HasRef))]; }
  { int arr[T(__has_trivial_destructor(HasCopy))]; }
  { int arr[T(__has_trivial_destructor(HasMove))]; }
  { int arr[T(__has_trivial_destructor(IntRef))]; }
  { int arr[T(__has_trivial_destructor(HasCopyAssign))]; }
  { int arr[T(__has_trivial_destructor(HasMoveAssign))]; }
  { int arr[T(__has_trivial_destructor(const Int))]; }
  { int arr[T(__has_trivial_destructor(DerivesAr))]; }
  { int arr[T(__has_trivial_destructor(VirtAr))]; }
  { int arr[T(__has_trivial_destructor(AllDefaulted))]; }
  { int arr[T(__has_trivial_destructor(AllDeleted))]; }
  { int arr[T(__has_trivial_destructor(DerivesHasRef))]; }

  { int arr[F(__has_trivial_destructor(HasDest))]; }
  { int arr[F(__has_trivial_destructor(void))]; }
  { int arr[F(__has_trivial_destructor(cvoid))]; }
  { int arr[F(__has_trivial_destructor(AllPrivate))]; }
  { int arr[F(__has_trivial_destructor(ExtDefaulted))]; }
}

struct A { ~A() {} };
template<typename> struct B : A { };

void f() {
  { int arr[F(__has_trivial_destructor(A))]; }
  { int arr[F(__has_trivial_destructor(B<int>))]; }
}

class PR11110 {
  template <int> int operator=( int );
  int operator=(PR11110);
};

class UsingAssign;

class UsingAssignBase {
protected:
  UsingAssign &operator=(const UsingAssign&) throw();
};

class UsingAssign : public UsingAssignBase {
public:
  using UsingAssignBase::operator=;
};

void has_nothrow_assign() {
  { int arr[T(__has_nothrow_assign(Int))]; }
  { int arr[T(__has_nothrow_assign(IntAr))]; }
  { int arr[T(__has_nothrow_assign(Union))]; }
  { int arr[T(__has_nothrow_assign(UnionAr))]; }
  { int arr[T(__has_nothrow_assign(POD))]; }
  { int arr[T(__has_nothrow_assign(Derives))]; }
  { int arr[T(__has_nothrow_assign(HasDest))]; }
  { int arr[T(__has_nothrow_assign(HasPriv))]; }
  { int arr[T(__has_nothrow_assign(HasCons))]; }
  { int arr[T(__has_nothrow_assign(HasRef))]; }
  { int arr[T(__has_nothrow_assign(HasCopy))]; }
  { int arr[T(__has_nothrow_assign(HasMove))]; }
  { int arr[T(__has_nothrow_assign(HasMoveAssign))]; }
  { int arr[T(__has_nothrow_assign(HasNoThrowCopyAssign))]; }
  { int arr[T(__has_nothrow_assign(HasMultipleNoThrowCopyAssign))]; }
  { int arr[T(__has_nothrow_assign(HasVirtDest))]; }
  { int arr[T(__has_nothrow_assign(AllPrivate))]; }
  { int arr[T(__has_nothrow_assign(UsingAssign))]; }
  { int arr[T(__has_nothrow_assign(DerivesAr))]; }

  { int arr[F(__has_nothrow_assign(IntRef))]; }
  { int arr[F(__has_nothrow_assign(HasCopyAssign))]; }
  { int arr[F(__has_nothrow_assign(HasMultipleCopyAssign))]; }
  { int arr[F(__has_nothrow_assign(const Int))]; }
  { int arr[F(__has_nothrow_assign(ConstIntAr))]; }
  { int arr[F(__has_nothrow_assign(ConstIntArAr))]; }
  { int arr[F(__has_nothrow_assign(VirtAr))]; }
  { int arr[F(__has_nothrow_assign(void))]; }
  { int arr[F(__has_nothrow_assign(cvoid))]; }
  { int arr[F(__has_nothrow_assign(PR11110))]; }
}

void has_nothrow_move_assign() {
  { int arr[T(__has_nothrow_move_assign(Int))]; }
  { int arr[T(__has_nothrow_move_assign(Enum))]; }
  { int arr[T(__has_nothrow_move_assign(Int*))]; }
  { int arr[T(__has_nothrow_move_assign(Enum POD::*))]; }
  { int arr[T(__has_nothrow_move_assign(POD))]; }
  { int arr[T(__has_nothrow_move_assign(HasPriv))]; }
  { int arr[T(__has_nothrow_move_assign(HasNoThrowMoveAssign))]; }
  { int arr[T(__has_nothrow_move_assign(HasNoExceptNoThrowMoveAssign))]; }
  { int arr[T(__has_nothrow_move_assign(HasMemberNoThrowMoveAssign))]; }
  { int arr[T(__has_nothrow_move_assign(HasMemberNoExceptNoThrowMoveAssign))]; }
  { int arr[T(__has_nothrow_move_assign(AllDeleted))]; }


  { int arr[F(__has_nothrow_move_assign(HasThrowMoveAssign))]; }
  { int arr[F(__has_nothrow_move_assign(HasNoExceptFalseMoveAssign))]; }
  { int arr[F(__has_nothrow_move_assign(HasMemberThrowMoveAssign))]; }
  { int arr[F(__has_nothrow_move_assign(HasMemberNoExceptFalseMoveAssign))]; }
  { int arr[F(__has_nothrow_move_assign(NoDefaultMoveAssignDueToUDCopyCtor))]; }
  { int arr[F(__has_nothrow_move_assign(NoDefaultMoveAssignDueToUDCopyAssign))]; }
  { int arr[F(__has_nothrow_move_assign(NoDefaultMoveAssignDueToDtor))]; }


  { int arr[T(__is_nothrow_assignable(HasNoThrowMoveAssign, HasNoThrowMoveAssign))]; }
  { int arr[F(__is_nothrow_assignable(HasThrowMoveAssign, HasThrowMoveAssign))]; }

  { int arr[T(__is_assignable(HasNoThrowMoveAssign, HasNoThrowMoveAssign))]; }
  { int arr[T(__is_assignable(HasThrowMoveAssign, HasThrowMoveAssign))]; }
}

void has_trivial_move_assign() {
  // n3376 12.8 [class.copy]/25
  // A copy/move assignment operator for class X is trivial if it
  // is not user-provided, its declared parameter type is the same
  // as if it had been implicitly declared, and if:
  //  - class X has no virtual functions (10.3) and no virtual base
  //    classes (10.1), and
  //  - the assignment operator selected to copy/move each direct
  //    base class subobject is trivial, and
  //  - for each non-static data member of X that is of class type
  //    (or array thereof), the assignment operator
  //    selected to copy/move that member is trivial;
  { int arr[T(__has_trivial_move_assign(Int))]; }
  { int arr[T(__has_trivial_move_assign(HasStaticMemberMoveAssign))]; }
  { int arr[T(__has_trivial_move_assign(AllDeleted))]; }

  { int arr[F(__has_trivial_move_assign(HasVirt))]; }
  { int arr[F(__has_trivial_move_assign(DerivesVirt))]; }
  { int arr[F(__has_trivial_move_assign(HasMoveAssign))]; }
  { int arr[F(__has_trivial_move_assign(DerivesHasMoveAssign))]; }
  { int arr[F(__has_trivial_move_assign(HasMemberMoveAssign))]; }
  { int arr[F(__has_nothrow_move_assign(NoDefaultMoveAssignDueToUDCopyCtor))]; }
  { int arr[F(__has_nothrow_move_assign(NoDefaultMoveAssignDueToUDCopyAssign))]; }
}

void has_nothrow_copy() {
  { int arr[T(__has_nothrow_copy(Int))]; }
  { int arr[T(__has_nothrow_copy(IntAr))]; }
  { int arr[T(__has_nothrow_copy(Union))]; }
  { int arr[T(__has_nothrow_copy(UnionAr))]; }
  { int arr[T(__has_nothrow_copy(POD))]; }
  { int arr[T(__has_nothrow_copy(const Int))]; }
  { int arr[T(__has_nothrow_copy(ConstIntAr))]; }
  { int arr[T(__has_nothrow_copy(ConstIntArAr))]; }
  { int arr[T(__has_nothrow_copy(Derives))]; }
  { int arr[T(__has_nothrow_copy(IntRef))]; }
  { int arr[T(__has_nothrow_copy(HasDest))]; }
  { int arr[T(__has_nothrow_copy(HasPriv))]; }
  { int arr[T(__has_nothrow_copy(HasCons))]; }
  { int arr[T(__has_nothrow_copy(HasRef))]; }
  { int arr[T(__has_nothrow_copy(HasMove))]; }
  { int arr[T(__has_nothrow_copy(HasCopyAssign))]; }
  { int arr[T(__has_nothrow_copy(HasMoveAssign))]; }
  { int arr[T(__has_nothrow_copy(HasNoThrowCopy))]; }
  { int arr[T(__has_nothrow_copy(HasMultipleNoThrowCopy))]; }
  { int arr[T(__has_nothrow_copy(HasVirtDest))]; }
  { int arr[T(__has_nothrow_copy(HasTemplateCons))]; }
  { int arr[T(__has_nothrow_copy(AllPrivate))]; }
  { int arr[T(__has_nothrow_copy(DerivesAr))]; }

  { int arr[F(__has_nothrow_copy(HasCopy))]; }
  { int arr[F(__has_nothrow_copy(HasMultipleCopy))]; }
  { int arr[F(__has_nothrow_copy(VirtAr))]; }
  { int arr[F(__has_nothrow_copy(void))]; }
  { int arr[F(__has_nothrow_copy(cvoid))]; }
}

void has_nothrow_constructor() {
  { int arr[T(__has_nothrow_constructor(Int))]; }
  { int arr[T(__has_nothrow_constructor(IntAr))]; }
  { int arr[T(__has_nothrow_constructor(Union))]; }
  { int arr[T(__has_nothrow_constructor(UnionAr))]; }
  { int arr[T(__has_nothrow_constructor(POD))]; }
  { int arr[T(__has_nothrow_constructor(Derives))]; }
  { int arr[T(__has_nothrow_constructor(DerivesAr))]; }
  { int arr[T(__has_nothrow_constructor(ConstIntAr))]; }
  { int arr[T(__has_nothrow_constructor(ConstIntArAr))]; }
  { int arr[T(__has_nothrow_constructor(HasDest))]; }
  { int arr[T(__has_nothrow_constructor(HasPriv))]; }
  { int arr[T(__has_nothrow_constructor(HasCopyAssign))]; }
  { int arr[T(__has_nothrow_constructor(const Int))]; }
  { int arr[T(__has_nothrow_constructor(HasNoThrowConstructor))]; }
  { int arr[T(__has_nothrow_constructor(HasVirtDest))]; }
  // { int arr[T(__has_nothrow_constructor(VirtAr))]; } // not implemented
  { int arr[T(__has_nothrow_constructor(AllPrivate))]; }

  { int arr[F(__has_nothrow_constructor(HasCons))]; }
  { int arr[F(__has_nothrow_constructor(HasRef))]; }
  { int arr[F(__has_nothrow_constructor(HasCopy))]; }
  { int arr[F(__has_nothrow_constructor(HasMove))]; }
  { int arr[F(__has_nothrow_constructor(HasNoThrowConstructorWithArgs))]; }
  { int arr[F(__has_nothrow_constructor(IntRef))]; }
  { int arr[F(__has_nothrow_constructor(void))]; }
  { int arr[F(__has_nothrow_constructor(cvoid))]; }
  { int arr[F(__has_nothrow_constructor(HasTemplateCons))]; }

  { int arr[F(__has_nothrow_constructor(HasMultipleDefaultConstructor1))]; }
  { int arr[F(__has_nothrow_constructor(HasMultipleDefaultConstructor2))]; }
}

void has_virtual_destructor() {
  { int arr[F(__has_virtual_destructor(Int))]; }
  { int arr[F(__has_virtual_destructor(IntAr))]; }
  { int arr[F(__has_virtual_destructor(Union))]; }
  { int arr[F(__has_virtual_destructor(UnionAr))]; }
  { int arr[F(__has_virtual_destructor(POD))]; }
  { int arr[F(__has_virtual_destructor(Derives))]; }
  { int arr[F(__has_virtual_destructor(DerivesAr))]; }
  { int arr[F(__has_virtual_destructor(const Int))]; }
  { int arr[F(__has_virtual_destructor(ConstIntAr))]; }
  { int arr[F(__has_virtual_destructor(ConstIntArAr))]; }
  { int arr[F(__has_virtual_destructor(HasDest))]; }
  { int arr[F(__has_virtual_destructor(HasPriv))]; }
  { int arr[F(__has_virtual_destructor(HasCons))]; }
  { int arr[F(__has_virtual_destructor(HasRef))]; }
  { int arr[F(__has_virtual_destructor(HasCopy))]; }
  { int arr[F(__has_virtual_destructor(HasMove))]; }
  { int arr[F(__has_virtual_destructor(HasCopyAssign))]; }
  { int arr[F(__has_virtual_destructor(HasMoveAssign))]; }
  { int arr[F(__has_virtual_destructor(IntRef))]; }
  { int arr[F(__has_virtual_destructor(VirtAr))]; }

  { int arr[T(__has_virtual_destructor(HasVirtDest))]; }
  { int arr[T(__has_virtual_destructor(DerivedVirtDest))]; }
  { int arr[F(__has_virtual_destructor(VirtDestAr))]; }
  { int arr[F(__has_virtual_destructor(void))]; }
  { int arr[F(__has_virtual_destructor(cvoid))]; }
  { int arr[F(__has_virtual_destructor(AllPrivate))]; }
}


class Base {};
class Derived : Base {};
class Derived2a : Derived {};
class Derived2b : Derived {};
class Derived3 : virtual Derived2a, virtual Derived2b {};
template<typename T> struct BaseA { T a;  };
template<typename T> struct DerivedB : BaseA<T> { };
template<typename T> struct CrazyDerived : T { };


class class_forward; // expected-note 2 {{forward declaration of 'class_forward'}}

template <typename Base, typename Derived>
void isBaseOfT() {
  int t[T(__is_base_of(Base, Derived))];
};
template <typename Base, typename Derived>
void isBaseOfF() {
  int t[F(__is_base_of(Base, Derived))];
};

template <class T> class DerivedTemp : Base {};
template <class T> class NonderivedTemp {};
template <class T> class UndefinedTemp; // expected-note {{declared here}}

void is_base_of() {
  { int arr[T(__is_base_of(Base, Derived))]; }
  { int arr[T(__is_base_of(const Base, Derived))]; }
  { int arr[F(__is_base_of(Derived, Base))]; }
  { int arr[F(__is_base_of(Derived, int))]; }
  { int arr[T(__is_base_of(Base, Base))]; }
  { int arr[T(__is_base_of(Base, Derived3))]; }
  { int arr[T(__is_base_of(Derived, Derived3))]; }
  { int arr[T(__is_base_of(Derived2b, Derived3))]; }
  { int arr[T(__is_base_of(Derived2a, Derived3))]; }
  { int arr[T(__is_base_of(BaseA<int>, DerivedB<int>))]; }
  { int arr[F(__is_base_of(DerivedB<int>, BaseA<int>))]; }
  { int arr[T(__is_base_of(Base, CrazyDerived<Base>))]; }
  { int arr[F(__is_base_of(Union, Union))]; }
  { int arr[T(__is_base_of(Empty, Empty))]; }
  { int arr[T(__is_base_of(class_forward, class_forward))]; }
  { int arr[F(__is_base_of(Empty, class_forward))]; } // expected-error {{incomplete type 'class_forward' used in type trait expression}}
  { int arr[F(__is_base_of(Base&, Derived&))]; }
  int t18[F(__is_base_of(Base[10], Derived[10]))];
  { int arr[F(__is_base_of(int, int))]; }
  { int arr[F(__is_base_of(long, int))]; }
  { int arr[T(__is_base_of(Base, DerivedTemp<int>))]; }
  { int arr[F(__is_base_of(Base, NonderivedTemp<int>))]; }
  { int arr[F(__is_base_of(Base, UndefinedTemp<int>))]; } // expected-error {{implicit instantiation of undefined template 'UndefinedTemp<int>'}}

  isBaseOfT<Base, Derived>();
  isBaseOfF<Derived, Base>();

  isBaseOfT<Base, CrazyDerived<Base> >();
  isBaseOfF<CrazyDerived<Base>, Base>();

  isBaseOfT<BaseA<int>, DerivedB<int> >();
  isBaseOfF<DerivedB<int>, BaseA<int> >();
}

template<class T, class U>
class TemplateClass {};

template<class T>
using TemplateAlias = TemplateClass<T, int>;

typedef class Base BaseTypedef;

void is_same()
{
  int t01[T(__is_same(Base, Base))];
  int t02[T(__is_same(Base, BaseTypedef))];
  int t03[T(__is_same(TemplateClass<int, int>, TemplateAlias<int>))];

  int t10[F(__is_same(Base, const Base))];
  int t11[F(__is_same(Base, Base&))];
  int t12[F(__is_same(Base, Derived))];
}

struct IntWrapper
{
  int value;
  IntWrapper(int _value) : value(_value) {}
  operator int() const {
    return value;
  }
};

struct FloatWrapper
{
  float value;
  FloatWrapper(float _value) : value(_value) {}
  FloatWrapper(const IntWrapper& obj)
    : value(static_cast<float>(obj.value)) {}
  operator float() const {
    return value;
  }
  operator IntWrapper() const {
    return IntWrapper(static_cast<int>(value));
  }
};

void is_convertible()
{
  int t01[T(__is_convertible(IntWrapper, IntWrapper))];
  int t02[T(__is_convertible(IntWrapper, const IntWrapper))];
  int t03[T(__is_convertible(IntWrapper, int))];
  int t04[T(__is_convertible(int, IntWrapper))];
  int t05[T(__is_convertible(IntWrapper, FloatWrapper))];
  int t06[T(__is_convertible(FloatWrapper, IntWrapper))];
  int t07[T(__is_convertible(FloatWrapper, float))];
  int t08[T(__is_convertible(float, FloatWrapper))];
}

struct FromInt { FromInt(int); };
struct ToInt { operator int(); };
typedef void Function();

void is_convertible_to();
class PrivateCopy {
  PrivateCopy(const PrivateCopy&);
  friend void is_convertible_to();
};

template<typename T>
struct X0 { 
  template<typename U> X0(const X0<U>&);
};

struct Abstract { virtual void f() = 0; };

void is_convertible_to() {
  { int arr[T(__is_convertible_to(Int, Int))]; }
  { int arr[F(__is_convertible_to(Int, IntAr))]; }
  { int arr[F(__is_convertible_to(IntAr, IntAr))]; }
  { int arr[T(__is_convertible_to(void, void))]; }
  { int arr[T(__is_convertible_to(cvoid, void))]; }
  { int arr[T(__is_convertible_to(void, cvoid))]; }
  { int arr[T(__is_convertible_to(cvoid, cvoid))]; }
  { int arr[T(__is_convertible_to(int, FromInt))]; }
  { int arr[T(__is_convertible_to(long, FromInt))]; }
  { int arr[T(__is_convertible_to(double, FromInt))]; }
  { int arr[T(__is_convertible_to(const int, FromInt))]; }
  { int arr[T(__is_convertible_to(const int&, FromInt))]; }
  { int arr[T(__is_convertible_to(ToInt, int))]; }
  { int arr[T(__is_convertible_to(ToInt, const int&))]; }
  { int arr[T(__is_convertible_to(ToInt, long))]; }
  { int arr[F(__is_convertible_to(ToInt, int&))]; }
  { int arr[F(__is_convertible_to(ToInt, FromInt))]; }
  { int arr[T(__is_convertible_to(IntAr&, IntAr&))]; }
  { int arr[T(__is_convertible_to(IntAr&, const IntAr&))]; }
  { int arr[F(__is_convertible_to(const IntAr&, IntAr&))]; }
  { int arr[F(__is_convertible_to(Function, Function))]; }
  { int arr[F(__is_convertible_to(PrivateCopy, PrivateCopy))]; }
  { int arr[T(__is_convertible_to(X0<int>, X0<float>))]; }
  { int arr[F(__is_convertible_to(Abstract, Abstract))]; }
}

namespace is_convertible_to_instantiate {
  // Make sure we don't try to instantiate the constructor.
  template<int x> class A { A(int) { int a[x]; } };
  int x = __is_convertible_to(int, A<-1>);
}

void is_trivial()
{
  { int arr[T(__is_trivial(int))]; }
  { int arr[T(__is_trivial(Enum))]; }
  { int arr[T(__is_trivial(POD))]; }
  { int arr[T(__is_trivial(Int))]; }
  { int arr[T(__is_trivial(IntAr))]; }
  { int arr[T(__is_trivial(IntArNB))]; }
  { int arr[T(__is_trivial(Statics))]; }
  { int arr[T(__is_trivial(Empty))]; }
  { int arr[T(__is_trivial(EmptyUnion))]; }
  { int arr[T(__is_trivial(Union))]; }
  { int arr[T(__is_trivial(Derives))]; }
  { int arr[T(__is_trivial(DerivesAr))]; }
  { int arr[T(__is_trivial(DerivesArNB))]; }
  { int arr[T(__is_trivial(DerivesEmpty))]; }
  { int arr[T(__is_trivial(HasFunc))]; }
  { int arr[T(__is_trivial(HasOp))]; }
  { int arr[T(__is_trivial(HasConv))]; }
  { int arr[T(__is_trivial(HasAssign))]; }
  { int arr[T(__is_trivial(HasAnonymousUnion))]; }
  { int arr[T(__is_trivial(HasPriv))]; }
  { int arr[T(__is_trivial(HasProt))]; }
  { int arr[T(__is_trivial(DerivesHasPriv))]; }
  { int arr[T(__is_trivial(DerivesHasProt))]; }
  { int arr[T(__is_trivial(Vector))]; }
  { int arr[T(__is_trivial(VectorExt))]; }

  { int arr[F(__is_trivial(HasCons))]; }
  { int arr[F(__is_trivial(HasCopyAssign))]; }
  { int arr[F(__is_trivial(HasMoveAssign))]; }
  { int arr[F(__is_trivial(HasDest))]; }
  { int arr[F(__is_trivial(HasRef))]; }
  { int arr[F(__is_trivial(HasNonPOD))]; }
  { int arr[F(__is_trivial(HasVirt))]; }
  { int arr[F(__is_trivial(DerivesHasCons))]; }
  { int arr[F(__is_trivial(DerivesHasCopyAssign))]; }
  { int arr[F(__is_trivial(DerivesHasMoveAssign))]; }
  { int arr[F(__is_trivial(DerivesHasDest))]; }
  { int arr[F(__is_trivial(DerivesHasRef))]; }
  { int arr[F(__is_trivial(DerivesHasVirt))]; }
  { int arr[F(__is_trivial(void))]; }
  { int arr[F(__is_trivial(cvoid))]; }
}

template<typename T> struct TriviallyConstructibleTemplate {};

void trivial_checks()
{
  { int arr[T(__is_trivially_copyable(int))]; }
  { int arr[T(__is_trivially_copyable(Enum))]; }
  { int arr[T(__is_trivially_copyable(POD))]; }
  { int arr[T(__is_trivially_copyable(Int))]; }
  { int arr[T(__is_trivially_copyable(IntAr))]; }
  { int arr[T(__is_trivially_copyable(IntArNB))]; }
  { int arr[T(__is_trivially_copyable(Statics))]; }
  { int arr[T(__is_trivially_copyable(Empty))]; }
  { int arr[T(__is_trivially_copyable(EmptyUnion))]; }
  { int arr[T(__is_trivially_copyable(Union))]; }
  { int arr[T(__is_trivially_copyable(Derives))]; }
  { int arr[T(__is_trivially_copyable(DerivesAr))]; }
  { int arr[T(__is_trivially_copyable(DerivesArNB))]; }
  { int arr[T(__is_trivially_copyable(DerivesEmpty))]; }
  { int arr[T(__is_trivially_copyable(HasFunc))]; }
  { int arr[T(__is_trivially_copyable(HasOp))]; }
  { int arr[T(__is_trivially_copyable(HasConv))]; }
  { int arr[T(__is_trivially_copyable(HasAssign))]; }
  { int arr[T(__is_trivially_copyable(HasAnonymousUnion))]; }
  { int arr[T(__is_trivially_copyable(HasPriv))]; }
  { int arr[T(__is_trivially_copyable(HasProt))]; }
  { int arr[T(__is_trivially_copyable(DerivesHasPriv))]; }
  { int arr[T(__is_trivially_copyable(DerivesHasProt))]; }
  { int arr[T(__is_trivially_copyable(Vector))]; }
  { int arr[T(__is_trivially_copyable(VectorExt))]; }
  { int arr[T(__is_trivially_copyable(HasCons))]; }
  { int arr[T(__is_trivially_copyable(HasRef))]; }
  { int arr[T(__is_trivially_copyable(HasNonPOD))]; }
  { int arr[T(__is_trivially_copyable(DerivesHasCons))]; }
  { int arr[T(__is_trivially_copyable(DerivesHasRef))]; }
  { int arr[T(__is_trivially_copyable(NonTrivialDefault))]; }
  { int arr[T(__is_trivially_copyable(NonTrivialDefault[]))]; }
  { int arr[T(__is_trivially_copyable(NonTrivialDefault[3]))]; }

  { int arr[F(__is_trivially_copyable(HasCopyAssign))]; }
  { int arr[F(__is_trivially_copyable(HasMoveAssign))]; }
  { int arr[F(__is_trivially_copyable(HasDest))]; }
  { int arr[F(__is_trivially_copyable(HasVirt))]; }
  { int arr[F(__is_trivially_copyable(DerivesHasCopyAssign))]; }
  { int arr[F(__is_trivially_copyable(DerivesHasMoveAssign))]; }
  { int arr[F(__is_trivially_copyable(DerivesHasDest))]; }
  { int arr[F(__is_trivially_copyable(DerivesHasVirt))]; }
  { int arr[F(__is_trivially_copyable(void))]; }
  { int arr[F(__is_trivially_copyable(cvoid))]; }

  { int arr[T((__is_trivially_constructible(int)))]; }
  { int arr[T((__is_trivially_constructible(int, int)))]; }
  { int arr[T((__is_trivially_constructible(int, float)))]; }
  { int arr[T((__is_trivially_constructible(int, int&)))]; }
  { int arr[T((__is_trivially_constructible(int, const int&)))]; }
  { int arr[T((__is_trivially_constructible(int, int)))]; }
  { int arr[T((__is_trivially_constructible(HasCopyAssign, HasCopyAssign)))]; }
  { int arr[T((__is_trivially_constructible(HasCopyAssign, const HasCopyAssign&)))]; }
  { int arr[T((__is_trivially_constructible(HasCopyAssign, HasCopyAssign&&)))]; }
  { int arr[T((__is_trivially_constructible(HasCopyAssign)))]; }
  { int arr[T((__is_trivially_constructible(NonTrivialDefault,
                                            const NonTrivialDefault&)))]; }
  { int arr[T((__is_trivially_constructible(NonTrivialDefault,
                                            NonTrivialDefault&&)))]; }
  { int arr[T((__is_trivially_constructible(AllDefaulted)))]; }
  { int arr[T((__is_trivially_constructible(AllDefaulted,
                                            const AllDefaulted &)))]; }
  { int arr[T((__is_trivially_constructible(AllDefaulted,
                                            AllDefaulted &&)))]; }

  { int arr[F((__is_trivially_constructible(int, int*)))]; }
  { int arr[F((__is_trivially_constructible(NonTrivialDefault)))]; }
  { int arr[F((__is_trivially_constructible(ThreeArgCtor, int*, char*, int&)))]; }
  { int arr[F((__is_trivially_constructible(AllDeleted)))]; }
  { int arr[F((__is_trivially_constructible(AllDeleted,
                                            const AllDeleted &)))]; }
  { int arr[F((__is_trivially_constructible(AllDeleted,
                                            AllDeleted &&)))]; }
  { int arr[F((__is_trivially_constructible(ExtDefaulted)))]; }
  { int arr[F((__is_trivially_constructible(ExtDefaulted,
                                            const ExtDefaulted &)))]; }
  { int arr[F((__is_trivially_constructible(ExtDefaulted,
                                            ExtDefaulted &&)))]; }

  { int arr[T((__is_trivially_constructible(TriviallyConstructibleTemplate<int>)))]; }
  { int arr[F((__is_trivially_constructible(class_forward)))]; } // expected-error {{incomplete type 'class_forward' used in type trait expression}}
  { int arr[F((__is_trivially_constructible(class_forward[])))]; }
  { int arr[F((__is_trivially_constructible(void)))]; }

  { int arr[T((__is_trivially_assignable(int&, int)))]; }
  { int arr[T((__is_trivially_assignable(int&, int&)))]; }
  { int arr[T((__is_trivially_assignable(int&, int&&)))]; }
  { int arr[T((__is_trivially_assignable(int&, const int&)))]; }
  { int arr[T((__is_trivially_assignable(POD&, POD)))]; }
  { int arr[T((__is_trivially_assignable(POD&, POD&)))]; }
  { int arr[T((__is_trivially_assignable(POD&, POD&&)))]; }
  { int arr[T((__is_trivially_assignable(POD&, const POD&)))]; }
  { int arr[T((__is_trivially_assignable(int*&, int*)))]; }
  { int arr[T((__is_trivially_assignable(AllDefaulted,
                                         const AllDefaulted &)))]; }
  { int arr[T((__is_trivially_assignable(AllDefaulted,
                                         AllDefaulted &&)))]; }

  { int arr[F((__is_trivially_assignable(int*&, float*)))]; }
  { int arr[F((__is_trivially_assignable(HasCopyAssign&, HasCopyAssign)))]; }
  { int arr[F((__is_trivially_assignable(HasCopyAssign&, HasCopyAssign&)))]; }
  { int arr[F((__is_trivially_assignable(HasCopyAssign&, const HasCopyAssign&)))]; }
  { int arr[F((__is_trivially_assignable(HasCopyAssign&, HasCopyAssign&&)))]; }
  { int arr[F((__is_trivially_assignable(TrivialMoveButNotCopy&,
                                        TrivialMoveButNotCopy&)))]; }
  { int arr[F((__is_trivially_assignable(TrivialMoveButNotCopy&,
                                        const TrivialMoveButNotCopy&)))]; }
  { int arr[F((__is_trivially_assignable(AllDeleted,
                                         const AllDeleted &)))]; }
  { int arr[F((__is_trivially_assignable(AllDeleted,
                                         AllDeleted &&)))]; }
  { int arr[F((__is_trivially_assignable(ExtDefaulted,
                                         const ExtDefaulted &)))]; }
  { int arr[F((__is_trivially_assignable(ExtDefaulted,
                                         ExtDefaulted &&)))]; }

  { int arr[T((__is_trivially_assignable(HasDefaultTrivialCopyAssign&,
                                         HasDefaultTrivialCopyAssign&)))]; }
  { int arr[T((__is_trivially_assignable(HasDefaultTrivialCopyAssign&,
                                       const HasDefaultTrivialCopyAssign&)))]; }
  { int arr[T((__is_trivially_assignable(TrivialMoveButNotCopy&,
                                         TrivialMoveButNotCopy)))]; }
  { int arr[T((__is_trivially_assignable(TrivialMoveButNotCopy&,
                                         TrivialMoveButNotCopy&&)))]; }
  { int arr[T((__is_trivially_assignable(int&, int)))]; }
  { int arr[T((__is_trivially_assignable(int&, int&)))]; }
  { int arr[T((__is_trivially_assignable(int&, int&&)))]; }
  { int arr[T((__is_trivially_assignable(int&, const int&)))]; }
  { int arr[T((__is_trivially_assignable(POD&, POD)))]; }
  { int arr[T((__is_trivially_assignable(POD&, POD&)))]; }
  { int arr[T((__is_trivially_assignable(POD&, POD&&)))]; }
  { int arr[T((__is_trivially_assignable(POD&, const POD&)))]; }
  { int arr[T((__is_trivially_assignable(int*&, int*)))]; }
  { int arr[T((__is_trivially_assignable(AllDefaulted,
                                         const AllDefaulted &)))]; }
  { int arr[T((__is_trivially_assignable(AllDefaulted,
                                         AllDefaulted &&)))]; }

  { int arr[F((__is_assignable(int *&, float *)))]; }
  { int arr[T((__is_assignable(HasCopyAssign &, HasCopyAssign)))]; }
  { int arr[T((__is_assignable(HasCopyAssign &, HasCopyAssign &)))]; }
  { int arr[T((__is_assignable(HasCopyAssign &, const HasCopyAssign &)))]; }
  { int arr[T((__is_assignable(HasCopyAssign &, HasCopyAssign &&)))]; }
  { int arr[T((__is_assignable(TrivialMoveButNotCopy &,
                               TrivialMoveButNotCopy &)))]; }
  { int arr[T((__is_assignable(TrivialMoveButNotCopy &,
                               const TrivialMoveButNotCopy &)))]; }
  { int arr[F((__is_assignable(AllDeleted,
                               const AllDeleted &)))]; }
  { int arr[F((__is_assignable(AllDeleted,
                               AllDeleted &&)))]; }
  { int arr[T((__is_assignable(ExtDefaulted,
                               const ExtDefaulted &)))]; }
  { int arr[T((__is_assignable(ExtDefaulted,
                               ExtDefaulted &&)))]; }

  { int arr[T((__is_assignable(HasDefaultTrivialCopyAssign &,
                               HasDefaultTrivialCopyAssign &)))]; }
  { int arr[T((__is_assignable(HasDefaultTrivialCopyAssign &,
                               const HasDefaultTrivialCopyAssign &)))]; }
  { int arr[T((__is_assignable(TrivialMoveButNotCopy &,
                               TrivialMoveButNotCopy)))]; }
  { int arr[T((__is_assignable(TrivialMoveButNotCopy &,
                               TrivialMoveButNotCopy &&)))]; }
}

void constructible_checks() {
  { int arr[T(__is_constructible(HasNoThrowConstructorWithArgs))]; }
  { int arr[F(__is_nothrow_constructible(HasNoThrowConstructorWithArgs))]; } // MSVC doesn't look into default args and gets this wrong.

  { int arr[T(__is_constructible(HasNoThrowConstructorWithArgs, HasCons))]; }
  { int arr[T(__is_nothrow_constructible(HasNoThrowConstructorWithArgs, HasCons))]; }

  { int arr[T(__is_constructible(NonTrivialDefault))]; }
  { int arr[F(__is_nothrow_constructible(NonTrivialDefault))]; }

  { int arr[T(__is_constructible(int))]; }
  { int arr[T(__is_nothrow_constructible(int))]; }

  { int arr[F(__is_constructible(NonPOD))]; }
  { int arr[F(__is_nothrow_constructible(NonPOD))]; }

  { int arr[T(__is_constructible(NonPOD, int))]; }
  { int arr[F(__is_nothrow_constructible(NonPOD, int))]; }

  // PR19178
  { int arr[F(__is_constructible(Abstract))]; }
  { int arr[F(__is_nothrow_constructible(Abstract))]; }

  // PR20228
  { int arr[T(__is_constructible(VariadicCtor,
                                 int, int, int, int, int, int, int, int, int))]; }

  // PR25513
  { int arr[F(__is_constructible(int(int)))]; }
}

// Instantiation of __is_trivially_constructible
template<typename T, typename ...Args>
struct is_trivially_constructible {
  static const bool value = __is_trivially_constructible(T, Args...);
};

void is_trivially_constructible_test() {
  { int arr[T((is_trivially_constructible<int>::value))]; }
  { int arr[T((is_trivially_constructible<int, int>::value))]; }
  { int arr[T((is_trivially_constructible<int, float>::value))]; }
  { int arr[T((is_trivially_constructible<int, int&>::value))]; }
  { int arr[T((is_trivially_constructible<int, const int&>::value))]; }
  { int arr[T((is_trivially_constructible<int, int>::value))]; }
  { int arr[T((is_trivially_constructible<HasCopyAssign, HasCopyAssign>::value))]; }
  { int arr[T((is_trivially_constructible<HasCopyAssign, const HasCopyAssign&>::value))]; }
  { int arr[T((is_trivially_constructible<HasCopyAssign, HasCopyAssign&&>::value))]; }
  { int arr[T((is_trivially_constructible<HasCopyAssign>::value))]; }
  { int arr[T((is_trivially_constructible<NonTrivialDefault,
                                            const NonTrivialDefault&>::value))]; }
  { int arr[T((is_trivially_constructible<NonTrivialDefault,
                                            NonTrivialDefault&&>::value))]; }

  { int arr[F((is_trivially_constructible<int, int*>::value))]; }
  { int arr[F((is_trivially_constructible<NonTrivialDefault>::value))]; }
  { int arr[F((is_trivially_constructible<ThreeArgCtor, int*, char*, int&>::value))]; }
  { int arr[F((is_trivially_constructible<Abstract>::value))]; } // PR19178
}

void array_rank() {
  int t01[T(__array_rank(IntAr) == 1)];
  int t02[T(__array_rank(ConstIntArAr) == 2)];
}

void array_extent() {
  int t01[T(__array_extent(IntAr, 0) == 10)];
  int t02[T(__array_extent(ConstIntArAr, 0) == 4)];
  int t03[T(__array_extent(ConstIntArAr, 1) == 10)];
}

void is_destructible_test() {
  { int arr[T(__is_destructible(int))]; }
  { int arr[T(__is_destructible(int[2]))]; }
  { int arr[F(__is_destructible(int[]))]; }
  { int arr[F(__is_destructible(void))]; }
  { int arr[T(__is_destructible(int &))]; }
  { int arr[T(__is_destructible(HasDest))]; }
  { int arr[F(__is_destructible(AllPrivate))]; }
  { int arr[T(__is_destructible(SuperNonTrivialStruct))]; }
  { int arr[T(__is_destructible(AllDefaulted))]; }
  { int arr[F(__is_destructible(AllDeleted))]; }
  { int arr[T(__is_destructible(ThrowingDtor))]; }
  { int arr[T(__is_destructible(NoThrowDtor))]; }
}

void is_nothrow_destructible_test() {
  { int arr[T(__is_nothrow_destructible(int))]; }
  { int arr[T(__is_nothrow_destructible(int[2]))]; }
  { int arr[F(__is_nothrow_destructible(int[]))]; }
  { int arr[F(__is_nothrow_destructible(void))]; }
  { int arr[T(__is_nothrow_destructible(int &))]; }
  { int arr[T(__is_nothrow_destructible(HasDest))]; }
  { int arr[F(__is_nothrow_destructible(AllPrivate))]; }
  { int arr[T(__is_nothrow_destructible(SuperNonTrivialStruct))]; }
  { int arr[T(__is_nothrow_destructible(AllDefaulted))]; }
  { int arr[F(__is_nothrow_destructible(AllDeleted))]; }
  { int arr[F(__is_nothrow_destructible(ThrowingDtor))]; }
  { int arr[T(__is_nothrow_destructible(NoExceptDtor))]; }
  { int arr[T(__is_nothrow_destructible(NoThrowDtor))]; }
}