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