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