Specifiers.h revision 263508
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/// \brief 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
19namespace clang {
20  /// \brief Specifies the width of a type, e.g., short, long, or long long.
21  enum TypeSpecifierWidth {
22    TSW_unspecified,
23    TSW_short,
24    TSW_long,
25    TSW_longlong
26  };
27
28  /// \brief Specifies the signedness of a type, e.g., signed or unsigned.
29  enum TypeSpecifierSign {
30    TSS_unspecified,
31    TSS_signed,
32    TSS_unsigned
33  };
34
35  /// \brief Specifies the kind of type.
36  enum TypeSpecifierType {
37    TST_unspecified,
38    TST_void,
39    TST_char,
40    TST_wchar,        // C++ wchar_t
41    TST_char16,       // C++11 char16_t
42    TST_char32,       // C++11 char32_t
43    TST_int,
44    TST_int128,
45    TST_half,         // OpenCL half, ARM NEON __fp16
46    TST_float,
47    TST_double,
48    TST_bool,         // _Bool
49    TST_decimal32,    // _Decimal32
50    TST_decimal64,    // _Decimal64
51    TST_decimal128,   // _Decimal128
52    TST_enum,
53    TST_union,
54    TST_struct,
55    TST_class,        // C++ class type
56    TST_interface,    // C++ (Microsoft-specific) __interface type
57    TST_typename,     // Typedef, C++ class-name or enum name, etc.
58    TST_typeofType,
59    TST_typeofExpr,
60    TST_decltype,         // C++11 decltype
61    TST_underlyingType,   // __underlying_type for C++11
62    TST_auto,             // C++11 auto
63    TST_decltype_auto,    // C++1y decltype(auto)
64    TST_unknown_anytype,  // __unknown_anytype extension
65    TST_atomic,           // C11 _Atomic
66    TST_image1d_t,        // OpenCL image1d_t
67    TST_image1d_array_t,  // OpenCL image1d_array_t
68    TST_image1d_buffer_t, // OpenCL image1d_buffer_t
69    TST_image2d_t,        // OpenCL image2d_t
70    TST_image2d_array_t,  // OpenCL image2d_array_t
71    TST_image3d_t,        // OpenCL image3d_t
72    TST_sampler_t,        // OpenCL sampler_t
73    TST_event_t,          // OpenCL event_t
74    TST_error         // erroneous type
75  };
76
77  /// \brief Structure that packs information about the type specifiers that
78  /// were written in a particular type specifier sequence.
79  struct WrittenBuiltinSpecs {
80    /*DeclSpec::TST*/ unsigned Type  : 6;
81    /*DeclSpec::TSS*/ unsigned Sign  : 2;
82    /*DeclSpec::TSW*/ unsigned Width : 2;
83    bool ModeAttr : 1;
84  };
85
86  /// \brief A C++ access specifier (public, private, protected), plus the
87  /// special value "none" which means different things in different contexts.
88  enum AccessSpecifier {
89    AS_public,
90    AS_protected,
91    AS_private,
92    AS_none
93  };
94
95  /// \brief The categorization of expression values, currently following the
96  /// C++11 scheme.
97  enum ExprValueKind {
98    /// \brief An r-value expression (a pr-value in the C++11 taxonomy)
99    /// produces a temporary value.
100    VK_RValue,
101
102    /// \brief An l-value expression is a reference to an object with
103    /// independent storage.
104    VK_LValue,
105
106    /// \brief An x-value expression is a reference to an object with
107    /// independent storage but which can be "moved", i.e.
108    /// efficiently cannibalized for its resources.
109    VK_XValue
110  };
111
112  /// \brief A further classification of the kind of object referenced by an
113  /// l-value or x-value.
114  enum ExprObjectKind {
115    /// An ordinary object is located at an address in memory.
116    OK_Ordinary,
117
118    /// A bitfield object is a bitfield on a C or C++ record.
119    OK_BitField,
120
121    /// A vector component is an element or range of elements on a vector.
122    OK_VectorComponent,
123
124    /// An Objective-C property is a logical field of an Objective-C
125    /// object which is read and written via Objective-C method calls.
126    OK_ObjCProperty,
127
128    /// An Objective-C array/dictionary subscripting which reads an
129    /// object or writes at the subscripted array/dictionary element via
130    /// Objective-C method calls.
131    OK_ObjCSubscript
132  };
133
134  /// \brief Describes the kind of template specialization that a
135  /// particular template specialization declaration represents.
136  enum TemplateSpecializationKind {
137    /// This template specialization was formed from a template-id but
138    /// has not yet been declared, defined, or instantiated.
139    TSK_Undeclared = 0,
140    /// This template specialization was implicitly instantiated from a
141    /// template. (C++ [temp.inst]).
142    TSK_ImplicitInstantiation,
143    /// This template specialization was declared or defined by an
144    /// explicit specialization (C++ [temp.expl.spec]) or partial
145    /// specialization (C++ [temp.class.spec]).
146    TSK_ExplicitSpecialization,
147    /// This template specialization was instantiated from a template
148    /// due to an explicit instantiation declaration request
149    /// (C++11 [temp.explicit]).
150    TSK_ExplicitInstantiationDeclaration,
151    /// This template specialization was instantiated from a template
152    /// due to an explicit instantiation definition request
153    /// (C++ [temp.explicit]).
154    TSK_ExplicitInstantiationDefinition
155  };
156
157  /// \brief Determine whether this template specialization kind refers
158  /// to an instantiation of an entity (as opposed to a non-template or
159  /// an explicit specialization).
160  inline bool isTemplateInstantiation(TemplateSpecializationKind Kind) {
161    return Kind != TSK_Undeclared && Kind != TSK_ExplicitSpecialization;
162  }
163
164  /// \brief Thread storage-class-specifier.
165  enum ThreadStorageClassSpecifier {
166    TSCS_unspecified,
167    /// GNU __thread.
168    TSCS___thread,
169    /// C++11 thread_local. Implies 'static' at block scope, but not at
170    /// class scope.
171    TSCS_thread_local,
172    /// C11 _Thread_local. Must be combined with either 'static' or 'extern'
173    /// if used at block scope.
174    TSCS__Thread_local
175  };
176
177  /// \brief Storage classes.
178  enum StorageClass {
179    // These are legal on both functions and variables.
180    SC_None,
181    SC_Extern,
182    SC_Static,
183    SC_PrivateExtern,
184
185    // These are only legal on variables.
186    SC_OpenCLWorkGroupLocal,
187    SC_Auto,
188    SC_Register
189  };
190
191  /// \brief Checks whether the given storage class is legal for functions.
192  inline bool isLegalForFunction(StorageClass SC) {
193    return SC <= SC_PrivateExtern;
194  }
195
196  /// \brief Checks whether the given storage class is legal for variables.
197  inline bool isLegalForVariable(StorageClass SC) {
198    return true;
199  }
200
201  /// \brief In-class initialization styles for non-static data members.
202  enum InClassInitStyle {
203    ICIS_NoInit,   ///< No in-class initializer.
204    ICIS_CopyInit, ///< Copy initialization.
205    ICIS_ListInit  ///< Direct list-initialization.
206  };
207
208  /// \brief CallingConv - Specifies the calling convention that a function uses.
209  enum CallingConv {
210    CC_C,           // __attribute__((cdecl))
211    CC_X86StdCall,  // __attribute__((stdcall))
212    CC_X86FastCall, // __attribute__((fastcall))
213    CC_X86ThisCall, // __attribute__((thiscall))
214    CC_X86Pascal,   // __attribute__((pascal))
215    CC_X86_64Win64, // __attribute__((ms_abi))
216    CC_X86_64SysV,  // __attribute__((sysv_abi))
217    CC_AAPCS,       // __attribute__((pcs("aapcs")))
218    CC_AAPCS_VFP,   // __attribute__((pcs("aapcs-vfp")))
219    CC_PnaclCall,   // __attribute__((pnaclcall))
220    CC_IntelOclBicc // __attribute__((intel_ocl_bicc))
221  };
222
223  /// \brief Checks whether the given calling convention is callee-cleanup.
224  inline bool isCalleeCleanup(CallingConv CC) {
225    switch (CC) {
226    case CC_X86StdCall:
227    case CC_X86FastCall:
228    case CC_X86ThisCall:
229    case CC_X86Pascal:
230      return true;
231    default:
232      return false;
233    }
234  }
235
236  /// \brief The storage duration for an object (per C++ [basic.stc]).
237  enum StorageDuration {
238    SD_FullExpression, ///< Full-expression storage duration (for temporaries).
239    SD_Automatic,      ///< Automatic storage duration (most local variables).
240    SD_Thread,         ///< Thread storage duration.
241    SD_Static,         ///< Static storage duration.
242    SD_Dynamic         ///< Dynamic storage duration.
243  };
244} // end namespace clang
245
246#endif // LLVM_CLANG_BASIC_SPECIFIERS_H
247