1 //===--- TypeTraits.cpp - Type Traits Support -----------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file implements the type traits support functions. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "clang/Basic/TypeTraits.h" 14 #include "llvm/Support/ErrorHandling.h" 15 #include <cassert> 16 using namespace clang; 17 18 static constexpr const char *TypeTraitNames[] = { 19 #define TYPE_TRAIT_1(Spelling, Name, Key) #Name, 20 #include "clang/Basic/TokenKinds.def" 21 #define TYPE_TRAIT_2(Spelling, Name, Key) #Name, 22 #include "clang/Basic/TokenKinds.def" 23 #define TYPE_TRAIT_N(Spelling, Name, Key) #Name, 24 #include "clang/Basic/TokenKinds.def" 25 }; 26 27 static constexpr const char *TypeTraitSpellings[] = { 28 #define TYPE_TRAIT_1(Spelling, Name, Key) #Spelling, 29 #include "clang/Basic/TokenKinds.def" 30 #define TYPE_TRAIT_2(Spelling, Name, Key) #Spelling, 31 #include "clang/Basic/TokenKinds.def" 32 #define TYPE_TRAIT_N(Spelling, Name, Key) #Spelling, 33 #include "clang/Basic/TokenKinds.def" 34 }; 35 36 static constexpr const char *ArrayTypeTraitNames[] = { 37 #define ARRAY_TYPE_TRAIT(Spelling, Name, Key) #Name, 38 #include "clang/Basic/TokenKinds.def" 39 }; 40 41 static constexpr const char *ArrayTypeTraitSpellings[] = { 42 #define ARRAY_TYPE_TRAIT(Spelling, Name, Key) #Spelling, 43 #include "clang/Basic/TokenKinds.def" 44 }; 45 46 static constexpr const char *UnaryExprOrTypeTraitNames[] = { 47 #define UNARY_EXPR_OR_TYPE_TRAIT(Spelling, Name, Key) #Name, 48 #define CXX11_UNARY_EXPR_OR_TYPE_TRAIT(Spelling, Name, Key) #Name, 49 #include "clang/Basic/TokenKinds.def" 50 }; 51 52 static constexpr const char *UnaryExprOrTypeTraitSpellings[] = { 53 #define UNARY_EXPR_OR_TYPE_TRAIT(Spelling, Name, Key) #Spelling, 54 #define CXX11_UNARY_EXPR_OR_TYPE_TRAIT(Spelling, Name, Key) #Spelling, 55 #include "clang/Basic/TokenKinds.def" 56 }; 57 58 const char *clang::getTraitName(TypeTrait T) { 59 assert(T <= TT_Last && "invalid enum value!"); 60 return TypeTraitNames[T]; 61 } 62 63 const char *clang::getTraitName(ArrayTypeTrait T) { 64 assert(T <= ATT_Last && "invalid enum value!"); 65 return ArrayTypeTraitNames[T]; 66 } 67 68 const char *clang::getTraitName(UnaryExprOrTypeTrait T) { 69 assert(T <= UETT_Last && "invalid enum value!"); 70 return UnaryExprOrTypeTraitNames[T]; 71 } 72 73 const char *clang::getTraitSpelling(TypeTrait T) { 74 assert(T <= TT_Last && "invalid enum value!"); 75 return TypeTraitSpellings[T]; 76 } 77 78 const char *clang::getTraitSpelling(ArrayTypeTrait T) { 79 assert(T <= ATT_Last && "invalid enum value!"); 80 return ArrayTypeTraitSpellings[T]; 81 } 82 83 const char *clang::getTraitSpelling(UnaryExprOrTypeTrait T) { 84 assert(T <= UETT_Last && "invalid enum value!"); 85 return UnaryExprOrTypeTraitSpellings[T]; 86 } 87