llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-format Author: Matthias Wippich (Tsche) <details> <summary>Changes</summary> This patch moves all traits to a tablegen file. The motivation for this change is a review comment in https://github.com/llvm/llvm-project/pull/142341 - since then about a year has passed and we've accumulated 9 standard names that are maintained separately from their corresponding trait definitions. While this is still a reasonably low number, it is definitely going to keep increasing. --- Patch is 64.75 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/201491.diff 36 Files Affected: - (modified) clang/include/clang/AST/TypeBase.h (+1-1) - (modified) clang/include/clang/Basic/CMakeLists.txt (+4) - (modified) clang/include/clang/Basic/ExpressionTraits.h (+2-2) - (modified) clang/include/clang/Basic/Specifiers.h (+1-1) - (modified) clang/include/clang/Basic/TokenKinds.def (+3-137) - (added) clang/include/clang/Basic/Traits.td (+556) - (removed) clang/include/clang/Basic/TransformTypeTraits.def (-29) - (modified) clang/include/clang/Basic/TypeTraits.h (+18-35) - (modified) clang/include/clang/Sema/DeclSpec.h (+2-2) - (modified) clang/lib/AST/ItaniumMangle.cpp (+1-1) - (modified) clang/lib/AST/JSONNodeDumper.cpp (+1-1) - (modified) clang/lib/AST/TextNodeDumper.cpp (+1-1) - (modified) clang/lib/AST/TypePrinter.cpp (+1-1) - (modified) clang/lib/ASTMatchers/Dynamic/Marshallers.cpp (+1-1) - (modified) clang/lib/ASTMatchers/Dynamic/Marshallers.h (+1-1) - (modified) clang/lib/Basic/ExpressionTraits.cpp (+2-2) - (modified) clang/lib/Basic/TypeTraits.cpp (+9-48) - (modified) clang/lib/Format/FormatToken.h (+1-1) - (modified) clang/lib/Format/TokenAnnotator.cpp (+1-1) - (modified) clang/lib/Lex/Lexer.cpp (+1-1) - (modified) clang/lib/Lex/PPMacroExpansion.cpp (+1-1) - (modified) clang/lib/Parse/ParseDecl.cpp (+1-1) - (modified) clang/lib/Parse/ParseDeclCXX.cpp (+25-57) - (modified) clang/lib/Parse/ParseExpr.cpp (+2-2) - (modified) clang/lib/Parse/ParseExprCXX.cpp (+8-7) - (modified) clang/lib/Parse/ParseStmt.cpp (+1-1) - (modified) clang/lib/Parse/ParseTentative.cpp (+3-3) - (modified) clang/lib/Sema/DeclSpec.cpp (+6-4) - (modified) clang/lib/Sema/SemaDecl.cpp (+1-1) - (modified) clang/lib/Sema/SemaTemplateVariadic.cpp (+1-1) - (modified) clang/lib/Sema/SemaType.cpp (+2-2) - (modified) clang/lib/Sema/SemaTypeTraits.cpp (+2-10) - (modified) clang/utils/TableGen/CMakeLists.txt (+1) - (added) clang/utils/TableGen/ClangTraitsEmitter.cpp (+195) - (modified) clang/utils/TableGen/TableGen.cpp (+11-5) - (modified) clang/utils/TableGen/TableGenBackends.h (+2) ``````````diff diff --git a/clang/include/clang/AST/TypeBase.h b/clang/include/clang/AST/TypeBase.h index c64eee11fd91e..fac1e9c9eb92f 100644 --- a/clang/include/clang/AST/TypeBase.h +++ b/clang/include/clang/AST/TypeBase.h @@ -6463,7 +6463,7 @@ class UnaryTransformType : public Type, public llvm::FoldingSetNode { public: enum UTTKind { #define TRANSFORM_TYPE_TRAIT_DEF(Enum, _) Enum, -#include "clang/Basic/TransformTypeTraits.def" +#include "clang/Basic/Traits.inc" }; private: diff --git a/clang/include/clang/Basic/CMakeLists.txt b/clang/include/clang/Basic/CMakeLists.txt index 20172622ca424..0dbbfffc7ed51 100644 --- a/clang/include/clang/Basic/CMakeLists.txt +++ b/clang/include/clang/Basic/CMakeLists.txt @@ -150,6 +150,10 @@ clang_tablegen(BuiltinTemplates.inc -gen-clang-builtin-templates SOURCE BuiltinTemplates.td TARGET ClangBuiltinTemplates) +clang_tablegen(Traits.inc -gen-clang-traits + SOURCE Traits.td + TARGET ClangTraits) + # ARM NEON and MVE clang_tablegen(arm_neon.inc -gen-arm-neon-sema SOURCE arm_neon.td diff --git a/clang/include/clang/Basic/ExpressionTraits.h b/clang/include/clang/Basic/ExpressionTraits.h index b38ebd9ac60b9..48ae69cf1ae17 100644 --- a/clang/include/clang/Basic/ExpressionTraits.h +++ b/clang/include/clang/Basic/ExpressionTraits.h @@ -20,10 +20,10 @@ namespace clang { enum ExpressionTrait { #define EXPRESSION_TRAIT(Spelling, Name, Key) ET_##Name, -#include "clang/Basic/TokenKinds.def" +#include "clang/Basic/Traits.inc" ET_Last = -1 // ET_Last == last ET_XX in the enum. #define EXPRESSION_TRAIT(Spelling, Name, Key) +1 -#include "clang/Basic/TokenKinds.def" +#include "clang/Basic/Traits.inc" }; /// Return the internal name of type trait \p T. Never null. diff --git a/clang/include/clang/Basic/Specifiers.h b/clang/include/clang/Basic/Specifiers.h index 8da6fd4cf454a..6aeca806730b1 100644 --- a/clang/include/clang/Basic/Specifiers.h +++ b/clang/include/clang/Basic/Specifiers.h @@ -89,7 +89,7 @@ namespace clang { TST_typeof_unqualExpr, // C23 typeof_unqual(expression) TST_decltype, // C++11 decltype #define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) TST_##Trait, -#include "clang/Basic/TransformTypeTraits.def" +#include "clang/Basic/Traits.inc" TST_auto, // C++11 auto TST_decltype_auto, // C++1y decltype(auto) TST_auto_type, // __auto_type extension diff --git a/clang/include/clang/Basic/TokenKinds.def b/clang/include/clang/Basic/TokenKinds.def index f07d8ebb75035..9e907dba35b62 100644 --- a/clang/include/clang/Basic/TokenKinds.def +++ b/clang/include/clang/Basic/TokenKinds.def @@ -327,8 +327,6 @@ KEYWORD(register , KEYALL) KEYWORD(return , KEYALL) KEYWORD(short , KEYALL) KEYWORD(signed , KEYALL) -UNARY_EXPR_OR_TYPE_TRAIT(sizeof, SizeOf, KEYALL) -UNARY_EXPR_OR_TYPE_TRAIT(__datasizeof, DataSizeOf, KEYCXX) KEYWORD(static , KEYALL) KEYWORD(struct , KEYALL) KEYWORD(switch , KEYALL) @@ -362,9 +360,6 @@ KEYWORD(__ptrauth , KEYALL) KEYWORD(__ob_wrap , KEYALL) KEYWORD(__ob_trap , KEYALL) -// C2y -UNARY_EXPR_OR_TYPE_TRAIT(_Countof, CountOf, KEYNOCXX) - // C++ 2.11p1: Keywords. KEYWORD(asm , KEYCXX|KEYGNU) KEYWORD(bool , BOOLSUPPORT|KEYC23) @@ -417,8 +412,6 @@ C99_KEYWORD(inline , KEYCXX|KEYGNU) // C++11 keywords CXX11_KEYWORD(alignas , KEYC23) -// alignof and _Alignof return the required ABI alignment -CXX11_UNARY_EXPR_OR_TYPE_TRAIT(alignof, AlignOf, KEYC23) CXX11_KEYWORD(char16_t , KEYNOMS18) CXX11_KEYWORD(char32_t , KEYNOMS18) CXX11_KEYWORD(constexpr , KEYC23) @@ -466,9 +459,6 @@ KEYWORD(_Decimal32 , KEYALL) KEYWORD(_Decimal64 , KEYALL) KEYWORD(_Decimal128 , KEYALL) KEYWORD(__null , KEYCXX) -// __alignof returns the preferred alignment of a type, the alignment -// clang will attempt to give an object of the type if allowed by ABI. -UNARY_EXPR_OR_TYPE_TRAIT(__alignof, PreferredAlignOf, KEYALL) KEYWORD(__attribute , KEYALL) KEYWORD(__builtin_choose_expr , KEYALL) KEYWORD(__builtin_offsetof , KEYALL) @@ -480,9 +470,6 @@ KEYWORD(__builtin_LINE , KEYALL) KEYWORD(__builtin_COLUMN , KEYALL) KEYWORD(__builtin_source_location , KEYCXX) -// __builtin_types_compatible_p is a GNU C extension that we handle like a C++ -// type trait. -TYPE_TRAIT_2(__builtin_types_compatible_p, TypeCompatible, KEYNOCXX) KEYWORD(__builtin_va_arg , KEYALL) KEYWORD(__extension__ , KEYALL) KEYWORD(__float128 , KEYALL) @@ -501,122 +488,12 @@ KEYWORD(__FUNCDNAME__ , KEYMS) KEYWORD(__FUNCSIG__ , KEYMS) KEYWORD(L__FUNCTION__ , KEYMS) KEYWORD(L__FUNCSIG__ , KEYMS) -TYPE_TRAIT_1(__is_interface_class, IsInterfaceClass, KEYMS) -TYPE_TRAIT_1(__is_sealed, IsSealed, KEYMS) - -// MSVC12.0 / VS2013 Type Traits -TYPE_TRAIT_1(__is_destructible, IsDestructible, KEYALL) -TYPE_TRAIT_1(__is_trivially_destructible, IsTriviallyDestructible, KEYCXX) -TYPE_TRAIT_1(__is_nothrow_destructible, IsNothrowDestructible, KEYALL) -TYPE_TRAIT_2(__is_nothrow_assignable, IsNothrowAssignable, KEYCXX) -TYPE_TRAIT_N(__is_constructible, IsConstructible, KEYCXX) -TYPE_TRAIT_N(__is_nothrow_constructible, IsNothrowConstructible, KEYCXX) - -// MSVC14.0 / VS2015 Type Traits -TYPE_TRAIT_2(__is_assignable, IsAssignable, KEYCXX) - -// MSVC Type Traits of unknown vintage -TYPE_TRAIT_1(__has_nothrow_move_assign, HasNothrowMoveAssign, KEYCXX) -TYPE_TRAIT_1(__has_trivial_move_assign, HasTrivialMoveAssign, KEYCXX) -TYPE_TRAIT_1(__has_trivial_move_constructor, HasTrivialMoveConstructor, KEYCXX) // GNU and MS Type Traits -TYPE_TRAIT_1(__builtin_is_implicit_lifetime, IsImplicitLifetime, KEYCXX) -TYPE_TRAIT_2(__builtin_is_virtual_base_of, IsVirtualBaseOf, KEYCXX) -TYPE_TRAIT_1(__has_nothrow_assign, HasNothrowAssign, KEYCXX) -TYPE_TRAIT_1(__has_nothrow_copy, HasNothrowCopy, KEYCXX) -TYPE_TRAIT_1(__has_nothrow_constructor, HasNothrowConstructor, KEYCXX) -TYPE_TRAIT_1(__has_trivial_assign, HasTrivialAssign, KEYCXX) -TYPE_TRAIT_1(__has_trivial_copy, HasTrivialCopy, KEYCXX) -TYPE_TRAIT_1(__has_trivial_constructor, HasTrivialDefaultConstructor, KEYCXX) -TYPE_TRAIT_1(__has_trivial_destructor, HasTrivialDestructor, KEYCXX) -TYPE_TRAIT_1(__has_virtual_destructor, HasVirtualDestructor, KEYCXX) -TYPE_TRAIT_1(__is_abstract, IsAbstract, KEYCXX) -TYPE_TRAIT_1(__is_aggregate, IsAggregate, KEYCXX) -TYPE_TRAIT_2(__is_base_of, IsBaseOf, KEYCXX) -TYPE_TRAIT_1(__is_class, IsClass, KEYCXX) -TYPE_TRAIT_2(__is_convertible_to, IsConvertibleTo, KEYCXX) -TYPE_TRAIT_1(__is_empty, IsEmpty, KEYCXX) -TYPE_TRAIT_1(__is_enum, IsEnum, KEYCXX) -TYPE_TRAIT_1(__is_final, IsFinal, KEYCXX) -TYPE_TRAIT_1(__is_literal, IsLiteral, KEYCXX) // Name for GCC 4.6 compatibility - people have already written libraries using // this name unfortunately. ALIAS("__is_literal_type", __is_literal, KEYCXX) -TYPE_TRAIT_1(__is_pod, IsPOD, KEYCXX) -TYPE_TRAIT_1(__is_polymorphic, IsPolymorphic, KEYCXX) -TYPE_TRAIT_1(__is_standard_layout, IsStandardLayout, KEYCXX) -TYPE_TRAIT_1(__is_trivial, IsTrivial, KEYCXX) -TYPE_TRAIT_2(__is_trivially_assignable, IsTriviallyAssignable, KEYCXX) -TYPE_TRAIT_N(__is_trivially_constructible, IsTriviallyConstructible, KEYCXX) -TYPE_TRAIT_1(__is_trivially_copyable, IsTriviallyCopyable, KEYCXX) -TYPE_TRAIT_1(__is_union, IsUnion, KEYCXX) -TYPE_TRAIT_1(__has_unique_object_representations, - HasUniqueObjectRepresentations, KEYCXX) -TYPE_TRAIT_2(__is_layout_compatible, IsLayoutCompatible, KEYCXX) -TYPE_TRAIT_2(__is_pointer_interconvertible_base_of, IsPointerInterconvertibleBaseOf, KEYCXX) - -#include "clang/Basic/TransformTypeTraits.def" - -// Clang-only C++ Type Traits -TYPE_TRAIT_1(__is_trivially_equality_comparable, IsTriviallyEqualityComparable, KEYCXX) -TYPE_TRAIT_1(__is_bounded_array, IsBoundedArray, KEYCXX) -TYPE_TRAIT_1(__is_unbounded_array, IsUnboundedArray, KEYCXX) -TYPE_TRAIT_1(__is_scoped_enum, IsScopedEnum, KEYCXX) -TYPE_TRAIT_1(__can_pass_in_regs, CanPassInRegs, KEYCXX) -TYPE_TRAIT_2(__reference_binds_to_temporary, ReferenceBindsToTemporary, KEYCXX) -TYPE_TRAIT_2(__reference_constructs_from_temporary, ReferenceConstructsFromTemporary, KEYCXX) -TYPE_TRAIT_2(__reference_converts_from_temporary, ReferenceConvertsFromTemporary, KEYCXX) -TYPE_TRAIT_2(__builtin_lt_synthesizes_from_spaceship, LtSynthesizesFromSpaceship, KEYCXX) -TYPE_TRAIT_2(__builtin_le_synthesizes_from_spaceship, LeSynthesizesFromSpaceship, KEYCXX) -TYPE_TRAIT_2(__builtin_gt_synthesizes_from_spaceship, GtSynthesizesFromSpaceship, KEYCXX) -TYPE_TRAIT_2(__builtin_ge_synthesizes_from_spaceship, GeSynthesizesFromSpaceship, KEYCXX) -// IsDeducible is only used internally by clang for CTAD implementation and -// is not exposed to users. -TYPE_TRAIT_2(/*EmptySpellingName*/, IsDeducible, KEYCXX) - -// __is_trivially_relocatable is deprecated -TYPE_TRAIT_1(__builtin_is_cpp_trivially_relocatable, IsCppTriviallyRelocatable, KEYCXX) -TYPE_TRAIT_1(__is_trivially_relocatable, IsTriviallyRelocatable, KEYCXX) -TYPE_TRAIT_1(__is_bitwise_cloneable, IsBitwiseCloneable, KEYALL) -TYPE_TRAIT_1(__builtin_structured_binding_size, StructuredBindingSize, KEYCXX) - - - -// Embarcadero Expression Traits -EXPRESSION_TRAIT(__is_lvalue_expr, IsLValueExpr, KEYCXX) -EXPRESSION_TRAIT(__is_rvalue_expr, IsRValueExpr, KEYCXX) - -// Embarcadero Unary Type Traits -TYPE_TRAIT_1(__is_arithmetic, IsArithmetic, KEYCXX) -TYPE_TRAIT_1(__is_floating_point, IsFloatingPoint, KEYCXX) -TYPE_TRAIT_1(__is_integral, IsIntegral, KEYCXX) -TYPE_TRAIT_1(__is_complete_type, IsCompleteType, KEYCXX) -TYPE_TRAIT_1(__is_void, IsVoid, KEYCXX) -TYPE_TRAIT_1(__is_array, IsArray, KEYCXX) -TYPE_TRAIT_1(__is_function, IsFunction, KEYCXX) -TYPE_TRAIT_1(__is_reference, IsReference, KEYCXX) -TYPE_TRAIT_1(__is_lvalue_reference, IsLvalueReference, KEYCXX) -TYPE_TRAIT_1(__is_rvalue_reference, IsRvalueReference, KEYCXX) -TYPE_TRAIT_1(__is_fundamental, IsFundamental, KEYCXX) -TYPE_TRAIT_1(__is_object, IsObject, KEYCXX) -TYPE_TRAIT_1(__is_scalar, IsScalar, KEYCXX) -TYPE_TRAIT_1(__is_compound, IsCompound, KEYCXX) -TYPE_TRAIT_1(__is_pointer, IsPointer, KEYCXX) -TYPE_TRAIT_1(__is_member_object_pointer, IsMemberObjectPointer, KEYCXX) -TYPE_TRAIT_1(__is_member_function_pointer, IsMemberFunctionPointer, KEYCXX) -TYPE_TRAIT_1(__is_member_pointer, IsMemberPointer, KEYCXX) -TYPE_TRAIT_1(__is_const, IsConst, KEYCXX) -TYPE_TRAIT_1(__is_volatile, IsVolatile, KEYCXX) -TYPE_TRAIT_1(__is_signed, IsSigned, KEYCXX) -TYPE_TRAIT_1(__is_unsigned, IsUnsigned, KEYCXX) - -// Embarcadero Binary Type Traits -TYPE_TRAIT_2(__is_same, IsSame, KEYCXX) -TYPE_TRAIT_2(__is_convertible, IsConvertible, KEYCXX) -TYPE_TRAIT_2(__is_nothrow_convertible, IsNothrowConvertible, KEYCXX) -ARRAY_TYPE_TRAIT(__array_rank, ArrayRank, KEYCXX) -ARRAY_TYPE_TRAIT(__array_extent, ArrayExtent, KEYCXX) + // Name for GCC 6 compatibility. ALIAS("__is_same_as", __is_same, KEYCXX) @@ -624,8 +501,6 @@ ALIAS("__is_same_as", __is_same, KEYCXX) KEYWORD(__private_extern__ , KEYALL) KEYWORD(__module_private__ , KEYALL) -UNARY_EXPR_OR_TYPE_TRAIT(__builtin_ptrauth_type_discriminator, PtrAuthTypeDiscriminator, KEYALL) - // Extension that will be enabled for Microsoft, Borland and PS4, but can be // disabled via '-fno-declspec'. KEYWORD(__declspec , 0) @@ -664,7 +539,6 @@ ALIAS("write_only", __write_only , KEYOPENCLC | KEYOPENCLCXX) ALIAS("read_write", __read_write , KEYOPENCLC | KEYOPENCLCXX) // OpenCL builtins KEYWORD(__builtin_astype , KEYOPENCLC | KEYOPENCLCXX) -UNARY_EXPR_OR_TYPE_TRAIT(vec_step, VecStep, KEYOPENCLC | KEYOPENCLCXX | KEYALTIVEC | KEYZVECTOR) #define GENERIC_IMAGE_TYPE(ImgType, Id) KEYWORD(ImgType##_t, KEYOPENCLC | KEYOPENCLCXX) #include "clang/Basic/OpenCLImageTypes.def" KEYWORD(pipe , KEYOPENCLC | KEYOPENCLCXX) @@ -687,15 +561,6 @@ KEYWORD(column_major , KEYHLSL) #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) KEYWORD(Name, KEYHLSL) #include "clang/Basic/HLSLIntangibleTypes.def" -// HLSL Type traits -TYPE_TRAIT_2(__builtin_hlsl_is_scalarized_layout_compatible, IsScalarizedLayoutCompatible, KEYHLSL) -TYPE_TRAIT_1(__builtin_hlsl_is_intangible, IsIntangibleType, KEYHLSL) -TYPE_TRAIT_1(__builtin_hlsl_is_typed_resource_element_compatible, IsTypedResourceElementCompatible, KEYHLSL) -TYPE_TRAIT_1(__builtin_hlsl_is_constant_buffer_element_compatible, IsConstantBufferElementCompatible, KEYHLSL) - -// OpenMP Type Traits -UNARY_EXPR_OR_TYPE_TRAIT(__builtin_omp_required_simd_align, OpenMPRequiredSimdAlign, KEYALL) - // Borland Extensions. KEYWORD(__pascal , KEYALL) @@ -815,7 +680,6 @@ ALIAS("_pascal" , __pascal , KEYBORLAND) // Clang Extensions. KEYWORD(__builtin_convertvector , KEYALL) -UNARY_EXPR_OR_TYPE_TRAIT(__builtin_vectorelements, VectorElements, KEYALL) ALIAS("__char16_t" , char16_t , KEYCXX) ALIAS("__char32_t" , char32_t , KEYCXX) KEYWORD(__builtin_bit_cast , KEYALL) @@ -1060,6 +924,8 @@ ANNOTATION(repl_input_end) // Annotation for #embed ANNOTATION(embed) +#include "clang/Basic/Traits.inc" + #undef PRAGMA_ANNOTATION #undef ANNOTATION #undef TESTING_KEYWORD diff --git a/clang/include/clang/Basic/Traits.td b/clang/include/clang/Basic/Traits.td new file mode 100644 index 0000000000000..d13f75b9dacd9 --- /dev/null +++ b/clang/include/clang/Basic/Traits.td @@ -0,0 +1,556 @@ +class Trait<string P> { + string Prefix = P; + string Spelling = ""; + string StdName = ""; + string KeyFlag = "KEYCXX"; +} +class TypeTrait<string P> : Trait<P>; + +class UnaryTrait : TypeTrait<"UTT">; +class BinaryTrait : TypeTrait<"BTT">; +class VariadicTrait : TypeTrait<"TT">; +class ArrayTrait : Trait<"ATT">; +class ExpressionTrait : Trait<"ET">; +class UnaryExprOrTypeTrait : Trait<"UETT">; +class CXX11UnaryExprOrTypeTrait : Trait<"UETT">; +class TransformTypeTrait : Trait<"TST">; + +// C99 6.4.1: Keywords. These turn into kw_* tokens. +def SizeOf : UnaryExprOrTypeTrait { + let Spelling = "sizeof"; + let KeyFlag = "KEYALL"; +} + +def DataSizeOf : UnaryExprOrTypeTrait { + let Spelling = "__datasizeof"; +} + +// C2y +def CountOf : UnaryExprOrTypeTrait { + let Spelling = "_Countof"; + let KeyFlag = "KEYNOCXX"; +} + +// C++11 keywords +// alignof and _Alignof return the required ABI alignment +def AlignOf : CXX11UnaryExprOrTypeTrait { + let Spelling = "alignof"; + let KeyFlag = "KEYC23"; +} + +// GNU Extensions (in impl-reserved namespace) + +// __alignof returns the preferred alignment of a type, the alignment +// clang will attempt to give an object of the type if allowed by ABI. +def PreferredAlignOf : UnaryExprOrTypeTrait { + let Spelling = "__alignof"; + let KeyFlag = "KEYALL"; +} + +// __builtin_types_compatible_p is a GNU C extension that we handle like a C++ +// type trait. +def TypeCompatible : BinaryTrait { + let Spelling = "__builtin_types_compatible_p"; + let KeyFlag = "KEYNOCXX"; +} + +// MS Extensions +def IsInterfaceClass : UnaryTrait { + let Spelling = "__is_interface_class"; + let KeyFlag = "KEYMS"; +} + +def IsSealed : UnaryTrait { + let Spelling = "__is_sealed"; + let KeyFlag = "KEYMS"; +} + +// MSVC12.0 / VS2013 Type Traits +def IsDestructible : UnaryTrait { + let Spelling = "__is_destructible"; + let KeyFlag = "KEYALL"; +} + +def IsTriviallyDestructible : UnaryTrait { + let Spelling = "__is_trivially_destructible"; +} + +def IsNothrowDestructible : UnaryTrait { + let Spelling = "__is_nothrow_destructible"; + let KeyFlag = "KEYALL"; +} + +def IsNothrowAssignable : BinaryTrait { + let Spelling = "__is_nothrow_assignable"; +} + +def IsConstructible : VariadicTrait { + let Spelling = "__is_constructible"; + let StdName = "is_constructible"; +} + +def IsNothrowConstructible : VariadicTrait { + let Spelling = "__is_nothrow_constructible"; +} + +// MSVC14.0 / VS2015 Type Traits +def IsAssignable : BinaryTrait { + let Spelling = "__is_assignable"; + let StdName = "is_assignable"; +} + +// MSVC Type Traits of unknown vintage +def HasNothrowMoveAssign : UnaryTrait { + let Spelling = "__has_nothrow_move_assign"; +} + +def HasTrivialMoveAssign : UnaryTrait { + let Spelling = "__has_trivial_move_assign"; +} + +def HasTrivialMoveConstructor : UnaryTrait { + let Spelling = "__has_trivial_move_constructor"; +} + +// GNU and MS Type Traits +def IsImplicitLifetime : UnaryTrait { + let Spelling = "__builtin_is_implicit_lifetime"; +} + +def IsVirtualBaseOf : BinaryTrait { + let Spelling = "__builtin_is_virtual_base_of"; +} + +def HasNothrowAssign : UnaryTrait { + let Spelling = "__has_nothrow_assign"; +} + +def HasNothrowCopy : UnaryTrait { + let Spelling = "__has_nothrow_copy"; +} + +def HasNothrowConstructor : UnaryTrait { + let Spelling = "__has_nothrow_constructor"; +} + +def HasTrivialAssign : UnaryTrait { + let Spelling = "__has_trivial_assign"; +} + +def HasTrivialCopy : UnaryTrait { + let Spelling = "__has_trivial_copy"; +} + +def HasTrivialDefaultConstructor : UnaryTrait { + let Spelling = "__has_trivial_constructor"; +} + +def HasTrivialDestructor : UnaryTrait { + let Spelling = "__has_trivial_destructor"; +} + +def HasVirtualDestructor : UnaryTrait { + let Spelling = "__has_virtual_destructor"; +} + +def IsAbstract : UnaryTrait { + let Spelling = "__is_abstract"; + let StdName = "is_abstract"; +} + +def IsAggregate : UnaryTrait { + let Spelling = "__is_aggregate"; + let StdName = "is_aggregate"; +} + +def IsBaseOf : BinaryTrait { + let Spelling = "__is_base_of"; +} + +def IsClass : UnaryTrait { + let Spelling = "__is_class"; +} + +def IsConvertibleTo : BinaryTrait { + let Spelling = "__is_convertible_to"; +} + +def IsEmpty : UnaryTrait { + let Spelling = "__is_empty"; + let StdName = "is_empty"; +} + +def IsEnum : UnaryTrait { + let Spelling = "__is_enum"; +} + +def IsFinal : UnaryTrait { + let Spelling = "__is_final"; + let StdName = "is_final"; +} + +def IsLiteral : UnaryTrait { + let Spelling = "__is_literal"; +} + +def IsPOD : UnaryTrait { + let Spelling = "__is_pod"; +} + +def IsPolymorphic : UnaryTrait { + let Spelling = "__is_polymorphic"; +} + +def IsStandardLayout : UnaryTrait { + let Spelling = "__is_standard_layout"; + let StdName = "is_standard_layout"; +} + +def IsTrivial : UnaryTrait { + let Spelling = "__is_trivial"; +} + +def IsTriviallyAssignable : BinaryTrait { + let Spelling = "__is_trivially_assignable"; +} + +def IsTriviallyConstructible : VariadicTrait { + let Spelling = "__is_trivially_constructible"; +} + +def IsTriviallyCopyable : UnaryTrait { + let Spelling = "__is_trivially_copyable"; + let StdName = "is_trivially_copyable"; +} + +def IsUnion : UnaryTrait { + let Spelling = "__is_union"; +} + +def HasUniqueObjectRepresentations : UnaryTrait { + let Spelling = "__has_unique_object_representations"; +} + +def IsLayoutCompatible : BinaryTrait { + let Spelling = "__is_layout_compatible"; +} + +def IsPointerInterconvertibleBaseOf : BinaryTrait { + let Spelling = "__is_pointer_interconvertible_base_of"; +} + +def AddLvalueReference : TransformTypeTrait { + let Spelling = "__add_lvalue_reference"; + let StdName = "add_lvalue_reference"; +} + +def AddPointer : TransformTypeTrait { + let Spelling = "__add_pointer"; + let StdName = "add_pointer"; +} + +def AddRvalueReference : TransformTypeTrait { + let Spelling = "__add_rvalue_reference"; + let StdName = "add_rvalue_reference"; +} + +def Decay : TransformTypeTrait { + let Spelling = "__decay"; + let StdName = "decay"; +} + +def MakeSigned : TransformTypeTrait { + let Spelling = "__make_signed"; + let StdName = "make_signed"; +} + +def MakeUnsigned : TransformTypeTrait { + let Spelling = "__make_unsigned"; + let StdName = "make_unsigned"; +} + +def RemoveAllExtents : TransformTypeTrait { + let Spelling = "__remove_all_extents"; + let StdName = "remove_all_extents"; +} + +def RemoveConst : TransformTypeTrait { + let Spelling = "__remove_const"; + let StdName = "remove_const"; +} + +def RemoveCV : TransformTypeTrait { + let Spelling = "__remove_cv"; +... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/201491 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
