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