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