5180 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify -std=gnu++11 -fblocks -Wno-deprecated-builtins -Wno-defaulted-function-deleted -Wno-c++17-extensions %s2// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify -std=gnu++14 -fblocks -Wno-deprecated-builtins -Wno-defaulted-function-deleted -Wno-c++17-extensions %s3// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify -std=gnu++17 -fblocks -Wno-deprecated-builtins -Wno-defaulted-function-deleted %s4// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify -std=gnu++20 -fblocks -Wno-deprecated-builtins -Wno-defaulted-function-deleted %s5 6 7struct NonPOD { NonPOD(int); };8typedef NonPOD NonPODAr[10];9typedef NonPOD NonPODArNB[];10typedef NonPOD NonPODArMB[10][2];11 12// PODs13enum Enum { EV };14enum SignedEnum : signed int { };15enum UnsignedEnum : unsigned int { };16enum class EnumClass { EV };17enum class SignedEnumClass : signed int {};18enum class UnsignedEnumClass : unsigned int {};19struct POD { Enum e; int i; float f; NonPOD* p; };20struct Empty {};21struct IncompleteStruct; // expected-note {{forward declaration of 'IncompleteStruct'}}22typedef Empty EmptyAr[10];23typedef Empty EmptyArNB[];24typedef Empty EmptyArMB[1][2];25typedef int Int;26typedef Int IntAr[10];27typedef Int IntArNB[];28typedef Int IntArZero[0];29class Statics { static int priv; static NonPOD np; };30union EmptyUnion {};31union IncompleteUnion; // expected-note {{forward declaration of 'IncompleteUnion'}}32union Union { int i; float f; };33struct HasFunc { void f (); };34struct HasOp { void operator *(); };35struct HasConv { operator int(); };36struct HasAssign { void operator =(int); };37 38struct HasAnonymousUnion {39 union {40 int i;41 float f;42 };43};44 45typedef int Vector __attribute__((vector_size(16)));46typedef int VectorExt __attribute__((ext_vector_type(4)));47 48using ComplexFloat = _Complex float;49using ComplexInt = _Complex int;50 51// Not PODs52typedef const void cvoid;53struct Derives : POD {};54typedef Derives DerivesAr[10];55typedef Derives DerivesArNB[];56struct DerivesEmpty : Empty {};57struct HasCons { HasCons(int); };58struct HasDefaultCons { HasDefaultCons() = default; };59struct HasExplicitDefaultCons { explicit HasExplicitDefaultCons() = default; };60struct HasInheritedCons : HasDefaultCons { using HasDefaultCons::HasDefaultCons; };61struct HasNoInheritedCons : HasCons {};62struct HasCopyAssign { HasCopyAssign operator =(const HasCopyAssign&); };63struct HasMoveAssign { HasMoveAssign operator =(const HasMoveAssign&&); };64struct HasNoThrowMoveAssign {65 HasNoThrowMoveAssign& operator=(66 const HasNoThrowMoveAssign&&) throw(); };67struct HasNoExceptNoThrowMoveAssign {68 HasNoExceptNoThrowMoveAssign& operator=(69 const HasNoExceptNoThrowMoveAssign&&) noexcept;70};71struct HasThrowMoveAssign {72 HasThrowMoveAssign& operator=(const HasThrowMoveAssign&&)73#if __cplusplus <= 201402L74 throw(POD);75#else76 noexcept(false);77#endif78};79 80 81struct HasNoExceptFalseMoveAssign {82 HasNoExceptFalseMoveAssign& operator=(83 const HasNoExceptFalseMoveAssign&&) noexcept(false); };84struct HasMoveCtor { HasMoveCtor(const HasMoveCtor&&); };85struct HasMemberMoveCtor { HasMoveCtor member; };86struct HasMemberMoveAssign { HasMoveAssign member; };87struct HasStaticMemberMoveCtor { static HasMoveCtor member; };88struct HasStaticMemberMoveAssign { static HasMoveAssign member; };89struct HasMemberThrowMoveAssign { HasThrowMoveAssign member; };90struct HasMemberNoExceptFalseMoveAssign {91 HasNoExceptFalseMoveAssign member; };92struct HasMemberNoThrowMoveAssign { HasNoThrowMoveAssign member; };93struct HasMemberNoExceptNoThrowMoveAssign {94 HasNoExceptNoThrowMoveAssign member; };95 96struct HasDefaultTrivialCopyAssign {97 HasDefaultTrivialCopyAssign &operator=(98 const HasDefaultTrivialCopyAssign&) = default;99};100struct TrivialMoveButNotCopy {101 TrivialMoveButNotCopy &operator=(TrivialMoveButNotCopy&&) = default;102 TrivialMoveButNotCopy &operator=(const TrivialMoveButNotCopy&);103};104struct NonTrivialDefault {105 NonTrivialDefault();106};107 108struct HasDest { ~HasDest(); };109class HasPriv { int priv; };110class HasProt { protected: int prot; };111struct HasRef { int i; int& ref; HasRef() : i(0), ref(i) {} };112struct HasRefAggregate { int i; int& ref; };113struct HasNonPOD { NonPOD np; };114struct HasVirt { virtual void Virt() {}; };115typedef NonPOD NonPODAr[10];116typedef HasVirt VirtAr[10];117typedef NonPOD NonPODArNB[];118union NonPODUnion { int i; Derives n; };119struct DerivesHasCons : HasCons {};120struct DerivesHasCopyAssign : HasCopyAssign {};121struct DerivesHasMoveAssign : HasMoveAssign {};122struct DerivesHasDest : HasDest {};123struct DerivesHasPriv : HasPriv {};124struct DerivesHasProt : HasProt {};125struct DerivesHasRef : HasRef {};126struct DerivesHasVirt : HasVirt {};127struct DerivesHasMoveCtor : HasMoveCtor {};128 129struct HasNoThrowCopyAssign {130 void operator =(const HasNoThrowCopyAssign&) throw();131};132struct HasMultipleCopyAssign {133 void operator =(const HasMultipleCopyAssign&) throw();134 void operator =(volatile HasMultipleCopyAssign&);135};136struct HasMultipleNoThrowCopyAssign {137 void operator =(const HasMultipleNoThrowCopyAssign&) throw();138 void operator =(volatile HasMultipleNoThrowCopyAssign&) throw();139};140 141struct HasNoThrowConstructor { HasNoThrowConstructor() throw(); };142struct HasNoThrowConstructorWithArgs {143 HasNoThrowConstructorWithArgs(HasCons i = HasCons(0)) throw();144};145struct HasMultipleDefaultConstructor1 {146 HasMultipleDefaultConstructor1() throw();147 HasMultipleDefaultConstructor1(int i = 0);148};149struct HasMultipleDefaultConstructor2 {150 HasMultipleDefaultConstructor2(int i = 0);151 HasMultipleDefaultConstructor2() throw();152};153 154struct HasNoThrowCopy { HasNoThrowCopy(const HasNoThrowCopy&) throw(); };155struct HasMultipleCopy {156 HasMultipleCopy(const HasMultipleCopy&) throw();157 HasMultipleCopy(volatile HasMultipleCopy&);158};159struct HasMultipleNoThrowCopy {160 HasMultipleNoThrowCopy(const HasMultipleNoThrowCopy&) throw();161 HasMultipleNoThrowCopy(volatile HasMultipleNoThrowCopy&) throw();162};163 164struct HasVirtDest { virtual ~HasVirtDest(); };165struct DerivedVirtDest : HasVirtDest {};166typedef HasVirtDest VirtDestAr[1];167 168class AllPrivate {169 AllPrivate() throw();170 AllPrivate(const AllPrivate&) throw();171 AllPrivate &operator=(const AllPrivate &) throw();172 ~AllPrivate() throw();173};174 175struct ThreeArgCtor {176 ThreeArgCtor(int*, char*, int);177};178 179struct VariadicCtor {180 template<typename...T> VariadicCtor(T...);181};182 183struct ThrowingDtor {184 ~ThrowingDtor()185#if __cplusplus <= 201402L186 throw(int);187#else188 noexcept(false);189#endif190};191 192struct NoExceptDtor {193 ~NoExceptDtor() noexcept(true);194};195 196struct NoThrowDtor {197 ~NoThrowDtor() throw();198};199 200struct ACompleteType {};201struct AnIncompleteType; // expected-note 1+ {{forward declaration of 'AnIncompleteType'}}202typedef AnIncompleteType AnIncompleteTypeAr[42];203typedef AnIncompleteType AnIncompleteTypeArNB[];204typedef AnIncompleteType AnIncompleteTypeArMB[1][10];205 206struct HasInClassInit {207 int x = 42;208};209 210struct HasPrivateBase : private ACompleteType {};211struct HasProtectedBase : protected ACompleteType {};212struct HasVirtBase : virtual ACompleteType {};213 214void is_pod()215{216 static_assert(__is_pod(int));217 static_assert(__is_pod(Enum));218 static_assert(__is_pod(POD));219 static_assert(__is_pod(Int));220 static_assert(__is_pod(IntAr));221 static_assert(__is_pod(Statics));222 static_assert(__is_pod(Empty));223 static_assert(__is_pod(EmptyUnion));224 static_assert(__is_pod(Union));225 static_assert(__is_pod(HasFunc));226 static_assert(__is_pod(HasOp));227 static_assert(__is_pod(HasConv));228 static_assert(__is_pod(HasAssign));229 static_assert(__is_pod(IntArNB));230 static_assert(__is_pod(HasAnonymousUnion));231 static_assert(__is_pod(Vector));232 static_assert(__is_pod(VectorExt));233 static_assert(__is_pod(Derives));234 static_assert(__is_pod(DerivesAr));235 static_assert(__is_pod(DerivesArNB));236 static_assert(__is_pod(DerivesEmpty));237 static_assert(__is_pod(HasPriv));238 static_assert(__is_pod(HasProt));239 static_assert(__is_pod(DerivesHasPriv));240 static_assert(__is_pod(DerivesHasProt));241 242 static_assert(!__is_pod(HasCons));243 static_assert(!__is_pod(HasCopyAssign));244 static_assert(!__is_pod(HasMoveAssign));245 static_assert(!__is_pod(HasDest));246 static_assert(!__is_pod(HasRef));247 static_assert(!__is_pod(HasVirt));248 static_assert(!__is_pod(DerivesHasCons));249 static_assert(!__is_pod(DerivesHasCopyAssign));250 static_assert(!__is_pod(DerivesHasMoveAssign));251 static_assert(!__is_pod(DerivesHasDest));252 static_assert(!__is_pod(DerivesHasRef));253 static_assert(!__is_pod(DerivesHasVirt));254 static_assert(!__is_pod(NonPOD));255 static_assert(!__is_pod(HasNonPOD));256 static_assert(!__is_pod(NonPODAr));257 static_assert(!__is_pod(NonPODArNB));258 static_assert(!__is_pod(void));259 static_assert(!__is_pod(cvoid));260// static_assert(!__is_pod(NonPODUnion));261 262 static_assert(__is_pod(ACompleteType));263 static_assert(!__is_pod(AnIncompleteType)); // expected-error {{incomplete type}}264 static_assert(!__is_pod(AnIncompleteType[])); // expected-error {{incomplete type}}265 static_assert(!__is_pod(AnIncompleteType[1])); // expected-error {{incomplete type}}266}267 268typedef Empty EmptyAr[10];269struct Bit0 { int : 0; };270struct Bit0Cons { int : 0; Bit0Cons(); };271struct AnonBitOnly { int : 3; };272struct BitOnly { int x : 3; };273struct DerivesVirt : virtual POD {};274 275void is_empty()276{277 static_assert(__is_empty(Empty));278 static_assert(__is_empty(DerivesEmpty));279 static_assert(__is_empty(HasCons));280 static_assert(__is_empty(HasCopyAssign));281 static_assert(__is_empty(HasMoveAssign));282 static_assert(__is_empty(HasDest));283 static_assert(__is_empty(HasFunc));284 static_assert(__is_empty(HasOp));285 static_assert(__is_empty(HasConv));286 static_assert(__is_empty(HasAssign));287 static_assert(__is_empty(Bit0));288 static_assert(__is_empty(Bit0Cons));289 290 static_assert(!__is_empty(Int));291 static_assert(!__is_empty(POD));292 static_assert(!__is_empty(EmptyUnion));293 static_assert(!__is_empty(IncompleteUnion));294 static_assert(!__is_empty(EmptyAr));295 static_assert(!__is_empty(HasRef));296 static_assert(!__is_empty(HasVirt));297 static_assert(!__is_empty(AnonBitOnly));298 static_assert(!__is_empty(BitOnly));299 static_assert(!__is_empty(void));300 static_assert(!__is_empty(IntArNB));301 static_assert(!__is_empty(HasAnonymousUnion));302// static_assert(!__is_empty(DerivesVirt));303 304 static_assert(__is_empty(ACompleteType));305 static_assert(!__is_empty(AnIncompleteType)); // expected-error {{incomplete type}}306 static_assert(!__is_empty(AnIncompleteType[]));307 static_assert(!__is_empty(AnIncompleteType[1]));308}309 310typedef Derives ClassType;311 312void is_class()313{314 static_assert(__is_class(Derives));315 static_assert(__is_class(HasPriv));316 static_assert(__is_class(ClassType));317 static_assert(__is_class(HasAnonymousUnion));318 319 static_assert(!__is_class(int));320 static_assert(!__is_class(Enum));321 static_assert(!__is_class(Int));322 static_assert(!__is_class(IntAr));323 static_assert(!__is_class(DerivesAr));324 static_assert(!__is_class(Union));325 static_assert(!__is_class(cvoid));326 static_assert(!__is_class(IntArNB));327}328 329typedef Union UnionAr[10];330typedef Union UnionType;331 332void is_union()333{334 static_assert(__is_union(Union));335 static_assert(__is_union(UnionType));336 337 static_assert(!__is_union(int));338 static_assert(!__is_union(Enum));339 static_assert(!__is_union(Int));340 static_assert(!__is_union(IntAr));341 static_assert(!__is_union(UnionAr));342 static_assert(!__is_union(cvoid));343 static_assert(!__is_union(IntArNB));344 static_assert(!__is_union(HasAnonymousUnion));345}346 347typedef Enum EnumType;348typedef EnumClass EnumClassType;349 350void is_enum()351{352 static_assert(__is_enum(Enum));353 static_assert(__is_enum(EnumType));354 static_assert(__is_enum(SignedEnum));355 static_assert(__is_enum(UnsignedEnum));356 357 static_assert(__is_enum(EnumClass));358 static_assert(__is_enum(EnumClassType));359 static_assert(__is_enum(SignedEnumClass));360 static_assert(__is_enum(UnsignedEnumClass));361 362 static_assert(!__is_enum(int));363 static_assert(!__is_enum(Union));364 static_assert(!__is_enum(Int));365 static_assert(!__is_enum(IntAr));366 static_assert(!__is_enum(UnionAr));367 static_assert(!__is_enum(Derives));368 static_assert(!__is_enum(ClassType));369 static_assert(!__is_enum(cvoid));370 static_assert(!__is_enum(IntArNB));371 static_assert(!__is_enum(HasAnonymousUnion));372 static_assert(!__is_enum(AnIncompleteType));373 static_assert(!__is_enum(AnIncompleteTypeAr));374 static_assert(!__is_enum(AnIncompleteTypeArMB));375 static_assert(!__is_enum(AnIncompleteTypeArNB));376}377 378void is_scoped_enum() {379 static_assert(!__is_scoped_enum(Enum));380 static_assert(!__is_scoped_enum(EnumType));381 static_assert(!__is_scoped_enum(SignedEnum));382 static_assert(!__is_scoped_enum(UnsignedEnum));383 384 static_assert(__is_scoped_enum(EnumClass));385 static_assert(__is_scoped_enum(EnumClassType));386 static_assert(__is_scoped_enum(SignedEnumClass));387 static_assert(__is_scoped_enum(UnsignedEnumClass));388 389 static_assert(!__is_scoped_enum(int));390 static_assert(!__is_scoped_enum(Union));391 static_assert(!__is_scoped_enum(Int));392 static_assert(!__is_scoped_enum(IntAr));393 static_assert(!__is_scoped_enum(UnionAr));394 static_assert(!__is_scoped_enum(Derives));395 static_assert(!__is_scoped_enum(ClassType));396 static_assert(!__is_scoped_enum(cvoid));397 static_assert(!__is_scoped_enum(IntArNB));398 static_assert(!__is_scoped_enum(HasAnonymousUnion));399 static_assert(!__is_scoped_enum(AnIncompleteType));400 static_assert(!__is_scoped_enum(AnIncompleteTypeAr));401 static_assert(!__is_scoped_enum(AnIncompleteTypeArMB));402 static_assert(!__is_scoped_enum(AnIncompleteTypeArNB));403}404 405struct FinalClass final {406};407 408template<typename T>409struct PotentiallyFinal { };410 411template<typename T>412struct PotentiallyFinal<T*> final { };413 414template<>415struct PotentiallyFinal<int> final { };416 417struct FwdDeclFinal;418using FwdDeclFinalAlias = FwdDeclFinal;419struct FwdDeclFinal final {};420 421 422 423 424void is_final()425{426 static_assert(__is_final(FinalClass));427 static_assert(__is_final(PotentiallyFinal<float*>));428 static_assert(__is_final(PotentiallyFinal<int>));429 static_assert(__is_final(FwdDeclFinal));430 static_assert(__is_final(FwdDeclFinalAlias));431 432 static_assert(!__is_final(int));433 static_assert(!__is_final(Union));434 static_assert(!__is_final(Int));435 static_assert(!__is_final(IntAr));436 static_assert(!__is_final(UnionAr));437 static_assert(!__is_final(Derives));438 static_assert(!__is_final(ClassType));439 static_assert(!__is_final(cvoid));440 static_assert(!__is_final(IntArNB));441 static_assert(!__is_final(HasAnonymousUnion));442}443 444 445typedef HasVirt Polymorph;446struct InheritPolymorph : Polymorph {};447 448void is_polymorphic()449{450 static_assert(__is_polymorphic(Polymorph));451 static_assert(__is_polymorphic(InheritPolymorph));452 453 static_assert(!__is_polymorphic(int));454 static_assert(!__is_polymorphic(Union));455 static_assert(!__is_polymorphic(IncompleteUnion));456 static_assert(!__is_polymorphic(Int));457 static_assert(!__is_polymorphic(IntAr));458 static_assert(!__is_polymorphic(UnionAr));459 static_assert(!__is_polymorphic(Derives));460 static_assert(!__is_polymorphic(ClassType));461 static_assert(!__is_polymorphic(Enum));462 static_assert(!__is_polymorphic(cvoid));463 static_assert(!__is_polymorphic(IntArNB));464}465 466void is_integral()467{468 static_assert(__is_integral(bool));469 static_assert(__is_integral(char));470 static_assert(__is_integral(signed char));471 static_assert(__is_integral(unsigned char));472 //static_assert(__is_integral(char16_t));473 //static_assert(__is_integral(char32_t));474 static_assert(__is_integral(wchar_t));475 static_assert(__is_integral(short));476 static_assert(__is_integral(unsigned short));477 static_assert(__is_integral(int));478 static_assert(__is_integral(unsigned int));479 static_assert(__is_integral(long));480 static_assert(__is_integral(unsigned long));481 482 static_assert(!__is_integral(float));483 static_assert(!__is_integral(double));484 static_assert(!__is_integral(long double));485 static_assert(!__is_integral(Union));486 static_assert(!__is_integral(UnionAr));487 static_assert(!__is_integral(Derives));488 static_assert(!__is_integral(ClassType));489 static_assert(!__is_integral(Enum));490 static_assert(!__is_integral(void));491 static_assert(!__is_integral(cvoid));492 static_assert(!__is_integral(IntArNB));493}494 495void is_floating_point()496{497 static_assert(__is_floating_point(float));498 static_assert(__is_floating_point(double));499 static_assert(__is_floating_point(long double));500 501 static_assert(!__is_floating_point(bool));502 static_assert(!__is_floating_point(char));503 static_assert(!__is_floating_point(signed char));504 static_assert(!__is_floating_point(unsigned char));505 //static_assert(!__is_floating_point(char16_t));506 //static_assert(!__is_floating_point(char32_t));507 static_assert(!__is_floating_point(wchar_t));508 static_assert(!__is_floating_point(short));509 static_assert(!__is_floating_point(unsigned short));510 static_assert(!__is_floating_point(int));511 static_assert(!__is_floating_point(unsigned int));512 static_assert(!__is_floating_point(long));513 static_assert(!__is_floating_point(unsigned long));514 static_assert(!__is_floating_point(Union));515 static_assert(!__is_floating_point(UnionAr));516 static_assert(!__is_floating_point(Derives));517 static_assert(!__is_floating_point(ClassType));518 static_assert(!__is_floating_point(Enum));519 static_assert(!__is_floating_point(void));520 static_assert(!__is_floating_point(cvoid));521 static_assert(!__is_floating_point(IntArNB));522}523 524template <class T>525struct AggregateTemplate {526 T value;527};528 529template <class T>530struct NonAggregateTemplate {531 T value;532 NonAggregateTemplate();533};534 535void is_aggregate()536{537 constexpr bool TrueAfterCpp11 = __cplusplus > 201103L;538 constexpr bool TrueAfterCpp14 = __cplusplus > 201402L;539 540 __is_aggregate(AnIncompleteType); // expected-error {{incomplete type}}541 __is_aggregate(IncompleteUnion); // expected-error {{incomplete type}}542 543 // Valid since LWG3823544 static_assert(__is_aggregate(AnIncompleteType[]));545 static_assert(__is_aggregate(AnIncompleteType[1]));546 static_assert(__is_aggregate(AnIncompleteTypeAr));547 static_assert(__is_aggregate(AnIncompleteTypeArNB));548 static_assert(__is_aggregate(AnIncompleteTypeArMB));549 550 static_assert(!__is_aggregate(NonPOD));551 static_assert(__is_aggregate(NonPODAr));552 static_assert(__is_aggregate(NonPODArNB));553 static_assert(__is_aggregate(NonPODArMB));554 555 static_assert(!__is_aggregate(Enum));556 static_assert(__is_aggregate(POD));557 static_assert(__is_aggregate(Empty));558 static_assert(__is_aggregate(EmptyAr));559 static_assert(__is_aggregate(EmptyArNB));560 static_assert(__is_aggregate(EmptyArMB));561 static_assert(!__is_aggregate(void));562 static_assert(!__is_aggregate(const volatile void));563 static_assert(!__is_aggregate(int));564 static_assert(__is_aggregate(IntAr));565 static_assert(__is_aggregate(IntArNB));566 static_assert(__is_aggregate(EmptyUnion));567 static_assert(__is_aggregate(Union));568 static_assert(__is_aggregate(Statics));569 static_assert(__is_aggregate(HasFunc));570 static_assert(__is_aggregate(HasOp));571 static_assert(__is_aggregate(HasAssign));572 static_assert(__is_aggregate(HasAnonymousUnion));573 574 static_assert(__is_aggregate(Derives) == TrueAfterCpp14);575 static_assert(__is_aggregate(DerivesAr));576 static_assert(__is_aggregate(DerivesArNB));577 static_assert(!__is_aggregate(HasCons));578#if __cplusplus >= 202002L579 static_assert(!__is_aggregate(HasDefaultCons));580#else581 static_assert(__is_aggregate(HasDefaultCons));582#endif583 static_assert(!__is_aggregate(HasExplicitDefaultCons));584 static_assert(!__is_aggregate(HasInheritedCons));585 static_assert(__is_aggregate(HasNoInheritedCons) == TrueAfterCpp14);586 static_assert(__is_aggregate(HasCopyAssign));587 static_assert(!__is_aggregate(NonTrivialDefault));588 static_assert(__is_aggregate(HasDest));589 static_assert(!__is_aggregate(HasPriv));590 static_assert(!__is_aggregate(HasProt));591 static_assert(__is_aggregate(HasRefAggregate));592 static_assert(__is_aggregate(HasNonPOD));593 static_assert(!__is_aggregate(HasVirt));594 static_assert(__is_aggregate(VirtAr));595 static_assert(__is_aggregate(HasInClassInit) == TrueAfterCpp11);596 static_assert(!__is_aggregate(HasPrivateBase));597 static_assert(!__is_aggregate(HasProtectedBase));598 static_assert(!__is_aggregate(HasVirtBase));599 600 static_assert(__is_aggregate(AggregateTemplate<int>));601 static_assert(!__is_aggregate(NonAggregateTemplate<int>));602 603 static_assert(__is_aggregate(Vector)); // Extension supported by GCC and Clang604 static_assert(__is_aggregate(VectorExt));605 static_assert(__is_aggregate(ComplexInt));606 static_assert(__is_aggregate(ComplexFloat));607}608 609void is_arithmetic()610{611 static_assert(__is_arithmetic(float));612 static_assert(__is_arithmetic(double));613 static_assert(__is_arithmetic(long double));614 static_assert(__is_arithmetic(bool));615 static_assert(__is_arithmetic(char));616 static_assert(__is_arithmetic(signed char));617 static_assert(__is_arithmetic(unsigned char));618 //static_assert(__is_arithmetic(char16_t));619 //static_assert(__is_arithmetic(char32_t));620 static_assert(__is_arithmetic(wchar_t));621 static_assert(__is_arithmetic(short));622 static_assert(__is_arithmetic(unsigned short));623 static_assert(__is_arithmetic(int));624 static_assert(__is_arithmetic(unsigned int));625 static_assert(__is_arithmetic(long));626 static_assert(__is_arithmetic(unsigned long));627 628 static_assert(!__is_arithmetic(Union));629 static_assert(!__is_arithmetic(UnionAr));630 static_assert(!__is_arithmetic(Derives));631 static_assert(!__is_arithmetic(ClassType));632 static_assert(!__is_arithmetic(Enum));633 static_assert(!__is_arithmetic(void));634 static_assert(!__is_arithmetic(cvoid));635 static_assert(!__is_arithmetic(IntArNB));636}637 638void is_complete_type()639{640 static_assert(__is_complete_type(float));641 static_assert(__is_complete_type(double));642 static_assert(__is_complete_type(long double));643 static_assert(__is_complete_type(bool));644 static_assert(__is_complete_type(char));645 static_assert(__is_complete_type(signed char));646 static_assert(__is_complete_type(unsigned char));647 //static_assert(__is_complete_type(char16_t));648 //static_assert(__is_complete_type(char32_t));649 static_assert(__is_complete_type(wchar_t));650 static_assert(__is_complete_type(short));651 static_assert(__is_complete_type(unsigned short));652 static_assert(__is_complete_type(int));653 static_assert(__is_complete_type(unsigned int));654 static_assert(__is_complete_type(long));655 static_assert(__is_complete_type(unsigned long));656 static_assert(__is_complete_type(ACompleteType));657 658 static_assert(!__is_complete_type(AnIncompleteType));659}660 661void is_void()662{663 static_assert(__is_void(void));664 static_assert(__is_void(cvoid));665 666 static_assert(!__is_void(float));667 static_assert(!__is_void(double));668 static_assert(!__is_void(long double));669 static_assert(!__is_void(bool));670 static_assert(!__is_void(char));671 static_assert(!__is_void(signed char));672 static_assert(!__is_void(unsigned char));673 static_assert(!__is_void(wchar_t));674 static_assert(!__is_void(short));675 static_assert(!__is_void(unsigned short));676 static_assert(!__is_void(int));677 static_assert(!__is_void(unsigned int));678 static_assert(!__is_void(long));679 static_assert(!__is_void(unsigned long));680 static_assert(!__is_void(Union));681 static_assert(!__is_void(UnionAr));682 static_assert(!__is_void(Derives));683 static_assert(!__is_void(ClassType));684 static_assert(!__is_void(Enum));685 static_assert(!__is_void(IntArNB));686 static_assert(!__is_void(void*));687 static_assert(!__is_void(cvoid*));688}689 690void is_array()691{692 static_assert(__is_array(IntAr));693 static_assert(__is_array(IntArNB));694 static_assert(!__is_array(IntArZero));695 static_assert(__is_array(UnionAr));696 697 static_assert(!__is_array(void));698 static_assert(!__is_array(cvoid));699 static_assert(!__is_array(float));700 static_assert(!__is_array(double));701 static_assert(!__is_array(long double));702 static_assert(!__is_array(bool));703 static_assert(!__is_array(char));704 static_assert(!__is_array(signed char));705 static_assert(!__is_array(unsigned char));706 static_assert(!__is_array(wchar_t));707 static_assert(!__is_array(short));708 static_assert(!__is_array(unsigned short));709 static_assert(!__is_array(int));710 static_assert(!__is_array(unsigned int));711 static_assert(!__is_array(long));712 static_assert(!__is_array(unsigned long));713 static_assert(!__is_array(Union));714 static_assert(!__is_array(Derives));715 static_assert(!__is_array(ClassType));716 static_assert(!__is_array(Enum));717 static_assert(!__is_array(void*));718 static_assert(!__is_array(cvoid*));719}720 721void is_bounded_array(int n) {722 static_assert(__is_bounded_array(IntAr));723 static_assert(!__is_bounded_array(IntArNB));724 static_assert(!__is_bounded_array(IntArZero));725 static_assert(__is_bounded_array(UnionAr));726 727 static_assert(!__is_bounded_array(void));728 static_assert(!__is_bounded_array(cvoid));729 static_assert(!__is_bounded_array(float));730 static_assert(!__is_bounded_array(double));731 static_assert(!__is_bounded_array(long double));732 static_assert(!__is_bounded_array(bool));733 static_assert(!__is_bounded_array(char));734 static_assert(!__is_bounded_array(signed char));735 static_assert(!__is_bounded_array(unsigned char));736 static_assert(!__is_bounded_array(wchar_t));737 static_assert(!__is_bounded_array(short));738 static_assert(!__is_bounded_array(unsigned short));739 static_assert(!__is_bounded_array(int));740 static_assert(!__is_bounded_array(unsigned int));741 static_assert(!__is_bounded_array(long));742 static_assert(!__is_bounded_array(unsigned long));743 static_assert(!__is_bounded_array(Union));744 static_assert(!__is_bounded_array(Derives));745 static_assert(!__is_bounded_array(ClassType));746 static_assert(!__is_bounded_array(Enum));747 static_assert(!__is_bounded_array(void *));748 static_assert(!__is_bounded_array(cvoid *));749 750 int t32[n];751 (void)__is_bounded_array(decltype(t32)); // expected-error{{variable length arrays are not supported in '__is_bounded_array'}}752}753 754void is_unbounded_array(int n) {755 static_assert(!__is_unbounded_array(IntAr));756 static_assert(__is_unbounded_array(IntArNB));757 static_assert(!__is_unbounded_array(IntArZero));758 static_assert(!__is_unbounded_array(UnionAr));759 760 static_assert(!__is_unbounded_array(void));761 static_assert(!__is_unbounded_array(cvoid));762 static_assert(!__is_unbounded_array(float));763 static_assert(!__is_unbounded_array(double));764 static_assert(!__is_unbounded_array(long double));765 static_assert(!__is_unbounded_array(bool));766 static_assert(!__is_unbounded_array(char));767 static_assert(!__is_unbounded_array(signed char));768 static_assert(!__is_unbounded_array(unsigned char));769 static_assert(!__is_unbounded_array(wchar_t));770 static_assert(!__is_unbounded_array(short));771 static_assert(!__is_unbounded_array(unsigned short));772 static_assert(!__is_unbounded_array(int));773 static_assert(!__is_unbounded_array(unsigned int));774 static_assert(!__is_unbounded_array(long));775 static_assert(!__is_unbounded_array(unsigned long));776 static_assert(!__is_unbounded_array(Union));777 static_assert(!__is_unbounded_array(Derives));778 static_assert(!__is_unbounded_array(ClassType));779 static_assert(!__is_unbounded_array(Enum));780 static_assert(!__is_unbounded_array(void *));781 static_assert(!__is_unbounded_array(cvoid *));782 783 int t32[n];784 (void)__is_unbounded_array(decltype(t32)); // expected-error{{variable length arrays are not supported in '__is_unbounded_array'}}785}786 787template <typename T> void tmpl_func(T&) {}788 789template <typename T> struct type_wrapper {790 typedef T type;791 typedef T* ptrtype;792 typedef T& reftype;793};794 795void is_function()796{797 static_assert(__is_function(type_wrapper<void(void)>::type));798 static_assert(__is_function(typeof(tmpl_func<int>)));799 800 typedef void (*ptr_to_func_type)(void);801 802 static_assert(!__is_function(void));803 static_assert(!__is_function(cvoid));804 static_assert(!__is_function(float));805 static_assert(!__is_function(double));806 static_assert(!__is_function(long double));807 static_assert(!__is_function(bool));808 static_assert(!__is_function(char));809 static_assert(!__is_function(signed char));810 static_assert(!__is_function(unsigned char));811 static_assert(!__is_function(wchar_t));812 static_assert(!__is_function(short));813 static_assert(!__is_function(unsigned short));814 static_assert(!__is_function(int));815 static_assert(!__is_function(unsigned int));816 static_assert(!__is_function(long));817 static_assert(!__is_function(unsigned long));818 static_assert(!__is_function(Union));819 static_assert(!__is_function(Derives));820 static_assert(!__is_function(ClassType));821 static_assert(!__is_function(Enum));822 static_assert(!__is_function(void*));823 static_assert(!__is_function(cvoid*));824 static_assert(!__is_function(void(*)()));825 static_assert(!__is_function(ptr_to_func_type));826 static_assert(!__is_function(type_wrapper<void(void)>::ptrtype));827 static_assert(!__is_function(type_wrapper<void(void)>::reftype));828}829 830void is_reference()831{832 static_assert(__is_reference(int&));833 static_assert(__is_reference(const int&));834 static_assert(__is_reference(void *&));835 836 static_assert(!__is_reference(int));837 static_assert(!__is_reference(const int));838 static_assert(!__is_reference(void *));839}840 841void is_lvalue_reference()842{843 static_assert(__is_lvalue_reference(int&));844 static_assert(__is_lvalue_reference(void *&));845 static_assert(__is_lvalue_reference(const int&));846 static_assert(__is_lvalue_reference(void * const &));847 848 static_assert(!__is_lvalue_reference(int));849 static_assert(!__is_lvalue_reference(const int));850 static_assert(!__is_lvalue_reference(void *));851}852 853#if __has_feature(cxx_rvalue_references)854 855void is_rvalue_reference()856{857 static_assert(__is_rvalue_reference(const int&&));858 static_assert(__is_rvalue_reference(void * const &&));859 860 static_assert(!__is_rvalue_reference(int&));861 static_assert(!__is_rvalue_reference(void *&));862 static_assert(!__is_rvalue_reference(const int&));863 static_assert(!__is_rvalue_reference(void * const &));864 static_assert(!__is_rvalue_reference(int));865 static_assert(!__is_rvalue_reference(const int));866 static_assert(!__is_rvalue_reference(void *));867}868 869#endif870 871void is_fundamental()872{873 static_assert(__is_fundamental(float));874 static_assert(__is_fundamental(double));875 static_assert(__is_fundamental(long double));876 static_assert(__is_fundamental(bool));877 static_assert(__is_fundamental(char));878 static_assert(__is_fundamental(signed char));879 static_assert(__is_fundamental(unsigned char));880 //static_assert(__is_fundamental(char16_t));881 //static_assert(__is_fundamental(char32_t));882 static_assert(__is_fundamental(wchar_t));883 static_assert(__is_fundamental(short));884 static_assert(__is_fundamental(unsigned short));885 static_assert(__is_fundamental(int));886 static_assert(__is_fundamental(unsigned int));887 static_assert(__is_fundamental(long));888 static_assert(__is_fundamental(unsigned long));889 static_assert(__is_fundamental(void));890 static_assert(__is_fundamental(cvoid));891 static_assert(__is_fundamental(decltype(nullptr)));892 893 static_assert(!__is_fundamental(Union));894 static_assert(!__is_fundamental(UnionAr));895 static_assert(!__is_fundamental(Derives));896 static_assert(!__is_fundamental(ClassType));897 static_assert(!__is_fundamental(Enum));898 static_assert(!__is_fundamental(IntArNB));899}900 901void is_object()902{903 static_assert(__is_object(int));904 static_assert(__is_object(int *));905 static_assert(__is_object(void *));906 static_assert(__is_object(Union));907 static_assert(__is_object(UnionAr));908 static_assert(__is_object(ClassType));909 static_assert(__is_object(Enum));910 911 static_assert(!__is_object(type_wrapper<void(void)>::type));912 static_assert(!__is_object(int&));913 static_assert(!__is_object(void));914}915 916void is_scalar()917{918 static_assert(__is_scalar(float));919 static_assert(__is_scalar(double));920 static_assert(__is_scalar(long double));921 static_assert(__is_scalar(bool));922 static_assert(__is_scalar(char));923 static_assert(__is_scalar(signed char));924 static_assert(__is_scalar(unsigned char));925 static_assert(__is_scalar(wchar_t));926 static_assert(__is_scalar(short));927 static_assert(__is_scalar(unsigned short));928 static_assert(__is_scalar(int));929 static_assert(__is_scalar(unsigned int));930 static_assert(__is_scalar(long));931 static_assert(__is_scalar(unsigned long));932 static_assert(__is_scalar(Enum));933 static_assert(__is_scalar(void*));934 static_assert(__is_scalar(cvoid*));935 936 static_assert(!__is_scalar(void));937 static_assert(!__is_scalar(cvoid));938 static_assert(!__is_scalar(Union));939 static_assert(!__is_scalar(UnionAr));940 static_assert(!__is_scalar(Derives));941 static_assert(!__is_scalar(ClassType));942 static_assert(!__is_scalar(IntArNB));943}944 945struct StructWithMembers {946 int member;947 void method() {}948};949 950void is_compound()951{952 static_assert(__is_compound(void*));953 static_assert(__is_compound(cvoid*));954 static_assert(__is_compound(void (*)()));955 static_assert(__is_compound(int StructWithMembers::*));956 static_assert(__is_compound(void (StructWithMembers::*)()));957 static_assert(__is_compound(int&));958 static_assert(__is_compound(Union));959 static_assert(__is_compound(UnionAr));960 static_assert(__is_compound(Derives));961 static_assert(__is_compound(ClassType));962 static_assert(__is_compound(IntArNB));963 static_assert(__is_compound(Enum));964 965 static_assert(!__is_compound(float));966 static_assert(!__is_compound(double));967 static_assert(!__is_compound(long double));968 static_assert(!__is_compound(bool));969 static_assert(!__is_compound(char));970 static_assert(!__is_compound(signed char));971 static_assert(!__is_compound(unsigned char));972 static_assert(!__is_compound(wchar_t));973 static_assert(!__is_compound(short));974 static_assert(!__is_compound(unsigned short));975 static_assert(!__is_compound(int));976 static_assert(!__is_compound(unsigned int));977 static_assert(!__is_compound(long));978 static_assert(!__is_compound(unsigned long));979 static_assert(!__is_compound(void));980 static_assert(!__is_compound(cvoid));981}982 983void is_pointer()984{985 StructWithMembers x;986 987 static_assert(__is_pointer(void*));988 static_assert(__is_pointer(cvoid*));989 static_assert(__is_pointer(cvoid*));990 static_assert(__is_pointer(char*));991 static_assert(__is_pointer(int*));992 static_assert(__is_pointer(int**));993 static_assert(__is_pointer(ClassType*));994 static_assert(__is_pointer(Derives*));995 static_assert(__is_pointer(Enum*));996 static_assert(__is_pointer(IntArNB*));997 static_assert(__is_pointer(Union*));998 static_assert(__is_pointer(UnionAr*));999 static_assert(__is_pointer(StructWithMembers*));1000 static_assert(__is_pointer(void (*)()));1001 1002 static_assert(!__is_pointer(void));1003 static_assert(!__is_pointer(cvoid));1004 static_assert(!__is_pointer(cvoid));1005 static_assert(!__is_pointer(char));1006 static_assert(!__is_pointer(int));1007 static_assert(!__is_pointer(int));1008 static_assert(!__is_pointer(ClassType));1009 static_assert(!__is_pointer(Derives));1010 static_assert(!__is_pointer(Enum));1011 static_assert(!__is_pointer(IntArNB));1012 static_assert(!__is_pointer(Union));1013 static_assert(!__is_pointer(UnionAr));1014 static_assert(!__is_pointer(StructWithMembers));1015 static_assert(!__is_pointer(int StructWithMembers::*));1016 static_assert(!__is_pointer(void (StructWithMembers::*) ()));1017}1018 1019void is_member_object_pointer()1020{1021 StructWithMembers x;1022 1023 static_assert(__is_member_object_pointer(int StructWithMembers::*));1024 1025 static_assert(!__is_member_object_pointer(void (StructWithMembers::*) ()));1026 static_assert(!__is_member_object_pointer(void*));1027 static_assert(!__is_member_object_pointer(cvoid*));1028 static_assert(!__is_member_object_pointer(cvoid*));1029 static_assert(!__is_member_object_pointer(char*));1030 static_assert(!__is_member_object_pointer(int*));1031 static_assert(!__is_member_object_pointer(int**));1032 static_assert(!__is_member_object_pointer(ClassType*));1033 static_assert(!__is_member_object_pointer(Derives*));1034 static_assert(!__is_member_object_pointer(Enum*));1035 static_assert(!__is_member_object_pointer(IntArNB*));1036 static_assert(!__is_member_object_pointer(Union*));1037 static_assert(!__is_member_object_pointer(UnionAr*));1038 static_assert(!__is_member_object_pointer(StructWithMembers*));1039 static_assert(!__is_member_object_pointer(void));1040 static_assert(!__is_member_object_pointer(cvoid));1041 static_assert(!__is_member_object_pointer(cvoid));1042 static_assert(!__is_member_object_pointer(char));1043 static_assert(!__is_member_object_pointer(int));1044 static_assert(!__is_member_object_pointer(int));1045 static_assert(!__is_member_object_pointer(ClassType));1046 static_assert(!__is_member_object_pointer(Derives));1047 static_assert(!__is_member_object_pointer(Enum));1048 static_assert(!__is_member_object_pointer(IntArNB));1049 static_assert(!__is_member_object_pointer(Union));1050 static_assert(!__is_member_object_pointer(UnionAr));1051 static_assert(!__is_member_object_pointer(StructWithMembers));1052 static_assert(!__is_member_object_pointer(void (*)()));1053}1054 1055void is_member_function_pointer()1056{1057 StructWithMembers x;1058 1059 static_assert(__is_member_function_pointer(void (StructWithMembers::*) ()));1060 1061 static_assert(!__is_member_function_pointer(int StructWithMembers::*));1062 static_assert(!__is_member_function_pointer(void*));1063 static_assert(!__is_member_function_pointer(cvoid*));1064 static_assert(!__is_member_function_pointer(cvoid*));1065 static_assert(!__is_member_function_pointer(char*));1066 static_assert(!__is_member_function_pointer(int*));1067 static_assert(!__is_member_function_pointer(int**));1068 static_assert(!__is_member_function_pointer(ClassType*));1069 static_assert(!__is_member_function_pointer(Derives*));1070 static_assert(!__is_member_function_pointer(Enum*));1071 static_assert(!__is_member_function_pointer(IntArNB*));1072 static_assert(!__is_member_function_pointer(Union*));1073 static_assert(!__is_member_function_pointer(UnionAr*));1074 static_assert(!__is_member_function_pointer(StructWithMembers*));1075 static_assert(!__is_member_function_pointer(void));1076 static_assert(!__is_member_function_pointer(cvoid));1077 static_assert(!__is_member_function_pointer(cvoid));1078 static_assert(!__is_member_function_pointer(char));1079 static_assert(!__is_member_function_pointer(int));1080 static_assert(!__is_member_function_pointer(int));1081 static_assert(!__is_member_function_pointer(ClassType));1082 static_assert(!__is_member_function_pointer(Derives));1083 static_assert(!__is_member_function_pointer(Enum));1084 static_assert(!__is_member_function_pointer(IntArNB));1085 static_assert(!__is_member_function_pointer(Union));1086 static_assert(!__is_member_function_pointer(UnionAr));1087 static_assert(!__is_member_function_pointer(StructWithMembers));1088 static_assert(!__is_member_function_pointer(void (*)()));1089}1090 1091void is_member_pointer()1092{1093 StructWithMembers x;1094 1095 static_assert(__is_member_pointer(int StructWithMembers::*));1096 static_assert(__is_member_pointer(void (StructWithMembers::*) ()));1097 1098 static_assert(!__is_member_pointer(void*));1099 static_assert(!__is_member_pointer(cvoid*));1100 static_assert(!__is_member_pointer(cvoid*));1101 static_assert(!__is_member_pointer(char*));1102 static_assert(!__is_member_pointer(int*));1103 static_assert(!__is_member_pointer(int**));1104 static_assert(!__is_member_pointer(ClassType*));1105 static_assert(!__is_member_pointer(Derives*));1106 static_assert(!__is_member_pointer(Enum*));1107 static_assert(!__is_member_pointer(IntArNB*));1108 static_assert(!__is_member_pointer(Union*));1109 static_assert(!__is_member_pointer(UnionAr*));1110 static_assert(!__is_member_pointer(StructWithMembers*));1111 static_assert(!__is_member_pointer(void));1112 static_assert(!__is_member_pointer(cvoid));1113 static_assert(!__is_member_pointer(cvoid));1114 static_assert(!__is_member_pointer(char));1115 static_assert(!__is_member_pointer(int));1116 static_assert(!__is_member_pointer(int));1117 static_assert(!__is_member_pointer(ClassType));1118 static_assert(!__is_member_pointer(Derives));1119 static_assert(!__is_member_pointer(Enum));1120 static_assert(!__is_member_pointer(IntArNB));1121 static_assert(!__is_member_pointer(Union));1122 static_assert(!__is_member_pointer(UnionAr));1123 static_assert(!__is_member_pointer(StructWithMembers));1124 static_assert(!__is_member_pointer(void (*)()));1125}1126 1127void is_const()1128{1129 static_assert(__is_const(cvoid));1130 static_assert(__is_const(const char));1131 static_assert(__is_const(const int));1132 static_assert(__is_const(const long));1133 static_assert(__is_const(const short));1134 static_assert(__is_const(const signed char));1135 static_assert(__is_const(const wchar_t));1136 static_assert(__is_const(const bool));1137 static_assert(__is_const(const float));1138 static_assert(__is_const(const double));1139 static_assert(__is_const(const long double));1140 static_assert(__is_const(const unsigned char));1141 static_assert(__is_const(const unsigned int));1142 static_assert(__is_const(const unsigned long long));1143 static_assert(__is_const(const unsigned long));1144 static_assert(__is_const(const unsigned short));1145 static_assert(__is_const(const void));1146 static_assert(__is_const(const ClassType));1147 static_assert(__is_const(const Derives));1148 static_assert(__is_const(const Enum));1149 static_assert(__is_const(const IntArNB));1150 static_assert(__is_const(const Union));1151 static_assert(__is_const(const UnionAr));1152 1153 static_assert(!__is_const(char));1154 static_assert(!__is_const(int));1155 static_assert(!__is_const(long));1156 static_assert(!__is_const(short));1157 static_assert(!__is_const(signed char));1158 static_assert(!__is_const(wchar_t));1159 static_assert(!__is_const(bool));1160 static_assert(!__is_const(float));1161 static_assert(!__is_const(double));1162 static_assert(!__is_const(long double));1163 static_assert(!__is_const(unsigned char));1164 static_assert(!__is_const(unsigned int));1165 static_assert(!__is_const(unsigned long long));1166 static_assert(!__is_const(unsigned long));1167 static_assert(!__is_const(unsigned short));1168 static_assert(!__is_const(void));1169 static_assert(!__is_const(ClassType));1170 static_assert(!__is_const(Derives));1171 static_assert(!__is_const(Enum));1172 static_assert(!__is_const(IntArNB));1173 static_assert(!__is_const(Union));1174 static_assert(!__is_const(UnionAr));1175}1176 1177void is_volatile()1178{1179 static_assert(__is_volatile(volatile char));1180 static_assert(__is_volatile(volatile int));1181 static_assert(__is_volatile(volatile long));1182 static_assert(__is_volatile(volatile short));1183 static_assert(__is_volatile(volatile signed char));1184 static_assert(__is_volatile(volatile wchar_t));1185 static_assert(__is_volatile(volatile bool));1186 static_assert(__is_volatile(volatile float));1187 static_assert(__is_volatile(volatile double));1188 static_assert(__is_volatile(volatile long double));1189 static_assert(__is_volatile(volatile unsigned char));1190 static_assert(__is_volatile(volatile unsigned int));1191 static_assert(__is_volatile(volatile unsigned long long));1192 static_assert(__is_volatile(volatile unsigned long));1193 static_assert(__is_volatile(volatile unsigned short));1194 static_assert(__is_volatile(volatile void));1195 static_assert(__is_volatile(volatile ClassType));1196 static_assert(__is_volatile(volatile Derives));1197 static_assert(__is_volatile(volatile Enum));1198 static_assert(__is_volatile(volatile IntArNB));1199 static_assert(__is_volatile(volatile Union));1200 static_assert(__is_volatile(volatile UnionAr));1201 1202 static_assert(!__is_volatile(char));1203 static_assert(!__is_volatile(int));1204 static_assert(!__is_volatile(long));1205 static_assert(!__is_volatile(short));1206 static_assert(!__is_volatile(signed char));1207 static_assert(!__is_volatile(wchar_t));1208 static_assert(!__is_volatile(bool));1209 static_assert(!__is_volatile(float));1210 static_assert(!__is_volatile(double));1211 static_assert(!__is_volatile(long double));1212 static_assert(!__is_volatile(unsigned char));1213 static_assert(!__is_volatile(unsigned int));1214 static_assert(!__is_volatile(unsigned long long));1215 static_assert(!__is_volatile(unsigned long));1216 static_assert(!__is_volatile(unsigned short));1217 static_assert(!__is_volatile(void));1218 static_assert(!__is_volatile(ClassType));1219 static_assert(!__is_volatile(Derives));1220 static_assert(!__is_volatile(Enum));1221 static_assert(!__is_volatile(IntArNB));1222 static_assert(!__is_volatile(Union));1223 static_assert(!__is_volatile(UnionAr));1224}1225 1226struct TrivialStruct {1227 int member;1228};1229 1230struct NonTrivialStruct {1231 int member;1232 NonTrivialStruct() {1233 member = 0;1234 }1235};1236 1237struct SuperNonTrivialStruct {1238 SuperNonTrivialStruct() { }1239 ~SuperNonTrivialStruct() { }1240};1241 1242struct NonTCStruct {1243 NonTCStruct(const NonTCStruct&) {}1244};1245 1246struct AllDefaulted {1247 AllDefaulted() = default;1248 AllDefaulted(const AllDefaulted &) = default;1249 AllDefaulted(AllDefaulted &&) = default;1250 AllDefaulted &operator=(const AllDefaulted &) = default;1251 AllDefaulted &operator=(AllDefaulted &&) = default;1252 ~AllDefaulted() = default;1253};1254 1255struct NoDefaultMoveAssignDueToUDCopyCtor {1256 NoDefaultMoveAssignDueToUDCopyCtor(const NoDefaultMoveAssignDueToUDCopyCtor&);1257};1258 1259struct NoDefaultMoveAssignDueToUDCopyAssign {1260 NoDefaultMoveAssignDueToUDCopyAssign& operator=(1261 const NoDefaultMoveAssignDueToUDCopyAssign&);1262};1263 1264struct NoDefaultMoveAssignDueToDtor {1265 ~NoDefaultMoveAssignDueToDtor();1266};1267 1268struct AllDeleted {1269 AllDeleted() = delete;1270 AllDeleted(const AllDeleted &) = delete;1271 AllDeleted(AllDeleted &&) = delete;1272 AllDeleted &operator=(const AllDeleted &) = delete;1273 AllDeleted &operator=(AllDeleted &&) = delete;1274 ~AllDeleted() = delete;1275};1276 1277struct ExtDefaulted {1278 ExtDefaulted();1279 ExtDefaulted(const ExtDefaulted &);1280 ExtDefaulted(ExtDefaulted &&);1281 ExtDefaulted &operator=(const ExtDefaulted &);1282 ExtDefaulted &operator=(ExtDefaulted &&);1283 ~ExtDefaulted();1284};1285 1286// Despite being defaulted, these functions are not trivial.1287ExtDefaulted::ExtDefaulted() = default;1288ExtDefaulted::ExtDefaulted(const ExtDefaulted &) = default;1289ExtDefaulted::ExtDefaulted(ExtDefaulted &&) = default;1290ExtDefaulted &ExtDefaulted::operator=(const ExtDefaulted &) = default;1291ExtDefaulted &ExtDefaulted::operator=(ExtDefaulted &&) = default;1292ExtDefaulted::~ExtDefaulted() = default;1293 1294void is_trivial2()1295{1296 static_assert(__is_trivial(char));1297 static_assert(__is_trivial(int));1298 static_assert(__is_trivial(long));1299 static_assert(__is_trivial(short));1300 static_assert(__is_trivial(signed char));1301 static_assert(__is_trivial(wchar_t));1302 static_assert(__is_trivial(bool));1303 static_assert(__is_trivial(float));1304 static_assert(__is_trivial(double));1305 static_assert(__is_trivial(long double));1306 static_assert(__is_trivial(unsigned char));1307 static_assert(__is_trivial(unsigned int));1308 static_assert(__is_trivial(unsigned long long));1309 static_assert(__is_trivial(unsigned long));1310 static_assert(__is_trivial(unsigned short));1311 static_assert(__is_trivial(ClassType));1312 static_assert(__is_trivial(Derives));1313 static_assert(__is_trivial(Enum));1314 static_assert(__is_trivial(IntAr));1315 static_assert(__is_trivial(Union));1316 static_assert(__is_trivial(UnionAr));1317 static_assert(__is_trivial(TrivialStruct));1318 static_assert(__is_trivial(AllDefaulted));1319 static_assert(__is_trivial(AllDeleted));1320 1321 static_assert(!__is_trivial(void));1322 static_assert(!__is_trivial(NonTrivialStruct));1323 static_assert(!__is_trivial(SuperNonTrivialStruct));1324 static_assert(!__is_trivial(NonTCStruct));1325 static_assert(!__is_trivial(ExtDefaulted));1326 1327 static_assert(__is_trivial(ACompleteType));1328 static_assert(!__is_trivial(AnIncompleteType)); // expected-error {{incomplete type}}1329 static_assert(!__is_trivial(AnIncompleteType[])); // expected-error {{incomplete type}}1330 static_assert(!__is_trivial(AnIncompleteType[1])); // expected-error {{incomplete type}}1331 static_assert(!__is_trivial(void));1332 static_assert(!__is_trivial(const volatile void));1333}1334 1335void is_trivially_copyable2()1336{1337 static_assert(__is_trivially_copyable(char));1338 static_assert(__is_trivially_copyable(int));1339 static_assert(__is_trivially_copyable(long));1340 static_assert(__is_trivially_copyable(short));1341 static_assert(__is_trivially_copyable(signed char));1342 static_assert(__is_trivially_copyable(wchar_t));1343 static_assert(__is_trivially_copyable(bool));1344 static_assert(__is_trivially_copyable(float));1345 static_assert(__is_trivially_copyable(double));1346 static_assert(__is_trivially_copyable(long double));1347 static_assert(__is_trivially_copyable(unsigned char));1348 static_assert(__is_trivially_copyable(unsigned int));1349 static_assert(__is_trivially_copyable(unsigned long long));1350 static_assert(__is_trivially_copyable(unsigned long));1351 static_assert(__is_trivially_copyable(unsigned short));1352 static_assert(__is_trivially_copyable(ClassType));1353 static_assert(__is_trivially_copyable(Derives));1354 static_assert(__is_trivially_copyable(Enum));1355 static_assert(__is_trivially_copyable(IntAr));1356 static_assert(__is_trivially_copyable(Union));1357 static_assert(__is_trivially_copyable(UnionAr));1358 static_assert(__is_trivially_copyable(TrivialStruct));1359 static_assert(__is_trivially_copyable(NonTrivialStruct));1360 static_assert(__is_trivially_copyable(AllDefaulted));1361 static_assert(__is_trivially_copyable(AllDeleted));1362 1363 static_assert(!__is_trivially_copyable(void));1364 static_assert(!__is_trivially_copyable(SuperNonTrivialStruct));1365 static_assert(!__is_trivially_copyable(NonTCStruct));1366 static_assert(!__is_trivially_copyable(ExtDefaulted));1367 1368 static_assert(__is_trivially_copyable(const int));1369 static_assert(__is_trivially_copyable(volatile int));1370 1371 static_assert(__is_trivially_copyable(ACompleteType));1372 static_assert(!__is_trivially_copyable(AnIncompleteType)); // expected-error {{incomplete type}}1373 static_assert(!__is_trivially_copyable(AnIncompleteType[])); // expected-error {{incomplete type}}1374 static_assert(!__is_trivially_copyable(AnIncompleteType[1])); // expected-error {{incomplete type}}1375 static_assert(!__is_trivially_copyable(void));1376 static_assert(!__is_trivially_copyable(const volatile void));1377}1378 1379struct CStruct {1380 int one;1381 int two;1382};1383 1384struct CEmptyStruct {};1385 1386struct CppEmptyStruct : CStruct {};1387struct CppStructStandard : CEmptyStruct {1388 int three;1389 int four;1390};1391struct CppStructNonStandardByBase : CStruct {1392 int three;1393 int four;1394};1395struct CppStructNonStandardByVirt : CStruct {1396 virtual void method() {}1397};1398struct CppStructNonStandardByMemb : CStruct {1399 CppStructNonStandardByVirt member;1400};1401struct CppStructNonStandardByProt : CStruct {1402 int five;1403protected:1404 int six;1405};1406struct CppStructNonStandardByVirtBase : virtual CStruct {1407};1408struct CppStructNonStandardBySameBase : CEmptyStruct {1409 CEmptyStruct member;1410};1411struct CppStructNonStandardBy2ndVirtBase : CEmptyStruct {1412 CEmptyStruct member;1413};1414 1415void is_standard_layout()1416{1417 typedef const int ConstInt;1418 typedef ConstInt ConstIntAr[4];1419 typedef CppStructStandard CppStructStandardAr[4];1420 1421 static_assert(__is_standard_layout(int));1422 static_assert(__is_standard_layout(ConstInt));1423 static_assert(__is_standard_layout(ConstIntAr));1424 static_assert(__is_standard_layout(CStruct));1425 static_assert(__is_standard_layout(CppStructStandard));1426 static_assert(__is_standard_layout(CppStructStandardAr));1427 static_assert(__is_standard_layout(Vector));1428 static_assert(__is_standard_layout(VectorExt));1429 1430 typedef CppStructNonStandardByBase CppStructNonStandardByBaseAr[4];1431 1432 static_assert(!__is_standard_layout(CppStructNonStandardByVirt));1433 static_assert(!__is_standard_layout(CppStructNonStandardByMemb));1434 static_assert(!__is_standard_layout(CppStructNonStandardByProt));1435 static_assert(!__is_standard_layout(CppStructNonStandardByVirtBase));1436 static_assert(!__is_standard_layout(CppStructNonStandardByBase));1437 static_assert(!__is_standard_layout(CppStructNonStandardByBaseAr));1438 static_assert(!__is_standard_layout(CppStructNonStandardBySameBase));1439 static_assert(!__is_standard_layout(CppStructNonStandardBy2ndVirtBase));1440 1441 static_assert(__is_standard_layout(ACompleteType));1442 static_assert(!__is_standard_layout(AnIncompleteType)); // expected-error {{incomplete type}}1443 static_assert(!__is_standard_layout(AnIncompleteType[])); // expected-error {{incomplete type}}1444 static_assert(!__is_standard_layout(AnIncompleteType[1])); // expected-error {{incomplete type}}1445 static_assert(!__is_standard_layout(void));1446 static_assert(!__is_standard_layout(const volatile void));1447 1448 struct HasAnonEmptyBitfield { int : 0; };1449 struct HasAnonBitfield { int : 4; };1450 struct DerivesFromBitfield : HasAnonBitfield {};1451 struct DerivesFromBitfieldWithBitfield : HasAnonBitfield { int : 5; };1452 struct DerivesFromBitfieldTwice : DerivesFromBitfield, HasAnonEmptyBitfield {};1453 1454 static_assert(__is_standard_layout(HasAnonEmptyBitfield));1455 static_assert(__is_standard_layout(HasAnonBitfield));1456 static_assert(__is_standard_layout(DerivesFromBitfield));1457 static_assert(!__is_standard_layout(DerivesFromBitfieldWithBitfield));1458 static_assert(!__is_standard_layout(DerivesFromBitfieldTwice));1459 1460 struct Empty {};1461 struct HasEmptyBase : Empty {};1462 struct HoldsEmptyBase { Empty e; };1463 struct HasRepeatedEmptyBase : Empty, HasEmptyBase {}; // expected-warning {{inaccessible}}1464 struct HasEmptyBaseAsMember : Empty { Empty e; };1465 struct HasEmptyBaseAsSubobjectOfMember1 : Empty { HoldsEmptyBase e; };1466 struct HasEmptyBaseAsSubobjectOfMember2 : Empty { HasEmptyBase e; };1467 struct HasEmptyBaseAsSubobjectOfMember3 : Empty { HoldsEmptyBase e[2]; };1468 struct HasEmptyIndirectBaseAsMember : HasEmptyBase { Empty e; };1469 struct HasEmptyIndirectBaseAsSecondMember : HasEmptyBase { int n; Empty e; };1470 struct HasEmptyIndirectBaseAfterBitfield : HasEmptyBase { int : 4; Empty e; };1471 1472 static_assert(__is_standard_layout(Empty));1473 static_assert(__is_standard_layout(HasEmptyBase));1474 static_assert(!__is_standard_layout(HasRepeatedEmptyBase));1475 static_assert(!__is_standard_layout(HasEmptyBaseAsMember));1476 static_assert(!__is_standard_layout(HasEmptyBaseAsSubobjectOfMember1));1477 static_assert(__is_standard_layout(HasEmptyBaseAsSubobjectOfMember2)); // FIXME: standard bug?1478 static_assert(!__is_standard_layout(HasEmptyBaseAsSubobjectOfMember3));1479 static_assert(!__is_standard_layout(HasEmptyIndirectBaseAsMember));1480 static_assert(__is_standard_layout(HasEmptyIndirectBaseAsSecondMember));1481 static_assert(!__is_standard_layout(HasEmptyIndirectBaseAfterBitfield)); // FIXME: standard bug?1482 1483 struct StructWithEmptyFields {1484 int n;1485 HoldsEmptyBase e[3];1486 };1487 union UnionWithEmptyFields {1488 int n;1489 HoldsEmptyBase e[3];1490 };1491 struct HasEmptyIndirectBaseAsSecondStructMember : HasEmptyBase {1492 StructWithEmptyFields u;1493 };1494 struct HasEmptyIndirectBaseAsSecondUnionMember : HasEmptyBase {1495 UnionWithEmptyFields u;1496 };1497 1498 static_assert(__is_standard_layout(HasEmptyIndirectBaseAsSecondStructMember));1499 static_assert(!__is_standard_layout(HasEmptyIndirectBaseAsSecondUnionMember));1500}1501 1502struct CStruct2 {1503 int one;1504 int two;1505};1506 1507struct CEmptyStruct2 {};1508 1509struct CppEmptyStruct2 : CStruct2 {};1510struct CppStructStandard2 : CEmptyStruct2 {1511 int three;1512 int four;1513};1514struct CppStructNonStandardByBase2 : CStruct2 {1515 int three;1516 int four;1517};1518struct CppStructNonStandardByVirt2 : CStruct2 {1519 virtual void method() {}1520};1521struct CppStructNonStandardByMemb2 : CStruct2 {1522 CppStructNonStandardByVirt member;1523};1524struct CppStructNonStandardByProt2 : CStruct2 {1525 int five;1526protected:1527 int six;1528};1529struct CppStructNonStandardByVirtBase2 : virtual CStruct2 {1530};1531struct CppStructNonStandardBySameBase2 : CEmptyStruct2 {1532 CEmptyStruct member;1533};1534struct CppStructNonStandardBy2ndVirtBase2 : CEmptyStruct2 {1535 CEmptyStruct member;1536};1537 1538struct CStructWithQualifiers {1539 const int one;1540 volatile int two;1541};1542 1543struct CStructNoUniqueAddress {1544 int one;1545 [[no_unique_address]] int two;1546};1547 1548struct CStructNoUniqueAddress2 {1549 int one;1550 [[no_unique_address]] int two;1551};1552 1553struct alignas(64) CStructAlignment {1554 int one;1555 int two;1556};1557 1558struct CStructAlignedMembers {1559 int one;1560 alignas(16) int two;1561};1562 1563enum EnumLayout : int {};1564enum class EnumClassLayout {};1565enum EnumForward : int;1566enum class EnumClassForward;1567 1568struct CStructIncomplete; // #CStructIncomplete1569 1570struct CStructNested {1571 int a;1572 CStruct s;1573 int b;1574};1575 1576struct CStructNested2 {1577 int a2;1578 CStruct s2;1579 int b2;1580};1581 1582struct CStructWithBitfelds {1583 int a : 5;1584 int : 0;1585};1586 1587struct CStructWithBitfelds2 {1588 int a : 5;1589 int : 0;1590};1591 1592struct CStructWithBitfelds3 {1593 int : 0;1594 int b : 5;1595};1596 1597struct CStructWithBitfelds4 {1598 EnumLayout a : 5;1599 int : 0;1600};1601 1602union UnionLayout {1603 int a;1604 double b;1605 CStruct c;1606 [[no_unique_address]] CEmptyStruct d;1607 [[no_unique_address]] CEmptyStruct2 e;1608};1609 1610union UnionLayout2 {1611 CStruct c;1612 int a;1613 CEmptyStruct2 e;1614 double b;1615 [[no_unique_address]] CEmptyStruct d;1616};1617 1618union UnionLayout3 {1619 CStruct c;1620 int a;1621 double b;1622 [[no_unique_address]] CEmptyStruct d;1623};1624 1625union UnionNoOveralignedMembers {1626 int a;1627 double b;1628};1629 1630union UnionWithOveralignedMembers {1631 int a;1632 alignas(16) double b;1633};1634 1635struct StructWithAnonUnion {1636 union {1637 int a;1638 double b;1639 CStruct c;1640 [[no_unique_address]] CEmptyStruct d;1641 [[no_unique_address]] CEmptyStruct2 e;1642 };1643};1644 1645struct StructWithAnonUnion2 {1646 union {1647 CStruct c;1648 int a;1649 CEmptyStruct2 e;1650 double b;1651 [[no_unique_address]] CEmptyStruct d;1652 };1653};1654 1655struct StructWithAnonUnion3 {1656 union {1657 CStruct c;1658 int a;1659 CEmptyStruct2 e;1660 double b;1661 [[no_unique_address]] CEmptyStruct d;1662 } u;1663};1664 1665struct CStructWithArrayAtTheEnd {1666 int a;1667 int b[4];1668};1669 1670struct CStructWithFMA {1671 int c;1672 int d[];1673};1674 1675struct CStructWithFMA2 {1676 int e;1677 int f[];1678};1679 1680template<int N>1681struct UniqueEmpty {};1682template<typename... Bases>1683struct D : Bases... {};1684 1685void is_layout_compatible(int n)1686{1687 static_assert(__is_layout_compatible(void, void));1688 static_assert(!__is_layout_compatible(void, int));1689 static_assert(__is_layout_compatible(void, const void));1690 static_assert(__is_layout_compatible(void, volatile void));1691 static_assert(__is_layout_compatible(const void, volatile void));1692 static_assert(__is_layout_compatible(int, int));1693 static_assert(__is_layout_compatible(int, const int));1694 static_assert(__is_layout_compatible(int, volatile int));1695 static_assert(__is_layout_compatible(const int, volatile int));1696 static_assert(__is_layout_compatible(int *, int * __restrict));1697 // Note: atomic qualification matters for layout compatibility.1698 static_assert(!__is_layout_compatible(int, _Atomic int));1699 static_assert(__is_layout_compatible(_Atomic(int), _Atomic int));1700 static_assert(!__is_layout_compatible(int, unsigned int));1701 static_assert(!__is_layout_compatible(char, unsigned char));1702 static_assert(!__is_layout_compatible(char, signed char));1703 static_assert(!__is_layout_compatible(unsigned char, signed char));1704 static_assert(__is_layout_compatible(int[], int[]));1705 static_assert(__is_layout_compatible(int[2], int[2]));1706 static_assert(!__is_layout_compatible(int[n], int[2]));1707 // expected-error@-1 {{variable length arrays are not supported in '__is_layout_compatible'}}1708 static_assert(!__is_layout_compatible(int[n], int[n]));1709 // expected-error@-1 {{variable length arrays are not supported in '__is_layout_compatible'}}1710 // expected-error@-2 {{variable length arrays are not supported in '__is_layout_compatible'}}1711 static_assert(__is_layout_compatible(int&, int&));1712 static_assert(!__is_layout_compatible(int&, char&));1713 static_assert(__is_layout_compatible(void(int), void(int)));1714 static_assert(!__is_layout_compatible(void(int), void(char)));1715 static_assert(__is_layout_compatible(void(&)(int), void(&)(int)));1716 static_assert(!__is_layout_compatible(void(&)(int), void(&)(char)));1717 static_assert(__is_layout_compatible(void(*)(int), void(*)(int)));1718 static_assert(!__is_layout_compatible(void(*)(int), void(*)(char)));1719 using function_type = void();1720 using function_type2 = void(char);1721 static_assert(__is_layout_compatible(const function_type, const function_type));1722 // expected-warning@-1 {{'const' qualifier on function type 'function_type' (aka 'void ()') has no effect}}1723 // expected-warning@-2 {{'const' qualifier on function type 'function_type' (aka 'void ()') has no effect}}1724 static_assert(__is_layout_compatible(function_type, const function_type));1725 // expected-warning@-1 {{'const' qualifier on function type 'function_type' (aka 'void ()') has no effect}}1726 static_assert(!__is_layout_compatible(const function_type, const function_type2));1727 // expected-warning@-1 {{'const' qualifier on function type 'function_type' (aka 'void ()') has no effect}}1728 // expected-warning@-2 {{'const' qualifier on function type 'function_type2' (aka 'void (char)') has no effect}}1729 static_assert(__is_layout_compatible(CStruct, CStruct2));1730 static_assert(__is_layout_compatible(CStruct, const CStruct2));1731 static_assert(__is_layout_compatible(CStruct, volatile CStruct2));1732 static_assert(__is_layout_compatible(const CStruct, volatile CStruct2));1733 static_assert(__is_layout_compatible(CEmptyStruct, CEmptyStruct2));1734 static_assert(__is_layout_compatible(CppEmptyStruct, CppEmptyStruct2));1735 static_assert(__is_layout_compatible(CppStructStandard, CppStructStandard2));1736 static_assert(!__is_layout_compatible(CppStructNonStandardByBase, CppStructNonStandardByBase2));1737 static_assert(!__is_layout_compatible(CppStructNonStandardByVirt, CppStructNonStandardByVirt2));1738 static_assert(!__is_layout_compatible(CppStructNonStandardByMemb, CppStructNonStandardByMemb2));1739 static_assert(!__is_layout_compatible(CppStructNonStandardByProt, CppStructNonStandardByProt2));1740 static_assert(!__is_layout_compatible(CppStructNonStandardByVirtBase, CppStructNonStandardByVirtBase2));1741 static_assert(!__is_layout_compatible(CppStructNonStandardBySameBase, CppStructNonStandardBySameBase2));1742 static_assert(!__is_layout_compatible(CppStructNonStandardBy2ndVirtBase, CppStructNonStandardBy2ndVirtBase2));1743 static_assert(__is_layout_compatible(CStruct, CStructWithQualifiers));1744 static_assert(__is_layout_compatible(CStruct, CStructNoUniqueAddress) != bool(__has_cpp_attribute(no_unique_address)));1745 static_assert(__is_layout_compatible(CStructNoUniqueAddress, CStructNoUniqueAddress2) != bool(__has_cpp_attribute(no_unique_address)));1746 static_assert(__is_layout_compatible(CStruct, CStructAlignment));1747 static_assert(!__is_layout_compatible(CStruct, CStructAlignedMembers));1748 static_assert(__is_layout_compatible(UnionNoOveralignedMembers, UnionWithOveralignedMembers));1749 static_assert(__is_layout_compatible(CStructWithBitfelds, CStructWithBitfelds));1750 static_assert(__is_layout_compatible(CStructWithBitfelds, CStructWithBitfelds2));1751 static_assert(!__is_layout_compatible(CStructWithBitfelds, CStructWithBitfelds3));1752 static_assert(!__is_layout_compatible(CStructWithBitfelds, CStructWithBitfelds4));1753 static_assert(__is_layout_compatible(int CStruct2::*, int CStruct2::*));1754 static_assert(!__is_layout_compatible(int CStruct2::*, char CStruct2::*));1755 static_assert(__is_layout_compatible(void(CStruct2::*)(int), void(CStruct2::*)(int)));1756 static_assert(!__is_layout_compatible(void(CStruct2::*)(int), void(CStruct2::*)(char)));1757 static_assert(__is_layout_compatible(CStructNested, CStructNested2));1758 static_assert(__is_layout_compatible(UnionLayout, UnionLayout));1759 static_assert(!__is_layout_compatible(UnionLayout, UnionLayout2));1760 static_assert(!__is_layout_compatible(UnionLayout, UnionLayout3));1761 static_assert(!__is_layout_compatible(StructWithAnonUnion, StructWithAnonUnion2));1762 static_assert(!__is_layout_compatible(StructWithAnonUnion, StructWithAnonUnion3));1763 static_assert(__is_layout_compatible(EnumLayout, EnumClassLayout));1764 static_assert(__is_layout_compatible(EnumForward, EnumForward));1765 static_assert(__is_layout_compatible(EnumForward, EnumClassForward));1766 static_assert(__is_layout_compatible(CStructIncomplete, CStructIncomplete));1767 // expected-error@-1 {{incomplete type 'CStructIncomplete' where a complete type is required}}1768 // expected-note@#CStructIncomplete {{forward declaration of 'CStructIncomplete'}}1769 // expected-error@-3 {{incomplete type 'CStructIncomplete' where a complete type is required}}1770 // expected-note@#CStructIncomplete {{forward declaration of 'CStructIncomplete'}}1771 static_assert(!__is_layout_compatible(CStruct, CStructIncomplete));1772 // expected-error@-1 {{incomplete type 'CStructIncomplete' where a complete type is required}}1773 // expected-note@#CStructIncomplete {{forward declaration of 'CStructIncomplete'}}1774 static_assert(__is_layout_compatible(CStructIncomplete[2], CStructIncomplete[2]));1775 // expected-error@-1 {{incomplete type 'CStructIncomplete[2]' where a complete type is required}}1776 // expected-note@#CStructIncomplete {{forward declaration of 'CStructIncomplete'}}1777 // expected-error@-3 {{incomplete type 'CStructIncomplete[2]' where a complete type is required}}1778 // expected-note@#CStructIncomplete {{forward declaration of 'CStructIncomplete'}}1779 static_assert(__is_layout_compatible(CStructIncomplete[], CStructIncomplete[]));1780 static_assert(!__is_layout_compatible(CStructWithArrayAtTheEnd, CStructWithFMA));1781 static_assert(__is_layout_compatible(CStructWithFMA, CStructWithFMA));1782 static_assert(__is_layout_compatible(CStructWithFMA, CStructWithFMA2));1783 // Layout compatibility rules for enums might be relaxed in the future. See https://github.com/cplusplus/CWG/issues/39#issuecomment-11847913641784 static_assert(!__is_layout_compatible(EnumLayout, int));1785 static_assert(!__is_layout_compatible(EnumClassLayout, int));1786 static_assert(!__is_layout_compatible(EnumForward, int));1787 static_assert(!__is_layout_compatible(EnumClassForward, int));1788 static_assert(__is_layout_compatible(CStruct, D<CStruct>));1789 static_assert(__is_layout_compatible(CStruct, D<UniqueEmpty<0>, CStruct>));1790 static_assert(__is_layout_compatible(CStruct, D<UniqueEmpty<0>, D<UniqueEmpty<1>, CStruct>, D<UniqueEmpty<2>>>));1791 static_assert(__is_layout_compatible(CStruct, D<CStructWithQualifiers>));1792 static_assert(__is_layout_compatible(CStruct, D<UniqueEmpty<0>, CStructWithQualifiers>));1793 static_assert(__is_layout_compatible(CStructWithQualifiers, D<UniqueEmpty<0>, D<UniqueEmpty<1>, CStruct>, D<UniqueEmpty<2>>>));1794}1795 1796namespace IPIBO {1797struct Base {};1798struct Base2 {};1799struct Base3 : Base {};1800struct Base3Virtual : virtual Base {};1801struct Derived : Base {};1802struct DerivedIndirect : Base3 {};1803struct DerivedMultiple : Base, Base2 {};1804struct DerivedAmbiguous : Base, Base3 {};1805/* expected-warning@-1 {{direct base 'Base' is inaccessible due to ambiguity:1806 struct IPIBO::DerivedAmbiguous -> Base1807 struct IPIBO::DerivedAmbiguous -> Base3 -> Base}} */1808struct DerivedPrivate : private Base {};1809struct DerivedVirtual : virtual Base {};1810 1811union Union {};1812union UnionIncomplete;1813struct StructIncomplete; // #StructIncomplete1814 1815void is_pointer_interconvertible_base_of(int n)1816{1817 static_assert(__is_pointer_interconvertible_base_of(Base, Derived));1818 static_assert(!__is_pointer_interconvertible_base_of(Base2, Derived));1819 static_assert(__is_pointer_interconvertible_base_of(Base, DerivedIndirect));1820 static_assert(__is_pointer_interconvertible_base_of(Base, DerivedMultiple));1821 static_assert(__is_pointer_interconvertible_base_of(Base2, DerivedMultiple));1822 static_assert(!__is_pointer_interconvertible_base_of(Base3, DerivedMultiple));1823 static_assert(!__is_pointer_interconvertible_base_of(Base, DerivedAmbiguous));1824 static_assert(__is_pointer_interconvertible_base_of(Base, DerivedPrivate));1825 static_assert(!__is_pointer_interconvertible_base_of(Base, DerivedVirtual));1826 static_assert(!__is_pointer_interconvertible_base_of(Union, Union));1827 static_assert(!__is_pointer_interconvertible_base_of(UnionIncomplete, UnionIncomplete));1828 static_assert(__is_pointer_interconvertible_base_of(StructIncomplete, StructIncomplete));1829 static_assert(__is_pointer_interconvertible_base_of(StructIncomplete, const StructIncomplete));1830 static_assert(__is_pointer_interconvertible_base_of(StructIncomplete, volatile StructIncomplete));1831 static_assert(__is_pointer_interconvertible_base_of(const StructIncomplete, volatile StructIncomplete));1832 static_assert(!__is_pointer_interconvertible_base_of(StructIncomplete, Derived));1833 static_assert(!__is_pointer_interconvertible_base_of(Base, StructIncomplete));1834 // expected-error@-1 {{incomplete type 'StructIncomplete' where a complete type is required}}1835 // expected-note@#StructIncomplete {{forward declaration of 'IPIBO::StructIncomplete'}}1836 static_assert(!__is_pointer_interconvertible_base_of(CStruct2, CppStructNonStandardByBase2));1837 static_assert(!__is_pointer_interconvertible_base_of(void, void));1838 static_assert(!__is_pointer_interconvertible_base_of(void, int));1839 static_assert(!__is_pointer_interconvertible_base_of(void, const void));1840 static_assert(!__is_pointer_interconvertible_base_of(void, volatile void));1841 static_assert(!__is_pointer_interconvertible_base_of(const void, volatile void));1842 static_assert(!__is_pointer_interconvertible_base_of(int, int));1843 static_assert(!__is_pointer_interconvertible_base_of(int, const int));1844 static_assert(!__is_pointer_interconvertible_base_of(int, volatile int));1845 static_assert(!__is_pointer_interconvertible_base_of(const int, volatile int));1846 static_assert(!__is_pointer_interconvertible_base_of(int *, int * __restrict));1847 static_assert(!__is_pointer_interconvertible_base_of(int, _Atomic int));1848 static_assert(!__is_pointer_interconvertible_base_of(_Atomic(int), _Atomic int));1849 static_assert(!__is_pointer_interconvertible_base_of(int, unsigned int));1850 static_assert(!__is_pointer_interconvertible_base_of(char, unsigned char));1851 static_assert(!__is_pointer_interconvertible_base_of(char, signed char));1852 static_assert(!__is_pointer_interconvertible_base_of(unsigned char, signed char));1853 using function_type = void();1854 using function_type2 = void(char);1855 static_assert(!__is_pointer_interconvertible_base_of(const function_type, const function_type));1856 // expected-warning@-1 {{'const' qualifier on function type 'function_type' (aka 'void ()') has no effect}}1857 // expected-warning@-2 {{'const' qualifier on function type 'function_type' (aka 'void ()') has no effect}}1858 static_assert(!__is_pointer_interconvertible_base_of(function_type, const function_type));1859 // expected-warning@-1 {{'const' qualifier on function type 'function_type' (aka 'void ()') has no effect}}1860 static_assert(!__is_pointer_interconvertible_base_of(const function_type, const function_type2));1861 // expected-warning@-1 {{'const' qualifier on function type 'function_type' (aka 'void ()') has no effect}}1862 // expected-warning@-2 {{'const' qualifier on function type 'function_type2' (aka 'void (char)') has no effect}}1863 static_assert(!__is_pointer_interconvertible_base_of(int CStruct2::*, int CStruct2::*));1864 static_assert(!__is_pointer_interconvertible_base_of(int CStruct2::*, char CStruct2::*));1865 static_assert(!__is_pointer_interconvertible_base_of(void(CStruct2::*)(int), void(CStruct2::*)(int)));1866 static_assert(!__is_pointer_interconvertible_base_of(void(CStruct2::*)(int), void(CStruct2::*)(char)));1867 static_assert(!__is_pointer_interconvertible_base_of(int[], int[]));1868 static_assert(!__is_pointer_interconvertible_base_of(int[], double[]));1869 static_assert(!__is_pointer_interconvertible_base_of(int[2], int[2]));1870 static_assert(!__is_pointer_interconvertible_base_of(int[n], int[2]));1871 // expected-error@-1 {{variable length arrays are not supported in '__is_pointer_interconvertible_base_of'}}1872 static_assert(!__is_pointer_interconvertible_base_of(int[n], int[n]));1873 // expected-error@-1 {{variable length arrays are not supported in '__is_pointer_interconvertible_base_of'}}1874 // expected-error@-2 {{variable length arrays are not supported in '__is_pointer_interconvertible_base_of'}}1875 static_assert(!__is_pointer_interconvertible_base_of(int&, int&));1876 static_assert(!__is_pointer_interconvertible_base_of(int&, char&));1877 static_assert(!__is_pointer_interconvertible_base_of(void(int), void(int)));1878 static_assert(!__is_pointer_interconvertible_base_of(void(int), void(char)));1879 static_assert(!__is_pointer_interconvertible_base_of(void(&)(int), void(&)(int)));1880 static_assert(!__is_pointer_interconvertible_base_of(void(&)(int), void(&)(char)));1881 static_assert(!__is_pointer_interconvertible_base_of(void(*)(int), void(*)(int)));1882 static_assert(!__is_pointer_interconvertible_base_of(void(*)(int), void(*)(char)));1883}1884}1885 1886struct NoEligibleTrivialContructor {1887 NoEligibleTrivialContructor() {};1888 NoEligibleTrivialContructor(const NoEligibleTrivialContructor&) {}1889 NoEligibleTrivialContructor(NoEligibleTrivialContructor&&) {}1890};1891 1892struct OnlyDefaultConstructorIsTrivial {1893 OnlyDefaultConstructorIsTrivial() = default;1894 OnlyDefaultConstructorIsTrivial(const OnlyDefaultConstructorIsTrivial&) {}1895 OnlyDefaultConstructorIsTrivial(OnlyDefaultConstructorIsTrivial&&) {}1896};1897 1898struct AllContstructorsAreTrivial {1899 AllContstructorsAreTrivial() = default;1900 AllContstructorsAreTrivial(const AllContstructorsAreTrivial&) = default;1901 AllContstructorsAreTrivial(AllContstructorsAreTrivial&&) = default;1902};1903 1904struct InheritedNoEligibleTrivialConstructor : NoEligibleTrivialContructor {1905 using NoEligibleTrivialContructor::NoEligibleTrivialContructor;1906};1907 1908struct InheritedOnlyDefaultConstructorIsTrivial : OnlyDefaultConstructorIsTrivial {1909 using OnlyDefaultConstructorIsTrivial::OnlyDefaultConstructorIsTrivial;1910};1911 1912struct InheritedAllContstructorsAreTrivial : AllContstructorsAreTrivial {1913 using AllContstructorsAreTrivial::AllContstructorsAreTrivial;1914};1915 1916struct UserDeclaredDestructor {1917 ~UserDeclaredDestructor() = default;1918};1919 1920struct UserProvidedDestructor {1921 ~UserProvidedDestructor() {}1922};1923 1924struct UserDeletedDestructorInAggregate {1925 ~UserDeletedDestructorInAggregate() = delete;1926};1927 1928struct UserDeletedDestructorInNonAggregate {1929 virtual void NonAggregate();1930 ~UserDeletedDestructorInNonAggregate() = delete;1931};1932 1933struct DeletedDestructorViaBaseInAggregate : UserDeletedDestructorInAggregate {};1934struct DeletedDestructorViaBaseInNonAggregate : UserDeletedDestructorInNonAggregate {};1935 1936#if __cplusplus >= 202002L1937template<bool B>1938struct ConstrainedUserDeclaredDefaultConstructor{1939 ConstrainedUserDeclaredDefaultConstructor() requires B = default;1940 ConstrainedUserDeclaredDefaultConstructor(const ConstrainedUserDeclaredDefaultConstructor&) {}1941};1942 1943template<bool B>1944struct ConstrainedUserProvidedDestructor {1945 ~ConstrainedUserProvidedDestructor() = default;1946 ~ConstrainedUserProvidedDestructor() requires B {}1947};1948#endif1949 1950struct StructWithFAM {1951 int a[];1952};1953 1954struct StructWithZeroSizedArray {1955 int a[0];1956};1957 1958typedef float float4 __attribute__((ext_vector_type(4)));1959typedef int *align_value_int __attribute__((align_value(16)));1960 1961struct [[clang::enforce_read_only_placement]] EnforceReadOnlyPlacement {};1962struct [[clang::type_visibility("hidden")]] TypeVisibility {};1963 1964void is_implicit_lifetime(int n) {1965 static_assert(__builtin_is_implicit_lifetime(decltype(nullptr)));1966 static_assert(!__builtin_is_implicit_lifetime(void));1967 static_assert(!__builtin_is_implicit_lifetime(const void));1968 static_assert(!__builtin_is_implicit_lifetime(volatile void));1969 static_assert(__builtin_is_implicit_lifetime(int));1970 static_assert(!__builtin_is_implicit_lifetime(int&));1971 static_assert(!__builtin_is_implicit_lifetime(int&&));1972 static_assert(__builtin_is_implicit_lifetime(float));1973 static_assert(__builtin_is_implicit_lifetime(double));1974 static_assert(__builtin_is_implicit_lifetime(long double));1975 static_assert(__builtin_is_implicit_lifetime(int*));1976 static_assert(__builtin_is_implicit_lifetime(int[]));1977 static_assert(__builtin_is_implicit_lifetime(int[5]));1978 static_assert(__builtin_is_implicit_lifetime(int[n]));1979 // expected-error@-1 {{variable length arrays are not supported in '__builtin_is_implicit_lifetime'}}1980 static_assert(__builtin_is_implicit_lifetime(Enum));1981 static_assert(__builtin_is_implicit_lifetime(EnumClass));1982 static_assert(!__builtin_is_implicit_lifetime(void()));1983 static_assert(!__builtin_is_implicit_lifetime(void() &));1984 static_assert(!__builtin_is_implicit_lifetime(void() const));1985 static_assert(!__builtin_is_implicit_lifetime(void(&)()));1986 static_assert(__builtin_is_implicit_lifetime(void(*)()));1987 static_assert(__builtin_is_implicit_lifetime(decltype(nullptr)));1988 static_assert(__builtin_is_implicit_lifetime(int UserDeclaredDestructor::*));1989 static_assert(__builtin_is_implicit_lifetime(int (UserDeclaredDestructor::*)()));1990 static_assert(__builtin_is_implicit_lifetime(int (UserDeclaredDestructor::*)() const));1991 static_assert(__builtin_is_implicit_lifetime(int (UserDeclaredDestructor::*)() &));1992 static_assert(__builtin_is_implicit_lifetime(int (UserDeclaredDestructor::*)() &&));1993 static_assert(!__builtin_is_implicit_lifetime(IncompleteStruct));1994 // expected-error@-1 {{incomplete type 'IncompleteStruct' used in type trait expression}}1995 static_assert(__builtin_is_implicit_lifetime(IncompleteStruct[]));1996 static_assert(__builtin_is_implicit_lifetime(IncompleteStruct[5]));1997 static_assert(__builtin_is_implicit_lifetime(UserDeclaredDestructor));1998 static_assert(__builtin_is_implicit_lifetime(const UserDeclaredDestructor));1999 static_assert(__builtin_is_implicit_lifetime(volatile UserDeclaredDestructor));2000 static_assert(!__builtin_is_implicit_lifetime(UserProvidedDestructor));2001 static_assert(!__builtin_is_implicit_lifetime(NoEligibleTrivialContructor));2002 static_assert(__builtin_is_implicit_lifetime(OnlyDefaultConstructorIsTrivial));2003 static_assert(__builtin_is_implicit_lifetime(AllContstructorsAreTrivial));2004 static_assert(!__builtin_is_implicit_lifetime(InheritedNoEligibleTrivialConstructor));2005 static_assert(__builtin_is_implicit_lifetime(InheritedOnlyDefaultConstructorIsTrivial));2006 static_assert(__builtin_is_implicit_lifetime(InheritedAllContstructorsAreTrivial));2007 static_assert(__builtin_is_implicit_lifetime(UserDeletedDestructorInAggregate));2008 static_assert(!__builtin_is_implicit_lifetime(UserDeletedDestructorInNonAggregate));2009 static_assert(__builtin_is_implicit_lifetime(DeletedDestructorViaBaseInAggregate) == __cplusplus >= 201703L);2010 static_assert(!__builtin_is_implicit_lifetime(DeletedDestructorViaBaseInNonAggregate));2011#if __cplusplus >= 202002L2012 static_assert(__builtin_is_implicit_lifetime(ConstrainedUserDeclaredDefaultConstructor<true>));2013 static_assert(!__builtin_is_implicit_lifetime(ConstrainedUserDeclaredDefaultConstructor<false>));2014 static_assert(!__builtin_is_implicit_lifetime(ConstrainedUserProvidedDestructor<true>));2015 static_assert(__builtin_is_implicit_lifetime(ConstrainedUserProvidedDestructor<false>));2016#endif2017 2018 static_assert(__builtin_is_implicit_lifetime(__int128));2019 static_assert(__builtin_is_implicit_lifetime(_BitInt(8)));2020 static_assert(__builtin_is_implicit_lifetime(_BitInt(128)));2021 static_assert(__builtin_is_implicit_lifetime(int[0]));2022 static_assert(__builtin_is_implicit_lifetime(StructWithFAM));2023 static_assert(__builtin_is_implicit_lifetime(StructWithZeroSizedArray));2024 static_assert(__builtin_is_implicit_lifetime(__fp16));2025 static_assert(__builtin_is_implicit_lifetime(__bf16));2026 static_assert(__builtin_is_implicit_lifetime(_Complex double));2027 static_assert(__builtin_is_implicit_lifetime(float4));2028 static_assert(__builtin_is_implicit_lifetime(align_value_int));2029 static_assert(__builtin_is_implicit_lifetime(int[[clang::annotate_type("category2")]] *));2030 static_assert(__builtin_is_implicit_lifetime(EnforceReadOnlyPlacement));2031 static_assert(__builtin_is_implicit_lifetime(int __attribute__((noderef)) *));2032 static_assert(__builtin_is_implicit_lifetime(TypeVisibility));2033 static_assert(__builtin_is_implicit_lifetime(int * _Nonnull));2034 static_assert(__builtin_is_implicit_lifetime(int * _Null_unspecified));2035 static_assert(__builtin_is_implicit_lifetime(int * _Nullable));2036 static_assert(!__builtin_is_implicit_lifetime(_Atomic int));2037 // expected-error@-1 {{atomic types are not supported in '__builtin_is_implicit_lifetime'}}2038 static_assert(__builtin_is_implicit_lifetime(int * __restrict));2039}2040 2041namespace GH160610 {2042class NonAggregate {2043public:2044 NonAggregate() = default;2045 2046 NonAggregate(const NonAggregate&) = delete;2047 NonAggregate& operator=(const NonAggregate&) = delete;2048private:2049 int num;2050};2051 2052class DataMemberInitializer {2053public:2054 DataMemberInitializer() = default;2055 2056 DataMemberInitializer(const DataMemberInitializer&) = delete;2057 DataMemberInitializer& operator=(const DataMemberInitializer&) = delete;2058private:2059 int num = 0;2060};2061 2062class UserProvidedConstructor {2063public:2064 UserProvidedConstructor() {}2065 2066 UserProvidedConstructor(const UserProvidedConstructor&) = delete;2067 UserProvidedConstructor& operator=(const UserProvidedConstructor&) = delete;2068};2069struct Ctr {2070 Ctr();2071};2072struct Ctr2 {2073 Ctr2();2074private:2075 NoEligibleTrivialContructor inner;2076};2077 2078struct NonCopyable{2079 NonCopyable() = default;2080 NonCopyable(const NonCopyable&) = delete;2081};2082 2083class C {2084 NonCopyable nc;2085};2086 2087static_assert(__builtin_is_implicit_lifetime(Ctr));2088static_assert(!__builtin_is_implicit_lifetime(Ctr2));2089static_assert(__builtin_is_implicit_lifetime(C));2090static_assert(!__builtin_is_implicit_lifetime(NoEligibleTrivialContructor));2091static_assert(__builtin_is_implicit_lifetime(NonAggregate));2092static_assert(!__builtin_is_implicit_lifetime(DataMemberInitializer));2093static_assert(!__builtin_is_implicit_lifetime(UserProvidedConstructor));2094 2095#if __cplusplus >= 202002L2096template <typename T>2097class Tpl {2098 Tpl() requires false = default ;2099};2100static_assert(__builtin_is_implicit_lifetime(Tpl<int>));2101 2102template <typename>2103class MultipleDefaults {2104 MultipleDefaults() {};2105 MultipleDefaults() requires true = default;2106};2107static_assert(__builtin_is_implicit_lifetime(MultipleDefaults<int>));2108template <typename>2109class MultipleDefaults2 {2110 MultipleDefaults2() requires true {};2111 MultipleDefaults2() = default;2112};2113 2114static_assert(__builtin_is_implicit_lifetime(MultipleDefaults2<int>));2115 2116 2117#endif2118 2119 2120 2121}2122 2123void is_signed()2124{2125 //static_assert(__is_signed(char));2126 static_assert(__is_signed(int));2127 static_assert(__is_signed(long));2128 static_assert(__is_signed(short));2129 static_assert(__is_signed(signed char));2130 static_assert(__is_signed(wchar_t));2131 static_assert(__is_signed(float));2132 static_assert(__is_signed(double));2133 static_assert(__is_signed(long double));2134 2135 static_assert(!__is_signed(bool));2136 static_assert(!__is_signed(cvoid));2137 static_assert(!__is_signed(unsigned char));2138 static_assert(!__is_signed(unsigned int));2139 static_assert(!__is_signed(unsigned long long));2140 static_assert(!__is_signed(unsigned long));2141 static_assert(!__is_signed(unsigned short));2142 static_assert(!__is_signed(void));2143 static_assert(!__is_signed(ClassType));2144 static_assert(!__is_signed(Derives));2145 static_assert(!__is_signed(Enum));2146 static_assert(!__is_signed(SignedEnum));2147 static_assert(!__is_signed(IntArNB));2148 static_assert(!__is_signed(Union));2149 static_assert(!__is_signed(UnionAr));2150 static_assert(!__is_signed(UnsignedEnum));2151}2152 2153void is_unsigned()2154{2155 static_assert(__is_unsigned(bool));2156 static_assert(__is_unsigned(unsigned char));2157 static_assert(__is_unsigned(unsigned short));2158 static_assert(__is_unsigned(unsigned int));2159 static_assert(__is_unsigned(unsigned long));2160 static_assert(__is_unsigned(unsigned long long));2161 2162 static_assert(!__is_unsigned(void));2163 static_assert(!__is_unsigned(cvoid));2164 static_assert(!__is_unsigned(float));2165 static_assert(!__is_unsigned(double));2166 static_assert(!__is_unsigned(long double));2167 static_assert(!__is_unsigned(char));2168 static_assert(!__is_unsigned(signed char));2169 static_assert(!__is_unsigned(wchar_t));2170 static_assert(!__is_unsigned(short));2171 static_assert(!__is_unsigned(int));2172 static_assert(!__is_unsigned(long));2173 static_assert(!__is_unsigned(Union));2174 static_assert(!__is_unsigned(UnionAr));2175 static_assert(!__is_unsigned(Derives));2176 static_assert(!__is_unsigned(ClassType));2177 static_assert(!__is_unsigned(IntArNB));2178 static_assert(!__is_unsigned(Enum));2179 static_assert(!__is_unsigned(UnsignedEnum));2180 static_assert(!__is_unsigned(SignedEnum));2181}2182 2183typedef Int& IntRef;2184typedef const IntAr ConstIntAr;2185typedef ConstIntAr ConstIntArAr[4];2186 2187struct HasCopy {2188 HasCopy(HasCopy& cp);2189};2190 2191struct HasMove {2192 HasMove(HasMove&& cp);2193};2194 2195struct HasTemplateCons {2196 HasVirt Annoying;2197 2198 template <typename T>2199 HasTemplateCons(const T&);2200};2201 2202void has_trivial_default_constructor() {2203 static_assert(__has_trivial_constructor(Int));2204 static_assert(__has_trivial_constructor(IntAr));2205 static_assert(__has_trivial_constructor(Union));2206 static_assert(__has_trivial_constructor(UnionAr));2207 static_assert(__has_trivial_constructor(POD));2208 static_assert(__has_trivial_constructor(Derives));2209 static_assert(__has_trivial_constructor(DerivesAr));2210 static_assert(__has_trivial_constructor(ConstIntAr));2211 static_assert(__has_trivial_constructor(ConstIntArAr));2212 static_assert(__has_trivial_constructor(HasDest));2213 static_assert(__has_trivial_constructor(HasPriv));2214 static_assert(__has_trivial_constructor(HasCopyAssign));2215 static_assert(__has_trivial_constructor(HasMoveAssign));2216 static_assert(__has_trivial_constructor(const Int));2217 static_assert(__has_trivial_constructor(AllDefaulted));2218 static_assert(__has_trivial_constructor(AllDeleted));2219 static_assert(__has_trivial_constructor(ACompleteType[]));2220 2221 static_assert(!__has_trivial_constructor(AnIncompleteType[])); // expected-error {{incomplete type}}2222 static_assert(!__has_trivial_constructor(HasCons));2223 static_assert(!__has_trivial_constructor(HasRef));2224 static_assert(!__has_trivial_constructor(HasCopy));2225 static_assert(!__has_trivial_constructor(IntRef));2226 static_assert(!__has_trivial_constructor(VirtAr));2227 static_assert(!__has_trivial_constructor(void));2228 static_assert(!__has_trivial_constructor(cvoid));2229 static_assert(!__has_trivial_constructor(HasTemplateCons));2230 static_assert(!__has_trivial_constructor(AllPrivate));2231 static_assert(!__has_trivial_constructor(ExtDefaulted));2232}2233 2234void has_trivial_move_constructor() {2235 // n3376 12.8 [class.copy]/122236 // A copy/move constructor for class X is trivial if it is not2237 // user-provided, its declared parameter type is the same as2238 // if it had been implicitly declared, and if2239 // - class X has no virtual functions (10.3) and no virtual2240 // base classes (10.1), and2241 // - the constructor selected to copy/move each direct base2242 // class subobject is trivial, and2243 // - for each non-static data member of X that is of class2244 // type (or array thereof), the constructor selected2245 // to copy/move that member is trivial;2246 // otherwise the copy/move constructor is non-trivial.2247 static_assert(__has_trivial_move_constructor(POD));2248 static_assert(__has_trivial_move_constructor(Union));2249 static_assert(__has_trivial_move_constructor(HasCons));2250 static_assert(__has_trivial_move_constructor(HasStaticMemberMoveCtor));2251 static_assert(__has_trivial_move_constructor(AllDeleted));2252 static_assert(__has_trivial_move_constructor(ACompleteType[]));2253 2254 static_assert(!__has_trivial_move_constructor(AnIncompleteType[])); // expected-error {{incomplete type}}2255 static_assert(!__has_trivial_move_constructor(HasVirt));2256 static_assert(!__has_trivial_move_constructor(DerivesVirt));2257 static_assert(!__has_trivial_move_constructor(HasMoveCtor));2258 static_assert(!__has_trivial_move_constructor(DerivesHasMoveCtor));2259 static_assert(!__has_trivial_move_constructor(HasMemberMoveCtor));2260}2261 2262void has_trivial_copy_constructor() {2263 static_assert(__has_trivial_copy(Int));2264 static_assert(__has_trivial_copy(IntAr));2265 static_assert(__has_trivial_copy(Union));2266 static_assert(__has_trivial_copy(UnionAr));2267 static_assert(__has_trivial_copy(POD));2268 static_assert(__has_trivial_copy(Derives));2269 static_assert(__has_trivial_copy(ConstIntAr));2270 static_assert(__has_trivial_copy(ConstIntArAr));2271 static_assert(__has_trivial_copy(HasDest));2272 static_assert(__has_trivial_copy(HasPriv));2273 static_assert(__has_trivial_copy(HasCons));2274 static_assert(__has_trivial_copy(HasRef));2275 static_assert(__has_trivial_copy(HasMove));2276 static_assert(__has_trivial_copy(IntRef));2277 static_assert(__has_trivial_copy(HasCopyAssign));2278 static_assert(__has_trivial_copy(HasMoveAssign));2279 static_assert(__has_trivial_copy(const Int));2280 static_assert(__has_trivial_copy(AllDefaulted));2281 static_assert(__has_trivial_copy(AllDeleted));2282 static_assert(__has_trivial_copy(DerivesAr));2283 static_assert(__has_trivial_copy(DerivesHasRef));2284 static_assert(__has_trivial_copy(ACompleteType[]));2285 2286 static_assert(!__has_trivial_copy(AnIncompleteType[])); // expected-error {{incomplete type}}2287 static_assert(!__has_trivial_copy(HasCopy));2288 static_assert(!__has_trivial_copy(HasTemplateCons));2289 static_assert(!__has_trivial_copy(VirtAr));2290 static_assert(!__has_trivial_copy(void));2291 static_assert(!__has_trivial_copy(cvoid));2292 static_assert(!__has_trivial_copy(AllPrivate));2293 static_assert(!__has_trivial_copy(ExtDefaulted));2294}2295 2296void has_trivial_copy_assignment() {2297 static_assert(__has_trivial_assign(Int));2298 static_assert(__has_trivial_assign(IntAr));2299 static_assert(__has_trivial_assign(Union));2300 static_assert(__has_trivial_assign(UnionAr));2301 static_assert(__has_trivial_assign(POD));2302 static_assert(__has_trivial_assign(Derives));2303 static_assert(__has_trivial_assign(HasDest));2304 static_assert(__has_trivial_assign(HasPriv));2305 static_assert(__has_trivial_assign(HasCons));2306 static_assert(__has_trivial_assign(HasRef));2307 static_assert(__has_trivial_assign(HasCopy));2308 static_assert(__has_trivial_assign(HasMove));2309 static_assert(__has_trivial_assign(HasMoveAssign));2310 static_assert(__has_trivial_assign(AllDefaulted));2311 static_assert(__has_trivial_assign(AllDeleted));2312 static_assert(__has_trivial_assign(DerivesAr));2313 static_assert(__has_trivial_assign(DerivesHasRef));2314 static_assert(__has_trivial_assign(ACompleteType[]));2315 2316 static_assert(!__has_trivial_assign(AnIncompleteType[])); // expected-error {{incomplete type}}2317 static_assert(!__has_trivial_assign(IntRef));2318 static_assert(!__has_trivial_assign(HasCopyAssign));2319 static_assert(!__has_trivial_assign(const Int));2320 static_assert(!__has_trivial_assign(ConstIntAr));2321 static_assert(!__has_trivial_assign(ConstIntArAr));2322 static_assert(!__has_trivial_assign(VirtAr));2323 static_assert(!__has_trivial_assign(void));2324 static_assert(!__has_trivial_assign(cvoid));2325 static_assert(!__has_trivial_assign(AllPrivate));2326 static_assert(!__has_trivial_assign(ExtDefaulted));2327}2328 2329void has_trivial_destructor() {2330 static_assert(__has_trivial_destructor(Int));2331 static_assert(__has_trivial_destructor(IntAr));2332 static_assert(__has_trivial_destructor(Union));2333 static_assert(__has_trivial_destructor(UnionAr));2334 static_assert(__has_trivial_destructor(POD));2335 static_assert(__has_trivial_destructor(Derives));2336 static_assert(__has_trivial_destructor(ConstIntAr));2337 static_assert(__has_trivial_destructor(ConstIntArAr));2338 static_assert(__has_trivial_destructor(HasPriv));2339 static_assert(__has_trivial_destructor(HasCons));2340 static_assert(__has_trivial_destructor(HasRef));2341 static_assert(__has_trivial_destructor(HasCopy));2342 static_assert(__has_trivial_destructor(HasMove));2343 static_assert(__has_trivial_destructor(IntRef));2344 static_assert(__has_trivial_destructor(HasCopyAssign));2345 static_assert(__has_trivial_destructor(HasMoveAssign));2346 static_assert(__has_trivial_destructor(const Int));2347 static_assert(__has_trivial_destructor(DerivesAr));2348 static_assert(__has_trivial_destructor(VirtAr));2349 static_assert(__has_trivial_destructor(AllDefaulted));2350 static_assert(__has_trivial_destructor(AllDeleted));2351 static_assert(__has_trivial_destructor(DerivesHasRef));2352 static_assert(__has_trivial_destructor(ACompleteType[]));2353 2354 static_assert(!__has_trivial_destructor(HasDest));2355 static_assert(!__has_trivial_destructor(AnIncompleteType[])); // expected-error {{incomplete type}}2356 static_assert(!__has_trivial_destructor(void));2357 static_assert(!__has_trivial_destructor(cvoid));2358 static_assert(!__has_trivial_destructor(AllPrivate));2359 static_assert(!__has_trivial_destructor(ExtDefaulted));2360}2361 2362struct A { ~A() {} };2363template<typename> struct B : A { };2364 2365void f() {2366 static_assert(!__has_trivial_destructor(A));2367 static_assert(!__has_trivial_destructor(B<int>));2368}2369 2370class PR11110 {2371 template <int> int operator=( int );2372 int operator=(PR11110);2373};2374 2375class UsingAssign;2376 2377class UsingAssignBase {2378protected:2379 UsingAssign &operator=(const UsingAssign&) throw();2380};2381 2382class UsingAssign : public UsingAssignBase {2383public:2384 using UsingAssignBase::operator=;2385};2386 2387void has_nothrow_assign() {2388 static_assert(__has_nothrow_assign(Int));2389 static_assert(__has_nothrow_assign(IntAr));2390 static_assert(__has_nothrow_assign(Union));2391 static_assert(__has_nothrow_assign(UnionAr));2392 static_assert(__has_nothrow_assign(POD));2393 static_assert(__has_nothrow_assign(Derives));2394 static_assert(__has_nothrow_assign(HasDest));2395 static_assert(__has_nothrow_assign(HasPriv));2396 static_assert(__has_nothrow_assign(HasCons));2397 static_assert(__has_nothrow_assign(HasRef));2398 static_assert(__has_nothrow_assign(HasCopy));2399 static_assert(__has_nothrow_assign(HasMove));2400 static_assert(__has_nothrow_assign(HasMoveAssign));2401 static_assert(__has_nothrow_assign(HasNoThrowCopyAssign));2402 static_assert(__has_nothrow_assign(HasMultipleNoThrowCopyAssign));2403 static_assert(__has_nothrow_assign(HasVirtDest));2404 static_assert(__has_nothrow_assign(AllPrivate));2405 static_assert(__has_nothrow_assign(UsingAssign));2406 static_assert(__has_nothrow_assign(DerivesAr));2407 static_assert(__has_nothrow_assign(ACompleteType[]));2408 2409 static_assert(!__has_nothrow_assign(AnIncompleteType[])); // expected-error {{incomplete type}}2410 static_assert(!__has_nothrow_assign(IntRef));2411 static_assert(!__has_nothrow_assign(HasCopyAssign));2412 static_assert(!__has_nothrow_assign(HasMultipleCopyAssign));2413 static_assert(!__has_nothrow_assign(const Int));2414 static_assert(!__has_nothrow_assign(ConstIntAr));2415 static_assert(!__has_nothrow_assign(ConstIntArAr));2416 static_assert(!__has_nothrow_assign(VirtAr));2417 static_assert(!__has_nothrow_assign(void));2418 static_assert(!__has_nothrow_assign(cvoid));2419 static_assert(!__has_nothrow_assign(PR11110));2420}2421 2422void has_nothrow_move_assign() {2423 static_assert(__has_nothrow_move_assign(Int));2424 static_assert(__has_nothrow_move_assign(Enum));2425 static_assert(__has_nothrow_move_assign(Int*));2426 static_assert(__has_nothrow_move_assign(Enum POD::*));2427 static_assert(__has_nothrow_move_assign(POD));2428 static_assert(__has_nothrow_move_assign(HasPriv));2429 static_assert(__has_nothrow_move_assign(HasNoThrowMoveAssign));2430 static_assert(__has_nothrow_move_assign(HasNoExceptNoThrowMoveAssign));2431 static_assert(__has_nothrow_move_assign(HasMemberNoThrowMoveAssign));2432 static_assert(__has_nothrow_move_assign(HasMemberNoExceptNoThrowMoveAssign));2433 static_assert(__has_nothrow_move_assign(AllDeleted));2434 static_assert(__has_nothrow_move_assign(ACompleteType[]));2435 2436 static_assert(!__has_nothrow_move_assign(AnIncompleteType[])); // expected-error {{incomplete type}}2437 static_assert(!__has_nothrow_move_assign(HasThrowMoveAssign));2438 static_assert(!__has_nothrow_move_assign(HasNoExceptFalseMoveAssign));2439 static_assert(!__has_nothrow_move_assign(HasMemberThrowMoveAssign));2440 static_assert(!__has_nothrow_move_assign(HasMemberNoExceptFalseMoveAssign));2441 static_assert(!__has_nothrow_move_assign(NoDefaultMoveAssignDueToUDCopyCtor));2442 static_assert(!__has_nothrow_move_assign(NoDefaultMoveAssignDueToUDCopyAssign));2443 static_assert(!__has_nothrow_move_assign(NoDefaultMoveAssignDueToDtor));2444 2445 2446 static_assert(__is_nothrow_assignable(HasNoThrowMoveAssign, HasNoThrowMoveAssign));2447 static_assert(!__is_nothrow_assignable(HasThrowMoveAssign, HasThrowMoveAssign));2448 2449 static_assert(__is_assignable(HasNoThrowMoveAssign, HasNoThrowMoveAssign));2450 static_assert(__is_assignable(HasThrowMoveAssign, HasThrowMoveAssign));2451}2452 2453void has_trivial_move_assign() {2454 // n3376 12.8 [class.copy]/252455 // A copy/move assignment operator for class X is trivial if it2456 // is not user-provided, its declared parameter type is the same2457 // as if it had been implicitly declared, and if:2458 // - class X has no virtual functions (10.3) and no virtual base2459 // classes (10.1), and2460 // - the assignment operator selected to copy/move each direct2461 // base class subobject is trivial, and2462 // - for each non-static data member of X that is of class type2463 // (or array thereof), the assignment operator2464 // selected to copy/move that member is trivial;2465 static_assert(__has_trivial_move_assign(Int));2466 static_assert(__has_trivial_move_assign(HasStaticMemberMoveAssign));2467 static_assert(__has_trivial_move_assign(AllDeleted));2468 static_assert(__has_trivial_move_assign(ACompleteType[]));2469 2470 static_assert(!__has_trivial_move_assign(AnIncompleteType[])); // expected-error {{incomplete type}}2471 static_assert(!__has_trivial_move_assign(HasVirt));2472 static_assert(!__has_trivial_move_assign(DerivesVirt));2473 static_assert(!__has_trivial_move_assign(HasMoveAssign));2474 static_assert(!__has_trivial_move_assign(DerivesHasMoveAssign));2475 static_assert(!__has_trivial_move_assign(HasMemberMoveAssign));2476 static_assert(!__has_nothrow_move_assign(NoDefaultMoveAssignDueToUDCopyCtor));2477 static_assert(!__has_nothrow_move_assign(NoDefaultMoveAssignDueToUDCopyAssign));2478}2479 2480void has_nothrow_copy() {2481 static_assert(__has_nothrow_copy(Int));2482 static_assert(__has_nothrow_copy(IntAr));2483 static_assert(__has_nothrow_copy(Union));2484 static_assert(__has_nothrow_copy(UnionAr));2485 static_assert(__has_nothrow_copy(POD));2486 static_assert(__has_nothrow_copy(const Int));2487 static_assert(__has_nothrow_copy(ConstIntAr));2488 static_assert(__has_nothrow_copy(ConstIntArAr));2489 static_assert(__has_nothrow_copy(Derives));2490 static_assert(__has_nothrow_copy(IntRef));2491 static_assert(__has_nothrow_copy(HasDest));2492 static_assert(__has_nothrow_copy(HasPriv));2493 static_assert(__has_nothrow_copy(HasCons));2494 static_assert(__has_nothrow_copy(HasRef));2495 static_assert(__has_nothrow_copy(HasMove));2496 static_assert(__has_nothrow_copy(HasCopyAssign));2497 static_assert(__has_nothrow_copy(HasMoveAssign));2498 static_assert(__has_nothrow_copy(HasNoThrowCopy));2499 static_assert(__has_nothrow_copy(HasMultipleNoThrowCopy));2500 static_assert(__has_nothrow_copy(HasVirtDest));2501 static_assert(__has_nothrow_copy(HasTemplateCons));2502 static_assert(__has_nothrow_copy(AllPrivate));2503 static_assert(__has_nothrow_copy(DerivesAr));2504 static_assert(__has_nothrow_copy(ACompleteType[]));2505 2506 static_assert(!__has_nothrow_copy(AnIncompleteType[])); // expected-error {{incomplete type}}2507 static_assert(!__has_nothrow_copy(HasCopy));2508 static_assert(!__has_nothrow_copy(HasMultipleCopy));2509 static_assert(!__has_nothrow_copy(VirtAr));2510 static_assert(!__has_nothrow_copy(void));2511 static_assert(!__has_nothrow_copy(cvoid));2512}2513 2514void has_nothrow_constructor() {2515 static_assert(__has_nothrow_constructor(Int));2516 static_assert(__has_nothrow_constructor(IntAr));2517 static_assert(__has_nothrow_constructor(Union));2518 static_assert(__has_nothrow_constructor(UnionAr));2519 static_assert(__has_nothrow_constructor(POD));2520 static_assert(__has_nothrow_constructor(Derives));2521 static_assert(__has_nothrow_constructor(DerivesAr));2522 static_assert(__has_nothrow_constructor(ConstIntAr));2523 static_assert(__has_nothrow_constructor(ConstIntArAr));2524 static_assert(__has_nothrow_constructor(HasDest));2525 static_assert(__has_nothrow_constructor(HasPriv));2526 static_assert(__has_nothrow_constructor(HasCopyAssign));2527 static_assert(__has_nothrow_constructor(const Int));2528 static_assert(__has_nothrow_constructor(HasNoThrowConstructor));2529 static_assert(__has_nothrow_constructor(HasVirtDest));2530 // static_assert(__has_nothrow_constructor(VirtAr)); // not implemented2531 static_assert(__has_nothrow_constructor(AllPrivate));2532 static_assert(__has_nothrow_constructor(ACompleteType[]));2533 2534 static_assert(!__has_nothrow_constructor(AnIncompleteType[])); // expected-error {{incomplete type}}2535 static_assert(!__has_nothrow_constructor(HasCons));2536 static_assert(!__has_nothrow_constructor(HasRef));2537 static_assert(!__has_nothrow_constructor(HasCopy));2538 static_assert(!__has_nothrow_constructor(HasMove));2539 static_assert(!__has_nothrow_constructor(HasNoThrowConstructorWithArgs));2540 static_assert(!__has_nothrow_constructor(IntRef));2541 static_assert(!__has_nothrow_constructor(void));2542 static_assert(!__has_nothrow_constructor(cvoid));2543 static_assert(!__has_nothrow_constructor(HasTemplateCons));2544 2545 static_assert(!__has_nothrow_constructor(HasMultipleDefaultConstructor1));2546 static_assert(!__has_nothrow_constructor(HasMultipleDefaultConstructor2));2547}2548 2549void has_virtual_destructor() {2550 static_assert(!__has_virtual_destructor(Int));2551 static_assert(!__has_virtual_destructor(IntAr));2552 static_assert(!__has_virtual_destructor(Union));2553 static_assert(!__has_virtual_destructor(UnionAr));2554 static_assert(!__has_virtual_destructor(POD));2555 static_assert(!__has_virtual_destructor(Derives));2556 static_assert(!__has_virtual_destructor(DerivesAr));2557 static_assert(!__has_virtual_destructor(const Int));2558 static_assert(!__has_virtual_destructor(ConstIntAr));2559 static_assert(!__has_virtual_destructor(ConstIntArAr));2560 static_assert(!__has_virtual_destructor(HasDest));2561 static_assert(!__has_virtual_destructor(HasPriv));2562 static_assert(!__has_virtual_destructor(HasCons));2563 static_assert(!__has_virtual_destructor(HasRef));2564 static_assert(!__has_virtual_destructor(HasCopy));2565 static_assert(!__has_virtual_destructor(HasMove));2566 static_assert(!__has_virtual_destructor(HasCopyAssign));2567 static_assert(!__has_virtual_destructor(HasMoveAssign));2568 static_assert(!__has_virtual_destructor(IntRef));2569 static_assert(!__has_virtual_destructor(VirtAr));2570 static_assert(!__has_virtual_destructor(ACompleteType[]));2571 2572 static_assert(!__has_virtual_destructor(AnIncompleteType[])); // expected-error {{incomplete type}}2573 static_assert(__has_virtual_destructor(HasVirtDest));2574 static_assert(__has_virtual_destructor(DerivedVirtDest));2575 static_assert(!__has_virtual_destructor(VirtDestAr));2576 static_assert(!__has_virtual_destructor(void));2577 static_assert(!__has_virtual_destructor(cvoid));2578 static_assert(!__has_virtual_destructor(AllPrivate));2579}2580 2581 2582class Base {};2583class Derived : Base {};2584class Derived2a : Derived {};2585class Derived2b : Derived {};2586class Derived3 : virtual Derived2a, virtual Derived2b {};2587template<typename T> struct BaseA { T a; };2588template<typename T> struct DerivedB : BaseA<T> { };2589template<typename T> struct CrazyDerived : T { };2590 2591 2592class class_forward; // expected-note 4 {{forward declaration of 'class_forward'}}2593 2594template <class T> class DerivedTemp : Base {};2595template <class T> class NonderivedTemp {};2596template <class T> class UndefinedTemp; // expected-note 2 {{declared here}}2597 2598void is_base_of() {2599 static_assert(__is_base_of(Base, Derived));2600 static_assert(__is_base_of(const Base, Derived));2601 static_assert(!__is_base_of(Derived, Base));2602 static_assert(!__is_base_of(Derived, int));2603 static_assert(__is_base_of(Base, Base));2604 static_assert(__is_base_of(Base, Derived3));2605 static_assert(__is_base_of(Derived, Derived3));2606 static_assert(__is_base_of(Derived2b, Derived3));2607 static_assert(__is_base_of(Derived2a, Derived3));2608 static_assert(__is_base_of(BaseA<int>, DerivedB<int>));2609 static_assert(!__is_base_of(DerivedB<int>, BaseA<int>));2610 static_assert(__is_base_of(Base, CrazyDerived<Base>));2611 static_assert(!__is_base_of(Union, Union));2612 static_assert(__is_base_of(Empty, Empty));2613 static_assert(__is_base_of(class_forward, class_forward));2614 static_assert(!__is_base_of(Empty, class_forward)); // expected-error {{incomplete type 'class_forward' used in type trait expression}}2615 static_assert(!__is_base_of(Base&, Derived&));2616 static_assert(!__is_base_of(Base[10], Derived[10]));2617 static_assert(!__is_base_of(int, int));2618 static_assert(!__is_base_of(long, int));2619 static_assert(__is_base_of(Base, DerivedTemp<int>));2620 static_assert(!__is_base_of(Base, NonderivedTemp<int>));2621 static_assert(!__is_base_of(Base, UndefinedTemp<int>)); // expected-error {{implicit instantiation of undefined template 'UndefinedTemp<int>'}}2622 2623 static_assert(!__is_base_of(IncompleteUnion, IncompleteUnion));2624 static_assert(!__is_base_of(Union, IncompleteUnion));2625 static_assert(!__is_base_of(IncompleteUnion, Union));2626 static_assert(!__is_base_of(IncompleteStruct, IncompleteUnion));2627 static_assert(!__is_base_of(IncompleteUnion, IncompleteStruct));2628 static_assert(!__is_base_of(Empty, IncompleteUnion));2629 static_assert(!__is_base_of(IncompleteUnion, Empty));2630 static_assert(!__is_base_of(int, IncompleteUnion));2631 static_assert(!__is_base_of(IncompleteUnion, int));2632 static_assert(!__is_base_of(Empty, Union));2633 static_assert(!__is_base_of(Union, Empty));2634 static_assert(!__is_base_of(int, Empty));2635 static_assert(!__is_base_of(Union, int));2636 2637 static_assert(__is_base_of(Base, Derived));2638 static_assert(!__is_base_of(Derived, Base));2639 2640 static_assert(__is_base_of(Base, CrazyDerived<Base>));2641 static_assert(!__is_base_of(CrazyDerived<Base>, Base));2642 2643 static_assert(__is_base_of(BaseA<int>, DerivedB<int>));2644 static_assert(!__is_base_of(DerivedB<int>, BaseA<int>));2645}2646 2647struct DerivedTransitiveViaNonVirtual : Derived3 {};2648struct DerivedTransitiveViaVirtual : virtual Derived3 {};2649 2650template <typename T>2651struct CrazyDerivedVirtual : virtual T {};2652 2653struct DerivedPrivate : private virtual Base {};2654struct DerivedProtected : protected virtual Base {};2655struct DerivedPrivatePrivate : private DerivedPrivate {};2656struct DerivedPrivateProtected : private DerivedProtected {};2657struct DerivedProtectedPrivate : protected DerivedProtected {};2658struct DerivedProtectedProtected : protected DerivedProtected {};2659 2660void is_virtual_base_of(int n) {2661 static_assert(!__builtin_is_virtual_base_of(Base, Derived));2662 static_assert(!__builtin_is_virtual_base_of(const Base, Derived));2663 static_assert(!__builtin_is_virtual_base_of(Derived, Base));2664 static_assert(!__builtin_is_virtual_base_of(Derived, int));2665 static_assert(!__builtin_is_virtual_base_of(Base, Base));2666 static_assert(!__builtin_is_virtual_base_of(Base, Derived3));2667 static_assert(!__builtin_is_virtual_base_of(Derived, Derived3));2668 static_assert(__builtin_is_virtual_base_of(Derived2b, Derived3));2669 static_assert(__builtin_is_virtual_base_of(Derived2a, Derived3));2670 static_assert(!__builtin_is_virtual_base_of(BaseA<int>, DerivedB<int>));2671 static_assert(!__builtin_is_virtual_base_of(DerivedB<int>, BaseA<int>));2672 static_assert(!__builtin_is_virtual_base_of(Union, Union));2673 static_assert(!__builtin_is_virtual_base_of(Empty, Empty));2674 static_assert(!__builtin_is_virtual_base_of(class_forward, class_forward)); // expected-error {{incomplete type 'class_forward' where a complete type is required}}2675 static_assert(!__builtin_is_virtual_base_of(Empty, class_forward)); // expected-error {{incomplete type 'class_forward' where a complete type is required}}2676 static_assert(!__builtin_is_virtual_base_of(class_forward, Empty));2677 static_assert(!__builtin_is_virtual_base_of(Base&, Derived&));2678 static_assert(!__builtin_is_virtual_base_of(Base[10], Derived[10]));2679 static_assert(!__builtin_is_virtual_base_of(Base[n], Derived[n])); // expected-error 2 {{variable length arrays are not supported in '__builtin_is_virtual_base_of'}}2680 static_assert(!__builtin_is_virtual_base_of(int, int));2681 static_assert(!__builtin_is_virtual_base_of(int[], int[]));2682 static_assert(!__builtin_is_virtual_base_of(long, int));2683 static_assert(!__builtin_is_virtual_base_of(Base, DerivedTemp<int>));2684 static_assert(!__builtin_is_virtual_base_of(Base, NonderivedTemp<int>));2685 static_assert(!__builtin_is_virtual_base_of(Base, UndefinedTemp<int>)); // expected-error {{implicit instantiation of undefined template 'UndefinedTemp<int>'}}2686 static_assert(__builtin_is_virtual_base_of(Base, DerivedPrivate));2687 static_assert(__builtin_is_virtual_base_of(Base, DerivedProtected));2688 static_assert(__builtin_is_virtual_base_of(Base, DerivedPrivatePrivate));2689 static_assert(__builtin_is_virtual_base_of(Base, DerivedPrivateProtected));2690 static_assert(__builtin_is_virtual_base_of(Base, DerivedProtectedPrivate));2691 static_assert(__builtin_is_virtual_base_of(Base, DerivedProtectedProtected));2692 static_assert(__builtin_is_virtual_base_of(Derived2a, DerivedTransitiveViaNonVirtual));2693 static_assert(__builtin_is_virtual_base_of(Derived2b, DerivedTransitiveViaNonVirtual));2694 static_assert(__builtin_is_virtual_base_of(Derived2a, DerivedTransitiveViaVirtual));2695 static_assert(__builtin_is_virtual_base_of(Derived2b, DerivedTransitiveViaVirtual));2696 static_assert(!__builtin_is_virtual_base_of(Base, CrazyDerived<Base>));2697 static_assert(!__builtin_is_virtual_base_of(CrazyDerived<Base>, Base));2698 static_assert(__builtin_is_virtual_base_of(Base, CrazyDerivedVirtual<Base>));2699 static_assert(!__builtin_is_virtual_base_of(CrazyDerivedVirtual<Base>, Base));2700 2701 static_assert(!__builtin_is_virtual_base_of(IncompleteUnion, IncompleteUnion));2702 static_assert(!__builtin_is_virtual_base_of(Union, IncompleteUnion));2703 static_assert(!__builtin_is_virtual_base_of(IncompleteUnion, Union));2704 static_assert(!__builtin_is_virtual_base_of(IncompleteStruct, IncompleteUnion));2705 static_assert(!__builtin_is_virtual_base_of(IncompleteUnion, IncompleteStruct));2706 static_assert(!__builtin_is_virtual_base_of(Empty, IncompleteUnion));2707 static_assert(!__builtin_is_virtual_base_of(IncompleteUnion, Empty));2708 static_assert(!__builtin_is_virtual_base_of(int, IncompleteUnion));2709 static_assert(!__builtin_is_virtual_base_of(IncompleteUnion, int));2710 static_assert(!__builtin_is_virtual_base_of(Empty, Union));2711 static_assert(!__builtin_is_virtual_base_of(Union, Empty));2712 static_assert(!__builtin_is_virtual_base_of(int, Empty));2713 static_assert(!__builtin_is_virtual_base_of(Union, int));2714 static_assert(!__builtin_is_virtual_base_of(IncompleteStruct, IncompleteStruct[n])); // expected-error {{variable length arrays are not supported in '__builtin_is_virtual_base_of'}}2715}2716 2717template<class T, class U>2718class TemplateClass {};2719 2720template<class T>2721using TemplateAlias = TemplateClass<T, int>;2722 2723typedef class Base BaseTypedef;2724 2725void is_same()2726{2727 static_assert(__is_same(Base, Base));2728 static_assert(__is_same(Base, BaseTypedef));2729 static_assert(__is_same(TemplateClass<int, int>, TemplateAlias<int>));2730 2731 static_assert(!__is_same(Base, const Base));2732 static_assert(!__is_same(Base, Base&));2733 static_assert(!__is_same(Base, Derived));2734 2735 // __is_same_as is a GCC compatibility synonym for __is_same.2736 static_assert(__is_same_as(int, int));2737 static_assert(!__is_same_as(int, float));2738}2739 2740struct IntWrapper2741{2742 int value;2743 IntWrapper(int _value) : value(_value) {}2744 operator int() const noexcept {2745 return value;2746 }2747};2748 2749struct FloatWrapper2750{2751 float value;2752 FloatWrapper(float _value) noexcept : value(_value) {}2753 FloatWrapper(const IntWrapper& obj)2754 : value(static_cast<float>(obj.value)) {}2755 operator float() const {2756 return value;2757 }2758 operator IntWrapper() const {2759 return IntWrapper(static_cast<int>(value));2760 }2761};2762 2763template<typename A, typename B, bool result = __is_convertible(A, B)>2764static constexpr bool is_convertible_sfinae() { return result; }2765 2766void is_convertible()2767{2768 static_assert(__is_convertible(IntWrapper, IntWrapper));2769 static_assert(__is_convertible(IntWrapper, const IntWrapper));2770 static_assert(__is_convertible(IntWrapper, int));2771 static_assert(__is_convertible(int, IntWrapper));2772 static_assert(__is_convertible(IntWrapper, FloatWrapper));2773 static_assert(__is_convertible(FloatWrapper, IntWrapper));2774 static_assert(__is_convertible(FloatWrapper, float));2775 static_assert(__is_convertible(float, FloatWrapper));2776 static_assert(__is_convertible(IntWrapper, IntWrapper&&));2777 static_assert(__is_convertible(IntWrapper, const IntWrapper&));2778 static_assert(__is_convertible(IntWrapper, int&&));2779 static_assert(__is_convertible(IntWrapper, const int&));2780 static_assert(__is_convertible(int, IntWrapper&&));2781 static_assert(__is_convertible(int, const IntWrapper&));2782 static_assert(__is_convertible(IntWrapper, FloatWrapper&&));2783 static_assert(__is_convertible(IntWrapper, const FloatWrapper&));2784 static_assert(__is_convertible(FloatWrapper, IntWrapper&&));2785 static_assert(__is_convertible(FloatWrapper, const IntWrapper&&));2786 static_assert(__is_convertible(FloatWrapper, float&&));2787 static_assert(__is_convertible(FloatWrapper, const float&));2788 static_assert(__is_convertible(float, FloatWrapper&&));2789 static_assert(__is_convertible(float, const FloatWrapper&));2790 2791 static_assert(!__is_convertible(AllPrivate, AllPrivate));2792 // Make sure we don't emit "calling a private constructor" in SFINAE context.2793 static_assert(!is_convertible_sfinae<AllPrivate, AllPrivate>());2794}2795 2796void is_nothrow_convertible()2797{2798 static_assert(__is_nothrow_convertible(IntWrapper, IntWrapper));2799 static_assert(__is_nothrow_convertible(IntWrapper, const IntWrapper));2800 static_assert(__is_nothrow_convertible(IntWrapper, int));2801 static_assert(!__is_nothrow_convertible(int, IntWrapper));2802 static_assert(!__is_nothrow_convertible(IntWrapper, FloatWrapper));2803 static_assert(!__is_nothrow_convertible(FloatWrapper, IntWrapper));2804 static_assert(!__is_nothrow_convertible(FloatWrapper, float));2805 static_assert(__is_nothrow_convertible(float, FloatWrapper));2806 static_assert(__is_nothrow_convertible(IntWrapper, IntWrapper&&));2807 static_assert(__is_nothrow_convertible(IntWrapper, const IntWrapper&));2808 static_assert(__is_nothrow_convertible(IntWrapper, int&&));2809 static_assert(__is_nothrow_convertible(IntWrapper, const int&));2810 static_assert(!__is_nothrow_convertible(int, IntWrapper&&));2811 static_assert(!__is_nothrow_convertible(int, const IntWrapper&));2812 static_assert(!__is_nothrow_convertible(IntWrapper, FloatWrapper&&));2813 static_assert(!__is_nothrow_convertible(IntWrapper, const FloatWrapper&));2814 static_assert(!__is_nothrow_convertible(FloatWrapper, IntWrapper&&));2815 static_assert(!__is_nothrow_convertible(FloatWrapper, const IntWrapper&));2816 static_assert(!__is_nothrow_convertible(FloatWrapper, float&&));2817 static_assert(!__is_nothrow_convertible(FloatWrapper, const float&));2818 static_assert(__is_nothrow_convertible(float, FloatWrapper&&));2819 static_assert(__is_nothrow_convertible(float, const FloatWrapper&));2820}2821 2822struct FromInt { FromInt(int); };2823struct ToInt { operator int(); };2824typedef void Function();2825 2826void is_convertible_to();2827class PrivateCopy {2828 PrivateCopy(const PrivateCopy&);2829 friend void is_convertible_to();2830};2831 2832template<typename T>2833struct X0 {2834 template<typename U> X0(const X0<U>&);2835};2836 2837struct Abstract { virtual void f() = 0; };2838 2839void is_convertible_to() {2840 static_assert(__is_convertible_to(Int, Int));2841 static_assert(!__is_convertible_to(Int, IntAr));2842 static_assert(!__is_convertible_to(IntAr, IntAr));2843 static_assert(__is_convertible_to(void, void));2844 static_assert(__is_convertible_to(cvoid, void));2845 static_assert(__is_convertible_to(void, cvoid));2846 static_assert(__is_convertible_to(cvoid, cvoid));2847 static_assert(__is_convertible_to(int, FromInt));2848 static_assert(__is_convertible_to(long, FromInt));2849 static_assert(__is_convertible_to(double, FromInt));2850 static_assert(__is_convertible_to(const int, FromInt));2851 static_assert(__is_convertible_to(const int&, FromInt));2852 static_assert(__is_convertible_to(ToInt, int));2853 static_assert(__is_convertible_to(ToInt, const int&));2854 static_assert(__is_convertible_to(ToInt, long));2855 static_assert(!__is_convertible_to(ToInt, int&));2856 static_assert(!__is_convertible_to(ToInt, FromInt));2857 static_assert(__is_convertible_to(IntAr&, IntAr&));2858 static_assert(__is_convertible_to(IntAr&, const IntAr&));2859 static_assert(!__is_convertible_to(const IntAr&, IntAr&));2860 static_assert(!__is_convertible_to(Function, Function));2861 static_assert(!__is_convertible_to(PrivateCopy, PrivateCopy));2862 static_assert(__is_convertible_to(X0<int>, X0<float>));2863 static_assert(!__is_convertible_to(Abstract, Abstract));2864}2865 2866namespace is_convertible_to_instantiate {2867 // Make sure we don't try to instantiate the constructor.2868 template<int x> class A { A(int) { int a[x]; } };2869 int x = __is_convertible_to(int, A<-1>);2870}2871 2872void is_trivial()2873{2874 static_assert(__is_trivial(int));2875 static_assert(__is_trivial(Enum));2876 static_assert(__is_trivial(POD));2877 static_assert(__is_trivial(Int));2878 static_assert(__is_trivial(IntAr));2879 static_assert(__is_trivial(IntArNB));2880 static_assert(__is_trivial(Statics));2881 static_assert(__is_trivial(Empty));2882 static_assert(__is_trivial(EmptyUnion));2883 static_assert(__is_trivial(Union));2884 static_assert(__is_trivial(Derives));2885 static_assert(__is_trivial(DerivesAr));2886 static_assert(__is_trivial(DerivesArNB));2887 static_assert(__is_trivial(DerivesEmpty));2888 static_assert(__is_trivial(HasFunc));2889 static_assert(__is_trivial(HasOp));2890 static_assert(__is_trivial(HasConv));2891 static_assert(__is_trivial(HasAssign));2892 static_assert(__is_trivial(HasAnonymousUnion));2893 static_assert(__is_trivial(HasPriv));2894 static_assert(__is_trivial(HasProt));2895 static_assert(__is_trivial(DerivesHasPriv));2896 static_assert(__is_trivial(DerivesHasProt));2897 static_assert(__is_trivial(Vector));2898 static_assert(__is_trivial(VectorExt));2899 2900 static_assert(!__is_trivial(HasCons));2901 static_assert(!__is_trivial(HasCopyAssign));2902 static_assert(!__is_trivial(HasMoveAssign));2903 static_assert(!__is_trivial(HasDest));2904 static_assert(!__is_trivial(HasRef));2905 static_assert(!__is_trivial(HasNonPOD));2906 static_assert(!__is_trivial(HasVirt));2907 static_assert(!__is_trivial(DerivesHasCons));2908 static_assert(!__is_trivial(DerivesHasCopyAssign));2909 static_assert(!__is_trivial(DerivesHasMoveAssign));2910 static_assert(!__is_trivial(DerivesHasDest));2911 static_assert(!__is_trivial(DerivesHasRef));2912 static_assert(!__is_trivial(DerivesHasVirt));2913 static_assert(!__is_trivial(void));2914 static_assert(!__is_trivial(cvoid));2915}2916 2917template<typename T> struct TriviallyConstructibleTemplate {};2918 2919template<typename A, typename B, bool result = __is_assignable(A, B)>2920static constexpr bool is_assignable_sfinae() { return result; }2921 2922void trivial_checks()2923{2924 static_assert(__is_trivially_copyable(int));2925 static_assert(__is_trivially_copyable(Enum));2926 static_assert(__is_trivially_copyable(POD));2927 static_assert(__is_trivially_copyable(Int));2928 static_assert(__is_trivially_copyable(IntAr));2929 static_assert(__is_trivially_copyable(IntArNB));2930 static_assert(__is_trivially_copyable(Statics));2931 static_assert(__is_trivially_copyable(Empty));2932 static_assert(__is_trivially_copyable(EmptyUnion));2933 static_assert(__is_trivially_copyable(Union));2934 static_assert(__is_trivially_copyable(Derives));2935 static_assert(__is_trivially_copyable(DerivesAr));2936 static_assert(__is_trivially_copyable(DerivesArNB));2937 static_assert(__is_trivially_copyable(DerivesEmpty));2938 static_assert(__is_trivially_copyable(HasFunc));2939 static_assert(__is_trivially_copyable(HasOp));2940 static_assert(__is_trivially_copyable(HasConv));2941 static_assert(__is_trivially_copyable(HasAssign));2942 static_assert(__is_trivially_copyable(HasAnonymousUnion));2943 static_assert(__is_trivially_copyable(HasPriv));2944 static_assert(__is_trivially_copyable(HasProt));2945 static_assert(__is_trivially_copyable(DerivesHasPriv));2946 static_assert(__is_trivially_copyable(DerivesHasProt));2947 static_assert(__is_trivially_copyable(Vector));2948 static_assert(__is_trivially_copyable(VectorExt));2949 static_assert(__is_trivially_copyable(HasCons));2950 static_assert(__is_trivially_copyable(HasRef));2951 static_assert(__is_trivially_copyable(HasNonPOD));2952 static_assert(__is_trivially_copyable(DerivesHasCons));2953 static_assert(__is_trivially_copyable(DerivesHasRef));2954 static_assert(__is_trivially_copyable(NonTrivialDefault));2955 static_assert(__is_trivially_copyable(NonTrivialDefault[]));2956 static_assert(__is_trivially_copyable(NonTrivialDefault[3]));2957 2958 static_assert(!__is_trivially_copyable(HasCopyAssign));2959 static_assert(!__is_trivially_copyable(HasMoveAssign));2960 static_assert(!__is_trivially_copyable(HasDest));2961 static_assert(!__is_trivially_copyable(HasVirt));2962 static_assert(!__is_trivially_copyable(DerivesHasCopyAssign));2963 static_assert(!__is_trivially_copyable(DerivesHasMoveAssign));2964 static_assert(!__is_trivially_copyable(DerivesHasDest));2965 static_assert(!__is_trivially_copyable(DerivesHasVirt));2966 static_assert(!__is_trivially_copyable(void));2967 static_assert(!__is_trivially_copyable(cvoid));2968 2969 static_assert((__is_trivially_constructible(int)));2970 static_assert((__is_trivially_constructible(int, int)));2971 static_assert((__is_trivially_constructible(int, float)));2972 static_assert((__is_trivially_constructible(int, int&)));2973 static_assert((__is_trivially_constructible(int, const int&)));2974 static_assert((__is_trivially_constructible(int, int)));2975 static_assert((__is_trivially_constructible(HasCopyAssign, HasCopyAssign)));2976 static_assert((__is_trivially_constructible(HasCopyAssign, const HasCopyAssign&)));2977 static_assert((__is_trivially_constructible(HasCopyAssign, HasCopyAssign&&)));2978 static_assert((__is_trivially_constructible(HasCopyAssign)));2979 static_assert((__is_trivially_constructible(NonTrivialDefault,2980 const NonTrivialDefault&)));2981 static_assert((__is_trivially_constructible(NonTrivialDefault,2982 NonTrivialDefault&&)));2983 static_assert((__is_trivially_constructible(AllDefaulted)));2984 static_assert((__is_trivially_constructible(AllDefaulted,2985 const AllDefaulted &)));2986 static_assert((__is_trivially_constructible(AllDefaulted,2987 AllDefaulted &&)));2988 2989 static_assert(!(__is_trivially_constructible(int, int*)));2990 static_assert(!(__is_trivially_constructible(NonTrivialDefault)));2991 static_assert(!(__is_trivially_constructible(ThreeArgCtor, int*, char*, int&)));2992 static_assert(!(__is_trivially_constructible(AllDeleted)));2993 static_assert(!(__is_trivially_constructible(AllDeleted,2994 const AllDeleted &)));2995 static_assert(!(__is_trivially_constructible(AllDeleted,2996 AllDeleted &&)));2997 static_assert(!(__is_trivially_constructible(ExtDefaulted)));2998 static_assert(!(__is_trivially_constructible(ExtDefaulted,2999 const ExtDefaulted &)));3000 static_assert(!(__is_trivially_constructible(ExtDefaulted,3001 ExtDefaulted &&)));3002 3003 static_assert((__is_trivially_constructible(TriviallyConstructibleTemplate<int>)));3004 static_assert(!(__is_trivially_constructible(class_forward))); // expected-error {{incomplete type 'class_forward' used in type trait expression}}3005 static_assert(!(__is_trivially_constructible(class_forward[])));3006 static_assert(!(__is_trivially_constructible(void)));3007 3008 static_assert((__is_trivially_assignable(int&, int)));3009 static_assert((__is_trivially_assignable(int&, int&)));3010 static_assert((__is_trivially_assignable(int&, int&&)));3011 static_assert((__is_trivially_assignable(int&, const int&)));3012 static_assert((__is_trivially_assignable(POD&, POD)));3013 static_assert((__is_trivially_assignable(POD&, POD&)));3014 static_assert((__is_trivially_assignable(POD&, POD&&)));3015 static_assert((__is_trivially_assignable(POD&, const POD&)));3016 static_assert((__is_trivially_assignable(int*&, int*)));3017 static_assert((__is_trivially_assignable(AllDefaulted,3018 const AllDefaulted &)));3019 static_assert((__is_trivially_assignable(AllDefaulted,3020 AllDefaulted &&)));3021 3022 static_assert(!(__is_trivially_assignable(int*&, float*)));3023 static_assert(!(__is_trivially_assignable(HasCopyAssign&, HasCopyAssign)));3024 static_assert(!(__is_trivially_assignable(HasCopyAssign&, HasCopyAssign&)));3025 static_assert(!(__is_trivially_assignable(HasCopyAssign&, const HasCopyAssign&)));3026 static_assert(!(__is_trivially_assignable(HasCopyAssign&, HasCopyAssign&&)));3027 static_assert(!(__is_trivially_assignable(TrivialMoveButNotCopy&,3028 TrivialMoveButNotCopy&)));3029 static_assert(!(__is_trivially_assignable(TrivialMoveButNotCopy&,3030 const TrivialMoveButNotCopy&)));3031 static_assert(!(__is_trivially_assignable(AllDeleted,3032 const AllDeleted &)));3033 static_assert(!(__is_trivially_assignable(AllDeleted,3034 AllDeleted &&)));3035 static_assert(!(__is_trivially_assignable(ExtDefaulted,3036 const ExtDefaulted &)));3037 static_assert(!(__is_trivially_assignable(ExtDefaulted,3038 ExtDefaulted &&)));3039 3040 static_assert((__is_trivially_assignable(HasDefaultTrivialCopyAssign&,3041 HasDefaultTrivialCopyAssign&)));3042 static_assert((__is_trivially_assignable(HasDefaultTrivialCopyAssign&,3043 const HasDefaultTrivialCopyAssign&)));3044 static_assert((__is_trivially_assignable(TrivialMoveButNotCopy&,3045 TrivialMoveButNotCopy)));3046 static_assert((__is_trivially_assignable(TrivialMoveButNotCopy&,3047 TrivialMoveButNotCopy&&)));3048 static_assert((__is_trivially_assignable(int&, int)));3049 static_assert((__is_trivially_assignable(int&, int&)));3050 static_assert((__is_trivially_assignable(int&, int&&)));3051 static_assert((__is_trivially_assignable(int&, const int&)));3052 static_assert((__is_trivially_assignable(POD&, POD)));3053 static_assert((__is_trivially_assignable(POD&, POD&)));3054 static_assert((__is_trivially_assignable(POD&, POD&&)));3055 static_assert((__is_trivially_assignable(POD&, const POD&)));3056 static_assert((__is_trivially_assignable(int*&, int*)));3057 static_assert((__is_trivially_assignable(AllDefaulted,3058 const AllDefaulted &)));3059 static_assert((__is_trivially_assignable(AllDefaulted,3060 AllDefaulted &&)));3061 3062 static_assert(!(__is_assignable(int *&, float *)));3063 static_assert((__is_assignable(HasCopyAssign &, HasCopyAssign)));3064 static_assert((__is_assignable(HasCopyAssign &, HasCopyAssign &)));3065 static_assert((__is_assignable(HasCopyAssign &, const HasCopyAssign &)));3066 static_assert((__is_assignable(HasCopyAssign &, HasCopyAssign &&)));3067 static_assert((__is_assignable(TrivialMoveButNotCopy &,3068 TrivialMoveButNotCopy &)));3069 static_assert((__is_assignable(TrivialMoveButNotCopy &,3070 const TrivialMoveButNotCopy &)));3071 static_assert(!(__is_assignable(AllDeleted,3072 const AllDeleted &)));3073 static_assert(!(__is_assignable(AllDeleted,3074 AllDeleted &&)));3075 static_assert((__is_assignable(ExtDefaulted,3076 const ExtDefaulted &)));3077 static_assert((__is_assignable(ExtDefaulted,3078 ExtDefaulted &&)));3079 3080 static_assert((__is_assignable(HasDefaultTrivialCopyAssign &,3081 HasDefaultTrivialCopyAssign &)));3082 static_assert((__is_assignable(HasDefaultTrivialCopyAssign &,3083 const HasDefaultTrivialCopyAssign &)));3084 static_assert((__is_assignable(TrivialMoveButNotCopy &,3085 TrivialMoveButNotCopy)));3086 static_assert((__is_assignable(TrivialMoveButNotCopy &,3087 TrivialMoveButNotCopy &&)));3088 3089 static_assert(__is_assignable(ACompleteType, ACompleteType));3090 static_assert(!__is_assignable(AnIncompleteType, AnIncompleteType)); // expected-error {{incomplete type}}3091 static_assert(!__is_assignable(AnIncompleteType[], AnIncompleteType[]));3092 static_assert(!__is_assignable(AnIncompleteType[1], AnIncompleteType[1])); // expected-error {{incomplete type}}3093 static_assert(!__is_assignable(void, void));3094 static_assert(!__is_assignable(const volatile void, const volatile void));3095 3096 static_assert(!__is_assignable(AllPrivate, AllPrivate));3097 // Make sure we don't emit "'operator=' is a private member" in SFINAE context.3098 static_assert(!is_assignable_sfinae<AllPrivate, AllPrivate>());3099}3100 3101void constructible_checks() {3102 static_assert(__is_constructible(HasNoThrowConstructorWithArgs));3103 static_assert(!__is_nothrow_constructible(HasNoThrowConstructorWithArgs)); // MSVC doesn't look into default args and gets this wrong.3104 3105 static_assert(__is_constructible(HasNoThrowConstructorWithArgs, HasCons));3106 static_assert(__is_nothrow_constructible(HasNoThrowConstructorWithArgs, HasCons));3107 3108 static_assert(__is_constructible(NonTrivialDefault));3109 static_assert(!__is_nothrow_constructible(NonTrivialDefault));3110 3111 static_assert(__is_constructible(int));3112 static_assert(__is_nothrow_constructible(int));3113 3114 static_assert(!__is_constructible(NonPOD));3115 static_assert(!__is_nothrow_constructible(NonPOD));3116 3117 static_assert(__is_constructible(NonPOD, int));3118 static_assert(!__is_nothrow_constructible(NonPOD, int));3119 3120 // PR191783121 static_assert(!__is_constructible(Abstract));3122 static_assert(!__is_nothrow_constructible(Abstract));3123 3124 // PR202283125 static_assert(__is_constructible(VariadicCtor,3126 int, int, int, int, int, int, int, int, int));3127 3128 // PR255133129 static_assert(!__is_constructible(int(int)));3130 static_assert(__is_constructible(int const &, long));3131 3132 static_assert(__is_constructible(ACompleteType));3133 static_assert(__is_nothrow_constructible(ACompleteType));3134 static_assert(!__is_constructible(AnIncompleteType)); // expected-error {{incomplete type}}3135 static_assert(!__is_nothrow_constructible(AnIncompleteType)); // expected-error {{incomplete type}}3136 static_assert(!__is_constructible(AnIncompleteType[]));3137 static_assert(!__is_nothrow_constructible(AnIncompleteType[]));3138 static_assert(!__is_constructible(AnIncompleteType[1])); // expected-error {{incomplete type}}3139 static_assert(!__is_nothrow_constructible(AnIncompleteType[1])); // expected-error {{incomplete type}}3140 static_assert(!__is_constructible(void));3141 static_assert(!__is_nothrow_constructible(void));3142 static_assert(!__is_constructible(const volatile void));3143 static_assert(!__is_nothrow_constructible(const volatile void));3144}3145 3146// Instantiation of __is_trivially_constructible3147template<typename T, typename ...Args>3148struct is_trivially_constructible {3149 static const bool value = __is_trivially_constructible(T, Args...);3150};3151 3152void is_trivially_constructible_test() {3153 static_assert((is_trivially_constructible<int>::value));3154 static_assert((is_trivially_constructible<int, int>::value));3155 static_assert((is_trivially_constructible<int, float>::value));3156 static_assert((is_trivially_constructible<int, int&>::value));3157 static_assert((is_trivially_constructible<int, const int&>::value));3158 static_assert((is_trivially_constructible<int, int>::value));3159 static_assert((is_trivially_constructible<HasCopyAssign, HasCopyAssign>::value));3160 static_assert((is_trivially_constructible<HasCopyAssign, const HasCopyAssign&>::value));3161 static_assert((is_trivially_constructible<HasCopyAssign, HasCopyAssign&&>::value));3162 static_assert((is_trivially_constructible<HasCopyAssign>::value));3163 static_assert((is_trivially_constructible<NonTrivialDefault,3164 const NonTrivialDefault&>::value));3165 static_assert((is_trivially_constructible<NonTrivialDefault,3166 NonTrivialDefault&&>::value));3167 3168 static_assert(!(is_trivially_constructible<int, int*>::value));3169 static_assert(!(is_trivially_constructible<NonTrivialDefault>::value));3170 static_assert(!(is_trivially_constructible<ThreeArgCtor, int*, char*, int&>::value));3171 static_assert(!(is_trivially_constructible<Abstract>::value)); // PR191783172 3173 static_assert(__is_trivially_constructible(ACompleteType));3174 static_assert(!__is_trivially_constructible(AnIncompleteType)); // expected-error {{incomplete type}}3175 static_assert(!__is_trivially_constructible(AnIncompleteType[]));3176 static_assert(!__is_trivially_constructible(AnIncompleteType[1])); // expected-error {{incomplete type}}3177 static_assert(!__is_trivially_constructible(void));3178 static_assert(!__is_trivially_constructible(const volatile void));3179}3180 3181template <class T, class RefType = T &>3182struct ConvertsToRef {3183 operator RefType() const { return static_cast<RefType>(obj); }3184 mutable T obj = 42;3185};3186template <class T, class RefType = T &>3187class ConvertsToRefPrivate {3188 operator RefType() const { return static_cast<RefType>(obj); }3189 mutable T obj = 42;3190};3191 3192 3193void reference_binds_to_temporary_checks() {3194 static_assert(!(__reference_binds_to_temporary(int &, int &)));3195 static_assert(!(__reference_binds_to_temporary(int &, int &&)));3196 3197 static_assert(!(__reference_binds_to_temporary(int const &, int &)));3198 static_assert(!(__reference_binds_to_temporary(int const &, int const &)));3199 static_assert(!(__reference_binds_to_temporary(int const &, int &&)));3200 3201 static_assert(!(__reference_binds_to_temporary(int &, long &))); // doesn't construct3202 static_assert((__reference_binds_to_temporary(int const &, long &)));3203 static_assert((__reference_binds_to_temporary(int const &, long &&)));3204 static_assert((__reference_binds_to_temporary(int &&, long &)));3205 3206 using LRef = ConvertsToRef<int, int &>;3207 using RRef = ConvertsToRef<int, int &&>;3208 using CLRef = ConvertsToRef<int, const int &>;3209 using LongRef = ConvertsToRef<long, long &>;3210 static_assert((__is_constructible(int &, LRef)));3211 static_assert(!(__reference_binds_to_temporary(int &, LRef)));3212 3213 static_assert((__is_constructible(int &&, RRef)));3214 static_assert(!(__reference_binds_to_temporary(int &&, RRef)));3215 3216 static_assert((__is_constructible(int const &, CLRef)));3217 static_assert(!(__reference_binds_to_temporary(int &&, CLRef)));3218 3219 static_assert((__is_constructible(int const &, LongRef)));3220 static_assert((__reference_binds_to_temporary(int const &, LongRef)));3221 static_assert(!__reference_binds_to_temporary(int const &, ConvertsToRefPrivate<long, long &>));3222 3223 3224 // Test that it doesn't accept non-reference types as input.3225 static_assert(!(__reference_binds_to_temporary(int, long)));3226 3227 static_assert((__reference_binds_to_temporary(const int &, long)));3228 3229 // Test that function references are never considered bound to temporaries.3230 static_assert(!__reference_binds_to_temporary(void(&)(), void()));3231 static_assert(!__reference_binds_to_temporary(void(&&)(), void()));3232}3233 3234 3235struct ExplicitConversionRvalueRef {3236 operator int();3237 explicit operator int&&();3238};3239 3240struct ExplicitConversionRef {3241 operator int();3242 explicit operator int&();3243};3244 3245struct NonMovable {3246 NonMovable(NonMovable&&) = delete;3247};3248 3249struct ConvertsFromNonMovable {3250 ConvertsFromNonMovable(NonMovable);3251};3252 3253void reference_constructs_from_temporary_checks() {3254 static_assert(!__reference_constructs_from_temporary(int &, int &));3255 static_assert(!__reference_constructs_from_temporary(int &, int &&));3256 3257 static_assert(!__reference_constructs_from_temporary(int const &, int &));3258 static_assert(!__reference_constructs_from_temporary(int const &, int const &));3259 static_assert(!__reference_constructs_from_temporary(int const &, int &&));3260 3261 static_assert(!__reference_constructs_from_temporary(int &, long &)); // doesn't construct3262 3263 static_assert(__reference_constructs_from_temporary(int const &, long &));3264 static_assert(__reference_constructs_from_temporary(int const &, long &&));3265 static_assert(__reference_constructs_from_temporary(int &&, long &));3266 3267 using LRef = ConvertsToRef<int, int &>;3268 using RRef = ConvertsToRef<int, int &&>;3269 using CLRef = ConvertsToRef<int, const int &>;3270 using LongRef = ConvertsToRef<long, long &>;3271 static_assert(__is_constructible(int &, LRef));3272 static_assert(!__reference_constructs_from_temporary(int &, LRef));3273 3274 static_assert(__is_constructible(int &&, RRef));3275 static_assert(!__reference_constructs_from_temporary(int &&, RRef));3276 3277 static_assert(__is_constructible(int const &, CLRef));3278 static_assert(!__reference_constructs_from_temporary(int &&, CLRef));3279 3280 static_assert(__is_constructible(int const &, LongRef));3281 static_assert(__reference_constructs_from_temporary(int const &, LongRef));3282 static_assert(!__reference_constructs_from_temporary(int const &, ConvertsToRefPrivate<long, long &>));3283 3284 3285 // Test that it doesn't accept non-reference types as input.3286 static_assert(!__reference_constructs_from_temporary(int, long));3287 3288 static_assert(__reference_constructs_from_temporary(const int &, long));3289 3290 // Test that function references are never considered bound to temporaries.3291 static_assert(!__reference_constructs_from_temporary(void(&&)(), void()));3292 static_assert(!__reference_constructs_from_temporary(void(&)(), void()));3293 3294 // LWG3819: reference_meows_from_temporary should not use is_meowible3295 static_assert(__reference_constructs_from_temporary(ConvertsFromNonMovable&&, NonMovable) == __cplusplus >= 201703L);3296 // For scalar types, cv-qualifications are dropped first for prvalues.3297 static_assert(__reference_constructs_from_temporary(int&&, const int));3298 static_assert(__reference_constructs_from_temporary(int&&, volatile int));3299 3300 // Additional checks3301 static_assert(__reference_constructs_from_temporary(POD const&, Derives));3302 static_assert(__reference_constructs_from_temporary(int&&, int));3303 static_assert(__reference_constructs_from_temporary(const int&, int));3304 static_assert(!__reference_constructs_from_temporary(int&&, int&&));3305 static_assert(!__reference_constructs_from_temporary(const int&, int&&));3306 static_assert(__reference_constructs_from_temporary(int&&, long&&));3307 static_assert(__reference_constructs_from_temporary(int&&, long));3308 3309 3310 static_assert(!__reference_constructs_from_temporary(int&, ExplicitConversionRef));3311 static_assert(!__reference_constructs_from_temporary(const int&, ExplicitConversionRef));3312 static_assert(!__reference_constructs_from_temporary(int&&, ExplicitConversionRvalueRef));3313 3314 3315}3316 3317template<typename A, typename B, bool result = __reference_converts_from_temporary(A, B)>3318static constexpr bool reference_converts_from_temporary_sfinae() { return result; }3319 3320void reference_converts_from_temporary_checks() {3321 static_assert(!__reference_converts_from_temporary(int &, int &));3322 static_assert(!__reference_converts_from_temporary(int &, int &&));3323 3324 static_assert(!__reference_converts_from_temporary(int const &, int &));3325 static_assert(!__reference_converts_from_temporary(int const &, int const &));3326 static_assert(!__reference_converts_from_temporary(int const &, int &&));3327 3328 static_assert(!__reference_converts_from_temporary(int &, long &)); // doesn't construct3329 3330 static_assert(__reference_converts_from_temporary(int const &, long &));3331 static_assert(__reference_converts_from_temporary(int const &, long &&));3332 static_assert(__reference_converts_from_temporary(int &&, long &));3333 3334 using LRef = ConvertsToRef<int, int &>;3335 using RRef = ConvertsToRef<int, int &&>;3336 using CLRef = ConvertsToRef<int, const int &>;3337 using LongRef = ConvertsToRef<long, long &>;3338 static_assert(__is_constructible(int &, LRef));3339 static_assert(!__reference_converts_from_temporary(int &, LRef));3340 3341 static_assert(__is_constructible(int &&, RRef));3342 static_assert(!__reference_converts_from_temporary(int &&, RRef));3343 3344 static_assert(__is_constructible(int const &, CLRef));3345 static_assert(!__reference_converts_from_temporary(int &&, CLRef));3346 3347 static_assert(__is_constructible(int const &, LongRef));3348 static_assert(__reference_converts_from_temporary(int const &, LongRef));3349 static_assert(!__reference_converts_from_temporary(int const &, ConvertsToRefPrivate<long, long &>));3350 3351 3352 // Test that it doesn't accept non-reference types as input.3353 static_assert(!__reference_converts_from_temporary(int, long));3354 3355 static_assert(__reference_converts_from_temporary(const int &, long));3356 3357 // Test that function references are never considered bound to temporaries.3358 static_assert(!__reference_converts_from_temporary(void(&)(), void()));3359 static_assert(!__reference_converts_from_temporary(void(&&)(), void()));3360 3361 // LWG3819: reference_meows_from_temporary should not use is_meowible3362 static_assert(__reference_converts_from_temporary(ConvertsFromNonMovable&&, NonMovable) == __cplusplus >= 201703L);3363 // For scalar types, cv-qualifications are dropped first for prvalues.3364 static_assert(__reference_converts_from_temporary(int&&, const int));3365 static_assert(__reference_converts_from_temporary(int&&, volatile int));3366 3367 // Additional checks3368 static_assert(__reference_converts_from_temporary(POD const&, Derives));3369 static_assert(__reference_converts_from_temporary(int&&, int));3370 static_assert(__reference_converts_from_temporary(const int&, int));3371 static_assert(!__reference_converts_from_temporary(int&&, int&&));3372 static_assert(!__reference_converts_from_temporary(const int&, int&&));3373 static_assert(__reference_converts_from_temporary(int&&, long&&));3374 static_assert(__reference_converts_from_temporary(int&&, long));3375 3376 static_assert(!__reference_converts_from_temporary(int&, ExplicitConversionRef));3377 static_assert(__reference_converts_from_temporary(const int&, ExplicitConversionRef));3378 static_assert(__reference_converts_from_temporary(int&&, ExplicitConversionRvalueRef));3379 3380 static_assert(!__reference_converts_from_temporary(AllPrivate, AllPrivate));3381 // Make sure we don't emit "calling a private constructor" in SFINAE context.3382 static_assert(!reference_converts_from_temporary_sfinae<AllPrivate, AllPrivate>());3383}3384 3385void array_rank() {3386 static_assert(__array_rank(IntAr) == 1);3387 static_assert(__array_rank(ConstIntArAr) == 2);3388}3389 3390void array_extent() {3391 static_assert(__array_extent(IntAr, 0) == 10);3392 static_assert(__array_extent(ConstIntArAr, 0) == 4);3393 static_assert(__array_extent(ConstIntArAr, 1) == 10);3394}3395 3396void is_destructible_test() {3397 static_assert(__is_destructible(int));3398 static_assert(__is_destructible(int[2]));3399 static_assert(!__is_destructible(int[]));3400 static_assert(!__is_destructible(void));3401 static_assert(__is_destructible(int &));3402 static_assert(__is_destructible(HasDest));3403 static_assert(!__is_destructible(AllPrivate));3404 static_assert(__is_destructible(SuperNonTrivialStruct));3405 static_assert(__is_destructible(AllDefaulted));3406 static_assert(!__is_destructible(AllDeleted));3407 static_assert(__is_destructible(ThrowingDtor));3408 static_assert(__is_destructible(NoThrowDtor));3409 3410 static_assert(__is_destructible(ACompleteType));3411 static_assert(!__is_destructible(AnIncompleteType)); // expected-error {{incomplete type}}3412 static_assert(!__is_destructible(AnIncompleteType[]));3413 static_assert(!__is_destructible(AnIncompleteType[1])); // expected-error {{incomplete type}}3414 static_assert(!__is_destructible(void));3415 static_assert(!__is_destructible(const volatile void));3416}3417 3418void is_nothrow_destructible_test() {3419 static_assert(__is_nothrow_destructible(int));3420 static_assert(__is_nothrow_destructible(int[2]));3421 static_assert(!__is_nothrow_destructible(int[]));3422 static_assert(!__is_nothrow_destructible(void));3423 static_assert(__is_nothrow_destructible(int &));3424 static_assert(__is_nothrow_destructible(HasDest));3425 static_assert(!__is_nothrow_destructible(AllPrivate));3426 static_assert(__is_nothrow_destructible(SuperNonTrivialStruct));3427 static_assert(__is_nothrow_destructible(AllDefaulted));3428 static_assert(!__is_nothrow_destructible(AllDeleted));3429 static_assert(!__is_nothrow_destructible(ThrowingDtor));3430 static_assert(__is_nothrow_destructible(NoExceptDtor));3431 static_assert(__is_nothrow_destructible(NoThrowDtor));3432 3433 static_assert(__is_nothrow_destructible(ACompleteType));3434 static_assert(!__is_nothrow_destructible(AnIncompleteType)); // expected-error {{incomplete type}}3435 static_assert(!__is_nothrow_destructible(AnIncompleteType[]));3436 static_assert(!__is_nothrow_destructible(AnIncompleteType[1])); // expected-error {{incomplete type}}3437 static_assert(!__is_nothrow_destructible(void));3438 static_assert(!__is_nothrow_destructible(const volatile void));3439}3440 3441void is_trivially_destructible_test() {3442 static_assert(__is_trivially_destructible(int));3443 static_assert(__is_trivially_destructible(int[2]));3444 static_assert(!__is_trivially_destructible(int[]));3445 static_assert(!__is_trivially_destructible(void));3446 static_assert(__is_trivially_destructible(int &));3447 static_assert(!__is_trivially_destructible(HasDest));3448 static_assert(!__is_trivially_destructible(AllPrivate));3449 static_assert(!__is_trivially_destructible(SuperNonTrivialStruct));3450 static_assert(__is_trivially_destructible(AllDefaulted));3451 static_assert(!__is_trivially_destructible(AllDeleted));3452 static_assert(!__is_trivially_destructible(ThrowingDtor));3453 static_assert(!__is_trivially_destructible(NoThrowDtor));3454 3455 static_assert(__is_trivially_destructible(ACompleteType));3456 static_assert(!__is_trivially_destructible(AnIncompleteType)); // expected-error {{incomplete type}}3457 static_assert(!__is_trivially_destructible(AnIncompleteType[]));3458 static_assert(!__is_trivially_destructible(AnIncompleteType[1])); // expected-error {{incomplete type}}3459 static_assert(!__is_trivially_destructible(void));3460 static_assert(!__is_trivially_destructible(const volatile void));3461}3462 3463static_assert(!__has_unique_object_representations(void), "void is never unique");3464static_assert(!__has_unique_object_representations(const void), "void is never unique");3465static_assert(!__has_unique_object_representations(volatile void), "void is never unique");3466static_assert(!__has_unique_object_representations(const volatile void), "void is never unique");3467 3468static_assert(__has_unique_object_representations(int), "integrals are");3469static_assert(__has_unique_object_representations(const int), "integrals are");3470static_assert(__has_unique_object_representations(volatile int), "integrals are");3471static_assert(__has_unique_object_representations(const volatile int), "integrals are");3472 3473static_assert(__has_unique_object_representations(void *), "as are pointers");3474static_assert(__has_unique_object_representations(const void *), "as are pointers");3475static_assert(__has_unique_object_representations(volatile void *), "are pointers");3476static_assert(__has_unique_object_representations(const volatile void *), "as are pointers");3477 3478static_assert(__has_unique_object_representations(int *), "as are pointers");3479static_assert(__has_unique_object_representations(const int *), "as are pointers");3480static_assert(__has_unique_object_representations(volatile int *), "as are pointers");3481static_assert(__has_unique_object_representations(const volatile int *), "as are pointers");3482 3483class C {};3484using FP = int (*)(int);3485using PMF = int (C::*)(int);3486using PMD = int C::*;3487 3488static_assert(__has_unique_object_representations(FP), "even function pointers");3489static_assert(__has_unique_object_representations(const FP), "even function pointers");3490static_assert(__has_unique_object_representations(volatile FP), "even function pointers");3491static_assert(__has_unique_object_representations(const volatile FP), "even function pointers");3492 3493static_assert(__has_unique_object_representations(PMF), "and pointer to members");3494static_assert(__has_unique_object_representations(const PMF), "and pointer to members");3495static_assert(__has_unique_object_representations(volatile PMF), "and pointer to members");3496static_assert(__has_unique_object_representations(const volatile PMF), "and pointer to members");3497 3498static_assert(__has_unique_object_representations(PMD), "and pointer to members");3499static_assert(__has_unique_object_representations(const PMD), "and pointer to members");3500static_assert(__has_unique_object_representations(volatile PMD), "and pointer to members");3501static_assert(__has_unique_object_representations(const volatile PMD), "and pointer to members");3502 3503static_assert(__has_unique_object_representations(bool), "yes, all integral types");3504static_assert(__has_unique_object_representations(char), "yes, all integral types");3505static_assert(__has_unique_object_representations(signed char), "yes, all integral types");3506static_assert(__has_unique_object_representations(unsigned char), "yes, all integral types");3507static_assert(__has_unique_object_representations(short), "yes, all integral types");3508static_assert(__has_unique_object_representations(unsigned short), "yes, all integral types");3509static_assert(__has_unique_object_representations(int), "yes, all integral types");3510static_assert(__has_unique_object_representations(unsigned int), "yes, all integral types");3511static_assert(__has_unique_object_representations(long), "yes, all integral types");3512static_assert(__has_unique_object_representations(unsigned long), "yes, all integral types");3513static_assert(__has_unique_object_representations(long long), "yes, all integral types");3514static_assert(__has_unique_object_representations(unsigned long long), "yes, all integral types");3515static_assert(__has_unique_object_representations(wchar_t), "yes, all integral types");3516static_assert(__has_unique_object_representations(char16_t), "yes, all integral types");3517static_assert(__has_unique_object_representations(char32_t), "yes, all integral types");3518 3519static_assert(!__has_unique_object_representations(void), "but not void!");3520static_assert(!__has_unique_object_representations(decltype(nullptr)), "or nullptr_t");3521static_assert(!__has_unique_object_representations(float), "definitely not Floating Point");3522static_assert(!__has_unique_object_representations(double), "definitely not Floating Point");3523static_assert(!__has_unique_object_representations(long double), "definitely not Floating Point");3524 3525 3526static_assert(!__has_unique_object_representations(AnIncompleteType[]));3527//expected-error@-1 {{incomplete type 'AnIncompleteType' used in type trait expression}}3528static_assert(!__has_unique_object_representations(AnIncompleteType[][1]));3529//expected-error@-1 {{incomplete type 'AnIncompleteType' used in type trait expression}}3530static_assert(!__has_unique_object_representations(AnIncompleteType[1]));3531//expected-error@-1 {{incomplete type 'AnIncompleteType' used in type trait expression}}3532static_assert(!__has_unique_object_representations(AnIncompleteType));3533//expected-error@-1 {{incomplete type 'AnIncompleteType' used in type trait expression}}3534 3535struct NoPadding {3536 int a;3537 int b;3538};3539 3540static_assert(__has_unique_object_representations(NoPadding), "types without padding are");3541 3542struct InheritsFromNoPadding : NoPadding {3543 int c;3544 int d;3545};3546 3547static_assert(__has_unique_object_representations(InheritsFromNoPadding), "types without padding are");3548 3549struct VirtuallyInheritsFromNoPadding : virtual NoPadding {3550 int c;3551 int d;3552};3553 3554static_assert(!__has_unique_object_representations(VirtuallyInheritsFromNoPadding), "No virtual inheritance");3555 3556struct Padding {3557 char a;3558 int b;3559};3560 3561//static_assert(!__has_unique_object_representations(Padding), "but not with padding");3562 3563struct InheritsFromPadding : Padding {3564 int c;3565 int d;3566};3567 3568static_assert(!__has_unique_object_representations(InheritsFromPadding), "or its subclasses");3569 3570struct TailPadding {3571 int a;3572 char b;3573};3574 3575static_assert(!__has_unique_object_representations(TailPadding), "even at the end");3576 3577struct TinyStruct {3578 char a;3579};3580 3581static_assert(__has_unique_object_representations(TinyStruct), "Should be no padding");3582 3583struct InheritsFromTinyStruct : TinyStruct {3584 int b;3585};3586 3587static_assert(!__has_unique_object_representations(InheritsFromTinyStruct), "Inherit causes padding");3588 3589union NoPaddingUnion {3590 int a;3591 unsigned int b;3592};3593 3594static_assert(__has_unique_object_representations(NoPaddingUnion), "unions follow the same rules as structs");3595 3596union PaddingUnion {3597 int a;3598 long long b;3599};3600 3601static_assert(!__has_unique_object_representations(PaddingUnion), "unions follow the same rules as structs");3602 3603struct NotTriviallyCopyable {3604 int x;3605 NotTriviallyCopyable(const NotTriviallyCopyable &) {}3606};3607 3608static_assert(!__has_unique_object_representations(NotTriviallyCopyable), "must be trivially copyable");3609 3610struct HasNonUniqueMember {3611 float x;3612};3613 3614static_assert(!__has_unique_object_representations(HasNonUniqueMember), "all members must be unique");3615 3616enum ExampleEnum { xExample,3617 yExample };3618enum LLEnum : long long { xLongExample,3619 yLongExample };3620 3621static_assert(__has_unique_object_representations(ExampleEnum), "Enums are integrals, so unique!");3622static_assert(__has_unique_object_representations(LLEnum), "Enums are integrals, so unique!");3623 3624enum class ExampleEnumClass { xExample,3625 yExample };3626enum class LLEnumClass : long long { xLongExample,3627 yLongExample };3628 3629static_assert(__has_unique_object_representations(ExampleEnumClass), "Enums are integrals, so unique!");3630static_assert(__has_unique_object_representations(LLEnumClass), "Enums are integrals, so unique!");3631 3632// because references aren't trivially copyable.3633static_assert(!__has_unique_object_representations(int &), "No references!");3634static_assert(!__has_unique_object_representations(const int &), "No references!");3635static_assert(!__has_unique_object_representations(volatile int &), "No references!");3636static_assert(!__has_unique_object_representations(const volatile int &), "No references!");3637static_assert(!__has_unique_object_representations(Empty), "No empty types!");3638static_assert(!__has_unique_object_representations(EmptyUnion), "No empty types!");3639 3640class Compressed : Empty {3641 int x;3642};3643 3644static_assert(__has_unique_object_representations(Compressed), "But inheriting from one is ok");3645 3646class EmptyInheritor : Compressed {};3647 3648static_assert(__has_unique_object_representations(EmptyInheritor), "As long as the base has items, empty is ok");3649 3650class Dynamic {3651 virtual void A();3652 int i;3653};3654 3655static_assert(!__has_unique_object_representations(Dynamic), "Dynamic types are not valid");3656 3657class InheritsDynamic : Dynamic {3658 int j;3659};3660 3661static_assert(!__has_unique_object_representations(InheritsDynamic), "Dynamic types are not valid");3662 3663static_assert(__has_unique_object_representations(int[42]), "Arrays are fine, as long as their value type is");3664static_assert(__has_unique_object_representations(int[]), "Arrays are fine, as long as their value type is");3665static_assert(__has_unique_object_representations(int[][42]), "Arrays are fine, as long as their value type is");3666static_assert(!__has_unique_object_representations(double[42]), "So no array of doubles!");3667static_assert(!__has_unique_object_representations(double[]), "So no array of doubles!");3668static_assert(!__has_unique_object_representations(double[][42]), "So no array of doubles!");3669 3670struct __attribute__((aligned(16))) WeirdAlignment {3671 int i;3672};3673union __attribute__((aligned(16))) WeirdAlignmentUnion {3674 int i;3675};3676static_assert(!__has_unique_object_representations(WeirdAlignment), "Alignment causes padding");3677static_assert(!__has_unique_object_representations(WeirdAlignmentUnion), "Alignment causes padding");3678static_assert(!__has_unique_object_representations(WeirdAlignment[42]), "Also no arrays that have padding");3679 3680struct __attribute__((packed)) PackedNoPadding1 {3681 short i;3682 int j;3683};3684struct __attribute__((packed)) PackedNoPadding2 {3685 int j;3686 short i;3687};3688static_assert(__has_unique_object_representations(PackedNoPadding1), "Packed structs have no padding");3689static_assert(__has_unique_object_representations(PackedNoPadding2), "Packed structs have no padding");3690 3691static_assert(!__has_unique_object_representations(int(int)), "Functions are not unique");3692static_assert(!__has_unique_object_representations(int(int) const), "Functions are not unique");3693static_assert(!__has_unique_object_representations(int(int) volatile), "Functions are not unique");3694static_assert(!__has_unique_object_representations(int(int) const volatile), "Functions are not unique");3695static_assert(!__has_unique_object_representations(int(int) &), "Functions are not unique");3696static_assert(!__has_unique_object_representations(int(int) const &), "Functions are not unique");3697static_assert(!__has_unique_object_representations(int(int) volatile &), "Functions are not unique");3698static_assert(!__has_unique_object_representations(int(int) const volatile &), "Functions are not unique");3699static_assert(!__has_unique_object_representations(int(int) &&), "Functions are not unique");3700static_assert(!__has_unique_object_representations(int(int) const &&), "Functions are not unique");3701static_assert(!__has_unique_object_representations(int(int) volatile &&), "Functions are not unique");3702static_assert(!__has_unique_object_representations(int(int) const volatile &&), "Functions are not unique");3703 3704static_assert(!__has_unique_object_representations(int(int, ...)), "Functions are not unique");3705static_assert(!__has_unique_object_representations(int(int, ...) const), "Functions are not unique");3706static_assert(!__has_unique_object_representations(int(int, ...) volatile), "Functions are not unique");3707static_assert(!__has_unique_object_representations(int(int, ...) const volatile), "Functions are not unique");3708static_assert(!__has_unique_object_representations(int(int, ...) &), "Functions are not unique");3709static_assert(!__has_unique_object_representations(int(int, ...) const &), "Functions are not unique");3710static_assert(!__has_unique_object_representations(int(int, ...) volatile &), "Functions are not unique");3711static_assert(!__has_unique_object_representations(int(int, ...) const volatile &), "Functions are not unique");3712static_assert(!__has_unique_object_representations(int(int, ...) &&), "Functions are not unique");3713static_assert(!__has_unique_object_representations(int(int, ...) const &&), "Functions are not unique");3714static_assert(!__has_unique_object_representations(int(int, ...) volatile &&), "Functions are not unique");3715static_assert(!__has_unique_object_representations(int(int, ...) const volatile &&), "Functions are not unique");3716 3717void foo(){3718 static auto lambda = []() {};3719 static_assert(!__has_unique_object_representations(decltype(lambda)), "Lambdas follow struct rules");3720 int i;3721 static auto lambda2 = [i]() {};3722 static_assert(__has_unique_object_representations(decltype(lambda2)), "Lambdas follow struct rules");3723}3724 3725struct PaddedBitfield {3726 char c : 6;3727 char d : 1;3728};3729 3730struct UnPaddedBitfield {3731 char c : 6;3732 char d : 2;3733};3734 3735struct AlignedPaddedBitfield {3736 char c : 6;3737 __attribute__((aligned(1)))3738 char d : 2;3739};3740 3741struct UnnamedBitfield {3742 int named : 8;3743 int : 24;3744};3745 3746struct __attribute__((packed)) UnnamedBitfieldPacked {3747 int named : 8;3748 int : 24;3749};3750 3751struct UnnamedEmptyBitfield {3752 int named;3753 int : 0;3754};3755 3756struct UnnamedEmptyBitfieldSplit {3757 short named;3758 int : 0;3759 short also_named;3760};3761 3762static_assert(!__has_unique_object_representations(PaddedBitfield), "Bitfield padding");3763static_assert(__has_unique_object_representations(UnPaddedBitfield), "Bitfield padding");3764static_assert(!__has_unique_object_representations(AlignedPaddedBitfield), "Bitfield padding");3765static_assert(!__has_unique_object_representations(UnnamedBitfield), "Bitfield padding");3766static_assert(!__has_unique_object_representations(UnnamedBitfieldPacked), "Bitfield padding");3767static_assert(__has_unique_object_representations(UnnamedEmptyBitfield), "Bitfield padding");3768static_assert(sizeof(UnnamedEmptyBitfieldSplit) != (sizeof(short) * 2), "Wrong size");3769static_assert(!__has_unique_object_representations(UnnamedEmptyBitfieldSplit), "Bitfield padding");3770 3771struct BoolBitfield {3772 bool b : 8;3773};3774 3775static_assert(__has_unique_object_representations(BoolBitfield), "Bitfield bool");3776 3777struct BoolBitfield2 {3778 bool b : 16;3779};3780 3781static_assert(!__has_unique_object_representations(BoolBitfield2), "Bitfield bool");3782 3783struct GreaterSizeBitfield {3784 //expected-warning@+1 {{width of bit-field 'n'}}3785 int n : 1024;3786};3787 3788static_assert(sizeof(GreaterSizeBitfield) == 128, "Bitfield Size");3789static_assert(!__has_unique_object_representations(GreaterSizeBitfield), "Bitfield padding");3790 3791struct StructWithRef {3792 int &I;3793};3794 3795static_assert(__has_unique_object_representations(StructWithRef), "References are still unique");3796 3797struct NotUniqueBecauseTailPadding {3798 int &r;3799 char a;3800};3801struct CanBeUniqueIfNoPadding : NotUniqueBecauseTailPadding {3802 char b[7];3803};3804 3805static_assert(!__has_unique_object_representations(NotUniqueBecauseTailPadding),3806 "non trivial");3807// Can be unique on Itanium, since the is child class' data is 'folded' into the3808// parent's tail padding.3809static_assert(sizeof(CanBeUniqueIfNoPadding) != 16 ||3810 __has_unique_object_representations(CanBeUniqueIfNoPadding),3811 "inherit from std layout");3812 3813namespace ErrorType {3814 struct S; //expected-note{{forward declaration of 'ErrorType::S'}}3815 3816 struct T {3817 S t; //expected-error{{field has incomplete type 'S'}}3818 };3819 bool b = __has_unique_object_representations(T);3820};3821 3822static_assert(!__has_unique_object_representations(_BitInt(7)), "BitInt:");3823static_assert(__has_unique_object_representations(_BitInt(8)), "BitInt:");3824static_assert(!__has_unique_object_representations(_BitInt(127)), "BitInt:");3825static_assert(__has_unique_object_representations(_BitInt(128)), "BitInt:");3826 3827namespace GH95311 {3828 3829template <int>3830class Foo {3831 int x;3832};3833static_assert(__has_unique_object_representations(Foo<0>[]));3834class Bar; // expected-note {{forward declaration of 'GH95311::Bar'}}3835static_assert(__has_unique_object_representations(Bar[])); // expected-error {{incomplete type}}3836 3837}3838 3839namespace PR46209 {3840 // Foo has both a trivial assignment operator and a non-trivial one.3841 struct Foo {3842 Foo &operator=(const Foo &) & { return *this; }3843 Foo &operator=(const Foo &) && = default;3844 };3845 3846 // Bar's copy assignment calls Foo's non-trivial assignment.3847 struct Bar {3848 Foo foo;3849 };3850 3851 static_assert(!__is_trivially_assignable(Foo &, const Foo &));3852 static_assert(!__is_trivially_assignable(Bar &, const Bar &));3853 3854 // Foo2 has both a trivial assignment operator and a non-trivial one.3855 struct Foo2 {3856 Foo2 &operator=(const Foo2 &) & = default;3857 Foo2 &operator=(const Foo2 &) && { return *this; }3858 };3859 3860 // Bar2's copy assignment calls Foo2's trivial assignment.3861 struct Bar2 {3862 Foo2 foo;3863 };3864 3865 static_assert(__is_trivially_assignable(Foo2 &, const Foo2 &));3866 static_assert(__is_trivially_assignable(Bar2 &, const Bar2 &));3867}3868 3869namespace ConstClass {3870 struct A {3871 A &operator=(const A&) = default;3872 };3873 struct B {3874 const A a;3875 };3876 static_assert(!__is_trivially_assignable(B&, const B&));3877}3878 3879namespace type_trait_expr_numargs_overflow {3880// Make sure that TypeTraitExpr can store 16 bits worth of arguments.3881#define T4(X) X,X,X,X3882#define T16(X) T4(X),T4(X),T4(X),T4(X)3883#define T64(X) T16(X),T16(X),T16(X),T16(X)3884#define T256(X) T64(X),T64(X),T64(X),T64(X)3885#define T1024(X) T256(X),T256(X),T256(X),T256(X)3886#define T4096(X) T1024(X),T1024(X),T1024(X),T1024(X)3887#define T16384(X) T4096(X),T4096(X),T4096(X),T4096(X)3888#define T32768(X) T16384(X),T16384(X)3889void test() { (void) __is_constructible(int, T32768(int)); }3890#undef T43891#undef T163892#undef T643893#undef T2563894#undef T10243895#undef T40963896#undef T163843897#undef T327683898} // namespace type_trait_expr_numargs_overflow3899 3900namespace is_trivially_relocatable {3901 3902static_assert(!__is_trivially_relocatable(void));3903static_assert(__is_trivially_relocatable(int));3904static_assert(__is_trivially_relocatable(int[]));3905static_assert(__is_trivially_relocatable(const int));3906static_assert(__is_trivially_relocatable(volatile int));3907 3908enum Enum {};3909static_assert(__is_trivially_relocatable(Enum));3910static_assert(__is_trivially_relocatable(Enum[]));3911 3912union Union {int x;};3913static_assert(__is_trivially_relocatable(Union));3914static_assert(__is_trivially_relocatable(Union[]));3915 3916struct Trivial {};3917static_assert(__is_trivially_relocatable(Trivial));3918static_assert(__is_trivially_relocatable(const Trivial));3919static_assert(__is_trivially_relocatable(volatile Trivial));3920 3921static_assert(__is_trivially_relocatable(Trivial[]));3922static_assert(__is_trivially_relocatable(const Trivial[]));3923static_assert(__is_trivially_relocatable(volatile Trivial[]));3924 3925static_assert(__is_trivially_relocatable(int[10]));3926static_assert(__is_trivially_relocatable(const int[10]));3927static_assert(__is_trivially_relocatable(volatile int[10]));3928 3929static_assert(__is_trivially_relocatable(int[10][10]));3930static_assert(__is_trivially_relocatable(const int[10][10]));3931static_assert(__is_trivially_relocatable(volatile int[10][10]));3932 3933static_assert(__is_trivially_relocatable(int[]));3934static_assert(__is_trivially_relocatable(const int[]));3935static_assert(__is_trivially_relocatable(volatile int[]));3936 3937static_assert(__is_trivially_relocatable(int[][10]));3938static_assert(__is_trivially_relocatable(const int[][10]));3939static_assert(__is_trivially_relocatable(volatile int[][10]));3940 3941struct Incomplete; // expected-note {{forward declaration of 'is_trivially_relocatable::Incomplete'}}3942bool unused = __is_trivially_relocatable(Incomplete); // expected-error {{incomplete type}}3943 3944struct NontrivialDtor {3945 ~NontrivialDtor() {}3946};3947static_assert(!__is_trivially_relocatable(NontrivialDtor));3948static_assert(!__is_trivially_relocatable(NontrivialDtor[]));3949static_assert(!__is_trivially_relocatable(const NontrivialDtor));3950static_assert(!__is_trivially_relocatable(volatile NontrivialDtor));3951 3952struct NontrivialCopyCtor {3953 NontrivialCopyCtor(const NontrivialCopyCtor&) {}3954};3955static_assert(!__is_trivially_relocatable(NontrivialCopyCtor));3956static_assert(!__is_trivially_relocatable(NontrivialCopyCtor[]));3957 3958struct NontrivialMoveCtor {3959 NontrivialMoveCtor(NontrivialMoveCtor&&) {}3960};3961static_assert(!__is_trivially_relocatable(NontrivialMoveCtor));3962static_assert(!__is_trivially_relocatable(NontrivialMoveCtor[]));3963 3964struct [[clang::trivial_abi]] TrivialAbiNontrivialDtor {3965 ~TrivialAbiNontrivialDtor() {}3966};3967static_assert(__is_trivially_relocatable(TrivialAbiNontrivialDtor));3968static_assert(__is_trivially_relocatable(TrivialAbiNontrivialDtor[]));3969static_assert(__is_trivially_relocatable(const TrivialAbiNontrivialDtor));3970static_assert(__is_trivially_relocatable(volatile TrivialAbiNontrivialDtor));3971 3972struct [[clang::trivial_abi]] TrivialAbiNontrivialCopyCtor {3973 TrivialAbiNontrivialCopyCtor(const TrivialAbiNontrivialCopyCtor&) {}3974};3975static_assert(__is_trivially_relocatable(TrivialAbiNontrivialCopyCtor));3976static_assert(__is_trivially_relocatable(TrivialAbiNontrivialCopyCtor[]));3977static_assert(__is_trivially_relocatable(const TrivialAbiNontrivialCopyCtor));3978static_assert(__is_trivially_relocatable(volatile TrivialAbiNontrivialCopyCtor));3979 3980// A more complete set of tests for the behavior of trivial_abi can be found in3981// clang/test/SemaCXX/attr-trivial-abi.cpp3982struct [[clang::trivial_abi]] TrivialAbiNontrivialMoveCtor {3983 TrivialAbiNontrivialMoveCtor(TrivialAbiNontrivialMoveCtor&&) {}3984};3985static_assert(__is_trivially_relocatable(TrivialAbiNontrivialMoveCtor));3986static_assert(__is_trivially_relocatable(TrivialAbiNontrivialMoveCtor[]));3987static_assert(__is_trivially_relocatable(const TrivialAbiNontrivialMoveCtor));3988static_assert(__is_trivially_relocatable(volatile TrivialAbiNontrivialMoveCtor));3989 3990} // namespace is_trivially_relocatable3991 3992namespace is_trivially_equality_comparable {3993struct ForwardDeclared; // expected-note {{forward declaration of 'is_trivially_equality_comparable::ForwardDeclared'}}3994static_assert(!__is_trivially_equality_comparable(ForwardDeclared)); // expected-error {{incomplete type 'ForwardDeclared' used in type trait expression}}3995 3996static_assert(!__is_trivially_equality_comparable(void));3997static_assert(__is_trivially_equality_comparable(int));3998static_assert(!__is_trivially_equality_comparable(int[]));3999static_assert(!__is_trivially_equality_comparable(int[3]));4000static_assert(!__is_trivially_equality_comparable(float));4001static_assert(!__is_trivially_equality_comparable(double));4002static_assert(!__is_trivially_equality_comparable(long double));4003 4004struct NonTriviallyEqualityComparableNoComparator {4005 int i;4006 int j;4007};4008static_assert(!__is_trivially_equality_comparable(NonTriviallyEqualityComparableNoComparator));4009 4010struct NonTriviallyEqualityComparableConvertibleToBuiltin {4011 int i;4012 operator unsigned() const;4013};4014static_assert(!__is_trivially_equality_comparable(NonTriviallyEqualityComparableConvertibleToBuiltin));4015 4016struct NonTriviallyEqualityComparableNonDefaultedComparator {4017 int i;4018 int j;4019 bool operator==(const NonTriviallyEqualityComparableNonDefaultedComparator&);4020};4021static_assert(!__is_trivially_equality_comparable(NonTriviallyEqualityComparableNonDefaultedComparator));4022 4023#if __cplusplus >= 202002L4024 4025struct TriviallyEqualityComparable {4026 int i;4027 int j;4028 4029 void func();4030 bool operator==(int) const { return false; }4031 4032 bool operator==(const TriviallyEqualityComparable&) const = default;4033};4034static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparable));4035 4036struct TriviallyEqualityComparableContainsArray {4037 int a[4];4038 4039 bool operator==(const TriviallyEqualityComparableContainsArray&) const = default;4040};4041static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparableContainsArray));4042 4043struct TriviallyEqualityComparableContainsMultiDimensionArray {4044 int a[4][4];4045 4046 bool operator==(const TriviallyEqualityComparableContainsMultiDimensionArray&) const = default;4047};4048static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparableContainsMultiDimensionArray));4049 4050auto GetNonCapturingLambda() { return [](){ return 42; }; }4051 4052struct TriviallyEqualityComparableContainsLambda {4053 [[no_unique_address]] decltype(GetNonCapturingLambda()) l;4054 int i;4055 4056 bool operator==(const TriviallyEqualityComparableContainsLambda&) const = default;4057};4058static_assert(!__is_trivially_equality_comparable(decltype(GetNonCapturingLambda()))); // padding4059static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparableContainsLambda));4060 4061struct TriviallyEqualityComparableNonTriviallyCopyable {4062 TriviallyEqualityComparableNonTriviallyCopyable(const TriviallyEqualityComparableNonTriviallyCopyable&);4063 ~TriviallyEqualityComparableNonTriviallyCopyable();4064 bool operator==(const TriviallyEqualityComparableNonTriviallyCopyable&) const = default;4065 int i;4066};4067static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparableNonTriviallyCopyable));4068 4069struct NotTriviallyEqualityComparableHasPadding {4070 short i;4071 int j;4072 4073 bool operator==(const NotTriviallyEqualityComparableHasPadding&) const = default;4074};4075static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableHasPadding));4076 4077struct NotTriviallyEqualityComparableHasFloat {4078 float i;4079 int j;4080 4081 bool operator==(const NotTriviallyEqualityComparableHasFloat&) const = default;4082};4083static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableHasFloat));4084 4085struct NotTriviallyEqualityComparableHasTailPadding {4086 int i;4087 char j;4088 4089 bool operator==(const NotTriviallyEqualityComparableHasTailPadding&) const = default;4090};4091static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableHasTailPadding));4092 4093struct NotTriviallyEqualityComparableBase : NotTriviallyEqualityComparableHasTailPadding {4094 char j;4095 4096 bool operator==(const NotTriviallyEqualityComparableBase&) const = default;4097};4098static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableBase));4099 4100class TriviallyEqualityComparablePaddedOutBase {4101 int i;4102 char c;4103 4104public:4105 bool operator==(const TriviallyEqualityComparablePaddedOutBase&) const = default;4106};4107static_assert(!__is_trivially_equality_comparable(TriviallyEqualityComparablePaddedOutBase));4108 4109struct TriviallyEqualityComparablePaddedOut : TriviallyEqualityComparablePaddedOutBase {4110 char j[3];4111 4112 bool operator==(const TriviallyEqualityComparablePaddedOut&) const = default;4113};4114static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparablePaddedOut));4115 4116struct TriviallyEqualityComparable1 {4117 char i;4118 4119 bool operator==(const TriviallyEqualityComparable1&) const = default;4120};4121static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparable1));4122 4123struct TriviallyEqualityComparable2 {4124 int i;4125 4126 bool operator==(const TriviallyEqualityComparable2&) const = default;4127};4128static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparable2));4129 4130struct NotTriviallyEqualityComparableTriviallyEqualityComparableBases4131 : TriviallyEqualityComparable1, TriviallyEqualityComparable2 {4132 bool operator==(const NotTriviallyEqualityComparableTriviallyEqualityComparableBases&) const = default;4133};4134static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableTriviallyEqualityComparableBases));4135 4136struct NotTriviallyEqualityComparableBitfield {4137 int i : 1;4138 4139 bool operator==(const NotTriviallyEqualityComparableBitfield&) const = default;4140};4141static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableBitfield));4142 4143// TODO: This is trivially equality comparable4144struct NotTriviallyEqualityComparableBitfieldFilled {4145 char i : __CHAR_BIT__;4146 4147 bool operator==(const NotTriviallyEqualityComparableBitfieldFilled&) const = default;4148};4149static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableBitfield));4150 4151union U {4152 int i;4153 4154 bool operator==(const U&) const = default;4155};4156 4157struct NotTriviallyEqualityComparableImplicitlyDeletedOperatorByUnion {4158 U u;4159 4160 bool operator==(const NotTriviallyEqualityComparableImplicitlyDeletedOperatorByUnion&) const = default;4161};4162static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableImplicitlyDeletedOperatorByUnion));4163 4164struct NotTriviallyEqualityComparableExplicitlyDeleted {4165 int i;4166 4167 bool operator==(const NotTriviallyEqualityComparableExplicitlyDeleted&) const = delete;4168};4169 4170struct NotTriviallyEqualityComparableImplicitlyDeletedOperatorByStruct {4171 NotTriviallyEqualityComparableExplicitlyDeleted u;4172 4173 bool operator==(const NotTriviallyEqualityComparableImplicitlyDeletedOperatorByStruct&) const = default;4174};4175static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableImplicitlyDeletedOperatorByStruct));4176 4177struct NotTriviallyEqualityComparableHasReferenceMember {4178 int& i;4179 4180 bool operator==(const NotTriviallyEqualityComparableHasReferenceMember&) const = default;4181};4182static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableHasReferenceMember));4183 4184struct NotTriviallyEqualityComparableNonTriviallyComparableBaseBase {4185 int i;4186 4187 bool operator==(const NotTriviallyEqualityComparableNonTriviallyComparableBaseBase&) const {4188 return true;4189 }4190};4191 4192struct NotTriviallyEqualityComparableNonTriviallyComparableBase : NotTriviallyEqualityComparableNonTriviallyComparableBaseBase {4193 int i;4194 4195 bool operator==(const NotTriviallyEqualityComparableNonTriviallyComparableBase&) const = default;4196};4197static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableNonTriviallyComparableBase));4198 4199enum E {4200 a,4201 b4202};4203bool operator==(E, E) { return false; }4204static_assert(!__is_trivially_equality_comparable(E));4205 4206struct NotTriviallyEqualityComparableHasEnum {4207 E e;4208 bool operator==(const NotTriviallyEqualityComparableHasEnum&) const = default;4209};4210static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableHasEnum));4211 4212struct NotTriviallyEqualityComparableNonTriviallyEqualityComparableArrs {4213 E e[1];4214 4215 bool operator==(const NotTriviallyEqualityComparableNonTriviallyEqualityComparableArrs&) const = default;4216};4217static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableNonTriviallyEqualityComparableArrs));4218 4219struct NotTriviallyEqualityComparableNonTriviallyEqualityComparableArrs2 {4220 E e[1][1];4221 4222 bool operator==(const NotTriviallyEqualityComparableNonTriviallyEqualityComparableArrs2&) const = default;4223};4224 4225static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableNonTriviallyEqualityComparableArrs2));4226 4227struct NotTriviallyEqualityComparablePrivateComparison {4228 int i;4229 4230private:4231 bool operator==(const NotTriviallyEqualityComparablePrivateComparison&) const = default;4232};4233static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparablePrivateComparison));4234 4235template<typename T, bool result = __is_trivially_equality_comparable(T)>4236static constexpr bool is_trivially_equality_comparable_sfinae() { return result; }4237 4238// Make sure we don't emit "'operator==' is a private member" in SFINAE context.4239static_assert(!is_trivially_equality_comparable_sfinae<NotTriviallyEqualityComparablePrivateComparison>());4240 4241template<bool B>4242struct MaybeTriviallyEqualityComparable {4243 int i;4244 bool operator==(const MaybeTriviallyEqualityComparable&) const requires B = default;4245 bool operator==(const MaybeTriviallyEqualityComparable& rhs) const { return (i % 3) == (rhs.i % 3); }4246};4247static_assert(__is_trivially_equality_comparable(MaybeTriviallyEqualityComparable<true>));4248static_assert(!__is_trivially_equality_comparable(MaybeTriviallyEqualityComparable<false>));4249 4250struct NotTriviallyEqualityComparableMoreConstrainedExternalOp {4251 int i;4252 bool operator==(const NotTriviallyEqualityComparableMoreConstrainedExternalOp&) const = default;4253};4254 4255bool operator==(const NotTriviallyEqualityComparableMoreConstrainedExternalOp&,4256 const NotTriviallyEqualityComparableMoreConstrainedExternalOp&) __attribute__((enable_if(true, ""))) {}4257 4258static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableMoreConstrainedExternalOp));4259 4260struct TriviallyEqualityComparableExternalDefaultedOp {4261 int i;4262 friend bool operator==(TriviallyEqualityComparableExternalDefaultedOp, TriviallyEqualityComparableExternalDefaultedOp);4263};4264bool operator==(TriviallyEqualityComparableExternalDefaultedOp, TriviallyEqualityComparableExternalDefaultedOp) = default;4265 4266static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparableExternalDefaultedOp));4267 4268struct EqualityComparableBase {4269 bool operator==(const EqualityComparableBase&) const = default;4270};4271 4272struct ComparingBaseOnly : EqualityComparableBase {4273 int j_ = 0;4274};4275static_assert(!__is_trivially_equality_comparable(ComparingBaseOnly));4276 4277template <class>4278class Template {};4279 4280// Make sure we don't crash when instantiating a type4281static_assert(!__is_trivially_equality_comparable(Template<Template<int>>));4282 4283 4284struct S operator==(S, S);4285 4286template <class> struct basic_string_view {};4287 4288struct basic_string {4289 operator basic_string_view<int>() const;4290};4291 4292template <class T>4293const bool is_trivially_equality_comparable = __is_trivially_equality_comparable(T);4294 4295template <int = is_trivially_equality_comparable<basic_string> >4296void find();4297 4298void func() { find(); }4299 4300 4301namespace hidden_friend {4302 4303struct TriviallyEqualityComparable {4304 int i;4305 int j;4306 4307 void func();4308 bool operator==(int) const { return false; }4309 4310 friend bool operator==(const TriviallyEqualityComparable&, const TriviallyEqualityComparable&) = default;4311};4312static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparable));4313 4314struct TriviallyEqualityComparableNonTriviallyCopyable {4315 TriviallyEqualityComparableNonTriviallyCopyable(const TriviallyEqualityComparableNonTriviallyCopyable&);4316 ~TriviallyEqualityComparableNonTriviallyCopyable();4317 friend bool operator==(const TriviallyEqualityComparableNonTriviallyCopyable&, const TriviallyEqualityComparableNonTriviallyCopyable&) = default;4318 int i;4319};4320static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparableNonTriviallyCopyable));4321 4322struct NotTriviallyEqualityComparableHasPadding {4323 short i;4324 int j;4325 4326 friend bool operator==(const NotTriviallyEqualityComparableHasPadding&, const NotTriviallyEqualityComparableHasPadding&) = default;4327};4328static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableHasPadding));4329 4330struct NotTriviallyEqualityComparableHasFloat {4331 float i;4332 int j;4333 4334 friend bool operator==(const NotTriviallyEqualityComparableHasFloat&, const NotTriviallyEqualityComparableHasFloat&) = default;4335};4336static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableHasFloat));4337 4338struct NotTriviallyEqualityComparableHasTailPadding {4339 int i;4340 char j;4341 4342 friend bool operator==(const NotTriviallyEqualityComparableHasTailPadding&, const NotTriviallyEqualityComparableHasTailPadding&) = default;4343};4344static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableHasTailPadding));4345 4346struct NotTriviallyEqualityComparableBase : NotTriviallyEqualityComparableHasTailPadding {4347 char j;4348 4349 friend bool operator==(const NotTriviallyEqualityComparableBase&, const NotTriviallyEqualityComparableBase&) = default;4350};4351static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableBase));4352 4353class TriviallyEqualityComparablePaddedOutBase {4354 int i;4355 char c;4356 4357public:4358 friend bool operator==(const TriviallyEqualityComparablePaddedOutBase&, const TriviallyEqualityComparablePaddedOutBase&) = default;4359};4360static_assert(!__is_trivially_equality_comparable(TriviallyEqualityComparablePaddedOutBase));4361 4362struct TriviallyEqualityComparablePaddedOut : TriviallyEqualityComparablePaddedOutBase {4363 char j[3];4364 4365 friend bool operator==(const TriviallyEqualityComparablePaddedOut&, const TriviallyEqualityComparablePaddedOut&) = default;4366};4367static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparablePaddedOut));4368 4369struct TriviallyEqualityComparable1 {4370 char i;4371 4372 friend bool operator==(const TriviallyEqualityComparable1&, const TriviallyEqualityComparable1&) = default;4373};4374static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparable1));4375 4376struct TriviallyEqualityComparable2 {4377 int i;4378 4379 friend bool operator==(const TriviallyEqualityComparable2&, const TriviallyEqualityComparable2&) = default;4380};4381static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparable2));4382 4383struct NotTriviallyEqualityComparableTriviallyEqualityComparableBases4384 : TriviallyEqualityComparable1, TriviallyEqualityComparable2 {4385 friend bool operator==(const NotTriviallyEqualityComparableTriviallyEqualityComparableBases&, const NotTriviallyEqualityComparableTriviallyEqualityComparableBases&) = default;4386};4387static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableTriviallyEqualityComparableBases));4388 4389struct NotTriviallyEqualityComparableBitfield {4390 int i : 1;4391 4392 friend bool operator==(const NotTriviallyEqualityComparableBitfield&, const NotTriviallyEqualityComparableBitfield&) = default;4393};4394static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableBitfield));4395 4396// TODO: This is trivially equality comparable4397struct NotTriviallyEqualityComparableBitfieldFilled {4398 char i : __CHAR_BIT__;4399 4400 friend bool operator==(const NotTriviallyEqualityComparableBitfieldFilled&, const NotTriviallyEqualityComparableBitfieldFilled&) = default;4401};4402static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableBitfield));4403 4404union U {4405 int i;4406 4407 friend bool operator==(const U&, const U&) = default;4408};4409 4410struct NotTriviallyEqualityComparableImplicitlyDeletedOperatorByUnion {4411 U u;4412 4413 friend bool operator==(const NotTriviallyEqualityComparableImplicitlyDeletedOperatorByUnion&, const NotTriviallyEqualityComparableImplicitlyDeletedOperatorByUnion&) = default;4414};4415static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableImplicitlyDeletedOperatorByUnion));4416 4417struct NotTriviallyEqualityComparableExplicitlyDeleted {4418 int i;4419 4420 friend bool operator==(const NotTriviallyEqualityComparableExplicitlyDeleted&, const NotTriviallyEqualityComparableExplicitlyDeleted&) = delete;4421};4422 4423struct NotTriviallyEqualityComparableImplicitlyDeletedOperatorByStruct {4424 NotTriviallyEqualityComparableExplicitlyDeleted u;4425 4426 friend bool operator==(const NotTriviallyEqualityComparableImplicitlyDeletedOperatorByStruct&, const NotTriviallyEqualityComparableImplicitlyDeletedOperatorByStruct&) = default;4427};4428static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableImplicitlyDeletedOperatorByStruct));4429 4430struct NotTriviallyEqualityComparableHasReferenceMember {4431 int& i;4432 4433 friend bool operator==(const NotTriviallyEqualityComparableHasReferenceMember&, const NotTriviallyEqualityComparableHasReferenceMember&) = default;4434};4435static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableHasReferenceMember));4436 4437enum E {4438 a,4439 b4440};4441bool operator==(E, E) { return false; }4442static_assert(!__is_trivially_equality_comparable(E));4443 4444struct NotTriviallyEqualityComparableHasEnum {4445 E e;4446 friend bool operator==(const NotTriviallyEqualityComparableHasEnum&, const NotTriviallyEqualityComparableHasEnum&) = default;4447};4448static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableHasEnum));4449 4450struct NonTriviallyEqualityComparableValueComparisonNonTriviallyCopyable {4451 int i;4452 NonTriviallyEqualityComparableValueComparisonNonTriviallyCopyable(const NonTriviallyEqualityComparableValueComparisonNonTriviallyCopyable&);4453 4454 friend bool operator==(NonTriviallyEqualityComparableValueComparisonNonTriviallyCopyable, NonTriviallyEqualityComparableValueComparisonNonTriviallyCopyable) = default;4455};4456static_assert(!__is_trivially_equality_comparable(NonTriviallyEqualityComparableValueComparisonNonTriviallyCopyable));4457 4458struct TriviallyEqualityComparableRefComparisonNonTriviallyCopyable {4459 int i;4460 TriviallyEqualityComparableRefComparisonNonTriviallyCopyable(const TriviallyEqualityComparableRefComparisonNonTriviallyCopyable&);4461 4462 friend bool operator==(const TriviallyEqualityComparableRefComparisonNonTriviallyCopyable&, const TriviallyEqualityComparableRefComparisonNonTriviallyCopyable&) = default;4463};4464static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparableRefComparisonNonTriviallyCopyable));4465}4466 4467#endif // __cplusplus >= 202002L4468};4469 4470namespace can_pass_in_regs {4471 4472struct A { };4473 4474struct B {4475 ~B();4476};4477 4478struct C; // expected-note {{forward declaration}}4479 4480union D {4481 int x;4482};4483 4484static_assert(__can_pass_in_regs(A));4485static_assert(__can_pass_in_regs(A));4486static_assert(!__can_pass_in_regs(B));4487static_assert(__can_pass_in_regs(D));4488 4489void test_errors() {4490 (void)__can_pass_in_regs(const A); // expected-error {{not an unqualified class type}}4491 (void)__can_pass_in_regs(A&); // expected-error {{not an unqualified class type}}4492 (void)__can_pass_in_regs(A&&); // expected-error {{not an unqualified class type}}4493 (void)__can_pass_in_regs(const A&); // expected-error {{not an unqualified class type}}4494 (void)__can_pass_in_regs(C); // expected-error {{incomplete type}}4495 (void)__can_pass_in_regs(int); // expected-error {{not an unqualified class type}}4496 (void)__can_pass_in_regs(int&); // expected-error {{not an unqualified class type}}4497}4498}4499 4500struct S {};4501template <class T> using remove_const_t = __remove_const(T);4502 4503void check_remove_const() {4504 static_assert(__is_same(remove_const_t<void>, void));4505 static_assert(__is_same(remove_const_t<const void>, void));4506 static_assert(__is_same(remove_const_t<int>, int));4507 static_assert(__is_same(remove_const_t<const int>, int));4508 static_assert(__is_same(remove_const_t<volatile int>, volatile int));4509 static_assert(__is_same(remove_const_t<const volatile int>, volatile int));4510 static_assert(__is_same(remove_const_t<int *>, int *));4511 static_assert(__is_same(remove_const_t<int *const>, int *));4512 static_assert(__is_same(remove_const_t<int const *const>, int const *));4513 static_assert(__is_same(remove_const_t<int const *const __restrict>, int const *__restrict));4514 static_assert(__is_same(remove_const_t<int &>, int &));4515 static_assert(__is_same(remove_const_t<int const &>, int const &));4516 static_assert(__is_same(remove_const_t<int &&>, int &&));4517 static_assert(__is_same(remove_const_t<int const &&>, int const &&));4518 static_assert(__is_same(remove_const_t<int()>, int()));4519 static_assert(__is_same(remove_const_t<int (*const)()>, int (*)()));4520 static_assert(__is_same(remove_const_t<int (&)()>, int (&)()));4521 4522 static_assert(__is_same(remove_const_t<S>, S));4523 static_assert(__is_same(remove_const_t<const S>, S));4524 static_assert(__is_same(remove_const_t<volatile S>, volatile S));4525 static_assert(__is_same(remove_const_t<S *__restrict>, S *__restrict));4526 static_assert(__is_same(remove_const_t<const volatile S>, volatile S));4527 static_assert(__is_same(remove_const_t<S *const volatile __restrict>, S *volatile __restrict));4528 static_assert(__is_same(remove_const_t<int S::*const>, int S::*));4529 static_assert(__is_same(remove_const_t<int (S::*const)()>, int(S::*)()));4530}4531 4532template <class T> using remove_restrict_t = __remove_restrict(T);4533 4534void check_remove_restrict() {4535 static_assert(__is_same(remove_restrict_t<void>, void));4536 static_assert(__is_same(remove_restrict_t<int>, int));4537 static_assert(__is_same(remove_restrict_t<const int>, const int));4538 static_assert(__is_same(remove_restrict_t<volatile int>, volatile int));4539 static_assert(__is_same(remove_restrict_t<int *__restrict>, int *));4540 static_assert(__is_same(remove_restrict_t<int *const volatile __restrict>, int *const volatile));4541 static_assert(__is_same(remove_restrict_t<int *>, int *));4542 static_assert(__is_same(remove_restrict_t<int *__restrict>, int *));4543 static_assert(__is_same(remove_restrict_t<int &>, int &));4544 static_assert(__is_same(remove_restrict_t<int &__restrict>, int &));4545 static_assert(__is_same(remove_restrict_t<int &&>, int &&));4546 static_assert(__is_same(remove_restrict_t<int &&__restrict>, int &&));4547 static_assert(__is_same(remove_restrict_t<int()>, int()));4548 static_assert(__is_same(remove_restrict_t<int (*const volatile)()>, int (*const volatile)()));4549 static_assert(__is_same(remove_restrict_t<int (&)()>, int (&)()));4550 4551 static_assert(__is_same(remove_restrict_t<S>, S));4552 static_assert(__is_same(remove_restrict_t<const S>, const S));4553 static_assert(__is_same(remove_restrict_t<volatile S>, volatile S));4554 static_assert(__is_same(remove_restrict_t<S *__restrict>, S *));4555 static_assert(__is_same(remove_restrict_t<S *const volatile __restrict>, S *const volatile));4556 static_assert(__is_same(remove_restrict_t<int S::*__restrict>, int S::*));4557 static_assert(__is_same(remove_restrict_t<int (S::*const volatile)()>, int(S::*const volatile)()));4558}4559 4560template <class T> using remove_volatile_t = __remove_volatile(T);4561 4562void check_remove_volatile() {4563 static_assert(__is_same(remove_volatile_t<void>, void));4564 static_assert(__is_same(remove_volatile_t<volatile void>, void));4565 static_assert(__is_same(remove_volatile_t<int>, int));4566 static_assert(__is_same(remove_volatile_t<const int>, const int));4567 static_assert(__is_same(remove_volatile_t<volatile int>, int));4568 static_assert(__is_same(remove_volatile_t<int *__restrict>, int *__restrict));4569 static_assert(__is_same(remove_volatile_t<const volatile int>, const int));4570 static_assert(__is_same(remove_volatile_t<int *const volatile __restrict>, int *const __restrict));4571 static_assert(__is_same(remove_volatile_t<int *>, int *));4572 static_assert(__is_same(remove_volatile_t<int *volatile>, int *));4573 static_assert(__is_same(remove_volatile_t<int volatile *volatile>, int volatile *));4574 static_assert(__is_same(remove_volatile_t<int &>, int &));4575 static_assert(__is_same(remove_volatile_t<int volatile &>, int volatile &));4576 static_assert(__is_same(remove_volatile_t<int &&>, int &&));4577 static_assert(__is_same(remove_volatile_t<int volatile &&>, int volatile &&));4578 static_assert(__is_same(remove_volatile_t<int()>, int()));4579 static_assert(__is_same(remove_volatile_t<int (*volatile)()>, int (*)()));4580 static_assert(__is_same(remove_volatile_t<int (&)()>, int (&)()));4581 4582 static_assert(__is_same(remove_volatile_t<S>, S));4583 static_assert(__is_same(remove_volatile_t<const S>, const S));4584 static_assert(__is_same(remove_volatile_t<volatile S>, S));4585 static_assert(__is_same(remove_volatile_t<const volatile S>, const S));4586 static_assert(__is_same(remove_volatile_t<int S::*volatile>, int S::*));4587 static_assert(__is_same(remove_volatile_t<int (S::*volatile)()>, int(S::*)()));4588}4589 4590template <class T> using remove_cv_t = __remove_cv(T);4591 4592void check_remove_cv() {4593 static_assert(__is_same(remove_cv_t<void>, void));4594 static_assert(__is_same(remove_cv_t<const volatile void>, void));4595 static_assert(__is_same(remove_cv_t<int>, int));4596 static_assert(__is_same(remove_cv_t<const int>, int));4597 static_assert(__is_same(remove_cv_t<volatile int>, int));4598 static_assert(__is_same(remove_cv_t<const volatile int>, int));4599 static_assert(__is_same(remove_cv_t<int *>, int *));4600 static_assert(__is_same(remove_cv_t<int *const volatile>, int *));4601 static_assert(__is_same(remove_cv_t<int const *const volatile>, int const *));4602 static_assert(__is_same(remove_cv_t<int const *const volatile __restrict>, int const *__restrict));4603 static_assert(__is_same(remove_cv_t<int const *const volatile _Nonnull>, int const *_Nonnull));4604 static_assert(__is_same(remove_cv_t<int &>, int &));4605 static_assert(__is_same(remove_cv_t<int const volatile &>, int const volatile &));4606 static_assert(__is_same(remove_cv_t<int &&>, int &&));4607 static_assert(__is_same(remove_cv_t<int const volatile &&>, int const volatile &&));4608 static_assert(__is_same(remove_cv_t<int()>, int()));4609 static_assert(__is_same(remove_cv_t<int (*const volatile)()>, int (*)()));4610 static_assert(__is_same(remove_cv_t<int (&)()>, int (&)()));4611 4612 static_assert(__is_same(remove_cv_t<S>, S));4613 static_assert(__is_same(remove_cv_t<const S>, S));4614 static_assert(__is_same(remove_cv_t<volatile S>, S));4615 static_assert(__is_same(remove_cv_t<const volatile S>, S));4616 static_assert(__is_same(remove_cv_t<int S::*const volatile>, int S::*));4617 static_assert(__is_same(remove_cv_t<int (S::*const volatile)()>, int(S::*)()));4618}4619 4620template <class T> using add_pointer_t = __add_pointer(T);4621 4622void add_pointer() {4623 static_assert(__is_same(add_pointer_t<void>, void *));4624 static_assert(__is_same(add_pointer_t<const void>, const void *));4625 static_assert(__is_same(add_pointer_t<volatile void>, volatile void *));4626 static_assert(__is_same(add_pointer_t<const volatile void>, const volatile void *));4627 static_assert(__is_same(add_pointer_t<int>, int *));4628 static_assert(__is_same(add_pointer_t<const int>, const int *));4629 static_assert(__is_same(add_pointer_t<volatile int>, volatile int *));4630 static_assert(__is_same(add_pointer_t<const volatile int>, const volatile int *));4631 static_assert(__is_same(add_pointer_t<int *>, int **));4632 static_assert(__is_same(add_pointer_t<int &>, int *));4633 static_assert(__is_same(add_pointer_t<int &&>, int *));4634 static_assert(__is_same(add_pointer_t<int()>, int (*)()));4635 static_assert(__is_same(add_pointer_t<int (*)()>, int (**)()));4636 static_assert(__is_same(add_pointer_t<int (&)()>, int (*)()));4637 4638 static_assert(__is_same(add_pointer_t<S>, S *));4639 static_assert(__is_same(add_pointer_t<const S>, const S *));4640 static_assert(__is_same(add_pointer_t<volatile S>, volatile S *));4641 static_assert(__is_same(add_pointer_t<const volatile S>, const volatile S *));4642 static_assert(__is_same(add_pointer_t<int S::*>, int S::**));4643 static_assert(__is_same(add_pointer_t<int (S::*)()>, int(S::**)()));4644 4645 static_assert(__is_same(add_pointer_t<int __attribute__((address_space(1)))>, int __attribute__((address_space(1))) *));4646 static_assert(__is_same(add_pointer_t<S __attribute__((address_space(2)))>, S __attribute__((address_space(2))) *));4647}4648 4649template <class T> using remove_pointer_t = __remove_pointer(T);4650 4651void remove_pointer() {4652 static_assert(__is_same(remove_pointer_t<void>, void));4653 static_assert(__is_same(remove_pointer_t<const void>, const void));4654 static_assert(__is_same(remove_pointer_t<volatile void>, volatile void));4655 static_assert(__is_same(remove_pointer_t<const volatile void>, const volatile void));4656 static_assert(__is_same(remove_pointer_t<int>, int));4657 static_assert(__is_same(remove_pointer_t<const int>, const int));4658 static_assert(__is_same(remove_pointer_t<volatile int>, volatile int));4659 static_assert(__is_same(remove_pointer_t<const volatile int>, const volatile int));4660 static_assert(__is_same(remove_pointer_t<int *>, int));4661 static_assert(__is_same(remove_pointer_t<const int *>, const int));4662 static_assert(__is_same(remove_pointer_t<volatile int *>, volatile int));4663 static_assert(__is_same(remove_pointer_t<const volatile int *>, const volatile int));4664 static_assert(__is_same(remove_pointer_t<int *const>, int));4665 static_assert(__is_same(remove_pointer_t<int *volatile>, int));4666 static_assert(__is_same(remove_pointer_t<int *const volatile>, int));4667 static_assert(__is_same(remove_pointer_t<int &>, int &));4668 static_assert(__is_same(remove_pointer_t<int &&>, int &&));4669 static_assert(__is_same(remove_pointer_t<int()>, int()));4670 static_assert(__is_same(remove_pointer_t<int (*)()>, int()));4671 static_assert(__is_same(remove_pointer_t<int (&)()>, int (&)()));4672 4673 static_assert(__is_same(remove_pointer_t<S>, S));4674 static_assert(__is_same(remove_pointer_t<const S>, const S));4675 static_assert(__is_same(remove_pointer_t<volatile S>, volatile S));4676 static_assert(__is_same(remove_pointer_t<const volatile S>, const volatile S));4677 static_assert(__is_same(remove_pointer_t<int S::*>, int S::*));4678 static_assert(__is_same(remove_pointer_t<int (S::*)()>, int(S::*)()));4679 4680 static_assert(__is_same(remove_pointer_t<int __attribute__((address_space(1))) *>, int __attribute__((address_space(1)))));4681 static_assert(__is_same(remove_pointer_t<S __attribute__((address_space(2))) *>, S __attribute__((address_space(2)))));4682 4683 static_assert(__is_same(remove_pointer_t<int (^)(char)>, int (^)(char)));4684}4685 4686template <class T> using add_lvalue_reference_t = __add_lvalue_reference(T);4687 4688void add_lvalue_reference() {4689 static_assert(__is_same(add_lvalue_reference_t<void>, void));4690 static_assert(__is_same(add_lvalue_reference_t<const void>, const void));4691 static_assert(__is_same(add_lvalue_reference_t<volatile void>, volatile void));4692 static_assert(__is_same(add_lvalue_reference_t<const volatile void>, const volatile void));4693 static_assert(__is_same(add_lvalue_reference_t<int>, int &));4694 static_assert(__is_same(add_lvalue_reference_t<const int>, const int &));4695 static_assert(__is_same(add_lvalue_reference_t<volatile int>, volatile int &));4696 static_assert(__is_same(add_lvalue_reference_t<const volatile int>, const volatile int &));4697 static_assert(__is_same(add_lvalue_reference_t<int *>, int *&));4698 static_assert(__is_same(add_lvalue_reference_t<int &>, int &));4699 static_assert(__is_same(add_lvalue_reference_t<int &&>, int &)); // reference collapsing4700 static_assert(__is_same(add_lvalue_reference_t<int()>, int (&)()));4701 static_assert(__is_same(add_lvalue_reference_t<int (*)()>, int (*&)()));4702 static_assert(__is_same(add_lvalue_reference_t<int (&)()>, int (&)()));4703 4704 static_assert(__is_same(add_lvalue_reference_t<S>, S &));4705 static_assert(__is_same(add_lvalue_reference_t<const S>, const S &));4706 static_assert(__is_same(add_lvalue_reference_t<volatile S>, volatile S &));4707 static_assert(__is_same(add_lvalue_reference_t<const volatile S>, const volatile S &));4708 static_assert(__is_same(add_lvalue_reference_t<int S::*>, int S::*&));4709 static_assert(__is_same(add_lvalue_reference_t<int (S::*)()>, int(S::*&)()));4710}4711 4712template <class T> using add_rvalue_reference_t = __add_rvalue_reference(T);4713 4714void add_rvalue_reference() {4715 static_assert(__is_same(add_rvalue_reference_t<void>, void));4716 static_assert(__is_same(add_rvalue_reference_t<const void>, const void));4717 static_assert(__is_same(add_rvalue_reference_t<volatile void>, volatile void));4718 static_assert(__is_same(add_rvalue_reference_t<const volatile void>, const volatile void));4719 static_assert(__is_same(add_rvalue_reference_t<int>, int &&));4720 static_assert(__is_same(add_rvalue_reference_t<const int>, const int &&));4721 static_assert(__is_same(add_rvalue_reference_t<volatile int>, volatile int &&));4722 static_assert(__is_same(add_rvalue_reference_t<const volatile int>, const volatile int &&));4723 static_assert(__is_same(add_rvalue_reference_t<int *>, int *&&));4724 static_assert(__is_same(add_rvalue_reference_t<int &>, int &)); // reference collapsing4725 static_assert(__is_same(add_rvalue_reference_t<int &&>, int &&));4726 static_assert(__is_same(add_rvalue_reference_t<int()>, int(&&)()));4727 static_assert(__is_same(add_rvalue_reference_t<int (*)()>, int (*&&)()));4728 static_assert(__is_same(add_rvalue_reference_t<int (&)()>, int (&)())); // reference collapsing4729 4730 static_assert(__is_same(add_rvalue_reference_t<S>, S &&));4731 static_assert(__is_same(add_rvalue_reference_t<const S>, const S &&));4732 static_assert(__is_same(add_rvalue_reference_t<volatile S>, volatile S &&));4733 static_assert(__is_same(add_rvalue_reference_t<const volatile S>, const volatile S &&));4734 static_assert(__is_same(add_rvalue_reference_t<int S::*>, int S::*&&));4735 static_assert(__is_same(add_rvalue_reference_t<int (S::*)()>, int(S::* &&)()));4736}4737 4738template <class T> using remove_reference_t = __remove_reference_t(T);4739 4740void check_remove_reference() {4741 static_assert(__is_same(remove_reference_t<void>, void));4742 static_assert(__is_same(remove_reference_t<const volatile void>, const volatile void));4743 static_assert(__is_same(remove_reference_t<int>, int));4744 static_assert(__is_same(remove_reference_t<const int>, const int));4745 static_assert(__is_same(remove_reference_t<volatile int>, volatile int));4746 static_assert(__is_same(remove_reference_t<const volatile int>, const volatile int));4747 static_assert(__is_same(remove_reference_t<int *>, int *));4748 static_assert(__is_same(remove_reference_t<int *const volatile>, int *const volatile));4749 static_assert(__is_same(remove_reference_t<int const *const volatile>, int const *const volatile));4750 static_assert(__is_same(remove_reference_t<int &>, int));4751 static_assert(__is_same(remove_reference_t<int const volatile &>, int const volatile));4752 static_assert(__is_same(remove_reference_t<int &&>, int));4753 static_assert(__is_same(remove_reference_t<int const volatile &&>, int const volatile));4754 static_assert(__is_same(remove_reference_t<int()>, int()));4755 static_assert(__is_same(remove_reference_t<int (*const volatile)()>, int (*const volatile)()));4756 static_assert(__is_same(remove_reference_t<int (&)()>, int()));4757 4758 static_assert(__is_same(remove_reference_t<S>, S));4759 static_assert(__is_same(remove_reference_t<S &>, S));4760 static_assert(__is_same(remove_reference_t<S &&>, S));4761 static_assert(__is_same(remove_reference_t<const S>, const S));4762 static_assert(__is_same(remove_reference_t<const S &>, const S));4763 static_assert(__is_same(remove_reference_t<const S &&>, const S));4764 static_assert(__is_same(remove_reference_t<volatile S>, volatile S));4765 static_assert(__is_same(remove_reference_t<volatile S &>, volatile S));4766 static_assert(__is_same(remove_reference_t<volatile S &&>, volatile S));4767 static_assert(__is_same(remove_reference_t<const volatile S>, const volatile S));4768 static_assert(__is_same(remove_reference_t<const volatile S &>, const volatile S));4769 static_assert(__is_same(remove_reference_t<const volatile S &&>, const volatile S));4770 static_assert(__is_same(remove_reference_t<int S::*const volatile &>, int S::*const volatile));4771 static_assert(__is_same(remove_reference_t<int (S::*const volatile &)()>, int(S::*const volatile)()));4772 static_assert(__is_same(remove_reference_t<int (S::*const volatile &&)() &>, int(S::*const volatile)() &));4773}4774 4775template <class T> using remove_cvref_t = __remove_cvref(T);4776 4777void check_remove_cvref() {4778 static_assert(__is_same(remove_cvref_t<void>, void));4779 static_assert(__is_same(remove_cvref_t<const volatile void>, void));4780 static_assert(__is_same(remove_cvref_t<int>, int));4781 static_assert(__is_same(remove_cvref_t<const int>, int));4782 static_assert(__is_same(remove_cvref_t<volatile int>, int));4783 static_assert(__is_same(remove_cvref_t<const volatile int>, int));4784 static_assert(__is_same(remove_cvref_t<int *>, int *));4785 static_assert(__is_same(remove_cvref_t<int *const volatile>, int *));4786 static_assert(__is_same(remove_cvref_t<int const *const volatile>, int const *));4787 static_assert(__is_same(remove_cvref_t<int const *const volatile __restrict>, int const *__restrict));4788 static_assert(__is_same(remove_cvref_t<int const *const volatile _Nonnull>, int const *_Nonnull));4789 static_assert(__is_same(remove_cvref_t<int &>, int));4790 static_assert(__is_same(remove_cvref_t<int const volatile &>, int));4791 static_assert(__is_same(remove_cvref_t<int &&>, int));4792 static_assert(__is_same(remove_cvref_t<int const volatile &&>, int));4793 static_assert(__is_same(remove_cvref_t<int()>, int()));4794 static_assert(__is_same(remove_cvref_t<int (*const volatile)()>, int (*)()));4795 static_assert(__is_same(remove_cvref_t<int (&)()>, int()));4796 4797 static_assert(__is_same(remove_cvref_t<S>, S));4798 static_assert(__is_same(remove_cvref_t<S &>, S));4799 static_assert(__is_same(remove_cvref_t<S &&>, S));4800 static_assert(__is_same(remove_cvref_t<const S>, S));4801 static_assert(__is_same(remove_cvref_t<const S &>, S));4802 static_assert(__is_same(remove_cvref_t<const S &&>, S));4803 static_assert(__is_same(remove_cvref_t<volatile S>, S));4804 static_assert(__is_same(remove_cvref_t<volatile S &>, S));4805 static_assert(__is_same(remove_cvref_t<volatile S &&>, S));4806 static_assert(__is_same(remove_cvref_t<const volatile S>, S));4807 static_assert(__is_same(remove_cvref_t<const volatile S &>, S));4808 static_assert(__is_same(remove_cvref_t<const volatile S &&>, S));4809 static_assert(__is_same(remove_cvref_t<int S::*const volatile>, int S::*));4810 static_assert(__is_same(remove_cvref_t<int (S::*const volatile)()>, int(S::*)()));4811 static_assert(__is_same(remove_cvref_t<int (S::*const volatile)() &>, int(S::*)() &));4812 static_assert(__is_same(remove_cvref_t<int (S::*const volatile)() &&>, int(S::*)() &&));4813}4814 4815template <class T> using decay_t = __decay(T);4816 4817void check_decay() {4818 static_assert(__is_same(decay_t<void>, void));4819 static_assert(__is_same(decay_t<const volatile void>, void));4820 static_assert(__is_same(decay_t<int>, int));4821 static_assert(__is_same(decay_t<const int>, int));4822 static_assert(__is_same(decay_t<volatile int>, int));4823 static_assert(__is_same(decay_t<const volatile int>, int));4824 static_assert(__is_same(decay_t<int *>, int *));4825 static_assert(__is_same(decay_t<int *const volatile>, int *));4826 static_assert(__is_same(decay_t<int *const volatile __restrict>, int *));4827 static_assert(__is_same(decay_t<int const *const volatile>, int const *));4828 static_assert(__is_same(decay_t<int const *const volatile _Nonnull>, int const *));4829 static_assert(__is_same(decay_t<int &>, int));4830 static_assert(__is_same(decay_t<int const volatile &>, int));4831 static_assert(__is_same(decay_t<int &&>, int));4832 static_assert(__is_same(decay_t<int const volatile &&>, int));4833 static_assert(__is_same(decay_t<int()>, int (*)()));4834 static_assert(__is_same(decay_t<int (*)()>, int (*)()));4835 static_assert(__is_same(decay_t<int (*const)()>, int (*)()));4836 static_assert(__is_same(decay_t<int (*volatile)()>, int (*)()));4837 static_assert(__is_same(decay_t<int (*const volatile)()>, int (*)()));4838 static_assert(__is_same(decay_t<int (&)()>, int (*)()));4839 static_assert(__is_same(decay_t<IntAr>, int *));4840 static_assert(__is_same(decay_t<IntArNB>, int *));4841 4842 static_assert(__is_same(decay_t<S>, S));4843 static_assert(__is_same(decay_t<S &>, S));4844 static_assert(__is_same(decay_t<S &&>, S));4845 static_assert(__is_same(decay_t<const S>, S));4846 static_assert(__is_same(decay_t<const S &>, S));4847 static_assert(__is_same(decay_t<const S &&>, S));4848 static_assert(__is_same(decay_t<volatile S>, S));4849 static_assert(__is_same(decay_t<volatile S &>, S));4850 static_assert(__is_same(decay_t<volatile S &&>, S));4851 static_assert(__is_same(decay_t<const volatile S>, S));4852 static_assert(__is_same(decay_t<const volatile S &>, S));4853 static_assert(__is_same(decay_t<const volatile S &&>, S));4854 static_assert(__is_same(decay_t<int S::*const volatile>, int S::*));4855 static_assert(__is_same(decay_t<int (S::*const volatile)()>, int(S::*)()));4856 static_assert(__is_same(decay_t<int S::*const volatile &>, int S::*));4857 static_assert(__is_same(decay_t<int (S::*const volatile &)()>, int(S::*)()));4858 static_assert(__is_same(decay_t<int S::*const volatile &&>, int S::*));4859}4860 4861template <class T> struct CheckAbominableFunction {};4862template <class M>4863struct CheckAbominableFunction<M S::*> {4864 static void checks() {4865 static_assert(__is_same(add_lvalue_reference_t<M>, M));4866 static_assert(__is_same(add_pointer_t<M>, M));4867 static_assert(__is_same(add_rvalue_reference_t<M>, M));4868 static_assert(__is_same(decay_t<M>, M));4869 static_assert(__is_same(remove_const_t<M>, M));4870 static_assert(__is_same(remove_volatile_t<M>, M));4871 static_assert(__is_same(remove_cv_t<M>, M));4872 static_assert(__is_same(remove_cvref_t<M>, M));4873 static_assert(__is_same(remove_pointer_t<M>, M));4874 static_assert(__is_same(remove_reference_t<M>, M));4875 }4876};4877 4878void check_abominable_function() {4879 { CheckAbominableFunction<int (S::*)() &> x; }4880 { CheckAbominableFunction<int (S::*)() &&> x; }4881 { CheckAbominableFunction<int (S::*)() const> x; }4882 { CheckAbominableFunction<int (S::*)() const &> x; }4883 { CheckAbominableFunction<int (S::*)() const &&> x; }4884 { CheckAbominableFunction<int (S::*)() volatile> x; }4885 { CheckAbominableFunction<int (S::*)() volatile &> x; }4886 { CheckAbominableFunction<int (S::*)() volatile &&> x; }4887 { CheckAbominableFunction<int (S::*)() const volatile> x; }4888 { CheckAbominableFunction<int (S::*)() const volatile &> x; }4889 { CheckAbominableFunction<int (S::*)() const volatile &&> x; }4890}4891 4892template <class T> using make_signed_t = __make_signed(T);4893template <class T, class Expected>4894void check_make_signed() {4895 static_assert(__is_same(make_signed_t<T>, Expected));4896 static_assert(__is_same(make_signed_t<const T>, const Expected));4897 static_assert(__is_same(make_signed_t<volatile T>, volatile Expected));4898 static_assert(__is_same(make_signed_t<const volatile T>, const volatile Expected));4899}4900 4901#if defined(__ILP32__) || defined(__LLP64__)4902 using Int64 = long long;4903 using UInt64 = unsigned long long;4904#elif defined(__LP64__) || defined(__ILP64__) || defined(__SILP64__)4905 using Int64 = long;4906 using UInt64 = unsigned long;4907#else4908#error Programming model currently unsupported; please add a new entry.4909#endif4910 4911enum UnscopedBool : bool {}; // deliberately char4912enum class ScopedBool : bool {}; // deliberately char4913enum UnscopedChar : char {}; // deliberately char4914enum class ScopedChar : char {}; // deliberately char4915enum UnscopedUChar : unsigned char {};4916enum class ScopedUChar : unsigned char {};4917enum UnscopedLongLong : long long {};4918enum UnscopedULongLong : unsigned long long {};4919enum class ScopedLongLong : long long {};4920enum class ScopedULongLong : unsigned long long {};4921enum class UnscopedInt128 : __int128 {};4922enum class ScopedInt128 : __int128 {};4923enum class UnscopedUInt128 : unsigned __int128 {};4924enum class ScopedUInt128 : unsigned __int128 {};4925 4926void make_signed() {4927 check_make_signed<char, signed char>();4928 check_make_signed<signed char, signed char>();4929 check_make_signed<unsigned char, signed char>();4930 check_make_signed<short, short>();4931 check_make_signed<unsigned short, short>();4932 check_make_signed<int, int>();4933 check_make_signed<unsigned int, int>();4934 check_make_signed<long, long>();4935 check_make_signed<unsigned long, long>();4936 check_make_signed<long long, long long>();4937 check_make_signed<unsigned long long, long long>();4938 check_make_signed<__int128, __int128>();4939 check_make_signed<__uint128_t, __int128>();4940 check_make_signed<_BitInt(65), _BitInt(65)>();4941 check_make_signed<unsigned _BitInt(65), _BitInt(65)>();4942 4943 check_make_signed<wchar_t, int>();4944#if __cplusplus >= 202002L4945 check_make_signed<char8_t, signed char>();4946#endif4947#if __cplusplus >= 201103L4948 check_make_signed<char16_t, short>();4949 check_make_signed<char32_t, int>();4950#endif4951 4952 check_make_signed<UnscopedChar, signed char>();4953 check_make_signed<ScopedChar, signed char>();4954 check_make_signed<UnscopedUChar, signed char>();4955 check_make_signed<ScopedUChar, signed char>();4956 4957 check_make_signed<UnscopedLongLong, Int64>();4958 check_make_signed<UnscopedULongLong, Int64>();4959 check_make_signed<ScopedLongLong, Int64>();4960 check_make_signed<ScopedULongLong, Int64>();4961 4962 check_make_signed<UnscopedInt128, __int128>();4963 check_make_signed<ScopedInt128, __int128>();4964 check_make_signed<UnscopedUInt128, __int128>();4965 check_make_signed<ScopedUInt128, __int128>();4966 4967 { using ExpectedError = __make_signed(bool); }4968 // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'bool'}}4969 { using ExpectedError = __make_signed(UnscopedBool); }4970 // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'UnscopedBool' whose underlying type is 'bool'}}4971 { using ExpectedError = __make_signed(ScopedBool); }4972 // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'ScopedBool' whose underlying type is 'bool'}}4973 { using ExpectedError = __make_signed(unsigned _BitInt(1)); }4974 // expected-error@*:*{{'make_signed' is only compatible with non-_BitInt(1) integers and enum types, but was given 'unsigned _BitInt(1)'}}4975 { using ExpectedError = __make_signed(int[]); }4976 // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'int[]'}}4977 { using ExpectedError = __make_signed(int[5]); }4978 // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'int[5]'}}4979 { using ExpectedError = __make_signed(void); }4980 // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'void'}}4981 { using ExpectedError = __make_signed(int *); }4982 // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'int *'}}4983 { using ExpectedError = __make_signed(int &); }4984 // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'int &'}}4985 { using ExpectedError = __make_signed(int &&); }4986 // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'int &&'}}4987 { using ExpectedError = __make_signed(float); }4988 // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'float'}}4989 { using ExpectedError = __make_signed(double); }4990 // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'double'}}4991 { using ExpectedError = __make_signed(long double); }4992 // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'long double'}}4993 { using ExpectedError = __make_signed(S); }4994 // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'S'}}4995 { using ExpectedError = __make_signed(S *); }4996 // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'S *'}}4997 { using ExpectedError = __make_signed(int S::*); }4998 // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'int S::*'}}4999 { using ExpectedError = __make_signed(int(S::*)()); }5000 // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'int (S::*)()'}}5001}5002 5003template <class T>5004using make_unsigned_t = __make_unsigned(T);5005 5006template <class T, class Expected>5007void check_make_unsigned() {5008 static_assert(__is_same(make_unsigned_t<T>, Expected));5009 static_assert(__is_same(make_unsigned_t<const T>, const Expected));5010 static_assert(__is_same(make_unsigned_t<volatile T>, volatile Expected));5011 static_assert(__is_same(make_unsigned_t<const volatile T>, const volatile Expected));5012}5013 5014void make_unsigned() {5015 check_make_unsigned<char, unsigned char>();5016 check_make_unsigned<signed char, unsigned char>();5017 check_make_unsigned<unsigned char, unsigned char>();5018 check_make_unsigned<short, unsigned short>();5019 check_make_unsigned<unsigned short, unsigned short>();5020 check_make_unsigned<int, unsigned int>();5021 check_make_unsigned<unsigned int, unsigned int>();5022 check_make_unsigned<long, unsigned long>();5023 check_make_unsigned<unsigned long, unsigned long>();5024 check_make_unsigned<long long, unsigned long long>();5025 check_make_unsigned<unsigned long long, unsigned long long>();5026 check_make_unsigned<__int128, __uint128_t>();5027 check_make_unsigned<__uint128_t, __uint128_t>();5028 check_make_unsigned<_BitInt(65), unsigned _BitInt(65)>();5029 check_make_unsigned<unsigned _BitInt(65), unsigned _BitInt(65)>();5030 5031 check_make_unsigned<wchar_t, unsigned int>();5032#if __cplusplus >= 202002L5033 check_make_unsigned<char8_t, unsigned char>();5034#endif5035#if __cplusplus >= 201103L5036 check_make_unsigned<char16_t, unsigned short>();5037 check_make_unsigned<char32_t, unsigned int>();5038#endif5039 5040 check_make_unsigned<UnscopedChar, unsigned char>();5041 check_make_unsigned<ScopedChar, unsigned char>();5042 check_make_unsigned<UnscopedUChar, unsigned char>();5043 check_make_unsigned<ScopedUChar, unsigned char>();5044 5045 check_make_unsigned<UnscopedLongLong, UInt64>();5046 check_make_unsigned<UnscopedULongLong, UInt64>();5047 check_make_unsigned<ScopedLongLong, UInt64>();5048 check_make_unsigned<ScopedULongLong, UInt64>();5049 5050 check_make_unsigned<UnscopedInt128, unsigned __int128>();5051 check_make_unsigned<ScopedInt128, unsigned __int128>();5052 check_make_unsigned<UnscopedUInt128, unsigned __int128>();5053 check_make_unsigned<ScopedUInt128, unsigned __int128>();5054 5055 { using ExpectedError = __make_unsigned(bool); }5056 // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'bool'}}5057 { using ExpectedError = __make_unsigned(UnscopedBool); }5058 // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'UnscopedBool' whose underlying type is 'bool'}}5059 { using ExpectedError = __make_unsigned(ScopedBool); }5060 // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'ScopedBool' whose underlying type is 'bool'}}5061 { using ExpectedError = __make_unsigned(unsigned _BitInt(1)); }5062 // expected-error@*:*{{'make_unsigned' is only compatible with non-_BitInt(1) integers and enum types, but was given 'unsigned _BitInt(1)'}}5063 { using ExpectedError = __make_unsigned(int[]); }5064 // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'int[]'}}5065 { using ExpectedError = __make_unsigned(int[5]); }5066 // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'int[5]'}}5067 { using ExpectedError = __make_unsigned(void); }5068 // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'void'}}5069 { using ExpectedError = __make_unsigned(int *); }5070 // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'int *'}}5071 { using ExpectedError = __make_unsigned(int &); }5072 // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'int &'}}5073 { using ExpectedError = __make_unsigned(int &&); }5074 // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'int &&'}}5075 { using ExpectedError = __make_unsigned(float); }5076 // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'float'}}5077 { using ExpectedError = __make_unsigned(double); }5078 // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'double'}}5079 { using ExpectedError = __make_unsigned(long double); }5080 // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'long double'}}5081 { using ExpectedError = __make_unsigned(S); }5082 // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'S'}}5083 { using ExpectedError = __make_unsigned(S *); }5084 // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'S *'}}5085 { using ExpectedError = __make_unsigned(int S::*); }5086 // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'int S::*'}}5087 { using ExpectedError = __make_unsigned(int(S::*)()); }5088 // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'int (S::*)()'}}5089}5090 5091template <class T> using remove_extent_t = __remove_extent(T);5092 5093void remove_extent() {5094 static_assert(__is_same(remove_extent_t<void>, void));5095 static_assert(__is_same(remove_extent_t<int>, int));5096 static_assert(__is_same(remove_extent_t<int[]>, int));5097 static_assert(__is_same(remove_extent_t<int[1]>, int));5098 static_assert(__is_same(remove_extent_t<int[1][2]>, int[2]));5099 static_assert(__is_same(remove_extent_t<int[][2]>, int[2]));5100 static_assert(__is_same(remove_extent_t<const int[]>, const int));5101 static_assert(__is_same(remove_extent_t<const int[1]>, const int));5102 static_assert(__is_same(remove_extent_t<const int[1][2]>, const int[2]));5103 static_assert(__is_same(remove_extent_t<const int[][2]>, const int[2]));5104 static_assert(__is_same(remove_extent_t<volatile int[]>, volatile int));5105 static_assert(__is_same(remove_extent_t<volatile int[1]>, volatile int));5106 static_assert(__is_same(remove_extent_t<volatile int[1][2]>, volatile int[2]));5107 static_assert(__is_same(remove_extent_t<volatile int[][2]>, volatile int[2]));5108 static_assert(__is_same(remove_extent_t<const volatile int[]>, const volatile int));5109 static_assert(__is_same(remove_extent_t<const volatile int[1]>, const volatile int));5110 static_assert(__is_same(remove_extent_t<const volatile int[1][2]>, const volatile int[2]));5111 static_assert(__is_same(remove_extent_t<const volatile int[][2]>, const volatile int[2]));5112 static_assert(__is_same(remove_extent_t<int *>, int *));5113 static_assert(__is_same(remove_extent_t<int &>, int &));5114 static_assert(__is_same(remove_extent_t<int &&>, int &&));5115 static_assert(__is_same(remove_extent_t<int()>, int()));5116 static_assert(__is_same(remove_extent_t<int (*)()>, int (*)()));5117 static_assert(__is_same(remove_extent_t<int (&)()>, int (&)()));5118 5119 static_assert(__is_same(remove_extent_t<S>, S));5120 static_assert(__is_same(remove_extent_t<int S::*>, int S::*));5121 static_assert(__is_same(remove_extent_t<int (S::*)()>, int(S::*)()));5122 5123 using SomeArray = int[1][2];5124 static_assert(__is_same(remove_extent_t<const SomeArray>, const int[2]));5125}5126 5127template <class T> using remove_all_extents_t = __remove_all_extents(T);5128 5129void remove_all_extents() {5130 static_assert(__is_same(remove_all_extents_t<void>, void));5131 static_assert(__is_same(remove_all_extents_t<int>, int));5132 static_assert(__is_same(remove_all_extents_t<const int>, const int));5133 static_assert(__is_same(remove_all_extents_t<volatile int>, volatile int));5134 static_assert(__is_same(remove_all_extents_t<const volatile int>, const volatile int));5135 static_assert(__is_same(remove_all_extents_t<int[]>, int));5136 static_assert(__is_same(remove_all_extents_t<int[1]>, int));5137 static_assert(__is_same(remove_all_extents_t<int[1][2]>, int));5138 static_assert(__is_same(remove_all_extents_t<int[][2]>, int));5139 static_assert(__is_same(remove_all_extents_t<const int[]>, const int));5140 static_assert(__is_same(remove_all_extents_t<const int[1]>, const int));5141 static_assert(__is_same(remove_all_extents_t<const int[1][2]>, const int));5142 static_assert(__is_same(remove_all_extents_t<const int[][2]>, const int));5143 static_assert(__is_same(remove_all_extents_t<volatile int[]>, volatile int));5144 static_assert(__is_same(remove_all_extents_t<volatile int[1]>, volatile int));5145 static_assert(__is_same(remove_all_extents_t<volatile int[1][2]>, volatile int));5146 static_assert(__is_same(remove_all_extents_t<volatile int[][2]>, volatile int));5147 static_assert(__is_same(remove_all_extents_t<const volatile int[]>, const volatile int));5148 static_assert(__is_same(remove_all_extents_t<const volatile int[1]>, const volatile int));5149 static_assert(__is_same(remove_all_extents_t<const volatile int[1][2]>, const volatile int));5150 static_assert(__is_same(remove_all_extents_t<const volatile int[][2]>, const volatile int));5151 static_assert(__is_same(remove_all_extents_t<int *>, int *));5152 static_assert(__is_same(remove_all_extents_t<int &>, int &));5153 static_assert(__is_same(remove_all_extents_t<int &&>, int &&));5154 static_assert(__is_same(remove_all_extents_t<int()>, int()));5155 static_assert(__is_same(remove_all_extents_t<int (*)()>, int (*)()));5156 static_assert(__is_same(remove_all_extents_t<int (&)()>, int (&)()));5157 5158 static_assert(__is_same(remove_all_extents_t<S>, S));5159 static_assert(__is_same(remove_all_extents_t<int S::*>, int S::*));5160 static_assert(__is_same(remove_all_extents_t<int (S::*)()>, int(S::*)()));5161 5162 using SomeArray = int[1][2];5163 static_assert(__is_same(remove_all_extents_t<const SomeArray>, const int));5164}5165 5166namespace GH121278 {5167// https://cplusplus.github.io/LWG/lwg-active.html#39295168#if __cplusplus >= 202002L5169template <typename B, typename D>5170concept C = __is_base_of(B, D);5171// expected-error@-1 {{incomplete type 'S' used in type trait expression}}5172// expected-note@-2 {{while substituting template arguments into constraint expression here}}5173 5174struct T;5175struct S;5176bool b = C<T, S>;5177// expected-note@-1 {{while checking the satisfaction of concept 'C<T, S>' requested here}}5178#endif5179}5180