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