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