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

Reply via email to