Warning: That file was not part of the compilation database. It may have many parsing errors.
1 | //===--- DeclSpec.h - Parsed declaration 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 | /// This file defines the classes used to store parsed information about |
12 | /// declaration-specifiers and declarators. |
13 | /// |
14 | /// \verbatim |
15 | /// static const int volatile x, *y, *(*(*z)[10])(const void *x); |
16 | /// ------------------------- - -- --------------------------- |
17 | /// declaration-specifiers \ | / |
18 | /// declarators |
19 | /// \endverbatim |
20 | /// |
21 | //===----------------------------------------------------------------------===// |
22 | |
23 | #ifndef LLVM_CLANG_SEMA_DECLSPEC_H |
24 | #define LLVM_CLANG_SEMA_DECLSPEC_H |
25 | |
26 | #include "clang/AST/NestedNameSpecifier.h" |
27 | #include "clang/Basic/ExceptionSpecificationType.h" |
28 | #include "clang/Basic/Lambda.h" |
29 | #include "clang/Basic/OperatorKinds.h" |
30 | #include "clang/Basic/Specifiers.h" |
31 | #include "clang/Lex/Token.h" |
32 | #include "clang/Sema/Ownership.h" |
33 | #include "clang/Sema/ParsedAttr.h" |
34 | #include "llvm/ADT/SmallVector.h" |
35 | #include "llvm/Support/Compiler.h" |
36 | #include "llvm/Support/ErrorHandling.h" |
37 | |
38 | namespace clang { |
39 | class ASTContext; |
40 | class CXXRecordDecl; |
41 | class TypeLoc; |
42 | class LangOptions; |
43 | class IdentifierInfo; |
44 | class NamespaceAliasDecl; |
45 | class NamespaceDecl; |
46 | class ObjCDeclSpec; |
47 | class Sema; |
48 | class Declarator; |
49 | struct TemplateIdAnnotation; |
50 | |
51 | /// Represents a C++ nested-name-specifier or a global scope specifier. |
52 | /// |
53 | /// These can be in 3 states: |
54 | /// 1) Not present, identified by isEmpty() |
55 | /// 2) Present, identified by isNotEmpty() |
56 | /// 2.a) Valid, identified by isValid() |
57 | /// 2.b) Invalid, identified by isInvalid(). |
58 | /// |
59 | /// isSet() is deprecated because it mostly corresponded to "valid" but was |
60 | /// often used as if it meant "present". |
61 | /// |
62 | /// The actual scope is described by getScopeRep(). |
63 | class CXXScopeSpec { |
64 | SourceRange Range; |
65 | NestedNameSpecifierLocBuilder Builder; |
66 | |
67 | public: |
68 | SourceRange getRange() const { return Range; } |
69 | void setRange(SourceRange R) { Range = R; } |
70 | void setBeginLoc(SourceLocation Loc) { Range.setBegin(Loc); } |
71 | void setEndLoc(SourceLocation Loc) { Range.setEnd(Loc); } |
72 | SourceLocation getBeginLoc() const { return Range.getBegin(); } |
73 | SourceLocation getEndLoc() const { return Range.getEnd(); } |
74 | |
75 | /// Retrieve the representation of the nested-name-specifier. |
76 | NestedNameSpecifier *getScopeRep() const { |
77 | return Builder.getRepresentation(); |
78 | } |
79 | |
80 | /// Extend the current nested-name-specifier by another |
81 | /// nested-name-specifier component of the form 'type::'. |
82 | /// |
83 | /// \param Context The AST context in which this nested-name-specifier |
84 | /// resides. |
85 | /// |
86 | /// \param TemplateKWLoc The location of the 'template' keyword, if present. |
87 | /// |
88 | /// \param TL The TypeLoc that describes the type preceding the '::'. |
89 | /// |
90 | /// \param ColonColonLoc The location of the trailing '::'. |
91 | void Extend(ASTContext &Context, SourceLocation TemplateKWLoc, TypeLoc TL, |
92 | SourceLocation ColonColonLoc); |
93 | |
94 | /// Extend the current nested-name-specifier by another |
95 | /// nested-name-specifier component of the form 'identifier::'. |
96 | /// |
97 | /// \param Context The AST context in which this nested-name-specifier |
98 | /// resides. |
99 | /// |
100 | /// \param Identifier The identifier. |
101 | /// |
102 | /// \param IdentifierLoc The location of the identifier. |
103 | /// |
104 | /// \param ColonColonLoc The location of the trailing '::'. |
105 | void Extend(ASTContext &Context, IdentifierInfo *Identifier, |
106 | SourceLocation IdentifierLoc, SourceLocation ColonColonLoc); |
107 | |
108 | /// Extend the current nested-name-specifier by another |
109 | /// nested-name-specifier component of the form 'namespace::'. |
110 | /// |
111 | /// \param Context The AST context in which this nested-name-specifier |
112 | /// resides. |
113 | /// |
114 | /// \param Namespace The namespace. |
115 | /// |
116 | /// \param NamespaceLoc The location of the namespace name. |
117 | /// |
118 | /// \param ColonColonLoc The location of the trailing '::'. |
119 | void Extend(ASTContext &Context, NamespaceDecl *Namespace, |
120 | SourceLocation NamespaceLoc, SourceLocation ColonColonLoc); |
121 | |
122 | /// Extend the current nested-name-specifier by another |
123 | /// nested-name-specifier component of the form 'namespace-alias::'. |
124 | /// |
125 | /// \param Context The AST context in which this nested-name-specifier |
126 | /// resides. |
127 | /// |
128 | /// \param Alias The namespace alias. |
129 | /// |
130 | /// \param AliasLoc The location of the namespace alias |
131 | /// name. |
132 | /// |
133 | /// \param ColonColonLoc The location of the trailing '::'. |
134 | void Extend(ASTContext &Context, NamespaceAliasDecl *Alias, |
135 | SourceLocation AliasLoc, SourceLocation ColonColonLoc); |
136 | |
137 | /// Turn this (empty) nested-name-specifier into the global |
138 | /// nested-name-specifier '::'. |
139 | void MakeGlobal(ASTContext &Context, SourceLocation ColonColonLoc); |
140 | |
141 | /// Turns this (empty) nested-name-specifier into '__super' |
142 | /// nested-name-specifier. |
143 | /// |
144 | /// \param Context The AST context in which this nested-name-specifier |
145 | /// resides. |
146 | /// |
147 | /// \param RD The declaration of the class in which nested-name-specifier |
148 | /// appeared. |
149 | /// |
150 | /// \param SuperLoc The location of the '__super' keyword. |
151 | /// name. |
152 | /// |
153 | /// \param ColonColonLoc The location of the trailing '::'. |
154 | void MakeSuper(ASTContext &Context, CXXRecordDecl *RD, |
155 | SourceLocation SuperLoc, SourceLocation ColonColonLoc); |
156 | |
157 | /// Make a new nested-name-specifier from incomplete source-location |
158 | /// information. |
159 | /// |
160 | /// FIXME: This routine should be used very, very rarely, in cases where we |
161 | /// need to synthesize a nested-name-specifier. Most code should instead use |
162 | /// \c Adopt() with a proper \c NestedNameSpecifierLoc. |
163 | void MakeTrivial(ASTContext &Context, NestedNameSpecifier *Qualifier, |
164 | SourceRange R); |
165 | |
166 | /// Adopt an existing nested-name-specifier (with source-range |
167 | /// information). |
168 | void Adopt(NestedNameSpecifierLoc Other); |
169 | |
170 | /// Retrieve a nested-name-specifier with location information, copied |
171 | /// into the given AST context. |
172 | /// |
173 | /// \param Context The context into which this nested-name-specifier will be |
174 | /// copied. |
175 | NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const; |
176 | |
177 | /// Retrieve the location of the name in the last qualifier |
178 | /// in this nested name specifier. |
179 | /// |
180 | /// For example, the location of \c bar |
181 | /// in |
182 | /// \verbatim |
183 | /// \::foo::bar<0>:: |
184 | /// ^~~ |
185 | /// \endverbatim |
186 | SourceLocation getLastQualifierNameLoc() const; |
187 | |
188 | /// No scope specifier. |
189 | bool isEmpty() const { return !Range.isValid(); } |
190 | /// A scope specifier is present, but may be valid or invalid. |
191 | bool isNotEmpty() const { return !isEmpty(); } |
192 | |
193 | /// An error occurred during parsing of the scope specifier. |
194 | bool isInvalid() const { return isNotEmpty() && getScopeRep() == nullptr; } |
195 | /// A scope specifier is present, and it refers to a real scope. |
196 | bool isValid() const { return isNotEmpty() && getScopeRep() != nullptr; } |
197 | |
198 | /// Indicate that this nested-name-specifier is invalid. |
199 | void SetInvalid(SourceRange R) { |
200 | assert(R.isValid() && "Must have a valid source range"); |
201 | if (Range.getBegin().isInvalid()) |
202 | Range.setBegin(R.getBegin()); |
203 | Range.setEnd(R.getEnd()); |
204 | Builder.Clear(); |
205 | } |
206 | |
207 | /// Deprecated. Some call sites intend isNotEmpty() while others intend |
208 | /// isValid(). |
209 | bool isSet() const { return getScopeRep() != nullptr; } |
210 | |
211 | void clear() { |
212 | Range = SourceRange(); |
213 | Builder.Clear(); |
214 | } |
215 | |
216 | /// Retrieve the data associated with the source-location information. |
217 | char *location_data() const { return Builder.getBuffer().first; } |
218 | |
219 | /// Retrieve the size of the data associated with source-location |
220 | /// information. |
221 | unsigned location_size() const { return Builder.getBuffer().second; } |
222 | }; |
223 | |
224 | /// Captures information about "declaration specifiers". |
225 | /// |
226 | /// "Declaration specifiers" encompasses storage-class-specifiers, |
227 | /// type-specifiers, type-qualifiers, and function-specifiers. |
228 | class DeclSpec { |
229 | public: |
230 | /// storage-class-specifier |
231 | /// \note The order of these enumerators is important for diagnostics. |
232 | enum SCS { |
233 | SCS_unspecified = 0, |
234 | SCS_typedef, |
235 | SCS_extern, |
236 | SCS_static, |
237 | SCS_auto, |
238 | SCS_register, |
239 | SCS_private_extern, |
240 | SCS_mutable |
241 | }; |
242 | |
243 | // Import thread storage class specifier enumeration and constants. |
244 | // These can be combined with SCS_extern and SCS_static. |
245 | typedef ThreadStorageClassSpecifier TSCS; |
246 | static const TSCS TSCS_unspecified = clang::TSCS_unspecified; |
247 | static const TSCS TSCS___thread = clang::TSCS___thread; |
248 | static const TSCS TSCS_thread_local = clang::TSCS_thread_local; |
249 | static const TSCS TSCS__Thread_local = clang::TSCS__Thread_local; |
250 | |
251 | // Import type specifier width enumeration and constants. |
252 | typedef TypeSpecifierWidth TSW; |
253 | static const TSW TSW_unspecified = clang::TSW_unspecified; |
254 | static const TSW TSW_short = clang::TSW_short; |
255 | static const TSW TSW_long = clang::TSW_long; |
256 | static const TSW TSW_longlong = clang::TSW_longlong; |
257 | |
258 | enum TSC { |
259 | TSC_unspecified, |
260 | TSC_imaginary, |
261 | TSC_complex |
262 | }; |
263 | |
264 | // Import type specifier sign enumeration and constants. |
265 | typedef TypeSpecifierSign TSS; |
266 | static const TSS TSS_unspecified = clang::TSS_unspecified; |
267 | static const TSS TSS_signed = clang::TSS_signed; |
268 | static const TSS TSS_unsigned = clang::TSS_unsigned; |
269 | |
270 | // Import type specifier type enumeration and constants. |
271 | typedef TypeSpecifierType TST; |
272 | static const TST TST_unspecified = clang::TST_unspecified; |
273 | static const TST TST_void = clang::TST_void; |
274 | static const TST TST_char = clang::TST_char; |
275 | static const TST TST_wchar = clang::TST_wchar; |
276 | static const TST TST_char8 = clang::TST_char8; |
277 | static const TST TST_char16 = clang::TST_char16; |
278 | static const TST TST_char32 = clang::TST_char32; |
279 | static const TST TST_int = clang::TST_int; |
280 | static const TST TST_int128 = clang::TST_int128; |
281 | static const TST TST_half = clang::TST_half; |
282 | static const TST TST_float = clang::TST_float; |
283 | static const TST TST_double = clang::TST_double; |
284 | static const TST TST_float16 = clang::TST_Float16; |
285 | static const TST TST_accum = clang::TST_Accum; |
286 | static const TST TST_fract = clang::TST_Fract; |
287 | static const TST TST_float128 = clang::TST_float128; |
288 | static const TST TST_bool = clang::TST_bool; |
289 | static const TST TST_decimal32 = clang::TST_decimal32; |
290 | static const TST TST_decimal64 = clang::TST_decimal64; |
291 | static const TST TST_decimal128 = clang::TST_decimal128; |
292 | static const TST TST_enum = clang::TST_enum; |
293 | static const TST TST_union = clang::TST_union; |
294 | static const TST TST_struct = clang::TST_struct; |
295 | static const TST TST_interface = clang::TST_interface; |
296 | static const TST TST_class = clang::TST_class; |
297 | static const TST TST_typename = clang::TST_typename; |
298 | static const TST TST_typeofType = clang::TST_typeofType; |
299 | static const TST TST_typeofExpr = clang::TST_typeofExpr; |
300 | static const TST TST_decltype = clang::TST_decltype; |
301 | static const TST TST_decltype_auto = clang::TST_decltype_auto; |
302 | static const TST TST_underlyingType = clang::TST_underlyingType; |
303 | static const TST TST_auto = clang::TST_auto; |
304 | static const TST TST_auto_type = clang::TST_auto_type; |
305 | static const TST TST_unknown_anytype = clang::TST_unknown_anytype; |
306 | static const TST TST_atomic = clang::TST_atomic; |
307 | #define GENERIC_IMAGE_TYPE(ImgType, Id) \ |
308 | static const TST TST_##ImgType##_t = clang::TST_##ImgType##_t; |
309 | #include "clang/Basic/OpenCLImageTypes.def" |
310 | static const TST TST_error = clang::TST_error; |
311 | |
312 | // type-qualifiers |
313 | enum TQ { // NOTE: These flags must be kept in sync with Qualifiers::TQ. |
314 | TQ_unspecified = 0, |
315 | TQ_const = 1, |
316 | TQ_restrict = 2, |
317 | TQ_volatile = 4, |
318 | TQ_unaligned = 8, |
319 | // This has no corresponding Qualifiers::TQ value, because it's not treated |
320 | // as a qualifier in our type system. |
321 | TQ_atomic = 16 |
322 | }; |
323 | |
324 | /// ParsedSpecifiers - Flags to query which specifiers were applied. This is |
325 | /// returned by getParsedSpecifiers. |
326 | enum ParsedSpecifiers { |
327 | PQ_None = 0, |
328 | PQ_StorageClassSpecifier = 1, |
329 | PQ_TypeSpecifier = 2, |
330 | PQ_TypeQualifier = 4, |
331 | PQ_FunctionSpecifier = 8 |
332 | // FIXME: Attributes should be included here. |
333 | }; |
334 | |
335 | private: |
336 | // storage-class-specifier |
337 | /*SCS*/unsigned StorageClassSpec : 3; |
338 | /*TSCS*/unsigned ThreadStorageClassSpec : 2; |
339 | unsigned SCS_extern_in_linkage_spec : 1; |
340 | |
341 | // type-specifier |
342 | /*TSW*/unsigned TypeSpecWidth : 2; |
343 | /*TSC*/unsigned TypeSpecComplex : 2; |
344 | /*TSS*/unsigned TypeSpecSign : 2; |
345 | /*TST*/unsigned TypeSpecType : 6; |
346 | unsigned TypeAltiVecVector : 1; |
347 | unsigned TypeAltiVecPixel : 1; |
348 | unsigned TypeAltiVecBool : 1; |
349 | unsigned TypeSpecOwned : 1; |
350 | unsigned TypeSpecPipe : 1; |
351 | unsigned TypeSpecSat : 1; |
352 | |
353 | // type-qualifiers |
354 | unsigned TypeQualifiers : 5; // Bitwise OR of TQ. |
355 | |
356 | // function-specifier |
357 | unsigned FS_inline_specified : 1; |
358 | unsigned FS_forceinline_specified: 1; |
359 | unsigned FS_virtual_specified : 1; |
360 | unsigned FS_explicit_specified : 1; |
361 | unsigned FS_noreturn_specified : 1; |
362 | |
363 | // friend-specifier |
364 | unsigned Friend_specified : 1; |
365 | |
366 | // constexpr-specifier |
367 | unsigned Constexpr_specified : 1; |
368 | |
369 | union { |
370 | UnionParsedType TypeRep; |
371 | Decl *DeclRep; |
372 | Expr *ExprRep; |
373 | }; |
374 | |
375 | // attributes. |
376 | ParsedAttributes Attrs; |
377 | |
378 | // Scope specifier for the type spec, if applicable. |
379 | CXXScopeSpec TypeScope; |
380 | |
381 | // SourceLocation info. These are null if the item wasn't specified or if |
382 | // the setting was synthesized. |
383 | SourceRange Range; |
384 | |
385 | SourceLocation StorageClassSpecLoc, ThreadStorageClassSpecLoc; |
386 | SourceRange TSWRange; |
387 | SourceLocation TSCLoc, TSSLoc, TSTLoc, AltiVecLoc, TSSatLoc; |
388 | /// TSTNameLoc - If TypeSpecType is any of class, enum, struct, union, |
389 | /// typename, then this is the location of the named type (if present); |
390 | /// otherwise, it is the same as TSTLoc. Hence, the pair TSTLoc and |
391 | /// TSTNameLoc provides source range info for tag types. |
392 | SourceLocation TSTNameLoc; |
393 | SourceRange TypeofParensRange; |
394 | SourceLocation TQ_constLoc, TQ_restrictLoc, TQ_volatileLoc, TQ_atomicLoc, |
395 | TQ_unalignedLoc; |
396 | SourceLocation FS_inlineLoc, FS_virtualLoc, FS_explicitLoc, FS_noreturnLoc; |
397 | SourceLocation FS_forceinlineLoc; |
398 | SourceLocation FriendLoc, ModulePrivateLoc, ConstexprLoc; |
399 | SourceLocation TQ_pipeLoc; |
400 | |
401 | WrittenBuiltinSpecs writtenBS; |
402 | void SaveWrittenBuiltinSpecs(); |
403 | |
404 | ObjCDeclSpec *ObjCQualifiers; |
405 | |
406 | static bool isTypeRep(TST T) { |
407 | return (T == TST_typename || T == TST_typeofType || |
408 | T == TST_underlyingType || T == TST_atomic); |
409 | } |
410 | static bool isExprRep(TST T) { |
411 | return (T == TST_typeofExpr || T == TST_decltype); |
412 | } |
413 | |
414 | DeclSpec(const DeclSpec &) = delete; |
415 | void operator=(const DeclSpec &) = delete; |
416 | public: |
417 | static bool isDeclRep(TST T) { |
418 | return (T == TST_enum || T == TST_struct || |
419 | T == TST_interface || T == TST_union || |
420 | T == TST_class); |
421 | } |
422 | |
423 | DeclSpec(AttributeFactory &attrFactory) |
424 | : StorageClassSpec(SCS_unspecified), |
425 | ThreadStorageClassSpec(TSCS_unspecified), |
426 | SCS_extern_in_linkage_spec(false), |
427 | TypeSpecWidth(TSW_unspecified), |
428 | TypeSpecComplex(TSC_unspecified), |
429 | TypeSpecSign(TSS_unspecified), |
430 | TypeSpecType(TST_unspecified), |
431 | TypeAltiVecVector(false), |
432 | TypeAltiVecPixel(false), |
433 | TypeAltiVecBool(false), |
434 | TypeSpecOwned(false), |
435 | TypeSpecPipe(false), |
436 | TypeSpecSat(false), |
437 | TypeQualifiers(TQ_unspecified), |
438 | FS_inline_specified(false), |
439 | FS_forceinline_specified(false), |
440 | FS_virtual_specified(false), |
441 | FS_explicit_specified(false), |
442 | FS_noreturn_specified(false), |
443 | Friend_specified(false), |
444 | Constexpr_specified(false), |
445 | Attrs(attrFactory), |
446 | writtenBS(), |
447 | ObjCQualifiers(nullptr) { |
448 | } |
449 | |
450 | // storage-class-specifier |
451 | SCS getStorageClassSpec() const { return (SCS)StorageClassSpec; } |
452 | TSCS getThreadStorageClassSpec() const { |
453 | return (TSCS)ThreadStorageClassSpec; |
454 | } |
455 | bool isExternInLinkageSpec() const { return SCS_extern_in_linkage_spec; } |
456 | void setExternInLinkageSpec(bool Value) { |
457 | SCS_extern_in_linkage_spec = Value; |
458 | } |
459 | |
460 | SourceLocation getStorageClassSpecLoc() const { return StorageClassSpecLoc; } |
461 | SourceLocation getThreadStorageClassSpecLoc() const { |
462 | return ThreadStorageClassSpecLoc; |
463 | } |
464 | |
465 | void ClearStorageClassSpecs() { |
466 | StorageClassSpec = DeclSpec::SCS_unspecified; |
467 | ThreadStorageClassSpec = DeclSpec::TSCS_unspecified; |
468 | SCS_extern_in_linkage_spec = false; |
469 | StorageClassSpecLoc = SourceLocation(); |
470 | ThreadStorageClassSpecLoc = SourceLocation(); |
471 | } |
472 | |
473 | void ClearTypeSpecType() { |
474 | TypeSpecType = DeclSpec::TST_unspecified; |
475 | TypeSpecOwned = false; |
476 | TSTLoc = SourceLocation(); |
477 | } |
478 | |
479 | // type-specifier |
480 | TSW getTypeSpecWidth() const { return (TSW)TypeSpecWidth; } |
481 | TSC getTypeSpecComplex() const { return (TSC)TypeSpecComplex; } |
482 | TSS getTypeSpecSign() const { return (TSS)TypeSpecSign; } |
483 | TST getTypeSpecType() const { return (TST)TypeSpecType; } |
484 | bool isTypeAltiVecVector() const { return TypeAltiVecVector; } |
485 | bool isTypeAltiVecPixel() const { return TypeAltiVecPixel; } |
486 | bool isTypeAltiVecBool() const { return TypeAltiVecBool; } |
487 | bool isTypeSpecOwned() const { return TypeSpecOwned; } |
488 | bool isTypeRep() const { return isTypeRep((TST) TypeSpecType); } |
489 | bool isTypeSpecPipe() const { return TypeSpecPipe; } |
490 | bool isTypeSpecSat() const { return TypeSpecSat; } |
491 | |
492 | ParsedType getRepAsType() const { |
493 | assert(isTypeRep((TST) TypeSpecType) && "DeclSpec does not store a type"); |
494 | return TypeRep; |
495 | } |
496 | Decl *getRepAsDecl() const { |
497 | assert(isDeclRep((TST) TypeSpecType) && "DeclSpec does not store a decl"); |
498 | return DeclRep; |
499 | } |
500 | Expr *getRepAsExpr() const { |
501 | assert(isExprRep((TST) TypeSpecType) && "DeclSpec does not store an expr"); |
502 | return ExprRep; |
503 | } |
504 | CXXScopeSpec &getTypeSpecScope() { return TypeScope; } |
505 | const CXXScopeSpec &getTypeSpecScope() const { return TypeScope; } |
506 | |
507 | SourceRange getSourceRange() const LLVM_READONLY { return Range; } |
508 | SourceLocation getLocStart() const LLVM_READONLY { return getBeginLoc(); } |
509 | SourceLocation getBeginLoc() const LLVM_READONLY { return Range.getBegin(); } |
510 | SourceLocation getLocEnd() const LLVM_READONLY { return getEndLoc(); } |
511 | SourceLocation getEndLoc() const LLVM_READONLY { return Range.getEnd(); } |
512 | |
513 | SourceLocation getTypeSpecWidthLoc() const { return TSWRange.getBegin(); } |
514 | SourceRange getTypeSpecWidthRange() const { return TSWRange; } |
515 | SourceLocation getTypeSpecComplexLoc() const { return TSCLoc; } |
516 | SourceLocation getTypeSpecSignLoc() const { return TSSLoc; } |
517 | SourceLocation getTypeSpecTypeLoc() const { return TSTLoc; } |
518 | SourceLocation getAltiVecLoc() const { return AltiVecLoc; } |
519 | SourceLocation getTypeSpecSatLoc() const { return TSSatLoc; } |
520 | |
521 | SourceLocation getTypeSpecTypeNameLoc() const { |
522 | assert(isDeclRep((TST) TypeSpecType) || TypeSpecType == TST_typename); |
523 | return TSTNameLoc; |
524 | } |
525 | |
526 | SourceRange getTypeofParensRange() const { return TypeofParensRange; } |
527 | void setTypeofParensRange(SourceRange range) { TypeofParensRange = range; } |
528 | |
529 | bool hasAutoTypeSpec() const { |
530 | return (TypeSpecType == TST_auto || TypeSpecType == TST_auto_type || |
531 | TypeSpecType == TST_decltype_auto); |
532 | } |
533 | |
534 | bool hasTagDefinition() const; |
535 | |
536 | /// Turn a type-specifier-type into a string like "_Bool" or "union". |
537 | static const char *getSpecifierName(DeclSpec::TST T, |
538 | const PrintingPolicy &Policy); |
539 | static const char *getSpecifierName(DeclSpec::TQ Q); |
540 | static const char *getSpecifierName(DeclSpec::TSS S); |
541 | static const char *getSpecifierName(DeclSpec::TSC C); |
542 | static const char *getSpecifierName(DeclSpec::TSW W); |
543 | static const char *getSpecifierName(DeclSpec::SCS S); |
544 | static const char *getSpecifierName(DeclSpec::TSCS S); |
545 | |
546 | // type-qualifiers |
547 | |
548 | /// getTypeQualifiers - Return a set of TQs. |
549 | unsigned getTypeQualifiers() const { return TypeQualifiers; } |
550 | SourceLocation getConstSpecLoc() const { return TQ_constLoc; } |
551 | SourceLocation getRestrictSpecLoc() const { return TQ_restrictLoc; } |
552 | SourceLocation getVolatileSpecLoc() const { return TQ_volatileLoc; } |
553 | SourceLocation getAtomicSpecLoc() const { return TQ_atomicLoc; } |
554 | SourceLocation getUnalignedSpecLoc() const { return TQ_unalignedLoc; } |
555 | SourceLocation getPipeLoc() const { return TQ_pipeLoc; } |
556 | |
557 | /// Clear out all of the type qualifiers. |
558 | void ClearTypeQualifiers() { |
559 | TypeQualifiers = 0; |
560 | TQ_constLoc = SourceLocation(); |
561 | TQ_restrictLoc = SourceLocation(); |
562 | TQ_volatileLoc = SourceLocation(); |
563 | TQ_atomicLoc = SourceLocation(); |
564 | TQ_unalignedLoc = SourceLocation(); |
565 | TQ_pipeLoc = SourceLocation(); |
566 | } |
567 | |
568 | // function-specifier |
569 | bool isInlineSpecified() const { |
570 | return FS_inline_specified | FS_forceinline_specified; |
571 | } |
572 | SourceLocation getInlineSpecLoc() const { |
573 | return FS_inline_specified ? FS_inlineLoc : FS_forceinlineLoc; |
574 | } |
575 | |
576 | bool isVirtualSpecified() const { return FS_virtual_specified; } |
577 | SourceLocation getVirtualSpecLoc() const { return FS_virtualLoc; } |
578 | |
579 | bool isExplicitSpecified() const { return FS_explicit_specified; } |
580 | SourceLocation getExplicitSpecLoc() const { return FS_explicitLoc; } |
581 | |
582 | bool isNoreturnSpecified() const { return FS_noreturn_specified; } |
583 | SourceLocation getNoreturnSpecLoc() const { return FS_noreturnLoc; } |
584 | |
585 | void ClearFunctionSpecs() { |
586 | FS_inline_specified = false; |
587 | FS_inlineLoc = SourceLocation(); |
588 | FS_forceinline_specified = false; |
589 | FS_forceinlineLoc = SourceLocation(); |
590 | FS_virtual_specified = false; |
591 | FS_virtualLoc = SourceLocation(); |
592 | FS_explicit_specified = false; |
593 | FS_explicitLoc = SourceLocation(); |
594 | FS_noreturn_specified = false; |
595 | FS_noreturnLoc = SourceLocation(); |
596 | } |
597 | |
598 | /// Return true if any type-specifier has been found. |
599 | bool hasTypeSpecifier() const { |
600 | return getTypeSpecType() != DeclSpec::TST_unspecified || |
601 | getTypeSpecWidth() != DeclSpec::TSW_unspecified || |
602 | getTypeSpecComplex() != DeclSpec::TSC_unspecified || |
603 | getTypeSpecSign() != DeclSpec::TSS_unspecified; |
604 | } |
605 | |
606 | /// Return a bitmask of which flavors of specifiers this |
607 | /// DeclSpec includes. |
608 | unsigned getParsedSpecifiers() const; |
609 | |
610 | /// isEmpty - Return true if this declaration specifier is completely empty: |
611 | /// no tokens were parsed in the production of it. |
612 | bool isEmpty() const { |
613 | return getParsedSpecifiers() == DeclSpec::PQ_None; |
614 | } |
615 | |
616 | void SetRangeStart(SourceLocation Loc) { Range.setBegin(Loc); } |
617 | void SetRangeEnd(SourceLocation Loc) { Range.setEnd(Loc); } |
618 | |
619 | /// These methods set the specified attribute of the DeclSpec and |
620 | /// return false if there was no error. If an error occurs (for |
621 | /// example, if we tried to set "auto" on a spec with "extern" |
622 | /// already set), they return true and set PrevSpec and DiagID |
623 | /// such that |
624 | /// Diag(Loc, DiagID) << PrevSpec; |
625 | /// will yield a useful result. |
626 | /// |
627 | /// TODO: use a more general approach that still allows these |
628 | /// diagnostics to be ignored when desired. |
629 | bool SetStorageClassSpec(Sema &S, SCS SC, SourceLocation Loc, |
630 | const char *&PrevSpec, unsigned &DiagID, |
631 | const PrintingPolicy &Policy); |
632 | bool SetStorageClassSpecThread(TSCS TSC, SourceLocation Loc, |
633 | const char *&PrevSpec, unsigned &DiagID); |
634 | bool SetTypeSpecWidth(TSW W, SourceLocation Loc, const char *&PrevSpec, |
635 | unsigned &DiagID, const PrintingPolicy &Policy); |
636 | bool SetTypeSpecComplex(TSC C, SourceLocation Loc, const char *&PrevSpec, |
637 | unsigned &DiagID); |
638 | bool SetTypeSpecSign(TSS S, SourceLocation Loc, const char *&PrevSpec, |
639 | unsigned &DiagID); |
640 | bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec, |
641 | unsigned &DiagID, const PrintingPolicy &Policy); |
642 | bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec, |
643 | unsigned &DiagID, ParsedType Rep, |
644 | const PrintingPolicy &Policy); |
645 | bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec, |
646 | unsigned &DiagID, Decl *Rep, bool Owned, |
647 | const PrintingPolicy &Policy); |
648 | bool SetTypeSpecType(TST T, SourceLocation TagKwLoc, |
649 | SourceLocation TagNameLoc, const char *&PrevSpec, |
650 | unsigned &DiagID, ParsedType Rep, |
651 | const PrintingPolicy &Policy); |
652 | bool SetTypeSpecType(TST T, SourceLocation TagKwLoc, |
653 | SourceLocation TagNameLoc, const char *&PrevSpec, |
654 | unsigned &DiagID, Decl *Rep, bool Owned, |
655 | const PrintingPolicy &Policy); |
656 | |
657 | bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec, |
658 | unsigned &DiagID, Expr *Rep, |
659 | const PrintingPolicy &policy); |
660 | bool SetTypeAltiVecVector(bool isAltiVecVector, SourceLocation Loc, |
661 | const char *&PrevSpec, unsigned &DiagID, |
662 | const PrintingPolicy &Policy); |
663 | bool SetTypeAltiVecPixel(bool isAltiVecPixel, SourceLocation Loc, |
664 | const char *&PrevSpec, unsigned &DiagID, |
665 | const PrintingPolicy &Policy); |
666 | bool SetTypeAltiVecBool(bool isAltiVecBool, SourceLocation Loc, |
667 | const char *&PrevSpec, unsigned &DiagID, |
668 | const PrintingPolicy &Policy); |
669 | bool SetTypePipe(bool isPipe, SourceLocation Loc, |
670 | const char *&PrevSpec, unsigned &DiagID, |
671 | const PrintingPolicy &Policy); |
672 | bool SetTypeSpecSat(SourceLocation Loc, const char *&PrevSpec, |
673 | unsigned &DiagID); |
674 | bool SetTypeSpecError(); |
675 | void UpdateDeclRep(Decl *Rep) { |
676 | assert(isDeclRep((TST) TypeSpecType)); |
677 | DeclRep = Rep; |
678 | } |
679 | void UpdateTypeRep(ParsedType Rep) { |
680 | assert(isTypeRep((TST) TypeSpecType)); |
681 | TypeRep = Rep; |
682 | } |
683 | void UpdateExprRep(Expr *Rep) { |
684 | assert(isExprRep((TST) TypeSpecType)); |
685 | ExprRep = Rep; |
686 | } |
687 | |
688 | bool SetTypeQual(TQ T, SourceLocation Loc, const char *&PrevSpec, |
689 | unsigned &DiagID, const LangOptions &Lang); |
690 | |
691 | bool setFunctionSpecInline(SourceLocation Loc, const char *&PrevSpec, |
692 | unsigned &DiagID); |
693 | bool setFunctionSpecForceInline(SourceLocation Loc, const char *&PrevSpec, |
694 | unsigned &DiagID); |
695 | bool setFunctionSpecVirtual(SourceLocation Loc, const char *&PrevSpec, |
696 | unsigned &DiagID); |
697 | bool setFunctionSpecExplicit(SourceLocation Loc, const char *&PrevSpec, |
698 | unsigned &DiagID); |
699 | bool setFunctionSpecNoreturn(SourceLocation Loc, const char *&PrevSpec, |
700 | unsigned &DiagID); |
701 | |
702 | bool SetFriendSpec(SourceLocation Loc, const char *&PrevSpec, |
703 | unsigned &DiagID); |
704 | bool setModulePrivateSpec(SourceLocation Loc, const char *&PrevSpec, |
705 | unsigned &DiagID); |
706 | bool SetConstexprSpec(SourceLocation Loc, const char *&PrevSpec, |
707 | unsigned &DiagID); |
708 | |
709 | bool isFriendSpecified() const { return Friend_specified; } |
710 | SourceLocation getFriendSpecLoc() const { return FriendLoc; } |
711 | |
712 | bool isModulePrivateSpecified() const { return ModulePrivateLoc.isValid(); } |
713 | SourceLocation getModulePrivateSpecLoc() const { return ModulePrivateLoc; } |
714 | |
715 | bool isConstexprSpecified() const { return Constexpr_specified; } |
716 | SourceLocation getConstexprSpecLoc() const { return ConstexprLoc; } |
717 | |
718 | void ClearConstexprSpec() { |
719 | Constexpr_specified = false; |
720 | ConstexprLoc = SourceLocation(); |
721 | } |
722 | |
723 | AttributePool &getAttributePool() const { |
724 | return Attrs.getPool(); |
725 | } |
726 | |
727 | /// Concatenates two attribute lists. |
728 | /// |
729 | /// The GCC attribute syntax allows for the following: |
730 | /// |
731 | /// \code |
732 | /// short __attribute__(( unused, deprecated )) |
733 | /// int __attribute__(( may_alias, aligned(16) )) var; |
734 | /// \endcode |
735 | /// |
736 | /// This declares 4 attributes using 2 lists. The following syntax is |
737 | /// also allowed and equivalent to the previous declaration. |
738 | /// |
739 | /// \code |
740 | /// short __attribute__((unused)) __attribute__((deprecated)) |
741 | /// int __attribute__((may_alias)) __attribute__((aligned(16))) var; |
742 | /// \endcode |
743 | /// |
744 | void addAttributes(ParsedAttributesView &AL) { |
745 | Attrs.addAll(AL.begin(), AL.end()); |
746 | } |
747 | |
748 | bool hasAttributes() const { return !Attrs.empty(); } |
749 | |
750 | ParsedAttributes &getAttributes() { return Attrs; } |
751 | const ParsedAttributes &getAttributes() const { return Attrs; } |
752 | |
753 | void takeAttributesFrom(ParsedAttributes &attrs) { |
754 | Attrs.takeAllFrom(attrs); |
755 | } |
756 | |
757 | /// Finish - This does final analysis of the declspec, issuing diagnostics for |
758 | /// things like "_Imaginary" (lacking an FP type). After calling this method, |
759 | /// DeclSpec is guaranteed self-consistent, even if an error occurred. |
760 | void Finish(Sema &S, const PrintingPolicy &Policy); |
761 | |
762 | const WrittenBuiltinSpecs& getWrittenBuiltinSpecs() const { |
763 | return writtenBS; |
764 | } |
765 | |
766 | ObjCDeclSpec *getObjCQualifiers() const { return ObjCQualifiers; } |
767 | void setObjCQualifiers(ObjCDeclSpec *quals) { ObjCQualifiers = quals; } |
768 | |
769 | /// Checks if this DeclSpec can stand alone, without a Declarator. |
770 | /// |
771 | /// Only tag declspecs can stand alone. |
772 | bool isMissingDeclaratorOk(); |
773 | }; |
774 | |
775 | /// Captures information about "declaration specifiers" specific to |
776 | /// Objective-C. |
777 | class ObjCDeclSpec { |
778 | public: |
779 | /// ObjCDeclQualifier - Qualifier used on types in method |
780 | /// declarations. Not all combinations are sensible. Parameters |
781 | /// can be one of { in, out, inout } with one of { bycopy, byref }. |
782 | /// Returns can either be { oneway } or not. |
783 | /// |
784 | /// This should be kept in sync with Decl::ObjCDeclQualifier. |
785 | enum ObjCDeclQualifier { |
786 | DQ_None = 0x0, |
787 | DQ_In = 0x1, |
788 | DQ_Inout = 0x2, |
789 | DQ_Out = 0x4, |
790 | DQ_Bycopy = 0x8, |
791 | DQ_Byref = 0x10, |
792 | DQ_Oneway = 0x20, |
793 | DQ_CSNullability = 0x40 |
794 | }; |
795 | |
796 | /// PropertyAttributeKind - list of property attributes. |
797 | /// Keep this list in sync with LLVM's Dwarf.h ApplePropertyAttributes. |
798 | enum ObjCPropertyAttributeKind { |
799 | DQ_PR_noattr = 0x0, |
800 | DQ_PR_readonly = 0x01, |
801 | DQ_PR_getter = 0x02, |
802 | DQ_PR_assign = 0x04, |
803 | DQ_PR_readwrite = 0x08, |
804 | DQ_PR_retain = 0x10, |
805 | DQ_PR_copy = 0x20, |
806 | DQ_PR_nonatomic = 0x40, |
807 | DQ_PR_setter = 0x80, |
808 | DQ_PR_atomic = 0x100, |
809 | DQ_PR_weak = 0x200, |
810 | DQ_PR_strong = 0x400, |
811 | DQ_PR_unsafe_unretained = 0x800, |
812 | DQ_PR_nullability = 0x1000, |
813 | DQ_PR_null_resettable = 0x2000, |
814 | DQ_PR_class = 0x4000 |
815 | }; |
816 | |
817 | ObjCDeclSpec() |
818 | : objcDeclQualifier(DQ_None), PropertyAttributes(DQ_PR_noattr), |
819 | Nullability(0), GetterName(nullptr), SetterName(nullptr) { } |
820 | |
821 | ObjCDeclQualifier getObjCDeclQualifier() const { |
822 | return (ObjCDeclQualifier)objcDeclQualifier; |
823 | } |
824 | void setObjCDeclQualifier(ObjCDeclQualifier DQVal) { |
825 | objcDeclQualifier = (ObjCDeclQualifier) (objcDeclQualifier | DQVal); |
826 | } |
827 | void clearObjCDeclQualifier(ObjCDeclQualifier DQVal) { |
828 | objcDeclQualifier = (ObjCDeclQualifier) (objcDeclQualifier & ~DQVal); |
829 | } |
830 | |
831 | ObjCPropertyAttributeKind getPropertyAttributes() const { |
832 | return ObjCPropertyAttributeKind(PropertyAttributes); |
833 | } |
834 | void setPropertyAttributes(ObjCPropertyAttributeKind PRVal) { |
835 | PropertyAttributes = |
836 | (ObjCPropertyAttributeKind)(PropertyAttributes | PRVal); |
837 | } |
838 | |
839 | NullabilityKind getNullability() const { |
840 | assert(((getObjCDeclQualifier() & DQ_CSNullability) || |
841 | (getPropertyAttributes() & DQ_PR_nullability)) && |
842 | "Objective-C declspec doesn't have nullability"); |
843 | return static_cast<NullabilityKind>(Nullability); |
844 | } |
845 | |
846 | SourceLocation getNullabilityLoc() const { |
847 | assert(((getObjCDeclQualifier() & DQ_CSNullability) || |
848 | (getPropertyAttributes() & DQ_PR_nullability)) && |
849 | "Objective-C declspec doesn't have nullability"); |
850 | return NullabilityLoc; |
851 | } |
852 | |
853 | void setNullability(SourceLocation loc, NullabilityKind kind) { |
854 | assert(((getObjCDeclQualifier() & DQ_CSNullability) || |
855 | (getPropertyAttributes() & DQ_PR_nullability)) && |
856 | "Set the nullability declspec or property attribute first"); |
857 | Nullability = static_cast<unsigned>(kind); |
858 | NullabilityLoc = loc; |
859 | } |
860 | |
861 | const IdentifierInfo *getGetterName() const { return GetterName; } |
862 | IdentifierInfo *getGetterName() { return GetterName; } |
863 | SourceLocation getGetterNameLoc() const { return GetterNameLoc; } |
864 | void setGetterName(IdentifierInfo *name, SourceLocation loc) { |
865 | GetterName = name; |
866 | GetterNameLoc = loc; |
867 | } |
868 | |
869 | const IdentifierInfo *getSetterName() const { return SetterName; } |
870 | IdentifierInfo *getSetterName() { return SetterName; } |
871 | SourceLocation getSetterNameLoc() const { return SetterNameLoc; } |
872 | void setSetterName(IdentifierInfo *name, SourceLocation loc) { |
873 | SetterName = name; |
874 | SetterNameLoc = loc; |
875 | } |
876 | |
877 | private: |
878 | // FIXME: These two are unrelated and mutually exclusive. So perhaps |
879 | // we can put them in a union to reflect their mutual exclusivity |
880 | // (space saving is negligible). |
881 | unsigned objcDeclQualifier : 7; |
882 | |
883 | // NOTE: VC++ treats enums as signed, avoid using ObjCPropertyAttributeKind |
884 | unsigned PropertyAttributes : 15; |
885 | |
886 | unsigned Nullability : 2; |
887 | |
888 | SourceLocation NullabilityLoc; |
889 | |
890 | IdentifierInfo *GetterName; // getter name or NULL if no getter |
891 | IdentifierInfo *SetterName; // setter name or NULL if no setter |
892 | SourceLocation GetterNameLoc; // location of the getter attribute's value |
893 | SourceLocation SetterNameLoc; // location of the setter attribute's value |
894 | |
895 | }; |
896 | |
897 | /// Describes the kind of unqualified-id parsed. |
898 | enum class UnqualifiedIdKind { |
899 | /// An identifier. |
900 | IK_Identifier, |
901 | /// An overloaded operator name, e.g., operator+. |
902 | IK_OperatorFunctionId, |
903 | /// A conversion function name, e.g., operator int. |
904 | IK_ConversionFunctionId, |
905 | /// A user-defined literal name, e.g., operator "" _i. |
906 | IK_LiteralOperatorId, |
907 | /// A constructor name. |
908 | IK_ConstructorName, |
909 | /// A constructor named via a template-id. |
910 | IK_ConstructorTemplateId, |
911 | /// A destructor name. |
912 | IK_DestructorName, |
913 | /// A template-id, e.g., f<int>. |
914 | IK_TemplateId, |
915 | /// An implicit 'self' parameter |
916 | IK_ImplicitSelfParam, |
917 | /// A deduction-guide name (a template-name) |
918 | IK_DeductionGuideName |
919 | }; |
920 | |
921 | /// Represents a C++ unqualified-id that has been parsed. |
922 | class UnqualifiedId { |
923 | private: |
924 | UnqualifiedId(const UnqualifiedId &Other) = delete; |
925 | const UnqualifiedId &operator=(const UnqualifiedId &) = delete; |
926 | |
927 | public: |
928 | /// Describes the kind of unqualified-id parsed. |
929 | UnqualifiedIdKind Kind; |
930 | |
931 | struct OFI { |
932 | /// The kind of overloaded operator. |
933 | OverloadedOperatorKind Operator; |
934 | |
935 | /// The source locations of the individual tokens that name |
936 | /// the operator, e.g., the "new", "[", and "]" tokens in |
937 | /// operator new []. |
938 | /// |
939 | /// Different operators have different numbers of tokens in their name, |
940 | /// up to three. Any remaining source locations in this array will be |
941 | /// set to an invalid value for operators with fewer than three tokens. |
942 | unsigned SymbolLocations[3]; |
943 | }; |
944 | |
945 | /// Anonymous union that holds extra data associated with the |
946 | /// parsed unqualified-id. |
947 | union { |
948 | /// When Kind == IK_Identifier, the parsed identifier, or when |
949 | /// Kind == IK_UserLiteralId, the identifier suffix. |
950 | IdentifierInfo *Identifier; |
951 | |
952 | /// When Kind == IK_OperatorFunctionId, the overloaded operator |
953 | /// that we parsed. |
954 | struct OFI OperatorFunctionId; |
955 | |
956 | /// When Kind == IK_ConversionFunctionId, the type that the |
957 | /// conversion function names. |
958 | UnionParsedType ConversionFunctionId; |
959 | |
960 | /// When Kind == IK_ConstructorName, the class-name of the type |
961 | /// whose constructor is being referenced. |
962 | UnionParsedType ConstructorName; |
963 | |
964 | /// When Kind == IK_DestructorName, the type referred to by the |
965 | /// class-name. |
966 | UnionParsedType DestructorName; |
967 | |
968 | /// When Kind == IK_DeductionGuideName, the parsed template-name. |
969 | UnionParsedTemplateTy TemplateName; |
970 | |
971 | /// When Kind == IK_TemplateId or IK_ConstructorTemplateId, |
972 | /// the template-id annotation that contains the template name and |
973 | /// template arguments. |
974 | TemplateIdAnnotation *TemplateId; |
975 | }; |
976 | |
977 | /// The location of the first token that describes this unqualified-id, |
978 | /// which will be the location of the identifier, "operator" keyword, |
979 | /// tilde (for a destructor), or the template name of a template-id. |
980 | SourceLocation StartLocation; |
981 | |
982 | /// The location of the last token that describes this unqualified-id. |
983 | SourceLocation EndLocation; |
984 | |
985 | UnqualifiedId() |
986 | : Kind(UnqualifiedIdKind::IK_Identifier), Identifier(nullptr) {} |
987 | |
988 | /// Clear out this unqualified-id, setting it to default (invalid) |
989 | /// state. |
990 | void clear() { |
991 | Kind = UnqualifiedIdKind::IK_Identifier; |
992 | Identifier = nullptr; |
993 | StartLocation = SourceLocation(); |
994 | EndLocation = SourceLocation(); |
995 | } |
996 | |
997 | /// Determine whether this unqualified-id refers to a valid name. |
998 | bool isValid() const { return StartLocation.isValid(); } |
999 | |
1000 | /// Determine whether this unqualified-id refers to an invalid name. |
1001 | bool isInvalid() const { return !isValid(); } |
1002 | |
1003 | /// Determine what kind of name we have. |
1004 | UnqualifiedIdKind getKind() const { return Kind; } |
1005 | void setKind(UnqualifiedIdKind kind) { Kind = kind; } |
1006 | |
1007 | /// Specify that this unqualified-id was parsed as an identifier. |
1008 | /// |
1009 | /// \param Id the parsed identifier. |
1010 | /// \param IdLoc the location of the parsed identifier. |
1011 | void setIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc) { |
1012 | Kind = UnqualifiedIdKind::IK_Identifier; |
1013 | Identifier = const_cast<IdentifierInfo *>(Id); |
1014 | StartLocation = EndLocation = IdLoc; |
1015 | } |
1016 | |
1017 | /// Specify that this unqualified-id was parsed as an |
1018 | /// operator-function-id. |
1019 | /// |
1020 | /// \param OperatorLoc the location of the 'operator' keyword. |
1021 | /// |
1022 | /// \param Op the overloaded operator. |
1023 | /// |
1024 | /// \param SymbolLocations the locations of the individual operator symbols |
1025 | /// in the operator. |
1026 | void setOperatorFunctionId(SourceLocation OperatorLoc, |
1027 | OverloadedOperatorKind Op, |
1028 | SourceLocation SymbolLocations[3]); |
1029 | |
1030 | /// Specify that this unqualified-id was parsed as a |
1031 | /// conversion-function-id. |
1032 | /// |
1033 | /// \param OperatorLoc the location of the 'operator' keyword. |
1034 | /// |
1035 | /// \param Ty the type to which this conversion function is converting. |
1036 | /// |
1037 | /// \param EndLoc the location of the last token that makes up the type name. |
1038 | void setConversionFunctionId(SourceLocation OperatorLoc, |
1039 | ParsedType Ty, |
1040 | SourceLocation EndLoc) { |
1041 | Kind = UnqualifiedIdKind::IK_ConversionFunctionId; |
1042 | StartLocation = OperatorLoc; |
1043 | EndLocation = EndLoc; |
1044 | ConversionFunctionId = Ty; |
1045 | } |
1046 | |
1047 | /// Specific that this unqualified-id was parsed as a |
1048 | /// literal-operator-id. |
1049 | /// |
1050 | /// \param Id the parsed identifier. |
1051 | /// |
1052 | /// \param OpLoc the location of the 'operator' keyword. |
1053 | /// |
1054 | /// \param IdLoc the location of the identifier. |
1055 | void setLiteralOperatorId(const IdentifierInfo *Id, SourceLocation OpLoc, |
1056 | SourceLocation IdLoc) { |
1057 | Kind = UnqualifiedIdKind::IK_LiteralOperatorId; |
1058 | Identifier = const_cast<IdentifierInfo *>(Id); |
1059 | StartLocation = OpLoc; |
1060 | EndLocation = IdLoc; |
1061 | } |
1062 | |
1063 | /// Specify that this unqualified-id was parsed as a constructor name. |
1064 | /// |
1065 | /// \param ClassType the class type referred to by the constructor name. |
1066 | /// |
1067 | /// \param ClassNameLoc the location of the class name. |
1068 | /// |
1069 | /// \param EndLoc the location of the last token that makes up the type name. |
1070 | void setConstructorName(ParsedType ClassType, |
1071 | SourceLocation ClassNameLoc, |
1072 | SourceLocation EndLoc) { |
1073 | Kind = UnqualifiedIdKind::IK_ConstructorName; |
1074 | StartLocation = ClassNameLoc; |
1075 | EndLocation = EndLoc; |
1076 | ConstructorName = ClassType; |
1077 | } |
1078 | |
1079 | /// Specify that this unqualified-id was parsed as a |
1080 | /// template-id that names a constructor. |
1081 | /// |
1082 | /// \param TemplateId the template-id annotation that describes the parsed |
1083 | /// template-id. This UnqualifiedId instance will take ownership of the |
1084 | /// \p TemplateId and will free it on destruction. |
1085 | void setConstructorTemplateId(TemplateIdAnnotation *TemplateId); |
1086 | |
1087 | /// Specify that this unqualified-id was parsed as a destructor name. |
1088 | /// |
1089 | /// \param TildeLoc the location of the '~' that introduces the destructor |
1090 | /// name. |
1091 | /// |
1092 | /// \param ClassType the name of the class referred to by the destructor name. |
1093 | void setDestructorName(SourceLocation TildeLoc, |
1094 | ParsedType ClassType, |
1095 | SourceLocation EndLoc) { |
1096 | Kind = UnqualifiedIdKind::IK_DestructorName; |
1097 | StartLocation = TildeLoc; |
1098 | EndLocation = EndLoc; |
1099 | DestructorName = ClassType; |
1100 | } |
1101 | |
1102 | /// Specify that this unqualified-id was parsed as a template-id. |
1103 | /// |
1104 | /// \param TemplateId the template-id annotation that describes the parsed |
1105 | /// template-id. This UnqualifiedId instance will take ownership of the |
1106 | /// \p TemplateId and will free it on destruction. |
1107 | void setTemplateId(TemplateIdAnnotation *TemplateId); |
1108 | |
1109 | /// Specify that this unqualified-id was parsed as a template-name for |
1110 | /// a deduction-guide. |
1111 | /// |
1112 | /// \param Template The parsed template-name. |
1113 | /// \param TemplateLoc The location of the parsed template-name. |
1114 | void setDeductionGuideName(ParsedTemplateTy Template, |
1115 | SourceLocation TemplateLoc) { |
1116 | Kind = UnqualifiedIdKind::IK_DeductionGuideName; |
1117 | TemplateName = Template; |
1118 | StartLocation = EndLocation = TemplateLoc; |
1119 | } |
1120 | |
1121 | /// Return the source range that covers this unqualified-id. |
1122 | SourceRange getSourceRange() const LLVM_READONLY { |
1123 | return SourceRange(StartLocation, EndLocation); |
1124 | } |
1125 | SourceLocation getLocStart() const LLVM_READONLY { return getBeginLoc(); } |
1126 | SourceLocation getBeginLoc() const LLVM_READONLY { return StartLocation; } |
1127 | SourceLocation getLocEnd() const LLVM_READONLY { return getEndLoc(); } |
1128 | SourceLocation getEndLoc() const LLVM_READONLY { return EndLocation; } |
1129 | }; |
1130 | |
1131 | /// A set of tokens that has been cached for later parsing. |
1132 | typedef SmallVector<Token, 4> CachedTokens; |
1133 | |
1134 | /// One instance of this struct is used for each type in a |
1135 | /// declarator that is parsed. |
1136 | /// |
1137 | /// This is intended to be a small value object. |
1138 | struct DeclaratorChunk { |
1139 | enum { |
1140 | Pointer, Reference, Array, Function, BlockPointer, MemberPointer, Paren, Pipe |
1141 | } Kind; |
1142 | |
1143 | /// Loc - The place where this type was defined. |
1144 | SourceLocation Loc; |
1145 | /// EndLoc - If valid, the place where this chunck ends. |
1146 | SourceLocation EndLoc; |
1147 | |
1148 | SourceRange getSourceRange() const { |
1149 | if (EndLoc.isInvalid()) |
1150 | return SourceRange(Loc, Loc); |
1151 | return SourceRange(Loc, EndLoc); |
1152 | } |
1153 | |
1154 | ParsedAttributesView AttrList; |
1155 | |
1156 | struct PointerTypeInfo { |
1157 | /// The type qualifiers: const/volatile/restrict/unaligned/atomic. |
1158 | unsigned TypeQuals : 5; |
1159 | |
1160 | /// The location of the const-qualifier, if any. |
1161 | unsigned ConstQualLoc; |
1162 | |
1163 | /// The location of the volatile-qualifier, if any. |
1164 | unsigned VolatileQualLoc; |
1165 | |
1166 | /// The location of the restrict-qualifier, if any. |
1167 | unsigned RestrictQualLoc; |
1168 | |
1169 | /// The location of the _Atomic-qualifier, if any. |
1170 | unsigned AtomicQualLoc; |
1171 | |
1172 | /// The location of the __unaligned-qualifier, if any. |
1173 | unsigned UnalignedQualLoc; |
1174 | |
1175 | void destroy() { |
1176 | } |
1177 | }; |
1178 | |
1179 | struct ReferenceTypeInfo { |
1180 | /// The type qualifier: restrict. [GNU] C++ extension |
1181 | bool HasRestrict : 1; |
1182 | /// True if this is an lvalue reference, false if it's an rvalue reference. |
1183 | bool LValueRef : 1; |
1184 | void destroy() { |
1185 | } |
1186 | }; |
1187 | |
1188 | struct ArrayTypeInfo { |
1189 | /// The type qualifiers for the array: |
1190 | /// const/volatile/restrict/__unaligned/_Atomic. |
1191 | unsigned TypeQuals : 5; |
1192 | |
1193 | /// True if this dimension included the 'static' keyword. |
1194 | unsigned hasStatic : 1; |
1195 | |
1196 | /// True if this dimension was [*]. In this case, NumElts is null. |
1197 | unsigned isStar : 1; |
1198 | |
1199 | /// This is the size of the array, or null if [] or [*] was specified. |
1200 | /// Since the parser is multi-purpose, and we don't want to impose a root |
1201 | /// expression class on all clients, NumElts is untyped. |
1202 | Expr *NumElts; |
1203 | |
1204 | void destroy() {} |
1205 | }; |
1206 | |
1207 | /// ParamInfo - An array of paraminfo objects is allocated whenever a function |
1208 | /// declarator is parsed. There are two interesting styles of parameters |
1209 | /// here: |
1210 | /// K&R-style identifier lists and parameter type lists. K&R-style identifier |
1211 | /// lists will have information about the identifier, but no type information. |
1212 | /// Parameter type lists will have type info (if the actions module provides |
1213 | /// it), but may have null identifier info: e.g. for 'void foo(int X, int)'. |
1214 | struct ParamInfo { |
1215 | IdentifierInfo *Ident; |
1216 | SourceLocation IdentLoc; |
1217 | Decl *Param; |
1218 | |
1219 | /// DefaultArgTokens - When the parameter's default argument |
1220 | /// cannot be parsed immediately (because it occurs within the |
1221 | /// declaration of a member function), it will be stored here as a |
1222 | /// sequence of tokens to be parsed once the class definition is |
1223 | /// complete. Non-NULL indicates that there is a default argument. |
1224 | std::unique_ptr<CachedTokens> DefaultArgTokens; |
1225 | |
1226 | ParamInfo() = default; |
1227 | ParamInfo(IdentifierInfo *ident, SourceLocation iloc, |
1228 | Decl *param, |
1229 | std::unique_ptr<CachedTokens> DefArgTokens = nullptr) |
1230 | : Ident(ident), IdentLoc(iloc), Param(param), |
1231 | DefaultArgTokens(std::move(DefArgTokens)) {} |
1232 | }; |
1233 | |
1234 | struct TypeAndRange { |
1235 | ParsedType Ty; |
1236 | SourceRange Range; |
1237 | }; |
1238 | |
1239 | struct FunctionTypeInfo { |
1240 | /// hasPrototype - This is true if the function had at least one typed |
1241 | /// parameter. If the function is () or (a,b,c), then it has no prototype, |
1242 | /// and is treated as a K&R-style function. |
1243 | unsigned hasPrototype : 1; |
1244 | |
1245 | /// isVariadic - If this function has a prototype, and if that |
1246 | /// proto ends with ',...)', this is true. When true, EllipsisLoc |
1247 | /// contains the location of the ellipsis. |
1248 | unsigned isVariadic : 1; |
1249 | |
1250 | /// Can this declaration be a constructor-style initializer? |
1251 | unsigned isAmbiguous : 1; |
1252 | |
1253 | /// Whether the ref-qualifier (if any) is an lvalue reference. |
1254 | /// Otherwise, it's an rvalue reference. |
1255 | unsigned RefQualifierIsLValueRef : 1; |
1256 | |
1257 | /// The type qualifiers: const/volatile/restrict/__unaligned |
1258 | /// The qualifier bitmask values are the same as in QualType. |
1259 | unsigned TypeQuals : 4; |
1260 | |
1261 | /// ExceptionSpecType - An ExceptionSpecificationType value. |
1262 | unsigned ExceptionSpecType : 4; |
1263 | |
1264 | /// DeleteParams - If this is true, we need to delete[] Params. |
1265 | unsigned DeleteParams : 1; |
1266 | |
1267 | /// HasTrailingReturnType - If this is true, a trailing return type was |
1268 | /// specified. |
1269 | unsigned HasTrailingReturnType : 1; |
1270 | |
1271 | /// The location of the left parenthesis in the source. |
1272 | unsigned LParenLoc; |
1273 | |
1274 | /// When isVariadic is true, the location of the ellipsis in the source. |
1275 | unsigned EllipsisLoc; |
1276 | |
1277 | /// The location of the right parenthesis in the source. |
1278 | unsigned RParenLoc; |
1279 | |
1280 | /// NumParams - This is the number of formal parameters specified by the |
1281 | /// declarator. |
1282 | unsigned NumParams; |
1283 | |
1284 | /// NumExceptionsOrDecls - This is the number of types in the |
1285 | /// dynamic-exception-decl, if the function has one. In C, this is the |
1286 | /// number of declarations in the function prototype. |
1287 | unsigned NumExceptionsOrDecls; |
1288 | |
1289 | /// The location of the ref-qualifier, if any. |
1290 | /// |
1291 | /// If this is an invalid location, there is no ref-qualifier. |
1292 | unsigned RefQualifierLoc; |
1293 | |
1294 | /// The location of the const-qualifier, if any. |
1295 | /// |
1296 | /// If this is an invalid location, there is no const-qualifier. |
1297 | unsigned ConstQualifierLoc; |
1298 | |
1299 | /// The location of the volatile-qualifier, if any. |
1300 | /// |
1301 | /// If this is an invalid location, there is no volatile-qualifier. |
1302 | unsigned VolatileQualifierLoc; |
1303 | |
1304 | /// The location of the restrict-qualifier, if any. |
1305 | /// |
1306 | /// If this is an invalid location, there is no restrict-qualifier. |
1307 | unsigned RestrictQualifierLoc; |
1308 | |
1309 | /// The location of the 'mutable' qualifer in a lambda-declarator, if |
1310 | /// any. |
1311 | unsigned MutableLoc; |
1312 | |
1313 | /// The beginning location of the exception specification, if any. |
1314 | unsigned ExceptionSpecLocBeg; |
1315 | |
1316 | /// The end location of the exception specification, if any. |
1317 | unsigned ExceptionSpecLocEnd; |
1318 | |
1319 | /// Params - This is a pointer to a new[]'d array of ParamInfo objects that |
1320 | /// describe the parameters specified by this function declarator. null if |
1321 | /// there are no parameters specified. |
1322 | ParamInfo *Params; |
1323 | |
1324 | union { |
1325 | /// Pointer to a new[]'d array of TypeAndRange objects that |
1326 | /// contain the types in the function's dynamic exception specification |
1327 | /// and their locations, if there is one. |
1328 | TypeAndRange *Exceptions; |
1329 | |
1330 | /// Pointer to the expression in the noexcept-specifier of this |
1331 | /// function, if it has one. |
1332 | Expr *NoexceptExpr; |
1333 | |
1334 | /// Pointer to the cached tokens for an exception-specification |
1335 | /// that has not yet been parsed. |
1336 | CachedTokens *ExceptionSpecTokens; |
1337 | |
1338 | /// Pointer to a new[]'d array of declarations that need to be available |
1339 | /// for lookup inside the function body, if one exists. Does not exist in |
1340 | /// C++. |
1341 | NamedDecl **DeclsInPrototype; |
1342 | }; |
1343 | |
1344 | /// If HasTrailingReturnType is true, this is the trailing return |
1345 | /// type specified. |
1346 | UnionParsedType TrailingReturnType; |
1347 | |
1348 | /// Reset the parameter list to having zero parameters. |
1349 | /// |
1350 | /// This is used in various places for error recovery. |
1351 | void freeParams() { |
1352 | for (unsigned I = 0; I < NumParams; ++I) |
1353 | Params[I].DefaultArgTokens.reset(); |
1354 | if (DeleteParams) { |
1355 | delete[] Params; |
1356 | DeleteParams = false; |
1357 | } |
1358 | NumParams = 0; |
1359 | } |
1360 | |
1361 | void destroy() { |
1362 | freeParams(); |
1363 | switch (getExceptionSpecType()) { |
1364 | default: |
1365 | break; |
1366 | case EST_Dynamic: |
1367 | delete[] Exceptions; |
1368 | break; |
1369 | case EST_Unparsed: |
1370 | delete ExceptionSpecTokens; |
1371 | break; |
1372 | case EST_None: |
1373 | if (NumExceptionsOrDecls != 0) |
1374 | delete[] DeclsInPrototype; |
1375 | break; |
1376 | } |
1377 | } |
1378 | |
1379 | /// isKNRPrototype - Return true if this is a K&R style identifier list, |
1380 | /// like "void foo(a,b,c)". In a function definition, this will be followed |
1381 | /// by the parameter type definitions. |
1382 | bool isKNRPrototype() const { return !hasPrototype && NumParams != 0; } |
1383 | |
1384 | SourceLocation getLParenLoc() const { |
1385 | return SourceLocation::getFromRawEncoding(LParenLoc); |
1386 | } |
1387 | |
1388 | SourceLocation getEllipsisLoc() const { |
1389 | return SourceLocation::getFromRawEncoding(EllipsisLoc); |
1390 | } |
1391 | |
1392 | SourceLocation getRParenLoc() const { |
1393 | return SourceLocation::getFromRawEncoding(RParenLoc); |
1394 | } |
1395 | |
1396 | SourceLocation getExceptionSpecLocBeg() const { |
1397 | return SourceLocation::getFromRawEncoding(ExceptionSpecLocBeg); |
1398 | } |
1399 | |
1400 | SourceLocation getExceptionSpecLocEnd() const { |
1401 | return SourceLocation::getFromRawEncoding(ExceptionSpecLocEnd); |
1402 | } |
1403 | |
1404 | SourceRange getExceptionSpecRange() const { |
1405 | return SourceRange(getExceptionSpecLocBeg(), getExceptionSpecLocEnd()); |
1406 | } |
1407 | |
1408 | /// Retrieve the location of the ref-qualifier, if any. |
1409 | SourceLocation getRefQualifierLoc() const { |
1410 | return SourceLocation::getFromRawEncoding(RefQualifierLoc); |
1411 | } |
1412 | |
1413 | /// Retrieve the location of the 'const' qualifier, if any. |
1414 | SourceLocation getConstQualifierLoc() const { |
1415 | return SourceLocation::getFromRawEncoding(ConstQualifierLoc); |
1416 | } |
1417 | |
1418 | /// Retrieve the location of the 'volatile' qualifier, if any. |
1419 | SourceLocation getVolatileQualifierLoc() const { |
1420 | return SourceLocation::getFromRawEncoding(VolatileQualifierLoc); |
1421 | } |
1422 | |
1423 | /// Retrieve the location of the 'restrict' qualifier, if any. |
1424 | SourceLocation getRestrictQualifierLoc() const { |
1425 | return SourceLocation::getFromRawEncoding(RestrictQualifierLoc); |
1426 | } |
1427 | |
1428 | /// Retrieve the location of the 'mutable' qualifier, if any. |
1429 | SourceLocation getMutableLoc() const { |
1430 | return SourceLocation::getFromRawEncoding(MutableLoc); |
1431 | } |
1432 | |
1433 | /// Determine whether this function declaration contains a |
1434 | /// ref-qualifier. |
1435 | bool hasRefQualifier() const { return getRefQualifierLoc().isValid(); } |
1436 | |
1437 | /// Determine whether this lambda-declarator contains a 'mutable' |
1438 | /// qualifier. |
1439 | bool hasMutableQualifier() const { return getMutableLoc().isValid(); } |
1440 | |
1441 | /// Get the type of exception specification this function has. |
1442 | ExceptionSpecificationType getExceptionSpecType() const { |
1443 | return static_cast<ExceptionSpecificationType>(ExceptionSpecType); |
1444 | } |
1445 | |
1446 | /// Get the number of dynamic exception specifications. |
1447 | unsigned getNumExceptions() const { |
1448 | assert(ExceptionSpecType != EST_None); |
1449 | return NumExceptionsOrDecls; |
1450 | } |
1451 | |
1452 | /// Get the non-parameter decls defined within this function |
1453 | /// prototype. Typically these are tag declarations. |
1454 | ArrayRef<NamedDecl *> getDeclsInPrototype() const { |
1455 | assert(ExceptionSpecType == EST_None); |
1456 | return llvm::makeArrayRef(DeclsInPrototype, NumExceptionsOrDecls); |
1457 | } |
1458 | |
1459 | /// Determine whether this function declarator had a |
1460 | /// trailing-return-type. |
1461 | bool hasTrailingReturnType() const { return HasTrailingReturnType; } |
1462 | |
1463 | /// Get the trailing-return-type for this function declarator. |
1464 | ParsedType getTrailingReturnType() const { return TrailingReturnType; } |
1465 | }; |
1466 | |
1467 | struct BlockPointerTypeInfo { |
1468 | /// For now, sema will catch these as invalid. |
1469 | /// The type qualifiers: const/volatile/restrict/__unaligned/_Atomic. |
1470 | unsigned TypeQuals : 5; |
1471 | |
1472 | void destroy() { |
1473 | } |
1474 | }; |
1475 | |
1476 | struct MemberPointerTypeInfo { |
1477 | /// The type qualifiers: const/volatile/restrict/__unaligned/_Atomic. |
1478 | unsigned TypeQuals : 5; |
1479 | // CXXScopeSpec has a constructor, so it can't be a direct member. |
1480 | // So we need some pointer-aligned storage and a bit of trickery. |
1481 | alignas(CXXScopeSpec) char ScopeMem[sizeof(CXXScopeSpec)]; |
1482 | CXXScopeSpec &Scope() { |
1483 | return *reinterpret_cast<CXXScopeSpec *>(ScopeMem); |
1484 | } |
1485 | const CXXScopeSpec &Scope() const { |
1486 | return *reinterpret_cast<const CXXScopeSpec *>(ScopeMem); |
1487 | } |
1488 | void destroy() { |
1489 | Scope().~CXXScopeSpec(); |
1490 | } |
1491 | }; |
1492 | |
1493 | struct PipeTypeInfo { |
1494 | /// The access writes. |
1495 | unsigned AccessWrites : 3; |
1496 | |
1497 | void destroy() {} |
1498 | }; |
1499 | |
1500 | union { |
1501 | PointerTypeInfo Ptr; |
1502 | ReferenceTypeInfo Ref; |
1503 | ArrayTypeInfo Arr; |
1504 | FunctionTypeInfo Fun; |
1505 | BlockPointerTypeInfo Cls; |
1506 | MemberPointerTypeInfo Mem; |
1507 | PipeTypeInfo PipeInfo; |
1508 | }; |
1509 | |
1510 | void destroy() { |
1511 | switch (Kind) { |
1512 | case DeclaratorChunk::Function: return Fun.destroy(); |
1513 | case DeclaratorChunk::Pointer: return Ptr.destroy(); |
1514 | case DeclaratorChunk::BlockPointer: return Cls.destroy(); |
1515 | case DeclaratorChunk::Reference: return Ref.destroy(); |
1516 | case DeclaratorChunk::Array: return Arr.destroy(); |
1517 | case DeclaratorChunk::MemberPointer: return Mem.destroy(); |
1518 | case DeclaratorChunk::Paren: return; |
1519 | case DeclaratorChunk::Pipe: return PipeInfo.destroy(); |
1520 | } |
1521 | } |
1522 | |
1523 | /// If there are attributes applied to this declaratorchunk, return |
1524 | /// them. |
1525 | const ParsedAttributesView &getAttrs() const { return AttrList; } |
1526 | ParsedAttributesView &getAttrs() { return AttrList; } |
1527 | |
1528 | /// Return a DeclaratorChunk for a pointer. |
1529 | static DeclaratorChunk getPointer(unsigned TypeQuals, SourceLocation Loc, |
1530 | SourceLocation ConstQualLoc, |
1531 | SourceLocation VolatileQualLoc, |
1532 | SourceLocation RestrictQualLoc, |
1533 | SourceLocation AtomicQualLoc, |
1534 | SourceLocation UnalignedQualLoc) { |
1535 | DeclaratorChunk I; |
1536 | I.Kind = Pointer; |
1537 | I.Loc = Loc; |
1538 | I.Ptr.TypeQuals = TypeQuals; |
1539 | I.Ptr.ConstQualLoc = ConstQualLoc.getRawEncoding(); |
1540 | I.Ptr.VolatileQualLoc = VolatileQualLoc.getRawEncoding(); |
1541 | I.Ptr.RestrictQualLoc = RestrictQualLoc.getRawEncoding(); |
1542 | I.Ptr.AtomicQualLoc = AtomicQualLoc.getRawEncoding(); |
1543 | I.Ptr.UnalignedQualLoc = UnalignedQualLoc.getRawEncoding(); |
1544 | return I; |
1545 | } |
1546 | |
1547 | /// Return a DeclaratorChunk for a reference. |
1548 | static DeclaratorChunk getReference(unsigned TypeQuals, SourceLocation Loc, |
1549 | bool lvalue) { |
1550 | DeclaratorChunk I; |
1551 | I.Kind = Reference; |
1552 | I.Loc = Loc; |
1553 | I.Ref.HasRestrict = (TypeQuals & DeclSpec::TQ_restrict) != 0; |
1554 | I.Ref.LValueRef = lvalue; |
1555 | return I; |
1556 | } |
1557 | |
1558 | /// Return a DeclaratorChunk for an array. |
1559 | static DeclaratorChunk getArray(unsigned TypeQuals, |
1560 | bool isStatic, bool isStar, Expr *NumElts, |
1561 | SourceLocation LBLoc, SourceLocation RBLoc) { |
1562 | DeclaratorChunk I; |
1563 | I.Kind = Array; |
1564 | I.Loc = LBLoc; |
1565 | I.EndLoc = RBLoc; |
1566 | I.Arr.TypeQuals = TypeQuals; |
1567 | I.Arr.hasStatic = isStatic; |
1568 | I.Arr.isStar = isStar; |
1569 | I.Arr.NumElts = NumElts; |
1570 | return I; |
1571 | } |
1572 | |
1573 | /// DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function. |
1574 | /// "TheDeclarator" is the declarator that this will be added to. |
1575 | static DeclaratorChunk getFunction(bool HasProto, |
1576 | bool IsAmbiguous, |
1577 | SourceLocation LParenLoc, |
1578 | ParamInfo *Params, unsigned NumParams, |
1579 | SourceLocation EllipsisLoc, |
1580 | SourceLocation RParenLoc, |
1581 | unsigned TypeQuals, |
1582 | bool RefQualifierIsLvalueRef, |
1583 | SourceLocation RefQualifierLoc, |
1584 | SourceLocation ConstQualifierLoc, |
1585 | SourceLocation VolatileQualifierLoc, |
1586 | SourceLocation RestrictQualifierLoc, |
1587 | SourceLocation MutableLoc, |
1588 | ExceptionSpecificationType ESpecType, |
1589 | SourceRange ESpecRange, |
1590 | ParsedType *Exceptions, |
1591 | SourceRange *ExceptionRanges, |
1592 | unsigned NumExceptions, |
1593 | Expr *NoexceptExpr, |
1594 | CachedTokens *ExceptionSpecTokens, |
1595 | ArrayRef<NamedDecl *> DeclsInPrototype, |
1596 | SourceLocation LocalRangeBegin, |
1597 | SourceLocation LocalRangeEnd, |
1598 | Declarator &TheDeclarator, |
1599 | TypeResult TrailingReturnType = |
1600 | TypeResult()); |
1601 | |
1602 | /// Return a DeclaratorChunk for a block. |
1603 | static DeclaratorChunk getBlockPointer(unsigned TypeQuals, |
1604 | SourceLocation Loc) { |
1605 | DeclaratorChunk I; |
1606 | I.Kind = BlockPointer; |
1607 | I.Loc = Loc; |
1608 | I.Cls.TypeQuals = TypeQuals; |
1609 | return I; |
1610 | } |
1611 | |
1612 | /// Return a DeclaratorChunk for a block. |
1613 | static DeclaratorChunk getPipe(unsigned TypeQuals, |
1614 | SourceLocation Loc) { |
1615 | DeclaratorChunk I; |
1616 | I.Kind = Pipe; |
1617 | I.Loc = Loc; |
1618 | I.Cls.TypeQuals = TypeQuals; |
1619 | return I; |
1620 | } |
1621 | |
1622 | static DeclaratorChunk getMemberPointer(const CXXScopeSpec &SS, |
1623 | unsigned TypeQuals, |
1624 | SourceLocation Loc) { |
1625 | DeclaratorChunk I; |
1626 | I.Kind = MemberPointer; |
1627 | I.Loc = SS.getBeginLoc(); |
1628 | I.EndLoc = Loc; |
1629 | I.Mem.TypeQuals = TypeQuals; |
1630 | new (I.Mem.ScopeMem) CXXScopeSpec(SS); |
1631 | return I; |
1632 | } |
1633 | |
1634 | /// Return a DeclaratorChunk for a paren. |
1635 | static DeclaratorChunk getParen(SourceLocation LParenLoc, |
1636 | SourceLocation RParenLoc) { |
1637 | DeclaratorChunk I; |
1638 | I.Kind = Paren; |
1639 | I.Loc = LParenLoc; |
1640 | I.EndLoc = RParenLoc; |
1641 | return I; |
1642 | } |
1643 | |
1644 | bool isParen() const { |
1645 | return Kind == Paren; |
1646 | } |
1647 | }; |
1648 | |
1649 | /// A parsed C++17 decomposition declarator of the form |
1650 | /// '[' identifier-list ']' |
1651 | class DecompositionDeclarator { |
1652 | public: |
1653 | struct Binding { |
1654 | IdentifierInfo *Name; |
1655 | SourceLocation NameLoc; |
1656 | }; |
1657 | |
1658 | private: |
1659 | /// The locations of the '[' and ']' tokens. |
1660 | SourceLocation LSquareLoc, RSquareLoc; |
1661 | |
1662 | /// The bindings. |
1663 | Binding *Bindings; |
1664 | unsigned NumBindings : 31; |
1665 | unsigned DeleteBindings : 1; |
1666 | |
1667 | friend class Declarator; |
1668 | |
1669 | public: |
1670 | DecompositionDeclarator() |
1671 | : Bindings(nullptr), NumBindings(0), DeleteBindings(false) {} |
1672 | DecompositionDeclarator(const DecompositionDeclarator &G) = delete; |
1673 | DecompositionDeclarator &operator=(const DecompositionDeclarator &G) = delete; |
1674 | ~DecompositionDeclarator() { |
1675 | if (DeleteBindings) |
1676 | delete[] Bindings; |
1677 | } |
1678 | |
1679 | void clear() { |
1680 | LSquareLoc = RSquareLoc = SourceLocation(); |
1681 | if (DeleteBindings) |
1682 | delete[] Bindings; |
1683 | Bindings = nullptr; |
1684 | NumBindings = 0; |
1685 | DeleteBindings = false; |
1686 | } |
1687 | |
1688 | ArrayRef<Binding> bindings() const { |
1689 | return llvm::makeArrayRef(Bindings, NumBindings); |
1690 | } |
1691 | |
1692 | bool isSet() const { return LSquareLoc.isValid(); } |
1693 | |
1694 | SourceLocation getLSquareLoc() const { return LSquareLoc; } |
1695 | SourceLocation getRSquareLoc() const { return RSquareLoc; } |
1696 | SourceRange getSourceRange() const { |
1697 | return SourceRange(LSquareLoc, RSquareLoc); |
1698 | } |
1699 | }; |
1700 | |
1701 | /// Described the kind of function definition (if any) provided for |
1702 | /// a function. |
1703 | enum FunctionDefinitionKind { |
1704 | FDK_Declaration, |
1705 | FDK_Definition, |
1706 | FDK_Defaulted, |
1707 | FDK_Deleted |
1708 | }; |
1709 | |
1710 | enum class DeclaratorContext { |
1711 | FileContext, // File scope declaration. |
1712 | PrototypeContext, // Within a function prototype. |
1713 | ObjCResultContext, // An ObjC method result type. |
1714 | ObjCParameterContext,// An ObjC method parameter type. |
1715 | KNRTypeListContext, // K&R type definition list for formals. |
1716 | TypeNameContext, // Abstract declarator for types. |
1717 | FunctionalCastContext, // Type in a C++ functional cast expression. |
1718 | MemberContext, // Struct/Union field. |
1719 | BlockContext, // Declaration within a block in a function. |
1720 | ForContext, // Declaration within first part of a for loop. |
1721 | InitStmtContext, // Declaration within optional init stmt of if/switch. |
1722 | ConditionContext, // Condition declaration in a C++ if/switch/while/for. |
1723 | TemplateParamContext,// Within a template parameter list. |
1724 | CXXNewContext, // C++ new-expression. |
1725 | CXXCatchContext, // C++ catch exception-declaration |
1726 | ObjCCatchContext, // Objective-C catch exception-declaration |
1727 | BlockLiteralContext, // Block literal declarator. |
1728 | LambdaExprContext, // Lambda-expression declarator. |
1729 | LambdaExprParameterContext, // Lambda-expression parameter declarator. |
1730 | ConversionIdContext, // C++ conversion-type-id. |
1731 | TrailingReturnContext, // C++11 trailing-type-specifier. |
1732 | TrailingReturnVarContext, // C++11 trailing-type-specifier for variable. |
1733 | TemplateArgContext, // Any template argument (in template argument list). |
1734 | TemplateTypeArgContext, // Template type argument (in default argument). |
1735 | AliasDeclContext, // C++11 alias-declaration. |
1736 | AliasTemplateContext // C++11 alias-declaration template. |
1737 | }; |
1738 | |
1739 | |
1740 | /// Information about one declarator, including the parsed type |
1741 | /// information and the identifier. |
1742 | /// |
1743 | /// When the declarator is fully formed, this is turned into the appropriate |
1744 | /// Decl object. |
1745 | /// |
1746 | /// Declarators come in two types: normal declarators and abstract declarators. |
1747 | /// Abstract declarators are used when parsing types, and don't have an |
1748 | /// identifier. Normal declarators do have ID's. |
1749 | /// |
1750 | /// Instances of this class should be a transient object that lives on the |
1751 | /// stack, not objects that are allocated in large quantities on the heap. |
1752 | class Declarator { |
1753 | |
1754 | private: |
1755 | const DeclSpec &DS; |
1756 | CXXScopeSpec SS; |
1757 | UnqualifiedId Name; |
1758 | SourceRange Range; |
1759 | |
1760 | /// Where we are parsing this declarator. |
1761 | DeclaratorContext Context; |
1762 | |
1763 | /// The C++17 structured binding, if any. This is an alternative to a Name. |
1764 | DecompositionDeclarator BindingGroup; |
1765 | |
1766 | /// DeclTypeInfo - This holds each type that the declarator includes as it is |
1767 | /// parsed. This is pushed from the identifier out, which means that element |
1768 | /// #0 will be the most closely bound to the identifier, and |
1769 | /// DeclTypeInfo.back() will be the least closely bound. |
1770 | SmallVector<DeclaratorChunk, 8> DeclTypeInfo; |
1771 | |
1772 | /// InvalidType - Set by Sema::GetTypeForDeclarator(). |
1773 | unsigned InvalidType : 1; |
1774 | |
1775 | /// GroupingParens - Set by Parser::ParseParenDeclarator(). |
1776 | unsigned GroupingParens : 1; |
1777 | |
1778 | /// FunctionDefinition - Is this Declarator for a function or member |
1779 | /// definition and, if so, what kind? |
1780 | /// |
1781 | /// Actually a FunctionDefinitionKind. |
1782 | unsigned FunctionDefinition : 2; |
1783 | |
1784 | /// Is this Declarator a redeclaration? |
1785 | unsigned Redeclaration : 1; |
1786 | |
1787 | /// true if the declaration is preceded by \c __extension__. |
1788 | unsigned Extension : 1; |
1789 | |
1790 | /// Indicates whether this is an Objective-C instance variable. |
1791 | unsigned ObjCIvar : 1; |
1792 | |
1793 | /// Indicates whether this is an Objective-C 'weak' property. |
1794 | unsigned ObjCWeakProperty : 1; |
1795 | |
1796 | /// Indicates whether the InlineParams / InlineBindings storage has been used. |
1797 | unsigned InlineStorageUsed : 1; |
1798 | |
1799 | /// Attrs - Attributes. |
1800 | ParsedAttributes Attrs; |
1801 | |
1802 | /// The asm label, if specified. |
1803 | Expr *AsmLabel; |
1804 | |
1805 | #ifndef _MSC_VER |
1806 | union { |
1807 | #endif |
1808 | /// InlineParams - This is a local array used for the first function decl |
1809 | /// chunk to avoid going to the heap for the common case when we have one |
1810 | /// function chunk in the declarator. |
1811 | DeclaratorChunk::ParamInfo InlineParams[16]; |
1812 | DecompositionDeclarator::Binding InlineBindings[16]; |
1813 | #ifndef _MSC_VER |
1814 | }; |
1815 | #endif |
1816 | |
1817 | /// If this is the second or subsequent declarator in this declaration, |
1818 | /// the location of the comma before this declarator. |
1819 | SourceLocation CommaLoc; |
1820 | |
1821 | /// If provided, the source location of the ellipsis used to describe |
1822 | /// this declarator as a parameter pack. |
1823 | SourceLocation EllipsisLoc; |
1824 | |
1825 | friend struct DeclaratorChunk; |
1826 | |
1827 | public: |
1828 | Declarator(const DeclSpec &ds, DeclaratorContext C) |
1829 | : DS(ds), Range(ds.getSourceRange()), Context(C), |
1830 | InvalidType(DS.getTypeSpecType() == DeclSpec::TST_error), |
1831 | GroupingParens(false), FunctionDefinition(FDK_Declaration), |
1832 | Redeclaration(false), Extension(false), ObjCIvar(false), |
1833 | ObjCWeakProperty(false), InlineStorageUsed(false), |
1834 | Attrs(ds.getAttributePool().getFactory()), AsmLabel(nullptr) {} |
1835 | |
1836 | ~Declarator() { |
1837 | clear(); |
1838 | } |
1839 | /// getDeclSpec - Return the declaration-specifier that this declarator was |
1840 | /// declared with. |
1841 | const DeclSpec &getDeclSpec() const { return DS; } |
1842 | |
1843 | /// getMutableDeclSpec - Return a non-const version of the DeclSpec. This |
1844 | /// should be used with extreme care: declspecs can often be shared between |
1845 | /// multiple declarators, so mutating the DeclSpec affects all of the |
1846 | /// Declarators. This should only be done when the declspec is known to not |
1847 | /// be shared or when in error recovery etc. |
1848 | DeclSpec &getMutableDeclSpec() { return const_cast<DeclSpec &>(DS); } |
1849 | |
1850 | AttributePool &getAttributePool() const { |
1851 | return Attrs.getPool(); |
1852 | } |
1853 | |
1854 | /// getCXXScopeSpec - Return the C++ scope specifier (global scope or |
1855 | /// nested-name-specifier) that is part of the declarator-id. |
1856 | const CXXScopeSpec &getCXXScopeSpec() const { return SS; } |
1857 | CXXScopeSpec &getCXXScopeSpec() { return SS; } |
1858 | |
1859 | /// Retrieve the name specified by this declarator. |
1860 | UnqualifiedId &getName() { return Name; } |
1861 | |
1862 | const DecompositionDeclarator &getDecompositionDeclarator() const { |
1863 | return BindingGroup; |
1864 | } |
1865 | |
1866 | DeclaratorContext getContext() const { return Context; } |
1867 | |
1868 | bool isPrototypeContext() const { |
1869 | return (Context == DeclaratorContext::PrototypeContext || |
1870 | Context == DeclaratorContext::ObjCParameterContext || |
1871 | Context == DeclaratorContext::ObjCResultContext || |
1872 | Context == DeclaratorContext::LambdaExprParameterContext); |
1873 | } |
1874 | |
1875 | /// Get the source range that spans this declarator. |
1876 | SourceRange getSourceRange() const LLVM_READONLY { return Range; } |
1877 | SourceLocation getLocStart() const LLVM_READONLY { return getBeginLoc(); } |
1878 | SourceLocation getBeginLoc() const LLVM_READONLY { return Range.getBegin(); } |
1879 | SourceLocation getLocEnd() const LLVM_READONLY { return getEndLoc(); } |
1880 | SourceLocation getEndLoc() const LLVM_READONLY { return Range.getEnd(); } |
1881 | |
1882 | void SetSourceRange(SourceRange R) { Range = R; } |
1883 | /// SetRangeBegin - Set the start of the source range to Loc, unless it's |
1884 | /// invalid. |
1885 | void SetRangeBegin(SourceLocation Loc) { |
1886 | if (!Loc.isInvalid()) |
1887 | Range.setBegin(Loc); |
1888 | } |
1889 | /// SetRangeEnd - Set the end of the source range to Loc, unless it's invalid. |
1890 | void SetRangeEnd(SourceLocation Loc) { |
1891 | if (!Loc.isInvalid()) |
1892 | Range.setEnd(Loc); |
1893 | } |
1894 | /// ExtendWithDeclSpec - Extend the declarator source range to include the |
1895 | /// given declspec, unless its location is invalid. Adopts the range start if |
1896 | /// the current range start is invalid. |
1897 | void ExtendWithDeclSpec(const DeclSpec &DS) { |
1898 | SourceRange SR = DS.getSourceRange(); |
1899 | if (Range.getBegin().isInvalid()) |
1900 | Range.setBegin(SR.getBegin()); |
1901 | if (!SR.getEnd().isInvalid()) |
1902 | Range.setEnd(SR.getEnd()); |
1903 | } |
1904 | |
1905 | /// Reset the contents of this Declarator. |
1906 | void clear() { |
1907 | SS.clear(); |
1908 | Name.clear(); |
1909 | Range = DS.getSourceRange(); |
1910 | BindingGroup.clear(); |
1911 | |
1912 | for (unsigned i = 0, e = DeclTypeInfo.size(); i != e; ++i) |
1913 | DeclTypeInfo[i].destroy(); |
1914 | DeclTypeInfo.clear(); |
1915 | Attrs.clear(); |
1916 | AsmLabel = nullptr; |
1917 | InlineStorageUsed = false; |
1918 | ObjCIvar = false; |
1919 | ObjCWeakProperty = false; |
1920 | CommaLoc = SourceLocation(); |
1921 | EllipsisLoc = SourceLocation(); |
1922 | } |
1923 | |
1924 | /// mayOmitIdentifier - Return true if the identifier is either optional or |
1925 | /// not allowed. This is true for typenames, prototypes, and template |
1926 | /// parameter lists. |
1927 | bool mayOmitIdentifier() const { |
1928 | switch (Context) { |
1929 | case DeclaratorContext::FileContext: |
1930 | case DeclaratorContext::KNRTypeListContext: |
1931 | case DeclaratorContext::MemberContext: |
1932 | case DeclaratorContext::BlockContext: |
1933 | case DeclaratorContext::ForContext: |
1934 | case DeclaratorContext::InitStmtContext: |
1935 | case DeclaratorContext::ConditionContext: |
1936 | return false; |
1937 | |
1938 | case DeclaratorContext::TypeNameContext: |
1939 | case DeclaratorContext::FunctionalCastContext: |
1940 | case DeclaratorContext::AliasDeclContext: |
1941 | case DeclaratorContext::AliasTemplateContext: |
1942 | case DeclaratorContext::PrototypeContext: |
1943 | case DeclaratorContext::LambdaExprParameterContext: |
1944 | case DeclaratorContext::ObjCParameterContext: |
1945 | case DeclaratorContext::ObjCResultContext: |
1946 | case DeclaratorContext::TemplateParamContext: |
1947 | case DeclaratorContext::CXXNewContext: |
1948 | case DeclaratorContext::CXXCatchContext: |
1949 | case DeclaratorContext::ObjCCatchContext: |
1950 | case DeclaratorContext::BlockLiteralContext: |
1951 | case DeclaratorContext::LambdaExprContext: |
1952 | case DeclaratorContext::ConversionIdContext: |
1953 | case DeclaratorContext::TemplateArgContext: |
1954 | case DeclaratorContext::TemplateTypeArgContext: |
1955 | case DeclaratorContext::TrailingReturnContext: |
1956 | case DeclaratorContext::TrailingReturnVarContext: |
1957 | return true; |
1958 | } |
1959 | llvm_unreachable("unknown context kind!"); |
1960 | } |
1961 | |
1962 | /// mayHaveIdentifier - Return true if the identifier is either optional or |
1963 | /// required. This is true for normal declarators and prototypes, but not |
1964 | /// typenames. |
1965 | bool mayHaveIdentifier() const { |
1966 | switch (Context) { |
1967 | case DeclaratorContext::FileContext: |
1968 | case DeclaratorContext::KNRTypeListContext: |
1969 | case DeclaratorContext::MemberContext: |
1970 | case DeclaratorContext::BlockContext: |
1971 | case DeclaratorContext::ForContext: |
1972 | case DeclaratorContext::InitStmtContext: |
1973 | case DeclaratorContext::ConditionContext: |
1974 | case DeclaratorContext::PrototypeContext: |
1975 | case DeclaratorContext::LambdaExprParameterContext: |
1976 | case DeclaratorContext::TemplateParamContext: |
1977 | case DeclaratorContext::CXXCatchContext: |
1978 | case DeclaratorContext::ObjCCatchContext: |
1979 | return true; |
1980 | |
1981 | case DeclaratorContext::TypeNameContext: |
1982 | case DeclaratorContext::FunctionalCastContext: |
1983 | case DeclaratorContext::CXXNewContext: |
1984 | case DeclaratorContext::AliasDeclContext: |
1985 | case DeclaratorContext::AliasTemplateContext: |
1986 | case DeclaratorContext::ObjCParameterContext: |
1987 | case DeclaratorContext::ObjCResultContext: |
1988 | case DeclaratorContext::BlockLiteralContext: |
1989 | case DeclaratorContext::LambdaExprContext: |
1990 | case DeclaratorContext::ConversionIdContext: |
1991 | case DeclaratorContext::TemplateArgContext: |
1992 | case DeclaratorContext::TemplateTypeArgContext: |
1993 | case DeclaratorContext::TrailingReturnContext: |
1994 | case DeclaratorContext::TrailingReturnVarContext: |
1995 | return false; |
1996 | } |
1997 | llvm_unreachable("unknown context kind!"); |
1998 | } |
1999 | |
2000 | /// Return true if the context permits a C++17 decomposition declarator. |
2001 | bool mayHaveDecompositionDeclarator() const { |
2002 | switch (Context) { |
2003 | case DeclaratorContext::FileContext: |
2004 | // FIXME: It's not clear that the proposal meant to allow file-scope |
2005 | // structured bindings, but it does. |
2006 | case DeclaratorContext::BlockContext: |
2007 | case DeclaratorContext::ForContext: |
2008 | case DeclaratorContext::InitStmtContext: |
2009 | case DeclaratorContext::ConditionContext: |
2010 | return true; |
2011 | |
2012 | case DeclaratorContext::MemberContext: |
2013 | case DeclaratorContext::PrototypeContext: |
2014 | case DeclaratorContext::TemplateParamContext: |
2015 | // Maybe one day... |
2016 | return false; |
2017 | |
2018 | // These contexts don't allow any kind of non-abstract declarator. |
2019 | case DeclaratorContext::KNRTypeListContext: |
2020 | case DeclaratorContext::TypeNameContext: |
2021 | case DeclaratorContext::FunctionalCastContext: |
2022 | case DeclaratorContext::AliasDeclContext: |
2023 | case DeclaratorContext::AliasTemplateContext: |
2024 | case DeclaratorContext::LambdaExprParameterContext: |
2025 | case DeclaratorContext::ObjCParameterContext: |
2026 | case DeclaratorContext::ObjCResultContext: |
2027 | case DeclaratorContext::CXXNewContext: |
2028 | case DeclaratorContext::CXXCatchContext: |
2029 | case DeclaratorContext::ObjCCatchContext: |
2030 | case DeclaratorContext::BlockLiteralContext: |
2031 | case DeclaratorContext::LambdaExprContext: |
2032 | case DeclaratorContext::ConversionIdContext: |
2033 | case DeclaratorContext::TemplateArgContext: |
2034 | case DeclaratorContext::TemplateTypeArgContext: |
2035 | case DeclaratorContext::TrailingReturnContext: |
2036 | case DeclaratorContext::TrailingReturnVarContext: |
2037 | return false; |
2038 | } |
2039 | llvm_unreachable("unknown context kind!"); |
2040 | } |
2041 | |
2042 | /// mayBeFollowedByCXXDirectInit - Return true if the declarator can be |
2043 | /// followed by a C++ direct initializer, e.g. "int x(1);". |
2044 | bool mayBeFollowedByCXXDirectInit() const { |
2045 | if (hasGroupingParens()) return false; |
2046 | |
2047 | if (getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_typedef) |
2048 | return false; |
2049 | |
2050 | if (getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_extern && |
2051 | Context != DeclaratorContext::FileContext) |
2052 | return false; |
2053 | |
2054 | // Special names can't have direct initializers. |
2055 | if (Name.getKind() != UnqualifiedIdKind::IK_Identifier) |
2056 | return false; |
2057 | |
2058 | switch (Context) { |
2059 | case DeclaratorContext::FileContext: |
2060 | case DeclaratorContext::BlockContext: |
2061 | case DeclaratorContext::ForContext: |
2062 | case DeclaratorContext::InitStmtContext: |
2063 | case DeclaratorContext::TrailingReturnVarContext: |
2064 | return true; |
2065 | |
2066 | case DeclaratorContext::ConditionContext: |
2067 | // This may not be followed by a direct initializer, but it can't be a |
2068 | // function declaration either, and we'd prefer to perform a tentative |
2069 | // parse in order to produce the right diagnostic. |
2070 | return true; |
2071 | |
2072 | case DeclaratorContext::KNRTypeListContext: |
2073 | case DeclaratorContext::MemberContext: |
2074 | case DeclaratorContext::PrototypeContext: |
2075 | case DeclaratorContext::LambdaExprParameterContext: |
2076 | case DeclaratorContext::ObjCParameterContext: |
2077 | case DeclaratorContext::ObjCResultContext: |
2078 | case DeclaratorContext::TemplateParamContext: |
2079 | case DeclaratorContext::CXXCatchContext: |
2080 | case DeclaratorContext::ObjCCatchContext: |
2081 | case DeclaratorContext::TypeNameContext: |
2082 | case DeclaratorContext::FunctionalCastContext: // FIXME |
2083 | case DeclaratorContext::CXXNewContext: |
2084 | case DeclaratorContext::AliasDeclContext: |
2085 | case DeclaratorContext::AliasTemplateContext: |
2086 | case DeclaratorContext::BlockLiteralContext: |
2087 | case DeclaratorContext::LambdaExprContext: |
2088 | case DeclaratorContext::ConversionIdContext: |
2089 | case DeclaratorContext::TemplateArgContext: |
2090 | case DeclaratorContext::TemplateTypeArgContext: |
2091 | case DeclaratorContext::TrailingReturnContext: |
2092 | return false; |
2093 | } |
2094 | llvm_unreachable("unknown context kind!"); |
2095 | } |
2096 | |
2097 | /// isPastIdentifier - Return true if we have parsed beyond the point where |
2098 | /// the name would appear. (This may happen even if we haven't actually parsed |
2099 | /// a name, perhaps because this context doesn't require one.) |
2100 | bool isPastIdentifier() const { return Name.isValid(); } |
2101 | |
2102 | /// hasName - Whether this declarator has a name, which might be an |
2103 | /// identifier (accessible via getIdentifier()) or some kind of |
2104 | /// special C++ name (constructor, destructor, etc.), or a structured |
2105 | /// binding (which is not exactly a name, but occupies the same position). |
2106 | bool hasName() const { |
2107 | return Name.getKind() != UnqualifiedIdKind::IK_Identifier || |
2108 | Name.Identifier || isDecompositionDeclarator(); |
2109 | } |
2110 | |
2111 | /// Return whether this declarator is a decomposition declarator. |
2112 | bool isDecompositionDeclarator() const { |
2113 | return BindingGroup.isSet(); |
2114 | } |
2115 | |
2116 | IdentifierInfo *getIdentifier() const { |
2117 | if (Name.getKind() == UnqualifiedIdKind::IK_Identifier) |
2118 | return Name.Identifier; |
2119 | |
2120 | return nullptr; |
2121 | } |
2122 | SourceLocation getIdentifierLoc() const { return Name.StartLocation; } |
2123 | |
2124 | /// Set the name of this declarator to be the given identifier. |
2125 | void SetIdentifier(IdentifierInfo *Id, SourceLocation IdLoc) { |
2126 | Name.setIdentifier(Id, IdLoc); |
2127 | } |
2128 | |
2129 | /// Set the decomposition bindings for this declarator. |
2130 | void |
2131 | setDecompositionBindings(SourceLocation LSquareLoc, |
2132 | ArrayRef<DecompositionDeclarator::Binding> Bindings, |
2133 | SourceLocation RSquareLoc); |
2134 | |
2135 | /// AddTypeInfo - Add a chunk to this declarator. Also extend the range to |
2136 | /// EndLoc, which should be the last token of the chunk. |
2137 | /// This function takes attrs by R-Value reference because it takes ownership |
2138 | /// of those attributes from the parameter. |
2139 | void AddTypeInfo(const DeclaratorChunk &TI, ParsedAttributes &&attrs, |
2140 | SourceLocation EndLoc) { |
2141 | DeclTypeInfo.push_back(TI); |
2142 | DeclTypeInfo.back().getAttrs().addAll(attrs.begin(), attrs.end()); |
2143 | getAttributePool().takeAllFrom(attrs.getPool()); |
2144 | |
2145 | if (!EndLoc.isInvalid()) |
2146 | SetRangeEnd(EndLoc); |
2147 | } |
2148 | |
2149 | /// AddTypeInfo - Add a chunk to this declarator. Also extend the range to |
2150 | /// EndLoc, which should be the last token of the chunk. |
2151 | void AddTypeInfo(const DeclaratorChunk &TI, SourceLocation EndLoc) { |
2152 | DeclTypeInfo.push_back(TI); |
2153 | |
2154 | if (!EndLoc.isInvalid()) |
2155 | SetRangeEnd(EndLoc); |
2156 | } |
2157 | |
2158 | /// Add a new innermost chunk to this declarator. |
2159 | void AddInnermostTypeInfo(const DeclaratorChunk &TI) { |
2160 | DeclTypeInfo.insert(DeclTypeInfo.begin(), TI); |
2161 | } |
2162 | |
2163 | /// Return the number of types applied to this declarator. |
2164 | unsigned getNumTypeObjects() const { return DeclTypeInfo.size(); } |
2165 | |
2166 | /// Return the specified TypeInfo from this declarator. TypeInfo #0 is |
2167 | /// closest to the identifier. |
2168 | const DeclaratorChunk &getTypeObject(unsigned i) const { |
2169 | assert(i < DeclTypeInfo.size() && "Invalid type chunk"); |
2170 | return DeclTypeInfo[i]; |
2171 | } |
2172 | DeclaratorChunk &getTypeObject(unsigned i) { |
2173 | assert(i < DeclTypeInfo.size() && "Invalid type chunk"); |
2174 | return DeclTypeInfo[i]; |
2175 | } |
2176 | |
2177 | typedef SmallVectorImpl<DeclaratorChunk>::const_iterator type_object_iterator; |
2178 | typedef llvm::iterator_range<type_object_iterator> type_object_range; |
2179 | |
2180 | /// Returns the range of type objects, from the identifier outwards. |
2181 | type_object_range type_objects() const { |
2182 | return type_object_range(DeclTypeInfo.begin(), DeclTypeInfo.end()); |
2183 | } |
2184 | |
2185 | void DropFirstTypeObject() { |
2186 | assert(!DeclTypeInfo.empty() && "No type chunks to drop."); |
2187 | DeclTypeInfo.front().destroy(); |
2188 | DeclTypeInfo.erase(DeclTypeInfo.begin()); |
2189 | } |
2190 | |
2191 | /// Return the innermost (closest to the declarator) chunk of this |
2192 | /// declarator that is not a parens chunk, or null if there are no |
2193 | /// non-parens chunks. |
2194 | const DeclaratorChunk *getInnermostNonParenChunk() const { |
2195 | for (unsigned i = 0, i_end = DeclTypeInfo.size(); i < i_end; ++i) { |
2196 | if (!DeclTypeInfo[i].isParen()) |
2197 | return &DeclTypeInfo[i]; |
2198 | } |
2199 | return nullptr; |
2200 | } |
2201 | |
2202 | /// Return the outermost (furthest from the declarator) chunk of |
2203 | /// this declarator that is not a parens chunk, or null if there are |
2204 | /// no non-parens chunks. |
2205 | const DeclaratorChunk *getOutermostNonParenChunk() const { |
2206 | for (unsigned i = DeclTypeInfo.size(), i_end = 0; i != i_end; --i) { |
2207 | if (!DeclTypeInfo[i-1].isParen()) |
2208 | return &DeclTypeInfo[i-1]; |
2209 | } |
2210 | return nullptr; |
2211 | } |
2212 | |
2213 | /// isArrayOfUnknownBound - This method returns true if the declarator |
2214 | /// is a declarator for an array of unknown bound (looking through |
2215 | /// parentheses). |
2216 | bool isArrayOfUnknownBound() const { |
2217 | const DeclaratorChunk *chunk = getInnermostNonParenChunk(); |
2218 | return (chunk && chunk->Kind == DeclaratorChunk::Array && |
2219 | !chunk->Arr.NumElts); |
2220 | } |
2221 | |
2222 | /// isFunctionDeclarator - This method returns true if the declarator |
2223 | /// is a function declarator (looking through parentheses). |
2224 | /// If true is returned, then the reference type parameter idx is |
2225 | /// assigned with the index of the declaration chunk. |
2226 | bool isFunctionDeclarator(unsigned& idx) const { |
2227 | for (unsigned i = 0, i_end = DeclTypeInfo.size(); i < i_end; ++i) { |
2228 | switch (DeclTypeInfo[i].Kind) { |
2229 | case DeclaratorChunk::Function: |
2230 | idx = i; |
2231 | return true; |
2232 | case DeclaratorChunk::Paren: |
2233 | continue; |
2234 | case DeclaratorChunk::Pointer: |
2235 | case DeclaratorChunk::Reference: |
2236 | case DeclaratorChunk::Array: |
2237 | case DeclaratorChunk::BlockPointer: |
2238 | case DeclaratorChunk::MemberPointer: |
2239 | case DeclaratorChunk::Pipe: |
2240 | return false; |
2241 | } |
2242 | llvm_unreachable("Invalid type chunk"); |
2243 | } |
2244 | return false; |
2245 | } |
2246 | |
2247 | /// isFunctionDeclarator - Once this declarator is fully parsed and formed, |
2248 | /// this method returns true if the identifier is a function declarator |
2249 | /// (looking through parentheses). |
2250 | bool isFunctionDeclarator() const { |
2251 | unsigned index; |
2252 | return isFunctionDeclarator(index); |
2253 | } |
2254 | |
2255 | /// getFunctionTypeInfo - Retrieves the function type info object |
2256 | /// (looking through parentheses). |
2257 | DeclaratorChunk::FunctionTypeInfo &getFunctionTypeInfo() { |
2258 | assert(isFunctionDeclarator() && "Not a function declarator!"); |
2259 | unsigned index = 0; |
2260 | isFunctionDeclarator(index); |
2261 | return DeclTypeInfo[index].Fun; |
2262 | } |
2263 | |
2264 | /// getFunctionTypeInfo - Retrieves the function type info object |
2265 | /// (looking through parentheses). |
2266 | const DeclaratorChunk::FunctionTypeInfo &getFunctionTypeInfo() const { |
2267 | return const_cast<Declarator*>(this)->getFunctionTypeInfo(); |
2268 | } |
2269 | |
2270 | /// Determine whether the declaration that will be produced from |
2271 | /// this declaration will be a function. |
2272 | /// |
2273 | /// A declaration can declare a function even if the declarator itself |
2274 | /// isn't a function declarator, if the type specifier refers to a function |
2275 | /// type. This routine checks for both cases. |
2276 | bool isDeclarationOfFunction() const; |
2277 | |
2278 | /// Return true if this declaration appears in a context where a |
2279 | /// function declarator would be a function declaration. |
2280 | bool isFunctionDeclarationContext() const { |
2281 | if (getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_typedef) |
2282 | return false; |
2283 | |
2284 | switch (Context) { |
2285 | case DeclaratorContext::FileContext: |
2286 | case DeclaratorContext::MemberContext: |
2287 | case DeclaratorContext::BlockContext: |
2288 | case DeclaratorContext::ForContext: |
2289 | case DeclaratorContext::InitStmtContext: |
2290 | return true; |
2291 | |
2292 | case DeclaratorContext::ConditionContext: |
2293 | case DeclaratorContext::KNRTypeListContext: |
2294 | case DeclaratorContext::TypeNameContext: |
2295 | case DeclaratorContext::FunctionalCastContext: |
2296 | case DeclaratorContext::AliasDeclContext: |
2297 | case DeclaratorContext::AliasTemplateContext: |
2298 | case DeclaratorContext::PrototypeContext: |
2299 | case DeclaratorContext::LambdaExprParameterContext: |
2300 | case DeclaratorContext::ObjCParameterContext: |
2301 | case DeclaratorContext::ObjCResultContext: |
2302 | case DeclaratorContext::TemplateParamContext: |
2303 | case DeclaratorContext::CXXNewContext: |
2304 | case DeclaratorContext::CXXCatchContext: |
2305 | case DeclaratorContext::ObjCCatchContext: |
2306 | case DeclaratorContext::BlockLiteralContext: |
2307 | case DeclaratorContext::LambdaExprContext: |
2308 | case DeclaratorContext::ConversionIdContext: |
2309 | case DeclaratorContext::TemplateArgContext: |
2310 | case DeclaratorContext::TemplateTypeArgContext: |
2311 | case DeclaratorContext::TrailingReturnContext: |
2312 | case DeclaratorContext::TrailingReturnVarContext: |
2313 | return false; |
2314 | } |
2315 | llvm_unreachable("unknown context kind!"); |
2316 | } |
2317 | |
2318 | /// Determine whether this declaration appears in a context where an |
2319 | /// expression could appear. |
2320 | bool isExpressionContext() const { |
2321 | switch (Context) { |
2322 | case DeclaratorContext::FileContext: |
2323 | case DeclaratorContext::KNRTypeListContext: |
2324 | case DeclaratorContext::MemberContext: |
2325 | |
2326 | // FIXME: sizeof(...) permits an expression. |
2327 | case DeclaratorContext::TypeNameContext: |
2328 | |
2329 | case DeclaratorContext::FunctionalCastContext: |
2330 | case DeclaratorContext::AliasDeclContext: |
2331 | case DeclaratorContext::AliasTemplateContext: |
2332 | case DeclaratorContext::PrototypeContext: |
2333 | case DeclaratorContext::LambdaExprParameterContext: |
2334 | case DeclaratorContext::ObjCParameterContext: |
2335 | case DeclaratorContext::ObjCResultContext: |
2336 | case DeclaratorContext::TemplateParamContext: |
2337 | case DeclaratorContext::CXXNewContext: |
2338 | case DeclaratorContext::CXXCatchContext: |
2339 | case DeclaratorContext::ObjCCatchContext: |
2340 | case DeclaratorContext::BlockLiteralContext: |
2341 | case DeclaratorContext::LambdaExprContext: |
2342 | case DeclaratorContext::ConversionIdContext: |
2343 | case DeclaratorContext::TrailingReturnContext: |
2344 | case DeclaratorContext::TrailingReturnVarContext: |
2345 | case DeclaratorContext::TemplateTypeArgContext: |
2346 | return false; |
2347 | |
2348 | case DeclaratorContext::BlockContext: |
2349 | case DeclaratorContext::ForContext: |
2350 | case DeclaratorContext::InitStmtContext: |
2351 | case DeclaratorContext::ConditionContext: |
2352 | case DeclaratorContext::TemplateArgContext: |
2353 | return true; |
2354 | } |
2355 | |
2356 | llvm_unreachable("unknown context kind!"); |
2357 | } |
2358 | |
2359 | /// Return true if a function declarator at this position would be a |
2360 | /// function declaration. |
2361 | bool isFunctionDeclaratorAFunctionDeclaration() const { |
2362 | if (!isFunctionDeclarationContext()) |
2363 | return false; |
2364 | |
2365 | for (unsigned I = 0, N = getNumTypeObjects(); I != N; ++I) |
2366 | if (getTypeObject(I).Kind != DeclaratorChunk::Paren) |
2367 | return false; |
2368 | |
2369 | return true; |
2370 | } |
2371 | |
2372 | /// Determine whether a trailing return type was written (at any |
2373 | /// level) within this declarator. |
2374 | bool hasTrailingReturnType() const { |
2375 | for (const auto &Chunk : type_objects()) |
2376 | if (Chunk.Kind == DeclaratorChunk::Function && |
2377 | Chunk.Fun.hasTrailingReturnType()) |
2378 | return true; |
2379 | return false; |
2380 | } |
2381 | |
2382 | /// takeAttributes - Takes attributes from the given parsed-attributes |
2383 | /// set and add them to this declarator. |
2384 | /// |
2385 | /// These examples both add 3 attributes to "var": |
2386 | /// short int var __attribute__((aligned(16),common,deprecated)); |
2387 | /// short int x, __attribute__((aligned(16)) var |
2388 | /// __attribute__((common,deprecated)); |
2389 | /// |
2390 | /// Also extends the range of the declarator. |
2391 | void takeAttributes(ParsedAttributes &attrs, SourceLocation lastLoc) { |
2392 | Attrs.takeAllFrom(attrs); |
2393 | |
2394 | if (!lastLoc.isInvalid()) |
2395 | SetRangeEnd(lastLoc); |
2396 | } |
2397 | |
2398 | const ParsedAttributes &getAttributes() const { return Attrs; } |
2399 | ParsedAttributes &getAttributes() { return Attrs; } |
2400 | |
2401 | /// hasAttributes - do we contain any attributes? |
2402 | bool hasAttributes() const { |
2403 | if (!getAttributes().empty() || getDeclSpec().hasAttributes()) |
2404 | return true; |
2405 | for (unsigned i = 0, e = getNumTypeObjects(); i != e; ++i) |
2406 | if (!getTypeObject(i).getAttrs().empty()) |
2407 | return true; |
2408 | return false; |
2409 | } |
2410 | |
2411 | /// Return a source range list of C++11 attributes associated |
2412 | /// with the declarator. |
2413 | void getCXX11AttributeRanges(SmallVectorImpl<SourceRange> &Ranges) { |
2414 | for (const ParsedAttr &AL : Attrs) |
2415 | if (AL.isCXX11Attribute()) |
2416 | Ranges.push_back(AL.getRange()); |
2417 | } |
2418 | |
2419 | void setAsmLabel(Expr *E) { AsmLabel = E; } |
2420 | Expr *getAsmLabel() const { return AsmLabel; } |
2421 | |
2422 | void setExtension(bool Val = true) { Extension = Val; } |
2423 | bool getExtension() const { return Extension; } |
2424 | |
2425 | void setObjCIvar(bool Val = true) { ObjCIvar = Val; } |
2426 | bool isObjCIvar() const { return ObjCIvar; } |
2427 | |
2428 | void setObjCWeakProperty(bool Val = true) { ObjCWeakProperty = Val; } |
2429 | bool isObjCWeakProperty() const { return ObjCWeakProperty; } |
2430 | |
2431 | void setInvalidType(bool Val = true) { InvalidType = Val; } |
2432 | bool isInvalidType() const { |
2433 | return InvalidType || DS.getTypeSpecType() == DeclSpec::TST_error; |
2434 | } |
2435 | |
2436 | void setGroupingParens(bool flag) { GroupingParens = flag; } |
2437 | bool hasGroupingParens() const { return GroupingParens; } |
2438 | |
2439 | bool isFirstDeclarator() const { return !CommaLoc.isValid(); } |
2440 | SourceLocation getCommaLoc() const { return CommaLoc; } |
2441 | void setCommaLoc(SourceLocation CL) { CommaLoc = CL; } |
2442 | |
2443 | bool hasEllipsis() const { return EllipsisLoc.isValid(); } |
2444 | SourceLocation getEllipsisLoc() const { return EllipsisLoc; } |
2445 | void setEllipsisLoc(SourceLocation EL) { EllipsisLoc = EL; } |
2446 | |
2447 | void setFunctionDefinitionKind(FunctionDefinitionKind Val) { |
2448 | FunctionDefinition = Val; |
2449 | } |
2450 | |
2451 | bool isFunctionDefinition() const { |
2452 | return getFunctionDefinitionKind() != FDK_Declaration; |
2453 | } |
2454 | |
2455 | FunctionDefinitionKind getFunctionDefinitionKind() const { |
2456 | return (FunctionDefinitionKind)FunctionDefinition; |
2457 | } |
2458 | |
2459 | /// Returns true if this declares a real member and not a friend. |
2460 | bool isFirstDeclarationOfMember() { |
2461 | return getContext() == DeclaratorContext::MemberContext && |
2462 | !getDeclSpec().isFriendSpecified(); |
2463 | } |
2464 | |
2465 | /// Returns true if this declares a static member. This cannot be called on a |
2466 | /// declarator outside of a MemberContext because we won't know until |
2467 | /// redeclaration time if the decl is static. |
2468 | bool isStaticMember(); |
2469 | |
2470 | /// Returns true if this declares a constructor or a destructor. |
2471 | bool isCtorOrDtor(); |
2472 | |
2473 | void setRedeclaration(bool Val) { Redeclaration = Val; } |
2474 | bool isRedeclaration() const { return Redeclaration; } |
2475 | }; |
2476 | |
2477 | /// This little struct is used to capture information about |
2478 | /// structure field declarators, which is basically just a bitfield size. |
2479 | struct FieldDeclarator { |
2480 | Declarator D; |
2481 | Expr *BitfieldSize; |
2482 | explicit FieldDeclarator(const DeclSpec &DS) |
2483 | : D(DS, DeclaratorContext::MemberContext), |
2484 | BitfieldSize(nullptr) {} |
2485 | }; |
2486 | |
2487 | /// Represents a C++11 virt-specifier-seq. |
2488 | class VirtSpecifiers { |
2489 | public: |
2490 | enum Specifier { |
2491 | VS_None = 0, |
2492 | VS_Override = 1, |
2493 | VS_Final = 2, |
2494 | VS_Sealed = 4, |
2495 | // Represents the __final keyword, which is legal for gcc in pre-C++11 mode. |
2496 | VS_GNU_Final = 8 |
2497 | }; |
2498 | |
2499 | VirtSpecifiers() : Specifiers(0), LastSpecifier(VS_None) { } |
2500 | |
2501 | bool SetSpecifier(Specifier VS, SourceLocation Loc, |
2502 | const char *&PrevSpec); |
2503 | |
2504 | bool isUnset() const { return Specifiers == 0; } |
2505 | |
2506 | bool isOverrideSpecified() const { return Specifiers & VS_Override; } |
2507 | SourceLocation getOverrideLoc() const { return VS_overrideLoc; } |
2508 | |
2509 | bool isFinalSpecified() const { return Specifiers & (VS_Final | VS_Sealed | VS_GNU_Final); } |
2510 | bool isFinalSpelledSealed() const { return Specifiers & VS_Sealed; } |
2511 | SourceLocation getFinalLoc() const { return VS_finalLoc; } |
2512 | |
2513 | void clear() { Specifiers = 0; } |
2514 | |
2515 | static const char *getSpecifierName(Specifier VS); |
2516 | |
2517 | SourceLocation getFirstLocation() const { return FirstLocation; } |
2518 | SourceLocation getLastLocation() const { return LastLocation; } |
2519 | Specifier getLastSpecifier() const { return LastSpecifier; } |
2520 | |
2521 | private: |
2522 | unsigned Specifiers; |
2523 | Specifier LastSpecifier; |
2524 | |
2525 | SourceLocation VS_overrideLoc, VS_finalLoc; |
2526 | SourceLocation FirstLocation; |
2527 | SourceLocation LastLocation; |
2528 | }; |
2529 | |
2530 | enum class LambdaCaptureInitKind { |
2531 | NoInit, //!< [a] |
2532 | CopyInit, //!< [a = b], [a = {b}] |
2533 | DirectInit, //!< [a(b)] |
2534 | ListInit //!< [a{b}] |
2535 | }; |
2536 | |
2537 | /// Represents a complete lambda introducer. |
2538 | struct LambdaIntroducer { |
2539 | /// An individual capture in a lambda introducer. |
2540 | struct LambdaCapture { |
2541 | LambdaCaptureKind Kind; |
2542 | SourceLocation Loc; |
2543 | IdentifierInfo *Id; |
2544 | SourceLocation EllipsisLoc; |
2545 | LambdaCaptureInitKind InitKind; |
2546 | ExprResult Init; |
2547 | ParsedType InitCaptureType; |
2548 | SourceRange ExplicitRange; |
2549 | |
2550 | LambdaCapture(LambdaCaptureKind Kind, SourceLocation Loc, |
2551 | IdentifierInfo *Id, SourceLocation EllipsisLoc, |
2552 | LambdaCaptureInitKind InitKind, ExprResult Init, |
2553 | ParsedType InitCaptureType, |
2554 | SourceRange ExplicitRange) |
2555 | : Kind(Kind), Loc(Loc), Id(Id), EllipsisLoc(EllipsisLoc), |
2556 | InitKind(InitKind), Init(Init), InitCaptureType(InitCaptureType), |
2557 | ExplicitRange(ExplicitRange) {} |
2558 | }; |
2559 | |
2560 | SourceRange Range; |
2561 | SourceLocation DefaultLoc; |
2562 | LambdaCaptureDefault Default; |
2563 | SmallVector<LambdaCapture, 4> Captures; |
2564 | |
2565 | LambdaIntroducer() |
2566 | : Default(LCD_None) {} |
2567 | |
2568 | /// Append a capture in a lambda introducer. |
2569 | void addCapture(LambdaCaptureKind Kind, |
2570 | SourceLocation Loc, |
2571 | IdentifierInfo* Id, |
2572 | SourceLocation EllipsisLoc, |
2573 | LambdaCaptureInitKind InitKind, |
2574 | ExprResult Init, |
2575 | ParsedType InitCaptureType, |
2576 | SourceRange ExplicitRange) { |
2577 | Captures.push_back(LambdaCapture(Kind, Loc, Id, EllipsisLoc, InitKind, Init, |
2578 | InitCaptureType, ExplicitRange)); |
2579 | } |
2580 | }; |
2581 | |
2582 | } // end namespace clang |
2583 | |
2584 | #endif // LLVM_CLANG_SEMA_DECLSPEC_H |
2585 |
Warning: That file was not part of the compilation database. It may have many parsing errors.