type-traits.cpp revision 08295a592d7e54e6bea00daeb2abe7ac79a3aaba
1// RUN: %clang_cc1 -fsyntax-only -verify %s 2#define T(b) (b) ? 1 : -1 3#define F(b) (b) ? -1 : 1 4 5struct NonPOD { NonPOD(int); }; 6 7// PODs 8enum Enum { EV }; 9struct POD { Enum e; int i; float f; NonPOD* p; }; 10struct Empty {}; 11typedef Empty EmptyAr[10]; 12typedef int Int; 13typedef Int IntAr[10]; 14typedef Int IntArNB[]; 15class Statics { static int priv; static NonPOD np; }; 16union EmptyUnion {}; 17union Union { int i; float f; }; 18struct HasFunc { void f (); }; 19struct HasOp { void operator *(); }; 20struct HasConv { operator int(); }; 21struct HasAssign { void operator =(int); }; 22 23// Not PODs 24typedef const void cvoid; 25struct Derives : POD {}; 26struct DerivesEmpty : Empty {}; 27struct HasCons { HasCons(int); }; 28struct HasCopyAssign { HasCopyAssign operator =(const HasCopyAssign&); }; 29struct HasDest { ~HasDest(); }; 30class HasPriv { int priv; }; 31class HasProt { protected: int prot; }; 32struct HasRef { int i; int& ref; HasRef() : i(0), ref(i) {} }; 33struct HasNonPOD { NonPOD np; }; 34struct HasVirt { virtual void Virt() {}; }; 35typedef Derives NonPODAr[10]; 36typedef HasVirt VirtAr[10]; 37typedef HasCons NonPODArNB[]; 38union NonPODUnion { int i; Derives n; }; 39 40struct HasNoThrowCopyAssign { 41 void operator =(const HasNoThrowCopyAssign&) throw(); 42}; 43struct HasMultipleCopyAssign { 44 void operator =(const HasMultipleCopyAssign&) throw(); 45 void operator =(volatile HasMultipleCopyAssign&); 46}; 47struct HasMultipleNoThrowCopyAssign { 48 void operator =(const HasMultipleNoThrowCopyAssign&) throw(); 49 void operator =(volatile HasMultipleNoThrowCopyAssign&) throw(); 50}; 51 52struct HasNoThrowConstructor { HasNoThrowConstructor() throw(); }; 53struct HasNoThrowConstructorWithArgs { 54 HasNoThrowConstructorWithArgs(HasCons i = HasCons(0)) throw(); 55}; 56 57struct HasNoThrowCopy { HasNoThrowCopy(const HasNoThrowCopy&) throw(); }; 58struct HasMultipleCopy { 59 HasMultipleCopy(const HasMultipleCopy&) throw(); 60 HasMultipleCopy(volatile HasMultipleCopy&); 61}; 62struct HasMultipleNoThrowCopy { 63 HasMultipleNoThrowCopy(const HasMultipleNoThrowCopy&) throw(); 64 HasMultipleNoThrowCopy(volatile HasMultipleNoThrowCopy&) throw(); 65}; 66 67struct HasVirtDest { virtual ~HasVirtDest(); }; 68struct DerivedVirtDest : HasVirtDest {}; 69typedef HasVirtDest VirtDestAr[1]; 70 71void is_pod() 72{ 73 int t01[T(__is_pod(int))]; 74 int t02[T(__is_pod(Enum))]; 75 int t03[T(__is_pod(POD))]; 76 int t04[T(__is_pod(Int))]; 77 int t05[T(__is_pod(IntAr))]; 78 int t06[T(__is_pod(Statics))]; 79 int t07[T(__is_pod(Empty))]; 80 int t08[T(__is_pod(EmptyUnion))]; 81 int t09[T(__is_pod(Union))]; 82 int t10[T(__is_pod(HasFunc))]; 83 int t11[T(__is_pod(HasOp))]; 84 int t12[T(__is_pod(HasConv))]; 85 int t13[T(__is_pod(HasAssign))]; 86 int t14[T(__is_pod(IntArNB))]; 87 88 int t21[F(__is_pod(Derives))]; 89 int t22[F(__is_pod(HasCons))]; 90 int t23[F(__is_pod(HasCopyAssign))]; 91 int t24[F(__is_pod(HasDest))]; 92 int t25[F(__is_pod(HasPriv))]; 93 int t26[F(__is_pod(HasProt))]; 94 int t27[F(__is_pod(HasRef))]; 95 int t28[F(__is_pod(HasNonPOD))]; 96 int t29[F(__is_pod(HasVirt))]; 97 int t30[F(__is_pod(NonPODAr))]; 98 int t31[F(__is_pod(DerivesEmpty))]; 99 int t32[F(__is_pod(void))]; 100 int t33[F(__is_pod(cvoid))]; 101 int t34[F(__is_pod(NonPODArNB))]; 102 // int t32[F(__is_pod(NonPODUnion))]; 103} 104 105typedef Empty EmptyAr[10]; 106struct Bit0 { int : 0; }; 107struct Bit0Cons { int : 0; Bit0Cons(); }; 108struct BitOnly { int x : 3; }; 109//struct DerivesVirt : virtual POD {}; 110 111void is_empty() 112{ 113 int t01[T(__is_empty(Empty))]; 114 int t02[T(__is_empty(DerivesEmpty))]; 115 int t03[T(__is_empty(HasCons))]; 116 int t04[T(__is_empty(HasCopyAssign))]; 117 int t05[T(__is_empty(HasDest))]; 118 int t06[T(__is_empty(HasFunc))]; 119 int t07[T(__is_empty(HasOp))]; 120 int t08[T(__is_empty(HasConv))]; 121 int t09[T(__is_empty(HasAssign))]; 122 int t10[T(__is_empty(Bit0))]; 123 int t11[T(__is_empty(Bit0Cons))]; 124 125 int t21[F(__is_empty(Int))]; 126 int t22[F(__is_empty(POD))]; 127 int t23[F(__is_empty(EmptyUnion))]; 128 int t24[F(__is_empty(EmptyAr))]; 129 int t25[F(__is_empty(HasRef))]; 130 int t26[F(__is_empty(HasVirt))]; 131 int t27[F(__is_empty(BitOnly))]; 132 int t28[F(__is_empty(void))]; 133 int t29[F(__is_empty(IntArNB))]; 134// int t27[F(__is_empty(DerivesVirt))]; 135} 136 137typedef Derives ClassType; 138 139void is_class() 140{ 141 int t01[T(__is_class(Derives))]; 142 int t02[T(__is_class(HasPriv))]; 143 int t03[T(__is_class(ClassType))]; 144 145 int t11[F(__is_class(int))]; 146 int t12[F(__is_class(Enum))]; 147 int t13[F(__is_class(Int))]; 148 int t14[F(__is_class(IntAr))]; 149 int t15[F(__is_class(NonPODAr))]; 150 int t16[F(__is_class(Union))]; 151 int t17[F(__is_class(cvoid))]; 152 int t18[F(__is_class(IntArNB))]; 153} 154 155typedef Union UnionAr[10]; 156typedef Union UnionType; 157 158void is_union() 159{ 160 int t01[T(__is_union(Union))]; 161 int t02[T(__is_union(UnionType))]; 162 163 int t11[F(__is_union(int))]; 164 int t12[F(__is_union(Enum))]; 165 int t13[F(__is_union(Int))]; 166 int t14[F(__is_union(IntAr))]; 167 int t15[F(__is_union(UnionAr))]; 168 int t16[F(__is_union(cvoid))]; 169 int t17[F(__is_union(IntArNB))]; 170} 171 172typedef Enum EnumType; 173 174void is_enum() 175{ 176 int t01[T(__is_enum(Enum))]; 177 int t02[T(__is_enum(EnumType))]; 178 179 int t11[F(__is_enum(int))]; 180 int t12[F(__is_enum(Union))]; 181 int t13[F(__is_enum(Int))]; 182 int t14[F(__is_enum(IntAr))]; 183 int t15[F(__is_enum(UnionAr))]; 184 int t16[F(__is_enum(Derives))]; 185 int t17[F(__is_enum(ClassType))]; 186 int t18[F(__is_enum(cvoid))]; 187 int t19[F(__is_enum(IntArNB))]; 188} 189 190typedef HasVirt Polymorph; 191struct InheritPolymorph : Polymorph {}; 192 193void is_polymorphic() 194{ 195 int t01[T(__is_polymorphic(Polymorph))]; 196 int t02[T(__is_polymorphic(InheritPolymorph))]; 197 198 int t11[F(__is_polymorphic(int))]; 199 int t12[F(__is_polymorphic(Union))]; 200 int t13[F(__is_polymorphic(Int))]; 201 int t14[F(__is_polymorphic(IntAr))]; 202 int t15[F(__is_polymorphic(UnionAr))]; 203 int t16[F(__is_polymorphic(Derives))]; 204 int t17[F(__is_polymorphic(ClassType))]; 205 int t18[F(__is_polymorphic(Enum))]; 206 int t19[F(__is_polymorphic(cvoid))]; 207 int t20[F(__is_polymorphic(IntArNB))]; 208} 209 210typedef Int& IntRef; 211typedef const IntAr ConstIntAr; 212typedef ConstIntAr ConstIntArAr[4]; 213 214struct HasCopy { 215 HasCopy(HasCopy& cp); 216}; 217 218struct HasTemplateCons { 219 HasVirt Annoying; 220 221 template <typename T> 222 HasTemplateCons(const T&); 223}; 224 225void has_trivial_default_constructor() { 226 int t01[T(__has_trivial_constructor(Int))]; 227 int t02[T(__has_trivial_constructor(IntAr))]; 228 int t03[T(__has_trivial_constructor(Union))]; 229 int t04[T(__has_trivial_constructor(UnionAr))]; 230 int t05[T(__has_trivial_constructor(POD))]; 231 int t06[T(__has_trivial_constructor(Derives))]; 232 int t07[T(__has_trivial_constructor(ConstIntAr))]; 233 int t08[T(__has_trivial_constructor(ConstIntArAr))]; 234 int t09[T(__has_trivial_constructor(HasDest))]; 235 int t10[T(__has_trivial_constructor(HasPriv))]; 236 int t11[F(__has_trivial_constructor(HasCons))]; 237 int t12[F(__has_trivial_constructor(HasRef))]; 238 int t13[F(__has_trivial_constructor(HasCopy))]; 239 int t14[F(__has_trivial_constructor(IntRef))]; 240 int t15[T(__has_trivial_constructor(HasCopyAssign))]; 241 int t16[T(__has_trivial_constructor(const Int))]; 242 int t17[T(__has_trivial_constructor(NonPODAr))]; 243 int t18[F(__has_trivial_constructor(VirtAr))]; 244 int t19[F(__has_trivial_constructor(void))]; 245 int t20[F(__has_trivial_constructor(cvoid))]; 246 int t21[F(__has_trivial_constructor(HasTemplateCons))]; 247} 248 249void has_trivial_copy_constructor() { 250 int t01[T(__has_trivial_copy(Int))]; 251 int t02[T(__has_trivial_copy(IntAr))]; 252 int t03[T(__has_trivial_copy(Union))]; 253 int t04[T(__has_trivial_copy(UnionAr))]; 254 int t05[T(__has_trivial_copy(POD))]; 255 int t06[T(__has_trivial_copy(Derives))]; 256 int t07[T(__has_trivial_copy(ConstIntAr))]; 257 int t08[T(__has_trivial_copy(ConstIntArAr))]; 258 int t09[T(__has_trivial_copy(HasDest))]; 259 int t10[T(__has_trivial_copy(HasPriv))]; 260 int t11[T(__has_trivial_copy(HasCons))]; 261 int t12[T(__has_trivial_copy(HasRef))]; 262 int t13[F(__has_trivial_copy(HasCopy))]; 263 int t14[T(__has_trivial_copy(IntRef))]; 264 int t15[T(__has_trivial_copy(HasCopyAssign))]; 265 int t16[T(__has_trivial_copy(const Int))]; 266 int t17[F(__has_trivial_copy(NonPODAr))]; 267 int t18[F(__has_trivial_copy(VirtAr))]; 268 int t19[F(__has_trivial_copy(void))]; 269 int t20[F(__has_trivial_copy(cvoid))]; 270 int t21[F(__has_trivial_copy(HasTemplateCons))]; 271} 272 273void has_trivial_copy_assignment() { 274 int t01[T(__has_trivial_assign(Int))]; 275 int t02[T(__has_trivial_assign(IntAr))]; 276 int t03[T(__has_trivial_assign(Union))]; 277 int t04[T(__has_trivial_assign(UnionAr))]; 278 int t05[T(__has_trivial_assign(POD))]; 279 int t06[T(__has_trivial_assign(Derives))]; 280 int t07[F(__has_trivial_assign(ConstIntAr))]; 281 int t08[F(__has_trivial_assign(ConstIntArAr))]; 282 int t09[T(__has_trivial_assign(HasDest))]; 283 int t10[T(__has_trivial_assign(HasPriv))]; 284 int t11[T(__has_trivial_assign(HasCons))]; 285 int t12[T(__has_trivial_assign(HasRef))]; 286 int t13[T(__has_trivial_assign(HasCopy))]; 287 int t14[F(__has_trivial_assign(IntRef))]; 288 int t15[F(__has_trivial_assign(HasCopyAssign))]; 289 int t16[F(__has_trivial_assign(const Int))]; 290 int t17[F(__has_trivial_assign(NonPODAr))]; 291 int t18[F(__has_trivial_assign(VirtAr))]; 292 int t19[F(__has_trivial_assign(void))]; 293 int t20[F(__has_trivial_assign(cvoid))]; 294} 295 296void has_trivial_destructor() { 297 int t01[T(__has_trivial_destructor(Int))]; 298 int t02[T(__has_trivial_destructor(IntAr))]; 299 int t03[T(__has_trivial_destructor(Union))]; 300 int t04[T(__has_trivial_destructor(UnionAr))]; 301 int t05[T(__has_trivial_destructor(POD))]; 302 int t06[T(__has_trivial_destructor(Derives))]; 303 int t07[T(__has_trivial_destructor(ConstIntAr))]; 304 int t08[T(__has_trivial_destructor(ConstIntArAr))]; 305 int t09[F(__has_trivial_destructor(HasDest))]; 306 int t10[T(__has_trivial_destructor(HasPriv))]; 307 int t11[T(__has_trivial_destructor(HasCons))]; 308 int t12[T(__has_trivial_destructor(HasRef))]; 309 int t13[T(__has_trivial_destructor(HasCopy))]; 310 int t14[T(__has_trivial_destructor(IntRef))]; 311 int t15[T(__has_trivial_destructor(HasCopyAssign))]; 312 int t16[T(__has_trivial_destructor(const Int))]; 313 int t17[T(__has_trivial_destructor(NonPODAr))]; 314 int t18[T(__has_trivial_destructor(VirtAr))]; 315 int t19[F(__has_trivial_destructor(void))]; 316 int t20[F(__has_trivial_destructor(cvoid))]; 317} 318 319struct A { ~A() {} }; 320template<typename> struct B : A { }; 321 322void f() { 323 int t01[F(__has_trivial_destructor(A))]; 324 int t02[F(__has_trivial_destructor(B<int>))]; 325} 326 327void has_nothrow_assign() { 328 int t01[T(__has_nothrow_assign(Int))]; 329 int t02[T(__has_nothrow_assign(IntAr))]; 330 int t03[T(__has_nothrow_assign(Union))]; 331 int t04[T(__has_nothrow_assign(UnionAr))]; 332 int t05[T(__has_nothrow_assign(POD))]; 333 int t06[T(__has_nothrow_assign(Derives))]; 334 int t07[F(__has_nothrow_assign(ConstIntAr))]; 335 int t08[F(__has_nothrow_assign(ConstIntArAr))]; 336 int t09[T(__has_nothrow_assign(HasDest))]; 337 int t10[T(__has_nothrow_assign(HasPriv))]; 338 int t11[T(__has_nothrow_assign(HasCons))]; 339 int t12[T(__has_nothrow_assign(HasRef))]; 340 int t13[T(__has_nothrow_assign(HasCopy))]; 341 int t14[F(__has_nothrow_assign(IntRef))]; 342 int t15[F(__has_nothrow_assign(HasCopyAssign))]; 343 int t16[F(__has_nothrow_assign(const Int))]; 344 int t17[F(__has_nothrow_assign(NonPODAr))]; 345 int t18[F(__has_nothrow_assign(VirtAr))]; 346 int t19[T(__has_nothrow_assign(HasNoThrowCopyAssign))]; 347 int t20[F(__has_nothrow_assign(HasMultipleCopyAssign))]; 348 int t21[T(__has_nothrow_assign(HasMultipleNoThrowCopyAssign))]; 349 int t22[F(__has_nothrow_assign(void))]; 350 int t23[F(__has_nothrow_assign(cvoid))]; 351} 352 353void has_nothrow_copy() { 354 int t01[T(__has_nothrow_copy(Int))]; 355 int t02[T(__has_nothrow_copy(IntAr))]; 356 int t03[T(__has_nothrow_copy(Union))]; 357 int t04[T(__has_nothrow_copy(UnionAr))]; 358 int t05[T(__has_nothrow_copy(POD))]; 359 int t06[T(__has_nothrow_copy(Derives))]; 360 int t07[T(__has_nothrow_copy(ConstIntAr))]; 361 int t08[T(__has_nothrow_copy(ConstIntArAr))]; 362 int t09[T(__has_nothrow_copy(HasDest))]; 363 int t10[T(__has_nothrow_copy(HasPriv))]; 364 int t11[T(__has_nothrow_copy(HasCons))]; 365 int t12[T(__has_nothrow_copy(HasRef))]; 366 int t13[F(__has_nothrow_copy(HasCopy))]; 367 int t14[T(__has_nothrow_copy(IntRef))]; 368 int t15[T(__has_nothrow_copy(HasCopyAssign))]; 369 int t16[T(__has_nothrow_copy(const Int))]; 370 int t17[F(__has_nothrow_copy(NonPODAr))]; 371 int t18[F(__has_nothrow_copy(VirtAr))]; 372 373 int t19[T(__has_nothrow_copy(HasNoThrowCopy))]; 374 int t20[F(__has_nothrow_copy(HasMultipleCopy))]; 375 int t21[T(__has_nothrow_copy(HasMultipleNoThrowCopy))]; 376 int t22[F(__has_nothrow_copy(void))]; 377 int t23[F(__has_nothrow_copy(cvoid))]; 378 int t24[T(__has_nothrow_copy(HasVirtDest))]; 379 int t25[T(__has_nothrow_copy(HasTemplateCons))]; 380} 381 382void has_nothrow_constructor() { 383 int t01[T(__has_nothrow_constructor(Int))]; 384 int t02[T(__has_nothrow_constructor(IntAr))]; 385 int t03[T(__has_nothrow_constructor(Union))]; 386 int t04[T(__has_nothrow_constructor(UnionAr))]; 387 int t05[T(__has_nothrow_constructor(POD))]; 388 int t06[T(__has_nothrow_constructor(Derives))]; 389 int t07[T(__has_nothrow_constructor(ConstIntAr))]; 390 int t08[T(__has_nothrow_constructor(ConstIntArAr))]; 391 int t09[T(__has_nothrow_constructor(HasDest))]; 392 int t10[T(__has_nothrow_constructor(HasPriv))]; 393 int t11[F(__has_nothrow_constructor(HasCons))]; 394 int t12[F(__has_nothrow_constructor(HasRef))]; 395 int t13[F(__has_nothrow_constructor(HasCopy))]; 396 int t14[F(__has_nothrow_constructor(IntRef))]; 397 int t15[T(__has_nothrow_constructor(HasCopyAssign))]; 398 int t16[T(__has_nothrow_constructor(const Int))]; 399 int t17[T(__has_nothrow_constructor(NonPODAr))]; 400 // int t18[T(__has_nothrow_constructor(VirtAr))]; // not implemented 401 402 int t19[T(__has_nothrow_constructor(HasNoThrowConstructor))]; 403 int t20[F(__has_nothrow_constructor(HasNoThrowConstructorWithArgs))]; 404 int t21[F(__has_nothrow_constructor(void))]; 405 int t22[F(__has_nothrow_constructor(cvoid))]; 406 int t23[T(__has_nothrow_constructor(HasVirtDest))]; 407 int t24[F(__has_nothrow_constructor(HasTemplateCons))]; 408} 409 410void has_virtual_destructor() { 411 int t01[F(__has_virtual_destructor(Int))]; 412 int t02[F(__has_virtual_destructor(IntAr))]; 413 int t03[F(__has_virtual_destructor(Union))]; 414 int t04[F(__has_virtual_destructor(UnionAr))]; 415 int t05[F(__has_virtual_destructor(POD))]; 416 int t06[F(__has_virtual_destructor(Derives))]; 417 int t07[F(__has_virtual_destructor(ConstIntAr))]; 418 int t08[F(__has_virtual_destructor(ConstIntArAr))]; 419 int t09[F(__has_virtual_destructor(HasDest))]; 420 int t10[F(__has_virtual_destructor(HasPriv))]; 421 int t11[F(__has_virtual_destructor(HasCons))]; 422 int t12[F(__has_virtual_destructor(HasRef))]; 423 int t13[F(__has_virtual_destructor(HasCopy))]; 424 int t14[F(__has_virtual_destructor(IntRef))]; 425 int t15[F(__has_virtual_destructor(HasCopyAssign))]; 426 int t16[F(__has_virtual_destructor(const Int))]; 427 int t17[F(__has_virtual_destructor(NonPODAr))]; 428 int t18[F(__has_virtual_destructor(VirtAr))]; 429 430 int t19[T(__has_virtual_destructor(HasVirtDest))]; 431 int t20[T(__has_virtual_destructor(DerivedVirtDest))]; 432 int t21[F(__has_virtual_destructor(VirtDestAr))]; 433 int t22[F(__has_virtual_destructor(void))]; 434 int t23[F(__has_virtual_destructor(cvoid))]; 435} 436