1 //===--- Specifiers.h - Declaration and Type Specifiers ---------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 ///
10 /// \file
11 /// Defines various enumerations that describe declaration and
12 /// type specifiers.
13 ///
14 //===----------------------------------------------------------------------===//
15 
16 #ifndef LLVM_CLANG_BASIC_SPECIFIERS_H
17 #define LLVM_CLANG_BASIC_SPECIFIERS_H
18 
19 #include "llvm/ADT/StringRef.h"
20 #include "llvm/Support/DataTypes.h"
21 #include "llvm/Support/ErrorHandling.h"
22 
23 namespace clang {
24   /// Specifies the width of a type, e.g., short, long, or long long.
25   enum TypeSpecifierWidth {
26     TSW_unspecified,
27     TSW_short,
28     TSW_long,
29     TSW_longlong
30   };
31 
32   /// Specifies the signedness of a type, e.g., signed or unsigned.
33   enum TypeSpecifierSign {
34     TSS_unspecified,
35     TSS_signed,
36     TSS_unsigned
37   };
38 
39   enum TypeSpecifiersPipe {
40     TSP_unspecified,
41     TSP_pipe
42   };
43 
44   /// Specifies the kind of type.
45   enum TypeSpecifierType {
46     TST_unspecified,
47     TST_void,
48     TST_char,
49     TST_wchar,        // C++ wchar_t
50     TST_char8,        // C++20 char8_t (proposed)
51     TST_char16,       // C++11 char16_t
52     TST_char32,       // C++11 char32_t
53     TST_int,
54     TST_int128,
55     TST_half,         // OpenCL half, ARM NEON __fp16
56     TST_Float16,      // C11 extension ISO/IEC TS 18661-3
57     TST_Accum,        // ISO/IEC JTC1 SC22 WG14 N1169 Extension
58     TST_Fract,
59     TST_float,
60     TST_double,
61     TST_float128,
62     TST_bool,         // _Bool
63     TST_decimal32,    // _Decimal32
64     TST_decimal64,    // _Decimal64
65     TST_decimal128,   // _Decimal128
66     TST_enum,
67     TST_union,
68     TST_struct,
69     TST_class,        // C++ class type
70     TST_interface,    // C++ (Microsoft-specific) __interface type
71     TST_typename,     // Typedef, C++ class-name or enum name, etc.
72     TST_typeofType,
73     TST_typeofExpr,
74     TST_decltype,         // C++11 decltype
75     TST_underlyingType,   // __underlying_type for C++11
76     TST_auto,             // C++11 auto
77     TST_decltype_auto,    // C++1y decltype(auto)
78     TST_auto_type,        // __auto_type extension
79     TST_unknown_anytype,  // __unknown_anytype extension
80     TST_atomic,           // C11 _Atomic
81 #define GENERIC_IMAGE_TYPE(ImgType, Id) TST_##ImgType##_t, // OpenCL image types
82 #include "clang/Basic/OpenCLImageTypes.def"
83     TST_error // erroneous type
84   };
85 
86   /// Structure that packs information about the type specifiers that
87   /// were written in a particular type specifier sequence.
88   struct WrittenBuiltinSpecs {
89     static_assert(TST_error < 1 << 6, "Type bitfield not wide enough for TST");
90     /*DeclSpec::TST*/ unsigned Type  : 6;
91     /*DeclSpec::TSS*/ unsigned Sign  : 2;
92     /*DeclSpec::TSW*/ unsigned Width : 2;
93     unsigned ModeAttr : 1;
94   };
95 
96   /// A C++ access specifier (public, private, protected), plus the
97   /// special value "none" which means different things in different contexts.
98   enum AccessSpecifier {
99     AS_public,
100     AS_protected,
101     AS_private,
102     AS_none
103   };
104 
105   /// The categorization of expression values, currently following the
106   /// C++11 scheme.
107   enum ExprValueKind {
108     /// An r-value expression (a pr-value in the C++11 taxonomy)
109     /// produces a temporary value.
110     VK_RValue,
111 
112     /// An l-value expression is a reference to an object with
113     /// independent storage.
114     VK_LValue,
115 
116     /// An x-value expression is a reference to an object with
117     /// independent storage but which can be "moved", i.e.
118     /// efficiently cannibalized for its resources.
119     VK_XValue
120   };
121 
122   /// A further classification of the kind of object referenced by an
123   /// l-value or x-value.
124   enum ExprObjectKind {
125     /// An ordinary object is located at an address in memory.
126     OK_Ordinary,
127 
128     /// A bitfield object is a bitfield on a C or C++ record.
129     OK_BitField,
130 
131     /// A vector component is an element or range of elements on a vector.
132     OK_VectorComponent,
133 
134     /// An Objective-C property is a logical field of an Objective-C
135     /// object which is read and written via Objective-C method calls.
136     OK_ObjCProperty,
137 
138     /// An Objective-C array/dictionary subscripting which reads an
139     /// object or writes at the subscripted array/dictionary element via
140     /// Objective-C method calls.
141     OK_ObjCSubscript
142   };
143 
144   /// Describes the kind of template specialization that a
145   /// particular template specialization declaration represents.
146   enum TemplateSpecializationKind {
147     /// This template specialization was formed from a template-id but
148     /// has not yet been declared, defined, or instantiated.
149     TSK_Undeclared = 0,
150     /// This template specialization was implicitly instantiated from a
151     /// template. (C++ [temp.inst]).
152     TSK_ImplicitInstantiation,
153     /// This template specialization was declared or defined by an
154     /// explicit specialization (C++ [temp.expl.spec]) or partial
155     /// specialization (C++ [temp.class.spec]).
156     TSK_ExplicitSpecialization,
157     /// This template specialization was instantiated from a template
158     /// due to an explicit instantiation declaration request
159     /// (C++11 [temp.explicit]).
160     TSK_ExplicitInstantiationDeclaration,
161     /// This template specialization was instantiated from a template
162     /// due to an explicit instantiation definition request
163     /// (C++ [temp.explicit]).
164     TSK_ExplicitInstantiationDefinition
165   };
166 
167   /// Determine whether this template specialization kind refers
168   /// to an instantiation of an entity (as opposed to a non-template or
169   /// an explicit specialization).
isTemplateInstantiation(TemplateSpecializationKind Kind)170   inline bool isTemplateInstantiation(TemplateSpecializationKind Kind) {
171     return Kind != TSK_Undeclared && Kind != TSK_ExplicitSpecialization;
172   }
173 
174   /// True if this template specialization kind is an explicit
175   /// specialization, explicit instantiation declaration, or explicit
176   /// instantiation definition.
isTemplateExplicitInstantiationOrSpecialization(TemplateSpecializationKind Kind)177   inline bool isTemplateExplicitInstantiationOrSpecialization(
178       TemplateSpecializationKind Kind) {
179     switch (Kind) {
180     case TSK_ExplicitSpecialization:
181     case TSK_ExplicitInstantiationDeclaration:
182     case TSK_ExplicitInstantiationDefinition:
183       return true;
184 
185     case TSK_Undeclared:
186     case TSK_ImplicitInstantiation:
187       return false;
188     }
189     llvm_unreachable("bad template specialization kind");
190   }
191 
192   /// Thread storage-class-specifier.
193   enum ThreadStorageClassSpecifier {
194     TSCS_unspecified,
195     /// GNU __thread.
196     TSCS___thread,
197     /// C++11 thread_local. Implies 'static' at block scope, but not at
198     /// class scope.
199     TSCS_thread_local,
200     /// C11 _Thread_local. Must be combined with either 'static' or 'extern'
201     /// if used at block scope.
202     TSCS__Thread_local
203   };
204 
205   /// Storage classes.
206   enum StorageClass {
207     // These are legal on both functions and variables.
208     SC_None,
209     SC_Extern,
210     SC_Static,
211     SC_PrivateExtern,
212 
213     // These are only legal on variables.
214     SC_Auto,
215     SC_Register
216   };
217 
218   /// Checks whether the given storage class is legal for functions.
isLegalForFunction(StorageClass SC)219   inline bool isLegalForFunction(StorageClass SC) {
220     return SC <= SC_PrivateExtern;
221   }
222 
223   /// Checks whether the given storage class is legal for variables.
isLegalForVariable(StorageClass SC)224   inline bool isLegalForVariable(StorageClass SC) {
225     return true;
226   }
227 
228   /// In-class initialization styles for non-static data members.
229   enum InClassInitStyle {
230     ICIS_NoInit,   ///< No in-class initializer.
231     ICIS_CopyInit, ///< Copy initialization.
232     ICIS_ListInit  ///< Direct list-initialization.
233   };
234 
235   /// CallingConv - Specifies the calling convention that a function uses.
236   enum CallingConv {
237     CC_C,           // __attribute__((cdecl))
238     CC_X86StdCall,  // __attribute__((stdcall))
239     CC_X86FastCall, // __attribute__((fastcall))
240     CC_X86ThisCall, // __attribute__((thiscall))
241     CC_X86VectorCall, // __attribute__((vectorcall))
242     CC_X86Pascal,   // __attribute__((pascal))
243     CC_Win64,       // __attribute__((ms_abi))
244     CC_X86_64SysV,  // __attribute__((sysv_abi))
245     CC_X86RegCall, // __attribute__((regcall))
246     CC_AAPCS,       // __attribute__((pcs("aapcs")))
247     CC_AAPCS_VFP,   // __attribute__((pcs("aapcs-vfp")))
248     CC_IntelOclBicc, // __attribute__((intel_ocl_bicc))
249     CC_SpirFunction, // default for OpenCL functions on SPIR target
250     CC_OpenCLKernel, // inferred for OpenCL kernels
251     CC_Swift,        // __attribute__((swiftcall))
252     CC_PreserveMost, // __attribute__((preserve_most))
253     CC_PreserveAll,  // __attribute__((preserve_all))
254     CC_AArch64VectorCall, // __attribute__((aarch64_vector_pcs))
255   };
256 
257   /// Checks whether the given calling convention supports variadic
258   /// calls. Unprototyped calls also use the variadic call rules.
supportsVariadicCall(CallingConv CC)259   inline bool supportsVariadicCall(CallingConv CC) {
260     switch (CC) {
261     case CC_X86StdCall:
262     case CC_X86FastCall:
263     case CC_X86ThisCall:
264     case CC_X86RegCall:
265     case CC_X86Pascal:
266     case CC_X86VectorCall:
267     case CC_SpirFunction:
268     case CC_OpenCLKernel:
269     case CC_Swift:
270       return false;
271     default:
272       return true;
273     }
274   }
275 
276   /// The storage duration for an object (per C++ [basic.stc]).
277   enum StorageDuration {
278     SD_FullExpression, ///< Full-expression storage duration (for temporaries).
279     SD_Automatic,      ///< Automatic storage duration (most local variables).
280     SD_Thread,         ///< Thread storage duration.
281     SD_Static,         ///< Static storage duration.
282     SD_Dynamic         ///< Dynamic storage duration.
283   };
284 
285   /// Describes the nullability of a particular type.
286   enum class NullabilityKind : uint8_t {
287     /// Values of this type can never be null.
288     NonNull = 0,
289     /// Values of this type can be null.
290     Nullable,
291     /// Whether values of this type can be null is (explicitly)
292     /// unspecified. This captures a (fairly rare) case where we
293     /// can't conclude anything about the nullability of the type even
294     /// though it has been considered.
295     Unspecified
296   };
297 
298   /// Return true if \p L has a weaker nullability annotation than \p R. The
299   /// ordering is: Unspecified < Nullable < NonNull.
hasWeakerNullability(NullabilityKind L,NullabilityKind R)300   inline bool hasWeakerNullability(NullabilityKind L, NullabilityKind R) {
301     return uint8_t(L) > uint8_t(R);
302   }
303 
304   /// Retrieve the spelling of the given nullability kind.
305   llvm::StringRef getNullabilitySpelling(NullabilityKind kind,
306                                          bool isContextSensitive = false);
307 
308   /// Kinds of parameter ABI.
309   enum class ParameterABI {
310     /// This parameter uses ordinary ABI rules for its type.
311     Ordinary,
312 
313     /// This parameter (which must have pointer type) is a Swift
314     /// indirect result parameter.
315     SwiftIndirectResult,
316 
317     /// This parameter (which must have pointer-to-pointer type) uses
318     /// the special Swift error-result ABI treatment.  There can be at
319     /// most one parameter on a given function that uses this treatment.
320     SwiftErrorResult,
321 
322     /// This parameter (which must have pointer type) uses the special
323     /// Swift context-pointer ABI treatment.  There can be at
324     /// most one parameter on a given function that uses this treatment.
325     SwiftContext
326   };
327 
328   llvm::StringRef getParameterABISpelling(ParameterABI kind);
329 } // end namespace clang
330 
331 #endif // LLVM_CLANG_BASIC_SPECIFIERS_H
332