// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify -std=gnu++11 -fblocks -Wno-deprecated-builtins -Wno-defaulted-function-deleted %s // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify -std=gnu++14 -fblocks -Wno-deprecated-builtins -Wno-defaulted-function-deleted %s // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify -std=gnu++17 -fblocks -Wno-deprecated-builtins -Wno-defaulted-function-deleted %s // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify -std=gnu++20 -fblocks -Wno-deprecated-builtins -Wno-defaulted-function-deleted %s #define T(b) (b) ? 1 : -1 #define F(b) (b) ? -1 : 1 struct NonPOD { NonPOD(int); }; typedef NonPOD NonPODAr[10]; typedef NonPOD NonPODArNB[]; typedef NonPOD NonPODArMB[10][2]; // PODs enum Enum { EV }; enum SignedEnum : signed int { }; enum UnsignedEnum : unsigned int { }; enum class EnumClass { EV }; enum class SignedEnumClass : signed int {}; enum class UnsignedEnumClass : unsigned int {}; struct POD { Enum e; int i; float f; NonPOD* p; }; struct Empty {}; struct IncompleteStruct; typedef Empty EmptyAr[10]; typedef Empty EmptyArNB[]; typedef Empty EmptyArMB[1][2]; typedef int Int; typedef Int IntAr[10]; typedef Int IntArNB[]; class Statics { static int priv; static NonPOD np; }; union EmptyUnion {}; union IncompleteUnion; // expected-note {{forward declaration of 'IncompleteUnion'}} union Union { int i; float f; }; struct HasFunc { void f (); }; struct HasOp { void operator *(); }; struct HasConv { operator int(); }; struct HasAssign { void operator =(int); }; struct HasAnonymousUnion { union { int i; float f; }; }; typedef int Vector __attribute__((vector_size(16))); typedef int VectorExt __attribute__((ext_vector_type(4))); using ComplexFloat = _Complex float; using ComplexInt = _Complex int; // Not PODs typedef const void cvoid; struct Derives : POD {}; typedef Derives DerivesAr[10]; typedef Derives DerivesArNB[]; struct DerivesEmpty : Empty {}; struct HasCons { HasCons(int); }; struct HasDefaultCons { HasDefaultCons() = default; }; struct HasExplicitDefaultCons { explicit HasExplicitDefaultCons() = default; }; struct HasInheritedCons : HasDefaultCons { using HasDefaultCons::HasDefaultCons; }; struct HasNoInheritedCons : HasCons {}; struct HasCopyAssign { HasCopyAssign operator =(const HasCopyAssign&); }; struct HasMoveAssign { HasMoveAssign operator =(const HasMoveAssign&&); }; struct HasNoThrowMoveAssign { HasNoThrowMoveAssign& operator=( const HasNoThrowMoveAssign&&) throw(); }; struct HasNoExceptNoThrowMoveAssign { HasNoExceptNoThrowMoveAssign& operator=( const HasNoExceptNoThrowMoveAssign&&) noexcept; }; struct HasThrowMoveAssign { HasThrowMoveAssign& operator=(const HasThrowMoveAssign&&) #if __cplusplus <= 201402L throw(POD); #else noexcept(false); #endif }; struct HasNoExceptFalseMoveAssign { HasNoExceptFalseMoveAssign& operator=( const HasNoExceptFalseMoveAssign&&) noexcept(false); }; struct HasMoveCtor { HasMoveCtor(const HasMoveCtor&&); }; struct HasMemberMoveCtor { HasMoveCtor member; }; struct HasMemberMoveAssign { HasMoveAssign member; }; struct HasStaticMemberMoveCtor { static HasMoveCtor member; }; struct HasStaticMemberMoveAssign { static HasMoveAssign member; }; struct HasMemberThrowMoveAssign { HasThrowMoveAssign member; }; struct HasMemberNoExceptFalseMoveAssign { HasNoExceptFalseMoveAssign member; }; struct HasMemberNoThrowMoveAssign { HasNoThrowMoveAssign member; }; struct HasMemberNoExceptNoThrowMoveAssign { HasNoExceptNoThrowMoveAssign member; }; struct HasDefaultTrivialCopyAssign { HasDefaultTrivialCopyAssign &operator=( const HasDefaultTrivialCopyAssign&) = default; }; struct TrivialMoveButNotCopy { TrivialMoveButNotCopy &operator=(TrivialMoveButNotCopy&&) = default; TrivialMoveButNotCopy &operator=(const TrivialMoveButNotCopy&); }; struct NonTrivialDefault { NonTrivialDefault(); }; struct HasDest { ~HasDest(); }; class HasPriv { int priv; }; class HasProt { protected: int prot; }; struct HasRef { int i; int& ref; HasRef() : i(0), ref(i) {} }; struct HasRefAggregate { int i; int& ref; }; struct HasNonPOD { NonPOD np; }; struct HasVirt { virtual void Virt() {}; }; typedef NonPOD NonPODAr[10]; typedef HasVirt VirtAr[10]; typedef NonPOD NonPODArNB[]; union NonPODUnion { int i; Derives n; }; struct DerivesHasCons : HasCons {}; struct DerivesHasCopyAssign : HasCopyAssign {}; struct DerivesHasMoveAssign : HasMoveAssign {}; struct DerivesHasDest : HasDest {}; struct DerivesHasPriv : HasPriv {}; struct DerivesHasProt : HasProt {}; struct DerivesHasRef : HasRef {}; struct DerivesHasVirt : HasVirt {}; struct DerivesHasMoveCtor : HasMoveCtor {}; struct HasNoThrowCopyAssign { void operator =(const HasNoThrowCopyAssign&) throw(); }; struct HasMultipleCopyAssign { void operator =(const HasMultipleCopyAssign&) throw(); void operator =(volatile HasMultipleCopyAssign&); }; struct HasMultipleNoThrowCopyAssign { void operator =(const HasMultipleNoThrowCopyAssign&) throw(); void operator =(volatile HasMultipleNoThrowCopyAssign&) throw(); }; struct HasNoThrowConstructor { HasNoThrowConstructor() throw(); }; struct HasNoThrowConstructorWithArgs { HasNoThrowConstructorWithArgs(HasCons i = HasCons(0)) throw(); }; struct HasMultipleDefaultConstructor1 { HasMultipleDefaultConstructor1() throw(); HasMultipleDefaultConstructor1(int i = 0); }; struct HasMultipleDefaultConstructor2 { HasMultipleDefaultConstructor2(int i = 0); HasMultipleDefaultConstructor2() throw(); }; struct HasNoThrowCopy { HasNoThrowCopy(const HasNoThrowCopy&) throw(); }; struct HasMultipleCopy { HasMultipleCopy(const HasMultipleCopy&) throw(); HasMultipleCopy(volatile HasMultipleCopy&); }; struct HasMultipleNoThrowCopy { HasMultipleNoThrowCopy(const HasMultipleNoThrowCopy&) throw(); HasMultipleNoThrowCopy(volatile HasMultipleNoThrowCopy&) throw(); }; struct HasVirtDest { virtual ~HasVirtDest(); }; struct DerivedVirtDest : HasVirtDest {}; typedef HasVirtDest VirtDestAr[1]; class AllPrivate { AllPrivate() throw(); AllPrivate(const AllPrivate&) throw(); AllPrivate &operator=(const AllPrivate &) throw(); ~AllPrivate() throw(); }; struct ThreeArgCtor { ThreeArgCtor(int*, char*, int); }; struct VariadicCtor { template VariadicCtor(T...); }; struct ThrowingDtor { ~ThrowingDtor() #if __cplusplus <= 201402L throw(int); #else noexcept(false); #endif }; struct NoExceptDtor { ~NoExceptDtor() noexcept(true); }; struct NoThrowDtor { ~NoThrowDtor() throw(); }; struct ACompleteType {}; struct AnIncompleteType; // expected-note 1+ {{forward declaration of 'AnIncompleteType'}} typedef AnIncompleteType AnIncompleteTypeAr[42]; typedef AnIncompleteType AnIncompleteTypeArNB[]; typedef AnIncompleteType AnIncompleteTypeArMB[1][10]; struct HasInClassInit { int x = 42; }; struct HasPrivateBase : private ACompleteType {}; struct HasProtectedBase : protected ACompleteType {}; struct HasVirtBase : virtual ACompleteType {}; void is_pod() { { int arr[T(__is_pod(int))]; } { int arr[T(__is_pod(Enum))]; } { int arr[T(__is_pod(POD))]; } { int arr[T(__is_pod(Int))]; } { int arr[T(__is_pod(IntAr))]; } { int arr[T(__is_pod(Statics))]; } { int arr[T(__is_pod(Empty))]; } { int arr[T(__is_pod(EmptyUnion))]; } { int arr[T(__is_pod(Union))]; } { int arr[T(__is_pod(HasFunc))]; } { int arr[T(__is_pod(HasOp))]; } { int arr[T(__is_pod(HasConv))]; } { int arr[T(__is_pod(HasAssign))]; } { int arr[T(__is_pod(IntArNB))]; } { int arr[T(__is_pod(HasAnonymousUnion))]; } { int arr[T(__is_pod(Vector))]; } { int arr[T(__is_pod(VectorExt))]; } { int arr[T(__is_pod(Derives))]; } { int arr[T(__is_pod(DerivesAr))]; } { int arr[T(__is_pod(DerivesArNB))]; } { int arr[T(__is_pod(DerivesEmpty))]; } { int arr[T(__is_pod(HasPriv))]; } { int arr[T(__is_pod(HasProt))]; } { int arr[T(__is_pod(DerivesHasPriv))]; } { int arr[T(__is_pod(DerivesHasProt))]; } { int arr[F(__is_pod(HasCons))]; } { int arr[F(__is_pod(HasCopyAssign))]; } { int arr[F(__is_pod(HasMoveAssign))]; } { int arr[F(__is_pod(HasDest))]; } { int arr[F(__is_pod(HasRef))]; } { int arr[F(__is_pod(HasVirt))]; } { int arr[F(__is_pod(DerivesHasCons))]; } { int arr[F(__is_pod(DerivesHasCopyAssign))]; } { int arr[F(__is_pod(DerivesHasMoveAssign))]; } { int arr[F(__is_pod(DerivesHasDest))]; } { int arr[F(__is_pod(DerivesHasRef))]; } { int arr[F(__is_pod(DerivesHasVirt))]; } { int arr[F(__is_pod(NonPOD))]; } { int arr[F(__is_pod(HasNonPOD))]; } { int arr[F(__is_pod(NonPODAr))]; } { int arr[F(__is_pod(NonPODArNB))]; } { int arr[F(__is_pod(void))]; } { int arr[F(__is_pod(cvoid))]; } // { int arr[F(__is_pod(NonPODUnion))]; } { int arr[T(__is_pod(ACompleteType))]; } { int arr[F(__is_pod(AnIncompleteType))]; } // expected-error {{incomplete type}} { int arr[F(__is_pod(AnIncompleteType[]))]; } // expected-error {{incomplete type}} { int arr[F(__is_pod(AnIncompleteType[1]))]; } // expected-error {{incomplete type}} } typedef Empty EmptyAr[10]; struct Bit0 { int : 0; }; struct Bit0Cons { int : 0; Bit0Cons(); }; struct AnonBitOnly { int : 3; }; struct BitOnly { int x : 3; }; struct DerivesVirt : virtual POD {}; void is_empty() { { int arr[T(__is_empty(Empty))]; } { int arr[T(__is_empty(DerivesEmpty))]; } { int arr[T(__is_empty(HasCons))]; } { int arr[T(__is_empty(HasCopyAssign))]; } { int arr[T(__is_empty(HasMoveAssign))]; } { int arr[T(__is_empty(HasDest))]; } { int arr[T(__is_empty(HasFunc))]; } { int arr[T(__is_empty(HasOp))]; } { int arr[T(__is_empty(HasConv))]; } { int arr[T(__is_empty(HasAssign))]; } { int arr[T(__is_empty(Bit0))]; } { int arr[T(__is_empty(Bit0Cons))]; } { int arr[F(__is_empty(Int))]; } { int arr[F(__is_empty(POD))]; } { int arr[F(__is_empty(EmptyUnion))]; } { int arr[F(__is_empty(IncompleteUnion))]; } { int arr[F(__is_empty(EmptyAr))]; } { int arr[F(__is_empty(HasRef))]; } { int arr[F(__is_empty(HasVirt))]; } { int arr[F(__is_empty(AnonBitOnly))]; } { int arr[F(__is_empty(BitOnly))]; } { int arr[F(__is_empty(void))]; } { int arr[F(__is_empty(IntArNB))]; } { int arr[F(__is_empty(HasAnonymousUnion))]; } // { int arr[F(__is_empty(DerivesVirt))]; } { int arr[T(__is_empty(ACompleteType))]; } { int arr[F(__is_empty(AnIncompleteType))]; } // expected-error {{incomplete type}} { int arr[F(__is_empty(AnIncompleteType[]))]; } { int arr[F(__is_empty(AnIncompleteType[1]))]; } } typedef Derives ClassType; void is_class() { { int arr[T(__is_class(Derives))]; } { int arr[T(__is_class(HasPriv))]; } { int arr[T(__is_class(ClassType))]; } { int arr[T(__is_class(HasAnonymousUnion))]; } { int arr[F(__is_class(int))]; } { int arr[F(__is_class(Enum))]; } { int arr[F(__is_class(Int))]; } { int arr[F(__is_class(IntAr))]; } { int arr[F(__is_class(DerivesAr))]; } { int arr[F(__is_class(Union))]; } { int arr[F(__is_class(cvoid))]; } { int arr[F(__is_class(IntArNB))]; } } typedef Union UnionAr[10]; typedef Union UnionType; void is_union() { { int arr[T(__is_union(Union))]; } { int arr[T(__is_union(UnionType))]; } { int arr[F(__is_union(int))]; } { int arr[F(__is_union(Enum))]; } { int arr[F(__is_union(Int))]; } { int arr[F(__is_union(IntAr))]; } { int arr[F(__is_union(UnionAr))]; } { int arr[F(__is_union(cvoid))]; } { int arr[F(__is_union(IntArNB))]; } { int arr[F(__is_union(HasAnonymousUnion))]; } } typedef Enum EnumType; typedef EnumClass EnumClassType; void is_enum() { { int arr[T(__is_enum(Enum))]; } { int arr[T(__is_enum(EnumType))]; } { int arr[T(__is_enum(SignedEnum))]; } { int arr[T(__is_enum(UnsignedEnum))]; } { int arr[T(__is_enum(EnumClass))]; } { int arr[T(__is_enum(EnumClassType))]; } { int arr[T(__is_enum(SignedEnumClass))]; } { int arr[T(__is_enum(UnsignedEnumClass))]; } { int arr[F(__is_enum(int))]; } { int arr[F(__is_enum(Union))]; } { int arr[F(__is_enum(Int))]; } { int arr[F(__is_enum(IntAr))]; } { int arr[F(__is_enum(UnionAr))]; } { int arr[F(__is_enum(Derives))]; } { int arr[F(__is_enum(ClassType))]; } { int arr[F(__is_enum(cvoid))]; } { int arr[F(__is_enum(IntArNB))]; } { int arr[F(__is_enum(HasAnonymousUnion))]; } { int arr[F(__is_enum(AnIncompleteType))]; } { int arr[F(__is_enum(AnIncompleteTypeAr))]; } { int arr[F(__is_enum(AnIncompleteTypeArMB))]; } { int arr[F(__is_enum(AnIncompleteTypeArNB))]; } } void is_scoped_enum() { static_assert(!__is_scoped_enum(Enum), ""); static_assert(!__is_scoped_enum(EnumType), ""); static_assert(!__is_scoped_enum(SignedEnum), ""); static_assert(!__is_scoped_enum(UnsignedEnum), ""); static_assert(__is_scoped_enum(EnumClass), ""); static_assert(__is_scoped_enum(EnumClassType), ""); static_assert(__is_scoped_enum(SignedEnumClass), ""); static_assert(__is_scoped_enum(UnsignedEnumClass), ""); static_assert(!__is_scoped_enum(int), ""); static_assert(!__is_scoped_enum(Union), ""); static_assert(!__is_scoped_enum(Int), ""); static_assert(!__is_scoped_enum(IntAr), ""); static_assert(!__is_scoped_enum(UnionAr), ""); static_assert(!__is_scoped_enum(Derives), ""); static_assert(!__is_scoped_enum(ClassType), ""); static_assert(!__is_scoped_enum(cvoid), ""); static_assert(!__is_scoped_enum(IntArNB), ""); static_assert(!__is_scoped_enum(HasAnonymousUnion), ""); static_assert(!__is_scoped_enum(AnIncompleteType), ""); static_assert(!__is_scoped_enum(AnIncompleteTypeAr), ""); static_assert(!__is_scoped_enum(AnIncompleteTypeArMB), ""); static_assert(!__is_scoped_enum(AnIncompleteTypeArNB), ""); } struct FinalClass final { }; template struct PotentiallyFinal { }; template struct PotentiallyFinal final { }; template<> struct PotentiallyFinal final { }; void is_final() { { int arr[T(__is_final(FinalClass))]; } { int arr[T(__is_final(PotentiallyFinal))]; } { int arr[T(__is_final(PotentiallyFinal))]; } { int arr[F(__is_final(int))]; } { int arr[F(__is_final(Union))]; } { int arr[F(__is_final(Int))]; } { int arr[F(__is_final(IntAr))]; } { int arr[F(__is_final(UnionAr))]; } { int arr[F(__is_final(Derives))]; } { int arr[F(__is_final(ClassType))]; } { int arr[F(__is_final(cvoid))]; } { int arr[F(__is_final(IntArNB))]; } { int arr[F(__is_final(HasAnonymousUnion))]; } } typedef HasVirt Polymorph; struct InheritPolymorph : Polymorph {}; void is_polymorphic() { { int arr[T(__is_polymorphic(Polymorph))]; } { int arr[T(__is_polymorphic(InheritPolymorph))]; } { int arr[F(__is_polymorphic(int))]; } { int arr[F(__is_polymorphic(Union))]; } { int arr[F(__is_polymorphic(IncompleteUnion))]; } { int arr[F(__is_polymorphic(Int))]; } { int arr[F(__is_polymorphic(IntAr))]; } { int arr[F(__is_polymorphic(UnionAr))]; } { int arr[F(__is_polymorphic(Derives))]; } { int arr[F(__is_polymorphic(ClassType))]; } { int arr[F(__is_polymorphic(Enum))]; } { int arr[F(__is_polymorphic(cvoid))]; } { int arr[F(__is_polymorphic(IntArNB))]; } } void is_integral() { int t01[T(__is_integral(bool))]; int t02[T(__is_integral(char))]; int t03[T(__is_integral(signed char))]; int t04[T(__is_integral(unsigned char))]; //int t05[T(__is_integral(char16_t))]; //int t06[T(__is_integral(char32_t))]; int t07[T(__is_integral(wchar_t))]; int t08[T(__is_integral(short))]; int t09[T(__is_integral(unsigned short))]; int t10[T(__is_integral(int))]; int t11[T(__is_integral(unsigned int))]; int t12[T(__is_integral(long))]; int t13[T(__is_integral(unsigned long))]; int t21[F(__is_integral(float))]; int t22[F(__is_integral(double))]; int t23[F(__is_integral(long double))]; int t24[F(__is_integral(Union))]; int t25[F(__is_integral(UnionAr))]; int t26[F(__is_integral(Derives))]; int t27[F(__is_integral(ClassType))]; int t28[F(__is_integral(Enum))]; int t29[F(__is_integral(void))]; int t30[F(__is_integral(cvoid))]; int t31[F(__is_integral(IntArNB))]; } void is_floating_point() { int t01[T(__is_floating_point(float))]; int t02[T(__is_floating_point(double))]; int t03[T(__is_floating_point(long double))]; int t11[F(__is_floating_point(bool))]; int t12[F(__is_floating_point(char))]; int t13[F(__is_floating_point(signed char))]; int t14[F(__is_floating_point(unsigned char))]; //int t15[F(__is_floating_point(char16_t))]; //int t16[F(__is_floating_point(char32_t))]; int t17[F(__is_floating_point(wchar_t))]; int t18[F(__is_floating_point(short))]; int t19[F(__is_floating_point(unsigned short))]; int t20[F(__is_floating_point(int))]; int t21[F(__is_floating_point(unsigned int))]; int t22[F(__is_floating_point(long))]; int t23[F(__is_floating_point(unsigned long))]; int t24[F(__is_floating_point(Union))]; int t25[F(__is_floating_point(UnionAr))]; int t26[F(__is_floating_point(Derives))]; int t27[F(__is_floating_point(ClassType))]; int t28[F(__is_floating_point(Enum))]; int t29[F(__is_floating_point(void))]; int t30[F(__is_floating_point(cvoid))]; int t31[F(__is_floating_point(IntArNB))]; } template struct AggregateTemplate { T value; }; template struct NonAggregateTemplate { T value; NonAggregateTemplate(); }; void is_aggregate() { constexpr bool TrueAfterCpp11 = __cplusplus > 201103L; constexpr bool TrueAfterCpp14 = __cplusplus > 201402L; __is_aggregate(AnIncompleteType); // expected-error {{incomplete type}} __is_aggregate(IncompleteUnion); // expected-error {{incomplete type}} // Valid since LWG3823 static_assert(__is_aggregate(AnIncompleteType[]), ""); static_assert(__is_aggregate(AnIncompleteType[1]), ""); static_assert(__is_aggregate(AnIncompleteTypeAr), ""); static_assert(__is_aggregate(AnIncompleteTypeArNB), ""); static_assert(__is_aggregate(AnIncompleteTypeArMB), ""); static_assert(!__is_aggregate(NonPOD), ""); static_assert(__is_aggregate(NonPODAr), ""); static_assert(__is_aggregate(NonPODArNB), ""); static_assert(__is_aggregate(NonPODArMB), ""); static_assert(!__is_aggregate(Enum), ""); static_assert(__is_aggregate(POD), ""); static_assert(__is_aggregate(Empty), ""); static_assert(__is_aggregate(EmptyAr), ""); static_assert(__is_aggregate(EmptyArNB), ""); static_assert(__is_aggregate(EmptyArMB), ""); static_assert(!__is_aggregate(void), ""); static_assert(!__is_aggregate(const volatile void), ""); static_assert(!__is_aggregate(int), ""); static_assert(__is_aggregate(IntAr), ""); static_assert(__is_aggregate(IntArNB), ""); static_assert(__is_aggregate(EmptyUnion), ""); static_assert(__is_aggregate(Union), ""); static_assert(__is_aggregate(Statics), ""); static_assert(__is_aggregate(HasFunc), ""); static_assert(__is_aggregate(HasOp), ""); static_assert(__is_aggregate(HasAssign), ""); static_assert(__is_aggregate(HasAnonymousUnion), ""); static_assert(__is_aggregate(Derives) == TrueAfterCpp14, ""); static_assert(__is_aggregate(DerivesAr), ""); static_assert(__is_aggregate(DerivesArNB), ""); static_assert(!__is_aggregate(HasCons), ""); #if __cplusplus >= 202002L static_assert(!__is_aggregate(HasDefaultCons), ""); #else static_assert(__is_aggregate(HasDefaultCons), ""); #endif static_assert(!__is_aggregate(HasExplicitDefaultCons), ""); static_assert(!__is_aggregate(HasInheritedCons), ""); static_assert(__is_aggregate(HasNoInheritedCons) == TrueAfterCpp14, ""); static_assert(__is_aggregate(HasCopyAssign), ""); static_assert(!__is_aggregate(NonTrivialDefault), ""); static_assert(__is_aggregate(HasDest), ""); static_assert(!__is_aggregate(HasPriv), ""); static_assert(!__is_aggregate(HasProt), ""); static_assert(__is_aggregate(HasRefAggregate), ""); static_assert(__is_aggregate(HasNonPOD), ""); static_assert(!__is_aggregate(HasVirt), ""); static_assert(__is_aggregate(VirtAr), ""); static_assert(__is_aggregate(HasInClassInit) == TrueAfterCpp11, ""); static_assert(!__is_aggregate(HasPrivateBase), ""); static_assert(!__is_aggregate(HasProtectedBase), ""); static_assert(!__is_aggregate(HasVirtBase), ""); static_assert(__is_aggregate(AggregateTemplate), ""); static_assert(!__is_aggregate(NonAggregateTemplate), ""); static_assert(__is_aggregate(Vector), ""); // Extension supported by GCC and Clang static_assert(__is_aggregate(VectorExt), ""); static_assert(__is_aggregate(ComplexInt), ""); static_assert(__is_aggregate(ComplexFloat), ""); } void is_arithmetic() { int t01[T(__is_arithmetic(float))]; int t02[T(__is_arithmetic(double))]; int t03[T(__is_arithmetic(long double))]; int t11[T(__is_arithmetic(bool))]; int t12[T(__is_arithmetic(char))]; int t13[T(__is_arithmetic(signed char))]; int t14[T(__is_arithmetic(unsigned char))]; //int t15[T(__is_arithmetic(char16_t))]; //int t16[T(__is_arithmetic(char32_t))]; int t17[T(__is_arithmetic(wchar_t))]; int t18[T(__is_arithmetic(short))]; int t19[T(__is_arithmetic(unsigned short))]; int t20[T(__is_arithmetic(int))]; int t21[T(__is_arithmetic(unsigned int))]; int t22[T(__is_arithmetic(long))]; int t23[T(__is_arithmetic(unsigned long))]; int t24[F(__is_arithmetic(Union))]; int t25[F(__is_arithmetic(UnionAr))]; int t26[F(__is_arithmetic(Derives))]; int t27[F(__is_arithmetic(ClassType))]; int t28[F(__is_arithmetic(Enum))]; int t29[F(__is_arithmetic(void))]; int t30[F(__is_arithmetic(cvoid))]; int t31[F(__is_arithmetic(IntArNB))]; } void is_complete_type() { int t01[T(__is_complete_type(float))]; int t02[T(__is_complete_type(double))]; int t03[T(__is_complete_type(long double))]; int t11[T(__is_complete_type(bool))]; int t12[T(__is_complete_type(char))]; int t13[T(__is_complete_type(signed char))]; int t14[T(__is_complete_type(unsigned char))]; //int t15[T(__is_complete_type(char16_t))]; //int t16[T(__is_complete_type(char32_t))]; int t17[T(__is_complete_type(wchar_t))]; int t18[T(__is_complete_type(short))]; int t19[T(__is_complete_type(unsigned short))]; int t20[T(__is_complete_type(int))]; int t21[T(__is_complete_type(unsigned int))]; int t22[T(__is_complete_type(long))]; int t23[T(__is_complete_type(unsigned long))]; int t24[T(__is_complete_type(ACompleteType))]; int t30[F(__is_complete_type(AnIncompleteType))]; } void is_void() { int t01[T(__is_void(void))]; int t02[T(__is_void(cvoid))]; int t10[F(__is_void(float))]; int t11[F(__is_void(double))]; int t12[F(__is_void(long double))]; int t13[F(__is_void(bool))]; int t14[F(__is_void(char))]; int t15[F(__is_void(signed char))]; int t16[F(__is_void(unsigned char))]; int t17[F(__is_void(wchar_t))]; int t18[F(__is_void(short))]; int t19[F(__is_void(unsigned short))]; int t20[F(__is_void(int))]; int t21[F(__is_void(unsigned int))]; int t22[F(__is_void(long))]; int t23[F(__is_void(unsigned long))]; int t24[F(__is_void(Union))]; int t25[F(__is_void(UnionAr))]; int t26[F(__is_void(Derives))]; int t27[F(__is_void(ClassType))]; int t28[F(__is_void(Enum))]; int t29[F(__is_void(IntArNB))]; int t30[F(__is_void(void*))]; int t31[F(__is_void(cvoid*))]; } void is_array() { int t01[T(__is_array(IntAr))]; int t02[T(__is_array(IntArNB))]; int t03[T(__is_array(UnionAr))]; int t10[F(__is_array(void))]; int t11[F(__is_array(cvoid))]; int t12[F(__is_array(float))]; int t13[F(__is_array(double))]; int t14[F(__is_array(long double))]; int t15[F(__is_array(bool))]; int t16[F(__is_array(char))]; int t17[F(__is_array(signed char))]; int t18[F(__is_array(unsigned char))]; int t19[F(__is_array(wchar_t))]; int t20[F(__is_array(short))]; int t21[F(__is_array(unsigned short))]; int t22[F(__is_array(int))]; int t23[F(__is_array(unsigned int))]; int t24[F(__is_array(long))]; int t25[F(__is_array(unsigned long))]; int t26[F(__is_array(Union))]; int t27[F(__is_array(Derives))]; int t28[F(__is_array(ClassType))]; int t29[F(__is_array(Enum))]; int t30[F(__is_array(void*))]; int t31[F(__is_array(cvoid*))]; } void is_bounded_array(int n) { static_assert(__is_bounded_array(IntAr), ""); static_assert(!__is_bounded_array(IntArNB), ""); static_assert(__is_bounded_array(UnionAr), ""); static_assert(!__is_bounded_array(void), ""); static_assert(!__is_bounded_array(cvoid), ""); static_assert(!__is_bounded_array(float), ""); static_assert(!__is_bounded_array(double), ""); static_assert(!__is_bounded_array(long double), ""); static_assert(!__is_bounded_array(bool), ""); static_assert(!__is_bounded_array(char), ""); static_assert(!__is_bounded_array(signed char), ""); static_assert(!__is_bounded_array(unsigned char), ""); static_assert(!__is_bounded_array(wchar_t), ""); static_assert(!__is_bounded_array(short), ""); static_assert(!__is_bounded_array(unsigned short), ""); static_assert(!__is_bounded_array(int), ""); static_assert(!__is_bounded_array(unsigned int), ""); static_assert(!__is_bounded_array(long), ""); static_assert(!__is_bounded_array(unsigned long), ""); static_assert(!__is_bounded_array(Union), ""); static_assert(!__is_bounded_array(Derives), ""); static_assert(!__is_bounded_array(ClassType), ""); static_assert(!__is_bounded_array(Enum), ""); static_assert(!__is_bounded_array(void *), ""); static_assert(!__is_bounded_array(cvoid *), ""); int t32[n]; (void)__is_bounded_array(decltype(t32)); // expected-error{{variable length arrays are not supported for '__is_bounded_array'}} } void is_unbounded_array(int n) { static_assert(!__is_unbounded_array(IntAr), ""); static_assert(__is_unbounded_array(IntArNB), ""); static_assert(!__is_unbounded_array(UnionAr), ""); static_assert(!__is_unbounded_array(void), ""); static_assert(!__is_unbounded_array(cvoid), ""); static_assert(!__is_unbounded_array(float), ""); static_assert(!__is_unbounded_array(double), ""); static_assert(!__is_unbounded_array(long double), ""); static_assert(!__is_unbounded_array(bool), ""); static_assert(!__is_unbounded_array(char), ""); static_assert(!__is_unbounded_array(signed char), ""); static_assert(!__is_unbounded_array(unsigned char), ""); static_assert(!__is_unbounded_array(wchar_t), ""); static_assert(!__is_unbounded_array(short), ""); static_assert(!__is_unbounded_array(unsigned short), ""); static_assert(!__is_unbounded_array(int), ""); static_assert(!__is_unbounded_array(unsigned int), ""); static_assert(!__is_unbounded_array(long), ""); static_assert(!__is_unbounded_array(unsigned long), ""); static_assert(!__is_unbounded_array(Union), ""); static_assert(!__is_unbounded_array(Derives), ""); static_assert(!__is_unbounded_array(ClassType), ""); static_assert(!__is_unbounded_array(Enum), ""); static_assert(!__is_unbounded_array(void *), ""); static_assert(!__is_unbounded_array(cvoid *), ""); int t32[n]; (void)__is_unbounded_array(decltype(t32)); // expected-error{{variable length arrays are not supported for '__is_unbounded_array'}} } void is_referenceable() { static_assert(__is_referenceable(int), ""); static_assert(__is_referenceable(const int), ""); static_assert(__is_referenceable(volatile int), ""); static_assert(__is_referenceable(const volatile int), ""); static_assert(__is_referenceable(int *), ""); static_assert(__is_referenceable(int &), ""); static_assert(__is_referenceable(int &&), ""); static_assert(__is_referenceable(int (*)()), ""); static_assert(__is_referenceable(int (&)()), ""); static_assert(__is_referenceable(int(&&)()), ""); static_assert(__is_referenceable(IntAr), ""); static_assert(__is_referenceable(IntArNB), ""); static_assert(__is_referenceable(decltype(nullptr)), ""); static_assert(__is_referenceable(Empty), ""); static_assert(__is_referenceable(Union), ""); static_assert(__is_referenceable(Derives), ""); static_assert(__is_referenceable(Enum), ""); static_assert(__is_referenceable(EnumClass), ""); static_assert(__is_referenceable(int Empty::*), ""); static_assert(__is_referenceable(int(Empty::*)()), ""); static_assert(__is_referenceable(AnIncompleteType), ""); static_assert(__is_referenceable(struct AnIncompleteType), ""); using function_type = void(int); static_assert(__is_referenceable(function_type), ""); static_assert(!__is_referenceable(void), ""); } template void tmpl_func(T&) {} template struct type_wrapper { typedef T type; typedef T* ptrtype; typedef T& reftype; }; void is_function() { int t01[T(__is_function(type_wrapper::type))]; int t02[T(__is_function(typeof(tmpl_func)))]; typedef void (*ptr_to_func_type)(void); int t10[F(__is_function(void))]; int t11[F(__is_function(cvoid))]; int t12[F(__is_function(float))]; int t13[F(__is_function(double))]; int t14[F(__is_function(long double))]; int t15[F(__is_function(bool))]; int t16[F(__is_function(char))]; int t17[F(__is_function(signed char))]; int t18[F(__is_function(unsigned char))]; int t19[F(__is_function(wchar_t))]; int t20[F(__is_function(short))]; int t21[F(__is_function(unsigned short))]; int t22[F(__is_function(int))]; int t23[F(__is_function(unsigned int))]; int t24[F(__is_function(long))]; int t25[F(__is_function(unsigned long))]; int t26[F(__is_function(Union))]; int t27[F(__is_function(Derives))]; int t28[F(__is_function(ClassType))]; int t29[F(__is_function(Enum))]; int t30[F(__is_function(void*))]; int t31[F(__is_function(cvoid*))]; int t32[F(__is_function(void(*)()))]; int t33[F(__is_function(ptr_to_func_type))]; int t34[F(__is_function(type_wrapper::ptrtype))]; int t35[F(__is_function(type_wrapper::reftype))]; } void is_reference() { int t01[T(__is_reference(int&))]; int t02[T(__is_reference(const int&))]; int t03[T(__is_reference(void *&))]; int t10[F(__is_reference(int))]; int t11[F(__is_reference(const int))]; int t12[F(__is_reference(void *))]; } void is_lvalue_reference() { int t01[T(__is_lvalue_reference(int&))]; int t02[T(__is_lvalue_reference(void *&))]; int t03[T(__is_lvalue_reference(const int&))]; int t04[T(__is_lvalue_reference(void * const &))]; int t10[F(__is_lvalue_reference(int))]; int t11[F(__is_lvalue_reference(const int))]; int t12[F(__is_lvalue_reference(void *))]; } #if __has_feature(cxx_rvalue_references) void is_rvalue_reference() { int t01[T(__is_rvalue_reference(const int&&))]; int t02[T(__is_rvalue_reference(void * const &&))]; int t10[F(__is_rvalue_reference(int&))]; int t11[F(__is_rvalue_reference(void *&))]; int t12[F(__is_rvalue_reference(const int&))]; int t13[F(__is_rvalue_reference(void * const &))]; int t14[F(__is_rvalue_reference(int))]; int t15[F(__is_rvalue_reference(const int))]; int t16[F(__is_rvalue_reference(void *))]; } #endif void is_fundamental() { int t01[T(__is_fundamental(float))]; int t02[T(__is_fundamental(double))]; int t03[T(__is_fundamental(long double))]; int t11[T(__is_fundamental(bool))]; int t12[T(__is_fundamental(char))]; int t13[T(__is_fundamental(signed char))]; int t14[T(__is_fundamental(unsigned char))]; //int t15[T(__is_fundamental(char16_t))]; //int t16[T(__is_fundamental(char32_t))]; int t17[T(__is_fundamental(wchar_t))]; int t18[T(__is_fundamental(short))]; int t19[T(__is_fundamental(unsigned short))]; int t20[T(__is_fundamental(int))]; int t21[T(__is_fundamental(unsigned int))]; int t22[T(__is_fundamental(long))]; int t23[T(__is_fundamental(unsigned long))]; int t24[T(__is_fundamental(void))]; int t25[T(__is_fundamental(cvoid))]; int t26[T(__is_fundamental(decltype(nullptr)))]; int t30[F(__is_fundamental(Union))]; int t31[F(__is_fundamental(UnionAr))]; int t32[F(__is_fundamental(Derives))]; int t33[F(__is_fundamental(ClassType))]; int t34[F(__is_fundamental(Enum))]; int t35[F(__is_fundamental(IntArNB))]; } void is_object() { int t01[T(__is_object(int))]; int t02[T(__is_object(int *))]; int t03[T(__is_object(void *))]; int t04[T(__is_object(Union))]; int t05[T(__is_object(UnionAr))]; int t06[T(__is_object(ClassType))]; int t07[T(__is_object(Enum))]; int t10[F(__is_object(type_wrapper::type))]; int t11[F(__is_object(int&))]; int t12[F(__is_object(void))]; } void is_scalar() { int t01[T(__is_scalar(float))]; int t02[T(__is_scalar(double))]; int t03[T(__is_scalar(long double))]; int t04[T(__is_scalar(bool))]; int t05[T(__is_scalar(char))]; int t06[T(__is_scalar(signed char))]; int t07[T(__is_scalar(unsigned char))]; int t08[T(__is_scalar(wchar_t))]; int t09[T(__is_scalar(short))]; int t10[T(__is_scalar(unsigned short))]; int t11[T(__is_scalar(int))]; int t12[T(__is_scalar(unsigned int))]; int t13[T(__is_scalar(long))]; int t14[T(__is_scalar(unsigned long))]; int t15[T(__is_scalar(Enum))]; int t16[T(__is_scalar(void*))]; int t17[T(__is_scalar(cvoid*))]; int t20[F(__is_scalar(void))]; int t21[F(__is_scalar(cvoid))]; int t22[F(__is_scalar(Union))]; int t23[F(__is_scalar(UnionAr))]; int t24[F(__is_scalar(Derives))]; int t25[F(__is_scalar(ClassType))]; int t26[F(__is_scalar(IntArNB))]; } struct StructWithMembers { int member; void method() {} }; void is_compound() { int t01[T(__is_compound(void*))]; int t02[T(__is_compound(cvoid*))]; int t03[T(__is_compound(void (*)()))]; int t04[T(__is_compound(int StructWithMembers::*))]; int t05[T(__is_compound(void (StructWithMembers::*)()))]; int t06[T(__is_compound(int&))]; int t07[T(__is_compound(Union))]; int t08[T(__is_compound(UnionAr))]; int t09[T(__is_compound(Derives))]; int t10[T(__is_compound(ClassType))]; int t11[T(__is_compound(IntArNB))]; int t12[T(__is_compound(Enum))]; int t20[F(__is_compound(float))]; int t21[F(__is_compound(double))]; int t22[F(__is_compound(long double))]; int t23[F(__is_compound(bool))]; int t24[F(__is_compound(char))]; int t25[F(__is_compound(signed char))]; int t26[F(__is_compound(unsigned char))]; int t27[F(__is_compound(wchar_t))]; int t28[F(__is_compound(short))]; int t29[F(__is_compound(unsigned short))]; int t30[F(__is_compound(int))]; int t31[F(__is_compound(unsigned int))]; int t32[F(__is_compound(long))]; int t33[F(__is_compound(unsigned long))]; int t34[F(__is_compound(void))]; int t35[F(__is_compound(cvoid))]; } void is_pointer() { StructWithMembers x; int t01[T(__is_pointer(void*))]; int t02[T(__is_pointer(cvoid*))]; int t03[T(__is_pointer(cvoid*))]; int t04[T(__is_pointer(char*))]; int t05[T(__is_pointer(int*))]; int t06[T(__is_pointer(int**))]; int t07[T(__is_pointer(ClassType*))]; int t08[T(__is_pointer(Derives*))]; int t09[T(__is_pointer(Enum*))]; int t10[T(__is_pointer(IntArNB*))]; int t11[T(__is_pointer(Union*))]; int t12[T(__is_pointer(UnionAr*))]; int t13[T(__is_pointer(StructWithMembers*))]; int t14[T(__is_pointer(void (*)()))]; int t20[F(__is_pointer(void))]; int t21[F(__is_pointer(cvoid))]; int t22[F(__is_pointer(cvoid))]; int t23[F(__is_pointer(char))]; int t24[F(__is_pointer(int))]; int t25[F(__is_pointer(int))]; int t26[F(__is_pointer(ClassType))]; int t27[F(__is_pointer(Derives))]; int t28[F(__is_pointer(Enum))]; int t29[F(__is_pointer(IntArNB))]; int t30[F(__is_pointer(Union))]; int t31[F(__is_pointer(UnionAr))]; int t32[F(__is_pointer(StructWithMembers))]; int t33[F(__is_pointer(int StructWithMembers::*))]; int t34[F(__is_pointer(void (StructWithMembers::*) ()))]; } void is_null_pointer() { StructWithMembers x; static_assert(__is_nullptr(decltype(nullptr)), ""); static_assert(!__is_nullptr(void *), ""); static_assert(!__is_nullptr(cvoid *), ""); static_assert(!__is_nullptr(cvoid *), ""); static_assert(!__is_nullptr(char *), ""); static_assert(!__is_nullptr(int *), ""); static_assert(!__is_nullptr(int **), ""); static_assert(!__is_nullptr(ClassType *), ""); static_assert(!__is_nullptr(Derives *), ""); static_assert(!__is_nullptr(Enum *), ""); static_assert(!__is_nullptr(IntArNB *), ""); static_assert(!__is_nullptr(Union *), ""); static_assert(!__is_nullptr(UnionAr *), ""); static_assert(!__is_nullptr(StructWithMembers *), ""); static_assert(!__is_nullptr(void (*)()), ""); static_assert(!__is_nullptr(void), ""); static_assert(!__is_nullptr(cvoid), ""); static_assert(!__is_nullptr(cvoid), ""); static_assert(!__is_nullptr(char), ""); static_assert(!__is_nullptr(int), ""); static_assert(!__is_nullptr(int), ""); static_assert(!__is_nullptr(ClassType), ""); static_assert(!__is_nullptr(Derives), ""); static_assert(!__is_nullptr(Enum), ""); static_assert(!__is_nullptr(IntArNB), ""); static_assert(!__is_nullptr(Union), ""); static_assert(!__is_nullptr(UnionAr), ""); static_assert(!__is_nullptr(StructWithMembers), ""); static_assert(!__is_nullptr(int StructWithMembers::*), ""); static_assert(!__is_nullptr(void(StructWithMembers::*)()), ""); } void is_member_object_pointer() { StructWithMembers x; int t01[T(__is_member_object_pointer(int StructWithMembers::*))]; int t10[F(__is_member_object_pointer(void (StructWithMembers::*) ()))]; int t11[F(__is_member_object_pointer(void*))]; int t12[F(__is_member_object_pointer(cvoid*))]; int t13[F(__is_member_object_pointer(cvoid*))]; int t14[F(__is_member_object_pointer(char*))]; int t15[F(__is_member_object_pointer(int*))]; int t16[F(__is_member_object_pointer(int**))]; int t17[F(__is_member_object_pointer(ClassType*))]; int t18[F(__is_member_object_pointer(Derives*))]; int t19[F(__is_member_object_pointer(Enum*))]; int t20[F(__is_member_object_pointer(IntArNB*))]; int t21[F(__is_member_object_pointer(Union*))]; int t22[F(__is_member_object_pointer(UnionAr*))]; int t23[F(__is_member_object_pointer(StructWithMembers*))]; int t24[F(__is_member_object_pointer(void))]; int t25[F(__is_member_object_pointer(cvoid))]; int t26[F(__is_member_object_pointer(cvoid))]; int t27[F(__is_member_object_pointer(char))]; int t28[F(__is_member_object_pointer(int))]; int t29[F(__is_member_object_pointer(int))]; int t30[F(__is_member_object_pointer(ClassType))]; int t31[F(__is_member_object_pointer(Derives))]; int t32[F(__is_member_object_pointer(Enum))]; int t33[F(__is_member_object_pointer(IntArNB))]; int t34[F(__is_member_object_pointer(Union))]; int t35[F(__is_member_object_pointer(UnionAr))]; int t36[F(__is_member_object_pointer(StructWithMembers))]; int t37[F(__is_member_object_pointer(void (*)()))]; } void is_member_function_pointer() { StructWithMembers x; int t01[T(__is_member_function_pointer(void (StructWithMembers::*) ()))]; int t10[F(__is_member_function_pointer(int StructWithMembers::*))]; int t11[F(__is_member_function_pointer(void*))]; int t12[F(__is_member_function_pointer(cvoid*))]; int t13[F(__is_member_function_pointer(cvoid*))]; int t14[F(__is_member_function_pointer(char*))]; int t15[F(__is_member_function_pointer(int*))]; int t16[F(__is_member_function_pointer(int**))]; int t17[F(__is_member_function_pointer(ClassType*))]; int t18[F(__is_member_function_pointer(Derives*))]; int t19[F(__is_member_function_pointer(Enum*))]; int t20[F(__is_member_function_pointer(IntArNB*))]; int t21[F(__is_member_function_pointer(Union*))]; int t22[F(__is_member_function_pointer(UnionAr*))]; int t23[F(__is_member_function_pointer(StructWithMembers*))]; int t24[F(__is_member_function_pointer(void))]; int t25[F(__is_member_function_pointer(cvoid))]; int t26[F(__is_member_function_pointer(cvoid))]; int t27[F(__is_member_function_pointer(char))]; int t28[F(__is_member_function_pointer(int))]; int t29[F(__is_member_function_pointer(int))]; int t30[F(__is_member_function_pointer(ClassType))]; int t31[F(__is_member_function_pointer(Derives))]; int t32[F(__is_member_function_pointer(Enum))]; int t33[F(__is_member_function_pointer(IntArNB))]; int t34[F(__is_member_function_pointer(Union))]; int t35[F(__is_member_function_pointer(UnionAr))]; int t36[F(__is_member_function_pointer(StructWithMembers))]; int t37[F(__is_member_function_pointer(void (*)()))]; } void is_member_pointer() { StructWithMembers x; int t01[T(__is_member_pointer(int StructWithMembers::*))]; int t02[T(__is_member_pointer(void (StructWithMembers::*) ()))]; int t10[F(__is_member_pointer(void*))]; int t11[F(__is_member_pointer(cvoid*))]; int t12[F(__is_member_pointer(cvoid*))]; int t13[F(__is_member_pointer(char*))]; int t14[F(__is_member_pointer(int*))]; int t15[F(__is_member_pointer(int**))]; int t16[F(__is_member_pointer(ClassType*))]; int t17[F(__is_member_pointer(Derives*))]; int t18[F(__is_member_pointer(Enum*))]; int t19[F(__is_member_pointer(IntArNB*))]; int t20[F(__is_member_pointer(Union*))]; int t21[F(__is_member_pointer(UnionAr*))]; int t22[F(__is_member_pointer(StructWithMembers*))]; int t23[F(__is_member_pointer(void))]; int t24[F(__is_member_pointer(cvoid))]; int t25[F(__is_member_pointer(cvoid))]; int t26[F(__is_member_pointer(char))]; int t27[F(__is_member_pointer(int))]; int t28[F(__is_member_pointer(int))]; int t29[F(__is_member_pointer(ClassType))]; int t30[F(__is_member_pointer(Derives))]; int t31[F(__is_member_pointer(Enum))]; int t32[F(__is_member_pointer(IntArNB))]; int t33[F(__is_member_pointer(Union))]; int t34[F(__is_member_pointer(UnionAr))]; int t35[F(__is_member_pointer(StructWithMembers))]; int t36[F(__is_member_pointer(void (*)()))]; } void is_const() { int t01[T(__is_const(cvoid))]; int t02[T(__is_const(const char))]; int t03[T(__is_const(const int))]; int t04[T(__is_const(const long))]; int t05[T(__is_const(const short))]; int t06[T(__is_const(const signed char))]; int t07[T(__is_const(const wchar_t))]; int t08[T(__is_const(const bool))]; int t09[T(__is_const(const float))]; int t10[T(__is_const(const double))]; int t11[T(__is_const(const long double))]; int t12[T(__is_const(const unsigned char))]; int t13[T(__is_const(const unsigned int))]; int t14[T(__is_const(const unsigned long long))]; int t15[T(__is_const(const unsigned long))]; int t16[T(__is_const(const unsigned short))]; int t17[T(__is_const(const void))]; int t18[T(__is_const(const ClassType))]; int t19[T(__is_const(const Derives))]; int t20[T(__is_const(const Enum))]; int t21[T(__is_const(const IntArNB))]; int t22[T(__is_const(const Union))]; int t23[T(__is_const(const UnionAr))]; int t30[F(__is_const(char))]; int t31[F(__is_const(int))]; int t32[F(__is_const(long))]; int t33[F(__is_const(short))]; int t34[F(__is_const(signed char))]; int t35[F(__is_const(wchar_t))]; int t36[F(__is_const(bool))]; int t37[F(__is_const(float))]; int t38[F(__is_const(double))]; int t39[F(__is_const(long double))]; int t40[F(__is_const(unsigned char))]; int t41[F(__is_const(unsigned int))]; int t42[F(__is_const(unsigned long long))]; int t43[F(__is_const(unsigned long))]; int t44[F(__is_const(unsigned short))]; int t45[F(__is_const(void))]; int t46[F(__is_const(ClassType))]; int t47[F(__is_const(Derives))]; int t48[F(__is_const(Enum))]; int t49[F(__is_const(IntArNB))]; int t50[F(__is_const(Union))]; int t51[F(__is_const(UnionAr))]; } void is_volatile() { int t02[T(__is_volatile(volatile char))]; int t03[T(__is_volatile(volatile int))]; int t04[T(__is_volatile(volatile long))]; int t05[T(__is_volatile(volatile short))]; int t06[T(__is_volatile(volatile signed char))]; int t07[T(__is_volatile(volatile wchar_t))]; int t08[T(__is_volatile(volatile bool))]; int t09[T(__is_volatile(volatile float))]; int t10[T(__is_volatile(volatile double))]; int t11[T(__is_volatile(volatile long double))]; int t12[T(__is_volatile(volatile unsigned char))]; int t13[T(__is_volatile(volatile unsigned int))]; int t14[T(__is_volatile(volatile unsigned long long))]; int t15[T(__is_volatile(volatile unsigned long))]; int t16[T(__is_volatile(volatile unsigned short))]; int t17[T(__is_volatile(volatile void))]; int t18[T(__is_volatile(volatile ClassType))]; int t19[T(__is_volatile(volatile Derives))]; int t20[T(__is_volatile(volatile Enum))]; int t21[T(__is_volatile(volatile IntArNB))]; int t22[T(__is_volatile(volatile Union))]; int t23[T(__is_volatile(volatile UnionAr))]; int t30[F(__is_volatile(char))]; int t31[F(__is_volatile(int))]; int t32[F(__is_volatile(long))]; int t33[F(__is_volatile(short))]; int t34[F(__is_volatile(signed char))]; int t35[F(__is_volatile(wchar_t))]; int t36[F(__is_volatile(bool))]; int t37[F(__is_volatile(float))]; int t38[F(__is_volatile(double))]; int t39[F(__is_volatile(long double))]; int t40[F(__is_volatile(unsigned char))]; int t41[F(__is_volatile(unsigned int))]; int t42[F(__is_volatile(unsigned long long))]; int t43[F(__is_volatile(unsigned long))]; int t44[F(__is_volatile(unsigned short))]; int t45[F(__is_volatile(void))]; int t46[F(__is_volatile(ClassType))]; int t47[F(__is_volatile(Derives))]; int t48[F(__is_volatile(Enum))]; int t49[F(__is_volatile(IntArNB))]; int t50[F(__is_volatile(Union))]; int t51[F(__is_volatile(UnionAr))]; } struct TrivialStruct { int member; }; struct NonTrivialStruct { int member; NonTrivialStruct() { member = 0; } }; struct SuperNonTrivialStruct { SuperNonTrivialStruct() { } ~SuperNonTrivialStruct() { } }; struct NonTCStruct { NonTCStruct(const NonTCStruct&) {} }; struct AllDefaulted { AllDefaulted() = default; AllDefaulted(const AllDefaulted &) = default; AllDefaulted(AllDefaulted &&) = default; AllDefaulted &operator=(const AllDefaulted &) = default; AllDefaulted &operator=(AllDefaulted &&) = default; ~AllDefaulted() = default; }; struct NoDefaultMoveAssignDueToUDCopyCtor { NoDefaultMoveAssignDueToUDCopyCtor(const NoDefaultMoveAssignDueToUDCopyCtor&); }; struct NoDefaultMoveAssignDueToUDCopyAssign { NoDefaultMoveAssignDueToUDCopyAssign& operator=( const NoDefaultMoveAssignDueToUDCopyAssign&); }; struct NoDefaultMoveAssignDueToDtor { ~NoDefaultMoveAssignDueToDtor(); }; struct AllDeleted { AllDeleted() = delete; AllDeleted(const AllDeleted &) = delete; AllDeleted(AllDeleted &&) = delete; AllDeleted &operator=(const AllDeleted &) = delete; AllDeleted &operator=(AllDeleted &&) = delete; ~AllDeleted() = delete; }; struct ExtDefaulted { ExtDefaulted(); ExtDefaulted(const ExtDefaulted &); ExtDefaulted(ExtDefaulted &&); ExtDefaulted &operator=(const ExtDefaulted &); ExtDefaulted &operator=(ExtDefaulted &&); ~ExtDefaulted(); }; // Despite being defaulted, these functions are not trivial. ExtDefaulted::ExtDefaulted() = default; ExtDefaulted::ExtDefaulted(const ExtDefaulted &) = default; ExtDefaulted::ExtDefaulted(ExtDefaulted &&) = default; ExtDefaulted &ExtDefaulted::operator=(const ExtDefaulted &) = default; ExtDefaulted &ExtDefaulted::operator=(ExtDefaulted &&) = default; ExtDefaulted::~ExtDefaulted() = default; void is_trivial2() { int t01[T(__is_trivial(char))]; int t02[T(__is_trivial(int))]; int t03[T(__is_trivial(long))]; int t04[T(__is_trivial(short))]; int t05[T(__is_trivial(signed char))]; int t06[T(__is_trivial(wchar_t))]; int t07[T(__is_trivial(bool))]; int t08[T(__is_trivial(float))]; int t09[T(__is_trivial(double))]; int t10[T(__is_trivial(long double))]; int t11[T(__is_trivial(unsigned char))]; int t12[T(__is_trivial(unsigned int))]; int t13[T(__is_trivial(unsigned long long))]; int t14[T(__is_trivial(unsigned long))]; int t15[T(__is_trivial(unsigned short))]; int t16[T(__is_trivial(ClassType))]; int t17[T(__is_trivial(Derives))]; int t18[T(__is_trivial(Enum))]; int t19[T(__is_trivial(IntAr))]; int t20[T(__is_trivial(Union))]; int t21[T(__is_trivial(UnionAr))]; int t22[T(__is_trivial(TrivialStruct))]; int t23[T(__is_trivial(AllDefaulted))]; int t24[T(__is_trivial(AllDeleted))]; int t30[F(__is_trivial(void))]; int t31[F(__is_trivial(NonTrivialStruct))]; int t32[F(__is_trivial(SuperNonTrivialStruct))]; int t33[F(__is_trivial(NonTCStruct))]; int t34[F(__is_trivial(ExtDefaulted))]; int t40[T(__is_trivial(ACompleteType))]; int t41[F(__is_trivial(AnIncompleteType))]; // expected-error {{incomplete type}} int t42[F(__is_trivial(AnIncompleteType[]))]; // expected-error {{incomplete type}} int t43[F(__is_trivial(AnIncompleteType[1]))]; // expected-error {{incomplete type}} int t44[F(__is_trivial(void))]; int t45[F(__is_trivial(const volatile void))]; } void is_trivially_copyable2() { int t01[T(__is_trivially_copyable(char))]; int t02[T(__is_trivially_copyable(int))]; int t03[T(__is_trivially_copyable(long))]; int t04[T(__is_trivially_copyable(short))]; int t05[T(__is_trivially_copyable(signed char))]; int t06[T(__is_trivially_copyable(wchar_t))]; int t07[T(__is_trivially_copyable(bool))]; int t08[T(__is_trivially_copyable(float))]; int t09[T(__is_trivially_copyable(double))]; int t10[T(__is_trivially_copyable(long double))]; int t11[T(__is_trivially_copyable(unsigned char))]; int t12[T(__is_trivially_copyable(unsigned int))]; int t13[T(__is_trivially_copyable(unsigned long long))]; int t14[T(__is_trivially_copyable(unsigned long))]; int t15[T(__is_trivially_copyable(unsigned short))]; int t16[T(__is_trivially_copyable(ClassType))]; int t17[T(__is_trivially_copyable(Derives))]; int t18[T(__is_trivially_copyable(Enum))]; int t19[T(__is_trivially_copyable(IntAr))]; int t20[T(__is_trivially_copyable(Union))]; int t21[T(__is_trivially_copyable(UnionAr))]; int t22[T(__is_trivially_copyable(TrivialStruct))]; int t23[T(__is_trivially_copyable(NonTrivialStruct))]; int t24[T(__is_trivially_copyable(AllDefaulted))]; int t25[T(__is_trivially_copyable(AllDeleted))]; int t30[F(__is_trivially_copyable(void))]; int t31[F(__is_trivially_copyable(SuperNonTrivialStruct))]; int t32[F(__is_trivially_copyable(NonTCStruct))]; int t33[F(__is_trivially_copyable(ExtDefaulted))]; int t34[T(__is_trivially_copyable(const int))]; int t35[T(__is_trivially_copyable(volatile int))]; int t40[T(__is_trivially_copyable(ACompleteType))]; int t41[F(__is_trivially_copyable(AnIncompleteType))]; // expected-error {{incomplete type}} int t42[F(__is_trivially_copyable(AnIncompleteType[]))]; // expected-error {{incomplete type}} int t43[F(__is_trivially_copyable(AnIncompleteType[1]))]; // expected-error {{incomplete type}} int t44[F(__is_trivially_copyable(void))]; int t45[F(__is_trivially_copyable(const volatile void))]; } struct CStruct { int one; int two; }; struct CEmptyStruct {}; struct CppEmptyStruct : CStruct {}; struct CppStructStandard : CEmptyStruct { int three; int four; }; struct CppStructNonStandardByBase : CStruct { int three; int four; }; struct CppStructNonStandardByVirt : CStruct { virtual void method() {} }; struct CppStructNonStandardByMemb : CStruct { CppStructNonStandardByVirt member; }; struct CppStructNonStandardByProt : CStruct { int five; protected: int six; }; struct CppStructNonStandardByVirtBase : virtual CStruct { }; struct CppStructNonStandardBySameBase : CEmptyStruct { CEmptyStruct member; }; struct CppStructNonStandardBy2ndVirtBase : CEmptyStruct { CEmptyStruct member; }; void is_standard_layout() { typedef const int ConstInt; typedef ConstInt ConstIntAr[4]; typedef CppStructStandard CppStructStandardAr[4]; int t01[T(__is_standard_layout(int))]; int t02[T(__is_standard_layout(ConstInt))]; int t03[T(__is_standard_layout(ConstIntAr))]; int t04[T(__is_standard_layout(CStruct))]; int t05[T(__is_standard_layout(CppStructStandard))]; int t06[T(__is_standard_layout(CppStructStandardAr))]; int t07[T(__is_standard_layout(Vector))]; int t08[T(__is_standard_layout(VectorExt))]; typedef CppStructNonStandardByBase CppStructNonStandardByBaseAr[4]; int t10[F(__is_standard_layout(CppStructNonStandardByVirt))]; int t11[F(__is_standard_layout(CppStructNonStandardByMemb))]; int t12[F(__is_standard_layout(CppStructNonStandardByProt))]; int t13[F(__is_standard_layout(CppStructNonStandardByVirtBase))]; int t14[F(__is_standard_layout(CppStructNonStandardByBase))]; int t15[F(__is_standard_layout(CppStructNonStandardByBaseAr))]; int t16[F(__is_standard_layout(CppStructNonStandardBySameBase))]; int t17[F(__is_standard_layout(CppStructNonStandardBy2ndVirtBase))]; int t40[T(__is_standard_layout(ACompleteType))]; int t41[F(__is_standard_layout(AnIncompleteType))]; // expected-error {{incomplete type}} int t42[F(__is_standard_layout(AnIncompleteType[]))]; // expected-error {{incomplete type}} int t43[F(__is_standard_layout(AnIncompleteType[1]))]; // expected-error {{incomplete type}} int t44[F(__is_standard_layout(void))]; int t45[F(__is_standard_layout(const volatile void))]; struct HasAnonEmptyBitfield { int : 0; }; struct HasAnonBitfield { int : 4; }; struct DerivesFromBitfield : HasAnonBitfield {}; struct DerivesFromBitfieldWithBitfield : HasAnonBitfield { int : 5; }; struct DerivesFromBitfieldTwice : DerivesFromBitfield, HasAnonEmptyBitfield {}; int t50[T(__is_standard_layout(HasAnonEmptyBitfield))]; int t51[T(__is_standard_layout(HasAnonBitfield))]; int t52[T(__is_standard_layout(DerivesFromBitfield))]; int t53[F(__is_standard_layout(DerivesFromBitfieldWithBitfield))]; int t54[F(__is_standard_layout(DerivesFromBitfieldTwice))]; struct Empty {}; struct HasEmptyBase : Empty {}; struct HoldsEmptyBase { Empty e; }; struct HasRepeatedEmptyBase : Empty, HasEmptyBase {}; // expected-warning {{inaccessible}} struct HasEmptyBaseAsMember : Empty { Empty e; }; struct HasEmptyBaseAsSubobjectOfMember1 : Empty { HoldsEmptyBase e; }; struct HasEmptyBaseAsSubobjectOfMember2 : Empty { HasEmptyBase e; }; struct HasEmptyBaseAsSubobjectOfMember3 : Empty { HoldsEmptyBase e[2]; }; struct HasEmptyIndirectBaseAsMember : HasEmptyBase { Empty e; }; struct HasEmptyIndirectBaseAsSecondMember : HasEmptyBase { int n; Empty e; }; struct HasEmptyIndirectBaseAfterBitfield : HasEmptyBase { int : 4; Empty e; }; int t60[T(__is_standard_layout(Empty))]; int t61[T(__is_standard_layout(HasEmptyBase))]; int t62[F(__is_standard_layout(HasRepeatedEmptyBase))]; int t63[F(__is_standard_layout(HasEmptyBaseAsMember))]; int t64[F(__is_standard_layout(HasEmptyBaseAsSubobjectOfMember1))]; int t65[T(__is_standard_layout(HasEmptyBaseAsSubobjectOfMember2))]; // FIXME: standard bug? int t66[F(__is_standard_layout(HasEmptyBaseAsSubobjectOfMember3))]; int t67[F(__is_standard_layout(HasEmptyIndirectBaseAsMember))]; int t68[T(__is_standard_layout(HasEmptyIndirectBaseAsSecondMember))]; int t69[F(__is_standard_layout(HasEmptyIndirectBaseAfterBitfield))]; // FIXME: standard bug? struct StructWithEmptyFields { int n; HoldsEmptyBase e[3]; }; union UnionWithEmptyFields { int n; HoldsEmptyBase e[3]; }; struct HasEmptyIndirectBaseAsSecondStructMember : HasEmptyBase { StructWithEmptyFields u; }; struct HasEmptyIndirectBaseAsSecondUnionMember : HasEmptyBase { UnionWithEmptyFields u; }; int t70[T(__is_standard_layout(HasEmptyIndirectBaseAsSecondStructMember))]; int t71[F(__is_standard_layout(HasEmptyIndirectBaseAsSecondUnionMember))]; } void is_signed() { //int t01[T(__is_signed(char))]; int t02[T(__is_signed(int))]; int t03[T(__is_signed(long))]; int t04[T(__is_signed(short))]; int t05[T(__is_signed(signed char))]; int t06[T(__is_signed(wchar_t))]; int t07[T(__is_signed(float))]; int t08[T(__is_signed(double))]; int t09[T(__is_signed(long double))]; int t13[F(__is_signed(bool))]; int t14[F(__is_signed(cvoid))]; int t15[F(__is_signed(unsigned char))]; int t16[F(__is_signed(unsigned int))]; int t17[F(__is_signed(unsigned long long))]; int t18[F(__is_signed(unsigned long))]; int t19[F(__is_signed(unsigned short))]; int t20[F(__is_signed(void))]; int t21[F(__is_signed(ClassType))]; int t22[F(__is_signed(Derives))]; int t23[F(__is_signed(Enum))]; int t24[F(__is_signed(SignedEnum))]; int t25[F(__is_signed(IntArNB))]; int t26[F(__is_signed(Union))]; int t27[F(__is_signed(UnionAr))]; int t28[F(__is_signed(UnsignedEnum))]; } void is_unsigned() { int t01[T(__is_unsigned(bool))]; int t02[T(__is_unsigned(unsigned char))]; int t03[T(__is_unsigned(unsigned short))]; int t04[T(__is_unsigned(unsigned int))]; int t05[T(__is_unsigned(unsigned long))]; int t06[T(__is_unsigned(unsigned long long))]; int t10[F(__is_unsigned(void))]; int t11[F(__is_unsigned(cvoid))]; int t12[F(__is_unsigned(float))]; int t13[F(__is_unsigned(double))]; int t14[F(__is_unsigned(long double))]; int t16[F(__is_unsigned(char))]; int t17[F(__is_unsigned(signed char))]; int t18[F(__is_unsigned(wchar_t))]; int t19[F(__is_unsigned(short))]; int t20[F(__is_unsigned(int))]; int t21[F(__is_unsigned(long))]; int t22[F(__is_unsigned(Union))]; int t23[F(__is_unsigned(UnionAr))]; int t24[F(__is_unsigned(Derives))]; int t25[F(__is_unsigned(ClassType))]; int t26[F(__is_unsigned(IntArNB))]; int t27[F(__is_unsigned(Enum))]; int t28[F(__is_unsigned(UnsignedEnum))]; int t29[F(__is_unsigned(SignedEnum))]; } typedef Int& IntRef; typedef const IntAr ConstIntAr; typedef ConstIntAr ConstIntArAr[4]; struct HasCopy { HasCopy(HasCopy& cp); }; struct HasMove { HasMove(HasMove&& cp); }; struct HasTemplateCons { HasVirt Annoying; template HasTemplateCons(const T&); }; void has_trivial_default_constructor() { { int arr[T(__has_trivial_constructor(Int))]; } { int arr[T(__has_trivial_constructor(IntAr))]; } { int arr[T(__has_trivial_constructor(Union))]; } { int arr[T(__has_trivial_constructor(UnionAr))]; } { int arr[T(__has_trivial_constructor(POD))]; } { int arr[T(__has_trivial_constructor(Derives))]; } { int arr[T(__has_trivial_constructor(DerivesAr))]; } { int arr[T(__has_trivial_constructor(ConstIntAr))]; } { int arr[T(__has_trivial_constructor(ConstIntArAr))]; } { int arr[T(__has_trivial_constructor(HasDest))]; } { int arr[T(__has_trivial_constructor(HasPriv))]; } { int arr[T(__has_trivial_constructor(HasCopyAssign))]; } { int arr[T(__has_trivial_constructor(HasMoveAssign))]; } { int arr[T(__has_trivial_constructor(const Int))]; } { int arr[T(__has_trivial_constructor(AllDefaulted))]; } { int arr[T(__has_trivial_constructor(AllDeleted))]; } { int arr[T(__has_trivial_constructor(ACompleteType[]))]; } { int arr[F(__has_trivial_constructor(AnIncompleteType[]))]; } // expected-error {{incomplete type}} { int arr[F(__has_trivial_constructor(HasCons))]; } { int arr[F(__has_trivial_constructor(HasRef))]; } { int arr[F(__has_trivial_constructor(HasCopy))]; } { int arr[F(__has_trivial_constructor(IntRef))]; } { int arr[F(__has_trivial_constructor(VirtAr))]; } { int arr[F(__has_trivial_constructor(void))]; } { int arr[F(__has_trivial_constructor(cvoid))]; } { int arr[F(__has_trivial_constructor(HasTemplateCons))]; } { int arr[F(__has_trivial_constructor(AllPrivate))]; } { int arr[F(__has_trivial_constructor(ExtDefaulted))]; } } void has_trivial_move_constructor() { // n3376 12.8 [class.copy]/12 // A copy/move constructor for class X is trivial if it is not // user-provided, its declared parameter type is the same as // if it had been implicitly declared, and if // - class X has no virtual functions (10.3) and no virtual // base classes (10.1), and // - the constructor selected to copy/move each direct base // class subobject is trivial, and // - for each non-static data member of X that is of class // type (or array thereof), the constructor selected // to copy/move that member is trivial; // otherwise the copy/move constructor is non-trivial. { int arr[T(__has_trivial_move_constructor(POD))]; } { int arr[T(__has_trivial_move_constructor(Union))]; } { int arr[T(__has_trivial_move_constructor(HasCons))]; } { int arr[T(__has_trivial_move_constructor(HasStaticMemberMoveCtor))]; } { int arr[T(__has_trivial_move_constructor(AllDeleted))]; } { int arr[T(__has_trivial_move_constructor(ACompleteType[]))]; } { int arr[F(__has_trivial_move_constructor(AnIncompleteType[]))]; } // expected-error {{incomplete type}} { int arr[F(__has_trivial_move_constructor(HasVirt))]; } { int arr[F(__has_trivial_move_constructor(DerivesVirt))]; } { int arr[F(__has_trivial_move_constructor(HasMoveCtor))]; } { int arr[F(__has_trivial_move_constructor(DerivesHasMoveCtor))]; } { int arr[F(__has_trivial_move_constructor(HasMemberMoveCtor))]; } } void has_trivial_copy_constructor() { { int arr[T(__has_trivial_copy(Int))]; } { int arr[T(__has_trivial_copy(IntAr))]; } { int arr[T(__has_trivial_copy(Union))]; } { int arr[T(__has_trivial_copy(UnionAr))]; } { int arr[T(__has_trivial_copy(POD))]; } { int arr[T(__has_trivial_copy(Derives))]; } { int arr[T(__has_trivial_copy(ConstIntAr))]; } { int arr[T(__has_trivial_copy(ConstIntArAr))]; } { int arr[T(__has_trivial_copy(HasDest))]; } { int arr[T(__has_trivial_copy(HasPriv))]; } { int arr[T(__has_trivial_copy(HasCons))]; } { int arr[T(__has_trivial_copy(HasRef))]; } { int arr[T(__has_trivial_copy(HasMove))]; } { int arr[T(__has_trivial_copy(IntRef))]; } { int arr[T(__has_trivial_copy(HasCopyAssign))]; } { int arr[T(__has_trivial_copy(HasMoveAssign))]; } { int arr[T(__has_trivial_copy(const Int))]; } { int arr[T(__has_trivial_copy(AllDefaulted))]; } { int arr[T(__has_trivial_copy(AllDeleted))]; } { int arr[T(__has_trivial_copy(DerivesAr))]; } { int arr[T(__has_trivial_copy(DerivesHasRef))]; } { int arr[T(__has_trivial_copy(ACompleteType[]))]; } { int arr[F(__has_trivial_copy(AnIncompleteType[]))]; } // expected-error {{incomplete type}} { int arr[F(__has_trivial_copy(HasCopy))]; } { int arr[F(__has_trivial_copy(HasTemplateCons))]; } { int arr[F(__has_trivial_copy(VirtAr))]; } { int arr[F(__has_trivial_copy(void))]; } { int arr[F(__has_trivial_copy(cvoid))]; } { int arr[F(__has_trivial_copy(AllPrivate))]; } { int arr[F(__has_trivial_copy(ExtDefaulted))]; } } void has_trivial_copy_assignment() { { int arr[T(__has_trivial_assign(Int))]; } { int arr[T(__has_trivial_assign(IntAr))]; } { int arr[T(__has_trivial_assign(Union))]; } { int arr[T(__has_trivial_assign(UnionAr))]; } { int arr[T(__has_trivial_assign(POD))]; } { int arr[T(__has_trivial_assign(Derives))]; } { int arr[T(__has_trivial_assign(HasDest))]; } { int arr[T(__has_trivial_assign(HasPriv))]; } { int arr[T(__has_trivial_assign(HasCons))]; } { int arr[T(__has_trivial_assign(HasRef))]; } { int arr[T(__has_trivial_assign(HasCopy))]; } { int arr[T(__has_trivial_assign(HasMove))]; } { int arr[T(__has_trivial_assign(HasMoveAssign))]; } { int arr[T(__has_trivial_assign(AllDefaulted))]; } { int arr[T(__has_trivial_assign(AllDeleted))]; } { int arr[T(__has_trivial_assign(DerivesAr))]; } { int arr[T(__has_trivial_assign(DerivesHasRef))]; } { int arr[T(__has_trivial_assign(ACompleteType[]))]; } { int arr[F(__has_trivial_assign(AnIncompleteType[]))]; } // expected-error {{incomplete type}} { int arr[F(__has_trivial_assign(IntRef))]; } { int arr[F(__has_trivial_assign(HasCopyAssign))]; } { int arr[F(__has_trivial_assign(const Int))]; } { int arr[F(__has_trivial_assign(ConstIntAr))]; } { int arr[F(__has_trivial_assign(ConstIntArAr))]; } { int arr[F(__has_trivial_assign(VirtAr))]; } { int arr[F(__has_trivial_assign(void))]; } { int arr[F(__has_trivial_assign(cvoid))]; } { int arr[F(__has_trivial_assign(AllPrivate))]; } { int arr[F(__has_trivial_assign(ExtDefaulted))]; } } void has_trivial_destructor() { { int arr[T(__has_trivial_destructor(Int))]; } { int arr[T(__has_trivial_destructor(IntAr))]; } { int arr[T(__has_trivial_destructor(Union))]; } { int arr[T(__has_trivial_destructor(UnionAr))]; } { int arr[T(__has_trivial_destructor(POD))]; } { int arr[T(__has_trivial_destructor(Derives))]; } { int arr[T(__has_trivial_destructor(ConstIntAr))]; } { int arr[T(__has_trivial_destructor(ConstIntArAr))]; } { int arr[T(__has_trivial_destructor(HasPriv))]; } { int arr[T(__has_trivial_destructor(HasCons))]; } { int arr[T(__has_trivial_destructor(HasRef))]; } { int arr[T(__has_trivial_destructor(HasCopy))]; } { int arr[T(__has_trivial_destructor(HasMove))]; } { int arr[T(__has_trivial_destructor(IntRef))]; } { int arr[T(__has_trivial_destructor(HasCopyAssign))]; } { int arr[T(__has_trivial_destructor(HasMoveAssign))]; } { int arr[T(__has_trivial_destructor(const Int))]; } { int arr[T(__has_trivial_destructor(DerivesAr))]; } { int arr[T(__has_trivial_destructor(VirtAr))]; } { int arr[T(__has_trivial_destructor(AllDefaulted))]; } { int arr[T(__has_trivial_destructor(AllDeleted))]; } { int arr[T(__has_trivial_destructor(DerivesHasRef))]; } { int arr[T(__has_trivial_destructor(ACompleteType[]))]; } { int arr[F(__has_trivial_destructor(HasDest))]; } { int arr[F(__has_trivial_destructor(AnIncompleteType[]))]; } // expected-error {{incomplete type}} { int arr[F(__has_trivial_destructor(void))]; } { int arr[F(__has_trivial_destructor(cvoid))]; } { int arr[F(__has_trivial_destructor(AllPrivate))]; } { int arr[F(__has_trivial_destructor(ExtDefaulted))]; } } struct A { ~A() {} }; template struct B : A { }; void f() { { int arr[F(__has_trivial_destructor(A))]; } { int arr[F(__has_trivial_destructor(B))]; } } class PR11110 { template int operator=( int ); int operator=(PR11110); }; class UsingAssign; class UsingAssignBase { protected: UsingAssign &operator=(const UsingAssign&) throw(); }; class UsingAssign : public UsingAssignBase { public: using UsingAssignBase::operator=; }; void has_nothrow_assign() { { int arr[T(__has_nothrow_assign(Int))]; } { int arr[T(__has_nothrow_assign(IntAr))]; } { int arr[T(__has_nothrow_assign(Union))]; } { int arr[T(__has_nothrow_assign(UnionAr))]; } { int arr[T(__has_nothrow_assign(POD))]; } { int arr[T(__has_nothrow_assign(Derives))]; } { int arr[T(__has_nothrow_assign(HasDest))]; } { int arr[T(__has_nothrow_assign(HasPriv))]; } { int arr[T(__has_nothrow_assign(HasCons))]; } { int arr[T(__has_nothrow_assign(HasRef))]; } { int arr[T(__has_nothrow_assign(HasCopy))]; } { int arr[T(__has_nothrow_assign(HasMove))]; } { int arr[T(__has_nothrow_assign(HasMoveAssign))]; } { int arr[T(__has_nothrow_assign(HasNoThrowCopyAssign))]; } { int arr[T(__has_nothrow_assign(HasMultipleNoThrowCopyAssign))]; } { int arr[T(__has_nothrow_assign(HasVirtDest))]; } { int arr[T(__has_nothrow_assign(AllPrivate))]; } { int arr[T(__has_nothrow_assign(UsingAssign))]; } { int arr[T(__has_nothrow_assign(DerivesAr))]; } { int arr[T(__has_nothrow_assign(ACompleteType[]))]; } { int arr[F(__has_nothrow_assign(AnIncompleteType[]))]; } // expected-error {{incomplete type}} { int arr[F(__has_nothrow_assign(IntRef))]; } { int arr[F(__has_nothrow_assign(HasCopyAssign))]; } { int arr[F(__has_nothrow_assign(HasMultipleCopyAssign))]; } { int arr[F(__has_nothrow_assign(const Int))]; } { int arr[F(__has_nothrow_assign(ConstIntAr))]; } { int arr[F(__has_nothrow_assign(ConstIntArAr))]; } { int arr[F(__has_nothrow_assign(VirtAr))]; } { int arr[F(__has_nothrow_assign(void))]; } { int arr[F(__has_nothrow_assign(cvoid))]; } { int arr[F(__has_nothrow_assign(PR11110))]; } } void has_nothrow_move_assign() { { int arr[T(__has_nothrow_move_assign(Int))]; } { int arr[T(__has_nothrow_move_assign(Enum))]; } { int arr[T(__has_nothrow_move_assign(Int*))]; } { int arr[T(__has_nothrow_move_assign(Enum POD::*))]; } { int arr[T(__has_nothrow_move_assign(POD))]; } { int arr[T(__has_nothrow_move_assign(HasPriv))]; } { int arr[T(__has_nothrow_move_assign(HasNoThrowMoveAssign))]; } { int arr[T(__has_nothrow_move_assign(HasNoExceptNoThrowMoveAssign))]; } { int arr[T(__has_nothrow_move_assign(HasMemberNoThrowMoveAssign))]; } { int arr[T(__has_nothrow_move_assign(HasMemberNoExceptNoThrowMoveAssign))]; } { int arr[T(__has_nothrow_move_assign(AllDeleted))]; } { int arr[T(__has_nothrow_move_assign(ACompleteType[]))]; } { int arr[F(__has_nothrow_move_assign(AnIncompleteType[]))]; } // expected-error {{incomplete type}} { int arr[F(__has_nothrow_move_assign(HasThrowMoveAssign))]; } { int arr[F(__has_nothrow_move_assign(HasNoExceptFalseMoveAssign))]; } { int arr[F(__has_nothrow_move_assign(HasMemberThrowMoveAssign))]; } { int arr[F(__has_nothrow_move_assign(HasMemberNoExceptFalseMoveAssign))]; } { int arr[F(__has_nothrow_move_assign(NoDefaultMoveAssignDueToUDCopyCtor))]; } { int arr[F(__has_nothrow_move_assign(NoDefaultMoveAssignDueToUDCopyAssign))]; } { int arr[F(__has_nothrow_move_assign(NoDefaultMoveAssignDueToDtor))]; } { int arr[T(__is_nothrow_assignable(HasNoThrowMoveAssign, HasNoThrowMoveAssign))]; } { int arr[F(__is_nothrow_assignable(HasThrowMoveAssign, HasThrowMoveAssign))]; } { int arr[T(__is_assignable(HasNoThrowMoveAssign, HasNoThrowMoveAssign))]; } { int arr[T(__is_assignable(HasThrowMoveAssign, HasThrowMoveAssign))]; } } void has_trivial_move_assign() { // n3376 12.8 [class.copy]/25 // A copy/move assignment operator for class X is trivial if it // is not user-provided, its declared parameter type is the same // as if it had been implicitly declared, and if: // - class X has no virtual functions (10.3) and no virtual base // classes (10.1), and // - the assignment operator selected to copy/move each direct // base class subobject is trivial, and // - for each non-static data member of X that is of class type // (or array thereof), the assignment operator // selected to copy/move that member is trivial; { int arr[T(__has_trivial_move_assign(Int))]; } { int arr[T(__has_trivial_move_assign(HasStaticMemberMoveAssign))]; } { int arr[T(__has_trivial_move_assign(AllDeleted))]; } { int arr[T(__has_trivial_move_assign(ACompleteType[]))]; } { int arr[F(__has_trivial_move_assign(AnIncompleteType[]))]; } // expected-error {{incomplete type}} { int arr[F(__has_trivial_move_assign(HasVirt))]; } { int arr[F(__has_trivial_move_assign(DerivesVirt))]; } { int arr[F(__has_trivial_move_assign(HasMoveAssign))]; } { int arr[F(__has_trivial_move_assign(DerivesHasMoveAssign))]; } { int arr[F(__has_trivial_move_assign(HasMemberMoveAssign))]; } { int arr[F(__has_nothrow_move_assign(NoDefaultMoveAssignDueToUDCopyCtor))]; } { int arr[F(__has_nothrow_move_assign(NoDefaultMoveAssignDueToUDCopyAssign))]; } } void has_nothrow_copy() { { int arr[T(__has_nothrow_copy(Int))]; } { int arr[T(__has_nothrow_copy(IntAr))]; } { int arr[T(__has_nothrow_copy(Union))]; } { int arr[T(__has_nothrow_copy(UnionAr))]; } { int arr[T(__has_nothrow_copy(POD))]; } { int arr[T(__has_nothrow_copy(const Int))]; } { int arr[T(__has_nothrow_copy(ConstIntAr))]; } { int arr[T(__has_nothrow_copy(ConstIntArAr))]; } { int arr[T(__has_nothrow_copy(Derives))]; } { int arr[T(__has_nothrow_copy(IntRef))]; } { int arr[T(__has_nothrow_copy(HasDest))]; } { int arr[T(__has_nothrow_copy(HasPriv))]; } { int arr[T(__has_nothrow_copy(HasCons))]; } { int arr[T(__has_nothrow_copy(HasRef))]; } { int arr[T(__has_nothrow_copy(HasMove))]; } { int arr[T(__has_nothrow_copy(HasCopyAssign))]; } { int arr[T(__has_nothrow_copy(HasMoveAssign))]; } { int arr[T(__has_nothrow_copy(HasNoThrowCopy))]; } { int arr[T(__has_nothrow_copy(HasMultipleNoThrowCopy))]; } { int arr[T(__has_nothrow_copy(HasVirtDest))]; } { int arr[T(__has_nothrow_copy(HasTemplateCons))]; } { int arr[T(__has_nothrow_copy(AllPrivate))]; } { int arr[T(__has_nothrow_copy(DerivesAr))]; } { int arr[T(__has_nothrow_copy(ACompleteType[]))]; } { int arr[F(__has_nothrow_copy(AnIncompleteType[]))]; } // expected-error {{incomplete type}} { int arr[F(__has_nothrow_copy(HasCopy))]; } { int arr[F(__has_nothrow_copy(HasMultipleCopy))]; } { int arr[F(__has_nothrow_copy(VirtAr))]; } { int arr[F(__has_nothrow_copy(void))]; } { int arr[F(__has_nothrow_copy(cvoid))]; } } void has_nothrow_constructor() { { int arr[T(__has_nothrow_constructor(Int))]; } { int arr[T(__has_nothrow_constructor(IntAr))]; } { int arr[T(__has_nothrow_constructor(Union))]; } { int arr[T(__has_nothrow_constructor(UnionAr))]; } { int arr[T(__has_nothrow_constructor(POD))]; } { int arr[T(__has_nothrow_constructor(Derives))]; } { int arr[T(__has_nothrow_constructor(DerivesAr))]; } { int arr[T(__has_nothrow_constructor(ConstIntAr))]; } { int arr[T(__has_nothrow_constructor(ConstIntArAr))]; } { int arr[T(__has_nothrow_constructor(HasDest))]; } { int arr[T(__has_nothrow_constructor(HasPriv))]; } { int arr[T(__has_nothrow_constructor(HasCopyAssign))]; } { int arr[T(__has_nothrow_constructor(const Int))]; } { int arr[T(__has_nothrow_constructor(HasNoThrowConstructor))]; } { int arr[T(__has_nothrow_constructor(HasVirtDest))]; } // { int arr[T(__has_nothrow_constructor(VirtAr))]; } // not implemented { int arr[T(__has_nothrow_constructor(AllPrivate))]; } { int arr[T(__has_nothrow_constructor(ACompleteType[]))]; } { int arr[F(__has_nothrow_constructor(AnIncompleteType[]))]; } // expected-error {{incomplete type}} { int arr[F(__has_nothrow_constructor(HasCons))]; } { int arr[F(__has_nothrow_constructor(HasRef))]; } { int arr[F(__has_nothrow_constructor(HasCopy))]; } { int arr[F(__has_nothrow_constructor(HasMove))]; } { int arr[F(__has_nothrow_constructor(HasNoThrowConstructorWithArgs))]; } { int arr[F(__has_nothrow_constructor(IntRef))]; } { int arr[F(__has_nothrow_constructor(void))]; } { int arr[F(__has_nothrow_constructor(cvoid))]; } { int arr[F(__has_nothrow_constructor(HasTemplateCons))]; } { int arr[F(__has_nothrow_constructor(HasMultipleDefaultConstructor1))]; } { int arr[F(__has_nothrow_constructor(HasMultipleDefaultConstructor2))]; } } void has_virtual_destructor() { { int arr[F(__has_virtual_destructor(Int))]; } { int arr[F(__has_virtual_destructor(IntAr))]; } { int arr[F(__has_virtual_destructor(Union))]; } { int arr[F(__has_virtual_destructor(UnionAr))]; } { int arr[F(__has_virtual_destructor(POD))]; } { int arr[F(__has_virtual_destructor(Derives))]; } { int arr[F(__has_virtual_destructor(DerivesAr))]; } { int arr[F(__has_virtual_destructor(const Int))]; } { int arr[F(__has_virtual_destructor(ConstIntAr))]; } { int arr[F(__has_virtual_destructor(ConstIntArAr))]; } { int arr[F(__has_virtual_destructor(HasDest))]; } { int arr[F(__has_virtual_destructor(HasPriv))]; } { int arr[F(__has_virtual_destructor(HasCons))]; } { int arr[F(__has_virtual_destructor(HasRef))]; } { int arr[F(__has_virtual_destructor(HasCopy))]; } { int arr[F(__has_virtual_destructor(HasMove))]; } { int arr[F(__has_virtual_destructor(HasCopyAssign))]; } { int arr[F(__has_virtual_destructor(HasMoveAssign))]; } { int arr[F(__has_virtual_destructor(IntRef))]; } { int arr[F(__has_virtual_destructor(VirtAr))]; } { int arr[F(__has_virtual_destructor(ACompleteType[]))]; } { int arr[F(__has_virtual_destructor(AnIncompleteType[]))]; } // expected-error {{incomplete type}} { int arr[T(__has_virtual_destructor(HasVirtDest))]; } { int arr[T(__has_virtual_destructor(DerivedVirtDest))]; } { int arr[F(__has_virtual_destructor(VirtDestAr))]; } { int arr[F(__has_virtual_destructor(void))]; } { int arr[F(__has_virtual_destructor(cvoid))]; } { int arr[F(__has_virtual_destructor(AllPrivate))]; } } class Base {}; class Derived : Base {}; class Derived2a : Derived {}; class Derived2b : Derived {}; class Derived3 : virtual Derived2a, virtual Derived2b {}; template struct BaseA { T a; }; template struct DerivedB : BaseA { }; template struct CrazyDerived : T { }; class class_forward; // expected-note 2 {{forward declaration of 'class_forward'}} template void isBaseOfT() { int t[T(__is_base_of(Base, Derived))]; }; template void isBaseOfF() { int t[F(__is_base_of(Base, Derived))]; }; template class DerivedTemp : Base {}; template class NonderivedTemp {}; template class UndefinedTemp; // expected-note {{declared here}} void is_base_of() { { int arr[T(__is_base_of(Base, Derived))]; } { int arr[T(__is_base_of(const Base, Derived))]; } { int arr[F(__is_base_of(Derived, Base))]; } { int arr[F(__is_base_of(Derived, int))]; } { int arr[T(__is_base_of(Base, Base))]; } { int arr[T(__is_base_of(Base, Derived3))]; } { int arr[T(__is_base_of(Derived, Derived3))]; } { int arr[T(__is_base_of(Derived2b, Derived3))]; } { int arr[T(__is_base_of(Derived2a, Derived3))]; } { int arr[T(__is_base_of(BaseA, DerivedB))]; } { int arr[F(__is_base_of(DerivedB, BaseA))]; } { int arr[T(__is_base_of(Base, CrazyDerived))]; } { int arr[F(__is_base_of(Union, Union))]; } { int arr[T(__is_base_of(Empty, Empty))]; } { int arr[T(__is_base_of(class_forward, class_forward))]; } { int arr[F(__is_base_of(Empty, class_forward))]; } // expected-error {{incomplete type 'class_forward' used in type trait expression}} { int arr[F(__is_base_of(Base&, Derived&))]; } int t18[F(__is_base_of(Base[10], Derived[10]))]; { int arr[F(__is_base_of(int, int))]; } { int arr[F(__is_base_of(long, int))]; } { int arr[T(__is_base_of(Base, DerivedTemp))]; } { int arr[F(__is_base_of(Base, NonderivedTemp))]; } { int arr[F(__is_base_of(Base, UndefinedTemp))]; } // expected-error {{implicit instantiation of undefined template 'UndefinedTemp'}} { int arr[F(__is_base_of(IncompleteUnion, IncompleteUnion))]; } { int arr[F(__is_base_of(Union, IncompleteUnion))]; } { int arr[F(__is_base_of(IncompleteUnion, Union))]; } { int arr[F(__is_base_of(IncompleteStruct, IncompleteUnion))]; } { int arr[F(__is_base_of(IncompleteUnion, IncompleteStruct))]; } { int arr[F(__is_base_of(Empty, IncompleteUnion))]; } { int arr[F(__is_base_of(IncompleteUnion, Empty))]; } { int arr[F(__is_base_of(int, IncompleteUnion))]; } { int arr[F(__is_base_of(IncompleteUnion, int))]; } { int arr[F(__is_base_of(Empty, Union))]; } { int arr[F(__is_base_of(Union, Empty))]; } { int arr[F(__is_base_of(int, Empty))]; } { int arr[F(__is_base_of(Union, int))]; } isBaseOfT(); isBaseOfF(); isBaseOfT >(); isBaseOfF, Base>(); isBaseOfT, DerivedB >(); isBaseOfF, BaseA >(); } template class TemplateClass {}; template using TemplateAlias = TemplateClass; typedef class Base BaseTypedef; void is_same() { int t01[T(__is_same(Base, Base))]; int t02[T(__is_same(Base, BaseTypedef))]; int t03[T(__is_same(TemplateClass, TemplateAlias))]; int t10[F(__is_same(Base, const Base))]; int t11[F(__is_same(Base, Base&))]; int t12[F(__is_same(Base, Derived))]; // __is_same_as is a GCC compatibility synonym for __is_same. int t20[T(__is_same_as(int, int))]; int t21[F(__is_same_as(int, float))]; } struct IntWrapper { int value; IntWrapper(int _value) : value(_value) {} operator int() const { return value; } }; struct FloatWrapper { float value; FloatWrapper(float _value) : value(_value) {} FloatWrapper(const IntWrapper& obj) : value(static_cast(obj.value)) {} operator float() const { return value; } operator IntWrapper() const { return IntWrapper(static_cast(value)); } }; void is_convertible() { int t01[T(__is_convertible(IntWrapper, IntWrapper))]; int t02[T(__is_convertible(IntWrapper, const IntWrapper))]; int t03[T(__is_convertible(IntWrapper, int))]; int t04[T(__is_convertible(int, IntWrapper))]; int t05[T(__is_convertible(IntWrapper, FloatWrapper))]; int t06[T(__is_convertible(FloatWrapper, IntWrapper))]; int t07[T(__is_convertible(FloatWrapper, float))]; int t08[T(__is_convertible(float, FloatWrapper))]; } struct FromInt { FromInt(int); }; struct ToInt { operator int(); }; typedef void Function(); void is_convertible_to(); class PrivateCopy { PrivateCopy(const PrivateCopy&); friend void is_convertible_to(); }; template struct X0 { template X0(const X0&); }; struct Abstract { virtual void f() = 0; }; void is_convertible_to() { { int arr[T(__is_convertible_to(Int, Int))]; } { int arr[F(__is_convertible_to(Int, IntAr))]; } { int arr[F(__is_convertible_to(IntAr, IntAr))]; } { int arr[T(__is_convertible_to(void, void))]; } { int arr[T(__is_convertible_to(cvoid, void))]; } { int arr[T(__is_convertible_to(void, cvoid))]; } { int arr[T(__is_convertible_to(cvoid, cvoid))]; } { int arr[T(__is_convertible_to(int, FromInt))]; } { int arr[T(__is_convertible_to(long, FromInt))]; } { int arr[T(__is_convertible_to(double, FromInt))]; } { int arr[T(__is_convertible_to(const int, FromInt))]; } { int arr[T(__is_convertible_to(const int&, FromInt))]; } { int arr[T(__is_convertible_to(ToInt, int))]; } { int arr[T(__is_convertible_to(ToInt, const int&))]; } { int arr[T(__is_convertible_to(ToInt, long))]; } { int arr[F(__is_convertible_to(ToInt, int&))]; } { int arr[F(__is_convertible_to(ToInt, FromInt))]; } { int arr[T(__is_convertible_to(IntAr&, IntAr&))]; } { int arr[T(__is_convertible_to(IntAr&, const IntAr&))]; } { int arr[F(__is_convertible_to(const IntAr&, IntAr&))]; } { int arr[F(__is_convertible_to(Function, Function))]; } { int arr[F(__is_convertible_to(PrivateCopy, PrivateCopy))]; } { int arr[T(__is_convertible_to(X0, X0))]; } { int arr[F(__is_convertible_to(Abstract, Abstract))]; } } namespace is_convertible_to_instantiate { // Make sure we don't try to instantiate the constructor. template class A { A(int) { int a[x]; } }; int x = __is_convertible_to(int, A<-1>); } void is_trivial() { { int arr[T(__is_trivial(int))]; } { int arr[T(__is_trivial(Enum))]; } { int arr[T(__is_trivial(POD))]; } { int arr[T(__is_trivial(Int))]; } { int arr[T(__is_trivial(IntAr))]; } { int arr[T(__is_trivial(IntArNB))]; } { int arr[T(__is_trivial(Statics))]; } { int arr[T(__is_trivial(Empty))]; } { int arr[T(__is_trivial(EmptyUnion))]; } { int arr[T(__is_trivial(Union))]; } { int arr[T(__is_trivial(Derives))]; } { int arr[T(__is_trivial(DerivesAr))]; } { int arr[T(__is_trivial(DerivesArNB))]; } { int arr[T(__is_trivial(DerivesEmpty))]; } { int arr[T(__is_trivial(HasFunc))]; } { int arr[T(__is_trivial(HasOp))]; } { int arr[T(__is_trivial(HasConv))]; } { int arr[T(__is_trivial(HasAssign))]; } { int arr[T(__is_trivial(HasAnonymousUnion))]; } { int arr[T(__is_trivial(HasPriv))]; } { int arr[T(__is_trivial(HasProt))]; } { int arr[T(__is_trivial(DerivesHasPriv))]; } { int arr[T(__is_trivial(DerivesHasProt))]; } { int arr[T(__is_trivial(Vector))]; } { int arr[T(__is_trivial(VectorExt))]; } { int arr[F(__is_trivial(HasCons))]; } { int arr[F(__is_trivial(HasCopyAssign))]; } { int arr[F(__is_trivial(HasMoveAssign))]; } { int arr[F(__is_trivial(HasDest))]; } { int arr[F(__is_trivial(HasRef))]; } { int arr[F(__is_trivial(HasNonPOD))]; } { int arr[F(__is_trivial(HasVirt))]; } { int arr[F(__is_trivial(DerivesHasCons))]; } { int arr[F(__is_trivial(DerivesHasCopyAssign))]; } { int arr[F(__is_trivial(DerivesHasMoveAssign))]; } { int arr[F(__is_trivial(DerivesHasDest))]; } { int arr[F(__is_trivial(DerivesHasRef))]; } { int arr[F(__is_trivial(DerivesHasVirt))]; } { int arr[F(__is_trivial(void))]; } { int arr[F(__is_trivial(cvoid))]; } } template struct TriviallyConstructibleTemplate {}; void trivial_checks() { { int arr[T(__is_trivially_copyable(int))]; } { int arr[T(__is_trivially_copyable(Enum))]; } { int arr[T(__is_trivially_copyable(POD))]; } { int arr[T(__is_trivially_copyable(Int))]; } { int arr[T(__is_trivially_copyable(IntAr))]; } { int arr[T(__is_trivially_copyable(IntArNB))]; } { int arr[T(__is_trivially_copyable(Statics))]; } { int arr[T(__is_trivially_copyable(Empty))]; } { int arr[T(__is_trivially_copyable(EmptyUnion))]; } { int arr[T(__is_trivially_copyable(Union))]; } { int arr[T(__is_trivially_copyable(Derives))]; } { int arr[T(__is_trivially_copyable(DerivesAr))]; } { int arr[T(__is_trivially_copyable(DerivesArNB))]; } { int arr[T(__is_trivially_copyable(DerivesEmpty))]; } { int arr[T(__is_trivially_copyable(HasFunc))]; } { int arr[T(__is_trivially_copyable(HasOp))]; } { int arr[T(__is_trivially_copyable(HasConv))]; } { int arr[T(__is_trivially_copyable(HasAssign))]; } { int arr[T(__is_trivially_copyable(HasAnonymousUnion))]; } { int arr[T(__is_trivially_copyable(HasPriv))]; } { int arr[T(__is_trivially_copyable(HasProt))]; } { int arr[T(__is_trivially_copyable(DerivesHasPriv))]; } { int arr[T(__is_trivially_copyable(DerivesHasProt))]; } { int arr[T(__is_trivially_copyable(Vector))]; } { int arr[T(__is_trivially_copyable(VectorExt))]; } { int arr[T(__is_trivially_copyable(HasCons))]; } { int arr[T(__is_trivially_copyable(HasRef))]; } { int arr[T(__is_trivially_copyable(HasNonPOD))]; } { int arr[T(__is_trivially_copyable(DerivesHasCons))]; } { int arr[T(__is_trivially_copyable(DerivesHasRef))]; } { int arr[T(__is_trivially_copyable(NonTrivialDefault))]; } { int arr[T(__is_trivially_copyable(NonTrivialDefault[]))]; } { int arr[T(__is_trivially_copyable(NonTrivialDefault[3]))]; } { int arr[F(__is_trivially_copyable(HasCopyAssign))]; } { int arr[F(__is_trivially_copyable(HasMoveAssign))]; } { int arr[F(__is_trivially_copyable(HasDest))]; } { int arr[F(__is_trivially_copyable(HasVirt))]; } { int arr[F(__is_trivially_copyable(DerivesHasCopyAssign))]; } { int arr[F(__is_trivially_copyable(DerivesHasMoveAssign))]; } { int arr[F(__is_trivially_copyable(DerivesHasDest))]; } { int arr[F(__is_trivially_copyable(DerivesHasVirt))]; } { int arr[F(__is_trivially_copyable(void))]; } { int arr[F(__is_trivially_copyable(cvoid))]; } { int arr[T((__is_trivially_constructible(int)))]; } { int arr[T((__is_trivially_constructible(int, int)))]; } { int arr[T((__is_trivially_constructible(int, float)))]; } { int arr[T((__is_trivially_constructible(int, int&)))]; } { int arr[T((__is_trivially_constructible(int, const int&)))]; } { int arr[T((__is_trivially_constructible(int, int)))]; } { int arr[T((__is_trivially_constructible(HasCopyAssign, HasCopyAssign)))]; } { int arr[T((__is_trivially_constructible(HasCopyAssign, const HasCopyAssign&)))]; } { int arr[T((__is_trivially_constructible(HasCopyAssign, HasCopyAssign&&)))]; } { int arr[T((__is_trivially_constructible(HasCopyAssign)))]; } { int arr[T((__is_trivially_constructible(NonTrivialDefault, const NonTrivialDefault&)))]; } { int arr[T((__is_trivially_constructible(NonTrivialDefault, NonTrivialDefault&&)))]; } { int arr[T((__is_trivially_constructible(AllDefaulted)))]; } { int arr[T((__is_trivially_constructible(AllDefaulted, const AllDefaulted &)))]; } { int arr[T((__is_trivially_constructible(AllDefaulted, AllDefaulted &&)))]; } { int arr[F((__is_trivially_constructible(int, int*)))]; } { int arr[F((__is_trivially_constructible(NonTrivialDefault)))]; } { int arr[F((__is_trivially_constructible(ThreeArgCtor, int*, char*, int&)))]; } { int arr[F((__is_trivially_constructible(AllDeleted)))]; } { int arr[F((__is_trivially_constructible(AllDeleted, const AllDeleted &)))]; } { int arr[F((__is_trivially_constructible(AllDeleted, AllDeleted &&)))]; } { int arr[F((__is_trivially_constructible(ExtDefaulted)))]; } { int arr[F((__is_trivially_constructible(ExtDefaulted, const ExtDefaulted &)))]; } { int arr[F((__is_trivially_constructible(ExtDefaulted, ExtDefaulted &&)))]; } { int arr[T((__is_trivially_constructible(TriviallyConstructibleTemplate)))]; } { int arr[F((__is_trivially_constructible(class_forward)))]; } // expected-error {{incomplete type 'class_forward' used in type trait expression}} { int arr[F((__is_trivially_constructible(class_forward[])))]; } { int arr[F((__is_trivially_constructible(void)))]; } { int arr[T((__is_trivially_assignable(int&, int)))]; } { int arr[T((__is_trivially_assignable(int&, int&)))]; } { int arr[T((__is_trivially_assignable(int&, int&&)))]; } { int arr[T((__is_trivially_assignable(int&, const int&)))]; } { int arr[T((__is_trivially_assignable(POD&, POD)))]; } { int arr[T((__is_trivially_assignable(POD&, POD&)))]; } { int arr[T((__is_trivially_assignable(POD&, POD&&)))]; } { int arr[T((__is_trivially_assignable(POD&, const POD&)))]; } { int arr[T((__is_trivially_assignable(int*&, int*)))]; } { int arr[T((__is_trivially_assignable(AllDefaulted, const AllDefaulted &)))]; } { int arr[T((__is_trivially_assignable(AllDefaulted, AllDefaulted &&)))]; } { int arr[F((__is_trivially_assignable(int*&, float*)))]; } { int arr[F((__is_trivially_assignable(HasCopyAssign&, HasCopyAssign)))]; } { int arr[F((__is_trivially_assignable(HasCopyAssign&, HasCopyAssign&)))]; } { int arr[F((__is_trivially_assignable(HasCopyAssign&, const HasCopyAssign&)))]; } { int arr[F((__is_trivially_assignable(HasCopyAssign&, HasCopyAssign&&)))]; } { int arr[F((__is_trivially_assignable(TrivialMoveButNotCopy&, TrivialMoveButNotCopy&)))]; } { int arr[F((__is_trivially_assignable(TrivialMoveButNotCopy&, const TrivialMoveButNotCopy&)))]; } { int arr[F((__is_trivially_assignable(AllDeleted, const AllDeleted &)))]; } { int arr[F((__is_trivially_assignable(AllDeleted, AllDeleted &&)))]; } { int arr[F((__is_trivially_assignable(ExtDefaulted, const ExtDefaulted &)))]; } { int arr[F((__is_trivially_assignable(ExtDefaulted, ExtDefaulted &&)))]; } { int arr[T((__is_trivially_assignable(HasDefaultTrivialCopyAssign&, HasDefaultTrivialCopyAssign&)))]; } { int arr[T((__is_trivially_assignable(HasDefaultTrivialCopyAssign&, const HasDefaultTrivialCopyAssign&)))]; } { int arr[T((__is_trivially_assignable(TrivialMoveButNotCopy&, TrivialMoveButNotCopy)))]; } { int arr[T((__is_trivially_assignable(TrivialMoveButNotCopy&, TrivialMoveButNotCopy&&)))]; } { int arr[T((__is_trivially_assignable(int&, int)))]; } { int arr[T((__is_trivially_assignable(int&, int&)))]; } { int arr[T((__is_trivially_assignable(int&, int&&)))]; } { int arr[T((__is_trivially_assignable(int&, const int&)))]; } { int arr[T((__is_trivially_assignable(POD&, POD)))]; } { int arr[T((__is_trivially_assignable(POD&, POD&)))]; } { int arr[T((__is_trivially_assignable(POD&, POD&&)))]; } { int arr[T((__is_trivially_assignable(POD&, const POD&)))]; } { int arr[T((__is_trivially_assignable(int*&, int*)))]; } { int arr[T((__is_trivially_assignable(AllDefaulted, const AllDefaulted &)))]; } { int arr[T((__is_trivially_assignable(AllDefaulted, AllDefaulted &&)))]; } { int arr[F((__is_assignable(int *&, float *)))]; } { int arr[T((__is_assignable(HasCopyAssign &, HasCopyAssign)))]; } { int arr[T((__is_assignable(HasCopyAssign &, HasCopyAssign &)))]; } { int arr[T((__is_assignable(HasCopyAssign &, const HasCopyAssign &)))]; } { int arr[T((__is_assignable(HasCopyAssign &, HasCopyAssign &&)))]; } { int arr[T((__is_assignable(TrivialMoveButNotCopy &, TrivialMoveButNotCopy &)))]; } { int arr[T((__is_assignable(TrivialMoveButNotCopy &, const TrivialMoveButNotCopy &)))]; } { int arr[F((__is_assignable(AllDeleted, const AllDeleted &)))]; } { int arr[F((__is_assignable(AllDeleted, AllDeleted &&)))]; } { int arr[T((__is_assignable(ExtDefaulted, const ExtDefaulted &)))]; } { int arr[T((__is_assignable(ExtDefaulted, ExtDefaulted &&)))]; } { int arr[T((__is_assignable(HasDefaultTrivialCopyAssign &, HasDefaultTrivialCopyAssign &)))]; } { int arr[T((__is_assignable(HasDefaultTrivialCopyAssign &, const HasDefaultTrivialCopyAssign &)))]; } { int arr[T((__is_assignable(TrivialMoveButNotCopy &, TrivialMoveButNotCopy)))]; } { int arr[T((__is_assignable(TrivialMoveButNotCopy &, TrivialMoveButNotCopy &&)))]; } { int arr[T(__is_assignable(ACompleteType, ACompleteType))]; } { int arr[F(__is_assignable(AnIncompleteType, AnIncompleteType))]; } // expected-error {{incomplete type}} { int arr[F(__is_assignable(AnIncompleteType[], AnIncompleteType[]))]; } { int arr[F(__is_assignable(AnIncompleteType[1], AnIncompleteType[1]))]; } // expected-error {{incomplete type}} { int arr[F(__is_assignable(void, void))]; } { int arr[F(__is_assignable(const volatile void, const volatile void))]; } } void constructible_checks() { { int arr[T(__is_constructible(HasNoThrowConstructorWithArgs))]; } { int arr[F(__is_nothrow_constructible(HasNoThrowConstructorWithArgs))]; } // MSVC doesn't look into default args and gets this wrong. { int arr[T(__is_constructible(HasNoThrowConstructorWithArgs, HasCons))]; } { int arr[T(__is_nothrow_constructible(HasNoThrowConstructorWithArgs, HasCons))]; } { int arr[T(__is_constructible(NonTrivialDefault))]; } { int arr[F(__is_nothrow_constructible(NonTrivialDefault))]; } { int arr[T(__is_constructible(int))]; } { int arr[T(__is_nothrow_constructible(int))]; } { int arr[F(__is_constructible(NonPOD))]; } { int arr[F(__is_nothrow_constructible(NonPOD))]; } { int arr[T(__is_constructible(NonPOD, int))]; } { int arr[F(__is_nothrow_constructible(NonPOD, int))]; } // PR19178 { int arr[F(__is_constructible(Abstract))]; } { int arr[F(__is_nothrow_constructible(Abstract))]; } // PR20228 { int arr[T(__is_constructible(VariadicCtor, int, int, int, int, int, int, int, int, int))]; } // PR25513 { int arr[F(__is_constructible(int(int)))]; } { int arr[T(__is_constructible(int const &, long))]; } { int arr[T(__is_constructible(ACompleteType))]; } { int arr[T(__is_nothrow_constructible(ACompleteType))]; } { int arr[F(__is_constructible(AnIncompleteType))]; } // expected-error {{incomplete type}} { int arr[F(__is_nothrow_constructible(AnIncompleteType))]; } // expected-error {{incomplete type}} { int arr[F(__is_constructible(AnIncompleteType[]))]; } { int arr[F(__is_nothrow_constructible(AnIncompleteType[]))]; } { int arr[F(__is_constructible(AnIncompleteType[1]))]; } // expected-error {{incomplete type}} { int arr[F(__is_nothrow_constructible(AnIncompleteType[1]))]; } // expected-error {{incomplete type}} { int arr[F(__is_constructible(void))]; } { int arr[F(__is_nothrow_constructible(void))]; } { int arr[F(__is_constructible(const volatile void))]; } { int arr[F(__is_nothrow_constructible(const volatile void))]; } } // Instantiation of __is_trivially_constructible template struct is_trivially_constructible { static const bool value = __is_trivially_constructible(T, Args...); }; void is_trivially_constructible_test() { { int arr[T((is_trivially_constructible::value))]; } { int arr[T((is_trivially_constructible::value))]; } { int arr[T((is_trivially_constructible::value))]; } { int arr[T((is_trivially_constructible::value))]; } { int arr[T((is_trivially_constructible::value))]; } { int arr[T((is_trivially_constructible::value))]; } { int arr[T((is_trivially_constructible::value))]; } { int arr[T((is_trivially_constructible::value))]; } { int arr[T((is_trivially_constructible::value))]; } { int arr[T((is_trivially_constructible::value))]; } { int arr[T((is_trivially_constructible::value))]; } { int arr[T((is_trivially_constructible::value))]; } { int arr[F((is_trivially_constructible::value))]; } { int arr[F((is_trivially_constructible::value))]; } { int arr[F((is_trivially_constructible::value))]; } { int arr[F((is_trivially_constructible::value))]; } // PR19178 { int arr[T(__is_trivially_constructible(ACompleteType))]; } { int arr[F(__is_trivially_constructible(AnIncompleteType))]; } // expected-error {{incomplete type}} { int arr[F(__is_trivially_constructible(AnIncompleteType[]))]; } { int arr[F(__is_trivially_constructible(AnIncompleteType[1]))]; } // expected-error {{incomplete type}} { int arr[F(__is_trivially_constructible(void))]; } { int arr[F(__is_trivially_constructible(const volatile void))]; } } template struct ConvertsToRef { operator RefType() const { return static_cast(obj); } mutable T obj = 42; }; void reference_binds_to_temporary_checks() { { int arr[F((__reference_binds_to_temporary(int &, int &)))]; } { int arr[F((__reference_binds_to_temporary(int &, int &&)))]; } { int arr[F((__reference_binds_to_temporary(int const &, int &)))]; } { int arr[F((__reference_binds_to_temporary(int const &, int const &)))]; } { int arr[F((__reference_binds_to_temporary(int const &, int &&)))]; } { int arr[F((__reference_binds_to_temporary(int &, long &)))]; } // doesn't construct { int arr[T((__reference_binds_to_temporary(int const &, long &)))]; } { int arr[T((__reference_binds_to_temporary(int const &, long &&)))]; } { int arr[T((__reference_binds_to_temporary(int &&, long &)))]; } using LRef = ConvertsToRef; using RRef = ConvertsToRef; using CLRef = ConvertsToRef; using LongRef = ConvertsToRef; { int arr[T((__is_constructible(int &, LRef)))]; } { int arr[F((__reference_binds_to_temporary(int &, LRef)))]; } { int arr[T((__is_constructible(int &&, RRef)))]; } { int arr[F((__reference_binds_to_temporary(int &&, RRef)))]; } { int arr[T((__is_constructible(int const &, CLRef)))]; } { int arr[F((__reference_binds_to_temporary(int &&, CLRef)))]; } { int arr[T((__is_constructible(int const &, LongRef)))]; } { int arr[T((__reference_binds_to_temporary(int const &, LongRef)))]; } // Test that it doesn't accept non-reference types as input. { int arr[F((__reference_binds_to_temporary(int, long)))]; } { int arr[T((__reference_binds_to_temporary(const int &, long)))]; } } void array_rank() { int t01[T(__array_rank(IntAr) == 1)]; int t02[T(__array_rank(ConstIntArAr) == 2)]; } void array_extent() { int t01[T(__array_extent(IntAr, 0) == 10)]; int t02[T(__array_extent(ConstIntArAr, 0) == 4)]; int t03[T(__array_extent(ConstIntArAr, 1) == 10)]; } void is_destructible_test() { { int arr[T(__is_destructible(int))]; } { int arr[T(__is_destructible(int[2]))]; } { int arr[F(__is_destructible(int[]))]; } { int arr[F(__is_destructible(void))]; } { int arr[T(__is_destructible(int &))]; } { int arr[T(__is_destructible(HasDest))]; } { int arr[F(__is_destructible(AllPrivate))]; } { int arr[T(__is_destructible(SuperNonTrivialStruct))]; } { int arr[T(__is_destructible(AllDefaulted))]; } { int arr[F(__is_destructible(AllDeleted))]; } { int arr[T(__is_destructible(ThrowingDtor))]; } { int arr[T(__is_destructible(NoThrowDtor))]; } { int arr[T(__is_destructible(ACompleteType))]; } { int arr[F(__is_destructible(AnIncompleteType))]; } // expected-error {{incomplete type}} { int arr[F(__is_destructible(AnIncompleteType[]))]; } { int arr[F(__is_destructible(AnIncompleteType[1]))]; } // expected-error {{incomplete type}} { int arr[F(__is_destructible(void))]; } { int arr[F(__is_destructible(const volatile void))]; } } void is_nothrow_destructible_test() { { int arr[T(__is_nothrow_destructible(int))]; } { int arr[T(__is_nothrow_destructible(int[2]))]; } { int arr[F(__is_nothrow_destructible(int[]))]; } { int arr[F(__is_nothrow_destructible(void))]; } { int arr[T(__is_nothrow_destructible(int &))]; } { int arr[T(__is_nothrow_destructible(HasDest))]; } { int arr[F(__is_nothrow_destructible(AllPrivate))]; } { int arr[T(__is_nothrow_destructible(SuperNonTrivialStruct))]; } { int arr[T(__is_nothrow_destructible(AllDefaulted))]; } { int arr[F(__is_nothrow_destructible(AllDeleted))]; } { int arr[F(__is_nothrow_destructible(ThrowingDtor))]; } { int arr[T(__is_nothrow_destructible(NoExceptDtor))]; } { int arr[T(__is_nothrow_destructible(NoThrowDtor))]; } { int arr[T(__is_nothrow_destructible(ACompleteType))]; } { int arr[F(__is_nothrow_destructible(AnIncompleteType))]; } // expected-error {{incomplete type}} { int arr[F(__is_nothrow_destructible(AnIncompleteType[]))]; } { int arr[F(__is_nothrow_destructible(AnIncompleteType[1]))]; } // expected-error {{incomplete type}} { int arr[F(__is_nothrow_destructible(void))]; } { int arr[F(__is_nothrow_destructible(const volatile void))]; } } void is_trivially_destructible_test() { { int arr[T(__is_trivially_destructible(int))]; } { int arr[T(__is_trivially_destructible(int[2]))]; } { int arr[F(__is_trivially_destructible(int[]))]; } { int arr[F(__is_trivially_destructible(void))]; } { int arr[T(__is_trivially_destructible(int &))]; } { int arr[F(__is_trivially_destructible(HasDest))]; } { int arr[F(__is_trivially_destructible(AllPrivate))]; } { int arr[F(__is_trivially_destructible(SuperNonTrivialStruct))]; } { int arr[T(__is_trivially_destructible(AllDefaulted))]; } { int arr[F(__is_trivially_destructible(AllDeleted))]; } { int arr[F(__is_trivially_destructible(ThrowingDtor))]; } { int arr[F(__is_trivially_destructible(NoThrowDtor))]; } { int arr[T(__is_trivially_destructible(ACompleteType))]; } { int arr[F(__is_trivially_destructible(AnIncompleteType))]; } // expected-error {{incomplete type}} { int arr[F(__is_trivially_destructible(AnIncompleteType[]))]; } { int arr[F(__is_trivially_destructible(AnIncompleteType[1]))]; } // expected-error {{incomplete type}} { int arr[F(__is_trivially_destructible(void))]; } { int arr[F(__is_trivially_destructible(const volatile void))]; } } // Instantiation of __has_unique_object_representations template struct has_unique_object_representations { static const bool value = __has_unique_object_representations(T); }; static_assert(!has_unique_object_representations::value, "void is never unique"); static_assert(!has_unique_object_representations::value, "void is never unique"); static_assert(!has_unique_object_representations::value, "void is never unique"); static_assert(!has_unique_object_representations::value, "void is never unique"); static_assert(has_unique_object_representations::value, "integrals are"); static_assert(has_unique_object_representations::value, "integrals are"); static_assert(has_unique_object_representations::value, "integrals are"); static_assert(has_unique_object_representations::value, "integrals are"); static_assert(has_unique_object_representations::value, "as are pointers"); static_assert(has_unique_object_representations::value, "as are pointers"); static_assert(has_unique_object_representations::value, "are pointers"); static_assert(has_unique_object_representations::value, "as are pointers"); static_assert(has_unique_object_representations::value, "as are pointers"); static_assert(has_unique_object_representations::value, "as are pointers"); static_assert(has_unique_object_representations::value, "as are pointers"); static_assert(has_unique_object_representations::value, "as are pointers"); class C {}; using FP = int (*)(int); using PMF = int (C::*)(int); using PMD = int C::*; static_assert(has_unique_object_representations::value, "even function pointers"); static_assert(has_unique_object_representations::value, "even function pointers"); static_assert(has_unique_object_representations::value, "even function pointers"); static_assert(has_unique_object_representations::value, "even function pointers"); static_assert(has_unique_object_representations::value, "and pointer to members"); static_assert(has_unique_object_representations::value, "and pointer to members"); static_assert(has_unique_object_representations::value, "and pointer to members"); static_assert(has_unique_object_representations::value, "and pointer to members"); static_assert(has_unique_object_representations::value, "and pointer to members"); static_assert(has_unique_object_representations::value, "and pointer to members"); static_assert(has_unique_object_representations::value, "and pointer to members"); static_assert(has_unique_object_representations::value, "and pointer to members"); static_assert(has_unique_object_representations::value, "yes, all integral types"); static_assert(has_unique_object_representations::value, "yes, all integral types"); static_assert(has_unique_object_representations::value, "yes, all integral types"); static_assert(has_unique_object_representations::value, "yes, all integral types"); static_assert(has_unique_object_representations::value, "yes, all integral types"); static_assert(has_unique_object_representations::value, "yes, all integral types"); static_assert(has_unique_object_representations::value, "yes, all integral types"); static_assert(has_unique_object_representations::value, "yes, all integral types"); static_assert(has_unique_object_representations::value, "yes, all integral types"); static_assert(has_unique_object_representations::value, "yes, all integral types"); static_assert(has_unique_object_representations::value, "yes, all integral types"); static_assert(has_unique_object_representations::value, "yes, all integral types"); static_assert(has_unique_object_representations::value, "yes, all integral types"); static_assert(has_unique_object_representations::value, "yes, all integral types"); static_assert(has_unique_object_representations::value, "yes, all integral types"); static_assert(!has_unique_object_representations::value, "but not void!"); static_assert(!has_unique_object_representations::value, "or nullptr_t"); static_assert(!has_unique_object_representations::value, "definitely not Floating Point"); static_assert(!has_unique_object_representations::value, "definitely not Floating Point"); static_assert(!has_unique_object_representations::value, "definitely not Floating Point"); struct NoPadding { int a; int b; }; static_assert(has_unique_object_representations::value, "types without padding are"); struct InheritsFromNoPadding : NoPadding { int c; int d; }; static_assert(has_unique_object_representations::value, "types without padding are"); struct VirtuallyInheritsFromNoPadding : virtual NoPadding { int c; int d; }; static_assert(!has_unique_object_representations::value, "No virtual inheritance"); struct Padding { char a; int b; }; //static_assert(!has_unique_object_representations::value, "but not with padding"); struct InheritsFromPadding : Padding { int c; int d; }; static_assert(!has_unique_object_representations::value, "or its subclasses"); struct TailPadding { int a; char b; }; static_assert(!has_unique_object_representations::value, "even at the end"); struct TinyStruct { char a; }; static_assert(has_unique_object_representations::value, "Should be no padding"); struct InheritsFromTinyStruct : TinyStruct { int b; }; static_assert(!has_unique_object_representations::value, "Inherit causes padding"); union NoPaddingUnion { int a; unsigned int b; }; static_assert(has_unique_object_representations::value, "unions follow the same rules as structs"); union PaddingUnion { int a; long long b; }; static_assert(!has_unique_object_representations::value, "unions follow the same rules as structs"); struct NotTriviallyCopyable { int x; NotTriviallyCopyable(const NotTriviallyCopyable &) {} }; static_assert(!has_unique_object_representations::value, "must be trivially copyable"); struct HasNonUniqueMember { float x; }; static_assert(!has_unique_object_representations::value, "all members must be unique"); enum ExampleEnum { xExample, yExample }; enum LLEnum : long long { xLongExample, yLongExample }; static_assert(has_unique_object_representations::value, "Enums are integrals, so unique!"); static_assert(has_unique_object_representations::value, "Enums are integrals, so unique!"); enum class ExampleEnumClass { xExample, yExample }; enum class LLEnumClass : long long { xLongExample, yLongExample }; static_assert(has_unique_object_representations::value, "Enums are integrals, so unique!"); static_assert(has_unique_object_representations::value, "Enums are integrals, so unique!"); // because references aren't trivially copyable. static_assert(!has_unique_object_representations::value, "No references!"); static_assert(!has_unique_object_representations::value, "No references!"); static_assert(!has_unique_object_representations::value, "No references!"); static_assert(!has_unique_object_representations::value, "No references!"); static_assert(!has_unique_object_representations::value, "No empty types!"); static_assert(!has_unique_object_representations::value, "No empty types!"); class Compressed : Empty { int x; }; static_assert(has_unique_object_representations::value, "But inheriting from one is ok"); class EmptyInheritor : Compressed {}; static_assert(has_unique_object_representations::value, "As long as the base has items, empty is ok"); class Dynamic { virtual void A(); int i; }; static_assert(!has_unique_object_representations::value, "Dynamic types are not valid"); class InheritsDynamic : Dynamic { int j; }; static_assert(!has_unique_object_representations::value, "Dynamic types are not valid"); static_assert(has_unique_object_representations::value, "Arrays are fine, as long as their value type is"); static_assert(has_unique_object_representations::value, "Arrays are fine, as long as their value type is"); static_assert(has_unique_object_representations::value, "Arrays are fine, as long as their value type is"); static_assert(!has_unique_object_representations::value, "So no array of doubles!"); static_assert(!has_unique_object_representations::value, "So no array of doubles!"); static_assert(!has_unique_object_representations::value, "So no array of doubles!"); struct __attribute__((aligned(16))) WeirdAlignment { int i; }; union __attribute__((aligned(16))) WeirdAlignmentUnion { int i; }; static_assert(!has_unique_object_representations::value, "Alignment causes padding"); static_assert(!has_unique_object_representations::value, "Alignment causes padding"); static_assert(!has_unique_object_representations::value, "Also no arrays that have padding"); struct __attribute__((packed)) PackedNoPadding1 { short i; int j; }; struct __attribute__((packed)) PackedNoPadding2 { int j; short i; }; static_assert(has_unique_object_representations::value, "Packed structs have no padding"); static_assert(has_unique_object_representations::value, "Packed structs have no padding"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); static_assert(!has_unique_object_representations::value, "Functions are not unique"); void foo(){ static auto lambda = []() {}; static_assert(!has_unique_object_representations::value, "Lambdas follow struct rules"); int i; static auto lambda2 = [i]() {}; static_assert(has_unique_object_representations::value, "Lambdas follow struct rules"); } struct PaddedBitfield { char c : 6; char d : 1; }; struct UnPaddedBitfield { char c : 6; char d : 2; }; struct AlignedPaddedBitfield { char c : 6; __attribute__((aligned(1))) char d : 2; }; struct UnnamedBitfield { int named : 8; int : 24; }; struct __attribute__((packed)) UnnamedBitfieldPacked { int named : 8; int : 24; }; struct UnnamedEmptyBitfield { int named; int : 0; }; struct UnnamedEmptyBitfieldSplit { short named; int : 0; short also_named; }; static_assert(!has_unique_object_representations::value, "Bitfield padding"); static_assert(has_unique_object_representations::value, "Bitfield padding"); static_assert(!has_unique_object_representations::value, "Bitfield padding"); static_assert(!has_unique_object_representations::value, "Bitfield padding"); static_assert(!has_unique_object_representations::value, "Bitfield padding"); static_assert(has_unique_object_representations::value, "Bitfield padding"); static_assert(sizeof(UnnamedEmptyBitfieldSplit) != (sizeof(short) * 2), "Wrong size"); static_assert(!has_unique_object_representations::value, "Bitfield padding"); struct BoolBitfield { bool b : 8; }; static_assert(has_unique_object_representations::value, "Bitfield bool"); struct BoolBitfield2 { bool b : 16; }; static_assert(!has_unique_object_representations::value, "Bitfield bool"); struct GreaterSizeBitfield { //expected-warning@+1 {{width of bit-field 'n'}} int n : 1024; }; static_assert(sizeof(GreaterSizeBitfield) == 128, "Bitfield Size"); static_assert(!has_unique_object_representations::value, "Bitfield padding"); struct StructWithRef { int &I; }; static_assert(has_unique_object_representations::value, "References are still unique"); struct NotUniqueBecauseTailPadding { int &r; char a; }; struct CanBeUniqueIfNoPadding : NotUniqueBecauseTailPadding { char b[7]; }; static_assert(!has_unique_object_representations::value, "non trivial"); // Can be unique on Itanium, since the is child class' data is 'folded' into the // parent's tail padding. static_assert(sizeof(CanBeUniqueIfNoPadding) != 16 || has_unique_object_representations::value, "inherit from std layout"); namespace ErrorType { struct S; //expected-note{{forward declaration of 'ErrorType::S'}} struct T { S t; //expected-error{{field has incomplete type 'S'}} }; bool b = __has_unique_object_representations(T); }; static_assert(!has_unique_object_representations<_BitInt(7)>::value, "BitInt:"); static_assert(has_unique_object_representations<_BitInt(8)>::value, "BitInt:"); static_assert(!has_unique_object_representations<_BitInt(127)>::value, "BitInt:"); static_assert(has_unique_object_representations<_BitInt(128)>::value, "BitInt:"); namespace PR46209 { // Foo has both a trivial assignment operator and a non-trivial one. struct Foo { Foo &operator=(const Foo &) & { return *this; } Foo &operator=(const Foo &) && = default; }; // Bar's copy assignment calls Foo's non-trivial assignment. struct Bar { Foo foo; }; static_assert(!__is_trivially_assignable(Foo &, const Foo &), ""); static_assert(!__is_trivially_assignable(Bar &, const Bar &), ""); // Foo2 has both a trivial assignment operator and a non-trivial one. struct Foo2 { Foo2 &operator=(const Foo2 &) & = default; Foo2 &operator=(const Foo2 &) && { return *this; } }; // Bar2's copy assignment calls Foo2's trivial assignment. struct Bar2 { Foo2 foo; }; static_assert(__is_trivially_assignable(Foo2 &, const Foo2 &), ""); static_assert(__is_trivially_assignable(Bar2 &, const Bar2 &), ""); } namespace ConstClass { struct A { A &operator=(const A&) = default; }; struct B { const A a; }; static_assert(!__is_trivially_assignable(B&, const B&), ""); } namespace type_trait_expr_numargs_overflow { // Make sure that TypeTraitExpr can store 16 bits worth of arguments. #define T4(X) X,X,X,X #define T16(X) T4(X),T4(X),T4(X),T4(X) #define T64(X) T16(X),T16(X),T16(X),T16(X) #define T256(X) T64(X),T64(X),T64(X),T64(X) #define T1024(X) T256(X),T256(X),T256(X),T256(X) #define T4096(X) T1024(X),T1024(X),T1024(X),T1024(X) #define T16384(X) T4096(X),T4096(X),T4096(X),T4096(X) #define T32768(X) T16384(X),T16384(X) void test() { (void) __is_constructible(int, T32768(int)); } #undef T4 #undef T16 #undef T64 #undef T256 #undef T1024 #undef T4096 #undef T16384 #undef T32768 } // namespace type_trait_expr_numargs_overflow namespace is_trivially_relocatable { static_assert(!__is_trivially_relocatable(void), ""); static_assert(__is_trivially_relocatable(int), ""); static_assert(__is_trivially_relocatable(int[]), ""); enum Enum {}; static_assert(__is_trivially_relocatable(Enum), ""); static_assert(__is_trivially_relocatable(Enum[]), ""); union Union {int x;}; static_assert(__is_trivially_relocatable(Union), ""); static_assert(__is_trivially_relocatable(Union[]), ""); struct Trivial {}; static_assert(__is_trivially_relocatable(Trivial), ""); static_assert(__is_trivially_relocatable(Trivial[]), ""); struct Incomplete; // expected-note {{forward declaration of 'is_trivially_relocatable::Incomplete'}} bool unused = __is_trivially_relocatable(Incomplete); // expected-error {{incomplete type}} struct NontrivialDtor { ~NontrivialDtor() {} }; static_assert(!__is_trivially_relocatable(NontrivialDtor), ""); static_assert(!__is_trivially_relocatable(NontrivialDtor[]), ""); struct NontrivialCopyCtor { NontrivialCopyCtor(const NontrivialCopyCtor&) {} }; static_assert(!__is_trivially_relocatable(NontrivialCopyCtor), ""); static_assert(!__is_trivially_relocatable(NontrivialCopyCtor[]), ""); struct NontrivialMoveCtor { NontrivialMoveCtor(NontrivialMoveCtor&&) {} }; static_assert(!__is_trivially_relocatable(NontrivialMoveCtor), ""); static_assert(!__is_trivially_relocatable(NontrivialMoveCtor[]), ""); struct [[clang::trivial_abi]] TrivialAbiNontrivialDtor { ~TrivialAbiNontrivialDtor() {} }; static_assert(__is_trivially_relocatable(TrivialAbiNontrivialDtor), ""); static_assert(__is_trivially_relocatable(TrivialAbiNontrivialDtor[]), ""); struct [[clang::trivial_abi]] TrivialAbiNontrivialCopyCtor { TrivialAbiNontrivialCopyCtor(const TrivialAbiNontrivialCopyCtor&) {} }; static_assert(__is_trivially_relocatable(TrivialAbiNontrivialCopyCtor), ""); static_assert(__is_trivially_relocatable(TrivialAbiNontrivialCopyCtor[]), ""); // A more complete set of tests for the behavior of trivial_abi can be found in // clang/test/SemaCXX/attr-trivial-abi.cpp struct [[clang::trivial_abi]] TrivialAbiNontrivialMoveCtor { TrivialAbiNontrivialMoveCtor(TrivialAbiNontrivialMoveCtor&&) {} }; static_assert(__is_trivially_relocatable(TrivialAbiNontrivialMoveCtor), ""); static_assert(__is_trivially_relocatable(TrivialAbiNontrivialMoveCtor[]), ""); } // namespace is_trivially_relocatable namespace is_trivially_equality_comparable { struct ForwardDeclared; // expected-note {{forward declaration of 'is_trivially_equality_comparable::ForwardDeclared'}} static_assert(!__is_trivially_equality_comparable(ForwardDeclared), ""); // expected-error {{incomplete type 'ForwardDeclared' used in type trait expression}} static_assert(!__is_trivially_equality_comparable(void), ""); static_assert(__is_trivially_equality_comparable(int), ""); static_assert(!__is_trivially_equality_comparable(int[]), ""); static_assert(__is_trivially_equality_comparable(int[3]), ""); static_assert(!__is_trivially_equality_comparable(float), ""); static_assert(!__is_trivially_equality_comparable(double), ""); static_assert(!__is_trivially_equality_comparable(long double), ""); struct TriviallyEqualityComparableNoDefaultedComparator { int i; int j; }; static_assert(!__is_trivially_equality_comparable(TriviallyEqualityComparableNoDefaultedComparator), ""); #if __cplusplus >= 202002L struct TriviallyEqualityComparable { int i; int j; void func(); bool operator==(int) const { return false; } bool operator==(const TriviallyEqualityComparable&) const = default; }; static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparable), ""); struct TriviallyEqualityComparableNonTriviallyCopyable { TriviallyEqualityComparableNonTriviallyCopyable(const TriviallyEqualityComparableNonTriviallyCopyable&); ~TriviallyEqualityComparableNonTriviallyCopyable(); bool operator==(const TriviallyEqualityComparableNonTriviallyCopyable&) const = default; int i; }; static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparableNonTriviallyCopyable)); struct NotTriviallyEqualityComparableHasPadding { short i; int j; bool operator==(const NotTriviallyEqualityComparableHasPadding&) const = default; }; static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableHasPadding), ""); struct NotTriviallyEqualityComparableHasFloat { float i; int j; bool operator==(const NotTriviallyEqualityComparableHasFloat&) const = default; }; static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableHasFloat), ""); struct NotTriviallyEqualityComparableHasTailPadding { int i; char j; bool operator==(const NotTriviallyEqualityComparableHasTailPadding&) const = default; }; static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableHasTailPadding), ""); struct NotTriviallyEqualityComparableBase : NotTriviallyEqualityComparableHasTailPadding { char j; bool operator==(const NotTriviallyEqualityComparableBase&) const = default; }; static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableBase), ""); class TriviallyEqualityComparablePaddedOutBase { int i; char c; public: bool operator==(const TriviallyEqualityComparablePaddedOutBase&) const = default; }; static_assert(!__is_trivially_equality_comparable(TriviallyEqualityComparablePaddedOutBase), ""); struct TriviallyEqualityComparablePaddedOut : TriviallyEqualityComparablePaddedOutBase { char j[3]; bool operator==(const TriviallyEqualityComparablePaddedOut&) const = default; }; static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparablePaddedOut), ""); struct TriviallyEqualityComparable1 { char i; bool operator==(const TriviallyEqualityComparable1&) const = default; }; static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparable1)); struct TriviallyEqualityComparable2 { int i; bool operator==(const TriviallyEqualityComparable2&) const = default; }; static_assert(__is_trivially_equality_comparable(TriviallyEqualityComparable2)); struct NotTriviallyEqualityComparableTriviallyEqualityComparableBases : TriviallyEqualityComparable1, TriviallyEqualityComparable2 { bool operator==(const NotTriviallyEqualityComparableTriviallyEqualityComparableBases&) const = default; }; static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableTriviallyEqualityComparableBases)); struct NotTriviallyEqualityComparableBitfield { int i : 1; bool operator==(const NotTriviallyEqualityComparableBitfield&) const = default; }; static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableBitfield)); // TODO: This is trivially equality comparable struct NotTriviallyEqualityComparableBitfieldFilled { char i : __CHAR_BIT__; bool operator==(const NotTriviallyEqualityComparableBitfieldFilled&) const = default; }; static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableBitfield)); union U { int i; bool operator==(const U&) const = default; }; struct NotTriviallyEqualityComparableImplicitlyDeletedOperatorByUnion { U u; bool operator==(const NotTriviallyEqualityComparableImplicitlyDeletedOperatorByUnion&) const = default; }; static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableImplicitlyDeletedOperatorByUnion)); struct NotTriviallyEqualityComparableExplicitlyDeleted { int i; bool operator==(const NotTriviallyEqualityComparableExplicitlyDeleted&) const = delete; }; struct NotTriviallyEqualityComparableImplicitlyDeletedOperatorByStruct { NotTriviallyEqualityComparableExplicitlyDeleted u; bool operator==(const NotTriviallyEqualityComparableImplicitlyDeletedOperatorByStruct&) const = default; }; static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableImplicitlyDeletedOperatorByStruct)); struct NotTriviallyEqualityComparableHasReferenceMember { int& i; bool operator==(const NotTriviallyEqualityComparableHasReferenceMember&) const = default; }; static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableHasReferenceMember)); enum E { a, b }; bool operator==(E, E) { return false; } static_assert(!__is_trivially_equality_comparable(E)); struct NotTriviallyEqualityComparableHasEnum { E e; bool operator==(const NotTriviallyEqualityComparableHasEnum&) const = default; }; static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableHasEnum)); #endif // __cplusplus >= 202002L }; namespace can_pass_in_regs { struct A { }; struct B { ~B(); }; struct C; // expected-note {{forward declaration}} union D { int x; }; static_assert(__can_pass_in_regs(A), ""); static_assert(__can_pass_in_regs(A), ""); static_assert(!__can_pass_in_regs(B), ""); static_assert(__can_pass_in_regs(D), ""); void test_errors() { (void)__can_pass_in_regs(const A); // expected-error {{not an unqualified class type}} (void)__can_pass_in_regs(A&); // expected-error {{not an unqualified class type}} (void)__can_pass_in_regs(A&&); // expected-error {{not an unqualified class type}} (void)__can_pass_in_regs(const A&); // expected-error {{not an unqualified class type}} (void)__can_pass_in_regs(C); // expected-error {{incomplete type}} (void)__can_pass_in_regs(int); // expected-error {{not an unqualified class type}} (void)__can_pass_in_regs(int&); // expected-error {{not an unqualified class type}} } } struct S {}; template using remove_const_t = __remove_const(T); void check_remove_const() { static_assert(__is_same(remove_const_t, void), ""); static_assert(__is_same(remove_const_t, void), ""); static_assert(__is_same(remove_const_t, int), ""); static_assert(__is_same(remove_const_t, int), ""); static_assert(__is_same(remove_const_t, volatile int), ""); static_assert(__is_same(remove_const_t, volatile int), ""); static_assert(__is_same(remove_const_t, int *), ""); static_assert(__is_same(remove_const_t, int *), ""); static_assert(__is_same(remove_const_t, int const *), ""); static_assert(__is_same(remove_const_t, int const *__restrict), ""); static_assert(__is_same(remove_const_t, int &), ""); static_assert(__is_same(remove_const_t, int const &), ""); static_assert(__is_same(remove_const_t, int &&), ""); static_assert(__is_same(remove_const_t, int const &&), ""); static_assert(__is_same(remove_const_t, int()), ""); static_assert(__is_same(remove_const_t, int (*)()), ""); static_assert(__is_same(remove_const_t, int (&)()), ""); static_assert(__is_same(remove_const_t, S), ""); static_assert(__is_same(remove_const_t, S), ""); static_assert(__is_same(remove_const_t, volatile S), ""); static_assert(__is_same(remove_const_t, S *__restrict), ""); static_assert(__is_same(remove_const_t, volatile S), ""); static_assert(__is_same(remove_const_t, S *volatile __restrict), ""); static_assert(__is_same(remove_const_t, int S::*), ""); static_assert(__is_same(remove_const_t, int(S::*)()), ""); } template using remove_restrict_t = __remove_restrict(T); void check_remove_restrict() { static_assert(__is_same(remove_restrict_t, void), ""); static_assert(__is_same(remove_restrict_t, int), ""); static_assert(__is_same(remove_restrict_t, const int), ""); static_assert(__is_same(remove_restrict_t, volatile int), ""); static_assert(__is_same(remove_restrict_t, int *), ""); static_assert(__is_same(remove_restrict_t, int *const volatile), ""); static_assert(__is_same(remove_restrict_t, int *), ""); static_assert(__is_same(remove_restrict_t, int *), ""); static_assert(__is_same(remove_restrict_t, int &), ""); static_assert(__is_same(remove_restrict_t, int &), ""); static_assert(__is_same(remove_restrict_t, int &&), ""); static_assert(__is_same(remove_restrict_t, int &&), ""); static_assert(__is_same(remove_restrict_t, int()), ""); static_assert(__is_same(remove_restrict_t, int (*const volatile)()), ""); static_assert(__is_same(remove_restrict_t, int (&)()), ""); static_assert(__is_same(remove_restrict_t, S), ""); static_assert(__is_same(remove_restrict_t, const S), ""); static_assert(__is_same(remove_restrict_t, volatile S), ""); static_assert(__is_same(remove_restrict_t, S *), ""); static_assert(__is_same(remove_restrict_t, S *const volatile), ""); static_assert(__is_same(remove_restrict_t, int S::*), ""); static_assert(__is_same(remove_restrict_t, int(S::*const volatile)()), ""); } template using remove_volatile_t = __remove_volatile(T); void check_remove_volatile() { static_assert(__is_same(remove_volatile_t, void), ""); static_assert(__is_same(remove_volatile_t, void), ""); static_assert(__is_same(remove_volatile_t, int), ""); static_assert(__is_same(remove_volatile_t, const int), ""); static_assert(__is_same(remove_volatile_t, int), ""); static_assert(__is_same(remove_volatile_t, int *__restrict), ""); static_assert(__is_same(remove_volatile_t, const int), ""); static_assert(__is_same(remove_volatile_t, int *const __restrict), ""); static_assert(__is_same(remove_volatile_t, int *), ""); static_assert(__is_same(remove_volatile_t, int *), ""); static_assert(__is_same(remove_volatile_t, int volatile *), ""); static_assert(__is_same(remove_volatile_t, int &), ""); static_assert(__is_same(remove_volatile_t, int volatile &), ""); static_assert(__is_same(remove_volatile_t, int &&), ""); static_assert(__is_same(remove_volatile_t, int volatile &&), ""); static_assert(__is_same(remove_volatile_t, int()), ""); static_assert(__is_same(remove_volatile_t, int (*)()), ""); static_assert(__is_same(remove_volatile_t, int (&)()), ""); static_assert(__is_same(remove_volatile_t, S), ""); static_assert(__is_same(remove_volatile_t, const S), ""); static_assert(__is_same(remove_volatile_t, S), ""); static_assert(__is_same(remove_volatile_t, const S), ""); static_assert(__is_same(remove_volatile_t, int S::*), ""); static_assert(__is_same(remove_volatile_t, int(S::*)()), ""); } template using remove_cv_t = __remove_cv(T); void check_remove_cv() { static_assert(__is_same(remove_cv_t, void), ""); static_assert(__is_same(remove_cv_t, void), ""); static_assert(__is_same(remove_cv_t, int), ""); static_assert(__is_same(remove_cv_t, int), ""); static_assert(__is_same(remove_cv_t, int), ""); static_assert(__is_same(remove_cv_t, int), ""); static_assert(__is_same(remove_cv_t, int *), ""); static_assert(__is_same(remove_cv_t, int *), ""); static_assert(__is_same(remove_cv_t, int const *), ""); static_assert(__is_same(remove_cv_t, int const *__restrict), ""); static_assert(__is_same(remove_cv_t, int const *_Nonnull), ""); static_assert(__is_same(remove_cv_t, int &), ""); static_assert(__is_same(remove_cv_t, int const volatile &), ""); static_assert(__is_same(remove_cv_t, int &&), ""); static_assert(__is_same(remove_cv_t, int const volatile &&), ""); static_assert(__is_same(remove_cv_t, int()), ""); static_assert(__is_same(remove_cv_t, int (*)()), ""); static_assert(__is_same(remove_cv_t, int (&)()), ""); static_assert(__is_same(remove_cv_t, S), ""); static_assert(__is_same(remove_cv_t, S), ""); static_assert(__is_same(remove_cv_t, S), ""); static_assert(__is_same(remove_cv_t, S), ""); static_assert(__is_same(remove_cv_t, int S::*), ""); static_assert(__is_same(remove_cv_t, int(S::*)()), ""); } template using add_pointer_t = __add_pointer(T); void add_pointer() { static_assert(__is_same(add_pointer_t, void *), ""); static_assert(__is_same(add_pointer_t, const void *), ""); static_assert(__is_same(add_pointer_t, volatile void *), ""); static_assert(__is_same(add_pointer_t, const volatile void *), ""); static_assert(__is_same(add_pointer_t, int *), ""); static_assert(__is_same(add_pointer_t, const int *), ""); static_assert(__is_same(add_pointer_t, volatile int *), ""); static_assert(__is_same(add_pointer_t, const volatile int *), ""); static_assert(__is_same(add_pointer_t, int **), ""); static_assert(__is_same(add_pointer_t, int *), ""); static_assert(__is_same(add_pointer_t, int *), ""); static_assert(__is_same(add_pointer_t, int (*)()), ""); static_assert(__is_same(add_pointer_t, int (**)()), ""); static_assert(__is_same(add_pointer_t, int (*)()), ""); static_assert(__is_same(add_pointer_t, S *), ""); static_assert(__is_same(add_pointer_t, const S *), ""); static_assert(__is_same(add_pointer_t, volatile S *), ""); static_assert(__is_same(add_pointer_t, const volatile S *), ""); static_assert(__is_same(add_pointer_t, int S::**), ""); static_assert(__is_same(add_pointer_t, int(S::**)()), ""); static_assert(__is_same(add_pointer_t, int __attribute__((address_space(1))) *), ""); static_assert(__is_same(add_pointer_t, S __attribute__((address_space(2))) *), ""); } template using remove_pointer_t = __remove_pointer(T); void remove_pointer() { static_assert(__is_same(remove_pointer_t, void), ""); static_assert(__is_same(remove_pointer_t, const void), ""); static_assert(__is_same(remove_pointer_t, volatile void), ""); static_assert(__is_same(remove_pointer_t, const volatile void), ""); static_assert(__is_same(remove_pointer_t, int), ""); static_assert(__is_same(remove_pointer_t, const int), ""); static_assert(__is_same(remove_pointer_t, volatile int), ""); static_assert(__is_same(remove_pointer_t, const volatile int), ""); static_assert(__is_same(remove_pointer_t, int), ""); static_assert(__is_same(remove_pointer_t, const int), ""); static_assert(__is_same(remove_pointer_t, volatile int), ""); static_assert(__is_same(remove_pointer_t, const volatile int), ""); static_assert(__is_same(remove_pointer_t, int), ""); static_assert(__is_same(remove_pointer_t, int), ""); static_assert(__is_same(remove_pointer_t, int), ""); static_assert(__is_same(remove_pointer_t, int &), ""); static_assert(__is_same(remove_pointer_t, int &&), ""); static_assert(__is_same(remove_pointer_t, int()), ""); static_assert(__is_same(remove_pointer_t, int()), ""); static_assert(__is_same(remove_pointer_t, int (&)()), ""); static_assert(__is_same(remove_pointer_t, S), ""); static_assert(__is_same(remove_pointer_t, const S), ""); static_assert(__is_same(remove_pointer_t, volatile S), ""); static_assert(__is_same(remove_pointer_t, const volatile S), ""); static_assert(__is_same(remove_pointer_t, int S::*), ""); static_assert(__is_same(remove_pointer_t, int(S::*)()), ""); static_assert(__is_same(remove_pointer_t, int __attribute__((address_space(1)))), ""); static_assert(__is_same(remove_pointer_t, S __attribute__((address_space(2)))), ""); static_assert(__is_same(remove_pointer_t, int (^)(char)), ""); } template using add_lvalue_reference_t = __add_lvalue_reference(T); void add_lvalue_reference() { static_assert(__is_same(add_lvalue_reference_t, void), ""); static_assert(__is_same(add_lvalue_reference_t, const void), ""); static_assert(__is_same(add_lvalue_reference_t, volatile void), ""); static_assert(__is_same(add_lvalue_reference_t, const volatile void), ""); static_assert(__is_same(add_lvalue_reference_t, int &), ""); static_assert(__is_same(add_lvalue_reference_t, const int &), ""); static_assert(__is_same(add_lvalue_reference_t, volatile int &), ""); static_assert(__is_same(add_lvalue_reference_t, const volatile int &), ""); static_assert(__is_same(add_lvalue_reference_t, int *&), ""); static_assert(__is_same(add_lvalue_reference_t, int &), ""); static_assert(__is_same(add_lvalue_reference_t, int &), ""); // reference collapsing static_assert(__is_same(add_lvalue_reference_t, int (&)()), ""); static_assert(__is_same(add_lvalue_reference_t, int (*&)()), ""); static_assert(__is_same(add_lvalue_reference_t, int (&)()), ""); static_assert(__is_same(add_lvalue_reference_t, S &), ""); static_assert(__is_same(add_lvalue_reference_t, const S &), ""); static_assert(__is_same(add_lvalue_reference_t, volatile S &), ""); static_assert(__is_same(add_lvalue_reference_t, const volatile S &), ""); static_assert(__is_same(add_lvalue_reference_t, int S::*&), ""); static_assert(__is_same(add_lvalue_reference_t, int(S::*&)()), ""); } template using add_rvalue_reference_t = __add_rvalue_reference(T); void add_rvalue_reference() { static_assert(__is_same(add_rvalue_reference_t, void), ""); static_assert(__is_same(add_rvalue_reference_t, const void), ""); static_assert(__is_same(add_rvalue_reference_t, volatile void), ""); static_assert(__is_same(add_rvalue_reference_t, const volatile void), ""); static_assert(__is_same(add_rvalue_reference_t, int &&), ""); static_assert(__is_same(add_rvalue_reference_t, const int &&), ""); static_assert(__is_same(add_rvalue_reference_t, volatile int &&), ""); static_assert(__is_same(add_rvalue_reference_t, const volatile int &&), ""); static_assert(__is_same(add_rvalue_reference_t, int *&&), ""); static_assert(__is_same(add_rvalue_reference_t, int &), ""); // reference collapsing static_assert(__is_same(add_rvalue_reference_t, int &&), ""); static_assert(__is_same(add_rvalue_reference_t, int(&&)()), ""); static_assert(__is_same(add_rvalue_reference_t, int (*&&)()), ""); static_assert(__is_same(add_rvalue_reference_t, int (&)()), ""); // reference collapsing static_assert(__is_same(add_rvalue_reference_t, S &&), ""); static_assert(__is_same(add_rvalue_reference_t, const S &&), ""); static_assert(__is_same(add_rvalue_reference_t, volatile S &&), ""); static_assert(__is_same(add_rvalue_reference_t, const volatile S &&), ""); static_assert(__is_same(add_rvalue_reference_t, int S::*&&), ""); static_assert(__is_same(add_rvalue_reference_t, int(S::* &&)()), ""); } template using remove_reference_t = __remove_reference_t(T); void check_remove_reference() { static_assert(__is_same(remove_reference_t, void), ""); static_assert(__is_same(remove_reference_t, const volatile void), ""); static_assert(__is_same(remove_reference_t, int), ""); static_assert(__is_same(remove_reference_t, const int), ""); static_assert(__is_same(remove_reference_t, volatile int), ""); static_assert(__is_same(remove_reference_t, const volatile int), ""); static_assert(__is_same(remove_reference_t, int *), ""); static_assert(__is_same(remove_reference_t, int *const volatile), ""); static_assert(__is_same(remove_reference_t, int const *const volatile), ""); static_assert(__is_same(remove_reference_t, int), ""); static_assert(__is_same(remove_reference_t, int const volatile), ""); static_assert(__is_same(remove_reference_t, int), ""); static_assert(__is_same(remove_reference_t, int const volatile), ""); static_assert(__is_same(remove_reference_t, int()), ""); static_assert(__is_same(remove_reference_t, int (*const volatile)()), ""); static_assert(__is_same(remove_reference_t, int()), ""); static_assert(__is_same(remove_reference_t, S), ""); static_assert(__is_same(remove_reference_t, S), ""); static_assert(__is_same(remove_reference_t, S), ""); static_assert(__is_same(remove_reference_t, const S), ""); static_assert(__is_same(remove_reference_t, const S), ""); static_assert(__is_same(remove_reference_t, const S), ""); static_assert(__is_same(remove_reference_t, volatile S), ""); static_assert(__is_same(remove_reference_t, volatile S), ""); static_assert(__is_same(remove_reference_t, volatile S), ""); static_assert(__is_same(remove_reference_t, const volatile S), ""); static_assert(__is_same(remove_reference_t, const volatile S), ""); static_assert(__is_same(remove_reference_t, const volatile S), ""); static_assert(__is_same(remove_reference_t, int S::*const volatile), ""); static_assert(__is_same(remove_reference_t, int(S::*const volatile)()), ""); static_assert(__is_same(remove_reference_t, int(S::*const volatile)() &), ""); } template using remove_cvref_t = __remove_cvref(T); void check_remove_cvref() { static_assert(__is_same(remove_cvref_t, void), ""); static_assert(__is_same(remove_cvref_t, void), ""); static_assert(__is_same(remove_cvref_t, int), ""); static_assert(__is_same(remove_cvref_t, int), ""); static_assert(__is_same(remove_cvref_t, int), ""); static_assert(__is_same(remove_cvref_t, int), ""); static_assert(__is_same(remove_cvref_t, int *), ""); static_assert(__is_same(remove_cvref_t, int *), ""); static_assert(__is_same(remove_cvref_t, int const *), ""); static_assert(__is_same(remove_cvref_t, int const *__restrict), ""); static_assert(__is_same(remove_cvref_t, int const *_Nonnull), ""); static_assert(__is_same(remove_cvref_t, int), ""); static_assert(__is_same(remove_cvref_t, int), ""); static_assert(__is_same(remove_cvref_t, int), ""); static_assert(__is_same(remove_cvref_t, int), ""); static_assert(__is_same(remove_cvref_t, int()), ""); static_assert(__is_same(remove_cvref_t, int (*)()), ""); static_assert(__is_same(remove_cvref_t, int()), ""); static_assert(__is_same(remove_cvref_t, S), ""); static_assert(__is_same(remove_cvref_t, S), ""); static_assert(__is_same(remove_cvref_t, S), ""); static_assert(__is_same(remove_cvref_t, S), ""); static_assert(__is_same(remove_cvref_t, S), ""); static_assert(__is_same(remove_cvref_t, S), ""); static_assert(__is_same(remove_cvref_t, S), ""); static_assert(__is_same(remove_cvref_t, S), ""); static_assert(__is_same(remove_cvref_t, S), ""); static_assert(__is_same(remove_cvref_t, S), ""); static_assert(__is_same(remove_cvref_t, S), ""); static_assert(__is_same(remove_cvref_t, S), ""); static_assert(__is_same(remove_cvref_t, int S::*), ""); static_assert(__is_same(remove_cvref_t, int(S::*)()), ""); static_assert(__is_same(remove_cvref_t, int(S::*)() &), ""); static_assert(__is_same(remove_cvref_t, int(S::*)() &&), ""); } template using decay_t = __decay(T); void check_decay() { static_assert(__is_same(decay_t, void), ""); static_assert(__is_same(decay_t, void), ""); static_assert(__is_same(decay_t, int), ""); static_assert(__is_same(decay_t, int), ""); static_assert(__is_same(decay_t, int), ""); static_assert(__is_same(decay_t, int), ""); static_assert(__is_same(decay_t, int *), ""); static_assert(__is_same(decay_t, int *), ""); static_assert(__is_same(decay_t, int *), ""); static_assert(__is_same(decay_t, int const *), ""); static_assert(__is_same(decay_t, int const *), ""); static_assert(__is_same(decay_t, int), ""); static_assert(__is_same(decay_t, int), ""); static_assert(__is_same(decay_t, int), ""); static_assert(__is_same(decay_t, int), ""); static_assert(__is_same(decay_t, int (*)()), ""); static_assert(__is_same(decay_t, int (*)()), ""); static_assert(__is_same(decay_t, int (*)()), ""); static_assert(__is_same(decay_t, int (*)()), ""); static_assert(__is_same(decay_t, int (*)()), ""); static_assert(__is_same(decay_t, int (*)()), ""); static_assert(__is_same(decay_t, int *), ""); static_assert(__is_same(decay_t, int *), ""); static_assert(__is_same(decay_t, S), ""); static_assert(__is_same(decay_t, S), ""); static_assert(__is_same(decay_t, S), ""); static_assert(__is_same(decay_t, S), ""); static_assert(__is_same(decay_t, S), ""); static_assert(__is_same(decay_t, S), ""); static_assert(__is_same(decay_t, S), ""); static_assert(__is_same(decay_t, S), ""); static_assert(__is_same(decay_t, S), ""); static_assert(__is_same(decay_t, S), ""); static_assert(__is_same(decay_t, S), ""); static_assert(__is_same(decay_t, S), ""); static_assert(__is_same(decay_t, int S::*), ""); static_assert(__is_same(decay_t, int(S::*)()), ""); static_assert(__is_same(decay_t, int S::*), ""); static_assert(__is_same(decay_t, int(S::*)()), ""); static_assert(__is_same(decay_t, int S::*), ""); } template struct CheckAbominableFunction {}; template struct CheckAbominableFunction { static void checks() { static_assert(__is_same(add_lvalue_reference_t, M), ""); static_assert(__is_same(add_pointer_t, M), ""); static_assert(__is_same(add_rvalue_reference_t, M), ""); static_assert(__is_same(decay_t, M), ""); static_assert(__is_same(remove_const_t, M), ""); static_assert(__is_same(remove_volatile_t, M), ""); static_assert(__is_same(remove_cv_t, M), ""); static_assert(__is_same(remove_cvref_t, M), ""); static_assert(__is_same(remove_pointer_t, M), ""); static_assert(__is_same(remove_reference_t, M), ""); static_assert(!__is_referenceable(M), ""); } }; void check_abominable_function() { { CheckAbominableFunction x; } { CheckAbominableFunction x; } { CheckAbominableFunction x; } { CheckAbominableFunction x; } { CheckAbominableFunction x; } { CheckAbominableFunction x; } { CheckAbominableFunction x; } { CheckAbominableFunction x; } { CheckAbominableFunction x; } { CheckAbominableFunction x; } { CheckAbominableFunction x; } } template using make_signed_t = __make_signed(T); template void check_make_signed() { static_assert(__is_same(make_signed_t, Expected), ""); static_assert(__is_same(make_signed_t, const Expected), ""); static_assert(__is_same(make_signed_t, volatile Expected), ""); static_assert(__is_same(make_signed_t, const volatile Expected), ""); } #if defined(__ILP32__) || defined(__LLP64__) using Int64 = long long; using UInt64 = unsigned long long; #elif defined(__LP64__) || defined(__ILP64__) || defined(__SILP64__) using Int64 = long; using UInt64 = unsigned long; #else #error Programming model currently unsupported; please add a new entry. #endif enum UnscopedBool : bool {}; // deliberately char enum class ScopedBool : bool {}; // deliberately char enum UnscopedChar : char {}; // deliberately char enum class ScopedChar : char {}; // deliberately char enum UnscopedUChar : unsigned char {}; enum class ScopedUChar : unsigned char {}; enum UnscopedLongLong : long long {}; enum UnscopedULongLong : unsigned long long {}; enum class ScopedLongLong : long long {}; enum class ScopedULongLong : unsigned long long {}; enum class UnscopedInt128 : __int128 {}; enum class ScopedInt128 : __int128 {}; enum class UnscopedUInt128 : unsigned __int128 {}; enum class ScopedUInt128 : unsigned __int128 {}; enum UnscopedBit : unsigned _BitInt(1) {}; enum ScopedBit : unsigned _BitInt(1) {}; enum UnscopedIrregular : _BitInt(21) {}; enum UnscopedUIrregular : unsigned _BitInt(21) {}; enum class ScopedIrregular : _BitInt(21) {}; enum class ScopedUIrregular : unsigned _BitInt(21) {}; void make_signed() { check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed<__int128, __int128>(); check_make_signed<__uint128_t, __int128>(); check_make_signed<_BitInt(65), _BitInt(65)>(); check_make_signed(); check_make_signed(); #if __cplusplus >= 202002L check_make_signed(); #endif #if __cplusplus >= 201103L check_make_signed(); check_make_signed(); #endif check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); check_make_signed(); { using ExpectedError = __make_signed(bool); } // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'bool'}} { using ExpectedError = __make_signed(UnscopedBool); } // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'UnscopedBool' whose underlying type is 'bool'}} { using ExpectedError = __make_signed(ScopedBool); } // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'ScopedBool' whose underlying type is 'bool'}} { using ExpectedError = __make_signed(unsigned _BitInt(1)); } // expected-error@*:*{{'make_signed' is only compatible with non-_BitInt(1) integers and enum types, but was given 'unsigned _BitInt(1)'}} { using ExpectedError = __make_signed(UnscopedBit); } // expected-error@*:*{{'make_signed' is only compatible with non-_BitInt(1) integers and enum types, but was given 'UnscopedBit' whose underlying type is 'unsigned _BitInt(1)'}} { using ExpectedError = __make_signed(ScopedBit); } // expected-error@*:*{{'make_signed' is only compatible with non-_BitInt(1) integers and enum types, but was given 'ScopedBit' whose underlying type is 'unsigned _BitInt(1)'}} { using ExpectedError = __make_signed(int[]); } // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'int[]'}} { using ExpectedError = __make_signed(int[5]); } // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'int[5]'}} { using ExpectedError = __make_signed(void); } // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'void'}} { using ExpectedError = __make_signed(int *); } // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'int *'}} { using ExpectedError = __make_signed(int &); } // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'int &'}} { using ExpectedError = __make_signed(int &&); } // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'int &&'}} { using ExpectedError = __make_signed(float); } // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'float'}} { using ExpectedError = __make_signed(double); } // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'double'}} { using ExpectedError = __make_signed(long double); } // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'long double'}} { using ExpectedError = __make_signed(S); } // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'S'}} { using ExpectedError = __make_signed(S *); } // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'S *'}} { using ExpectedError = __make_signed(int S::*); } // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'int S::*'}} { using ExpectedError = __make_signed(int(S::*)()); } // expected-error@*:*{{'make_signed' is only compatible with non-bool integers and enum types, but was given 'int (S::*)()'}} } template using make_unsigned_t = __make_unsigned(T); template void check_make_unsigned() { static_assert(__is_same(make_unsigned_t, Expected), ""); static_assert(__is_same(make_unsigned_t, const Expected), ""); static_assert(__is_same(make_unsigned_t, volatile Expected), ""); static_assert(__is_same(make_unsigned_t, const volatile Expected), ""); } void make_unsigned() { check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned<__int128, __uint128_t>(); check_make_unsigned<__uint128_t, __uint128_t>(); check_make_unsigned<_BitInt(65), unsigned _BitInt(65)>(); check_make_unsigned(); check_make_unsigned(); #if __cplusplus >= 202002L check_make_unsigned(); #endif #if __cplusplus >= 201103L check_make_unsigned(); check_make_unsigned(); #endif check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); check_make_unsigned(); { using ExpectedError = __make_unsigned(bool); } // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'bool'}} { using ExpectedError = __make_unsigned(UnscopedBool); } // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'UnscopedBool' whose underlying type is 'bool'}} { using ExpectedError = __make_unsigned(ScopedBool); } // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'ScopedBool' whose underlying type is 'bool'}} { using ExpectedError = __make_unsigned(unsigned _BitInt(1)); } // expected-error@*:*{{'make_unsigned' is only compatible with non-_BitInt(1) integers and enum types, but was given 'unsigned _BitInt(1)'}} { using ExpectedError = __make_unsigned(UnscopedBit); } // expected-error@*:*{{'make_unsigned' is only compatible with non-_BitInt(1) integers and enum types, but was given 'UnscopedBit'}} { using ExpectedError = __make_unsigned(ScopedBit); } // expected-error@*:*{{'make_unsigned' is only compatible with non-_BitInt(1) integers and enum types, but was given 'ScopedBit'}} { using ExpectedError = __make_unsigned(int[]); } // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'int[]'}} { using ExpectedError = __make_unsigned(int[5]); } // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'int[5]'}} { using ExpectedError = __make_unsigned(void); } // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'void'}} { using ExpectedError = __make_unsigned(int *); } // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'int *'}} { using ExpectedError = __make_unsigned(int &); } // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'int &'}} { using ExpectedError = __make_unsigned(int &&); } // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'int &&'}} { using ExpectedError = __make_unsigned(float); } // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'float'}} { using ExpectedError = __make_unsigned(double); } // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'double'}} { using ExpectedError = __make_unsigned(long double); } // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'long double'}} { using ExpectedError = __make_unsigned(S); } // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'S'}} { using ExpectedError = __make_unsigned(S *); } // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'S *'}} { using ExpectedError = __make_unsigned(int S::*); } // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'int S::*'}} { using ExpectedError = __make_unsigned(int(S::*)()); } // expected-error@*:*{{'make_unsigned' is only compatible with non-bool integers and enum types, but was given 'int (S::*)()'}} } template using remove_extent_t = __remove_extent(T); void remove_extent() { static_assert(__is_same(remove_extent_t, void), ""); static_assert(__is_same(remove_extent_t, int), ""); static_assert(__is_same(remove_extent_t, int), ""); static_assert(__is_same(remove_extent_t, int), ""); static_assert(__is_same(remove_extent_t, int[2]), ""); static_assert(__is_same(remove_extent_t, int[2]), ""); static_assert(__is_same(remove_extent_t, const int), ""); static_assert(__is_same(remove_extent_t, const int), ""); static_assert(__is_same(remove_extent_t, const int[2]), ""); static_assert(__is_same(remove_extent_t, const int[2]), ""); static_assert(__is_same(remove_extent_t, volatile int), ""); static_assert(__is_same(remove_extent_t, volatile int), ""); static_assert(__is_same(remove_extent_t, volatile int[2]), ""); static_assert(__is_same(remove_extent_t, volatile int[2]), ""); static_assert(__is_same(remove_extent_t, const volatile int), ""); static_assert(__is_same(remove_extent_t, const volatile int), ""); static_assert(__is_same(remove_extent_t, const volatile int[2]), ""); static_assert(__is_same(remove_extent_t, const volatile int[2]), ""); static_assert(__is_same(remove_extent_t, int *), ""); static_assert(__is_same(remove_extent_t, int &), ""); static_assert(__is_same(remove_extent_t, int &&), ""); static_assert(__is_same(remove_extent_t, int()), ""); static_assert(__is_same(remove_extent_t, int (*)()), ""); static_assert(__is_same(remove_extent_t, int (&)()), ""); static_assert(__is_same(remove_extent_t, S), ""); static_assert(__is_same(remove_extent_t, int S::*), ""); static_assert(__is_same(remove_extent_t, int(S::*)()), ""); using SomeArray = int[1][2]; static_assert(__is_same(remove_extent_t, const int[2]), ""); } template using remove_all_extents_t = __remove_all_extents(T); void remove_all_extents() { static_assert(__is_same(remove_all_extents_t, void), ""); static_assert(__is_same(remove_all_extents_t, int), ""); static_assert(__is_same(remove_all_extents_t, const int), ""); static_assert(__is_same(remove_all_extents_t, volatile int), ""); static_assert(__is_same(remove_all_extents_t, const volatile int), ""); static_assert(__is_same(remove_all_extents_t, int), ""); static_assert(__is_same(remove_all_extents_t, int), ""); static_assert(__is_same(remove_all_extents_t, int), ""); static_assert(__is_same(remove_all_extents_t, int), ""); static_assert(__is_same(remove_all_extents_t, const int), ""); static_assert(__is_same(remove_all_extents_t, const int), ""); static_assert(__is_same(remove_all_extents_t, const int), ""); static_assert(__is_same(remove_all_extents_t, const int), ""); static_assert(__is_same(remove_all_extents_t, volatile int), ""); static_assert(__is_same(remove_all_extents_t, volatile int), ""); static_assert(__is_same(remove_all_extents_t, volatile int), ""); static_assert(__is_same(remove_all_extents_t, volatile int), ""); static_assert(__is_same(remove_all_extents_t, const volatile int), ""); static_assert(__is_same(remove_all_extents_t, const volatile int), ""); static_assert(__is_same(remove_all_extents_t, const volatile int), ""); static_assert(__is_same(remove_all_extents_t, const volatile int), ""); static_assert(__is_same(remove_all_extents_t, int *), ""); static_assert(__is_same(remove_all_extents_t, int &), ""); static_assert(__is_same(remove_all_extents_t, int &&), ""); static_assert(__is_same(remove_all_extents_t, int()), ""); static_assert(__is_same(remove_all_extents_t, int (*)()), ""); static_assert(__is_same(remove_all_extents_t, int (&)()), ""); static_assert(__is_same(remove_all_extents_t, S), ""); static_assert(__is_same(remove_all_extents_t, int S::*), ""); static_assert(__is_same(remove_all_extents_t, int(S::*)()), ""); using SomeArray = int[1][2]; static_assert(__is_same(remove_all_extents_t, const int), ""); }