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